From 2252cd100d46902de15692d030547c51aa296dd6 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Mon, 28 Nov 2022 13:23:56 +0100 Subject: [PATCH 0001/1620] New translations Messages.properties (French) --- .../earth/app/view/Messagesfr.properties | 265 ++++++++++++++++++ 1 file changed, 265 insertions(+) create mode 100644 fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messagesfr.properties diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messagesfr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messagesfr.properties new file mode 100644 index 0000000000..3ce9622fe0 --- /dev/null +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messagesfr.properties @@ -0,0 +1,265 @@ +AboutDialog.19=A problem occurred +AboutDialog.5=For more information visit our website OpenForis.org +AboutDialog.6=Sorry, a problem occurred while trying to open this link in your system's standard browser. +AboutDialog.8=Ok +AspectCode.0=North +AspectCode.1=North-East +AspectCode.2=East +AspectCode.3=South-East +AspectCode.4=South +AspectCode.5=South-West +AspectCode.6=West +AspectCode.7=North-West +CollectEarthMenu.0=Import CEP file +CollectEarthMenu.2=Utilities +CollectEarthMenu.3=Divide large CSV plot files +CollectEarthMenu.4=Export data to XML (from specific date until present) +CollectEarthMenu.5=Export to Collect Backup +CollectEarthMenu.6=Export data as Collect Backup (all data) +CollectEarthMenu.7=Export data as Collect Backup (from date) +CollectEarthMenu.8=Export data to XML (using summary attribute) +CollectEarthWindow.0=Error when attempting to export data to CSV file +CollectEarthWindow.10=File +CollectEarthWindow.11=Exit +CollectEarthWindow.12=Tools +CollectEarthWindow.13=Download data to CSV (Excel) +CollectEarthWindow.14=Start SAIKU Analysis +CollectEarthWindow.15=Properties +CollectEarthWindow.16=Help +CollectEarthWindow.17=Disclaimer +CollectEarthWindow.18=Find missing plots in database +CollectEarthWindow.19=Collect Earth +CollectEarthWindow.1=Export error +CollectEarthWindow.20=Number of duplicated records\: +CollectEarthWindow.21=Could not find icon for main frame +CollectEarthWindow.22=Are you sure that you want to close Collect Earth?
Closing the window will also close the Collect Earth server +CollectEarthWindow.23=Confirmation needed +CollectEarthWindow.24=XML Export +CollectEarthWindow.25=Do you want to add these records anyway and lose your current data? +CollectEarthWindow.26=Operator +CollectEarthWindow.27=Update +CollectEarthWindow.28=Open Foris Collect Earth server should be running while the operator interprets data. +CollectEarthWindow.29=The Saiku Server is not configured. +CollectEarthWindow.2=Language +CollectEarthWindow.30=Please maintain this window open while you are using Google Earth. +CollectEarthWindow.31=Export collected data to CSV file +CollectEarthWindow.32=Quit +CollectEarthWindow.33=The operator name has to be longer than 5 characters and shorter than 50 +CollectEarthWindow.34=Validation error +CollectEarthWindow.35=OPERATOR NAME EMPTY\!
Please fill the operator name and press the "Update" button. +CollectEarthWindow.36=Operator name cannot be empty +CollectEarthWindow.37=Keep Open +CollectEarthWindow.38=CSV files +CollectEarthWindow.39=NOTICE\: It is advisable that you back-up your current data (Export to XML) before importing the new data +CollectEarthWindow.3=\ Import error +CollectEarthWindow.40=Set-up the path to the folder where Saiku Server is installed in the Tools->Properties->Advanced tab. +CollectEarthWindow.41=Saving exported data to file\: +CollectEarthWindow.42=Quit +CollectEarthWindow.43=Conflicting records found +CollectEarthWindow.44=Data Import/Export +CollectEarthWindow.45=Export data to XML (compressed) +CollectEarthWindow.46=Import new data from ZIP (compressed XML) +CollectEarthWindow.47=Saiku Server not configured +CollectEarthWindow.48=Zip/collect-data files +CollectEarthWindow.49=Fusion CSV files +CollectEarthWindow.4=FAO Disclaimer notices +CollectEarthWindow.50=Open User Manual +CollectEarthWindow.51=Check for updates of Collect Earth +CollectEarthWindow.52=Open Application Log File +CollectEarthWindow.53=Collect Earth Log file +CollectEarthWindow.54=Load points from KML +CollectEarthWindow.55=Update current records using CSV +CollectEarthWindow.56=About... +CollectEarthWindow.57=The Saiku starter process is still running, please wait. +CollectEarthWindow.58=Cannot start Saiku analysis +CollectEarthWindow.59=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming.
If you click on "YES" a new dataset with the latest information will be generated. +CollectEarthWindow.5=Close +CollectEarthWindow.60=Saiku data generation +CollectEarthWindow.61=Export data to XML (modified records since last export) +CollectEarthWindow.62=About... +CollectEarthWindow.63=Error getting the points from KML +CollectEarthWindow.64=Technical Support +CollectEarthWindow.65=The operator name has been changed +CollectEarthWindow.66=Operator name +CollectEarthWindow.67=Open data folder +CollectEarthWindow.6=Export to Fusion Table +CollectEarthWindow.70=Open the Survey Guide +CollectEarthWindow.71=Generate Stand-Alone Saiku tool +CollectEarthWindow.7=Error when importing data +CollectEarthWindow.8=Disclaimer text could not be found +CollectEarthWindow.9=The data imported contains records that are already present on your database. +DynamicsCode.0=Initially Forest +DynamicsCode.1=Initially Grassland +DynamicsCode.2=Initially Settlement +DynamicsCode.3=Initially Otherland +DynamicsCode.4=Initially Wetland +DynamicsCode.5=Initially Cropland +EarthApp.11=Collect Earth is already running +EarthApp.21=The file containing the grid of plots as a CSV/CED is not found in the selected path \:
+EarthApp.23=No CSV/CED file has been set-up \:

+EarthApp.24=The file containing the Freemarker template with the KML definition is not found in the selected path \:
+EarthApp.26=No KML definition file has been set-up \:

+EarthApp.27=The file containing the HTML balloon form is not found in the selected path \:
+EarthApp.29=No HTML balloon file has been set-up \:

+EarthApp.30=Please correct the file location in the Tools->Properties menu. +EarthApp.3=Remind me later +EarthApp.4=Update Now +EarthApp.57=There is a new version of Collect Earth available\!
How do you want to proceed? +EarthApp.58=Update alert +EarthApp.59=Error when importing project file +EarthApp.5=Do not remind me again +EarthApp.61=The Collect Earth file could not be open.
Please make sure that Google Earth is installed. +EarthApp.6=\ - Version +EarthApp.70=WARNING +EarthApp.71=In Mac OS X the Collect Earth project files (*.cep) will not open in Collect Earth when they are double-clicked.
+EarthApp.72=Use the Collect Earth toolbar to open the .cep files \: +EarthApp.73=Collect Earth issues in Mac OS X computers +EarthSurveyService.9=Field required +ExportActionListener.1=Pick Date to Export Records From +ExportDialogProcessMonitor.0=Processing data... +ExportDialogProcessMonitor.1=Waiting to initialize process \: +ExportDialogProcessMonitor.4=Exported records \: +ImportActionListener.0=Should the data for plots that have not been completely filled be imported? +ImportActionListener.2=If you click NO only the data from plots in the "green" state, containing all data, will be imported. +ImportActionListener.3=Import non-finished records +ImportDialogProcessMonitor.0=\ CALCULATING +ImportDialogProcessMonitor.11=Initial number of records \: +ImportDialogProcessMonitor.2=Importing records... +ImportDialogProcessMonitor.5=Actual number of imported records \: +ImportDialogProcessMonitor.8=Processing data... +ImportProcessMonitorDialog.0=Imported records \: +ImportXMLDialogProcessMonitor.1 = Overwrite data +ImportXMLDialogProcessMonitor.2 = Import only non-conflicting plots +InfiniteProgressMonitor.0=Cancel operation +JFileChooserExistsAware.0=Collect Earth Project file +KmlImportService.13=Select a CSV file to save the plot locations to +MissingPlotsListener.0=Error while getting information about plots not present on the Database +MissingPlotsListener.10=Total number of plots in the sampling design \: +MissingPlotsListener.12=Number of missing plots \: +MissingPlotsListener.14=All the plots are filled\! +MissingPlotsListener.1=Missing plots +MissingPlotsListener.2=Copy contents to clipboard +MissingPlotsListener.3=Pick the files that contain plot information ( .csv or .ced files ) for which you want to know if all data has been filled. +MissingPlotsListener.4=Missing plots - information +MissingPlotsListener.5=From file \: +MissingPlotsListener.6=Export to CED file +NO=No +NO_TO_ALL=No to all +OpenTextFileListener.0=The text file was not found at \: +OptionWizard.0=Collect Earth options +OptionWizard.100=Open Planet imagery +OptionWizard.101=Planet API key +OptionWizard.1021=URL SecureWatch +OptionWizard.102=Open Maxar SecureWatch +OptionWizard.103=Set URL for Extra Map (opens when set) \: +OptionWizard.104=Browsers +OptionWizard.105=Open Earth Map +OptionWizard.110=Use NICFI provided Monthly imagery +OptionWizard.10=Open backup folder +OptionWizard.11=Unknown\: use ifconfig +OptionWizard.12=Client Instance +OptionWizard.13=Collect Earth Server IP +OptionWizard.14=Collect Earth Server port (e.g. 8023) +OptionWizard.15=Save & Apply changes +OptionWizard.16=ID +OptionWizard.17=X-coord +OptionWizard.18=Y-coord +OptionWizard.19=Elevation +OptionWizard.1=Choose Browser +OptionWizard.20=The Google Earth contents have been changed.
Please accept the content reload when you are prompted by Google Earth. +OptionWizard.21=Update successful +OptionWizard.22=Slope +OptionWizard.23=There was an error when re-opening the Google Earth data +OptionWizard.24=Cancel +OptionWizard.25=Operation Mode +OptionWizard.26=DB host +OptionWizard.27=This is not a recognized Saiku Folder ( the start-saiku.bat file is not present) +OptionWizard.28=Saiku Server not recognized +OptionWizard.29=DB port +OptionWizard.2=Workflow (server/client) +OptionWizard.30=SQLite options +OptionWizard.31=Sample data +OptionWizard.32=Plot layout +OptionWizard.33=Survey Definition +OptionWizard.34=Integrated Services +OptionWizard.35=Number of control points +OptionWizard.36=Distance between control points (in meters) +OptionWizard.37=Margin with plot border (in meters) +OptionWizard.38=The CSV/CED file cannot be read correctly.
The file is expected to have a comma separated values like this \:
+OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect +OptionWizard.3=Server Instance +OptionWizard.40=Projects +OptionWizard.41=Load a new project file +OptionWizard.42=Error when closing the CSV reader +OptionWizard.43=Name of survey +OptionWizard.44=automatically back-up database at +OptionWizard.45=Open Earth Engine Playground ( deprecated ) +OptionWizard.46=Open Earth Engine Timelapse +OptionWizard.47=Open Bing Maps +OptionWizard.48=Open form on a browser instead of Google Earth (recommended for LINUX) +OptionWizard.49=Path to ced/csv file with plot data +OptionWizard.4=Current computer IP \: +OptionWizard.50=Browse... +OptionWizard.51=Error importing project file +OptionWizard.52=CSV/CED file with only coordinates +OptionWizard.53=No points +OptionWizard.54=Central point +OptionWizard.55=Error importing project folder +OptionWizard.56=Load project +OptionWizard.57=Previously loaded projects +OptionWizard.58=Open GEE Code Editor (requires Trusted Tester access) +OptionWizard.59=Open Here Maps focused on the plot +OptionWizard.5=Collect Earth Server port\: +OptionWizard.65=Path to Saiku folder +OptionWizard.66=Browse... +OptionWizard.67=Path to Firefox executable +OptionWizard.68=Browse... +OptionWizard.6=PostgreSQL DB parameters +OptionWizard.70=Executable files +OptionWizard.72=Binary files +OptionWizard.73=Path to Chrome executable +OptionWizard.74=Browse... +OptionWizard.76=Executable files +OptionWizard.78=Binary files +OptionWizard.79=Path to KML Freemarker template +OptionWizard.7=User Name +OptionWizard.80=Browse... +OptionWizard.82=Freemarker template +OptionWizard.83=Path to HTML Balloon form design +OptionWizard.84=Browse... +OptionWizard.86=HTML webpage +OptionWizard.87=Path to XML with IDM definition +OptionWizard.88=Browse... +OptionWizard.8=Password +OptionWizard.90=XML IDM definition +OptionWizard.91=Server (manager version or stand-alone use) +OptionWizard.92=Client (operator/connected to server) +OptionWizard.93=SQLite (Embedded/single file based) +OptionWizard.94=PostgreSQL +OptionWizard.95=Side of the sampling dots (in meters) +OptionWizard.9=DB Name +ProcessMonitorDialog.1=Parsing error on row number +ProcessMonitorDialog.4=, columns +ProcessMonitorDialog.5=\ -- values +SaikuAnalysisListener.0=Yes - Refresh Saiku data (long process) +SaikuAnalysisListener.1=No - Use same version of the data as last time Saiku was used +SaikuStarter.1=Starting Saiku +SaikuStarter.2=Starting Saiku can take some minutes, please wait\! +SaikuToolExportListener.1=Saiku Tool generation +SaikuToolExportListener.2=Generating Saiku Tool with current database +SaveEarthDataServlet.0=Empty request +SaveEarthDataServlet.1=Problem occurred while saving data to the database +SaveEarthDataServlet.2=The data was saved +SlopeCode.0=Flat (0-5) +YES=Yes +YES_TO_ALL=Yes to all + +GenerateDatabaseStarter.1=Preparing for analysis +GenerateDatabaseStarter.2=Generating Relational Database + +IPCCGeneratorListener.1=Waiting for process to complete\! +IPCCGeneratorListener.2=The IPCC GHGi compatible data is being generated +IPCCGeneratorListener.3=Refresh the data (update with latest from Collect Earth) +IPCCGeneratorListener.4=Use the latest generated database (fastest process - no update) +IPCCGeneratorListener.5=GHGi Database generation +IPCCGeneratorListener.6=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming but it is necessary if the Collect Earth data has been updated since the last time.
\ No newline at end of file From 8c70b41f041023038955a8fa209087214bcce4f2 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Mon, 28 Nov 2022 13:23:57 +0100 Subject: [PATCH 0002/1620] New translations Messages.properties (Spanish) --- .../earth/app/view/Messageses.properties | 265 ++++++++++++++++++ 1 file changed, 265 insertions(+) create mode 100644 es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messageses.properties diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messageses.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messageses.properties new file mode 100644 index 0000000000..3ce9622fe0 --- /dev/null +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messageses.properties @@ -0,0 +1,265 @@ +AboutDialog.19=A problem occurred +AboutDialog.5=For more information visit our website OpenForis.org +AboutDialog.6=Sorry, a problem occurred while trying to open this link in your system's standard browser. +AboutDialog.8=Ok +AspectCode.0=North +AspectCode.1=North-East +AspectCode.2=East +AspectCode.3=South-East +AspectCode.4=South +AspectCode.5=South-West +AspectCode.6=West +AspectCode.7=North-West +CollectEarthMenu.0=Import CEP file +CollectEarthMenu.2=Utilities +CollectEarthMenu.3=Divide large CSV plot files +CollectEarthMenu.4=Export data to XML (from specific date until present) +CollectEarthMenu.5=Export to Collect Backup +CollectEarthMenu.6=Export data as Collect Backup (all data) +CollectEarthMenu.7=Export data as Collect Backup (from date) +CollectEarthMenu.8=Export data to XML (using summary attribute) +CollectEarthWindow.0=Error when attempting to export data to CSV file +CollectEarthWindow.10=File +CollectEarthWindow.11=Exit +CollectEarthWindow.12=Tools +CollectEarthWindow.13=Download data to CSV (Excel) +CollectEarthWindow.14=Start SAIKU Analysis +CollectEarthWindow.15=Properties +CollectEarthWindow.16=Help +CollectEarthWindow.17=Disclaimer +CollectEarthWindow.18=Find missing plots in database +CollectEarthWindow.19=Collect Earth +CollectEarthWindow.1=Export error +CollectEarthWindow.20=Number of duplicated records\: +CollectEarthWindow.21=Could not find icon for main frame +CollectEarthWindow.22=Are you sure that you want to close Collect Earth?
Closing the window will also close the Collect Earth server +CollectEarthWindow.23=Confirmation needed +CollectEarthWindow.24=XML Export +CollectEarthWindow.25=Do you want to add these records anyway and lose your current data? +CollectEarthWindow.26=Operator +CollectEarthWindow.27=Update +CollectEarthWindow.28=Open Foris Collect Earth server should be running while the operator interprets data. +CollectEarthWindow.29=The Saiku Server is not configured. +CollectEarthWindow.2=Language +CollectEarthWindow.30=Please maintain this window open while you are using Google Earth. +CollectEarthWindow.31=Export collected data to CSV file +CollectEarthWindow.32=Quit +CollectEarthWindow.33=The operator name has to be longer than 5 characters and shorter than 50 +CollectEarthWindow.34=Validation error +CollectEarthWindow.35=OPERATOR NAME EMPTY\!
Please fill the operator name and press the "Update" button. +CollectEarthWindow.36=Operator name cannot be empty +CollectEarthWindow.37=Keep Open +CollectEarthWindow.38=CSV files +CollectEarthWindow.39=NOTICE\: It is advisable that you back-up your current data (Export to XML) before importing the new data +CollectEarthWindow.3=\ Import error +CollectEarthWindow.40=Set-up the path to the folder where Saiku Server is installed in the Tools->Properties->Advanced tab. +CollectEarthWindow.41=Saving exported data to file\: +CollectEarthWindow.42=Quit +CollectEarthWindow.43=Conflicting records found +CollectEarthWindow.44=Data Import/Export +CollectEarthWindow.45=Export data to XML (compressed) +CollectEarthWindow.46=Import new data from ZIP (compressed XML) +CollectEarthWindow.47=Saiku Server not configured +CollectEarthWindow.48=Zip/collect-data files +CollectEarthWindow.49=Fusion CSV files +CollectEarthWindow.4=FAO Disclaimer notices +CollectEarthWindow.50=Open User Manual +CollectEarthWindow.51=Check for updates of Collect Earth +CollectEarthWindow.52=Open Application Log File +CollectEarthWindow.53=Collect Earth Log file +CollectEarthWindow.54=Load points from KML +CollectEarthWindow.55=Update current records using CSV +CollectEarthWindow.56=About... +CollectEarthWindow.57=The Saiku starter process is still running, please wait. +CollectEarthWindow.58=Cannot start Saiku analysis +CollectEarthWindow.59=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming.
If you click on "YES" a new dataset with the latest information will be generated. +CollectEarthWindow.5=Close +CollectEarthWindow.60=Saiku data generation +CollectEarthWindow.61=Export data to XML (modified records since last export) +CollectEarthWindow.62=About... +CollectEarthWindow.63=Error getting the points from KML +CollectEarthWindow.64=Technical Support +CollectEarthWindow.65=The operator name has been changed +CollectEarthWindow.66=Operator name +CollectEarthWindow.67=Open data folder +CollectEarthWindow.6=Export to Fusion Table +CollectEarthWindow.70=Open the Survey Guide +CollectEarthWindow.71=Generate Stand-Alone Saiku tool +CollectEarthWindow.7=Error when importing data +CollectEarthWindow.8=Disclaimer text could not be found +CollectEarthWindow.9=The data imported contains records that are already present on your database. +DynamicsCode.0=Initially Forest +DynamicsCode.1=Initially Grassland +DynamicsCode.2=Initially Settlement +DynamicsCode.3=Initially Otherland +DynamicsCode.4=Initially Wetland +DynamicsCode.5=Initially Cropland +EarthApp.11=Collect Earth is already running +EarthApp.21=The file containing the grid of plots as a CSV/CED is not found in the selected path \:
+EarthApp.23=No CSV/CED file has been set-up \:

+EarthApp.24=The file containing the Freemarker template with the KML definition is not found in the selected path \:
+EarthApp.26=No KML definition file has been set-up \:

+EarthApp.27=The file containing the HTML balloon form is not found in the selected path \:
+EarthApp.29=No HTML balloon file has been set-up \:

+EarthApp.30=Please correct the file location in the Tools->Properties menu. +EarthApp.3=Remind me later +EarthApp.4=Update Now +EarthApp.57=There is a new version of Collect Earth available\!
How do you want to proceed? +EarthApp.58=Update alert +EarthApp.59=Error when importing project file +EarthApp.5=Do not remind me again +EarthApp.61=The Collect Earth file could not be open.
Please make sure that Google Earth is installed. +EarthApp.6=\ - Version +EarthApp.70=WARNING +EarthApp.71=In Mac OS X the Collect Earth project files (*.cep) will not open in Collect Earth when they are double-clicked.
+EarthApp.72=Use the Collect Earth toolbar to open the .cep files \: +EarthApp.73=Collect Earth issues in Mac OS X computers +EarthSurveyService.9=Field required +ExportActionListener.1=Pick Date to Export Records From +ExportDialogProcessMonitor.0=Processing data... +ExportDialogProcessMonitor.1=Waiting to initialize process \: +ExportDialogProcessMonitor.4=Exported records \: +ImportActionListener.0=Should the data for plots that have not been completely filled be imported? +ImportActionListener.2=If you click NO only the data from plots in the "green" state, containing all data, will be imported. +ImportActionListener.3=Import non-finished records +ImportDialogProcessMonitor.0=\ CALCULATING +ImportDialogProcessMonitor.11=Initial number of records \: +ImportDialogProcessMonitor.2=Importing records... +ImportDialogProcessMonitor.5=Actual number of imported records \: +ImportDialogProcessMonitor.8=Processing data... +ImportProcessMonitorDialog.0=Imported records \: +ImportXMLDialogProcessMonitor.1 = Overwrite data +ImportXMLDialogProcessMonitor.2 = Import only non-conflicting plots +InfiniteProgressMonitor.0=Cancel operation +JFileChooserExistsAware.0=Collect Earth Project file +KmlImportService.13=Select a CSV file to save the plot locations to +MissingPlotsListener.0=Error while getting information about plots not present on the Database +MissingPlotsListener.10=Total number of plots in the sampling design \: +MissingPlotsListener.12=Number of missing plots \: +MissingPlotsListener.14=All the plots are filled\! +MissingPlotsListener.1=Missing plots +MissingPlotsListener.2=Copy contents to clipboard +MissingPlotsListener.3=Pick the files that contain plot information ( .csv or .ced files ) for which you want to know if all data has been filled. +MissingPlotsListener.4=Missing plots - information +MissingPlotsListener.5=From file \: +MissingPlotsListener.6=Export to CED file +NO=No +NO_TO_ALL=No to all +OpenTextFileListener.0=The text file was not found at \: +OptionWizard.0=Collect Earth options +OptionWizard.100=Open Planet imagery +OptionWizard.101=Planet API key +OptionWizard.1021=URL SecureWatch +OptionWizard.102=Open Maxar SecureWatch +OptionWizard.103=Set URL for Extra Map (opens when set) \: +OptionWizard.104=Browsers +OptionWizard.105=Open Earth Map +OptionWizard.110=Use NICFI provided Monthly imagery +OptionWizard.10=Open backup folder +OptionWizard.11=Unknown\: use ifconfig +OptionWizard.12=Client Instance +OptionWizard.13=Collect Earth Server IP +OptionWizard.14=Collect Earth Server port (e.g. 8023) +OptionWizard.15=Save & Apply changes +OptionWizard.16=ID +OptionWizard.17=X-coord +OptionWizard.18=Y-coord +OptionWizard.19=Elevation +OptionWizard.1=Choose Browser +OptionWizard.20=The Google Earth contents have been changed.
Please accept the content reload when you are prompted by Google Earth. +OptionWizard.21=Update successful +OptionWizard.22=Slope +OptionWizard.23=There was an error when re-opening the Google Earth data +OptionWizard.24=Cancel +OptionWizard.25=Operation Mode +OptionWizard.26=DB host +OptionWizard.27=This is not a recognized Saiku Folder ( the start-saiku.bat file is not present) +OptionWizard.28=Saiku Server not recognized +OptionWizard.29=DB port +OptionWizard.2=Workflow (server/client) +OptionWizard.30=SQLite options +OptionWizard.31=Sample data +OptionWizard.32=Plot layout +OptionWizard.33=Survey Definition +OptionWizard.34=Integrated Services +OptionWizard.35=Number of control points +OptionWizard.36=Distance between control points (in meters) +OptionWizard.37=Margin with plot border (in meters) +OptionWizard.38=The CSV/CED file cannot be read correctly.
The file is expected to have a comma separated values like this \:
+OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect +OptionWizard.3=Server Instance +OptionWizard.40=Projects +OptionWizard.41=Load a new project file +OptionWizard.42=Error when closing the CSV reader +OptionWizard.43=Name of survey +OptionWizard.44=automatically back-up database at +OptionWizard.45=Open Earth Engine Playground ( deprecated ) +OptionWizard.46=Open Earth Engine Timelapse +OptionWizard.47=Open Bing Maps +OptionWizard.48=Open form on a browser instead of Google Earth (recommended for LINUX) +OptionWizard.49=Path to ced/csv file with plot data +OptionWizard.4=Current computer IP \: +OptionWizard.50=Browse... +OptionWizard.51=Error importing project file +OptionWizard.52=CSV/CED file with only coordinates +OptionWizard.53=No points +OptionWizard.54=Central point +OptionWizard.55=Error importing project folder +OptionWizard.56=Load project +OptionWizard.57=Previously loaded projects +OptionWizard.58=Open GEE Code Editor (requires Trusted Tester access) +OptionWizard.59=Open Here Maps focused on the plot +OptionWizard.5=Collect Earth Server port\: +OptionWizard.65=Path to Saiku folder +OptionWizard.66=Browse... +OptionWizard.67=Path to Firefox executable +OptionWizard.68=Browse... +OptionWizard.6=PostgreSQL DB parameters +OptionWizard.70=Executable files +OptionWizard.72=Binary files +OptionWizard.73=Path to Chrome executable +OptionWizard.74=Browse... +OptionWizard.76=Executable files +OptionWizard.78=Binary files +OptionWizard.79=Path to KML Freemarker template +OptionWizard.7=User Name +OptionWizard.80=Browse... +OptionWizard.82=Freemarker template +OptionWizard.83=Path to HTML Balloon form design +OptionWizard.84=Browse... +OptionWizard.86=HTML webpage +OptionWizard.87=Path to XML with IDM definition +OptionWizard.88=Browse... +OptionWizard.8=Password +OptionWizard.90=XML IDM definition +OptionWizard.91=Server (manager version or stand-alone use) +OptionWizard.92=Client (operator/connected to server) +OptionWizard.93=SQLite (Embedded/single file based) +OptionWizard.94=PostgreSQL +OptionWizard.95=Side of the sampling dots (in meters) +OptionWizard.9=DB Name +ProcessMonitorDialog.1=Parsing error on row number +ProcessMonitorDialog.4=, columns +ProcessMonitorDialog.5=\ -- values +SaikuAnalysisListener.0=Yes - Refresh Saiku data (long process) +SaikuAnalysisListener.1=No - Use same version of the data as last time Saiku was used +SaikuStarter.1=Starting Saiku +SaikuStarter.2=Starting Saiku can take some minutes, please wait\! +SaikuToolExportListener.1=Saiku Tool generation +SaikuToolExportListener.2=Generating Saiku Tool with current database +SaveEarthDataServlet.0=Empty request +SaveEarthDataServlet.1=Problem occurred while saving data to the database +SaveEarthDataServlet.2=The data was saved +SlopeCode.0=Flat (0-5) +YES=Yes +YES_TO_ALL=Yes to all + +GenerateDatabaseStarter.1=Preparing for analysis +GenerateDatabaseStarter.2=Generating Relational Database + +IPCCGeneratorListener.1=Waiting for process to complete\! +IPCCGeneratorListener.2=The IPCC GHGi compatible data is being generated +IPCCGeneratorListener.3=Refresh the data (update with latest from Collect Earth) +IPCCGeneratorListener.4=Use the latest generated database (fastest process - no update) +IPCCGeneratorListener.5=GHGi Database generation +IPCCGeneratorListener.6=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming but it is necessary if the Collect Earth data has been updated since the last time.
\ No newline at end of file From e6fc8fc4d74c07e2a79c0bff1fa361cae3279cc3 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Mon, 28 Nov 2022 13:23:58 +0100 Subject: [PATCH 0003/1620] New translations Messages.properties (Portuguese) --- .../earth/app/view/Messagespt.properties | 265 ++++++++++++++++++ 1 file changed, 265 insertions(+) create mode 100644 pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messagespt.properties diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messagespt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messagespt.properties new file mode 100644 index 0000000000..3ce9622fe0 --- /dev/null +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messagespt.properties @@ -0,0 +1,265 @@ +AboutDialog.19=A problem occurred +AboutDialog.5=For more information visit our website OpenForis.org +AboutDialog.6=Sorry, a problem occurred while trying to open this link in your system's standard browser. +AboutDialog.8=Ok +AspectCode.0=North +AspectCode.1=North-East +AspectCode.2=East +AspectCode.3=South-East +AspectCode.4=South +AspectCode.5=South-West +AspectCode.6=West +AspectCode.7=North-West +CollectEarthMenu.0=Import CEP file +CollectEarthMenu.2=Utilities +CollectEarthMenu.3=Divide large CSV plot files +CollectEarthMenu.4=Export data to XML (from specific date until present) +CollectEarthMenu.5=Export to Collect Backup +CollectEarthMenu.6=Export data as Collect Backup (all data) +CollectEarthMenu.7=Export data as Collect Backup (from date) +CollectEarthMenu.8=Export data to XML (using summary attribute) +CollectEarthWindow.0=Error when attempting to export data to CSV file +CollectEarthWindow.10=File +CollectEarthWindow.11=Exit +CollectEarthWindow.12=Tools +CollectEarthWindow.13=Download data to CSV (Excel) +CollectEarthWindow.14=Start SAIKU Analysis +CollectEarthWindow.15=Properties +CollectEarthWindow.16=Help +CollectEarthWindow.17=Disclaimer +CollectEarthWindow.18=Find missing plots in database +CollectEarthWindow.19=Collect Earth +CollectEarthWindow.1=Export error +CollectEarthWindow.20=Number of duplicated records\: +CollectEarthWindow.21=Could not find icon for main frame +CollectEarthWindow.22=Are you sure that you want to close Collect Earth?
Closing the window will also close the Collect Earth server +CollectEarthWindow.23=Confirmation needed +CollectEarthWindow.24=XML Export +CollectEarthWindow.25=Do you want to add these records anyway and lose your current data? +CollectEarthWindow.26=Operator +CollectEarthWindow.27=Update +CollectEarthWindow.28=Open Foris Collect Earth server should be running while the operator interprets data. +CollectEarthWindow.29=The Saiku Server is not configured. +CollectEarthWindow.2=Language +CollectEarthWindow.30=Please maintain this window open while you are using Google Earth. +CollectEarthWindow.31=Export collected data to CSV file +CollectEarthWindow.32=Quit +CollectEarthWindow.33=The operator name has to be longer than 5 characters and shorter than 50 +CollectEarthWindow.34=Validation error +CollectEarthWindow.35=OPERATOR NAME EMPTY\!
Please fill the operator name and press the "Update" button. +CollectEarthWindow.36=Operator name cannot be empty +CollectEarthWindow.37=Keep Open +CollectEarthWindow.38=CSV files +CollectEarthWindow.39=NOTICE\: It is advisable that you back-up your current data (Export to XML) before importing the new data +CollectEarthWindow.3=\ Import error +CollectEarthWindow.40=Set-up the path to the folder where Saiku Server is installed in the Tools->Properties->Advanced tab. +CollectEarthWindow.41=Saving exported data to file\: +CollectEarthWindow.42=Quit +CollectEarthWindow.43=Conflicting records found +CollectEarthWindow.44=Data Import/Export +CollectEarthWindow.45=Export data to XML (compressed) +CollectEarthWindow.46=Import new data from ZIP (compressed XML) +CollectEarthWindow.47=Saiku Server not configured +CollectEarthWindow.48=Zip/collect-data files +CollectEarthWindow.49=Fusion CSV files +CollectEarthWindow.4=FAO Disclaimer notices +CollectEarthWindow.50=Open User Manual +CollectEarthWindow.51=Check for updates of Collect Earth +CollectEarthWindow.52=Open Application Log File +CollectEarthWindow.53=Collect Earth Log file +CollectEarthWindow.54=Load points from KML +CollectEarthWindow.55=Update current records using CSV +CollectEarthWindow.56=About... +CollectEarthWindow.57=The Saiku starter process is still running, please wait. +CollectEarthWindow.58=Cannot start Saiku analysis +CollectEarthWindow.59=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming.
If you click on "YES" a new dataset with the latest information will be generated. +CollectEarthWindow.5=Close +CollectEarthWindow.60=Saiku data generation +CollectEarthWindow.61=Export data to XML (modified records since last export) +CollectEarthWindow.62=About... +CollectEarthWindow.63=Error getting the points from KML +CollectEarthWindow.64=Technical Support +CollectEarthWindow.65=The operator name has been changed +CollectEarthWindow.66=Operator name +CollectEarthWindow.67=Open data folder +CollectEarthWindow.6=Export to Fusion Table +CollectEarthWindow.70=Open the Survey Guide +CollectEarthWindow.71=Generate Stand-Alone Saiku tool +CollectEarthWindow.7=Error when importing data +CollectEarthWindow.8=Disclaimer text could not be found +CollectEarthWindow.9=The data imported contains records that are already present on your database. +DynamicsCode.0=Initially Forest +DynamicsCode.1=Initially Grassland +DynamicsCode.2=Initially Settlement +DynamicsCode.3=Initially Otherland +DynamicsCode.4=Initially Wetland +DynamicsCode.5=Initially Cropland +EarthApp.11=Collect Earth is already running +EarthApp.21=The file containing the grid of plots as a CSV/CED is not found in the selected path \:
+EarthApp.23=No CSV/CED file has been set-up \:

+EarthApp.24=The file containing the Freemarker template with the KML definition is not found in the selected path \:
+EarthApp.26=No KML definition file has been set-up \:

+EarthApp.27=The file containing the HTML balloon form is not found in the selected path \:
+EarthApp.29=No HTML balloon file has been set-up \:

+EarthApp.30=Please correct the file location in the Tools->Properties menu. +EarthApp.3=Remind me later +EarthApp.4=Update Now +EarthApp.57=There is a new version of Collect Earth available\!
How do you want to proceed? +EarthApp.58=Update alert +EarthApp.59=Error when importing project file +EarthApp.5=Do not remind me again +EarthApp.61=The Collect Earth file could not be open.
Please make sure that Google Earth is installed. +EarthApp.6=\ - Version +EarthApp.70=WARNING +EarthApp.71=In Mac OS X the Collect Earth project files (*.cep) will not open in Collect Earth when they are double-clicked.
+EarthApp.72=Use the Collect Earth toolbar to open the .cep files \: +EarthApp.73=Collect Earth issues in Mac OS X computers +EarthSurveyService.9=Field required +ExportActionListener.1=Pick Date to Export Records From +ExportDialogProcessMonitor.0=Processing data... +ExportDialogProcessMonitor.1=Waiting to initialize process \: +ExportDialogProcessMonitor.4=Exported records \: +ImportActionListener.0=Should the data for plots that have not been completely filled be imported? +ImportActionListener.2=If you click NO only the data from plots in the "green" state, containing all data, will be imported. +ImportActionListener.3=Import non-finished records +ImportDialogProcessMonitor.0=\ CALCULATING +ImportDialogProcessMonitor.11=Initial number of records \: +ImportDialogProcessMonitor.2=Importing records... +ImportDialogProcessMonitor.5=Actual number of imported records \: +ImportDialogProcessMonitor.8=Processing data... +ImportProcessMonitorDialog.0=Imported records \: +ImportXMLDialogProcessMonitor.1 = Overwrite data +ImportXMLDialogProcessMonitor.2 = Import only non-conflicting plots +InfiniteProgressMonitor.0=Cancel operation +JFileChooserExistsAware.0=Collect Earth Project file +KmlImportService.13=Select a CSV file to save the plot locations to +MissingPlotsListener.0=Error while getting information about plots not present on the Database +MissingPlotsListener.10=Total number of plots in the sampling design \: +MissingPlotsListener.12=Number of missing plots \: +MissingPlotsListener.14=All the plots are filled\! +MissingPlotsListener.1=Missing plots +MissingPlotsListener.2=Copy contents to clipboard +MissingPlotsListener.3=Pick the files that contain plot information ( .csv or .ced files ) for which you want to know if all data has been filled. +MissingPlotsListener.4=Missing plots - information +MissingPlotsListener.5=From file \: +MissingPlotsListener.6=Export to CED file +NO=No +NO_TO_ALL=No to all +OpenTextFileListener.0=The text file was not found at \: +OptionWizard.0=Collect Earth options +OptionWizard.100=Open Planet imagery +OptionWizard.101=Planet API key +OptionWizard.1021=URL SecureWatch +OptionWizard.102=Open Maxar SecureWatch +OptionWizard.103=Set URL for Extra Map (opens when set) \: +OptionWizard.104=Browsers +OptionWizard.105=Open Earth Map +OptionWizard.110=Use NICFI provided Monthly imagery +OptionWizard.10=Open backup folder +OptionWizard.11=Unknown\: use ifconfig +OptionWizard.12=Client Instance +OptionWizard.13=Collect Earth Server IP +OptionWizard.14=Collect Earth Server port (e.g. 8023) +OptionWizard.15=Save & Apply changes +OptionWizard.16=ID +OptionWizard.17=X-coord +OptionWizard.18=Y-coord +OptionWizard.19=Elevation +OptionWizard.1=Choose Browser +OptionWizard.20=The Google Earth contents have been changed.
Please accept the content reload when you are prompted by Google Earth. +OptionWizard.21=Update successful +OptionWizard.22=Slope +OptionWizard.23=There was an error when re-opening the Google Earth data +OptionWizard.24=Cancel +OptionWizard.25=Operation Mode +OptionWizard.26=DB host +OptionWizard.27=This is not a recognized Saiku Folder ( the start-saiku.bat file is not present) +OptionWizard.28=Saiku Server not recognized +OptionWizard.29=DB port +OptionWizard.2=Workflow (server/client) +OptionWizard.30=SQLite options +OptionWizard.31=Sample data +OptionWizard.32=Plot layout +OptionWizard.33=Survey Definition +OptionWizard.34=Integrated Services +OptionWizard.35=Number of control points +OptionWizard.36=Distance between control points (in meters) +OptionWizard.37=Margin with plot border (in meters) +OptionWizard.38=The CSV/CED file cannot be read correctly.
The file is expected to have a comma separated values like this \:
+OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect +OptionWizard.3=Server Instance +OptionWizard.40=Projects +OptionWizard.41=Load a new project file +OptionWizard.42=Error when closing the CSV reader +OptionWizard.43=Name of survey +OptionWizard.44=automatically back-up database at +OptionWizard.45=Open Earth Engine Playground ( deprecated ) +OptionWizard.46=Open Earth Engine Timelapse +OptionWizard.47=Open Bing Maps +OptionWizard.48=Open form on a browser instead of Google Earth (recommended for LINUX) +OptionWizard.49=Path to ced/csv file with plot data +OptionWizard.4=Current computer IP \: +OptionWizard.50=Browse... +OptionWizard.51=Error importing project file +OptionWizard.52=CSV/CED file with only coordinates +OptionWizard.53=No points +OptionWizard.54=Central point +OptionWizard.55=Error importing project folder +OptionWizard.56=Load project +OptionWizard.57=Previously loaded projects +OptionWizard.58=Open GEE Code Editor (requires Trusted Tester access) +OptionWizard.59=Open Here Maps focused on the plot +OptionWizard.5=Collect Earth Server port\: +OptionWizard.65=Path to Saiku folder +OptionWizard.66=Browse... +OptionWizard.67=Path to Firefox executable +OptionWizard.68=Browse... +OptionWizard.6=PostgreSQL DB parameters +OptionWizard.70=Executable files +OptionWizard.72=Binary files +OptionWizard.73=Path to Chrome executable +OptionWizard.74=Browse... +OptionWizard.76=Executable files +OptionWizard.78=Binary files +OptionWizard.79=Path to KML Freemarker template +OptionWizard.7=User Name +OptionWizard.80=Browse... +OptionWizard.82=Freemarker template +OptionWizard.83=Path to HTML Balloon form design +OptionWizard.84=Browse... +OptionWizard.86=HTML webpage +OptionWizard.87=Path to XML with IDM definition +OptionWizard.88=Browse... +OptionWizard.8=Password +OptionWizard.90=XML IDM definition +OptionWizard.91=Server (manager version or stand-alone use) +OptionWizard.92=Client (operator/connected to server) +OptionWizard.93=SQLite (Embedded/single file based) +OptionWizard.94=PostgreSQL +OptionWizard.95=Side of the sampling dots (in meters) +OptionWizard.9=DB Name +ProcessMonitorDialog.1=Parsing error on row number +ProcessMonitorDialog.4=, columns +ProcessMonitorDialog.5=\ -- values +SaikuAnalysisListener.0=Yes - Refresh Saiku data (long process) +SaikuAnalysisListener.1=No - Use same version of the data as last time Saiku was used +SaikuStarter.1=Starting Saiku +SaikuStarter.2=Starting Saiku can take some minutes, please wait\! +SaikuToolExportListener.1=Saiku Tool generation +SaikuToolExportListener.2=Generating Saiku Tool with current database +SaveEarthDataServlet.0=Empty request +SaveEarthDataServlet.1=Problem occurred while saving data to the database +SaveEarthDataServlet.2=The data was saved +SlopeCode.0=Flat (0-5) +YES=Yes +YES_TO_ALL=Yes to all + +GenerateDatabaseStarter.1=Preparing for analysis +GenerateDatabaseStarter.2=Generating Relational Database + +IPCCGeneratorListener.1=Waiting for process to complete\! +IPCCGeneratorListener.2=The IPCC GHGi compatible data is being generated +IPCCGeneratorListener.3=Refresh the data (update with latest from Collect Earth) +IPCCGeneratorListener.4=Use the latest generated database (fastest process - no update) +IPCCGeneratorListener.5=GHGi Database generation +IPCCGeneratorListener.6=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming but it is necessary if the Collect Earth data has been updated since the last time.
\ No newline at end of file From 933f1fd82e7373c244a005d07cbd45e8b80aefc1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Mon, 28 Nov 2022 13:23:59 +0100 Subject: [PATCH 0004/1620] New translations Messages.properties (English) --- .../earth/app/view/Messagesen.properties | 265 ++++++++++++++++++ 1 file changed, 265 insertions(+) create mode 100644 en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messagesen.properties diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messagesen.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messagesen.properties new file mode 100644 index 0000000000..3ce9622fe0 --- /dev/null +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messagesen.properties @@ -0,0 +1,265 @@ +AboutDialog.19=A problem occurred +AboutDialog.5=For more information visit our website OpenForis.org +AboutDialog.6=Sorry, a problem occurred while trying to open this link in your system's standard browser. +AboutDialog.8=Ok +AspectCode.0=North +AspectCode.1=North-East +AspectCode.2=East +AspectCode.3=South-East +AspectCode.4=South +AspectCode.5=South-West +AspectCode.6=West +AspectCode.7=North-West +CollectEarthMenu.0=Import CEP file +CollectEarthMenu.2=Utilities +CollectEarthMenu.3=Divide large CSV plot files +CollectEarthMenu.4=Export data to XML (from specific date until present) +CollectEarthMenu.5=Export to Collect Backup +CollectEarthMenu.6=Export data as Collect Backup (all data) +CollectEarthMenu.7=Export data as Collect Backup (from date) +CollectEarthMenu.8=Export data to XML (using summary attribute) +CollectEarthWindow.0=Error when attempting to export data to CSV file +CollectEarthWindow.10=File +CollectEarthWindow.11=Exit +CollectEarthWindow.12=Tools +CollectEarthWindow.13=Download data to CSV (Excel) +CollectEarthWindow.14=Start SAIKU Analysis +CollectEarthWindow.15=Properties +CollectEarthWindow.16=Help +CollectEarthWindow.17=Disclaimer +CollectEarthWindow.18=Find missing plots in database +CollectEarthWindow.19=Collect Earth +CollectEarthWindow.1=Export error +CollectEarthWindow.20=Number of duplicated records\: +CollectEarthWindow.21=Could not find icon for main frame +CollectEarthWindow.22=Are you sure that you want to close Collect Earth?
Closing the window will also close the Collect Earth server +CollectEarthWindow.23=Confirmation needed +CollectEarthWindow.24=XML Export +CollectEarthWindow.25=Do you want to add these records anyway and lose your current data? +CollectEarthWindow.26=Operator +CollectEarthWindow.27=Update +CollectEarthWindow.28=Open Foris Collect Earth server should be running while the operator interprets data. +CollectEarthWindow.29=The Saiku Server is not configured. +CollectEarthWindow.2=Language +CollectEarthWindow.30=Please maintain this window open while you are using Google Earth. +CollectEarthWindow.31=Export collected data to CSV file +CollectEarthWindow.32=Quit +CollectEarthWindow.33=The operator name has to be longer than 5 characters and shorter than 50 +CollectEarthWindow.34=Validation error +CollectEarthWindow.35=OPERATOR NAME EMPTY\!
Please fill the operator name and press the "Update" button. +CollectEarthWindow.36=Operator name cannot be empty +CollectEarthWindow.37=Keep Open +CollectEarthWindow.38=CSV files +CollectEarthWindow.39=NOTICE\: It is advisable that you back-up your current data (Export to XML) before importing the new data +CollectEarthWindow.3=\ Import error +CollectEarthWindow.40=Set-up the path to the folder where Saiku Server is installed in the Tools->Properties->Advanced tab. +CollectEarthWindow.41=Saving exported data to file\: +CollectEarthWindow.42=Quit +CollectEarthWindow.43=Conflicting records found +CollectEarthWindow.44=Data Import/Export +CollectEarthWindow.45=Export data to XML (compressed) +CollectEarthWindow.46=Import new data from ZIP (compressed XML) +CollectEarthWindow.47=Saiku Server not configured +CollectEarthWindow.48=Zip/collect-data files +CollectEarthWindow.49=Fusion CSV files +CollectEarthWindow.4=FAO Disclaimer notices +CollectEarthWindow.50=Open User Manual +CollectEarthWindow.51=Check for updates of Collect Earth +CollectEarthWindow.52=Open Application Log File +CollectEarthWindow.53=Collect Earth Log file +CollectEarthWindow.54=Load points from KML +CollectEarthWindow.55=Update current records using CSV +CollectEarthWindow.56=About... +CollectEarthWindow.57=The Saiku starter process is still running, please wait. +CollectEarthWindow.58=Cannot start Saiku analysis +CollectEarthWindow.59=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming.
If you click on "YES" a new dataset with the latest information will be generated. +CollectEarthWindow.5=Close +CollectEarthWindow.60=Saiku data generation +CollectEarthWindow.61=Export data to XML (modified records since last export) +CollectEarthWindow.62=About... +CollectEarthWindow.63=Error getting the points from KML +CollectEarthWindow.64=Technical Support +CollectEarthWindow.65=The operator name has been changed +CollectEarthWindow.66=Operator name +CollectEarthWindow.67=Open data folder +CollectEarthWindow.6=Export to Fusion Table +CollectEarthWindow.70=Open the Survey Guide +CollectEarthWindow.71=Generate Stand-Alone Saiku tool +CollectEarthWindow.7=Error when importing data +CollectEarthWindow.8=Disclaimer text could not be found +CollectEarthWindow.9=The data imported contains records that are already present on your database. +DynamicsCode.0=Initially Forest +DynamicsCode.1=Initially Grassland +DynamicsCode.2=Initially Settlement +DynamicsCode.3=Initially Otherland +DynamicsCode.4=Initially Wetland +DynamicsCode.5=Initially Cropland +EarthApp.11=Collect Earth is already running +EarthApp.21=The file containing the grid of plots as a CSV/CED is not found in the selected path \:
+EarthApp.23=No CSV/CED file has been set-up \:

+EarthApp.24=The file containing the Freemarker template with the KML definition is not found in the selected path \:
+EarthApp.26=No KML definition file has been set-up \:

+EarthApp.27=The file containing the HTML balloon form is not found in the selected path \:
+EarthApp.29=No HTML balloon file has been set-up \:

+EarthApp.30=Please correct the file location in the Tools->Properties menu. +EarthApp.3=Remind me later +EarthApp.4=Update Now +EarthApp.57=There is a new version of Collect Earth available\!
How do you want to proceed? +EarthApp.58=Update alert +EarthApp.59=Error when importing project file +EarthApp.5=Do not remind me again +EarthApp.61=The Collect Earth file could not be open.
Please make sure that Google Earth is installed. +EarthApp.6=\ - Version +EarthApp.70=WARNING +EarthApp.71=In Mac OS X the Collect Earth project files (*.cep) will not open in Collect Earth when they are double-clicked.
+EarthApp.72=Use the Collect Earth toolbar to open the .cep files \: +EarthApp.73=Collect Earth issues in Mac OS X computers +EarthSurveyService.9=Field required +ExportActionListener.1=Pick Date to Export Records From +ExportDialogProcessMonitor.0=Processing data... +ExportDialogProcessMonitor.1=Waiting to initialize process \: +ExportDialogProcessMonitor.4=Exported records \: +ImportActionListener.0=Should the data for plots that have not been completely filled be imported? +ImportActionListener.2=If you click NO only the data from plots in the "green" state, containing all data, will be imported. +ImportActionListener.3=Import non-finished records +ImportDialogProcessMonitor.0=\ CALCULATING +ImportDialogProcessMonitor.11=Initial number of records \: +ImportDialogProcessMonitor.2=Importing records... +ImportDialogProcessMonitor.5=Actual number of imported records \: +ImportDialogProcessMonitor.8=Processing data... +ImportProcessMonitorDialog.0=Imported records \: +ImportXMLDialogProcessMonitor.1 = Overwrite data +ImportXMLDialogProcessMonitor.2 = Import only non-conflicting plots +InfiniteProgressMonitor.0=Cancel operation +JFileChooserExistsAware.0=Collect Earth Project file +KmlImportService.13=Select a CSV file to save the plot locations to +MissingPlotsListener.0=Error while getting information about plots not present on the Database +MissingPlotsListener.10=Total number of plots in the sampling design \: +MissingPlotsListener.12=Number of missing plots \: +MissingPlotsListener.14=All the plots are filled\! +MissingPlotsListener.1=Missing plots +MissingPlotsListener.2=Copy contents to clipboard +MissingPlotsListener.3=Pick the files that contain plot information ( .csv or .ced files ) for which you want to know if all data has been filled. +MissingPlotsListener.4=Missing plots - information +MissingPlotsListener.5=From file \: +MissingPlotsListener.6=Export to CED file +NO=No +NO_TO_ALL=No to all +OpenTextFileListener.0=The text file was not found at \: +OptionWizard.0=Collect Earth options +OptionWizard.100=Open Planet imagery +OptionWizard.101=Planet API key +OptionWizard.1021=URL SecureWatch +OptionWizard.102=Open Maxar SecureWatch +OptionWizard.103=Set URL for Extra Map (opens when set) \: +OptionWizard.104=Browsers +OptionWizard.105=Open Earth Map +OptionWizard.110=Use NICFI provided Monthly imagery +OptionWizard.10=Open backup folder +OptionWizard.11=Unknown\: use ifconfig +OptionWizard.12=Client Instance +OptionWizard.13=Collect Earth Server IP +OptionWizard.14=Collect Earth Server port (e.g. 8023) +OptionWizard.15=Save & Apply changes +OptionWizard.16=ID +OptionWizard.17=X-coord +OptionWizard.18=Y-coord +OptionWizard.19=Elevation +OptionWizard.1=Choose Browser +OptionWizard.20=The Google Earth contents have been changed.
Please accept the content reload when you are prompted by Google Earth. +OptionWizard.21=Update successful +OptionWizard.22=Slope +OptionWizard.23=There was an error when re-opening the Google Earth data +OptionWizard.24=Cancel +OptionWizard.25=Operation Mode +OptionWizard.26=DB host +OptionWizard.27=This is not a recognized Saiku Folder ( the start-saiku.bat file is not present) +OptionWizard.28=Saiku Server not recognized +OptionWizard.29=DB port +OptionWizard.2=Workflow (server/client) +OptionWizard.30=SQLite options +OptionWizard.31=Sample data +OptionWizard.32=Plot layout +OptionWizard.33=Survey Definition +OptionWizard.34=Integrated Services +OptionWizard.35=Number of control points +OptionWizard.36=Distance between control points (in meters) +OptionWizard.37=Margin with plot border (in meters) +OptionWizard.38=The CSV/CED file cannot be read correctly.
The file is expected to have a comma separated values like this \:
+OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect +OptionWizard.3=Server Instance +OptionWizard.40=Projects +OptionWizard.41=Load a new project file +OptionWizard.42=Error when closing the CSV reader +OptionWizard.43=Name of survey +OptionWizard.44=automatically back-up database at +OptionWizard.45=Open Earth Engine Playground ( deprecated ) +OptionWizard.46=Open Earth Engine Timelapse +OptionWizard.47=Open Bing Maps +OptionWizard.48=Open form on a browser instead of Google Earth (recommended for LINUX) +OptionWizard.49=Path to ced/csv file with plot data +OptionWizard.4=Current computer IP \: +OptionWizard.50=Browse... +OptionWizard.51=Error importing project file +OptionWizard.52=CSV/CED file with only coordinates +OptionWizard.53=No points +OptionWizard.54=Central point +OptionWizard.55=Error importing project folder +OptionWizard.56=Load project +OptionWizard.57=Previously loaded projects +OptionWizard.58=Open GEE Code Editor (requires Trusted Tester access) +OptionWizard.59=Open Here Maps focused on the plot +OptionWizard.5=Collect Earth Server port\: +OptionWizard.65=Path to Saiku folder +OptionWizard.66=Browse... +OptionWizard.67=Path to Firefox executable +OptionWizard.68=Browse... +OptionWizard.6=PostgreSQL DB parameters +OptionWizard.70=Executable files +OptionWizard.72=Binary files +OptionWizard.73=Path to Chrome executable +OptionWizard.74=Browse... +OptionWizard.76=Executable files +OptionWizard.78=Binary files +OptionWizard.79=Path to KML Freemarker template +OptionWizard.7=User Name +OptionWizard.80=Browse... +OptionWizard.82=Freemarker template +OptionWizard.83=Path to HTML Balloon form design +OptionWizard.84=Browse... +OptionWizard.86=HTML webpage +OptionWizard.87=Path to XML with IDM definition +OptionWizard.88=Browse... +OptionWizard.8=Password +OptionWizard.90=XML IDM definition +OptionWizard.91=Server (manager version or stand-alone use) +OptionWizard.92=Client (operator/connected to server) +OptionWizard.93=SQLite (Embedded/single file based) +OptionWizard.94=PostgreSQL +OptionWizard.95=Side of the sampling dots (in meters) +OptionWizard.9=DB Name +ProcessMonitorDialog.1=Parsing error on row number +ProcessMonitorDialog.4=, columns +ProcessMonitorDialog.5=\ -- values +SaikuAnalysisListener.0=Yes - Refresh Saiku data (long process) +SaikuAnalysisListener.1=No - Use same version of the data as last time Saiku was used +SaikuStarter.1=Starting Saiku +SaikuStarter.2=Starting Saiku can take some minutes, please wait\! +SaikuToolExportListener.1=Saiku Tool generation +SaikuToolExportListener.2=Generating Saiku Tool with current database +SaveEarthDataServlet.0=Empty request +SaveEarthDataServlet.1=Problem occurred while saving data to the database +SaveEarthDataServlet.2=The data was saved +SlopeCode.0=Flat (0-5) +YES=Yes +YES_TO_ALL=Yes to all + +GenerateDatabaseStarter.1=Preparing for analysis +GenerateDatabaseStarter.2=Generating Relational Database + +IPCCGeneratorListener.1=Waiting for process to complete\! +IPCCGeneratorListener.2=The IPCC GHGi compatible data is being generated +IPCCGeneratorListener.3=Refresh the data (update with latest from Collect Earth) +IPCCGeneratorListener.4=Use the latest generated database (fastest process - no update) +IPCCGeneratorListener.5=GHGi Database generation +IPCCGeneratorListener.6=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming but it is necessary if the Collect Earth data has been updated since the last time.
\ No newline at end of file From a0ff2c51425e2c4b752df64ba072230fb1ef733f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 11:51:04 +0100 Subject: [PATCH 0005/1620] New translations Messages.properties (French) --- .../earth/app/view/Messages_fr.properties | 265 ++++++++++++++++++ 1 file changed, 265 insertions(+) create mode 100644 fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties new file mode 100644 index 0000000000..3ce9622fe0 --- /dev/null +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -0,0 +1,265 @@ +AboutDialog.19=A problem occurred +AboutDialog.5=For more information visit our website OpenForis.org +AboutDialog.6=Sorry, a problem occurred while trying to open this link in your system's standard browser. +AboutDialog.8=Ok +AspectCode.0=North +AspectCode.1=North-East +AspectCode.2=East +AspectCode.3=South-East +AspectCode.4=South +AspectCode.5=South-West +AspectCode.6=West +AspectCode.7=North-West +CollectEarthMenu.0=Import CEP file +CollectEarthMenu.2=Utilities +CollectEarthMenu.3=Divide large CSV plot files +CollectEarthMenu.4=Export data to XML (from specific date until present) +CollectEarthMenu.5=Export to Collect Backup +CollectEarthMenu.6=Export data as Collect Backup (all data) +CollectEarthMenu.7=Export data as Collect Backup (from date) +CollectEarthMenu.8=Export data to XML (using summary attribute) +CollectEarthWindow.0=Error when attempting to export data to CSV file +CollectEarthWindow.10=File +CollectEarthWindow.11=Exit +CollectEarthWindow.12=Tools +CollectEarthWindow.13=Download data to CSV (Excel) +CollectEarthWindow.14=Start SAIKU Analysis +CollectEarthWindow.15=Properties +CollectEarthWindow.16=Help +CollectEarthWindow.17=Disclaimer +CollectEarthWindow.18=Find missing plots in database +CollectEarthWindow.19=Collect Earth +CollectEarthWindow.1=Export error +CollectEarthWindow.20=Number of duplicated records\: +CollectEarthWindow.21=Could not find icon for main frame +CollectEarthWindow.22=Are you sure that you want to close Collect Earth?
Closing the window will also close the Collect Earth server +CollectEarthWindow.23=Confirmation needed +CollectEarthWindow.24=XML Export +CollectEarthWindow.25=Do you want to add these records anyway and lose your current data? +CollectEarthWindow.26=Operator +CollectEarthWindow.27=Update +CollectEarthWindow.28=Open Foris Collect Earth server should be running while the operator interprets data. +CollectEarthWindow.29=The Saiku Server is not configured. +CollectEarthWindow.2=Language +CollectEarthWindow.30=Please maintain this window open while you are using Google Earth. +CollectEarthWindow.31=Export collected data to CSV file +CollectEarthWindow.32=Quit +CollectEarthWindow.33=The operator name has to be longer than 5 characters and shorter than 50 +CollectEarthWindow.34=Validation error +CollectEarthWindow.35=OPERATOR NAME EMPTY\!
Please fill the operator name and press the "Update" button. +CollectEarthWindow.36=Operator name cannot be empty +CollectEarthWindow.37=Keep Open +CollectEarthWindow.38=CSV files +CollectEarthWindow.39=NOTICE\: It is advisable that you back-up your current data (Export to XML) before importing the new data +CollectEarthWindow.3=\ Import error +CollectEarthWindow.40=Set-up the path to the folder where Saiku Server is installed in the Tools->Properties->Advanced tab. +CollectEarthWindow.41=Saving exported data to file\: +CollectEarthWindow.42=Quit +CollectEarthWindow.43=Conflicting records found +CollectEarthWindow.44=Data Import/Export +CollectEarthWindow.45=Export data to XML (compressed) +CollectEarthWindow.46=Import new data from ZIP (compressed XML) +CollectEarthWindow.47=Saiku Server not configured +CollectEarthWindow.48=Zip/collect-data files +CollectEarthWindow.49=Fusion CSV files +CollectEarthWindow.4=FAO Disclaimer notices +CollectEarthWindow.50=Open User Manual +CollectEarthWindow.51=Check for updates of Collect Earth +CollectEarthWindow.52=Open Application Log File +CollectEarthWindow.53=Collect Earth Log file +CollectEarthWindow.54=Load points from KML +CollectEarthWindow.55=Update current records using CSV +CollectEarthWindow.56=About... +CollectEarthWindow.57=The Saiku starter process is still running, please wait. +CollectEarthWindow.58=Cannot start Saiku analysis +CollectEarthWindow.59=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming.
If you click on "YES" a new dataset with the latest information will be generated. +CollectEarthWindow.5=Close +CollectEarthWindow.60=Saiku data generation +CollectEarthWindow.61=Export data to XML (modified records since last export) +CollectEarthWindow.62=About... +CollectEarthWindow.63=Error getting the points from KML +CollectEarthWindow.64=Technical Support +CollectEarthWindow.65=The operator name has been changed +CollectEarthWindow.66=Operator name +CollectEarthWindow.67=Open data folder +CollectEarthWindow.6=Export to Fusion Table +CollectEarthWindow.70=Open the Survey Guide +CollectEarthWindow.71=Generate Stand-Alone Saiku tool +CollectEarthWindow.7=Error when importing data +CollectEarthWindow.8=Disclaimer text could not be found +CollectEarthWindow.9=The data imported contains records that are already present on your database. +DynamicsCode.0=Initially Forest +DynamicsCode.1=Initially Grassland +DynamicsCode.2=Initially Settlement +DynamicsCode.3=Initially Otherland +DynamicsCode.4=Initially Wetland +DynamicsCode.5=Initially Cropland +EarthApp.11=Collect Earth is already running +EarthApp.21=The file containing the grid of plots as a CSV/CED is not found in the selected path \:
+EarthApp.23=No CSV/CED file has been set-up \:

+EarthApp.24=The file containing the Freemarker template with the KML definition is not found in the selected path \:
+EarthApp.26=No KML definition file has been set-up \:

+EarthApp.27=The file containing the HTML balloon form is not found in the selected path \:
+EarthApp.29=No HTML balloon file has been set-up \:

+EarthApp.30=Please correct the file location in the Tools->Properties menu. +EarthApp.3=Remind me later +EarthApp.4=Update Now +EarthApp.57=There is a new version of Collect Earth available\!
How do you want to proceed? +EarthApp.58=Update alert +EarthApp.59=Error when importing project file +EarthApp.5=Do not remind me again +EarthApp.61=The Collect Earth file could not be open.
Please make sure that Google Earth is installed. +EarthApp.6=\ - Version +EarthApp.70=WARNING +EarthApp.71=In Mac OS X the Collect Earth project files (*.cep) will not open in Collect Earth when they are double-clicked.
+EarthApp.72=Use the Collect Earth toolbar to open the .cep files \: +EarthApp.73=Collect Earth issues in Mac OS X computers +EarthSurveyService.9=Field required +ExportActionListener.1=Pick Date to Export Records From +ExportDialogProcessMonitor.0=Processing data... +ExportDialogProcessMonitor.1=Waiting to initialize process \: +ExportDialogProcessMonitor.4=Exported records \: +ImportActionListener.0=Should the data for plots that have not been completely filled be imported? +ImportActionListener.2=If you click NO only the data from plots in the "green" state, containing all data, will be imported. +ImportActionListener.3=Import non-finished records +ImportDialogProcessMonitor.0=\ CALCULATING +ImportDialogProcessMonitor.11=Initial number of records \: +ImportDialogProcessMonitor.2=Importing records... +ImportDialogProcessMonitor.5=Actual number of imported records \: +ImportDialogProcessMonitor.8=Processing data... +ImportProcessMonitorDialog.0=Imported records \: +ImportXMLDialogProcessMonitor.1 = Overwrite data +ImportXMLDialogProcessMonitor.2 = Import only non-conflicting plots +InfiniteProgressMonitor.0=Cancel operation +JFileChooserExistsAware.0=Collect Earth Project file +KmlImportService.13=Select a CSV file to save the plot locations to +MissingPlotsListener.0=Error while getting information about plots not present on the Database +MissingPlotsListener.10=Total number of plots in the sampling design \: +MissingPlotsListener.12=Number of missing plots \: +MissingPlotsListener.14=All the plots are filled\! +MissingPlotsListener.1=Missing plots +MissingPlotsListener.2=Copy contents to clipboard +MissingPlotsListener.3=Pick the files that contain plot information ( .csv or .ced files ) for which you want to know if all data has been filled. +MissingPlotsListener.4=Missing plots - information +MissingPlotsListener.5=From file \: +MissingPlotsListener.6=Export to CED file +NO=No +NO_TO_ALL=No to all +OpenTextFileListener.0=The text file was not found at \: +OptionWizard.0=Collect Earth options +OptionWizard.100=Open Planet imagery +OptionWizard.101=Planet API key +OptionWizard.1021=URL SecureWatch +OptionWizard.102=Open Maxar SecureWatch +OptionWizard.103=Set URL for Extra Map (opens when set) \: +OptionWizard.104=Browsers +OptionWizard.105=Open Earth Map +OptionWizard.110=Use NICFI provided Monthly imagery +OptionWizard.10=Open backup folder +OptionWizard.11=Unknown\: use ifconfig +OptionWizard.12=Client Instance +OptionWizard.13=Collect Earth Server IP +OptionWizard.14=Collect Earth Server port (e.g. 8023) +OptionWizard.15=Save & Apply changes +OptionWizard.16=ID +OptionWizard.17=X-coord +OptionWizard.18=Y-coord +OptionWizard.19=Elevation +OptionWizard.1=Choose Browser +OptionWizard.20=The Google Earth contents have been changed.
Please accept the content reload when you are prompted by Google Earth. +OptionWizard.21=Update successful +OptionWizard.22=Slope +OptionWizard.23=There was an error when re-opening the Google Earth data +OptionWizard.24=Cancel +OptionWizard.25=Operation Mode +OptionWizard.26=DB host +OptionWizard.27=This is not a recognized Saiku Folder ( the start-saiku.bat file is not present) +OptionWizard.28=Saiku Server not recognized +OptionWizard.29=DB port +OptionWizard.2=Workflow (server/client) +OptionWizard.30=SQLite options +OptionWizard.31=Sample data +OptionWizard.32=Plot layout +OptionWizard.33=Survey Definition +OptionWizard.34=Integrated Services +OptionWizard.35=Number of control points +OptionWizard.36=Distance between control points (in meters) +OptionWizard.37=Margin with plot border (in meters) +OptionWizard.38=The CSV/CED file cannot be read correctly.
The file is expected to have a comma separated values like this \:
+OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect +OptionWizard.3=Server Instance +OptionWizard.40=Projects +OptionWizard.41=Load a new project file +OptionWizard.42=Error when closing the CSV reader +OptionWizard.43=Name of survey +OptionWizard.44=automatically back-up database at +OptionWizard.45=Open Earth Engine Playground ( deprecated ) +OptionWizard.46=Open Earth Engine Timelapse +OptionWizard.47=Open Bing Maps +OptionWizard.48=Open form on a browser instead of Google Earth (recommended for LINUX) +OptionWizard.49=Path to ced/csv file with plot data +OptionWizard.4=Current computer IP \: +OptionWizard.50=Browse... +OptionWizard.51=Error importing project file +OptionWizard.52=CSV/CED file with only coordinates +OptionWizard.53=No points +OptionWizard.54=Central point +OptionWizard.55=Error importing project folder +OptionWizard.56=Load project +OptionWizard.57=Previously loaded projects +OptionWizard.58=Open GEE Code Editor (requires Trusted Tester access) +OptionWizard.59=Open Here Maps focused on the plot +OptionWizard.5=Collect Earth Server port\: +OptionWizard.65=Path to Saiku folder +OptionWizard.66=Browse... +OptionWizard.67=Path to Firefox executable +OptionWizard.68=Browse... +OptionWizard.6=PostgreSQL DB parameters +OptionWizard.70=Executable files +OptionWizard.72=Binary files +OptionWizard.73=Path to Chrome executable +OptionWizard.74=Browse... +OptionWizard.76=Executable files +OptionWizard.78=Binary files +OptionWizard.79=Path to KML Freemarker template +OptionWizard.7=User Name +OptionWizard.80=Browse... +OptionWizard.82=Freemarker template +OptionWizard.83=Path to HTML Balloon form design +OptionWizard.84=Browse... +OptionWizard.86=HTML webpage +OptionWizard.87=Path to XML with IDM definition +OptionWizard.88=Browse... +OptionWizard.8=Password +OptionWizard.90=XML IDM definition +OptionWizard.91=Server (manager version or stand-alone use) +OptionWizard.92=Client (operator/connected to server) +OptionWizard.93=SQLite (Embedded/single file based) +OptionWizard.94=PostgreSQL +OptionWizard.95=Side of the sampling dots (in meters) +OptionWizard.9=DB Name +ProcessMonitorDialog.1=Parsing error on row number +ProcessMonitorDialog.4=, columns +ProcessMonitorDialog.5=\ -- values +SaikuAnalysisListener.0=Yes - Refresh Saiku data (long process) +SaikuAnalysisListener.1=No - Use same version of the data as last time Saiku was used +SaikuStarter.1=Starting Saiku +SaikuStarter.2=Starting Saiku can take some minutes, please wait\! +SaikuToolExportListener.1=Saiku Tool generation +SaikuToolExportListener.2=Generating Saiku Tool with current database +SaveEarthDataServlet.0=Empty request +SaveEarthDataServlet.1=Problem occurred while saving data to the database +SaveEarthDataServlet.2=The data was saved +SlopeCode.0=Flat (0-5) +YES=Yes +YES_TO_ALL=Yes to all + +GenerateDatabaseStarter.1=Preparing for analysis +GenerateDatabaseStarter.2=Generating Relational Database + +IPCCGeneratorListener.1=Waiting for process to complete\! +IPCCGeneratorListener.2=The IPCC GHGi compatible data is being generated +IPCCGeneratorListener.3=Refresh the data (update with latest from Collect Earth) +IPCCGeneratorListener.4=Use the latest generated database (fastest process - no update) +IPCCGeneratorListener.5=GHGi Database generation +IPCCGeneratorListener.6=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming but it is necessary if the Collect Earth data has been updated since the last time.
\ No newline at end of file From 0ff82236f9acf410fb695187c5e4935c8bf09cc6 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 11:51:06 +0100 Subject: [PATCH 0006/1620] New translations Messages.properties (Spanish) --- .../earth/app/view/Messages_es.properties | 265 ++++++++++++++++++ 1 file changed, 265 insertions(+) create mode 100644 es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties new file mode 100644 index 0000000000..3ce9622fe0 --- /dev/null +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -0,0 +1,265 @@ +AboutDialog.19=A problem occurred +AboutDialog.5=For more information visit our website OpenForis.org +AboutDialog.6=Sorry, a problem occurred while trying to open this link in your system's standard browser. +AboutDialog.8=Ok +AspectCode.0=North +AspectCode.1=North-East +AspectCode.2=East +AspectCode.3=South-East +AspectCode.4=South +AspectCode.5=South-West +AspectCode.6=West +AspectCode.7=North-West +CollectEarthMenu.0=Import CEP file +CollectEarthMenu.2=Utilities +CollectEarthMenu.3=Divide large CSV plot files +CollectEarthMenu.4=Export data to XML (from specific date until present) +CollectEarthMenu.5=Export to Collect Backup +CollectEarthMenu.6=Export data as Collect Backup (all data) +CollectEarthMenu.7=Export data as Collect Backup (from date) +CollectEarthMenu.8=Export data to XML (using summary attribute) +CollectEarthWindow.0=Error when attempting to export data to CSV file +CollectEarthWindow.10=File +CollectEarthWindow.11=Exit +CollectEarthWindow.12=Tools +CollectEarthWindow.13=Download data to CSV (Excel) +CollectEarthWindow.14=Start SAIKU Analysis +CollectEarthWindow.15=Properties +CollectEarthWindow.16=Help +CollectEarthWindow.17=Disclaimer +CollectEarthWindow.18=Find missing plots in database +CollectEarthWindow.19=Collect Earth +CollectEarthWindow.1=Export error +CollectEarthWindow.20=Number of duplicated records\: +CollectEarthWindow.21=Could not find icon for main frame +CollectEarthWindow.22=Are you sure that you want to close Collect Earth?
Closing the window will also close the Collect Earth server +CollectEarthWindow.23=Confirmation needed +CollectEarthWindow.24=XML Export +CollectEarthWindow.25=Do you want to add these records anyway and lose your current data? +CollectEarthWindow.26=Operator +CollectEarthWindow.27=Update +CollectEarthWindow.28=Open Foris Collect Earth server should be running while the operator interprets data. +CollectEarthWindow.29=The Saiku Server is not configured. +CollectEarthWindow.2=Language +CollectEarthWindow.30=Please maintain this window open while you are using Google Earth. +CollectEarthWindow.31=Export collected data to CSV file +CollectEarthWindow.32=Quit +CollectEarthWindow.33=The operator name has to be longer than 5 characters and shorter than 50 +CollectEarthWindow.34=Validation error +CollectEarthWindow.35=OPERATOR NAME EMPTY\!
Please fill the operator name and press the "Update" button. +CollectEarthWindow.36=Operator name cannot be empty +CollectEarthWindow.37=Keep Open +CollectEarthWindow.38=CSV files +CollectEarthWindow.39=NOTICE\: It is advisable that you back-up your current data (Export to XML) before importing the new data +CollectEarthWindow.3=\ Import error +CollectEarthWindow.40=Set-up the path to the folder where Saiku Server is installed in the Tools->Properties->Advanced tab. +CollectEarthWindow.41=Saving exported data to file\: +CollectEarthWindow.42=Quit +CollectEarthWindow.43=Conflicting records found +CollectEarthWindow.44=Data Import/Export +CollectEarthWindow.45=Export data to XML (compressed) +CollectEarthWindow.46=Import new data from ZIP (compressed XML) +CollectEarthWindow.47=Saiku Server not configured +CollectEarthWindow.48=Zip/collect-data files +CollectEarthWindow.49=Fusion CSV files +CollectEarthWindow.4=FAO Disclaimer notices +CollectEarthWindow.50=Open User Manual +CollectEarthWindow.51=Check for updates of Collect Earth +CollectEarthWindow.52=Open Application Log File +CollectEarthWindow.53=Collect Earth Log file +CollectEarthWindow.54=Load points from KML +CollectEarthWindow.55=Update current records using CSV +CollectEarthWindow.56=About... +CollectEarthWindow.57=The Saiku starter process is still running, please wait. +CollectEarthWindow.58=Cannot start Saiku analysis +CollectEarthWindow.59=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming.
If you click on "YES" a new dataset with the latest information will be generated. +CollectEarthWindow.5=Close +CollectEarthWindow.60=Saiku data generation +CollectEarthWindow.61=Export data to XML (modified records since last export) +CollectEarthWindow.62=About... +CollectEarthWindow.63=Error getting the points from KML +CollectEarthWindow.64=Technical Support +CollectEarthWindow.65=The operator name has been changed +CollectEarthWindow.66=Operator name +CollectEarthWindow.67=Open data folder +CollectEarthWindow.6=Export to Fusion Table +CollectEarthWindow.70=Open the Survey Guide +CollectEarthWindow.71=Generate Stand-Alone Saiku tool +CollectEarthWindow.7=Error when importing data +CollectEarthWindow.8=Disclaimer text could not be found +CollectEarthWindow.9=The data imported contains records that are already present on your database. +DynamicsCode.0=Initially Forest +DynamicsCode.1=Initially Grassland +DynamicsCode.2=Initially Settlement +DynamicsCode.3=Initially Otherland +DynamicsCode.4=Initially Wetland +DynamicsCode.5=Initially Cropland +EarthApp.11=Collect Earth is already running +EarthApp.21=The file containing the grid of plots as a CSV/CED is not found in the selected path \:
+EarthApp.23=No CSV/CED file has been set-up \:

+EarthApp.24=The file containing the Freemarker template with the KML definition is not found in the selected path \:
+EarthApp.26=No KML definition file has been set-up \:

+EarthApp.27=The file containing the HTML balloon form is not found in the selected path \:
+EarthApp.29=No HTML balloon file has been set-up \:

+EarthApp.30=Please correct the file location in the Tools->Properties menu. +EarthApp.3=Remind me later +EarthApp.4=Update Now +EarthApp.57=There is a new version of Collect Earth available\!
How do you want to proceed? +EarthApp.58=Update alert +EarthApp.59=Error when importing project file +EarthApp.5=Do not remind me again +EarthApp.61=The Collect Earth file could not be open.
Please make sure that Google Earth is installed. +EarthApp.6=\ - Version +EarthApp.70=WARNING +EarthApp.71=In Mac OS X the Collect Earth project files (*.cep) will not open in Collect Earth when they are double-clicked.
+EarthApp.72=Use the Collect Earth toolbar to open the .cep files \: +EarthApp.73=Collect Earth issues in Mac OS X computers +EarthSurveyService.9=Field required +ExportActionListener.1=Pick Date to Export Records From +ExportDialogProcessMonitor.0=Processing data... +ExportDialogProcessMonitor.1=Waiting to initialize process \: +ExportDialogProcessMonitor.4=Exported records \: +ImportActionListener.0=Should the data for plots that have not been completely filled be imported? +ImportActionListener.2=If you click NO only the data from plots in the "green" state, containing all data, will be imported. +ImportActionListener.3=Import non-finished records +ImportDialogProcessMonitor.0=\ CALCULATING +ImportDialogProcessMonitor.11=Initial number of records \: +ImportDialogProcessMonitor.2=Importing records... +ImportDialogProcessMonitor.5=Actual number of imported records \: +ImportDialogProcessMonitor.8=Processing data... +ImportProcessMonitorDialog.0=Imported records \: +ImportXMLDialogProcessMonitor.1 = Overwrite data +ImportXMLDialogProcessMonitor.2 = Import only non-conflicting plots +InfiniteProgressMonitor.0=Cancel operation +JFileChooserExistsAware.0=Collect Earth Project file +KmlImportService.13=Select a CSV file to save the plot locations to +MissingPlotsListener.0=Error while getting information about plots not present on the Database +MissingPlotsListener.10=Total number of plots in the sampling design \: +MissingPlotsListener.12=Number of missing plots \: +MissingPlotsListener.14=All the plots are filled\! +MissingPlotsListener.1=Missing plots +MissingPlotsListener.2=Copy contents to clipboard +MissingPlotsListener.3=Pick the files that contain plot information ( .csv or .ced files ) for which you want to know if all data has been filled. +MissingPlotsListener.4=Missing plots - information +MissingPlotsListener.5=From file \: +MissingPlotsListener.6=Export to CED file +NO=No +NO_TO_ALL=No to all +OpenTextFileListener.0=The text file was not found at \: +OptionWizard.0=Collect Earth options +OptionWizard.100=Open Planet imagery +OptionWizard.101=Planet API key +OptionWizard.1021=URL SecureWatch +OptionWizard.102=Open Maxar SecureWatch +OptionWizard.103=Set URL for Extra Map (opens when set) \: +OptionWizard.104=Browsers +OptionWizard.105=Open Earth Map +OptionWizard.110=Use NICFI provided Monthly imagery +OptionWizard.10=Open backup folder +OptionWizard.11=Unknown\: use ifconfig +OptionWizard.12=Client Instance +OptionWizard.13=Collect Earth Server IP +OptionWizard.14=Collect Earth Server port (e.g. 8023) +OptionWizard.15=Save & Apply changes +OptionWizard.16=ID +OptionWizard.17=X-coord +OptionWizard.18=Y-coord +OptionWizard.19=Elevation +OptionWizard.1=Choose Browser +OptionWizard.20=The Google Earth contents have been changed.
Please accept the content reload when you are prompted by Google Earth. +OptionWizard.21=Update successful +OptionWizard.22=Slope +OptionWizard.23=There was an error when re-opening the Google Earth data +OptionWizard.24=Cancel +OptionWizard.25=Operation Mode +OptionWizard.26=DB host +OptionWizard.27=This is not a recognized Saiku Folder ( the start-saiku.bat file is not present) +OptionWizard.28=Saiku Server not recognized +OptionWizard.29=DB port +OptionWizard.2=Workflow (server/client) +OptionWizard.30=SQLite options +OptionWizard.31=Sample data +OptionWizard.32=Plot layout +OptionWizard.33=Survey Definition +OptionWizard.34=Integrated Services +OptionWizard.35=Number of control points +OptionWizard.36=Distance between control points (in meters) +OptionWizard.37=Margin with plot border (in meters) +OptionWizard.38=The CSV/CED file cannot be read correctly.
The file is expected to have a comma separated values like this \:
+OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect +OptionWizard.3=Server Instance +OptionWizard.40=Projects +OptionWizard.41=Load a new project file +OptionWizard.42=Error when closing the CSV reader +OptionWizard.43=Name of survey +OptionWizard.44=automatically back-up database at +OptionWizard.45=Open Earth Engine Playground ( deprecated ) +OptionWizard.46=Open Earth Engine Timelapse +OptionWizard.47=Open Bing Maps +OptionWizard.48=Open form on a browser instead of Google Earth (recommended for LINUX) +OptionWizard.49=Path to ced/csv file with plot data +OptionWizard.4=Current computer IP \: +OptionWizard.50=Browse... +OptionWizard.51=Error importing project file +OptionWizard.52=CSV/CED file with only coordinates +OptionWizard.53=No points +OptionWizard.54=Central point +OptionWizard.55=Error importing project folder +OptionWizard.56=Load project +OptionWizard.57=Previously loaded projects +OptionWizard.58=Open GEE Code Editor (requires Trusted Tester access) +OptionWizard.59=Open Here Maps focused on the plot +OptionWizard.5=Collect Earth Server port\: +OptionWizard.65=Path to Saiku folder +OptionWizard.66=Browse... +OptionWizard.67=Path to Firefox executable +OptionWizard.68=Browse... +OptionWizard.6=PostgreSQL DB parameters +OptionWizard.70=Executable files +OptionWizard.72=Binary files +OptionWizard.73=Path to Chrome executable +OptionWizard.74=Browse... +OptionWizard.76=Executable files +OptionWizard.78=Binary files +OptionWizard.79=Path to KML Freemarker template +OptionWizard.7=User Name +OptionWizard.80=Browse... +OptionWizard.82=Freemarker template +OptionWizard.83=Path to HTML Balloon form design +OptionWizard.84=Browse... +OptionWizard.86=HTML webpage +OptionWizard.87=Path to XML with IDM definition +OptionWizard.88=Browse... +OptionWizard.8=Password +OptionWizard.90=XML IDM definition +OptionWizard.91=Server (manager version or stand-alone use) +OptionWizard.92=Client (operator/connected to server) +OptionWizard.93=SQLite (Embedded/single file based) +OptionWizard.94=PostgreSQL +OptionWizard.95=Side of the sampling dots (in meters) +OptionWizard.9=DB Name +ProcessMonitorDialog.1=Parsing error on row number +ProcessMonitorDialog.4=, columns +ProcessMonitorDialog.5=\ -- values +SaikuAnalysisListener.0=Yes - Refresh Saiku data (long process) +SaikuAnalysisListener.1=No - Use same version of the data as last time Saiku was used +SaikuStarter.1=Starting Saiku +SaikuStarter.2=Starting Saiku can take some minutes, please wait\! +SaikuToolExportListener.1=Saiku Tool generation +SaikuToolExportListener.2=Generating Saiku Tool with current database +SaveEarthDataServlet.0=Empty request +SaveEarthDataServlet.1=Problem occurred while saving data to the database +SaveEarthDataServlet.2=The data was saved +SlopeCode.0=Flat (0-5) +YES=Yes +YES_TO_ALL=Yes to all + +GenerateDatabaseStarter.1=Preparing for analysis +GenerateDatabaseStarter.2=Generating Relational Database + +IPCCGeneratorListener.1=Waiting for process to complete\! +IPCCGeneratorListener.2=The IPCC GHGi compatible data is being generated +IPCCGeneratorListener.3=Refresh the data (update with latest from Collect Earth) +IPCCGeneratorListener.4=Use the latest generated database (fastest process - no update) +IPCCGeneratorListener.5=GHGi Database generation +IPCCGeneratorListener.6=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming but it is necessary if the Collect Earth data has been updated since the last time.
\ No newline at end of file From fb2f4df538dc1c1c35a50def2fd7a91d8f577a75 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 11:51:07 +0100 Subject: [PATCH 0007/1620] New translations Messages.properties (Portuguese) --- .../earth/app/view/Messages_pt.properties | 265 ++++++++++++++++++ 1 file changed, 265 insertions(+) create mode 100644 pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties new file mode 100644 index 0000000000..3ce9622fe0 --- /dev/null +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -0,0 +1,265 @@ +AboutDialog.19=A problem occurred +AboutDialog.5=For more information visit our website OpenForis.org +AboutDialog.6=Sorry, a problem occurred while trying to open this link in your system's standard browser. +AboutDialog.8=Ok +AspectCode.0=North +AspectCode.1=North-East +AspectCode.2=East +AspectCode.3=South-East +AspectCode.4=South +AspectCode.5=South-West +AspectCode.6=West +AspectCode.7=North-West +CollectEarthMenu.0=Import CEP file +CollectEarthMenu.2=Utilities +CollectEarthMenu.3=Divide large CSV plot files +CollectEarthMenu.4=Export data to XML (from specific date until present) +CollectEarthMenu.5=Export to Collect Backup +CollectEarthMenu.6=Export data as Collect Backup (all data) +CollectEarthMenu.7=Export data as Collect Backup (from date) +CollectEarthMenu.8=Export data to XML (using summary attribute) +CollectEarthWindow.0=Error when attempting to export data to CSV file +CollectEarthWindow.10=File +CollectEarthWindow.11=Exit +CollectEarthWindow.12=Tools +CollectEarthWindow.13=Download data to CSV (Excel) +CollectEarthWindow.14=Start SAIKU Analysis +CollectEarthWindow.15=Properties +CollectEarthWindow.16=Help +CollectEarthWindow.17=Disclaimer +CollectEarthWindow.18=Find missing plots in database +CollectEarthWindow.19=Collect Earth +CollectEarthWindow.1=Export error +CollectEarthWindow.20=Number of duplicated records\: +CollectEarthWindow.21=Could not find icon for main frame +CollectEarthWindow.22=Are you sure that you want to close Collect Earth?
Closing the window will also close the Collect Earth server +CollectEarthWindow.23=Confirmation needed +CollectEarthWindow.24=XML Export +CollectEarthWindow.25=Do you want to add these records anyway and lose your current data? +CollectEarthWindow.26=Operator +CollectEarthWindow.27=Update +CollectEarthWindow.28=Open Foris Collect Earth server should be running while the operator interprets data. +CollectEarthWindow.29=The Saiku Server is not configured. +CollectEarthWindow.2=Language +CollectEarthWindow.30=Please maintain this window open while you are using Google Earth. +CollectEarthWindow.31=Export collected data to CSV file +CollectEarthWindow.32=Quit +CollectEarthWindow.33=The operator name has to be longer than 5 characters and shorter than 50 +CollectEarthWindow.34=Validation error +CollectEarthWindow.35=OPERATOR NAME EMPTY\!
Please fill the operator name and press the "Update" button. +CollectEarthWindow.36=Operator name cannot be empty +CollectEarthWindow.37=Keep Open +CollectEarthWindow.38=CSV files +CollectEarthWindow.39=NOTICE\: It is advisable that you back-up your current data (Export to XML) before importing the new data +CollectEarthWindow.3=\ Import error +CollectEarthWindow.40=Set-up the path to the folder where Saiku Server is installed in the Tools->Properties->Advanced tab. +CollectEarthWindow.41=Saving exported data to file\: +CollectEarthWindow.42=Quit +CollectEarthWindow.43=Conflicting records found +CollectEarthWindow.44=Data Import/Export +CollectEarthWindow.45=Export data to XML (compressed) +CollectEarthWindow.46=Import new data from ZIP (compressed XML) +CollectEarthWindow.47=Saiku Server not configured +CollectEarthWindow.48=Zip/collect-data files +CollectEarthWindow.49=Fusion CSV files +CollectEarthWindow.4=FAO Disclaimer notices +CollectEarthWindow.50=Open User Manual +CollectEarthWindow.51=Check for updates of Collect Earth +CollectEarthWindow.52=Open Application Log File +CollectEarthWindow.53=Collect Earth Log file +CollectEarthWindow.54=Load points from KML +CollectEarthWindow.55=Update current records using CSV +CollectEarthWindow.56=About... +CollectEarthWindow.57=The Saiku starter process is still running, please wait. +CollectEarthWindow.58=Cannot start Saiku analysis +CollectEarthWindow.59=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming.
If you click on "YES" a new dataset with the latest information will be generated. +CollectEarthWindow.5=Close +CollectEarthWindow.60=Saiku data generation +CollectEarthWindow.61=Export data to XML (modified records since last export) +CollectEarthWindow.62=About... +CollectEarthWindow.63=Error getting the points from KML +CollectEarthWindow.64=Technical Support +CollectEarthWindow.65=The operator name has been changed +CollectEarthWindow.66=Operator name +CollectEarthWindow.67=Open data folder +CollectEarthWindow.6=Export to Fusion Table +CollectEarthWindow.70=Open the Survey Guide +CollectEarthWindow.71=Generate Stand-Alone Saiku tool +CollectEarthWindow.7=Error when importing data +CollectEarthWindow.8=Disclaimer text could not be found +CollectEarthWindow.9=The data imported contains records that are already present on your database. +DynamicsCode.0=Initially Forest +DynamicsCode.1=Initially Grassland +DynamicsCode.2=Initially Settlement +DynamicsCode.3=Initially Otherland +DynamicsCode.4=Initially Wetland +DynamicsCode.5=Initially Cropland +EarthApp.11=Collect Earth is already running +EarthApp.21=The file containing the grid of plots as a CSV/CED is not found in the selected path \:
+EarthApp.23=No CSV/CED file has been set-up \:

+EarthApp.24=The file containing the Freemarker template with the KML definition is not found in the selected path \:
+EarthApp.26=No KML definition file has been set-up \:

+EarthApp.27=The file containing the HTML balloon form is not found in the selected path \:
+EarthApp.29=No HTML balloon file has been set-up \:

+EarthApp.30=Please correct the file location in the Tools->Properties menu. +EarthApp.3=Remind me later +EarthApp.4=Update Now +EarthApp.57=There is a new version of Collect Earth available\!
How do you want to proceed? +EarthApp.58=Update alert +EarthApp.59=Error when importing project file +EarthApp.5=Do not remind me again +EarthApp.61=The Collect Earth file could not be open.
Please make sure that Google Earth is installed. +EarthApp.6=\ - Version +EarthApp.70=WARNING +EarthApp.71=In Mac OS X the Collect Earth project files (*.cep) will not open in Collect Earth when they are double-clicked.
+EarthApp.72=Use the Collect Earth toolbar to open the .cep files \: +EarthApp.73=Collect Earth issues in Mac OS X computers +EarthSurveyService.9=Field required +ExportActionListener.1=Pick Date to Export Records From +ExportDialogProcessMonitor.0=Processing data... +ExportDialogProcessMonitor.1=Waiting to initialize process \: +ExportDialogProcessMonitor.4=Exported records \: +ImportActionListener.0=Should the data for plots that have not been completely filled be imported? +ImportActionListener.2=If you click NO only the data from plots in the "green" state, containing all data, will be imported. +ImportActionListener.3=Import non-finished records +ImportDialogProcessMonitor.0=\ CALCULATING +ImportDialogProcessMonitor.11=Initial number of records \: +ImportDialogProcessMonitor.2=Importing records... +ImportDialogProcessMonitor.5=Actual number of imported records \: +ImportDialogProcessMonitor.8=Processing data... +ImportProcessMonitorDialog.0=Imported records \: +ImportXMLDialogProcessMonitor.1 = Overwrite data +ImportXMLDialogProcessMonitor.2 = Import only non-conflicting plots +InfiniteProgressMonitor.0=Cancel operation +JFileChooserExistsAware.0=Collect Earth Project file +KmlImportService.13=Select a CSV file to save the plot locations to +MissingPlotsListener.0=Error while getting information about plots not present on the Database +MissingPlotsListener.10=Total number of plots in the sampling design \: +MissingPlotsListener.12=Number of missing plots \: +MissingPlotsListener.14=All the plots are filled\! +MissingPlotsListener.1=Missing plots +MissingPlotsListener.2=Copy contents to clipboard +MissingPlotsListener.3=Pick the files that contain plot information ( .csv or .ced files ) for which you want to know if all data has been filled. +MissingPlotsListener.4=Missing plots - information +MissingPlotsListener.5=From file \: +MissingPlotsListener.6=Export to CED file +NO=No +NO_TO_ALL=No to all +OpenTextFileListener.0=The text file was not found at \: +OptionWizard.0=Collect Earth options +OptionWizard.100=Open Planet imagery +OptionWizard.101=Planet API key +OptionWizard.1021=URL SecureWatch +OptionWizard.102=Open Maxar SecureWatch +OptionWizard.103=Set URL for Extra Map (opens when set) \: +OptionWizard.104=Browsers +OptionWizard.105=Open Earth Map +OptionWizard.110=Use NICFI provided Monthly imagery +OptionWizard.10=Open backup folder +OptionWizard.11=Unknown\: use ifconfig +OptionWizard.12=Client Instance +OptionWizard.13=Collect Earth Server IP +OptionWizard.14=Collect Earth Server port (e.g. 8023) +OptionWizard.15=Save & Apply changes +OptionWizard.16=ID +OptionWizard.17=X-coord +OptionWizard.18=Y-coord +OptionWizard.19=Elevation +OptionWizard.1=Choose Browser +OptionWizard.20=The Google Earth contents have been changed.
Please accept the content reload when you are prompted by Google Earth. +OptionWizard.21=Update successful +OptionWizard.22=Slope +OptionWizard.23=There was an error when re-opening the Google Earth data +OptionWizard.24=Cancel +OptionWizard.25=Operation Mode +OptionWizard.26=DB host +OptionWizard.27=This is not a recognized Saiku Folder ( the start-saiku.bat file is not present) +OptionWizard.28=Saiku Server not recognized +OptionWizard.29=DB port +OptionWizard.2=Workflow (server/client) +OptionWizard.30=SQLite options +OptionWizard.31=Sample data +OptionWizard.32=Plot layout +OptionWizard.33=Survey Definition +OptionWizard.34=Integrated Services +OptionWizard.35=Number of control points +OptionWizard.36=Distance between control points (in meters) +OptionWizard.37=Margin with plot border (in meters) +OptionWizard.38=The CSV/CED file cannot be read correctly.
The file is expected to have a comma separated values like this \:
+OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect +OptionWizard.3=Server Instance +OptionWizard.40=Projects +OptionWizard.41=Load a new project file +OptionWizard.42=Error when closing the CSV reader +OptionWizard.43=Name of survey +OptionWizard.44=automatically back-up database at +OptionWizard.45=Open Earth Engine Playground ( deprecated ) +OptionWizard.46=Open Earth Engine Timelapse +OptionWizard.47=Open Bing Maps +OptionWizard.48=Open form on a browser instead of Google Earth (recommended for LINUX) +OptionWizard.49=Path to ced/csv file with plot data +OptionWizard.4=Current computer IP \: +OptionWizard.50=Browse... +OptionWizard.51=Error importing project file +OptionWizard.52=CSV/CED file with only coordinates +OptionWizard.53=No points +OptionWizard.54=Central point +OptionWizard.55=Error importing project folder +OptionWizard.56=Load project +OptionWizard.57=Previously loaded projects +OptionWizard.58=Open GEE Code Editor (requires Trusted Tester access) +OptionWizard.59=Open Here Maps focused on the plot +OptionWizard.5=Collect Earth Server port\: +OptionWizard.65=Path to Saiku folder +OptionWizard.66=Browse... +OptionWizard.67=Path to Firefox executable +OptionWizard.68=Browse... +OptionWizard.6=PostgreSQL DB parameters +OptionWizard.70=Executable files +OptionWizard.72=Binary files +OptionWizard.73=Path to Chrome executable +OptionWizard.74=Browse... +OptionWizard.76=Executable files +OptionWizard.78=Binary files +OptionWizard.79=Path to KML Freemarker template +OptionWizard.7=User Name +OptionWizard.80=Browse... +OptionWizard.82=Freemarker template +OptionWizard.83=Path to HTML Balloon form design +OptionWizard.84=Browse... +OptionWizard.86=HTML webpage +OptionWizard.87=Path to XML with IDM definition +OptionWizard.88=Browse... +OptionWizard.8=Password +OptionWizard.90=XML IDM definition +OptionWizard.91=Server (manager version or stand-alone use) +OptionWizard.92=Client (operator/connected to server) +OptionWizard.93=SQLite (Embedded/single file based) +OptionWizard.94=PostgreSQL +OptionWizard.95=Side of the sampling dots (in meters) +OptionWizard.9=DB Name +ProcessMonitorDialog.1=Parsing error on row number +ProcessMonitorDialog.4=, columns +ProcessMonitorDialog.5=\ -- values +SaikuAnalysisListener.0=Yes - Refresh Saiku data (long process) +SaikuAnalysisListener.1=No - Use same version of the data as last time Saiku was used +SaikuStarter.1=Starting Saiku +SaikuStarter.2=Starting Saiku can take some minutes, please wait\! +SaikuToolExportListener.1=Saiku Tool generation +SaikuToolExportListener.2=Generating Saiku Tool with current database +SaveEarthDataServlet.0=Empty request +SaveEarthDataServlet.1=Problem occurred while saving data to the database +SaveEarthDataServlet.2=The data was saved +SlopeCode.0=Flat (0-5) +YES=Yes +YES_TO_ALL=Yes to all + +GenerateDatabaseStarter.1=Preparing for analysis +GenerateDatabaseStarter.2=Generating Relational Database + +IPCCGeneratorListener.1=Waiting for process to complete\! +IPCCGeneratorListener.2=The IPCC GHGi compatible data is being generated +IPCCGeneratorListener.3=Refresh the data (update with latest from Collect Earth) +IPCCGeneratorListener.4=Use the latest generated database (fastest process - no update) +IPCCGeneratorListener.5=GHGi Database generation +IPCCGeneratorListener.6=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming but it is necessary if the Collect Earth data has been updated since the last time.
\ No newline at end of file From 4a9a7236bee27dc42b5ca484dba6d24c7c8a9cdd Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 11:51:08 +0100 Subject: [PATCH 0008/1620] New translations Messages.properties (English) --- .../earth/app/view/Messages_en.properties | 265 ++++++++++++++++++ 1 file changed, 265 insertions(+) create mode 100644 en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties new file mode 100644 index 0000000000..3ce9622fe0 --- /dev/null +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -0,0 +1,265 @@ +AboutDialog.19=A problem occurred +AboutDialog.5=For more information visit our website OpenForis.org +AboutDialog.6=Sorry, a problem occurred while trying to open this link in your system's standard browser. +AboutDialog.8=Ok +AspectCode.0=North +AspectCode.1=North-East +AspectCode.2=East +AspectCode.3=South-East +AspectCode.4=South +AspectCode.5=South-West +AspectCode.6=West +AspectCode.7=North-West +CollectEarthMenu.0=Import CEP file +CollectEarthMenu.2=Utilities +CollectEarthMenu.3=Divide large CSV plot files +CollectEarthMenu.4=Export data to XML (from specific date until present) +CollectEarthMenu.5=Export to Collect Backup +CollectEarthMenu.6=Export data as Collect Backup (all data) +CollectEarthMenu.7=Export data as Collect Backup (from date) +CollectEarthMenu.8=Export data to XML (using summary attribute) +CollectEarthWindow.0=Error when attempting to export data to CSV file +CollectEarthWindow.10=File +CollectEarthWindow.11=Exit +CollectEarthWindow.12=Tools +CollectEarthWindow.13=Download data to CSV (Excel) +CollectEarthWindow.14=Start SAIKU Analysis +CollectEarthWindow.15=Properties +CollectEarthWindow.16=Help +CollectEarthWindow.17=Disclaimer +CollectEarthWindow.18=Find missing plots in database +CollectEarthWindow.19=Collect Earth +CollectEarthWindow.1=Export error +CollectEarthWindow.20=Number of duplicated records\: +CollectEarthWindow.21=Could not find icon for main frame +CollectEarthWindow.22=Are you sure that you want to close Collect Earth?
Closing the window will also close the Collect Earth server +CollectEarthWindow.23=Confirmation needed +CollectEarthWindow.24=XML Export +CollectEarthWindow.25=Do you want to add these records anyway and lose your current data? +CollectEarthWindow.26=Operator +CollectEarthWindow.27=Update +CollectEarthWindow.28=Open Foris Collect Earth server should be running while the operator interprets data. +CollectEarthWindow.29=The Saiku Server is not configured. +CollectEarthWindow.2=Language +CollectEarthWindow.30=Please maintain this window open while you are using Google Earth. +CollectEarthWindow.31=Export collected data to CSV file +CollectEarthWindow.32=Quit +CollectEarthWindow.33=The operator name has to be longer than 5 characters and shorter than 50 +CollectEarthWindow.34=Validation error +CollectEarthWindow.35=OPERATOR NAME EMPTY\!
Please fill the operator name and press the "Update" button. +CollectEarthWindow.36=Operator name cannot be empty +CollectEarthWindow.37=Keep Open +CollectEarthWindow.38=CSV files +CollectEarthWindow.39=NOTICE\: It is advisable that you back-up your current data (Export to XML) before importing the new data +CollectEarthWindow.3=\ Import error +CollectEarthWindow.40=Set-up the path to the folder where Saiku Server is installed in the Tools->Properties->Advanced tab. +CollectEarthWindow.41=Saving exported data to file\: +CollectEarthWindow.42=Quit +CollectEarthWindow.43=Conflicting records found +CollectEarthWindow.44=Data Import/Export +CollectEarthWindow.45=Export data to XML (compressed) +CollectEarthWindow.46=Import new data from ZIP (compressed XML) +CollectEarthWindow.47=Saiku Server not configured +CollectEarthWindow.48=Zip/collect-data files +CollectEarthWindow.49=Fusion CSV files +CollectEarthWindow.4=FAO Disclaimer notices +CollectEarthWindow.50=Open User Manual +CollectEarthWindow.51=Check for updates of Collect Earth +CollectEarthWindow.52=Open Application Log File +CollectEarthWindow.53=Collect Earth Log file +CollectEarthWindow.54=Load points from KML +CollectEarthWindow.55=Update current records using CSV +CollectEarthWindow.56=About... +CollectEarthWindow.57=The Saiku starter process is still running, please wait. +CollectEarthWindow.58=Cannot start Saiku analysis +CollectEarthWindow.59=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming.
If you click on "YES" a new dataset with the latest information will be generated. +CollectEarthWindow.5=Close +CollectEarthWindow.60=Saiku data generation +CollectEarthWindow.61=Export data to XML (modified records since last export) +CollectEarthWindow.62=About... +CollectEarthWindow.63=Error getting the points from KML +CollectEarthWindow.64=Technical Support +CollectEarthWindow.65=The operator name has been changed +CollectEarthWindow.66=Operator name +CollectEarthWindow.67=Open data folder +CollectEarthWindow.6=Export to Fusion Table +CollectEarthWindow.70=Open the Survey Guide +CollectEarthWindow.71=Generate Stand-Alone Saiku tool +CollectEarthWindow.7=Error when importing data +CollectEarthWindow.8=Disclaimer text could not be found +CollectEarthWindow.9=The data imported contains records that are already present on your database. +DynamicsCode.0=Initially Forest +DynamicsCode.1=Initially Grassland +DynamicsCode.2=Initially Settlement +DynamicsCode.3=Initially Otherland +DynamicsCode.4=Initially Wetland +DynamicsCode.5=Initially Cropland +EarthApp.11=Collect Earth is already running +EarthApp.21=The file containing the grid of plots as a CSV/CED is not found in the selected path \:
+EarthApp.23=No CSV/CED file has been set-up \:

+EarthApp.24=The file containing the Freemarker template with the KML definition is not found in the selected path \:
+EarthApp.26=No KML definition file has been set-up \:

+EarthApp.27=The file containing the HTML balloon form is not found in the selected path \:
+EarthApp.29=No HTML balloon file has been set-up \:

+EarthApp.30=Please correct the file location in the Tools->Properties menu. +EarthApp.3=Remind me later +EarthApp.4=Update Now +EarthApp.57=There is a new version of Collect Earth available\!
How do you want to proceed? +EarthApp.58=Update alert +EarthApp.59=Error when importing project file +EarthApp.5=Do not remind me again +EarthApp.61=The Collect Earth file could not be open.
Please make sure that Google Earth is installed. +EarthApp.6=\ - Version +EarthApp.70=WARNING +EarthApp.71=In Mac OS X the Collect Earth project files (*.cep) will not open in Collect Earth when they are double-clicked.
+EarthApp.72=Use the Collect Earth toolbar to open the .cep files \: +EarthApp.73=Collect Earth issues in Mac OS X computers +EarthSurveyService.9=Field required +ExportActionListener.1=Pick Date to Export Records From +ExportDialogProcessMonitor.0=Processing data... +ExportDialogProcessMonitor.1=Waiting to initialize process \: +ExportDialogProcessMonitor.4=Exported records \: +ImportActionListener.0=Should the data for plots that have not been completely filled be imported? +ImportActionListener.2=If you click NO only the data from plots in the "green" state, containing all data, will be imported. +ImportActionListener.3=Import non-finished records +ImportDialogProcessMonitor.0=\ CALCULATING +ImportDialogProcessMonitor.11=Initial number of records \: +ImportDialogProcessMonitor.2=Importing records... +ImportDialogProcessMonitor.5=Actual number of imported records \: +ImportDialogProcessMonitor.8=Processing data... +ImportProcessMonitorDialog.0=Imported records \: +ImportXMLDialogProcessMonitor.1 = Overwrite data +ImportXMLDialogProcessMonitor.2 = Import only non-conflicting plots +InfiniteProgressMonitor.0=Cancel operation +JFileChooserExistsAware.0=Collect Earth Project file +KmlImportService.13=Select a CSV file to save the plot locations to +MissingPlotsListener.0=Error while getting information about plots not present on the Database +MissingPlotsListener.10=Total number of plots in the sampling design \: +MissingPlotsListener.12=Number of missing plots \: +MissingPlotsListener.14=All the plots are filled\! +MissingPlotsListener.1=Missing plots +MissingPlotsListener.2=Copy contents to clipboard +MissingPlotsListener.3=Pick the files that contain plot information ( .csv or .ced files ) for which you want to know if all data has been filled. +MissingPlotsListener.4=Missing plots - information +MissingPlotsListener.5=From file \: +MissingPlotsListener.6=Export to CED file +NO=No +NO_TO_ALL=No to all +OpenTextFileListener.0=The text file was not found at \: +OptionWizard.0=Collect Earth options +OptionWizard.100=Open Planet imagery +OptionWizard.101=Planet API key +OptionWizard.1021=URL SecureWatch +OptionWizard.102=Open Maxar SecureWatch +OptionWizard.103=Set URL for Extra Map (opens when set) \: +OptionWizard.104=Browsers +OptionWizard.105=Open Earth Map +OptionWizard.110=Use NICFI provided Monthly imagery +OptionWizard.10=Open backup folder +OptionWizard.11=Unknown\: use ifconfig +OptionWizard.12=Client Instance +OptionWizard.13=Collect Earth Server IP +OptionWizard.14=Collect Earth Server port (e.g. 8023) +OptionWizard.15=Save & Apply changes +OptionWizard.16=ID +OptionWizard.17=X-coord +OptionWizard.18=Y-coord +OptionWizard.19=Elevation +OptionWizard.1=Choose Browser +OptionWizard.20=The Google Earth contents have been changed.
Please accept the content reload when you are prompted by Google Earth. +OptionWizard.21=Update successful +OptionWizard.22=Slope +OptionWizard.23=There was an error when re-opening the Google Earth data +OptionWizard.24=Cancel +OptionWizard.25=Operation Mode +OptionWizard.26=DB host +OptionWizard.27=This is not a recognized Saiku Folder ( the start-saiku.bat file is not present) +OptionWizard.28=Saiku Server not recognized +OptionWizard.29=DB port +OptionWizard.2=Workflow (server/client) +OptionWizard.30=SQLite options +OptionWizard.31=Sample data +OptionWizard.32=Plot layout +OptionWizard.33=Survey Definition +OptionWizard.34=Integrated Services +OptionWizard.35=Number of control points +OptionWizard.36=Distance between control points (in meters) +OptionWizard.37=Margin with plot border (in meters) +OptionWizard.38=The CSV/CED file cannot be read correctly.
The file is expected to have a comma separated values like this \:
+OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect +OptionWizard.3=Server Instance +OptionWizard.40=Projects +OptionWizard.41=Load a new project file +OptionWizard.42=Error when closing the CSV reader +OptionWizard.43=Name of survey +OptionWizard.44=automatically back-up database at +OptionWizard.45=Open Earth Engine Playground ( deprecated ) +OptionWizard.46=Open Earth Engine Timelapse +OptionWizard.47=Open Bing Maps +OptionWizard.48=Open form on a browser instead of Google Earth (recommended for LINUX) +OptionWizard.49=Path to ced/csv file with plot data +OptionWizard.4=Current computer IP \: +OptionWizard.50=Browse... +OptionWizard.51=Error importing project file +OptionWizard.52=CSV/CED file with only coordinates +OptionWizard.53=No points +OptionWizard.54=Central point +OptionWizard.55=Error importing project folder +OptionWizard.56=Load project +OptionWizard.57=Previously loaded projects +OptionWizard.58=Open GEE Code Editor (requires Trusted Tester access) +OptionWizard.59=Open Here Maps focused on the plot +OptionWizard.5=Collect Earth Server port\: +OptionWizard.65=Path to Saiku folder +OptionWizard.66=Browse... +OptionWizard.67=Path to Firefox executable +OptionWizard.68=Browse... +OptionWizard.6=PostgreSQL DB parameters +OptionWizard.70=Executable files +OptionWizard.72=Binary files +OptionWizard.73=Path to Chrome executable +OptionWizard.74=Browse... +OptionWizard.76=Executable files +OptionWizard.78=Binary files +OptionWizard.79=Path to KML Freemarker template +OptionWizard.7=User Name +OptionWizard.80=Browse... +OptionWizard.82=Freemarker template +OptionWizard.83=Path to HTML Balloon form design +OptionWizard.84=Browse... +OptionWizard.86=HTML webpage +OptionWizard.87=Path to XML with IDM definition +OptionWizard.88=Browse... +OptionWizard.8=Password +OptionWizard.90=XML IDM definition +OptionWizard.91=Server (manager version or stand-alone use) +OptionWizard.92=Client (operator/connected to server) +OptionWizard.93=SQLite (Embedded/single file based) +OptionWizard.94=PostgreSQL +OptionWizard.95=Side of the sampling dots (in meters) +OptionWizard.9=DB Name +ProcessMonitorDialog.1=Parsing error on row number +ProcessMonitorDialog.4=, columns +ProcessMonitorDialog.5=\ -- values +SaikuAnalysisListener.0=Yes - Refresh Saiku data (long process) +SaikuAnalysisListener.1=No - Use same version of the data as last time Saiku was used +SaikuStarter.1=Starting Saiku +SaikuStarter.2=Starting Saiku can take some minutes, please wait\! +SaikuToolExportListener.1=Saiku Tool generation +SaikuToolExportListener.2=Generating Saiku Tool with current database +SaveEarthDataServlet.0=Empty request +SaveEarthDataServlet.1=Problem occurred while saving data to the database +SaveEarthDataServlet.2=The data was saved +SlopeCode.0=Flat (0-5) +YES=Yes +YES_TO_ALL=Yes to all + +GenerateDatabaseStarter.1=Preparing for analysis +GenerateDatabaseStarter.2=Generating Relational Database + +IPCCGeneratorListener.1=Waiting for process to complete\! +IPCCGeneratorListener.2=The IPCC GHGi compatible data is being generated +IPCCGeneratorListener.3=Refresh the data (update with latest from Collect Earth) +IPCCGeneratorListener.4=Use the latest generated database (fastest process - no update) +IPCCGeneratorListener.5=GHGi Database generation +IPCCGeneratorListener.6=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming but it is necessary if the Collect Earth data has been updated since the last time.
\ No newline at end of file From 6cd697e871c16856ef625034e029ef8615ed28f5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:21:33 +0100 Subject: [PATCH 0009/1620] New translations FixMissingPlotsFileInfo.java (Spanish) --- .../earth/app/view/Messages_es.properties | 445 +++++++----------- 1 file changed, 180 insertions(+), 265 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 3ce9622fe0..315f96ec2c 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,265 +1,180 @@ -AboutDialog.19=A problem occurred -AboutDialog.5=For more information visit our website OpenForis.org -AboutDialog.6=Sorry, a problem occurred while trying to open this link in your system's standard browser. -AboutDialog.8=Ok -AspectCode.0=North -AspectCode.1=North-East -AspectCode.2=East -AspectCode.3=South-East -AspectCode.4=South -AspectCode.5=South-West -AspectCode.6=West -AspectCode.7=North-West -CollectEarthMenu.0=Import CEP file -CollectEarthMenu.2=Utilities -CollectEarthMenu.3=Divide large CSV plot files -CollectEarthMenu.4=Export data to XML (from specific date until present) -CollectEarthMenu.5=Export to Collect Backup -CollectEarthMenu.6=Export data as Collect Backup (all data) -CollectEarthMenu.7=Export data as Collect Backup (from date) -CollectEarthMenu.8=Export data to XML (using summary attribute) -CollectEarthWindow.0=Error when attempting to export data to CSV file -CollectEarthWindow.10=File -CollectEarthWindow.11=Exit -CollectEarthWindow.12=Tools -CollectEarthWindow.13=Download data to CSV (Excel) -CollectEarthWindow.14=Start SAIKU Analysis -CollectEarthWindow.15=Properties -CollectEarthWindow.16=Help -CollectEarthWindow.17=Disclaimer -CollectEarthWindow.18=Find missing plots in database -CollectEarthWindow.19=Collect Earth -CollectEarthWindow.1=Export error -CollectEarthWindow.20=Number of duplicated records\: -CollectEarthWindow.21=Could not find icon for main frame -CollectEarthWindow.22=Are you sure that you want to close Collect Earth?
Closing the window will also close the Collect Earth server -CollectEarthWindow.23=Confirmation needed -CollectEarthWindow.24=XML Export -CollectEarthWindow.25=Do you want to add these records anyway and lose your current data? -CollectEarthWindow.26=Operator -CollectEarthWindow.27=Update -CollectEarthWindow.28=Open Foris Collect Earth server should be running while the operator interprets data. -CollectEarthWindow.29=The Saiku Server is not configured. -CollectEarthWindow.2=Language -CollectEarthWindow.30=Please maintain this window open while you are using Google Earth. -CollectEarthWindow.31=Export collected data to CSV file -CollectEarthWindow.32=Quit -CollectEarthWindow.33=The operator name has to be longer than 5 characters and shorter than 50 -CollectEarthWindow.34=Validation error -CollectEarthWindow.35=OPERATOR NAME EMPTY\!
Please fill the operator name and press the "Update" button. -CollectEarthWindow.36=Operator name cannot be empty -CollectEarthWindow.37=Keep Open -CollectEarthWindow.38=CSV files -CollectEarthWindow.39=NOTICE\: It is advisable that you back-up your current data (Export to XML) before importing the new data -CollectEarthWindow.3=\ Import error -CollectEarthWindow.40=Set-up the path to the folder where Saiku Server is installed in the Tools->Properties->Advanced tab. -CollectEarthWindow.41=Saving exported data to file\: -CollectEarthWindow.42=Quit -CollectEarthWindow.43=Conflicting records found -CollectEarthWindow.44=Data Import/Export -CollectEarthWindow.45=Export data to XML (compressed) -CollectEarthWindow.46=Import new data from ZIP (compressed XML) -CollectEarthWindow.47=Saiku Server not configured -CollectEarthWindow.48=Zip/collect-data files -CollectEarthWindow.49=Fusion CSV files -CollectEarthWindow.4=FAO Disclaimer notices -CollectEarthWindow.50=Open User Manual -CollectEarthWindow.51=Check for updates of Collect Earth -CollectEarthWindow.52=Open Application Log File -CollectEarthWindow.53=Collect Earth Log file -CollectEarthWindow.54=Load points from KML -CollectEarthWindow.55=Update current records using CSV -CollectEarthWindow.56=About... -CollectEarthWindow.57=The Saiku starter process is still running, please wait. -CollectEarthWindow.58=Cannot start Saiku analysis -CollectEarthWindow.59=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming.
If you click on "YES" a new dataset with the latest information will be generated. -CollectEarthWindow.5=Close -CollectEarthWindow.60=Saiku data generation -CollectEarthWindow.61=Export data to XML (modified records since last export) -CollectEarthWindow.62=About... -CollectEarthWindow.63=Error getting the points from KML -CollectEarthWindow.64=Technical Support -CollectEarthWindow.65=The operator name has been changed -CollectEarthWindow.66=Operator name -CollectEarthWindow.67=Open data folder -CollectEarthWindow.6=Export to Fusion Table -CollectEarthWindow.70=Open the Survey Guide -CollectEarthWindow.71=Generate Stand-Alone Saiku tool -CollectEarthWindow.7=Error when importing data -CollectEarthWindow.8=Disclaimer text could not be found -CollectEarthWindow.9=The data imported contains records that are already present on your database. -DynamicsCode.0=Initially Forest -DynamicsCode.1=Initially Grassland -DynamicsCode.2=Initially Settlement -DynamicsCode.3=Initially Otherland -DynamicsCode.4=Initially Wetland -DynamicsCode.5=Initially Cropland -EarthApp.11=Collect Earth is already running -EarthApp.21=The file containing the grid of plots as a CSV/CED is not found in the selected path \:
-EarthApp.23=No CSV/CED file has been set-up \:

-EarthApp.24=The file containing the Freemarker template with the KML definition is not found in the selected path \:
-EarthApp.26=No KML definition file has been set-up \:

-EarthApp.27=The file containing the HTML balloon form is not found in the selected path \:
-EarthApp.29=No HTML balloon file has been set-up \:

-EarthApp.30=Please correct the file location in the Tools->Properties menu. -EarthApp.3=Remind me later -EarthApp.4=Update Now -EarthApp.57=There is a new version of Collect Earth available\!
How do you want to proceed? -EarthApp.58=Update alert -EarthApp.59=Error when importing project file -EarthApp.5=Do not remind me again -EarthApp.61=The Collect Earth file could not be open.
Please make sure that Google Earth is installed. -EarthApp.6=\ - Version -EarthApp.70=WARNING -EarthApp.71=In Mac OS X the Collect Earth project files (*.cep) will not open in Collect Earth when they are double-clicked.
-EarthApp.72=Use the Collect Earth toolbar to open the .cep files \: -EarthApp.73=Collect Earth issues in Mac OS X computers -EarthSurveyService.9=Field required -ExportActionListener.1=Pick Date to Export Records From -ExportDialogProcessMonitor.0=Processing data... -ExportDialogProcessMonitor.1=Waiting to initialize process \: -ExportDialogProcessMonitor.4=Exported records \: -ImportActionListener.0=Should the data for plots that have not been completely filled be imported? -ImportActionListener.2=If you click NO only the data from plots in the "green" state, containing all data, will be imported. -ImportActionListener.3=Import non-finished records -ImportDialogProcessMonitor.0=\ CALCULATING -ImportDialogProcessMonitor.11=Initial number of records \: -ImportDialogProcessMonitor.2=Importing records... -ImportDialogProcessMonitor.5=Actual number of imported records \: -ImportDialogProcessMonitor.8=Processing data... -ImportProcessMonitorDialog.0=Imported records \: -ImportXMLDialogProcessMonitor.1 = Overwrite data -ImportXMLDialogProcessMonitor.2 = Import only non-conflicting plots -InfiniteProgressMonitor.0=Cancel operation -JFileChooserExistsAware.0=Collect Earth Project file -KmlImportService.13=Select a CSV file to save the plot locations to -MissingPlotsListener.0=Error while getting information about plots not present on the Database -MissingPlotsListener.10=Total number of plots in the sampling design \: -MissingPlotsListener.12=Number of missing plots \: -MissingPlotsListener.14=All the plots are filled\! -MissingPlotsListener.1=Missing plots -MissingPlotsListener.2=Copy contents to clipboard -MissingPlotsListener.3=Pick the files that contain plot information ( .csv or .ced files ) for which you want to know if all data has been filled. -MissingPlotsListener.4=Missing plots - information -MissingPlotsListener.5=From file \: -MissingPlotsListener.6=Export to CED file -NO=No -NO_TO_ALL=No to all -OpenTextFileListener.0=The text file was not found at \: -OptionWizard.0=Collect Earth options -OptionWizard.100=Open Planet imagery -OptionWizard.101=Planet API key -OptionWizard.1021=URL SecureWatch -OptionWizard.102=Open Maxar SecureWatch -OptionWizard.103=Set URL for Extra Map (opens when set) \: -OptionWizard.104=Browsers -OptionWizard.105=Open Earth Map -OptionWizard.110=Use NICFI provided Monthly imagery -OptionWizard.10=Open backup folder -OptionWizard.11=Unknown\: use ifconfig -OptionWizard.12=Client Instance -OptionWizard.13=Collect Earth Server IP -OptionWizard.14=Collect Earth Server port (e.g. 8023) -OptionWizard.15=Save & Apply changes -OptionWizard.16=ID -OptionWizard.17=X-coord -OptionWizard.18=Y-coord -OptionWizard.19=Elevation -OptionWizard.1=Choose Browser -OptionWizard.20=The Google Earth contents have been changed.
Please accept the content reload when you are prompted by Google Earth. -OptionWizard.21=Update successful -OptionWizard.22=Slope -OptionWizard.23=There was an error when re-opening the Google Earth data -OptionWizard.24=Cancel -OptionWizard.25=Operation Mode -OptionWizard.26=DB host -OptionWizard.27=This is not a recognized Saiku Folder ( the start-saiku.bat file is not present) -OptionWizard.28=Saiku Server not recognized -OptionWizard.29=DB port -OptionWizard.2=Workflow (server/client) -OptionWizard.30=SQLite options -OptionWizard.31=Sample data -OptionWizard.32=Plot layout -OptionWizard.33=Survey Definition -OptionWizard.34=Integrated Services -OptionWizard.35=Number of control points -OptionWizard.36=Distance between control points (in meters) -OptionWizard.37=Margin with plot border (in meters) -OptionWizard.38=The CSV/CED file cannot be read correctly.
The file is expected to have a comma separated values like this \:
-OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect -OptionWizard.3=Server Instance -OptionWizard.40=Projects -OptionWizard.41=Load a new project file -OptionWizard.42=Error when closing the CSV reader -OptionWizard.43=Name of survey -OptionWizard.44=automatically back-up database at -OptionWizard.45=Open Earth Engine Playground ( deprecated ) -OptionWizard.46=Open Earth Engine Timelapse -OptionWizard.47=Open Bing Maps -OptionWizard.48=Open form on a browser instead of Google Earth (recommended for LINUX) -OptionWizard.49=Path to ced/csv file with plot data -OptionWizard.4=Current computer IP \: -OptionWizard.50=Browse... -OptionWizard.51=Error importing project file -OptionWizard.52=CSV/CED file with only coordinates -OptionWizard.53=No points -OptionWizard.54=Central point -OptionWizard.55=Error importing project folder -OptionWizard.56=Load project -OptionWizard.57=Previously loaded projects -OptionWizard.58=Open GEE Code Editor (requires Trusted Tester access) -OptionWizard.59=Open Here Maps focused on the plot -OptionWizard.5=Collect Earth Server port\: -OptionWizard.65=Path to Saiku folder -OptionWizard.66=Browse... -OptionWizard.67=Path to Firefox executable -OptionWizard.68=Browse... -OptionWizard.6=PostgreSQL DB parameters -OptionWizard.70=Executable files -OptionWizard.72=Binary files -OptionWizard.73=Path to Chrome executable -OptionWizard.74=Browse... -OptionWizard.76=Executable files -OptionWizard.78=Binary files -OptionWizard.79=Path to KML Freemarker template -OptionWizard.7=User Name -OptionWizard.80=Browse... -OptionWizard.82=Freemarker template -OptionWizard.83=Path to HTML Balloon form design -OptionWizard.84=Browse... -OptionWizard.86=HTML webpage -OptionWizard.87=Path to XML with IDM definition -OptionWizard.88=Browse... -OptionWizard.8=Password -OptionWizard.90=XML IDM definition -OptionWizard.91=Server (manager version or stand-alone use) -OptionWizard.92=Client (operator/connected to server) -OptionWizard.93=SQLite (Embedded/single file based) -OptionWizard.94=PostgreSQL -OptionWizard.95=Side of the sampling dots (in meters) -OptionWizard.9=DB Name -ProcessMonitorDialog.1=Parsing error on row number -ProcessMonitorDialog.4=, columns -ProcessMonitorDialog.5=\ -- values -SaikuAnalysisListener.0=Yes - Refresh Saiku data (long process) -SaikuAnalysisListener.1=No - Use same version of the data as last time Saiku was used -SaikuStarter.1=Starting Saiku -SaikuStarter.2=Starting Saiku can take some minutes, please wait\! -SaikuToolExportListener.1=Saiku Tool generation -SaikuToolExportListener.2=Generating Saiku Tool with current database -SaveEarthDataServlet.0=Empty request -SaveEarthDataServlet.1=Problem occurred while saving data to the database -SaveEarthDataServlet.2=The data was saved -SlopeCode.0=Flat (0-5) -YES=Yes -YES_TO_ALL=Yes to all - -GenerateDatabaseStarter.1=Preparing for analysis -GenerateDatabaseStarter.2=Generating Relational Database - -IPCCGeneratorListener.1=Waiting for process to complete\! -IPCCGeneratorListener.2=The IPCC GHGi compatible data is being generated -IPCCGeneratorListener.3=Refresh the data (update with latest from Collect Earth) -IPCCGeneratorListener.4=Use the latest generated database (fastest process - no update) -IPCCGeneratorListener.5=GHGi Database generation -IPCCGeneratorListener.6=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming but it is necessary if the Collect Earth data has been updated since the last time.
\ No newline at end of file +package org.openforis.collect.earth.app.ad_hoc; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.swing.JFrame; + +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.view.DataFormat; +import org.openforis.collect.earth.app.view.JFileChooserExistsAware; +import org.openforis.collect.manager.RecordManager; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.CollectRecordSummary; +import org.openforis.collect.model.RecordFilter; +import org.openforis.collect.persistence.RecordPersistenceException; +import org.openforis.idm.model.TextAttribute; +import org.openforis.idm.model.TextValue; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.opencsv.CSVReader; +import com.opencsv.exceptions.CsvValidationException; + +@Component +public final class FixMissingPlotsFileInfo { + + @Autowired + private RecordManager recordManager; + + @Autowired + private EarthSurveyService earthSurveyService; + + @Autowired + private LocalPropertiesService localPropertiesService; + + private final Logger logger = LoggerFactory.getLogger(FixMissingPlotsFileInfo.class); + + private boolean stopFix = false; + + + + public void findMissingPlots(JFrame frame) { + final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, false, true, null, + localPropertiesService, frame); + + final Map> plotIdsByFile = getPlotIdsByFile(selectedPlotFiles); + + List plotIdsWithNoRegion = getPlotsNoRegion(); + + for (CollectRecord record : plotIdsWithNoRegion) { + String plotFile = getFileNameForId( plotIdsByFile, record ); + if( plotFile != null ){ + setPlotFile( record, plotFile ); + }else{ + logger.info("No plot file found for plot with ID : " + getPlotId(record) ); //$NON-NLS-1$ + try { + recordManager.delete( record.getId() ); + } catch (RecordPersistenceException e) { + logger.error("Not able to remove plot with ID " + record.getId(), e ) ; //$NON-NLS-1$ + } + } + } + } + + private String getPlotId(CollectRecord record) { + TextAttribute plot_id = (TextAttribute) record.getNodeByPath("/plot/id"); //$NON-NLS-1$ + return plot_id.getValue().getValue(); + } + + private List getAllRecords(){ + RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); + List records = recordManager.loadSummaries( rf ); + return records; + } + + private void setPlotFile(CollectRecord record, String plotFile) { + + TextValue textValue = new TextValue( plotFile ); + recordManager.addAttribute(record.getRootEntity(), "plot_file", textValue, null, null); //$NON-NLS-1$ + + recordManager.save( record ); + logger.info("Setting record to plot_file : " + plotFile ); //$NON-NLS-1$ + + } + + private String getFileNameForId(Map> plotIdsByFile, CollectRecord record) { + + Set fileNames = plotIdsByFile.keySet(); + String plotId = getPlotId(record); + for (String filename : fileNames) { + + List plotIds = plotIdsByFile.get(filename); + for (String plotIdInFile : plotIds) { + if( plotIdInFile.equals(plotId)){ + return filename; + } + } + } + return null; + } + + private List getPlotsNoRegion() { + List plotsWithNoRegionInfo = new ArrayList(); + List allRecords = getAllRecords(); + for (CollectRecordSummary summary : allRecords) { + CollectRecord record = recordManager.load( earthSurveyService.getCollectSurvey(), summary.getId(), Step.ENTRY); + TextAttribute plot_file = (TextAttribute) record.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ + if( plot_file ==null || plot_file.getValue() == null || plot_file.getValue().getValue() == null ){ + plotsWithNoRegionInfo.add( record ); + } + } + return plotsWithNoRegionInfo; + } + + private CSVReader getCsvReader(String csvFile) throws FileNotFoundException { + CSVReader reader; + final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 )); //$NON-NLS-1$ + reader = new CSVReader(bufferedReader); + return reader; + } + + private List getIdsInFile(String plotCoordinateFile) { + final List plotIds = new ArrayList(); + try { + final CSVReader plotCsvReader = getCsvReader(plotCoordinateFile); + String[] csvRow; + while ((csvRow = plotCsvReader.readNext()) != null) { + plotIds.add(csvRow[0]); + } + } catch (final FileNotFoundException e) { + logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ + } catch (final IOException e) { + logger.error("Error reading CSV line", e); //$NON-NLS-1$ + } catch (CsvValidationException e) { + logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ + } + + return plotIds; + } + + + private Map> getPlotIdsByFile(File[] selectedPlotFiles) { + final Map> plotIdsByFile = new HashMap>(); + + for (final File file : selectedPlotFiles) { + if (shouldStopFixing()) { + break; + } + plotIdsByFile.put(file.getName(), getIdsInFile(file.getAbsolutePath())); + } + + return plotIdsByFile; + } + + + + private boolean shouldStopFixing() { + return stopFix; + } + + public void stopFixing() { + stopFix = true; + + } +} From 8c5084e68e0745e04713dbbe49c741e45d3de761 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:21:34 +0100 Subject: [PATCH 0010/1620] New translations FixCoordinatesPNG.java (French) --- .../earth/app/view/Messages_fr.properties | 274 +----------------- 1 file changed, 11 insertions(+), 263 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 3ce9622fe0..8612606a4d 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,265 +1,13 @@ -AboutDialog.19=A problem occurred -AboutDialog.5=For more information visit our website OpenForis.org -AboutDialog.6=Sorry, a problem occurred while trying to open this link in your system's standard browser. -AboutDialog.8=Ok -AspectCode.0=North -AspectCode.1=North-East -AspectCode.2=East -AspectCode.3=South-East -AspectCode.4=South -AspectCode.5=South-West -AspectCode.6=West -AspectCode.7=North-West -CollectEarthMenu.0=Import CEP file -CollectEarthMenu.2=Utilities -CollectEarthMenu.3=Divide large CSV plot files -CollectEarthMenu.4=Export data to XML (from specific date until present) -CollectEarthMenu.5=Export to Collect Backup -CollectEarthMenu.6=Export data as Collect Backup (all data) -CollectEarthMenu.7=Export data as Collect Backup (from date) -CollectEarthMenu.8=Export data to XML (using summary attribute) -CollectEarthWindow.0=Error when attempting to export data to CSV file -CollectEarthWindow.10=File -CollectEarthWindow.11=Exit -CollectEarthWindow.12=Tools -CollectEarthWindow.13=Download data to CSV (Excel) -CollectEarthWindow.14=Start SAIKU Analysis -CollectEarthWindow.15=Properties -CollectEarthWindow.16=Help -CollectEarthWindow.17=Disclaimer -CollectEarthWindow.18=Find missing plots in database -CollectEarthWindow.19=Collect Earth -CollectEarthWindow.1=Export error -CollectEarthWindow.20=Number of duplicated records\: -CollectEarthWindow.21=Could not find icon for main frame -CollectEarthWindow.22=Are you sure that you want to close Collect Earth?
Closing the window will also close the Collect Earth server -CollectEarthWindow.23=Confirmation needed -CollectEarthWindow.24=XML Export -CollectEarthWindow.25=Do you want to add these records anyway and lose your current data? -CollectEarthWindow.26=Operator -CollectEarthWindow.27=Update -CollectEarthWindow.28=Open Foris Collect Earth server should be running while the operator interprets data. -CollectEarthWindow.29=The Saiku Server is not configured. -CollectEarthWindow.2=Language -CollectEarthWindow.30=Please maintain this window open while you are using Google Earth. -CollectEarthWindow.31=Export collected data to CSV file -CollectEarthWindow.32=Quit -CollectEarthWindow.33=The operator name has to be longer than 5 characters and shorter than 50 -CollectEarthWindow.34=Validation error -CollectEarthWindow.35=OPERATOR NAME EMPTY\!
Please fill the operator name and press the "Update" button. -CollectEarthWindow.36=Operator name cannot be empty -CollectEarthWindow.37=Keep Open -CollectEarthWindow.38=CSV files -CollectEarthWindow.39=NOTICE\: It is advisable that you back-up your current data (Export to XML) before importing the new data -CollectEarthWindow.3=\ Import error -CollectEarthWindow.40=Set-up the path to the folder where Saiku Server is installed in the Tools->Properties->Advanced tab. -CollectEarthWindow.41=Saving exported data to file\: -CollectEarthWindow.42=Quit -CollectEarthWindow.43=Conflicting records found -CollectEarthWindow.44=Data Import/Export -CollectEarthWindow.45=Export data to XML (compressed) -CollectEarthWindow.46=Import new data from ZIP (compressed XML) -CollectEarthWindow.47=Saiku Server not configured -CollectEarthWindow.48=Zip/collect-data files -CollectEarthWindow.49=Fusion CSV files -CollectEarthWindow.4=FAO Disclaimer notices -CollectEarthWindow.50=Open User Manual -CollectEarthWindow.51=Check for updates of Collect Earth -CollectEarthWindow.52=Open Application Log File -CollectEarthWindow.53=Collect Earth Log file -CollectEarthWindow.54=Load points from KML -CollectEarthWindow.55=Update current records using CSV -CollectEarthWindow.56=About... -CollectEarthWindow.57=The Saiku starter process is still running, please wait. -CollectEarthWindow.58=Cannot start Saiku analysis -CollectEarthWindow.59=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming.
If you click on "YES" a new dataset with the latest information will be generated. -CollectEarthWindow.5=Close -CollectEarthWindow.60=Saiku data generation -CollectEarthWindow.61=Export data to XML (modified records since last export) -CollectEarthWindow.62=About... -CollectEarthWindow.63=Error getting the points from KML -CollectEarthWindow.64=Technical Support -CollectEarthWindow.65=The operator name has been changed -CollectEarthWindow.66=Operator name -CollectEarthWindow.67=Open data folder -CollectEarthWindow.6=Export to Fusion Table -CollectEarthWindow.70=Open the Survey Guide -CollectEarthWindow.71=Generate Stand-Alone Saiku tool -CollectEarthWindow.7=Error when importing data -CollectEarthWindow.8=Disclaimer text could not be found -CollectEarthWindow.9=The data imported contains records that are already present on your database. -DynamicsCode.0=Initially Forest -DynamicsCode.1=Initially Grassland -DynamicsCode.2=Initially Settlement -DynamicsCode.3=Initially Otherland -DynamicsCode.4=Initially Wetland -DynamicsCode.5=Initially Cropland -EarthApp.11=Collect Earth is already running -EarthApp.21=The file containing the grid of plots as a CSV/CED is not found in the selected path \:
-EarthApp.23=No CSV/CED file has been set-up \:

-EarthApp.24=The file containing the Freemarker template with the KML definition is not found in the selected path \:
-EarthApp.26=No KML definition file has been set-up \:

-EarthApp.27=The file containing the HTML balloon form is not found in the selected path \:
-EarthApp.29=No HTML balloon file has been set-up \:

-EarthApp.30=Please correct the file location in the Tools->Properties menu. -EarthApp.3=Remind me later -EarthApp.4=Update Now -EarthApp.57=There is a new version of Collect Earth available\!
How do you want to proceed? -EarthApp.58=Update alert -EarthApp.59=Error when importing project file -EarthApp.5=Do not remind me again -EarthApp.61=The Collect Earth file could not be open.
Please make sure that Google Earth is installed. -EarthApp.6=\ - Version -EarthApp.70=WARNING -EarthApp.71=In Mac OS X the Collect Earth project files (*.cep) will not open in Collect Earth when they are double-clicked.
-EarthApp.72=Use the Collect Earth toolbar to open the .cep files \: -EarthApp.73=Collect Earth issues in Mac OS X computers -EarthSurveyService.9=Field required -ExportActionListener.1=Pick Date to Export Records From -ExportDialogProcessMonitor.0=Processing data... -ExportDialogProcessMonitor.1=Waiting to initialize process \: -ExportDialogProcessMonitor.4=Exported records \: -ImportActionListener.0=Should the data for plots that have not been completely filled be imported? -ImportActionListener.2=If you click NO only the data from plots in the "green" state, containing all data, will be imported. -ImportActionListener.3=Import non-finished records -ImportDialogProcessMonitor.0=\ CALCULATING -ImportDialogProcessMonitor.11=Initial number of records \: -ImportDialogProcessMonitor.2=Importing records... -ImportDialogProcessMonitor.5=Actual number of imported records \: -ImportDialogProcessMonitor.8=Processing data... -ImportProcessMonitorDialog.0=Imported records \: -ImportXMLDialogProcessMonitor.1 = Overwrite data -ImportXMLDialogProcessMonitor.2 = Import only non-conflicting plots -InfiniteProgressMonitor.0=Cancel operation -JFileChooserExistsAware.0=Collect Earth Project file -KmlImportService.13=Select a CSV file to save the plot locations to -MissingPlotsListener.0=Error while getting information about plots not present on the Database -MissingPlotsListener.10=Total number of plots in the sampling design \: -MissingPlotsListener.12=Number of missing plots \: -MissingPlotsListener.14=All the plots are filled\! -MissingPlotsListener.1=Missing plots -MissingPlotsListener.2=Copy contents to clipboard -MissingPlotsListener.3=Pick the files that contain plot information ( .csv or .ced files ) for which you want to know if all data has been filled. -MissingPlotsListener.4=Missing plots - information -MissingPlotsListener.5=From file \: -MissingPlotsListener.6=Export to CED file -NO=No -NO_TO_ALL=No to all -OpenTextFileListener.0=The text file was not found at \: -OptionWizard.0=Collect Earth options -OptionWizard.100=Open Planet imagery -OptionWizard.101=Planet API key -OptionWizard.1021=URL SecureWatch -OptionWizard.102=Open Maxar SecureWatch -OptionWizard.103=Set URL for Extra Map (opens when set) \: -OptionWizard.104=Browsers -OptionWizard.105=Open Earth Map -OptionWizard.110=Use NICFI provided Monthly imagery -OptionWizard.10=Open backup folder -OptionWizard.11=Unknown\: use ifconfig -OptionWizard.12=Client Instance -OptionWizard.13=Collect Earth Server IP -OptionWizard.14=Collect Earth Server port (e.g. 8023) -OptionWizard.15=Save & Apply changes -OptionWizard.16=ID -OptionWizard.17=X-coord -OptionWizard.18=Y-coord -OptionWizard.19=Elevation -OptionWizard.1=Choose Browser -OptionWizard.20=The Google Earth contents have been changed.
Please accept the content reload when you are prompted by Google Earth. -OptionWizard.21=Update successful -OptionWizard.22=Slope -OptionWizard.23=There was an error when re-opening the Google Earth data -OptionWizard.24=Cancel -OptionWizard.25=Operation Mode -OptionWizard.26=DB host -OptionWizard.27=This is not a recognized Saiku Folder ( the start-saiku.bat file is not present) -OptionWizard.28=Saiku Server not recognized -OptionWizard.29=DB port -OptionWizard.2=Workflow (server/client) -OptionWizard.30=SQLite options -OptionWizard.31=Sample data -OptionWizard.32=Plot layout -OptionWizard.33=Survey Definition -OptionWizard.34=Integrated Services -OptionWizard.35=Number of control points -OptionWizard.36=Distance between control points (in meters) -OptionWizard.37=Margin with plot border (in meters) -OptionWizard.38=The CSV/CED file cannot be read correctly.
The file is expected to have a comma separated values like this \:
-OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect -OptionWizard.3=Server Instance -OptionWizard.40=Projects -OptionWizard.41=Load a new project file -OptionWizard.42=Error when closing the CSV reader -OptionWizard.43=Name of survey -OptionWizard.44=automatically back-up database at -OptionWizard.45=Open Earth Engine Playground ( deprecated ) -OptionWizard.46=Open Earth Engine Timelapse -OptionWizard.47=Open Bing Maps -OptionWizard.48=Open form on a browser instead of Google Earth (recommended for LINUX) -OptionWizard.49=Path to ced/csv file with plot data -OptionWizard.4=Current computer IP \: -OptionWizard.50=Browse... -OptionWizard.51=Error importing project file -OptionWizard.52=CSV/CED file with only coordinates -OptionWizard.53=No points -OptionWizard.54=Central point -OptionWizard.55=Error importing project folder -OptionWizard.56=Load project -OptionWizard.57=Previously loaded projects -OptionWizard.58=Open GEE Code Editor (requires Trusted Tester access) -OptionWizard.59=Open Here Maps focused on the plot -OptionWizard.5=Collect Earth Server port\: -OptionWizard.65=Path to Saiku folder -OptionWizard.66=Browse... -OptionWizard.67=Path to Firefox executable -OptionWizard.68=Browse... -OptionWizard.6=PostgreSQL DB parameters -OptionWizard.70=Executable files -OptionWizard.72=Binary files -OptionWizard.73=Path to Chrome executable -OptionWizard.74=Browse... -OptionWizard.76=Executable files -OptionWizard.78=Binary files -OptionWizard.79=Path to KML Freemarker template -OptionWizard.7=User Name -OptionWizard.80=Browse... -OptionWizard.82=Freemarker template -OptionWizard.83=Path to HTML Balloon form design -OptionWizard.84=Browse... -OptionWizard.86=HTML webpage -OptionWizard.87=Path to XML with IDM definition -OptionWizard.88=Browse... -OptionWizard.8=Password -OptionWizard.90=XML IDM definition -OptionWizard.91=Server (manager version or stand-alone use) -OptionWizard.92=Client (operator/connected to server) -OptionWizard.93=SQLite (Embedded/single file based) -OptionWizard.94=PostgreSQL -OptionWizard.95=Side of the sampling dots (in meters) -OptionWizard.9=DB Name -ProcessMonitorDialog.1=Parsing error on row number -ProcessMonitorDialog.4=, columns -ProcessMonitorDialog.5=\ -- values -SaikuAnalysisListener.0=Yes - Refresh Saiku data (long process) -SaikuAnalysisListener.1=No - Use same version of the data as last time Saiku was used -SaikuStarter.1=Starting Saiku -SaikuStarter.2=Starting Saiku can take some minutes, please wait\! -SaikuToolExportListener.1=Saiku Tool generation -SaikuToolExportListener.2=Generating Saiku Tool with current database -SaveEarthDataServlet.0=Empty request -SaveEarthDataServlet.1=Problem occurred while saving data to the database -SaveEarthDataServlet.2=The data was saved -SlopeCode.0=Flat (0-5) -YES=Yes -YES_TO_ALL=Yes to all +package org.openforis.collect.earth.app.ad_hoc; -GenerateDatabaseStarter.1=Preparing for analysis -GenerateDatabaseStarter.2=Generating Relational Database +import org.springframework.stereotype.Component; -IPCCGeneratorListener.1=Waiting for process to complete\! -IPCCGeneratorListener.2=The IPCC GHGi compatible data is being generated -IPCCGeneratorListener.3=Refresh the data (update with latest from Collect Earth) -IPCCGeneratorListener.4=Use the latest generated database (fastest process - no update) -IPCCGeneratorListener.5=GHGi Database generation -IPCCGeneratorListener.6=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming but it is necessary if the Collect Earth data has been updated since the last time.
\ No newline at end of file +@Component +public class FixCoordinatesPNG extends FixCoordinates { + + @Override + protected int getLongitudeLimit() { + return 5; + } + +} From d0bba5ead54c77d0ffaadaef90d9736d4a1280e2 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:21:35 +0100 Subject: [PATCH 0011/1620] New translations FixCoordinatesPNG.java (Spanish) --- .../earth/app/view/Messages_es.properties | 175 +----------------- 1 file changed, 4 insertions(+), 171 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 315f96ec2c..8612606a4d 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,180 +1,13 @@ package org.openforis.collect.earth.app.ad_hoc; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.swing.JFrame; - -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.view.DataFormat; -import org.openforis.collect.earth.app.view.JFileChooserExistsAware; -import org.openforis.collect.manager.RecordManager; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.CollectRecordSummary; -import org.openforis.collect.model.RecordFilter; -import org.openforis.collect.persistence.RecordPersistenceException; -import org.openforis.idm.model.TextAttribute; -import org.openforis.idm.model.TextValue; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.opencsv.CSVReader; -import com.opencsv.exceptions.CsvValidationException; - @Component -public final class FixMissingPlotsFileInfo { - - @Autowired - private RecordManager recordManager; - - @Autowired - private EarthSurveyService earthSurveyService; - - @Autowired - private LocalPropertiesService localPropertiesService; - - private final Logger logger = LoggerFactory.getLogger(FixMissingPlotsFileInfo.class); - - private boolean stopFix = false; - - - - public void findMissingPlots(JFrame frame) { - final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, false, true, null, - localPropertiesService, frame); - - final Map> plotIdsByFile = getPlotIdsByFile(selectedPlotFiles); - - List plotIdsWithNoRegion = getPlotsNoRegion(); - - for (CollectRecord record : plotIdsWithNoRegion) { - String plotFile = getFileNameForId( plotIdsByFile, record ); - if( plotFile != null ){ - setPlotFile( record, plotFile ); - }else{ - logger.info("No plot file found for plot with ID : " + getPlotId(record) ); //$NON-NLS-1$ - try { - recordManager.delete( record.getId() ); - } catch (RecordPersistenceException e) { - logger.error("Not able to remove plot with ID " + record.getId(), e ) ; //$NON-NLS-1$ - } - } - } - } - - private String getPlotId(CollectRecord record) { - TextAttribute plot_id = (TextAttribute) record.getNodeByPath("/plot/id"); //$NON-NLS-1$ - return plot_id.getValue().getValue(); - } - - private List getAllRecords(){ - RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); - List records = recordManager.loadSummaries( rf ); - return records; - } - - private void setPlotFile(CollectRecord record, String plotFile) { - - TextValue textValue = new TextValue( plotFile ); - recordManager.addAttribute(record.getRootEntity(), "plot_file", textValue, null, null); //$NON-NLS-1$ - - recordManager.save( record ); - logger.info("Setting record to plot_file : " + plotFile ); //$NON-NLS-1$ +public class FixCoordinatesPNG extends FixCoordinates { + @Override + protected int getLongitudeLimit() { + return 5; } - private String getFileNameForId(Map> plotIdsByFile, CollectRecord record) { - - Set fileNames = plotIdsByFile.keySet(); - String plotId = getPlotId(record); - for (String filename : fileNames) { - - List plotIds = plotIdsByFile.get(filename); - for (String plotIdInFile : plotIds) { - if( plotIdInFile.equals(plotId)){ - return filename; - } - } - } - return null; - } - - private List getPlotsNoRegion() { - List plotsWithNoRegionInfo = new ArrayList(); - List allRecords = getAllRecords(); - for (CollectRecordSummary summary : allRecords) { - CollectRecord record = recordManager.load( earthSurveyService.getCollectSurvey(), summary.getId(), Step.ENTRY); - TextAttribute plot_file = (TextAttribute) record.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ - if( plot_file ==null || plot_file.getValue() == null || plot_file.getValue().getValue() == null ){ - plotsWithNoRegionInfo.add( record ); - } - } - return plotsWithNoRegionInfo; - } - - private CSVReader getCsvReader(String csvFile) throws FileNotFoundException { - CSVReader reader; - final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 )); //$NON-NLS-1$ - reader = new CSVReader(bufferedReader); - return reader; - } - - private List getIdsInFile(String plotCoordinateFile) { - final List plotIds = new ArrayList(); - try { - final CSVReader plotCsvReader = getCsvReader(plotCoordinateFile); - String[] csvRow; - while ((csvRow = plotCsvReader.readNext()) != null) { - plotIds.add(csvRow[0]); - } - } catch (final FileNotFoundException e) { - logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ - } catch (final IOException e) { - logger.error("Error reading CSV line", e); //$NON-NLS-1$ - } catch (CsvValidationException e) { - logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ - } - - return plotIds; - } - - - private Map> getPlotIdsByFile(File[] selectedPlotFiles) { - final Map> plotIdsByFile = new HashMap>(); - - for (final File file : selectedPlotFiles) { - if (shouldStopFixing()) { - break; - } - plotIdsByFile.put(file.getName(), getIdsInFile(file.getAbsolutePath())); - } - - return plotIdsByFile; - } - - - - private boolean shouldStopFixing() { - return stopFix; - } - - public void stopFixing() { - stopFix = true; - - } } From a11fb2384a77a824d77e5ee5560a423a575fa036 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:21:36 +0100 Subject: [PATCH 0012/1620] New translations FixCoordinatesPNG.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 274 +----------------- 1 file changed, 11 insertions(+), 263 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 3ce9622fe0..8612606a4d 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,265 +1,13 @@ -AboutDialog.19=A problem occurred -AboutDialog.5=For more information visit our website OpenForis.org -AboutDialog.6=Sorry, a problem occurred while trying to open this link in your system's standard browser. -AboutDialog.8=Ok -AspectCode.0=North -AspectCode.1=North-East -AspectCode.2=East -AspectCode.3=South-East -AspectCode.4=South -AspectCode.5=South-West -AspectCode.6=West -AspectCode.7=North-West -CollectEarthMenu.0=Import CEP file -CollectEarthMenu.2=Utilities -CollectEarthMenu.3=Divide large CSV plot files -CollectEarthMenu.4=Export data to XML (from specific date until present) -CollectEarthMenu.5=Export to Collect Backup -CollectEarthMenu.6=Export data as Collect Backup (all data) -CollectEarthMenu.7=Export data as Collect Backup (from date) -CollectEarthMenu.8=Export data to XML (using summary attribute) -CollectEarthWindow.0=Error when attempting to export data to CSV file -CollectEarthWindow.10=File -CollectEarthWindow.11=Exit -CollectEarthWindow.12=Tools -CollectEarthWindow.13=Download data to CSV (Excel) -CollectEarthWindow.14=Start SAIKU Analysis -CollectEarthWindow.15=Properties -CollectEarthWindow.16=Help -CollectEarthWindow.17=Disclaimer -CollectEarthWindow.18=Find missing plots in database -CollectEarthWindow.19=Collect Earth -CollectEarthWindow.1=Export error -CollectEarthWindow.20=Number of duplicated records\: -CollectEarthWindow.21=Could not find icon for main frame -CollectEarthWindow.22=Are you sure that you want to close Collect Earth?
Closing the window will also close the Collect Earth server -CollectEarthWindow.23=Confirmation needed -CollectEarthWindow.24=XML Export -CollectEarthWindow.25=Do you want to add these records anyway and lose your current data? -CollectEarthWindow.26=Operator -CollectEarthWindow.27=Update -CollectEarthWindow.28=Open Foris Collect Earth server should be running while the operator interprets data. -CollectEarthWindow.29=The Saiku Server is not configured. -CollectEarthWindow.2=Language -CollectEarthWindow.30=Please maintain this window open while you are using Google Earth. -CollectEarthWindow.31=Export collected data to CSV file -CollectEarthWindow.32=Quit -CollectEarthWindow.33=The operator name has to be longer than 5 characters and shorter than 50 -CollectEarthWindow.34=Validation error -CollectEarthWindow.35=OPERATOR NAME EMPTY\!
Please fill the operator name and press the "Update" button. -CollectEarthWindow.36=Operator name cannot be empty -CollectEarthWindow.37=Keep Open -CollectEarthWindow.38=CSV files -CollectEarthWindow.39=NOTICE\: It is advisable that you back-up your current data (Export to XML) before importing the new data -CollectEarthWindow.3=\ Import error -CollectEarthWindow.40=Set-up the path to the folder where Saiku Server is installed in the Tools->Properties->Advanced tab. -CollectEarthWindow.41=Saving exported data to file\: -CollectEarthWindow.42=Quit -CollectEarthWindow.43=Conflicting records found -CollectEarthWindow.44=Data Import/Export -CollectEarthWindow.45=Export data to XML (compressed) -CollectEarthWindow.46=Import new data from ZIP (compressed XML) -CollectEarthWindow.47=Saiku Server not configured -CollectEarthWindow.48=Zip/collect-data files -CollectEarthWindow.49=Fusion CSV files -CollectEarthWindow.4=FAO Disclaimer notices -CollectEarthWindow.50=Open User Manual -CollectEarthWindow.51=Check for updates of Collect Earth -CollectEarthWindow.52=Open Application Log File -CollectEarthWindow.53=Collect Earth Log file -CollectEarthWindow.54=Load points from KML -CollectEarthWindow.55=Update current records using CSV -CollectEarthWindow.56=About... -CollectEarthWindow.57=The Saiku starter process is still running, please wait. -CollectEarthWindow.58=Cannot start Saiku analysis -CollectEarthWindow.59=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming.
If you click on "YES" a new dataset with the latest information will be generated. -CollectEarthWindow.5=Close -CollectEarthWindow.60=Saiku data generation -CollectEarthWindow.61=Export data to XML (modified records since last export) -CollectEarthWindow.62=About... -CollectEarthWindow.63=Error getting the points from KML -CollectEarthWindow.64=Technical Support -CollectEarthWindow.65=The operator name has been changed -CollectEarthWindow.66=Operator name -CollectEarthWindow.67=Open data folder -CollectEarthWindow.6=Export to Fusion Table -CollectEarthWindow.70=Open the Survey Guide -CollectEarthWindow.71=Generate Stand-Alone Saiku tool -CollectEarthWindow.7=Error when importing data -CollectEarthWindow.8=Disclaimer text could not be found -CollectEarthWindow.9=The data imported contains records that are already present on your database. -DynamicsCode.0=Initially Forest -DynamicsCode.1=Initially Grassland -DynamicsCode.2=Initially Settlement -DynamicsCode.3=Initially Otherland -DynamicsCode.4=Initially Wetland -DynamicsCode.5=Initially Cropland -EarthApp.11=Collect Earth is already running -EarthApp.21=The file containing the grid of plots as a CSV/CED is not found in the selected path \:
-EarthApp.23=No CSV/CED file has been set-up \:

-EarthApp.24=The file containing the Freemarker template with the KML definition is not found in the selected path \:
-EarthApp.26=No KML definition file has been set-up \:

-EarthApp.27=The file containing the HTML balloon form is not found in the selected path \:
-EarthApp.29=No HTML balloon file has been set-up \:

-EarthApp.30=Please correct the file location in the Tools->Properties menu. -EarthApp.3=Remind me later -EarthApp.4=Update Now -EarthApp.57=There is a new version of Collect Earth available\!
How do you want to proceed? -EarthApp.58=Update alert -EarthApp.59=Error when importing project file -EarthApp.5=Do not remind me again -EarthApp.61=The Collect Earth file could not be open.
Please make sure that Google Earth is installed. -EarthApp.6=\ - Version -EarthApp.70=WARNING -EarthApp.71=In Mac OS X the Collect Earth project files (*.cep) will not open in Collect Earth when they are double-clicked.
-EarthApp.72=Use the Collect Earth toolbar to open the .cep files \: -EarthApp.73=Collect Earth issues in Mac OS X computers -EarthSurveyService.9=Field required -ExportActionListener.1=Pick Date to Export Records From -ExportDialogProcessMonitor.0=Processing data... -ExportDialogProcessMonitor.1=Waiting to initialize process \: -ExportDialogProcessMonitor.4=Exported records \: -ImportActionListener.0=Should the data for plots that have not been completely filled be imported? -ImportActionListener.2=If you click NO only the data from plots in the "green" state, containing all data, will be imported. -ImportActionListener.3=Import non-finished records -ImportDialogProcessMonitor.0=\ CALCULATING -ImportDialogProcessMonitor.11=Initial number of records \: -ImportDialogProcessMonitor.2=Importing records... -ImportDialogProcessMonitor.5=Actual number of imported records \: -ImportDialogProcessMonitor.8=Processing data... -ImportProcessMonitorDialog.0=Imported records \: -ImportXMLDialogProcessMonitor.1 = Overwrite data -ImportXMLDialogProcessMonitor.2 = Import only non-conflicting plots -InfiniteProgressMonitor.0=Cancel operation -JFileChooserExistsAware.0=Collect Earth Project file -KmlImportService.13=Select a CSV file to save the plot locations to -MissingPlotsListener.0=Error while getting information about plots not present on the Database -MissingPlotsListener.10=Total number of plots in the sampling design \: -MissingPlotsListener.12=Number of missing plots \: -MissingPlotsListener.14=All the plots are filled\! -MissingPlotsListener.1=Missing plots -MissingPlotsListener.2=Copy contents to clipboard -MissingPlotsListener.3=Pick the files that contain plot information ( .csv or .ced files ) for which you want to know if all data has been filled. -MissingPlotsListener.4=Missing plots - information -MissingPlotsListener.5=From file \: -MissingPlotsListener.6=Export to CED file -NO=No -NO_TO_ALL=No to all -OpenTextFileListener.0=The text file was not found at \: -OptionWizard.0=Collect Earth options -OptionWizard.100=Open Planet imagery -OptionWizard.101=Planet API key -OptionWizard.1021=URL SecureWatch -OptionWizard.102=Open Maxar SecureWatch -OptionWizard.103=Set URL for Extra Map (opens when set) \: -OptionWizard.104=Browsers -OptionWizard.105=Open Earth Map -OptionWizard.110=Use NICFI provided Monthly imagery -OptionWizard.10=Open backup folder -OptionWizard.11=Unknown\: use ifconfig -OptionWizard.12=Client Instance -OptionWizard.13=Collect Earth Server IP -OptionWizard.14=Collect Earth Server port (e.g. 8023) -OptionWizard.15=Save & Apply changes -OptionWizard.16=ID -OptionWizard.17=X-coord -OptionWizard.18=Y-coord -OptionWizard.19=Elevation -OptionWizard.1=Choose Browser -OptionWizard.20=The Google Earth contents have been changed.
Please accept the content reload when you are prompted by Google Earth. -OptionWizard.21=Update successful -OptionWizard.22=Slope -OptionWizard.23=There was an error when re-opening the Google Earth data -OptionWizard.24=Cancel -OptionWizard.25=Operation Mode -OptionWizard.26=DB host -OptionWizard.27=This is not a recognized Saiku Folder ( the start-saiku.bat file is not present) -OptionWizard.28=Saiku Server not recognized -OptionWizard.29=DB port -OptionWizard.2=Workflow (server/client) -OptionWizard.30=SQLite options -OptionWizard.31=Sample data -OptionWizard.32=Plot layout -OptionWizard.33=Survey Definition -OptionWizard.34=Integrated Services -OptionWizard.35=Number of control points -OptionWizard.36=Distance between control points (in meters) -OptionWizard.37=Margin with plot border (in meters) -OptionWizard.38=The CSV/CED file cannot be read correctly.
The file is expected to have a comma separated values like this \:
-OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect -OptionWizard.3=Server Instance -OptionWizard.40=Projects -OptionWizard.41=Load a new project file -OptionWizard.42=Error when closing the CSV reader -OptionWizard.43=Name of survey -OptionWizard.44=automatically back-up database at -OptionWizard.45=Open Earth Engine Playground ( deprecated ) -OptionWizard.46=Open Earth Engine Timelapse -OptionWizard.47=Open Bing Maps -OptionWizard.48=Open form on a browser instead of Google Earth (recommended for LINUX) -OptionWizard.49=Path to ced/csv file with plot data -OptionWizard.4=Current computer IP \: -OptionWizard.50=Browse... -OptionWizard.51=Error importing project file -OptionWizard.52=CSV/CED file with only coordinates -OptionWizard.53=No points -OptionWizard.54=Central point -OptionWizard.55=Error importing project folder -OptionWizard.56=Load project -OptionWizard.57=Previously loaded projects -OptionWizard.58=Open GEE Code Editor (requires Trusted Tester access) -OptionWizard.59=Open Here Maps focused on the plot -OptionWizard.5=Collect Earth Server port\: -OptionWizard.65=Path to Saiku folder -OptionWizard.66=Browse... -OptionWizard.67=Path to Firefox executable -OptionWizard.68=Browse... -OptionWizard.6=PostgreSQL DB parameters -OptionWizard.70=Executable files -OptionWizard.72=Binary files -OptionWizard.73=Path to Chrome executable -OptionWizard.74=Browse... -OptionWizard.76=Executable files -OptionWizard.78=Binary files -OptionWizard.79=Path to KML Freemarker template -OptionWizard.7=User Name -OptionWizard.80=Browse... -OptionWizard.82=Freemarker template -OptionWizard.83=Path to HTML Balloon form design -OptionWizard.84=Browse... -OptionWizard.86=HTML webpage -OptionWizard.87=Path to XML with IDM definition -OptionWizard.88=Browse... -OptionWizard.8=Password -OptionWizard.90=XML IDM definition -OptionWizard.91=Server (manager version or stand-alone use) -OptionWizard.92=Client (operator/connected to server) -OptionWizard.93=SQLite (Embedded/single file based) -OptionWizard.94=PostgreSQL -OptionWizard.95=Side of the sampling dots (in meters) -OptionWizard.9=DB Name -ProcessMonitorDialog.1=Parsing error on row number -ProcessMonitorDialog.4=, columns -ProcessMonitorDialog.5=\ -- values -SaikuAnalysisListener.0=Yes - Refresh Saiku data (long process) -SaikuAnalysisListener.1=No - Use same version of the data as last time Saiku was used -SaikuStarter.1=Starting Saiku -SaikuStarter.2=Starting Saiku can take some minutes, please wait\! -SaikuToolExportListener.1=Saiku Tool generation -SaikuToolExportListener.2=Generating Saiku Tool with current database -SaveEarthDataServlet.0=Empty request -SaveEarthDataServlet.1=Problem occurred while saving data to the database -SaveEarthDataServlet.2=The data was saved -SlopeCode.0=Flat (0-5) -YES=Yes -YES_TO_ALL=Yes to all +package org.openforis.collect.earth.app.ad_hoc; -GenerateDatabaseStarter.1=Preparing for analysis -GenerateDatabaseStarter.2=Generating Relational Database +import org.springframework.stereotype.Component; -IPCCGeneratorListener.1=Waiting for process to complete\! -IPCCGeneratorListener.2=The IPCC GHGi compatible data is being generated -IPCCGeneratorListener.3=Refresh the data (update with latest from Collect Earth) -IPCCGeneratorListener.4=Use the latest generated database (fastest process - no update) -IPCCGeneratorListener.5=GHGi Database generation -IPCCGeneratorListener.6=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming but it is necessary if the Collect Earth data has been updated since the last time.
\ No newline at end of file +@Component +public class FixCoordinatesPNG extends FixCoordinates { + + @Override + protected int getLongitudeLimit() { + return 5; + } + +} From e860e830c339136726bd9e3a3b69d64bc554add6 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:21:37 +0100 Subject: [PATCH 0013/1620] New translations FixCoordinatesPNG.java (English) --- .../earth/app/view/Messages_en.properties | 274 +----------------- 1 file changed, 11 insertions(+), 263 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 3ce9622fe0..8612606a4d 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,265 +1,13 @@ -AboutDialog.19=A problem occurred -AboutDialog.5=For more information visit our website OpenForis.org -AboutDialog.6=Sorry, a problem occurred while trying to open this link in your system's standard browser. -AboutDialog.8=Ok -AspectCode.0=North -AspectCode.1=North-East -AspectCode.2=East -AspectCode.3=South-East -AspectCode.4=South -AspectCode.5=South-West -AspectCode.6=West -AspectCode.7=North-West -CollectEarthMenu.0=Import CEP file -CollectEarthMenu.2=Utilities -CollectEarthMenu.3=Divide large CSV plot files -CollectEarthMenu.4=Export data to XML (from specific date until present) -CollectEarthMenu.5=Export to Collect Backup -CollectEarthMenu.6=Export data as Collect Backup (all data) -CollectEarthMenu.7=Export data as Collect Backup (from date) -CollectEarthMenu.8=Export data to XML (using summary attribute) -CollectEarthWindow.0=Error when attempting to export data to CSV file -CollectEarthWindow.10=File -CollectEarthWindow.11=Exit -CollectEarthWindow.12=Tools -CollectEarthWindow.13=Download data to CSV (Excel) -CollectEarthWindow.14=Start SAIKU Analysis -CollectEarthWindow.15=Properties -CollectEarthWindow.16=Help -CollectEarthWindow.17=Disclaimer -CollectEarthWindow.18=Find missing plots in database -CollectEarthWindow.19=Collect Earth -CollectEarthWindow.1=Export error -CollectEarthWindow.20=Number of duplicated records\: -CollectEarthWindow.21=Could not find icon for main frame -CollectEarthWindow.22=Are you sure that you want to close Collect Earth?
Closing the window will also close the Collect Earth server -CollectEarthWindow.23=Confirmation needed -CollectEarthWindow.24=XML Export -CollectEarthWindow.25=Do you want to add these records anyway and lose your current data? -CollectEarthWindow.26=Operator -CollectEarthWindow.27=Update -CollectEarthWindow.28=Open Foris Collect Earth server should be running while the operator interprets data. -CollectEarthWindow.29=The Saiku Server is not configured. -CollectEarthWindow.2=Language -CollectEarthWindow.30=Please maintain this window open while you are using Google Earth. -CollectEarthWindow.31=Export collected data to CSV file -CollectEarthWindow.32=Quit -CollectEarthWindow.33=The operator name has to be longer than 5 characters and shorter than 50 -CollectEarthWindow.34=Validation error -CollectEarthWindow.35=OPERATOR NAME EMPTY\!
Please fill the operator name and press the "Update" button. -CollectEarthWindow.36=Operator name cannot be empty -CollectEarthWindow.37=Keep Open -CollectEarthWindow.38=CSV files -CollectEarthWindow.39=NOTICE\: It is advisable that you back-up your current data (Export to XML) before importing the new data -CollectEarthWindow.3=\ Import error -CollectEarthWindow.40=Set-up the path to the folder where Saiku Server is installed in the Tools->Properties->Advanced tab. -CollectEarthWindow.41=Saving exported data to file\: -CollectEarthWindow.42=Quit -CollectEarthWindow.43=Conflicting records found -CollectEarthWindow.44=Data Import/Export -CollectEarthWindow.45=Export data to XML (compressed) -CollectEarthWindow.46=Import new data from ZIP (compressed XML) -CollectEarthWindow.47=Saiku Server not configured -CollectEarthWindow.48=Zip/collect-data files -CollectEarthWindow.49=Fusion CSV files -CollectEarthWindow.4=FAO Disclaimer notices -CollectEarthWindow.50=Open User Manual -CollectEarthWindow.51=Check for updates of Collect Earth -CollectEarthWindow.52=Open Application Log File -CollectEarthWindow.53=Collect Earth Log file -CollectEarthWindow.54=Load points from KML -CollectEarthWindow.55=Update current records using CSV -CollectEarthWindow.56=About... -CollectEarthWindow.57=The Saiku starter process is still running, please wait. -CollectEarthWindow.58=Cannot start Saiku analysis -CollectEarthWindow.59=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming.
If you click on "YES" a new dataset with the latest information will be generated. -CollectEarthWindow.5=Close -CollectEarthWindow.60=Saiku data generation -CollectEarthWindow.61=Export data to XML (modified records since last export) -CollectEarthWindow.62=About... -CollectEarthWindow.63=Error getting the points from KML -CollectEarthWindow.64=Technical Support -CollectEarthWindow.65=The operator name has been changed -CollectEarthWindow.66=Operator name -CollectEarthWindow.67=Open data folder -CollectEarthWindow.6=Export to Fusion Table -CollectEarthWindow.70=Open the Survey Guide -CollectEarthWindow.71=Generate Stand-Alone Saiku tool -CollectEarthWindow.7=Error when importing data -CollectEarthWindow.8=Disclaimer text could not be found -CollectEarthWindow.9=The data imported contains records that are already present on your database. -DynamicsCode.0=Initially Forest -DynamicsCode.1=Initially Grassland -DynamicsCode.2=Initially Settlement -DynamicsCode.3=Initially Otherland -DynamicsCode.4=Initially Wetland -DynamicsCode.5=Initially Cropland -EarthApp.11=Collect Earth is already running -EarthApp.21=The file containing the grid of plots as a CSV/CED is not found in the selected path \:
-EarthApp.23=No CSV/CED file has been set-up \:

-EarthApp.24=The file containing the Freemarker template with the KML definition is not found in the selected path \:
-EarthApp.26=No KML definition file has been set-up \:

-EarthApp.27=The file containing the HTML balloon form is not found in the selected path \:
-EarthApp.29=No HTML balloon file has been set-up \:

-EarthApp.30=Please correct the file location in the Tools->Properties menu. -EarthApp.3=Remind me later -EarthApp.4=Update Now -EarthApp.57=There is a new version of Collect Earth available\!
How do you want to proceed? -EarthApp.58=Update alert -EarthApp.59=Error when importing project file -EarthApp.5=Do not remind me again -EarthApp.61=The Collect Earth file could not be open.
Please make sure that Google Earth is installed. -EarthApp.6=\ - Version -EarthApp.70=WARNING -EarthApp.71=In Mac OS X the Collect Earth project files (*.cep) will not open in Collect Earth when they are double-clicked.
-EarthApp.72=Use the Collect Earth toolbar to open the .cep files \: -EarthApp.73=Collect Earth issues in Mac OS X computers -EarthSurveyService.9=Field required -ExportActionListener.1=Pick Date to Export Records From -ExportDialogProcessMonitor.0=Processing data... -ExportDialogProcessMonitor.1=Waiting to initialize process \: -ExportDialogProcessMonitor.4=Exported records \: -ImportActionListener.0=Should the data for plots that have not been completely filled be imported? -ImportActionListener.2=If you click NO only the data from plots in the "green" state, containing all data, will be imported. -ImportActionListener.3=Import non-finished records -ImportDialogProcessMonitor.0=\ CALCULATING -ImportDialogProcessMonitor.11=Initial number of records \: -ImportDialogProcessMonitor.2=Importing records... -ImportDialogProcessMonitor.5=Actual number of imported records \: -ImportDialogProcessMonitor.8=Processing data... -ImportProcessMonitorDialog.0=Imported records \: -ImportXMLDialogProcessMonitor.1 = Overwrite data -ImportXMLDialogProcessMonitor.2 = Import only non-conflicting plots -InfiniteProgressMonitor.0=Cancel operation -JFileChooserExistsAware.0=Collect Earth Project file -KmlImportService.13=Select a CSV file to save the plot locations to -MissingPlotsListener.0=Error while getting information about plots not present on the Database -MissingPlotsListener.10=Total number of plots in the sampling design \: -MissingPlotsListener.12=Number of missing plots \: -MissingPlotsListener.14=All the plots are filled\! -MissingPlotsListener.1=Missing plots -MissingPlotsListener.2=Copy contents to clipboard -MissingPlotsListener.3=Pick the files that contain plot information ( .csv or .ced files ) for which you want to know if all data has been filled. -MissingPlotsListener.4=Missing plots - information -MissingPlotsListener.5=From file \: -MissingPlotsListener.6=Export to CED file -NO=No -NO_TO_ALL=No to all -OpenTextFileListener.0=The text file was not found at \: -OptionWizard.0=Collect Earth options -OptionWizard.100=Open Planet imagery -OptionWizard.101=Planet API key -OptionWizard.1021=URL SecureWatch -OptionWizard.102=Open Maxar SecureWatch -OptionWizard.103=Set URL for Extra Map (opens when set) \: -OptionWizard.104=Browsers -OptionWizard.105=Open Earth Map -OptionWizard.110=Use NICFI provided Monthly imagery -OptionWizard.10=Open backup folder -OptionWizard.11=Unknown\: use ifconfig -OptionWizard.12=Client Instance -OptionWizard.13=Collect Earth Server IP -OptionWizard.14=Collect Earth Server port (e.g. 8023) -OptionWizard.15=Save & Apply changes -OptionWizard.16=ID -OptionWizard.17=X-coord -OptionWizard.18=Y-coord -OptionWizard.19=Elevation -OptionWizard.1=Choose Browser -OptionWizard.20=The Google Earth contents have been changed.
Please accept the content reload when you are prompted by Google Earth. -OptionWizard.21=Update successful -OptionWizard.22=Slope -OptionWizard.23=There was an error when re-opening the Google Earth data -OptionWizard.24=Cancel -OptionWizard.25=Operation Mode -OptionWizard.26=DB host -OptionWizard.27=This is not a recognized Saiku Folder ( the start-saiku.bat file is not present) -OptionWizard.28=Saiku Server not recognized -OptionWizard.29=DB port -OptionWizard.2=Workflow (server/client) -OptionWizard.30=SQLite options -OptionWizard.31=Sample data -OptionWizard.32=Plot layout -OptionWizard.33=Survey Definition -OptionWizard.34=Integrated Services -OptionWizard.35=Number of control points -OptionWizard.36=Distance between control points (in meters) -OptionWizard.37=Margin with plot border (in meters) -OptionWizard.38=The CSV/CED file cannot be read correctly.
The file is expected to have a comma separated values like this \:
-OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect -OptionWizard.3=Server Instance -OptionWizard.40=Projects -OptionWizard.41=Load a new project file -OptionWizard.42=Error when closing the CSV reader -OptionWizard.43=Name of survey -OptionWizard.44=automatically back-up database at -OptionWizard.45=Open Earth Engine Playground ( deprecated ) -OptionWizard.46=Open Earth Engine Timelapse -OptionWizard.47=Open Bing Maps -OptionWizard.48=Open form on a browser instead of Google Earth (recommended for LINUX) -OptionWizard.49=Path to ced/csv file with plot data -OptionWizard.4=Current computer IP \: -OptionWizard.50=Browse... -OptionWizard.51=Error importing project file -OptionWizard.52=CSV/CED file with only coordinates -OptionWizard.53=No points -OptionWizard.54=Central point -OptionWizard.55=Error importing project folder -OptionWizard.56=Load project -OptionWizard.57=Previously loaded projects -OptionWizard.58=Open GEE Code Editor (requires Trusted Tester access) -OptionWizard.59=Open Here Maps focused on the plot -OptionWizard.5=Collect Earth Server port\: -OptionWizard.65=Path to Saiku folder -OptionWizard.66=Browse... -OptionWizard.67=Path to Firefox executable -OptionWizard.68=Browse... -OptionWizard.6=PostgreSQL DB parameters -OptionWizard.70=Executable files -OptionWizard.72=Binary files -OptionWizard.73=Path to Chrome executable -OptionWizard.74=Browse... -OptionWizard.76=Executable files -OptionWizard.78=Binary files -OptionWizard.79=Path to KML Freemarker template -OptionWizard.7=User Name -OptionWizard.80=Browse... -OptionWizard.82=Freemarker template -OptionWizard.83=Path to HTML Balloon form design -OptionWizard.84=Browse... -OptionWizard.86=HTML webpage -OptionWizard.87=Path to XML with IDM definition -OptionWizard.88=Browse... -OptionWizard.8=Password -OptionWizard.90=XML IDM definition -OptionWizard.91=Server (manager version or stand-alone use) -OptionWizard.92=Client (operator/connected to server) -OptionWizard.93=SQLite (Embedded/single file based) -OptionWizard.94=PostgreSQL -OptionWizard.95=Side of the sampling dots (in meters) -OptionWizard.9=DB Name -ProcessMonitorDialog.1=Parsing error on row number -ProcessMonitorDialog.4=, columns -ProcessMonitorDialog.5=\ -- values -SaikuAnalysisListener.0=Yes - Refresh Saiku data (long process) -SaikuAnalysisListener.1=No - Use same version of the data as last time Saiku was used -SaikuStarter.1=Starting Saiku -SaikuStarter.2=Starting Saiku can take some minutes, please wait\! -SaikuToolExportListener.1=Saiku Tool generation -SaikuToolExportListener.2=Generating Saiku Tool with current database -SaveEarthDataServlet.0=Empty request -SaveEarthDataServlet.1=Problem occurred while saving data to the database -SaveEarthDataServlet.2=The data was saved -SlopeCode.0=Flat (0-5) -YES=Yes -YES_TO_ALL=Yes to all +package org.openforis.collect.earth.app.ad_hoc; -GenerateDatabaseStarter.1=Preparing for analysis -GenerateDatabaseStarter.2=Generating Relational Database +import org.springframework.stereotype.Component; -IPCCGeneratorListener.1=Waiting for process to complete\! -IPCCGeneratorListener.2=The IPCC GHGi compatible data is being generated -IPCCGeneratorListener.3=Refresh the data (update with latest from Collect Earth) -IPCCGeneratorListener.4=Use the latest generated database (fastest process - no update) -IPCCGeneratorListener.5=GHGi Database generation -IPCCGeneratorListener.6=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming but it is necessary if the Collect Earth data has been updated since the last time.
\ No newline at end of file +@Component +public class FixCoordinatesPNG extends FixCoordinates { + + @Override + protected int getLongitudeLimit() { + return 5; + } + +} From 6e31ccd91369dcbd503a8681b50e1996415e9c06 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:21:38 +0100 Subject: [PATCH 0014/1620] New translations FixDuplicatePlots.java (French) --- .../earth/app/view/Messages_fr.properties | 109 +++++++++++++++++- 1 file changed, 104 insertions(+), 5 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 8612606a4d..e62a057929 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,13 +1,112 @@ package org.openforis.collect.earth.app.ad_hoc; +import java.util.ArrayList; +import java.util.List; + +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.manager.RecordManager; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.CollectRecordSummary; +import org.openforis.collect.model.RecordFilter; +import org.openforis.idm.model.CoordinateAttribute; +import org.openforis.idm.model.TextAttribute; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component -public class FixCoordinatesPNG extends FixCoordinates { +public class FixDuplicatePlots { + + @Autowired + private RecordManager recordManager; + + @Autowired + private EarthSurveyService earthSurveyService; + + private Logger logger = LoggerFactory.getLogger( FixDuplicatePlots.class); + + private boolean stopFix = false; + + private List getAllRecords(){ + return recordManager.loadSummaries( + new RecordFilter( + earthSurveyService.getCollectSurvey() , + EarthConstants.ROOT_ENTITY_NAME + ) ); + } + + + + public void fixHela(){ + List allRecords = getAllRecords(); + + if( shouldStopFixing()){ + return; + } + int i = 0; + for (CollectRecordSummary summaryCollectRecord : allRecords) { + if( shouldStopFixing()){ + break; + } + try { + CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); + + if( isSouthernPlot(collectRecord) ){ + recordManager.delete( collectRecord.getId() ); + i++; + + } + + } catch (Exception e) { + logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ + } + } + logger.info("In total fixed plots " + i); //$NON-NLS-1$ + + } + + private List getSouthernHighlandsRecords(List allRecords) { + List southernHighlandsPlots = new ArrayList(); + + for (CollectRecord record : allRecords) { + if( record!= null ){ + CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), record.getId(), Step.ENTRY); + TextAttribute plot_file = (TextAttribute) collectRecord.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ + if( plot_file !=null && plot_file.getValue().getValue().equals("southernHighlands.ced") ){ //$NON-NLS-1$ + southernHighlandsPlots.add( collectRecord ); + } + } + } + return southernHighlandsPlots; + } + + private CollectRecord findMathingCoordinatePlotInSouthern(List southernHighlandRecords, CoordinateAttribute plotCoord) { + for (CollectRecord southernPlot : southernHighlandRecords) { + + CoordinateAttribute sothernCoord = (CoordinateAttribute) southernPlot.getNodeByPath("/plot/location"); //$NON-NLS-1$ + if( sothernCoord.getValue().equals(plotCoord.getValue() ) ){ + return southernPlot; + } + } + return null; + } + + private boolean isSouthernPlot(CollectRecord record) { + + TextAttribute plot_file = (TextAttribute) record.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ + return( plot_file!=null && plot_file.getValue().getValue().equals("southernHighlands.ced") ); //$NON-NLS-1$ + } + + private boolean shouldStopFixing() { + return stopFix; + } + + public void stopFixing() { + stopFix = true; - @Override - protected int getLongitudeLimit() { - return 5; } -} +} \ No newline at end of file From 4bfce7635631aab8a599f362d4e4e0e6685a47b9 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:21:39 +0100 Subject: [PATCH 0015/1620] New translations FixDuplicatePlots.java (Spanish) --- .../earth/app/view/Messages_es.properties | 109 +++++++++++++++++- 1 file changed, 104 insertions(+), 5 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 8612606a4d..e62a057929 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,13 +1,112 @@ package org.openforis.collect.earth.app.ad_hoc; +import java.util.ArrayList; +import java.util.List; + +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.manager.RecordManager; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.CollectRecordSummary; +import org.openforis.collect.model.RecordFilter; +import org.openforis.idm.model.CoordinateAttribute; +import org.openforis.idm.model.TextAttribute; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component -public class FixCoordinatesPNG extends FixCoordinates { +public class FixDuplicatePlots { + + @Autowired + private RecordManager recordManager; + + @Autowired + private EarthSurveyService earthSurveyService; + + private Logger logger = LoggerFactory.getLogger( FixDuplicatePlots.class); + + private boolean stopFix = false; + + private List getAllRecords(){ + return recordManager.loadSummaries( + new RecordFilter( + earthSurveyService.getCollectSurvey() , + EarthConstants.ROOT_ENTITY_NAME + ) ); + } + + + + public void fixHela(){ + List allRecords = getAllRecords(); + + if( shouldStopFixing()){ + return; + } + int i = 0; + for (CollectRecordSummary summaryCollectRecord : allRecords) { + if( shouldStopFixing()){ + break; + } + try { + CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); + + if( isSouthernPlot(collectRecord) ){ + recordManager.delete( collectRecord.getId() ); + i++; + + } + + } catch (Exception e) { + logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ + } + } + logger.info("In total fixed plots " + i); //$NON-NLS-1$ + + } + + private List getSouthernHighlandsRecords(List allRecords) { + List southernHighlandsPlots = new ArrayList(); + + for (CollectRecord record : allRecords) { + if( record!= null ){ + CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), record.getId(), Step.ENTRY); + TextAttribute plot_file = (TextAttribute) collectRecord.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ + if( plot_file !=null && plot_file.getValue().getValue().equals("southernHighlands.ced") ){ //$NON-NLS-1$ + southernHighlandsPlots.add( collectRecord ); + } + } + } + return southernHighlandsPlots; + } + + private CollectRecord findMathingCoordinatePlotInSouthern(List southernHighlandRecords, CoordinateAttribute plotCoord) { + for (CollectRecord southernPlot : southernHighlandRecords) { + + CoordinateAttribute sothernCoord = (CoordinateAttribute) southernPlot.getNodeByPath("/plot/location"); //$NON-NLS-1$ + if( sothernCoord.getValue().equals(plotCoord.getValue() ) ){ + return southernPlot; + } + } + return null; + } + + private boolean isSouthernPlot(CollectRecord record) { + + TextAttribute plot_file = (TextAttribute) record.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ + return( plot_file!=null && plot_file.getValue().getValue().equals("southernHighlands.ced") ); //$NON-NLS-1$ + } + + private boolean shouldStopFixing() { + return stopFix; + } + + public void stopFixing() { + stopFix = true; - @Override - protected int getLongitudeLimit() { - return 5; } -} +} \ No newline at end of file From c02f3d5eb6c920d36275a12f62c8e7ea29d6a9c1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:21:40 +0100 Subject: [PATCH 0016/1620] New translations FixDuplicatePlots.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 109 +++++++++++++++++- 1 file changed, 104 insertions(+), 5 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 8612606a4d..e62a057929 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,13 +1,112 @@ package org.openforis.collect.earth.app.ad_hoc; +import java.util.ArrayList; +import java.util.List; + +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.manager.RecordManager; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.CollectRecordSummary; +import org.openforis.collect.model.RecordFilter; +import org.openforis.idm.model.CoordinateAttribute; +import org.openforis.idm.model.TextAttribute; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component -public class FixCoordinatesPNG extends FixCoordinates { +public class FixDuplicatePlots { + + @Autowired + private RecordManager recordManager; + + @Autowired + private EarthSurveyService earthSurveyService; + + private Logger logger = LoggerFactory.getLogger( FixDuplicatePlots.class); + + private boolean stopFix = false; + + private List getAllRecords(){ + return recordManager.loadSummaries( + new RecordFilter( + earthSurveyService.getCollectSurvey() , + EarthConstants.ROOT_ENTITY_NAME + ) ); + } + + + + public void fixHela(){ + List allRecords = getAllRecords(); + + if( shouldStopFixing()){ + return; + } + int i = 0; + for (CollectRecordSummary summaryCollectRecord : allRecords) { + if( shouldStopFixing()){ + break; + } + try { + CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); + + if( isSouthernPlot(collectRecord) ){ + recordManager.delete( collectRecord.getId() ); + i++; + + } + + } catch (Exception e) { + logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ + } + } + logger.info("In total fixed plots " + i); //$NON-NLS-1$ + + } + + private List getSouthernHighlandsRecords(List allRecords) { + List southernHighlandsPlots = new ArrayList(); + + for (CollectRecord record : allRecords) { + if( record!= null ){ + CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), record.getId(), Step.ENTRY); + TextAttribute plot_file = (TextAttribute) collectRecord.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ + if( plot_file !=null && plot_file.getValue().getValue().equals("southernHighlands.ced") ){ //$NON-NLS-1$ + southernHighlandsPlots.add( collectRecord ); + } + } + } + return southernHighlandsPlots; + } + + private CollectRecord findMathingCoordinatePlotInSouthern(List southernHighlandRecords, CoordinateAttribute plotCoord) { + for (CollectRecord southernPlot : southernHighlandRecords) { + + CoordinateAttribute sothernCoord = (CoordinateAttribute) southernPlot.getNodeByPath("/plot/location"); //$NON-NLS-1$ + if( sothernCoord.getValue().equals(plotCoord.getValue() ) ){ + return southernPlot; + } + } + return null; + } + + private boolean isSouthernPlot(CollectRecord record) { + + TextAttribute plot_file = (TextAttribute) record.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ + return( plot_file!=null && plot_file.getValue().getValue().equals("southernHighlands.ced") ); //$NON-NLS-1$ + } + + private boolean shouldStopFixing() { + return stopFix; + } + + public void stopFixing() { + stopFix = true; - @Override - protected int getLongitudeLimit() { - return 5; } -} +} \ No newline at end of file From b114b450a6ca11d448a377ec0109bceb0f9e5d3e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:21:41 +0100 Subject: [PATCH 0017/1620] New translations FixDuplicatePlots.java (English) --- .../earth/app/view/Messages_en.properties | 109 +++++++++++++++++- 1 file changed, 104 insertions(+), 5 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 8612606a4d..e62a057929 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,13 +1,112 @@ package org.openforis.collect.earth.app.ad_hoc; +import java.util.ArrayList; +import java.util.List; + +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.manager.RecordManager; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.CollectRecordSummary; +import org.openforis.collect.model.RecordFilter; +import org.openforis.idm.model.CoordinateAttribute; +import org.openforis.idm.model.TextAttribute; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component -public class FixCoordinatesPNG extends FixCoordinates { +public class FixDuplicatePlots { + + @Autowired + private RecordManager recordManager; + + @Autowired + private EarthSurveyService earthSurveyService; + + private Logger logger = LoggerFactory.getLogger( FixDuplicatePlots.class); + + private boolean stopFix = false; + + private List getAllRecords(){ + return recordManager.loadSummaries( + new RecordFilter( + earthSurveyService.getCollectSurvey() , + EarthConstants.ROOT_ENTITY_NAME + ) ); + } + + + + public void fixHela(){ + List allRecords = getAllRecords(); + + if( shouldStopFixing()){ + return; + } + int i = 0; + for (CollectRecordSummary summaryCollectRecord : allRecords) { + if( shouldStopFixing()){ + break; + } + try { + CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); + + if( isSouthernPlot(collectRecord) ){ + recordManager.delete( collectRecord.getId() ); + i++; + + } + + } catch (Exception e) { + logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ + } + } + logger.info("In total fixed plots " + i); //$NON-NLS-1$ + + } + + private List getSouthernHighlandsRecords(List allRecords) { + List southernHighlandsPlots = new ArrayList(); + + for (CollectRecord record : allRecords) { + if( record!= null ){ + CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), record.getId(), Step.ENTRY); + TextAttribute plot_file = (TextAttribute) collectRecord.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ + if( plot_file !=null && plot_file.getValue().getValue().equals("southernHighlands.ced") ){ //$NON-NLS-1$ + southernHighlandsPlots.add( collectRecord ); + } + } + } + return southernHighlandsPlots; + } + + private CollectRecord findMathingCoordinatePlotInSouthern(List southernHighlandRecords, CoordinateAttribute plotCoord) { + for (CollectRecord southernPlot : southernHighlandRecords) { + + CoordinateAttribute sothernCoord = (CoordinateAttribute) southernPlot.getNodeByPath("/plot/location"); //$NON-NLS-1$ + if( sothernCoord.getValue().equals(plotCoord.getValue() ) ){ + return southernPlot; + } + } + return null; + } + + private boolean isSouthernPlot(CollectRecord record) { + + TextAttribute plot_file = (TextAttribute) record.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ + return( plot_file!=null && plot_file.getValue().getValue().equals("southernHighlands.ced") ); //$NON-NLS-1$ + } + + private boolean shouldStopFixing() { + return stopFix; + } + + public void stopFixing() { + stopFix = true; - @Override - protected int getLongitudeLimit() { - return 5; } -} +} \ No newline at end of file From c70d8713f467758392c7a51360291219e0687d0a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:21:42 +0100 Subject: [PATCH 0018/1620] New translations FixMissingPlotsFileInfo.java (French) --- .../earth/app/view/Messages_fr.properties | 168 ++++++++++++------ 1 file changed, 118 insertions(+), 50 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index e62a057929..315f96ec2c 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,24 +1,43 @@ package org.openforis.collect.earth.app.ad_hoc; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.swing.JFrame; import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.view.DataFormat; +import org.openforis.collect.earth.app.view.JFileChooserExistsAware; import org.openforis.collect.manager.RecordManager; import org.openforis.collect.model.CollectRecord; import org.openforis.collect.model.CollectRecord.Step; import org.openforis.collect.model.CollectRecordSummary; import org.openforis.collect.model.RecordFilter; -import org.openforis.idm.model.CoordinateAttribute; +import org.openforis.collect.persistence.RecordPersistenceException; import org.openforis.idm.model.TextAttribute; +import org.openforis.idm.model.TextValue; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import com.opencsv.CSVReader; +import com.opencsv.exceptions.CsvValidationException; + @Component -public class FixDuplicatePlots { +public final class FixMissingPlotsFileInfo { @Autowired private RecordManager recordManager; @@ -26,87 +45,136 @@ public class FixDuplicatePlots { @Autowired private EarthSurveyService earthSurveyService; - private Logger logger = LoggerFactory.getLogger( FixDuplicatePlots.class); + @Autowired + private LocalPropertiesService localPropertiesService; + + private final Logger logger = LoggerFactory.getLogger(FixMissingPlotsFileInfo.class); private boolean stopFix = false; + + + public void findMissingPlots(JFrame frame) { + final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, false, true, null, + localPropertiesService, frame); + + final Map> plotIdsByFile = getPlotIdsByFile(selectedPlotFiles); + + List plotIdsWithNoRegion = getPlotsNoRegion(); + + for (CollectRecord record : plotIdsWithNoRegion) { + String plotFile = getFileNameForId( plotIdsByFile, record ); + if( plotFile != null ){ + setPlotFile( record, plotFile ); + }else{ + logger.info("No plot file found for plot with ID : " + getPlotId(record) ); //$NON-NLS-1$ + try { + recordManager.delete( record.getId() ); + } catch (RecordPersistenceException e) { + logger.error("Not able to remove plot with ID " + record.getId(), e ) ; //$NON-NLS-1$ + } + } + } + } + + private String getPlotId(CollectRecord record) { + TextAttribute plot_id = (TextAttribute) record.getNodeByPath("/plot/id"); //$NON-NLS-1$ + return plot_id.getValue().getValue(); + } + private List getAllRecords(){ - return recordManager.loadSummaries( - new RecordFilter( - earthSurveyService.getCollectSurvey() , - EarthConstants.ROOT_ENTITY_NAME - ) ); + RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); + List records = recordManager.loadSummaries( rf ); + return records; } + private void setPlotFile(CollectRecord record, String plotFile) { + TextValue textValue = new TextValue( plotFile ); + recordManager.addAttribute(record.getRootEntity(), "plot_file", textValue, null, null); //$NON-NLS-1$ - public void fixHela(){ - List allRecords = getAllRecords(); + recordManager.save( record ); + logger.info("Setting record to plot_file : " + plotFile ); //$NON-NLS-1$ - if( shouldStopFixing()){ - return; - } - int i = 0; - for (CollectRecordSummary summaryCollectRecord : allRecords) { - if( shouldStopFixing()){ - break; - } - try { - CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); + } - if( isSouthernPlot(collectRecord) ){ - recordManager.delete( collectRecord.getId() ); - i++; + private String getFileNameForId(Map> plotIdsByFile, CollectRecord record) { - } + Set fileNames = plotIdsByFile.keySet(); + String plotId = getPlotId(record); + for (String filename : fileNames) { - } catch (Exception e) { - logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ + List plotIds = plotIdsByFile.get(filename); + for (String plotIdInFile : plotIds) { + if( plotIdInFile.equals(plotId)){ + return filename; + } } } - logger.info("In total fixed plots " + i); //$NON-NLS-1$ + return null; + } + private List getPlotsNoRegion() { + List plotsWithNoRegionInfo = new ArrayList(); + List allRecords = getAllRecords(); + for (CollectRecordSummary summary : allRecords) { + CollectRecord record = recordManager.load( earthSurveyService.getCollectSurvey(), summary.getId(), Step.ENTRY); + TextAttribute plot_file = (TextAttribute) record.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ + if( plot_file ==null || plot_file.getValue() == null || plot_file.getValue().getValue() == null ){ + plotsWithNoRegionInfo.add( record ); + } + } + return plotsWithNoRegionInfo; } - private List getSouthernHighlandsRecords(List allRecords) { - List southernHighlandsPlots = new ArrayList(); + private CSVReader getCsvReader(String csvFile) throws FileNotFoundException { + CSVReader reader; + final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 )); //$NON-NLS-1$ + reader = new CSVReader(bufferedReader); + return reader; + } - for (CollectRecord record : allRecords) { - if( record!= null ){ - CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), record.getId(), Step.ENTRY); - TextAttribute plot_file = (TextAttribute) collectRecord.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ - if( plot_file !=null && plot_file.getValue().getValue().equals("southernHighlands.ced") ){ //$NON-NLS-1$ - southernHighlandsPlots.add( collectRecord ); - } + private List getIdsInFile(String plotCoordinateFile) { + final List plotIds = new ArrayList(); + try { + final CSVReader plotCsvReader = getCsvReader(plotCoordinateFile); + String[] csvRow; + while ((csvRow = plotCsvReader.readNext()) != null) { + plotIds.add(csvRow[0]); } + } catch (final FileNotFoundException e) { + logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ + } catch (final IOException e) { + logger.error("Error reading CSV line", e); //$NON-NLS-1$ + } catch (CsvValidationException e) { + logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ } - return southernHighlandsPlots; + + return plotIds; } - private CollectRecord findMathingCoordinatePlotInSouthern(List southernHighlandRecords, CoordinateAttribute plotCoord) { - for (CollectRecord southernPlot : southernHighlandRecords) { - CoordinateAttribute sothernCoord = (CoordinateAttribute) southernPlot.getNodeByPath("/plot/location"); //$NON-NLS-1$ - if( sothernCoord.getValue().equals(plotCoord.getValue() ) ){ - return southernPlot; + private Map> getPlotIdsByFile(File[] selectedPlotFiles) { + final Map> plotIdsByFile = new HashMap>(); + + for (final File file : selectedPlotFiles) { + if (shouldStopFixing()) { + break; } + plotIdsByFile.put(file.getName(), getIdsInFile(file.getAbsolutePath())); } - return null; + + return plotIdsByFile; } - private boolean isSouthernPlot(CollectRecord record) { - TextAttribute plot_file = (TextAttribute) record.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ - return( plot_file!=null && plot_file.getValue().getValue().equals("southernHighlands.ced") ); //$NON-NLS-1$ - } private boolean shouldStopFixing() { return stopFix; } public void stopFixing() { - stopFix = true; + stopFix = true; } - -} \ No newline at end of file +} From 8277919082ca89fd2ed08cfc06fc561c4cfd91f1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:21:43 +0100 Subject: [PATCH 0019/1620] New translations FixMissingPlotsFileInfo.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 168 ++++++++++++------ 1 file changed, 118 insertions(+), 50 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index e62a057929..315f96ec2c 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,24 +1,43 @@ package org.openforis.collect.earth.app.ad_hoc; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.swing.JFrame; import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.view.DataFormat; +import org.openforis.collect.earth.app.view.JFileChooserExistsAware; import org.openforis.collect.manager.RecordManager; import org.openforis.collect.model.CollectRecord; import org.openforis.collect.model.CollectRecord.Step; import org.openforis.collect.model.CollectRecordSummary; import org.openforis.collect.model.RecordFilter; -import org.openforis.idm.model.CoordinateAttribute; +import org.openforis.collect.persistence.RecordPersistenceException; import org.openforis.idm.model.TextAttribute; +import org.openforis.idm.model.TextValue; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import com.opencsv.CSVReader; +import com.opencsv.exceptions.CsvValidationException; + @Component -public class FixDuplicatePlots { +public final class FixMissingPlotsFileInfo { @Autowired private RecordManager recordManager; @@ -26,87 +45,136 @@ public class FixDuplicatePlots { @Autowired private EarthSurveyService earthSurveyService; - private Logger logger = LoggerFactory.getLogger( FixDuplicatePlots.class); + @Autowired + private LocalPropertiesService localPropertiesService; + + private final Logger logger = LoggerFactory.getLogger(FixMissingPlotsFileInfo.class); private boolean stopFix = false; + + + public void findMissingPlots(JFrame frame) { + final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, false, true, null, + localPropertiesService, frame); + + final Map> plotIdsByFile = getPlotIdsByFile(selectedPlotFiles); + + List plotIdsWithNoRegion = getPlotsNoRegion(); + + for (CollectRecord record : plotIdsWithNoRegion) { + String plotFile = getFileNameForId( plotIdsByFile, record ); + if( plotFile != null ){ + setPlotFile( record, plotFile ); + }else{ + logger.info("No plot file found for plot with ID : " + getPlotId(record) ); //$NON-NLS-1$ + try { + recordManager.delete( record.getId() ); + } catch (RecordPersistenceException e) { + logger.error("Not able to remove plot with ID " + record.getId(), e ) ; //$NON-NLS-1$ + } + } + } + } + + private String getPlotId(CollectRecord record) { + TextAttribute plot_id = (TextAttribute) record.getNodeByPath("/plot/id"); //$NON-NLS-1$ + return plot_id.getValue().getValue(); + } + private List getAllRecords(){ - return recordManager.loadSummaries( - new RecordFilter( - earthSurveyService.getCollectSurvey() , - EarthConstants.ROOT_ENTITY_NAME - ) ); + RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); + List records = recordManager.loadSummaries( rf ); + return records; } + private void setPlotFile(CollectRecord record, String plotFile) { + TextValue textValue = new TextValue( plotFile ); + recordManager.addAttribute(record.getRootEntity(), "plot_file", textValue, null, null); //$NON-NLS-1$ - public void fixHela(){ - List allRecords = getAllRecords(); + recordManager.save( record ); + logger.info("Setting record to plot_file : " + plotFile ); //$NON-NLS-1$ - if( shouldStopFixing()){ - return; - } - int i = 0; - for (CollectRecordSummary summaryCollectRecord : allRecords) { - if( shouldStopFixing()){ - break; - } - try { - CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); + } - if( isSouthernPlot(collectRecord) ){ - recordManager.delete( collectRecord.getId() ); - i++; + private String getFileNameForId(Map> plotIdsByFile, CollectRecord record) { - } + Set fileNames = plotIdsByFile.keySet(); + String plotId = getPlotId(record); + for (String filename : fileNames) { - } catch (Exception e) { - logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ + List plotIds = plotIdsByFile.get(filename); + for (String plotIdInFile : plotIds) { + if( plotIdInFile.equals(plotId)){ + return filename; + } } } - logger.info("In total fixed plots " + i); //$NON-NLS-1$ + return null; + } + private List getPlotsNoRegion() { + List plotsWithNoRegionInfo = new ArrayList(); + List allRecords = getAllRecords(); + for (CollectRecordSummary summary : allRecords) { + CollectRecord record = recordManager.load( earthSurveyService.getCollectSurvey(), summary.getId(), Step.ENTRY); + TextAttribute plot_file = (TextAttribute) record.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ + if( plot_file ==null || plot_file.getValue() == null || plot_file.getValue().getValue() == null ){ + plotsWithNoRegionInfo.add( record ); + } + } + return plotsWithNoRegionInfo; } - private List getSouthernHighlandsRecords(List allRecords) { - List southernHighlandsPlots = new ArrayList(); + private CSVReader getCsvReader(String csvFile) throws FileNotFoundException { + CSVReader reader; + final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 )); //$NON-NLS-1$ + reader = new CSVReader(bufferedReader); + return reader; + } - for (CollectRecord record : allRecords) { - if( record!= null ){ - CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), record.getId(), Step.ENTRY); - TextAttribute plot_file = (TextAttribute) collectRecord.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ - if( plot_file !=null && plot_file.getValue().getValue().equals("southernHighlands.ced") ){ //$NON-NLS-1$ - southernHighlandsPlots.add( collectRecord ); - } + private List getIdsInFile(String plotCoordinateFile) { + final List plotIds = new ArrayList(); + try { + final CSVReader plotCsvReader = getCsvReader(plotCoordinateFile); + String[] csvRow; + while ((csvRow = plotCsvReader.readNext()) != null) { + plotIds.add(csvRow[0]); } + } catch (final FileNotFoundException e) { + logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ + } catch (final IOException e) { + logger.error("Error reading CSV line", e); //$NON-NLS-1$ + } catch (CsvValidationException e) { + logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ } - return southernHighlandsPlots; + + return plotIds; } - private CollectRecord findMathingCoordinatePlotInSouthern(List southernHighlandRecords, CoordinateAttribute plotCoord) { - for (CollectRecord southernPlot : southernHighlandRecords) { - CoordinateAttribute sothernCoord = (CoordinateAttribute) southernPlot.getNodeByPath("/plot/location"); //$NON-NLS-1$ - if( sothernCoord.getValue().equals(plotCoord.getValue() ) ){ - return southernPlot; + private Map> getPlotIdsByFile(File[] selectedPlotFiles) { + final Map> plotIdsByFile = new HashMap>(); + + for (final File file : selectedPlotFiles) { + if (shouldStopFixing()) { + break; } + plotIdsByFile.put(file.getName(), getIdsInFile(file.getAbsolutePath())); } - return null; + + return plotIdsByFile; } - private boolean isSouthernPlot(CollectRecord record) { - TextAttribute plot_file = (TextAttribute) record.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ - return( plot_file!=null && plot_file.getValue().getValue().equals("southernHighlands.ced") ); //$NON-NLS-1$ - } private boolean shouldStopFixing() { return stopFix; } public void stopFixing() { - stopFix = true; + stopFix = true; } - -} \ No newline at end of file +} From 74f0729350d1bec3921b4334f7fdf879eb7d9fc2 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:21:45 +0100 Subject: [PATCH 0020/1620] New translations FixCoordinatesMongolia.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 175 +----------------- 1 file changed, 4 insertions(+), 171 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 315f96ec2c..c36b2d4338 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,180 +1,13 @@ package org.openforis.collect.earth.app.ad_hoc; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.swing.JFrame; - -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.view.DataFormat; -import org.openforis.collect.earth.app.view.JFileChooserExistsAware; -import org.openforis.collect.manager.RecordManager; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.CollectRecordSummary; -import org.openforis.collect.model.RecordFilter; -import org.openforis.collect.persistence.RecordPersistenceException; -import org.openforis.idm.model.TextAttribute; -import org.openforis.idm.model.TextValue; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.opencsv.CSVReader; -import com.opencsv.exceptions.CsvValidationException; - @Component -public final class FixMissingPlotsFileInfo { - - @Autowired - private RecordManager recordManager; - - @Autowired - private EarthSurveyService earthSurveyService; - - @Autowired - private LocalPropertiesService localPropertiesService; - - private final Logger logger = LoggerFactory.getLogger(FixMissingPlotsFileInfo.class); - - private boolean stopFix = false; - - - - public void findMissingPlots(JFrame frame) { - final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, false, true, null, - localPropertiesService, frame); - - final Map> plotIdsByFile = getPlotIdsByFile(selectedPlotFiles); - - List plotIdsWithNoRegion = getPlotsNoRegion(); - - for (CollectRecord record : plotIdsWithNoRegion) { - String plotFile = getFileNameForId( plotIdsByFile, record ); - if( plotFile != null ){ - setPlotFile( record, plotFile ); - }else{ - logger.info("No plot file found for plot with ID : " + getPlotId(record) ); //$NON-NLS-1$ - try { - recordManager.delete( record.getId() ); - } catch (RecordPersistenceException e) { - logger.error("Not able to remove plot with ID " + record.getId(), e ) ; //$NON-NLS-1$ - } - } - } - } - - private String getPlotId(CollectRecord record) { - TextAttribute plot_id = (TextAttribute) record.getNodeByPath("/plot/id"); //$NON-NLS-1$ - return plot_id.getValue().getValue(); - } - - private List getAllRecords(){ - RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); - List records = recordManager.loadSummaries( rf ); - return records; - } - - private void setPlotFile(CollectRecord record, String plotFile) { - - TextValue textValue = new TextValue( plotFile ); - recordManager.addAttribute(record.getRootEntity(), "plot_file", textValue, null, null); //$NON-NLS-1$ - - recordManager.save( record ); - logger.info("Setting record to plot_file : " + plotFile ); //$NON-NLS-1$ +public class FixCoordinatesMongolia extends FixCoordinates { + @Override + protected int getLongitudeLimit() { + return 87; } - private String getFileNameForId(Map> plotIdsByFile, CollectRecord record) { - - Set fileNames = plotIdsByFile.keySet(); - String plotId = getPlotId(record); - for (String filename : fileNames) { - - List plotIds = plotIdsByFile.get(filename); - for (String plotIdInFile : plotIds) { - if( plotIdInFile.equals(plotId)){ - return filename; - } - } - } - return null; - } - - private List getPlotsNoRegion() { - List plotsWithNoRegionInfo = new ArrayList(); - List allRecords = getAllRecords(); - for (CollectRecordSummary summary : allRecords) { - CollectRecord record = recordManager.load( earthSurveyService.getCollectSurvey(), summary.getId(), Step.ENTRY); - TextAttribute plot_file = (TextAttribute) record.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ - if( plot_file ==null || plot_file.getValue() == null || plot_file.getValue().getValue() == null ){ - plotsWithNoRegionInfo.add( record ); - } - } - return plotsWithNoRegionInfo; - } - - private CSVReader getCsvReader(String csvFile) throws FileNotFoundException { - CSVReader reader; - final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 )); //$NON-NLS-1$ - reader = new CSVReader(bufferedReader); - return reader; - } - - private List getIdsInFile(String plotCoordinateFile) { - final List plotIds = new ArrayList(); - try { - final CSVReader plotCsvReader = getCsvReader(plotCoordinateFile); - String[] csvRow; - while ((csvRow = plotCsvReader.readNext()) != null) { - plotIds.add(csvRow[0]); - } - } catch (final FileNotFoundException e) { - logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ - } catch (final IOException e) { - logger.error("Error reading CSV line", e); //$NON-NLS-1$ - } catch (CsvValidationException e) { - logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ - } - - return plotIds; - } - - - private Map> getPlotIdsByFile(File[] selectedPlotFiles) { - final Map> plotIdsByFile = new HashMap>(); - - for (final File file : selectedPlotFiles) { - if (shouldStopFixing()) { - break; - } - plotIdsByFile.put(file.getName(), getIdsInFile(file.getAbsolutePath())); - } - - return plotIdsByFile; - } - - - - private boolean shouldStopFixing() { - return stopFix; - } - - public void stopFixing() { - stopFix = true; - - } } From 5330449f142c113d716547373fd46d40a29987cd Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:21:46 +0100 Subject: [PATCH 0021/1620] New translations FixMissingPlotsFileInfo.java (English) --- .../earth/app/view/Messages_en.properties | 168 ++++++++++++------ 1 file changed, 118 insertions(+), 50 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index e62a057929..315f96ec2c 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,24 +1,43 @@ package org.openforis.collect.earth.app.ad_hoc; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.swing.JFrame; import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.view.DataFormat; +import org.openforis.collect.earth.app.view.JFileChooserExistsAware; import org.openforis.collect.manager.RecordManager; import org.openforis.collect.model.CollectRecord; import org.openforis.collect.model.CollectRecord.Step; import org.openforis.collect.model.CollectRecordSummary; import org.openforis.collect.model.RecordFilter; -import org.openforis.idm.model.CoordinateAttribute; +import org.openforis.collect.persistence.RecordPersistenceException; import org.openforis.idm.model.TextAttribute; +import org.openforis.idm.model.TextValue; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import com.opencsv.CSVReader; +import com.opencsv.exceptions.CsvValidationException; + @Component -public class FixDuplicatePlots { +public final class FixMissingPlotsFileInfo { @Autowired private RecordManager recordManager; @@ -26,87 +45,136 @@ public class FixDuplicatePlots { @Autowired private EarthSurveyService earthSurveyService; - private Logger logger = LoggerFactory.getLogger( FixDuplicatePlots.class); + @Autowired + private LocalPropertiesService localPropertiesService; + + private final Logger logger = LoggerFactory.getLogger(FixMissingPlotsFileInfo.class); private boolean stopFix = false; + + + public void findMissingPlots(JFrame frame) { + final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, false, true, null, + localPropertiesService, frame); + + final Map> plotIdsByFile = getPlotIdsByFile(selectedPlotFiles); + + List plotIdsWithNoRegion = getPlotsNoRegion(); + + for (CollectRecord record : plotIdsWithNoRegion) { + String plotFile = getFileNameForId( plotIdsByFile, record ); + if( plotFile != null ){ + setPlotFile( record, plotFile ); + }else{ + logger.info("No plot file found for plot with ID : " + getPlotId(record) ); //$NON-NLS-1$ + try { + recordManager.delete( record.getId() ); + } catch (RecordPersistenceException e) { + logger.error("Not able to remove plot with ID " + record.getId(), e ) ; //$NON-NLS-1$ + } + } + } + } + + private String getPlotId(CollectRecord record) { + TextAttribute plot_id = (TextAttribute) record.getNodeByPath("/plot/id"); //$NON-NLS-1$ + return plot_id.getValue().getValue(); + } + private List getAllRecords(){ - return recordManager.loadSummaries( - new RecordFilter( - earthSurveyService.getCollectSurvey() , - EarthConstants.ROOT_ENTITY_NAME - ) ); + RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); + List records = recordManager.loadSummaries( rf ); + return records; } + private void setPlotFile(CollectRecord record, String plotFile) { + TextValue textValue = new TextValue( plotFile ); + recordManager.addAttribute(record.getRootEntity(), "plot_file", textValue, null, null); //$NON-NLS-1$ - public void fixHela(){ - List allRecords = getAllRecords(); + recordManager.save( record ); + logger.info("Setting record to plot_file : " + plotFile ); //$NON-NLS-1$ - if( shouldStopFixing()){ - return; - } - int i = 0; - for (CollectRecordSummary summaryCollectRecord : allRecords) { - if( shouldStopFixing()){ - break; - } - try { - CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); + } - if( isSouthernPlot(collectRecord) ){ - recordManager.delete( collectRecord.getId() ); - i++; + private String getFileNameForId(Map> plotIdsByFile, CollectRecord record) { - } + Set fileNames = plotIdsByFile.keySet(); + String plotId = getPlotId(record); + for (String filename : fileNames) { - } catch (Exception e) { - logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ + List plotIds = plotIdsByFile.get(filename); + for (String plotIdInFile : plotIds) { + if( plotIdInFile.equals(plotId)){ + return filename; + } } } - logger.info("In total fixed plots " + i); //$NON-NLS-1$ + return null; + } + private List getPlotsNoRegion() { + List plotsWithNoRegionInfo = new ArrayList(); + List allRecords = getAllRecords(); + for (CollectRecordSummary summary : allRecords) { + CollectRecord record = recordManager.load( earthSurveyService.getCollectSurvey(), summary.getId(), Step.ENTRY); + TextAttribute plot_file = (TextAttribute) record.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ + if( plot_file ==null || plot_file.getValue() == null || plot_file.getValue().getValue() == null ){ + plotsWithNoRegionInfo.add( record ); + } + } + return plotsWithNoRegionInfo; } - private List getSouthernHighlandsRecords(List allRecords) { - List southernHighlandsPlots = new ArrayList(); + private CSVReader getCsvReader(String csvFile) throws FileNotFoundException { + CSVReader reader; + final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 )); //$NON-NLS-1$ + reader = new CSVReader(bufferedReader); + return reader; + } - for (CollectRecord record : allRecords) { - if( record!= null ){ - CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), record.getId(), Step.ENTRY); - TextAttribute plot_file = (TextAttribute) collectRecord.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ - if( plot_file !=null && plot_file.getValue().getValue().equals("southernHighlands.ced") ){ //$NON-NLS-1$ - southernHighlandsPlots.add( collectRecord ); - } + private List getIdsInFile(String plotCoordinateFile) { + final List plotIds = new ArrayList(); + try { + final CSVReader plotCsvReader = getCsvReader(plotCoordinateFile); + String[] csvRow; + while ((csvRow = plotCsvReader.readNext()) != null) { + plotIds.add(csvRow[0]); } + } catch (final FileNotFoundException e) { + logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ + } catch (final IOException e) { + logger.error("Error reading CSV line", e); //$NON-NLS-1$ + } catch (CsvValidationException e) { + logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ } - return southernHighlandsPlots; + + return plotIds; } - private CollectRecord findMathingCoordinatePlotInSouthern(List southernHighlandRecords, CoordinateAttribute plotCoord) { - for (CollectRecord southernPlot : southernHighlandRecords) { - CoordinateAttribute sothernCoord = (CoordinateAttribute) southernPlot.getNodeByPath("/plot/location"); //$NON-NLS-1$ - if( sothernCoord.getValue().equals(plotCoord.getValue() ) ){ - return southernPlot; + private Map> getPlotIdsByFile(File[] selectedPlotFiles) { + final Map> plotIdsByFile = new HashMap>(); + + for (final File file : selectedPlotFiles) { + if (shouldStopFixing()) { + break; } + plotIdsByFile.put(file.getName(), getIdsInFile(file.getAbsolutePath())); } - return null; + + return plotIdsByFile; } - private boolean isSouthernPlot(CollectRecord record) { - TextAttribute plot_file = (TextAttribute) record.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ - return( plot_file!=null && plot_file.getValue().getValue().equals("southernHighlands.ced") ); //$NON-NLS-1$ - } private boolean shouldStopFixing() { return stopFix; } public void stopFixing() { - stopFix = true; + stopFix = true; } - -} \ No newline at end of file +} From c1fbe3d031ce16c28ce689ee3ddb1e7b66461d55 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:21:47 +0100 Subject: [PATCH 0022/1620] New translations FixMissingSaxaulStrataInfo.java (French) --- .../earth/app/view/Messages_fr.properties | 162 ++++-------------- 1 file changed, 30 insertions(+), 132 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 315f96ec2c..00daac5398 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,33 +1,17 @@ package org.openforis.collect.earth.app.ad_hoc; import java.io.BufferedReader; -import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Set; - -import javax.swing.JFrame; import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.view.DataFormat; -import org.openforis.collect.earth.app.view.JFileChooserExistsAware; -import org.openforis.collect.manager.RecordManager; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.CollectRecordSummary; -import org.openforis.collect.model.RecordFilter; -import org.openforis.collect.persistence.RecordPersistenceException; -import org.openforis.idm.model.TextAttribute; -import org.openforis.idm.model.TextValue; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -37,144 +21,58 @@ import com.opencsv.CSVReader; import com.opencsv.exceptions.CsvValidationException; @Component -public final class FixMissingPlotsFileInfo { +public class FixMissingSaxaulStrataInfo { - @Autowired - private RecordManager recordManager; + String saxaulPlots= "SaxaulStrataPlots.csv"; //$NON-NLS-1$ + Logger logger = LoggerFactory.getLogger(FixMissingSaxaulStrataInfo.class); @Autowired private EarthSurveyService earthSurveyService; - @Autowired - private LocalPropertiesService localPropertiesService; - - private final Logger logger = LoggerFactory.getLogger(FixMissingPlotsFileInfo.class); - - private boolean stopFix = false; - - - - public void findMissingPlots(JFrame frame) { - final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, false, true, null, - localPropertiesService, frame); - - final Map> plotIdsByFile = getPlotIdsByFile(selectedPlotFiles); - - List plotIdsWithNoRegion = getPlotsNoRegion(); - - for (CollectRecord record : plotIdsWithNoRegion) { - String plotFile = getFileNameForId( plotIdsByFile, record ); - if( plotFile != null ){ - setPlotFile( record, plotFile ); - }else{ - logger.info("No plot file found for plot with ID : " + getPlotId(record) ); //$NON-NLS-1$ - try { - recordManager.delete( record.getId() ); - } catch (RecordPersistenceException e) { - logger.error("Not able to remove plot with ID " + record.getId(), e ) ; //$NON-NLS-1$ - } - } - } - } - - private String getPlotId(CollectRecord record) { - TextAttribute plot_id = (TextAttribute) record.getNodeByPath("/plot/id"); //$NON-NLS-1$ - return plot_id.getValue().getValue(); - } - - private List getAllRecords(){ - RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); - List records = recordManager.loadSummaries( rf ); - return records; - } - - private void setPlotFile(CollectRecord record, String plotFile) { - - TextValue textValue = new TextValue( plotFile ); - recordManager.addAttribute(record.getRootEntity(), "plot_file", textValue, null, null); //$NON-NLS-1$ - - recordManager.save( record ); - logger.info("Setting record to plot_file : " + plotFile ); //$NON-NLS-1$ - - } - - private String getFileNameForId(Map> plotIdsByFile, CollectRecord record) { - - Set fileNames = plotIdsByFile.keySet(); - String plotId = getPlotId(record); - for (String filename : fileNames) { - - List plotIds = plotIdsByFile.get(filename); - for (String plotIdInFile : plotIds) { - if( plotIdInFile.equals(plotId)){ - return filename; - } - } - } - return null; - } - - private List getPlotsNoRegion() { - List plotsWithNoRegionInfo = new ArrayList(); - List allRecords = getAllRecords(); - for (CollectRecordSummary summary : allRecords) { - CollectRecord record = recordManager.load( earthSurveyService.getCollectSurvey(), summary.getId(), Step.ENTRY); - TextAttribute plot_file = (TextAttribute) record.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ - if( plot_file ==null || plot_file.getValue() == null || plot_file.getValue().getValue() == null ){ - plotsWithNoRegionInfo.add( record ); - } - } - return plotsWithNoRegionInfo; - } - - private CSVReader getCsvReader(String csvFile) throws FileNotFoundException { + protected CSVReader getCsvReader(String csvFile) throws FileNotFoundException { CSVReader reader; final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 )); //$NON-NLS-1$ reader = new CSVReader(bufferedReader); return reader; } - private List getIdsInFile(String plotCoordinateFile) { - final List plotIds = new ArrayList(); + private List getAllSaxaulIds(){ + List saxaulIds = new ArrayList(); try { - final CSVReader plotCsvReader = getCsvReader(plotCoordinateFile); + CSVReader saxaulCsvReader = getCsvReader(saxaulPlots); String[] csvRow; - while ((csvRow = plotCsvReader.readNext()) != null) { - plotIds.add(csvRow[0]); + while ((csvRow = saxaulCsvReader.readNext()) != null ) { + saxaulIds.add( csvRow[0]); } - } catch (final FileNotFoundException e) { - logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ - } catch (final IOException e) { - logger.error("Error reading CSV line", e); //$NON-NLS-1$ + } catch (FileNotFoundException e) { + logger.error("Error reading Saxaul file", e ); //$NON-NLS-1$ + } catch (IOException e) { + logger.error("Error reading CSV line", e ); //$NON-NLS-1$ } catch (CsvValidationException e) { - logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ + logger.error("Error reading Saxaul file", e ); //$NON-NLS-1$ } - return plotIds; - } - - private Map> getPlotIdsByFile(File[] selectedPlotFiles) { - final Map> plotIdsByFile = new HashMap>(); + return saxaulIds; + } - for (final File file : selectedPlotFiles) { - if (shouldStopFixing()) { - break; + public void setSaxaulStrata(){ + List allSaxaulIds = getAllSaxaulIds(); + for (String plotId : allSaxaulIds) { + if( plotId.startsWith("sax") ){ //$NON-NLS-1$ + setPlotValue(plotId,"collect_text_strata","Pure Saxaul"); //$NON-NLS-1$ //$NON-NLS-2$ + }else{ + setPlotValue(plotId,"collect_text_strata","Saxaul & Systematic"); //$NON-NLS-1$ //$NON-NLS-2$ } - plotIdsByFile.put(file.getName(), getIdsInFile(file.getAbsolutePath())); } - - return plotIdsByFile; } - - - private boolean shouldStopFixing() { - return stopFix; - } - - public void stopFixing() { - stopFix = true; - + @SuppressWarnings("deprecation") + private void setPlotValue(String plotId, String collectParameterName, String value) { + Map plotInformation = earthSurveyService.getPlacemark( new String[]{plotId},true); + if( plotInformation.get( EarthConstants.PLACEMARK_FOUND_PARAMETER ).trim().equals("true") ){ //$NON-NLS-1$ + plotInformation.put(collectParameterName, value); + earthSurveyService.storePlacemarkOld(plotInformation); + } } } From e2d42c84a06281f14833aa620e358ac9f61e93db Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:21:48 +0100 Subject: [PATCH 0023/1620] New translations FixMissingSaxaulStrataInfo.java (Spanish) --- .../earth/app/view/Messages_es.properties | 128 +++++++----------- 1 file changed, 47 insertions(+), 81 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index e62a057929..00daac5398 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,112 +1,78 @@ package org.openforis.collect.earth.app.ad_hoc; +import java.io.BufferedReader; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; +import java.util.Map; import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.manager.RecordManager; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.CollectRecordSummary; -import org.openforis.collect.model.RecordFilter; -import org.openforis.idm.model.CoordinateAttribute; -import org.openforis.idm.model.TextAttribute; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import com.opencsv.CSVReader; +import com.opencsv.exceptions.CsvValidationException; + @Component -public class FixDuplicatePlots { +public class FixMissingSaxaulStrataInfo { - @Autowired - private RecordManager recordManager; + String saxaulPlots= "SaxaulStrataPlots.csv"; //$NON-NLS-1$ + Logger logger = LoggerFactory.getLogger(FixMissingSaxaulStrataInfo.class); @Autowired private EarthSurveyService earthSurveyService; - private Logger logger = LoggerFactory.getLogger( FixDuplicatePlots.class); - - private boolean stopFix = false; - - private List getAllRecords(){ - return recordManager.loadSummaries( - new RecordFilter( - earthSurveyService.getCollectSurvey() , - EarthConstants.ROOT_ENTITY_NAME - ) ); + protected CSVReader getCsvReader(String csvFile) throws FileNotFoundException { + CSVReader reader; + final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 )); //$NON-NLS-1$ + reader = new CSVReader(bufferedReader); + return reader; } - - - public void fixHela(){ - List allRecords = getAllRecords(); - - if( shouldStopFixing()){ - return; - } - int i = 0; - for (CollectRecordSummary summaryCollectRecord : allRecords) { - if( shouldStopFixing()){ - break; - } - try { - CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); - - if( isSouthernPlot(collectRecord) ){ - recordManager.delete( collectRecord.getId() ); - i++; - - } - - } catch (Exception e) { - logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ + private List getAllSaxaulIds(){ + List saxaulIds = new ArrayList(); + try { + CSVReader saxaulCsvReader = getCsvReader(saxaulPlots); + String[] csvRow; + while ((csvRow = saxaulCsvReader.readNext()) != null ) { + saxaulIds.add( csvRow[0]); } + } catch (FileNotFoundException e) { + logger.error("Error reading Saxaul file", e ); //$NON-NLS-1$ + } catch (IOException e) { + logger.error("Error reading CSV line", e ); //$NON-NLS-1$ + } catch (CsvValidationException e) { + logger.error("Error reading Saxaul file", e ); //$NON-NLS-1$ } - logger.info("In total fixed plots " + i); //$NON-NLS-1$ - } - private List getSouthernHighlandsRecords(List allRecords) { - List southernHighlandsPlots = new ArrayList(); - - for (CollectRecord record : allRecords) { - if( record!= null ){ - CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), record.getId(), Step.ENTRY); - TextAttribute plot_file = (TextAttribute) collectRecord.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ - if( plot_file !=null && plot_file.getValue().getValue().equals("southernHighlands.ced") ){ //$NON-NLS-1$ - southernHighlandsPlots.add( collectRecord ); - } - } - } - return southernHighlandsPlots; + return saxaulIds; } - private CollectRecord findMathingCoordinatePlotInSouthern(List southernHighlandRecords, CoordinateAttribute plotCoord) { - for (CollectRecord southernPlot : southernHighlandRecords) { - - CoordinateAttribute sothernCoord = (CoordinateAttribute) southernPlot.getNodeByPath("/plot/location"); //$NON-NLS-1$ - if( sothernCoord.getValue().equals(plotCoord.getValue() ) ){ - return southernPlot; + public void setSaxaulStrata(){ + List allSaxaulIds = getAllSaxaulIds(); + for (String plotId : allSaxaulIds) { + if( plotId.startsWith("sax") ){ //$NON-NLS-1$ + setPlotValue(plotId,"collect_text_strata","Pure Saxaul"); //$NON-NLS-1$ //$NON-NLS-2$ + }else{ + setPlotValue(plotId,"collect_text_strata","Saxaul & Systematic"); //$NON-NLS-1$ //$NON-NLS-2$ } } - return null; - } - - private boolean isSouthernPlot(CollectRecord record) { - - TextAttribute plot_file = (TextAttribute) record.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ - return( plot_file!=null && plot_file.getValue().getValue().equals("southernHighlands.ced") ); //$NON-NLS-1$ - } - - private boolean shouldStopFixing() { - return stopFix; } - public void stopFixing() { - stopFix = true; - + @SuppressWarnings("deprecation") + private void setPlotValue(String plotId, String collectParameterName, String value) { + Map plotInformation = earthSurveyService.getPlacemark( new String[]{plotId},true); + if( plotInformation.get( EarthConstants.PLACEMARK_FOUND_PARAMETER ).trim().equals("true") ){ //$NON-NLS-1$ + plotInformation.put(collectParameterName, value); + earthSurveyService.storePlacemarkOld(plotInformation); + } } - -} \ No newline at end of file +} From f67de0bb62c902edc3dc49de43be7e4999cc0084 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:21:49 +0100 Subject: [PATCH 0024/1620] New translations FixMissingSaxaulStrataInfo.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 73 ++++++++++++++++++- 1 file changed, 69 insertions(+), 4 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index c36b2d4338..00daac5398 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,13 +1,78 @@ package org.openforis.collect.earth.app.ad_hoc; +import java.io.BufferedReader; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import com.opencsv.CSVReader; +import com.opencsv.exceptions.CsvValidationException; + @Component -public class FixCoordinatesMongolia extends FixCoordinates { +public class FixMissingSaxaulStrataInfo { + + String saxaulPlots= "SaxaulStrataPlots.csv"; //$NON-NLS-1$ + Logger logger = LoggerFactory.getLogger(FixMissingSaxaulStrataInfo.class); - @Override - protected int getLongitudeLimit() { - return 87; + @Autowired + private EarthSurveyService earthSurveyService; + + protected CSVReader getCsvReader(String csvFile) throws FileNotFoundException { + CSVReader reader; + final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 )); //$NON-NLS-1$ + reader = new CSVReader(bufferedReader); + return reader; } + private List getAllSaxaulIds(){ + List saxaulIds = new ArrayList(); + try { + CSVReader saxaulCsvReader = getCsvReader(saxaulPlots); + String[] csvRow; + while ((csvRow = saxaulCsvReader.readNext()) != null ) { + saxaulIds.add( csvRow[0]); + } + } catch (FileNotFoundException e) { + logger.error("Error reading Saxaul file", e ); //$NON-NLS-1$ + } catch (IOException e) { + logger.error("Error reading CSV line", e ); //$NON-NLS-1$ + } catch (CsvValidationException e) { + logger.error("Error reading Saxaul file", e ); //$NON-NLS-1$ + } + + + return saxaulIds; + } + + public void setSaxaulStrata(){ + List allSaxaulIds = getAllSaxaulIds(); + for (String plotId : allSaxaulIds) { + if( plotId.startsWith("sax") ){ //$NON-NLS-1$ + setPlotValue(plotId,"collect_text_strata","Pure Saxaul"); //$NON-NLS-1$ //$NON-NLS-2$ + }else{ + setPlotValue(plotId,"collect_text_strata","Saxaul & Systematic"); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + } + + @SuppressWarnings("deprecation") + private void setPlotValue(String plotId, String collectParameterName, String value) { + Map plotInformation = earthSurveyService.getPlacemark( new String[]{plotId},true); + if( plotInformation.get( EarthConstants.PLACEMARK_FOUND_PARAMETER ).trim().equals("true") ){ //$NON-NLS-1$ + plotInformation.put(collectParameterName, value); + earthSurveyService.storePlacemarkOld(plotInformation); + } + } } From 05b0425f4023b53d6a6373a96967b6da43356242 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:21:50 +0100 Subject: [PATCH 0025/1620] New translations FixMissingSaxaulStrataInfo.java (English) --- .../earth/app/view/Messages_en.properties | 162 ++++-------------- 1 file changed, 30 insertions(+), 132 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 315f96ec2c..00daac5398 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,33 +1,17 @@ package org.openforis.collect.earth.app.ad_hoc; import java.io.BufferedReader; -import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Set; - -import javax.swing.JFrame; import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.view.DataFormat; -import org.openforis.collect.earth.app.view.JFileChooserExistsAware; -import org.openforis.collect.manager.RecordManager; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.CollectRecordSummary; -import org.openforis.collect.model.RecordFilter; -import org.openforis.collect.persistence.RecordPersistenceException; -import org.openforis.idm.model.TextAttribute; -import org.openforis.idm.model.TextValue; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -37,144 +21,58 @@ import com.opencsv.CSVReader; import com.opencsv.exceptions.CsvValidationException; @Component -public final class FixMissingPlotsFileInfo { +public class FixMissingSaxaulStrataInfo { - @Autowired - private RecordManager recordManager; + String saxaulPlots= "SaxaulStrataPlots.csv"; //$NON-NLS-1$ + Logger logger = LoggerFactory.getLogger(FixMissingSaxaulStrataInfo.class); @Autowired private EarthSurveyService earthSurveyService; - @Autowired - private LocalPropertiesService localPropertiesService; - - private final Logger logger = LoggerFactory.getLogger(FixMissingPlotsFileInfo.class); - - private boolean stopFix = false; - - - - public void findMissingPlots(JFrame frame) { - final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, false, true, null, - localPropertiesService, frame); - - final Map> plotIdsByFile = getPlotIdsByFile(selectedPlotFiles); - - List plotIdsWithNoRegion = getPlotsNoRegion(); - - for (CollectRecord record : plotIdsWithNoRegion) { - String plotFile = getFileNameForId( plotIdsByFile, record ); - if( plotFile != null ){ - setPlotFile( record, plotFile ); - }else{ - logger.info("No plot file found for plot with ID : " + getPlotId(record) ); //$NON-NLS-1$ - try { - recordManager.delete( record.getId() ); - } catch (RecordPersistenceException e) { - logger.error("Not able to remove plot with ID " + record.getId(), e ) ; //$NON-NLS-1$ - } - } - } - } - - private String getPlotId(CollectRecord record) { - TextAttribute plot_id = (TextAttribute) record.getNodeByPath("/plot/id"); //$NON-NLS-1$ - return plot_id.getValue().getValue(); - } - - private List getAllRecords(){ - RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); - List records = recordManager.loadSummaries( rf ); - return records; - } - - private void setPlotFile(CollectRecord record, String plotFile) { - - TextValue textValue = new TextValue( plotFile ); - recordManager.addAttribute(record.getRootEntity(), "plot_file", textValue, null, null); //$NON-NLS-1$ - - recordManager.save( record ); - logger.info("Setting record to plot_file : " + plotFile ); //$NON-NLS-1$ - - } - - private String getFileNameForId(Map> plotIdsByFile, CollectRecord record) { - - Set fileNames = plotIdsByFile.keySet(); - String plotId = getPlotId(record); - for (String filename : fileNames) { - - List plotIds = plotIdsByFile.get(filename); - for (String plotIdInFile : plotIds) { - if( plotIdInFile.equals(plotId)){ - return filename; - } - } - } - return null; - } - - private List getPlotsNoRegion() { - List plotsWithNoRegionInfo = new ArrayList(); - List allRecords = getAllRecords(); - for (CollectRecordSummary summary : allRecords) { - CollectRecord record = recordManager.load( earthSurveyService.getCollectSurvey(), summary.getId(), Step.ENTRY); - TextAttribute plot_file = (TextAttribute) record.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ - if( plot_file ==null || plot_file.getValue() == null || plot_file.getValue().getValue() == null ){ - plotsWithNoRegionInfo.add( record ); - } - } - return plotsWithNoRegionInfo; - } - - private CSVReader getCsvReader(String csvFile) throws FileNotFoundException { + protected CSVReader getCsvReader(String csvFile) throws FileNotFoundException { CSVReader reader; final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 )); //$NON-NLS-1$ reader = new CSVReader(bufferedReader); return reader; } - private List getIdsInFile(String plotCoordinateFile) { - final List plotIds = new ArrayList(); + private List getAllSaxaulIds(){ + List saxaulIds = new ArrayList(); try { - final CSVReader plotCsvReader = getCsvReader(plotCoordinateFile); + CSVReader saxaulCsvReader = getCsvReader(saxaulPlots); String[] csvRow; - while ((csvRow = plotCsvReader.readNext()) != null) { - plotIds.add(csvRow[0]); + while ((csvRow = saxaulCsvReader.readNext()) != null ) { + saxaulIds.add( csvRow[0]); } - } catch (final FileNotFoundException e) { - logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ - } catch (final IOException e) { - logger.error("Error reading CSV line", e); //$NON-NLS-1$ + } catch (FileNotFoundException e) { + logger.error("Error reading Saxaul file", e ); //$NON-NLS-1$ + } catch (IOException e) { + logger.error("Error reading CSV line", e ); //$NON-NLS-1$ } catch (CsvValidationException e) { - logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ + logger.error("Error reading Saxaul file", e ); //$NON-NLS-1$ } - return plotIds; - } - - private Map> getPlotIdsByFile(File[] selectedPlotFiles) { - final Map> plotIdsByFile = new HashMap>(); + return saxaulIds; + } - for (final File file : selectedPlotFiles) { - if (shouldStopFixing()) { - break; + public void setSaxaulStrata(){ + List allSaxaulIds = getAllSaxaulIds(); + for (String plotId : allSaxaulIds) { + if( plotId.startsWith("sax") ){ //$NON-NLS-1$ + setPlotValue(plotId,"collect_text_strata","Pure Saxaul"); //$NON-NLS-1$ //$NON-NLS-2$ + }else{ + setPlotValue(plotId,"collect_text_strata","Saxaul & Systematic"); //$NON-NLS-1$ //$NON-NLS-2$ } - plotIdsByFile.put(file.getName(), getIdsInFile(file.getAbsolutePath())); } - - return plotIdsByFile; } - - - private boolean shouldStopFixing() { - return stopFix; - } - - public void stopFixing() { - stopFix = true; - + @SuppressWarnings("deprecation") + private void setPlotValue(String plotId, String collectParameterName, String value) { + Map plotInformation = earthSurveyService.getPlacemark( new String[]{plotId},true); + if( plotInformation.get( EarthConstants.PLACEMARK_FOUND_PARAMETER ).trim().equals("true") ){ //$NON-NLS-1$ + plotInformation.put(collectParameterName, value); + earthSurveyService.storePlacemarkOld(plotInformation); + } } } From 6cd22668031143090cf2e8406ce995f85ceb7bfe Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:21:51 +0100 Subject: [PATCH 0026/1620] New translations FixOtherLand.java (French) --- .../earth/app/view/Messages_fr.properties | 104 +++++++++--------- 1 file changed, 53 insertions(+), 51 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 00daac5398..6e034a1981 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,78 +1,80 @@ package org.openforis.collect.earth.app.ad_hoc; -import java.io.BufferedReader; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; import java.util.List; -import java.util.Map; import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.manager.RecordManager; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.CollectRecordSummary; +import org.openforis.collect.model.RecordFilter; +import org.openforis.idm.model.Coordinate; +import org.openforis.idm.model.CoordinateAttribute; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.opencsv.CSVReader; -import com.opencsv.exceptions.CsvValidationException; - @Component -public class FixMissingSaxaulStrataInfo { +public abstract class FixOtherLand { - String saxaulPlots= "SaxaulStrataPlots.csv"; //$NON-NLS-1$ - Logger logger = LoggerFactory.getLogger(FixMissingSaxaulStrataInfo.class); + @Autowired + private RecordManager recordManager; @Autowired private EarthSurveyService earthSurveyService; - protected CSVReader getCsvReader(String csvFile) throws FileNotFoundException { - CSVReader reader; - final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 )); //$NON-NLS-1$ - reader = new CSVReader(bufferedReader); - return reader; + private Logger logger = LoggerFactory.getLogger( FixOtherLand.class); + + private boolean stopFix = false; + + private List getAllRecords(){ + RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); + List records = recordManager.loadSummaries( rf ); + return records; } - private List getAllSaxaulIds(){ - List saxaulIds = new ArrayList(); - try { - CSVReader saxaulCsvReader = getCsvReader(saxaulPlots); - String[] csvRow; - while ((csvRow = saxaulCsvReader.readNext()) != null ) { - saxaulIds.add( csvRow[0]); - } - } catch (FileNotFoundException e) { - logger.error("Error reading Saxaul file", e ); //$NON-NLS-1$ - } catch (IOException e) { - logger.error("Error reading CSV line", e ); //$NON-NLS-1$ - } catch (CsvValidationException e) { - logger.error("Error reading Saxaul file", e ); //$NON-NLS-1$ + public void fixCoordinates(){ + List allRecords = getAllRecords(); + + if( shouldStopFixing()){ + return; } + + for (CollectRecordSummary summaryCollectRecord : allRecords) { + if( shouldStopFixing()){ + break; + } + try { + CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); + CoordinateAttribute plotCoord = (CoordinateAttribute) collectRecord.getNodeByPath("/plot/location"); //$NON-NLS-1$ + if( plotCoord != null && plotCoord.getValue() != null ){ + if( plotCoord.getValue().getX() < getLongitudeLimit() ){ + Coordinate coordinate = new Coordinate(plotCoord.getValue().getY(), plotCoord.getValue().getX(), plotCoord.getValue().getSrsId() ); + plotCoord.setValue( coordinate ); + recordManager.save( collectRecord ); + + } - return saxaulIds; - } - - public void setSaxaulStrata(){ - List allSaxaulIds = getAllSaxaulIds(); - for (String plotId : allSaxaulIds) { - if( plotId.startsWith("sax") ){ //$NON-NLS-1$ - setPlotValue(plotId,"collect_text_strata","Pure Saxaul"); //$NON-NLS-1$ //$NON-NLS-2$ - }else{ - setPlotValue(plotId,"collect_text_strata","Saxaul & Systematic"); //$NON-NLS-1$ //$NON-NLS-2$ + } + } catch (Exception e) { + logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ } } + } - @SuppressWarnings("deprecation") - private void setPlotValue(String plotId, String collectParameterName, String value) { - Map plotInformation = earthSurveyService.getPlacemark( new String[]{plotId},true); - if( plotInformation.get( EarthConstants.PLACEMARK_FOUND_PARAMETER ).trim().equals("true") ){ //$NON-NLS-1$ - plotInformation.put(collectParameterName, value); - earthSurveyService.storePlacemarkOld(plotInformation); - } + protected abstract int getLongitudeLimit(); + + private boolean shouldStopFixing() { + return stopFix; } -} + + public void stopFixing() { + stopFix = true; + + } + +} \ No newline at end of file From 8fec0f0b3047af1baf745d0446a2ba46cbfef933 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:21:52 +0100 Subject: [PATCH 0027/1620] New translations FixOtherLand.java (Spanish) --- .../earth/app/view/Messages_es.properties | 104 +++++++++--------- 1 file changed, 53 insertions(+), 51 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 00daac5398..6e034a1981 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,78 +1,80 @@ package org.openforis.collect.earth.app.ad_hoc; -import java.io.BufferedReader; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; import java.util.List; -import java.util.Map; import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.manager.RecordManager; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.CollectRecordSummary; +import org.openforis.collect.model.RecordFilter; +import org.openforis.idm.model.Coordinate; +import org.openforis.idm.model.CoordinateAttribute; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.opencsv.CSVReader; -import com.opencsv.exceptions.CsvValidationException; - @Component -public class FixMissingSaxaulStrataInfo { +public abstract class FixOtherLand { - String saxaulPlots= "SaxaulStrataPlots.csv"; //$NON-NLS-1$ - Logger logger = LoggerFactory.getLogger(FixMissingSaxaulStrataInfo.class); + @Autowired + private RecordManager recordManager; @Autowired private EarthSurveyService earthSurveyService; - protected CSVReader getCsvReader(String csvFile) throws FileNotFoundException { - CSVReader reader; - final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 )); //$NON-NLS-1$ - reader = new CSVReader(bufferedReader); - return reader; + private Logger logger = LoggerFactory.getLogger( FixOtherLand.class); + + private boolean stopFix = false; + + private List getAllRecords(){ + RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); + List records = recordManager.loadSummaries( rf ); + return records; } - private List getAllSaxaulIds(){ - List saxaulIds = new ArrayList(); - try { - CSVReader saxaulCsvReader = getCsvReader(saxaulPlots); - String[] csvRow; - while ((csvRow = saxaulCsvReader.readNext()) != null ) { - saxaulIds.add( csvRow[0]); - } - } catch (FileNotFoundException e) { - logger.error("Error reading Saxaul file", e ); //$NON-NLS-1$ - } catch (IOException e) { - logger.error("Error reading CSV line", e ); //$NON-NLS-1$ - } catch (CsvValidationException e) { - logger.error("Error reading Saxaul file", e ); //$NON-NLS-1$ + public void fixCoordinates(){ + List allRecords = getAllRecords(); + + if( shouldStopFixing()){ + return; } + + for (CollectRecordSummary summaryCollectRecord : allRecords) { + if( shouldStopFixing()){ + break; + } + try { + CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); + CoordinateAttribute plotCoord = (CoordinateAttribute) collectRecord.getNodeByPath("/plot/location"); //$NON-NLS-1$ + if( plotCoord != null && plotCoord.getValue() != null ){ + if( plotCoord.getValue().getX() < getLongitudeLimit() ){ + Coordinate coordinate = new Coordinate(plotCoord.getValue().getY(), plotCoord.getValue().getX(), plotCoord.getValue().getSrsId() ); + plotCoord.setValue( coordinate ); + recordManager.save( collectRecord ); + + } - return saxaulIds; - } - - public void setSaxaulStrata(){ - List allSaxaulIds = getAllSaxaulIds(); - for (String plotId : allSaxaulIds) { - if( plotId.startsWith("sax") ){ //$NON-NLS-1$ - setPlotValue(plotId,"collect_text_strata","Pure Saxaul"); //$NON-NLS-1$ //$NON-NLS-2$ - }else{ - setPlotValue(plotId,"collect_text_strata","Saxaul & Systematic"); //$NON-NLS-1$ //$NON-NLS-2$ + } + } catch (Exception e) { + logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ } } + } - @SuppressWarnings("deprecation") - private void setPlotValue(String plotId, String collectParameterName, String value) { - Map plotInformation = earthSurveyService.getPlacemark( new String[]{plotId},true); - if( plotInformation.get( EarthConstants.PLACEMARK_FOUND_PARAMETER ).trim().equals("true") ){ //$NON-NLS-1$ - plotInformation.put(collectParameterName, value); - earthSurveyService.storePlacemarkOld(plotInformation); - } + protected abstract int getLongitudeLimit(); + + private boolean shouldStopFixing() { + return stopFix; } -} + + public void stopFixing() { + stopFix = true; + + } + +} \ No newline at end of file From baaed44243a2284ec3192b84db4e135c7d3ff57b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:21:53 +0100 Subject: [PATCH 0028/1620] New translations FixOtherLand.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 104 +++++++++--------- 1 file changed, 53 insertions(+), 51 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 00daac5398..6e034a1981 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,78 +1,80 @@ package org.openforis.collect.earth.app.ad_hoc; -import java.io.BufferedReader; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; import java.util.List; -import java.util.Map; import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.manager.RecordManager; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.CollectRecordSummary; +import org.openforis.collect.model.RecordFilter; +import org.openforis.idm.model.Coordinate; +import org.openforis.idm.model.CoordinateAttribute; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.opencsv.CSVReader; -import com.opencsv.exceptions.CsvValidationException; - @Component -public class FixMissingSaxaulStrataInfo { +public abstract class FixOtherLand { - String saxaulPlots= "SaxaulStrataPlots.csv"; //$NON-NLS-1$ - Logger logger = LoggerFactory.getLogger(FixMissingSaxaulStrataInfo.class); + @Autowired + private RecordManager recordManager; @Autowired private EarthSurveyService earthSurveyService; - protected CSVReader getCsvReader(String csvFile) throws FileNotFoundException { - CSVReader reader; - final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 )); //$NON-NLS-1$ - reader = new CSVReader(bufferedReader); - return reader; + private Logger logger = LoggerFactory.getLogger( FixOtherLand.class); + + private boolean stopFix = false; + + private List getAllRecords(){ + RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); + List records = recordManager.loadSummaries( rf ); + return records; } - private List getAllSaxaulIds(){ - List saxaulIds = new ArrayList(); - try { - CSVReader saxaulCsvReader = getCsvReader(saxaulPlots); - String[] csvRow; - while ((csvRow = saxaulCsvReader.readNext()) != null ) { - saxaulIds.add( csvRow[0]); - } - } catch (FileNotFoundException e) { - logger.error("Error reading Saxaul file", e ); //$NON-NLS-1$ - } catch (IOException e) { - logger.error("Error reading CSV line", e ); //$NON-NLS-1$ - } catch (CsvValidationException e) { - logger.error("Error reading Saxaul file", e ); //$NON-NLS-1$ + public void fixCoordinates(){ + List allRecords = getAllRecords(); + + if( shouldStopFixing()){ + return; } + + for (CollectRecordSummary summaryCollectRecord : allRecords) { + if( shouldStopFixing()){ + break; + } + try { + CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); + CoordinateAttribute plotCoord = (CoordinateAttribute) collectRecord.getNodeByPath("/plot/location"); //$NON-NLS-1$ + if( plotCoord != null && plotCoord.getValue() != null ){ + if( plotCoord.getValue().getX() < getLongitudeLimit() ){ + Coordinate coordinate = new Coordinate(plotCoord.getValue().getY(), plotCoord.getValue().getX(), plotCoord.getValue().getSrsId() ); + plotCoord.setValue( coordinate ); + recordManager.save( collectRecord ); + + } - return saxaulIds; - } - - public void setSaxaulStrata(){ - List allSaxaulIds = getAllSaxaulIds(); - for (String plotId : allSaxaulIds) { - if( plotId.startsWith("sax") ){ //$NON-NLS-1$ - setPlotValue(plotId,"collect_text_strata","Pure Saxaul"); //$NON-NLS-1$ //$NON-NLS-2$ - }else{ - setPlotValue(plotId,"collect_text_strata","Saxaul & Systematic"); //$NON-NLS-1$ //$NON-NLS-2$ + } + } catch (Exception e) { + logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ } } + } - @SuppressWarnings("deprecation") - private void setPlotValue(String plotId, String collectParameterName, String value) { - Map plotInformation = earthSurveyService.getPlacemark( new String[]{plotId},true); - if( plotInformation.get( EarthConstants.PLACEMARK_FOUND_PARAMETER ).trim().equals("true") ){ //$NON-NLS-1$ - plotInformation.put(collectParameterName, value); - earthSurveyService.storePlacemarkOld(plotInformation); - } + protected abstract int getLongitudeLimit(); + + private boolean shouldStopFixing() { + return stopFix; } -} + + public void stopFixing() { + stopFix = true; + + } + +} \ No newline at end of file From b00d010eb03f63756e9ee6527b00ea105f72988c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:21:56 +0100 Subject: [PATCH 0029/1620] New translations FixOtherLand.java (English) --- .../earth/app/view/Messages_en.properties | 104 +++++++++--------- 1 file changed, 53 insertions(+), 51 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 00daac5398..6e034a1981 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,78 +1,80 @@ package org.openforis.collect.earth.app.ad_hoc; -import java.io.BufferedReader; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; import java.util.List; -import java.util.Map; import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.manager.RecordManager; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.CollectRecordSummary; +import org.openforis.collect.model.RecordFilter; +import org.openforis.idm.model.Coordinate; +import org.openforis.idm.model.CoordinateAttribute; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.opencsv.CSVReader; -import com.opencsv.exceptions.CsvValidationException; - @Component -public class FixMissingSaxaulStrataInfo { +public abstract class FixOtherLand { - String saxaulPlots= "SaxaulStrataPlots.csv"; //$NON-NLS-1$ - Logger logger = LoggerFactory.getLogger(FixMissingSaxaulStrataInfo.class); + @Autowired + private RecordManager recordManager; @Autowired private EarthSurveyService earthSurveyService; - protected CSVReader getCsvReader(String csvFile) throws FileNotFoundException { - CSVReader reader; - final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 )); //$NON-NLS-1$ - reader = new CSVReader(bufferedReader); - return reader; + private Logger logger = LoggerFactory.getLogger( FixOtherLand.class); + + private boolean stopFix = false; + + private List getAllRecords(){ + RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); + List records = recordManager.loadSummaries( rf ); + return records; } - private List getAllSaxaulIds(){ - List saxaulIds = new ArrayList(); - try { - CSVReader saxaulCsvReader = getCsvReader(saxaulPlots); - String[] csvRow; - while ((csvRow = saxaulCsvReader.readNext()) != null ) { - saxaulIds.add( csvRow[0]); - } - } catch (FileNotFoundException e) { - logger.error("Error reading Saxaul file", e ); //$NON-NLS-1$ - } catch (IOException e) { - logger.error("Error reading CSV line", e ); //$NON-NLS-1$ - } catch (CsvValidationException e) { - logger.error("Error reading Saxaul file", e ); //$NON-NLS-1$ + public void fixCoordinates(){ + List allRecords = getAllRecords(); + + if( shouldStopFixing()){ + return; } + + for (CollectRecordSummary summaryCollectRecord : allRecords) { + if( shouldStopFixing()){ + break; + } + try { + CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); + CoordinateAttribute plotCoord = (CoordinateAttribute) collectRecord.getNodeByPath("/plot/location"); //$NON-NLS-1$ + if( plotCoord != null && plotCoord.getValue() != null ){ + if( plotCoord.getValue().getX() < getLongitudeLimit() ){ + Coordinate coordinate = new Coordinate(plotCoord.getValue().getY(), plotCoord.getValue().getX(), plotCoord.getValue().getSrsId() ); + plotCoord.setValue( coordinate ); + recordManager.save( collectRecord ); + + } - return saxaulIds; - } - - public void setSaxaulStrata(){ - List allSaxaulIds = getAllSaxaulIds(); - for (String plotId : allSaxaulIds) { - if( plotId.startsWith("sax") ){ //$NON-NLS-1$ - setPlotValue(plotId,"collect_text_strata","Pure Saxaul"); //$NON-NLS-1$ //$NON-NLS-2$ - }else{ - setPlotValue(plotId,"collect_text_strata","Saxaul & Systematic"); //$NON-NLS-1$ //$NON-NLS-2$ + } + } catch (Exception e) { + logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ } } + } - @SuppressWarnings("deprecation") - private void setPlotValue(String plotId, String collectParameterName, String value) { - Map plotInformation = earthSurveyService.getPlacemark( new String[]{plotId},true); - if( plotInformation.get( EarthConstants.PLACEMARK_FOUND_PARAMETER ).trim().equals("true") ){ //$NON-NLS-1$ - plotInformation.put(collectParameterName, value); - earthSurveyService.storePlacemarkOld(plotInformation); - } + protected abstract int getLongitudeLimit(); + + private boolean shouldStopFixing() { + return stopFix; } -} + + public void stopFixing() { + stopFix = true; + + } + +} \ No newline at end of file From c643b0268d4bc61c1084a4adc0f0b66a7ff5243e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:21:57 +0100 Subject: [PATCH 0030/1620] New translations findMissingCountries.java (French) --- .../earth/app/view/Messages_fr.properties | 1975 ++++++++++++++++- 1 file changed, 1895 insertions(+), 80 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 6e034a1981..768f973a7f 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,80 +1,1895 @@ -package org.openforis.collect.earth.app.ad_hoc; - -import java.util.List; - -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.manager.RecordManager; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.CollectRecordSummary; -import org.openforis.collect.model.RecordFilter; -import org.openforis.idm.model.Coordinate; -import org.openforis.idm.model.CoordinateAttribute; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public abstract class FixOtherLand { - - @Autowired - private RecordManager recordManager; - - @Autowired - private EarthSurveyService earthSurveyService; - - private Logger logger = LoggerFactory.getLogger( FixOtherLand.class); - - private boolean stopFix = false; - - private List getAllRecords(){ - RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); - List records = recordManager.loadSummaries( rf ); - return records; - } - - public void fixCoordinates(){ - List allRecords = getAllRecords(); - - if( shouldStopFixing()){ - return; - } - - for (CollectRecordSummary summaryCollectRecord : allRecords) { - if( shouldStopFixing()){ - break; - } - try { - CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); - CoordinateAttribute plotCoord = (CoordinateAttribute) collectRecord.getNodeByPath("/plot/location"); //$NON-NLS-1$ - if( plotCoord != null && plotCoord.getValue() != null ){ - if( plotCoord.getValue().getX() < getLongitudeLimit() ){ - Coordinate coordinate = new Coordinate(plotCoord.getValue().getY(), plotCoord.getValue().getX(), plotCoord.getValue().getSrsId() ); - plotCoord.setValue( coordinate ); - recordManager.save( collectRecord ); - - } - - - } - } catch (Exception e) { - logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ - } - } - - } - - protected abstract int getLongitudeLimit(); - - private boolean shouldStopFixing() { - return stopFix; - } - - public void stopFixing() { - stopFix = true; - - } - -} \ No newline at end of file +package org.openforis.collect.earth.app.ad_hoc; + +import java.util.ArrayList; +import java.util.Arrays; + +public class findMissingCountries { + + private static ArrayList allCountryNames = new ArrayList<>( + Arrays.asList( + "Abyei", + "Afghanistan", + "Aksai_Chin", + "Albania", + "Algeria", + "American_Samoa", + "Andorra", + "Angola", + "Anguilla", + "Antarctica", + "Antigua_and_Barbuda", + "Argentina", + "Armenia", + "Aruba", + "Arunachal_Pradesh", + "Ashmore_and_Cartier_Islands", + "Australia", + "Austria", + "Azerbaijan", + "Azores_Islands", + "Bahamas", + "Bahrain", + "Baker_Island", + "Bangladesh", + "Barbados", + "Bassas_da_India", + "Belarus", + "Belgium", + "Belize", + "Benin", + "Bermuda", + "Bhutan", + "Bird_Island", + "Bolivia", + "Bosnia_and_Herzegovina", + "Botswana", + "Bouvet_Island", + "Brazil", + "British_Indian_Ocean_Territory", + "British_Virgin_Islands", + "Brunei_Darussalam", + "Bulgaria", + "Burkina_Faso", + "Burundi", + "Cambodia", + "Cameroon", + "Canada", + "Cape_Verde", + "Cayman_Islands", + "Central_African_Republic", + "Chad", + "Chile", + "China", + "China/India", + "Christmas_Island", + "Clipperton_Island", + "Cocos__Keeling__Islands", + "Colombia", + "Comoros", + "Congo", + "Cook_Islands", + "Costa_Rica", + "Croatia", + "Cuba", + "Cyprus", + "Czech_Republic", + "C�te_d_Ivoire", + "Dem_People_s_Rep_of_Korea", + "Democratic_Republic_of_the_Congo", + "Denmark", + "Djibouti", + "Dominica", + "Dominican_Republic", + "Ecuador", + "Egypt", + "El_Salvador", + "Equatorial_Guinea", + "Eritrea", + "Estonia", + "Ethiopia", + "Europa_Island", + "Falkland_Islands__Malvinas_", + "Faroe_Islands", + "Fiji", + "Finland", + "France", + "French_Guiana", + "French_Polynesia", + "French_Southern_and_Antarctic_Territories", + "Gabon", + "Gambia", + "Gaza_Strip", + "Georgia", + "Germany", + "Ghana", + "Gibraltar", + "Glorioso_Island", + "Greece", + "Greenland", + "Grenada", + "Guadeloupe", + "Guam", + "Guatemala", + "Guernsey", + "Guinea", + "Guinea-Bissau", + "Guyana", + "Haiti", + "Hala_ib_triangle", + "Heard_Island_and_McDonald_Islands", + "Holy_See", + "Honduras", + "Hong_Kong", + "Howland_Island", + "Hungary", + "Iceland", + "Ilemi_triangle", + "India", + "Indonesia", + "Iran___Islamic_Republic_of_", + "Iraq", + "Ireland", + "Isle_of_Man", + "Israel", + "Italy", + "Jamaica", + "Jammu_and_Kashmir", + "Japan", + "Jarvis_Island", + "Jersey", + "Johnston_Atoll", + "Jordan", + "Juan_de_Nova_Island", + "Kazakhstan", + "Kenya", + "Kingman_Reef", + "Kiribati", + "Kuril_islands", + "Kuwait", + "Kyrgyzstan", + "Lao_People_s_Democratic_Republic", + "Latvia", + "Lebanon", + "Lesotho", + "Liberia", + "Libya", + "Liechtenstein", + "Lithuania", + "Luxembourg", + "Ma_tan_al-Sarra", + "Macau", + "Madagascar", + "Madeira_Islands", + "Malawi", + "Malaysia", + "Maldives", + "Mali", + "Malta", + "Marshall_Islands", + "Martinique", + "Mauritania", + "Mauritius", + "Mayotte", + "Mexico", + "Micronesia__Federated_States_of_", + "Midway_Island", + "Moldova,_Republic_of", + "Monaco", + "Mongolia", + "Montenegro", + "Montserrat", + "Morocco", + "Mozambique", + "Myanmar", + "Namibia", + "Nauru", + "Navassa_Island", + "Nepal", + "Netherlands", + "Netherlands_Antilles", + "New_Caledonia", + "New_Zealand", + "Nicaragua", + "Niger", + "Nigeria", + "Niue", + "Norfolk_Island", + "Northern_Mariana_Islands", + "Norway", + "Oman", + "Pakistan", + "Palau", + "Palmyra_Atoll", + "Panama", + "Papua_New_Guinea", + "Paracel_Islands", + "Paraguay", + "Peru", + "Philippines", + "Pitcairn", + "Poland", + "Portugal", + "Puerto_Rico", + "Qatar", + "Republic_of_Korea", + "Romania", + "Russian_Federation", + "Rwanda", + "R�union", + "Saint_Helena", + "Saint_Kitts_and_Nevis", + "Saint_Lucia", + "Saint_Pierre_et_Miquelon", + "Saint_Vincent_and_the_Grenadines", + "Samoa", + "San_Marino", + "Sao_Tome_and_Principe", + "Saudi_Arabia", + "Scarborough_Reef", + "Senegal", + "Senkaku_Islands", + "Serbia", + "Seychelles", + "Sierra_Leone", + "Singapore", + "Slovakia", + "Slovenia", + "Solomon_Islands", + "Somalia", + "South_Africa", + "South_Georgia_and_the_South_Sandwich_Islands", + "South_Sudan", + "Spain", + "Spratly_Islands", + "Sri_Lanka", + "Sudan", + "Suriname", + "Svalbard_and_Jan_Mayen_Islands", + "Swaziland", + "Sweden", + "Switzerland", + "Syrian_Arab_Republic", + "Taiwan", + "Tajikistan", + "Thailand", + "The_former_Yugoslav_Republic_of_Macedonia", + "Timor-Leste", + "Togo", + "Tokelau", + "Tonga", + "Trinidad_and_Tobago", + "Tromelin_Island", + "Tunisia", + "Turkey", + "Turkmenistan", + "Turks_and_Caicos_islands", + "Tuvalu", + "UK_of_Great_Britain_and_Northern_Ireland", + "Uganda", + "Ukraine", + "United_Arab_Emirates", + "United_Republic_of_Tanzania", + "United_States_Virgin_Islands", + "United_States_of_America", + "Uruguay", + "Uzbekistan", + "Vanuatu", + "Venezuela", + "Viet_Nam", + "Wake_Island", + "Wallis_and_Futuna", + "West_Bank", + "Western_Sahara", + "Yemen", + "Zambia", + "Zimbabwe" ) ); + + private static ArrayList filesGenerated = new ArrayList<>( + Arrays.asList( "Azores_Islands_bassin_10", + "Azores_Islands_bassin_11", + "Azores_Islands_bassin_12", + "Azores_Islands", + "Azores_Islands_bassin_5", + "Azores_Islands_bassin_6", + "Azores_Islands_bassin_7", + "Azores_Islands_bassin_8", + "Azores_Islands_bassin_9", + "Brunei_Darussalam_bassin_10", + "Brunei_Darussalam_bassin_11", + "Brunei_Darussalam_bassin_12", + "Brunei_Darussalam_bassin_7", + "Brunei_Darussalam_bassin_8", + "Brunei_Darussalam_bassin_9", + "Bulgaria_bassin_10", + "Bulgaria_bassin_11", + "Bulgaria_bassin_12", + "Bulgaria", + "Bulgaria_bassin_5", + "Bulgaria_bassin_6", + "Bulgaria_bassin_7", + "Bulgaria_bassin_8", + "Bulgaria_bassin_9", + "Burkina_Faso_bassin_10", + "Burkina_Faso_bassin_11", + "Burkina_Faso_bassin_12", + "Burkina_Faso", + "Burkina_Faso_bassin_5", + "Burkina_Faso_bassin_6", + "Burkina_Faso_bassin_7", + "Burkina_Faso_bassin_8", + "Burkina_Faso_bassin_9", + "Burundi_bassin_10", + "Burundi_bassin_11", + "Burundi_bassin_12", + "Burundi", + "Burundi_bassin_5", + "Burundi_bassin_6", + "Burundi_bassin_7", + "Burundi_bassin_8", + "Burundi_bassin_9", + "Cambodia_bassin_10", + "Cambodia_bassin_11", + "Cambodia_bassin_12", + "Cambodia", + "Cambodia_bassin_5", + "Cambodia_bassin_6", + "Cambodia_bassin_7", + "Cambodia_bassin_8", + "Cambodia_bassin_9", + "Cameroon_bassin_10", + "Cameroon_bassin_11", + "Cameroon_bassin_12", + "Cameroon", + "Cameroon_bassin_5", + "Cameroon_bassin_6", + "Cameroon_bassin_7", + "Cameroon_bassin_8", + "Cameroon_bassin_9", + "Canada_bassin_10", + "Canada_bassin_11", + "Canada_bassin_12", + "Canada", + "Canada_bassin_5", + "Canada_bassin_6", + "Canada_bassin_7", + "Canada_bassin_8", + "Canada_bassin_9", + "Cape_Verde_bassin_10", + "Cape_Verde_bassin_11", + "Cape_Verde_bassin_12", + "Cape_Verde", + "Cape_Verde_bassin_5", + "Cape_Verde_bassin_6", + "Cape_Verde_bassin_7", + "Cape_Verde_bassin_8", + "Cape_Verde_bassin_9", + "Cayman_Islands_bassin_10", + "Cayman_Islands_bassin_11", + "Cayman_Islands_bassin_12", + "Cayman_Islands", + "Cayman_Islands_bassin_5", + "Cayman_Islands_bassin_6", + "Cayman_Islands_bassin_7", + "Cayman_Islands_bassin_8", + "Cayman_Islands_bassin_9", + "Central_African Republic_bassin_10", + "Central_African Republic_bassin_11", + "Central_African Republic_bassin_12", + "Central_African Republic", + "Central_African Republic_bassin_5", + "Central_African Republic_bassin_6", + "Central_African Republic_bassin_7", + "Central_African Republic_bassin_8", + "Central_African Republic_bassin_9", + "Chad_bassin_10", + "Chad_bassin_11", + "Chad_bassin_12", + "Chad", + "Chad_bassin_5", + "Chad_bassin_6", + "Chad_bassin_7", + "Chad_bassin_8", + "Chad_bassin_9", + "Chile_bassin_10", + "Chile_bassin_11", + "Chile_bassin_12", + "Chile", + "Chile_bassin_5", + "Chile_bassin_6", + "Chile_bassin_7", + "Chile_bassin_8", + "Chile_bassin_9", + "China_bassin_10", + "China_bassin_11", + "China_bassin_12", + "China", + "China_bassin_5", + "China_bassin_6", + "China_bassin_7", + "China_bassin_8", + "China_bassin_9", + "Christmas_Island_bassin_10", + "Christmas_Island_bassin_11", + "Christmas_Island_bassin_12", + "Christmas_Island", + "Christmas_Island_bassin_5", + "Christmas_Island_bassin_6", + "Christmas_Island_bassin_7", + "Christmas_Island_bassin_8", + "Christmas_Island_bassin_9", + "Clipperton_Island_bassin_10", + "Clipperton_Island_bassin_11", + "Clipperton_Island_bassin_12", + "Clipperton_Island", + "Clipperton_Island_bassin_5", + "Clipperton_Island_bassin_6", + "Clipperton_Island_bassin_7", + "Clipperton_Island_bassin_8", + "Clipperton_Island_bassin_9", + "Colombia_bassin_10", + "Colombia_bassin_11", + "Colombia_bassin_12", + "Colombia", + "Colombia_bassin_5", + "Colombia_bassin_6", + "Colombia_bassin_7", + "Colombia_bassin_8", + "Colombia_bassin_9", + "Comoros_bassin_10", + "Comoros_bassin_11", + "Comoros_bassin_12", + "Comoros", + "Comoros_bassin_5", + "Comoros_bassin_6", + "Comoros_bassin_7", + "Comoros_bassin_8", + "Comoros_bassin_9", + "Congo_bassin_10", + "Congo_bassin_11", + "Congo_bassin_12", + "Congo", + "Congo_bassin_5", + "Congo_bassin_6", + "Congo_bassin_7", + "Congo_bassin_8", + "Congo_bassin_9", + "Cook_Islands_bassin_10", + "Cook_Islands_bassin_11", + "Cook_Islands_bassin_12", + "Cook_Islands", + "Cook_Islands_bassin_5", + "Cook_Islands_bassin_6", + "Cook_Islands_bassin_7", + "Cook_Islands_bassin_8", + "Cook_Islands_bassin_9", + "Costa_Rica_bassin_10", + "Costa_Rica_bassin_11", + "Costa_Rica_bassin_12", + "Costa_Rica", + "Costa_Rica_bassin_5", + "Costa_Rica_bassin_6", + "Costa_Rica_bassin_7", + "Costa_Rica_bassin_8", + "Costa_Rica_bassin_9", + "Croatia_bassin_10", + "Croatia_bassin_11", + "Croatia_bassin_12", + "Croatia", + "Croatia_bassin_5", + "Croatia_bassin_6", + "Croatia_bassin_7", + "Croatia_bassin_8", + "Croatia_bassin_9", + "Cuba_bassin_10", + "Cuba_bassin_11", + "Cuba_bassin_12", + "Cuba", + "Cuba_bassin_5", + "Cuba_bassin_6", + "Cuba_bassin_7", + "Cuba_bassin_8", + "Cuba_bassin_9", + "Cyprus_bassin_10", + "Cyprus_bassin_11", + "Cyprus_bassin_12", + "Cyprus", + "Cyprus_bassin_5", + "Cyprus_bassin_6", + "Cyprus_bassin_7", + "Cyprus_bassin_8", + "Cyprus_bassin_9", + "Czech_Republic_bassin_10", + "Czech_Republic_bassin_11", + "Czech_Republic_bassin_12", + "Czech_Republic", + "Czech_Republic_bassin_5", + "Czech_Republic_bassin_6", + "Czech_Republic_bassin_7", + "Czech_Republic_bassin_8", + "Czech_Republic_bassin_9", + "Democratic_Republic of the Congo_bassin_10", + "Democratic_Republic of the Congo_bassin_11", + "Democratic_Republic of the Congo_bassin_12", + "Democratic_Republic of the Congo", + "Democratic_Republic of the Congo_bassin_5", + "Democratic_Republic of the Congo_bassin_6", + "Democratic_Republic of the Congo_bassin_7", + "Democratic_Republic of the Congo_bassin_8", + "Democratic_Republic of the Congo_bassin_9", + "Dem_Peoples Rep of Korea_bassin_10", + "Dem_Peoples Rep of Korea_bassin_11", + "Dem_Peoples Rep of Korea_bassin_12", + "Dem_Peoples Rep of Korea", + "Dem_Peoples Rep of Korea_bassin_5", + "Dem_Peoples Rep of Korea_bassin_6", + "Dem_Peoples Rep of Korea_bassin_7", + "Dem_Peoples Rep of Korea_bassin_8", + "Dem_Peoples Rep of Korea_bassin_9", + "Denmark_bassin_10", + "Denmark_bassin_11", + "Denmark_bassin_12", + "Denmark", + "Denmark_bassin_5", + "Denmark_bassin_6", + "Denmark_bassin_7", + "Denmark_bassin_8", + "Denmark_bassin_9", + "Djibouti_bassin_10", + "Djibouti_bassin_11", + "Djibouti_bassin_12", + "Djibouti", + "Djibouti_bassin_5", + "Djibouti_bassin_6", + "Djibouti_bassin_7", + "Djibouti_bassin_8", + "Djibouti_bassin_9", + "Dominican_Republic_bassin_10", + "Dominican_Republic_bassin_11", + "Dominican_Republic_bassin_12", + "Dominican_Republic", + "Dominican_Republic_bassin_5", + "Dominican_Republic_bassin_6", + "Dominican_Republic_bassin_7", + "Dominican_Republic_bassin_8", + "Dominican_Republic_bassin_9", + "Dominica_bassin_10", + "Dominica_bassin_11", + "Dominica_bassin_12", + "Dominica", + "Dominica_bassin_5", + "Dominica_bassin_6", + "Dominica_bassin_7", + "Dominica_bassin_8", + "Dominica_bassin_9", + "Ecuador_bassin_10", + "Ecuador_bassin_11", + "Ecuador_bassin_12", + "Ecuador", + "Ecuador_bassin_5", + "Ecuador_bassin_6", + "Ecuador_bassin_7", + "Ecuador_bassin_8", + "Ecuador_bassin_9", + "Egypt_bassin_10", + "Egypt_bassin_11", + "Egypt_bassin_12", + "Egypt", + "Egypt_bassin_5", + "Egypt_bassin_6", + "Egypt_bassin_7", + "Egypt_bassin_8", + "Egypt_bassin_9", + "El_Salvador_bassin_10", + "El_Salvador_bassin_11", + "El_Salvador_bassin_12", + "El_Salvador", + "El_Salvador_bassin_5", + "El_Salvador_bassin_6", + "El_Salvador_bassin_7", + "El_Salvador_bassin_8", + "El_Salvador_bassin_9", + "Equatorial_Guinea_bassin_10", + "Equatorial_Guinea_bassin_11", + "Equatorial_Guinea_bassin_12", + "Equatorial_Guinea", + "Equatorial_Guinea_bassin_5", + "Equatorial_Guinea_bassin_6", + "Equatorial_Guinea_bassin_7", + "Equatorial_Guinea_bassin_8", + "Equatorial_Guinea_bassin_9", + "Eritrea_bassin_10", + "Eritrea_bassin_11", + "Eritrea_bassin_12", + "Eritrea", + "Eritrea_bassin_5", + "Eritrea_bassin_6", + "Eritrea_bassin_7", + "Eritrea_bassin_8", + "Eritrea_bassin_9", + "Estonia_bassin_10", + "Estonia_bassin_11", + "Estonia_bassin_12", + "Estonia", + "Estonia_bassin_5", + "Estonia_bassin_6", + "Estonia_bassin_7", + "Estonia_bassin_8", + "Estonia_bassin_9", + "Ethiopia_bassin_10", + "Ethiopia_bassin_11", + "Ethiopia_bassin_12", + "Ethiopia", + "Ethiopia_bassin_5", + "Ethiopia_bassin_6", + "Ethiopia_bassin_7", + "Ethiopia_bassin_8", + "Ethiopia_bassin_9", + "Europa_Island_bassin_10", + "Europa_Island_bassin_11", + "Europa_Island_bassin_12", + "Europa_Island", + "Europa_Island_bassin_5", + "Europa_Island_bassin_6", + "Europa_Island_bassin_7", + "Europa_Island_bassin_8", + "Europa_Island_bassin_9", + "Faroe_Islands_bassin_10", + "Faroe_Islands_bassin_11", + "Faroe_Islands_bassin_12", + "Faroe_Islands", + "Faroe_Islands_bassin_5", + "Faroe_Islands_bassin_6", + "Faroe_Islands_bassin_7", + "Faroe_Islands_bassin_8", + "Faroe_Islands_bassin_9", + "Fiji_bassin_10", + "Fiji_bassin_11", + "Fiji_bassin_12", + "Fiji", + "Fiji_bassin_5", + "Fiji_bassin_6", + "Fiji_bassin_7", + "Fiji_bassin_8", + "Fiji_bassin_9", + "Finland_bassin_10", + "Finland_bassin_11", + "Finland_bassin_12", + "Finland", + "Finland_bassin_5", + "Finland_bassin_6", + "Finland_bassin_7", + "Finland_bassin_8", + "Finland_bassin_9", + "France_bassin_10", + "France_bassin_11", + "France_bassin_12", + "France", + "France_bassin_5", + "France_bassin_6", + "France_bassin_7", + "France_bassin_8", + "France_bassin_9", + "French_Guiana_bassin_10", + "French_Guiana_bassin_11", + "French_Guiana_bassin_12", + "French_Guiana", + "French_Guiana_bassin_5", + "French_Guiana_bassin_6", + "French_Guiana_bassin_7", + "French_Guiana_bassin_8", + "French_Guiana_bassin_9", + "French_Polynesia_bassin_10", + "French_Polynesia_bassin_11", + "French_Polynesia_bassin_12", + "French_Polynesia", + "French_Polynesia_bassin_5", + "French_Polynesia_bassin_6", + "French_Polynesia_bassin_7", + "French_Polynesia_bassin_8", + "French_Polynesia_bassin_9", + "French_Southern and Antarctic Territories_bassin_10", + "French_Southern and Antarctic Territories_bassin_11", + "French_Southern and Antarctic Territories_bassin_12", + "French_Southern and Antarctic Territories", + "French_Southern and Antarctic Territories_bassin_5", + "French_Southern and Antarctic Territories_bassin_6", + "French_Southern and Antarctic Territories_bassin_7", + "French_Southern and Antarctic Territories_bassin_8", + "French_Southern and Antarctic Territories_bassin_9", + "Gabon_bassin_10", + "Gabon_bassin_11", + "Gabon_bassin_12", + "Gabon", + "Gabon_bassin_5", + "Gabon_bassin_6", + "Gabon_bassin_7", + "Gabon_bassin_8", + "Gabon_bassin_9", + "Gambia_bassin_10", + "Gambia_bassin_11", + "Gambia_bassin_12", + "Gambia", + "Gambia_bassin_5", + "Gambia_bassin_6", + "Gambia_bassin_7", + "Gambia_bassin_8", + "Gambia_bassin_9", + "Gaza_Strip_bassin_10", + "Gaza_Strip_bassin_11", + "Gaza_Strip_bassin_12", + "Gaza_Strip", + "Gaza_Strip_bassin_5", + "Gaza_Strip_bassin_6", + "Gaza_Strip_bassin_7", + "Gaza_Strip_bassin_8", + "Gaza_Strip_bassin_9", + "Georgia_bassin_10", + "Georgia_bassin_11", + "Georgia_bassin_12", + "Georgia", + "Georgia_bassin_5", + "Georgia_bassin_6", + "Georgia_bassin_7", + "Georgia_bassin_8", + "Georgia_bassin_9", + "Germany_bassin_10", + "Germany_bassin_11", + "Germany_bassin_12", + "Germany", + "Germany_bassin_5", + "Germany_bassin_6", + "Germany_bassin_7", + "Germany_bassin_8", + "Germany_bassin_9", + "Ghana_bassin_10", + "Ghana_bassin_11", + "Ghana_bassin_12", + "Ghana", + "Ghana_bassin_5", + "Ghana_bassin_6", + "Ghana_bassin_8", + "Ghana_bassin_9", + "Gibraltar_bassin_10", + "Gibraltar_bassin_11", + "Gibraltar_bassin_12", + "Gibraltar", + "Gibraltar_bassin_5", + "Gibraltar_bassin_6", + "Gibraltar_bassin_7", + "Gibraltar_bassin_8", + "Gibraltar_bassin_9", + "Glorioso_Island_bassin_10", + "Glorioso_Island_bassin_11", + "Glorioso_Island_bassin_12", + "Glorioso_Island", + "Glorioso_Island_bassin_5", + "Glorioso_Island_bassin_6", + "Glorioso_Island_bassin_7", + "Glorioso_Island_bassin_8", + "Glorioso_Island_bassin_9", + "Greece_bassin_10", + "Greece_bassin_11", + "Greece_bassin_12", + "Greece", + "Greece_bassin_5", + "Greece_bassin_6", + "Greece_bassin_7", + "Greece_bassin_8", + "Greece_bassin_9", + "Greenland_bassin_10", + "Greenland_bassin_11", + "Greenland_bassin_12", + "Greenland", + "Greenland_bassin_5", + "Greenland_bassin_6", + "Greenland_bassin_7", + "Greenland_bassin_8", + "Greenland_bassin_9", + "Grenada_bassin_10", + "Grenada_bassin_11", + "Grenada_bassin_12", + "Grenada", + "Grenada_bassin_5", + "Grenada_bassin_6", + "Grenada_bassin_7", + "Grenada_bassin_8", + "Grenada_bassin_9", + "Guadeloupe_bassin_10", + "Guadeloupe_bassin_11", + "Guadeloupe_bassin_12", + "Guadeloupe", + "Guadeloupe_bassin_5", + "Guadeloupe_bassin_6", + "Guadeloupe_bassin_7", + "Guadeloupe_bassin_8", + "Guadeloupe_bassin_9", + "Guam_bassin_10", + "Guam_bassin_11", + "Guam_bassin_12", + "Guam", + "Guam_bassin_5", + "Guam_bassin_6", + "Guam_bassin_7", + "Guam_bassin_8", + "Guam_bassin_9", + "Halaib_triangle_bassin_10", + "Halaib_triangle_bassin_11", + "Halaib_triangle_bassin_12", + "Halaib_triangle", + "Halaib_triangle_bassin_5", + "Halaib_triangle_bassin_6", + "Halaib_triangle_bassin_7", + "Halaib_triangle_bassin_8", + "Halaib_triangle_bassin_9", + "Heard_Island and McDonald Islands_bassin_12", + "Holy_See_bassin_10", + "Holy_See_bassin_11", + "Holy_See_bassin_12", + "Holy_See", + "Holy_See_bassin_5", + "Holy_See_bassin_6", + "Holy_See_bassin_7", + "Holy_See_bassin_8", + "Holy_See_bassin_9", + "Honduras_bassin_10", + "Honduras_bassin_11", + "Honduras_bassin_12", + "Honduras", + "Honduras_bassin_5", + "Honduras_bassin_6", + "Honduras_bassin_7", + "Honduras_bassin_8", + "Honduras_bassin_9", + "Hong_Kong_bassin_10", + "Hong_Kong_bassin_11", + "Hong_Kong_bassin_12", + "Hong_Kong", + "Hong_Kong_bassin_5", + "Hong_Kong_bassin_6", + "Hong_Kong_bassin_7", + "Hong_Kong_bassin_8", + "Hong_Kong_bassin_9", + "Howland_Island_bassin_10", + "Howland_Island_bassin_11", + "Howland_Island_bassin_12", + "Howland_Island", + "Howland_Island_bassin_5", + "Howland_Island_bassin_6", + "Howland_Island_bassin_7", + "Howland_Island_bassin_8", + "Howland_Island_bassin_9", + "Hungary_bassin_10", + "Hungary_bassin_11", + "Hungary_bassin_12", + "Hungary", + "Hungary_bassin_5", + "Hungary_bassin_6", + "Hungary_bassin_7", + "Hungary_bassin_8", + "Hungary_bassin_9", + "Iceland_bassin_10", + "Iceland_bassin_11", + "Iceland_bassin_12", + "Iceland", + "Iceland_bassin_5", + "Iceland_bassin_6", + "Iceland_bassin_7", + "Iceland_bassin_8", + "Iceland_bassin_9", + "Ilemi_triangle_bassin_10", + "Ilemi_triangle_bassin_11", + "Ilemi_triangle_bassin_12", + "Ilemi_triangle", + "Ilemi_triangle_bassin_5", + "Ilemi_triangle_bassin_6", + "Ilemi_triangle_bassin_7", + "Ilemi_triangle_bassin_8", + "Ilemi_triangle_bassin_9", + "India_bassin_10", + "India_bassin_11", + "India_bassin_12", + "India", + "India_bassin_5", + "India_bassin_6", + "India_bassin_7", + "India_bassin_8", + "India_bassin_9", + "Indonesia_bassin_10", + "Indonesia_bassin_11", + "Indonesia_bassin_12", + "Indonesia", + "Indonesia_bassin_5", + "Indonesia_bassin_6", + "Indonesia_bassin_7", + "Indonesia_bassin_8", + "Indonesia_bassin_9", + "Iraq_bassin_10", + "Iraq_bassin_11", + "Iraq_bassin_12", + "Iraq", + "Iraq_bassin_5", + "Iraq_bassin_6", + "Iraq_bassin_7", + "Iraq_bassin_8", + "Iraq_bassin_9", + "Ireland_bassin_10", + "Ireland_bassin_11", + "Ireland_bassin_12", + "Ireland", + "Ireland_bassin_5", + "Ireland_bassin_6", + "Ireland_bassin_7", + "Ireland_bassin_8", + "Ireland_bassin_9", + "Isle_of Man_bassin_10", + "Isle_of Man_bassin_11", + "Isle_of Man_bassin_12", + "Isle_of Man", + "Isle_of Man_bassin_5", + "Isle_of Man_bassin_6", + "Isle_of Man_bassin_7", + "Isle_of Man_bassin_8", + "Isle_of Man_bassin_9", + "Israel_bassin_10", + "Israel_bassin_11", + "Israel_bassin_12", + "Israel", + "Israel_bassin_5", + "Israel_bassin_6", + "Israel_bassin_7", + "Israel_bassin_8", + "Israel_bassin_9", + "Italy_bassin_10", + "Italy_bassin_11", + "Italy_bassin_12", + "Italy", + "Italy_bassin_5", + "Italy_bassin_6", + "Italy_bassin_7", + "Italy_bassin_8", + "Italy_bassin_9", + "Jamaica_bassin_10", + "Jamaica_bassin_11", + "Jamaica_bassin_12", + "Jamaica", + "Jamaica_bassin_5", + "Jamaica_bassin_6", + "Jamaica_bassin_7", + "Jamaica_bassin_8", + "Jamaica_bassin_9", + "Jammu_and Kashmir_bassin_10", + "Jammu_and Kashmir_bassin_11", + "Jammu_and Kashmir_bassin_12", + "Jammu_and Kashmir", + "Jammu_and Kashmir_bassin_5", + "Jammu_and Kashmir_bassin_6", + "Jammu_and Kashmir_bassin_7", + "Jammu_and Kashmir_bassin_8", + "Jammu_and Kashmir_bassin_9", + "Japan_bassin_10", + "Japan_bassin_11", + "Japan_bassin_12", + "Japan", + "Japan_bassin_5", + "Japan_bassin_6", + "Japan_bassin_7", + "Japan_bassin_8", + "Japan_bassin_9", + "Jarvis_Island_bassin_10", + "Jarvis_Island_bassin_11", + "Jarvis_Island_bassin_12", + "Jarvis_Island", + "Jarvis_Island_bassin_5", + "Jarvis_Island_bassin_6", + "Jarvis_Island_bassin_7", + "Jarvis_Island_bassin_8", + "Jarvis_Island_bassin_9", + "Jersey_bassin_10", + "Jersey_bassin_11", + "Jersey_bassin_12", + "Jersey", + "Jersey_bassin_5", + "Jersey_bassin_6", + "Jersey_bassin_7", + "Jersey_bassin_8", + "Jersey_bassin_9", + "Johnston_Atoll_bassin_10", + "Johnston_Atoll_bassin_11", + "Johnston_Atoll_bassin_12", + "Johnston_Atoll", + "Johnston_Atoll_bassin_5", + "Johnston_Atoll_bassin_6", + "Johnston_Atoll_bassin_7", + "Johnston_Atoll_bassin_8", + "Johnston_Atoll_bassin_9", + "Jordan_bassin_10", + "Jordan_bassin_11", + "Jordan_bassin_12", + "Jordan", + "Jordan_bassin_5", + "Jordan_bassin_6", + "Jordan_bassin_7", + "Jordan_bassin_8", + "Jordan_bassin_9", + "Juan_de Nova Island_bassin_10", + "Juan_de Nova Island_bassin_11", + "Juan_de Nova Island_bassin_12", + "Juan_de Nova Island", + "Juan_de Nova Island_bassin_5", + "Juan_de Nova Island_bassin_6", + "Juan_de Nova Island_bassin_7", + "Juan_de Nova Island_bassin_8", + "Juan_de Nova Island_bassin_9", + "Kazakhstan_bassin_10", + "Kazakhstan_bassin_11", + "Kazakhstan_bassin_12", + "Kazakhstan", + "Kazakhstan_bassin_5", + "Kazakhstan_bassin_6", + "Kazakhstan_bassin_7", + "Kazakhstan_bassin_8", + "Kazakhstan_bassin_9", + "Kenya_bassin_10", + "Kenya_bassin_11", + "Kenya_bassin_12", + "Kenya", + "Kenya_bassin_5", + "Kenya_bassin_6", + "Kenya_bassin_7", + "Kenya_bassin_8", + "Kenya_bassin_9", + "Kingman_Reef_bassin_10", + "Kingman_Reef_bassin_11", + "Kingman_Reef_bassin_12", + "Kingman_Reef", + "Kingman_Reef_bassin_5", + "Kingman_Reef_bassin_6", + "Kingman_Reef_bassin_7", + "Kingman_Reef_bassin_8", + "Kingman_Reef_bassin_9", + "Kiribati_bassin_10", + "Kiribati_bassin_11", + "Kiribati_bassin_12", + "Kiribati", + "Kiribati_bassin_5", + "Kiribati_bassin_6", + "Kiribati_bassin_7", + "Kiribati_bassin_8", + "Kiribati_bassin_9", + "Kuril_islands_bassin_10", + "Kuril_islands_bassin_11", + "Kuril_islands_bassin_12", + "Kuril_islands", + "Kuril_islands_bassin_5", + "Kuril_islands_bassin_6", + "Kuril_islands_bassin_7", + "Kuril_islands_bassin_8", + "Kuril_islands_bassin_9", + "Kuwait_bassin_10", + "Kuwait_bassin_11", + "Kuwait_bassin_12", + "Kuwait", + "Kuwait_bassin_5", + "Kuwait_bassin_6", + "Kuwait_bassin_7", + "Kuwait_bassin_8", + "Kuwait_bassin_9", + "Kyrgyzstan_bassin_10", + "Kyrgyzstan_bassin_11", + "Kyrgyzstan_bassin_12", + "Kyrgyzstan", + "Kyrgyzstan_bassin_5", + "Kyrgyzstan_bassin_6", + "Kyrgyzstan_bassin_7", + "Kyrgyzstan_bassin_8", + "Kyrgyzstan_bassin_9", + "Lao_Peoples Democratic Republic_bassin_10", + "Lao_Peoples Democratic Republic_bassin_11", + "Lao_Peoples Democratic Republic_bassin_12", + "Lao_Peoples Democratic Republic", + "Lao_Peoples Democratic Republic_bassin_5", + "Lao_Peoples Democratic Republic_bassin_6", + "Lao_Peoples Democratic Republic_bassin_7", + "Lao_Peoples Democratic Republic_bassin_8", + "Lao_Peoples Democratic Republic_bassin_9", + "Latvia_bassin_10", + "Latvia_bassin_11", + "Latvia_bassin_12", + "Latvia", + "Latvia_bassin_5", + "Latvia_bassin_6", + "Latvia_bassin_7", + "Latvia_bassin_8", + "Latvia_bassin_9", + "Lebanon_bassin_10", + "Lebanon_bassin_11", + "Lebanon_bassin_12", + "Lebanon", + "Lebanon_bassin_5", + "Lebanon_bassin_6", + "Lebanon_bassin_7", + "Lebanon_bassin_8", + "Lebanon_bassin_9", + "Lesotho_bassin_10", + "Lesotho_bassin_11", + "Lesotho_bassin_12", + "Lesotho", + "Lesotho_bassin_5", + "Lesotho_bassin_6", + "Lesotho_bassin_7", + "Lesotho_bassin_8", + "Lesotho_bassin_9", + "Liberia_bassin_10", + "Liberia_bassin_11", + "Liberia_bassin_12", + "Liberia", + "Liberia_bassin_5", + "Liberia_bassin_6", + "Liberia_bassin_7", + "Liberia_bassin_8", + "Liberia_bassin_9", + "Libya_bassin_10", + "Libya_bassin_11", + "Libya_bassin_12", + "Libya", + "Libya_bassin_5", + "Libya_bassin_6", + "Libya_bassin_7", + "Libya_bassin_8", + "Libya_bassin_9", + "Liechtenstein_bassin_10", + "Liechtenstein_bassin_11", + "Liechtenstein_bassin_12", + "Liechtenstein", + "Liechtenstein_bassin_5", + "Liechtenstein_bassin_6", + "Liechtenstein_bassin_7", + "Liechtenstein_bassin_8", + "Liechtenstein_bassin_9", + "Lithuania_bassin_10", + "Lithuania_bassin_11", + "Lithuania_bassin_12", + "Lithuania", + "Lithuania_bassin_5", + "Lithuania_bassin_6", + "Lithuania_bassin_7", + "Lithuania_bassin_8", + "Lithuania_bassin_9", + "Luxembourg_bassin_10", + "Luxembourg_bassin_11", + "Luxembourg_bassin_12", + "Luxembourg", + "Luxembourg_bassin_5", + "Luxembourg_bassin_6", + "Luxembourg_bassin_7", + "Luxembourg_bassin_8", + "Luxembourg_bassin_9", + "Macau_bassin_10", + "Macau_bassin_11", + "Macau_bassin_12", + "Macau", + "Macau_bassin_5", + "Macau_bassin_6", + "Macau_bassin_7", + "Macau_bassin_8", + "Macau_bassin_9", + "Madagascar_bassin_10", + "Madagascar_bassin_11", + "Madagascar_bassin_12", + "Madagascar", + "Madagascar_bassin_5", + "Madagascar_bassin_6", + "Madagascar_bassin_7", + "Madagascar_bassin_8", + "Madagascar_bassin_9", + "Madeira_Islands_bassin_10", + "Madeira_Islands_bassin_11", + "Madeira_Islands_bassin_12", + "Madeira_Islands", + "Madeira_Islands_bassin_5", + "Madeira_Islands_bassin_6", + "Madeira_Islands_bassin_7", + "Madeira_Islands_bassin_8", + "Madeira_Islands_bassin_9", + "Malawi_bassin_10", + "Malawi_bassin_11", + "Malawi_bassin_12", + "Malawi", + "Malawi_bassin_5", + "Malawi_bassin_6", + "Malawi_bassin_7", + "Malawi_bassin_8", + "Malawi_bassin_9", + "Malaysia_bassin_10", + "Malaysia_bassin_11", + "Malaysia_bassin_12", + "Malaysia", + "Malaysia_bassin_5", + "Malaysia_bassin_6", + "Malaysia_bassin_7", + "Malaysia_bassin_8", + "Malaysia_bassin_9", + "Maldives_bassin_10", + "Maldives_bassin_11", + "Maldives_bassin_12", + "Maldives", + "Maldives_bassin_5", + "Maldives_bassin_6", + "Maldives_bassin_7", + "Maldives_bassin_8", + "Maldives_bassin_9", + "Matan_al-Sarra_bassin_10", + "Matan_al-Sarra_bassin_11", + "Matan_al-Sarra_bassin_12", + "Matan_al-Sarra", + "Matan_al-Sarra_bassin_5", + "Matan_al-Sarra_bassin_6", + "Matan_al-Sarra_bassin_7", + "Matan_al-Sarra_bassin_8", + "Matan_al-Sarra_bassin_9", + "Montenegro_bassin_10", + "Montenegro_bassin_11", + "Montenegro_bassin_12", + "Montenegro", + "Montenegro_bassin_5", + "Montenegro_bassin_6", + "Montenegro_bassin_7", + "Montenegro_bassin_8", + "Montenegro_bassin_9", + "Qatar_bassin_10", + "Qatar_bassin_11", + "Qatar_bassin_12", + "Republic_of Korea_bassin_10", + "Republic_of Korea_bassin_11", + "Republic_of Korea_bassin_12", + "Republic_of Korea", + "Republic_of Korea_bassin_5", + "Republic_of Korea_bassin_6", + "Republic_of Korea_bassin_7", + "Republic_of Korea_bassin_8", + "Republic_of Korea_bassin_9", + "Romania_bassin_10", + "Romania_bassin_11", + "Romania_bassin_12", + "Romania", + "Romania_bassin_5", + "Romania_bassin_6", + "Romania_bassin_7", + "Romania_bassin_8", + "Romania_bassin_9", + "Russian_Federation_bassin_10", + "Russian_Federation_bassin_11", + "Russian_Federation_bassin_12", + "Russian_Federation", + "Russian_Federation_bassin_5", + "Russian_Federation_bassin_6", + "Russian_Federation_bassin_7", + "Russian_Federation_bassin_8", + "Russian_Federation_bassin_9", + "Rwanda_bassin_10", + "Rwanda_bassin_11", + "Rwanda_bassin_12", + "Rwanda", + "Rwanda_bassin_5", + "Rwanda_bassin_6", + "Rwanda_bassin_7", + "Rwanda_bassin_8", + "Rwanda_bassin_9", + "Saint_Helena_bassin_10", + "Saint_Helena_bassin_11", + "Saint_Helena_bassin_12", + "Saint_Helena", + "Saint_Helena_bassin_5", + "Saint_Helena_bassin_6", + "Saint_Helena_bassin_7", + "Saint_Helena_bassin_8", + "Saint_Helena_bassin_9", + "Saint_Kitts and Nevis_bassin_10", + "Saint_Kitts and Nevis_bassin_11", + "Saint_Kitts and Nevis_bassin_12", + "Saint_Kitts and Nevis", + "Saint_Kitts and Nevis_bassin_5", + "Saint_Kitts and Nevis_bassin_6", + "Saint_Kitts and Nevis_bassin_7", + "Saint_Kitts and Nevis_bassin_8", + "Saint_Kitts and Nevis_bassin_9", + "Saint_Lucia_bassin_10", + "Saint_Lucia_bassin_11", + "Saint_Lucia_bassin_12", + "Saint_Lucia", + "Saint_Lucia_bassin_5", + "Saint_Lucia_bassin_6", + "Saint_Lucia_bassin_7", + "Saint_Lucia_bassin_8", + "Saint_Lucia_bassin_9", + "Saint_Pierre et Miquelon_bassin_10", + "Saint_Pierre et Miquelon_bassin_11", + "Saint_Pierre et Miquelon_bassin_12", + "Saint_Pierre et Miquelon", + "Saint_Pierre et Miquelon_bassin_5", + "Saint_Pierre et Miquelon_bassin_6", + "Saint_Pierre et Miquelon_bassin_7", + "Saint_Pierre et Miquelon_bassin_8", + "Saint_Pierre et Miquelon_bassin_9", + "Saint_Vincent and the Grenadines_bassin_10", + "Saint_Vincent and the Grenadines_bassin_11", + "Saint_Vincent and the Grenadines_bassin_12", + "Saint_Vincent and the Grenadines", + "Saint_Vincent and the Grenadines_bassin_5", + "Saint_Vincent and the Grenadines_bassin_6", + "Saint_Vincent and the Grenadines_bassin_7", + "Saint_Vincent and the Grenadines_bassin_8", + "Saint_Vincent and the Grenadines_bassin_9", + "Samoa_bassin_10", + "Samoa_bassin_11", + "Samoa_bassin_12", + "Samoa", + "Samoa_bassin_5", + "Samoa_bassin_6", + "Samoa_bassin_7", + "Samoa_bassin_8", + "Samoa_bassin_9", + "San_Marino_bassin_10", + "San_Marino_bassin_11", + "San_Marino_bassin_12", + "San_Marino", + "San_Marino_bassin_5", + "San_Marino_bassin_6", + "San_Marino_bassin_7", + "San_Marino_bassin_8", + "San_Marino_bassin_9", + "Sao_Tome and Principe_bassin_10", + "Sao_Tome and Principe_bassin_11", + "Sao_Tome and Principe_bassin_12", + "Sao_Tome and Principe", + "Sao_Tome and Principe_bassin_5", + "Sao_Tome and Principe_bassin_6", + "Sao_Tome and Principe_bassin_7", + "Sao_Tome and Principe_bassin_8", + "Sao_Tome and Principe_bassin_9", + "Saudi_Arabia_bassin_10", + "Saudi_Arabia_bassin_11", + "Saudi_Arabia_bassin_12", + "Saudi_Arabia", + "Saudi_Arabia_bassin_5", + "Saudi_Arabia_bassin_6", + "Saudi_Arabia_bassin_7", + "Saudi_Arabia_bassin_8", + "Saudi_Arabia_bassin_9", + "Scarborough_Reef_bassin_10", + "Scarborough_Reef_bassin_11", + "Scarborough_Reef_bassin_12", + "Scarborough_Reef", + "Scarborough_Reef_bassin_5", + "Scarborough_Reef_bassin_6", + "Scarborough_Reef_bassin_7", + "Scarborough_Reef_bassin_8", + "Scarborough_Reef_bassin_9", + "Senegal_bassin_10", + "Senegal_bassin_11", + "Senegal_bassin_12", + "Senegal", + "Senegal_bassin_5", + "Senegal_bassin_6", + "Senegal_bassin_7", + "Senegal_bassin_8", + "Senegal_bassin_9", + "Senkaku_Islands_bassin_10", + "Senkaku_Islands_bassin_11", + "Senkaku_Islands_bassin_12", + "Senkaku_Islands", + "Senkaku_Islands_bassin_5", + "Senkaku_Islands_bassin_6", + "Senkaku_Islands_bassin_7", + "Senkaku_Islands_bassin_8", + "Senkaku_Islands_bassin_9", + "Serbia_bassin_10", + "Serbia_bassin_11", + "Serbia_bassin_12", + "Serbia", + "Serbia_bassin_5", + "Serbia_bassin_6", + "Serbia_bassin_7", + "Serbia_bassin_8", + "Serbia_bassin_9", + "Seychelles_bassin_10", + "Seychelles_bassin_11", + "Seychelles_bassin_12", + "Seychelles", + "Seychelles_bassin_5", + "Seychelles_bassin_6", + "Seychelles_bassin_7", + "Seychelles_bassin_8", + "Seychelles_bassin_9", + "Sierra_Leone_bassin_10", + "Sierra_Leone_bassin_11", + "Sierra_Leone_bassin_12", + "Sierra_Leone", + "Sierra_Leone_bassin_5", + "Sierra_Leone_bassin_6", + "Sierra_Leone_bassin_7", + "Sierra_Leone_bassin_8", + "Sierra_Leone_bassin_9", + "Singapore_bassin_10", + "Singapore_bassin_11", + "Singapore_bassin_12", + "Singapore", + "Singapore_bassin_5", + "Singapore_bassin_6", + "Singapore_bassin_7", + "Singapore_bassin_8", + "Singapore_bassin_9", + "Slovakia_bassin_10", + "Slovakia_bassin_11", + "Slovakia_bassin_12", + "Slovakia", + "Slovakia_bassin_5", + "Slovakia_bassin_6", + "Slovakia_bassin_7", + "Slovakia_bassin_8", + "Slovakia_bassin_9", + "Slovenia_bassin_10", + "Slovenia_bassin_11", + "Slovenia_bassin_12", + "Slovenia", + "Slovenia_bassin_5", + "Slovenia_bassin_6", + "Slovenia_bassin_7", + "Slovenia_bassin_8", + "Slovenia_bassin_9", + "Solomon_Islands_bassin_10", + "Solomon_Islands_bassin_11", + "Solomon_Islands_bassin_12", + "Solomon_Islands", + "Solomon_Islands_bassin_5", + "Solomon_Islands_bassin_6", + "Solomon_Islands_bassin_7", + "Solomon_Islands_bassin_8", + "Solomon_Islands_bassin_9", + "Somalia_bassin_10", + "Somalia_bassin_11", + "Somalia_bassin_12", + "Somalia", + "Somalia_bassin_5", + "Somalia_bassin_6", + "Somalia_bassin_7", + "Somalia_bassin_8", + "Somalia_bassin_9", + "South_Africa_bassin_10", + "South_Africa_bassin_11", + "South_Africa_bassin_12", + "South_Africa", + "South_Africa_bassin_5", + "South_Africa_bassin_6", + "South_Africa_bassin_7", + "South_Africa_bassin_8", + "South_Africa_bassin_9", + "South_Georgia and the South Sandwich Islands_bassin_10", + "South_Georgia and the South Sandwich Islands_bassin_11", + "South_Georgia and the South Sandwich Islands_bassin_12", + "South_Georgia and the South Sandwich Islands", + "South_Georgia and the South Sandwich Islands_bassin_5", + "South_Georgia and the South Sandwich Islands_bassin_6", + "South_Georgia and the South Sandwich Islands_bassin_7", + "South_Georgia and the South Sandwich Islands_bassin_8", + "South_Georgia and the South Sandwich Islands_bassin_9", + "South_Sudan_bassin_10", + "South_Sudan_bassin_11", + "South_Sudan_bassin_12", + "South_Sudan", + "South_Sudan_bassin_5", + "South_Sudan_bassin_6", + "South_Sudan_bassin_7", + "South_Sudan_bassin_8", + "South_Sudan_bassin_9", + "Spain_bassin_10", + "Spain_bassin_11", + "Spain_bassin_12", + "Spain", + "Spain_bassin_5", + "Spain_bassin_6", + "Spain_bassin_7", + "Spain_bassin_8", + "Spain_bassin_9", + "Spratly_Islands_bassin_10", + "Spratly_Islands_bassin_11", + "Spratly_Islands_bassin_12", + "Spratly_Islands", + "Spratly_Islands_bassin_5", + "Spratly_Islands_bassin_6", + "Spratly_Islands_bassin_7", + "Spratly_Islands_bassin_8", + "Spratly_Islands_bassin_9", + "Sri_Lanka_bassin_10", + "Sri_Lanka_bassin_11", + "Sri_Lanka_bassin_12", + "Sri_Lanka", + "Sri_Lanka_bassin_5", + "Sri_Lanka_bassin_6", + "Sri_Lanka_bassin_7", + "Sri_Lanka_bassin_8", + "Sri_Lanka_bassin_9", + "Suriname_bassin_10", + "Suriname_bassin_11", + "Suriname_bassin_12", + "Suriname", + "Suriname_bassin_5", + "Suriname_bassin_6", + "Suriname_bassin_7", + "Suriname_bassin_8", + "Suriname_bassin_9", + "Svalbard_and Jan Mayen Islands_bassin_10", + "Svalbard_and Jan Mayen Islands_bassin_11", + "Svalbard_and Jan Mayen Islands_bassin_12", + "Svalbard_and Jan Mayen Islands", + "Svalbard_and Jan Mayen Islands_bassin_5", + "Svalbard_and Jan Mayen Islands_bassin_6", + "Svalbard_and Jan Mayen Islands_bassin_7", + "Svalbard_and Jan Mayen Islands_bassin_8", + "Svalbard_and Jan Mayen Islands_bassin_9", + "Swaziland_bassin_10", + "Swaziland_bassin_11", + "Swaziland_bassin_12", + "Swaziland", + "Swaziland_bassin_5", + "Swaziland_bassin_6", + "Swaziland_bassin_7", + "Swaziland_bassin_8", + "Swaziland_bassin_9", + "Sweden_bassin_10", + "Sweden_bassin_11", + "Sweden_bassin_12", + "Sweden", + "Sweden_bassin_5", + "Sweden_bassin_6", + "Sweden_bassin_7", + "Sweden_bassin_8", + "Sweden_bassin_9", + "Switzerland_bassin_10", + "Switzerland_bassin_11", + "Switzerland_bassin_12", + "Switzerland", + "Switzerland_bassin_5", + "Switzerland_bassin_6", + "Switzerland_bassin_7", + "Switzerland_bassin_8", + "Switzerland_bassin_9", + "Syrian_Arab Republic_bassin_10", + "Syrian_Arab Republic_bassin_11", + "Syrian_Arab Republic_bassin_12", + "Syrian_Arab Republic", + "Syrian_Arab Republic_bassin_5", + "Syrian_Arab Republic_bassin_6", + "Syrian_Arab Republic_bassin_7", + "Syrian_Arab Republic_bassin_8", + "Syrian_Arab Republic_bassin_9", + "Taiwan_bassin_10", + "Taiwan_bassin_11", + "Taiwan_bassin_12", + "Taiwan", + "Taiwan_bassin_5", + "Taiwan_bassin_6", + "Taiwan_bassin_7", + "Taiwan_bassin_8", + "Taiwan_bassin_9", + "Tajikistan_bassin_10", + "Tajikistan_bassin_11", + "Tajikistan_bassin_12", + "Tajikistan", + "Tajikistan_bassin_5", + "Tajikistan_bassin_6", + "Tajikistan_bassin_7", + "Tajikistan_bassin_8", + "Tajikistan_bassin_9", + "Thailand_bassin_10", + "Thailand_bassin_11", + "Thailand_bassin_12", + "Thailand", + "Thailand_bassin_5", + "Thailand_bassin_6", + "Thailand_bassin_7", + "Thailand_bassin_8", + "Thailand_bassin_9", + "The_former Yugoslav Republic of Macedonia_bassin_10", + "The_former Yugoslav Republic of Macedonia_bassin_11", + "The_former Yugoslav Republic of Macedonia_bassin_12", + "The_former Yugoslav Republic of Macedonia", + "The_former Yugoslav Republic of Macedonia_bassin_5", + "The_former Yugoslav Republic of Macedonia_bassin_6", + "The_former Yugoslav Republic of Macedonia_bassin_7", + "The_former Yugoslav Republic of Macedonia_bassin_8", + "The_former Yugoslav Republic of Macedonia_bassin_9", + "Timor-Leste_bassin_10", + "Timor-Leste_bassin_11", + "Timor-Leste_bassin_12", + "Timor-Leste", + "Timor-Leste_bassin_5", + "Timor-Leste_bassin_6", + "Timor-Leste_bassin_7", + "Timor-Leste_bassin_8", + "Timor-Leste_bassin_9", + "Togo_bassin_10", + "Togo_bassin_11", + "Togo_bassin_12", + "Togo", + "Togo_bassin_5", + "Togo_bassin_6", + "Togo_bassin_7", + "Togo_bassin_8", + "Togo_bassin_9", + "Tokelau_bassin_10", + "Tokelau_bassin_11", + "Tokelau_bassin_12", + "Tokelau", + "Tokelau_bassin_5", + "Tokelau_bassin_6", + "Tokelau_bassin_7", + "Tokelau_bassin_8", + "Tokelau_bassin_9", + "Tonga_bassin_10", + "Tonga_bassin_11", + "Tonga_bassin_12", + "Tonga", + "Tonga_bassin_5", + "Tonga_bassin_6", + "Tonga_bassin_7", + "Tonga_bassin_8", + "Tonga_bassin_9", + "Trinidad_and Tobago_bassin_10", + "Trinidad_and Tobago_bassin_11", + "Trinidad_and Tobago_bassin_12", + "Trinidad_and Tobago", + "Trinidad_and Tobago_bassin_5", + "Trinidad_and Tobago_bassin_6", + "Trinidad_and Tobago_bassin_7", + "Trinidad_and Tobago_bassin_8", + "Trinidad_and Tobago_bassin_9", + "Tromelin_Island_bassin_10", + "Tromelin_Island_bassin_11", + "Tromelin_Island_bassin_12", + "Tromelin_Island", + "Tromelin_Island_bassin_5", + "Tromelin_Island_bassin_6", + "Tromelin_Island_bassin_7", + "Tromelin_Island_bassin_8", + "Tromelin_Island_bassin_9", + "Tunisia_bassin_10", + "Tunisia_bassin_11", + "Tunisia_bassin_12", + "Tunisia", + "Tunisia_bassin_5", + "Tunisia_bassin_6", + "Tunisia_bassin_7", + "Tunisia_bassin_8", + "Tunisia_bassin_9", + "Turkey_bassin_10", + "Turkey_bassin_11", + "Turkey_bassin_12", + "Turkey", + "Turkey_bassin_5", + "Turkey_bassin_6", + "Turkey_bassin_7", + "Turkey_bassin_8", + "Turkey_bassin_9", + "Turkmenistan_bassin_10", + "Turkmenistan_bassin_11", + "Turkmenistan_bassin_12", + "Turkmenistan", + "Turkmenistan_bassin_5", + "Turkmenistan_bassin_6", + "Turkmenistan_bassin_7", + "Turkmenistan_bassin_8", + "Turkmenistan_bassin_9", + "Turks_and Caicos islands_bassin_10", + "Turks_and Caicos islands_bassin_11", + "Turks_and Caicos islands_bassin_12", + "Turks_and Caicos islands", + "Turks_and Caicos islands_bassin_5", + "Turks_and Caicos islands_bassin_6", + "Turks_and Caicos islands_bassin_7", + "Turks_and Caicos islands_bassin_8", + "Turks_and Caicos islands_bassin_9", + "Tuvalu_bassin_10", + "Tuvalu_bassin_11", + "Tuvalu_bassin_12", + "Tuvalu", + "Tuvalu_bassin_5", + "Tuvalu_bassin_6", + "Tuvalu_bassin_7", + "Tuvalu_bassin_8", + "Tuvalu_bassin_9", + "Uganda_bassin_10", + "Uganda_bassin_11", + "Uganda_bassin_12", + "Uganda", + "Uganda_bassin_5", + "Uganda_bassin_6", + "Uganda_bassin_7", + "Uganda_bassin_8", + "Uganda_bassin_9", + "Ukraine_bassin_10", + "Ukraine_bassin_11", + "Ukraine_bassin_12", + "Ukraine", + "Ukraine_bassin_5", + "Ukraine_bassin_6", + "Ukraine_bassin_7", + "Ukraine_bassin_8", + "Ukraine_bassin_9", + "UK_of Great Britain and Northern Ireland_bassin_10", + "UK_of Great Britain and Northern Ireland_bassin_11", + "UK_of Great Britain and Northern Ireland_bassin_12", + "UK_of Great Britain and Northern Ireland", + "UK_of Great Britain and Northern Ireland_bassin_5", + "UK_of Great Britain and Northern Ireland_bassin_6", + "UK_of Great Britain and Northern Ireland_bassin_7", + "UK_of Great Britain and Northern Ireland_bassin_8", + "UK_of Great Britain and Northern Ireland_bassin_9", + "United_Arab Emirates_bassin_10", + "United_Arab Emirates_bassin_11", + "United_Arab Emirates_bassin_12", + "United_Arab Emirates", + "United_Arab Emirates_bassin_5", + "United_Arab Emirates_bassin_6", + "United_Arab Emirates_bassin_7", + "United_Arab Emirates_bassin_8", + "United_Arab Emirates_bassin_9", + "United_Republic of Tanzania_bassin_10", + "United_Republic of Tanzania_bassin_11", + "United_Republic of Tanzania_bassin_12", + "United_Republic of Tanzania", + "United_Republic of Tanzania_bassin_5", + "United_Republic of Tanzania_bassin_6", + "United_Republic of Tanzania_bassin_7", + "United_Republic of Tanzania_bassin_8", + "United_Republic of Tanzania_bassin_9", + "United_States of America_bassin_10", + "United_States of America_bassin_11", + "United_States of America_bassin_12", + "United_States of America", + "United_States of America_bassin_5", + "United_States of America_bassin_6", + "United_States of America_bassin_7", + "United_States of America_bassin_8", + "United_States of America_bassin_9", + "United_States Virgin Islands_bassin_10", + "United_States Virgin Islands_bassin_11", + "United_States Virgin Islands_bassin_12", + "United_States Virgin Islands", + "United_States Virgin Islands_bassin_5", + "United_States Virgin Islands_bassin_6", + "United_States Virgin Islands_bassin_7", + "United_States Virgin Islands_bassin_8", + "United_States Virgin Islands_bassin_9", + "Uruguay_bassin_10", + "Uruguay_bassin_11", + "Uruguay_bassin_12", + "Uruguay", + "Uruguay_bassin_5", + "Uruguay_bassin_6", + "Uruguay_bassin_7", + "Uruguay_bassin_8", + "Uruguay_bassin_9", + "Uzbekistan_bassin_10", + "Uzbekistan_bassin_11", + "Uzbekistan_bassin_12", + "Uzbekistan", + "Uzbekistan_bassin_5", + "Uzbekistan_bassin_6", + "Uzbekistan_bassin_7", + "Uzbekistan_bassin_8", + "Uzbekistan_bassin_9", + "Vanuatu_bassin_10", + "Vanuatu_bassin_11", + "Vanuatu_bassin_12", + "Vanuatu", + "Vanuatu_bassin_5", + "Vanuatu_bassin_6", + "Vanuatu_bassin_7", + "Vanuatu_bassin_8", + "Vanuatu_bassin_9", + "Venezuela_bassin_10", + "Venezuela_bassin_11", + "Venezuela_bassin_12", + "Venezuela", + "Venezuela_bassin_5", + "Venezuela_bassin_6", + "Venezuela_bassin_7", + "Venezuela_bassin_8", + "Venezuela_bassin_9", + "Viet_Nam_bassin_10", + "Viet_Nam_bassin_11", + "Viet_Nam_bassin_12", + "Viet_Nam", + "Viet_Nam_bassin_5", + "Viet_Nam_bassin_6", + "Viet_Nam_bassin_7", + "Viet_Nam_bassin_8", + "Viet_Nam_bassin_9", + "Wake_Island_bassin_10", + "Wake_Island_bassin_11", + "Wake_Island_bassin_12", + "Wake_Island", + "Wake_Island_bassin_5", + "Wake_Island_bassin_6", + "Wake_Island_bassin_7", + "Wake_Island_bassin_8", + "Wake_Island_bassin_9", + "Wallis_and Futuna_bassin_10", + "Wallis_and Futuna_bassin_11", + "Wallis_and Futuna_bassin_12", + "Wallis_and Futuna", + "Wallis_and Futuna_bassin_5", + "Wallis_and Futuna_bassin_6", + "Wallis_and Futuna_bassin_7", + "Wallis_and Futuna_bassin_8", + "Wallis_and Futuna_bassin_9", + "Western_Sahara_bassin_10", + "Western_Sahara_bassin_11", + "Western_Sahara_bassin_12", + "Western_Sahara", + "Western_Sahara_bassin_5", + "Western_Sahara_bassin_6", + "Western_Sahara_bassin_7", + "Western_Sahara_bassin_8", + "Western_Sahara_bassin_9", + "West_Bank_bassin_10", + "West_Bank_bassin_11", + "West_Bank_bassin_12", + "West_Bank", + "West_Bank_bassin_5", + "West_Bank_bassin_6", + "West_Bank_bassin_7", + "West_Bank_bassin_8", + "West_Bank_bassin_9", + "Yemen_bassin_10", + "Yemen_bassin_11", + "Yemen_bassin_12", + "Yemen", + "Yemen_bassin_5", + "Yemen_bassin_6", + "Yemen_bassin_7", + "Yemen_bassin_8", + "Yemen_bassin_9", + "Zambia_bassin_10", + "Zambia_bassin_11", + "Zambia_bassin_12", + "Zambia", + "Zambia_bassin_5", + "Zambia_bassin_6", + "Zambia_bassin_7", + "Zambia_bassin_8", + "Zambia_bassin_9", + "Zimbabwe_bassin_10", + "Zimbabwe_bassin_11", + "Zimbabwe_bassin_12", + "Zimbabwe", + "Zimbabwe_bassin_5", + "Zimbabwe_bassin_6", + "Zimbabwe_bassin_7", + "Zimbabwe_bassin_8", + "Zimbabwe_bassin_9" + ) ); + + public static void main(String[] args) { + + ArrayList missingCountries = new ArrayList(); + + for (String country : allCountryNames) { + if( !filesGenerated.contains(country) ) { + missingCountries.add( country); + } + } + System.out.println( missingCountries.size() ); + System.out.println( missingCountries ); + + String finalCountries = ""; + for (String missing : missingCountries) { + finalCountries += '"' + missing.replaceAll( "_", " ") + "\", "; + } + System.out.println( finalCountries ); + + } + + +} From 82ea52af1f50d44f92067d213af72cc1bf045c1a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:21:58 +0100 Subject: [PATCH 0031/1620] New translations FixCoordinatesMongolia.java (English) --- .../earth/app/view/Messages_en.properties | 77 ++----------------- 1 file changed, 5 insertions(+), 72 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 6e034a1981..c36b2d4338 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,80 +1,13 @@ package org.openforis.collect.earth.app.ad_hoc; -import java.util.List; - -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.manager.RecordManager; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.CollectRecordSummary; -import org.openforis.collect.model.RecordFilter; -import org.openforis.idm.model.Coordinate; -import org.openforis.idm.model.CoordinateAttribute; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component -public abstract class FixOtherLand { - - @Autowired - private RecordManager recordManager; - - @Autowired - private EarthSurveyService earthSurveyService; - - private Logger logger = LoggerFactory.getLogger( FixOtherLand.class); - - private boolean stopFix = false; - - private List getAllRecords(){ - RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); - List records = recordManager.loadSummaries( rf ); - return records; - } - - public void fixCoordinates(){ - List allRecords = getAllRecords(); - - if( shouldStopFixing()){ - return; - } - - for (CollectRecordSummary summaryCollectRecord : allRecords) { - if( shouldStopFixing()){ - break; - } - try { - CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); - CoordinateAttribute plotCoord = (CoordinateAttribute) collectRecord.getNodeByPath("/plot/location"); //$NON-NLS-1$ - if( plotCoord != null && plotCoord.getValue() != null ){ - if( plotCoord.getValue().getX() < getLongitudeLimit() ){ - Coordinate coordinate = new Coordinate(plotCoord.getValue().getY(), plotCoord.getValue().getX(), plotCoord.getValue().getSrsId() ); - plotCoord.setValue( coordinate ); - recordManager.save( collectRecord ); - - } - - - } - } catch (Exception e) { - logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ - } - } - - } - - protected abstract int getLongitudeLimit(); - - private boolean shouldStopFixing() { - return stopFix; - } - - public void stopFixing() { - stopFix = true; +public class FixCoordinatesMongolia extends FixCoordinates { + @Override + protected int getLongitudeLimit() { + return 87; } -} \ No newline at end of file +} From c42a87b29f8dc74dfbd7b3a5a22aa997ed7f2e39 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:21:59 +0100 Subject: [PATCH 0032/1620] New translations FixCoordinatesMongolia.java (Spanish) --- .../earth/app/view/Messages_es.properties | 77 ++----------------- 1 file changed, 5 insertions(+), 72 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 6e034a1981..c36b2d4338 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,80 +1,13 @@ package org.openforis.collect.earth.app.ad_hoc; -import java.util.List; - -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.manager.RecordManager; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.CollectRecordSummary; -import org.openforis.collect.model.RecordFilter; -import org.openforis.idm.model.Coordinate; -import org.openforis.idm.model.CoordinateAttribute; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component -public abstract class FixOtherLand { - - @Autowired - private RecordManager recordManager; - - @Autowired - private EarthSurveyService earthSurveyService; - - private Logger logger = LoggerFactory.getLogger( FixOtherLand.class); - - private boolean stopFix = false; - - private List getAllRecords(){ - RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); - List records = recordManager.loadSummaries( rf ); - return records; - } - - public void fixCoordinates(){ - List allRecords = getAllRecords(); - - if( shouldStopFixing()){ - return; - } - - for (CollectRecordSummary summaryCollectRecord : allRecords) { - if( shouldStopFixing()){ - break; - } - try { - CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); - CoordinateAttribute plotCoord = (CoordinateAttribute) collectRecord.getNodeByPath("/plot/location"); //$NON-NLS-1$ - if( plotCoord != null && plotCoord.getValue() != null ){ - if( plotCoord.getValue().getX() < getLongitudeLimit() ){ - Coordinate coordinate = new Coordinate(plotCoord.getValue().getY(), plotCoord.getValue().getX(), plotCoord.getValue().getSrsId() ); - plotCoord.setValue( coordinate ); - recordManager.save( collectRecord ); - - } - - - } - } catch (Exception e) { - logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ - } - } - - } - - protected abstract int getLongitudeLimit(); - - private boolean shouldStopFixing() { - return stopFix; - } - - public void stopFixing() { - stopFix = true; +public class FixCoordinatesMongolia extends FixCoordinates { + @Override + protected int getLongitudeLimit() { + return 87; } -} \ No newline at end of file +} From 32da6833e5420fa7a670deb6f83c1205540da43c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:01 +0100 Subject: [PATCH 0033/1620] New translations Messages.properties (Spanish) --- .../earth/app/view/Messages_es.properties | 274 +++++++++++++++++- 1 file changed, 263 insertions(+), 11 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index c36b2d4338..3ce9622fe0 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,13 +1,265 @@ -package org.openforis.collect.earth.app.ad_hoc; +AboutDialog.19=A problem occurred +AboutDialog.5=For more information visit our website OpenForis.org +AboutDialog.6=Sorry, a problem occurred while trying to open this link in your system's standard browser. +AboutDialog.8=Ok +AspectCode.0=North +AspectCode.1=North-East +AspectCode.2=East +AspectCode.3=South-East +AspectCode.4=South +AspectCode.5=South-West +AspectCode.6=West +AspectCode.7=North-West +CollectEarthMenu.0=Import CEP file +CollectEarthMenu.2=Utilities +CollectEarthMenu.3=Divide large CSV plot files +CollectEarthMenu.4=Export data to XML (from specific date until present) +CollectEarthMenu.5=Export to Collect Backup +CollectEarthMenu.6=Export data as Collect Backup (all data) +CollectEarthMenu.7=Export data as Collect Backup (from date) +CollectEarthMenu.8=Export data to XML (using summary attribute) +CollectEarthWindow.0=Error when attempting to export data to CSV file +CollectEarthWindow.10=File +CollectEarthWindow.11=Exit +CollectEarthWindow.12=Tools +CollectEarthWindow.13=Download data to CSV (Excel) +CollectEarthWindow.14=Start SAIKU Analysis +CollectEarthWindow.15=Properties +CollectEarthWindow.16=Help +CollectEarthWindow.17=Disclaimer +CollectEarthWindow.18=Find missing plots in database +CollectEarthWindow.19=Collect Earth +CollectEarthWindow.1=Export error +CollectEarthWindow.20=Number of duplicated records\: +CollectEarthWindow.21=Could not find icon for main frame +CollectEarthWindow.22=Are you sure that you want to close Collect Earth?
Closing the window will also close the Collect Earth server +CollectEarthWindow.23=Confirmation needed +CollectEarthWindow.24=XML Export +CollectEarthWindow.25=Do you want to add these records anyway and lose your current data? +CollectEarthWindow.26=Operator +CollectEarthWindow.27=Update +CollectEarthWindow.28=Open Foris Collect Earth server should be running while the operator interprets data. +CollectEarthWindow.29=The Saiku Server is not configured. +CollectEarthWindow.2=Language +CollectEarthWindow.30=Please maintain this window open while you are using Google Earth. +CollectEarthWindow.31=Export collected data to CSV file +CollectEarthWindow.32=Quit +CollectEarthWindow.33=The operator name has to be longer than 5 characters and shorter than 50 +CollectEarthWindow.34=Validation error +CollectEarthWindow.35=OPERATOR NAME EMPTY\!
Please fill the operator name and press the "Update" button. +CollectEarthWindow.36=Operator name cannot be empty +CollectEarthWindow.37=Keep Open +CollectEarthWindow.38=CSV files +CollectEarthWindow.39=NOTICE\: It is advisable that you back-up your current data (Export to XML) before importing the new data +CollectEarthWindow.3=\ Import error +CollectEarthWindow.40=Set-up the path to the folder where Saiku Server is installed in the Tools->Properties->Advanced tab. +CollectEarthWindow.41=Saving exported data to file\: +CollectEarthWindow.42=Quit +CollectEarthWindow.43=Conflicting records found +CollectEarthWindow.44=Data Import/Export +CollectEarthWindow.45=Export data to XML (compressed) +CollectEarthWindow.46=Import new data from ZIP (compressed XML) +CollectEarthWindow.47=Saiku Server not configured +CollectEarthWindow.48=Zip/collect-data files +CollectEarthWindow.49=Fusion CSV files +CollectEarthWindow.4=FAO Disclaimer notices +CollectEarthWindow.50=Open User Manual +CollectEarthWindow.51=Check for updates of Collect Earth +CollectEarthWindow.52=Open Application Log File +CollectEarthWindow.53=Collect Earth Log file +CollectEarthWindow.54=Load points from KML +CollectEarthWindow.55=Update current records using CSV +CollectEarthWindow.56=About... +CollectEarthWindow.57=The Saiku starter process is still running, please wait. +CollectEarthWindow.58=Cannot start Saiku analysis +CollectEarthWindow.59=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming.
If you click on "YES" a new dataset with the latest information will be generated. +CollectEarthWindow.5=Close +CollectEarthWindow.60=Saiku data generation +CollectEarthWindow.61=Export data to XML (modified records since last export) +CollectEarthWindow.62=About... +CollectEarthWindow.63=Error getting the points from KML +CollectEarthWindow.64=Technical Support +CollectEarthWindow.65=The operator name has been changed +CollectEarthWindow.66=Operator name +CollectEarthWindow.67=Open data folder +CollectEarthWindow.6=Export to Fusion Table +CollectEarthWindow.70=Open the Survey Guide +CollectEarthWindow.71=Generate Stand-Alone Saiku tool +CollectEarthWindow.7=Error when importing data +CollectEarthWindow.8=Disclaimer text could not be found +CollectEarthWindow.9=The data imported contains records that are already present on your database. +DynamicsCode.0=Initially Forest +DynamicsCode.1=Initially Grassland +DynamicsCode.2=Initially Settlement +DynamicsCode.3=Initially Otherland +DynamicsCode.4=Initially Wetland +DynamicsCode.5=Initially Cropland +EarthApp.11=Collect Earth is already running +EarthApp.21=The file containing the grid of plots as a CSV/CED is not found in the selected path \:
+EarthApp.23=No CSV/CED file has been set-up \:

+EarthApp.24=The file containing the Freemarker template with the KML definition is not found in the selected path \:
+EarthApp.26=No KML definition file has been set-up \:

+EarthApp.27=The file containing the HTML balloon form is not found in the selected path \:
+EarthApp.29=No HTML balloon file has been set-up \:

+EarthApp.30=Please correct the file location in the Tools->Properties menu. +EarthApp.3=Remind me later +EarthApp.4=Update Now +EarthApp.57=There is a new version of Collect Earth available\!
How do you want to proceed? +EarthApp.58=Update alert +EarthApp.59=Error when importing project file +EarthApp.5=Do not remind me again +EarthApp.61=The Collect Earth file could not be open.
Please make sure that Google Earth is installed. +EarthApp.6=\ - Version +EarthApp.70=WARNING +EarthApp.71=In Mac OS X the Collect Earth project files (*.cep) will not open in Collect Earth when they are double-clicked.
+EarthApp.72=Use the Collect Earth toolbar to open the .cep files \: +EarthApp.73=Collect Earth issues in Mac OS X computers +EarthSurveyService.9=Field required +ExportActionListener.1=Pick Date to Export Records From +ExportDialogProcessMonitor.0=Processing data... +ExportDialogProcessMonitor.1=Waiting to initialize process \: +ExportDialogProcessMonitor.4=Exported records \: +ImportActionListener.0=Should the data for plots that have not been completely filled be imported? +ImportActionListener.2=If you click NO only the data from plots in the "green" state, containing all data, will be imported. +ImportActionListener.3=Import non-finished records +ImportDialogProcessMonitor.0=\ CALCULATING +ImportDialogProcessMonitor.11=Initial number of records \: +ImportDialogProcessMonitor.2=Importing records... +ImportDialogProcessMonitor.5=Actual number of imported records \: +ImportDialogProcessMonitor.8=Processing data... +ImportProcessMonitorDialog.0=Imported records \: +ImportXMLDialogProcessMonitor.1 = Overwrite data +ImportXMLDialogProcessMonitor.2 = Import only non-conflicting plots +InfiniteProgressMonitor.0=Cancel operation +JFileChooserExistsAware.0=Collect Earth Project file +KmlImportService.13=Select a CSV file to save the plot locations to +MissingPlotsListener.0=Error while getting information about plots not present on the Database +MissingPlotsListener.10=Total number of plots in the sampling design \: +MissingPlotsListener.12=Number of missing plots \: +MissingPlotsListener.14=All the plots are filled\! +MissingPlotsListener.1=Missing plots +MissingPlotsListener.2=Copy contents to clipboard +MissingPlotsListener.3=Pick the files that contain plot information ( .csv or .ced files ) for which you want to know if all data has been filled. +MissingPlotsListener.4=Missing plots - information +MissingPlotsListener.5=From file \: +MissingPlotsListener.6=Export to CED file +NO=No +NO_TO_ALL=No to all +OpenTextFileListener.0=The text file was not found at \: +OptionWizard.0=Collect Earth options +OptionWizard.100=Open Planet imagery +OptionWizard.101=Planet API key +OptionWizard.1021=URL SecureWatch +OptionWizard.102=Open Maxar SecureWatch +OptionWizard.103=Set URL for Extra Map (opens when set) \: +OptionWizard.104=Browsers +OptionWizard.105=Open Earth Map +OptionWizard.110=Use NICFI provided Monthly imagery +OptionWizard.10=Open backup folder +OptionWizard.11=Unknown\: use ifconfig +OptionWizard.12=Client Instance +OptionWizard.13=Collect Earth Server IP +OptionWizard.14=Collect Earth Server port (e.g. 8023) +OptionWizard.15=Save & Apply changes +OptionWizard.16=ID +OptionWizard.17=X-coord +OptionWizard.18=Y-coord +OptionWizard.19=Elevation +OptionWizard.1=Choose Browser +OptionWizard.20=The Google Earth contents have been changed.
Please accept the content reload when you are prompted by Google Earth. +OptionWizard.21=Update successful +OptionWizard.22=Slope +OptionWizard.23=There was an error when re-opening the Google Earth data +OptionWizard.24=Cancel +OptionWizard.25=Operation Mode +OptionWizard.26=DB host +OptionWizard.27=This is not a recognized Saiku Folder ( the start-saiku.bat file is not present) +OptionWizard.28=Saiku Server not recognized +OptionWizard.29=DB port +OptionWizard.2=Workflow (server/client) +OptionWizard.30=SQLite options +OptionWizard.31=Sample data +OptionWizard.32=Plot layout +OptionWizard.33=Survey Definition +OptionWizard.34=Integrated Services +OptionWizard.35=Number of control points +OptionWizard.36=Distance between control points (in meters) +OptionWizard.37=Margin with plot border (in meters) +OptionWizard.38=The CSV/CED file cannot be read correctly.
The file is expected to have a comma separated values like this \:
+OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect +OptionWizard.3=Server Instance +OptionWizard.40=Projects +OptionWizard.41=Load a new project file +OptionWizard.42=Error when closing the CSV reader +OptionWizard.43=Name of survey +OptionWizard.44=automatically back-up database at +OptionWizard.45=Open Earth Engine Playground ( deprecated ) +OptionWizard.46=Open Earth Engine Timelapse +OptionWizard.47=Open Bing Maps +OptionWizard.48=Open form on a browser instead of Google Earth (recommended for LINUX) +OptionWizard.49=Path to ced/csv file with plot data +OptionWizard.4=Current computer IP \: +OptionWizard.50=Browse... +OptionWizard.51=Error importing project file +OptionWizard.52=CSV/CED file with only coordinates +OptionWizard.53=No points +OptionWizard.54=Central point +OptionWizard.55=Error importing project folder +OptionWizard.56=Load project +OptionWizard.57=Previously loaded projects +OptionWizard.58=Open GEE Code Editor (requires Trusted Tester access) +OptionWizard.59=Open Here Maps focused on the plot +OptionWizard.5=Collect Earth Server port\: +OptionWizard.65=Path to Saiku folder +OptionWizard.66=Browse... +OptionWizard.67=Path to Firefox executable +OptionWizard.68=Browse... +OptionWizard.6=PostgreSQL DB parameters +OptionWizard.70=Executable files +OptionWizard.72=Binary files +OptionWizard.73=Path to Chrome executable +OptionWizard.74=Browse... +OptionWizard.76=Executable files +OptionWizard.78=Binary files +OptionWizard.79=Path to KML Freemarker template +OptionWizard.7=User Name +OptionWizard.80=Browse... +OptionWizard.82=Freemarker template +OptionWizard.83=Path to HTML Balloon form design +OptionWizard.84=Browse... +OptionWizard.86=HTML webpage +OptionWizard.87=Path to XML with IDM definition +OptionWizard.88=Browse... +OptionWizard.8=Password +OptionWizard.90=XML IDM definition +OptionWizard.91=Server (manager version or stand-alone use) +OptionWizard.92=Client (operator/connected to server) +OptionWizard.93=SQLite (Embedded/single file based) +OptionWizard.94=PostgreSQL +OptionWizard.95=Side of the sampling dots (in meters) +OptionWizard.9=DB Name +ProcessMonitorDialog.1=Parsing error on row number +ProcessMonitorDialog.4=, columns +ProcessMonitorDialog.5=\ -- values +SaikuAnalysisListener.0=Yes - Refresh Saiku data (long process) +SaikuAnalysisListener.1=No - Use same version of the data as last time Saiku was used +SaikuStarter.1=Starting Saiku +SaikuStarter.2=Starting Saiku can take some minutes, please wait\! +SaikuToolExportListener.1=Saiku Tool generation +SaikuToolExportListener.2=Generating Saiku Tool with current database +SaveEarthDataServlet.0=Empty request +SaveEarthDataServlet.1=Problem occurred while saving data to the database +SaveEarthDataServlet.2=The data was saved +SlopeCode.0=Flat (0-5) +YES=Yes +YES_TO_ALL=Yes to all -import org.springframework.stereotype.Component; +GenerateDatabaseStarter.1=Preparing for analysis +GenerateDatabaseStarter.2=Generating Relational Database -@Component -public class FixCoordinatesMongolia extends FixCoordinates { - - @Override - protected int getLongitudeLimit() { - return 87; - } - -} +IPCCGeneratorListener.1=Waiting for process to complete\! +IPCCGeneratorListener.2=The IPCC GHGi compatible data is being generated +IPCCGeneratorListener.3=Refresh the data (update with latest from Collect Earth) +IPCCGeneratorListener.4=Use the latest generated database (fastest process - no update) +IPCCGeneratorListener.5=GHGi Database generation +IPCCGeneratorListener.6=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming but it is necessary if the Collect Earth data has been updated since the last time.
\ No newline at end of file From 679e39a4fb377273c9901a3640c27661d89a3ff2 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:02 +0100 Subject: [PATCH 0034/1620] New translations CollectEarthUtils.java (French) --- .../earth/app/view/Messages_fr.properties | 2103 ++--------------- 1 file changed, 208 insertions(+), 1895 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 768f973a7f..8fa17ec627 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,1895 +1,208 @@ -package org.openforis.collect.earth.app.ad_hoc; - -import java.util.ArrayList; -import java.util.Arrays; - -public class findMissingCountries { - - private static ArrayList allCountryNames = new ArrayList<>( - Arrays.asList( - "Abyei", - "Afghanistan", - "Aksai_Chin", - "Albania", - "Algeria", - "American_Samoa", - "Andorra", - "Angola", - "Anguilla", - "Antarctica", - "Antigua_and_Barbuda", - "Argentina", - "Armenia", - "Aruba", - "Arunachal_Pradesh", - "Ashmore_and_Cartier_Islands", - "Australia", - "Austria", - "Azerbaijan", - "Azores_Islands", - "Bahamas", - "Bahrain", - "Baker_Island", - "Bangladesh", - "Barbados", - "Bassas_da_India", - "Belarus", - "Belgium", - "Belize", - "Benin", - "Bermuda", - "Bhutan", - "Bird_Island", - "Bolivia", - "Bosnia_and_Herzegovina", - "Botswana", - "Bouvet_Island", - "Brazil", - "British_Indian_Ocean_Territory", - "British_Virgin_Islands", - "Brunei_Darussalam", - "Bulgaria", - "Burkina_Faso", - "Burundi", - "Cambodia", - "Cameroon", - "Canada", - "Cape_Verde", - "Cayman_Islands", - "Central_African_Republic", - "Chad", - "Chile", - "China", - "China/India", - "Christmas_Island", - "Clipperton_Island", - "Cocos__Keeling__Islands", - "Colombia", - "Comoros", - "Congo", - "Cook_Islands", - "Costa_Rica", - "Croatia", - "Cuba", - "Cyprus", - "Czech_Republic", - "C�te_d_Ivoire", - "Dem_People_s_Rep_of_Korea", - "Democratic_Republic_of_the_Congo", - "Denmark", - "Djibouti", - "Dominica", - "Dominican_Republic", - "Ecuador", - "Egypt", - "El_Salvador", - "Equatorial_Guinea", - "Eritrea", - "Estonia", - "Ethiopia", - "Europa_Island", - "Falkland_Islands__Malvinas_", - "Faroe_Islands", - "Fiji", - "Finland", - "France", - "French_Guiana", - "French_Polynesia", - "French_Southern_and_Antarctic_Territories", - "Gabon", - "Gambia", - "Gaza_Strip", - "Georgia", - "Germany", - "Ghana", - "Gibraltar", - "Glorioso_Island", - "Greece", - "Greenland", - "Grenada", - "Guadeloupe", - "Guam", - "Guatemala", - "Guernsey", - "Guinea", - "Guinea-Bissau", - "Guyana", - "Haiti", - "Hala_ib_triangle", - "Heard_Island_and_McDonald_Islands", - "Holy_See", - "Honduras", - "Hong_Kong", - "Howland_Island", - "Hungary", - "Iceland", - "Ilemi_triangle", - "India", - "Indonesia", - "Iran___Islamic_Republic_of_", - "Iraq", - "Ireland", - "Isle_of_Man", - "Israel", - "Italy", - "Jamaica", - "Jammu_and_Kashmir", - "Japan", - "Jarvis_Island", - "Jersey", - "Johnston_Atoll", - "Jordan", - "Juan_de_Nova_Island", - "Kazakhstan", - "Kenya", - "Kingman_Reef", - "Kiribati", - "Kuril_islands", - "Kuwait", - "Kyrgyzstan", - "Lao_People_s_Democratic_Republic", - "Latvia", - "Lebanon", - "Lesotho", - "Liberia", - "Libya", - "Liechtenstein", - "Lithuania", - "Luxembourg", - "Ma_tan_al-Sarra", - "Macau", - "Madagascar", - "Madeira_Islands", - "Malawi", - "Malaysia", - "Maldives", - "Mali", - "Malta", - "Marshall_Islands", - "Martinique", - "Mauritania", - "Mauritius", - "Mayotte", - "Mexico", - "Micronesia__Federated_States_of_", - "Midway_Island", - "Moldova,_Republic_of", - "Monaco", - "Mongolia", - "Montenegro", - "Montserrat", - "Morocco", - "Mozambique", - "Myanmar", - "Namibia", - "Nauru", - "Navassa_Island", - "Nepal", - "Netherlands", - "Netherlands_Antilles", - "New_Caledonia", - "New_Zealand", - "Nicaragua", - "Niger", - "Nigeria", - "Niue", - "Norfolk_Island", - "Northern_Mariana_Islands", - "Norway", - "Oman", - "Pakistan", - "Palau", - "Palmyra_Atoll", - "Panama", - "Papua_New_Guinea", - "Paracel_Islands", - "Paraguay", - "Peru", - "Philippines", - "Pitcairn", - "Poland", - "Portugal", - "Puerto_Rico", - "Qatar", - "Republic_of_Korea", - "Romania", - "Russian_Federation", - "Rwanda", - "R�union", - "Saint_Helena", - "Saint_Kitts_and_Nevis", - "Saint_Lucia", - "Saint_Pierre_et_Miquelon", - "Saint_Vincent_and_the_Grenadines", - "Samoa", - "San_Marino", - "Sao_Tome_and_Principe", - "Saudi_Arabia", - "Scarborough_Reef", - "Senegal", - "Senkaku_Islands", - "Serbia", - "Seychelles", - "Sierra_Leone", - "Singapore", - "Slovakia", - "Slovenia", - "Solomon_Islands", - "Somalia", - "South_Africa", - "South_Georgia_and_the_South_Sandwich_Islands", - "South_Sudan", - "Spain", - "Spratly_Islands", - "Sri_Lanka", - "Sudan", - "Suriname", - "Svalbard_and_Jan_Mayen_Islands", - "Swaziland", - "Sweden", - "Switzerland", - "Syrian_Arab_Republic", - "Taiwan", - "Tajikistan", - "Thailand", - "The_former_Yugoslav_Republic_of_Macedonia", - "Timor-Leste", - "Togo", - "Tokelau", - "Tonga", - "Trinidad_and_Tobago", - "Tromelin_Island", - "Tunisia", - "Turkey", - "Turkmenistan", - "Turks_and_Caicos_islands", - "Tuvalu", - "UK_of_Great_Britain_and_Northern_Ireland", - "Uganda", - "Ukraine", - "United_Arab_Emirates", - "United_Republic_of_Tanzania", - "United_States_Virgin_Islands", - "United_States_of_America", - "Uruguay", - "Uzbekistan", - "Vanuatu", - "Venezuela", - "Viet_Nam", - "Wake_Island", - "Wallis_and_Futuna", - "West_Bank", - "Western_Sahara", - "Yemen", - "Zambia", - "Zimbabwe" ) ); - - private static ArrayList filesGenerated = new ArrayList<>( - Arrays.asList( "Azores_Islands_bassin_10", - "Azores_Islands_bassin_11", - "Azores_Islands_bassin_12", - "Azores_Islands", - "Azores_Islands_bassin_5", - "Azores_Islands_bassin_6", - "Azores_Islands_bassin_7", - "Azores_Islands_bassin_8", - "Azores_Islands_bassin_9", - "Brunei_Darussalam_bassin_10", - "Brunei_Darussalam_bassin_11", - "Brunei_Darussalam_bassin_12", - "Brunei_Darussalam_bassin_7", - "Brunei_Darussalam_bassin_8", - "Brunei_Darussalam_bassin_9", - "Bulgaria_bassin_10", - "Bulgaria_bassin_11", - "Bulgaria_bassin_12", - "Bulgaria", - "Bulgaria_bassin_5", - "Bulgaria_bassin_6", - "Bulgaria_bassin_7", - "Bulgaria_bassin_8", - "Bulgaria_bassin_9", - "Burkina_Faso_bassin_10", - "Burkina_Faso_bassin_11", - "Burkina_Faso_bassin_12", - "Burkina_Faso", - "Burkina_Faso_bassin_5", - "Burkina_Faso_bassin_6", - "Burkina_Faso_bassin_7", - "Burkina_Faso_bassin_8", - "Burkina_Faso_bassin_9", - "Burundi_bassin_10", - "Burundi_bassin_11", - "Burundi_bassin_12", - "Burundi", - "Burundi_bassin_5", - "Burundi_bassin_6", - "Burundi_bassin_7", - "Burundi_bassin_8", - "Burundi_bassin_9", - "Cambodia_bassin_10", - "Cambodia_bassin_11", - "Cambodia_bassin_12", - "Cambodia", - "Cambodia_bassin_5", - "Cambodia_bassin_6", - "Cambodia_bassin_7", - "Cambodia_bassin_8", - "Cambodia_bassin_9", - "Cameroon_bassin_10", - "Cameroon_bassin_11", - "Cameroon_bassin_12", - "Cameroon", - "Cameroon_bassin_5", - "Cameroon_bassin_6", - "Cameroon_bassin_7", - "Cameroon_bassin_8", - "Cameroon_bassin_9", - "Canada_bassin_10", - "Canada_bassin_11", - "Canada_bassin_12", - "Canada", - "Canada_bassin_5", - "Canada_bassin_6", - "Canada_bassin_7", - "Canada_bassin_8", - "Canada_bassin_9", - "Cape_Verde_bassin_10", - "Cape_Verde_bassin_11", - "Cape_Verde_bassin_12", - "Cape_Verde", - "Cape_Verde_bassin_5", - "Cape_Verde_bassin_6", - "Cape_Verde_bassin_7", - "Cape_Verde_bassin_8", - "Cape_Verde_bassin_9", - "Cayman_Islands_bassin_10", - "Cayman_Islands_bassin_11", - "Cayman_Islands_bassin_12", - "Cayman_Islands", - "Cayman_Islands_bassin_5", - "Cayman_Islands_bassin_6", - "Cayman_Islands_bassin_7", - "Cayman_Islands_bassin_8", - "Cayman_Islands_bassin_9", - "Central_African Republic_bassin_10", - "Central_African Republic_bassin_11", - "Central_African Republic_bassin_12", - "Central_African Republic", - "Central_African Republic_bassin_5", - "Central_African Republic_bassin_6", - "Central_African Republic_bassin_7", - "Central_African Republic_bassin_8", - "Central_African Republic_bassin_9", - "Chad_bassin_10", - "Chad_bassin_11", - "Chad_bassin_12", - "Chad", - "Chad_bassin_5", - "Chad_bassin_6", - "Chad_bassin_7", - "Chad_bassin_8", - "Chad_bassin_9", - "Chile_bassin_10", - "Chile_bassin_11", - "Chile_bassin_12", - "Chile", - "Chile_bassin_5", - "Chile_bassin_6", - "Chile_bassin_7", - "Chile_bassin_8", - "Chile_bassin_9", - "China_bassin_10", - "China_bassin_11", - "China_bassin_12", - "China", - "China_bassin_5", - "China_bassin_6", - "China_bassin_7", - "China_bassin_8", - "China_bassin_9", - "Christmas_Island_bassin_10", - "Christmas_Island_bassin_11", - "Christmas_Island_bassin_12", - "Christmas_Island", - "Christmas_Island_bassin_5", - "Christmas_Island_bassin_6", - "Christmas_Island_bassin_7", - "Christmas_Island_bassin_8", - "Christmas_Island_bassin_9", - "Clipperton_Island_bassin_10", - "Clipperton_Island_bassin_11", - "Clipperton_Island_bassin_12", - "Clipperton_Island", - "Clipperton_Island_bassin_5", - "Clipperton_Island_bassin_6", - "Clipperton_Island_bassin_7", - "Clipperton_Island_bassin_8", - "Clipperton_Island_bassin_9", - "Colombia_bassin_10", - "Colombia_bassin_11", - "Colombia_bassin_12", - "Colombia", - "Colombia_bassin_5", - "Colombia_bassin_6", - "Colombia_bassin_7", - "Colombia_bassin_8", - "Colombia_bassin_9", - "Comoros_bassin_10", - "Comoros_bassin_11", - "Comoros_bassin_12", - "Comoros", - "Comoros_bassin_5", - "Comoros_bassin_6", - "Comoros_bassin_7", - "Comoros_bassin_8", - "Comoros_bassin_9", - "Congo_bassin_10", - "Congo_bassin_11", - "Congo_bassin_12", - "Congo", - "Congo_bassin_5", - "Congo_bassin_6", - "Congo_bassin_7", - "Congo_bassin_8", - "Congo_bassin_9", - "Cook_Islands_bassin_10", - "Cook_Islands_bassin_11", - "Cook_Islands_bassin_12", - "Cook_Islands", - "Cook_Islands_bassin_5", - "Cook_Islands_bassin_6", - "Cook_Islands_bassin_7", - "Cook_Islands_bassin_8", - "Cook_Islands_bassin_9", - "Costa_Rica_bassin_10", - "Costa_Rica_bassin_11", - "Costa_Rica_bassin_12", - "Costa_Rica", - "Costa_Rica_bassin_5", - "Costa_Rica_bassin_6", - "Costa_Rica_bassin_7", - "Costa_Rica_bassin_8", - "Costa_Rica_bassin_9", - "Croatia_bassin_10", - "Croatia_bassin_11", - "Croatia_bassin_12", - "Croatia", - "Croatia_bassin_5", - "Croatia_bassin_6", - "Croatia_bassin_7", - "Croatia_bassin_8", - "Croatia_bassin_9", - "Cuba_bassin_10", - "Cuba_bassin_11", - "Cuba_bassin_12", - "Cuba", - "Cuba_bassin_5", - "Cuba_bassin_6", - "Cuba_bassin_7", - "Cuba_bassin_8", - "Cuba_bassin_9", - "Cyprus_bassin_10", - "Cyprus_bassin_11", - "Cyprus_bassin_12", - "Cyprus", - "Cyprus_bassin_5", - "Cyprus_bassin_6", - "Cyprus_bassin_7", - "Cyprus_bassin_8", - "Cyprus_bassin_9", - "Czech_Republic_bassin_10", - "Czech_Republic_bassin_11", - "Czech_Republic_bassin_12", - "Czech_Republic", - "Czech_Republic_bassin_5", - "Czech_Republic_bassin_6", - "Czech_Republic_bassin_7", - "Czech_Republic_bassin_8", - "Czech_Republic_bassin_9", - "Democratic_Republic of the Congo_bassin_10", - "Democratic_Republic of the Congo_bassin_11", - "Democratic_Republic of the Congo_bassin_12", - "Democratic_Republic of the Congo", - "Democratic_Republic of the Congo_bassin_5", - "Democratic_Republic of the Congo_bassin_6", - "Democratic_Republic of the Congo_bassin_7", - "Democratic_Republic of the Congo_bassin_8", - "Democratic_Republic of the Congo_bassin_9", - "Dem_Peoples Rep of Korea_bassin_10", - "Dem_Peoples Rep of Korea_bassin_11", - "Dem_Peoples Rep of Korea_bassin_12", - "Dem_Peoples Rep of Korea", - "Dem_Peoples Rep of Korea_bassin_5", - "Dem_Peoples Rep of Korea_bassin_6", - "Dem_Peoples Rep of Korea_bassin_7", - "Dem_Peoples Rep of Korea_bassin_8", - "Dem_Peoples Rep of Korea_bassin_9", - "Denmark_bassin_10", - "Denmark_bassin_11", - "Denmark_bassin_12", - "Denmark", - "Denmark_bassin_5", - "Denmark_bassin_6", - "Denmark_bassin_7", - "Denmark_bassin_8", - "Denmark_bassin_9", - "Djibouti_bassin_10", - "Djibouti_bassin_11", - "Djibouti_bassin_12", - "Djibouti", - "Djibouti_bassin_5", - "Djibouti_bassin_6", - "Djibouti_bassin_7", - "Djibouti_bassin_8", - "Djibouti_bassin_9", - "Dominican_Republic_bassin_10", - "Dominican_Republic_bassin_11", - "Dominican_Republic_bassin_12", - "Dominican_Republic", - "Dominican_Republic_bassin_5", - "Dominican_Republic_bassin_6", - "Dominican_Republic_bassin_7", - "Dominican_Republic_bassin_8", - "Dominican_Republic_bassin_9", - "Dominica_bassin_10", - "Dominica_bassin_11", - "Dominica_bassin_12", - "Dominica", - "Dominica_bassin_5", - "Dominica_bassin_6", - "Dominica_bassin_7", - "Dominica_bassin_8", - "Dominica_bassin_9", - "Ecuador_bassin_10", - "Ecuador_bassin_11", - "Ecuador_bassin_12", - "Ecuador", - "Ecuador_bassin_5", - "Ecuador_bassin_6", - "Ecuador_bassin_7", - "Ecuador_bassin_8", - "Ecuador_bassin_9", - "Egypt_bassin_10", - "Egypt_bassin_11", - "Egypt_bassin_12", - "Egypt", - "Egypt_bassin_5", - "Egypt_bassin_6", - "Egypt_bassin_7", - "Egypt_bassin_8", - "Egypt_bassin_9", - "El_Salvador_bassin_10", - "El_Salvador_bassin_11", - "El_Salvador_bassin_12", - "El_Salvador", - "El_Salvador_bassin_5", - "El_Salvador_bassin_6", - "El_Salvador_bassin_7", - "El_Salvador_bassin_8", - "El_Salvador_bassin_9", - "Equatorial_Guinea_bassin_10", - "Equatorial_Guinea_bassin_11", - "Equatorial_Guinea_bassin_12", - "Equatorial_Guinea", - "Equatorial_Guinea_bassin_5", - "Equatorial_Guinea_bassin_6", - "Equatorial_Guinea_bassin_7", - "Equatorial_Guinea_bassin_8", - "Equatorial_Guinea_bassin_9", - "Eritrea_bassin_10", - "Eritrea_bassin_11", - "Eritrea_bassin_12", - "Eritrea", - "Eritrea_bassin_5", - "Eritrea_bassin_6", - "Eritrea_bassin_7", - "Eritrea_bassin_8", - "Eritrea_bassin_9", - "Estonia_bassin_10", - "Estonia_bassin_11", - "Estonia_bassin_12", - "Estonia", - "Estonia_bassin_5", - "Estonia_bassin_6", - "Estonia_bassin_7", - "Estonia_bassin_8", - "Estonia_bassin_9", - "Ethiopia_bassin_10", - "Ethiopia_bassin_11", - "Ethiopia_bassin_12", - "Ethiopia", - "Ethiopia_bassin_5", - "Ethiopia_bassin_6", - "Ethiopia_bassin_7", - "Ethiopia_bassin_8", - "Ethiopia_bassin_9", - "Europa_Island_bassin_10", - "Europa_Island_bassin_11", - "Europa_Island_bassin_12", - "Europa_Island", - "Europa_Island_bassin_5", - "Europa_Island_bassin_6", - "Europa_Island_bassin_7", - "Europa_Island_bassin_8", - "Europa_Island_bassin_9", - "Faroe_Islands_bassin_10", - "Faroe_Islands_bassin_11", - "Faroe_Islands_bassin_12", - "Faroe_Islands", - "Faroe_Islands_bassin_5", - "Faroe_Islands_bassin_6", - "Faroe_Islands_bassin_7", - "Faroe_Islands_bassin_8", - "Faroe_Islands_bassin_9", - "Fiji_bassin_10", - "Fiji_bassin_11", - "Fiji_bassin_12", - "Fiji", - "Fiji_bassin_5", - "Fiji_bassin_6", - "Fiji_bassin_7", - "Fiji_bassin_8", - "Fiji_bassin_9", - "Finland_bassin_10", - "Finland_bassin_11", - "Finland_bassin_12", - "Finland", - "Finland_bassin_5", - "Finland_bassin_6", - "Finland_bassin_7", - "Finland_bassin_8", - "Finland_bassin_9", - "France_bassin_10", - "France_bassin_11", - "France_bassin_12", - "France", - "France_bassin_5", - "France_bassin_6", - "France_bassin_7", - "France_bassin_8", - "France_bassin_9", - "French_Guiana_bassin_10", - "French_Guiana_bassin_11", - "French_Guiana_bassin_12", - "French_Guiana", - "French_Guiana_bassin_5", - "French_Guiana_bassin_6", - "French_Guiana_bassin_7", - "French_Guiana_bassin_8", - "French_Guiana_bassin_9", - "French_Polynesia_bassin_10", - "French_Polynesia_bassin_11", - "French_Polynesia_bassin_12", - "French_Polynesia", - "French_Polynesia_bassin_5", - "French_Polynesia_bassin_6", - "French_Polynesia_bassin_7", - "French_Polynesia_bassin_8", - "French_Polynesia_bassin_9", - "French_Southern and Antarctic Territories_bassin_10", - "French_Southern and Antarctic Territories_bassin_11", - "French_Southern and Antarctic Territories_bassin_12", - "French_Southern and Antarctic Territories", - "French_Southern and Antarctic Territories_bassin_5", - "French_Southern and Antarctic Territories_bassin_6", - "French_Southern and Antarctic Territories_bassin_7", - "French_Southern and Antarctic Territories_bassin_8", - "French_Southern and Antarctic Territories_bassin_9", - "Gabon_bassin_10", - "Gabon_bassin_11", - "Gabon_bassin_12", - "Gabon", - "Gabon_bassin_5", - "Gabon_bassin_6", - "Gabon_bassin_7", - "Gabon_bassin_8", - "Gabon_bassin_9", - "Gambia_bassin_10", - "Gambia_bassin_11", - "Gambia_bassin_12", - "Gambia", - "Gambia_bassin_5", - "Gambia_bassin_6", - "Gambia_bassin_7", - "Gambia_bassin_8", - "Gambia_bassin_9", - "Gaza_Strip_bassin_10", - "Gaza_Strip_bassin_11", - "Gaza_Strip_bassin_12", - "Gaza_Strip", - "Gaza_Strip_bassin_5", - "Gaza_Strip_bassin_6", - "Gaza_Strip_bassin_7", - "Gaza_Strip_bassin_8", - "Gaza_Strip_bassin_9", - "Georgia_bassin_10", - "Georgia_bassin_11", - "Georgia_bassin_12", - "Georgia", - "Georgia_bassin_5", - "Georgia_bassin_6", - "Georgia_bassin_7", - "Georgia_bassin_8", - "Georgia_bassin_9", - "Germany_bassin_10", - "Germany_bassin_11", - "Germany_bassin_12", - "Germany", - "Germany_bassin_5", - "Germany_bassin_6", - "Germany_bassin_7", - "Germany_bassin_8", - "Germany_bassin_9", - "Ghana_bassin_10", - "Ghana_bassin_11", - "Ghana_bassin_12", - "Ghana", - "Ghana_bassin_5", - "Ghana_bassin_6", - "Ghana_bassin_8", - "Ghana_bassin_9", - "Gibraltar_bassin_10", - "Gibraltar_bassin_11", - "Gibraltar_bassin_12", - "Gibraltar", - "Gibraltar_bassin_5", - "Gibraltar_bassin_6", - "Gibraltar_bassin_7", - "Gibraltar_bassin_8", - "Gibraltar_bassin_9", - "Glorioso_Island_bassin_10", - "Glorioso_Island_bassin_11", - "Glorioso_Island_bassin_12", - "Glorioso_Island", - "Glorioso_Island_bassin_5", - "Glorioso_Island_bassin_6", - "Glorioso_Island_bassin_7", - "Glorioso_Island_bassin_8", - "Glorioso_Island_bassin_9", - "Greece_bassin_10", - "Greece_bassin_11", - "Greece_bassin_12", - "Greece", - "Greece_bassin_5", - "Greece_bassin_6", - "Greece_bassin_7", - "Greece_bassin_8", - "Greece_bassin_9", - "Greenland_bassin_10", - "Greenland_bassin_11", - "Greenland_bassin_12", - "Greenland", - "Greenland_bassin_5", - "Greenland_bassin_6", - "Greenland_bassin_7", - "Greenland_bassin_8", - "Greenland_bassin_9", - "Grenada_bassin_10", - "Grenada_bassin_11", - "Grenada_bassin_12", - "Grenada", - "Grenada_bassin_5", - "Grenada_bassin_6", - "Grenada_bassin_7", - "Grenada_bassin_8", - "Grenada_bassin_9", - "Guadeloupe_bassin_10", - "Guadeloupe_bassin_11", - "Guadeloupe_bassin_12", - "Guadeloupe", - "Guadeloupe_bassin_5", - "Guadeloupe_bassin_6", - "Guadeloupe_bassin_7", - "Guadeloupe_bassin_8", - "Guadeloupe_bassin_9", - "Guam_bassin_10", - "Guam_bassin_11", - "Guam_bassin_12", - "Guam", - "Guam_bassin_5", - "Guam_bassin_6", - "Guam_bassin_7", - "Guam_bassin_8", - "Guam_bassin_9", - "Halaib_triangle_bassin_10", - "Halaib_triangle_bassin_11", - "Halaib_triangle_bassin_12", - "Halaib_triangle", - "Halaib_triangle_bassin_5", - "Halaib_triangle_bassin_6", - "Halaib_triangle_bassin_7", - "Halaib_triangle_bassin_8", - "Halaib_triangle_bassin_9", - "Heard_Island and McDonald Islands_bassin_12", - "Holy_See_bassin_10", - "Holy_See_bassin_11", - "Holy_See_bassin_12", - "Holy_See", - "Holy_See_bassin_5", - "Holy_See_bassin_6", - "Holy_See_bassin_7", - "Holy_See_bassin_8", - "Holy_See_bassin_9", - "Honduras_bassin_10", - "Honduras_bassin_11", - "Honduras_bassin_12", - "Honduras", - "Honduras_bassin_5", - "Honduras_bassin_6", - "Honduras_bassin_7", - "Honduras_bassin_8", - "Honduras_bassin_9", - "Hong_Kong_bassin_10", - "Hong_Kong_bassin_11", - "Hong_Kong_bassin_12", - "Hong_Kong", - "Hong_Kong_bassin_5", - "Hong_Kong_bassin_6", - "Hong_Kong_bassin_7", - "Hong_Kong_bassin_8", - "Hong_Kong_bassin_9", - "Howland_Island_bassin_10", - "Howland_Island_bassin_11", - "Howland_Island_bassin_12", - "Howland_Island", - "Howland_Island_bassin_5", - "Howland_Island_bassin_6", - "Howland_Island_bassin_7", - "Howland_Island_bassin_8", - "Howland_Island_bassin_9", - "Hungary_bassin_10", - "Hungary_bassin_11", - "Hungary_bassin_12", - "Hungary", - "Hungary_bassin_5", - "Hungary_bassin_6", - "Hungary_bassin_7", - "Hungary_bassin_8", - "Hungary_bassin_9", - "Iceland_bassin_10", - "Iceland_bassin_11", - "Iceland_bassin_12", - "Iceland", - "Iceland_bassin_5", - "Iceland_bassin_6", - "Iceland_bassin_7", - "Iceland_bassin_8", - "Iceland_bassin_9", - "Ilemi_triangle_bassin_10", - "Ilemi_triangle_bassin_11", - "Ilemi_triangle_bassin_12", - "Ilemi_triangle", - "Ilemi_triangle_bassin_5", - "Ilemi_triangle_bassin_6", - "Ilemi_triangle_bassin_7", - "Ilemi_triangle_bassin_8", - "Ilemi_triangle_bassin_9", - "India_bassin_10", - "India_bassin_11", - "India_bassin_12", - "India", - "India_bassin_5", - "India_bassin_6", - "India_bassin_7", - "India_bassin_8", - "India_bassin_9", - "Indonesia_bassin_10", - "Indonesia_bassin_11", - "Indonesia_bassin_12", - "Indonesia", - "Indonesia_bassin_5", - "Indonesia_bassin_6", - "Indonesia_bassin_7", - "Indonesia_bassin_8", - "Indonesia_bassin_9", - "Iraq_bassin_10", - "Iraq_bassin_11", - "Iraq_bassin_12", - "Iraq", - "Iraq_bassin_5", - "Iraq_bassin_6", - "Iraq_bassin_7", - "Iraq_bassin_8", - "Iraq_bassin_9", - "Ireland_bassin_10", - "Ireland_bassin_11", - "Ireland_bassin_12", - "Ireland", - "Ireland_bassin_5", - "Ireland_bassin_6", - "Ireland_bassin_7", - "Ireland_bassin_8", - "Ireland_bassin_9", - "Isle_of Man_bassin_10", - "Isle_of Man_bassin_11", - "Isle_of Man_bassin_12", - "Isle_of Man", - "Isle_of Man_bassin_5", - "Isle_of Man_bassin_6", - "Isle_of Man_bassin_7", - "Isle_of Man_bassin_8", - "Isle_of Man_bassin_9", - "Israel_bassin_10", - "Israel_bassin_11", - "Israel_bassin_12", - "Israel", - "Israel_bassin_5", - "Israel_bassin_6", - "Israel_bassin_7", - "Israel_bassin_8", - "Israel_bassin_9", - "Italy_bassin_10", - "Italy_bassin_11", - "Italy_bassin_12", - "Italy", - "Italy_bassin_5", - "Italy_bassin_6", - "Italy_bassin_7", - "Italy_bassin_8", - "Italy_bassin_9", - "Jamaica_bassin_10", - "Jamaica_bassin_11", - "Jamaica_bassin_12", - "Jamaica", - "Jamaica_bassin_5", - "Jamaica_bassin_6", - "Jamaica_bassin_7", - "Jamaica_bassin_8", - "Jamaica_bassin_9", - "Jammu_and Kashmir_bassin_10", - "Jammu_and Kashmir_bassin_11", - "Jammu_and Kashmir_bassin_12", - "Jammu_and Kashmir", - "Jammu_and Kashmir_bassin_5", - "Jammu_and Kashmir_bassin_6", - "Jammu_and Kashmir_bassin_7", - "Jammu_and Kashmir_bassin_8", - "Jammu_and Kashmir_bassin_9", - "Japan_bassin_10", - "Japan_bassin_11", - "Japan_bassin_12", - "Japan", - "Japan_bassin_5", - "Japan_bassin_6", - "Japan_bassin_7", - "Japan_bassin_8", - "Japan_bassin_9", - "Jarvis_Island_bassin_10", - "Jarvis_Island_bassin_11", - "Jarvis_Island_bassin_12", - "Jarvis_Island", - "Jarvis_Island_bassin_5", - "Jarvis_Island_bassin_6", - "Jarvis_Island_bassin_7", - "Jarvis_Island_bassin_8", - "Jarvis_Island_bassin_9", - "Jersey_bassin_10", - "Jersey_bassin_11", - "Jersey_bassin_12", - "Jersey", - "Jersey_bassin_5", - "Jersey_bassin_6", - "Jersey_bassin_7", - "Jersey_bassin_8", - "Jersey_bassin_9", - "Johnston_Atoll_bassin_10", - "Johnston_Atoll_bassin_11", - "Johnston_Atoll_bassin_12", - "Johnston_Atoll", - "Johnston_Atoll_bassin_5", - "Johnston_Atoll_bassin_6", - "Johnston_Atoll_bassin_7", - "Johnston_Atoll_bassin_8", - "Johnston_Atoll_bassin_9", - "Jordan_bassin_10", - "Jordan_bassin_11", - "Jordan_bassin_12", - "Jordan", - "Jordan_bassin_5", - "Jordan_bassin_6", - "Jordan_bassin_7", - "Jordan_bassin_8", - "Jordan_bassin_9", - "Juan_de Nova Island_bassin_10", - "Juan_de Nova Island_bassin_11", - "Juan_de Nova Island_bassin_12", - "Juan_de Nova Island", - "Juan_de Nova Island_bassin_5", - "Juan_de Nova Island_bassin_6", - "Juan_de Nova Island_bassin_7", - "Juan_de Nova Island_bassin_8", - "Juan_de Nova Island_bassin_9", - "Kazakhstan_bassin_10", - "Kazakhstan_bassin_11", - "Kazakhstan_bassin_12", - "Kazakhstan", - "Kazakhstan_bassin_5", - "Kazakhstan_bassin_6", - "Kazakhstan_bassin_7", - "Kazakhstan_bassin_8", - "Kazakhstan_bassin_9", - "Kenya_bassin_10", - "Kenya_bassin_11", - "Kenya_bassin_12", - "Kenya", - "Kenya_bassin_5", - "Kenya_bassin_6", - "Kenya_bassin_7", - "Kenya_bassin_8", - "Kenya_bassin_9", - "Kingman_Reef_bassin_10", - "Kingman_Reef_bassin_11", - "Kingman_Reef_bassin_12", - "Kingman_Reef", - "Kingman_Reef_bassin_5", - "Kingman_Reef_bassin_6", - "Kingman_Reef_bassin_7", - "Kingman_Reef_bassin_8", - "Kingman_Reef_bassin_9", - "Kiribati_bassin_10", - "Kiribati_bassin_11", - "Kiribati_bassin_12", - "Kiribati", - "Kiribati_bassin_5", - "Kiribati_bassin_6", - "Kiribati_bassin_7", - "Kiribati_bassin_8", - "Kiribati_bassin_9", - "Kuril_islands_bassin_10", - "Kuril_islands_bassin_11", - "Kuril_islands_bassin_12", - "Kuril_islands", - "Kuril_islands_bassin_5", - "Kuril_islands_bassin_6", - "Kuril_islands_bassin_7", - "Kuril_islands_bassin_8", - "Kuril_islands_bassin_9", - "Kuwait_bassin_10", - "Kuwait_bassin_11", - "Kuwait_bassin_12", - "Kuwait", - "Kuwait_bassin_5", - "Kuwait_bassin_6", - "Kuwait_bassin_7", - "Kuwait_bassin_8", - "Kuwait_bassin_9", - "Kyrgyzstan_bassin_10", - "Kyrgyzstan_bassin_11", - "Kyrgyzstan_bassin_12", - "Kyrgyzstan", - "Kyrgyzstan_bassin_5", - "Kyrgyzstan_bassin_6", - "Kyrgyzstan_bassin_7", - "Kyrgyzstan_bassin_8", - "Kyrgyzstan_bassin_9", - "Lao_Peoples Democratic Republic_bassin_10", - "Lao_Peoples Democratic Republic_bassin_11", - "Lao_Peoples Democratic Republic_bassin_12", - "Lao_Peoples Democratic Republic", - "Lao_Peoples Democratic Republic_bassin_5", - "Lao_Peoples Democratic Republic_bassin_6", - "Lao_Peoples Democratic Republic_bassin_7", - "Lao_Peoples Democratic Republic_bassin_8", - "Lao_Peoples Democratic Republic_bassin_9", - "Latvia_bassin_10", - "Latvia_bassin_11", - "Latvia_bassin_12", - "Latvia", - "Latvia_bassin_5", - "Latvia_bassin_6", - "Latvia_bassin_7", - "Latvia_bassin_8", - "Latvia_bassin_9", - "Lebanon_bassin_10", - "Lebanon_bassin_11", - "Lebanon_bassin_12", - "Lebanon", - "Lebanon_bassin_5", - "Lebanon_bassin_6", - "Lebanon_bassin_7", - "Lebanon_bassin_8", - "Lebanon_bassin_9", - "Lesotho_bassin_10", - "Lesotho_bassin_11", - "Lesotho_bassin_12", - "Lesotho", - "Lesotho_bassin_5", - "Lesotho_bassin_6", - "Lesotho_bassin_7", - "Lesotho_bassin_8", - "Lesotho_bassin_9", - "Liberia_bassin_10", - "Liberia_bassin_11", - "Liberia_bassin_12", - "Liberia", - "Liberia_bassin_5", - "Liberia_bassin_6", - "Liberia_bassin_7", - "Liberia_bassin_8", - "Liberia_bassin_9", - "Libya_bassin_10", - "Libya_bassin_11", - "Libya_bassin_12", - "Libya", - "Libya_bassin_5", - "Libya_bassin_6", - "Libya_bassin_7", - "Libya_bassin_8", - "Libya_bassin_9", - "Liechtenstein_bassin_10", - "Liechtenstein_bassin_11", - "Liechtenstein_bassin_12", - "Liechtenstein", - "Liechtenstein_bassin_5", - "Liechtenstein_bassin_6", - "Liechtenstein_bassin_7", - "Liechtenstein_bassin_8", - "Liechtenstein_bassin_9", - "Lithuania_bassin_10", - "Lithuania_bassin_11", - "Lithuania_bassin_12", - "Lithuania", - "Lithuania_bassin_5", - "Lithuania_bassin_6", - "Lithuania_bassin_7", - "Lithuania_bassin_8", - "Lithuania_bassin_9", - "Luxembourg_bassin_10", - "Luxembourg_bassin_11", - "Luxembourg_bassin_12", - "Luxembourg", - "Luxembourg_bassin_5", - "Luxembourg_bassin_6", - "Luxembourg_bassin_7", - "Luxembourg_bassin_8", - "Luxembourg_bassin_9", - "Macau_bassin_10", - "Macau_bassin_11", - "Macau_bassin_12", - "Macau", - "Macau_bassin_5", - "Macau_bassin_6", - "Macau_bassin_7", - "Macau_bassin_8", - "Macau_bassin_9", - "Madagascar_bassin_10", - "Madagascar_bassin_11", - "Madagascar_bassin_12", - "Madagascar", - "Madagascar_bassin_5", - "Madagascar_bassin_6", - "Madagascar_bassin_7", - "Madagascar_bassin_8", - "Madagascar_bassin_9", - "Madeira_Islands_bassin_10", - "Madeira_Islands_bassin_11", - "Madeira_Islands_bassin_12", - "Madeira_Islands", - "Madeira_Islands_bassin_5", - "Madeira_Islands_bassin_6", - "Madeira_Islands_bassin_7", - "Madeira_Islands_bassin_8", - "Madeira_Islands_bassin_9", - "Malawi_bassin_10", - "Malawi_bassin_11", - "Malawi_bassin_12", - "Malawi", - "Malawi_bassin_5", - "Malawi_bassin_6", - "Malawi_bassin_7", - "Malawi_bassin_8", - "Malawi_bassin_9", - "Malaysia_bassin_10", - "Malaysia_bassin_11", - "Malaysia_bassin_12", - "Malaysia", - "Malaysia_bassin_5", - "Malaysia_bassin_6", - "Malaysia_bassin_7", - "Malaysia_bassin_8", - "Malaysia_bassin_9", - "Maldives_bassin_10", - "Maldives_bassin_11", - "Maldives_bassin_12", - "Maldives", - "Maldives_bassin_5", - "Maldives_bassin_6", - "Maldives_bassin_7", - "Maldives_bassin_8", - "Maldives_bassin_9", - "Matan_al-Sarra_bassin_10", - "Matan_al-Sarra_bassin_11", - "Matan_al-Sarra_bassin_12", - "Matan_al-Sarra", - "Matan_al-Sarra_bassin_5", - "Matan_al-Sarra_bassin_6", - "Matan_al-Sarra_bassin_7", - "Matan_al-Sarra_bassin_8", - "Matan_al-Sarra_bassin_9", - "Montenegro_bassin_10", - "Montenegro_bassin_11", - "Montenegro_bassin_12", - "Montenegro", - "Montenegro_bassin_5", - "Montenegro_bassin_6", - "Montenegro_bassin_7", - "Montenegro_bassin_8", - "Montenegro_bassin_9", - "Qatar_bassin_10", - "Qatar_bassin_11", - "Qatar_bassin_12", - "Republic_of Korea_bassin_10", - "Republic_of Korea_bassin_11", - "Republic_of Korea_bassin_12", - "Republic_of Korea", - "Republic_of Korea_bassin_5", - "Republic_of Korea_bassin_6", - "Republic_of Korea_bassin_7", - "Republic_of Korea_bassin_8", - "Republic_of Korea_bassin_9", - "Romania_bassin_10", - "Romania_bassin_11", - "Romania_bassin_12", - "Romania", - "Romania_bassin_5", - "Romania_bassin_6", - "Romania_bassin_7", - "Romania_bassin_8", - "Romania_bassin_9", - "Russian_Federation_bassin_10", - "Russian_Federation_bassin_11", - "Russian_Federation_bassin_12", - "Russian_Federation", - "Russian_Federation_bassin_5", - "Russian_Federation_bassin_6", - "Russian_Federation_bassin_7", - "Russian_Federation_bassin_8", - "Russian_Federation_bassin_9", - "Rwanda_bassin_10", - "Rwanda_bassin_11", - "Rwanda_bassin_12", - "Rwanda", - "Rwanda_bassin_5", - "Rwanda_bassin_6", - "Rwanda_bassin_7", - "Rwanda_bassin_8", - "Rwanda_bassin_9", - "Saint_Helena_bassin_10", - "Saint_Helena_bassin_11", - "Saint_Helena_bassin_12", - "Saint_Helena", - "Saint_Helena_bassin_5", - "Saint_Helena_bassin_6", - "Saint_Helena_bassin_7", - "Saint_Helena_bassin_8", - "Saint_Helena_bassin_9", - "Saint_Kitts and Nevis_bassin_10", - "Saint_Kitts and Nevis_bassin_11", - "Saint_Kitts and Nevis_bassin_12", - "Saint_Kitts and Nevis", - "Saint_Kitts and Nevis_bassin_5", - "Saint_Kitts and Nevis_bassin_6", - "Saint_Kitts and Nevis_bassin_7", - "Saint_Kitts and Nevis_bassin_8", - "Saint_Kitts and Nevis_bassin_9", - "Saint_Lucia_bassin_10", - "Saint_Lucia_bassin_11", - "Saint_Lucia_bassin_12", - "Saint_Lucia", - "Saint_Lucia_bassin_5", - "Saint_Lucia_bassin_6", - "Saint_Lucia_bassin_7", - "Saint_Lucia_bassin_8", - "Saint_Lucia_bassin_9", - "Saint_Pierre et Miquelon_bassin_10", - "Saint_Pierre et Miquelon_bassin_11", - "Saint_Pierre et Miquelon_bassin_12", - "Saint_Pierre et Miquelon", - "Saint_Pierre et Miquelon_bassin_5", - "Saint_Pierre et Miquelon_bassin_6", - "Saint_Pierre et Miquelon_bassin_7", - "Saint_Pierre et Miquelon_bassin_8", - "Saint_Pierre et Miquelon_bassin_9", - "Saint_Vincent and the Grenadines_bassin_10", - "Saint_Vincent and the Grenadines_bassin_11", - "Saint_Vincent and the Grenadines_bassin_12", - "Saint_Vincent and the Grenadines", - "Saint_Vincent and the Grenadines_bassin_5", - "Saint_Vincent and the Grenadines_bassin_6", - "Saint_Vincent and the Grenadines_bassin_7", - "Saint_Vincent and the Grenadines_bassin_8", - "Saint_Vincent and the Grenadines_bassin_9", - "Samoa_bassin_10", - "Samoa_bassin_11", - "Samoa_bassin_12", - "Samoa", - "Samoa_bassin_5", - "Samoa_bassin_6", - "Samoa_bassin_7", - "Samoa_bassin_8", - "Samoa_bassin_9", - "San_Marino_bassin_10", - "San_Marino_bassin_11", - "San_Marino_bassin_12", - "San_Marino", - "San_Marino_bassin_5", - "San_Marino_bassin_6", - "San_Marino_bassin_7", - "San_Marino_bassin_8", - "San_Marino_bassin_9", - "Sao_Tome and Principe_bassin_10", - "Sao_Tome and Principe_bassin_11", - "Sao_Tome and Principe_bassin_12", - "Sao_Tome and Principe", - "Sao_Tome and Principe_bassin_5", - "Sao_Tome and Principe_bassin_6", - "Sao_Tome and Principe_bassin_7", - "Sao_Tome and Principe_bassin_8", - "Sao_Tome and Principe_bassin_9", - "Saudi_Arabia_bassin_10", - "Saudi_Arabia_bassin_11", - "Saudi_Arabia_bassin_12", - "Saudi_Arabia", - "Saudi_Arabia_bassin_5", - "Saudi_Arabia_bassin_6", - "Saudi_Arabia_bassin_7", - "Saudi_Arabia_bassin_8", - "Saudi_Arabia_bassin_9", - "Scarborough_Reef_bassin_10", - "Scarborough_Reef_bassin_11", - "Scarborough_Reef_bassin_12", - "Scarborough_Reef", - "Scarborough_Reef_bassin_5", - "Scarborough_Reef_bassin_6", - "Scarborough_Reef_bassin_7", - "Scarborough_Reef_bassin_8", - "Scarborough_Reef_bassin_9", - "Senegal_bassin_10", - "Senegal_bassin_11", - "Senegal_bassin_12", - "Senegal", - "Senegal_bassin_5", - "Senegal_bassin_6", - "Senegal_bassin_7", - "Senegal_bassin_8", - "Senegal_bassin_9", - "Senkaku_Islands_bassin_10", - "Senkaku_Islands_bassin_11", - "Senkaku_Islands_bassin_12", - "Senkaku_Islands", - "Senkaku_Islands_bassin_5", - "Senkaku_Islands_bassin_6", - "Senkaku_Islands_bassin_7", - "Senkaku_Islands_bassin_8", - "Senkaku_Islands_bassin_9", - "Serbia_bassin_10", - "Serbia_bassin_11", - "Serbia_bassin_12", - "Serbia", - "Serbia_bassin_5", - "Serbia_bassin_6", - "Serbia_bassin_7", - "Serbia_bassin_8", - "Serbia_bassin_9", - "Seychelles_bassin_10", - "Seychelles_bassin_11", - "Seychelles_bassin_12", - "Seychelles", - "Seychelles_bassin_5", - "Seychelles_bassin_6", - "Seychelles_bassin_7", - "Seychelles_bassin_8", - "Seychelles_bassin_9", - "Sierra_Leone_bassin_10", - "Sierra_Leone_bassin_11", - "Sierra_Leone_bassin_12", - "Sierra_Leone", - "Sierra_Leone_bassin_5", - "Sierra_Leone_bassin_6", - "Sierra_Leone_bassin_7", - "Sierra_Leone_bassin_8", - "Sierra_Leone_bassin_9", - "Singapore_bassin_10", - "Singapore_bassin_11", - "Singapore_bassin_12", - "Singapore", - "Singapore_bassin_5", - "Singapore_bassin_6", - "Singapore_bassin_7", - "Singapore_bassin_8", - "Singapore_bassin_9", - "Slovakia_bassin_10", - "Slovakia_bassin_11", - "Slovakia_bassin_12", - "Slovakia", - "Slovakia_bassin_5", - "Slovakia_bassin_6", - "Slovakia_bassin_7", - "Slovakia_bassin_8", - "Slovakia_bassin_9", - "Slovenia_bassin_10", - "Slovenia_bassin_11", - "Slovenia_bassin_12", - "Slovenia", - "Slovenia_bassin_5", - "Slovenia_bassin_6", - "Slovenia_bassin_7", - "Slovenia_bassin_8", - "Slovenia_bassin_9", - "Solomon_Islands_bassin_10", - "Solomon_Islands_bassin_11", - "Solomon_Islands_bassin_12", - "Solomon_Islands", - "Solomon_Islands_bassin_5", - "Solomon_Islands_bassin_6", - "Solomon_Islands_bassin_7", - "Solomon_Islands_bassin_8", - "Solomon_Islands_bassin_9", - "Somalia_bassin_10", - "Somalia_bassin_11", - "Somalia_bassin_12", - "Somalia", - "Somalia_bassin_5", - "Somalia_bassin_6", - "Somalia_bassin_7", - "Somalia_bassin_8", - "Somalia_bassin_9", - "South_Africa_bassin_10", - "South_Africa_bassin_11", - "South_Africa_bassin_12", - "South_Africa", - "South_Africa_bassin_5", - "South_Africa_bassin_6", - "South_Africa_bassin_7", - "South_Africa_bassin_8", - "South_Africa_bassin_9", - "South_Georgia and the South Sandwich Islands_bassin_10", - "South_Georgia and the South Sandwich Islands_bassin_11", - "South_Georgia and the South Sandwich Islands_bassin_12", - "South_Georgia and the South Sandwich Islands", - "South_Georgia and the South Sandwich Islands_bassin_5", - "South_Georgia and the South Sandwich Islands_bassin_6", - "South_Georgia and the South Sandwich Islands_bassin_7", - "South_Georgia and the South Sandwich Islands_bassin_8", - "South_Georgia and the South Sandwich Islands_bassin_9", - "South_Sudan_bassin_10", - "South_Sudan_bassin_11", - "South_Sudan_bassin_12", - "South_Sudan", - "South_Sudan_bassin_5", - "South_Sudan_bassin_6", - "South_Sudan_bassin_7", - "South_Sudan_bassin_8", - "South_Sudan_bassin_9", - "Spain_bassin_10", - "Spain_bassin_11", - "Spain_bassin_12", - "Spain", - "Spain_bassin_5", - "Spain_bassin_6", - "Spain_bassin_7", - "Spain_bassin_8", - "Spain_bassin_9", - "Spratly_Islands_bassin_10", - "Spratly_Islands_bassin_11", - "Spratly_Islands_bassin_12", - "Spratly_Islands", - "Spratly_Islands_bassin_5", - "Spratly_Islands_bassin_6", - "Spratly_Islands_bassin_7", - "Spratly_Islands_bassin_8", - "Spratly_Islands_bassin_9", - "Sri_Lanka_bassin_10", - "Sri_Lanka_bassin_11", - "Sri_Lanka_bassin_12", - "Sri_Lanka", - "Sri_Lanka_bassin_5", - "Sri_Lanka_bassin_6", - "Sri_Lanka_bassin_7", - "Sri_Lanka_bassin_8", - "Sri_Lanka_bassin_9", - "Suriname_bassin_10", - "Suriname_bassin_11", - "Suriname_bassin_12", - "Suriname", - "Suriname_bassin_5", - "Suriname_bassin_6", - "Suriname_bassin_7", - "Suriname_bassin_8", - "Suriname_bassin_9", - "Svalbard_and Jan Mayen Islands_bassin_10", - "Svalbard_and Jan Mayen Islands_bassin_11", - "Svalbard_and Jan Mayen Islands_bassin_12", - "Svalbard_and Jan Mayen Islands", - "Svalbard_and Jan Mayen Islands_bassin_5", - "Svalbard_and Jan Mayen Islands_bassin_6", - "Svalbard_and Jan Mayen Islands_bassin_7", - "Svalbard_and Jan Mayen Islands_bassin_8", - "Svalbard_and Jan Mayen Islands_bassin_9", - "Swaziland_bassin_10", - "Swaziland_bassin_11", - "Swaziland_bassin_12", - "Swaziland", - "Swaziland_bassin_5", - "Swaziland_bassin_6", - "Swaziland_bassin_7", - "Swaziland_bassin_8", - "Swaziland_bassin_9", - "Sweden_bassin_10", - "Sweden_bassin_11", - "Sweden_bassin_12", - "Sweden", - "Sweden_bassin_5", - "Sweden_bassin_6", - "Sweden_bassin_7", - "Sweden_bassin_8", - "Sweden_bassin_9", - "Switzerland_bassin_10", - "Switzerland_bassin_11", - "Switzerland_bassin_12", - "Switzerland", - "Switzerland_bassin_5", - "Switzerland_bassin_6", - "Switzerland_bassin_7", - "Switzerland_bassin_8", - "Switzerland_bassin_9", - "Syrian_Arab Republic_bassin_10", - "Syrian_Arab Republic_bassin_11", - "Syrian_Arab Republic_bassin_12", - "Syrian_Arab Republic", - "Syrian_Arab Republic_bassin_5", - "Syrian_Arab Republic_bassin_6", - "Syrian_Arab Republic_bassin_7", - "Syrian_Arab Republic_bassin_8", - "Syrian_Arab Republic_bassin_9", - "Taiwan_bassin_10", - "Taiwan_bassin_11", - "Taiwan_bassin_12", - "Taiwan", - "Taiwan_bassin_5", - "Taiwan_bassin_6", - "Taiwan_bassin_7", - "Taiwan_bassin_8", - "Taiwan_bassin_9", - "Tajikistan_bassin_10", - "Tajikistan_bassin_11", - "Tajikistan_bassin_12", - "Tajikistan", - "Tajikistan_bassin_5", - "Tajikistan_bassin_6", - "Tajikistan_bassin_7", - "Tajikistan_bassin_8", - "Tajikistan_bassin_9", - "Thailand_bassin_10", - "Thailand_bassin_11", - "Thailand_bassin_12", - "Thailand", - "Thailand_bassin_5", - "Thailand_bassin_6", - "Thailand_bassin_7", - "Thailand_bassin_8", - "Thailand_bassin_9", - "The_former Yugoslav Republic of Macedonia_bassin_10", - "The_former Yugoslav Republic of Macedonia_bassin_11", - "The_former Yugoslav Republic of Macedonia_bassin_12", - "The_former Yugoslav Republic of Macedonia", - "The_former Yugoslav Republic of Macedonia_bassin_5", - "The_former Yugoslav Republic of Macedonia_bassin_6", - "The_former Yugoslav Republic of Macedonia_bassin_7", - "The_former Yugoslav Republic of Macedonia_bassin_8", - "The_former Yugoslav Republic of Macedonia_bassin_9", - "Timor-Leste_bassin_10", - "Timor-Leste_bassin_11", - "Timor-Leste_bassin_12", - "Timor-Leste", - "Timor-Leste_bassin_5", - "Timor-Leste_bassin_6", - "Timor-Leste_bassin_7", - "Timor-Leste_bassin_8", - "Timor-Leste_bassin_9", - "Togo_bassin_10", - "Togo_bassin_11", - "Togo_bassin_12", - "Togo", - "Togo_bassin_5", - "Togo_bassin_6", - "Togo_bassin_7", - "Togo_bassin_8", - "Togo_bassin_9", - "Tokelau_bassin_10", - "Tokelau_bassin_11", - "Tokelau_bassin_12", - "Tokelau", - "Tokelau_bassin_5", - "Tokelau_bassin_6", - "Tokelau_bassin_7", - "Tokelau_bassin_8", - "Tokelau_bassin_9", - "Tonga_bassin_10", - "Tonga_bassin_11", - "Tonga_bassin_12", - "Tonga", - "Tonga_bassin_5", - "Tonga_bassin_6", - "Tonga_bassin_7", - "Tonga_bassin_8", - "Tonga_bassin_9", - "Trinidad_and Tobago_bassin_10", - "Trinidad_and Tobago_bassin_11", - "Trinidad_and Tobago_bassin_12", - "Trinidad_and Tobago", - "Trinidad_and Tobago_bassin_5", - "Trinidad_and Tobago_bassin_6", - "Trinidad_and Tobago_bassin_7", - "Trinidad_and Tobago_bassin_8", - "Trinidad_and Tobago_bassin_9", - "Tromelin_Island_bassin_10", - "Tromelin_Island_bassin_11", - "Tromelin_Island_bassin_12", - "Tromelin_Island", - "Tromelin_Island_bassin_5", - "Tromelin_Island_bassin_6", - "Tromelin_Island_bassin_7", - "Tromelin_Island_bassin_8", - "Tromelin_Island_bassin_9", - "Tunisia_bassin_10", - "Tunisia_bassin_11", - "Tunisia_bassin_12", - "Tunisia", - "Tunisia_bassin_5", - "Tunisia_bassin_6", - "Tunisia_bassin_7", - "Tunisia_bassin_8", - "Tunisia_bassin_9", - "Turkey_bassin_10", - "Turkey_bassin_11", - "Turkey_bassin_12", - "Turkey", - "Turkey_bassin_5", - "Turkey_bassin_6", - "Turkey_bassin_7", - "Turkey_bassin_8", - "Turkey_bassin_9", - "Turkmenistan_bassin_10", - "Turkmenistan_bassin_11", - "Turkmenistan_bassin_12", - "Turkmenistan", - "Turkmenistan_bassin_5", - "Turkmenistan_bassin_6", - "Turkmenistan_bassin_7", - "Turkmenistan_bassin_8", - "Turkmenistan_bassin_9", - "Turks_and Caicos islands_bassin_10", - "Turks_and Caicos islands_bassin_11", - "Turks_and Caicos islands_bassin_12", - "Turks_and Caicos islands", - "Turks_and Caicos islands_bassin_5", - "Turks_and Caicos islands_bassin_6", - "Turks_and Caicos islands_bassin_7", - "Turks_and Caicos islands_bassin_8", - "Turks_and Caicos islands_bassin_9", - "Tuvalu_bassin_10", - "Tuvalu_bassin_11", - "Tuvalu_bassin_12", - "Tuvalu", - "Tuvalu_bassin_5", - "Tuvalu_bassin_6", - "Tuvalu_bassin_7", - "Tuvalu_bassin_8", - "Tuvalu_bassin_9", - "Uganda_bassin_10", - "Uganda_bassin_11", - "Uganda_bassin_12", - "Uganda", - "Uganda_bassin_5", - "Uganda_bassin_6", - "Uganda_bassin_7", - "Uganda_bassin_8", - "Uganda_bassin_9", - "Ukraine_bassin_10", - "Ukraine_bassin_11", - "Ukraine_bassin_12", - "Ukraine", - "Ukraine_bassin_5", - "Ukraine_bassin_6", - "Ukraine_bassin_7", - "Ukraine_bassin_8", - "Ukraine_bassin_9", - "UK_of Great Britain and Northern Ireland_bassin_10", - "UK_of Great Britain and Northern Ireland_bassin_11", - "UK_of Great Britain and Northern Ireland_bassin_12", - "UK_of Great Britain and Northern Ireland", - "UK_of Great Britain and Northern Ireland_bassin_5", - "UK_of Great Britain and Northern Ireland_bassin_6", - "UK_of Great Britain and Northern Ireland_bassin_7", - "UK_of Great Britain and Northern Ireland_bassin_8", - "UK_of Great Britain and Northern Ireland_bassin_9", - "United_Arab Emirates_bassin_10", - "United_Arab Emirates_bassin_11", - "United_Arab Emirates_bassin_12", - "United_Arab Emirates", - "United_Arab Emirates_bassin_5", - "United_Arab Emirates_bassin_6", - "United_Arab Emirates_bassin_7", - "United_Arab Emirates_bassin_8", - "United_Arab Emirates_bassin_9", - "United_Republic of Tanzania_bassin_10", - "United_Republic of Tanzania_bassin_11", - "United_Republic of Tanzania_bassin_12", - "United_Republic of Tanzania", - "United_Republic of Tanzania_bassin_5", - "United_Republic of Tanzania_bassin_6", - "United_Republic of Tanzania_bassin_7", - "United_Republic of Tanzania_bassin_8", - "United_Republic of Tanzania_bassin_9", - "United_States of America_bassin_10", - "United_States of America_bassin_11", - "United_States of America_bassin_12", - "United_States of America", - "United_States of America_bassin_5", - "United_States of America_bassin_6", - "United_States of America_bassin_7", - "United_States of America_bassin_8", - "United_States of America_bassin_9", - "United_States Virgin Islands_bassin_10", - "United_States Virgin Islands_bassin_11", - "United_States Virgin Islands_bassin_12", - "United_States Virgin Islands", - "United_States Virgin Islands_bassin_5", - "United_States Virgin Islands_bassin_6", - "United_States Virgin Islands_bassin_7", - "United_States Virgin Islands_bassin_8", - "United_States Virgin Islands_bassin_9", - "Uruguay_bassin_10", - "Uruguay_bassin_11", - "Uruguay_bassin_12", - "Uruguay", - "Uruguay_bassin_5", - "Uruguay_bassin_6", - "Uruguay_bassin_7", - "Uruguay_bassin_8", - "Uruguay_bassin_9", - "Uzbekistan_bassin_10", - "Uzbekistan_bassin_11", - "Uzbekistan_bassin_12", - "Uzbekistan", - "Uzbekistan_bassin_5", - "Uzbekistan_bassin_6", - "Uzbekistan_bassin_7", - "Uzbekistan_bassin_8", - "Uzbekistan_bassin_9", - "Vanuatu_bassin_10", - "Vanuatu_bassin_11", - "Vanuatu_bassin_12", - "Vanuatu", - "Vanuatu_bassin_5", - "Vanuatu_bassin_6", - "Vanuatu_bassin_7", - "Vanuatu_bassin_8", - "Vanuatu_bassin_9", - "Venezuela_bassin_10", - "Venezuela_bassin_11", - "Venezuela_bassin_12", - "Venezuela", - "Venezuela_bassin_5", - "Venezuela_bassin_6", - "Venezuela_bassin_7", - "Venezuela_bassin_8", - "Venezuela_bassin_9", - "Viet_Nam_bassin_10", - "Viet_Nam_bassin_11", - "Viet_Nam_bassin_12", - "Viet_Nam", - "Viet_Nam_bassin_5", - "Viet_Nam_bassin_6", - "Viet_Nam_bassin_7", - "Viet_Nam_bassin_8", - "Viet_Nam_bassin_9", - "Wake_Island_bassin_10", - "Wake_Island_bassin_11", - "Wake_Island_bassin_12", - "Wake_Island", - "Wake_Island_bassin_5", - "Wake_Island_bassin_6", - "Wake_Island_bassin_7", - "Wake_Island_bassin_8", - "Wake_Island_bassin_9", - "Wallis_and Futuna_bassin_10", - "Wallis_and Futuna_bassin_11", - "Wallis_and Futuna_bassin_12", - "Wallis_and Futuna", - "Wallis_and Futuna_bassin_5", - "Wallis_and Futuna_bassin_6", - "Wallis_and Futuna_bassin_7", - "Wallis_and Futuna_bassin_8", - "Wallis_and Futuna_bassin_9", - "Western_Sahara_bassin_10", - "Western_Sahara_bassin_11", - "Western_Sahara_bassin_12", - "Western_Sahara", - "Western_Sahara_bassin_5", - "Western_Sahara_bassin_6", - "Western_Sahara_bassin_7", - "Western_Sahara_bassin_8", - "Western_Sahara_bassin_9", - "West_Bank_bassin_10", - "West_Bank_bassin_11", - "West_Bank_bassin_12", - "West_Bank", - "West_Bank_bassin_5", - "West_Bank_bassin_6", - "West_Bank_bassin_7", - "West_Bank_bassin_8", - "West_Bank_bassin_9", - "Yemen_bassin_10", - "Yemen_bassin_11", - "Yemen_bassin_12", - "Yemen", - "Yemen_bassin_5", - "Yemen_bassin_6", - "Yemen_bassin_7", - "Yemen_bassin_8", - "Yemen_bassin_9", - "Zambia_bassin_10", - "Zambia_bassin_11", - "Zambia_bassin_12", - "Zambia", - "Zambia_bassin_5", - "Zambia_bassin_6", - "Zambia_bassin_7", - "Zambia_bassin_8", - "Zambia_bassin_9", - "Zimbabwe_bassin_10", - "Zimbabwe_bassin_11", - "Zimbabwe_bassin_12", - "Zimbabwe", - "Zimbabwe_bassin_5", - "Zimbabwe_bassin_6", - "Zimbabwe_bassin_7", - "Zimbabwe_bassin_8", - "Zimbabwe_bassin_9" - ) ); - - public static void main(String[] args) { - - ArrayList missingCountries = new ArrayList(); - - for (String country : allCountryNames) { - if( !filesGenerated.contains(country) ) { - missingCountries.add( country); - } - } - System.out.println( missingCountries.size() ); - System.out.println( missingCountries ); - - String finalCountries = ""; - for (String missing : missingCountries) { - finalCountries += '"' + missing.replaceAll( "_", " ") + "\", "; - } - System.out.println( finalCountries ); - - } - - -} +package org.openforis.collect.earth.app; + +import java.awt.Desktop; +import java.awt.Font; +import java.awt.FontFormatException; +import java.awt.GraphicsEnvironment; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.sql.Connection; +import java.sql.DriverManager; +import java.util.Enumeration; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import javax.swing.UIManager; + +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.commons.lang3.SystemUtils; +import org.openforis.collect.earth.app.EarthConstants.UI_LANGUAGE; +import org.openforis.collect.earth.app.view.Messages; +import org.postgresql.Driver; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.exception.ZipException; +import net.lingala.zip4j.model.ZipParameters; +import net.lingala.zip4j.model.enums.CompressionLevel; +import net.lingala.zip4j.model.enums.CompressionMethod; + +public class CollectEarthUtils { + + private static final Logger logger = LoggerFactory.getLogger(CollectEarthUtils.class); + + private CollectEarthUtils() { + } + + public static String getMd5FromFolder(File folder) throws IOException { + + if (!folder.isDirectory()) { + throw new IllegalArgumentException("The file passed as an argument needs to be a folder!"); + } + StringBuilder md5Hex = new StringBuilder(); + + try( Stream paths = Files.walk(Paths.get(folder.toURI()), 3); ) { + List listFiles = paths.filter(Files::isRegularFile).map(Path::toFile) + .collect(Collectors.toList()); + for (File file : listFiles) { + md5Hex.append(DigestUtils.md5Hex(new FileInputStream(file))); + } + return DigestUtils.md5Hex(md5Hex.toString().getBytes()); + } + } + + public static String getMd5FromFile(String filePath) throws IOException { + return DigestUtils.md5Hex(new FileInputStream(new File(filePath))); + } + + public static void setFontDependingOnLanguaue(UI_LANGUAGE uiLanguage) { + if (uiLanguage == UI_LANGUAGE.LO) { + String ttfFileName = "Phetsarath_OT.ttf"; + // create the font + setUiFont(ttfFileName); + } else if (uiLanguage == UI_LANGUAGE.MN) { + String ttfFileName = "arhangai.ttf"; + // create the font + setUiFont(ttfFileName); + } else { + CollectEarthUtils.setUiFont(new javax.swing.plaf.FontUIResource("Arial Unicode MS", Font.PLAIN, 12)); + } + } + + public static void setUiFont(String ttfFileName) { + try { + // create the font to use. Specify the size! + InputStream fontStream = CollectEarthUtils.class.getResourceAsStream(ttfFileName); + Font laoFont = Font.createFont(Font.TRUETYPE_FONT, fontStream).deriveFont(12f); + GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); + // register the font + ge.registerFont(laoFont); + CollectEarthUtils.setUiFont(new javax.swing.plaf.FontUIResource(laoFont.getFontName(), Font.PLAIN, 12)); + } catch (IOException | FontFormatException e) { + logger.error("error setting the font " + ttfFileName, e); + } + + } + + private static void setUiFont(javax.swing.plaf.FontUIResource f) { + Enumeration keys = UIManager.getDefaults().keys(); + while (keys.hasMoreElements()) { + Object key = keys.nextElement(); + Object value = UIManager.get(key); + if (value instanceof javax.swing.plaf.FontUIResource) + UIManager.put(key, f); + } + } + + public static ZipFile addFileToZip(String pathToDestinationZip, File fileToAdd, String fileNameInZip) throws IOException { + File destinationZip = new File(pathToDestinationZip); + return addFileToZip(destinationZip, fileToAdd, fileNameInZip); + } + + public static ZipFile addFileToZip(File destinationZip, File fileToAdd, String fileNameInZip) throws IOException { + try( ZipFile zipFile = new ZipFile(destinationZip) ){ + ZipParameters zipParameters = new ZipParameters(); + // COMP_DEFLATE is for compression + zipParameters.setCompressionMethod(CompressionMethod.DEFLATE); + // DEFLATE_LEVEL_ULTRA = maximum compression + zipParameters.setCompressionLevel(CompressionLevel.ULTRA); + zipParameters.setFileNameInZip(fileNameInZip); + zipFile.addFile(fileToAdd, zipParameters); + return zipFile; + }catch(Exception e) { + logger.error("Error adding file to ZIP", e); + return null; + } + } + + public static String getComputerIp() { + try { + return InetAddress.getLocalHost().getHostAddress(); + } catch (final UnknownHostException e) { + logger.warn("Unknown IP address", e); //$NON-NLS-1$ + return Messages.getString("OptionWizard.11"); //$NON-NLS-1$ + } + } + + public static void addFolderToZip(ZipFile zipFile, File folderToCompress) throws ZipException { + ZipParameters zipParameters = new ZipParameters(); + // COMP_DEFLATE is for compression + zipParameters.setCompressionMethod(CompressionMethod.DEFLATE); + // DEFLATE_LEVEL_ULTRA = maximum compression + zipParameters.setCompressionLevel(CompressionLevel.ULTRA); + + if (folderToCompress.exists() && folderToCompress.isDirectory()) { + zipFile.addFolder(folderToCompress, zipParameters); + } + } + + public static void openFolderInExplorer(String folder) throws IOException { + if (Desktop.isDesktopSupported()) { + Desktop.getDesktop().open(new File(folder)); + } else { + if (SystemUtils.IS_OS_WINDOWS) { + new ProcessBuilder("explorer.exe", "/open," + folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } else if (SystemUtils.IS_OS_MAC) { + new ProcessBuilder("usr/bin/open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } else if (SystemUtils.IS_OS_UNIX) { + tryUnixFileExplorers(folder); + } + } + } + + public static void tryUnixFileExplorers(String folder) throws IOException { + try { + new ProcessBuilder("nautilus", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (IOException e1) { + try { + new ProcessBuilder("gnome-open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (IOException e2) { + try { + new ProcessBuilder("kde-open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (IOException e3) { + new ProcessBuilder("caja", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + } + } + + public static boolean openFile(File fileToOpenWithOSViewer) { + boolean success = false; + if (Desktop.isDesktopSupported()) { + try { + Desktop.getDesktop().open(fileToOpenWithOSViewer); + success = true; + } catch (IOException ex) { + logger.warn("No application registered to open file {}", fileToOpenWithOSViewer.getAbsolutePath()); //$NON-NLS-1$ + } + } + return success; + } + + public static String testPostgreSQLConnection(String host, String port, String dbName, String username, + String password) { + String message = "Connection OK!"; + try { + Driver postgresDriver = new Driver(); + DriverManager.registerDriver(postgresDriver, null); + String url = "jdbc:postgresql://" + host + ":" + port + "/" + dbName; + try( Connection conn = DriverManager.getConnection(url, username, password) ){ + logger.debug("PostgreSQL Connection is valid! {}", conn.isValid(10) );// 10 sec + } + } catch (Exception e) { + logger.error("Error connecting to DB while testing", e); + message = e.getMessage(); + } + return message; + } + +} From d631f1b6c81fe793ff8c111af7e55c779de45610 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:03 +0100 Subject: [PATCH 0035/1620] New translations Messages.properties (Portuguese) --- .../earth/app/view/Messages_pt.properties | 341 ++++++++++++++---- 1 file changed, 263 insertions(+), 78 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 6e034a1981..3ce9622fe0 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,80 +1,265 @@ -package org.openforis.collect.earth.app.ad_hoc; +AboutDialog.19=A problem occurred +AboutDialog.5=For more information visit our website OpenForis.org +AboutDialog.6=Sorry, a problem occurred while trying to open this link in your system's standard browser. +AboutDialog.8=Ok +AspectCode.0=North +AspectCode.1=North-East +AspectCode.2=East +AspectCode.3=South-East +AspectCode.4=South +AspectCode.5=South-West +AspectCode.6=West +AspectCode.7=North-West +CollectEarthMenu.0=Import CEP file +CollectEarthMenu.2=Utilities +CollectEarthMenu.3=Divide large CSV plot files +CollectEarthMenu.4=Export data to XML (from specific date until present) +CollectEarthMenu.5=Export to Collect Backup +CollectEarthMenu.6=Export data as Collect Backup (all data) +CollectEarthMenu.7=Export data as Collect Backup (from date) +CollectEarthMenu.8=Export data to XML (using summary attribute) +CollectEarthWindow.0=Error when attempting to export data to CSV file +CollectEarthWindow.10=File +CollectEarthWindow.11=Exit +CollectEarthWindow.12=Tools +CollectEarthWindow.13=Download data to CSV (Excel) +CollectEarthWindow.14=Start SAIKU Analysis +CollectEarthWindow.15=Properties +CollectEarthWindow.16=Help +CollectEarthWindow.17=Disclaimer +CollectEarthWindow.18=Find missing plots in database +CollectEarthWindow.19=Collect Earth +CollectEarthWindow.1=Export error +CollectEarthWindow.20=Number of duplicated records\: +CollectEarthWindow.21=Could not find icon for main frame +CollectEarthWindow.22=Are you sure that you want to close Collect Earth?
Closing the window will also close the Collect Earth server +CollectEarthWindow.23=Confirmation needed +CollectEarthWindow.24=XML Export +CollectEarthWindow.25=Do you want to add these records anyway and lose your current data? +CollectEarthWindow.26=Operator +CollectEarthWindow.27=Update +CollectEarthWindow.28=Open Foris Collect Earth server should be running while the operator interprets data. +CollectEarthWindow.29=The Saiku Server is not configured. +CollectEarthWindow.2=Language +CollectEarthWindow.30=Please maintain this window open while you are using Google Earth. +CollectEarthWindow.31=Export collected data to CSV file +CollectEarthWindow.32=Quit +CollectEarthWindow.33=The operator name has to be longer than 5 characters and shorter than 50 +CollectEarthWindow.34=Validation error +CollectEarthWindow.35=OPERATOR NAME EMPTY\!
Please fill the operator name and press the "Update" button. +CollectEarthWindow.36=Operator name cannot be empty +CollectEarthWindow.37=Keep Open +CollectEarthWindow.38=CSV files +CollectEarthWindow.39=NOTICE\: It is advisable that you back-up your current data (Export to XML) before importing the new data +CollectEarthWindow.3=\ Import error +CollectEarthWindow.40=Set-up the path to the folder where Saiku Server is installed in the Tools->Properties->Advanced tab. +CollectEarthWindow.41=Saving exported data to file\: +CollectEarthWindow.42=Quit +CollectEarthWindow.43=Conflicting records found +CollectEarthWindow.44=Data Import/Export +CollectEarthWindow.45=Export data to XML (compressed) +CollectEarthWindow.46=Import new data from ZIP (compressed XML) +CollectEarthWindow.47=Saiku Server not configured +CollectEarthWindow.48=Zip/collect-data files +CollectEarthWindow.49=Fusion CSV files +CollectEarthWindow.4=FAO Disclaimer notices +CollectEarthWindow.50=Open User Manual +CollectEarthWindow.51=Check for updates of Collect Earth +CollectEarthWindow.52=Open Application Log File +CollectEarthWindow.53=Collect Earth Log file +CollectEarthWindow.54=Load points from KML +CollectEarthWindow.55=Update current records using CSV +CollectEarthWindow.56=About... +CollectEarthWindow.57=The Saiku starter process is still running, please wait. +CollectEarthWindow.58=Cannot start Saiku analysis +CollectEarthWindow.59=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming.
If you click on "YES" a new dataset with the latest information will be generated. +CollectEarthWindow.5=Close +CollectEarthWindow.60=Saiku data generation +CollectEarthWindow.61=Export data to XML (modified records since last export) +CollectEarthWindow.62=About... +CollectEarthWindow.63=Error getting the points from KML +CollectEarthWindow.64=Technical Support +CollectEarthWindow.65=The operator name has been changed +CollectEarthWindow.66=Operator name +CollectEarthWindow.67=Open data folder +CollectEarthWindow.6=Export to Fusion Table +CollectEarthWindow.70=Open the Survey Guide +CollectEarthWindow.71=Generate Stand-Alone Saiku tool +CollectEarthWindow.7=Error when importing data +CollectEarthWindow.8=Disclaimer text could not be found +CollectEarthWindow.9=The data imported contains records that are already present on your database. +DynamicsCode.0=Initially Forest +DynamicsCode.1=Initially Grassland +DynamicsCode.2=Initially Settlement +DynamicsCode.3=Initially Otherland +DynamicsCode.4=Initially Wetland +DynamicsCode.5=Initially Cropland +EarthApp.11=Collect Earth is already running +EarthApp.21=The file containing the grid of plots as a CSV/CED is not found in the selected path \:
+EarthApp.23=No CSV/CED file has been set-up \:

+EarthApp.24=The file containing the Freemarker template with the KML definition is not found in the selected path \:
+EarthApp.26=No KML definition file has been set-up \:

+EarthApp.27=The file containing the HTML balloon form is not found in the selected path \:
+EarthApp.29=No HTML balloon file has been set-up \:

+EarthApp.30=Please correct the file location in the Tools->Properties menu. +EarthApp.3=Remind me later +EarthApp.4=Update Now +EarthApp.57=There is a new version of Collect Earth available\!
How do you want to proceed? +EarthApp.58=Update alert +EarthApp.59=Error when importing project file +EarthApp.5=Do not remind me again +EarthApp.61=The Collect Earth file could not be open.
Please make sure that Google Earth is installed. +EarthApp.6=\ - Version +EarthApp.70=WARNING +EarthApp.71=In Mac OS X the Collect Earth project files (*.cep) will not open in Collect Earth when they are double-clicked.
+EarthApp.72=Use the Collect Earth toolbar to open the .cep files \: +EarthApp.73=Collect Earth issues in Mac OS X computers +EarthSurveyService.9=Field required +ExportActionListener.1=Pick Date to Export Records From +ExportDialogProcessMonitor.0=Processing data... +ExportDialogProcessMonitor.1=Waiting to initialize process \: +ExportDialogProcessMonitor.4=Exported records \: +ImportActionListener.0=Should the data for plots that have not been completely filled be imported? +ImportActionListener.2=If you click NO only the data from plots in the "green" state, containing all data, will be imported. +ImportActionListener.3=Import non-finished records +ImportDialogProcessMonitor.0=\ CALCULATING +ImportDialogProcessMonitor.11=Initial number of records \: +ImportDialogProcessMonitor.2=Importing records... +ImportDialogProcessMonitor.5=Actual number of imported records \: +ImportDialogProcessMonitor.8=Processing data... +ImportProcessMonitorDialog.0=Imported records \: +ImportXMLDialogProcessMonitor.1 = Overwrite data +ImportXMLDialogProcessMonitor.2 = Import only non-conflicting plots +InfiniteProgressMonitor.0=Cancel operation +JFileChooserExistsAware.0=Collect Earth Project file +KmlImportService.13=Select a CSV file to save the plot locations to +MissingPlotsListener.0=Error while getting information about plots not present on the Database +MissingPlotsListener.10=Total number of plots in the sampling design \: +MissingPlotsListener.12=Number of missing plots \: +MissingPlotsListener.14=All the plots are filled\! +MissingPlotsListener.1=Missing plots +MissingPlotsListener.2=Copy contents to clipboard +MissingPlotsListener.3=Pick the files that contain plot information ( .csv or .ced files ) for which you want to know if all data has been filled. +MissingPlotsListener.4=Missing plots - information +MissingPlotsListener.5=From file \: +MissingPlotsListener.6=Export to CED file +NO=No +NO_TO_ALL=No to all +OpenTextFileListener.0=The text file was not found at \: +OptionWizard.0=Collect Earth options +OptionWizard.100=Open Planet imagery +OptionWizard.101=Planet API key +OptionWizard.1021=URL SecureWatch +OptionWizard.102=Open Maxar SecureWatch +OptionWizard.103=Set URL for Extra Map (opens when set) \: +OptionWizard.104=Browsers +OptionWizard.105=Open Earth Map +OptionWizard.110=Use NICFI provided Monthly imagery +OptionWizard.10=Open backup folder +OptionWizard.11=Unknown\: use ifconfig +OptionWizard.12=Client Instance +OptionWizard.13=Collect Earth Server IP +OptionWizard.14=Collect Earth Server port (e.g. 8023) +OptionWizard.15=Save & Apply changes +OptionWizard.16=ID +OptionWizard.17=X-coord +OptionWizard.18=Y-coord +OptionWizard.19=Elevation +OptionWizard.1=Choose Browser +OptionWizard.20=The Google Earth contents have been changed.
Please accept the content reload when you are prompted by Google Earth. +OptionWizard.21=Update successful +OptionWizard.22=Slope +OptionWizard.23=There was an error when re-opening the Google Earth data +OptionWizard.24=Cancel +OptionWizard.25=Operation Mode +OptionWizard.26=DB host +OptionWizard.27=This is not a recognized Saiku Folder ( the start-saiku.bat file is not present) +OptionWizard.28=Saiku Server not recognized +OptionWizard.29=DB port +OptionWizard.2=Workflow (server/client) +OptionWizard.30=SQLite options +OptionWizard.31=Sample data +OptionWizard.32=Plot layout +OptionWizard.33=Survey Definition +OptionWizard.34=Integrated Services +OptionWizard.35=Number of control points +OptionWizard.36=Distance between control points (in meters) +OptionWizard.37=Margin with plot border (in meters) +OptionWizard.38=The CSV/CED file cannot be read correctly.
The file is expected to have a comma separated values like this \:
+OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect +OptionWizard.3=Server Instance +OptionWizard.40=Projects +OptionWizard.41=Load a new project file +OptionWizard.42=Error when closing the CSV reader +OptionWizard.43=Name of survey +OptionWizard.44=automatically back-up database at +OptionWizard.45=Open Earth Engine Playground ( deprecated ) +OptionWizard.46=Open Earth Engine Timelapse +OptionWizard.47=Open Bing Maps +OptionWizard.48=Open form on a browser instead of Google Earth (recommended for LINUX) +OptionWizard.49=Path to ced/csv file with plot data +OptionWizard.4=Current computer IP \: +OptionWizard.50=Browse... +OptionWizard.51=Error importing project file +OptionWizard.52=CSV/CED file with only coordinates +OptionWizard.53=No points +OptionWizard.54=Central point +OptionWizard.55=Error importing project folder +OptionWizard.56=Load project +OptionWizard.57=Previously loaded projects +OptionWizard.58=Open GEE Code Editor (requires Trusted Tester access) +OptionWizard.59=Open Here Maps focused on the plot +OptionWizard.5=Collect Earth Server port\: +OptionWizard.65=Path to Saiku folder +OptionWizard.66=Browse... +OptionWizard.67=Path to Firefox executable +OptionWizard.68=Browse... +OptionWizard.6=PostgreSQL DB parameters +OptionWizard.70=Executable files +OptionWizard.72=Binary files +OptionWizard.73=Path to Chrome executable +OptionWizard.74=Browse... +OptionWizard.76=Executable files +OptionWizard.78=Binary files +OptionWizard.79=Path to KML Freemarker template +OptionWizard.7=User Name +OptionWizard.80=Browse... +OptionWizard.82=Freemarker template +OptionWizard.83=Path to HTML Balloon form design +OptionWizard.84=Browse... +OptionWizard.86=HTML webpage +OptionWizard.87=Path to XML with IDM definition +OptionWizard.88=Browse... +OptionWizard.8=Password +OptionWizard.90=XML IDM definition +OptionWizard.91=Server (manager version or stand-alone use) +OptionWizard.92=Client (operator/connected to server) +OptionWizard.93=SQLite (Embedded/single file based) +OptionWizard.94=PostgreSQL +OptionWizard.95=Side of the sampling dots (in meters) +OptionWizard.9=DB Name +ProcessMonitorDialog.1=Parsing error on row number +ProcessMonitorDialog.4=, columns +ProcessMonitorDialog.5=\ -- values +SaikuAnalysisListener.0=Yes - Refresh Saiku data (long process) +SaikuAnalysisListener.1=No - Use same version of the data as last time Saiku was used +SaikuStarter.1=Starting Saiku +SaikuStarter.2=Starting Saiku can take some minutes, please wait\! +SaikuToolExportListener.1=Saiku Tool generation +SaikuToolExportListener.2=Generating Saiku Tool with current database +SaveEarthDataServlet.0=Empty request +SaveEarthDataServlet.1=Problem occurred while saving data to the database +SaveEarthDataServlet.2=The data was saved +SlopeCode.0=Flat (0-5) +YES=Yes +YES_TO_ALL=Yes to all -import java.util.List; +GenerateDatabaseStarter.1=Preparing for analysis +GenerateDatabaseStarter.2=Generating Relational Database -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.manager.RecordManager; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.CollectRecordSummary; -import org.openforis.collect.model.RecordFilter; -import org.openforis.idm.model.Coordinate; -import org.openforis.idm.model.CoordinateAttribute; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public abstract class FixOtherLand { - - @Autowired - private RecordManager recordManager; - - @Autowired - private EarthSurveyService earthSurveyService; - - private Logger logger = LoggerFactory.getLogger( FixOtherLand.class); - - private boolean stopFix = false; - - private List getAllRecords(){ - RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); - List records = recordManager.loadSummaries( rf ); - return records; - } - - public void fixCoordinates(){ - List allRecords = getAllRecords(); - - if( shouldStopFixing()){ - return; - } - - for (CollectRecordSummary summaryCollectRecord : allRecords) { - if( shouldStopFixing()){ - break; - } - try { - CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); - CoordinateAttribute plotCoord = (CoordinateAttribute) collectRecord.getNodeByPath("/plot/location"); //$NON-NLS-1$ - if( plotCoord != null && plotCoord.getValue() != null ){ - if( plotCoord.getValue().getX() < getLongitudeLimit() ){ - Coordinate coordinate = new Coordinate(plotCoord.getValue().getY(), plotCoord.getValue().getX(), plotCoord.getValue().getSrsId() ); - plotCoord.setValue( coordinate ); - recordManager.save( collectRecord ); - - } - - - } - } catch (Exception e) { - logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ - } - } - - } - - protected abstract int getLongitudeLimit(); - - private boolean shouldStopFixing() { - return stopFix; - } - - public void stopFixing() { - stopFix = true; - - } - -} \ No newline at end of file +IPCCGeneratorListener.1=Waiting for process to complete\! +IPCCGeneratorListener.2=The IPCC GHGi compatible data is being generated +IPCCGeneratorListener.3=Refresh the data (update with latest from Collect Earth) +IPCCGeneratorListener.4=Use the latest generated database (fastest process - no update) +IPCCGeneratorListener.5=GHGi Database generation +IPCCGeneratorListener.6=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming but it is necessary if the Collect Earth data has been updated since the last time.
\ No newline at end of file From 8fb02ff9d56f5b53c9b499603d68e80ff519cdae Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:03 +0100 Subject: [PATCH 0036/1620] New translations Messages.properties (English) --- .../earth/app/view/Messages_en.properties | 274 +++++++++++++++++- 1 file changed, 263 insertions(+), 11 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index c36b2d4338..3ce9622fe0 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,13 +1,265 @@ -package org.openforis.collect.earth.app.ad_hoc; +AboutDialog.19=A problem occurred +AboutDialog.5=For more information visit our website OpenForis.org +AboutDialog.6=Sorry, a problem occurred while trying to open this link in your system's standard browser. +AboutDialog.8=Ok +AspectCode.0=North +AspectCode.1=North-East +AspectCode.2=East +AspectCode.3=South-East +AspectCode.4=South +AspectCode.5=South-West +AspectCode.6=West +AspectCode.7=North-West +CollectEarthMenu.0=Import CEP file +CollectEarthMenu.2=Utilities +CollectEarthMenu.3=Divide large CSV plot files +CollectEarthMenu.4=Export data to XML (from specific date until present) +CollectEarthMenu.5=Export to Collect Backup +CollectEarthMenu.6=Export data as Collect Backup (all data) +CollectEarthMenu.7=Export data as Collect Backup (from date) +CollectEarthMenu.8=Export data to XML (using summary attribute) +CollectEarthWindow.0=Error when attempting to export data to CSV file +CollectEarthWindow.10=File +CollectEarthWindow.11=Exit +CollectEarthWindow.12=Tools +CollectEarthWindow.13=Download data to CSV (Excel) +CollectEarthWindow.14=Start SAIKU Analysis +CollectEarthWindow.15=Properties +CollectEarthWindow.16=Help +CollectEarthWindow.17=Disclaimer +CollectEarthWindow.18=Find missing plots in database +CollectEarthWindow.19=Collect Earth +CollectEarthWindow.1=Export error +CollectEarthWindow.20=Number of duplicated records\: +CollectEarthWindow.21=Could not find icon for main frame +CollectEarthWindow.22=Are you sure that you want to close Collect Earth?
Closing the window will also close the Collect Earth server +CollectEarthWindow.23=Confirmation needed +CollectEarthWindow.24=XML Export +CollectEarthWindow.25=Do you want to add these records anyway and lose your current data? +CollectEarthWindow.26=Operator +CollectEarthWindow.27=Update +CollectEarthWindow.28=Open Foris Collect Earth server should be running while the operator interprets data. +CollectEarthWindow.29=The Saiku Server is not configured. +CollectEarthWindow.2=Language +CollectEarthWindow.30=Please maintain this window open while you are using Google Earth. +CollectEarthWindow.31=Export collected data to CSV file +CollectEarthWindow.32=Quit +CollectEarthWindow.33=The operator name has to be longer than 5 characters and shorter than 50 +CollectEarthWindow.34=Validation error +CollectEarthWindow.35=OPERATOR NAME EMPTY\!
Please fill the operator name and press the "Update" button. +CollectEarthWindow.36=Operator name cannot be empty +CollectEarthWindow.37=Keep Open +CollectEarthWindow.38=CSV files +CollectEarthWindow.39=NOTICE\: It is advisable that you back-up your current data (Export to XML) before importing the new data +CollectEarthWindow.3=\ Import error +CollectEarthWindow.40=Set-up the path to the folder where Saiku Server is installed in the Tools->Properties->Advanced tab. +CollectEarthWindow.41=Saving exported data to file\: +CollectEarthWindow.42=Quit +CollectEarthWindow.43=Conflicting records found +CollectEarthWindow.44=Data Import/Export +CollectEarthWindow.45=Export data to XML (compressed) +CollectEarthWindow.46=Import new data from ZIP (compressed XML) +CollectEarthWindow.47=Saiku Server not configured +CollectEarthWindow.48=Zip/collect-data files +CollectEarthWindow.49=Fusion CSV files +CollectEarthWindow.4=FAO Disclaimer notices +CollectEarthWindow.50=Open User Manual +CollectEarthWindow.51=Check for updates of Collect Earth +CollectEarthWindow.52=Open Application Log File +CollectEarthWindow.53=Collect Earth Log file +CollectEarthWindow.54=Load points from KML +CollectEarthWindow.55=Update current records using CSV +CollectEarthWindow.56=About... +CollectEarthWindow.57=The Saiku starter process is still running, please wait. +CollectEarthWindow.58=Cannot start Saiku analysis +CollectEarthWindow.59=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming.
If you click on "YES" a new dataset with the latest information will be generated. +CollectEarthWindow.5=Close +CollectEarthWindow.60=Saiku data generation +CollectEarthWindow.61=Export data to XML (modified records since last export) +CollectEarthWindow.62=About... +CollectEarthWindow.63=Error getting the points from KML +CollectEarthWindow.64=Technical Support +CollectEarthWindow.65=The operator name has been changed +CollectEarthWindow.66=Operator name +CollectEarthWindow.67=Open data folder +CollectEarthWindow.6=Export to Fusion Table +CollectEarthWindow.70=Open the Survey Guide +CollectEarthWindow.71=Generate Stand-Alone Saiku tool +CollectEarthWindow.7=Error when importing data +CollectEarthWindow.8=Disclaimer text could not be found +CollectEarthWindow.9=The data imported contains records that are already present on your database. +DynamicsCode.0=Initially Forest +DynamicsCode.1=Initially Grassland +DynamicsCode.2=Initially Settlement +DynamicsCode.3=Initially Otherland +DynamicsCode.4=Initially Wetland +DynamicsCode.5=Initially Cropland +EarthApp.11=Collect Earth is already running +EarthApp.21=The file containing the grid of plots as a CSV/CED is not found in the selected path \:
+EarthApp.23=No CSV/CED file has been set-up \:

+EarthApp.24=The file containing the Freemarker template with the KML definition is not found in the selected path \:
+EarthApp.26=No KML definition file has been set-up \:

+EarthApp.27=The file containing the HTML balloon form is not found in the selected path \:
+EarthApp.29=No HTML balloon file has been set-up \:

+EarthApp.30=Please correct the file location in the Tools->Properties menu. +EarthApp.3=Remind me later +EarthApp.4=Update Now +EarthApp.57=There is a new version of Collect Earth available\!
How do you want to proceed? +EarthApp.58=Update alert +EarthApp.59=Error when importing project file +EarthApp.5=Do not remind me again +EarthApp.61=The Collect Earth file could not be open.
Please make sure that Google Earth is installed. +EarthApp.6=\ - Version +EarthApp.70=WARNING +EarthApp.71=In Mac OS X the Collect Earth project files (*.cep) will not open in Collect Earth when they are double-clicked.
+EarthApp.72=Use the Collect Earth toolbar to open the .cep files \: +EarthApp.73=Collect Earth issues in Mac OS X computers +EarthSurveyService.9=Field required +ExportActionListener.1=Pick Date to Export Records From +ExportDialogProcessMonitor.0=Processing data... +ExportDialogProcessMonitor.1=Waiting to initialize process \: +ExportDialogProcessMonitor.4=Exported records \: +ImportActionListener.0=Should the data for plots that have not been completely filled be imported? +ImportActionListener.2=If you click NO only the data from plots in the "green" state, containing all data, will be imported. +ImportActionListener.3=Import non-finished records +ImportDialogProcessMonitor.0=\ CALCULATING +ImportDialogProcessMonitor.11=Initial number of records \: +ImportDialogProcessMonitor.2=Importing records... +ImportDialogProcessMonitor.5=Actual number of imported records \: +ImportDialogProcessMonitor.8=Processing data... +ImportProcessMonitorDialog.0=Imported records \: +ImportXMLDialogProcessMonitor.1 = Overwrite data +ImportXMLDialogProcessMonitor.2 = Import only non-conflicting plots +InfiniteProgressMonitor.0=Cancel operation +JFileChooserExistsAware.0=Collect Earth Project file +KmlImportService.13=Select a CSV file to save the plot locations to +MissingPlotsListener.0=Error while getting information about plots not present on the Database +MissingPlotsListener.10=Total number of plots in the sampling design \: +MissingPlotsListener.12=Number of missing plots \: +MissingPlotsListener.14=All the plots are filled\! +MissingPlotsListener.1=Missing plots +MissingPlotsListener.2=Copy contents to clipboard +MissingPlotsListener.3=Pick the files that contain plot information ( .csv or .ced files ) for which you want to know if all data has been filled. +MissingPlotsListener.4=Missing plots - information +MissingPlotsListener.5=From file \: +MissingPlotsListener.6=Export to CED file +NO=No +NO_TO_ALL=No to all +OpenTextFileListener.0=The text file was not found at \: +OptionWizard.0=Collect Earth options +OptionWizard.100=Open Planet imagery +OptionWizard.101=Planet API key +OptionWizard.1021=URL SecureWatch +OptionWizard.102=Open Maxar SecureWatch +OptionWizard.103=Set URL for Extra Map (opens when set) \: +OptionWizard.104=Browsers +OptionWizard.105=Open Earth Map +OptionWizard.110=Use NICFI provided Monthly imagery +OptionWizard.10=Open backup folder +OptionWizard.11=Unknown\: use ifconfig +OptionWizard.12=Client Instance +OptionWizard.13=Collect Earth Server IP +OptionWizard.14=Collect Earth Server port (e.g. 8023) +OptionWizard.15=Save & Apply changes +OptionWizard.16=ID +OptionWizard.17=X-coord +OptionWizard.18=Y-coord +OptionWizard.19=Elevation +OptionWizard.1=Choose Browser +OptionWizard.20=The Google Earth contents have been changed.
Please accept the content reload when you are prompted by Google Earth. +OptionWizard.21=Update successful +OptionWizard.22=Slope +OptionWizard.23=There was an error when re-opening the Google Earth data +OptionWizard.24=Cancel +OptionWizard.25=Operation Mode +OptionWizard.26=DB host +OptionWizard.27=This is not a recognized Saiku Folder ( the start-saiku.bat file is not present) +OptionWizard.28=Saiku Server not recognized +OptionWizard.29=DB port +OptionWizard.2=Workflow (server/client) +OptionWizard.30=SQLite options +OptionWizard.31=Sample data +OptionWizard.32=Plot layout +OptionWizard.33=Survey Definition +OptionWizard.34=Integrated Services +OptionWizard.35=Number of control points +OptionWizard.36=Distance between control points (in meters) +OptionWizard.37=Margin with plot border (in meters) +OptionWizard.38=The CSV/CED file cannot be read correctly.
The file is expected to have a comma separated values like this \:
+OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect +OptionWizard.3=Server Instance +OptionWizard.40=Projects +OptionWizard.41=Load a new project file +OptionWizard.42=Error when closing the CSV reader +OptionWizard.43=Name of survey +OptionWizard.44=automatically back-up database at +OptionWizard.45=Open Earth Engine Playground ( deprecated ) +OptionWizard.46=Open Earth Engine Timelapse +OptionWizard.47=Open Bing Maps +OptionWizard.48=Open form on a browser instead of Google Earth (recommended for LINUX) +OptionWizard.49=Path to ced/csv file with plot data +OptionWizard.4=Current computer IP \: +OptionWizard.50=Browse... +OptionWizard.51=Error importing project file +OptionWizard.52=CSV/CED file with only coordinates +OptionWizard.53=No points +OptionWizard.54=Central point +OptionWizard.55=Error importing project folder +OptionWizard.56=Load project +OptionWizard.57=Previously loaded projects +OptionWizard.58=Open GEE Code Editor (requires Trusted Tester access) +OptionWizard.59=Open Here Maps focused on the plot +OptionWizard.5=Collect Earth Server port\: +OptionWizard.65=Path to Saiku folder +OptionWizard.66=Browse... +OptionWizard.67=Path to Firefox executable +OptionWizard.68=Browse... +OptionWizard.6=PostgreSQL DB parameters +OptionWizard.70=Executable files +OptionWizard.72=Binary files +OptionWizard.73=Path to Chrome executable +OptionWizard.74=Browse... +OptionWizard.76=Executable files +OptionWizard.78=Binary files +OptionWizard.79=Path to KML Freemarker template +OptionWizard.7=User Name +OptionWizard.80=Browse... +OptionWizard.82=Freemarker template +OptionWizard.83=Path to HTML Balloon form design +OptionWizard.84=Browse... +OptionWizard.86=HTML webpage +OptionWizard.87=Path to XML with IDM definition +OptionWizard.88=Browse... +OptionWizard.8=Password +OptionWizard.90=XML IDM definition +OptionWizard.91=Server (manager version or stand-alone use) +OptionWizard.92=Client (operator/connected to server) +OptionWizard.93=SQLite (Embedded/single file based) +OptionWizard.94=PostgreSQL +OptionWizard.95=Side of the sampling dots (in meters) +OptionWizard.9=DB Name +ProcessMonitorDialog.1=Parsing error on row number +ProcessMonitorDialog.4=, columns +ProcessMonitorDialog.5=\ -- values +SaikuAnalysisListener.0=Yes - Refresh Saiku data (long process) +SaikuAnalysisListener.1=No - Use same version of the data as last time Saiku was used +SaikuStarter.1=Starting Saiku +SaikuStarter.2=Starting Saiku can take some minutes, please wait\! +SaikuToolExportListener.1=Saiku Tool generation +SaikuToolExportListener.2=Generating Saiku Tool with current database +SaveEarthDataServlet.0=Empty request +SaveEarthDataServlet.1=Problem occurred while saving data to the database +SaveEarthDataServlet.2=The data was saved +SlopeCode.0=Flat (0-5) +YES=Yes +YES_TO_ALL=Yes to all -import org.springframework.stereotype.Component; +GenerateDatabaseStarter.1=Preparing for analysis +GenerateDatabaseStarter.2=Generating Relational Database -@Component -public class FixCoordinatesMongolia extends FixCoordinates { - - @Override - protected int getLongitudeLimit() { - return 87; - } - -} +IPCCGeneratorListener.1=Waiting for process to complete\! +IPCCGeneratorListener.2=The IPCC GHGi compatible data is being generated +IPCCGeneratorListener.3=Refresh the data (update with latest from Collect Earth) +IPCCGeneratorListener.4=Use the latest generated database (fastest process - no update) +IPCCGeneratorListener.5=GHGi Database generation +IPCCGeneratorListener.6=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming but it is necessary if the Collect Earth data has been updated since the last time.
\ No newline at end of file From 3d2a343f41e71c7f69067205a49d098a617d2412 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:04 +0100 Subject: [PATCH 0037/1620] New translations Proxy.java (French) --- .../earth/app/view/Messages_fr.properties | 214 +----------------- 1 file changed, 8 insertions(+), 206 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 8fa17ec627..08b48cb25c 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,208 +1,10 @@ -package org.openforis.collect.earth.app; - -import java.awt.Desktop; -import java.awt.Font; -import java.awt.FontFormatException; -import java.awt.GraphicsEnvironment; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.sql.Connection; -import java.sql.DriverManager; -import java.util.Enumeration; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import javax.swing.UIManager; - -import org.apache.commons.codec.digest.DigestUtils; -import org.apache.commons.lang3.SystemUtils; -import org.openforis.collect.earth.app.EarthConstants.UI_LANGUAGE; -import org.openforis.collect.earth.app.view.Messages; -import org.postgresql.Driver; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import net.lingala.zip4j.ZipFile; -import net.lingala.zip4j.exception.ZipException; -import net.lingala.zip4j.model.ZipParameters; -import net.lingala.zip4j.model.enums.CompressionLevel; -import net.lingala.zip4j.model.enums.CompressionMethod; - -public class CollectEarthUtils { - - private static final Logger logger = LoggerFactory.getLogger(CollectEarthUtils.class); - - private CollectEarthUtils() { - } - - public static String getMd5FromFolder(File folder) throws IOException { - - if (!folder.isDirectory()) { - throw new IllegalArgumentException("The file passed as an argument needs to be a folder!"); - } - StringBuilder md5Hex = new StringBuilder(); - - try( Stream paths = Files.walk(Paths.get(folder.toURI()), 3); ) { - List listFiles = paths.filter(Files::isRegularFile).map(Path::toFile) - .collect(Collectors.toList()); - for (File file : listFiles) { - md5Hex.append(DigestUtils.md5Hex(new FileInputStream(file))); - } - return DigestUtils.md5Hex(md5Hex.toString().getBytes()); - } - } - - public static String getMd5FromFile(String filePath) throws IOException { - return DigestUtils.md5Hex(new FileInputStream(new File(filePath))); - } - - public static void setFontDependingOnLanguaue(UI_LANGUAGE uiLanguage) { - if (uiLanguage == UI_LANGUAGE.LO) { - String ttfFileName = "Phetsarath_OT.ttf"; - // create the font - setUiFont(ttfFileName); - } else if (uiLanguage == UI_LANGUAGE.MN) { - String ttfFileName = "arhangai.ttf"; - // create the font - setUiFont(ttfFileName); - } else { - CollectEarthUtils.setUiFont(new javax.swing.plaf.FontUIResource("Arial Unicode MS", Font.PLAIN, 12)); - } - } - - public static void setUiFont(String ttfFileName) { - try { - // create the font to use. Specify the size! - InputStream fontStream = CollectEarthUtils.class.getResourceAsStream(ttfFileName); - Font laoFont = Font.createFont(Font.TRUETYPE_FONT, fontStream).deriveFont(12f); - GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); - // register the font - ge.registerFont(laoFont); - CollectEarthUtils.setUiFont(new javax.swing.plaf.FontUIResource(laoFont.getFontName(), Font.PLAIN, 12)); - } catch (IOException | FontFormatException e) { - logger.error("error setting the font " + ttfFileName, e); - } - - } - - private static void setUiFont(javax.swing.plaf.FontUIResource f) { - Enumeration keys = UIManager.getDefaults().keys(); - while (keys.hasMoreElements()) { - Object key = keys.nextElement(); - Object value = UIManager.get(key); - if (value instanceof javax.swing.plaf.FontUIResource) - UIManager.put(key, f); - } - } - - public static ZipFile addFileToZip(String pathToDestinationZip, File fileToAdd, String fileNameInZip) throws IOException { - File destinationZip = new File(pathToDestinationZip); - return addFileToZip(destinationZip, fileToAdd, fileNameInZip); - } - - public static ZipFile addFileToZip(File destinationZip, File fileToAdd, String fileNameInZip) throws IOException { - try( ZipFile zipFile = new ZipFile(destinationZip) ){ - ZipParameters zipParameters = new ZipParameters(); - // COMP_DEFLATE is for compression - zipParameters.setCompressionMethod(CompressionMethod.DEFLATE); - // DEFLATE_LEVEL_ULTRA = maximum compression - zipParameters.setCompressionLevel(CompressionLevel.ULTRA); - zipParameters.setFileNameInZip(fileNameInZip); - zipFile.addFile(fileToAdd, zipParameters); - return zipFile; - }catch(Exception e) { - logger.error("Error adding file to ZIP", e); - return null; - } - } - - public static String getComputerIp() { - try { - return InetAddress.getLocalHost().getHostAddress(); - } catch (final UnknownHostException e) { - logger.warn("Unknown IP address", e); //$NON-NLS-1$ - return Messages.getString("OptionWizard.11"); //$NON-NLS-1$ - } - } - - public static void addFolderToZip(ZipFile zipFile, File folderToCompress) throws ZipException { - ZipParameters zipParameters = new ZipParameters(); - // COMP_DEFLATE is for compression - zipParameters.setCompressionMethod(CompressionMethod.DEFLATE); - // DEFLATE_LEVEL_ULTRA = maximum compression - zipParameters.setCompressionLevel(CompressionLevel.ULTRA); - - if (folderToCompress.exists() && folderToCompress.isDirectory()) { - zipFile.addFolder(folderToCompress, zipParameters); - } - } - - public static void openFolderInExplorer(String folder) throws IOException { - if (Desktop.isDesktopSupported()) { - Desktop.getDesktop().open(new File(folder)); - } else { - if (SystemUtils.IS_OS_WINDOWS) { - new ProcessBuilder("explorer.exe", "/open," + folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } else if (SystemUtils.IS_OS_MAC) { - new ProcessBuilder("usr/bin/open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } else if (SystemUtils.IS_OS_UNIX) { - tryUnixFileExplorers(folder); - } - } - } - - public static void tryUnixFileExplorers(String folder) throws IOException { - try { - new ProcessBuilder("nautilus", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (IOException e1) { - try { - new ProcessBuilder("gnome-open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (IOException e2) { - try { - new ProcessBuilder("kde-open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (IOException e3) { - new ProcessBuilder("caja", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - } - } - - public static boolean openFile(File fileToOpenWithOSViewer) { - boolean success = false; - if (Desktop.isDesktopSupported()) { - try { - Desktop.getDesktop().open(fileToOpenWithOSViewer); - success = true; - } catch (IOException ex) { - logger.warn("No application registered to open file {}", fileToOpenWithOSViewer.getAbsolutePath()); //$NON-NLS-1$ - } - } - return success; - } - - public static String testPostgreSQLConnection(String host, String port, String dbName, String username, - String password) { - String message = "Connection OK!"; - try { - Driver postgresDriver = new Driver(); - DriverManager.registerDriver(postgresDriver, null); - String url = "jdbc:postgresql://" + host + ":" + port + "/" + dbName; - try( Connection conn = DriverManager.getConnection(url, username, password) ){ - logger.debug("PostgreSQL Connection is valid! {}", conn.isValid(10) );// 10 sec - } - } catch (Exception e) { - logger.error("Error connecting to DB while testing", e); - message = e.getMessage(); - } - return message; - } +package org.openforis.collect; + +/** + * + * @author M. Togna + * + */ +public interface Proxy { } From 3483c5fed7cc070d9fd7bf3300aee49060785a5a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:06 +0100 Subject: [PATCH 0038/1620] New translations Proxy.java (Spanish) --- .../earth/app/view/Messages_es.properties | 271 +----------------- 1 file changed, 8 insertions(+), 263 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 3ce9622fe0..08b48cb25c 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,265 +1,10 @@ -AboutDialog.19=A problem occurred -AboutDialog.5=For more information visit our website OpenForis.org -AboutDialog.6=Sorry, a problem occurred while trying to open this link in your system's standard browser. -AboutDialog.8=Ok -AspectCode.0=North -AspectCode.1=North-East -AspectCode.2=East -AspectCode.3=South-East -AspectCode.4=South -AspectCode.5=South-West -AspectCode.6=West -AspectCode.7=North-West -CollectEarthMenu.0=Import CEP file -CollectEarthMenu.2=Utilities -CollectEarthMenu.3=Divide large CSV plot files -CollectEarthMenu.4=Export data to XML (from specific date until present) -CollectEarthMenu.5=Export to Collect Backup -CollectEarthMenu.6=Export data as Collect Backup (all data) -CollectEarthMenu.7=Export data as Collect Backup (from date) -CollectEarthMenu.8=Export data to XML (using summary attribute) -CollectEarthWindow.0=Error when attempting to export data to CSV file -CollectEarthWindow.10=File -CollectEarthWindow.11=Exit -CollectEarthWindow.12=Tools -CollectEarthWindow.13=Download data to CSV (Excel) -CollectEarthWindow.14=Start SAIKU Analysis -CollectEarthWindow.15=Properties -CollectEarthWindow.16=Help -CollectEarthWindow.17=Disclaimer -CollectEarthWindow.18=Find missing plots in database -CollectEarthWindow.19=Collect Earth -CollectEarthWindow.1=Export error -CollectEarthWindow.20=Number of duplicated records\: -CollectEarthWindow.21=Could not find icon for main frame -CollectEarthWindow.22=Are you sure that you want to close Collect Earth?
Closing the window will also close the Collect Earth server -CollectEarthWindow.23=Confirmation needed -CollectEarthWindow.24=XML Export -CollectEarthWindow.25=Do you want to add these records anyway and lose your current data? -CollectEarthWindow.26=Operator -CollectEarthWindow.27=Update -CollectEarthWindow.28=Open Foris Collect Earth server should be running while the operator interprets data. -CollectEarthWindow.29=The Saiku Server is not configured. -CollectEarthWindow.2=Language -CollectEarthWindow.30=Please maintain this window open while you are using Google Earth. -CollectEarthWindow.31=Export collected data to CSV file -CollectEarthWindow.32=Quit -CollectEarthWindow.33=The operator name has to be longer than 5 characters and shorter than 50 -CollectEarthWindow.34=Validation error -CollectEarthWindow.35=OPERATOR NAME EMPTY\!
Please fill the operator name and press the "Update" button. -CollectEarthWindow.36=Operator name cannot be empty -CollectEarthWindow.37=Keep Open -CollectEarthWindow.38=CSV files -CollectEarthWindow.39=NOTICE\: It is advisable that you back-up your current data (Export to XML) before importing the new data -CollectEarthWindow.3=\ Import error -CollectEarthWindow.40=Set-up the path to the folder where Saiku Server is installed in the Tools->Properties->Advanced tab. -CollectEarthWindow.41=Saving exported data to file\: -CollectEarthWindow.42=Quit -CollectEarthWindow.43=Conflicting records found -CollectEarthWindow.44=Data Import/Export -CollectEarthWindow.45=Export data to XML (compressed) -CollectEarthWindow.46=Import new data from ZIP (compressed XML) -CollectEarthWindow.47=Saiku Server not configured -CollectEarthWindow.48=Zip/collect-data files -CollectEarthWindow.49=Fusion CSV files -CollectEarthWindow.4=FAO Disclaimer notices -CollectEarthWindow.50=Open User Manual -CollectEarthWindow.51=Check for updates of Collect Earth -CollectEarthWindow.52=Open Application Log File -CollectEarthWindow.53=Collect Earth Log file -CollectEarthWindow.54=Load points from KML -CollectEarthWindow.55=Update current records using CSV -CollectEarthWindow.56=About... -CollectEarthWindow.57=The Saiku starter process is still running, please wait. -CollectEarthWindow.58=Cannot start Saiku analysis -CollectEarthWindow.59=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming.
If you click on "YES" a new dataset with the latest information will be generated. -CollectEarthWindow.5=Close -CollectEarthWindow.60=Saiku data generation -CollectEarthWindow.61=Export data to XML (modified records since last export) -CollectEarthWindow.62=About... -CollectEarthWindow.63=Error getting the points from KML -CollectEarthWindow.64=Technical Support -CollectEarthWindow.65=The operator name has been changed -CollectEarthWindow.66=Operator name -CollectEarthWindow.67=Open data folder -CollectEarthWindow.6=Export to Fusion Table -CollectEarthWindow.70=Open the Survey Guide -CollectEarthWindow.71=Generate Stand-Alone Saiku tool -CollectEarthWindow.7=Error when importing data -CollectEarthWindow.8=Disclaimer text could not be found -CollectEarthWindow.9=The data imported contains records that are already present on your database. -DynamicsCode.0=Initially Forest -DynamicsCode.1=Initially Grassland -DynamicsCode.2=Initially Settlement -DynamicsCode.3=Initially Otherland -DynamicsCode.4=Initially Wetland -DynamicsCode.5=Initially Cropland -EarthApp.11=Collect Earth is already running -EarthApp.21=The file containing the grid of plots as a CSV/CED is not found in the selected path \:
-EarthApp.23=No CSV/CED file has been set-up \:

-EarthApp.24=The file containing the Freemarker template with the KML definition is not found in the selected path \:
-EarthApp.26=No KML definition file has been set-up \:

-EarthApp.27=The file containing the HTML balloon form is not found in the selected path \:
-EarthApp.29=No HTML balloon file has been set-up \:

-EarthApp.30=Please correct the file location in the Tools->Properties menu. -EarthApp.3=Remind me later -EarthApp.4=Update Now -EarthApp.57=There is a new version of Collect Earth available\!
How do you want to proceed? -EarthApp.58=Update alert -EarthApp.59=Error when importing project file -EarthApp.5=Do not remind me again -EarthApp.61=The Collect Earth file could not be open.
Please make sure that Google Earth is installed. -EarthApp.6=\ - Version -EarthApp.70=WARNING -EarthApp.71=In Mac OS X the Collect Earth project files (*.cep) will not open in Collect Earth when they are double-clicked.
-EarthApp.72=Use the Collect Earth toolbar to open the .cep files \: -EarthApp.73=Collect Earth issues in Mac OS X computers -EarthSurveyService.9=Field required -ExportActionListener.1=Pick Date to Export Records From -ExportDialogProcessMonitor.0=Processing data... -ExportDialogProcessMonitor.1=Waiting to initialize process \: -ExportDialogProcessMonitor.4=Exported records \: -ImportActionListener.0=Should the data for plots that have not been completely filled be imported? -ImportActionListener.2=If you click NO only the data from plots in the "green" state, containing all data, will be imported. -ImportActionListener.3=Import non-finished records -ImportDialogProcessMonitor.0=\ CALCULATING -ImportDialogProcessMonitor.11=Initial number of records \: -ImportDialogProcessMonitor.2=Importing records... -ImportDialogProcessMonitor.5=Actual number of imported records \: -ImportDialogProcessMonitor.8=Processing data... -ImportProcessMonitorDialog.0=Imported records \: -ImportXMLDialogProcessMonitor.1 = Overwrite data -ImportXMLDialogProcessMonitor.2 = Import only non-conflicting plots -InfiniteProgressMonitor.0=Cancel operation -JFileChooserExistsAware.0=Collect Earth Project file -KmlImportService.13=Select a CSV file to save the plot locations to -MissingPlotsListener.0=Error while getting information about plots not present on the Database -MissingPlotsListener.10=Total number of plots in the sampling design \: -MissingPlotsListener.12=Number of missing plots \: -MissingPlotsListener.14=All the plots are filled\! -MissingPlotsListener.1=Missing plots -MissingPlotsListener.2=Copy contents to clipboard -MissingPlotsListener.3=Pick the files that contain plot information ( .csv or .ced files ) for which you want to know if all data has been filled. -MissingPlotsListener.4=Missing plots - information -MissingPlotsListener.5=From file \: -MissingPlotsListener.6=Export to CED file -NO=No -NO_TO_ALL=No to all -OpenTextFileListener.0=The text file was not found at \: -OptionWizard.0=Collect Earth options -OptionWizard.100=Open Planet imagery -OptionWizard.101=Planet API key -OptionWizard.1021=URL SecureWatch -OptionWizard.102=Open Maxar SecureWatch -OptionWizard.103=Set URL for Extra Map (opens when set) \: -OptionWizard.104=Browsers -OptionWizard.105=Open Earth Map -OptionWizard.110=Use NICFI provided Monthly imagery -OptionWizard.10=Open backup folder -OptionWizard.11=Unknown\: use ifconfig -OptionWizard.12=Client Instance -OptionWizard.13=Collect Earth Server IP -OptionWizard.14=Collect Earth Server port (e.g. 8023) -OptionWizard.15=Save & Apply changes -OptionWizard.16=ID -OptionWizard.17=X-coord -OptionWizard.18=Y-coord -OptionWizard.19=Elevation -OptionWizard.1=Choose Browser -OptionWizard.20=The Google Earth contents have been changed.
Please accept the content reload when you are prompted by Google Earth. -OptionWizard.21=Update successful -OptionWizard.22=Slope -OptionWizard.23=There was an error when re-opening the Google Earth data -OptionWizard.24=Cancel -OptionWizard.25=Operation Mode -OptionWizard.26=DB host -OptionWizard.27=This is not a recognized Saiku Folder ( the start-saiku.bat file is not present) -OptionWizard.28=Saiku Server not recognized -OptionWizard.29=DB port -OptionWizard.2=Workflow (server/client) -OptionWizard.30=SQLite options -OptionWizard.31=Sample data -OptionWizard.32=Plot layout -OptionWizard.33=Survey Definition -OptionWizard.34=Integrated Services -OptionWizard.35=Number of control points -OptionWizard.36=Distance between control points (in meters) -OptionWizard.37=Margin with plot border (in meters) -OptionWizard.38=The CSV/CED file cannot be read correctly.
The file is expected to have a comma separated values like this \:
-OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect -OptionWizard.3=Server Instance -OptionWizard.40=Projects -OptionWizard.41=Load a new project file -OptionWizard.42=Error when closing the CSV reader -OptionWizard.43=Name of survey -OptionWizard.44=automatically back-up database at -OptionWizard.45=Open Earth Engine Playground ( deprecated ) -OptionWizard.46=Open Earth Engine Timelapse -OptionWizard.47=Open Bing Maps -OptionWizard.48=Open form on a browser instead of Google Earth (recommended for LINUX) -OptionWizard.49=Path to ced/csv file with plot data -OptionWizard.4=Current computer IP \: -OptionWizard.50=Browse... -OptionWizard.51=Error importing project file -OptionWizard.52=CSV/CED file with only coordinates -OptionWizard.53=No points -OptionWizard.54=Central point -OptionWizard.55=Error importing project folder -OptionWizard.56=Load project -OptionWizard.57=Previously loaded projects -OptionWizard.58=Open GEE Code Editor (requires Trusted Tester access) -OptionWizard.59=Open Here Maps focused on the plot -OptionWizard.5=Collect Earth Server port\: -OptionWizard.65=Path to Saiku folder -OptionWizard.66=Browse... -OptionWizard.67=Path to Firefox executable -OptionWizard.68=Browse... -OptionWizard.6=PostgreSQL DB parameters -OptionWizard.70=Executable files -OptionWizard.72=Binary files -OptionWizard.73=Path to Chrome executable -OptionWizard.74=Browse... -OptionWizard.76=Executable files -OptionWizard.78=Binary files -OptionWizard.79=Path to KML Freemarker template -OptionWizard.7=User Name -OptionWizard.80=Browse... -OptionWizard.82=Freemarker template -OptionWizard.83=Path to HTML Balloon form design -OptionWizard.84=Browse... -OptionWizard.86=HTML webpage -OptionWizard.87=Path to XML with IDM definition -OptionWizard.88=Browse... -OptionWizard.8=Password -OptionWizard.90=XML IDM definition -OptionWizard.91=Server (manager version or stand-alone use) -OptionWizard.92=Client (operator/connected to server) -OptionWizard.93=SQLite (Embedded/single file based) -OptionWizard.94=PostgreSQL -OptionWizard.95=Side of the sampling dots (in meters) -OptionWizard.9=DB Name -ProcessMonitorDialog.1=Parsing error on row number -ProcessMonitorDialog.4=, columns -ProcessMonitorDialog.5=\ -- values -SaikuAnalysisListener.0=Yes - Refresh Saiku data (long process) -SaikuAnalysisListener.1=No - Use same version of the data as last time Saiku was used -SaikuStarter.1=Starting Saiku -SaikuStarter.2=Starting Saiku can take some minutes, please wait\! -SaikuToolExportListener.1=Saiku Tool generation -SaikuToolExportListener.2=Generating Saiku Tool with current database -SaveEarthDataServlet.0=Empty request -SaveEarthDataServlet.1=Problem occurred while saving data to the database -SaveEarthDataServlet.2=The data was saved -SlopeCode.0=Flat (0-5) -YES=Yes -YES_TO_ALL=Yes to all +package org.openforis.collect; -GenerateDatabaseStarter.1=Preparing for analysis -GenerateDatabaseStarter.2=Generating Relational Database +/** + * + * @author M. Togna + * + */ +public interface Proxy { -IPCCGeneratorListener.1=Waiting for process to complete\! -IPCCGeneratorListener.2=The IPCC GHGi compatible data is being generated -IPCCGeneratorListener.3=Refresh the data (update with latest from Collect Earth) -IPCCGeneratorListener.4=Use the latest generated database (fastest process - no update) -IPCCGeneratorListener.5=GHGi Database generation -IPCCGeneratorListener.6=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming but it is necessary if the Collect Earth data has been updated since the last time.
\ No newline at end of file +} From d515e59dca2bdfb265993904815b6736ee05c314 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:07 +0100 Subject: [PATCH 0039/1620] New translations Proxy.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 271 +----------------- 1 file changed, 8 insertions(+), 263 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 3ce9622fe0..08b48cb25c 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,265 +1,10 @@ -AboutDialog.19=A problem occurred -AboutDialog.5=For more information visit our website OpenForis.org -AboutDialog.6=Sorry, a problem occurred while trying to open this link in your system's standard browser. -AboutDialog.8=Ok -AspectCode.0=North -AspectCode.1=North-East -AspectCode.2=East -AspectCode.3=South-East -AspectCode.4=South -AspectCode.5=South-West -AspectCode.6=West -AspectCode.7=North-West -CollectEarthMenu.0=Import CEP file -CollectEarthMenu.2=Utilities -CollectEarthMenu.3=Divide large CSV plot files -CollectEarthMenu.4=Export data to XML (from specific date until present) -CollectEarthMenu.5=Export to Collect Backup -CollectEarthMenu.6=Export data as Collect Backup (all data) -CollectEarthMenu.7=Export data as Collect Backup (from date) -CollectEarthMenu.8=Export data to XML (using summary attribute) -CollectEarthWindow.0=Error when attempting to export data to CSV file -CollectEarthWindow.10=File -CollectEarthWindow.11=Exit -CollectEarthWindow.12=Tools -CollectEarthWindow.13=Download data to CSV (Excel) -CollectEarthWindow.14=Start SAIKU Analysis -CollectEarthWindow.15=Properties -CollectEarthWindow.16=Help -CollectEarthWindow.17=Disclaimer -CollectEarthWindow.18=Find missing plots in database -CollectEarthWindow.19=Collect Earth -CollectEarthWindow.1=Export error -CollectEarthWindow.20=Number of duplicated records\: -CollectEarthWindow.21=Could not find icon for main frame -CollectEarthWindow.22=Are you sure that you want to close Collect Earth?
Closing the window will also close the Collect Earth server -CollectEarthWindow.23=Confirmation needed -CollectEarthWindow.24=XML Export -CollectEarthWindow.25=Do you want to add these records anyway and lose your current data? -CollectEarthWindow.26=Operator -CollectEarthWindow.27=Update -CollectEarthWindow.28=Open Foris Collect Earth server should be running while the operator interprets data. -CollectEarthWindow.29=The Saiku Server is not configured. -CollectEarthWindow.2=Language -CollectEarthWindow.30=Please maintain this window open while you are using Google Earth. -CollectEarthWindow.31=Export collected data to CSV file -CollectEarthWindow.32=Quit -CollectEarthWindow.33=The operator name has to be longer than 5 characters and shorter than 50 -CollectEarthWindow.34=Validation error -CollectEarthWindow.35=OPERATOR NAME EMPTY\!
Please fill the operator name and press the "Update" button. -CollectEarthWindow.36=Operator name cannot be empty -CollectEarthWindow.37=Keep Open -CollectEarthWindow.38=CSV files -CollectEarthWindow.39=NOTICE\: It is advisable that you back-up your current data (Export to XML) before importing the new data -CollectEarthWindow.3=\ Import error -CollectEarthWindow.40=Set-up the path to the folder where Saiku Server is installed in the Tools->Properties->Advanced tab. -CollectEarthWindow.41=Saving exported data to file\: -CollectEarthWindow.42=Quit -CollectEarthWindow.43=Conflicting records found -CollectEarthWindow.44=Data Import/Export -CollectEarthWindow.45=Export data to XML (compressed) -CollectEarthWindow.46=Import new data from ZIP (compressed XML) -CollectEarthWindow.47=Saiku Server not configured -CollectEarthWindow.48=Zip/collect-data files -CollectEarthWindow.49=Fusion CSV files -CollectEarthWindow.4=FAO Disclaimer notices -CollectEarthWindow.50=Open User Manual -CollectEarthWindow.51=Check for updates of Collect Earth -CollectEarthWindow.52=Open Application Log File -CollectEarthWindow.53=Collect Earth Log file -CollectEarthWindow.54=Load points from KML -CollectEarthWindow.55=Update current records using CSV -CollectEarthWindow.56=About... -CollectEarthWindow.57=The Saiku starter process is still running, please wait. -CollectEarthWindow.58=Cannot start Saiku analysis -CollectEarthWindow.59=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming.
If you click on "YES" a new dataset with the latest information will be generated. -CollectEarthWindow.5=Close -CollectEarthWindow.60=Saiku data generation -CollectEarthWindow.61=Export data to XML (modified records since last export) -CollectEarthWindow.62=About... -CollectEarthWindow.63=Error getting the points from KML -CollectEarthWindow.64=Technical Support -CollectEarthWindow.65=The operator name has been changed -CollectEarthWindow.66=Operator name -CollectEarthWindow.67=Open data folder -CollectEarthWindow.6=Export to Fusion Table -CollectEarthWindow.70=Open the Survey Guide -CollectEarthWindow.71=Generate Stand-Alone Saiku tool -CollectEarthWindow.7=Error when importing data -CollectEarthWindow.8=Disclaimer text could not be found -CollectEarthWindow.9=The data imported contains records that are already present on your database. -DynamicsCode.0=Initially Forest -DynamicsCode.1=Initially Grassland -DynamicsCode.2=Initially Settlement -DynamicsCode.3=Initially Otherland -DynamicsCode.4=Initially Wetland -DynamicsCode.5=Initially Cropland -EarthApp.11=Collect Earth is already running -EarthApp.21=The file containing the grid of plots as a CSV/CED is not found in the selected path \:
-EarthApp.23=No CSV/CED file has been set-up \:

-EarthApp.24=The file containing the Freemarker template with the KML definition is not found in the selected path \:
-EarthApp.26=No KML definition file has been set-up \:

-EarthApp.27=The file containing the HTML balloon form is not found in the selected path \:
-EarthApp.29=No HTML balloon file has been set-up \:

-EarthApp.30=Please correct the file location in the Tools->Properties menu. -EarthApp.3=Remind me later -EarthApp.4=Update Now -EarthApp.57=There is a new version of Collect Earth available\!
How do you want to proceed? -EarthApp.58=Update alert -EarthApp.59=Error when importing project file -EarthApp.5=Do not remind me again -EarthApp.61=The Collect Earth file could not be open.
Please make sure that Google Earth is installed. -EarthApp.6=\ - Version -EarthApp.70=WARNING -EarthApp.71=In Mac OS X the Collect Earth project files (*.cep) will not open in Collect Earth when they are double-clicked.
-EarthApp.72=Use the Collect Earth toolbar to open the .cep files \: -EarthApp.73=Collect Earth issues in Mac OS X computers -EarthSurveyService.9=Field required -ExportActionListener.1=Pick Date to Export Records From -ExportDialogProcessMonitor.0=Processing data... -ExportDialogProcessMonitor.1=Waiting to initialize process \: -ExportDialogProcessMonitor.4=Exported records \: -ImportActionListener.0=Should the data for plots that have not been completely filled be imported? -ImportActionListener.2=If you click NO only the data from plots in the "green" state, containing all data, will be imported. -ImportActionListener.3=Import non-finished records -ImportDialogProcessMonitor.0=\ CALCULATING -ImportDialogProcessMonitor.11=Initial number of records \: -ImportDialogProcessMonitor.2=Importing records... -ImportDialogProcessMonitor.5=Actual number of imported records \: -ImportDialogProcessMonitor.8=Processing data... -ImportProcessMonitorDialog.0=Imported records \: -ImportXMLDialogProcessMonitor.1 = Overwrite data -ImportXMLDialogProcessMonitor.2 = Import only non-conflicting plots -InfiniteProgressMonitor.0=Cancel operation -JFileChooserExistsAware.0=Collect Earth Project file -KmlImportService.13=Select a CSV file to save the plot locations to -MissingPlotsListener.0=Error while getting information about plots not present on the Database -MissingPlotsListener.10=Total number of plots in the sampling design \: -MissingPlotsListener.12=Number of missing plots \: -MissingPlotsListener.14=All the plots are filled\! -MissingPlotsListener.1=Missing plots -MissingPlotsListener.2=Copy contents to clipboard -MissingPlotsListener.3=Pick the files that contain plot information ( .csv or .ced files ) for which you want to know if all data has been filled. -MissingPlotsListener.4=Missing plots - information -MissingPlotsListener.5=From file \: -MissingPlotsListener.6=Export to CED file -NO=No -NO_TO_ALL=No to all -OpenTextFileListener.0=The text file was not found at \: -OptionWizard.0=Collect Earth options -OptionWizard.100=Open Planet imagery -OptionWizard.101=Planet API key -OptionWizard.1021=URL SecureWatch -OptionWizard.102=Open Maxar SecureWatch -OptionWizard.103=Set URL for Extra Map (opens when set) \: -OptionWizard.104=Browsers -OptionWizard.105=Open Earth Map -OptionWizard.110=Use NICFI provided Monthly imagery -OptionWizard.10=Open backup folder -OptionWizard.11=Unknown\: use ifconfig -OptionWizard.12=Client Instance -OptionWizard.13=Collect Earth Server IP -OptionWizard.14=Collect Earth Server port (e.g. 8023) -OptionWizard.15=Save & Apply changes -OptionWizard.16=ID -OptionWizard.17=X-coord -OptionWizard.18=Y-coord -OptionWizard.19=Elevation -OptionWizard.1=Choose Browser -OptionWizard.20=The Google Earth contents have been changed.
Please accept the content reload when you are prompted by Google Earth. -OptionWizard.21=Update successful -OptionWizard.22=Slope -OptionWizard.23=There was an error when re-opening the Google Earth data -OptionWizard.24=Cancel -OptionWizard.25=Operation Mode -OptionWizard.26=DB host -OptionWizard.27=This is not a recognized Saiku Folder ( the start-saiku.bat file is not present) -OptionWizard.28=Saiku Server not recognized -OptionWizard.29=DB port -OptionWizard.2=Workflow (server/client) -OptionWizard.30=SQLite options -OptionWizard.31=Sample data -OptionWizard.32=Plot layout -OptionWizard.33=Survey Definition -OptionWizard.34=Integrated Services -OptionWizard.35=Number of control points -OptionWizard.36=Distance between control points (in meters) -OptionWizard.37=Margin with plot border (in meters) -OptionWizard.38=The CSV/CED file cannot be read correctly.
The file is expected to have a comma separated values like this \:
-OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect -OptionWizard.3=Server Instance -OptionWizard.40=Projects -OptionWizard.41=Load a new project file -OptionWizard.42=Error when closing the CSV reader -OptionWizard.43=Name of survey -OptionWizard.44=automatically back-up database at -OptionWizard.45=Open Earth Engine Playground ( deprecated ) -OptionWizard.46=Open Earth Engine Timelapse -OptionWizard.47=Open Bing Maps -OptionWizard.48=Open form on a browser instead of Google Earth (recommended for LINUX) -OptionWizard.49=Path to ced/csv file with plot data -OptionWizard.4=Current computer IP \: -OptionWizard.50=Browse... -OptionWizard.51=Error importing project file -OptionWizard.52=CSV/CED file with only coordinates -OptionWizard.53=No points -OptionWizard.54=Central point -OptionWizard.55=Error importing project folder -OptionWizard.56=Load project -OptionWizard.57=Previously loaded projects -OptionWizard.58=Open GEE Code Editor (requires Trusted Tester access) -OptionWizard.59=Open Here Maps focused on the plot -OptionWizard.5=Collect Earth Server port\: -OptionWizard.65=Path to Saiku folder -OptionWizard.66=Browse... -OptionWizard.67=Path to Firefox executable -OptionWizard.68=Browse... -OptionWizard.6=PostgreSQL DB parameters -OptionWizard.70=Executable files -OptionWizard.72=Binary files -OptionWizard.73=Path to Chrome executable -OptionWizard.74=Browse... -OptionWizard.76=Executable files -OptionWizard.78=Binary files -OptionWizard.79=Path to KML Freemarker template -OptionWizard.7=User Name -OptionWizard.80=Browse... -OptionWizard.82=Freemarker template -OptionWizard.83=Path to HTML Balloon form design -OptionWizard.84=Browse... -OptionWizard.86=HTML webpage -OptionWizard.87=Path to XML with IDM definition -OptionWizard.88=Browse... -OptionWizard.8=Password -OptionWizard.90=XML IDM definition -OptionWizard.91=Server (manager version or stand-alone use) -OptionWizard.92=Client (operator/connected to server) -OptionWizard.93=SQLite (Embedded/single file based) -OptionWizard.94=PostgreSQL -OptionWizard.95=Side of the sampling dots (in meters) -OptionWizard.9=DB Name -ProcessMonitorDialog.1=Parsing error on row number -ProcessMonitorDialog.4=, columns -ProcessMonitorDialog.5=\ -- values -SaikuAnalysisListener.0=Yes - Refresh Saiku data (long process) -SaikuAnalysisListener.1=No - Use same version of the data as last time Saiku was used -SaikuStarter.1=Starting Saiku -SaikuStarter.2=Starting Saiku can take some minutes, please wait\! -SaikuToolExportListener.1=Saiku Tool generation -SaikuToolExportListener.2=Generating Saiku Tool with current database -SaveEarthDataServlet.0=Empty request -SaveEarthDataServlet.1=Problem occurred while saving data to the database -SaveEarthDataServlet.2=The data was saved -SlopeCode.0=Flat (0-5) -YES=Yes -YES_TO_ALL=Yes to all +package org.openforis.collect; -GenerateDatabaseStarter.1=Preparing for analysis -GenerateDatabaseStarter.2=Generating Relational Database +/** + * + * @author M. Togna + * + */ +public interface Proxy { -IPCCGeneratorListener.1=Waiting for process to complete\! -IPCCGeneratorListener.2=The IPCC GHGi compatible data is being generated -IPCCGeneratorListener.3=Refresh the data (update with latest from Collect Earth) -IPCCGeneratorListener.4=Use the latest generated database (fastest process - no update) -IPCCGeneratorListener.5=GHGi Database generation -IPCCGeneratorListener.6=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming but it is necessary if the Collect Earth data has been updated since the last time.
\ No newline at end of file +} From 4043170281528b904a494f914f398af60deb2e6b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:08 +0100 Subject: [PATCH 0040/1620] New translations Proxy.java (English) --- .../earth/app/view/Messages_en.properties | 271 +----------------- 1 file changed, 8 insertions(+), 263 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 3ce9622fe0..08b48cb25c 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,265 +1,10 @@ -AboutDialog.19=A problem occurred -AboutDialog.5=For more information visit our website OpenForis.org -AboutDialog.6=Sorry, a problem occurred while trying to open this link in your system's standard browser. -AboutDialog.8=Ok -AspectCode.0=North -AspectCode.1=North-East -AspectCode.2=East -AspectCode.3=South-East -AspectCode.4=South -AspectCode.5=South-West -AspectCode.6=West -AspectCode.7=North-West -CollectEarthMenu.0=Import CEP file -CollectEarthMenu.2=Utilities -CollectEarthMenu.3=Divide large CSV plot files -CollectEarthMenu.4=Export data to XML (from specific date until present) -CollectEarthMenu.5=Export to Collect Backup -CollectEarthMenu.6=Export data as Collect Backup (all data) -CollectEarthMenu.7=Export data as Collect Backup (from date) -CollectEarthMenu.8=Export data to XML (using summary attribute) -CollectEarthWindow.0=Error when attempting to export data to CSV file -CollectEarthWindow.10=File -CollectEarthWindow.11=Exit -CollectEarthWindow.12=Tools -CollectEarthWindow.13=Download data to CSV (Excel) -CollectEarthWindow.14=Start SAIKU Analysis -CollectEarthWindow.15=Properties -CollectEarthWindow.16=Help -CollectEarthWindow.17=Disclaimer -CollectEarthWindow.18=Find missing plots in database -CollectEarthWindow.19=Collect Earth -CollectEarthWindow.1=Export error -CollectEarthWindow.20=Number of duplicated records\: -CollectEarthWindow.21=Could not find icon for main frame -CollectEarthWindow.22=Are you sure that you want to close Collect Earth?
Closing the window will also close the Collect Earth server -CollectEarthWindow.23=Confirmation needed -CollectEarthWindow.24=XML Export -CollectEarthWindow.25=Do you want to add these records anyway and lose your current data? -CollectEarthWindow.26=Operator -CollectEarthWindow.27=Update -CollectEarthWindow.28=Open Foris Collect Earth server should be running while the operator interprets data. -CollectEarthWindow.29=The Saiku Server is not configured. -CollectEarthWindow.2=Language -CollectEarthWindow.30=Please maintain this window open while you are using Google Earth. -CollectEarthWindow.31=Export collected data to CSV file -CollectEarthWindow.32=Quit -CollectEarthWindow.33=The operator name has to be longer than 5 characters and shorter than 50 -CollectEarthWindow.34=Validation error -CollectEarthWindow.35=OPERATOR NAME EMPTY\!
Please fill the operator name and press the "Update" button. -CollectEarthWindow.36=Operator name cannot be empty -CollectEarthWindow.37=Keep Open -CollectEarthWindow.38=CSV files -CollectEarthWindow.39=NOTICE\: It is advisable that you back-up your current data (Export to XML) before importing the new data -CollectEarthWindow.3=\ Import error -CollectEarthWindow.40=Set-up the path to the folder where Saiku Server is installed in the Tools->Properties->Advanced tab. -CollectEarthWindow.41=Saving exported data to file\: -CollectEarthWindow.42=Quit -CollectEarthWindow.43=Conflicting records found -CollectEarthWindow.44=Data Import/Export -CollectEarthWindow.45=Export data to XML (compressed) -CollectEarthWindow.46=Import new data from ZIP (compressed XML) -CollectEarthWindow.47=Saiku Server not configured -CollectEarthWindow.48=Zip/collect-data files -CollectEarthWindow.49=Fusion CSV files -CollectEarthWindow.4=FAO Disclaimer notices -CollectEarthWindow.50=Open User Manual -CollectEarthWindow.51=Check for updates of Collect Earth -CollectEarthWindow.52=Open Application Log File -CollectEarthWindow.53=Collect Earth Log file -CollectEarthWindow.54=Load points from KML -CollectEarthWindow.55=Update current records using CSV -CollectEarthWindow.56=About... -CollectEarthWindow.57=The Saiku starter process is still running, please wait. -CollectEarthWindow.58=Cannot start Saiku analysis -CollectEarthWindow.59=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming.
If you click on "YES" a new dataset with the latest information will be generated. -CollectEarthWindow.5=Close -CollectEarthWindow.60=Saiku data generation -CollectEarthWindow.61=Export data to XML (modified records since last export) -CollectEarthWindow.62=About... -CollectEarthWindow.63=Error getting the points from KML -CollectEarthWindow.64=Technical Support -CollectEarthWindow.65=The operator name has been changed -CollectEarthWindow.66=Operator name -CollectEarthWindow.67=Open data folder -CollectEarthWindow.6=Export to Fusion Table -CollectEarthWindow.70=Open the Survey Guide -CollectEarthWindow.71=Generate Stand-Alone Saiku tool -CollectEarthWindow.7=Error when importing data -CollectEarthWindow.8=Disclaimer text could not be found -CollectEarthWindow.9=The data imported contains records that are already present on your database. -DynamicsCode.0=Initially Forest -DynamicsCode.1=Initially Grassland -DynamicsCode.2=Initially Settlement -DynamicsCode.3=Initially Otherland -DynamicsCode.4=Initially Wetland -DynamicsCode.5=Initially Cropland -EarthApp.11=Collect Earth is already running -EarthApp.21=The file containing the grid of plots as a CSV/CED is not found in the selected path \:
-EarthApp.23=No CSV/CED file has been set-up \:

-EarthApp.24=The file containing the Freemarker template with the KML definition is not found in the selected path \:
-EarthApp.26=No KML definition file has been set-up \:

-EarthApp.27=The file containing the HTML balloon form is not found in the selected path \:
-EarthApp.29=No HTML balloon file has been set-up \:

-EarthApp.30=Please correct the file location in the Tools->Properties menu. -EarthApp.3=Remind me later -EarthApp.4=Update Now -EarthApp.57=There is a new version of Collect Earth available\!
How do you want to proceed? -EarthApp.58=Update alert -EarthApp.59=Error when importing project file -EarthApp.5=Do not remind me again -EarthApp.61=The Collect Earth file could not be open.
Please make sure that Google Earth is installed. -EarthApp.6=\ - Version -EarthApp.70=WARNING -EarthApp.71=In Mac OS X the Collect Earth project files (*.cep) will not open in Collect Earth when they are double-clicked.
-EarthApp.72=Use the Collect Earth toolbar to open the .cep files \: -EarthApp.73=Collect Earth issues in Mac OS X computers -EarthSurveyService.9=Field required -ExportActionListener.1=Pick Date to Export Records From -ExportDialogProcessMonitor.0=Processing data... -ExportDialogProcessMonitor.1=Waiting to initialize process \: -ExportDialogProcessMonitor.4=Exported records \: -ImportActionListener.0=Should the data for plots that have not been completely filled be imported? -ImportActionListener.2=If you click NO only the data from plots in the "green" state, containing all data, will be imported. -ImportActionListener.3=Import non-finished records -ImportDialogProcessMonitor.0=\ CALCULATING -ImportDialogProcessMonitor.11=Initial number of records \: -ImportDialogProcessMonitor.2=Importing records... -ImportDialogProcessMonitor.5=Actual number of imported records \: -ImportDialogProcessMonitor.8=Processing data... -ImportProcessMonitorDialog.0=Imported records \: -ImportXMLDialogProcessMonitor.1 = Overwrite data -ImportXMLDialogProcessMonitor.2 = Import only non-conflicting plots -InfiniteProgressMonitor.0=Cancel operation -JFileChooserExistsAware.0=Collect Earth Project file -KmlImportService.13=Select a CSV file to save the plot locations to -MissingPlotsListener.0=Error while getting information about plots not present on the Database -MissingPlotsListener.10=Total number of plots in the sampling design \: -MissingPlotsListener.12=Number of missing plots \: -MissingPlotsListener.14=All the plots are filled\! -MissingPlotsListener.1=Missing plots -MissingPlotsListener.2=Copy contents to clipboard -MissingPlotsListener.3=Pick the files that contain plot information ( .csv or .ced files ) for which you want to know if all data has been filled. -MissingPlotsListener.4=Missing plots - information -MissingPlotsListener.5=From file \: -MissingPlotsListener.6=Export to CED file -NO=No -NO_TO_ALL=No to all -OpenTextFileListener.0=The text file was not found at \: -OptionWizard.0=Collect Earth options -OptionWizard.100=Open Planet imagery -OptionWizard.101=Planet API key -OptionWizard.1021=URL SecureWatch -OptionWizard.102=Open Maxar SecureWatch -OptionWizard.103=Set URL for Extra Map (opens when set) \: -OptionWizard.104=Browsers -OptionWizard.105=Open Earth Map -OptionWizard.110=Use NICFI provided Monthly imagery -OptionWizard.10=Open backup folder -OptionWizard.11=Unknown\: use ifconfig -OptionWizard.12=Client Instance -OptionWizard.13=Collect Earth Server IP -OptionWizard.14=Collect Earth Server port (e.g. 8023) -OptionWizard.15=Save & Apply changes -OptionWizard.16=ID -OptionWizard.17=X-coord -OptionWizard.18=Y-coord -OptionWizard.19=Elevation -OptionWizard.1=Choose Browser -OptionWizard.20=The Google Earth contents have been changed.
Please accept the content reload when you are prompted by Google Earth. -OptionWizard.21=Update successful -OptionWizard.22=Slope -OptionWizard.23=There was an error when re-opening the Google Earth data -OptionWizard.24=Cancel -OptionWizard.25=Operation Mode -OptionWizard.26=DB host -OptionWizard.27=This is not a recognized Saiku Folder ( the start-saiku.bat file is not present) -OptionWizard.28=Saiku Server not recognized -OptionWizard.29=DB port -OptionWizard.2=Workflow (server/client) -OptionWizard.30=SQLite options -OptionWizard.31=Sample data -OptionWizard.32=Plot layout -OptionWizard.33=Survey Definition -OptionWizard.34=Integrated Services -OptionWizard.35=Number of control points -OptionWizard.36=Distance between control points (in meters) -OptionWizard.37=Margin with plot border (in meters) -OptionWizard.38=The CSV/CED file cannot be read correctly.
The file is expected to have a comma separated values like this \:
-OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect -OptionWizard.3=Server Instance -OptionWizard.40=Projects -OptionWizard.41=Load a new project file -OptionWizard.42=Error when closing the CSV reader -OptionWizard.43=Name of survey -OptionWizard.44=automatically back-up database at -OptionWizard.45=Open Earth Engine Playground ( deprecated ) -OptionWizard.46=Open Earth Engine Timelapse -OptionWizard.47=Open Bing Maps -OptionWizard.48=Open form on a browser instead of Google Earth (recommended for LINUX) -OptionWizard.49=Path to ced/csv file with plot data -OptionWizard.4=Current computer IP \: -OptionWizard.50=Browse... -OptionWizard.51=Error importing project file -OptionWizard.52=CSV/CED file with only coordinates -OptionWizard.53=No points -OptionWizard.54=Central point -OptionWizard.55=Error importing project folder -OptionWizard.56=Load project -OptionWizard.57=Previously loaded projects -OptionWizard.58=Open GEE Code Editor (requires Trusted Tester access) -OptionWizard.59=Open Here Maps focused on the plot -OptionWizard.5=Collect Earth Server port\: -OptionWizard.65=Path to Saiku folder -OptionWizard.66=Browse... -OptionWizard.67=Path to Firefox executable -OptionWizard.68=Browse... -OptionWizard.6=PostgreSQL DB parameters -OptionWizard.70=Executable files -OptionWizard.72=Binary files -OptionWizard.73=Path to Chrome executable -OptionWizard.74=Browse... -OptionWizard.76=Executable files -OptionWizard.78=Binary files -OptionWizard.79=Path to KML Freemarker template -OptionWizard.7=User Name -OptionWizard.80=Browse... -OptionWizard.82=Freemarker template -OptionWizard.83=Path to HTML Balloon form design -OptionWizard.84=Browse... -OptionWizard.86=HTML webpage -OptionWizard.87=Path to XML with IDM definition -OptionWizard.88=Browse... -OptionWizard.8=Password -OptionWizard.90=XML IDM definition -OptionWizard.91=Server (manager version or stand-alone use) -OptionWizard.92=Client (operator/connected to server) -OptionWizard.93=SQLite (Embedded/single file based) -OptionWizard.94=PostgreSQL -OptionWizard.95=Side of the sampling dots (in meters) -OptionWizard.9=DB Name -ProcessMonitorDialog.1=Parsing error on row number -ProcessMonitorDialog.4=, columns -ProcessMonitorDialog.5=\ -- values -SaikuAnalysisListener.0=Yes - Refresh Saiku data (long process) -SaikuAnalysisListener.1=No - Use same version of the data as last time Saiku was used -SaikuStarter.1=Starting Saiku -SaikuStarter.2=Starting Saiku can take some minutes, please wait\! -SaikuToolExportListener.1=Saiku Tool generation -SaikuToolExportListener.2=Generating Saiku Tool with current database -SaveEarthDataServlet.0=Empty request -SaveEarthDataServlet.1=Problem occurred while saving data to the database -SaveEarthDataServlet.2=The data was saved -SlopeCode.0=Flat (0-5) -YES=Yes -YES_TO_ALL=Yes to all +package org.openforis.collect; -GenerateDatabaseStarter.1=Preparing for analysis -GenerateDatabaseStarter.2=Generating Relational Database +/** + * + * @author M. Togna + * + */ +public interface Proxy { -IPCCGeneratorListener.1=Waiting for process to complete\! -IPCCGeneratorListener.2=The IPCC GHGi compatible data is being generated -IPCCGeneratorListener.3=Refresh the data (update with latest from Collect Earth) -IPCCGeneratorListener.4=Use the latest generated database (fastest process - no update) -IPCCGeneratorListener.5=GHGi Database generation -IPCCGeneratorListener.6=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming but it is necessary if the Collect Earth data has been updated since the last time.
\ No newline at end of file +} From 4b4d384f59ee87eb3c02f180d8045169115ce93c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:09 +0100 Subject: [PATCH 0041/1620] New translations ProxyContext.java (French) --- .../earth/app/view/Messages_fr.properties | 32 +++++++++++++++++-- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 08b48cb25c..c75c432a82 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,10 +1,36 @@ package org.openforis.collect; +import java.util.Locale; + +import org.openforis.collect.manager.MessageSource; +import org.openforis.collect.manager.ResourceBundleMessageSource; + /** * - * @author M. Togna - * + * @author S. Ricci + * */ -public interface Proxy { +public class ProxyContext { + + private Locale locale; + private MessageSource messageSource; + + public ProxyContext(Locale locale) { + this(locale, new ResourceBundleMessageSource()); + } + public ProxyContext(Locale locale, MessageSource messageSource) { + super(); + this.locale = locale; + this.messageSource = messageSource; + } + + public Locale getLocale() { + return locale; + } + + public MessageSource getMessageSource() { + return messageSource; + } + } From 89e535bd193ed1b8595c7957accb0ba6e176fcd8 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:10 +0100 Subject: [PATCH 0042/1620] New translations ProxyContext.java (Spanish) --- .../earth/app/view/Messages_es.properties | 32 +++++++++++++++++-- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 08b48cb25c..c75c432a82 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,10 +1,36 @@ package org.openforis.collect; +import java.util.Locale; + +import org.openforis.collect.manager.MessageSource; +import org.openforis.collect.manager.ResourceBundleMessageSource; + /** * - * @author M. Togna - * + * @author S. Ricci + * */ -public interface Proxy { +public class ProxyContext { + + private Locale locale; + private MessageSource messageSource; + + public ProxyContext(Locale locale) { + this(locale, new ResourceBundleMessageSource()); + } + public ProxyContext(Locale locale, MessageSource messageSource) { + super(); + this.locale = locale; + this.messageSource = messageSource; + } + + public Locale getLocale() { + return locale; + } + + public MessageSource getMessageSource() { + return messageSource; + } + } From b6fa200b07f04e519c2ac4112c797be6c7208f78 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:11 +0100 Subject: [PATCH 0043/1620] New translations ProxyContext.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 32 +++++++++++++++++-- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 08b48cb25c..c75c432a82 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,10 +1,36 @@ package org.openforis.collect; +import java.util.Locale; + +import org.openforis.collect.manager.MessageSource; +import org.openforis.collect.manager.ResourceBundleMessageSource; + /** * - * @author M. Togna - * + * @author S. Ricci + * */ -public interface Proxy { +public class ProxyContext { + + private Locale locale; + private MessageSource messageSource; + + public ProxyContext(Locale locale) { + this(locale, new ResourceBundleMessageSource()); + } + public ProxyContext(Locale locale, MessageSource messageSource) { + super(); + this.locale = locale; + this.messageSource = messageSource; + } + + public Locale getLocale() { + return locale; + } + + public MessageSource getMessageSource() { + return messageSource; + } + } From b0de175cc981db126834ce2a9c0b3927490a2ac2 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:13 +0100 Subject: [PATCH 0044/1620] New translations ProxyContext.java (English) --- .../earth/app/view/Messages_en.properties | 32 +++++++++++++++++-- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 08b48cb25c..c75c432a82 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,10 +1,36 @@ package org.openforis.collect; +import java.util.Locale; + +import org.openforis.collect.manager.MessageSource; +import org.openforis.collect.manager.ResourceBundleMessageSource; + /** * - * @author M. Togna - * + * @author S. Ricci + * */ -public interface Proxy { +public class ProxyContext { + + private Locale locale; + private MessageSource messageSource; + + public ProxyContext(Locale locale) { + this(locale, new ResourceBundleMessageSource()); + } + public ProxyContext(Locale locale, MessageSource messageSource) { + super(); + this.locale = locale; + this.messageSource = messageSource; + } + + public Locale getLocale() { + return locale; + } + + public MessageSource getMessageSource() { + return messageSource; + } + } From 4cb1c6d2253dfc711954e48367eeba2faeec31b3 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:14 +0100 Subject: [PATCH 0045/1620] New translations CollectEarthUtils.java (Spanish) --- .../earth/app/view/Messages_es.properties | 222 ++++++++++++++++-- 1 file changed, 197 insertions(+), 25 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index c75c432a82..8fa17ec627 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,36 +1,208 @@ -package org.openforis.collect; +package org.openforis.collect.earth.app; -import java.util.Locale; +import java.awt.Desktop; +import java.awt.Font; +import java.awt.FontFormatException; +import java.awt.GraphicsEnvironment; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.sql.Connection; +import java.sql.DriverManager; +import java.util.Enumeration; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; -import org.openforis.collect.manager.MessageSource; -import org.openforis.collect.manager.ResourceBundleMessageSource; +import javax.swing.UIManager; -/** - * - * @author S. Ricci - * - */ -public class ProxyContext { +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.commons.lang3.SystemUtils; +import org.openforis.collect.earth.app.EarthConstants.UI_LANGUAGE; +import org.openforis.collect.earth.app.view.Messages; +import org.postgresql.Driver; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; - private Locale locale; - private MessageSource messageSource; - - public ProxyContext(Locale locale) { - this(locale, new ResourceBundleMessageSource()); +import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.exception.ZipException; +import net.lingala.zip4j.model.ZipParameters; +import net.lingala.zip4j.model.enums.CompressionLevel; +import net.lingala.zip4j.model.enums.CompressionMethod; + +public class CollectEarthUtils { + + private static final Logger logger = LoggerFactory.getLogger(CollectEarthUtils.class); + + private CollectEarthUtils() { } - public ProxyContext(Locale locale, MessageSource messageSource) { - super(); - this.locale = locale; - this.messageSource = messageSource; + public static String getMd5FromFolder(File folder) throws IOException { + + if (!folder.isDirectory()) { + throw new IllegalArgumentException("The file passed as an argument needs to be a folder!"); + } + StringBuilder md5Hex = new StringBuilder(); + + try( Stream paths = Files.walk(Paths.get(folder.toURI()), 3); ) { + List listFiles = paths.filter(Files::isRegularFile).map(Path::toFile) + .collect(Collectors.toList()); + for (File file : listFiles) { + md5Hex.append(DigestUtils.md5Hex(new FileInputStream(file))); + } + return DigestUtils.md5Hex(md5Hex.toString().getBytes()); + } } - - public Locale getLocale() { - return locale; + + public static String getMd5FromFile(String filePath) throws IOException { + return DigestUtils.md5Hex(new FileInputStream(new File(filePath))); } - - public MessageSource getMessageSource() { - return messageSource; + + public static void setFontDependingOnLanguaue(UI_LANGUAGE uiLanguage) { + if (uiLanguage == UI_LANGUAGE.LO) { + String ttfFileName = "Phetsarath_OT.ttf"; + // create the font + setUiFont(ttfFileName); + } else if (uiLanguage == UI_LANGUAGE.MN) { + String ttfFileName = "arhangai.ttf"; + // create the font + setUiFont(ttfFileName); + } else { + CollectEarthUtils.setUiFont(new javax.swing.plaf.FontUIResource("Arial Unicode MS", Font.PLAIN, 12)); + } + } + + public static void setUiFont(String ttfFileName) { + try { + // create the font to use. Specify the size! + InputStream fontStream = CollectEarthUtils.class.getResourceAsStream(ttfFileName); + Font laoFont = Font.createFont(Font.TRUETYPE_FONT, fontStream).deriveFont(12f); + GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); + // register the font + ge.registerFont(laoFont); + CollectEarthUtils.setUiFont(new javax.swing.plaf.FontUIResource(laoFont.getFontName(), Font.PLAIN, 12)); + } catch (IOException | FontFormatException e) { + logger.error("error setting the font " + ttfFileName, e); + } + + } + + private static void setUiFont(javax.swing.plaf.FontUIResource f) { + Enumeration keys = UIManager.getDefaults().keys(); + while (keys.hasMoreElements()) { + Object key = keys.nextElement(); + Object value = UIManager.get(key); + if (value instanceof javax.swing.plaf.FontUIResource) + UIManager.put(key, f); + } + } + + public static ZipFile addFileToZip(String pathToDestinationZip, File fileToAdd, String fileNameInZip) throws IOException { + File destinationZip = new File(pathToDestinationZip); + return addFileToZip(destinationZip, fileToAdd, fileNameInZip); } + public static ZipFile addFileToZip(File destinationZip, File fileToAdd, String fileNameInZip) throws IOException { + try( ZipFile zipFile = new ZipFile(destinationZip) ){ + ZipParameters zipParameters = new ZipParameters(); + // COMP_DEFLATE is for compression + zipParameters.setCompressionMethod(CompressionMethod.DEFLATE); + // DEFLATE_LEVEL_ULTRA = maximum compression + zipParameters.setCompressionLevel(CompressionLevel.ULTRA); + zipParameters.setFileNameInZip(fileNameInZip); + zipFile.addFile(fileToAdd, zipParameters); + return zipFile; + }catch(Exception e) { + logger.error("Error adding file to ZIP", e); + return null; + } + } + + public static String getComputerIp() { + try { + return InetAddress.getLocalHost().getHostAddress(); + } catch (final UnknownHostException e) { + logger.warn("Unknown IP address", e); //$NON-NLS-1$ + return Messages.getString("OptionWizard.11"); //$NON-NLS-1$ + } + } + + public static void addFolderToZip(ZipFile zipFile, File folderToCompress) throws ZipException { + ZipParameters zipParameters = new ZipParameters(); + // COMP_DEFLATE is for compression + zipParameters.setCompressionMethod(CompressionMethod.DEFLATE); + // DEFLATE_LEVEL_ULTRA = maximum compression + zipParameters.setCompressionLevel(CompressionLevel.ULTRA); + + if (folderToCompress.exists() && folderToCompress.isDirectory()) { + zipFile.addFolder(folderToCompress, zipParameters); + } + } + + public static void openFolderInExplorer(String folder) throws IOException { + if (Desktop.isDesktopSupported()) { + Desktop.getDesktop().open(new File(folder)); + } else { + if (SystemUtils.IS_OS_WINDOWS) { + new ProcessBuilder("explorer.exe", "/open," + folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } else if (SystemUtils.IS_OS_MAC) { + new ProcessBuilder("usr/bin/open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } else if (SystemUtils.IS_OS_UNIX) { + tryUnixFileExplorers(folder); + } + } + } + + public static void tryUnixFileExplorers(String folder) throws IOException { + try { + new ProcessBuilder("nautilus", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (IOException e1) { + try { + new ProcessBuilder("gnome-open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (IOException e2) { + try { + new ProcessBuilder("kde-open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (IOException e3) { + new ProcessBuilder("caja", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + } + } + + public static boolean openFile(File fileToOpenWithOSViewer) { + boolean success = false; + if (Desktop.isDesktopSupported()) { + try { + Desktop.getDesktop().open(fileToOpenWithOSViewer); + success = true; + } catch (IOException ex) { + logger.warn("No application registered to open file {}", fileToOpenWithOSViewer.getAbsolutePath()); //$NON-NLS-1$ + } + } + return success; + } + + public static String testPostgreSQLConnection(String host, String port, String dbName, String username, + String password) { + String message = "Connection OK!"; + try { + Driver postgresDriver = new Driver(); + DriverManager.registerDriver(postgresDriver, null); + String url = "jdbc:postgresql://" + host + ":" + port + "/" + dbName; + try( Connection conn = DriverManager.getConnection(url, username, password) ){ + logger.debug("PostgreSQL Connection is valid! {}", conn.isValid(10) );// 10 sec + } + } catch (Exception e) { + logger.error("Error connecting to DB while testing", e); + message = e.getMessage(); + } + return message; + } + } From b5d31f20425ad0682b3e04f67c7da1802efd03d4 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:15 +0100 Subject: [PATCH 0046/1620] New translations FixCoordinatesMongolia.java (French) --- .../earth/app/view/Messages_fr.properties | 37 ++++--------------- 1 file changed, 7 insertions(+), 30 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index c75c432a82..c36b2d4338 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,36 +1,13 @@ -package org.openforis.collect; +package org.openforis.collect.earth.app.ad_hoc; -import java.util.Locale; +import org.springframework.stereotype.Component; -import org.openforis.collect.manager.MessageSource; -import org.openforis.collect.manager.ResourceBundleMessageSource; +@Component +public class FixCoordinatesMongolia extends FixCoordinates { -/** - * - * @author S. Ricci - * - */ -public class ProxyContext { - - private Locale locale; - private MessageSource messageSource; - - public ProxyContext(Locale locale) { - this(locale, new ResourceBundleMessageSource()); + @Override + protected int getLongitudeLimit() { + return 87; } - public ProxyContext(Locale locale, MessageSource messageSource) { - super(); - this.locale = locale; - this.messageSource = messageSource; - } - - public Locale getLocale() { - return locale; - } - - public MessageSource getMessageSource() { - return messageSource; - } - } From 0dd9f33170cfb8974b0fa70ff118935b72ec7524 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:16 +0100 Subject: [PATCH 0047/1620] New translations CollectEarthUtils.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 222 ++++++++++++++++-- 1 file changed, 197 insertions(+), 25 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index c75c432a82..8fa17ec627 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,36 +1,208 @@ -package org.openforis.collect; +package org.openforis.collect.earth.app; -import java.util.Locale; +import java.awt.Desktop; +import java.awt.Font; +import java.awt.FontFormatException; +import java.awt.GraphicsEnvironment; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.sql.Connection; +import java.sql.DriverManager; +import java.util.Enumeration; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; -import org.openforis.collect.manager.MessageSource; -import org.openforis.collect.manager.ResourceBundleMessageSource; +import javax.swing.UIManager; -/** - * - * @author S. Ricci - * - */ -public class ProxyContext { +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.commons.lang3.SystemUtils; +import org.openforis.collect.earth.app.EarthConstants.UI_LANGUAGE; +import org.openforis.collect.earth.app.view.Messages; +import org.postgresql.Driver; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; - private Locale locale; - private MessageSource messageSource; - - public ProxyContext(Locale locale) { - this(locale, new ResourceBundleMessageSource()); +import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.exception.ZipException; +import net.lingala.zip4j.model.ZipParameters; +import net.lingala.zip4j.model.enums.CompressionLevel; +import net.lingala.zip4j.model.enums.CompressionMethod; + +public class CollectEarthUtils { + + private static final Logger logger = LoggerFactory.getLogger(CollectEarthUtils.class); + + private CollectEarthUtils() { } - public ProxyContext(Locale locale, MessageSource messageSource) { - super(); - this.locale = locale; - this.messageSource = messageSource; + public static String getMd5FromFolder(File folder) throws IOException { + + if (!folder.isDirectory()) { + throw new IllegalArgumentException("The file passed as an argument needs to be a folder!"); + } + StringBuilder md5Hex = new StringBuilder(); + + try( Stream paths = Files.walk(Paths.get(folder.toURI()), 3); ) { + List listFiles = paths.filter(Files::isRegularFile).map(Path::toFile) + .collect(Collectors.toList()); + for (File file : listFiles) { + md5Hex.append(DigestUtils.md5Hex(new FileInputStream(file))); + } + return DigestUtils.md5Hex(md5Hex.toString().getBytes()); + } } - - public Locale getLocale() { - return locale; + + public static String getMd5FromFile(String filePath) throws IOException { + return DigestUtils.md5Hex(new FileInputStream(new File(filePath))); } - - public MessageSource getMessageSource() { - return messageSource; + + public static void setFontDependingOnLanguaue(UI_LANGUAGE uiLanguage) { + if (uiLanguage == UI_LANGUAGE.LO) { + String ttfFileName = "Phetsarath_OT.ttf"; + // create the font + setUiFont(ttfFileName); + } else if (uiLanguage == UI_LANGUAGE.MN) { + String ttfFileName = "arhangai.ttf"; + // create the font + setUiFont(ttfFileName); + } else { + CollectEarthUtils.setUiFont(new javax.swing.plaf.FontUIResource("Arial Unicode MS", Font.PLAIN, 12)); + } + } + + public static void setUiFont(String ttfFileName) { + try { + // create the font to use. Specify the size! + InputStream fontStream = CollectEarthUtils.class.getResourceAsStream(ttfFileName); + Font laoFont = Font.createFont(Font.TRUETYPE_FONT, fontStream).deriveFont(12f); + GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); + // register the font + ge.registerFont(laoFont); + CollectEarthUtils.setUiFont(new javax.swing.plaf.FontUIResource(laoFont.getFontName(), Font.PLAIN, 12)); + } catch (IOException | FontFormatException e) { + logger.error("error setting the font " + ttfFileName, e); + } + + } + + private static void setUiFont(javax.swing.plaf.FontUIResource f) { + Enumeration keys = UIManager.getDefaults().keys(); + while (keys.hasMoreElements()) { + Object key = keys.nextElement(); + Object value = UIManager.get(key); + if (value instanceof javax.swing.plaf.FontUIResource) + UIManager.put(key, f); + } + } + + public static ZipFile addFileToZip(String pathToDestinationZip, File fileToAdd, String fileNameInZip) throws IOException { + File destinationZip = new File(pathToDestinationZip); + return addFileToZip(destinationZip, fileToAdd, fileNameInZip); } + public static ZipFile addFileToZip(File destinationZip, File fileToAdd, String fileNameInZip) throws IOException { + try( ZipFile zipFile = new ZipFile(destinationZip) ){ + ZipParameters zipParameters = new ZipParameters(); + // COMP_DEFLATE is for compression + zipParameters.setCompressionMethod(CompressionMethod.DEFLATE); + // DEFLATE_LEVEL_ULTRA = maximum compression + zipParameters.setCompressionLevel(CompressionLevel.ULTRA); + zipParameters.setFileNameInZip(fileNameInZip); + zipFile.addFile(fileToAdd, zipParameters); + return zipFile; + }catch(Exception e) { + logger.error("Error adding file to ZIP", e); + return null; + } + } + + public static String getComputerIp() { + try { + return InetAddress.getLocalHost().getHostAddress(); + } catch (final UnknownHostException e) { + logger.warn("Unknown IP address", e); //$NON-NLS-1$ + return Messages.getString("OptionWizard.11"); //$NON-NLS-1$ + } + } + + public static void addFolderToZip(ZipFile zipFile, File folderToCompress) throws ZipException { + ZipParameters zipParameters = new ZipParameters(); + // COMP_DEFLATE is for compression + zipParameters.setCompressionMethod(CompressionMethod.DEFLATE); + // DEFLATE_LEVEL_ULTRA = maximum compression + zipParameters.setCompressionLevel(CompressionLevel.ULTRA); + + if (folderToCompress.exists() && folderToCompress.isDirectory()) { + zipFile.addFolder(folderToCompress, zipParameters); + } + } + + public static void openFolderInExplorer(String folder) throws IOException { + if (Desktop.isDesktopSupported()) { + Desktop.getDesktop().open(new File(folder)); + } else { + if (SystemUtils.IS_OS_WINDOWS) { + new ProcessBuilder("explorer.exe", "/open," + folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } else if (SystemUtils.IS_OS_MAC) { + new ProcessBuilder("usr/bin/open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } else if (SystemUtils.IS_OS_UNIX) { + tryUnixFileExplorers(folder); + } + } + } + + public static void tryUnixFileExplorers(String folder) throws IOException { + try { + new ProcessBuilder("nautilus", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (IOException e1) { + try { + new ProcessBuilder("gnome-open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (IOException e2) { + try { + new ProcessBuilder("kde-open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (IOException e3) { + new ProcessBuilder("caja", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + } + } + + public static boolean openFile(File fileToOpenWithOSViewer) { + boolean success = false; + if (Desktop.isDesktopSupported()) { + try { + Desktop.getDesktop().open(fileToOpenWithOSViewer); + success = true; + } catch (IOException ex) { + logger.warn("No application registered to open file {}", fileToOpenWithOSViewer.getAbsolutePath()); //$NON-NLS-1$ + } + } + return success; + } + + public static String testPostgreSQLConnection(String host, String port, String dbName, String username, + String password) { + String message = "Connection OK!"; + try { + Driver postgresDriver = new Driver(); + DriverManager.registerDriver(postgresDriver, null); + String url = "jdbc:postgresql://" + host + ":" + port + "/" + dbName; + try( Connection conn = DriverManager.getConnection(url, username, password) ){ + logger.debug("PostgreSQL Connection is valid! {}", conn.isValid(10) );// 10 sec + } + } catch (Exception e) { + logger.error("Error connecting to DB while testing", e); + message = e.getMessage(); + } + return message; + } + } From 7f232a6da781bd20f76b1785fc43c9f6a12ec8ad Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:17 +0100 Subject: [PATCH 0048/1620] New translations CollectEarthUtils.java (English) --- .../earth/app/view/Messages_en.properties | 222 ++++++++++++++++-- 1 file changed, 197 insertions(+), 25 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index c75c432a82..8fa17ec627 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,36 +1,208 @@ -package org.openforis.collect; +package org.openforis.collect.earth.app; -import java.util.Locale; +import java.awt.Desktop; +import java.awt.Font; +import java.awt.FontFormatException; +import java.awt.GraphicsEnvironment; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.sql.Connection; +import java.sql.DriverManager; +import java.util.Enumeration; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; -import org.openforis.collect.manager.MessageSource; -import org.openforis.collect.manager.ResourceBundleMessageSource; +import javax.swing.UIManager; -/** - * - * @author S. Ricci - * - */ -public class ProxyContext { +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.commons.lang3.SystemUtils; +import org.openforis.collect.earth.app.EarthConstants.UI_LANGUAGE; +import org.openforis.collect.earth.app.view.Messages; +import org.postgresql.Driver; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; - private Locale locale; - private MessageSource messageSource; - - public ProxyContext(Locale locale) { - this(locale, new ResourceBundleMessageSource()); +import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.exception.ZipException; +import net.lingala.zip4j.model.ZipParameters; +import net.lingala.zip4j.model.enums.CompressionLevel; +import net.lingala.zip4j.model.enums.CompressionMethod; + +public class CollectEarthUtils { + + private static final Logger logger = LoggerFactory.getLogger(CollectEarthUtils.class); + + private CollectEarthUtils() { } - public ProxyContext(Locale locale, MessageSource messageSource) { - super(); - this.locale = locale; - this.messageSource = messageSource; + public static String getMd5FromFolder(File folder) throws IOException { + + if (!folder.isDirectory()) { + throw new IllegalArgumentException("The file passed as an argument needs to be a folder!"); + } + StringBuilder md5Hex = new StringBuilder(); + + try( Stream paths = Files.walk(Paths.get(folder.toURI()), 3); ) { + List listFiles = paths.filter(Files::isRegularFile).map(Path::toFile) + .collect(Collectors.toList()); + for (File file : listFiles) { + md5Hex.append(DigestUtils.md5Hex(new FileInputStream(file))); + } + return DigestUtils.md5Hex(md5Hex.toString().getBytes()); + } } - - public Locale getLocale() { - return locale; + + public static String getMd5FromFile(String filePath) throws IOException { + return DigestUtils.md5Hex(new FileInputStream(new File(filePath))); } - - public MessageSource getMessageSource() { - return messageSource; + + public static void setFontDependingOnLanguaue(UI_LANGUAGE uiLanguage) { + if (uiLanguage == UI_LANGUAGE.LO) { + String ttfFileName = "Phetsarath_OT.ttf"; + // create the font + setUiFont(ttfFileName); + } else if (uiLanguage == UI_LANGUAGE.MN) { + String ttfFileName = "arhangai.ttf"; + // create the font + setUiFont(ttfFileName); + } else { + CollectEarthUtils.setUiFont(new javax.swing.plaf.FontUIResource("Arial Unicode MS", Font.PLAIN, 12)); + } + } + + public static void setUiFont(String ttfFileName) { + try { + // create the font to use. Specify the size! + InputStream fontStream = CollectEarthUtils.class.getResourceAsStream(ttfFileName); + Font laoFont = Font.createFont(Font.TRUETYPE_FONT, fontStream).deriveFont(12f); + GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); + // register the font + ge.registerFont(laoFont); + CollectEarthUtils.setUiFont(new javax.swing.plaf.FontUIResource(laoFont.getFontName(), Font.PLAIN, 12)); + } catch (IOException | FontFormatException e) { + logger.error("error setting the font " + ttfFileName, e); + } + + } + + private static void setUiFont(javax.swing.plaf.FontUIResource f) { + Enumeration keys = UIManager.getDefaults().keys(); + while (keys.hasMoreElements()) { + Object key = keys.nextElement(); + Object value = UIManager.get(key); + if (value instanceof javax.swing.plaf.FontUIResource) + UIManager.put(key, f); + } + } + + public static ZipFile addFileToZip(String pathToDestinationZip, File fileToAdd, String fileNameInZip) throws IOException { + File destinationZip = new File(pathToDestinationZip); + return addFileToZip(destinationZip, fileToAdd, fileNameInZip); } + public static ZipFile addFileToZip(File destinationZip, File fileToAdd, String fileNameInZip) throws IOException { + try( ZipFile zipFile = new ZipFile(destinationZip) ){ + ZipParameters zipParameters = new ZipParameters(); + // COMP_DEFLATE is for compression + zipParameters.setCompressionMethod(CompressionMethod.DEFLATE); + // DEFLATE_LEVEL_ULTRA = maximum compression + zipParameters.setCompressionLevel(CompressionLevel.ULTRA); + zipParameters.setFileNameInZip(fileNameInZip); + zipFile.addFile(fileToAdd, zipParameters); + return zipFile; + }catch(Exception e) { + logger.error("Error adding file to ZIP", e); + return null; + } + } + + public static String getComputerIp() { + try { + return InetAddress.getLocalHost().getHostAddress(); + } catch (final UnknownHostException e) { + logger.warn("Unknown IP address", e); //$NON-NLS-1$ + return Messages.getString("OptionWizard.11"); //$NON-NLS-1$ + } + } + + public static void addFolderToZip(ZipFile zipFile, File folderToCompress) throws ZipException { + ZipParameters zipParameters = new ZipParameters(); + // COMP_DEFLATE is for compression + zipParameters.setCompressionMethod(CompressionMethod.DEFLATE); + // DEFLATE_LEVEL_ULTRA = maximum compression + zipParameters.setCompressionLevel(CompressionLevel.ULTRA); + + if (folderToCompress.exists() && folderToCompress.isDirectory()) { + zipFile.addFolder(folderToCompress, zipParameters); + } + } + + public static void openFolderInExplorer(String folder) throws IOException { + if (Desktop.isDesktopSupported()) { + Desktop.getDesktop().open(new File(folder)); + } else { + if (SystemUtils.IS_OS_WINDOWS) { + new ProcessBuilder("explorer.exe", "/open," + folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } else if (SystemUtils.IS_OS_MAC) { + new ProcessBuilder("usr/bin/open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } else if (SystemUtils.IS_OS_UNIX) { + tryUnixFileExplorers(folder); + } + } + } + + public static void tryUnixFileExplorers(String folder) throws IOException { + try { + new ProcessBuilder("nautilus", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (IOException e1) { + try { + new ProcessBuilder("gnome-open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (IOException e2) { + try { + new ProcessBuilder("kde-open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (IOException e3) { + new ProcessBuilder("caja", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + } + } + + public static boolean openFile(File fileToOpenWithOSViewer) { + boolean success = false; + if (Desktop.isDesktopSupported()) { + try { + Desktop.getDesktop().open(fileToOpenWithOSViewer); + success = true; + } catch (IOException ex) { + logger.warn("No application registered to open file {}", fileToOpenWithOSViewer.getAbsolutePath()); //$NON-NLS-1$ + } + } + return success; + } + + public static String testPostgreSQLConnection(String host, String port, String dbName, String username, + String password) { + String message = "Connection OK!"; + try { + Driver postgresDriver = new Driver(); + DriverManager.registerDriver(postgresDriver, null); + String url = "jdbc:postgresql://" + host + ":" + port + "/" + dbName; + try( Connection conn = DriverManager.getConnection(url, username, password) ){ + logger.debug("PostgreSQL Connection is valid! {}", conn.isValid(10) );// 10 sec + } + } catch (Exception e) { + logger.error("Error connecting to DB while testing", e); + message = e.getMessage(); + } + return message; + } + } From c2d744cd0bcab601c6d3f0b184e9d1cccbd35a87 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:18 +0100 Subject: [PATCH 0049/1620] New translations AluToolUtils.java (French) --- .../earth/app/view/Messages_fr.properties | 90 +++++++++++++++++-- 1 file changed, 84 insertions(+), 6 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index c36b2d4338..268889968b 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,13 +1,91 @@ package org.openforis.collect.earth.app.ad_hoc; -import org.springframework.stereotype.Component; +import java.util.HashMap; +import java.util.Map; -@Component -public class FixCoordinatesMongolia extends FixCoordinates { +import org.apache.commons.lang3.StringUtils; - @Override - protected int getLongitudeLimit() { - return 87; + + + +public class AluToolUtils { + + + /** + * Returns the climate zone code according to the ALU tool rules + * @param elevation The elevation at the plot center point in meters + * @param precipitation The precipitation in mm per year + * @param shortDrySeason If the dry season is shorter or equal to 5 months (true) or not + * @return The climate zone according to the ALU tool documentation + */ + public String getClimateZone( int elevation, int precipitation, boolean shortDrySeason ){ + + String climateName = null; + + if( elevation < 1000 && precipitation < 1000 ){ // Tropical Dry + climateName = "TRD"; //$NON-NLS-1$ + }else if( elevation < 1000 && ( precipitation >= 1000 && precipitation < 2000) && !shortDrySeason ){ // Tropical Moist, Long Dry Season + climateName = "TMLD"; //$NON-NLS-1$ + }else if( elevation < 1000 && ( precipitation >= 1000 && precipitation < 2000) && shortDrySeason ){ // Tropical Moist, Short Dry Season + climateName = "TMSD"; //$NON-NLS-1$ + }else if( elevation >= 1000 && precipitation < 1000 ){ // Tropical Montane Dry + climateName = "TRMD"; //$NON-NLS-1$ + }else if( elevation >= 1000 && precipitation >= 1000 ){ // Tropical Montane Moist + climateName = "TRMM"; //$NON-NLS-1$ + }else if( elevation < 1000 && precipitation >= 2000 ){ // Tropical Wet + climateName = "TRW"; //$NON-NLS-1$ + } + + return climateName; + } + + public String getSoilType( String initialSoilGroup ){ + + if( StringUtils.isBlank(initialSoilGroup) ){ + return "N/A"; //$NON-NLS-1$ + } + + Map fundamentalToSoilGroup = new HashMap<>(); + + fundamentalToSoilGroup.put("B", "HAC"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("L", "HAC"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("P", "VOL"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("V", "VOL"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("S", "SAN"); // SAN+POD //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("Z", "LAC"); // LAc+HAC //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("T", "SAN"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("A", "LAC"); // LAC+WET //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("C", "LAC"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("G", "LAC"); // LAC+HAC //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("W", "ORG"); // ORG+WET //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("M", "WET"); //$NON-NLS-1$ //$NON-NLS-2$ + + return fundamentalToSoilGroup.get(initialSoilGroup); + } + + + public String getAluSubclass( String collectEarthSubclass ){ + if( StringUtils.isBlank(collectEarthSubclass) ){ + return "N/A"; //$NON-NLS-1$ + } + String aluSubClass = collectEarthSubclass.replace("to", ""); //$NON-NLS-1$ //$NON-NLS-2$ + aluSubClass = aluSubClass.replace("L", ""); //$NON-NLS-1$ //$NON-NLS-2$ + aluSubClass = aluSubClass.replace("T", ""); //$NON-NLS-1$ //$NON-NLS-2$ + return aluSubClass; + } + + /** + * Returns the lower bracket of the precipitation range + * @param precipitationRange expects values like "0-100" or "2000-2100" + * @return the lowest bracket of the range. So for "0-100" it would return 0 + */ + public Integer getPrecipitationFromRange(String precipitationRange){ + String lowerBracket = precipitationRange.substring(0, precipitationRange.indexOf('-')).trim(); + if( lowerBracket.length() > 0 ){ + return Integer.parseInt(lowerBracket); + }else{ + return -1; + } } } From 65e504bc704edb6a1c70200830f53dfec96dc02f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:19 +0100 Subject: [PATCH 0050/1620] New translations AluToolUtils.java (Spanish) --- .../earth/app/view/Messages_es.properties | 265 +++++------------- 1 file changed, 74 insertions(+), 191 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 8fa17ec627..268889968b 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,208 +1,91 @@ -package org.openforis.collect.earth.app; +package org.openforis.collect.earth.app.ad_hoc; -import java.awt.Desktop; -import java.awt.Font; -import java.awt.FontFormatException; -import java.awt.GraphicsEnvironment; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.sql.Connection; -import java.sql.DriverManager; -import java.util.Enumeration; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; +import java.util.HashMap; +import java.util.Map; -import javax.swing.UIManager; +import org.apache.commons.lang3.StringUtils; -import org.apache.commons.codec.digest.DigestUtils; -import org.apache.commons.lang3.SystemUtils; -import org.openforis.collect.earth.app.EarthConstants.UI_LANGUAGE; -import org.openforis.collect.earth.app.view.Messages; -import org.postgresql.Driver; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import net.lingala.zip4j.ZipFile; -import net.lingala.zip4j.exception.ZipException; -import net.lingala.zip4j.model.ZipParameters; -import net.lingala.zip4j.model.enums.CompressionLevel; -import net.lingala.zip4j.model.enums.CompressionMethod; -public class CollectEarthUtils { - private static final Logger logger = LoggerFactory.getLogger(CollectEarthUtils.class); - - private CollectEarthUtils() { - } - - public static String getMd5FromFolder(File folder) throws IOException { - - if (!folder.isDirectory()) { - throw new IllegalArgumentException("The file passed as an argument needs to be a folder!"); - } - StringBuilder md5Hex = new StringBuilder(); - - try( Stream paths = Files.walk(Paths.get(folder.toURI()), 3); ) { - List listFiles = paths.filter(Files::isRegularFile).map(Path::toFile) - .collect(Collectors.toList()); - for (File file : listFiles) { - md5Hex.append(DigestUtils.md5Hex(new FileInputStream(file))); - } - return DigestUtils.md5Hex(md5Hex.toString().getBytes()); - } - } - - public static String getMd5FromFile(String filePath) throws IOException { - return DigestUtils.md5Hex(new FileInputStream(new File(filePath))); - } - - public static void setFontDependingOnLanguaue(UI_LANGUAGE uiLanguage) { - if (uiLanguage == UI_LANGUAGE.LO) { - String ttfFileName = "Phetsarath_OT.ttf"; - // create the font - setUiFont(ttfFileName); - } else if (uiLanguage == UI_LANGUAGE.MN) { - String ttfFileName = "arhangai.ttf"; - // create the font - setUiFont(ttfFileName); - } else { - CollectEarthUtils.setUiFont(new javax.swing.plaf.FontUIResource("Arial Unicode MS", Font.PLAIN, 12)); - } - } - - public static void setUiFont(String ttfFileName) { - try { - // create the font to use. Specify the size! - InputStream fontStream = CollectEarthUtils.class.getResourceAsStream(ttfFileName); - Font laoFont = Font.createFont(Font.TRUETYPE_FONT, fontStream).deriveFont(12f); - GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); - // register the font - ge.registerFont(laoFont); - CollectEarthUtils.setUiFont(new javax.swing.plaf.FontUIResource(laoFont.getFontName(), Font.PLAIN, 12)); - } catch (IOException | FontFormatException e) { - logger.error("error setting the font " + ttfFileName, e); - } - - } - - private static void setUiFont(javax.swing.plaf.FontUIResource f) { - Enumeration keys = UIManager.getDefaults().keys(); - while (keys.hasMoreElements()) { - Object key = keys.nextElement(); - Object value = UIManager.get(key); - if (value instanceof javax.swing.plaf.FontUIResource) - UIManager.put(key, f); - } - } - - public static ZipFile addFileToZip(String pathToDestinationZip, File fileToAdd, String fileNameInZip) throws IOException { - File destinationZip = new File(pathToDestinationZip); - return addFileToZip(destinationZip, fileToAdd, fileNameInZip); - } +public class AluToolUtils { - public static ZipFile addFileToZip(File destinationZip, File fileToAdd, String fileNameInZip) throws IOException { - try( ZipFile zipFile = new ZipFile(destinationZip) ){ - ZipParameters zipParameters = new ZipParameters(); - // COMP_DEFLATE is for compression - zipParameters.setCompressionMethod(CompressionMethod.DEFLATE); - // DEFLATE_LEVEL_ULTRA = maximum compression - zipParameters.setCompressionLevel(CompressionLevel.ULTRA); - zipParameters.setFileNameInZip(fileNameInZip); - zipFile.addFile(fileToAdd, zipParameters); - return zipFile; - }catch(Exception e) { - logger.error("Error adding file to ZIP", e); - return null; - } - } - - public static String getComputerIp() { - try { - return InetAddress.getLocalHost().getHostAddress(); - } catch (final UnknownHostException e) { - logger.warn("Unknown IP address", e); //$NON-NLS-1$ - return Messages.getString("OptionWizard.11"); //$NON-NLS-1$ - } - } - - public static void addFolderToZip(ZipFile zipFile, File folderToCompress) throws ZipException { - ZipParameters zipParameters = new ZipParameters(); - // COMP_DEFLATE is for compression - zipParameters.setCompressionMethod(CompressionMethod.DEFLATE); - // DEFLATE_LEVEL_ULTRA = maximum compression - zipParameters.setCompressionLevel(CompressionLevel.ULTRA); - - if (folderToCompress.exists() && folderToCompress.isDirectory()) { - zipFile.addFolder(folderToCompress, zipParameters); - } - } - - public static void openFolderInExplorer(String folder) throws IOException { - if (Desktop.isDesktopSupported()) { - Desktop.getDesktop().open(new File(folder)); - } else { - if (SystemUtils.IS_OS_WINDOWS) { - new ProcessBuilder("explorer.exe", "/open," + folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } else if (SystemUtils.IS_OS_MAC) { - new ProcessBuilder("usr/bin/open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } else if (SystemUtils.IS_OS_UNIX) { - tryUnixFileExplorers(folder); - } + + /** + * Returns the climate zone code according to the ALU tool rules + * @param elevation The elevation at the plot center point in meters + * @param precipitation The precipitation in mm per year + * @param shortDrySeason If the dry season is shorter or equal to 5 months (true) or not + * @return The climate zone according to the ALU tool documentation + */ + public String getClimateZone( int elevation, int precipitation, boolean shortDrySeason ){ + + String climateName = null; + + if( elevation < 1000 && precipitation < 1000 ){ // Tropical Dry + climateName = "TRD"; //$NON-NLS-1$ + }else if( elevation < 1000 && ( precipitation >= 1000 && precipitation < 2000) && !shortDrySeason ){ // Tropical Moist, Long Dry Season + climateName = "TMLD"; //$NON-NLS-1$ + }else if( elevation < 1000 && ( precipitation >= 1000 && precipitation < 2000) && shortDrySeason ){ // Tropical Moist, Short Dry Season + climateName = "TMSD"; //$NON-NLS-1$ + }else if( elevation >= 1000 && precipitation < 1000 ){ // Tropical Montane Dry + climateName = "TRMD"; //$NON-NLS-1$ + }else if( elevation >= 1000 && precipitation >= 1000 ){ // Tropical Montane Moist + climateName = "TRMM"; //$NON-NLS-1$ + }else if( elevation < 1000 && precipitation >= 2000 ){ // Tropical Wet + climateName = "TRW"; //$NON-NLS-1$ } + + return climateName; } - - public static void tryUnixFileExplorers(String folder) throws IOException { - try { - new ProcessBuilder("nautilus", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (IOException e1) { - try { - new ProcessBuilder("gnome-open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (IOException e2) { - try { - new ProcessBuilder("kde-open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (IOException e3) { - new ProcessBuilder("caja", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } - } + + public String getSoilType( String initialSoilGroup ){ + + if( StringUtils.isBlank(initialSoilGroup) ){ + return "N/A"; //$NON-NLS-1$ } + + Map fundamentalToSoilGroup = new HashMap<>(); + + fundamentalToSoilGroup.put("B", "HAC"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("L", "HAC"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("P", "VOL"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("V", "VOL"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("S", "SAN"); // SAN+POD //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("Z", "LAC"); // LAc+HAC //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("T", "SAN"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("A", "LAC"); // LAC+WET //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("C", "LAC"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("G", "LAC"); // LAC+HAC //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("W", "ORG"); // ORG+WET //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("M", "WET"); //$NON-NLS-1$ //$NON-NLS-2$ + + return fundamentalToSoilGroup.get(initialSoilGroup); } - - public static boolean openFile(File fileToOpenWithOSViewer) { - boolean success = false; - if (Desktop.isDesktopSupported()) { - try { - Desktop.getDesktop().open(fileToOpenWithOSViewer); - success = true; - } catch (IOException ex) { - logger.warn("No application registered to open file {}", fileToOpenWithOSViewer.getAbsolutePath()); //$NON-NLS-1$ - } + + + public String getAluSubclass( String collectEarthSubclass ){ + if( StringUtils.isBlank(collectEarthSubclass) ){ + return "N/A"; //$NON-NLS-1$ } - return success; + String aluSubClass = collectEarthSubclass.replace("to", ""); //$NON-NLS-1$ //$NON-NLS-2$ + aluSubClass = aluSubClass.replace("L", ""); //$NON-NLS-1$ //$NON-NLS-2$ + aluSubClass = aluSubClass.replace("T", ""); //$NON-NLS-1$ //$NON-NLS-2$ + return aluSubClass; } - - public static String testPostgreSQLConnection(String host, String port, String dbName, String username, - String password) { - String message = "Connection OK!"; - try { - Driver postgresDriver = new Driver(); - DriverManager.registerDriver(postgresDriver, null); - String url = "jdbc:postgresql://" + host + ":" + port + "/" + dbName; - try( Connection conn = DriverManager.getConnection(url, username, password) ){ - logger.debug("PostgreSQL Connection is valid! {}", conn.isValid(10) );// 10 sec - } - } catch (Exception e) { - logger.error("Error connecting to DB while testing", e); - message = e.getMessage(); + + /** + * Returns the lower bracket of the precipitation range + * @param precipitationRange expects values like "0-100" or "2000-2100" + * @return the lowest bracket of the range. So for "0-100" it would return 0 + */ + public Integer getPrecipitationFromRange(String precipitationRange){ + String lowerBracket = precipitationRange.substring(0, precipitationRange.indexOf('-')).trim(); + if( lowerBracket.length() > 0 ){ + return Integer.parseInt(lowerBracket); + }else{ + return -1; } - return message; } } From ad14ee9982816a0b5c8da9aec7c6ff02e1e37eec Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:20 +0100 Subject: [PATCH 0051/1620] New translations AluToolUtils.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 265 +++++------------- 1 file changed, 74 insertions(+), 191 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 8fa17ec627..268889968b 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,208 +1,91 @@ -package org.openforis.collect.earth.app; +package org.openforis.collect.earth.app.ad_hoc; -import java.awt.Desktop; -import java.awt.Font; -import java.awt.FontFormatException; -import java.awt.GraphicsEnvironment; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.sql.Connection; -import java.sql.DriverManager; -import java.util.Enumeration; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; +import java.util.HashMap; +import java.util.Map; -import javax.swing.UIManager; +import org.apache.commons.lang3.StringUtils; -import org.apache.commons.codec.digest.DigestUtils; -import org.apache.commons.lang3.SystemUtils; -import org.openforis.collect.earth.app.EarthConstants.UI_LANGUAGE; -import org.openforis.collect.earth.app.view.Messages; -import org.postgresql.Driver; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import net.lingala.zip4j.ZipFile; -import net.lingala.zip4j.exception.ZipException; -import net.lingala.zip4j.model.ZipParameters; -import net.lingala.zip4j.model.enums.CompressionLevel; -import net.lingala.zip4j.model.enums.CompressionMethod; -public class CollectEarthUtils { - private static final Logger logger = LoggerFactory.getLogger(CollectEarthUtils.class); - - private CollectEarthUtils() { - } - - public static String getMd5FromFolder(File folder) throws IOException { - - if (!folder.isDirectory()) { - throw new IllegalArgumentException("The file passed as an argument needs to be a folder!"); - } - StringBuilder md5Hex = new StringBuilder(); - - try( Stream paths = Files.walk(Paths.get(folder.toURI()), 3); ) { - List listFiles = paths.filter(Files::isRegularFile).map(Path::toFile) - .collect(Collectors.toList()); - for (File file : listFiles) { - md5Hex.append(DigestUtils.md5Hex(new FileInputStream(file))); - } - return DigestUtils.md5Hex(md5Hex.toString().getBytes()); - } - } - - public static String getMd5FromFile(String filePath) throws IOException { - return DigestUtils.md5Hex(new FileInputStream(new File(filePath))); - } - - public static void setFontDependingOnLanguaue(UI_LANGUAGE uiLanguage) { - if (uiLanguage == UI_LANGUAGE.LO) { - String ttfFileName = "Phetsarath_OT.ttf"; - // create the font - setUiFont(ttfFileName); - } else if (uiLanguage == UI_LANGUAGE.MN) { - String ttfFileName = "arhangai.ttf"; - // create the font - setUiFont(ttfFileName); - } else { - CollectEarthUtils.setUiFont(new javax.swing.plaf.FontUIResource("Arial Unicode MS", Font.PLAIN, 12)); - } - } - - public static void setUiFont(String ttfFileName) { - try { - // create the font to use. Specify the size! - InputStream fontStream = CollectEarthUtils.class.getResourceAsStream(ttfFileName); - Font laoFont = Font.createFont(Font.TRUETYPE_FONT, fontStream).deriveFont(12f); - GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); - // register the font - ge.registerFont(laoFont); - CollectEarthUtils.setUiFont(new javax.swing.plaf.FontUIResource(laoFont.getFontName(), Font.PLAIN, 12)); - } catch (IOException | FontFormatException e) { - logger.error("error setting the font " + ttfFileName, e); - } - - } - - private static void setUiFont(javax.swing.plaf.FontUIResource f) { - Enumeration keys = UIManager.getDefaults().keys(); - while (keys.hasMoreElements()) { - Object key = keys.nextElement(); - Object value = UIManager.get(key); - if (value instanceof javax.swing.plaf.FontUIResource) - UIManager.put(key, f); - } - } - - public static ZipFile addFileToZip(String pathToDestinationZip, File fileToAdd, String fileNameInZip) throws IOException { - File destinationZip = new File(pathToDestinationZip); - return addFileToZip(destinationZip, fileToAdd, fileNameInZip); - } +public class AluToolUtils { - public static ZipFile addFileToZip(File destinationZip, File fileToAdd, String fileNameInZip) throws IOException { - try( ZipFile zipFile = new ZipFile(destinationZip) ){ - ZipParameters zipParameters = new ZipParameters(); - // COMP_DEFLATE is for compression - zipParameters.setCompressionMethod(CompressionMethod.DEFLATE); - // DEFLATE_LEVEL_ULTRA = maximum compression - zipParameters.setCompressionLevel(CompressionLevel.ULTRA); - zipParameters.setFileNameInZip(fileNameInZip); - zipFile.addFile(fileToAdd, zipParameters); - return zipFile; - }catch(Exception e) { - logger.error("Error adding file to ZIP", e); - return null; - } - } - - public static String getComputerIp() { - try { - return InetAddress.getLocalHost().getHostAddress(); - } catch (final UnknownHostException e) { - logger.warn("Unknown IP address", e); //$NON-NLS-1$ - return Messages.getString("OptionWizard.11"); //$NON-NLS-1$ - } - } - - public static void addFolderToZip(ZipFile zipFile, File folderToCompress) throws ZipException { - ZipParameters zipParameters = new ZipParameters(); - // COMP_DEFLATE is for compression - zipParameters.setCompressionMethod(CompressionMethod.DEFLATE); - // DEFLATE_LEVEL_ULTRA = maximum compression - zipParameters.setCompressionLevel(CompressionLevel.ULTRA); - - if (folderToCompress.exists() && folderToCompress.isDirectory()) { - zipFile.addFolder(folderToCompress, zipParameters); - } - } - - public static void openFolderInExplorer(String folder) throws IOException { - if (Desktop.isDesktopSupported()) { - Desktop.getDesktop().open(new File(folder)); - } else { - if (SystemUtils.IS_OS_WINDOWS) { - new ProcessBuilder("explorer.exe", "/open," + folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } else if (SystemUtils.IS_OS_MAC) { - new ProcessBuilder("usr/bin/open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } else if (SystemUtils.IS_OS_UNIX) { - tryUnixFileExplorers(folder); - } + + /** + * Returns the climate zone code according to the ALU tool rules + * @param elevation The elevation at the plot center point in meters + * @param precipitation The precipitation in mm per year + * @param shortDrySeason If the dry season is shorter or equal to 5 months (true) or not + * @return The climate zone according to the ALU tool documentation + */ + public String getClimateZone( int elevation, int precipitation, boolean shortDrySeason ){ + + String climateName = null; + + if( elevation < 1000 && precipitation < 1000 ){ // Tropical Dry + climateName = "TRD"; //$NON-NLS-1$ + }else if( elevation < 1000 && ( precipitation >= 1000 && precipitation < 2000) && !shortDrySeason ){ // Tropical Moist, Long Dry Season + climateName = "TMLD"; //$NON-NLS-1$ + }else if( elevation < 1000 && ( precipitation >= 1000 && precipitation < 2000) && shortDrySeason ){ // Tropical Moist, Short Dry Season + climateName = "TMSD"; //$NON-NLS-1$ + }else if( elevation >= 1000 && precipitation < 1000 ){ // Tropical Montane Dry + climateName = "TRMD"; //$NON-NLS-1$ + }else if( elevation >= 1000 && precipitation >= 1000 ){ // Tropical Montane Moist + climateName = "TRMM"; //$NON-NLS-1$ + }else if( elevation < 1000 && precipitation >= 2000 ){ // Tropical Wet + climateName = "TRW"; //$NON-NLS-1$ } + + return climateName; } - - public static void tryUnixFileExplorers(String folder) throws IOException { - try { - new ProcessBuilder("nautilus", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (IOException e1) { - try { - new ProcessBuilder("gnome-open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (IOException e2) { - try { - new ProcessBuilder("kde-open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (IOException e3) { - new ProcessBuilder("caja", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } - } + + public String getSoilType( String initialSoilGroup ){ + + if( StringUtils.isBlank(initialSoilGroup) ){ + return "N/A"; //$NON-NLS-1$ } + + Map fundamentalToSoilGroup = new HashMap<>(); + + fundamentalToSoilGroup.put("B", "HAC"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("L", "HAC"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("P", "VOL"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("V", "VOL"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("S", "SAN"); // SAN+POD //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("Z", "LAC"); // LAc+HAC //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("T", "SAN"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("A", "LAC"); // LAC+WET //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("C", "LAC"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("G", "LAC"); // LAC+HAC //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("W", "ORG"); // ORG+WET //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("M", "WET"); //$NON-NLS-1$ //$NON-NLS-2$ + + return fundamentalToSoilGroup.get(initialSoilGroup); } - - public static boolean openFile(File fileToOpenWithOSViewer) { - boolean success = false; - if (Desktop.isDesktopSupported()) { - try { - Desktop.getDesktop().open(fileToOpenWithOSViewer); - success = true; - } catch (IOException ex) { - logger.warn("No application registered to open file {}", fileToOpenWithOSViewer.getAbsolutePath()); //$NON-NLS-1$ - } + + + public String getAluSubclass( String collectEarthSubclass ){ + if( StringUtils.isBlank(collectEarthSubclass) ){ + return "N/A"; //$NON-NLS-1$ } - return success; + String aluSubClass = collectEarthSubclass.replace("to", ""); //$NON-NLS-1$ //$NON-NLS-2$ + aluSubClass = aluSubClass.replace("L", ""); //$NON-NLS-1$ //$NON-NLS-2$ + aluSubClass = aluSubClass.replace("T", ""); //$NON-NLS-1$ //$NON-NLS-2$ + return aluSubClass; } - - public static String testPostgreSQLConnection(String host, String port, String dbName, String username, - String password) { - String message = "Connection OK!"; - try { - Driver postgresDriver = new Driver(); - DriverManager.registerDriver(postgresDriver, null); - String url = "jdbc:postgresql://" + host + ":" + port + "/" + dbName; - try( Connection conn = DriverManager.getConnection(url, username, password) ){ - logger.debug("PostgreSQL Connection is valid! {}", conn.isValid(10) );// 10 sec - } - } catch (Exception e) { - logger.error("Error connecting to DB while testing", e); - message = e.getMessage(); + + /** + * Returns the lower bracket of the precipitation range + * @param precipitationRange expects values like "0-100" or "2000-2100" + * @return the lowest bracket of the range. So for "0-100" it would return 0 + */ + public Integer getPrecipitationFromRange(String precipitationRange){ + String lowerBracket = precipitationRange.substring(0, precipitationRange.indexOf('-')).trim(); + if( lowerBracket.length() > 0 ){ + return Integer.parseInt(lowerBracket); + }else{ + return -1; } - return message; } } From eecc23648ec6a53dc7e7fc956ffc381ad11948ab Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:21 +0100 Subject: [PATCH 0052/1620] New translations AluToolUtils.java (English) --- .../earth/app/view/Messages_en.properties | 265 +++++------------- 1 file changed, 74 insertions(+), 191 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 8fa17ec627..268889968b 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,208 +1,91 @@ -package org.openforis.collect.earth.app; +package org.openforis.collect.earth.app.ad_hoc; -import java.awt.Desktop; -import java.awt.Font; -import java.awt.FontFormatException; -import java.awt.GraphicsEnvironment; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.sql.Connection; -import java.sql.DriverManager; -import java.util.Enumeration; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; +import java.util.HashMap; +import java.util.Map; -import javax.swing.UIManager; +import org.apache.commons.lang3.StringUtils; -import org.apache.commons.codec.digest.DigestUtils; -import org.apache.commons.lang3.SystemUtils; -import org.openforis.collect.earth.app.EarthConstants.UI_LANGUAGE; -import org.openforis.collect.earth.app.view.Messages; -import org.postgresql.Driver; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import net.lingala.zip4j.ZipFile; -import net.lingala.zip4j.exception.ZipException; -import net.lingala.zip4j.model.ZipParameters; -import net.lingala.zip4j.model.enums.CompressionLevel; -import net.lingala.zip4j.model.enums.CompressionMethod; -public class CollectEarthUtils { - private static final Logger logger = LoggerFactory.getLogger(CollectEarthUtils.class); - - private CollectEarthUtils() { - } - - public static String getMd5FromFolder(File folder) throws IOException { - - if (!folder.isDirectory()) { - throw new IllegalArgumentException("The file passed as an argument needs to be a folder!"); - } - StringBuilder md5Hex = new StringBuilder(); - - try( Stream paths = Files.walk(Paths.get(folder.toURI()), 3); ) { - List listFiles = paths.filter(Files::isRegularFile).map(Path::toFile) - .collect(Collectors.toList()); - for (File file : listFiles) { - md5Hex.append(DigestUtils.md5Hex(new FileInputStream(file))); - } - return DigestUtils.md5Hex(md5Hex.toString().getBytes()); - } - } - - public static String getMd5FromFile(String filePath) throws IOException { - return DigestUtils.md5Hex(new FileInputStream(new File(filePath))); - } - - public static void setFontDependingOnLanguaue(UI_LANGUAGE uiLanguage) { - if (uiLanguage == UI_LANGUAGE.LO) { - String ttfFileName = "Phetsarath_OT.ttf"; - // create the font - setUiFont(ttfFileName); - } else if (uiLanguage == UI_LANGUAGE.MN) { - String ttfFileName = "arhangai.ttf"; - // create the font - setUiFont(ttfFileName); - } else { - CollectEarthUtils.setUiFont(new javax.swing.plaf.FontUIResource("Arial Unicode MS", Font.PLAIN, 12)); - } - } - - public static void setUiFont(String ttfFileName) { - try { - // create the font to use. Specify the size! - InputStream fontStream = CollectEarthUtils.class.getResourceAsStream(ttfFileName); - Font laoFont = Font.createFont(Font.TRUETYPE_FONT, fontStream).deriveFont(12f); - GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); - // register the font - ge.registerFont(laoFont); - CollectEarthUtils.setUiFont(new javax.swing.plaf.FontUIResource(laoFont.getFontName(), Font.PLAIN, 12)); - } catch (IOException | FontFormatException e) { - logger.error("error setting the font " + ttfFileName, e); - } - - } - - private static void setUiFont(javax.swing.plaf.FontUIResource f) { - Enumeration keys = UIManager.getDefaults().keys(); - while (keys.hasMoreElements()) { - Object key = keys.nextElement(); - Object value = UIManager.get(key); - if (value instanceof javax.swing.plaf.FontUIResource) - UIManager.put(key, f); - } - } - - public static ZipFile addFileToZip(String pathToDestinationZip, File fileToAdd, String fileNameInZip) throws IOException { - File destinationZip = new File(pathToDestinationZip); - return addFileToZip(destinationZip, fileToAdd, fileNameInZip); - } +public class AluToolUtils { - public static ZipFile addFileToZip(File destinationZip, File fileToAdd, String fileNameInZip) throws IOException { - try( ZipFile zipFile = new ZipFile(destinationZip) ){ - ZipParameters zipParameters = new ZipParameters(); - // COMP_DEFLATE is for compression - zipParameters.setCompressionMethod(CompressionMethod.DEFLATE); - // DEFLATE_LEVEL_ULTRA = maximum compression - zipParameters.setCompressionLevel(CompressionLevel.ULTRA); - zipParameters.setFileNameInZip(fileNameInZip); - zipFile.addFile(fileToAdd, zipParameters); - return zipFile; - }catch(Exception e) { - logger.error("Error adding file to ZIP", e); - return null; - } - } - - public static String getComputerIp() { - try { - return InetAddress.getLocalHost().getHostAddress(); - } catch (final UnknownHostException e) { - logger.warn("Unknown IP address", e); //$NON-NLS-1$ - return Messages.getString("OptionWizard.11"); //$NON-NLS-1$ - } - } - - public static void addFolderToZip(ZipFile zipFile, File folderToCompress) throws ZipException { - ZipParameters zipParameters = new ZipParameters(); - // COMP_DEFLATE is for compression - zipParameters.setCompressionMethod(CompressionMethod.DEFLATE); - // DEFLATE_LEVEL_ULTRA = maximum compression - zipParameters.setCompressionLevel(CompressionLevel.ULTRA); - - if (folderToCompress.exists() && folderToCompress.isDirectory()) { - zipFile.addFolder(folderToCompress, zipParameters); - } - } - - public static void openFolderInExplorer(String folder) throws IOException { - if (Desktop.isDesktopSupported()) { - Desktop.getDesktop().open(new File(folder)); - } else { - if (SystemUtils.IS_OS_WINDOWS) { - new ProcessBuilder("explorer.exe", "/open," + folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } else if (SystemUtils.IS_OS_MAC) { - new ProcessBuilder("usr/bin/open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } else if (SystemUtils.IS_OS_UNIX) { - tryUnixFileExplorers(folder); - } + + /** + * Returns the climate zone code according to the ALU tool rules + * @param elevation The elevation at the plot center point in meters + * @param precipitation The precipitation in mm per year + * @param shortDrySeason If the dry season is shorter or equal to 5 months (true) or not + * @return The climate zone according to the ALU tool documentation + */ + public String getClimateZone( int elevation, int precipitation, boolean shortDrySeason ){ + + String climateName = null; + + if( elevation < 1000 && precipitation < 1000 ){ // Tropical Dry + climateName = "TRD"; //$NON-NLS-1$ + }else if( elevation < 1000 && ( precipitation >= 1000 && precipitation < 2000) && !shortDrySeason ){ // Tropical Moist, Long Dry Season + climateName = "TMLD"; //$NON-NLS-1$ + }else if( elevation < 1000 && ( precipitation >= 1000 && precipitation < 2000) && shortDrySeason ){ // Tropical Moist, Short Dry Season + climateName = "TMSD"; //$NON-NLS-1$ + }else if( elevation >= 1000 && precipitation < 1000 ){ // Tropical Montane Dry + climateName = "TRMD"; //$NON-NLS-1$ + }else if( elevation >= 1000 && precipitation >= 1000 ){ // Tropical Montane Moist + climateName = "TRMM"; //$NON-NLS-1$ + }else if( elevation < 1000 && precipitation >= 2000 ){ // Tropical Wet + climateName = "TRW"; //$NON-NLS-1$ } + + return climateName; } - - public static void tryUnixFileExplorers(String folder) throws IOException { - try { - new ProcessBuilder("nautilus", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (IOException e1) { - try { - new ProcessBuilder("gnome-open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (IOException e2) { - try { - new ProcessBuilder("kde-open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (IOException e3) { - new ProcessBuilder("caja", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } - } + + public String getSoilType( String initialSoilGroup ){ + + if( StringUtils.isBlank(initialSoilGroup) ){ + return "N/A"; //$NON-NLS-1$ } + + Map fundamentalToSoilGroup = new HashMap<>(); + + fundamentalToSoilGroup.put("B", "HAC"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("L", "HAC"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("P", "VOL"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("V", "VOL"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("S", "SAN"); // SAN+POD //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("Z", "LAC"); // LAc+HAC //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("T", "SAN"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("A", "LAC"); // LAC+WET //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("C", "LAC"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("G", "LAC"); // LAC+HAC //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("W", "ORG"); // ORG+WET //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("M", "WET"); //$NON-NLS-1$ //$NON-NLS-2$ + + return fundamentalToSoilGroup.get(initialSoilGroup); } - - public static boolean openFile(File fileToOpenWithOSViewer) { - boolean success = false; - if (Desktop.isDesktopSupported()) { - try { - Desktop.getDesktop().open(fileToOpenWithOSViewer); - success = true; - } catch (IOException ex) { - logger.warn("No application registered to open file {}", fileToOpenWithOSViewer.getAbsolutePath()); //$NON-NLS-1$ - } + + + public String getAluSubclass( String collectEarthSubclass ){ + if( StringUtils.isBlank(collectEarthSubclass) ){ + return "N/A"; //$NON-NLS-1$ } - return success; + String aluSubClass = collectEarthSubclass.replace("to", ""); //$NON-NLS-1$ //$NON-NLS-2$ + aluSubClass = aluSubClass.replace("L", ""); //$NON-NLS-1$ //$NON-NLS-2$ + aluSubClass = aluSubClass.replace("T", ""); //$NON-NLS-1$ //$NON-NLS-2$ + return aluSubClass; } - - public static String testPostgreSQLConnection(String host, String port, String dbName, String username, - String password) { - String message = "Connection OK!"; - try { - Driver postgresDriver = new Driver(); - DriverManager.registerDriver(postgresDriver, null); - String url = "jdbc:postgresql://" + host + ":" + port + "/" + dbName; - try( Connection conn = DriverManager.getConnection(url, username, password) ){ - logger.debug("PostgreSQL Connection is valid! {}", conn.isValid(10) );// 10 sec - } - } catch (Exception e) { - logger.error("Error connecting to DB while testing", e); - message = e.getMessage(); + + /** + * Returns the lower bracket of the precipitation range + * @param precipitationRange expects values like "0-100" or "2000-2100" + * @return the lowest bracket of the range. So for "0-100" it would return 0 + */ + public Integer getPrecipitationFromRange(String precipitationRange){ + String lowerBracket = precipitationRange.substring(0, precipitationRange.indexOf('-')).trim(); + if( lowerBracket.length() > 0 ){ + return Integer.parseInt(lowerBracket); + }else{ + return -1; } - return message; } } From 0ce45fc993051718f0e3a3ca4dbd6bff793cf24a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:22 +0100 Subject: [PATCH 0053/1620] New translations FixCoordinates.java (French) --- .../earth/app/view/Messages_fr.properties | 135 ++++++++---------- 1 file changed, 59 insertions(+), 76 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 268889968b..499b7cb5ec 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,91 +1,74 @@ package org.openforis.collect.earth.app.ad_hoc; -import java.util.HashMap; -import java.util.Map; +import java.util.List; -import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.manager.RecordManager; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.CollectRecordSummary; +import org.openforis.collect.model.RecordFilter; +import org.openforis.idm.model.Coordinate; +import org.openforis.idm.model.CoordinateAttribute; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +@Component +public abstract class FixCoordinates { + @Autowired + private RecordManager recordManager; + @Autowired + private EarthSurveyService earthSurveyService; -public class AluToolUtils { - - - /** - * Returns the climate zone code according to the ALU tool rules - * @param elevation The elevation at the plot center point in meters - * @param precipitation The precipitation in mm per year - * @param shortDrySeason If the dry season is shorter or equal to 5 months (true) or not - * @return The climate zone according to the ALU tool documentation - */ - public String getClimateZone( int elevation, int precipitation, boolean shortDrySeason ){ - - String climateName = null; - - if( elevation < 1000 && precipitation < 1000 ){ // Tropical Dry - climateName = "TRD"; //$NON-NLS-1$ - }else if( elevation < 1000 && ( precipitation >= 1000 && precipitation < 2000) && !shortDrySeason ){ // Tropical Moist, Long Dry Season - climateName = "TMLD"; //$NON-NLS-1$ - }else if( elevation < 1000 && ( precipitation >= 1000 && precipitation < 2000) && shortDrySeason ){ // Tropical Moist, Short Dry Season - climateName = "TMSD"; //$NON-NLS-1$ - }else if( elevation >= 1000 && precipitation < 1000 ){ // Tropical Montane Dry - climateName = "TRMD"; //$NON-NLS-1$ - }else if( elevation >= 1000 && precipitation >= 1000 ){ // Tropical Montane Moist - climateName = "TRMM"; //$NON-NLS-1$ - }else if( elevation < 1000 && precipitation >= 2000 ){ // Tropical Wet - climateName = "TRW"; //$NON-NLS-1$ - } - - return climateName; + private Logger logger = LoggerFactory.getLogger( FixCoordinates.class); + + private boolean stopFix = false; + + private List getAllRecords(){ + RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); + return recordManager.loadSummaries( rf ); } - - public String getSoilType( String initialSoilGroup ){ + + public void fixCoordinates(){ + List allRecords = getAllRecords(); - if( StringUtils.isBlank(initialSoilGroup) ){ - return "N/A"; //$NON-NLS-1$ + if( shouldStopFixing()){ + return; } - Map fundamentalToSoilGroup = new HashMap<>(); - - fundamentalToSoilGroup.put("B", "HAC"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("L", "HAC"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("P", "VOL"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("V", "VOL"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("S", "SAN"); // SAN+POD //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("Z", "LAC"); // LAc+HAC //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("T", "SAN"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("A", "LAC"); // LAC+WET //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("C", "LAC"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("G", "LAC"); // LAC+HAC //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("W", "ORG"); // ORG+WET //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("M", "WET"); //$NON-NLS-1$ //$NON-NLS-2$ - - return fundamentalToSoilGroup.get(initialSoilGroup); - } - - - public String getAluSubclass( String collectEarthSubclass ){ - if( StringUtils.isBlank(collectEarthSubclass) ){ - return "N/A"; //$NON-NLS-1$ + for (CollectRecordSummary summaryCollectRecord : allRecords) { + if( shouldStopFixing()){ + break; + } + try { + CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); + CoordinateAttribute plotCoord = (CoordinateAttribute) collectRecord.getNodeByPath("/plot/location"); //$NON-NLS-1$ + if( plotCoord != null && plotCoord.getValue() != null && plotCoord.getValue().getX() < getLongitudeLimit() ){ + Coordinate coordinate = new Coordinate(plotCoord.getValue().getY(), plotCoord.getValue().getX(), plotCoord.getValue().getSrsId() ); + plotCoord.setValue( coordinate ); + recordManager.save( collectRecord ); + } + } catch (Exception e) { + logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ + } } - String aluSubClass = collectEarthSubclass.replace("to", ""); //$NON-NLS-1$ //$NON-NLS-2$ - aluSubClass = aluSubClass.replace("L", ""); //$NON-NLS-1$ //$NON-NLS-2$ - aluSubClass = aluSubClass.replace("T", ""); //$NON-NLS-1$ //$NON-NLS-2$ - return aluSubClass; + } - - /** - * Returns the lower bracket of the precipitation range - * @param precipitationRange expects values like "0-100" or "2000-2100" - * @return the lowest bracket of the range. So for "0-100" it would return 0 - */ - public Integer getPrecipitationFromRange(String precipitationRange){ - String lowerBracket = precipitationRange.substring(0, precipitationRange.indexOf('-')).trim(); - if( lowerBracket.length() > 0 ){ - return Integer.parseInt(lowerBracket); - }else{ - return -1; - } + + protected abstract int getLongitudeLimit(); + + private boolean shouldStopFixing() { + return stopFix; + } + + public void stopFixing() { + stopFix = true; + } -} +} \ No newline at end of file From a07edd5a48315b28a03798abce07ddb31b4c4b8f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:23 +0100 Subject: [PATCH 0054/1620] New translations FixCoordinates.java (Spanish) --- .../earth/app/view/Messages_es.properties | 135 ++++++++---------- 1 file changed, 59 insertions(+), 76 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 268889968b..499b7cb5ec 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,91 +1,74 @@ package org.openforis.collect.earth.app.ad_hoc; -import java.util.HashMap; -import java.util.Map; +import java.util.List; -import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.manager.RecordManager; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.CollectRecordSummary; +import org.openforis.collect.model.RecordFilter; +import org.openforis.idm.model.Coordinate; +import org.openforis.idm.model.CoordinateAttribute; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +@Component +public abstract class FixCoordinates { + @Autowired + private RecordManager recordManager; + @Autowired + private EarthSurveyService earthSurveyService; -public class AluToolUtils { - - - /** - * Returns the climate zone code according to the ALU tool rules - * @param elevation The elevation at the plot center point in meters - * @param precipitation The precipitation in mm per year - * @param shortDrySeason If the dry season is shorter or equal to 5 months (true) or not - * @return The climate zone according to the ALU tool documentation - */ - public String getClimateZone( int elevation, int precipitation, boolean shortDrySeason ){ - - String climateName = null; - - if( elevation < 1000 && precipitation < 1000 ){ // Tropical Dry - climateName = "TRD"; //$NON-NLS-1$ - }else if( elevation < 1000 && ( precipitation >= 1000 && precipitation < 2000) && !shortDrySeason ){ // Tropical Moist, Long Dry Season - climateName = "TMLD"; //$NON-NLS-1$ - }else if( elevation < 1000 && ( precipitation >= 1000 && precipitation < 2000) && shortDrySeason ){ // Tropical Moist, Short Dry Season - climateName = "TMSD"; //$NON-NLS-1$ - }else if( elevation >= 1000 && precipitation < 1000 ){ // Tropical Montane Dry - climateName = "TRMD"; //$NON-NLS-1$ - }else if( elevation >= 1000 && precipitation >= 1000 ){ // Tropical Montane Moist - climateName = "TRMM"; //$NON-NLS-1$ - }else if( elevation < 1000 && precipitation >= 2000 ){ // Tropical Wet - climateName = "TRW"; //$NON-NLS-1$ - } - - return climateName; + private Logger logger = LoggerFactory.getLogger( FixCoordinates.class); + + private boolean stopFix = false; + + private List getAllRecords(){ + RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); + return recordManager.loadSummaries( rf ); } - - public String getSoilType( String initialSoilGroup ){ + + public void fixCoordinates(){ + List allRecords = getAllRecords(); - if( StringUtils.isBlank(initialSoilGroup) ){ - return "N/A"; //$NON-NLS-1$ + if( shouldStopFixing()){ + return; } - Map fundamentalToSoilGroup = new HashMap<>(); - - fundamentalToSoilGroup.put("B", "HAC"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("L", "HAC"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("P", "VOL"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("V", "VOL"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("S", "SAN"); // SAN+POD //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("Z", "LAC"); // LAc+HAC //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("T", "SAN"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("A", "LAC"); // LAC+WET //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("C", "LAC"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("G", "LAC"); // LAC+HAC //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("W", "ORG"); // ORG+WET //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("M", "WET"); //$NON-NLS-1$ //$NON-NLS-2$ - - return fundamentalToSoilGroup.get(initialSoilGroup); - } - - - public String getAluSubclass( String collectEarthSubclass ){ - if( StringUtils.isBlank(collectEarthSubclass) ){ - return "N/A"; //$NON-NLS-1$ + for (CollectRecordSummary summaryCollectRecord : allRecords) { + if( shouldStopFixing()){ + break; + } + try { + CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); + CoordinateAttribute plotCoord = (CoordinateAttribute) collectRecord.getNodeByPath("/plot/location"); //$NON-NLS-1$ + if( plotCoord != null && plotCoord.getValue() != null && plotCoord.getValue().getX() < getLongitudeLimit() ){ + Coordinate coordinate = new Coordinate(plotCoord.getValue().getY(), plotCoord.getValue().getX(), plotCoord.getValue().getSrsId() ); + plotCoord.setValue( coordinate ); + recordManager.save( collectRecord ); + } + } catch (Exception e) { + logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ + } } - String aluSubClass = collectEarthSubclass.replace("to", ""); //$NON-NLS-1$ //$NON-NLS-2$ - aluSubClass = aluSubClass.replace("L", ""); //$NON-NLS-1$ //$NON-NLS-2$ - aluSubClass = aluSubClass.replace("T", ""); //$NON-NLS-1$ //$NON-NLS-2$ - return aluSubClass; + } - - /** - * Returns the lower bracket of the precipitation range - * @param precipitationRange expects values like "0-100" or "2000-2100" - * @return the lowest bracket of the range. So for "0-100" it would return 0 - */ - public Integer getPrecipitationFromRange(String precipitationRange){ - String lowerBracket = precipitationRange.substring(0, precipitationRange.indexOf('-')).trim(); - if( lowerBracket.length() > 0 ){ - return Integer.parseInt(lowerBracket); - }else{ - return -1; - } + + protected abstract int getLongitudeLimit(); + + private boolean shouldStopFixing() { + return stopFix; + } + + public void stopFixing() { + stopFix = true; + } -} +} \ No newline at end of file From 03ddf81a990d83fe3fd06f220288c42f376ee78f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:24 +0100 Subject: [PATCH 0055/1620] New translations FixCoordinates.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 135 ++++++++---------- 1 file changed, 59 insertions(+), 76 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 268889968b..499b7cb5ec 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,91 +1,74 @@ package org.openforis.collect.earth.app.ad_hoc; -import java.util.HashMap; -import java.util.Map; +import java.util.List; -import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.manager.RecordManager; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.CollectRecordSummary; +import org.openforis.collect.model.RecordFilter; +import org.openforis.idm.model.Coordinate; +import org.openforis.idm.model.CoordinateAttribute; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +@Component +public abstract class FixCoordinates { + @Autowired + private RecordManager recordManager; + @Autowired + private EarthSurveyService earthSurveyService; -public class AluToolUtils { - - - /** - * Returns the climate zone code according to the ALU tool rules - * @param elevation The elevation at the plot center point in meters - * @param precipitation The precipitation in mm per year - * @param shortDrySeason If the dry season is shorter or equal to 5 months (true) or not - * @return The climate zone according to the ALU tool documentation - */ - public String getClimateZone( int elevation, int precipitation, boolean shortDrySeason ){ - - String climateName = null; - - if( elevation < 1000 && precipitation < 1000 ){ // Tropical Dry - climateName = "TRD"; //$NON-NLS-1$ - }else if( elevation < 1000 && ( precipitation >= 1000 && precipitation < 2000) && !shortDrySeason ){ // Tropical Moist, Long Dry Season - climateName = "TMLD"; //$NON-NLS-1$ - }else if( elevation < 1000 && ( precipitation >= 1000 && precipitation < 2000) && shortDrySeason ){ // Tropical Moist, Short Dry Season - climateName = "TMSD"; //$NON-NLS-1$ - }else if( elevation >= 1000 && precipitation < 1000 ){ // Tropical Montane Dry - climateName = "TRMD"; //$NON-NLS-1$ - }else if( elevation >= 1000 && precipitation >= 1000 ){ // Tropical Montane Moist - climateName = "TRMM"; //$NON-NLS-1$ - }else if( elevation < 1000 && precipitation >= 2000 ){ // Tropical Wet - climateName = "TRW"; //$NON-NLS-1$ - } - - return climateName; + private Logger logger = LoggerFactory.getLogger( FixCoordinates.class); + + private boolean stopFix = false; + + private List getAllRecords(){ + RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); + return recordManager.loadSummaries( rf ); } - - public String getSoilType( String initialSoilGroup ){ + + public void fixCoordinates(){ + List allRecords = getAllRecords(); - if( StringUtils.isBlank(initialSoilGroup) ){ - return "N/A"; //$NON-NLS-1$ + if( shouldStopFixing()){ + return; } - Map fundamentalToSoilGroup = new HashMap<>(); - - fundamentalToSoilGroup.put("B", "HAC"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("L", "HAC"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("P", "VOL"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("V", "VOL"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("S", "SAN"); // SAN+POD //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("Z", "LAC"); // LAc+HAC //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("T", "SAN"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("A", "LAC"); // LAC+WET //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("C", "LAC"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("G", "LAC"); // LAC+HAC //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("W", "ORG"); // ORG+WET //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("M", "WET"); //$NON-NLS-1$ //$NON-NLS-2$ - - return fundamentalToSoilGroup.get(initialSoilGroup); - } - - - public String getAluSubclass( String collectEarthSubclass ){ - if( StringUtils.isBlank(collectEarthSubclass) ){ - return "N/A"; //$NON-NLS-1$ + for (CollectRecordSummary summaryCollectRecord : allRecords) { + if( shouldStopFixing()){ + break; + } + try { + CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); + CoordinateAttribute plotCoord = (CoordinateAttribute) collectRecord.getNodeByPath("/plot/location"); //$NON-NLS-1$ + if( plotCoord != null && plotCoord.getValue() != null && plotCoord.getValue().getX() < getLongitudeLimit() ){ + Coordinate coordinate = new Coordinate(plotCoord.getValue().getY(), plotCoord.getValue().getX(), plotCoord.getValue().getSrsId() ); + plotCoord.setValue( coordinate ); + recordManager.save( collectRecord ); + } + } catch (Exception e) { + logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ + } } - String aluSubClass = collectEarthSubclass.replace("to", ""); //$NON-NLS-1$ //$NON-NLS-2$ - aluSubClass = aluSubClass.replace("L", ""); //$NON-NLS-1$ //$NON-NLS-2$ - aluSubClass = aluSubClass.replace("T", ""); //$NON-NLS-1$ //$NON-NLS-2$ - return aluSubClass; + } - - /** - * Returns the lower bracket of the precipitation range - * @param precipitationRange expects values like "0-100" or "2000-2100" - * @return the lowest bracket of the range. So for "0-100" it would return 0 - */ - public Integer getPrecipitationFromRange(String precipitationRange){ - String lowerBracket = precipitationRange.substring(0, precipitationRange.indexOf('-')).trim(); - if( lowerBracket.length() > 0 ){ - return Integer.parseInt(lowerBracket); - }else{ - return -1; - } + + protected abstract int getLongitudeLimit(); + + private boolean shouldStopFixing() { + return stopFix; + } + + public void stopFixing() { + stopFix = true; + } -} +} \ No newline at end of file From b2b78fe65cca76cb39220794aceb7d7952062c95 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:25 +0100 Subject: [PATCH 0056/1620] New translations FixCoordinates.java (English) --- .../earth/app/view/Messages_en.properties | 135 ++++++++---------- 1 file changed, 59 insertions(+), 76 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 268889968b..499b7cb5ec 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,91 +1,74 @@ package org.openforis.collect.earth.app.ad_hoc; -import java.util.HashMap; -import java.util.Map; +import java.util.List; -import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.manager.RecordManager; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.CollectRecordSummary; +import org.openforis.collect.model.RecordFilter; +import org.openforis.idm.model.Coordinate; +import org.openforis.idm.model.CoordinateAttribute; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +@Component +public abstract class FixCoordinates { + @Autowired + private RecordManager recordManager; + @Autowired + private EarthSurveyService earthSurveyService; -public class AluToolUtils { - - - /** - * Returns the climate zone code according to the ALU tool rules - * @param elevation The elevation at the plot center point in meters - * @param precipitation The precipitation in mm per year - * @param shortDrySeason If the dry season is shorter or equal to 5 months (true) or not - * @return The climate zone according to the ALU tool documentation - */ - public String getClimateZone( int elevation, int precipitation, boolean shortDrySeason ){ - - String climateName = null; - - if( elevation < 1000 && precipitation < 1000 ){ // Tropical Dry - climateName = "TRD"; //$NON-NLS-1$ - }else if( elevation < 1000 && ( precipitation >= 1000 && precipitation < 2000) && !shortDrySeason ){ // Tropical Moist, Long Dry Season - climateName = "TMLD"; //$NON-NLS-1$ - }else if( elevation < 1000 && ( precipitation >= 1000 && precipitation < 2000) && shortDrySeason ){ // Tropical Moist, Short Dry Season - climateName = "TMSD"; //$NON-NLS-1$ - }else if( elevation >= 1000 && precipitation < 1000 ){ // Tropical Montane Dry - climateName = "TRMD"; //$NON-NLS-1$ - }else if( elevation >= 1000 && precipitation >= 1000 ){ // Tropical Montane Moist - climateName = "TRMM"; //$NON-NLS-1$ - }else if( elevation < 1000 && precipitation >= 2000 ){ // Tropical Wet - climateName = "TRW"; //$NON-NLS-1$ - } - - return climateName; + private Logger logger = LoggerFactory.getLogger( FixCoordinates.class); + + private boolean stopFix = false; + + private List getAllRecords(){ + RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); + return recordManager.loadSummaries( rf ); } - - public String getSoilType( String initialSoilGroup ){ + + public void fixCoordinates(){ + List allRecords = getAllRecords(); - if( StringUtils.isBlank(initialSoilGroup) ){ - return "N/A"; //$NON-NLS-1$ + if( shouldStopFixing()){ + return; } - Map fundamentalToSoilGroup = new HashMap<>(); - - fundamentalToSoilGroup.put("B", "HAC"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("L", "HAC"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("P", "VOL"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("V", "VOL"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("S", "SAN"); // SAN+POD //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("Z", "LAC"); // LAc+HAC //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("T", "SAN"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("A", "LAC"); // LAC+WET //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("C", "LAC"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("G", "LAC"); // LAC+HAC //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("W", "ORG"); // ORG+WET //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("M", "WET"); //$NON-NLS-1$ //$NON-NLS-2$ - - return fundamentalToSoilGroup.get(initialSoilGroup); - } - - - public String getAluSubclass( String collectEarthSubclass ){ - if( StringUtils.isBlank(collectEarthSubclass) ){ - return "N/A"; //$NON-NLS-1$ + for (CollectRecordSummary summaryCollectRecord : allRecords) { + if( shouldStopFixing()){ + break; + } + try { + CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); + CoordinateAttribute plotCoord = (CoordinateAttribute) collectRecord.getNodeByPath("/plot/location"); //$NON-NLS-1$ + if( plotCoord != null && plotCoord.getValue() != null && plotCoord.getValue().getX() < getLongitudeLimit() ){ + Coordinate coordinate = new Coordinate(plotCoord.getValue().getY(), plotCoord.getValue().getX(), plotCoord.getValue().getSrsId() ); + plotCoord.setValue( coordinate ); + recordManager.save( collectRecord ); + } + } catch (Exception e) { + logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ + } } - String aluSubClass = collectEarthSubclass.replace("to", ""); //$NON-NLS-1$ //$NON-NLS-2$ - aluSubClass = aluSubClass.replace("L", ""); //$NON-NLS-1$ //$NON-NLS-2$ - aluSubClass = aluSubClass.replace("T", ""); //$NON-NLS-1$ //$NON-NLS-2$ - return aluSubClass; + } - - /** - * Returns the lower bracket of the precipitation range - * @param precipitationRange expects values like "0-100" or "2000-2100" - * @return the lowest bracket of the range. So for "0-100" it would return 0 - */ - public Integer getPrecipitationFromRange(String precipitationRange){ - String lowerBracket = precipitationRange.substring(0, precipitationRange.indexOf('-')).trim(); - if( lowerBracket.length() > 0 ){ - return Integer.parseInt(lowerBracket); - }else{ - return -1; - } + + protected abstract int getLongitudeLimit(); + + private boolean shouldStopFixing() { + return stopFix; + } + + public void stopFixing() { + stopFix = true; + } -} +} \ No newline at end of file From 77e3c5faecb73cf904524ce08aff5615e5865074 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:26 +0100 Subject: [PATCH 0057/1620] New translations findMissingCountries.java (Spanish) --- .../earth/app/view/Messages_es.properties | 1969 ++++++++++++++++- 1 file changed, 1895 insertions(+), 74 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 499b7cb5ec..768f973a7f 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,74 +1,1895 @@ -package org.openforis.collect.earth.app.ad_hoc; - -import java.util.List; - -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.manager.RecordManager; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.CollectRecordSummary; -import org.openforis.collect.model.RecordFilter; -import org.openforis.idm.model.Coordinate; -import org.openforis.idm.model.CoordinateAttribute; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public abstract class FixCoordinates { - - @Autowired - private RecordManager recordManager; - - @Autowired - private EarthSurveyService earthSurveyService; - - private Logger logger = LoggerFactory.getLogger( FixCoordinates.class); - - private boolean stopFix = false; - - private List getAllRecords(){ - RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); - return recordManager.loadSummaries( rf ); - } - - public void fixCoordinates(){ - List allRecords = getAllRecords(); - - if( shouldStopFixing()){ - return; - } - - for (CollectRecordSummary summaryCollectRecord : allRecords) { - if( shouldStopFixing()){ - break; - } - try { - CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); - CoordinateAttribute plotCoord = (CoordinateAttribute) collectRecord.getNodeByPath("/plot/location"); //$NON-NLS-1$ - if( plotCoord != null && plotCoord.getValue() != null && plotCoord.getValue().getX() < getLongitudeLimit() ){ - Coordinate coordinate = new Coordinate(plotCoord.getValue().getY(), plotCoord.getValue().getX(), plotCoord.getValue().getSrsId() ); - plotCoord.setValue( coordinate ); - recordManager.save( collectRecord ); - } - } catch (Exception e) { - logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ - } - } - - } - - protected abstract int getLongitudeLimit(); - - private boolean shouldStopFixing() { - return stopFix; - } - - public void stopFixing() { - stopFix = true; - - } - -} \ No newline at end of file +package org.openforis.collect.earth.app.ad_hoc; + +import java.util.ArrayList; +import java.util.Arrays; + +public class findMissingCountries { + + private static ArrayList allCountryNames = new ArrayList<>( + Arrays.asList( + "Abyei", + "Afghanistan", + "Aksai_Chin", + "Albania", + "Algeria", + "American_Samoa", + "Andorra", + "Angola", + "Anguilla", + "Antarctica", + "Antigua_and_Barbuda", + "Argentina", + "Armenia", + "Aruba", + "Arunachal_Pradesh", + "Ashmore_and_Cartier_Islands", + "Australia", + "Austria", + "Azerbaijan", + "Azores_Islands", + "Bahamas", + "Bahrain", + "Baker_Island", + "Bangladesh", + "Barbados", + "Bassas_da_India", + "Belarus", + "Belgium", + "Belize", + "Benin", + "Bermuda", + "Bhutan", + "Bird_Island", + "Bolivia", + "Bosnia_and_Herzegovina", + "Botswana", + "Bouvet_Island", + "Brazil", + "British_Indian_Ocean_Territory", + "British_Virgin_Islands", + "Brunei_Darussalam", + "Bulgaria", + "Burkina_Faso", + "Burundi", + "Cambodia", + "Cameroon", + "Canada", + "Cape_Verde", + "Cayman_Islands", + "Central_African_Republic", + "Chad", + "Chile", + "China", + "China/India", + "Christmas_Island", + "Clipperton_Island", + "Cocos__Keeling__Islands", + "Colombia", + "Comoros", + "Congo", + "Cook_Islands", + "Costa_Rica", + "Croatia", + "Cuba", + "Cyprus", + "Czech_Republic", + "C�te_d_Ivoire", + "Dem_People_s_Rep_of_Korea", + "Democratic_Republic_of_the_Congo", + "Denmark", + "Djibouti", + "Dominica", + "Dominican_Republic", + "Ecuador", + "Egypt", + "El_Salvador", + "Equatorial_Guinea", + "Eritrea", + "Estonia", + "Ethiopia", + "Europa_Island", + "Falkland_Islands__Malvinas_", + "Faroe_Islands", + "Fiji", + "Finland", + "France", + "French_Guiana", + "French_Polynesia", + "French_Southern_and_Antarctic_Territories", + "Gabon", + "Gambia", + "Gaza_Strip", + "Georgia", + "Germany", + "Ghana", + "Gibraltar", + "Glorioso_Island", + "Greece", + "Greenland", + "Grenada", + "Guadeloupe", + "Guam", + "Guatemala", + "Guernsey", + "Guinea", + "Guinea-Bissau", + "Guyana", + "Haiti", + "Hala_ib_triangle", + "Heard_Island_and_McDonald_Islands", + "Holy_See", + "Honduras", + "Hong_Kong", + "Howland_Island", + "Hungary", + "Iceland", + "Ilemi_triangle", + "India", + "Indonesia", + "Iran___Islamic_Republic_of_", + "Iraq", + "Ireland", + "Isle_of_Man", + "Israel", + "Italy", + "Jamaica", + "Jammu_and_Kashmir", + "Japan", + "Jarvis_Island", + "Jersey", + "Johnston_Atoll", + "Jordan", + "Juan_de_Nova_Island", + "Kazakhstan", + "Kenya", + "Kingman_Reef", + "Kiribati", + "Kuril_islands", + "Kuwait", + "Kyrgyzstan", + "Lao_People_s_Democratic_Republic", + "Latvia", + "Lebanon", + "Lesotho", + "Liberia", + "Libya", + "Liechtenstein", + "Lithuania", + "Luxembourg", + "Ma_tan_al-Sarra", + "Macau", + "Madagascar", + "Madeira_Islands", + "Malawi", + "Malaysia", + "Maldives", + "Mali", + "Malta", + "Marshall_Islands", + "Martinique", + "Mauritania", + "Mauritius", + "Mayotte", + "Mexico", + "Micronesia__Federated_States_of_", + "Midway_Island", + "Moldova,_Republic_of", + "Monaco", + "Mongolia", + "Montenegro", + "Montserrat", + "Morocco", + "Mozambique", + "Myanmar", + "Namibia", + "Nauru", + "Navassa_Island", + "Nepal", + "Netherlands", + "Netherlands_Antilles", + "New_Caledonia", + "New_Zealand", + "Nicaragua", + "Niger", + "Nigeria", + "Niue", + "Norfolk_Island", + "Northern_Mariana_Islands", + "Norway", + "Oman", + "Pakistan", + "Palau", + "Palmyra_Atoll", + "Panama", + "Papua_New_Guinea", + "Paracel_Islands", + "Paraguay", + "Peru", + "Philippines", + "Pitcairn", + "Poland", + "Portugal", + "Puerto_Rico", + "Qatar", + "Republic_of_Korea", + "Romania", + "Russian_Federation", + "Rwanda", + "R�union", + "Saint_Helena", + "Saint_Kitts_and_Nevis", + "Saint_Lucia", + "Saint_Pierre_et_Miquelon", + "Saint_Vincent_and_the_Grenadines", + "Samoa", + "San_Marino", + "Sao_Tome_and_Principe", + "Saudi_Arabia", + "Scarborough_Reef", + "Senegal", + "Senkaku_Islands", + "Serbia", + "Seychelles", + "Sierra_Leone", + "Singapore", + "Slovakia", + "Slovenia", + "Solomon_Islands", + "Somalia", + "South_Africa", + "South_Georgia_and_the_South_Sandwich_Islands", + "South_Sudan", + "Spain", + "Spratly_Islands", + "Sri_Lanka", + "Sudan", + "Suriname", + "Svalbard_and_Jan_Mayen_Islands", + "Swaziland", + "Sweden", + "Switzerland", + "Syrian_Arab_Republic", + "Taiwan", + "Tajikistan", + "Thailand", + "The_former_Yugoslav_Republic_of_Macedonia", + "Timor-Leste", + "Togo", + "Tokelau", + "Tonga", + "Trinidad_and_Tobago", + "Tromelin_Island", + "Tunisia", + "Turkey", + "Turkmenistan", + "Turks_and_Caicos_islands", + "Tuvalu", + "UK_of_Great_Britain_and_Northern_Ireland", + "Uganda", + "Ukraine", + "United_Arab_Emirates", + "United_Republic_of_Tanzania", + "United_States_Virgin_Islands", + "United_States_of_America", + "Uruguay", + "Uzbekistan", + "Vanuatu", + "Venezuela", + "Viet_Nam", + "Wake_Island", + "Wallis_and_Futuna", + "West_Bank", + "Western_Sahara", + "Yemen", + "Zambia", + "Zimbabwe" ) ); + + private static ArrayList filesGenerated = new ArrayList<>( + Arrays.asList( "Azores_Islands_bassin_10", + "Azores_Islands_bassin_11", + "Azores_Islands_bassin_12", + "Azores_Islands", + "Azores_Islands_bassin_5", + "Azores_Islands_bassin_6", + "Azores_Islands_bassin_7", + "Azores_Islands_bassin_8", + "Azores_Islands_bassin_9", + "Brunei_Darussalam_bassin_10", + "Brunei_Darussalam_bassin_11", + "Brunei_Darussalam_bassin_12", + "Brunei_Darussalam_bassin_7", + "Brunei_Darussalam_bassin_8", + "Brunei_Darussalam_bassin_9", + "Bulgaria_bassin_10", + "Bulgaria_bassin_11", + "Bulgaria_bassin_12", + "Bulgaria", + "Bulgaria_bassin_5", + "Bulgaria_bassin_6", + "Bulgaria_bassin_7", + "Bulgaria_bassin_8", + "Bulgaria_bassin_9", + "Burkina_Faso_bassin_10", + "Burkina_Faso_bassin_11", + "Burkina_Faso_bassin_12", + "Burkina_Faso", + "Burkina_Faso_bassin_5", + "Burkina_Faso_bassin_6", + "Burkina_Faso_bassin_7", + "Burkina_Faso_bassin_8", + "Burkina_Faso_bassin_9", + "Burundi_bassin_10", + "Burundi_bassin_11", + "Burundi_bassin_12", + "Burundi", + "Burundi_bassin_5", + "Burundi_bassin_6", + "Burundi_bassin_7", + "Burundi_bassin_8", + "Burundi_bassin_9", + "Cambodia_bassin_10", + "Cambodia_bassin_11", + "Cambodia_bassin_12", + "Cambodia", + "Cambodia_bassin_5", + "Cambodia_bassin_6", + "Cambodia_bassin_7", + "Cambodia_bassin_8", + "Cambodia_bassin_9", + "Cameroon_bassin_10", + "Cameroon_bassin_11", + "Cameroon_bassin_12", + "Cameroon", + "Cameroon_bassin_5", + "Cameroon_bassin_6", + "Cameroon_bassin_7", + "Cameroon_bassin_8", + "Cameroon_bassin_9", + "Canada_bassin_10", + "Canada_bassin_11", + "Canada_bassin_12", + "Canada", + "Canada_bassin_5", + "Canada_bassin_6", + "Canada_bassin_7", + "Canada_bassin_8", + "Canada_bassin_9", + "Cape_Verde_bassin_10", + "Cape_Verde_bassin_11", + "Cape_Verde_bassin_12", + "Cape_Verde", + "Cape_Verde_bassin_5", + "Cape_Verde_bassin_6", + "Cape_Verde_bassin_7", + "Cape_Verde_bassin_8", + "Cape_Verde_bassin_9", + "Cayman_Islands_bassin_10", + "Cayman_Islands_bassin_11", + "Cayman_Islands_bassin_12", + "Cayman_Islands", + "Cayman_Islands_bassin_5", + "Cayman_Islands_bassin_6", + "Cayman_Islands_bassin_7", + "Cayman_Islands_bassin_8", + "Cayman_Islands_bassin_9", + "Central_African Republic_bassin_10", + "Central_African Republic_bassin_11", + "Central_African Republic_bassin_12", + "Central_African Republic", + "Central_African Republic_bassin_5", + "Central_African Republic_bassin_6", + "Central_African Republic_bassin_7", + "Central_African Republic_bassin_8", + "Central_African Republic_bassin_9", + "Chad_bassin_10", + "Chad_bassin_11", + "Chad_bassin_12", + "Chad", + "Chad_bassin_5", + "Chad_bassin_6", + "Chad_bassin_7", + "Chad_bassin_8", + "Chad_bassin_9", + "Chile_bassin_10", + "Chile_bassin_11", + "Chile_bassin_12", + "Chile", + "Chile_bassin_5", + "Chile_bassin_6", + "Chile_bassin_7", + "Chile_bassin_8", + "Chile_bassin_9", + "China_bassin_10", + "China_bassin_11", + "China_bassin_12", + "China", + "China_bassin_5", + "China_bassin_6", + "China_bassin_7", + "China_bassin_8", + "China_bassin_9", + "Christmas_Island_bassin_10", + "Christmas_Island_bassin_11", + "Christmas_Island_bassin_12", + "Christmas_Island", + "Christmas_Island_bassin_5", + "Christmas_Island_bassin_6", + "Christmas_Island_bassin_7", + "Christmas_Island_bassin_8", + "Christmas_Island_bassin_9", + "Clipperton_Island_bassin_10", + "Clipperton_Island_bassin_11", + "Clipperton_Island_bassin_12", + "Clipperton_Island", + "Clipperton_Island_bassin_5", + "Clipperton_Island_bassin_6", + "Clipperton_Island_bassin_7", + "Clipperton_Island_bassin_8", + "Clipperton_Island_bassin_9", + "Colombia_bassin_10", + "Colombia_bassin_11", + "Colombia_bassin_12", + "Colombia", + "Colombia_bassin_5", + "Colombia_bassin_6", + "Colombia_bassin_7", + "Colombia_bassin_8", + "Colombia_bassin_9", + "Comoros_bassin_10", + "Comoros_bassin_11", + "Comoros_bassin_12", + "Comoros", + "Comoros_bassin_5", + "Comoros_bassin_6", + "Comoros_bassin_7", + "Comoros_bassin_8", + "Comoros_bassin_9", + "Congo_bassin_10", + "Congo_bassin_11", + "Congo_bassin_12", + "Congo", + "Congo_bassin_5", + "Congo_bassin_6", + "Congo_bassin_7", + "Congo_bassin_8", + "Congo_bassin_9", + "Cook_Islands_bassin_10", + "Cook_Islands_bassin_11", + "Cook_Islands_bassin_12", + "Cook_Islands", + "Cook_Islands_bassin_5", + "Cook_Islands_bassin_6", + "Cook_Islands_bassin_7", + "Cook_Islands_bassin_8", + "Cook_Islands_bassin_9", + "Costa_Rica_bassin_10", + "Costa_Rica_bassin_11", + "Costa_Rica_bassin_12", + "Costa_Rica", + "Costa_Rica_bassin_5", + "Costa_Rica_bassin_6", + "Costa_Rica_bassin_7", + "Costa_Rica_bassin_8", + "Costa_Rica_bassin_9", + "Croatia_bassin_10", + "Croatia_bassin_11", + "Croatia_bassin_12", + "Croatia", + "Croatia_bassin_5", + "Croatia_bassin_6", + "Croatia_bassin_7", + "Croatia_bassin_8", + "Croatia_bassin_9", + "Cuba_bassin_10", + "Cuba_bassin_11", + "Cuba_bassin_12", + "Cuba", + "Cuba_bassin_5", + "Cuba_bassin_6", + "Cuba_bassin_7", + "Cuba_bassin_8", + "Cuba_bassin_9", + "Cyprus_bassin_10", + "Cyprus_bassin_11", + "Cyprus_bassin_12", + "Cyprus", + "Cyprus_bassin_5", + "Cyprus_bassin_6", + "Cyprus_bassin_7", + "Cyprus_bassin_8", + "Cyprus_bassin_9", + "Czech_Republic_bassin_10", + "Czech_Republic_bassin_11", + "Czech_Republic_bassin_12", + "Czech_Republic", + "Czech_Republic_bassin_5", + "Czech_Republic_bassin_6", + "Czech_Republic_bassin_7", + "Czech_Republic_bassin_8", + "Czech_Republic_bassin_9", + "Democratic_Republic of the Congo_bassin_10", + "Democratic_Republic of the Congo_bassin_11", + "Democratic_Republic of the Congo_bassin_12", + "Democratic_Republic of the Congo", + "Democratic_Republic of the Congo_bassin_5", + "Democratic_Republic of the Congo_bassin_6", + "Democratic_Republic of the Congo_bassin_7", + "Democratic_Republic of the Congo_bassin_8", + "Democratic_Republic of the Congo_bassin_9", + "Dem_Peoples Rep of Korea_bassin_10", + "Dem_Peoples Rep of Korea_bassin_11", + "Dem_Peoples Rep of Korea_bassin_12", + "Dem_Peoples Rep of Korea", + "Dem_Peoples Rep of Korea_bassin_5", + "Dem_Peoples Rep of Korea_bassin_6", + "Dem_Peoples Rep of Korea_bassin_7", + "Dem_Peoples Rep of Korea_bassin_8", + "Dem_Peoples Rep of Korea_bassin_9", + "Denmark_bassin_10", + "Denmark_bassin_11", + "Denmark_bassin_12", + "Denmark", + "Denmark_bassin_5", + "Denmark_bassin_6", + "Denmark_bassin_7", + "Denmark_bassin_8", + "Denmark_bassin_9", + "Djibouti_bassin_10", + "Djibouti_bassin_11", + "Djibouti_bassin_12", + "Djibouti", + "Djibouti_bassin_5", + "Djibouti_bassin_6", + "Djibouti_bassin_7", + "Djibouti_bassin_8", + "Djibouti_bassin_9", + "Dominican_Republic_bassin_10", + "Dominican_Republic_bassin_11", + "Dominican_Republic_bassin_12", + "Dominican_Republic", + "Dominican_Republic_bassin_5", + "Dominican_Republic_bassin_6", + "Dominican_Republic_bassin_7", + "Dominican_Republic_bassin_8", + "Dominican_Republic_bassin_9", + "Dominica_bassin_10", + "Dominica_bassin_11", + "Dominica_bassin_12", + "Dominica", + "Dominica_bassin_5", + "Dominica_bassin_6", + "Dominica_bassin_7", + "Dominica_bassin_8", + "Dominica_bassin_9", + "Ecuador_bassin_10", + "Ecuador_bassin_11", + "Ecuador_bassin_12", + "Ecuador", + "Ecuador_bassin_5", + "Ecuador_bassin_6", + "Ecuador_bassin_7", + "Ecuador_bassin_8", + "Ecuador_bassin_9", + "Egypt_bassin_10", + "Egypt_bassin_11", + "Egypt_bassin_12", + "Egypt", + "Egypt_bassin_5", + "Egypt_bassin_6", + "Egypt_bassin_7", + "Egypt_bassin_8", + "Egypt_bassin_9", + "El_Salvador_bassin_10", + "El_Salvador_bassin_11", + "El_Salvador_bassin_12", + "El_Salvador", + "El_Salvador_bassin_5", + "El_Salvador_bassin_6", + "El_Salvador_bassin_7", + "El_Salvador_bassin_8", + "El_Salvador_bassin_9", + "Equatorial_Guinea_bassin_10", + "Equatorial_Guinea_bassin_11", + "Equatorial_Guinea_bassin_12", + "Equatorial_Guinea", + "Equatorial_Guinea_bassin_5", + "Equatorial_Guinea_bassin_6", + "Equatorial_Guinea_bassin_7", + "Equatorial_Guinea_bassin_8", + "Equatorial_Guinea_bassin_9", + "Eritrea_bassin_10", + "Eritrea_bassin_11", + "Eritrea_bassin_12", + "Eritrea", + "Eritrea_bassin_5", + "Eritrea_bassin_6", + "Eritrea_bassin_7", + "Eritrea_bassin_8", + "Eritrea_bassin_9", + "Estonia_bassin_10", + "Estonia_bassin_11", + "Estonia_bassin_12", + "Estonia", + "Estonia_bassin_5", + "Estonia_bassin_6", + "Estonia_bassin_7", + "Estonia_bassin_8", + "Estonia_bassin_9", + "Ethiopia_bassin_10", + "Ethiopia_bassin_11", + "Ethiopia_bassin_12", + "Ethiopia", + "Ethiopia_bassin_5", + "Ethiopia_bassin_6", + "Ethiopia_bassin_7", + "Ethiopia_bassin_8", + "Ethiopia_bassin_9", + "Europa_Island_bassin_10", + "Europa_Island_bassin_11", + "Europa_Island_bassin_12", + "Europa_Island", + "Europa_Island_bassin_5", + "Europa_Island_bassin_6", + "Europa_Island_bassin_7", + "Europa_Island_bassin_8", + "Europa_Island_bassin_9", + "Faroe_Islands_bassin_10", + "Faroe_Islands_bassin_11", + "Faroe_Islands_bassin_12", + "Faroe_Islands", + "Faroe_Islands_bassin_5", + "Faroe_Islands_bassin_6", + "Faroe_Islands_bassin_7", + "Faroe_Islands_bassin_8", + "Faroe_Islands_bassin_9", + "Fiji_bassin_10", + "Fiji_bassin_11", + "Fiji_bassin_12", + "Fiji", + "Fiji_bassin_5", + "Fiji_bassin_6", + "Fiji_bassin_7", + "Fiji_bassin_8", + "Fiji_bassin_9", + "Finland_bassin_10", + "Finland_bassin_11", + "Finland_bassin_12", + "Finland", + "Finland_bassin_5", + "Finland_bassin_6", + "Finland_bassin_7", + "Finland_bassin_8", + "Finland_bassin_9", + "France_bassin_10", + "France_bassin_11", + "France_bassin_12", + "France", + "France_bassin_5", + "France_bassin_6", + "France_bassin_7", + "France_bassin_8", + "France_bassin_9", + "French_Guiana_bassin_10", + "French_Guiana_bassin_11", + "French_Guiana_bassin_12", + "French_Guiana", + "French_Guiana_bassin_5", + "French_Guiana_bassin_6", + "French_Guiana_bassin_7", + "French_Guiana_bassin_8", + "French_Guiana_bassin_9", + "French_Polynesia_bassin_10", + "French_Polynesia_bassin_11", + "French_Polynesia_bassin_12", + "French_Polynesia", + "French_Polynesia_bassin_5", + "French_Polynesia_bassin_6", + "French_Polynesia_bassin_7", + "French_Polynesia_bassin_8", + "French_Polynesia_bassin_9", + "French_Southern and Antarctic Territories_bassin_10", + "French_Southern and Antarctic Territories_bassin_11", + "French_Southern and Antarctic Territories_bassin_12", + "French_Southern and Antarctic Territories", + "French_Southern and Antarctic Territories_bassin_5", + "French_Southern and Antarctic Territories_bassin_6", + "French_Southern and Antarctic Territories_bassin_7", + "French_Southern and Antarctic Territories_bassin_8", + "French_Southern and Antarctic Territories_bassin_9", + "Gabon_bassin_10", + "Gabon_bassin_11", + "Gabon_bassin_12", + "Gabon", + "Gabon_bassin_5", + "Gabon_bassin_6", + "Gabon_bassin_7", + "Gabon_bassin_8", + "Gabon_bassin_9", + "Gambia_bassin_10", + "Gambia_bassin_11", + "Gambia_bassin_12", + "Gambia", + "Gambia_bassin_5", + "Gambia_bassin_6", + "Gambia_bassin_7", + "Gambia_bassin_8", + "Gambia_bassin_9", + "Gaza_Strip_bassin_10", + "Gaza_Strip_bassin_11", + "Gaza_Strip_bassin_12", + "Gaza_Strip", + "Gaza_Strip_bassin_5", + "Gaza_Strip_bassin_6", + "Gaza_Strip_bassin_7", + "Gaza_Strip_bassin_8", + "Gaza_Strip_bassin_9", + "Georgia_bassin_10", + "Georgia_bassin_11", + "Georgia_bassin_12", + "Georgia", + "Georgia_bassin_5", + "Georgia_bassin_6", + "Georgia_bassin_7", + "Georgia_bassin_8", + "Georgia_bassin_9", + "Germany_bassin_10", + "Germany_bassin_11", + "Germany_bassin_12", + "Germany", + "Germany_bassin_5", + "Germany_bassin_6", + "Germany_bassin_7", + "Germany_bassin_8", + "Germany_bassin_9", + "Ghana_bassin_10", + "Ghana_bassin_11", + "Ghana_bassin_12", + "Ghana", + "Ghana_bassin_5", + "Ghana_bassin_6", + "Ghana_bassin_8", + "Ghana_bassin_9", + "Gibraltar_bassin_10", + "Gibraltar_bassin_11", + "Gibraltar_bassin_12", + "Gibraltar", + "Gibraltar_bassin_5", + "Gibraltar_bassin_6", + "Gibraltar_bassin_7", + "Gibraltar_bassin_8", + "Gibraltar_bassin_9", + "Glorioso_Island_bassin_10", + "Glorioso_Island_bassin_11", + "Glorioso_Island_bassin_12", + "Glorioso_Island", + "Glorioso_Island_bassin_5", + "Glorioso_Island_bassin_6", + "Glorioso_Island_bassin_7", + "Glorioso_Island_bassin_8", + "Glorioso_Island_bassin_9", + "Greece_bassin_10", + "Greece_bassin_11", + "Greece_bassin_12", + "Greece", + "Greece_bassin_5", + "Greece_bassin_6", + "Greece_bassin_7", + "Greece_bassin_8", + "Greece_bassin_9", + "Greenland_bassin_10", + "Greenland_bassin_11", + "Greenland_bassin_12", + "Greenland", + "Greenland_bassin_5", + "Greenland_bassin_6", + "Greenland_bassin_7", + "Greenland_bassin_8", + "Greenland_bassin_9", + "Grenada_bassin_10", + "Grenada_bassin_11", + "Grenada_bassin_12", + "Grenada", + "Grenada_bassin_5", + "Grenada_bassin_6", + "Grenada_bassin_7", + "Grenada_bassin_8", + "Grenada_bassin_9", + "Guadeloupe_bassin_10", + "Guadeloupe_bassin_11", + "Guadeloupe_bassin_12", + "Guadeloupe", + "Guadeloupe_bassin_5", + "Guadeloupe_bassin_6", + "Guadeloupe_bassin_7", + "Guadeloupe_bassin_8", + "Guadeloupe_bassin_9", + "Guam_bassin_10", + "Guam_bassin_11", + "Guam_bassin_12", + "Guam", + "Guam_bassin_5", + "Guam_bassin_6", + "Guam_bassin_7", + "Guam_bassin_8", + "Guam_bassin_9", + "Halaib_triangle_bassin_10", + "Halaib_triangle_bassin_11", + "Halaib_triangle_bassin_12", + "Halaib_triangle", + "Halaib_triangle_bassin_5", + "Halaib_triangle_bassin_6", + "Halaib_triangle_bassin_7", + "Halaib_triangle_bassin_8", + "Halaib_triangle_bassin_9", + "Heard_Island and McDonald Islands_bassin_12", + "Holy_See_bassin_10", + "Holy_See_bassin_11", + "Holy_See_bassin_12", + "Holy_See", + "Holy_See_bassin_5", + "Holy_See_bassin_6", + "Holy_See_bassin_7", + "Holy_See_bassin_8", + "Holy_See_bassin_9", + "Honduras_bassin_10", + "Honduras_bassin_11", + "Honduras_bassin_12", + "Honduras", + "Honduras_bassin_5", + "Honduras_bassin_6", + "Honduras_bassin_7", + "Honduras_bassin_8", + "Honduras_bassin_9", + "Hong_Kong_bassin_10", + "Hong_Kong_bassin_11", + "Hong_Kong_bassin_12", + "Hong_Kong", + "Hong_Kong_bassin_5", + "Hong_Kong_bassin_6", + "Hong_Kong_bassin_7", + "Hong_Kong_bassin_8", + "Hong_Kong_bassin_9", + "Howland_Island_bassin_10", + "Howland_Island_bassin_11", + "Howland_Island_bassin_12", + "Howland_Island", + "Howland_Island_bassin_5", + "Howland_Island_bassin_6", + "Howland_Island_bassin_7", + "Howland_Island_bassin_8", + "Howland_Island_bassin_9", + "Hungary_bassin_10", + "Hungary_bassin_11", + "Hungary_bassin_12", + "Hungary", + "Hungary_bassin_5", + "Hungary_bassin_6", + "Hungary_bassin_7", + "Hungary_bassin_8", + "Hungary_bassin_9", + "Iceland_bassin_10", + "Iceland_bassin_11", + "Iceland_bassin_12", + "Iceland", + "Iceland_bassin_5", + "Iceland_bassin_6", + "Iceland_bassin_7", + "Iceland_bassin_8", + "Iceland_bassin_9", + "Ilemi_triangle_bassin_10", + "Ilemi_triangle_bassin_11", + "Ilemi_triangle_bassin_12", + "Ilemi_triangle", + "Ilemi_triangle_bassin_5", + "Ilemi_triangle_bassin_6", + "Ilemi_triangle_bassin_7", + "Ilemi_triangle_bassin_8", + "Ilemi_triangle_bassin_9", + "India_bassin_10", + "India_bassin_11", + "India_bassin_12", + "India", + "India_bassin_5", + "India_bassin_6", + "India_bassin_7", + "India_bassin_8", + "India_bassin_9", + "Indonesia_bassin_10", + "Indonesia_bassin_11", + "Indonesia_bassin_12", + "Indonesia", + "Indonesia_bassin_5", + "Indonesia_bassin_6", + "Indonesia_bassin_7", + "Indonesia_bassin_8", + "Indonesia_bassin_9", + "Iraq_bassin_10", + "Iraq_bassin_11", + "Iraq_bassin_12", + "Iraq", + "Iraq_bassin_5", + "Iraq_bassin_6", + "Iraq_bassin_7", + "Iraq_bassin_8", + "Iraq_bassin_9", + "Ireland_bassin_10", + "Ireland_bassin_11", + "Ireland_bassin_12", + "Ireland", + "Ireland_bassin_5", + "Ireland_bassin_6", + "Ireland_bassin_7", + "Ireland_bassin_8", + "Ireland_bassin_9", + "Isle_of Man_bassin_10", + "Isle_of Man_bassin_11", + "Isle_of Man_bassin_12", + "Isle_of Man", + "Isle_of Man_bassin_5", + "Isle_of Man_bassin_6", + "Isle_of Man_bassin_7", + "Isle_of Man_bassin_8", + "Isle_of Man_bassin_9", + "Israel_bassin_10", + "Israel_bassin_11", + "Israel_bassin_12", + "Israel", + "Israel_bassin_5", + "Israel_bassin_6", + "Israel_bassin_7", + "Israel_bassin_8", + "Israel_bassin_9", + "Italy_bassin_10", + "Italy_bassin_11", + "Italy_bassin_12", + "Italy", + "Italy_bassin_5", + "Italy_bassin_6", + "Italy_bassin_7", + "Italy_bassin_8", + "Italy_bassin_9", + "Jamaica_bassin_10", + "Jamaica_bassin_11", + "Jamaica_bassin_12", + "Jamaica", + "Jamaica_bassin_5", + "Jamaica_bassin_6", + "Jamaica_bassin_7", + "Jamaica_bassin_8", + "Jamaica_bassin_9", + "Jammu_and Kashmir_bassin_10", + "Jammu_and Kashmir_bassin_11", + "Jammu_and Kashmir_bassin_12", + "Jammu_and Kashmir", + "Jammu_and Kashmir_bassin_5", + "Jammu_and Kashmir_bassin_6", + "Jammu_and Kashmir_bassin_7", + "Jammu_and Kashmir_bassin_8", + "Jammu_and Kashmir_bassin_9", + "Japan_bassin_10", + "Japan_bassin_11", + "Japan_bassin_12", + "Japan", + "Japan_bassin_5", + "Japan_bassin_6", + "Japan_bassin_7", + "Japan_bassin_8", + "Japan_bassin_9", + "Jarvis_Island_bassin_10", + "Jarvis_Island_bassin_11", + "Jarvis_Island_bassin_12", + "Jarvis_Island", + "Jarvis_Island_bassin_5", + "Jarvis_Island_bassin_6", + "Jarvis_Island_bassin_7", + "Jarvis_Island_bassin_8", + "Jarvis_Island_bassin_9", + "Jersey_bassin_10", + "Jersey_bassin_11", + "Jersey_bassin_12", + "Jersey", + "Jersey_bassin_5", + "Jersey_bassin_6", + "Jersey_bassin_7", + "Jersey_bassin_8", + "Jersey_bassin_9", + "Johnston_Atoll_bassin_10", + "Johnston_Atoll_bassin_11", + "Johnston_Atoll_bassin_12", + "Johnston_Atoll", + "Johnston_Atoll_bassin_5", + "Johnston_Atoll_bassin_6", + "Johnston_Atoll_bassin_7", + "Johnston_Atoll_bassin_8", + "Johnston_Atoll_bassin_9", + "Jordan_bassin_10", + "Jordan_bassin_11", + "Jordan_bassin_12", + "Jordan", + "Jordan_bassin_5", + "Jordan_bassin_6", + "Jordan_bassin_7", + "Jordan_bassin_8", + "Jordan_bassin_9", + "Juan_de Nova Island_bassin_10", + "Juan_de Nova Island_bassin_11", + "Juan_de Nova Island_bassin_12", + "Juan_de Nova Island", + "Juan_de Nova Island_bassin_5", + "Juan_de Nova Island_bassin_6", + "Juan_de Nova Island_bassin_7", + "Juan_de Nova Island_bassin_8", + "Juan_de Nova Island_bassin_9", + "Kazakhstan_bassin_10", + "Kazakhstan_bassin_11", + "Kazakhstan_bassin_12", + "Kazakhstan", + "Kazakhstan_bassin_5", + "Kazakhstan_bassin_6", + "Kazakhstan_bassin_7", + "Kazakhstan_bassin_8", + "Kazakhstan_bassin_9", + "Kenya_bassin_10", + "Kenya_bassin_11", + "Kenya_bassin_12", + "Kenya", + "Kenya_bassin_5", + "Kenya_bassin_6", + "Kenya_bassin_7", + "Kenya_bassin_8", + "Kenya_bassin_9", + "Kingman_Reef_bassin_10", + "Kingman_Reef_bassin_11", + "Kingman_Reef_bassin_12", + "Kingman_Reef", + "Kingman_Reef_bassin_5", + "Kingman_Reef_bassin_6", + "Kingman_Reef_bassin_7", + "Kingman_Reef_bassin_8", + "Kingman_Reef_bassin_9", + "Kiribati_bassin_10", + "Kiribati_bassin_11", + "Kiribati_bassin_12", + "Kiribati", + "Kiribati_bassin_5", + "Kiribati_bassin_6", + "Kiribati_bassin_7", + "Kiribati_bassin_8", + "Kiribati_bassin_9", + "Kuril_islands_bassin_10", + "Kuril_islands_bassin_11", + "Kuril_islands_bassin_12", + "Kuril_islands", + "Kuril_islands_bassin_5", + "Kuril_islands_bassin_6", + "Kuril_islands_bassin_7", + "Kuril_islands_bassin_8", + "Kuril_islands_bassin_9", + "Kuwait_bassin_10", + "Kuwait_bassin_11", + "Kuwait_bassin_12", + "Kuwait", + "Kuwait_bassin_5", + "Kuwait_bassin_6", + "Kuwait_bassin_7", + "Kuwait_bassin_8", + "Kuwait_bassin_9", + "Kyrgyzstan_bassin_10", + "Kyrgyzstan_bassin_11", + "Kyrgyzstan_bassin_12", + "Kyrgyzstan", + "Kyrgyzstan_bassin_5", + "Kyrgyzstan_bassin_6", + "Kyrgyzstan_bassin_7", + "Kyrgyzstan_bassin_8", + "Kyrgyzstan_bassin_9", + "Lao_Peoples Democratic Republic_bassin_10", + "Lao_Peoples Democratic Republic_bassin_11", + "Lao_Peoples Democratic Republic_bassin_12", + "Lao_Peoples Democratic Republic", + "Lao_Peoples Democratic Republic_bassin_5", + "Lao_Peoples Democratic Republic_bassin_6", + "Lao_Peoples Democratic Republic_bassin_7", + "Lao_Peoples Democratic Republic_bassin_8", + "Lao_Peoples Democratic Republic_bassin_9", + "Latvia_bassin_10", + "Latvia_bassin_11", + "Latvia_bassin_12", + "Latvia", + "Latvia_bassin_5", + "Latvia_bassin_6", + "Latvia_bassin_7", + "Latvia_bassin_8", + "Latvia_bassin_9", + "Lebanon_bassin_10", + "Lebanon_bassin_11", + "Lebanon_bassin_12", + "Lebanon", + "Lebanon_bassin_5", + "Lebanon_bassin_6", + "Lebanon_bassin_7", + "Lebanon_bassin_8", + "Lebanon_bassin_9", + "Lesotho_bassin_10", + "Lesotho_bassin_11", + "Lesotho_bassin_12", + "Lesotho", + "Lesotho_bassin_5", + "Lesotho_bassin_6", + "Lesotho_bassin_7", + "Lesotho_bassin_8", + "Lesotho_bassin_9", + "Liberia_bassin_10", + "Liberia_bassin_11", + "Liberia_bassin_12", + "Liberia", + "Liberia_bassin_5", + "Liberia_bassin_6", + "Liberia_bassin_7", + "Liberia_bassin_8", + "Liberia_bassin_9", + "Libya_bassin_10", + "Libya_bassin_11", + "Libya_bassin_12", + "Libya", + "Libya_bassin_5", + "Libya_bassin_6", + "Libya_bassin_7", + "Libya_bassin_8", + "Libya_bassin_9", + "Liechtenstein_bassin_10", + "Liechtenstein_bassin_11", + "Liechtenstein_bassin_12", + "Liechtenstein", + "Liechtenstein_bassin_5", + "Liechtenstein_bassin_6", + "Liechtenstein_bassin_7", + "Liechtenstein_bassin_8", + "Liechtenstein_bassin_9", + "Lithuania_bassin_10", + "Lithuania_bassin_11", + "Lithuania_bassin_12", + "Lithuania", + "Lithuania_bassin_5", + "Lithuania_bassin_6", + "Lithuania_bassin_7", + "Lithuania_bassin_8", + "Lithuania_bassin_9", + "Luxembourg_bassin_10", + "Luxembourg_bassin_11", + "Luxembourg_bassin_12", + "Luxembourg", + "Luxembourg_bassin_5", + "Luxembourg_bassin_6", + "Luxembourg_bassin_7", + "Luxembourg_bassin_8", + "Luxembourg_bassin_9", + "Macau_bassin_10", + "Macau_bassin_11", + "Macau_bassin_12", + "Macau", + "Macau_bassin_5", + "Macau_bassin_6", + "Macau_bassin_7", + "Macau_bassin_8", + "Macau_bassin_9", + "Madagascar_bassin_10", + "Madagascar_bassin_11", + "Madagascar_bassin_12", + "Madagascar", + "Madagascar_bassin_5", + "Madagascar_bassin_6", + "Madagascar_bassin_7", + "Madagascar_bassin_8", + "Madagascar_bassin_9", + "Madeira_Islands_bassin_10", + "Madeira_Islands_bassin_11", + "Madeira_Islands_bassin_12", + "Madeira_Islands", + "Madeira_Islands_bassin_5", + "Madeira_Islands_bassin_6", + "Madeira_Islands_bassin_7", + "Madeira_Islands_bassin_8", + "Madeira_Islands_bassin_9", + "Malawi_bassin_10", + "Malawi_bassin_11", + "Malawi_bassin_12", + "Malawi", + "Malawi_bassin_5", + "Malawi_bassin_6", + "Malawi_bassin_7", + "Malawi_bassin_8", + "Malawi_bassin_9", + "Malaysia_bassin_10", + "Malaysia_bassin_11", + "Malaysia_bassin_12", + "Malaysia", + "Malaysia_bassin_5", + "Malaysia_bassin_6", + "Malaysia_bassin_7", + "Malaysia_bassin_8", + "Malaysia_bassin_9", + "Maldives_bassin_10", + "Maldives_bassin_11", + "Maldives_bassin_12", + "Maldives", + "Maldives_bassin_5", + "Maldives_bassin_6", + "Maldives_bassin_7", + "Maldives_bassin_8", + "Maldives_bassin_9", + "Matan_al-Sarra_bassin_10", + "Matan_al-Sarra_bassin_11", + "Matan_al-Sarra_bassin_12", + "Matan_al-Sarra", + "Matan_al-Sarra_bassin_5", + "Matan_al-Sarra_bassin_6", + "Matan_al-Sarra_bassin_7", + "Matan_al-Sarra_bassin_8", + "Matan_al-Sarra_bassin_9", + "Montenegro_bassin_10", + "Montenegro_bassin_11", + "Montenegro_bassin_12", + "Montenegro", + "Montenegro_bassin_5", + "Montenegro_bassin_6", + "Montenegro_bassin_7", + "Montenegro_bassin_8", + "Montenegro_bassin_9", + "Qatar_bassin_10", + "Qatar_bassin_11", + "Qatar_bassin_12", + "Republic_of Korea_bassin_10", + "Republic_of Korea_bassin_11", + "Republic_of Korea_bassin_12", + "Republic_of Korea", + "Republic_of Korea_bassin_5", + "Republic_of Korea_bassin_6", + "Republic_of Korea_bassin_7", + "Republic_of Korea_bassin_8", + "Republic_of Korea_bassin_9", + "Romania_bassin_10", + "Romania_bassin_11", + "Romania_bassin_12", + "Romania", + "Romania_bassin_5", + "Romania_bassin_6", + "Romania_bassin_7", + "Romania_bassin_8", + "Romania_bassin_9", + "Russian_Federation_bassin_10", + "Russian_Federation_bassin_11", + "Russian_Federation_bassin_12", + "Russian_Federation", + "Russian_Federation_bassin_5", + "Russian_Federation_bassin_6", + "Russian_Federation_bassin_7", + "Russian_Federation_bassin_8", + "Russian_Federation_bassin_9", + "Rwanda_bassin_10", + "Rwanda_bassin_11", + "Rwanda_bassin_12", + "Rwanda", + "Rwanda_bassin_5", + "Rwanda_bassin_6", + "Rwanda_bassin_7", + "Rwanda_bassin_8", + "Rwanda_bassin_9", + "Saint_Helena_bassin_10", + "Saint_Helena_bassin_11", + "Saint_Helena_bassin_12", + "Saint_Helena", + "Saint_Helena_bassin_5", + "Saint_Helena_bassin_6", + "Saint_Helena_bassin_7", + "Saint_Helena_bassin_8", + "Saint_Helena_bassin_9", + "Saint_Kitts and Nevis_bassin_10", + "Saint_Kitts and Nevis_bassin_11", + "Saint_Kitts and Nevis_bassin_12", + "Saint_Kitts and Nevis", + "Saint_Kitts and Nevis_bassin_5", + "Saint_Kitts and Nevis_bassin_6", + "Saint_Kitts and Nevis_bassin_7", + "Saint_Kitts and Nevis_bassin_8", + "Saint_Kitts and Nevis_bassin_9", + "Saint_Lucia_bassin_10", + "Saint_Lucia_bassin_11", + "Saint_Lucia_bassin_12", + "Saint_Lucia", + "Saint_Lucia_bassin_5", + "Saint_Lucia_bassin_6", + "Saint_Lucia_bassin_7", + "Saint_Lucia_bassin_8", + "Saint_Lucia_bassin_9", + "Saint_Pierre et Miquelon_bassin_10", + "Saint_Pierre et Miquelon_bassin_11", + "Saint_Pierre et Miquelon_bassin_12", + "Saint_Pierre et Miquelon", + "Saint_Pierre et Miquelon_bassin_5", + "Saint_Pierre et Miquelon_bassin_6", + "Saint_Pierre et Miquelon_bassin_7", + "Saint_Pierre et Miquelon_bassin_8", + "Saint_Pierre et Miquelon_bassin_9", + "Saint_Vincent and the Grenadines_bassin_10", + "Saint_Vincent and the Grenadines_bassin_11", + "Saint_Vincent and the Grenadines_bassin_12", + "Saint_Vincent and the Grenadines", + "Saint_Vincent and the Grenadines_bassin_5", + "Saint_Vincent and the Grenadines_bassin_6", + "Saint_Vincent and the Grenadines_bassin_7", + "Saint_Vincent and the Grenadines_bassin_8", + "Saint_Vincent and the Grenadines_bassin_9", + "Samoa_bassin_10", + "Samoa_bassin_11", + "Samoa_bassin_12", + "Samoa", + "Samoa_bassin_5", + "Samoa_bassin_6", + "Samoa_bassin_7", + "Samoa_bassin_8", + "Samoa_bassin_9", + "San_Marino_bassin_10", + "San_Marino_bassin_11", + "San_Marino_bassin_12", + "San_Marino", + "San_Marino_bassin_5", + "San_Marino_bassin_6", + "San_Marino_bassin_7", + "San_Marino_bassin_8", + "San_Marino_bassin_9", + "Sao_Tome and Principe_bassin_10", + "Sao_Tome and Principe_bassin_11", + "Sao_Tome and Principe_bassin_12", + "Sao_Tome and Principe", + "Sao_Tome and Principe_bassin_5", + "Sao_Tome and Principe_bassin_6", + "Sao_Tome and Principe_bassin_7", + "Sao_Tome and Principe_bassin_8", + "Sao_Tome and Principe_bassin_9", + "Saudi_Arabia_bassin_10", + "Saudi_Arabia_bassin_11", + "Saudi_Arabia_bassin_12", + "Saudi_Arabia", + "Saudi_Arabia_bassin_5", + "Saudi_Arabia_bassin_6", + "Saudi_Arabia_bassin_7", + "Saudi_Arabia_bassin_8", + "Saudi_Arabia_bassin_9", + "Scarborough_Reef_bassin_10", + "Scarborough_Reef_bassin_11", + "Scarborough_Reef_bassin_12", + "Scarborough_Reef", + "Scarborough_Reef_bassin_5", + "Scarborough_Reef_bassin_6", + "Scarborough_Reef_bassin_7", + "Scarborough_Reef_bassin_8", + "Scarborough_Reef_bassin_9", + "Senegal_bassin_10", + "Senegal_bassin_11", + "Senegal_bassin_12", + "Senegal", + "Senegal_bassin_5", + "Senegal_bassin_6", + "Senegal_bassin_7", + "Senegal_bassin_8", + "Senegal_bassin_9", + "Senkaku_Islands_bassin_10", + "Senkaku_Islands_bassin_11", + "Senkaku_Islands_bassin_12", + "Senkaku_Islands", + "Senkaku_Islands_bassin_5", + "Senkaku_Islands_bassin_6", + "Senkaku_Islands_bassin_7", + "Senkaku_Islands_bassin_8", + "Senkaku_Islands_bassin_9", + "Serbia_bassin_10", + "Serbia_bassin_11", + "Serbia_bassin_12", + "Serbia", + "Serbia_bassin_5", + "Serbia_bassin_6", + "Serbia_bassin_7", + "Serbia_bassin_8", + "Serbia_bassin_9", + "Seychelles_bassin_10", + "Seychelles_bassin_11", + "Seychelles_bassin_12", + "Seychelles", + "Seychelles_bassin_5", + "Seychelles_bassin_6", + "Seychelles_bassin_7", + "Seychelles_bassin_8", + "Seychelles_bassin_9", + "Sierra_Leone_bassin_10", + "Sierra_Leone_bassin_11", + "Sierra_Leone_bassin_12", + "Sierra_Leone", + "Sierra_Leone_bassin_5", + "Sierra_Leone_bassin_6", + "Sierra_Leone_bassin_7", + "Sierra_Leone_bassin_8", + "Sierra_Leone_bassin_9", + "Singapore_bassin_10", + "Singapore_bassin_11", + "Singapore_bassin_12", + "Singapore", + "Singapore_bassin_5", + "Singapore_bassin_6", + "Singapore_bassin_7", + "Singapore_bassin_8", + "Singapore_bassin_9", + "Slovakia_bassin_10", + "Slovakia_bassin_11", + "Slovakia_bassin_12", + "Slovakia", + "Slovakia_bassin_5", + "Slovakia_bassin_6", + "Slovakia_bassin_7", + "Slovakia_bassin_8", + "Slovakia_bassin_9", + "Slovenia_bassin_10", + "Slovenia_bassin_11", + "Slovenia_bassin_12", + "Slovenia", + "Slovenia_bassin_5", + "Slovenia_bassin_6", + "Slovenia_bassin_7", + "Slovenia_bassin_8", + "Slovenia_bassin_9", + "Solomon_Islands_bassin_10", + "Solomon_Islands_bassin_11", + "Solomon_Islands_bassin_12", + "Solomon_Islands", + "Solomon_Islands_bassin_5", + "Solomon_Islands_bassin_6", + "Solomon_Islands_bassin_7", + "Solomon_Islands_bassin_8", + "Solomon_Islands_bassin_9", + "Somalia_bassin_10", + "Somalia_bassin_11", + "Somalia_bassin_12", + "Somalia", + "Somalia_bassin_5", + "Somalia_bassin_6", + "Somalia_bassin_7", + "Somalia_bassin_8", + "Somalia_bassin_9", + "South_Africa_bassin_10", + "South_Africa_bassin_11", + "South_Africa_bassin_12", + "South_Africa", + "South_Africa_bassin_5", + "South_Africa_bassin_6", + "South_Africa_bassin_7", + "South_Africa_bassin_8", + "South_Africa_bassin_9", + "South_Georgia and the South Sandwich Islands_bassin_10", + "South_Georgia and the South Sandwich Islands_bassin_11", + "South_Georgia and the South Sandwich Islands_bassin_12", + "South_Georgia and the South Sandwich Islands", + "South_Georgia and the South Sandwich Islands_bassin_5", + "South_Georgia and the South Sandwich Islands_bassin_6", + "South_Georgia and the South Sandwich Islands_bassin_7", + "South_Georgia and the South Sandwich Islands_bassin_8", + "South_Georgia and the South Sandwich Islands_bassin_9", + "South_Sudan_bassin_10", + "South_Sudan_bassin_11", + "South_Sudan_bassin_12", + "South_Sudan", + "South_Sudan_bassin_5", + "South_Sudan_bassin_6", + "South_Sudan_bassin_7", + "South_Sudan_bassin_8", + "South_Sudan_bassin_9", + "Spain_bassin_10", + "Spain_bassin_11", + "Spain_bassin_12", + "Spain", + "Spain_bassin_5", + "Spain_bassin_6", + "Spain_bassin_7", + "Spain_bassin_8", + "Spain_bassin_9", + "Spratly_Islands_bassin_10", + "Spratly_Islands_bassin_11", + "Spratly_Islands_bassin_12", + "Spratly_Islands", + "Spratly_Islands_bassin_5", + "Spratly_Islands_bassin_6", + "Spratly_Islands_bassin_7", + "Spratly_Islands_bassin_8", + "Spratly_Islands_bassin_9", + "Sri_Lanka_bassin_10", + "Sri_Lanka_bassin_11", + "Sri_Lanka_bassin_12", + "Sri_Lanka", + "Sri_Lanka_bassin_5", + "Sri_Lanka_bassin_6", + "Sri_Lanka_bassin_7", + "Sri_Lanka_bassin_8", + "Sri_Lanka_bassin_9", + "Suriname_bassin_10", + "Suriname_bassin_11", + "Suriname_bassin_12", + "Suriname", + "Suriname_bassin_5", + "Suriname_bassin_6", + "Suriname_bassin_7", + "Suriname_bassin_8", + "Suriname_bassin_9", + "Svalbard_and Jan Mayen Islands_bassin_10", + "Svalbard_and Jan Mayen Islands_bassin_11", + "Svalbard_and Jan Mayen Islands_bassin_12", + "Svalbard_and Jan Mayen Islands", + "Svalbard_and Jan Mayen Islands_bassin_5", + "Svalbard_and Jan Mayen Islands_bassin_6", + "Svalbard_and Jan Mayen Islands_bassin_7", + "Svalbard_and Jan Mayen Islands_bassin_8", + "Svalbard_and Jan Mayen Islands_bassin_9", + "Swaziland_bassin_10", + "Swaziland_bassin_11", + "Swaziland_bassin_12", + "Swaziland", + "Swaziland_bassin_5", + "Swaziland_bassin_6", + "Swaziland_bassin_7", + "Swaziland_bassin_8", + "Swaziland_bassin_9", + "Sweden_bassin_10", + "Sweden_bassin_11", + "Sweden_bassin_12", + "Sweden", + "Sweden_bassin_5", + "Sweden_bassin_6", + "Sweden_bassin_7", + "Sweden_bassin_8", + "Sweden_bassin_9", + "Switzerland_bassin_10", + "Switzerland_bassin_11", + "Switzerland_bassin_12", + "Switzerland", + "Switzerland_bassin_5", + "Switzerland_bassin_6", + "Switzerland_bassin_7", + "Switzerland_bassin_8", + "Switzerland_bassin_9", + "Syrian_Arab Republic_bassin_10", + "Syrian_Arab Republic_bassin_11", + "Syrian_Arab Republic_bassin_12", + "Syrian_Arab Republic", + "Syrian_Arab Republic_bassin_5", + "Syrian_Arab Republic_bassin_6", + "Syrian_Arab Republic_bassin_7", + "Syrian_Arab Republic_bassin_8", + "Syrian_Arab Republic_bassin_9", + "Taiwan_bassin_10", + "Taiwan_bassin_11", + "Taiwan_bassin_12", + "Taiwan", + "Taiwan_bassin_5", + "Taiwan_bassin_6", + "Taiwan_bassin_7", + "Taiwan_bassin_8", + "Taiwan_bassin_9", + "Tajikistan_bassin_10", + "Tajikistan_bassin_11", + "Tajikistan_bassin_12", + "Tajikistan", + "Tajikistan_bassin_5", + "Tajikistan_bassin_6", + "Tajikistan_bassin_7", + "Tajikistan_bassin_8", + "Tajikistan_bassin_9", + "Thailand_bassin_10", + "Thailand_bassin_11", + "Thailand_bassin_12", + "Thailand", + "Thailand_bassin_5", + "Thailand_bassin_6", + "Thailand_bassin_7", + "Thailand_bassin_8", + "Thailand_bassin_9", + "The_former Yugoslav Republic of Macedonia_bassin_10", + "The_former Yugoslav Republic of Macedonia_bassin_11", + "The_former Yugoslav Republic of Macedonia_bassin_12", + "The_former Yugoslav Republic of Macedonia", + "The_former Yugoslav Republic of Macedonia_bassin_5", + "The_former Yugoslav Republic of Macedonia_bassin_6", + "The_former Yugoslav Republic of Macedonia_bassin_7", + "The_former Yugoslav Republic of Macedonia_bassin_8", + "The_former Yugoslav Republic of Macedonia_bassin_9", + "Timor-Leste_bassin_10", + "Timor-Leste_bassin_11", + "Timor-Leste_bassin_12", + "Timor-Leste", + "Timor-Leste_bassin_5", + "Timor-Leste_bassin_6", + "Timor-Leste_bassin_7", + "Timor-Leste_bassin_8", + "Timor-Leste_bassin_9", + "Togo_bassin_10", + "Togo_bassin_11", + "Togo_bassin_12", + "Togo", + "Togo_bassin_5", + "Togo_bassin_6", + "Togo_bassin_7", + "Togo_bassin_8", + "Togo_bassin_9", + "Tokelau_bassin_10", + "Tokelau_bassin_11", + "Tokelau_bassin_12", + "Tokelau", + "Tokelau_bassin_5", + "Tokelau_bassin_6", + "Tokelau_bassin_7", + "Tokelau_bassin_8", + "Tokelau_bassin_9", + "Tonga_bassin_10", + "Tonga_bassin_11", + "Tonga_bassin_12", + "Tonga", + "Tonga_bassin_5", + "Tonga_bassin_6", + "Tonga_bassin_7", + "Tonga_bassin_8", + "Tonga_bassin_9", + "Trinidad_and Tobago_bassin_10", + "Trinidad_and Tobago_bassin_11", + "Trinidad_and Tobago_bassin_12", + "Trinidad_and Tobago", + "Trinidad_and Tobago_bassin_5", + "Trinidad_and Tobago_bassin_6", + "Trinidad_and Tobago_bassin_7", + "Trinidad_and Tobago_bassin_8", + "Trinidad_and Tobago_bassin_9", + "Tromelin_Island_bassin_10", + "Tromelin_Island_bassin_11", + "Tromelin_Island_bassin_12", + "Tromelin_Island", + "Tromelin_Island_bassin_5", + "Tromelin_Island_bassin_6", + "Tromelin_Island_bassin_7", + "Tromelin_Island_bassin_8", + "Tromelin_Island_bassin_9", + "Tunisia_bassin_10", + "Tunisia_bassin_11", + "Tunisia_bassin_12", + "Tunisia", + "Tunisia_bassin_5", + "Tunisia_bassin_6", + "Tunisia_bassin_7", + "Tunisia_bassin_8", + "Tunisia_bassin_9", + "Turkey_bassin_10", + "Turkey_bassin_11", + "Turkey_bassin_12", + "Turkey", + "Turkey_bassin_5", + "Turkey_bassin_6", + "Turkey_bassin_7", + "Turkey_bassin_8", + "Turkey_bassin_9", + "Turkmenistan_bassin_10", + "Turkmenistan_bassin_11", + "Turkmenistan_bassin_12", + "Turkmenistan", + "Turkmenistan_bassin_5", + "Turkmenistan_bassin_6", + "Turkmenistan_bassin_7", + "Turkmenistan_bassin_8", + "Turkmenistan_bassin_9", + "Turks_and Caicos islands_bassin_10", + "Turks_and Caicos islands_bassin_11", + "Turks_and Caicos islands_bassin_12", + "Turks_and Caicos islands", + "Turks_and Caicos islands_bassin_5", + "Turks_and Caicos islands_bassin_6", + "Turks_and Caicos islands_bassin_7", + "Turks_and Caicos islands_bassin_8", + "Turks_and Caicos islands_bassin_9", + "Tuvalu_bassin_10", + "Tuvalu_bassin_11", + "Tuvalu_bassin_12", + "Tuvalu", + "Tuvalu_bassin_5", + "Tuvalu_bassin_6", + "Tuvalu_bassin_7", + "Tuvalu_bassin_8", + "Tuvalu_bassin_9", + "Uganda_bassin_10", + "Uganda_bassin_11", + "Uganda_bassin_12", + "Uganda", + "Uganda_bassin_5", + "Uganda_bassin_6", + "Uganda_bassin_7", + "Uganda_bassin_8", + "Uganda_bassin_9", + "Ukraine_bassin_10", + "Ukraine_bassin_11", + "Ukraine_bassin_12", + "Ukraine", + "Ukraine_bassin_5", + "Ukraine_bassin_6", + "Ukraine_bassin_7", + "Ukraine_bassin_8", + "Ukraine_bassin_9", + "UK_of Great Britain and Northern Ireland_bassin_10", + "UK_of Great Britain and Northern Ireland_bassin_11", + "UK_of Great Britain and Northern Ireland_bassin_12", + "UK_of Great Britain and Northern Ireland", + "UK_of Great Britain and Northern Ireland_bassin_5", + "UK_of Great Britain and Northern Ireland_bassin_6", + "UK_of Great Britain and Northern Ireland_bassin_7", + "UK_of Great Britain and Northern Ireland_bassin_8", + "UK_of Great Britain and Northern Ireland_bassin_9", + "United_Arab Emirates_bassin_10", + "United_Arab Emirates_bassin_11", + "United_Arab Emirates_bassin_12", + "United_Arab Emirates", + "United_Arab Emirates_bassin_5", + "United_Arab Emirates_bassin_6", + "United_Arab Emirates_bassin_7", + "United_Arab Emirates_bassin_8", + "United_Arab Emirates_bassin_9", + "United_Republic of Tanzania_bassin_10", + "United_Republic of Tanzania_bassin_11", + "United_Republic of Tanzania_bassin_12", + "United_Republic of Tanzania", + "United_Republic of Tanzania_bassin_5", + "United_Republic of Tanzania_bassin_6", + "United_Republic of Tanzania_bassin_7", + "United_Republic of Tanzania_bassin_8", + "United_Republic of Tanzania_bassin_9", + "United_States of America_bassin_10", + "United_States of America_bassin_11", + "United_States of America_bassin_12", + "United_States of America", + "United_States of America_bassin_5", + "United_States of America_bassin_6", + "United_States of America_bassin_7", + "United_States of America_bassin_8", + "United_States of America_bassin_9", + "United_States Virgin Islands_bassin_10", + "United_States Virgin Islands_bassin_11", + "United_States Virgin Islands_bassin_12", + "United_States Virgin Islands", + "United_States Virgin Islands_bassin_5", + "United_States Virgin Islands_bassin_6", + "United_States Virgin Islands_bassin_7", + "United_States Virgin Islands_bassin_8", + "United_States Virgin Islands_bassin_9", + "Uruguay_bassin_10", + "Uruguay_bassin_11", + "Uruguay_bassin_12", + "Uruguay", + "Uruguay_bassin_5", + "Uruguay_bassin_6", + "Uruguay_bassin_7", + "Uruguay_bassin_8", + "Uruguay_bassin_9", + "Uzbekistan_bassin_10", + "Uzbekistan_bassin_11", + "Uzbekistan_bassin_12", + "Uzbekistan", + "Uzbekistan_bassin_5", + "Uzbekistan_bassin_6", + "Uzbekistan_bassin_7", + "Uzbekistan_bassin_8", + "Uzbekistan_bassin_9", + "Vanuatu_bassin_10", + "Vanuatu_bassin_11", + "Vanuatu_bassin_12", + "Vanuatu", + "Vanuatu_bassin_5", + "Vanuatu_bassin_6", + "Vanuatu_bassin_7", + "Vanuatu_bassin_8", + "Vanuatu_bassin_9", + "Venezuela_bassin_10", + "Venezuela_bassin_11", + "Venezuela_bassin_12", + "Venezuela", + "Venezuela_bassin_5", + "Venezuela_bassin_6", + "Venezuela_bassin_7", + "Venezuela_bassin_8", + "Venezuela_bassin_9", + "Viet_Nam_bassin_10", + "Viet_Nam_bassin_11", + "Viet_Nam_bassin_12", + "Viet_Nam", + "Viet_Nam_bassin_5", + "Viet_Nam_bassin_6", + "Viet_Nam_bassin_7", + "Viet_Nam_bassin_8", + "Viet_Nam_bassin_9", + "Wake_Island_bassin_10", + "Wake_Island_bassin_11", + "Wake_Island_bassin_12", + "Wake_Island", + "Wake_Island_bassin_5", + "Wake_Island_bassin_6", + "Wake_Island_bassin_7", + "Wake_Island_bassin_8", + "Wake_Island_bassin_9", + "Wallis_and Futuna_bassin_10", + "Wallis_and Futuna_bassin_11", + "Wallis_and Futuna_bassin_12", + "Wallis_and Futuna", + "Wallis_and Futuna_bassin_5", + "Wallis_and Futuna_bassin_6", + "Wallis_and Futuna_bassin_7", + "Wallis_and Futuna_bassin_8", + "Wallis_and Futuna_bassin_9", + "Western_Sahara_bassin_10", + "Western_Sahara_bassin_11", + "Western_Sahara_bassin_12", + "Western_Sahara", + "Western_Sahara_bassin_5", + "Western_Sahara_bassin_6", + "Western_Sahara_bassin_7", + "Western_Sahara_bassin_8", + "Western_Sahara_bassin_9", + "West_Bank_bassin_10", + "West_Bank_bassin_11", + "West_Bank_bassin_12", + "West_Bank", + "West_Bank_bassin_5", + "West_Bank_bassin_6", + "West_Bank_bassin_7", + "West_Bank_bassin_8", + "West_Bank_bassin_9", + "Yemen_bassin_10", + "Yemen_bassin_11", + "Yemen_bassin_12", + "Yemen", + "Yemen_bassin_5", + "Yemen_bassin_6", + "Yemen_bassin_7", + "Yemen_bassin_8", + "Yemen_bassin_9", + "Zambia_bassin_10", + "Zambia_bassin_11", + "Zambia_bassin_12", + "Zambia", + "Zambia_bassin_5", + "Zambia_bassin_6", + "Zambia_bassin_7", + "Zambia_bassin_8", + "Zambia_bassin_9", + "Zimbabwe_bassin_10", + "Zimbabwe_bassin_11", + "Zimbabwe_bassin_12", + "Zimbabwe", + "Zimbabwe_bassin_5", + "Zimbabwe_bassin_6", + "Zimbabwe_bassin_7", + "Zimbabwe_bassin_8", + "Zimbabwe_bassin_9" + ) ); + + public static void main(String[] args) { + + ArrayList missingCountries = new ArrayList(); + + for (String country : allCountryNames) { + if( !filesGenerated.contains(country) ) { + missingCountries.add( country); + } + } + System.out.println( missingCountries.size() ); + System.out.println( missingCountries ); + + String finalCountries = ""; + for (String missing : missingCountries) { + finalCountries += '"' + missing.replaceAll( "_", " ") + "\", "; + } + System.out.println( finalCountries ); + + } + + +} From c4fa4c0172b09ab05cac5f2365d75f2b548c01a9 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:28 +0100 Subject: [PATCH 0058/1620] New translations findMissingCountries.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 1969 ++++++++++++++++- 1 file changed, 1895 insertions(+), 74 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 499b7cb5ec..768f973a7f 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,74 +1,1895 @@ -package org.openforis.collect.earth.app.ad_hoc; - -import java.util.List; - -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.manager.RecordManager; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.CollectRecordSummary; -import org.openforis.collect.model.RecordFilter; -import org.openforis.idm.model.Coordinate; -import org.openforis.idm.model.CoordinateAttribute; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public abstract class FixCoordinates { - - @Autowired - private RecordManager recordManager; - - @Autowired - private EarthSurveyService earthSurveyService; - - private Logger logger = LoggerFactory.getLogger( FixCoordinates.class); - - private boolean stopFix = false; - - private List getAllRecords(){ - RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); - return recordManager.loadSummaries( rf ); - } - - public void fixCoordinates(){ - List allRecords = getAllRecords(); - - if( shouldStopFixing()){ - return; - } - - for (CollectRecordSummary summaryCollectRecord : allRecords) { - if( shouldStopFixing()){ - break; - } - try { - CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); - CoordinateAttribute plotCoord = (CoordinateAttribute) collectRecord.getNodeByPath("/plot/location"); //$NON-NLS-1$ - if( plotCoord != null && plotCoord.getValue() != null && plotCoord.getValue().getX() < getLongitudeLimit() ){ - Coordinate coordinate = new Coordinate(plotCoord.getValue().getY(), plotCoord.getValue().getX(), plotCoord.getValue().getSrsId() ); - plotCoord.setValue( coordinate ); - recordManager.save( collectRecord ); - } - } catch (Exception e) { - logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ - } - } - - } - - protected abstract int getLongitudeLimit(); - - private boolean shouldStopFixing() { - return stopFix; - } - - public void stopFixing() { - stopFix = true; - - } - -} \ No newline at end of file +package org.openforis.collect.earth.app.ad_hoc; + +import java.util.ArrayList; +import java.util.Arrays; + +public class findMissingCountries { + + private static ArrayList allCountryNames = new ArrayList<>( + Arrays.asList( + "Abyei", + "Afghanistan", + "Aksai_Chin", + "Albania", + "Algeria", + "American_Samoa", + "Andorra", + "Angola", + "Anguilla", + "Antarctica", + "Antigua_and_Barbuda", + "Argentina", + "Armenia", + "Aruba", + "Arunachal_Pradesh", + "Ashmore_and_Cartier_Islands", + "Australia", + "Austria", + "Azerbaijan", + "Azores_Islands", + "Bahamas", + "Bahrain", + "Baker_Island", + "Bangladesh", + "Barbados", + "Bassas_da_India", + "Belarus", + "Belgium", + "Belize", + "Benin", + "Bermuda", + "Bhutan", + "Bird_Island", + "Bolivia", + "Bosnia_and_Herzegovina", + "Botswana", + "Bouvet_Island", + "Brazil", + "British_Indian_Ocean_Territory", + "British_Virgin_Islands", + "Brunei_Darussalam", + "Bulgaria", + "Burkina_Faso", + "Burundi", + "Cambodia", + "Cameroon", + "Canada", + "Cape_Verde", + "Cayman_Islands", + "Central_African_Republic", + "Chad", + "Chile", + "China", + "China/India", + "Christmas_Island", + "Clipperton_Island", + "Cocos__Keeling__Islands", + "Colombia", + "Comoros", + "Congo", + "Cook_Islands", + "Costa_Rica", + "Croatia", + "Cuba", + "Cyprus", + "Czech_Republic", + "C�te_d_Ivoire", + "Dem_People_s_Rep_of_Korea", + "Democratic_Republic_of_the_Congo", + "Denmark", + "Djibouti", + "Dominica", + "Dominican_Republic", + "Ecuador", + "Egypt", + "El_Salvador", + "Equatorial_Guinea", + "Eritrea", + "Estonia", + "Ethiopia", + "Europa_Island", + "Falkland_Islands__Malvinas_", + "Faroe_Islands", + "Fiji", + "Finland", + "France", + "French_Guiana", + "French_Polynesia", + "French_Southern_and_Antarctic_Territories", + "Gabon", + "Gambia", + "Gaza_Strip", + "Georgia", + "Germany", + "Ghana", + "Gibraltar", + "Glorioso_Island", + "Greece", + "Greenland", + "Grenada", + "Guadeloupe", + "Guam", + "Guatemala", + "Guernsey", + "Guinea", + "Guinea-Bissau", + "Guyana", + "Haiti", + "Hala_ib_triangle", + "Heard_Island_and_McDonald_Islands", + "Holy_See", + "Honduras", + "Hong_Kong", + "Howland_Island", + "Hungary", + "Iceland", + "Ilemi_triangle", + "India", + "Indonesia", + "Iran___Islamic_Republic_of_", + "Iraq", + "Ireland", + "Isle_of_Man", + "Israel", + "Italy", + "Jamaica", + "Jammu_and_Kashmir", + "Japan", + "Jarvis_Island", + "Jersey", + "Johnston_Atoll", + "Jordan", + "Juan_de_Nova_Island", + "Kazakhstan", + "Kenya", + "Kingman_Reef", + "Kiribati", + "Kuril_islands", + "Kuwait", + "Kyrgyzstan", + "Lao_People_s_Democratic_Republic", + "Latvia", + "Lebanon", + "Lesotho", + "Liberia", + "Libya", + "Liechtenstein", + "Lithuania", + "Luxembourg", + "Ma_tan_al-Sarra", + "Macau", + "Madagascar", + "Madeira_Islands", + "Malawi", + "Malaysia", + "Maldives", + "Mali", + "Malta", + "Marshall_Islands", + "Martinique", + "Mauritania", + "Mauritius", + "Mayotte", + "Mexico", + "Micronesia__Federated_States_of_", + "Midway_Island", + "Moldova,_Republic_of", + "Monaco", + "Mongolia", + "Montenegro", + "Montserrat", + "Morocco", + "Mozambique", + "Myanmar", + "Namibia", + "Nauru", + "Navassa_Island", + "Nepal", + "Netherlands", + "Netherlands_Antilles", + "New_Caledonia", + "New_Zealand", + "Nicaragua", + "Niger", + "Nigeria", + "Niue", + "Norfolk_Island", + "Northern_Mariana_Islands", + "Norway", + "Oman", + "Pakistan", + "Palau", + "Palmyra_Atoll", + "Panama", + "Papua_New_Guinea", + "Paracel_Islands", + "Paraguay", + "Peru", + "Philippines", + "Pitcairn", + "Poland", + "Portugal", + "Puerto_Rico", + "Qatar", + "Republic_of_Korea", + "Romania", + "Russian_Federation", + "Rwanda", + "R�union", + "Saint_Helena", + "Saint_Kitts_and_Nevis", + "Saint_Lucia", + "Saint_Pierre_et_Miquelon", + "Saint_Vincent_and_the_Grenadines", + "Samoa", + "San_Marino", + "Sao_Tome_and_Principe", + "Saudi_Arabia", + "Scarborough_Reef", + "Senegal", + "Senkaku_Islands", + "Serbia", + "Seychelles", + "Sierra_Leone", + "Singapore", + "Slovakia", + "Slovenia", + "Solomon_Islands", + "Somalia", + "South_Africa", + "South_Georgia_and_the_South_Sandwich_Islands", + "South_Sudan", + "Spain", + "Spratly_Islands", + "Sri_Lanka", + "Sudan", + "Suriname", + "Svalbard_and_Jan_Mayen_Islands", + "Swaziland", + "Sweden", + "Switzerland", + "Syrian_Arab_Republic", + "Taiwan", + "Tajikistan", + "Thailand", + "The_former_Yugoslav_Republic_of_Macedonia", + "Timor-Leste", + "Togo", + "Tokelau", + "Tonga", + "Trinidad_and_Tobago", + "Tromelin_Island", + "Tunisia", + "Turkey", + "Turkmenistan", + "Turks_and_Caicos_islands", + "Tuvalu", + "UK_of_Great_Britain_and_Northern_Ireland", + "Uganda", + "Ukraine", + "United_Arab_Emirates", + "United_Republic_of_Tanzania", + "United_States_Virgin_Islands", + "United_States_of_America", + "Uruguay", + "Uzbekistan", + "Vanuatu", + "Venezuela", + "Viet_Nam", + "Wake_Island", + "Wallis_and_Futuna", + "West_Bank", + "Western_Sahara", + "Yemen", + "Zambia", + "Zimbabwe" ) ); + + private static ArrayList filesGenerated = new ArrayList<>( + Arrays.asList( "Azores_Islands_bassin_10", + "Azores_Islands_bassin_11", + "Azores_Islands_bassin_12", + "Azores_Islands", + "Azores_Islands_bassin_5", + "Azores_Islands_bassin_6", + "Azores_Islands_bassin_7", + "Azores_Islands_bassin_8", + "Azores_Islands_bassin_9", + "Brunei_Darussalam_bassin_10", + "Brunei_Darussalam_bassin_11", + "Brunei_Darussalam_bassin_12", + "Brunei_Darussalam_bassin_7", + "Brunei_Darussalam_bassin_8", + "Brunei_Darussalam_bassin_9", + "Bulgaria_bassin_10", + "Bulgaria_bassin_11", + "Bulgaria_bassin_12", + "Bulgaria", + "Bulgaria_bassin_5", + "Bulgaria_bassin_6", + "Bulgaria_bassin_7", + "Bulgaria_bassin_8", + "Bulgaria_bassin_9", + "Burkina_Faso_bassin_10", + "Burkina_Faso_bassin_11", + "Burkina_Faso_bassin_12", + "Burkina_Faso", + "Burkina_Faso_bassin_5", + "Burkina_Faso_bassin_6", + "Burkina_Faso_bassin_7", + "Burkina_Faso_bassin_8", + "Burkina_Faso_bassin_9", + "Burundi_bassin_10", + "Burundi_bassin_11", + "Burundi_bassin_12", + "Burundi", + "Burundi_bassin_5", + "Burundi_bassin_6", + "Burundi_bassin_7", + "Burundi_bassin_8", + "Burundi_bassin_9", + "Cambodia_bassin_10", + "Cambodia_bassin_11", + "Cambodia_bassin_12", + "Cambodia", + "Cambodia_bassin_5", + "Cambodia_bassin_6", + "Cambodia_bassin_7", + "Cambodia_bassin_8", + "Cambodia_bassin_9", + "Cameroon_bassin_10", + "Cameroon_bassin_11", + "Cameroon_bassin_12", + "Cameroon", + "Cameroon_bassin_5", + "Cameroon_bassin_6", + "Cameroon_bassin_7", + "Cameroon_bassin_8", + "Cameroon_bassin_9", + "Canada_bassin_10", + "Canada_bassin_11", + "Canada_bassin_12", + "Canada", + "Canada_bassin_5", + "Canada_bassin_6", + "Canada_bassin_7", + "Canada_bassin_8", + "Canada_bassin_9", + "Cape_Verde_bassin_10", + "Cape_Verde_bassin_11", + "Cape_Verde_bassin_12", + "Cape_Verde", + "Cape_Verde_bassin_5", + "Cape_Verde_bassin_6", + "Cape_Verde_bassin_7", + "Cape_Verde_bassin_8", + "Cape_Verde_bassin_9", + "Cayman_Islands_bassin_10", + "Cayman_Islands_bassin_11", + "Cayman_Islands_bassin_12", + "Cayman_Islands", + "Cayman_Islands_bassin_5", + "Cayman_Islands_bassin_6", + "Cayman_Islands_bassin_7", + "Cayman_Islands_bassin_8", + "Cayman_Islands_bassin_9", + "Central_African Republic_bassin_10", + "Central_African Republic_bassin_11", + "Central_African Republic_bassin_12", + "Central_African Republic", + "Central_African Republic_bassin_5", + "Central_African Republic_bassin_6", + "Central_African Republic_bassin_7", + "Central_African Republic_bassin_8", + "Central_African Republic_bassin_9", + "Chad_bassin_10", + "Chad_bassin_11", + "Chad_bassin_12", + "Chad", + "Chad_bassin_5", + "Chad_bassin_6", + "Chad_bassin_7", + "Chad_bassin_8", + "Chad_bassin_9", + "Chile_bassin_10", + "Chile_bassin_11", + "Chile_bassin_12", + "Chile", + "Chile_bassin_5", + "Chile_bassin_6", + "Chile_bassin_7", + "Chile_bassin_8", + "Chile_bassin_9", + "China_bassin_10", + "China_bassin_11", + "China_bassin_12", + "China", + "China_bassin_5", + "China_bassin_6", + "China_bassin_7", + "China_bassin_8", + "China_bassin_9", + "Christmas_Island_bassin_10", + "Christmas_Island_bassin_11", + "Christmas_Island_bassin_12", + "Christmas_Island", + "Christmas_Island_bassin_5", + "Christmas_Island_bassin_6", + "Christmas_Island_bassin_7", + "Christmas_Island_bassin_8", + "Christmas_Island_bassin_9", + "Clipperton_Island_bassin_10", + "Clipperton_Island_bassin_11", + "Clipperton_Island_bassin_12", + "Clipperton_Island", + "Clipperton_Island_bassin_5", + "Clipperton_Island_bassin_6", + "Clipperton_Island_bassin_7", + "Clipperton_Island_bassin_8", + "Clipperton_Island_bassin_9", + "Colombia_bassin_10", + "Colombia_bassin_11", + "Colombia_bassin_12", + "Colombia", + "Colombia_bassin_5", + "Colombia_bassin_6", + "Colombia_bassin_7", + "Colombia_bassin_8", + "Colombia_bassin_9", + "Comoros_bassin_10", + "Comoros_bassin_11", + "Comoros_bassin_12", + "Comoros", + "Comoros_bassin_5", + "Comoros_bassin_6", + "Comoros_bassin_7", + "Comoros_bassin_8", + "Comoros_bassin_9", + "Congo_bassin_10", + "Congo_bassin_11", + "Congo_bassin_12", + "Congo", + "Congo_bassin_5", + "Congo_bassin_6", + "Congo_bassin_7", + "Congo_bassin_8", + "Congo_bassin_9", + "Cook_Islands_bassin_10", + "Cook_Islands_bassin_11", + "Cook_Islands_bassin_12", + "Cook_Islands", + "Cook_Islands_bassin_5", + "Cook_Islands_bassin_6", + "Cook_Islands_bassin_7", + "Cook_Islands_bassin_8", + "Cook_Islands_bassin_9", + "Costa_Rica_bassin_10", + "Costa_Rica_bassin_11", + "Costa_Rica_bassin_12", + "Costa_Rica", + "Costa_Rica_bassin_5", + "Costa_Rica_bassin_6", + "Costa_Rica_bassin_7", + "Costa_Rica_bassin_8", + "Costa_Rica_bassin_9", + "Croatia_bassin_10", + "Croatia_bassin_11", + "Croatia_bassin_12", + "Croatia", + "Croatia_bassin_5", + "Croatia_bassin_6", + "Croatia_bassin_7", + "Croatia_bassin_8", + "Croatia_bassin_9", + "Cuba_bassin_10", + "Cuba_bassin_11", + "Cuba_bassin_12", + "Cuba", + "Cuba_bassin_5", + "Cuba_bassin_6", + "Cuba_bassin_7", + "Cuba_bassin_8", + "Cuba_bassin_9", + "Cyprus_bassin_10", + "Cyprus_bassin_11", + "Cyprus_bassin_12", + "Cyprus", + "Cyprus_bassin_5", + "Cyprus_bassin_6", + "Cyprus_bassin_7", + "Cyprus_bassin_8", + "Cyprus_bassin_9", + "Czech_Republic_bassin_10", + "Czech_Republic_bassin_11", + "Czech_Republic_bassin_12", + "Czech_Republic", + "Czech_Republic_bassin_5", + "Czech_Republic_bassin_6", + "Czech_Republic_bassin_7", + "Czech_Republic_bassin_8", + "Czech_Republic_bassin_9", + "Democratic_Republic of the Congo_bassin_10", + "Democratic_Republic of the Congo_bassin_11", + "Democratic_Republic of the Congo_bassin_12", + "Democratic_Republic of the Congo", + "Democratic_Republic of the Congo_bassin_5", + "Democratic_Republic of the Congo_bassin_6", + "Democratic_Republic of the Congo_bassin_7", + "Democratic_Republic of the Congo_bassin_8", + "Democratic_Republic of the Congo_bassin_9", + "Dem_Peoples Rep of Korea_bassin_10", + "Dem_Peoples Rep of Korea_bassin_11", + "Dem_Peoples Rep of Korea_bassin_12", + "Dem_Peoples Rep of Korea", + "Dem_Peoples Rep of Korea_bassin_5", + "Dem_Peoples Rep of Korea_bassin_6", + "Dem_Peoples Rep of Korea_bassin_7", + "Dem_Peoples Rep of Korea_bassin_8", + "Dem_Peoples Rep of Korea_bassin_9", + "Denmark_bassin_10", + "Denmark_bassin_11", + "Denmark_bassin_12", + "Denmark", + "Denmark_bassin_5", + "Denmark_bassin_6", + "Denmark_bassin_7", + "Denmark_bassin_8", + "Denmark_bassin_9", + "Djibouti_bassin_10", + "Djibouti_bassin_11", + "Djibouti_bassin_12", + "Djibouti", + "Djibouti_bassin_5", + "Djibouti_bassin_6", + "Djibouti_bassin_7", + "Djibouti_bassin_8", + "Djibouti_bassin_9", + "Dominican_Republic_bassin_10", + "Dominican_Republic_bassin_11", + "Dominican_Republic_bassin_12", + "Dominican_Republic", + "Dominican_Republic_bassin_5", + "Dominican_Republic_bassin_6", + "Dominican_Republic_bassin_7", + "Dominican_Republic_bassin_8", + "Dominican_Republic_bassin_9", + "Dominica_bassin_10", + "Dominica_bassin_11", + "Dominica_bassin_12", + "Dominica", + "Dominica_bassin_5", + "Dominica_bassin_6", + "Dominica_bassin_7", + "Dominica_bassin_8", + "Dominica_bassin_9", + "Ecuador_bassin_10", + "Ecuador_bassin_11", + "Ecuador_bassin_12", + "Ecuador", + "Ecuador_bassin_5", + "Ecuador_bassin_6", + "Ecuador_bassin_7", + "Ecuador_bassin_8", + "Ecuador_bassin_9", + "Egypt_bassin_10", + "Egypt_bassin_11", + "Egypt_bassin_12", + "Egypt", + "Egypt_bassin_5", + "Egypt_bassin_6", + "Egypt_bassin_7", + "Egypt_bassin_8", + "Egypt_bassin_9", + "El_Salvador_bassin_10", + "El_Salvador_bassin_11", + "El_Salvador_bassin_12", + "El_Salvador", + "El_Salvador_bassin_5", + "El_Salvador_bassin_6", + "El_Salvador_bassin_7", + "El_Salvador_bassin_8", + "El_Salvador_bassin_9", + "Equatorial_Guinea_bassin_10", + "Equatorial_Guinea_bassin_11", + "Equatorial_Guinea_bassin_12", + "Equatorial_Guinea", + "Equatorial_Guinea_bassin_5", + "Equatorial_Guinea_bassin_6", + "Equatorial_Guinea_bassin_7", + "Equatorial_Guinea_bassin_8", + "Equatorial_Guinea_bassin_9", + "Eritrea_bassin_10", + "Eritrea_bassin_11", + "Eritrea_bassin_12", + "Eritrea", + "Eritrea_bassin_5", + "Eritrea_bassin_6", + "Eritrea_bassin_7", + "Eritrea_bassin_8", + "Eritrea_bassin_9", + "Estonia_bassin_10", + "Estonia_bassin_11", + "Estonia_bassin_12", + "Estonia", + "Estonia_bassin_5", + "Estonia_bassin_6", + "Estonia_bassin_7", + "Estonia_bassin_8", + "Estonia_bassin_9", + "Ethiopia_bassin_10", + "Ethiopia_bassin_11", + "Ethiopia_bassin_12", + "Ethiopia", + "Ethiopia_bassin_5", + "Ethiopia_bassin_6", + "Ethiopia_bassin_7", + "Ethiopia_bassin_8", + "Ethiopia_bassin_9", + "Europa_Island_bassin_10", + "Europa_Island_bassin_11", + "Europa_Island_bassin_12", + "Europa_Island", + "Europa_Island_bassin_5", + "Europa_Island_bassin_6", + "Europa_Island_bassin_7", + "Europa_Island_bassin_8", + "Europa_Island_bassin_9", + "Faroe_Islands_bassin_10", + "Faroe_Islands_bassin_11", + "Faroe_Islands_bassin_12", + "Faroe_Islands", + "Faroe_Islands_bassin_5", + "Faroe_Islands_bassin_6", + "Faroe_Islands_bassin_7", + "Faroe_Islands_bassin_8", + "Faroe_Islands_bassin_9", + "Fiji_bassin_10", + "Fiji_bassin_11", + "Fiji_bassin_12", + "Fiji", + "Fiji_bassin_5", + "Fiji_bassin_6", + "Fiji_bassin_7", + "Fiji_bassin_8", + "Fiji_bassin_9", + "Finland_bassin_10", + "Finland_bassin_11", + "Finland_bassin_12", + "Finland", + "Finland_bassin_5", + "Finland_bassin_6", + "Finland_bassin_7", + "Finland_bassin_8", + "Finland_bassin_9", + "France_bassin_10", + "France_bassin_11", + "France_bassin_12", + "France", + "France_bassin_5", + "France_bassin_6", + "France_bassin_7", + "France_bassin_8", + "France_bassin_9", + "French_Guiana_bassin_10", + "French_Guiana_bassin_11", + "French_Guiana_bassin_12", + "French_Guiana", + "French_Guiana_bassin_5", + "French_Guiana_bassin_6", + "French_Guiana_bassin_7", + "French_Guiana_bassin_8", + "French_Guiana_bassin_9", + "French_Polynesia_bassin_10", + "French_Polynesia_bassin_11", + "French_Polynesia_bassin_12", + "French_Polynesia", + "French_Polynesia_bassin_5", + "French_Polynesia_bassin_6", + "French_Polynesia_bassin_7", + "French_Polynesia_bassin_8", + "French_Polynesia_bassin_9", + "French_Southern and Antarctic Territories_bassin_10", + "French_Southern and Antarctic Territories_bassin_11", + "French_Southern and Antarctic Territories_bassin_12", + "French_Southern and Antarctic Territories", + "French_Southern and Antarctic Territories_bassin_5", + "French_Southern and Antarctic Territories_bassin_6", + "French_Southern and Antarctic Territories_bassin_7", + "French_Southern and Antarctic Territories_bassin_8", + "French_Southern and Antarctic Territories_bassin_9", + "Gabon_bassin_10", + "Gabon_bassin_11", + "Gabon_bassin_12", + "Gabon", + "Gabon_bassin_5", + "Gabon_bassin_6", + "Gabon_bassin_7", + "Gabon_bassin_8", + "Gabon_bassin_9", + "Gambia_bassin_10", + "Gambia_bassin_11", + "Gambia_bassin_12", + "Gambia", + "Gambia_bassin_5", + "Gambia_bassin_6", + "Gambia_bassin_7", + "Gambia_bassin_8", + "Gambia_bassin_9", + "Gaza_Strip_bassin_10", + "Gaza_Strip_bassin_11", + "Gaza_Strip_bassin_12", + "Gaza_Strip", + "Gaza_Strip_bassin_5", + "Gaza_Strip_bassin_6", + "Gaza_Strip_bassin_7", + "Gaza_Strip_bassin_8", + "Gaza_Strip_bassin_9", + "Georgia_bassin_10", + "Georgia_bassin_11", + "Georgia_bassin_12", + "Georgia", + "Georgia_bassin_5", + "Georgia_bassin_6", + "Georgia_bassin_7", + "Georgia_bassin_8", + "Georgia_bassin_9", + "Germany_bassin_10", + "Germany_bassin_11", + "Germany_bassin_12", + "Germany", + "Germany_bassin_5", + "Germany_bassin_6", + "Germany_bassin_7", + "Germany_bassin_8", + "Germany_bassin_9", + "Ghana_bassin_10", + "Ghana_bassin_11", + "Ghana_bassin_12", + "Ghana", + "Ghana_bassin_5", + "Ghana_bassin_6", + "Ghana_bassin_8", + "Ghana_bassin_9", + "Gibraltar_bassin_10", + "Gibraltar_bassin_11", + "Gibraltar_bassin_12", + "Gibraltar", + "Gibraltar_bassin_5", + "Gibraltar_bassin_6", + "Gibraltar_bassin_7", + "Gibraltar_bassin_8", + "Gibraltar_bassin_9", + "Glorioso_Island_bassin_10", + "Glorioso_Island_bassin_11", + "Glorioso_Island_bassin_12", + "Glorioso_Island", + "Glorioso_Island_bassin_5", + "Glorioso_Island_bassin_6", + "Glorioso_Island_bassin_7", + "Glorioso_Island_bassin_8", + "Glorioso_Island_bassin_9", + "Greece_bassin_10", + "Greece_bassin_11", + "Greece_bassin_12", + "Greece", + "Greece_bassin_5", + "Greece_bassin_6", + "Greece_bassin_7", + "Greece_bassin_8", + "Greece_bassin_9", + "Greenland_bassin_10", + "Greenland_bassin_11", + "Greenland_bassin_12", + "Greenland", + "Greenland_bassin_5", + "Greenland_bassin_6", + "Greenland_bassin_7", + "Greenland_bassin_8", + "Greenland_bassin_9", + "Grenada_bassin_10", + "Grenada_bassin_11", + "Grenada_bassin_12", + "Grenada", + "Grenada_bassin_5", + "Grenada_bassin_6", + "Grenada_bassin_7", + "Grenada_bassin_8", + "Grenada_bassin_9", + "Guadeloupe_bassin_10", + "Guadeloupe_bassin_11", + "Guadeloupe_bassin_12", + "Guadeloupe", + "Guadeloupe_bassin_5", + "Guadeloupe_bassin_6", + "Guadeloupe_bassin_7", + "Guadeloupe_bassin_8", + "Guadeloupe_bassin_9", + "Guam_bassin_10", + "Guam_bassin_11", + "Guam_bassin_12", + "Guam", + "Guam_bassin_5", + "Guam_bassin_6", + "Guam_bassin_7", + "Guam_bassin_8", + "Guam_bassin_9", + "Halaib_triangle_bassin_10", + "Halaib_triangle_bassin_11", + "Halaib_triangle_bassin_12", + "Halaib_triangle", + "Halaib_triangle_bassin_5", + "Halaib_triangle_bassin_6", + "Halaib_triangle_bassin_7", + "Halaib_triangle_bassin_8", + "Halaib_triangle_bassin_9", + "Heard_Island and McDonald Islands_bassin_12", + "Holy_See_bassin_10", + "Holy_See_bassin_11", + "Holy_See_bassin_12", + "Holy_See", + "Holy_See_bassin_5", + "Holy_See_bassin_6", + "Holy_See_bassin_7", + "Holy_See_bassin_8", + "Holy_See_bassin_9", + "Honduras_bassin_10", + "Honduras_bassin_11", + "Honduras_bassin_12", + "Honduras", + "Honduras_bassin_5", + "Honduras_bassin_6", + "Honduras_bassin_7", + "Honduras_bassin_8", + "Honduras_bassin_9", + "Hong_Kong_bassin_10", + "Hong_Kong_bassin_11", + "Hong_Kong_bassin_12", + "Hong_Kong", + "Hong_Kong_bassin_5", + "Hong_Kong_bassin_6", + "Hong_Kong_bassin_7", + "Hong_Kong_bassin_8", + "Hong_Kong_bassin_9", + "Howland_Island_bassin_10", + "Howland_Island_bassin_11", + "Howland_Island_bassin_12", + "Howland_Island", + "Howland_Island_bassin_5", + "Howland_Island_bassin_6", + "Howland_Island_bassin_7", + "Howland_Island_bassin_8", + "Howland_Island_bassin_9", + "Hungary_bassin_10", + "Hungary_bassin_11", + "Hungary_bassin_12", + "Hungary", + "Hungary_bassin_5", + "Hungary_bassin_6", + "Hungary_bassin_7", + "Hungary_bassin_8", + "Hungary_bassin_9", + "Iceland_bassin_10", + "Iceland_bassin_11", + "Iceland_bassin_12", + "Iceland", + "Iceland_bassin_5", + "Iceland_bassin_6", + "Iceland_bassin_7", + "Iceland_bassin_8", + "Iceland_bassin_9", + "Ilemi_triangle_bassin_10", + "Ilemi_triangle_bassin_11", + "Ilemi_triangle_bassin_12", + "Ilemi_triangle", + "Ilemi_triangle_bassin_5", + "Ilemi_triangle_bassin_6", + "Ilemi_triangle_bassin_7", + "Ilemi_triangle_bassin_8", + "Ilemi_triangle_bassin_9", + "India_bassin_10", + "India_bassin_11", + "India_bassin_12", + "India", + "India_bassin_5", + "India_bassin_6", + "India_bassin_7", + "India_bassin_8", + "India_bassin_9", + "Indonesia_bassin_10", + "Indonesia_bassin_11", + "Indonesia_bassin_12", + "Indonesia", + "Indonesia_bassin_5", + "Indonesia_bassin_6", + "Indonesia_bassin_7", + "Indonesia_bassin_8", + "Indonesia_bassin_9", + "Iraq_bassin_10", + "Iraq_bassin_11", + "Iraq_bassin_12", + "Iraq", + "Iraq_bassin_5", + "Iraq_bassin_6", + "Iraq_bassin_7", + "Iraq_bassin_8", + "Iraq_bassin_9", + "Ireland_bassin_10", + "Ireland_bassin_11", + "Ireland_bassin_12", + "Ireland", + "Ireland_bassin_5", + "Ireland_bassin_6", + "Ireland_bassin_7", + "Ireland_bassin_8", + "Ireland_bassin_9", + "Isle_of Man_bassin_10", + "Isle_of Man_bassin_11", + "Isle_of Man_bassin_12", + "Isle_of Man", + "Isle_of Man_bassin_5", + "Isle_of Man_bassin_6", + "Isle_of Man_bassin_7", + "Isle_of Man_bassin_8", + "Isle_of Man_bassin_9", + "Israel_bassin_10", + "Israel_bassin_11", + "Israel_bassin_12", + "Israel", + "Israel_bassin_5", + "Israel_bassin_6", + "Israel_bassin_7", + "Israel_bassin_8", + "Israel_bassin_9", + "Italy_bassin_10", + "Italy_bassin_11", + "Italy_bassin_12", + "Italy", + "Italy_bassin_5", + "Italy_bassin_6", + "Italy_bassin_7", + "Italy_bassin_8", + "Italy_bassin_9", + "Jamaica_bassin_10", + "Jamaica_bassin_11", + "Jamaica_bassin_12", + "Jamaica", + "Jamaica_bassin_5", + "Jamaica_bassin_6", + "Jamaica_bassin_7", + "Jamaica_bassin_8", + "Jamaica_bassin_9", + "Jammu_and Kashmir_bassin_10", + "Jammu_and Kashmir_bassin_11", + "Jammu_and Kashmir_bassin_12", + "Jammu_and Kashmir", + "Jammu_and Kashmir_bassin_5", + "Jammu_and Kashmir_bassin_6", + "Jammu_and Kashmir_bassin_7", + "Jammu_and Kashmir_bassin_8", + "Jammu_and Kashmir_bassin_9", + "Japan_bassin_10", + "Japan_bassin_11", + "Japan_bassin_12", + "Japan", + "Japan_bassin_5", + "Japan_bassin_6", + "Japan_bassin_7", + "Japan_bassin_8", + "Japan_bassin_9", + "Jarvis_Island_bassin_10", + "Jarvis_Island_bassin_11", + "Jarvis_Island_bassin_12", + "Jarvis_Island", + "Jarvis_Island_bassin_5", + "Jarvis_Island_bassin_6", + "Jarvis_Island_bassin_7", + "Jarvis_Island_bassin_8", + "Jarvis_Island_bassin_9", + "Jersey_bassin_10", + "Jersey_bassin_11", + "Jersey_bassin_12", + "Jersey", + "Jersey_bassin_5", + "Jersey_bassin_6", + "Jersey_bassin_7", + "Jersey_bassin_8", + "Jersey_bassin_9", + "Johnston_Atoll_bassin_10", + "Johnston_Atoll_bassin_11", + "Johnston_Atoll_bassin_12", + "Johnston_Atoll", + "Johnston_Atoll_bassin_5", + "Johnston_Atoll_bassin_6", + "Johnston_Atoll_bassin_7", + "Johnston_Atoll_bassin_8", + "Johnston_Atoll_bassin_9", + "Jordan_bassin_10", + "Jordan_bassin_11", + "Jordan_bassin_12", + "Jordan", + "Jordan_bassin_5", + "Jordan_bassin_6", + "Jordan_bassin_7", + "Jordan_bassin_8", + "Jordan_bassin_9", + "Juan_de Nova Island_bassin_10", + "Juan_de Nova Island_bassin_11", + "Juan_de Nova Island_bassin_12", + "Juan_de Nova Island", + "Juan_de Nova Island_bassin_5", + "Juan_de Nova Island_bassin_6", + "Juan_de Nova Island_bassin_7", + "Juan_de Nova Island_bassin_8", + "Juan_de Nova Island_bassin_9", + "Kazakhstan_bassin_10", + "Kazakhstan_bassin_11", + "Kazakhstan_bassin_12", + "Kazakhstan", + "Kazakhstan_bassin_5", + "Kazakhstan_bassin_6", + "Kazakhstan_bassin_7", + "Kazakhstan_bassin_8", + "Kazakhstan_bassin_9", + "Kenya_bassin_10", + "Kenya_bassin_11", + "Kenya_bassin_12", + "Kenya", + "Kenya_bassin_5", + "Kenya_bassin_6", + "Kenya_bassin_7", + "Kenya_bassin_8", + "Kenya_bassin_9", + "Kingman_Reef_bassin_10", + "Kingman_Reef_bassin_11", + "Kingman_Reef_bassin_12", + "Kingman_Reef", + "Kingman_Reef_bassin_5", + "Kingman_Reef_bassin_6", + "Kingman_Reef_bassin_7", + "Kingman_Reef_bassin_8", + "Kingman_Reef_bassin_9", + "Kiribati_bassin_10", + "Kiribati_bassin_11", + "Kiribati_bassin_12", + "Kiribati", + "Kiribati_bassin_5", + "Kiribati_bassin_6", + "Kiribati_bassin_7", + "Kiribati_bassin_8", + "Kiribati_bassin_9", + "Kuril_islands_bassin_10", + "Kuril_islands_bassin_11", + "Kuril_islands_bassin_12", + "Kuril_islands", + "Kuril_islands_bassin_5", + "Kuril_islands_bassin_6", + "Kuril_islands_bassin_7", + "Kuril_islands_bassin_8", + "Kuril_islands_bassin_9", + "Kuwait_bassin_10", + "Kuwait_bassin_11", + "Kuwait_bassin_12", + "Kuwait", + "Kuwait_bassin_5", + "Kuwait_bassin_6", + "Kuwait_bassin_7", + "Kuwait_bassin_8", + "Kuwait_bassin_9", + "Kyrgyzstan_bassin_10", + "Kyrgyzstan_bassin_11", + "Kyrgyzstan_bassin_12", + "Kyrgyzstan", + "Kyrgyzstan_bassin_5", + "Kyrgyzstan_bassin_6", + "Kyrgyzstan_bassin_7", + "Kyrgyzstan_bassin_8", + "Kyrgyzstan_bassin_9", + "Lao_Peoples Democratic Republic_bassin_10", + "Lao_Peoples Democratic Republic_bassin_11", + "Lao_Peoples Democratic Republic_bassin_12", + "Lao_Peoples Democratic Republic", + "Lao_Peoples Democratic Republic_bassin_5", + "Lao_Peoples Democratic Republic_bassin_6", + "Lao_Peoples Democratic Republic_bassin_7", + "Lao_Peoples Democratic Republic_bassin_8", + "Lao_Peoples Democratic Republic_bassin_9", + "Latvia_bassin_10", + "Latvia_bassin_11", + "Latvia_bassin_12", + "Latvia", + "Latvia_bassin_5", + "Latvia_bassin_6", + "Latvia_bassin_7", + "Latvia_bassin_8", + "Latvia_bassin_9", + "Lebanon_bassin_10", + "Lebanon_bassin_11", + "Lebanon_bassin_12", + "Lebanon", + "Lebanon_bassin_5", + "Lebanon_bassin_6", + "Lebanon_bassin_7", + "Lebanon_bassin_8", + "Lebanon_bassin_9", + "Lesotho_bassin_10", + "Lesotho_bassin_11", + "Lesotho_bassin_12", + "Lesotho", + "Lesotho_bassin_5", + "Lesotho_bassin_6", + "Lesotho_bassin_7", + "Lesotho_bassin_8", + "Lesotho_bassin_9", + "Liberia_bassin_10", + "Liberia_bassin_11", + "Liberia_bassin_12", + "Liberia", + "Liberia_bassin_5", + "Liberia_bassin_6", + "Liberia_bassin_7", + "Liberia_bassin_8", + "Liberia_bassin_9", + "Libya_bassin_10", + "Libya_bassin_11", + "Libya_bassin_12", + "Libya", + "Libya_bassin_5", + "Libya_bassin_6", + "Libya_bassin_7", + "Libya_bassin_8", + "Libya_bassin_9", + "Liechtenstein_bassin_10", + "Liechtenstein_bassin_11", + "Liechtenstein_bassin_12", + "Liechtenstein", + "Liechtenstein_bassin_5", + "Liechtenstein_bassin_6", + "Liechtenstein_bassin_7", + "Liechtenstein_bassin_8", + "Liechtenstein_bassin_9", + "Lithuania_bassin_10", + "Lithuania_bassin_11", + "Lithuania_bassin_12", + "Lithuania", + "Lithuania_bassin_5", + "Lithuania_bassin_6", + "Lithuania_bassin_7", + "Lithuania_bassin_8", + "Lithuania_bassin_9", + "Luxembourg_bassin_10", + "Luxembourg_bassin_11", + "Luxembourg_bassin_12", + "Luxembourg", + "Luxembourg_bassin_5", + "Luxembourg_bassin_6", + "Luxembourg_bassin_7", + "Luxembourg_bassin_8", + "Luxembourg_bassin_9", + "Macau_bassin_10", + "Macau_bassin_11", + "Macau_bassin_12", + "Macau", + "Macau_bassin_5", + "Macau_bassin_6", + "Macau_bassin_7", + "Macau_bassin_8", + "Macau_bassin_9", + "Madagascar_bassin_10", + "Madagascar_bassin_11", + "Madagascar_bassin_12", + "Madagascar", + "Madagascar_bassin_5", + "Madagascar_bassin_6", + "Madagascar_bassin_7", + "Madagascar_bassin_8", + "Madagascar_bassin_9", + "Madeira_Islands_bassin_10", + "Madeira_Islands_bassin_11", + "Madeira_Islands_bassin_12", + "Madeira_Islands", + "Madeira_Islands_bassin_5", + "Madeira_Islands_bassin_6", + "Madeira_Islands_bassin_7", + "Madeira_Islands_bassin_8", + "Madeira_Islands_bassin_9", + "Malawi_bassin_10", + "Malawi_bassin_11", + "Malawi_bassin_12", + "Malawi", + "Malawi_bassin_5", + "Malawi_bassin_6", + "Malawi_bassin_7", + "Malawi_bassin_8", + "Malawi_bassin_9", + "Malaysia_bassin_10", + "Malaysia_bassin_11", + "Malaysia_bassin_12", + "Malaysia", + "Malaysia_bassin_5", + "Malaysia_bassin_6", + "Malaysia_bassin_7", + "Malaysia_bassin_8", + "Malaysia_bassin_9", + "Maldives_bassin_10", + "Maldives_bassin_11", + "Maldives_bassin_12", + "Maldives", + "Maldives_bassin_5", + "Maldives_bassin_6", + "Maldives_bassin_7", + "Maldives_bassin_8", + "Maldives_bassin_9", + "Matan_al-Sarra_bassin_10", + "Matan_al-Sarra_bassin_11", + "Matan_al-Sarra_bassin_12", + "Matan_al-Sarra", + "Matan_al-Sarra_bassin_5", + "Matan_al-Sarra_bassin_6", + "Matan_al-Sarra_bassin_7", + "Matan_al-Sarra_bassin_8", + "Matan_al-Sarra_bassin_9", + "Montenegro_bassin_10", + "Montenegro_bassin_11", + "Montenegro_bassin_12", + "Montenegro", + "Montenegro_bassin_5", + "Montenegro_bassin_6", + "Montenegro_bassin_7", + "Montenegro_bassin_8", + "Montenegro_bassin_9", + "Qatar_bassin_10", + "Qatar_bassin_11", + "Qatar_bassin_12", + "Republic_of Korea_bassin_10", + "Republic_of Korea_bassin_11", + "Republic_of Korea_bassin_12", + "Republic_of Korea", + "Republic_of Korea_bassin_5", + "Republic_of Korea_bassin_6", + "Republic_of Korea_bassin_7", + "Republic_of Korea_bassin_8", + "Republic_of Korea_bassin_9", + "Romania_bassin_10", + "Romania_bassin_11", + "Romania_bassin_12", + "Romania", + "Romania_bassin_5", + "Romania_bassin_6", + "Romania_bassin_7", + "Romania_bassin_8", + "Romania_bassin_9", + "Russian_Federation_bassin_10", + "Russian_Federation_bassin_11", + "Russian_Federation_bassin_12", + "Russian_Federation", + "Russian_Federation_bassin_5", + "Russian_Federation_bassin_6", + "Russian_Federation_bassin_7", + "Russian_Federation_bassin_8", + "Russian_Federation_bassin_9", + "Rwanda_bassin_10", + "Rwanda_bassin_11", + "Rwanda_bassin_12", + "Rwanda", + "Rwanda_bassin_5", + "Rwanda_bassin_6", + "Rwanda_bassin_7", + "Rwanda_bassin_8", + "Rwanda_bassin_9", + "Saint_Helena_bassin_10", + "Saint_Helena_bassin_11", + "Saint_Helena_bassin_12", + "Saint_Helena", + "Saint_Helena_bassin_5", + "Saint_Helena_bassin_6", + "Saint_Helena_bassin_7", + "Saint_Helena_bassin_8", + "Saint_Helena_bassin_9", + "Saint_Kitts and Nevis_bassin_10", + "Saint_Kitts and Nevis_bassin_11", + "Saint_Kitts and Nevis_bassin_12", + "Saint_Kitts and Nevis", + "Saint_Kitts and Nevis_bassin_5", + "Saint_Kitts and Nevis_bassin_6", + "Saint_Kitts and Nevis_bassin_7", + "Saint_Kitts and Nevis_bassin_8", + "Saint_Kitts and Nevis_bassin_9", + "Saint_Lucia_bassin_10", + "Saint_Lucia_bassin_11", + "Saint_Lucia_bassin_12", + "Saint_Lucia", + "Saint_Lucia_bassin_5", + "Saint_Lucia_bassin_6", + "Saint_Lucia_bassin_7", + "Saint_Lucia_bassin_8", + "Saint_Lucia_bassin_9", + "Saint_Pierre et Miquelon_bassin_10", + "Saint_Pierre et Miquelon_bassin_11", + "Saint_Pierre et Miquelon_bassin_12", + "Saint_Pierre et Miquelon", + "Saint_Pierre et Miquelon_bassin_5", + "Saint_Pierre et Miquelon_bassin_6", + "Saint_Pierre et Miquelon_bassin_7", + "Saint_Pierre et Miquelon_bassin_8", + "Saint_Pierre et Miquelon_bassin_9", + "Saint_Vincent and the Grenadines_bassin_10", + "Saint_Vincent and the Grenadines_bassin_11", + "Saint_Vincent and the Grenadines_bassin_12", + "Saint_Vincent and the Grenadines", + "Saint_Vincent and the Grenadines_bassin_5", + "Saint_Vincent and the Grenadines_bassin_6", + "Saint_Vincent and the Grenadines_bassin_7", + "Saint_Vincent and the Grenadines_bassin_8", + "Saint_Vincent and the Grenadines_bassin_9", + "Samoa_bassin_10", + "Samoa_bassin_11", + "Samoa_bassin_12", + "Samoa", + "Samoa_bassin_5", + "Samoa_bassin_6", + "Samoa_bassin_7", + "Samoa_bassin_8", + "Samoa_bassin_9", + "San_Marino_bassin_10", + "San_Marino_bassin_11", + "San_Marino_bassin_12", + "San_Marino", + "San_Marino_bassin_5", + "San_Marino_bassin_6", + "San_Marino_bassin_7", + "San_Marino_bassin_8", + "San_Marino_bassin_9", + "Sao_Tome and Principe_bassin_10", + "Sao_Tome and Principe_bassin_11", + "Sao_Tome and Principe_bassin_12", + "Sao_Tome and Principe", + "Sao_Tome and Principe_bassin_5", + "Sao_Tome and Principe_bassin_6", + "Sao_Tome and Principe_bassin_7", + "Sao_Tome and Principe_bassin_8", + "Sao_Tome and Principe_bassin_9", + "Saudi_Arabia_bassin_10", + "Saudi_Arabia_bassin_11", + "Saudi_Arabia_bassin_12", + "Saudi_Arabia", + "Saudi_Arabia_bassin_5", + "Saudi_Arabia_bassin_6", + "Saudi_Arabia_bassin_7", + "Saudi_Arabia_bassin_8", + "Saudi_Arabia_bassin_9", + "Scarborough_Reef_bassin_10", + "Scarborough_Reef_bassin_11", + "Scarborough_Reef_bassin_12", + "Scarborough_Reef", + "Scarborough_Reef_bassin_5", + "Scarborough_Reef_bassin_6", + "Scarborough_Reef_bassin_7", + "Scarborough_Reef_bassin_8", + "Scarborough_Reef_bassin_9", + "Senegal_bassin_10", + "Senegal_bassin_11", + "Senegal_bassin_12", + "Senegal", + "Senegal_bassin_5", + "Senegal_bassin_6", + "Senegal_bassin_7", + "Senegal_bassin_8", + "Senegal_bassin_9", + "Senkaku_Islands_bassin_10", + "Senkaku_Islands_bassin_11", + "Senkaku_Islands_bassin_12", + "Senkaku_Islands", + "Senkaku_Islands_bassin_5", + "Senkaku_Islands_bassin_6", + "Senkaku_Islands_bassin_7", + "Senkaku_Islands_bassin_8", + "Senkaku_Islands_bassin_9", + "Serbia_bassin_10", + "Serbia_bassin_11", + "Serbia_bassin_12", + "Serbia", + "Serbia_bassin_5", + "Serbia_bassin_6", + "Serbia_bassin_7", + "Serbia_bassin_8", + "Serbia_bassin_9", + "Seychelles_bassin_10", + "Seychelles_bassin_11", + "Seychelles_bassin_12", + "Seychelles", + "Seychelles_bassin_5", + "Seychelles_bassin_6", + "Seychelles_bassin_7", + "Seychelles_bassin_8", + "Seychelles_bassin_9", + "Sierra_Leone_bassin_10", + "Sierra_Leone_bassin_11", + "Sierra_Leone_bassin_12", + "Sierra_Leone", + "Sierra_Leone_bassin_5", + "Sierra_Leone_bassin_6", + "Sierra_Leone_bassin_7", + "Sierra_Leone_bassin_8", + "Sierra_Leone_bassin_9", + "Singapore_bassin_10", + "Singapore_bassin_11", + "Singapore_bassin_12", + "Singapore", + "Singapore_bassin_5", + "Singapore_bassin_6", + "Singapore_bassin_7", + "Singapore_bassin_8", + "Singapore_bassin_9", + "Slovakia_bassin_10", + "Slovakia_bassin_11", + "Slovakia_bassin_12", + "Slovakia", + "Slovakia_bassin_5", + "Slovakia_bassin_6", + "Slovakia_bassin_7", + "Slovakia_bassin_8", + "Slovakia_bassin_9", + "Slovenia_bassin_10", + "Slovenia_bassin_11", + "Slovenia_bassin_12", + "Slovenia", + "Slovenia_bassin_5", + "Slovenia_bassin_6", + "Slovenia_bassin_7", + "Slovenia_bassin_8", + "Slovenia_bassin_9", + "Solomon_Islands_bassin_10", + "Solomon_Islands_bassin_11", + "Solomon_Islands_bassin_12", + "Solomon_Islands", + "Solomon_Islands_bassin_5", + "Solomon_Islands_bassin_6", + "Solomon_Islands_bassin_7", + "Solomon_Islands_bassin_8", + "Solomon_Islands_bassin_9", + "Somalia_bassin_10", + "Somalia_bassin_11", + "Somalia_bassin_12", + "Somalia", + "Somalia_bassin_5", + "Somalia_bassin_6", + "Somalia_bassin_7", + "Somalia_bassin_8", + "Somalia_bassin_9", + "South_Africa_bassin_10", + "South_Africa_bassin_11", + "South_Africa_bassin_12", + "South_Africa", + "South_Africa_bassin_5", + "South_Africa_bassin_6", + "South_Africa_bassin_7", + "South_Africa_bassin_8", + "South_Africa_bassin_9", + "South_Georgia and the South Sandwich Islands_bassin_10", + "South_Georgia and the South Sandwich Islands_bassin_11", + "South_Georgia and the South Sandwich Islands_bassin_12", + "South_Georgia and the South Sandwich Islands", + "South_Georgia and the South Sandwich Islands_bassin_5", + "South_Georgia and the South Sandwich Islands_bassin_6", + "South_Georgia and the South Sandwich Islands_bassin_7", + "South_Georgia and the South Sandwich Islands_bassin_8", + "South_Georgia and the South Sandwich Islands_bassin_9", + "South_Sudan_bassin_10", + "South_Sudan_bassin_11", + "South_Sudan_bassin_12", + "South_Sudan", + "South_Sudan_bassin_5", + "South_Sudan_bassin_6", + "South_Sudan_bassin_7", + "South_Sudan_bassin_8", + "South_Sudan_bassin_9", + "Spain_bassin_10", + "Spain_bassin_11", + "Spain_bassin_12", + "Spain", + "Spain_bassin_5", + "Spain_bassin_6", + "Spain_bassin_7", + "Spain_bassin_8", + "Spain_bassin_9", + "Spratly_Islands_bassin_10", + "Spratly_Islands_bassin_11", + "Spratly_Islands_bassin_12", + "Spratly_Islands", + "Spratly_Islands_bassin_5", + "Spratly_Islands_bassin_6", + "Spratly_Islands_bassin_7", + "Spratly_Islands_bassin_8", + "Spratly_Islands_bassin_9", + "Sri_Lanka_bassin_10", + "Sri_Lanka_bassin_11", + "Sri_Lanka_bassin_12", + "Sri_Lanka", + "Sri_Lanka_bassin_5", + "Sri_Lanka_bassin_6", + "Sri_Lanka_bassin_7", + "Sri_Lanka_bassin_8", + "Sri_Lanka_bassin_9", + "Suriname_bassin_10", + "Suriname_bassin_11", + "Suriname_bassin_12", + "Suriname", + "Suriname_bassin_5", + "Suriname_bassin_6", + "Suriname_bassin_7", + "Suriname_bassin_8", + "Suriname_bassin_9", + "Svalbard_and Jan Mayen Islands_bassin_10", + "Svalbard_and Jan Mayen Islands_bassin_11", + "Svalbard_and Jan Mayen Islands_bassin_12", + "Svalbard_and Jan Mayen Islands", + "Svalbard_and Jan Mayen Islands_bassin_5", + "Svalbard_and Jan Mayen Islands_bassin_6", + "Svalbard_and Jan Mayen Islands_bassin_7", + "Svalbard_and Jan Mayen Islands_bassin_8", + "Svalbard_and Jan Mayen Islands_bassin_9", + "Swaziland_bassin_10", + "Swaziland_bassin_11", + "Swaziland_bassin_12", + "Swaziland", + "Swaziland_bassin_5", + "Swaziland_bassin_6", + "Swaziland_bassin_7", + "Swaziland_bassin_8", + "Swaziland_bassin_9", + "Sweden_bassin_10", + "Sweden_bassin_11", + "Sweden_bassin_12", + "Sweden", + "Sweden_bassin_5", + "Sweden_bassin_6", + "Sweden_bassin_7", + "Sweden_bassin_8", + "Sweden_bassin_9", + "Switzerland_bassin_10", + "Switzerland_bassin_11", + "Switzerland_bassin_12", + "Switzerland", + "Switzerland_bassin_5", + "Switzerland_bassin_6", + "Switzerland_bassin_7", + "Switzerland_bassin_8", + "Switzerland_bassin_9", + "Syrian_Arab Republic_bassin_10", + "Syrian_Arab Republic_bassin_11", + "Syrian_Arab Republic_bassin_12", + "Syrian_Arab Republic", + "Syrian_Arab Republic_bassin_5", + "Syrian_Arab Republic_bassin_6", + "Syrian_Arab Republic_bassin_7", + "Syrian_Arab Republic_bassin_8", + "Syrian_Arab Republic_bassin_9", + "Taiwan_bassin_10", + "Taiwan_bassin_11", + "Taiwan_bassin_12", + "Taiwan", + "Taiwan_bassin_5", + "Taiwan_bassin_6", + "Taiwan_bassin_7", + "Taiwan_bassin_8", + "Taiwan_bassin_9", + "Tajikistan_bassin_10", + "Tajikistan_bassin_11", + "Tajikistan_bassin_12", + "Tajikistan", + "Tajikistan_bassin_5", + "Tajikistan_bassin_6", + "Tajikistan_bassin_7", + "Tajikistan_bassin_8", + "Tajikistan_bassin_9", + "Thailand_bassin_10", + "Thailand_bassin_11", + "Thailand_bassin_12", + "Thailand", + "Thailand_bassin_5", + "Thailand_bassin_6", + "Thailand_bassin_7", + "Thailand_bassin_8", + "Thailand_bassin_9", + "The_former Yugoslav Republic of Macedonia_bassin_10", + "The_former Yugoslav Republic of Macedonia_bassin_11", + "The_former Yugoslav Republic of Macedonia_bassin_12", + "The_former Yugoslav Republic of Macedonia", + "The_former Yugoslav Republic of Macedonia_bassin_5", + "The_former Yugoslav Republic of Macedonia_bassin_6", + "The_former Yugoslav Republic of Macedonia_bassin_7", + "The_former Yugoslav Republic of Macedonia_bassin_8", + "The_former Yugoslav Republic of Macedonia_bassin_9", + "Timor-Leste_bassin_10", + "Timor-Leste_bassin_11", + "Timor-Leste_bassin_12", + "Timor-Leste", + "Timor-Leste_bassin_5", + "Timor-Leste_bassin_6", + "Timor-Leste_bassin_7", + "Timor-Leste_bassin_8", + "Timor-Leste_bassin_9", + "Togo_bassin_10", + "Togo_bassin_11", + "Togo_bassin_12", + "Togo", + "Togo_bassin_5", + "Togo_bassin_6", + "Togo_bassin_7", + "Togo_bassin_8", + "Togo_bassin_9", + "Tokelau_bassin_10", + "Tokelau_bassin_11", + "Tokelau_bassin_12", + "Tokelau", + "Tokelau_bassin_5", + "Tokelau_bassin_6", + "Tokelau_bassin_7", + "Tokelau_bassin_8", + "Tokelau_bassin_9", + "Tonga_bassin_10", + "Tonga_bassin_11", + "Tonga_bassin_12", + "Tonga", + "Tonga_bassin_5", + "Tonga_bassin_6", + "Tonga_bassin_7", + "Tonga_bassin_8", + "Tonga_bassin_9", + "Trinidad_and Tobago_bassin_10", + "Trinidad_and Tobago_bassin_11", + "Trinidad_and Tobago_bassin_12", + "Trinidad_and Tobago", + "Trinidad_and Tobago_bassin_5", + "Trinidad_and Tobago_bassin_6", + "Trinidad_and Tobago_bassin_7", + "Trinidad_and Tobago_bassin_8", + "Trinidad_and Tobago_bassin_9", + "Tromelin_Island_bassin_10", + "Tromelin_Island_bassin_11", + "Tromelin_Island_bassin_12", + "Tromelin_Island", + "Tromelin_Island_bassin_5", + "Tromelin_Island_bassin_6", + "Tromelin_Island_bassin_7", + "Tromelin_Island_bassin_8", + "Tromelin_Island_bassin_9", + "Tunisia_bassin_10", + "Tunisia_bassin_11", + "Tunisia_bassin_12", + "Tunisia", + "Tunisia_bassin_5", + "Tunisia_bassin_6", + "Tunisia_bassin_7", + "Tunisia_bassin_8", + "Tunisia_bassin_9", + "Turkey_bassin_10", + "Turkey_bassin_11", + "Turkey_bassin_12", + "Turkey", + "Turkey_bassin_5", + "Turkey_bassin_6", + "Turkey_bassin_7", + "Turkey_bassin_8", + "Turkey_bassin_9", + "Turkmenistan_bassin_10", + "Turkmenistan_bassin_11", + "Turkmenistan_bassin_12", + "Turkmenistan", + "Turkmenistan_bassin_5", + "Turkmenistan_bassin_6", + "Turkmenistan_bassin_7", + "Turkmenistan_bassin_8", + "Turkmenistan_bassin_9", + "Turks_and Caicos islands_bassin_10", + "Turks_and Caicos islands_bassin_11", + "Turks_and Caicos islands_bassin_12", + "Turks_and Caicos islands", + "Turks_and Caicos islands_bassin_5", + "Turks_and Caicos islands_bassin_6", + "Turks_and Caicos islands_bassin_7", + "Turks_and Caicos islands_bassin_8", + "Turks_and Caicos islands_bassin_9", + "Tuvalu_bassin_10", + "Tuvalu_bassin_11", + "Tuvalu_bassin_12", + "Tuvalu", + "Tuvalu_bassin_5", + "Tuvalu_bassin_6", + "Tuvalu_bassin_7", + "Tuvalu_bassin_8", + "Tuvalu_bassin_9", + "Uganda_bassin_10", + "Uganda_bassin_11", + "Uganda_bassin_12", + "Uganda", + "Uganda_bassin_5", + "Uganda_bassin_6", + "Uganda_bassin_7", + "Uganda_bassin_8", + "Uganda_bassin_9", + "Ukraine_bassin_10", + "Ukraine_bassin_11", + "Ukraine_bassin_12", + "Ukraine", + "Ukraine_bassin_5", + "Ukraine_bassin_6", + "Ukraine_bassin_7", + "Ukraine_bassin_8", + "Ukraine_bassin_9", + "UK_of Great Britain and Northern Ireland_bassin_10", + "UK_of Great Britain and Northern Ireland_bassin_11", + "UK_of Great Britain and Northern Ireland_bassin_12", + "UK_of Great Britain and Northern Ireland", + "UK_of Great Britain and Northern Ireland_bassin_5", + "UK_of Great Britain and Northern Ireland_bassin_6", + "UK_of Great Britain and Northern Ireland_bassin_7", + "UK_of Great Britain and Northern Ireland_bassin_8", + "UK_of Great Britain and Northern Ireland_bassin_9", + "United_Arab Emirates_bassin_10", + "United_Arab Emirates_bassin_11", + "United_Arab Emirates_bassin_12", + "United_Arab Emirates", + "United_Arab Emirates_bassin_5", + "United_Arab Emirates_bassin_6", + "United_Arab Emirates_bassin_7", + "United_Arab Emirates_bassin_8", + "United_Arab Emirates_bassin_9", + "United_Republic of Tanzania_bassin_10", + "United_Republic of Tanzania_bassin_11", + "United_Republic of Tanzania_bassin_12", + "United_Republic of Tanzania", + "United_Republic of Tanzania_bassin_5", + "United_Republic of Tanzania_bassin_6", + "United_Republic of Tanzania_bassin_7", + "United_Republic of Tanzania_bassin_8", + "United_Republic of Tanzania_bassin_9", + "United_States of America_bassin_10", + "United_States of America_bassin_11", + "United_States of America_bassin_12", + "United_States of America", + "United_States of America_bassin_5", + "United_States of America_bassin_6", + "United_States of America_bassin_7", + "United_States of America_bassin_8", + "United_States of America_bassin_9", + "United_States Virgin Islands_bassin_10", + "United_States Virgin Islands_bassin_11", + "United_States Virgin Islands_bassin_12", + "United_States Virgin Islands", + "United_States Virgin Islands_bassin_5", + "United_States Virgin Islands_bassin_6", + "United_States Virgin Islands_bassin_7", + "United_States Virgin Islands_bassin_8", + "United_States Virgin Islands_bassin_9", + "Uruguay_bassin_10", + "Uruguay_bassin_11", + "Uruguay_bassin_12", + "Uruguay", + "Uruguay_bassin_5", + "Uruguay_bassin_6", + "Uruguay_bassin_7", + "Uruguay_bassin_8", + "Uruguay_bassin_9", + "Uzbekistan_bassin_10", + "Uzbekistan_bassin_11", + "Uzbekistan_bassin_12", + "Uzbekistan", + "Uzbekistan_bassin_5", + "Uzbekistan_bassin_6", + "Uzbekistan_bassin_7", + "Uzbekistan_bassin_8", + "Uzbekistan_bassin_9", + "Vanuatu_bassin_10", + "Vanuatu_bassin_11", + "Vanuatu_bassin_12", + "Vanuatu", + "Vanuatu_bassin_5", + "Vanuatu_bassin_6", + "Vanuatu_bassin_7", + "Vanuatu_bassin_8", + "Vanuatu_bassin_9", + "Venezuela_bassin_10", + "Venezuela_bassin_11", + "Venezuela_bassin_12", + "Venezuela", + "Venezuela_bassin_5", + "Venezuela_bassin_6", + "Venezuela_bassin_7", + "Venezuela_bassin_8", + "Venezuela_bassin_9", + "Viet_Nam_bassin_10", + "Viet_Nam_bassin_11", + "Viet_Nam_bassin_12", + "Viet_Nam", + "Viet_Nam_bassin_5", + "Viet_Nam_bassin_6", + "Viet_Nam_bassin_7", + "Viet_Nam_bassin_8", + "Viet_Nam_bassin_9", + "Wake_Island_bassin_10", + "Wake_Island_bassin_11", + "Wake_Island_bassin_12", + "Wake_Island", + "Wake_Island_bassin_5", + "Wake_Island_bassin_6", + "Wake_Island_bassin_7", + "Wake_Island_bassin_8", + "Wake_Island_bassin_9", + "Wallis_and Futuna_bassin_10", + "Wallis_and Futuna_bassin_11", + "Wallis_and Futuna_bassin_12", + "Wallis_and Futuna", + "Wallis_and Futuna_bassin_5", + "Wallis_and Futuna_bassin_6", + "Wallis_and Futuna_bassin_7", + "Wallis_and Futuna_bassin_8", + "Wallis_and Futuna_bassin_9", + "Western_Sahara_bassin_10", + "Western_Sahara_bassin_11", + "Western_Sahara_bassin_12", + "Western_Sahara", + "Western_Sahara_bassin_5", + "Western_Sahara_bassin_6", + "Western_Sahara_bassin_7", + "Western_Sahara_bassin_8", + "Western_Sahara_bassin_9", + "West_Bank_bassin_10", + "West_Bank_bassin_11", + "West_Bank_bassin_12", + "West_Bank", + "West_Bank_bassin_5", + "West_Bank_bassin_6", + "West_Bank_bassin_7", + "West_Bank_bassin_8", + "West_Bank_bassin_9", + "Yemen_bassin_10", + "Yemen_bassin_11", + "Yemen_bassin_12", + "Yemen", + "Yemen_bassin_5", + "Yemen_bassin_6", + "Yemen_bassin_7", + "Yemen_bassin_8", + "Yemen_bassin_9", + "Zambia_bassin_10", + "Zambia_bassin_11", + "Zambia_bassin_12", + "Zambia", + "Zambia_bassin_5", + "Zambia_bassin_6", + "Zambia_bassin_7", + "Zambia_bassin_8", + "Zambia_bassin_9", + "Zimbabwe_bassin_10", + "Zimbabwe_bassin_11", + "Zimbabwe_bassin_12", + "Zimbabwe", + "Zimbabwe_bassin_5", + "Zimbabwe_bassin_6", + "Zimbabwe_bassin_7", + "Zimbabwe_bassin_8", + "Zimbabwe_bassin_9" + ) ); + + public static void main(String[] args) { + + ArrayList missingCountries = new ArrayList(); + + for (String country : allCountryNames) { + if( !filesGenerated.contains(country) ) { + missingCountries.add( country); + } + } + System.out.println( missingCountries.size() ); + System.out.println( missingCountries ); + + String finalCountries = ""; + for (String missing : missingCountries) { + finalCountries += '"' + missing.replaceAll( "_", " ") + "\", "; + } + System.out.println( finalCountries ); + + } + + +} From 4a19a42a666727619bfded63c3a53c8a436e4770 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:29 +0100 Subject: [PATCH 0059/1620] New translations BalloonServlet.java (English) --- .../earth/app/view/Messages_en.properties | 145 ++++++++++++------ 1 file changed, 95 insertions(+), 50 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 499b7cb5ec..511ad9d567 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,74 +1,119 @@ -package org.openforis.collect.earth.app.ad_hoc; +package org.openforis.collect.earth.app.server; -import java.util.List; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.regex.Pattern; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.io.FileUtils; import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.manager.RecordManager; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.CollectRecordSummary; -import org.openforis.collect.model.RecordFilter; -import org.openforis.idm.model.Coordinate; -import org.openforis.idm.model.CoordinateAttribute; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.service.BrowserNotFoundException; +import org.openforis.collect.earth.app.service.BrowserService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openqa.selenium.remote.RemoteWebDriver; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; -@Component -public abstract class FixCoordinates { +/** + * This servlet is called by the balloon (KML pop-up form) when it is open and the user has chosen to see the form in a separate browser + * window. + * In that case a special HTML is used whose sole purpose is to load an invisible iframe that calls the URL localhot/openInBrowser + * This causes a new browser window to open and then the browser is redirected to another URL ( localhost/balloon ) that contains the actual HTML + * form. + * The functionality is used mostly for LINUX users due to the different bugs present in Google Earth for LINUX which makes the Bootstrap library + * fail. + * + * @author Alfonso Sanchez-Paus Diaz + * + */ +@Controller +public class BalloonServlet extends DataAccessingServlet { @Autowired - private RecordManager recordManager; + private BrowserService browserService; @Autowired - private EarthSurveyService earthSurveyService; + private LocalPropertiesService localPropertiesService; - private Logger logger = LoggerFactory.getLogger( FixCoordinates.class); + private RemoteWebDriver webKitDriver = null; - private boolean stopFix = false; + private static final String BALLOON_EXTERNAL_URL = "balloon"; //$NON-NLS-1$ - private List getAllRecords(){ - RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); - return recordManager.loadSummaries( rf ); + private String buildGetParameters(Map parameterMap) { + final StringBuilder getParameters = new StringBuilder(); + final Set> entrySet = parameterMap.entrySet(); + for (final Entry entry : entrySet) { + getParameters.append(entry.getKey()).append("=").append(entry.getValue()[0]).append("&"); //$NON-NLS-1$ //$NON-NLS-2$ + } + return getParameters.toString(); } - public void fixCoordinates(){ - List allRecords = getAllRecords(); - - if( shouldStopFixing()){ - return; - } - - for (CollectRecordSummary summaryCollectRecord : allRecords) { - if( shouldStopFixing()){ - break; - } - try { - CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); - CoordinateAttribute plotCoord = (CoordinateAttribute) collectRecord.getNodeByPath("/plot/location"); //$NON-NLS-1$ - if( plotCoord != null && plotCoord.getValue() != null && plotCoord.getValue().getX() < getLongitudeLimit() ){ - Coordinate coordinate = new Coordinate(plotCoord.getValue().getY(), plotCoord.getValue().getX(), plotCoord.getValue().getSrsId() ); - plotCoord.setValue( coordinate ); - recordManager.save( collectRecord ); + @GetMapping("/openInBrowser") + public void openInBrowser(HttpServletResponse response, HttpServletRequest request, String imageName) { + String url = ServerController.getHostAddress(localPropertiesService.getHost(), localPropertiesService.getLocalPort()); + url = url + BALLOON_EXTERNAL_URL + "?" + buildGetParameters(request.getParameterMap()); //$NON-NLS-1$ + final String fUrl = url; + final Thread openBrowser = new Thread("Open URL in browser : " + fUrl) { + @Override + public void run() { + try { + webKitDriver = browserService.navigateTo(fUrl, webKitDriver, false); + } catch (BrowserNotFoundException e) { + logger.error("No browser found", e); //$NON-NLS-1$ } - } catch (Exception e) { - logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ } - } + }; + openBrowser.start(); + } + private String replaceGoalsWithParameters(String htmlWithGoals, Map parameterMap) { + final Set> entrySet = parameterMap.entrySet(); + for (final Entry entry : entrySet) { + htmlWithGoals = htmlWithGoals.replaceAll("\\$\\[" + Pattern.quote( entry.getKey() ) + "\\]", entry.getValue()[0]); //$NON-NLS-1$ //$NON-NLS-2$ + } + return htmlWithGoals; } - protected abstract int getLongitudeLimit(); + @GetMapping("/"+BALLOON_EXTERNAL_URL) + public void returnBalloon(HttpServletResponse response, HttpServletRequest request, String imageName) throws IOException { + response.setHeader("Content-Type", "text/html"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Content-Disposition", "inline; filename=\"" + imageName + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Date", new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH).format(new Date())); //$NON-NLS-1$ - private boolean shouldStopFixing() { - return stopFix; - } + String balloonContents = FileUtils.readFileToString( new File(localPropertiesService.getBalloonFile()), StandardCharsets.UTF_8 ); - public void stopFixing() { - stopFix = true; + if (balloonContents != null) { + balloonContents = balloonContents.replace(EarthConstants.FOLDER_COPIED_TO_KMZ + "/", EarthConstants.GENERATED_FOLDER_SUFFIX + "/" //$NON-NLS-1$ //$NON-NLS-2$ + + EarthConstants.FOLDER_COPIED_TO_KMZ + "/"); //$NON-NLS-1$ + balloonContents = replaceGoalsWithParameters(balloonContents, request.getParameterMap()); + final byte[] bytes = balloonContents.getBytes(); + response.setHeader("Content-Length", Integer.toString( bytes.length ) ); //$NON-NLS-1$ //$NON-NLS-2$ + writeToResponse(response, bytes); + } else { + getLogger().error("There was a problem fetching the balloon html, please check the name!"); //$NON-NLS-1$ + } } -} \ No newline at end of file + private void writeToResponse(HttpServletResponse response, byte[] fileContents) throws IOException { + try { + response.getOutputStream().write(fileContents); + } catch (final Exception e) { + getLogger().error("Error writing reponse body to output stream ", e); //$NON-NLS-1$ + } finally { + response.getOutputStream().close(); + } + } +} From 94c3c57ea084de94dbb80572ab52f7bb24651d50 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:30 +0100 Subject: [PATCH 0060/1620] New translations DynamicsCode.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 1956 +---------------- 1 file changed, 61 insertions(+), 1895 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 768f973a7f..f5ef63f5c6 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,1895 +1,61 @@ -package org.openforis.collect.earth.app.ad_hoc; - -import java.util.ArrayList; -import java.util.Arrays; - -public class findMissingCountries { - - private static ArrayList allCountryNames = new ArrayList<>( - Arrays.asList( - "Abyei", - "Afghanistan", - "Aksai_Chin", - "Albania", - "Algeria", - "American_Samoa", - "Andorra", - "Angola", - "Anguilla", - "Antarctica", - "Antigua_and_Barbuda", - "Argentina", - "Armenia", - "Aruba", - "Arunachal_Pradesh", - "Ashmore_and_Cartier_Islands", - "Australia", - "Austria", - "Azerbaijan", - "Azores_Islands", - "Bahamas", - "Bahrain", - "Baker_Island", - "Bangladesh", - "Barbados", - "Bassas_da_India", - "Belarus", - "Belgium", - "Belize", - "Benin", - "Bermuda", - "Bhutan", - "Bird_Island", - "Bolivia", - "Bosnia_and_Herzegovina", - "Botswana", - "Bouvet_Island", - "Brazil", - "British_Indian_Ocean_Territory", - "British_Virgin_Islands", - "Brunei_Darussalam", - "Bulgaria", - "Burkina_Faso", - "Burundi", - "Cambodia", - "Cameroon", - "Canada", - "Cape_Verde", - "Cayman_Islands", - "Central_African_Republic", - "Chad", - "Chile", - "China", - "China/India", - "Christmas_Island", - "Clipperton_Island", - "Cocos__Keeling__Islands", - "Colombia", - "Comoros", - "Congo", - "Cook_Islands", - "Costa_Rica", - "Croatia", - "Cuba", - "Cyprus", - "Czech_Republic", - "C�te_d_Ivoire", - "Dem_People_s_Rep_of_Korea", - "Democratic_Republic_of_the_Congo", - "Denmark", - "Djibouti", - "Dominica", - "Dominican_Republic", - "Ecuador", - "Egypt", - "El_Salvador", - "Equatorial_Guinea", - "Eritrea", - "Estonia", - "Ethiopia", - "Europa_Island", - "Falkland_Islands__Malvinas_", - "Faroe_Islands", - "Fiji", - "Finland", - "France", - "French_Guiana", - "French_Polynesia", - "French_Southern_and_Antarctic_Territories", - "Gabon", - "Gambia", - "Gaza_Strip", - "Georgia", - "Germany", - "Ghana", - "Gibraltar", - "Glorioso_Island", - "Greece", - "Greenland", - "Grenada", - "Guadeloupe", - "Guam", - "Guatemala", - "Guernsey", - "Guinea", - "Guinea-Bissau", - "Guyana", - "Haiti", - "Hala_ib_triangle", - "Heard_Island_and_McDonald_Islands", - "Holy_See", - "Honduras", - "Hong_Kong", - "Howland_Island", - "Hungary", - "Iceland", - "Ilemi_triangle", - "India", - "Indonesia", - "Iran___Islamic_Republic_of_", - "Iraq", - "Ireland", - "Isle_of_Man", - "Israel", - "Italy", - "Jamaica", - "Jammu_and_Kashmir", - "Japan", - "Jarvis_Island", - "Jersey", - "Johnston_Atoll", - "Jordan", - "Juan_de_Nova_Island", - "Kazakhstan", - "Kenya", - "Kingman_Reef", - "Kiribati", - "Kuril_islands", - "Kuwait", - "Kyrgyzstan", - "Lao_People_s_Democratic_Republic", - "Latvia", - "Lebanon", - "Lesotho", - "Liberia", - "Libya", - "Liechtenstein", - "Lithuania", - "Luxembourg", - "Ma_tan_al-Sarra", - "Macau", - "Madagascar", - "Madeira_Islands", - "Malawi", - "Malaysia", - "Maldives", - "Mali", - "Malta", - "Marshall_Islands", - "Martinique", - "Mauritania", - "Mauritius", - "Mayotte", - "Mexico", - "Micronesia__Federated_States_of_", - "Midway_Island", - "Moldova,_Republic_of", - "Monaco", - "Mongolia", - "Montenegro", - "Montserrat", - "Morocco", - "Mozambique", - "Myanmar", - "Namibia", - "Nauru", - "Navassa_Island", - "Nepal", - "Netherlands", - "Netherlands_Antilles", - "New_Caledonia", - "New_Zealand", - "Nicaragua", - "Niger", - "Nigeria", - "Niue", - "Norfolk_Island", - "Northern_Mariana_Islands", - "Norway", - "Oman", - "Pakistan", - "Palau", - "Palmyra_Atoll", - "Panama", - "Papua_New_Guinea", - "Paracel_Islands", - "Paraguay", - "Peru", - "Philippines", - "Pitcairn", - "Poland", - "Portugal", - "Puerto_Rico", - "Qatar", - "Republic_of_Korea", - "Romania", - "Russian_Federation", - "Rwanda", - "R�union", - "Saint_Helena", - "Saint_Kitts_and_Nevis", - "Saint_Lucia", - "Saint_Pierre_et_Miquelon", - "Saint_Vincent_and_the_Grenadines", - "Samoa", - "San_Marino", - "Sao_Tome_and_Principe", - "Saudi_Arabia", - "Scarborough_Reef", - "Senegal", - "Senkaku_Islands", - "Serbia", - "Seychelles", - "Sierra_Leone", - "Singapore", - "Slovakia", - "Slovenia", - "Solomon_Islands", - "Somalia", - "South_Africa", - "South_Georgia_and_the_South_Sandwich_Islands", - "South_Sudan", - "Spain", - "Spratly_Islands", - "Sri_Lanka", - "Sudan", - "Suriname", - "Svalbard_and_Jan_Mayen_Islands", - "Swaziland", - "Sweden", - "Switzerland", - "Syrian_Arab_Republic", - "Taiwan", - "Tajikistan", - "Thailand", - "The_former_Yugoslav_Republic_of_Macedonia", - "Timor-Leste", - "Togo", - "Tokelau", - "Tonga", - "Trinidad_and_Tobago", - "Tromelin_Island", - "Tunisia", - "Turkey", - "Turkmenistan", - "Turks_and_Caicos_islands", - "Tuvalu", - "UK_of_Great_Britain_and_Northern_Ireland", - "Uganda", - "Ukraine", - "United_Arab_Emirates", - "United_Republic_of_Tanzania", - "United_States_Virgin_Islands", - "United_States_of_America", - "Uruguay", - "Uzbekistan", - "Vanuatu", - "Venezuela", - "Viet_Nam", - "Wake_Island", - "Wallis_and_Futuna", - "West_Bank", - "Western_Sahara", - "Yemen", - "Zambia", - "Zimbabwe" ) ); - - private static ArrayList filesGenerated = new ArrayList<>( - Arrays.asList( "Azores_Islands_bassin_10", - "Azores_Islands_bassin_11", - "Azores_Islands_bassin_12", - "Azores_Islands", - "Azores_Islands_bassin_5", - "Azores_Islands_bassin_6", - "Azores_Islands_bassin_7", - "Azores_Islands_bassin_8", - "Azores_Islands_bassin_9", - "Brunei_Darussalam_bassin_10", - "Brunei_Darussalam_bassin_11", - "Brunei_Darussalam_bassin_12", - "Brunei_Darussalam_bassin_7", - "Brunei_Darussalam_bassin_8", - "Brunei_Darussalam_bassin_9", - "Bulgaria_bassin_10", - "Bulgaria_bassin_11", - "Bulgaria_bassin_12", - "Bulgaria", - "Bulgaria_bassin_5", - "Bulgaria_bassin_6", - "Bulgaria_bassin_7", - "Bulgaria_bassin_8", - "Bulgaria_bassin_9", - "Burkina_Faso_bassin_10", - "Burkina_Faso_bassin_11", - "Burkina_Faso_bassin_12", - "Burkina_Faso", - "Burkina_Faso_bassin_5", - "Burkina_Faso_bassin_6", - "Burkina_Faso_bassin_7", - "Burkina_Faso_bassin_8", - "Burkina_Faso_bassin_9", - "Burundi_bassin_10", - "Burundi_bassin_11", - "Burundi_bassin_12", - "Burundi", - "Burundi_bassin_5", - "Burundi_bassin_6", - "Burundi_bassin_7", - "Burundi_bassin_8", - "Burundi_bassin_9", - "Cambodia_bassin_10", - "Cambodia_bassin_11", - "Cambodia_bassin_12", - "Cambodia", - "Cambodia_bassin_5", - "Cambodia_bassin_6", - "Cambodia_bassin_7", - "Cambodia_bassin_8", - "Cambodia_bassin_9", - "Cameroon_bassin_10", - "Cameroon_bassin_11", - "Cameroon_bassin_12", - "Cameroon", - "Cameroon_bassin_5", - "Cameroon_bassin_6", - "Cameroon_bassin_7", - "Cameroon_bassin_8", - "Cameroon_bassin_9", - "Canada_bassin_10", - "Canada_bassin_11", - "Canada_bassin_12", - "Canada", - "Canada_bassin_5", - "Canada_bassin_6", - "Canada_bassin_7", - "Canada_bassin_8", - "Canada_bassin_9", - "Cape_Verde_bassin_10", - "Cape_Verde_bassin_11", - "Cape_Verde_bassin_12", - "Cape_Verde", - "Cape_Verde_bassin_5", - "Cape_Verde_bassin_6", - "Cape_Verde_bassin_7", - "Cape_Verde_bassin_8", - "Cape_Verde_bassin_9", - "Cayman_Islands_bassin_10", - "Cayman_Islands_bassin_11", - "Cayman_Islands_bassin_12", - "Cayman_Islands", - "Cayman_Islands_bassin_5", - "Cayman_Islands_bassin_6", - "Cayman_Islands_bassin_7", - "Cayman_Islands_bassin_8", - "Cayman_Islands_bassin_9", - "Central_African Republic_bassin_10", - "Central_African Republic_bassin_11", - "Central_African Republic_bassin_12", - "Central_African Republic", - "Central_African Republic_bassin_5", - "Central_African Republic_bassin_6", - "Central_African Republic_bassin_7", - "Central_African Republic_bassin_8", - "Central_African Republic_bassin_9", - "Chad_bassin_10", - "Chad_bassin_11", - "Chad_bassin_12", - "Chad", - "Chad_bassin_5", - "Chad_bassin_6", - "Chad_bassin_7", - "Chad_bassin_8", - "Chad_bassin_9", - "Chile_bassin_10", - "Chile_bassin_11", - "Chile_bassin_12", - "Chile", - "Chile_bassin_5", - "Chile_bassin_6", - "Chile_bassin_7", - "Chile_bassin_8", - "Chile_bassin_9", - "China_bassin_10", - "China_bassin_11", - "China_bassin_12", - "China", - "China_bassin_5", - "China_bassin_6", - "China_bassin_7", - "China_bassin_8", - "China_bassin_9", - "Christmas_Island_bassin_10", - "Christmas_Island_bassin_11", - "Christmas_Island_bassin_12", - "Christmas_Island", - "Christmas_Island_bassin_5", - "Christmas_Island_bassin_6", - "Christmas_Island_bassin_7", - "Christmas_Island_bassin_8", - "Christmas_Island_bassin_9", - "Clipperton_Island_bassin_10", - "Clipperton_Island_bassin_11", - "Clipperton_Island_bassin_12", - "Clipperton_Island", - "Clipperton_Island_bassin_5", - "Clipperton_Island_bassin_6", - "Clipperton_Island_bassin_7", - "Clipperton_Island_bassin_8", - "Clipperton_Island_bassin_9", - "Colombia_bassin_10", - "Colombia_bassin_11", - "Colombia_bassin_12", - "Colombia", - "Colombia_bassin_5", - "Colombia_bassin_6", - "Colombia_bassin_7", - "Colombia_bassin_8", - "Colombia_bassin_9", - "Comoros_bassin_10", - "Comoros_bassin_11", - "Comoros_bassin_12", - "Comoros", - "Comoros_bassin_5", - "Comoros_bassin_6", - "Comoros_bassin_7", - "Comoros_bassin_8", - "Comoros_bassin_9", - "Congo_bassin_10", - "Congo_bassin_11", - "Congo_bassin_12", - "Congo", - "Congo_bassin_5", - "Congo_bassin_6", - "Congo_bassin_7", - "Congo_bassin_8", - "Congo_bassin_9", - "Cook_Islands_bassin_10", - "Cook_Islands_bassin_11", - "Cook_Islands_bassin_12", - "Cook_Islands", - "Cook_Islands_bassin_5", - "Cook_Islands_bassin_6", - "Cook_Islands_bassin_7", - "Cook_Islands_bassin_8", - "Cook_Islands_bassin_9", - "Costa_Rica_bassin_10", - "Costa_Rica_bassin_11", - "Costa_Rica_bassin_12", - "Costa_Rica", - "Costa_Rica_bassin_5", - "Costa_Rica_bassin_6", - "Costa_Rica_bassin_7", - "Costa_Rica_bassin_8", - "Costa_Rica_bassin_9", - "Croatia_bassin_10", - "Croatia_bassin_11", - "Croatia_bassin_12", - "Croatia", - "Croatia_bassin_5", - "Croatia_bassin_6", - "Croatia_bassin_7", - "Croatia_bassin_8", - "Croatia_bassin_9", - "Cuba_bassin_10", - "Cuba_bassin_11", - "Cuba_bassin_12", - "Cuba", - "Cuba_bassin_5", - "Cuba_bassin_6", - "Cuba_bassin_7", - "Cuba_bassin_8", - "Cuba_bassin_9", - "Cyprus_bassin_10", - "Cyprus_bassin_11", - "Cyprus_bassin_12", - "Cyprus", - "Cyprus_bassin_5", - "Cyprus_bassin_6", - "Cyprus_bassin_7", - "Cyprus_bassin_8", - "Cyprus_bassin_9", - "Czech_Republic_bassin_10", - "Czech_Republic_bassin_11", - "Czech_Republic_bassin_12", - "Czech_Republic", - "Czech_Republic_bassin_5", - "Czech_Republic_bassin_6", - "Czech_Republic_bassin_7", - "Czech_Republic_bassin_8", - "Czech_Republic_bassin_9", - "Democratic_Republic of the Congo_bassin_10", - "Democratic_Republic of the Congo_bassin_11", - "Democratic_Republic of the Congo_bassin_12", - "Democratic_Republic of the Congo", - "Democratic_Republic of the Congo_bassin_5", - "Democratic_Republic of the Congo_bassin_6", - "Democratic_Republic of the Congo_bassin_7", - "Democratic_Republic of the Congo_bassin_8", - "Democratic_Republic of the Congo_bassin_9", - "Dem_Peoples Rep of Korea_bassin_10", - "Dem_Peoples Rep of Korea_bassin_11", - "Dem_Peoples Rep of Korea_bassin_12", - "Dem_Peoples Rep of Korea", - "Dem_Peoples Rep of Korea_bassin_5", - "Dem_Peoples Rep of Korea_bassin_6", - "Dem_Peoples Rep of Korea_bassin_7", - "Dem_Peoples Rep of Korea_bassin_8", - "Dem_Peoples Rep of Korea_bassin_9", - "Denmark_bassin_10", - "Denmark_bassin_11", - "Denmark_bassin_12", - "Denmark", - "Denmark_bassin_5", - "Denmark_bassin_6", - "Denmark_bassin_7", - "Denmark_bassin_8", - "Denmark_bassin_9", - "Djibouti_bassin_10", - "Djibouti_bassin_11", - "Djibouti_bassin_12", - "Djibouti", - "Djibouti_bassin_5", - "Djibouti_bassin_6", - "Djibouti_bassin_7", - "Djibouti_bassin_8", - "Djibouti_bassin_9", - "Dominican_Republic_bassin_10", - "Dominican_Republic_bassin_11", - "Dominican_Republic_bassin_12", - "Dominican_Republic", - "Dominican_Republic_bassin_5", - "Dominican_Republic_bassin_6", - "Dominican_Republic_bassin_7", - "Dominican_Republic_bassin_8", - "Dominican_Republic_bassin_9", - "Dominica_bassin_10", - "Dominica_bassin_11", - "Dominica_bassin_12", - "Dominica", - "Dominica_bassin_5", - "Dominica_bassin_6", - "Dominica_bassin_7", - "Dominica_bassin_8", - "Dominica_bassin_9", - "Ecuador_bassin_10", - "Ecuador_bassin_11", - "Ecuador_bassin_12", - "Ecuador", - "Ecuador_bassin_5", - "Ecuador_bassin_6", - "Ecuador_bassin_7", - "Ecuador_bassin_8", - "Ecuador_bassin_9", - "Egypt_bassin_10", - "Egypt_bassin_11", - "Egypt_bassin_12", - "Egypt", - "Egypt_bassin_5", - "Egypt_bassin_6", - "Egypt_bassin_7", - "Egypt_bassin_8", - "Egypt_bassin_9", - "El_Salvador_bassin_10", - "El_Salvador_bassin_11", - "El_Salvador_bassin_12", - "El_Salvador", - "El_Salvador_bassin_5", - "El_Salvador_bassin_6", - "El_Salvador_bassin_7", - "El_Salvador_bassin_8", - "El_Salvador_bassin_9", - "Equatorial_Guinea_bassin_10", - "Equatorial_Guinea_bassin_11", - "Equatorial_Guinea_bassin_12", - "Equatorial_Guinea", - "Equatorial_Guinea_bassin_5", - "Equatorial_Guinea_bassin_6", - "Equatorial_Guinea_bassin_7", - "Equatorial_Guinea_bassin_8", - "Equatorial_Guinea_bassin_9", - "Eritrea_bassin_10", - "Eritrea_bassin_11", - "Eritrea_bassin_12", - "Eritrea", - "Eritrea_bassin_5", - "Eritrea_bassin_6", - "Eritrea_bassin_7", - "Eritrea_bassin_8", - "Eritrea_bassin_9", - "Estonia_bassin_10", - "Estonia_bassin_11", - "Estonia_bassin_12", - "Estonia", - "Estonia_bassin_5", - "Estonia_bassin_6", - "Estonia_bassin_7", - "Estonia_bassin_8", - "Estonia_bassin_9", - "Ethiopia_bassin_10", - "Ethiopia_bassin_11", - "Ethiopia_bassin_12", - "Ethiopia", - "Ethiopia_bassin_5", - "Ethiopia_bassin_6", - "Ethiopia_bassin_7", - "Ethiopia_bassin_8", - "Ethiopia_bassin_9", - "Europa_Island_bassin_10", - "Europa_Island_bassin_11", - "Europa_Island_bassin_12", - "Europa_Island", - "Europa_Island_bassin_5", - "Europa_Island_bassin_6", - "Europa_Island_bassin_7", - "Europa_Island_bassin_8", - "Europa_Island_bassin_9", - "Faroe_Islands_bassin_10", - "Faroe_Islands_bassin_11", - "Faroe_Islands_bassin_12", - "Faroe_Islands", - "Faroe_Islands_bassin_5", - "Faroe_Islands_bassin_6", - "Faroe_Islands_bassin_7", - "Faroe_Islands_bassin_8", - "Faroe_Islands_bassin_9", - "Fiji_bassin_10", - "Fiji_bassin_11", - "Fiji_bassin_12", - "Fiji", - "Fiji_bassin_5", - "Fiji_bassin_6", - "Fiji_bassin_7", - "Fiji_bassin_8", - "Fiji_bassin_9", - "Finland_bassin_10", - "Finland_bassin_11", - "Finland_bassin_12", - "Finland", - "Finland_bassin_5", - "Finland_bassin_6", - "Finland_bassin_7", - "Finland_bassin_8", - "Finland_bassin_9", - "France_bassin_10", - "France_bassin_11", - "France_bassin_12", - "France", - "France_bassin_5", - "France_bassin_6", - "France_bassin_7", - "France_bassin_8", - "France_bassin_9", - "French_Guiana_bassin_10", - "French_Guiana_bassin_11", - "French_Guiana_bassin_12", - "French_Guiana", - "French_Guiana_bassin_5", - "French_Guiana_bassin_6", - "French_Guiana_bassin_7", - "French_Guiana_bassin_8", - "French_Guiana_bassin_9", - "French_Polynesia_bassin_10", - "French_Polynesia_bassin_11", - "French_Polynesia_bassin_12", - "French_Polynesia", - "French_Polynesia_bassin_5", - "French_Polynesia_bassin_6", - "French_Polynesia_bassin_7", - "French_Polynesia_bassin_8", - "French_Polynesia_bassin_9", - "French_Southern and Antarctic Territories_bassin_10", - "French_Southern and Antarctic Territories_bassin_11", - "French_Southern and Antarctic Territories_bassin_12", - "French_Southern and Antarctic Territories", - "French_Southern and Antarctic Territories_bassin_5", - "French_Southern and Antarctic Territories_bassin_6", - "French_Southern and Antarctic Territories_bassin_7", - "French_Southern and Antarctic Territories_bassin_8", - "French_Southern and Antarctic Territories_bassin_9", - "Gabon_bassin_10", - "Gabon_bassin_11", - "Gabon_bassin_12", - "Gabon", - "Gabon_bassin_5", - "Gabon_bassin_6", - "Gabon_bassin_7", - "Gabon_bassin_8", - "Gabon_bassin_9", - "Gambia_bassin_10", - "Gambia_bassin_11", - "Gambia_bassin_12", - "Gambia", - "Gambia_bassin_5", - "Gambia_bassin_6", - "Gambia_bassin_7", - "Gambia_bassin_8", - "Gambia_bassin_9", - "Gaza_Strip_bassin_10", - "Gaza_Strip_bassin_11", - "Gaza_Strip_bassin_12", - "Gaza_Strip", - "Gaza_Strip_bassin_5", - "Gaza_Strip_bassin_6", - "Gaza_Strip_bassin_7", - "Gaza_Strip_bassin_8", - "Gaza_Strip_bassin_9", - "Georgia_bassin_10", - "Georgia_bassin_11", - "Georgia_bassin_12", - "Georgia", - "Georgia_bassin_5", - "Georgia_bassin_6", - "Georgia_bassin_7", - "Georgia_bassin_8", - "Georgia_bassin_9", - "Germany_bassin_10", - "Germany_bassin_11", - "Germany_bassin_12", - "Germany", - "Germany_bassin_5", - "Germany_bassin_6", - "Germany_bassin_7", - "Germany_bassin_8", - "Germany_bassin_9", - "Ghana_bassin_10", - "Ghana_bassin_11", - "Ghana_bassin_12", - "Ghana", - "Ghana_bassin_5", - "Ghana_bassin_6", - "Ghana_bassin_8", - "Ghana_bassin_9", - "Gibraltar_bassin_10", - "Gibraltar_bassin_11", - "Gibraltar_bassin_12", - "Gibraltar", - "Gibraltar_bassin_5", - "Gibraltar_bassin_6", - "Gibraltar_bassin_7", - "Gibraltar_bassin_8", - "Gibraltar_bassin_9", - "Glorioso_Island_bassin_10", - "Glorioso_Island_bassin_11", - "Glorioso_Island_bassin_12", - "Glorioso_Island", - "Glorioso_Island_bassin_5", - "Glorioso_Island_bassin_6", - "Glorioso_Island_bassin_7", - "Glorioso_Island_bassin_8", - "Glorioso_Island_bassin_9", - "Greece_bassin_10", - "Greece_bassin_11", - "Greece_bassin_12", - "Greece", - "Greece_bassin_5", - "Greece_bassin_6", - "Greece_bassin_7", - "Greece_bassin_8", - "Greece_bassin_9", - "Greenland_bassin_10", - "Greenland_bassin_11", - "Greenland_bassin_12", - "Greenland", - "Greenland_bassin_5", - "Greenland_bassin_6", - "Greenland_bassin_7", - "Greenland_bassin_8", - "Greenland_bassin_9", - "Grenada_bassin_10", - "Grenada_bassin_11", - "Grenada_bassin_12", - "Grenada", - "Grenada_bassin_5", - "Grenada_bassin_6", - "Grenada_bassin_7", - "Grenada_bassin_8", - "Grenada_bassin_9", - "Guadeloupe_bassin_10", - "Guadeloupe_bassin_11", - "Guadeloupe_bassin_12", - "Guadeloupe", - "Guadeloupe_bassin_5", - "Guadeloupe_bassin_6", - "Guadeloupe_bassin_7", - "Guadeloupe_bassin_8", - "Guadeloupe_bassin_9", - "Guam_bassin_10", - "Guam_bassin_11", - "Guam_bassin_12", - "Guam", - "Guam_bassin_5", - "Guam_bassin_6", - "Guam_bassin_7", - "Guam_bassin_8", - "Guam_bassin_9", - "Halaib_triangle_bassin_10", - "Halaib_triangle_bassin_11", - "Halaib_triangle_bassin_12", - "Halaib_triangle", - "Halaib_triangle_bassin_5", - "Halaib_triangle_bassin_6", - "Halaib_triangle_bassin_7", - "Halaib_triangle_bassin_8", - "Halaib_triangle_bassin_9", - "Heard_Island and McDonald Islands_bassin_12", - "Holy_See_bassin_10", - "Holy_See_bassin_11", - "Holy_See_bassin_12", - "Holy_See", - "Holy_See_bassin_5", - "Holy_See_bassin_6", - "Holy_See_bassin_7", - "Holy_See_bassin_8", - "Holy_See_bassin_9", - "Honduras_bassin_10", - "Honduras_bassin_11", - "Honduras_bassin_12", - "Honduras", - "Honduras_bassin_5", - "Honduras_bassin_6", - "Honduras_bassin_7", - "Honduras_bassin_8", - "Honduras_bassin_9", - "Hong_Kong_bassin_10", - "Hong_Kong_bassin_11", - "Hong_Kong_bassin_12", - "Hong_Kong", - "Hong_Kong_bassin_5", - "Hong_Kong_bassin_6", - "Hong_Kong_bassin_7", - "Hong_Kong_bassin_8", - "Hong_Kong_bassin_9", - "Howland_Island_bassin_10", - "Howland_Island_bassin_11", - "Howland_Island_bassin_12", - "Howland_Island", - "Howland_Island_bassin_5", - "Howland_Island_bassin_6", - "Howland_Island_bassin_7", - "Howland_Island_bassin_8", - "Howland_Island_bassin_9", - "Hungary_bassin_10", - "Hungary_bassin_11", - "Hungary_bassin_12", - "Hungary", - "Hungary_bassin_5", - "Hungary_bassin_6", - "Hungary_bassin_7", - "Hungary_bassin_8", - "Hungary_bassin_9", - "Iceland_bassin_10", - "Iceland_bassin_11", - "Iceland_bassin_12", - "Iceland", - "Iceland_bassin_5", - "Iceland_bassin_6", - "Iceland_bassin_7", - "Iceland_bassin_8", - "Iceland_bassin_9", - "Ilemi_triangle_bassin_10", - "Ilemi_triangle_bassin_11", - "Ilemi_triangle_bassin_12", - "Ilemi_triangle", - "Ilemi_triangle_bassin_5", - "Ilemi_triangle_bassin_6", - "Ilemi_triangle_bassin_7", - "Ilemi_triangle_bassin_8", - "Ilemi_triangle_bassin_9", - "India_bassin_10", - "India_bassin_11", - "India_bassin_12", - "India", - "India_bassin_5", - "India_bassin_6", - "India_bassin_7", - "India_bassin_8", - "India_bassin_9", - "Indonesia_bassin_10", - "Indonesia_bassin_11", - "Indonesia_bassin_12", - "Indonesia", - "Indonesia_bassin_5", - "Indonesia_bassin_6", - "Indonesia_bassin_7", - "Indonesia_bassin_8", - "Indonesia_bassin_9", - "Iraq_bassin_10", - "Iraq_bassin_11", - "Iraq_bassin_12", - "Iraq", - "Iraq_bassin_5", - "Iraq_bassin_6", - "Iraq_bassin_7", - "Iraq_bassin_8", - "Iraq_bassin_9", - "Ireland_bassin_10", - "Ireland_bassin_11", - "Ireland_bassin_12", - "Ireland", - "Ireland_bassin_5", - "Ireland_bassin_6", - "Ireland_bassin_7", - "Ireland_bassin_8", - "Ireland_bassin_9", - "Isle_of Man_bassin_10", - "Isle_of Man_bassin_11", - "Isle_of Man_bassin_12", - "Isle_of Man", - "Isle_of Man_bassin_5", - "Isle_of Man_bassin_6", - "Isle_of Man_bassin_7", - "Isle_of Man_bassin_8", - "Isle_of Man_bassin_9", - "Israel_bassin_10", - "Israel_bassin_11", - "Israel_bassin_12", - "Israel", - "Israel_bassin_5", - "Israel_bassin_6", - "Israel_bassin_7", - "Israel_bassin_8", - "Israel_bassin_9", - "Italy_bassin_10", - "Italy_bassin_11", - "Italy_bassin_12", - "Italy", - "Italy_bassin_5", - "Italy_bassin_6", - "Italy_bassin_7", - "Italy_bassin_8", - "Italy_bassin_9", - "Jamaica_bassin_10", - "Jamaica_bassin_11", - "Jamaica_bassin_12", - "Jamaica", - "Jamaica_bassin_5", - "Jamaica_bassin_6", - "Jamaica_bassin_7", - "Jamaica_bassin_8", - "Jamaica_bassin_9", - "Jammu_and Kashmir_bassin_10", - "Jammu_and Kashmir_bassin_11", - "Jammu_and Kashmir_bassin_12", - "Jammu_and Kashmir", - "Jammu_and Kashmir_bassin_5", - "Jammu_and Kashmir_bassin_6", - "Jammu_and Kashmir_bassin_7", - "Jammu_and Kashmir_bassin_8", - "Jammu_and Kashmir_bassin_9", - "Japan_bassin_10", - "Japan_bassin_11", - "Japan_bassin_12", - "Japan", - "Japan_bassin_5", - "Japan_bassin_6", - "Japan_bassin_7", - "Japan_bassin_8", - "Japan_bassin_9", - "Jarvis_Island_bassin_10", - "Jarvis_Island_bassin_11", - "Jarvis_Island_bassin_12", - "Jarvis_Island", - "Jarvis_Island_bassin_5", - "Jarvis_Island_bassin_6", - "Jarvis_Island_bassin_7", - "Jarvis_Island_bassin_8", - "Jarvis_Island_bassin_9", - "Jersey_bassin_10", - "Jersey_bassin_11", - "Jersey_bassin_12", - "Jersey", - "Jersey_bassin_5", - "Jersey_bassin_6", - "Jersey_bassin_7", - "Jersey_bassin_8", - "Jersey_bassin_9", - "Johnston_Atoll_bassin_10", - "Johnston_Atoll_bassin_11", - "Johnston_Atoll_bassin_12", - "Johnston_Atoll", - "Johnston_Atoll_bassin_5", - "Johnston_Atoll_bassin_6", - "Johnston_Atoll_bassin_7", - "Johnston_Atoll_bassin_8", - "Johnston_Atoll_bassin_9", - "Jordan_bassin_10", - "Jordan_bassin_11", - "Jordan_bassin_12", - "Jordan", - "Jordan_bassin_5", - "Jordan_bassin_6", - "Jordan_bassin_7", - "Jordan_bassin_8", - "Jordan_bassin_9", - "Juan_de Nova Island_bassin_10", - "Juan_de Nova Island_bassin_11", - "Juan_de Nova Island_bassin_12", - "Juan_de Nova Island", - "Juan_de Nova Island_bassin_5", - "Juan_de Nova Island_bassin_6", - "Juan_de Nova Island_bassin_7", - "Juan_de Nova Island_bassin_8", - "Juan_de Nova Island_bassin_9", - "Kazakhstan_bassin_10", - "Kazakhstan_bassin_11", - "Kazakhstan_bassin_12", - "Kazakhstan", - "Kazakhstan_bassin_5", - "Kazakhstan_bassin_6", - "Kazakhstan_bassin_7", - "Kazakhstan_bassin_8", - "Kazakhstan_bassin_9", - "Kenya_bassin_10", - "Kenya_bassin_11", - "Kenya_bassin_12", - "Kenya", - "Kenya_bassin_5", - "Kenya_bassin_6", - "Kenya_bassin_7", - "Kenya_bassin_8", - "Kenya_bassin_9", - "Kingman_Reef_bassin_10", - "Kingman_Reef_bassin_11", - "Kingman_Reef_bassin_12", - "Kingman_Reef", - "Kingman_Reef_bassin_5", - "Kingman_Reef_bassin_6", - "Kingman_Reef_bassin_7", - "Kingman_Reef_bassin_8", - "Kingman_Reef_bassin_9", - "Kiribati_bassin_10", - "Kiribati_bassin_11", - "Kiribati_bassin_12", - "Kiribati", - "Kiribati_bassin_5", - "Kiribati_bassin_6", - "Kiribati_bassin_7", - "Kiribati_bassin_8", - "Kiribati_bassin_9", - "Kuril_islands_bassin_10", - "Kuril_islands_bassin_11", - "Kuril_islands_bassin_12", - "Kuril_islands", - "Kuril_islands_bassin_5", - "Kuril_islands_bassin_6", - "Kuril_islands_bassin_7", - "Kuril_islands_bassin_8", - "Kuril_islands_bassin_9", - "Kuwait_bassin_10", - "Kuwait_bassin_11", - "Kuwait_bassin_12", - "Kuwait", - "Kuwait_bassin_5", - "Kuwait_bassin_6", - "Kuwait_bassin_7", - "Kuwait_bassin_8", - "Kuwait_bassin_9", - "Kyrgyzstan_bassin_10", - "Kyrgyzstan_bassin_11", - "Kyrgyzstan_bassin_12", - "Kyrgyzstan", - "Kyrgyzstan_bassin_5", - "Kyrgyzstan_bassin_6", - "Kyrgyzstan_bassin_7", - "Kyrgyzstan_bassin_8", - "Kyrgyzstan_bassin_9", - "Lao_Peoples Democratic Republic_bassin_10", - "Lao_Peoples Democratic Republic_bassin_11", - "Lao_Peoples Democratic Republic_bassin_12", - "Lao_Peoples Democratic Republic", - "Lao_Peoples Democratic Republic_bassin_5", - "Lao_Peoples Democratic Republic_bassin_6", - "Lao_Peoples Democratic Republic_bassin_7", - "Lao_Peoples Democratic Republic_bassin_8", - "Lao_Peoples Democratic Republic_bassin_9", - "Latvia_bassin_10", - "Latvia_bassin_11", - "Latvia_bassin_12", - "Latvia", - "Latvia_bassin_5", - "Latvia_bassin_6", - "Latvia_bassin_7", - "Latvia_bassin_8", - "Latvia_bassin_9", - "Lebanon_bassin_10", - "Lebanon_bassin_11", - "Lebanon_bassin_12", - "Lebanon", - "Lebanon_bassin_5", - "Lebanon_bassin_6", - "Lebanon_bassin_7", - "Lebanon_bassin_8", - "Lebanon_bassin_9", - "Lesotho_bassin_10", - "Lesotho_bassin_11", - "Lesotho_bassin_12", - "Lesotho", - "Lesotho_bassin_5", - "Lesotho_bassin_6", - "Lesotho_bassin_7", - "Lesotho_bassin_8", - "Lesotho_bassin_9", - "Liberia_bassin_10", - "Liberia_bassin_11", - "Liberia_bassin_12", - "Liberia", - "Liberia_bassin_5", - "Liberia_bassin_6", - "Liberia_bassin_7", - "Liberia_bassin_8", - "Liberia_bassin_9", - "Libya_bassin_10", - "Libya_bassin_11", - "Libya_bassin_12", - "Libya", - "Libya_bassin_5", - "Libya_bassin_6", - "Libya_bassin_7", - "Libya_bassin_8", - "Libya_bassin_9", - "Liechtenstein_bassin_10", - "Liechtenstein_bassin_11", - "Liechtenstein_bassin_12", - "Liechtenstein", - "Liechtenstein_bassin_5", - "Liechtenstein_bassin_6", - "Liechtenstein_bassin_7", - "Liechtenstein_bassin_8", - "Liechtenstein_bassin_9", - "Lithuania_bassin_10", - "Lithuania_bassin_11", - "Lithuania_bassin_12", - "Lithuania", - "Lithuania_bassin_5", - "Lithuania_bassin_6", - "Lithuania_bassin_7", - "Lithuania_bassin_8", - "Lithuania_bassin_9", - "Luxembourg_bassin_10", - "Luxembourg_bassin_11", - "Luxembourg_bassin_12", - "Luxembourg", - "Luxembourg_bassin_5", - "Luxembourg_bassin_6", - "Luxembourg_bassin_7", - "Luxembourg_bassin_8", - "Luxembourg_bassin_9", - "Macau_bassin_10", - "Macau_bassin_11", - "Macau_bassin_12", - "Macau", - "Macau_bassin_5", - "Macau_bassin_6", - "Macau_bassin_7", - "Macau_bassin_8", - "Macau_bassin_9", - "Madagascar_bassin_10", - "Madagascar_bassin_11", - "Madagascar_bassin_12", - "Madagascar", - "Madagascar_bassin_5", - "Madagascar_bassin_6", - "Madagascar_bassin_7", - "Madagascar_bassin_8", - "Madagascar_bassin_9", - "Madeira_Islands_bassin_10", - "Madeira_Islands_bassin_11", - "Madeira_Islands_bassin_12", - "Madeira_Islands", - "Madeira_Islands_bassin_5", - "Madeira_Islands_bassin_6", - "Madeira_Islands_bassin_7", - "Madeira_Islands_bassin_8", - "Madeira_Islands_bassin_9", - "Malawi_bassin_10", - "Malawi_bassin_11", - "Malawi_bassin_12", - "Malawi", - "Malawi_bassin_5", - "Malawi_bassin_6", - "Malawi_bassin_7", - "Malawi_bassin_8", - "Malawi_bassin_9", - "Malaysia_bassin_10", - "Malaysia_bassin_11", - "Malaysia_bassin_12", - "Malaysia", - "Malaysia_bassin_5", - "Malaysia_bassin_6", - "Malaysia_bassin_7", - "Malaysia_bassin_8", - "Malaysia_bassin_9", - "Maldives_bassin_10", - "Maldives_bassin_11", - "Maldives_bassin_12", - "Maldives", - "Maldives_bassin_5", - "Maldives_bassin_6", - "Maldives_bassin_7", - "Maldives_bassin_8", - "Maldives_bassin_9", - "Matan_al-Sarra_bassin_10", - "Matan_al-Sarra_bassin_11", - "Matan_al-Sarra_bassin_12", - "Matan_al-Sarra", - "Matan_al-Sarra_bassin_5", - "Matan_al-Sarra_bassin_6", - "Matan_al-Sarra_bassin_7", - "Matan_al-Sarra_bassin_8", - "Matan_al-Sarra_bassin_9", - "Montenegro_bassin_10", - "Montenegro_bassin_11", - "Montenegro_bassin_12", - "Montenegro", - "Montenegro_bassin_5", - "Montenegro_bassin_6", - "Montenegro_bassin_7", - "Montenegro_bassin_8", - "Montenegro_bassin_9", - "Qatar_bassin_10", - "Qatar_bassin_11", - "Qatar_bassin_12", - "Republic_of Korea_bassin_10", - "Republic_of Korea_bassin_11", - "Republic_of Korea_bassin_12", - "Republic_of Korea", - "Republic_of Korea_bassin_5", - "Republic_of Korea_bassin_6", - "Republic_of Korea_bassin_7", - "Republic_of Korea_bassin_8", - "Republic_of Korea_bassin_9", - "Romania_bassin_10", - "Romania_bassin_11", - "Romania_bassin_12", - "Romania", - "Romania_bassin_5", - "Romania_bassin_6", - "Romania_bassin_7", - "Romania_bassin_8", - "Romania_bassin_9", - "Russian_Federation_bassin_10", - "Russian_Federation_bassin_11", - "Russian_Federation_bassin_12", - "Russian_Federation", - "Russian_Federation_bassin_5", - "Russian_Federation_bassin_6", - "Russian_Federation_bassin_7", - "Russian_Federation_bassin_8", - "Russian_Federation_bassin_9", - "Rwanda_bassin_10", - "Rwanda_bassin_11", - "Rwanda_bassin_12", - "Rwanda", - "Rwanda_bassin_5", - "Rwanda_bassin_6", - "Rwanda_bassin_7", - "Rwanda_bassin_8", - "Rwanda_bassin_9", - "Saint_Helena_bassin_10", - "Saint_Helena_bassin_11", - "Saint_Helena_bassin_12", - "Saint_Helena", - "Saint_Helena_bassin_5", - "Saint_Helena_bassin_6", - "Saint_Helena_bassin_7", - "Saint_Helena_bassin_8", - "Saint_Helena_bassin_9", - "Saint_Kitts and Nevis_bassin_10", - "Saint_Kitts and Nevis_bassin_11", - "Saint_Kitts and Nevis_bassin_12", - "Saint_Kitts and Nevis", - "Saint_Kitts and Nevis_bassin_5", - "Saint_Kitts and Nevis_bassin_6", - "Saint_Kitts and Nevis_bassin_7", - "Saint_Kitts and Nevis_bassin_8", - "Saint_Kitts and Nevis_bassin_9", - "Saint_Lucia_bassin_10", - "Saint_Lucia_bassin_11", - "Saint_Lucia_bassin_12", - "Saint_Lucia", - "Saint_Lucia_bassin_5", - "Saint_Lucia_bassin_6", - "Saint_Lucia_bassin_7", - "Saint_Lucia_bassin_8", - "Saint_Lucia_bassin_9", - "Saint_Pierre et Miquelon_bassin_10", - "Saint_Pierre et Miquelon_bassin_11", - "Saint_Pierre et Miquelon_bassin_12", - "Saint_Pierre et Miquelon", - "Saint_Pierre et Miquelon_bassin_5", - "Saint_Pierre et Miquelon_bassin_6", - "Saint_Pierre et Miquelon_bassin_7", - "Saint_Pierre et Miquelon_bassin_8", - "Saint_Pierre et Miquelon_bassin_9", - "Saint_Vincent and the Grenadines_bassin_10", - "Saint_Vincent and the Grenadines_bassin_11", - "Saint_Vincent and the Grenadines_bassin_12", - "Saint_Vincent and the Grenadines", - "Saint_Vincent and the Grenadines_bassin_5", - "Saint_Vincent and the Grenadines_bassin_6", - "Saint_Vincent and the Grenadines_bassin_7", - "Saint_Vincent and the Grenadines_bassin_8", - "Saint_Vincent and the Grenadines_bassin_9", - "Samoa_bassin_10", - "Samoa_bassin_11", - "Samoa_bassin_12", - "Samoa", - "Samoa_bassin_5", - "Samoa_bassin_6", - "Samoa_bassin_7", - "Samoa_bassin_8", - "Samoa_bassin_9", - "San_Marino_bassin_10", - "San_Marino_bassin_11", - "San_Marino_bassin_12", - "San_Marino", - "San_Marino_bassin_5", - "San_Marino_bassin_6", - "San_Marino_bassin_7", - "San_Marino_bassin_8", - "San_Marino_bassin_9", - "Sao_Tome and Principe_bassin_10", - "Sao_Tome and Principe_bassin_11", - "Sao_Tome and Principe_bassin_12", - "Sao_Tome and Principe", - "Sao_Tome and Principe_bassin_5", - "Sao_Tome and Principe_bassin_6", - "Sao_Tome and Principe_bassin_7", - "Sao_Tome and Principe_bassin_8", - "Sao_Tome and Principe_bassin_9", - "Saudi_Arabia_bassin_10", - "Saudi_Arabia_bassin_11", - "Saudi_Arabia_bassin_12", - "Saudi_Arabia", - "Saudi_Arabia_bassin_5", - "Saudi_Arabia_bassin_6", - "Saudi_Arabia_bassin_7", - "Saudi_Arabia_bassin_8", - "Saudi_Arabia_bassin_9", - "Scarborough_Reef_bassin_10", - "Scarborough_Reef_bassin_11", - "Scarborough_Reef_bassin_12", - "Scarborough_Reef", - "Scarborough_Reef_bassin_5", - "Scarborough_Reef_bassin_6", - "Scarborough_Reef_bassin_7", - "Scarborough_Reef_bassin_8", - "Scarborough_Reef_bassin_9", - "Senegal_bassin_10", - "Senegal_bassin_11", - "Senegal_bassin_12", - "Senegal", - "Senegal_bassin_5", - "Senegal_bassin_6", - "Senegal_bassin_7", - "Senegal_bassin_8", - "Senegal_bassin_9", - "Senkaku_Islands_bassin_10", - "Senkaku_Islands_bassin_11", - "Senkaku_Islands_bassin_12", - "Senkaku_Islands", - "Senkaku_Islands_bassin_5", - "Senkaku_Islands_bassin_6", - "Senkaku_Islands_bassin_7", - "Senkaku_Islands_bassin_8", - "Senkaku_Islands_bassin_9", - "Serbia_bassin_10", - "Serbia_bassin_11", - "Serbia_bassin_12", - "Serbia", - "Serbia_bassin_5", - "Serbia_bassin_6", - "Serbia_bassin_7", - "Serbia_bassin_8", - "Serbia_bassin_9", - "Seychelles_bassin_10", - "Seychelles_bassin_11", - "Seychelles_bassin_12", - "Seychelles", - "Seychelles_bassin_5", - "Seychelles_bassin_6", - "Seychelles_bassin_7", - "Seychelles_bassin_8", - "Seychelles_bassin_9", - "Sierra_Leone_bassin_10", - "Sierra_Leone_bassin_11", - "Sierra_Leone_bassin_12", - "Sierra_Leone", - "Sierra_Leone_bassin_5", - "Sierra_Leone_bassin_6", - "Sierra_Leone_bassin_7", - "Sierra_Leone_bassin_8", - "Sierra_Leone_bassin_9", - "Singapore_bassin_10", - "Singapore_bassin_11", - "Singapore_bassin_12", - "Singapore", - "Singapore_bassin_5", - "Singapore_bassin_6", - "Singapore_bassin_7", - "Singapore_bassin_8", - "Singapore_bassin_9", - "Slovakia_bassin_10", - "Slovakia_bassin_11", - "Slovakia_bassin_12", - "Slovakia", - "Slovakia_bassin_5", - "Slovakia_bassin_6", - "Slovakia_bassin_7", - "Slovakia_bassin_8", - "Slovakia_bassin_9", - "Slovenia_bassin_10", - "Slovenia_bassin_11", - "Slovenia_bassin_12", - "Slovenia", - "Slovenia_bassin_5", - "Slovenia_bassin_6", - "Slovenia_bassin_7", - "Slovenia_bassin_8", - "Slovenia_bassin_9", - "Solomon_Islands_bassin_10", - "Solomon_Islands_bassin_11", - "Solomon_Islands_bassin_12", - "Solomon_Islands", - "Solomon_Islands_bassin_5", - "Solomon_Islands_bassin_6", - "Solomon_Islands_bassin_7", - "Solomon_Islands_bassin_8", - "Solomon_Islands_bassin_9", - "Somalia_bassin_10", - "Somalia_bassin_11", - "Somalia_bassin_12", - "Somalia", - "Somalia_bassin_5", - "Somalia_bassin_6", - "Somalia_bassin_7", - "Somalia_bassin_8", - "Somalia_bassin_9", - "South_Africa_bassin_10", - "South_Africa_bassin_11", - "South_Africa_bassin_12", - "South_Africa", - "South_Africa_bassin_5", - "South_Africa_bassin_6", - "South_Africa_bassin_7", - "South_Africa_bassin_8", - "South_Africa_bassin_9", - "South_Georgia and the South Sandwich Islands_bassin_10", - "South_Georgia and the South Sandwich Islands_bassin_11", - "South_Georgia and the South Sandwich Islands_bassin_12", - "South_Georgia and the South Sandwich Islands", - "South_Georgia and the South Sandwich Islands_bassin_5", - "South_Georgia and the South Sandwich Islands_bassin_6", - "South_Georgia and the South Sandwich Islands_bassin_7", - "South_Georgia and the South Sandwich Islands_bassin_8", - "South_Georgia and the South Sandwich Islands_bassin_9", - "South_Sudan_bassin_10", - "South_Sudan_bassin_11", - "South_Sudan_bassin_12", - "South_Sudan", - "South_Sudan_bassin_5", - "South_Sudan_bassin_6", - "South_Sudan_bassin_7", - "South_Sudan_bassin_8", - "South_Sudan_bassin_9", - "Spain_bassin_10", - "Spain_bassin_11", - "Spain_bassin_12", - "Spain", - "Spain_bassin_5", - "Spain_bassin_6", - "Spain_bassin_7", - "Spain_bassin_8", - "Spain_bassin_9", - "Spratly_Islands_bassin_10", - "Spratly_Islands_bassin_11", - "Spratly_Islands_bassin_12", - "Spratly_Islands", - "Spratly_Islands_bassin_5", - "Spratly_Islands_bassin_6", - "Spratly_Islands_bassin_7", - "Spratly_Islands_bassin_8", - "Spratly_Islands_bassin_9", - "Sri_Lanka_bassin_10", - "Sri_Lanka_bassin_11", - "Sri_Lanka_bassin_12", - "Sri_Lanka", - "Sri_Lanka_bassin_5", - "Sri_Lanka_bassin_6", - "Sri_Lanka_bassin_7", - "Sri_Lanka_bassin_8", - "Sri_Lanka_bassin_9", - "Suriname_bassin_10", - "Suriname_bassin_11", - "Suriname_bassin_12", - "Suriname", - "Suriname_bassin_5", - "Suriname_bassin_6", - "Suriname_bassin_7", - "Suriname_bassin_8", - "Suriname_bassin_9", - "Svalbard_and Jan Mayen Islands_bassin_10", - "Svalbard_and Jan Mayen Islands_bassin_11", - "Svalbard_and Jan Mayen Islands_bassin_12", - "Svalbard_and Jan Mayen Islands", - "Svalbard_and Jan Mayen Islands_bassin_5", - "Svalbard_and Jan Mayen Islands_bassin_6", - "Svalbard_and Jan Mayen Islands_bassin_7", - "Svalbard_and Jan Mayen Islands_bassin_8", - "Svalbard_and Jan Mayen Islands_bassin_9", - "Swaziland_bassin_10", - "Swaziland_bassin_11", - "Swaziland_bassin_12", - "Swaziland", - "Swaziland_bassin_5", - "Swaziland_bassin_6", - "Swaziland_bassin_7", - "Swaziland_bassin_8", - "Swaziland_bassin_9", - "Sweden_bassin_10", - "Sweden_bassin_11", - "Sweden_bassin_12", - "Sweden", - "Sweden_bassin_5", - "Sweden_bassin_6", - "Sweden_bassin_7", - "Sweden_bassin_8", - "Sweden_bassin_9", - "Switzerland_bassin_10", - "Switzerland_bassin_11", - "Switzerland_bassin_12", - "Switzerland", - "Switzerland_bassin_5", - "Switzerland_bassin_6", - "Switzerland_bassin_7", - "Switzerland_bassin_8", - "Switzerland_bassin_9", - "Syrian_Arab Republic_bassin_10", - "Syrian_Arab Republic_bassin_11", - "Syrian_Arab Republic_bassin_12", - "Syrian_Arab Republic", - "Syrian_Arab Republic_bassin_5", - "Syrian_Arab Republic_bassin_6", - "Syrian_Arab Republic_bassin_7", - "Syrian_Arab Republic_bassin_8", - "Syrian_Arab Republic_bassin_9", - "Taiwan_bassin_10", - "Taiwan_bassin_11", - "Taiwan_bassin_12", - "Taiwan", - "Taiwan_bassin_5", - "Taiwan_bassin_6", - "Taiwan_bassin_7", - "Taiwan_bassin_8", - "Taiwan_bassin_9", - "Tajikistan_bassin_10", - "Tajikistan_bassin_11", - "Tajikistan_bassin_12", - "Tajikistan", - "Tajikistan_bassin_5", - "Tajikistan_bassin_6", - "Tajikistan_bassin_7", - "Tajikistan_bassin_8", - "Tajikistan_bassin_9", - "Thailand_bassin_10", - "Thailand_bassin_11", - "Thailand_bassin_12", - "Thailand", - "Thailand_bassin_5", - "Thailand_bassin_6", - "Thailand_bassin_7", - "Thailand_bassin_8", - "Thailand_bassin_9", - "The_former Yugoslav Republic of Macedonia_bassin_10", - "The_former Yugoslav Republic of Macedonia_bassin_11", - "The_former Yugoslav Republic of Macedonia_bassin_12", - "The_former Yugoslav Republic of Macedonia", - "The_former Yugoslav Republic of Macedonia_bassin_5", - "The_former Yugoslav Republic of Macedonia_bassin_6", - "The_former Yugoslav Republic of Macedonia_bassin_7", - "The_former Yugoslav Republic of Macedonia_bassin_8", - "The_former Yugoslav Republic of Macedonia_bassin_9", - "Timor-Leste_bassin_10", - "Timor-Leste_bassin_11", - "Timor-Leste_bassin_12", - "Timor-Leste", - "Timor-Leste_bassin_5", - "Timor-Leste_bassin_6", - "Timor-Leste_bassin_7", - "Timor-Leste_bassin_8", - "Timor-Leste_bassin_9", - "Togo_bassin_10", - "Togo_bassin_11", - "Togo_bassin_12", - "Togo", - "Togo_bassin_5", - "Togo_bassin_6", - "Togo_bassin_7", - "Togo_bassin_8", - "Togo_bassin_9", - "Tokelau_bassin_10", - "Tokelau_bassin_11", - "Tokelau_bassin_12", - "Tokelau", - "Tokelau_bassin_5", - "Tokelau_bassin_6", - "Tokelau_bassin_7", - "Tokelau_bassin_8", - "Tokelau_bassin_9", - "Tonga_bassin_10", - "Tonga_bassin_11", - "Tonga_bassin_12", - "Tonga", - "Tonga_bassin_5", - "Tonga_bassin_6", - "Tonga_bassin_7", - "Tonga_bassin_8", - "Tonga_bassin_9", - "Trinidad_and Tobago_bassin_10", - "Trinidad_and Tobago_bassin_11", - "Trinidad_and Tobago_bassin_12", - "Trinidad_and Tobago", - "Trinidad_and Tobago_bassin_5", - "Trinidad_and Tobago_bassin_6", - "Trinidad_and Tobago_bassin_7", - "Trinidad_and Tobago_bassin_8", - "Trinidad_and Tobago_bassin_9", - "Tromelin_Island_bassin_10", - "Tromelin_Island_bassin_11", - "Tromelin_Island_bassin_12", - "Tromelin_Island", - "Tromelin_Island_bassin_5", - "Tromelin_Island_bassin_6", - "Tromelin_Island_bassin_7", - "Tromelin_Island_bassin_8", - "Tromelin_Island_bassin_9", - "Tunisia_bassin_10", - "Tunisia_bassin_11", - "Tunisia_bassin_12", - "Tunisia", - "Tunisia_bassin_5", - "Tunisia_bassin_6", - "Tunisia_bassin_7", - "Tunisia_bassin_8", - "Tunisia_bassin_9", - "Turkey_bassin_10", - "Turkey_bassin_11", - "Turkey_bassin_12", - "Turkey", - "Turkey_bassin_5", - "Turkey_bassin_6", - "Turkey_bassin_7", - "Turkey_bassin_8", - "Turkey_bassin_9", - "Turkmenistan_bassin_10", - "Turkmenistan_bassin_11", - "Turkmenistan_bassin_12", - "Turkmenistan", - "Turkmenistan_bassin_5", - "Turkmenistan_bassin_6", - "Turkmenistan_bassin_7", - "Turkmenistan_bassin_8", - "Turkmenistan_bassin_9", - "Turks_and Caicos islands_bassin_10", - "Turks_and Caicos islands_bassin_11", - "Turks_and Caicos islands_bassin_12", - "Turks_and Caicos islands", - "Turks_and Caicos islands_bassin_5", - "Turks_and Caicos islands_bassin_6", - "Turks_and Caicos islands_bassin_7", - "Turks_and Caicos islands_bassin_8", - "Turks_and Caicos islands_bassin_9", - "Tuvalu_bassin_10", - "Tuvalu_bassin_11", - "Tuvalu_bassin_12", - "Tuvalu", - "Tuvalu_bassin_5", - "Tuvalu_bassin_6", - "Tuvalu_bassin_7", - "Tuvalu_bassin_8", - "Tuvalu_bassin_9", - "Uganda_bassin_10", - "Uganda_bassin_11", - "Uganda_bassin_12", - "Uganda", - "Uganda_bassin_5", - "Uganda_bassin_6", - "Uganda_bassin_7", - "Uganda_bassin_8", - "Uganda_bassin_9", - "Ukraine_bassin_10", - "Ukraine_bassin_11", - "Ukraine_bassin_12", - "Ukraine", - "Ukraine_bassin_5", - "Ukraine_bassin_6", - "Ukraine_bassin_7", - "Ukraine_bassin_8", - "Ukraine_bassin_9", - "UK_of Great Britain and Northern Ireland_bassin_10", - "UK_of Great Britain and Northern Ireland_bassin_11", - "UK_of Great Britain and Northern Ireland_bassin_12", - "UK_of Great Britain and Northern Ireland", - "UK_of Great Britain and Northern Ireland_bassin_5", - "UK_of Great Britain and Northern Ireland_bassin_6", - "UK_of Great Britain and Northern Ireland_bassin_7", - "UK_of Great Britain and Northern Ireland_bassin_8", - "UK_of Great Britain and Northern Ireland_bassin_9", - "United_Arab Emirates_bassin_10", - "United_Arab Emirates_bassin_11", - "United_Arab Emirates_bassin_12", - "United_Arab Emirates", - "United_Arab Emirates_bassin_5", - "United_Arab Emirates_bassin_6", - "United_Arab Emirates_bassin_7", - "United_Arab Emirates_bassin_8", - "United_Arab Emirates_bassin_9", - "United_Republic of Tanzania_bassin_10", - "United_Republic of Tanzania_bassin_11", - "United_Republic of Tanzania_bassin_12", - "United_Republic of Tanzania", - "United_Republic of Tanzania_bassin_5", - "United_Republic of Tanzania_bassin_6", - "United_Republic of Tanzania_bassin_7", - "United_Republic of Tanzania_bassin_8", - "United_Republic of Tanzania_bassin_9", - "United_States of America_bassin_10", - "United_States of America_bassin_11", - "United_States of America_bassin_12", - "United_States of America", - "United_States of America_bassin_5", - "United_States of America_bassin_6", - "United_States of America_bassin_7", - "United_States of America_bassin_8", - "United_States of America_bassin_9", - "United_States Virgin Islands_bassin_10", - "United_States Virgin Islands_bassin_11", - "United_States Virgin Islands_bassin_12", - "United_States Virgin Islands", - "United_States Virgin Islands_bassin_5", - "United_States Virgin Islands_bassin_6", - "United_States Virgin Islands_bassin_7", - "United_States Virgin Islands_bassin_8", - "United_States Virgin Islands_bassin_9", - "Uruguay_bassin_10", - "Uruguay_bassin_11", - "Uruguay_bassin_12", - "Uruguay", - "Uruguay_bassin_5", - "Uruguay_bassin_6", - "Uruguay_bassin_7", - "Uruguay_bassin_8", - "Uruguay_bassin_9", - "Uzbekistan_bassin_10", - "Uzbekistan_bassin_11", - "Uzbekistan_bassin_12", - "Uzbekistan", - "Uzbekistan_bassin_5", - "Uzbekistan_bassin_6", - "Uzbekistan_bassin_7", - "Uzbekistan_bassin_8", - "Uzbekistan_bassin_9", - "Vanuatu_bassin_10", - "Vanuatu_bassin_11", - "Vanuatu_bassin_12", - "Vanuatu", - "Vanuatu_bassin_5", - "Vanuatu_bassin_6", - "Vanuatu_bassin_7", - "Vanuatu_bassin_8", - "Vanuatu_bassin_9", - "Venezuela_bassin_10", - "Venezuela_bassin_11", - "Venezuela_bassin_12", - "Venezuela", - "Venezuela_bassin_5", - "Venezuela_bassin_6", - "Venezuela_bassin_7", - "Venezuela_bassin_8", - "Venezuela_bassin_9", - "Viet_Nam_bassin_10", - "Viet_Nam_bassin_11", - "Viet_Nam_bassin_12", - "Viet_Nam", - "Viet_Nam_bassin_5", - "Viet_Nam_bassin_6", - "Viet_Nam_bassin_7", - "Viet_Nam_bassin_8", - "Viet_Nam_bassin_9", - "Wake_Island_bassin_10", - "Wake_Island_bassin_11", - "Wake_Island_bassin_12", - "Wake_Island", - "Wake_Island_bassin_5", - "Wake_Island_bassin_6", - "Wake_Island_bassin_7", - "Wake_Island_bassin_8", - "Wake_Island_bassin_9", - "Wallis_and Futuna_bassin_10", - "Wallis_and Futuna_bassin_11", - "Wallis_and Futuna_bassin_12", - "Wallis_and Futuna", - "Wallis_and Futuna_bassin_5", - "Wallis_and Futuna_bassin_6", - "Wallis_and Futuna_bassin_7", - "Wallis_and Futuna_bassin_8", - "Wallis_and Futuna_bassin_9", - "Western_Sahara_bassin_10", - "Western_Sahara_bassin_11", - "Western_Sahara_bassin_12", - "Western_Sahara", - "Western_Sahara_bassin_5", - "Western_Sahara_bassin_6", - "Western_Sahara_bassin_7", - "Western_Sahara_bassin_8", - "Western_Sahara_bassin_9", - "West_Bank_bassin_10", - "West_Bank_bassin_11", - "West_Bank_bassin_12", - "West_Bank", - "West_Bank_bassin_5", - "West_Bank_bassin_6", - "West_Bank_bassin_7", - "West_Bank_bassin_8", - "West_Bank_bassin_9", - "Yemen_bassin_10", - "Yemen_bassin_11", - "Yemen_bassin_12", - "Yemen", - "Yemen_bassin_5", - "Yemen_bassin_6", - "Yemen_bassin_7", - "Yemen_bassin_8", - "Yemen_bassin_9", - "Zambia_bassin_10", - "Zambia_bassin_11", - "Zambia_bassin_12", - "Zambia", - "Zambia_bassin_5", - "Zambia_bassin_6", - "Zambia_bassin_7", - "Zambia_bassin_8", - "Zambia_bassin_9", - "Zimbabwe_bassin_10", - "Zimbabwe_bassin_11", - "Zimbabwe_bassin_12", - "Zimbabwe", - "Zimbabwe_bassin_5", - "Zimbabwe_bassin_6", - "Zimbabwe_bassin_7", - "Zimbabwe_bassin_8", - "Zimbabwe_bassin_9" - ) ); - - public static void main(String[] args) { - - ArrayList missingCountries = new ArrayList(); - - for (String country : allCountryNames) { - if( !filesGenerated.contains(country) ) { - missingCountries.add( country); - } - } - System.out.println( missingCountries.size() ); - System.out.println( missingCountries ); - - String finalCountries = ""; - for (String missing : missingCountries) { - finalCountries += '"' + missing.replaceAll( "_", " ") + "\", "; - } - System.out.println( finalCountries ); - - } - - -} +package org.openforis.collect.earth.app.model; + +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.view.Messages; + +/** + * Enumeration of the dynamics that Collect Earth can use to classify the plots. + * + * @author Alfonso Sanchez-Paus Diaz + * + */ +public enum DynamicsCode { + FROM_FOREST(Messages.getString("DynamicsCode.0"), 1), FROM_GRASSLAND(Messages.getString("DynamicsCode.1"), 3), FROM_SETTLEMENT(Messages.getString("DynamicsCode.2"), 4), FROM_OTHERLAND(Messages.getString("DynamicsCode.3"), 5), FROM_WETLAND(Messages.getString("DynamicsCode.4"), 6), FROM_CROPLAND(Messages.getString("DynamicsCode.5"), 7), NA("NA", 8); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ + + private String label; + + private int id; + + private DynamicsCode(String label, int id) { + this.label = label; + this.id = id; + } + + public int getId() { + return id; + } + + public String getLabel() { + return label; + } + + public void setId(int id) { + this.id = id; + } + + @Override + public String toString() { + return label; + } + + public static Integer getDynamicsCode(String landUseSubcategory) { + if( landUseSubcategory.startsWith("FLto") ){ //$NON-NLS-1$ + return FROM_FOREST.getId(); + }else if( landUseSubcategory.startsWith("CLto") ){ //$NON-NLS-1$ + return FROM_CROPLAND.getId(); + }else if( landUseSubcategory.startsWith("SLto") ){ //$NON-NLS-1$ + return FROM_SETTLEMENT.getId(); + }else if( landUseSubcategory.startsWith("WLto") ){ //$NON-NLS-1$ + return FROM_WETLAND.getId(); + }else if( landUseSubcategory.startsWith("GLto") ){ //$NON-NLS-1$ + return FROM_GRASSLAND.getId(); + }else if( landUseSubcategory.startsWith("OLto") || landUseSubcategory.startsWith("OTto")){ //$NON-NLS-1$ //$NON-NLS-2$ + return FROM_OTHERLAND.getId(); + }else if ( StringUtils.isBlank( landUseSubcategory )) { + throw new IllegalArgumentException("The land use subcategory " + landUseSubcategory + " is not recognizable."); //$NON-NLS-1$ //$NON-NLS-2$ + }else{ + return NA.getId(); + } + } + +} From d7c089d641f83bfc543fd48126fababe565bf118 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:31 +0100 Subject: [PATCH 0061/1620] New translations DynamicsCode.java (English) --- .../earth/app/view/Messages_en.properties | 140 +++++------------- 1 file changed, 41 insertions(+), 99 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 511ad9d567..f5ef63f5c6 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,119 +1,61 @@ -package org.openforis.collect.earth.app.server; +package org.openforis.collect.earth.app.model; -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Locale; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.regex.Pattern; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.apache.commons.io.FileUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.desktop.ServerController; -import org.openforis.collect.earth.app.service.BrowserNotFoundException; -import org.openforis.collect.earth.app.service.BrowserService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openqa.selenium.remote.RemoteWebDriver; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.view.Messages; /** - * This servlet is called by the balloon (KML pop-up form) when it is open and the user has chosen to see the form in a separate browser - * window. - * In that case a special HTML is used whose sole purpose is to load an invisible iframe that calls the URL localhot/openInBrowser - * This causes a new browser window to open and then the browser is redirected to another URL ( localhost/balloon ) that contains the actual HTML - * form. - * The functionality is used mostly for LINUX users due to the different bugs present in Google Earth for LINUX which makes the Bootstrap library - * fail. - * + * Enumeration of the dynamics that Collect Earth can use to classify the plots. + * * @author Alfonso Sanchez-Paus Diaz - * + * */ -@Controller -public class BalloonServlet extends DataAccessingServlet { - - @Autowired - private BrowserService browserService; +public enum DynamicsCode { + FROM_FOREST(Messages.getString("DynamicsCode.0"), 1), FROM_GRASSLAND(Messages.getString("DynamicsCode.1"), 3), FROM_SETTLEMENT(Messages.getString("DynamicsCode.2"), 4), FROM_OTHERLAND(Messages.getString("DynamicsCode.3"), 5), FROM_WETLAND(Messages.getString("DynamicsCode.4"), 6), FROM_CROPLAND(Messages.getString("DynamicsCode.5"), 7), NA("NA", 8); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ - @Autowired - private LocalPropertiesService localPropertiesService; + private String label; - private RemoteWebDriver webKitDriver = null; + private int id; - private static final String BALLOON_EXTERNAL_URL = "balloon"; //$NON-NLS-1$ - - private String buildGetParameters(Map parameterMap) { - final StringBuilder getParameters = new StringBuilder(); - final Set> entrySet = parameterMap.entrySet(); - for (final Entry entry : entrySet) { - getParameters.append(entry.getKey()).append("=").append(entry.getValue()[0]).append("&"); //$NON-NLS-1$ //$NON-NLS-2$ - } - return getParameters.toString(); + private DynamicsCode(String label, int id) { + this.label = label; + this.id = id; } - @GetMapping("/openInBrowser") - public void openInBrowser(HttpServletResponse response, HttpServletRequest request, String imageName) { - String url = ServerController.getHostAddress(localPropertiesService.getHost(), localPropertiesService.getLocalPort()); - url = url + BALLOON_EXTERNAL_URL + "?" + buildGetParameters(request.getParameterMap()); //$NON-NLS-1$ - final String fUrl = url; - final Thread openBrowser = new Thread("Open URL in browser : " + fUrl) { - @Override - public void run() { - try { - webKitDriver = browserService.navigateTo(fUrl, webKitDriver, false); - } catch (BrowserNotFoundException e) { - logger.error("No browser found", e); //$NON-NLS-1$ - } - } - }; - openBrowser.start(); + public int getId() { + return id; } - private String replaceGoalsWithParameters(String htmlWithGoals, Map parameterMap) { - final Set> entrySet = parameterMap.entrySet(); - for (final Entry entry : entrySet) { - htmlWithGoals = htmlWithGoals.replaceAll("\\$\\[" + Pattern.quote( entry.getKey() ) + "\\]", entry.getValue()[0]); //$NON-NLS-1$ //$NON-NLS-2$ - } - return htmlWithGoals; + public String getLabel() { + return label; } - @GetMapping("/"+BALLOON_EXTERNAL_URL) - public void returnBalloon(HttpServletResponse response, HttpServletRequest request, String imageName) throws IOException { - response.setHeader("Content-Type", "text/html"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Content-Disposition", "inline; filename=\"" + imageName + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Date", new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH).format(new Date())); //$NON-NLS-1$ - - String balloonContents = FileUtils.readFileToString( new File(localPropertiesService.getBalloonFile()), StandardCharsets.UTF_8 ); - - if (balloonContents != null) { - balloonContents = balloonContents.replace(EarthConstants.FOLDER_COPIED_TO_KMZ + "/", EarthConstants.GENERATED_FOLDER_SUFFIX + "/" //$NON-NLS-1$ //$NON-NLS-2$ - + EarthConstants.FOLDER_COPIED_TO_KMZ + "/"); //$NON-NLS-1$ - balloonContents = replaceGoalsWithParameters(balloonContents, request.getParameterMap()); + public void setId(int id) { + this.id = id; + } - final byte[] bytes = balloonContents.getBytes(); - response.setHeader("Content-Length", Integer.toString( bytes.length ) ); //$NON-NLS-1$ //$NON-NLS-2$ - writeToResponse(response, bytes); - } else { - getLogger().error("There was a problem fetching the balloon html, please check the name!"); //$NON-NLS-1$ - } + @Override + public String toString() { + return label; } - private void writeToResponse(HttpServletResponse response, byte[] fileContents) throws IOException { - try { - response.getOutputStream().write(fileContents); - } catch (final Exception e) { - getLogger().error("Error writing reponse body to output stream ", e); //$NON-NLS-1$ - } finally { - response.getOutputStream().close(); + public static Integer getDynamicsCode(String landUseSubcategory) { + if( landUseSubcategory.startsWith("FLto") ){ //$NON-NLS-1$ + return FROM_FOREST.getId(); + }else if( landUseSubcategory.startsWith("CLto") ){ //$NON-NLS-1$ + return FROM_CROPLAND.getId(); + }else if( landUseSubcategory.startsWith("SLto") ){ //$NON-NLS-1$ + return FROM_SETTLEMENT.getId(); + }else if( landUseSubcategory.startsWith("WLto") ){ //$NON-NLS-1$ + return FROM_WETLAND.getId(); + }else if( landUseSubcategory.startsWith("GLto") ){ //$NON-NLS-1$ + return FROM_GRASSLAND.getId(); + }else if( landUseSubcategory.startsWith("OLto") || landUseSubcategory.startsWith("OTto")){ //$NON-NLS-1$ //$NON-NLS-2$ + return FROM_OTHERLAND.getId(); + }else if ( StringUtils.isBlank( landUseSubcategory )) { + throw new IllegalArgumentException("The land use subcategory " + landUseSubcategory + " is not recognizable."); //$NON-NLS-1$ //$NON-NLS-2$ + }else{ + return NA.getId(); } } + } From 78255fc2ca6ea9a989d85929145c53eb28961238 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:32 +0100 Subject: [PATCH 0062/1620] New translations SlopeCode.java (French) --- .../earth/app/view/Messages_fr.properties | 108 +++++++++--------- 1 file changed, 52 insertions(+), 56 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 499b7cb5ec..eb2152ecb3 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,74 +1,70 @@ -package org.openforis.collect.earth.app.ad_hoc; +package org.openforis.collect.earth.app.model; -import java.util.List; +import org.openforis.collect.earth.app.view.Messages; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.manager.RecordManager; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.CollectRecordSummary; -import org.openforis.collect.model.RecordFilter; -import org.openforis.idm.model.Coordinate; -import org.openforis.idm.model.CoordinateAttribute; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; +/** + * Slope codes by range associated to a slope in degrees ( 0-5 degrees flat, 6-15 slight, 15-30 steep and so on) + * @author Alfonso Sanchez-Paus Diaz + * + */ +public enum SlopeCode { + FLAT(Messages.getString("SlopeCode.0"), 1, 0, 5), SLIGHT("6-15", 2, 6, 15), STEEP("16-30", 3, 16, 30), VERY_STEEP("31-45", 4, 31, 45), EXTREME("46-60", 5, 46, 60), FALL( //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ + "61-90", 6, 61, 90), NA("NA", 7, -1, -1); //$NON-NLS-1$ //$NON-NLS-2$ -@Component -public abstract class FixCoordinates { + + /** + * Utility method to calculate the slope-code for a given slope in degrees. + * @param slope The slope in degrees + * @return The slope code for the given slope in degrees. + */ + public static SlopeCode getSlopeCode(int slope) { - @Autowired - private RecordManager recordManager; + final SlopeCode[] slopeCodes = SlopeCode.values(); + for (final SlopeCode slopeCode : slopeCodes) { + if (slope >= slopeCode.getStartSlope() && slope <= slopeCode.getEndSlope()) { + return slopeCode; + } + } + return null; - @Autowired - private EarthSurveyService earthSurveyService; + } - private Logger logger = LoggerFactory.getLogger( FixCoordinates.class); + private String label; - private boolean stopFix = false; + private int id; + + /** + * The start and end of the range used to classify a slope code. + */ + private int startSlope, endSlope; + - private List getAllRecords(){ - RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); - return recordManager.loadSummaries( rf ); + private SlopeCode(String label, int id, int startSlope, int endSlope) { + this.label = label; + this.id = id; + this.startSlope = startSlope; + this.endSlope = endSlope; } - public void fixCoordinates(){ - List allRecords = getAllRecords(); - - if( shouldStopFixing()){ - return; - } - - for (CollectRecordSummary summaryCollectRecord : allRecords) { - if( shouldStopFixing()){ - break; - } - try { - CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); - CoordinateAttribute plotCoord = (CoordinateAttribute) collectRecord.getNodeByPath("/plot/location"); //$NON-NLS-1$ - if( plotCoord != null && plotCoord.getValue() != null && plotCoord.getValue().getX() < getLongitudeLimit() ){ - Coordinate coordinate = new Coordinate(plotCoord.getValue().getY(), plotCoord.getValue().getX(), plotCoord.getValue().getSrsId() ); - plotCoord.setValue( coordinate ); - recordManager.save( collectRecord ); - } - } catch (Exception e) { - logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ - } - } - + public int getEndSlope() { + return endSlope; } - protected abstract int getLongitudeLimit(); + public int getId() { + return id; + } - private boolean shouldStopFixing() { - return stopFix; + public String getLabel() { + return label; } - public void stopFixing() { - stopFix = true; + public int getStartSlope() { + return startSlope; + } + @Override + public String toString() { + return label; } -} \ No newline at end of file +} From 47e1fb02d4e0bb7b673df73e254f380c64c3de5c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:33 +0100 Subject: [PATCH 0063/1620] New translations SlopeCode.java (Spanish) --- .../earth/app/view/Messages_es.properties | 1965 +---------------- 1 file changed, 70 insertions(+), 1895 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 768f973a7f..eb2152ecb3 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,1895 +1,70 @@ -package org.openforis.collect.earth.app.ad_hoc; - -import java.util.ArrayList; -import java.util.Arrays; - -public class findMissingCountries { - - private static ArrayList allCountryNames = new ArrayList<>( - Arrays.asList( - "Abyei", - "Afghanistan", - "Aksai_Chin", - "Albania", - "Algeria", - "American_Samoa", - "Andorra", - "Angola", - "Anguilla", - "Antarctica", - "Antigua_and_Barbuda", - "Argentina", - "Armenia", - "Aruba", - "Arunachal_Pradesh", - "Ashmore_and_Cartier_Islands", - "Australia", - "Austria", - "Azerbaijan", - "Azores_Islands", - "Bahamas", - "Bahrain", - "Baker_Island", - "Bangladesh", - "Barbados", - "Bassas_da_India", - "Belarus", - "Belgium", - "Belize", - "Benin", - "Bermuda", - "Bhutan", - "Bird_Island", - "Bolivia", - "Bosnia_and_Herzegovina", - "Botswana", - "Bouvet_Island", - "Brazil", - "British_Indian_Ocean_Territory", - "British_Virgin_Islands", - "Brunei_Darussalam", - "Bulgaria", - "Burkina_Faso", - "Burundi", - "Cambodia", - "Cameroon", - "Canada", - "Cape_Verde", - "Cayman_Islands", - "Central_African_Republic", - "Chad", - "Chile", - "China", - "China/India", - "Christmas_Island", - "Clipperton_Island", - "Cocos__Keeling__Islands", - "Colombia", - "Comoros", - "Congo", - "Cook_Islands", - "Costa_Rica", - "Croatia", - "Cuba", - "Cyprus", - "Czech_Republic", - "C�te_d_Ivoire", - "Dem_People_s_Rep_of_Korea", - "Democratic_Republic_of_the_Congo", - "Denmark", - "Djibouti", - "Dominica", - "Dominican_Republic", - "Ecuador", - "Egypt", - "El_Salvador", - "Equatorial_Guinea", - "Eritrea", - "Estonia", - "Ethiopia", - "Europa_Island", - "Falkland_Islands__Malvinas_", - "Faroe_Islands", - "Fiji", - "Finland", - "France", - "French_Guiana", - "French_Polynesia", - "French_Southern_and_Antarctic_Territories", - "Gabon", - "Gambia", - "Gaza_Strip", - "Georgia", - "Germany", - "Ghana", - "Gibraltar", - "Glorioso_Island", - "Greece", - "Greenland", - "Grenada", - "Guadeloupe", - "Guam", - "Guatemala", - "Guernsey", - "Guinea", - "Guinea-Bissau", - "Guyana", - "Haiti", - "Hala_ib_triangle", - "Heard_Island_and_McDonald_Islands", - "Holy_See", - "Honduras", - "Hong_Kong", - "Howland_Island", - "Hungary", - "Iceland", - "Ilemi_triangle", - "India", - "Indonesia", - "Iran___Islamic_Republic_of_", - "Iraq", - "Ireland", - "Isle_of_Man", - "Israel", - "Italy", - "Jamaica", - "Jammu_and_Kashmir", - "Japan", - "Jarvis_Island", - "Jersey", - "Johnston_Atoll", - "Jordan", - "Juan_de_Nova_Island", - "Kazakhstan", - "Kenya", - "Kingman_Reef", - "Kiribati", - "Kuril_islands", - "Kuwait", - "Kyrgyzstan", - "Lao_People_s_Democratic_Republic", - "Latvia", - "Lebanon", - "Lesotho", - "Liberia", - "Libya", - "Liechtenstein", - "Lithuania", - "Luxembourg", - "Ma_tan_al-Sarra", - "Macau", - "Madagascar", - "Madeira_Islands", - "Malawi", - "Malaysia", - "Maldives", - "Mali", - "Malta", - "Marshall_Islands", - "Martinique", - "Mauritania", - "Mauritius", - "Mayotte", - "Mexico", - "Micronesia__Federated_States_of_", - "Midway_Island", - "Moldova,_Republic_of", - "Monaco", - "Mongolia", - "Montenegro", - "Montserrat", - "Morocco", - "Mozambique", - "Myanmar", - "Namibia", - "Nauru", - "Navassa_Island", - "Nepal", - "Netherlands", - "Netherlands_Antilles", - "New_Caledonia", - "New_Zealand", - "Nicaragua", - "Niger", - "Nigeria", - "Niue", - "Norfolk_Island", - "Northern_Mariana_Islands", - "Norway", - "Oman", - "Pakistan", - "Palau", - "Palmyra_Atoll", - "Panama", - "Papua_New_Guinea", - "Paracel_Islands", - "Paraguay", - "Peru", - "Philippines", - "Pitcairn", - "Poland", - "Portugal", - "Puerto_Rico", - "Qatar", - "Republic_of_Korea", - "Romania", - "Russian_Federation", - "Rwanda", - "R�union", - "Saint_Helena", - "Saint_Kitts_and_Nevis", - "Saint_Lucia", - "Saint_Pierre_et_Miquelon", - "Saint_Vincent_and_the_Grenadines", - "Samoa", - "San_Marino", - "Sao_Tome_and_Principe", - "Saudi_Arabia", - "Scarborough_Reef", - "Senegal", - "Senkaku_Islands", - "Serbia", - "Seychelles", - "Sierra_Leone", - "Singapore", - "Slovakia", - "Slovenia", - "Solomon_Islands", - "Somalia", - "South_Africa", - "South_Georgia_and_the_South_Sandwich_Islands", - "South_Sudan", - "Spain", - "Spratly_Islands", - "Sri_Lanka", - "Sudan", - "Suriname", - "Svalbard_and_Jan_Mayen_Islands", - "Swaziland", - "Sweden", - "Switzerland", - "Syrian_Arab_Republic", - "Taiwan", - "Tajikistan", - "Thailand", - "The_former_Yugoslav_Republic_of_Macedonia", - "Timor-Leste", - "Togo", - "Tokelau", - "Tonga", - "Trinidad_and_Tobago", - "Tromelin_Island", - "Tunisia", - "Turkey", - "Turkmenistan", - "Turks_and_Caicos_islands", - "Tuvalu", - "UK_of_Great_Britain_and_Northern_Ireland", - "Uganda", - "Ukraine", - "United_Arab_Emirates", - "United_Republic_of_Tanzania", - "United_States_Virgin_Islands", - "United_States_of_America", - "Uruguay", - "Uzbekistan", - "Vanuatu", - "Venezuela", - "Viet_Nam", - "Wake_Island", - "Wallis_and_Futuna", - "West_Bank", - "Western_Sahara", - "Yemen", - "Zambia", - "Zimbabwe" ) ); - - private static ArrayList filesGenerated = new ArrayList<>( - Arrays.asList( "Azores_Islands_bassin_10", - "Azores_Islands_bassin_11", - "Azores_Islands_bassin_12", - "Azores_Islands", - "Azores_Islands_bassin_5", - "Azores_Islands_bassin_6", - "Azores_Islands_bassin_7", - "Azores_Islands_bassin_8", - "Azores_Islands_bassin_9", - "Brunei_Darussalam_bassin_10", - "Brunei_Darussalam_bassin_11", - "Brunei_Darussalam_bassin_12", - "Brunei_Darussalam_bassin_7", - "Brunei_Darussalam_bassin_8", - "Brunei_Darussalam_bassin_9", - "Bulgaria_bassin_10", - "Bulgaria_bassin_11", - "Bulgaria_bassin_12", - "Bulgaria", - "Bulgaria_bassin_5", - "Bulgaria_bassin_6", - "Bulgaria_bassin_7", - "Bulgaria_bassin_8", - "Bulgaria_bassin_9", - "Burkina_Faso_bassin_10", - "Burkina_Faso_bassin_11", - "Burkina_Faso_bassin_12", - "Burkina_Faso", - "Burkina_Faso_bassin_5", - "Burkina_Faso_bassin_6", - "Burkina_Faso_bassin_7", - "Burkina_Faso_bassin_8", - "Burkina_Faso_bassin_9", - "Burundi_bassin_10", - "Burundi_bassin_11", - "Burundi_bassin_12", - "Burundi", - "Burundi_bassin_5", - "Burundi_bassin_6", - "Burundi_bassin_7", - "Burundi_bassin_8", - "Burundi_bassin_9", - "Cambodia_bassin_10", - "Cambodia_bassin_11", - "Cambodia_bassin_12", - "Cambodia", - "Cambodia_bassin_5", - "Cambodia_bassin_6", - "Cambodia_bassin_7", - "Cambodia_bassin_8", - "Cambodia_bassin_9", - "Cameroon_bassin_10", - "Cameroon_bassin_11", - "Cameroon_bassin_12", - "Cameroon", - "Cameroon_bassin_5", - "Cameroon_bassin_6", - "Cameroon_bassin_7", - "Cameroon_bassin_8", - "Cameroon_bassin_9", - "Canada_bassin_10", - "Canada_bassin_11", - "Canada_bassin_12", - "Canada", - "Canada_bassin_5", - "Canada_bassin_6", - "Canada_bassin_7", - "Canada_bassin_8", - "Canada_bassin_9", - "Cape_Verde_bassin_10", - "Cape_Verde_bassin_11", - "Cape_Verde_bassin_12", - "Cape_Verde", - "Cape_Verde_bassin_5", - "Cape_Verde_bassin_6", - "Cape_Verde_bassin_7", - "Cape_Verde_bassin_8", - "Cape_Verde_bassin_9", - "Cayman_Islands_bassin_10", - "Cayman_Islands_bassin_11", - "Cayman_Islands_bassin_12", - "Cayman_Islands", - "Cayman_Islands_bassin_5", - "Cayman_Islands_bassin_6", - "Cayman_Islands_bassin_7", - "Cayman_Islands_bassin_8", - "Cayman_Islands_bassin_9", - "Central_African Republic_bassin_10", - "Central_African Republic_bassin_11", - "Central_African Republic_bassin_12", - "Central_African Republic", - "Central_African Republic_bassin_5", - "Central_African Republic_bassin_6", - "Central_African Republic_bassin_7", - "Central_African Republic_bassin_8", - "Central_African Republic_bassin_9", - "Chad_bassin_10", - "Chad_bassin_11", - "Chad_bassin_12", - "Chad", - "Chad_bassin_5", - "Chad_bassin_6", - "Chad_bassin_7", - "Chad_bassin_8", - "Chad_bassin_9", - "Chile_bassin_10", - "Chile_bassin_11", - "Chile_bassin_12", - "Chile", - "Chile_bassin_5", - "Chile_bassin_6", - "Chile_bassin_7", - "Chile_bassin_8", - "Chile_bassin_9", - "China_bassin_10", - "China_bassin_11", - "China_bassin_12", - "China", - "China_bassin_5", - "China_bassin_6", - "China_bassin_7", - "China_bassin_8", - "China_bassin_9", - "Christmas_Island_bassin_10", - "Christmas_Island_bassin_11", - "Christmas_Island_bassin_12", - "Christmas_Island", - "Christmas_Island_bassin_5", - "Christmas_Island_bassin_6", - "Christmas_Island_bassin_7", - "Christmas_Island_bassin_8", - "Christmas_Island_bassin_9", - "Clipperton_Island_bassin_10", - "Clipperton_Island_bassin_11", - "Clipperton_Island_bassin_12", - "Clipperton_Island", - "Clipperton_Island_bassin_5", - "Clipperton_Island_bassin_6", - "Clipperton_Island_bassin_7", - "Clipperton_Island_bassin_8", - "Clipperton_Island_bassin_9", - "Colombia_bassin_10", - "Colombia_bassin_11", - "Colombia_bassin_12", - "Colombia", - "Colombia_bassin_5", - "Colombia_bassin_6", - "Colombia_bassin_7", - "Colombia_bassin_8", - "Colombia_bassin_9", - "Comoros_bassin_10", - "Comoros_bassin_11", - "Comoros_bassin_12", - "Comoros", - "Comoros_bassin_5", - "Comoros_bassin_6", - "Comoros_bassin_7", - "Comoros_bassin_8", - "Comoros_bassin_9", - "Congo_bassin_10", - "Congo_bassin_11", - "Congo_bassin_12", - "Congo", - "Congo_bassin_5", - "Congo_bassin_6", - "Congo_bassin_7", - "Congo_bassin_8", - "Congo_bassin_9", - "Cook_Islands_bassin_10", - "Cook_Islands_bassin_11", - "Cook_Islands_bassin_12", - "Cook_Islands", - "Cook_Islands_bassin_5", - "Cook_Islands_bassin_6", - "Cook_Islands_bassin_7", - "Cook_Islands_bassin_8", - "Cook_Islands_bassin_9", - "Costa_Rica_bassin_10", - "Costa_Rica_bassin_11", - "Costa_Rica_bassin_12", - "Costa_Rica", - "Costa_Rica_bassin_5", - "Costa_Rica_bassin_6", - "Costa_Rica_bassin_7", - "Costa_Rica_bassin_8", - "Costa_Rica_bassin_9", - "Croatia_bassin_10", - "Croatia_bassin_11", - "Croatia_bassin_12", - "Croatia", - "Croatia_bassin_5", - "Croatia_bassin_6", - "Croatia_bassin_7", - "Croatia_bassin_8", - "Croatia_bassin_9", - "Cuba_bassin_10", - "Cuba_bassin_11", - "Cuba_bassin_12", - "Cuba", - "Cuba_bassin_5", - "Cuba_bassin_6", - "Cuba_bassin_7", - "Cuba_bassin_8", - "Cuba_bassin_9", - "Cyprus_bassin_10", - "Cyprus_bassin_11", - "Cyprus_bassin_12", - "Cyprus", - "Cyprus_bassin_5", - "Cyprus_bassin_6", - "Cyprus_bassin_7", - "Cyprus_bassin_8", - "Cyprus_bassin_9", - "Czech_Republic_bassin_10", - "Czech_Republic_bassin_11", - "Czech_Republic_bassin_12", - "Czech_Republic", - "Czech_Republic_bassin_5", - "Czech_Republic_bassin_6", - "Czech_Republic_bassin_7", - "Czech_Republic_bassin_8", - "Czech_Republic_bassin_9", - "Democratic_Republic of the Congo_bassin_10", - "Democratic_Republic of the Congo_bassin_11", - "Democratic_Republic of the Congo_bassin_12", - "Democratic_Republic of the Congo", - "Democratic_Republic of the Congo_bassin_5", - "Democratic_Republic of the Congo_bassin_6", - "Democratic_Republic of the Congo_bassin_7", - "Democratic_Republic of the Congo_bassin_8", - "Democratic_Republic of the Congo_bassin_9", - "Dem_Peoples Rep of Korea_bassin_10", - "Dem_Peoples Rep of Korea_bassin_11", - "Dem_Peoples Rep of Korea_bassin_12", - "Dem_Peoples Rep of Korea", - "Dem_Peoples Rep of Korea_bassin_5", - "Dem_Peoples Rep of Korea_bassin_6", - "Dem_Peoples Rep of Korea_bassin_7", - "Dem_Peoples Rep of Korea_bassin_8", - "Dem_Peoples Rep of Korea_bassin_9", - "Denmark_bassin_10", - "Denmark_bassin_11", - "Denmark_bassin_12", - "Denmark", - "Denmark_bassin_5", - "Denmark_bassin_6", - "Denmark_bassin_7", - "Denmark_bassin_8", - "Denmark_bassin_9", - "Djibouti_bassin_10", - "Djibouti_bassin_11", - "Djibouti_bassin_12", - "Djibouti", - "Djibouti_bassin_5", - "Djibouti_bassin_6", - "Djibouti_bassin_7", - "Djibouti_bassin_8", - "Djibouti_bassin_9", - "Dominican_Republic_bassin_10", - "Dominican_Republic_bassin_11", - "Dominican_Republic_bassin_12", - "Dominican_Republic", - "Dominican_Republic_bassin_5", - "Dominican_Republic_bassin_6", - "Dominican_Republic_bassin_7", - "Dominican_Republic_bassin_8", - "Dominican_Republic_bassin_9", - "Dominica_bassin_10", - "Dominica_bassin_11", - "Dominica_bassin_12", - "Dominica", - "Dominica_bassin_5", - "Dominica_bassin_6", - "Dominica_bassin_7", - "Dominica_bassin_8", - "Dominica_bassin_9", - "Ecuador_bassin_10", - "Ecuador_bassin_11", - "Ecuador_bassin_12", - "Ecuador", - "Ecuador_bassin_5", - "Ecuador_bassin_6", - "Ecuador_bassin_7", - "Ecuador_bassin_8", - "Ecuador_bassin_9", - "Egypt_bassin_10", - "Egypt_bassin_11", - "Egypt_bassin_12", - "Egypt", - "Egypt_bassin_5", - "Egypt_bassin_6", - "Egypt_bassin_7", - "Egypt_bassin_8", - "Egypt_bassin_9", - "El_Salvador_bassin_10", - "El_Salvador_bassin_11", - "El_Salvador_bassin_12", - "El_Salvador", - "El_Salvador_bassin_5", - "El_Salvador_bassin_6", - "El_Salvador_bassin_7", - "El_Salvador_bassin_8", - "El_Salvador_bassin_9", - "Equatorial_Guinea_bassin_10", - "Equatorial_Guinea_bassin_11", - "Equatorial_Guinea_bassin_12", - "Equatorial_Guinea", - "Equatorial_Guinea_bassin_5", - "Equatorial_Guinea_bassin_6", - "Equatorial_Guinea_bassin_7", - "Equatorial_Guinea_bassin_8", - "Equatorial_Guinea_bassin_9", - "Eritrea_bassin_10", - "Eritrea_bassin_11", - "Eritrea_bassin_12", - "Eritrea", - "Eritrea_bassin_5", - "Eritrea_bassin_6", - "Eritrea_bassin_7", - "Eritrea_bassin_8", - "Eritrea_bassin_9", - "Estonia_bassin_10", - "Estonia_bassin_11", - "Estonia_bassin_12", - "Estonia", - "Estonia_bassin_5", - "Estonia_bassin_6", - "Estonia_bassin_7", - "Estonia_bassin_8", - "Estonia_bassin_9", - "Ethiopia_bassin_10", - "Ethiopia_bassin_11", - "Ethiopia_bassin_12", - "Ethiopia", - "Ethiopia_bassin_5", - "Ethiopia_bassin_6", - "Ethiopia_bassin_7", - "Ethiopia_bassin_8", - "Ethiopia_bassin_9", - "Europa_Island_bassin_10", - "Europa_Island_bassin_11", - "Europa_Island_bassin_12", - "Europa_Island", - "Europa_Island_bassin_5", - "Europa_Island_bassin_6", - "Europa_Island_bassin_7", - "Europa_Island_bassin_8", - "Europa_Island_bassin_9", - "Faroe_Islands_bassin_10", - "Faroe_Islands_bassin_11", - "Faroe_Islands_bassin_12", - "Faroe_Islands", - "Faroe_Islands_bassin_5", - "Faroe_Islands_bassin_6", - "Faroe_Islands_bassin_7", - "Faroe_Islands_bassin_8", - "Faroe_Islands_bassin_9", - "Fiji_bassin_10", - "Fiji_bassin_11", - "Fiji_bassin_12", - "Fiji", - "Fiji_bassin_5", - "Fiji_bassin_6", - "Fiji_bassin_7", - "Fiji_bassin_8", - "Fiji_bassin_9", - "Finland_bassin_10", - "Finland_bassin_11", - "Finland_bassin_12", - "Finland", - "Finland_bassin_5", - "Finland_bassin_6", - "Finland_bassin_7", - "Finland_bassin_8", - "Finland_bassin_9", - "France_bassin_10", - "France_bassin_11", - "France_bassin_12", - "France", - "France_bassin_5", - "France_bassin_6", - "France_bassin_7", - "France_bassin_8", - "France_bassin_9", - "French_Guiana_bassin_10", - "French_Guiana_bassin_11", - "French_Guiana_bassin_12", - "French_Guiana", - "French_Guiana_bassin_5", - "French_Guiana_bassin_6", - "French_Guiana_bassin_7", - "French_Guiana_bassin_8", - "French_Guiana_bassin_9", - "French_Polynesia_bassin_10", - "French_Polynesia_bassin_11", - "French_Polynesia_bassin_12", - "French_Polynesia", - "French_Polynesia_bassin_5", - "French_Polynesia_bassin_6", - "French_Polynesia_bassin_7", - "French_Polynesia_bassin_8", - "French_Polynesia_bassin_9", - "French_Southern and Antarctic Territories_bassin_10", - "French_Southern and Antarctic Territories_bassin_11", - "French_Southern and Antarctic Territories_bassin_12", - "French_Southern and Antarctic Territories", - "French_Southern and Antarctic Territories_bassin_5", - "French_Southern and Antarctic Territories_bassin_6", - "French_Southern and Antarctic Territories_bassin_7", - "French_Southern and Antarctic Territories_bassin_8", - "French_Southern and Antarctic Territories_bassin_9", - "Gabon_bassin_10", - "Gabon_bassin_11", - "Gabon_bassin_12", - "Gabon", - "Gabon_bassin_5", - "Gabon_bassin_6", - "Gabon_bassin_7", - "Gabon_bassin_8", - "Gabon_bassin_9", - "Gambia_bassin_10", - "Gambia_bassin_11", - "Gambia_bassin_12", - "Gambia", - "Gambia_bassin_5", - "Gambia_bassin_6", - "Gambia_bassin_7", - "Gambia_bassin_8", - "Gambia_bassin_9", - "Gaza_Strip_bassin_10", - "Gaza_Strip_bassin_11", - "Gaza_Strip_bassin_12", - "Gaza_Strip", - "Gaza_Strip_bassin_5", - "Gaza_Strip_bassin_6", - "Gaza_Strip_bassin_7", - "Gaza_Strip_bassin_8", - "Gaza_Strip_bassin_9", - "Georgia_bassin_10", - "Georgia_bassin_11", - "Georgia_bassin_12", - "Georgia", - "Georgia_bassin_5", - "Georgia_bassin_6", - "Georgia_bassin_7", - "Georgia_bassin_8", - "Georgia_bassin_9", - "Germany_bassin_10", - "Germany_bassin_11", - "Germany_bassin_12", - "Germany", - "Germany_bassin_5", - "Germany_bassin_6", - "Germany_bassin_7", - "Germany_bassin_8", - "Germany_bassin_9", - "Ghana_bassin_10", - "Ghana_bassin_11", - "Ghana_bassin_12", - "Ghana", - "Ghana_bassin_5", - "Ghana_bassin_6", - "Ghana_bassin_8", - "Ghana_bassin_9", - "Gibraltar_bassin_10", - "Gibraltar_bassin_11", - "Gibraltar_bassin_12", - "Gibraltar", - "Gibraltar_bassin_5", - "Gibraltar_bassin_6", - "Gibraltar_bassin_7", - "Gibraltar_bassin_8", - "Gibraltar_bassin_9", - "Glorioso_Island_bassin_10", - "Glorioso_Island_bassin_11", - "Glorioso_Island_bassin_12", - "Glorioso_Island", - "Glorioso_Island_bassin_5", - "Glorioso_Island_bassin_6", - "Glorioso_Island_bassin_7", - "Glorioso_Island_bassin_8", - "Glorioso_Island_bassin_9", - "Greece_bassin_10", - "Greece_bassin_11", - "Greece_bassin_12", - "Greece", - "Greece_bassin_5", - "Greece_bassin_6", - "Greece_bassin_7", - "Greece_bassin_8", - "Greece_bassin_9", - "Greenland_bassin_10", - "Greenland_bassin_11", - "Greenland_bassin_12", - "Greenland", - "Greenland_bassin_5", - "Greenland_bassin_6", - "Greenland_bassin_7", - "Greenland_bassin_8", - "Greenland_bassin_9", - "Grenada_bassin_10", - "Grenada_bassin_11", - "Grenada_bassin_12", - "Grenada", - "Grenada_bassin_5", - "Grenada_bassin_6", - "Grenada_bassin_7", - "Grenada_bassin_8", - "Grenada_bassin_9", - "Guadeloupe_bassin_10", - "Guadeloupe_bassin_11", - "Guadeloupe_bassin_12", - "Guadeloupe", - "Guadeloupe_bassin_5", - "Guadeloupe_bassin_6", - "Guadeloupe_bassin_7", - "Guadeloupe_bassin_8", - "Guadeloupe_bassin_9", - "Guam_bassin_10", - "Guam_bassin_11", - "Guam_bassin_12", - "Guam", - "Guam_bassin_5", - "Guam_bassin_6", - "Guam_bassin_7", - "Guam_bassin_8", - "Guam_bassin_9", - "Halaib_triangle_bassin_10", - "Halaib_triangle_bassin_11", - "Halaib_triangle_bassin_12", - "Halaib_triangle", - "Halaib_triangle_bassin_5", - "Halaib_triangle_bassin_6", - "Halaib_triangle_bassin_7", - "Halaib_triangle_bassin_8", - "Halaib_triangle_bassin_9", - "Heard_Island and McDonald Islands_bassin_12", - "Holy_See_bassin_10", - "Holy_See_bassin_11", - "Holy_See_bassin_12", - "Holy_See", - "Holy_See_bassin_5", - "Holy_See_bassin_6", - "Holy_See_bassin_7", - "Holy_See_bassin_8", - "Holy_See_bassin_9", - "Honduras_bassin_10", - "Honduras_bassin_11", - "Honduras_bassin_12", - "Honduras", - "Honduras_bassin_5", - "Honduras_bassin_6", - "Honduras_bassin_7", - "Honduras_bassin_8", - "Honduras_bassin_9", - "Hong_Kong_bassin_10", - "Hong_Kong_bassin_11", - "Hong_Kong_bassin_12", - "Hong_Kong", - "Hong_Kong_bassin_5", - "Hong_Kong_bassin_6", - "Hong_Kong_bassin_7", - "Hong_Kong_bassin_8", - "Hong_Kong_bassin_9", - "Howland_Island_bassin_10", - "Howland_Island_bassin_11", - "Howland_Island_bassin_12", - "Howland_Island", - "Howland_Island_bassin_5", - "Howland_Island_bassin_6", - "Howland_Island_bassin_7", - "Howland_Island_bassin_8", - "Howland_Island_bassin_9", - "Hungary_bassin_10", - "Hungary_bassin_11", - "Hungary_bassin_12", - "Hungary", - "Hungary_bassin_5", - "Hungary_bassin_6", - "Hungary_bassin_7", - "Hungary_bassin_8", - "Hungary_bassin_9", - "Iceland_bassin_10", - "Iceland_bassin_11", - "Iceland_bassin_12", - "Iceland", - "Iceland_bassin_5", - "Iceland_bassin_6", - "Iceland_bassin_7", - "Iceland_bassin_8", - "Iceland_bassin_9", - "Ilemi_triangle_bassin_10", - "Ilemi_triangle_bassin_11", - "Ilemi_triangle_bassin_12", - "Ilemi_triangle", - "Ilemi_triangle_bassin_5", - "Ilemi_triangle_bassin_6", - "Ilemi_triangle_bassin_7", - "Ilemi_triangle_bassin_8", - "Ilemi_triangle_bassin_9", - "India_bassin_10", - "India_bassin_11", - "India_bassin_12", - "India", - "India_bassin_5", - "India_bassin_6", - "India_bassin_7", - "India_bassin_8", - "India_bassin_9", - "Indonesia_bassin_10", - "Indonesia_bassin_11", - "Indonesia_bassin_12", - "Indonesia", - "Indonesia_bassin_5", - "Indonesia_bassin_6", - "Indonesia_bassin_7", - "Indonesia_bassin_8", - "Indonesia_bassin_9", - "Iraq_bassin_10", - "Iraq_bassin_11", - "Iraq_bassin_12", - "Iraq", - "Iraq_bassin_5", - "Iraq_bassin_6", - "Iraq_bassin_7", - "Iraq_bassin_8", - "Iraq_bassin_9", - "Ireland_bassin_10", - "Ireland_bassin_11", - "Ireland_bassin_12", - "Ireland", - "Ireland_bassin_5", - "Ireland_bassin_6", - "Ireland_bassin_7", - "Ireland_bassin_8", - "Ireland_bassin_9", - "Isle_of Man_bassin_10", - "Isle_of Man_bassin_11", - "Isle_of Man_bassin_12", - "Isle_of Man", - "Isle_of Man_bassin_5", - "Isle_of Man_bassin_6", - "Isle_of Man_bassin_7", - "Isle_of Man_bassin_8", - "Isle_of Man_bassin_9", - "Israel_bassin_10", - "Israel_bassin_11", - "Israel_bassin_12", - "Israel", - "Israel_bassin_5", - "Israel_bassin_6", - "Israel_bassin_7", - "Israel_bassin_8", - "Israel_bassin_9", - "Italy_bassin_10", - "Italy_bassin_11", - "Italy_bassin_12", - "Italy", - "Italy_bassin_5", - "Italy_bassin_6", - "Italy_bassin_7", - "Italy_bassin_8", - "Italy_bassin_9", - "Jamaica_bassin_10", - "Jamaica_bassin_11", - "Jamaica_bassin_12", - "Jamaica", - "Jamaica_bassin_5", - "Jamaica_bassin_6", - "Jamaica_bassin_7", - "Jamaica_bassin_8", - "Jamaica_bassin_9", - "Jammu_and Kashmir_bassin_10", - "Jammu_and Kashmir_bassin_11", - "Jammu_and Kashmir_bassin_12", - "Jammu_and Kashmir", - "Jammu_and Kashmir_bassin_5", - "Jammu_and Kashmir_bassin_6", - "Jammu_and Kashmir_bassin_7", - "Jammu_and Kashmir_bassin_8", - "Jammu_and Kashmir_bassin_9", - "Japan_bassin_10", - "Japan_bassin_11", - "Japan_bassin_12", - "Japan", - "Japan_bassin_5", - "Japan_bassin_6", - "Japan_bassin_7", - "Japan_bassin_8", - "Japan_bassin_9", - "Jarvis_Island_bassin_10", - "Jarvis_Island_bassin_11", - "Jarvis_Island_bassin_12", - "Jarvis_Island", - "Jarvis_Island_bassin_5", - "Jarvis_Island_bassin_6", - "Jarvis_Island_bassin_7", - "Jarvis_Island_bassin_8", - "Jarvis_Island_bassin_9", - "Jersey_bassin_10", - "Jersey_bassin_11", - "Jersey_bassin_12", - "Jersey", - "Jersey_bassin_5", - "Jersey_bassin_6", - "Jersey_bassin_7", - "Jersey_bassin_8", - "Jersey_bassin_9", - "Johnston_Atoll_bassin_10", - "Johnston_Atoll_bassin_11", - "Johnston_Atoll_bassin_12", - "Johnston_Atoll", - "Johnston_Atoll_bassin_5", - "Johnston_Atoll_bassin_6", - "Johnston_Atoll_bassin_7", - "Johnston_Atoll_bassin_8", - "Johnston_Atoll_bassin_9", - "Jordan_bassin_10", - "Jordan_bassin_11", - "Jordan_bassin_12", - "Jordan", - "Jordan_bassin_5", - "Jordan_bassin_6", - "Jordan_bassin_7", - "Jordan_bassin_8", - "Jordan_bassin_9", - "Juan_de Nova Island_bassin_10", - "Juan_de Nova Island_bassin_11", - "Juan_de Nova Island_bassin_12", - "Juan_de Nova Island", - "Juan_de Nova Island_bassin_5", - "Juan_de Nova Island_bassin_6", - "Juan_de Nova Island_bassin_7", - "Juan_de Nova Island_bassin_8", - "Juan_de Nova Island_bassin_9", - "Kazakhstan_bassin_10", - "Kazakhstan_bassin_11", - "Kazakhstan_bassin_12", - "Kazakhstan", - "Kazakhstan_bassin_5", - "Kazakhstan_bassin_6", - "Kazakhstan_bassin_7", - "Kazakhstan_bassin_8", - "Kazakhstan_bassin_9", - "Kenya_bassin_10", - "Kenya_bassin_11", - "Kenya_bassin_12", - "Kenya", - "Kenya_bassin_5", - "Kenya_bassin_6", - "Kenya_bassin_7", - "Kenya_bassin_8", - "Kenya_bassin_9", - "Kingman_Reef_bassin_10", - "Kingman_Reef_bassin_11", - "Kingman_Reef_bassin_12", - "Kingman_Reef", - "Kingman_Reef_bassin_5", - "Kingman_Reef_bassin_6", - "Kingman_Reef_bassin_7", - "Kingman_Reef_bassin_8", - "Kingman_Reef_bassin_9", - "Kiribati_bassin_10", - "Kiribati_bassin_11", - "Kiribati_bassin_12", - "Kiribati", - "Kiribati_bassin_5", - "Kiribati_bassin_6", - "Kiribati_bassin_7", - "Kiribati_bassin_8", - "Kiribati_bassin_9", - "Kuril_islands_bassin_10", - "Kuril_islands_bassin_11", - "Kuril_islands_bassin_12", - "Kuril_islands", - "Kuril_islands_bassin_5", - "Kuril_islands_bassin_6", - "Kuril_islands_bassin_7", - "Kuril_islands_bassin_8", - "Kuril_islands_bassin_9", - "Kuwait_bassin_10", - "Kuwait_bassin_11", - "Kuwait_bassin_12", - "Kuwait", - "Kuwait_bassin_5", - "Kuwait_bassin_6", - "Kuwait_bassin_7", - "Kuwait_bassin_8", - "Kuwait_bassin_9", - "Kyrgyzstan_bassin_10", - "Kyrgyzstan_bassin_11", - "Kyrgyzstan_bassin_12", - "Kyrgyzstan", - "Kyrgyzstan_bassin_5", - "Kyrgyzstan_bassin_6", - "Kyrgyzstan_bassin_7", - "Kyrgyzstan_bassin_8", - "Kyrgyzstan_bassin_9", - "Lao_Peoples Democratic Republic_bassin_10", - "Lao_Peoples Democratic Republic_bassin_11", - "Lao_Peoples Democratic Republic_bassin_12", - "Lao_Peoples Democratic Republic", - "Lao_Peoples Democratic Republic_bassin_5", - "Lao_Peoples Democratic Republic_bassin_6", - "Lao_Peoples Democratic Republic_bassin_7", - "Lao_Peoples Democratic Republic_bassin_8", - "Lao_Peoples Democratic Republic_bassin_9", - "Latvia_bassin_10", - "Latvia_bassin_11", - "Latvia_bassin_12", - "Latvia", - "Latvia_bassin_5", - "Latvia_bassin_6", - "Latvia_bassin_7", - "Latvia_bassin_8", - "Latvia_bassin_9", - "Lebanon_bassin_10", - "Lebanon_bassin_11", - "Lebanon_bassin_12", - "Lebanon", - "Lebanon_bassin_5", - "Lebanon_bassin_6", - "Lebanon_bassin_7", - "Lebanon_bassin_8", - "Lebanon_bassin_9", - "Lesotho_bassin_10", - "Lesotho_bassin_11", - "Lesotho_bassin_12", - "Lesotho", - "Lesotho_bassin_5", - "Lesotho_bassin_6", - "Lesotho_bassin_7", - "Lesotho_bassin_8", - "Lesotho_bassin_9", - "Liberia_bassin_10", - "Liberia_bassin_11", - "Liberia_bassin_12", - "Liberia", - "Liberia_bassin_5", - "Liberia_bassin_6", - "Liberia_bassin_7", - "Liberia_bassin_8", - "Liberia_bassin_9", - "Libya_bassin_10", - "Libya_bassin_11", - "Libya_bassin_12", - "Libya", - "Libya_bassin_5", - "Libya_bassin_6", - "Libya_bassin_7", - "Libya_bassin_8", - "Libya_bassin_9", - "Liechtenstein_bassin_10", - "Liechtenstein_bassin_11", - "Liechtenstein_bassin_12", - "Liechtenstein", - "Liechtenstein_bassin_5", - "Liechtenstein_bassin_6", - "Liechtenstein_bassin_7", - "Liechtenstein_bassin_8", - "Liechtenstein_bassin_9", - "Lithuania_bassin_10", - "Lithuania_bassin_11", - "Lithuania_bassin_12", - "Lithuania", - "Lithuania_bassin_5", - "Lithuania_bassin_6", - "Lithuania_bassin_7", - "Lithuania_bassin_8", - "Lithuania_bassin_9", - "Luxembourg_bassin_10", - "Luxembourg_bassin_11", - "Luxembourg_bassin_12", - "Luxembourg", - "Luxembourg_bassin_5", - "Luxembourg_bassin_6", - "Luxembourg_bassin_7", - "Luxembourg_bassin_8", - "Luxembourg_bassin_9", - "Macau_bassin_10", - "Macau_bassin_11", - "Macau_bassin_12", - "Macau", - "Macau_bassin_5", - "Macau_bassin_6", - "Macau_bassin_7", - "Macau_bassin_8", - "Macau_bassin_9", - "Madagascar_bassin_10", - "Madagascar_bassin_11", - "Madagascar_bassin_12", - "Madagascar", - "Madagascar_bassin_5", - "Madagascar_bassin_6", - "Madagascar_bassin_7", - "Madagascar_bassin_8", - "Madagascar_bassin_9", - "Madeira_Islands_bassin_10", - "Madeira_Islands_bassin_11", - "Madeira_Islands_bassin_12", - "Madeira_Islands", - "Madeira_Islands_bassin_5", - "Madeira_Islands_bassin_6", - "Madeira_Islands_bassin_7", - "Madeira_Islands_bassin_8", - "Madeira_Islands_bassin_9", - "Malawi_bassin_10", - "Malawi_bassin_11", - "Malawi_bassin_12", - "Malawi", - "Malawi_bassin_5", - "Malawi_bassin_6", - "Malawi_bassin_7", - "Malawi_bassin_8", - "Malawi_bassin_9", - "Malaysia_bassin_10", - "Malaysia_bassin_11", - "Malaysia_bassin_12", - "Malaysia", - "Malaysia_bassin_5", - "Malaysia_bassin_6", - "Malaysia_bassin_7", - "Malaysia_bassin_8", - "Malaysia_bassin_9", - "Maldives_bassin_10", - "Maldives_bassin_11", - "Maldives_bassin_12", - "Maldives", - "Maldives_bassin_5", - "Maldives_bassin_6", - "Maldives_bassin_7", - "Maldives_bassin_8", - "Maldives_bassin_9", - "Matan_al-Sarra_bassin_10", - "Matan_al-Sarra_bassin_11", - "Matan_al-Sarra_bassin_12", - "Matan_al-Sarra", - "Matan_al-Sarra_bassin_5", - "Matan_al-Sarra_bassin_6", - "Matan_al-Sarra_bassin_7", - "Matan_al-Sarra_bassin_8", - "Matan_al-Sarra_bassin_9", - "Montenegro_bassin_10", - "Montenegro_bassin_11", - "Montenegro_bassin_12", - "Montenegro", - "Montenegro_bassin_5", - "Montenegro_bassin_6", - "Montenegro_bassin_7", - "Montenegro_bassin_8", - "Montenegro_bassin_9", - "Qatar_bassin_10", - "Qatar_bassin_11", - "Qatar_bassin_12", - "Republic_of Korea_bassin_10", - "Republic_of Korea_bassin_11", - "Republic_of Korea_bassin_12", - "Republic_of Korea", - "Republic_of Korea_bassin_5", - "Republic_of Korea_bassin_6", - "Republic_of Korea_bassin_7", - "Republic_of Korea_bassin_8", - "Republic_of Korea_bassin_9", - "Romania_bassin_10", - "Romania_bassin_11", - "Romania_bassin_12", - "Romania", - "Romania_bassin_5", - "Romania_bassin_6", - "Romania_bassin_7", - "Romania_bassin_8", - "Romania_bassin_9", - "Russian_Federation_bassin_10", - "Russian_Federation_bassin_11", - "Russian_Federation_bassin_12", - "Russian_Federation", - "Russian_Federation_bassin_5", - "Russian_Federation_bassin_6", - "Russian_Federation_bassin_7", - "Russian_Federation_bassin_8", - "Russian_Federation_bassin_9", - "Rwanda_bassin_10", - "Rwanda_bassin_11", - "Rwanda_bassin_12", - "Rwanda", - "Rwanda_bassin_5", - "Rwanda_bassin_6", - "Rwanda_bassin_7", - "Rwanda_bassin_8", - "Rwanda_bassin_9", - "Saint_Helena_bassin_10", - "Saint_Helena_bassin_11", - "Saint_Helena_bassin_12", - "Saint_Helena", - "Saint_Helena_bassin_5", - "Saint_Helena_bassin_6", - "Saint_Helena_bassin_7", - "Saint_Helena_bassin_8", - "Saint_Helena_bassin_9", - "Saint_Kitts and Nevis_bassin_10", - "Saint_Kitts and Nevis_bassin_11", - "Saint_Kitts and Nevis_bassin_12", - "Saint_Kitts and Nevis", - "Saint_Kitts and Nevis_bassin_5", - "Saint_Kitts and Nevis_bassin_6", - "Saint_Kitts and Nevis_bassin_7", - "Saint_Kitts and Nevis_bassin_8", - "Saint_Kitts and Nevis_bassin_9", - "Saint_Lucia_bassin_10", - "Saint_Lucia_bassin_11", - "Saint_Lucia_bassin_12", - "Saint_Lucia", - "Saint_Lucia_bassin_5", - "Saint_Lucia_bassin_6", - "Saint_Lucia_bassin_7", - "Saint_Lucia_bassin_8", - "Saint_Lucia_bassin_9", - "Saint_Pierre et Miquelon_bassin_10", - "Saint_Pierre et Miquelon_bassin_11", - "Saint_Pierre et Miquelon_bassin_12", - "Saint_Pierre et Miquelon", - "Saint_Pierre et Miquelon_bassin_5", - "Saint_Pierre et Miquelon_bassin_6", - "Saint_Pierre et Miquelon_bassin_7", - "Saint_Pierre et Miquelon_bassin_8", - "Saint_Pierre et Miquelon_bassin_9", - "Saint_Vincent and the Grenadines_bassin_10", - "Saint_Vincent and the Grenadines_bassin_11", - "Saint_Vincent and the Grenadines_bassin_12", - "Saint_Vincent and the Grenadines", - "Saint_Vincent and the Grenadines_bassin_5", - "Saint_Vincent and the Grenadines_bassin_6", - "Saint_Vincent and the Grenadines_bassin_7", - "Saint_Vincent and the Grenadines_bassin_8", - "Saint_Vincent and the Grenadines_bassin_9", - "Samoa_bassin_10", - "Samoa_bassin_11", - "Samoa_bassin_12", - "Samoa", - "Samoa_bassin_5", - "Samoa_bassin_6", - "Samoa_bassin_7", - "Samoa_bassin_8", - "Samoa_bassin_9", - "San_Marino_bassin_10", - "San_Marino_bassin_11", - "San_Marino_bassin_12", - "San_Marino", - "San_Marino_bassin_5", - "San_Marino_bassin_6", - "San_Marino_bassin_7", - "San_Marino_bassin_8", - "San_Marino_bassin_9", - "Sao_Tome and Principe_bassin_10", - "Sao_Tome and Principe_bassin_11", - "Sao_Tome and Principe_bassin_12", - "Sao_Tome and Principe", - "Sao_Tome and Principe_bassin_5", - "Sao_Tome and Principe_bassin_6", - "Sao_Tome and Principe_bassin_7", - "Sao_Tome and Principe_bassin_8", - "Sao_Tome and Principe_bassin_9", - "Saudi_Arabia_bassin_10", - "Saudi_Arabia_bassin_11", - "Saudi_Arabia_bassin_12", - "Saudi_Arabia", - "Saudi_Arabia_bassin_5", - "Saudi_Arabia_bassin_6", - "Saudi_Arabia_bassin_7", - "Saudi_Arabia_bassin_8", - "Saudi_Arabia_bassin_9", - "Scarborough_Reef_bassin_10", - "Scarborough_Reef_bassin_11", - "Scarborough_Reef_bassin_12", - "Scarborough_Reef", - "Scarborough_Reef_bassin_5", - "Scarborough_Reef_bassin_6", - "Scarborough_Reef_bassin_7", - "Scarborough_Reef_bassin_8", - "Scarborough_Reef_bassin_9", - "Senegal_bassin_10", - "Senegal_bassin_11", - "Senegal_bassin_12", - "Senegal", - "Senegal_bassin_5", - "Senegal_bassin_6", - "Senegal_bassin_7", - "Senegal_bassin_8", - "Senegal_bassin_9", - "Senkaku_Islands_bassin_10", - "Senkaku_Islands_bassin_11", - "Senkaku_Islands_bassin_12", - "Senkaku_Islands", - "Senkaku_Islands_bassin_5", - "Senkaku_Islands_bassin_6", - "Senkaku_Islands_bassin_7", - "Senkaku_Islands_bassin_8", - "Senkaku_Islands_bassin_9", - "Serbia_bassin_10", - "Serbia_bassin_11", - "Serbia_bassin_12", - "Serbia", - "Serbia_bassin_5", - "Serbia_bassin_6", - "Serbia_bassin_7", - "Serbia_bassin_8", - "Serbia_bassin_9", - "Seychelles_bassin_10", - "Seychelles_bassin_11", - "Seychelles_bassin_12", - "Seychelles", - "Seychelles_bassin_5", - "Seychelles_bassin_6", - "Seychelles_bassin_7", - "Seychelles_bassin_8", - "Seychelles_bassin_9", - "Sierra_Leone_bassin_10", - "Sierra_Leone_bassin_11", - "Sierra_Leone_bassin_12", - "Sierra_Leone", - "Sierra_Leone_bassin_5", - "Sierra_Leone_bassin_6", - "Sierra_Leone_bassin_7", - "Sierra_Leone_bassin_8", - "Sierra_Leone_bassin_9", - "Singapore_bassin_10", - "Singapore_bassin_11", - "Singapore_bassin_12", - "Singapore", - "Singapore_bassin_5", - "Singapore_bassin_6", - "Singapore_bassin_7", - "Singapore_bassin_8", - "Singapore_bassin_9", - "Slovakia_bassin_10", - "Slovakia_bassin_11", - "Slovakia_bassin_12", - "Slovakia", - "Slovakia_bassin_5", - "Slovakia_bassin_6", - "Slovakia_bassin_7", - "Slovakia_bassin_8", - "Slovakia_bassin_9", - "Slovenia_bassin_10", - "Slovenia_bassin_11", - "Slovenia_bassin_12", - "Slovenia", - "Slovenia_bassin_5", - "Slovenia_bassin_6", - "Slovenia_bassin_7", - "Slovenia_bassin_8", - "Slovenia_bassin_9", - "Solomon_Islands_bassin_10", - "Solomon_Islands_bassin_11", - "Solomon_Islands_bassin_12", - "Solomon_Islands", - "Solomon_Islands_bassin_5", - "Solomon_Islands_bassin_6", - "Solomon_Islands_bassin_7", - "Solomon_Islands_bassin_8", - "Solomon_Islands_bassin_9", - "Somalia_bassin_10", - "Somalia_bassin_11", - "Somalia_bassin_12", - "Somalia", - "Somalia_bassin_5", - "Somalia_bassin_6", - "Somalia_bassin_7", - "Somalia_bassin_8", - "Somalia_bassin_9", - "South_Africa_bassin_10", - "South_Africa_bassin_11", - "South_Africa_bassin_12", - "South_Africa", - "South_Africa_bassin_5", - "South_Africa_bassin_6", - "South_Africa_bassin_7", - "South_Africa_bassin_8", - "South_Africa_bassin_9", - "South_Georgia and the South Sandwich Islands_bassin_10", - "South_Georgia and the South Sandwich Islands_bassin_11", - "South_Georgia and the South Sandwich Islands_bassin_12", - "South_Georgia and the South Sandwich Islands", - "South_Georgia and the South Sandwich Islands_bassin_5", - "South_Georgia and the South Sandwich Islands_bassin_6", - "South_Georgia and the South Sandwich Islands_bassin_7", - "South_Georgia and the South Sandwich Islands_bassin_8", - "South_Georgia and the South Sandwich Islands_bassin_9", - "South_Sudan_bassin_10", - "South_Sudan_bassin_11", - "South_Sudan_bassin_12", - "South_Sudan", - "South_Sudan_bassin_5", - "South_Sudan_bassin_6", - "South_Sudan_bassin_7", - "South_Sudan_bassin_8", - "South_Sudan_bassin_9", - "Spain_bassin_10", - "Spain_bassin_11", - "Spain_bassin_12", - "Spain", - "Spain_bassin_5", - "Spain_bassin_6", - "Spain_bassin_7", - "Spain_bassin_8", - "Spain_bassin_9", - "Spratly_Islands_bassin_10", - "Spratly_Islands_bassin_11", - "Spratly_Islands_bassin_12", - "Spratly_Islands", - "Spratly_Islands_bassin_5", - "Spratly_Islands_bassin_6", - "Spratly_Islands_bassin_7", - "Spratly_Islands_bassin_8", - "Spratly_Islands_bassin_9", - "Sri_Lanka_bassin_10", - "Sri_Lanka_bassin_11", - "Sri_Lanka_bassin_12", - "Sri_Lanka", - "Sri_Lanka_bassin_5", - "Sri_Lanka_bassin_6", - "Sri_Lanka_bassin_7", - "Sri_Lanka_bassin_8", - "Sri_Lanka_bassin_9", - "Suriname_bassin_10", - "Suriname_bassin_11", - "Suriname_bassin_12", - "Suriname", - "Suriname_bassin_5", - "Suriname_bassin_6", - "Suriname_bassin_7", - "Suriname_bassin_8", - "Suriname_bassin_9", - "Svalbard_and Jan Mayen Islands_bassin_10", - "Svalbard_and Jan Mayen Islands_bassin_11", - "Svalbard_and Jan Mayen Islands_bassin_12", - "Svalbard_and Jan Mayen Islands", - "Svalbard_and Jan Mayen Islands_bassin_5", - "Svalbard_and Jan Mayen Islands_bassin_6", - "Svalbard_and Jan Mayen Islands_bassin_7", - "Svalbard_and Jan Mayen Islands_bassin_8", - "Svalbard_and Jan Mayen Islands_bassin_9", - "Swaziland_bassin_10", - "Swaziland_bassin_11", - "Swaziland_bassin_12", - "Swaziland", - "Swaziland_bassin_5", - "Swaziland_bassin_6", - "Swaziland_bassin_7", - "Swaziland_bassin_8", - "Swaziland_bassin_9", - "Sweden_bassin_10", - "Sweden_bassin_11", - "Sweden_bassin_12", - "Sweden", - "Sweden_bassin_5", - "Sweden_bassin_6", - "Sweden_bassin_7", - "Sweden_bassin_8", - "Sweden_bassin_9", - "Switzerland_bassin_10", - "Switzerland_bassin_11", - "Switzerland_bassin_12", - "Switzerland", - "Switzerland_bassin_5", - "Switzerland_bassin_6", - "Switzerland_bassin_7", - "Switzerland_bassin_8", - "Switzerland_bassin_9", - "Syrian_Arab Republic_bassin_10", - "Syrian_Arab Republic_bassin_11", - "Syrian_Arab Republic_bassin_12", - "Syrian_Arab Republic", - "Syrian_Arab Republic_bassin_5", - "Syrian_Arab Republic_bassin_6", - "Syrian_Arab Republic_bassin_7", - "Syrian_Arab Republic_bassin_8", - "Syrian_Arab Republic_bassin_9", - "Taiwan_bassin_10", - "Taiwan_bassin_11", - "Taiwan_bassin_12", - "Taiwan", - "Taiwan_bassin_5", - "Taiwan_bassin_6", - "Taiwan_bassin_7", - "Taiwan_bassin_8", - "Taiwan_bassin_9", - "Tajikistan_bassin_10", - "Tajikistan_bassin_11", - "Tajikistan_bassin_12", - "Tajikistan", - "Tajikistan_bassin_5", - "Tajikistan_bassin_6", - "Tajikistan_bassin_7", - "Tajikistan_bassin_8", - "Tajikistan_bassin_9", - "Thailand_bassin_10", - "Thailand_bassin_11", - "Thailand_bassin_12", - "Thailand", - "Thailand_bassin_5", - "Thailand_bassin_6", - "Thailand_bassin_7", - "Thailand_bassin_8", - "Thailand_bassin_9", - "The_former Yugoslav Republic of Macedonia_bassin_10", - "The_former Yugoslav Republic of Macedonia_bassin_11", - "The_former Yugoslav Republic of Macedonia_bassin_12", - "The_former Yugoslav Republic of Macedonia", - "The_former Yugoslav Republic of Macedonia_bassin_5", - "The_former Yugoslav Republic of Macedonia_bassin_6", - "The_former Yugoslav Republic of Macedonia_bassin_7", - "The_former Yugoslav Republic of Macedonia_bassin_8", - "The_former Yugoslav Republic of Macedonia_bassin_9", - "Timor-Leste_bassin_10", - "Timor-Leste_bassin_11", - "Timor-Leste_bassin_12", - "Timor-Leste", - "Timor-Leste_bassin_5", - "Timor-Leste_bassin_6", - "Timor-Leste_bassin_7", - "Timor-Leste_bassin_8", - "Timor-Leste_bassin_9", - "Togo_bassin_10", - "Togo_bassin_11", - "Togo_bassin_12", - "Togo", - "Togo_bassin_5", - "Togo_bassin_6", - "Togo_bassin_7", - "Togo_bassin_8", - "Togo_bassin_9", - "Tokelau_bassin_10", - "Tokelau_bassin_11", - "Tokelau_bassin_12", - "Tokelau", - "Tokelau_bassin_5", - "Tokelau_bassin_6", - "Tokelau_bassin_7", - "Tokelau_bassin_8", - "Tokelau_bassin_9", - "Tonga_bassin_10", - "Tonga_bassin_11", - "Tonga_bassin_12", - "Tonga", - "Tonga_bassin_5", - "Tonga_bassin_6", - "Tonga_bassin_7", - "Tonga_bassin_8", - "Tonga_bassin_9", - "Trinidad_and Tobago_bassin_10", - "Trinidad_and Tobago_bassin_11", - "Trinidad_and Tobago_bassin_12", - "Trinidad_and Tobago", - "Trinidad_and Tobago_bassin_5", - "Trinidad_and Tobago_bassin_6", - "Trinidad_and Tobago_bassin_7", - "Trinidad_and Tobago_bassin_8", - "Trinidad_and Tobago_bassin_9", - "Tromelin_Island_bassin_10", - "Tromelin_Island_bassin_11", - "Tromelin_Island_bassin_12", - "Tromelin_Island", - "Tromelin_Island_bassin_5", - "Tromelin_Island_bassin_6", - "Tromelin_Island_bassin_7", - "Tromelin_Island_bassin_8", - "Tromelin_Island_bassin_9", - "Tunisia_bassin_10", - "Tunisia_bassin_11", - "Tunisia_bassin_12", - "Tunisia", - "Tunisia_bassin_5", - "Tunisia_bassin_6", - "Tunisia_bassin_7", - "Tunisia_bassin_8", - "Tunisia_bassin_9", - "Turkey_bassin_10", - "Turkey_bassin_11", - "Turkey_bassin_12", - "Turkey", - "Turkey_bassin_5", - "Turkey_bassin_6", - "Turkey_bassin_7", - "Turkey_bassin_8", - "Turkey_bassin_9", - "Turkmenistan_bassin_10", - "Turkmenistan_bassin_11", - "Turkmenistan_bassin_12", - "Turkmenistan", - "Turkmenistan_bassin_5", - "Turkmenistan_bassin_6", - "Turkmenistan_bassin_7", - "Turkmenistan_bassin_8", - "Turkmenistan_bassin_9", - "Turks_and Caicos islands_bassin_10", - "Turks_and Caicos islands_bassin_11", - "Turks_and Caicos islands_bassin_12", - "Turks_and Caicos islands", - "Turks_and Caicos islands_bassin_5", - "Turks_and Caicos islands_bassin_6", - "Turks_and Caicos islands_bassin_7", - "Turks_and Caicos islands_bassin_8", - "Turks_and Caicos islands_bassin_9", - "Tuvalu_bassin_10", - "Tuvalu_bassin_11", - "Tuvalu_bassin_12", - "Tuvalu", - "Tuvalu_bassin_5", - "Tuvalu_bassin_6", - "Tuvalu_bassin_7", - "Tuvalu_bassin_8", - "Tuvalu_bassin_9", - "Uganda_bassin_10", - "Uganda_bassin_11", - "Uganda_bassin_12", - "Uganda", - "Uganda_bassin_5", - "Uganda_bassin_6", - "Uganda_bassin_7", - "Uganda_bassin_8", - "Uganda_bassin_9", - "Ukraine_bassin_10", - "Ukraine_bassin_11", - "Ukraine_bassin_12", - "Ukraine", - "Ukraine_bassin_5", - "Ukraine_bassin_6", - "Ukraine_bassin_7", - "Ukraine_bassin_8", - "Ukraine_bassin_9", - "UK_of Great Britain and Northern Ireland_bassin_10", - "UK_of Great Britain and Northern Ireland_bassin_11", - "UK_of Great Britain and Northern Ireland_bassin_12", - "UK_of Great Britain and Northern Ireland", - "UK_of Great Britain and Northern Ireland_bassin_5", - "UK_of Great Britain and Northern Ireland_bassin_6", - "UK_of Great Britain and Northern Ireland_bassin_7", - "UK_of Great Britain and Northern Ireland_bassin_8", - "UK_of Great Britain and Northern Ireland_bassin_9", - "United_Arab Emirates_bassin_10", - "United_Arab Emirates_bassin_11", - "United_Arab Emirates_bassin_12", - "United_Arab Emirates", - "United_Arab Emirates_bassin_5", - "United_Arab Emirates_bassin_6", - "United_Arab Emirates_bassin_7", - "United_Arab Emirates_bassin_8", - "United_Arab Emirates_bassin_9", - "United_Republic of Tanzania_bassin_10", - "United_Republic of Tanzania_bassin_11", - "United_Republic of Tanzania_bassin_12", - "United_Republic of Tanzania", - "United_Republic of Tanzania_bassin_5", - "United_Republic of Tanzania_bassin_6", - "United_Republic of Tanzania_bassin_7", - "United_Republic of Tanzania_bassin_8", - "United_Republic of Tanzania_bassin_9", - "United_States of America_bassin_10", - "United_States of America_bassin_11", - "United_States of America_bassin_12", - "United_States of America", - "United_States of America_bassin_5", - "United_States of America_bassin_6", - "United_States of America_bassin_7", - "United_States of America_bassin_8", - "United_States of America_bassin_9", - "United_States Virgin Islands_bassin_10", - "United_States Virgin Islands_bassin_11", - "United_States Virgin Islands_bassin_12", - "United_States Virgin Islands", - "United_States Virgin Islands_bassin_5", - "United_States Virgin Islands_bassin_6", - "United_States Virgin Islands_bassin_7", - "United_States Virgin Islands_bassin_8", - "United_States Virgin Islands_bassin_9", - "Uruguay_bassin_10", - "Uruguay_bassin_11", - "Uruguay_bassin_12", - "Uruguay", - "Uruguay_bassin_5", - "Uruguay_bassin_6", - "Uruguay_bassin_7", - "Uruguay_bassin_8", - "Uruguay_bassin_9", - "Uzbekistan_bassin_10", - "Uzbekistan_bassin_11", - "Uzbekistan_bassin_12", - "Uzbekistan", - "Uzbekistan_bassin_5", - "Uzbekistan_bassin_6", - "Uzbekistan_bassin_7", - "Uzbekistan_bassin_8", - "Uzbekistan_bassin_9", - "Vanuatu_bassin_10", - "Vanuatu_bassin_11", - "Vanuatu_bassin_12", - "Vanuatu", - "Vanuatu_bassin_5", - "Vanuatu_bassin_6", - "Vanuatu_bassin_7", - "Vanuatu_bassin_8", - "Vanuatu_bassin_9", - "Venezuela_bassin_10", - "Venezuela_bassin_11", - "Venezuela_bassin_12", - "Venezuela", - "Venezuela_bassin_5", - "Venezuela_bassin_6", - "Venezuela_bassin_7", - "Venezuela_bassin_8", - "Venezuela_bassin_9", - "Viet_Nam_bassin_10", - "Viet_Nam_bassin_11", - "Viet_Nam_bassin_12", - "Viet_Nam", - "Viet_Nam_bassin_5", - "Viet_Nam_bassin_6", - "Viet_Nam_bassin_7", - "Viet_Nam_bassin_8", - "Viet_Nam_bassin_9", - "Wake_Island_bassin_10", - "Wake_Island_bassin_11", - "Wake_Island_bassin_12", - "Wake_Island", - "Wake_Island_bassin_5", - "Wake_Island_bassin_6", - "Wake_Island_bassin_7", - "Wake_Island_bassin_8", - "Wake_Island_bassin_9", - "Wallis_and Futuna_bassin_10", - "Wallis_and Futuna_bassin_11", - "Wallis_and Futuna_bassin_12", - "Wallis_and Futuna", - "Wallis_and Futuna_bassin_5", - "Wallis_and Futuna_bassin_6", - "Wallis_and Futuna_bassin_7", - "Wallis_and Futuna_bassin_8", - "Wallis_and Futuna_bassin_9", - "Western_Sahara_bassin_10", - "Western_Sahara_bassin_11", - "Western_Sahara_bassin_12", - "Western_Sahara", - "Western_Sahara_bassin_5", - "Western_Sahara_bassin_6", - "Western_Sahara_bassin_7", - "Western_Sahara_bassin_8", - "Western_Sahara_bassin_9", - "West_Bank_bassin_10", - "West_Bank_bassin_11", - "West_Bank_bassin_12", - "West_Bank", - "West_Bank_bassin_5", - "West_Bank_bassin_6", - "West_Bank_bassin_7", - "West_Bank_bassin_8", - "West_Bank_bassin_9", - "Yemen_bassin_10", - "Yemen_bassin_11", - "Yemen_bassin_12", - "Yemen", - "Yemen_bassin_5", - "Yemen_bassin_6", - "Yemen_bassin_7", - "Yemen_bassin_8", - "Yemen_bassin_9", - "Zambia_bassin_10", - "Zambia_bassin_11", - "Zambia_bassin_12", - "Zambia", - "Zambia_bassin_5", - "Zambia_bassin_6", - "Zambia_bassin_7", - "Zambia_bassin_8", - "Zambia_bassin_9", - "Zimbabwe_bassin_10", - "Zimbabwe_bassin_11", - "Zimbabwe_bassin_12", - "Zimbabwe", - "Zimbabwe_bassin_5", - "Zimbabwe_bassin_6", - "Zimbabwe_bassin_7", - "Zimbabwe_bassin_8", - "Zimbabwe_bassin_9" - ) ); - - public static void main(String[] args) { - - ArrayList missingCountries = new ArrayList(); - - for (String country : allCountryNames) { - if( !filesGenerated.contains(country) ) { - missingCountries.add( country); - } - } - System.out.println( missingCountries.size() ); - System.out.println( missingCountries ); - - String finalCountries = ""; - for (String missing : missingCountries) { - finalCountries += '"' + missing.replaceAll( "_", " ") + "\", "; - } - System.out.println( finalCountries ); - - } - - -} +package org.openforis.collect.earth.app.model; + +import org.openforis.collect.earth.app.view.Messages; + +/** + * Slope codes by range associated to a slope in degrees ( 0-5 degrees flat, 6-15 slight, 15-30 steep and so on) + * @author Alfonso Sanchez-Paus Diaz + * + */ +public enum SlopeCode { + FLAT(Messages.getString("SlopeCode.0"), 1, 0, 5), SLIGHT("6-15", 2, 6, 15), STEEP("16-30", 3, 16, 30), VERY_STEEP("31-45", 4, 31, 45), EXTREME("46-60", 5, 46, 60), FALL( //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ + "61-90", 6, 61, 90), NA("NA", 7, -1, -1); //$NON-NLS-1$ //$NON-NLS-2$ + + + /** + * Utility method to calculate the slope-code for a given slope in degrees. + * @param slope The slope in degrees + * @return The slope code for the given slope in degrees. + */ + public static SlopeCode getSlopeCode(int slope) { + + final SlopeCode[] slopeCodes = SlopeCode.values(); + for (final SlopeCode slopeCode : slopeCodes) { + if (slope >= slopeCode.getStartSlope() && slope <= slopeCode.getEndSlope()) { + return slopeCode; + } + } + return null; + + } + + private String label; + + private int id; + + /** + * The start and end of the range used to classify a slope code. + */ + private int startSlope, endSlope; + + + private SlopeCode(String label, int id, int startSlope, int endSlope) { + this.label = label; + this.id = id; + this.startSlope = startSlope; + this.endSlope = endSlope; + } + + public int getEndSlope() { + return endSlope; + } + + public int getId() { + return id; + } + + public String getLabel() { + return label; + } + + public int getStartSlope() { + return startSlope; + } + + @Override + public String toString() { + return label; + } + +} From d326b100ea07e8a63c591b75223b85e4855f1543 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:34 +0100 Subject: [PATCH 0064/1620] New translations SlopeCode.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 67 +++++++++++-------- 1 file changed, 38 insertions(+), 29 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index f5ef63f5c6..eb2152ecb3 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,24 +1,53 @@ package org.openforis.collect.earth.app.model; -import org.apache.commons.lang3.StringUtils; import org.openforis.collect.earth.app.view.Messages; /** - * Enumeration of the dynamics that Collect Earth can use to classify the plots. - * + * Slope codes by range associated to a slope in degrees ( 0-5 degrees flat, 6-15 slight, 15-30 steep and so on) * @author Alfonso Sanchez-Paus Diaz - * + * */ -public enum DynamicsCode { - FROM_FOREST(Messages.getString("DynamicsCode.0"), 1), FROM_GRASSLAND(Messages.getString("DynamicsCode.1"), 3), FROM_SETTLEMENT(Messages.getString("DynamicsCode.2"), 4), FROM_OTHERLAND(Messages.getString("DynamicsCode.3"), 5), FROM_WETLAND(Messages.getString("DynamicsCode.4"), 6), FROM_CROPLAND(Messages.getString("DynamicsCode.5"), 7), NA("NA", 8); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ +public enum SlopeCode { + FLAT(Messages.getString("SlopeCode.0"), 1, 0, 5), SLIGHT("6-15", 2, 6, 15), STEEP("16-30", 3, 16, 30), VERY_STEEP("31-45", 4, 31, 45), EXTREME("46-60", 5, 46, 60), FALL( //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ + "61-90", 6, 61, 90), NA("NA", 7, -1, -1); //$NON-NLS-1$ //$NON-NLS-2$ + + + /** + * Utility method to calculate the slope-code for a given slope in degrees. + * @param slope The slope in degrees + * @return The slope code for the given slope in degrees. + */ + public static SlopeCode getSlopeCode(int slope) { + + final SlopeCode[] slopeCodes = SlopeCode.values(); + for (final SlopeCode slopeCode : slopeCodes) { + if (slope >= slopeCode.getStartSlope() && slope <= slopeCode.getEndSlope()) { + return slopeCode; + } + } + return null; + + } private String label; private int id; + + /** + * The start and end of the range used to classify a slope code. + */ + private int startSlope, endSlope; + - private DynamicsCode(String label, int id) { + private SlopeCode(String label, int id, int startSlope, int endSlope) { this.label = label; this.id = id; + this.startSlope = startSlope; + this.endSlope = endSlope; + } + + public int getEndSlope() { + return endSlope; } public int getId() { @@ -29,8 +58,8 @@ public enum DynamicsCode { return label; } - public void setId(int id) { - this.id = id; + public int getStartSlope() { + return startSlope; } @Override @@ -38,24 +67,4 @@ public enum DynamicsCode { return label; } - public static Integer getDynamicsCode(String landUseSubcategory) { - if( landUseSubcategory.startsWith("FLto") ){ //$NON-NLS-1$ - return FROM_FOREST.getId(); - }else if( landUseSubcategory.startsWith("CLto") ){ //$NON-NLS-1$ - return FROM_CROPLAND.getId(); - }else if( landUseSubcategory.startsWith("SLto") ){ //$NON-NLS-1$ - return FROM_SETTLEMENT.getId(); - }else if( landUseSubcategory.startsWith("WLto") ){ //$NON-NLS-1$ - return FROM_WETLAND.getId(); - }else if( landUseSubcategory.startsWith("GLto") ){ //$NON-NLS-1$ - return FROM_GRASSLAND.getId(); - }else if( landUseSubcategory.startsWith("OLto") || landUseSubcategory.startsWith("OTto")){ //$NON-NLS-1$ //$NON-NLS-2$ - return FROM_OTHERLAND.getId(); - }else if ( StringUtils.isBlank( landUseSubcategory )) { - throw new IllegalArgumentException("The land use subcategory " + landUseSubcategory + " is not recognizable."); //$NON-NLS-1$ //$NON-NLS-2$ - }else{ - return NA.getId(); - } - } - } From 552f243d42d7c6a6d5af7550ea108a93083147e3 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:35 +0100 Subject: [PATCH 0065/1620] New translations SlopeCode.java (English) --- .../earth/app/view/Messages_en.properties | 67 +++++++++++-------- 1 file changed, 38 insertions(+), 29 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index f5ef63f5c6..eb2152ecb3 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,24 +1,53 @@ package org.openforis.collect.earth.app.model; -import org.apache.commons.lang3.StringUtils; import org.openforis.collect.earth.app.view.Messages; /** - * Enumeration of the dynamics that Collect Earth can use to classify the plots. - * + * Slope codes by range associated to a slope in degrees ( 0-5 degrees flat, 6-15 slight, 15-30 steep and so on) * @author Alfonso Sanchez-Paus Diaz - * + * */ -public enum DynamicsCode { - FROM_FOREST(Messages.getString("DynamicsCode.0"), 1), FROM_GRASSLAND(Messages.getString("DynamicsCode.1"), 3), FROM_SETTLEMENT(Messages.getString("DynamicsCode.2"), 4), FROM_OTHERLAND(Messages.getString("DynamicsCode.3"), 5), FROM_WETLAND(Messages.getString("DynamicsCode.4"), 6), FROM_CROPLAND(Messages.getString("DynamicsCode.5"), 7), NA("NA", 8); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ +public enum SlopeCode { + FLAT(Messages.getString("SlopeCode.0"), 1, 0, 5), SLIGHT("6-15", 2, 6, 15), STEEP("16-30", 3, 16, 30), VERY_STEEP("31-45", 4, 31, 45), EXTREME("46-60", 5, 46, 60), FALL( //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ + "61-90", 6, 61, 90), NA("NA", 7, -1, -1); //$NON-NLS-1$ //$NON-NLS-2$ + + + /** + * Utility method to calculate the slope-code for a given slope in degrees. + * @param slope The slope in degrees + * @return The slope code for the given slope in degrees. + */ + public static SlopeCode getSlopeCode(int slope) { + + final SlopeCode[] slopeCodes = SlopeCode.values(); + for (final SlopeCode slopeCode : slopeCodes) { + if (slope >= slopeCode.getStartSlope() && slope <= slopeCode.getEndSlope()) { + return slopeCode; + } + } + return null; + + } private String label; private int id; + + /** + * The start and end of the range used to classify a slope code. + */ + private int startSlope, endSlope; + - private DynamicsCode(String label, int id) { + private SlopeCode(String label, int id, int startSlope, int endSlope) { this.label = label; this.id = id; + this.startSlope = startSlope; + this.endSlope = endSlope; + } + + public int getEndSlope() { + return endSlope; } public int getId() { @@ -29,8 +58,8 @@ public enum DynamicsCode { return label; } - public void setId(int id) { - this.id = id; + public int getStartSlope() { + return startSlope; } @Override @@ -38,24 +67,4 @@ public enum DynamicsCode { return label; } - public static Integer getDynamicsCode(String landUseSubcategory) { - if( landUseSubcategory.startsWith("FLto") ){ //$NON-NLS-1$ - return FROM_FOREST.getId(); - }else if( landUseSubcategory.startsWith("CLto") ){ //$NON-NLS-1$ - return FROM_CROPLAND.getId(); - }else if( landUseSubcategory.startsWith("SLto") ){ //$NON-NLS-1$ - return FROM_SETTLEMENT.getId(); - }else if( landUseSubcategory.startsWith("WLto") ){ //$NON-NLS-1$ - return FROM_WETLAND.getId(); - }else if( landUseSubcategory.startsWith("GLto") ){ //$NON-NLS-1$ - return FROM_GRASSLAND.getId(); - }else if( landUseSubcategory.startsWith("OLto") || landUseSubcategory.startsWith("OTto")){ //$NON-NLS-1$ //$NON-NLS-2$ - return FROM_OTHERLAND.getId(); - }else if ( StringUtils.isBlank( landUseSubcategory )) { - throw new IllegalArgumentException("The land use subcategory " + landUseSubcategory + " is not recognizable."); //$NON-NLS-1$ //$NON-NLS-2$ - }else{ - return NA.getId(); - } - } - } From 8c95013a590283289688c295ebb3733e335a2657 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:36 +0100 Subject: [PATCH 0066/1620] New translations BalloonServlet.java (French) --- .../earth/app/view/Messages_fr.properties | 151 ++++++++++++------ 1 file changed, 100 insertions(+), 51 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index eb2152ecb3..511ad9d567 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,70 +1,119 @@ -package org.openforis.collect.earth.app.model; +package org.openforis.collect.earth.app.server; -import org.openforis.collect.earth.app.view.Messages; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.regex.Pattern; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.io.FileUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.service.BrowserNotFoundException; +import org.openforis.collect.earth.app.service.BrowserService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; /** - * Slope codes by range associated to a slope in degrees ( 0-5 degrees flat, 6-15 slight, 15-30 steep and so on) + * This servlet is called by the balloon (KML pop-up form) when it is open and the user has chosen to see the form in a separate browser + * window. + * In that case a special HTML is used whose sole purpose is to load an invisible iframe that calls the URL localhot/openInBrowser + * This causes a new browser window to open and then the browser is redirected to another URL ( localhost/balloon ) that contains the actual HTML + * form. + * The functionality is used mostly for LINUX users due to the different bugs present in Google Earth for LINUX which makes the Bootstrap library + * fail. + * * @author Alfonso Sanchez-Paus Diaz * */ -public enum SlopeCode { - FLAT(Messages.getString("SlopeCode.0"), 1, 0, 5), SLIGHT("6-15", 2, 6, 15), STEEP("16-30", 3, 16, 30), VERY_STEEP("31-45", 4, 31, 45), EXTREME("46-60", 5, 46, 60), FALL( //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ - "61-90", 6, 61, 90), NA("NA", 7, -1, -1); //$NON-NLS-1$ //$NON-NLS-2$ - - - /** - * Utility method to calculate the slope-code for a given slope in degrees. - * @param slope The slope in degrees - * @return The slope code for the given slope in degrees. - */ - public static SlopeCode getSlopeCode(int slope) { - - final SlopeCode[] slopeCodes = SlopeCode.values(); - for (final SlopeCode slopeCode : slopeCodes) { - if (slope >= slopeCode.getStartSlope() && slope <= slopeCode.getEndSlope()) { - return slopeCode; - } - } - return null; +@Controller +public class BalloonServlet extends DataAccessingServlet { - } + @Autowired + private BrowserService browserService; - private String label; - - private int id; - - /** - * The start and end of the range used to classify a slope code. - */ - private int startSlope, endSlope; - - - private SlopeCode(String label, int id, int startSlope, int endSlope) { - this.label = label; - this.id = id; - this.startSlope = startSlope; - this.endSlope = endSlope; - } + @Autowired + private LocalPropertiesService localPropertiesService; - public int getEndSlope() { - return endSlope; - } + private RemoteWebDriver webKitDriver = null; + + private static final String BALLOON_EXTERNAL_URL = "balloon"; //$NON-NLS-1$ - public int getId() { - return id; + private String buildGetParameters(Map parameterMap) { + final StringBuilder getParameters = new StringBuilder(); + final Set> entrySet = parameterMap.entrySet(); + for (final Entry entry : entrySet) { + getParameters.append(entry.getKey()).append("=").append(entry.getValue()[0]).append("&"); //$NON-NLS-1$ //$NON-NLS-2$ + } + return getParameters.toString(); } - public String getLabel() { - return label; + @GetMapping("/openInBrowser") + public void openInBrowser(HttpServletResponse response, HttpServletRequest request, String imageName) { + String url = ServerController.getHostAddress(localPropertiesService.getHost(), localPropertiesService.getLocalPort()); + url = url + BALLOON_EXTERNAL_URL + "?" + buildGetParameters(request.getParameterMap()); //$NON-NLS-1$ + final String fUrl = url; + final Thread openBrowser = new Thread("Open URL in browser : " + fUrl) { + @Override + public void run() { + try { + webKitDriver = browserService.navigateTo(fUrl, webKitDriver, false); + } catch (BrowserNotFoundException e) { + logger.error("No browser found", e); //$NON-NLS-1$ + } + } + }; + openBrowser.start(); } - public int getStartSlope() { - return startSlope; + private String replaceGoalsWithParameters(String htmlWithGoals, Map parameterMap) { + final Set> entrySet = parameterMap.entrySet(); + for (final Entry entry : entrySet) { + htmlWithGoals = htmlWithGoals.replaceAll("\\$\\[" + Pattern.quote( entry.getKey() ) + "\\]", entry.getValue()[0]); //$NON-NLS-1$ //$NON-NLS-2$ + } + return htmlWithGoals; } - @Override - public String toString() { - return label; + @GetMapping("/"+BALLOON_EXTERNAL_URL) + public void returnBalloon(HttpServletResponse response, HttpServletRequest request, String imageName) throws IOException { + response.setHeader("Content-Type", "text/html"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Content-Disposition", "inline; filename=\"" + imageName + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Date", new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH).format(new Date())); //$NON-NLS-1$ + + String balloonContents = FileUtils.readFileToString( new File(localPropertiesService.getBalloonFile()), StandardCharsets.UTF_8 ); + + if (balloonContents != null) { + balloonContents = balloonContents.replace(EarthConstants.FOLDER_COPIED_TO_KMZ + "/", EarthConstants.GENERATED_FOLDER_SUFFIX + "/" //$NON-NLS-1$ //$NON-NLS-2$ + + EarthConstants.FOLDER_COPIED_TO_KMZ + "/"); //$NON-NLS-1$ + balloonContents = replaceGoalsWithParameters(balloonContents, request.getParameterMap()); + + final byte[] bytes = balloonContents.getBytes(); + response.setHeader("Content-Length", Integer.toString( bytes.length ) ); //$NON-NLS-1$ //$NON-NLS-2$ + writeToResponse(response, bytes); + } else { + getLogger().error("There was a problem fetching the balloon html, please check the name!"); //$NON-NLS-1$ + } } + private void writeToResponse(HttpServletResponse response, byte[] fileContents) throws IOException { + try { + response.getOutputStream().write(fileContents); + } catch (final Exception e) { + getLogger().error("Error writing reponse body to output stream ", e); //$NON-NLS-1$ + } finally { + response.getOutputStream().close(); + } + } } From 6d69b45749894822bc34e6c0b52dcecbc0709053 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:37 +0100 Subject: [PATCH 0067/1620] New translations BalloonServlet.java (Spanish) --- .../earth/app/view/Messages_es.properties | 151 ++++++++++++------ 1 file changed, 100 insertions(+), 51 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index eb2152ecb3..511ad9d567 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,70 +1,119 @@ -package org.openforis.collect.earth.app.model; +package org.openforis.collect.earth.app.server; -import org.openforis.collect.earth.app.view.Messages; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.regex.Pattern; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.io.FileUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.service.BrowserNotFoundException; +import org.openforis.collect.earth.app.service.BrowserService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; /** - * Slope codes by range associated to a slope in degrees ( 0-5 degrees flat, 6-15 slight, 15-30 steep and so on) + * This servlet is called by the balloon (KML pop-up form) when it is open and the user has chosen to see the form in a separate browser + * window. + * In that case a special HTML is used whose sole purpose is to load an invisible iframe that calls the URL localhot/openInBrowser + * This causes a new browser window to open and then the browser is redirected to another URL ( localhost/balloon ) that contains the actual HTML + * form. + * The functionality is used mostly for LINUX users due to the different bugs present in Google Earth for LINUX which makes the Bootstrap library + * fail. + * * @author Alfonso Sanchez-Paus Diaz * */ -public enum SlopeCode { - FLAT(Messages.getString("SlopeCode.0"), 1, 0, 5), SLIGHT("6-15", 2, 6, 15), STEEP("16-30", 3, 16, 30), VERY_STEEP("31-45", 4, 31, 45), EXTREME("46-60", 5, 46, 60), FALL( //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ - "61-90", 6, 61, 90), NA("NA", 7, -1, -1); //$NON-NLS-1$ //$NON-NLS-2$ - - - /** - * Utility method to calculate the slope-code for a given slope in degrees. - * @param slope The slope in degrees - * @return The slope code for the given slope in degrees. - */ - public static SlopeCode getSlopeCode(int slope) { - - final SlopeCode[] slopeCodes = SlopeCode.values(); - for (final SlopeCode slopeCode : slopeCodes) { - if (slope >= slopeCode.getStartSlope() && slope <= slopeCode.getEndSlope()) { - return slopeCode; - } - } - return null; +@Controller +public class BalloonServlet extends DataAccessingServlet { - } + @Autowired + private BrowserService browserService; - private String label; - - private int id; - - /** - * The start and end of the range used to classify a slope code. - */ - private int startSlope, endSlope; - - - private SlopeCode(String label, int id, int startSlope, int endSlope) { - this.label = label; - this.id = id; - this.startSlope = startSlope; - this.endSlope = endSlope; - } + @Autowired + private LocalPropertiesService localPropertiesService; - public int getEndSlope() { - return endSlope; - } + private RemoteWebDriver webKitDriver = null; + + private static final String BALLOON_EXTERNAL_URL = "balloon"; //$NON-NLS-1$ - public int getId() { - return id; + private String buildGetParameters(Map parameterMap) { + final StringBuilder getParameters = new StringBuilder(); + final Set> entrySet = parameterMap.entrySet(); + for (final Entry entry : entrySet) { + getParameters.append(entry.getKey()).append("=").append(entry.getValue()[0]).append("&"); //$NON-NLS-1$ //$NON-NLS-2$ + } + return getParameters.toString(); } - public String getLabel() { - return label; + @GetMapping("/openInBrowser") + public void openInBrowser(HttpServletResponse response, HttpServletRequest request, String imageName) { + String url = ServerController.getHostAddress(localPropertiesService.getHost(), localPropertiesService.getLocalPort()); + url = url + BALLOON_EXTERNAL_URL + "?" + buildGetParameters(request.getParameterMap()); //$NON-NLS-1$ + final String fUrl = url; + final Thread openBrowser = new Thread("Open URL in browser : " + fUrl) { + @Override + public void run() { + try { + webKitDriver = browserService.navigateTo(fUrl, webKitDriver, false); + } catch (BrowserNotFoundException e) { + logger.error("No browser found", e); //$NON-NLS-1$ + } + } + }; + openBrowser.start(); } - public int getStartSlope() { - return startSlope; + private String replaceGoalsWithParameters(String htmlWithGoals, Map parameterMap) { + final Set> entrySet = parameterMap.entrySet(); + for (final Entry entry : entrySet) { + htmlWithGoals = htmlWithGoals.replaceAll("\\$\\[" + Pattern.quote( entry.getKey() ) + "\\]", entry.getValue()[0]); //$NON-NLS-1$ //$NON-NLS-2$ + } + return htmlWithGoals; } - @Override - public String toString() { - return label; + @GetMapping("/"+BALLOON_EXTERNAL_URL) + public void returnBalloon(HttpServletResponse response, HttpServletRequest request, String imageName) throws IOException { + response.setHeader("Content-Type", "text/html"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Content-Disposition", "inline; filename=\"" + imageName + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Date", new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH).format(new Date())); //$NON-NLS-1$ + + String balloonContents = FileUtils.readFileToString( new File(localPropertiesService.getBalloonFile()), StandardCharsets.UTF_8 ); + + if (balloonContents != null) { + balloonContents = balloonContents.replace(EarthConstants.FOLDER_COPIED_TO_KMZ + "/", EarthConstants.GENERATED_FOLDER_SUFFIX + "/" //$NON-NLS-1$ //$NON-NLS-2$ + + EarthConstants.FOLDER_COPIED_TO_KMZ + "/"); //$NON-NLS-1$ + balloonContents = replaceGoalsWithParameters(balloonContents, request.getParameterMap()); + + final byte[] bytes = balloonContents.getBytes(); + response.setHeader("Content-Length", Integer.toString( bytes.length ) ); //$NON-NLS-1$ //$NON-NLS-2$ + writeToResponse(response, bytes); + } else { + getLogger().error("There was a problem fetching the balloon html, please check the name!"); //$NON-NLS-1$ + } } + private void writeToResponse(HttpServletResponse response, byte[] fileContents) throws IOException { + try { + response.getOutputStream().write(fileContents); + } catch (final Exception e) { + getLogger().error("Error writing reponse body to output stream ", e); //$NON-NLS-1$ + } finally { + response.getOutputStream().close(); + } + } } From 3dead67226c2e6812142cb84fd59ea58441e8454 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:38 +0100 Subject: [PATCH 0068/1620] New translations BalloonServlet.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 151 ++++++++++++------ 1 file changed, 100 insertions(+), 51 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index eb2152ecb3..511ad9d567 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,70 +1,119 @@ -package org.openforis.collect.earth.app.model; +package org.openforis.collect.earth.app.server; -import org.openforis.collect.earth.app.view.Messages; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.regex.Pattern; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.io.FileUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.service.BrowserNotFoundException; +import org.openforis.collect.earth.app.service.BrowserService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; /** - * Slope codes by range associated to a slope in degrees ( 0-5 degrees flat, 6-15 slight, 15-30 steep and so on) + * This servlet is called by the balloon (KML pop-up form) when it is open and the user has chosen to see the form in a separate browser + * window. + * In that case a special HTML is used whose sole purpose is to load an invisible iframe that calls the URL localhot/openInBrowser + * This causes a new browser window to open and then the browser is redirected to another URL ( localhost/balloon ) that contains the actual HTML + * form. + * The functionality is used mostly for LINUX users due to the different bugs present in Google Earth for LINUX which makes the Bootstrap library + * fail. + * * @author Alfonso Sanchez-Paus Diaz * */ -public enum SlopeCode { - FLAT(Messages.getString("SlopeCode.0"), 1, 0, 5), SLIGHT("6-15", 2, 6, 15), STEEP("16-30", 3, 16, 30), VERY_STEEP("31-45", 4, 31, 45), EXTREME("46-60", 5, 46, 60), FALL( //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ - "61-90", 6, 61, 90), NA("NA", 7, -1, -1); //$NON-NLS-1$ //$NON-NLS-2$ - - - /** - * Utility method to calculate the slope-code for a given slope in degrees. - * @param slope The slope in degrees - * @return The slope code for the given slope in degrees. - */ - public static SlopeCode getSlopeCode(int slope) { - - final SlopeCode[] slopeCodes = SlopeCode.values(); - for (final SlopeCode slopeCode : slopeCodes) { - if (slope >= slopeCode.getStartSlope() && slope <= slopeCode.getEndSlope()) { - return slopeCode; - } - } - return null; +@Controller +public class BalloonServlet extends DataAccessingServlet { - } + @Autowired + private BrowserService browserService; - private String label; - - private int id; - - /** - * The start and end of the range used to classify a slope code. - */ - private int startSlope, endSlope; - - - private SlopeCode(String label, int id, int startSlope, int endSlope) { - this.label = label; - this.id = id; - this.startSlope = startSlope; - this.endSlope = endSlope; - } + @Autowired + private LocalPropertiesService localPropertiesService; - public int getEndSlope() { - return endSlope; - } + private RemoteWebDriver webKitDriver = null; + + private static final String BALLOON_EXTERNAL_URL = "balloon"; //$NON-NLS-1$ - public int getId() { - return id; + private String buildGetParameters(Map parameterMap) { + final StringBuilder getParameters = new StringBuilder(); + final Set> entrySet = parameterMap.entrySet(); + for (final Entry entry : entrySet) { + getParameters.append(entry.getKey()).append("=").append(entry.getValue()[0]).append("&"); //$NON-NLS-1$ //$NON-NLS-2$ + } + return getParameters.toString(); } - public String getLabel() { - return label; + @GetMapping("/openInBrowser") + public void openInBrowser(HttpServletResponse response, HttpServletRequest request, String imageName) { + String url = ServerController.getHostAddress(localPropertiesService.getHost(), localPropertiesService.getLocalPort()); + url = url + BALLOON_EXTERNAL_URL + "?" + buildGetParameters(request.getParameterMap()); //$NON-NLS-1$ + final String fUrl = url; + final Thread openBrowser = new Thread("Open URL in browser : " + fUrl) { + @Override + public void run() { + try { + webKitDriver = browserService.navigateTo(fUrl, webKitDriver, false); + } catch (BrowserNotFoundException e) { + logger.error("No browser found", e); //$NON-NLS-1$ + } + } + }; + openBrowser.start(); } - public int getStartSlope() { - return startSlope; + private String replaceGoalsWithParameters(String htmlWithGoals, Map parameterMap) { + final Set> entrySet = parameterMap.entrySet(); + for (final Entry entry : entrySet) { + htmlWithGoals = htmlWithGoals.replaceAll("\\$\\[" + Pattern.quote( entry.getKey() ) + "\\]", entry.getValue()[0]); //$NON-NLS-1$ //$NON-NLS-2$ + } + return htmlWithGoals; } - @Override - public String toString() { - return label; + @GetMapping("/"+BALLOON_EXTERNAL_URL) + public void returnBalloon(HttpServletResponse response, HttpServletRequest request, String imageName) throws IOException { + response.setHeader("Content-Type", "text/html"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Content-Disposition", "inline; filename=\"" + imageName + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Date", new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH).format(new Date())); //$NON-NLS-1$ + + String balloonContents = FileUtils.readFileToString( new File(localPropertiesService.getBalloonFile()), StandardCharsets.UTF_8 ); + + if (balloonContents != null) { + balloonContents = balloonContents.replace(EarthConstants.FOLDER_COPIED_TO_KMZ + "/", EarthConstants.GENERATED_FOLDER_SUFFIX + "/" //$NON-NLS-1$ //$NON-NLS-2$ + + EarthConstants.FOLDER_COPIED_TO_KMZ + "/"); //$NON-NLS-1$ + balloonContents = replaceGoalsWithParameters(balloonContents, request.getParameterMap()); + + final byte[] bytes = balloonContents.getBytes(); + response.setHeader("Content-Length", Integer.toString( bytes.length ) ); //$NON-NLS-1$ //$NON-NLS-2$ + writeToResponse(response, bytes); + } else { + getLogger().error("There was a problem fetching the balloon html, please check the name!"); //$NON-NLS-1$ + } } + private void writeToResponse(HttpServletResponse response, byte[] fileContents) throws IOException { + try { + response.getOutputStream().write(fileContents); + } catch (final Exception e) { + getLogger().error("Error writing reponse body to output stream ", e); //$NON-NLS-1$ + } finally { + response.getOutputStream().close(); + } + } } From abb6d9b0e8481045704e5907dee567e50b84e323 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:39 +0100 Subject: [PATCH 0069/1620] New translations GoogleEarthHeaderFilter.java (French) --- .../earth/app/view/Messages_fr.properties | 153 ++++++------------ 1 file changed, 53 insertions(+), 100 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 511ad9d567..c5752cae99 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,119 +1,72 @@ package org.openforis.collect.earth.app.server; -import java.io.File; import java.io.IOException; -import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.regex.Pattern; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; -import org.apache.commons.io.FileUtils; +import org.eclipse.jetty.http.HttpHeader; import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.desktop.ServerController; -import org.openforis.collect.earth.app.service.BrowserNotFoundException; -import org.openforis.collect.earth.app.service.BrowserService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openqa.selenium.remote.RemoteWebDriver; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; - -/** - * This servlet is called by the balloon (KML pop-up form) when it is open and the user has chosen to see the form in a separate browser - * window. - * In that case a special HTML is used whose sole purpose is to load an invisible iframe that calls the URL localhot/openInBrowser - * This causes a new browser window to open and then the browser is redirected to another URL ( localhost/balloon ) that contains the actual HTML - * form. - * The functionality is used mostly for LINUX users due to the different bugs present in Google Earth for LINUX which makes the Bootstrap library - * fail. - * - * @author Alfonso Sanchez-Paus Diaz - * - */ -@Controller -public class BalloonServlet extends DataAccessingServlet { - - @Autowired - private BrowserService browserService; - - @Autowired - private LocalPropertiesService localPropertiesService; - - private RemoteWebDriver webKitDriver = null; - - private static final String BALLOON_EXTERNAL_URL = "balloon"; //$NON-NLS-1$ - - private String buildGetParameters(Map parameterMap) { - final StringBuilder getParameters = new StringBuilder(); - final Set> entrySet = parameterMap.entrySet(); - for (final Entry entry : entrySet) { - getParameters.append(entry.getKey()).append("=").append(entry.getValue()[0]).append("&"); //$NON-NLS-1$ //$NON-NLS-2$ - } - return getParameters.toString(); - } +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; - @GetMapping("/openInBrowser") - public void openInBrowser(HttpServletResponse response, HttpServletRequest request, String imageName) { - String url = ServerController.getHostAddress(localPropertiesService.getHost(), localPropertiesService.getLocalPort()); - url = url + BALLOON_EXTERNAL_URL + "?" + buildGetParameters(request.getParameterMap()); //$NON-NLS-1$ - final String fUrl = url; - final Thread openBrowser = new Thread("Open URL in browser : " + fUrl) { - @Override - public void run() { - try { - webKitDriver = browserService.navigateTo(fUrl, webKitDriver, false); - } catch (BrowserNotFoundException e) { - logger.error("No browser found", e); //$NON-NLS-1$ - } - } - }; - openBrowser.start(); - } +public class GoogleEarthHeaderFilter implements Filter{ + + final SimpleDateFormat dateFormat = new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH ); + Logger logger = LoggerFactory.getLogger(GoogleEarthHeaderFilter.class ); + static final String ORIGIN_HEADER = "Origin"; - private String replaceGoalsWithParameters(String htmlWithGoals, Map parameterMap) { - final Set> entrySet = parameterMap.entrySet(); - for (final Entry entry : entrySet) { - htmlWithGoals = htmlWithGoals.replaceAll("\\$\\[" + Pattern.quote( entry.getKey() ) + "\\]", entry.getValue()[0]); //$NON-NLS-1$ //$NON-NLS-2$ - } - return htmlWithGoals; + @Override + public void init(FilterConfig filterConfig) throws ServletException { } - @GetMapping("/"+BALLOON_EXTERNAL_URL) - public void returnBalloon(HttpServletResponse response, HttpServletRequest request, String imageName) throws IOException { - response.setHeader("Content-Type", "text/html"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Content-Disposition", "inline; filename=\"" + imageName + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Date", new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH).format(new Date())); //$NON-NLS-1$ - - String balloonContents = FileUtils.readFileToString( new File(localPropertiesService.getBalloonFile()), StandardCharsets.UTF_8 ); - - if (balloonContents != null) { - balloonContents = balloonContents.replace(EarthConstants.FOLDER_COPIED_TO_KMZ + "/", EarthConstants.GENERATED_FOLDER_SUFFIX + "/" //$NON-NLS-1$ //$NON-NLS-2$ - + EarthConstants.FOLDER_COPIED_TO_KMZ + "/"); //$NON-NLS-1$ - balloonContents = replaceGoalsWithParameters(balloonContents, request.getParameterMap()); - - final byte[] bytes = balloonContents.getBytes(); - response.setHeader("Content-Length", Integer.toString( bytes.length ) ); //$NON-NLS-1$ //$NON-NLS-2$ - writeToResponse(response, bytes); - } else { - getLogger().error("There was a problem fetching the balloon html, please check the name!"); //$NON-NLS-1$ - } + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + + chain.doFilter(new HttpServletRequestWrapper( (HttpServletRequest) request) { + @Override + public long getDateHeader(String name){ + if(name.equals(HttpHeader.IF_MODIFIED_SINCE.toString() )){ + Date now = new Date(); + return now.getTime(); + }else { + return super.getDateHeader(name); + } + } + + @Override + public String getHeader(String name) { + if(name!=null && name.equals(ORIGIN_HEADER) && (super.getHeader(ORIGIN_HEADER)==null || super.getHeader(ORIGIN_HEADER).equals("null")) ){ + return "*"; + }else + return super.getHeader(name); + } + }, response + ); + + + + ((HttpServletResponse) response).setHeader("Access-Control-Allow-Origin" , "*"); + ((HttpServletResponse) response).setHeader("Access-Control-Allow-Methods" , "GET, POST, PATCH, PUT, DELETE, OPTIONS"); + ((HttpServletResponse) response).setHeader("Access-Control-Allow-Headers" , "Origin, Content-Type, X-Auth-Token"); + + logger.debug( "Added Acces control origin to " + ( ( HttpServletRequest)request).getRequestURI() ); } - private void writeToResponse(HttpServletResponse response, byte[] fileContents) throws IOException { - try { - response.getOutputStream().write(fileContents); - } catch (final Exception e) { - getLogger().error("Error writing reponse body to output stream ", e); //$NON-NLS-1$ - } finally { - response.getOutputStream().close(); - } + @Override + public void destroy() { + } + } From 739d10fdcda523131e996a80b836b6e211b180d1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:40 +0100 Subject: [PATCH 0070/1620] New translations DynamicsCode.java (French) --- .../earth/app/view/Messages_fr.properties | 101 ++++++++---------- 1 file changed, 45 insertions(+), 56 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index c5752cae99..f5ef63f5c6 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,72 +1,61 @@ -package org.openforis.collect.earth.app.server; +package org.openforis.collect.earth.app.model; -import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Locale; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.view.Messages; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletRequestWrapper; -import javax.servlet.http.HttpServletResponse; +/** + * Enumeration of the dynamics that Collect Earth can use to classify the plots. + * + * @author Alfonso Sanchez-Paus Diaz + * + */ +public enum DynamicsCode { + FROM_FOREST(Messages.getString("DynamicsCode.0"), 1), FROM_GRASSLAND(Messages.getString("DynamicsCode.1"), 3), FROM_SETTLEMENT(Messages.getString("DynamicsCode.2"), 4), FROM_OTHERLAND(Messages.getString("DynamicsCode.3"), 5), FROM_WETLAND(Messages.getString("DynamicsCode.4"), 6), FROM_CROPLAND(Messages.getString("DynamicsCode.5"), 7), NA("NA", 8); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ -import org.eclipse.jetty.http.HttpHeader; -import org.openforis.collect.earth.app.EarthConstants; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; + private String label; -public class GoogleEarthHeaderFilter implements Filter{ + private int id; - final SimpleDateFormat dateFormat = new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH ); - Logger logger = LoggerFactory.getLogger(GoogleEarthHeaderFilter.class ); - static final String ORIGIN_HEADER = "Origin"; - - @Override - public void init(FilterConfig filterConfig) throws ServletException { + private DynamicsCode(String label, int id) { + this.label = label; + this.id = id; } - @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) - throws IOException, ServletException { - - chain.doFilter(new HttpServletRequestWrapper( (HttpServletRequest) request) { - @Override - public long getDateHeader(String name){ - if(name.equals(HttpHeader.IF_MODIFIED_SINCE.toString() )){ - Date now = new Date(); - return now.getTime(); - }else { - return super.getDateHeader(name); - } - } - - @Override - public String getHeader(String name) { - if(name!=null && name.equals(ORIGIN_HEADER) && (super.getHeader(ORIGIN_HEADER)==null || super.getHeader(ORIGIN_HEADER).equals("null")) ){ - return "*"; - }else - return super.getHeader(name); - } - }, response - ); - - + public int getId() { + return id; + } - ((HttpServletResponse) response).setHeader("Access-Control-Allow-Origin" , "*"); - ((HttpServletResponse) response).setHeader("Access-Control-Allow-Methods" , "GET, POST, PATCH, PUT, DELETE, OPTIONS"); - ((HttpServletResponse) response).setHeader("Access-Control-Allow-Headers" , "Origin, Content-Type, X-Auth-Token"); + public String getLabel() { + return label; + } - logger.debug( "Added Acces control origin to " + ( ( HttpServletRequest)request).getRequestURI() ); + public void setId(int id) { + this.id = id; } @Override - public void destroy() { + public String toString() { + return label; + } + public static Integer getDynamicsCode(String landUseSubcategory) { + if( landUseSubcategory.startsWith("FLto") ){ //$NON-NLS-1$ + return FROM_FOREST.getId(); + }else if( landUseSubcategory.startsWith("CLto") ){ //$NON-NLS-1$ + return FROM_CROPLAND.getId(); + }else if( landUseSubcategory.startsWith("SLto") ){ //$NON-NLS-1$ + return FROM_SETTLEMENT.getId(); + }else if( landUseSubcategory.startsWith("WLto") ){ //$NON-NLS-1$ + return FROM_WETLAND.getId(); + }else if( landUseSubcategory.startsWith("GLto") ){ //$NON-NLS-1$ + return FROM_GRASSLAND.getId(); + }else if( landUseSubcategory.startsWith("OLto") || landUseSubcategory.startsWith("OTto")){ //$NON-NLS-1$ //$NON-NLS-2$ + return FROM_OTHERLAND.getId(); + }else if ( StringUtils.isBlank( landUseSubcategory )) { + throw new IllegalArgumentException("The land use subcategory " + landUseSubcategory + " is not recognizable."); //$NON-NLS-1$ //$NON-NLS-2$ + }else{ + return NA.getId(); + } } } From 743e7679af9145141593b374b9bcbb30a1632f17 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:41 +0100 Subject: [PATCH 0071/1620] New translations GoogleEarthHeaderFilter.java (Spanish) --- .../earth/app/view/Messages_es.properties | 153 ++++++------------ 1 file changed, 53 insertions(+), 100 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 511ad9d567..c5752cae99 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,119 +1,72 @@ package org.openforis.collect.earth.app.server; -import java.io.File; import java.io.IOException; -import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.regex.Pattern; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; -import org.apache.commons.io.FileUtils; +import org.eclipse.jetty.http.HttpHeader; import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.desktop.ServerController; -import org.openforis.collect.earth.app.service.BrowserNotFoundException; -import org.openforis.collect.earth.app.service.BrowserService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openqa.selenium.remote.RemoteWebDriver; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; - -/** - * This servlet is called by the balloon (KML pop-up form) when it is open and the user has chosen to see the form in a separate browser - * window. - * In that case a special HTML is used whose sole purpose is to load an invisible iframe that calls the URL localhot/openInBrowser - * This causes a new browser window to open and then the browser is redirected to another URL ( localhost/balloon ) that contains the actual HTML - * form. - * The functionality is used mostly for LINUX users due to the different bugs present in Google Earth for LINUX which makes the Bootstrap library - * fail. - * - * @author Alfonso Sanchez-Paus Diaz - * - */ -@Controller -public class BalloonServlet extends DataAccessingServlet { - - @Autowired - private BrowserService browserService; - - @Autowired - private LocalPropertiesService localPropertiesService; - - private RemoteWebDriver webKitDriver = null; - - private static final String BALLOON_EXTERNAL_URL = "balloon"; //$NON-NLS-1$ - - private String buildGetParameters(Map parameterMap) { - final StringBuilder getParameters = new StringBuilder(); - final Set> entrySet = parameterMap.entrySet(); - for (final Entry entry : entrySet) { - getParameters.append(entry.getKey()).append("=").append(entry.getValue()[0]).append("&"); //$NON-NLS-1$ //$NON-NLS-2$ - } - return getParameters.toString(); - } +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; - @GetMapping("/openInBrowser") - public void openInBrowser(HttpServletResponse response, HttpServletRequest request, String imageName) { - String url = ServerController.getHostAddress(localPropertiesService.getHost(), localPropertiesService.getLocalPort()); - url = url + BALLOON_EXTERNAL_URL + "?" + buildGetParameters(request.getParameterMap()); //$NON-NLS-1$ - final String fUrl = url; - final Thread openBrowser = new Thread("Open URL in browser : " + fUrl) { - @Override - public void run() { - try { - webKitDriver = browserService.navigateTo(fUrl, webKitDriver, false); - } catch (BrowserNotFoundException e) { - logger.error("No browser found", e); //$NON-NLS-1$ - } - } - }; - openBrowser.start(); - } +public class GoogleEarthHeaderFilter implements Filter{ + + final SimpleDateFormat dateFormat = new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH ); + Logger logger = LoggerFactory.getLogger(GoogleEarthHeaderFilter.class ); + static final String ORIGIN_HEADER = "Origin"; - private String replaceGoalsWithParameters(String htmlWithGoals, Map parameterMap) { - final Set> entrySet = parameterMap.entrySet(); - for (final Entry entry : entrySet) { - htmlWithGoals = htmlWithGoals.replaceAll("\\$\\[" + Pattern.quote( entry.getKey() ) + "\\]", entry.getValue()[0]); //$NON-NLS-1$ //$NON-NLS-2$ - } - return htmlWithGoals; + @Override + public void init(FilterConfig filterConfig) throws ServletException { } - @GetMapping("/"+BALLOON_EXTERNAL_URL) - public void returnBalloon(HttpServletResponse response, HttpServletRequest request, String imageName) throws IOException { - response.setHeader("Content-Type", "text/html"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Content-Disposition", "inline; filename=\"" + imageName + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Date", new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH).format(new Date())); //$NON-NLS-1$ - - String balloonContents = FileUtils.readFileToString( new File(localPropertiesService.getBalloonFile()), StandardCharsets.UTF_8 ); - - if (balloonContents != null) { - balloonContents = balloonContents.replace(EarthConstants.FOLDER_COPIED_TO_KMZ + "/", EarthConstants.GENERATED_FOLDER_SUFFIX + "/" //$NON-NLS-1$ //$NON-NLS-2$ - + EarthConstants.FOLDER_COPIED_TO_KMZ + "/"); //$NON-NLS-1$ - balloonContents = replaceGoalsWithParameters(balloonContents, request.getParameterMap()); - - final byte[] bytes = balloonContents.getBytes(); - response.setHeader("Content-Length", Integer.toString( bytes.length ) ); //$NON-NLS-1$ //$NON-NLS-2$ - writeToResponse(response, bytes); - } else { - getLogger().error("There was a problem fetching the balloon html, please check the name!"); //$NON-NLS-1$ - } + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + + chain.doFilter(new HttpServletRequestWrapper( (HttpServletRequest) request) { + @Override + public long getDateHeader(String name){ + if(name.equals(HttpHeader.IF_MODIFIED_SINCE.toString() )){ + Date now = new Date(); + return now.getTime(); + }else { + return super.getDateHeader(name); + } + } + + @Override + public String getHeader(String name) { + if(name!=null && name.equals(ORIGIN_HEADER) && (super.getHeader(ORIGIN_HEADER)==null || super.getHeader(ORIGIN_HEADER).equals("null")) ){ + return "*"; + }else + return super.getHeader(name); + } + }, response + ); + + + + ((HttpServletResponse) response).setHeader("Access-Control-Allow-Origin" , "*"); + ((HttpServletResponse) response).setHeader("Access-Control-Allow-Methods" , "GET, POST, PATCH, PUT, DELETE, OPTIONS"); + ((HttpServletResponse) response).setHeader("Access-Control-Allow-Headers" , "Origin, Content-Type, X-Auth-Token"); + + logger.debug( "Added Acces control origin to " + ( ( HttpServletRequest)request).getRequestURI() ); } - private void writeToResponse(HttpServletResponse response, byte[] fileContents) throws IOException { - try { - response.getOutputStream().write(fileContents); - } catch (final Exception e) { - getLogger().error("Error writing reponse body to output stream ", e); //$NON-NLS-1$ - } finally { - response.getOutputStream().close(); - } + @Override + public void destroy() { + } + } From ed7e4d72b045bc34f7b5d5a999662261c94644e9 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:42 +0100 Subject: [PATCH 0072/1620] New translations GoogleEarthHeaderFilter.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 153 ++++++------------ 1 file changed, 53 insertions(+), 100 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 511ad9d567..c5752cae99 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,119 +1,72 @@ package org.openforis.collect.earth.app.server; -import java.io.File; import java.io.IOException; -import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.regex.Pattern; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; -import org.apache.commons.io.FileUtils; +import org.eclipse.jetty.http.HttpHeader; import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.desktop.ServerController; -import org.openforis.collect.earth.app.service.BrowserNotFoundException; -import org.openforis.collect.earth.app.service.BrowserService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openqa.selenium.remote.RemoteWebDriver; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; - -/** - * This servlet is called by the balloon (KML pop-up form) when it is open and the user has chosen to see the form in a separate browser - * window. - * In that case a special HTML is used whose sole purpose is to load an invisible iframe that calls the URL localhot/openInBrowser - * This causes a new browser window to open and then the browser is redirected to another URL ( localhost/balloon ) that contains the actual HTML - * form. - * The functionality is used mostly for LINUX users due to the different bugs present in Google Earth for LINUX which makes the Bootstrap library - * fail. - * - * @author Alfonso Sanchez-Paus Diaz - * - */ -@Controller -public class BalloonServlet extends DataAccessingServlet { - - @Autowired - private BrowserService browserService; - - @Autowired - private LocalPropertiesService localPropertiesService; - - private RemoteWebDriver webKitDriver = null; - - private static final String BALLOON_EXTERNAL_URL = "balloon"; //$NON-NLS-1$ - - private String buildGetParameters(Map parameterMap) { - final StringBuilder getParameters = new StringBuilder(); - final Set> entrySet = parameterMap.entrySet(); - for (final Entry entry : entrySet) { - getParameters.append(entry.getKey()).append("=").append(entry.getValue()[0]).append("&"); //$NON-NLS-1$ //$NON-NLS-2$ - } - return getParameters.toString(); - } +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; - @GetMapping("/openInBrowser") - public void openInBrowser(HttpServletResponse response, HttpServletRequest request, String imageName) { - String url = ServerController.getHostAddress(localPropertiesService.getHost(), localPropertiesService.getLocalPort()); - url = url + BALLOON_EXTERNAL_URL + "?" + buildGetParameters(request.getParameterMap()); //$NON-NLS-1$ - final String fUrl = url; - final Thread openBrowser = new Thread("Open URL in browser : " + fUrl) { - @Override - public void run() { - try { - webKitDriver = browserService.navigateTo(fUrl, webKitDriver, false); - } catch (BrowserNotFoundException e) { - logger.error("No browser found", e); //$NON-NLS-1$ - } - } - }; - openBrowser.start(); - } +public class GoogleEarthHeaderFilter implements Filter{ + + final SimpleDateFormat dateFormat = new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH ); + Logger logger = LoggerFactory.getLogger(GoogleEarthHeaderFilter.class ); + static final String ORIGIN_HEADER = "Origin"; - private String replaceGoalsWithParameters(String htmlWithGoals, Map parameterMap) { - final Set> entrySet = parameterMap.entrySet(); - for (final Entry entry : entrySet) { - htmlWithGoals = htmlWithGoals.replaceAll("\\$\\[" + Pattern.quote( entry.getKey() ) + "\\]", entry.getValue()[0]); //$NON-NLS-1$ //$NON-NLS-2$ - } - return htmlWithGoals; + @Override + public void init(FilterConfig filterConfig) throws ServletException { } - @GetMapping("/"+BALLOON_EXTERNAL_URL) - public void returnBalloon(HttpServletResponse response, HttpServletRequest request, String imageName) throws IOException { - response.setHeader("Content-Type", "text/html"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Content-Disposition", "inline; filename=\"" + imageName + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Date", new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH).format(new Date())); //$NON-NLS-1$ - - String balloonContents = FileUtils.readFileToString( new File(localPropertiesService.getBalloonFile()), StandardCharsets.UTF_8 ); - - if (balloonContents != null) { - balloonContents = balloonContents.replace(EarthConstants.FOLDER_COPIED_TO_KMZ + "/", EarthConstants.GENERATED_FOLDER_SUFFIX + "/" //$NON-NLS-1$ //$NON-NLS-2$ - + EarthConstants.FOLDER_COPIED_TO_KMZ + "/"); //$NON-NLS-1$ - balloonContents = replaceGoalsWithParameters(balloonContents, request.getParameterMap()); - - final byte[] bytes = balloonContents.getBytes(); - response.setHeader("Content-Length", Integer.toString( bytes.length ) ); //$NON-NLS-1$ //$NON-NLS-2$ - writeToResponse(response, bytes); - } else { - getLogger().error("There was a problem fetching the balloon html, please check the name!"); //$NON-NLS-1$ - } + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + + chain.doFilter(new HttpServletRequestWrapper( (HttpServletRequest) request) { + @Override + public long getDateHeader(String name){ + if(name.equals(HttpHeader.IF_MODIFIED_SINCE.toString() )){ + Date now = new Date(); + return now.getTime(); + }else { + return super.getDateHeader(name); + } + } + + @Override + public String getHeader(String name) { + if(name!=null && name.equals(ORIGIN_HEADER) && (super.getHeader(ORIGIN_HEADER)==null || super.getHeader(ORIGIN_HEADER).equals("null")) ){ + return "*"; + }else + return super.getHeader(name); + } + }, response + ); + + + + ((HttpServletResponse) response).setHeader("Access-Control-Allow-Origin" , "*"); + ((HttpServletResponse) response).setHeader("Access-Control-Allow-Methods" , "GET, POST, PATCH, PUT, DELETE, OPTIONS"); + ((HttpServletResponse) response).setHeader("Access-Control-Allow-Headers" , "Origin, Content-Type, X-Auth-Token"); + + logger.debug( "Added Acces control origin to " + ( ( HttpServletRequest)request).getRequestURI() ); } - private void writeToResponse(HttpServletResponse response, byte[] fileContents) throws IOException { - try { - response.getOutputStream().write(fileContents); - } catch (final Exception e) { - getLogger().error("Error writing reponse body to output stream ", e); //$NON-NLS-1$ - } finally { - response.getOutputStream().close(); - } + @Override + public void destroy() { + } + } From e37892dd01b83b3896f48f80d5f19ddeadd70672 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:43 +0100 Subject: [PATCH 0073/1620] New translations GoogleEarthHeaderFilter.java (English) --- .../earth/app/view/Messages_en.properties | 116 +++++++++--------- 1 file changed, 59 insertions(+), 57 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index eb2152ecb3..c5752cae99 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,70 +1,72 @@ -package org.openforis.collect.earth.app.model; - -import org.openforis.collect.earth.app.view.Messages; - -/** - * Slope codes by range associated to a slope in degrees ( 0-5 degrees flat, 6-15 slight, 15-30 steep and so on) - * @author Alfonso Sanchez-Paus Diaz - * - */ -public enum SlopeCode { - FLAT(Messages.getString("SlopeCode.0"), 1, 0, 5), SLIGHT("6-15", 2, 6, 15), STEEP("16-30", 3, 16, 30), VERY_STEEP("31-45", 4, 31, 45), EXTREME("46-60", 5, 46, 60), FALL( //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ - "61-90", 6, 61, 90), NA("NA", 7, -1, -1); //$NON-NLS-1$ //$NON-NLS-2$ - - - /** - * Utility method to calculate the slope-code for a given slope in degrees. - * @param slope The slope in degrees - * @return The slope code for the given slope in degrees. - */ - public static SlopeCode getSlopeCode(int slope) { - - final SlopeCode[] slopeCodes = SlopeCode.values(); - for (final SlopeCode slopeCode : slopeCodes) { - if (slope >= slopeCode.getStartSlope() && slope <= slopeCode.getEndSlope()) { - return slopeCode; - } - } - return null; +package org.openforis.collect.earth.app.server; - } +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; - private String label; - - private int id; - - /** - * The start and end of the range used to classify a slope code. - */ - private int startSlope, endSlope; - - - private SlopeCode(String label, int id, int startSlope, int endSlope) { - this.label = label; - this.id = id; - this.startSlope = startSlope; - this.endSlope = endSlope; - } +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import javax.servlet.http.HttpServletResponse; - public int getEndSlope() { - return endSlope; - } +import org.eclipse.jetty.http.HttpHeader; +import org.openforis.collect.earth.app.EarthConstants; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; - public int getId() { - return id; - } +public class GoogleEarthHeaderFilter implements Filter{ - public String getLabel() { - return label; + final SimpleDateFormat dateFormat = new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH ); + Logger logger = LoggerFactory.getLogger(GoogleEarthHeaderFilter.class ); + static final String ORIGIN_HEADER = "Origin"; + + @Override + public void init(FilterConfig filterConfig) throws ServletException { } - public int getStartSlope() { - return startSlope; + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + + chain.doFilter(new HttpServletRequestWrapper( (HttpServletRequest) request) { + @Override + public long getDateHeader(String name){ + if(name.equals(HttpHeader.IF_MODIFIED_SINCE.toString() )){ + Date now = new Date(); + return now.getTime(); + }else { + return super.getDateHeader(name); + } + } + + @Override + public String getHeader(String name) { + if(name!=null && name.equals(ORIGIN_HEADER) && (super.getHeader(ORIGIN_HEADER)==null || super.getHeader(ORIGIN_HEADER).equals("null")) ){ + return "*"; + }else + return super.getHeader(name); + } + }, response + ); + + + + ((HttpServletResponse) response).setHeader("Access-Control-Allow-Origin" , "*"); + ((HttpServletResponse) response).setHeader("Access-Control-Allow-Methods" , "GET, POST, PATCH, PUT, DELETE, OPTIONS"); + ((HttpServletResponse) response).setHeader("Access-Control-Allow-Headers" , "Origin, Content-Type, X-Auth-Token"); + + logger.debug( "Added Acces control origin to " + ( ( HttpServletRequest)request).getRequestURI() ); } @Override - public String toString() { - return label; + public void destroy() { + } } From 3fadbeecdca4a3363298b6b1d910c0c465cd0281 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:44 +0100 Subject: [PATCH 0074/1620] New translations LoadProjectFileServlet.java (French) --- .../earth/app/view/Messages_fr.properties | 104 ++++++++++-------- 1 file changed, 61 insertions(+), 43 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index f5ef63f5c6..93a4d09fe6 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,61 +1,79 @@ -package org.openforis.collect.earth.app.model; +package org.openforis.collect.earth.app.server; + +import java.io.File; +import java.io.IOException; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.swing.SwingUtilities; import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.view.Messages; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.EarthProjectsService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; /** - * Enumeration of the dynamics that Collect Earth can use to classify the plots. - * + * Servlet to load a project file when Collect Earth is already running: + * + * If the user double-clicks on a project file, Collect Earth will first check + * if there is already another instance running, if it is, then send a HTTP + * request and quit. This servlet will receive the HTTP request and load the + * project. + * * @author Alfonso Sanchez-Paus Diaz - * + * */ -public enum DynamicsCode { - FROM_FOREST(Messages.getString("DynamicsCode.0"), 1), FROM_GRASSLAND(Messages.getString("DynamicsCode.1"), 3), FROM_SETTLEMENT(Messages.getString("DynamicsCode.2"), 4), FROM_OTHERLAND(Messages.getString("DynamicsCode.3"), 5), FROM_WETLAND(Messages.getString("DynamicsCode.4"), 6), FROM_CROPLAND(Messages.getString("DynamicsCode.5"), 7), NA("NA", 8); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ +@Controller +public class LoadProjectFileServlet { - private String label; + public static final String PROJECT_FILE_PARAMETER = "projectFilePath"; //$NON-NLS-1$ + public static final String SERVLET_NAME = "loadProjectFile"; //$NON-NLS-1$ + private Logger logger = LoggerFactory.getLogger(LoadProjectFileServlet.class); - private int id; + @Autowired + EarthProjectsService earthProjectsService; - private DynamicsCode(String label, int id) { - this.label = label; - this.id = id; - } + @Autowired + LocalPropertiesService localPropertiesService; - public int getId() { - return id; - } + @GetMapping("/" + SERVLET_NAME) + public void processRequest(HttpServletRequest request, HttpServletResponse response) { + String projectFilePath = request.getParameter(PROJECT_FILE_PARAMETER); + if (StringUtils.isBlank(projectFilePath)) { + logger.error("The " + PROJECT_FILE_PARAMETER + " parameter cannot be empty"); //$NON-NLS-1$ //$NON-NLS-2$ + } else { - public String getLabel() { - return label; - } + SwingUtilities.invokeLater(() -> { + File projectZipFile = new File(projectFilePath); + try { + if (earthProjectsService.loadCompressedProjectFile(projectZipFile)) { + localPropertiesService.nullifyChecksumValues(); + // Re-generate KMZ + new Thread( + "Restarting server after double-clicking on CEP file : " + projectZipFile.getName()) { + @Override + public void run() { + EarthApp.restart(); + } - public void setId(int id) { - this.id = id; - } + }.start(); + } - @Override - public String toString() { - return label; - } + } catch (IllegalArgumentException | IOException e) { + logger.error("Error loading the project file " + projectFilePath, e); //$NON-NLS-1$ + response.setStatus(500); + } + }); + + response.setStatus(200); - public static Integer getDynamicsCode(String landUseSubcategory) { - if( landUseSubcategory.startsWith("FLto") ){ //$NON-NLS-1$ - return FROM_FOREST.getId(); - }else if( landUseSubcategory.startsWith("CLto") ){ //$NON-NLS-1$ - return FROM_CROPLAND.getId(); - }else if( landUseSubcategory.startsWith("SLto") ){ //$NON-NLS-1$ - return FROM_SETTLEMENT.getId(); - }else if( landUseSubcategory.startsWith("WLto") ){ //$NON-NLS-1$ - return FROM_WETLAND.getId(); - }else if( landUseSubcategory.startsWith("GLto") ){ //$NON-NLS-1$ - return FROM_GRASSLAND.getId(); - }else if( landUseSubcategory.startsWith("OLto") || landUseSubcategory.startsWith("OTto")){ //$NON-NLS-1$ //$NON-NLS-2$ - return FROM_OTHERLAND.getId(); - }else if ( StringUtils.isBlank( landUseSubcategory )) { - throw new IllegalArgumentException("The land use subcategory " + landUseSubcategory + " is not recognizable."); //$NON-NLS-1$ //$NON-NLS-2$ - }else{ - return NA.getId(); } + } } From 7c3ffb0370d897c3c829260e4540c12d8f8d132e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:45 +0100 Subject: [PATCH 0075/1620] New translations LoadProjectFileServlet.java (Spanish) --- .../earth/app/view/Messages_es.properties | 125 +++++++++--------- 1 file changed, 66 insertions(+), 59 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index c5752cae99..93a4d09fe6 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,71 +1,78 @@ package org.openforis.collect.earth.app.server; +import java.io.File; import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Locale; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; +import javax.swing.SwingUtilities; -import org.eclipse.jetty.http.HttpHeader; -import org.openforis.collect.earth.app.EarthConstants; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.EarthProjectsService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - -public class GoogleEarthHeaderFilter implements Filter{ - - final SimpleDateFormat dateFormat = new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH ); - Logger logger = LoggerFactory.getLogger(GoogleEarthHeaderFilter.class ); - static final String ORIGIN_HEADER = "Origin"; - - @Override - public void init(FilterConfig filterConfig) throws ServletException { - } - - @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) - throws IOException, ServletException { - - chain.doFilter(new HttpServletRequestWrapper( (HttpServletRequest) request) { - @Override - public long getDateHeader(String name){ - if(name.equals(HttpHeader.IF_MODIFIED_SINCE.toString() )){ - Date now = new Date(); - return now.getTime(); - }else { - return super.getDateHeader(name); - } - } - - @Override - public String getHeader(String name) { - if(name!=null && name.equals(ORIGIN_HEADER) && (super.getHeader(ORIGIN_HEADER)==null || super.getHeader(ORIGIN_HEADER).equals("null")) ){ - return "*"; - }else - return super.getHeader(name); - } - }, response - ); - - - - ((HttpServletResponse) response).setHeader("Access-Control-Allow-Origin" , "*"); - ((HttpServletResponse) response).setHeader("Access-Control-Allow-Methods" , "GET, POST, PATCH, PUT, DELETE, OPTIONS"); - ((HttpServletResponse) response).setHeader("Access-Control-Allow-Headers" , "Origin, Content-Type, X-Auth-Token"); - - logger.debug( "Added Acces control origin to " + ( ( HttpServletRequest)request).getRequestURI() ); - } - - @Override - public void destroy() { +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +/** + * Servlet to load a project file when Collect Earth is already running: + * + * If the user double-clicks on a project file, Collect Earth will first check + * if there is already another instance running, if it is, then send a HTTP + * request and quit. This servlet will receive the HTTP request and load the + * project. + * + * @author Alfonso Sanchez-Paus Diaz + * + */ +@Controller +public class LoadProjectFileServlet { + + public static final String PROJECT_FILE_PARAMETER = "projectFilePath"; //$NON-NLS-1$ + public static final String SERVLET_NAME = "loadProjectFile"; //$NON-NLS-1$ + private Logger logger = LoggerFactory.getLogger(LoadProjectFileServlet.class); + + @Autowired + EarthProjectsService earthProjectsService; + + @Autowired + LocalPropertiesService localPropertiesService; + + @GetMapping("/" + SERVLET_NAME) + public void processRequest(HttpServletRequest request, HttpServletResponse response) { + String projectFilePath = request.getParameter(PROJECT_FILE_PARAMETER); + if (StringUtils.isBlank(projectFilePath)) { + logger.error("The " + PROJECT_FILE_PARAMETER + " parameter cannot be empty"); //$NON-NLS-1$ //$NON-NLS-2$ + } else { + + SwingUtilities.invokeLater(() -> { + File projectZipFile = new File(projectFilePath); + try { + if (earthProjectsService.loadCompressedProjectFile(projectZipFile)) { + localPropertiesService.nullifyChecksumValues(); + // Re-generate KMZ + new Thread( + "Restarting server after double-clicking on CEP file : " + projectZipFile.getName()) { + @Override + public void run() { + EarthApp.restart(); + } + + }.start(); + } + + } catch (IllegalArgumentException | IOException e) { + logger.error("Error loading the project file " + projectFilePath, e); //$NON-NLS-1$ + response.setStatus(500); + } + }); + + response.setStatus(200); + + } } From 674607761654442815bb9c0a03ac6b7b6d79d63f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:46 +0100 Subject: [PATCH 0076/1620] New translations LoadProjectFileServlet.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 125 +++++++++--------- 1 file changed, 66 insertions(+), 59 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index c5752cae99..93a4d09fe6 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,71 +1,78 @@ package org.openforis.collect.earth.app.server; +import java.io.File; import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Locale; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; +import javax.swing.SwingUtilities; -import org.eclipse.jetty.http.HttpHeader; -import org.openforis.collect.earth.app.EarthConstants; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.EarthProjectsService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - -public class GoogleEarthHeaderFilter implements Filter{ - - final SimpleDateFormat dateFormat = new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH ); - Logger logger = LoggerFactory.getLogger(GoogleEarthHeaderFilter.class ); - static final String ORIGIN_HEADER = "Origin"; - - @Override - public void init(FilterConfig filterConfig) throws ServletException { - } - - @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) - throws IOException, ServletException { - - chain.doFilter(new HttpServletRequestWrapper( (HttpServletRequest) request) { - @Override - public long getDateHeader(String name){ - if(name.equals(HttpHeader.IF_MODIFIED_SINCE.toString() )){ - Date now = new Date(); - return now.getTime(); - }else { - return super.getDateHeader(name); - } - } - - @Override - public String getHeader(String name) { - if(name!=null && name.equals(ORIGIN_HEADER) && (super.getHeader(ORIGIN_HEADER)==null || super.getHeader(ORIGIN_HEADER).equals("null")) ){ - return "*"; - }else - return super.getHeader(name); - } - }, response - ); - - - - ((HttpServletResponse) response).setHeader("Access-Control-Allow-Origin" , "*"); - ((HttpServletResponse) response).setHeader("Access-Control-Allow-Methods" , "GET, POST, PATCH, PUT, DELETE, OPTIONS"); - ((HttpServletResponse) response).setHeader("Access-Control-Allow-Headers" , "Origin, Content-Type, X-Auth-Token"); - - logger.debug( "Added Acces control origin to " + ( ( HttpServletRequest)request).getRequestURI() ); - } - - @Override - public void destroy() { +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +/** + * Servlet to load a project file when Collect Earth is already running: + * + * If the user double-clicks on a project file, Collect Earth will first check + * if there is already another instance running, if it is, then send a HTTP + * request and quit. This servlet will receive the HTTP request and load the + * project. + * + * @author Alfonso Sanchez-Paus Diaz + * + */ +@Controller +public class LoadProjectFileServlet { + + public static final String PROJECT_FILE_PARAMETER = "projectFilePath"; //$NON-NLS-1$ + public static final String SERVLET_NAME = "loadProjectFile"; //$NON-NLS-1$ + private Logger logger = LoggerFactory.getLogger(LoadProjectFileServlet.class); + + @Autowired + EarthProjectsService earthProjectsService; + + @Autowired + LocalPropertiesService localPropertiesService; + + @GetMapping("/" + SERVLET_NAME) + public void processRequest(HttpServletRequest request, HttpServletResponse response) { + String projectFilePath = request.getParameter(PROJECT_FILE_PARAMETER); + if (StringUtils.isBlank(projectFilePath)) { + logger.error("The " + PROJECT_FILE_PARAMETER + " parameter cannot be empty"); //$NON-NLS-1$ //$NON-NLS-2$ + } else { + + SwingUtilities.invokeLater(() -> { + File projectZipFile = new File(projectFilePath); + try { + if (earthProjectsService.loadCompressedProjectFile(projectZipFile)) { + localPropertiesService.nullifyChecksumValues(); + // Re-generate KMZ + new Thread( + "Restarting server after double-clicking on CEP file : " + projectZipFile.getName()) { + @Override + public void run() { + EarthApp.restart(); + } + + }.start(); + } + + } catch (IllegalArgumentException | IOException e) { + logger.error("Error loading the project file " + projectFilePath, e); //$NON-NLS-1$ + response.setStatus(500); + } + }); + + response.setStatus(200); + + } } From e20548028ebc02b38e445f6598b126a9d8183992 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:47 +0100 Subject: [PATCH 0077/1620] New translations LoadProjectFileServlet.java (English) --- .../earth/app/view/Messages_en.properties | 125 +++++++++--------- 1 file changed, 66 insertions(+), 59 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index c5752cae99..93a4d09fe6 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,71 +1,78 @@ package org.openforis.collect.earth.app.server; +import java.io.File; import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Locale; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; +import javax.swing.SwingUtilities; -import org.eclipse.jetty.http.HttpHeader; -import org.openforis.collect.earth.app.EarthConstants; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.EarthProjectsService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - -public class GoogleEarthHeaderFilter implements Filter{ - - final SimpleDateFormat dateFormat = new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH ); - Logger logger = LoggerFactory.getLogger(GoogleEarthHeaderFilter.class ); - static final String ORIGIN_HEADER = "Origin"; - - @Override - public void init(FilterConfig filterConfig) throws ServletException { - } - - @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) - throws IOException, ServletException { - - chain.doFilter(new HttpServletRequestWrapper( (HttpServletRequest) request) { - @Override - public long getDateHeader(String name){ - if(name.equals(HttpHeader.IF_MODIFIED_SINCE.toString() )){ - Date now = new Date(); - return now.getTime(); - }else { - return super.getDateHeader(name); - } - } - - @Override - public String getHeader(String name) { - if(name!=null && name.equals(ORIGIN_HEADER) && (super.getHeader(ORIGIN_HEADER)==null || super.getHeader(ORIGIN_HEADER).equals("null")) ){ - return "*"; - }else - return super.getHeader(name); - } - }, response - ); - - - - ((HttpServletResponse) response).setHeader("Access-Control-Allow-Origin" , "*"); - ((HttpServletResponse) response).setHeader("Access-Control-Allow-Methods" , "GET, POST, PATCH, PUT, DELETE, OPTIONS"); - ((HttpServletResponse) response).setHeader("Access-Control-Allow-Headers" , "Origin, Content-Type, X-Auth-Token"); - - logger.debug( "Added Acces control origin to " + ( ( HttpServletRequest)request).getRequestURI() ); - } - - @Override - public void destroy() { +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +/** + * Servlet to load a project file when Collect Earth is already running: + * + * If the user double-clicks on a project file, Collect Earth will first check + * if there is already another instance running, if it is, then send a HTTP + * request and quit. This servlet will receive the HTTP request and load the + * project. + * + * @author Alfonso Sanchez-Paus Diaz + * + */ +@Controller +public class LoadProjectFileServlet { + + public static final String PROJECT_FILE_PARAMETER = "projectFilePath"; //$NON-NLS-1$ + public static final String SERVLET_NAME = "loadProjectFile"; //$NON-NLS-1$ + private Logger logger = LoggerFactory.getLogger(LoadProjectFileServlet.class); + + @Autowired + EarthProjectsService earthProjectsService; + + @Autowired + LocalPropertiesService localPropertiesService; + + @GetMapping("/" + SERVLET_NAME) + public void processRequest(HttpServletRequest request, HttpServletResponse response) { + String projectFilePath = request.getParameter(PROJECT_FILE_PARAMETER); + if (StringUtils.isBlank(projectFilePath)) { + logger.error("The " + PROJECT_FILE_PARAMETER + " parameter cannot be empty"); //$NON-NLS-1$ //$NON-NLS-2$ + } else { + + SwingUtilities.invokeLater(() -> { + File projectZipFile = new File(projectFilePath); + try { + if (earthProjectsService.loadCompressedProjectFile(projectZipFile)) { + localPropertiesService.nullifyChecksumValues(); + // Re-generate KMZ + new Thread( + "Restarting server after double-clicking on CEP file : " + projectZipFile.getName()) { + @Override + public void run() { + EarthApp.restart(); + } + + }.start(); + } + + } catch (IllegalArgumentException | IOException e) { + logger.error("Error loading the project file " + projectFilePath, e); //$NON-NLS-1$ + response.setStatus(500); + } + }); + + response.setStatus(200); + + } } From 4ec16f67004c440690e3cd770ec60e4d3a1f55df Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:49 +0100 Subject: [PATCH 0078/1620] New translations PlacemarkBrowserServlet.java (French) --- .../earth/app/view/Messages_fr.properties | 366 ++++++++++++++++-- 1 file changed, 324 insertions(+), 42 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 93a4d09fe6..de96e18020 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,78 +1,360 @@ package org.openforis.collect.earth.app.server; -import java.io.File; -import java.io.IOException; +import java.util.List; +import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import javax.swing.SwingUtilities; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.EarthProjectsService; +import org.openforis.collect.earth.app.service.BrowserService; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.KmlGeneratorService; import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; +import org.openforis.collect.earth.sampler.processor.KmlGenerator; +import org.openforis.collect.earth.sampler.utils.KmlGenerationException; +import org.openforis.idm.metamodel.AttributeDefinition; +import org.opengis.referencing.operation.TransformException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import com.opencsv.CSVReader; /** - * Servlet to load a project file when Collect Earth is already running: - * - * If the user double-clicks on a project file, Collect Earth will first check - * if there is already another instance running, if it is, then send a HTTP - * request and quit. This servlet will receive the HTTP request and load the - * project. + * Servlet to return the information that is stored in Collect Earth for one + * placemark (plot) * * @author Alfonso Sanchez-Paus Diaz * */ @Controller -public class LoadProjectFileServlet { +public class PlacemarkBrowserServlet { + @Autowired + private BrowserService browserService; - public static final String PROJECT_FILE_PARAMETER = "projectFilePath"; //$NON-NLS-1$ - public static final String SERVLET_NAME = "loadProjectFile"; //$NON-NLS-1$ - private Logger logger = LoggerFactory.getLogger(LoadProjectFileServlet.class); + @Autowired + private EarthSurveyService earthSurveyService; @Autowired - EarthProjectsService earthProjectsService; + private LocalPropertiesService localPropertiesService; @Autowired - LocalPropertiesService localPropertiesService; + private KmlGeneratorService kmlGeneratorService; + + private KmlGenerator kmlGenerator; + + private SimplePlacemarkObject lastPlacemark = null; + + private final Logger logger = LoggerFactory.getLogger( PlacemarkBrowserServlet.class ); - @GetMapping("/" + SERVLET_NAME) - public void processRequest(HttpServletRequest request, HttpServletResponse response) { - String projectFilePath = request.getParameter(PROJECT_FILE_PARAMETER); - if (StringUtils.isBlank(projectFilePath)) { - logger.error("The " + PROJECT_FILE_PARAMETER + " parameter cannot be empty"); //$NON-NLS-1$ //$NON-NLS-2$ - } else { + private final class OpenBrowserThread extends Thread { + + private SimplePlacemarkObject placemarkObject; + + private OpenBrowserThread(String name, SimplePlacemarkObject placemarkObject) { + super(name); + this.placemarkObject = placemarkObject; + } + + @Override + public void run() { + // If this is the first plot or the plot is the last one that + // was opened + if (lastPlacemark == null + || !lastPlacemark.equals( placemarkObject ) ) { - SwingUtilities.invokeLater(() -> { - File projectZipFile = new File(projectFilePath); try { - if (earthProjectsService.loadCompressedProjectFile(projectZipFile)) { - localPropertiesService.nullifyChecksumValues(); - // Re-generate KMZ - new Thread( - "Restarting server after double-clicking on CEP file : " + projectZipFile.getName()) { - @Override - public void run() { - EarthApp.restart(); - } - - }.start(); + kmlGenerator.fillSamplePoints(placemarkObject); + + kmlGenerator.fillExternalLine(placemarkObject); + + openGEEAppWindow(placemarkObject); + + openGEECodeEditorWindow(placemarkObject); + + openEarthMapWindow( placemarkObject ); + + openTimeLapseWindow(placemarkObject); + + openBingMapsWindow(placemarkObject); + + openBaiduMapsWindow(placemarkObject); + + openYandexMapsWindow(placemarkObject); + + openExtraMapWindow(placemarkObject); + + openStreetViewWindow(placemarkObject); + + openPlanetMapsWindow(placemarkObject); + + openSecureWatchWindow(placemarkObject); + + } catch (TransformException|KmlGenerationException e) { + logger.error("Error generating polygon", e ); + } + } + + lastPlacemark = placemarkObject; + + } + + + public void openEarthMapWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Earth Map window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openEarthMapURL(placemarkObject); + } catch (final Exception e) { + logger.error("Exception opening Earth Map window", e); //$NON-NLS-1$ + } + } + }.start(); + } + + public void openGEECodeEditorWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open GEE Playground window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openGEECodeEditor(placemarkObject); + } catch (final Exception e) { + logger.error("Exception opening Earth Engine Playground window", e); //$NON-NLS-1$ + } + } + }.start(); + } + + public void openGEEAppWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open GEE APP window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openGEEAppURL(placemarkObject); + } catch (final Exception e) { + logger.error("Exception opening Earth Engine APP window", e); //$NON-NLS-1$ } + } + }.start(); + } - } catch (IllegalArgumentException | IOException e) { - logger.error("Error loading the project file " + projectFilePath, e); //$NON-NLS-1$ - response.setStatus(500); + public void openBingMapsWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Bing Maps window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openBingMaps(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Bing Maps window", e); //$NON-NLS-1$ + } + } + }.start(); + } + + + public void openPlanetMapsWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Planet Maps window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openPlanetMaps(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Planet Maps window", e); //$NON-NLS-1$ + } + } + }.start(); + } + + public void openSecureWatchWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open SecureWatch window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openSecureWatch(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening SecureWatch window", e); //$NON-NLS-1$ + } + } + }.start(); + } + + public void openBaiduMapsWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Baidu Maps window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openBaiduMaps(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Baidu Maps window", e); //$NON-NLS-1$ + + } } - }); - response.setStatus(200); + }.start(); + } + + public void openYandexMapsWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Yandex Maps window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openYandexMaps(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Yandex Maps window", e); //$NON-NLS-1$ + + } + } + + }.start(); + } + + public void openExtraMapWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Expa Map window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openExtraMap(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Extra Map window", e); //$NON-NLS-1$ + + } + } + + }.start(); + } + + public void openStreetViewWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Street View window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openStreetView(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Street View window", e); //$NON-NLS-1$ + + } + } + + }.start(); + } + + public void openTimeLapseWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open TimeLapse window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openTimelapse(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Earth Engine window", e); //$NON-NLS-1$ + + } + } + + }.start(); + } + + } + + + /* + * Opens the extra browser windows for Earth Engine, Timelapse and Bing. (non-Javadoc) + * + * @see + * org.openforis.collect.earth.app.server.JsonPocessorServlet#processRequest + * (javax.servlet.http.HttpServletRequest, + * javax.servlet.http.HttpServletResponse) + */ + @GetMapping(path = "/openAuxiliaryWindows") + public void openAuxiliaryWindows( + HttpServletResponse response, + @RequestParam(value = "latLongCoordinates", required = false) final String latLongCoordinates) + { + try { + SimplePlacemarkObject placemarkObject = new SimplePlacemarkObject(latLongCoordinates.split(",") ); + OpenBrowserThread browserThread = new OpenBrowserThread("Open auxiliary windows " + latLongCoordinates, placemarkObject); + browserThread.start(); + } catch (Exception e) { + logger.error("Error loading browsers " , e); + } + } + + @GetMapping(path = "/ancillaryWindows") + public void openAuxiliaryWindowsNew(HttpServletResponse response, HttpServletRequest request) { + + + List keyAttributeDefinitions = earthSurveyService + .getRootEntityDefinition() + .getKeyAttributeDefinitions(); + + // the keys should the the parameter names + Map keys = request.getParameterMap(); + + String[] keysInOrder = new String[keys.size()]; + for (int i = 0; i < keyAttributeDefinitions.size(); i++) { + keysInOrder[i] = keys.get(keyAttributeDefinitions.get(i).getName())[0]; + } + + try { + kmlGenerator = kmlGeneratorService.getKmlGenerator(); + + String[] csvValues = getValuesFromCsv(keysInOrder); + + if( csvValues == null ){ + throw new IllegalArgumentException("The keys " + keys.toString() + " are not present on the CSV file with the plot locations!!!"); + } + + SimplePlacemarkObject placemarkObject = kmlGenerator.getPlotObject(csvValues, null, earthSurveyService.getCollectSurvey() ); + OpenBrowserThread browserThread = new OpenBrowserThread("Open ancillary windows - polygon ", placemarkObject ); + browserThread.start(); + } catch (Exception e) { + logger.error("Error loading browsers " , e); + } + + } + + private String[] getValuesFromCsv(String[] keysInOrder) { + + final String csvFile = localPropertiesService.getCsvFile(); + try ( + CSVReader reader = CsvReaderUtils.getCsvReader( csvFile ); + ){ + + + String[] csvRow; + int numberOfKeys = keysInOrder.length; + while ((csvRow = reader.readNext()) != null) { + boolean foundIt = true; + for( int idx=0; idx Date: Tue, 29 Nov 2022 12:22:50 +0100 Subject: [PATCH 0079/1620] New translations PlacemarkBrowserServlet.java (Spanish) --- .../earth/app/view/Messages_es.properties | 366 ++++++++++++++++-- 1 file changed, 324 insertions(+), 42 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 93a4d09fe6..de96e18020 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,78 +1,360 @@ package org.openforis.collect.earth.app.server; -import java.io.File; -import java.io.IOException; +import java.util.List; +import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import javax.swing.SwingUtilities; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.EarthProjectsService; +import org.openforis.collect.earth.app.service.BrowserService; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.KmlGeneratorService; import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; +import org.openforis.collect.earth.sampler.processor.KmlGenerator; +import org.openforis.collect.earth.sampler.utils.KmlGenerationException; +import org.openforis.idm.metamodel.AttributeDefinition; +import org.opengis.referencing.operation.TransformException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import com.opencsv.CSVReader; /** - * Servlet to load a project file when Collect Earth is already running: - * - * If the user double-clicks on a project file, Collect Earth will first check - * if there is already another instance running, if it is, then send a HTTP - * request and quit. This servlet will receive the HTTP request and load the - * project. + * Servlet to return the information that is stored in Collect Earth for one + * placemark (plot) * * @author Alfonso Sanchez-Paus Diaz * */ @Controller -public class LoadProjectFileServlet { +public class PlacemarkBrowserServlet { + @Autowired + private BrowserService browserService; - public static final String PROJECT_FILE_PARAMETER = "projectFilePath"; //$NON-NLS-1$ - public static final String SERVLET_NAME = "loadProjectFile"; //$NON-NLS-1$ - private Logger logger = LoggerFactory.getLogger(LoadProjectFileServlet.class); + @Autowired + private EarthSurveyService earthSurveyService; @Autowired - EarthProjectsService earthProjectsService; + private LocalPropertiesService localPropertiesService; @Autowired - LocalPropertiesService localPropertiesService; + private KmlGeneratorService kmlGeneratorService; + + private KmlGenerator kmlGenerator; + + private SimplePlacemarkObject lastPlacemark = null; + + private final Logger logger = LoggerFactory.getLogger( PlacemarkBrowserServlet.class ); - @GetMapping("/" + SERVLET_NAME) - public void processRequest(HttpServletRequest request, HttpServletResponse response) { - String projectFilePath = request.getParameter(PROJECT_FILE_PARAMETER); - if (StringUtils.isBlank(projectFilePath)) { - logger.error("The " + PROJECT_FILE_PARAMETER + " parameter cannot be empty"); //$NON-NLS-1$ //$NON-NLS-2$ - } else { + private final class OpenBrowserThread extends Thread { + + private SimplePlacemarkObject placemarkObject; + + private OpenBrowserThread(String name, SimplePlacemarkObject placemarkObject) { + super(name); + this.placemarkObject = placemarkObject; + } + + @Override + public void run() { + // If this is the first plot or the plot is the last one that + // was opened + if (lastPlacemark == null + || !lastPlacemark.equals( placemarkObject ) ) { - SwingUtilities.invokeLater(() -> { - File projectZipFile = new File(projectFilePath); try { - if (earthProjectsService.loadCompressedProjectFile(projectZipFile)) { - localPropertiesService.nullifyChecksumValues(); - // Re-generate KMZ - new Thread( - "Restarting server after double-clicking on CEP file : " + projectZipFile.getName()) { - @Override - public void run() { - EarthApp.restart(); - } - - }.start(); + kmlGenerator.fillSamplePoints(placemarkObject); + + kmlGenerator.fillExternalLine(placemarkObject); + + openGEEAppWindow(placemarkObject); + + openGEECodeEditorWindow(placemarkObject); + + openEarthMapWindow( placemarkObject ); + + openTimeLapseWindow(placemarkObject); + + openBingMapsWindow(placemarkObject); + + openBaiduMapsWindow(placemarkObject); + + openYandexMapsWindow(placemarkObject); + + openExtraMapWindow(placemarkObject); + + openStreetViewWindow(placemarkObject); + + openPlanetMapsWindow(placemarkObject); + + openSecureWatchWindow(placemarkObject); + + } catch (TransformException|KmlGenerationException e) { + logger.error("Error generating polygon", e ); + } + } + + lastPlacemark = placemarkObject; + + } + + + public void openEarthMapWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Earth Map window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openEarthMapURL(placemarkObject); + } catch (final Exception e) { + logger.error("Exception opening Earth Map window", e); //$NON-NLS-1$ + } + } + }.start(); + } + + public void openGEECodeEditorWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open GEE Playground window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openGEECodeEditor(placemarkObject); + } catch (final Exception e) { + logger.error("Exception opening Earth Engine Playground window", e); //$NON-NLS-1$ + } + } + }.start(); + } + + public void openGEEAppWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open GEE APP window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openGEEAppURL(placemarkObject); + } catch (final Exception e) { + logger.error("Exception opening Earth Engine APP window", e); //$NON-NLS-1$ } + } + }.start(); + } - } catch (IllegalArgumentException | IOException e) { - logger.error("Error loading the project file " + projectFilePath, e); //$NON-NLS-1$ - response.setStatus(500); + public void openBingMapsWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Bing Maps window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openBingMaps(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Bing Maps window", e); //$NON-NLS-1$ + } + } + }.start(); + } + + + public void openPlanetMapsWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Planet Maps window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openPlanetMaps(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Planet Maps window", e); //$NON-NLS-1$ + } + } + }.start(); + } + + public void openSecureWatchWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open SecureWatch window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openSecureWatch(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening SecureWatch window", e); //$NON-NLS-1$ + } + } + }.start(); + } + + public void openBaiduMapsWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Baidu Maps window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openBaiduMaps(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Baidu Maps window", e); //$NON-NLS-1$ + + } } - }); - response.setStatus(200); + }.start(); + } + + public void openYandexMapsWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Yandex Maps window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openYandexMaps(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Yandex Maps window", e); //$NON-NLS-1$ + + } + } + + }.start(); + } + + public void openExtraMapWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Expa Map window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openExtraMap(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Extra Map window", e); //$NON-NLS-1$ + + } + } + + }.start(); + } + + public void openStreetViewWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Street View window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openStreetView(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Street View window", e); //$NON-NLS-1$ + + } + } + + }.start(); + } + + public void openTimeLapseWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open TimeLapse window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openTimelapse(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Earth Engine window", e); //$NON-NLS-1$ + + } + } + + }.start(); + } + + } + + + /* + * Opens the extra browser windows for Earth Engine, Timelapse and Bing. (non-Javadoc) + * + * @see + * org.openforis.collect.earth.app.server.JsonPocessorServlet#processRequest + * (javax.servlet.http.HttpServletRequest, + * javax.servlet.http.HttpServletResponse) + */ + @GetMapping(path = "/openAuxiliaryWindows") + public void openAuxiliaryWindows( + HttpServletResponse response, + @RequestParam(value = "latLongCoordinates", required = false) final String latLongCoordinates) + { + try { + SimplePlacemarkObject placemarkObject = new SimplePlacemarkObject(latLongCoordinates.split(",") ); + OpenBrowserThread browserThread = new OpenBrowserThread("Open auxiliary windows " + latLongCoordinates, placemarkObject); + browserThread.start(); + } catch (Exception e) { + logger.error("Error loading browsers " , e); + } + } + + @GetMapping(path = "/ancillaryWindows") + public void openAuxiliaryWindowsNew(HttpServletResponse response, HttpServletRequest request) { + + + List keyAttributeDefinitions = earthSurveyService + .getRootEntityDefinition() + .getKeyAttributeDefinitions(); + + // the keys should the the parameter names + Map keys = request.getParameterMap(); + + String[] keysInOrder = new String[keys.size()]; + for (int i = 0; i < keyAttributeDefinitions.size(); i++) { + keysInOrder[i] = keys.get(keyAttributeDefinitions.get(i).getName())[0]; + } + + try { + kmlGenerator = kmlGeneratorService.getKmlGenerator(); + + String[] csvValues = getValuesFromCsv(keysInOrder); + + if( csvValues == null ){ + throw new IllegalArgumentException("The keys " + keys.toString() + " are not present on the CSV file with the plot locations!!!"); + } + + SimplePlacemarkObject placemarkObject = kmlGenerator.getPlotObject(csvValues, null, earthSurveyService.getCollectSurvey() ); + OpenBrowserThread browserThread = new OpenBrowserThread("Open ancillary windows - polygon ", placemarkObject ); + browserThread.start(); + } catch (Exception e) { + logger.error("Error loading browsers " , e); + } + + } + + private String[] getValuesFromCsv(String[] keysInOrder) { + + final String csvFile = localPropertiesService.getCsvFile(); + try ( + CSVReader reader = CsvReaderUtils.getCsvReader( csvFile ); + ){ + + + String[] csvRow; + int numberOfKeys = keysInOrder.length; + while ((csvRow = reader.readNext()) != null) { + boolean foundIt = true; + for( int idx=0; idx Date: Tue, 29 Nov 2022 12:22:51 +0100 Subject: [PATCH 0080/1620] New translations PlacemarkBrowserServlet.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 366 ++++++++++++++++-- 1 file changed, 324 insertions(+), 42 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 93a4d09fe6..de96e18020 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,78 +1,360 @@ package org.openforis.collect.earth.app.server; -import java.io.File; -import java.io.IOException; +import java.util.List; +import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import javax.swing.SwingUtilities; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.EarthProjectsService; +import org.openforis.collect.earth.app.service.BrowserService; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.KmlGeneratorService; import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; +import org.openforis.collect.earth.sampler.processor.KmlGenerator; +import org.openforis.collect.earth.sampler.utils.KmlGenerationException; +import org.openforis.idm.metamodel.AttributeDefinition; +import org.opengis.referencing.operation.TransformException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import com.opencsv.CSVReader; /** - * Servlet to load a project file when Collect Earth is already running: - * - * If the user double-clicks on a project file, Collect Earth will first check - * if there is already another instance running, if it is, then send a HTTP - * request and quit. This servlet will receive the HTTP request and load the - * project. + * Servlet to return the information that is stored in Collect Earth for one + * placemark (plot) * * @author Alfonso Sanchez-Paus Diaz * */ @Controller -public class LoadProjectFileServlet { +public class PlacemarkBrowserServlet { + @Autowired + private BrowserService browserService; - public static final String PROJECT_FILE_PARAMETER = "projectFilePath"; //$NON-NLS-1$ - public static final String SERVLET_NAME = "loadProjectFile"; //$NON-NLS-1$ - private Logger logger = LoggerFactory.getLogger(LoadProjectFileServlet.class); + @Autowired + private EarthSurveyService earthSurveyService; @Autowired - EarthProjectsService earthProjectsService; + private LocalPropertiesService localPropertiesService; @Autowired - LocalPropertiesService localPropertiesService; + private KmlGeneratorService kmlGeneratorService; + + private KmlGenerator kmlGenerator; + + private SimplePlacemarkObject lastPlacemark = null; + + private final Logger logger = LoggerFactory.getLogger( PlacemarkBrowserServlet.class ); - @GetMapping("/" + SERVLET_NAME) - public void processRequest(HttpServletRequest request, HttpServletResponse response) { - String projectFilePath = request.getParameter(PROJECT_FILE_PARAMETER); - if (StringUtils.isBlank(projectFilePath)) { - logger.error("The " + PROJECT_FILE_PARAMETER + " parameter cannot be empty"); //$NON-NLS-1$ //$NON-NLS-2$ - } else { + private final class OpenBrowserThread extends Thread { + + private SimplePlacemarkObject placemarkObject; + + private OpenBrowserThread(String name, SimplePlacemarkObject placemarkObject) { + super(name); + this.placemarkObject = placemarkObject; + } + + @Override + public void run() { + // If this is the first plot or the plot is the last one that + // was opened + if (lastPlacemark == null + || !lastPlacemark.equals( placemarkObject ) ) { - SwingUtilities.invokeLater(() -> { - File projectZipFile = new File(projectFilePath); try { - if (earthProjectsService.loadCompressedProjectFile(projectZipFile)) { - localPropertiesService.nullifyChecksumValues(); - // Re-generate KMZ - new Thread( - "Restarting server after double-clicking on CEP file : " + projectZipFile.getName()) { - @Override - public void run() { - EarthApp.restart(); - } - - }.start(); + kmlGenerator.fillSamplePoints(placemarkObject); + + kmlGenerator.fillExternalLine(placemarkObject); + + openGEEAppWindow(placemarkObject); + + openGEECodeEditorWindow(placemarkObject); + + openEarthMapWindow( placemarkObject ); + + openTimeLapseWindow(placemarkObject); + + openBingMapsWindow(placemarkObject); + + openBaiduMapsWindow(placemarkObject); + + openYandexMapsWindow(placemarkObject); + + openExtraMapWindow(placemarkObject); + + openStreetViewWindow(placemarkObject); + + openPlanetMapsWindow(placemarkObject); + + openSecureWatchWindow(placemarkObject); + + } catch (TransformException|KmlGenerationException e) { + logger.error("Error generating polygon", e ); + } + } + + lastPlacemark = placemarkObject; + + } + + + public void openEarthMapWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Earth Map window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openEarthMapURL(placemarkObject); + } catch (final Exception e) { + logger.error("Exception opening Earth Map window", e); //$NON-NLS-1$ + } + } + }.start(); + } + + public void openGEECodeEditorWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open GEE Playground window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openGEECodeEditor(placemarkObject); + } catch (final Exception e) { + logger.error("Exception opening Earth Engine Playground window", e); //$NON-NLS-1$ + } + } + }.start(); + } + + public void openGEEAppWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open GEE APP window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openGEEAppURL(placemarkObject); + } catch (final Exception e) { + logger.error("Exception opening Earth Engine APP window", e); //$NON-NLS-1$ } + } + }.start(); + } - } catch (IllegalArgumentException | IOException e) { - logger.error("Error loading the project file " + projectFilePath, e); //$NON-NLS-1$ - response.setStatus(500); + public void openBingMapsWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Bing Maps window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openBingMaps(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Bing Maps window", e); //$NON-NLS-1$ + } + } + }.start(); + } + + + public void openPlanetMapsWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Planet Maps window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openPlanetMaps(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Planet Maps window", e); //$NON-NLS-1$ + } + } + }.start(); + } + + public void openSecureWatchWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open SecureWatch window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openSecureWatch(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening SecureWatch window", e); //$NON-NLS-1$ + } + } + }.start(); + } + + public void openBaiduMapsWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Baidu Maps window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openBaiduMaps(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Baidu Maps window", e); //$NON-NLS-1$ + + } } - }); - response.setStatus(200); + }.start(); + } + + public void openYandexMapsWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Yandex Maps window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openYandexMaps(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Yandex Maps window", e); //$NON-NLS-1$ + + } + } + + }.start(); + } + + public void openExtraMapWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Expa Map window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openExtraMap(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Extra Map window", e); //$NON-NLS-1$ + + } + } + + }.start(); + } + + public void openStreetViewWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Street View window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openStreetView(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Street View window", e); //$NON-NLS-1$ + + } + } + + }.start(); + } + + public void openTimeLapseWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open TimeLapse window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openTimelapse(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Earth Engine window", e); //$NON-NLS-1$ + + } + } + + }.start(); + } + + } + + + /* + * Opens the extra browser windows for Earth Engine, Timelapse and Bing. (non-Javadoc) + * + * @see + * org.openforis.collect.earth.app.server.JsonPocessorServlet#processRequest + * (javax.servlet.http.HttpServletRequest, + * javax.servlet.http.HttpServletResponse) + */ + @GetMapping(path = "/openAuxiliaryWindows") + public void openAuxiliaryWindows( + HttpServletResponse response, + @RequestParam(value = "latLongCoordinates", required = false) final String latLongCoordinates) + { + try { + SimplePlacemarkObject placemarkObject = new SimplePlacemarkObject(latLongCoordinates.split(",") ); + OpenBrowserThread browserThread = new OpenBrowserThread("Open auxiliary windows " + latLongCoordinates, placemarkObject); + browserThread.start(); + } catch (Exception e) { + logger.error("Error loading browsers " , e); + } + } + + @GetMapping(path = "/ancillaryWindows") + public void openAuxiliaryWindowsNew(HttpServletResponse response, HttpServletRequest request) { + + + List keyAttributeDefinitions = earthSurveyService + .getRootEntityDefinition() + .getKeyAttributeDefinitions(); + + // the keys should the the parameter names + Map keys = request.getParameterMap(); + + String[] keysInOrder = new String[keys.size()]; + for (int i = 0; i < keyAttributeDefinitions.size(); i++) { + keysInOrder[i] = keys.get(keyAttributeDefinitions.get(i).getName())[0]; + } + + try { + kmlGenerator = kmlGeneratorService.getKmlGenerator(); + + String[] csvValues = getValuesFromCsv(keysInOrder); + + if( csvValues == null ){ + throw new IllegalArgumentException("The keys " + keys.toString() + " are not present on the CSV file with the plot locations!!!"); + } + + SimplePlacemarkObject placemarkObject = kmlGenerator.getPlotObject(csvValues, null, earthSurveyService.getCollectSurvey() ); + OpenBrowserThread browserThread = new OpenBrowserThread("Open ancillary windows - polygon ", placemarkObject ); + browserThread.start(); + } catch (Exception e) { + logger.error("Error loading browsers " , e); + } + + } + + private String[] getValuesFromCsv(String[] keysInOrder) { + + final String csvFile = localPropertiesService.getCsvFile(); + try ( + CSVReader reader = CsvReaderUtils.getCsvReader( csvFile ); + ){ + + + String[] csvRow; + int numberOfKeys = keysInOrder.length; + while ((csvRow = reader.readNext()) != null) { + boolean foundIt = true; + for( int idx=0; idx Date: Tue, 29 Nov 2022 12:22:52 +0100 Subject: [PATCH 0081/1620] New translations DynamicsCode.java (Spanish) --- .../earth/app/view/Messages_es.properties | 382 ++---------------- 1 file changed, 41 insertions(+), 341 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index de96e18020..f5ef63f5c6 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,361 +1,61 @@ -package org.openforis.collect.earth.app.server; +package org.openforis.collect.earth.app.model; -import java.util.List; -import java.util.Map; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.openforis.collect.earth.app.service.BrowserService; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.KmlGeneratorService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; -import org.openforis.collect.earth.sampler.processor.KmlGenerator; -import org.openforis.collect.earth.sampler.utils.KmlGenerationException; -import org.openforis.idm.metamodel.AttributeDefinition; -import org.opengis.referencing.operation.TransformException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; - -import com.opencsv.CSVReader; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.view.Messages; /** - * Servlet to return the information that is stored in Collect Earth for one - * placemark (plot) - * + * Enumeration of the dynamics that Collect Earth can use to classify the plots. + * * @author Alfonso Sanchez-Paus Diaz - * + * */ -@Controller -public class PlacemarkBrowserServlet { - @Autowired - private BrowserService browserService; - - @Autowired - private EarthSurveyService earthSurveyService; - - @Autowired - private LocalPropertiesService localPropertiesService; - - @Autowired - private KmlGeneratorService kmlGeneratorService; - - private KmlGenerator kmlGenerator; - - private SimplePlacemarkObject lastPlacemark = null; - - private final Logger logger = LoggerFactory.getLogger( PlacemarkBrowserServlet.class ); - - private final class OpenBrowserThread extends Thread { - - private SimplePlacemarkObject placemarkObject; - - private OpenBrowserThread(String name, SimplePlacemarkObject placemarkObject) { - super(name); - this.placemarkObject = placemarkObject; - } - - @Override - public void run() { - // If this is the first plot or the plot is the last one that - // was opened - if (lastPlacemark == null - || !lastPlacemark.equals( placemarkObject ) ) { - - try { - kmlGenerator.fillSamplePoints(placemarkObject); - - kmlGenerator.fillExternalLine(placemarkObject); - - openGEEAppWindow(placemarkObject); - - openGEECodeEditorWindow(placemarkObject); - - openEarthMapWindow( placemarkObject ); - - openTimeLapseWindow(placemarkObject); - - openBingMapsWindow(placemarkObject); - - openBaiduMapsWindow(placemarkObject); - - openYandexMapsWindow(placemarkObject); - - openExtraMapWindow(placemarkObject); - - openStreetViewWindow(placemarkObject); - - openPlanetMapsWindow(placemarkObject); - - openSecureWatchWindow(placemarkObject); - - } catch (TransformException|KmlGenerationException e) { - logger.error("Error generating polygon", e ); - } - } - - lastPlacemark = placemarkObject; - - } - - - public void openEarthMapWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Earth Map window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openEarthMapURL(placemarkObject); - } catch (final Exception e) { - logger.error("Exception opening Earth Map window", e); //$NON-NLS-1$ - } - } - }.start(); - } - - public void openGEECodeEditorWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open GEE Playground window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openGEECodeEditor(placemarkObject); - } catch (final Exception e) { - logger.error("Exception opening Earth Engine Playground window", e); //$NON-NLS-1$ - } - } - }.start(); - } - - public void openGEEAppWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open GEE APP window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openGEEAppURL(placemarkObject); - } catch (final Exception e) { - logger.error("Exception opening Earth Engine APP window", e); //$NON-NLS-1$ - } - } - }.start(); - } - - public void openBingMapsWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Bing Maps window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openBingMaps(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Bing Maps window", e); //$NON-NLS-1$ - } - } - }.start(); - } - - - public void openPlanetMapsWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Planet Maps window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openPlanetMaps(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Planet Maps window", e); //$NON-NLS-1$ - } - } - }.start(); - } - - public void openSecureWatchWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open SecureWatch window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openSecureWatch(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening SecureWatch window", e); //$NON-NLS-1$ - } - } - }.start(); - } - - public void openBaiduMapsWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Baidu Maps window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openBaiduMaps(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Baidu Maps window", e); //$NON-NLS-1$ - - } - } - - }.start(); - } - - public void openYandexMapsWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Yandex Maps window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openYandexMaps(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Yandex Maps window", e); //$NON-NLS-1$ - - } - } - - }.start(); - } +public enum DynamicsCode { + FROM_FOREST(Messages.getString("DynamicsCode.0"), 1), FROM_GRASSLAND(Messages.getString("DynamicsCode.1"), 3), FROM_SETTLEMENT(Messages.getString("DynamicsCode.2"), 4), FROM_OTHERLAND(Messages.getString("DynamicsCode.3"), 5), FROM_WETLAND(Messages.getString("DynamicsCode.4"), 6), FROM_CROPLAND(Messages.getString("DynamicsCode.5"), 7), NA("NA", 8); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ - public void openExtraMapWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Expa Map window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openExtraMap(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Extra Map window", e); //$NON-NLS-1$ + private String label; - } - } - - }.start(); - } - - public void openStreetViewWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Street View window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openStreetView(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Street View window", e); //$NON-NLS-1$ - - } - } - - }.start(); - } - - public void openTimeLapseWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open TimeLapse window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openTimelapse(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Earth Engine window", e); //$NON-NLS-1$ - - } - } - - }.start(); - } + private int id; + private DynamicsCode(String label, int id) { + this.label = label; + this.id = id; } - - /* - * Opens the extra browser windows for Earth Engine, Timelapse and Bing. (non-Javadoc) - * - * @see - * org.openforis.collect.earth.app.server.JsonPocessorServlet#processRequest - * (javax.servlet.http.HttpServletRequest, - * javax.servlet.http.HttpServletResponse) - */ - @GetMapping(path = "/openAuxiliaryWindows") - public void openAuxiliaryWindows( - HttpServletResponse response, - @RequestParam(value = "latLongCoordinates", required = false) final String latLongCoordinates) - { - try { - SimplePlacemarkObject placemarkObject = new SimplePlacemarkObject(latLongCoordinates.split(",") ); - OpenBrowserThread browserThread = new OpenBrowserThread("Open auxiliary windows " + latLongCoordinates, placemarkObject); - browserThread.start(); - } catch (Exception e) { - logger.error("Error loading browsers " , e); - } + public int getId() { + return id; } - @GetMapping(path = "/ancillaryWindows") - public void openAuxiliaryWindowsNew(HttpServletResponse response, HttpServletRequest request) { - - - List keyAttributeDefinitions = earthSurveyService - .getRootEntityDefinition() - .getKeyAttributeDefinitions(); - - // the keys should the the parameter names - Map keys = request.getParameterMap(); - - String[] keysInOrder = new String[keys.size()]; - for (int i = 0; i < keyAttributeDefinitions.size(); i++) { - keysInOrder[i] = keys.get(keyAttributeDefinitions.get(i).getName())[0]; - } - - try { - kmlGenerator = kmlGeneratorService.getKmlGenerator(); - - String[] csvValues = getValuesFromCsv(keysInOrder); - - if( csvValues == null ){ - throw new IllegalArgumentException("The keys " + keys.toString() + " are not present on the CSV file with the plot locations!!!"); - } - - SimplePlacemarkObject placemarkObject = kmlGenerator.getPlotObject(csvValues, null, earthSurveyService.getCollectSurvey() ); - OpenBrowserThread browserThread = new OpenBrowserThread("Open ancillary windows - polygon ", placemarkObject ); - browserThread.start(); - } catch (Exception e) { - logger.error("Error loading browsers " , e); - } - + public String getLabel() { + return label; } - private String[] getValuesFromCsv(String[] keysInOrder) { - - final String csvFile = localPropertiesService.getCsvFile(); - try ( - CSVReader reader = CsvReaderUtils.getCsvReader( csvFile ); - ){ - - - String[] csvRow; - int numberOfKeys = keysInOrder.length; - while ((csvRow = reader.readNext()) != null) { - boolean foundIt = true; - for( int idx=0; idx Date: Tue, 29 Nov 2022 12:22:53 +0100 Subject: [PATCH 0082/1620] New translations AspectCode.java (English) --- .../earth/app/view/Messages_en.properties | 107 +++++++----------- 1 file changed, 43 insertions(+), 64 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 93a4d09fe6..dfaad035c3 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,79 +1,58 @@ -package org.openforis.collect.earth.app.server; +package org.openforis.collect.earth.app.model; -import java.io.File; -import java.io.IOException; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.EarthProjectsService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; +import org.openforis.collect.earth.app.view.Messages; /** - * Servlet to load a project file when Collect Earth is already running: - * - * If the user double-clicks on a project file, Collect Earth will first check - * if there is already another instance running, if it is, then send a HTTP - * request and quit. This servlet will receive the HTTP request and load the - * project. - * + * Enumeration of the aspects that Collect Earth can use to classify the plots. + * Each aspect has an ID attach to it and represents a 45 dregree range ( -22.5 to 22.5 for North, 22.5 to 67.5 to North East, 66.5 to 112.5 for East + * and so on) + * The enumeration also has an static method to calculate the + * * @author Alfonso Sanchez-Paus Diaz - * + * */ -@Controller -public class LoadProjectFileServlet { - - public static final String PROJECT_FILE_PARAMETER = "projectFilePath"; //$NON-NLS-1$ - public static final String SERVLET_NAME = "loadProjectFile"; //$NON-NLS-1$ - private Logger logger = LoggerFactory.getLogger(LoadProjectFileServlet.class); - - @Autowired - EarthProjectsService earthProjectsService; - - @Autowired - LocalPropertiesService localPropertiesService; +public enum AspectCode { + N(Messages.getString("AspectCode.0"), 1), NE(Messages.getString("AspectCode.1"), 2), E(Messages.getString("AspectCode.2"), 3), SE(Messages.getString("AspectCode.3"), 4), S(Messages.getString("AspectCode.4"), 5), SW(Messages.getString("AspectCode.5"), 6), W(Messages.getString("AspectCode.6"), 7), NW(Messages.getString("AspectCode.7"), 8), NA( "NA", 9); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ + /** + * Utility method to get the aspect code ( N, N-E ... ) from the aspect in degrees + * + * @param aspect + * The aspect in degrees + * @return The aspect code corresponding to the aspect in degrees. + */ + public static AspectCode getAspectCode(Double aspect) { + double aspectProc = aspect + 22.5d; // North starts at -22.5, so add 22.5 to normalize so north becomes 0-45 , north east 45-90 and so on.. + if (aspectProc >= 360d) { + aspectProc = aspectProc - 360d; + } + final int modulo = (int) Math.floor(aspectProc / 45d); + return AspectCode.values()[modulo]; + } - @GetMapping("/" + SERVLET_NAME) - public void processRequest(HttpServletRequest request, HttpServletResponse response) { - String projectFilePath = request.getParameter(PROJECT_FILE_PARAMETER); - if (StringUtils.isBlank(projectFilePath)) { - logger.error("The " + PROJECT_FILE_PARAMETER + " parameter cannot be empty"); //$NON-NLS-1$ //$NON-NLS-2$ - } else { + private String label; - SwingUtilities.invokeLater(() -> { - File projectZipFile = new File(projectFilePath); - try { - if (earthProjectsService.loadCompressedProjectFile(projectZipFile)) { - localPropertiesService.nullifyChecksumValues(); - // Re-generate KMZ - new Thread( - "Restarting server after double-clicking on CEP file : " + projectZipFile.getName()) { - @Override - public void run() { - EarthApp.restart(); - } + private int id; - }.start(); - } + private AspectCode(String label, int id) { + this.label = label; + this.id = id; + } - } catch (IllegalArgumentException | IOException e) { - logger.error("Error loading the project file " + projectFilePath, e); //$NON-NLS-1$ - response.setStatus(500); - } - }); + public int getId() { + return id; + } - response.setStatus(200); + public String getLabel() { + return label; + } - } + public void setId(int id) { + this.id = id; + } + @Override + public String toString() { + return label; } } From c1d5100a8a355c16443245a99dae9dfae51e96ce Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:54 +0100 Subject: [PATCH 0083/1620] New translations findMissingCountries.java (English) --- .../earth/app/view/Messages_en.properties | 1953 ++++++++++++++++- 1 file changed, 1895 insertions(+), 58 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index dfaad035c3..768f973a7f 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,58 +1,1895 @@ -package org.openforis.collect.earth.app.model; - -import org.openforis.collect.earth.app.view.Messages; - -/** - * Enumeration of the aspects that Collect Earth can use to classify the plots. - * Each aspect has an ID attach to it and represents a 45 dregree range ( -22.5 to 22.5 for North, 22.5 to 67.5 to North East, 66.5 to 112.5 for East - * and so on) - * The enumeration also has an static method to calculate the - * - * @author Alfonso Sanchez-Paus Diaz - * - */ -public enum AspectCode { - N(Messages.getString("AspectCode.0"), 1), NE(Messages.getString("AspectCode.1"), 2), E(Messages.getString("AspectCode.2"), 3), SE(Messages.getString("AspectCode.3"), 4), S(Messages.getString("AspectCode.4"), 5), SW(Messages.getString("AspectCode.5"), 6), W(Messages.getString("AspectCode.6"), 7), NW(Messages.getString("AspectCode.7"), 8), NA( "NA", 9); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ - /** - * Utility method to get the aspect code ( N, N-E ... ) from the aspect in degrees - * - * @param aspect - * The aspect in degrees - * @return The aspect code corresponding to the aspect in degrees. - */ - public static AspectCode getAspectCode(Double aspect) { - double aspectProc = aspect + 22.5d; // North starts at -22.5, so add 22.5 to normalize so north becomes 0-45 , north east 45-90 and so on.. - if (aspectProc >= 360d) { - aspectProc = aspectProc - 360d; - } - final int modulo = (int) Math.floor(aspectProc / 45d); - return AspectCode.values()[modulo]; - } - - private String label; - - private int id; - - private AspectCode(String label, int id) { - this.label = label; - this.id = id; - } - - public int getId() { - return id; - } - - public String getLabel() { - return label; - } - - public void setId(int id) { - this.id = id; - } - - @Override - public String toString() { - return label; - } - -} +package org.openforis.collect.earth.app.ad_hoc; + +import java.util.ArrayList; +import java.util.Arrays; + +public class findMissingCountries { + + private static ArrayList allCountryNames = new ArrayList<>( + Arrays.asList( + "Abyei", + "Afghanistan", + "Aksai_Chin", + "Albania", + "Algeria", + "American_Samoa", + "Andorra", + "Angola", + "Anguilla", + "Antarctica", + "Antigua_and_Barbuda", + "Argentina", + "Armenia", + "Aruba", + "Arunachal_Pradesh", + "Ashmore_and_Cartier_Islands", + "Australia", + "Austria", + "Azerbaijan", + "Azores_Islands", + "Bahamas", + "Bahrain", + "Baker_Island", + "Bangladesh", + "Barbados", + "Bassas_da_India", + "Belarus", + "Belgium", + "Belize", + "Benin", + "Bermuda", + "Bhutan", + "Bird_Island", + "Bolivia", + "Bosnia_and_Herzegovina", + "Botswana", + "Bouvet_Island", + "Brazil", + "British_Indian_Ocean_Territory", + "British_Virgin_Islands", + "Brunei_Darussalam", + "Bulgaria", + "Burkina_Faso", + "Burundi", + "Cambodia", + "Cameroon", + "Canada", + "Cape_Verde", + "Cayman_Islands", + "Central_African_Republic", + "Chad", + "Chile", + "China", + "China/India", + "Christmas_Island", + "Clipperton_Island", + "Cocos__Keeling__Islands", + "Colombia", + "Comoros", + "Congo", + "Cook_Islands", + "Costa_Rica", + "Croatia", + "Cuba", + "Cyprus", + "Czech_Republic", + "C�te_d_Ivoire", + "Dem_People_s_Rep_of_Korea", + "Democratic_Republic_of_the_Congo", + "Denmark", + "Djibouti", + "Dominica", + "Dominican_Republic", + "Ecuador", + "Egypt", + "El_Salvador", + "Equatorial_Guinea", + "Eritrea", + "Estonia", + "Ethiopia", + "Europa_Island", + "Falkland_Islands__Malvinas_", + "Faroe_Islands", + "Fiji", + "Finland", + "France", + "French_Guiana", + "French_Polynesia", + "French_Southern_and_Antarctic_Territories", + "Gabon", + "Gambia", + "Gaza_Strip", + "Georgia", + "Germany", + "Ghana", + "Gibraltar", + "Glorioso_Island", + "Greece", + "Greenland", + "Grenada", + "Guadeloupe", + "Guam", + "Guatemala", + "Guernsey", + "Guinea", + "Guinea-Bissau", + "Guyana", + "Haiti", + "Hala_ib_triangle", + "Heard_Island_and_McDonald_Islands", + "Holy_See", + "Honduras", + "Hong_Kong", + "Howland_Island", + "Hungary", + "Iceland", + "Ilemi_triangle", + "India", + "Indonesia", + "Iran___Islamic_Republic_of_", + "Iraq", + "Ireland", + "Isle_of_Man", + "Israel", + "Italy", + "Jamaica", + "Jammu_and_Kashmir", + "Japan", + "Jarvis_Island", + "Jersey", + "Johnston_Atoll", + "Jordan", + "Juan_de_Nova_Island", + "Kazakhstan", + "Kenya", + "Kingman_Reef", + "Kiribati", + "Kuril_islands", + "Kuwait", + "Kyrgyzstan", + "Lao_People_s_Democratic_Republic", + "Latvia", + "Lebanon", + "Lesotho", + "Liberia", + "Libya", + "Liechtenstein", + "Lithuania", + "Luxembourg", + "Ma_tan_al-Sarra", + "Macau", + "Madagascar", + "Madeira_Islands", + "Malawi", + "Malaysia", + "Maldives", + "Mali", + "Malta", + "Marshall_Islands", + "Martinique", + "Mauritania", + "Mauritius", + "Mayotte", + "Mexico", + "Micronesia__Federated_States_of_", + "Midway_Island", + "Moldova,_Republic_of", + "Monaco", + "Mongolia", + "Montenegro", + "Montserrat", + "Morocco", + "Mozambique", + "Myanmar", + "Namibia", + "Nauru", + "Navassa_Island", + "Nepal", + "Netherlands", + "Netherlands_Antilles", + "New_Caledonia", + "New_Zealand", + "Nicaragua", + "Niger", + "Nigeria", + "Niue", + "Norfolk_Island", + "Northern_Mariana_Islands", + "Norway", + "Oman", + "Pakistan", + "Palau", + "Palmyra_Atoll", + "Panama", + "Papua_New_Guinea", + "Paracel_Islands", + "Paraguay", + "Peru", + "Philippines", + "Pitcairn", + "Poland", + "Portugal", + "Puerto_Rico", + "Qatar", + "Republic_of_Korea", + "Romania", + "Russian_Federation", + "Rwanda", + "R�union", + "Saint_Helena", + "Saint_Kitts_and_Nevis", + "Saint_Lucia", + "Saint_Pierre_et_Miquelon", + "Saint_Vincent_and_the_Grenadines", + "Samoa", + "San_Marino", + "Sao_Tome_and_Principe", + "Saudi_Arabia", + "Scarborough_Reef", + "Senegal", + "Senkaku_Islands", + "Serbia", + "Seychelles", + "Sierra_Leone", + "Singapore", + "Slovakia", + "Slovenia", + "Solomon_Islands", + "Somalia", + "South_Africa", + "South_Georgia_and_the_South_Sandwich_Islands", + "South_Sudan", + "Spain", + "Spratly_Islands", + "Sri_Lanka", + "Sudan", + "Suriname", + "Svalbard_and_Jan_Mayen_Islands", + "Swaziland", + "Sweden", + "Switzerland", + "Syrian_Arab_Republic", + "Taiwan", + "Tajikistan", + "Thailand", + "The_former_Yugoslav_Republic_of_Macedonia", + "Timor-Leste", + "Togo", + "Tokelau", + "Tonga", + "Trinidad_and_Tobago", + "Tromelin_Island", + "Tunisia", + "Turkey", + "Turkmenistan", + "Turks_and_Caicos_islands", + "Tuvalu", + "UK_of_Great_Britain_and_Northern_Ireland", + "Uganda", + "Ukraine", + "United_Arab_Emirates", + "United_Republic_of_Tanzania", + "United_States_Virgin_Islands", + "United_States_of_America", + "Uruguay", + "Uzbekistan", + "Vanuatu", + "Venezuela", + "Viet_Nam", + "Wake_Island", + "Wallis_and_Futuna", + "West_Bank", + "Western_Sahara", + "Yemen", + "Zambia", + "Zimbabwe" ) ); + + private static ArrayList filesGenerated = new ArrayList<>( + Arrays.asList( "Azores_Islands_bassin_10", + "Azores_Islands_bassin_11", + "Azores_Islands_bassin_12", + "Azores_Islands", + "Azores_Islands_bassin_5", + "Azores_Islands_bassin_6", + "Azores_Islands_bassin_7", + "Azores_Islands_bassin_8", + "Azores_Islands_bassin_9", + "Brunei_Darussalam_bassin_10", + "Brunei_Darussalam_bassin_11", + "Brunei_Darussalam_bassin_12", + "Brunei_Darussalam_bassin_7", + "Brunei_Darussalam_bassin_8", + "Brunei_Darussalam_bassin_9", + "Bulgaria_bassin_10", + "Bulgaria_bassin_11", + "Bulgaria_bassin_12", + "Bulgaria", + "Bulgaria_bassin_5", + "Bulgaria_bassin_6", + "Bulgaria_bassin_7", + "Bulgaria_bassin_8", + "Bulgaria_bassin_9", + "Burkina_Faso_bassin_10", + "Burkina_Faso_bassin_11", + "Burkina_Faso_bassin_12", + "Burkina_Faso", + "Burkina_Faso_bassin_5", + "Burkina_Faso_bassin_6", + "Burkina_Faso_bassin_7", + "Burkina_Faso_bassin_8", + "Burkina_Faso_bassin_9", + "Burundi_bassin_10", + "Burundi_bassin_11", + "Burundi_bassin_12", + "Burundi", + "Burundi_bassin_5", + "Burundi_bassin_6", + "Burundi_bassin_7", + "Burundi_bassin_8", + "Burundi_bassin_9", + "Cambodia_bassin_10", + "Cambodia_bassin_11", + "Cambodia_bassin_12", + "Cambodia", + "Cambodia_bassin_5", + "Cambodia_bassin_6", + "Cambodia_bassin_7", + "Cambodia_bassin_8", + "Cambodia_bassin_9", + "Cameroon_bassin_10", + "Cameroon_bassin_11", + "Cameroon_bassin_12", + "Cameroon", + "Cameroon_bassin_5", + "Cameroon_bassin_6", + "Cameroon_bassin_7", + "Cameroon_bassin_8", + "Cameroon_bassin_9", + "Canada_bassin_10", + "Canada_bassin_11", + "Canada_bassin_12", + "Canada", + "Canada_bassin_5", + "Canada_bassin_6", + "Canada_bassin_7", + "Canada_bassin_8", + "Canada_bassin_9", + "Cape_Verde_bassin_10", + "Cape_Verde_bassin_11", + "Cape_Verde_bassin_12", + "Cape_Verde", + "Cape_Verde_bassin_5", + "Cape_Verde_bassin_6", + "Cape_Verde_bassin_7", + "Cape_Verde_bassin_8", + "Cape_Verde_bassin_9", + "Cayman_Islands_bassin_10", + "Cayman_Islands_bassin_11", + "Cayman_Islands_bassin_12", + "Cayman_Islands", + "Cayman_Islands_bassin_5", + "Cayman_Islands_bassin_6", + "Cayman_Islands_bassin_7", + "Cayman_Islands_bassin_8", + "Cayman_Islands_bassin_9", + "Central_African Republic_bassin_10", + "Central_African Republic_bassin_11", + "Central_African Republic_bassin_12", + "Central_African Republic", + "Central_African Republic_bassin_5", + "Central_African Republic_bassin_6", + "Central_African Republic_bassin_7", + "Central_African Republic_bassin_8", + "Central_African Republic_bassin_9", + "Chad_bassin_10", + "Chad_bassin_11", + "Chad_bassin_12", + "Chad", + "Chad_bassin_5", + "Chad_bassin_6", + "Chad_bassin_7", + "Chad_bassin_8", + "Chad_bassin_9", + "Chile_bassin_10", + "Chile_bassin_11", + "Chile_bassin_12", + "Chile", + "Chile_bassin_5", + "Chile_bassin_6", + "Chile_bassin_7", + "Chile_bassin_8", + "Chile_bassin_9", + "China_bassin_10", + "China_bassin_11", + "China_bassin_12", + "China", + "China_bassin_5", + "China_bassin_6", + "China_bassin_7", + "China_bassin_8", + "China_bassin_9", + "Christmas_Island_bassin_10", + "Christmas_Island_bassin_11", + "Christmas_Island_bassin_12", + "Christmas_Island", + "Christmas_Island_bassin_5", + "Christmas_Island_bassin_6", + "Christmas_Island_bassin_7", + "Christmas_Island_bassin_8", + "Christmas_Island_bassin_9", + "Clipperton_Island_bassin_10", + "Clipperton_Island_bassin_11", + "Clipperton_Island_bassin_12", + "Clipperton_Island", + "Clipperton_Island_bassin_5", + "Clipperton_Island_bassin_6", + "Clipperton_Island_bassin_7", + "Clipperton_Island_bassin_8", + "Clipperton_Island_bassin_9", + "Colombia_bassin_10", + "Colombia_bassin_11", + "Colombia_bassin_12", + "Colombia", + "Colombia_bassin_5", + "Colombia_bassin_6", + "Colombia_bassin_7", + "Colombia_bassin_8", + "Colombia_bassin_9", + "Comoros_bassin_10", + "Comoros_bassin_11", + "Comoros_bassin_12", + "Comoros", + "Comoros_bassin_5", + "Comoros_bassin_6", + "Comoros_bassin_7", + "Comoros_bassin_8", + "Comoros_bassin_9", + "Congo_bassin_10", + "Congo_bassin_11", + "Congo_bassin_12", + "Congo", + "Congo_bassin_5", + "Congo_bassin_6", + "Congo_bassin_7", + "Congo_bassin_8", + "Congo_bassin_9", + "Cook_Islands_bassin_10", + "Cook_Islands_bassin_11", + "Cook_Islands_bassin_12", + "Cook_Islands", + "Cook_Islands_bassin_5", + "Cook_Islands_bassin_6", + "Cook_Islands_bassin_7", + "Cook_Islands_bassin_8", + "Cook_Islands_bassin_9", + "Costa_Rica_bassin_10", + "Costa_Rica_bassin_11", + "Costa_Rica_bassin_12", + "Costa_Rica", + "Costa_Rica_bassin_5", + "Costa_Rica_bassin_6", + "Costa_Rica_bassin_7", + "Costa_Rica_bassin_8", + "Costa_Rica_bassin_9", + "Croatia_bassin_10", + "Croatia_bassin_11", + "Croatia_bassin_12", + "Croatia", + "Croatia_bassin_5", + "Croatia_bassin_6", + "Croatia_bassin_7", + "Croatia_bassin_8", + "Croatia_bassin_9", + "Cuba_bassin_10", + "Cuba_bassin_11", + "Cuba_bassin_12", + "Cuba", + "Cuba_bassin_5", + "Cuba_bassin_6", + "Cuba_bassin_7", + "Cuba_bassin_8", + "Cuba_bassin_9", + "Cyprus_bassin_10", + "Cyprus_bassin_11", + "Cyprus_bassin_12", + "Cyprus", + "Cyprus_bassin_5", + "Cyprus_bassin_6", + "Cyprus_bassin_7", + "Cyprus_bassin_8", + "Cyprus_bassin_9", + "Czech_Republic_bassin_10", + "Czech_Republic_bassin_11", + "Czech_Republic_bassin_12", + "Czech_Republic", + "Czech_Republic_bassin_5", + "Czech_Republic_bassin_6", + "Czech_Republic_bassin_7", + "Czech_Republic_bassin_8", + "Czech_Republic_bassin_9", + "Democratic_Republic of the Congo_bassin_10", + "Democratic_Republic of the Congo_bassin_11", + "Democratic_Republic of the Congo_bassin_12", + "Democratic_Republic of the Congo", + "Democratic_Republic of the Congo_bassin_5", + "Democratic_Republic of the Congo_bassin_6", + "Democratic_Republic of the Congo_bassin_7", + "Democratic_Republic of the Congo_bassin_8", + "Democratic_Republic of the Congo_bassin_9", + "Dem_Peoples Rep of Korea_bassin_10", + "Dem_Peoples Rep of Korea_bassin_11", + "Dem_Peoples Rep of Korea_bassin_12", + "Dem_Peoples Rep of Korea", + "Dem_Peoples Rep of Korea_bassin_5", + "Dem_Peoples Rep of Korea_bassin_6", + "Dem_Peoples Rep of Korea_bassin_7", + "Dem_Peoples Rep of Korea_bassin_8", + "Dem_Peoples Rep of Korea_bassin_9", + "Denmark_bassin_10", + "Denmark_bassin_11", + "Denmark_bassin_12", + "Denmark", + "Denmark_bassin_5", + "Denmark_bassin_6", + "Denmark_bassin_7", + "Denmark_bassin_8", + "Denmark_bassin_9", + "Djibouti_bassin_10", + "Djibouti_bassin_11", + "Djibouti_bassin_12", + "Djibouti", + "Djibouti_bassin_5", + "Djibouti_bassin_6", + "Djibouti_bassin_7", + "Djibouti_bassin_8", + "Djibouti_bassin_9", + "Dominican_Republic_bassin_10", + "Dominican_Republic_bassin_11", + "Dominican_Republic_bassin_12", + "Dominican_Republic", + "Dominican_Republic_bassin_5", + "Dominican_Republic_bassin_6", + "Dominican_Republic_bassin_7", + "Dominican_Republic_bassin_8", + "Dominican_Republic_bassin_9", + "Dominica_bassin_10", + "Dominica_bassin_11", + "Dominica_bassin_12", + "Dominica", + "Dominica_bassin_5", + "Dominica_bassin_6", + "Dominica_bassin_7", + "Dominica_bassin_8", + "Dominica_bassin_9", + "Ecuador_bassin_10", + "Ecuador_bassin_11", + "Ecuador_bassin_12", + "Ecuador", + "Ecuador_bassin_5", + "Ecuador_bassin_6", + "Ecuador_bassin_7", + "Ecuador_bassin_8", + "Ecuador_bassin_9", + "Egypt_bassin_10", + "Egypt_bassin_11", + "Egypt_bassin_12", + "Egypt", + "Egypt_bassin_5", + "Egypt_bassin_6", + "Egypt_bassin_7", + "Egypt_bassin_8", + "Egypt_bassin_9", + "El_Salvador_bassin_10", + "El_Salvador_bassin_11", + "El_Salvador_bassin_12", + "El_Salvador", + "El_Salvador_bassin_5", + "El_Salvador_bassin_6", + "El_Salvador_bassin_7", + "El_Salvador_bassin_8", + "El_Salvador_bassin_9", + "Equatorial_Guinea_bassin_10", + "Equatorial_Guinea_bassin_11", + "Equatorial_Guinea_bassin_12", + "Equatorial_Guinea", + "Equatorial_Guinea_bassin_5", + "Equatorial_Guinea_bassin_6", + "Equatorial_Guinea_bassin_7", + "Equatorial_Guinea_bassin_8", + "Equatorial_Guinea_bassin_9", + "Eritrea_bassin_10", + "Eritrea_bassin_11", + "Eritrea_bassin_12", + "Eritrea", + "Eritrea_bassin_5", + "Eritrea_bassin_6", + "Eritrea_bassin_7", + "Eritrea_bassin_8", + "Eritrea_bassin_9", + "Estonia_bassin_10", + "Estonia_bassin_11", + "Estonia_bassin_12", + "Estonia", + "Estonia_bassin_5", + "Estonia_bassin_6", + "Estonia_bassin_7", + "Estonia_bassin_8", + "Estonia_bassin_9", + "Ethiopia_bassin_10", + "Ethiopia_bassin_11", + "Ethiopia_bassin_12", + "Ethiopia", + "Ethiopia_bassin_5", + "Ethiopia_bassin_6", + "Ethiopia_bassin_7", + "Ethiopia_bassin_8", + "Ethiopia_bassin_9", + "Europa_Island_bassin_10", + "Europa_Island_bassin_11", + "Europa_Island_bassin_12", + "Europa_Island", + "Europa_Island_bassin_5", + "Europa_Island_bassin_6", + "Europa_Island_bassin_7", + "Europa_Island_bassin_8", + "Europa_Island_bassin_9", + "Faroe_Islands_bassin_10", + "Faroe_Islands_bassin_11", + "Faroe_Islands_bassin_12", + "Faroe_Islands", + "Faroe_Islands_bassin_5", + "Faroe_Islands_bassin_6", + "Faroe_Islands_bassin_7", + "Faroe_Islands_bassin_8", + "Faroe_Islands_bassin_9", + "Fiji_bassin_10", + "Fiji_bassin_11", + "Fiji_bassin_12", + "Fiji", + "Fiji_bassin_5", + "Fiji_bassin_6", + "Fiji_bassin_7", + "Fiji_bassin_8", + "Fiji_bassin_9", + "Finland_bassin_10", + "Finland_bassin_11", + "Finland_bassin_12", + "Finland", + "Finland_bassin_5", + "Finland_bassin_6", + "Finland_bassin_7", + "Finland_bassin_8", + "Finland_bassin_9", + "France_bassin_10", + "France_bassin_11", + "France_bassin_12", + "France", + "France_bassin_5", + "France_bassin_6", + "France_bassin_7", + "France_bassin_8", + "France_bassin_9", + "French_Guiana_bassin_10", + "French_Guiana_bassin_11", + "French_Guiana_bassin_12", + "French_Guiana", + "French_Guiana_bassin_5", + "French_Guiana_bassin_6", + "French_Guiana_bassin_7", + "French_Guiana_bassin_8", + "French_Guiana_bassin_9", + "French_Polynesia_bassin_10", + "French_Polynesia_bassin_11", + "French_Polynesia_bassin_12", + "French_Polynesia", + "French_Polynesia_bassin_5", + "French_Polynesia_bassin_6", + "French_Polynesia_bassin_7", + "French_Polynesia_bassin_8", + "French_Polynesia_bassin_9", + "French_Southern and Antarctic Territories_bassin_10", + "French_Southern and Antarctic Territories_bassin_11", + "French_Southern and Antarctic Territories_bassin_12", + "French_Southern and Antarctic Territories", + "French_Southern and Antarctic Territories_bassin_5", + "French_Southern and Antarctic Territories_bassin_6", + "French_Southern and Antarctic Territories_bassin_7", + "French_Southern and Antarctic Territories_bassin_8", + "French_Southern and Antarctic Territories_bassin_9", + "Gabon_bassin_10", + "Gabon_bassin_11", + "Gabon_bassin_12", + "Gabon", + "Gabon_bassin_5", + "Gabon_bassin_6", + "Gabon_bassin_7", + "Gabon_bassin_8", + "Gabon_bassin_9", + "Gambia_bassin_10", + "Gambia_bassin_11", + "Gambia_bassin_12", + "Gambia", + "Gambia_bassin_5", + "Gambia_bassin_6", + "Gambia_bassin_7", + "Gambia_bassin_8", + "Gambia_bassin_9", + "Gaza_Strip_bassin_10", + "Gaza_Strip_bassin_11", + "Gaza_Strip_bassin_12", + "Gaza_Strip", + "Gaza_Strip_bassin_5", + "Gaza_Strip_bassin_6", + "Gaza_Strip_bassin_7", + "Gaza_Strip_bassin_8", + "Gaza_Strip_bassin_9", + "Georgia_bassin_10", + "Georgia_bassin_11", + "Georgia_bassin_12", + "Georgia", + "Georgia_bassin_5", + "Georgia_bassin_6", + "Georgia_bassin_7", + "Georgia_bassin_8", + "Georgia_bassin_9", + "Germany_bassin_10", + "Germany_bassin_11", + "Germany_bassin_12", + "Germany", + "Germany_bassin_5", + "Germany_bassin_6", + "Germany_bassin_7", + "Germany_bassin_8", + "Germany_bassin_9", + "Ghana_bassin_10", + "Ghana_bassin_11", + "Ghana_bassin_12", + "Ghana", + "Ghana_bassin_5", + "Ghana_bassin_6", + "Ghana_bassin_8", + "Ghana_bassin_9", + "Gibraltar_bassin_10", + "Gibraltar_bassin_11", + "Gibraltar_bassin_12", + "Gibraltar", + "Gibraltar_bassin_5", + "Gibraltar_bassin_6", + "Gibraltar_bassin_7", + "Gibraltar_bassin_8", + "Gibraltar_bassin_9", + "Glorioso_Island_bassin_10", + "Glorioso_Island_bassin_11", + "Glorioso_Island_bassin_12", + "Glorioso_Island", + "Glorioso_Island_bassin_5", + "Glorioso_Island_bassin_6", + "Glorioso_Island_bassin_7", + "Glorioso_Island_bassin_8", + "Glorioso_Island_bassin_9", + "Greece_bassin_10", + "Greece_bassin_11", + "Greece_bassin_12", + "Greece", + "Greece_bassin_5", + "Greece_bassin_6", + "Greece_bassin_7", + "Greece_bassin_8", + "Greece_bassin_9", + "Greenland_bassin_10", + "Greenland_bassin_11", + "Greenland_bassin_12", + "Greenland", + "Greenland_bassin_5", + "Greenland_bassin_6", + "Greenland_bassin_7", + "Greenland_bassin_8", + "Greenland_bassin_9", + "Grenada_bassin_10", + "Grenada_bassin_11", + "Grenada_bassin_12", + "Grenada", + "Grenada_bassin_5", + "Grenada_bassin_6", + "Grenada_bassin_7", + "Grenada_bassin_8", + "Grenada_bassin_9", + "Guadeloupe_bassin_10", + "Guadeloupe_bassin_11", + "Guadeloupe_bassin_12", + "Guadeloupe", + "Guadeloupe_bassin_5", + "Guadeloupe_bassin_6", + "Guadeloupe_bassin_7", + "Guadeloupe_bassin_8", + "Guadeloupe_bassin_9", + "Guam_bassin_10", + "Guam_bassin_11", + "Guam_bassin_12", + "Guam", + "Guam_bassin_5", + "Guam_bassin_6", + "Guam_bassin_7", + "Guam_bassin_8", + "Guam_bassin_9", + "Halaib_triangle_bassin_10", + "Halaib_triangle_bassin_11", + "Halaib_triangle_bassin_12", + "Halaib_triangle", + "Halaib_triangle_bassin_5", + "Halaib_triangle_bassin_6", + "Halaib_triangle_bassin_7", + "Halaib_triangle_bassin_8", + "Halaib_triangle_bassin_9", + "Heard_Island and McDonald Islands_bassin_12", + "Holy_See_bassin_10", + "Holy_See_bassin_11", + "Holy_See_bassin_12", + "Holy_See", + "Holy_See_bassin_5", + "Holy_See_bassin_6", + "Holy_See_bassin_7", + "Holy_See_bassin_8", + "Holy_See_bassin_9", + "Honduras_bassin_10", + "Honduras_bassin_11", + "Honduras_bassin_12", + "Honduras", + "Honduras_bassin_5", + "Honduras_bassin_6", + "Honduras_bassin_7", + "Honduras_bassin_8", + "Honduras_bassin_9", + "Hong_Kong_bassin_10", + "Hong_Kong_bassin_11", + "Hong_Kong_bassin_12", + "Hong_Kong", + "Hong_Kong_bassin_5", + "Hong_Kong_bassin_6", + "Hong_Kong_bassin_7", + "Hong_Kong_bassin_8", + "Hong_Kong_bassin_9", + "Howland_Island_bassin_10", + "Howland_Island_bassin_11", + "Howland_Island_bassin_12", + "Howland_Island", + "Howland_Island_bassin_5", + "Howland_Island_bassin_6", + "Howland_Island_bassin_7", + "Howland_Island_bassin_8", + "Howland_Island_bassin_9", + "Hungary_bassin_10", + "Hungary_bassin_11", + "Hungary_bassin_12", + "Hungary", + "Hungary_bassin_5", + "Hungary_bassin_6", + "Hungary_bassin_7", + "Hungary_bassin_8", + "Hungary_bassin_9", + "Iceland_bassin_10", + "Iceland_bassin_11", + "Iceland_bassin_12", + "Iceland", + "Iceland_bassin_5", + "Iceland_bassin_6", + "Iceland_bassin_7", + "Iceland_bassin_8", + "Iceland_bassin_9", + "Ilemi_triangle_bassin_10", + "Ilemi_triangle_bassin_11", + "Ilemi_triangle_bassin_12", + "Ilemi_triangle", + "Ilemi_triangle_bassin_5", + "Ilemi_triangle_bassin_6", + "Ilemi_triangle_bassin_7", + "Ilemi_triangle_bassin_8", + "Ilemi_triangle_bassin_9", + "India_bassin_10", + "India_bassin_11", + "India_bassin_12", + "India", + "India_bassin_5", + "India_bassin_6", + "India_bassin_7", + "India_bassin_8", + "India_bassin_9", + "Indonesia_bassin_10", + "Indonesia_bassin_11", + "Indonesia_bassin_12", + "Indonesia", + "Indonesia_bassin_5", + "Indonesia_bassin_6", + "Indonesia_bassin_7", + "Indonesia_bassin_8", + "Indonesia_bassin_9", + "Iraq_bassin_10", + "Iraq_bassin_11", + "Iraq_bassin_12", + "Iraq", + "Iraq_bassin_5", + "Iraq_bassin_6", + "Iraq_bassin_7", + "Iraq_bassin_8", + "Iraq_bassin_9", + "Ireland_bassin_10", + "Ireland_bassin_11", + "Ireland_bassin_12", + "Ireland", + "Ireland_bassin_5", + "Ireland_bassin_6", + "Ireland_bassin_7", + "Ireland_bassin_8", + "Ireland_bassin_9", + "Isle_of Man_bassin_10", + "Isle_of Man_bassin_11", + "Isle_of Man_bassin_12", + "Isle_of Man", + "Isle_of Man_bassin_5", + "Isle_of Man_bassin_6", + "Isle_of Man_bassin_7", + "Isle_of Man_bassin_8", + "Isle_of Man_bassin_9", + "Israel_bassin_10", + "Israel_bassin_11", + "Israel_bassin_12", + "Israel", + "Israel_bassin_5", + "Israel_bassin_6", + "Israel_bassin_7", + "Israel_bassin_8", + "Israel_bassin_9", + "Italy_bassin_10", + "Italy_bassin_11", + "Italy_bassin_12", + "Italy", + "Italy_bassin_5", + "Italy_bassin_6", + "Italy_bassin_7", + "Italy_bassin_8", + "Italy_bassin_9", + "Jamaica_bassin_10", + "Jamaica_bassin_11", + "Jamaica_bassin_12", + "Jamaica", + "Jamaica_bassin_5", + "Jamaica_bassin_6", + "Jamaica_bassin_7", + "Jamaica_bassin_8", + "Jamaica_bassin_9", + "Jammu_and Kashmir_bassin_10", + "Jammu_and Kashmir_bassin_11", + "Jammu_and Kashmir_bassin_12", + "Jammu_and Kashmir", + "Jammu_and Kashmir_bassin_5", + "Jammu_and Kashmir_bassin_6", + "Jammu_and Kashmir_bassin_7", + "Jammu_and Kashmir_bassin_8", + "Jammu_and Kashmir_bassin_9", + "Japan_bassin_10", + "Japan_bassin_11", + "Japan_bassin_12", + "Japan", + "Japan_bassin_5", + "Japan_bassin_6", + "Japan_bassin_7", + "Japan_bassin_8", + "Japan_bassin_9", + "Jarvis_Island_bassin_10", + "Jarvis_Island_bassin_11", + "Jarvis_Island_bassin_12", + "Jarvis_Island", + "Jarvis_Island_bassin_5", + "Jarvis_Island_bassin_6", + "Jarvis_Island_bassin_7", + "Jarvis_Island_bassin_8", + "Jarvis_Island_bassin_9", + "Jersey_bassin_10", + "Jersey_bassin_11", + "Jersey_bassin_12", + "Jersey", + "Jersey_bassin_5", + "Jersey_bassin_6", + "Jersey_bassin_7", + "Jersey_bassin_8", + "Jersey_bassin_9", + "Johnston_Atoll_bassin_10", + "Johnston_Atoll_bassin_11", + "Johnston_Atoll_bassin_12", + "Johnston_Atoll", + "Johnston_Atoll_bassin_5", + "Johnston_Atoll_bassin_6", + "Johnston_Atoll_bassin_7", + "Johnston_Atoll_bassin_8", + "Johnston_Atoll_bassin_9", + "Jordan_bassin_10", + "Jordan_bassin_11", + "Jordan_bassin_12", + "Jordan", + "Jordan_bassin_5", + "Jordan_bassin_6", + "Jordan_bassin_7", + "Jordan_bassin_8", + "Jordan_bassin_9", + "Juan_de Nova Island_bassin_10", + "Juan_de Nova Island_bassin_11", + "Juan_de Nova Island_bassin_12", + "Juan_de Nova Island", + "Juan_de Nova Island_bassin_5", + "Juan_de Nova Island_bassin_6", + "Juan_de Nova Island_bassin_7", + "Juan_de Nova Island_bassin_8", + "Juan_de Nova Island_bassin_9", + "Kazakhstan_bassin_10", + "Kazakhstan_bassin_11", + "Kazakhstan_bassin_12", + "Kazakhstan", + "Kazakhstan_bassin_5", + "Kazakhstan_bassin_6", + "Kazakhstan_bassin_7", + "Kazakhstan_bassin_8", + "Kazakhstan_bassin_9", + "Kenya_bassin_10", + "Kenya_bassin_11", + "Kenya_bassin_12", + "Kenya", + "Kenya_bassin_5", + "Kenya_bassin_6", + "Kenya_bassin_7", + "Kenya_bassin_8", + "Kenya_bassin_9", + "Kingman_Reef_bassin_10", + "Kingman_Reef_bassin_11", + "Kingman_Reef_bassin_12", + "Kingman_Reef", + "Kingman_Reef_bassin_5", + "Kingman_Reef_bassin_6", + "Kingman_Reef_bassin_7", + "Kingman_Reef_bassin_8", + "Kingman_Reef_bassin_9", + "Kiribati_bassin_10", + "Kiribati_bassin_11", + "Kiribati_bassin_12", + "Kiribati", + "Kiribati_bassin_5", + "Kiribati_bassin_6", + "Kiribati_bassin_7", + "Kiribati_bassin_8", + "Kiribati_bassin_9", + "Kuril_islands_bassin_10", + "Kuril_islands_bassin_11", + "Kuril_islands_bassin_12", + "Kuril_islands", + "Kuril_islands_bassin_5", + "Kuril_islands_bassin_6", + "Kuril_islands_bassin_7", + "Kuril_islands_bassin_8", + "Kuril_islands_bassin_9", + "Kuwait_bassin_10", + "Kuwait_bassin_11", + "Kuwait_bassin_12", + "Kuwait", + "Kuwait_bassin_5", + "Kuwait_bassin_6", + "Kuwait_bassin_7", + "Kuwait_bassin_8", + "Kuwait_bassin_9", + "Kyrgyzstan_bassin_10", + "Kyrgyzstan_bassin_11", + "Kyrgyzstan_bassin_12", + "Kyrgyzstan", + "Kyrgyzstan_bassin_5", + "Kyrgyzstan_bassin_6", + "Kyrgyzstan_bassin_7", + "Kyrgyzstan_bassin_8", + "Kyrgyzstan_bassin_9", + "Lao_Peoples Democratic Republic_bassin_10", + "Lao_Peoples Democratic Republic_bassin_11", + "Lao_Peoples Democratic Republic_bassin_12", + "Lao_Peoples Democratic Republic", + "Lao_Peoples Democratic Republic_bassin_5", + "Lao_Peoples Democratic Republic_bassin_6", + "Lao_Peoples Democratic Republic_bassin_7", + "Lao_Peoples Democratic Republic_bassin_8", + "Lao_Peoples Democratic Republic_bassin_9", + "Latvia_bassin_10", + "Latvia_bassin_11", + "Latvia_bassin_12", + "Latvia", + "Latvia_bassin_5", + "Latvia_bassin_6", + "Latvia_bassin_7", + "Latvia_bassin_8", + "Latvia_bassin_9", + "Lebanon_bassin_10", + "Lebanon_bassin_11", + "Lebanon_bassin_12", + "Lebanon", + "Lebanon_bassin_5", + "Lebanon_bassin_6", + "Lebanon_bassin_7", + "Lebanon_bassin_8", + "Lebanon_bassin_9", + "Lesotho_bassin_10", + "Lesotho_bassin_11", + "Lesotho_bassin_12", + "Lesotho", + "Lesotho_bassin_5", + "Lesotho_bassin_6", + "Lesotho_bassin_7", + "Lesotho_bassin_8", + "Lesotho_bassin_9", + "Liberia_bassin_10", + "Liberia_bassin_11", + "Liberia_bassin_12", + "Liberia", + "Liberia_bassin_5", + "Liberia_bassin_6", + "Liberia_bassin_7", + "Liberia_bassin_8", + "Liberia_bassin_9", + "Libya_bassin_10", + "Libya_bassin_11", + "Libya_bassin_12", + "Libya", + "Libya_bassin_5", + "Libya_bassin_6", + "Libya_bassin_7", + "Libya_bassin_8", + "Libya_bassin_9", + "Liechtenstein_bassin_10", + "Liechtenstein_bassin_11", + "Liechtenstein_bassin_12", + "Liechtenstein", + "Liechtenstein_bassin_5", + "Liechtenstein_bassin_6", + "Liechtenstein_bassin_7", + "Liechtenstein_bassin_8", + "Liechtenstein_bassin_9", + "Lithuania_bassin_10", + "Lithuania_bassin_11", + "Lithuania_bassin_12", + "Lithuania", + "Lithuania_bassin_5", + "Lithuania_bassin_6", + "Lithuania_bassin_7", + "Lithuania_bassin_8", + "Lithuania_bassin_9", + "Luxembourg_bassin_10", + "Luxembourg_bassin_11", + "Luxembourg_bassin_12", + "Luxembourg", + "Luxembourg_bassin_5", + "Luxembourg_bassin_6", + "Luxembourg_bassin_7", + "Luxembourg_bassin_8", + "Luxembourg_bassin_9", + "Macau_bassin_10", + "Macau_bassin_11", + "Macau_bassin_12", + "Macau", + "Macau_bassin_5", + "Macau_bassin_6", + "Macau_bassin_7", + "Macau_bassin_8", + "Macau_bassin_9", + "Madagascar_bassin_10", + "Madagascar_bassin_11", + "Madagascar_bassin_12", + "Madagascar", + "Madagascar_bassin_5", + "Madagascar_bassin_6", + "Madagascar_bassin_7", + "Madagascar_bassin_8", + "Madagascar_bassin_9", + "Madeira_Islands_bassin_10", + "Madeira_Islands_bassin_11", + "Madeira_Islands_bassin_12", + "Madeira_Islands", + "Madeira_Islands_bassin_5", + "Madeira_Islands_bassin_6", + "Madeira_Islands_bassin_7", + "Madeira_Islands_bassin_8", + "Madeira_Islands_bassin_9", + "Malawi_bassin_10", + "Malawi_bassin_11", + "Malawi_bassin_12", + "Malawi", + "Malawi_bassin_5", + "Malawi_bassin_6", + "Malawi_bassin_7", + "Malawi_bassin_8", + "Malawi_bassin_9", + "Malaysia_bassin_10", + "Malaysia_bassin_11", + "Malaysia_bassin_12", + "Malaysia", + "Malaysia_bassin_5", + "Malaysia_bassin_6", + "Malaysia_bassin_7", + "Malaysia_bassin_8", + "Malaysia_bassin_9", + "Maldives_bassin_10", + "Maldives_bassin_11", + "Maldives_bassin_12", + "Maldives", + "Maldives_bassin_5", + "Maldives_bassin_6", + "Maldives_bassin_7", + "Maldives_bassin_8", + "Maldives_bassin_9", + "Matan_al-Sarra_bassin_10", + "Matan_al-Sarra_bassin_11", + "Matan_al-Sarra_bassin_12", + "Matan_al-Sarra", + "Matan_al-Sarra_bassin_5", + "Matan_al-Sarra_bassin_6", + "Matan_al-Sarra_bassin_7", + "Matan_al-Sarra_bassin_8", + "Matan_al-Sarra_bassin_9", + "Montenegro_bassin_10", + "Montenegro_bassin_11", + "Montenegro_bassin_12", + "Montenegro", + "Montenegro_bassin_5", + "Montenegro_bassin_6", + "Montenegro_bassin_7", + "Montenegro_bassin_8", + "Montenegro_bassin_9", + "Qatar_bassin_10", + "Qatar_bassin_11", + "Qatar_bassin_12", + "Republic_of Korea_bassin_10", + "Republic_of Korea_bassin_11", + "Republic_of Korea_bassin_12", + "Republic_of Korea", + "Republic_of Korea_bassin_5", + "Republic_of Korea_bassin_6", + "Republic_of Korea_bassin_7", + "Republic_of Korea_bassin_8", + "Republic_of Korea_bassin_9", + "Romania_bassin_10", + "Romania_bassin_11", + "Romania_bassin_12", + "Romania", + "Romania_bassin_5", + "Romania_bassin_6", + "Romania_bassin_7", + "Romania_bassin_8", + "Romania_bassin_9", + "Russian_Federation_bassin_10", + "Russian_Federation_bassin_11", + "Russian_Federation_bassin_12", + "Russian_Federation", + "Russian_Federation_bassin_5", + "Russian_Federation_bassin_6", + "Russian_Federation_bassin_7", + "Russian_Federation_bassin_8", + "Russian_Federation_bassin_9", + "Rwanda_bassin_10", + "Rwanda_bassin_11", + "Rwanda_bassin_12", + "Rwanda", + "Rwanda_bassin_5", + "Rwanda_bassin_6", + "Rwanda_bassin_7", + "Rwanda_bassin_8", + "Rwanda_bassin_9", + "Saint_Helena_bassin_10", + "Saint_Helena_bassin_11", + "Saint_Helena_bassin_12", + "Saint_Helena", + "Saint_Helena_bassin_5", + "Saint_Helena_bassin_6", + "Saint_Helena_bassin_7", + "Saint_Helena_bassin_8", + "Saint_Helena_bassin_9", + "Saint_Kitts and Nevis_bassin_10", + "Saint_Kitts and Nevis_bassin_11", + "Saint_Kitts and Nevis_bassin_12", + "Saint_Kitts and Nevis", + "Saint_Kitts and Nevis_bassin_5", + "Saint_Kitts and Nevis_bassin_6", + "Saint_Kitts and Nevis_bassin_7", + "Saint_Kitts and Nevis_bassin_8", + "Saint_Kitts and Nevis_bassin_9", + "Saint_Lucia_bassin_10", + "Saint_Lucia_bassin_11", + "Saint_Lucia_bassin_12", + "Saint_Lucia", + "Saint_Lucia_bassin_5", + "Saint_Lucia_bassin_6", + "Saint_Lucia_bassin_7", + "Saint_Lucia_bassin_8", + "Saint_Lucia_bassin_9", + "Saint_Pierre et Miquelon_bassin_10", + "Saint_Pierre et Miquelon_bassin_11", + "Saint_Pierre et Miquelon_bassin_12", + "Saint_Pierre et Miquelon", + "Saint_Pierre et Miquelon_bassin_5", + "Saint_Pierre et Miquelon_bassin_6", + "Saint_Pierre et Miquelon_bassin_7", + "Saint_Pierre et Miquelon_bassin_8", + "Saint_Pierre et Miquelon_bassin_9", + "Saint_Vincent and the Grenadines_bassin_10", + "Saint_Vincent and the Grenadines_bassin_11", + "Saint_Vincent and the Grenadines_bassin_12", + "Saint_Vincent and the Grenadines", + "Saint_Vincent and the Grenadines_bassin_5", + "Saint_Vincent and the Grenadines_bassin_6", + "Saint_Vincent and the Grenadines_bassin_7", + "Saint_Vincent and the Grenadines_bassin_8", + "Saint_Vincent and the Grenadines_bassin_9", + "Samoa_bassin_10", + "Samoa_bassin_11", + "Samoa_bassin_12", + "Samoa", + "Samoa_bassin_5", + "Samoa_bassin_6", + "Samoa_bassin_7", + "Samoa_bassin_8", + "Samoa_bassin_9", + "San_Marino_bassin_10", + "San_Marino_bassin_11", + "San_Marino_bassin_12", + "San_Marino", + "San_Marino_bassin_5", + "San_Marino_bassin_6", + "San_Marino_bassin_7", + "San_Marino_bassin_8", + "San_Marino_bassin_9", + "Sao_Tome and Principe_bassin_10", + "Sao_Tome and Principe_bassin_11", + "Sao_Tome and Principe_bassin_12", + "Sao_Tome and Principe", + "Sao_Tome and Principe_bassin_5", + "Sao_Tome and Principe_bassin_6", + "Sao_Tome and Principe_bassin_7", + "Sao_Tome and Principe_bassin_8", + "Sao_Tome and Principe_bassin_9", + "Saudi_Arabia_bassin_10", + "Saudi_Arabia_bassin_11", + "Saudi_Arabia_bassin_12", + "Saudi_Arabia", + "Saudi_Arabia_bassin_5", + "Saudi_Arabia_bassin_6", + "Saudi_Arabia_bassin_7", + "Saudi_Arabia_bassin_8", + "Saudi_Arabia_bassin_9", + "Scarborough_Reef_bassin_10", + "Scarborough_Reef_bassin_11", + "Scarborough_Reef_bassin_12", + "Scarborough_Reef", + "Scarborough_Reef_bassin_5", + "Scarborough_Reef_bassin_6", + "Scarborough_Reef_bassin_7", + "Scarborough_Reef_bassin_8", + "Scarborough_Reef_bassin_9", + "Senegal_bassin_10", + "Senegal_bassin_11", + "Senegal_bassin_12", + "Senegal", + "Senegal_bassin_5", + "Senegal_bassin_6", + "Senegal_bassin_7", + "Senegal_bassin_8", + "Senegal_bassin_9", + "Senkaku_Islands_bassin_10", + "Senkaku_Islands_bassin_11", + "Senkaku_Islands_bassin_12", + "Senkaku_Islands", + "Senkaku_Islands_bassin_5", + "Senkaku_Islands_bassin_6", + "Senkaku_Islands_bassin_7", + "Senkaku_Islands_bassin_8", + "Senkaku_Islands_bassin_9", + "Serbia_bassin_10", + "Serbia_bassin_11", + "Serbia_bassin_12", + "Serbia", + "Serbia_bassin_5", + "Serbia_bassin_6", + "Serbia_bassin_7", + "Serbia_bassin_8", + "Serbia_bassin_9", + "Seychelles_bassin_10", + "Seychelles_bassin_11", + "Seychelles_bassin_12", + "Seychelles", + "Seychelles_bassin_5", + "Seychelles_bassin_6", + "Seychelles_bassin_7", + "Seychelles_bassin_8", + "Seychelles_bassin_9", + "Sierra_Leone_bassin_10", + "Sierra_Leone_bassin_11", + "Sierra_Leone_bassin_12", + "Sierra_Leone", + "Sierra_Leone_bassin_5", + "Sierra_Leone_bassin_6", + "Sierra_Leone_bassin_7", + "Sierra_Leone_bassin_8", + "Sierra_Leone_bassin_9", + "Singapore_bassin_10", + "Singapore_bassin_11", + "Singapore_bassin_12", + "Singapore", + "Singapore_bassin_5", + "Singapore_bassin_6", + "Singapore_bassin_7", + "Singapore_bassin_8", + "Singapore_bassin_9", + "Slovakia_bassin_10", + "Slovakia_bassin_11", + "Slovakia_bassin_12", + "Slovakia", + "Slovakia_bassin_5", + "Slovakia_bassin_6", + "Slovakia_bassin_7", + "Slovakia_bassin_8", + "Slovakia_bassin_9", + "Slovenia_bassin_10", + "Slovenia_bassin_11", + "Slovenia_bassin_12", + "Slovenia", + "Slovenia_bassin_5", + "Slovenia_bassin_6", + "Slovenia_bassin_7", + "Slovenia_bassin_8", + "Slovenia_bassin_9", + "Solomon_Islands_bassin_10", + "Solomon_Islands_bassin_11", + "Solomon_Islands_bassin_12", + "Solomon_Islands", + "Solomon_Islands_bassin_5", + "Solomon_Islands_bassin_6", + "Solomon_Islands_bassin_7", + "Solomon_Islands_bassin_8", + "Solomon_Islands_bassin_9", + "Somalia_bassin_10", + "Somalia_bassin_11", + "Somalia_bassin_12", + "Somalia", + "Somalia_bassin_5", + "Somalia_bassin_6", + "Somalia_bassin_7", + "Somalia_bassin_8", + "Somalia_bassin_9", + "South_Africa_bassin_10", + "South_Africa_bassin_11", + "South_Africa_bassin_12", + "South_Africa", + "South_Africa_bassin_5", + "South_Africa_bassin_6", + "South_Africa_bassin_7", + "South_Africa_bassin_8", + "South_Africa_bassin_9", + "South_Georgia and the South Sandwich Islands_bassin_10", + "South_Georgia and the South Sandwich Islands_bassin_11", + "South_Georgia and the South Sandwich Islands_bassin_12", + "South_Georgia and the South Sandwich Islands", + "South_Georgia and the South Sandwich Islands_bassin_5", + "South_Georgia and the South Sandwich Islands_bassin_6", + "South_Georgia and the South Sandwich Islands_bassin_7", + "South_Georgia and the South Sandwich Islands_bassin_8", + "South_Georgia and the South Sandwich Islands_bassin_9", + "South_Sudan_bassin_10", + "South_Sudan_bassin_11", + "South_Sudan_bassin_12", + "South_Sudan", + "South_Sudan_bassin_5", + "South_Sudan_bassin_6", + "South_Sudan_bassin_7", + "South_Sudan_bassin_8", + "South_Sudan_bassin_9", + "Spain_bassin_10", + "Spain_bassin_11", + "Spain_bassin_12", + "Spain", + "Spain_bassin_5", + "Spain_bassin_6", + "Spain_bassin_7", + "Spain_bassin_8", + "Spain_bassin_9", + "Spratly_Islands_bassin_10", + "Spratly_Islands_bassin_11", + "Spratly_Islands_bassin_12", + "Spratly_Islands", + "Spratly_Islands_bassin_5", + "Spratly_Islands_bassin_6", + "Spratly_Islands_bassin_7", + "Spratly_Islands_bassin_8", + "Spratly_Islands_bassin_9", + "Sri_Lanka_bassin_10", + "Sri_Lanka_bassin_11", + "Sri_Lanka_bassin_12", + "Sri_Lanka", + "Sri_Lanka_bassin_5", + "Sri_Lanka_bassin_6", + "Sri_Lanka_bassin_7", + "Sri_Lanka_bassin_8", + "Sri_Lanka_bassin_9", + "Suriname_bassin_10", + "Suriname_bassin_11", + "Suriname_bassin_12", + "Suriname", + "Suriname_bassin_5", + "Suriname_bassin_6", + "Suriname_bassin_7", + "Suriname_bassin_8", + "Suriname_bassin_9", + "Svalbard_and Jan Mayen Islands_bassin_10", + "Svalbard_and Jan Mayen Islands_bassin_11", + "Svalbard_and Jan Mayen Islands_bassin_12", + "Svalbard_and Jan Mayen Islands", + "Svalbard_and Jan Mayen Islands_bassin_5", + "Svalbard_and Jan Mayen Islands_bassin_6", + "Svalbard_and Jan Mayen Islands_bassin_7", + "Svalbard_and Jan Mayen Islands_bassin_8", + "Svalbard_and Jan Mayen Islands_bassin_9", + "Swaziland_bassin_10", + "Swaziland_bassin_11", + "Swaziland_bassin_12", + "Swaziland", + "Swaziland_bassin_5", + "Swaziland_bassin_6", + "Swaziland_bassin_7", + "Swaziland_bassin_8", + "Swaziland_bassin_9", + "Sweden_bassin_10", + "Sweden_bassin_11", + "Sweden_bassin_12", + "Sweden", + "Sweden_bassin_5", + "Sweden_bassin_6", + "Sweden_bassin_7", + "Sweden_bassin_8", + "Sweden_bassin_9", + "Switzerland_bassin_10", + "Switzerland_bassin_11", + "Switzerland_bassin_12", + "Switzerland", + "Switzerland_bassin_5", + "Switzerland_bassin_6", + "Switzerland_bassin_7", + "Switzerland_bassin_8", + "Switzerland_bassin_9", + "Syrian_Arab Republic_bassin_10", + "Syrian_Arab Republic_bassin_11", + "Syrian_Arab Republic_bassin_12", + "Syrian_Arab Republic", + "Syrian_Arab Republic_bassin_5", + "Syrian_Arab Republic_bassin_6", + "Syrian_Arab Republic_bassin_7", + "Syrian_Arab Republic_bassin_8", + "Syrian_Arab Republic_bassin_9", + "Taiwan_bassin_10", + "Taiwan_bassin_11", + "Taiwan_bassin_12", + "Taiwan", + "Taiwan_bassin_5", + "Taiwan_bassin_6", + "Taiwan_bassin_7", + "Taiwan_bassin_8", + "Taiwan_bassin_9", + "Tajikistan_bassin_10", + "Tajikistan_bassin_11", + "Tajikistan_bassin_12", + "Tajikistan", + "Tajikistan_bassin_5", + "Tajikistan_bassin_6", + "Tajikistan_bassin_7", + "Tajikistan_bassin_8", + "Tajikistan_bassin_9", + "Thailand_bassin_10", + "Thailand_bassin_11", + "Thailand_bassin_12", + "Thailand", + "Thailand_bassin_5", + "Thailand_bassin_6", + "Thailand_bassin_7", + "Thailand_bassin_8", + "Thailand_bassin_9", + "The_former Yugoslav Republic of Macedonia_bassin_10", + "The_former Yugoslav Republic of Macedonia_bassin_11", + "The_former Yugoslav Republic of Macedonia_bassin_12", + "The_former Yugoslav Republic of Macedonia", + "The_former Yugoslav Republic of Macedonia_bassin_5", + "The_former Yugoslav Republic of Macedonia_bassin_6", + "The_former Yugoslav Republic of Macedonia_bassin_7", + "The_former Yugoslav Republic of Macedonia_bassin_8", + "The_former Yugoslav Republic of Macedonia_bassin_9", + "Timor-Leste_bassin_10", + "Timor-Leste_bassin_11", + "Timor-Leste_bassin_12", + "Timor-Leste", + "Timor-Leste_bassin_5", + "Timor-Leste_bassin_6", + "Timor-Leste_bassin_7", + "Timor-Leste_bassin_8", + "Timor-Leste_bassin_9", + "Togo_bassin_10", + "Togo_bassin_11", + "Togo_bassin_12", + "Togo", + "Togo_bassin_5", + "Togo_bassin_6", + "Togo_bassin_7", + "Togo_bassin_8", + "Togo_bassin_9", + "Tokelau_bassin_10", + "Tokelau_bassin_11", + "Tokelau_bassin_12", + "Tokelau", + "Tokelau_bassin_5", + "Tokelau_bassin_6", + "Tokelau_bassin_7", + "Tokelau_bassin_8", + "Tokelau_bassin_9", + "Tonga_bassin_10", + "Tonga_bassin_11", + "Tonga_bassin_12", + "Tonga", + "Tonga_bassin_5", + "Tonga_bassin_6", + "Tonga_bassin_7", + "Tonga_bassin_8", + "Tonga_bassin_9", + "Trinidad_and Tobago_bassin_10", + "Trinidad_and Tobago_bassin_11", + "Trinidad_and Tobago_bassin_12", + "Trinidad_and Tobago", + "Trinidad_and Tobago_bassin_5", + "Trinidad_and Tobago_bassin_6", + "Trinidad_and Tobago_bassin_7", + "Trinidad_and Tobago_bassin_8", + "Trinidad_and Tobago_bassin_9", + "Tromelin_Island_bassin_10", + "Tromelin_Island_bassin_11", + "Tromelin_Island_bassin_12", + "Tromelin_Island", + "Tromelin_Island_bassin_5", + "Tromelin_Island_bassin_6", + "Tromelin_Island_bassin_7", + "Tromelin_Island_bassin_8", + "Tromelin_Island_bassin_9", + "Tunisia_bassin_10", + "Tunisia_bassin_11", + "Tunisia_bassin_12", + "Tunisia", + "Tunisia_bassin_5", + "Tunisia_bassin_6", + "Tunisia_bassin_7", + "Tunisia_bassin_8", + "Tunisia_bassin_9", + "Turkey_bassin_10", + "Turkey_bassin_11", + "Turkey_bassin_12", + "Turkey", + "Turkey_bassin_5", + "Turkey_bassin_6", + "Turkey_bassin_7", + "Turkey_bassin_8", + "Turkey_bassin_9", + "Turkmenistan_bassin_10", + "Turkmenistan_bassin_11", + "Turkmenistan_bassin_12", + "Turkmenistan", + "Turkmenistan_bassin_5", + "Turkmenistan_bassin_6", + "Turkmenistan_bassin_7", + "Turkmenistan_bassin_8", + "Turkmenistan_bassin_9", + "Turks_and Caicos islands_bassin_10", + "Turks_and Caicos islands_bassin_11", + "Turks_and Caicos islands_bassin_12", + "Turks_and Caicos islands", + "Turks_and Caicos islands_bassin_5", + "Turks_and Caicos islands_bassin_6", + "Turks_and Caicos islands_bassin_7", + "Turks_and Caicos islands_bassin_8", + "Turks_and Caicos islands_bassin_9", + "Tuvalu_bassin_10", + "Tuvalu_bassin_11", + "Tuvalu_bassin_12", + "Tuvalu", + "Tuvalu_bassin_5", + "Tuvalu_bassin_6", + "Tuvalu_bassin_7", + "Tuvalu_bassin_8", + "Tuvalu_bassin_9", + "Uganda_bassin_10", + "Uganda_bassin_11", + "Uganda_bassin_12", + "Uganda", + "Uganda_bassin_5", + "Uganda_bassin_6", + "Uganda_bassin_7", + "Uganda_bassin_8", + "Uganda_bassin_9", + "Ukraine_bassin_10", + "Ukraine_bassin_11", + "Ukraine_bassin_12", + "Ukraine", + "Ukraine_bassin_5", + "Ukraine_bassin_6", + "Ukraine_bassin_7", + "Ukraine_bassin_8", + "Ukraine_bassin_9", + "UK_of Great Britain and Northern Ireland_bassin_10", + "UK_of Great Britain and Northern Ireland_bassin_11", + "UK_of Great Britain and Northern Ireland_bassin_12", + "UK_of Great Britain and Northern Ireland", + "UK_of Great Britain and Northern Ireland_bassin_5", + "UK_of Great Britain and Northern Ireland_bassin_6", + "UK_of Great Britain and Northern Ireland_bassin_7", + "UK_of Great Britain and Northern Ireland_bassin_8", + "UK_of Great Britain and Northern Ireland_bassin_9", + "United_Arab Emirates_bassin_10", + "United_Arab Emirates_bassin_11", + "United_Arab Emirates_bassin_12", + "United_Arab Emirates", + "United_Arab Emirates_bassin_5", + "United_Arab Emirates_bassin_6", + "United_Arab Emirates_bassin_7", + "United_Arab Emirates_bassin_8", + "United_Arab Emirates_bassin_9", + "United_Republic of Tanzania_bassin_10", + "United_Republic of Tanzania_bassin_11", + "United_Republic of Tanzania_bassin_12", + "United_Republic of Tanzania", + "United_Republic of Tanzania_bassin_5", + "United_Republic of Tanzania_bassin_6", + "United_Republic of Tanzania_bassin_7", + "United_Republic of Tanzania_bassin_8", + "United_Republic of Tanzania_bassin_9", + "United_States of America_bassin_10", + "United_States of America_bassin_11", + "United_States of America_bassin_12", + "United_States of America", + "United_States of America_bassin_5", + "United_States of America_bassin_6", + "United_States of America_bassin_7", + "United_States of America_bassin_8", + "United_States of America_bassin_9", + "United_States Virgin Islands_bassin_10", + "United_States Virgin Islands_bassin_11", + "United_States Virgin Islands_bassin_12", + "United_States Virgin Islands", + "United_States Virgin Islands_bassin_5", + "United_States Virgin Islands_bassin_6", + "United_States Virgin Islands_bassin_7", + "United_States Virgin Islands_bassin_8", + "United_States Virgin Islands_bassin_9", + "Uruguay_bassin_10", + "Uruguay_bassin_11", + "Uruguay_bassin_12", + "Uruguay", + "Uruguay_bassin_5", + "Uruguay_bassin_6", + "Uruguay_bassin_7", + "Uruguay_bassin_8", + "Uruguay_bassin_9", + "Uzbekistan_bassin_10", + "Uzbekistan_bassin_11", + "Uzbekistan_bassin_12", + "Uzbekistan", + "Uzbekistan_bassin_5", + "Uzbekistan_bassin_6", + "Uzbekistan_bassin_7", + "Uzbekistan_bassin_8", + "Uzbekistan_bassin_9", + "Vanuatu_bassin_10", + "Vanuatu_bassin_11", + "Vanuatu_bassin_12", + "Vanuatu", + "Vanuatu_bassin_5", + "Vanuatu_bassin_6", + "Vanuatu_bassin_7", + "Vanuatu_bassin_8", + "Vanuatu_bassin_9", + "Venezuela_bassin_10", + "Venezuela_bassin_11", + "Venezuela_bassin_12", + "Venezuela", + "Venezuela_bassin_5", + "Venezuela_bassin_6", + "Venezuela_bassin_7", + "Venezuela_bassin_8", + "Venezuela_bassin_9", + "Viet_Nam_bassin_10", + "Viet_Nam_bassin_11", + "Viet_Nam_bassin_12", + "Viet_Nam", + "Viet_Nam_bassin_5", + "Viet_Nam_bassin_6", + "Viet_Nam_bassin_7", + "Viet_Nam_bassin_8", + "Viet_Nam_bassin_9", + "Wake_Island_bassin_10", + "Wake_Island_bassin_11", + "Wake_Island_bassin_12", + "Wake_Island", + "Wake_Island_bassin_5", + "Wake_Island_bassin_6", + "Wake_Island_bassin_7", + "Wake_Island_bassin_8", + "Wake_Island_bassin_9", + "Wallis_and Futuna_bassin_10", + "Wallis_and Futuna_bassin_11", + "Wallis_and Futuna_bassin_12", + "Wallis_and Futuna", + "Wallis_and Futuna_bassin_5", + "Wallis_and Futuna_bassin_6", + "Wallis_and Futuna_bassin_7", + "Wallis_and Futuna_bassin_8", + "Wallis_and Futuna_bassin_9", + "Western_Sahara_bassin_10", + "Western_Sahara_bassin_11", + "Western_Sahara_bassin_12", + "Western_Sahara", + "Western_Sahara_bassin_5", + "Western_Sahara_bassin_6", + "Western_Sahara_bassin_7", + "Western_Sahara_bassin_8", + "Western_Sahara_bassin_9", + "West_Bank_bassin_10", + "West_Bank_bassin_11", + "West_Bank_bassin_12", + "West_Bank", + "West_Bank_bassin_5", + "West_Bank_bassin_6", + "West_Bank_bassin_7", + "West_Bank_bassin_8", + "West_Bank_bassin_9", + "Yemen_bassin_10", + "Yemen_bassin_11", + "Yemen_bassin_12", + "Yemen", + "Yemen_bassin_5", + "Yemen_bassin_6", + "Yemen_bassin_7", + "Yemen_bassin_8", + "Yemen_bassin_9", + "Zambia_bassin_10", + "Zambia_bassin_11", + "Zambia_bassin_12", + "Zambia", + "Zambia_bassin_5", + "Zambia_bassin_6", + "Zambia_bassin_7", + "Zambia_bassin_8", + "Zambia_bassin_9", + "Zimbabwe_bassin_10", + "Zimbabwe_bassin_11", + "Zimbabwe_bassin_12", + "Zimbabwe", + "Zimbabwe_bassin_5", + "Zimbabwe_bassin_6", + "Zimbabwe_bassin_7", + "Zimbabwe_bassin_8", + "Zimbabwe_bassin_9" + ) ); + + public static void main(String[] args) { + + ArrayList missingCountries = new ArrayList(); + + for (String country : allCountryNames) { + if( !filesGenerated.contains(country) ) { + missingCountries.add( country); + } + } + System.out.println( missingCountries.size() ); + System.out.println( missingCountries ); + + String finalCountries = ""; + for (String missing : missingCountries) { + finalCountries += '"' + missing.replaceAll( "_", " ") + "\", "; + } + System.out.println( finalCountries ); + + } + + +} From 73fcf2f4c2310c9d4eff6075e10441ce6ab6b3d4 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:55 +0100 Subject: [PATCH 0084/1620] New translations ServerController.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 480 ++++++++---------- 1 file changed, 205 insertions(+), 275 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index de96e18020..5b52f161d0 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,361 +1,291 @@ -package org.openforis.collect.earth.app.server; - -import java.util.List; +package org.openforis.collect.earth.app.desktop; + +import java.io.File; +import java.io.IOException; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.Statement; import java.util.Map; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - +import java.util.Observable; +import java.util.Observer; + +import org.eclipse.jetty.server.Connector; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.ServerConnector; +import org.eclipse.jetty.util.thread.ExecutorThreadPool; +import org.eclipse.jetty.webapp.WebAppContext; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; import org.openforis.collect.earth.app.service.BrowserService; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.KmlGeneratorService; +import org.openforis.collect.earth.app.service.FolderFinder; import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; -import org.openforis.collect.earth.sampler.processor.KmlGenerator; -import org.openforis.collect.earth.sampler.utils.KmlGenerationException; -import org.openforis.idm.metamodel.AttributeDefinition; -import org.opengis.referencing.operation.TransformException; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.beans.factory.BeanCreationException; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.context.support.WebApplicationContextUtils; -import com.opencsv.CSVReader; +import freemarker.template.TemplateException; /** - * Servlet to return the information that is stored in Collect Earth for one - * placemark (plot) + * Controls the Jetty server, starting and stopping it as well as reporting its staus. * * @author Alfonso Sanchez-Paus Diaz * */ -@Controller -public class PlacemarkBrowserServlet { - @Autowired - private BrowserService browserService; - - @Autowired - private EarthSurveyService earthSurveyService; - - @Autowired - private LocalPropertiesService localPropertiesService; +public class ServerController extends Observable { - @Autowired - private KmlGeneratorService kmlGeneratorService; + private static final String EARTH_SUBDOMAIN = "earth"; //$NON-NLS-1$ - private KmlGenerator kmlGenerator; - private SimplePlacemarkObject lastPlacemark = null; + public static final String SAIKU_RDB_SUFFIX = "Saiku"; //$NON-NLS-1$ + public static final String IPCC_RDB_SUFFIX = "Ipcc"; //$NON-NLS-1$ + + // Make sure that the default ports are the same for Server and Generator + private static final String DEFAULT_PORT = "80"; //$NON-NLS-1$ - private final Logger logger = LoggerFactory.getLogger( PlacemarkBrowserServlet.class ); + public enum ServerInitializationEvent{ + SERVER_STOPPED_EVENT("The Server has stopped"), + SERVER_STARTED_EVENT("The server started without problems"), + SERVER_STARTED_NO_DB_CONNECTION_EVENT("Collect Earth could not start due to a DB connection issue"), + SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT( "Collect Earth started but the PostgreSQL DB could not be reached (SQLite used instead until problems are fixed)"); - private final class OpenBrowserThread extends Thread { + private String message; - private SimplePlacemarkObject placemarkObject; - - private OpenBrowserThread(String name, SimplePlacemarkObject placemarkObject) { - super(name); - this.placemarkObject = placemarkObject; + private ServerInitializationEvent(String message) { + this.message = message; } @Override - public void run() { - // If this is the first plot or the plot is the last one that - // was opened - if (lastPlacemark == null - || !lastPlacemark.equals( placemarkObject ) ) { + public String toString() { + return message; + } - try { - kmlGenerator.fillSamplePoints(placemarkObject); + } - kmlGenerator.fillExternalLine(placemarkObject); + private Server server; + private final Logger logger = LoggerFactory.getLogger(ServerController.class); + private WebAppContext root; + static LocalPropertiesService localPropertiesService; - openGEEAppWindow(placemarkObject); + public WebApplicationContext getContext() { + WebApplicationContext webApplicationContext = null; + try { + webApplicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(getRoot().getServletContext()); + } catch (Exception e) { + logger.error("Error getting web application context", e); //$NON-NLS-1$ + } + return webApplicationContext; + } - openGEECodeEditorWindow(placemarkObject); + private static String getDbURL(final CollectDBDriver collectDBDriver) { + // jdbc:postgresql://hostname:port/dbname - openEarthMapWindow( placemarkObject ); + String url = collectDBDriver.getUrl(); + url = url.replace("REPLACE_HOSTNAME", localPropertiesService.getValue(EarthProperty.DB_HOST)); //$NON-NLS-1$ + url = url.replace("REPLACE_PORT", localPropertiesService.getValue(EarthProperty.DB_PORT)); //$NON-NLS-1$ + url = url.replace("REPLACE_DBNAME", localPropertiesService.getValue(EarthProperty.DB_NAME)); //$NON-NLS-1$ + return url; + } - openTimeLapseWindow(placemarkObject); + private int getPort() { - openBingMapsWindow(placemarkObject); + String webPort = localPropertiesService.getLocalPort(); + if (webPort == null || webPort.isEmpty()) { + webPort = DEFAULT_PORT; + } + return Integer.parseInt(webPort); + } - openBaiduMapsWindow(placemarkObject); + private WebAppContext getRoot() { + return root; + } - openYandexMapsWindow(placemarkObject); + private void setRoot(WebAppContext root) { + this.root = root; + } - openExtraMapWindow(placemarkObject); + private boolean initilizeDataSources() throws IOException, TemplateException { - openStreetViewWindow(placemarkObject); + CollectDBDriver collectDBDriver = localPropertiesService.getCollectDBDriver(); + boolean isConnectionTypeSwitched = false; + if(localPropertiesService.isUsingPostgreSqlDB() && !isPostgreSQLReachable(collectDBDriver) ){ - openPlanetMapsWindow(placemarkObject); + logger.warn("Impossible to reach the PostgreSQL server at " + getDbURL(CollectDBDriver.POSTGRESQL)); + logger.warn("Using the SQLite version until fixed!"); + logger.error("Impossible to reach the PostgreSQL server at " + getDbURL(CollectDBDriver.POSTGRESQL) + " using SQLite version"); + collectDBDriver = CollectDBDriver.SQLITE; + isConnectionTypeSwitched = true; + } - openSecureWatchWindow(placemarkObject); + final File jettyAppCtxTemplateSrc = new File("resources/applicationContext.fmt"); //$NON-NLS-1$ + final File jettyAppCtxDst = new File(EarthConstants.GENERATED_FOLDER + "/applicationContext.xml"); //$NON-NLS-1$ - } catch (TransformException|KmlGenerationException e) { - logger.error("Error generating polygon", e ); - } - } + jettyAppCtxDst.getParentFile().mkdirs(); - lastPlacemark = placemarkObject; + final Map data = new java.util.HashMap<>(); - } + data.put("driver", collectDBDriver.getDriverClass()); //$NON-NLS-1$ + data.put("url", getDbURL(collectDBDriver)); //$NON-NLS-1$ + data.put("urlSaiku", getSaikuDbURL(collectDBDriver)); //$NON-NLS-1$ + data.put("urlIpcc", getIpccDbURL(collectDBDriver)); //$NON-NLS-1$ + data.put("username", localPropertiesService.getValue(EarthProperty.DB_USERNAME)); //$NON-NLS-1$ + data.put("password", localPropertiesService.getValue(EarthProperty.DB_PASSWORD)); //$NON-NLS-1$ + data.put("collectEarthExecutionFolder", System.getProperty("user.dir") + File.separator); //$NON-NLS-1$ //$NON-NLS-2$ + FreemarkerTemplateUtils.applyTemplate(jettyAppCtxTemplateSrc, jettyAppCtxDst, data); - public void openEarthMapWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Earth Map window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openEarthMapURL(placemarkObject); - } catch (final Exception e) { - logger.error("Exception opening Earth Map window", e); //$NON-NLS-1$ - } - } - }.start(); - } - public void openGEECodeEditorWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open GEE Playground window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openGEECodeEditor(placemarkObject); - } catch (final Exception e) { - logger.error("Exception opening Earth Engine Playground window", e); //$NON-NLS-1$ - } - } - }.start(); - } + return isConnectionTypeSwitched; - public void openGEEAppWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open GEE APP window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openGEEAppURL(placemarkObject); - } catch (final Exception e) { - logger.error("Exception opening Earth Engine APP window", e); //$NON-NLS-1$ - } - } - }.start(); - } + } - public void openBingMapsWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Bing Maps window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openBingMaps(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Bing Maps window", e); //$NON-NLS-1$ + private boolean isPostgreSQLReachable(CollectDBDriver collectDBDriver) { + boolean connectionWorked = false; + try ( Connection connection = DriverManager.getConnection( + getDbURL(collectDBDriver), + localPropertiesService.getValue(EarthProperty.DB_USERNAME), + localPropertiesService.getValue(EarthProperty.DB_PASSWORD) + ) ){ + String query="select version()"; + try( Statement s = connection.createStatement() ){ + try( ResultSet rs=s.executeQuery(query) ){ + while(rs.next()) + { + logger.debug( "It works, there are " + rs.getString(1) + " rows on the ofc_record table"); } + connectionWorked = true; } - }.start(); + } } - - - public void openPlanetMapsWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Planet Maps window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openPlanetMaps(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Planet Maps window", e); //$NON-NLS-1$ - } - } - }.start(); + catch(Exception e){ + logger.error("Error while testing the connection to the postgresSQL DB", e); } - public void openSecureWatchWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open SecureWatch window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openSecureWatch(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening SecureWatch window", e); //$NON-NLS-1$ - } - } - }.start(); - } + return connectionWorked; - public void openBaiduMapsWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Baidu Maps window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openBaiduMaps(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Baidu Maps window", e); //$NON-NLS-1$ + } - } - } + public static String getSaikuDbURL(CollectDBDriver collectDBDriver) { + String urlSaikuDB = getDbURL(collectDBDriver); - }.start(); + if (localPropertiesService.isUsingSqliteDB()) { + urlSaikuDB += EarthConstants.SAIKU_RDB_SUFFIX; } + return urlSaikuDB; + } - public void openYandexMapsWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Yandex Maps window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openYandexMaps(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Yandex Maps window", e); //$NON-NLS-1$ - - } - } + public static String getIpccDbURL(CollectDBDriver collectDBDriver) { + String urlIpccDB = getDbURL(collectDBDriver); - }.start(); + if (localPropertiesService.isUsingSqliteDB()) { + urlIpccDB += IPCC_RDB_SUFFIX; } + return urlIpccDB; + } + + public void startServer(Observer observeInitialization) throws Exception { - public void openExtraMapWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Expa Map window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openExtraMap(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Extra Map window", e); //$NON-NLS-1$ + localPropertiesService = new LocalPropertiesService(); - } - } + this.addObserver(observeInitialization); - }.start(); - } + boolean postgresConnectionSwitchedtoSqlite = initilizeDataSources(); + try { - public void openStreetViewWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Street View window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openStreetView(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Street View window", e); //$NON-NLS-1$ + final String webappDirLocation = FolderFinder.getCollectEarthDataFolder(); - } - } + // The port that we should run on can be set into an environment variable + // Look for that variable and default to 8080 if it isn't there. - }.start(); - } + // For log4j 1.2 --> Moving to Log4J2 + //PropertyConfigurator.configure(this.getClass().getResource("/WEB-INF/conf/log4j.properties")); - public void openTimeLapseWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open TimeLapse window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openTimelapse(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Earth Engine window", e); //$NON-NLS-1$ + //server = new Server(new ExecutorThreadPool(10, 50, 5, TimeUnit.SECONDS)); // For JEtty 7 + //server = new Server(new ExecutorThreadPool(50, 50, 5, TimeUnit.MILLISECONDS) ); // For JEtty 9, different parameters for the constructor + server = new Server(new ExecutorThreadPool() ); // For JEtty 9.4, different parameters for the constructor - } - } + // // Use blocking-IO connector to improve throughput + final ServerConnector connector = new ServerConnector(server); + connector.setName( LocalPropertiesService.LOCAL_HOST + ":" + getPort()); //$NON-NLS-1$ + connector.setHost("0.0.0.0"); //$NON-NLS-1$ + //connector.setHost( LocalPropertiesService.LOCAL_HOST ); - }.start(); - } + connector.setPort(getPort()); - } + connector.setStopTimeout(1000); + server.setConnectors(new Connector[] { connector }); - /* - * Opens the extra browser windows for Earth Engine, Timelapse and Bing. (non-Javadoc) - * - * @see - * org.openforis.collect.earth.app.server.JsonPocessorServlet#processRequest - * (javax.servlet.http.HttpServletRequest, - * javax.servlet.http.HttpServletResponse) - */ - @GetMapping(path = "/openAuxiliaryWindows") - public void openAuxiliaryWindows( - HttpServletResponse response, - @RequestParam(value = "latLongCoordinates", required = false) final String latLongCoordinates) - { - try { - SimplePlacemarkObject placemarkObject = new SimplePlacemarkObject(latLongCoordinates.split(",") ); - OpenBrowserThread browserThread = new OpenBrowserThread("Open auxiliary windows " + latLongCoordinates, placemarkObject); - browserThread.start(); - } catch (Exception e) { - logger.error("Error loading browsers " , e); - } - } - - @GetMapping(path = "/ancillaryWindows") - public void openAuxiliaryWindowsNew(HttpServletResponse response, HttpServletRequest request) { + WebAppContext wweAppContext = new WebAppContext(); + setRoot(wweAppContext); + getRoot().setContextPath("/" + EARTH_SUBDOMAIN); //$NON-NLS-1$ - List keyAttributeDefinitions = earthSurveyService - .getRootEntityDefinition() - .getKeyAttributeDefinitions(); + getRoot().setDescriptor(this.getClass().getResource("/WEB-INF/web.xml").toURI().toString()); //$NON-NLS-1$ - // the keys should the the parameter names - Map keys = request.getParameterMap(); - - String[] keysInOrder = new String[keys.size()]; - for (int i = 0; i < keyAttributeDefinitions.size(); i++) { - keysInOrder[i] = keys.get(keyAttributeDefinitions.get(i).getName())[0]; - } + getRoot().setResourceBase(webappDirLocation); - try { - kmlGenerator = kmlGeneratorService.getKmlGenerator(); + // Parent loader priority is a class loader setting that Jetty accepts. + // By default Jetty will behave like most web containers in that it will + // allow your application to replace non-server libraries that are part of the container. + // Setting parent loader priority to true changes this behaviour. + // Read more here: + // http://wiki.eclipse.org/Jetty/Reference/Jetty_Classloading + getRoot().setParentLoaderPriority(true); - String[] csvValues = getValuesFromCsv(keysInOrder); + server.setHandler(getRoot()); + server.setStopAtShutdown(true); + server.start(); + setChanged(); - if( csvValues == null ){ - throw new IllegalArgumentException("The keys " + keys.toString() + " are not present on the CSV file with the plot locations!!!"); + Object attribute = getRoot().getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); + if (attribute instanceof BeanCreationException) { + ( (BeanCreationException) attribute).printStackTrace(System.out); + logger.error("Error creating the database connection", attribute); //$NON-NLS-1$ + notifyObservers(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT); + } else { + if (postgresConnectionSwitchedtoSqlite){ + notifyObservers(ServerInitializationEvent.SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT); + }else{ + notifyObservers(ServerInitializationEvent.SERVER_STARTED_EVENT); + } } - - SimplePlacemarkObject placemarkObject = kmlGenerator.getPlotObject(csvValues, null, earthSurveyService.getCollectSurvey() ); - OpenBrowserThread browserThread = new OpenBrowserThread("Open ancillary windows - polygon ", placemarkObject ); - browserThread.start(); + } catch (final IOException e) { + logger.error("Error initializing local properties", e); //$NON-NLS-1$ } catch (Exception e) { - logger.error("Error loading browsers " , e); + logger.error("Error staring the server", e); //$NON-NLS-1$ } - } - - private String[] getValuesFromCsv(String[] keysInOrder) { - - final String csvFile = localPropertiesService.getCsvFile(); - try ( - CSVReader reader = CsvReaderUtils.getCsvReader( csvFile ); - ){ + // Force the local properties to be loaded before the browserservice is instantiated!! DO NOT REMOVE + getContext().getBean(LocalPropertiesService.class); + this.addObserver(getContext().getBean(BrowserService.class)); + } - String[] csvRow; - int numberOfKeys = keysInOrder.length; - while ((csvRow = reader.readNext()) != null) { - boolean foundIt = true; - for( int idx=0; idx 0) { + hostAndPort = host; + if (port != null && port.length() > 0) { + hostAndPort += ":" + port; //$NON-NLS-1$ } - - }catch(Exception e){ - logger.error("Error reading data from the CSV containing the plot locations ", e); + hostAndPort = "http://" + hostAndPort + "/" + EARTH_SUBDOMAIN + "/"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } - return null; + return hostAndPort; } - } From c2f534fe4acd2556c02b2e0fc09682691cf05046 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:56 +0100 Subject: [PATCH 0085/1620] New translations EarthApp.java (French) --- .../earth/app/view/Messages_fr.properties | 691 +++++++++++------- 1 file changed, 432 insertions(+), 259 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index de96e18020..0777f46090 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,361 +1,534 @@ -package org.openforis.collect.earth.app.server; - -import java.util.List; -import java.util.Map; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.openforis.collect.earth.app.service.BrowserService; -import org.openforis.collect.earth.app.service.EarthSurveyService; +package org.openforis.collect.earth.app.desktop; + +import java.awt.Image; +import java.awt.SplashScreen; +import java.awt.Window; +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.net.MalformedURLException; +import java.net.Socket; +import java.net.URL; +import java.net.URLConnection; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.Observer; + +import javax.swing.ImageIcon; +import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; + +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.SystemUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.desktop.ServerController.ServerInitializationEvent; +import org.openforis.collect.earth.app.logging.GAlogger; +import org.openforis.collect.earth.app.server.LoadProjectFileServlet; +import org.openforis.collect.earth.app.service.EarthProjectsService; +import org.openforis.collect.earth.app.service.FolderFinder; import org.openforis.collect.earth.app.service.KmlGeneratorService; import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; -import org.openforis.collect.earth.sampler.processor.KmlGenerator; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.app.service.UpdateIniUtils; +import org.openforis.collect.earth.app.view.CheckForUpdatesListener; +import org.openforis.collect.earth.app.view.CollectEarthWindow; +import org.openforis.collect.earth.app.view.Messages; +import org.openforis.collect.earth.app.view.PropertiesDialog; import org.openforis.collect.earth.sampler.utils.KmlGenerationException; -import org.openforis.idm.metamodel.AttributeDefinition; -import org.opengis.referencing.operation.TransformException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; -import com.opencsv.CSVReader; +import com.opencsv.exceptions.CsvValidationException; + +import io.sentry.Sentry; +import io.sentry.protocol.User; /** - * Servlet to return the information that is stored in Collect Earth for one - * placemark (plot) + * Contains the main class that starts Collect Earth and opens Google Earth. * * @author Alfonso Sanchez-Paus Diaz * */ -@Controller -public class PlacemarkBrowserServlet { - @Autowired - private BrowserService browserService; +public class EarthApp { - @Autowired - private EarthSurveyService earthSurveyService; + private static Logger logger; + private static ServerController serverController; + private static EarthApp earthApp; - @Autowired - private LocalPropertiesService localPropertiesService; + private static void closeSplash() { + try { + final SplashScreen splash = SplashScreen.getSplashScreen(); + if (splash != null) { + splash.close(); + } + } catch (final IllegalStateException e) { + logger.error("Error closing the splash window", e); //$NON-NLS-1$ + } + } - @Autowired - private KmlGeneratorService kmlGeneratorService; + /** + * Start the application, opening Google Earth and starting the Jetty server. + * + * @param args + * No arguments are used by this method. + */ + public static void main(String[] args) { - private KmlGenerator kmlGenerator; + try { - private SimplePlacemarkObject lastPlacemark = null; + // System property used in the web.xml configuration + System.setProperty("collectEarth.userFolder", FolderFinder.getCollectEarthDataFolder()); //$NON-NLS-1$ - private final Logger logger = LoggerFactory.getLogger( PlacemarkBrowserServlet.class ); + // Specify a browser as http.agent so that calls to CloudFlare hosted OpenForis.org do not return with a 403 http error + System.setProperty("http.agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2"); - private final class OpenBrowserThread extends Thread { + initializeSentry(); - private SimplePlacemarkObject placemarkObject; + // Change of font so that Lao and Thao glyphs are supported + CollectEarthUtils.setFontDependingOnLanguaue( getLocalProperties().getUiLanguage() ); - private OpenBrowserThread(String name, SimplePlacemarkObject placemarkObject) { - super(name); - this.placemarkObject = placemarkObject; - } + logger = LoggerFactory.getLogger(EarthApp.class); - @Override - public void run() { - // If this is the first plot or the plot is the last one that - // was opened - if (lastPlacemark == null - || !lastPlacemark.equals( placemarkObject ) ) { + String doubleClickedProjectFile = null; - try { - kmlGenerator.fillSamplePoints(placemarkObject); + if (args != null && args.length == 1) { + doubleClickedProjectFile = args[0]; + }else if( getProjectsService().getProjectList().size() == 0 ){ + doubleClickedProjectFile = "resources/demo_survey.cep"; + } - kmlGenerator.fillExternalLine(placemarkObject); + if ( SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX){ + handleMacStartup( doubleClickedProjectFile ); + }else{ + startCollectEarth( doubleClickedProjectFile ); + } - openGEEAppWindow(placemarkObject); + } catch (final Exception e) { + // The logger factory has not been initialized, this will not work, just output to console + if (logger != null) { + logger.error("The server could not start", e); //$NON-NLS-1$ + } + System.exit(1); + } finally { + closeSplash(); + } + } - openGEECodeEditorWindow(placemarkObject); + private static void initializeSentry() { + try { + String releaseName= UpdateIniUtils.getReleaseNameInstalled(); - openEarthMapWindow( placemarkObject ); + Sentry.init("https://24dd6a90c1e4461484712db99c3b3bb7:831e42661c5c4ff3aa5eca270db3f619@sentry.io/299626?release="+releaseName+"&maxmessagelength=2000" ); + if( !StringUtils.isEmpty( UpdateIniUtils.getVersionInstalled() ) ) { + Sentry.setTag( "ReleaseDate", UpdateIniUtils.getVersionInstalled() ); + } + if( !StringUtils.isEmpty( getLocalProperties().getOperator() ) ) { + User user = new User(); + user.setUsername( getLocalProperties().getOperator() ); + Sentry.setUser(user); + } - openTimeLapseWindow(placemarkObject); + } catch (Exception e) { + logger.error( "Error initializing Sentry logger" , e); + } + } + /** + * Special code that uses reflection to handle how the application should behave in Mac OS X. + * Without reflection the code provokes compilation-time errors. + * @param doubleClickedProjectFile Project file (CEP) that was clicked + * @throws Exception Throws Exception when the process fails to open the file double-clicked. Initializes the server in any case + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + public static void handleMacStartup(String doubleClickedProjectFile) throws Exception{ + try { + Class applicationClass = Class.forName("com.apple.eawt.Application"); + Method getApplicationMethod = applicationClass.getMethod("getApplication"); + Method setDockIconImageMethod = applicationClass.getMethod( "setDockIconImage", Image.class ); + + Class openFilesHandlerInterface = Class.forName("com.apple.eawt.OpenFilesHandler"); + Method setOpenFileHandlerMethod = applicationClass.getMethod( "setOpenFileHandler", openFilesHandlerInterface ); + + // SET THE MAC OS X DOCK ICON! + // Get an Application object + Object applicationObject = getApplicationMethod.invoke( null ); + try { + Image dockIconImage = new ImageIcon(new File("images/dockIconMac.png").toURI().toURL()).getImage(); + // Invoke the setDockIconImage on the application object using the dockIconImage as an argument + setDockIconImageMethod.invoke(applicationObject, dockIconImage ); + } catch (MalformedURLException e2) { + logger.error("Problems finding the docker icon", e2); + } + // ------------------------------------------- - openBingMapsWindow(placemarkObject); - openBaiduMapsWindow(placemarkObject); + // DEFINE A LISTENER THAT IS REGISTERED BY THE OS TO HEAR DOUBLE-CLICK EVENTS AND REGISTER ITSELF AS THE CEP OPENER + MacOpenFilesInvocationHandler macOpenFileHandlerProxyInterface = new MacOpenFilesInvocationHandler(); + Object openFilesHandlerImplementation = Proxy.newProxyInstance( + applicationClass.getClassLoader(), + new Class[]{ openFilesHandlerInterface }, + macOpenFileHandlerProxyInterface + ); - openYandexMapsWindow(placemarkObject); + // Call the setOpenFileHandler method of the application object using the + setOpenFileHandlerMethod.invoke(applicationObject, ( openFilesHandlerInterface.cast( openFilesHandlerImplementation ) ) ); - openExtraMapWindow(placemarkObject); + // Lets wait for the Apple event to arrive. If it did then the earthApp variable will be non-nulls + Thread.sleep(2000); + if( earthApp == null ){ + startCollectEarth( doubleClickedProjectFile ); + } + } catch (Exception e) { + logger.error("Error while defining the double-click behaviour on CEP files in Mac OS X", e); + startCollectEarth( null ); + } + } - openStreetViewWindow(placemarkObject); + public void generateKml() { - openPlanetMapsWindow(placemarkObject); + try { + getKmlGeneratorService().generateKmlFile(); + } catch (final KmlGenerationException e) { + logger.error("Problems while generating the KML file ", e); //$NON-NLS-1$ + showMessage("Problems while generating the KML file:
" + (e.getCause()!=null?(e.getCause()+"
"):"") + ( e.getMessage().length() > 300?e.getMessage().substring(0,300):e.getMessage() ) + ""); //$NON-NLS-1$ + } catch (final Exception e) { + logger.error("Could not generate KML file", e); //$NON-NLS-1$ + showMessage("Error generating KML file :
" + e.getMessage()); //$NON-NLS-1$ + } + } - openSecureWatchWindow(placemarkObject); + public static void openProjectFileInRunningCollectEarth(String doubleClickedProjecFile) throws IOException { + final File projectFile = new File(doubleClickedProjecFile); - } catch (TransformException|KmlGenerationException e) { - logger.error("Error generating polygon", e ); - } - } + if (projectFile.exists()) { - lastPlacemark = placemarkObject; + String hostAddress = ServerController.getHostAddress( getLocalProperties().getHost(), getLocalProperties().getPort()); - } + URL loadProjectFileInRunningCE = new URL(hostAddress + LoadProjectFileServlet.SERVLET_NAME + + "?" + LoadProjectFileServlet.PROJECT_FILE_PARAMETER + "=" + //$NON-NLS-1$ //$NON-NLS-2$ + URLEncoder.encode(doubleClickedProjecFile, StandardCharsets.UTF_8.name() ) ); + URLConnection urlConn = loadProjectFileInRunningCE.openConnection(); - - public void openEarthMapWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Earth Map window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openEarthMapURL(placemarkObject); - } catch (final Exception e) { - logger.error("Exception opening Earth Map window", e); //$NON-NLS-1$ - } + try( BufferedReader in = new BufferedReader(new InputStreamReader(urlConn.getInputStream())) ){ + String inputLine; + while ((inputLine = in.readLine()) != null) { + logger.info(inputLine); } - }.start(); + } + } + } - public void openGEECodeEditorWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open GEE Playground window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openGEECodeEditor(placemarkObject); - } catch (final Exception e) { - logger.error("Exception opening Earth Engine Playground window", e); //$NON-NLS-1$ - } - } - }.start(); + private static boolean isAnotherCollectEarthRunning(LocalPropertiesService localProperties) { + boolean alreadyRunning = false; + try { + new Socket( LocalPropertiesService.LOCAL_HOST , Integer.parseInt(localProperties.getPort())).close(); //$NON-NLS-1$ + // If here there is something is serving on port 8028 + // So stop it + logger.warn("There is a server already running {}", localProperties.getPort()); //$NON-NLS-1$ + alreadyRunning = true; + } catch (final IOException e) { + // Nothing there, so OK to proceed + logger.info("There is no server running in port {}", localProperties.getPort()); //$NON-NLS-1$ + alreadyRunning = false; + } catch (final NumberFormatException e) { + // Nothing there, so OK to proceed + logger.info("Error parsing integer value {}", localProperties.getPort()); //$NON-NLS-1$ + alreadyRunning = false; } + return alreadyRunning; + } - public void openGEEAppWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open GEE APP window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openGEEAppURL(placemarkObject); - } catch (final Exception e) { - logger.error("Exception opening Earth Engine APP window", e); //$NON-NLS-1$ - } - } - }.start(); + public static void quitServer() { + try { + serverController.stopServer(); + } catch (Exception e) { + logger.error("Error stoping server", e); //$NON-NLS-1$ } + } - public void openBingMapsWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Bing Maps window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openBingMaps(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Bing Maps window", e); //$NON-NLS-1$ - } - } - }.start(); + /** + * Generates the KML for the project and opens it in Google Earth + * @param forceKmlRecreation Set to true if you want to forece the regeneration of the KML even if is is up to date (you might want to do this to force the update of the placemark icons as the date changes) + * @throws IOException Throws exception if the KMl file cannot be generated + * @throws KmlGenerationException Throws exception if the KML file contents cannot be generated + * @throws CsvValidationException + */ + private static synchronized void loadKmlInGoogleEarth(boolean forceKmlRecreation) throws IOException, KmlGenerationException, CsvValidationException { + earthApp.getKmlGeneratorService().generatePlacemarksKmzFile( forceKmlRecreation ); + earthApp.simulateClickKmz(); + } + + public static void restart() { + try { + + serverController.stopServer(); + startServer(null); + + } catch (final Exception e) { + logger.error("Error while stopping server", e); //$NON-NLS-1$ } + } + private static LocalPropertiesService nonManagedPropertiesService; - public void openPlanetMapsWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Planet Maps window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openPlanetMaps(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Planet Maps window", e); //$NON-NLS-1$ - } - } - }.start(); + + private static LocalPropertiesService getLocalProperties() { + if (serverController == null || serverController.getContext() == null) { + if (nonManagedPropertiesService == null) { + nonManagedPropertiesService = new LocalPropertiesService(); + } + return nonManagedPropertiesService; + } else { + return serverController.getContext().getBean(LocalPropertiesService.class); } + } - public void openSecureWatchWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open SecureWatch window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openSecureWatch(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening SecureWatch window", e); //$NON-NLS-1$ - } - } - }.start(); + private static EarthProjectsService getProjectsService() { + if (serverController != null) { + return serverController.getContext().getBean(EarthProjectsService.class); + } else { + final EarthProjectsService earthProjectsService = new EarthProjectsService(); + earthProjectsService.init(getLocalProperties()); + return earthProjectsService; } + } - public void openBaiduMapsWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Baidu Maps window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openBaiduMaps(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Baidu Maps window", e); //$NON-NLS-1$ - } - } + private KmlGeneratorService getKmlGeneratorService() { + if (serverController != null) { + return serverController.getContext().getBean(KmlGeneratorService.class); + } else { + throw new IllegalStateException("The server must be initialized before this method is called"); //$NON-NLS-1$ + } + } - }.start(); + private static void startCollectEarth(final String doubleClickedProjectFile) throws Exception { + logger.info("START - Server Initilization"); //$NON-NLS-1$ + final boolean ceAlreadyOpen = isAnotherCollectEarthRunning( getLocalProperties()); + + if( ceAlreadyOpen ){ + closeSplash(); + // If the user double clicked on a project file while Collect Earth is running then load the project in the running Collect Earth + if (doubleClickedProjectFile!=null) { + openProjectFileInRunningCollectEarth(doubleClickedProjectFile); + }else{ + showMessage(Messages.getString("EarthApp.11")); //$NON-NLS-1$ + } + }else{ + + startServer(doubleClickedProjectFile); } - public void openYandexMapsWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Yandex Maps window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openYandexMaps(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Yandex Maps window", e); //$NON-NLS-1$ + GAlogger.logGAnalytics("Start"); + } - } - } + public static void startServer(final String doubleClickedProjectFile) + throws Exception { + earthApp = new EarthApp(); - }.start(); - } + // Load the double-clicked CEP file before the survey manager is instantiated by the server start-up + earthApp.loadProjectIfDoubleClicked(doubleClickedProjectFile); - public void openExtraMapWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Expa Map window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openExtraMap(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Extra Map window", e); //$NON-NLS-1$ - } + final Observer observeInitialization = getServerObserver(); + serverStartAndOpenGe(observeInitialization); + } + + private static Observer getServerObserver() { + return (observable, initializationEvent) ->{ + if (initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT)) { + serverController = null; } - }.start(); - } + if( initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT) || + initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT) ){ - public void openStreetViewWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Street View window") { //$NON-NLS-1$ - @Override - public void run() { + showMessage( initializationEvent.toString()); + } + + if (!initializationEvent.equals(ServerInitializationEvent.SERVER_STOPPED_EVENT)) { try { - browserService.openStreetView(placemarkObject); + earthApp.generateKml(); + earthApp.simulateClickKmz(); + earthApp.checkForUpdates(); + closeSplash(); } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Street View window", e); //$NON-NLS-1$ - + logger.error("Error generating KML file", e); //$NON-NLS-1$ } } + }; + } - }.start(); + private void openKmlOnGoogleEarth(){ + if (! CollectEarthUtils.openFile( new File(KmlGeneratorService.KML_NETWORK_LINK_STARTER)) ) { + showMessage("The KML file cannot be open at " + KmlGeneratorService.KML_NETWORK_LINK_STARTER); //$NON-NLS-1$ } + } - public void openTimeLapseWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open TimeLapse window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openTimelapse(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Earth Engine window", e); //$NON-NLS-1$ + private void checkForUpdates() { + new Thread("Check for new Collect Earth versions on the server") { + @Override + public void run() { - } + // Wait a few seconds before checking for updates + try { + Thread.sleep(10000); + } catch (InterruptedException e1) { + logger.error("Error while waiting", e1); //$NON-NLS-1$ } - }.start(); - } + final UpdateIniUtils updateIniUtils = new UpdateIniUtils(); - } + if (updateIniUtils.shouldWarnUser(getLocalProperties() )) { - /* - * Opens the extra browser windows for Earth Engine, Timelapse and Bing. (non-Javadoc) - * - * @see - * org.openforis.collect.earth.app.server.JsonPocessorServlet#processRequest - * (javax.servlet.http.HttpServletRequest, - * javax.servlet.http.HttpServletResponse) - */ - @GetMapping(path = "/openAuxiliaryWindows") - public void openAuxiliaryWindows( - HttpServletResponse response, - @RequestParam(value = "latLongCoordinates", required = false) final String latLongCoordinates) - { - try { - SimplePlacemarkObject placemarkObject = new SimplePlacemarkObject(latLongCoordinates.split(",") ); - OpenBrowserThread browserThread = new OpenBrowserThread("Open auxiliary windows " + latLongCoordinates, placemarkObject); - browserThread.start(); - } catch (Exception e) { - logger.error("Error loading browsers " , e); - } - } + javax.swing.SwingUtilities.invokeLater( () -> { + String remindLater = Messages.getString("EarthApp.3"); //$NON-NLS-1$ + String doItNow = Messages.getString("EarthApp.4"); //$NON-NLS-1$ + String doNotBother = Messages.getString("EarthApp.5"); //$NON-NLS-1$ - @GetMapping(path = "/ancillaryWindows") - public void openAuxiliaryWindowsNew(HttpServletResponse response, HttpServletRequest request) { + String newestVersionOnline = updateIniUtils.getVersionAvailableOnline(); + if( StringUtils.isNotBlank( newestVersionOnline ) ) { - List keyAttributeDefinitions = earthSurveyService - .getRootEntityDefinition() - .getKeyAttributeDefinitions(); + Object[] possibleValues = { remindLater, doItNow, doNotBother }; + int chosenOption = JOptionPane.showOptionDialog(null, + Messages.getString("EarthApp.57"), Messages.getString("EarthApp.58") + Messages.getString("EarthApp.6") + updateIniUtils.convertToDate(newestVersionOnline), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, possibleValues, possibleValues[0]); + if( chosenOption != JOptionPane.CLOSED_OPTION ){ + if (possibleValues[chosenOption].equals(doItNow)) { + CheckForUpdatesListener checkForUpdatesListener = new CheckForUpdatesListener(); + checkForUpdatesListener.actionPerformed(null); + } else if (possibleValues[chosenOption].equals(doNotBother)) { + getLocalProperties().setValue(EarthProperty.LAST_IGNORED_UPDATE, newestVersionOnline); + } + } + } + }); + } + } + }.start(); - // the keys should the the parameter names - Map keys = request.getParameterMap(); + } - String[] keysInOrder = new String[keys.size()]; - for (int i = 0; i < keyAttributeDefinitions.size(); i++) { - keysInOrder[i] = keys.get(keyAttributeDefinitions.get(i).getName())[0]; - } + /** + * If Collect Earth is started by double clicking on a ".cep" file ( Collect Earth Project file ) + * Then it should open directly with that project in focus + * + * @param doubleClickedProjecFile + * The path to the CEP file that was double-clicked + * + */ + private void loadProjectIfDoubleClicked(String doubleClickedProjectFile) { try { - kmlGenerator = kmlGeneratorService.getKmlGenerator(); + if (doubleClickedProjectFile != null) { - String[] csvValues = getValuesFromCsv(keysInOrder); + final File projectFile = new File(doubleClickedProjectFile); - if( csvValues == null ){ - throw new IllegalArgumentException("The keys " + keys.toString() + " are not present on the CSV file with the plot locations!!!"); + if (projectFile.exists()) { + getProjectsService().loadCompressedProjectFile(projectFile); + } } + } catch (final Exception e) { + showMessage(Messages.getString("EarthApp.59")); //$NON-NLS-1$ + logger.error(Messages.getString("EarthApp.59"), e);//$NON-NLS-1$ + } + } - SimplePlacemarkObject placemarkObject = kmlGenerator.getPlotObject(csvValues, null, earthSurveyService.getCollectSurvey() ); - OpenBrowserThread browserThread = new OpenBrowserThread("Open ancillary windows - polygon ", placemarkObject ); - browserThread.start(); - } catch (Exception e) { - logger.error("Error loading browsers " , e); + private static void serverStartAndOpenGe(Observer observeInitialization) throws Exception { + serverController = new ServerController(); + serverController.deleteObservers(); + serverController.startServer(observeInitialization); + + // Inform Mac OS users of the issues about opening CEP files in the Mac version of CE + if(SystemUtils.IS_OS_MAC_OSX ) { + showMessage( + "" //$NON-NLS-1$ + + "" //$NON-NLS-1$ + + Messages.getString("EarthApp.70") + + ": " //$NON-NLS-1$ + + Messages.getString("EarthApp.71") + + Messages.getString("EarthApp.72") + + "" //$NON-NLS-1$ + + Messages.getString("CollectEarthWindow.10") + + " -> " //$NON-NLS-1$ + + Messages.getString("CollectEarthMenu.0") + + "", //$NON-NLS-1$ + Messages.getString("EarthApp.73") + ); } + } + + public static void showMessage(String message) { + showMessage(message, "Collect Earth"); } - private String[] getValuesFromCsv(String[] keysInOrder) { + public static void showMessage(String message, String title) { + try { + SwingUtilities.invokeLater( + () -> JOptionPane.showMessageDialog(null, message, title, JOptionPane.WARNING_MESSAGE) + ); + } catch (Exception e) { + logger.error("Error showing message",e); + } - final String csvFile = localPropertiesService.getCsvFile(); - try ( - CSVReader reader = CsvReaderUtils.getCsvReader( csvFile ); - ){ + } + private void simulateClickKmz() { + try { + getKmlGeneratorService().generateLoaderKmlFile(); + openKmlOnGoogleEarth(); + } catch (final Exception e) { + showMessage(Messages.getString("EarthApp.61")); //$NON-NLS-1$ + logger.error("The KMZ file could not be found", e); //$NON-NLS-1$ + } + } - String[] csvRow; - int numberOfKeys = keysInOrder.length; - while ((csvRow = reader.readNext()) != null) { - boolean foundIt = true; - for( int idx=0; idx { + if( windowShowingTimer != null ){ + CollectEarthWindow.startWaiting(windowShowingTimer); + } + }); + + EarthApp.loadKmlInGoogleEarth(true); + + } catch (Exception e) { + logger.error("Error loading the KML",e); + EarthApp.showMessage("Problems while generating the KML file:
" + + (e.getCause()!=null?(e.getCause()+"
"):"") + + ( + ( e.getMessage()!=null && e.getMessage().length() > 300 ) ? e.getMessage().substring(0,300) : + ( e.getMessage()!=null ) ? e.getMessage() : "" + ) + ""); //$NON-NLS-1$ + }finally{ + if( windowShowingTimer != null ){ + try { + SwingUtilities.invokeLater( () -> { + CollectEarthWindow.endWaiting(windowShowingTimer); + if( windowShowingTimer instanceof PropertiesDialog ){ + ( (PropertiesDialog) windowShowingTimer).closeDialog(); + } + }); + } catch (Exception e2) { + logger.error("Error closing Options dialog", e2); + } } } - if( foundIt ){ - return csvRow; - } - } - - - }catch(Exception e){ - logger.error("Error reading data from the CSV containing the plot locations ", e); - } - return null; - + }.start(); } + } From 6ef7f3fee693ca3443121bb1dd279be668bc8d17 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:57 +0100 Subject: [PATCH 0086/1620] New translations EarthApp.java (Spanish) --- .../earth/app/view/Messages_es.properties | 545 ++++++++++++++++-- 1 file changed, 509 insertions(+), 36 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index f5ef63f5c6..0777f46090 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,61 +1,534 @@ -package org.openforis.collect.earth.app.model; +package org.openforis.collect.earth.app.desktop; + +import java.awt.Image; +import java.awt.SplashScreen; +import java.awt.Window; +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.net.MalformedURLException; +import java.net.Socket; +import java.net.URL; +import java.net.URLConnection; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.Observer; + +import javax.swing.ImageIcon; +import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.SystemUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.desktop.ServerController.ServerInitializationEvent; +import org.openforis.collect.earth.app.logging.GAlogger; +import org.openforis.collect.earth.app.server.LoadProjectFileServlet; +import org.openforis.collect.earth.app.service.EarthProjectsService; +import org.openforis.collect.earth.app.service.FolderFinder; +import org.openforis.collect.earth.app.service.KmlGeneratorService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.app.service.UpdateIniUtils; +import org.openforis.collect.earth.app.view.CheckForUpdatesListener; +import org.openforis.collect.earth.app.view.CollectEarthWindow; import org.openforis.collect.earth.app.view.Messages; +import org.openforis.collect.earth.app.view.PropertiesDialog; +import org.openforis.collect.earth.sampler.utils.KmlGenerationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.opencsv.exceptions.CsvValidationException; + +import io.sentry.Sentry; +import io.sentry.protocol.User; /** - * Enumeration of the dynamics that Collect Earth can use to classify the plots. - * + * Contains the main class that starts Collect Earth and opens Google Earth. + * * @author Alfonso Sanchez-Paus Diaz - * + * */ -public enum DynamicsCode { - FROM_FOREST(Messages.getString("DynamicsCode.0"), 1), FROM_GRASSLAND(Messages.getString("DynamicsCode.1"), 3), FROM_SETTLEMENT(Messages.getString("DynamicsCode.2"), 4), FROM_OTHERLAND(Messages.getString("DynamicsCode.3"), 5), FROM_WETLAND(Messages.getString("DynamicsCode.4"), 6), FROM_CROPLAND(Messages.getString("DynamicsCode.5"), 7), NA("NA", 8); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ +public class EarthApp { + + private static Logger logger; + private static ServerController serverController; + private static EarthApp earthApp; + + private static void closeSplash() { + try { + final SplashScreen splash = SplashScreen.getSplashScreen(); + if (splash != null) { + splash.close(); + } + } catch (final IllegalStateException e) { + logger.error("Error closing the splash window", e); //$NON-NLS-1$ + } + } + + /** + * Start the application, opening Google Earth and starting the Jetty server. + * + * @param args + * No arguments are used by this method. + */ + public static void main(String[] args) { + + try { + + // System property used in the web.xml configuration + System.setProperty("collectEarth.userFolder", FolderFinder.getCollectEarthDataFolder()); //$NON-NLS-1$ + + // Specify a browser as http.agent so that calls to CloudFlare hosted OpenForis.org do not return with a 403 http error + System.setProperty("http.agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2"); + + initializeSentry(); + + // Change of font so that Lao and Thao glyphs are supported + CollectEarthUtils.setFontDependingOnLanguaue( getLocalProperties().getUiLanguage() ); + + logger = LoggerFactory.getLogger(EarthApp.class); + + String doubleClickedProjectFile = null; + + if (args != null && args.length == 1) { + doubleClickedProjectFile = args[0]; + }else if( getProjectsService().getProjectList().size() == 0 ){ + doubleClickedProjectFile = "resources/demo_survey.cep"; + } + + if ( SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX){ + handleMacStartup( doubleClickedProjectFile ); + }else{ + startCollectEarth( doubleClickedProjectFile ); + } + + } catch (final Exception e) { + // The logger factory has not been initialized, this will not work, just output to console + if (logger != null) { + logger.error("The server could not start", e); //$NON-NLS-1$ + } + System.exit(1); + } finally { + closeSplash(); + } + } + + private static void initializeSentry() { + try { + String releaseName= UpdateIniUtils.getReleaseNameInstalled(); + + Sentry.init("https://24dd6a90c1e4461484712db99c3b3bb7:831e42661c5c4ff3aa5eca270db3f619@sentry.io/299626?release="+releaseName+"&maxmessagelength=2000" ); + if( !StringUtils.isEmpty( UpdateIniUtils.getVersionInstalled() ) ) { + Sentry.setTag( "ReleaseDate", UpdateIniUtils.getVersionInstalled() ); + } + if( !StringUtils.isEmpty( getLocalProperties().getOperator() ) ) { + User user = new User(); + user.setUsername( getLocalProperties().getOperator() ); + Sentry.setUser(user); + } + + } catch (Exception e) { + logger.error( "Error initializing Sentry logger" , e); + } + } + /** + * Special code that uses reflection to handle how the application should behave in Mac OS X. + * Without reflection the code provokes compilation-time errors. + * @param doubleClickedProjectFile Project file (CEP) that was clicked + * @throws Exception Throws Exception when the process fails to open the file double-clicked. Initializes the server in any case + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + public static void handleMacStartup(String doubleClickedProjectFile) throws Exception{ + try { + Class applicationClass = Class.forName("com.apple.eawt.Application"); + Method getApplicationMethod = applicationClass.getMethod("getApplication"); + Method setDockIconImageMethod = applicationClass.getMethod( "setDockIconImage", Image.class ); + + Class openFilesHandlerInterface = Class.forName("com.apple.eawt.OpenFilesHandler"); + Method setOpenFileHandlerMethod = applicationClass.getMethod( "setOpenFileHandler", openFilesHandlerInterface ); + + // SET THE MAC OS X DOCK ICON! + // Get an Application object + Object applicationObject = getApplicationMethod.invoke( null ); + try { + Image dockIconImage = new ImageIcon(new File("images/dockIconMac.png").toURI().toURL()).getImage(); + // Invoke the setDockIconImage on the application object using the dockIconImage as an argument + setDockIconImageMethod.invoke(applicationObject, dockIconImage ); + } catch (MalformedURLException e2) { + logger.error("Problems finding the docker icon", e2); + } + // ------------------------------------------- - private String label; - private int id; + // DEFINE A LISTENER THAT IS REGISTERED BY THE OS TO HEAR DOUBLE-CLICK EVENTS AND REGISTER ITSELF AS THE CEP OPENER + MacOpenFilesInvocationHandler macOpenFileHandlerProxyInterface = new MacOpenFilesInvocationHandler(); + Object openFilesHandlerImplementation = Proxy.newProxyInstance( + applicationClass.getClassLoader(), + new Class[]{ openFilesHandlerInterface }, + macOpenFileHandlerProxyInterface + ); - private DynamicsCode(String label, int id) { - this.label = label; - this.id = id; + // Call the setOpenFileHandler method of the application object using the + setOpenFileHandlerMethod.invoke(applicationObject, ( openFilesHandlerInterface.cast( openFilesHandlerImplementation ) ) ); + + // Lets wait for the Apple event to arrive. If it did then the earthApp variable will be non-nulls + Thread.sleep(2000); + if( earthApp == null ){ + startCollectEarth( doubleClickedProjectFile ); + } + } catch (Exception e) { + logger.error("Error while defining the double-click behaviour on CEP files in Mac OS X", e); + startCollectEarth( null ); + } + } + + public void generateKml() { + + try { + getKmlGeneratorService().generateKmlFile(); + } catch (final KmlGenerationException e) { + logger.error("Problems while generating the KML file ", e); //$NON-NLS-1$ + showMessage("Problems while generating the KML file:
" + (e.getCause()!=null?(e.getCause()+"
"):"") + ( e.getMessage().length() > 300?e.getMessage().substring(0,300):e.getMessage() ) + ""); //$NON-NLS-1$ + } catch (final Exception e) { + logger.error("Could not generate KML file", e); //$NON-NLS-1$ + showMessage("Error generating KML file :
" + e.getMessage()); //$NON-NLS-1$ + } + } + + public static void openProjectFileInRunningCollectEarth(String doubleClickedProjecFile) throws IOException { + final File projectFile = new File(doubleClickedProjecFile); + + if (projectFile.exists()) { + + String hostAddress = ServerController.getHostAddress( getLocalProperties().getHost(), getLocalProperties().getPort()); + + URL loadProjectFileInRunningCE = new URL(hostAddress + LoadProjectFileServlet.SERVLET_NAME + + "?" + LoadProjectFileServlet.PROJECT_FILE_PARAMETER + "=" + //$NON-NLS-1$ //$NON-NLS-2$ + URLEncoder.encode(doubleClickedProjecFile, StandardCharsets.UTF_8.name() ) ); + URLConnection urlConn = loadProjectFileInRunningCE.openConnection(); + + try( BufferedReader in = new BufferedReader(new InputStreamReader(urlConn.getInputStream())) ){ + String inputLine; + while ((inputLine = in.readLine()) != null) { + logger.info(inputLine); + } + } + + } } - public int getId() { - return id; + private static boolean isAnotherCollectEarthRunning(LocalPropertiesService localProperties) { + boolean alreadyRunning = false; + try { + new Socket( LocalPropertiesService.LOCAL_HOST , Integer.parseInt(localProperties.getPort())).close(); //$NON-NLS-1$ + // If here there is something is serving on port 8028 + // So stop it + logger.warn("There is a server already running {}", localProperties.getPort()); //$NON-NLS-1$ + alreadyRunning = true; + } catch (final IOException e) { + // Nothing there, so OK to proceed + logger.info("There is no server running in port {}", localProperties.getPort()); //$NON-NLS-1$ + alreadyRunning = false; + } catch (final NumberFormatException e) { + // Nothing there, so OK to proceed + logger.info("Error parsing integer value {}", localProperties.getPort()); //$NON-NLS-1$ + alreadyRunning = false; + } + return alreadyRunning; + } + + public static void quitServer() { + try { + serverController.stopServer(); + } catch (Exception e) { + logger.error("Error stoping server", e); //$NON-NLS-1$ + } + } + + /** + * Generates the KML for the project and opens it in Google Earth + * @param forceKmlRecreation Set to true if you want to forece the regeneration of the KML even if is is up to date (you might want to do this to force the update of the placemark icons as the date changes) + * @throws IOException Throws exception if the KMl file cannot be generated + * @throws KmlGenerationException Throws exception if the KML file contents cannot be generated + * @throws CsvValidationException + */ + private static synchronized void loadKmlInGoogleEarth(boolean forceKmlRecreation) throws IOException, KmlGenerationException, CsvValidationException { + earthApp.getKmlGeneratorService().generatePlacemarksKmzFile( forceKmlRecreation ); + earthApp.simulateClickKmz(); + } + + public static void restart() { + try { + + serverController.stopServer(); + startServer(null); + + } catch (final Exception e) { + logger.error("Error while stopping server", e); //$NON-NLS-1$ + } } - public String getLabel() { - return label; + private static LocalPropertiesService nonManagedPropertiesService; + + + private static LocalPropertiesService getLocalProperties() { + if (serverController == null || serverController.getContext() == null) { + if (nonManagedPropertiesService == null) { + nonManagedPropertiesService = new LocalPropertiesService(); + } + return nonManagedPropertiesService; + } else { + return serverController.getContext().getBean(LocalPropertiesService.class); + } } - public void setId(int id) { - this.id = id; + private static EarthProjectsService getProjectsService() { + if (serverController != null) { + return serverController.getContext().getBean(EarthProjectsService.class); + } else { + final EarthProjectsService earthProjectsService = new EarthProjectsService(); + earthProjectsService.init(getLocalProperties()); + return earthProjectsService; + } } - @Override - public String toString() { - return label; + + private KmlGeneratorService getKmlGeneratorService() { + if (serverController != null) { + return serverController.getContext().getBean(KmlGeneratorService.class); + } else { + throw new IllegalStateException("The server must be initialized before this method is called"); //$NON-NLS-1$ + } } - public static Integer getDynamicsCode(String landUseSubcategory) { - if( landUseSubcategory.startsWith("FLto") ){ //$NON-NLS-1$ - return FROM_FOREST.getId(); - }else if( landUseSubcategory.startsWith("CLto") ){ //$NON-NLS-1$ - return FROM_CROPLAND.getId(); - }else if( landUseSubcategory.startsWith("SLto") ){ //$NON-NLS-1$ - return FROM_SETTLEMENT.getId(); - }else if( landUseSubcategory.startsWith("WLto") ){ //$NON-NLS-1$ - return FROM_WETLAND.getId(); - }else if( landUseSubcategory.startsWith("GLto") ){ //$NON-NLS-1$ - return FROM_GRASSLAND.getId(); - }else if( landUseSubcategory.startsWith("OLto") || landUseSubcategory.startsWith("OTto")){ //$NON-NLS-1$ //$NON-NLS-2$ - return FROM_OTHERLAND.getId(); - }else if ( StringUtils.isBlank( landUseSubcategory )) { - throw new IllegalArgumentException("The land use subcategory " + landUseSubcategory + " is not recognizable."); //$NON-NLS-1$ //$NON-NLS-2$ + private static void startCollectEarth(final String doubleClickedProjectFile) throws Exception { + logger.info("START - Server Initilization"); //$NON-NLS-1$ + final boolean ceAlreadyOpen = isAnotherCollectEarthRunning( getLocalProperties()); + + if( ceAlreadyOpen ){ + closeSplash(); + // If the user double clicked on a project file while Collect Earth is running then load the project in the running Collect Earth + if (doubleClickedProjectFile!=null) { + openProjectFileInRunningCollectEarth(doubleClickedProjectFile); + }else{ + showMessage(Messages.getString("EarthApp.11")); //$NON-NLS-1$ + } }else{ - return NA.getId(); + + startServer(doubleClickedProjectFile); + } + + GAlogger.logGAnalytics("Start"); + } + + public static void startServer(final String doubleClickedProjectFile) + throws Exception { + earthApp = new EarthApp(); + + // Load the double-clicked CEP file before the survey manager is instantiated by the server start-up + earthApp.loadProjectIfDoubleClicked(doubleClickedProjectFile); + + + final Observer observeInitialization = getServerObserver(); + serverStartAndOpenGe(observeInitialization); + } + + private static Observer getServerObserver() { + return (observable, initializationEvent) ->{ + if (initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT)) { + serverController = null; + } + + if( initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT) || + initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT) ){ + + showMessage( initializationEvent.toString()); + } + + if (!initializationEvent.equals(ServerInitializationEvent.SERVER_STOPPED_EVENT)) { + try { + earthApp.generateKml(); + earthApp.simulateClickKmz(); + earthApp.checkForUpdates(); + closeSplash(); + } catch (final Exception e) { + logger.error("Error generating KML file", e); //$NON-NLS-1$ + } + } + }; + } + + private void openKmlOnGoogleEarth(){ + if (! CollectEarthUtils.openFile( new File(KmlGeneratorService.KML_NETWORK_LINK_STARTER)) ) { + showMessage("The KML file cannot be open at " + KmlGeneratorService.KML_NETWORK_LINK_STARTER); //$NON-NLS-1$ + } + } + + private void checkForUpdates() { + new Thread("Check for new Collect Earth versions on the server") { + @Override + public void run() { + + // Wait a few seconds before checking for updates + try { + Thread.sleep(10000); + } catch (InterruptedException e1) { + logger.error("Error while waiting", e1); //$NON-NLS-1$ + } + + final UpdateIniUtils updateIniUtils = new UpdateIniUtils(); + + + if (updateIniUtils.shouldWarnUser(getLocalProperties() )) { + + javax.swing.SwingUtilities.invokeLater( () -> { + String remindLater = Messages.getString("EarthApp.3"); //$NON-NLS-1$ + String doItNow = Messages.getString("EarthApp.4"); //$NON-NLS-1$ + String doNotBother = Messages.getString("EarthApp.5"); //$NON-NLS-1$ + + String newestVersionOnline = updateIniUtils.getVersionAvailableOnline(); + + if( StringUtils.isNotBlank( newestVersionOnline ) ) { + + Object[] possibleValues = { remindLater, doItNow, doNotBother }; + int chosenOption = JOptionPane.showOptionDialog(null, + Messages.getString("EarthApp.57"), Messages.getString("EarthApp.58") + Messages.getString("EarthApp.6") + updateIniUtils.convertToDate(newestVersionOnline), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, possibleValues, possibleValues[0]); + if( chosenOption != JOptionPane.CLOSED_OPTION ){ + if (possibleValues[chosenOption].equals(doItNow)) { + CheckForUpdatesListener checkForUpdatesListener = new CheckForUpdatesListener(); + checkForUpdatesListener.actionPerformed(null); + } else if (possibleValues[chosenOption].equals(doNotBother)) { + getLocalProperties().setValue(EarthProperty.LAST_IGNORED_UPDATE, newestVersionOnline); + } + } + } + }); + } + } + }.start(); + + } + + + /** + * If Collect Earth is started by double clicking on a ".cep" file ( Collect Earth Project file ) + * Then it should open directly with that project in focus + * + * @param doubleClickedProjecFile + * The path to the CEP file that was double-clicked + * + */ + private void loadProjectIfDoubleClicked(String doubleClickedProjectFile) { + try { + if (doubleClickedProjectFile != null) { + + final File projectFile = new File(doubleClickedProjectFile); + + if (projectFile.exists()) { + getProjectsService().loadCompressedProjectFile(projectFile); + } + } + } catch (final Exception e) { + showMessage(Messages.getString("EarthApp.59")); //$NON-NLS-1$ + logger.error(Messages.getString("EarthApp.59"), e);//$NON-NLS-1$ + } + } + + private static void serverStartAndOpenGe(Observer observeInitialization) throws Exception { + serverController = new ServerController(); + serverController.deleteObservers(); + serverController.startServer(observeInitialization); + + // Inform Mac OS users of the issues about opening CEP files in the Mac version of CE + if(SystemUtils.IS_OS_MAC_OSX ) { + showMessage( + "" //$NON-NLS-1$ + + "" //$NON-NLS-1$ + + Messages.getString("EarthApp.70") + + ": " //$NON-NLS-1$ + + Messages.getString("EarthApp.71") + + Messages.getString("EarthApp.72") + + "" //$NON-NLS-1$ + + Messages.getString("CollectEarthWindow.10") + + " -> " //$NON-NLS-1$ + + Messages.getString("CollectEarthMenu.0") + + "", //$NON-NLS-1$ + Messages.getString("EarthApp.73") + ); + } + } + + public static void showMessage(String message) { + showMessage(message, "Collect Earth"); + + } + + public static void showMessage(String message, String title) { + try { + SwingUtilities.invokeLater( + () -> JOptionPane.showMessageDialog(null, message, title, JOptionPane.WARNING_MESSAGE) + ); + } catch (Exception e) { + logger.error("Error showing message",e); + } + + } + + private void simulateClickKmz() { + try { + getKmlGeneratorService().generateLoaderKmlFile(); + openKmlOnGoogleEarth(); + } catch (final Exception e) { + showMessage(Messages.getString("EarthApp.61")); //$NON-NLS-1$ + logger.error("The KMZ file could not be found", e); //$NON-NLS-1$ } } + public static void executeKmlLoadAsynchronously( Window windowShowingTimer ) { + new Thread("Load KML in Google Earth"){ + @Override + public void run() { + // Only regenerate KML and reload + try { + SwingUtilities.invokeLater( ( ) -> { + if( windowShowingTimer != null ){ + CollectEarthWindow.startWaiting(windowShowingTimer); + } + }); + + EarthApp.loadKmlInGoogleEarth(true); + + } catch (Exception e) { + logger.error("Error loading the KML",e); + EarthApp.showMessage("Problems while generating the KML file:
" + + (e.getCause()!=null?(e.getCause()+"
"):"") + + ( + ( e.getMessage()!=null && e.getMessage().length() > 300 ) ? e.getMessage().substring(0,300) : + ( e.getMessage()!=null ) ? e.getMessage() : "" + ) + ""); //$NON-NLS-1$ + }finally{ + if( windowShowingTimer != null ){ + try { + SwingUtilities.invokeLater( () -> { + CollectEarthWindow.endWaiting(windowShowingTimer); + if( windowShowingTimer instanceof PropertiesDialog ){ + ( (PropertiesDialog) windowShowingTimer).closeDialog(); + } + }); + } catch (Exception e2) { + logger.error("Error closing Options dialog", e2); + } + } + } + + } + }.start(); + } + + } From 7d152f5c9790ba0ab87035ff9cc37911a992356b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:22:58 +0100 Subject: [PATCH 0087/1620] New translations EarthApp.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 625 ++++++++++++------ 1 file changed, 434 insertions(+), 191 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 5b52f161d0..0777f46090 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,291 +1,534 @@ package org.openforis.collect.earth.app.desktop; +import java.awt.Image; +import java.awt.SplashScreen; +import java.awt.Window; +import java.io.BufferedReader; import java.io.File; import java.io.IOException; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.ResultSet; -import java.sql.Statement; -import java.util.Map; -import java.util.Observable; +import java.io.InputStreamReader; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.net.MalformedURLException; +import java.net.Socket; +import java.net.URL; +import java.net.URLConnection; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.util.Observer; -import org.eclipse.jetty.server.Connector; -import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.server.ServerConnector; -import org.eclipse.jetty.util.thread.ExecutorThreadPool; -import org.eclipse.jetty.webapp.WebAppContext; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; -import org.openforis.collect.earth.app.service.BrowserService; +import javax.swing.ImageIcon; +import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; + +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.SystemUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.desktop.ServerController.ServerInitializationEvent; +import org.openforis.collect.earth.app.logging.GAlogger; +import org.openforis.collect.earth.app.server.LoadProjectFileServlet; +import org.openforis.collect.earth.app.service.EarthProjectsService; import org.openforis.collect.earth.app.service.FolderFinder; +import org.openforis.collect.earth.app.service.KmlGeneratorService; import org.openforis.collect.earth.app.service.LocalPropertiesService; import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; +import org.openforis.collect.earth.app.service.UpdateIniUtils; +import org.openforis.collect.earth.app.view.CheckForUpdatesListener; +import org.openforis.collect.earth.app.view.CollectEarthWindow; +import org.openforis.collect.earth.app.view.Messages; +import org.openforis.collect.earth.app.view.PropertiesDialog; +import org.openforis.collect.earth.sampler.utils.KmlGenerationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.BeanCreationException; -import org.springframework.web.context.WebApplicationContext; -import org.springframework.web.context.support.WebApplicationContextUtils; -import freemarker.template.TemplateException; +import com.opencsv.exceptions.CsvValidationException; + +import io.sentry.Sentry; +import io.sentry.protocol.User; /** - * Controls the Jetty server, starting and stopping it as well as reporting its staus. + * Contains the main class that starts Collect Earth and opens Google Earth. * * @author Alfonso Sanchez-Paus Diaz * */ -public class ServerController extends Observable { +public class EarthApp { + + private static Logger logger; + private static ServerController serverController; + private static EarthApp earthApp; + + private static void closeSplash() { + try { + final SplashScreen splash = SplashScreen.getSplashScreen(); + if (splash != null) { + splash.close(); + } + } catch (final IllegalStateException e) { + logger.error("Error closing the splash window", e); //$NON-NLS-1$ + } + } - private static final String EARTH_SUBDOMAIN = "earth"; //$NON-NLS-1$ + /** + * Start the application, opening Google Earth and starting the Jetty server. + * + * @param args + * No arguments are used by this method. + */ + public static void main(String[] args) { + try { - public static final String SAIKU_RDB_SUFFIX = "Saiku"; //$NON-NLS-1$ - public static final String IPCC_RDB_SUFFIX = "Ipcc"; //$NON-NLS-1$ - - // Make sure that the default ports are the same for Server and Generator - private static final String DEFAULT_PORT = "80"; //$NON-NLS-1$ + // System property used in the web.xml configuration + System.setProperty("collectEarth.userFolder", FolderFinder.getCollectEarthDataFolder()); //$NON-NLS-1$ - public enum ServerInitializationEvent{ - SERVER_STOPPED_EVENT("The Server has stopped"), - SERVER_STARTED_EVENT("The server started without problems"), - SERVER_STARTED_NO_DB_CONNECTION_EVENT("Collect Earth could not start due to a DB connection issue"), - SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT( "Collect Earth started but the PostgreSQL DB could not be reached (SQLite used instead until problems are fixed)"); + // Specify a browser as http.agent so that calls to CloudFlare hosted OpenForis.org do not return with a 403 http error + System.setProperty("http.agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2"); - private String message; + initializeSentry(); - private ServerInitializationEvent(String message) { - this.message = message; - } + // Change of font so that Lao and Thao glyphs are supported + CollectEarthUtils.setFontDependingOnLanguaue( getLocalProperties().getUiLanguage() ); - @Override - public String toString() { - return message; - } + logger = LoggerFactory.getLogger(EarthApp.class); - } + String doubleClickedProjectFile = null; - private Server server; - private final Logger logger = LoggerFactory.getLogger(ServerController.class); - private WebAppContext root; - static LocalPropertiesService localPropertiesService; + if (args != null && args.length == 1) { + doubleClickedProjectFile = args[0]; + }else if( getProjectsService().getProjectList().size() == 0 ){ + doubleClickedProjectFile = "resources/demo_survey.cep"; + } - public WebApplicationContext getContext() { - WebApplicationContext webApplicationContext = null; + if ( SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX){ + handleMacStartup( doubleClickedProjectFile ); + }else{ + startCollectEarth( doubleClickedProjectFile ); + } + + } catch (final Exception e) { + // The logger factory has not been initialized, this will not work, just output to console + if (logger != null) { + logger.error("The server could not start", e); //$NON-NLS-1$ + } + System.exit(1); + } finally { + closeSplash(); + } + } + + private static void initializeSentry() { try { - webApplicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(getRoot().getServletContext()); + String releaseName= UpdateIniUtils.getReleaseNameInstalled(); + + Sentry.init("https://24dd6a90c1e4461484712db99c3b3bb7:831e42661c5c4ff3aa5eca270db3f619@sentry.io/299626?release="+releaseName+"&maxmessagelength=2000" ); + if( !StringUtils.isEmpty( UpdateIniUtils.getVersionInstalled() ) ) { + Sentry.setTag( "ReleaseDate", UpdateIniUtils.getVersionInstalled() ); + } + if( !StringUtils.isEmpty( getLocalProperties().getOperator() ) ) { + User user = new User(); + user.setUsername( getLocalProperties().getOperator() ); + Sentry.setUser(user); + } + } catch (Exception e) { - logger.error("Error getting web application context", e); //$NON-NLS-1$ + logger.error( "Error initializing Sentry logger" , e); } - return webApplicationContext; } + /** + * Special code that uses reflection to handle how the application should behave in Mac OS X. + * Without reflection the code provokes compilation-time errors. + * @param doubleClickedProjectFile Project file (CEP) that was clicked + * @throws Exception Throws Exception when the process fails to open the file double-clicked. Initializes the server in any case + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + public static void handleMacStartup(String doubleClickedProjectFile) throws Exception{ + try { + Class applicationClass = Class.forName("com.apple.eawt.Application"); + Method getApplicationMethod = applicationClass.getMethod("getApplication"); + Method setDockIconImageMethod = applicationClass.getMethod( "setDockIconImage", Image.class ); + + Class openFilesHandlerInterface = Class.forName("com.apple.eawt.OpenFilesHandler"); + Method setOpenFileHandlerMethod = applicationClass.getMethod( "setOpenFileHandler", openFilesHandlerInterface ); + + // SET THE MAC OS X DOCK ICON! + // Get an Application object + Object applicationObject = getApplicationMethod.invoke( null ); + try { + Image dockIconImage = new ImageIcon(new File("images/dockIconMac.png").toURI().toURL()).getImage(); + // Invoke the setDockIconImage on the application object using the dockIconImage as an argument + setDockIconImageMethod.invoke(applicationObject, dockIconImage ); + } catch (MalformedURLException e2) { + logger.error("Problems finding the docker icon", e2); + } + // ------------------------------------------- - private static String getDbURL(final CollectDBDriver collectDBDriver) { - // jdbc:postgresql://hostname:port/dbname - String url = collectDBDriver.getUrl(); - url = url.replace("REPLACE_HOSTNAME", localPropertiesService.getValue(EarthProperty.DB_HOST)); //$NON-NLS-1$ - url = url.replace("REPLACE_PORT", localPropertiesService.getValue(EarthProperty.DB_PORT)); //$NON-NLS-1$ - url = url.replace("REPLACE_DBNAME", localPropertiesService.getValue(EarthProperty.DB_NAME)); //$NON-NLS-1$ - return url; - } + // DEFINE A LISTENER THAT IS REGISTERED BY THE OS TO HEAR DOUBLE-CLICK EVENTS AND REGISTER ITSELF AS THE CEP OPENER + MacOpenFilesInvocationHandler macOpenFileHandlerProxyInterface = new MacOpenFilesInvocationHandler(); + Object openFilesHandlerImplementation = Proxy.newProxyInstance( + applicationClass.getClassLoader(), + new Class[]{ openFilesHandlerInterface }, + macOpenFileHandlerProxyInterface + ); - private int getPort() { + // Call the setOpenFileHandler method of the application object using the + setOpenFileHandlerMethod.invoke(applicationObject, ( openFilesHandlerInterface.cast( openFilesHandlerImplementation ) ) ); - String webPort = localPropertiesService.getLocalPort(); - if (webPort == null || webPort.isEmpty()) { - webPort = DEFAULT_PORT; + // Lets wait for the Apple event to arrive. If it did then the earthApp variable will be non-nulls + Thread.sleep(2000); + if( earthApp == null ){ + startCollectEarth( doubleClickedProjectFile ); + } + } catch (Exception e) { + logger.error("Error while defining the double-click behaviour on CEP files in Mac OS X", e); + startCollectEarth( null ); } - return Integer.parseInt(webPort); } - private WebAppContext getRoot() { - return root; - } + public void generateKml() { - private void setRoot(WebAppContext root) { - this.root = root; + try { + getKmlGeneratorService().generateKmlFile(); + } catch (final KmlGenerationException e) { + logger.error("Problems while generating the KML file ", e); //$NON-NLS-1$ + showMessage("Problems while generating the KML file:
" + (e.getCause()!=null?(e.getCause()+"
"):"") + ( e.getMessage().length() > 300?e.getMessage().substring(0,300):e.getMessage() ) + ""); //$NON-NLS-1$ + } catch (final Exception e) { + logger.error("Could not generate KML file", e); //$NON-NLS-1$ + showMessage("Error generating KML file :
" + e.getMessage()); //$NON-NLS-1$ + } } - private boolean initilizeDataSources() throws IOException, TemplateException { + public static void openProjectFileInRunningCollectEarth(String doubleClickedProjecFile) throws IOException { + final File projectFile = new File(doubleClickedProjecFile); - CollectDBDriver collectDBDriver = localPropertiesService.getCollectDBDriver(); - boolean isConnectionTypeSwitched = false; - if(localPropertiesService.isUsingPostgreSqlDB() && !isPostgreSQLReachable(collectDBDriver) ){ + if (projectFile.exists()) { - logger.warn("Impossible to reach the PostgreSQL server at " + getDbURL(CollectDBDriver.POSTGRESQL)); - logger.warn("Using the SQLite version until fixed!"); - logger.error("Impossible to reach the PostgreSQL server at " + getDbURL(CollectDBDriver.POSTGRESQL) + " using SQLite version"); - collectDBDriver = CollectDBDriver.SQLITE; - isConnectionTypeSwitched = true; - } + String hostAddress = ServerController.getHostAddress( getLocalProperties().getHost(), getLocalProperties().getPort()); - final File jettyAppCtxTemplateSrc = new File("resources/applicationContext.fmt"); //$NON-NLS-1$ - final File jettyAppCtxDst = new File(EarthConstants.GENERATED_FOLDER + "/applicationContext.xml"); //$NON-NLS-1$ + URL loadProjectFileInRunningCE = new URL(hostAddress + LoadProjectFileServlet.SERVLET_NAME + + "?" + LoadProjectFileServlet.PROJECT_FILE_PARAMETER + "=" + //$NON-NLS-1$ //$NON-NLS-2$ + URLEncoder.encode(doubleClickedProjecFile, StandardCharsets.UTF_8.name() ) ); + URLConnection urlConn = loadProjectFileInRunningCE.openConnection(); - jettyAppCtxDst.getParentFile().mkdirs(); + try( BufferedReader in = new BufferedReader(new InputStreamReader(urlConn.getInputStream())) ){ + String inputLine; + while ((inputLine = in.readLine()) != null) { + logger.info(inputLine); + } + } - final Map data = new java.util.HashMap<>(); + } + } - data.put("driver", collectDBDriver.getDriverClass()); //$NON-NLS-1$ - data.put("url", getDbURL(collectDBDriver)); //$NON-NLS-1$ - data.put("urlSaiku", getSaikuDbURL(collectDBDriver)); //$NON-NLS-1$ - data.put("urlIpcc", getIpccDbURL(collectDBDriver)); //$NON-NLS-1$ - data.put("username", localPropertiesService.getValue(EarthProperty.DB_USERNAME)); //$NON-NLS-1$ - data.put("password", localPropertiesService.getValue(EarthProperty.DB_PASSWORD)); //$NON-NLS-1$ - data.put("collectEarthExecutionFolder", System.getProperty("user.dir") + File.separator); //$NON-NLS-1$ //$NON-NLS-2$ + private static boolean isAnotherCollectEarthRunning(LocalPropertiesService localProperties) { + boolean alreadyRunning = false; + try { + new Socket( LocalPropertiesService.LOCAL_HOST , Integer.parseInt(localProperties.getPort())).close(); //$NON-NLS-1$ + // If here there is something is serving on port 8028 + // So stop it + logger.warn("There is a server already running {}", localProperties.getPort()); //$NON-NLS-1$ + alreadyRunning = true; + } catch (final IOException e) { + // Nothing there, so OK to proceed + logger.info("There is no server running in port {}", localProperties.getPort()); //$NON-NLS-1$ + alreadyRunning = false; + } catch (final NumberFormatException e) { + // Nothing there, so OK to proceed + logger.info("Error parsing integer value {}", localProperties.getPort()); //$NON-NLS-1$ + alreadyRunning = false; + } + return alreadyRunning; + } - FreemarkerTemplateUtils.applyTemplate(jettyAppCtxTemplateSrc, jettyAppCtxDst, data); + public static void quitServer() { + try { + serverController.stopServer(); + } catch (Exception e) { + logger.error("Error stoping server", e); //$NON-NLS-1$ + } + } + /** + * Generates the KML for the project and opens it in Google Earth + * @param forceKmlRecreation Set to true if you want to forece the regeneration of the KML even if is is up to date (you might want to do this to force the update of the placemark icons as the date changes) + * @throws IOException Throws exception if the KMl file cannot be generated + * @throws KmlGenerationException Throws exception if the KML file contents cannot be generated + * @throws CsvValidationException + */ + private static synchronized void loadKmlInGoogleEarth(boolean forceKmlRecreation) throws IOException, KmlGenerationException, CsvValidationException { + earthApp.getKmlGeneratorService().generatePlacemarksKmzFile( forceKmlRecreation ); + earthApp.simulateClickKmz(); + } + + public static void restart() { + try { - return isConnectionTypeSwitched; + serverController.stopServer(); + startServer(null); + } catch (final Exception e) { + logger.error("Error while stopping server", e); //$NON-NLS-1$ + } } - private boolean isPostgreSQLReachable(CollectDBDriver collectDBDriver) { - boolean connectionWorked = false; - try ( Connection connection = DriverManager.getConnection( - getDbURL(collectDBDriver), - localPropertiesService.getValue(EarthProperty.DB_USERNAME), - localPropertiesService.getValue(EarthProperty.DB_PASSWORD) - ) ){ - String query="select version()"; - try( Statement s = connection.createStatement() ){ - try( ResultSet rs=s.executeQuery(query) ){ - while(rs.next()) - { - logger.debug( "It works, there are " + rs.getString(1) + " rows on the ofc_record table"); - } - connectionWorked = true; - } + private static LocalPropertiesService nonManagedPropertiesService; + + + private static LocalPropertiesService getLocalProperties() { + if (serverController == null || serverController.getContext() == null) { + if (nonManagedPropertiesService == null) { + nonManagedPropertiesService = new LocalPropertiesService(); } + return nonManagedPropertiesService; + } else { + return serverController.getContext().getBean(LocalPropertiesService.class); } - catch(Exception e){ - logger.error("Error while testing the connection to the postgresSQL DB", e); + } + + private static EarthProjectsService getProjectsService() { + if (serverController != null) { + return serverController.getContext().getBean(EarthProjectsService.class); + } else { + final EarthProjectsService earthProjectsService = new EarthProjectsService(); + earthProjectsService.init(getLocalProperties()); + return earthProjectsService; } + } - return connectionWorked; + private KmlGeneratorService getKmlGeneratorService() { + if (serverController != null) { + return serverController.getContext().getBean(KmlGeneratorService.class); + } else { + throw new IllegalStateException("The server must be initialized before this method is called"); //$NON-NLS-1$ + } } - public static String getSaikuDbURL(CollectDBDriver collectDBDriver) { - String urlSaikuDB = getDbURL(collectDBDriver); + private static void startCollectEarth(final String doubleClickedProjectFile) throws Exception { + logger.info("START - Server Initilization"); //$NON-NLS-1$ + final boolean ceAlreadyOpen = isAnotherCollectEarthRunning( getLocalProperties()); + + if( ceAlreadyOpen ){ + closeSplash(); + // If the user double clicked on a project file while Collect Earth is running then load the project in the running Collect Earth + if (doubleClickedProjectFile!=null) { + openProjectFileInRunningCollectEarth(doubleClickedProjectFile); + }else{ + showMessage(Messages.getString("EarthApp.11")); //$NON-NLS-1$ + } + }else{ - if (localPropertiesService.isUsingSqliteDB()) { - urlSaikuDB += EarthConstants.SAIKU_RDB_SUFFIX; + startServer(doubleClickedProjectFile); } - return urlSaikuDB; + + GAlogger.logGAnalytics("Start"); } - public static String getIpccDbURL(CollectDBDriver collectDBDriver) { - String urlIpccDB = getDbURL(collectDBDriver); + public static void startServer(final String doubleClickedProjectFile) + throws Exception { + earthApp = new EarthApp(); - if (localPropertiesService.isUsingSqliteDB()) { - urlIpccDB += IPCC_RDB_SUFFIX; - } - return urlIpccDB; + // Load the double-clicked CEP file before the survey manager is instantiated by the server start-up + earthApp.loadProjectIfDoubleClicked(doubleClickedProjectFile); + + + final Observer observeInitialization = getServerObserver(); + serverStartAndOpenGe(observeInitialization); } - - public void startServer(Observer observeInitialization) throws Exception { - localPropertiesService = new LocalPropertiesService(); + private static Observer getServerObserver() { + return (observable, initializationEvent) ->{ + if (initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT)) { + serverController = null; + } - this.addObserver(observeInitialization); + if( initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT) || + initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT) ){ - boolean postgresConnectionSwitchedtoSqlite = initilizeDataSources(); - try { + showMessage( initializationEvent.toString()); + } - final String webappDirLocation = FolderFinder.getCollectEarthDataFolder(); + if (!initializationEvent.equals(ServerInitializationEvent.SERVER_STOPPED_EVENT)) { + try { + earthApp.generateKml(); + earthApp.simulateClickKmz(); + earthApp.checkForUpdates(); + closeSplash(); + } catch (final Exception e) { + logger.error("Error generating KML file", e); //$NON-NLS-1$ + } + } + }; + } + + private void openKmlOnGoogleEarth(){ + if (! CollectEarthUtils.openFile( new File(KmlGeneratorService.KML_NETWORK_LINK_STARTER)) ) { + showMessage("The KML file cannot be open at " + KmlGeneratorService.KML_NETWORK_LINK_STARTER); //$NON-NLS-1$ + } + } - // The port that we should run on can be set into an environment variable - // Look for that variable and default to 8080 if it isn't there. + private void checkForUpdates() { + new Thread("Check for new Collect Earth versions on the server") { + @Override + public void run() { - // For log4j 1.2 --> Moving to Log4J2 - //PropertyConfigurator.configure(this.getClass().getResource("/WEB-INF/conf/log4j.properties")); + // Wait a few seconds before checking for updates + try { + Thread.sleep(10000); + } catch (InterruptedException e1) { + logger.error("Error while waiting", e1); //$NON-NLS-1$ + } - //server = new Server(new ExecutorThreadPool(10, 50, 5, TimeUnit.SECONDS)); // For JEtty 7 - //server = new Server(new ExecutorThreadPool(50, 50, 5, TimeUnit.MILLISECONDS) ); // For JEtty 9, different parameters for the constructor - server = new Server(new ExecutorThreadPool() ); // For JEtty 9.4, different parameters for the constructor + final UpdateIniUtils updateIniUtils = new UpdateIniUtils(); - // // Use blocking-IO connector to improve throughput - final ServerConnector connector = new ServerConnector(server); - connector.setName( LocalPropertiesService.LOCAL_HOST + ":" + getPort()); //$NON-NLS-1$ - connector.setHost("0.0.0.0"); //$NON-NLS-1$ - //connector.setHost( LocalPropertiesService.LOCAL_HOST ); - connector.setPort(getPort()); + if (updateIniUtils.shouldWarnUser(getLocalProperties() )) { - connector.setStopTimeout(1000); + javax.swing.SwingUtilities.invokeLater( () -> { + String remindLater = Messages.getString("EarthApp.3"); //$NON-NLS-1$ + String doItNow = Messages.getString("EarthApp.4"); //$NON-NLS-1$ + String doNotBother = Messages.getString("EarthApp.5"); //$NON-NLS-1$ - server.setConnectors(new Connector[] { connector }); + String newestVersionOnline = updateIniUtils.getVersionAvailableOnline(); - WebAppContext wweAppContext = new WebAppContext(); - setRoot(wweAppContext); + if( StringUtils.isNotBlank( newestVersionOnline ) ) { - getRoot().setContextPath("/" + EARTH_SUBDOMAIN); //$NON-NLS-1$ + Object[] possibleValues = { remindLater, doItNow, doNotBother }; + int chosenOption = JOptionPane.showOptionDialog(null, + Messages.getString("EarthApp.57"), Messages.getString("EarthApp.58") + Messages.getString("EarthApp.6") + updateIniUtils.convertToDate(newestVersionOnline), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, possibleValues, possibleValues[0]); + if( chosenOption != JOptionPane.CLOSED_OPTION ){ + if (possibleValues[chosenOption].equals(doItNow)) { + CheckForUpdatesListener checkForUpdatesListener = new CheckForUpdatesListener(); + checkForUpdatesListener.actionPerformed(null); + } else if (possibleValues[chosenOption].equals(doNotBother)) { + getLocalProperties().setValue(EarthProperty.LAST_IGNORED_UPDATE, newestVersionOnline); + } + } + } + }); + } + } + }.start(); - getRoot().setDescriptor(this.getClass().getResource("/WEB-INF/web.xml").toURI().toString()); //$NON-NLS-1$ + } - getRoot().setResourceBase(webappDirLocation); - // Parent loader priority is a class loader setting that Jetty accepts. - // By default Jetty will behave like most web containers in that it will - // allow your application to replace non-server libraries that are part of the container. - // Setting parent loader priority to true changes this behaviour. - // Read more here: - // http://wiki.eclipse.org/Jetty/Reference/Jetty_Classloading - getRoot().setParentLoaderPriority(true); + /** + * If Collect Earth is started by double clicking on a ".cep" file ( Collect Earth Project file ) + * Then it should open directly with that project in focus + * + * @param doubleClickedProjecFile + * The path to the CEP file that was double-clicked + * + */ + private void loadProjectIfDoubleClicked(String doubleClickedProjectFile) { + try { + if (doubleClickedProjectFile != null) { - server.setHandler(getRoot()); - server.setStopAtShutdown(true); - server.start(); - setChanged(); + final File projectFile = new File(doubleClickedProjectFile); - Object attribute = getRoot().getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); - if (attribute instanceof BeanCreationException) { - ( (BeanCreationException) attribute).printStackTrace(System.out); - logger.error("Error creating the database connection", attribute); //$NON-NLS-1$ - notifyObservers(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT); - } else { - if (postgresConnectionSwitchedtoSqlite){ - notifyObservers(ServerInitializationEvent.SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT); - }else{ - notifyObservers(ServerInitializationEvent.SERVER_STARTED_EVENT); + if (projectFile.exists()) { + getProjectsService().loadCompressedProjectFile(projectFile); } } - } catch (final IOException e) { - logger.error("Error initializing local properties", e); //$NON-NLS-1$ - } catch (Exception e) { - logger.error("Error staring the server", e); //$NON-NLS-1$ + } catch (final Exception e) { + showMessage(Messages.getString("EarthApp.59")); //$NON-NLS-1$ + logger.error(Messages.getString("EarthApp.59"), e);//$NON-NLS-1$ + } + } + + private static void serverStartAndOpenGe(Observer observeInitialization) throws Exception { + serverController = new ServerController(); + serverController.deleteObservers(); + serverController.startServer(observeInitialization); + + // Inform Mac OS users of the issues about opening CEP files in the Mac version of CE + if(SystemUtils.IS_OS_MAC_OSX ) { + showMessage( + "" //$NON-NLS-1$ + + "" //$NON-NLS-1$ + + Messages.getString("EarthApp.70") + + ": " //$NON-NLS-1$ + + Messages.getString("EarthApp.71") + + Messages.getString("EarthApp.72") + + "" //$NON-NLS-1$ + + Messages.getString("CollectEarthWindow.10") + + " -> " //$NON-NLS-1$ + + Messages.getString("CollectEarthMenu.0") + + "", //$NON-NLS-1$ + Messages.getString("EarthApp.73") + ); } + } - // Force the local properties to be loaded before the browserservice is instantiated!! DO NOT REMOVE - getContext().getBean(LocalPropertiesService.class); - this.addObserver(getContext().getBean(BrowserService.class)); + public static void showMessage(String message) { + showMessage(message, "Collect Earth"); } - public void stopServer() throws Exception { - if (server != null && server.isRunning()) { - server.stop(); - setChanged(); - notifyObservers(ServerInitializationEvent.SERVER_STOPPED_EVENT); + public static void showMessage(String message, String title) { + try { + SwingUtilities.invokeLater( + () -> JOptionPane.showMessageDialog(null, message, title, JOptionPane.WARNING_MESSAGE) + ); + } catch (Exception e) { + logger.error("Error showing message",e); } + } + private void simulateClickKmz() { + try { + getKmlGeneratorService().generateLoaderKmlFile(); + openKmlOnGoogleEarth(); + } catch (final Exception e) { + showMessage(Messages.getString("EarthApp.61")); //$NON-NLS-1$ + logger.error("The KMZ file could not be found", e); //$NON-NLS-1$ + } + } + + public static void executeKmlLoadAsynchronously( Window windowShowingTimer ) { + new Thread("Load KML in Google Earth"){ + @Override + public void run() { + // Only regenerate KML and reload + try { + SwingUtilities.invokeLater( ( ) -> { + if( windowShowingTimer != null ){ + CollectEarthWindow.startWaiting(windowShowingTimer); + } + }); + + EarthApp.loadKmlInGoogleEarth(true); + + } catch (Exception e) { + logger.error("Error loading the KML",e); + EarthApp.showMessage("Problems while generating the KML file:
" + + (e.getCause()!=null?(e.getCause()+"
"):"") + + ( + ( e.getMessage()!=null && e.getMessage().length() > 300 ) ? e.getMessage().substring(0,300) : + ( e.getMessage()!=null ) ? e.getMessage() : "" + ) + ""); //$NON-NLS-1$ + }finally{ + if( windowShowingTimer != null ){ + try { + SwingUtilities.invokeLater( () -> { + CollectEarthWindow.endWaiting(windowShowingTimer); + if( windowShowingTimer instanceof PropertiesDialog ){ + ( (PropertiesDialog) windowShowingTimer).closeDialog(); + } + }); + } catch (Exception e2) { + logger.error("Error closing Options dialog", e2); + } + } + } - public static String getHostAddress(String host, String port) { - String hostAndPort = ""; //$NON-NLS-1$ - if (host != null && host.length() > 0) { - hostAndPort = host; - if (port != null && port.length() > 0) { - hostAndPort += ":" + port; //$NON-NLS-1$ } + }.start(); + } - hostAndPort = "http://" + hostAndPort + "/" + EARTH_SUBDOMAIN + "/"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - return hostAndPort; - } } From bf0ca9bed7b4f1286b32e84726de7722e4557505 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:00 +0100 Subject: [PATCH 0088/1620] New translations EarthApp.java (English) --- .../earth/app/view/Messages_en.properties | 2429 ++++------------- 1 file changed, 534 insertions(+), 1895 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 768f973a7f..0777f46090 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,1895 +1,534 @@ -package org.openforis.collect.earth.app.ad_hoc; - -import java.util.ArrayList; -import java.util.Arrays; - -public class findMissingCountries { - - private static ArrayList allCountryNames = new ArrayList<>( - Arrays.asList( - "Abyei", - "Afghanistan", - "Aksai_Chin", - "Albania", - "Algeria", - "American_Samoa", - "Andorra", - "Angola", - "Anguilla", - "Antarctica", - "Antigua_and_Barbuda", - "Argentina", - "Armenia", - "Aruba", - "Arunachal_Pradesh", - "Ashmore_and_Cartier_Islands", - "Australia", - "Austria", - "Azerbaijan", - "Azores_Islands", - "Bahamas", - "Bahrain", - "Baker_Island", - "Bangladesh", - "Barbados", - "Bassas_da_India", - "Belarus", - "Belgium", - "Belize", - "Benin", - "Bermuda", - "Bhutan", - "Bird_Island", - "Bolivia", - "Bosnia_and_Herzegovina", - "Botswana", - "Bouvet_Island", - "Brazil", - "British_Indian_Ocean_Territory", - "British_Virgin_Islands", - "Brunei_Darussalam", - "Bulgaria", - "Burkina_Faso", - "Burundi", - "Cambodia", - "Cameroon", - "Canada", - "Cape_Verde", - "Cayman_Islands", - "Central_African_Republic", - "Chad", - "Chile", - "China", - "China/India", - "Christmas_Island", - "Clipperton_Island", - "Cocos__Keeling__Islands", - "Colombia", - "Comoros", - "Congo", - "Cook_Islands", - "Costa_Rica", - "Croatia", - "Cuba", - "Cyprus", - "Czech_Republic", - "C�te_d_Ivoire", - "Dem_People_s_Rep_of_Korea", - "Democratic_Republic_of_the_Congo", - "Denmark", - "Djibouti", - "Dominica", - "Dominican_Republic", - "Ecuador", - "Egypt", - "El_Salvador", - "Equatorial_Guinea", - "Eritrea", - "Estonia", - "Ethiopia", - "Europa_Island", - "Falkland_Islands__Malvinas_", - "Faroe_Islands", - "Fiji", - "Finland", - "France", - "French_Guiana", - "French_Polynesia", - "French_Southern_and_Antarctic_Territories", - "Gabon", - "Gambia", - "Gaza_Strip", - "Georgia", - "Germany", - "Ghana", - "Gibraltar", - "Glorioso_Island", - "Greece", - "Greenland", - "Grenada", - "Guadeloupe", - "Guam", - "Guatemala", - "Guernsey", - "Guinea", - "Guinea-Bissau", - "Guyana", - "Haiti", - "Hala_ib_triangle", - "Heard_Island_and_McDonald_Islands", - "Holy_See", - "Honduras", - "Hong_Kong", - "Howland_Island", - "Hungary", - "Iceland", - "Ilemi_triangle", - "India", - "Indonesia", - "Iran___Islamic_Republic_of_", - "Iraq", - "Ireland", - "Isle_of_Man", - "Israel", - "Italy", - "Jamaica", - "Jammu_and_Kashmir", - "Japan", - "Jarvis_Island", - "Jersey", - "Johnston_Atoll", - "Jordan", - "Juan_de_Nova_Island", - "Kazakhstan", - "Kenya", - "Kingman_Reef", - "Kiribati", - "Kuril_islands", - "Kuwait", - "Kyrgyzstan", - "Lao_People_s_Democratic_Republic", - "Latvia", - "Lebanon", - "Lesotho", - "Liberia", - "Libya", - "Liechtenstein", - "Lithuania", - "Luxembourg", - "Ma_tan_al-Sarra", - "Macau", - "Madagascar", - "Madeira_Islands", - "Malawi", - "Malaysia", - "Maldives", - "Mali", - "Malta", - "Marshall_Islands", - "Martinique", - "Mauritania", - "Mauritius", - "Mayotte", - "Mexico", - "Micronesia__Federated_States_of_", - "Midway_Island", - "Moldova,_Republic_of", - "Monaco", - "Mongolia", - "Montenegro", - "Montserrat", - "Morocco", - "Mozambique", - "Myanmar", - "Namibia", - "Nauru", - "Navassa_Island", - "Nepal", - "Netherlands", - "Netherlands_Antilles", - "New_Caledonia", - "New_Zealand", - "Nicaragua", - "Niger", - "Nigeria", - "Niue", - "Norfolk_Island", - "Northern_Mariana_Islands", - "Norway", - "Oman", - "Pakistan", - "Palau", - "Palmyra_Atoll", - "Panama", - "Papua_New_Guinea", - "Paracel_Islands", - "Paraguay", - "Peru", - "Philippines", - "Pitcairn", - "Poland", - "Portugal", - "Puerto_Rico", - "Qatar", - "Republic_of_Korea", - "Romania", - "Russian_Federation", - "Rwanda", - "R�union", - "Saint_Helena", - "Saint_Kitts_and_Nevis", - "Saint_Lucia", - "Saint_Pierre_et_Miquelon", - "Saint_Vincent_and_the_Grenadines", - "Samoa", - "San_Marino", - "Sao_Tome_and_Principe", - "Saudi_Arabia", - "Scarborough_Reef", - "Senegal", - "Senkaku_Islands", - "Serbia", - "Seychelles", - "Sierra_Leone", - "Singapore", - "Slovakia", - "Slovenia", - "Solomon_Islands", - "Somalia", - "South_Africa", - "South_Georgia_and_the_South_Sandwich_Islands", - "South_Sudan", - "Spain", - "Spratly_Islands", - "Sri_Lanka", - "Sudan", - "Suriname", - "Svalbard_and_Jan_Mayen_Islands", - "Swaziland", - "Sweden", - "Switzerland", - "Syrian_Arab_Republic", - "Taiwan", - "Tajikistan", - "Thailand", - "The_former_Yugoslav_Republic_of_Macedonia", - "Timor-Leste", - "Togo", - "Tokelau", - "Tonga", - "Trinidad_and_Tobago", - "Tromelin_Island", - "Tunisia", - "Turkey", - "Turkmenistan", - "Turks_and_Caicos_islands", - "Tuvalu", - "UK_of_Great_Britain_and_Northern_Ireland", - "Uganda", - "Ukraine", - "United_Arab_Emirates", - "United_Republic_of_Tanzania", - "United_States_Virgin_Islands", - "United_States_of_America", - "Uruguay", - "Uzbekistan", - "Vanuatu", - "Venezuela", - "Viet_Nam", - "Wake_Island", - "Wallis_and_Futuna", - "West_Bank", - "Western_Sahara", - "Yemen", - "Zambia", - "Zimbabwe" ) ); - - private static ArrayList filesGenerated = new ArrayList<>( - Arrays.asList( "Azores_Islands_bassin_10", - "Azores_Islands_bassin_11", - "Azores_Islands_bassin_12", - "Azores_Islands", - "Azores_Islands_bassin_5", - "Azores_Islands_bassin_6", - "Azores_Islands_bassin_7", - "Azores_Islands_bassin_8", - "Azores_Islands_bassin_9", - "Brunei_Darussalam_bassin_10", - "Brunei_Darussalam_bassin_11", - "Brunei_Darussalam_bassin_12", - "Brunei_Darussalam_bassin_7", - "Brunei_Darussalam_bassin_8", - "Brunei_Darussalam_bassin_9", - "Bulgaria_bassin_10", - "Bulgaria_bassin_11", - "Bulgaria_bassin_12", - "Bulgaria", - "Bulgaria_bassin_5", - "Bulgaria_bassin_6", - "Bulgaria_bassin_7", - "Bulgaria_bassin_8", - "Bulgaria_bassin_9", - "Burkina_Faso_bassin_10", - "Burkina_Faso_bassin_11", - "Burkina_Faso_bassin_12", - "Burkina_Faso", - "Burkina_Faso_bassin_5", - "Burkina_Faso_bassin_6", - "Burkina_Faso_bassin_7", - "Burkina_Faso_bassin_8", - "Burkina_Faso_bassin_9", - "Burundi_bassin_10", - "Burundi_bassin_11", - "Burundi_bassin_12", - "Burundi", - "Burundi_bassin_5", - "Burundi_bassin_6", - "Burundi_bassin_7", - "Burundi_bassin_8", - "Burundi_bassin_9", - "Cambodia_bassin_10", - "Cambodia_bassin_11", - "Cambodia_bassin_12", - "Cambodia", - "Cambodia_bassin_5", - "Cambodia_bassin_6", - "Cambodia_bassin_7", - "Cambodia_bassin_8", - "Cambodia_bassin_9", - "Cameroon_bassin_10", - "Cameroon_bassin_11", - "Cameroon_bassin_12", - "Cameroon", - "Cameroon_bassin_5", - "Cameroon_bassin_6", - "Cameroon_bassin_7", - "Cameroon_bassin_8", - "Cameroon_bassin_9", - "Canada_bassin_10", - "Canada_bassin_11", - "Canada_bassin_12", - "Canada", - "Canada_bassin_5", - "Canada_bassin_6", - "Canada_bassin_7", - "Canada_bassin_8", - "Canada_bassin_9", - "Cape_Verde_bassin_10", - "Cape_Verde_bassin_11", - "Cape_Verde_bassin_12", - "Cape_Verde", - "Cape_Verde_bassin_5", - "Cape_Verde_bassin_6", - "Cape_Verde_bassin_7", - "Cape_Verde_bassin_8", - "Cape_Verde_bassin_9", - "Cayman_Islands_bassin_10", - "Cayman_Islands_bassin_11", - "Cayman_Islands_bassin_12", - "Cayman_Islands", - "Cayman_Islands_bassin_5", - "Cayman_Islands_bassin_6", - "Cayman_Islands_bassin_7", - "Cayman_Islands_bassin_8", - "Cayman_Islands_bassin_9", - "Central_African Republic_bassin_10", - "Central_African Republic_bassin_11", - "Central_African Republic_bassin_12", - "Central_African Republic", - "Central_African Republic_bassin_5", - "Central_African Republic_bassin_6", - "Central_African Republic_bassin_7", - "Central_African Republic_bassin_8", - "Central_African Republic_bassin_9", - "Chad_bassin_10", - "Chad_bassin_11", - "Chad_bassin_12", - "Chad", - "Chad_bassin_5", - "Chad_bassin_6", - "Chad_bassin_7", - "Chad_bassin_8", - "Chad_bassin_9", - "Chile_bassin_10", - "Chile_bassin_11", - "Chile_bassin_12", - "Chile", - "Chile_bassin_5", - "Chile_bassin_6", - "Chile_bassin_7", - "Chile_bassin_8", - "Chile_bassin_9", - "China_bassin_10", - "China_bassin_11", - "China_bassin_12", - "China", - "China_bassin_5", - "China_bassin_6", - "China_bassin_7", - "China_bassin_8", - "China_bassin_9", - "Christmas_Island_bassin_10", - "Christmas_Island_bassin_11", - "Christmas_Island_bassin_12", - "Christmas_Island", - "Christmas_Island_bassin_5", - "Christmas_Island_bassin_6", - "Christmas_Island_bassin_7", - "Christmas_Island_bassin_8", - "Christmas_Island_bassin_9", - "Clipperton_Island_bassin_10", - "Clipperton_Island_bassin_11", - "Clipperton_Island_bassin_12", - "Clipperton_Island", - "Clipperton_Island_bassin_5", - "Clipperton_Island_bassin_6", - "Clipperton_Island_bassin_7", - "Clipperton_Island_bassin_8", - "Clipperton_Island_bassin_9", - "Colombia_bassin_10", - "Colombia_bassin_11", - "Colombia_bassin_12", - "Colombia", - "Colombia_bassin_5", - "Colombia_bassin_6", - "Colombia_bassin_7", - "Colombia_bassin_8", - "Colombia_bassin_9", - "Comoros_bassin_10", - "Comoros_bassin_11", - "Comoros_bassin_12", - "Comoros", - "Comoros_bassin_5", - "Comoros_bassin_6", - "Comoros_bassin_7", - "Comoros_bassin_8", - "Comoros_bassin_9", - "Congo_bassin_10", - "Congo_bassin_11", - "Congo_bassin_12", - "Congo", - "Congo_bassin_5", - "Congo_bassin_6", - "Congo_bassin_7", - "Congo_bassin_8", - "Congo_bassin_9", - "Cook_Islands_bassin_10", - "Cook_Islands_bassin_11", - "Cook_Islands_bassin_12", - "Cook_Islands", - "Cook_Islands_bassin_5", - "Cook_Islands_bassin_6", - "Cook_Islands_bassin_7", - "Cook_Islands_bassin_8", - "Cook_Islands_bassin_9", - "Costa_Rica_bassin_10", - "Costa_Rica_bassin_11", - "Costa_Rica_bassin_12", - "Costa_Rica", - "Costa_Rica_bassin_5", - "Costa_Rica_bassin_6", - "Costa_Rica_bassin_7", - "Costa_Rica_bassin_8", - "Costa_Rica_bassin_9", - "Croatia_bassin_10", - "Croatia_bassin_11", - "Croatia_bassin_12", - "Croatia", - "Croatia_bassin_5", - "Croatia_bassin_6", - "Croatia_bassin_7", - "Croatia_bassin_8", - "Croatia_bassin_9", - "Cuba_bassin_10", - "Cuba_bassin_11", - "Cuba_bassin_12", - "Cuba", - "Cuba_bassin_5", - "Cuba_bassin_6", - "Cuba_bassin_7", - "Cuba_bassin_8", - "Cuba_bassin_9", - "Cyprus_bassin_10", - "Cyprus_bassin_11", - "Cyprus_bassin_12", - "Cyprus", - "Cyprus_bassin_5", - "Cyprus_bassin_6", - "Cyprus_bassin_7", - "Cyprus_bassin_8", - "Cyprus_bassin_9", - "Czech_Republic_bassin_10", - "Czech_Republic_bassin_11", - "Czech_Republic_bassin_12", - "Czech_Republic", - "Czech_Republic_bassin_5", - "Czech_Republic_bassin_6", - "Czech_Republic_bassin_7", - "Czech_Republic_bassin_8", - "Czech_Republic_bassin_9", - "Democratic_Republic of the Congo_bassin_10", - "Democratic_Republic of the Congo_bassin_11", - "Democratic_Republic of the Congo_bassin_12", - "Democratic_Republic of the Congo", - "Democratic_Republic of the Congo_bassin_5", - "Democratic_Republic of the Congo_bassin_6", - "Democratic_Republic of the Congo_bassin_7", - "Democratic_Republic of the Congo_bassin_8", - "Democratic_Republic of the Congo_bassin_9", - "Dem_Peoples Rep of Korea_bassin_10", - "Dem_Peoples Rep of Korea_bassin_11", - "Dem_Peoples Rep of Korea_bassin_12", - "Dem_Peoples Rep of Korea", - "Dem_Peoples Rep of Korea_bassin_5", - "Dem_Peoples Rep of Korea_bassin_6", - "Dem_Peoples Rep of Korea_bassin_7", - "Dem_Peoples Rep of Korea_bassin_8", - "Dem_Peoples Rep of Korea_bassin_9", - "Denmark_bassin_10", - "Denmark_bassin_11", - "Denmark_bassin_12", - "Denmark", - "Denmark_bassin_5", - "Denmark_bassin_6", - "Denmark_bassin_7", - "Denmark_bassin_8", - "Denmark_bassin_9", - "Djibouti_bassin_10", - "Djibouti_bassin_11", - "Djibouti_bassin_12", - "Djibouti", - "Djibouti_bassin_5", - "Djibouti_bassin_6", - "Djibouti_bassin_7", - "Djibouti_bassin_8", - "Djibouti_bassin_9", - "Dominican_Republic_bassin_10", - "Dominican_Republic_bassin_11", - "Dominican_Republic_bassin_12", - "Dominican_Republic", - "Dominican_Republic_bassin_5", - "Dominican_Republic_bassin_6", - "Dominican_Republic_bassin_7", - "Dominican_Republic_bassin_8", - "Dominican_Republic_bassin_9", - "Dominica_bassin_10", - "Dominica_bassin_11", - "Dominica_bassin_12", - "Dominica", - "Dominica_bassin_5", - "Dominica_bassin_6", - "Dominica_bassin_7", - "Dominica_bassin_8", - "Dominica_bassin_9", - "Ecuador_bassin_10", - "Ecuador_bassin_11", - "Ecuador_bassin_12", - "Ecuador", - "Ecuador_bassin_5", - "Ecuador_bassin_6", - "Ecuador_bassin_7", - "Ecuador_bassin_8", - "Ecuador_bassin_9", - "Egypt_bassin_10", - "Egypt_bassin_11", - "Egypt_bassin_12", - "Egypt", - "Egypt_bassin_5", - "Egypt_bassin_6", - "Egypt_bassin_7", - "Egypt_bassin_8", - "Egypt_bassin_9", - "El_Salvador_bassin_10", - "El_Salvador_bassin_11", - "El_Salvador_bassin_12", - "El_Salvador", - "El_Salvador_bassin_5", - "El_Salvador_bassin_6", - "El_Salvador_bassin_7", - "El_Salvador_bassin_8", - "El_Salvador_bassin_9", - "Equatorial_Guinea_bassin_10", - "Equatorial_Guinea_bassin_11", - "Equatorial_Guinea_bassin_12", - "Equatorial_Guinea", - "Equatorial_Guinea_bassin_5", - "Equatorial_Guinea_bassin_6", - "Equatorial_Guinea_bassin_7", - "Equatorial_Guinea_bassin_8", - "Equatorial_Guinea_bassin_9", - "Eritrea_bassin_10", - "Eritrea_bassin_11", - "Eritrea_bassin_12", - "Eritrea", - "Eritrea_bassin_5", - "Eritrea_bassin_6", - "Eritrea_bassin_7", - "Eritrea_bassin_8", - "Eritrea_bassin_9", - "Estonia_bassin_10", - "Estonia_bassin_11", - "Estonia_bassin_12", - "Estonia", - "Estonia_bassin_5", - "Estonia_bassin_6", - "Estonia_bassin_7", - "Estonia_bassin_8", - "Estonia_bassin_9", - "Ethiopia_bassin_10", - "Ethiopia_bassin_11", - "Ethiopia_bassin_12", - "Ethiopia", - "Ethiopia_bassin_5", - "Ethiopia_bassin_6", - "Ethiopia_bassin_7", - "Ethiopia_bassin_8", - "Ethiopia_bassin_9", - "Europa_Island_bassin_10", - "Europa_Island_bassin_11", - "Europa_Island_bassin_12", - "Europa_Island", - "Europa_Island_bassin_5", - "Europa_Island_bassin_6", - "Europa_Island_bassin_7", - "Europa_Island_bassin_8", - "Europa_Island_bassin_9", - "Faroe_Islands_bassin_10", - "Faroe_Islands_bassin_11", - "Faroe_Islands_bassin_12", - "Faroe_Islands", - "Faroe_Islands_bassin_5", - "Faroe_Islands_bassin_6", - "Faroe_Islands_bassin_7", - "Faroe_Islands_bassin_8", - "Faroe_Islands_bassin_9", - "Fiji_bassin_10", - "Fiji_bassin_11", - "Fiji_bassin_12", - "Fiji", - "Fiji_bassin_5", - "Fiji_bassin_6", - "Fiji_bassin_7", - "Fiji_bassin_8", - "Fiji_bassin_9", - "Finland_bassin_10", - "Finland_bassin_11", - "Finland_bassin_12", - "Finland", - "Finland_bassin_5", - "Finland_bassin_6", - "Finland_bassin_7", - "Finland_bassin_8", - "Finland_bassin_9", - "France_bassin_10", - "France_bassin_11", - "France_bassin_12", - "France", - "France_bassin_5", - "France_bassin_6", - "France_bassin_7", - "France_bassin_8", - "France_bassin_9", - "French_Guiana_bassin_10", - "French_Guiana_bassin_11", - "French_Guiana_bassin_12", - "French_Guiana", - "French_Guiana_bassin_5", - "French_Guiana_bassin_6", - "French_Guiana_bassin_7", - "French_Guiana_bassin_8", - "French_Guiana_bassin_9", - "French_Polynesia_bassin_10", - "French_Polynesia_bassin_11", - "French_Polynesia_bassin_12", - "French_Polynesia", - "French_Polynesia_bassin_5", - "French_Polynesia_bassin_6", - "French_Polynesia_bassin_7", - "French_Polynesia_bassin_8", - "French_Polynesia_bassin_9", - "French_Southern and Antarctic Territories_bassin_10", - "French_Southern and Antarctic Territories_bassin_11", - "French_Southern and Antarctic Territories_bassin_12", - "French_Southern and Antarctic Territories", - "French_Southern and Antarctic Territories_bassin_5", - "French_Southern and Antarctic Territories_bassin_6", - "French_Southern and Antarctic Territories_bassin_7", - "French_Southern and Antarctic Territories_bassin_8", - "French_Southern and Antarctic Territories_bassin_9", - "Gabon_bassin_10", - "Gabon_bassin_11", - "Gabon_bassin_12", - "Gabon", - "Gabon_bassin_5", - "Gabon_bassin_6", - "Gabon_bassin_7", - "Gabon_bassin_8", - "Gabon_bassin_9", - "Gambia_bassin_10", - "Gambia_bassin_11", - "Gambia_bassin_12", - "Gambia", - "Gambia_bassin_5", - "Gambia_bassin_6", - "Gambia_bassin_7", - "Gambia_bassin_8", - "Gambia_bassin_9", - "Gaza_Strip_bassin_10", - "Gaza_Strip_bassin_11", - "Gaza_Strip_bassin_12", - "Gaza_Strip", - "Gaza_Strip_bassin_5", - "Gaza_Strip_bassin_6", - "Gaza_Strip_bassin_7", - "Gaza_Strip_bassin_8", - "Gaza_Strip_bassin_9", - "Georgia_bassin_10", - "Georgia_bassin_11", - "Georgia_bassin_12", - "Georgia", - "Georgia_bassin_5", - "Georgia_bassin_6", - "Georgia_bassin_7", - "Georgia_bassin_8", - "Georgia_bassin_9", - "Germany_bassin_10", - "Germany_bassin_11", - "Germany_bassin_12", - "Germany", - "Germany_bassin_5", - "Germany_bassin_6", - "Germany_bassin_7", - "Germany_bassin_8", - "Germany_bassin_9", - "Ghana_bassin_10", - "Ghana_bassin_11", - "Ghana_bassin_12", - "Ghana", - "Ghana_bassin_5", - "Ghana_bassin_6", - "Ghana_bassin_8", - "Ghana_bassin_9", - "Gibraltar_bassin_10", - "Gibraltar_bassin_11", - "Gibraltar_bassin_12", - "Gibraltar", - "Gibraltar_bassin_5", - "Gibraltar_bassin_6", - "Gibraltar_bassin_7", - "Gibraltar_bassin_8", - "Gibraltar_bassin_9", - "Glorioso_Island_bassin_10", - "Glorioso_Island_bassin_11", - "Glorioso_Island_bassin_12", - "Glorioso_Island", - "Glorioso_Island_bassin_5", - "Glorioso_Island_bassin_6", - "Glorioso_Island_bassin_7", - "Glorioso_Island_bassin_8", - "Glorioso_Island_bassin_9", - "Greece_bassin_10", - "Greece_bassin_11", - "Greece_bassin_12", - "Greece", - "Greece_bassin_5", - "Greece_bassin_6", - "Greece_bassin_7", - "Greece_bassin_8", - "Greece_bassin_9", - "Greenland_bassin_10", - "Greenland_bassin_11", - "Greenland_bassin_12", - "Greenland", - "Greenland_bassin_5", - "Greenland_bassin_6", - "Greenland_bassin_7", - "Greenland_bassin_8", - "Greenland_bassin_9", - "Grenada_bassin_10", - "Grenada_bassin_11", - "Grenada_bassin_12", - "Grenada", - "Grenada_bassin_5", - "Grenada_bassin_6", - "Grenada_bassin_7", - "Grenada_bassin_8", - "Grenada_bassin_9", - "Guadeloupe_bassin_10", - "Guadeloupe_bassin_11", - "Guadeloupe_bassin_12", - "Guadeloupe", - "Guadeloupe_bassin_5", - "Guadeloupe_bassin_6", - "Guadeloupe_bassin_7", - "Guadeloupe_bassin_8", - "Guadeloupe_bassin_9", - "Guam_bassin_10", - "Guam_bassin_11", - "Guam_bassin_12", - "Guam", - "Guam_bassin_5", - "Guam_bassin_6", - "Guam_bassin_7", - "Guam_bassin_8", - "Guam_bassin_9", - "Halaib_triangle_bassin_10", - "Halaib_triangle_bassin_11", - "Halaib_triangle_bassin_12", - "Halaib_triangle", - "Halaib_triangle_bassin_5", - "Halaib_triangle_bassin_6", - "Halaib_triangle_bassin_7", - "Halaib_triangle_bassin_8", - "Halaib_triangle_bassin_9", - "Heard_Island and McDonald Islands_bassin_12", - "Holy_See_bassin_10", - "Holy_See_bassin_11", - "Holy_See_bassin_12", - "Holy_See", - "Holy_See_bassin_5", - "Holy_See_bassin_6", - "Holy_See_bassin_7", - "Holy_See_bassin_8", - "Holy_See_bassin_9", - "Honduras_bassin_10", - "Honduras_bassin_11", - "Honduras_bassin_12", - "Honduras", - "Honduras_bassin_5", - "Honduras_bassin_6", - "Honduras_bassin_7", - "Honduras_bassin_8", - "Honduras_bassin_9", - "Hong_Kong_bassin_10", - "Hong_Kong_bassin_11", - "Hong_Kong_bassin_12", - "Hong_Kong", - "Hong_Kong_bassin_5", - "Hong_Kong_bassin_6", - "Hong_Kong_bassin_7", - "Hong_Kong_bassin_8", - "Hong_Kong_bassin_9", - "Howland_Island_bassin_10", - "Howland_Island_bassin_11", - "Howland_Island_bassin_12", - "Howland_Island", - "Howland_Island_bassin_5", - "Howland_Island_bassin_6", - "Howland_Island_bassin_7", - "Howland_Island_bassin_8", - "Howland_Island_bassin_9", - "Hungary_bassin_10", - "Hungary_bassin_11", - "Hungary_bassin_12", - "Hungary", - "Hungary_bassin_5", - "Hungary_bassin_6", - "Hungary_bassin_7", - "Hungary_bassin_8", - "Hungary_bassin_9", - "Iceland_bassin_10", - "Iceland_bassin_11", - "Iceland_bassin_12", - "Iceland", - "Iceland_bassin_5", - "Iceland_bassin_6", - "Iceland_bassin_7", - "Iceland_bassin_8", - "Iceland_bassin_9", - "Ilemi_triangle_bassin_10", - "Ilemi_triangle_bassin_11", - "Ilemi_triangle_bassin_12", - "Ilemi_triangle", - "Ilemi_triangle_bassin_5", - "Ilemi_triangle_bassin_6", - "Ilemi_triangle_bassin_7", - "Ilemi_triangle_bassin_8", - "Ilemi_triangle_bassin_9", - "India_bassin_10", - "India_bassin_11", - "India_bassin_12", - "India", - "India_bassin_5", - "India_bassin_6", - "India_bassin_7", - "India_bassin_8", - "India_bassin_9", - "Indonesia_bassin_10", - "Indonesia_bassin_11", - "Indonesia_bassin_12", - "Indonesia", - "Indonesia_bassin_5", - "Indonesia_bassin_6", - "Indonesia_bassin_7", - "Indonesia_bassin_8", - "Indonesia_bassin_9", - "Iraq_bassin_10", - "Iraq_bassin_11", - "Iraq_bassin_12", - "Iraq", - "Iraq_bassin_5", - "Iraq_bassin_6", - "Iraq_bassin_7", - "Iraq_bassin_8", - "Iraq_bassin_9", - "Ireland_bassin_10", - "Ireland_bassin_11", - "Ireland_bassin_12", - "Ireland", - "Ireland_bassin_5", - "Ireland_bassin_6", - "Ireland_bassin_7", - "Ireland_bassin_8", - "Ireland_bassin_9", - "Isle_of Man_bassin_10", - "Isle_of Man_bassin_11", - "Isle_of Man_bassin_12", - "Isle_of Man", - "Isle_of Man_bassin_5", - "Isle_of Man_bassin_6", - "Isle_of Man_bassin_7", - "Isle_of Man_bassin_8", - "Isle_of Man_bassin_9", - "Israel_bassin_10", - "Israel_bassin_11", - "Israel_bassin_12", - "Israel", - "Israel_bassin_5", - "Israel_bassin_6", - "Israel_bassin_7", - "Israel_bassin_8", - "Israel_bassin_9", - "Italy_bassin_10", - "Italy_bassin_11", - "Italy_bassin_12", - "Italy", - "Italy_bassin_5", - "Italy_bassin_6", - "Italy_bassin_7", - "Italy_bassin_8", - "Italy_bassin_9", - "Jamaica_bassin_10", - "Jamaica_bassin_11", - "Jamaica_bassin_12", - "Jamaica", - "Jamaica_bassin_5", - "Jamaica_bassin_6", - "Jamaica_bassin_7", - "Jamaica_bassin_8", - "Jamaica_bassin_9", - "Jammu_and Kashmir_bassin_10", - "Jammu_and Kashmir_bassin_11", - "Jammu_and Kashmir_bassin_12", - "Jammu_and Kashmir", - "Jammu_and Kashmir_bassin_5", - "Jammu_and Kashmir_bassin_6", - "Jammu_and Kashmir_bassin_7", - "Jammu_and Kashmir_bassin_8", - "Jammu_and Kashmir_bassin_9", - "Japan_bassin_10", - "Japan_bassin_11", - "Japan_bassin_12", - "Japan", - "Japan_bassin_5", - "Japan_bassin_6", - "Japan_bassin_7", - "Japan_bassin_8", - "Japan_bassin_9", - "Jarvis_Island_bassin_10", - "Jarvis_Island_bassin_11", - "Jarvis_Island_bassin_12", - "Jarvis_Island", - "Jarvis_Island_bassin_5", - "Jarvis_Island_bassin_6", - "Jarvis_Island_bassin_7", - "Jarvis_Island_bassin_8", - "Jarvis_Island_bassin_9", - "Jersey_bassin_10", - "Jersey_bassin_11", - "Jersey_bassin_12", - "Jersey", - "Jersey_bassin_5", - "Jersey_bassin_6", - "Jersey_bassin_7", - "Jersey_bassin_8", - "Jersey_bassin_9", - "Johnston_Atoll_bassin_10", - "Johnston_Atoll_bassin_11", - "Johnston_Atoll_bassin_12", - "Johnston_Atoll", - "Johnston_Atoll_bassin_5", - "Johnston_Atoll_bassin_6", - "Johnston_Atoll_bassin_7", - "Johnston_Atoll_bassin_8", - "Johnston_Atoll_bassin_9", - "Jordan_bassin_10", - "Jordan_bassin_11", - "Jordan_bassin_12", - "Jordan", - "Jordan_bassin_5", - "Jordan_bassin_6", - "Jordan_bassin_7", - "Jordan_bassin_8", - "Jordan_bassin_9", - "Juan_de Nova Island_bassin_10", - "Juan_de Nova Island_bassin_11", - "Juan_de Nova Island_bassin_12", - "Juan_de Nova Island", - "Juan_de Nova Island_bassin_5", - "Juan_de Nova Island_bassin_6", - "Juan_de Nova Island_bassin_7", - "Juan_de Nova Island_bassin_8", - "Juan_de Nova Island_bassin_9", - "Kazakhstan_bassin_10", - "Kazakhstan_bassin_11", - "Kazakhstan_bassin_12", - "Kazakhstan", - "Kazakhstan_bassin_5", - "Kazakhstan_bassin_6", - "Kazakhstan_bassin_7", - "Kazakhstan_bassin_8", - "Kazakhstan_bassin_9", - "Kenya_bassin_10", - "Kenya_bassin_11", - "Kenya_bassin_12", - "Kenya", - "Kenya_bassin_5", - "Kenya_bassin_6", - "Kenya_bassin_7", - "Kenya_bassin_8", - "Kenya_bassin_9", - "Kingman_Reef_bassin_10", - "Kingman_Reef_bassin_11", - "Kingman_Reef_bassin_12", - "Kingman_Reef", - "Kingman_Reef_bassin_5", - "Kingman_Reef_bassin_6", - "Kingman_Reef_bassin_7", - "Kingman_Reef_bassin_8", - "Kingman_Reef_bassin_9", - "Kiribati_bassin_10", - "Kiribati_bassin_11", - "Kiribati_bassin_12", - "Kiribati", - "Kiribati_bassin_5", - "Kiribati_bassin_6", - "Kiribati_bassin_7", - "Kiribati_bassin_8", - "Kiribati_bassin_9", - "Kuril_islands_bassin_10", - "Kuril_islands_bassin_11", - "Kuril_islands_bassin_12", - "Kuril_islands", - "Kuril_islands_bassin_5", - "Kuril_islands_bassin_6", - "Kuril_islands_bassin_7", - "Kuril_islands_bassin_8", - "Kuril_islands_bassin_9", - "Kuwait_bassin_10", - "Kuwait_bassin_11", - "Kuwait_bassin_12", - "Kuwait", - "Kuwait_bassin_5", - "Kuwait_bassin_6", - "Kuwait_bassin_7", - "Kuwait_bassin_8", - "Kuwait_bassin_9", - "Kyrgyzstan_bassin_10", - "Kyrgyzstan_bassin_11", - "Kyrgyzstan_bassin_12", - "Kyrgyzstan", - "Kyrgyzstan_bassin_5", - "Kyrgyzstan_bassin_6", - "Kyrgyzstan_bassin_7", - "Kyrgyzstan_bassin_8", - "Kyrgyzstan_bassin_9", - "Lao_Peoples Democratic Republic_bassin_10", - "Lao_Peoples Democratic Republic_bassin_11", - "Lao_Peoples Democratic Republic_bassin_12", - "Lao_Peoples Democratic Republic", - "Lao_Peoples Democratic Republic_bassin_5", - "Lao_Peoples Democratic Republic_bassin_6", - "Lao_Peoples Democratic Republic_bassin_7", - "Lao_Peoples Democratic Republic_bassin_8", - "Lao_Peoples Democratic Republic_bassin_9", - "Latvia_bassin_10", - "Latvia_bassin_11", - "Latvia_bassin_12", - "Latvia", - "Latvia_bassin_5", - "Latvia_bassin_6", - "Latvia_bassin_7", - "Latvia_bassin_8", - "Latvia_bassin_9", - "Lebanon_bassin_10", - "Lebanon_bassin_11", - "Lebanon_bassin_12", - "Lebanon", - "Lebanon_bassin_5", - "Lebanon_bassin_6", - "Lebanon_bassin_7", - "Lebanon_bassin_8", - "Lebanon_bassin_9", - "Lesotho_bassin_10", - "Lesotho_bassin_11", - "Lesotho_bassin_12", - "Lesotho", - "Lesotho_bassin_5", - "Lesotho_bassin_6", - "Lesotho_bassin_7", - "Lesotho_bassin_8", - "Lesotho_bassin_9", - "Liberia_bassin_10", - "Liberia_bassin_11", - "Liberia_bassin_12", - "Liberia", - "Liberia_bassin_5", - "Liberia_bassin_6", - "Liberia_bassin_7", - "Liberia_bassin_8", - "Liberia_bassin_9", - "Libya_bassin_10", - "Libya_bassin_11", - "Libya_bassin_12", - "Libya", - "Libya_bassin_5", - "Libya_bassin_6", - "Libya_bassin_7", - "Libya_bassin_8", - "Libya_bassin_9", - "Liechtenstein_bassin_10", - "Liechtenstein_bassin_11", - "Liechtenstein_bassin_12", - "Liechtenstein", - "Liechtenstein_bassin_5", - "Liechtenstein_bassin_6", - "Liechtenstein_bassin_7", - "Liechtenstein_bassin_8", - "Liechtenstein_bassin_9", - "Lithuania_bassin_10", - "Lithuania_bassin_11", - "Lithuania_bassin_12", - "Lithuania", - "Lithuania_bassin_5", - "Lithuania_bassin_6", - "Lithuania_bassin_7", - "Lithuania_bassin_8", - "Lithuania_bassin_9", - "Luxembourg_bassin_10", - "Luxembourg_bassin_11", - "Luxembourg_bassin_12", - "Luxembourg", - "Luxembourg_bassin_5", - "Luxembourg_bassin_6", - "Luxembourg_bassin_7", - "Luxembourg_bassin_8", - "Luxembourg_bassin_9", - "Macau_bassin_10", - "Macau_bassin_11", - "Macau_bassin_12", - "Macau", - "Macau_bassin_5", - "Macau_bassin_6", - "Macau_bassin_7", - "Macau_bassin_8", - "Macau_bassin_9", - "Madagascar_bassin_10", - "Madagascar_bassin_11", - "Madagascar_bassin_12", - "Madagascar", - "Madagascar_bassin_5", - "Madagascar_bassin_6", - "Madagascar_bassin_7", - "Madagascar_bassin_8", - "Madagascar_bassin_9", - "Madeira_Islands_bassin_10", - "Madeira_Islands_bassin_11", - "Madeira_Islands_bassin_12", - "Madeira_Islands", - "Madeira_Islands_bassin_5", - "Madeira_Islands_bassin_6", - "Madeira_Islands_bassin_7", - "Madeira_Islands_bassin_8", - "Madeira_Islands_bassin_9", - "Malawi_bassin_10", - "Malawi_bassin_11", - "Malawi_bassin_12", - "Malawi", - "Malawi_bassin_5", - "Malawi_bassin_6", - "Malawi_bassin_7", - "Malawi_bassin_8", - "Malawi_bassin_9", - "Malaysia_bassin_10", - "Malaysia_bassin_11", - "Malaysia_bassin_12", - "Malaysia", - "Malaysia_bassin_5", - "Malaysia_bassin_6", - "Malaysia_bassin_7", - "Malaysia_bassin_8", - "Malaysia_bassin_9", - "Maldives_bassin_10", - "Maldives_bassin_11", - "Maldives_bassin_12", - "Maldives", - "Maldives_bassin_5", - "Maldives_bassin_6", - "Maldives_bassin_7", - "Maldives_bassin_8", - "Maldives_bassin_9", - "Matan_al-Sarra_bassin_10", - "Matan_al-Sarra_bassin_11", - "Matan_al-Sarra_bassin_12", - "Matan_al-Sarra", - "Matan_al-Sarra_bassin_5", - "Matan_al-Sarra_bassin_6", - "Matan_al-Sarra_bassin_7", - "Matan_al-Sarra_bassin_8", - "Matan_al-Sarra_bassin_9", - "Montenegro_bassin_10", - "Montenegro_bassin_11", - "Montenegro_bassin_12", - "Montenegro", - "Montenegro_bassin_5", - "Montenegro_bassin_6", - "Montenegro_bassin_7", - "Montenegro_bassin_8", - "Montenegro_bassin_9", - "Qatar_bassin_10", - "Qatar_bassin_11", - "Qatar_bassin_12", - "Republic_of Korea_bassin_10", - "Republic_of Korea_bassin_11", - "Republic_of Korea_bassin_12", - "Republic_of Korea", - "Republic_of Korea_bassin_5", - "Republic_of Korea_bassin_6", - "Republic_of Korea_bassin_7", - "Republic_of Korea_bassin_8", - "Republic_of Korea_bassin_9", - "Romania_bassin_10", - "Romania_bassin_11", - "Romania_bassin_12", - "Romania", - "Romania_bassin_5", - "Romania_bassin_6", - "Romania_bassin_7", - "Romania_bassin_8", - "Romania_bassin_9", - "Russian_Federation_bassin_10", - "Russian_Federation_bassin_11", - "Russian_Federation_bassin_12", - "Russian_Federation", - "Russian_Federation_bassin_5", - "Russian_Federation_bassin_6", - "Russian_Federation_bassin_7", - "Russian_Federation_bassin_8", - "Russian_Federation_bassin_9", - "Rwanda_bassin_10", - "Rwanda_bassin_11", - "Rwanda_bassin_12", - "Rwanda", - "Rwanda_bassin_5", - "Rwanda_bassin_6", - "Rwanda_bassin_7", - "Rwanda_bassin_8", - "Rwanda_bassin_9", - "Saint_Helena_bassin_10", - "Saint_Helena_bassin_11", - "Saint_Helena_bassin_12", - "Saint_Helena", - "Saint_Helena_bassin_5", - "Saint_Helena_bassin_6", - "Saint_Helena_bassin_7", - "Saint_Helena_bassin_8", - "Saint_Helena_bassin_9", - "Saint_Kitts and Nevis_bassin_10", - "Saint_Kitts and Nevis_bassin_11", - "Saint_Kitts and Nevis_bassin_12", - "Saint_Kitts and Nevis", - "Saint_Kitts and Nevis_bassin_5", - "Saint_Kitts and Nevis_bassin_6", - "Saint_Kitts and Nevis_bassin_7", - "Saint_Kitts and Nevis_bassin_8", - "Saint_Kitts and Nevis_bassin_9", - "Saint_Lucia_bassin_10", - "Saint_Lucia_bassin_11", - "Saint_Lucia_bassin_12", - "Saint_Lucia", - "Saint_Lucia_bassin_5", - "Saint_Lucia_bassin_6", - "Saint_Lucia_bassin_7", - "Saint_Lucia_bassin_8", - "Saint_Lucia_bassin_9", - "Saint_Pierre et Miquelon_bassin_10", - "Saint_Pierre et Miquelon_bassin_11", - "Saint_Pierre et Miquelon_bassin_12", - "Saint_Pierre et Miquelon", - "Saint_Pierre et Miquelon_bassin_5", - "Saint_Pierre et Miquelon_bassin_6", - "Saint_Pierre et Miquelon_bassin_7", - "Saint_Pierre et Miquelon_bassin_8", - "Saint_Pierre et Miquelon_bassin_9", - "Saint_Vincent and the Grenadines_bassin_10", - "Saint_Vincent and the Grenadines_bassin_11", - "Saint_Vincent and the Grenadines_bassin_12", - "Saint_Vincent and the Grenadines", - "Saint_Vincent and the Grenadines_bassin_5", - "Saint_Vincent and the Grenadines_bassin_6", - "Saint_Vincent and the Grenadines_bassin_7", - "Saint_Vincent and the Grenadines_bassin_8", - "Saint_Vincent and the Grenadines_bassin_9", - "Samoa_bassin_10", - "Samoa_bassin_11", - "Samoa_bassin_12", - "Samoa", - "Samoa_bassin_5", - "Samoa_bassin_6", - "Samoa_bassin_7", - "Samoa_bassin_8", - "Samoa_bassin_9", - "San_Marino_bassin_10", - "San_Marino_bassin_11", - "San_Marino_bassin_12", - "San_Marino", - "San_Marino_bassin_5", - "San_Marino_bassin_6", - "San_Marino_bassin_7", - "San_Marino_bassin_8", - "San_Marino_bassin_9", - "Sao_Tome and Principe_bassin_10", - "Sao_Tome and Principe_bassin_11", - "Sao_Tome and Principe_bassin_12", - "Sao_Tome and Principe", - "Sao_Tome and Principe_bassin_5", - "Sao_Tome and Principe_bassin_6", - "Sao_Tome and Principe_bassin_7", - "Sao_Tome and Principe_bassin_8", - "Sao_Tome and Principe_bassin_9", - "Saudi_Arabia_bassin_10", - "Saudi_Arabia_bassin_11", - "Saudi_Arabia_bassin_12", - "Saudi_Arabia", - "Saudi_Arabia_bassin_5", - "Saudi_Arabia_bassin_6", - "Saudi_Arabia_bassin_7", - "Saudi_Arabia_bassin_8", - "Saudi_Arabia_bassin_9", - "Scarborough_Reef_bassin_10", - "Scarborough_Reef_bassin_11", - "Scarborough_Reef_bassin_12", - "Scarborough_Reef", - "Scarborough_Reef_bassin_5", - "Scarborough_Reef_bassin_6", - "Scarborough_Reef_bassin_7", - "Scarborough_Reef_bassin_8", - "Scarborough_Reef_bassin_9", - "Senegal_bassin_10", - "Senegal_bassin_11", - "Senegal_bassin_12", - "Senegal", - "Senegal_bassin_5", - "Senegal_bassin_6", - "Senegal_bassin_7", - "Senegal_bassin_8", - "Senegal_bassin_9", - "Senkaku_Islands_bassin_10", - "Senkaku_Islands_bassin_11", - "Senkaku_Islands_bassin_12", - "Senkaku_Islands", - "Senkaku_Islands_bassin_5", - "Senkaku_Islands_bassin_6", - "Senkaku_Islands_bassin_7", - "Senkaku_Islands_bassin_8", - "Senkaku_Islands_bassin_9", - "Serbia_bassin_10", - "Serbia_bassin_11", - "Serbia_bassin_12", - "Serbia", - "Serbia_bassin_5", - "Serbia_bassin_6", - "Serbia_bassin_7", - "Serbia_bassin_8", - "Serbia_bassin_9", - "Seychelles_bassin_10", - "Seychelles_bassin_11", - "Seychelles_bassin_12", - "Seychelles", - "Seychelles_bassin_5", - "Seychelles_bassin_6", - "Seychelles_bassin_7", - "Seychelles_bassin_8", - "Seychelles_bassin_9", - "Sierra_Leone_bassin_10", - "Sierra_Leone_bassin_11", - "Sierra_Leone_bassin_12", - "Sierra_Leone", - "Sierra_Leone_bassin_5", - "Sierra_Leone_bassin_6", - "Sierra_Leone_bassin_7", - "Sierra_Leone_bassin_8", - "Sierra_Leone_bassin_9", - "Singapore_bassin_10", - "Singapore_bassin_11", - "Singapore_bassin_12", - "Singapore", - "Singapore_bassin_5", - "Singapore_bassin_6", - "Singapore_bassin_7", - "Singapore_bassin_8", - "Singapore_bassin_9", - "Slovakia_bassin_10", - "Slovakia_bassin_11", - "Slovakia_bassin_12", - "Slovakia", - "Slovakia_bassin_5", - "Slovakia_bassin_6", - "Slovakia_bassin_7", - "Slovakia_bassin_8", - "Slovakia_bassin_9", - "Slovenia_bassin_10", - "Slovenia_bassin_11", - "Slovenia_bassin_12", - "Slovenia", - "Slovenia_bassin_5", - "Slovenia_bassin_6", - "Slovenia_bassin_7", - "Slovenia_bassin_8", - "Slovenia_bassin_9", - "Solomon_Islands_bassin_10", - "Solomon_Islands_bassin_11", - "Solomon_Islands_bassin_12", - "Solomon_Islands", - "Solomon_Islands_bassin_5", - "Solomon_Islands_bassin_6", - "Solomon_Islands_bassin_7", - "Solomon_Islands_bassin_8", - "Solomon_Islands_bassin_9", - "Somalia_bassin_10", - "Somalia_bassin_11", - "Somalia_bassin_12", - "Somalia", - "Somalia_bassin_5", - "Somalia_bassin_6", - "Somalia_bassin_7", - "Somalia_bassin_8", - "Somalia_bassin_9", - "South_Africa_bassin_10", - "South_Africa_bassin_11", - "South_Africa_bassin_12", - "South_Africa", - "South_Africa_bassin_5", - "South_Africa_bassin_6", - "South_Africa_bassin_7", - "South_Africa_bassin_8", - "South_Africa_bassin_9", - "South_Georgia and the South Sandwich Islands_bassin_10", - "South_Georgia and the South Sandwich Islands_bassin_11", - "South_Georgia and the South Sandwich Islands_bassin_12", - "South_Georgia and the South Sandwich Islands", - "South_Georgia and the South Sandwich Islands_bassin_5", - "South_Georgia and the South Sandwich Islands_bassin_6", - "South_Georgia and the South Sandwich Islands_bassin_7", - "South_Georgia and the South Sandwich Islands_bassin_8", - "South_Georgia and the South Sandwich Islands_bassin_9", - "South_Sudan_bassin_10", - "South_Sudan_bassin_11", - "South_Sudan_bassin_12", - "South_Sudan", - "South_Sudan_bassin_5", - "South_Sudan_bassin_6", - "South_Sudan_bassin_7", - "South_Sudan_bassin_8", - "South_Sudan_bassin_9", - "Spain_bassin_10", - "Spain_bassin_11", - "Spain_bassin_12", - "Spain", - "Spain_bassin_5", - "Spain_bassin_6", - "Spain_bassin_7", - "Spain_bassin_8", - "Spain_bassin_9", - "Spratly_Islands_bassin_10", - "Spratly_Islands_bassin_11", - "Spratly_Islands_bassin_12", - "Spratly_Islands", - "Spratly_Islands_bassin_5", - "Spratly_Islands_bassin_6", - "Spratly_Islands_bassin_7", - "Spratly_Islands_bassin_8", - "Spratly_Islands_bassin_9", - "Sri_Lanka_bassin_10", - "Sri_Lanka_bassin_11", - "Sri_Lanka_bassin_12", - "Sri_Lanka", - "Sri_Lanka_bassin_5", - "Sri_Lanka_bassin_6", - "Sri_Lanka_bassin_7", - "Sri_Lanka_bassin_8", - "Sri_Lanka_bassin_9", - "Suriname_bassin_10", - "Suriname_bassin_11", - "Suriname_bassin_12", - "Suriname", - "Suriname_bassin_5", - "Suriname_bassin_6", - "Suriname_bassin_7", - "Suriname_bassin_8", - "Suriname_bassin_9", - "Svalbard_and Jan Mayen Islands_bassin_10", - "Svalbard_and Jan Mayen Islands_bassin_11", - "Svalbard_and Jan Mayen Islands_bassin_12", - "Svalbard_and Jan Mayen Islands", - "Svalbard_and Jan Mayen Islands_bassin_5", - "Svalbard_and Jan Mayen Islands_bassin_6", - "Svalbard_and Jan Mayen Islands_bassin_7", - "Svalbard_and Jan Mayen Islands_bassin_8", - "Svalbard_and Jan Mayen Islands_bassin_9", - "Swaziland_bassin_10", - "Swaziland_bassin_11", - "Swaziland_bassin_12", - "Swaziland", - "Swaziland_bassin_5", - "Swaziland_bassin_6", - "Swaziland_bassin_7", - "Swaziland_bassin_8", - "Swaziland_bassin_9", - "Sweden_bassin_10", - "Sweden_bassin_11", - "Sweden_bassin_12", - "Sweden", - "Sweden_bassin_5", - "Sweden_bassin_6", - "Sweden_bassin_7", - "Sweden_bassin_8", - "Sweden_bassin_9", - "Switzerland_bassin_10", - "Switzerland_bassin_11", - "Switzerland_bassin_12", - "Switzerland", - "Switzerland_bassin_5", - "Switzerland_bassin_6", - "Switzerland_bassin_7", - "Switzerland_bassin_8", - "Switzerland_bassin_9", - "Syrian_Arab Republic_bassin_10", - "Syrian_Arab Republic_bassin_11", - "Syrian_Arab Republic_bassin_12", - "Syrian_Arab Republic", - "Syrian_Arab Republic_bassin_5", - "Syrian_Arab Republic_bassin_6", - "Syrian_Arab Republic_bassin_7", - "Syrian_Arab Republic_bassin_8", - "Syrian_Arab Republic_bassin_9", - "Taiwan_bassin_10", - "Taiwan_bassin_11", - "Taiwan_bassin_12", - "Taiwan", - "Taiwan_bassin_5", - "Taiwan_bassin_6", - "Taiwan_bassin_7", - "Taiwan_bassin_8", - "Taiwan_bassin_9", - "Tajikistan_bassin_10", - "Tajikistan_bassin_11", - "Tajikistan_bassin_12", - "Tajikistan", - "Tajikistan_bassin_5", - "Tajikistan_bassin_6", - "Tajikistan_bassin_7", - "Tajikistan_bassin_8", - "Tajikistan_bassin_9", - "Thailand_bassin_10", - "Thailand_bassin_11", - "Thailand_bassin_12", - "Thailand", - "Thailand_bassin_5", - "Thailand_bassin_6", - "Thailand_bassin_7", - "Thailand_bassin_8", - "Thailand_bassin_9", - "The_former Yugoslav Republic of Macedonia_bassin_10", - "The_former Yugoslav Republic of Macedonia_bassin_11", - "The_former Yugoslav Republic of Macedonia_bassin_12", - "The_former Yugoslav Republic of Macedonia", - "The_former Yugoslav Republic of Macedonia_bassin_5", - "The_former Yugoslav Republic of Macedonia_bassin_6", - "The_former Yugoslav Republic of Macedonia_bassin_7", - "The_former Yugoslav Republic of Macedonia_bassin_8", - "The_former Yugoslav Republic of Macedonia_bassin_9", - "Timor-Leste_bassin_10", - "Timor-Leste_bassin_11", - "Timor-Leste_bassin_12", - "Timor-Leste", - "Timor-Leste_bassin_5", - "Timor-Leste_bassin_6", - "Timor-Leste_bassin_7", - "Timor-Leste_bassin_8", - "Timor-Leste_bassin_9", - "Togo_bassin_10", - "Togo_bassin_11", - "Togo_bassin_12", - "Togo", - "Togo_bassin_5", - "Togo_bassin_6", - "Togo_bassin_7", - "Togo_bassin_8", - "Togo_bassin_9", - "Tokelau_bassin_10", - "Tokelau_bassin_11", - "Tokelau_bassin_12", - "Tokelau", - "Tokelau_bassin_5", - "Tokelau_bassin_6", - "Tokelau_bassin_7", - "Tokelau_bassin_8", - "Tokelau_bassin_9", - "Tonga_bassin_10", - "Tonga_bassin_11", - "Tonga_bassin_12", - "Tonga", - "Tonga_bassin_5", - "Tonga_bassin_6", - "Tonga_bassin_7", - "Tonga_bassin_8", - "Tonga_bassin_9", - "Trinidad_and Tobago_bassin_10", - "Trinidad_and Tobago_bassin_11", - "Trinidad_and Tobago_bassin_12", - "Trinidad_and Tobago", - "Trinidad_and Tobago_bassin_5", - "Trinidad_and Tobago_bassin_6", - "Trinidad_and Tobago_bassin_7", - "Trinidad_and Tobago_bassin_8", - "Trinidad_and Tobago_bassin_9", - "Tromelin_Island_bassin_10", - "Tromelin_Island_bassin_11", - "Tromelin_Island_bassin_12", - "Tromelin_Island", - "Tromelin_Island_bassin_5", - "Tromelin_Island_bassin_6", - "Tromelin_Island_bassin_7", - "Tromelin_Island_bassin_8", - "Tromelin_Island_bassin_9", - "Tunisia_bassin_10", - "Tunisia_bassin_11", - "Tunisia_bassin_12", - "Tunisia", - "Tunisia_bassin_5", - "Tunisia_bassin_6", - "Tunisia_bassin_7", - "Tunisia_bassin_8", - "Tunisia_bassin_9", - "Turkey_bassin_10", - "Turkey_bassin_11", - "Turkey_bassin_12", - "Turkey", - "Turkey_bassin_5", - "Turkey_bassin_6", - "Turkey_bassin_7", - "Turkey_bassin_8", - "Turkey_bassin_9", - "Turkmenistan_bassin_10", - "Turkmenistan_bassin_11", - "Turkmenistan_bassin_12", - "Turkmenistan", - "Turkmenistan_bassin_5", - "Turkmenistan_bassin_6", - "Turkmenistan_bassin_7", - "Turkmenistan_bassin_8", - "Turkmenistan_bassin_9", - "Turks_and Caicos islands_bassin_10", - "Turks_and Caicos islands_bassin_11", - "Turks_and Caicos islands_bassin_12", - "Turks_and Caicos islands", - "Turks_and Caicos islands_bassin_5", - "Turks_and Caicos islands_bassin_6", - "Turks_and Caicos islands_bassin_7", - "Turks_and Caicos islands_bassin_8", - "Turks_and Caicos islands_bassin_9", - "Tuvalu_bassin_10", - "Tuvalu_bassin_11", - "Tuvalu_bassin_12", - "Tuvalu", - "Tuvalu_bassin_5", - "Tuvalu_bassin_6", - "Tuvalu_bassin_7", - "Tuvalu_bassin_8", - "Tuvalu_bassin_9", - "Uganda_bassin_10", - "Uganda_bassin_11", - "Uganda_bassin_12", - "Uganda", - "Uganda_bassin_5", - "Uganda_bassin_6", - "Uganda_bassin_7", - "Uganda_bassin_8", - "Uganda_bassin_9", - "Ukraine_bassin_10", - "Ukraine_bassin_11", - "Ukraine_bassin_12", - "Ukraine", - "Ukraine_bassin_5", - "Ukraine_bassin_6", - "Ukraine_bassin_7", - "Ukraine_bassin_8", - "Ukraine_bassin_9", - "UK_of Great Britain and Northern Ireland_bassin_10", - "UK_of Great Britain and Northern Ireland_bassin_11", - "UK_of Great Britain and Northern Ireland_bassin_12", - "UK_of Great Britain and Northern Ireland", - "UK_of Great Britain and Northern Ireland_bassin_5", - "UK_of Great Britain and Northern Ireland_bassin_6", - "UK_of Great Britain and Northern Ireland_bassin_7", - "UK_of Great Britain and Northern Ireland_bassin_8", - "UK_of Great Britain and Northern Ireland_bassin_9", - "United_Arab Emirates_bassin_10", - "United_Arab Emirates_bassin_11", - "United_Arab Emirates_bassin_12", - "United_Arab Emirates", - "United_Arab Emirates_bassin_5", - "United_Arab Emirates_bassin_6", - "United_Arab Emirates_bassin_7", - "United_Arab Emirates_bassin_8", - "United_Arab Emirates_bassin_9", - "United_Republic of Tanzania_bassin_10", - "United_Republic of Tanzania_bassin_11", - "United_Republic of Tanzania_bassin_12", - "United_Republic of Tanzania", - "United_Republic of Tanzania_bassin_5", - "United_Republic of Tanzania_bassin_6", - "United_Republic of Tanzania_bassin_7", - "United_Republic of Tanzania_bassin_8", - "United_Republic of Tanzania_bassin_9", - "United_States of America_bassin_10", - "United_States of America_bassin_11", - "United_States of America_bassin_12", - "United_States of America", - "United_States of America_bassin_5", - "United_States of America_bassin_6", - "United_States of America_bassin_7", - "United_States of America_bassin_8", - "United_States of America_bassin_9", - "United_States Virgin Islands_bassin_10", - "United_States Virgin Islands_bassin_11", - "United_States Virgin Islands_bassin_12", - "United_States Virgin Islands", - "United_States Virgin Islands_bassin_5", - "United_States Virgin Islands_bassin_6", - "United_States Virgin Islands_bassin_7", - "United_States Virgin Islands_bassin_8", - "United_States Virgin Islands_bassin_9", - "Uruguay_bassin_10", - "Uruguay_bassin_11", - "Uruguay_bassin_12", - "Uruguay", - "Uruguay_bassin_5", - "Uruguay_bassin_6", - "Uruguay_bassin_7", - "Uruguay_bassin_8", - "Uruguay_bassin_9", - "Uzbekistan_bassin_10", - "Uzbekistan_bassin_11", - "Uzbekistan_bassin_12", - "Uzbekistan", - "Uzbekistan_bassin_5", - "Uzbekistan_bassin_6", - "Uzbekistan_bassin_7", - "Uzbekistan_bassin_8", - "Uzbekistan_bassin_9", - "Vanuatu_bassin_10", - "Vanuatu_bassin_11", - "Vanuatu_bassin_12", - "Vanuatu", - "Vanuatu_bassin_5", - "Vanuatu_bassin_6", - "Vanuatu_bassin_7", - "Vanuatu_bassin_8", - "Vanuatu_bassin_9", - "Venezuela_bassin_10", - "Venezuela_bassin_11", - "Venezuela_bassin_12", - "Venezuela", - "Venezuela_bassin_5", - "Venezuela_bassin_6", - "Venezuela_bassin_7", - "Venezuela_bassin_8", - "Venezuela_bassin_9", - "Viet_Nam_bassin_10", - "Viet_Nam_bassin_11", - "Viet_Nam_bassin_12", - "Viet_Nam", - "Viet_Nam_bassin_5", - "Viet_Nam_bassin_6", - "Viet_Nam_bassin_7", - "Viet_Nam_bassin_8", - "Viet_Nam_bassin_9", - "Wake_Island_bassin_10", - "Wake_Island_bassin_11", - "Wake_Island_bassin_12", - "Wake_Island", - "Wake_Island_bassin_5", - "Wake_Island_bassin_6", - "Wake_Island_bassin_7", - "Wake_Island_bassin_8", - "Wake_Island_bassin_9", - "Wallis_and Futuna_bassin_10", - "Wallis_and Futuna_bassin_11", - "Wallis_and Futuna_bassin_12", - "Wallis_and Futuna", - "Wallis_and Futuna_bassin_5", - "Wallis_and Futuna_bassin_6", - "Wallis_and Futuna_bassin_7", - "Wallis_and Futuna_bassin_8", - "Wallis_and Futuna_bassin_9", - "Western_Sahara_bassin_10", - "Western_Sahara_bassin_11", - "Western_Sahara_bassin_12", - "Western_Sahara", - "Western_Sahara_bassin_5", - "Western_Sahara_bassin_6", - "Western_Sahara_bassin_7", - "Western_Sahara_bassin_8", - "Western_Sahara_bassin_9", - "West_Bank_bassin_10", - "West_Bank_bassin_11", - "West_Bank_bassin_12", - "West_Bank", - "West_Bank_bassin_5", - "West_Bank_bassin_6", - "West_Bank_bassin_7", - "West_Bank_bassin_8", - "West_Bank_bassin_9", - "Yemen_bassin_10", - "Yemen_bassin_11", - "Yemen_bassin_12", - "Yemen", - "Yemen_bassin_5", - "Yemen_bassin_6", - "Yemen_bassin_7", - "Yemen_bassin_8", - "Yemen_bassin_9", - "Zambia_bassin_10", - "Zambia_bassin_11", - "Zambia_bassin_12", - "Zambia", - "Zambia_bassin_5", - "Zambia_bassin_6", - "Zambia_bassin_7", - "Zambia_bassin_8", - "Zambia_bassin_9", - "Zimbabwe_bassin_10", - "Zimbabwe_bassin_11", - "Zimbabwe_bassin_12", - "Zimbabwe", - "Zimbabwe_bassin_5", - "Zimbabwe_bassin_6", - "Zimbabwe_bassin_7", - "Zimbabwe_bassin_8", - "Zimbabwe_bassin_9" - ) ); - - public static void main(String[] args) { - - ArrayList missingCountries = new ArrayList(); - - for (String country : allCountryNames) { - if( !filesGenerated.contains(country) ) { - missingCountries.add( country); - } - } - System.out.println( missingCountries.size() ); - System.out.println( missingCountries ); - - String finalCountries = ""; - for (String missing : missingCountries) { - finalCountries += '"' + missing.replaceAll( "_", " ") + "\", "; - } - System.out.println( finalCountries ); - - } - - -} +package org.openforis.collect.earth.app.desktop; + +import java.awt.Image; +import java.awt.SplashScreen; +import java.awt.Window; +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.net.MalformedURLException; +import java.net.Socket; +import java.net.URL; +import java.net.URLConnection; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.Observer; + +import javax.swing.ImageIcon; +import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; + +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.SystemUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.desktop.ServerController.ServerInitializationEvent; +import org.openforis.collect.earth.app.logging.GAlogger; +import org.openforis.collect.earth.app.server.LoadProjectFileServlet; +import org.openforis.collect.earth.app.service.EarthProjectsService; +import org.openforis.collect.earth.app.service.FolderFinder; +import org.openforis.collect.earth.app.service.KmlGeneratorService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.app.service.UpdateIniUtils; +import org.openforis.collect.earth.app.view.CheckForUpdatesListener; +import org.openforis.collect.earth.app.view.CollectEarthWindow; +import org.openforis.collect.earth.app.view.Messages; +import org.openforis.collect.earth.app.view.PropertiesDialog; +import org.openforis.collect.earth.sampler.utils.KmlGenerationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.opencsv.exceptions.CsvValidationException; + +import io.sentry.Sentry; +import io.sentry.protocol.User; + +/** + * Contains the main class that starts Collect Earth and opens Google Earth. + * + * @author Alfonso Sanchez-Paus Diaz + * + */ +public class EarthApp { + + private static Logger logger; + private static ServerController serverController; + private static EarthApp earthApp; + + private static void closeSplash() { + try { + final SplashScreen splash = SplashScreen.getSplashScreen(); + if (splash != null) { + splash.close(); + } + } catch (final IllegalStateException e) { + logger.error("Error closing the splash window", e); //$NON-NLS-1$ + } + } + + /** + * Start the application, opening Google Earth and starting the Jetty server. + * + * @param args + * No arguments are used by this method. + */ + public static void main(String[] args) { + + try { + + // System property used in the web.xml configuration + System.setProperty("collectEarth.userFolder", FolderFinder.getCollectEarthDataFolder()); //$NON-NLS-1$ + + // Specify a browser as http.agent so that calls to CloudFlare hosted OpenForis.org do not return with a 403 http error + System.setProperty("http.agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2"); + + initializeSentry(); + + // Change of font so that Lao and Thao glyphs are supported + CollectEarthUtils.setFontDependingOnLanguaue( getLocalProperties().getUiLanguage() ); + + logger = LoggerFactory.getLogger(EarthApp.class); + + String doubleClickedProjectFile = null; + + if (args != null && args.length == 1) { + doubleClickedProjectFile = args[0]; + }else if( getProjectsService().getProjectList().size() == 0 ){ + doubleClickedProjectFile = "resources/demo_survey.cep"; + } + + if ( SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX){ + handleMacStartup( doubleClickedProjectFile ); + }else{ + startCollectEarth( doubleClickedProjectFile ); + } + + } catch (final Exception e) { + // The logger factory has not been initialized, this will not work, just output to console + if (logger != null) { + logger.error("The server could not start", e); //$NON-NLS-1$ + } + System.exit(1); + } finally { + closeSplash(); + } + } + + private static void initializeSentry() { + try { + String releaseName= UpdateIniUtils.getReleaseNameInstalled(); + + Sentry.init("https://24dd6a90c1e4461484712db99c3b3bb7:831e42661c5c4ff3aa5eca270db3f619@sentry.io/299626?release="+releaseName+"&maxmessagelength=2000" ); + if( !StringUtils.isEmpty( UpdateIniUtils.getVersionInstalled() ) ) { + Sentry.setTag( "ReleaseDate", UpdateIniUtils.getVersionInstalled() ); + } + if( !StringUtils.isEmpty( getLocalProperties().getOperator() ) ) { + User user = new User(); + user.setUsername( getLocalProperties().getOperator() ); + Sentry.setUser(user); + } + + } catch (Exception e) { + logger.error( "Error initializing Sentry logger" , e); + } + } + /** + * Special code that uses reflection to handle how the application should behave in Mac OS X. + * Without reflection the code provokes compilation-time errors. + * @param doubleClickedProjectFile Project file (CEP) that was clicked + * @throws Exception Throws Exception when the process fails to open the file double-clicked. Initializes the server in any case + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + public static void handleMacStartup(String doubleClickedProjectFile) throws Exception{ + try { + Class applicationClass = Class.forName("com.apple.eawt.Application"); + Method getApplicationMethod = applicationClass.getMethod("getApplication"); + Method setDockIconImageMethod = applicationClass.getMethod( "setDockIconImage", Image.class ); + + Class openFilesHandlerInterface = Class.forName("com.apple.eawt.OpenFilesHandler"); + Method setOpenFileHandlerMethod = applicationClass.getMethod( "setOpenFileHandler", openFilesHandlerInterface ); + + // SET THE MAC OS X DOCK ICON! + // Get an Application object + Object applicationObject = getApplicationMethod.invoke( null ); + try { + Image dockIconImage = new ImageIcon(new File("images/dockIconMac.png").toURI().toURL()).getImage(); + // Invoke the setDockIconImage on the application object using the dockIconImage as an argument + setDockIconImageMethod.invoke(applicationObject, dockIconImage ); + } catch (MalformedURLException e2) { + logger.error("Problems finding the docker icon", e2); + } + // ------------------------------------------- + + + // DEFINE A LISTENER THAT IS REGISTERED BY THE OS TO HEAR DOUBLE-CLICK EVENTS AND REGISTER ITSELF AS THE CEP OPENER + MacOpenFilesInvocationHandler macOpenFileHandlerProxyInterface = new MacOpenFilesInvocationHandler(); + Object openFilesHandlerImplementation = Proxy.newProxyInstance( + applicationClass.getClassLoader(), + new Class[]{ openFilesHandlerInterface }, + macOpenFileHandlerProxyInterface + ); + + // Call the setOpenFileHandler method of the application object using the + setOpenFileHandlerMethod.invoke(applicationObject, ( openFilesHandlerInterface.cast( openFilesHandlerImplementation ) ) ); + + // Lets wait for the Apple event to arrive. If it did then the earthApp variable will be non-nulls + Thread.sleep(2000); + if( earthApp == null ){ + startCollectEarth( doubleClickedProjectFile ); + } + } catch (Exception e) { + logger.error("Error while defining the double-click behaviour on CEP files in Mac OS X", e); + startCollectEarth( null ); + } + } + + public void generateKml() { + + try { + getKmlGeneratorService().generateKmlFile(); + } catch (final KmlGenerationException e) { + logger.error("Problems while generating the KML file ", e); //$NON-NLS-1$ + showMessage("Problems while generating the KML file:
" + (e.getCause()!=null?(e.getCause()+"
"):"") + ( e.getMessage().length() > 300?e.getMessage().substring(0,300):e.getMessage() ) + ""); //$NON-NLS-1$ + } catch (final Exception e) { + logger.error("Could not generate KML file", e); //$NON-NLS-1$ + showMessage("Error generating KML file :
" + e.getMessage()); //$NON-NLS-1$ + } + } + + public static void openProjectFileInRunningCollectEarth(String doubleClickedProjecFile) throws IOException { + final File projectFile = new File(doubleClickedProjecFile); + + if (projectFile.exists()) { + + String hostAddress = ServerController.getHostAddress( getLocalProperties().getHost(), getLocalProperties().getPort()); + + URL loadProjectFileInRunningCE = new URL(hostAddress + LoadProjectFileServlet.SERVLET_NAME + + "?" + LoadProjectFileServlet.PROJECT_FILE_PARAMETER + "=" + //$NON-NLS-1$ //$NON-NLS-2$ + URLEncoder.encode(doubleClickedProjecFile, StandardCharsets.UTF_8.name() ) ); + URLConnection urlConn = loadProjectFileInRunningCE.openConnection(); + + try( BufferedReader in = new BufferedReader(new InputStreamReader(urlConn.getInputStream())) ){ + String inputLine; + while ((inputLine = in.readLine()) != null) { + logger.info(inputLine); + } + } + + } + } + + private static boolean isAnotherCollectEarthRunning(LocalPropertiesService localProperties) { + boolean alreadyRunning = false; + try { + new Socket( LocalPropertiesService.LOCAL_HOST , Integer.parseInt(localProperties.getPort())).close(); //$NON-NLS-1$ + // If here there is something is serving on port 8028 + // So stop it + logger.warn("There is a server already running {}", localProperties.getPort()); //$NON-NLS-1$ + alreadyRunning = true; + } catch (final IOException e) { + // Nothing there, so OK to proceed + logger.info("There is no server running in port {}", localProperties.getPort()); //$NON-NLS-1$ + alreadyRunning = false; + } catch (final NumberFormatException e) { + // Nothing there, so OK to proceed + logger.info("Error parsing integer value {}", localProperties.getPort()); //$NON-NLS-1$ + alreadyRunning = false; + } + return alreadyRunning; + } + + public static void quitServer() { + try { + serverController.stopServer(); + } catch (Exception e) { + logger.error("Error stoping server", e); //$NON-NLS-1$ + } + } + + /** + * Generates the KML for the project and opens it in Google Earth + * @param forceKmlRecreation Set to true if you want to forece the regeneration of the KML even if is is up to date (you might want to do this to force the update of the placemark icons as the date changes) + * @throws IOException Throws exception if the KMl file cannot be generated + * @throws KmlGenerationException Throws exception if the KML file contents cannot be generated + * @throws CsvValidationException + */ + private static synchronized void loadKmlInGoogleEarth(boolean forceKmlRecreation) throws IOException, KmlGenerationException, CsvValidationException { + earthApp.getKmlGeneratorService().generatePlacemarksKmzFile( forceKmlRecreation ); + earthApp.simulateClickKmz(); + } + + public static void restart() { + try { + + serverController.stopServer(); + startServer(null); + + } catch (final Exception e) { + logger.error("Error while stopping server", e); //$NON-NLS-1$ + } + } + + private static LocalPropertiesService nonManagedPropertiesService; + + + private static LocalPropertiesService getLocalProperties() { + if (serverController == null || serverController.getContext() == null) { + if (nonManagedPropertiesService == null) { + nonManagedPropertiesService = new LocalPropertiesService(); + } + return nonManagedPropertiesService; + } else { + return serverController.getContext().getBean(LocalPropertiesService.class); + } + } + + private static EarthProjectsService getProjectsService() { + if (serverController != null) { + return serverController.getContext().getBean(EarthProjectsService.class); + } else { + final EarthProjectsService earthProjectsService = new EarthProjectsService(); + earthProjectsService.init(getLocalProperties()); + return earthProjectsService; + } + } + + + private KmlGeneratorService getKmlGeneratorService() { + if (serverController != null) { + return serverController.getContext().getBean(KmlGeneratorService.class); + } else { + throw new IllegalStateException("The server must be initialized before this method is called"); //$NON-NLS-1$ + } + } + + private static void startCollectEarth(final String doubleClickedProjectFile) throws Exception { + logger.info("START - Server Initilization"); //$NON-NLS-1$ + final boolean ceAlreadyOpen = isAnotherCollectEarthRunning( getLocalProperties()); + + if( ceAlreadyOpen ){ + closeSplash(); + // If the user double clicked on a project file while Collect Earth is running then load the project in the running Collect Earth + if (doubleClickedProjectFile!=null) { + openProjectFileInRunningCollectEarth(doubleClickedProjectFile); + }else{ + showMessage(Messages.getString("EarthApp.11")); //$NON-NLS-1$ + } + }else{ + + startServer(doubleClickedProjectFile); + } + + GAlogger.logGAnalytics("Start"); + } + + public static void startServer(final String doubleClickedProjectFile) + throws Exception { + earthApp = new EarthApp(); + + // Load the double-clicked CEP file before the survey manager is instantiated by the server start-up + earthApp.loadProjectIfDoubleClicked(doubleClickedProjectFile); + + + final Observer observeInitialization = getServerObserver(); + serverStartAndOpenGe(observeInitialization); + } + + private static Observer getServerObserver() { + return (observable, initializationEvent) ->{ + if (initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT)) { + serverController = null; + } + + if( initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT) || + initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT) ){ + + showMessage( initializationEvent.toString()); + } + + if (!initializationEvent.equals(ServerInitializationEvent.SERVER_STOPPED_EVENT)) { + try { + earthApp.generateKml(); + earthApp.simulateClickKmz(); + earthApp.checkForUpdates(); + closeSplash(); + } catch (final Exception e) { + logger.error("Error generating KML file", e); //$NON-NLS-1$ + } + } + }; + } + + private void openKmlOnGoogleEarth(){ + if (! CollectEarthUtils.openFile( new File(KmlGeneratorService.KML_NETWORK_LINK_STARTER)) ) { + showMessage("The KML file cannot be open at " + KmlGeneratorService.KML_NETWORK_LINK_STARTER); //$NON-NLS-1$ + } + } + + private void checkForUpdates() { + new Thread("Check for new Collect Earth versions on the server") { + @Override + public void run() { + + // Wait a few seconds before checking for updates + try { + Thread.sleep(10000); + } catch (InterruptedException e1) { + logger.error("Error while waiting", e1); //$NON-NLS-1$ + } + + final UpdateIniUtils updateIniUtils = new UpdateIniUtils(); + + + if (updateIniUtils.shouldWarnUser(getLocalProperties() )) { + + javax.swing.SwingUtilities.invokeLater( () -> { + String remindLater = Messages.getString("EarthApp.3"); //$NON-NLS-1$ + String doItNow = Messages.getString("EarthApp.4"); //$NON-NLS-1$ + String doNotBother = Messages.getString("EarthApp.5"); //$NON-NLS-1$ + + String newestVersionOnline = updateIniUtils.getVersionAvailableOnline(); + + if( StringUtils.isNotBlank( newestVersionOnline ) ) { + + Object[] possibleValues = { remindLater, doItNow, doNotBother }; + int chosenOption = JOptionPane.showOptionDialog(null, + Messages.getString("EarthApp.57"), Messages.getString("EarthApp.58") + Messages.getString("EarthApp.6") + updateIniUtils.convertToDate(newestVersionOnline), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, possibleValues, possibleValues[0]); + if( chosenOption != JOptionPane.CLOSED_OPTION ){ + if (possibleValues[chosenOption].equals(doItNow)) { + CheckForUpdatesListener checkForUpdatesListener = new CheckForUpdatesListener(); + checkForUpdatesListener.actionPerformed(null); + } else if (possibleValues[chosenOption].equals(doNotBother)) { + getLocalProperties().setValue(EarthProperty.LAST_IGNORED_UPDATE, newestVersionOnline); + } + } + } + }); + } + } + }.start(); + + } + + + /** + * If Collect Earth is started by double clicking on a ".cep" file ( Collect Earth Project file ) + * Then it should open directly with that project in focus + * + * @param doubleClickedProjecFile + * The path to the CEP file that was double-clicked + * + */ + private void loadProjectIfDoubleClicked(String doubleClickedProjectFile) { + try { + if (doubleClickedProjectFile != null) { + + final File projectFile = new File(doubleClickedProjectFile); + + if (projectFile.exists()) { + getProjectsService().loadCompressedProjectFile(projectFile); + } + } + } catch (final Exception e) { + showMessage(Messages.getString("EarthApp.59")); //$NON-NLS-1$ + logger.error(Messages.getString("EarthApp.59"), e);//$NON-NLS-1$ + } + } + + private static void serverStartAndOpenGe(Observer observeInitialization) throws Exception { + serverController = new ServerController(); + serverController.deleteObservers(); + serverController.startServer(observeInitialization); + + // Inform Mac OS users of the issues about opening CEP files in the Mac version of CE + if(SystemUtils.IS_OS_MAC_OSX ) { + showMessage( + "" //$NON-NLS-1$ + + "" //$NON-NLS-1$ + + Messages.getString("EarthApp.70") + + ": " //$NON-NLS-1$ + + Messages.getString("EarthApp.71") + + Messages.getString("EarthApp.72") + + "" //$NON-NLS-1$ + + Messages.getString("CollectEarthWindow.10") + + " -> " //$NON-NLS-1$ + + Messages.getString("CollectEarthMenu.0") + + "", //$NON-NLS-1$ + Messages.getString("EarthApp.73") + ); + } + } + + public static void showMessage(String message) { + showMessage(message, "Collect Earth"); + + } + + public static void showMessage(String message, String title) { + try { + SwingUtilities.invokeLater( + () -> JOptionPane.showMessageDialog(null, message, title, JOptionPane.WARNING_MESSAGE) + ); + } catch (Exception e) { + logger.error("Error showing message",e); + } + + } + + private void simulateClickKmz() { + try { + getKmlGeneratorService().generateLoaderKmlFile(); + openKmlOnGoogleEarth(); + } catch (final Exception e) { + showMessage(Messages.getString("EarthApp.61")); //$NON-NLS-1$ + logger.error("The KMZ file could not be found", e); //$NON-NLS-1$ + } + } + + public static void executeKmlLoadAsynchronously( Window windowShowingTimer ) { + new Thread("Load KML in Google Earth"){ + @Override + public void run() { + // Only regenerate KML and reload + try { + SwingUtilities.invokeLater( ( ) -> { + if( windowShowingTimer != null ){ + CollectEarthWindow.startWaiting(windowShowingTimer); + } + }); + + EarthApp.loadKmlInGoogleEarth(true); + + } catch (Exception e) { + logger.error("Error loading the KML",e); + EarthApp.showMessage("Problems while generating the KML file:
" + + (e.getCause()!=null?(e.getCause()+"
"):"") + + ( + ( e.getMessage()!=null && e.getMessage().length() > 300 ) ? e.getMessage().substring(0,300) : + ( e.getMessage()!=null ) ? e.getMessage() : "" + ) + ""); //$NON-NLS-1$ + }finally{ + if( windowShowingTimer != null ){ + try { + SwingUtilities.invokeLater( () -> { + CollectEarthWindow.endWaiting(windowShowingTimer); + if( windowShowingTimer instanceof PropertiesDialog ){ + ( (PropertiesDialog) windowShowingTimer).closeDialog(); + } + }); + } catch (Exception e2) { + logger.error("Error closing Options dialog", e2); + } + } + } + + } + }.start(); + } + + +} From 3e82d0ecc54d1e675b553f7b9b845f6b8d0dcad9 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:01 +0100 Subject: [PATCH 0089/1620] New translations MacOpenFilesInvocationHandler.java (French) --- .../earth/app/view/Messages_fr.properties | 541 ++---------------- 1 file changed, 36 insertions(+), 505 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 0777f46090..1f014d967a 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,534 +1,65 @@ package org.openforis.collect.earth.app.desktop; -import java.awt.Image; -import java.awt.SplashScreen; -import java.awt.Window; -import java.io.BufferedReader; import java.io.File; import java.io.IOException; -import java.io.InputStreamReader; import java.lang.reflect.Method; -import java.lang.reflect.Proxy; -import java.net.MalformedURLException; -import java.net.Socket; -import java.net.URL; -import java.net.URLConnection; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.util.Observer; +import java.util.List; -import javax.swing.ImageIcon; -import javax.swing.JOptionPane; -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.SystemUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.desktop.ServerController.ServerInitializationEvent; -import org.openforis.collect.earth.app.logging.GAlogger; -import org.openforis.collect.earth.app.server.LoadProjectFileServlet; -import org.openforis.collect.earth.app.service.EarthProjectsService; -import org.openforis.collect.earth.app.service.FolderFinder; -import org.openforis.collect.earth.app.service.KmlGeneratorService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.app.service.UpdateIniUtils; -import org.openforis.collect.earth.app.view.CheckForUpdatesListener; -import org.openforis.collect.earth.app.view.CollectEarthWindow; -import org.openforis.collect.earth.app.view.Messages; -import org.openforis.collect.earth.app.view.PropertiesDialog; -import org.openforis.collect.earth.sampler.utils.KmlGenerationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.opencsv.exceptions.CsvValidationException; - -import io.sentry.Sentry; -import io.sentry.protocol.User; - /** - * Contains the main class that starts Collect Earth and opens Google Earth. - * + * Use reflection to be able to add the code specific to Mac OS X without generating compilation errors + * This class generates a Proxy so that an Interface method can be invoked. Sort of implementing an Interface using reflection + * @see How to implement an interface using Reflection * @author Alfonso Sanchez-Paus Diaz * */ -public class EarthApp { - - private static Logger logger; - private static ServerController serverController; - private static EarthApp earthApp; - - private static void closeSplash() { - try { - final SplashScreen splash = SplashScreen.getSplashScreen(); - if (splash != null) { - splash.close(); - } - } catch (final IllegalStateException e) { - logger.error("Error closing the splash window", e); //$NON-NLS-1$ - } - } - - /** - * Start the application, opening Google Earth and starting the Jetty server. - * - * @param args - * No arguments are used by this method. - */ - public static void main(String[] args) { - - try { - - // System property used in the web.xml configuration - System.setProperty("collectEarth.userFolder", FolderFinder.getCollectEarthDataFolder()); //$NON-NLS-1$ - - // Specify a browser as http.agent so that calls to CloudFlare hosted OpenForis.org do not return with a 403 http error - System.setProperty("http.agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2"); - - initializeSentry(); - - // Change of font so that Lao and Thao glyphs are supported - CollectEarthUtils.setFontDependingOnLanguaue( getLocalProperties().getUiLanguage() ); - - logger = LoggerFactory.getLogger(EarthApp.class); - - String doubleClickedProjectFile = null; - - if (args != null && args.length == 1) { - doubleClickedProjectFile = args[0]; - }else if( getProjectsService().getProjectList().size() == 0 ){ - doubleClickedProjectFile = "resources/demo_survey.cep"; - } - - if ( SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX){ - handleMacStartup( doubleClickedProjectFile ); - }else{ - startCollectEarth( doubleClickedProjectFile ); - } - - } catch (final Exception e) { - // The logger factory has not been initialized, this will not work, just output to console - if (logger != null) { - logger.error("The server could not start", e); //$NON-NLS-1$ - } - System.exit(1); - } finally { - closeSplash(); - } - } - - private static void initializeSentry() { - try { - String releaseName= UpdateIniUtils.getReleaseNameInstalled(); - - Sentry.init("https://24dd6a90c1e4461484712db99c3b3bb7:831e42661c5c4ff3aa5eca270db3f619@sentry.io/299626?release="+releaseName+"&maxmessagelength=2000" ); - if( !StringUtils.isEmpty( UpdateIniUtils.getVersionInstalled() ) ) { - Sentry.setTag( "ReleaseDate", UpdateIniUtils.getVersionInstalled() ); - } - if( !StringUtils.isEmpty( getLocalProperties().getOperator() ) ) { - User user = new User(); - user.setUsername( getLocalProperties().getOperator() ); - Sentry.setUser(user); - } - - } catch (Exception e) { - logger.error( "Error initializing Sentry logger" , e); - } - } - /** - * Special code that uses reflection to handle how the application should behave in Mac OS X. - * Without reflection the code provokes compilation-time errors. - * @param doubleClickedProjectFile Project file (CEP) that was clicked - * @throws Exception Throws Exception when the process fails to open the file double-clicked. Initializes the server in any case - */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - public static void handleMacStartup(String doubleClickedProjectFile) throws Exception{ - try { - Class applicationClass = Class.forName("com.apple.eawt.Application"); - Method getApplicationMethod = applicationClass.getMethod("getApplication"); - Method setDockIconImageMethod = applicationClass.getMethod( "setDockIconImage", Image.class ); - - Class openFilesHandlerInterface = Class.forName("com.apple.eawt.OpenFilesHandler"); - Method setOpenFileHandlerMethod = applicationClass.getMethod( "setOpenFileHandler", openFilesHandlerInterface ); - - // SET THE MAC OS X DOCK ICON! - // Get an Application object - Object applicationObject = getApplicationMethod.invoke( null ); - try { - Image dockIconImage = new ImageIcon(new File("images/dockIconMac.png").toURI().toURL()).getImage(); - // Invoke the setDockIconImage on the application object using the dockIconImage as an argument - setDockIconImageMethod.invoke(applicationObject, dockIconImage ); - } catch (MalformedURLException e2) { - logger.error("Problems finding the docker icon", e2); - } - // ------------------------------------------- - - - // DEFINE A LISTENER THAT IS REGISTERED BY THE OS TO HEAR DOUBLE-CLICK EVENTS AND REGISTER ITSELF AS THE CEP OPENER - MacOpenFilesInvocationHandler macOpenFileHandlerProxyInterface = new MacOpenFilesInvocationHandler(); - Object openFilesHandlerImplementation = Proxy.newProxyInstance( - applicationClass.getClassLoader(), - new Class[]{ openFilesHandlerInterface }, - macOpenFileHandlerProxyInterface - ); - - // Call the setOpenFileHandler method of the application object using the - setOpenFileHandlerMethod.invoke(applicationObject, ( openFilesHandlerInterface.cast( openFilesHandlerImplementation ) ) ); - - // Lets wait for the Apple event to arrive. If it did then the earthApp variable will be non-nulls - Thread.sleep(2000); - if( earthApp == null ){ - startCollectEarth( doubleClickedProjectFile ); - } - } catch (Exception e) { - logger.error("Error while defining the double-click behaviour on CEP files in Mac OS X", e); - startCollectEarth( null ); - } - } - - public void generateKml() { - - try { - getKmlGeneratorService().generateKmlFile(); - } catch (final KmlGenerationException e) { - logger.error("Problems while generating the KML file ", e); //$NON-NLS-1$ - showMessage("Problems while generating the KML file:
" + (e.getCause()!=null?(e.getCause()+"
"):"") + ( e.getMessage().length() > 300?e.getMessage().substring(0,300):e.getMessage() ) + ""); //$NON-NLS-1$ - } catch (final Exception e) { - logger.error("Could not generate KML file", e); //$NON-NLS-1$ - showMessage("Error generating KML file :
" + e.getMessage()); //$NON-NLS-1$ - } - } - - public static void openProjectFileInRunningCollectEarth(String doubleClickedProjecFile) throws IOException { - final File projectFile = new File(doubleClickedProjecFile); - - if (projectFile.exists()) { - - String hostAddress = ServerController.getHostAddress( getLocalProperties().getHost(), getLocalProperties().getPort()); - - URL loadProjectFileInRunningCE = new URL(hostAddress + LoadProjectFileServlet.SERVLET_NAME + - "?" + LoadProjectFileServlet.PROJECT_FILE_PARAMETER + "=" + //$NON-NLS-1$ //$NON-NLS-2$ - URLEncoder.encode(doubleClickedProjecFile, StandardCharsets.UTF_8.name() ) ); - URLConnection urlConn = loadProjectFileInRunningCE.openConnection(); - - try( BufferedReader in = new BufferedReader(new InputStreamReader(urlConn.getInputStream())) ){ - String inputLine; - while ((inputLine = in.readLine()) != null) { - logger.info(inputLine); - } - } +public class MacOpenFilesInvocationHandler implements java.lang.reflect.InvocationHandler { - } - } + private final Logger logger = LoggerFactory.getLogger(MacOpenFilesInvocationHandler.class); - private static boolean isAnotherCollectEarthRunning(LocalPropertiesService localProperties) { - boolean alreadyRunning = false; - try { - new Socket( LocalPropertiesService.LOCAL_HOST , Integer.parseInt(localProperties.getPort())).close(); //$NON-NLS-1$ - // If here there is something is serving on port 8028 - // So stop it - logger.warn("There is a server already running {}", localProperties.getPort()); //$NON-NLS-1$ - alreadyRunning = true; - } catch (final IOException e) { - // Nothing there, so OK to proceed - logger.info("There is no server running in port {}", localProperties.getPort()); //$NON-NLS-1$ - alreadyRunning = false; - } catch (final NumberFormatException e) { - // Nothing there, so OK to proceed - logger.info("Error parsing integer value {}", localProperties.getPort()); //$NON-NLS-1$ - alreadyRunning = false; - } - return alreadyRunning; - } - - public static void quitServer() { - try { - serverController.stopServer(); - } catch (Exception e) { - logger.error("Error stoping server", e); //$NON-NLS-1$ - } - } - - /** - * Generates the KML for the project and opens it in Google Earth - * @param forceKmlRecreation Set to true if you want to forece the regeneration of the KML even if is is up to date (you might want to do this to force the update of the placemark icons as the date changes) - * @throws IOException Throws exception if the KMl file cannot be generated - * @throws KmlGenerationException Throws exception if the KML file contents cannot be generated - * @throws CsvValidationException - */ - private static synchronized void loadKmlInGoogleEarth(boolean forceKmlRecreation) throws IOException, KmlGenerationException, CsvValidationException { - earthApp.getKmlGeneratorService().generatePlacemarksKmzFile( forceKmlRecreation ); - earthApp.simulateClickKmz(); - } - - public static void restart() { - try { - - serverController.stopServer(); - startServer(null); - - } catch (final Exception e) { - logger.error("Error while stopping server", e); //$NON-NLS-1$ - } - } - - private static LocalPropertiesService nonManagedPropertiesService; - - - private static LocalPropertiesService getLocalProperties() { - if (serverController == null || serverController.getContext() == null) { - if (nonManagedPropertiesService == null) { - nonManagedPropertiesService = new LocalPropertiesService(); - } - return nonManagedPropertiesService; - } else { - return serverController.getContext().getBean(LocalPropertiesService.class); - } - } - - private static EarthProjectsService getProjectsService() { - if (serverController != null) { - return serverController.getContext().getBean(EarthProjectsService.class); - } else { - final EarthProjectsService earthProjectsService = new EarthProjectsService(); - earthProjectsService.init(getLocalProperties()); - return earthProjectsService; - } - } - - - private KmlGeneratorService getKmlGeneratorService() { - if (serverController != null) { - return serverController.getContext().getBean(KmlGeneratorService.class); - } else { - throw new IllegalStateException("The server must be initialized before this method is called"); //$NON-NLS-1$ - } - } - - private static void startCollectEarth(final String doubleClickedProjectFile) throws Exception { - logger.info("START - Server Initilization"); //$NON-NLS-1$ - final boolean ceAlreadyOpen = isAnotherCollectEarthRunning( getLocalProperties()); - - if( ceAlreadyOpen ){ - closeSplash(); - // If the user double clicked on a project file while Collect Earth is running then load the project in the running Collect Earth - if (doubleClickedProjectFile!=null) { - openProjectFileInRunningCollectEarth(doubleClickedProjectFile); - }else{ - showMessage(Messages.getString("EarthApp.11")); //$NON-NLS-1$ - } - }else{ - - startServer(doubleClickedProjectFile); - } - - GAlogger.logGAnalytics("Start"); - } - - public static void startServer(final String doubleClickedProjectFile) - throws Exception { - earthApp = new EarthApp(); - - // Load the double-clicked CEP file before the survey manager is instantiated by the server start-up - earthApp.loadProjectIfDoubleClicked(doubleClickedProjectFile); - - - final Observer observeInitialization = getServerObserver(); - serverStartAndOpenGe(observeInitialization); - } - - private static Observer getServerObserver() { - return (observable, initializationEvent) ->{ - if (initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT)) { - serverController = null; - } - - if( initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT) || - initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT) ){ - - showMessage( initializationEvent.toString()); - } - - if (!initializationEvent.equals(ServerInitializationEvent.SERVER_STOPPED_EVENT)) { - try { - earthApp.generateKml(); - earthApp.simulateClickKmz(); - earthApp.checkForUpdates(); - closeSplash(); - } catch (final Exception e) { - logger.error("Error generating KML file", e); //$NON-NLS-1$ - } - } - }; - } - - private void openKmlOnGoogleEarth(){ - if (! CollectEarthUtils.openFile( new File(KmlGeneratorService.KML_NETWORK_LINK_STARTER)) ) { - showMessage("The KML file cannot be open at " + KmlGeneratorService.KML_NETWORK_LINK_STARTER); //$NON-NLS-1$ - } - } - - private void checkForUpdates() { - new Thread("Check for new Collect Earth versions on the server") { - @Override - public void run() { - - // Wait a few seconds before checking for updates - try { - Thread.sleep(10000); - } catch (InterruptedException e1) { - logger.error("Error while waiting", e1); //$NON-NLS-1$ - } - - final UpdateIniUtils updateIniUtils = new UpdateIniUtils(); - - - if (updateIniUtils.shouldWarnUser(getLocalProperties() )) { - - javax.swing.SwingUtilities.invokeLater( () -> { - String remindLater = Messages.getString("EarthApp.3"); //$NON-NLS-1$ - String doItNow = Messages.getString("EarthApp.4"); //$NON-NLS-1$ - String doNotBother = Messages.getString("EarthApp.5"); //$NON-NLS-1$ - - String newestVersionOnline = updateIniUtils.getVersionAvailableOnline(); - - if( StringUtils.isNotBlank( newestVersionOnline ) ) { - - Object[] possibleValues = { remindLater, doItNow, doNotBother }; - int chosenOption = JOptionPane.showOptionDialog(null, - Messages.getString("EarthApp.57"), Messages.getString("EarthApp.58") + Messages.getString("EarthApp.6") + updateIniUtils.convertToDate(newestVersionOnline), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, possibleValues, possibleValues[0]); - if( chosenOption != JOptionPane.CLOSED_OPTION ){ - if (possibleValues[chosenOption].equals(doItNow)) { - CheckForUpdatesListener checkForUpdatesListener = new CheckForUpdatesListener(); - checkForUpdatesListener.actionPerformed(null); - } else if (possibleValues[chosenOption].equals(doNotBother)) { - getLocalProperties().setValue(EarthProperty.LAST_IGNORED_UPDATE, newestVersionOnline); - } - } - } - }); - } - } - }.start(); - - } - - - /** - * If Collect Earth is started by double clicking on a ".cep" file ( Collect Earth Project file ) - * Then it should open directly with that project in focus - * - * @param doubleClickedProjecFile - * The path to the CEP file that was double-clicked - * - */ - private void loadProjectIfDoubleClicked(String doubleClickedProjectFile) { - try { - if (doubleClickedProjectFile != null) { - - final File projectFile = new File(doubleClickedProjectFile); - - if (projectFile.exists()) { - getProjectsService().loadCompressedProjectFile(projectFile); - } - } - } catch (final Exception e) { - showMessage(Messages.getString("EarthApp.59")); //$NON-NLS-1$ - logger.error(Messages.getString("EarthApp.59"), e);//$NON-NLS-1$ - } - } + public MacOpenFilesInvocationHandler() { + super(); + } - private static void serverStartAndOpenGe(Observer observeInitialization) throws Exception { - serverController = new ServerController(); - serverController.deleteObservers(); - serverController.startServer(observeInitialization); + public Object invoke(Object proxy, Method m, Object[] args) throws Throwable - // Inform Mac OS users of the issues about opening CEP files in the Mac version of CE - if(SystemUtils.IS_OS_MAC_OSX ) { - showMessage( - "" //$NON-NLS-1$ - + "" //$NON-NLS-1$ - + Messages.getString("EarthApp.70") - + ": " //$NON-NLS-1$ - + Messages.getString("EarthApp.71") - + Messages.getString("EarthApp.72") - + "" //$NON-NLS-1$ - + Messages.getString("CollectEarthWindow.10") - + " -> " //$NON-NLS-1$ - + Messages.getString("CollectEarthMenu.0") - + "", //$NON-NLS-1$ - Messages.getString("EarthApp.73") - ); - } - } + { - public static void showMessage(String message) { - showMessage(message, "Collect Earth"); + Object result = null; - } + try { - public static void showMessage(String message, String title) { - try { - SwingUtilities.invokeLater( - () -> JOptionPane.showMessageDialog(null, message, title, JOptionPane.WARNING_MESSAGE) - ); - } catch (Exception e) { - logger.error("Error showing message",e); - } + // if the method name equals some method's name then call your method + if ( m!= null && m.getName().equals("openFiles") && args !=null && args.length>0) { + openFilesImplmentation(args[0]); + } - } + } catch (Exception e) { + logger.error(" Error while interpreting invocation " , e ); + } finally { + logger.info("end method {}", m!=null?m.getName():"Unknown method"); + } - private void simulateClickKmz() { - try { - getKmlGeneratorService().generateLoaderKmlFile(); - openKmlOnGoogleEarth(); - } catch (final Exception e) { - showMessage(Messages.getString("EarthApp.61")); //$NON-NLS-1$ - logger.error("The KMZ file could not be found", e); //$NON-NLS-1$ - } - } + return result; - public static void executeKmlLoadAsynchronously( Window windowShowingTimer ) { - new Thread("Load KML in Google Earth"){ - @Override - public void run() { - // Only regenerate KML and reload - try { - SwingUtilities.invokeLater( ( ) -> { - if( windowShowingTimer != null ){ - CollectEarthWindow.startWaiting(windowShowingTimer); - } - }); + } - EarthApp.loadKmlInGoogleEarth(true); + private void openFilesImplmentation(Object openFilesEventObject) throws Exception { + Class openFilesEventClass = Class.forName("com.apple.eawt.AppEvent.OpenFilesEvent"); + Method getFilesMethod = openFilesEventClass.getMethod("getFiles"); - } catch (Exception e) { - logger.error("Error loading the KML",e); - EarthApp.showMessage("Problems while generating the KML file:
" + - (e.getCause()!=null?(e.getCause()+"
"):"") + - ( - ( e.getMessage()!=null && e.getMessage().length() > 300 ) ? e.getMessage().substring(0,300) : - ( e.getMessage()!=null ) ? e.getMessage() : "" - ) + ""); //$NON-NLS-1$ - }finally{ - if( windowShowingTimer != null ){ - try { - SwingUtilities.invokeLater( () -> { - CollectEarthWindow.endWaiting(windowShowingTimer); - if( windowShowingTimer instanceof PropertiesDialog ){ - ( (PropertiesDialog) windowShowingTimer).closeDialog(); - } - }); - } catch (Exception e2) { - logger.error("Error closing Options dialog", e2); - } - } - } + List files = (List) getFilesMethod.invoke( openFilesEventClass.cast( openFilesEventObject ) ); + for (File file : files ){ + try { + EarthApp.openProjectFileInRunningCollectEarth(file.getAbsolutePath()); + } catch (IOException e1) { + logger.error("Error opening CEP file " + e1); } - }.start(); - } + } + } + } -} From 1fff6d2b5007a1b4106045c2507b38bd89d5cc8d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:02 +0100 Subject: [PATCH 0090/1620] New translations MacOpenFilesInvocationHandler.java (Spanish) --- .../earth/app/view/Messages_es.properties | 541 ++---------------- 1 file changed, 36 insertions(+), 505 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 0777f46090..1f014d967a 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,534 +1,65 @@ package org.openforis.collect.earth.app.desktop; -import java.awt.Image; -import java.awt.SplashScreen; -import java.awt.Window; -import java.io.BufferedReader; import java.io.File; import java.io.IOException; -import java.io.InputStreamReader; import java.lang.reflect.Method; -import java.lang.reflect.Proxy; -import java.net.MalformedURLException; -import java.net.Socket; -import java.net.URL; -import java.net.URLConnection; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.util.Observer; +import java.util.List; -import javax.swing.ImageIcon; -import javax.swing.JOptionPane; -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.SystemUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.desktop.ServerController.ServerInitializationEvent; -import org.openforis.collect.earth.app.logging.GAlogger; -import org.openforis.collect.earth.app.server.LoadProjectFileServlet; -import org.openforis.collect.earth.app.service.EarthProjectsService; -import org.openforis.collect.earth.app.service.FolderFinder; -import org.openforis.collect.earth.app.service.KmlGeneratorService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.app.service.UpdateIniUtils; -import org.openforis.collect.earth.app.view.CheckForUpdatesListener; -import org.openforis.collect.earth.app.view.CollectEarthWindow; -import org.openforis.collect.earth.app.view.Messages; -import org.openforis.collect.earth.app.view.PropertiesDialog; -import org.openforis.collect.earth.sampler.utils.KmlGenerationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.opencsv.exceptions.CsvValidationException; - -import io.sentry.Sentry; -import io.sentry.protocol.User; - /** - * Contains the main class that starts Collect Earth and opens Google Earth. - * + * Use reflection to be able to add the code specific to Mac OS X without generating compilation errors + * This class generates a Proxy so that an Interface method can be invoked. Sort of implementing an Interface using reflection + * @see How to implement an interface using Reflection * @author Alfonso Sanchez-Paus Diaz * */ -public class EarthApp { - - private static Logger logger; - private static ServerController serverController; - private static EarthApp earthApp; - - private static void closeSplash() { - try { - final SplashScreen splash = SplashScreen.getSplashScreen(); - if (splash != null) { - splash.close(); - } - } catch (final IllegalStateException e) { - logger.error("Error closing the splash window", e); //$NON-NLS-1$ - } - } - - /** - * Start the application, opening Google Earth and starting the Jetty server. - * - * @param args - * No arguments are used by this method. - */ - public static void main(String[] args) { - - try { - - // System property used in the web.xml configuration - System.setProperty("collectEarth.userFolder", FolderFinder.getCollectEarthDataFolder()); //$NON-NLS-1$ - - // Specify a browser as http.agent so that calls to CloudFlare hosted OpenForis.org do not return with a 403 http error - System.setProperty("http.agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2"); - - initializeSentry(); - - // Change of font so that Lao and Thao glyphs are supported - CollectEarthUtils.setFontDependingOnLanguaue( getLocalProperties().getUiLanguage() ); - - logger = LoggerFactory.getLogger(EarthApp.class); - - String doubleClickedProjectFile = null; - - if (args != null && args.length == 1) { - doubleClickedProjectFile = args[0]; - }else if( getProjectsService().getProjectList().size() == 0 ){ - doubleClickedProjectFile = "resources/demo_survey.cep"; - } - - if ( SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX){ - handleMacStartup( doubleClickedProjectFile ); - }else{ - startCollectEarth( doubleClickedProjectFile ); - } - - } catch (final Exception e) { - // The logger factory has not been initialized, this will not work, just output to console - if (logger != null) { - logger.error("The server could not start", e); //$NON-NLS-1$ - } - System.exit(1); - } finally { - closeSplash(); - } - } - - private static void initializeSentry() { - try { - String releaseName= UpdateIniUtils.getReleaseNameInstalled(); - - Sentry.init("https://24dd6a90c1e4461484712db99c3b3bb7:831e42661c5c4ff3aa5eca270db3f619@sentry.io/299626?release="+releaseName+"&maxmessagelength=2000" ); - if( !StringUtils.isEmpty( UpdateIniUtils.getVersionInstalled() ) ) { - Sentry.setTag( "ReleaseDate", UpdateIniUtils.getVersionInstalled() ); - } - if( !StringUtils.isEmpty( getLocalProperties().getOperator() ) ) { - User user = new User(); - user.setUsername( getLocalProperties().getOperator() ); - Sentry.setUser(user); - } - - } catch (Exception e) { - logger.error( "Error initializing Sentry logger" , e); - } - } - /** - * Special code that uses reflection to handle how the application should behave in Mac OS X. - * Without reflection the code provokes compilation-time errors. - * @param doubleClickedProjectFile Project file (CEP) that was clicked - * @throws Exception Throws Exception when the process fails to open the file double-clicked. Initializes the server in any case - */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - public static void handleMacStartup(String doubleClickedProjectFile) throws Exception{ - try { - Class applicationClass = Class.forName("com.apple.eawt.Application"); - Method getApplicationMethod = applicationClass.getMethod("getApplication"); - Method setDockIconImageMethod = applicationClass.getMethod( "setDockIconImage", Image.class ); - - Class openFilesHandlerInterface = Class.forName("com.apple.eawt.OpenFilesHandler"); - Method setOpenFileHandlerMethod = applicationClass.getMethod( "setOpenFileHandler", openFilesHandlerInterface ); - - // SET THE MAC OS X DOCK ICON! - // Get an Application object - Object applicationObject = getApplicationMethod.invoke( null ); - try { - Image dockIconImage = new ImageIcon(new File("images/dockIconMac.png").toURI().toURL()).getImage(); - // Invoke the setDockIconImage on the application object using the dockIconImage as an argument - setDockIconImageMethod.invoke(applicationObject, dockIconImage ); - } catch (MalformedURLException e2) { - logger.error("Problems finding the docker icon", e2); - } - // ------------------------------------------- - - - // DEFINE A LISTENER THAT IS REGISTERED BY THE OS TO HEAR DOUBLE-CLICK EVENTS AND REGISTER ITSELF AS THE CEP OPENER - MacOpenFilesInvocationHandler macOpenFileHandlerProxyInterface = new MacOpenFilesInvocationHandler(); - Object openFilesHandlerImplementation = Proxy.newProxyInstance( - applicationClass.getClassLoader(), - new Class[]{ openFilesHandlerInterface }, - macOpenFileHandlerProxyInterface - ); - - // Call the setOpenFileHandler method of the application object using the - setOpenFileHandlerMethod.invoke(applicationObject, ( openFilesHandlerInterface.cast( openFilesHandlerImplementation ) ) ); - - // Lets wait for the Apple event to arrive. If it did then the earthApp variable will be non-nulls - Thread.sleep(2000); - if( earthApp == null ){ - startCollectEarth( doubleClickedProjectFile ); - } - } catch (Exception e) { - logger.error("Error while defining the double-click behaviour on CEP files in Mac OS X", e); - startCollectEarth( null ); - } - } - - public void generateKml() { - - try { - getKmlGeneratorService().generateKmlFile(); - } catch (final KmlGenerationException e) { - logger.error("Problems while generating the KML file ", e); //$NON-NLS-1$ - showMessage("Problems while generating the KML file:
" + (e.getCause()!=null?(e.getCause()+"
"):"") + ( e.getMessage().length() > 300?e.getMessage().substring(0,300):e.getMessage() ) + ""); //$NON-NLS-1$ - } catch (final Exception e) { - logger.error("Could not generate KML file", e); //$NON-NLS-1$ - showMessage("Error generating KML file :
" + e.getMessage()); //$NON-NLS-1$ - } - } - - public static void openProjectFileInRunningCollectEarth(String doubleClickedProjecFile) throws IOException { - final File projectFile = new File(doubleClickedProjecFile); - - if (projectFile.exists()) { - - String hostAddress = ServerController.getHostAddress( getLocalProperties().getHost(), getLocalProperties().getPort()); - - URL loadProjectFileInRunningCE = new URL(hostAddress + LoadProjectFileServlet.SERVLET_NAME + - "?" + LoadProjectFileServlet.PROJECT_FILE_PARAMETER + "=" + //$NON-NLS-1$ //$NON-NLS-2$ - URLEncoder.encode(doubleClickedProjecFile, StandardCharsets.UTF_8.name() ) ); - URLConnection urlConn = loadProjectFileInRunningCE.openConnection(); - - try( BufferedReader in = new BufferedReader(new InputStreamReader(urlConn.getInputStream())) ){ - String inputLine; - while ((inputLine = in.readLine()) != null) { - logger.info(inputLine); - } - } +public class MacOpenFilesInvocationHandler implements java.lang.reflect.InvocationHandler { - } - } + private final Logger logger = LoggerFactory.getLogger(MacOpenFilesInvocationHandler.class); - private static boolean isAnotherCollectEarthRunning(LocalPropertiesService localProperties) { - boolean alreadyRunning = false; - try { - new Socket( LocalPropertiesService.LOCAL_HOST , Integer.parseInt(localProperties.getPort())).close(); //$NON-NLS-1$ - // If here there is something is serving on port 8028 - // So stop it - logger.warn("There is a server already running {}", localProperties.getPort()); //$NON-NLS-1$ - alreadyRunning = true; - } catch (final IOException e) { - // Nothing there, so OK to proceed - logger.info("There is no server running in port {}", localProperties.getPort()); //$NON-NLS-1$ - alreadyRunning = false; - } catch (final NumberFormatException e) { - // Nothing there, so OK to proceed - logger.info("Error parsing integer value {}", localProperties.getPort()); //$NON-NLS-1$ - alreadyRunning = false; - } - return alreadyRunning; - } - - public static void quitServer() { - try { - serverController.stopServer(); - } catch (Exception e) { - logger.error("Error stoping server", e); //$NON-NLS-1$ - } - } - - /** - * Generates the KML for the project and opens it in Google Earth - * @param forceKmlRecreation Set to true if you want to forece the regeneration of the KML even if is is up to date (you might want to do this to force the update of the placemark icons as the date changes) - * @throws IOException Throws exception if the KMl file cannot be generated - * @throws KmlGenerationException Throws exception if the KML file contents cannot be generated - * @throws CsvValidationException - */ - private static synchronized void loadKmlInGoogleEarth(boolean forceKmlRecreation) throws IOException, KmlGenerationException, CsvValidationException { - earthApp.getKmlGeneratorService().generatePlacemarksKmzFile( forceKmlRecreation ); - earthApp.simulateClickKmz(); - } - - public static void restart() { - try { - - serverController.stopServer(); - startServer(null); - - } catch (final Exception e) { - logger.error("Error while stopping server", e); //$NON-NLS-1$ - } - } - - private static LocalPropertiesService nonManagedPropertiesService; - - - private static LocalPropertiesService getLocalProperties() { - if (serverController == null || serverController.getContext() == null) { - if (nonManagedPropertiesService == null) { - nonManagedPropertiesService = new LocalPropertiesService(); - } - return nonManagedPropertiesService; - } else { - return serverController.getContext().getBean(LocalPropertiesService.class); - } - } - - private static EarthProjectsService getProjectsService() { - if (serverController != null) { - return serverController.getContext().getBean(EarthProjectsService.class); - } else { - final EarthProjectsService earthProjectsService = new EarthProjectsService(); - earthProjectsService.init(getLocalProperties()); - return earthProjectsService; - } - } - - - private KmlGeneratorService getKmlGeneratorService() { - if (serverController != null) { - return serverController.getContext().getBean(KmlGeneratorService.class); - } else { - throw new IllegalStateException("The server must be initialized before this method is called"); //$NON-NLS-1$ - } - } - - private static void startCollectEarth(final String doubleClickedProjectFile) throws Exception { - logger.info("START - Server Initilization"); //$NON-NLS-1$ - final boolean ceAlreadyOpen = isAnotherCollectEarthRunning( getLocalProperties()); - - if( ceAlreadyOpen ){ - closeSplash(); - // If the user double clicked on a project file while Collect Earth is running then load the project in the running Collect Earth - if (doubleClickedProjectFile!=null) { - openProjectFileInRunningCollectEarth(doubleClickedProjectFile); - }else{ - showMessage(Messages.getString("EarthApp.11")); //$NON-NLS-1$ - } - }else{ - - startServer(doubleClickedProjectFile); - } - - GAlogger.logGAnalytics("Start"); - } - - public static void startServer(final String doubleClickedProjectFile) - throws Exception { - earthApp = new EarthApp(); - - // Load the double-clicked CEP file before the survey manager is instantiated by the server start-up - earthApp.loadProjectIfDoubleClicked(doubleClickedProjectFile); - - - final Observer observeInitialization = getServerObserver(); - serverStartAndOpenGe(observeInitialization); - } - - private static Observer getServerObserver() { - return (observable, initializationEvent) ->{ - if (initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT)) { - serverController = null; - } - - if( initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT) || - initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT) ){ - - showMessage( initializationEvent.toString()); - } - - if (!initializationEvent.equals(ServerInitializationEvent.SERVER_STOPPED_EVENT)) { - try { - earthApp.generateKml(); - earthApp.simulateClickKmz(); - earthApp.checkForUpdates(); - closeSplash(); - } catch (final Exception e) { - logger.error("Error generating KML file", e); //$NON-NLS-1$ - } - } - }; - } - - private void openKmlOnGoogleEarth(){ - if (! CollectEarthUtils.openFile( new File(KmlGeneratorService.KML_NETWORK_LINK_STARTER)) ) { - showMessage("The KML file cannot be open at " + KmlGeneratorService.KML_NETWORK_LINK_STARTER); //$NON-NLS-1$ - } - } - - private void checkForUpdates() { - new Thread("Check for new Collect Earth versions on the server") { - @Override - public void run() { - - // Wait a few seconds before checking for updates - try { - Thread.sleep(10000); - } catch (InterruptedException e1) { - logger.error("Error while waiting", e1); //$NON-NLS-1$ - } - - final UpdateIniUtils updateIniUtils = new UpdateIniUtils(); - - - if (updateIniUtils.shouldWarnUser(getLocalProperties() )) { - - javax.swing.SwingUtilities.invokeLater( () -> { - String remindLater = Messages.getString("EarthApp.3"); //$NON-NLS-1$ - String doItNow = Messages.getString("EarthApp.4"); //$NON-NLS-1$ - String doNotBother = Messages.getString("EarthApp.5"); //$NON-NLS-1$ - - String newestVersionOnline = updateIniUtils.getVersionAvailableOnline(); - - if( StringUtils.isNotBlank( newestVersionOnline ) ) { - - Object[] possibleValues = { remindLater, doItNow, doNotBother }; - int chosenOption = JOptionPane.showOptionDialog(null, - Messages.getString("EarthApp.57"), Messages.getString("EarthApp.58") + Messages.getString("EarthApp.6") + updateIniUtils.convertToDate(newestVersionOnline), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, possibleValues, possibleValues[0]); - if( chosenOption != JOptionPane.CLOSED_OPTION ){ - if (possibleValues[chosenOption].equals(doItNow)) { - CheckForUpdatesListener checkForUpdatesListener = new CheckForUpdatesListener(); - checkForUpdatesListener.actionPerformed(null); - } else if (possibleValues[chosenOption].equals(doNotBother)) { - getLocalProperties().setValue(EarthProperty.LAST_IGNORED_UPDATE, newestVersionOnline); - } - } - } - }); - } - } - }.start(); - - } - - - /** - * If Collect Earth is started by double clicking on a ".cep" file ( Collect Earth Project file ) - * Then it should open directly with that project in focus - * - * @param doubleClickedProjecFile - * The path to the CEP file that was double-clicked - * - */ - private void loadProjectIfDoubleClicked(String doubleClickedProjectFile) { - try { - if (doubleClickedProjectFile != null) { - - final File projectFile = new File(doubleClickedProjectFile); - - if (projectFile.exists()) { - getProjectsService().loadCompressedProjectFile(projectFile); - } - } - } catch (final Exception e) { - showMessage(Messages.getString("EarthApp.59")); //$NON-NLS-1$ - logger.error(Messages.getString("EarthApp.59"), e);//$NON-NLS-1$ - } - } + public MacOpenFilesInvocationHandler() { + super(); + } - private static void serverStartAndOpenGe(Observer observeInitialization) throws Exception { - serverController = new ServerController(); - serverController.deleteObservers(); - serverController.startServer(observeInitialization); + public Object invoke(Object proxy, Method m, Object[] args) throws Throwable - // Inform Mac OS users of the issues about opening CEP files in the Mac version of CE - if(SystemUtils.IS_OS_MAC_OSX ) { - showMessage( - "" //$NON-NLS-1$ - + "" //$NON-NLS-1$ - + Messages.getString("EarthApp.70") - + ": " //$NON-NLS-1$ - + Messages.getString("EarthApp.71") - + Messages.getString("EarthApp.72") - + "" //$NON-NLS-1$ - + Messages.getString("CollectEarthWindow.10") - + " -> " //$NON-NLS-1$ - + Messages.getString("CollectEarthMenu.0") - + "", //$NON-NLS-1$ - Messages.getString("EarthApp.73") - ); - } - } + { - public static void showMessage(String message) { - showMessage(message, "Collect Earth"); + Object result = null; - } + try { - public static void showMessage(String message, String title) { - try { - SwingUtilities.invokeLater( - () -> JOptionPane.showMessageDialog(null, message, title, JOptionPane.WARNING_MESSAGE) - ); - } catch (Exception e) { - logger.error("Error showing message",e); - } + // if the method name equals some method's name then call your method + if ( m!= null && m.getName().equals("openFiles") && args !=null && args.length>0) { + openFilesImplmentation(args[0]); + } - } + } catch (Exception e) { + logger.error(" Error while interpreting invocation " , e ); + } finally { + logger.info("end method {}", m!=null?m.getName():"Unknown method"); + } - private void simulateClickKmz() { - try { - getKmlGeneratorService().generateLoaderKmlFile(); - openKmlOnGoogleEarth(); - } catch (final Exception e) { - showMessage(Messages.getString("EarthApp.61")); //$NON-NLS-1$ - logger.error("The KMZ file could not be found", e); //$NON-NLS-1$ - } - } + return result; - public static void executeKmlLoadAsynchronously( Window windowShowingTimer ) { - new Thread("Load KML in Google Earth"){ - @Override - public void run() { - // Only regenerate KML and reload - try { - SwingUtilities.invokeLater( ( ) -> { - if( windowShowingTimer != null ){ - CollectEarthWindow.startWaiting(windowShowingTimer); - } - }); + } - EarthApp.loadKmlInGoogleEarth(true); + private void openFilesImplmentation(Object openFilesEventObject) throws Exception { + Class openFilesEventClass = Class.forName("com.apple.eawt.AppEvent.OpenFilesEvent"); + Method getFilesMethod = openFilesEventClass.getMethod("getFiles"); - } catch (Exception e) { - logger.error("Error loading the KML",e); - EarthApp.showMessage("Problems while generating the KML file:
" + - (e.getCause()!=null?(e.getCause()+"
"):"") + - ( - ( e.getMessage()!=null && e.getMessage().length() > 300 ) ? e.getMessage().substring(0,300) : - ( e.getMessage()!=null ) ? e.getMessage() : "" - ) + ""); //$NON-NLS-1$ - }finally{ - if( windowShowingTimer != null ){ - try { - SwingUtilities.invokeLater( () -> { - CollectEarthWindow.endWaiting(windowShowingTimer); - if( windowShowingTimer instanceof PropertiesDialog ){ - ( (PropertiesDialog) windowShowingTimer).closeDialog(); - } - }); - } catch (Exception e2) { - logger.error("Error closing Options dialog", e2); - } - } - } + List files = (List) getFilesMethod.invoke( openFilesEventClass.cast( openFilesEventObject ) ); + for (File file : files ){ + try { + EarthApp.openProjectFileInRunningCollectEarth(file.getAbsolutePath()); + } catch (IOException e1) { + logger.error("Error opening CEP file " + e1); } - }.start(); - } + } + } + } -} From 1e51f56bb442863b1aa13300877588b6ae21fa1f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:03 +0100 Subject: [PATCH 0091/1620] New translations MacOpenFilesInvocationHandler.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 541 ++---------------- 1 file changed, 36 insertions(+), 505 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 0777f46090..1f014d967a 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,534 +1,65 @@ package org.openforis.collect.earth.app.desktop; -import java.awt.Image; -import java.awt.SplashScreen; -import java.awt.Window; -import java.io.BufferedReader; import java.io.File; import java.io.IOException; -import java.io.InputStreamReader; import java.lang.reflect.Method; -import java.lang.reflect.Proxy; -import java.net.MalformedURLException; -import java.net.Socket; -import java.net.URL; -import java.net.URLConnection; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.util.Observer; +import java.util.List; -import javax.swing.ImageIcon; -import javax.swing.JOptionPane; -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.SystemUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.desktop.ServerController.ServerInitializationEvent; -import org.openforis.collect.earth.app.logging.GAlogger; -import org.openforis.collect.earth.app.server.LoadProjectFileServlet; -import org.openforis.collect.earth.app.service.EarthProjectsService; -import org.openforis.collect.earth.app.service.FolderFinder; -import org.openforis.collect.earth.app.service.KmlGeneratorService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.app.service.UpdateIniUtils; -import org.openforis.collect.earth.app.view.CheckForUpdatesListener; -import org.openforis.collect.earth.app.view.CollectEarthWindow; -import org.openforis.collect.earth.app.view.Messages; -import org.openforis.collect.earth.app.view.PropertiesDialog; -import org.openforis.collect.earth.sampler.utils.KmlGenerationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.opencsv.exceptions.CsvValidationException; - -import io.sentry.Sentry; -import io.sentry.protocol.User; - /** - * Contains the main class that starts Collect Earth and opens Google Earth. - * + * Use reflection to be able to add the code specific to Mac OS X without generating compilation errors + * This class generates a Proxy so that an Interface method can be invoked. Sort of implementing an Interface using reflection + * @see How to implement an interface using Reflection * @author Alfonso Sanchez-Paus Diaz * */ -public class EarthApp { - - private static Logger logger; - private static ServerController serverController; - private static EarthApp earthApp; - - private static void closeSplash() { - try { - final SplashScreen splash = SplashScreen.getSplashScreen(); - if (splash != null) { - splash.close(); - } - } catch (final IllegalStateException e) { - logger.error("Error closing the splash window", e); //$NON-NLS-1$ - } - } - - /** - * Start the application, opening Google Earth and starting the Jetty server. - * - * @param args - * No arguments are used by this method. - */ - public static void main(String[] args) { - - try { - - // System property used in the web.xml configuration - System.setProperty("collectEarth.userFolder", FolderFinder.getCollectEarthDataFolder()); //$NON-NLS-1$ - - // Specify a browser as http.agent so that calls to CloudFlare hosted OpenForis.org do not return with a 403 http error - System.setProperty("http.agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2"); - - initializeSentry(); - - // Change of font so that Lao and Thao glyphs are supported - CollectEarthUtils.setFontDependingOnLanguaue( getLocalProperties().getUiLanguage() ); - - logger = LoggerFactory.getLogger(EarthApp.class); - - String doubleClickedProjectFile = null; - - if (args != null && args.length == 1) { - doubleClickedProjectFile = args[0]; - }else if( getProjectsService().getProjectList().size() == 0 ){ - doubleClickedProjectFile = "resources/demo_survey.cep"; - } - - if ( SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX){ - handleMacStartup( doubleClickedProjectFile ); - }else{ - startCollectEarth( doubleClickedProjectFile ); - } - - } catch (final Exception e) { - // The logger factory has not been initialized, this will not work, just output to console - if (logger != null) { - logger.error("The server could not start", e); //$NON-NLS-1$ - } - System.exit(1); - } finally { - closeSplash(); - } - } - - private static void initializeSentry() { - try { - String releaseName= UpdateIniUtils.getReleaseNameInstalled(); - - Sentry.init("https://24dd6a90c1e4461484712db99c3b3bb7:831e42661c5c4ff3aa5eca270db3f619@sentry.io/299626?release="+releaseName+"&maxmessagelength=2000" ); - if( !StringUtils.isEmpty( UpdateIniUtils.getVersionInstalled() ) ) { - Sentry.setTag( "ReleaseDate", UpdateIniUtils.getVersionInstalled() ); - } - if( !StringUtils.isEmpty( getLocalProperties().getOperator() ) ) { - User user = new User(); - user.setUsername( getLocalProperties().getOperator() ); - Sentry.setUser(user); - } - - } catch (Exception e) { - logger.error( "Error initializing Sentry logger" , e); - } - } - /** - * Special code that uses reflection to handle how the application should behave in Mac OS X. - * Without reflection the code provokes compilation-time errors. - * @param doubleClickedProjectFile Project file (CEP) that was clicked - * @throws Exception Throws Exception when the process fails to open the file double-clicked. Initializes the server in any case - */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - public static void handleMacStartup(String doubleClickedProjectFile) throws Exception{ - try { - Class applicationClass = Class.forName("com.apple.eawt.Application"); - Method getApplicationMethod = applicationClass.getMethod("getApplication"); - Method setDockIconImageMethod = applicationClass.getMethod( "setDockIconImage", Image.class ); - - Class openFilesHandlerInterface = Class.forName("com.apple.eawt.OpenFilesHandler"); - Method setOpenFileHandlerMethod = applicationClass.getMethod( "setOpenFileHandler", openFilesHandlerInterface ); - - // SET THE MAC OS X DOCK ICON! - // Get an Application object - Object applicationObject = getApplicationMethod.invoke( null ); - try { - Image dockIconImage = new ImageIcon(new File("images/dockIconMac.png").toURI().toURL()).getImage(); - // Invoke the setDockIconImage on the application object using the dockIconImage as an argument - setDockIconImageMethod.invoke(applicationObject, dockIconImage ); - } catch (MalformedURLException e2) { - logger.error("Problems finding the docker icon", e2); - } - // ------------------------------------------- - - - // DEFINE A LISTENER THAT IS REGISTERED BY THE OS TO HEAR DOUBLE-CLICK EVENTS AND REGISTER ITSELF AS THE CEP OPENER - MacOpenFilesInvocationHandler macOpenFileHandlerProxyInterface = new MacOpenFilesInvocationHandler(); - Object openFilesHandlerImplementation = Proxy.newProxyInstance( - applicationClass.getClassLoader(), - new Class[]{ openFilesHandlerInterface }, - macOpenFileHandlerProxyInterface - ); - - // Call the setOpenFileHandler method of the application object using the - setOpenFileHandlerMethod.invoke(applicationObject, ( openFilesHandlerInterface.cast( openFilesHandlerImplementation ) ) ); - - // Lets wait for the Apple event to arrive. If it did then the earthApp variable will be non-nulls - Thread.sleep(2000); - if( earthApp == null ){ - startCollectEarth( doubleClickedProjectFile ); - } - } catch (Exception e) { - logger.error("Error while defining the double-click behaviour on CEP files in Mac OS X", e); - startCollectEarth( null ); - } - } - - public void generateKml() { - - try { - getKmlGeneratorService().generateKmlFile(); - } catch (final KmlGenerationException e) { - logger.error("Problems while generating the KML file ", e); //$NON-NLS-1$ - showMessage("Problems while generating the KML file:
" + (e.getCause()!=null?(e.getCause()+"
"):"") + ( e.getMessage().length() > 300?e.getMessage().substring(0,300):e.getMessage() ) + ""); //$NON-NLS-1$ - } catch (final Exception e) { - logger.error("Could not generate KML file", e); //$NON-NLS-1$ - showMessage("Error generating KML file :
" + e.getMessage()); //$NON-NLS-1$ - } - } - - public static void openProjectFileInRunningCollectEarth(String doubleClickedProjecFile) throws IOException { - final File projectFile = new File(doubleClickedProjecFile); - - if (projectFile.exists()) { - - String hostAddress = ServerController.getHostAddress( getLocalProperties().getHost(), getLocalProperties().getPort()); - - URL loadProjectFileInRunningCE = new URL(hostAddress + LoadProjectFileServlet.SERVLET_NAME + - "?" + LoadProjectFileServlet.PROJECT_FILE_PARAMETER + "=" + //$NON-NLS-1$ //$NON-NLS-2$ - URLEncoder.encode(doubleClickedProjecFile, StandardCharsets.UTF_8.name() ) ); - URLConnection urlConn = loadProjectFileInRunningCE.openConnection(); - - try( BufferedReader in = new BufferedReader(new InputStreamReader(urlConn.getInputStream())) ){ - String inputLine; - while ((inputLine = in.readLine()) != null) { - logger.info(inputLine); - } - } +public class MacOpenFilesInvocationHandler implements java.lang.reflect.InvocationHandler { - } - } + private final Logger logger = LoggerFactory.getLogger(MacOpenFilesInvocationHandler.class); - private static boolean isAnotherCollectEarthRunning(LocalPropertiesService localProperties) { - boolean alreadyRunning = false; - try { - new Socket( LocalPropertiesService.LOCAL_HOST , Integer.parseInt(localProperties.getPort())).close(); //$NON-NLS-1$ - // If here there is something is serving on port 8028 - // So stop it - logger.warn("There is a server already running {}", localProperties.getPort()); //$NON-NLS-1$ - alreadyRunning = true; - } catch (final IOException e) { - // Nothing there, so OK to proceed - logger.info("There is no server running in port {}", localProperties.getPort()); //$NON-NLS-1$ - alreadyRunning = false; - } catch (final NumberFormatException e) { - // Nothing there, so OK to proceed - logger.info("Error parsing integer value {}", localProperties.getPort()); //$NON-NLS-1$ - alreadyRunning = false; - } - return alreadyRunning; - } - - public static void quitServer() { - try { - serverController.stopServer(); - } catch (Exception e) { - logger.error("Error stoping server", e); //$NON-NLS-1$ - } - } - - /** - * Generates the KML for the project and opens it in Google Earth - * @param forceKmlRecreation Set to true if you want to forece the regeneration of the KML even if is is up to date (you might want to do this to force the update of the placemark icons as the date changes) - * @throws IOException Throws exception if the KMl file cannot be generated - * @throws KmlGenerationException Throws exception if the KML file contents cannot be generated - * @throws CsvValidationException - */ - private static synchronized void loadKmlInGoogleEarth(boolean forceKmlRecreation) throws IOException, KmlGenerationException, CsvValidationException { - earthApp.getKmlGeneratorService().generatePlacemarksKmzFile( forceKmlRecreation ); - earthApp.simulateClickKmz(); - } - - public static void restart() { - try { - - serverController.stopServer(); - startServer(null); - - } catch (final Exception e) { - logger.error("Error while stopping server", e); //$NON-NLS-1$ - } - } - - private static LocalPropertiesService nonManagedPropertiesService; - - - private static LocalPropertiesService getLocalProperties() { - if (serverController == null || serverController.getContext() == null) { - if (nonManagedPropertiesService == null) { - nonManagedPropertiesService = new LocalPropertiesService(); - } - return nonManagedPropertiesService; - } else { - return serverController.getContext().getBean(LocalPropertiesService.class); - } - } - - private static EarthProjectsService getProjectsService() { - if (serverController != null) { - return serverController.getContext().getBean(EarthProjectsService.class); - } else { - final EarthProjectsService earthProjectsService = new EarthProjectsService(); - earthProjectsService.init(getLocalProperties()); - return earthProjectsService; - } - } - - - private KmlGeneratorService getKmlGeneratorService() { - if (serverController != null) { - return serverController.getContext().getBean(KmlGeneratorService.class); - } else { - throw new IllegalStateException("The server must be initialized before this method is called"); //$NON-NLS-1$ - } - } - - private static void startCollectEarth(final String doubleClickedProjectFile) throws Exception { - logger.info("START - Server Initilization"); //$NON-NLS-1$ - final boolean ceAlreadyOpen = isAnotherCollectEarthRunning( getLocalProperties()); - - if( ceAlreadyOpen ){ - closeSplash(); - // If the user double clicked on a project file while Collect Earth is running then load the project in the running Collect Earth - if (doubleClickedProjectFile!=null) { - openProjectFileInRunningCollectEarth(doubleClickedProjectFile); - }else{ - showMessage(Messages.getString("EarthApp.11")); //$NON-NLS-1$ - } - }else{ - - startServer(doubleClickedProjectFile); - } - - GAlogger.logGAnalytics("Start"); - } - - public static void startServer(final String doubleClickedProjectFile) - throws Exception { - earthApp = new EarthApp(); - - // Load the double-clicked CEP file before the survey manager is instantiated by the server start-up - earthApp.loadProjectIfDoubleClicked(doubleClickedProjectFile); - - - final Observer observeInitialization = getServerObserver(); - serverStartAndOpenGe(observeInitialization); - } - - private static Observer getServerObserver() { - return (observable, initializationEvent) ->{ - if (initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT)) { - serverController = null; - } - - if( initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT) || - initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT) ){ - - showMessage( initializationEvent.toString()); - } - - if (!initializationEvent.equals(ServerInitializationEvent.SERVER_STOPPED_EVENT)) { - try { - earthApp.generateKml(); - earthApp.simulateClickKmz(); - earthApp.checkForUpdates(); - closeSplash(); - } catch (final Exception e) { - logger.error("Error generating KML file", e); //$NON-NLS-1$ - } - } - }; - } - - private void openKmlOnGoogleEarth(){ - if (! CollectEarthUtils.openFile( new File(KmlGeneratorService.KML_NETWORK_LINK_STARTER)) ) { - showMessage("The KML file cannot be open at " + KmlGeneratorService.KML_NETWORK_LINK_STARTER); //$NON-NLS-1$ - } - } - - private void checkForUpdates() { - new Thread("Check for new Collect Earth versions on the server") { - @Override - public void run() { - - // Wait a few seconds before checking for updates - try { - Thread.sleep(10000); - } catch (InterruptedException e1) { - logger.error("Error while waiting", e1); //$NON-NLS-1$ - } - - final UpdateIniUtils updateIniUtils = new UpdateIniUtils(); - - - if (updateIniUtils.shouldWarnUser(getLocalProperties() )) { - - javax.swing.SwingUtilities.invokeLater( () -> { - String remindLater = Messages.getString("EarthApp.3"); //$NON-NLS-1$ - String doItNow = Messages.getString("EarthApp.4"); //$NON-NLS-1$ - String doNotBother = Messages.getString("EarthApp.5"); //$NON-NLS-1$ - - String newestVersionOnline = updateIniUtils.getVersionAvailableOnline(); - - if( StringUtils.isNotBlank( newestVersionOnline ) ) { - - Object[] possibleValues = { remindLater, doItNow, doNotBother }; - int chosenOption = JOptionPane.showOptionDialog(null, - Messages.getString("EarthApp.57"), Messages.getString("EarthApp.58") + Messages.getString("EarthApp.6") + updateIniUtils.convertToDate(newestVersionOnline), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, possibleValues, possibleValues[0]); - if( chosenOption != JOptionPane.CLOSED_OPTION ){ - if (possibleValues[chosenOption].equals(doItNow)) { - CheckForUpdatesListener checkForUpdatesListener = new CheckForUpdatesListener(); - checkForUpdatesListener.actionPerformed(null); - } else if (possibleValues[chosenOption].equals(doNotBother)) { - getLocalProperties().setValue(EarthProperty.LAST_IGNORED_UPDATE, newestVersionOnline); - } - } - } - }); - } - } - }.start(); - - } - - - /** - * If Collect Earth is started by double clicking on a ".cep" file ( Collect Earth Project file ) - * Then it should open directly with that project in focus - * - * @param doubleClickedProjecFile - * The path to the CEP file that was double-clicked - * - */ - private void loadProjectIfDoubleClicked(String doubleClickedProjectFile) { - try { - if (doubleClickedProjectFile != null) { - - final File projectFile = new File(doubleClickedProjectFile); - - if (projectFile.exists()) { - getProjectsService().loadCompressedProjectFile(projectFile); - } - } - } catch (final Exception e) { - showMessage(Messages.getString("EarthApp.59")); //$NON-NLS-1$ - logger.error(Messages.getString("EarthApp.59"), e);//$NON-NLS-1$ - } - } + public MacOpenFilesInvocationHandler() { + super(); + } - private static void serverStartAndOpenGe(Observer observeInitialization) throws Exception { - serverController = new ServerController(); - serverController.deleteObservers(); - serverController.startServer(observeInitialization); + public Object invoke(Object proxy, Method m, Object[] args) throws Throwable - // Inform Mac OS users of the issues about opening CEP files in the Mac version of CE - if(SystemUtils.IS_OS_MAC_OSX ) { - showMessage( - "" //$NON-NLS-1$ - + "" //$NON-NLS-1$ - + Messages.getString("EarthApp.70") - + ": " //$NON-NLS-1$ - + Messages.getString("EarthApp.71") - + Messages.getString("EarthApp.72") - + "" //$NON-NLS-1$ - + Messages.getString("CollectEarthWindow.10") - + " -> " //$NON-NLS-1$ - + Messages.getString("CollectEarthMenu.0") - + "", //$NON-NLS-1$ - Messages.getString("EarthApp.73") - ); - } - } + { - public static void showMessage(String message) { - showMessage(message, "Collect Earth"); + Object result = null; - } + try { - public static void showMessage(String message, String title) { - try { - SwingUtilities.invokeLater( - () -> JOptionPane.showMessageDialog(null, message, title, JOptionPane.WARNING_MESSAGE) - ); - } catch (Exception e) { - logger.error("Error showing message",e); - } + // if the method name equals some method's name then call your method + if ( m!= null && m.getName().equals("openFiles") && args !=null && args.length>0) { + openFilesImplmentation(args[0]); + } - } + } catch (Exception e) { + logger.error(" Error while interpreting invocation " , e ); + } finally { + logger.info("end method {}", m!=null?m.getName():"Unknown method"); + } - private void simulateClickKmz() { - try { - getKmlGeneratorService().generateLoaderKmlFile(); - openKmlOnGoogleEarth(); - } catch (final Exception e) { - showMessage(Messages.getString("EarthApp.61")); //$NON-NLS-1$ - logger.error("The KMZ file could not be found", e); //$NON-NLS-1$ - } - } + return result; - public static void executeKmlLoadAsynchronously( Window windowShowingTimer ) { - new Thread("Load KML in Google Earth"){ - @Override - public void run() { - // Only regenerate KML and reload - try { - SwingUtilities.invokeLater( ( ) -> { - if( windowShowingTimer != null ){ - CollectEarthWindow.startWaiting(windowShowingTimer); - } - }); + } - EarthApp.loadKmlInGoogleEarth(true); + private void openFilesImplmentation(Object openFilesEventObject) throws Exception { + Class openFilesEventClass = Class.forName("com.apple.eawt.AppEvent.OpenFilesEvent"); + Method getFilesMethod = openFilesEventClass.getMethod("getFiles"); - } catch (Exception e) { - logger.error("Error loading the KML",e); - EarthApp.showMessage("Problems while generating the KML file:
" + - (e.getCause()!=null?(e.getCause()+"
"):"") + - ( - ( e.getMessage()!=null && e.getMessage().length() > 300 ) ? e.getMessage().substring(0,300) : - ( e.getMessage()!=null ) ? e.getMessage() : "" - ) + ""); //$NON-NLS-1$ - }finally{ - if( windowShowingTimer != null ){ - try { - SwingUtilities.invokeLater( () -> { - CollectEarthWindow.endWaiting(windowShowingTimer); - if( windowShowingTimer instanceof PropertiesDialog ){ - ( (PropertiesDialog) windowShowingTimer).closeDialog(); - } - }); - } catch (Exception e2) { - logger.error("Error closing Options dialog", e2); - } - } - } + List files = (List) getFilesMethod.invoke( openFilesEventClass.cast( openFilesEventObject ) ); + for (File file : files ){ + try { + EarthApp.openProjectFileInRunningCollectEarth(file.getAbsolutePath()); + } catch (IOException e1) { + logger.error("Error opening CEP file " + e1); } - }.start(); - } + } + } + } -} From 0cc3fa89f7cb63faa17aa2039177ebb371ac3d9a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:04 +0100 Subject: [PATCH 0092/1620] New translations MacOpenFilesInvocationHandler.java (English) --- .../earth/app/view/Messages_en.properties | 541 ++---------------- 1 file changed, 36 insertions(+), 505 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 0777f46090..1f014d967a 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,534 +1,65 @@ package org.openforis.collect.earth.app.desktop; -import java.awt.Image; -import java.awt.SplashScreen; -import java.awt.Window; -import java.io.BufferedReader; import java.io.File; import java.io.IOException; -import java.io.InputStreamReader; import java.lang.reflect.Method; -import java.lang.reflect.Proxy; -import java.net.MalformedURLException; -import java.net.Socket; -import java.net.URL; -import java.net.URLConnection; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.util.Observer; +import java.util.List; -import javax.swing.ImageIcon; -import javax.swing.JOptionPane; -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.SystemUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.desktop.ServerController.ServerInitializationEvent; -import org.openforis.collect.earth.app.logging.GAlogger; -import org.openforis.collect.earth.app.server.LoadProjectFileServlet; -import org.openforis.collect.earth.app.service.EarthProjectsService; -import org.openforis.collect.earth.app.service.FolderFinder; -import org.openforis.collect.earth.app.service.KmlGeneratorService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.app.service.UpdateIniUtils; -import org.openforis.collect.earth.app.view.CheckForUpdatesListener; -import org.openforis.collect.earth.app.view.CollectEarthWindow; -import org.openforis.collect.earth.app.view.Messages; -import org.openforis.collect.earth.app.view.PropertiesDialog; -import org.openforis.collect.earth.sampler.utils.KmlGenerationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.opencsv.exceptions.CsvValidationException; - -import io.sentry.Sentry; -import io.sentry.protocol.User; - /** - * Contains the main class that starts Collect Earth and opens Google Earth. - * + * Use reflection to be able to add the code specific to Mac OS X without generating compilation errors + * This class generates a Proxy so that an Interface method can be invoked. Sort of implementing an Interface using reflection + * @see How to implement an interface using Reflection * @author Alfonso Sanchez-Paus Diaz * */ -public class EarthApp { - - private static Logger logger; - private static ServerController serverController; - private static EarthApp earthApp; - - private static void closeSplash() { - try { - final SplashScreen splash = SplashScreen.getSplashScreen(); - if (splash != null) { - splash.close(); - } - } catch (final IllegalStateException e) { - logger.error("Error closing the splash window", e); //$NON-NLS-1$ - } - } - - /** - * Start the application, opening Google Earth and starting the Jetty server. - * - * @param args - * No arguments are used by this method. - */ - public static void main(String[] args) { - - try { - - // System property used in the web.xml configuration - System.setProperty("collectEarth.userFolder", FolderFinder.getCollectEarthDataFolder()); //$NON-NLS-1$ - - // Specify a browser as http.agent so that calls to CloudFlare hosted OpenForis.org do not return with a 403 http error - System.setProperty("http.agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2"); - - initializeSentry(); - - // Change of font so that Lao and Thao glyphs are supported - CollectEarthUtils.setFontDependingOnLanguaue( getLocalProperties().getUiLanguage() ); - - logger = LoggerFactory.getLogger(EarthApp.class); - - String doubleClickedProjectFile = null; - - if (args != null && args.length == 1) { - doubleClickedProjectFile = args[0]; - }else if( getProjectsService().getProjectList().size() == 0 ){ - doubleClickedProjectFile = "resources/demo_survey.cep"; - } - - if ( SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX){ - handleMacStartup( doubleClickedProjectFile ); - }else{ - startCollectEarth( doubleClickedProjectFile ); - } - - } catch (final Exception e) { - // The logger factory has not been initialized, this will not work, just output to console - if (logger != null) { - logger.error("The server could not start", e); //$NON-NLS-1$ - } - System.exit(1); - } finally { - closeSplash(); - } - } - - private static void initializeSentry() { - try { - String releaseName= UpdateIniUtils.getReleaseNameInstalled(); - - Sentry.init("https://24dd6a90c1e4461484712db99c3b3bb7:831e42661c5c4ff3aa5eca270db3f619@sentry.io/299626?release="+releaseName+"&maxmessagelength=2000" ); - if( !StringUtils.isEmpty( UpdateIniUtils.getVersionInstalled() ) ) { - Sentry.setTag( "ReleaseDate", UpdateIniUtils.getVersionInstalled() ); - } - if( !StringUtils.isEmpty( getLocalProperties().getOperator() ) ) { - User user = new User(); - user.setUsername( getLocalProperties().getOperator() ); - Sentry.setUser(user); - } - - } catch (Exception e) { - logger.error( "Error initializing Sentry logger" , e); - } - } - /** - * Special code that uses reflection to handle how the application should behave in Mac OS X. - * Without reflection the code provokes compilation-time errors. - * @param doubleClickedProjectFile Project file (CEP) that was clicked - * @throws Exception Throws Exception when the process fails to open the file double-clicked. Initializes the server in any case - */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - public static void handleMacStartup(String doubleClickedProjectFile) throws Exception{ - try { - Class applicationClass = Class.forName("com.apple.eawt.Application"); - Method getApplicationMethod = applicationClass.getMethod("getApplication"); - Method setDockIconImageMethod = applicationClass.getMethod( "setDockIconImage", Image.class ); - - Class openFilesHandlerInterface = Class.forName("com.apple.eawt.OpenFilesHandler"); - Method setOpenFileHandlerMethod = applicationClass.getMethod( "setOpenFileHandler", openFilesHandlerInterface ); - - // SET THE MAC OS X DOCK ICON! - // Get an Application object - Object applicationObject = getApplicationMethod.invoke( null ); - try { - Image dockIconImage = new ImageIcon(new File("images/dockIconMac.png").toURI().toURL()).getImage(); - // Invoke the setDockIconImage on the application object using the dockIconImage as an argument - setDockIconImageMethod.invoke(applicationObject, dockIconImage ); - } catch (MalformedURLException e2) { - logger.error("Problems finding the docker icon", e2); - } - // ------------------------------------------- - - - // DEFINE A LISTENER THAT IS REGISTERED BY THE OS TO HEAR DOUBLE-CLICK EVENTS AND REGISTER ITSELF AS THE CEP OPENER - MacOpenFilesInvocationHandler macOpenFileHandlerProxyInterface = new MacOpenFilesInvocationHandler(); - Object openFilesHandlerImplementation = Proxy.newProxyInstance( - applicationClass.getClassLoader(), - new Class[]{ openFilesHandlerInterface }, - macOpenFileHandlerProxyInterface - ); - - // Call the setOpenFileHandler method of the application object using the - setOpenFileHandlerMethod.invoke(applicationObject, ( openFilesHandlerInterface.cast( openFilesHandlerImplementation ) ) ); - - // Lets wait for the Apple event to arrive. If it did then the earthApp variable will be non-nulls - Thread.sleep(2000); - if( earthApp == null ){ - startCollectEarth( doubleClickedProjectFile ); - } - } catch (Exception e) { - logger.error("Error while defining the double-click behaviour on CEP files in Mac OS X", e); - startCollectEarth( null ); - } - } - - public void generateKml() { - - try { - getKmlGeneratorService().generateKmlFile(); - } catch (final KmlGenerationException e) { - logger.error("Problems while generating the KML file ", e); //$NON-NLS-1$ - showMessage("Problems while generating the KML file:
" + (e.getCause()!=null?(e.getCause()+"
"):"") + ( e.getMessage().length() > 300?e.getMessage().substring(0,300):e.getMessage() ) + ""); //$NON-NLS-1$ - } catch (final Exception e) { - logger.error("Could not generate KML file", e); //$NON-NLS-1$ - showMessage("Error generating KML file :
" + e.getMessage()); //$NON-NLS-1$ - } - } - - public static void openProjectFileInRunningCollectEarth(String doubleClickedProjecFile) throws IOException { - final File projectFile = new File(doubleClickedProjecFile); - - if (projectFile.exists()) { - - String hostAddress = ServerController.getHostAddress( getLocalProperties().getHost(), getLocalProperties().getPort()); - - URL loadProjectFileInRunningCE = new URL(hostAddress + LoadProjectFileServlet.SERVLET_NAME + - "?" + LoadProjectFileServlet.PROJECT_FILE_PARAMETER + "=" + //$NON-NLS-1$ //$NON-NLS-2$ - URLEncoder.encode(doubleClickedProjecFile, StandardCharsets.UTF_8.name() ) ); - URLConnection urlConn = loadProjectFileInRunningCE.openConnection(); - - try( BufferedReader in = new BufferedReader(new InputStreamReader(urlConn.getInputStream())) ){ - String inputLine; - while ((inputLine = in.readLine()) != null) { - logger.info(inputLine); - } - } +public class MacOpenFilesInvocationHandler implements java.lang.reflect.InvocationHandler { - } - } + private final Logger logger = LoggerFactory.getLogger(MacOpenFilesInvocationHandler.class); - private static boolean isAnotherCollectEarthRunning(LocalPropertiesService localProperties) { - boolean alreadyRunning = false; - try { - new Socket( LocalPropertiesService.LOCAL_HOST , Integer.parseInt(localProperties.getPort())).close(); //$NON-NLS-1$ - // If here there is something is serving on port 8028 - // So stop it - logger.warn("There is a server already running {}", localProperties.getPort()); //$NON-NLS-1$ - alreadyRunning = true; - } catch (final IOException e) { - // Nothing there, so OK to proceed - logger.info("There is no server running in port {}", localProperties.getPort()); //$NON-NLS-1$ - alreadyRunning = false; - } catch (final NumberFormatException e) { - // Nothing there, so OK to proceed - logger.info("Error parsing integer value {}", localProperties.getPort()); //$NON-NLS-1$ - alreadyRunning = false; - } - return alreadyRunning; - } - - public static void quitServer() { - try { - serverController.stopServer(); - } catch (Exception e) { - logger.error("Error stoping server", e); //$NON-NLS-1$ - } - } - - /** - * Generates the KML for the project and opens it in Google Earth - * @param forceKmlRecreation Set to true if you want to forece the regeneration of the KML even if is is up to date (you might want to do this to force the update of the placemark icons as the date changes) - * @throws IOException Throws exception if the KMl file cannot be generated - * @throws KmlGenerationException Throws exception if the KML file contents cannot be generated - * @throws CsvValidationException - */ - private static synchronized void loadKmlInGoogleEarth(boolean forceKmlRecreation) throws IOException, KmlGenerationException, CsvValidationException { - earthApp.getKmlGeneratorService().generatePlacemarksKmzFile( forceKmlRecreation ); - earthApp.simulateClickKmz(); - } - - public static void restart() { - try { - - serverController.stopServer(); - startServer(null); - - } catch (final Exception e) { - logger.error("Error while stopping server", e); //$NON-NLS-1$ - } - } - - private static LocalPropertiesService nonManagedPropertiesService; - - - private static LocalPropertiesService getLocalProperties() { - if (serverController == null || serverController.getContext() == null) { - if (nonManagedPropertiesService == null) { - nonManagedPropertiesService = new LocalPropertiesService(); - } - return nonManagedPropertiesService; - } else { - return serverController.getContext().getBean(LocalPropertiesService.class); - } - } - - private static EarthProjectsService getProjectsService() { - if (serverController != null) { - return serverController.getContext().getBean(EarthProjectsService.class); - } else { - final EarthProjectsService earthProjectsService = new EarthProjectsService(); - earthProjectsService.init(getLocalProperties()); - return earthProjectsService; - } - } - - - private KmlGeneratorService getKmlGeneratorService() { - if (serverController != null) { - return serverController.getContext().getBean(KmlGeneratorService.class); - } else { - throw new IllegalStateException("The server must be initialized before this method is called"); //$NON-NLS-1$ - } - } - - private static void startCollectEarth(final String doubleClickedProjectFile) throws Exception { - logger.info("START - Server Initilization"); //$NON-NLS-1$ - final boolean ceAlreadyOpen = isAnotherCollectEarthRunning( getLocalProperties()); - - if( ceAlreadyOpen ){ - closeSplash(); - // If the user double clicked on a project file while Collect Earth is running then load the project in the running Collect Earth - if (doubleClickedProjectFile!=null) { - openProjectFileInRunningCollectEarth(doubleClickedProjectFile); - }else{ - showMessage(Messages.getString("EarthApp.11")); //$NON-NLS-1$ - } - }else{ - - startServer(doubleClickedProjectFile); - } - - GAlogger.logGAnalytics("Start"); - } - - public static void startServer(final String doubleClickedProjectFile) - throws Exception { - earthApp = new EarthApp(); - - // Load the double-clicked CEP file before the survey manager is instantiated by the server start-up - earthApp.loadProjectIfDoubleClicked(doubleClickedProjectFile); - - - final Observer observeInitialization = getServerObserver(); - serverStartAndOpenGe(observeInitialization); - } - - private static Observer getServerObserver() { - return (observable, initializationEvent) ->{ - if (initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT)) { - serverController = null; - } - - if( initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT) || - initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT) ){ - - showMessage( initializationEvent.toString()); - } - - if (!initializationEvent.equals(ServerInitializationEvent.SERVER_STOPPED_EVENT)) { - try { - earthApp.generateKml(); - earthApp.simulateClickKmz(); - earthApp.checkForUpdates(); - closeSplash(); - } catch (final Exception e) { - logger.error("Error generating KML file", e); //$NON-NLS-1$ - } - } - }; - } - - private void openKmlOnGoogleEarth(){ - if (! CollectEarthUtils.openFile( new File(KmlGeneratorService.KML_NETWORK_LINK_STARTER)) ) { - showMessage("The KML file cannot be open at " + KmlGeneratorService.KML_NETWORK_LINK_STARTER); //$NON-NLS-1$ - } - } - - private void checkForUpdates() { - new Thread("Check for new Collect Earth versions on the server") { - @Override - public void run() { - - // Wait a few seconds before checking for updates - try { - Thread.sleep(10000); - } catch (InterruptedException e1) { - logger.error("Error while waiting", e1); //$NON-NLS-1$ - } - - final UpdateIniUtils updateIniUtils = new UpdateIniUtils(); - - - if (updateIniUtils.shouldWarnUser(getLocalProperties() )) { - - javax.swing.SwingUtilities.invokeLater( () -> { - String remindLater = Messages.getString("EarthApp.3"); //$NON-NLS-1$ - String doItNow = Messages.getString("EarthApp.4"); //$NON-NLS-1$ - String doNotBother = Messages.getString("EarthApp.5"); //$NON-NLS-1$ - - String newestVersionOnline = updateIniUtils.getVersionAvailableOnline(); - - if( StringUtils.isNotBlank( newestVersionOnline ) ) { - - Object[] possibleValues = { remindLater, doItNow, doNotBother }; - int chosenOption = JOptionPane.showOptionDialog(null, - Messages.getString("EarthApp.57"), Messages.getString("EarthApp.58") + Messages.getString("EarthApp.6") + updateIniUtils.convertToDate(newestVersionOnline), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, possibleValues, possibleValues[0]); - if( chosenOption != JOptionPane.CLOSED_OPTION ){ - if (possibleValues[chosenOption].equals(doItNow)) { - CheckForUpdatesListener checkForUpdatesListener = new CheckForUpdatesListener(); - checkForUpdatesListener.actionPerformed(null); - } else if (possibleValues[chosenOption].equals(doNotBother)) { - getLocalProperties().setValue(EarthProperty.LAST_IGNORED_UPDATE, newestVersionOnline); - } - } - } - }); - } - } - }.start(); - - } - - - /** - * If Collect Earth is started by double clicking on a ".cep" file ( Collect Earth Project file ) - * Then it should open directly with that project in focus - * - * @param doubleClickedProjecFile - * The path to the CEP file that was double-clicked - * - */ - private void loadProjectIfDoubleClicked(String doubleClickedProjectFile) { - try { - if (doubleClickedProjectFile != null) { - - final File projectFile = new File(doubleClickedProjectFile); - - if (projectFile.exists()) { - getProjectsService().loadCompressedProjectFile(projectFile); - } - } - } catch (final Exception e) { - showMessage(Messages.getString("EarthApp.59")); //$NON-NLS-1$ - logger.error(Messages.getString("EarthApp.59"), e);//$NON-NLS-1$ - } - } + public MacOpenFilesInvocationHandler() { + super(); + } - private static void serverStartAndOpenGe(Observer observeInitialization) throws Exception { - serverController = new ServerController(); - serverController.deleteObservers(); - serverController.startServer(observeInitialization); + public Object invoke(Object proxy, Method m, Object[] args) throws Throwable - // Inform Mac OS users of the issues about opening CEP files in the Mac version of CE - if(SystemUtils.IS_OS_MAC_OSX ) { - showMessage( - "" //$NON-NLS-1$ - + "" //$NON-NLS-1$ - + Messages.getString("EarthApp.70") - + ": " //$NON-NLS-1$ - + Messages.getString("EarthApp.71") - + Messages.getString("EarthApp.72") - + "" //$NON-NLS-1$ - + Messages.getString("CollectEarthWindow.10") - + " -> " //$NON-NLS-1$ - + Messages.getString("CollectEarthMenu.0") - + "", //$NON-NLS-1$ - Messages.getString("EarthApp.73") - ); - } - } + { - public static void showMessage(String message) { - showMessage(message, "Collect Earth"); + Object result = null; - } + try { - public static void showMessage(String message, String title) { - try { - SwingUtilities.invokeLater( - () -> JOptionPane.showMessageDialog(null, message, title, JOptionPane.WARNING_MESSAGE) - ); - } catch (Exception e) { - logger.error("Error showing message",e); - } + // if the method name equals some method's name then call your method + if ( m!= null && m.getName().equals("openFiles") && args !=null && args.length>0) { + openFilesImplmentation(args[0]); + } - } + } catch (Exception e) { + logger.error(" Error while interpreting invocation " , e ); + } finally { + logger.info("end method {}", m!=null?m.getName():"Unknown method"); + } - private void simulateClickKmz() { - try { - getKmlGeneratorService().generateLoaderKmlFile(); - openKmlOnGoogleEarth(); - } catch (final Exception e) { - showMessage(Messages.getString("EarthApp.61")); //$NON-NLS-1$ - logger.error("The KMZ file could not be found", e); //$NON-NLS-1$ - } - } + return result; - public static void executeKmlLoadAsynchronously( Window windowShowingTimer ) { - new Thread("Load KML in Google Earth"){ - @Override - public void run() { - // Only regenerate KML and reload - try { - SwingUtilities.invokeLater( ( ) -> { - if( windowShowingTimer != null ){ - CollectEarthWindow.startWaiting(windowShowingTimer); - } - }); + } - EarthApp.loadKmlInGoogleEarth(true); + private void openFilesImplmentation(Object openFilesEventObject) throws Exception { + Class openFilesEventClass = Class.forName("com.apple.eawt.AppEvent.OpenFilesEvent"); + Method getFilesMethod = openFilesEventClass.getMethod("getFiles"); - } catch (Exception e) { - logger.error("Error loading the KML",e); - EarthApp.showMessage("Problems while generating the KML file:
" + - (e.getCause()!=null?(e.getCause()+"
"):"") + - ( - ( e.getMessage()!=null && e.getMessage().length() > 300 ) ? e.getMessage().substring(0,300) : - ( e.getMessage()!=null ) ? e.getMessage() : "" - ) + ""); //$NON-NLS-1$ - }finally{ - if( windowShowingTimer != null ){ - try { - SwingUtilities.invokeLater( () -> { - CollectEarthWindow.endWaiting(windowShowingTimer); - if( windowShowingTimer instanceof PropertiesDialog ){ - ( (PropertiesDialog) windowShowingTimer).closeDialog(); - } - }); - } catch (Exception e2) { - logger.error("Error closing Options dialog", e2); - } - } - } + List files = (List) getFilesMethod.invoke( openFilesEventClass.cast( openFilesEventObject ) ); + for (File file : files ){ + try { + EarthApp.openProjectFileInRunningCollectEarth(file.getAbsolutePath()); + } catch (IOException e1) { + logger.error("Error opening CEP file " + e1); } - }.start(); - } + } + } + } -} From b1c2fe248bc7bda465db3965f90996884a0e36e4 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:05 +0100 Subject: [PATCH 0093/1620] New translations ServerController.java (French) --- .../earth/app/view/Messages_fr.properties | 300 +++++++++++++++--- 1 file changed, 263 insertions(+), 37 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 1f014d967a..5b52f161d0 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -2,64 +2,290 @@ package org.openforis.collect.earth.app.desktop; import java.io.File; import java.io.IOException; -import java.lang.reflect.Method; -import java.util.List; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.Statement; +import java.util.Map; +import java.util.Observable; +import java.util.Observer; +import org.eclipse.jetty.server.Connector; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.ServerConnector; +import org.eclipse.jetty.util.thread.ExecutorThreadPool; +import org.eclipse.jetty.webapp.WebAppContext; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; +import org.openforis.collect.earth.app.service.BrowserService; +import org.openforis.collect.earth.app.service.FolderFinder; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.BeanCreationException; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.context.support.WebApplicationContextUtils; + +import freemarker.template.TemplateException; /** - * Use reflection to be able to add the code specific to Mac OS X without generating compilation errors - * This class generates a Proxy so that an Interface method can be invoked. Sort of implementing an Interface using reflection - * @see How to implement an interface using Reflection + * Controls the Jetty server, starting and stopping it as well as reporting its staus. + * * @author Alfonso Sanchez-Paus Diaz * */ -public class MacOpenFilesInvocationHandler implements java.lang.reflect.InvocationHandler { +public class ServerController extends Observable { + + private static final String EARTH_SUBDOMAIN = "earth"; //$NON-NLS-1$ + + + public static final String SAIKU_RDB_SUFFIX = "Saiku"; //$NON-NLS-1$ + public static final String IPCC_RDB_SUFFIX = "Ipcc"; //$NON-NLS-1$ + + // Make sure that the default ports are the same for Server and Generator + private static final String DEFAULT_PORT = "80"; //$NON-NLS-1$ + + public enum ServerInitializationEvent{ + SERVER_STOPPED_EVENT("The Server has stopped"), + SERVER_STARTED_EVENT("The server started without problems"), + SERVER_STARTED_NO_DB_CONNECTION_EVENT("Collect Earth could not start due to a DB connection issue"), + SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT( "Collect Earth started but the PostgreSQL DB could not be reached (SQLite used instead until problems are fixed)"); + + private String message; + + private ServerInitializationEvent(String message) { + this.message = message; + } + + @Override + public String toString() { + return message; + } + + } + + private Server server; + private final Logger logger = LoggerFactory.getLogger(ServerController.class); + private WebAppContext root; + static LocalPropertiesService localPropertiesService; + + public WebApplicationContext getContext() { + WebApplicationContext webApplicationContext = null; + try { + webApplicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(getRoot().getServletContext()); + } catch (Exception e) { + logger.error("Error getting web application context", e); //$NON-NLS-1$ + } + return webApplicationContext; + } + + private static String getDbURL(final CollectDBDriver collectDBDriver) { + // jdbc:postgresql://hostname:port/dbname + + String url = collectDBDriver.getUrl(); + url = url.replace("REPLACE_HOSTNAME", localPropertiesService.getValue(EarthProperty.DB_HOST)); //$NON-NLS-1$ + url = url.replace("REPLACE_PORT", localPropertiesService.getValue(EarthProperty.DB_PORT)); //$NON-NLS-1$ + url = url.replace("REPLACE_DBNAME", localPropertiesService.getValue(EarthProperty.DB_NAME)); //$NON-NLS-1$ + return url; + } + + private int getPort() { + + String webPort = localPropertiesService.getLocalPort(); + if (webPort == null || webPort.isEmpty()) { + webPort = DEFAULT_PORT; + } + return Integer.parseInt(webPort); + } + + private WebAppContext getRoot() { + return root; + } + + private void setRoot(WebAppContext root) { + this.root = root; + } + + private boolean initilizeDataSources() throws IOException, TemplateException { + + CollectDBDriver collectDBDriver = localPropertiesService.getCollectDBDriver(); + boolean isConnectionTypeSwitched = false; + if(localPropertiesService.isUsingPostgreSqlDB() && !isPostgreSQLReachable(collectDBDriver) ){ + + logger.warn("Impossible to reach the PostgreSQL server at " + getDbURL(CollectDBDriver.POSTGRESQL)); + logger.warn("Using the SQLite version until fixed!"); + logger.error("Impossible to reach the PostgreSQL server at " + getDbURL(CollectDBDriver.POSTGRESQL) + " using SQLite version"); + collectDBDriver = CollectDBDriver.SQLITE; + isConnectionTypeSwitched = true; + } + + final File jettyAppCtxTemplateSrc = new File("resources/applicationContext.fmt"); //$NON-NLS-1$ + final File jettyAppCtxDst = new File(EarthConstants.GENERATED_FOLDER + "/applicationContext.xml"); //$NON-NLS-1$ + + jettyAppCtxDst.getParentFile().mkdirs(); + + final Map data = new java.util.HashMap<>(); - private final Logger logger = LoggerFactory.getLogger(MacOpenFilesInvocationHandler.class); + data.put("driver", collectDBDriver.getDriverClass()); //$NON-NLS-1$ + data.put("url", getDbURL(collectDBDriver)); //$NON-NLS-1$ + data.put("urlSaiku", getSaikuDbURL(collectDBDriver)); //$NON-NLS-1$ + data.put("urlIpcc", getIpccDbURL(collectDBDriver)); //$NON-NLS-1$ + data.put("username", localPropertiesService.getValue(EarthProperty.DB_USERNAME)); //$NON-NLS-1$ + data.put("password", localPropertiesService.getValue(EarthProperty.DB_PASSWORD)); //$NON-NLS-1$ + data.put("collectEarthExecutionFolder", System.getProperty("user.dir") + File.separator); //$NON-NLS-1$ //$NON-NLS-2$ - public MacOpenFilesInvocationHandler() { - super(); - } + FreemarkerTemplateUtils.applyTemplate(jettyAppCtxTemplateSrc, jettyAppCtxDst, data); - public Object invoke(Object proxy, Method m, Object[] args) throws Throwable - { + return isConnectionTypeSwitched; - Object result = null; + } - try { + private boolean isPostgreSQLReachable(CollectDBDriver collectDBDriver) { + boolean connectionWorked = false; + try ( Connection connection = DriverManager.getConnection( + getDbURL(collectDBDriver), + localPropertiesService.getValue(EarthProperty.DB_USERNAME), + localPropertiesService.getValue(EarthProperty.DB_PASSWORD) + ) ){ + String query="select version()"; + try( Statement s = connection.createStatement() ){ + try( ResultSet rs=s.executeQuery(query) ){ + while(rs.next()) + { + logger.debug( "It works, there are " + rs.getString(1) + " rows on the ofc_record table"); + } + connectionWorked = true; + } + } + } + catch(Exception e){ + logger.error("Error while testing the connection to the postgresSQL DB", e); + } + + return connectionWorked; + + } + + public static String getSaikuDbURL(CollectDBDriver collectDBDriver) { + String urlSaikuDB = getDbURL(collectDBDriver); + + if (localPropertiesService.isUsingSqliteDB()) { + urlSaikuDB += EarthConstants.SAIKU_RDB_SUFFIX; + } + return urlSaikuDB; + } + + public static String getIpccDbURL(CollectDBDriver collectDBDriver) { + String urlIpccDB = getDbURL(collectDBDriver); + + if (localPropertiesService.isUsingSqliteDB()) { + urlIpccDB += IPCC_RDB_SUFFIX; + } + return urlIpccDB; + } + + public void startServer(Observer observeInitialization) throws Exception { + + localPropertiesService = new LocalPropertiesService(); + + this.addObserver(observeInitialization); + + boolean postgresConnectionSwitchedtoSqlite = initilizeDataSources(); + try { + + final String webappDirLocation = FolderFinder.getCollectEarthDataFolder(); + + // The port that we should run on can be set into an environment variable + // Look for that variable and default to 8080 if it isn't there. - // if the method name equals some method's name then call your method - if ( m!= null && m.getName().equals("openFiles") && args !=null && args.length>0) { - openFilesImplmentation(args[0]); - } + // For log4j 1.2 --> Moving to Log4J2 + //PropertyConfigurator.configure(this.getClass().getResource("/WEB-INF/conf/log4j.properties")); - } catch (Exception e) { - logger.error(" Error while interpreting invocation " , e ); - } finally { - logger.info("end method {}", m!=null?m.getName():"Unknown method"); - } + //server = new Server(new ExecutorThreadPool(10, 50, 5, TimeUnit.SECONDS)); // For JEtty 7 + //server = new Server(new ExecutorThreadPool(50, 50, 5, TimeUnit.MILLISECONDS) ); // For JEtty 9, different parameters for the constructor + server = new Server(new ExecutorThreadPool() ); // For JEtty 9.4, different parameters for the constructor + + // // Use blocking-IO connector to improve throughput + final ServerConnector connector = new ServerConnector(server); + connector.setName( LocalPropertiesService.LOCAL_HOST + ":" + getPort()); //$NON-NLS-1$ + connector.setHost("0.0.0.0"); //$NON-NLS-1$ + //connector.setHost( LocalPropertiesService.LOCAL_HOST ); + + connector.setPort(getPort()); + + connector.setStopTimeout(1000); + + server.setConnectors(new Connector[] { connector }); + + WebAppContext wweAppContext = new WebAppContext(); + setRoot(wweAppContext); + + getRoot().setContextPath("/" + EARTH_SUBDOMAIN); //$NON-NLS-1$ + + getRoot().setDescriptor(this.getClass().getResource("/WEB-INF/web.xml").toURI().toString()); //$NON-NLS-1$ + + getRoot().setResourceBase(webappDirLocation); + + // Parent loader priority is a class loader setting that Jetty accepts. + // By default Jetty will behave like most web containers in that it will + // allow your application to replace non-server libraries that are part of the container. + // Setting parent loader priority to true changes this behaviour. + // Read more here: + // http://wiki.eclipse.org/Jetty/Reference/Jetty_Classloading + getRoot().setParentLoaderPriority(true); + + server.setHandler(getRoot()); + server.setStopAtShutdown(true); + server.start(); + setChanged(); + + Object attribute = getRoot().getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); + if (attribute instanceof BeanCreationException) { + ( (BeanCreationException) attribute).printStackTrace(System.out); + logger.error("Error creating the database connection", attribute); //$NON-NLS-1$ + notifyObservers(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT); + } else { + if (postgresConnectionSwitchedtoSqlite){ + notifyObservers(ServerInitializationEvent.SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT); + }else{ + notifyObservers(ServerInitializationEvent.SERVER_STARTED_EVENT); + } + } + } catch (final IOException e) { + logger.error("Error initializing local properties", e); //$NON-NLS-1$ + } catch (Exception e) { + logger.error("Error staring the server", e); //$NON-NLS-1$ + } - return result; + // Force the local properties to be loaded before the browserservice is instantiated!! DO NOT REMOVE + getContext().getBean(LocalPropertiesService.class); + this.addObserver(getContext().getBean(BrowserService.class)); - } + } - private void openFilesImplmentation(Object openFilesEventObject) throws Exception { - Class openFilesEventClass = Class.forName("com.apple.eawt.AppEvent.OpenFilesEvent"); - Method getFilesMethod = openFilesEventClass.getMethod("getFiles"); + public void stopServer() throws Exception { + if (server != null && server.isRunning()) { + server.stop(); + setChanged(); + notifyObservers(ServerInitializationEvent.SERVER_STOPPED_EVENT); + } + } - List files = (List) getFilesMethod.invoke( openFilesEventClass.cast( openFilesEventObject ) ); - for (File file : files ){ - try { - EarthApp.openProjectFileInRunningCollectEarth(file.getAbsolutePath()); - } catch (IOException e1) { - logger.error("Error opening CEP file " + e1); + public static String getHostAddress(String host, String port) { + String hostAndPort = ""; //$NON-NLS-1$ + if (host != null && host.length() > 0) { + hostAndPort = host; + if (port != null && port.length() > 0) { + hostAndPort += ":" + port; //$NON-NLS-1$ } - } - } - } + hostAndPort = "http://" + hostAndPort + "/" + EARTH_SUBDOMAIN + "/"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + return hostAndPort; + } +} From 2382be13ef356be0a1f5cea7ac0a8b2cee2f559e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:06 +0100 Subject: [PATCH 0094/1620] New translations ServerController.java (Spanish) --- .../earth/app/view/Messages_es.properties | 300 +++++++++++++++--- 1 file changed, 263 insertions(+), 37 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 1f014d967a..5b52f161d0 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -2,64 +2,290 @@ package org.openforis.collect.earth.app.desktop; import java.io.File; import java.io.IOException; -import java.lang.reflect.Method; -import java.util.List; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.Statement; +import java.util.Map; +import java.util.Observable; +import java.util.Observer; +import org.eclipse.jetty.server.Connector; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.ServerConnector; +import org.eclipse.jetty.util.thread.ExecutorThreadPool; +import org.eclipse.jetty.webapp.WebAppContext; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; +import org.openforis.collect.earth.app.service.BrowserService; +import org.openforis.collect.earth.app.service.FolderFinder; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.BeanCreationException; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.context.support.WebApplicationContextUtils; + +import freemarker.template.TemplateException; /** - * Use reflection to be able to add the code specific to Mac OS X without generating compilation errors - * This class generates a Proxy so that an Interface method can be invoked. Sort of implementing an Interface using reflection - * @see How to implement an interface using Reflection + * Controls the Jetty server, starting and stopping it as well as reporting its staus. + * * @author Alfonso Sanchez-Paus Diaz * */ -public class MacOpenFilesInvocationHandler implements java.lang.reflect.InvocationHandler { +public class ServerController extends Observable { + + private static final String EARTH_SUBDOMAIN = "earth"; //$NON-NLS-1$ + + + public static final String SAIKU_RDB_SUFFIX = "Saiku"; //$NON-NLS-1$ + public static final String IPCC_RDB_SUFFIX = "Ipcc"; //$NON-NLS-1$ + + // Make sure that the default ports are the same for Server and Generator + private static final String DEFAULT_PORT = "80"; //$NON-NLS-1$ + + public enum ServerInitializationEvent{ + SERVER_STOPPED_EVENT("The Server has stopped"), + SERVER_STARTED_EVENT("The server started without problems"), + SERVER_STARTED_NO_DB_CONNECTION_EVENT("Collect Earth could not start due to a DB connection issue"), + SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT( "Collect Earth started but the PostgreSQL DB could not be reached (SQLite used instead until problems are fixed)"); + + private String message; + + private ServerInitializationEvent(String message) { + this.message = message; + } + + @Override + public String toString() { + return message; + } + + } + + private Server server; + private final Logger logger = LoggerFactory.getLogger(ServerController.class); + private WebAppContext root; + static LocalPropertiesService localPropertiesService; + + public WebApplicationContext getContext() { + WebApplicationContext webApplicationContext = null; + try { + webApplicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(getRoot().getServletContext()); + } catch (Exception e) { + logger.error("Error getting web application context", e); //$NON-NLS-1$ + } + return webApplicationContext; + } + + private static String getDbURL(final CollectDBDriver collectDBDriver) { + // jdbc:postgresql://hostname:port/dbname + + String url = collectDBDriver.getUrl(); + url = url.replace("REPLACE_HOSTNAME", localPropertiesService.getValue(EarthProperty.DB_HOST)); //$NON-NLS-1$ + url = url.replace("REPLACE_PORT", localPropertiesService.getValue(EarthProperty.DB_PORT)); //$NON-NLS-1$ + url = url.replace("REPLACE_DBNAME", localPropertiesService.getValue(EarthProperty.DB_NAME)); //$NON-NLS-1$ + return url; + } + + private int getPort() { + + String webPort = localPropertiesService.getLocalPort(); + if (webPort == null || webPort.isEmpty()) { + webPort = DEFAULT_PORT; + } + return Integer.parseInt(webPort); + } + + private WebAppContext getRoot() { + return root; + } + + private void setRoot(WebAppContext root) { + this.root = root; + } + + private boolean initilizeDataSources() throws IOException, TemplateException { + + CollectDBDriver collectDBDriver = localPropertiesService.getCollectDBDriver(); + boolean isConnectionTypeSwitched = false; + if(localPropertiesService.isUsingPostgreSqlDB() && !isPostgreSQLReachable(collectDBDriver) ){ + + logger.warn("Impossible to reach the PostgreSQL server at " + getDbURL(CollectDBDriver.POSTGRESQL)); + logger.warn("Using the SQLite version until fixed!"); + logger.error("Impossible to reach the PostgreSQL server at " + getDbURL(CollectDBDriver.POSTGRESQL) + " using SQLite version"); + collectDBDriver = CollectDBDriver.SQLITE; + isConnectionTypeSwitched = true; + } + + final File jettyAppCtxTemplateSrc = new File("resources/applicationContext.fmt"); //$NON-NLS-1$ + final File jettyAppCtxDst = new File(EarthConstants.GENERATED_FOLDER + "/applicationContext.xml"); //$NON-NLS-1$ + + jettyAppCtxDst.getParentFile().mkdirs(); + + final Map data = new java.util.HashMap<>(); - private final Logger logger = LoggerFactory.getLogger(MacOpenFilesInvocationHandler.class); + data.put("driver", collectDBDriver.getDriverClass()); //$NON-NLS-1$ + data.put("url", getDbURL(collectDBDriver)); //$NON-NLS-1$ + data.put("urlSaiku", getSaikuDbURL(collectDBDriver)); //$NON-NLS-1$ + data.put("urlIpcc", getIpccDbURL(collectDBDriver)); //$NON-NLS-1$ + data.put("username", localPropertiesService.getValue(EarthProperty.DB_USERNAME)); //$NON-NLS-1$ + data.put("password", localPropertiesService.getValue(EarthProperty.DB_PASSWORD)); //$NON-NLS-1$ + data.put("collectEarthExecutionFolder", System.getProperty("user.dir") + File.separator); //$NON-NLS-1$ //$NON-NLS-2$ - public MacOpenFilesInvocationHandler() { - super(); - } + FreemarkerTemplateUtils.applyTemplate(jettyAppCtxTemplateSrc, jettyAppCtxDst, data); - public Object invoke(Object proxy, Method m, Object[] args) throws Throwable - { + return isConnectionTypeSwitched; - Object result = null; + } - try { + private boolean isPostgreSQLReachable(CollectDBDriver collectDBDriver) { + boolean connectionWorked = false; + try ( Connection connection = DriverManager.getConnection( + getDbURL(collectDBDriver), + localPropertiesService.getValue(EarthProperty.DB_USERNAME), + localPropertiesService.getValue(EarthProperty.DB_PASSWORD) + ) ){ + String query="select version()"; + try( Statement s = connection.createStatement() ){ + try( ResultSet rs=s.executeQuery(query) ){ + while(rs.next()) + { + logger.debug( "It works, there are " + rs.getString(1) + " rows on the ofc_record table"); + } + connectionWorked = true; + } + } + } + catch(Exception e){ + logger.error("Error while testing the connection to the postgresSQL DB", e); + } + + return connectionWorked; + + } + + public static String getSaikuDbURL(CollectDBDriver collectDBDriver) { + String urlSaikuDB = getDbURL(collectDBDriver); + + if (localPropertiesService.isUsingSqliteDB()) { + urlSaikuDB += EarthConstants.SAIKU_RDB_SUFFIX; + } + return urlSaikuDB; + } + + public static String getIpccDbURL(CollectDBDriver collectDBDriver) { + String urlIpccDB = getDbURL(collectDBDriver); + + if (localPropertiesService.isUsingSqliteDB()) { + urlIpccDB += IPCC_RDB_SUFFIX; + } + return urlIpccDB; + } + + public void startServer(Observer observeInitialization) throws Exception { + + localPropertiesService = new LocalPropertiesService(); + + this.addObserver(observeInitialization); + + boolean postgresConnectionSwitchedtoSqlite = initilizeDataSources(); + try { + + final String webappDirLocation = FolderFinder.getCollectEarthDataFolder(); + + // The port that we should run on can be set into an environment variable + // Look for that variable and default to 8080 if it isn't there. - // if the method name equals some method's name then call your method - if ( m!= null && m.getName().equals("openFiles") && args !=null && args.length>0) { - openFilesImplmentation(args[0]); - } + // For log4j 1.2 --> Moving to Log4J2 + //PropertyConfigurator.configure(this.getClass().getResource("/WEB-INF/conf/log4j.properties")); - } catch (Exception e) { - logger.error(" Error while interpreting invocation " , e ); - } finally { - logger.info("end method {}", m!=null?m.getName():"Unknown method"); - } + //server = new Server(new ExecutorThreadPool(10, 50, 5, TimeUnit.SECONDS)); // For JEtty 7 + //server = new Server(new ExecutorThreadPool(50, 50, 5, TimeUnit.MILLISECONDS) ); // For JEtty 9, different parameters for the constructor + server = new Server(new ExecutorThreadPool() ); // For JEtty 9.4, different parameters for the constructor + + // // Use blocking-IO connector to improve throughput + final ServerConnector connector = new ServerConnector(server); + connector.setName( LocalPropertiesService.LOCAL_HOST + ":" + getPort()); //$NON-NLS-1$ + connector.setHost("0.0.0.0"); //$NON-NLS-1$ + //connector.setHost( LocalPropertiesService.LOCAL_HOST ); + + connector.setPort(getPort()); + + connector.setStopTimeout(1000); + + server.setConnectors(new Connector[] { connector }); + + WebAppContext wweAppContext = new WebAppContext(); + setRoot(wweAppContext); + + getRoot().setContextPath("/" + EARTH_SUBDOMAIN); //$NON-NLS-1$ + + getRoot().setDescriptor(this.getClass().getResource("/WEB-INF/web.xml").toURI().toString()); //$NON-NLS-1$ + + getRoot().setResourceBase(webappDirLocation); + + // Parent loader priority is a class loader setting that Jetty accepts. + // By default Jetty will behave like most web containers in that it will + // allow your application to replace non-server libraries that are part of the container. + // Setting parent loader priority to true changes this behaviour. + // Read more here: + // http://wiki.eclipse.org/Jetty/Reference/Jetty_Classloading + getRoot().setParentLoaderPriority(true); + + server.setHandler(getRoot()); + server.setStopAtShutdown(true); + server.start(); + setChanged(); + + Object attribute = getRoot().getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); + if (attribute instanceof BeanCreationException) { + ( (BeanCreationException) attribute).printStackTrace(System.out); + logger.error("Error creating the database connection", attribute); //$NON-NLS-1$ + notifyObservers(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT); + } else { + if (postgresConnectionSwitchedtoSqlite){ + notifyObservers(ServerInitializationEvent.SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT); + }else{ + notifyObservers(ServerInitializationEvent.SERVER_STARTED_EVENT); + } + } + } catch (final IOException e) { + logger.error("Error initializing local properties", e); //$NON-NLS-1$ + } catch (Exception e) { + logger.error("Error staring the server", e); //$NON-NLS-1$ + } - return result; + // Force the local properties to be loaded before the browserservice is instantiated!! DO NOT REMOVE + getContext().getBean(LocalPropertiesService.class); + this.addObserver(getContext().getBean(BrowserService.class)); - } + } - private void openFilesImplmentation(Object openFilesEventObject) throws Exception { - Class openFilesEventClass = Class.forName("com.apple.eawt.AppEvent.OpenFilesEvent"); - Method getFilesMethod = openFilesEventClass.getMethod("getFiles"); + public void stopServer() throws Exception { + if (server != null && server.isRunning()) { + server.stop(); + setChanged(); + notifyObservers(ServerInitializationEvent.SERVER_STOPPED_EVENT); + } + } - List files = (List) getFilesMethod.invoke( openFilesEventClass.cast( openFilesEventObject ) ); - for (File file : files ){ - try { - EarthApp.openProjectFileInRunningCollectEarth(file.getAbsolutePath()); - } catch (IOException e1) { - logger.error("Error opening CEP file " + e1); + public static String getHostAddress(String host, String port) { + String hostAndPort = ""; //$NON-NLS-1$ + if (host != null && host.length() > 0) { + hostAndPort = host; + if (port != null && port.length() > 0) { + hostAndPort += ":" + port; //$NON-NLS-1$ } - } - } - } + hostAndPort = "http://" + hostAndPort + "/" + EARTH_SUBDOMAIN + "/"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + return hostAndPort; + } +} From 2ac445aa51515eef001df4ab516e47ed5f0ce3ef Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:07 +0100 Subject: [PATCH 0095/1620] New translations ServerController.java (English) --- .../earth/app/view/Messages_en.properties | 300 +++++++++++++++--- 1 file changed, 263 insertions(+), 37 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 1f014d967a..5b52f161d0 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -2,64 +2,290 @@ package org.openforis.collect.earth.app.desktop; import java.io.File; import java.io.IOException; -import java.lang.reflect.Method; -import java.util.List; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.Statement; +import java.util.Map; +import java.util.Observable; +import java.util.Observer; +import org.eclipse.jetty.server.Connector; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.ServerConnector; +import org.eclipse.jetty.util.thread.ExecutorThreadPool; +import org.eclipse.jetty.webapp.WebAppContext; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; +import org.openforis.collect.earth.app.service.BrowserService; +import org.openforis.collect.earth.app.service.FolderFinder; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.BeanCreationException; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.context.support.WebApplicationContextUtils; + +import freemarker.template.TemplateException; /** - * Use reflection to be able to add the code specific to Mac OS X without generating compilation errors - * This class generates a Proxy so that an Interface method can be invoked. Sort of implementing an Interface using reflection - * @see How to implement an interface using Reflection + * Controls the Jetty server, starting and stopping it as well as reporting its staus. + * * @author Alfonso Sanchez-Paus Diaz * */ -public class MacOpenFilesInvocationHandler implements java.lang.reflect.InvocationHandler { +public class ServerController extends Observable { + + private static final String EARTH_SUBDOMAIN = "earth"; //$NON-NLS-1$ + + + public static final String SAIKU_RDB_SUFFIX = "Saiku"; //$NON-NLS-1$ + public static final String IPCC_RDB_SUFFIX = "Ipcc"; //$NON-NLS-1$ + + // Make sure that the default ports are the same for Server and Generator + private static final String DEFAULT_PORT = "80"; //$NON-NLS-1$ + + public enum ServerInitializationEvent{ + SERVER_STOPPED_EVENT("The Server has stopped"), + SERVER_STARTED_EVENT("The server started without problems"), + SERVER_STARTED_NO_DB_CONNECTION_EVENT("Collect Earth could not start due to a DB connection issue"), + SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT( "Collect Earth started but the PostgreSQL DB could not be reached (SQLite used instead until problems are fixed)"); + + private String message; + + private ServerInitializationEvent(String message) { + this.message = message; + } + + @Override + public String toString() { + return message; + } + + } + + private Server server; + private final Logger logger = LoggerFactory.getLogger(ServerController.class); + private WebAppContext root; + static LocalPropertiesService localPropertiesService; + + public WebApplicationContext getContext() { + WebApplicationContext webApplicationContext = null; + try { + webApplicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(getRoot().getServletContext()); + } catch (Exception e) { + logger.error("Error getting web application context", e); //$NON-NLS-1$ + } + return webApplicationContext; + } + + private static String getDbURL(final CollectDBDriver collectDBDriver) { + // jdbc:postgresql://hostname:port/dbname + + String url = collectDBDriver.getUrl(); + url = url.replace("REPLACE_HOSTNAME", localPropertiesService.getValue(EarthProperty.DB_HOST)); //$NON-NLS-1$ + url = url.replace("REPLACE_PORT", localPropertiesService.getValue(EarthProperty.DB_PORT)); //$NON-NLS-1$ + url = url.replace("REPLACE_DBNAME", localPropertiesService.getValue(EarthProperty.DB_NAME)); //$NON-NLS-1$ + return url; + } + + private int getPort() { + + String webPort = localPropertiesService.getLocalPort(); + if (webPort == null || webPort.isEmpty()) { + webPort = DEFAULT_PORT; + } + return Integer.parseInt(webPort); + } + + private WebAppContext getRoot() { + return root; + } + + private void setRoot(WebAppContext root) { + this.root = root; + } + + private boolean initilizeDataSources() throws IOException, TemplateException { + + CollectDBDriver collectDBDriver = localPropertiesService.getCollectDBDriver(); + boolean isConnectionTypeSwitched = false; + if(localPropertiesService.isUsingPostgreSqlDB() && !isPostgreSQLReachable(collectDBDriver) ){ + + logger.warn("Impossible to reach the PostgreSQL server at " + getDbURL(CollectDBDriver.POSTGRESQL)); + logger.warn("Using the SQLite version until fixed!"); + logger.error("Impossible to reach the PostgreSQL server at " + getDbURL(CollectDBDriver.POSTGRESQL) + " using SQLite version"); + collectDBDriver = CollectDBDriver.SQLITE; + isConnectionTypeSwitched = true; + } + + final File jettyAppCtxTemplateSrc = new File("resources/applicationContext.fmt"); //$NON-NLS-1$ + final File jettyAppCtxDst = new File(EarthConstants.GENERATED_FOLDER + "/applicationContext.xml"); //$NON-NLS-1$ + + jettyAppCtxDst.getParentFile().mkdirs(); + + final Map data = new java.util.HashMap<>(); - private final Logger logger = LoggerFactory.getLogger(MacOpenFilesInvocationHandler.class); + data.put("driver", collectDBDriver.getDriverClass()); //$NON-NLS-1$ + data.put("url", getDbURL(collectDBDriver)); //$NON-NLS-1$ + data.put("urlSaiku", getSaikuDbURL(collectDBDriver)); //$NON-NLS-1$ + data.put("urlIpcc", getIpccDbURL(collectDBDriver)); //$NON-NLS-1$ + data.put("username", localPropertiesService.getValue(EarthProperty.DB_USERNAME)); //$NON-NLS-1$ + data.put("password", localPropertiesService.getValue(EarthProperty.DB_PASSWORD)); //$NON-NLS-1$ + data.put("collectEarthExecutionFolder", System.getProperty("user.dir") + File.separator); //$NON-NLS-1$ //$NON-NLS-2$ - public MacOpenFilesInvocationHandler() { - super(); - } + FreemarkerTemplateUtils.applyTemplate(jettyAppCtxTemplateSrc, jettyAppCtxDst, data); - public Object invoke(Object proxy, Method m, Object[] args) throws Throwable - { + return isConnectionTypeSwitched; - Object result = null; + } - try { + private boolean isPostgreSQLReachable(CollectDBDriver collectDBDriver) { + boolean connectionWorked = false; + try ( Connection connection = DriverManager.getConnection( + getDbURL(collectDBDriver), + localPropertiesService.getValue(EarthProperty.DB_USERNAME), + localPropertiesService.getValue(EarthProperty.DB_PASSWORD) + ) ){ + String query="select version()"; + try( Statement s = connection.createStatement() ){ + try( ResultSet rs=s.executeQuery(query) ){ + while(rs.next()) + { + logger.debug( "It works, there are " + rs.getString(1) + " rows on the ofc_record table"); + } + connectionWorked = true; + } + } + } + catch(Exception e){ + logger.error("Error while testing the connection to the postgresSQL DB", e); + } + + return connectionWorked; + + } + + public static String getSaikuDbURL(CollectDBDriver collectDBDriver) { + String urlSaikuDB = getDbURL(collectDBDriver); + + if (localPropertiesService.isUsingSqliteDB()) { + urlSaikuDB += EarthConstants.SAIKU_RDB_SUFFIX; + } + return urlSaikuDB; + } + + public static String getIpccDbURL(CollectDBDriver collectDBDriver) { + String urlIpccDB = getDbURL(collectDBDriver); + + if (localPropertiesService.isUsingSqliteDB()) { + urlIpccDB += IPCC_RDB_SUFFIX; + } + return urlIpccDB; + } + + public void startServer(Observer observeInitialization) throws Exception { + + localPropertiesService = new LocalPropertiesService(); + + this.addObserver(observeInitialization); + + boolean postgresConnectionSwitchedtoSqlite = initilizeDataSources(); + try { + + final String webappDirLocation = FolderFinder.getCollectEarthDataFolder(); + + // The port that we should run on can be set into an environment variable + // Look for that variable and default to 8080 if it isn't there. - // if the method name equals some method's name then call your method - if ( m!= null && m.getName().equals("openFiles") && args !=null && args.length>0) { - openFilesImplmentation(args[0]); - } + // For log4j 1.2 --> Moving to Log4J2 + //PropertyConfigurator.configure(this.getClass().getResource("/WEB-INF/conf/log4j.properties")); - } catch (Exception e) { - logger.error(" Error while interpreting invocation " , e ); - } finally { - logger.info("end method {}", m!=null?m.getName():"Unknown method"); - } + //server = new Server(new ExecutorThreadPool(10, 50, 5, TimeUnit.SECONDS)); // For JEtty 7 + //server = new Server(new ExecutorThreadPool(50, 50, 5, TimeUnit.MILLISECONDS) ); // For JEtty 9, different parameters for the constructor + server = new Server(new ExecutorThreadPool() ); // For JEtty 9.4, different parameters for the constructor + + // // Use blocking-IO connector to improve throughput + final ServerConnector connector = new ServerConnector(server); + connector.setName( LocalPropertiesService.LOCAL_HOST + ":" + getPort()); //$NON-NLS-1$ + connector.setHost("0.0.0.0"); //$NON-NLS-1$ + //connector.setHost( LocalPropertiesService.LOCAL_HOST ); + + connector.setPort(getPort()); + + connector.setStopTimeout(1000); + + server.setConnectors(new Connector[] { connector }); + + WebAppContext wweAppContext = new WebAppContext(); + setRoot(wweAppContext); + + getRoot().setContextPath("/" + EARTH_SUBDOMAIN); //$NON-NLS-1$ + + getRoot().setDescriptor(this.getClass().getResource("/WEB-INF/web.xml").toURI().toString()); //$NON-NLS-1$ + + getRoot().setResourceBase(webappDirLocation); + + // Parent loader priority is a class loader setting that Jetty accepts. + // By default Jetty will behave like most web containers in that it will + // allow your application to replace non-server libraries that are part of the container. + // Setting parent loader priority to true changes this behaviour. + // Read more here: + // http://wiki.eclipse.org/Jetty/Reference/Jetty_Classloading + getRoot().setParentLoaderPriority(true); + + server.setHandler(getRoot()); + server.setStopAtShutdown(true); + server.start(); + setChanged(); + + Object attribute = getRoot().getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); + if (attribute instanceof BeanCreationException) { + ( (BeanCreationException) attribute).printStackTrace(System.out); + logger.error("Error creating the database connection", attribute); //$NON-NLS-1$ + notifyObservers(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT); + } else { + if (postgresConnectionSwitchedtoSqlite){ + notifyObservers(ServerInitializationEvent.SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT); + }else{ + notifyObservers(ServerInitializationEvent.SERVER_STARTED_EVENT); + } + } + } catch (final IOException e) { + logger.error("Error initializing local properties", e); //$NON-NLS-1$ + } catch (Exception e) { + logger.error("Error staring the server", e); //$NON-NLS-1$ + } - return result; + // Force the local properties to be loaded before the browserservice is instantiated!! DO NOT REMOVE + getContext().getBean(LocalPropertiesService.class); + this.addObserver(getContext().getBean(BrowserService.class)); - } + } - private void openFilesImplmentation(Object openFilesEventObject) throws Exception { - Class openFilesEventClass = Class.forName("com.apple.eawt.AppEvent.OpenFilesEvent"); - Method getFilesMethod = openFilesEventClass.getMethod("getFiles"); + public void stopServer() throws Exception { + if (server != null && server.isRunning()) { + server.stop(); + setChanged(); + notifyObservers(ServerInitializationEvent.SERVER_STOPPED_EVENT); + } + } - List files = (List) getFilesMethod.invoke( openFilesEventClass.cast( openFilesEventObject ) ); - for (File file : files ){ - try { - EarthApp.openProjectFileInRunningCollectEarth(file.getAbsolutePath()); - } catch (IOException e1) { - logger.error("Error opening CEP file " + e1); + public static String getHostAddress(String host, String port) { + String hostAndPort = ""; //$NON-NLS-1$ + if (host != null && host.length() > 0) { + hostAndPort = host; + if (port != null && port.length() > 0) { + hostAndPort += ":" + port; //$NON-NLS-1$ } - } - } - } + hostAndPort = "http://" + hostAndPort + "/" + EARTH_SUBDOMAIN + "/"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + return hostAndPort; + } +} From 468a8815605b51b68b5247a70c1bf5d97e1b284a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:09 +0100 Subject: [PATCH 0096/1620] New translations AspectCode.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 113 ++++++++---------- 1 file changed, 53 insertions(+), 60 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 1f014d967a..dfaad035c3 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,65 +1,58 @@ -package org.openforis.collect.earth.app.desktop; +package org.openforis.collect.earth.app.model; -import java.io.File; -import java.io.IOException; -import java.lang.reflect.Method; -import java.util.List; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.openforis.collect.earth.app.view.Messages; /** - * Use reflection to be able to add the code specific to Mac OS X without generating compilation errors - * This class generates a Proxy so that an Interface method can be invoked. Sort of implementing an Interface using reflection - * @see How to implement an interface using Reflection + * Enumeration of the aspects that Collect Earth can use to classify the plots. + * Each aspect has an ID attach to it and represents a 45 dregree range ( -22.5 to 22.5 for North, 22.5 to 67.5 to North East, 66.5 to 112.5 for East + * and so on) + * The enumeration also has an static method to calculate the + * * @author Alfonso Sanchez-Paus Diaz - * + * */ -public class MacOpenFilesInvocationHandler implements java.lang.reflect.InvocationHandler { - - private final Logger logger = LoggerFactory.getLogger(MacOpenFilesInvocationHandler.class); - - public MacOpenFilesInvocationHandler() { - super(); - } - - public Object invoke(Object proxy, Method m, Object[] args) throws Throwable - - { - - Object result = null; - - try { - - // if the method name equals some method's name then call your method - if ( m!= null && m.getName().equals("openFiles") && args !=null && args.length>0) { - openFilesImplmentation(args[0]); - } - - } catch (Exception e) { - logger.error(" Error while interpreting invocation " , e ); - } finally { - logger.info("end method {}", m!=null?m.getName():"Unknown method"); - } - - return result; - - } - - private void openFilesImplmentation(Object openFilesEventObject) throws Exception { - Class openFilesEventClass = Class.forName("com.apple.eawt.AppEvent.OpenFilesEvent"); - Method getFilesMethod = openFilesEventClass.getMethod("getFiles"); - - List files = (List) getFilesMethod.invoke( openFilesEventClass.cast( openFilesEventObject ) ); - - for (File file : files ){ - try { - EarthApp.openProjectFileInRunningCollectEarth(file.getAbsolutePath()); - } catch (IOException e1) { - logger.error("Error opening CEP file " + e1); - } - } - - } - } - +public enum AspectCode { + N(Messages.getString("AspectCode.0"), 1), NE(Messages.getString("AspectCode.1"), 2), E(Messages.getString("AspectCode.2"), 3), SE(Messages.getString("AspectCode.3"), 4), S(Messages.getString("AspectCode.4"), 5), SW(Messages.getString("AspectCode.5"), 6), W(Messages.getString("AspectCode.6"), 7), NW(Messages.getString("AspectCode.7"), 8), NA( "NA", 9); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ + /** + * Utility method to get the aspect code ( N, N-E ... ) from the aspect in degrees + * + * @param aspect + * The aspect in degrees + * @return The aspect code corresponding to the aspect in degrees. + */ + public static AspectCode getAspectCode(Double aspect) { + double aspectProc = aspect + 22.5d; // North starts at -22.5, so add 22.5 to normalize so north becomes 0-45 , north east 45-90 and so on.. + if (aspectProc >= 360d) { + aspectProc = aspectProc - 360d; + } + final int modulo = (int) Math.floor(aspectProc / 45d); + return AspectCode.values()[modulo]; + } + + private String label; + + private int id; + + private AspectCode(String label, int id) { + this.label = label; + this.id = id; + } + + public int getId() { + return id; + } + + public String getLabel() { + return label; + } + + public void setId(int id) { + this.id = id; + } + + @Override + public String toString() { + return label; + } + +} From d974e13f7dd964a145856c672350586370f09df6 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:10 +0100 Subject: [PATCH 0097/1620] New translations GAlogger.java (French) --- .../earth/app/view/Messages_fr.properties | 341 +++--------------- 1 file changed, 50 insertions(+), 291 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 5b52f161d0..c05160789c 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,291 +1,50 @@ -package org.openforis.collect.earth.app.desktop; - -import java.io.File; -import java.io.IOException; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.ResultSet; -import java.sql.Statement; -import java.util.Map; -import java.util.Observable; -import java.util.Observer; - -import org.eclipse.jetty.server.Connector; -import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.server.ServerConnector; -import org.eclipse.jetty.util.thread.ExecutorThreadPool; -import org.eclipse.jetty.webapp.WebAppContext; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; -import org.openforis.collect.earth.app.service.BrowserService; -import org.openforis.collect.earth.app.service.FolderFinder; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.BeanCreationException; -import org.springframework.web.context.WebApplicationContext; -import org.springframework.web.context.support.WebApplicationContextUtils; - -import freemarker.template.TemplateException; - -/** - * Controls the Jetty server, starting and stopping it as well as reporting its staus. - * - * @author Alfonso Sanchez-Paus Diaz - * - */ -public class ServerController extends Observable { - - private static final String EARTH_SUBDOMAIN = "earth"; //$NON-NLS-1$ - - - public static final String SAIKU_RDB_SUFFIX = "Saiku"; //$NON-NLS-1$ - public static final String IPCC_RDB_SUFFIX = "Ipcc"; //$NON-NLS-1$ - - // Make sure that the default ports are the same for Server and Generator - private static final String DEFAULT_PORT = "80"; //$NON-NLS-1$ - - public enum ServerInitializationEvent{ - SERVER_STOPPED_EVENT("The Server has stopped"), - SERVER_STARTED_EVENT("The server started without problems"), - SERVER_STARTED_NO_DB_CONNECTION_EVENT("Collect Earth could not start due to a DB connection issue"), - SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT( "Collect Earth started but the PostgreSQL DB could not be reached (SQLite used instead until problems are fixed)"); - - private String message; - - private ServerInitializationEvent(String message) { - this.message = message; - } - - @Override - public String toString() { - return message; - } - - } - - private Server server; - private final Logger logger = LoggerFactory.getLogger(ServerController.class); - private WebAppContext root; - static LocalPropertiesService localPropertiesService; - - public WebApplicationContext getContext() { - WebApplicationContext webApplicationContext = null; - try { - webApplicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(getRoot().getServletContext()); - } catch (Exception e) { - logger.error("Error getting web application context", e); //$NON-NLS-1$ - } - return webApplicationContext; - } - - private static String getDbURL(final CollectDBDriver collectDBDriver) { - // jdbc:postgresql://hostname:port/dbname - - String url = collectDBDriver.getUrl(); - url = url.replace("REPLACE_HOSTNAME", localPropertiesService.getValue(EarthProperty.DB_HOST)); //$NON-NLS-1$ - url = url.replace("REPLACE_PORT", localPropertiesService.getValue(EarthProperty.DB_PORT)); //$NON-NLS-1$ - url = url.replace("REPLACE_DBNAME", localPropertiesService.getValue(EarthProperty.DB_NAME)); //$NON-NLS-1$ - return url; - } - - private int getPort() { - - String webPort = localPropertiesService.getLocalPort(); - if (webPort == null || webPort.isEmpty()) { - webPort = DEFAULT_PORT; - } - return Integer.parseInt(webPort); - } - - private WebAppContext getRoot() { - return root; - } - - private void setRoot(WebAppContext root) { - this.root = root; - } - - private boolean initilizeDataSources() throws IOException, TemplateException { - - CollectDBDriver collectDBDriver = localPropertiesService.getCollectDBDriver(); - boolean isConnectionTypeSwitched = false; - if(localPropertiesService.isUsingPostgreSqlDB() && !isPostgreSQLReachable(collectDBDriver) ){ - - logger.warn("Impossible to reach the PostgreSQL server at " + getDbURL(CollectDBDriver.POSTGRESQL)); - logger.warn("Using the SQLite version until fixed!"); - logger.error("Impossible to reach the PostgreSQL server at " + getDbURL(CollectDBDriver.POSTGRESQL) + " using SQLite version"); - collectDBDriver = CollectDBDriver.SQLITE; - isConnectionTypeSwitched = true; - } - - final File jettyAppCtxTemplateSrc = new File("resources/applicationContext.fmt"); //$NON-NLS-1$ - final File jettyAppCtxDst = new File(EarthConstants.GENERATED_FOLDER + "/applicationContext.xml"); //$NON-NLS-1$ - - jettyAppCtxDst.getParentFile().mkdirs(); - - final Map data = new java.util.HashMap<>(); - - data.put("driver", collectDBDriver.getDriverClass()); //$NON-NLS-1$ - data.put("url", getDbURL(collectDBDriver)); //$NON-NLS-1$ - data.put("urlSaiku", getSaikuDbURL(collectDBDriver)); //$NON-NLS-1$ - data.put("urlIpcc", getIpccDbURL(collectDBDriver)); //$NON-NLS-1$ - data.put("username", localPropertiesService.getValue(EarthProperty.DB_USERNAME)); //$NON-NLS-1$ - data.put("password", localPropertiesService.getValue(EarthProperty.DB_PASSWORD)); //$NON-NLS-1$ - data.put("collectEarthExecutionFolder", System.getProperty("user.dir") + File.separator); //$NON-NLS-1$ //$NON-NLS-2$ - - FreemarkerTemplateUtils.applyTemplate(jettyAppCtxTemplateSrc, jettyAppCtxDst, data); - - - return isConnectionTypeSwitched; - - } - - private boolean isPostgreSQLReachable(CollectDBDriver collectDBDriver) { - boolean connectionWorked = false; - try ( Connection connection = DriverManager.getConnection( - getDbURL(collectDBDriver), - localPropertiesService.getValue(EarthProperty.DB_USERNAME), - localPropertiesService.getValue(EarthProperty.DB_PASSWORD) - ) ){ - String query="select version()"; - try( Statement s = connection.createStatement() ){ - try( ResultSet rs=s.executeQuery(query) ){ - while(rs.next()) - { - logger.debug( "It works, there are " + rs.getString(1) + " rows on the ofc_record table"); - } - connectionWorked = true; - } - } - } - catch(Exception e){ - logger.error("Error while testing the connection to the postgresSQL DB", e); - } - - return connectionWorked; - - } - - public static String getSaikuDbURL(CollectDBDriver collectDBDriver) { - String urlSaikuDB = getDbURL(collectDBDriver); - - if (localPropertiesService.isUsingSqliteDB()) { - urlSaikuDB += EarthConstants.SAIKU_RDB_SUFFIX; - } - return urlSaikuDB; - } - - public static String getIpccDbURL(CollectDBDriver collectDBDriver) { - String urlIpccDB = getDbURL(collectDBDriver); - - if (localPropertiesService.isUsingSqliteDB()) { - urlIpccDB += IPCC_RDB_SUFFIX; - } - return urlIpccDB; - } - - public void startServer(Observer observeInitialization) throws Exception { - - localPropertiesService = new LocalPropertiesService(); - - this.addObserver(observeInitialization); - - boolean postgresConnectionSwitchedtoSqlite = initilizeDataSources(); - try { - - final String webappDirLocation = FolderFinder.getCollectEarthDataFolder(); - - // The port that we should run on can be set into an environment variable - // Look for that variable and default to 8080 if it isn't there. - - // For log4j 1.2 --> Moving to Log4J2 - //PropertyConfigurator.configure(this.getClass().getResource("/WEB-INF/conf/log4j.properties")); - - //server = new Server(new ExecutorThreadPool(10, 50, 5, TimeUnit.SECONDS)); // For JEtty 7 - //server = new Server(new ExecutorThreadPool(50, 50, 5, TimeUnit.MILLISECONDS) ); // For JEtty 9, different parameters for the constructor - server = new Server(new ExecutorThreadPool() ); // For JEtty 9.4, different parameters for the constructor - - // // Use blocking-IO connector to improve throughput - final ServerConnector connector = new ServerConnector(server); - connector.setName( LocalPropertiesService.LOCAL_HOST + ":" + getPort()); //$NON-NLS-1$ - connector.setHost("0.0.0.0"); //$NON-NLS-1$ - //connector.setHost( LocalPropertiesService.LOCAL_HOST ); - - connector.setPort(getPort()); - - connector.setStopTimeout(1000); - - server.setConnectors(new Connector[] { connector }); - - WebAppContext wweAppContext = new WebAppContext(); - setRoot(wweAppContext); - - getRoot().setContextPath("/" + EARTH_SUBDOMAIN); //$NON-NLS-1$ - - getRoot().setDescriptor(this.getClass().getResource("/WEB-INF/web.xml").toURI().toString()); //$NON-NLS-1$ - - getRoot().setResourceBase(webappDirLocation); - - // Parent loader priority is a class loader setting that Jetty accepts. - // By default Jetty will behave like most web containers in that it will - // allow your application to replace non-server libraries that are part of the container. - // Setting parent loader priority to true changes this behaviour. - // Read more here: - // http://wiki.eclipse.org/Jetty/Reference/Jetty_Classloading - getRoot().setParentLoaderPriority(true); - - server.setHandler(getRoot()); - server.setStopAtShutdown(true); - server.start(); - setChanged(); - - Object attribute = getRoot().getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); - if (attribute instanceof BeanCreationException) { - ( (BeanCreationException) attribute).printStackTrace(System.out); - logger.error("Error creating the database connection", attribute); //$NON-NLS-1$ - notifyObservers(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT); - } else { - if (postgresConnectionSwitchedtoSqlite){ - notifyObservers(ServerInitializationEvent.SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT); - }else{ - notifyObservers(ServerInitializationEvent.SERVER_STARTED_EVENT); - } - } - } catch (final IOException e) { - logger.error("Error initializing local properties", e); //$NON-NLS-1$ - } catch (Exception e) { - logger.error("Error staring the server", e); //$NON-NLS-1$ - } - - // Force the local properties to be loaded before the browserservice is instantiated!! DO NOT REMOVE - getContext().getBean(LocalPropertiesService.class); - this.addObserver(getContext().getBean(BrowserService.class)); - - } - - public void stopServer() throws Exception { - if (server != null && server.isRunning()) { - server.stop(); - setChanged(); - notifyObservers(ServerInitializationEvent.SERVER_STOPPED_EVENT); - } - } - - - public static String getHostAddress(String host, String port) { - String hostAndPort = ""; //$NON-NLS-1$ - if (host != null && host.length() > 0) { - hostAndPort = host; - if (port != null && port.length() > 0) { - hostAndPort += ":" + port; //$NON-NLS-1$ - } - - hostAndPort = "http://" + hostAndPort + "/" + EARTH_SUBDOMAIN + "/"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - return hostAndPort; - - } -} +package org.openforis.collect.earth.app.logging; + +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; + +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.impl.client.HttpClientBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class GAlogger { + + private static final Logger logger = LoggerFactory.getLogger(GAlogger.class); + + public static void logGAnalytics(String event) { + new Thread("GA logging thread") { + + @Override + public void run() { + try { + String trackingId = "UA-55115982-1"; + HttpClient client = HttpClientBuilder.create().build(); + URIBuilder builder = new URIBuilder(); + builder.setScheme("http").setHost("www.google-analytics.com").setPath("/collect") + .addParameter("v", "1") // API Version. + .addParameter("tid", trackingId) // Tracking ID / Property ID. + // Anonymous Client Identifier. Ideally, this should be a UUID that + // is associated with particular user, device, or browser instance. + .addParameter("cid", "555").addParameter("t", "event") // Event hit type. + .addParameter("ec", "Collect Earth") // Event category. + .addParameter("ea", event); // Event action. + URI uri; + uri = builder.build(); + HttpGet request = new HttpGet(uri); + request.addHeader("user-agent", "Collect Earth Java Application"); + HttpResponse response = client.execute(request); + logger.info(event + " GA Logged - Response http " + response.getStatusLine().getStatusCode()); + } catch (URISyntaxException | IOException e) { + logger.error("Error generating URL for Analytics", e); + } + + } + }.start(); + + } +} From 44d7ef6eccc2c1cea6123283d26c59242db4299a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:11 +0100 Subject: [PATCH 0098/1620] New translations GAlogger.java (Spanish) --- .../earth/app/view/Messages_es.properties | 341 +++--------------- 1 file changed, 50 insertions(+), 291 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 5b52f161d0..c05160789c 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,291 +1,50 @@ -package org.openforis.collect.earth.app.desktop; - -import java.io.File; -import java.io.IOException; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.ResultSet; -import java.sql.Statement; -import java.util.Map; -import java.util.Observable; -import java.util.Observer; - -import org.eclipse.jetty.server.Connector; -import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.server.ServerConnector; -import org.eclipse.jetty.util.thread.ExecutorThreadPool; -import org.eclipse.jetty.webapp.WebAppContext; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; -import org.openforis.collect.earth.app.service.BrowserService; -import org.openforis.collect.earth.app.service.FolderFinder; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.BeanCreationException; -import org.springframework.web.context.WebApplicationContext; -import org.springframework.web.context.support.WebApplicationContextUtils; - -import freemarker.template.TemplateException; - -/** - * Controls the Jetty server, starting and stopping it as well as reporting its staus. - * - * @author Alfonso Sanchez-Paus Diaz - * - */ -public class ServerController extends Observable { - - private static final String EARTH_SUBDOMAIN = "earth"; //$NON-NLS-1$ - - - public static final String SAIKU_RDB_SUFFIX = "Saiku"; //$NON-NLS-1$ - public static final String IPCC_RDB_SUFFIX = "Ipcc"; //$NON-NLS-1$ - - // Make sure that the default ports are the same for Server and Generator - private static final String DEFAULT_PORT = "80"; //$NON-NLS-1$ - - public enum ServerInitializationEvent{ - SERVER_STOPPED_EVENT("The Server has stopped"), - SERVER_STARTED_EVENT("The server started without problems"), - SERVER_STARTED_NO_DB_CONNECTION_EVENT("Collect Earth could not start due to a DB connection issue"), - SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT( "Collect Earth started but the PostgreSQL DB could not be reached (SQLite used instead until problems are fixed)"); - - private String message; - - private ServerInitializationEvent(String message) { - this.message = message; - } - - @Override - public String toString() { - return message; - } - - } - - private Server server; - private final Logger logger = LoggerFactory.getLogger(ServerController.class); - private WebAppContext root; - static LocalPropertiesService localPropertiesService; - - public WebApplicationContext getContext() { - WebApplicationContext webApplicationContext = null; - try { - webApplicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(getRoot().getServletContext()); - } catch (Exception e) { - logger.error("Error getting web application context", e); //$NON-NLS-1$ - } - return webApplicationContext; - } - - private static String getDbURL(final CollectDBDriver collectDBDriver) { - // jdbc:postgresql://hostname:port/dbname - - String url = collectDBDriver.getUrl(); - url = url.replace("REPLACE_HOSTNAME", localPropertiesService.getValue(EarthProperty.DB_HOST)); //$NON-NLS-1$ - url = url.replace("REPLACE_PORT", localPropertiesService.getValue(EarthProperty.DB_PORT)); //$NON-NLS-1$ - url = url.replace("REPLACE_DBNAME", localPropertiesService.getValue(EarthProperty.DB_NAME)); //$NON-NLS-1$ - return url; - } - - private int getPort() { - - String webPort = localPropertiesService.getLocalPort(); - if (webPort == null || webPort.isEmpty()) { - webPort = DEFAULT_PORT; - } - return Integer.parseInt(webPort); - } - - private WebAppContext getRoot() { - return root; - } - - private void setRoot(WebAppContext root) { - this.root = root; - } - - private boolean initilizeDataSources() throws IOException, TemplateException { - - CollectDBDriver collectDBDriver = localPropertiesService.getCollectDBDriver(); - boolean isConnectionTypeSwitched = false; - if(localPropertiesService.isUsingPostgreSqlDB() && !isPostgreSQLReachable(collectDBDriver) ){ - - logger.warn("Impossible to reach the PostgreSQL server at " + getDbURL(CollectDBDriver.POSTGRESQL)); - logger.warn("Using the SQLite version until fixed!"); - logger.error("Impossible to reach the PostgreSQL server at " + getDbURL(CollectDBDriver.POSTGRESQL) + " using SQLite version"); - collectDBDriver = CollectDBDriver.SQLITE; - isConnectionTypeSwitched = true; - } - - final File jettyAppCtxTemplateSrc = new File("resources/applicationContext.fmt"); //$NON-NLS-1$ - final File jettyAppCtxDst = new File(EarthConstants.GENERATED_FOLDER + "/applicationContext.xml"); //$NON-NLS-1$ - - jettyAppCtxDst.getParentFile().mkdirs(); - - final Map data = new java.util.HashMap<>(); - - data.put("driver", collectDBDriver.getDriverClass()); //$NON-NLS-1$ - data.put("url", getDbURL(collectDBDriver)); //$NON-NLS-1$ - data.put("urlSaiku", getSaikuDbURL(collectDBDriver)); //$NON-NLS-1$ - data.put("urlIpcc", getIpccDbURL(collectDBDriver)); //$NON-NLS-1$ - data.put("username", localPropertiesService.getValue(EarthProperty.DB_USERNAME)); //$NON-NLS-1$ - data.put("password", localPropertiesService.getValue(EarthProperty.DB_PASSWORD)); //$NON-NLS-1$ - data.put("collectEarthExecutionFolder", System.getProperty("user.dir") + File.separator); //$NON-NLS-1$ //$NON-NLS-2$ - - FreemarkerTemplateUtils.applyTemplate(jettyAppCtxTemplateSrc, jettyAppCtxDst, data); - - - return isConnectionTypeSwitched; - - } - - private boolean isPostgreSQLReachable(CollectDBDriver collectDBDriver) { - boolean connectionWorked = false; - try ( Connection connection = DriverManager.getConnection( - getDbURL(collectDBDriver), - localPropertiesService.getValue(EarthProperty.DB_USERNAME), - localPropertiesService.getValue(EarthProperty.DB_PASSWORD) - ) ){ - String query="select version()"; - try( Statement s = connection.createStatement() ){ - try( ResultSet rs=s.executeQuery(query) ){ - while(rs.next()) - { - logger.debug( "It works, there are " + rs.getString(1) + " rows on the ofc_record table"); - } - connectionWorked = true; - } - } - } - catch(Exception e){ - logger.error("Error while testing the connection to the postgresSQL DB", e); - } - - return connectionWorked; - - } - - public static String getSaikuDbURL(CollectDBDriver collectDBDriver) { - String urlSaikuDB = getDbURL(collectDBDriver); - - if (localPropertiesService.isUsingSqliteDB()) { - urlSaikuDB += EarthConstants.SAIKU_RDB_SUFFIX; - } - return urlSaikuDB; - } - - public static String getIpccDbURL(CollectDBDriver collectDBDriver) { - String urlIpccDB = getDbURL(collectDBDriver); - - if (localPropertiesService.isUsingSqliteDB()) { - urlIpccDB += IPCC_RDB_SUFFIX; - } - return urlIpccDB; - } - - public void startServer(Observer observeInitialization) throws Exception { - - localPropertiesService = new LocalPropertiesService(); - - this.addObserver(observeInitialization); - - boolean postgresConnectionSwitchedtoSqlite = initilizeDataSources(); - try { - - final String webappDirLocation = FolderFinder.getCollectEarthDataFolder(); - - // The port that we should run on can be set into an environment variable - // Look for that variable and default to 8080 if it isn't there. - - // For log4j 1.2 --> Moving to Log4J2 - //PropertyConfigurator.configure(this.getClass().getResource("/WEB-INF/conf/log4j.properties")); - - //server = new Server(new ExecutorThreadPool(10, 50, 5, TimeUnit.SECONDS)); // For JEtty 7 - //server = new Server(new ExecutorThreadPool(50, 50, 5, TimeUnit.MILLISECONDS) ); // For JEtty 9, different parameters for the constructor - server = new Server(new ExecutorThreadPool() ); // For JEtty 9.4, different parameters for the constructor - - // // Use blocking-IO connector to improve throughput - final ServerConnector connector = new ServerConnector(server); - connector.setName( LocalPropertiesService.LOCAL_HOST + ":" + getPort()); //$NON-NLS-1$ - connector.setHost("0.0.0.0"); //$NON-NLS-1$ - //connector.setHost( LocalPropertiesService.LOCAL_HOST ); - - connector.setPort(getPort()); - - connector.setStopTimeout(1000); - - server.setConnectors(new Connector[] { connector }); - - WebAppContext wweAppContext = new WebAppContext(); - setRoot(wweAppContext); - - getRoot().setContextPath("/" + EARTH_SUBDOMAIN); //$NON-NLS-1$ - - getRoot().setDescriptor(this.getClass().getResource("/WEB-INF/web.xml").toURI().toString()); //$NON-NLS-1$ - - getRoot().setResourceBase(webappDirLocation); - - // Parent loader priority is a class loader setting that Jetty accepts. - // By default Jetty will behave like most web containers in that it will - // allow your application to replace non-server libraries that are part of the container. - // Setting parent loader priority to true changes this behaviour. - // Read more here: - // http://wiki.eclipse.org/Jetty/Reference/Jetty_Classloading - getRoot().setParentLoaderPriority(true); - - server.setHandler(getRoot()); - server.setStopAtShutdown(true); - server.start(); - setChanged(); - - Object attribute = getRoot().getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); - if (attribute instanceof BeanCreationException) { - ( (BeanCreationException) attribute).printStackTrace(System.out); - logger.error("Error creating the database connection", attribute); //$NON-NLS-1$ - notifyObservers(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT); - } else { - if (postgresConnectionSwitchedtoSqlite){ - notifyObservers(ServerInitializationEvent.SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT); - }else{ - notifyObservers(ServerInitializationEvent.SERVER_STARTED_EVENT); - } - } - } catch (final IOException e) { - logger.error("Error initializing local properties", e); //$NON-NLS-1$ - } catch (Exception e) { - logger.error("Error staring the server", e); //$NON-NLS-1$ - } - - // Force the local properties to be loaded before the browserservice is instantiated!! DO NOT REMOVE - getContext().getBean(LocalPropertiesService.class); - this.addObserver(getContext().getBean(BrowserService.class)); - - } - - public void stopServer() throws Exception { - if (server != null && server.isRunning()) { - server.stop(); - setChanged(); - notifyObservers(ServerInitializationEvent.SERVER_STOPPED_EVENT); - } - } - - - public static String getHostAddress(String host, String port) { - String hostAndPort = ""; //$NON-NLS-1$ - if (host != null && host.length() > 0) { - hostAndPort = host; - if (port != null && port.length() > 0) { - hostAndPort += ":" + port; //$NON-NLS-1$ - } - - hostAndPort = "http://" + hostAndPort + "/" + EARTH_SUBDOMAIN + "/"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - return hostAndPort; - - } -} +package org.openforis.collect.earth.app.logging; + +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; + +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.impl.client.HttpClientBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class GAlogger { + + private static final Logger logger = LoggerFactory.getLogger(GAlogger.class); + + public static void logGAnalytics(String event) { + new Thread("GA logging thread") { + + @Override + public void run() { + try { + String trackingId = "UA-55115982-1"; + HttpClient client = HttpClientBuilder.create().build(); + URIBuilder builder = new URIBuilder(); + builder.setScheme("http").setHost("www.google-analytics.com").setPath("/collect") + .addParameter("v", "1") // API Version. + .addParameter("tid", trackingId) // Tracking ID / Property ID. + // Anonymous Client Identifier. Ideally, this should be a UUID that + // is associated with particular user, device, or browser instance. + .addParameter("cid", "555").addParameter("t", "event") // Event hit type. + .addParameter("ec", "Collect Earth") // Event category. + .addParameter("ea", event); // Event action. + URI uri; + uri = builder.build(); + HttpGet request = new HttpGet(uri); + request.addHeader("user-agent", "Collect Earth Java Application"); + HttpResponse response = client.execute(request); + logger.info(event + " GA Logged - Response http " + response.getStatusLine().getStatusCode()); + } catch (URISyntaxException | IOException e) { + logger.error("Error generating URL for Analytics", e); + } + + } + }.start(); + + } +} From 53dcccc22bdc3493c5ed733068817b76be5cf0fa Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:11 +0100 Subject: [PATCH 0099/1620] New translations GAlogger.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 108 ++++++++---------- 1 file changed, 50 insertions(+), 58 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index dfaad035c3..c05160789c 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,58 +1,50 @@ -package org.openforis.collect.earth.app.model; - -import org.openforis.collect.earth.app.view.Messages; - -/** - * Enumeration of the aspects that Collect Earth can use to classify the plots. - * Each aspect has an ID attach to it and represents a 45 dregree range ( -22.5 to 22.5 for North, 22.5 to 67.5 to North East, 66.5 to 112.5 for East - * and so on) - * The enumeration also has an static method to calculate the - * - * @author Alfonso Sanchez-Paus Diaz - * - */ -public enum AspectCode { - N(Messages.getString("AspectCode.0"), 1), NE(Messages.getString("AspectCode.1"), 2), E(Messages.getString("AspectCode.2"), 3), SE(Messages.getString("AspectCode.3"), 4), S(Messages.getString("AspectCode.4"), 5), SW(Messages.getString("AspectCode.5"), 6), W(Messages.getString("AspectCode.6"), 7), NW(Messages.getString("AspectCode.7"), 8), NA( "NA", 9); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ - /** - * Utility method to get the aspect code ( N, N-E ... ) from the aspect in degrees - * - * @param aspect - * The aspect in degrees - * @return The aspect code corresponding to the aspect in degrees. - */ - public static AspectCode getAspectCode(Double aspect) { - double aspectProc = aspect + 22.5d; // North starts at -22.5, so add 22.5 to normalize so north becomes 0-45 , north east 45-90 and so on.. - if (aspectProc >= 360d) { - aspectProc = aspectProc - 360d; - } - final int modulo = (int) Math.floor(aspectProc / 45d); - return AspectCode.values()[modulo]; - } - - private String label; - - private int id; - - private AspectCode(String label, int id) { - this.label = label; - this.id = id; - } - - public int getId() { - return id; - } - - public String getLabel() { - return label; - } - - public void setId(int id) { - this.id = id; - } - - @Override - public String toString() { - return label; - } - -} +package org.openforis.collect.earth.app.logging; + +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; + +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.impl.client.HttpClientBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class GAlogger { + + private static final Logger logger = LoggerFactory.getLogger(GAlogger.class); + + public static void logGAnalytics(String event) { + new Thread("GA logging thread") { + + @Override + public void run() { + try { + String trackingId = "UA-55115982-1"; + HttpClient client = HttpClientBuilder.create().build(); + URIBuilder builder = new URIBuilder(); + builder.setScheme("http").setHost("www.google-analytics.com").setPath("/collect") + .addParameter("v", "1") // API Version. + .addParameter("tid", trackingId) // Tracking ID / Property ID. + // Anonymous Client Identifier. Ideally, this should be a UUID that + // is associated with particular user, device, or browser instance. + .addParameter("cid", "555").addParameter("t", "event") // Event hit type. + .addParameter("ec", "Collect Earth") // Event category. + .addParameter("ea", event); // Event action. + URI uri; + uri = builder.build(); + HttpGet request = new HttpGet(uri); + request.addHeader("user-agent", "Collect Earth Java Application"); + HttpResponse response = client.execute(request); + logger.info(event + " GA Logged - Response http " + response.getStatusLine().getStatusCode()); + } catch (URISyntaxException | IOException e) { + logger.error("Error generating URL for Analytics", e); + } + + } + }.start(); + + } +} From e7f5b0a5cdbe53db8be48c5c159e48b0f761078c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:12 +0100 Subject: [PATCH 0100/1620] New translations GAlogger.java (English) --- .../earth/app/view/Messages_en.properties | 341 +++--------------- 1 file changed, 50 insertions(+), 291 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 5b52f161d0..c05160789c 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,291 +1,50 @@ -package org.openforis.collect.earth.app.desktop; - -import java.io.File; -import java.io.IOException; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.ResultSet; -import java.sql.Statement; -import java.util.Map; -import java.util.Observable; -import java.util.Observer; - -import org.eclipse.jetty.server.Connector; -import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.server.ServerConnector; -import org.eclipse.jetty.util.thread.ExecutorThreadPool; -import org.eclipse.jetty.webapp.WebAppContext; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; -import org.openforis.collect.earth.app.service.BrowserService; -import org.openforis.collect.earth.app.service.FolderFinder; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.BeanCreationException; -import org.springframework.web.context.WebApplicationContext; -import org.springframework.web.context.support.WebApplicationContextUtils; - -import freemarker.template.TemplateException; - -/** - * Controls the Jetty server, starting and stopping it as well as reporting its staus. - * - * @author Alfonso Sanchez-Paus Diaz - * - */ -public class ServerController extends Observable { - - private static final String EARTH_SUBDOMAIN = "earth"; //$NON-NLS-1$ - - - public static final String SAIKU_RDB_SUFFIX = "Saiku"; //$NON-NLS-1$ - public static final String IPCC_RDB_SUFFIX = "Ipcc"; //$NON-NLS-1$ - - // Make sure that the default ports are the same for Server and Generator - private static final String DEFAULT_PORT = "80"; //$NON-NLS-1$ - - public enum ServerInitializationEvent{ - SERVER_STOPPED_EVENT("The Server has stopped"), - SERVER_STARTED_EVENT("The server started without problems"), - SERVER_STARTED_NO_DB_CONNECTION_EVENT("Collect Earth could not start due to a DB connection issue"), - SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT( "Collect Earth started but the PostgreSQL DB could not be reached (SQLite used instead until problems are fixed)"); - - private String message; - - private ServerInitializationEvent(String message) { - this.message = message; - } - - @Override - public String toString() { - return message; - } - - } - - private Server server; - private final Logger logger = LoggerFactory.getLogger(ServerController.class); - private WebAppContext root; - static LocalPropertiesService localPropertiesService; - - public WebApplicationContext getContext() { - WebApplicationContext webApplicationContext = null; - try { - webApplicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(getRoot().getServletContext()); - } catch (Exception e) { - logger.error("Error getting web application context", e); //$NON-NLS-1$ - } - return webApplicationContext; - } - - private static String getDbURL(final CollectDBDriver collectDBDriver) { - // jdbc:postgresql://hostname:port/dbname - - String url = collectDBDriver.getUrl(); - url = url.replace("REPLACE_HOSTNAME", localPropertiesService.getValue(EarthProperty.DB_HOST)); //$NON-NLS-1$ - url = url.replace("REPLACE_PORT", localPropertiesService.getValue(EarthProperty.DB_PORT)); //$NON-NLS-1$ - url = url.replace("REPLACE_DBNAME", localPropertiesService.getValue(EarthProperty.DB_NAME)); //$NON-NLS-1$ - return url; - } - - private int getPort() { - - String webPort = localPropertiesService.getLocalPort(); - if (webPort == null || webPort.isEmpty()) { - webPort = DEFAULT_PORT; - } - return Integer.parseInt(webPort); - } - - private WebAppContext getRoot() { - return root; - } - - private void setRoot(WebAppContext root) { - this.root = root; - } - - private boolean initilizeDataSources() throws IOException, TemplateException { - - CollectDBDriver collectDBDriver = localPropertiesService.getCollectDBDriver(); - boolean isConnectionTypeSwitched = false; - if(localPropertiesService.isUsingPostgreSqlDB() && !isPostgreSQLReachable(collectDBDriver) ){ - - logger.warn("Impossible to reach the PostgreSQL server at " + getDbURL(CollectDBDriver.POSTGRESQL)); - logger.warn("Using the SQLite version until fixed!"); - logger.error("Impossible to reach the PostgreSQL server at " + getDbURL(CollectDBDriver.POSTGRESQL) + " using SQLite version"); - collectDBDriver = CollectDBDriver.SQLITE; - isConnectionTypeSwitched = true; - } - - final File jettyAppCtxTemplateSrc = new File("resources/applicationContext.fmt"); //$NON-NLS-1$ - final File jettyAppCtxDst = new File(EarthConstants.GENERATED_FOLDER + "/applicationContext.xml"); //$NON-NLS-1$ - - jettyAppCtxDst.getParentFile().mkdirs(); - - final Map data = new java.util.HashMap<>(); - - data.put("driver", collectDBDriver.getDriverClass()); //$NON-NLS-1$ - data.put("url", getDbURL(collectDBDriver)); //$NON-NLS-1$ - data.put("urlSaiku", getSaikuDbURL(collectDBDriver)); //$NON-NLS-1$ - data.put("urlIpcc", getIpccDbURL(collectDBDriver)); //$NON-NLS-1$ - data.put("username", localPropertiesService.getValue(EarthProperty.DB_USERNAME)); //$NON-NLS-1$ - data.put("password", localPropertiesService.getValue(EarthProperty.DB_PASSWORD)); //$NON-NLS-1$ - data.put("collectEarthExecutionFolder", System.getProperty("user.dir") + File.separator); //$NON-NLS-1$ //$NON-NLS-2$ - - FreemarkerTemplateUtils.applyTemplate(jettyAppCtxTemplateSrc, jettyAppCtxDst, data); - - - return isConnectionTypeSwitched; - - } - - private boolean isPostgreSQLReachable(CollectDBDriver collectDBDriver) { - boolean connectionWorked = false; - try ( Connection connection = DriverManager.getConnection( - getDbURL(collectDBDriver), - localPropertiesService.getValue(EarthProperty.DB_USERNAME), - localPropertiesService.getValue(EarthProperty.DB_PASSWORD) - ) ){ - String query="select version()"; - try( Statement s = connection.createStatement() ){ - try( ResultSet rs=s.executeQuery(query) ){ - while(rs.next()) - { - logger.debug( "It works, there are " + rs.getString(1) + " rows on the ofc_record table"); - } - connectionWorked = true; - } - } - } - catch(Exception e){ - logger.error("Error while testing the connection to the postgresSQL DB", e); - } - - return connectionWorked; - - } - - public static String getSaikuDbURL(CollectDBDriver collectDBDriver) { - String urlSaikuDB = getDbURL(collectDBDriver); - - if (localPropertiesService.isUsingSqliteDB()) { - urlSaikuDB += EarthConstants.SAIKU_RDB_SUFFIX; - } - return urlSaikuDB; - } - - public static String getIpccDbURL(CollectDBDriver collectDBDriver) { - String urlIpccDB = getDbURL(collectDBDriver); - - if (localPropertiesService.isUsingSqliteDB()) { - urlIpccDB += IPCC_RDB_SUFFIX; - } - return urlIpccDB; - } - - public void startServer(Observer observeInitialization) throws Exception { - - localPropertiesService = new LocalPropertiesService(); - - this.addObserver(observeInitialization); - - boolean postgresConnectionSwitchedtoSqlite = initilizeDataSources(); - try { - - final String webappDirLocation = FolderFinder.getCollectEarthDataFolder(); - - // The port that we should run on can be set into an environment variable - // Look for that variable and default to 8080 if it isn't there. - - // For log4j 1.2 --> Moving to Log4J2 - //PropertyConfigurator.configure(this.getClass().getResource("/WEB-INF/conf/log4j.properties")); - - //server = new Server(new ExecutorThreadPool(10, 50, 5, TimeUnit.SECONDS)); // For JEtty 7 - //server = new Server(new ExecutorThreadPool(50, 50, 5, TimeUnit.MILLISECONDS) ); // For JEtty 9, different parameters for the constructor - server = new Server(new ExecutorThreadPool() ); // For JEtty 9.4, different parameters for the constructor - - // // Use blocking-IO connector to improve throughput - final ServerConnector connector = new ServerConnector(server); - connector.setName( LocalPropertiesService.LOCAL_HOST + ":" + getPort()); //$NON-NLS-1$ - connector.setHost("0.0.0.0"); //$NON-NLS-1$ - //connector.setHost( LocalPropertiesService.LOCAL_HOST ); - - connector.setPort(getPort()); - - connector.setStopTimeout(1000); - - server.setConnectors(new Connector[] { connector }); - - WebAppContext wweAppContext = new WebAppContext(); - setRoot(wweAppContext); - - getRoot().setContextPath("/" + EARTH_SUBDOMAIN); //$NON-NLS-1$ - - getRoot().setDescriptor(this.getClass().getResource("/WEB-INF/web.xml").toURI().toString()); //$NON-NLS-1$ - - getRoot().setResourceBase(webappDirLocation); - - // Parent loader priority is a class loader setting that Jetty accepts. - // By default Jetty will behave like most web containers in that it will - // allow your application to replace non-server libraries that are part of the container. - // Setting parent loader priority to true changes this behaviour. - // Read more here: - // http://wiki.eclipse.org/Jetty/Reference/Jetty_Classloading - getRoot().setParentLoaderPriority(true); - - server.setHandler(getRoot()); - server.setStopAtShutdown(true); - server.start(); - setChanged(); - - Object attribute = getRoot().getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); - if (attribute instanceof BeanCreationException) { - ( (BeanCreationException) attribute).printStackTrace(System.out); - logger.error("Error creating the database connection", attribute); //$NON-NLS-1$ - notifyObservers(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT); - } else { - if (postgresConnectionSwitchedtoSqlite){ - notifyObservers(ServerInitializationEvent.SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT); - }else{ - notifyObservers(ServerInitializationEvent.SERVER_STARTED_EVENT); - } - } - } catch (final IOException e) { - logger.error("Error initializing local properties", e); //$NON-NLS-1$ - } catch (Exception e) { - logger.error("Error staring the server", e); //$NON-NLS-1$ - } - - // Force the local properties to be loaded before the browserservice is instantiated!! DO NOT REMOVE - getContext().getBean(LocalPropertiesService.class); - this.addObserver(getContext().getBean(BrowserService.class)); - - } - - public void stopServer() throws Exception { - if (server != null && server.isRunning()) { - server.stop(); - setChanged(); - notifyObservers(ServerInitializationEvent.SERVER_STOPPED_EVENT); - } - } - - - public static String getHostAddress(String host, String port) { - String hostAndPort = ""; //$NON-NLS-1$ - if (host != null && host.length() > 0) { - hostAndPort = host; - if (port != null && port.length() > 0) { - hostAndPort += ":" + port; //$NON-NLS-1$ - } - - hostAndPort = "http://" + hostAndPort + "/" + EARTH_SUBDOMAIN + "/"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - return hostAndPort; - - } -} +package org.openforis.collect.earth.app.logging; + +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; + +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.impl.client.HttpClientBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class GAlogger { + + private static final Logger logger = LoggerFactory.getLogger(GAlogger.class); + + public static void logGAnalytics(String event) { + new Thread("GA logging thread") { + + @Override + public void run() { + try { + String trackingId = "UA-55115982-1"; + HttpClient client = HttpClientBuilder.create().build(); + URIBuilder builder = new URIBuilder(); + builder.setScheme("http").setHost("www.google-analytics.com").setPath("/collect") + .addParameter("v", "1") // API Version. + .addParameter("tid", trackingId) // Tracking ID / Property ID. + // Anonymous Client Identifier. Ideally, this should be a UUID that + // is associated with particular user, device, or browser instance. + .addParameter("cid", "555").addParameter("t", "event") // Event hit type. + .addParameter("ec", "Collect Earth") // Event category. + .addParameter("ea", event); // Event action. + URI uri; + uri = builder.build(); + HttpGet request = new HttpGet(uri); + request.addHeader("user-agent", "Collect Earth Java Application"); + HttpResponse response = client.execute(request); + logger.info(event + " GA Logged - Response http " + response.getStatusLine().getStatusCode()); + } catch (URISyntaxException | IOException e) { + logger.error("Error generating URL for Analytics", e); + } + + } + }.start(); + + } +} From 55c148312ccde5f7755e4d6e78a93e4d71975af5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:13 +0100 Subject: [PATCH 0101/1620] New translations JSwingAppender.java (French) --- .../earth/app/view/Messages_fr.properties | 144 ++++++++++++------ 1 file changed, 94 insertions(+), 50 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index c05160789c..9f9883c25f 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,50 +1,94 @@ -package org.openforis.collect.earth.app.logging; - -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; - -import org.apache.http.HttpResponse; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.impl.client.HttpClientBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class GAlogger { - - private static final Logger logger = LoggerFactory.getLogger(GAlogger.class); - - public static void logGAnalytics(String event) { - new Thread("GA logging thread") { - - @Override - public void run() { - try { - String trackingId = "UA-55115982-1"; - HttpClient client = HttpClientBuilder.create().build(); - URIBuilder builder = new URIBuilder(); - builder.setScheme("http").setHost("www.google-analytics.com").setPath("/collect") - .addParameter("v", "1") // API Version. - .addParameter("tid", trackingId) // Tracking ID / Property ID. - // Anonymous Client Identifier. Ideally, this should be a UUID that - // is associated with particular user, device, or browser instance. - .addParameter("cid", "555").addParameter("t", "event") // Event hit type. - .addParameter("ec", "Collect Earth") // Event category. - .addParameter("ea", event); // Event action. - URI uri; - uri = builder.build(); - HttpGet request = new HttpGet(uri); - request.addHeader("user-agent", "Collect Earth Java Application"); - HttpResponse response = client.execute(request); - logger.info(event + " GA Logged - Response http " + response.getStatusLine().getStatusCode()); - } catch (URISyntaxException | IOException e) { - logger.error("Error generating URL for Analytics", e); - } - - } - }.start(); - - } -} +package org.openforis.collect.earth.app.logging; + +import java.awt.Dimension; + +import javax.swing.JEditorPane; +import javax.swing.JOptionPane; +import javax.swing.JScrollPane; +import javax.swing.SwingUtilities; + +import org.apache.logging.log4j.core.Filter; +import org.apache.logging.log4j.core.Layout; +import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.core.appender.AbstractAppender; +import org.apache.logging.log4j.core.config.Property; +import org.apache.logging.log4j.core.config.plugins.Plugin; +import org.apache.logging.log4j.core.config.plugins.PluginAttribute; +import org.apache.logging.log4j.core.config.plugins.PluginElement; +import org.apache.logging.log4j.core.config.plugins.PluginFactory; +import org.apache.logging.log4j.core.layout.PatternLayout; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Plugin(name = "JSwingAppender", category = "Core", elementType = "appender", printObject = true) +public class JSwingAppender extends AbstractAppender { + + private Boolean showException; + + private Logger logger = LoggerFactory.getLogger( JSwingAppender.class ); + + public JSwingAppender(String name, Filter filter, Layout layout, boolean ignoreExceptions, Property[] properties) { + super(name, filter, layout, ignoreExceptions, properties); + } + + @PluginFactory + public static JSwingAppender createAppender(@PluginAttribute("name") String name, + @PluginElement("Layout") Layout layout, @PluginElement("Filters") Filter filter, + @PluginAttribute("ignoreExceptions") boolean ignoreExceptions) { + + if (name == null) { + LoggerFactory.getLogger( JSwingAppender.class ).error("No name provided for JTextAreaAppender"); + return null; + } + + if (layout == null) { + layout = PatternLayout.createDefaultLayout(); + } + return new JSwingAppender(name, filter, layout, ignoreExceptions, Property.EMPTY_ARRAY); + } + + @Override + public void append(LogEvent event) { + try { + if( isExceptionShown() ) { + final String message = new String(this.getLayout().toByteArray(event)).replaceAll("(\r\n|\n)", "
"); + + // Append formatted message to text area using the Thread. + + SwingUtilities.invokeLater( () -> { + try { + JEditorPane web = new JEditorPane(); + web.setEditable(false); + web.setContentType("text/html"); + web.setText(message); + + JScrollPane scrollPane = new JScrollPane(web); + scrollPane.setPreferredSize(new Dimension(450, 350)); + + JOptionPane.showMessageDialog(null, scrollPane, "Error has been loogged", JOptionPane.ERROR_MESSAGE); + }catch (Exception e) { + // Avoid creating an infinite loop by catching this exception and not logging it as error + logger.debug("Error shown exception", e); + } + } ); + } + } catch (final Exception e) { + // ignore case when the platform hasn't yet been initialized + logger.debug("Error shown exception", e); + } + + } + + private boolean isExceptionShown() { + if( showException == null ) { + LocalPropertiesService localPropertiesService = new LocalPropertiesService(); + showException = localPropertiesService.isExceptionShown(); + } + return showException; + } + + public void setExceptionShown(Boolean showException) { + this.showException = showException; + } +} \ No newline at end of file From 0140206a8c8205d5b3f23f75dcaadf2fa8896499 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:14 +0100 Subject: [PATCH 0102/1620] New translations JSwingAppender.java (Spanish) --- .../earth/app/view/Messages_es.properties | 144 ++++++++++++------ 1 file changed, 94 insertions(+), 50 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index c05160789c..9f9883c25f 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,50 +1,94 @@ -package org.openforis.collect.earth.app.logging; - -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; - -import org.apache.http.HttpResponse; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.impl.client.HttpClientBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class GAlogger { - - private static final Logger logger = LoggerFactory.getLogger(GAlogger.class); - - public static void logGAnalytics(String event) { - new Thread("GA logging thread") { - - @Override - public void run() { - try { - String trackingId = "UA-55115982-1"; - HttpClient client = HttpClientBuilder.create().build(); - URIBuilder builder = new URIBuilder(); - builder.setScheme("http").setHost("www.google-analytics.com").setPath("/collect") - .addParameter("v", "1") // API Version. - .addParameter("tid", trackingId) // Tracking ID / Property ID. - // Anonymous Client Identifier. Ideally, this should be a UUID that - // is associated with particular user, device, or browser instance. - .addParameter("cid", "555").addParameter("t", "event") // Event hit type. - .addParameter("ec", "Collect Earth") // Event category. - .addParameter("ea", event); // Event action. - URI uri; - uri = builder.build(); - HttpGet request = new HttpGet(uri); - request.addHeader("user-agent", "Collect Earth Java Application"); - HttpResponse response = client.execute(request); - logger.info(event + " GA Logged - Response http " + response.getStatusLine().getStatusCode()); - } catch (URISyntaxException | IOException e) { - logger.error("Error generating URL for Analytics", e); - } - - } - }.start(); - - } -} +package org.openforis.collect.earth.app.logging; + +import java.awt.Dimension; + +import javax.swing.JEditorPane; +import javax.swing.JOptionPane; +import javax.swing.JScrollPane; +import javax.swing.SwingUtilities; + +import org.apache.logging.log4j.core.Filter; +import org.apache.logging.log4j.core.Layout; +import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.core.appender.AbstractAppender; +import org.apache.logging.log4j.core.config.Property; +import org.apache.logging.log4j.core.config.plugins.Plugin; +import org.apache.logging.log4j.core.config.plugins.PluginAttribute; +import org.apache.logging.log4j.core.config.plugins.PluginElement; +import org.apache.logging.log4j.core.config.plugins.PluginFactory; +import org.apache.logging.log4j.core.layout.PatternLayout; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Plugin(name = "JSwingAppender", category = "Core", elementType = "appender", printObject = true) +public class JSwingAppender extends AbstractAppender { + + private Boolean showException; + + private Logger logger = LoggerFactory.getLogger( JSwingAppender.class ); + + public JSwingAppender(String name, Filter filter, Layout layout, boolean ignoreExceptions, Property[] properties) { + super(name, filter, layout, ignoreExceptions, properties); + } + + @PluginFactory + public static JSwingAppender createAppender(@PluginAttribute("name") String name, + @PluginElement("Layout") Layout layout, @PluginElement("Filters") Filter filter, + @PluginAttribute("ignoreExceptions") boolean ignoreExceptions) { + + if (name == null) { + LoggerFactory.getLogger( JSwingAppender.class ).error("No name provided for JTextAreaAppender"); + return null; + } + + if (layout == null) { + layout = PatternLayout.createDefaultLayout(); + } + return new JSwingAppender(name, filter, layout, ignoreExceptions, Property.EMPTY_ARRAY); + } + + @Override + public void append(LogEvent event) { + try { + if( isExceptionShown() ) { + final String message = new String(this.getLayout().toByteArray(event)).replaceAll("(\r\n|\n)", "
"); + + // Append formatted message to text area using the Thread. + + SwingUtilities.invokeLater( () -> { + try { + JEditorPane web = new JEditorPane(); + web.setEditable(false); + web.setContentType("text/html"); + web.setText(message); + + JScrollPane scrollPane = new JScrollPane(web); + scrollPane.setPreferredSize(new Dimension(450, 350)); + + JOptionPane.showMessageDialog(null, scrollPane, "Error has been loogged", JOptionPane.ERROR_MESSAGE); + }catch (Exception e) { + // Avoid creating an infinite loop by catching this exception and not logging it as error + logger.debug("Error shown exception", e); + } + } ); + } + } catch (final Exception e) { + // ignore case when the platform hasn't yet been initialized + logger.debug("Error shown exception", e); + } + + } + + private boolean isExceptionShown() { + if( showException == null ) { + LocalPropertiesService localPropertiesService = new LocalPropertiesService(); + showException = localPropertiesService.isExceptionShown(); + } + return showException; + } + + public void setExceptionShown(Boolean showException) { + this.showException = showException; + } +} \ No newline at end of file From d202d0c628cd42e4a2a41c3f3394b2d784c4fe49 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:16 +0100 Subject: [PATCH 0103/1620] New translations JSwingAppender.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 144 ++++++++++++------ 1 file changed, 94 insertions(+), 50 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index c05160789c..9f9883c25f 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,50 +1,94 @@ -package org.openforis.collect.earth.app.logging; - -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; - -import org.apache.http.HttpResponse; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.impl.client.HttpClientBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class GAlogger { - - private static final Logger logger = LoggerFactory.getLogger(GAlogger.class); - - public static void logGAnalytics(String event) { - new Thread("GA logging thread") { - - @Override - public void run() { - try { - String trackingId = "UA-55115982-1"; - HttpClient client = HttpClientBuilder.create().build(); - URIBuilder builder = new URIBuilder(); - builder.setScheme("http").setHost("www.google-analytics.com").setPath("/collect") - .addParameter("v", "1") // API Version. - .addParameter("tid", trackingId) // Tracking ID / Property ID. - // Anonymous Client Identifier. Ideally, this should be a UUID that - // is associated with particular user, device, or browser instance. - .addParameter("cid", "555").addParameter("t", "event") // Event hit type. - .addParameter("ec", "Collect Earth") // Event category. - .addParameter("ea", event); // Event action. - URI uri; - uri = builder.build(); - HttpGet request = new HttpGet(uri); - request.addHeader("user-agent", "Collect Earth Java Application"); - HttpResponse response = client.execute(request); - logger.info(event + " GA Logged - Response http " + response.getStatusLine().getStatusCode()); - } catch (URISyntaxException | IOException e) { - logger.error("Error generating URL for Analytics", e); - } - - } - }.start(); - - } -} +package org.openforis.collect.earth.app.logging; + +import java.awt.Dimension; + +import javax.swing.JEditorPane; +import javax.swing.JOptionPane; +import javax.swing.JScrollPane; +import javax.swing.SwingUtilities; + +import org.apache.logging.log4j.core.Filter; +import org.apache.logging.log4j.core.Layout; +import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.core.appender.AbstractAppender; +import org.apache.logging.log4j.core.config.Property; +import org.apache.logging.log4j.core.config.plugins.Plugin; +import org.apache.logging.log4j.core.config.plugins.PluginAttribute; +import org.apache.logging.log4j.core.config.plugins.PluginElement; +import org.apache.logging.log4j.core.config.plugins.PluginFactory; +import org.apache.logging.log4j.core.layout.PatternLayout; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Plugin(name = "JSwingAppender", category = "Core", elementType = "appender", printObject = true) +public class JSwingAppender extends AbstractAppender { + + private Boolean showException; + + private Logger logger = LoggerFactory.getLogger( JSwingAppender.class ); + + public JSwingAppender(String name, Filter filter, Layout layout, boolean ignoreExceptions, Property[] properties) { + super(name, filter, layout, ignoreExceptions, properties); + } + + @PluginFactory + public static JSwingAppender createAppender(@PluginAttribute("name") String name, + @PluginElement("Layout") Layout layout, @PluginElement("Filters") Filter filter, + @PluginAttribute("ignoreExceptions") boolean ignoreExceptions) { + + if (name == null) { + LoggerFactory.getLogger( JSwingAppender.class ).error("No name provided for JTextAreaAppender"); + return null; + } + + if (layout == null) { + layout = PatternLayout.createDefaultLayout(); + } + return new JSwingAppender(name, filter, layout, ignoreExceptions, Property.EMPTY_ARRAY); + } + + @Override + public void append(LogEvent event) { + try { + if( isExceptionShown() ) { + final String message = new String(this.getLayout().toByteArray(event)).replaceAll("(\r\n|\n)", "
"); + + // Append formatted message to text area using the Thread. + + SwingUtilities.invokeLater( () -> { + try { + JEditorPane web = new JEditorPane(); + web.setEditable(false); + web.setContentType("text/html"); + web.setText(message); + + JScrollPane scrollPane = new JScrollPane(web); + scrollPane.setPreferredSize(new Dimension(450, 350)); + + JOptionPane.showMessageDialog(null, scrollPane, "Error has been loogged", JOptionPane.ERROR_MESSAGE); + }catch (Exception e) { + // Avoid creating an infinite loop by catching this exception and not logging it as error + logger.debug("Error shown exception", e); + } + } ); + } + } catch (final Exception e) { + // ignore case when the platform hasn't yet been initialized + logger.debug("Error shown exception", e); + } + + } + + private boolean isExceptionShown() { + if( showException == null ) { + LocalPropertiesService localPropertiesService = new LocalPropertiesService(); + showException = localPropertiesService.isExceptionShown(); + } + return showException; + } + + public void setExceptionShown(Boolean showException) { + this.showException = showException; + } +} \ No newline at end of file From 722be76ff7ec31340bc3042ec098d0d0c175228d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:17 +0100 Subject: [PATCH 0104/1620] New translations JSwingAppender.java (English) --- .../earth/app/view/Messages_en.properties | 144 ++++++++++++------ 1 file changed, 94 insertions(+), 50 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index c05160789c..9f9883c25f 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,50 +1,94 @@ -package org.openforis.collect.earth.app.logging; - -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; - -import org.apache.http.HttpResponse; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.impl.client.HttpClientBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class GAlogger { - - private static final Logger logger = LoggerFactory.getLogger(GAlogger.class); - - public static void logGAnalytics(String event) { - new Thread("GA logging thread") { - - @Override - public void run() { - try { - String trackingId = "UA-55115982-1"; - HttpClient client = HttpClientBuilder.create().build(); - URIBuilder builder = new URIBuilder(); - builder.setScheme("http").setHost("www.google-analytics.com").setPath("/collect") - .addParameter("v", "1") // API Version. - .addParameter("tid", trackingId) // Tracking ID / Property ID. - // Anonymous Client Identifier. Ideally, this should be a UUID that - // is associated with particular user, device, or browser instance. - .addParameter("cid", "555").addParameter("t", "event") // Event hit type. - .addParameter("ec", "Collect Earth") // Event category. - .addParameter("ea", event); // Event action. - URI uri; - uri = builder.build(); - HttpGet request = new HttpGet(uri); - request.addHeader("user-agent", "Collect Earth Java Application"); - HttpResponse response = client.execute(request); - logger.info(event + " GA Logged - Response http " + response.getStatusLine().getStatusCode()); - } catch (URISyntaxException | IOException e) { - logger.error("Error generating URL for Analytics", e); - } - - } - }.start(); - - } -} +package org.openforis.collect.earth.app.logging; + +import java.awt.Dimension; + +import javax.swing.JEditorPane; +import javax.swing.JOptionPane; +import javax.swing.JScrollPane; +import javax.swing.SwingUtilities; + +import org.apache.logging.log4j.core.Filter; +import org.apache.logging.log4j.core.Layout; +import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.core.appender.AbstractAppender; +import org.apache.logging.log4j.core.config.Property; +import org.apache.logging.log4j.core.config.plugins.Plugin; +import org.apache.logging.log4j.core.config.plugins.PluginAttribute; +import org.apache.logging.log4j.core.config.plugins.PluginElement; +import org.apache.logging.log4j.core.config.plugins.PluginFactory; +import org.apache.logging.log4j.core.layout.PatternLayout; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Plugin(name = "JSwingAppender", category = "Core", elementType = "appender", printObject = true) +public class JSwingAppender extends AbstractAppender { + + private Boolean showException; + + private Logger logger = LoggerFactory.getLogger( JSwingAppender.class ); + + public JSwingAppender(String name, Filter filter, Layout layout, boolean ignoreExceptions, Property[] properties) { + super(name, filter, layout, ignoreExceptions, properties); + } + + @PluginFactory + public static JSwingAppender createAppender(@PluginAttribute("name") String name, + @PluginElement("Layout") Layout layout, @PluginElement("Filters") Filter filter, + @PluginAttribute("ignoreExceptions") boolean ignoreExceptions) { + + if (name == null) { + LoggerFactory.getLogger( JSwingAppender.class ).error("No name provided for JTextAreaAppender"); + return null; + } + + if (layout == null) { + layout = PatternLayout.createDefaultLayout(); + } + return new JSwingAppender(name, filter, layout, ignoreExceptions, Property.EMPTY_ARRAY); + } + + @Override + public void append(LogEvent event) { + try { + if( isExceptionShown() ) { + final String message = new String(this.getLayout().toByteArray(event)).replaceAll("(\r\n|\n)", "
"); + + // Append formatted message to text area using the Thread. + + SwingUtilities.invokeLater( () -> { + try { + JEditorPane web = new JEditorPane(); + web.setEditable(false); + web.setContentType("text/html"); + web.setText(message); + + JScrollPane scrollPane = new JScrollPane(web); + scrollPane.setPreferredSize(new Dimension(450, 350)); + + JOptionPane.showMessageDialog(null, scrollPane, "Error has been loogged", JOptionPane.ERROR_MESSAGE); + }catch (Exception e) { + // Avoid creating an infinite loop by catching this exception and not logging it as error + logger.debug("Error shown exception", e); + } + } ); + } + } catch (final Exception e) { + // ignore case when the platform hasn't yet been initialized + logger.debug("Error shown exception", e); + } + + } + + private boolean isExceptionShown() { + if( showException == null ) { + LocalPropertiesService localPropertiesService = new LocalPropertiesService(); + showException = localPropertiesService.isExceptionShown(); + } + return showException; + } + + public void setExceptionShown(Boolean showException) { + this.showException = showException; + } +} \ No newline at end of file From 1f43328bcf926e7494312572457d7aa28fdec29a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:18 +0100 Subject: [PATCH 0105/1620] New translations AspectCode.java (French) --- .../earth/app/view/Messages_fr.properties | 128 +++++++----------- 1 file changed, 46 insertions(+), 82 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 9f9883c25f..dfaad035c3 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,94 +1,58 @@ -package org.openforis.collect.earth.app.logging; - -import java.awt.Dimension; - -import javax.swing.JEditorPane; -import javax.swing.JOptionPane; -import javax.swing.JScrollPane; -import javax.swing.SwingUtilities; - -import org.apache.logging.log4j.core.Filter; -import org.apache.logging.log4j.core.Layout; -import org.apache.logging.log4j.core.LogEvent; -import org.apache.logging.log4j.core.appender.AbstractAppender; -import org.apache.logging.log4j.core.config.Property; -import org.apache.logging.log4j.core.config.plugins.Plugin; -import org.apache.logging.log4j.core.config.plugins.PluginAttribute; -import org.apache.logging.log4j.core.config.plugins.PluginElement; -import org.apache.logging.log4j.core.config.plugins.PluginFactory; -import org.apache.logging.log4j.core.layout.PatternLayout; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -@Plugin(name = "JSwingAppender", category = "Core", elementType = "appender", printObject = true) -public class JSwingAppender extends AbstractAppender { - - private Boolean showException; - - private Logger logger = LoggerFactory.getLogger( JSwingAppender.class ); - - public JSwingAppender(String name, Filter filter, Layout layout, boolean ignoreExceptions, Property[] properties) { - super(name, filter, layout, ignoreExceptions, properties); - } - - @PluginFactory - public static JSwingAppender createAppender(@PluginAttribute("name") String name, - @PluginElement("Layout") Layout layout, @PluginElement("Filters") Filter filter, - @PluginAttribute("ignoreExceptions") boolean ignoreExceptions) { - - if (name == null) { - LoggerFactory.getLogger( JSwingAppender.class ).error("No name provided for JTextAreaAppender"); - return null; +package org.openforis.collect.earth.app.model; + +import org.openforis.collect.earth.app.view.Messages; + +/** + * Enumeration of the aspects that Collect Earth can use to classify the plots. + * Each aspect has an ID attach to it and represents a 45 dregree range ( -22.5 to 22.5 for North, 22.5 to 67.5 to North East, 66.5 to 112.5 for East + * and so on) + * The enumeration also has an static method to calculate the + * + * @author Alfonso Sanchez-Paus Diaz + * + */ +public enum AspectCode { + N(Messages.getString("AspectCode.0"), 1), NE(Messages.getString("AspectCode.1"), 2), E(Messages.getString("AspectCode.2"), 3), SE(Messages.getString("AspectCode.3"), 4), S(Messages.getString("AspectCode.4"), 5), SW(Messages.getString("AspectCode.5"), 6), W(Messages.getString("AspectCode.6"), 7), NW(Messages.getString("AspectCode.7"), 8), NA( "NA", 9); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ + /** + * Utility method to get the aspect code ( N, N-E ... ) from the aspect in degrees + * + * @param aspect + * The aspect in degrees + * @return The aspect code corresponding to the aspect in degrees. + */ + public static AspectCode getAspectCode(Double aspect) { + double aspectProc = aspect + 22.5d; // North starts at -22.5, so add 22.5 to normalize so north becomes 0-45 , north east 45-90 and so on.. + if (aspectProc >= 360d) { + aspectProc = aspectProc - 360d; } - - if (layout == null) { - layout = PatternLayout.createDefaultLayout(); - } - return new JSwingAppender(name, filter, layout, ignoreExceptions, Property.EMPTY_ARRAY); + final int modulo = (int) Math.floor(aspectProc / 45d); + return AspectCode.values()[modulo]; } - @Override - public void append(LogEvent event) { - try { - if( isExceptionShown() ) { - final String message = new String(this.getLayout().toByteArray(event)).replaceAll("(\r\n|\n)", "
"); + private String label; - // Append formatted message to text area using the Thread. + private int id; - SwingUtilities.invokeLater( () -> { - try { - JEditorPane web = new JEditorPane(); - web.setEditable(false); - web.setContentType("text/html"); - web.setText(message); - - JScrollPane scrollPane = new JScrollPane(web); - scrollPane.setPreferredSize(new Dimension(450, 350)); + private AspectCode(String label, int id) { + this.label = label; + this.id = id; + } - JOptionPane.showMessageDialog(null, scrollPane, "Error has been loogged", JOptionPane.ERROR_MESSAGE); - }catch (Exception e) { - // Avoid creating an infinite loop by catching this exception and not logging it as error - logger.debug("Error shown exception", e); - } - } ); - } - } catch (final Exception e) { - // ignore case when the platform hasn't yet been initialized - logger.debug("Error shown exception", e); - } + public int getId() { + return id; + } + public String getLabel() { + return label; } - private boolean isExceptionShown() { - if( showException == null ) { - LocalPropertiesService localPropertiesService = new LocalPropertiesService(); - showException = localPropertiesService.isExceptionShown(); - } - return showException; + public void setId(int id) { + this.id = id; } - public void setExceptionShown(Boolean showException) { - this.showException = showException; + @Override + public String toString() { + return label; } -} \ No newline at end of file + +} From 7198d21c388a16a3cf1fd5a00fa90217d6de1b1d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:19 +0100 Subject: [PATCH 0106/1620] New translations AspectCode.java (Spanish) --- .../earth/app/view/Messages_es.properties | 128 +++++++----------- 1 file changed, 46 insertions(+), 82 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 9f9883c25f..dfaad035c3 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,94 +1,58 @@ -package org.openforis.collect.earth.app.logging; - -import java.awt.Dimension; - -import javax.swing.JEditorPane; -import javax.swing.JOptionPane; -import javax.swing.JScrollPane; -import javax.swing.SwingUtilities; - -import org.apache.logging.log4j.core.Filter; -import org.apache.logging.log4j.core.Layout; -import org.apache.logging.log4j.core.LogEvent; -import org.apache.logging.log4j.core.appender.AbstractAppender; -import org.apache.logging.log4j.core.config.Property; -import org.apache.logging.log4j.core.config.plugins.Plugin; -import org.apache.logging.log4j.core.config.plugins.PluginAttribute; -import org.apache.logging.log4j.core.config.plugins.PluginElement; -import org.apache.logging.log4j.core.config.plugins.PluginFactory; -import org.apache.logging.log4j.core.layout.PatternLayout; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -@Plugin(name = "JSwingAppender", category = "Core", elementType = "appender", printObject = true) -public class JSwingAppender extends AbstractAppender { - - private Boolean showException; - - private Logger logger = LoggerFactory.getLogger( JSwingAppender.class ); - - public JSwingAppender(String name, Filter filter, Layout layout, boolean ignoreExceptions, Property[] properties) { - super(name, filter, layout, ignoreExceptions, properties); - } - - @PluginFactory - public static JSwingAppender createAppender(@PluginAttribute("name") String name, - @PluginElement("Layout") Layout layout, @PluginElement("Filters") Filter filter, - @PluginAttribute("ignoreExceptions") boolean ignoreExceptions) { - - if (name == null) { - LoggerFactory.getLogger( JSwingAppender.class ).error("No name provided for JTextAreaAppender"); - return null; +package org.openforis.collect.earth.app.model; + +import org.openforis.collect.earth.app.view.Messages; + +/** + * Enumeration of the aspects that Collect Earth can use to classify the plots. + * Each aspect has an ID attach to it and represents a 45 dregree range ( -22.5 to 22.5 for North, 22.5 to 67.5 to North East, 66.5 to 112.5 for East + * and so on) + * The enumeration also has an static method to calculate the + * + * @author Alfonso Sanchez-Paus Diaz + * + */ +public enum AspectCode { + N(Messages.getString("AspectCode.0"), 1), NE(Messages.getString("AspectCode.1"), 2), E(Messages.getString("AspectCode.2"), 3), SE(Messages.getString("AspectCode.3"), 4), S(Messages.getString("AspectCode.4"), 5), SW(Messages.getString("AspectCode.5"), 6), W(Messages.getString("AspectCode.6"), 7), NW(Messages.getString("AspectCode.7"), 8), NA( "NA", 9); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ + /** + * Utility method to get the aspect code ( N, N-E ... ) from the aspect in degrees + * + * @param aspect + * The aspect in degrees + * @return The aspect code corresponding to the aspect in degrees. + */ + public static AspectCode getAspectCode(Double aspect) { + double aspectProc = aspect + 22.5d; // North starts at -22.5, so add 22.5 to normalize so north becomes 0-45 , north east 45-90 and so on.. + if (aspectProc >= 360d) { + aspectProc = aspectProc - 360d; } - - if (layout == null) { - layout = PatternLayout.createDefaultLayout(); - } - return new JSwingAppender(name, filter, layout, ignoreExceptions, Property.EMPTY_ARRAY); + final int modulo = (int) Math.floor(aspectProc / 45d); + return AspectCode.values()[modulo]; } - @Override - public void append(LogEvent event) { - try { - if( isExceptionShown() ) { - final String message = new String(this.getLayout().toByteArray(event)).replaceAll("(\r\n|\n)", "
"); + private String label; - // Append formatted message to text area using the Thread. + private int id; - SwingUtilities.invokeLater( () -> { - try { - JEditorPane web = new JEditorPane(); - web.setEditable(false); - web.setContentType("text/html"); - web.setText(message); - - JScrollPane scrollPane = new JScrollPane(web); - scrollPane.setPreferredSize(new Dimension(450, 350)); + private AspectCode(String label, int id) { + this.label = label; + this.id = id; + } - JOptionPane.showMessageDialog(null, scrollPane, "Error has been loogged", JOptionPane.ERROR_MESSAGE); - }catch (Exception e) { - // Avoid creating an infinite loop by catching this exception and not logging it as error - logger.debug("Error shown exception", e); - } - } ); - } - } catch (final Exception e) { - // ignore case when the platform hasn't yet been initialized - logger.debug("Error shown exception", e); - } + public int getId() { + return id; + } + public String getLabel() { + return label; } - private boolean isExceptionShown() { - if( showException == null ) { - LocalPropertiesService localPropertiesService = new LocalPropertiesService(); - showException = localPropertiesService.isExceptionShown(); - } - return showException; + public void setId(int id) { + this.id = id; } - public void setExceptionShown(Boolean showException) { - this.showException = showException; + @Override + public String toString() { + return label; } -} \ No newline at end of file + +} From 47e332c4d8f32cc0f50bc004bb8bcbf5aa2afcf5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:21 +0100 Subject: [PATCH 0107/1620] New translations PlacemarkBrowserServlet.java (English) --- .../earth/app/view/Messages_en.properties | 405 +++++++++++++++--- 1 file changed, 336 insertions(+), 69 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 9f9883c25f..de96e18020 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,94 +1,361 @@ -package org.openforis.collect.earth.app.logging; - -import java.awt.Dimension; - -import javax.swing.JEditorPane; -import javax.swing.JOptionPane; -import javax.swing.JScrollPane; -import javax.swing.SwingUtilities; - -import org.apache.logging.log4j.core.Filter; -import org.apache.logging.log4j.core.Layout; -import org.apache.logging.log4j.core.LogEvent; -import org.apache.logging.log4j.core.appender.AbstractAppender; -import org.apache.logging.log4j.core.config.Property; -import org.apache.logging.log4j.core.config.plugins.Plugin; -import org.apache.logging.log4j.core.config.plugins.PluginAttribute; -import org.apache.logging.log4j.core.config.plugins.PluginElement; -import org.apache.logging.log4j.core.config.plugins.PluginFactory; -import org.apache.logging.log4j.core.layout.PatternLayout; +package org.openforis.collect.earth.app.server; + +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.openforis.collect.earth.app.service.BrowserService; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.KmlGeneratorService; import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; +import org.openforis.collect.earth.sampler.processor.KmlGenerator; +import org.openforis.collect.earth.sampler.utils.KmlGenerationException; +import org.openforis.idm.metamodel.AttributeDefinition; +import org.opengis.referencing.operation.TransformException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; -@Plugin(name = "JSwingAppender", category = "Core", elementType = "appender", printObject = true) -public class JSwingAppender extends AbstractAppender { +import com.opencsv.CSVReader; - private Boolean showException; +/** + * Servlet to return the information that is stored in Collect Earth for one + * placemark (plot) + * + * @author Alfonso Sanchez-Paus Diaz + * + */ +@Controller +public class PlacemarkBrowserServlet { + @Autowired + private BrowserService browserService; - private Logger logger = LoggerFactory.getLogger( JSwingAppender.class ); + @Autowired + private EarthSurveyService earthSurveyService; - public JSwingAppender(String name, Filter filter, Layout layout, boolean ignoreExceptions, Property[] properties) { - super(name, filter, layout, ignoreExceptions, properties); - } + @Autowired + private LocalPropertiesService localPropertiesService; + + @Autowired + private KmlGeneratorService kmlGeneratorService; + + private KmlGenerator kmlGenerator; + + private SimplePlacemarkObject lastPlacemark = null; - @PluginFactory - public static JSwingAppender createAppender(@PluginAttribute("name") String name, - @PluginElement("Layout") Layout layout, @PluginElement("Filters") Filter filter, - @PluginAttribute("ignoreExceptions") boolean ignoreExceptions) { + private final Logger logger = LoggerFactory.getLogger( PlacemarkBrowserServlet.class ); - if (name == null) { - LoggerFactory.getLogger( JSwingAppender.class ).error("No name provided for JTextAreaAppender"); - return null; + private final class OpenBrowserThread extends Thread { + + private SimplePlacemarkObject placemarkObject; + + private OpenBrowserThread(String name, SimplePlacemarkObject placemarkObject) { + super(name); + this.placemarkObject = placemarkObject; } - if (layout == null) { - layout = PatternLayout.createDefaultLayout(); + @Override + public void run() { + // If this is the first plot or the plot is the last one that + // was opened + if (lastPlacemark == null + || !lastPlacemark.equals( placemarkObject ) ) { + + try { + kmlGenerator.fillSamplePoints(placemarkObject); + + kmlGenerator.fillExternalLine(placemarkObject); + + openGEEAppWindow(placemarkObject); + + openGEECodeEditorWindow(placemarkObject); + + openEarthMapWindow( placemarkObject ); + + openTimeLapseWindow(placemarkObject); + + openBingMapsWindow(placemarkObject); + + openBaiduMapsWindow(placemarkObject); + + openYandexMapsWindow(placemarkObject); + + openExtraMapWindow(placemarkObject); + + openStreetViewWindow(placemarkObject); + + openPlanetMapsWindow(placemarkObject); + + openSecureWatchWindow(placemarkObject); + + } catch (TransformException|KmlGenerationException e) { + logger.error("Error generating polygon", e ); + } + } + + lastPlacemark = placemarkObject; + } - return new JSwingAppender(name, filter, layout, ignoreExceptions, Property.EMPTY_ARRAY); - } - @Override - public void append(LogEvent event) { - try { - if( isExceptionShown() ) { - final String message = new String(this.getLayout().toByteArray(event)).replaceAll("(\r\n|\n)", "
"); - // Append formatted message to text area using the Thread. + public void openEarthMapWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Earth Map window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openEarthMapURL(placemarkObject); + } catch (final Exception e) { + logger.error("Exception opening Earth Map window", e); //$NON-NLS-1$ + } + } + }.start(); + } - SwingUtilities.invokeLater( () -> { + public void openGEECodeEditorWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open GEE Playground window") { //$NON-NLS-1$ + @Override + public void run() { try { - JEditorPane web = new JEditorPane(); - web.setEditable(false); - web.setContentType("text/html"); - web.setText(message); - - JScrollPane scrollPane = new JScrollPane(web); - scrollPane.setPreferredSize(new Dimension(450, 350)); - - JOptionPane.showMessageDialog(null, scrollPane, "Error has been loogged", JOptionPane.ERROR_MESSAGE); - }catch (Exception e) { - // Avoid creating an infinite loop by catching this exception and not logging it as error - logger.debug("Error shown exception", e); + browserService.openGEECodeEditor(placemarkObject); + } catch (final Exception e) { + logger.error("Exception opening Earth Engine Playground window", e); //$NON-NLS-1$ } - } ); - } - } catch (final Exception e) { - // ignore case when the platform hasn't yet been initialized - logger.debug("Error shown exception", e); + } + }.start(); + } + + public void openGEEAppWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open GEE APP window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openGEEAppURL(placemarkObject); + } catch (final Exception e) { + logger.error("Exception opening Earth Engine APP window", e); //$NON-NLS-1$ + } + } + }.start(); + } + + public void openBingMapsWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Bing Maps window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openBingMaps(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Bing Maps window", e); //$NON-NLS-1$ + } + } + }.start(); + } + + + public void openPlanetMapsWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Planet Maps window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openPlanetMaps(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Planet Maps window", e); //$NON-NLS-1$ + } + } + }.start(); + } + + public void openSecureWatchWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open SecureWatch window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openSecureWatch(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening SecureWatch window", e); //$NON-NLS-1$ + } + } + }.start(); + } + + public void openBaiduMapsWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Baidu Maps window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openBaiduMaps(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Baidu Maps window", e); //$NON-NLS-1$ + + } + } + + }.start(); + } + + public void openYandexMapsWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Yandex Maps window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openYandexMaps(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Yandex Maps window", e); //$NON-NLS-1$ + + } + } + + }.start(); } + public void openExtraMapWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Expa Map window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openExtraMap(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Extra Map window", e); //$NON-NLS-1$ + + } + } + + }.start(); + } + + public void openStreetViewWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Street View window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openStreetView(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Street View window", e); //$NON-NLS-1$ + + } + } + + }.start(); + } + + public void openTimeLapseWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open TimeLapse window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openTimelapse(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Earth Engine window", e); //$NON-NLS-1$ + + } + } + + }.start(); + } + + } + + + /* + * Opens the extra browser windows for Earth Engine, Timelapse and Bing. (non-Javadoc) + * + * @see + * org.openforis.collect.earth.app.server.JsonPocessorServlet#processRequest + * (javax.servlet.http.HttpServletRequest, + * javax.servlet.http.HttpServletResponse) + */ + @GetMapping(path = "/openAuxiliaryWindows") + public void openAuxiliaryWindows( + HttpServletResponse response, + @RequestParam(value = "latLongCoordinates", required = false) final String latLongCoordinates) + { + try { + SimplePlacemarkObject placemarkObject = new SimplePlacemarkObject(latLongCoordinates.split(",") ); + OpenBrowserThread browserThread = new OpenBrowserThread("Open auxiliary windows " + latLongCoordinates, placemarkObject); + browserThread.start(); + } catch (Exception e) { + logger.error("Error loading browsers " , e); + } } - private boolean isExceptionShown() { - if( showException == null ) { - LocalPropertiesService localPropertiesService = new LocalPropertiesService(); - showException = localPropertiesService.isExceptionShown(); + @GetMapping(path = "/ancillaryWindows") + public void openAuxiliaryWindowsNew(HttpServletResponse response, HttpServletRequest request) { + + + List keyAttributeDefinitions = earthSurveyService + .getRootEntityDefinition() + .getKeyAttributeDefinitions(); + + // the keys should the the parameter names + Map keys = request.getParameterMap(); + + String[] keysInOrder = new String[keys.size()]; + for (int i = 0; i < keyAttributeDefinitions.size(); i++) { + keysInOrder[i] = keys.get(keyAttributeDefinitions.get(i).getName())[0]; + } + + try { + kmlGenerator = kmlGeneratorService.getKmlGenerator(); + + String[] csvValues = getValuesFromCsv(keysInOrder); + + if( csvValues == null ){ + throw new IllegalArgumentException("The keys " + keys.toString() + " are not present on the CSV file with the plot locations!!!"); + } + + SimplePlacemarkObject placemarkObject = kmlGenerator.getPlotObject(csvValues, null, earthSurveyService.getCollectSurvey() ); + OpenBrowserThread browserThread = new OpenBrowserThread("Open ancillary windows - polygon ", placemarkObject ); + browserThread.start(); + } catch (Exception e) { + logger.error("Error loading browsers " , e); } - return showException; + } - public void setExceptionShown(Boolean showException) { - this.showException = showException; + private String[] getValuesFromCsv(String[] keysInOrder) { + + final String csvFile = localPropertiesService.getCsvFile(); + try ( + CSVReader reader = CsvReaderUtils.getCsvReader( csvFile ); + ){ + + + String[] csvRow; + int numberOfKeys = keysInOrder.length; + while ((csvRow = reader.readNext()) != null) { + boolean foundIt = true; + for( int idx=0; idx Date: Tue, 29 Nov 2022 12:23:22 +0100 Subject: [PATCH 0108/1620] New translations PlacemarkDataController.java (French) --- .../earth/app/view/Messages_fr.properties | 79 ++++++++----------- 1 file changed, 33 insertions(+), 46 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index dfaad035c3..fcb3cec51d 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,58 +1,45 @@ -package org.openforis.collect.earth.app.model; +package org.openforis.collect.earth.app.server; -import org.openforis.collect.earth.app.view.Messages; +import java.io.IOException; + +import javax.servlet.http.HttpServletResponse; + +import org.openforis.collect.earth.app.logging.GAlogger; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; /** - * Enumeration of the aspects that Collect Earth can use to classify the plots. - * Each aspect has an ID attach to it and represents a 45 dregree range ( -22.5 to 22.5 for North, 22.5 to 67.5 to North East, 66.5 to 112.5 for East - * and so on) - * The enumeration also has an static method to calculate the - * + * Controller to load and store the information that is stored in Collect Earth for one placemark (plot) + * * @author Alfonso Sanchez-Paus Diaz - * + * @author S. Ricci + * */ -public enum AspectCode { - N(Messages.getString("AspectCode.0"), 1), NE(Messages.getString("AspectCode.1"), 2), E(Messages.getString("AspectCode.2"), 3), SE(Messages.getString("AspectCode.3"), 4), S(Messages.getString("AspectCode.4"), 5), SW(Messages.getString("AspectCode.5"), 6), W(Messages.getString("AspectCode.6"), 7), NW(Messages.getString("AspectCode.7"), 8), NA( "NA", 9); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ - /** - * Utility method to get the aspect code ( N, N-E ... ) from the aspect in degrees - * - * @param aspect - * The aspect in degrees - * @return The aspect code corresponding to the aspect in degrees. - */ - public static AspectCode getAspectCode(Double aspect) { - double aspectProc = aspect + 22.5d; // North starts at -22.5, so add 22.5 to normalize so north becomes 0-45 , north east 45-90 and so on.. - if (aspectProc >= 360d) { - aspectProc = aspectProc - 360d; +@Controller +public class PlacemarkDataController extends AbstractPlacemarkDataController { + @Override + @GetMapping(value="/placemark-info-expanded") + public void placemarkInfoExpanded(@RequestParam("id") String placemarkId, HttpServletResponse response) throws IOException { + try{ + super.placemarkInfoExpanded(placemarkId, response); + }catch(Exception e){ + logger.error("Error saving data" , e); } - final int modulo = (int) Math.floor(aspectProc / 45d); - return AspectCode.values()[modulo]; - } - - private String label; - - private int id; - - private AspectCode(String label, int id) { - this.label = label; - this.id = id; - } - - public int getId() { - return id; - } - - public String getLabel() { - return label; - } - - public void setId(int id) { - this.id = id; } @Override - public String toString() { - return label; + @PostMapping(value="/save-data-expanded") + public void saveDataExpanded(PlacemarkUpdateRequest updateRequest, HttpServletResponse response) throws IOException { + try{ + super.saveDataExpanded(updateRequest, response); + if( updateRequest.getValues().get("collect_boolean_actively_saved").equals("true")) { + GAlogger.logGAnalytics("Plot saved"); + } + }catch(Exception e){ + logger.error("Error saving data" , e); + } } } From 2c547376e157f53c94917a3469728a6a9a3f4532 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:23 +0100 Subject: [PATCH 0109/1620] New translations BrowserNotFoundException.java (Spanish) --- .../earth/app/view/Messages_es.properties | 58 +++++-------------- 1 file changed, 14 insertions(+), 44 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index dfaad035c3..6570688ad6 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,58 +1,28 @@ -package org.openforis.collect.earth.app.model; - -import org.openforis.collect.earth.app.view.Messages; - -/** - * Enumeration of the aspects that Collect Earth can use to classify the plots. - * Each aspect has an ID attach to it and represents a 45 dregree range ( -22.5 to 22.5 for North, 22.5 to 67.5 to North East, 66.5 to 112.5 for East - * and so on) - * The enumeration also has an static method to calculate the - * - * @author Alfonso Sanchez-Paus Diaz - * - */ -public enum AspectCode { - N(Messages.getString("AspectCode.0"), 1), NE(Messages.getString("AspectCode.1"), 2), E(Messages.getString("AspectCode.2"), 3), SE(Messages.getString("AspectCode.3"), 4), S(Messages.getString("AspectCode.4"), 5), SW(Messages.getString("AspectCode.5"), 6), W(Messages.getString("AspectCode.6"), 7), NW(Messages.getString("AspectCode.7"), 8), NA( "NA", 9); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ +package org.openforis.collect.earth.app.service; + +public class BrowserNotFoundException extends Exception{ + /** - * Utility method to get the aspect code ( N, N-E ... ) from the aspect in degrees * - * @param aspect - * The aspect in degrees - * @return The aspect code corresponding to the aspect in degrees. */ - public static AspectCode getAspectCode(Double aspect) { - double aspectProc = aspect + 22.5d; // North starts at -22.5, so add 22.5 to normalize so north becomes 0-45 , north east 45-90 and so on.. - if (aspectProc >= 360d) { - aspectProc = aspectProc - 360d; - } - final int modulo = (int) Math.floor(aspectProc / 45d); - return AspectCode.values()[modulo]; - } + private static final long serialVersionUID = -404938492481063378L; - private String label; - - private int id; - - private AspectCode(String label, int id) { - this.label = label; - this.id = id; + public BrowserNotFoundException() { + super(); } - public int getId() { - return id; - } - public String getLabel() { - return label; + public BrowserNotFoundException(String message, Throwable cause) { + super(message, cause); } - public void setId(int id) { - this.id = id; + public BrowserNotFoundException(String message) { + super(message); } - @Override - public String toString() { - return label; + public BrowserNotFoundException(Throwable cause) { + super(cause); } + } From f64dd7c41bb41da7f499a2368c0029bfe47917f4 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:24 +0100 Subject: [PATCH 0110/1620] New translations AnalysisSaikuService.java (French) --- .../earth/app/view/Messages_fr.properties | 756 +++++++++++++++++- 1 file changed, 721 insertions(+), 35 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index fcb3cec51d..cba7f5812d 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,45 +1,731 @@ -package org.openforis.collect.earth.app.server; +package org.openforis.collect.earth.app.service; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; -import javax.servlet.http.HttpServletResponse; - -import org.openforis.collect.earth.app.logging.GAlogger; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestParam; - -/** - * Controller to load and store the information that is stored in Collect Earth for one placemark (plot) - * - * @author Alfonso Sanchez-Paus Diaz - * @author S. Ricci - * - */ -@Controller -public class PlacemarkDataController extends AbstractPlacemarkDataController { - @Override - @GetMapping(value="/placemark-info-expanded") - public void placemarkInfoExpanded(@RequestParam("id") String placemarkId, HttpServletResponse response) throws IOException { - try{ - super.placemarkInfoExpanded(placemarkId, response); - }catch(Exception e){ - logger.error("Error saving data" , e); +import javax.swing.SwingUtilities; + +import org.apache.commons.lang3.SystemUtils; +import org.apache.commons.text.StringEscapeUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; +import org.openforis.collect.earth.app.ad_hoc.AluToolUtils; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.model.AspectCode; +import org.openforis.collect.earth.app.model.DynamicsCode; +import org.openforis.collect.earth.app.model.SlopeCode; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; +import org.openforis.collect.model.CollectSurvey; +import org.openforis.collect.relational.CollectRDBPublisher; +import org.openforis.collect.relational.CollectRdbException; +import org.openforis.concurrency.Progress; +import org.openforis.idm.metamodel.NodeDefinition; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Component; + +import com.opencsv.CSVReader; + +import freemarker.template.TemplateException; + +@Component +public class AnalysisSaikuService extends GenerateDatabase implements DisposableBean{ + + private static final String PLOT_ADD = "plot ADD "; + + private static final String UPDATE = "UPDATE "; + + private static final String UNKNOWN = "Unknown"; + + private static final String VARCHAR_5 = " VARCHAR(5)"; + + private static final String INTEGER = " INTEGER"; + + private static final String ALTER_TABLE = "ALTER TABLE "; + + private static final String INSERT_INTO = "INSERT INTO "; + + private static final String CREATE_TABLE = "CREATE TABLE "; + + private static final String ALU_CLIMATE_ZONE_CODE = "alu_climate_zone_code"; //$NON-NLS-1$ + + private static final String ALU_SOIL_TYPE_CODE = "alu_soil_type_code"; //$NON-NLS-1$ + + private static final String ALU_SUBCLASS_CODE = "alu_subclass_code"; //$NON-NLS-1$ + + private static final String DYNAMICS_ID = "dynamics_id"; //$NON-NLS-1$ + + private static final String ELEVATION_ID = "elevation_id"; //$NON-NLS-1$ + + private static final String SLOPE_ID = "slope_id"; //$NON-NLS-1$ + + private static final String ASPECT_ID = "aspect_id"; //$NON-NLS-1$ + + private static final String START_SAIKU = "start-saiku"; //$NON-NLS-1$ + + private static final String STOP_SAIKU = "stop-saiku"; //$NON-NLS-1$ + + private static final String COMMAND_SUFFIX_BAT = ".bat"; //$NON-NLS-1$ + + private static final String COMMAND_SUFFIX_SH = ".sh"; //$NON-NLS-1$ + + public static final String COLLECT_EARTH_DATABASE_RDB_DB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + + EarthConstants.SAIKU_RDB_SUFFIX; + + + @Autowired + RDBExporter rdbExporter; + + @Autowired + CollectRDBPublisher collectRDBPublisher; + + @Autowired + EarthSurveyService earthSurveyService; + + @Autowired + public LocalPropertiesService localPropertiesService; + + @Autowired + BrowserService browserService; + + @Autowired + private RegionCalculationUtils regionCalculation; + + @Autowired + private SchemaService schemaNamingService; + + private static final int ELEVATION_RANGE = 100; + + private RemoteWebDriver saikuWebDriver; + + private static final String SQLITE_FREEMARKER_HTML_TEMPLATE = "resources" + File.separator //$NON-NLS-1$ + + "collectEarthSqliteDS.fmt"; //$NON-NLS-1$ + private static final String POSTGRESQL_FREEMARKER_HTML_TEMPLATE = "resources" + File.separator //$NON-NLS-1$ + + "collectEarthPostgreSqlDS.fmt"; //$NON-NLS-1$ + public static final String MDX_XML = "collectEarthCubes.xml"; //$NON-NLS-1$ + private static final String MDX_TEMPLATE = MDX_XML + ".fmt"; //$NON-NLS-1$ + + private boolean saikuStarted; + + private void assignDimensionValues() { + try { + final String schemaName = getSchemaPrefix(); + // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id + final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query( + "SELECT " + EarthConstants.PLOT_ID + ", elevation, slope, aspect FROM " + schemaName + "plot", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + new RowMapper() { + @Override + public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { + + final Object[] updateValues = new Object[4]; + + Integer aspect = AspectCode.NA.getId(); + if (AspectCode.getAspectCode(rs.getDouble("aspect")) != null) { //$NON-NLS-1$ + aspect = AspectCode.getAspectCode(rs.getDouble("aspect")).getId(); //$NON-NLS-1$ + } + + Integer slope = SlopeCode.NA.getId(); + + if (SlopeCode.getSlopeCode((int) rs.getFloat("slope")) != null) { //$NON-NLS-1$ + slope = SlopeCode.getSlopeCode((int) rs.getFloat("slope")).getId(); //$NON-NLS-1$ + } + + updateValues[0] = aspect; + updateValues[1] = slope; + updateValues[2] = ( (int) rs.getFloat("elevation") / ELEVATION_RANGE) + 1; // 0 //$NON-NLS-1$ + + updateValues[3] = rs.getLong(EarthConstants.PLOT_ID); + return updateValues; + } + + }); + + rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + ASPECT_ID + "=?," + SLOPE_ID + "=?," //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + ELEVATION_ID + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (Exception e) { + logger.warn("No DEM information", e); //$NON-NLS-1$ } } - @Override - @PostMapping(value="/save-data-expanded") - public void saveDataExpanded(PlacemarkUpdateRequest updateRequest, HttpServletResponse response) throws IOException { - try{ - super.saveDataExpanded(updateRequest, response); - if( updateRequest.getValues().get("collect_boolean_actively_saved").equals("true")) { - GAlogger.logGAnalytics("Plot saved"); + private String getSchemaPrefix() { + return schemaNamingService.getSchemaPrefix(ExportType.SAIKU); + } + + private void assignPngAluToolDimensionValues() { + try { + if (earthSurveyService.getCollectSurvey().getName().toLowerCase().contains("png")) { //$NON-NLS-1$ + final String schemaName = getSchemaPrefix(); + // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id + final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query("SELECT " + EarthConstants.PLOT_ID //$NON-NLS-1$ + + ", elevation, soil_fundamental, land_use_subcategory, precipitation_ranges FROM " + schemaName //$NON-NLS-1$ + + "plot LEFT JOIN " + schemaName + "precipitation_ranges_code where " //$NON-NLS-1$ //$NON-NLS-2$ + + "plot.annual_precipitation_code_id=precipitation_ranges_code.precipitation_ranges_code_id", //$NON-NLS-1$ + new RowMapper() { + @Override + public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { + + final Object[] updateValues = new Object[3]; + + try { + AluToolUtils aluToolUtils = new AluToolUtils(); + + Integer elevation = rs.getInt("elevation"); //$NON-NLS-1$ + String soilFundamental = rs.getString("soil_fundamental"); //$NON-NLS-1$ + String precipitationRange = rs.getString("precipitation_ranges"); //$NON-NLS-1$ + + int precipitation = -1; + String climateZone = UNKNOWN; //$NON-NLS-1$ + if (precipitationRange != null) { + precipitation = aluToolUtils.getPrecipitationFromRange(precipitationRange); + boolean shortDrySeason = true; // According to information from Abe PNG has less + // than 5 months of dry season + climateZone = aluToolUtils.getClimateZone(elevation, precipitation, + shortDrySeason); + } + + String soilType = UNKNOWN; //$NON-NLS-1$ + if (soilFundamental != null) { + soilType = aluToolUtils.getSoilType(soilFundamental); + } + + updateValues[0] = climateZone; + updateValues[1] = soilType; + updateValues[2] = rs.getLong(EarthConstants.PLOT_ID); + } catch (Exception e) { + logger.error("Error while processing the data", e); //$NON-NLS-1$ + updateValues[0] = UNKNOWN; //$NON-NLS-1$ + updateValues[1] = UNKNOWN; //$NON-NLS-1$ + updateValues[2] = UNKNOWN; //$NON-NLS-1$ + } + return updateValues; + } + + }); + + rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + ALU_CLIMATE_ZONE_CODE + "=?," //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + ALU_SOIL_TYPE_CODE + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ //$NON-NLS-2$ + } + } catch (Exception e) { + logger.error("No PNG ALU information", e); //$NON-NLS-1$ + } + } + + private void assignLUCDimensionValues() { + try { + final String schemaName = getSchemaPrefix(); + // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id + final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query( + "SELECT " + EarthConstants.PLOT_ID + ", land_use_subcategory FROM " + schemaName + "plot", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + new RowMapper() { + @Override + public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { + + AluToolUtils aluToolUtils = new AluToolUtils(); + final Object[] updateValues = new Object[3]; + + String collectEarthSubcategory = rs.getString("land_use_subcategory"); //$NON-NLS-1$ + Integer dynamics = DynamicsCode.getDynamicsCode(collectEarthSubcategory); + String subClass = UNKNOWN; //$NON-NLS-1$ + if (collectEarthSubcategory != null) { + subClass = aluToolUtils.getAluSubclass(collectEarthSubcategory); + } + + updateValues[0] = dynamics; + updateValues[1] = subClass; + updateValues[2] = rs.getLong(EarthConstants.PLOT_ID); + return updateValues; + } + + }); + + rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + DYNAMICS_ID + "=?," + ALU_SUBCLASS_CODE //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ + } catch (Exception e) { + logger.warn("No PNG Alu information available", e); //$NON-NLS-1$ + } + } + + private void createAspectAuxTable() { + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "aspect_category (" + ASPECT_ID //$NON-NLS-1$ //$NON-NLS-2$ + + " INTEGER PRIMARY KEY, aspect_caption TEXT);"); //$NON-NLS-1$ + final AspectCode[] aspects = AspectCode.values(); + for (final AspectCode aspectCode : aspects) { + rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "aspect_category values (" + aspectCode.getId() + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + aspectCode.getLabel() + "')"); //$NON-NLS-1$ + } + } + + private void createElevationtAuxTable() { + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "elevation_category ( " + ELEVATION_ID //$NON-NLS-1$ //$NON-NLS-2$ + + " INTEGER PRIMARY KEY, elevation_caption TEXT);"); //$NON-NLS-1$ + final int slots = 9000 / ELEVATION_RANGE; // Highest mountain in the world, mount everest is + // 8820m high + for (int i = 1; i <= slots; i++) { + rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "elevation_category values (" + i + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + ((i - 1) * ELEVATION_RANGE) + "-" + i //$NON-NLS-1$ + * ELEVATION_RANGE + + "')"); //$NON-NLS-1$ + } + + } + + private void createDynamicsAuxTable() { + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "dynamics_category (" + DYNAMICS_ID //$NON-NLS-1$ //$NON-NLS-2$ + + " INTEGER PRIMARY KEY, dynamics_caption TEXT);"); //$NON-NLS-1$ + final DynamicsCode[] dynamicsCodes = DynamicsCode.values(); + for (final DynamicsCode dynamicsCode : dynamicsCodes) { + rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "dynamics_category values (" + dynamicsCode.getId() //$NON-NLS-1$ //$NON-NLS-2$ + + ", '" + dynamicsCode.getLabel() + "')"); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + + private void createPlotForeignKeys() { + // Add aspect_id column to plot + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ASPECT_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + SLOPE_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ELEVATION_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + DYNAMICS_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + + private void createPngAluVariables() { + if (earthSurveyService.getCollectSurvey().getName().toLowerCase().contains("png")) { //$NON-NLS-1$ + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_SOIL_TYPE_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_CLIMATE_ZONE_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + } + + private void creatAluSubclassVariables() { + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_SUBCLASS_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + + private void createSlopeAuxTable() { + final String schemaName = getSchemaPrefix(); + // Slope can be from 0 to 90 + rdbExporter.getJdbcTemplate().execute( + CREATE_TABLE + schemaName + "slope_category (slope_id INTEGER PRIMARY KEY, slope_caption TEXT);"); //$NON-NLS-1$ //$NON-NLS-2$ + final SlopeCode[] slopeCodes = SlopeCode.values(); + for (final SlopeCode slopeCode : slopeCodes) { + rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "slope_category values (" + slopeCode.getId() + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + slopeCode.getLabel() + "')"); //$NON-NLS-1$ + } + } + + private String getSaikuConfigurationFilePath() { + + String configFile = localPropertiesService.getSaikuFolder() + "/" //$NON-NLS-1$ + + "tomcat/webapps/saiku/WEB-INF/classes/saiku-datasources/collectEarthDS"; //$NON-NLS-1$ + configFile = configFile.replace('/', File.separatorChar); + return configFile; + } + + private String getSaikuThreeConfigurationFilePath() { + + String configFile = localPropertiesService.getSaikuFolder() + "/" //$NON-NLS-1$ + + "tomcat/webapps/saiku/WEB-INF/classes/legacy-datasources/collectEarthDS"; //$NON-NLS-1$ + configFile = configFile.replace('/', File.separatorChar); + return configFile; + } + + private boolean isSaikuConfigured() { + return localPropertiesService.getSaikuFolder() != null + && isSaikuFolder(new File(localPropertiesService.getSaikuFolder())); + } + + /* + * private boolean isJavaHomeConfigured() { + * + * if (SystemUtils.IS_OS_MAC){ return true; } return ! ( StringUtils.isBlank( + * System.getenv("JAVA_HOME") ) //$NON-NLS-1$ && StringUtils.isBlank( + * System.getenv("JRE_HOME") ) //$NON-NLS-1$ && StringUtils.isBlank( + * System.getenv("COLLECT_EARTH_JRE_HOME") ) //$NON-NLS-1$ ); } + */ + + public boolean isSaikuFolder(File saikuFolder) { + boolean isSaikuFolder = false; + if (saikuFolder.listFiles() != null) { + for (final File file : saikuFolder.listFiles()) { + if (file.getName().equals(START_SAIKU + getCommandSuffix())) { + isSaikuFolder = true; + } } - }catch(Exception e){ - logger.error("Error saving data" , e); } + return isSaikuFolder; + } + + private void openSaiku() throws BrowserNotFoundException { + saikuWebDriver = browserService.navigateTo("http://127.0.0.1:8181", saikuWebDriver, false); //$NON-NLS-1$ + if (browserService.waitFor("username", saikuWebDriver)) { //$NON-NLS-1$ + saikuWebDriver.findElementByName("username").sendKeys("admin"); //$NON-NLS-1$ //$NON-NLS-2$ + saikuWebDriver.findElementByName("password").sendKeys("admin"); //$NON-NLS-1$ //$NON-NLS-2$ + saikuWebDriver.findElementByClassName("form_button").click(); //$NON-NLS-1$ + } + } + + + public void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws SaikuExecutionException { + + try { + + stopSaiku(); + + try { + + if ((localPropertiesService.isUsingSqliteDB() && !getZippedProjectDB( ExportType.SAIKU ).exists()) + || isRefreshDatabase()) { + + // The user clicked on the option to refresh the database, or there is no + // previous copy of the Saiku DB + // Generate the DB file + rdbExporter.exportDataToRDB( + earthSurveyService.getCollectSurvey(), + ExportType.SAIKU, + progressListener, + this::processQuantityData + ); + + try { + // Save the DB file in a zipped file to extends GenerateDatabase keep for the next usages + replaceZippedProjectDB( ExportType.SAIKU ); + } catch (Exception e) { + logger.error("Error while refreshing the Zipped content of the project Saiku DB", e); + } + + } else if (getZippedProjectDB(ExportType.SAIKU).exists() && localPropertiesService.isUsingSqliteDB()) { + // If the zipped version of the project exists ( and the user clicked on the + // option to not refresh it) then restore this last version of the data + restoreZippedProjectDB(ExportType.SAIKU); + } + + refreshDataSourceForSaiku(); + + if (startSaikuAfterDBExport && !isUserCancelledOperation()) { + startSaiku(); + new Thread("Opening Saiku") { + @Override + public void run() { + try { + AnalysisSaikuService.this.openSaiku(); + } catch (BrowserNotFoundException e) { + logger.error("No browser has been set up", e); //$NON-NLS-1$ + } + }; + }.start(); + + stopSaikuOnExit(); + } + } catch (final IOException e) { + logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ + } catch (TemplateException e1) { + logger.error("Error while applying the freemarker template tothe Saiku data source", e1); //$NON-NLS-1$ + } + + } catch (final CollectRdbException e) { + logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ + } + } + + private void processQuantityData(InfiniteProgressMonitor progressListener) { + + SwingUtilities.invokeLater( () -> progressListener.setMessage("Preparing Saiku data for analysis") ); + + progressListener.progressMade(new Progress(0, 100)); + createPngAluVariables(); + createPlotForeignKeys(); + + progressListener.progressMade(new Progress(25, 100)); + + if (!surveyContains("calculated_elevation_range", earthSurveyService.getCollectSurvey())) { + createAspectAuxTable(); + createSlopeAuxTable(); + createElevationtAuxTable(); + assignDimensionValues(); + + } + progressListener.progressMade(new Progress(50, 100)); + + if (!surveyContains("calculated_initial_land_use", earthSurveyService.getCollectSurvey())) { + createDynamicsAuxTable(); + creatAluSubclassVariables(); + assignLUCDimensionValues(); + + } + progressListener.progressMade(new Progress(75, 100)); + + assignPngAluToolDimensionValues(); + + SwingUtilities.invokeLater( () -> progressListener.setMessage("Calculating expansion factors") ); + + regionCalculation.handleRegionCalculation( ExportType.SAIKU, rdbExporter.getJdbcTemplate() ); + progressListener.progressMade(new Progress(100, 100)); + + } + + public static boolean surveyContains(String nodeName, CollectSurvey survey) { + NodeDefinition nodeDefForNAme = survey.getSchema().findNodeDefinition( nodeDef -> nodeDef.getName().equals(nodeName) ); + return nodeDefForNAme != null; + } + + public static CSVReader getCsvReader(String csvFile) throws FileNotFoundException { + final BufferedReader bufferedReader = new BufferedReader( + new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 ) ); //$NON-NLS-1$ + return new CSVReader(bufferedReader); + } + + private void refreshDataSourceForSaiku() throws IOException, TemplateException { + final File mdxFile = new File(localPropertiesService.getProjectFolder() + File.separatorChar + MDX_XML); + + Map data = new HashMap<>(); + data.put("cubeFilePath", StringEscapeUtils.escapeJava(mdxFile.getAbsolutePath().replace('\\', '/'))); //$NON-NLS-1$ + + final File mdxTemplate = getMdxTemplate(); + final File dataSourceTemplate = getDataSourceTemplate(data); + + // First try Saiku 2.5/2.6 + File dataSourceFile; + try { + dataSourceFile = new File(getSaikuConfigurationFilePath()); + FreemarkerTemplateUtils.applyTemplate(dataSourceTemplate, dataSourceFile, data); + } catch (Exception e) { + logger.error("Error starting Saiku", e); + dataSourceFile = new File(getSaikuThreeConfigurationFilePath()); + FreemarkerTemplateUtils.applyTemplate(dataSourceTemplate, dataSourceFile, data); + } + + setMdxSaikuSchema(mdxTemplate, mdxFile); + } + + private File getMdxTemplate() throws IOException { + final File mdxFileTemplate = new File( + localPropertiesService.getProjectFolder() + File.separatorChar + MDX_TEMPLATE); + if (!mdxFileTemplate.exists()) { + throw new IOException( + "The file containing the MDX Cube definition Template does not exist in expected location " //$NON-NLS-1$ + + mdxFileTemplate.getAbsolutePath()); + } + return mdxFileTemplate; + } + + private File getDataSourceTemplate(Map data) throws IOException { + File dataSourceTemplate = null; + + if (localPropertiesService.isUsingSqliteDB()) { + dataSourceTemplate = new File(SQLITE_FREEMARKER_HTML_TEMPLATE); + final File rdbDb = rdbExporter.getRdbFile( ExportType.SAIKU ); + if (!rdbDb.exists()) { + throw new IOException( + "The file contianing the Relational SQLite Database does not exist in expected location " //$NON-NLS-1$ + + rdbDb.getAbsolutePath()); + } + data.put("rdbFilePath", StringEscapeUtils.escapeJava(rdbDb.getAbsolutePath().replace('\\', '/'))); //$NON-NLS-1$ + } else { + dataSourceTemplate = new File(POSTGRESQL_FREEMARKER_HTML_TEMPLATE); + CollectDBDriver collectDBDriver = localPropertiesService.getCollectDBDriver(); + data.put("dbUrl", StringEscapeUtils.escapeJava(ServerController.getSaikuDbURL(collectDBDriver))); //$NON-NLS-1$ + data.put("username", //$NON-NLS-1$ + StringEscapeUtils.escapeJava(localPropertiesService.getValue(EarthProperty.DB_USERNAME))); + data.put("password", //$NON-NLS-1$ + StringEscapeUtils.escapeJava(localPropertiesService.getValue(EarthProperty.DB_PASSWORD))); + } + + if (!dataSourceTemplate.exists()) { + throw new IOException( + "The file containing the Saiku Data Source template does not exist in expected location " //$NON-NLS-1$ + + dataSourceTemplate.getAbsolutePath()); + } + + return dataSourceTemplate; + } + + private void setMdxSaikuSchema(final File mdxFileTemplate, final File mdxFile) + throws IOException, TemplateException { + Map saikuData = new HashMap<>(); + String saikuSchemaName = getSchemaName(); + if (saikuSchemaName == null) { + saikuSchemaName = ""; //$NON-NLS-1$ + } + saikuData.put("saikuDbSchema", saikuSchemaName); //$NON-NLS-1$ + FreemarkerTemplateUtils.applyTemplate(mdxFileTemplate, mdxFile, saikuData); + } + + private void runSaikuBat(String commandName) throws SaikuExecutionException { + if (!isSaikuConfigured()) { + throw new SaikuExecutionException("The Saiku server is not configured."); //$NON-NLS-1$ + } + + else { + String saikuCmd = localPropertiesService.getSaikuFolder() + File.separator + commandName + + getCommandSuffix(); + + if (SystemUtils.IS_OS_WINDOWS) { + saikuCmd = "\"" + saikuCmd + "\""; //$NON-NLS-1$ //$NON-NLS-2$ + } + + try { + + Process runSaiku = runProcessBuilder(new String[] { saikuCmd }); + + if (commandName.equals(STOP_SAIKU)) { + int result = runSaiku.waitFor(); + logger.warn("Script ended with result {}", result); //$NON-NLS-1$ + } else if (commandName.equals(START_SAIKU)) { + Thread.sleep(6000); + } + + } catch (final IOException e) { + logger.error("Error when running Saiku start/stop command", e); //$NON-NLS-1$ + } catch (InterruptedException e) { + logger.error("Error while waiting to start", e); //$NON-NLS-1$ + Thread.currentThread().interrupt(); + } + } + } + + private void setMacJreHome(ProcessBuilder p) { + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX || SystemUtils.IS_OS_LINUX) { + + File javaFolder = new File("./java"); + + if (!javaFolder.exists()) { + String userName = System.getProperty("user.name"); + String testWithPath = "/Users/" + userName + "/OpenForis/CollectEarth/java"; + File testJavaPath = new File(testWithPath); + if (testJavaPath.exists()) { + javaFolder = testJavaPath; + } + } + + Map environment = p.environment(); + environment.put("COLLECT_EARTH_JRE_HOME", javaFolder.getAbsolutePath()); + + /* + * // In MAC the environment variable COLLECT_EARTH_JRE_HOME is not accesible + * from outside the bash, set it again! if( SystemUtils.IS_OS_MAC || + * SystemUtils.IS_OS_MAC_OSX){ try { File javaFolder = new File("./java"); + * + * if( !javaFolder.exists() ){ String userName = + * System.getProperty("user.name"); String testWithPath = "/Users/"+userName + + * "/OpenForis/CollectEarth/java"; File testJavaPath = new File(testWithPath); + * if( testJavaPath.exists()){ javaFolder = testJavaPath; } } + * + * Process setEnv = runProcessBuilder(new String[] { "/bin/bash", "setenv", + * "COLLECT_EARTH_JRE_HOME=\""+ javaFolder.getAbsolutePath() +"\"" }); + * setEnv.waitFor(); } catch (final IOException e) { + * logger.error("Error setting the COLLECT_EARTH_JRE_HOME environment variable", + * e); //$NON-NLS-1$ } catch (InterruptedException e) { + * logger.error("Error when running COLLECT_EARTH_JRE_HOME environment variable" + * , e); //$NON-NLS-1$ } } + */ + } + } + + private Process runProcessBuilder(String[] cmd) throws IOException { + final ProcessBuilder builder = new ProcessBuilder(cmd); + + // Fixes bug with Mac OS X not using the environemnt variable set for bash + setMacJreHome(builder); + + builder.directory(new File(localPropertiesService.getSaikuFolder()).getAbsoluteFile()); + builder.redirectErrorStream(true); + Process p = builder.start(); + (new ProcessLoggerThread(p.getInputStream(), Boolean.FALSE)).start(); + (new ProcessLoggerThread(p.getErrorStream(), Boolean.TRUE)).start(); + return p; + } + + private String getCommandSuffix() { + if (SystemUtils.IS_OS_WINDOWS) { + return COMMAND_SUFFIX_BAT; + } else { + return COMMAND_SUFFIX_SH; + } + } + + private void startSaiku() throws SaikuExecutionException { + logger.warn( + "Starting the Saiku server {}{}{}", localPropertiesService.getSaikuFolder(), File.separator, START_SAIKU); //$NON-NLS-1$ + + runSaikuBat(START_SAIKU); + + this.setSaikuStarted(true); + + logger.warn("Finished starting the Saiku server"); //$NON-NLS-1$ + } + + void stopSaiku() throws SaikuExecutionException { + logger.warn("Stoping the Saiku server {}{}{}", localPropertiesService.getSaikuFolder() , File.separator , STOP_SAIKU); //$NON-NLS-1$ + if (isSaikuStarted()) { + runSaikuBat(STOP_SAIKU); + this.setSaikuStarted(true); + } + logger.warn("Finished stoping the Saiku server"); //$NON-NLS-1$ + } + + private void stopSaikuOnExit() { + Runtime.getRuntime().addShutdownHook(new Thread("Shutting down Saiku on exit hook") { + @Override + public void run() { + try { + if (isSaikuStarted()) { + stopSaiku(); + } + } catch (final SaikuExecutionException e) { + logger.error("The Saiku server has been de-configured after it was started", e); //$NON-NLS-1$ + } + } + + }); + } + + private boolean isSaikuStarted() { + return saikuStarted; + } + + private void setSaikuStarted(boolean saikuStarted) { + this.saikuStarted = saikuStarted; + } + + @Override + public void destroy() throws Exception { + try { + stopSaiku(); + } catch (SaikuExecutionException e) { + logger.error("Error while trying to quite Saiku before destroying the bean", e); //$NON-NLS-1$ + } + } + + @Override + public LocalPropertiesService getLocalPropertiesService() { + return localPropertiesService; + } + + @Override + public EarthSurveyService getEarthSurveyService() { + return earthSurveyService; + } + + @Override + public RDBExporter getRdbExporter() { + return rdbExporter; } -} +} \ No newline at end of file From a44ea05e970225037730a39be6526f8b9675c7f5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:25 +0100 Subject: [PATCH 0111/1620] New translations AnalysisSaikuService.java (Spanish) --- .../earth/app/view/Messages_es.properties | 729 +++++++++++++++++- 1 file changed, 716 insertions(+), 13 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 6570688ad6..cba7f5812d 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,28 +1,731 @@ package org.openforis.collect.earth.app.service; -public class BrowserNotFoundException extends Exception{ +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; - /** - * +import javax.swing.SwingUtilities; + +import org.apache.commons.lang3.SystemUtils; +import org.apache.commons.text.StringEscapeUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; +import org.openforis.collect.earth.app.ad_hoc.AluToolUtils; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.model.AspectCode; +import org.openforis.collect.earth.app.model.DynamicsCode; +import org.openforis.collect.earth.app.model.SlopeCode; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; +import org.openforis.collect.model.CollectSurvey; +import org.openforis.collect.relational.CollectRDBPublisher; +import org.openforis.collect.relational.CollectRdbException; +import org.openforis.concurrency.Progress; +import org.openforis.idm.metamodel.NodeDefinition; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Component; + +import com.opencsv.CSVReader; + +import freemarker.template.TemplateException; + +@Component +public class AnalysisSaikuService extends GenerateDatabase implements DisposableBean{ + + private static final String PLOT_ADD = "plot ADD "; + + private static final String UPDATE = "UPDATE "; + + private static final String UNKNOWN = "Unknown"; + + private static final String VARCHAR_5 = " VARCHAR(5)"; + + private static final String INTEGER = " INTEGER"; + + private static final String ALTER_TABLE = "ALTER TABLE "; + + private static final String INSERT_INTO = "INSERT INTO "; + + private static final String CREATE_TABLE = "CREATE TABLE "; + + private static final String ALU_CLIMATE_ZONE_CODE = "alu_climate_zone_code"; //$NON-NLS-1$ + + private static final String ALU_SOIL_TYPE_CODE = "alu_soil_type_code"; //$NON-NLS-1$ + + private static final String ALU_SUBCLASS_CODE = "alu_subclass_code"; //$NON-NLS-1$ + + private static final String DYNAMICS_ID = "dynamics_id"; //$NON-NLS-1$ + + private static final String ELEVATION_ID = "elevation_id"; //$NON-NLS-1$ + + private static final String SLOPE_ID = "slope_id"; //$NON-NLS-1$ + + private static final String ASPECT_ID = "aspect_id"; //$NON-NLS-1$ + + private static final String START_SAIKU = "start-saiku"; //$NON-NLS-1$ + + private static final String STOP_SAIKU = "stop-saiku"; //$NON-NLS-1$ + + private static final String COMMAND_SUFFIX_BAT = ".bat"; //$NON-NLS-1$ + + private static final String COMMAND_SUFFIX_SH = ".sh"; //$NON-NLS-1$ + + public static final String COLLECT_EARTH_DATABASE_RDB_DB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + + EarthConstants.SAIKU_RDB_SUFFIX; + + + @Autowired + RDBExporter rdbExporter; + + @Autowired + CollectRDBPublisher collectRDBPublisher; + + @Autowired + EarthSurveyService earthSurveyService; + + @Autowired + public LocalPropertiesService localPropertiesService; + + @Autowired + BrowserService browserService; + + @Autowired + private RegionCalculationUtils regionCalculation; + + @Autowired + private SchemaService schemaNamingService; + + private static final int ELEVATION_RANGE = 100; + + private RemoteWebDriver saikuWebDriver; + + private static final String SQLITE_FREEMARKER_HTML_TEMPLATE = "resources" + File.separator //$NON-NLS-1$ + + "collectEarthSqliteDS.fmt"; //$NON-NLS-1$ + private static final String POSTGRESQL_FREEMARKER_HTML_TEMPLATE = "resources" + File.separator //$NON-NLS-1$ + + "collectEarthPostgreSqlDS.fmt"; //$NON-NLS-1$ + public static final String MDX_XML = "collectEarthCubes.xml"; //$NON-NLS-1$ + private static final String MDX_TEMPLATE = MDX_XML + ".fmt"; //$NON-NLS-1$ + + private boolean saikuStarted; + + private void assignDimensionValues() { + try { + final String schemaName = getSchemaPrefix(); + // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id + final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query( + "SELECT " + EarthConstants.PLOT_ID + ", elevation, slope, aspect FROM " + schemaName + "plot", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + new RowMapper() { + @Override + public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { + + final Object[] updateValues = new Object[4]; + + Integer aspect = AspectCode.NA.getId(); + if (AspectCode.getAspectCode(rs.getDouble("aspect")) != null) { //$NON-NLS-1$ + aspect = AspectCode.getAspectCode(rs.getDouble("aspect")).getId(); //$NON-NLS-1$ + } + + Integer slope = SlopeCode.NA.getId(); + + if (SlopeCode.getSlopeCode((int) rs.getFloat("slope")) != null) { //$NON-NLS-1$ + slope = SlopeCode.getSlopeCode((int) rs.getFloat("slope")).getId(); //$NON-NLS-1$ + } + + updateValues[0] = aspect; + updateValues[1] = slope; + updateValues[2] = ( (int) rs.getFloat("elevation") / ELEVATION_RANGE) + 1; // 0 //$NON-NLS-1$ + + updateValues[3] = rs.getLong(EarthConstants.PLOT_ID); + return updateValues; + } + + }); + + rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + ASPECT_ID + "=?," + SLOPE_ID + "=?," //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + ELEVATION_ID + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (Exception e) { + logger.warn("No DEM information", e); //$NON-NLS-1$ + } + } + + private String getSchemaPrefix() { + return schemaNamingService.getSchemaPrefix(ExportType.SAIKU); + } + + private void assignPngAluToolDimensionValues() { + try { + if (earthSurveyService.getCollectSurvey().getName().toLowerCase().contains("png")) { //$NON-NLS-1$ + final String schemaName = getSchemaPrefix(); + // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id + final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query("SELECT " + EarthConstants.PLOT_ID //$NON-NLS-1$ + + ", elevation, soil_fundamental, land_use_subcategory, precipitation_ranges FROM " + schemaName //$NON-NLS-1$ + + "plot LEFT JOIN " + schemaName + "precipitation_ranges_code where " //$NON-NLS-1$ //$NON-NLS-2$ + + "plot.annual_precipitation_code_id=precipitation_ranges_code.precipitation_ranges_code_id", //$NON-NLS-1$ + new RowMapper() { + @Override + public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { + + final Object[] updateValues = new Object[3]; + + try { + AluToolUtils aluToolUtils = new AluToolUtils(); + + Integer elevation = rs.getInt("elevation"); //$NON-NLS-1$ + String soilFundamental = rs.getString("soil_fundamental"); //$NON-NLS-1$ + String precipitationRange = rs.getString("precipitation_ranges"); //$NON-NLS-1$ + + int precipitation = -1; + String climateZone = UNKNOWN; //$NON-NLS-1$ + if (precipitationRange != null) { + precipitation = aluToolUtils.getPrecipitationFromRange(precipitationRange); + boolean shortDrySeason = true; // According to information from Abe PNG has less + // than 5 months of dry season + climateZone = aluToolUtils.getClimateZone(elevation, precipitation, + shortDrySeason); + } + + String soilType = UNKNOWN; //$NON-NLS-1$ + if (soilFundamental != null) { + soilType = aluToolUtils.getSoilType(soilFundamental); + } + + updateValues[0] = climateZone; + updateValues[1] = soilType; + updateValues[2] = rs.getLong(EarthConstants.PLOT_ID); + } catch (Exception e) { + logger.error("Error while processing the data", e); //$NON-NLS-1$ + updateValues[0] = UNKNOWN; //$NON-NLS-1$ + updateValues[1] = UNKNOWN; //$NON-NLS-1$ + updateValues[2] = UNKNOWN; //$NON-NLS-1$ + } + return updateValues; + } + + }); + + rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + ALU_CLIMATE_ZONE_CODE + "=?," //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + ALU_SOIL_TYPE_CODE + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ //$NON-NLS-2$ + } + } catch (Exception e) { + logger.error("No PNG ALU information", e); //$NON-NLS-1$ + } + } + + private void assignLUCDimensionValues() { + try { + final String schemaName = getSchemaPrefix(); + // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id + final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query( + "SELECT " + EarthConstants.PLOT_ID + ", land_use_subcategory FROM " + schemaName + "plot", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + new RowMapper() { + @Override + public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { + + AluToolUtils aluToolUtils = new AluToolUtils(); + final Object[] updateValues = new Object[3]; + + String collectEarthSubcategory = rs.getString("land_use_subcategory"); //$NON-NLS-1$ + Integer dynamics = DynamicsCode.getDynamicsCode(collectEarthSubcategory); + String subClass = UNKNOWN; //$NON-NLS-1$ + if (collectEarthSubcategory != null) { + subClass = aluToolUtils.getAluSubclass(collectEarthSubcategory); + } + + updateValues[0] = dynamics; + updateValues[1] = subClass; + updateValues[2] = rs.getLong(EarthConstants.PLOT_ID); + return updateValues; + } + + }); + + rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + DYNAMICS_ID + "=?," + ALU_SUBCLASS_CODE //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ + } catch (Exception e) { + logger.warn("No PNG Alu information available", e); //$NON-NLS-1$ + } + } + + private void createAspectAuxTable() { + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "aspect_category (" + ASPECT_ID //$NON-NLS-1$ //$NON-NLS-2$ + + " INTEGER PRIMARY KEY, aspect_caption TEXT);"); //$NON-NLS-1$ + final AspectCode[] aspects = AspectCode.values(); + for (final AspectCode aspectCode : aspects) { + rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "aspect_category values (" + aspectCode.getId() + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + aspectCode.getLabel() + "')"); //$NON-NLS-1$ + } + } + + private void createElevationtAuxTable() { + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "elevation_category ( " + ELEVATION_ID //$NON-NLS-1$ //$NON-NLS-2$ + + " INTEGER PRIMARY KEY, elevation_caption TEXT);"); //$NON-NLS-1$ + final int slots = 9000 / ELEVATION_RANGE; // Highest mountain in the world, mount everest is + // 8820m high + for (int i = 1; i <= slots; i++) { + rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "elevation_category values (" + i + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + ((i - 1) * ELEVATION_RANGE) + "-" + i //$NON-NLS-1$ + * ELEVATION_RANGE + + "')"); //$NON-NLS-1$ + } + + } + + private void createDynamicsAuxTable() { + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "dynamics_category (" + DYNAMICS_ID //$NON-NLS-1$ //$NON-NLS-2$ + + " INTEGER PRIMARY KEY, dynamics_caption TEXT);"); //$NON-NLS-1$ + final DynamicsCode[] dynamicsCodes = DynamicsCode.values(); + for (final DynamicsCode dynamicsCode : dynamicsCodes) { + rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "dynamics_category values (" + dynamicsCode.getId() //$NON-NLS-1$ //$NON-NLS-2$ + + ", '" + dynamicsCode.getLabel() + "')"); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + + private void createPlotForeignKeys() { + // Add aspect_id column to plot + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ASPECT_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + SLOPE_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ELEVATION_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + DYNAMICS_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + + private void createPngAluVariables() { + if (earthSurveyService.getCollectSurvey().getName().toLowerCase().contains("png")) { //$NON-NLS-1$ + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_SOIL_TYPE_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_CLIMATE_ZONE_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + } + + private void creatAluSubclassVariables() { + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_SUBCLASS_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + + private void createSlopeAuxTable() { + final String schemaName = getSchemaPrefix(); + // Slope can be from 0 to 90 + rdbExporter.getJdbcTemplate().execute( + CREATE_TABLE + schemaName + "slope_category (slope_id INTEGER PRIMARY KEY, slope_caption TEXT);"); //$NON-NLS-1$ //$NON-NLS-2$ + final SlopeCode[] slopeCodes = SlopeCode.values(); + for (final SlopeCode slopeCode : slopeCodes) { + rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "slope_category values (" + slopeCode.getId() + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + slopeCode.getLabel() + "')"); //$NON-NLS-1$ + } + } + + private String getSaikuConfigurationFilePath() { + + String configFile = localPropertiesService.getSaikuFolder() + "/" //$NON-NLS-1$ + + "tomcat/webapps/saiku/WEB-INF/classes/saiku-datasources/collectEarthDS"; //$NON-NLS-1$ + configFile = configFile.replace('/', File.separatorChar); + return configFile; + } + + private String getSaikuThreeConfigurationFilePath() { + + String configFile = localPropertiesService.getSaikuFolder() + "/" //$NON-NLS-1$ + + "tomcat/webapps/saiku/WEB-INF/classes/legacy-datasources/collectEarthDS"; //$NON-NLS-1$ + configFile = configFile.replace('/', File.separatorChar); + return configFile; + } + + private boolean isSaikuConfigured() { + return localPropertiesService.getSaikuFolder() != null + && isSaikuFolder(new File(localPropertiesService.getSaikuFolder())); + } + + /* + * private boolean isJavaHomeConfigured() { + * + * if (SystemUtils.IS_OS_MAC){ return true; } return ! ( StringUtils.isBlank( + * System.getenv("JAVA_HOME") ) //$NON-NLS-1$ && StringUtils.isBlank( + * System.getenv("JRE_HOME") ) //$NON-NLS-1$ && StringUtils.isBlank( + * System.getenv("COLLECT_EARTH_JRE_HOME") ) //$NON-NLS-1$ ); } */ - private static final long serialVersionUID = -404938492481063378L; - public BrowserNotFoundException() { - super(); + public boolean isSaikuFolder(File saikuFolder) { + boolean isSaikuFolder = false; + if (saikuFolder.listFiles() != null) { + for (final File file : saikuFolder.listFiles()) { + if (file.getName().equals(START_SAIKU + getCommandSuffix())) { + isSaikuFolder = true; + } + } + } + return isSaikuFolder; + } + + private void openSaiku() throws BrowserNotFoundException { + saikuWebDriver = browserService.navigateTo("http://127.0.0.1:8181", saikuWebDriver, false); //$NON-NLS-1$ + if (browserService.waitFor("username", saikuWebDriver)) { //$NON-NLS-1$ + saikuWebDriver.findElementByName("username").sendKeys("admin"); //$NON-NLS-1$ //$NON-NLS-2$ + saikuWebDriver.findElementByName("password").sendKeys("admin"); //$NON-NLS-1$ //$NON-NLS-2$ + saikuWebDriver.findElementByClassName("form_button").click(); //$NON-NLS-1$ + } + } + + + public void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws SaikuExecutionException { + + try { + + stopSaiku(); + + try { + + if ((localPropertiesService.isUsingSqliteDB() && !getZippedProjectDB( ExportType.SAIKU ).exists()) + || isRefreshDatabase()) { + + // The user clicked on the option to refresh the database, or there is no + // previous copy of the Saiku DB + // Generate the DB file + rdbExporter.exportDataToRDB( + earthSurveyService.getCollectSurvey(), + ExportType.SAIKU, + progressListener, + this::processQuantityData + ); + + try { + // Save the DB file in a zipped file to extends GenerateDatabase keep for the next usages + replaceZippedProjectDB( ExportType.SAIKU ); + } catch (Exception e) { + logger.error("Error while refreshing the Zipped content of the project Saiku DB", e); + } + + } else if (getZippedProjectDB(ExportType.SAIKU).exists() && localPropertiesService.isUsingSqliteDB()) { + // If the zipped version of the project exists ( and the user clicked on the + // option to not refresh it) then restore this last version of the data + restoreZippedProjectDB(ExportType.SAIKU); + } + + refreshDataSourceForSaiku(); + + if (startSaikuAfterDBExport && !isUserCancelledOperation()) { + startSaiku(); + new Thread("Opening Saiku") { + @Override + public void run() { + try { + AnalysisSaikuService.this.openSaiku(); + } catch (BrowserNotFoundException e) { + logger.error("No browser has been set up", e); //$NON-NLS-1$ + } + }; + }.start(); + + stopSaikuOnExit(); + } + } catch (final IOException e) { + logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ + } catch (TemplateException e1) { + logger.error("Error while applying the freemarker template tothe Saiku data source", e1); //$NON-NLS-1$ + } + + } catch (final CollectRdbException e) { + logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ + } + } + + private void processQuantityData(InfiniteProgressMonitor progressListener) { + + SwingUtilities.invokeLater( () -> progressListener.setMessage("Preparing Saiku data for analysis") ); + + progressListener.progressMade(new Progress(0, 100)); + createPngAluVariables(); + createPlotForeignKeys(); + + progressListener.progressMade(new Progress(25, 100)); + + if (!surveyContains("calculated_elevation_range", earthSurveyService.getCollectSurvey())) { + createAspectAuxTable(); + createSlopeAuxTable(); + createElevationtAuxTable(); + assignDimensionValues(); + + } + progressListener.progressMade(new Progress(50, 100)); + + if (!surveyContains("calculated_initial_land_use", earthSurveyService.getCollectSurvey())) { + createDynamicsAuxTable(); + creatAluSubclassVariables(); + assignLUCDimensionValues(); + + } + progressListener.progressMade(new Progress(75, 100)); + + assignPngAluToolDimensionValues(); + + SwingUtilities.invokeLater( () -> progressListener.setMessage("Calculating expansion factors") ); + + regionCalculation.handleRegionCalculation( ExportType.SAIKU, rdbExporter.getJdbcTemplate() ); + progressListener.progressMade(new Progress(100, 100)); + + } + + public static boolean surveyContains(String nodeName, CollectSurvey survey) { + NodeDefinition nodeDefForNAme = survey.getSchema().findNodeDefinition( nodeDef -> nodeDef.getName().equals(nodeName) ); + return nodeDefForNAme != null; + } + + public static CSVReader getCsvReader(String csvFile) throws FileNotFoundException { + final BufferedReader bufferedReader = new BufferedReader( + new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 ) ); //$NON-NLS-1$ + return new CSVReader(bufferedReader); + } + + private void refreshDataSourceForSaiku() throws IOException, TemplateException { + final File mdxFile = new File(localPropertiesService.getProjectFolder() + File.separatorChar + MDX_XML); + + Map data = new HashMap<>(); + data.put("cubeFilePath", StringEscapeUtils.escapeJava(mdxFile.getAbsolutePath().replace('\\', '/'))); //$NON-NLS-1$ + + final File mdxTemplate = getMdxTemplate(); + final File dataSourceTemplate = getDataSourceTemplate(data); + + // First try Saiku 2.5/2.6 + File dataSourceFile; + try { + dataSourceFile = new File(getSaikuConfigurationFilePath()); + FreemarkerTemplateUtils.applyTemplate(dataSourceTemplate, dataSourceFile, data); + } catch (Exception e) { + logger.error("Error starting Saiku", e); + dataSourceFile = new File(getSaikuThreeConfigurationFilePath()); + FreemarkerTemplateUtils.applyTemplate(dataSourceTemplate, dataSourceFile, data); + } + + setMdxSaikuSchema(mdxTemplate, mdxFile); + } + + private File getMdxTemplate() throws IOException { + final File mdxFileTemplate = new File( + localPropertiesService.getProjectFolder() + File.separatorChar + MDX_TEMPLATE); + if (!mdxFileTemplate.exists()) { + throw new IOException( + "The file containing the MDX Cube definition Template does not exist in expected location " //$NON-NLS-1$ + + mdxFileTemplate.getAbsolutePath()); + } + return mdxFileTemplate; + } + + private File getDataSourceTemplate(Map data) throws IOException { + File dataSourceTemplate = null; + + if (localPropertiesService.isUsingSqliteDB()) { + dataSourceTemplate = new File(SQLITE_FREEMARKER_HTML_TEMPLATE); + final File rdbDb = rdbExporter.getRdbFile( ExportType.SAIKU ); + if (!rdbDb.exists()) { + throw new IOException( + "The file contianing the Relational SQLite Database does not exist in expected location " //$NON-NLS-1$ + + rdbDb.getAbsolutePath()); + } + data.put("rdbFilePath", StringEscapeUtils.escapeJava(rdbDb.getAbsolutePath().replace('\\', '/'))); //$NON-NLS-1$ + } else { + dataSourceTemplate = new File(POSTGRESQL_FREEMARKER_HTML_TEMPLATE); + CollectDBDriver collectDBDriver = localPropertiesService.getCollectDBDriver(); + data.put("dbUrl", StringEscapeUtils.escapeJava(ServerController.getSaikuDbURL(collectDBDriver))); //$NON-NLS-1$ + data.put("username", //$NON-NLS-1$ + StringEscapeUtils.escapeJava(localPropertiesService.getValue(EarthProperty.DB_USERNAME))); + data.put("password", //$NON-NLS-1$ + StringEscapeUtils.escapeJava(localPropertiesService.getValue(EarthProperty.DB_PASSWORD))); + } + + if (!dataSourceTemplate.exists()) { + throw new IOException( + "The file containing the Saiku Data Source template does not exist in expected location " //$NON-NLS-1$ + + dataSourceTemplate.getAbsolutePath()); + } + + return dataSourceTemplate; + } + + private void setMdxSaikuSchema(final File mdxFileTemplate, final File mdxFile) + throws IOException, TemplateException { + Map saikuData = new HashMap<>(); + String saikuSchemaName = getSchemaName(); + if (saikuSchemaName == null) { + saikuSchemaName = ""; //$NON-NLS-1$ + } + saikuData.put("saikuDbSchema", saikuSchemaName); //$NON-NLS-1$ + FreemarkerTemplateUtils.applyTemplate(mdxFileTemplate, mdxFile, saikuData); + } + + private void runSaikuBat(String commandName) throws SaikuExecutionException { + if (!isSaikuConfigured()) { + throw new SaikuExecutionException("The Saiku server is not configured."); //$NON-NLS-1$ + } + + else { + String saikuCmd = localPropertiesService.getSaikuFolder() + File.separator + commandName + + getCommandSuffix(); + + if (SystemUtils.IS_OS_WINDOWS) { + saikuCmd = "\"" + saikuCmd + "\""; //$NON-NLS-1$ //$NON-NLS-2$ + } + + try { + + Process runSaiku = runProcessBuilder(new String[] { saikuCmd }); + + if (commandName.equals(STOP_SAIKU)) { + int result = runSaiku.waitFor(); + logger.warn("Script ended with result {}", result); //$NON-NLS-1$ + } else if (commandName.equals(START_SAIKU)) { + Thread.sleep(6000); + } + + } catch (final IOException e) { + logger.error("Error when running Saiku start/stop command", e); //$NON-NLS-1$ + } catch (InterruptedException e) { + logger.error("Error while waiting to start", e); //$NON-NLS-1$ + Thread.currentThread().interrupt(); + } + } + } + + private void setMacJreHome(ProcessBuilder p) { + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX || SystemUtils.IS_OS_LINUX) { + + File javaFolder = new File("./java"); + + if (!javaFolder.exists()) { + String userName = System.getProperty("user.name"); + String testWithPath = "/Users/" + userName + "/OpenForis/CollectEarth/java"; + File testJavaPath = new File(testWithPath); + if (testJavaPath.exists()) { + javaFolder = testJavaPath; + } + } + + Map environment = p.environment(); + environment.put("COLLECT_EARTH_JRE_HOME", javaFolder.getAbsolutePath()); + + /* + * // In MAC the environment variable COLLECT_EARTH_JRE_HOME is not accesible + * from outside the bash, set it again! if( SystemUtils.IS_OS_MAC || + * SystemUtils.IS_OS_MAC_OSX){ try { File javaFolder = new File("./java"); + * + * if( !javaFolder.exists() ){ String userName = + * System.getProperty("user.name"); String testWithPath = "/Users/"+userName + + * "/OpenForis/CollectEarth/java"; File testJavaPath = new File(testWithPath); + * if( testJavaPath.exists()){ javaFolder = testJavaPath; } } + * + * Process setEnv = runProcessBuilder(new String[] { "/bin/bash", "setenv", + * "COLLECT_EARTH_JRE_HOME=\""+ javaFolder.getAbsolutePath() +"\"" }); + * setEnv.waitFor(); } catch (final IOException e) { + * logger.error("Error setting the COLLECT_EARTH_JRE_HOME environment variable", + * e); //$NON-NLS-1$ } catch (InterruptedException e) { + * logger.error("Error when running COLLECT_EARTH_JRE_HOME environment variable" + * , e); //$NON-NLS-1$ } } + */ + } } + private Process runProcessBuilder(String[] cmd) throws IOException { + final ProcessBuilder builder = new ProcessBuilder(cmd); + + // Fixes bug with Mac OS X not using the environemnt variable set for bash + setMacJreHome(builder); - public BrowserNotFoundException(String message, Throwable cause) { - super(message, cause); + builder.directory(new File(localPropertiesService.getSaikuFolder()).getAbsoluteFile()); + builder.redirectErrorStream(true); + Process p = builder.start(); + (new ProcessLoggerThread(p.getInputStream(), Boolean.FALSE)).start(); + (new ProcessLoggerThread(p.getErrorStream(), Boolean.TRUE)).start(); + return p; } - public BrowserNotFoundException(String message) { - super(message); + private String getCommandSuffix() { + if (SystemUtils.IS_OS_WINDOWS) { + return COMMAND_SUFFIX_BAT; + } else { + return COMMAND_SUFFIX_SH; + } } - public BrowserNotFoundException(Throwable cause) { - super(cause); + private void startSaiku() throws SaikuExecutionException { + logger.warn( + "Starting the Saiku server {}{}{}", localPropertiesService.getSaikuFolder(), File.separator, START_SAIKU); //$NON-NLS-1$ + + runSaikuBat(START_SAIKU); + + this.setSaikuStarted(true); + + logger.warn("Finished starting the Saiku server"); //$NON-NLS-1$ } + void stopSaiku() throws SaikuExecutionException { + logger.warn("Stoping the Saiku server {}{}{}", localPropertiesService.getSaikuFolder() , File.separator , STOP_SAIKU); //$NON-NLS-1$ + if (isSaikuStarted()) { + runSaikuBat(STOP_SAIKU); + this.setSaikuStarted(true); + } + logger.warn("Finished stoping the Saiku server"); //$NON-NLS-1$ + } + + private void stopSaikuOnExit() { + Runtime.getRuntime().addShutdownHook(new Thread("Shutting down Saiku on exit hook") { + @Override + public void run() { + try { + if (isSaikuStarted()) { + stopSaiku(); + } + } catch (final SaikuExecutionException e) { + logger.error("The Saiku server has been de-configured after it was started", e); //$NON-NLS-1$ + } + } + + }); + } + + private boolean isSaikuStarted() { + return saikuStarted; + } + + private void setSaikuStarted(boolean saikuStarted) { + this.saikuStarted = saikuStarted; + } -} + @Override + public void destroy() throws Exception { + try { + stopSaiku(); + } catch (SaikuExecutionException e) { + logger.error("Error while trying to quite Saiku before destroying the bean", e); //$NON-NLS-1$ + } + } + + @Override + public LocalPropertiesService getLocalPropertiesService() { + return localPropertiesService; + } + + @Override + public EarthSurveyService getEarthSurveyService() { + return earthSurveyService; + } + + @Override + public RDBExporter getRdbExporter() { + return rdbExporter; + } + +} \ No newline at end of file From 3b2f761a8c79d5cc32557c3862c9e7406e44210b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:26 +0100 Subject: [PATCH 0112/1620] New translations AnalysisSaikuService.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 763 ++++++++++++++++-- 1 file changed, 700 insertions(+), 63 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 9f9883c25f..cba7f5812d 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,94 +1,731 @@ -package org.openforis.collect.earth.app.logging; +package org.openforis.collect.earth.app.service; -import java.awt.Dimension; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; -import javax.swing.JEditorPane; -import javax.swing.JOptionPane; -import javax.swing.JScrollPane; import javax.swing.SwingUtilities; -import org.apache.logging.log4j.core.Filter; -import org.apache.logging.log4j.core.Layout; -import org.apache.logging.log4j.core.LogEvent; -import org.apache.logging.log4j.core.appender.AbstractAppender; -import org.apache.logging.log4j.core.config.Property; -import org.apache.logging.log4j.core.config.plugins.Plugin; -import org.apache.logging.log4j.core.config.plugins.PluginAttribute; -import org.apache.logging.log4j.core.config.plugins.PluginElement; -import org.apache.logging.log4j.core.config.plugins.PluginFactory; -import org.apache.logging.log4j.core.layout.PatternLayout; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.apache.commons.lang3.SystemUtils; +import org.apache.commons.text.StringEscapeUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; +import org.openforis.collect.earth.app.ad_hoc.AluToolUtils; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.model.AspectCode; +import org.openforis.collect.earth.app.model.DynamicsCode; +import org.openforis.collect.earth.app.model.SlopeCode; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; +import org.openforis.collect.model.CollectSurvey; +import org.openforis.collect.relational.CollectRDBPublisher; +import org.openforis.collect.relational.CollectRdbException; +import org.openforis.concurrency.Progress; +import org.openforis.idm.metamodel.NodeDefinition; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Component; -@Plugin(name = "JSwingAppender", category = "Core", elementType = "appender", printObject = true) -public class JSwingAppender extends AbstractAppender { +import com.opencsv.CSVReader; - private Boolean showException; +import freemarker.template.TemplateException; - private Logger logger = LoggerFactory.getLogger( JSwingAppender.class ); +@Component +public class AnalysisSaikuService extends GenerateDatabase implements DisposableBean{ - public JSwingAppender(String name, Filter filter, Layout layout, boolean ignoreExceptions, Property[] properties) { - super(name, filter, layout, ignoreExceptions, properties); + private static final String PLOT_ADD = "plot ADD "; + + private static final String UPDATE = "UPDATE "; + + private static final String UNKNOWN = "Unknown"; + + private static final String VARCHAR_5 = " VARCHAR(5)"; + + private static final String INTEGER = " INTEGER"; + + private static final String ALTER_TABLE = "ALTER TABLE "; + + private static final String INSERT_INTO = "INSERT INTO "; + + private static final String CREATE_TABLE = "CREATE TABLE "; + + private static final String ALU_CLIMATE_ZONE_CODE = "alu_climate_zone_code"; //$NON-NLS-1$ + + private static final String ALU_SOIL_TYPE_CODE = "alu_soil_type_code"; //$NON-NLS-1$ + + private static final String ALU_SUBCLASS_CODE = "alu_subclass_code"; //$NON-NLS-1$ + + private static final String DYNAMICS_ID = "dynamics_id"; //$NON-NLS-1$ + + private static final String ELEVATION_ID = "elevation_id"; //$NON-NLS-1$ + + private static final String SLOPE_ID = "slope_id"; //$NON-NLS-1$ + + private static final String ASPECT_ID = "aspect_id"; //$NON-NLS-1$ + + private static final String START_SAIKU = "start-saiku"; //$NON-NLS-1$ + + private static final String STOP_SAIKU = "stop-saiku"; //$NON-NLS-1$ + + private static final String COMMAND_SUFFIX_BAT = ".bat"; //$NON-NLS-1$ + + private static final String COMMAND_SUFFIX_SH = ".sh"; //$NON-NLS-1$ + + public static final String COLLECT_EARTH_DATABASE_RDB_DB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + + EarthConstants.SAIKU_RDB_SUFFIX; + + + @Autowired + RDBExporter rdbExporter; + + @Autowired + CollectRDBPublisher collectRDBPublisher; + + @Autowired + EarthSurveyService earthSurveyService; + + @Autowired + public LocalPropertiesService localPropertiesService; + + @Autowired + BrowserService browserService; + + @Autowired + private RegionCalculationUtils regionCalculation; + + @Autowired + private SchemaService schemaNamingService; + + private static final int ELEVATION_RANGE = 100; + + private RemoteWebDriver saikuWebDriver; + + private static final String SQLITE_FREEMARKER_HTML_TEMPLATE = "resources" + File.separator //$NON-NLS-1$ + + "collectEarthSqliteDS.fmt"; //$NON-NLS-1$ + private static final String POSTGRESQL_FREEMARKER_HTML_TEMPLATE = "resources" + File.separator //$NON-NLS-1$ + + "collectEarthPostgreSqlDS.fmt"; //$NON-NLS-1$ + public static final String MDX_XML = "collectEarthCubes.xml"; //$NON-NLS-1$ + private static final String MDX_TEMPLATE = MDX_XML + ".fmt"; //$NON-NLS-1$ + + private boolean saikuStarted; + + private void assignDimensionValues() { + try { + final String schemaName = getSchemaPrefix(); + // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id + final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query( + "SELECT " + EarthConstants.PLOT_ID + ", elevation, slope, aspect FROM " + schemaName + "plot", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + new RowMapper() { + @Override + public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { + + final Object[] updateValues = new Object[4]; + + Integer aspect = AspectCode.NA.getId(); + if (AspectCode.getAspectCode(rs.getDouble("aspect")) != null) { //$NON-NLS-1$ + aspect = AspectCode.getAspectCode(rs.getDouble("aspect")).getId(); //$NON-NLS-1$ + } + + Integer slope = SlopeCode.NA.getId(); + + if (SlopeCode.getSlopeCode((int) rs.getFloat("slope")) != null) { //$NON-NLS-1$ + slope = SlopeCode.getSlopeCode((int) rs.getFloat("slope")).getId(); //$NON-NLS-1$ + } + + updateValues[0] = aspect; + updateValues[1] = slope; + updateValues[2] = ( (int) rs.getFloat("elevation") / ELEVATION_RANGE) + 1; // 0 //$NON-NLS-1$ + + updateValues[3] = rs.getLong(EarthConstants.PLOT_ID); + return updateValues; + } + + }); + + rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + ASPECT_ID + "=?," + SLOPE_ID + "=?," //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + ELEVATION_ID + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (Exception e) { + logger.warn("No DEM information", e); //$NON-NLS-1$ + } } - @PluginFactory - public static JSwingAppender createAppender(@PluginAttribute("name") String name, - @PluginElement("Layout") Layout layout, @PluginElement("Filters") Filter filter, - @PluginAttribute("ignoreExceptions") boolean ignoreExceptions) { + private String getSchemaPrefix() { + return schemaNamingService.getSchemaPrefix(ExportType.SAIKU); + } + + private void assignPngAluToolDimensionValues() { + try { + if (earthSurveyService.getCollectSurvey().getName().toLowerCase().contains("png")) { //$NON-NLS-1$ + final String schemaName = getSchemaPrefix(); + // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id + final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query("SELECT " + EarthConstants.PLOT_ID //$NON-NLS-1$ + + ", elevation, soil_fundamental, land_use_subcategory, precipitation_ranges FROM " + schemaName //$NON-NLS-1$ + + "plot LEFT JOIN " + schemaName + "precipitation_ranges_code where " //$NON-NLS-1$ //$NON-NLS-2$ + + "plot.annual_precipitation_code_id=precipitation_ranges_code.precipitation_ranges_code_id", //$NON-NLS-1$ + new RowMapper() { + @Override + public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { + + final Object[] updateValues = new Object[3]; + + try { + AluToolUtils aluToolUtils = new AluToolUtils(); + + Integer elevation = rs.getInt("elevation"); //$NON-NLS-1$ + String soilFundamental = rs.getString("soil_fundamental"); //$NON-NLS-1$ + String precipitationRange = rs.getString("precipitation_ranges"); //$NON-NLS-1$ + + int precipitation = -1; + String climateZone = UNKNOWN; //$NON-NLS-1$ + if (precipitationRange != null) { + precipitation = aluToolUtils.getPrecipitationFromRange(precipitationRange); + boolean shortDrySeason = true; // According to information from Abe PNG has less + // than 5 months of dry season + climateZone = aluToolUtils.getClimateZone(elevation, precipitation, + shortDrySeason); + } + + String soilType = UNKNOWN; //$NON-NLS-1$ + if (soilFundamental != null) { + soilType = aluToolUtils.getSoilType(soilFundamental); + } + + updateValues[0] = climateZone; + updateValues[1] = soilType; + updateValues[2] = rs.getLong(EarthConstants.PLOT_ID); + } catch (Exception e) { + logger.error("Error while processing the data", e); //$NON-NLS-1$ + updateValues[0] = UNKNOWN; //$NON-NLS-1$ + updateValues[1] = UNKNOWN; //$NON-NLS-1$ + updateValues[2] = UNKNOWN; //$NON-NLS-1$ + } + return updateValues; + } - if (name == null) { - LoggerFactory.getLogger( JSwingAppender.class ).error("No name provided for JTextAreaAppender"); - return null; + }); + + rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + ALU_CLIMATE_ZONE_CODE + "=?," //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + ALU_SOIL_TYPE_CODE + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ //$NON-NLS-2$ + } + } catch (Exception e) { + logger.error("No PNG ALU information", e); //$NON-NLS-1$ } + } + + private void assignLUCDimensionValues() { + try { + final String schemaName = getSchemaPrefix(); + // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id + final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query( + "SELECT " + EarthConstants.PLOT_ID + ", land_use_subcategory FROM " + schemaName + "plot", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + new RowMapper() { + @Override + public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { + + AluToolUtils aluToolUtils = new AluToolUtils(); + final Object[] updateValues = new Object[3]; + + String collectEarthSubcategory = rs.getString("land_use_subcategory"); //$NON-NLS-1$ + Integer dynamics = DynamicsCode.getDynamicsCode(collectEarthSubcategory); + String subClass = UNKNOWN; //$NON-NLS-1$ + if (collectEarthSubcategory != null) { + subClass = aluToolUtils.getAluSubclass(collectEarthSubcategory); + } - if (layout == null) { - layout = PatternLayout.createDefaultLayout(); + updateValues[0] = dynamics; + updateValues[1] = subClass; + updateValues[2] = rs.getLong(EarthConstants.PLOT_ID); + return updateValues; + } + + }); + + rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + DYNAMICS_ID + "=?," + ALU_SUBCLASS_CODE //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ + } catch (Exception e) { + logger.warn("No PNG Alu information available", e); //$NON-NLS-1$ } - return new JSwingAppender(name, filter, layout, ignoreExceptions, Property.EMPTY_ARRAY); } - @Override - public void append(LogEvent event) { + private void createAspectAuxTable() { + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "aspect_category (" + ASPECT_ID //$NON-NLS-1$ //$NON-NLS-2$ + + " INTEGER PRIMARY KEY, aspect_caption TEXT);"); //$NON-NLS-1$ + final AspectCode[] aspects = AspectCode.values(); + for (final AspectCode aspectCode : aspects) { + rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "aspect_category values (" + aspectCode.getId() + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + aspectCode.getLabel() + "')"); //$NON-NLS-1$ + } + } + + private void createElevationtAuxTable() { + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "elevation_category ( " + ELEVATION_ID //$NON-NLS-1$ //$NON-NLS-2$ + + " INTEGER PRIMARY KEY, elevation_caption TEXT);"); //$NON-NLS-1$ + final int slots = 9000 / ELEVATION_RANGE; // Highest mountain in the world, mount everest is + // 8820m high + for (int i = 1; i <= slots; i++) { + rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "elevation_category values (" + i + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + ((i - 1) * ELEVATION_RANGE) + "-" + i //$NON-NLS-1$ + * ELEVATION_RANGE + + "')"); //$NON-NLS-1$ + } + + } + + private void createDynamicsAuxTable() { + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "dynamics_category (" + DYNAMICS_ID //$NON-NLS-1$ //$NON-NLS-2$ + + " INTEGER PRIMARY KEY, dynamics_caption TEXT);"); //$NON-NLS-1$ + final DynamicsCode[] dynamicsCodes = DynamicsCode.values(); + for (final DynamicsCode dynamicsCode : dynamicsCodes) { + rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "dynamics_category values (" + dynamicsCode.getId() //$NON-NLS-1$ //$NON-NLS-2$ + + ", '" + dynamicsCode.getLabel() + "')"); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + + private void createPlotForeignKeys() { + // Add aspect_id column to plot + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ASPECT_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + SLOPE_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ELEVATION_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + DYNAMICS_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + + private void createPngAluVariables() { + if (earthSurveyService.getCollectSurvey().getName().toLowerCase().contains("png")) { //$NON-NLS-1$ + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_SOIL_TYPE_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_CLIMATE_ZONE_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + } + + private void creatAluSubclassVariables() { + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_SUBCLASS_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + + private void createSlopeAuxTable() { + final String schemaName = getSchemaPrefix(); + // Slope can be from 0 to 90 + rdbExporter.getJdbcTemplate().execute( + CREATE_TABLE + schemaName + "slope_category (slope_id INTEGER PRIMARY KEY, slope_caption TEXT);"); //$NON-NLS-1$ //$NON-NLS-2$ + final SlopeCode[] slopeCodes = SlopeCode.values(); + for (final SlopeCode slopeCode : slopeCodes) { + rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "slope_category values (" + slopeCode.getId() + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + slopeCode.getLabel() + "')"); //$NON-NLS-1$ + } + } + + private String getSaikuConfigurationFilePath() { + + String configFile = localPropertiesService.getSaikuFolder() + "/" //$NON-NLS-1$ + + "tomcat/webapps/saiku/WEB-INF/classes/saiku-datasources/collectEarthDS"; //$NON-NLS-1$ + configFile = configFile.replace('/', File.separatorChar); + return configFile; + } + + private String getSaikuThreeConfigurationFilePath() { + + String configFile = localPropertiesService.getSaikuFolder() + "/" //$NON-NLS-1$ + + "tomcat/webapps/saiku/WEB-INF/classes/legacy-datasources/collectEarthDS"; //$NON-NLS-1$ + configFile = configFile.replace('/', File.separatorChar); + return configFile; + } + + private boolean isSaikuConfigured() { + return localPropertiesService.getSaikuFolder() != null + && isSaikuFolder(new File(localPropertiesService.getSaikuFolder())); + } + + /* + * private boolean isJavaHomeConfigured() { + * + * if (SystemUtils.IS_OS_MAC){ return true; } return ! ( StringUtils.isBlank( + * System.getenv("JAVA_HOME") ) //$NON-NLS-1$ && StringUtils.isBlank( + * System.getenv("JRE_HOME") ) //$NON-NLS-1$ && StringUtils.isBlank( + * System.getenv("COLLECT_EARTH_JRE_HOME") ) //$NON-NLS-1$ ); } + */ + + public boolean isSaikuFolder(File saikuFolder) { + boolean isSaikuFolder = false; + if (saikuFolder.listFiles() != null) { + for (final File file : saikuFolder.listFiles()) { + if (file.getName().equals(START_SAIKU + getCommandSuffix())) { + isSaikuFolder = true; + } + } + } + return isSaikuFolder; + } + + private void openSaiku() throws BrowserNotFoundException { + saikuWebDriver = browserService.navigateTo("http://127.0.0.1:8181", saikuWebDriver, false); //$NON-NLS-1$ + if (browserService.waitFor("username", saikuWebDriver)) { //$NON-NLS-1$ + saikuWebDriver.findElementByName("username").sendKeys("admin"); //$NON-NLS-1$ //$NON-NLS-2$ + saikuWebDriver.findElementByName("password").sendKeys("admin"); //$NON-NLS-1$ //$NON-NLS-2$ + saikuWebDriver.findElementByClassName("form_button").click(); //$NON-NLS-1$ + } + } + + + public void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws SaikuExecutionException { + try { - if( isExceptionShown() ) { - final String message = new String(this.getLayout().toByteArray(event)).replaceAll("(\r\n|\n)", "
"); - // Append formatted message to text area using the Thread. + stopSaiku(); + + try { - SwingUtilities.invokeLater( () -> { + if ((localPropertiesService.isUsingSqliteDB() && !getZippedProjectDB( ExportType.SAIKU ).exists()) + || isRefreshDatabase()) { + + // The user clicked on the option to refresh the database, or there is no + // previous copy of the Saiku DB + // Generate the DB file + rdbExporter.exportDataToRDB( + earthSurveyService.getCollectSurvey(), + ExportType.SAIKU, + progressListener, + this::processQuantityData + ); + try { - JEditorPane web = new JEditorPane(); - web.setEditable(false); - web.setContentType("text/html"); - web.setText(message); - - JScrollPane scrollPane = new JScrollPane(web); - scrollPane.setPreferredSize(new Dimension(450, 350)); - - JOptionPane.showMessageDialog(null, scrollPane, "Error has been loogged", JOptionPane.ERROR_MESSAGE); - }catch (Exception e) { - // Avoid creating an infinite loop by catching this exception and not logging it as error - logger.debug("Error shown exception", e); + // Save the DB file in a zipped file to extends GenerateDatabase keep for the next usages + replaceZippedProjectDB( ExportType.SAIKU ); + } catch (Exception e) { + logger.error("Error while refreshing the Zipped content of the project Saiku DB", e); } - } ); + + } else if (getZippedProjectDB(ExportType.SAIKU).exists() && localPropertiesService.isUsingSqliteDB()) { + // If the zipped version of the project exists ( and the user clicked on the + // option to not refresh it) then restore this last version of the data + restoreZippedProjectDB(ExportType.SAIKU); + } + + refreshDataSourceForSaiku(); + + if (startSaikuAfterDBExport && !isUserCancelledOperation()) { + startSaiku(); + new Thread("Opening Saiku") { + @Override + public void run() { + try { + AnalysisSaikuService.this.openSaiku(); + } catch (BrowserNotFoundException e) { + logger.error("No browser has been set up", e); //$NON-NLS-1$ + } + }; + }.start(); + + stopSaikuOnExit(); + } + } catch (final IOException e) { + logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ + } catch (TemplateException e1) { + logger.error("Error while applying the freemarker template tothe Saiku data source", e1); //$NON-NLS-1$ + } + + } catch (final CollectRdbException e) { + logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ + } + } + + private void processQuantityData(InfiniteProgressMonitor progressListener) { + + SwingUtilities.invokeLater( () -> progressListener.setMessage("Preparing Saiku data for analysis") ); + + progressListener.progressMade(new Progress(0, 100)); + createPngAluVariables(); + createPlotForeignKeys(); + + progressListener.progressMade(new Progress(25, 100)); + + if (!surveyContains("calculated_elevation_range", earthSurveyService.getCollectSurvey())) { + createAspectAuxTable(); + createSlopeAuxTable(); + createElevationtAuxTable(); + assignDimensionValues(); + + } + progressListener.progressMade(new Progress(50, 100)); + + if (!surveyContains("calculated_initial_land_use", earthSurveyService.getCollectSurvey())) { + createDynamicsAuxTable(); + creatAluSubclassVariables(); + assignLUCDimensionValues(); + + } + progressListener.progressMade(new Progress(75, 100)); + + assignPngAluToolDimensionValues(); + + SwingUtilities.invokeLater( () -> progressListener.setMessage("Calculating expansion factors") ); + + regionCalculation.handleRegionCalculation( ExportType.SAIKU, rdbExporter.getJdbcTemplate() ); + progressListener.progressMade(new Progress(100, 100)); + + } + + public static boolean surveyContains(String nodeName, CollectSurvey survey) { + NodeDefinition nodeDefForNAme = survey.getSchema().findNodeDefinition( nodeDef -> nodeDef.getName().equals(nodeName) ); + return nodeDefForNAme != null; + } + + public static CSVReader getCsvReader(String csvFile) throws FileNotFoundException { + final BufferedReader bufferedReader = new BufferedReader( + new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 ) ); //$NON-NLS-1$ + return new CSVReader(bufferedReader); + } + + private void refreshDataSourceForSaiku() throws IOException, TemplateException { + final File mdxFile = new File(localPropertiesService.getProjectFolder() + File.separatorChar + MDX_XML); + + Map data = new HashMap<>(); + data.put("cubeFilePath", StringEscapeUtils.escapeJava(mdxFile.getAbsolutePath().replace('\\', '/'))); //$NON-NLS-1$ + + final File mdxTemplate = getMdxTemplate(); + final File dataSourceTemplate = getDataSourceTemplate(data); + + // First try Saiku 2.5/2.6 + File dataSourceFile; + try { + dataSourceFile = new File(getSaikuConfigurationFilePath()); + FreemarkerTemplateUtils.applyTemplate(dataSourceTemplate, dataSourceFile, data); + } catch (Exception e) { + logger.error("Error starting Saiku", e); + dataSourceFile = new File(getSaikuThreeConfigurationFilePath()); + FreemarkerTemplateUtils.applyTemplate(dataSourceTemplate, dataSourceFile, data); + } + + setMdxSaikuSchema(mdxTemplate, mdxFile); + } + + private File getMdxTemplate() throws IOException { + final File mdxFileTemplate = new File( + localPropertiesService.getProjectFolder() + File.separatorChar + MDX_TEMPLATE); + if (!mdxFileTemplate.exists()) { + throw new IOException( + "The file containing the MDX Cube definition Template does not exist in expected location " //$NON-NLS-1$ + + mdxFileTemplate.getAbsolutePath()); + } + return mdxFileTemplate; + } + + private File getDataSourceTemplate(Map data) throws IOException { + File dataSourceTemplate = null; + + if (localPropertiesService.isUsingSqliteDB()) { + dataSourceTemplate = new File(SQLITE_FREEMARKER_HTML_TEMPLATE); + final File rdbDb = rdbExporter.getRdbFile( ExportType.SAIKU ); + if (!rdbDb.exists()) { + throw new IOException( + "The file contianing the Relational SQLite Database does not exist in expected location " //$NON-NLS-1$ + + rdbDb.getAbsolutePath()); + } + data.put("rdbFilePath", StringEscapeUtils.escapeJava(rdbDb.getAbsolutePath().replace('\\', '/'))); //$NON-NLS-1$ + } else { + dataSourceTemplate = new File(POSTGRESQL_FREEMARKER_HTML_TEMPLATE); + CollectDBDriver collectDBDriver = localPropertiesService.getCollectDBDriver(); + data.put("dbUrl", StringEscapeUtils.escapeJava(ServerController.getSaikuDbURL(collectDBDriver))); //$NON-NLS-1$ + data.put("username", //$NON-NLS-1$ + StringEscapeUtils.escapeJava(localPropertiesService.getValue(EarthProperty.DB_USERNAME))); + data.put("password", //$NON-NLS-1$ + StringEscapeUtils.escapeJava(localPropertiesService.getValue(EarthProperty.DB_PASSWORD))); + } + + if (!dataSourceTemplate.exists()) { + throw new IOException( + "The file containing the Saiku Data Source template does not exist in expected location " //$NON-NLS-1$ + + dataSourceTemplate.getAbsolutePath()); + } + + return dataSourceTemplate; + } + + private void setMdxSaikuSchema(final File mdxFileTemplate, final File mdxFile) + throws IOException, TemplateException { + Map saikuData = new HashMap<>(); + String saikuSchemaName = getSchemaName(); + if (saikuSchemaName == null) { + saikuSchemaName = ""; //$NON-NLS-1$ + } + saikuData.put("saikuDbSchema", saikuSchemaName); //$NON-NLS-1$ + FreemarkerTemplateUtils.applyTemplate(mdxFileTemplate, mdxFile, saikuData); + } + + private void runSaikuBat(String commandName) throws SaikuExecutionException { + if (!isSaikuConfigured()) { + throw new SaikuExecutionException("The Saiku server is not configured."); //$NON-NLS-1$ + } + + else { + String saikuCmd = localPropertiesService.getSaikuFolder() + File.separator + commandName + + getCommandSuffix(); + + if (SystemUtils.IS_OS_WINDOWS) { + saikuCmd = "\"" + saikuCmd + "\""; //$NON-NLS-1$ //$NON-NLS-2$ + } + + try { + + Process runSaiku = runProcessBuilder(new String[] { saikuCmd }); + + if (commandName.equals(STOP_SAIKU)) { + int result = runSaiku.waitFor(); + logger.warn("Script ended with result {}", result); //$NON-NLS-1$ + } else if (commandName.equals(START_SAIKU)) { + Thread.sleep(6000); + } + + } catch (final IOException e) { + logger.error("Error when running Saiku start/stop command", e); //$NON-NLS-1$ + } catch (InterruptedException e) { + logger.error("Error while waiting to start", e); //$NON-NLS-1$ + Thread.currentThread().interrupt(); } - } catch (final Exception e) { - // ignore case when the platform hasn't yet been initialized - logger.debug("Error shown exception", e); } + } + private void setMacJreHome(ProcessBuilder p) { + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX || SystemUtils.IS_OS_LINUX) { + + File javaFolder = new File("./java"); + + if (!javaFolder.exists()) { + String userName = System.getProperty("user.name"); + String testWithPath = "/Users/" + userName + "/OpenForis/CollectEarth/java"; + File testJavaPath = new File(testWithPath); + if (testJavaPath.exists()) { + javaFolder = testJavaPath; + } + } + + Map environment = p.environment(); + environment.put("COLLECT_EARTH_JRE_HOME", javaFolder.getAbsolutePath()); + + /* + * // In MAC the environment variable COLLECT_EARTH_JRE_HOME is not accesible + * from outside the bash, set it again! if( SystemUtils.IS_OS_MAC || + * SystemUtils.IS_OS_MAC_OSX){ try { File javaFolder = new File("./java"); + * + * if( !javaFolder.exists() ){ String userName = + * System.getProperty("user.name"); String testWithPath = "/Users/"+userName + + * "/OpenForis/CollectEarth/java"; File testJavaPath = new File(testWithPath); + * if( testJavaPath.exists()){ javaFolder = testJavaPath; } } + * + * Process setEnv = runProcessBuilder(new String[] { "/bin/bash", "setenv", + * "COLLECT_EARTH_JRE_HOME=\""+ javaFolder.getAbsolutePath() +"\"" }); + * setEnv.waitFor(); } catch (final IOException e) { + * logger.error("Error setting the COLLECT_EARTH_JRE_HOME environment variable", + * e); //$NON-NLS-1$ } catch (InterruptedException e) { + * logger.error("Error when running COLLECT_EARTH_JRE_HOME environment variable" + * , e); //$NON-NLS-1$ } } + */ + } + } + + private Process runProcessBuilder(String[] cmd) throws IOException { + final ProcessBuilder builder = new ProcessBuilder(cmd); + + // Fixes bug with Mac OS X not using the environemnt variable set for bash + setMacJreHome(builder); + + builder.directory(new File(localPropertiesService.getSaikuFolder()).getAbsoluteFile()); + builder.redirectErrorStream(true); + Process p = builder.start(); + (new ProcessLoggerThread(p.getInputStream(), Boolean.FALSE)).start(); + (new ProcessLoggerThread(p.getErrorStream(), Boolean.TRUE)).start(); + return p; } - private boolean isExceptionShown() { - if( showException == null ) { - LocalPropertiesService localPropertiesService = new LocalPropertiesService(); - showException = localPropertiesService.isExceptionShown(); + private String getCommandSuffix() { + if (SystemUtils.IS_OS_WINDOWS) { + return COMMAND_SUFFIX_BAT; + } else { + return COMMAND_SUFFIX_SH; } - return showException; } - public void setExceptionShown(Boolean showException) { - this.showException = showException; + private void startSaiku() throws SaikuExecutionException { + logger.warn( + "Starting the Saiku server {}{}{}", localPropertiesService.getSaikuFolder(), File.separator, START_SAIKU); //$NON-NLS-1$ + + runSaikuBat(START_SAIKU); + + this.setSaikuStarted(true); + + logger.warn("Finished starting the Saiku server"); //$NON-NLS-1$ } + + void stopSaiku() throws SaikuExecutionException { + logger.warn("Stoping the Saiku server {}{}{}", localPropertiesService.getSaikuFolder() , File.separator , STOP_SAIKU); //$NON-NLS-1$ + if (isSaikuStarted()) { + runSaikuBat(STOP_SAIKU); + this.setSaikuStarted(true); + } + logger.warn("Finished stoping the Saiku server"); //$NON-NLS-1$ + } + + private void stopSaikuOnExit() { + Runtime.getRuntime().addShutdownHook(new Thread("Shutting down Saiku on exit hook") { + @Override + public void run() { + try { + if (isSaikuStarted()) { + stopSaiku(); + } + } catch (final SaikuExecutionException e) { + logger.error("The Saiku server has been de-configured after it was started", e); //$NON-NLS-1$ + } + } + + }); + } + + private boolean isSaikuStarted() { + return saikuStarted; + } + + private void setSaikuStarted(boolean saikuStarted) { + this.saikuStarted = saikuStarted; + } + + @Override + public void destroy() throws Exception { + try { + stopSaiku(); + } catch (SaikuExecutionException e) { + logger.error("Error while trying to quite Saiku before destroying the bean", e); //$NON-NLS-1$ + } + } + + @Override + public LocalPropertiesService getLocalPropertiesService() { + return localPropertiesService; + } + + @Override + public EarthSurveyService getEarthSurveyService() { + return earthSurveyService; + } + + @Override + public RDBExporter getRdbExporter() { + return rdbExporter; + } + } \ No newline at end of file From f96e8e3377c474df3f9d80ffd7c596aa19dfd08e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:27 +0100 Subject: [PATCH 0113/1620] New translations AnalysisSaikuService.java (English) --- .../earth/app/view/Messages_en.properties | 882 +++++++++++++----- 1 file changed, 626 insertions(+), 256 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index de96e18020..cba7f5812d 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,361 +1,731 @@ -package org.openforis.collect.earth.app.server; - +package org.openforis.collect.earth.app.service; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashMap; import java.util.List; import java.util.Map; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.openforis.collect.earth.app.service.BrowserService; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.KmlGeneratorService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; -import org.openforis.collect.earth.sampler.processor.KmlGenerator; -import org.openforis.collect.earth.sampler.utils.KmlGenerationException; -import org.openforis.idm.metamodel.AttributeDefinition; -import org.opengis.referencing.operation.TransformException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import javax.swing.SwingUtilities; + +import org.apache.commons.lang3.SystemUtils; +import org.apache.commons.text.StringEscapeUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; +import org.openforis.collect.earth.app.ad_hoc.AluToolUtils; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.model.AspectCode; +import org.openforis.collect.earth.app.model.DynamicsCode; +import org.openforis.collect.earth.app.model.SlopeCode; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; +import org.openforis.collect.model.CollectSurvey; +import org.openforis.collect.relational.CollectRDBPublisher; +import org.openforis.collect.relational.CollectRdbException; +import org.openforis.concurrency.Progress; +import org.openforis.idm.metamodel.NodeDefinition; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Component; import com.opencsv.CSVReader; -/** - * Servlet to return the information that is stored in Collect Earth for one - * placemark (plot) - * - * @author Alfonso Sanchez-Paus Diaz - * - */ -@Controller -public class PlacemarkBrowserServlet { - @Autowired - private BrowserService browserService; +import freemarker.template.TemplateException; + +@Component +public class AnalysisSaikuService extends GenerateDatabase implements DisposableBean{ + + private static final String PLOT_ADD = "plot ADD "; + + private static final String UPDATE = "UPDATE "; + + private static final String UNKNOWN = "Unknown"; + + private static final String VARCHAR_5 = " VARCHAR(5)"; + + private static final String INTEGER = " INTEGER"; + + private static final String ALTER_TABLE = "ALTER TABLE "; + + private static final String INSERT_INTO = "INSERT INTO "; + + private static final String CREATE_TABLE = "CREATE TABLE "; + + private static final String ALU_CLIMATE_ZONE_CODE = "alu_climate_zone_code"; //$NON-NLS-1$ + + private static final String ALU_SOIL_TYPE_CODE = "alu_soil_type_code"; //$NON-NLS-1$ + + private static final String ALU_SUBCLASS_CODE = "alu_subclass_code"; //$NON-NLS-1$ + + private static final String DYNAMICS_ID = "dynamics_id"; //$NON-NLS-1$ + + private static final String ELEVATION_ID = "elevation_id"; //$NON-NLS-1$ + + private static final String SLOPE_ID = "slope_id"; //$NON-NLS-1$ + + private static final String ASPECT_ID = "aspect_id"; //$NON-NLS-1$ + + private static final String START_SAIKU = "start-saiku"; //$NON-NLS-1$ + + private static final String STOP_SAIKU = "stop-saiku"; //$NON-NLS-1$ + + private static final String COMMAND_SUFFIX_BAT = ".bat"; //$NON-NLS-1$ + + private static final String COMMAND_SUFFIX_SH = ".sh"; //$NON-NLS-1$ + + public static final String COLLECT_EARTH_DATABASE_RDB_DB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + + EarthConstants.SAIKU_RDB_SUFFIX; + @Autowired - private EarthSurveyService earthSurveyService; + RDBExporter rdbExporter; @Autowired - private LocalPropertiesService localPropertiesService; + CollectRDBPublisher collectRDBPublisher; @Autowired - private KmlGeneratorService kmlGeneratorService; + EarthSurveyService earthSurveyService; - private KmlGenerator kmlGenerator; + @Autowired + public LocalPropertiesService localPropertiesService; - private SimplePlacemarkObject lastPlacemark = null; + @Autowired + BrowserService browserService; - private final Logger logger = LoggerFactory.getLogger( PlacemarkBrowserServlet.class ); + @Autowired + private RegionCalculationUtils regionCalculation; - private final class OpenBrowserThread extends Thread { + @Autowired + private SchemaService schemaNamingService; + + private static final int ELEVATION_RANGE = 100; - private SimplePlacemarkObject placemarkObject; + private RemoteWebDriver saikuWebDriver; - private OpenBrowserThread(String name, SimplePlacemarkObject placemarkObject) { - super(name); - this.placemarkObject = placemarkObject; - } + private static final String SQLITE_FREEMARKER_HTML_TEMPLATE = "resources" + File.separator //$NON-NLS-1$ + + "collectEarthSqliteDS.fmt"; //$NON-NLS-1$ + private static final String POSTGRESQL_FREEMARKER_HTML_TEMPLATE = "resources" + File.separator //$NON-NLS-1$ + + "collectEarthPostgreSqlDS.fmt"; //$NON-NLS-1$ + public static final String MDX_XML = "collectEarthCubes.xml"; //$NON-NLS-1$ + private static final String MDX_TEMPLATE = MDX_XML + ".fmt"; //$NON-NLS-1$ - @Override - public void run() { - // If this is the first plot or the plot is the last one that - // was opened - if (lastPlacemark == null - || !lastPlacemark.equals( placemarkObject ) ) { + private boolean saikuStarted; - try { - kmlGenerator.fillSamplePoints(placemarkObject); + private void assignDimensionValues() { + try { + final String schemaName = getSchemaPrefix(); + // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id + final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query( + "SELECT " + EarthConstants.PLOT_ID + ", elevation, slope, aspect FROM " + schemaName + "plot", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + new RowMapper() { + @Override + public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { - kmlGenerator.fillExternalLine(placemarkObject); + final Object[] updateValues = new Object[4]; - openGEEAppWindow(placemarkObject); + Integer aspect = AspectCode.NA.getId(); + if (AspectCode.getAspectCode(rs.getDouble("aspect")) != null) { //$NON-NLS-1$ + aspect = AspectCode.getAspectCode(rs.getDouble("aspect")).getId(); //$NON-NLS-1$ + } - openGEECodeEditorWindow(placemarkObject); + Integer slope = SlopeCode.NA.getId(); - openEarthMapWindow( placemarkObject ); + if (SlopeCode.getSlopeCode((int) rs.getFloat("slope")) != null) { //$NON-NLS-1$ + slope = SlopeCode.getSlopeCode((int) rs.getFloat("slope")).getId(); //$NON-NLS-1$ + } - openTimeLapseWindow(placemarkObject); + updateValues[0] = aspect; + updateValues[1] = slope; + updateValues[2] = ( (int) rs.getFloat("elevation") / ELEVATION_RANGE) + 1; // 0 //$NON-NLS-1$ - openBingMapsWindow(placemarkObject); + updateValues[3] = rs.getLong(EarthConstants.PLOT_ID); + return updateValues; + } - openBaiduMapsWindow(placemarkObject); + }); - openYandexMapsWindow(placemarkObject); + rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + ASPECT_ID + "=?," + SLOPE_ID + "=?," //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + ELEVATION_ID + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (Exception e) { + logger.warn("No DEM information", e); //$NON-NLS-1$ + } + } - openExtraMapWindow(placemarkObject); + private String getSchemaPrefix() { + return schemaNamingService.getSchemaPrefix(ExportType.SAIKU); + } - openStreetViewWindow(placemarkObject); + private void assignPngAluToolDimensionValues() { + try { + if (earthSurveyService.getCollectSurvey().getName().toLowerCase().contains("png")) { //$NON-NLS-1$ + final String schemaName = getSchemaPrefix(); + // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id + final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query("SELECT " + EarthConstants.PLOT_ID //$NON-NLS-1$ + + ", elevation, soil_fundamental, land_use_subcategory, precipitation_ranges FROM " + schemaName //$NON-NLS-1$ + + "plot LEFT JOIN " + schemaName + "precipitation_ranges_code where " //$NON-NLS-1$ //$NON-NLS-2$ + + "plot.annual_precipitation_code_id=precipitation_ranges_code.precipitation_ranges_code_id", //$NON-NLS-1$ + new RowMapper() { + @Override + public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { + + final Object[] updateValues = new Object[3]; + + try { + AluToolUtils aluToolUtils = new AluToolUtils(); + + Integer elevation = rs.getInt("elevation"); //$NON-NLS-1$ + String soilFundamental = rs.getString("soil_fundamental"); //$NON-NLS-1$ + String precipitationRange = rs.getString("precipitation_ranges"); //$NON-NLS-1$ + + int precipitation = -1; + String climateZone = UNKNOWN; //$NON-NLS-1$ + if (precipitationRange != null) { + precipitation = aluToolUtils.getPrecipitationFromRange(precipitationRange); + boolean shortDrySeason = true; // According to information from Abe PNG has less + // than 5 months of dry season + climateZone = aluToolUtils.getClimateZone(elevation, precipitation, + shortDrySeason); + } + + String soilType = UNKNOWN; //$NON-NLS-1$ + if (soilFundamental != null) { + soilType = aluToolUtils.getSoilType(soilFundamental); + } + + updateValues[0] = climateZone; + updateValues[1] = soilType; + updateValues[2] = rs.getLong(EarthConstants.PLOT_ID); + } catch (Exception e) { + logger.error("Error while processing the data", e); //$NON-NLS-1$ + updateValues[0] = UNKNOWN; //$NON-NLS-1$ + updateValues[1] = UNKNOWN; //$NON-NLS-1$ + updateValues[2] = UNKNOWN; //$NON-NLS-1$ + } + return updateValues; + } + + }); + + rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + ALU_CLIMATE_ZONE_CODE + "=?," //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + ALU_SOIL_TYPE_CODE + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ //$NON-NLS-2$ + } + } catch (Exception e) { + logger.error("No PNG ALU information", e); //$NON-NLS-1$ + } + } - openPlanetMapsWindow(placemarkObject); + private void assignLUCDimensionValues() { + try { + final String schemaName = getSchemaPrefix(); + // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id + final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query( + "SELECT " + EarthConstants.PLOT_ID + ", land_use_subcategory FROM " + schemaName + "plot", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + new RowMapper() { + @Override + public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { + + AluToolUtils aluToolUtils = new AluToolUtils(); + final Object[] updateValues = new Object[3]; + + String collectEarthSubcategory = rs.getString("land_use_subcategory"); //$NON-NLS-1$ + Integer dynamics = DynamicsCode.getDynamicsCode(collectEarthSubcategory); + String subClass = UNKNOWN; //$NON-NLS-1$ + if (collectEarthSubcategory != null) { + subClass = aluToolUtils.getAluSubclass(collectEarthSubcategory); + } + + updateValues[0] = dynamics; + updateValues[1] = subClass; + updateValues[2] = rs.getLong(EarthConstants.PLOT_ID); + return updateValues; + } + + }); + + rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + DYNAMICS_ID + "=?," + ALU_SUBCLASS_CODE //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ + } catch (Exception e) { + logger.warn("No PNG Alu information available", e); //$NON-NLS-1$ + } + } - openSecureWatchWindow(placemarkObject); + private void createAspectAuxTable() { + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "aspect_category (" + ASPECT_ID //$NON-NLS-1$ //$NON-NLS-2$ + + " INTEGER PRIMARY KEY, aspect_caption TEXT);"); //$NON-NLS-1$ + final AspectCode[] aspects = AspectCode.values(); + for (final AspectCode aspectCode : aspects) { + rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "aspect_category values (" + aspectCode.getId() + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + aspectCode.getLabel() + "')"); //$NON-NLS-1$ + } + } - } catch (TransformException|KmlGenerationException e) { - logger.error("Error generating polygon", e ); - } - } + private void createElevationtAuxTable() { + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "elevation_category ( " + ELEVATION_ID //$NON-NLS-1$ //$NON-NLS-2$ + + " INTEGER PRIMARY KEY, elevation_caption TEXT);"); //$NON-NLS-1$ + final int slots = 9000 / ELEVATION_RANGE; // Highest mountain in the world, mount everest is + // 8820m high + for (int i = 1; i <= slots; i++) { + rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "elevation_category values (" + i + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + ((i - 1) * ELEVATION_RANGE) + "-" + i //$NON-NLS-1$ + * ELEVATION_RANGE + + "')"); //$NON-NLS-1$ + } - lastPlacemark = placemarkObject; + } + private void createDynamicsAuxTable() { + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "dynamics_category (" + DYNAMICS_ID //$NON-NLS-1$ //$NON-NLS-2$ + + " INTEGER PRIMARY KEY, dynamics_caption TEXT);"); //$NON-NLS-1$ + final DynamicsCode[] dynamicsCodes = DynamicsCode.values(); + for (final DynamicsCode dynamicsCode : dynamicsCodes) { + rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "dynamics_category values (" + dynamicsCode.getId() //$NON-NLS-1$ //$NON-NLS-2$ + + ", '" + dynamicsCode.getLabel() + "')"); //$NON-NLS-1$ //$NON-NLS-2$ } + } + private void createPlotForeignKeys() { + // Add aspect_id column to plot + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ASPECT_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + SLOPE_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ELEVATION_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + DYNAMICS_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } - public void openEarthMapWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Earth Map window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openEarthMapURL(placemarkObject); - } catch (final Exception e) { - logger.error("Exception opening Earth Map window", e); //$NON-NLS-1$ - } - } - }.start(); + private void createPngAluVariables() { + if (earthSurveyService.getCollectSurvey().getName().toLowerCase().contains("png")) { //$NON-NLS-1$ + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_SOIL_TYPE_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_CLIMATE_ZONE_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } + } - public void openGEECodeEditorWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open GEE Playground window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openGEECodeEditor(placemarkObject); - } catch (final Exception e) { - logger.error("Exception opening Earth Engine Playground window", e); //$NON-NLS-1$ - } - } - }.start(); + private void creatAluSubclassVariables() { + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_SUBCLASS_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + + private void createSlopeAuxTable() { + final String schemaName = getSchemaPrefix(); + // Slope can be from 0 to 90 + rdbExporter.getJdbcTemplate().execute( + CREATE_TABLE + schemaName + "slope_category (slope_id INTEGER PRIMARY KEY, slope_caption TEXT);"); //$NON-NLS-1$ //$NON-NLS-2$ + final SlopeCode[] slopeCodes = SlopeCode.values(); + for (final SlopeCode slopeCode : slopeCodes) { + rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "slope_category values (" + slopeCode.getId() + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + slopeCode.getLabel() + "')"); //$NON-NLS-1$ } + } - public void openGEEAppWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open GEE APP window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openGEEAppURL(placemarkObject); - } catch (final Exception e) { - logger.error("Exception opening Earth Engine APP window", e); //$NON-NLS-1$ - } + private String getSaikuConfigurationFilePath() { + + String configFile = localPropertiesService.getSaikuFolder() + "/" //$NON-NLS-1$ + + "tomcat/webapps/saiku/WEB-INF/classes/saiku-datasources/collectEarthDS"; //$NON-NLS-1$ + configFile = configFile.replace('/', File.separatorChar); + return configFile; + } + + private String getSaikuThreeConfigurationFilePath() { + + String configFile = localPropertiesService.getSaikuFolder() + "/" //$NON-NLS-1$ + + "tomcat/webapps/saiku/WEB-INF/classes/legacy-datasources/collectEarthDS"; //$NON-NLS-1$ + configFile = configFile.replace('/', File.separatorChar); + return configFile; + } + + private boolean isSaikuConfigured() { + return localPropertiesService.getSaikuFolder() != null + && isSaikuFolder(new File(localPropertiesService.getSaikuFolder())); + } + + /* + * private boolean isJavaHomeConfigured() { + * + * if (SystemUtils.IS_OS_MAC){ return true; } return ! ( StringUtils.isBlank( + * System.getenv("JAVA_HOME") ) //$NON-NLS-1$ && StringUtils.isBlank( + * System.getenv("JRE_HOME") ) //$NON-NLS-1$ && StringUtils.isBlank( + * System.getenv("COLLECT_EARTH_JRE_HOME") ) //$NON-NLS-1$ ); } + */ + + public boolean isSaikuFolder(File saikuFolder) { + boolean isSaikuFolder = false; + if (saikuFolder.listFiles() != null) { + for (final File file : saikuFolder.listFiles()) { + if (file.getName().equals(START_SAIKU + getCommandSuffix())) { + isSaikuFolder = true; } - }.start(); + } } + return isSaikuFolder; + } - public void openBingMapsWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Bing Maps window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openBingMaps(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Bing Maps window", e); //$NON-NLS-1$ - } - } - }.start(); + private void openSaiku() throws BrowserNotFoundException { + saikuWebDriver = browserService.navigateTo("http://127.0.0.1:8181", saikuWebDriver, false); //$NON-NLS-1$ + if (browserService.waitFor("username", saikuWebDriver)) { //$NON-NLS-1$ + saikuWebDriver.findElementByName("username").sendKeys("admin"); //$NON-NLS-1$ //$NON-NLS-2$ + saikuWebDriver.findElementByName("password").sendKeys("admin"); //$NON-NLS-1$ //$NON-NLS-2$ + saikuWebDriver.findElementByClassName("form_button").click(); //$NON-NLS-1$ } + } - public void openPlanetMapsWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Planet Maps window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openPlanetMaps(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Planet Maps window", e); //$NON-NLS-1$ - } - } - }.start(); - } + public void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws SaikuExecutionException { + + try { - public void openSecureWatchWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open SecureWatch window") { //$NON-NLS-1$ - @Override - public void run() { + stopSaiku(); + + try { + + if ((localPropertiesService.isUsingSqliteDB() && !getZippedProjectDB( ExportType.SAIKU ).exists()) + || isRefreshDatabase()) { + + // The user clicked on the option to refresh the database, or there is no + // previous copy of the Saiku DB + // Generate the DB file + rdbExporter.exportDataToRDB( + earthSurveyService.getCollectSurvey(), + ExportType.SAIKU, + progressListener, + this::processQuantityData + ); + try { - browserService.openSecureWatch(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening SecureWatch window", e); //$NON-NLS-1$ + // Save the DB file in a zipped file to extends GenerateDatabase keep for the next usages + replaceZippedProjectDB( ExportType.SAIKU ); + } catch (Exception e) { + logger.error("Error while refreshing the Zipped content of the project Saiku DB", e); } - } - }.start(); - } - public void openBaiduMapsWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Baidu Maps window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openBaiduMaps(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Baidu Maps window", e); //$NON-NLS-1$ + } else if (getZippedProjectDB(ExportType.SAIKU).exists() && localPropertiesService.isUsingSqliteDB()) { + // If the zipped version of the project exists ( and the user clicked on the + // option to not refresh it) then restore this last version of the data + restoreZippedProjectDB(ExportType.SAIKU); + } - } + refreshDataSourceForSaiku(); + + if (startSaikuAfterDBExport && !isUserCancelledOperation()) { + startSaiku(); + new Thread("Opening Saiku") { + @Override + public void run() { + try { + AnalysisSaikuService.this.openSaiku(); + } catch (BrowserNotFoundException e) { + logger.error("No browser has been set up", e); //$NON-NLS-1$ + } + }; + }.start(); + + stopSaikuOnExit(); } + } catch (final IOException e) { + logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ + } catch (TemplateException e1) { + logger.error("Error while applying the freemarker template tothe Saiku data source", e1); //$NON-NLS-1$ + } - }.start(); + } catch (final CollectRdbException e) { + logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ } + } - public void openYandexMapsWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Yandex Maps window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openYandexMaps(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Yandex Maps window", e); //$NON-NLS-1$ + private void processQuantityData(InfiniteProgressMonitor progressListener) { - } - } + SwingUtilities.invokeLater( () -> progressListener.setMessage("Preparing Saiku data for analysis") ); - }.start(); - } + progressListener.progressMade(new Progress(0, 100)); + createPngAluVariables(); + createPlotForeignKeys(); - public void openExtraMapWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Expa Map window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openExtraMap(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Extra Map window", e); //$NON-NLS-1$ + progressListener.progressMade(new Progress(25, 100)); - } - } + if (!surveyContains("calculated_elevation_range", earthSurveyService.getCollectSurvey())) { + createAspectAuxTable(); + createSlopeAuxTable(); + createElevationtAuxTable(); + assignDimensionValues(); - }.start(); } + progressListener.progressMade(new Progress(50, 100)); - public void openStreetViewWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Street View window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openStreetView(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Street View window", e); //$NON-NLS-1$ - - } - } + if (!surveyContains("calculated_initial_land_use", earthSurveyService.getCollectSurvey())) { + createDynamicsAuxTable(); + creatAluSubclassVariables(); + assignLUCDimensionValues(); - }.start(); } + progressListener.progressMade(new Progress(75, 100)); - public void openTimeLapseWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open TimeLapse window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openTimelapse(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Earth Engine window", e); //$NON-NLS-1$ + assignPngAluToolDimensionValues(); - } - } + SwingUtilities.invokeLater( () -> progressListener.setMessage("Calculating expansion factors") ); - }.start(); - } + regionCalculation.handleRegionCalculation( ExportType.SAIKU, rdbExporter.getJdbcTemplate() ); + progressListener.progressMade(new Progress(100, 100)); } + public static boolean surveyContains(String nodeName, CollectSurvey survey) { + NodeDefinition nodeDefForNAme = survey.getSchema().findNodeDefinition( nodeDef -> nodeDef.getName().equals(nodeName) ); + return nodeDefForNAme != null; + } - /* - * Opens the extra browser windows for Earth Engine, Timelapse and Bing. (non-Javadoc) - * - * @see - * org.openforis.collect.earth.app.server.JsonPocessorServlet#processRequest - * (javax.servlet.http.HttpServletRequest, - * javax.servlet.http.HttpServletResponse) - */ - @GetMapping(path = "/openAuxiliaryWindows") - public void openAuxiliaryWindows( - HttpServletResponse response, - @RequestParam(value = "latLongCoordinates", required = false) final String latLongCoordinates) - { + public static CSVReader getCsvReader(String csvFile) throws FileNotFoundException { + final BufferedReader bufferedReader = new BufferedReader( + new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 ) ); //$NON-NLS-1$ + return new CSVReader(bufferedReader); + } + + private void refreshDataSourceForSaiku() throws IOException, TemplateException { + final File mdxFile = new File(localPropertiesService.getProjectFolder() + File.separatorChar + MDX_XML); + + Map data = new HashMap<>(); + data.put("cubeFilePath", StringEscapeUtils.escapeJava(mdxFile.getAbsolutePath().replace('\\', '/'))); //$NON-NLS-1$ + + final File mdxTemplate = getMdxTemplate(); + final File dataSourceTemplate = getDataSourceTemplate(data); + + // First try Saiku 2.5/2.6 + File dataSourceFile; try { - SimplePlacemarkObject placemarkObject = new SimplePlacemarkObject(latLongCoordinates.split(",") ); - OpenBrowserThread browserThread = new OpenBrowserThread("Open auxiliary windows " + latLongCoordinates, placemarkObject); - browserThread.start(); + dataSourceFile = new File(getSaikuConfigurationFilePath()); + FreemarkerTemplateUtils.applyTemplate(dataSourceTemplate, dataSourceFile, data); } catch (Exception e) { - logger.error("Error loading browsers " , e); + logger.error("Error starting Saiku", e); + dataSourceFile = new File(getSaikuThreeConfigurationFilePath()); + FreemarkerTemplateUtils.applyTemplate(dataSourceTemplate, dataSourceFile, data); + } + + setMdxSaikuSchema(mdxTemplate, mdxFile); + } + + private File getMdxTemplate() throws IOException { + final File mdxFileTemplate = new File( + localPropertiesService.getProjectFolder() + File.separatorChar + MDX_TEMPLATE); + if (!mdxFileTemplate.exists()) { + throw new IOException( + "The file containing the MDX Cube definition Template does not exist in expected location " //$NON-NLS-1$ + + mdxFileTemplate.getAbsolutePath()); + } + return mdxFileTemplate; + } + + private File getDataSourceTemplate(Map data) throws IOException { + File dataSourceTemplate = null; + + if (localPropertiesService.isUsingSqliteDB()) { + dataSourceTemplate = new File(SQLITE_FREEMARKER_HTML_TEMPLATE); + final File rdbDb = rdbExporter.getRdbFile( ExportType.SAIKU ); + if (!rdbDb.exists()) { + throw new IOException( + "The file contianing the Relational SQLite Database does not exist in expected location " //$NON-NLS-1$ + + rdbDb.getAbsolutePath()); + } + data.put("rdbFilePath", StringEscapeUtils.escapeJava(rdbDb.getAbsolutePath().replace('\\', '/'))); //$NON-NLS-1$ + } else { + dataSourceTemplate = new File(POSTGRESQL_FREEMARKER_HTML_TEMPLATE); + CollectDBDriver collectDBDriver = localPropertiesService.getCollectDBDriver(); + data.put("dbUrl", StringEscapeUtils.escapeJava(ServerController.getSaikuDbURL(collectDBDriver))); //$NON-NLS-1$ + data.put("username", //$NON-NLS-1$ + StringEscapeUtils.escapeJava(localPropertiesService.getValue(EarthProperty.DB_USERNAME))); + data.put("password", //$NON-NLS-1$ + StringEscapeUtils.escapeJava(localPropertiesService.getValue(EarthProperty.DB_PASSWORD))); + } + + if (!dataSourceTemplate.exists()) { + throw new IOException( + "The file containing the Saiku Data Source template does not exist in expected location " //$NON-NLS-1$ + + dataSourceTemplate.getAbsolutePath()); } + + return dataSourceTemplate; } - @GetMapping(path = "/ancillaryWindows") - public void openAuxiliaryWindowsNew(HttpServletResponse response, HttpServletRequest request) { + private void setMdxSaikuSchema(final File mdxFileTemplate, final File mdxFile) + throws IOException, TemplateException { + Map saikuData = new HashMap<>(); + String saikuSchemaName = getSchemaName(); + if (saikuSchemaName == null) { + saikuSchemaName = ""; //$NON-NLS-1$ + } + saikuData.put("saikuDbSchema", saikuSchemaName); //$NON-NLS-1$ + FreemarkerTemplateUtils.applyTemplate(mdxFileTemplate, mdxFile, saikuData); + } + private void runSaikuBat(String commandName) throws SaikuExecutionException { + if (!isSaikuConfigured()) { + throw new SaikuExecutionException("The Saiku server is not configured."); //$NON-NLS-1$ + } + + else { + String saikuCmd = localPropertiesService.getSaikuFolder() + File.separator + commandName + + getCommandSuffix(); - List keyAttributeDefinitions = earthSurveyService - .getRootEntityDefinition() - .getKeyAttributeDefinitions(); + if (SystemUtils.IS_OS_WINDOWS) { + saikuCmd = "\"" + saikuCmd + "\""; //$NON-NLS-1$ //$NON-NLS-2$ + } - // the keys should the the parameter names - Map keys = request.getParameterMap(); + try { - String[] keysInOrder = new String[keys.size()]; - for (int i = 0; i < keyAttributeDefinitions.size(); i++) { - keysInOrder[i] = keys.get(keyAttributeDefinitions.get(i).getName())[0]; + Process runSaiku = runProcessBuilder(new String[] { saikuCmd }); + + if (commandName.equals(STOP_SAIKU)) { + int result = runSaiku.waitFor(); + logger.warn("Script ended with result {}", result); //$NON-NLS-1$ + } else if (commandName.equals(START_SAIKU)) { + Thread.sleep(6000); + } + + } catch (final IOException e) { + logger.error("Error when running Saiku start/stop command", e); //$NON-NLS-1$ + } catch (InterruptedException e) { + logger.error("Error while waiting to start", e); //$NON-NLS-1$ + Thread.currentThread().interrupt(); + } } + } - try { - kmlGenerator = kmlGeneratorService.getKmlGenerator(); + private void setMacJreHome(ProcessBuilder p) { + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX || SystemUtils.IS_OS_LINUX) { - String[] csvValues = getValuesFromCsv(keysInOrder); + File javaFolder = new File("./java"); - if( csvValues == null ){ - throw new IllegalArgumentException("The keys " + keys.toString() + " are not present on the CSV file with the plot locations!!!"); + if (!javaFolder.exists()) { + String userName = System.getProperty("user.name"); + String testWithPath = "/Users/" + userName + "/OpenForis/CollectEarth/java"; + File testJavaPath = new File(testWithPath); + if (testJavaPath.exists()) { + javaFolder = testJavaPath; + } } - SimplePlacemarkObject placemarkObject = kmlGenerator.getPlotObject(csvValues, null, earthSurveyService.getCollectSurvey() ); - OpenBrowserThread browserThread = new OpenBrowserThread("Open ancillary windows - polygon ", placemarkObject ); - browserThread.start(); - } catch (Exception e) { - logger.error("Error loading browsers " , e); + Map environment = p.environment(); + environment.put("COLLECT_EARTH_JRE_HOME", javaFolder.getAbsolutePath()); + + /* + * // In MAC the environment variable COLLECT_EARTH_JRE_HOME is not accesible + * from outside the bash, set it again! if( SystemUtils.IS_OS_MAC || + * SystemUtils.IS_OS_MAC_OSX){ try { File javaFolder = new File("./java"); + * + * if( !javaFolder.exists() ){ String userName = + * System.getProperty("user.name"); String testWithPath = "/Users/"+userName + + * "/OpenForis/CollectEarth/java"; File testJavaPath = new File(testWithPath); + * if( testJavaPath.exists()){ javaFolder = testJavaPath; } } + * + * Process setEnv = runProcessBuilder(new String[] { "/bin/bash", "setenv", + * "COLLECT_EARTH_JRE_HOME=\""+ javaFolder.getAbsolutePath() +"\"" }); + * setEnv.waitFor(); } catch (final IOException e) { + * logger.error("Error setting the COLLECT_EARTH_JRE_HOME environment variable", + * e); //$NON-NLS-1$ } catch (InterruptedException e) { + * logger.error("Error when running COLLECT_EARTH_JRE_HOME environment variable" + * , e); //$NON-NLS-1$ } } + */ } + } + + private Process runProcessBuilder(String[] cmd) throws IOException { + final ProcessBuilder builder = new ProcessBuilder(cmd); + + // Fixes bug with Mac OS X not using the environemnt variable set for bash + setMacJreHome(builder); + + builder.directory(new File(localPropertiesService.getSaikuFolder()).getAbsoluteFile()); + builder.redirectErrorStream(true); + Process p = builder.start(); + (new ProcessLoggerThread(p.getInputStream(), Boolean.FALSE)).start(); + (new ProcessLoggerThread(p.getErrorStream(), Boolean.TRUE)).start(); + return p; + } + private String getCommandSuffix() { + if (SystemUtils.IS_OS_WINDOWS) { + return COMMAND_SUFFIX_BAT; + } else { + return COMMAND_SUFFIX_SH; + } } - private String[] getValuesFromCsv(String[] keysInOrder) { + private void startSaiku() throws SaikuExecutionException { + logger.warn( + "Starting the Saiku server {}{}{}", localPropertiesService.getSaikuFolder(), File.separator, START_SAIKU); //$NON-NLS-1$ - final String csvFile = localPropertiesService.getCsvFile(); - try ( - CSVReader reader = CsvReaderUtils.getCsvReader( csvFile ); - ){ + runSaikuBat(START_SAIKU); + this.setSaikuStarted(true); - String[] csvRow; - int numberOfKeys = keysInOrder.length; - while ((csvRow = reader.readNext()) != null) { - boolean foundIt = true; - for( int idx=0; idx Date: Tue, 29 Nov 2022 12:23:28 +0100 Subject: [PATCH 0114/1620] New translations BackupSqlLiteService.java (French) --- .../earth/app/view/Messages_fr.properties | 755 ++---------------- 1 file changed, 83 insertions(+), 672 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index cba7f5812d..8c14343c96 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,731 +1,142 @@ package org.openforis.collect.earth.app.service; -import java.io.BufferedReader; import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.IOException; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.SystemUtils; -import org.apache.commons.text.StringEscapeUtils; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Date; + +import org.apache.commons.dbcp.BasicDataSource; +import org.openforis.collect.earth.app.CollectEarthUtils; import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; -import org.openforis.collect.earth.app.ad_hoc.AluToolUtils; -import org.openforis.collect.earth.app.desktop.ServerController; -import org.openforis.collect.earth.app.model.AspectCode; -import org.openforis.collect.earth.app.model.DynamicsCode; -import org.openforis.collect.earth.app.model.SlopeCode; import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; -import org.openforis.collect.model.CollectSurvey; -import org.openforis.collect.relational.CollectRDBPublisher; -import org.openforis.collect.relational.CollectRdbException; -import org.openforis.concurrency.Progress; -import org.openforis.idm.metamodel.NodeDefinition; -import org.openqa.selenium.remote.RemoteWebDriver; -import org.springframework.beans.factory.DisposableBean; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.RowMapper; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; -import com.opencsv.CSVReader; +import net.lingala.zip4j.ZipFile; -import freemarker.template.TemplateException; +/** + * Spring managed bean that handles the creation of backups of the Collect database. + * The SQLite database file will be saved everytime the application closes. + * A maximum of 10 copies (the last ten times the application was used) will be saved on the backupCollectEarth folder on the users application data folder (OS dependant). + * @author Alfonso Sanchez-Paus Diaz + * + */ @Component -public class AnalysisSaikuService extends GenerateDatabase implements DisposableBean{ - - private static final String PLOT_ADD = "plot ADD "; - - private static final String UPDATE = "UPDATE "; - - private static final String UNKNOWN = "Unknown"; - - private static final String VARCHAR_5 = " VARCHAR(5)"; - - private static final String INTEGER = " INTEGER"; - - private static final String ALTER_TABLE = "ALTER TABLE "; - - private static final String INSERT_INTO = "INSERT INTO "; - - private static final String CREATE_TABLE = "CREATE TABLE "; - - private static final String ALU_CLIMATE_ZONE_CODE = "alu_climate_zone_code"; //$NON-NLS-1$ - - private static final String ALU_SOIL_TYPE_CODE = "alu_soil_type_code"; //$NON-NLS-1$ +@Lazy(false) +public class BackupSqlLiteService implements InitializingBean{ - private static final String ALU_SUBCLASS_CODE = "alu_subclass_code"; //$NON-NLS-1$ - - private static final String DYNAMICS_ID = "dynamics_id"; //$NON-NLS-1$ - - private static final String ELEVATION_ID = "elevation_id"; //$NON-NLS-1$ - - private static final String SLOPE_ID = "slope_id"; //$NON-NLS-1$ - - private static final String ASPECT_ID = "aspect_id"; //$NON-NLS-1$ - - private static final String START_SAIKU = "start-saiku"; //$NON-NLS-1$ - - private static final String STOP_SAIKU = "stop-saiku"; //$NON-NLS-1$ - - private static final String COMMAND_SUFFIX_BAT = ".bat"; //$NON-NLS-1$ - - private static final String COMMAND_SUFFIX_SH = ".sh"; //$NON-NLS-1$ - - public static final String COLLECT_EARTH_DATABASE_RDB_DB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB - + EarthConstants.SAIKU_RDB_SUFFIX; + private static final String BACKUP_COLLECT_EARTH = "backupSqlite"; //$NON-NLS-1$ + private static final int MAXIMUM_NUMBER_OF_BACKUPS = 10; @Autowired - RDBExporter rdbExporter; + BasicDataSource dataSource; @Autowired - CollectRDBPublisher collectRDBPublisher; - - @Autowired - EarthSurveyService earthSurveyService; - - @Autowired - public LocalPropertiesService localPropertiesService; - - @Autowired - BrowserService browserService; - - @Autowired - private RegionCalculationUtils regionCalculation; - - @Autowired - private SchemaService schemaNamingService; - - private static final int ELEVATION_RANGE = 100; - - private RemoteWebDriver saikuWebDriver; - - private static final String SQLITE_FREEMARKER_HTML_TEMPLATE = "resources" + File.separator //$NON-NLS-1$ - + "collectEarthSqliteDS.fmt"; //$NON-NLS-1$ - private static final String POSTGRESQL_FREEMARKER_HTML_TEMPLATE = "resources" + File.separator //$NON-NLS-1$ - + "collectEarthPostgreSqlDS.fmt"; //$NON-NLS-1$ - public static final String MDX_XML = "collectEarthCubes.xml"; //$NON-NLS-1$ - private static final String MDX_TEMPLATE = MDX_XML + ".fmt"; //$NON-NLS-1$ - - private boolean saikuStarted; - - private void assignDimensionValues() { - try { - final String schemaName = getSchemaPrefix(); - // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id - final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query( - "SELECT " + EarthConstants.PLOT_ID + ", elevation, slope, aspect FROM " + schemaName + "plot", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - new RowMapper() { - @Override - public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { - - final Object[] updateValues = new Object[4]; - - Integer aspect = AspectCode.NA.getId(); - if (AspectCode.getAspectCode(rs.getDouble("aspect")) != null) { //$NON-NLS-1$ - aspect = AspectCode.getAspectCode(rs.getDouble("aspect")).getId(); //$NON-NLS-1$ - } - - Integer slope = SlopeCode.NA.getId(); - - if (SlopeCode.getSlopeCode((int) rs.getFloat("slope")) != null) { //$NON-NLS-1$ - slope = SlopeCode.getSlopeCode((int) rs.getFloat("slope")).getId(); //$NON-NLS-1$ - } - - updateValues[0] = aspect; - updateValues[1] = slope; - updateValues[2] = ( (int) rs.getFloat("elevation") / ELEVATION_RANGE) + 1; // 0 //$NON-NLS-1$ - - updateValues[3] = rs.getLong(EarthConstants.PLOT_ID); - return updateValues; - } - - }); - - rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + ASPECT_ID + "=?," + SLOPE_ID + "=?," //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - + ELEVATION_ID + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (Exception e) { - logger.warn("No DEM information", e); //$NON-NLS-1$ - } - } - - private String getSchemaPrefix() { - return schemaNamingService.getSchemaPrefix(ExportType.SAIKU); - } - - private void assignPngAluToolDimensionValues() { - try { - if (earthSurveyService.getCollectSurvey().getName().toLowerCase().contains("png")) { //$NON-NLS-1$ - final String schemaName = getSchemaPrefix(); - // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id - final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query("SELECT " + EarthConstants.PLOT_ID //$NON-NLS-1$ - + ", elevation, soil_fundamental, land_use_subcategory, precipitation_ranges FROM " + schemaName //$NON-NLS-1$ - + "plot LEFT JOIN " + schemaName + "precipitation_ranges_code where " //$NON-NLS-1$ //$NON-NLS-2$ - + "plot.annual_precipitation_code_id=precipitation_ranges_code.precipitation_ranges_code_id", //$NON-NLS-1$ - new RowMapper() { - @Override - public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { - - final Object[] updateValues = new Object[3]; - - try { - AluToolUtils aluToolUtils = new AluToolUtils(); - - Integer elevation = rs.getInt("elevation"); //$NON-NLS-1$ - String soilFundamental = rs.getString("soil_fundamental"); //$NON-NLS-1$ - String precipitationRange = rs.getString("precipitation_ranges"); //$NON-NLS-1$ - - int precipitation = -1; - String climateZone = UNKNOWN; //$NON-NLS-1$ - if (precipitationRange != null) { - precipitation = aluToolUtils.getPrecipitationFromRange(precipitationRange); - boolean shortDrySeason = true; // According to information from Abe PNG has less - // than 5 months of dry season - climateZone = aluToolUtils.getClimateZone(elevation, precipitation, - shortDrySeason); - } - - String soilType = UNKNOWN; //$NON-NLS-1$ - if (soilFundamental != null) { - soilType = aluToolUtils.getSoilType(soilFundamental); - } - - updateValues[0] = climateZone; - updateValues[1] = soilType; - updateValues[2] = rs.getLong(EarthConstants.PLOT_ID); - } catch (Exception e) { - logger.error("Error while processing the data", e); //$NON-NLS-1$ - updateValues[0] = UNKNOWN; //$NON-NLS-1$ - updateValues[1] = UNKNOWN; //$NON-NLS-1$ - updateValues[2] = UNKNOWN; //$NON-NLS-1$ - } - return updateValues; - } - - }); - - rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + ALU_CLIMATE_ZONE_CODE + "=?," //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + ALU_SOIL_TYPE_CODE + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ //$NON-NLS-2$ - } - } catch (Exception e) { - logger.error("No PNG ALU information", e); //$NON-NLS-1$ - } - } - - private void assignLUCDimensionValues() { - try { - final String schemaName = getSchemaPrefix(); - // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id - final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query( - "SELECT " + EarthConstants.PLOT_ID + ", land_use_subcategory FROM " + schemaName + "plot", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - new RowMapper() { - @Override - public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { - - AluToolUtils aluToolUtils = new AluToolUtils(); - final Object[] updateValues = new Object[3]; - - String collectEarthSubcategory = rs.getString("land_use_subcategory"); //$NON-NLS-1$ - Integer dynamics = DynamicsCode.getDynamicsCode(collectEarthSubcategory); - String subClass = UNKNOWN; //$NON-NLS-1$ - if (collectEarthSubcategory != null) { - subClass = aluToolUtils.getAluSubclass(collectEarthSubcategory); - } - - updateValues[0] = dynamics; - updateValues[1] = subClass; - updateValues[2] = rs.getLong(EarthConstants.PLOT_ID); - return updateValues; - } - - }); - - rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + DYNAMICS_ID + "=?," + ALU_SUBCLASS_CODE //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ - } catch (Exception e) { - logger.warn("No PNG Alu information available", e); //$NON-NLS-1$ - } - } + private LocalPropertiesService localPropertiesService; - private void createAspectAuxTable() { - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "aspect_category (" + ASPECT_ID //$NON-NLS-1$ //$NON-NLS-2$ - + " INTEGER PRIMARY KEY, aspect_caption TEXT);"); //$NON-NLS-1$ - final AspectCode[] aspects = AspectCode.values(); - for (final AspectCode aspectCode : aspects) { - rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "aspect_category values (" + aspectCode.getId() + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + aspectCode.getLabel() + "')"); //$NON-NLS-1$ - } - } - - private void createElevationtAuxTable() { - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "elevation_category ( " + ELEVATION_ID //$NON-NLS-1$ //$NON-NLS-2$ - + " INTEGER PRIMARY KEY, elevation_caption TEXT);"); //$NON-NLS-1$ - final int slots = 9000 / ELEVATION_RANGE; // Highest mountain in the world, mount everest is - // 8820m high - for (int i = 1; i <= slots; i++) { - rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "elevation_category values (" + i + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + ((i - 1) * ELEVATION_RANGE) + "-" + i //$NON-NLS-1$ - * ELEVATION_RANGE - + "')"); //$NON-NLS-1$ - } - - } - - private void createDynamicsAuxTable() { - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "dynamics_category (" + DYNAMICS_ID //$NON-NLS-1$ //$NON-NLS-2$ - + " INTEGER PRIMARY KEY, dynamics_caption TEXT);"); //$NON-NLS-1$ - final DynamicsCode[] dynamicsCodes = DynamicsCode.values(); - for (final DynamicsCode dynamicsCode : dynamicsCodes) { - rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "dynamics_category values (" + dynamicsCode.getId() //$NON-NLS-1$ //$NON-NLS-2$ - + ", '" + dynamicsCode.getLabel() + "')"); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - - private void createPlotForeignKeys() { - // Add aspect_id column to plot - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ASPECT_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + SLOPE_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ELEVATION_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + DYNAMICS_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } + private Logger logger = LoggerFactory.getLogger( BackupSqlLiteService.class ); - private void createPngAluVariables() { - if (earthSurveyService.getCollectSurvey().getName().toLowerCase().contains("png")) { //$NON-NLS-1$ - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_SOIL_TYPE_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_CLIMATE_ZONE_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - } - - private void creatAluSubclassVariables() { - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_SUBCLASS_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - - private void createSlopeAuxTable() { - final String schemaName = getSchemaPrefix(); - // Slope can be from 0 to 90 - rdbExporter.getJdbcTemplate().execute( - CREATE_TABLE + schemaName + "slope_category (slope_id INTEGER PRIMARY KEY, slope_caption TEXT);"); //$NON-NLS-1$ //$NON-NLS-2$ - final SlopeCode[] slopeCodes = SlopeCode.values(); - for (final SlopeCode slopeCode : slopeCodes) { - rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "slope_category values (" + slopeCode.getId() + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + slopeCode.getLabel() + "')"); //$NON-NLS-1$ - } - } - - private String getSaikuConfigurationFilePath() { - - String configFile = localPropertiesService.getSaikuFolder() + "/" //$NON-NLS-1$ - + "tomcat/webapps/saiku/WEB-INF/classes/saiku-datasources/collectEarthDS"; //$NON-NLS-1$ - configFile = configFile.replace('/', File.separatorChar); - return configFile; - } - - private String getSaikuThreeConfigurationFilePath() { - - String configFile = localPropertiesService.getSaikuFolder() + "/" //$NON-NLS-1$ - + "tomcat/webapps/saiku/WEB-INF/classes/legacy-datasources/collectEarthDS"; //$NON-NLS-1$ - configFile = configFile.replace('/', File.separatorChar); - return configFile; - } - - private boolean isSaikuConfigured() { - return localPropertiesService.getSaikuFolder() != null - && isSaikuFolder(new File(localPropertiesService.getSaikuFolder())); + @Override + public void afterPropertiesSet() throws Exception { + attachShutDownHook(); } - /* - * private boolean isJavaHomeConfigured() { - * - * if (SystemUtils.IS_OS_MAC){ return true; } return ! ( StringUtils.isBlank( - * System.getenv("JAVA_HOME") ) //$NON-NLS-1$ && StringUtils.isBlank( - * System.getenv("JRE_HOME") ) //$NON-NLS-1$ && StringUtils.isBlank( - * System.getenv("COLLECT_EARTH_JRE_HOME") ) //$NON-NLS-1$ ); } - */ - - public boolean isSaikuFolder(File saikuFolder) { - boolean isSaikuFolder = false; - if (saikuFolder.listFiles() != null) { - for (final File file : saikuFolder.listFiles()) { - if (file.getName().equals(START_SAIKU + getCommandSuffix())) { - isSaikuFolder = true; + private void attachShutDownHook() { + Runtime.getRuntime().addShutdownHook(new Thread("Shutdown hook - Backup Database") { + @Override + public void run() { + if ( "true".equals(localPropertiesService.getValue(EarthProperty.AUTOMATIC_BACKUP) ) ) { //$NON-NLS-1$ + automaticDBBackup(); } } - } - return isSaikuFolder; - } - private void openSaiku() throws BrowserNotFoundException { - saikuWebDriver = browserService.navigateTo("http://127.0.0.1:8181", saikuWebDriver, false); //$NON-NLS-1$ - if (browserService.waitFor("username", saikuWebDriver)) { //$NON-NLS-1$ - saikuWebDriver.findElementByName("username").sendKeys("admin"); //$NON-NLS-1$ //$NON-NLS-2$ - saikuWebDriver.findElementByName("password").sendKeys("admin"); //$NON-NLS-1$ //$NON-NLS-2$ - saikuWebDriver.findElementByClassName("form_button").click(); //$NON-NLS-1$ - } + }); } + private void automaticDBBackup() { + if( localPropertiesService.isUsingSqliteDB() ){ - public void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws SaikuExecutionException { + String pathToBackupZip = ""; //$NON-NLS-1$ - try { - - stopSaiku(); + String nameCollectDB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB; + File originalDBFile = new File(nameCollectDB); try { - if ((localPropertiesService.isUsingSqliteDB() && !getZippedProjectDB( ExportType.SAIKU ).exists()) - || isRefreshDatabase()) { - - // The user clicked on the option to refresh the database, or there is no - // previous copy of the Saiku DB - // Generate the DB file - rdbExporter.exportDataToRDB( - earthSurveyService.getCollectSurvey(), - ExportType.SAIKU, - progressListener, - this::processQuantityData - ); - - try { - // Save the DB file in a zipped file to extends GenerateDatabase keep for the next usages - replaceZippedProjectDB( ExportType.SAIKU ); - } catch (Exception e) { - logger.error("Error while refreshing the Zipped content of the project Saiku DB", e); - } + pathToBackupZip = getBackupZipFilename(); - } else if (getZippedProjectDB(ExportType.SAIKU).exists() && localPropertiesService.isUsingSqliteDB()) { - // If the zipped version of the project exists ( and the user clicked on the - // option to not refresh it) then restore this last version of the data - restoreZippedProjectDB(ExportType.SAIKU); + try( ZipFile zipFile = CollectEarthUtils.addFileToZip(pathToBackupZip, originalDBFile, EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME) ){ + removeExtraBackups(); } - refreshDataSourceForSaiku(); - - if (startSaikuAfterDBExport && !isUserCancelledOperation()) { - startSaiku(); - new Thread("Opening Saiku") { - @Override - public void run() { - try { - AnalysisSaikuService.this.openSaiku(); - } catch (BrowserNotFoundException e) { - logger.error("No browser has been set up", e); //$NON-NLS-1$ - } - }; - }.start(); - - stopSaikuOnExit(); - } - } catch (final IOException e) { - logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ - } catch (TemplateException e1) { - logger.error("Error while applying the freemarker template tothe Saiku data source", e1); //$NON-NLS-1$ + } catch (IOException e) { + logger.error("Error when create backup of the Collect Earth Database from " + nameCollectDB + " to " + pathToBackupZip, e); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (Exception e) { + logger.error("Error when zipping the Collect Earth Database from " + nameCollectDB + " to " + pathToBackupZip, e); //$NON-NLS-1$ //$NON-NLS-2$ } - - } catch (final CollectRdbException e) { - logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ } } - private void processQuantityData(InfiniteProgressMonitor progressListener) { - - SwingUtilities.invokeLater( () -> progressListener.setMessage("Preparing Saiku data for analysis") ); - - progressListener.progressMade(new Progress(0, 100)); - createPngAluVariables(); - createPlotForeignKeys(); - - progressListener.progressMade(new Progress(25, 100)); - - if (!surveyContains("calculated_elevation_range", earthSurveyService.getCollectSurvey())) { - createAspectAuxTable(); - createSlopeAuxTable(); - createElevationtAuxTable(); - assignDimensionValues(); - - } - progressListener.progressMade(new Progress(50, 100)); - - if (!surveyContains("calculated_initial_land_use", earthSurveyService.getCollectSurvey())) { - createDynamicsAuxTable(); - creatAluSubclassVariables(); - assignLUCDimensionValues(); - - } - progressListener.progressMade(new Progress(75, 100)); - - assignPngAluToolDimensionValues(); - - SwingUtilities.invokeLater( () -> progressListener.setMessage("Calculating expansion factors") ); - - regionCalculation.handleRegionCalculation( ExportType.SAIKU, rdbExporter.getJdbcTemplate() ); - progressListener.progressMade(new Progress(100, 100)); - + private String getBackupZipFilename() throws IOException { + File backupFolder = getAutomaticBackUpFolder(); + return getDBCopyName(backupFolder); } - public static boolean surveyContains(String nodeName, CollectSurvey survey) { - NodeDefinition nodeDefForNAme = survey.getSchema().findNodeDefinition( nodeDef -> nodeDef.getName().equals(nodeName) ); - return nodeDefForNAme != null; + public String getDBCopyName(File backupFolder) throws IOException { + String pathToBackup; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HHmmss"); //$NON-NLS-1$ + StringBuilder destPathStr = new StringBuilder(); + destPathStr.append(backupFolder.getCanonicalPath()); + destPathStr.append(File.separatorChar); + destPathStr.append( EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME); + destPathStr.append(sdf.format( new Date() )).append( ".zip"); + pathToBackup = destPathStr.toString(); + return pathToBackup; } - public static CSVReader getCsvReader(String csvFile) throws FileNotFoundException { - final BufferedReader bufferedReader = new BufferedReader( - new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 ) ); //$NON-NLS-1$ - return new CSVReader(bufferedReader); - } + private void removeExtraBackups() { - private void refreshDataSourceForSaiku() throws IOException, TemplateException { - final File mdxFile = new File(localPropertiesService.getProjectFolder() + File.separatorChar + MDX_XML); + File backupFolder = getAutomaticBackUpFolder(); - Map data = new HashMap<>(); - data.put("cubeFilePath", StringEscapeUtils.escapeJava(mdxFile.getAbsolutePath().replace('\\', '/'))); //$NON-NLS-1$ + File[] files = backupFolder.listFiles(); + if( files!=null && files.length > MAXIMUM_NUMBER_OF_BACKUPS ){ - final File mdxTemplate = getMdxTemplate(); - final File dataSourceTemplate = getDataSourceTemplate(data); - - // First try Saiku 2.5/2.6 - File dataSourceFile; - try { - dataSourceFile = new File(getSaikuConfigurationFilePath()); - FreemarkerTemplateUtils.applyTemplate(dataSourceTemplate, dataSourceFile, data); - } catch (Exception e) { - logger.error("Error starting Saiku", e); - dataSourceFile = new File(getSaikuThreeConfigurationFilePath()); - FreemarkerTemplateUtils.applyTemplate(dataSourceTemplate, dataSourceFile, data); - } - - setMdxSaikuSchema(mdxTemplate, mdxFile); - } - - private File getMdxTemplate() throws IOException { - final File mdxFileTemplate = new File( - localPropertiesService.getProjectFolder() + File.separatorChar + MDX_TEMPLATE); - if (!mdxFileTemplate.exists()) { - throw new IOException( - "The file containing the MDX Cube definition Template does not exist in expected location " //$NON-NLS-1$ - + mdxFileTemplate.getAbsolutePath()); - } - return mdxFileTemplate; - } - - private File getDataSourceTemplate(Map data) throws IOException { - File dataSourceTemplate = null; - - if (localPropertiesService.isUsingSqliteDB()) { - dataSourceTemplate = new File(SQLITE_FREEMARKER_HTML_TEMPLATE); - final File rdbDb = rdbExporter.getRdbFile( ExportType.SAIKU ); - if (!rdbDb.exists()) { - throw new IOException( - "The file contianing the Relational SQLite Database does not exist in expected location " //$NON-NLS-1$ - + rdbDb.getAbsolutePath()); - } - data.put("rdbFilePath", StringEscapeUtils.escapeJava(rdbDb.getAbsolutePath().replace('\\', '/'))); //$NON-NLS-1$ - } else { - dataSourceTemplate = new File(POSTGRESQL_FREEMARKER_HTML_TEMPLATE); - CollectDBDriver collectDBDriver = localPropertiesService.getCollectDBDriver(); - data.put("dbUrl", StringEscapeUtils.escapeJava(ServerController.getSaikuDbURL(collectDBDriver))); //$NON-NLS-1$ - data.put("username", //$NON-NLS-1$ - StringEscapeUtils.escapeJava(localPropertiesService.getValue(EarthProperty.DB_USERNAME))); - data.put("password", //$NON-NLS-1$ - StringEscapeUtils.escapeJava(localPropertiesService.getValue(EarthProperty.DB_PASSWORD))); - } - - if (!dataSourceTemplate.exists()) { - throw new IOException( - "The file containing the Saiku Data Source template does not exist in expected location " //$NON-NLS-1$ - + dataSourceTemplate.getAbsolutePath()); - } - - return dataSourceTemplate; - } - - private void setMdxSaikuSchema(final File mdxFileTemplate, final File mdxFile) - throws IOException, TemplateException { - Map saikuData = new HashMap<>(); - String saikuSchemaName = getSchemaName(); - if (saikuSchemaName == null) { - saikuSchemaName = ""; //$NON-NLS-1$ - } - saikuData.put("saikuDbSchema", saikuSchemaName); //$NON-NLS-1$ - FreemarkerTemplateUtils.applyTemplate(mdxFileTemplate, mdxFile, saikuData); - } - - private void runSaikuBat(String commandName) throws SaikuExecutionException { - if (!isSaikuConfigured()) { - throw new SaikuExecutionException("The Saiku server is not configured."); //$NON-NLS-1$ - } - - else { - String saikuCmd = localPropertiesService.getSaikuFolder() + File.separator + commandName - + getCommandSuffix(); - - if (SystemUtils.IS_OS_WINDOWS) { - saikuCmd = "\"" + saikuCmd + "\""; //$NON-NLS-1$ //$NON-NLS-2$ - } - - try { - - Process runSaiku = runProcessBuilder(new String[] { saikuCmd }); - - if (commandName.equals(STOP_SAIKU)) { - int result = runSaiku.waitFor(); - logger.warn("Script ended with result {}", result); //$NON-NLS-1$ - } else if (commandName.equals(START_SAIKU)) { - Thread.sleep(6000); - } - - } catch (final IOException e) { - logger.error("Error when running Saiku start/stop command", e); //$NON-NLS-1$ - } catch (InterruptedException e) { - logger.error("Error while waiting to start", e); //$NON-NLS-1$ - Thread.currentThread().interrupt(); - } - } - } - - private void setMacJreHome(ProcessBuilder p) { - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX || SystemUtils.IS_OS_LINUX) { - - File javaFolder = new File("./java"); + Arrays.sort(files, (o1,o2) -> { + if( o1.lastModified() < o2.lastModified() ){ + return 1; + }else if( o1.lastModified() == o2.lastModified() ){ + return 0; + }else{ + return -1; + } - if (!javaFolder.exists()) { - String userName = System.getProperty("user.name"); - String testWithPath = "/Users/" + userName + "/OpenForis/CollectEarth/java"; - File testJavaPath = new File(testWithPath); - if (testJavaPath.exists()) { - javaFolder = testJavaPath; } - } - - Map environment = p.environment(); - environment.put("COLLECT_EARTH_JRE_HOME", javaFolder.getAbsolutePath()); - - /* - * // In MAC the environment variable COLLECT_EARTH_JRE_HOME is not accesible - * from outside the bash, set it again! if( SystemUtils.IS_OS_MAC || - * SystemUtils.IS_OS_MAC_OSX){ try { File javaFolder = new File("./java"); - * - * if( !javaFolder.exists() ){ String userName = - * System.getProperty("user.name"); String testWithPath = "/Users/"+userName + - * "/OpenForis/CollectEarth/java"; File testJavaPath = new File(testWithPath); - * if( testJavaPath.exists()){ javaFolder = testJavaPath; } } - * - * Process setEnv = runProcessBuilder(new String[] { "/bin/bash", "setenv", - * "COLLECT_EARTH_JRE_HOME=\""+ javaFolder.getAbsolutePath() +"\"" }); - * setEnv.waitFor(); } catch (final IOException e) { - * logger.error("Error setting the COLLECT_EARTH_JRE_HOME environment variable", - * e); //$NON-NLS-1$ } catch (InterruptedException e) { - * logger.error("Error when running COLLECT_EARTH_JRE_HOME environment variable" - * , e); //$NON-NLS-1$ } } - */ - } - } - - private Process runProcessBuilder(String[] cmd) throws IOException { - final ProcessBuilder builder = new ProcessBuilder(cmd); - - // Fixes bug with Mac OS X not using the environemnt variable set for bash - setMacJreHome(builder); - - builder.directory(new File(localPropertiesService.getSaikuFolder()).getAbsoluteFile()); - builder.redirectErrorStream(true); - Process p = builder.start(); - (new ProcessLoggerThread(p.getInputStream(), Boolean.FALSE)).start(); - (new ProcessLoggerThread(p.getErrorStream(), Boolean.TRUE)).start(); - return p; - } - - private String getCommandSuffix() { - if (SystemUtils.IS_OS_WINDOWS) { - return COMMAND_SUFFIX_BAT; - } else { - return COMMAND_SUFFIX_SH; - } - } - - private void startSaiku() throws SaikuExecutionException { - logger.warn( - "Starting the Saiku server {}{}{}", localPropertiesService.getSaikuFolder(), File.separator, START_SAIKU); //$NON-NLS-1$ - - runSaikuBat(START_SAIKU); - - this.setSaikuStarted(true); - - logger.warn("Finished starting the Saiku server"); //$NON-NLS-1$ - } + ); - void stopSaiku() throws SaikuExecutionException { - logger.warn("Stoping the Saiku server {}{}{}", localPropertiesService.getSaikuFolder() , File.separator , STOP_SAIKU); //$NON-NLS-1$ - if (isSaikuStarted()) { - runSaikuBat(STOP_SAIKU); - this.setSaikuStarted(true); - } - logger.warn("Finished stoping the Saiku server"); //$NON-NLS-1$ - } - - private void stopSaikuOnExit() { - Runtime.getRuntime().addShutdownHook(new Thread("Shutting down Saiku on exit hook") { - @Override - public void run() { - try { - if (isSaikuStarted()) { - stopSaiku(); - } - } catch (final SaikuExecutionException e) { - logger.error("The Saiku server has been de-configured after it was started", e); //$NON-NLS-1$ + for( int i = MAXIMUM_NUMBER_OF_BACKUPS; i< files.length ; i++ ){ + if( !files[i].delete() ) { + logger.error( "Error deleteting file", files[i].getAbsolutePath() ); } } - }); - } - - private boolean isSaikuStarted() { - return saikuStarted; - } - - private void setSaikuStarted(boolean saikuStarted) { - this.saikuStarted = saikuStarted; - } - - @Override - public void destroy() throws Exception { - try { - stopSaiku(); - } catch (SaikuExecutionException e) { - logger.error("Error while trying to quite Saiku before destroying the bean", e); //$NON-NLS-1$ } - } - @Override - public LocalPropertiesService getLocalPropertiesService() { - return localPropertiesService; } - @Override - public EarthSurveyService getEarthSurveyService() { - return earthSurveyService; - } - @Override - public RDBExporter getRdbExporter() { - return rdbExporter; + /** + * Returns the folder where the backup copies should be placed. + * @return The OS dependent folder where the application should saved the backed up copies. + */ + public File getAutomaticBackUpFolder() { + return FolderFinder.createFolderInAppData( BACKUP_COLLECT_EARTH); } -} \ No newline at end of file +} From 99512ac8598e226a48a55cb1e55e123d88fd77ef Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:29 +0100 Subject: [PATCH 0115/1620] New translations BackupSqlLiteService.java (Spanish) --- .../earth/app/view/Messages_es.properties | 755 ++---------------- 1 file changed, 83 insertions(+), 672 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index cba7f5812d..8c14343c96 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,731 +1,142 @@ package org.openforis.collect.earth.app.service; -import java.io.BufferedReader; import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.IOException; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.SystemUtils; -import org.apache.commons.text.StringEscapeUtils; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Date; + +import org.apache.commons.dbcp.BasicDataSource; +import org.openforis.collect.earth.app.CollectEarthUtils; import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; -import org.openforis.collect.earth.app.ad_hoc.AluToolUtils; -import org.openforis.collect.earth.app.desktop.ServerController; -import org.openforis.collect.earth.app.model.AspectCode; -import org.openforis.collect.earth.app.model.DynamicsCode; -import org.openforis.collect.earth.app.model.SlopeCode; import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; -import org.openforis.collect.model.CollectSurvey; -import org.openforis.collect.relational.CollectRDBPublisher; -import org.openforis.collect.relational.CollectRdbException; -import org.openforis.concurrency.Progress; -import org.openforis.idm.metamodel.NodeDefinition; -import org.openqa.selenium.remote.RemoteWebDriver; -import org.springframework.beans.factory.DisposableBean; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.RowMapper; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; -import com.opencsv.CSVReader; +import net.lingala.zip4j.ZipFile; -import freemarker.template.TemplateException; +/** + * Spring managed bean that handles the creation of backups of the Collect database. + * The SQLite database file will be saved everytime the application closes. + * A maximum of 10 copies (the last ten times the application was used) will be saved on the backupCollectEarth folder on the users application data folder (OS dependant). + * @author Alfonso Sanchez-Paus Diaz + * + */ @Component -public class AnalysisSaikuService extends GenerateDatabase implements DisposableBean{ - - private static final String PLOT_ADD = "plot ADD "; - - private static final String UPDATE = "UPDATE "; - - private static final String UNKNOWN = "Unknown"; - - private static final String VARCHAR_5 = " VARCHAR(5)"; - - private static final String INTEGER = " INTEGER"; - - private static final String ALTER_TABLE = "ALTER TABLE "; - - private static final String INSERT_INTO = "INSERT INTO "; - - private static final String CREATE_TABLE = "CREATE TABLE "; - - private static final String ALU_CLIMATE_ZONE_CODE = "alu_climate_zone_code"; //$NON-NLS-1$ - - private static final String ALU_SOIL_TYPE_CODE = "alu_soil_type_code"; //$NON-NLS-1$ +@Lazy(false) +public class BackupSqlLiteService implements InitializingBean{ - private static final String ALU_SUBCLASS_CODE = "alu_subclass_code"; //$NON-NLS-1$ - - private static final String DYNAMICS_ID = "dynamics_id"; //$NON-NLS-1$ - - private static final String ELEVATION_ID = "elevation_id"; //$NON-NLS-1$ - - private static final String SLOPE_ID = "slope_id"; //$NON-NLS-1$ - - private static final String ASPECT_ID = "aspect_id"; //$NON-NLS-1$ - - private static final String START_SAIKU = "start-saiku"; //$NON-NLS-1$ - - private static final String STOP_SAIKU = "stop-saiku"; //$NON-NLS-1$ - - private static final String COMMAND_SUFFIX_BAT = ".bat"; //$NON-NLS-1$ - - private static final String COMMAND_SUFFIX_SH = ".sh"; //$NON-NLS-1$ - - public static final String COLLECT_EARTH_DATABASE_RDB_DB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB - + EarthConstants.SAIKU_RDB_SUFFIX; + private static final String BACKUP_COLLECT_EARTH = "backupSqlite"; //$NON-NLS-1$ + private static final int MAXIMUM_NUMBER_OF_BACKUPS = 10; @Autowired - RDBExporter rdbExporter; + BasicDataSource dataSource; @Autowired - CollectRDBPublisher collectRDBPublisher; - - @Autowired - EarthSurveyService earthSurveyService; - - @Autowired - public LocalPropertiesService localPropertiesService; - - @Autowired - BrowserService browserService; - - @Autowired - private RegionCalculationUtils regionCalculation; - - @Autowired - private SchemaService schemaNamingService; - - private static final int ELEVATION_RANGE = 100; - - private RemoteWebDriver saikuWebDriver; - - private static final String SQLITE_FREEMARKER_HTML_TEMPLATE = "resources" + File.separator //$NON-NLS-1$ - + "collectEarthSqliteDS.fmt"; //$NON-NLS-1$ - private static final String POSTGRESQL_FREEMARKER_HTML_TEMPLATE = "resources" + File.separator //$NON-NLS-1$ - + "collectEarthPostgreSqlDS.fmt"; //$NON-NLS-1$ - public static final String MDX_XML = "collectEarthCubes.xml"; //$NON-NLS-1$ - private static final String MDX_TEMPLATE = MDX_XML + ".fmt"; //$NON-NLS-1$ - - private boolean saikuStarted; - - private void assignDimensionValues() { - try { - final String schemaName = getSchemaPrefix(); - // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id - final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query( - "SELECT " + EarthConstants.PLOT_ID + ", elevation, slope, aspect FROM " + schemaName + "plot", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - new RowMapper() { - @Override - public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { - - final Object[] updateValues = new Object[4]; - - Integer aspect = AspectCode.NA.getId(); - if (AspectCode.getAspectCode(rs.getDouble("aspect")) != null) { //$NON-NLS-1$ - aspect = AspectCode.getAspectCode(rs.getDouble("aspect")).getId(); //$NON-NLS-1$ - } - - Integer slope = SlopeCode.NA.getId(); - - if (SlopeCode.getSlopeCode((int) rs.getFloat("slope")) != null) { //$NON-NLS-1$ - slope = SlopeCode.getSlopeCode((int) rs.getFloat("slope")).getId(); //$NON-NLS-1$ - } - - updateValues[0] = aspect; - updateValues[1] = slope; - updateValues[2] = ( (int) rs.getFloat("elevation") / ELEVATION_RANGE) + 1; // 0 //$NON-NLS-1$ - - updateValues[3] = rs.getLong(EarthConstants.PLOT_ID); - return updateValues; - } - - }); - - rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + ASPECT_ID + "=?," + SLOPE_ID + "=?," //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - + ELEVATION_ID + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (Exception e) { - logger.warn("No DEM information", e); //$NON-NLS-1$ - } - } - - private String getSchemaPrefix() { - return schemaNamingService.getSchemaPrefix(ExportType.SAIKU); - } - - private void assignPngAluToolDimensionValues() { - try { - if (earthSurveyService.getCollectSurvey().getName().toLowerCase().contains("png")) { //$NON-NLS-1$ - final String schemaName = getSchemaPrefix(); - // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id - final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query("SELECT " + EarthConstants.PLOT_ID //$NON-NLS-1$ - + ", elevation, soil_fundamental, land_use_subcategory, precipitation_ranges FROM " + schemaName //$NON-NLS-1$ - + "plot LEFT JOIN " + schemaName + "precipitation_ranges_code where " //$NON-NLS-1$ //$NON-NLS-2$ - + "plot.annual_precipitation_code_id=precipitation_ranges_code.precipitation_ranges_code_id", //$NON-NLS-1$ - new RowMapper() { - @Override - public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { - - final Object[] updateValues = new Object[3]; - - try { - AluToolUtils aluToolUtils = new AluToolUtils(); - - Integer elevation = rs.getInt("elevation"); //$NON-NLS-1$ - String soilFundamental = rs.getString("soil_fundamental"); //$NON-NLS-1$ - String precipitationRange = rs.getString("precipitation_ranges"); //$NON-NLS-1$ - - int precipitation = -1; - String climateZone = UNKNOWN; //$NON-NLS-1$ - if (precipitationRange != null) { - precipitation = aluToolUtils.getPrecipitationFromRange(precipitationRange); - boolean shortDrySeason = true; // According to information from Abe PNG has less - // than 5 months of dry season - climateZone = aluToolUtils.getClimateZone(elevation, precipitation, - shortDrySeason); - } - - String soilType = UNKNOWN; //$NON-NLS-1$ - if (soilFundamental != null) { - soilType = aluToolUtils.getSoilType(soilFundamental); - } - - updateValues[0] = climateZone; - updateValues[1] = soilType; - updateValues[2] = rs.getLong(EarthConstants.PLOT_ID); - } catch (Exception e) { - logger.error("Error while processing the data", e); //$NON-NLS-1$ - updateValues[0] = UNKNOWN; //$NON-NLS-1$ - updateValues[1] = UNKNOWN; //$NON-NLS-1$ - updateValues[2] = UNKNOWN; //$NON-NLS-1$ - } - return updateValues; - } - - }); - - rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + ALU_CLIMATE_ZONE_CODE + "=?," //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + ALU_SOIL_TYPE_CODE + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ //$NON-NLS-2$ - } - } catch (Exception e) { - logger.error("No PNG ALU information", e); //$NON-NLS-1$ - } - } - - private void assignLUCDimensionValues() { - try { - final String schemaName = getSchemaPrefix(); - // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id - final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query( - "SELECT " + EarthConstants.PLOT_ID + ", land_use_subcategory FROM " + schemaName + "plot", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - new RowMapper() { - @Override - public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { - - AluToolUtils aluToolUtils = new AluToolUtils(); - final Object[] updateValues = new Object[3]; - - String collectEarthSubcategory = rs.getString("land_use_subcategory"); //$NON-NLS-1$ - Integer dynamics = DynamicsCode.getDynamicsCode(collectEarthSubcategory); - String subClass = UNKNOWN; //$NON-NLS-1$ - if (collectEarthSubcategory != null) { - subClass = aluToolUtils.getAluSubclass(collectEarthSubcategory); - } - - updateValues[0] = dynamics; - updateValues[1] = subClass; - updateValues[2] = rs.getLong(EarthConstants.PLOT_ID); - return updateValues; - } - - }); - - rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + DYNAMICS_ID + "=?," + ALU_SUBCLASS_CODE //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ - } catch (Exception e) { - logger.warn("No PNG Alu information available", e); //$NON-NLS-1$ - } - } + private LocalPropertiesService localPropertiesService; - private void createAspectAuxTable() { - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "aspect_category (" + ASPECT_ID //$NON-NLS-1$ //$NON-NLS-2$ - + " INTEGER PRIMARY KEY, aspect_caption TEXT);"); //$NON-NLS-1$ - final AspectCode[] aspects = AspectCode.values(); - for (final AspectCode aspectCode : aspects) { - rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "aspect_category values (" + aspectCode.getId() + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + aspectCode.getLabel() + "')"); //$NON-NLS-1$ - } - } - - private void createElevationtAuxTable() { - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "elevation_category ( " + ELEVATION_ID //$NON-NLS-1$ //$NON-NLS-2$ - + " INTEGER PRIMARY KEY, elevation_caption TEXT);"); //$NON-NLS-1$ - final int slots = 9000 / ELEVATION_RANGE; // Highest mountain in the world, mount everest is - // 8820m high - for (int i = 1; i <= slots; i++) { - rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "elevation_category values (" + i + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + ((i - 1) * ELEVATION_RANGE) + "-" + i //$NON-NLS-1$ - * ELEVATION_RANGE - + "')"); //$NON-NLS-1$ - } - - } - - private void createDynamicsAuxTable() { - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "dynamics_category (" + DYNAMICS_ID //$NON-NLS-1$ //$NON-NLS-2$ - + " INTEGER PRIMARY KEY, dynamics_caption TEXT);"); //$NON-NLS-1$ - final DynamicsCode[] dynamicsCodes = DynamicsCode.values(); - for (final DynamicsCode dynamicsCode : dynamicsCodes) { - rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "dynamics_category values (" + dynamicsCode.getId() //$NON-NLS-1$ //$NON-NLS-2$ - + ", '" + dynamicsCode.getLabel() + "')"); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - - private void createPlotForeignKeys() { - // Add aspect_id column to plot - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ASPECT_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + SLOPE_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ELEVATION_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + DYNAMICS_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } + private Logger logger = LoggerFactory.getLogger( BackupSqlLiteService.class ); - private void createPngAluVariables() { - if (earthSurveyService.getCollectSurvey().getName().toLowerCase().contains("png")) { //$NON-NLS-1$ - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_SOIL_TYPE_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_CLIMATE_ZONE_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - } - - private void creatAluSubclassVariables() { - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_SUBCLASS_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - - private void createSlopeAuxTable() { - final String schemaName = getSchemaPrefix(); - // Slope can be from 0 to 90 - rdbExporter.getJdbcTemplate().execute( - CREATE_TABLE + schemaName + "slope_category (slope_id INTEGER PRIMARY KEY, slope_caption TEXT);"); //$NON-NLS-1$ //$NON-NLS-2$ - final SlopeCode[] slopeCodes = SlopeCode.values(); - for (final SlopeCode slopeCode : slopeCodes) { - rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "slope_category values (" + slopeCode.getId() + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + slopeCode.getLabel() + "')"); //$NON-NLS-1$ - } - } - - private String getSaikuConfigurationFilePath() { - - String configFile = localPropertiesService.getSaikuFolder() + "/" //$NON-NLS-1$ - + "tomcat/webapps/saiku/WEB-INF/classes/saiku-datasources/collectEarthDS"; //$NON-NLS-1$ - configFile = configFile.replace('/', File.separatorChar); - return configFile; - } - - private String getSaikuThreeConfigurationFilePath() { - - String configFile = localPropertiesService.getSaikuFolder() + "/" //$NON-NLS-1$ - + "tomcat/webapps/saiku/WEB-INF/classes/legacy-datasources/collectEarthDS"; //$NON-NLS-1$ - configFile = configFile.replace('/', File.separatorChar); - return configFile; - } - - private boolean isSaikuConfigured() { - return localPropertiesService.getSaikuFolder() != null - && isSaikuFolder(new File(localPropertiesService.getSaikuFolder())); + @Override + public void afterPropertiesSet() throws Exception { + attachShutDownHook(); } - /* - * private boolean isJavaHomeConfigured() { - * - * if (SystemUtils.IS_OS_MAC){ return true; } return ! ( StringUtils.isBlank( - * System.getenv("JAVA_HOME") ) //$NON-NLS-1$ && StringUtils.isBlank( - * System.getenv("JRE_HOME") ) //$NON-NLS-1$ && StringUtils.isBlank( - * System.getenv("COLLECT_EARTH_JRE_HOME") ) //$NON-NLS-1$ ); } - */ - - public boolean isSaikuFolder(File saikuFolder) { - boolean isSaikuFolder = false; - if (saikuFolder.listFiles() != null) { - for (final File file : saikuFolder.listFiles()) { - if (file.getName().equals(START_SAIKU + getCommandSuffix())) { - isSaikuFolder = true; + private void attachShutDownHook() { + Runtime.getRuntime().addShutdownHook(new Thread("Shutdown hook - Backup Database") { + @Override + public void run() { + if ( "true".equals(localPropertiesService.getValue(EarthProperty.AUTOMATIC_BACKUP) ) ) { //$NON-NLS-1$ + automaticDBBackup(); } } - } - return isSaikuFolder; - } - private void openSaiku() throws BrowserNotFoundException { - saikuWebDriver = browserService.navigateTo("http://127.0.0.1:8181", saikuWebDriver, false); //$NON-NLS-1$ - if (browserService.waitFor("username", saikuWebDriver)) { //$NON-NLS-1$ - saikuWebDriver.findElementByName("username").sendKeys("admin"); //$NON-NLS-1$ //$NON-NLS-2$ - saikuWebDriver.findElementByName("password").sendKeys("admin"); //$NON-NLS-1$ //$NON-NLS-2$ - saikuWebDriver.findElementByClassName("form_button").click(); //$NON-NLS-1$ - } + }); } + private void automaticDBBackup() { + if( localPropertiesService.isUsingSqliteDB() ){ - public void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws SaikuExecutionException { + String pathToBackupZip = ""; //$NON-NLS-1$ - try { - - stopSaiku(); + String nameCollectDB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB; + File originalDBFile = new File(nameCollectDB); try { - if ((localPropertiesService.isUsingSqliteDB() && !getZippedProjectDB( ExportType.SAIKU ).exists()) - || isRefreshDatabase()) { - - // The user clicked on the option to refresh the database, or there is no - // previous copy of the Saiku DB - // Generate the DB file - rdbExporter.exportDataToRDB( - earthSurveyService.getCollectSurvey(), - ExportType.SAIKU, - progressListener, - this::processQuantityData - ); - - try { - // Save the DB file in a zipped file to extends GenerateDatabase keep for the next usages - replaceZippedProjectDB( ExportType.SAIKU ); - } catch (Exception e) { - logger.error("Error while refreshing the Zipped content of the project Saiku DB", e); - } + pathToBackupZip = getBackupZipFilename(); - } else if (getZippedProjectDB(ExportType.SAIKU).exists() && localPropertiesService.isUsingSqliteDB()) { - // If the zipped version of the project exists ( and the user clicked on the - // option to not refresh it) then restore this last version of the data - restoreZippedProjectDB(ExportType.SAIKU); + try( ZipFile zipFile = CollectEarthUtils.addFileToZip(pathToBackupZip, originalDBFile, EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME) ){ + removeExtraBackups(); } - refreshDataSourceForSaiku(); - - if (startSaikuAfterDBExport && !isUserCancelledOperation()) { - startSaiku(); - new Thread("Opening Saiku") { - @Override - public void run() { - try { - AnalysisSaikuService.this.openSaiku(); - } catch (BrowserNotFoundException e) { - logger.error("No browser has been set up", e); //$NON-NLS-1$ - } - }; - }.start(); - - stopSaikuOnExit(); - } - } catch (final IOException e) { - logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ - } catch (TemplateException e1) { - logger.error("Error while applying the freemarker template tothe Saiku data source", e1); //$NON-NLS-1$ + } catch (IOException e) { + logger.error("Error when create backup of the Collect Earth Database from " + nameCollectDB + " to " + pathToBackupZip, e); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (Exception e) { + logger.error("Error when zipping the Collect Earth Database from " + nameCollectDB + " to " + pathToBackupZip, e); //$NON-NLS-1$ //$NON-NLS-2$ } - - } catch (final CollectRdbException e) { - logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ } } - private void processQuantityData(InfiniteProgressMonitor progressListener) { - - SwingUtilities.invokeLater( () -> progressListener.setMessage("Preparing Saiku data for analysis") ); - - progressListener.progressMade(new Progress(0, 100)); - createPngAluVariables(); - createPlotForeignKeys(); - - progressListener.progressMade(new Progress(25, 100)); - - if (!surveyContains("calculated_elevation_range", earthSurveyService.getCollectSurvey())) { - createAspectAuxTable(); - createSlopeAuxTable(); - createElevationtAuxTable(); - assignDimensionValues(); - - } - progressListener.progressMade(new Progress(50, 100)); - - if (!surveyContains("calculated_initial_land_use", earthSurveyService.getCollectSurvey())) { - createDynamicsAuxTable(); - creatAluSubclassVariables(); - assignLUCDimensionValues(); - - } - progressListener.progressMade(new Progress(75, 100)); - - assignPngAluToolDimensionValues(); - - SwingUtilities.invokeLater( () -> progressListener.setMessage("Calculating expansion factors") ); - - regionCalculation.handleRegionCalculation( ExportType.SAIKU, rdbExporter.getJdbcTemplate() ); - progressListener.progressMade(new Progress(100, 100)); - + private String getBackupZipFilename() throws IOException { + File backupFolder = getAutomaticBackUpFolder(); + return getDBCopyName(backupFolder); } - public static boolean surveyContains(String nodeName, CollectSurvey survey) { - NodeDefinition nodeDefForNAme = survey.getSchema().findNodeDefinition( nodeDef -> nodeDef.getName().equals(nodeName) ); - return nodeDefForNAme != null; + public String getDBCopyName(File backupFolder) throws IOException { + String pathToBackup; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HHmmss"); //$NON-NLS-1$ + StringBuilder destPathStr = new StringBuilder(); + destPathStr.append(backupFolder.getCanonicalPath()); + destPathStr.append(File.separatorChar); + destPathStr.append( EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME); + destPathStr.append(sdf.format( new Date() )).append( ".zip"); + pathToBackup = destPathStr.toString(); + return pathToBackup; } - public static CSVReader getCsvReader(String csvFile) throws FileNotFoundException { - final BufferedReader bufferedReader = new BufferedReader( - new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 ) ); //$NON-NLS-1$ - return new CSVReader(bufferedReader); - } + private void removeExtraBackups() { - private void refreshDataSourceForSaiku() throws IOException, TemplateException { - final File mdxFile = new File(localPropertiesService.getProjectFolder() + File.separatorChar + MDX_XML); + File backupFolder = getAutomaticBackUpFolder(); - Map data = new HashMap<>(); - data.put("cubeFilePath", StringEscapeUtils.escapeJava(mdxFile.getAbsolutePath().replace('\\', '/'))); //$NON-NLS-1$ + File[] files = backupFolder.listFiles(); + if( files!=null && files.length > MAXIMUM_NUMBER_OF_BACKUPS ){ - final File mdxTemplate = getMdxTemplate(); - final File dataSourceTemplate = getDataSourceTemplate(data); - - // First try Saiku 2.5/2.6 - File dataSourceFile; - try { - dataSourceFile = new File(getSaikuConfigurationFilePath()); - FreemarkerTemplateUtils.applyTemplate(dataSourceTemplate, dataSourceFile, data); - } catch (Exception e) { - logger.error("Error starting Saiku", e); - dataSourceFile = new File(getSaikuThreeConfigurationFilePath()); - FreemarkerTemplateUtils.applyTemplate(dataSourceTemplate, dataSourceFile, data); - } - - setMdxSaikuSchema(mdxTemplate, mdxFile); - } - - private File getMdxTemplate() throws IOException { - final File mdxFileTemplate = new File( - localPropertiesService.getProjectFolder() + File.separatorChar + MDX_TEMPLATE); - if (!mdxFileTemplate.exists()) { - throw new IOException( - "The file containing the MDX Cube definition Template does not exist in expected location " //$NON-NLS-1$ - + mdxFileTemplate.getAbsolutePath()); - } - return mdxFileTemplate; - } - - private File getDataSourceTemplate(Map data) throws IOException { - File dataSourceTemplate = null; - - if (localPropertiesService.isUsingSqliteDB()) { - dataSourceTemplate = new File(SQLITE_FREEMARKER_HTML_TEMPLATE); - final File rdbDb = rdbExporter.getRdbFile( ExportType.SAIKU ); - if (!rdbDb.exists()) { - throw new IOException( - "The file contianing the Relational SQLite Database does not exist in expected location " //$NON-NLS-1$ - + rdbDb.getAbsolutePath()); - } - data.put("rdbFilePath", StringEscapeUtils.escapeJava(rdbDb.getAbsolutePath().replace('\\', '/'))); //$NON-NLS-1$ - } else { - dataSourceTemplate = new File(POSTGRESQL_FREEMARKER_HTML_TEMPLATE); - CollectDBDriver collectDBDriver = localPropertiesService.getCollectDBDriver(); - data.put("dbUrl", StringEscapeUtils.escapeJava(ServerController.getSaikuDbURL(collectDBDriver))); //$NON-NLS-1$ - data.put("username", //$NON-NLS-1$ - StringEscapeUtils.escapeJava(localPropertiesService.getValue(EarthProperty.DB_USERNAME))); - data.put("password", //$NON-NLS-1$ - StringEscapeUtils.escapeJava(localPropertiesService.getValue(EarthProperty.DB_PASSWORD))); - } - - if (!dataSourceTemplate.exists()) { - throw new IOException( - "The file containing the Saiku Data Source template does not exist in expected location " //$NON-NLS-1$ - + dataSourceTemplate.getAbsolutePath()); - } - - return dataSourceTemplate; - } - - private void setMdxSaikuSchema(final File mdxFileTemplate, final File mdxFile) - throws IOException, TemplateException { - Map saikuData = new HashMap<>(); - String saikuSchemaName = getSchemaName(); - if (saikuSchemaName == null) { - saikuSchemaName = ""; //$NON-NLS-1$ - } - saikuData.put("saikuDbSchema", saikuSchemaName); //$NON-NLS-1$ - FreemarkerTemplateUtils.applyTemplate(mdxFileTemplate, mdxFile, saikuData); - } - - private void runSaikuBat(String commandName) throws SaikuExecutionException { - if (!isSaikuConfigured()) { - throw new SaikuExecutionException("The Saiku server is not configured."); //$NON-NLS-1$ - } - - else { - String saikuCmd = localPropertiesService.getSaikuFolder() + File.separator + commandName - + getCommandSuffix(); - - if (SystemUtils.IS_OS_WINDOWS) { - saikuCmd = "\"" + saikuCmd + "\""; //$NON-NLS-1$ //$NON-NLS-2$ - } - - try { - - Process runSaiku = runProcessBuilder(new String[] { saikuCmd }); - - if (commandName.equals(STOP_SAIKU)) { - int result = runSaiku.waitFor(); - logger.warn("Script ended with result {}", result); //$NON-NLS-1$ - } else if (commandName.equals(START_SAIKU)) { - Thread.sleep(6000); - } - - } catch (final IOException e) { - logger.error("Error when running Saiku start/stop command", e); //$NON-NLS-1$ - } catch (InterruptedException e) { - logger.error("Error while waiting to start", e); //$NON-NLS-1$ - Thread.currentThread().interrupt(); - } - } - } - - private void setMacJreHome(ProcessBuilder p) { - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX || SystemUtils.IS_OS_LINUX) { - - File javaFolder = new File("./java"); + Arrays.sort(files, (o1,o2) -> { + if( o1.lastModified() < o2.lastModified() ){ + return 1; + }else if( o1.lastModified() == o2.lastModified() ){ + return 0; + }else{ + return -1; + } - if (!javaFolder.exists()) { - String userName = System.getProperty("user.name"); - String testWithPath = "/Users/" + userName + "/OpenForis/CollectEarth/java"; - File testJavaPath = new File(testWithPath); - if (testJavaPath.exists()) { - javaFolder = testJavaPath; } - } - - Map environment = p.environment(); - environment.put("COLLECT_EARTH_JRE_HOME", javaFolder.getAbsolutePath()); - - /* - * // In MAC the environment variable COLLECT_EARTH_JRE_HOME is not accesible - * from outside the bash, set it again! if( SystemUtils.IS_OS_MAC || - * SystemUtils.IS_OS_MAC_OSX){ try { File javaFolder = new File("./java"); - * - * if( !javaFolder.exists() ){ String userName = - * System.getProperty("user.name"); String testWithPath = "/Users/"+userName + - * "/OpenForis/CollectEarth/java"; File testJavaPath = new File(testWithPath); - * if( testJavaPath.exists()){ javaFolder = testJavaPath; } } - * - * Process setEnv = runProcessBuilder(new String[] { "/bin/bash", "setenv", - * "COLLECT_EARTH_JRE_HOME=\""+ javaFolder.getAbsolutePath() +"\"" }); - * setEnv.waitFor(); } catch (final IOException e) { - * logger.error("Error setting the COLLECT_EARTH_JRE_HOME environment variable", - * e); //$NON-NLS-1$ } catch (InterruptedException e) { - * logger.error("Error when running COLLECT_EARTH_JRE_HOME environment variable" - * , e); //$NON-NLS-1$ } } - */ - } - } - - private Process runProcessBuilder(String[] cmd) throws IOException { - final ProcessBuilder builder = new ProcessBuilder(cmd); - - // Fixes bug with Mac OS X not using the environemnt variable set for bash - setMacJreHome(builder); - - builder.directory(new File(localPropertiesService.getSaikuFolder()).getAbsoluteFile()); - builder.redirectErrorStream(true); - Process p = builder.start(); - (new ProcessLoggerThread(p.getInputStream(), Boolean.FALSE)).start(); - (new ProcessLoggerThread(p.getErrorStream(), Boolean.TRUE)).start(); - return p; - } - - private String getCommandSuffix() { - if (SystemUtils.IS_OS_WINDOWS) { - return COMMAND_SUFFIX_BAT; - } else { - return COMMAND_SUFFIX_SH; - } - } - - private void startSaiku() throws SaikuExecutionException { - logger.warn( - "Starting the Saiku server {}{}{}", localPropertiesService.getSaikuFolder(), File.separator, START_SAIKU); //$NON-NLS-1$ - - runSaikuBat(START_SAIKU); - - this.setSaikuStarted(true); - - logger.warn("Finished starting the Saiku server"); //$NON-NLS-1$ - } + ); - void stopSaiku() throws SaikuExecutionException { - logger.warn("Stoping the Saiku server {}{}{}", localPropertiesService.getSaikuFolder() , File.separator , STOP_SAIKU); //$NON-NLS-1$ - if (isSaikuStarted()) { - runSaikuBat(STOP_SAIKU); - this.setSaikuStarted(true); - } - logger.warn("Finished stoping the Saiku server"); //$NON-NLS-1$ - } - - private void stopSaikuOnExit() { - Runtime.getRuntime().addShutdownHook(new Thread("Shutting down Saiku on exit hook") { - @Override - public void run() { - try { - if (isSaikuStarted()) { - stopSaiku(); - } - } catch (final SaikuExecutionException e) { - logger.error("The Saiku server has been de-configured after it was started", e); //$NON-NLS-1$ + for( int i = MAXIMUM_NUMBER_OF_BACKUPS; i< files.length ; i++ ){ + if( !files[i].delete() ) { + logger.error( "Error deleteting file", files[i].getAbsolutePath() ); } } - }); - } - - private boolean isSaikuStarted() { - return saikuStarted; - } - - private void setSaikuStarted(boolean saikuStarted) { - this.saikuStarted = saikuStarted; - } - - @Override - public void destroy() throws Exception { - try { - stopSaiku(); - } catch (SaikuExecutionException e) { - logger.error("Error while trying to quite Saiku before destroying the bean", e); //$NON-NLS-1$ } - } - @Override - public LocalPropertiesService getLocalPropertiesService() { - return localPropertiesService; } - @Override - public EarthSurveyService getEarthSurveyService() { - return earthSurveyService; - } - @Override - public RDBExporter getRdbExporter() { - return rdbExporter; + /** + * Returns the folder where the backup copies should be placed. + * @return The OS dependent folder where the application should saved the backed up copies. + */ + public File getAutomaticBackUpFolder() { + return FolderFinder.createFolderInAppData( BACKUP_COLLECT_EARTH); } -} \ No newline at end of file +} From ab5522aa37b031bea5f5ccf64286ee926444ec70 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:30 +0100 Subject: [PATCH 0116/1620] New translations BackupSqlLiteService.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 755 ++---------------- 1 file changed, 83 insertions(+), 672 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index cba7f5812d..8c14343c96 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,731 +1,142 @@ package org.openforis.collect.earth.app.service; -import java.io.BufferedReader; import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.IOException; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.SystemUtils; -import org.apache.commons.text.StringEscapeUtils; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Date; + +import org.apache.commons.dbcp.BasicDataSource; +import org.openforis.collect.earth.app.CollectEarthUtils; import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; -import org.openforis.collect.earth.app.ad_hoc.AluToolUtils; -import org.openforis.collect.earth.app.desktop.ServerController; -import org.openforis.collect.earth.app.model.AspectCode; -import org.openforis.collect.earth.app.model.DynamicsCode; -import org.openforis.collect.earth.app.model.SlopeCode; import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; -import org.openforis.collect.model.CollectSurvey; -import org.openforis.collect.relational.CollectRDBPublisher; -import org.openforis.collect.relational.CollectRdbException; -import org.openforis.concurrency.Progress; -import org.openforis.idm.metamodel.NodeDefinition; -import org.openqa.selenium.remote.RemoteWebDriver; -import org.springframework.beans.factory.DisposableBean; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.RowMapper; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; -import com.opencsv.CSVReader; +import net.lingala.zip4j.ZipFile; -import freemarker.template.TemplateException; +/** + * Spring managed bean that handles the creation of backups of the Collect database. + * The SQLite database file will be saved everytime the application closes. + * A maximum of 10 copies (the last ten times the application was used) will be saved on the backupCollectEarth folder on the users application data folder (OS dependant). + * @author Alfonso Sanchez-Paus Diaz + * + */ @Component -public class AnalysisSaikuService extends GenerateDatabase implements DisposableBean{ - - private static final String PLOT_ADD = "plot ADD "; - - private static final String UPDATE = "UPDATE "; - - private static final String UNKNOWN = "Unknown"; - - private static final String VARCHAR_5 = " VARCHAR(5)"; - - private static final String INTEGER = " INTEGER"; - - private static final String ALTER_TABLE = "ALTER TABLE "; - - private static final String INSERT_INTO = "INSERT INTO "; - - private static final String CREATE_TABLE = "CREATE TABLE "; - - private static final String ALU_CLIMATE_ZONE_CODE = "alu_climate_zone_code"; //$NON-NLS-1$ - - private static final String ALU_SOIL_TYPE_CODE = "alu_soil_type_code"; //$NON-NLS-1$ +@Lazy(false) +public class BackupSqlLiteService implements InitializingBean{ - private static final String ALU_SUBCLASS_CODE = "alu_subclass_code"; //$NON-NLS-1$ - - private static final String DYNAMICS_ID = "dynamics_id"; //$NON-NLS-1$ - - private static final String ELEVATION_ID = "elevation_id"; //$NON-NLS-1$ - - private static final String SLOPE_ID = "slope_id"; //$NON-NLS-1$ - - private static final String ASPECT_ID = "aspect_id"; //$NON-NLS-1$ - - private static final String START_SAIKU = "start-saiku"; //$NON-NLS-1$ - - private static final String STOP_SAIKU = "stop-saiku"; //$NON-NLS-1$ - - private static final String COMMAND_SUFFIX_BAT = ".bat"; //$NON-NLS-1$ - - private static final String COMMAND_SUFFIX_SH = ".sh"; //$NON-NLS-1$ - - public static final String COLLECT_EARTH_DATABASE_RDB_DB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB - + EarthConstants.SAIKU_RDB_SUFFIX; + private static final String BACKUP_COLLECT_EARTH = "backupSqlite"; //$NON-NLS-1$ + private static final int MAXIMUM_NUMBER_OF_BACKUPS = 10; @Autowired - RDBExporter rdbExporter; + BasicDataSource dataSource; @Autowired - CollectRDBPublisher collectRDBPublisher; - - @Autowired - EarthSurveyService earthSurveyService; - - @Autowired - public LocalPropertiesService localPropertiesService; - - @Autowired - BrowserService browserService; - - @Autowired - private RegionCalculationUtils regionCalculation; - - @Autowired - private SchemaService schemaNamingService; - - private static final int ELEVATION_RANGE = 100; - - private RemoteWebDriver saikuWebDriver; - - private static final String SQLITE_FREEMARKER_HTML_TEMPLATE = "resources" + File.separator //$NON-NLS-1$ - + "collectEarthSqliteDS.fmt"; //$NON-NLS-1$ - private static final String POSTGRESQL_FREEMARKER_HTML_TEMPLATE = "resources" + File.separator //$NON-NLS-1$ - + "collectEarthPostgreSqlDS.fmt"; //$NON-NLS-1$ - public static final String MDX_XML = "collectEarthCubes.xml"; //$NON-NLS-1$ - private static final String MDX_TEMPLATE = MDX_XML + ".fmt"; //$NON-NLS-1$ - - private boolean saikuStarted; - - private void assignDimensionValues() { - try { - final String schemaName = getSchemaPrefix(); - // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id - final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query( - "SELECT " + EarthConstants.PLOT_ID + ", elevation, slope, aspect FROM " + schemaName + "plot", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - new RowMapper() { - @Override - public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { - - final Object[] updateValues = new Object[4]; - - Integer aspect = AspectCode.NA.getId(); - if (AspectCode.getAspectCode(rs.getDouble("aspect")) != null) { //$NON-NLS-1$ - aspect = AspectCode.getAspectCode(rs.getDouble("aspect")).getId(); //$NON-NLS-1$ - } - - Integer slope = SlopeCode.NA.getId(); - - if (SlopeCode.getSlopeCode((int) rs.getFloat("slope")) != null) { //$NON-NLS-1$ - slope = SlopeCode.getSlopeCode((int) rs.getFloat("slope")).getId(); //$NON-NLS-1$ - } - - updateValues[0] = aspect; - updateValues[1] = slope; - updateValues[2] = ( (int) rs.getFloat("elevation") / ELEVATION_RANGE) + 1; // 0 //$NON-NLS-1$ - - updateValues[3] = rs.getLong(EarthConstants.PLOT_ID); - return updateValues; - } - - }); - - rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + ASPECT_ID + "=?," + SLOPE_ID + "=?," //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - + ELEVATION_ID + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (Exception e) { - logger.warn("No DEM information", e); //$NON-NLS-1$ - } - } - - private String getSchemaPrefix() { - return schemaNamingService.getSchemaPrefix(ExportType.SAIKU); - } - - private void assignPngAluToolDimensionValues() { - try { - if (earthSurveyService.getCollectSurvey().getName().toLowerCase().contains("png")) { //$NON-NLS-1$ - final String schemaName = getSchemaPrefix(); - // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id - final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query("SELECT " + EarthConstants.PLOT_ID //$NON-NLS-1$ - + ", elevation, soil_fundamental, land_use_subcategory, precipitation_ranges FROM " + schemaName //$NON-NLS-1$ - + "plot LEFT JOIN " + schemaName + "precipitation_ranges_code where " //$NON-NLS-1$ //$NON-NLS-2$ - + "plot.annual_precipitation_code_id=precipitation_ranges_code.precipitation_ranges_code_id", //$NON-NLS-1$ - new RowMapper() { - @Override - public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { - - final Object[] updateValues = new Object[3]; - - try { - AluToolUtils aluToolUtils = new AluToolUtils(); - - Integer elevation = rs.getInt("elevation"); //$NON-NLS-1$ - String soilFundamental = rs.getString("soil_fundamental"); //$NON-NLS-1$ - String precipitationRange = rs.getString("precipitation_ranges"); //$NON-NLS-1$ - - int precipitation = -1; - String climateZone = UNKNOWN; //$NON-NLS-1$ - if (precipitationRange != null) { - precipitation = aluToolUtils.getPrecipitationFromRange(precipitationRange); - boolean shortDrySeason = true; // According to information from Abe PNG has less - // than 5 months of dry season - climateZone = aluToolUtils.getClimateZone(elevation, precipitation, - shortDrySeason); - } - - String soilType = UNKNOWN; //$NON-NLS-1$ - if (soilFundamental != null) { - soilType = aluToolUtils.getSoilType(soilFundamental); - } - - updateValues[0] = climateZone; - updateValues[1] = soilType; - updateValues[2] = rs.getLong(EarthConstants.PLOT_ID); - } catch (Exception e) { - logger.error("Error while processing the data", e); //$NON-NLS-1$ - updateValues[0] = UNKNOWN; //$NON-NLS-1$ - updateValues[1] = UNKNOWN; //$NON-NLS-1$ - updateValues[2] = UNKNOWN; //$NON-NLS-1$ - } - return updateValues; - } - - }); - - rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + ALU_CLIMATE_ZONE_CODE + "=?," //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + ALU_SOIL_TYPE_CODE + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ //$NON-NLS-2$ - } - } catch (Exception e) { - logger.error("No PNG ALU information", e); //$NON-NLS-1$ - } - } - - private void assignLUCDimensionValues() { - try { - final String schemaName = getSchemaPrefix(); - // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id - final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query( - "SELECT " + EarthConstants.PLOT_ID + ", land_use_subcategory FROM " + schemaName + "plot", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - new RowMapper() { - @Override - public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { - - AluToolUtils aluToolUtils = new AluToolUtils(); - final Object[] updateValues = new Object[3]; - - String collectEarthSubcategory = rs.getString("land_use_subcategory"); //$NON-NLS-1$ - Integer dynamics = DynamicsCode.getDynamicsCode(collectEarthSubcategory); - String subClass = UNKNOWN; //$NON-NLS-1$ - if (collectEarthSubcategory != null) { - subClass = aluToolUtils.getAluSubclass(collectEarthSubcategory); - } - - updateValues[0] = dynamics; - updateValues[1] = subClass; - updateValues[2] = rs.getLong(EarthConstants.PLOT_ID); - return updateValues; - } - - }); - - rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + DYNAMICS_ID + "=?," + ALU_SUBCLASS_CODE //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ - } catch (Exception e) { - logger.warn("No PNG Alu information available", e); //$NON-NLS-1$ - } - } + private LocalPropertiesService localPropertiesService; - private void createAspectAuxTable() { - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "aspect_category (" + ASPECT_ID //$NON-NLS-1$ //$NON-NLS-2$ - + " INTEGER PRIMARY KEY, aspect_caption TEXT);"); //$NON-NLS-1$ - final AspectCode[] aspects = AspectCode.values(); - for (final AspectCode aspectCode : aspects) { - rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "aspect_category values (" + aspectCode.getId() + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + aspectCode.getLabel() + "')"); //$NON-NLS-1$ - } - } - - private void createElevationtAuxTable() { - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "elevation_category ( " + ELEVATION_ID //$NON-NLS-1$ //$NON-NLS-2$ - + " INTEGER PRIMARY KEY, elevation_caption TEXT);"); //$NON-NLS-1$ - final int slots = 9000 / ELEVATION_RANGE; // Highest mountain in the world, mount everest is - // 8820m high - for (int i = 1; i <= slots; i++) { - rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "elevation_category values (" + i + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + ((i - 1) * ELEVATION_RANGE) + "-" + i //$NON-NLS-1$ - * ELEVATION_RANGE - + "')"); //$NON-NLS-1$ - } - - } - - private void createDynamicsAuxTable() { - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "dynamics_category (" + DYNAMICS_ID //$NON-NLS-1$ //$NON-NLS-2$ - + " INTEGER PRIMARY KEY, dynamics_caption TEXT);"); //$NON-NLS-1$ - final DynamicsCode[] dynamicsCodes = DynamicsCode.values(); - for (final DynamicsCode dynamicsCode : dynamicsCodes) { - rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "dynamics_category values (" + dynamicsCode.getId() //$NON-NLS-1$ //$NON-NLS-2$ - + ", '" + dynamicsCode.getLabel() + "')"); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - - private void createPlotForeignKeys() { - // Add aspect_id column to plot - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ASPECT_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + SLOPE_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ELEVATION_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + DYNAMICS_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } + private Logger logger = LoggerFactory.getLogger( BackupSqlLiteService.class ); - private void createPngAluVariables() { - if (earthSurveyService.getCollectSurvey().getName().toLowerCase().contains("png")) { //$NON-NLS-1$ - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_SOIL_TYPE_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_CLIMATE_ZONE_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - } - - private void creatAluSubclassVariables() { - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_SUBCLASS_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - - private void createSlopeAuxTable() { - final String schemaName = getSchemaPrefix(); - // Slope can be from 0 to 90 - rdbExporter.getJdbcTemplate().execute( - CREATE_TABLE + schemaName + "slope_category (slope_id INTEGER PRIMARY KEY, slope_caption TEXT);"); //$NON-NLS-1$ //$NON-NLS-2$ - final SlopeCode[] slopeCodes = SlopeCode.values(); - for (final SlopeCode slopeCode : slopeCodes) { - rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "slope_category values (" + slopeCode.getId() + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + slopeCode.getLabel() + "')"); //$NON-NLS-1$ - } - } - - private String getSaikuConfigurationFilePath() { - - String configFile = localPropertiesService.getSaikuFolder() + "/" //$NON-NLS-1$ - + "tomcat/webapps/saiku/WEB-INF/classes/saiku-datasources/collectEarthDS"; //$NON-NLS-1$ - configFile = configFile.replace('/', File.separatorChar); - return configFile; - } - - private String getSaikuThreeConfigurationFilePath() { - - String configFile = localPropertiesService.getSaikuFolder() + "/" //$NON-NLS-1$ - + "tomcat/webapps/saiku/WEB-INF/classes/legacy-datasources/collectEarthDS"; //$NON-NLS-1$ - configFile = configFile.replace('/', File.separatorChar); - return configFile; - } - - private boolean isSaikuConfigured() { - return localPropertiesService.getSaikuFolder() != null - && isSaikuFolder(new File(localPropertiesService.getSaikuFolder())); + @Override + public void afterPropertiesSet() throws Exception { + attachShutDownHook(); } - /* - * private boolean isJavaHomeConfigured() { - * - * if (SystemUtils.IS_OS_MAC){ return true; } return ! ( StringUtils.isBlank( - * System.getenv("JAVA_HOME") ) //$NON-NLS-1$ && StringUtils.isBlank( - * System.getenv("JRE_HOME") ) //$NON-NLS-1$ && StringUtils.isBlank( - * System.getenv("COLLECT_EARTH_JRE_HOME") ) //$NON-NLS-1$ ); } - */ - - public boolean isSaikuFolder(File saikuFolder) { - boolean isSaikuFolder = false; - if (saikuFolder.listFiles() != null) { - for (final File file : saikuFolder.listFiles()) { - if (file.getName().equals(START_SAIKU + getCommandSuffix())) { - isSaikuFolder = true; + private void attachShutDownHook() { + Runtime.getRuntime().addShutdownHook(new Thread("Shutdown hook - Backup Database") { + @Override + public void run() { + if ( "true".equals(localPropertiesService.getValue(EarthProperty.AUTOMATIC_BACKUP) ) ) { //$NON-NLS-1$ + automaticDBBackup(); } } - } - return isSaikuFolder; - } - private void openSaiku() throws BrowserNotFoundException { - saikuWebDriver = browserService.navigateTo("http://127.0.0.1:8181", saikuWebDriver, false); //$NON-NLS-1$ - if (browserService.waitFor("username", saikuWebDriver)) { //$NON-NLS-1$ - saikuWebDriver.findElementByName("username").sendKeys("admin"); //$NON-NLS-1$ //$NON-NLS-2$ - saikuWebDriver.findElementByName("password").sendKeys("admin"); //$NON-NLS-1$ //$NON-NLS-2$ - saikuWebDriver.findElementByClassName("form_button").click(); //$NON-NLS-1$ - } + }); } + private void automaticDBBackup() { + if( localPropertiesService.isUsingSqliteDB() ){ - public void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws SaikuExecutionException { + String pathToBackupZip = ""; //$NON-NLS-1$ - try { - - stopSaiku(); + String nameCollectDB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB; + File originalDBFile = new File(nameCollectDB); try { - if ((localPropertiesService.isUsingSqliteDB() && !getZippedProjectDB( ExportType.SAIKU ).exists()) - || isRefreshDatabase()) { - - // The user clicked on the option to refresh the database, or there is no - // previous copy of the Saiku DB - // Generate the DB file - rdbExporter.exportDataToRDB( - earthSurveyService.getCollectSurvey(), - ExportType.SAIKU, - progressListener, - this::processQuantityData - ); - - try { - // Save the DB file in a zipped file to extends GenerateDatabase keep for the next usages - replaceZippedProjectDB( ExportType.SAIKU ); - } catch (Exception e) { - logger.error("Error while refreshing the Zipped content of the project Saiku DB", e); - } + pathToBackupZip = getBackupZipFilename(); - } else if (getZippedProjectDB(ExportType.SAIKU).exists() && localPropertiesService.isUsingSqliteDB()) { - // If the zipped version of the project exists ( and the user clicked on the - // option to not refresh it) then restore this last version of the data - restoreZippedProjectDB(ExportType.SAIKU); + try( ZipFile zipFile = CollectEarthUtils.addFileToZip(pathToBackupZip, originalDBFile, EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME) ){ + removeExtraBackups(); } - refreshDataSourceForSaiku(); - - if (startSaikuAfterDBExport && !isUserCancelledOperation()) { - startSaiku(); - new Thread("Opening Saiku") { - @Override - public void run() { - try { - AnalysisSaikuService.this.openSaiku(); - } catch (BrowserNotFoundException e) { - logger.error("No browser has been set up", e); //$NON-NLS-1$ - } - }; - }.start(); - - stopSaikuOnExit(); - } - } catch (final IOException e) { - logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ - } catch (TemplateException e1) { - logger.error("Error while applying the freemarker template tothe Saiku data source", e1); //$NON-NLS-1$ + } catch (IOException e) { + logger.error("Error when create backup of the Collect Earth Database from " + nameCollectDB + " to " + pathToBackupZip, e); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (Exception e) { + logger.error("Error when zipping the Collect Earth Database from " + nameCollectDB + " to " + pathToBackupZip, e); //$NON-NLS-1$ //$NON-NLS-2$ } - - } catch (final CollectRdbException e) { - logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ } } - private void processQuantityData(InfiniteProgressMonitor progressListener) { - - SwingUtilities.invokeLater( () -> progressListener.setMessage("Preparing Saiku data for analysis") ); - - progressListener.progressMade(new Progress(0, 100)); - createPngAluVariables(); - createPlotForeignKeys(); - - progressListener.progressMade(new Progress(25, 100)); - - if (!surveyContains("calculated_elevation_range", earthSurveyService.getCollectSurvey())) { - createAspectAuxTable(); - createSlopeAuxTable(); - createElevationtAuxTable(); - assignDimensionValues(); - - } - progressListener.progressMade(new Progress(50, 100)); - - if (!surveyContains("calculated_initial_land_use", earthSurveyService.getCollectSurvey())) { - createDynamicsAuxTable(); - creatAluSubclassVariables(); - assignLUCDimensionValues(); - - } - progressListener.progressMade(new Progress(75, 100)); - - assignPngAluToolDimensionValues(); - - SwingUtilities.invokeLater( () -> progressListener.setMessage("Calculating expansion factors") ); - - regionCalculation.handleRegionCalculation( ExportType.SAIKU, rdbExporter.getJdbcTemplate() ); - progressListener.progressMade(new Progress(100, 100)); - + private String getBackupZipFilename() throws IOException { + File backupFolder = getAutomaticBackUpFolder(); + return getDBCopyName(backupFolder); } - public static boolean surveyContains(String nodeName, CollectSurvey survey) { - NodeDefinition nodeDefForNAme = survey.getSchema().findNodeDefinition( nodeDef -> nodeDef.getName().equals(nodeName) ); - return nodeDefForNAme != null; + public String getDBCopyName(File backupFolder) throws IOException { + String pathToBackup; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HHmmss"); //$NON-NLS-1$ + StringBuilder destPathStr = new StringBuilder(); + destPathStr.append(backupFolder.getCanonicalPath()); + destPathStr.append(File.separatorChar); + destPathStr.append( EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME); + destPathStr.append(sdf.format( new Date() )).append( ".zip"); + pathToBackup = destPathStr.toString(); + return pathToBackup; } - public static CSVReader getCsvReader(String csvFile) throws FileNotFoundException { - final BufferedReader bufferedReader = new BufferedReader( - new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 ) ); //$NON-NLS-1$ - return new CSVReader(bufferedReader); - } + private void removeExtraBackups() { - private void refreshDataSourceForSaiku() throws IOException, TemplateException { - final File mdxFile = new File(localPropertiesService.getProjectFolder() + File.separatorChar + MDX_XML); + File backupFolder = getAutomaticBackUpFolder(); - Map data = new HashMap<>(); - data.put("cubeFilePath", StringEscapeUtils.escapeJava(mdxFile.getAbsolutePath().replace('\\', '/'))); //$NON-NLS-1$ + File[] files = backupFolder.listFiles(); + if( files!=null && files.length > MAXIMUM_NUMBER_OF_BACKUPS ){ - final File mdxTemplate = getMdxTemplate(); - final File dataSourceTemplate = getDataSourceTemplate(data); - - // First try Saiku 2.5/2.6 - File dataSourceFile; - try { - dataSourceFile = new File(getSaikuConfigurationFilePath()); - FreemarkerTemplateUtils.applyTemplate(dataSourceTemplate, dataSourceFile, data); - } catch (Exception e) { - logger.error("Error starting Saiku", e); - dataSourceFile = new File(getSaikuThreeConfigurationFilePath()); - FreemarkerTemplateUtils.applyTemplate(dataSourceTemplate, dataSourceFile, data); - } - - setMdxSaikuSchema(mdxTemplate, mdxFile); - } - - private File getMdxTemplate() throws IOException { - final File mdxFileTemplate = new File( - localPropertiesService.getProjectFolder() + File.separatorChar + MDX_TEMPLATE); - if (!mdxFileTemplate.exists()) { - throw new IOException( - "The file containing the MDX Cube definition Template does not exist in expected location " //$NON-NLS-1$ - + mdxFileTemplate.getAbsolutePath()); - } - return mdxFileTemplate; - } - - private File getDataSourceTemplate(Map data) throws IOException { - File dataSourceTemplate = null; - - if (localPropertiesService.isUsingSqliteDB()) { - dataSourceTemplate = new File(SQLITE_FREEMARKER_HTML_TEMPLATE); - final File rdbDb = rdbExporter.getRdbFile( ExportType.SAIKU ); - if (!rdbDb.exists()) { - throw new IOException( - "The file contianing the Relational SQLite Database does not exist in expected location " //$NON-NLS-1$ - + rdbDb.getAbsolutePath()); - } - data.put("rdbFilePath", StringEscapeUtils.escapeJava(rdbDb.getAbsolutePath().replace('\\', '/'))); //$NON-NLS-1$ - } else { - dataSourceTemplate = new File(POSTGRESQL_FREEMARKER_HTML_TEMPLATE); - CollectDBDriver collectDBDriver = localPropertiesService.getCollectDBDriver(); - data.put("dbUrl", StringEscapeUtils.escapeJava(ServerController.getSaikuDbURL(collectDBDriver))); //$NON-NLS-1$ - data.put("username", //$NON-NLS-1$ - StringEscapeUtils.escapeJava(localPropertiesService.getValue(EarthProperty.DB_USERNAME))); - data.put("password", //$NON-NLS-1$ - StringEscapeUtils.escapeJava(localPropertiesService.getValue(EarthProperty.DB_PASSWORD))); - } - - if (!dataSourceTemplate.exists()) { - throw new IOException( - "The file containing the Saiku Data Source template does not exist in expected location " //$NON-NLS-1$ - + dataSourceTemplate.getAbsolutePath()); - } - - return dataSourceTemplate; - } - - private void setMdxSaikuSchema(final File mdxFileTemplate, final File mdxFile) - throws IOException, TemplateException { - Map saikuData = new HashMap<>(); - String saikuSchemaName = getSchemaName(); - if (saikuSchemaName == null) { - saikuSchemaName = ""; //$NON-NLS-1$ - } - saikuData.put("saikuDbSchema", saikuSchemaName); //$NON-NLS-1$ - FreemarkerTemplateUtils.applyTemplate(mdxFileTemplate, mdxFile, saikuData); - } - - private void runSaikuBat(String commandName) throws SaikuExecutionException { - if (!isSaikuConfigured()) { - throw new SaikuExecutionException("The Saiku server is not configured."); //$NON-NLS-1$ - } - - else { - String saikuCmd = localPropertiesService.getSaikuFolder() + File.separator + commandName - + getCommandSuffix(); - - if (SystemUtils.IS_OS_WINDOWS) { - saikuCmd = "\"" + saikuCmd + "\""; //$NON-NLS-1$ //$NON-NLS-2$ - } - - try { - - Process runSaiku = runProcessBuilder(new String[] { saikuCmd }); - - if (commandName.equals(STOP_SAIKU)) { - int result = runSaiku.waitFor(); - logger.warn("Script ended with result {}", result); //$NON-NLS-1$ - } else if (commandName.equals(START_SAIKU)) { - Thread.sleep(6000); - } - - } catch (final IOException e) { - logger.error("Error when running Saiku start/stop command", e); //$NON-NLS-1$ - } catch (InterruptedException e) { - logger.error("Error while waiting to start", e); //$NON-NLS-1$ - Thread.currentThread().interrupt(); - } - } - } - - private void setMacJreHome(ProcessBuilder p) { - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX || SystemUtils.IS_OS_LINUX) { - - File javaFolder = new File("./java"); + Arrays.sort(files, (o1,o2) -> { + if( o1.lastModified() < o2.lastModified() ){ + return 1; + }else if( o1.lastModified() == o2.lastModified() ){ + return 0; + }else{ + return -1; + } - if (!javaFolder.exists()) { - String userName = System.getProperty("user.name"); - String testWithPath = "/Users/" + userName + "/OpenForis/CollectEarth/java"; - File testJavaPath = new File(testWithPath); - if (testJavaPath.exists()) { - javaFolder = testJavaPath; } - } - - Map environment = p.environment(); - environment.put("COLLECT_EARTH_JRE_HOME", javaFolder.getAbsolutePath()); - - /* - * // In MAC the environment variable COLLECT_EARTH_JRE_HOME is not accesible - * from outside the bash, set it again! if( SystemUtils.IS_OS_MAC || - * SystemUtils.IS_OS_MAC_OSX){ try { File javaFolder = new File("./java"); - * - * if( !javaFolder.exists() ){ String userName = - * System.getProperty("user.name"); String testWithPath = "/Users/"+userName + - * "/OpenForis/CollectEarth/java"; File testJavaPath = new File(testWithPath); - * if( testJavaPath.exists()){ javaFolder = testJavaPath; } } - * - * Process setEnv = runProcessBuilder(new String[] { "/bin/bash", "setenv", - * "COLLECT_EARTH_JRE_HOME=\""+ javaFolder.getAbsolutePath() +"\"" }); - * setEnv.waitFor(); } catch (final IOException e) { - * logger.error("Error setting the COLLECT_EARTH_JRE_HOME environment variable", - * e); //$NON-NLS-1$ } catch (InterruptedException e) { - * logger.error("Error when running COLLECT_EARTH_JRE_HOME environment variable" - * , e); //$NON-NLS-1$ } } - */ - } - } - - private Process runProcessBuilder(String[] cmd) throws IOException { - final ProcessBuilder builder = new ProcessBuilder(cmd); - - // Fixes bug with Mac OS X not using the environemnt variable set for bash - setMacJreHome(builder); - - builder.directory(new File(localPropertiesService.getSaikuFolder()).getAbsoluteFile()); - builder.redirectErrorStream(true); - Process p = builder.start(); - (new ProcessLoggerThread(p.getInputStream(), Boolean.FALSE)).start(); - (new ProcessLoggerThread(p.getErrorStream(), Boolean.TRUE)).start(); - return p; - } - - private String getCommandSuffix() { - if (SystemUtils.IS_OS_WINDOWS) { - return COMMAND_SUFFIX_BAT; - } else { - return COMMAND_SUFFIX_SH; - } - } - - private void startSaiku() throws SaikuExecutionException { - logger.warn( - "Starting the Saiku server {}{}{}", localPropertiesService.getSaikuFolder(), File.separator, START_SAIKU); //$NON-NLS-1$ - - runSaikuBat(START_SAIKU); - - this.setSaikuStarted(true); - - logger.warn("Finished starting the Saiku server"); //$NON-NLS-1$ - } + ); - void stopSaiku() throws SaikuExecutionException { - logger.warn("Stoping the Saiku server {}{}{}", localPropertiesService.getSaikuFolder() , File.separator , STOP_SAIKU); //$NON-NLS-1$ - if (isSaikuStarted()) { - runSaikuBat(STOP_SAIKU); - this.setSaikuStarted(true); - } - logger.warn("Finished stoping the Saiku server"); //$NON-NLS-1$ - } - - private void stopSaikuOnExit() { - Runtime.getRuntime().addShutdownHook(new Thread("Shutting down Saiku on exit hook") { - @Override - public void run() { - try { - if (isSaikuStarted()) { - stopSaiku(); - } - } catch (final SaikuExecutionException e) { - logger.error("The Saiku server has been de-configured after it was started", e); //$NON-NLS-1$ + for( int i = MAXIMUM_NUMBER_OF_BACKUPS; i< files.length ; i++ ){ + if( !files[i].delete() ) { + logger.error( "Error deleteting file", files[i].getAbsolutePath() ); } } - }); - } - - private boolean isSaikuStarted() { - return saikuStarted; - } - - private void setSaikuStarted(boolean saikuStarted) { - this.saikuStarted = saikuStarted; - } - - @Override - public void destroy() throws Exception { - try { - stopSaiku(); - } catch (SaikuExecutionException e) { - logger.error("Error while trying to quite Saiku before destroying the bean", e); //$NON-NLS-1$ } - } - @Override - public LocalPropertiesService getLocalPropertiesService() { - return localPropertiesService; } - @Override - public EarthSurveyService getEarthSurveyService() { - return earthSurveyService; - } - @Override - public RDBExporter getRdbExporter() { - return rdbExporter; + /** + * Returns the folder where the backup copies should be placed. + * @return The OS dependent folder where the application should saved the backed up copies. + */ + public File getAutomaticBackUpFolder() { + return FolderFinder.createFolderInAppData( BACKUP_COLLECT_EARTH); } -} \ No newline at end of file +} From 1a04f02fb6e13496907e244323151950e8fd6ac6 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:31 +0100 Subject: [PATCH 0117/1620] New translations BackupSqlLiteService.java (English) --- .../earth/app/view/Messages_en.properties | 755 ++---------------- 1 file changed, 83 insertions(+), 672 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index cba7f5812d..8c14343c96 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,731 +1,142 @@ package org.openforis.collect.earth.app.service; -import java.io.BufferedReader; import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.IOException; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.SystemUtils; -import org.apache.commons.text.StringEscapeUtils; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Date; + +import org.apache.commons.dbcp.BasicDataSource; +import org.openforis.collect.earth.app.CollectEarthUtils; import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; -import org.openforis.collect.earth.app.ad_hoc.AluToolUtils; -import org.openforis.collect.earth.app.desktop.ServerController; -import org.openforis.collect.earth.app.model.AspectCode; -import org.openforis.collect.earth.app.model.DynamicsCode; -import org.openforis.collect.earth.app.model.SlopeCode; import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; -import org.openforis.collect.model.CollectSurvey; -import org.openforis.collect.relational.CollectRDBPublisher; -import org.openforis.collect.relational.CollectRdbException; -import org.openforis.concurrency.Progress; -import org.openforis.idm.metamodel.NodeDefinition; -import org.openqa.selenium.remote.RemoteWebDriver; -import org.springframework.beans.factory.DisposableBean; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.RowMapper; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; -import com.opencsv.CSVReader; +import net.lingala.zip4j.ZipFile; -import freemarker.template.TemplateException; +/** + * Spring managed bean that handles the creation of backups of the Collect database. + * The SQLite database file will be saved everytime the application closes. + * A maximum of 10 copies (the last ten times the application was used) will be saved on the backupCollectEarth folder on the users application data folder (OS dependant). + * @author Alfonso Sanchez-Paus Diaz + * + */ @Component -public class AnalysisSaikuService extends GenerateDatabase implements DisposableBean{ - - private static final String PLOT_ADD = "plot ADD "; - - private static final String UPDATE = "UPDATE "; - - private static final String UNKNOWN = "Unknown"; - - private static final String VARCHAR_5 = " VARCHAR(5)"; - - private static final String INTEGER = " INTEGER"; - - private static final String ALTER_TABLE = "ALTER TABLE "; - - private static final String INSERT_INTO = "INSERT INTO "; - - private static final String CREATE_TABLE = "CREATE TABLE "; - - private static final String ALU_CLIMATE_ZONE_CODE = "alu_climate_zone_code"; //$NON-NLS-1$ - - private static final String ALU_SOIL_TYPE_CODE = "alu_soil_type_code"; //$NON-NLS-1$ +@Lazy(false) +public class BackupSqlLiteService implements InitializingBean{ - private static final String ALU_SUBCLASS_CODE = "alu_subclass_code"; //$NON-NLS-1$ - - private static final String DYNAMICS_ID = "dynamics_id"; //$NON-NLS-1$ - - private static final String ELEVATION_ID = "elevation_id"; //$NON-NLS-1$ - - private static final String SLOPE_ID = "slope_id"; //$NON-NLS-1$ - - private static final String ASPECT_ID = "aspect_id"; //$NON-NLS-1$ - - private static final String START_SAIKU = "start-saiku"; //$NON-NLS-1$ - - private static final String STOP_SAIKU = "stop-saiku"; //$NON-NLS-1$ - - private static final String COMMAND_SUFFIX_BAT = ".bat"; //$NON-NLS-1$ - - private static final String COMMAND_SUFFIX_SH = ".sh"; //$NON-NLS-1$ - - public static final String COLLECT_EARTH_DATABASE_RDB_DB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB - + EarthConstants.SAIKU_RDB_SUFFIX; + private static final String BACKUP_COLLECT_EARTH = "backupSqlite"; //$NON-NLS-1$ + private static final int MAXIMUM_NUMBER_OF_BACKUPS = 10; @Autowired - RDBExporter rdbExporter; + BasicDataSource dataSource; @Autowired - CollectRDBPublisher collectRDBPublisher; - - @Autowired - EarthSurveyService earthSurveyService; - - @Autowired - public LocalPropertiesService localPropertiesService; - - @Autowired - BrowserService browserService; - - @Autowired - private RegionCalculationUtils regionCalculation; - - @Autowired - private SchemaService schemaNamingService; - - private static final int ELEVATION_RANGE = 100; - - private RemoteWebDriver saikuWebDriver; - - private static final String SQLITE_FREEMARKER_HTML_TEMPLATE = "resources" + File.separator //$NON-NLS-1$ - + "collectEarthSqliteDS.fmt"; //$NON-NLS-1$ - private static final String POSTGRESQL_FREEMARKER_HTML_TEMPLATE = "resources" + File.separator //$NON-NLS-1$ - + "collectEarthPostgreSqlDS.fmt"; //$NON-NLS-1$ - public static final String MDX_XML = "collectEarthCubes.xml"; //$NON-NLS-1$ - private static final String MDX_TEMPLATE = MDX_XML + ".fmt"; //$NON-NLS-1$ - - private boolean saikuStarted; - - private void assignDimensionValues() { - try { - final String schemaName = getSchemaPrefix(); - // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id - final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query( - "SELECT " + EarthConstants.PLOT_ID + ", elevation, slope, aspect FROM " + schemaName + "plot", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - new RowMapper() { - @Override - public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { - - final Object[] updateValues = new Object[4]; - - Integer aspect = AspectCode.NA.getId(); - if (AspectCode.getAspectCode(rs.getDouble("aspect")) != null) { //$NON-NLS-1$ - aspect = AspectCode.getAspectCode(rs.getDouble("aspect")).getId(); //$NON-NLS-1$ - } - - Integer slope = SlopeCode.NA.getId(); - - if (SlopeCode.getSlopeCode((int) rs.getFloat("slope")) != null) { //$NON-NLS-1$ - slope = SlopeCode.getSlopeCode((int) rs.getFloat("slope")).getId(); //$NON-NLS-1$ - } - - updateValues[0] = aspect; - updateValues[1] = slope; - updateValues[2] = ( (int) rs.getFloat("elevation") / ELEVATION_RANGE) + 1; // 0 //$NON-NLS-1$ - - updateValues[3] = rs.getLong(EarthConstants.PLOT_ID); - return updateValues; - } - - }); - - rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + ASPECT_ID + "=?," + SLOPE_ID + "=?," //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - + ELEVATION_ID + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (Exception e) { - logger.warn("No DEM information", e); //$NON-NLS-1$ - } - } - - private String getSchemaPrefix() { - return schemaNamingService.getSchemaPrefix(ExportType.SAIKU); - } - - private void assignPngAluToolDimensionValues() { - try { - if (earthSurveyService.getCollectSurvey().getName().toLowerCase().contains("png")) { //$NON-NLS-1$ - final String schemaName = getSchemaPrefix(); - // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id - final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query("SELECT " + EarthConstants.PLOT_ID //$NON-NLS-1$ - + ", elevation, soil_fundamental, land_use_subcategory, precipitation_ranges FROM " + schemaName //$NON-NLS-1$ - + "plot LEFT JOIN " + schemaName + "precipitation_ranges_code where " //$NON-NLS-1$ //$NON-NLS-2$ - + "plot.annual_precipitation_code_id=precipitation_ranges_code.precipitation_ranges_code_id", //$NON-NLS-1$ - new RowMapper() { - @Override - public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { - - final Object[] updateValues = new Object[3]; - - try { - AluToolUtils aluToolUtils = new AluToolUtils(); - - Integer elevation = rs.getInt("elevation"); //$NON-NLS-1$ - String soilFundamental = rs.getString("soil_fundamental"); //$NON-NLS-1$ - String precipitationRange = rs.getString("precipitation_ranges"); //$NON-NLS-1$ - - int precipitation = -1; - String climateZone = UNKNOWN; //$NON-NLS-1$ - if (precipitationRange != null) { - precipitation = aluToolUtils.getPrecipitationFromRange(precipitationRange); - boolean shortDrySeason = true; // According to information from Abe PNG has less - // than 5 months of dry season - climateZone = aluToolUtils.getClimateZone(elevation, precipitation, - shortDrySeason); - } - - String soilType = UNKNOWN; //$NON-NLS-1$ - if (soilFundamental != null) { - soilType = aluToolUtils.getSoilType(soilFundamental); - } - - updateValues[0] = climateZone; - updateValues[1] = soilType; - updateValues[2] = rs.getLong(EarthConstants.PLOT_ID); - } catch (Exception e) { - logger.error("Error while processing the data", e); //$NON-NLS-1$ - updateValues[0] = UNKNOWN; //$NON-NLS-1$ - updateValues[1] = UNKNOWN; //$NON-NLS-1$ - updateValues[2] = UNKNOWN; //$NON-NLS-1$ - } - return updateValues; - } - - }); - - rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + ALU_CLIMATE_ZONE_CODE + "=?," //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + ALU_SOIL_TYPE_CODE + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ //$NON-NLS-2$ - } - } catch (Exception e) { - logger.error("No PNG ALU information", e); //$NON-NLS-1$ - } - } - - private void assignLUCDimensionValues() { - try { - final String schemaName = getSchemaPrefix(); - // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id - final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query( - "SELECT " + EarthConstants.PLOT_ID + ", land_use_subcategory FROM " + schemaName + "plot", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - new RowMapper() { - @Override - public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { - - AluToolUtils aluToolUtils = new AluToolUtils(); - final Object[] updateValues = new Object[3]; - - String collectEarthSubcategory = rs.getString("land_use_subcategory"); //$NON-NLS-1$ - Integer dynamics = DynamicsCode.getDynamicsCode(collectEarthSubcategory); - String subClass = UNKNOWN; //$NON-NLS-1$ - if (collectEarthSubcategory != null) { - subClass = aluToolUtils.getAluSubclass(collectEarthSubcategory); - } - - updateValues[0] = dynamics; - updateValues[1] = subClass; - updateValues[2] = rs.getLong(EarthConstants.PLOT_ID); - return updateValues; - } - - }); - - rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + DYNAMICS_ID + "=?," + ALU_SUBCLASS_CODE //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ - } catch (Exception e) { - logger.warn("No PNG Alu information available", e); //$NON-NLS-1$ - } - } + private LocalPropertiesService localPropertiesService; - private void createAspectAuxTable() { - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "aspect_category (" + ASPECT_ID //$NON-NLS-1$ //$NON-NLS-2$ - + " INTEGER PRIMARY KEY, aspect_caption TEXT);"); //$NON-NLS-1$ - final AspectCode[] aspects = AspectCode.values(); - for (final AspectCode aspectCode : aspects) { - rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "aspect_category values (" + aspectCode.getId() + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + aspectCode.getLabel() + "')"); //$NON-NLS-1$ - } - } - - private void createElevationtAuxTable() { - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "elevation_category ( " + ELEVATION_ID //$NON-NLS-1$ //$NON-NLS-2$ - + " INTEGER PRIMARY KEY, elevation_caption TEXT);"); //$NON-NLS-1$ - final int slots = 9000 / ELEVATION_RANGE; // Highest mountain in the world, mount everest is - // 8820m high - for (int i = 1; i <= slots; i++) { - rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "elevation_category values (" + i + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + ((i - 1) * ELEVATION_RANGE) + "-" + i //$NON-NLS-1$ - * ELEVATION_RANGE - + "')"); //$NON-NLS-1$ - } - - } - - private void createDynamicsAuxTable() { - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "dynamics_category (" + DYNAMICS_ID //$NON-NLS-1$ //$NON-NLS-2$ - + " INTEGER PRIMARY KEY, dynamics_caption TEXT);"); //$NON-NLS-1$ - final DynamicsCode[] dynamicsCodes = DynamicsCode.values(); - for (final DynamicsCode dynamicsCode : dynamicsCodes) { - rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "dynamics_category values (" + dynamicsCode.getId() //$NON-NLS-1$ //$NON-NLS-2$ - + ", '" + dynamicsCode.getLabel() + "')"); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - - private void createPlotForeignKeys() { - // Add aspect_id column to plot - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ASPECT_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + SLOPE_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ELEVATION_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + DYNAMICS_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } + private Logger logger = LoggerFactory.getLogger( BackupSqlLiteService.class ); - private void createPngAluVariables() { - if (earthSurveyService.getCollectSurvey().getName().toLowerCase().contains("png")) { //$NON-NLS-1$ - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_SOIL_TYPE_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_CLIMATE_ZONE_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - } - - private void creatAluSubclassVariables() { - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_SUBCLASS_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - - private void createSlopeAuxTable() { - final String schemaName = getSchemaPrefix(); - // Slope can be from 0 to 90 - rdbExporter.getJdbcTemplate().execute( - CREATE_TABLE + schemaName + "slope_category (slope_id INTEGER PRIMARY KEY, slope_caption TEXT);"); //$NON-NLS-1$ //$NON-NLS-2$ - final SlopeCode[] slopeCodes = SlopeCode.values(); - for (final SlopeCode slopeCode : slopeCodes) { - rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "slope_category values (" + slopeCode.getId() + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + slopeCode.getLabel() + "')"); //$NON-NLS-1$ - } - } - - private String getSaikuConfigurationFilePath() { - - String configFile = localPropertiesService.getSaikuFolder() + "/" //$NON-NLS-1$ - + "tomcat/webapps/saiku/WEB-INF/classes/saiku-datasources/collectEarthDS"; //$NON-NLS-1$ - configFile = configFile.replace('/', File.separatorChar); - return configFile; - } - - private String getSaikuThreeConfigurationFilePath() { - - String configFile = localPropertiesService.getSaikuFolder() + "/" //$NON-NLS-1$ - + "tomcat/webapps/saiku/WEB-INF/classes/legacy-datasources/collectEarthDS"; //$NON-NLS-1$ - configFile = configFile.replace('/', File.separatorChar); - return configFile; - } - - private boolean isSaikuConfigured() { - return localPropertiesService.getSaikuFolder() != null - && isSaikuFolder(new File(localPropertiesService.getSaikuFolder())); + @Override + public void afterPropertiesSet() throws Exception { + attachShutDownHook(); } - /* - * private boolean isJavaHomeConfigured() { - * - * if (SystemUtils.IS_OS_MAC){ return true; } return ! ( StringUtils.isBlank( - * System.getenv("JAVA_HOME") ) //$NON-NLS-1$ && StringUtils.isBlank( - * System.getenv("JRE_HOME") ) //$NON-NLS-1$ && StringUtils.isBlank( - * System.getenv("COLLECT_EARTH_JRE_HOME") ) //$NON-NLS-1$ ); } - */ - - public boolean isSaikuFolder(File saikuFolder) { - boolean isSaikuFolder = false; - if (saikuFolder.listFiles() != null) { - for (final File file : saikuFolder.listFiles()) { - if (file.getName().equals(START_SAIKU + getCommandSuffix())) { - isSaikuFolder = true; + private void attachShutDownHook() { + Runtime.getRuntime().addShutdownHook(new Thread("Shutdown hook - Backup Database") { + @Override + public void run() { + if ( "true".equals(localPropertiesService.getValue(EarthProperty.AUTOMATIC_BACKUP) ) ) { //$NON-NLS-1$ + automaticDBBackup(); } } - } - return isSaikuFolder; - } - private void openSaiku() throws BrowserNotFoundException { - saikuWebDriver = browserService.navigateTo("http://127.0.0.1:8181", saikuWebDriver, false); //$NON-NLS-1$ - if (browserService.waitFor("username", saikuWebDriver)) { //$NON-NLS-1$ - saikuWebDriver.findElementByName("username").sendKeys("admin"); //$NON-NLS-1$ //$NON-NLS-2$ - saikuWebDriver.findElementByName("password").sendKeys("admin"); //$NON-NLS-1$ //$NON-NLS-2$ - saikuWebDriver.findElementByClassName("form_button").click(); //$NON-NLS-1$ - } + }); } + private void automaticDBBackup() { + if( localPropertiesService.isUsingSqliteDB() ){ - public void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws SaikuExecutionException { + String pathToBackupZip = ""; //$NON-NLS-1$ - try { - - stopSaiku(); + String nameCollectDB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB; + File originalDBFile = new File(nameCollectDB); try { - if ((localPropertiesService.isUsingSqliteDB() && !getZippedProjectDB( ExportType.SAIKU ).exists()) - || isRefreshDatabase()) { - - // The user clicked on the option to refresh the database, or there is no - // previous copy of the Saiku DB - // Generate the DB file - rdbExporter.exportDataToRDB( - earthSurveyService.getCollectSurvey(), - ExportType.SAIKU, - progressListener, - this::processQuantityData - ); - - try { - // Save the DB file in a zipped file to extends GenerateDatabase keep for the next usages - replaceZippedProjectDB( ExportType.SAIKU ); - } catch (Exception e) { - logger.error("Error while refreshing the Zipped content of the project Saiku DB", e); - } + pathToBackupZip = getBackupZipFilename(); - } else if (getZippedProjectDB(ExportType.SAIKU).exists() && localPropertiesService.isUsingSqliteDB()) { - // If the zipped version of the project exists ( and the user clicked on the - // option to not refresh it) then restore this last version of the data - restoreZippedProjectDB(ExportType.SAIKU); + try( ZipFile zipFile = CollectEarthUtils.addFileToZip(pathToBackupZip, originalDBFile, EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME) ){ + removeExtraBackups(); } - refreshDataSourceForSaiku(); - - if (startSaikuAfterDBExport && !isUserCancelledOperation()) { - startSaiku(); - new Thread("Opening Saiku") { - @Override - public void run() { - try { - AnalysisSaikuService.this.openSaiku(); - } catch (BrowserNotFoundException e) { - logger.error("No browser has been set up", e); //$NON-NLS-1$ - } - }; - }.start(); - - stopSaikuOnExit(); - } - } catch (final IOException e) { - logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ - } catch (TemplateException e1) { - logger.error("Error while applying the freemarker template tothe Saiku data source", e1); //$NON-NLS-1$ + } catch (IOException e) { + logger.error("Error when create backup of the Collect Earth Database from " + nameCollectDB + " to " + pathToBackupZip, e); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (Exception e) { + logger.error("Error when zipping the Collect Earth Database from " + nameCollectDB + " to " + pathToBackupZip, e); //$NON-NLS-1$ //$NON-NLS-2$ } - - } catch (final CollectRdbException e) { - logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ } } - private void processQuantityData(InfiniteProgressMonitor progressListener) { - - SwingUtilities.invokeLater( () -> progressListener.setMessage("Preparing Saiku data for analysis") ); - - progressListener.progressMade(new Progress(0, 100)); - createPngAluVariables(); - createPlotForeignKeys(); - - progressListener.progressMade(new Progress(25, 100)); - - if (!surveyContains("calculated_elevation_range", earthSurveyService.getCollectSurvey())) { - createAspectAuxTable(); - createSlopeAuxTable(); - createElevationtAuxTable(); - assignDimensionValues(); - - } - progressListener.progressMade(new Progress(50, 100)); - - if (!surveyContains("calculated_initial_land_use", earthSurveyService.getCollectSurvey())) { - createDynamicsAuxTable(); - creatAluSubclassVariables(); - assignLUCDimensionValues(); - - } - progressListener.progressMade(new Progress(75, 100)); - - assignPngAluToolDimensionValues(); - - SwingUtilities.invokeLater( () -> progressListener.setMessage("Calculating expansion factors") ); - - regionCalculation.handleRegionCalculation( ExportType.SAIKU, rdbExporter.getJdbcTemplate() ); - progressListener.progressMade(new Progress(100, 100)); - + private String getBackupZipFilename() throws IOException { + File backupFolder = getAutomaticBackUpFolder(); + return getDBCopyName(backupFolder); } - public static boolean surveyContains(String nodeName, CollectSurvey survey) { - NodeDefinition nodeDefForNAme = survey.getSchema().findNodeDefinition( nodeDef -> nodeDef.getName().equals(nodeName) ); - return nodeDefForNAme != null; + public String getDBCopyName(File backupFolder) throws IOException { + String pathToBackup; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HHmmss"); //$NON-NLS-1$ + StringBuilder destPathStr = new StringBuilder(); + destPathStr.append(backupFolder.getCanonicalPath()); + destPathStr.append(File.separatorChar); + destPathStr.append( EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME); + destPathStr.append(sdf.format( new Date() )).append( ".zip"); + pathToBackup = destPathStr.toString(); + return pathToBackup; } - public static CSVReader getCsvReader(String csvFile) throws FileNotFoundException { - final BufferedReader bufferedReader = new BufferedReader( - new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 ) ); //$NON-NLS-1$ - return new CSVReader(bufferedReader); - } + private void removeExtraBackups() { - private void refreshDataSourceForSaiku() throws IOException, TemplateException { - final File mdxFile = new File(localPropertiesService.getProjectFolder() + File.separatorChar + MDX_XML); + File backupFolder = getAutomaticBackUpFolder(); - Map data = new HashMap<>(); - data.put("cubeFilePath", StringEscapeUtils.escapeJava(mdxFile.getAbsolutePath().replace('\\', '/'))); //$NON-NLS-1$ + File[] files = backupFolder.listFiles(); + if( files!=null && files.length > MAXIMUM_NUMBER_OF_BACKUPS ){ - final File mdxTemplate = getMdxTemplate(); - final File dataSourceTemplate = getDataSourceTemplate(data); - - // First try Saiku 2.5/2.6 - File dataSourceFile; - try { - dataSourceFile = new File(getSaikuConfigurationFilePath()); - FreemarkerTemplateUtils.applyTemplate(dataSourceTemplate, dataSourceFile, data); - } catch (Exception e) { - logger.error("Error starting Saiku", e); - dataSourceFile = new File(getSaikuThreeConfigurationFilePath()); - FreemarkerTemplateUtils.applyTemplate(dataSourceTemplate, dataSourceFile, data); - } - - setMdxSaikuSchema(mdxTemplate, mdxFile); - } - - private File getMdxTemplate() throws IOException { - final File mdxFileTemplate = new File( - localPropertiesService.getProjectFolder() + File.separatorChar + MDX_TEMPLATE); - if (!mdxFileTemplate.exists()) { - throw new IOException( - "The file containing the MDX Cube definition Template does not exist in expected location " //$NON-NLS-1$ - + mdxFileTemplate.getAbsolutePath()); - } - return mdxFileTemplate; - } - - private File getDataSourceTemplate(Map data) throws IOException { - File dataSourceTemplate = null; - - if (localPropertiesService.isUsingSqliteDB()) { - dataSourceTemplate = new File(SQLITE_FREEMARKER_HTML_TEMPLATE); - final File rdbDb = rdbExporter.getRdbFile( ExportType.SAIKU ); - if (!rdbDb.exists()) { - throw new IOException( - "The file contianing the Relational SQLite Database does not exist in expected location " //$NON-NLS-1$ - + rdbDb.getAbsolutePath()); - } - data.put("rdbFilePath", StringEscapeUtils.escapeJava(rdbDb.getAbsolutePath().replace('\\', '/'))); //$NON-NLS-1$ - } else { - dataSourceTemplate = new File(POSTGRESQL_FREEMARKER_HTML_TEMPLATE); - CollectDBDriver collectDBDriver = localPropertiesService.getCollectDBDriver(); - data.put("dbUrl", StringEscapeUtils.escapeJava(ServerController.getSaikuDbURL(collectDBDriver))); //$NON-NLS-1$ - data.put("username", //$NON-NLS-1$ - StringEscapeUtils.escapeJava(localPropertiesService.getValue(EarthProperty.DB_USERNAME))); - data.put("password", //$NON-NLS-1$ - StringEscapeUtils.escapeJava(localPropertiesService.getValue(EarthProperty.DB_PASSWORD))); - } - - if (!dataSourceTemplate.exists()) { - throw new IOException( - "The file containing the Saiku Data Source template does not exist in expected location " //$NON-NLS-1$ - + dataSourceTemplate.getAbsolutePath()); - } - - return dataSourceTemplate; - } - - private void setMdxSaikuSchema(final File mdxFileTemplate, final File mdxFile) - throws IOException, TemplateException { - Map saikuData = new HashMap<>(); - String saikuSchemaName = getSchemaName(); - if (saikuSchemaName == null) { - saikuSchemaName = ""; //$NON-NLS-1$ - } - saikuData.put("saikuDbSchema", saikuSchemaName); //$NON-NLS-1$ - FreemarkerTemplateUtils.applyTemplate(mdxFileTemplate, mdxFile, saikuData); - } - - private void runSaikuBat(String commandName) throws SaikuExecutionException { - if (!isSaikuConfigured()) { - throw new SaikuExecutionException("The Saiku server is not configured."); //$NON-NLS-1$ - } - - else { - String saikuCmd = localPropertiesService.getSaikuFolder() + File.separator + commandName - + getCommandSuffix(); - - if (SystemUtils.IS_OS_WINDOWS) { - saikuCmd = "\"" + saikuCmd + "\""; //$NON-NLS-1$ //$NON-NLS-2$ - } - - try { - - Process runSaiku = runProcessBuilder(new String[] { saikuCmd }); - - if (commandName.equals(STOP_SAIKU)) { - int result = runSaiku.waitFor(); - logger.warn("Script ended with result {}", result); //$NON-NLS-1$ - } else if (commandName.equals(START_SAIKU)) { - Thread.sleep(6000); - } - - } catch (final IOException e) { - logger.error("Error when running Saiku start/stop command", e); //$NON-NLS-1$ - } catch (InterruptedException e) { - logger.error("Error while waiting to start", e); //$NON-NLS-1$ - Thread.currentThread().interrupt(); - } - } - } - - private void setMacJreHome(ProcessBuilder p) { - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX || SystemUtils.IS_OS_LINUX) { - - File javaFolder = new File("./java"); + Arrays.sort(files, (o1,o2) -> { + if( o1.lastModified() < o2.lastModified() ){ + return 1; + }else if( o1.lastModified() == o2.lastModified() ){ + return 0; + }else{ + return -1; + } - if (!javaFolder.exists()) { - String userName = System.getProperty("user.name"); - String testWithPath = "/Users/" + userName + "/OpenForis/CollectEarth/java"; - File testJavaPath = new File(testWithPath); - if (testJavaPath.exists()) { - javaFolder = testJavaPath; } - } - - Map environment = p.environment(); - environment.put("COLLECT_EARTH_JRE_HOME", javaFolder.getAbsolutePath()); - - /* - * // In MAC the environment variable COLLECT_EARTH_JRE_HOME is not accesible - * from outside the bash, set it again! if( SystemUtils.IS_OS_MAC || - * SystemUtils.IS_OS_MAC_OSX){ try { File javaFolder = new File("./java"); - * - * if( !javaFolder.exists() ){ String userName = - * System.getProperty("user.name"); String testWithPath = "/Users/"+userName + - * "/OpenForis/CollectEarth/java"; File testJavaPath = new File(testWithPath); - * if( testJavaPath.exists()){ javaFolder = testJavaPath; } } - * - * Process setEnv = runProcessBuilder(new String[] { "/bin/bash", "setenv", - * "COLLECT_EARTH_JRE_HOME=\""+ javaFolder.getAbsolutePath() +"\"" }); - * setEnv.waitFor(); } catch (final IOException e) { - * logger.error("Error setting the COLLECT_EARTH_JRE_HOME environment variable", - * e); //$NON-NLS-1$ } catch (InterruptedException e) { - * logger.error("Error when running COLLECT_EARTH_JRE_HOME environment variable" - * , e); //$NON-NLS-1$ } } - */ - } - } - - private Process runProcessBuilder(String[] cmd) throws IOException { - final ProcessBuilder builder = new ProcessBuilder(cmd); - - // Fixes bug with Mac OS X not using the environemnt variable set for bash - setMacJreHome(builder); - - builder.directory(new File(localPropertiesService.getSaikuFolder()).getAbsoluteFile()); - builder.redirectErrorStream(true); - Process p = builder.start(); - (new ProcessLoggerThread(p.getInputStream(), Boolean.FALSE)).start(); - (new ProcessLoggerThread(p.getErrorStream(), Boolean.TRUE)).start(); - return p; - } - - private String getCommandSuffix() { - if (SystemUtils.IS_OS_WINDOWS) { - return COMMAND_SUFFIX_BAT; - } else { - return COMMAND_SUFFIX_SH; - } - } - - private void startSaiku() throws SaikuExecutionException { - logger.warn( - "Starting the Saiku server {}{}{}", localPropertiesService.getSaikuFolder(), File.separator, START_SAIKU); //$NON-NLS-1$ - - runSaikuBat(START_SAIKU); - - this.setSaikuStarted(true); - - logger.warn("Finished starting the Saiku server"); //$NON-NLS-1$ - } + ); - void stopSaiku() throws SaikuExecutionException { - logger.warn("Stoping the Saiku server {}{}{}", localPropertiesService.getSaikuFolder() , File.separator , STOP_SAIKU); //$NON-NLS-1$ - if (isSaikuStarted()) { - runSaikuBat(STOP_SAIKU); - this.setSaikuStarted(true); - } - logger.warn("Finished stoping the Saiku server"); //$NON-NLS-1$ - } - - private void stopSaikuOnExit() { - Runtime.getRuntime().addShutdownHook(new Thread("Shutting down Saiku on exit hook") { - @Override - public void run() { - try { - if (isSaikuStarted()) { - stopSaiku(); - } - } catch (final SaikuExecutionException e) { - logger.error("The Saiku server has been de-configured after it was started", e); //$NON-NLS-1$ + for( int i = MAXIMUM_NUMBER_OF_BACKUPS; i< files.length ; i++ ){ + if( !files[i].delete() ) { + logger.error( "Error deleteting file", files[i].getAbsolutePath() ); } } - }); - } - - private boolean isSaikuStarted() { - return saikuStarted; - } - - private void setSaikuStarted(boolean saikuStarted) { - this.saikuStarted = saikuStarted; - } - - @Override - public void destroy() throws Exception { - try { - stopSaiku(); - } catch (SaikuExecutionException e) { - logger.error("Error while trying to quite Saiku before destroying the bean", e); //$NON-NLS-1$ } - } - @Override - public LocalPropertiesService getLocalPropertiesService() { - return localPropertiesService; } - @Override - public EarthSurveyService getEarthSurveyService() { - return earthSurveyService; - } - @Override - public RDBExporter getRdbExporter() { - return rdbExporter; + /** + * Returns the folder where the backup copies should be placed. + * @return The OS dependent folder where the application should saved the backed up copies. + */ + public File getAutomaticBackUpFolder() { + return FolderFinder.createFolderInAppData( BACKUP_COLLECT_EARTH); } -} \ No newline at end of file +} From 71506fa7e35b5702045a6f24c2e2aa6a115e660b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:33 +0100 Subject: [PATCH 0118/1620] New translations BrowserNotFoundException.java (French) --- .../earth/app/view/Messages_fr.properties | 142 ++---------------- 1 file changed, 14 insertions(+), 128 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 8c14343c96..6570688ad6 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,142 +1,28 @@ package org.openforis.collect.earth.app.service; -import java.io.File; -import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.Arrays; -import java.util.Date; +public class BrowserNotFoundException extends Exception{ -import org.apache.commons.dbcp.BasicDataSource; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; - -import net.lingala.zip4j.ZipFile; - - -/** - * Spring managed bean that handles the creation of backups of the Collect database. - * The SQLite database file will be saved everytime the application closes. - * A maximum of 10 copies (the last ten times the application was used) will be saved on the backupCollectEarth folder on the users application data folder (OS dependant). - * @author Alfonso Sanchez-Paus Diaz - * - */ -@Component -@Lazy(false) -public class BackupSqlLiteService implements InitializingBean{ - - private static final String BACKUP_COLLECT_EARTH = "backupSqlite"; //$NON-NLS-1$ - - private static final int MAXIMUM_NUMBER_OF_BACKUPS = 10; - - @Autowired - BasicDataSource dataSource; - - @Autowired - private LocalPropertiesService localPropertiesService; - - private Logger logger = LoggerFactory.getLogger( BackupSqlLiteService.class ); - - @Override - public void afterPropertiesSet() throws Exception { - attachShutDownHook(); - } - - private void attachShutDownHook() { - Runtime.getRuntime().addShutdownHook(new Thread("Shutdown hook - Backup Database") { - @Override - public void run() { - if ( "true".equals(localPropertiesService.getValue(EarthProperty.AUTOMATIC_BACKUP) ) ) { //$NON-NLS-1$ - automaticDBBackup(); - } - } - - }); - } - - private void automaticDBBackup() { - if( localPropertiesService.isUsingSqliteDB() ){ - - String pathToBackupZip = ""; //$NON-NLS-1$ - - String nameCollectDB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB; - File originalDBFile = new File(nameCollectDB); - - try { - - pathToBackupZip = getBackupZipFilename(); - - try( ZipFile zipFile = CollectEarthUtils.addFileToZip(pathToBackupZip, originalDBFile, EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME) ){ - removeExtraBackups(); - } + /** + * + */ + private static final long serialVersionUID = -404938492481063378L; - } catch (IOException e) { - logger.error("Error when create backup of the Collect Earth Database from " + nameCollectDB + " to " + pathToBackupZip, e); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (Exception e) { - logger.error("Error when zipping the Collect Earth Database from " + nameCollectDB + " to " + pathToBackupZip, e); //$NON-NLS-1$ //$NON-NLS-2$ - } - } + public BrowserNotFoundException() { + super(); } - private String getBackupZipFilename() throws IOException { - File backupFolder = getAutomaticBackUpFolder(); - return getDBCopyName(backupFolder); - } - public String getDBCopyName(File backupFolder) throws IOException { - String pathToBackup; - SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HHmmss"); //$NON-NLS-1$ - StringBuilder destPathStr = new StringBuilder(); - destPathStr.append(backupFolder.getCanonicalPath()); - destPathStr.append(File.separatorChar); - destPathStr.append( EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME); - destPathStr.append(sdf.format( new Date() )).append( ".zip"); - pathToBackup = destPathStr.toString(); - return pathToBackup; + public BrowserNotFoundException(String message, Throwable cause) { + super(message, cause); } - private void removeExtraBackups() { - - File backupFolder = getAutomaticBackUpFolder(); - - File[] files = backupFolder.listFiles(); - if( files!=null && files.length > MAXIMUM_NUMBER_OF_BACKUPS ){ - - Arrays.sort(files, (o1,o2) -> { - if( o1.lastModified() < o2.lastModified() ){ - return 1; - }else if( o1.lastModified() == o2.lastModified() ){ - return 0; - }else{ - return -1; - } - - } - ); - - for( int i = MAXIMUM_NUMBER_OF_BACKUPS; i< files.length ; i++ ){ - if( !files[i].delete() ) { - logger.error( "Error deleteting file", files[i].getAbsolutePath() ); - } - } - - } - + public BrowserNotFoundException(String message) { + super(message); } - - /** - * Returns the folder where the backup copies should be placed. - * @return The OS dependent folder where the application should saved the backed up copies. - */ - public File getAutomaticBackUpFolder() { - return FolderFinder.createFolderInAppData( BACKUP_COLLECT_EARTH); + public BrowserNotFoundException(Throwable cause) { + super(cause); } + } From 18fb1484ac2608ac6714ac7dc7fd88c2b8dc3151 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:33 +0100 Subject: [PATCH 0119/1620] New translations BrowserNotFoundException.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 142 ++---------------- 1 file changed, 14 insertions(+), 128 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 8c14343c96..6570688ad6 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,142 +1,28 @@ package org.openforis.collect.earth.app.service; -import java.io.File; -import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.Arrays; -import java.util.Date; +public class BrowserNotFoundException extends Exception{ -import org.apache.commons.dbcp.BasicDataSource; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; - -import net.lingala.zip4j.ZipFile; - - -/** - * Spring managed bean that handles the creation of backups of the Collect database. - * The SQLite database file will be saved everytime the application closes. - * A maximum of 10 copies (the last ten times the application was used) will be saved on the backupCollectEarth folder on the users application data folder (OS dependant). - * @author Alfonso Sanchez-Paus Diaz - * - */ -@Component -@Lazy(false) -public class BackupSqlLiteService implements InitializingBean{ - - private static final String BACKUP_COLLECT_EARTH = "backupSqlite"; //$NON-NLS-1$ - - private static final int MAXIMUM_NUMBER_OF_BACKUPS = 10; - - @Autowired - BasicDataSource dataSource; - - @Autowired - private LocalPropertiesService localPropertiesService; - - private Logger logger = LoggerFactory.getLogger( BackupSqlLiteService.class ); - - @Override - public void afterPropertiesSet() throws Exception { - attachShutDownHook(); - } - - private void attachShutDownHook() { - Runtime.getRuntime().addShutdownHook(new Thread("Shutdown hook - Backup Database") { - @Override - public void run() { - if ( "true".equals(localPropertiesService.getValue(EarthProperty.AUTOMATIC_BACKUP) ) ) { //$NON-NLS-1$ - automaticDBBackup(); - } - } - - }); - } - - private void automaticDBBackup() { - if( localPropertiesService.isUsingSqliteDB() ){ - - String pathToBackupZip = ""; //$NON-NLS-1$ - - String nameCollectDB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB; - File originalDBFile = new File(nameCollectDB); - - try { - - pathToBackupZip = getBackupZipFilename(); - - try( ZipFile zipFile = CollectEarthUtils.addFileToZip(pathToBackupZip, originalDBFile, EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME) ){ - removeExtraBackups(); - } + /** + * + */ + private static final long serialVersionUID = -404938492481063378L; - } catch (IOException e) { - logger.error("Error when create backup of the Collect Earth Database from " + nameCollectDB + " to " + pathToBackupZip, e); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (Exception e) { - logger.error("Error when zipping the Collect Earth Database from " + nameCollectDB + " to " + pathToBackupZip, e); //$NON-NLS-1$ //$NON-NLS-2$ - } - } + public BrowserNotFoundException() { + super(); } - private String getBackupZipFilename() throws IOException { - File backupFolder = getAutomaticBackUpFolder(); - return getDBCopyName(backupFolder); - } - public String getDBCopyName(File backupFolder) throws IOException { - String pathToBackup; - SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HHmmss"); //$NON-NLS-1$ - StringBuilder destPathStr = new StringBuilder(); - destPathStr.append(backupFolder.getCanonicalPath()); - destPathStr.append(File.separatorChar); - destPathStr.append( EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME); - destPathStr.append(sdf.format( new Date() )).append( ".zip"); - pathToBackup = destPathStr.toString(); - return pathToBackup; + public BrowserNotFoundException(String message, Throwable cause) { + super(message, cause); } - private void removeExtraBackups() { - - File backupFolder = getAutomaticBackUpFolder(); - - File[] files = backupFolder.listFiles(); - if( files!=null && files.length > MAXIMUM_NUMBER_OF_BACKUPS ){ - - Arrays.sort(files, (o1,o2) -> { - if( o1.lastModified() < o2.lastModified() ){ - return 1; - }else if( o1.lastModified() == o2.lastModified() ){ - return 0; - }else{ - return -1; - } - - } - ); - - for( int i = MAXIMUM_NUMBER_OF_BACKUPS; i< files.length ; i++ ){ - if( !files[i].delete() ) { - logger.error( "Error deleteting file", files[i].getAbsolutePath() ); - } - } - - } - + public BrowserNotFoundException(String message) { + super(message); } - - /** - * Returns the folder where the backup copies should be placed. - * @return The OS dependent folder where the application should saved the backed up copies. - */ - public File getAutomaticBackUpFolder() { - return FolderFinder.createFolderInAppData( BACKUP_COLLECT_EARTH); + public BrowserNotFoundException(Throwable cause) { + super(cause); } + } From f168fd96cb55fa10d53a6458ace059493c3abfe6 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:34 +0100 Subject: [PATCH 0120/1620] New translations .gitignore (Portuguese) --- .../earth/app/view/Messages_pt.properties | 29 +------------------ 1 file changed, 1 insertion(+), 28 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 6570688ad6..fa1df1b41e 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,28 +1 @@ -package org.openforis.collect.earth.app.service; - -public class BrowserNotFoundException extends Exception{ - - /** - * - */ - private static final long serialVersionUID = -404938492481063378L; - - public BrowserNotFoundException() { - super(); - } - - - public BrowserNotFoundException(String message, Throwable cause) { - super(message, cause); - } - - public BrowserNotFoundException(String message) { - super(message); - } - - public BrowserNotFoundException(Throwable cause) { - super(cause); - } - - -} +/DataRepositoryService.java_bc From 7f7c191b9e19b932109d2e210b67da9effe54c0a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:36 +0100 Subject: [PATCH 0121/1620] New translations BrowserNotFoundException.java (English) --- .../earth/app/view/Messages_en.properties | 142 ++---------------- 1 file changed, 14 insertions(+), 128 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 8c14343c96..6570688ad6 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,142 +1,28 @@ package org.openforis.collect.earth.app.service; -import java.io.File; -import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.Arrays; -import java.util.Date; +public class BrowserNotFoundException extends Exception{ -import org.apache.commons.dbcp.BasicDataSource; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; - -import net.lingala.zip4j.ZipFile; - - -/** - * Spring managed bean that handles the creation of backups of the Collect database. - * The SQLite database file will be saved everytime the application closes. - * A maximum of 10 copies (the last ten times the application was used) will be saved on the backupCollectEarth folder on the users application data folder (OS dependant). - * @author Alfonso Sanchez-Paus Diaz - * - */ -@Component -@Lazy(false) -public class BackupSqlLiteService implements InitializingBean{ - - private static final String BACKUP_COLLECT_EARTH = "backupSqlite"; //$NON-NLS-1$ - - private static final int MAXIMUM_NUMBER_OF_BACKUPS = 10; - - @Autowired - BasicDataSource dataSource; - - @Autowired - private LocalPropertiesService localPropertiesService; - - private Logger logger = LoggerFactory.getLogger( BackupSqlLiteService.class ); - - @Override - public void afterPropertiesSet() throws Exception { - attachShutDownHook(); - } - - private void attachShutDownHook() { - Runtime.getRuntime().addShutdownHook(new Thread("Shutdown hook - Backup Database") { - @Override - public void run() { - if ( "true".equals(localPropertiesService.getValue(EarthProperty.AUTOMATIC_BACKUP) ) ) { //$NON-NLS-1$ - automaticDBBackup(); - } - } - - }); - } - - private void automaticDBBackup() { - if( localPropertiesService.isUsingSqliteDB() ){ - - String pathToBackupZip = ""; //$NON-NLS-1$ - - String nameCollectDB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB; - File originalDBFile = new File(nameCollectDB); - - try { - - pathToBackupZip = getBackupZipFilename(); - - try( ZipFile zipFile = CollectEarthUtils.addFileToZip(pathToBackupZip, originalDBFile, EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME) ){ - removeExtraBackups(); - } + /** + * + */ + private static final long serialVersionUID = -404938492481063378L; - } catch (IOException e) { - logger.error("Error when create backup of the Collect Earth Database from " + nameCollectDB + " to " + pathToBackupZip, e); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (Exception e) { - logger.error("Error when zipping the Collect Earth Database from " + nameCollectDB + " to " + pathToBackupZip, e); //$NON-NLS-1$ //$NON-NLS-2$ - } - } + public BrowserNotFoundException() { + super(); } - private String getBackupZipFilename() throws IOException { - File backupFolder = getAutomaticBackUpFolder(); - return getDBCopyName(backupFolder); - } - public String getDBCopyName(File backupFolder) throws IOException { - String pathToBackup; - SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HHmmss"); //$NON-NLS-1$ - StringBuilder destPathStr = new StringBuilder(); - destPathStr.append(backupFolder.getCanonicalPath()); - destPathStr.append(File.separatorChar); - destPathStr.append( EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME); - destPathStr.append(sdf.format( new Date() )).append( ".zip"); - pathToBackup = destPathStr.toString(); - return pathToBackup; + public BrowserNotFoundException(String message, Throwable cause) { + super(message, cause); } - private void removeExtraBackups() { - - File backupFolder = getAutomaticBackUpFolder(); - - File[] files = backupFolder.listFiles(); - if( files!=null && files.length > MAXIMUM_NUMBER_OF_BACKUPS ){ - - Arrays.sort(files, (o1,o2) -> { - if( o1.lastModified() < o2.lastModified() ){ - return 1; - }else if( o1.lastModified() == o2.lastModified() ){ - return 0; - }else{ - return -1; - } - - } - ); - - for( int i = MAXIMUM_NUMBER_OF_BACKUPS; i< files.length ; i++ ){ - if( !files[i].delete() ) { - logger.error( "Error deleteting file", files[i].getAbsolutePath() ); - } - } - - } - + public BrowserNotFoundException(String message) { + super(message); } - - /** - * Returns the folder where the backup copies should be placed. - * @return The OS dependent folder where the application should saved the backed up copies. - */ - public File getAutomaticBackUpFolder() { - return FolderFinder.createFolderInAppData( BACKUP_COLLECT_EARTH); + public BrowserNotFoundException(Throwable cause) { + super(cause); } + } From 4297e96e0fdb4eba4df8b6d3267dc48bb620d74d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:37 +0100 Subject: [PATCH 0122/1620] New translations BrowserService.java (French) --- .../earth/app/view/Messages_fr.properties | 905 +++++++++++++++++- 1 file changed, 893 insertions(+), 12 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 6570688ad6..5a933d094d 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,28 +1,909 @@ package org.openforis.collect.earth.app.service; -public class BrowserNotFoundException extends Exception{ +import java.io.BufferedWriter; +import java.io.File; +import java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; +import java.net.URI; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Observable; +import java.util.Observer; +import java.util.concurrent.CopyOnWriteArrayList; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.desktop.ServerController.ServerInitializationEvent; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.sampler.model.SimpleCoordinate; +import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; +import org.openqa.selenium.By; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.WebDriverException; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.firefox.GeckoDriverService; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import freemarker.cache.FileTemplateLoader; +import freemarker.template.Configuration; +import freemarker.template.Template; +import freemarker.template.TemplateException; +import freemarker.template.Version; +import io.github.bonigarcia.wdm.WebDriverManager; +import liquibase.repackaged.org.apache.commons.lang3.SystemUtils; + +/** + * This class contains methods that allow Collect Earth to open browser windows + * that allow the user to have a better understanding of the plot. So far there + * are integrations with Google Earth Engine, Google Earth Engine Timelapse and + * Bing Maps. When a user clicks on a plot Collect Earth will check if the + * program is set to open any of these integrations, and if it is so it will + * open each one in its own window. These windows are closed when the program + * is closed. + *s + * @author Alfonso Sanchez-Paus Diaz + * + */ +@Component +public class BrowserService implements InitializingBean, Observer { + + + @Autowired + private LocalPropertiesService localPropertiesService; + + @Autowired + private GeolocalizeMapService geoLocalizeTemplateService; + + @Autowired + private EarthSurveyService earthSurveyService; + + @Autowired + private CodeEditorHandlerThread codeEditorHandlerThread; + + private final ArrayList drivers = new ArrayList<>(); + private final Logger logger = LoggerFactory.getLogger(BrowserService.class); + private static final String TEMPLATE_FOR_DGMAP_JS = "resources/javascript_dgmap.fmt"; + private static final Configuration cfg = new Configuration(new Version("2.3.23")); + private RemoteWebDriver webDriverBing, webDriverBaidu, webDriverTimelapse, webDriverGeeCodeEditor, + webDriverHere, webDriverStreetView, webDriverYandex, webDriverPlanetHtml, webDriverExtraMap, webDriverSecureWatch, + webDriverGEEMap, webDriverEarthMap; + + + Map locks = new HashMap(); + + private static boolean geeMethodUpdated = false; + + private boolean isClosing = false; + + public void closeBrowsers() { + synchronized (this) { + getClosingBrowsersThread().start(); + } + } + + @Override + public void afterPropertiesSet() throws Exception { + Runtime.getRuntime().addShutdownHook(getClosingBrowsersThread()); + setGeckoDriverPath(); + } + + private RemoteWebDriver chooseDriver() throws BrowserNotFoundException { + RemoteWebDriver driver = null; + final String browserSetInProperties = localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim(); + + if (browserSetInProperties.equalsIgnoreCase(EarthConstants.CHROME_BROWSER)) { + driver = tryStartChrome(); + } else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.FIREFOX_BROWSER)) { + driver = tryStartFirefox(); + } else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.EDGE_BROWSER)) { + driver = tryStartEdge(); + }else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.SAFARI_BROWSER)) { + driver = tryStartSafari(); + } + + // If the browser chosen is not installed try to find and installed browser in the computer + if( driver== null ) { + driver = tryStartChrome(); + if( driver== null ) { + driver = tryStartFirefox(); + } + if( driver== null ) { + driver = tryStartEdge(); + } + if( driver== null ) { + driver = tryStartSafari(); + } + } + + if (driver == null) { + throw new BrowserNotFoundException( + "Neither Chrome nor Firefox could be opened. You need to have one of them installed in order to use GEE, Bing Maps or Saiku."); + } + + return driver; + } + + private RemoteWebDriver tryStartFirefox() { + RemoteWebDriver driver = null; + try { + driver = (RemoteWebDriver) WebDriverManager.firefoxdriver().create(); + } catch (final WebDriverException e) { + logger.warn( + "Problem starting Firefox browser!", + e); + } + return driver; + } + + private RemoteWebDriver tryStartEdge() { + RemoteWebDriver driver = null; + try { + driver = (RemoteWebDriver) WebDriverManager.edgedriver().create(); + } catch (final WebDriverException e) { + logger.warn( + "Problem starting Edge browser", + e); + } + return driver; + } + + private RemoteWebDriver tryStartSafari() { + RemoteWebDriver driver = null; + try { + driver = (RemoteWebDriver) WebDriverManager.safaridriver().create(); + } catch (final WebDriverException e) { + logger.warn( + "Problem starting Safari browser", + e); + } + return driver; + } + + private RemoteWebDriver tryStartChrome() { + RemoteWebDriver driver = null; + try { + driver = (RemoteWebDriver) WebDriverManager.chromedriver().create(); + } catch (final Exception e) { + logger.warn( + "Problem starting Chrome browser", + e); + } + return driver; + } + + + private String getDGMapJavascript(SimplePlacemarkObject placemarkObject) { + final Map data = geoLocalizeTemplateService.getPlacemarkData(placemarkObject); + data.put("latitude", placemarkObject.getCoord().getLatitude()); + data.put("longitude", placemarkObject.getCoord().getLongitude()); + return processJavascriptTemplate(data, TEMPLATE_FOR_DGMAP_JS); + } + + private String processJavascriptTemplate(final Map data, String templateName) { + Writer out; + String result = null; + try (StringWriter fw = new StringWriter();) { + // Load template from source folder + cfg.setTemplateLoader(new FileTemplateLoader(new File(System.getProperty("user.dir")))); + final Template template = cfg.getTemplate(templateName); + + // Console output + out = new BufferedWriter(fw); + + // Add date to avoid caching + template.process(data, out); + + out.flush(); + + result = fw.toString(); + + } catch (final TemplateException e) { + logger.error("Error when generating the javascript commands", e); + } catch (final IOException e) { + logger.error("Error when reading/writing the template information", e); + } + return result; + } + + private RemoteWebDriver initBrowser() throws BrowserNotFoundException { + RemoteWebDriver driver = null; + driver = chooseDriver(); + if (isClosing) { // In case the browser takes so long to start that the user closes CE and this + // method is called when the other windows are being closed + driver.quit(); + driver = null; + } else { + drivers.add(driver); + } + return driver; + } + + public static boolean isIdOrNamePresent(String elementId, RemoteWebDriver driver) { + boolean found = false; + + try { + if (driver.findElementById(elementId).isDisplayed() || driver.findElementByName(elementId).isDisplayed()) { + found = true; + } + } catch (final Exception e) { + // Not found + } + + return found; + } + + public static boolean isCssElementPresent(String cssElement, RemoteWebDriver driver) { + boolean found = false; + + try { + WebElement elementByCssSelector = driver.findElementByCssSelector(cssElement); + found = elementByCssSelector != null; + } catch (final Exception e) { + // Not found + } + + return found; + } + + private boolean isXPathPresent(String xpath, RemoteWebDriver driver) { + boolean found = false; + + try { + if (driver.findElementByXPath(xpath).isDisplayed()) { + found = true; + } + logger.debug(String.format("Found %s", xpath)); + } catch (final Exception e) { + logger.debug(String.format("Not Found %s", xpath)); + } + + return found; + } + + private boolean loadPlotInDGMap(SimplePlacemarkObject placemarkObject, RemoteWebDriver driver) { + + boolean success = true; + if (driver != null && waitFor("mainContent", driver) && driver instanceof JavascriptExecutor) { + try { + String dgmapJs = getDGMapJavascript(placemarkObject); + driver.executeScript(dgmapJs); + + Thread.sleep( 1000 ); + // Unlock the view if it is locked + if( isCssElementPresent(".lock.on", driver) ) { + driver.findElementByCssSelector(".lock.on").click(); // UNLOCK + } + + } catch (final Exception e) { + processSeleniumError(e); + success = false; + } + } + return success; + } + + public void clickOnElements(RemoteWebDriver driver, String cssSelector) { + final List dataLayerVisibility = driver.findElementsByCssSelector(cssSelector); + for (final WebElement webElement : dataLayerVisibility) { + if (webElement.isDisplayed()) { + webElement.click(); + } + } + } + + public static boolean isGeeMethodUpdated() { + return geeMethodUpdated; + } + + public static void setGeeMethodUpdated(boolean geeMethosUpdated) { + BrowserService.geeMethodUpdated = geeMethosUpdated; + } + + private void processSeleniumError(final Exception e) { + if (e.getCause() != null && e.getCause().getMessage() != null + && !e.getCause().getMessage().contains("latitude")) { + logger.warn("Error in the selenium driver", e); + } else { + logger.info("Error in the selenium driver provoked by known bug", e); + } + } + + public RemoteWebDriver navigateTo(String url, RemoteWebDriver driver) throws BrowserNotFoundException { + return navigateTo(url, driver, true); + } /** - * + * Loads the given URL into the browser. If the browser is null then a new + * browser window is open. + * + * @param url + * The URL to load. + * @param driverParam + * The browser window to use. If this value is null a new browser + * window is open. + * @param retry + * Specify if there should be a second try to open a browser window + * if the first time fails (useful if the browser could not be found) + * @return The browser window (firefox or chrome depending on the configuration) + * used to open the URL. + * @throws BrowserNotFoundException + * Exception thrown when there is no Firefox/Chrome installed */ - private static final long serialVersionUID = -404938492481063378L; + public RemoteWebDriver navigateTo(String url, RemoteWebDriver driverParam, boolean retry) + throws BrowserNotFoundException { + + RemoteWebDriver driver = driverParam; + + if (driver == null || !isDriverWorking(driver)) { + driver = initBrowser(); + } - public BrowserNotFoundException() { - super(); + if (driver != null) { + try { + driver.navigate().to(url); + } catch (final Exception e) { + if (retry && (e.getCause() != null && e.getCause().getMessage() != null + && e.getCause().getMessage().contains("Session not found"))) { + // Browser closed, restart it! + logger.error("Browser was closed, restaring it...", e); + driver = initBrowser(); + navigateTo(url, driver, false); // only try to re-open one + } + } + } else { + logger.error("No Selenium driver available, Is Firefox or Chrome installed?"); + } + return driver; } + protected boolean isDriverWorking(RemoteWebDriver driver) { + boolean stillWorking = true; + try { + driver.findElement(By.xpath("//body")); + } catch (Exception e) { + stillWorking = false; + } + return stillWorking; + } + + /** + * Opens a browser window with the Bing Maps representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openBingMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("BING"); + synchronized (lock) { + if (localPropertiesService.isBingMapsSupported()) { + try { + webDriverBing = navigateTo(geoLocalizeTemplateService + .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_BING_HTML_TEMPLATE, + "bingMapsKey", localPropertiesService.getValue(EarthProperty.BING_MAPS_KEY)) + .toString(), webDriverBing); + } catch (final Exception e) { + logger.error("Problems loading Bing", e); + } + } + } + } + + private Object getLock(String key) { + String lock = locks.get(key); + if( lock !=null ) { + return lock; + }else{ + locks.put(key, key); + return key; + } + } + + /** + * Opens a browser window with the Planet Basemaps representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openPlanetMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("PLANET"); + synchronized (lock) { + if (localPropertiesService.isPlanetMapsSupported()) { + + boolean monthly = localPropertiesService.isPlanetMapsMonthlyOpen(); + + String template = monthly ? GeolocalizeMapService.FREEMARKER_PLANET_NICFI_ARGUMENTS : GeolocalizeMapService.FREEMARKER_PLANET_DAILY_HTML_TEMPLATE; + String key = monthly ? localPropertiesService.getValue( EarthProperty.PLANET_MAPS_CE_KEY ) : localPropertiesService.getValue( EarthProperty.PLANET_MAPS_KEY ); + + try { + + String processTemplate = geoLocalizeTemplateService.getUrlToFreemarkerOutput( + placemarkObject, + template, + "planetMapsKey", + key, + "urlPlanetEndpointPrefix", + ServerController.getHostAddress(localPropertiesService.getHost(),localPropertiesService.getPort()) + ).toString(); + + String urlPlanet = null; + if( monthly ) { + + String parameters = FileUtils.readFileToString( new File( new URI( processTemplate ) ) , StandardCharsets.UTF_8 ); + + // remove new lines + parameters = parameters.replace("\n", "").replace("\r", "").replace("\t", "").replace(" ", ""); + // remove trailing commas + parameters = parameters.replace(",],", "],").replace("],]", "]]"); + + urlPlanet = localPropertiesService.getValue( EarthProperty.PLANET_NICFI_URL ) + parameters; + }else { + urlPlanet = processTemplate; + } + + webDriverPlanetHtml = navigateTo( urlPlanet, webDriverPlanetHtml ); + + } catch (final Exception e) { + logger.error("Problems loading Planet", e); + } + } + } + } + + /** + * Opens a browser window with the Baidu Maps representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openBaiduMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("BAIDU"); + synchronized (lock) { + if (localPropertiesService.isBaiduMapsSupported()) { + + try { + webDriverBaidu = navigateTo(geoLocalizeTemplateService + .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_BAIDU_HTML_TEMPLATE) + .toString(), webDriverBaidu); + } catch (final Exception e) { + logger.error("Problems loading Baidu", e); + } + } + } + } + + /** + * Opens a browser window with the Yandex Maps representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openYandexMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("YANDEX"); + synchronized (lock) { + if (localPropertiesService.isYandexMapsSupported()) { + try { + webDriverYandex = navigateTo(geoLocalizeTemplateService.getUrlToFreemarkerOutput(placemarkObject, + GeolocalizeMapService.FREEMARKER_YANDEX_HTML_TEMPLATE).toString(), webDriverYandex); + } catch (final Exception e) { + logger.error("Problems loading Yandex", e); + } + } + } + } + + /** + * Opens a browser window with a map representation of the plot in SecureWatch. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openSecureWatch(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("SECUREWATCH"); + synchronized (lock) { + if ( localPropertiesService.isSecureWatchSupported() ) { + String url = getUrlBaseIntegration(placemarkObject, localPropertiesService.getSecureWatchURL() + "/#18/LATITUDE/LONGITUDE" ); + webDriverSecureWatch = navigateTo(url, webDriverSecureWatch); + try { + logger.warn("Loading layers - {}", placemarkObject); + loadPlotInDGMap(placemarkObject, webDriverSecureWatch); + } catch (final Exception e) { + logger.error("Error when opening Secure Watch browser window", e); + } + } + } + } + + /** + * Opens a browser window with a map representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openExtraMap(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("EXTRA"); + synchronized (lock) { + if (!StringUtils.isBlank(localPropertiesService.getExtraMap())) { + webDriverExtraMap = navigateTo( getUrlBaseIntegration(placemarkObject, localPropertiesService.getExtraMap() ) , webDriverExtraMap ); + } + } + } + + private String getUrlBaseIntegration(SimplePlacemarkObject placemarkObject, String url) { + String temp = null; + try { + String latitude = placemarkObject.getCoord().getLatitude(); + String longitude = placemarkObject.getCoord().getLongitude(); + String id = placemarkObject.getPlacemarkId().split(",")[0]; // for cases where ID also has round, then + // the id string would be something like + // "plotId,round", we only want the ID + + temp = url.replace("LATITUDE", latitude).replace("LONGITUDE", longitude).replace("PLOT_ID", id); + + } catch (final Exception e) { + logger.error("Problems Getting the URL filling for " + url, e); + } + return temp; + } + + /** + * Opens a browser window with the Google Street View representation of the + * plot. + * https://www.google.com/maps/@43.7815661,11.1484876,3a,75y,210.23h,82.32t/data=!3m6!1e1!3m4!1sEz7NiCbaIYzTJkP_RMBiqw!2e0!7i13312!8i6656?hl=en + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openStreetView(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("STREET_VIEW"); + synchronized (lock) { + if (localPropertiesService.isStreetViewSupported()) { + try { + webDriverStreetView = navigateTo( + geoLocalizeTemplateService.getUrlToFreemarkerOutput(placemarkObject, + GeolocalizeMapService.FREEMARKER_STREET_VIEW_HTML_TEMPLATE, "googleMapsApiKey", + localPropertiesService.getValue(EarthProperty.GOOGLE_MAPS_API_KEY)).toString(), + webDriverStreetView); + } catch (final Exception e) { + logger.error("Problems loading Street View", e); + } + } + } + } + + /** + * Opens a browser window with the Here Maps representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openHereMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("HERE"); + synchronized (lock) { + if (localPropertiesService.isHereMapsSupported()) { + try { + webDriverHere = navigateTo(geoLocalizeTemplateService + .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_HERE_HTML_TEMPLATE, + "hereAppId", localPropertiesService.getValue(EarthProperty.HERE_MAPS_APP_ID), + "hereAppCode", localPropertiesService.getValue(EarthProperty.HERE_MAPS_APP_CODE)) + .toString(), webDriverHere); + } catch (final Exception e) { + logger.error("Problems loading Here Maps", e); + } + + } + } + } + + private StringBuilder getGeoJsonSegment(List coordinates) { + StringBuilder geoJson = new StringBuilder("["); + if (coordinates != null) { + for (SimpleCoordinate coord : coordinates) { + geoJson = geoJson.append("[").append(coord.getLongitude()).append(",").append(coord.getLatitude()) + .append("],"); + } + // remove last character + geoJson = geoJson.deleteCharAt(geoJson.length() - 1); + } + geoJson = geoJson.append("],"); + return geoJson; + } + + + + + private String getFeature(SimplePlacemarkObject placemarkObject, String shapeType, String name ) { + StringBuilder feature = new StringBuilder("{\"type\":\"Feature\",\"properties\":{\"name\":\"").append( name).append("\"},\"geometry\":"); + feature= feature.append( getGeoJson(placemarkObject, shapeType )).append("}"); + return feature.toString(); + } + + private String getGeoJson(SimplePlacemarkObject placemarkObject, String shapeType ) { + + StringBuilder geoJson = new StringBuilder("{\"type\":\"" ).append( shapeType).append("\",\"coordinates\":["); + List shape = placemarkObject.getShape(); + geoJson = geoJson.append(getGeoJsonSegment(shape)); + geoJson = geoJson.deleteCharAt(geoJson.length() - 1); + geoJson = geoJson.append("]}"); + return geoJson.toString(); + } + + /** + * Opens a browser window with the Google Earth Engine Code Editor and runs the + * freemarker template found in resources/eeCodeEditorScript.fmt on the main + * editor of GEE. + * + * @param placemarkObject + * The center point of the plot. + * @throws BrowserNotFoundException + * If the browser cannot be found + * + */ + public void openGEEAppURL(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("GEEAPP"); + synchronized (lock) { + if (localPropertiesService.isGEEAppSupported()) { + + try { + StringBuilder url = new StringBuilder(localPropertiesService.getGEEAppURL()); + url = url.append("#geoJson=") + .append(URLEncoder.encode(getGeoJson(placemarkObject, "MultiLineString"), StandardCharsets.UTF_8.toString())) + .append(";"); + url = url.append("plotId=") + .append(URLEncoder.encode(placemarkObject.getPlacemarkId(), StandardCharsets.UTF_8.toString())) + .append(";"); + url = url.append("survey=") + .append(URLEncoder.encode( earthSurveyService.getCollectSurvey().getName() , StandardCharsets.UTF_8.toString())) + .append(";"); + webDriverGEEMap = navigateTo(url.toString(), webDriverGEEMap); + webDriverGEEMap.navigate().refresh(); // FORCE REFRESH - OTHERWISE WINDOW IS NOT REFRESHED FOR SOME STRANGE REASON + } catch (final Exception e) { + logger.error("Problems loading GEE APP window", e); + } + } + } + } + + + public void openEarthMapURL(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("EARTH_MAP"); + synchronized (lock) { + if (localPropertiesService.isEarthMapSupported()) { + + + try { + StringBuilder url = new StringBuilder(localPropertiesService.getEarthMapURL()).append("?"); + url = url.append("polygon=") + .append(URLEncoder.encode(getFeature(placemarkObject, "Polygon", placemarkObject.getPlacemarkId()), StandardCharsets.UTF_8.toString())) + .append("&"); + + if( StringUtils.isNotBlank(localPropertiesService.getEarthMapLayers()) ) { + url = url.append("layers=") + .append(URLEncoder.encode(localPropertiesService.getEarthMapLayers(), StandardCharsets.UTF_8.toString())) + .append("&"); + } + + if( StringUtils.isNotBlank(localPropertiesService.getEarthMapScripts()) ) { + url = url.append("scripts=") + .append(URLEncoder.encode(localPropertiesService.getEarthMapScripts(), StandardCharsets.UTF_8.toString())) + .append("&"); + } + + String aoi = localPropertiesService.getEarthMapAOI(); + if( StringUtils.isBlank(aoi) ) { + aoi = "global"; + } + url = url.append("aoi=") + .append(URLEncoder.encode( aoi, StandardCharsets.UTF_8.toString() )) + .append("&embed=true"); // Set the EMBED parameter to true so that the user does not need to log in. + + webDriverEarthMap = navigateTo(url.toString(), webDriverEarthMap); + //Desktop.getDesktop().browse( new URI( url.toString() ) ); + //webDriverEarthMap.navigate().refresh(); // FORCE REFRESH - OTHERWISE WINDOW IS NOT REFRESHED FOR SOME STRANGE REASON + } catch (final Exception e) { + logger.error("Problems loading Earth Map window", e); + } + } + } + } + + /** + * Opens a browser window with the Google Earth Engine Code Editor and runs the + * freemarker template found in resources/eeCodeEditorScript.fmt on the main + * editor of GEE. + * + * @param placemarkObject + * The center point of the plot. + * @throws BrowserNotFoundException + * If the browser cannot be found + * + */ + public void openGEECodeEditor(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("CODE_EDITOR"); + synchronized (lock) { + if (localPropertiesService.isCodeEditorSupported()) { + + boolean firstOpening = false; + if (getWebDriverGeeCodeEditor() == null) { + setWebDriverGeeCodeEditor(initBrowser()); + firstOpening = true; + } + + if (firstOpening && (liquibase.repackaged.org.apache.commons.lang3.SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX)) { + codeEditorHandlerThread.disableCodeEditorAutocomplete(getWebDriverGeeCodeEditor()); + } + + codeEditorHandlerThread.loadCodeEditorScript(placemarkObject, getWebDriverGeeCodeEditor()); + } + } + } + + + /** + * Opens a browser window with the Google Earth Engine Timelapse representation + * of the plot. + * + * @param placemarkObject + * The center point of the plot. + * @throws BrowserNotFoundException + * If the browser cannot be found + * + */ + public void openTimelapse(final SimplePlacemarkObject placemarkObject) + throws BrowserNotFoundException { + Object lock = getLock("TIMELAPSE"); + synchronized (lock) { + if (localPropertiesService.isTimelapseSupported()) { + try { + String coordinates = placemarkObject.getCoord().toString(); + webDriverTimelapse = navigateTo( + "https://earthengine.google.org/timelapse/timelapseplayer_v2.html?timelapseclient=http://earthengine.google.org/timelapse/data&v=" + + coordinates + ",10.812,latLng&t=0.08", + webDriverTimelapse); + } catch (final Exception e) { + logger.error("Problems loading Timelapse", e); + } + } + } + } + + private void setGeckoDriverPath() { + String geckoDriverPath = ""; + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { + geckoDriverPath = "resources/geckodriver_mac"; + } else if (SystemUtils.IS_OS_UNIX) { + if (System.getProperty("os.arch").contains("64") + || System.getProperty("sun.arch.data.model").equals("64")) { + geckoDriverPath = "resources/geckodriver_64"; + } else { + geckoDriverPath = "resources/geckodriver_32"; + } + } else if (SystemUtils.IS_OS_WINDOWS) { + try { + if (System.getProperty("os.arch").contains("64") + || System.getProperty("sun.arch.data.model").equals("64")) + geckoDriverPath = "resources/geckodriver_64.exe"; + else + geckoDriverPath = "resources/geckodriver_32.exe"; + } catch (Exception e) { + geckoDriverPath = "resources/geckodriver_64.exe"; + } + } else { + throw new IllegalArgumentException("Geckodriver is not supported in the current OS"); + } + + File geckoDriverFile = new File(geckoDriverPath); + + // if above property is not working or not opening the application in browser + // then try below property + System.setProperty(GeckoDriverService.GECKO_DRIVER_EXE_PROPERTY, geckoDriverFile.getAbsolutePath()); + System.setProperty(FirefoxDriver.SystemProperty.DRIVER_USE_MARIONETTE, "true"); + + } + + public boolean waitFor(String elementId, RemoteWebDriver driver) { + int i = 0; + while (!isIdOrNamePresent(elementId, driver)) { + try { + Thread.sleep(1000); + } catch (final InterruptedException e) { + return false; + } + i++; + if (i > 60) { + return false; + } + } + return true; + } + + public boolean waitForXPath(String xpath, RemoteWebDriver driver) { + int i = 0; + while (!isXPathPresent(xpath, driver)) { + try { + Thread.sleep(1000); + } catch (final InterruptedException e) { + return false; + + } + i++; + if (i > 30) { + return false; + } + } + return true; + } + + private Thread getClosingBrowsersThread() { + + return new Thread("Quit the open browsers") { + @Override + public void run() { + isClosing = true; + CopyOnWriteArrayList driversCopy = new CopyOnWriteArrayList<>(drivers); + for (Iterator iterator = driversCopy.iterator(); iterator.hasNext();) { + RemoteWebDriver remoteWebDriver = iterator.next(); + try { + remoteWebDriver.quit(); + } catch (final Exception e) { + logger.error("Error quitting the browser", e); + } + } + + } + }; + } - public BrowserNotFoundException(String message, Throwable cause) { - super(message, cause); + @Override + public void update(Observable o, Object arg) { + if (ServerInitializationEvent.SERVER_STOPPED_EVENT.equals(arg)) { + this.closeBrowsers(); + } } - public BrowserNotFoundException(String message) { - super(message); + private RemoteWebDriver getWebDriverGeeCodeEditor() { + return webDriverGeeCodeEditor; } - public BrowserNotFoundException(Throwable cause) { - super(cause); + protected void setWebDriverGeeCodeEditor(RemoteWebDriver webDriverGeeCodeEditor) { + this.webDriverGeeCodeEditor = webDriverGeeCodeEditor; } - } From cb2a43a7e8511eb92d3188b36bddb3117658883c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:38 +0100 Subject: [PATCH 0123/1620] New translations BrowserService.java (Spanish) --- .../earth/app/view/Messages_es.properties | 913 ++++++++++++++++-- 1 file changed, 840 insertions(+), 73 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 8c14343c96..5a933d094d 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,142 +1,909 @@ package org.openforis.collect.earth.app.service; +import java.io.BufferedWriter; import java.io.File; import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.Arrays; -import java.util.Date; - -import org.apache.commons.dbcp.BasicDataSource; -import org.openforis.collect.earth.app.CollectEarthUtils; +import java.io.StringWriter; +import java.io.Writer; +import java.net.URI; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Observable; +import java.util.Observer; +import java.util.concurrent.CopyOnWriteArrayList; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.desktop.ServerController.ServerInitializationEvent; import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.sampler.model.SimpleCoordinate; +import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; +import org.openqa.selenium.By; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.WebDriverException; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.firefox.GeckoDriverService; +import org.openqa.selenium.remote.RemoteWebDriver; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; -import net.lingala.zip4j.ZipFile; - +import freemarker.cache.FileTemplateLoader; +import freemarker.template.Configuration; +import freemarker.template.Template; +import freemarker.template.TemplateException; +import freemarker.template.Version; +import io.github.bonigarcia.wdm.WebDriverManager; +import liquibase.repackaged.org.apache.commons.lang3.SystemUtils; /** - * Spring managed bean that handles the creation of backups of the Collect database. - * The SQLite database file will be saved everytime the application closes. - * A maximum of 10 copies (the last ten times the application was used) will be saved on the backupCollectEarth folder on the users application data folder (OS dependant). + * This class contains methods that allow Collect Earth to open browser windows + * that allow the user to have a better understanding of the plot. So far there + * are integrations with Google Earth Engine, Google Earth Engine Timelapse and + * Bing Maps. When a user clicks on a plot Collect Earth will check if the + * program is set to open any of these integrations, and if it is so it will + * open each one in its own window. These windows are closed when the program + * is closed. + *s * @author Alfonso Sanchez-Paus Diaz * */ @Component -@Lazy(false) -public class BackupSqlLiteService implements InitializingBean{ +public class BrowserService implements InitializingBean, Observer { - private static final String BACKUP_COLLECT_EARTH = "backupSqlite"; //$NON-NLS-1$ - private static final int MAXIMUM_NUMBER_OF_BACKUPS = 10; + @Autowired + private LocalPropertiesService localPropertiesService; + + @Autowired + private GeolocalizeMapService geoLocalizeTemplateService; @Autowired - BasicDataSource dataSource; + private EarthSurveyService earthSurveyService; @Autowired - private LocalPropertiesService localPropertiesService; + private CodeEditorHandlerThread codeEditorHandlerThread; + + private final ArrayList drivers = new ArrayList<>(); + private final Logger logger = LoggerFactory.getLogger(BrowserService.class); + private static final String TEMPLATE_FOR_DGMAP_JS = "resources/javascript_dgmap.fmt"; + private static final Configuration cfg = new Configuration(new Version("2.3.23")); + private RemoteWebDriver webDriverBing, webDriverBaidu, webDriverTimelapse, webDriverGeeCodeEditor, + webDriverHere, webDriverStreetView, webDriverYandex, webDriverPlanetHtml, webDriverExtraMap, webDriverSecureWatch, + webDriverGEEMap, webDriverEarthMap; - private Logger logger = LoggerFactory.getLogger( BackupSqlLiteService.class ); + + Map locks = new HashMap(); + + private static boolean geeMethodUpdated = false; + + private boolean isClosing = false; + + public void closeBrowsers() { + synchronized (this) { + getClosingBrowsersThread().start(); + } + } @Override - public void afterPropertiesSet() throws Exception { - attachShutDownHook(); + public void afterPropertiesSet() throws Exception { + Runtime.getRuntime().addShutdownHook(getClosingBrowsersThread()); + setGeckoDriverPath(); } - private void attachShutDownHook() { - Runtime.getRuntime().addShutdownHook(new Thread("Shutdown hook - Backup Database") { - @Override - public void run() { - if ( "true".equals(localPropertiesService.getValue(EarthProperty.AUTOMATIC_BACKUP) ) ) { //$NON-NLS-1$ - automaticDBBackup(); + private RemoteWebDriver chooseDriver() throws BrowserNotFoundException { + RemoteWebDriver driver = null; + final String browserSetInProperties = localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim(); + + if (browserSetInProperties.equalsIgnoreCase(EarthConstants.CHROME_BROWSER)) { + driver = tryStartChrome(); + } else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.FIREFOX_BROWSER)) { + driver = tryStartFirefox(); + } else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.EDGE_BROWSER)) { + driver = tryStartEdge(); + }else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.SAFARI_BROWSER)) { + driver = tryStartSafari(); + } + + // If the browser chosen is not installed try to find and installed browser in the computer + if( driver== null ) { + driver = tryStartChrome(); + if( driver== null ) { + driver = tryStartFirefox(); + } + if( driver== null ) { + driver = tryStartEdge(); + } + if( driver== null ) { + driver = tryStartSafari(); + } + } + + if (driver == null) { + throw new BrowserNotFoundException( + "Neither Chrome nor Firefox could be opened. You need to have one of them installed in order to use GEE, Bing Maps or Saiku."); + } + + return driver; + } + + private RemoteWebDriver tryStartFirefox() { + RemoteWebDriver driver = null; + try { + driver = (RemoteWebDriver) WebDriverManager.firefoxdriver().create(); + } catch (final WebDriverException e) { + logger.warn( + "Problem starting Firefox browser!", + e); + } + return driver; + } + + private RemoteWebDriver tryStartEdge() { + RemoteWebDriver driver = null; + try { + driver = (RemoteWebDriver) WebDriverManager.edgedriver().create(); + } catch (final WebDriverException e) { + logger.warn( + "Problem starting Edge browser", + e); + } + return driver; + } + + private RemoteWebDriver tryStartSafari() { + RemoteWebDriver driver = null; + try { + driver = (RemoteWebDriver) WebDriverManager.safaridriver().create(); + } catch (final WebDriverException e) { + logger.warn( + "Problem starting Safari browser", + e); + } + return driver; + } + + private RemoteWebDriver tryStartChrome() { + RemoteWebDriver driver = null; + try { + driver = (RemoteWebDriver) WebDriverManager.chromedriver().create(); + } catch (final Exception e) { + logger.warn( + "Problem starting Chrome browser", + e); + } + return driver; + } + + + private String getDGMapJavascript(SimplePlacemarkObject placemarkObject) { + final Map data = geoLocalizeTemplateService.getPlacemarkData(placemarkObject); + data.put("latitude", placemarkObject.getCoord().getLatitude()); + data.put("longitude", placemarkObject.getCoord().getLongitude()); + return processJavascriptTemplate(data, TEMPLATE_FOR_DGMAP_JS); + } + + private String processJavascriptTemplate(final Map data, String templateName) { + Writer out; + String result = null; + try (StringWriter fw = new StringWriter();) { + // Load template from source folder + cfg.setTemplateLoader(new FileTemplateLoader(new File(System.getProperty("user.dir")))); + final Template template = cfg.getTemplate(templateName); + + // Console output + out = new BufferedWriter(fw); + + // Add date to avoid caching + template.process(data, out); + + out.flush(); + + result = fw.toString(); + + } catch (final TemplateException e) { + logger.error("Error when generating the javascript commands", e); + } catch (final IOException e) { + logger.error("Error when reading/writing the template information", e); + } + return result; + } + + private RemoteWebDriver initBrowser() throws BrowserNotFoundException { + RemoteWebDriver driver = null; + driver = chooseDriver(); + if (isClosing) { // In case the browser takes so long to start that the user closes CE and this + // method is called when the other windows are being closed + driver.quit(); + driver = null; + } else { + drivers.add(driver); + } + return driver; + } + + public static boolean isIdOrNamePresent(String elementId, RemoteWebDriver driver) { + boolean found = false; + + try { + if (driver.findElementById(elementId).isDisplayed() || driver.findElementByName(elementId).isDisplayed()) { + found = true; + } + } catch (final Exception e) { + // Not found + } + + return found; + } + + public static boolean isCssElementPresent(String cssElement, RemoteWebDriver driver) { + boolean found = false; + + try { + WebElement elementByCssSelector = driver.findElementByCssSelector(cssElement); + found = elementByCssSelector != null; + } catch (final Exception e) { + // Not found + } + + return found; + } + + private boolean isXPathPresent(String xpath, RemoteWebDriver driver) { + boolean found = false; + + try { + if (driver.findElementByXPath(xpath).isDisplayed()) { + found = true; + } + logger.debug(String.format("Found %s", xpath)); + } catch (final Exception e) { + logger.debug(String.format("Not Found %s", xpath)); + } + + return found; + } + + private boolean loadPlotInDGMap(SimplePlacemarkObject placemarkObject, RemoteWebDriver driver) { + + boolean success = true; + if (driver != null && waitFor("mainContent", driver) && driver instanceof JavascriptExecutor) { + try { + String dgmapJs = getDGMapJavascript(placemarkObject); + driver.executeScript(dgmapJs); + + Thread.sleep( 1000 ); + // Unlock the view if it is locked + if( isCssElementPresent(".lock.on", driver) ) { + driver.findElementByCssSelector(".lock.on").click(); // UNLOCK } + + } catch (final Exception e) { + processSeleniumError(e); + success = false; } + } + return success; + } - }); + public void clickOnElements(RemoteWebDriver driver, String cssSelector) { + final List dataLayerVisibility = driver.findElementsByCssSelector(cssSelector); + for (final WebElement webElement : dataLayerVisibility) { + if (webElement.isDisplayed()) { + webElement.click(); + } + } } - private void automaticDBBackup() { - if( localPropertiesService.isUsingSqliteDB() ){ + public static boolean isGeeMethodUpdated() { + return geeMethodUpdated; + } - String pathToBackupZip = ""; //$NON-NLS-1$ + public static void setGeeMethodUpdated(boolean geeMethosUpdated) { + BrowserService.geeMethodUpdated = geeMethosUpdated; + } - String nameCollectDB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB; - File originalDBFile = new File(nameCollectDB); + private void processSeleniumError(final Exception e) { + if (e.getCause() != null && e.getCause().getMessage() != null + && !e.getCause().getMessage().contains("latitude")) { + logger.warn("Error in the selenium driver", e); + } else { + logger.info("Error in the selenium driver provoked by known bug", e); + } + } + public RemoteWebDriver navigateTo(String url, RemoteWebDriver driver) throws BrowserNotFoundException { + return navigateTo(url, driver, true); + } + + /** + * Loads the given URL into the browser. If the browser is null then a new + * browser window is open. + * + * @param url + * The URL to load. + * @param driverParam + * The browser window to use. If this value is null a new browser + * window is open. + * @param retry + * Specify if there should be a second try to open a browser window + * if the first time fails (useful if the browser could not be found) + * @return The browser window (firefox or chrome depending on the configuration) + * used to open the URL. + * @throws BrowserNotFoundException + * Exception thrown when there is no Firefox/Chrome installed + */ + public RemoteWebDriver navigateTo(String url, RemoteWebDriver driverParam, boolean retry) + throws BrowserNotFoundException { + + RemoteWebDriver driver = driverParam; + + if (driver == null || !isDriverWorking(driver)) { + driver = initBrowser(); + } + + if (driver != null) { try { + driver.navigate().to(url); + } catch (final Exception e) { + if (retry && (e.getCause() != null && e.getCause().getMessage() != null + && e.getCause().getMessage().contains("Session not found"))) { + // Browser closed, restart it! + logger.error("Browser was closed, restaring it...", e); + driver = initBrowser(); + navigateTo(url, driver, false); // only try to re-open one + } + } + } else { + logger.error("No Selenium driver available, Is Firefox or Chrome installed?"); + } + return driver; + } - pathToBackupZip = getBackupZipFilename(); + protected boolean isDriverWorking(RemoteWebDriver driver) { + boolean stillWorking = true; + try { + driver.findElement(By.xpath("//body")); + } catch (Exception e) { + stillWorking = false; + } + return stillWorking; + } - try( ZipFile zipFile = CollectEarthUtils.addFileToZip(pathToBackupZip, originalDBFile, EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME) ){ - removeExtraBackups(); + /** + * Opens a browser window with the Bing Maps representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openBingMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("BING"); + synchronized (lock) { + if (localPropertiesService.isBingMapsSupported()) { + try { + webDriverBing = navigateTo(geoLocalizeTemplateService + .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_BING_HTML_TEMPLATE, + "bingMapsKey", localPropertiesService.getValue(EarthProperty.BING_MAPS_KEY)) + .toString(), webDriverBing); + } catch (final Exception e) { + logger.error("Problems loading Bing", e); } + } + } + } - } catch (IOException e) { - logger.error("Error when create backup of the Collect Earth Database from " + nameCollectDB + " to " + pathToBackupZip, e); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (Exception e) { - logger.error("Error when zipping the Collect Earth Database from " + nameCollectDB + " to " + pathToBackupZip, e); //$NON-NLS-1$ //$NON-NLS-2$ + private Object getLock(String key) { + String lock = locks.get(key); + if( lock !=null ) { + return lock; + }else{ + locks.put(key, key); + return key; + } + } + + /** + * Opens a browser window with the Planet Basemaps representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openPlanetMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("PLANET"); + synchronized (lock) { + if (localPropertiesService.isPlanetMapsSupported()) { + + boolean monthly = localPropertiesService.isPlanetMapsMonthlyOpen(); + + String template = monthly ? GeolocalizeMapService.FREEMARKER_PLANET_NICFI_ARGUMENTS : GeolocalizeMapService.FREEMARKER_PLANET_DAILY_HTML_TEMPLATE; + String key = monthly ? localPropertiesService.getValue( EarthProperty.PLANET_MAPS_CE_KEY ) : localPropertiesService.getValue( EarthProperty.PLANET_MAPS_KEY ); + + try { + + String processTemplate = geoLocalizeTemplateService.getUrlToFreemarkerOutput( + placemarkObject, + template, + "planetMapsKey", + key, + "urlPlanetEndpointPrefix", + ServerController.getHostAddress(localPropertiesService.getHost(),localPropertiesService.getPort()) + ).toString(); + + String urlPlanet = null; + if( monthly ) { + + String parameters = FileUtils.readFileToString( new File( new URI( processTemplate ) ) , StandardCharsets.UTF_8 ); + + // remove new lines + parameters = parameters.replace("\n", "").replace("\r", "").replace("\t", "").replace(" ", ""); + // remove trailing commas + parameters = parameters.replace(",],", "],").replace("],]", "]]"); + + urlPlanet = localPropertiesService.getValue( EarthProperty.PLANET_NICFI_URL ) + parameters; + }else { + urlPlanet = processTemplate; + } + + webDriverPlanetHtml = navigateTo( urlPlanet, webDriverPlanetHtml ); + + } catch (final Exception e) { + logger.error("Problems loading Planet", e); + } } } } - private String getBackupZipFilename() throws IOException { - File backupFolder = getAutomaticBackUpFolder(); - return getDBCopyName(backupFolder); + /** + * Opens a browser window with the Baidu Maps representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openBaiduMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("BAIDU"); + synchronized (lock) { + if (localPropertiesService.isBaiduMapsSupported()) { + + try { + webDriverBaidu = navigateTo(geoLocalizeTemplateService + .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_BAIDU_HTML_TEMPLATE) + .toString(), webDriverBaidu); + } catch (final Exception e) { + logger.error("Problems loading Baidu", e); + } + } + } } - public String getDBCopyName(File backupFolder) throws IOException { - String pathToBackup; - SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HHmmss"); //$NON-NLS-1$ - StringBuilder destPathStr = new StringBuilder(); - destPathStr.append(backupFolder.getCanonicalPath()); - destPathStr.append(File.separatorChar); - destPathStr.append( EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME); - destPathStr.append(sdf.format( new Date() )).append( ".zip"); - pathToBackup = destPathStr.toString(); - return pathToBackup; + /** + * Opens a browser window with the Yandex Maps representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openYandexMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("YANDEX"); + synchronized (lock) { + if (localPropertiesService.isYandexMapsSupported()) { + try { + webDriverYandex = navigateTo(geoLocalizeTemplateService.getUrlToFreemarkerOutput(placemarkObject, + GeolocalizeMapService.FREEMARKER_YANDEX_HTML_TEMPLATE).toString(), webDriverYandex); + } catch (final Exception e) { + logger.error("Problems loading Yandex", e); + } + } + } + } + + /** + * Opens a browser window with a map representation of the plot in SecureWatch. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openSecureWatch(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("SECUREWATCH"); + synchronized (lock) { + if ( localPropertiesService.isSecureWatchSupported() ) { + String url = getUrlBaseIntegration(placemarkObject, localPropertiesService.getSecureWatchURL() + "/#18/LATITUDE/LONGITUDE" ); + webDriverSecureWatch = navigateTo(url, webDriverSecureWatch); + try { + logger.warn("Loading layers - {}", placemarkObject); + loadPlotInDGMap(placemarkObject, webDriverSecureWatch); + } catch (final Exception e) { + logger.error("Error when opening Secure Watch browser window", e); + } + } + } } - private void removeExtraBackups() { + /** + * Opens a browser window with a map representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openExtraMap(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("EXTRA"); + synchronized (lock) { + if (!StringUtils.isBlank(localPropertiesService.getExtraMap())) { + webDriverExtraMap = navigateTo( getUrlBaseIntegration(placemarkObject, localPropertiesService.getExtraMap() ) , webDriverExtraMap ); + } + } + } - File backupFolder = getAutomaticBackUpFolder(); + private String getUrlBaseIntegration(SimplePlacemarkObject placemarkObject, String url) { + String temp = null; + try { + String latitude = placemarkObject.getCoord().getLatitude(); + String longitude = placemarkObject.getCoord().getLongitude(); + String id = placemarkObject.getPlacemarkId().split(",")[0]; // for cases where ID also has round, then + // the id string would be something like + // "plotId,round", we only want the ID - File[] files = backupFolder.listFiles(); - if( files!=null && files.length > MAXIMUM_NUMBER_OF_BACKUPS ){ + temp = url.replace("LATITUDE", latitude).replace("LONGITUDE", longitude).replace("PLOT_ID", id); - Arrays.sort(files, (o1,o2) -> { - if( o1.lastModified() < o2.lastModified() ){ - return 1; - }else if( o1.lastModified() == o2.lastModified() ){ - return 0; - }else{ - return -1; - } + } catch (final Exception e) { + logger.error("Problems Getting the URL filling for " + url, e); + } + return temp; + } + /** + * Opens a browser window with the Google Street View representation of the + * plot. + * https://www.google.com/maps/@43.7815661,11.1484876,3a,75y,210.23h,82.32t/data=!3m6!1e1!3m4!1sEz7NiCbaIYzTJkP_RMBiqw!2e0!7i13312!8i6656?hl=en + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openStreetView(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("STREET_VIEW"); + synchronized (lock) { + if (localPropertiesService.isStreetViewSupported()) { + try { + webDriverStreetView = navigateTo( + geoLocalizeTemplateService.getUrlToFreemarkerOutput(placemarkObject, + GeolocalizeMapService.FREEMARKER_STREET_VIEW_HTML_TEMPLATE, "googleMapsApiKey", + localPropertiesService.getValue(EarthProperty.GOOGLE_MAPS_API_KEY)).toString(), + webDriverStreetView); + } catch (final Exception e) { + logger.error("Problems loading Street View", e); } - ); + } + } + } - for( int i = MAXIMUM_NUMBER_OF_BACKUPS; i< files.length ; i++ ){ - if( !files[i].delete() ) { - logger.error( "Error deleteting file", files[i].getAbsolutePath() ); + /** + * Opens a browser window with the Here Maps representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openHereMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("HERE"); + synchronized (lock) { + if (localPropertiesService.isHereMapsSupported()) { + try { + webDriverHere = navigateTo(geoLocalizeTemplateService + .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_HERE_HTML_TEMPLATE, + "hereAppId", localPropertiesService.getValue(EarthProperty.HERE_MAPS_APP_ID), + "hereAppCode", localPropertiesService.getValue(EarthProperty.HERE_MAPS_APP_CODE)) + .toString(), webDriverHere); + } catch (final Exception e) { + logger.error("Problems loading Here Maps", e); } + + } + } + } + + private StringBuilder getGeoJsonSegment(List coordinates) { + StringBuilder geoJson = new StringBuilder("["); + if (coordinates != null) { + for (SimpleCoordinate coord : coordinates) { + geoJson = geoJson.append("[").append(coord.getLongitude()).append(",").append(coord.getLatitude()) + .append("],"); } + // remove last character + geoJson = geoJson.deleteCharAt(geoJson.length() - 1); + } + geoJson = geoJson.append("],"); + return geoJson; + } + + + + + private String getFeature(SimplePlacemarkObject placemarkObject, String shapeType, String name ) { + StringBuilder feature = new StringBuilder("{\"type\":\"Feature\",\"properties\":{\"name\":\"").append( name).append("\"},\"geometry\":"); + feature= feature.append( getGeoJson(placemarkObject, shapeType )).append("}"); + return feature.toString(); + } + + private String getGeoJson(SimplePlacemarkObject placemarkObject, String shapeType ) { + + StringBuilder geoJson = new StringBuilder("{\"type\":\"" ).append( shapeType).append("\",\"coordinates\":["); + List shape = placemarkObject.getShape(); + geoJson = geoJson.append(getGeoJsonSegment(shape)); + geoJson = geoJson.deleteCharAt(geoJson.length() - 1); + geoJson = geoJson.append("]}"); + return geoJson.toString(); + } + + /** + * Opens a browser window with the Google Earth Engine Code Editor and runs the + * freemarker template found in resources/eeCodeEditorScript.fmt on the main + * editor of GEE. + * + * @param placemarkObject + * The center point of the plot. + * @throws BrowserNotFoundException + * If the browser cannot be found + * + */ + public void openGEEAppURL(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("GEEAPP"); + synchronized (lock) { + if (localPropertiesService.isGEEAppSupported()) { + + try { + StringBuilder url = new StringBuilder(localPropertiesService.getGEEAppURL()); + url = url.append("#geoJson=") + .append(URLEncoder.encode(getGeoJson(placemarkObject, "MultiLineString"), StandardCharsets.UTF_8.toString())) + .append(";"); + url = url.append("plotId=") + .append(URLEncoder.encode(placemarkObject.getPlacemarkId(), StandardCharsets.UTF_8.toString())) + .append(";"); + url = url.append("survey=") + .append(URLEncoder.encode( earthSurveyService.getCollectSurvey().getName() , StandardCharsets.UTF_8.toString())) + .append(";"); + webDriverGEEMap = navigateTo(url.toString(), webDriverGEEMap); + webDriverGEEMap.navigate().refresh(); // FORCE REFRESH - OTHERWISE WINDOW IS NOT REFRESHED FOR SOME STRANGE REASON + } catch (final Exception e) { + logger.error("Problems loading GEE APP window", e); + } + } + } + } + + + public void openEarthMapURL(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("EARTH_MAP"); + synchronized (lock) { + if (localPropertiesService.isEarthMapSupported()) { + + + try { + StringBuilder url = new StringBuilder(localPropertiesService.getEarthMapURL()).append("?"); + url = url.append("polygon=") + .append(URLEncoder.encode(getFeature(placemarkObject, "Polygon", placemarkObject.getPlacemarkId()), StandardCharsets.UTF_8.toString())) + .append("&"); + if( StringUtils.isNotBlank(localPropertiesService.getEarthMapLayers()) ) { + url = url.append("layers=") + .append(URLEncoder.encode(localPropertiesService.getEarthMapLayers(), StandardCharsets.UTF_8.toString())) + .append("&"); + } + + if( StringUtils.isNotBlank(localPropertiesService.getEarthMapScripts()) ) { + url = url.append("scripts=") + .append(URLEncoder.encode(localPropertiesService.getEarthMapScripts(), StandardCharsets.UTF_8.toString())) + .append("&"); + } + + String aoi = localPropertiesService.getEarthMapAOI(); + if( StringUtils.isBlank(aoi) ) { + aoi = "global"; + } + url = url.append("aoi=") + .append(URLEncoder.encode( aoi, StandardCharsets.UTF_8.toString() )) + .append("&embed=true"); // Set the EMBED parameter to true so that the user does not need to log in. + + webDriverEarthMap = navigateTo(url.toString(), webDriverEarthMap); + //Desktop.getDesktop().browse( new URI( url.toString() ) ); + //webDriverEarthMap.navigate().refresh(); // FORCE REFRESH - OTHERWISE WINDOW IS NOT REFRESHED FOR SOME STRANGE REASON + } catch (final Exception e) { + logger.error("Problems loading Earth Map window", e); + } + } } + } + /** + * Opens a browser window with the Google Earth Engine Code Editor and runs the + * freemarker template found in resources/eeCodeEditorScript.fmt on the main + * editor of GEE. + * + * @param placemarkObject + * The center point of the plot. + * @throws BrowserNotFoundException + * If the browser cannot be found + * + */ + public void openGEECodeEditor(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("CODE_EDITOR"); + synchronized (lock) { + if (localPropertiesService.isCodeEditorSupported()) { + + boolean firstOpening = false; + if (getWebDriverGeeCodeEditor() == null) { + setWebDriverGeeCodeEditor(initBrowser()); + firstOpening = true; + } + + if (firstOpening && (liquibase.repackaged.org.apache.commons.lang3.SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX)) { + codeEditorHandlerThread.disableCodeEditorAutocomplete(getWebDriverGeeCodeEditor()); + } + + codeEditorHandlerThread.loadCodeEditorScript(placemarkObject, getWebDriverGeeCodeEditor()); + } + } } /** - * Returns the folder where the backup copies should be placed. - * @return The OS dependent folder where the application should saved the backed up copies. + * Opens a browser window with the Google Earth Engine Timelapse representation + * of the plot. + * + * @param placemarkObject + * The center point of the plot. + * @throws BrowserNotFoundException + * If the browser cannot be found + * */ - public File getAutomaticBackUpFolder() { - return FolderFinder.createFolderInAppData( BACKUP_COLLECT_EARTH); + public void openTimelapse(final SimplePlacemarkObject placemarkObject) + throws BrowserNotFoundException { + Object lock = getLock("TIMELAPSE"); + synchronized (lock) { + if (localPropertiesService.isTimelapseSupported()) { + try { + String coordinates = placemarkObject.getCoord().toString(); + webDriverTimelapse = navigateTo( + "https://earthengine.google.org/timelapse/timelapseplayer_v2.html?timelapseclient=http://earthengine.google.org/timelapse/data&v=" + + coordinates + ",10.812,latLng&t=0.08", + webDriverTimelapse); + } catch (final Exception e) { + logger.error("Problems loading Timelapse", e); + } + } + } + } + + private void setGeckoDriverPath() { + String geckoDriverPath = ""; + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { + geckoDriverPath = "resources/geckodriver_mac"; + } else if (SystemUtils.IS_OS_UNIX) { + if (System.getProperty("os.arch").contains("64") + || System.getProperty("sun.arch.data.model").equals("64")) { + geckoDriverPath = "resources/geckodriver_64"; + } else { + geckoDriverPath = "resources/geckodriver_32"; + } + } else if (SystemUtils.IS_OS_WINDOWS) { + try { + if (System.getProperty("os.arch").contains("64") + || System.getProperty("sun.arch.data.model").equals("64")) + geckoDriverPath = "resources/geckodriver_64.exe"; + else + geckoDriverPath = "resources/geckodriver_32.exe"; + } catch (Exception e) { + geckoDriverPath = "resources/geckodriver_64.exe"; + } + } else { + throw new IllegalArgumentException("Geckodriver is not supported in the current OS"); + } + + File geckoDriverFile = new File(geckoDriverPath); + + // if above property is not working or not opening the application in browser + // then try below property + System.setProperty(GeckoDriverService.GECKO_DRIVER_EXE_PROPERTY, geckoDriverFile.getAbsolutePath()); + System.setProperty(FirefoxDriver.SystemProperty.DRIVER_USE_MARIONETTE, "true"); + + } + + public boolean waitFor(String elementId, RemoteWebDriver driver) { + int i = 0; + while (!isIdOrNamePresent(elementId, driver)) { + try { + Thread.sleep(1000); + } catch (final InterruptedException e) { + return false; + } + i++; + if (i > 60) { + return false; + } + } + return true; + } + + public boolean waitForXPath(String xpath, RemoteWebDriver driver) { + int i = 0; + while (!isXPathPresent(xpath, driver)) { + try { + Thread.sleep(1000); + } catch (final InterruptedException e) { + return false; + + } + i++; + if (i > 30) { + return false; + } + } + return true; + } + + private Thread getClosingBrowsersThread() { + + return new Thread("Quit the open browsers") { + @Override + public void run() { + isClosing = true; + CopyOnWriteArrayList driversCopy = new CopyOnWriteArrayList<>(drivers); + for (Iterator iterator = driversCopy.iterator(); iterator.hasNext();) { + RemoteWebDriver remoteWebDriver = iterator.next(); + try { + remoteWebDriver.quit(); + } catch (final Exception e) { + logger.error("Error quitting the browser", e); + } + } + + } + }; + } + + @Override + public void update(Observable o, Object arg) { + if (ServerInitializationEvent.SERVER_STOPPED_EVENT.equals(arg)) { + this.closeBrowsers(); + } + } + + private RemoteWebDriver getWebDriverGeeCodeEditor() { + return webDriverGeeCodeEditor; + } + + protected void setWebDriverGeeCodeEditor(RemoteWebDriver webDriverGeeCodeEditor) { + this.webDriverGeeCodeEditor = webDriverGeeCodeEditor; } } From 1731f74b25f9eae1b6fad18242cd8fba4205e7f1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:39 +0100 Subject: [PATCH 0124/1620] New translations BrowserService.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 910 +++++++++++++++++- 1 file changed, 909 insertions(+), 1 deletion(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index fa1df1b41e..5a933d094d 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1 +1,909 @@ -/DataRepositoryService.java_bc +package org.openforis.collect.earth.app.service; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; +import java.net.URI; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Observable; +import java.util.Observer; +import java.util.concurrent.CopyOnWriteArrayList; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.desktop.ServerController.ServerInitializationEvent; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.sampler.model.SimpleCoordinate; +import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; +import org.openqa.selenium.By; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.WebDriverException; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.firefox.GeckoDriverService; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import freemarker.cache.FileTemplateLoader; +import freemarker.template.Configuration; +import freemarker.template.Template; +import freemarker.template.TemplateException; +import freemarker.template.Version; +import io.github.bonigarcia.wdm.WebDriverManager; +import liquibase.repackaged.org.apache.commons.lang3.SystemUtils; + +/** + * This class contains methods that allow Collect Earth to open browser windows + * that allow the user to have a better understanding of the plot. So far there + * are integrations with Google Earth Engine, Google Earth Engine Timelapse and + * Bing Maps. When a user clicks on a plot Collect Earth will check if the + * program is set to open any of these integrations, and if it is so it will + * open each one in its own window. These windows are closed when the program + * is closed. + *s + * @author Alfonso Sanchez-Paus Diaz + * + */ +@Component +public class BrowserService implements InitializingBean, Observer { + + + @Autowired + private LocalPropertiesService localPropertiesService; + + @Autowired + private GeolocalizeMapService geoLocalizeTemplateService; + + @Autowired + private EarthSurveyService earthSurveyService; + + @Autowired + private CodeEditorHandlerThread codeEditorHandlerThread; + + private final ArrayList drivers = new ArrayList<>(); + private final Logger logger = LoggerFactory.getLogger(BrowserService.class); + private static final String TEMPLATE_FOR_DGMAP_JS = "resources/javascript_dgmap.fmt"; + private static final Configuration cfg = new Configuration(new Version("2.3.23")); + private RemoteWebDriver webDriverBing, webDriverBaidu, webDriverTimelapse, webDriverGeeCodeEditor, + webDriverHere, webDriverStreetView, webDriverYandex, webDriverPlanetHtml, webDriverExtraMap, webDriverSecureWatch, + webDriverGEEMap, webDriverEarthMap; + + + Map locks = new HashMap(); + + private static boolean geeMethodUpdated = false; + + private boolean isClosing = false; + + public void closeBrowsers() { + synchronized (this) { + getClosingBrowsersThread().start(); + } + } + + @Override + public void afterPropertiesSet() throws Exception { + Runtime.getRuntime().addShutdownHook(getClosingBrowsersThread()); + setGeckoDriverPath(); + } + + private RemoteWebDriver chooseDriver() throws BrowserNotFoundException { + RemoteWebDriver driver = null; + final String browserSetInProperties = localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim(); + + if (browserSetInProperties.equalsIgnoreCase(EarthConstants.CHROME_BROWSER)) { + driver = tryStartChrome(); + } else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.FIREFOX_BROWSER)) { + driver = tryStartFirefox(); + } else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.EDGE_BROWSER)) { + driver = tryStartEdge(); + }else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.SAFARI_BROWSER)) { + driver = tryStartSafari(); + } + + // If the browser chosen is not installed try to find and installed browser in the computer + if( driver== null ) { + driver = tryStartChrome(); + if( driver== null ) { + driver = tryStartFirefox(); + } + if( driver== null ) { + driver = tryStartEdge(); + } + if( driver== null ) { + driver = tryStartSafari(); + } + } + + if (driver == null) { + throw new BrowserNotFoundException( + "Neither Chrome nor Firefox could be opened. You need to have one of them installed in order to use GEE, Bing Maps or Saiku."); + } + + return driver; + } + + private RemoteWebDriver tryStartFirefox() { + RemoteWebDriver driver = null; + try { + driver = (RemoteWebDriver) WebDriverManager.firefoxdriver().create(); + } catch (final WebDriverException e) { + logger.warn( + "Problem starting Firefox browser!", + e); + } + return driver; + } + + private RemoteWebDriver tryStartEdge() { + RemoteWebDriver driver = null; + try { + driver = (RemoteWebDriver) WebDriverManager.edgedriver().create(); + } catch (final WebDriverException e) { + logger.warn( + "Problem starting Edge browser", + e); + } + return driver; + } + + private RemoteWebDriver tryStartSafari() { + RemoteWebDriver driver = null; + try { + driver = (RemoteWebDriver) WebDriverManager.safaridriver().create(); + } catch (final WebDriverException e) { + logger.warn( + "Problem starting Safari browser", + e); + } + return driver; + } + + private RemoteWebDriver tryStartChrome() { + RemoteWebDriver driver = null; + try { + driver = (RemoteWebDriver) WebDriverManager.chromedriver().create(); + } catch (final Exception e) { + logger.warn( + "Problem starting Chrome browser", + e); + } + return driver; + } + + + private String getDGMapJavascript(SimplePlacemarkObject placemarkObject) { + final Map data = geoLocalizeTemplateService.getPlacemarkData(placemarkObject); + data.put("latitude", placemarkObject.getCoord().getLatitude()); + data.put("longitude", placemarkObject.getCoord().getLongitude()); + return processJavascriptTemplate(data, TEMPLATE_FOR_DGMAP_JS); + } + + private String processJavascriptTemplate(final Map data, String templateName) { + Writer out; + String result = null; + try (StringWriter fw = new StringWriter();) { + // Load template from source folder + cfg.setTemplateLoader(new FileTemplateLoader(new File(System.getProperty("user.dir")))); + final Template template = cfg.getTemplate(templateName); + + // Console output + out = new BufferedWriter(fw); + + // Add date to avoid caching + template.process(data, out); + + out.flush(); + + result = fw.toString(); + + } catch (final TemplateException e) { + logger.error("Error when generating the javascript commands", e); + } catch (final IOException e) { + logger.error("Error when reading/writing the template information", e); + } + return result; + } + + private RemoteWebDriver initBrowser() throws BrowserNotFoundException { + RemoteWebDriver driver = null; + driver = chooseDriver(); + if (isClosing) { // In case the browser takes so long to start that the user closes CE and this + // method is called when the other windows are being closed + driver.quit(); + driver = null; + } else { + drivers.add(driver); + } + return driver; + } + + public static boolean isIdOrNamePresent(String elementId, RemoteWebDriver driver) { + boolean found = false; + + try { + if (driver.findElementById(elementId).isDisplayed() || driver.findElementByName(elementId).isDisplayed()) { + found = true; + } + } catch (final Exception e) { + // Not found + } + + return found; + } + + public static boolean isCssElementPresent(String cssElement, RemoteWebDriver driver) { + boolean found = false; + + try { + WebElement elementByCssSelector = driver.findElementByCssSelector(cssElement); + found = elementByCssSelector != null; + } catch (final Exception e) { + // Not found + } + + return found; + } + + private boolean isXPathPresent(String xpath, RemoteWebDriver driver) { + boolean found = false; + + try { + if (driver.findElementByXPath(xpath).isDisplayed()) { + found = true; + } + logger.debug(String.format("Found %s", xpath)); + } catch (final Exception e) { + logger.debug(String.format("Not Found %s", xpath)); + } + + return found; + } + + private boolean loadPlotInDGMap(SimplePlacemarkObject placemarkObject, RemoteWebDriver driver) { + + boolean success = true; + if (driver != null && waitFor("mainContent", driver) && driver instanceof JavascriptExecutor) { + try { + String dgmapJs = getDGMapJavascript(placemarkObject); + driver.executeScript(dgmapJs); + + Thread.sleep( 1000 ); + // Unlock the view if it is locked + if( isCssElementPresent(".lock.on", driver) ) { + driver.findElementByCssSelector(".lock.on").click(); // UNLOCK + } + + } catch (final Exception e) { + processSeleniumError(e); + success = false; + } + } + return success; + } + + public void clickOnElements(RemoteWebDriver driver, String cssSelector) { + final List dataLayerVisibility = driver.findElementsByCssSelector(cssSelector); + for (final WebElement webElement : dataLayerVisibility) { + if (webElement.isDisplayed()) { + webElement.click(); + } + } + } + + public static boolean isGeeMethodUpdated() { + return geeMethodUpdated; + } + + public static void setGeeMethodUpdated(boolean geeMethosUpdated) { + BrowserService.geeMethodUpdated = geeMethosUpdated; + } + + private void processSeleniumError(final Exception e) { + if (e.getCause() != null && e.getCause().getMessage() != null + && !e.getCause().getMessage().contains("latitude")) { + logger.warn("Error in the selenium driver", e); + } else { + logger.info("Error in the selenium driver provoked by known bug", e); + } + } + + public RemoteWebDriver navigateTo(String url, RemoteWebDriver driver) throws BrowserNotFoundException { + return navigateTo(url, driver, true); + } + + /** + * Loads the given URL into the browser. If the browser is null then a new + * browser window is open. + * + * @param url + * The URL to load. + * @param driverParam + * The browser window to use. If this value is null a new browser + * window is open. + * @param retry + * Specify if there should be a second try to open a browser window + * if the first time fails (useful if the browser could not be found) + * @return The browser window (firefox or chrome depending on the configuration) + * used to open the URL. + * @throws BrowserNotFoundException + * Exception thrown when there is no Firefox/Chrome installed + */ + public RemoteWebDriver navigateTo(String url, RemoteWebDriver driverParam, boolean retry) + throws BrowserNotFoundException { + + RemoteWebDriver driver = driverParam; + + if (driver == null || !isDriverWorking(driver)) { + driver = initBrowser(); + } + + if (driver != null) { + try { + driver.navigate().to(url); + } catch (final Exception e) { + if (retry && (e.getCause() != null && e.getCause().getMessage() != null + && e.getCause().getMessage().contains("Session not found"))) { + // Browser closed, restart it! + logger.error("Browser was closed, restaring it...", e); + driver = initBrowser(); + navigateTo(url, driver, false); // only try to re-open one + } + } + } else { + logger.error("No Selenium driver available, Is Firefox or Chrome installed?"); + } + return driver; + } + + protected boolean isDriverWorking(RemoteWebDriver driver) { + boolean stillWorking = true; + try { + driver.findElement(By.xpath("//body")); + } catch (Exception e) { + stillWorking = false; + } + return stillWorking; + } + + /** + * Opens a browser window with the Bing Maps representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openBingMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("BING"); + synchronized (lock) { + if (localPropertiesService.isBingMapsSupported()) { + try { + webDriverBing = navigateTo(geoLocalizeTemplateService + .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_BING_HTML_TEMPLATE, + "bingMapsKey", localPropertiesService.getValue(EarthProperty.BING_MAPS_KEY)) + .toString(), webDriverBing); + } catch (final Exception e) { + logger.error("Problems loading Bing", e); + } + } + } + } + + private Object getLock(String key) { + String lock = locks.get(key); + if( lock !=null ) { + return lock; + }else{ + locks.put(key, key); + return key; + } + } + + /** + * Opens a browser window with the Planet Basemaps representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openPlanetMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("PLANET"); + synchronized (lock) { + if (localPropertiesService.isPlanetMapsSupported()) { + + boolean monthly = localPropertiesService.isPlanetMapsMonthlyOpen(); + + String template = monthly ? GeolocalizeMapService.FREEMARKER_PLANET_NICFI_ARGUMENTS : GeolocalizeMapService.FREEMARKER_PLANET_DAILY_HTML_TEMPLATE; + String key = monthly ? localPropertiesService.getValue( EarthProperty.PLANET_MAPS_CE_KEY ) : localPropertiesService.getValue( EarthProperty.PLANET_MAPS_KEY ); + + try { + + String processTemplate = geoLocalizeTemplateService.getUrlToFreemarkerOutput( + placemarkObject, + template, + "planetMapsKey", + key, + "urlPlanetEndpointPrefix", + ServerController.getHostAddress(localPropertiesService.getHost(),localPropertiesService.getPort()) + ).toString(); + + String urlPlanet = null; + if( monthly ) { + + String parameters = FileUtils.readFileToString( new File( new URI( processTemplate ) ) , StandardCharsets.UTF_8 ); + + // remove new lines + parameters = parameters.replace("\n", "").replace("\r", "").replace("\t", "").replace(" ", ""); + // remove trailing commas + parameters = parameters.replace(",],", "],").replace("],]", "]]"); + + urlPlanet = localPropertiesService.getValue( EarthProperty.PLANET_NICFI_URL ) + parameters; + }else { + urlPlanet = processTemplate; + } + + webDriverPlanetHtml = navigateTo( urlPlanet, webDriverPlanetHtml ); + + } catch (final Exception e) { + logger.error("Problems loading Planet", e); + } + } + } + } + + /** + * Opens a browser window with the Baidu Maps representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openBaiduMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("BAIDU"); + synchronized (lock) { + if (localPropertiesService.isBaiduMapsSupported()) { + + try { + webDriverBaidu = navigateTo(geoLocalizeTemplateService + .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_BAIDU_HTML_TEMPLATE) + .toString(), webDriverBaidu); + } catch (final Exception e) { + logger.error("Problems loading Baidu", e); + } + } + } + } + + /** + * Opens a browser window with the Yandex Maps representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openYandexMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("YANDEX"); + synchronized (lock) { + if (localPropertiesService.isYandexMapsSupported()) { + try { + webDriverYandex = navigateTo(geoLocalizeTemplateService.getUrlToFreemarkerOutput(placemarkObject, + GeolocalizeMapService.FREEMARKER_YANDEX_HTML_TEMPLATE).toString(), webDriverYandex); + } catch (final Exception e) { + logger.error("Problems loading Yandex", e); + } + } + } + } + + /** + * Opens a browser window with a map representation of the plot in SecureWatch. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openSecureWatch(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("SECUREWATCH"); + synchronized (lock) { + if ( localPropertiesService.isSecureWatchSupported() ) { + String url = getUrlBaseIntegration(placemarkObject, localPropertiesService.getSecureWatchURL() + "/#18/LATITUDE/LONGITUDE" ); + webDriverSecureWatch = navigateTo(url, webDriverSecureWatch); + try { + logger.warn("Loading layers - {}", placemarkObject); + loadPlotInDGMap(placemarkObject, webDriverSecureWatch); + } catch (final Exception e) { + logger.error("Error when opening Secure Watch browser window", e); + } + } + } + } + + /** + * Opens a browser window with a map representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openExtraMap(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("EXTRA"); + synchronized (lock) { + if (!StringUtils.isBlank(localPropertiesService.getExtraMap())) { + webDriverExtraMap = navigateTo( getUrlBaseIntegration(placemarkObject, localPropertiesService.getExtraMap() ) , webDriverExtraMap ); + } + } + } + + private String getUrlBaseIntegration(SimplePlacemarkObject placemarkObject, String url) { + String temp = null; + try { + String latitude = placemarkObject.getCoord().getLatitude(); + String longitude = placemarkObject.getCoord().getLongitude(); + String id = placemarkObject.getPlacemarkId().split(",")[0]; // for cases where ID also has round, then + // the id string would be something like + // "plotId,round", we only want the ID + + temp = url.replace("LATITUDE", latitude).replace("LONGITUDE", longitude).replace("PLOT_ID", id); + + } catch (final Exception e) { + logger.error("Problems Getting the URL filling for " + url, e); + } + return temp; + } + + /** + * Opens a browser window with the Google Street View representation of the + * plot. + * https://www.google.com/maps/@43.7815661,11.1484876,3a,75y,210.23h,82.32t/data=!3m6!1e1!3m4!1sEz7NiCbaIYzTJkP_RMBiqw!2e0!7i13312!8i6656?hl=en + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openStreetView(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("STREET_VIEW"); + synchronized (lock) { + if (localPropertiesService.isStreetViewSupported()) { + try { + webDriverStreetView = navigateTo( + geoLocalizeTemplateService.getUrlToFreemarkerOutput(placemarkObject, + GeolocalizeMapService.FREEMARKER_STREET_VIEW_HTML_TEMPLATE, "googleMapsApiKey", + localPropertiesService.getValue(EarthProperty.GOOGLE_MAPS_API_KEY)).toString(), + webDriverStreetView); + } catch (final Exception e) { + logger.error("Problems loading Street View", e); + } + } + } + } + + /** + * Opens a browser window with the Here Maps representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openHereMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("HERE"); + synchronized (lock) { + if (localPropertiesService.isHereMapsSupported()) { + try { + webDriverHere = navigateTo(geoLocalizeTemplateService + .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_HERE_HTML_TEMPLATE, + "hereAppId", localPropertiesService.getValue(EarthProperty.HERE_MAPS_APP_ID), + "hereAppCode", localPropertiesService.getValue(EarthProperty.HERE_MAPS_APP_CODE)) + .toString(), webDriverHere); + } catch (final Exception e) { + logger.error("Problems loading Here Maps", e); + } + + } + } + } + + private StringBuilder getGeoJsonSegment(List coordinates) { + StringBuilder geoJson = new StringBuilder("["); + if (coordinates != null) { + for (SimpleCoordinate coord : coordinates) { + geoJson = geoJson.append("[").append(coord.getLongitude()).append(",").append(coord.getLatitude()) + .append("],"); + } + // remove last character + geoJson = geoJson.deleteCharAt(geoJson.length() - 1); + } + geoJson = geoJson.append("],"); + return geoJson; + } + + + + + private String getFeature(SimplePlacemarkObject placemarkObject, String shapeType, String name ) { + StringBuilder feature = new StringBuilder("{\"type\":\"Feature\",\"properties\":{\"name\":\"").append( name).append("\"},\"geometry\":"); + feature= feature.append( getGeoJson(placemarkObject, shapeType )).append("}"); + return feature.toString(); + } + + private String getGeoJson(SimplePlacemarkObject placemarkObject, String shapeType ) { + + StringBuilder geoJson = new StringBuilder("{\"type\":\"" ).append( shapeType).append("\",\"coordinates\":["); + List shape = placemarkObject.getShape(); + geoJson = geoJson.append(getGeoJsonSegment(shape)); + geoJson = geoJson.deleteCharAt(geoJson.length() - 1); + geoJson = geoJson.append("]}"); + return geoJson.toString(); + } + + /** + * Opens a browser window with the Google Earth Engine Code Editor and runs the + * freemarker template found in resources/eeCodeEditorScript.fmt on the main + * editor of GEE. + * + * @param placemarkObject + * The center point of the plot. + * @throws BrowserNotFoundException + * If the browser cannot be found + * + */ + public void openGEEAppURL(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("GEEAPP"); + synchronized (lock) { + if (localPropertiesService.isGEEAppSupported()) { + + try { + StringBuilder url = new StringBuilder(localPropertiesService.getGEEAppURL()); + url = url.append("#geoJson=") + .append(URLEncoder.encode(getGeoJson(placemarkObject, "MultiLineString"), StandardCharsets.UTF_8.toString())) + .append(";"); + url = url.append("plotId=") + .append(URLEncoder.encode(placemarkObject.getPlacemarkId(), StandardCharsets.UTF_8.toString())) + .append(";"); + url = url.append("survey=") + .append(URLEncoder.encode( earthSurveyService.getCollectSurvey().getName() , StandardCharsets.UTF_8.toString())) + .append(";"); + webDriverGEEMap = navigateTo(url.toString(), webDriverGEEMap); + webDriverGEEMap.navigate().refresh(); // FORCE REFRESH - OTHERWISE WINDOW IS NOT REFRESHED FOR SOME STRANGE REASON + } catch (final Exception e) { + logger.error("Problems loading GEE APP window", e); + } + } + } + } + + + public void openEarthMapURL(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("EARTH_MAP"); + synchronized (lock) { + if (localPropertiesService.isEarthMapSupported()) { + + + try { + StringBuilder url = new StringBuilder(localPropertiesService.getEarthMapURL()).append("?"); + url = url.append("polygon=") + .append(URLEncoder.encode(getFeature(placemarkObject, "Polygon", placemarkObject.getPlacemarkId()), StandardCharsets.UTF_8.toString())) + .append("&"); + + if( StringUtils.isNotBlank(localPropertiesService.getEarthMapLayers()) ) { + url = url.append("layers=") + .append(URLEncoder.encode(localPropertiesService.getEarthMapLayers(), StandardCharsets.UTF_8.toString())) + .append("&"); + } + + if( StringUtils.isNotBlank(localPropertiesService.getEarthMapScripts()) ) { + url = url.append("scripts=") + .append(URLEncoder.encode(localPropertiesService.getEarthMapScripts(), StandardCharsets.UTF_8.toString())) + .append("&"); + } + + String aoi = localPropertiesService.getEarthMapAOI(); + if( StringUtils.isBlank(aoi) ) { + aoi = "global"; + } + url = url.append("aoi=") + .append(URLEncoder.encode( aoi, StandardCharsets.UTF_8.toString() )) + .append("&embed=true"); // Set the EMBED parameter to true so that the user does not need to log in. + + webDriverEarthMap = navigateTo(url.toString(), webDriverEarthMap); + //Desktop.getDesktop().browse( new URI( url.toString() ) ); + //webDriverEarthMap.navigate().refresh(); // FORCE REFRESH - OTHERWISE WINDOW IS NOT REFRESHED FOR SOME STRANGE REASON + } catch (final Exception e) { + logger.error("Problems loading Earth Map window", e); + } + } + } + } + + /** + * Opens a browser window with the Google Earth Engine Code Editor and runs the + * freemarker template found in resources/eeCodeEditorScript.fmt on the main + * editor of GEE. + * + * @param placemarkObject + * The center point of the plot. + * @throws BrowserNotFoundException + * If the browser cannot be found + * + */ + public void openGEECodeEditor(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("CODE_EDITOR"); + synchronized (lock) { + if (localPropertiesService.isCodeEditorSupported()) { + + boolean firstOpening = false; + if (getWebDriverGeeCodeEditor() == null) { + setWebDriverGeeCodeEditor(initBrowser()); + firstOpening = true; + } + + if (firstOpening && (liquibase.repackaged.org.apache.commons.lang3.SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX)) { + codeEditorHandlerThread.disableCodeEditorAutocomplete(getWebDriverGeeCodeEditor()); + } + + codeEditorHandlerThread.loadCodeEditorScript(placemarkObject, getWebDriverGeeCodeEditor()); + } + } + } + + + /** + * Opens a browser window with the Google Earth Engine Timelapse representation + * of the plot. + * + * @param placemarkObject + * The center point of the plot. + * @throws BrowserNotFoundException + * If the browser cannot be found + * + */ + public void openTimelapse(final SimplePlacemarkObject placemarkObject) + throws BrowserNotFoundException { + Object lock = getLock("TIMELAPSE"); + synchronized (lock) { + if (localPropertiesService.isTimelapseSupported()) { + try { + String coordinates = placemarkObject.getCoord().toString(); + webDriverTimelapse = navigateTo( + "https://earthengine.google.org/timelapse/timelapseplayer_v2.html?timelapseclient=http://earthengine.google.org/timelapse/data&v=" + + coordinates + ",10.812,latLng&t=0.08", + webDriverTimelapse); + } catch (final Exception e) { + logger.error("Problems loading Timelapse", e); + } + } + } + } + + private void setGeckoDriverPath() { + String geckoDriverPath = ""; + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { + geckoDriverPath = "resources/geckodriver_mac"; + } else if (SystemUtils.IS_OS_UNIX) { + if (System.getProperty("os.arch").contains("64") + || System.getProperty("sun.arch.data.model").equals("64")) { + geckoDriverPath = "resources/geckodriver_64"; + } else { + geckoDriverPath = "resources/geckodriver_32"; + } + } else if (SystemUtils.IS_OS_WINDOWS) { + try { + if (System.getProperty("os.arch").contains("64") + || System.getProperty("sun.arch.data.model").equals("64")) + geckoDriverPath = "resources/geckodriver_64.exe"; + else + geckoDriverPath = "resources/geckodriver_32.exe"; + } catch (Exception e) { + geckoDriverPath = "resources/geckodriver_64.exe"; + } + } else { + throw new IllegalArgumentException("Geckodriver is not supported in the current OS"); + } + + File geckoDriverFile = new File(geckoDriverPath); + + // if above property is not working or not opening the application in browser + // then try below property + System.setProperty(GeckoDriverService.GECKO_DRIVER_EXE_PROPERTY, geckoDriverFile.getAbsolutePath()); + System.setProperty(FirefoxDriver.SystemProperty.DRIVER_USE_MARIONETTE, "true"); + + } + + public boolean waitFor(String elementId, RemoteWebDriver driver) { + int i = 0; + while (!isIdOrNamePresent(elementId, driver)) { + try { + Thread.sleep(1000); + } catch (final InterruptedException e) { + return false; + } + i++; + if (i > 60) { + return false; + } + } + return true; + } + + public boolean waitForXPath(String xpath, RemoteWebDriver driver) { + int i = 0; + while (!isXPathPresent(xpath, driver)) { + try { + Thread.sleep(1000); + } catch (final InterruptedException e) { + return false; + + } + i++; + if (i > 30) { + return false; + } + } + return true; + } + + private Thread getClosingBrowsersThread() { + + return new Thread("Quit the open browsers") { + @Override + public void run() { + isClosing = true; + CopyOnWriteArrayList driversCopy = new CopyOnWriteArrayList<>(drivers); + for (Iterator iterator = driversCopy.iterator(); iterator.hasNext();) { + RemoteWebDriver remoteWebDriver = iterator.next(); + try { + remoteWebDriver.quit(); + } catch (final Exception e) { + logger.error("Error quitting the browser", e); + } + } + + } + }; + } + + @Override + public void update(Observable o, Object arg) { + if (ServerInitializationEvent.SERVER_STOPPED_EVENT.equals(arg)) { + this.closeBrowsers(); + } + } + + private RemoteWebDriver getWebDriverGeeCodeEditor() { + return webDriverGeeCodeEditor; + } + + protected void setWebDriverGeeCodeEditor(RemoteWebDriver webDriverGeeCodeEditor) { + this.webDriverGeeCodeEditor = webDriverGeeCodeEditor; + } + +} From 7f86c4fa12995f2669ae39644fe2fc8be306c228 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:41 +0100 Subject: [PATCH 0125/1620] New translations BrowserService.java (English) --- .../earth/app/view/Messages_en.properties | 905 +++++++++++++++++- 1 file changed, 893 insertions(+), 12 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 6570688ad6..5a933d094d 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,28 +1,909 @@ package org.openforis.collect.earth.app.service; -public class BrowserNotFoundException extends Exception{ +import java.io.BufferedWriter; +import java.io.File; +import java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; +import java.net.URI; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Observable; +import java.util.Observer; +import java.util.concurrent.CopyOnWriteArrayList; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.desktop.ServerController.ServerInitializationEvent; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.sampler.model.SimpleCoordinate; +import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; +import org.openqa.selenium.By; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.WebDriverException; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.firefox.GeckoDriverService; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import freemarker.cache.FileTemplateLoader; +import freemarker.template.Configuration; +import freemarker.template.Template; +import freemarker.template.TemplateException; +import freemarker.template.Version; +import io.github.bonigarcia.wdm.WebDriverManager; +import liquibase.repackaged.org.apache.commons.lang3.SystemUtils; + +/** + * This class contains methods that allow Collect Earth to open browser windows + * that allow the user to have a better understanding of the plot. So far there + * are integrations with Google Earth Engine, Google Earth Engine Timelapse and + * Bing Maps. When a user clicks on a plot Collect Earth will check if the + * program is set to open any of these integrations, and if it is so it will + * open each one in its own window. These windows are closed when the program + * is closed. + *s + * @author Alfonso Sanchez-Paus Diaz + * + */ +@Component +public class BrowserService implements InitializingBean, Observer { + + + @Autowired + private LocalPropertiesService localPropertiesService; + + @Autowired + private GeolocalizeMapService geoLocalizeTemplateService; + + @Autowired + private EarthSurveyService earthSurveyService; + + @Autowired + private CodeEditorHandlerThread codeEditorHandlerThread; + + private final ArrayList drivers = new ArrayList<>(); + private final Logger logger = LoggerFactory.getLogger(BrowserService.class); + private static final String TEMPLATE_FOR_DGMAP_JS = "resources/javascript_dgmap.fmt"; + private static final Configuration cfg = new Configuration(new Version("2.3.23")); + private RemoteWebDriver webDriverBing, webDriverBaidu, webDriverTimelapse, webDriverGeeCodeEditor, + webDriverHere, webDriverStreetView, webDriverYandex, webDriverPlanetHtml, webDriverExtraMap, webDriverSecureWatch, + webDriverGEEMap, webDriverEarthMap; + + + Map locks = new HashMap(); + + private static boolean geeMethodUpdated = false; + + private boolean isClosing = false; + + public void closeBrowsers() { + synchronized (this) { + getClosingBrowsersThread().start(); + } + } + + @Override + public void afterPropertiesSet() throws Exception { + Runtime.getRuntime().addShutdownHook(getClosingBrowsersThread()); + setGeckoDriverPath(); + } + + private RemoteWebDriver chooseDriver() throws BrowserNotFoundException { + RemoteWebDriver driver = null; + final String browserSetInProperties = localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim(); + + if (browserSetInProperties.equalsIgnoreCase(EarthConstants.CHROME_BROWSER)) { + driver = tryStartChrome(); + } else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.FIREFOX_BROWSER)) { + driver = tryStartFirefox(); + } else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.EDGE_BROWSER)) { + driver = tryStartEdge(); + }else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.SAFARI_BROWSER)) { + driver = tryStartSafari(); + } + + // If the browser chosen is not installed try to find and installed browser in the computer + if( driver== null ) { + driver = tryStartChrome(); + if( driver== null ) { + driver = tryStartFirefox(); + } + if( driver== null ) { + driver = tryStartEdge(); + } + if( driver== null ) { + driver = tryStartSafari(); + } + } + + if (driver == null) { + throw new BrowserNotFoundException( + "Neither Chrome nor Firefox could be opened. You need to have one of them installed in order to use GEE, Bing Maps or Saiku."); + } + + return driver; + } + + private RemoteWebDriver tryStartFirefox() { + RemoteWebDriver driver = null; + try { + driver = (RemoteWebDriver) WebDriverManager.firefoxdriver().create(); + } catch (final WebDriverException e) { + logger.warn( + "Problem starting Firefox browser!", + e); + } + return driver; + } + + private RemoteWebDriver tryStartEdge() { + RemoteWebDriver driver = null; + try { + driver = (RemoteWebDriver) WebDriverManager.edgedriver().create(); + } catch (final WebDriverException e) { + logger.warn( + "Problem starting Edge browser", + e); + } + return driver; + } + + private RemoteWebDriver tryStartSafari() { + RemoteWebDriver driver = null; + try { + driver = (RemoteWebDriver) WebDriverManager.safaridriver().create(); + } catch (final WebDriverException e) { + logger.warn( + "Problem starting Safari browser", + e); + } + return driver; + } + + private RemoteWebDriver tryStartChrome() { + RemoteWebDriver driver = null; + try { + driver = (RemoteWebDriver) WebDriverManager.chromedriver().create(); + } catch (final Exception e) { + logger.warn( + "Problem starting Chrome browser", + e); + } + return driver; + } + + + private String getDGMapJavascript(SimplePlacemarkObject placemarkObject) { + final Map data = geoLocalizeTemplateService.getPlacemarkData(placemarkObject); + data.put("latitude", placemarkObject.getCoord().getLatitude()); + data.put("longitude", placemarkObject.getCoord().getLongitude()); + return processJavascriptTemplate(data, TEMPLATE_FOR_DGMAP_JS); + } + + private String processJavascriptTemplate(final Map data, String templateName) { + Writer out; + String result = null; + try (StringWriter fw = new StringWriter();) { + // Load template from source folder + cfg.setTemplateLoader(new FileTemplateLoader(new File(System.getProperty("user.dir")))); + final Template template = cfg.getTemplate(templateName); + + // Console output + out = new BufferedWriter(fw); + + // Add date to avoid caching + template.process(data, out); + + out.flush(); + + result = fw.toString(); + + } catch (final TemplateException e) { + logger.error("Error when generating the javascript commands", e); + } catch (final IOException e) { + logger.error("Error when reading/writing the template information", e); + } + return result; + } + + private RemoteWebDriver initBrowser() throws BrowserNotFoundException { + RemoteWebDriver driver = null; + driver = chooseDriver(); + if (isClosing) { // In case the browser takes so long to start that the user closes CE and this + // method is called when the other windows are being closed + driver.quit(); + driver = null; + } else { + drivers.add(driver); + } + return driver; + } + + public static boolean isIdOrNamePresent(String elementId, RemoteWebDriver driver) { + boolean found = false; + + try { + if (driver.findElementById(elementId).isDisplayed() || driver.findElementByName(elementId).isDisplayed()) { + found = true; + } + } catch (final Exception e) { + // Not found + } + + return found; + } + + public static boolean isCssElementPresent(String cssElement, RemoteWebDriver driver) { + boolean found = false; + + try { + WebElement elementByCssSelector = driver.findElementByCssSelector(cssElement); + found = elementByCssSelector != null; + } catch (final Exception e) { + // Not found + } + + return found; + } + + private boolean isXPathPresent(String xpath, RemoteWebDriver driver) { + boolean found = false; + + try { + if (driver.findElementByXPath(xpath).isDisplayed()) { + found = true; + } + logger.debug(String.format("Found %s", xpath)); + } catch (final Exception e) { + logger.debug(String.format("Not Found %s", xpath)); + } + + return found; + } + + private boolean loadPlotInDGMap(SimplePlacemarkObject placemarkObject, RemoteWebDriver driver) { + + boolean success = true; + if (driver != null && waitFor("mainContent", driver) && driver instanceof JavascriptExecutor) { + try { + String dgmapJs = getDGMapJavascript(placemarkObject); + driver.executeScript(dgmapJs); + + Thread.sleep( 1000 ); + // Unlock the view if it is locked + if( isCssElementPresent(".lock.on", driver) ) { + driver.findElementByCssSelector(".lock.on").click(); // UNLOCK + } + + } catch (final Exception e) { + processSeleniumError(e); + success = false; + } + } + return success; + } + + public void clickOnElements(RemoteWebDriver driver, String cssSelector) { + final List dataLayerVisibility = driver.findElementsByCssSelector(cssSelector); + for (final WebElement webElement : dataLayerVisibility) { + if (webElement.isDisplayed()) { + webElement.click(); + } + } + } + + public static boolean isGeeMethodUpdated() { + return geeMethodUpdated; + } + + public static void setGeeMethodUpdated(boolean geeMethosUpdated) { + BrowserService.geeMethodUpdated = geeMethosUpdated; + } + + private void processSeleniumError(final Exception e) { + if (e.getCause() != null && e.getCause().getMessage() != null + && !e.getCause().getMessage().contains("latitude")) { + logger.warn("Error in the selenium driver", e); + } else { + logger.info("Error in the selenium driver provoked by known bug", e); + } + } + + public RemoteWebDriver navigateTo(String url, RemoteWebDriver driver) throws BrowserNotFoundException { + return navigateTo(url, driver, true); + } /** - * + * Loads the given URL into the browser. If the browser is null then a new + * browser window is open. + * + * @param url + * The URL to load. + * @param driverParam + * The browser window to use. If this value is null a new browser + * window is open. + * @param retry + * Specify if there should be a second try to open a browser window + * if the first time fails (useful if the browser could not be found) + * @return The browser window (firefox or chrome depending on the configuration) + * used to open the URL. + * @throws BrowserNotFoundException + * Exception thrown when there is no Firefox/Chrome installed */ - private static final long serialVersionUID = -404938492481063378L; + public RemoteWebDriver navigateTo(String url, RemoteWebDriver driverParam, boolean retry) + throws BrowserNotFoundException { + + RemoteWebDriver driver = driverParam; + + if (driver == null || !isDriverWorking(driver)) { + driver = initBrowser(); + } - public BrowserNotFoundException() { - super(); + if (driver != null) { + try { + driver.navigate().to(url); + } catch (final Exception e) { + if (retry && (e.getCause() != null && e.getCause().getMessage() != null + && e.getCause().getMessage().contains("Session not found"))) { + // Browser closed, restart it! + logger.error("Browser was closed, restaring it...", e); + driver = initBrowser(); + navigateTo(url, driver, false); // only try to re-open one + } + } + } else { + logger.error("No Selenium driver available, Is Firefox or Chrome installed?"); + } + return driver; } + protected boolean isDriverWorking(RemoteWebDriver driver) { + boolean stillWorking = true; + try { + driver.findElement(By.xpath("//body")); + } catch (Exception e) { + stillWorking = false; + } + return stillWorking; + } + + /** + * Opens a browser window with the Bing Maps representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openBingMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("BING"); + synchronized (lock) { + if (localPropertiesService.isBingMapsSupported()) { + try { + webDriverBing = navigateTo(geoLocalizeTemplateService + .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_BING_HTML_TEMPLATE, + "bingMapsKey", localPropertiesService.getValue(EarthProperty.BING_MAPS_KEY)) + .toString(), webDriverBing); + } catch (final Exception e) { + logger.error("Problems loading Bing", e); + } + } + } + } + + private Object getLock(String key) { + String lock = locks.get(key); + if( lock !=null ) { + return lock; + }else{ + locks.put(key, key); + return key; + } + } + + /** + * Opens a browser window with the Planet Basemaps representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openPlanetMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("PLANET"); + synchronized (lock) { + if (localPropertiesService.isPlanetMapsSupported()) { + + boolean monthly = localPropertiesService.isPlanetMapsMonthlyOpen(); + + String template = monthly ? GeolocalizeMapService.FREEMARKER_PLANET_NICFI_ARGUMENTS : GeolocalizeMapService.FREEMARKER_PLANET_DAILY_HTML_TEMPLATE; + String key = monthly ? localPropertiesService.getValue( EarthProperty.PLANET_MAPS_CE_KEY ) : localPropertiesService.getValue( EarthProperty.PLANET_MAPS_KEY ); + + try { + + String processTemplate = geoLocalizeTemplateService.getUrlToFreemarkerOutput( + placemarkObject, + template, + "planetMapsKey", + key, + "urlPlanetEndpointPrefix", + ServerController.getHostAddress(localPropertiesService.getHost(),localPropertiesService.getPort()) + ).toString(); + + String urlPlanet = null; + if( monthly ) { + + String parameters = FileUtils.readFileToString( new File( new URI( processTemplate ) ) , StandardCharsets.UTF_8 ); + + // remove new lines + parameters = parameters.replace("\n", "").replace("\r", "").replace("\t", "").replace(" ", ""); + // remove trailing commas + parameters = parameters.replace(",],", "],").replace("],]", "]]"); + + urlPlanet = localPropertiesService.getValue( EarthProperty.PLANET_NICFI_URL ) + parameters; + }else { + urlPlanet = processTemplate; + } + + webDriverPlanetHtml = navigateTo( urlPlanet, webDriverPlanetHtml ); + + } catch (final Exception e) { + logger.error("Problems loading Planet", e); + } + } + } + } + + /** + * Opens a browser window with the Baidu Maps representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openBaiduMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("BAIDU"); + synchronized (lock) { + if (localPropertiesService.isBaiduMapsSupported()) { + + try { + webDriverBaidu = navigateTo(geoLocalizeTemplateService + .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_BAIDU_HTML_TEMPLATE) + .toString(), webDriverBaidu); + } catch (final Exception e) { + logger.error("Problems loading Baidu", e); + } + } + } + } + + /** + * Opens a browser window with the Yandex Maps representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openYandexMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("YANDEX"); + synchronized (lock) { + if (localPropertiesService.isYandexMapsSupported()) { + try { + webDriverYandex = navigateTo(geoLocalizeTemplateService.getUrlToFreemarkerOutput(placemarkObject, + GeolocalizeMapService.FREEMARKER_YANDEX_HTML_TEMPLATE).toString(), webDriverYandex); + } catch (final Exception e) { + logger.error("Problems loading Yandex", e); + } + } + } + } + + /** + * Opens a browser window with a map representation of the plot in SecureWatch. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openSecureWatch(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("SECUREWATCH"); + synchronized (lock) { + if ( localPropertiesService.isSecureWatchSupported() ) { + String url = getUrlBaseIntegration(placemarkObject, localPropertiesService.getSecureWatchURL() + "/#18/LATITUDE/LONGITUDE" ); + webDriverSecureWatch = navigateTo(url, webDriverSecureWatch); + try { + logger.warn("Loading layers - {}", placemarkObject); + loadPlotInDGMap(placemarkObject, webDriverSecureWatch); + } catch (final Exception e) { + logger.error("Error when opening Secure Watch browser window", e); + } + } + } + } + + /** + * Opens a browser window with a map representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openExtraMap(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("EXTRA"); + synchronized (lock) { + if (!StringUtils.isBlank(localPropertiesService.getExtraMap())) { + webDriverExtraMap = navigateTo( getUrlBaseIntegration(placemarkObject, localPropertiesService.getExtraMap() ) , webDriverExtraMap ); + } + } + } + + private String getUrlBaseIntegration(SimplePlacemarkObject placemarkObject, String url) { + String temp = null; + try { + String latitude = placemarkObject.getCoord().getLatitude(); + String longitude = placemarkObject.getCoord().getLongitude(); + String id = placemarkObject.getPlacemarkId().split(",")[0]; // for cases where ID also has round, then + // the id string would be something like + // "plotId,round", we only want the ID + + temp = url.replace("LATITUDE", latitude).replace("LONGITUDE", longitude).replace("PLOT_ID", id); + + } catch (final Exception e) { + logger.error("Problems Getting the URL filling for " + url, e); + } + return temp; + } + + /** + * Opens a browser window with the Google Street View representation of the + * plot. + * https://www.google.com/maps/@43.7815661,11.1484876,3a,75y,210.23h,82.32t/data=!3m6!1e1!3m4!1sEz7NiCbaIYzTJkP_RMBiqw!2e0!7i13312!8i6656?hl=en + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openStreetView(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("STREET_VIEW"); + synchronized (lock) { + if (localPropertiesService.isStreetViewSupported()) { + try { + webDriverStreetView = navigateTo( + geoLocalizeTemplateService.getUrlToFreemarkerOutput(placemarkObject, + GeolocalizeMapService.FREEMARKER_STREET_VIEW_HTML_TEMPLATE, "googleMapsApiKey", + localPropertiesService.getValue(EarthProperty.GOOGLE_MAPS_API_KEY)).toString(), + webDriverStreetView); + } catch (final Exception e) { + logger.error("Problems loading Street View", e); + } + } + } + } + + /** + * Opens a browser window with the Here Maps representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openHereMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("HERE"); + synchronized (lock) { + if (localPropertiesService.isHereMapsSupported()) { + try { + webDriverHere = navigateTo(geoLocalizeTemplateService + .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_HERE_HTML_TEMPLATE, + "hereAppId", localPropertiesService.getValue(EarthProperty.HERE_MAPS_APP_ID), + "hereAppCode", localPropertiesService.getValue(EarthProperty.HERE_MAPS_APP_CODE)) + .toString(), webDriverHere); + } catch (final Exception e) { + logger.error("Problems loading Here Maps", e); + } + + } + } + } + + private StringBuilder getGeoJsonSegment(List coordinates) { + StringBuilder geoJson = new StringBuilder("["); + if (coordinates != null) { + for (SimpleCoordinate coord : coordinates) { + geoJson = geoJson.append("[").append(coord.getLongitude()).append(",").append(coord.getLatitude()) + .append("],"); + } + // remove last character + geoJson = geoJson.deleteCharAt(geoJson.length() - 1); + } + geoJson = geoJson.append("],"); + return geoJson; + } + + + + + private String getFeature(SimplePlacemarkObject placemarkObject, String shapeType, String name ) { + StringBuilder feature = new StringBuilder("{\"type\":\"Feature\",\"properties\":{\"name\":\"").append( name).append("\"},\"geometry\":"); + feature= feature.append( getGeoJson(placemarkObject, shapeType )).append("}"); + return feature.toString(); + } + + private String getGeoJson(SimplePlacemarkObject placemarkObject, String shapeType ) { + + StringBuilder geoJson = new StringBuilder("{\"type\":\"" ).append( shapeType).append("\",\"coordinates\":["); + List shape = placemarkObject.getShape(); + geoJson = geoJson.append(getGeoJsonSegment(shape)); + geoJson = geoJson.deleteCharAt(geoJson.length() - 1); + geoJson = geoJson.append("]}"); + return geoJson.toString(); + } + + /** + * Opens a browser window with the Google Earth Engine Code Editor and runs the + * freemarker template found in resources/eeCodeEditorScript.fmt on the main + * editor of GEE. + * + * @param placemarkObject + * The center point of the plot. + * @throws BrowserNotFoundException + * If the browser cannot be found + * + */ + public void openGEEAppURL(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("GEEAPP"); + synchronized (lock) { + if (localPropertiesService.isGEEAppSupported()) { + + try { + StringBuilder url = new StringBuilder(localPropertiesService.getGEEAppURL()); + url = url.append("#geoJson=") + .append(URLEncoder.encode(getGeoJson(placemarkObject, "MultiLineString"), StandardCharsets.UTF_8.toString())) + .append(";"); + url = url.append("plotId=") + .append(URLEncoder.encode(placemarkObject.getPlacemarkId(), StandardCharsets.UTF_8.toString())) + .append(";"); + url = url.append("survey=") + .append(URLEncoder.encode( earthSurveyService.getCollectSurvey().getName() , StandardCharsets.UTF_8.toString())) + .append(";"); + webDriverGEEMap = navigateTo(url.toString(), webDriverGEEMap); + webDriverGEEMap.navigate().refresh(); // FORCE REFRESH - OTHERWISE WINDOW IS NOT REFRESHED FOR SOME STRANGE REASON + } catch (final Exception e) { + logger.error("Problems loading GEE APP window", e); + } + } + } + } + + + public void openEarthMapURL(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("EARTH_MAP"); + synchronized (lock) { + if (localPropertiesService.isEarthMapSupported()) { + + + try { + StringBuilder url = new StringBuilder(localPropertiesService.getEarthMapURL()).append("?"); + url = url.append("polygon=") + .append(URLEncoder.encode(getFeature(placemarkObject, "Polygon", placemarkObject.getPlacemarkId()), StandardCharsets.UTF_8.toString())) + .append("&"); + + if( StringUtils.isNotBlank(localPropertiesService.getEarthMapLayers()) ) { + url = url.append("layers=") + .append(URLEncoder.encode(localPropertiesService.getEarthMapLayers(), StandardCharsets.UTF_8.toString())) + .append("&"); + } + + if( StringUtils.isNotBlank(localPropertiesService.getEarthMapScripts()) ) { + url = url.append("scripts=") + .append(URLEncoder.encode(localPropertiesService.getEarthMapScripts(), StandardCharsets.UTF_8.toString())) + .append("&"); + } + + String aoi = localPropertiesService.getEarthMapAOI(); + if( StringUtils.isBlank(aoi) ) { + aoi = "global"; + } + url = url.append("aoi=") + .append(URLEncoder.encode( aoi, StandardCharsets.UTF_8.toString() )) + .append("&embed=true"); // Set the EMBED parameter to true so that the user does not need to log in. + + webDriverEarthMap = navigateTo(url.toString(), webDriverEarthMap); + //Desktop.getDesktop().browse( new URI( url.toString() ) ); + //webDriverEarthMap.navigate().refresh(); // FORCE REFRESH - OTHERWISE WINDOW IS NOT REFRESHED FOR SOME STRANGE REASON + } catch (final Exception e) { + logger.error("Problems loading Earth Map window", e); + } + } + } + } + + /** + * Opens a browser window with the Google Earth Engine Code Editor and runs the + * freemarker template found in resources/eeCodeEditorScript.fmt on the main + * editor of GEE. + * + * @param placemarkObject + * The center point of the plot. + * @throws BrowserNotFoundException + * If the browser cannot be found + * + */ + public void openGEECodeEditor(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("CODE_EDITOR"); + synchronized (lock) { + if (localPropertiesService.isCodeEditorSupported()) { + + boolean firstOpening = false; + if (getWebDriverGeeCodeEditor() == null) { + setWebDriverGeeCodeEditor(initBrowser()); + firstOpening = true; + } + + if (firstOpening && (liquibase.repackaged.org.apache.commons.lang3.SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX)) { + codeEditorHandlerThread.disableCodeEditorAutocomplete(getWebDriverGeeCodeEditor()); + } + + codeEditorHandlerThread.loadCodeEditorScript(placemarkObject, getWebDriverGeeCodeEditor()); + } + } + } + + + /** + * Opens a browser window with the Google Earth Engine Timelapse representation + * of the plot. + * + * @param placemarkObject + * The center point of the plot. + * @throws BrowserNotFoundException + * If the browser cannot be found + * + */ + public void openTimelapse(final SimplePlacemarkObject placemarkObject) + throws BrowserNotFoundException { + Object lock = getLock("TIMELAPSE"); + synchronized (lock) { + if (localPropertiesService.isTimelapseSupported()) { + try { + String coordinates = placemarkObject.getCoord().toString(); + webDriverTimelapse = navigateTo( + "https://earthengine.google.org/timelapse/timelapseplayer_v2.html?timelapseclient=http://earthengine.google.org/timelapse/data&v=" + + coordinates + ",10.812,latLng&t=0.08", + webDriverTimelapse); + } catch (final Exception e) { + logger.error("Problems loading Timelapse", e); + } + } + } + } + + private void setGeckoDriverPath() { + String geckoDriverPath = ""; + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { + geckoDriverPath = "resources/geckodriver_mac"; + } else if (SystemUtils.IS_OS_UNIX) { + if (System.getProperty("os.arch").contains("64") + || System.getProperty("sun.arch.data.model").equals("64")) { + geckoDriverPath = "resources/geckodriver_64"; + } else { + geckoDriverPath = "resources/geckodriver_32"; + } + } else if (SystemUtils.IS_OS_WINDOWS) { + try { + if (System.getProperty("os.arch").contains("64") + || System.getProperty("sun.arch.data.model").equals("64")) + geckoDriverPath = "resources/geckodriver_64.exe"; + else + geckoDriverPath = "resources/geckodriver_32.exe"; + } catch (Exception e) { + geckoDriverPath = "resources/geckodriver_64.exe"; + } + } else { + throw new IllegalArgumentException("Geckodriver is not supported in the current OS"); + } + + File geckoDriverFile = new File(geckoDriverPath); + + // if above property is not working or not opening the application in browser + // then try below property + System.setProperty(GeckoDriverService.GECKO_DRIVER_EXE_PROPERTY, geckoDriverFile.getAbsolutePath()); + System.setProperty(FirefoxDriver.SystemProperty.DRIVER_USE_MARIONETTE, "true"); + + } + + public boolean waitFor(String elementId, RemoteWebDriver driver) { + int i = 0; + while (!isIdOrNamePresent(elementId, driver)) { + try { + Thread.sleep(1000); + } catch (final InterruptedException e) { + return false; + } + i++; + if (i > 60) { + return false; + } + } + return true; + } + + public boolean waitForXPath(String xpath, RemoteWebDriver driver) { + int i = 0; + while (!isXPathPresent(xpath, driver)) { + try { + Thread.sleep(1000); + } catch (final InterruptedException e) { + return false; + + } + i++; + if (i > 30) { + return false; + } + } + return true; + } + + private Thread getClosingBrowsersThread() { + + return new Thread("Quit the open browsers") { + @Override + public void run() { + isClosing = true; + CopyOnWriteArrayList driversCopy = new CopyOnWriteArrayList<>(drivers); + for (Iterator iterator = driversCopy.iterator(); iterator.hasNext();) { + RemoteWebDriver remoteWebDriver = iterator.next(); + try { + remoteWebDriver.quit(); + } catch (final Exception e) { + logger.error("Error quitting the browser", e); + } + } + + } + }; + } - public BrowserNotFoundException(String message, Throwable cause) { - super(message, cause); + @Override + public void update(Observable o, Object arg) { + if (ServerInitializationEvent.SERVER_STOPPED_EVENT.equals(arg)) { + this.closeBrowsers(); + } } - public BrowserNotFoundException(String message) { - super(message); + private RemoteWebDriver getWebDriverGeeCodeEditor() { + return webDriverGeeCodeEditor; } - public BrowserNotFoundException(Throwable cause) { - super(cause); + protected void setWebDriverGeeCodeEditor(RemoteWebDriver webDriverGeeCodeEditor) { + this.webDriverGeeCodeEditor = webDriverGeeCodeEditor; } - } From d3ac5eae1367fe88f75cadbb4d66ac19d232d1c8 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:42 +0100 Subject: [PATCH 0126/1620] New translations CodeEditorHandlerThread.java (French) --- .../earth/app/view/Messages_fr.properties | 1012 ++++------------- 1 file changed, 211 insertions(+), 801 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 5a933d094d..c2259f5db0 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,909 +1,319 @@ package org.openforis.collect.earth.app.service; -import java.io.BufferedWriter; +import java.awt.Toolkit; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.StringSelection; import java.io.File; import java.io.IOException; -import java.io.StringWriter; -import java.io.Writer; -import java.net.URI; -import java.net.URLEncoder; +import java.net.URISyntaxException; +import java.net.URL; import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Observable; -import java.util.Observer; -import java.util.concurrent.CopyOnWriteArrayList; +import java.util.NoSuchElementException; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.desktop.ServerController; -import org.openforis.collect.earth.app.desktop.ServerController.ServerInitializationEvent; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.sampler.model.SimpleCoordinate; import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; import org.openqa.selenium.By; import org.openqa.selenium.JavascriptExecutor; -import org.openqa.selenium.WebDriverException; +import org.openqa.selenium.Keys; import org.openqa.selenium.WebElement; -import org.openqa.selenium.firefox.FirefoxDriver; -import org.openqa.selenium.firefox.GeckoDriverService; import org.openqa.selenium.remote.RemoteWebDriver; +import org.openqa.selenium.remote.RemoteWebElement; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import freemarker.cache.FileTemplateLoader; -import freemarker.template.Configuration; -import freemarker.template.Template; -import freemarker.template.TemplateException; -import freemarker.template.Version; -import io.github.bonigarcia.wdm.WebDriverManager; import liquibase.repackaged.org.apache.commons.lang3.SystemUtils; -/** - * This class contains methods that allow Collect Earth to open browser windows - * that allow the user to have a better understanding of the plot. So far there - * are integrations with Google Earth Engine, Google Earth Engine Timelapse and - * Bing Maps. When a user clicks on a plot Collect Earth will check if the - * program is set to open any of these integrations, and if it is so it will - * open each one in its own window. These windows are closed when the program - * is closed. - *s - * @author Alfonso Sanchez-Paus Diaz - * - */ + @Component -public class BrowserService implements InitializingBean, Observer { +public class CodeEditorHandlerThread { + private static final String RUN_SCRIPT_BUTTON = "button.run-button"; + private static final String RESET_SCRIPT_BUTTON = "button.reset-button"; + private SimplePlacemarkObject placemarkObject; + private RemoteWebDriver webDriverGee; @Autowired - private LocalPropertiesService localPropertiesService; + private BrowserService browserService; + private Logger logger = LoggerFactory.getLogger(CodeEditorHandlerThread.class); @Autowired private GeolocalizeMapService geoLocalizeTemplateService; @Autowired - private EarthSurveyService earthSurveyService; - - @Autowired - private CodeEditorHandlerThread codeEditorHandlerThread; - - private final ArrayList drivers = new ArrayList<>(); - private final Logger logger = LoggerFactory.getLogger(BrowserService.class); - private static final String TEMPLATE_FOR_DGMAP_JS = "resources/javascript_dgmap.fmt"; - private static final Configuration cfg = new Configuration(new Version("2.3.23")); - private RemoteWebDriver webDriverBing, webDriverBaidu, webDriverTimelapse, webDriverGeeCodeEditor, - webDriverHere, webDriverStreetView, webDriverYandex, webDriverPlanetHtml, webDriverExtraMap, webDriverSecureWatch, - webDriverGEEMap, webDriverEarthMap; - - - Map locks = new HashMap(); - - private static boolean geeMethodUpdated = false; - - private boolean isClosing = false; - - public void closeBrowsers() { - synchronized (this) { - getClosingBrowsersThread().start(); - } - } - - @Override - public void afterPropertiesSet() throws Exception { - Runtime.getRuntime().addShutdownHook(getClosingBrowsersThread()); - setGeckoDriverPath(); - } - - private RemoteWebDriver chooseDriver() throws BrowserNotFoundException { - RemoteWebDriver driver = null; - final String browserSetInProperties = localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim(); - - if (browserSetInProperties.equalsIgnoreCase(EarthConstants.CHROME_BROWSER)) { - driver = tryStartChrome(); - } else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.FIREFOX_BROWSER)) { - driver = tryStartFirefox(); - } else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.EDGE_BROWSER)) { - driver = tryStartEdge(); - }else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.SAFARI_BROWSER)) { - driver = tryStartSafari(); - } - - // If the browser chosen is not installed try to find and installed browser in the computer - if( driver== null ) { - driver = tryStartChrome(); - if( driver== null ) { - driver = tryStartFirefox(); - } - if( driver== null ) { - driver = tryStartEdge(); - } - if( driver== null ) { - driver = tryStartSafari(); - } - } - - if (driver == null) { - throw new BrowserNotFoundException( - "Neither Chrome nor Firefox could be opened. You need to have one of them installed in order to use GEE, Bing Maps or Saiku."); - } - - return driver; - } - - private RemoteWebDriver tryStartFirefox() { - RemoteWebDriver driver = null; - try { - driver = (RemoteWebDriver) WebDriverManager.firefoxdriver().create(); - } catch (final WebDriverException e) { - logger.warn( - "Problem starting Firefox browser!", - e); - } - return driver; - } - - private RemoteWebDriver tryStartEdge() { - RemoteWebDriver driver = null; - try { - driver = (RemoteWebDriver) WebDriverManager.edgedriver().create(); - } catch (final WebDriverException e) { - logger.warn( - "Problem starting Edge browser", - e); - } - return driver; - } - - private RemoteWebDriver tryStartSafari() { - RemoteWebDriver driver = null; - try { - driver = (RemoteWebDriver) WebDriverManager.safaridriver().create(); - } catch (final WebDriverException e) { - logger.warn( - "Problem starting Safari browser", - e); - } - return driver; - } - - private RemoteWebDriver tryStartChrome() { - RemoteWebDriver driver = null; - try { - driver = (RemoteWebDriver) WebDriverManager.chromedriver().create(); - } catch (final Exception e) { - logger.warn( - "Problem starting Chrome browser", - e); - } - return driver; - } - + private LocalPropertiesService localPropertiesService; - private String getDGMapJavascript(SimplePlacemarkObject placemarkObject) { - final Map data = geoLocalizeTemplateService.getPlacemarkData(placemarkObject); - data.put("latitude", placemarkObject.getCoord().getLatitude()); - data.put("longitude", placemarkObject.getCoord().getLongitude()); - return processJavascriptTemplate(data, TEMPLATE_FOR_DGMAP_JS); + public boolean isCodeEditorShowing() { + return BrowserService.isCssElementPresent(RUN_SCRIPT_BUTTON, webDriverGee); } - private String processJavascriptTemplate(final Map data, String templateName) { - Writer out; - String result = null; - try (StringWriter fw = new StringWriter();) { - // Load template from source folder - cfg.setTemplateLoader(new FileTemplateLoader(new File(System.getProperty("user.dir")))); - final Template template = cfg.getTemplate(templateName); + public void runScript() throws IOException, URISyntaxException, InterruptedException { - // Console output - out = new BufferedWriter(fw); - - // Add date to avoid caching - template.process(data, out); - - out.flush(); - - result = fw.toString(); - - } catch (final TemplateException e) { - logger.error("Error when generating the javascript commands", e); - } catch (final IOException e) { - logger.error("Error when reading/writing the template information", e); - } - return result; - } - - private RemoteWebDriver initBrowser() throws BrowserNotFoundException { - RemoteWebDriver driver = null; - driver = chooseDriver(); - if (isClosing) { // In case the browser takes so long to start that the user closes CE and this - // method is called when the other windows are being closed - driver.quit(); - driver = null; - } else { - drivers.add(driver); - } - return driver; - } - - public static boolean isIdOrNamePresent(String elementId, RemoteWebDriver driver) { - boolean found = false; try { - if (driver.findElementById(elementId).isDisplayed() || driver.findElementByName(elementId).isDisplayed()) { - found = true; - } - } catch (final Exception e) { - // Not found - } + WebElement resetButton = webDriverGee.findElementByCssSelector(RESET_SCRIPT_BUTTON); - return found; - } + forceClick( resetButton ); - public static boolean isCssElementPresent(String cssElement, RemoteWebDriver driver) { - boolean found = false; + URL fileWithScript = geoLocalizeTemplateService.getTemporaryUrl(placemarkObject, getGeeCodeEditorTemplate()); - try { - WebElement elementByCssSelector = driver.findElementByCssSelector(cssElement); - found = elementByCssSelector != null; - } catch (final Exception e) { - // Not found - } + WebElement textArea = webDriverGee.findElement(By.className("ace_text-input")); - return found; - } - - private boolean isXPathPresent(String xpath, RemoteWebDriver driver) { - boolean found = false; - - try { - if (driver.findElementByXPath(xpath).isDisplayed()) { - found = true; - } - logger.debug(String.format("Found %s", xpath)); - } catch (final Exception e) { - logger.debug(String.format("Not Found %s", xpath)); - } + String contents = FileUtils.readFileToString(new File(fileWithScript.toURI()), StandardCharsets.UTF_8 ); - return found; - } + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { + sendThroughKeys(textArea, contents); - private boolean loadPlotInDGMap(SimplePlacemarkObject placemarkObject, RemoteWebDriver driver) { - - boolean success = true; - if (driver != null && waitFor("mainContent", driver) && driver instanceof JavascriptExecutor) { - try { - String dgmapJs = getDGMapJavascript(placemarkObject); - driver.executeScript(dgmapJs); + } else { + sendThroughClipboard(textArea, contents); + try { + // Fix bug provoked by antivirus not accepting the control characters sent by Selenium + WebElement element = webDriverGee.findElement(By.className("ace_line") ); + if( element!= null && element.getAttribute("value").trim().equals("av") ) { + sendThroughKeys(textArea, contents); + } + } catch (Exception e) { + logger.warn("Error while refreshing code editor", e); - Thread.sleep( 1000 ); - // Unlock the view if it is locked - if( isCssElementPresent(".lock.on", driver) ) { - driver.findElementByCssSelector(".lock.on").click(); // UNLOCK } - - } catch (final Exception e) { - processSeleniumError(e); - success = false; - } - } - return success; - } - - public void clickOnElements(RemoteWebDriver driver, String cssSelector) { - final List dataLayerVisibility = driver.findElementsByCssSelector(cssSelector); - for (final WebElement webElement : dataLayerVisibility) { - if (webElement.isDisplayed()) { - webElement.click(); } - } - } - - public static boolean isGeeMethodUpdated() { - return geeMethodUpdated; - } - public static void setGeeMethodUpdated(boolean geeMethosUpdated) { - BrowserService.geeMethodUpdated = geeMethosUpdated; - } - - private void processSeleniumError(final Exception e) { - if (e.getCause() != null && e.getCause().getMessage() != null - && !e.getCause().getMessage().contains("latitude")) { - logger.warn("Error in the selenium driver", e); - } else { - logger.info("Error in the selenium driver provoked by known bug", e); - } - } - - public RemoteWebDriver navigateTo(String url, RemoteWebDriver driver) throws BrowserNotFoundException { - return navigateTo(url, driver, true); - } - - /** - * Loads the given URL into the browser. If the browser is null then a new - * browser window is open. - * - * @param url - * The URL to load. - * @param driverParam - * The browser window to use. If this value is null a new browser - * window is open. - * @param retry - * Specify if there should be a second try to open a browser window - * if the first time fails (useful if the browser could not be found) - * @return The browser window (firefox or chrome depending on the configuration) - * used to open the URL. - * @throws BrowserNotFoundException - * Exception thrown when there is no Firefox/Chrome installed - */ - public RemoteWebDriver navigateTo(String url, RemoteWebDriver driverParam, boolean retry) - throws BrowserNotFoundException { - - RemoteWebDriver driver = driverParam; - - if (driver == null || !isDriverWorking(driver)) { - driver = initBrowser(); - } - - if (driver != null) { + Thread.sleep(1000); + WebElement runButton = webDriverGee.findElementByCssSelector(RUN_SCRIPT_BUTTON); + forceClick( runButton ); + } catch (NoSuchElementException e) { try { - driver.navigate().to(url); - } catch (final Exception e) { - if (retry && (e.getCause() != null && e.getCause().getMessage() != null - && e.getCause().getMessage().contains("Session not found"))) { - // Browser closed, restart it! - logger.error("Browser was closed, restaring it...", e); - driver = initBrowser(); - navigateTo(url, driver, false); // only try to re-open one - } + // retry + Thread.sleep(1000); + WebElement runButton = webDriverGee.findElementByCssSelector(RUN_SCRIPT_BUTTON); + forceClick( runButton ); + }catch (Exception e2) { + // TODO: handle exception } - } else { - logger.error("No Selenium driver available, Is Firefox or Chrome installed?"); } - return driver; - } - protected boolean isDriverWorking(RemoteWebDriver driver) { - boolean stillWorking = true; - try { - driver.findElement(By.xpath("//body")); - } catch (Exception e) { - stillWorking = false; - } - return stillWorking; } - /** - * Opens a browser window with the Bing Maps representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openBingMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("BING"); - synchronized (lock) { - if (localPropertiesService.isBingMapsSupported()) { - try { - webDriverBing = navigateTo(geoLocalizeTemplateService - .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_BING_HTML_TEMPLATE, - "bingMapsKey", localPropertiesService.getValue(EarthProperty.BING_MAPS_KEY)) - .toString(), webDriverBing); - } catch (final Exception e) { - logger.error("Problems loading Bing", e); - } - } - } - } - - private Object getLock(String key) { - String lock = locks.get(key); - if( lock !=null ) { - return lock; - }else{ - locks.put(key, key); - return key; + private void sendThroughClipboard(WebElement textArea, String contents) { + Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); + StringSelection clipboardtext = new StringSelection(contents); + clipboard.setContents(clipboardtext, null); + Keys controlChar = Keys.CONTROL; + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { + controlChar = Keys.COMMAND; } + textArea.sendKeys(Keys.chord(controlChar, "a")); + textArea.sendKeys(Keys.chord(controlChar, "v")); } - /** - * Opens a browser window with the Planet Basemaps representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openPlanetMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("PLANET"); - synchronized (lock) { - if (localPropertiesService.isPlanetMapsSupported()) { - - boolean monthly = localPropertiesService.isPlanetMapsMonthlyOpen(); + private void sendThroughKeys(WebElement textArea, String contents) + throws InterruptedException { + // Command key (apple key) is not working on Chrome on Mac. Try with the right click + // This is not going to be fixed by Selenium - String template = monthly ? GeolocalizeMapService.FREEMARKER_PLANET_NICFI_ARGUMENTS : GeolocalizeMapService.FREEMARKER_PLANET_DAILY_HTML_TEMPLATE; - String key = monthly ? localPropertiesService.getValue( EarthProperty.PLANET_MAPS_CE_KEY ) : localPropertiesService.getValue( EarthProperty.PLANET_MAPS_KEY ); + // Remove comments so it is faster to send the text! + String noComments = removeComments(contents); - try { - - String processTemplate = geoLocalizeTemplateService.getUrlToFreemarkerOutput( - placemarkObject, - template, - "planetMapsKey", - key, - "urlPlanetEndpointPrefix", - ServerController.getHostAddress(localPropertiesService.getHost(),localPropertiesService.getPort()) - ).toString(); - - String urlPlanet = null; - if( monthly ) { + // Clear the code area + WebElement clearButton = webDriverGee.findElementByCssSelector(RESET_SCRIPT_BUTTON); + forceClick( clearButton ); - String parameters = FileUtils.readFileToString( new File( new URI( processTemplate ) ) , StandardCharsets.UTF_8 ); + StringBuilder fixedScriptForMac = new StringBuilder(); + String[] lines = noComments.split("\\n"); + for (String line : lines) { + // Send the content of the script + String trimmedLine = line.trim(); - // remove new lines - parameters = parameters.replace("\n", "").replace("\r", "").replace("\t", "").replace(" ", ""); - // remove trailing commas - parameters = parameters.replace(",],", "],").replace("],]", "]]"); - - urlPlanet = localPropertiesService.getValue( EarthProperty.PLANET_NICFI_URL ) + parameters; - }else { - urlPlanet = processTemplate; - } + // Add Spaces after "{" so we avoid the automatic closing of the method by GEE + // Playground JS + trimmedLine = trimmedLine.replace("{", "{ "); - webDriverPlanetHtml = navigateTo( urlPlanet, webDriverPlanetHtml ); - - } catch (final Exception e) { - logger.error("Problems loading Planet", e); - } + if (!StringUtils.isBlank(trimmedLine)) { + fixedScriptForMac = fixedScriptForMac.append(trimmedLine).append("\n"); } } - } - /** - * Opens a browser window with the Baidu Maps representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openBaiduMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("BAIDU"); - synchronized (lock) { - if (localPropertiesService.isBaiduMapsSupported()) { - - try { - webDriverBaidu = navigateTo(geoLocalizeTemplateService - .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_BAIDU_HTML_TEMPLATE) - .toString(), webDriverBaidu); - } catch (final Exception e) { - logger.error("Problems loading Baidu", e); - } - } - } - } - - /** - * Opens a browser window with the Yandex Maps representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openYandexMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("YANDEX"); - synchronized (lock) { - if (localPropertiesService.isYandexMapsSupported()) { - try { - webDriverYandex = navigateTo(geoLocalizeTemplateService.getUrlToFreemarkerOutput(placemarkObject, - GeolocalizeMapService.FREEMARKER_YANDEX_HTML_TEMPLATE).toString(), webDriverYandex); - } catch (final Exception e) { - logger.error("Problems loading Yandex", e); + fixedScriptForMac.append("//THE END"); // Don't remove this!!! this way we mark the point where there should be no trailing character removal + Keys controlChar = Keys.CONTROL; + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { + controlChar = Keys.COMMAND; + } + textArea.sendKeys(Keys.chord(controlChar, "a")); + textArea.sendKeys(fixedScriptForMac); +/* + Thread.sleep(500); + // Fix the extra characters added by removing the last 10 chars ( this is a bug from Selenium! ) + textArea.sendKeys(Keys.PAGE_DOWN); + Thread.sleep(500); + textArea.sendKeys(Keys.PAGE_DOWN); + */ + } + + private void forceClick( WebElement element ) { + JavascriptExecutor js = webDriverGee; + js.executeScript("arguments[0].click();", element); + } + + public String removeComments(String contents) { + + String wholeCode = contents; + wholeCode = wholeCode.replace("http://", ""); + wholeCode = wholeCode.replace("https://", ""); + wholeCode = wholeCode.replace("\r", ""); + + StringBuilder noComments = new StringBuilder(""); + int indexComments = contents.indexOf("//"); + if (indexComments != -1) { + while (indexComments >= 0) { + int endOfLine = contents.indexOf('\n', indexComments); + if (endOfLine != -1) + indexComments = contents.indexOf("//", endOfLine + 2); + else { + break; } - } - } - } - /** - * Opens a browser window with a map representation of the plot in SecureWatch. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openSecureWatch(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("SECUREWATCH"); - synchronized (lock) { - if ( localPropertiesService.isSecureWatchSupported() ) { - String url = getUrlBaseIntegration(placemarkObject, localPropertiesService.getSecureWatchURL() + "/#18/LATITUDE/LONGITUDE" ); - webDriverSecureWatch = navigateTo(url, webDriverSecureWatch); - try { - logger.warn("Loading layers - {}", placemarkObject); - loadPlotInDGMap(placemarkObject, webDriverSecureWatch); - } catch (final Exception e) { - logger.error("Error when opening Secure Watch browser window", e); - } + if (indexComments != -1) + noComments = noComments.append(contents.substring(endOfLine, indexComments)); + else + noComments = noComments.append(contents.substring(endOfLine)); } + return noComments.toString(); + } else { + return wholeCode; } } /** - * Opens a browser window with a map representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found + * Get the GEE Playground script that should be used. There is an standard one + * that resides in resources/eePlaygroundScript.fmt but a project might have its + * own script. * + * @return The generic script in the resources folder or the file called + * eePlaygroundScript.fmt in the same folder where the current project + * file resides */ - public void openExtraMap(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("EXTRA"); - synchronized (lock) { - if (!StringUtils.isBlank(localPropertiesService.getExtraMap())) { - webDriverExtraMap = navigateTo( getUrlBaseIntegration(placemarkObject, localPropertiesService.getExtraMap() ) , webDriverExtraMap ); - } - } - } + private String getGeeCodeEditorTemplate() { - private String getUrlBaseIntegration(SimplePlacemarkObject placemarkObject, String url) { - String temp = null; - try { - String latitude = placemarkObject.getCoord().getLatitude(); - String longitude = placemarkObject.getCoord().getLongitude(); - String id = placemarkObject.getPlacemarkId().split(",")[0]; // for cases where ID also has round, then - // the id string would be something like - // "plotId,round", we only want the ID - - temp = url.replace("LATITUDE", latitude).replace("LONGITUDE", longitude).replace("PLOT_ID", id); - - } catch (final Exception e) { - logger.error("Problems Getting the URL filling for " + url, e); + String projectPlaygroundScript = getProjectGeeScript(); + if (projectPlaygroundScript != null) { + return projectPlaygroundScript; + } else { + return GeolocalizeMapService.FREEMARKER_GEE_CODE_EDITOR_TEMPLATE; // New format name since version 1.6.20 } - return temp; - } - /** - * Opens a browser window with the Google Street View representation of the - * plot. - * https://www.google.com/maps/@43.7815661,11.1484876,3a,75y,210.23h,82.32t/data=!3m6!1e1!3m4!1sEz7NiCbaIYzTJkP_RMBiqw!2e0!7i13312!8i6656?hl=en - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openStreetView(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("STREET_VIEW"); - synchronized (lock) { - if (localPropertiesService.isStreetViewSupported()) { - try { - webDriverStreetView = navigateTo( - geoLocalizeTemplateService.getUrlToFreemarkerOutput(placemarkObject, - GeolocalizeMapService.FREEMARKER_STREET_VIEW_HTML_TEMPLATE, "googleMapsApiKey", - localPropertiesService.getValue(EarthProperty.GOOGLE_MAPS_API_KEY)).toString(), - webDriverStreetView); - } catch (final Exception e) { - logger.error("Problems loading Street View", e); - } - } - } } /** - * Opens a browser window with the Here Maps representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * + * @return The path to the GEE Code Editor generic script or the one that is + * specified in the project folder if it exists. */ - public void openHereMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("HERE"); - synchronized (lock) { - if (localPropertiesService.isHereMapsSupported()) { - try { - webDriverHere = navigateTo(geoLocalizeTemplateService - .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_HERE_HTML_TEMPLATE, - "hereAppId", localPropertiesService.getValue(EarthProperty.HERE_MAPS_APP_ID), - "hereAppCode", localPropertiesService.getValue(EarthProperty.HERE_MAPS_APP_CODE)) - .toString(), webDriverHere); - } catch (final Exception e) { - logger.error("Problems loading Here Maps", e); - } - - } - } - } - - private StringBuilder getGeoJsonSegment(List coordinates) { - StringBuilder geoJson = new StringBuilder("["); - if (coordinates != null) { - for (SimpleCoordinate coord : coordinates) { - geoJson = geoJson.append("[").append(coord.getLongitude()).append(",").append(coord.getLatitude()) - .append("],"); - } - // remove last character - geoJson = geoJson.deleteCharAt(geoJson.length() - 1); - } - geoJson = geoJson.append("],"); - return geoJson; - } - - + private String getProjectGeeScript() { + // Is there a "eePlaygroundScript.fmt" file in the same folder than in the + // metadata file folder? + File projectGeePlayground = new File(localPropertiesService.getProjectFolder() + File.separatorChar + + GeolocalizeMapService.FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME); + // Is there a "eeCodeEditorScript.fmt" file in the same folder than in the + // metadata file folder? NEW NAME AFTER 12/2017!!! + File projectGeeCodeEditor = new File(localPropertiesService.getProjectFolder() + File.separatorChar + + GeolocalizeMapService.FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME); - private String getFeature(SimplePlacemarkObject placemarkObject, String shapeType, String name ) { - StringBuilder feature = new StringBuilder("{\"type\":\"Feature\",\"properties\":{\"name\":\"").append( name).append("\"},\"geometry\":"); - feature= feature.append( getGeoJson(placemarkObject, shapeType )).append("}"); - return feature.toString(); - } - - private String getGeoJson(SimplePlacemarkObject placemarkObject, String shapeType ) { - - StringBuilder geoJson = new StringBuilder("{\"type\":\"" ).append( shapeType).append("\",\"coordinates\":["); - List shape = placemarkObject.getShape(); - geoJson = geoJson.append(getGeoJsonSegment(shape)); - geoJson = geoJson.deleteCharAt(geoJson.length() - 1); - geoJson = geoJson.append("]}"); - return geoJson.toString(); - } - - /** - * Opens a browser window with the Google Earth Engine Code Editor and runs the - * freemarker template found in resources/eeCodeEditorScript.fmt on the main - * editor of GEE. - * - * @param placemarkObject - * The center point of the plot. - * @throws BrowserNotFoundException - * If the browser cannot be found - * - */ - public void openGEEAppURL(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("GEEAPP"); - synchronized (lock) { - if (localPropertiesService.isGEEAppSupported()) { - - try { - StringBuilder url = new StringBuilder(localPropertiesService.getGEEAppURL()); - url = url.append("#geoJson=") - .append(URLEncoder.encode(getGeoJson(placemarkObject, "MultiLineString"), StandardCharsets.UTF_8.toString())) - .append(";"); - url = url.append("plotId=") - .append(URLEncoder.encode(placemarkObject.getPlacemarkId(), StandardCharsets.UTF_8.toString())) - .append(";"); - url = url.append("survey=") - .append(URLEncoder.encode( earthSurveyService.getCollectSurvey().getName() , StandardCharsets.UTF_8.toString())) - .append(";"); - webDriverGEEMap = navigateTo(url.toString(), webDriverGEEMap); - webDriverGEEMap.navigate().refresh(); // FORCE REFRESH - OTHERWISE WINDOW IS NOT REFRESHED FOR SOME STRANGE REASON - } catch (final Exception e) { - logger.error("Problems loading GEE APP window", e); - } - } + String geeFilePath = null; + if (projectGeeCodeEditor.exists()) { // The new format name takes precedence + geeFilePath = projectGeeCodeEditor.getAbsolutePath(); + } else if (projectGeePlayground.exists()) { + geeFilePath = projectGeePlayground.getAbsolutePath(); } + return geeFilePath; } - - public void openEarthMapURL(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("EARTH_MAP"); - synchronized (lock) { - if (localPropertiesService.isEarthMapSupported()) { - - - try { - StringBuilder url = new StringBuilder(localPropertiesService.getEarthMapURL()).append("?"); - url = url.append("polygon=") - .append(URLEncoder.encode(getFeature(placemarkObject, "Polygon", placemarkObject.getPlacemarkId()), StandardCharsets.UTF_8.toString())) - .append("&"); - - if( StringUtils.isNotBlank(localPropertiesService.getEarthMapLayers()) ) { - url = url.append("layers=") - .append(URLEncoder.encode(localPropertiesService.getEarthMapLayers(), StandardCharsets.UTF_8.toString())) - .append("&"); - } - - if( StringUtils.isNotBlank(localPropertiesService.getEarthMapScripts()) ) { - url = url.append("scripts=") - .append(URLEncoder.encode(localPropertiesService.getEarthMapScripts(), StandardCharsets.UTF_8.toString())) - .append("&"); - } - - String aoi = localPropertiesService.getEarthMapAOI(); - if( StringUtils.isBlank(aoi) ) { - aoi = "global"; - } - url = url.append("aoi=") - .append(URLEncoder.encode( aoi, StandardCharsets.UTF_8.toString() )) - .append("&embed=true"); // Set the EMBED parameter to true so that the user does not need to log in. - - webDriverEarthMap = navigateTo(url.toString(), webDriverEarthMap); - //Desktop.getDesktop().browse( new URI( url.toString() ) ); - //webDriverEarthMap.navigate().refresh(); // FORCE REFRESH - OTHERWISE WINDOW IS NOT REFRESHED FOR SOME STRANGE REASON - } catch (final Exception e) { - logger.error("Problems loading Earth Map window", e); - } - } - } + public void loadCodeEditorScript(SimplePlacemarkObject placemarkObject, RemoteWebDriver webDriverGeePlayground) { + this.placemarkObject = placemarkObject; + loadCodeEditorScript(webDriverGeePlayground); } - /** - * Opens a browser window with the Google Earth Engine Code Editor and runs the - * freemarker template found in resources/eeCodeEditorScript.fmt on the main - * editor of GEE. - * - * @param placemarkObject - * The center point of the plot. - * @throws BrowserNotFoundException - * If the browser cannot be found - * - */ - public void openGEECodeEditor(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("CODE_EDITOR"); - synchronized (lock) { - if (localPropertiesService.isCodeEditorSupported()) { - - boolean firstOpening = false; - if (getWebDriverGeeCodeEditor() == null) { - setWebDriverGeeCodeEditor(initBrowser()); - firstOpening = true; + public void disableCodeEditorAutocomplete(RemoteWebDriver webDriverCodeEditor) { + this.webDriverGee = webDriverCodeEditor; + try { + if (!isCodeEditorShowing()) { + // Open GEE Playground + if (!browserService.isDriverWorking(webDriverGee) || webDriverGee.getCurrentUrl() == null + || !webDriverGee.getCurrentUrl().contains("google")) { + webDriverGee = browserService.navigateTo(localPropertiesService.getGeePlaygoundUrl(), webDriverGee); + browserService.setWebDriverGeeCodeEditor(webDriverGee); } - if (firstOpening && (liquibase.repackaged.org.apache.commons.lang3.SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX)) { - codeEditorHandlerThread.disableCodeEditorAutocomplete(getWebDriverGeeCodeEditor()); + // Initially the login page appears! + while (!isCodeEditorShowing()) { // 5 minutes a 2 seconds == 30 * 5 = 150 + Thread.sleep(2000); } - codeEditorHandlerThread.loadCodeEditorScript(placemarkObject, getWebDriverGeeCodeEditor()); - } - } - } - - - /** - * Opens a browser window with the Google Earth Engine Timelapse representation - * of the plot. - * - * @param placemarkObject - * The center point of the plot. - * @throws BrowserNotFoundException - * If the browser cannot be found - * - */ - public void openTimelapse(final SimplePlacemarkObject placemarkObject) - throws BrowserNotFoundException { - Object lock = getLock("TIMELAPSE"); - synchronized (lock) { - if (localPropertiesService.isTimelapseSupported()) { - try { - String coordinates = placemarkObject.getCoord().toString(); - webDriverTimelapse = navigateTo( - "https://earthengine.google.org/timelapse/timelapseplayer_v2.html?timelapseclient=http://earthengine.google.org/timelapse/data&v=" - + coordinates + ",10.812,latLng&t=0.08", - webDriverTimelapse); - } catch (final Exception e) { - logger.error("Problems loading Timelapse", e); - } - } - } - } - - private void setGeckoDriverPath() { - String geckoDriverPath = ""; - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { - geckoDriverPath = "resources/geckodriver_mac"; - } else if (SystemUtils.IS_OS_UNIX) { - if (System.getProperty("os.arch").contains("64") - || System.getProperty("sun.arch.data.model").equals("64")) { - geckoDriverPath = "resources/geckodriver_64"; } else { - geckoDriverPath = "resources/geckodriver_32"; + disableAutoComplete(); } - } else if (SystemUtils.IS_OS_WINDOWS) { - try { - if (System.getProperty("os.arch").contains("64") - || System.getProperty("sun.arch.data.model").equals("64")) - geckoDriverPath = "resources/geckodriver_64.exe"; - else - geckoDriverPath = "resources/geckodriver_32.exe"; - } catch (Exception e) { - geckoDriverPath = "resources/geckodriver_64.exe"; - } - } else { - throw new IllegalArgumentException("Geckodriver is not supported in the current OS"); - } - - File geckoDriverFile = new File(geckoDriverPath); - // if above property is not working or not opening the application in browser - // then try below property - System.setProperty(GeckoDriverService.GECKO_DRIVER_EXE_PROPERTY, geckoDriverFile.getAbsolutePath()); - System.setProperty(FirefoxDriver.SystemProperty.DRIVER_USE_MARIONETTE, "true"); - - } - - public boolean waitFor(String elementId, RemoteWebDriver driver) { - int i = 0; - while (!isIdOrNamePresent(elementId, driver)) { - try { - Thread.sleep(1000); - } catch (final InterruptedException e) { - return false; - } - i++; - if (i > 60) { - return false; - } + } catch (final NoSuchElementException e) { + // This is a well known exception. Down-grade if to warning + logger.warn("Error when opening Earth Engine browser window. Known problem", e); + } catch (final Exception e) { + // This is a well known exception. + logger.error("Error when opening Earth Engine browser window", e); } - return true; } - public boolean waitForXPath(String xpath, RemoteWebDriver driver) { - int i = 0; - while (!isXPathPresent(xpath, driver)) { - try { - Thread.sleep(1000); - } catch (final InterruptedException e) { - return false; + private void disableAutoComplete() { + // Display the settings in Google Earth Engine Code Editor (this emulates + // clicking on the settings icon) + webDriverGee.findElementByClassName("settings-menu-button").click(); + // Get the Div that is the parent of the one with text that contains + // Autocomplete + RemoteWebElement autocompleteButton = (RemoteWebElement) webDriverGee + .findElementByXPath("//div[contains(text(), \"Autocomplete\")]/.."); - } - i++; - if (i > 30) { - return false; - } + if (isAutocompleChecked(autocompleteButton)) { + // Disable the Autocomplete of special characters + autocompleteButton.click(); } - return true; + } - private Thread getClosingBrowsersThread() { + public boolean isAutocompleChecked(RemoteWebElement autocompleteButton) { + String buttonChecked = autocompleteButton.getAttribute("aria-checked"); + return buttonChecked.equals("true"); + } - return new Thread("Quit the open browsers") { + private void loadCodeEditorScript(RemoteWebDriver webDriverCodeEditor) { + this.webDriverGee = webDriverCodeEditor; + Thread loadGee = new Thread( + "Opening GEE Playground " + (placemarkObject != null ? placemarkObject.toString() : "")) { @Override public void run() { - isClosing = true; - CopyOnWriteArrayList driversCopy = new CopyOnWriteArrayList<>(drivers); - for (Iterator iterator = driversCopy.iterator(); iterator.hasNext();) { - RemoteWebDriver remoteWebDriver = iterator.next(); - try { - remoteWebDriver.quit(); - } catch (final Exception e) { - logger.error("Error quitting the browser", e); + try { + if (!isCodeEditorShowing()) { + // Open GEE Code Editor + if (!browserService.isDriverWorking(webDriverGee) || webDriverGee.getCurrentUrl() == null + || !webDriverGee.getCurrentUrl().contains("google")) { + webDriverGee = browserService.navigateTo(localPropertiesService.getGeePlaygoundUrl(), + webDriverGee); + browserService.setWebDriverGeeCodeEditor(webDriverGee); + } + // Initially the login page appears! + while (!isCodeEditorShowing()) { + sleep(2000); + } } + runScript(); + } catch (final NoSuchElementException e) { + // This is a well known exception. Down-grade if to warning + logger.warn("Error when opening Earth Engine browser window. Known problem", e); + } catch (final Exception e) { + // This is a well known exception. + logger.error("Error when opening Earth Engine browser window", e); } - } }; + loadGee.start(); } - - @Override - public void update(Observable o, Object arg) { - if (ServerInitializationEvent.SERVER_STOPPED_EVENT.equals(arg)) { - this.closeBrowsers(); - } - } - - private RemoteWebDriver getWebDriverGeeCodeEditor() { - return webDriverGeeCodeEditor; - } - - protected void setWebDriverGeeCodeEditor(RemoteWebDriver webDriverGeeCodeEditor) { - this.webDriverGeeCodeEditor = webDriverGeeCodeEditor; - } - } From 15245c7988dfa5c01e1ffcc28c5070689a89ec81 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:43 +0100 Subject: [PATCH 0127/1620] New translations CodeEditorHandlerThread.java (Spanish) --- .../earth/app/view/Messages_es.properties | 1012 ++++------------- 1 file changed, 211 insertions(+), 801 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 5a933d094d..c2259f5db0 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,909 +1,319 @@ package org.openforis.collect.earth.app.service; -import java.io.BufferedWriter; +import java.awt.Toolkit; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.StringSelection; import java.io.File; import java.io.IOException; -import java.io.StringWriter; -import java.io.Writer; -import java.net.URI; -import java.net.URLEncoder; +import java.net.URISyntaxException; +import java.net.URL; import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Observable; -import java.util.Observer; -import java.util.concurrent.CopyOnWriteArrayList; +import java.util.NoSuchElementException; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.desktop.ServerController; -import org.openforis.collect.earth.app.desktop.ServerController.ServerInitializationEvent; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.sampler.model.SimpleCoordinate; import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; import org.openqa.selenium.By; import org.openqa.selenium.JavascriptExecutor; -import org.openqa.selenium.WebDriverException; +import org.openqa.selenium.Keys; import org.openqa.selenium.WebElement; -import org.openqa.selenium.firefox.FirefoxDriver; -import org.openqa.selenium.firefox.GeckoDriverService; import org.openqa.selenium.remote.RemoteWebDriver; +import org.openqa.selenium.remote.RemoteWebElement; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import freemarker.cache.FileTemplateLoader; -import freemarker.template.Configuration; -import freemarker.template.Template; -import freemarker.template.TemplateException; -import freemarker.template.Version; -import io.github.bonigarcia.wdm.WebDriverManager; import liquibase.repackaged.org.apache.commons.lang3.SystemUtils; -/** - * This class contains methods that allow Collect Earth to open browser windows - * that allow the user to have a better understanding of the plot. So far there - * are integrations with Google Earth Engine, Google Earth Engine Timelapse and - * Bing Maps. When a user clicks on a plot Collect Earth will check if the - * program is set to open any of these integrations, and if it is so it will - * open each one in its own window. These windows are closed when the program - * is closed. - *s - * @author Alfonso Sanchez-Paus Diaz - * - */ + @Component -public class BrowserService implements InitializingBean, Observer { +public class CodeEditorHandlerThread { + private static final String RUN_SCRIPT_BUTTON = "button.run-button"; + private static final String RESET_SCRIPT_BUTTON = "button.reset-button"; + private SimplePlacemarkObject placemarkObject; + private RemoteWebDriver webDriverGee; @Autowired - private LocalPropertiesService localPropertiesService; + private BrowserService browserService; + private Logger logger = LoggerFactory.getLogger(CodeEditorHandlerThread.class); @Autowired private GeolocalizeMapService geoLocalizeTemplateService; @Autowired - private EarthSurveyService earthSurveyService; - - @Autowired - private CodeEditorHandlerThread codeEditorHandlerThread; - - private final ArrayList drivers = new ArrayList<>(); - private final Logger logger = LoggerFactory.getLogger(BrowserService.class); - private static final String TEMPLATE_FOR_DGMAP_JS = "resources/javascript_dgmap.fmt"; - private static final Configuration cfg = new Configuration(new Version("2.3.23")); - private RemoteWebDriver webDriverBing, webDriverBaidu, webDriverTimelapse, webDriverGeeCodeEditor, - webDriverHere, webDriverStreetView, webDriverYandex, webDriverPlanetHtml, webDriverExtraMap, webDriverSecureWatch, - webDriverGEEMap, webDriverEarthMap; - - - Map locks = new HashMap(); - - private static boolean geeMethodUpdated = false; - - private boolean isClosing = false; - - public void closeBrowsers() { - synchronized (this) { - getClosingBrowsersThread().start(); - } - } - - @Override - public void afterPropertiesSet() throws Exception { - Runtime.getRuntime().addShutdownHook(getClosingBrowsersThread()); - setGeckoDriverPath(); - } - - private RemoteWebDriver chooseDriver() throws BrowserNotFoundException { - RemoteWebDriver driver = null; - final String browserSetInProperties = localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim(); - - if (browserSetInProperties.equalsIgnoreCase(EarthConstants.CHROME_BROWSER)) { - driver = tryStartChrome(); - } else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.FIREFOX_BROWSER)) { - driver = tryStartFirefox(); - } else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.EDGE_BROWSER)) { - driver = tryStartEdge(); - }else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.SAFARI_BROWSER)) { - driver = tryStartSafari(); - } - - // If the browser chosen is not installed try to find and installed browser in the computer - if( driver== null ) { - driver = tryStartChrome(); - if( driver== null ) { - driver = tryStartFirefox(); - } - if( driver== null ) { - driver = tryStartEdge(); - } - if( driver== null ) { - driver = tryStartSafari(); - } - } - - if (driver == null) { - throw new BrowserNotFoundException( - "Neither Chrome nor Firefox could be opened. You need to have one of them installed in order to use GEE, Bing Maps or Saiku."); - } - - return driver; - } - - private RemoteWebDriver tryStartFirefox() { - RemoteWebDriver driver = null; - try { - driver = (RemoteWebDriver) WebDriverManager.firefoxdriver().create(); - } catch (final WebDriverException e) { - logger.warn( - "Problem starting Firefox browser!", - e); - } - return driver; - } - - private RemoteWebDriver tryStartEdge() { - RemoteWebDriver driver = null; - try { - driver = (RemoteWebDriver) WebDriverManager.edgedriver().create(); - } catch (final WebDriverException e) { - logger.warn( - "Problem starting Edge browser", - e); - } - return driver; - } - - private RemoteWebDriver tryStartSafari() { - RemoteWebDriver driver = null; - try { - driver = (RemoteWebDriver) WebDriverManager.safaridriver().create(); - } catch (final WebDriverException e) { - logger.warn( - "Problem starting Safari browser", - e); - } - return driver; - } - - private RemoteWebDriver tryStartChrome() { - RemoteWebDriver driver = null; - try { - driver = (RemoteWebDriver) WebDriverManager.chromedriver().create(); - } catch (final Exception e) { - logger.warn( - "Problem starting Chrome browser", - e); - } - return driver; - } - + private LocalPropertiesService localPropertiesService; - private String getDGMapJavascript(SimplePlacemarkObject placemarkObject) { - final Map data = geoLocalizeTemplateService.getPlacemarkData(placemarkObject); - data.put("latitude", placemarkObject.getCoord().getLatitude()); - data.put("longitude", placemarkObject.getCoord().getLongitude()); - return processJavascriptTemplate(data, TEMPLATE_FOR_DGMAP_JS); + public boolean isCodeEditorShowing() { + return BrowserService.isCssElementPresent(RUN_SCRIPT_BUTTON, webDriverGee); } - private String processJavascriptTemplate(final Map data, String templateName) { - Writer out; - String result = null; - try (StringWriter fw = new StringWriter();) { - // Load template from source folder - cfg.setTemplateLoader(new FileTemplateLoader(new File(System.getProperty("user.dir")))); - final Template template = cfg.getTemplate(templateName); + public void runScript() throws IOException, URISyntaxException, InterruptedException { - // Console output - out = new BufferedWriter(fw); - - // Add date to avoid caching - template.process(data, out); - - out.flush(); - - result = fw.toString(); - - } catch (final TemplateException e) { - logger.error("Error when generating the javascript commands", e); - } catch (final IOException e) { - logger.error("Error when reading/writing the template information", e); - } - return result; - } - - private RemoteWebDriver initBrowser() throws BrowserNotFoundException { - RemoteWebDriver driver = null; - driver = chooseDriver(); - if (isClosing) { // In case the browser takes so long to start that the user closes CE and this - // method is called when the other windows are being closed - driver.quit(); - driver = null; - } else { - drivers.add(driver); - } - return driver; - } - - public static boolean isIdOrNamePresent(String elementId, RemoteWebDriver driver) { - boolean found = false; try { - if (driver.findElementById(elementId).isDisplayed() || driver.findElementByName(elementId).isDisplayed()) { - found = true; - } - } catch (final Exception e) { - // Not found - } + WebElement resetButton = webDriverGee.findElementByCssSelector(RESET_SCRIPT_BUTTON); - return found; - } + forceClick( resetButton ); - public static boolean isCssElementPresent(String cssElement, RemoteWebDriver driver) { - boolean found = false; + URL fileWithScript = geoLocalizeTemplateService.getTemporaryUrl(placemarkObject, getGeeCodeEditorTemplate()); - try { - WebElement elementByCssSelector = driver.findElementByCssSelector(cssElement); - found = elementByCssSelector != null; - } catch (final Exception e) { - // Not found - } + WebElement textArea = webDriverGee.findElement(By.className("ace_text-input")); - return found; - } - - private boolean isXPathPresent(String xpath, RemoteWebDriver driver) { - boolean found = false; - - try { - if (driver.findElementByXPath(xpath).isDisplayed()) { - found = true; - } - logger.debug(String.format("Found %s", xpath)); - } catch (final Exception e) { - logger.debug(String.format("Not Found %s", xpath)); - } + String contents = FileUtils.readFileToString(new File(fileWithScript.toURI()), StandardCharsets.UTF_8 ); - return found; - } + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { + sendThroughKeys(textArea, contents); - private boolean loadPlotInDGMap(SimplePlacemarkObject placemarkObject, RemoteWebDriver driver) { - - boolean success = true; - if (driver != null && waitFor("mainContent", driver) && driver instanceof JavascriptExecutor) { - try { - String dgmapJs = getDGMapJavascript(placemarkObject); - driver.executeScript(dgmapJs); + } else { + sendThroughClipboard(textArea, contents); + try { + // Fix bug provoked by antivirus not accepting the control characters sent by Selenium + WebElement element = webDriverGee.findElement(By.className("ace_line") ); + if( element!= null && element.getAttribute("value").trim().equals("av") ) { + sendThroughKeys(textArea, contents); + } + } catch (Exception e) { + logger.warn("Error while refreshing code editor", e); - Thread.sleep( 1000 ); - // Unlock the view if it is locked - if( isCssElementPresent(".lock.on", driver) ) { - driver.findElementByCssSelector(".lock.on").click(); // UNLOCK } - - } catch (final Exception e) { - processSeleniumError(e); - success = false; - } - } - return success; - } - - public void clickOnElements(RemoteWebDriver driver, String cssSelector) { - final List dataLayerVisibility = driver.findElementsByCssSelector(cssSelector); - for (final WebElement webElement : dataLayerVisibility) { - if (webElement.isDisplayed()) { - webElement.click(); } - } - } - - public static boolean isGeeMethodUpdated() { - return geeMethodUpdated; - } - public static void setGeeMethodUpdated(boolean geeMethosUpdated) { - BrowserService.geeMethodUpdated = geeMethosUpdated; - } - - private void processSeleniumError(final Exception e) { - if (e.getCause() != null && e.getCause().getMessage() != null - && !e.getCause().getMessage().contains("latitude")) { - logger.warn("Error in the selenium driver", e); - } else { - logger.info("Error in the selenium driver provoked by known bug", e); - } - } - - public RemoteWebDriver navigateTo(String url, RemoteWebDriver driver) throws BrowserNotFoundException { - return navigateTo(url, driver, true); - } - - /** - * Loads the given URL into the browser. If the browser is null then a new - * browser window is open. - * - * @param url - * The URL to load. - * @param driverParam - * The browser window to use. If this value is null a new browser - * window is open. - * @param retry - * Specify if there should be a second try to open a browser window - * if the first time fails (useful if the browser could not be found) - * @return The browser window (firefox or chrome depending on the configuration) - * used to open the URL. - * @throws BrowserNotFoundException - * Exception thrown when there is no Firefox/Chrome installed - */ - public RemoteWebDriver navigateTo(String url, RemoteWebDriver driverParam, boolean retry) - throws BrowserNotFoundException { - - RemoteWebDriver driver = driverParam; - - if (driver == null || !isDriverWorking(driver)) { - driver = initBrowser(); - } - - if (driver != null) { + Thread.sleep(1000); + WebElement runButton = webDriverGee.findElementByCssSelector(RUN_SCRIPT_BUTTON); + forceClick( runButton ); + } catch (NoSuchElementException e) { try { - driver.navigate().to(url); - } catch (final Exception e) { - if (retry && (e.getCause() != null && e.getCause().getMessage() != null - && e.getCause().getMessage().contains("Session not found"))) { - // Browser closed, restart it! - logger.error("Browser was closed, restaring it...", e); - driver = initBrowser(); - navigateTo(url, driver, false); // only try to re-open one - } + // retry + Thread.sleep(1000); + WebElement runButton = webDriverGee.findElementByCssSelector(RUN_SCRIPT_BUTTON); + forceClick( runButton ); + }catch (Exception e2) { + // TODO: handle exception } - } else { - logger.error("No Selenium driver available, Is Firefox or Chrome installed?"); } - return driver; - } - protected boolean isDriverWorking(RemoteWebDriver driver) { - boolean stillWorking = true; - try { - driver.findElement(By.xpath("//body")); - } catch (Exception e) { - stillWorking = false; - } - return stillWorking; } - /** - * Opens a browser window with the Bing Maps representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openBingMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("BING"); - synchronized (lock) { - if (localPropertiesService.isBingMapsSupported()) { - try { - webDriverBing = navigateTo(geoLocalizeTemplateService - .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_BING_HTML_TEMPLATE, - "bingMapsKey", localPropertiesService.getValue(EarthProperty.BING_MAPS_KEY)) - .toString(), webDriverBing); - } catch (final Exception e) { - logger.error("Problems loading Bing", e); - } - } - } - } - - private Object getLock(String key) { - String lock = locks.get(key); - if( lock !=null ) { - return lock; - }else{ - locks.put(key, key); - return key; + private void sendThroughClipboard(WebElement textArea, String contents) { + Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); + StringSelection clipboardtext = new StringSelection(contents); + clipboard.setContents(clipboardtext, null); + Keys controlChar = Keys.CONTROL; + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { + controlChar = Keys.COMMAND; } + textArea.sendKeys(Keys.chord(controlChar, "a")); + textArea.sendKeys(Keys.chord(controlChar, "v")); } - /** - * Opens a browser window with the Planet Basemaps representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openPlanetMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("PLANET"); - synchronized (lock) { - if (localPropertiesService.isPlanetMapsSupported()) { - - boolean monthly = localPropertiesService.isPlanetMapsMonthlyOpen(); + private void sendThroughKeys(WebElement textArea, String contents) + throws InterruptedException { + // Command key (apple key) is not working on Chrome on Mac. Try with the right click + // This is not going to be fixed by Selenium - String template = monthly ? GeolocalizeMapService.FREEMARKER_PLANET_NICFI_ARGUMENTS : GeolocalizeMapService.FREEMARKER_PLANET_DAILY_HTML_TEMPLATE; - String key = monthly ? localPropertiesService.getValue( EarthProperty.PLANET_MAPS_CE_KEY ) : localPropertiesService.getValue( EarthProperty.PLANET_MAPS_KEY ); + // Remove comments so it is faster to send the text! + String noComments = removeComments(contents); - try { - - String processTemplate = geoLocalizeTemplateService.getUrlToFreemarkerOutput( - placemarkObject, - template, - "planetMapsKey", - key, - "urlPlanetEndpointPrefix", - ServerController.getHostAddress(localPropertiesService.getHost(),localPropertiesService.getPort()) - ).toString(); - - String urlPlanet = null; - if( monthly ) { + // Clear the code area + WebElement clearButton = webDriverGee.findElementByCssSelector(RESET_SCRIPT_BUTTON); + forceClick( clearButton ); - String parameters = FileUtils.readFileToString( new File( new URI( processTemplate ) ) , StandardCharsets.UTF_8 ); + StringBuilder fixedScriptForMac = new StringBuilder(); + String[] lines = noComments.split("\\n"); + for (String line : lines) { + // Send the content of the script + String trimmedLine = line.trim(); - // remove new lines - parameters = parameters.replace("\n", "").replace("\r", "").replace("\t", "").replace(" ", ""); - // remove trailing commas - parameters = parameters.replace(",],", "],").replace("],]", "]]"); - - urlPlanet = localPropertiesService.getValue( EarthProperty.PLANET_NICFI_URL ) + parameters; - }else { - urlPlanet = processTemplate; - } + // Add Spaces after "{" so we avoid the automatic closing of the method by GEE + // Playground JS + trimmedLine = trimmedLine.replace("{", "{ "); - webDriverPlanetHtml = navigateTo( urlPlanet, webDriverPlanetHtml ); - - } catch (final Exception e) { - logger.error("Problems loading Planet", e); - } + if (!StringUtils.isBlank(trimmedLine)) { + fixedScriptForMac = fixedScriptForMac.append(trimmedLine).append("\n"); } } - } - /** - * Opens a browser window with the Baidu Maps representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openBaiduMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("BAIDU"); - synchronized (lock) { - if (localPropertiesService.isBaiduMapsSupported()) { - - try { - webDriverBaidu = navigateTo(geoLocalizeTemplateService - .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_BAIDU_HTML_TEMPLATE) - .toString(), webDriverBaidu); - } catch (final Exception e) { - logger.error("Problems loading Baidu", e); - } - } - } - } - - /** - * Opens a browser window with the Yandex Maps representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openYandexMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("YANDEX"); - synchronized (lock) { - if (localPropertiesService.isYandexMapsSupported()) { - try { - webDriverYandex = navigateTo(geoLocalizeTemplateService.getUrlToFreemarkerOutput(placemarkObject, - GeolocalizeMapService.FREEMARKER_YANDEX_HTML_TEMPLATE).toString(), webDriverYandex); - } catch (final Exception e) { - logger.error("Problems loading Yandex", e); + fixedScriptForMac.append("//THE END"); // Don't remove this!!! this way we mark the point where there should be no trailing character removal + Keys controlChar = Keys.CONTROL; + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { + controlChar = Keys.COMMAND; + } + textArea.sendKeys(Keys.chord(controlChar, "a")); + textArea.sendKeys(fixedScriptForMac); +/* + Thread.sleep(500); + // Fix the extra characters added by removing the last 10 chars ( this is a bug from Selenium! ) + textArea.sendKeys(Keys.PAGE_DOWN); + Thread.sleep(500); + textArea.sendKeys(Keys.PAGE_DOWN); + */ + } + + private void forceClick( WebElement element ) { + JavascriptExecutor js = webDriverGee; + js.executeScript("arguments[0].click();", element); + } + + public String removeComments(String contents) { + + String wholeCode = contents; + wholeCode = wholeCode.replace("http://", ""); + wholeCode = wholeCode.replace("https://", ""); + wholeCode = wholeCode.replace("\r", ""); + + StringBuilder noComments = new StringBuilder(""); + int indexComments = contents.indexOf("//"); + if (indexComments != -1) { + while (indexComments >= 0) { + int endOfLine = contents.indexOf('\n', indexComments); + if (endOfLine != -1) + indexComments = contents.indexOf("//", endOfLine + 2); + else { + break; } - } - } - } - /** - * Opens a browser window with a map representation of the plot in SecureWatch. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openSecureWatch(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("SECUREWATCH"); - synchronized (lock) { - if ( localPropertiesService.isSecureWatchSupported() ) { - String url = getUrlBaseIntegration(placemarkObject, localPropertiesService.getSecureWatchURL() + "/#18/LATITUDE/LONGITUDE" ); - webDriverSecureWatch = navigateTo(url, webDriverSecureWatch); - try { - logger.warn("Loading layers - {}", placemarkObject); - loadPlotInDGMap(placemarkObject, webDriverSecureWatch); - } catch (final Exception e) { - logger.error("Error when opening Secure Watch browser window", e); - } + if (indexComments != -1) + noComments = noComments.append(contents.substring(endOfLine, indexComments)); + else + noComments = noComments.append(contents.substring(endOfLine)); } + return noComments.toString(); + } else { + return wholeCode; } } /** - * Opens a browser window with a map representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found + * Get the GEE Playground script that should be used. There is an standard one + * that resides in resources/eePlaygroundScript.fmt but a project might have its + * own script. * + * @return The generic script in the resources folder or the file called + * eePlaygroundScript.fmt in the same folder where the current project + * file resides */ - public void openExtraMap(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("EXTRA"); - synchronized (lock) { - if (!StringUtils.isBlank(localPropertiesService.getExtraMap())) { - webDriverExtraMap = navigateTo( getUrlBaseIntegration(placemarkObject, localPropertiesService.getExtraMap() ) , webDriverExtraMap ); - } - } - } + private String getGeeCodeEditorTemplate() { - private String getUrlBaseIntegration(SimplePlacemarkObject placemarkObject, String url) { - String temp = null; - try { - String latitude = placemarkObject.getCoord().getLatitude(); - String longitude = placemarkObject.getCoord().getLongitude(); - String id = placemarkObject.getPlacemarkId().split(",")[0]; // for cases where ID also has round, then - // the id string would be something like - // "plotId,round", we only want the ID - - temp = url.replace("LATITUDE", latitude).replace("LONGITUDE", longitude).replace("PLOT_ID", id); - - } catch (final Exception e) { - logger.error("Problems Getting the URL filling for " + url, e); + String projectPlaygroundScript = getProjectGeeScript(); + if (projectPlaygroundScript != null) { + return projectPlaygroundScript; + } else { + return GeolocalizeMapService.FREEMARKER_GEE_CODE_EDITOR_TEMPLATE; // New format name since version 1.6.20 } - return temp; - } - /** - * Opens a browser window with the Google Street View representation of the - * plot. - * https://www.google.com/maps/@43.7815661,11.1484876,3a,75y,210.23h,82.32t/data=!3m6!1e1!3m4!1sEz7NiCbaIYzTJkP_RMBiqw!2e0!7i13312!8i6656?hl=en - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openStreetView(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("STREET_VIEW"); - synchronized (lock) { - if (localPropertiesService.isStreetViewSupported()) { - try { - webDriverStreetView = navigateTo( - geoLocalizeTemplateService.getUrlToFreemarkerOutput(placemarkObject, - GeolocalizeMapService.FREEMARKER_STREET_VIEW_HTML_TEMPLATE, "googleMapsApiKey", - localPropertiesService.getValue(EarthProperty.GOOGLE_MAPS_API_KEY)).toString(), - webDriverStreetView); - } catch (final Exception e) { - logger.error("Problems loading Street View", e); - } - } - } } /** - * Opens a browser window with the Here Maps representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * + * @return The path to the GEE Code Editor generic script or the one that is + * specified in the project folder if it exists. */ - public void openHereMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("HERE"); - synchronized (lock) { - if (localPropertiesService.isHereMapsSupported()) { - try { - webDriverHere = navigateTo(geoLocalizeTemplateService - .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_HERE_HTML_TEMPLATE, - "hereAppId", localPropertiesService.getValue(EarthProperty.HERE_MAPS_APP_ID), - "hereAppCode", localPropertiesService.getValue(EarthProperty.HERE_MAPS_APP_CODE)) - .toString(), webDriverHere); - } catch (final Exception e) { - logger.error("Problems loading Here Maps", e); - } - - } - } - } - - private StringBuilder getGeoJsonSegment(List coordinates) { - StringBuilder geoJson = new StringBuilder("["); - if (coordinates != null) { - for (SimpleCoordinate coord : coordinates) { - geoJson = geoJson.append("[").append(coord.getLongitude()).append(",").append(coord.getLatitude()) - .append("],"); - } - // remove last character - geoJson = geoJson.deleteCharAt(geoJson.length() - 1); - } - geoJson = geoJson.append("],"); - return geoJson; - } - - + private String getProjectGeeScript() { + // Is there a "eePlaygroundScript.fmt" file in the same folder than in the + // metadata file folder? + File projectGeePlayground = new File(localPropertiesService.getProjectFolder() + File.separatorChar + + GeolocalizeMapService.FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME); + // Is there a "eeCodeEditorScript.fmt" file in the same folder than in the + // metadata file folder? NEW NAME AFTER 12/2017!!! + File projectGeeCodeEditor = new File(localPropertiesService.getProjectFolder() + File.separatorChar + + GeolocalizeMapService.FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME); - private String getFeature(SimplePlacemarkObject placemarkObject, String shapeType, String name ) { - StringBuilder feature = new StringBuilder("{\"type\":\"Feature\",\"properties\":{\"name\":\"").append( name).append("\"},\"geometry\":"); - feature= feature.append( getGeoJson(placemarkObject, shapeType )).append("}"); - return feature.toString(); - } - - private String getGeoJson(SimplePlacemarkObject placemarkObject, String shapeType ) { - - StringBuilder geoJson = new StringBuilder("{\"type\":\"" ).append( shapeType).append("\",\"coordinates\":["); - List shape = placemarkObject.getShape(); - geoJson = geoJson.append(getGeoJsonSegment(shape)); - geoJson = geoJson.deleteCharAt(geoJson.length() - 1); - geoJson = geoJson.append("]}"); - return geoJson.toString(); - } - - /** - * Opens a browser window with the Google Earth Engine Code Editor and runs the - * freemarker template found in resources/eeCodeEditorScript.fmt on the main - * editor of GEE. - * - * @param placemarkObject - * The center point of the plot. - * @throws BrowserNotFoundException - * If the browser cannot be found - * - */ - public void openGEEAppURL(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("GEEAPP"); - synchronized (lock) { - if (localPropertiesService.isGEEAppSupported()) { - - try { - StringBuilder url = new StringBuilder(localPropertiesService.getGEEAppURL()); - url = url.append("#geoJson=") - .append(URLEncoder.encode(getGeoJson(placemarkObject, "MultiLineString"), StandardCharsets.UTF_8.toString())) - .append(";"); - url = url.append("plotId=") - .append(URLEncoder.encode(placemarkObject.getPlacemarkId(), StandardCharsets.UTF_8.toString())) - .append(";"); - url = url.append("survey=") - .append(URLEncoder.encode( earthSurveyService.getCollectSurvey().getName() , StandardCharsets.UTF_8.toString())) - .append(";"); - webDriverGEEMap = navigateTo(url.toString(), webDriverGEEMap); - webDriverGEEMap.navigate().refresh(); // FORCE REFRESH - OTHERWISE WINDOW IS NOT REFRESHED FOR SOME STRANGE REASON - } catch (final Exception e) { - logger.error("Problems loading GEE APP window", e); - } - } + String geeFilePath = null; + if (projectGeeCodeEditor.exists()) { // The new format name takes precedence + geeFilePath = projectGeeCodeEditor.getAbsolutePath(); + } else if (projectGeePlayground.exists()) { + geeFilePath = projectGeePlayground.getAbsolutePath(); } + return geeFilePath; } - - public void openEarthMapURL(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("EARTH_MAP"); - synchronized (lock) { - if (localPropertiesService.isEarthMapSupported()) { - - - try { - StringBuilder url = new StringBuilder(localPropertiesService.getEarthMapURL()).append("?"); - url = url.append("polygon=") - .append(URLEncoder.encode(getFeature(placemarkObject, "Polygon", placemarkObject.getPlacemarkId()), StandardCharsets.UTF_8.toString())) - .append("&"); - - if( StringUtils.isNotBlank(localPropertiesService.getEarthMapLayers()) ) { - url = url.append("layers=") - .append(URLEncoder.encode(localPropertiesService.getEarthMapLayers(), StandardCharsets.UTF_8.toString())) - .append("&"); - } - - if( StringUtils.isNotBlank(localPropertiesService.getEarthMapScripts()) ) { - url = url.append("scripts=") - .append(URLEncoder.encode(localPropertiesService.getEarthMapScripts(), StandardCharsets.UTF_8.toString())) - .append("&"); - } - - String aoi = localPropertiesService.getEarthMapAOI(); - if( StringUtils.isBlank(aoi) ) { - aoi = "global"; - } - url = url.append("aoi=") - .append(URLEncoder.encode( aoi, StandardCharsets.UTF_8.toString() )) - .append("&embed=true"); // Set the EMBED parameter to true so that the user does not need to log in. - - webDriverEarthMap = navigateTo(url.toString(), webDriverEarthMap); - //Desktop.getDesktop().browse( new URI( url.toString() ) ); - //webDriverEarthMap.navigate().refresh(); // FORCE REFRESH - OTHERWISE WINDOW IS NOT REFRESHED FOR SOME STRANGE REASON - } catch (final Exception e) { - logger.error("Problems loading Earth Map window", e); - } - } - } + public void loadCodeEditorScript(SimplePlacemarkObject placemarkObject, RemoteWebDriver webDriverGeePlayground) { + this.placemarkObject = placemarkObject; + loadCodeEditorScript(webDriverGeePlayground); } - /** - * Opens a browser window with the Google Earth Engine Code Editor and runs the - * freemarker template found in resources/eeCodeEditorScript.fmt on the main - * editor of GEE. - * - * @param placemarkObject - * The center point of the plot. - * @throws BrowserNotFoundException - * If the browser cannot be found - * - */ - public void openGEECodeEditor(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("CODE_EDITOR"); - synchronized (lock) { - if (localPropertiesService.isCodeEditorSupported()) { - - boolean firstOpening = false; - if (getWebDriverGeeCodeEditor() == null) { - setWebDriverGeeCodeEditor(initBrowser()); - firstOpening = true; + public void disableCodeEditorAutocomplete(RemoteWebDriver webDriverCodeEditor) { + this.webDriverGee = webDriverCodeEditor; + try { + if (!isCodeEditorShowing()) { + // Open GEE Playground + if (!browserService.isDriverWorking(webDriverGee) || webDriverGee.getCurrentUrl() == null + || !webDriverGee.getCurrentUrl().contains("google")) { + webDriverGee = browserService.navigateTo(localPropertiesService.getGeePlaygoundUrl(), webDriverGee); + browserService.setWebDriverGeeCodeEditor(webDriverGee); } - if (firstOpening && (liquibase.repackaged.org.apache.commons.lang3.SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX)) { - codeEditorHandlerThread.disableCodeEditorAutocomplete(getWebDriverGeeCodeEditor()); + // Initially the login page appears! + while (!isCodeEditorShowing()) { // 5 minutes a 2 seconds == 30 * 5 = 150 + Thread.sleep(2000); } - codeEditorHandlerThread.loadCodeEditorScript(placemarkObject, getWebDriverGeeCodeEditor()); - } - } - } - - - /** - * Opens a browser window with the Google Earth Engine Timelapse representation - * of the plot. - * - * @param placemarkObject - * The center point of the plot. - * @throws BrowserNotFoundException - * If the browser cannot be found - * - */ - public void openTimelapse(final SimplePlacemarkObject placemarkObject) - throws BrowserNotFoundException { - Object lock = getLock("TIMELAPSE"); - synchronized (lock) { - if (localPropertiesService.isTimelapseSupported()) { - try { - String coordinates = placemarkObject.getCoord().toString(); - webDriverTimelapse = navigateTo( - "https://earthengine.google.org/timelapse/timelapseplayer_v2.html?timelapseclient=http://earthengine.google.org/timelapse/data&v=" - + coordinates + ",10.812,latLng&t=0.08", - webDriverTimelapse); - } catch (final Exception e) { - logger.error("Problems loading Timelapse", e); - } - } - } - } - - private void setGeckoDriverPath() { - String geckoDriverPath = ""; - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { - geckoDriverPath = "resources/geckodriver_mac"; - } else if (SystemUtils.IS_OS_UNIX) { - if (System.getProperty("os.arch").contains("64") - || System.getProperty("sun.arch.data.model").equals("64")) { - geckoDriverPath = "resources/geckodriver_64"; } else { - geckoDriverPath = "resources/geckodriver_32"; + disableAutoComplete(); } - } else if (SystemUtils.IS_OS_WINDOWS) { - try { - if (System.getProperty("os.arch").contains("64") - || System.getProperty("sun.arch.data.model").equals("64")) - geckoDriverPath = "resources/geckodriver_64.exe"; - else - geckoDriverPath = "resources/geckodriver_32.exe"; - } catch (Exception e) { - geckoDriverPath = "resources/geckodriver_64.exe"; - } - } else { - throw new IllegalArgumentException("Geckodriver is not supported in the current OS"); - } - - File geckoDriverFile = new File(geckoDriverPath); - // if above property is not working or not opening the application in browser - // then try below property - System.setProperty(GeckoDriverService.GECKO_DRIVER_EXE_PROPERTY, geckoDriverFile.getAbsolutePath()); - System.setProperty(FirefoxDriver.SystemProperty.DRIVER_USE_MARIONETTE, "true"); - - } - - public boolean waitFor(String elementId, RemoteWebDriver driver) { - int i = 0; - while (!isIdOrNamePresent(elementId, driver)) { - try { - Thread.sleep(1000); - } catch (final InterruptedException e) { - return false; - } - i++; - if (i > 60) { - return false; - } + } catch (final NoSuchElementException e) { + // This is a well known exception. Down-grade if to warning + logger.warn("Error when opening Earth Engine browser window. Known problem", e); + } catch (final Exception e) { + // This is a well known exception. + logger.error("Error when opening Earth Engine browser window", e); } - return true; } - public boolean waitForXPath(String xpath, RemoteWebDriver driver) { - int i = 0; - while (!isXPathPresent(xpath, driver)) { - try { - Thread.sleep(1000); - } catch (final InterruptedException e) { - return false; + private void disableAutoComplete() { + // Display the settings in Google Earth Engine Code Editor (this emulates + // clicking on the settings icon) + webDriverGee.findElementByClassName("settings-menu-button").click(); + // Get the Div that is the parent of the one with text that contains + // Autocomplete + RemoteWebElement autocompleteButton = (RemoteWebElement) webDriverGee + .findElementByXPath("//div[contains(text(), \"Autocomplete\")]/.."); - } - i++; - if (i > 30) { - return false; - } + if (isAutocompleChecked(autocompleteButton)) { + // Disable the Autocomplete of special characters + autocompleteButton.click(); } - return true; + } - private Thread getClosingBrowsersThread() { + public boolean isAutocompleChecked(RemoteWebElement autocompleteButton) { + String buttonChecked = autocompleteButton.getAttribute("aria-checked"); + return buttonChecked.equals("true"); + } - return new Thread("Quit the open browsers") { + private void loadCodeEditorScript(RemoteWebDriver webDriverCodeEditor) { + this.webDriverGee = webDriverCodeEditor; + Thread loadGee = new Thread( + "Opening GEE Playground " + (placemarkObject != null ? placemarkObject.toString() : "")) { @Override public void run() { - isClosing = true; - CopyOnWriteArrayList driversCopy = new CopyOnWriteArrayList<>(drivers); - for (Iterator iterator = driversCopy.iterator(); iterator.hasNext();) { - RemoteWebDriver remoteWebDriver = iterator.next(); - try { - remoteWebDriver.quit(); - } catch (final Exception e) { - logger.error("Error quitting the browser", e); + try { + if (!isCodeEditorShowing()) { + // Open GEE Code Editor + if (!browserService.isDriverWorking(webDriverGee) || webDriverGee.getCurrentUrl() == null + || !webDriverGee.getCurrentUrl().contains("google")) { + webDriverGee = browserService.navigateTo(localPropertiesService.getGeePlaygoundUrl(), + webDriverGee); + browserService.setWebDriverGeeCodeEditor(webDriverGee); + } + // Initially the login page appears! + while (!isCodeEditorShowing()) { + sleep(2000); + } } + runScript(); + } catch (final NoSuchElementException e) { + // This is a well known exception. Down-grade if to warning + logger.warn("Error when opening Earth Engine browser window. Known problem", e); + } catch (final Exception e) { + // This is a well known exception. + logger.error("Error when opening Earth Engine browser window", e); } - } }; + loadGee.start(); } - - @Override - public void update(Observable o, Object arg) { - if (ServerInitializationEvent.SERVER_STOPPED_EVENT.equals(arg)) { - this.closeBrowsers(); - } - } - - private RemoteWebDriver getWebDriverGeeCodeEditor() { - return webDriverGeeCodeEditor; - } - - protected void setWebDriverGeeCodeEditor(RemoteWebDriver webDriverGeeCodeEditor) { - this.webDriverGeeCodeEditor = webDriverGeeCodeEditor; - } - } From cd16fbe250ed1b6455f4e103ab9dd739c43b1deb Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:44 +0100 Subject: [PATCH 0128/1620] New translations CodeEditorHandlerThread.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 1012 ++++------------- 1 file changed, 211 insertions(+), 801 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 5a933d094d..c2259f5db0 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,909 +1,319 @@ package org.openforis.collect.earth.app.service; -import java.io.BufferedWriter; +import java.awt.Toolkit; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.StringSelection; import java.io.File; import java.io.IOException; -import java.io.StringWriter; -import java.io.Writer; -import java.net.URI; -import java.net.URLEncoder; +import java.net.URISyntaxException; +import java.net.URL; import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Observable; -import java.util.Observer; -import java.util.concurrent.CopyOnWriteArrayList; +import java.util.NoSuchElementException; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.desktop.ServerController; -import org.openforis.collect.earth.app.desktop.ServerController.ServerInitializationEvent; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.sampler.model.SimpleCoordinate; import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; import org.openqa.selenium.By; import org.openqa.selenium.JavascriptExecutor; -import org.openqa.selenium.WebDriverException; +import org.openqa.selenium.Keys; import org.openqa.selenium.WebElement; -import org.openqa.selenium.firefox.FirefoxDriver; -import org.openqa.selenium.firefox.GeckoDriverService; import org.openqa.selenium.remote.RemoteWebDriver; +import org.openqa.selenium.remote.RemoteWebElement; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import freemarker.cache.FileTemplateLoader; -import freemarker.template.Configuration; -import freemarker.template.Template; -import freemarker.template.TemplateException; -import freemarker.template.Version; -import io.github.bonigarcia.wdm.WebDriverManager; import liquibase.repackaged.org.apache.commons.lang3.SystemUtils; -/** - * This class contains methods that allow Collect Earth to open browser windows - * that allow the user to have a better understanding of the plot. So far there - * are integrations with Google Earth Engine, Google Earth Engine Timelapse and - * Bing Maps. When a user clicks on a plot Collect Earth will check if the - * program is set to open any of these integrations, and if it is so it will - * open each one in its own window. These windows are closed when the program - * is closed. - *s - * @author Alfonso Sanchez-Paus Diaz - * - */ + @Component -public class BrowserService implements InitializingBean, Observer { +public class CodeEditorHandlerThread { + private static final String RUN_SCRIPT_BUTTON = "button.run-button"; + private static final String RESET_SCRIPT_BUTTON = "button.reset-button"; + private SimplePlacemarkObject placemarkObject; + private RemoteWebDriver webDriverGee; @Autowired - private LocalPropertiesService localPropertiesService; + private BrowserService browserService; + private Logger logger = LoggerFactory.getLogger(CodeEditorHandlerThread.class); @Autowired private GeolocalizeMapService geoLocalizeTemplateService; @Autowired - private EarthSurveyService earthSurveyService; - - @Autowired - private CodeEditorHandlerThread codeEditorHandlerThread; - - private final ArrayList drivers = new ArrayList<>(); - private final Logger logger = LoggerFactory.getLogger(BrowserService.class); - private static final String TEMPLATE_FOR_DGMAP_JS = "resources/javascript_dgmap.fmt"; - private static final Configuration cfg = new Configuration(new Version("2.3.23")); - private RemoteWebDriver webDriverBing, webDriverBaidu, webDriverTimelapse, webDriverGeeCodeEditor, - webDriverHere, webDriverStreetView, webDriverYandex, webDriverPlanetHtml, webDriverExtraMap, webDriverSecureWatch, - webDriverGEEMap, webDriverEarthMap; - - - Map locks = new HashMap(); - - private static boolean geeMethodUpdated = false; - - private boolean isClosing = false; - - public void closeBrowsers() { - synchronized (this) { - getClosingBrowsersThread().start(); - } - } - - @Override - public void afterPropertiesSet() throws Exception { - Runtime.getRuntime().addShutdownHook(getClosingBrowsersThread()); - setGeckoDriverPath(); - } - - private RemoteWebDriver chooseDriver() throws BrowserNotFoundException { - RemoteWebDriver driver = null; - final String browserSetInProperties = localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim(); - - if (browserSetInProperties.equalsIgnoreCase(EarthConstants.CHROME_BROWSER)) { - driver = tryStartChrome(); - } else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.FIREFOX_BROWSER)) { - driver = tryStartFirefox(); - } else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.EDGE_BROWSER)) { - driver = tryStartEdge(); - }else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.SAFARI_BROWSER)) { - driver = tryStartSafari(); - } - - // If the browser chosen is not installed try to find and installed browser in the computer - if( driver== null ) { - driver = tryStartChrome(); - if( driver== null ) { - driver = tryStartFirefox(); - } - if( driver== null ) { - driver = tryStartEdge(); - } - if( driver== null ) { - driver = tryStartSafari(); - } - } - - if (driver == null) { - throw new BrowserNotFoundException( - "Neither Chrome nor Firefox could be opened. You need to have one of them installed in order to use GEE, Bing Maps or Saiku."); - } - - return driver; - } - - private RemoteWebDriver tryStartFirefox() { - RemoteWebDriver driver = null; - try { - driver = (RemoteWebDriver) WebDriverManager.firefoxdriver().create(); - } catch (final WebDriverException e) { - logger.warn( - "Problem starting Firefox browser!", - e); - } - return driver; - } - - private RemoteWebDriver tryStartEdge() { - RemoteWebDriver driver = null; - try { - driver = (RemoteWebDriver) WebDriverManager.edgedriver().create(); - } catch (final WebDriverException e) { - logger.warn( - "Problem starting Edge browser", - e); - } - return driver; - } - - private RemoteWebDriver tryStartSafari() { - RemoteWebDriver driver = null; - try { - driver = (RemoteWebDriver) WebDriverManager.safaridriver().create(); - } catch (final WebDriverException e) { - logger.warn( - "Problem starting Safari browser", - e); - } - return driver; - } - - private RemoteWebDriver tryStartChrome() { - RemoteWebDriver driver = null; - try { - driver = (RemoteWebDriver) WebDriverManager.chromedriver().create(); - } catch (final Exception e) { - logger.warn( - "Problem starting Chrome browser", - e); - } - return driver; - } - + private LocalPropertiesService localPropertiesService; - private String getDGMapJavascript(SimplePlacemarkObject placemarkObject) { - final Map data = geoLocalizeTemplateService.getPlacemarkData(placemarkObject); - data.put("latitude", placemarkObject.getCoord().getLatitude()); - data.put("longitude", placemarkObject.getCoord().getLongitude()); - return processJavascriptTemplate(data, TEMPLATE_FOR_DGMAP_JS); + public boolean isCodeEditorShowing() { + return BrowserService.isCssElementPresent(RUN_SCRIPT_BUTTON, webDriverGee); } - private String processJavascriptTemplate(final Map data, String templateName) { - Writer out; - String result = null; - try (StringWriter fw = new StringWriter();) { - // Load template from source folder - cfg.setTemplateLoader(new FileTemplateLoader(new File(System.getProperty("user.dir")))); - final Template template = cfg.getTemplate(templateName); + public void runScript() throws IOException, URISyntaxException, InterruptedException { - // Console output - out = new BufferedWriter(fw); - - // Add date to avoid caching - template.process(data, out); - - out.flush(); - - result = fw.toString(); - - } catch (final TemplateException e) { - logger.error("Error when generating the javascript commands", e); - } catch (final IOException e) { - logger.error("Error when reading/writing the template information", e); - } - return result; - } - - private RemoteWebDriver initBrowser() throws BrowserNotFoundException { - RemoteWebDriver driver = null; - driver = chooseDriver(); - if (isClosing) { // In case the browser takes so long to start that the user closes CE and this - // method is called when the other windows are being closed - driver.quit(); - driver = null; - } else { - drivers.add(driver); - } - return driver; - } - - public static boolean isIdOrNamePresent(String elementId, RemoteWebDriver driver) { - boolean found = false; try { - if (driver.findElementById(elementId).isDisplayed() || driver.findElementByName(elementId).isDisplayed()) { - found = true; - } - } catch (final Exception e) { - // Not found - } + WebElement resetButton = webDriverGee.findElementByCssSelector(RESET_SCRIPT_BUTTON); - return found; - } + forceClick( resetButton ); - public static boolean isCssElementPresent(String cssElement, RemoteWebDriver driver) { - boolean found = false; + URL fileWithScript = geoLocalizeTemplateService.getTemporaryUrl(placemarkObject, getGeeCodeEditorTemplate()); - try { - WebElement elementByCssSelector = driver.findElementByCssSelector(cssElement); - found = elementByCssSelector != null; - } catch (final Exception e) { - // Not found - } + WebElement textArea = webDriverGee.findElement(By.className("ace_text-input")); - return found; - } - - private boolean isXPathPresent(String xpath, RemoteWebDriver driver) { - boolean found = false; - - try { - if (driver.findElementByXPath(xpath).isDisplayed()) { - found = true; - } - logger.debug(String.format("Found %s", xpath)); - } catch (final Exception e) { - logger.debug(String.format("Not Found %s", xpath)); - } + String contents = FileUtils.readFileToString(new File(fileWithScript.toURI()), StandardCharsets.UTF_8 ); - return found; - } + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { + sendThroughKeys(textArea, contents); - private boolean loadPlotInDGMap(SimplePlacemarkObject placemarkObject, RemoteWebDriver driver) { - - boolean success = true; - if (driver != null && waitFor("mainContent", driver) && driver instanceof JavascriptExecutor) { - try { - String dgmapJs = getDGMapJavascript(placemarkObject); - driver.executeScript(dgmapJs); + } else { + sendThroughClipboard(textArea, contents); + try { + // Fix bug provoked by antivirus not accepting the control characters sent by Selenium + WebElement element = webDriverGee.findElement(By.className("ace_line") ); + if( element!= null && element.getAttribute("value").trim().equals("av") ) { + sendThroughKeys(textArea, contents); + } + } catch (Exception e) { + logger.warn("Error while refreshing code editor", e); - Thread.sleep( 1000 ); - // Unlock the view if it is locked - if( isCssElementPresent(".lock.on", driver) ) { - driver.findElementByCssSelector(".lock.on").click(); // UNLOCK } - - } catch (final Exception e) { - processSeleniumError(e); - success = false; - } - } - return success; - } - - public void clickOnElements(RemoteWebDriver driver, String cssSelector) { - final List dataLayerVisibility = driver.findElementsByCssSelector(cssSelector); - for (final WebElement webElement : dataLayerVisibility) { - if (webElement.isDisplayed()) { - webElement.click(); } - } - } - - public static boolean isGeeMethodUpdated() { - return geeMethodUpdated; - } - public static void setGeeMethodUpdated(boolean geeMethosUpdated) { - BrowserService.geeMethodUpdated = geeMethosUpdated; - } - - private void processSeleniumError(final Exception e) { - if (e.getCause() != null && e.getCause().getMessage() != null - && !e.getCause().getMessage().contains("latitude")) { - logger.warn("Error in the selenium driver", e); - } else { - logger.info("Error in the selenium driver provoked by known bug", e); - } - } - - public RemoteWebDriver navigateTo(String url, RemoteWebDriver driver) throws BrowserNotFoundException { - return navigateTo(url, driver, true); - } - - /** - * Loads the given URL into the browser. If the browser is null then a new - * browser window is open. - * - * @param url - * The URL to load. - * @param driverParam - * The browser window to use. If this value is null a new browser - * window is open. - * @param retry - * Specify if there should be a second try to open a browser window - * if the first time fails (useful if the browser could not be found) - * @return The browser window (firefox or chrome depending on the configuration) - * used to open the URL. - * @throws BrowserNotFoundException - * Exception thrown when there is no Firefox/Chrome installed - */ - public RemoteWebDriver navigateTo(String url, RemoteWebDriver driverParam, boolean retry) - throws BrowserNotFoundException { - - RemoteWebDriver driver = driverParam; - - if (driver == null || !isDriverWorking(driver)) { - driver = initBrowser(); - } - - if (driver != null) { + Thread.sleep(1000); + WebElement runButton = webDriverGee.findElementByCssSelector(RUN_SCRIPT_BUTTON); + forceClick( runButton ); + } catch (NoSuchElementException e) { try { - driver.navigate().to(url); - } catch (final Exception e) { - if (retry && (e.getCause() != null && e.getCause().getMessage() != null - && e.getCause().getMessage().contains("Session not found"))) { - // Browser closed, restart it! - logger.error("Browser was closed, restaring it...", e); - driver = initBrowser(); - navigateTo(url, driver, false); // only try to re-open one - } + // retry + Thread.sleep(1000); + WebElement runButton = webDriverGee.findElementByCssSelector(RUN_SCRIPT_BUTTON); + forceClick( runButton ); + }catch (Exception e2) { + // TODO: handle exception } - } else { - logger.error("No Selenium driver available, Is Firefox or Chrome installed?"); } - return driver; - } - protected boolean isDriverWorking(RemoteWebDriver driver) { - boolean stillWorking = true; - try { - driver.findElement(By.xpath("//body")); - } catch (Exception e) { - stillWorking = false; - } - return stillWorking; } - /** - * Opens a browser window with the Bing Maps representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openBingMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("BING"); - synchronized (lock) { - if (localPropertiesService.isBingMapsSupported()) { - try { - webDriverBing = navigateTo(geoLocalizeTemplateService - .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_BING_HTML_TEMPLATE, - "bingMapsKey", localPropertiesService.getValue(EarthProperty.BING_MAPS_KEY)) - .toString(), webDriverBing); - } catch (final Exception e) { - logger.error("Problems loading Bing", e); - } - } - } - } - - private Object getLock(String key) { - String lock = locks.get(key); - if( lock !=null ) { - return lock; - }else{ - locks.put(key, key); - return key; + private void sendThroughClipboard(WebElement textArea, String contents) { + Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); + StringSelection clipboardtext = new StringSelection(contents); + clipboard.setContents(clipboardtext, null); + Keys controlChar = Keys.CONTROL; + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { + controlChar = Keys.COMMAND; } + textArea.sendKeys(Keys.chord(controlChar, "a")); + textArea.sendKeys(Keys.chord(controlChar, "v")); } - /** - * Opens a browser window with the Planet Basemaps representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openPlanetMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("PLANET"); - synchronized (lock) { - if (localPropertiesService.isPlanetMapsSupported()) { - - boolean monthly = localPropertiesService.isPlanetMapsMonthlyOpen(); + private void sendThroughKeys(WebElement textArea, String contents) + throws InterruptedException { + // Command key (apple key) is not working on Chrome on Mac. Try with the right click + // This is not going to be fixed by Selenium - String template = monthly ? GeolocalizeMapService.FREEMARKER_PLANET_NICFI_ARGUMENTS : GeolocalizeMapService.FREEMARKER_PLANET_DAILY_HTML_TEMPLATE; - String key = monthly ? localPropertiesService.getValue( EarthProperty.PLANET_MAPS_CE_KEY ) : localPropertiesService.getValue( EarthProperty.PLANET_MAPS_KEY ); + // Remove comments so it is faster to send the text! + String noComments = removeComments(contents); - try { - - String processTemplate = geoLocalizeTemplateService.getUrlToFreemarkerOutput( - placemarkObject, - template, - "planetMapsKey", - key, - "urlPlanetEndpointPrefix", - ServerController.getHostAddress(localPropertiesService.getHost(),localPropertiesService.getPort()) - ).toString(); - - String urlPlanet = null; - if( monthly ) { + // Clear the code area + WebElement clearButton = webDriverGee.findElementByCssSelector(RESET_SCRIPT_BUTTON); + forceClick( clearButton ); - String parameters = FileUtils.readFileToString( new File( new URI( processTemplate ) ) , StandardCharsets.UTF_8 ); + StringBuilder fixedScriptForMac = new StringBuilder(); + String[] lines = noComments.split("\\n"); + for (String line : lines) { + // Send the content of the script + String trimmedLine = line.trim(); - // remove new lines - parameters = parameters.replace("\n", "").replace("\r", "").replace("\t", "").replace(" ", ""); - // remove trailing commas - parameters = parameters.replace(",],", "],").replace("],]", "]]"); - - urlPlanet = localPropertiesService.getValue( EarthProperty.PLANET_NICFI_URL ) + parameters; - }else { - urlPlanet = processTemplate; - } + // Add Spaces after "{" so we avoid the automatic closing of the method by GEE + // Playground JS + trimmedLine = trimmedLine.replace("{", "{ "); - webDriverPlanetHtml = navigateTo( urlPlanet, webDriverPlanetHtml ); - - } catch (final Exception e) { - logger.error("Problems loading Planet", e); - } + if (!StringUtils.isBlank(trimmedLine)) { + fixedScriptForMac = fixedScriptForMac.append(trimmedLine).append("\n"); } } - } - /** - * Opens a browser window with the Baidu Maps representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openBaiduMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("BAIDU"); - synchronized (lock) { - if (localPropertiesService.isBaiduMapsSupported()) { - - try { - webDriverBaidu = navigateTo(geoLocalizeTemplateService - .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_BAIDU_HTML_TEMPLATE) - .toString(), webDriverBaidu); - } catch (final Exception e) { - logger.error("Problems loading Baidu", e); - } - } - } - } - - /** - * Opens a browser window with the Yandex Maps representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openYandexMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("YANDEX"); - synchronized (lock) { - if (localPropertiesService.isYandexMapsSupported()) { - try { - webDriverYandex = navigateTo(geoLocalizeTemplateService.getUrlToFreemarkerOutput(placemarkObject, - GeolocalizeMapService.FREEMARKER_YANDEX_HTML_TEMPLATE).toString(), webDriverYandex); - } catch (final Exception e) { - logger.error("Problems loading Yandex", e); + fixedScriptForMac.append("//THE END"); // Don't remove this!!! this way we mark the point where there should be no trailing character removal + Keys controlChar = Keys.CONTROL; + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { + controlChar = Keys.COMMAND; + } + textArea.sendKeys(Keys.chord(controlChar, "a")); + textArea.sendKeys(fixedScriptForMac); +/* + Thread.sleep(500); + // Fix the extra characters added by removing the last 10 chars ( this is a bug from Selenium! ) + textArea.sendKeys(Keys.PAGE_DOWN); + Thread.sleep(500); + textArea.sendKeys(Keys.PAGE_DOWN); + */ + } + + private void forceClick( WebElement element ) { + JavascriptExecutor js = webDriverGee; + js.executeScript("arguments[0].click();", element); + } + + public String removeComments(String contents) { + + String wholeCode = contents; + wholeCode = wholeCode.replace("http://", ""); + wholeCode = wholeCode.replace("https://", ""); + wholeCode = wholeCode.replace("\r", ""); + + StringBuilder noComments = new StringBuilder(""); + int indexComments = contents.indexOf("//"); + if (indexComments != -1) { + while (indexComments >= 0) { + int endOfLine = contents.indexOf('\n', indexComments); + if (endOfLine != -1) + indexComments = contents.indexOf("//", endOfLine + 2); + else { + break; } - } - } - } - /** - * Opens a browser window with a map representation of the plot in SecureWatch. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openSecureWatch(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("SECUREWATCH"); - synchronized (lock) { - if ( localPropertiesService.isSecureWatchSupported() ) { - String url = getUrlBaseIntegration(placemarkObject, localPropertiesService.getSecureWatchURL() + "/#18/LATITUDE/LONGITUDE" ); - webDriverSecureWatch = navigateTo(url, webDriverSecureWatch); - try { - logger.warn("Loading layers - {}", placemarkObject); - loadPlotInDGMap(placemarkObject, webDriverSecureWatch); - } catch (final Exception e) { - logger.error("Error when opening Secure Watch browser window", e); - } + if (indexComments != -1) + noComments = noComments.append(contents.substring(endOfLine, indexComments)); + else + noComments = noComments.append(contents.substring(endOfLine)); } + return noComments.toString(); + } else { + return wholeCode; } } /** - * Opens a browser window with a map representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found + * Get the GEE Playground script that should be used. There is an standard one + * that resides in resources/eePlaygroundScript.fmt but a project might have its + * own script. * + * @return The generic script in the resources folder or the file called + * eePlaygroundScript.fmt in the same folder where the current project + * file resides */ - public void openExtraMap(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("EXTRA"); - synchronized (lock) { - if (!StringUtils.isBlank(localPropertiesService.getExtraMap())) { - webDriverExtraMap = navigateTo( getUrlBaseIntegration(placemarkObject, localPropertiesService.getExtraMap() ) , webDriverExtraMap ); - } - } - } + private String getGeeCodeEditorTemplate() { - private String getUrlBaseIntegration(SimplePlacemarkObject placemarkObject, String url) { - String temp = null; - try { - String latitude = placemarkObject.getCoord().getLatitude(); - String longitude = placemarkObject.getCoord().getLongitude(); - String id = placemarkObject.getPlacemarkId().split(",")[0]; // for cases where ID also has round, then - // the id string would be something like - // "plotId,round", we only want the ID - - temp = url.replace("LATITUDE", latitude).replace("LONGITUDE", longitude).replace("PLOT_ID", id); - - } catch (final Exception e) { - logger.error("Problems Getting the URL filling for " + url, e); + String projectPlaygroundScript = getProjectGeeScript(); + if (projectPlaygroundScript != null) { + return projectPlaygroundScript; + } else { + return GeolocalizeMapService.FREEMARKER_GEE_CODE_EDITOR_TEMPLATE; // New format name since version 1.6.20 } - return temp; - } - /** - * Opens a browser window with the Google Street View representation of the - * plot. - * https://www.google.com/maps/@43.7815661,11.1484876,3a,75y,210.23h,82.32t/data=!3m6!1e1!3m4!1sEz7NiCbaIYzTJkP_RMBiqw!2e0!7i13312!8i6656?hl=en - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openStreetView(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("STREET_VIEW"); - synchronized (lock) { - if (localPropertiesService.isStreetViewSupported()) { - try { - webDriverStreetView = navigateTo( - geoLocalizeTemplateService.getUrlToFreemarkerOutput(placemarkObject, - GeolocalizeMapService.FREEMARKER_STREET_VIEW_HTML_TEMPLATE, "googleMapsApiKey", - localPropertiesService.getValue(EarthProperty.GOOGLE_MAPS_API_KEY)).toString(), - webDriverStreetView); - } catch (final Exception e) { - logger.error("Problems loading Street View", e); - } - } - } } /** - * Opens a browser window with the Here Maps representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * + * @return The path to the GEE Code Editor generic script or the one that is + * specified in the project folder if it exists. */ - public void openHereMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("HERE"); - synchronized (lock) { - if (localPropertiesService.isHereMapsSupported()) { - try { - webDriverHere = navigateTo(geoLocalizeTemplateService - .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_HERE_HTML_TEMPLATE, - "hereAppId", localPropertiesService.getValue(EarthProperty.HERE_MAPS_APP_ID), - "hereAppCode", localPropertiesService.getValue(EarthProperty.HERE_MAPS_APP_CODE)) - .toString(), webDriverHere); - } catch (final Exception e) { - logger.error("Problems loading Here Maps", e); - } - - } - } - } - - private StringBuilder getGeoJsonSegment(List coordinates) { - StringBuilder geoJson = new StringBuilder("["); - if (coordinates != null) { - for (SimpleCoordinate coord : coordinates) { - geoJson = geoJson.append("[").append(coord.getLongitude()).append(",").append(coord.getLatitude()) - .append("],"); - } - // remove last character - geoJson = geoJson.deleteCharAt(geoJson.length() - 1); - } - geoJson = geoJson.append("],"); - return geoJson; - } - - + private String getProjectGeeScript() { + // Is there a "eePlaygroundScript.fmt" file in the same folder than in the + // metadata file folder? + File projectGeePlayground = new File(localPropertiesService.getProjectFolder() + File.separatorChar + + GeolocalizeMapService.FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME); + // Is there a "eeCodeEditorScript.fmt" file in the same folder than in the + // metadata file folder? NEW NAME AFTER 12/2017!!! + File projectGeeCodeEditor = new File(localPropertiesService.getProjectFolder() + File.separatorChar + + GeolocalizeMapService.FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME); - private String getFeature(SimplePlacemarkObject placemarkObject, String shapeType, String name ) { - StringBuilder feature = new StringBuilder("{\"type\":\"Feature\",\"properties\":{\"name\":\"").append( name).append("\"},\"geometry\":"); - feature= feature.append( getGeoJson(placemarkObject, shapeType )).append("}"); - return feature.toString(); - } - - private String getGeoJson(SimplePlacemarkObject placemarkObject, String shapeType ) { - - StringBuilder geoJson = new StringBuilder("{\"type\":\"" ).append( shapeType).append("\",\"coordinates\":["); - List shape = placemarkObject.getShape(); - geoJson = geoJson.append(getGeoJsonSegment(shape)); - geoJson = geoJson.deleteCharAt(geoJson.length() - 1); - geoJson = geoJson.append("]}"); - return geoJson.toString(); - } - - /** - * Opens a browser window with the Google Earth Engine Code Editor and runs the - * freemarker template found in resources/eeCodeEditorScript.fmt on the main - * editor of GEE. - * - * @param placemarkObject - * The center point of the plot. - * @throws BrowserNotFoundException - * If the browser cannot be found - * - */ - public void openGEEAppURL(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("GEEAPP"); - synchronized (lock) { - if (localPropertiesService.isGEEAppSupported()) { - - try { - StringBuilder url = new StringBuilder(localPropertiesService.getGEEAppURL()); - url = url.append("#geoJson=") - .append(URLEncoder.encode(getGeoJson(placemarkObject, "MultiLineString"), StandardCharsets.UTF_8.toString())) - .append(";"); - url = url.append("plotId=") - .append(URLEncoder.encode(placemarkObject.getPlacemarkId(), StandardCharsets.UTF_8.toString())) - .append(";"); - url = url.append("survey=") - .append(URLEncoder.encode( earthSurveyService.getCollectSurvey().getName() , StandardCharsets.UTF_8.toString())) - .append(";"); - webDriverGEEMap = navigateTo(url.toString(), webDriverGEEMap); - webDriverGEEMap.navigate().refresh(); // FORCE REFRESH - OTHERWISE WINDOW IS NOT REFRESHED FOR SOME STRANGE REASON - } catch (final Exception e) { - logger.error("Problems loading GEE APP window", e); - } - } + String geeFilePath = null; + if (projectGeeCodeEditor.exists()) { // The new format name takes precedence + geeFilePath = projectGeeCodeEditor.getAbsolutePath(); + } else if (projectGeePlayground.exists()) { + geeFilePath = projectGeePlayground.getAbsolutePath(); } + return geeFilePath; } - - public void openEarthMapURL(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("EARTH_MAP"); - synchronized (lock) { - if (localPropertiesService.isEarthMapSupported()) { - - - try { - StringBuilder url = new StringBuilder(localPropertiesService.getEarthMapURL()).append("?"); - url = url.append("polygon=") - .append(URLEncoder.encode(getFeature(placemarkObject, "Polygon", placemarkObject.getPlacemarkId()), StandardCharsets.UTF_8.toString())) - .append("&"); - - if( StringUtils.isNotBlank(localPropertiesService.getEarthMapLayers()) ) { - url = url.append("layers=") - .append(URLEncoder.encode(localPropertiesService.getEarthMapLayers(), StandardCharsets.UTF_8.toString())) - .append("&"); - } - - if( StringUtils.isNotBlank(localPropertiesService.getEarthMapScripts()) ) { - url = url.append("scripts=") - .append(URLEncoder.encode(localPropertiesService.getEarthMapScripts(), StandardCharsets.UTF_8.toString())) - .append("&"); - } - - String aoi = localPropertiesService.getEarthMapAOI(); - if( StringUtils.isBlank(aoi) ) { - aoi = "global"; - } - url = url.append("aoi=") - .append(URLEncoder.encode( aoi, StandardCharsets.UTF_8.toString() )) - .append("&embed=true"); // Set the EMBED parameter to true so that the user does not need to log in. - - webDriverEarthMap = navigateTo(url.toString(), webDriverEarthMap); - //Desktop.getDesktop().browse( new URI( url.toString() ) ); - //webDriverEarthMap.navigate().refresh(); // FORCE REFRESH - OTHERWISE WINDOW IS NOT REFRESHED FOR SOME STRANGE REASON - } catch (final Exception e) { - logger.error("Problems loading Earth Map window", e); - } - } - } + public void loadCodeEditorScript(SimplePlacemarkObject placemarkObject, RemoteWebDriver webDriverGeePlayground) { + this.placemarkObject = placemarkObject; + loadCodeEditorScript(webDriverGeePlayground); } - /** - * Opens a browser window with the Google Earth Engine Code Editor and runs the - * freemarker template found in resources/eeCodeEditorScript.fmt on the main - * editor of GEE. - * - * @param placemarkObject - * The center point of the plot. - * @throws BrowserNotFoundException - * If the browser cannot be found - * - */ - public void openGEECodeEditor(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("CODE_EDITOR"); - synchronized (lock) { - if (localPropertiesService.isCodeEditorSupported()) { - - boolean firstOpening = false; - if (getWebDriverGeeCodeEditor() == null) { - setWebDriverGeeCodeEditor(initBrowser()); - firstOpening = true; + public void disableCodeEditorAutocomplete(RemoteWebDriver webDriverCodeEditor) { + this.webDriverGee = webDriverCodeEditor; + try { + if (!isCodeEditorShowing()) { + // Open GEE Playground + if (!browserService.isDriverWorking(webDriverGee) || webDriverGee.getCurrentUrl() == null + || !webDriverGee.getCurrentUrl().contains("google")) { + webDriverGee = browserService.navigateTo(localPropertiesService.getGeePlaygoundUrl(), webDriverGee); + browserService.setWebDriverGeeCodeEditor(webDriverGee); } - if (firstOpening && (liquibase.repackaged.org.apache.commons.lang3.SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX)) { - codeEditorHandlerThread.disableCodeEditorAutocomplete(getWebDriverGeeCodeEditor()); + // Initially the login page appears! + while (!isCodeEditorShowing()) { // 5 minutes a 2 seconds == 30 * 5 = 150 + Thread.sleep(2000); } - codeEditorHandlerThread.loadCodeEditorScript(placemarkObject, getWebDriverGeeCodeEditor()); - } - } - } - - - /** - * Opens a browser window with the Google Earth Engine Timelapse representation - * of the plot. - * - * @param placemarkObject - * The center point of the plot. - * @throws BrowserNotFoundException - * If the browser cannot be found - * - */ - public void openTimelapse(final SimplePlacemarkObject placemarkObject) - throws BrowserNotFoundException { - Object lock = getLock("TIMELAPSE"); - synchronized (lock) { - if (localPropertiesService.isTimelapseSupported()) { - try { - String coordinates = placemarkObject.getCoord().toString(); - webDriverTimelapse = navigateTo( - "https://earthengine.google.org/timelapse/timelapseplayer_v2.html?timelapseclient=http://earthengine.google.org/timelapse/data&v=" - + coordinates + ",10.812,latLng&t=0.08", - webDriverTimelapse); - } catch (final Exception e) { - logger.error("Problems loading Timelapse", e); - } - } - } - } - - private void setGeckoDriverPath() { - String geckoDriverPath = ""; - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { - geckoDriverPath = "resources/geckodriver_mac"; - } else if (SystemUtils.IS_OS_UNIX) { - if (System.getProperty("os.arch").contains("64") - || System.getProperty("sun.arch.data.model").equals("64")) { - geckoDriverPath = "resources/geckodriver_64"; } else { - geckoDriverPath = "resources/geckodriver_32"; + disableAutoComplete(); } - } else if (SystemUtils.IS_OS_WINDOWS) { - try { - if (System.getProperty("os.arch").contains("64") - || System.getProperty("sun.arch.data.model").equals("64")) - geckoDriverPath = "resources/geckodriver_64.exe"; - else - geckoDriverPath = "resources/geckodriver_32.exe"; - } catch (Exception e) { - geckoDriverPath = "resources/geckodriver_64.exe"; - } - } else { - throw new IllegalArgumentException("Geckodriver is not supported in the current OS"); - } - - File geckoDriverFile = new File(geckoDriverPath); - // if above property is not working or not opening the application in browser - // then try below property - System.setProperty(GeckoDriverService.GECKO_DRIVER_EXE_PROPERTY, geckoDriverFile.getAbsolutePath()); - System.setProperty(FirefoxDriver.SystemProperty.DRIVER_USE_MARIONETTE, "true"); - - } - - public boolean waitFor(String elementId, RemoteWebDriver driver) { - int i = 0; - while (!isIdOrNamePresent(elementId, driver)) { - try { - Thread.sleep(1000); - } catch (final InterruptedException e) { - return false; - } - i++; - if (i > 60) { - return false; - } + } catch (final NoSuchElementException e) { + // This is a well known exception. Down-grade if to warning + logger.warn("Error when opening Earth Engine browser window. Known problem", e); + } catch (final Exception e) { + // This is a well known exception. + logger.error("Error when opening Earth Engine browser window", e); } - return true; } - public boolean waitForXPath(String xpath, RemoteWebDriver driver) { - int i = 0; - while (!isXPathPresent(xpath, driver)) { - try { - Thread.sleep(1000); - } catch (final InterruptedException e) { - return false; + private void disableAutoComplete() { + // Display the settings in Google Earth Engine Code Editor (this emulates + // clicking on the settings icon) + webDriverGee.findElementByClassName("settings-menu-button").click(); + // Get the Div that is the parent of the one with text that contains + // Autocomplete + RemoteWebElement autocompleteButton = (RemoteWebElement) webDriverGee + .findElementByXPath("//div[contains(text(), \"Autocomplete\")]/.."); - } - i++; - if (i > 30) { - return false; - } + if (isAutocompleChecked(autocompleteButton)) { + // Disable the Autocomplete of special characters + autocompleteButton.click(); } - return true; + } - private Thread getClosingBrowsersThread() { + public boolean isAutocompleChecked(RemoteWebElement autocompleteButton) { + String buttonChecked = autocompleteButton.getAttribute("aria-checked"); + return buttonChecked.equals("true"); + } - return new Thread("Quit the open browsers") { + private void loadCodeEditorScript(RemoteWebDriver webDriverCodeEditor) { + this.webDriverGee = webDriverCodeEditor; + Thread loadGee = new Thread( + "Opening GEE Playground " + (placemarkObject != null ? placemarkObject.toString() : "")) { @Override public void run() { - isClosing = true; - CopyOnWriteArrayList driversCopy = new CopyOnWriteArrayList<>(drivers); - for (Iterator iterator = driversCopy.iterator(); iterator.hasNext();) { - RemoteWebDriver remoteWebDriver = iterator.next(); - try { - remoteWebDriver.quit(); - } catch (final Exception e) { - logger.error("Error quitting the browser", e); + try { + if (!isCodeEditorShowing()) { + // Open GEE Code Editor + if (!browserService.isDriverWorking(webDriverGee) || webDriverGee.getCurrentUrl() == null + || !webDriverGee.getCurrentUrl().contains("google")) { + webDriverGee = browserService.navigateTo(localPropertiesService.getGeePlaygoundUrl(), + webDriverGee); + browserService.setWebDriverGeeCodeEditor(webDriverGee); + } + // Initially the login page appears! + while (!isCodeEditorShowing()) { + sleep(2000); + } } + runScript(); + } catch (final NoSuchElementException e) { + // This is a well known exception. Down-grade if to warning + logger.warn("Error when opening Earth Engine browser window. Known problem", e); + } catch (final Exception e) { + // This is a well known exception. + logger.error("Error when opening Earth Engine browser window", e); } - } }; + loadGee.start(); } - - @Override - public void update(Observable o, Object arg) { - if (ServerInitializationEvent.SERVER_STOPPED_EVENT.equals(arg)) { - this.closeBrowsers(); - } - } - - private RemoteWebDriver getWebDriverGeeCodeEditor() { - return webDriverGeeCodeEditor; - } - - protected void setWebDriverGeeCodeEditor(RemoteWebDriver webDriverGeeCodeEditor) { - this.webDriverGeeCodeEditor = webDriverGeeCodeEditor; - } - } From bd3c59b6c144e2d0e136532a3057cedfec1e9753 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:45 +0100 Subject: [PATCH 0129/1620] New translations CodeEditorHandlerThread.java (English) --- .../earth/app/view/Messages_en.properties | 1012 ++++------------- 1 file changed, 211 insertions(+), 801 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 5a933d094d..c2259f5db0 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,909 +1,319 @@ package org.openforis.collect.earth.app.service; -import java.io.BufferedWriter; +import java.awt.Toolkit; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.StringSelection; import java.io.File; import java.io.IOException; -import java.io.StringWriter; -import java.io.Writer; -import java.net.URI; -import java.net.URLEncoder; +import java.net.URISyntaxException; +import java.net.URL; import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Observable; -import java.util.Observer; -import java.util.concurrent.CopyOnWriteArrayList; +import java.util.NoSuchElementException; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.desktop.ServerController; -import org.openforis.collect.earth.app.desktop.ServerController.ServerInitializationEvent; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.sampler.model.SimpleCoordinate; import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; import org.openqa.selenium.By; import org.openqa.selenium.JavascriptExecutor; -import org.openqa.selenium.WebDriverException; +import org.openqa.selenium.Keys; import org.openqa.selenium.WebElement; -import org.openqa.selenium.firefox.FirefoxDriver; -import org.openqa.selenium.firefox.GeckoDriverService; import org.openqa.selenium.remote.RemoteWebDriver; +import org.openqa.selenium.remote.RemoteWebElement; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import freemarker.cache.FileTemplateLoader; -import freemarker.template.Configuration; -import freemarker.template.Template; -import freemarker.template.TemplateException; -import freemarker.template.Version; -import io.github.bonigarcia.wdm.WebDriverManager; import liquibase.repackaged.org.apache.commons.lang3.SystemUtils; -/** - * This class contains methods that allow Collect Earth to open browser windows - * that allow the user to have a better understanding of the plot. So far there - * are integrations with Google Earth Engine, Google Earth Engine Timelapse and - * Bing Maps. When a user clicks on a plot Collect Earth will check if the - * program is set to open any of these integrations, and if it is so it will - * open each one in its own window. These windows are closed when the program - * is closed. - *s - * @author Alfonso Sanchez-Paus Diaz - * - */ + @Component -public class BrowserService implements InitializingBean, Observer { +public class CodeEditorHandlerThread { + private static final String RUN_SCRIPT_BUTTON = "button.run-button"; + private static final String RESET_SCRIPT_BUTTON = "button.reset-button"; + private SimplePlacemarkObject placemarkObject; + private RemoteWebDriver webDriverGee; @Autowired - private LocalPropertiesService localPropertiesService; + private BrowserService browserService; + private Logger logger = LoggerFactory.getLogger(CodeEditorHandlerThread.class); @Autowired private GeolocalizeMapService geoLocalizeTemplateService; @Autowired - private EarthSurveyService earthSurveyService; - - @Autowired - private CodeEditorHandlerThread codeEditorHandlerThread; - - private final ArrayList drivers = new ArrayList<>(); - private final Logger logger = LoggerFactory.getLogger(BrowserService.class); - private static final String TEMPLATE_FOR_DGMAP_JS = "resources/javascript_dgmap.fmt"; - private static final Configuration cfg = new Configuration(new Version("2.3.23")); - private RemoteWebDriver webDriverBing, webDriverBaidu, webDriverTimelapse, webDriverGeeCodeEditor, - webDriverHere, webDriverStreetView, webDriverYandex, webDriverPlanetHtml, webDriverExtraMap, webDriverSecureWatch, - webDriverGEEMap, webDriverEarthMap; - - - Map locks = new HashMap(); - - private static boolean geeMethodUpdated = false; - - private boolean isClosing = false; - - public void closeBrowsers() { - synchronized (this) { - getClosingBrowsersThread().start(); - } - } - - @Override - public void afterPropertiesSet() throws Exception { - Runtime.getRuntime().addShutdownHook(getClosingBrowsersThread()); - setGeckoDriverPath(); - } - - private RemoteWebDriver chooseDriver() throws BrowserNotFoundException { - RemoteWebDriver driver = null; - final String browserSetInProperties = localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim(); - - if (browserSetInProperties.equalsIgnoreCase(EarthConstants.CHROME_BROWSER)) { - driver = tryStartChrome(); - } else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.FIREFOX_BROWSER)) { - driver = tryStartFirefox(); - } else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.EDGE_BROWSER)) { - driver = tryStartEdge(); - }else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.SAFARI_BROWSER)) { - driver = tryStartSafari(); - } - - // If the browser chosen is not installed try to find and installed browser in the computer - if( driver== null ) { - driver = tryStartChrome(); - if( driver== null ) { - driver = tryStartFirefox(); - } - if( driver== null ) { - driver = tryStartEdge(); - } - if( driver== null ) { - driver = tryStartSafari(); - } - } - - if (driver == null) { - throw new BrowserNotFoundException( - "Neither Chrome nor Firefox could be opened. You need to have one of them installed in order to use GEE, Bing Maps or Saiku."); - } - - return driver; - } - - private RemoteWebDriver tryStartFirefox() { - RemoteWebDriver driver = null; - try { - driver = (RemoteWebDriver) WebDriverManager.firefoxdriver().create(); - } catch (final WebDriverException e) { - logger.warn( - "Problem starting Firefox browser!", - e); - } - return driver; - } - - private RemoteWebDriver tryStartEdge() { - RemoteWebDriver driver = null; - try { - driver = (RemoteWebDriver) WebDriverManager.edgedriver().create(); - } catch (final WebDriverException e) { - logger.warn( - "Problem starting Edge browser", - e); - } - return driver; - } - - private RemoteWebDriver tryStartSafari() { - RemoteWebDriver driver = null; - try { - driver = (RemoteWebDriver) WebDriverManager.safaridriver().create(); - } catch (final WebDriverException e) { - logger.warn( - "Problem starting Safari browser", - e); - } - return driver; - } - - private RemoteWebDriver tryStartChrome() { - RemoteWebDriver driver = null; - try { - driver = (RemoteWebDriver) WebDriverManager.chromedriver().create(); - } catch (final Exception e) { - logger.warn( - "Problem starting Chrome browser", - e); - } - return driver; - } - + private LocalPropertiesService localPropertiesService; - private String getDGMapJavascript(SimplePlacemarkObject placemarkObject) { - final Map data = geoLocalizeTemplateService.getPlacemarkData(placemarkObject); - data.put("latitude", placemarkObject.getCoord().getLatitude()); - data.put("longitude", placemarkObject.getCoord().getLongitude()); - return processJavascriptTemplate(data, TEMPLATE_FOR_DGMAP_JS); + public boolean isCodeEditorShowing() { + return BrowserService.isCssElementPresent(RUN_SCRIPT_BUTTON, webDriverGee); } - private String processJavascriptTemplate(final Map data, String templateName) { - Writer out; - String result = null; - try (StringWriter fw = new StringWriter();) { - // Load template from source folder - cfg.setTemplateLoader(new FileTemplateLoader(new File(System.getProperty("user.dir")))); - final Template template = cfg.getTemplate(templateName); + public void runScript() throws IOException, URISyntaxException, InterruptedException { - // Console output - out = new BufferedWriter(fw); - - // Add date to avoid caching - template.process(data, out); - - out.flush(); - - result = fw.toString(); - - } catch (final TemplateException e) { - logger.error("Error when generating the javascript commands", e); - } catch (final IOException e) { - logger.error("Error when reading/writing the template information", e); - } - return result; - } - - private RemoteWebDriver initBrowser() throws BrowserNotFoundException { - RemoteWebDriver driver = null; - driver = chooseDriver(); - if (isClosing) { // In case the browser takes so long to start that the user closes CE and this - // method is called when the other windows are being closed - driver.quit(); - driver = null; - } else { - drivers.add(driver); - } - return driver; - } - - public static boolean isIdOrNamePresent(String elementId, RemoteWebDriver driver) { - boolean found = false; try { - if (driver.findElementById(elementId).isDisplayed() || driver.findElementByName(elementId).isDisplayed()) { - found = true; - } - } catch (final Exception e) { - // Not found - } + WebElement resetButton = webDriverGee.findElementByCssSelector(RESET_SCRIPT_BUTTON); - return found; - } + forceClick( resetButton ); - public static boolean isCssElementPresent(String cssElement, RemoteWebDriver driver) { - boolean found = false; + URL fileWithScript = geoLocalizeTemplateService.getTemporaryUrl(placemarkObject, getGeeCodeEditorTemplate()); - try { - WebElement elementByCssSelector = driver.findElementByCssSelector(cssElement); - found = elementByCssSelector != null; - } catch (final Exception e) { - // Not found - } + WebElement textArea = webDriverGee.findElement(By.className("ace_text-input")); - return found; - } - - private boolean isXPathPresent(String xpath, RemoteWebDriver driver) { - boolean found = false; - - try { - if (driver.findElementByXPath(xpath).isDisplayed()) { - found = true; - } - logger.debug(String.format("Found %s", xpath)); - } catch (final Exception e) { - logger.debug(String.format("Not Found %s", xpath)); - } + String contents = FileUtils.readFileToString(new File(fileWithScript.toURI()), StandardCharsets.UTF_8 ); - return found; - } + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { + sendThroughKeys(textArea, contents); - private boolean loadPlotInDGMap(SimplePlacemarkObject placemarkObject, RemoteWebDriver driver) { - - boolean success = true; - if (driver != null && waitFor("mainContent", driver) && driver instanceof JavascriptExecutor) { - try { - String dgmapJs = getDGMapJavascript(placemarkObject); - driver.executeScript(dgmapJs); + } else { + sendThroughClipboard(textArea, contents); + try { + // Fix bug provoked by antivirus not accepting the control characters sent by Selenium + WebElement element = webDriverGee.findElement(By.className("ace_line") ); + if( element!= null && element.getAttribute("value").trim().equals("av") ) { + sendThroughKeys(textArea, contents); + } + } catch (Exception e) { + logger.warn("Error while refreshing code editor", e); - Thread.sleep( 1000 ); - // Unlock the view if it is locked - if( isCssElementPresent(".lock.on", driver) ) { - driver.findElementByCssSelector(".lock.on").click(); // UNLOCK } - - } catch (final Exception e) { - processSeleniumError(e); - success = false; - } - } - return success; - } - - public void clickOnElements(RemoteWebDriver driver, String cssSelector) { - final List dataLayerVisibility = driver.findElementsByCssSelector(cssSelector); - for (final WebElement webElement : dataLayerVisibility) { - if (webElement.isDisplayed()) { - webElement.click(); } - } - } - - public static boolean isGeeMethodUpdated() { - return geeMethodUpdated; - } - public static void setGeeMethodUpdated(boolean geeMethosUpdated) { - BrowserService.geeMethodUpdated = geeMethosUpdated; - } - - private void processSeleniumError(final Exception e) { - if (e.getCause() != null && e.getCause().getMessage() != null - && !e.getCause().getMessage().contains("latitude")) { - logger.warn("Error in the selenium driver", e); - } else { - logger.info("Error in the selenium driver provoked by known bug", e); - } - } - - public RemoteWebDriver navigateTo(String url, RemoteWebDriver driver) throws BrowserNotFoundException { - return navigateTo(url, driver, true); - } - - /** - * Loads the given URL into the browser. If the browser is null then a new - * browser window is open. - * - * @param url - * The URL to load. - * @param driverParam - * The browser window to use. If this value is null a new browser - * window is open. - * @param retry - * Specify if there should be a second try to open a browser window - * if the first time fails (useful if the browser could not be found) - * @return The browser window (firefox or chrome depending on the configuration) - * used to open the URL. - * @throws BrowserNotFoundException - * Exception thrown when there is no Firefox/Chrome installed - */ - public RemoteWebDriver navigateTo(String url, RemoteWebDriver driverParam, boolean retry) - throws BrowserNotFoundException { - - RemoteWebDriver driver = driverParam; - - if (driver == null || !isDriverWorking(driver)) { - driver = initBrowser(); - } - - if (driver != null) { + Thread.sleep(1000); + WebElement runButton = webDriverGee.findElementByCssSelector(RUN_SCRIPT_BUTTON); + forceClick( runButton ); + } catch (NoSuchElementException e) { try { - driver.navigate().to(url); - } catch (final Exception e) { - if (retry && (e.getCause() != null && e.getCause().getMessage() != null - && e.getCause().getMessage().contains("Session not found"))) { - // Browser closed, restart it! - logger.error("Browser was closed, restaring it...", e); - driver = initBrowser(); - navigateTo(url, driver, false); // only try to re-open one - } + // retry + Thread.sleep(1000); + WebElement runButton = webDriverGee.findElementByCssSelector(RUN_SCRIPT_BUTTON); + forceClick( runButton ); + }catch (Exception e2) { + // TODO: handle exception } - } else { - logger.error("No Selenium driver available, Is Firefox or Chrome installed?"); } - return driver; - } - protected boolean isDriverWorking(RemoteWebDriver driver) { - boolean stillWorking = true; - try { - driver.findElement(By.xpath("//body")); - } catch (Exception e) { - stillWorking = false; - } - return stillWorking; } - /** - * Opens a browser window with the Bing Maps representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openBingMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("BING"); - synchronized (lock) { - if (localPropertiesService.isBingMapsSupported()) { - try { - webDriverBing = navigateTo(geoLocalizeTemplateService - .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_BING_HTML_TEMPLATE, - "bingMapsKey", localPropertiesService.getValue(EarthProperty.BING_MAPS_KEY)) - .toString(), webDriverBing); - } catch (final Exception e) { - logger.error("Problems loading Bing", e); - } - } - } - } - - private Object getLock(String key) { - String lock = locks.get(key); - if( lock !=null ) { - return lock; - }else{ - locks.put(key, key); - return key; + private void sendThroughClipboard(WebElement textArea, String contents) { + Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); + StringSelection clipboardtext = new StringSelection(contents); + clipboard.setContents(clipboardtext, null); + Keys controlChar = Keys.CONTROL; + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { + controlChar = Keys.COMMAND; } + textArea.sendKeys(Keys.chord(controlChar, "a")); + textArea.sendKeys(Keys.chord(controlChar, "v")); } - /** - * Opens a browser window with the Planet Basemaps representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openPlanetMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("PLANET"); - synchronized (lock) { - if (localPropertiesService.isPlanetMapsSupported()) { - - boolean monthly = localPropertiesService.isPlanetMapsMonthlyOpen(); + private void sendThroughKeys(WebElement textArea, String contents) + throws InterruptedException { + // Command key (apple key) is not working on Chrome on Mac. Try with the right click + // This is not going to be fixed by Selenium - String template = monthly ? GeolocalizeMapService.FREEMARKER_PLANET_NICFI_ARGUMENTS : GeolocalizeMapService.FREEMARKER_PLANET_DAILY_HTML_TEMPLATE; - String key = monthly ? localPropertiesService.getValue( EarthProperty.PLANET_MAPS_CE_KEY ) : localPropertiesService.getValue( EarthProperty.PLANET_MAPS_KEY ); + // Remove comments so it is faster to send the text! + String noComments = removeComments(contents); - try { - - String processTemplate = geoLocalizeTemplateService.getUrlToFreemarkerOutput( - placemarkObject, - template, - "planetMapsKey", - key, - "urlPlanetEndpointPrefix", - ServerController.getHostAddress(localPropertiesService.getHost(),localPropertiesService.getPort()) - ).toString(); - - String urlPlanet = null; - if( monthly ) { + // Clear the code area + WebElement clearButton = webDriverGee.findElementByCssSelector(RESET_SCRIPT_BUTTON); + forceClick( clearButton ); - String parameters = FileUtils.readFileToString( new File( new URI( processTemplate ) ) , StandardCharsets.UTF_8 ); + StringBuilder fixedScriptForMac = new StringBuilder(); + String[] lines = noComments.split("\\n"); + for (String line : lines) { + // Send the content of the script + String trimmedLine = line.trim(); - // remove new lines - parameters = parameters.replace("\n", "").replace("\r", "").replace("\t", "").replace(" ", ""); - // remove trailing commas - parameters = parameters.replace(",],", "],").replace("],]", "]]"); - - urlPlanet = localPropertiesService.getValue( EarthProperty.PLANET_NICFI_URL ) + parameters; - }else { - urlPlanet = processTemplate; - } + // Add Spaces after "{" so we avoid the automatic closing of the method by GEE + // Playground JS + trimmedLine = trimmedLine.replace("{", "{ "); - webDriverPlanetHtml = navigateTo( urlPlanet, webDriverPlanetHtml ); - - } catch (final Exception e) { - logger.error("Problems loading Planet", e); - } + if (!StringUtils.isBlank(trimmedLine)) { + fixedScriptForMac = fixedScriptForMac.append(trimmedLine).append("\n"); } } - } - /** - * Opens a browser window with the Baidu Maps representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openBaiduMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("BAIDU"); - synchronized (lock) { - if (localPropertiesService.isBaiduMapsSupported()) { - - try { - webDriverBaidu = navigateTo(geoLocalizeTemplateService - .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_BAIDU_HTML_TEMPLATE) - .toString(), webDriverBaidu); - } catch (final Exception e) { - logger.error("Problems loading Baidu", e); - } - } - } - } - - /** - * Opens a browser window with the Yandex Maps representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openYandexMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("YANDEX"); - synchronized (lock) { - if (localPropertiesService.isYandexMapsSupported()) { - try { - webDriverYandex = navigateTo(geoLocalizeTemplateService.getUrlToFreemarkerOutput(placemarkObject, - GeolocalizeMapService.FREEMARKER_YANDEX_HTML_TEMPLATE).toString(), webDriverYandex); - } catch (final Exception e) { - logger.error("Problems loading Yandex", e); + fixedScriptForMac.append("//THE END"); // Don't remove this!!! this way we mark the point where there should be no trailing character removal + Keys controlChar = Keys.CONTROL; + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { + controlChar = Keys.COMMAND; + } + textArea.sendKeys(Keys.chord(controlChar, "a")); + textArea.sendKeys(fixedScriptForMac); +/* + Thread.sleep(500); + // Fix the extra characters added by removing the last 10 chars ( this is a bug from Selenium! ) + textArea.sendKeys(Keys.PAGE_DOWN); + Thread.sleep(500); + textArea.sendKeys(Keys.PAGE_DOWN); + */ + } + + private void forceClick( WebElement element ) { + JavascriptExecutor js = webDriverGee; + js.executeScript("arguments[0].click();", element); + } + + public String removeComments(String contents) { + + String wholeCode = contents; + wholeCode = wholeCode.replace("http://", ""); + wholeCode = wholeCode.replace("https://", ""); + wholeCode = wholeCode.replace("\r", ""); + + StringBuilder noComments = new StringBuilder(""); + int indexComments = contents.indexOf("//"); + if (indexComments != -1) { + while (indexComments >= 0) { + int endOfLine = contents.indexOf('\n', indexComments); + if (endOfLine != -1) + indexComments = contents.indexOf("//", endOfLine + 2); + else { + break; } - } - } - } - /** - * Opens a browser window with a map representation of the plot in SecureWatch. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openSecureWatch(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("SECUREWATCH"); - synchronized (lock) { - if ( localPropertiesService.isSecureWatchSupported() ) { - String url = getUrlBaseIntegration(placemarkObject, localPropertiesService.getSecureWatchURL() + "/#18/LATITUDE/LONGITUDE" ); - webDriverSecureWatch = navigateTo(url, webDriverSecureWatch); - try { - logger.warn("Loading layers - {}", placemarkObject); - loadPlotInDGMap(placemarkObject, webDriverSecureWatch); - } catch (final Exception e) { - logger.error("Error when opening Secure Watch browser window", e); - } + if (indexComments != -1) + noComments = noComments.append(contents.substring(endOfLine, indexComments)); + else + noComments = noComments.append(contents.substring(endOfLine)); } + return noComments.toString(); + } else { + return wholeCode; } } /** - * Opens a browser window with a map representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found + * Get the GEE Playground script that should be used. There is an standard one + * that resides in resources/eePlaygroundScript.fmt but a project might have its + * own script. * + * @return The generic script in the resources folder or the file called + * eePlaygroundScript.fmt in the same folder where the current project + * file resides */ - public void openExtraMap(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("EXTRA"); - synchronized (lock) { - if (!StringUtils.isBlank(localPropertiesService.getExtraMap())) { - webDriverExtraMap = navigateTo( getUrlBaseIntegration(placemarkObject, localPropertiesService.getExtraMap() ) , webDriverExtraMap ); - } - } - } + private String getGeeCodeEditorTemplate() { - private String getUrlBaseIntegration(SimplePlacemarkObject placemarkObject, String url) { - String temp = null; - try { - String latitude = placemarkObject.getCoord().getLatitude(); - String longitude = placemarkObject.getCoord().getLongitude(); - String id = placemarkObject.getPlacemarkId().split(",")[0]; // for cases where ID also has round, then - // the id string would be something like - // "plotId,round", we only want the ID - - temp = url.replace("LATITUDE", latitude).replace("LONGITUDE", longitude).replace("PLOT_ID", id); - - } catch (final Exception e) { - logger.error("Problems Getting the URL filling for " + url, e); + String projectPlaygroundScript = getProjectGeeScript(); + if (projectPlaygroundScript != null) { + return projectPlaygroundScript; + } else { + return GeolocalizeMapService.FREEMARKER_GEE_CODE_EDITOR_TEMPLATE; // New format name since version 1.6.20 } - return temp; - } - /** - * Opens a browser window with the Google Street View representation of the - * plot. - * https://www.google.com/maps/@43.7815661,11.1484876,3a,75y,210.23h,82.32t/data=!3m6!1e1!3m4!1sEz7NiCbaIYzTJkP_RMBiqw!2e0!7i13312!8i6656?hl=en - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openStreetView(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("STREET_VIEW"); - synchronized (lock) { - if (localPropertiesService.isStreetViewSupported()) { - try { - webDriverStreetView = navigateTo( - geoLocalizeTemplateService.getUrlToFreemarkerOutput(placemarkObject, - GeolocalizeMapService.FREEMARKER_STREET_VIEW_HTML_TEMPLATE, "googleMapsApiKey", - localPropertiesService.getValue(EarthProperty.GOOGLE_MAPS_API_KEY)).toString(), - webDriverStreetView); - } catch (final Exception e) { - logger.error("Problems loading Street View", e); - } - } - } } /** - * Opens a browser window with the Here Maps representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * + * @return The path to the GEE Code Editor generic script or the one that is + * specified in the project folder if it exists. */ - public void openHereMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("HERE"); - synchronized (lock) { - if (localPropertiesService.isHereMapsSupported()) { - try { - webDriverHere = navigateTo(geoLocalizeTemplateService - .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_HERE_HTML_TEMPLATE, - "hereAppId", localPropertiesService.getValue(EarthProperty.HERE_MAPS_APP_ID), - "hereAppCode", localPropertiesService.getValue(EarthProperty.HERE_MAPS_APP_CODE)) - .toString(), webDriverHere); - } catch (final Exception e) { - logger.error("Problems loading Here Maps", e); - } - - } - } - } - - private StringBuilder getGeoJsonSegment(List coordinates) { - StringBuilder geoJson = new StringBuilder("["); - if (coordinates != null) { - for (SimpleCoordinate coord : coordinates) { - geoJson = geoJson.append("[").append(coord.getLongitude()).append(",").append(coord.getLatitude()) - .append("],"); - } - // remove last character - geoJson = geoJson.deleteCharAt(geoJson.length() - 1); - } - geoJson = geoJson.append("],"); - return geoJson; - } - - + private String getProjectGeeScript() { + // Is there a "eePlaygroundScript.fmt" file in the same folder than in the + // metadata file folder? + File projectGeePlayground = new File(localPropertiesService.getProjectFolder() + File.separatorChar + + GeolocalizeMapService.FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME); + // Is there a "eeCodeEditorScript.fmt" file in the same folder than in the + // metadata file folder? NEW NAME AFTER 12/2017!!! + File projectGeeCodeEditor = new File(localPropertiesService.getProjectFolder() + File.separatorChar + + GeolocalizeMapService.FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME); - private String getFeature(SimplePlacemarkObject placemarkObject, String shapeType, String name ) { - StringBuilder feature = new StringBuilder("{\"type\":\"Feature\",\"properties\":{\"name\":\"").append( name).append("\"},\"geometry\":"); - feature= feature.append( getGeoJson(placemarkObject, shapeType )).append("}"); - return feature.toString(); - } - - private String getGeoJson(SimplePlacemarkObject placemarkObject, String shapeType ) { - - StringBuilder geoJson = new StringBuilder("{\"type\":\"" ).append( shapeType).append("\",\"coordinates\":["); - List shape = placemarkObject.getShape(); - geoJson = geoJson.append(getGeoJsonSegment(shape)); - geoJson = geoJson.deleteCharAt(geoJson.length() - 1); - geoJson = geoJson.append("]}"); - return geoJson.toString(); - } - - /** - * Opens a browser window with the Google Earth Engine Code Editor and runs the - * freemarker template found in resources/eeCodeEditorScript.fmt on the main - * editor of GEE. - * - * @param placemarkObject - * The center point of the plot. - * @throws BrowserNotFoundException - * If the browser cannot be found - * - */ - public void openGEEAppURL(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("GEEAPP"); - synchronized (lock) { - if (localPropertiesService.isGEEAppSupported()) { - - try { - StringBuilder url = new StringBuilder(localPropertiesService.getGEEAppURL()); - url = url.append("#geoJson=") - .append(URLEncoder.encode(getGeoJson(placemarkObject, "MultiLineString"), StandardCharsets.UTF_8.toString())) - .append(";"); - url = url.append("plotId=") - .append(URLEncoder.encode(placemarkObject.getPlacemarkId(), StandardCharsets.UTF_8.toString())) - .append(";"); - url = url.append("survey=") - .append(URLEncoder.encode( earthSurveyService.getCollectSurvey().getName() , StandardCharsets.UTF_8.toString())) - .append(";"); - webDriverGEEMap = navigateTo(url.toString(), webDriverGEEMap); - webDriverGEEMap.navigate().refresh(); // FORCE REFRESH - OTHERWISE WINDOW IS NOT REFRESHED FOR SOME STRANGE REASON - } catch (final Exception e) { - logger.error("Problems loading GEE APP window", e); - } - } + String geeFilePath = null; + if (projectGeeCodeEditor.exists()) { // The new format name takes precedence + geeFilePath = projectGeeCodeEditor.getAbsolutePath(); + } else if (projectGeePlayground.exists()) { + geeFilePath = projectGeePlayground.getAbsolutePath(); } + return geeFilePath; } - - public void openEarthMapURL(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("EARTH_MAP"); - synchronized (lock) { - if (localPropertiesService.isEarthMapSupported()) { - - - try { - StringBuilder url = new StringBuilder(localPropertiesService.getEarthMapURL()).append("?"); - url = url.append("polygon=") - .append(URLEncoder.encode(getFeature(placemarkObject, "Polygon", placemarkObject.getPlacemarkId()), StandardCharsets.UTF_8.toString())) - .append("&"); - - if( StringUtils.isNotBlank(localPropertiesService.getEarthMapLayers()) ) { - url = url.append("layers=") - .append(URLEncoder.encode(localPropertiesService.getEarthMapLayers(), StandardCharsets.UTF_8.toString())) - .append("&"); - } - - if( StringUtils.isNotBlank(localPropertiesService.getEarthMapScripts()) ) { - url = url.append("scripts=") - .append(URLEncoder.encode(localPropertiesService.getEarthMapScripts(), StandardCharsets.UTF_8.toString())) - .append("&"); - } - - String aoi = localPropertiesService.getEarthMapAOI(); - if( StringUtils.isBlank(aoi) ) { - aoi = "global"; - } - url = url.append("aoi=") - .append(URLEncoder.encode( aoi, StandardCharsets.UTF_8.toString() )) - .append("&embed=true"); // Set the EMBED parameter to true so that the user does not need to log in. - - webDriverEarthMap = navigateTo(url.toString(), webDriverEarthMap); - //Desktop.getDesktop().browse( new URI( url.toString() ) ); - //webDriverEarthMap.navigate().refresh(); // FORCE REFRESH - OTHERWISE WINDOW IS NOT REFRESHED FOR SOME STRANGE REASON - } catch (final Exception e) { - logger.error("Problems loading Earth Map window", e); - } - } - } + public void loadCodeEditorScript(SimplePlacemarkObject placemarkObject, RemoteWebDriver webDriverGeePlayground) { + this.placemarkObject = placemarkObject; + loadCodeEditorScript(webDriverGeePlayground); } - /** - * Opens a browser window with the Google Earth Engine Code Editor and runs the - * freemarker template found in resources/eeCodeEditorScript.fmt on the main - * editor of GEE. - * - * @param placemarkObject - * The center point of the plot. - * @throws BrowserNotFoundException - * If the browser cannot be found - * - */ - public void openGEECodeEditor(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("CODE_EDITOR"); - synchronized (lock) { - if (localPropertiesService.isCodeEditorSupported()) { - - boolean firstOpening = false; - if (getWebDriverGeeCodeEditor() == null) { - setWebDriverGeeCodeEditor(initBrowser()); - firstOpening = true; + public void disableCodeEditorAutocomplete(RemoteWebDriver webDriverCodeEditor) { + this.webDriverGee = webDriverCodeEditor; + try { + if (!isCodeEditorShowing()) { + // Open GEE Playground + if (!browserService.isDriverWorking(webDriverGee) || webDriverGee.getCurrentUrl() == null + || !webDriverGee.getCurrentUrl().contains("google")) { + webDriverGee = browserService.navigateTo(localPropertiesService.getGeePlaygoundUrl(), webDriverGee); + browserService.setWebDriverGeeCodeEditor(webDriverGee); } - if (firstOpening && (liquibase.repackaged.org.apache.commons.lang3.SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX)) { - codeEditorHandlerThread.disableCodeEditorAutocomplete(getWebDriverGeeCodeEditor()); + // Initially the login page appears! + while (!isCodeEditorShowing()) { // 5 minutes a 2 seconds == 30 * 5 = 150 + Thread.sleep(2000); } - codeEditorHandlerThread.loadCodeEditorScript(placemarkObject, getWebDriverGeeCodeEditor()); - } - } - } - - - /** - * Opens a browser window with the Google Earth Engine Timelapse representation - * of the plot. - * - * @param placemarkObject - * The center point of the plot. - * @throws BrowserNotFoundException - * If the browser cannot be found - * - */ - public void openTimelapse(final SimplePlacemarkObject placemarkObject) - throws BrowserNotFoundException { - Object lock = getLock("TIMELAPSE"); - synchronized (lock) { - if (localPropertiesService.isTimelapseSupported()) { - try { - String coordinates = placemarkObject.getCoord().toString(); - webDriverTimelapse = navigateTo( - "https://earthengine.google.org/timelapse/timelapseplayer_v2.html?timelapseclient=http://earthengine.google.org/timelapse/data&v=" - + coordinates + ",10.812,latLng&t=0.08", - webDriverTimelapse); - } catch (final Exception e) { - logger.error("Problems loading Timelapse", e); - } - } - } - } - - private void setGeckoDriverPath() { - String geckoDriverPath = ""; - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { - geckoDriverPath = "resources/geckodriver_mac"; - } else if (SystemUtils.IS_OS_UNIX) { - if (System.getProperty("os.arch").contains("64") - || System.getProperty("sun.arch.data.model").equals("64")) { - geckoDriverPath = "resources/geckodriver_64"; } else { - geckoDriverPath = "resources/geckodriver_32"; + disableAutoComplete(); } - } else if (SystemUtils.IS_OS_WINDOWS) { - try { - if (System.getProperty("os.arch").contains("64") - || System.getProperty("sun.arch.data.model").equals("64")) - geckoDriverPath = "resources/geckodriver_64.exe"; - else - geckoDriverPath = "resources/geckodriver_32.exe"; - } catch (Exception e) { - geckoDriverPath = "resources/geckodriver_64.exe"; - } - } else { - throw new IllegalArgumentException("Geckodriver is not supported in the current OS"); - } - - File geckoDriverFile = new File(geckoDriverPath); - // if above property is not working or not opening the application in browser - // then try below property - System.setProperty(GeckoDriverService.GECKO_DRIVER_EXE_PROPERTY, geckoDriverFile.getAbsolutePath()); - System.setProperty(FirefoxDriver.SystemProperty.DRIVER_USE_MARIONETTE, "true"); - - } - - public boolean waitFor(String elementId, RemoteWebDriver driver) { - int i = 0; - while (!isIdOrNamePresent(elementId, driver)) { - try { - Thread.sleep(1000); - } catch (final InterruptedException e) { - return false; - } - i++; - if (i > 60) { - return false; - } + } catch (final NoSuchElementException e) { + // This is a well known exception. Down-grade if to warning + logger.warn("Error when opening Earth Engine browser window. Known problem", e); + } catch (final Exception e) { + // This is a well known exception. + logger.error("Error when opening Earth Engine browser window", e); } - return true; } - public boolean waitForXPath(String xpath, RemoteWebDriver driver) { - int i = 0; - while (!isXPathPresent(xpath, driver)) { - try { - Thread.sleep(1000); - } catch (final InterruptedException e) { - return false; + private void disableAutoComplete() { + // Display the settings in Google Earth Engine Code Editor (this emulates + // clicking on the settings icon) + webDriverGee.findElementByClassName("settings-menu-button").click(); + // Get the Div that is the parent of the one with text that contains + // Autocomplete + RemoteWebElement autocompleteButton = (RemoteWebElement) webDriverGee + .findElementByXPath("//div[contains(text(), \"Autocomplete\")]/.."); - } - i++; - if (i > 30) { - return false; - } + if (isAutocompleChecked(autocompleteButton)) { + // Disable the Autocomplete of special characters + autocompleteButton.click(); } - return true; + } - private Thread getClosingBrowsersThread() { + public boolean isAutocompleChecked(RemoteWebElement autocompleteButton) { + String buttonChecked = autocompleteButton.getAttribute("aria-checked"); + return buttonChecked.equals("true"); + } - return new Thread("Quit the open browsers") { + private void loadCodeEditorScript(RemoteWebDriver webDriverCodeEditor) { + this.webDriverGee = webDriverCodeEditor; + Thread loadGee = new Thread( + "Opening GEE Playground " + (placemarkObject != null ? placemarkObject.toString() : "")) { @Override public void run() { - isClosing = true; - CopyOnWriteArrayList driversCopy = new CopyOnWriteArrayList<>(drivers); - for (Iterator iterator = driversCopy.iterator(); iterator.hasNext();) { - RemoteWebDriver remoteWebDriver = iterator.next(); - try { - remoteWebDriver.quit(); - } catch (final Exception e) { - logger.error("Error quitting the browser", e); + try { + if (!isCodeEditorShowing()) { + // Open GEE Code Editor + if (!browserService.isDriverWorking(webDriverGee) || webDriverGee.getCurrentUrl() == null + || !webDriverGee.getCurrentUrl().contains("google")) { + webDriverGee = browserService.navigateTo(localPropertiesService.getGeePlaygoundUrl(), + webDriverGee); + browserService.setWebDriverGeeCodeEditor(webDriverGee); + } + // Initially the login page appears! + while (!isCodeEditorShowing()) { + sleep(2000); + } } + runScript(); + } catch (final NoSuchElementException e) { + // This is a well known exception. Down-grade if to warning + logger.warn("Error when opening Earth Engine browser window. Known problem", e); + } catch (final Exception e) { + // This is a well known exception. + logger.error("Error when opening Earth Engine browser window", e); } - } }; + loadGee.start(); } - - @Override - public void update(Observable o, Object arg) { - if (ServerInitializationEvent.SERVER_STOPPED_EVENT.equals(arg)) { - this.closeBrowsers(); - } - } - - private RemoteWebDriver getWebDriverGeeCodeEditor() { - return webDriverGeeCodeEditor; - } - - protected void setWebDriverGeeCodeEditor(RemoteWebDriver webDriverGeeCodeEditor) { - this.webDriverGeeCodeEditor = webDriverGeeCodeEditor; - } - } From 400b6ea499e1dbd6ef1b2472b3cce61319d01f58 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:46 +0100 Subject: [PATCH 0130/1620] New translations DataImportExportService.java (French) --- .../earth/app/view/Messages_fr.properties | 409 ++++++------------ 1 file changed, 142 insertions(+), 267 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index c2259f5db0..eb9f542d80 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,319 +1,194 @@ package org.openforis.collect.earth.app.service; -import java.awt.Toolkit; -import java.awt.datatransfer.Clipboard; -import java.awt.datatransfer.StringSelection; import java.io.File; -import java.io.IOException; -import java.net.URISyntaxException; -import java.net.URL; -import java.nio.charset.StandardCharsets; -import java.util.NoSuchElementException; - -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; -import org.openqa.selenium.By; -import org.openqa.selenium.JavascriptExecutor; -import org.openqa.selenium.Keys; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.remote.RemoteWebDriver; -import org.openqa.selenium.remote.RemoteWebElement; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.io.data.CSVDataExportProcess; +import org.openforis.collect.io.data.CSVDataImportProcess; +import org.openforis.collect.io.data.DataExportStatus; +import org.openforis.collect.io.data.DataImportSummaryItem; +import org.openforis.collect.io.data.XMLDataExportProcess; +import org.openforis.collect.io.data.XMLDataImportProcess; +import org.openforis.collect.io.data.csv.CSVDataExportParameters; +import org.openforis.collect.io.data.csv.CSVDataImportSettings; +import org.openforis.collect.manager.process.AbstractProcess; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.RecordFilter; +import org.openforis.commons.collection.Predicate; +import org.openforis.idm.model.BooleanAttribute; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; -import liquibase.repackaged.org.apache.commons.lang3.SystemUtils; - - +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ @Component -public class CodeEditorHandlerThread { - private static final String RUN_SCRIPT_BUTTON = "button.run-button"; - private static final String RESET_SCRIPT_BUTTON = "button.reset-button"; - private SimplePlacemarkObject placemarkObject; - - private RemoteWebDriver webDriverGee; +public class DataImportExportService { @Autowired - private BrowserService browserService; - private Logger logger = LoggerFactory.getLogger(CodeEditorHandlerThread.class); + private EarthSurveyService earthSurveyService; @Autowired - private GeolocalizeMapService geoLocalizeTemplateService; + private LocalPropertiesService localPropertiesService; + private final Logger logger = LoggerFactory.getLogger(DataImportExportService.class); + /** + * Use the application context to get a new bean everytime the data is exported ( as a new instance is needed every time) + */ @Autowired - private LocalPropertiesService localPropertiesService; + private ApplicationContext applicationContext; - public boolean isCodeEditorShowing() { - return BrowserService.isCssElementPresent(RUN_SCRIPT_BUTTON, webDriverGee); + private void addRecordsToImportList( List recordsToImport, List entryIdsToImport) { + if (recordsToImport != null) { + List cleanRecordsToImport = recordsToImport; + for (final DataImportSummaryItem importRecord : cleanRecordsToImport) { + entryIdsToImport.add(importRecord.getEntryId()); + } + } } - public void runScript() throws IOException, URISyntaxException, InterruptedException { - - - try { - WebElement resetButton = webDriverGee.findElementByCssSelector(RESET_SCRIPT_BUTTON); - - forceClick( resetButton ); - - URL fileWithScript = geoLocalizeTemplateService.getTemporaryUrl(placemarkObject, getGeeCodeEditorTemplate()); - - WebElement textArea = webDriverGee.findElement(By.className("ace_text-input")); + public CSVDataExportProcess exportSurveyAsCsv(File exportToFile, boolean includeCodeItemLabelColumn) { + final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); + csvDataExportProcess.setOutputFile(exportToFile); - String contents = FileUtils.readFileToString(new File(fileWithScript.toURI()), StandardCharsets.UTF_8 ); + csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); + csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { - sendThroughKeys(textArea, contents); + CSVDataExportParameters config = new CSVDataExportParameters(); + config.setIncludeAllAncestorAttributes(true); + config.setIncludeEnumeratedEntities(true); + config.setLanguageCode( localPropertiesService.getValue(EarthProperty.UI_LANGUAGE) ); + config.setIncludeCodeItemLabelColumn(includeCodeItemLabelColumn); + csvDataExportProcess.setConfiguration(config); - } else { - sendThroughClipboard(textArea, contents); - try { - // Fix bug provoked by antivirus not accepting the control characters sent by Selenium - WebElement element = webDriverGee.findElement(By.className("ace_line") ); - if( element!= null && element.getAttribute("value").trim().equals("av") ) { - sendThroughKeys(textArea, contents); - } - } catch (Exception e) { - logger.warn("Error while refreshing code editor", e); - - } - } + return csvDataExportProcess; + } - Thread.sleep(1000); - WebElement runButton = webDriverGee.findElementByCssSelector(RUN_SCRIPT_BUTTON); - forceClick( runButton ); - } catch (NoSuchElementException e) { - try { - // retry - Thread.sleep(1000); - WebElement runButton = webDriverGee.findElementByCssSelector(RUN_SCRIPT_BUTTON); - forceClick( runButton ); - }catch (Exception e2) { - // TODO: handle exception - } - } + private RecordFilter getRecordFilter( ) { + RecordFilter recordFilter = new RecordFilter(earthSurveyService.getCollectSurvey(), earthSurveyService.getRootEntityDefinition().getId()); + recordFilter.setStepGreaterOrEqual(Step.ENTRY); + return recordFilter; + } + public CSVDataExportProcess exportSurveyAsFusionTable(File exportToFile, boolean includeCodeItemLabelColumn) { + + final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); + csvDataExportProcess.setOutputFile(exportToFile); + csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); + csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; + + CSVDataExportParameters config = new CSVDataExportParameters(); + config.setIncludeAllAncestorAttributes(true); + config.setLanguageCode( localPropertiesService.getValue(EarthProperty.UI_LANGUAGE) ); + config.setIncludeCodeItemPositionColumn(true); + config.setIncludeKMLColumnForCoordinates(true); + config.setIncludeCodeItemLabelColumn( includeCodeItemLabelColumn ); + csvDataExportProcess.setConfiguration(config); + return csvDataExportProcess; } - private void sendThroughClipboard(WebElement textArea, String contents) { - Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); - StringSelection clipboardtext = new StringSelection(contents); - clipboard.setContents(clipboardtext, null); - Keys controlChar = Keys.CONTROL; - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { - controlChar = Keys.COMMAND; - } - textArea.sendKeys(Keys.chord(controlChar, "a")); - textArea.sendKeys(Keys.chord(controlChar, "v")); + public XMLDataExportProcess exportSurveyAsZipWithXml(File exportToFile, Date modifiedSince) throws Exception { + final XMLDataExportProcess xmlDataExportProcess = applicationContext.getBean(XMLDataExportProcess.class); + xmlDataExportProcess.setOutputFile(exportToFile); + xmlDataExportProcess.setRootEntityName(EarthConstants.ROOT_ENTITY_NAME); + xmlDataExportProcess.setSurvey(earthSurveyService.getCollectSurvey()); + xmlDataExportProcess.setModifiedSince(modifiedSince); + xmlDataExportProcess.setIncludeIdm(true); + xmlDataExportProcess.setSteps(new Step[] { Step.ENTRY }); + return xmlDataExportProcess; } - private void sendThroughKeys(WebElement textArea, String contents) - throws InterruptedException { - // Command key (apple key) is not working on Chrome on Mac. Try with the right click - // This is not going to be fixed by Selenium - // Remove comments so it is faster to send the text! - String noComments = removeComments(contents); + public CSVDataImportProcess getCsvImporterProcess(File importFromFile) { + final CSVDataImportProcess importProcess = applicationContext.getBean("transactionalCsvDataImportProcess", CSVDataImportProcess.class); + + importProcess.setFile(importFromFile); + importProcess.setSurvey(earthSurveyService.getCollectSurvey()); + importProcess.setParentEntityDefinitionId(earthSurveyService.getRootEntityDefinition().getId()); + importProcess.setStep(Step.ENTRY ); + CSVDataImportSettings settings = new CSVDataImportSettings(); + settings.setRecordValidationEnabled(false); + settings.setInsertNewRecords(false); + settings.setNewRecordVersionName(null); + settings.setReportNoRecordFoundErrors(false); + importProcess.setSettings(settings); + return importProcess; + } - // Clear the code area - WebElement clearButton = webDriverGee.findElementByCssSelector(RESET_SCRIPT_BUTTON); - forceClick( clearButton ); + public XMLDataImportProcess getImportSummary(File zipWithXml, boolean importNonFinishedPlots) throws Exception { + final XMLDataImportProcess dataImportProcess = applicationContext.getBean(XMLDataImportProcess.class); + dataImportProcess.init(); + dataImportProcess.setFile(zipWithXml); + dataImportProcess.setValidateRecords(false); + dataImportProcess.prepareToStartSummaryCreation(); - StringBuilder fixedScriptForMac = new StringBuilder(); - String[] lines = noComments.split("\\n"); - for (String line : lines) { - // Send the content of the script - String trimmedLine = line.trim(); + if( !importNonFinishedPlots ){ // Import only plots whose actively_saved state is set to true + dataImportProcess.setIncludeRecordPredicate( new Predicate() { - // Add Spaces after "{" so we avoid the automatic closing of the method by GEE - // Playground JS - trimmedLine = trimmedLine.replace("{", "{ "); + @Override + public boolean evaluate(CollectRecord record) { + boolean include = true; - if (!StringUtils.isBlank(trimmedLine)) { - fixedScriptForMac = fixedScriptForMac.append(trimmedLine).append("\n"); - } - } + try { + final BooleanAttribute node = (BooleanAttribute) record.getNodeByPath("/plot/" + EarthConstants.ACTIVELY_SAVED_ATTRIBUTE_NAME); //$NON-NLS-1$ - fixedScriptForMac.append("//THE END"); // Don't remove this!!! this way we mark the point where there should be no trailing character removal - Keys controlChar = Keys.CONTROL; - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { - controlChar = Keys.COMMAND; - } - textArea.sendKeys(Keys.chord(controlChar, "a")); - textArea.sendKeys(fixedScriptForMac); -/* - Thread.sleep(500); - // Fix the extra characters added by removing the last 10 chars ( this is a bug from Selenium! ) - textArea.sendKeys(Keys.PAGE_DOWN); - Thread.sleep(500); - textArea.sendKeys(Keys.PAGE_DOWN); - */ - } - - private void forceClick( WebElement element ) { - JavascriptExecutor js = webDriverGee; - js.executeScript("arguments[0].click();", element); - } + include = (node == null || (node != null && !node.isEmpty() && node.getValue().getValue()) ); + } catch (Exception e) { + logger.error("No \"/plot/actively_saved\" node found ", e ); //$NON-NLS-1$ + } - public String removeComments(String contents) { - - String wholeCode = contents; - wholeCode = wholeCode.replace("http://", ""); - wholeCode = wholeCode.replace("https://", ""); - wholeCode = wholeCode.replace("\r", ""); - - StringBuilder noComments = new StringBuilder(""); - int indexComments = contents.indexOf("//"); - if (indexComments != -1) { - while (indexComments >= 0) { - int endOfLine = contents.indexOf('\n', indexComments); - if (endOfLine != -1) - indexComments = contents.indexOf("//", endOfLine + 2); - else { - break; + return include; } - - if (indexComments != -1) - noComments = noComments.append(contents.substring(endOfLine, indexComments)); - else - noComments = noComments.append(contents.substring(endOfLine)); - } - return noComments.toString(); - } else { - return wholeCode; + }); } + return dataImportProcess; } - /** - * Get the GEE Playground script that should be used. There is an standard one - * that resides in resources/eePlaygroundScript.fmt but a project might have its - * own script. - * - * @return The generic script in the resources folder or the file called - * eePlaygroundScript.fmt in the same folder where the current project - * file resides - */ - private String getGeeCodeEditorTemplate() { + public void importRecordsFrom(File zipWithXml, XMLDataImportProcess dataImportProcess, List listConflictingRecords) throws Exception { + final List entryIdsToImport = new ArrayList(); - String projectPlaygroundScript = getProjectGeeScript(); - if (projectPlaygroundScript != null) { - return projectPlaygroundScript; - } else { - return GeolocalizeMapService.FREEMARKER_GEE_CODE_EDITOR_TEMPLATE; // New format name since version 1.6.20 - } + addRecordsToImportList( listConflictingRecords, entryIdsToImport); + addRecordsToImportList( dataImportProcess.getSummary().getRecordsToImport(),entryIdsToImport); - } + dataImportProcess.setEntryIdsToImport(entryIdsToImport); + dataImportProcess.prepareToStartImport(); + dataImportProcess.call(); - /** - * @return The path to the GEE Code Editor generic script or the one that is - * specified in the project folder if it exists. - */ - private String getProjectGeeScript() { - // Is there a "eePlaygroundScript.fmt" file in the same folder than in the - // metadata file folder? - File projectGeePlayground = new File(localPropertiesService.getProjectFolder() + File.separatorChar - + GeolocalizeMapService.FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME); - - // Is there a "eeCodeEditorScript.fmt" file in the same folder than in the - // metadata file folder? NEW NAME AFTER 12/2017!!! - File projectGeeCodeEditor = new File(localPropertiesService.getProjectFolder() + File.separatorChar - + GeolocalizeMapService.FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME); - - String geeFilePath = null; - if (projectGeeCodeEditor.exists()) { // The new format name takes precedence - geeFilePath = projectGeeCodeEditor.getAbsolutePath(); - } else if (projectGeePlayground.exists()) { - geeFilePath = projectGeePlayground.getAbsolutePath(); + int conflictingRecordsAdded = 0; + if (listConflictingRecords != null) { + conflictingRecordsAdded = listConflictingRecords.size(); } - return geeFilePath; - } - public void loadCodeEditorScript(SimplePlacemarkObject placemarkObject, RemoteWebDriver webDriverGeePlayground) { - this.placemarkObject = placemarkObject; - loadCodeEditorScript(webDriverGeePlayground); + logger.warn("Data imported into db. Number of Records imported : {} Conflicting records added : {}" //$NON-NLS-1$ //$NON-NLS-2$ + ,entryIdsToImport.size(), conflictingRecordsAdded); } - public void disableCodeEditorAutocomplete(RemoteWebDriver webDriverCodeEditor) { - this.webDriverGee = webDriverCodeEditor; - try { - if (!isCodeEditorShowing()) { - // Open GEE Playground - if (!browserService.isDriverWorking(webDriverGee) || webDriverGee.getCurrentUrl() == null - || !webDriverGee.getCurrentUrl().contains("google")) { - webDriverGee = browserService.navigateTo(localPropertiesService.getGeePlaygoundUrl(), webDriverGee); - browserService.setWebDriverGeeCodeEditor(webDriverGee); - } - - // Initially the login page appears! - while (!isCodeEditorShowing()) { // 5 minutes a 2 seconds == 30 * 5 = 150 - Thread.sleep(2000); - } + public AbstractProcess exportSurveyAsBackup(File exportToFile) { + final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); + csvDataExportProcess.setOutputFile(exportToFile); + csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); + csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; - } else { - disableAutoComplete(); - } - } catch (final NoSuchElementException e) { - // This is a well known exception. Down-grade if to warning - logger.warn("Error when opening Earth Engine browser window. Known problem", e); - } catch (final Exception e) { - // This is a well known exception. - logger.error("Error when opening Earth Engine browser window", e); - } + CSVDataExportParameters config = new CSVDataExportParameters(); + config.setIncludeAllAncestorAttributes(true); + config.setIncludeCodeItemPositionColumn(true); + config.setIncludeKMLColumnForCoordinates(true); + csvDataExportProcess.setConfiguration(config); + return csvDataExportProcess; } - private void disableAutoComplete() { - // Display the settings in Google Earth Engine Code Editor (this emulates - // clicking on the settings icon) - webDriverGee.findElementByClassName("settings-menu-button").click(); - // Get the Div that is the parent of the one with text that contains - // Autocomplete - RemoteWebElement autocompleteButton = (RemoteWebElement) webDriverGee - .findElementByXPath("//div[contains(text(), \"Autocomplete\")]/.."); - - if (isAutocompleChecked(autocompleteButton)) { - // Disable the Autocomplete of special characters - autocompleteButton.click(); - } - + public EarthSurveyService getEarthSurveyService() { + return earthSurveyService; } - public boolean isAutocompleChecked(RemoteWebElement autocompleteButton) { - String buttonChecked = autocompleteButton.getAttribute("aria-checked"); - return buttonChecked.equals("true"); - } - - private void loadCodeEditorScript(RemoteWebDriver webDriverCodeEditor) { - this.webDriverGee = webDriverCodeEditor; - Thread loadGee = new Thread( - "Opening GEE Playground " + (placemarkObject != null ? placemarkObject.toString() : "")) { - @Override - public void run() { - try { - if (!isCodeEditorShowing()) { - // Open GEE Code Editor - if (!browserService.isDriverWorking(webDriverGee) || webDriverGee.getCurrentUrl() == null - || !webDriverGee.getCurrentUrl().contains("google")) { - webDriverGee = browserService.navigateTo(localPropertiesService.getGeePlaygoundUrl(), - webDriverGee); - browserService.setWebDriverGeeCodeEditor(webDriverGee); - } - // Initially the login page appears! - while (!isCodeEditorShowing()) { - sleep(2000); - } - } - runScript(); - } catch (final NoSuchElementException e) { - // This is a well known exception. Down-grade if to warning - logger.warn("Error when opening Earth Engine browser window. Known problem", e); - } catch (final Exception e) { - // This is a well known exception. - logger.error("Error when opening Earth Engine browser window", e); - } - } - }; - loadGee.start(); - } } From 1145c31ee4d8b61755db0734552cb5a7ea38fb16 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:47 +0100 Subject: [PATCH 0131/1620] New translations .gitignore (English) --- .../earth/app/view/Messages_en.properties | 320 +----------------- 1 file changed, 1 insertion(+), 319 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index c2259f5db0..fa1df1b41e 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,319 +1 @@ -package org.openforis.collect.earth.app.service; - -import java.awt.Toolkit; -import java.awt.datatransfer.Clipboard; -import java.awt.datatransfer.StringSelection; -import java.io.File; -import java.io.IOException; -import java.net.URISyntaxException; -import java.net.URL; -import java.nio.charset.StandardCharsets; -import java.util.NoSuchElementException; - -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; -import org.openqa.selenium.By; -import org.openqa.selenium.JavascriptExecutor; -import org.openqa.selenium.Keys; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.remote.RemoteWebDriver; -import org.openqa.selenium.remote.RemoteWebElement; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import liquibase.repackaged.org.apache.commons.lang3.SystemUtils; - - -@Component -public class CodeEditorHandlerThread { - private static final String RUN_SCRIPT_BUTTON = "button.run-button"; - private static final String RESET_SCRIPT_BUTTON = "button.reset-button"; - private SimplePlacemarkObject placemarkObject; - - private RemoteWebDriver webDriverGee; - - @Autowired - private BrowserService browserService; - private Logger logger = LoggerFactory.getLogger(CodeEditorHandlerThread.class); - - @Autowired - private GeolocalizeMapService geoLocalizeTemplateService; - - @Autowired - private LocalPropertiesService localPropertiesService; - - public boolean isCodeEditorShowing() { - return BrowserService.isCssElementPresent(RUN_SCRIPT_BUTTON, webDriverGee); - } - - public void runScript() throws IOException, URISyntaxException, InterruptedException { - - - try { - WebElement resetButton = webDriverGee.findElementByCssSelector(RESET_SCRIPT_BUTTON); - - forceClick( resetButton ); - - URL fileWithScript = geoLocalizeTemplateService.getTemporaryUrl(placemarkObject, getGeeCodeEditorTemplate()); - - WebElement textArea = webDriverGee.findElement(By.className("ace_text-input")); - - String contents = FileUtils.readFileToString(new File(fileWithScript.toURI()), StandardCharsets.UTF_8 ); - - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { - sendThroughKeys(textArea, contents); - - } else { - sendThroughClipboard(textArea, contents); - try { - // Fix bug provoked by antivirus not accepting the control characters sent by Selenium - WebElement element = webDriverGee.findElement(By.className("ace_line") ); - if( element!= null && element.getAttribute("value").trim().equals("av") ) { - sendThroughKeys(textArea, contents); - } - } catch (Exception e) { - logger.warn("Error while refreshing code editor", e); - - } - } - - Thread.sleep(1000); - WebElement runButton = webDriverGee.findElementByCssSelector(RUN_SCRIPT_BUTTON); - forceClick( runButton ); - } catch (NoSuchElementException e) { - try { - // retry - Thread.sleep(1000); - WebElement runButton = webDriverGee.findElementByCssSelector(RUN_SCRIPT_BUTTON); - forceClick( runButton ); - }catch (Exception e2) { - // TODO: handle exception - } - } - - } - - private void sendThroughClipboard(WebElement textArea, String contents) { - Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); - StringSelection clipboardtext = new StringSelection(contents); - clipboard.setContents(clipboardtext, null); - Keys controlChar = Keys.CONTROL; - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { - controlChar = Keys.COMMAND; - } - textArea.sendKeys(Keys.chord(controlChar, "a")); - textArea.sendKeys(Keys.chord(controlChar, "v")); - } - - private void sendThroughKeys(WebElement textArea, String contents) - throws InterruptedException { - // Command key (apple key) is not working on Chrome on Mac. Try with the right click - // This is not going to be fixed by Selenium - - // Remove comments so it is faster to send the text! - String noComments = removeComments(contents); - - // Clear the code area - WebElement clearButton = webDriverGee.findElementByCssSelector(RESET_SCRIPT_BUTTON); - forceClick( clearButton ); - - StringBuilder fixedScriptForMac = new StringBuilder(); - String[] lines = noComments.split("\\n"); - for (String line : lines) { - // Send the content of the script - String trimmedLine = line.trim(); - - // Add Spaces after "{" so we avoid the automatic closing of the method by GEE - // Playground JS - trimmedLine = trimmedLine.replace("{", "{ "); - - if (!StringUtils.isBlank(trimmedLine)) { - fixedScriptForMac = fixedScriptForMac.append(trimmedLine).append("\n"); - } - } - - fixedScriptForMac.append("//THE END"); // Don't remove this!!! this way we mark the point where there should be no trailing character removal - Keys controlChar = Keys.CONTROL; - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { - controlChar = Keys.COMMAND; - } - textArea.sendKeys(Keys.chord(controlChar, "a")); - textArea.sendKeys(fixedScriptForMac); -/* - Thread.sleep(500); - // Fix the extra characters added by removing the last 10 chars ( this is a bug from Selenium! ) - textArea.sendKeys(Keys.PAGE_DOWN); - Thread.sleep(500); - textArea.sendKeys(Keys.PAGE_DOWN); - */ - } - - private void forceClick( WebElement element ) { - JavascriptExecutor js = webDriverGee; - js.executeScript("arguments[0].click();", element); - } - - public String removeComments(String contents) { - - String wholeCode = contents; - wholeCode = wholeCode.replace("http://", ""); - wholeCode = wholeCode.replace("https://", ""); - wholeCode = wholeCode.replace("\r", ""); - - StringBuilder noComments = new StringBuilder(""); - int indexComments = contents.indexOf("//"); - if (indexComments != -1) { - while (indexComments >= 0) { - int endOfLine = contents.indexOf('\n', indexComments); - if (endOfLine != -1) - indexComments = contents.indexOf("//", endOfLine + 2); - else { - break; - } - - if (indexComments != -1) - noComments = noComments.append(contents.substring(endOfLine, indexComments)); - else - noComments = noComments.append(contents.substring(endOfLine)); - } - return noComments.toString(); - } else { - return wholeCode; - } - } - - /** - * Get the GEE Playground script that should be used. There is an standard one - * that resides in resources/eePlaygroundScript.fmt but a project might have its - * own script. - * - * @return The generic script in the resources folder or the file called - * eePlaygroundScript.fmt in the same folder where the current project - * file resides - */ - private String getGeeCodeEditorTemplate() { - - String projectPlaygroundScript = getProjectGeeScript(); - if (projectPlaygroundScript != null) { - return projectPlaygroundScript; - } else { - return GeolocalizeMapService.FREEMARKER_GEE_CODE_EDITOR_TEMPLATE; // New format name since version 1.6.20 - } - - } - - /** - * @return The path to the GEE Code Editor generic script or the one that is - * specified in the project folder if it exists. - */ - private String getProjectGeeScript() { - // Is there a "eePlaygroundScript.fmt" file in the same folder than in the - // metadata file folder? - File projectGeePlayground = new File(localPropertiesService.getProjectFolder() + File.separatorChar - + GeolocalizeMapService.FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME); - - // Is there a "eeCodeEditorScript.fmt" file in the same folder than in the - // metadata file folder? NEW NAME AFTER 12/2017!!! - File projectGeeCodeEditor = new File(localPropertiesService.getProjectFolder() + File.separatorChar - + GeolocalizeMapService.FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME); - - String geeFilePath = null; - if (projectGeeCodeEditor.exists()) { // The new format name takes precedence - geeFilePath = projectGeeCodeEditor.getAbsolutePath(); - } else if (projectGeePlayground.exists()) { - geeFilePath = projectGeePlayground.getAbsolutePath(); - } - return geeFilePath; - } - - public void loadCodeEditorScript(SimplePlacemarkObject placemarkObject, RemoteWebDriver webDriverGeePlayground) { - this.placemarkObject = placemarkObject; - loadCodeEditorScript(webDriverGeePlayground); - } - - public void disableCodeEditorAutocomplete(RemoteWebDriver webDriverCodeEditor) { - this.webDriverGee = webDriverCodeEditor; - try { - if (!isCodeEditorShowing()) { - // Open GEE Playground - if (!browserService.isDriverWorking(webDriverGee) || webDriverGee.getCurrentUrl() == null - || !webDriverGee.getCurrentUrl().contains("google")) { - webDriverGee = browserService.navigateTo(localPropertiesService.getGeePlaygoundUrl(), webDriverGee); - browserService.setWebDriverGeeCodeEditor(webDriverGee); - } - - // Initially the login page appears! - while (!isCodeEditorShowing()) { // 5 minutes a 2 seconds == 30 * 5 = 150 - Thread.sleep(2000); - } - - } else { - disableAutoComplete(); - } - - } catch (final NoSuchElementException e) { - // This is a well known exception. Down-grade if to warning - logger.warn("Error when opening Earth Engine browser window. Known problem", e); - } catch (final Exception e) { - // This is a well known exception. - logger.error("Error when opening Earth Engine browser window", e); - } - } - - private void disableAutoComplete() { - // Display the settings in Google Earth Engine Code Editor (this emulates - // clicking on the settings icon) - webDriverGee.findElementByClassName("settings-menu-button").click(); - // Get the Div that is the parent of the one with text that contains - // Autocomplete - RemoteWebElement autocompleteButton = (RemoteWebElement) webDriverGee - .findElementByXPath("//div[contains(text(), \"Autocomplete\")]/.."); - - if (isAutocompleChecked(autocompleteButton)) { - // Disable the Autocomplete of special characters - autocompleteButton.click(); - } - - } - - public boolean isAutocompleChecked(RemoteWebElement autocompleteButton) { - String buttonChecked = autocompleteButton.getAttribute("aria-checked"); - return buttonChecked.equals("true"); - } - - private void loadCodeEditorScript(RemoteWebDriver webDriverCodeEditor) { - this.webDriverGee = webDriverCodeEditor; - Thread loadGee = new Thread( - "Opening GEE Playground " + (placemarkObject != null ? placemarkObject.toString() : "")) { - @Override - public void run() { - try { - if (!isCodeEditorShowing()) { - // Open GEE Code Editor - if (!browserService.isDriverWorking(webDriverGee) || webDriverGee.getCurrentUrl() == null - || !webDriverGee.getCurrentUrl().contains("google")) { - webDriverGee = browserService.navigateTo(localPropertiesService.getGeePlaygoundUrl(), - webDriverGee); - browserService.setWebDriverGeeCodeEditor(webDriverGee); - } - // Initially the login page appears! - while (!isCodeEditorShowing()) { - sleep(2000); - } - } - runScript(); - } catch (final NoSuchElementException e) { - // This is a well known exception. Down-grade if to warning - logger.warn("Error when opening Earth Engine browser window. Known problem", e); - } catch (final Exception e) { - // This is a well known exception. - logger.error("Error when opening Earth Engine browser window", e); - } - } - }; - loadGee.start(); - } -} +/DataRepositoryService.java_bc From df58f932385e7ade6484f1f2b339e84589c8e98d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:48 +0100 Subject: [PATCH 0132/1620] New translations .gitignore (Spanish) --- .../earth/app/view/Messages_es.properties | 320 +----------------- 1 file changed, 1 insertion(+), 319 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index c2259f5db0..fa1df1b41e 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,319 +1 @@ -package org.openforis.collect.earth.app.service; - -import java.awt.Toolkit; -import java.awt.datatransfer.Clipboard; -import java.awt.datatransfer.StringSelection; -import java.io.File; -import java.io.IOException; -import java.net.URISyntaxException; -import java.net.URL; -import java.nio.charset.StandardCharsets; -import java.util.NoSuchElementException; - -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; -import org.openqa.selenium.By; -import org.openqa.selenium.JavascriptExecutor; -import org.openqa.selenium.Keys; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.remote.RemoteWebDriver; -import org.openqa.selenium.remote.RemoteWebElement; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import liquibase.repackaged.org.apache.commons.lang3.SystemUtils; - - -@Component -public class CodeEditorHandlerThread { - private static final String RUN_SCRIPT_BUTTON = "button.run-button"; - private static final String RESET_SCRIPT_BUTTON = "button.reset-button"; - private SimplePlacemarkObject placemarkObject; - - private RemoteWebDriver webDriverGee; - - @Autowired - private BrowserService browserService; - private Logger logger = LoggerFactory.getLogger(CodeEditorHandlerThread.class); - - @Autowired - private GeolocalizeMapService geoLocalizeTemplateService; - - @Autowired - private LocalPropertiesService localPropertiesService; - - public boolean isCodeEditorShowing() { - return BrowserService.isCssElementPresent(RUN_SCRIPT_BUTTON, webDriverGee); - } - - public void runScript() throws IOException, URISyntaxException, InterruptedException { - - - try { - WebElement resetButton = webDriverGee.findElementByCssSelector(RESET_SCRIPT_BUTTON); - - forceClick( resetButton ); - - URL fileWithScript = geoLocalizeTemplateService.getTemporaryUrl(placemarkObject, getGeeCodeEditorTemplate()); - - WebElement textArea = webDriverGee.findElement(By.className("ace_text-input")); - - String contents = FileUtils.readFileToString(new File(fileWithScript.toURI()), StandardCharsets.UTF_8 ); - - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { - sendThroughKeys(textArea, contents); - - } else { - sendThroughClipboard(textArea, contents); - try { - // Fix bug provoked by antivirus not accepting the control characters sent by Selenium - WebElement element = webDriverGee.findElement(By.className("ace_line") ); - if( element!= null && element.getAttribute("value").trim().equals("av") ) { - sendThroughKeys(textArea, contents); - } - } catch (Exception e) { - logger.warn("Error while refreshing code editor", e); - - } - } - - Thread.sleep(1000); - WebElement runButton = webDriverGee.findElementByCssSelector(RUN_SCRIPT_BUTTON); - forceClick( runButton ); - } catch (NoSuchElementException e) { - try { - // retry - Thread.sleep(1000); - WebElement runButton = webDriverGee.findElementByCssSelector(RUN_SCRIPT_BUTTON); - forceClick( runButton ); - }catch (Exception e2) { - // TODO: handle exception - } - } - - } - - private void sendThroughClipboard(WebElement textArea, String contents) { - Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); - StringSelection clipboardtext = new StringSelection(contents); - clipboard.setContents(clipboardtext, null); - Keys controlChar = Keys.CONTROL; - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { - controlChar = Keys.COMMAND; - } - textArea.sendKeys(Keys.chord(controlChar, "a")); - textArea.sendKeys(Keys.chord(controlChar, "v")); - } - - private void sendThroughKeys(WebElement textArea, String contents) - throws InterruptedException { - // Command key (apple key) is not working on Chrome on Mac. Try with the right click - // This is not going to be fixed by Selenium - - // Remove comments so it is faster to send the text! - String noComments = removeComments(contents); - - // Clear the code area - WebElement clearButton = webDriverGee.findElementByCssSelector(RESET_SCRIPT_BUTTON); - forceClick( clearButton ); - - StringBuilder fixedScriptForMac = new StringBuilder(); - String[] lines = noComments.split("\\n"); - for (String line : lines) { - // Send the content of the script - String trimmedLine = line.trim(); - - // Add Spaces after "{" so we avoid the automatic closing of the method by GEE - // Playground JS - trimmedLine = trimmedLine.replace("{", "{ "); - - if (!StringUtils.isBlank(trimmedLine)) { - fixedScriptForMac = fixedScriptForMac.append(trimmedLine).append("\n"); - } - } - - fixedScriptForMac.append("//THE END"); // Don't remove this!!! this way we mark the point where there should be no trailing character removal - Keys controlChar = Keys.CONTROL; - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { - controlChar = Keys.COMMAND; - } - textArea.sendKeys(Keys.chord(controlChar, "a")); - textArea.sendKeys(fixedScriptForMac); -/* - Thread.sleep(500); - // Fix the extra characters added by removing the last 10 chars ( this is a bug from Selenium! ) - textArea.sendKeys(Keys.PAGE_DOWN); - Thread.sleep(500); - textArea.sendKeys(Keys.PAGE_DOWN); - */ - } - - private void forceClick( WebElement element ) { - JavascriptExecutor js = webDriverGee; - js.executeScript("arguments[0].click();", element); - } - - public String removeComments(String contents) { - - String wholeCode = contents; - wholeCode = wholeCode.replace("http://", ""); - wholeCode = wholeCode.replace("https://", ""); - wholeCode = wholeCode.replace("\r", ""); - - StringBuilder noComments = new StringBuilder(""); - int indexComments = contents.indexOf("//"); - if (indexComments != -1) { - while (indexComments >= 0) { - int endOfLine = contents.indexOf('\n', indexComments); - if (endOfLine != -1) - indexComments = contents.indexOf("//", endOfLine + 2); - else { - break; - } - - if (indexComments != -1) - noComments = noComments.append(contents.substring(endOfLine, indexComments)); - else - noComments = noComments.append(contents.substring(endOfLine)); - } - return noComments.toString(); - } else { - return wholeCode; - } - } - - /** - * Get the GEE Playground script that should be used. There is an standard one - * that resides in resources/eePlaygroundScript.fmt but a project might have its - * own script. - * - * @return The generic script in the resources folder or the file called - * eePlaygroundScript.fmt in the same folder where the current project - * file resides - */ - private String getGeeCodeEditorTemplate() { - - String projectPlaygroundScript = getProjectGeeScript(); - if (projectPlaygroundScript != null) { - return projectPlaygroundScript; - } else { - return GeolocalizeMapService.FREEMARKER_GEE_CODE_EDITOR_TEMPLATE; // New format name since version 1.6.20 - } - - } - - /** - * @return The path to the GEE Code Editor generic script or the one that is - * specified in the project folder if it exists. - */ - private String getProjectGeeScript() { - // Is there a "eePlaygroundScript.fmt" file in the same folder than in the - // metadata file folder? - File projectGeePlayground = new File(localPropertiesService.getProjectFolder() + File.separatorChar - + GeolocalizeMapService.FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME); - - // Is there a "eeCodeEditorScript.fmt" file in the same folder than in the - // metadata file folder? NEW NAME AFTER 12/2017!!! - File projectGeeCodeEditor = new File(localPropertiesService.getProjectFolder() + File.separatorChar - + GeolocalizeMapService.FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME); - - String geeFilePath = null; - if (projectGeeCodeEditor.exists()) { // The new format name takes precedence - geeFilePath = projectGeeCodeEditor.getAbsolutePath(); - } else if (projectGeePlayground.exists()) { - geeFilePath = projectGeePlayground.getAbsolutePath(); - } - return geeFilePath; - } - - public void loadCodeEditorScript(SimplePlacemarkObject placemarkObject, RemoteWebDriver webDriverGeePlayground) { - this.placemarkObject = placemarkObject; - loadCodeEditorScript(webDriverGeePlayground); - } - - public void disableCodeEditorAutocomplete(RemoteWebDriver webDriverCodeEditor) { - this.webDriverGee = webDriverCodeEditor; - try { - if (!isCodeEditorShowing()) { - // Open GEE Playground - if (!browserService.isDriverWorking(webDriverGee) || webDriverGee.getCurrentUrl() == null - || !webDriverGee.getCurrentUrl().contains("google")) { - webDriverGee = browserService.navigateTo(localPropertiesService.getGeePlaygoundUrl(), webDriverGee); - browserService.setWebDriverGeeCodeEditor(webDriverGee); - } - - // Initially the login page appears! - while (!isCodeEditorShowing()) { // 5 minutes a 2 seconds == 30 * 5 = 150 - Thread.sleep(2000); - } - - } else { - disableAutoComplete(); - } - - } catch (final NoSuchElementException e) { - // This is a well known exception. Down-grade if to warning - logger.warn("Error when opening Earth Engine browser window. Known problem", e); - } catch (final Exception e) { - // This is a well known exception. - logger.error("Error when opening Earth Engine browser window", e); - } - } - - private void disableAutoComplete() { - // Display the settings in Google Earth Engine Code Editor (this emulates - // clicking on the settings icon) - webDriverGee.findElementByClassName("settings-menu-button").click(); - // Get the Div that is the parent of the one with text that contains - // Autocomplete - RemoteWebElement autocompleteButton = (RemoteWebElement) webDriverGee - .findElementByXPath("//div[contains(text(), \"Autocomplete\")]/.."); - - if (isAutocompleChecked(autocompleteButton)) { - // Disable the Autocomplete of special characters - autocompleteButton.click(); - } - - } - - public boolean isAutocompleChecked(RemoteWebElement autocompleteButton) { - String buttonChecked = autocompleteButton.getAttribute("aria-checked"); - return buttonChecked.equals("true"); - } - - private void loadCodeEditorScript(RemoteWebDriver webDriverCodeEditor) { - this.webDriverGee = webDriverCodeEditor; - Thread loadGee = new Thread( - "Opening GEE Playground " + (placemarkObject != null ? placemarkObject.toString() : "")) { - @Override - public void run() { - try { - if (!isCodeEditorShowing()) { - // Open GEE Code Editor - if (!browserService.isDriverWorking(webDriverGee) || webDriverGee.getCurrentUrl() == null - || !webDriverGee.getCurrentUrl().contains("google")) { - webDriverGee = browserService.navigateTo(localPropertiesService.getGeePlaygoundUrl(), - webDriverGee); - browserService.setWebDriverGeeCodeEditor(webDriverGee); - } - // Initially the login page appears! - while (!isCodeEditorShowing()) { - sleep(2000); - } - } - runScript(); - } catch (final NoSuchElementException e) { - // This is a well known exception. Down-grade if to warning - logger.warn("Error when opening Earth Engine browser window. Known problem", e); - } catch (final Exception e) { - // This is a well known exception. - logger.error("Error when opening Earth Engine browser window", e); - } - } - }; - loadGee.start(); - } -} +/DataRepositoryService.java_bc From 5aa7bac21476c54b566349a315b9fa49df05d6b2 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:49 +0100 Subject: [PATCH 0133/1620] New translations PlacemarkDataController.java (Spanish) --- .../earth/app/view/Messages_es.properties | 46 ++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index fa1df1b41e..fcb3cec51d 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1 +1,45 @@ -/DataRepositoryService.java_bc +package org.openforis.collect.earth.app.server; + +import java.io.IOException; + +import javax.servlet.http.HttpServletResponse; + +import org.openforis.collect.earth.app.logging.GAlogger; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; + +/** + * Controller to load and store the information that is stored in Collect Earth for one placemark (plot) + * + * @author Alfonso Sanchez-Paus Diaz + * @author S. Ricci + * + */ +@Controller +public class PlacemarkDataController extends AbstractPlacemarkDataController { + @Override + @GetMapping(value="/placemark-info-expanded") + public void placemarkInfoExpanded(@RequestParam("id") String placemarkId, HttpServletResponse response) throws IOException { + try{ + super.placemarkInfoExpanded(placemarkId, response); + }catch(Exception e){ + logger.error("Error saving data" , e); + } + } + + @Override + @PostMapping(value="/save-data-expanded") + public void saveDataExpanded(PlacemarkUpdateRequest updateRequest, HttpServletResponse response) throws IOException { + try{ + super.saveDataExpanded(updateRequest, response); + if( updateRequest.getValues().get("collect_boolean_actively_saved").equals("true")) { + GAlogger.logGAnalytics("Plot saved"); + } + }catch(Exception e){ + logger.error("Error saving data" , e); + } + } + +} From fab5813a34dfdb7299ad27cb0a03bb5b964f1974 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:50 +0100 Subject: [PATCH 0134/1620] New translations PlacemarkPlanetImagery.java (French) --- .../earth/app/view/Messages_fr.properties | 224 +++++------------- 1 file changed, 64 insertions(+), 160 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index eb9f542d80..df62b703cb 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,194 +1,98 @@ -package org.openforis.collect.earth.app.service; +package org.openforis.collect.earth.app.server; -import java.io.File; -import java.util.ArrayList; +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; import java.util.Date; -import java.util.List; - -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.io.data.CSVDataExportProcess; -import org.openforis.collect.io.data.CSVDataImportProcess; -import org.openforis.collect.io.data.DataExportStatus; -import org.openforis.collect.io.data.DataImportSummaryItem; -import org.openforis.collect.io.data.XMLDataExportProcess; -import org.openforis.collect.io.data.XMLDataImportProcess; -import org.openforis.collect.io.data.csv.CSVDataExportParameters; -import org.openforis.collect.io.data.csv.CSVDataImportSettings; -import org.openforis.collect.manager.process.AbstractProcess; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.RecordFilter; -import org.openforis.commons.collection.Predicate; -import org.openforis.idm.model.BooleanAttribute; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.planet.DateUtils; +import org.openforis.collect.earth.planet.PlanetImagery; +import org.openforis.collect.earth.planet.PlanetRequestParameters; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.stereotype.Component; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PostMapping; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; /** + * Controller to load and store the information that is stored in Collect Earth + * for one placemark (plot) + * * @author Alfonso Sanchez-Paus Diaz + * @author S. Ricci * */ -@Component -public class DataImportExportService { - - @Autowired - private EarthSurveyService earthSurveyService; +@Controller +public class PlacemarkPlanetImagery extends JsonPocessorServlet { @Autowired - private LocalPropertiesService localPropertiesService; + LocalPropertiesService localPropertiesService; - private final Logger logger = LoggerFactory.getLogger(DataImportExportService.class); - /** - * Use the application context to get a new bean everytime the data is exported ( as a new instance is needed every time) - */ - @Autowired - private ApplicationContext applicationContext; - - private void addRecordsToImportList( List recordsToImport, List entryIdsToImport) { - if (recordsToImport != null) { - List cleanRecordsToImport = recordsToImport; - for (final DataImportSummaryItem importRecord : cleanRecordsToImport) { - entryIdsToImport.add(importRecord.getEntryId()); - } - } - } + // 2015-07-17T10:50:18.650Z + private SimpleDateFormat planetDateFormat = new SimpleDateFormat("yyyy-MM-dd"); - public CSVDataExportProcess exportSurveyAsCsv(File exportToFile, boolean includeCodeItemLabelColumn) { - final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); - csvDataExportProcess.setOutputFile(exportToFile); + @PostMapping(value = "/planetTileUrl") + public void planetTileUrl(HttpServletRequest request, HttpServletResponse response) + throws IOException, ParseException { - csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); - csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; + PlanetRequestParameters params = getRequestParameters(request); - CSVDataExportParameters config = new CSVDataExportParameters(); - config.setIncludeAllAncestorAttributes(true); - config.setIncludeEnumeratedEntities(true); - config.setLanguageCode( localPropertiesService.getValue(EarthProperty.UI_LANGUAGE) ); - config.setIncludeCodeItemLabelColumn(includeCodeItemLabelColumn); - csvDataExportProcess.setConfiguration(config); + PlanetImagery planetImagery = new PlanetImagery(localPropertiesService.getPlanetMapsKey()); + String tileUrl = planetImagery.getLayerUrl(params); - return csvDataExportProcess; + setJsonResponse(response, tileUrl == null ? "" : tileUrl); } - private RecordFilter getRecordFilter( ) { - RecordFilter recordFilter = new RecordFilter(earthSurveyService.getCollectSurvey(), earthSurveyService.getRootEntityDefinition().getId()); - recordFilter.setStepGreaterOrEqual(Step.ENTRY); - return recordFilter; - } + private PlanetRequestParameters getRequestParameters(HttpServletRequest request) throws ParseException { + Date startDate = planetDateFormat.parse(request.getParameter("start")); + Date endDate = getEndDate(request, startDate); - public CSVDataExportProcess exportSurveyAsFusionTable(File exportToFile, boolean includeCodeItemLabelColumn) { - - final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); - csvDataExportProcess.setOutputFile(exportToFile); - csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); - csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; - - CSVDataExportParameters config = new CSVDataExportParameters(); - config.setIncludeAllAncestorAttributes(true); - config.setLanguageCode( localPropertiesService.getValue(EarthProperty.UI_LANGUAGE) ); - config.setIncludeCodeItemPositionColumn(true); - config.setIncludeKMLColumnForCoordinates(true); - config.setIncludeCodeItemLabelColumn( includeCodeItemLabelColumn ); - csvDataExportProcess.setConfiguration(config); - return csvDataExportProcess; - } + double[][][] coords = getCoordinates(request); + String[] itemTypeArray = getItemTypes(request); - public XMLDataExportProcess exportSurveyAsZipWithXml(File exportToFile, Date modifiedSince) throws Exception { - final XMLDataExportProcess xmlDataExportProcess = applicationContext.getBean(XMLDataExportProcess.class); - xmlDataExportProcess.setOutputFile(exportToFile); - xmlDataExportProcess.setRootEntityName(EarthConstants.ROOT_ENTITY_NAME); - xmlDataExportProcess.setSurvey(earthSurveyService.getCollectSurvey()); - xmlDataExportProcess.setModifiedSince(modifiedSince); - xmlDataExportProcess.setIncludeIdm(true); - xmlDataExportProcess.setSteps(new Step[] { Step.ENTRY }); - return xmlDataExportProcess; + return new PlanetRequestParameters(startDate, endDate, coords, itemTypeArray); } - - public CSVDataImportProcess getCsvImporterProcess(File importFromFile) { - final CSVDataImportProcess importProcess = applicationContext.getBean("transactionalCsvDataImportProcess", CSVDataImportProcess.class); - - importProcess.setFile(importFromFile); - importProcess.setSurvey(earthSurveyService.getCollectSurvey()); - importProcess.setParentEntityDefinitionId(earthSurveyService.getRootEntityDefinition().getId()); - importProcess.setStep(Step.ENTRY ); - CSVDataImportSettings settings = new CSVDataImportSettings(); - settings.setRecordValidationEnabled(false); - settings.setInsertNewRecords(false); - settings.setNewRecordVersionName(null); - settings.setReportNoRecordFoundErrors(false); - importProcess.setSettings(settings); - return importProcess; + private double[][][] getCoordinates(HttpServletRequest request) { + Gson gson = new GsonBuilder().create(); + return gson.fromJson(request.getParameter("geometry"), double[][][].class); } - public XMLDataImportProcess getImportSummary(File zipWithXml, boolean importNonFinishedPlots) throws Exception { - final XMLDataImportProcess dataImportProcess = applicationContext.getBean(XMLDataImportProcess.class); - dataImportProcess.init(); - dataImportProcess.setFile(zipWithXml); - dataImportProcess.setValidateRecords(false); - dataImportProcess.prepareToStartSummaryCreation(); - - if( !importNonFinishedPlots ){ // Import only plots whose actively_saved state is set to true - dataImportProcess.setIncludeRecordPredicate( new Predicate() { - - @Override - public boolean evaluate(CollectRecord record) { - boolean include = true; - - try { - final BooleanAttribute node = (BooleanAttribute) record.getNodeByPath("/plot/" + EarthConstants.ACTIVELY_SAVED_ATTRIBUTE_NAME); //$NON-NLS-1$ - - include = (node == null || (node != null && !node.isEmpty() && node.getValue().getValue()) ); - } catch (Exception e) { - logger.error("No \"/plot/actively_saved\" node found ", e ); //$NON-NLS-1$ - } - - return include; - } - }); + private String[] getItemTypes(HttpServletRequest request) { + String[] itemTypeArray = request.getParameterMap().get("itemTypes[]"); + if (itemTypeArray == null || itemTypeArray.length == 0) { + itemTypeArray = new String[] { "PSScene3Band", "PSScene4Band" }; } - return dataImportProcess; + return itemTypeArray; } - public void importRecordsFrom(File zipWithXml, XMLDataImportProcess dataImportProcess, List listConflictingRecords) throws Exception { - final List entryIdsToImport = new ArrayList(); - - addRecordsToImportList( listConflictingRecords, entryIdsToImport); - addRecordsToImportList( dataImportProcess.getSummary().getRecordsToImport(),entryIdsToImport); - - dataImportProcess.setEntryIdsToImport(entryIdsToImport); - dataImportProcess.prepareToStartImport(); - dataImportProcess.call(); - - int conflictingRecordsAdded = 0; - if (listConflictingRecords != null) { - conflictingRecordsAdded = listConflictingRecords.size(); + private Date getEndDate(HttpServletRequest request, Date startDate) throws ParseException { + String endDateString = request.getParameter("end"); + Date endDate = null; + if (StringUtils.isNotBlank(endDateString)) { + endDate = planetDateFormat.parse(endDateString); + } else { + LocalDateTime localDateTime = DateUtils.asLocalDateTime(startDate); + endDate = DateUtils.asDate(localDateTime.plusDays(30)); } - - logger.warn("Data imported into db. Number of Records imported : {} Conflicting records added : {}" //$NON-NLS-1$ //$NON-NLS-2$ - ,entryIdsToImport.size(), conflictingRecordsAdded); + return endDate; } - public AbstractProcess exportSurveyAsBackup(File exportToFile) { - final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); - csvDataExportProcess.setOutputFile(exportToFile); - csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); - csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; + @PostMapping(value = "/planetAvailableImagery") + public void planetAvailableImagery(HttpServletRequest request, HttpServletResponse response) + throws IOException, ParseException { + PlanetRequestParameters params = getRequestParameters(request); - CSVDataExportParameters config = new CSVDataExportParameters(); - config.setIncludeAllAncestorAttributes(true); - config.setIncludeCodeItemPositionColumn(true); - config.setIncludeKMLColumnForCoordinates(true); - csvDataExportProcess.setConfiguration(config); - return csvDataExportProcess; - } - - public EarthSurveyService getEarthSurveyService() { - return earthSurveyService; + PlanetImagery planetImagery = new PlanetImagery(localPropertiesService.getPlanetMapsKey()); + setJsonResponse(response, planetImagery.getAvailableDates(params)); } } From 6f5a1a40504d6d4f47b8d5725b0a3c5a381bb20d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:51 +0100 Subject: [PATCH 0135/1620] New translations PlacemarkDataController.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 348 ++---------------- 1 file changed, 37 insertions(+), 311 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index c2259f5db0..fcb3cec51d 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,319 +1,45 @@ -package org.openforis.collect.earth.app.service; +package org.openforis.collect.earth.app.server; -import java.awt.Toolkit; -import java.awt.datatransfer.Clipboard; -import java.awt.datatransfer.StringSelection; -import java.io.File; import java.io.IOException; -import java.net.URISyntaxException; -import java.net.URL; -import java.nio.charset.StandardCharsets; -import java.util.NoSuchElementException; -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; -import org.openqa.selenium.By; -import org.openqa.selenium.JavascriptExecutor; -import org.openqa.selenium.Keys; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.remote.RemoteWebDriver; -import org.openqa.selenium.remote.RemoteWebElement; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import liquibase.repackaged.org.apache.commons.lang3.SystemUtils; - - -@Component -public class CodeEditorHandlerThread { - private static final String RUN_SCRIPT_BUTTON = "button.run-button"; - private static final String RESET_SCRIPT_BUTTON = "button.reset-button"; - private SimplePlacemarkObject placemarkObject; - - private RemoteWebDriver webDriverGee; - - @Autowired - private BrowserService browserService; - private Logger logger = LoggerFactory.getLogger(CodeEditorHandlerThread.class); - - @Autowired - private GeolocalizeMapService geoLocalizeTemplateService; - - @Autowired - private LocalPropertiesService localPropertiesService; - - public boolean isCodeEditorShowing() { - return BrowserService.isCssElementPresent(RUN_SCRIPT_BUTTON, webDriverGee); - } - - public void runScript() throws IOException, URISyntaxException, InterruptedException { - - - try { - WebElement resetButton = webDriverGee.findElementByCssSelector(RESET_SCRIPT_BUTTON); - - forceClick( resetButton ); - - URL fileWithScript = geoLocalizeTemplateService.getTemporaryUrl(placemarkObject, getGeeCodeEditorTemplate()); - - WebElement textArea = webDriverGee.findElement(By.className("ace_text-input")); - - String contents = FileUtils.readFileToString(new File(fileWithScript.toURI()), StandardCharsets.UTF_8 ); - - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { - sendThroughKeys(textArea, contents); - - } else { - sendThroughClipboard(textArea, contents); - try { - // Fix bug provoked by antivirus not accepting the control characters sent by Selenium - WebElement element = webDriverGee.findElement(By.className("ace_line") ); - if( element!= null && element.getAttribute("value").trim().equals("av") ) { - sendThroughKeys(textArea, contents); - } - } catch (Exception e) { - logger.warn("Error while refreshing code editor", e); - - } +import javax.servlet.http.HttpServletResponse; + +import org.openforis.collect.earth.app.logging.GAlogger; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; + +/** + * Controller to load and store the information that is stored in Collect Earth for one placemark (plot) + * + * @author Alfonso Sanchez-Paus Diaz + * @author S. Ricci + * + */ +@Controller +public class PlacemarkDataController extends AbstractPlacemarkDataController { + @Override + @GetMapping(value="/placemark-info-expanded") + public void placemarkInfoExpanded(@RequestParam("id") String placemarkId, HttpServletResponse response) throws IOException { + try{ + super.placemarkInfoExpanded(placemarkId, response); + }catch(Exception e){ + logger.error("Error saving data" , e); + } + } + + @Override + @PostMapping(value="/save-data-expanded") + public void saveDataExpanded(PlacemarkUpdateRequest updateRequest, HttpServletResponse response) throws IOException { + try{ + super.saveDataExpanded(updateRequest, response); + if( updateRequest.getValues().get("collect_boolean_actively_saved").equals("true")) { + GAlogger.logGAnalytics("Plot saved"); } - - Thread.sleep(1000); - WebElement runButton = webDriverGee.findElementByCssSelector(RUN_SCRIPT_BUTTON); - forceClick( runButton ); - } catch (NoSuchElementException e) { - try { - // retry - Thread.sleep(1000); - WebElement runButton = webDriverGee.findElementByCssSelector(RUN_SCRIPT_BUTTON); - forceClick( runButton ); - }catch (Exception e2) { - // TODO: handle exception - } - } - - } - - private void sendThroughClipboard(WebElement textArea, String contents) { - Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); - StringSelection clipboardtext = new StringSelection(contents); - clipboard.setContents(clipboardtext, null); - Keys controlChar = Keys.CONTROL; - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { - controlChar = Keys.COMMAND; - } - textArea.sendKeys(Keys.chord(controlChar, "a")); - textArea.sendKeys(Keys.chord(controlChar, "v")); - } - - private void sendThroughKeys(WebElement textArea, String contents) - throws InterruptedException { - // Command key (apple key) is not working on Chrome on Mac. Try with the right click - // This is not going to be fixed by Selenium - - // Remove comments so it is faster to send the text! - String noComments = removeComments(contents); - - // Clear the code area - WebElement clearButton = webDriverGee.findElementByCssSelector(RESET_SCRIPT_BUTTON); - forceClick( clearButton ); - - StringBuilder fixedScriptForMac = new StringBuilder(); - String[] lines = noComments.split("\\n"); - for (String line : lines) { - // Send the content of the script - String trimmedLine = line.trim(); - - // Add Spaces after "{" so we avoid the automatic closing of the method by GEE - // Playground JS - trimmedLine = trimmedLine.replace("{", "{ "); - - if (!StringUtils.isBlank(trimmedLine)) { - fixedScriptForMac = fixedScriptForMac.append(trimmedLine).append("\n"); - } - } - - fixedScriptForMac.append("//THE END"); // Don't remove this!!! this way we mark the point where there should be no trailing character removal - Keys controlChar = Keys.CONTROL; - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { - controlChar = Keys.COMMAND; + }catch(Exception e){ + logger.error("Error saving data" , e); } - textArea.sendKeys(Keys.chord(controlChar, "a")); - textArea.sendKeys(fixedScriptForMac); -/* - Thread.sleep(500); - // Fix the extra characters added by removing the last 10 chars ( this is a bug from Selenium! ) - textArea.sendKeys(Keys.PAGE_DOWN); - Thread.sleep(500); - textArea.sendKeys(Keys.PAGE_DOWN); - */ } - private void forceClick( WebElement element ) { - JavascriptExecutor js = webDriverGee; - js.executeScript("arguments[0].click();", element); - } - - public String removeComments(String contents) { - - String wholeCode = contents; - wholeCode = wholeCode.replace("http://", ""); - wholeCode = wholeCode.replace("https://", ""); - wholeCode = wholeCode.replace("\r", ""); - - StringBuilder noComments = new StringBuilder(""); - int indexComments = contents.indexOf("//"); - if (indexComments != -1) { - while (indexComments >= 0) { - int endOfLine = contents.indexOf('\n', indexComments); - if (endOfLine != -1) - indexComments = contents.indexOf("//", endOfLine + 2); - else { - break; - } - - if (indexComments != -1) - noComments = noComments.append(contents.substring(endOfLine, indexComments)); - else - noComments = noComments.append(contents.substring(endOfLine)); - } - return noComments.toString(); - } else { - return wholeCode; - } - } - - /** - * Get the GEE Playground script that should be used. There is an standard one - * that resides in resources/eePlaygroundScript.fmt but a project might have its - * own script. - * - * @return The generic script in the resources folder or the file called - * eePlaygroundScript.fmt in the same folder where the current project - * file resides - */ - private String getGeeCodeEditorTemplate() { - - String projectPlaygroundScript = getProjectGeeScript(); - if (projectPlaygroundScript != null) { - return projectPlaygroundScript; - } else { - return GeolocalizeMapService.FREEMARKER_GEE_CODE_EDITOR_TEMPLATE; // New format name since version 1.6.20 - } - - } - - /** - * @return The path to the GEE Code Editor generic script or the one that is - * specified in the project folder if it exists. - */ - private String getProjectGeeScript() { - // Is there a "eePlaygroundScript.fmt" file in the same folder than in the - // metadata file folder? - File projectGeePlayground = new File(localPropertiesService.getProjectFolder() + File.separatorChar - + GeolocalizeMapService.FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME); - - // Is there a "eeCodeEditorScript.fmt" file in the same folder than in the - // metadata file folder? NEW NAME AFTER 12/2017!!! - File projectGeeCodeEditor = new File(localPropertiesService.getProjectFolder() + File.separatorChar - + GeolocalizeMapService.FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME); - - String geeFilePath = null; - if (projectGeeCodeEditor.exists()) { // The new format name takes precedence - geeFilePath = projectGeeCodeEditor.getAbsolutePath(); - } else if (projectGeePlayground.exists()) { - geeFilePath = projectGeePlayground.getAbsolutePath(); - } - return geeFilePath; - } - - public void loadCodeEditorScript(SimplePlacemarkObject placemarkObject, RemoteWebDriver webDriverGeePlayground) { - this.placemarkObject = placemarkObject; - loadCodeEditorScript(webDriverGeePlayground); - } - - public void disableCodeEditorAutocomplete(RemoteWebDriver webDriverCodeEditor) { - this.webDriverGee = webDriverCodeEditor; - try { - if (!isCodeEditorShowing()) { - // Open GEE Playground - if (!browserService.isDriverWorking(webDriverGee) || webDriverGee.getCurrentUrl() == null - || !webDriverGee.getCurrentUrl().contains("google")) { - webDriverGee = browserService.navigateTo(localPropertiesService.getGeePlaygoundUrl(), webDriverGee); - browserService.setWebDriverGeeCodeEditor(webDriverGee); - } - - // Initially the login page appears! - while (!isCodeEditorShowing()) { // 5 minutes a 2 seconds == 30 * 5 = 150 - Thread.sleep(2000); - } - - } else { - disableAutoComplete(); - } - - } catch (final NoSuchElementException e) { - // This is a well known exception. Down-grade if to warning - logger.warn("Error when opening Earth Engine browser window. Known problem", e); - } catch (final Exception e) { - // This is a well known exception. - logger.error("Error when opening Earth Engine browser window", e); - } - } - - private void disableAutoComplete() { - // Display the settings in Google Earth Engine Code Editor (this emulates - // clicking on the settings icon) - webDriverGee.findElementByClassName("settings-menu-button").click(); - // Get the Div that is the parent of the one with text that contains - // Autocomplete - RemoteWebElement autocompleteButton = (RemoteWebElement) webDriverGee - .findElementByXPath("//div[contains(text(), \"Autocomplete\")]/.."); - - if (isAutocompleChecked(autocompleteButton)) { - // Disable the Autocomplete of special characters - autocompleteButton.click(); - } - - } - - public boolean isAutocompleChecked(RemoteWebElement autocompleteButton) { - String buttonChecked = autocompleteButton.getAttribute("aria-checked"); - return buttonChecked.equals("true"); - } - - private void loadCodeEditorScript(RemoteWebDriver webDriverCodeEditor) { - this.webDriverGee = webDriverCodeEditor; - Thread loadGee = new Thread( - "Opening GEE Playground " + (placemarkObject != null ? placemarkObject.toString() : "")) { - @Override - public void run() { - try { - if (!isCodeEditorShowing()) { - // Open GEE Code Editor - if (!browserService.isDriverWorking(webDriverGee) || webDriverGee.getCurrentUrl() == null - || !webDriverGee.getCurrentUrl().contains("google")) { - webDriverGee = browserService.navigateTo(localPropertiesService.getGeePlaygoundUrl(), - webDriverGee); - browserService.setWebDriverGeeCodeEditor(webDriverGee); - } - // Initially the login page appears! - while (!isCodeEditorShowing()) { - sleep(2000); - } - } - runScript(); - } catch (final NoSuchElementException e) { - // This is a well known exception. Down-grade if to warning - logger.warn("Error when opening Earth Engine browser window. Known problem", e); - } catch (final Exception e) { - // This is a well known exception. - logger.error("Error when opening Earth Engine browser window", e); - } - } - }; - loadGee.start(); - } } From c033ce6f34bbc845bf35c11f7de21d7d400a0ae4 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:52 +0100 Subject: [PATCH 0136/1620] New translations PlacemarkDataController.java (English) --- .../earth/app/view/Messages_en.properties | 46 ++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index fa1df1b41e..fcb3cec51d 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1 +1,45 @@ -/DataRepositoryService.java_bc +package org.openforis.collect.earth.app.server; + +import java.io.IOException; + +import javax.servlet.http.HttpServletResponse; + +import org.openforis.collect.earth.app.logging.GAlogger; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; + +/** + * Controller to load and store the information that is stored in Collect Earth for one placemark (plot) + * + * @author Alfonso Sanchez-Paus Diaz + * @author S. Ricci + * + */ +@Controller +public class PlacemarkDataController extends AbstractPlacemarkDataController { + @Override + @GetMapping(value="/placemark-info-expanded") + public void placemarkInfoExpanded(@RequestParam("id") String placemarkId, HttpServletResponse response) throws IOException { + try{ + super.placemarkInfoExpanded(placemarkId, response); + }catch(Exception e){ + logger.error("Error saving data" , e); + } + } + + @Override + @PostMapping(value="/save-data-expanded") + public void saveDataExpanded(PlacemarkUpdateRequest updateRequest, HttpServletResponse response) throws IOException { + try{ + super.saveDataExpanded(updateRequest, response); + if( updateRequest.getValues().get("collect_boolean_actively_saved").equals("true")) { + GAlogger.logGAnalytics("Plot saved"); + } + }catch(Exception e){ + logger.error("Error saving data" , e); + } + } + +} From e03377d2954bdd3a69c6686372655a5af7ac435a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:54 +0100 Subject: [PATCH 0137/1620] New translations PlacemarkImageServlet.java (French) --- .../earth/app/view/Messages_fr.properties | 162 +++++++++++------- 1 file changed, 100 insertions(+), 62 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index df62b703cb..3cc75d6710 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,98 +1,136 @@ package org.openforis.collect.earth.app.server; +import java.io.File; import java.io.IOException; -import java.text.ParseException; +import java.net.URISyntaxException; import java.text.SimpleDateFormat; -import java.time.LocalDateTime; import java.util.Date; +import java.util.Locale; +import java.util.Map; +import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.planet.DateUtils; -import org.openforis.collect.earth.planet.PlanetImagery; -import org.openforis.collect.earth.planet.PlanetRequestParameters; +import org.apache.commons.lang3.ArrayUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.PreloadedFilesService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PostMapping; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; /** - * Controller to load and store the information that is stored in Collect Earth - * for one placemark (plot) + * Servlet used to obtain the right icon/ground-overlay for each placemark. + * These icons symbolize the status of a placemark ( a red exclamation if the placemark has not been filled, a yellow warning sign if the placemark is + * partially filled or a green tick if the placemark information has been successfully filled) * * @author Alfonso Sanchez-Paus Diaz - * @author S. Ricci * */ @Controller -public class PlacemarkPlanetImagery extends JsonPocessorServlet { +public class PlacemarkImageServlet extends JsonPocessorServlet { @Autowired - LocalPropertiesService localPropertiesService; - - // 2015-07-17T10:50:18.650Z - private SimpleDateFormat planetDateFormat = new SimpleDateFormat("yyyy-MM-dd"); - - @PostMapping(value = "/planetTileUrl") - public void planetTileUrl(HttpServletRequest request, HttpServletResponse response) - throws IOException, ParseException { - - PlanetRequestParameters params = getRequestParameters(request); + private EarthSurveyService earthSurveyService; - PlanetImagery planetImagery = new PlanetImagery(localPropertiesService.getPlanetMapsKey()); - String tileUrl = planetImagery.getLayerUrl(params); - - setJsonResponse(response, tileUrl == null ? "" : tileUrl); + @Autowired + private PreloadedFilesService preloadedFilesService; + + private Logger loggerSlf4 = LoggerFactory.getLogger( PlacemarkImageServlet.class ); + + /** + * Returns an icon/overlay image that represents the state of the placemark not-filled/filling/filled + * @param response The HTTP response object + * @param request The HTTP request object + * @param placemarkId The ID of the placemark for which we want to get the icon/overlay + * @param listView True if want to get the icon for the placemark list, false to get the overlay image (transparent or see-through red for filled placemarks) + * @throws IOException In case the image icon cannot be open + * @throws URISyntaxException In case the image icon URL contains an error + */ + @GetMapping("/placemarkIcon") + public void getImage(HttpServletResponse response, HttpServletRequest request, @RequestParam( EarthConstants.PLACEMARK_ID_PARAMETER ) String placemarkId, + @RequestParam(value = "listView", required = false) Boolean listView) throws IOException, URISyntaxException { + getImageExt(response, request, placemarkId, listView); } - private PlanetRequestParameters getRequestParameters(HttpServletRequest request) throws ParseException { - Date startDate = planetDateFormat.parse(request.getParameter("start")); - Date endDate = getEndDate(request, startDate); - - double[][][] coords = getCoordinates(request); - String[] itemTypeArray = getItemTypes(request); + /** + * Returns an icon/overlay image that represents the state of the placemark not-filled/filling/filled + * @param response The HTTP response object + * @param request The HTTP request object + * @param id The ID of the plot with separated by commas + * @param listView True if want to get the icon for the placemark list, false to get the overlay image (transparent or see-through red for filled placemarks) + * @throws IOException In case the image icon cannot be open + * @throws URISyntaxException In case the image icon URL contains an error + */ + @GetMapping("/placemarkIconExtd") + public void getImageExt(HttpServletResponse response, HttpServletRequest request, @RequestParam(value = "id", required = false) String id, @RequestParam(value = "listView", required = false) Boolean listView) throws IOException, URISyntaxException { + String[] keys = id.split(","); + + if( listView == null ){ + throw new IllegalArgumentException("This servlet only responds to listView type of requests where the status icons for the placemarks are the expected result"); //$NON-NLS-1$ + } - return new PlanetRequestParameters(startDate, endDate, coords, itemTypeArray); + // If there is an exception while we get the record info (problem that might happen when using SQLite due to concurrency) return the yellow icon. + String imageName = EarthConstants.LIST_NOT_FINISHED_IMAGE; + try { + + final Map placemarkParameters = earthSurveyService.getPlacemark(keys,false); + + if (earthSurveyService.isPlacemarkSavedActively(placemarkParameters)) { + imageName = EarthConstants.LIST_FILLED_IMAGE; + } else if (earthSurveyService.isPlacemarkEdited(placemarkParameters)) { + imageName = EarthConstants.LIST_NOT_FINISHED_IMAGE; + } else { + imageName = EarthConstants.LIST_NON_FILLED_IMAGE; + } + } catch (Exception e) { + loggerSlf4.error("Error loading image for placemark with ID " + ArrayUtils.toString( keys ) , e); //$NON-NLS-1$ + }finally{ + returnImage(response, imageName); + } } - private double[][][] getCoordinates(HttpServletRequest request) { - Gson gson = new GsonBuilder().create(); - return gson.fromJson(request.getParameter("geometry"), double[][][].class); + private byte[] readFile(String filePath) { + final File imageFile = new File(filePath); + return preloadedFilesService.getFileContent(imageFile); } - private String[] getItemTypes(HttpServletRequest request) { - String[] itemTypeArray = request.getParameterMap().get("itemTypes[]"); - if (itemTypeArray == null || itemTypeArray.length == 0) { - itemTypeArray = new String[] { "PSScene3Band", "PSScene4Band" }; + private void returnImage(HttpServletResponse response, String imageName) throws IOException { + response.setHeader("Content-Type", "image/png"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Content-Disposition", "inline; filename=\"" + imageName + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Date", new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH).format(new Date())); //$NON-NLS-1$ + + byte[] resultingImage = null; + if (imageName.equals(EarthConstants.LIST_NON_FILLED_IMAGE)) { + resultingImage = readFile(EarthConstants.LIST_NON_FILLED_IMAGE); + } else if (imageName.equals(EarthConstants.LIST_FILLED_IMAGE)) { + resultingImage = readFile(EarthConstants.LIST_FILLED_IMAGE); + } else if (imageName.equals(EarthConstants.LIST_NOT_FINISHED_IMAGE)) { + resultingImage = readFile(EarthConstants.LIST_NOT_FINISHED_IMAGE); } - return itemTypeArray; - } - private Date getEndDate(HttpServletRequest request, Date startDate) throws ParseException { - String endDateString = request.getParameter("end"); - Date endDate = null; - if (StringUtils.isNotBlank(endDateString)) { - endDate = planetDateFormat.parse(endDateString); + if (resultingImage != null) { + response.setHeader("Content-Length", Integer.toString( resultingImage.length ) ); //$NON-NLS-1$ //$NON-NLS-2$ + writeToResponse(response, resultingImage); } else { - LocalDateTime localDateTime = DateUtils.asLocalDateTime(startDate); - endDate = DateUtils.asDate(localDateTime.plusDays(30)); + getLogger().error("There was a problem fetching the image, please check the name!"); //$NON-NLS-1$ } - return endDate; } - @PostMapping(value = "/planetAvailableImagery") - public void planetAvailableImagery(HttpServletRequest request, HttpServletResponse response) - throws IOException, ParseException { - - PlanetRequestParameters params = getRequestParameters(request); - - PlanetImagery planetImagery = new PlanetImagery(localPropertiesService.getPlanetMapsKey()); - setJsonResponse(response, planetImagery.getAvailableDates(params)); + private void writeToResponse(HttpServletResponse response, byte[] fileContents) throws IOException { + ServletOutputStream outputStream = response.getOutputStream(); + try { + outputStream.write(fileContents); + outputStream.flush(); + } catch (final Exception e) { + getLogger().error("Error writing reponse body to output stream ", e); //$NON-NLS-1$ + } finally { + outputStream.close(); + } } - } From 741fadd3c6d0365fe365ab768b35781ee8917d8d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:55 +0100 Subject: [PATCH 0138/1620] New translations PlacemarkImageServlet.java (Spanish) --- .../earth/app/view/Messages_es.properties | 135 +++++++++++++++--- 1 file changed, 113 insertions(+), 22 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index fcb3cec51d..3cc75d6710 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,45 +1,136 @@ package org.openforis.collect.earth.app.server; +import java.io.File; import java.io.IOException; +import java.net.URISyntaxException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; +import java.util.Map; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.openforis.collect.earth.app.logging.GAlogger; +import org.apache.commons.lang3.ArrayUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.PreloadedFilesService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; /** - * Controller to load and store the information that is stored in Collect Earth for one placemark (plot) + * Servlet used to obtain the right icon/ground-overlay for each placemark. + * These icons symbolize the status of a placemark ( a red exclamation if the placemark has not been filled, a yellow warning sign if the placemark is + * partially filled or a green tick if the placemark information has been successfully filled) * * @author Alfonso Sanchez-Paus Diaz - * @author S. Ricci * */ @Controller -public class PlacemarkDataController extends AbstractPlacemarkDataController { - @Override - @GetMapping(value="/placemark-info-expanded") - public void placemarkInfoExpanded(@RequestParam("id") String placemarkId, HttpServletResponse response) throws IOException { - try{ - super.placemarkInfoExpanded(placemarkId, response); - }catch(Exception e){ - logger.error("Error saving data" , e); - } +public class PlacemarkImageServlet extends JsonPocessorServlet { + + @Autowired + private EarthSurveyService earthSurveyService; + + @Autowired + private PreloadedFilesService preloadedFilesService; + + private Logger loggerSlf4 = LoggerFactory.getLogger( PlacemarkImageServlet.class ); + + /** + * Returns an icon/overlay image that represents the state of the placemark not-filled/filling/filled + * @param response The HTTP response object + * @param request The HTTP request object + * @param placemarkId The ID of the placemark for which we want to get the icon/overlay + * @param listView True if want to get the icon for the placemark list, false to get the overlay image (transparent or see-through red for filled placemarks) + * @throws IOException In case the image icon cannot be open + * @throws URISyntaxException In case the image icon URL contains an error + */ + @GetMapping("/placemarkIcon") + public void getImage(HttpServletResponse response, HttpServletRequest request, @RequestParam( EarthConstants.PLACEMARK_ID_PARAMETER ) String placemarkId, + @RequestParam(value = "listView", required = false) Boolean listView) throws IOException, URISyntaxException { + getImageExt(response, request, placemarkId, listView); } - @Override - @PostMapping(value="/save-data-expanded") - public void saveDataExpanded(PlacemarkUpdateRequest updateRequest, HttpServletResponse response) throws IOException { - try{ - super.saveDataExpanded(updateRequest, response); - if( updateRequest.getValues().get("collect_boolean_actively_saved").equals("true")) { - GAlogger.logGAnalytics("Plot saved"); + /** + * Returns an icon/overlay image that represents the state of the placemark not-filled/filling/filled + * @param response The HTTP response object + * @param request The HTTP request object + * @param id The ID of the plot with separated by commas + * @param listView True if want to get the icon for the placemark list, false to get the overlay image (transparent or see-through red for filled placemarks) + * @throws IOException In case the image icon cannot be open + * @throws URISyntaxException In case the image icon URL contains an error + */ + @GetMapping("/placemarkIconExtd") + public void getImageExt(HttpServletResponse response, HttpServletRequest request, @RequestParam(value = "id", required = false) String id, @RequestParam(value = "listView", required = false) Boolean listView) throws IOException, URISyntaxException { + String[] keys = id.split(","); + + if( listView == null ){ + throw new IllegalArgumentException("This servlet only responds to listView type of requests where the status icons for the placemarks are the expected result"); //$NON-NLS-1$ + } + + // If there is an exception while we get the record info (problem that might happen when using SQLite due to concurrency) return the yellow icon. + String imageName = EarthConstants.LIST_NOT_FINISHED_IMAGE; + try { + + final Map placemarkParameters = earthSurveyService.getPlacemark(keys,false); + + if (earthSurveyService.isPlacemarkSavedActively(placemarkParameters)) { + imageName = EarthConstants.LIST_FILLED_IMAGE; + } else if (earthSurveyService.isPlacemarkEdited(placemarkParameters)) { + imageName = EarthConstants.LIST_NOT_FINISHED_IMAGE; + } else { + imageName = EarthConstants.LIST_NON_FILLED_IMAGE; } - }catch(Exception e){ - logger.error("Error saving data" , e); + } catch (Exception e) { + loggerSlf4.error("Error loading image for placemark with ID " + ArrayUtils.toString( keys ) , e); //$NON-NLS-1$ + }finally{ + returnImage(response, imageName); } } + private byte[] readFile(String filePath) { + final File imageFile = new File(filePath); + return preloadedFilesService.getFileContent(imageFile); + } + + private void returnImage(HttpServletResponse response, String imageName) throws IOException { + response.setHeader("Content-Type", "image/png"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Content-Disposition", "inline; filename=\"" + imageName + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Date", new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH).format(new Date())); //$NON-NLS-1$ + + byte[] resultingImage = null; + if (imageName.equals(EarthConstants.LIST_NON_FILLED_IMAGE)) { + resultingImage = readFile(EarthConstants.LIST_NON_FILLED_IMAGE); + } else if (imageName.equals(EarthConstants.LIST_FILLED_IMAGE)) { + resultingImage = readFile(EarthConstants.LIST_FILLED_IMAGE); + } else if (imageName.equals(EarthConstants.LIST_NOT_FINISHED_IMAGE)) { + resultingImage = readFile(EarthConstants.LIST_NOT_FINISHED_IMAGE); + } + + if (resultingImage != null) { + response.setHeader("Content-Length", Integer.toString( resultingImage.length ) ); //$NON-NLS-1$ //$NON-NLS-2$ + writeToResponse(response, resultingImage); + } else { + getLogger().error("There was a problem fetching the image, please check the name!"); //$NON-NLS-1$ + } + } + + private void writeToResponse(HttpServletResponse response, byte[] fileContents) throws IOException { + ServletOutputStream outputStream = response.getOutputStream(); + try { + outputStream.write(fileContents); + outputStream.flush(); + } catch (final Exception e) { + getLogger().error("Error writing reponse body to output stream ", e); //$NON-NLS-1$ + } finally { + outputStream.close(); + } + } } From e6a8797f9b8cc094c4a854a57287487927b4d4e0 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:56 +0100 Subject: [PATCH 0139/1620] New translations PlacemarkImageServlet.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 135 +++++++++++++++--- 1 file changed, 113 insertions(+), 22 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index fcb3cec51d..3cc75d6710 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,45 +1,136 @@ package org.openforis.collect.earth.app.server; +import java.io.File; import java.io.IOException; +import java.net.URISyntaxException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; +import java.util.Map; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.openforis.collect.earth.app.logging.GAlogger; +import org.apache.commons.lang3.ArrayUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.PreloadedFilesService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; /** - * Controller to load and store the information that is stored in Collect Earth for one placemark (plot) + * Servlet used to obtain the right icon/ground-overlay for each placemark. + * These icons symbolize the status of a placemark ( a red exclamation if the placemark has not been filled, a yellow warning sign if the placemark is + * partially filled or a green tick if the placemark information has been successfully filled) * * @author Alfonso Sanchez-Paus Diaz - * @author S. Ricci * */ @Controller -public class PlacemarkDataController extends AbstractPlacemarkDataController { - @Override - @GetMapping(value="/placemark-info-expanded") - public void placemarkInfoExpanded(@RequestParam("id") String placemarkId, HttpServletResponse response) throws IOException { - try{ - super.placemarkInfoExpanded(placemarkId, response); - }catch(Exception e){ - logger.error("Error saving data" , e); - } +public class PlacemarkImageServlet extends JsonPocessorServlet { + + @Autowired + private EarthSurveyService earthSurveyService; + + @Autowired + private PreloadedFilesService preloadedFilesService; + + private Logger loggerSlf4 = LoggerFactory.getLogger( PlacemarkImageServlet.class ); + + /** + * Returns an icon/overlay image that represents the state of the placemark not-filled/filling/filled + * @param response The HTTP response object + * @param request The HTTP request object + * @param placemarkId The ID of the placemark for which we want to get the icon/overlay + * @param listView True if want to get the icon for the placemark list, false to get the overlay image (transparent or see-through red for filled placemarks) + * @throws IOException In case the image icon cannot be open + * @throws URISyntaxException In case the image icon URL contains an error + */ + @GetMapping("/placemarkIcon") + public void getImage(HttpServletResponse response, HttpServletRequest request, @RequestParam( EarthConstants.PLACEMARK_ID_PARAMETER ) String placemarkId, + @RequestParam(value = "listView", required = false) Boolean listView) throws IOException, URISyntaxException { + getImageExt(response, request, placemarkId, listView); } - @Override - @PostMapping(value="/save-data-expanded") - public void saveDataExpanded(PlacemarkUpdateRequest updateRequest, HttpServletResponse response) throws IOException { - try{ - super.saveDataExpanded(updateRequest, response); - if( updateRequest.getValues().get("collect_boolean_actively_saved").equals("true")) { - GAlogger.logGAnalytics("Plot saved"); + /** + * Returns an icon/overlay image that represents the state of the placemark not-filled/filling/filled + * @param response The HTTP response object + * @param request The HTTP request object + * @param id The ID of the plot with separated by commas + * @param listView True if want to get the icon for the placemark list, false to get the overlay image (transparent or see-through red for filled placemarks) + * @throws IOException In case the image icon cannot be open + * @throws URISyntaxException In case the image icon URL contains an error + */ + @GetMapping("/placemarkIconExtd") + public void getImageExt(HttpServletResponse response, HttpServletRequest request, @RequestParam(value = "id", required = false) String id, @RequestParam(value = "listView", required = false) Boolean listView) throws IOException, URISyntaxException { + String[] keys = id.split(","); + + if( listView == null ){ + throw new IllegalArgumentException("This servlet only responds to listView type of requests where the status icons for the placemarks are the expected result"); //$NON-NLS-1$ + } + + // If there is an exception while we get the record info (problem that might happen when using SQLite due to concurrency) return the yellow icon. + String imageName = EarthConstants.LIST_NOT_FINISHED_IMAGE; + try { + + final Map placemarkParameters = earthSurveyService.getPlacemark(keys,false); + + if (earthSurveyService.isPlacemarkSavedActively(placemarkParameters)) { + imageName = EarthConstants.LIST_FILLED_IMAGE; + } else if (earthSurveyService.isPlacemarkEdited(placemarkParameters)) { + imageName = EarthConstants.LIST_NOT_FINISHED_IMAGE; + } else { + imageName = EarthConstants.LIST_NON_FILLED_IMAGE; } - }catch(Exception e){ - logger.error("Error saving data" , e); + } catch (Exception e) { + loggerSlf4.error("Error loading image for placemark with ID " + ArrayUtils.toString( keys ) , e); //$NON-NLS-1$ + }finally{ + returnImage(response, imageName); } } + private byte[] readFile(String filePath) { + final File imageFile = new File(filePath); + return preloadedFilesService.getFileContent(imageFile); + } + + private void returnImage(HttpServletResponse response, String imageName) throws IOException { + response.setHeader("Content-Type", "image/png"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Content-Disposition", "inline; filename=\"" + imageName + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Date", new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH).format(new Date())); //$NON-NLS-1$ + + byte[] resultingImage = null; + if (imageName.equals(EarthConstants.LIST_NON_FILLED_IMAGE)) { + resultingImage = readFile(EarthConstants.LIST_NON_FILLED_IMAGE); + } else if (imageName.equals(EarthConstants.LIST_FILLED_IMAGE)) { + resultingImage = readFile(EarthConstants.LIST_FILLED_IMAGE); + } else if (imageName.equals(EarthConstants.LIST_NOT_FINISHED_IMAGE)) { + resultingImage = readFile(EarthConstants.LIST_NOT_FINISHED_IMAGE); + } + + if (resultingImage != null) { + response.setHeader("Content-Length", Integer.toString( resultingImage.length ) ); //$NON-NLS-1$ //$NON-NLS-2$ + writeToResponse(response, resultingImage); + } else { + getLogger().error("There was a problem fetching the image, please check the name!"); //$NON-NLS-1$ + } + } + + private void writeToResponse(HttpServletResponse response, byte[] fileContents) throws IOException { + ServletOutputStream outputStream = response.getOutputStream(); + try { + outputStream.write(fileContents); + outputStream.flush(); + } catch (final Exception e) { + getLogger().error("Error writing reponse body to output stream ", e); //$NON-NLS-1$ + } finally { + outputStream.close(); + } + } } From a1f52e59845eb4c1b8ec2d4b3c60936b0a93ea99 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:57 +0100 Subject: [PATCH 0140/1620] New translations PlacemarkImageServlet.java (English) --- .../earth/app/view/Messages_en.properties | 135 +++++++++++++++--- 1 file changed, 113 insertions(+), 22 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index fcb3cec51d..3cc75d6710 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,45 +1,136 @@ package org.openforis.collect.earth.app.server; +import java.io.File; import java.io.IOException; +import java.net.URISyntaxException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; +import java.util.Map; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.openforis.collect.earth.app.logging.GAlogger; +import org.apache.commons.lang3.ArrayUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.PreloadedFilesService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; /** - * Controller to load and store the information that is stored in Collect Earth for one placemark (plot) + * Servlet used to obtain the right icon/ground-overlay for each placemark. + * These icons symbolize the status of a placemark ( a red exclamation if the placemark has not been filled, a yellow warning sign if the placemark is + * partially filled or a green tick if the placemark information has been successfully filled) * * @author Alfonso Sanchez-Paus Diaz - * @author S. Ricci * */ @Controller -public class PlacemarkDataController extends AbstractPlacemarkDataController { - @Override - @GetMapping(value="/placemark-info-expanded") - public void placemarkInfoExpanded(@RequestParam("id") String placemarkId, HttpServletResponse response) throws IOException { - try{ - super.placemarkInfoExpanded(placemarkId, response); - }catch(Exception e){ - logger.error("Error saving data" , e); - } +public class PlacemarkImageServlet extends JsonPocessorServlet { + + @Autowired + private EarthSurveyService earthSurveyService; + + @Autowired + private PreloadedFilesService preloadedFilesService; + + private Logger loggerSlf4 = LoggerFactory.getLogger( PlacemarkImageServlet.class ); + + /** + * Returns an icon/overlay image that represents the state of the placemark not-filled/filling/filled + * @param response The HTTP response object + * @param request The HTTP request object + * @param placemarkId The ID of the placemark for which we want to get the icon/overlay + * @param listView True if want to get the icon for the placemark list, false to get the overlay image (transparent or see-through red for filled placemarks) + * @throws IOException In case the image icon cannot be open + * @throws URISyntaxException In case the image icon URL contains an error + */ + @GetMapping("/placemarkIcon") + public void getImage(HttpServletResponse response, HttpServletRequest request, @RequestParam( EarthConstants.PLACEMARK_ID_PARAMETER ) String placemarkId, + @RequestParam(value = "listView", required = false) Boolean listView) throws IOException, URISyntaxException { + getImageExt(response, request, placemarkId, listView); } - @Override - @PostMapping(value="/save-data-expanded") - public void saveDataExpanded(PlacemarkUpdateRequest updateRequest, HttpServletResponse response) throws IOException { - try{ - super.saveDataExpanded(updateRequest, response); - if( updateRequest.getValues().get("collect_boolean_actively_saved").equals("true")) { - GAlogger.logGAnalytics("Plot saved"); + /** + * Returns an icon/overlay image that represents the state of the placemark not-filled/filling/filled + * @param response The HTTP response object + * @param request The HTTP request object + * @param id The ID of the plot with separated by commas + * @param listView True if want to get the icon for the placemark list, false to get the overlay image (transparent or see-through red for filled placemarks) + * @throws IOException In case the image icon cannot be open + * @throws URISyntaxException In case the image icon URL contains an error + */ + @GetMapping("/placemarkIconExtd") + public void getImageExt(HttpServletResponse response, HttpServletRequest request, @RequestParam(value = "id", required = false) String id, @RequestParam(value = "listView", required = false) Boolean listView) throws IOException, URISyntaxException { + String[] keys = id.split(","); + + if( listView == null ){ + throw new IllegalArgumentException("This servlet only responds to listView type of requests where the status icons for the placemarks are the expected result"); //$NON-NLS-1$ + } + + // If there is an exception while we get the record info (problem that might happen when using SQLite due to concurrency) return the yellow icon. + String imageName = EarthConstants.LIST_NOT_FINISHED_IMAGE; + try { + + final Map placemarkParameters = earthSurveyService.getPlacemark(keys,false); + + if (earthSurveyService.isPlacemarkSavedActively(placemarkParameters)) { + imageName = EarthConstants.LIST_FILLED_IMAGE; + } else if (earthSurveyService.isPlacemarkEdited(placemarkParameters)) { + imageName = EarthConstants.LIST_NOT_FINISHED_IMAGE; + } else { + imageName = EarthConstants.LIST_NON_FILLED_IMAGE; } - }catch(Exception e){ - logger.error("Error saving data" , e); + } catch (Exception e) { + loggerSlf4.error("Error loading image for placemark with ID " + ArrayUtils.toString( keys ) , e); //$NON-NLS-1$ + }finally{ + returnImage(response, imageName); } } + private byte[] readFile(String filePath) { + final File imageFile = new File(filePath); + return preloadedFilesService.getFileContent(imageFile); + } + + private void returnImage(HttpServletResponse response, String imageName) throws IOException { + response.setHeader("Content-Type", "image/png"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Content-Disposition", "inline; filename=\"" + imageName + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Date", new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH).format(new Date())); //$NON-NLS-1$ + + byte[] resultingImage = null; + if (imageName.equals(EarthConstants.LIST_NON_FILLED_IMAGE)) { + resultingImage = readFile(EarthConstants.LIST_NON_FILLED_IMAGE); + } else if (imageName.equals(EarthConstants.LIST_FILLED_IMAGE)) { + resultingImage = readFile(EarthConstants.LIST_FILLED_IMAGE); + } else if (imageName.equals(EarthConstants.LIST_NOT_FINISHED_IMAGE)) { + resultingImage = readFile(EarthConstants.LIST_NOT_FINISHED_IMAGE); + } + + if (resultingImage != null) { + response.setHeader("Content-Length", Integer.toString( resultingImage.length ) ); //$NON-NLS-1$ //$NON-NLS-2$ + writeToResponse(response, resultingImage); + } else { + getLogger().error("There was a problem fetching the image, please check the name!"); //$NON-NLS-1$ + } + } + + private void writeToResponse(HttpServletResponse response, byte[] fileContents) throws IOException { + ServletOutputStream outputStream = response.getOutputStream(); + try { + outputStream.write(fileContents); + outputStream.flush(); + } catch (final Exception e) { + getLogger().error("Error writing reponse body to output stream ", e); //$NON-NLS-1$ + } finally { + outputStream.close(); + } + } } From 846145bfbed74eaf7fac7ac5af6de9600ea5bc24 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:58 +0100 Subject: [PATCH 0141/1620] New translations PlacemarkInfoServlet.java (French) --- .../earth/app/view/Messages_fr.properties | 141 +++++------------- 1 file changed, 38 insertions(+), 103 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 3cc75d6710..0c1e208fbc 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,136 +1,71 @@ package org.openforis.collect.earth.app.server; -import java.io.File; import java.io.IOException; -import java.net.URISyntaxException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Locale; +import java.util.HashMap; import java.util.Map; -import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.apache.commons.lang3.ArrayUtils; import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.PreloadedFilesService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; /** - * Servlet used to obtain the right icon/ground-overlay for each placemark. - * These icons symbolize the status of a placemark ( a red exclamation if the placemark has not been filled, a yellow warning sign if the placemark is - * partially filled or a green tick if the placemark information has been successfully filled) + * Servlet to return the information that is stored in Collect Earth for one placemark (plot) * * @author Alfonso Sanchez-Paus Diaz * + * @deprecated Replaced by {@link PlacemarkDataController} */ +@Deprecated @Controller -public class PlacemarkImageServlet extends JsonPocessorServlet { +public class PlacemarkInfoServlet extends JsonPocessorServlet { - @Autowired - private EarthSurveyService earthSurveyService; - - @Autowired - private PreloadedFilesService preloadedFilesService; - - private Logger loggerSlf4 = LoggerFactory.getLogger( PlacemarkImageServlet.class ); - - /** - * Returns an icon/overlay image that represents the state of the placemark not-filled/filling/filled - * @param response The HTTP response object - * @param request The HTTP request object - * @param placemarkId The ID of the placemark for which we want to get the icon/overlay - * @param listView True if want to get the icon for the placemark list, false to get the overlay image (transparent or see-through red for filled placemarks) - * @throws IOException In case the image icon cannot be open - * @throws URISyntaxException In case the image icon URL contains an error - */ - @GetMapping("/placemarkIcon") - public void getImage(HttpServletResponse response, HttpServletRequest request, @RequestParam( EarthConstants.PLACEMARK_ID_PARAMETER ) String placemarkId, - @RequestParam(value = "listView", required = false) Boolean listView) throws IOException, URISyntaxException { - getImageExt(response, request, placemarkId, listView); - } /** - * Returns an icon/overlay image that represents the state of the placemark not-filled/filling/filled - * @param response The HTTP response object - * @param request The HTTP request object - * @param id The ID of the plot with separated by commas - * @param listView True if want to get the icon for the placemark list, false to get the overlay image (transparent or see-through red for filled placemarks) - * @throws IOException In case the image icon cannot be open - * @throws URISyntaxException In case the image icon URL contains an error + * Returns a JSON object with the data collected for a placemark in the collect-earth format. + * @param request The request sent from Google Earth pop-up to Collect Earth + * @param response The response to the Collect Earth request + * @throws IOException Throws exception if the response cannot be written to the channel */ - @GetMapping("/placemarkIconExtd") - public void getImageExt(HttpServletResponse response, HttpServletRequest request, @RequestParam(value = "id", required = false) String id, @RequestParam(value = "listView", required = false) Boolean listView) throws IOException, URISyntaxException { - String[] keys = id.split(","); - - if( listView == null ){ - throw new IllegalArgumentException("This servlet only responds to listView type of requests where the status icons for the placemarks are the expected result"); //$NON-NLS-1$ - } - - // If there is an exception while we get the record info (problem that might happen when using SQLite due to concurrency) return the yellow icon. - String imageName = EarthConstants.LIST_NOT_FINISHED_IMAGE; - try { - - final Map placemarkParameters = earthSurveyService.getPlacemark(keys,false); - - if (earthSurveyService.isPlacemarkSavedActively(placemarkParameters)) { - imageName = EarthConstants.LIST_FILLED_IMAGE; - } else if (earthSurveyService.isPlacemarkEdited(placemarkParameters)) { - imageName = EarthConstants.LIST_NOT_FINISHED_IMAGE; + @GetMapping("/placemarkInfo") + public void placemarkInfoOld(HttpServletRequest request, HttpServletResponse response) throws IOException { + Map collectedData = extractRequestData(request); + String placemarkId = getPlacemarkId(collectedData); + + if (placemarkId == null) { + setResult(false, "No placemark ID found in the request", collectedData); //$NON-NLS-1$ + getLogger().error("No placemark ID found in the received request"); //$NON-NLS-1$ + } else { + placemarkId = replacePlacemarkIdTestValue(placemarkId); + collectedData = getDataAccessor().getData(placemarkId); + if (collectedData != null && collectedData.get(EarthConstants.PLACEMARK_FOUND_PARAMETER) != null + && collectedData.get(EarthConstants.PLACEMARK_FOUND_PARAMETER).equals("true")) { //$NON-NLS-1$ + setResult(true, "The placemark was found", collectedData); //$NON-NLS-1$ + getLogger().info("A placemark was found with these properties {}", collectedData ); //$NON-NLS-1$ } else { - imageName = EarthConstants.LIST_NON_FILLED_IMAGE; + if (collectedData == null) { + collectedData = new HashMap<>(); + } + setResult(false, "No placemark found", collectedData); //$NON-NLS-1$ + getLogger().info("No placemark found {}", collectedData ); //$NON-NLS-1$ } - } catch (Exception e) { - loggerSlf4.error("Error loading image for placemark with ID " + ArrayUtils.toString( keys ) , e); //$NON-NLS-1$ - }finally{ - returnImage(response, imageName); } - } - - private byte[] readFile(String filePath) { - final File imageFile = new File(filePath); - return preloadedFilesService.getFileContent(imageFile); - } - private void returnImage(HttpServletResponse response, String imageName) throws IOException { - response.setHeader("Content-Type", "image/png"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Content-Disposition", "inline; filename=\"" + imageName + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Date", new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH).format(new Date())); //$NON-NLS-1$ + setJsonResponse(response, collectedData); - byte[] resultingImage = null; - if (imageName.equals(EarthConstants.LIST_NON_FILLED_IMAGE)) { - resultingImage = readFile(EarthConstants.LIST_NON_FILLED_IMAGE); - } else if (imageName.equals(EarthConstants.LIST_FILLED_IMAGE)) { - resultingImage = readFile(EarthConstants.LIST_FILLED_IMAGE); - } else if (imageName.equals(EarthConstants.LIST_NOT_FINISHED_IMAGE)) { - resultingImage = readFile(EarthConstants.LIST_NOT_FINISHED_IMAGE); - } + } - if (resultingImage != null) { - response.setHeader("Content-Length", Integer.toString( resultingImage.length ) ); //$NON-NLS-1$ //$NON-NLS-2$ - writeToResponse(response, resultingImage); - } else { - getLogger().error("There was a problem fetching the image, please check the name!"); //$NON-NLS-1$ - } + private String getPlacemarkId(Map collectedData) { + return collectedData.get(EarthConstants.PLACEMARK_ID_PARAMETER); } - private void writeToResponse(HttpServletResponse response, byte[] fileContents) throws IOException { - ServletOutputStream outputStream = response.getOutputStream(); - try { - outputStream.write(fileContents); - outputStream.flush(); - } catch (final Exception e) { - getLogger().error("Error writing reponse body to output stream ", e); //$NON-NLS-1$ - } finally { - outputStream.close(); + private String replacePlacemarkIdTestValue(String placemarkId) { + if (placemarkId.equals("$[id]")) { //$NON-NLS-1$ + placemarkId = "testPlacemark"; //$NON-NLS-1$ } + return placemarkId; } + } From cd8c7fccb307f3d30054425c62b258545302cb3f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:23:59 +0100 Subject: [PATCH 0142/1620] New translations PlacemarkInfoServlet.java (Spanish) --- .../earth/app/view/Messages_es.properties | 141 +++++------------- 1 file changed, 38 insertions(+), 103 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 3cc75d6710..0c1e208fbc 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,136 +1,71 @@ package org.openforis.collect.earth.app.server; -import java.io.File; import java.io.IOException; -import java.net.URISyntaxException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Locale; +import java.util.HashMap; import java.util.Map; -import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.apache.commons.lang3.ArrayUtils; import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.PreloadedFilesService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; /** - * Servlet used to obtain the right icon/ground-overlay for each placemark. - * These icons symbolize the status of a placemark ( a red exclamation if the placemark has not been filled, a yellow warning sign if the placemark is - * partially filled or a green tick if the placemark information has been successfully filled) + * Servlet to return the information that is stored in Collect Earth for one placemark (plot) * * @author Alfonso Sanchez-Paus Diaz * + * @deprecated Replaced by {@link PlacemarkDataController} */ +@Deprecated @Controller -public class PlacemarkImageServlet extends JsonPocessorServlet { +public class PlacemarkInfoServlet extends JsonPocessorServlet { - @Autowired - private EarthSurveyService earthSurveyService; - - @Autowired - private PreloadedFilesService preloadedFilesService; - - private Logger loggerSlf4 = LoggerFactory.getLogger( PlacemarkImageServlet.class ); - - /** - * Returns an icon/overlay image that represents the state of the placemark not-filled/filling/filled - * @param response The HTTP response object - * @param request The HTTP request object - * @param placemarkId The ID of the placemark for which we want to get the icon/overlay - * @param listView True if want to get the icon for the placemark list, false to get the overlay image (transparent or see-through red for filled placemarks) - * @throws IOException In case the image icon cannot be open - * @throws URISyntaxException In case the image icon URL contains an error - */ - @GetMapping("/placemarkIcon") - public void getImage(HttpServletResponse response, HttpServletRequest request, @RequestParam( EarthConstants.PLACEMARK_ID_PARAMETER ) String placemarkId, - @RequestParam(value = "listView", required = false) Boolean listView) throws IOException, URISyntaxException { - getImageExt(response, request, placemarkId, listView); - } /** - * Returns an icon/overlay image that represents the state of the placemark not-filled/filling/filled - * @param response The HTTP response object - * @param request The HTTP request object - * @param id The ID of the plot with separated by commas - * @param listView True if want to get the icon for the placemark list, false to get the overlay image (transparent or see-through red for filled placemarks) - * @throws IOException In case the image icon cannot be open - * @throws URISyntaxException In case the image icon URL contains an error + * Returns a JSON object with the data collected for a placemark in the collect-earth format. + * @param request The request sent from Google Earth pop-up to Collect Earth + * @param response The response to the Collect Earth request + * @throws IOException Throws exception if the response cannot be written to the channel */ - @GetMapping("/placemarkIconExtd") - public void getImageExt(HttpServletResponse response, HttpServletRequest request, @RequestParam(value = "id", required = false) String id, @RequestParam(value = "listView", required = false) Boolean listView) throws IOException, URISyntaxException { - String[] keys = id.split(","); - - if( listView == null ){ - throw new IllegalArgumentException("This servlet only responds to listView type of requests where the status icons for the placemarks are the expected result"); //$NON-NLS-1$ - } - - // If there is an exception while we get the record info (problem that might happen when using SQLite due to concurrency) return the yellow icon. - String imageName = EarthConstants.LIST_NOT_FINISHED_IMAGE; - try { - - final Map placemarkParameters = earthSurveyService.getPlacemark(keys,false); - - if (earthSurveyService.isPlacemarkSavedActively(placemarkParameters)) { - imageName = EarthConstants.LIST_FILLED_IMAGE; - } else if (earthSurveyService.isPlacemarkEdited(placemarkParameters)) { - imageName = EarthConstants.LIST_NOT_FINISHED_IMAGE; + @GetMapping("/placemarkInfo") + public void placemarkInfoOld(HttpServletRequest request, HttpServletResponse response) throws IOException { + Map collectedData = extractRequestData(request); + String placemarkId = getPlacemarkId(collectedData); + + if (placemarkId == null) { + setResult(false, "No placemark ID found in the request", collectedData); //$NON-NLS-1$ + getLogger().error("No placemark ID found in the received request"); //$NON-NLS-1$ + } else { + placemarkId = replacePlacemarkIdTestValue(placemarkId); + collectedData = getDataAccessor().getData(placemarkId); + if (collectedData != null && collectedData.get(EarthConstants.PLACEMARK_FOUND_PARAMETER) != null + && collectedData.get(EarthConstants.PLACEMARK_FOUND_PARAMETER).equals("true")) { //$NON-NLS-1$ + setResult(true, "The placemark was found", collectedData); //$NON-NLS-1$ + getLogger().info("A placemark was found with these properties {}", collectedData ); //$NON-NLS-1$ } else { - imageName = EarthConstants.LIST_NON_FILLED_IMAGE; + if (collectedData == null) { + collectedData = new HashMap<>(); + } + setResult(false, "No placemark found", collectedData); //$NON-NLS-1$ + getLogger().info("No placemark found {}", collectedData ); //$NON-NLS-1$ } - } catch (Exception e) { - loggerSlf4.error("Error loading image for placemark with ID " + ArrayUtils.toString( keys ) , e); //$NON-NLS-1$ - }finally{ - returnImage(response, imageName); } - } - - private byte[] readFile(String filePath) { - final File imageFile = new File(filePath); - return preloadedFilesService.getFileContent(imageFile); - } - private void returnImage(HttpServletResponse response, String imageName) throws IOException { - response.setHeader("Content-Type", "image/png"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Content-Disposition", "inline; filename=\"" + imageName + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Date", new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH).format(new Date())); //$NON-NLS-1$ + setJsonResponse(response, collectedData); - byte[] resultingImage = null; - if (imageName.equals(EarthConstants.LIST_NON_FILLED_IMAGE)) { - resultingImage = readFile(EarthConstants.LIST_NON_FILLED_IMAGE); - } else if (imageName.equals(EarthConstants.LIST_FILLED_IMAGE)) { - resultingImage = readFile(EarthConstants.LIST_FILLED_IMAGE); - } else if (imageName.equals(EarthConstants.LIST_NOT_FINISHED_IMAGE)) { - resultingImage = readFile(EarthConstants.LIST_NOT_FINISHED_IMAGE); - } + } - if (resultingImage != null) { - response.setHeader("Content-Length", Integer.toString( resultingImage.length ) ); //$NON-NLS-1$ //$NON-NLS-2$ - writeToResponse(response, resultingImage); - } else { - getLogger().error("There was a problem fetching the image, please check the name!"); //$NON-NLS-1$ - } + private String getPlacemarkId(Map collectedData) { + return collectedData.get(EarthConstants.PLACEMARK_ID_PARAMETER); } - private void writeToResponse(HttpServletResponse response, byte[] fileContents) throws IOException { - ServletOutputStream outputStream = response.getOutputStream(); - try { - outputStream.write(fileContents); - outputStream.flush(); - } catch (final Exception e) { - getLogger().error("Error writing reponse body to output stream ", e); //$NON-NLS-1$ - } finally { - outputStream.close(); + private String replacePlacemarkIdTestValue(String placemarkId) { + if (placemarkId.equals("$[id]")) { //$NON-NLS-1$ + placemarkId = "testPlacemark"; //$NON-NLS-1$ } + return placemarkId; } + } From d755ccd79301f6d2612eb3c2db80e3b7c0a7a034 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:00 +0100 Subject: [PATCH 0143/1620] New translations PlacemarkInfoServlet.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 141 +++++------------- 1 file changed, 38 insertions(+), 103 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 3cc75d6710..0c1e208fbc 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,136 +1,71 @@ package org.openforis.collect.earth.app.server; -import java.io.File; import java.io.IOException; -import java.net.URISyntaxException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Locale; +import java.util.HashMap; import java.util.Map; -import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.apache.commons.lang3.ArrayUtils; import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.PreloadedFilesService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; /** - * Servlet used to obtain the right icon/ground-overlay for each placemark. - * These icons symbolize the status of a placemark ( a red exclamation if the placemark has not been filled, a yellow warning sign if the placemark is - * partially filled or a green tick if the placemark information has been successfully filled) + * Servlet to return the information that is stored in Collect Earth for one placemark (plot) * * @author Alfonso Sanchez-Paus Diaz * + * @deprecated Replaced by {@link PlacemarkDataController} */ +@Deprecated @Controller -public class PlacemarkImageServlet extends JsonPocessorServlet { +public class PlacemarkInfoServlet extends JsonPocessorServlet { - @Autowired - private EarthSurveyService earthSurveyService; - - @Autowired - private PreloadedFilesService preloadedFilesService; - - private Logger loggerSlf4 = LoggerFactory.getLogger( PlacemarkImageServlet.class ); - - /** - * Returns an icon/overlay image that represents the state of the placemark not-filled/filling/filled - * @param response The HTTP response object - * @param request The HTTP request object - * @param placemarkId The ID of the placemark for which we want to get the icon/overlay - * @param listView True if want to get the icon for the placemark list, false to get the overlay image (transparent or see-through red for filled placemarks) - * @throws IOException In case the image icon cannot be open - * @throws URISyntaxException In case the image icon URL contains an error - */ - @GetMapping("/placemarkIcon") - public void getImage(HttpServletResponse response, HttpServletRequest request, @RequestParam( EarthConstants.PLACEMARK_ID_PARAMETER ) String placemarkId, - @RequestParam(value = "listView", required = false) Boolean listView) throws IOException, URISyntaxException { - getImageExt(response, request, placemarkId, listView); - } /** - * Returns an icon/overlay image that represents the state of the placemark not-filled/filling/filled - * @param response The HTTP response object - * @param request The HTTP request object - * @param id The ID of the plot with separated by commas - * @param listView True if want to get the icon for the placemark list, false to get the overlay image (transparent or see-through red for filled placemarks) - * @throws IOException In case the image icon cannot be open - * @throws URISyntaxException In case the image icon URL contains an error + * Returns a JSON object with the data collected for a placemark in the collect-earth format. + * @param request The request sent from Google Earth pop-up to Collect Earth + * @param response The response to the Collect Earth request + * @throws IOException Throws exception if the response cannot be written to the channel */ - @GetMapping("/placemarkIconExtd") - public void getImageExt(HttpServletResponse response, HttpServletRequest request, @RequestParam(value = "id", required = false) String id, @RequestParam(value = "listView", required = false) Boolean listView) throws IOException, URISyntaxException { - String[] keys = id.split(","); - - if( listView == null ){ - throw new IllegalArgumentException("This servlet only responds to listView type of requests where the status icons for the placemarks are the expected result"); //$NON-NLS-1$ - } - - // If there is an exception while we get the record info (problem that might happen when using SQLite due to concurrency) return the yellow icon. - String imageName = EarthConstants.LIST_NOT_FINISHED_IMAGE; - try { - - final Map placemarkParameters = earthSurveyService.getPlacemark(keys,false); - - if (earthSurveyService.isPlacemarkSavedActively(placemarkParameters)) { - imageName = EarthConstants.LIST_FILLED_IMAGE; - } else if (earthSurveyService.isPlacemarkEdited(placemarkParameters)) { - imageName = EarthConstants.LIST_NOT_FINISHED_IMAGE; + @GetMapping("/placemarkInfo") + public void placemarkInfoOld(HttpServletRequest request, HttpServletResponse response) throws IOException { + Map collectedData = extractRequestData(request); + String placemarkId = getPlacemarkId(collectedData); + + if (placemarkId == null) { + setResult(false, "No placemark ID found in the request", collectedData); //$NON-NLS-1$ + getLogger().error("No placemark ID found in the received request"); //$NON-NLS-1$ + } else { + placemarkId = replacePlacemarkIdTestValue(placemarkId); + collectedData = getDataAccessor().getData(placemarkId); + if (collectedData != null && collectedData.get(EarthConstants.PLACEMARK_FOUND_PARAMETER) != null + && collectedData.get(EarthConstants.PLACEMARK_FOUND_PARAMETER).equals("true")) { //$NON-NLS-1$ + setResult(true, "The placemark was found", collectedData); //$NON-NLS-1$ + getLogger().info("A placemark was found with these properties {}", collectedData ); //$NON-NLS-1$ } else { - imageName = EarthConstants.LIST_NON_FILLED_IMAGE; + if (collectedData == null) { + collectedData = new HashMap<>(); + } + setResult(false, "No placemark found", collectedData); //$NON-NLS-1$ + getLogger().info("No placemark found {}", collectedData ); //$NON-NLS-1$ } - } catch (Exception e) { - loggerSlf4.error("Error loading image for placemark with ID " + ArrayUtils.toString( keys ) , e); //$NON-NLS-1$ - }finally{ - returnImage(response, imageName); } - } - - private byte[] readFile(String filePath) { - final File imageFile = new File(filePath); - return preloadedFilesService.getFileContent(imageFile); - } - private void returnImage(HttpServletResponse response, String imageName) throws IOException { - response.setHeader("Content-Type", "image/png"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Content-Disposition", "inline; filename=\"" + imageName + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Date", new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH).format(new Date())); //$NON-NLS-1$ + setJsonResponse(response, collectedData); - byte[] resultingImage = null; - if (imageName.equals(EarthConstants.LIST_NON_FILLED_IMAGE)) { - resultingImage = readFile(EarthConstants.LIST_NON_FILLED_IMAGE); - } else if (imageName.equals(EarthConstants.LIST_FILLED_IMAGE)) { - resultingImage = readFile(EarthConstants.LIST_FILLED_IMAGE); - } else if (imageName.equals(EarthConstants.LIST_NOT_FINISHED_IMAGE)) { - resultingImage = readFile(EarthConstants.LIST_NOT_FINISHED_IMAGE); - } + } - if (resultingImage != null) { - response.setHeader("Content-Length", Integer.toString( resultingImage.length ) ); //$NON-NLS-1$ //$NON-NLS-2$ - writeToResponse(response, resultingImage); - } else { - getLogger().error("There was a problem fetching the image, please check the name!"); //$NON-NLS-1$ - } + private String getPlacemarkId(Map collectedData) { + return collectedData.get(EarthConstants.PLACEMARK_ID_PARAMETER); } - private void writeToResponse(HttpServletResponse response, byte[] fileContents) throws IOException { - ServletOutputStream outputStream = response.getOutputStream(); - try { - outputStream.write(fileContents); - outputStream.flush(); - } catch (final Exception e) { - getLogger().error("Error writing reponse body to output stream ", e); //$NON-NLS-1$ - } finally { - outputStream.close(); + private String replacePlacemarkIdTestValue(String placemarkId) { + if (placemarkId.equals("$[id]")) { //$NON-NLS-1$ + placemarkId = "testPlacemark"; //$NON-NLS-1$ } + return placemarkId; } + } From 541f4065fe52888b8014a8da1662fe9721e21335 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:01 +0100 Subject: [PATCH 0144/1620] New translations PlacemarkInfoServlet.java (English) --- .../earth/app/view/Messages_en.properties | 141 +++++------------- 1 file changed, 38 insertions(+), 103 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 3cc75d6710..0c1e208fbc 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,136 +1,71 @@ package org.openforis.collect.earth.app.server; -import java.io.File; import java.io.IOException; -import java.net.URISyntaxException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Locale; +import java.util.HashMap; import java.util.Map; -import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.apache.commons.lang3.ArrayUtils; import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.PreloadedFilesService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; /** - * Servlet used to obtain the right icon/ground-overlay for each placemark. - * These icons symbolize the status of a placemark ( a red exclamation if the placemark has not been filled, a yellow warning sign if the placemark is - * partially filled or a green tick if the placemark information has been successfully filled) + * Servlet to return the information that is stored in Collect Earth for one placemark (plot) * * @author Alfonso Sanchez-Paus Diaz * + * @deprecated Replaced by {@link PlacemarkDataController} */ +@Deprecated @Controller -public class PlacemarkImageServlet extends JsonPocessorServlet { +public class PlacemarkInfoServlet extends JsonPocessorServlet { - @Autowired - private EarthSurveyService earthSurveyService; - - @Autowired - private PreloadedFilesService preloadedFilesService; - - private Logger loggerSlf4 = LoggerFactory.getLogger( PlacemarkImageServlet.class ); - - /** - * Returns an icon/overlay image that represents the state of the placemark not-filled/filling/filled - * @param response The HTTP response object - * @param request The HTTP request object - * @param placemarkId The ID of the placemark for which we want to get the icon/overlay - * @param listView True if want to get the icon for the placemark list, false to get the overlay image (transparent or see-through red for filled placemarks) - * @throws IOException In case the image icon cannot be open - * @throws URISyntaxException In case the image icon URL contains an error - */ - @GetMapping("/placemarkIcon") - public void getImage(HttpServletResponse response, HttpServletRequest request, @RequestParam( EarthConstants.PLACEMARK_ID_PARAMETER ) String placemarkId, - @RequestParam(value = "listView", required = false) Boolean listView) throws IOException, URISyntaxException { - getImageExt(response, request, placemarkId, listView); - } /** - * Returns an icon/overlay image that represents the state of the placemark not-filled/filling/filled - * @param response The HTTP response object - * @param request The HTTP request object - * @param id The ID of the plot with separated by commas - * @param listView True if want to get the icon for the placemark list, false to get the overlay image (transparent or see-through red for filled placemarks) - * @throws IOException In case the image icon cannot be open - * @throws URISyntaxException In case the image icon URL contains an error + * Returns a JSON object with the data collected for a placemark in the collect-earth format. + * @param request The request sent from Google Earth pop-up to Collect Earth + * @param response The response to the Collect Earth request + * @throws IOException Throws exception if the response cannot be written to the channel */ - @GetMapping("/placemarkIconExtd") - public void getImageExt(HttpServletResponse response, HttpServletRequest request, @RequestParam(value = "id", required = false) String id, @RequestParam(value = "listView", required = false) Boolean listView) throws IOException, URISyntaxException { - String[] keys = id.split(","); - - if( listView == null ){ - throw new IllegalArgumentException("This servlet only responds to listView type of requests where the status icons for the placemarks are the expected result"); //$NON-NLS-1$ - } - - // If there is an exception while we get the record info (problem that might happen when using SQLite due to concurrency) return the yellow icon. - String imageName = EarthConstants.LIST_NOT_FINISHED_IMAGE; - try { - - final Map placemarkParameters = earthSurveyService.getPlacemark(keys,false); - - if (earthSurveyService.isPlacemarkSavedActively(placemarkParameters)) { - imageName = EarthConstants.LIST_FILLED_IMAGE; - } else if (earthSurveyService.isPlacemarkEdited(placemarkParameters)) { - imageName = EarthConstants.LIST_NOT_FINISHED_IMAGE; + @GetMapping("/placemarkInfo") + public void placemarkInfoOld(HttpServletRequest request, HttpServletResponse response) throws IOException { + Map collectedData = extractRequestData(request); + String placemarkId = getPlacemarkId(collectedData); + + if (placemarkId == null) { + setResult(false, "No placemark ID found in the request", collectedData); //$NON-NLS-1$ + getLogger().error("No placemark ID found in the received request"); //$NON-NLS-1$ + } else { + placemarkId = replacePlacemarkIdTestValue(placemarkId); + collectedData = getDataAccessor().getData(placemarkId); + if (collectedData != null && collectedData.get(EarthConstants.PLACEMARK_FOUND_PARAMETER) != null + && collectedData.get(EarthConstants.PLACEMARK_FOUND_PARAMETER).equals("true")) { //$NON-NLS-1$ + setResult(true, "The placemark was found", collectedData); //$NON-NLS-1$ + getLogger().info("A placemark was found with these properties {}", collectedData ); //$NON-NLS-1$ } else { - imageName = EarthConstants.LIST_NON_FILLED_IMAGE; + if (collectedData == null) { + collectedData = new HashMap<>(); + } + setResult(false, "No placemark found", collectedData); //$NON-NLS-1$ + getLogger().info("No placemark found {}", collectedData ); //$NON-NLS-1$ } - } catch (Exception e) { - loggerSlf4.error("Error loading image for placemark with ID " + ArrayUtils.toString( keys ) , e); //$NON-NLS-1$ - }finally{ - returnImage(response, imageName); } - } - - private byte[] readFile(String filePath) { - final File imageFile = new File(filePath); - return preloadedFilesService.getFileContent(imageFile); - } - private void returnImage(HttpServletResponse response, String imageName) throws IOException { - response.setHeader("Content-Type", "image/png"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Content-Disposition", "inline; filename=\"" + imageName + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Date", new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH).format(new Date())); //$NON-NLS-1$ + setJsonResponse(response, collectedData); - byte[] resultingImage = null; - if (imageName.equals(EarthConstants.LIST_NON_FILLED_IMAGE)) { - resultingImage = readFile(EarthConstants.LIST_NON_FILLED_IMAGE); - } else if (imageName.equals(EarthConstants.LIST_FILLED_IMAGE)) { - resultingImage = readFile(EarthConstants.LIST_FILLED_IMAGE); - } else if (imageName.equals(EarthConstants.LIST_NOT_FINISHED_IMAGE)) { - resultingImage = readFile(EarthConstants.LIST_NOT_FINISHED_IMAGE); - } + } - if (resultingImage != null) { - response.setHeader("Content-Length", Integer.toString( resultingImage.length ) ); //$NON-NLS-1$ //$NON-NLS-2$ - writeToResponse(response, resultingImage); - } else { - getLogger().error("There was a problem fetching the image, please check the name!"); //$NON-NLS-1$ - } + private String getPlacemarkId(Map collectedData) { + return collectedData.get(EarthConstants.PLACEMARK_ID_PARAMETER); } - private void writeToResponse(HttpServletResponse response, byte[] fileContents) throws IOException { - ServletOutputStream outputStream = response.getOutputStream(); - try { - outputStream.write(fileContents); - outputStream.flush(); - } catch (final Exception e) { - getLogger().error("Error writing reponse body to output stream ", e); //$NON-NLS-1$ - } finally { - outputStream.close(); + private String replacePlacemarkIdTestValue(String placemarkId) { + if (placemarkId.equals("$[id]")) { //$NON-NLS-1$ + placemarkId = "testPlacemark"; //$NON-NLS-1$ } + return placemarkId; } + } From 437bfee916a7e3e8ce510e67f7995d8e771e3719 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:04 +0100 Subject: [PATCH 0145/1620] New translations PlacemarkPlanetImagery.java (Spanish) --- .../earth/app/view/Messages_es.properties | 119 +++++++++++------- 1 file changed, 73 insertions(+), 46 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 0c1e208fbc..df62b703cb 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,71 +1,98 @@ package org.openforis.collect.earth.app.server; import java.io.IOException; -import java.util.HashMap; -import java.util.Map; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.util.Date; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.openforis.collect.earth.app.EarthConstants; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.planet.DateUtils; +import org.openforis.collect.earth.planet.PlanetImagery; +import org.openforis.collect.earth.planet.PlanetRequestParameters; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; /** - * Servlet to return the information that is stored in Collect Earth for one placemark (plot) + * Controller to load and store the information that is stored in Collect Earth + * for one placemark (plot) * * @author Alfonso Sanchez-Paus Diaz + * @author S. Ricci * - * @deprecated Replaced by {@link PlacemarkDataController} */ -@Deprecated @Controller -public class PlacemarkInfoServlet extends JsonPocessorServlet { - - - /** - * Returns a JSON object with the data collected for a placemark in the collect-earth format. - * @param request The request sent from Google Earth pop-up to Collect Earth - * @param response The response to the Collect Earth request - * @throws IOException Throws exception if the response cannot be written to the channel - */ - @GetMapping("/placemarkInfo") - public void placemarkInfoOld(HttpServletRequest request, HttpServletResponse response) throws IOException { - Map collectedData = extractRequestData(request); - String placemarkId = getPlacemarkId(collectedData); - - if (placemarkId == null) { - setResult(false, "No placemark ID found in the request", collectedData); //$NON-NLS-1$ - getLogger().error("No placemark ID found in the received request"); //$NON-NLS-1$ - } else { - placemarkId = replacePlacemarkIdTestValue(placemarkId); - collectedData = getDataAccessor().getData(placemarkId); - if (collectedData != null && collectedData.get(EarthConstants.PLACEMARK_FOUND_PARAMETER) != null - && collectedData.get(EarthConstants.PLACEMARK_FOUND_PARAMETER).equals("true")) { //$NON-NLS-1$ - setResult(true, "The placemark was found", collectedData); //$NON-NLS-1$ - getLogger().info("A placemark was found with these properties {}", collectedData ); //$NON-NLS-1$ - } else { - if (collectedData == null) { - collectedData = new HashMap<>(); - } - setResult(false, "No placemark found", collectedData); //$NON-NLS-1$ - getLogger().info("No placemark found {}", collectedData ); //$NON-NLS-1$ - } - } +public class PlacemarkPlanetImagery extends JsonPocessorServlet { + + @Autowired + LocalPropertiesService localPropertiesService; + + // 2015-07-17T10:50:18.650Z + private SimpleDateFormat planetDateFormat = new SimpleDateFormat("yyyy-MM-dd"); - setJsonResponse(response, collectedData); + @PostMapping(value = "/planetTileUrl") + public void planetTileUrl(HttpServletRequest request, HttpServletResponse response) + throws IOException, ParseException { + PlanetRequestParameters params = getRequestParameters(request); + + PlanetImagery planetImagery = new PlanetImagery(localPropertiesService.getPlanetMapsKey()); + String tileUrl = planetImagery.getLayerUrl(params); + + setJsonResponse(response, tileUrl == null ? "" : tileUrl); } - private String getPlacemarkId(Map collectedData) { - return collectedData.get(EarthConstants.PLACEMARK_ID_PARAMETER); + private PlanetRequestParameters getRequestParameters(HttpServletRequest request) throws ParseException { + Date startDate = planetDateFormat.parse(request.getParameter("start")); + Date endDate = getEndDate(request, startDate); + + double[][][] coords = getCoordinates(request); + String[] itemTypeArray = getItemTypes(request); + + return new PlanetRequestParameters(startDate, endDate, coords, itemTypeArray); } - private String replacePlacemarkIdTestValue(String placemarkId) { - if (placemarkId.equals("$[id]")) { //$NON-NLS-1$ - placemarkId = "testPlacemark"; //$NON-NLS-1$ + private double[][][] getCoordinates(HttpServletRequest request) { + Gson gson = new GsonBuilder().create(); + return gson.fromJson(request.getParameter("geometry"), double[][][].class); + } + + private String[] getItemTypes(HttpServletRequest request) { + String[] itemTypeArray = request.getParameterMap().get("itemTypes[]"); + if (itemTypeArray == null || itemTypeArray.length == 0) { + itemTypeArray = new String[] { "PSScene3Band", "PSScene4Band" }; + } + return itemTypeArray; + } + + private Date getEndDate(HttpServletRequest request, Date startDate) throws ParseException { + String endDateString = request.getParameter("end"); + Date endDate = null; + if (StringUtils.isNotBlank(endDateString)) { + endDate = planetDateFormat.parse(endDateString); + } else { + LocalDateTime localDateTime = DateUtils.asLocalDateTime(startDate); + endDate = DateUtils.asDate(localDateTime.plusDays(30)); } - return placemarkId; + return endDate; + } + + @PostMapping(value = "/planetAvailableImagery") + public void planetAvailableImagery(HttpServletRequest request, HttpServletResponse response) + throws IOException, ParseException { + + PlanetRequestParameters params = getRequestParameters(request); + + PlanetImagery planetImagery = new PlanetImagery(localPropertiesService.getPlanetMapsKey()); + setJsonResponse(response, planetImagery.getAvailableDates(params)); } } From 43b8ec7a8f0d624ef728dae5f36450f5d77f08e1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:05 +0100 Subject: [PATCH 0146/1620] New translations .gitignore (French) --- .../earth/app/view/Messages_fr.properties | 72 +------------------ 1 file changed, 1 insertion(+), 71 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 0c1e208fbc..fa1df1b41e 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,71 +1 @@ -package org.openforis.collect.earth.app.server; - -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.openforis.collect.earth.app.EarthConstants; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; - -/** - * Servlet to return the information that is stored in Collect Earth for one placemark (plot) - * - * @author Alfonso Sanchez-Paus Diaz - * - * @deprecated Replaced by {@link PlacemarkDataController} - */ -@Deprecated -@Controller -public class PlacemarkInfoServlet extends JsonPocessorServlet { - - - /** - * Returns a JSON object with the data collected for a placemark in the collect-earth format. - * @param request The request sent from Google Earth pop-up to Collect Earth - * @param response The response to the Collect Earth request - * @throws IOException Throws exception if the response cannot be written to the channel - */ - @GetMapping("/placemarkInfo") - public void placemarkInfoOld(HttpServletRequest request, HttpServletResponse response) throws IOException { - Map collectedData = extractRequestData(request); - String placemarkId = getPlacemarkId(collectedData); - - if (placemarkId == null) { - setResult(false, "No placemark ID found in the request", collectedData); //$NON-NLS-1$ - getLogger().error("No placemark ID found in the received request"); //$NON-NLS-1$ - } else { - placemarkId = replacePlacemarkIdTestValue(placemarkId); - collectedData = getDataAccessor().getData(placemarkId); - if (collectedData != null && collectedData.get(EarthConstants.PLACEMARK_FOUND_PARAMETER) != null - && collectedData.get(EarthConstants.PLACEMARK_FOUND_PARAMETER).equals("true")) { //$NON-NLS-1$ - setResult(true, "The placemark was found", collectedData); //$NON-NLS-1$ - getLogger().info("A placemark was found with these properties {}", collectedData ); //$NON-NLS-1$ - } else { - if (collectedData == null) { - collectedData = new HashMap<>(); - } - setResult(false, "No placemark found", collectedData); //$NON-NLS-1$ - getLogger().info("No placemark found {}", collectedData ); //$NON-NLS-1$ - } - } - - setJsonResponse(response, collectedData); - - } - - private String getPlacemarkId(Map collectedData) { - return collectedData.get(EarthConstants.PLACEMARK_ID_PARAMETER); - } - - private String replacePlacemarkIdTestValue(String placemarkId) { - if (placemarkId.equals("$[id]")) { //$NON-NLS-1$ - placemarkId = "testPlacemark"; //$NON-NLS-1$ - } - return placemarkId; - } - -} +/DataRepositoryService.java_bc From 7debab1bdb5289aa03853a9516fed8ee4997fe40 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:06 +0100 Subject: [PATCH 0147/1620] New translations PlacemarkPlanetImagery.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 119 +++++++++++------- 1 file changed, 73 insertions(+), 46 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 0c1e208fbc..df62b703cb 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,71 +1,98 @@ package org.openforis.collect.earth.app.server; import java.io.IOException; -import java.util.HashMap; -import java.util.Map; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.util.Date; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.openforis.collect.earth.app.EarthConstants; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.planet.DateUtils; +import org.openforis.collect.earth.planet.PlanetImagery; +import org.openforis.collect.earth.planet.PlanetRequestParameters; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; /** - * Servlet to return the information that is stored in Collect Earth for one placemark (plot) + * Controller to load and store the information that is stored in Collect Earth + * for one placemark (plot) * * @author Alfonso Sanchez-Paus Diaz + * @author S. Ricci * - * @deprecated Replaced by {@link PlacemarkDataController} */ -@Deprecated @Controller -public class PlacemarkInfoServlet extends JsonPocessorServlet { - - - /** - * Returns a JSON object with the data collected for a placemark in the collect-earth format. - * @param request The request sent from Google Earth pop-up to Collect Earth - * @param response The response to the Collect Earth request - * @throws IOException Throws exception if the response cannot be written to the channel - */ - @GetMapping("/placemarkInfo") - public void placemarkInfoOld(HttpServletRequest request, HttpServletResponse response) throws IOException { - Map collectedData = extractRequestData(request); - String placemarkId = getPlacemarkId(collectedData); - - if (placemarkId == null) { - setResult(false, "No placemark ID found in the request", collectedData); //$NON-NLS-1$ - getLogger().error("No placemark ID found in the received request"); //$NON-NLS-1$ - } else { - placemarkId = replacePlacemarkIdTestValue(placemarkId); - collectedData = getDataAccessor().getData(placemarkId); - if (collectedData != null && collectedData.get(EarthConstants.PLACEMARK_FOUND_PARAMETER) != null - && collectedData.get(EarthConstants.PLACEMARK_FOUND_PARAMETER).equals("true")) { //$NON-NLS-1$ - setResult(true, "The placemark was found", collectedData); //$NON-NLS-1$ - getLogger().info("A placemark was found with these properties {}", collectedData ); //$NON-NLS-1$ - } else { - if (collectedData == null) { - collectedData = new HashMap<>(); - } - setResult(false, "No placemark found", collectedData); //$NON-NLS-1$ - getLogger().info("No placemark found {}", collectedData ); //$NON-NLS-1$ - } - } +public class PlacemarkPlanetImagery extends JsonPocessorServlet { + + @Autowired + LocalPropertiesService localPropertiesService; + + // 2015-07-17T10:50:18.650Z + private SimpleDateFormat planetDateFormat = new SimpleDateFormat("yyyy-MM-dd"); - setJsonResponse(response, collectedData); + @PostMapping(value = "/planetTileUrl") + public void planetTileUrl(HttpServletRequest request, HttpServletResponse response) + throws IOException, ParseException { + PlanetRequestParameters params = getRequestParameters(request); + + PlanetImagery planetImagery = new PlanetImagery(localPropertiesService.getPlanetMapsKey()); + String tileUrl = planetImagery.getLayerUrl(params); + + setJsonResponse(response, tileUrl == null ? "" : tileUrl); } - private String getPlacemarkId(Map collectedData) { - return collectedData.get(EarthConstants.PLACEMARK_ID_PARAMETER); + private PlanetRequestParameters getRequestParameters(HttpServletRequest request) throws ParseException { + Date startDate = planetDateFormat.parse(request.getParameter("start")); + Date endDate = getEndDate(request, startDate); + + double[][][] coords = getCoordinates(request); + String[] itemTypeArray = getItemTypes(request); + + return new PlanetRequestParameters(startDate, endDate, coords, itemTypeArray); } - private String replacePlacemarkIdTestValue(String placemarkId) { - if (placemarkId.equals("$[id]")) { //$NON-NLS-1$ - placemarkId = "testPlacemark"; //$NON-NLS-1$ + private double[][][] getCoordinates(HttpServletRequest request) { + Gson gson = new GsonBuilder().create(); + return gson.fromJson(request.getParameter("geometry"), double[][][].class); + } + + private String[] getItemTypes(HttpServletRequest request) { + String[] itemTypeArray = request.getParameterMap().get("itemTypes[]"); + if (itemTypeArray == null || itemTypeArray.length == 0) { + itemTypeArray = new String[] { "PSScene3Band", "PSScene4Band" }; + } + return itemTypeArray; + } + + private Date getEndDate(HttpServletRequest request, Date startDate) throws ParseException { + String endDateString = request.getParameter("end"); + Date endDate = null; + if (StringUtils.isNotBlank(endDateString)) { + endDate = planetDateFormat.parse(endDateString); + } else { + LocalDateTime localDateTime = DateUtils.asLocalDateTime(startDate); + endDate = DateUtils.asDate(localDateTime.plusDays(30)); } - return placemarkId; + return endDate; + } + + @PostMapping(value = "/planetAvailableImagery") + public void planetAvailableImagery(HttpServletRequest request, HttpServletResponse response) + throws IOException, ParseException { + + PlanetRequestParameters params = getRequestParameters(request); + + PlanetImagery planetImagery = new PlanetImagery(localPropertiesService.getPlanetMapsKey()); + setJsonResponse(response, planetImagery.getAvailableDates(params)); } } From 73ccd0d68c57201eb7180cd20f5334c6e879a9cb Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:07 +0100 Subject: [PATCH 0148/1620] New translations PlacemarkPlanetImagery.java (English) --- .../earth/app/view/Messages_en.properties | 119 +++++++++++------- 1 file changed, 73 insertions(+), 46 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 0c1e208fbc..df62b703cb 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,71 +1,98 @@ package org.openforis.collect.earth.app.server; import java.io.IOException; -import java.util.HashMap; -import java.util.Map; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.util.Date; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.openforis.collect.earth.app.EarthConstants; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.planet.DateUtils; +import org.openforis.collect.earth.planet.PlanetImagery; +import org.openforis.collect.earth.planet.PlanetRequestParameters; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; /** - * Servlet to return the information that is stored in Collect Earth for one placemark (plot) + * Controller to load and store the information that is stored in Collect Earth + * for one placemark (plot) * * @author Alfonso Sanchez-Paus Diaz + * @author S. Ricci * - * @deprecated Replaced by {@link PlacemarkDataController} */ -@Deprecated @Controller -public class PlacemarkInfoServlet extends JsonPocessorServlet { - - - /** - * Returns a JSON object with the data collected for a placemark in the collect-earth format. - * @param request The request sent from Google Earth pop-up to Collect Earth - * @param response The response to the Collect Earth request - * @throws IOException Throws exception if the response cannot be written to the channel - */ - @GetMapping("/placemarkInfo") - public void placemarkInfoOld(HttpServletRequest request, HttpServletResponse response) throws IOException { - Map collectedData = extractRequestData(request); - String placemarkId = getPlacemarkId(collectedData); - - if (placemarkId == null) { - setResult(false, "No placemark ID found in the request", collectedData); //$NON-NLS-1$ - getLogger().error("No placemark ID found in the received request"); //$NON-NLS-1$ - } else { - placemarkId = replacePlacemarkIdTestValue(placemarkId); - collectedData = getDataAccessor().getData(placemarkId); - if (collectedData != null && collectedData.get(EarthConstants.PLACEMARK_FOUND_PARAMETER) != null - && collectedData.get(EarthConstants.PLACEMARK_FOUND_PARAMETER).equals("true")) { //$NON-NLS-1$ - setResult(true, "The placemark was found", collectedData); //$NON-NLS-1$ - getLogger().info("A placemark was found with these properties {}", collectedData ); //$NON-NLS-1$ - } else { - if (collectedData == null) { - collectedData = new HashMap<>(); - } - setResult(false, "No placemark found", collectedData); //$NON-NLS-1$ - getLogger().info("No placemark found {}", collectedData ); //$NON-NLS-1$ - } - } +public class PlacemarkPlanetImagery extends JsonPocessorServlet { + + @Autowired + LocalPropertiesService localPropertiesService; + + // 2015-07-17T10:50:18.650Z + private SimpleDateFormat planetDateFormat = new SimpleDateFormat("yyyy-MM-dd"); - setJsonResponse(response, collectedData); + @PostMapping(value = "/planetTileUrl") + public void planetTileUrl(HttpServletRequest request, HttpServletResponse response) + throws IOException, ParseException { + PlanetRequestParameters params = getRequestParameters(request); + + PlanetImagery planetImagery = new PlanetImagery(localPropertiesService.getPlanetMapsKey()); + String tileUrl = planetImagery.getLayerUrl(params); + + setJsonResponse(response, tileUrl == null ? "" : tileUrl); } - private String getPlacemarkId(Map collectedData) { - return collectedData.get(EarthConstants.PLACEMARK_ID_PARAMETER); + private PlanetRequestParameters getRequestParameters(HttpServletRequest request) throws ParseException { + Date startDate = planetDateFormat.parse(request.getParameter("start")); + Date endDate = getEndDate(request, startDate); + + double[][][] coords = getCoordinates(request); + String[] itemTypeArray = getItemTypes(request); + + return new PlanetRequestParameters(startDate, endDate, coords, itemTypeArray); } - private String replacePlacemarkIdTestValue(String placemarkId) { - if (placemarkId.equals("$[id]")) { //$NON-NLS-1$ - placemarkId = "testPlacemark"; //$NON-NLS-1$ + private double[][][] getCoordinates(HttpServletRequest request) { + Gson gson = new GsonBuilder().create(); + return gson.fromJson(request.getParameter("geometry"), double[][][].class); + } + + private String[] getItemTypes(HttpServletRequest request) { + String[] itemTypeArray = request.getParameterMap().get("itemTypes[]"); + if (itemTypeArray == null || itemTypeArray.length == 0) { + itemTypeArray = new String[] { "PSScene3Band", "PSScene4Band" }; + } + return itemTypeArray; + } + + private Date getEndDate(HttpServletRequest request, Date startDate) throws ParseException { + String endDateString = request.getParameter("end"); + Date endDate = null; + if (StringUtils.isNotBlank(endDateString)) { + endDate = planetDateFormat.parse(endDateString); + } else { + LocalDateTime localDateTime = DateUtils.asLocalDateTime(startDate); + endDate = DateUtils.asDate(localDateTime.plusDays(30)); } - return placemarkId; + return endDate; + } + + @PostMapping(value = "/planetAvailableImagery") + public void planetAvailableImagery(HttpServletRequest request, HttpServletResponse response) + throws IOException, ParseException { + + PlanetRequestParameters params = getRequestParameters(request); + + PlanetImagery planetImagery = new PlanetImagery(localPropertiesService.getPlanetMapsKey()); + setJsonResponse(response, planetImagery.getAvailableDates(params)); } } From 2323835fc6f7806f6902e2c69c2ef2c74547c048 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:08 +0100 Subject: [PATCH 0149/1620] New translations PlacemarkUpdateServlet.java (French) --- .../earth/app/view/Messages_fr.properties | 182 +++++++++++++++++- 1 file changed, 181 insertions(+), 1 deletion(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index fa1df1b41e..3a7a63a8e1 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1 +1,181 @@ -/DataRepositoryService.java_bc +package org.openforis.collect.earth.app.server; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.IOException; +import java.io.StringWriter; +import java.io.UnsupportedEncodingException; +import java.io.Writer; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +import javax.servlet.http.HttpServletResponse; + +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; +import org.openforis.collect.model.CollectRecordSummary; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import freemarker.cache.FileTemplateLoader; +import freemarker.template.Configuration; +import freemarker.template.Template; +import freemarker.template.TemplateException; +import freemarker.template.Version; + +/** + * Servlet called by the NetworkLink which tries to update the status of the placemark icons every few seconds. + * + * @author Alfonso Sanchez-Paus Diaz + * + */ +@Controller +public class PlacemarkUpdateServlet { + + private static final String STANDARD_KML_FOR_UPDATES_FILENAME = "updateIcons.fmt"; //$NON-NLS-1$ + private static final String GENERIC_KML_FOR_UPDATES = "resources/" + STANDARD_KML_FOR_UPDATES_FILENAME; //$NON-NLS-1$ + private final Logger logger = LoggerFactory.getLogger(PlacemarkUpdateServlet.class); + + @Autowired + private EarthSurveyService earthSurveyService; + + @Autowired + private LocalPropertiesService localPropertiesService; + + private final Configuration cfg = new Configuration( new Version("2.3.23")); + + private Template template; + + + private String getKmlFromTemplate( Map data) throws IOException { + + intializeTemplate(); + // Console output + final StringWriter fw = new StringWriter(); + final Writer out = new BufferedWriter(fw); + try { + // Add date to avoid caching + template.process(data, out); + } catch (final TemplateException e) { + logger.error("Error when producing starter KML from template", e); //$NON-NLS-1$ + } finally { + out.flush(); + fw.close(); + } + + return fw.toString(); + + } + + private void intializeTemplate() throws IOException { + if (template == null) { + + // first check if there is a custom update template included on the customization that can be used for the project + + String possibleUpdateKmlLocation = localPropertiesService.getProjectFolder() + File.separatorChar + STANDARD_KML_FOR_UPDATES_FILENAME; + File possibleKmlFile = new File( possibleUpdateKmlLocation ); + + if( possibleKmlFile.exists() ){ + /* + * We need to create a new TemplateLoader and use it momentarily as by default the Template loader + * uses the basedir of the project which causes problems when loading file from outside the project folder + */ + cfg.setTemplateLoader( new FileTemplateLoader( new File( possibleKmlFile.getParent() ) ) ); + template = cfg.getTemplate( STANDARD_KML_FOR_UPDATES_FILENAME ); + + }else{ + // No specific updatekml template found on the project folder, fall back to the general one + // Load template from the resource folder + cfg.setTemplateLoader( new FileTemplateLoader( new File( "." ) ) ); + template = cfg.getTemplate(GENERIC_KML_FOR_UPDATES); + } + } + } + + + + /** + * Responds with KML code that causes the Google Earth placemark icon and overlay image to update is status ( filled/not-filled/partially-filled) + * + * @param response The HTTP response object + * @param lastUpdate The datetime when this servlet was last called by the Google Earth network link. + * The date that this request was last sent. This way we get the placemarks that have changed status since the last time this was + * checked. + */ + @GetMapping("/placemarkUpdate") + public void getUpdatePlacemark(HttpServletResponse response, @RequestParam(value = "lastUpdate", required = false) String lastUpdate) { + + try { + + final SimpleDateFormat dateFormat = new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH ); + Date lastUpdateDate = null; + if (lastUpdate != null && lastUpdate.length() > 0) { + lastUpdateDate = dateFormat.parse(lastUpdate); + }else{ + lastUpdateDate = getTwoMinutesAgo(); + } + + List lastUpdatedRecords = null; + try { + lastUpdatedRecords = earthSurveyService.getRecordSummariesSavedSince(lastUpdateDate); + } catch (Exception e) { + lastUpdatedRecords = new ArrayList<>(); + logger.error("Error fetching information about the records updated after : " + lastUpdateDate , e); //$NON-NLS-1$ + } + + final Map data = new HashMap<>(); + data.put("host", ServerController.getHostAddress(localPropertiesService.getHost(), localPropertiesService.getLocalPort())); //$NON-NLS-1$ + data.put("date", getUpdateFromDate(dateFormat) ); // Keep for historical reasons //$NON-NLS-1$ + data.put("lastUpdateDateTime", getUpdateFromDate(dateFormat) ); //$NON-NLS-1$ + data.put("uniqueId", FreemarkerTemplateUtils.randInt(10000, 5000000) ); //$NON-NLS-1$ + data.put("kmlGeneratedOn", localPropertiesService.getGeneratedOn()); //$NON-NLS-1$ + data.put("placemark_ids", earthSurveyService.getPlacemarksId(lastUpdatedRecords)); //$NON-NLS-1$ + + setKmlResponse(response, getKmlFromTemplate(data), dateFormat); + + } catch (final ParseException e) { + logger.error("Error in the lastUpdate date format : " + lastUpdate, e); //$NON-NLS-1$ + } catch (final Exception e) { + logger.error("Error generating the update KML.", e); //$NON-NLS-1$ + } + + } + + private String getUpdateFromDate(final SimpleDateFormat dateFormat) throws UnsupportedEncodingException { + Date twoMinutesAgo = getTwoMinutesAgo(); + return URLEncoder.encode(dateFormat.format(twoMinutesAgo), StandardCharsets.UTF_8.name() ); //$NON-NLS-1$ + } + + public Date getTwoMinutesAgo() { + Calendar cal = Calendar.getInstance(); + cal.add(Calendar.MINUTE, -2); + return cal.getTime(); + } + + private void setKmlResponse(HttpServletResponse response, String kmlCode, SimpleDateFormat dateFormat) throws IOException { + response.setHeader("Content-Type", "application/vnd.google-earth.kml+xml"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Date", dateFormat.format(new Date())); //$NON-NLS-1$ + response.setHeader("Content-Length", Integer.toString( kmlCode.getBytes( StandardCharsets.UTF_8 ).length ) ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + response.getOutputStream().write(kmlCode.getBytes( StandardCharsets.UTF_8 )); //$NON-NLS-1$ + response.getOutputStream().flush(); + response.getOutputStream().close(); + } + +} From a385818b306a0b38e88e88ec451d864b0c70816c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:10 +0100 Subject: [PATCH 0150/1620] New translations PlacemarkUpdateServlet.java (Spanish) --- .../earth/app/view/Messages_es.properties | 191 +++++++++++++----- 1 file changed, 137 insertions(+), 54 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index df62b703cb..3a7a63a8e1 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,98 +1,181 @@ package org.openforis.collect.earth.app.server; +import java.io.BufferedWriter; +import java.io.File; import java.io.IOException; +import java.io.StringWriter; +import java.io.UnsupportedEncodingException; +import java.io.Writer; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Calendar; import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; -import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.service.EarthSurveyService; import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.planet.DateUtils; -import org.openforis.collect.earth.planet.PlanetImagery; -import org.openforis.collect.earth.planet.PlanetRequestParameters; +import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; +import org.openforis.collect.model.CollectRecordSummary; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; +import freemarker.cache.FileTemplateLoader; +import freemarker.template.Configuration; +import freemarker.template.Template; +import freemarker.template.TemplateException; +import freemarker.template.Version; /** - * Controller to load and store the information that is stored in Collect Earth - * for one placemark (plot) + * Servlet called by the NetworkLink which tries to update the status of the placemark icons every few seconds. * * @author Alfonso Sanchez-Paus Diaz - * @author S. Ricci * */ @Controller -public class PlacemarkPlanetImagery extends JsonPocessorServlet { +public class PlacemarkUpdateServlet { + + private static final String STANDARD_KML_FOR_UPDATES_FILENAME = "updateIcons.fmt"; //$NON-NLS-1$ + private static final String GENERIC_KML_FOR_UPDATES = "resources/" + STANDARD_KML_FOR_UPDATES_FILENAME; //$NON-NLS-1$ + private final Logger logger = LoggerFactory.getLogger(PlacemarkUpdateServlet.class); @Autowired - LocalPropertiesService localPropertiesService; + private EarthSurveyService earthSurveyService; - // 2015-07-17T10:50:18.650Z - private SimpleDateFormat planetDateFormat = new SimpleDateFormat("yyyy-MM-dd"); + @Autowired + private LocalPropertiesService localPropertiesService; - @PostMapping(value = "/planetTileUrl") - public void planetTileUrl(HttpServletRequest request, HttpServletResponse response) - throws IOException, ParseException { + private final Configuration cfg = new Configuration( new Version("2.3.23")); - PlanetRequestParameters params = getRequestParameters(request); + private Template template; - PlanetImagery planetImagery = new PlanetImagery(localPropertiesService.getPlanetMapsKey()); - String tileUrl = planetImagery.getLayerUrl(params); - setJsonResponse(response, tileUrl == null ? "" : tileUrl); - } + private String getKmlFromTemplate( Map data) throws IOException { - private PlanetRequestParameters getRequestParameters(HttpServletRequest request) throws ParseException { - Date startDate = planetDateFormat.parse(request.getParameter("start")); - Date endDate = getEndDate(request, startDate); + intializeTemplate(); + // Console output + final StringWriter fw = new StringWriter(); + final Writer out = new BufferedWriter(fw); + try { + // Add date to avoid caching + template.process(data, out); + } catch (final TemplateException e) { + logger.error("Error when producing starter KML from template", e); //$NON-NLS-1$ + } finally { + out.flush(); + fw.close(); + } - double[][][] coords = getCoordinates(request); - String[] itemTypeArray = getItemTypes(request); + return fw.toString(); - return new PlanetRequestParameters(startDate, endDate, coords, itemTypeArray); } - private double[][][] getCoordinates(HttpServletRequest request) { - Gson gson = new GsonBuilder().create(); - return gson.fromJson(request.getParameter("geometry"), double[][][].class); - } + private void intializeTemplate() throws IOException { + if (template == null) { + + // first check if there is a custom update template included on the customization that can be used for the project + + String possibleUpdateKmlLocation = localPropertiesService.getProjectFolder() + File.separatorChar + STANDARD_KML_FOR_UPDATES_FILENAME; + File possibleKmlFile = new File( possibleUpdateKmlLocation ); - private String[] getItemTypes(HttpServletRequest request) { - String[] itemTypeArray = request.getParameterMap().get("itemTypes[]"); - if (itemTypeArray == null || itemTypeArray.length == 0) { - itemTypeArray = new String[] { "PSScene3Band", "PSScene4Band" }; + if( possibleKmlFile.exists() ){ + /* + * We need to create a new TemplateLoader and use it momentarily as by default the Template loader + * uses the basedir of the project which causes problems when loading file from outside the project folder + */ + cfg.setTemplateLoader( new FileTemplateLoader( new File( possibleKmlFile.getParent() ) ) ); + template = cfg.getTemplate( STANDARD_KML_FOR_UPDATES_FILENAME ); + + }else{ + // No specific updatekml template found on the project folder, fall back to the general one + // Load template from the resource folder + cfg.setTemplateLoader( new FileTemplateLoader( new File( "." ) ) ); + template = cfg.getTemplate(GENERIC_KML_FOR_UPDATES); + } } - return itemTypeArray; } - private Date getEndDate(HttpServletRequest request, Date startDate) throws ParseException { - String endDateString = request.getParameter("end"); - Date endDate = null; - if (StringUtils.isNotBlank(endDateString)) { - endDate = planetDateFormat.parse(endDateString); - } else { - LocalDateTime localDateTime = DateUtils.asLocalDateTime(startDate); - endDate = DateUtils.asDate(localDateTime.plusDays(30)); + + + /** + * Responds with KML code that causes the Google Earth placemark icon and overlay image to update is status ( filled/not-filled/partially-filled) + * + * @param response The HTTP response object + * @param lastUpdate The datetime when this servlet was last called by the Google Earth network link. + * The date that this request was last sent. This way we get the placemarks that have changed status since the last time this was + * checked. + */ + @GetMapping("/placemarkUpdate") + public void getUpdatePlacemark(HttpServletResponse response, @RequestParam(value = "lastUpdate", required = false) String lastUpdate) { + + try { + + final SimpleDateFormat dateFormat = new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH ); + Date lastUpdateDate = null; + if (lastUpdate != null && lastUpdate.length() > 0) { + lastUpdateDate = dateFormat.parse(lastUpdate); + }else{ + lastUpdateDate = getTwoMinutesAgo(); + } + + List lastUpdatedRecords = null; + try { + lastUpdatedRecords = earthSurveyService.getRecordSummariesSavedSince(lastUpdateDate); + } catch (Exception e) { + lastUpdatedRecords = new ArrayList<>(); + logger.error("Error fetching information about the records updated after : " + lastUpdateDate , e); //$NON-NLS-1$ + } + + final Map data = new HashMap<>(); + data.put("host", ServerController.getHostAddress(localPropertiesService.getHost(), localPropertiesService.getLocalPort())); //$NON-NLS-1$ + data.put("date", getUpdateFromDate(dateFormat) ); // Keep for historical reasons //$NON-NLS-1$ + data.put("lastUpdateDateTime", getUpdateFromDate(dateFormat) ); //$NON-NLS-1$ + data.put("uniqueId", FreemarkerTemplateUtils.randInt(10000, 5000000) ); //$NON-NLS-1$ + data.put("kmlGeneratedOn", localPropertiesService.getGeneratedOn()); //$NON-NLS-1$ + data.put("placemark_ids", earthSurveyService.getPlacemarksId(lastUpdatedRecords)); //$NON-NLS-1$ + + setKmlResponse(response, getKmlFromTemplate(data), dateFormat); + + } catch (final ParseException e) { + logger.error("Error in the lastUpdate date format : " + lastUpdate, e); //$NON-NLS-1$ + } catch (final Exception e) { + logger.error("Error generating the update KML.", e); //$NON-NLS-1$ } - return endDate; + } - @PostMapping(value = "/planetAvailableImagery") - public void planetAvailableImagery(HttpServletRequest request, HttpServletResponse response) - throws IOException, ParseException { + private String getUpdateFromDate(final SimpleDateFormat dateFormat) throws UnsupportedEncodingException { + Date twoMinutesAgo = getTwoMinutesAgo(); + return URLEncoder.encode(dateFormat.format(twoMinutesAgo), StandardCharsets.UTF_8.name() ); //$NON-NLS-1$ + } - PlanetRequestParameters params = getRequestParameters(request); + public Date getTwoMinutesAgo() { + Calendar cal = Calendar.getInstance(); + cal.add(Calendar.MINUTE, -2); + return cal.getTime(); + } - PlanetImagery planetImagery = new PlanetImagery(localPropertiesService.getPlanetMapsKey()); - setJsonResponse(response, planetImagery.getAvailableDates(params)); + private void setKmlResponse(HttpServletResponse response, String kmlCode, SimpleDateFormat dateFormat) throws IOException { + response.setHeader("Content-Type", "application/vnd.google-earth.kml+xml"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Date", dateFormat.format(new Date())); //$NON-NLS-1$ + response.setHeader("Content-Length", Integer.toString( kmlCode.getBytes( StandardCharsets.UTF_8 ).length ) ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + response.getOutputStream().write(kmlCode.getBytes( StandardCharsets.UTF_8 )); //$NON-NLS-1$ + response.getOutputStream().flush(); + response.getOutputStream().close(); } } From ef20aa0df6955ec8263e27e8405255cc56e562e2 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:11 +0100 Subject: [PATCH 0151/1620] New translations PlacemarkUpdateServlet.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 191 +++++++++++++----- 1 file changed, 137 insertions(+), 54 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index df62b703cb..3a7a63a8e1 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,98 +1,181 @@ package org.openforis.collect.earth.app.server; +import java.io.BufferedWriter; +import java.io.File; import java.io.IOException; +import java.io.StringWriter; +import java.io.UnsupportedEncodingException; +import java.io.Writer; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Calendar; import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; -import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.service.EarthSurveyService; import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.planet.DateUtils; -import org.openforis.collect.earth.planet.PlanetImagery; -import org.openforis.collect.earth.planet.PlanetRequestParameters; +import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; +import org.openforis.collect.model.CollectRecordSummary; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; +import freemarker.cache.FileTemplateLoader; +import freemarker.template.Configuration; +import freemarker.template.Template; +import freemarker.template.TemplateException; +import freemarker.template.Version; /** - * Controller to load and store the information that is stored in Collect Earth - * for one placemark (plot) + * Servlet called by the NetworkLink which tries to update the status of the placemark icons every few seconds. * * @author Alfonso Sanchez-Paus Diaz - * @author S. Ricci * */ @Controller -public class PlacemarkPlanetImagery extends JsonPocessorServlet { +public class PlacemarkUpdateServlet { + + private static final String STANDARD_KML_FOR_UPDATES_FILENAME = "updateIcons.fmt"; //$NON-NLS-1$ + private static final String GENERIC_KML_FOR_UPDATES = "resources/" + STANDARD_KML_FOR_UPDATES_FILENAME; //$NON-NLS-1$ + private final Logger logger = LoggerFactory.getLogger(PlacemarkUpdateServlet.class); @Autowired - LocalPropertiesService localPropertiesService; + private EarthSurveyService earthSurveyService; - // 2015-07-17T10:50:18.650Z - private SimpleDateFormat planetDateFormat = new SimpleDateFormat("yyyy-MM-dd"); + @Autowired + private LocalPropertiesService localPropertiesService; - @PostMapping(value = "/planetTileUrl") - public void planetTileUrl(HttpServletRequest request, HttpServletResponse response) - throws IOException, ParseException { + private final Configuration cfg = new Configuration( new Version("2.3.23")); - PlanetRequestParameters params = getRequestParameters(request); + private Template template; - PlanetImagery planetImagery = new PlanetImagery(localPropertiesService.getPlanetMapsKey()); - String tileUrl = planetImagery.getLayerUrl(params); - setJsonResponse(response, tileUrl == null ? "" : tileUrl); - } + private String getKmlFromTemplate( Map data) throws IOException { - private PlanetRequestParameters getRequestParameters(HttpServletRequest request) throws ParseException { - Date startDate = planetDateFormat.parse(request.getParameter("start")); - Date endDate = getEndDate(request, startDate); + intializeTemplate(); + // Console output + final StringWriter fw = new StringWriter(); + final Writer out = new BufferedWriter(fw); + try { + // Add date to avoid caching + template.process(data, out); + } catch (final TemplateException e) { + logger.error("Error when producing starter KML from template", e); //$NON-NLS-1$ + } finally { + out.flush(); + fw.close(); + } - double[][][] coords = getCoordinates(request); - String[] itemTypeArray = getItemTypes(request); + return fw.toString(); - return new PlanetRequestParameters(startDate, endDate, coords, itemTypeArray); } - private double[][][] getCoordinates(HttpServletRequest request) { - Gson gson = new GsonBuilder().create(); - return gson.fromJson(request.getParameter("geometry"), double[][][].class); - } + private void intializeTemplate() throws IOException { + if (template == null) { + + // first check if there is a custom update template included on the customization that can be used for the project + + String possibleUpdateKmlLocation = localPropertiesService.getProjectFolder() + File.separatorChar + STANDARD_KML_FOR_UPDATES_FILENAME; + File possibleKmlFile = new File( possibleUpdateKmlLocation ); - private String[] getItemTypes(HttpServletRequest request) { - String[] itemTypeArray = request.getParameterMap().get("itemTypes[]"); - if (itemTypeArray == null || itemTypeArray.length == 0) { - itemTypeArray = new String[] { "PSScene3Band", "PSScene4Band" }; + if( possibleKmlFile.exists() ){ + /* + * We need to create a new TemplateLoader and use it momentarily as by default the Template loader + * uses the basedir of the project which causes problems when loading file from outside the project folder + */ + cfg.setTemplateLoader( new FileTemplateLoader( new File( possibleKmlFile.getParent() ) ) ); + template = cfg.getTemplate( STANDARD_KML_FOR_UPDATES_FILENAME ); + + }else{ + // No specific updatekml template found on the project folder, fall back to the general one + // Load template from the resource folder + cfg.setTemplateLoader( new FileTemplateLoader( new File( "." ) ) ); + template = cfg.getTemplate(GENERIC_KML_FOR_UPDATES); + } } - return itemTypeArray; } - private Date getEndDate(HttpServletRequest request, Date startDate) throws ParseException { - String endDateString = request.getParameter("end"); - Date endDate = null; - if (StringUtils.isNotBlank(endDateString)) { - endDate = planetDateFormat.parse(endDateString); - } else { - LocalDateTime localDateTime = DateUtils.asLocalDateTime(startDate); - endDate = DateUtils.asDate(localDateTime.plusDays(30)); + + + /** + * Responds with KML code that causes the Google Earth placemark icon and overlay image to update is status ( filled/not-filled/partially-filled) + * + * @param response The HTTP response object + * @param lastUpdate The datetime when this servlet was last called by the Google Earth network link. + * The date that this request was last sent. This way we get the placemarks that have changed status since the last time this was + * checked. + */ + @GetMapping("/placemarkUpdate") + public void getUpdatePlacemark(HttpServletResponse response, @RequestParam(value = "lastUpdate", required = false) String lastUpdate) { + + try { + + final SimpleDateFormat dateFormat = new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH ); + Date lastUpdateDate = null; + if (lastUpdate != null && lastUpdate.length() > 0) { + lastUpdateDate = dateFormat.parse(lastUpdate); + }else{ + lastUpdateDate = getTwoMinutesAgo(); + } + + List lastUpdatedRecords = null; + try { + lastUpdatedRecords = earthSurveyService.getRecordSummariesSavedSince(lastUpdateDate); + } catch (Exception e) { + lastUpdatedRecords = new ArrayList<>(); + logger.error("Error fetching information about the records updated after : " + lastUpdateDate , e); //$NON-NLS-1$ + } + + final Map data = new HashMap<>(); + data.put("host", ServerController.getHostAddress(localPropertiesService.getHost(), localPropertiesService.getLocalPort())); //$NON-NLS-1$ + data.put("date", getUpdateFromDate(dateFormat) ); // Keep for historical reasons //$NON-NLS-1$ + data.put("lastUpdateDateTime", getUpdateFromDate(dateFormat) ); //$NON-NLS-1$ + data.put("uniqueId", FreemarkerTemplateUtils.randInt(10000, 5000000) ); //$NON-NLS-1$ + data.put("kmlGeneratedOn", localPropertiesService.getGeneratedOn()); //$NON-NLS-1$ + data.put("placemark_ids", earthSurveyService.getPlacemarksId(lastUpdatedRecords)); //$NON-NLS-1$ + + setKmlResponse(response, getKmlFromTemplate(data), dateFormat); + + } catch (final ParseException e) { + logger.error("Error in the lastUpdate date format : " + lastUpdate, e); //$NON-NLS-1$ + } catch (final Exception e) { + logger.error("Error generating the update KML.", e); //$NON-NLS-1$ } - return endDate; + } - @PostMapping(value = "/planetAvailableImagery") - public void planetAvailableImagery(HttpServletRequest request, HttpServletResponse response) - throws IOException, ParseException { + private String getUpdateFromDate(final SimpleDateFormat dateFormat) throws UnsupportedEncodingException { + Date twoMinutesAgo = getTwoMinutesAgo(); + return URLEncoder.encode(dateFormat.format(twoMinutesAgo), StandardCharsets.UTF_8.name() ); //$NON-NLS-1$ + } - PlanetRequestParameters params = getRequestParameters(request); + public Date getTwoMinutesAgo() { + Calendar cal = Calendar.getInstance(); + cal.add(Calendar.MINUTE, -2); + return cal.getTime(); + } - PlanetImagery planetImagery = new PlanetImagery(localPropertiesService.getPlanetMapsKey()); - setJsonResponse(response, planetImagery.getAvailableDates(params)); + private void setKmlResponse(HttpServletResponse response, String kmlCode, SimpleDateFormat dateFormat) throws IOException { + response.setHeader("Content-Type", "application/vnd.google-earth.kml+xml"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Date", dateFormat.format(new Date())); //$NON-NLS-1$ + response.setHeader("Content-Length", Integer.toString( kmlCode.getBytes( StandardCharsets.UTF_8 ).length ) ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + response.getOutputStream().write(kmlCode.getBytes( StandardCharsets.UTF_8 )); //$NON-NLS-1$ + response.getOutputStream().flush(); + response.getOutputStream().close(); } } From bdff9c9aa980eaf5109f0e27df2a358e24592e6d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:12 +0100 Subject: [PATCH 0152/1620] New translations PlacemarkUpdateServlet.java (English) --- .../earth/app/view/Messages_en.properties | 191 +++++++++++++----- 1 file changed, 137 insertions(+), 54 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index df62b703cb..3a7a63a8e1 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,98 +1,181 @@ package org.openforis.collect.earth.app.server; +import java.io.BufferedWriter; +import java.io.File; import java.io.IOException; +import java.io.StringWriter; +import java.io.UnsupportedEncodingException; +import java.io.Writer; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Calendar; import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; -import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.service.EarthSurveyService; import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.planet.DateUtils; -import org.openforis.collect.earth.planet.PlanetImagery; -import org.openforis.collect.earth.planet.PlanetRequestParameters; +import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; +import org.openforis.collect.model.CollectRecordSummary; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; +import freemarker.cache.FileTemplateLoader; +import freemarker.template.Configuration; +import freemarker.template.Template; +import freemarker.template.TemplateException; +import freemarker.template.Version; /** - * Controller to load and store the information that is stored in Collect Earth - * for one placemark (plot) + * Servlet called by the NetworkLink which tries to update the status of the placemark icons every few seconds. * * @author Alfonso Sanchez-Paus Diaz - * @author S. Ricci * */ @Controller -public class PlacemarkPlanetImagery extends JsonPocessorServlet { +public class PlacemarkUpdateServlet { + + private static final String STANDARD_KML_FOR_UPDATES_FILENAME = "updateIcons.fmt"; //$NON-NLS-1$ + private static final String GENERIC_KML_FOR_UPDATES = "resources/" + STANDARD_KML_FOR_UPDATES_FILENAME; //$NON-NLS-1$ + private final Logger logger = LoggerFactory.getLogger(PlacemarkUpdateServlet.class); @Autowired - LocalPropertiesService localPropertiesService; + private EarthSurveyService earthSurveyService; - // 2015-07-17T10:50:18.650Z - private SimpleDateFormat planetDateFormat = new SimpleDateFormat("yyyy-MM-dd"); + @Autowired + private LocalPropertiesService localPropertiesService; - @PostMapping(value = "/planetTileUrl") - public void planetTileUrl(HttpServletRequest request, HttpServletResponse response) - throws IOException, ParseException { + private final Configuration cfg = new Configuration( new Version("2.3.23")); - PlanetRequestParameters params = getRequestParameters(request); + private Template template; - PlanetImagery planetImagery = new PlanetImagery(localPropertiesService.getPlanetMapsKey()); - String tileUrl = planetImagery.getLayerUrl(params); - setJsonResponse(response, tileUrl == null ? "" : tileUrl); - } + private String getKmlFromTemplate( Map data) throws IOException { - private PlanetRequestParameters getRequestParameters(HttpServletRequest request) throws ParseException { - Date startDate = planetDateFormat.parse(request.getParameter("start")); - Date endDate = getEndDate(request, startDate); + intializeTemplate(); + // Console output + final StringWriter fw = new StringWriter(); + final Writer out = new BufferedWriter(fw); + try { + // Add date to avoid caching + template.process(data, out); + } catch (final TemplateException e) { + logger.error("Error when producing starter KML from template", e); //$NON-NLS-1$ + } finally { + out.flush(); + fw.close(); + } - double[][][] coords = getCoordinates(request); - String[] itemTypeArray = getItemTypes(request); + return fw.toString(); - return new PlanetRequestParameters(startDate, endDate, coords, itemTypeArray); } - private double[][][] getCoordinates(HttpServletRequest request) { - Gson gson = new GsonBuilder().create(); - return gson.fromJson(request.getParameter("geometry"), double[][][].class); - } + private void intializeTemplate() throws IOException { + if (template == null) { + + // first check if there is a custom update template included on the customization that can be used for the project + + String possibleUpdateKmlLocation = localPropertiesService.getProjectFolder() + File.separatorChar + STANDARD_KML_FOR_UPDATES_FILENAME; + File possibleKmlFile = new File( possibleUpdateKmlLocation ); - private String[] getItemTypes(HttpServletRequest request) { - String[] itemTypeArray = request.getParameterMap().get("itemTypes[]"); - if (itemTypeArray == null || itemTypeArray.length == 0) { - itemTypeArray = new String[] { "PSScene3Band", "PSScene4Band" }; + if( possibleKmlFile.exists() ){ + /* + * We need to create a new TemplateLoader and use it momentarily as by default the Template loader + * uses the basedir of the project which causes problems when loading file from outside the project folder + */ + cfg.setTemplateLoader( new FileTemplateLoader( new File( possibleKmlFile.getParent() ) ) ); + template = cfg.getTemplate( STANDARD_KML_FOR_UPDATES_FILENAME ); + + }else{ + // No specific updatekml template found on the project folder, fall back to the general one + // Load template from the resource folder + cfg.setTemplateLoader( new FileTemplateLoader( new File( "." ) ) ); + template = cfg.getTemplate(GENERIC_KML_FOR_UPDATES); + } } - return itemTypeArray; } - private Date getEndDate(HttpServletRequest request, Date startDate) throws ParseException { - String endDateString = request.getParameter("end"); - Date endDate = null; - if (StringUtils.isNotBlank(endDateString)) { - endDate = planetDateFormat.parse(endDateString); - } else { - LocalDateTime localDateTime = DateUtils.asLocalDateTime(startDate); - endDate = DateUtils.asDate(localDateTime.plusDays(30)); + + + /** + * Responds with KML code that causes the Google Earth placemark icon and overlay image to update is status ( filled/not-filled/partially-filled) + * + * @param response The HTTP response object + * @param lastUpdate The datetime when this servlet was last called by the Google Earth network link. + * The date that this request was last sent. This way we get the placemarks that have changed status since the last time this was + * checked. + */ + @GetMapping("/placemarkUpdate") + public void getUpdatePlacemark(HttpServletResponse response, @RequestParam(value = "lastUpdate", required = false) String lastUpdate) { + + try { + + final SimpleDateFormat dateFormat = new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH ); + Date lastUpdateDate = null; + if (lastUpdate != null && lastUpdate.length() > 0) { + lastUpdateDate = dateFormat.parse(lastUpdate); + }else{ + lastUpdateDate = getTwoMinutesAgo(); + } + + List lastUpdatedRecords = null; + try { + lastUpdatedRecords = earthSurveyService.getRecordSummariesSavedSince(lastUpdateDate); + } catch (Exception e) { + lastUpdatedRecords = new ArrayList<>(); + logger.error("Error fetching information about the records updated after : " + lastUpdateDate , e); //$NON-NLS-1$ + } + + final Map data = new HashMap<>(); + data.put("host", ServerController.getHostAddress(localPropertiesService.getHost(), localPropertiesService.getLocalPort())); //$NON-NLS-1$ + data.put("date", getUpdateFromDate(dateFormat) ); // Keep for historical reasons //$NON-NLS-1$ + data.put("lastUpdateDateTime", getUpdateFromDate(dateFormat) ); //$NON-NLS-1$ + data.put("uniqueId", FreemarkerTemplateUtils.randInt(10000, 5000000) ); //$NON-NLS-1$ + data.put("kmlGeneratedOn", localPropertiesService.getGeneratedOn()); //$NON-NLS-1$ + data.put("placemark_ids", earthSurveyService.getPlacemarksId(lastUpdatedRecords)); //$NON-NLS-1$ + + setKmlResponse(response, getKmlFromTemplate(data), dateFormat); + + } catch (final ParseException e) { + logger.error("Error in the lastUpdate date format : " + lastUpdate, e); //$NON-NLS-1$ + } catch (final Exception e) { + logger.error("Error generating the update KML.", e); //$NON-NLS-1$ } - return endDate; + } - @PostMapping(value = "/planetAvailableImagery") - public void planetAvailableImagery(HttpServletRequest request, HttpServletResponse response) - throws IOException, ParseException { + private String getUpdateFromDate(final SimpleDateFormat dateFormat) throws UnsupportedEncodingException { + Date twoMinutesAgo = getTwoMinutesAgo(); + return URLEncoder.encode(dateFormat.format(twoMinutesAgo), StandardCharsets.UTF_8.name() ); //$NON-NLS-1$ + } - PlanetRequestParameters params = getRequestParameters(request); + public Date getTwoMinutesAgo() { + Calendar cal = Calendar.getInstance(); + cal.add(Calendar.MINUTE, -2); + return cal.getTime(); + } - PlanetImagery planetImagery = new PlanetImagery(localPropertiesService.getPlanetMapsKey()); - setJsonResponse(response, planetImagery.getAvailableDates(params)); + private void setKmlResponse(HttpServletResponse response, String kmlCode, SimpleDateFormat dateFormat) throws IOException { + response.setHeader("Content-Type", "application/vnd.google-earth.kml+xml"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Date", dateFormat.format(new Date())); //$NON-NLS-1$ + response.setHeader("Content-Length", Integer.toString( kmlCode.getBytes( StandardCharsets.UTF_8 ).length ) ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + response.getOutputStream().write(kmlCode.getBytes( StandardCharsets.UTF_8 )); //$NON-NLS-1$ + response.getOutputStream().flush(); + response.getOutputStream().close(); } } From 5006e64c08bffa47bf1152a00944a933fe8e5404 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:13 +0100 Subject: [PATCH 0153/1620] New translations SaveEarthDataServlet.java (French) --- .../earth/app/view/Messages_fr.properties | 188 +++++------------- 1 file changed, 47 insertions(+), 141 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 3a7a63a8e1..b23ed83438 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,181 +1,87 @@ package org.openforis.collect.earth.app.server; -import java.io.BufferedWriter; -import java.io.File; import java.io.IOException; -import java.io.StringWriter; -import java.io.UnsupportedEncodingException; -import java.io.Writer; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; import java.util.Map; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.desktop.ServerController; -import org.openforis.collect.earth.app.service.EarthSurveyService; import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; -import org.openforis.collect.model.CollectRecordSummary; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.openforis.collect.earth.app.view.Messages; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; - -import freemarker.cache.FileTemplateLoader; -import freemarker.template.Configuration; -import freemarker.template.Template; -import freemarker.template.TemplateException; -import freemarker.template.Version; /** - * Servlet called by the NetworkLink which tries to update the status of the placemark icons every few seconds. - * + * Servlet called for updating/saving the information about a placemark. Called from the form in Google Earth when the user interacts with it or clicks the save button. * @author Alfonso Sanchez-Paus Diaz * + * @deprecated Replaced by {@link PlacemarkDataController} + * */ +@Deprecated @Controller -public class PlacemarkUpdateServlet { - - private static final String STANDARD_KML_FOR_UPDATES_FILENAME = "updateIcons.fmt"; //$NON-NLS-1$ - private static final String GENERIC_KML_FOR_UPDATES = "resources/" + STANDARD_KML_FOR_UPDATES_FILENAME; //$NON-NLS-1$ - private final Logger logger = LoggerFactory.getLogger(PlacemarkUpdateServlet.class); +public class SaveEarthDataServlet extends JsonPocessorServlet { @Autowired - private EarthSurveyService earthSurveyService; - - @Autowired - private LocalPropertiesService localPropertiesService; - - private final Configuration cfg = new Configuration( new Version("2.3.23")); - - private Template template; + LocalPropertiesService localPropertiesService; + //@Autowired + //CollectDesignerController collectDesignerController; - private String getKmlFromTemplate( Map data) throws IOException { - intializeTemplate(); - // Console output - final StringWriter fw = new StringWriter(); - final Writer out = new BufferedWriter(fw); - try { - // Add date to avoid caching - template.process(data, out); - } catch (final TemplateException e) { - logger.error("Error when producing starter KML from template", e); //$NON-NLS-1$ - } finally { - out.flush(); - fw.close(); - } - - return fw.toString(); - - } + @Deprecated + @GetMapping("/saveData") + public void saveData(HttpServletRequest request, HttpServletResponse response) throws IOException { - private void intializeTemplate() throws IOException { - if (template == null) { + Map collectedData = extractRequestData(request); - // first check if there is a custom update template included on the customization that can be used for the project + replaceTestVariables(collectedData); - String possibleUpdateKmlLocation = localPropertiesService.getProjectFolder() + File.separatorChar + STANDARD_KML_FOR_UPDATES_FILENAME; - File possibleKmlFile = new File( possibleUpdateKmlLocation ); - - if( possibleKmlFile.exists() ){ - /* - * We need to create a new TemplateLoader and use it momentarily as by default the Template loader - * uses the basedir of the project which causes problems when loading file from outside the project folder - */ - cfg.setTemplateLoader( new FileTemplateLoader( new File( possibleKmlFile.getParent() ) ) ); - template = cfg.getTemplate( STANDARD_KML_FOR_UPDATES_FILENAME ); - - }else{ - // No specific updatekml template found on the project folder, fall back to the general one - // Load template from the resource folder - cfg.setTemplateLoader( new FileTemplateLoader( new File( "." ) ) ); - template = cfg.getTemplate(GENERIC_KML_FOR_UPDATES); + if (collectedData.size() == 0) { + setResult(false, Messages.getString("SaveEarthDataServlet.0"), collectedData); //$NON-NLS-1$ + getLogger().info("The request was empty"); //$NON-NLS-1$ + } else { + if (getDataAccessor().saveData(collectedData)) { + setResult(true, Messages.getString("SaveEarthDataServlet.2"), collectedData); //$NON-NLS-1$ + } else { + setResult(false, Messages.getString("SaveEarthDataServlet.1"), collectedData); //$NON-NLS-1$ + getLogger().error("The data could not be saved"); //$NON-NLS-1$ } } - } - + setJsonResponse(response, collectedData); + } /** - * Responds with KML code that causes the Google Earth placemark icon and overlay image to update is status ( filled/not-filled/partially-filled) + * This method replaces the variable values that the form contains when it is not run + * through Google Earth and the variable replacement of the ExtendedData of the KML does not kick in. * - * @param response The HTTP response object - * @param lastUpdate The datetime when this servlet was last called by the Google Earth network link. - * The date that this request was last sent. This way we get the placemarks that have changed status since the last time this was - * checked. + * @param collectedData + * The data POSTed by the form that has already been processed. */ - @GetMapping("/placemarkUpdate") - public void getUpdatePlacemark(HttpServletResponse response, @RequestParam(value = "lastUpdate", required = false) String lastUpdate) { - - try { - - final SimpleDateFormat dateFormat = new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH ); - Date lastUpdateDate = null; - if (lastUpdate != null && lastUpdate.length() > 0) { - lastUpdateDate = dateFormat.parse(lastUpdate); - }else{ - lastUpdateDate = getTwoMinutesAgo(); - } - - List lastUpdatedRecords = null; - try { - lastUpdatedRecords = earthSurveyService.getRecordSummariesSavedSince(lastUpdateDate); - } catch (Exception e) { - lastUpdatedRecords = new ArrayList<>(); - logger.error("Error fetching information about the records updated after : " + lastUpdateDate , e); //$NON-NLS-1$ - } - - final Map data = new HashMap<>(); - data.put("host", ServerController.getHostAddress(localPropertiesService.getHost(), localPropertiesService.getLocalPort())); //$NON-NLS-1$ - data.put("date", getUpdateFromDate(dateFormat) ); // Keep for historical reasons //$NON-NLS-1$ - data.put("lastUpdateDateTime", getUpdateFromDate(dateFormat) ); //$NON-NLS-1$ - data.put("uniqueId", FreemarkerTemplateUtils.randInt(10000, 5000000) ); //$NON-NLS-1$ - data.put("kmlGeneratedOn", localPropertiesService.getGeneratedOn()); //$NON-NLS-1$ - data.put("placemark_ids", earthSurveyService.getPlacemarksId(lastUpdatedRecords)); //$NON-NLS-1$ - - setKmlResponse(response, getKmlFromTemplate(data), dateFormat); - - } catch (final ParseException e) { - logger.error("Error in the lastUpdate date format : " + lastUpdate, e); //$NON-NLS-1$ - } catch (final Exception e) { - logger.error("Error generating the update KML.", e); //$NON-NLS-1$ + private void replaceTestVariables(Map collectedData) { + // REMOVE THIS!!!! + if (collectedData.get(EarthConstants.PLACEMARK_ID_PARAMETER).equals("$[id]")) { //$NON-NLS-1$ //$NON-NLS-2$ + collectedData.put(EarthConstants.PLACEMARK_ID_PARAMETER, "testPlacemark"); //$NON-NLS-1$ //$NON-NLS-2$ } - } + if (collectedData.get("collect_integer_elevation") != null && collectedData.get("collect_integer_elevation").equals("$[elevation]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + collectedData.put("collect_integer_elevation", "0"); //$NON-NLS-1$ //$NON-NLS-2$ + } - private String getUpdateFromDate(final SimpleDateFormat dateFormat) throws UnsupportedEncodingException { - Date twoMinutesAgo = getTwoMinutesAgo(); - return URLEncoder.encode(dateFormat.format(twoMinutesAgo), StandardCharsets.UTF_8.name() ); //$NON-NLS-1$ - } + if (collectedData.get("collect_real_slope") != null && collectedData.get("collect_real_slope").equals("$[slope]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + collectedData.put("collect_real_slope", "0"); //$NON-NLS-1$ //$NON-NLS-2$ + } - public Date getTwoMinutesAgo() { - Calendar cal = Calendar.getInstance(); - cal.add(Calendar.MINUTE, -2); - return cal.getTime(); - } + if (collectedData.get("collect_real_aspect") != null && collectedData.get("collect_real_aspect").equals("$[aspect]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + collectedData.put("collect_real_aspect", "0"); //$NON-NLS-1$ //$NON-NLS-2$ + } - private void setKmlResponse(HttpServletResponse response, String kmlCode, SimpleDateFormat dateFormat) throws IOException { - response.setHeader("Content-Type", "application/vnd.google-earth.kml+xml"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Date", dateFormat.format(new Date())); //$NON-NLS-1$ - response.setHeader("Content-Length", Integer.toString( kmlCode.getBytes( StandardCharsets.UTF_8 ).length ) ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - response.getOutputStream().write(kmlCode.getBytes( StandardCharsets.UTF_8 )); //$NON-NLS-1$ - response.getOutputStream().flush(); - response.getOutputStream().close(); + if (collectedData.get("collect_coord_location").equals("$[latitude],$[longitude]")) { //$NON-NLS-1$ //$NON-NLS-2$ + collectedData.put("collect_coord_location", "0,0"); //$NON-NLS-1$ //$NON-NLS-2$ + } } -} +} \ No newline at end of file From c9c188220e482f8a473fa4fd1ef48d1c06b63c14 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:14 +0100 Subject: [PATCH 0154/1620] New translations SaveEarthDataServlet.java (Spanish) --- .../earth/app/view/Messages_es.properties | 188 +++++------------- 1 file changed, 47 insertions(+), 141 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 3a7a63a8e1..b23ed83438 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,181 +1,87 @@ package org.openforis.collect.earth.app.server; -import java.io.BufferedWriter; -import java.io.File; import java.io.IOException; -import java.io.StringWriter; -import java.io.UnsupportedEncodingException; -import java.io.Writer; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; import java.util.Map; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.desktop.ServerController; -import org.openforis.collect.earth.app.service.EarthSurveyService; import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; -import org.openforis.collect.model.CollectRecordSummary; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.openforis.collect.earth.app.view.Messages; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; - -import freemarker.cache.FileTemplateLoader; -import freemarker.template.Configuration; -import freemarker.template.Template; -import freemarker.template.TemplateException; -import freemarker.template.Version; /** - * Servlet called by the NetworkLink which tries to update the status of the placemark icons every few seconds. - * + * Servlet called for updating/saving the information about a placemark. Called from the form in Google Earth when the user interacts with it or clicks the save button. * @author Alfonso Sanchez-Paus Diaz * + * @deprecated Replaced by {@link PlacemarkDataController} + * */ +@Deprecated @Controller -public class PlacemarkUpdateServlet { - - private static final String STANDARD_KML_FOR_UPDATES_FILENAME = "updateIcons.fmt"; //$NON-NLS-1$ - private static final String GENERIC_KML_FOR_UPDATES = "resources/" + STANDARD_KML_FOR_UPDATES_FILENAME; //$NON-NLS-1$ - private final Logger logger = LoggerFactory.getLogger(PlacemarkUpdateServlet.class); +public class SaveEarthDataServlet extends JsonPocessorServlet { @Autowired - private EarthSurveyService earthSurveyService; - - @Autowired - private LocalPropertiesService localPropertiesService; - - private final Configuration cfg = new Configuration( new Version("2.3.23")); - - private Template template; + LocalPropertiesService localPropertiesService; + //@Autowired + //CollectDesignerController collectDesignerController; - private String getKmlFromTemplate( Map data) throws IOException { - intializeTemplate(); - // Console output - final StringWriter fw = new StringWriter(); - final Writer out = new BufferedWriter(fw); - try { - // Add date to avoid caching - template.process(data, out); - } catch (final TemplateException e) { - logger.error("Error when producing starter KML from template", e); //$NON-NLS-1$ - } finally { - out.flush(); - fw.close(); - } - - return fw.toString(); - - } + @Deprecated + @GetMapping("/saveData") + public void saveData(HttpServletRequest request, HttpServletResponse response) throws IOException { - private void intializeTemplate() throws IOException { - if (template == null) { + Map collectedData = extractRequestData(request); - // first check if there is a custom update template included on the customization that can be used for the project + replaceTestVariables(collectedData); - String possibleUpdateKmlLocation = localPropertiesService.getProjectFolder() + File.separatorChar + STANDARD_KML_FOR_UPDATES_FILENAME; - File possibleKmlFile = new File( possibleUpdateKmlLocation ); - - if( possibleKmlFile.exists() ){ - /* - * We need to create a new TemplateLoader and use it momentarily as by default the Template loader - * uses the basedir of the project which causes problems when loading file from outside the project folder - */ - cfg.setTemplateLoader( new FileTemplateLoader( new File( possibleKmlFile.getParent() ) ) ); - template = cfg.getTemplate( STANDARD_KML_FOR_UPDATES_FILENAME ); - - }else{ - // No specific updatekml template found on the project folder, fall back to the general one - // Load template from the resource folder - cfg.setTemplateLoader( new FileTemplateLoader( new File( "." ) ) ); - template = cfg.getTemplate(GENERIC_KML_FOR_UPDATES); + if (collectedData.size() == 0) { + setResult(false, Messages.getString("SaveEarthDataServlet.0"), collectedData); //$NON-NLS-1$ + getLogger().info("The request was empty"); //$NON-NLS-1$ + } else { + if (getDataAccessor().saveData(collectedData)) { + setResult(true, Messages.getString("SaveEarthDataServlet.2"), collectedData); //$NON-NLS-1$ + } else { + setResult(false, Messages.getString("SaveEarthDataServlet.1"), collectedData); //$NON-NLS-1$ + getLogger().error("The data could not be saved"); //$NON-NLS-1$ } } - } - + setJsonResponse(response, collectedData); + } /** - * Responds with KML code that causes the Google Earth placemark icon and overlay image to update is status ( filled/not-filled/partially-filled) + * This method replaces the variable values that the form contains when it is not run + * through Google Earth and the variable replacement of the ExtendedData of the KML does not kick in. * - * @param response The HTTP response object - * @param lastUpdate The datetime when this servlet was last called by the Google Earth network link. - * The date that this request was last sent. This way we get the placemarks that have changed status since the last time this was - * checked. + * @param collectedData + * The data POSTed by the form that has already been processed. */ - @GetMapping("/placemarkUpdate") - public void getUpdatePlacemark(HttpServletResponse response, @RequestParam(value = "lastUpdate", required = false) String lastUpdate) { - - try { - - final SimpleDateFormat dateFormat = new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH ); - Date lastUpdateDate = null; - if (lastUpdate != null && lastUpdate.length() > 0) { - lastUpdateDate = dateFormat.parse(lastUpdate); - }else{ - lastUpdateDate = getTwoMinutesAgo(); - } - - List lastUpdatedRecords = null; - try { - lastUpdatedRecords = earthSurveyService.getRecordSummariesSavedSince(lastUpdateDate); - } catch (Exception e) { - lastUpdatedRecords = new ArrayList<>(); - logger.error("Error fetching information about the records updated after : " + lastUpdateDate , e); //$NON-NLS-1$ - } - - final Map data = new HashMap<>(); - data.put("host", ServerController.getHostAddress(localPropertiesService.getHost(), localPropertiesService.getLocalPort())); //$NON-NLS-1$ - data.put("date", getUpdateFromDate(dateFormat) ); // Keep for historical reasons //$NON-NLS-1$ - data.put("lastUpdateDateTime", getUpdateFromDate(dateFormat) ); //$NON-NLS-1$ - data.put("uniqueId", FreemarkerTemplateUtils.randInt(10000, 5000000) ); //$NON-NLS-1$ - data.put("kmlGeneratedOn", localPropertiesService.getGeneratedOn()); //$NON-NLS-1$ - data.put("placemark_ids", earthSurveyService.getPlacemarksId(lastUpdatedRecords)); //$NON-NLS-1$ - - setKmlResponse(response, getKmlFromTemplate(data), dateFormat); - - } catch (final ParseException e) { - logger.error("Error in the lastUpdate date format : " + lastUpdate, e); //$NON-NLS-1$ - } catch (final Exception e) { - logger.error("Error generating the update KML.", e); //$NON-NLS-1$ + private void replaceTestVariables(Map collectedData) { + // REMOVE THIS!!!! + if (collectedData.get(EarthConstants.PLACEMARK_ID_PARAMETER).equals("$[id]")) { //$NON-NLS-1$ //$NON-NLS-2$ + collectedData.put(EarthConstants.PLACEMARK_ID_PARAMETER, "testPlacemark"); //$NON-NLS-1$ //$NON-NLS-2$ } - } + if (collectedData.get("collect_integer_elevation") != null && collectedData.get("collect_integer_elevation").equals("$[elevation]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + collectedData.put("collect_integer_elevation", "0"); //$NON-NLS-1$ //$NON-NLS-2$ + } - private String getUpdateFromDate(final SimpleDateFormat dateFormat) throws UnsupportedEncodingException { - Date twoMinutesAgo = getTwoMinutesAgo(); - return URLEncoder.encode(dateFormat.format(twoMinutesAgo), StandardCharsets.UTF_8.name() ); //$NON-NLS-1$ - } + if (collectedData.get("collect_real_slope") != null && collectedData.get("collect_real_slope").equals("$[slope]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + collectedData.put("collect_real_slope", "0"); //$NON-NLS-1$ //$NON-NLS-2$ + } - public Date getTwoMinutesAgo() { - Calendar cal = Calendar.getInstance(); - cal.add(Calendar.MINUTE, -2); - return cal.getTime(); - } + if (collectedData.get("collect_real_aspect") != null && collectedData.get("collect_real_aspect").equals("$[aspect]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + collectedData.put("collect_real_aspect", "0"); //$NON-NLS-1$ //$NON-NLS-2$ + } - private void setKmlResponse(HttpServletResponse response, String kmlCode, SimpleDateFormat dateFormat) throws IOException { - response.setHeader("Content-Type", "application/vnd.google-earth.kml+xml"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Date", dateFormat.format(new Date())); //$NON-NLS-1$ - response.setHeader("Content-Length", Integer.toString( kmlCode.getBytes( StandardCharsets.UTF_8 ).length ) ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - response.getOutputStream().write(kmlCode.getBytes( StandardCharsets.UTF_8 )); //$NON-NLS-1$ - response.getOutputStream().flush(); - response.getOutputStream().close(); + if (collectedData.get("collect_coord_location").equals("$[latitude],$[longitude]")) { //$NON-NLS-1$ //$NON-NLS-2$ + collectedData.put("collect_coord_location", "0,0"); //$NON-NLS-1$ //$NON-NLS-2$ + } } -} +} \ No newline at end of file From 9df76f7ce0e53724a003ef21f3231756d797f599 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:15 +0100 Subject: [PATCH 0155/1620] New translations SaveEarthDataServlet.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 188 +++++------------- 1 file changed, 47 insertions(+), 141 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 3a7a63a8e1..b23ed83438 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,181 +1,87 @@ package org.openforis.collect.earth.app.server; -import java.io.BufferedWriter; -import java.io.File; import java.io.IOException; -import java.io.StringWriter; -import java.io.UnsupportedEncodingException; -import java.io.Writer; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; import java.util.Map; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.desktop.ServerController; -import org.openforis.collect.earth.app.service.EarthSurveyService; import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; -import org.openforis.collect.model.CollectRecordSummary; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.openforis.collect.earth.app.view.Messages; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; - -import freemarker.cache.FileTemplateLoader; -import freemarker.template.Configuration; -import freemarker.template.Template; -import freemarker.template.TemplateException; -import freemarker.template.Version; /** - * Servlet called by the NetworkLink which tries to update the status of the placemark icons every few seconds. - * + * Servlet called for updating/saving the information about a placemark. Called from the form in Google Earth when the user interacts with it or clicks the save button. * @author Alfonso Sanchez-Paus Diaz * + * @deprecated Replaced by {@link PlacemarkDataController} + * */ +@Deprecated @Controller -public class PlacemarkUpdateServlet { - - private static final String STANDARD_KML_FOR_UPDATES_FILENAME = "updateIcons.fmt"; //$NON-NLS-1$ - private static final String GENERIC_KML_FOR_UPDATES = "resources/" + STANDARD_KML_FOR_UPDATES_FILENAME; //$NON-NLS-1$ - private final Logger logger = LoggerFactory.getLogger(PlacemarkUpdateServlet.class); +public class SaveEarthDataServlet extends JsonPocessorServlet { @Autowired - private EarthSurveyService earthSurveyService; - - @Autowired - private LocalPropertiesService localPropertiesService; - - private final Configuration cfg = new Configuration( new Version("2.3.23")); - - private Template template; + LocalPropertiesService localPropertiesService; + //@Autowired + //CollectDesignerController collectDesignerController; - private String getKmlFromTemplate( Map data) throws IOException { - intializeTemplate(); - // Console output - final StringWriter fw = new StringWriter(); - final Writer out = new BufferedWriter(fw); - try { - // Add date to avoid caching - template.process(data, out); - } catch (final TemplateException e) { - logger.error("Error when producing starter KML from template", e); //$NON-NLS-1$ - } finally { - out.flush(); - fw.close(); - } - - return fw.toString(); - - } + @Deprecated + @GetMapping("/saveData") + public void saveData(HttpServletRequest request, HttpServletResponse response) throws IOException { - private void intializeTemplate() throws IOException { - if (template == null) { + Map collectedData = extractRequestData(request); - // first check if there is a custom update template included on the customization that can be used for the project + replaceTestVariables(collectedData); - String possibleUpdateKmlLocation = localPropertiesService.getProjectFolder() + File.separatorChar + STANDARD_KML_FOR_UPDATES_FILENAME; - File possibleKmlFile = new File( possibleUpdateKmlLocation ); - - if( possibleKmlFile.exists() ){ - /* - * We need to create a new TemplateLoader and use it momentarily as by default the Template loader - * uses the basedir of the project which causes problems when loading file from outside the project folder - */ - cfg.setTemplateLoader( new FileTemplateLoader( new File( possibleKmlFile.getParent() ) ) ); - template = cfg.getTemplate( STANDARD_KML_FOR_UPDATES_FILENAME ); - - }else{ - // No specific updatekml template found on the project folder, fall back to the general one - // Load template from the resource folder - cfg.setTemplateLoader( new FileTemplateLoader( new File( "." ) ) ); - template = cfg.getTemplate(GENERIC_KML_FOR_UPDATES); + if (collectedData.size() == 0) { + setResult(false, Messages.getString("SaveEarthDataServlet.0"), collectedData); //$NON-NLS-1$ + getLogger().info("The request was empty"); //$NON-NLS-1$ + } else { + if (getDataAccessor().saveData(collectedData)) { + setResult(true, Messages.getString("SaveEarthDataServlet.2"), collectedData); //$NON-NLS-1$ + } else { + setResult(false, Messages.getString("SaveEarthDataServlet.1"), collectedData); //$NON-NLS-1$ + getLogger().error("The data could not be saved"); //$NON-NLS-1$ } } - } - + setJsonResponse(response, collectedData); + } /** - * Responds with KML code that causes the Google Earth placemark icon and overlay image to update is status ( filled/not-filled/partially-filled) + * This method replaces the variable values that the form contains when it is not run + * through Google Earth and the variable replacement of the ExtendedData of the KML does not kick in. * - * @param response The HTTP response object - * @param lastUpdate The datetime when this servlet was last called by the Google Earth network link. - * The date that this request was last sent. This way we get the placemarks that have changed status since the last time this was - * checked. + * @param collectedData + * The data POSTed by the form that has already been processed. */ - @GetMapping("/placemarkUpdate") - public void getUpdatePlacemark(HttpServletResponse response, @RequestParam(value = "lastUpdate", required = false) String lastUpdate) { - - try { - - final SimpleDateFormat dateFormat = new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH ); - Date lastUpdateDate = null; - if (lastUpdate != null && lastUpdate.length() > 0) { - lastUpdateDate = dateFormat.parse(lastUpdate); - }else{ - lastUpdateDate = getTwoMinutesAgo(); - } - - List lastUpdatedRecords = null; - try { - lastUpdatedRecords = earthSurveyService.getRecordSummariesSavedSince(lastUpdateDate); - } catch (Exception e) { - lastUpdatedRecords = new ArrayList<>(); - logger.error("Error fetching information about the records updated after : " + lastUpdateDate , e); //$NON-NLS-1$ - } - - final Map data = new HashMap<>(); - data.put("host", ServerController.getHostAddress(localPropertiesService.getHost(), localPropertiesService.getLocalPort())); //$NON-NLS-1$ - data.put("date", getUpdateFromDate(dateFormat) ); // Keep for historical reasons //$NON-NLS-1$ - data.put("lastUpdateDateTime", getUpdateFromDate(dateFormat) ); //$NON-NLS-1$ - data.put("uniqueId", FreemarkerTemplateUtils.randInt(10000, 5000000) ); //$NON-NLS-1$ - data.put("kmlGeneratedOn", localPropertiesService.getGeneratedOn()); //$NON-NLS-1$ - data.put("placemark_ids", earthSurveyService.getPlacemarksId(lastUpdatedRecords)); //$NON-NLS-1$ - - setKmlResponse(response, getKmlFromTemplate(data), dateFormat); - - } catch (final ParseException e) { - logger.error("Error in the lastUpdate date format : " + lastUpdate, e); //$NON-NLS-1$ - } catch (final Exception e) { - logger.error("Error generating the update KML.", e); //$NON-NLS-1$ + private void replaceTestVariables(Map collectedData) { + // REMOVE THIS!!!! + if (collectedData.get(EarthConstants.PLACEMARK_ID_PARAMETER).equals("$[id]")) { //$NON-NLS-1$ //$NON-NLS-2$ + collectedData.put(EarthConstants.PLACEMARK_ID_PARAMETER, "testPlacemark"); //$NON-NLS-1$ //$NON-NLS-2$ } - } + if (collectedData.get("collect_integer_elevation") != null && collectedData.get("collect_integer_elevation").equals("$[elevation]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + collectedData.put("collect_integer_elevation", "0"); //$NON-NLS-1$ //$NON-NLS-2$ + } - private String getUpdateFromDate(final SimpleDateFormat dateFormat) throws UnsupportedEncodingException { - Date twoMinutesAgo = getTwoMinutesAgo(); - return URLEncoder.encode(dateFormat.format(twoMinutesAgo), StandardCharsets.UTF_8.name() ); //$NON-NLS-1$ - } + if (collectedData.get("collect_real_slope") != null && collectedData.get("collect_real_slope").equals("$[slope]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + collectedData.put("collect_real_slope", "0"); //$NON-NLS-1$ //$NON-NLS-2$ + } - public Date getTwoMinutesAgo() { - Calendar cal = Calendar.getInstance(); - cal.add(Calendar.MINUTE, -2); - return cal.getTime(); - } + if (collectedData.get("collect_real_aspect") != null && collectedData.get("collect_real_aspect").equals("$[aspect]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + collectedData.put("collect_real_aspect", "0"); //$NON-NLS-1$ //$NON-NLS-2$ + } - private void setKmlResponse(HttpServletResponse response, String kmlCode, SimpleDateFormat dateFormat) throws IOException { - response.setHeader("Content-Type", "application/vnd.google-earth.kml+xml"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Date", dateFormat.format(new Date())); //$NON-NLS-1$ - response.setHeader("Content-Length", Integer.toString( kmlCode.getBytes( StandardCharsets.UTF_8 ).length ) ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - response.getOutputStream().write(kmlCode.getBytes( StandardCharsets.UTF_8 )); //$NON-NLS-1$ - response.getOutputStream().flush(); - response.getOutputStream().close(); + if (collectedData.get("collect_coord_location").equals("$[latitude],$[longitude]")) { //$NON-NLS-1$ //$NON-NLS-2$ + collectedData.put("collect_coord_location", "0,0"); //$NON-NLS-1$ //$NON-NLS-2$ + } } -} +} \ No newline at end of file From d02be98d26583a992b5fa551d8d301d0e68f8feb Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:16 +0100 Subject: [PATCH 0156/1620] New translations SaveEarthDataServlet.java (English) --- .../earth/app/view/Messages_en.properties | 188 +++++------------- 1 file changed, 47 insertions(+), 141 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 3a7a63a8e1..b23ed83438 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,181 +1,87 @@ package org.openforis.collect.earth.app.server; -import java.io.BufferedWriter; -import java.io.File; import java.io.IOException; -import java.io.StringWriter; -import java.io.UnsupportedEncodingException; -import java.io.Writer; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; import java.util.Map; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.desktop.ServerController; -import org.openforis.collect.earth.app.service.EarthSurveyService; import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; -import org.openforis.collect.model.CollectRecordSummary; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.openforis.collect.earth.app.view.Messages; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; - -import freemarker.cache.FileTemplateLoader; -import freemarker.template.Configuration; -import freemarker.template.Template; -import freemarker.template.TemplateException; -import freemarker.template.Version; /** - * Servlet called by the NetworkLink which tries to update the status of the placemark icons every few seconds. - * + * Servlet called for updating/saving the information about a placemark. Called from the form in Google Earth when the user interacts with it or clicks the save button. * @author Alfonso Sanchez-Paus Diaz * + * @deprecated Replaced by {@link PlacemarkDataController} + * */ +@Deprecated @Controller -public class PlacemarkUpdateServlet { - - private static final String STANDARD_KML_FOR_UPDATES_FILENAME = "updateIcons.fmt"; //$NON-NLS-1$ - private static final String GENERIC_KML_FOR_UPDATES = "resources/" + STANDARD_KML_FOR_UPDATES_FILENAME; //$NON-NLS-1$ - private final Logger logger = LoggerFactory.getLogger(PlacemarkUpdateServlet.class); +public class SaveEarthDataServlet extends JsonPocessorServlet { @Autowired - private EarthSurveyService earthSurveyService; - - @Autowired - private LocalPropertiesService localPropertiesService; - - private final Configuration cfg = new Configuration( new Version("2.3.23")); - - private Template template; + LocalPropertiesService localPropertiesService; + //@Autowired + //CollectDesignerController collectDesignerController; - private String getKmlFromTemplate( Map data) throws IOException { - intializeTemplate(); - // Console output - final StringWriter fw = new StringWriter(); - final Writer out = new BufferedWriter(fw); - try { - // Add date to avoid caching - template.process(data, out); - } catch (final TemplateException e) { - logger.error("Error when producing starter KML from template", e); //$NON-NLS-1$ - } finally { - out.flush(); - fw.close(); - } - - return fw.toString(); - - } + @Deprecated + @GetMapping("/saveData") + public void saveData(HttpServletRequest request, HttpServletResponse response) throws IOException { - private void intializeTemplate() throws IOException { - if (template == null) { + Map collectedData = extractRequestData(request); - // first check if there is a custom update template included on the customization that can be used for the project + replaceTestVariables(collectedData); - String possibleUpdateKmlLocation = localPropertiesService.getProjectFolder() + File.separatorChar + STANDARD_KML_FOR_UPDATES_FILENAME; - File possibleKmlFile = new File( possibleUpdateKmlLocation ); - - if( possibleKmlFile.exists() ){ - /* - * We need to create a new TemplateLoader and use it momentarily as by default the Template loader - * uses the basedir of the project which causes problems when loading file from outside the project folder - */ - cfg.setTemplateLoader( new FileTemplateLoader( new File( possibleKmlFile.getParent() ) ) ); - template = cfg.getTemplate( STANDARD_KML_FOR_UPDATES_FILENAME ); - - }else{ - // No specific updatekml template found on the project folder, fall back to the general one - // Load template from the resource folder - cfg.setTemplateLoader( new FileTemplateLoader( new File( "." ) ) ); - template = cfg.getTemplate(GENERIC_KML_FOR_UPDATES); + if (collectedData.size() == 0) { + setResult(false, Messages.getString("SaveEarthDataServlet.0"), collectedData); //$NON-NLS-1$ + getLogger().info("The request was empty"); //$NON-NLS-1$ + } else { + if (getDataAccessor().saveData(collectedData)) { + setResult(true, Messages.getString("SaveEarthDataServlet.2"), collectedData); //$NON-NLS-1$ + } else { + setResult(false, Messages.getString("SaveEarthDataServlet.1"), collectedData); //$NON-NLS-1$ + getLogger().error("The data could not be saved"); //$NON-NLS-1$ } } - } - + setJsonResponse(response, collectedData); + } /** - * Responds with KML code that causes the Google Earth placemark icon and overlay image to update is status ( filled/not-filled/partially-filled) + * This method replaces the variable values that the form contains when it is not run + * through Google Earth and the variable replacement of the ExtendedData of the KML does not kick in. * - * @param response The HTTP response object - * @param lastUpdate The datetime when this servlet was last called by the Google Earth network link. - * The date that this request was last sent. This way we get the placemarks that have changed status since the last time this was - * checked. + * @param collectedData + * The data POSTed by the form that has already been processed. */ - @GetMapping("/placemarkUpdate") - public void getUpdatePlacemark(HttpServletResponse response, @RequestParam(value = "lastUpdate", required = false) String lastUpdate) { - - try { - - final SimpleDateFormat dateFormat = new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH ); - Date lastUpdateDate = null; - if (lastUpdate != null && lastUpdate.length() > 0) { - lastUpdateDate = dateFormat.parse(lastUpdate); - }else{ - lastUpdateDate = getTwoMinutesAgo(); - } - - List lastUpdatedRecords = null; - try { - lastUpdatedRecords = earthSurveyService.getRecordSummariesSavedSince(lastUpdateDate); - } catch (Exception e) { - lastUpdatedRecords = new ArrayList<>(); - logger.error("Error fetching information about the records updated after : " + lastUpdateDate , e); //$NON-NLS-1$ - } - - final Map data = new HashMap<>(); - data.put("host", ServerController.getHostAddress(localPropertiesService.getHost(), localPropertiesService.getLocalPort())); //$NON-NLS-1$ - data.put("date", getUpdateFromDate(dateFormat) ); // Keep for historical reasons //$NON-NLS-1$ - data.put("lastUpdateDateTime", getUpdateFromDate(dateFormat) ); //$NON-NLS-1$ - data.put("uniqueId", FreemarkerTemplateUtils.randInt(10000, 5000000) ); //$NON-NLS-1$ - data.put("kmlGeneratedOn", localPropertiesService.getGeneratedOn()); //$NON-NLS-1$ - data.put("placemark_ids", earthSurveyService.getPlacemarksId(lastUpdatedRecords)); //$NON-NLS-1$ - - setKmlResponse(response, getKmlFromTemplate(data), dateFormat); - - } catch (final ParseException e) { - logger.error("Error in the lastUpdate date format : " + lastUpdate, e); //$NON-NLS-1$ - } catch (final Exception e) { - logger.error("Error generating the update KML.", e); //$NON-NLS-1$ + private void replaceTestVariables(Map collectedData) { + // REMOVE THIS!!!! + if (collectedData.get(EarthConstants.PLACEMARK_ID_PARAMETER).equals("$[id]")) { //$NON-NLS-1$ //$NON-NLS-2$ + collectedData.put(EarthConstants.PLACEMARK_ID_PARAMETER, "testPlacemark"); //$NON-NLS-1$ //$NON-NLS-2$ } - } + if (collectedData.get("collect_integer_elevation") != null && collectedData.get("collect_integer_elevation").equals("$[elevation]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + collectedData.put("collect_integer_elevation", "0"); //$NON-NLS-1$ //$NON-NLS-2$ + } - private String getUpdateFromDate(final SimpleDateFormat dateFormat) throws UnsupportedEncodingException { - Date twoMinutesAgo = getTwoMinutesAgo(); - return URLEncoder.encode(dateFormat.format(twoMinutesAgo), StandardCharsets.UTF_8.name() ); //$NON-NLS-1$ - } + if (collectedData.get("collect_real_slope") != null && collectedData.get("collect_real_slope").equals("$[slope]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + collectedData.put("collect_real_slope", "0"); //$NON-NLS-1$ //$NON-NLS-2$ + } - public Date getTwoMinutesAgo() { - Calendar cal = Calendar.getInstance(); - cal.add(Calendar.MINUTE, -2); - return cal.getTime(); - } + if (collectedData.get("collect_real_aspect") != null && collectedData.get("collect_real_aspect").equals("$[aspect]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + collectedData.put("collect_real_aspect", "0"); //$NON-NLS-1$ //$NON-NLS-2$ + } - private void setKmlResponse(HttpServletResponse response, String kmlCode, SimpleDateFormat dateFormat) throws IOException { - response.setHeader("Content-Type", "application/vnd.google-earth.kml+xml"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Date", dateFormat.format(new Date())); //$NON-NLS-1$ - response.setHeader("Content-Length", Integer.toString( kmlCode.getBytes( StandardCharsets.UTF_8 ).length ) ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - response.getOutputStream().write(kmlCode.getBytes( StandardCharsets.UTF_8 )); //$NON-NLS-1$ - response.getOutputStream().flush(); - response.getOutputStream().close(); + if (collectedData.get("collect_coord_location").equals("$[latitude],$[longitude]")) { //$NON-NLS-1$ //$NON-NLS-2$ + collectedData.put("collect_coord_location", "0,0"); //$NON-NLS-1$ //$NON-NLS-2$ + } } -} +} \ No newline at end of file From 13a0d7546183fd043248fe2c52d300d03b01cb2b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:17 +0100 Subject: [PATCH 0157/1620] New translations DataImportExportService.java (Spanish) --- .../earth/app/view/Messages_es.properties | 225 +++++++++++++----- 1 file changed, 166 insertions(+), 59 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index b23ed83438..eb9f542d80 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,87 +1,194 @@ -package org.openforis.collect.earth.app.server; +package org.openforis.collect.earth.app.service; -import java.io.IOException; -import java.util.Map; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.view.Messages; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.io.data.CSVDataExportProcess; +import org.openforis.collect.io.data.CSVDataImportProcess; +import org.openforis.collect.io.data.DataExportStatus; +import org.openforis.collect.io.data.DataImportSummaryItem; +import org.openforis.collect.io.data.XMLDataExportProcess; +import org.openforis.collect.io.data.XMLDataImportProcess; +import org.openforis.collect.io.data.csv.CSVDataExportParameters; +import org.openforis.collect.io.data.csv.CSVDataImportSettings; +import org.openforis.collect.manager.process.AbstractProcess; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.RecordFilter; +import org.openforis.commons.collection.Predicate; +import org.openforis.idm.model.BooleanAttribute; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Component; /** - * Servlet called for updating/saving the information about a placemark. Called from the form in Google Earth when the user interacts with it or clicks the save button. * @author Alfonso Sanchez-Paus Diaz * - * @deprecated Replaced by {@link PlacemarkDataController} - * */ -@Deprecated -@Controller -public class SaveEarthDataServlet extends JsonPocessorServlet { +@Component +public class DataImportExportService { @Autowired - LocalPropertiesService localPropertiesService; + private EarthSurveyService earthSurveyService; - //@Autowired - //CollectDesignerController collectDesignerController; + @Autowired + private LocalPropertiesService localPropertiesService; + private final Logger logger = LoggerFactory.getLogger(DataImportExportService.class); + /** + * Use the application context to get a new bean everytime the data is exported ( as a new instance is needed every time) + */ + @Autowired + private ApplicationContext applicationContext; - @Deprecated - @GetMapping("/saveData") - public void saveData(HttpServletRequest request, HttpServletResponse response) throws IOException { + private void addRecordsToImportList( List recordsToImport, List entryIdsToImport) { + if (recordsToImport != null) { + List cleanRecordsToImport = recordsToImport; + for (final DataImportSummaryItem importRecord : cleanRecordsToImport) { + entryIdsToImport.add(importRecord.getEntryId()); + } + } + } - Map collectedData = extractRequestData(request); + public CSVDataExportProcess exportSurveyAsCsv(File exportToFile, boolean includeCodeItemLabelColumn) { + final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); + csvDataExportProcess.setOutputFile(exportToFile); - replaceTestVariables(collectedData); + csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); + csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; - if (collectedData.size() == 0) { - setResult(false, Messages.getString("SaveEarthDataServlet.0"), collectedData); //$NON-NLS-1$ - getLogger().info("The request was empty"); //$NON-NLS-1$ - } else { - if (getDataAccessor().saveData(collectedData)) { - setResult(true, Messages.getString("SaveEarthDataServlet.2"), collectedData); //$NON-NLS-1$ - } else { - setResult(false, Messages.getString("SaveEarthDataServlet.1"), collectedData); //$NON-NLS-1$ - getLogger().error("The data could not be saved"); //$NON-NLS-1$ - } - } + CSVDataExportParameters config = new CSVDataExportParameters(); + config.setIncludeAllAncestorAttributes(true); + config.setIncludeEnumeratedEntities(true); + config.setLanguageCode( localPropertiesService.getValue(EarthProperty.UI_LANGUAGE) ); + config.setIncludeCodeItemLabelColumn(includeCodeItemLabelColumn); + csvDataExportProcess.setConfiguration(config); - setJsonResponse(response, collectedData); + return csvDataExportProcess; } - /** - * This method replaces the variable values that the form contains when it is not run - * through Google Earth and the variable replacement of the ExtendedData of the KML does not kick in. - * - * @param collectedData - * The data POSTed by the form that has already been processed. - */ - private void replaceTestVariables(Map collectedData) { - // REMOVE THIS!!!! - if (collectedData.get(EarthConstants.PLACEMARK_ID_PARAMETER).equals("$[id]")) { //$NON-NLS-1$ //$NON-NLS-2$ - collectedData.put(EarthConstants.PLACEMARK_ID_PARAMETER, "testPlacemark"); //$NON-NLS-1$ //$NON-NLS-2$ - } + private RecordFilter getRecordFilter( ) { + RecordFilter recordFilter = new RecordFilter(earthSurveyService.getCollectSurvey(), earthSurveyService.getRootEntityDefinition().getId()); + recordFilter.setStepGreaterOrEqual(Step.ENTRY); + return recordFilter; + } - if (collectedData.get("collect_integer_elevation") != null && collectedData.get("collect_integer_elevation").equals("$[elevation]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - collectedData.put("collect_integer_elevation", "0"); //$NON-NLS-1$ //$NON-NLS-2$ - } + public CSVDataExportProcess exportSurveyAsFusionTable(File exportToFile, boolean includeCodeItemLabelColumn) { + + final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); + csvDataExportProcess.setOutputFile(exportToFile); + csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); + csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; + + CSVDataExportParameters config = new CSVDataExportParameters(); + config.setIncludeAllAncestorAttributes(true); + config.setLanguageCode( localPropertiesService.getValue(EarthProperty.UI_LANGUAGE) ); + config.setIncludeCodeItemPositionColumn(true); + config.setIncludeKMLColumnForCoordinates(true); + config.setIncludeCodeItemLabelColumn( includeCodeItemLabelColumn ); + csvDataExportProcess.setConfiguration(config); + return csvDataExportProcess; + } - if (collectedData.get("collect_real_slope") != null && collectedData.get("collect_real_slope").equals("$[slope]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - collectedData.put("collect_real_slope", "0"); //$NON-NLS-1$ //$NON-NLS-2$ - } + public XMLDataExportProcess exportSurveyAsZipWithXml(File exportToFile, Date modifiedSince) throws Exception { + final XMLDataExportProcess xmlDataExportProcess = applicationContext.getBean(XMLDataExportProcess.class); + xmlDataExportProcess.setOutputFile(exportToFile); + xmlDataExportProcess.setRootEntityName(EarthConstants.ROOT_ENTITY_NAME); + xmlDataExportProcess.setSurvey(earthSurveyService.getCollectSurvey()); + xmlDataExportProcess.setModifiedSince(modifiedSince); + xmlDataExportProcess.setIncludeIdm(true); + xmlDataExportProcess.setSteps(new Step[] { Step.ENTRY }); + return xmlDataExportProcess; + } - if (collectedData.get("collect_real_aspect") != null && collectedData.get("collect_real_aspect").equals("$[aspect]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - collectedData.put("collect_real_aspect", "0"); //$NON-NLS-1$ //$NON-NLS-2$ + + public CSVDataImportProcess getCsvImporterProcess(File importFromFile) { + final CSVDataImportProcess importProcess = applicationContext.getBean("transactionalCsvDataImportProcess", CSVDataImportProcess.class); + + importProcess.setFile(importFromFile); + importProcess.setSurvey(earthSurveyService.getCollectSurvey()); + importProcess.setParentEntityDefinitionId(earthSurveyService.getRootEntityDefinition().getId()); + importProcess.setStep(Step.ENTRY ); + CSVDataImportSettings settings = new CSVDataImportSettings(); + settings.setRecordValidationEnabled(false); + settings.setInsertNewRecords(false); + settings.setNewRecordVersionName(null); + settings.setReportNoRecordFoundErrors(false); + importProcess.setSettings(settings); + return importProcess; + } + + public XMLDataImportProcess getImportSummary(File zipWithXml, boolean importNonFinishedPlots) throws Exception { + final XMLDataImportProcess dataImportProcess = applicationContext.getBean(XMLDataImportProcess.class); + dataImportProcess.init(); + dataImportProcess.setFile(zipWithXml); + dataImportProcess.setValidateRecords(false); + dataImportProcess.prepareToStartSummaryCreation(); + + if( !importNonFinishedPlots ){ // Import only plots whose actively_saved state is set to true + dataImportProcess.setIncludeRecordPredicate( new Predicate() { + + @Override + public boolean evaluate(CollectRecord record) { + boolean include = true; + + try { + final BooleanAttribute node = (BooleanAttribute) record.getNodeByPath("/plot/" + EarthConstants.ACTIVELY_SAVED_ATTRIBUTE_NAME); //$NON-NLS-1$ + + include = (node == null || (node != null && !node.isEmpty() && node.getValue().getValue()) ); + } catch (Exception e) { + logger.error("No \"/plot/actively_saved\" node found ", e ); //$NON-NLS-1$ + } + + return include; + } + }); } + return dataImportProcess; + } + + public void importRecordsFrom(File zipWithXml, XMLDataImportProcess dataImportProcess, List listConflictingRecords) throws Exception { + final List entryIdsToImport = new ArrayList(); - if (collectedData.get("collect_coord_location").equals("$[latitude],$[longitude]")) { //$NON-NLS-1$ //$NON-NLS-2$ - collectedData.put("collect_coord_location", "0,0"); //$NON-NLS-1$ //$NON-NLS-2$ + addRecordsToImportList( listConflictingRecords, entryIdsToImport); + addRecordsToImportList( dataImportProcess.getSummary().getRecordsToImport(),entryIdsToImport); + + dataImportProcess.setEntryIdsToImport(entryIdsToImport); + dataImportProcess.prepareToStartImport(); + dataImportProcess.call(); + + int conflictingRecordsAdded = 0; + if (listConflictingRecords != null) { + conflictingRecordsAdded = listConflictingRecords.size(); } + + logger.warn("Data imported into db. Number of Records imported : {} Conflicting records added : {}" //$NON-NLS-1$ //$NON-NLS-2$ + ,entryIdsToImport.size(), conflictingRecordsAdded); + } + + public AbstractProcess exportSurveyAsBackup(File exportToFile) { + final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); + csvDataExportProcess.setOutputFile(exportToFile); + csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); + csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; + + + CSVDataExportParameters config = new CSVDataExportParameters(); + config.setIncludeAllAncestorAttributes(true); + config.setIncludeCodeItemPositionColumn(true); + config.setIncludeKMLColumnForCoordinates(true); + csvDataExportProcess.setConfiguration(config); + return csvDataExportProcess; + } + + public EarthSurveyService getEarthSurveyService() { + return earthSurveyService; } -} \ No newline at end of file +} From 364f44ab0a3d7031aeb223d6a962491aab6a0655 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:18 +0100 Subject: [PATCH 0158/1620] New translations DataImportExportService.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 225 +++++++++++++----- 1 file changed, 166 insertions(+), 59 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index b23ed83438..eb9f542d80 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,87 +1,194 @@ -package org.openforis.collect.earth.app.server; +package org.openforis.collect.earth.app.service; -import java.io.IOException; -import java.util.Map; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.view.Messages; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.io.data.CSVDataExportProcess; +import org.openforis.collect.io.data.CSVDataImportProcess; +import org.openforis.collect.io.data.DataExportStatus; +import org.openforis.collect.io.data.DataImportSummaryItem; +import org.openforis.collect.io.data.XMLDataExportProcess; +import org.openforis.collect.io.data.XMLDataImportProcess; +import org.openforis.collect.io.data.csv.CSVDataExportParameters; +import org.openforis.collect.io.data.csv.CSVDataImportSettings; +import org.openforis.collect.manager.process.AbstractProcess; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.RecordFilter; +import org.openforis.commons.collection.Predicate; +import org.openforis.idm.model.BooleanAttribute; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Component; /** - * Servlet called for updating/saving the information about a placemark. Called from the form in Google Earth when the user interacts with it or clicks the save button. * @author Alfonso Sanchez-Paus Diaz * - * @deprecated Replaced by {@link PlacemarkDataController} - * */ -@Deprecated -@Controller -public class SaveEarthDataServlet extends JsonPocessorServlet { +@Component +public class DataImportExportService { @Autowired - LocalPropertiesService localPropertiesService; + private EarthSurveyService earthSurveyService; - //@Autowired - //CollectDesignerController collectDesignerController; + @Autowired + private LocalPropertiesService localPropertiesService; + private final Logger logger = LoggerFactory.getLogger(DataImportExportService.class); + /** + * Use the application context to get a new bean everytime the data is exported ( as a new instance is needed every time) + */ + @Autowired + private ApplicationContext applicationContext; - @Deprecated - @GetMapping("/saveData") - public void saveData(HttpServletRequest request, HttpServletResponse response) throws IOException { + private void addRecordsToImportList( List recordsToImport, List entryIdsToImport) { + if (recordsToImport != null) { + List cleanRecordsToImport = recordsToImport; + for (final DataImportSummaryItem importRecord : cleanRecordsToImport) { + entryIdsToImport.add(importRecord.getEntryId()); + } + } + } - Map collectedData = extractRequestData(request); + public CSVDataExportProcess exportSurveyAsCsv(File exportToFile, boolean includeCodeItemLabelColumn) { + final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); + csvDataExportProcess.setOutputFile(exportToFile); - replaceTestVariables(collectedData); + csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); + csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; - if (collectedData.size() == 0) { - setResult(false, Messages.getString("SaveEarthDataServlet.0"), collectedData); //$NON-NLS-1$ - getLogger().info("The request was empty"); //$NON-NLS-1$ - } else { - if (getDataAccessor().saveData(collectedData)) { - setResult(true, Messages.getString("SaveEarthDataServlet.2"), collectedData); //$NON-NLS-1$ - } else { - setResult(false, Messages.getString("SaveEarthDataServlet.1"), collectedData); //$NON-NLS-1$ - getLogger().error("The data could not be saved"); //$NON-NLS-1$ - } - } + CSVDataExportParameters config = new CSVDataExportParameters(); + config.setIncludeAllAncestorAttributes(true); + config.setIncludeEnumeratedEntities(true); + config.setLanguageCode( localPropertiesService.getValue(EarthProperty.UI_LANGUAGE) ); + config.setIncludeCodeItemLabelColumn(includeCodeItemLabelColumn); + csvDataExportProcess.setConfiguration(config); - setJsonResponse(response, collectedData); + return csvDataExportProcess; } - /** - * This method replaces the variable values that the form contains when it is not run - * through Google Earth and the variable replacement of the ExtendedData of the KML does not kick in. - * - * @param collectedData - * The data POSTed by the form that has already been processed. - */ - private void replaceTestVariables(Map collectedData) { - // REMOVE THIS!!!! - if (collectedData.get(EarthConstants.PLACEMARK_ID_PARAMETER).equals("$[id]")) { //$NON-NLS-1$ //$NON-NLS-2$ - collectedData.put(EarthConstants.PLACEMARK_ID_PARAMETER, "testPlacemark"); //$NON-NLS-1$ //$NON-NLS-2$ - } + private RecordFilter getRecordFilter( ) { + RecordFilter recordFilter = new RecordFilter(earthSurveyService.getCollectSurvey(), earthSurveyService.getRootEntityDefinition().getId()); + recordFilter.setStepGreaterOrEqual(Step.ENTRY); + return recordFilter; + } - if (collectedData.get("collect_integer_elevation") != null && collectedData.get("collect_integer_elevation").equals("$[elevation]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - collectedData.put("collect_integer_elevation", "0"); //$NON-NLS-1$ //$NON-NLS-2$ - } + public CSVDataExportProcess exportSurveyAsFusionTable(File exportToFile, boolean includeCodeItemLabelColumn) { + + final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); + csvDataExportProcess.setOutputFile(exportToFile); + csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); + csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; + + CSVDataExportParameters config = new CSVDataExportParameters(); + config.setIncludeAllAncestorAttributes(true); + config.setLanguageCode( localPropertiesService.getValue(EarthProperty.UI_LANGUAGE) ); + config.setIncludeCodeItemPositionColumn(true); + config.setIncludeKMLColumnForCoordinates(true); + config.setIncludeCodeItemLabelColumn( includeCodeItemLabelColumn ); + csvDataExportProcess.setConfiguration(config); + return csvDataExportProcess; + } - if (collectedData.get("collect_real_slope") != null && collectedData.get("collect_real_slope").equals("$[slope]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - collectedData.put("collect_real_slope", "0"); //$NON-NLS-1$ //$NON-NLS-2$ - } + public XMLDataExportProcess exportSurveyAsZipWithXml(File exportToFile, Date modifiedSince) throws Exception { + final XMLDataExportProcess xmlDataExportProcess = applicationContext.getBean(XMLDataExportProcess.class); + xmlDataExportProcess.setOutputFile(exportToFile); + xmlDataExportProcess.setRootEntityName(EarthConstants.ROOT_ENTITY_NAME); + xmlDataExportProcess.setSurvey(earthSurveyService.getCollectSurvey()); + xmlDataExportProcess.setModifiedSince(modifiedSince); + xmlDataExportProcess.setIncludeIdm(true); + xmlDataExportProcess.setSteps(new Step[] { Step.ENTRY }); + return xmlDataExportProcess; + } - if (collectedData.get("collect_real_aspect") != null && collectedData.get("collect_real_aspect").equals("$[aspect]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - collectedData.put("collect_real_aspect", "0"); //$NON-NLS-1$ //$NON-NLS-2$ + + public CSVDataImportProcess getCsvImporterProcess(File importFromFile) { + final CSVDataImportProcess importProcess = applicationContext.getBean("transactionalCsvDataImportProcess", CSVDataImportProcess.class); + + importProcess.setFile(importFromFile); + importProcess.setSurvey(earthSurveyService.getCollectSurvey()); + importProcess.setParentEntityDefinitionId(earthSurveyService.getRootEntityDefinition().getId()); + importProcess.setStep(Step.ENTRY ); + CSVDataImportSettings settings = new CSVDataImportSettings(); + settings.setRecordValidationEnabled(false); + settings.setInsertNewRecords(false); + settings.setNewRecordVersionName(null); + settings.setReportNoRecordFoundErrors(false); + importProcess.setSettings(settings); + return importProcess; + } + + public XMLDataImportProcess getImportSummary(File zipWithXml, boolean importNonFinishedPlots) throws Exception { + final XMLDataImportProcess dataImportProcess = applicationContext.getBean(XMLDataImportProcess.class); + dataImportProcess.init(); + dataImportProcess.setFile(zipWithXml); + dataImportProcess.setValidateRecords(false); + dataImportProcess.prepareToStartSummaryCreation(); + + if( !importNonFinishedPlots ){ // Import only plots whose actively_saved state is set to true + dataImportProcess.setIncludeRecordPredicate( new Predicate() { + + @Override + public boolean evaluate(CollectRecord record) { + boolean include = true; + + try { + final BooleanAttribute node = (BooleanAttribute) record.getNodeByPath("/plot/" + EarthConstants.ACTIVELY_SAVED_ATTRIBUTE_NAME); //$NON-NLS-1$ + + include = (node == null || (node != null && !node.isEmpty() && node.getValue().getValue()) ); + } catch (Exception e) { + logger.error("No \"/plot/actively_saved\" node found ", e ); //$NON-NLS-1$ + } + + return include; + } + }); } + return dataImportProcess; + } + + public void importRecordsFrom(File zipWithXml, XMLDataImportProcess dataImportProcess, List listConflictingRecords) throws Exception { + final List entryIdsToImport = new ArrayList(); - if (collectedData.get("collect_coord_location").equals("$[latitude],$[longitude]")) { //$NON-NLS-1$ //$NON-NLS-2$ - collectedData.put("collect_coord_location", "0,0"); //$NON-NLS-1$ //$NON-NLS-2$ + addRecordsToImportList( listConflictingRecords, entryIdsToImport); + addRecordsToImportList( dataImportProcess.getSummary().getRecordsToImport(),entryIdsToImport); + + dataImportProcess.setEntryIdsToImport(entryIdsToImport); + dataImportProcess.prepareToStartImport(); + dataImportProcess.call(); + + int conflictingRecordsAdded = 0; + if (listConflictingRecords != null) { + conflictingRecordsAdded = listConflictingRecords.size(); } + + logger.warn("Data imported into db. Number of Records imported : {} Conflicting records added : {}" //$NON-NLS-1$ //$NON-NLS-2$ + ,entryIdsToImport.size(), conflictingRecordsAdded); + } + + public AbstractProcess exportSurveyAsBackup(File exportToFile) { + final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); + csvDataExportProcess.setOutputFile(exportToFile); + csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); + csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; + + + CSVDataExportParameters config = new CSVDataExportParameters(); + config.setIncludeAllAncestorAttributes(true); + config.setIncludeCodeItemPositionColumn(true); + config.setIncludeKMLColumnForCoordinates(true); + csvDataExportProcess.setConfiguration(config); + return csvDataExportProcess; + } + + public EarthSurveyService getEarthSurveyService() { + return earthSurveyService; } -} \ No newline at end of file +} From 5d227b66237d3e9a23fddabdaf2d11b790810ff9 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:20 +0100 Subject: [PATCH 0159/1620] New translations KmlImportService.java (English) --- .../earth/app/view/Messages_en.properties | 254 ++++++++++++++---- 1 file changed, 195 insertions(+), 59 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index b23ed83438..9fb3d5284e 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,87 +1,223 @@ -package org.openforis.collect.earth.app.server; - +package org.openforis.collect.earth.app.service; + +import java.io.BufferedInputStream; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FileReader; import java.io.IOException; +import java.io.OutputStreamWriter; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; import java.util.Map; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.LocalPropertiesService; +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.xml.XMLConstants; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import org.apache.commons.io.FileUtils; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.app.view.DataFormat; +import org.openforis.collect.earth.app.view.JFileChooserExistsAware; import org.openforis.collect.earth.app.view.Messages; +import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; +import org.openforis.collect.io.metadata.collectearth.CollectEarthProjectFileCreator; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; - -/** - * Servlet called for updating/saving the information about a placemark. Called from the form in Google Earth when the user interacts with it or clicks the save button. - * @author Alfonso Sanchez-Paus Diaz - * - * @deprecated Replaced by {@link PlacemarkDataController} - * - */ -@Deprecated -@Controller -public class SaveEarthDataServlet extends JsonPocessorServlet { +import org.springframework.stereotype.Component; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +@Component +public class KmlImportService { + + Map namesAndTimes = new HashMap<>(); @Autowired LocalPropertiesService localPropertiesService; - //@Autowired - //CollectDesignerController collectDesignerController; + @Autowired + EarthProjectsService earthProjectsService; + + @Autowired + EarthSurveyService earthSurveyService; + private JFrame frame; - @Deprecated - @GetMapping("/saveData") - public void saveData(HttpServletRequest request, HttpServletResponse response) throws IOException { + /* + * + + one + + -5.89991123135449 + 41.60459478540565 + 0 + -1.425202537313517e-006 + 0 + 177418.783783632 + relativeToSeaFloor + + #m_ylw-pushpin + + 1 + -5.899911231354489,41.60459478540565,0 + + + * + * + */ - Map collectedData = extractRequestData(request); + private File createTempCsv( File kmlFile) throws ParserConfigurationException, SAXException, IOException{ - replaceTestVariables(collectedData); + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); // Compliant + factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); // compliant + DocumentBuilder builder = factory.newDocumentBuilder(); + InputSource is = new InputSource(new FileReader(kmlFile)); + Document doc = builder.parse(is); - if (collectedData.size() == 0) { - setResult(false, Messages.getString("SaveEarthDataServlet.0"), collectedData); //$NON-NLS-1$ - getLogger().info("The request was empty"); //$NON-NLS-1$ - } else { - if (getDataAccessor().saveData(collectedData)) { - setResult(true, Messages.getString("SaveEarthDataServlet.2"), collectedData); //$NON-NLS-1$ - } else { - setResult(false, Messages.getString("SaveEarthDataServlet.1"), collectedData); //$NON-NLS-1$ - getLogger().error("The data could not be saved"); //$NON-NLS-1$ - } + NodeList placemarks = doc.getElementsByTagName("Placemark"); //$NON-NLS-1$ + + StringBuilder sb = new StringBuilder(); + + sb.append( CollectEarthProjectFileCreator.PLACEHOLDER_ID_COLUMNS_HEADER ).append(",").append( "YCoordinate" ).append(",").append( "XCoordinate" ).append(CollectEarthProjectFileCreator.PLACEHOLDER_FOR_EXTRA_COLUMNS_HEADER).append( "\r\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + + for (int i = 0; i < placemarks.getLength(); i++) { + Node placemark = placemarks.item(i); + + if (placemark.hasChildNodes()) { + NodeList childNodes = placemark.getChildNodes(); + String longitude = "",latitude = "",name = "Placemark"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + name = "placemark" + i; + for (int j=0; j collectedData) { - // REMOVE THIS!!!! - if (collectedData.get(EarthConstants.PLACEMARK_ID_PARAMETER).equals("$[id]")) { //$NON-NLS-1$ //$NON-NLS-2$ - collectedData.put(EarthConstants.PLACEMARK_ID_PARAMETER, "testPlacemark"); //$NON-NLS-1$ //$NON-NLS-2$ + public String processPoint(Node placemarkChild) { + NodeList lookAtNodes = placemarkChild.getChildNodes(); + String coordinates = null; + for (int h=0; h Date: Tue, 29 Nov 2022 12:24:21 +0100 Subject: [PATCH 0160/1620] New translations IPCCGeneratorService.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 229 ++++++------------ 1 file changed, 70 insertions(+), 159 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index eb9f542d80..c1b9c5db00 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,194 +1,105 @@ package org.openforis.collect.earth.app.service; -import java.io.File; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.io.data.CSVDataExportProcess; -import org.openforis.collect.io.data.CSVDataImportProcess; -import org.openforis.collect.io.data.DataExportStatus; -import org.openforis.collect.io.data.DataImportSummaryItem; -import org.openforis.collect.io.data.XMLDataExportProcess; -import org.openforis.collect.io.data.XMLDataImportProcess; -import org.openforis.collect.io.data.csv.CSVDataExportParameters; -import org.openforis.collect.io.data.csv.CSVDataImportSettings; -import org.openforis.collect.manager.process.AbstractProcess; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.RecordFilter; -import org.openforis.commons.collection.Predicate; -import org.openforis.idm.model.BooleanAttribute; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.ipcc.IPCCGenerator; +import org.openforis.collect.earth.ipcc.IPCCGeneratorException; +import org.openforis.collect.earth.ipcc.RdbExportException; +import org.openforis.collect.model.CollectSurvey; +import org.openforis.collect.relational.CollectRDBPublisher; +import org.openforis.collect.relational.CollectRdbException; +import org.openforis.idm.metamodel.NodeDefinition; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ @Component -public class DataImportExportService { +public class IPCCGeneratorService extends GenerateDatabase{ @Autowired - private EarthSurveyService earthSurveyService; - + RDBExporter rdbExporter; + @Autowired - private LocalPropertiesService localPropertiesService; + CollectRDBPublisher collectRDBPublisher; - private final Logger logger = LoggerFactory.getLogger(DataImportExportService.class); - /** - * Use the application context to get a new bean everytime the data is exported ( as a new instance is needed every time) - */ @Autowired - private ApplicationContext applicationContext; - - private void addRecordsToImportList( List recordsToImport, List entryIdsToImport) { - if (recordsToImport != null) { - List cleanRecordsToImport = recordsToImport; - for (final DataImportSummaryItem importRecord : cleanRecordsToImport) { - entryIdsToImport.add(importRecord.getEntryId()); - } - } - } - - public CSVDataExportProcess exportSurveyAsCsv(File exportToFile, boolean includeCodeItemLabelColumn) { - final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); - csvDataExportProcess.setOutputFile(exportToFile); - - csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); - csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; - - CSVDataExportParameters config = new CSVDataExportParameters(); - config.setIncludeAllAncestorAttributes(true); - config.setIncludeEnumeratedEntities(true); - config.setLanguageCode( localPropertiesService.getValue(EarthProperty.UI_LANGUAGE) ); - config.setIncludeCodeItemLabelColumn(includeCodeItemLabelColumn); - csvDataExportProcess.setConfiguration(config); - - return csvDataExportProcess; - } + EarthSurveyService earthSurveyService; - private RecordFilter getRecordFilter( ) { - RecordFilter recordFilter = new RecordFilter(earthSurveyService.getCollectSurvey(), earthSurveyService.getRootEntityDefinition().getId()); - recordFilter.setStepGreaterOrEqual(Step.ENTRY); - return recordFilter; - } - - public CSVDataExportProcess exportSurveyAsFusionTable(File exportToFile, boolean includeCodeItemLabelColumn) { - - final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); - csvDataExportProcess.setOutputFile(exportToFile); - csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); - csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; - - CSVDataExportParameters config = new CSVDataExportParameters(); - config.setIncludeAllAncestorAttributes(true); - config.setLanguageCode( localPropertiesService.getValue(EarthProperty.UI_LANGUAGE) ); - config.setIncludeCodeItemPositionColumn(true); - config.setIncludeKMLColumnForCoordinates(true); - config.setIncludeCodeItemLabelColumn( includeCodeItemLabelColumn ); - csvDataExportProcess.setConfiguration(config); - return csvDataExportProcess; - } - - public XMLDataExportProcess exportSurveyAsZipWithXml(File exportToFile, Date modifiedSince) throws Exception { - final XMLDataExportProcess xmlDataExportProcess = applicationContext.getBean(XMLDataExportProcess.class); - xmlDataExportProcess.setOutputFile(exportToFile); - xmlDataExportProcess.setRootEntityName(EarthConstants.ROOT_ENTITY_NAME); - xmlDataExportProcess.setSurvey(earthSurveyService.getCollectSurvey()); - xmlDataExportProcess.setModifiedSince(modifiedSince); - xmlDataExportProcess.setIncludeIdm(true); - xmlDataExportProcess.setSteps(new Step[] { Step.ENTRY }); - return xmlDataExportProcess; - } - - - public CSVDataImportProcess getCsvImporterProcess(File importFromFile) { - final CSVDataImportProcess importProcess = applicationContext.getBean("transactionalCsvDataImportProcess", CSVDataImportProcess.class); - - importProcess.setFile(importFromFile); - importProcess.setSurvey(earthSurveyService.getCollectSurvey()); - importProcess.setParentEntityDefinitionId(earthSurveyService.getRootEntityDefinition().getId()); - importProcess.setStep(Step.ENTRY ); - CSVDataImportSettings settings = new CSVDataImportSettings(); - settings.setRecordValidationEnabled(false); - settings.setInsertNewRecords(false); - settings.setNewRecordVersionName(null); - settings.setReportNoRecordFoundErrors(false); - importProcess.setSettings(settings); - return importProcess; - } - - public XMLDataImportProcess getImportSummary(File zipWithXml, boolean importNonFinishedPlots) throws Exception { - final XMLDataImportProcess dataImportProcess = applicationContext.getBean(XMLDataImportProcess.class); - dataImportProcess.init(); - dataImportProcess.setFile(zipWithXml); - dataImportProcess.setValidateRecords(false); - dataImportProcess.prepareToStartSummaryCreation(); - - if( !importNonFinishedPlots ){ // Import only plots whose actively_saved state is set to true - dataImportProcess.setIncludeRecordPredicate( new Predicate() { + @Autowired + public LocalPropertiesService localPropertiesService; - @Override - public boolean evaluate(CollectRecord record) { - boolean include = true; + @Autowired + BrowserService browserService; + @Autowired + private IPCCGenerator ipccGenerator; + + final Logger logger = LoggerFactory.getLogger(IPCCGeneratorService.class); + + public void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws RdbExportException { + + try { + + try { + + if ( + (localPropertiesService.isUsingSqliteDB() && !getZippedProjectDB( ExportType.IPCC ).exists()) + || + isRefreshDatabase() + ) { + + // The user clicked on the option to refresh the database, or there is no + // previous copy of the Saiku DB + // Generate the DB file + ipccGenerator.generateRDB( earthSurveyService.getCollectSurvey(), progressListener); + try { - final BooleanAttribute node = (BooleanAttribute) record.getNodeByPath("/plot/" + EarthConstants.ACTIVELY_SAVED_ATTRIBUTE_NAME); //$NON-NLS-1$ - - include = (node == null || (node != null && !node.isEmpty() && node.getValue().getValue()) ); + // Save the DB file in a zipped file to extends GenerateDatabase keep for the next usages + replaceZippedProjectDB( ExportType.IPCC ); } catch (Exception e) { - logger.error("No \"/plot/actively_saved\" node found ", e ); //$NON-NLS-1$ + logger.error("Error while refreshing the Zipped content of the project IPCC DB", e); } - return include; + } else if (getZippedProjectDB(ExportType.IPCC).exists()) { + // If the zipped version of the project exists ( and the user clicked on the + // option to not refresh it) then restore this last version of the data + if (localPropertiesService.isUsingSqliteDB()) { + restoreZippedProjectDB(ExportType.IPCC); + } } - }); - } - return dataImportProcess; - } + + ipccGenerator.produceOutputs( earthSurveyService.getCollectSurvey(), progressListener ); - public void importRecordsFrom(File zipWithXml, XMLDataImportProcess dataImportProcess, List listConflictingRecords) throws Exception { - final List entryIdsToImport = new ArrayList(); + } catch (final IPCCGeneratorException e) { + logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ + } - addRecordsToImportList( listConflictingRecords, entryIdsToImport); - addRecordsToImportList( dataImportProcess.getSummary().getRecordsToImport(),entryIdsToImport); + } catch (final CollectRdbException e) { + logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ + } + } - dataImportProcess.setEntryIdsToImport(entryIdsToImport); - dataImportProcess.prepareToStartImport(); - dataImportProcess.call(); - int conflictingRecordsAdded = 0; - if (listConflictingRecords != null) { - conflictingRecordsAdded = listConflictingRecords.size(); - } - logger.warn("Data imported into db. Number of Records imported : {} Conflicting records added : {}" //$NON-NLS-1$ //$NON-NLS-2$ - ,entryIdsToImport.size(), conflictingRecordsAdded); + public static boolean surveyContains(String nodeName, CollectSurvey survey) { + NodeDefinition nodeDefForNAme = survey.getSchema().findNodeDefinition( nodeDef -> nodeDef.getName().equals(nodeName) ); + return nodeDefForNAme != null; } - public AbstractProcess exportSurveyAsBackup(File exportToFile) { - final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); - csvDataExportProcess.setOutputFile(exportToFile); - csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); - csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; - - CSVDataExportParameters config = new CSVDataExportParameters(); - config.setIncludeAllAncestorAttributes(true); - config.setIncludeCodeItemPositionColumn(true); - config.setIncludeKMLColumnForCoordinates(true); - csvDataExportProcess.setConfiguration(config); - return csvDataExportProcess; + @Override + public LocalPropertiesService getLocalPropertiesService() { + return localPropertiesService; } + @Override public EarthSurveyService getEarthSurveyService() { return earthSurveyService; } -} + @Override + public RDBExporter getRdbExporter() { + return rdbExporter; + } + +} \ No newline at end of file From 29b97449f04617b4af286a91945905b6d1a52c0e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:22 +0100 Subject: [PATCH 0161/1620] New translations IPCCGeneratorService.java (English) --- .../earth/app/view/Messages_en.properties | 272 +++++------------- 1 file changed, 77 insertions(+), 195 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 9fb3d5284e..c1b9c5db00 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,223 +1,105 @@ package org.openforis.collect.earth.app.service; -import java.io.BufferedInputStream; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.FileReader; -import java.io.IOException; -import java.io.OutputStreamWriter; -import java.nio.charset.StandardCharsets; -import java.util.HashMap; -import java.util.Map; - -import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.xml.XMLConstants; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; - -import org.apache.commons.io.FileUtils; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.app.view.DataFormat; -import org.openforis.collect.earth.app.view.JFileChooserExistsAware; -import org.openforis.collect.earth.app.view.Messages; -import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; -import org.openforis.collect.io.metadata.collectearth.CollectEarthProjectFileCreator; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.ipcc.IPCCGenerator; +import org.openforis.collect.earth.ipcc.IPCCGeneratorException; +import org.openforis.collect.earth.ipcc.RdbExportException; +import org.openforis.collect.model.CollectSurvey; +import org.openforis.collect.relational.CollectRDBPublisher; +import org.openforis.collect.relational.CollectRdbException; +import org.openforis.idm.metamodel.NodeDefinition; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.w3c.dom.Document; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; @Component -public class KmlImportService { - - Map namesAndTimes = new HashMap<>(); +public class IPCCGeneratorService extends GenerateDatabase{ @Autowired - LocalPropertiesService localPropertiesService; - + RDBExporter rdbExporter; + @Autowired - EarthProjectsService earthProjectsService; + CollectRDBPublisher collectRDBPublisher; @Autowired EarthSurveyService earthSurveyService; - private JFrame frame; - - /* - * - - one - - -5.89991123135449 - 41.60459478540565 - 0 - -1.425202537313517e-006 - 0 - 177418.783783632 - relativeToSeaFloor - - #m_ylw-pushpin - - 1 - -5.899911231354489,41.60459478540565,0 - - - * - * - */ - - private File createTempCsv( File kmlFile) throws ParserConfigurationException, SAXException, IOException{ - - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); // Compliant - factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); // compliant - DocumentBuilder builder = factory.newDocumentBuilder(); - InputSource is = new InputSource(new FileReader(kmlFile)); - Document doc = builder.parse(is); - - NodeList placemarks = doc.getElementsByTagName("Placemark"); //$NON-NLS-1$ - - StringBuilder sb = new StringBuilder(); - - sb.append( CollectEarthProjectFileCreator.PLACEHOLDER_ID_COLUMNS_HEADER ).append(",").append( "YCoordinate" ).append(",").append( "XCoordinate" ).append(CollectEarthProjectFileCreator.PLACEHOLDER_FOR_EXTRA_COLUMNS_HEADER).append( "\r\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - - - for (int i = 0; i < placemarks.getLength(); i++) { - Node placemark = placemarks.item(i); - - if (placemark.hasChildNodes()) { - NodeList childNodes = placemark.getChildNodes(); - String longitude = "",latitude = "",name = "Placemark"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - name = "placemark" + i; - for (int j=0; j nodeDef.getName().equals(nodeName) ); + return nodeDefForNAme != null; } - private File selectAndSaveToCsv(File convertedCsvFile, String name) throws IOException { - final File[] saveToCsvFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, true, false, "importedFromKml_" + name + ".csv", //$NON-NLS-1$ //$NON-NLS-2$ - localPropertiesService, frame); - if( saveToCsvFile != null && saveToCsvFile.length == 1 ){ - FileUtils.copyFile( convertedCsvFile, saveToCsvFile[0]); - return saveToCsvFile[0]; - }else { - return null; - } + @Override + public LocalPropertiesService getLocalPropertiesService() { + return localPropertiesService; } -/* private File moveCsvToProjectFolder(File convertedCsvFile, String originalKmlFilename) throws IOException { - File destination = new File( earthProjectsService.getProjectsFolder() + File.separator + "generatedFromKml_" + originalKmlFilename + ".ced"); - FileUtils.copyFile( convertedCsvFile, destination); - return destination; - }*/ - - private File chooseKmlFile() { - final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults(DataFormat.KML_FILE, false, false, null, - localPropertiesService, frame); - - if( selectedPlotFiles != null && selectedPlotFiles.length == 1 ){ - return selectedPlotFiles[0]; - }else { - return null; - } + @Override + public EarthSurveyService getEarthSurveyService() { + return earthSurveyService; } + @Override + public RDBExporter getRdbExporter() { + return rdbExporter; + } -} +} \ No newline at end of file From 2021d26868d7db9c3092dc5f9981ed771980f4fc Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:23 +0100 Subject: [PATCH 0162/1620] New translations KmlGeneratorService.java (French) --- .../earth/app/view/Messages_fr.properties | 474 ++++++++++++++++-- 1 file changed, 419 insertions(+), 55 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index b23ed83438..884dd929bc 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,87 +1,451 @@ -package org.openforis.collect.earth.app.server; +package org.openforis.collect.earth.app.service; +import java.io.File; import java.io.IOException; +import java.util.HashMap; import java.util.Map; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; import org.openforis.collect.earth.app.view.Messages; +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.collect.earth.sampler.processor.CircleKmlGenerator; +import org.openforis.collect.earth.sampler.processor.HexagonKmlGenerator; +import org.openforis.collect.earth.sampler.processor.KmlGenerator; +import org.openforis.collect.earth.sampler.processor.KmzGenerator; +import org.openforis.collect.earth.sampler.processor.NfiFourCirclesGenerator; +import org.openforis.collect.earth.sampler.processor.NfiThreeCirclesGenerator; +import org.openforis.collect.earth.sampler.processor.NfmaKmlGenerator; +import org.openforis.collect.earth.sampler.processor.PolygonGeojsonGenerator; +import org.openforis.collect.earth.sampler.processor.PolygonKmlGenerator; +import org.openforis.collect.earth.sampler.processor.PolygonWktGenerator; +import org.openforis.collect.earth.sampler.processor.SquareKmlGenerator; +import org.openforis.collect.earth.sampler.processor.SquareWithCirclesKmlGenerator; +import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; +import org.openforis.collect.earth.sampler.utils.KmlGenerationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; - -/** - * Servlet called for updating/saving the information about a placemark. Called from the form in Google Earth when the user interacts with it or clicks the save button. - * @author Alfonso Sanchez-Paus Diaz - * - * @deprecated Replaced by {@link PlacemarkDataController} - * - */ -@Deprecated -@Controller -public class SaveEarthDataServlet extends JsonPocessorServlet { +import org.springframework.stereotype.Component; + +import com.opencsv.CSVReader; +import com.opencsv.exceptions.CsvValidationException; + +import freemarker.template.TemplateException; + +@Component +public class KmlGeneratorService { @Autowired LocalPropertiesService localPropertiesService; - //@Autowired - //CollectDesignerController collectDesignerController; + @Autowired + EarthSurveyService earthSurveyService; + + Logger logger = LoggerFactory.getLogger(KmlGeneratorService.class); + + public static final String KML_RESULTING_TEMP_FILE = EarthConstants.GENERATED_FOLDER + File.separator + "plots.kml"; //$NON-NLS-1$ + public static final String KMZ_FILE_PATH = EarthConstants.GENERATED_FOLDER + File.separator + "gePlugin.kmz"; //$NON-NLS-1$ + public static final String KML_NETWORK_LINK_TEMPLATE = "resources/loadApp.fmt"; //$NON-NLS-1$ + public static final String KML_NETWORK_LINK_STARTER = EarthConstants.GENERATED_FOLDER + "/loadApp.kml"; //$NON-NLS-1$ + + public static interface PolygonTest{ + Boolean isPolygon(String[] strColumns); + } + + public void generateKmlFile() throws IOException, KmlGenerationException, CsvValidationException{ + checkFilesExist(); + generatePlacemarksKmzFile(); + + } + + private void checkFilesExist() throws KmlGenerationException { + + fixUserDirectory(); + + final String csvFilePath = getLocalProperties().getCsvFile(); + final String balloonPath = getLocalProperties().getBalloonFile(); + final String templatePath = getLocalProperties().getTemplateFile(); + boolean filesExist = true; + String errorMessage = "Error generating the KML file for Google Earth.
"; //$NON-NLS-1$ + File csvFile = null; + File balloon = null; + File template = null; + try { + csvFile = new File(csvFilePath); + balloon = new File(balloonPath); + template = new File(templatePath); + } catch (final Exception e) { + logger.error("One of the definition files is not defined", e); //$NON-NLS-1$ + } + if (csvFile != null && !csvFile.exists()) { + errorMessage += Messages.getString("EarthApp.21") //$NON-NLS-1$ + + csvFile.getAbsolutePath() + "

"; //$NON-NLS-1$ + filesExist = false; + } else if (csvFile == null) { + errorMessage += Messages.getString("EarthApp.23"); //$NON-NLS-1$ + filesExist = false; + } + + if (template != null && !template.exists()) { + errorMessage += Messages.getString("EarthApp.24") //$NON-NLS-1$ + + template.getAbsolutePath() + "

"; //$NON-NLS-1$ + filesExist = false; + } else if (template == null) { + errorMessage += Messages.getString("EarthApp.26"); //$NON-NLS-1$ + filesExist = false; + } + + if (balloon != null && !balloon.exists()) { + errorMessage += Messages.getString("EarthApp.27") + balloon.getAbsolutePath() //$NON-NLS-1$ + + "

"; //$NON-NLS-1$ + filesExist = false; + } else if (balloon == null) { + errorMessage += Messages.getString("EarthApp.29"); //$NON-NLS-1$ + filesExist = false; + } + + errorMessage += Messages.getString("EarthApp.30"); //$NON-NLS-1$ + + if( !filesExist ){ + throw new KmlGenerationException(errorMessage); + } + } + + private LocalPropertiesService getLocalProperties() { + return localPropertiesService; + } + + private void copyContentsToGeneratedFolder(String folderToInclude) throws IOException { + final File sourceDir = new File(folderToInclude); + final File targetDir = new File(EarthConstants.GENERATED_FOLDER + File.separator + sourceDir.getName()); + FileUtils.copyDirectory(sourceDir, targetDir); + } + + private void fixUserDirectory() { + final String csvFilePath = getLocalProperties().getCsvFile(); + final String balloonPath = getLocalProperties().getBalloonFile(); + final String templatePath = getLocalProperties().getTemplateFile(); + final String metadataPath = getLocalProperties().getImdFile(); + + File csvFile = null; + File balloon = null; + File template = null; + File idmFile = null; + try { + csvFile = new File(csvFilePath); + balloon = new File(balloonPath); + template = new File(templatePath); + idmFile = new File(metadataPath); + + final String prefixUserFolder = FolderFinder.getCollectEarthDataFolder() + File.separator; + + if (!csvFile.exists()) { + final File otherFile = new File(prefixUserFolder + getLocalProperties().getCsvFile()); + if (otherFile.exists()) { + getLocalProperties().setValue(EarthProperty.SAMPLE_FILE, otherFile.getAbsolutePath()); + } + } + + if (!balloon.exists()) { + final File otherFile = new File(prefixUserFolder + getLocalProperties().getBalloonFile()); + if (otherFile.exists()) { + getLocalProperties().setValue(EarthProperty.BALLOON_TEMPLATE_KEY, otherFile.getAbsolutePath()); + } + } + + if (!template.exists()) { + final File otherFile = new File(prefixUserFolder + getLocalProperties().getTemplateFile()); + if (otherFile.exists()) { + getLocalProperties().setValue(EarthProperty.KML_TEMPLATE_KEY, otherFile.getAbsolutePath()); + } + } + + if (!idmFile.exists()) { + final File otherFile = new File(prefixUserFolder + getLocalProperties().getImdFile()); + if (otherFile.exists()) { + getLocalProperties().setValue(EarthProperty.METADATA_FILE, otherFile.getAbsolutePath()); + } + } + + } catch (final Exception e) { + logger.error("One of the definition files is not defined", e); //$NON-NLS-1$ + } + + } + + + private int parseInt( String intNumber ){ + int i = 0; + try{ + if( StringUtils.isNoneBlank( intNumber ) ) { + i = Integer.parseInt( intNumber ); + } + }catch(Exception e){ + logger.error( "Error parsing integer number" ); + } + return i; + } + + public KmlGenerator getKmlGenerator() throws KmlGenerationException, CsvValidationException { + KmlGenerator generateKml =null; + + final String crsSystem = getLocalProperties().getCrs(); + final Integer innerPointSide = parseInt(getLocalProperties().getValue(EarthProperty.INNER_SUBPLOT_SIDE)); + final Integer largeCentralPlotSide = parseInt(getLocalProperties().getValue(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)); + final String distanceToBuffers = getLocalProperties().getValue(EarthProperty.DISTANCE_TO_BUFFERS); + SAMPLE_SHAPE plotShape = getLocalProperties().getSampleShape(); + final String hostAddress = ServerController.getHostAddress(getLocalProperties().getHost(), getLocalProperties().getPort()); + + final float distanceBetweenSamplePoints; + final float distanceToPlotBoundaries; + String dBSP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS); + try { + distanceBetweenSamplePoints = Float.parseFloat(dBSP); + } catch (Exception e) { + logger.error("Error parsing distance between sample points , wrong value : " + dBSP,e); + EarthApp.showMessage("Attention: Check earth.properties file. The distance between sample points must be a number! You have set it to : " + dBSP); //$NON-NLS-1$ + return null; + } + + + String dToPlotB = getLocalProperties().getValue(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES); + try { + distanceToPlotBoundaries = Float.parseFloat(dToPlotB); + } catch (Exception e) { + logger.error("Error parsing distance between plots , wrong value : " + dToPlotB,e); + EarthApp.showMessage("Attention: Check earth.properties file. The distance between sample point and border of the plot must be a number ! You have set it to : " + dToPlotB); //$NON-NLS-1$ + return null; + } + final String localPort = getLocalProperties().getLocalPort(); + final String numberOfSamplingPlots = getLocalProperties().getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT); + final String csvFile = getLocalProperties().getCsvFile(); + + int numberOfPoints = 25; + if ((numberOfSamplingPlots != null) && (numberOfSamplingPlots.trim().length() > 0)) { + numberOfPoints = parseInt(numberOfSamplingPlots.trim()); + } + + try{ + // If there is a polygon column then the type of plot shape is assumed to be POLYGON + if( csvContainsKml(csvFile)){ + plotShape = SAMPLE_SHAPE.KML_POLYGON; + }else if( csvContainsWkt(csvFile)){ + plotShape = SAMPLE_SHAPE.WKT_POLYGON; + }else if( csvContainsGeoJson(csvFile)){ + plotShape = SAMPLE_SHAPE.GEOJSON_POLYGON; + } + if (plotShape.equals(SAMPLE_SHAPE.CIRCLE)) { + generateKml = new CircleKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, distanceBetweenSamplePoints ); + } else if (plotShape.equals(SAMPLE_SHAPE.NFMA)) { + generateKml = new NfmaKmlGenerator(crsSystem, hostAddress, localPort, 150, false); + } else if (plotShape.equals(SAMPLE_SHAPE.NFMA_250)) { + generateKml = new NfmaKmlGenerator(crsSystem, hostAddress, localPort, 250, true); + } else if (plotShape.equals(SAMPLE_SHAPE.NFI_THREE_CIRCLES)) { - @Deprecated - @GetMapping("/saveData") - public void saveData(HttpServletRequest request, HttpServletResponse response) throws IOException { + String dBP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS ); + float distanceBetweenPlots; + try { + distanceBetweenPlots = Float.parseFloat(dBP); + } catch (Exception e) { + logger.error("Error parsing distance between plots , wrong value : " + dBP,e); + EarthApp.showMessage("Attention: Check earth.properties file. The distance between plots must be a number! You have set it to : " + dBP); //$NON-NLS-1$ + return null; + } - Map collectedData = extractRequestData(request); + generateKml = new NfiThreeCirclesGenerator(crsSystem, hostAddress, localPort, innerPointSide, distanceBetweenSamplePoints, distanceBetweenPlots ); + }else if (plotShape.equals(SAMPLE_SHAPE.NFI_FOUR_CIRCLES)) { - replaceTestVariables(collectedData); + String dBP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS ); + float distanceBetweenPlots; + try { + distanceBetweenPlots = Float.parseFloat(dBP); + } catch (Exception e) { + logger.error(String.format("Error parsing distance between plots , wrong value : %s", dBP) ,e); + EarthApp.showMessage("Attention: Check earth.properties file. The distance between plots must be a number! You have set it to : " + dBP); //$NON-NLS-1$ + return null; + } - if (collectedData.size() == 0) { - setResult(false, Messages.getString("SaveEarthDataServlet.0"), collectedData); //$NON-NLS-1$ - getLogger().info("The request was empty"); //$NON-NLS-1$ - } else { - if (getDataAccessor().saveData(collectedData)) { - setResult(true, Messages.getString("SaveEarthDataServlet.2"), collectedData); //$NON-NLS-1$ - } else { - setResult(false, Messages.getString("SaveEarthDataServlet.1"), collectedData); //$NON-NLS-1$ - getLogger().error("The data could not be saved"); //$NON-NLS-1$ + generateKml = new NfiFourCirclesGenerator(crsSystem, hostAddress, localPort, innerPointSide, distanceBetweenSamplePoints, distanceBetweenPlots ); + }else if (plotShape.equals(SAMPLE_SHAPE.HEXAGON)) { + generateKml = new HexagonKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, distanceBetweenSamplePoints ); + } else if (plotShape.equals(SAMPLE_SHAPE.SQUARE_CIRCLE)) { + generateKml = new SquareWithCirclesKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, + distanceBetweenSamplePoints, distanceToPlotBoundaries); + } else if (plotShape.equals(SAMPLE_SHAPE.KML_POLYGON)) { + generateKml = new PolygonKmlGenerator(crsSystem, hostAddress, localPort); + } else if (plotShape.equals(SAMPLE_SHAPE.GEOJSON_POLYGON)) { + generateKml = new PolygonGeojsonGenerator(crsSystem, hostAddress, localPort); + }else if (plotShape.equals(SAMPLE_SHAPE.WKT_POLYGON)) { + generateKml = new PolygonWktGenerator(crsSystem, hostAddress, localPort); + }else { + generateKml = new SquareKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, + distanceBetweenSamplePoints, distanceToPlotBoundaries, largeCentralPlotSide, distanceToBuffers); } + }catch(IOException e){ + logger.error("Error generating KML", e ); } - setJsonResponse(response, collectedData); + if( generateKml == null ) { + throw new KmlGenerationException("Error getting the KML generator for parameters " + plotShape.name() ); + } + + return generateKml; } - /** - * This method replaces the variable values that the form contains when it is not run - * through Google Earth and the variable replacement of the ExtendedData of the KML does not kick in. - * - * @param collectedData - * The data POSTed by the form that has already been processed. - */ - private void replaceTestVariables(Map collectedData) { - // REMOVE THIS!!!! - if (collectedData.get(EarthConstants.PLACEMARK_ID_PARAMETER).equals("$[id]")) { //$NON-NLS-1$ //$NON-NLS-2$ - collectedData.put(EarthConstants.PLACEMARK_ID_PARAMETER, "testPlacemark"); //$NON-NLS-1$ //$NON-NLS-2$ + + private boolean csvContains(String csvFile, PolygonTest test ) throws IOException, CsvValidationException { + try( CSVReader csvReader = CsvReaderUtils.getCsvReader(csvFile) ){ + csvReader.readNext(); // Ignore it might be the column headers + + String[] secondLine = csvReader.readNext(); + if( secondLine != null && !CsvReaderUtils.onlyEmptyCells(secondLine) ){ + return test.isPolygon( secondLine ); + } + + return false; } + } - if (collectedData.get("collect_integer_elevation") != null && collectedData.get("collect_integer_elevation").equals("$[elevation]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - collectedData.put("collect_integer_elevation", "0"); //$NON-NLS-1$ //$NON-NLS-2$ + private boolean csvContainsGeoJson(String csvFile) throws IOException, CsvValidationException { + return + csvContains( + csvFile, + csvColumns -> new PolygonGeojsonGenerator(null, null, null ).isGeoJsonPolygonColumnFound(csvColumns) != null + ); + } + + private boolean csvContainsWkt(String csvFile) throws IOException, CsvValidationException { + return csvContains( + csvFile, + csvColumns -> new PolygonWktGenerator(null, null, null ).isWktPolygonColumnFound(csvColumns) != null + ); + } + + private boolean csvContainsKml(String csvFile) throws IOException, CsvValidationException { + return csvContains( + csvFile, + csvColumns -> new PolygonKmlGenerator(null, null, null ).isKmlPolygonColumnFound(csvColumns) != null + ); + } + + private void generateKml() throws KmlGenerationException, IOException, CsvValidationException { + + KmlGenerator kmlGenerator = null; + kmlGenerator = getKmlGenerator(); + + if ( kmlGenerator == null ){ + throw new KmlGenerationException("Error while generating KML"); } - if (collectedData.get("collect_real_slope") != null && collectedData.get("collect_real_slope").equals("$[slope]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - collectedData.put("collect_real_slope", "0"); //$NON-NLS-1$ //$NON-NLS-2$ + final String csvFile = getLocalProperties().getCsvFile(); + String balloon = getLocalProperties().getBalloonFile(); + final String template = getLocalProperties().getTemplateFile(); + + // In case the user sets up the OPEN_BALLOON_IN_FIREFOX flag to + // true. Meaning that a small ballon opens in the placemark which in + // its turn + // opens a firefox browser with the real form + final Boolean openBalloonInFirefox = Boolean.valueOf(getLocalProperties().getValue(EarthProperty.OPEN_BALLOON_IN_BROWSER)); + if (Boolean.TRUE.equals( openBalloonInFirefox) ) { + String alternativeBalloon = getLocalProperties().getValue(EarthProperty.ALTERNATIVE_BALLOON_FOR_BROWSER); + if( !StringUtils.isBlank( alternativeBalloon ) ){ + balloon = alternativeBalloon; + } } - if (collectedData.get("collect_real_aspect") != null && collectedData.get("collect_real_aspect").equals("$[aspect]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - collectedData.put("collect_real_aspect", "0"); //$NON-NLS-1$ //$NON-NLS-2$ + // Using all of the files that compose the final KML it is generated and stores in KML_RESULTING_TEMP_FILE + kmlGenerator.generateKmlFile(KML_RESULTING_TEMP_FILE, csvFile, balloon, template, earthSurveyService.getCollectSurvey()); + updateFilesUsedChecksum(); + + } + + private void updateFilesUsedChecksum() throws IOException { + final String csvFile = getLocalProperties().getCsvFile(); + final String balloon = getLocalProperties().getBalloonFile(); + final String template = getLocalProperties().getTemplateFile(); + + getLocalProperties().saveBalloonFileChecksum(CollectEarthUtils.getMd5FromFile(balloon)); + getLocalProperties().saveCsvFileCehcksum(CollectEarthUtils.getMd5FromFile(csvFile)); + getLocalProperties().saveTemplateFileChecksum(CollectEarthUtils.getMd5FromFile(template)); + } + + public void generateLoaderKmlFile() throws IOException, TemplateException { + + getLocalProperties().saveGeneratedOn(System.currentTimeMillis() + ""); //$NON-NLS-1$ + + final Map data = new HashMap<>(); + data.put("host", ServerController.getHostAddress(getLocalProperties().getHost(), getLocalProperties().getLocalPort())); //$NON-NLS-1$ + data.put("kmlGeneratedOn", getLocalProperties().getGeneratedOn()); //$NON-NLS-1$ + data.put("surveyName", getLocalProperties().getValue(EarthProperty.SURVEY_NAME)); //$NON-NLS-1$ + data.put("plotFileName", KmlGenerator.getCsvFileName(getLocalProperties().getValue(EarthProperty.SAMPLE_FILE))); //$NON-NLS-1$ + + FreemarkerTemplateUtils.applyTemplate(new File(KML_NETWORK_LINK_TEMPLATE), new File(KML_NETWORK_LINK_STARTER), data); + } + + private boolean isKmlUpToDate() throws IOException { + + final String csvFile = getLocalProperties().getCsvFile(); + final String balloon = getLocalProperties().getBalloonFile(); + final String template = getLocalProperties().getTemplateFile(); + + boolean upToDate = true; + if (!getLocalProperties().getBalloonFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(balloon)) + || !getLocalProperties().getTemplateFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(template)) + || !getLocalProperties().getCsvFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(csvFile))) { + upToDate = false; } - if (collectedData.get("collect_coord_location").equals("$[latitude],$[longitude]")) { //$NON-NLS-1$ //$NON-NLS-2$ - collectedData.put("collect_coord_location", "0,0"); //$NON-NLS-1$ //$NON-NLS-2$ + final File kmzFile = new File(KmlGeneratorService.KMZ_FILE_PATH); + if (!kmzFile.exists()) { + upToDate = false; } + + return upToDate; + + } + + public void generatePlacemarksKmzFile() throws IOException, KmlGenerationException, CsvValidationException { + generatePlacemarksKmzFile(false); } -} \ No newline at end of file + public void generatePlacemarksKmzFile(boolean forceRegeneration ) throws IOException, KmlGenerationException, CsvValidationException { + + logger.info("START - Generate KMZ file"); //$NON-NLS-1$ + + if (forceRegeneration || !isKmlUpToDate()) { + + generateKml(); + + final KmzGenerator kmzGenerator = new KmzGenerator(); + + final String balloon = getLocalProperties().getBalloonFile(); + final File balloonFile = new File(balloon); + final String folderToInclude = balloonFile.getParent() + File.separator + EarthConstants.FOLDER_COPIED_TO_KMZ; + + kmzGenerator.generateKmzFile(KMZ_FILE_PATH, KML_RESULTING_TEMP_FILE, folderToInclude); + logger.info("KMZ File generated : {}", KMZ_FILE_PATH); //$NON-NLS-1$ + + copyContentsToGeneratedFolder(folderToInclude); + + final File kmlFile = new File(KML_RESULTING_TEMP_FILE); + if (kmlFile.exists()) { + final boolean deleted = kmlFile.delete(); + if (deleted) { + logger.info("KML File deleted : {}", KML_RESULTING_TEMP_FILE); //$NON-NLS-1$ + } else { + throw new IOException("The KML file could not be deleted at " + kmlFile.getPath()); //$NON-NLS-1$ + } + } + + } + logger.info("END - Generate KMZ file"); //$NON-NLS-1$ + } +} From f06712dc2b5bd5ab933b124cf28a8aadfd4b0697 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:24 +0100 Subject: [PATCH 0163/1620] New translations KmlGeneratorService.java (Spanish) --- .../earth/app/view/Messages_es.properties | 529 +++++++++++++----- 1 file changed, 393 insertions(+), 136 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index eb9f542d80..884dd929bc 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,194 +1,451 @@ package org.openforis.collect.earth.app.service; import java.io.File; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.desktop.ServerController; import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.io.data.CSVDataExportProcess; -import org.openforis.collect.io.data.CSVDataImportProcess; -import org.openforis.collect.io.data.DataExportStatus; -import org.openforis.collect.io.data.DataImportSummaryItem; -import org.openforis.collect.io.data.XMLDataExportProcess; -import org.openforis.collect.io.data.XMLDataImportProcess; -import org.openforis.collect.io.data.csv.CSVDataExportParameters; -import org.openforis.collect.io.data.csv.CSVDataImportSettings; -import org.openforis.collect.manager.process.AbstractProcess; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.RecordFilter; -import org.openforis.commons.collection.Predicate; -import org.openforis.idm.model.BooleanAttribute; +import org.openforis.collect.earth.app.view.Messages; +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.collect.earth.sampler.processor.CircleKmlGenerator; +import org.openforis.collect.earth.sampler.processor.HexagonKmlGenerator; +import org.openforis.collect.earth.sampler.processor.KmlGenerator; +import org.openforis.collect.earth.sampler.processor.KmzGenerator; +import org.openforis.collect.earth.sampler.processor.NfiFourCirclesGenerator; +import org.openforis.collect.earth.sampler.processor.NfiThreeCirclesGenerator; +import org.openforis.collect.earth.sampler.processor.NfmaKmlGenerator; +import org.openforis.collect.earth.sampler.processor.PolygonGeojsonGenerator; +import org.openforis.collect.earth.sampler.processor.PolygonKmlGenerator; +import org.openforis.collect.earth.sampler.processor.PolygonWktGenerator; +import org.openforis.collect.earth.sampler.processor.SquareKmlGenerator; +import org.openforis.collect.earth.sampler.processor.SquareWithCirclesKmlGenerator; +import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; +import org.openforis.collect.earth.sampler.utils.KmlGenerationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ +import com.opencsv.CSVReader; +import com.opencsv.exceptions.CsvValidationException; + +import freemarker.template.TemplateException; + @Component -public class DataImportExportService { +public class KmlGeneratorService { @Autowired - private EarthSurveyService earthSurveyService; + LocalPropertiesService localPropertiesService; @Autowired - private LocalPropertiesService localPropertiesService; + EarthSurveyService earthSurveyService; - private final Logger logger = LoggerFactory.getLogger(DataImportExportService.class); - /** - * Use the application context to get a new bean everytime the data is exported ( as a new instance is needed every time) - */ - @Autowired - private ApplicationContext applicationContext; + Logger logger = LoggerFactory.getLogger(KmlGeneratorService.class); - private void addRecordsToImportList( List recordsToImport, List entryIdsToImport) { - if (recordsToImport != null) { - List cleanRecordsToImport = recordsToImport; - for (final DataImportSummaryItem importRecord : cleanRecordsToImport) { - entryIdsToImport.add(importRecord.getEntryId()); - } - } + public static final String KML_RESULTING_TEMP_FILE = EarthConstants.GENERATED_FOLDER + File.separator + "plots.kml"; //$NON-NLS-1$ + public static final String KMZ_FILE_PATH = EarthConstants.GENERATED_FOLDER + File.separator + "gePlugin.kmz"; //$NON-NLS-1$ + public static final String KML_NETWORK_LINK_TEMPLATE = "resources/loadApp.fmt"; //$NON-NLS-1$ + public static final String KML_NETWORK_LINK_STARTER = EarthConstants.GENERATED_FOLDER + "/loadApp.kml"; //$NON-NLS-1$ + + public static interface PolygonTest{ + Boolean isPolygon(String[] strColumns); } - public CSVDataExportProcess exportSurveyAsCsv(File exportToFile, boolean includeCodeItemLabelColumn) { - final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); - csvDataExportProcess.setOutputFile(exportToFile); + public void generateKmlFile() throws IOException, KmlGenerationException, CsvValidationException{ + checkFilesExist(); + generatePlacemarksKmzFile(); - csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); - csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; + } - CSVDataExportParameters config = new CSVDataExportParameters(); - config.setIncludeAllAncestorAttributes(true); - config.setIncludeEnumeratedEntities(true); - config.setLanguageCode( localPropertiesService.getValue(EarthProperty.UI_LANGUAGE) ); - config.setIncludeCodeItemLabelColumn(includeCodeItemLabelColumn); - csvDataExportProcess.setConfiguration(config); + private void checkFilesExist() throws KmlGenerationException { + + fixUserDirectory(); + + final String csvFilePath = getLocalProperties().getCsvFile(); + final String balloonPath = getLocalProperties().getBalloonFile(); + final String templatePath = getLocalProperties().getTemplateFile(); + boolean filesExist = true; + String errorMessage = "Error generating the KML file for Google Earth.
"; //$NON-NLS-1$ + File csvFile = null; + File balloon = null; + File template = null; + try { + csvFile = new File(csvFilePath); + balloon = new File(balloonPath); + template = new File(templatePath); + } catch (final Exception e) { + logger.error("One of the definition files is not defined", e); //$NON-NLS-1$ + } + if (csvFile != null && !csvFile.exists()) { + errorMessage += Messages.getString("EarthApp.21") //$NON-NLS-1$ + + csvFile.getAbsolutePath() + "

"; //$NON-NLS-1$ + filesExist = false; + } else if (csvFile == null) { + errorMessage += Messages.getString("EarthApp.23"); //$NON-NLS-1$ + filesExist = false; + } - return csvDataExportProcess; - } + if (template != null && !template.exists()) { + errorMessage += Messages.getString("EarthApp.24") //$NON-NLS-1$ + + template.getAbsolutePath() + "

"; //$NON-NLS-1$ + filesExist = false; + } else if (template == null) { + errorMessage += Messages.getString("EarthApp.26"); //$NON-NLS-1$ + filesExist = false; + } - private RecordFilter getRecordFilter( ) { - RecordFilter recordFilter = new RecordFilter(earthSurveyService.getCollectSurvey(), earthSurveyService.getRootEntityDefinition().getId()); - recordFilter.setStepGreaterOrEqual(Step.ENTRY); - return recordFilter; - } + if (balloon != null && !balloon.exists()) { + errorMessage += Messages.getString("EarthApp.27") + balloon.getAbsolutePath() //$NON-NLS-1$ + + "

"; //$NON-NLS-1$ + filesExist = false; + } else if (balloon == null) { + errorMessage += Messages.getString("EarthApp.29"); //$NON-NLS-1$ + filesExist = false; + } - public CSVDataExportProcess exportSurveyAsFusionTable(File exportToFile, boolean includeCodeItemLabelColumn) { + errorMessage += Messages.getString("EarthApp.30"); //$NON-NLS-1$ - final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); - csvDataExportProcess.setOutputFile(exportToFile); - csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); - csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; + if( !filesExist ){ + throw new KmlGenerationException(errorMessage); + } + } - CSVDataExportParameters config = new CSVDataExportParameters(); - config.setIncludeAllAncestorAttributes(true); - config.setLanguageCode( localPropertiesService.getValue(EarthProperty.UI_LANGUAGE) ); - config.setIncludeCodeItemPositionColumn(true); - config.setIncludeKMLColumnForCoordinates(true); - config.setIncludeCodeItemLabelColumn( includeCodeItemLabelColumn ); - csvDataExportProcess.setConfiguration(config); - return csvDataExportProcess; + private LocalPropertiesService getLocalProperties() { + return localPropertiesService; } - public XMLDataExportProcess exportSurveyAsZipWithXml(File exportToFile, Date modifiedSince) throws Exception { - final XMLDataExportProcess xmlDataExportProcess = applicationContext.getBean(XMLDataExportProcess.class); - xmlDataExportProcess.setOutputFile(exportToFile); - xmlDataExportProcess.setRootEntityName(EarthConstants.ROOT_ENTITY_NAME); - xmlDataExportProcess.setSurvey(earthSurveyService.getCollectSurvey()); - xmlDataExportProcess.setModifiedSince(modifiedSince); - xmlDataExportProcess.setIncludeIdm(true); - xmlDataExportProcess.setSteps(new Step[] { Step.ENTRY }); - return xmlDataExportProcess; + private void copyContentsToGeneratedFolder(String folderToInclude) throws IOException { + final File sourceDir = new File(folderToInclude); + final File targetDir = new File(EarthConstants.GENERATED_FOLDER + File.separator + sourceDir.getName()); + FileUtils.copyDirectory(sourceDir, targetDir); } + private void fixUserDirectory() { + final String csvFilePath = getLocalProperties().getCsvFile(); + final String balloonPath = getLocalProperties().getBalloonFile(); + final String templatePath = getLocalProperties().getTemplateFile(); + final String metadataPath = getLocalProperties().getImdFile(); + + File csvFile = null; + File balloon = null; + File template = null; + File idmFile = null; + try { + csvFile = new File(csvFilePath); + balloon = new File(balloonPath); + template = new File(templatePath); + idmFile = new File(metadataPath); + + final String prefixUserFolder = FolderFinder.getCollectEarthDataFolder() + File.separator; + + if (!csvFile.exists()) { + final File otherFile = new File(prefixUserFolder + getLocalProperties().getCsvFile()); + if (otherFile.exists()) { + getLocalProperties().setValue(EarthProperty.SAMPLE_FILE, otherFile.getAbsolutePath()); + } + } - public CSVDataImportProcess getCsvImporterProcess(File importFromFile) { - final CSVDataImportProcess importProcess = applicationContext.getBean("transactionalCsvDataImportProcess", CSVDataImportProcess.class); + if (!balloon.exists()) { + final File otherFile = new File(prefixUserFolder + getLocalProperties().getBalloonFile()); + if (otherFile.exists()) { + getLocalProperties().setValue(EarthProperty.BALLOON_TEMPLATE_KEY, otherFile.getAbsolutePath()); + } + } + + if (!template.exists()) { + final File otherFile = new File(prefixUserFolder + getLocalProperties().getTemplateFile()); + if (otherFile.exists()) { + getLocalProperties().setValue(EarthProperty.KML_TEMPLATE_KEY, otherFile.getAbsolutePath()); + } + } + + if (!idmFile.exists()) { + final File otherFile = new File(prefixUserFolder + getLocalProperties().getImdFile()); + if (otherFile.exists()) { + getLocalProperties().setValue(EarthProperty.METADATA_FILE, otherFile.getAbsolutePath()); + } + } + + } catch (final Exception e) { + logger.error("One of the definition files is not defined", e); //$NON-NLS-1$ + } - importProcess.setFile(importFromFile); - importProcess.setSurvey(earthSurveyService.getCollectSurvey()); - importProcess.setParentEntityDefinitionId(earthSurveyService.getRootEntityDefinition().getId()); - importProcess.setStep(Step.ENTRY ); - CSVDataImportSettings settings = new CSVDataImportSettings(); - settings.setRecordValidationEnabled(false); - settings.setInsertNewRecords(false); - settings.setNewRecordVersionName(null); - settings.setReportNoRecordFoundErrors(false); - importProcess.setSettings(settings); - return importProcess; } - public XMLDataImportProcess getImportSummary(File zipWithXml, boolean importNonFinishedPlots) throws Exception { - final XMLDataImportProcess dataImportProcess = applicationContext.getBean(XMLDataImportProcess.class); - dataImportProcess.init(); - dataImportProcess.setFile(zipWithXml); - dataImportProcess.setValidateRecords(false); - dataImportProcess.prepareToStartSummaryCreation(); - if( !importNonFinishedPlots ){ // Import only plots whose actively_saved state is set to true - dataImportProcess.setIncludeRecordPredicate( new Predicate() { + private int parseInt( String intNumber ){ + int i = 0; + try{ + if( StringUtils.isNoneBlank( intNumber ) ) { + i = Integer.parseInt( intNumber ); + } + }catch(Exception e){ + logger.error( "Error parsing integer number" ); + } + return i; + } - @Override - public boolean evaluate(CollectRecord record) { - boolean include = true; + public KmlGenerator getKmlGenerator() throws KmlGenerationException, CsvValidationException { + KmlGenerator generateKml =null; + + final String crsSystem = getLocalProperties().getCrs(); + final Integer innerPointSide = parseInt(getLocalProperties().getValue(EarthProperty.INNER_SUBPLOT_SIDE)); + final Integer largeCentralPlotSide = parseInt(getLocalProperties().getValue(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)); + final String distanceToBuffers = getLocalProperties().getValue(EarthProperty.DISTANCE_TO_BUFFERS); + SAMPLE_SHAPE plotShape = getLocalProperties().getSampleShape(); + final String hostAddress = ServerController.getHostAddress(getLocalProperties().getHost(), getLocalProperties().getPort()); + + final float distanceBetweenSamplePoints; + final float distanceToPlotBoundaries; + String dBSP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS); + try { + distanceBetweenSamplePoints = Float.parseFloat(dBSP); + } catch (Exception e) { + logger.error("Error parsing distance between sample points , wrong value : " + dBSP,e); + EarthApp.showMessage("Attention: Check earth.properties file. The distance between sample points must be a number! You have set it to : " + dBSP); //$NON-NLS-1$ + return null; + } - try { - final BooleanAttribute node = (BooleanAttribute) record.getNodeByPath("/plot/" + EarthConstants.ACTIVELY_SAVED_ATTRIBUTE_NAME); //$NON-NLS-1$ - include = (node == null || (node != null && !node.isEmpty() && node.getValue().getValue()) ); - } catch (Exception e) { - logger.error("No \"/plot/actively_saved\" node found ", e ); //$NON-NLS-1$ - } + String dToPlotB = getLocalProperties().getValue(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES); + try { + distanceToPlotBoundaries = Float.parseFloat(dToPlotB); + } catch (Exception e) { + logger.error("Error parsing distance between plots , wrong value : " + dToPlotB,e); + EarthApp.showMessage("Attention: Check earth.properties file. The distance between sample point and border of the plot must be a number ! You have set it to : " + dToPlotB); //$NON-NLS-1$ + return null; + } + final String localPort = getLocalProperties().getLocalPort(); + final String numberOfSamplingPlots = getLocalProperties().getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT); + final String csvFile = getLocalProperties().getCsvFile(); - return include; + int numberOfPoints = 25; + if ((numberOfSamplingPlots != null) && (numberOfSamplingPlots.trim().length() > 0)) { + numberOfPoints = parseInt(numberOfSamplingPlots.trim()); + } + + try{ + // If there is a polygon column then the type of plot shape is assumed to be POLYGON + if( csvContainsKml(csvFile)){ + plotShape = SAMPLE_SHAPE.KML_POLYGON; + }else if( csvContainsWkt(csvFile)){ + plotShape = SAMPLE_SHAPE.WKT_POLYGON; + }else if( csvContainsGeoJson(csvFile)){ + plotShape = SAMPLE_SHAPE.GEOJSON_POLYGON; + } + + if (plotShape.equals(SAMPLE_SHAPE.CIRCLE)) { + generateKml = new CircleKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, distanceBetweenSamplePoints ); + } else if (plotShape.equals(SAMPLE_SHAPE.NFMA)) { + generateKml = new NfmaKmlGenerator(crsSystem, hostAddress, localPort, 150, false); + } else if (plotShape.equals(SAMPLE_SHAPE.NFMA_250)) { + generateKml = new NfmaKmlGenerator(crsSystem, hostAddress, localPort, 250, true); + } else if (plotShape.equals(SAMPLE_SHAPE.NFI_THREE_CIRCLES)) { + + String dBP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS ); + float distanceBetweenPlots; + try { + distanceBetweenPlots = Float.parseFloat(dBP); + } catch (Exception e) { + logger.error("Error parsing distance between plots , wrong value : " + dBP,e); + EarthApp.showMessage("Attention: Check earth.properties file. The distance between plots must be a number! You have set it to : " + dBP); //$NON-NLS-1$ + return null; + } + + generateKml = new NfiThreeCirclesGenerator(crsSystem, hostAddress, localPort, innerPointSide, distanceBetweenSamplePoints, distanceBetweenPlots ); + }else if (plotShape.equals(SAMPLE_SHAPE.NFI_FOUR_CIRCLES)) { + + String dBP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS ); + float distanceBetweenPlots; + try { + distanceBetweenPlots = Float.parseFloat(dBP); + } catch (Exception e) { + logger.error(String.format("Error parsing distance between plots , wrong value : %s", dBP) ,e); + EarthApp.showMessage("Attention: Check earth.properties file. The distance between plots must be a number! You have set it to : " + dBP); //$NON-NLS-1$ + return null; } - }); + + generateKml = new NfiFourCirclesGenerator(crsSystem, hostAddress, localPort, innerPointSide, distanceBetweenSamplePoints, distanceBetweenPlots ); + }else if (plotShape.equals(SAMPLE_SHAPE.HEXAGON)) { + generateKml = new HexagonKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, distanceBetweenSamplePoints ); + } else if (plotShape.equals(SAMPLE_SHAPE.SQUARE_CIRCLE)) { + generateKml = new SquareWithCirclesKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, + distanceBetweenSamplePoints, distanceToPlotBoundaries); + } else if (plotShape.equals(SAMPLE_SHAPE.KML_POLYGON)) { + generateKml = new PolygonKmlGenerator(crsSystem, hostAddress, localPort); + } else if (plotShape.equals(SAMPLE_SHAPE.GEOJSON_POLYGON)) { + generateKml = new PolygonGeojsonGenerator(crsSystem, hostAddress, localPort); + }else if (plotShape.equals(SAMPLE_SHAPE.WKT_POLYGON)) { + generateKml = new PolygonWktGenerator(crsSystem, hostAddress, localPort); + }else { + generateKml = new SquareKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, + distanceBetweenSamplePoints, distanceToPlotBoundaries, largeCentralPlotSide, distanceToBuffers); + } + }catch(IOException e){ + logger.error("Error generating KML", e ); } - return dataImportProcess; + + if( generateKml == null ) { + throw new KmlGenerationException("Error getting the KML generator for parameters " + plotShape.name() ); + } + + return generateKml; } - public void importRecordsFrom(File zipWithXml, XMLDataImportProcess dataImportProcess, List listConflictingRecords) throws Exception { - final List entryIdsToImport = new ArrayList(); - addRecordsToImportList( listConflictingRecords, entryIdsToImport); - addRecordsToImportList( dataImportProcess.getSummary().getRecordsToImport(),entryIdsToImport); + private boolean csvContains(String csvFile, PolygonTest test ) throws IOException, CsvValidationException { + try( CSVReader csvReader = CsvReaderUtils.getCsvReader(csvFile) ){ + csvReader.readNext(); // Ignore it might be the column headers - dataImportProcess.setEntryIdsToImport(entryIdsToImport); - dataImportProcess.prepareToStartImport(); - dataImportProcess.call(); + String[] secondLine = csvReader.readNext(); + if( secondLine != null && !CsvReaderUtils.onlyEmptyCells(secondLine) ){ + return test.isPolygon( secondLine ); + } - int conflictingRecordsAdded = 0; - if (listConflictingRecords != null) { - conflictingRecordsAdded = listConflictingRecords.size(); + return false; } + } + + private boolean csvContainsGeoJson(String csvFile) throws IOException, CsvValidationException { + return + csvContains( + csvFile, + csvColumns -> new PolygonGeojsonGenerator(null, null, null ).isGeoJsonPolygonColumnFound(csvColumns) != null + ); + } + + private boolean csvContainsWkt(String csvFile) throws IOException, CsvValidationException { + return csvContains( + csvFile, + csvColumns -> new PolygonWktGenerator(null, null, null ).isWktPolygonColumnFound(csvColumns) != null + ); + } + + private boolean csvContainsKml(String csvFile) throws IOException, CsvValidationException { + return csvContains( + csvFile, + csvColumns -> new PolygonKmlGenerator(null, null, null ).isKmlPolygonColumnFound(csvColumns) != null + ); + } + + private void generateKml() throws KmlGenerationException, IOException, CsvValidationException { + + KmlGenerator kmlGenerator = null; + kmlGenerator = getKmlGenerator(); + + if ( kmlGenerator == null ){ + throw new KmlGenerationException("Error while generating KML"); + } + + final String csvFile = getLocalProperties().getCsvFile(); + String balloon = getLocalProperties().getBalloonFile(); + final String template = getLocalProperties().getTemplateFile(); + + // In case the user sets up the OPEN_BALLOON_IN_FIREFOX flag to + // true. Meaning that a small ballon opens in the placemark which in + // its turn + // opens a firefox browser with the real form + final Boolean openBalloonInFirefox = Boolean.valueOf(getLocalProperties().getValue(EarthProperty.OPEN_BALLOON_IN_BROWSER)); + if (Boolean.TRUE.equals( openBalloonInFirefox) ) { + String alternativeBalloon = getLocalProperties().getValue(EarthProperty.ALTERNATIVE_BALLOON_FOR_BROWSER); + if( !StringUtils.isBlank( alternativeBalloon ) ){ + balloon = alternativeBalloon; + } + } + + // Using all of the files that compose the final KML it is generated and stores in KML_RESULTING_TEMP_FILE + kmlGenerator.generateKmlFile(KML_RESULTING_TEMP_FILE, csvFile, balloon, template, earthSurveyService.getCollectSurvey()); + updateFilesUsedChecksum(); + + } + + private void updateFilesUsedChecksum() throws IOException { + final String csvFile = getLocalProperties().getCsvFile(); + final String balloon = getLocalProperties().getBalloonFile(); + final String template = getLocalProperties().getTemplateFile(); + + getLocalProperties().saveBalloonFileChecksum(CollectEarthUtils.getMd5FromFile(balloon)); + getLocalProperties().saveCsvFileCehcksum(CollectEarthUtils.getMd5FromFile(csvFile)); + getLocalProperties().saveTemplateFileChecksum(CollectEarthUtils.getMd5FromFile(template)); + } - logger.warn("Data imported into db. Number of Records imported : {} Conflicting records added : {}" //$NON-NLS-1$ //$NON-NLS-2$ - ,entryIdsToImport.size(), conflictingRecordsAdded); + public void generateLoaderKmlFile() throws IOException, TemplateException { + + getLocalProperties().saveGeneratedOn(System.currentTimeMillis() + ""); //$NON-NLS-1$ + + final Map data = new HashMap<>(); + data.put("host", ServerController.getHostAddress(getLocalProperties().getHost(), getLocalProperties().getLocalPort())); //$NON-NLS-1$ + data.put("kmlGeneratedOn", getLocalProperties().getGeneratedOn()); //$NON-NLS-1$ + data.put("surveyName", getLocalProperties().getValue(EarthProperty.SURVEY_NAME)); //$NON-NLS-1$ + data.put("plotFileName", KmlGenerator.getCsvFileName(getLocalProperties().getValue(EarthProperty.SAMPLE_FILE))); //$NON-NLS-1$ + + FreemarkerTemplateUtils.applyTemplate(new File(KML_NETWORK_LINK_TEMPLATE), new File(KML_NETWORK_LINK_STARTER), data); } - public AbstractProcess exportSurveyAsBackup(File exportToFile) { - final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); - csvDataExportProcess.setOutputFile(exportToFile); - csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); - csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; + private boolean isKmlUpToDate() throws IOException { + final String csvFile = getLocalProperties().getCsvFile(); + final String balloon = getLocalProperties().getBalloonFile(); + final String template = getLocalProperties().getTemplateFile(); + + boolean upToDate = true; + if (!getLocalProperties().getBalloonFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(balloon)) + || !getLocalProperties().getTemplateFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(template)) + || !getLocalProperties().getCsvFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(csvFile))) { + upToDate = false; + } + + final File kmzFile = new File(KmlGeneratorService.KMZ_FILE_PATH); + if (!kmzFile.exists()) { + upToDate = false; + } + + return upToDate; - CSVDataExportParameters config = new CSVDataExportParameters(); - config.setIncludeAllAncestorAttributes(true); - config.setIncludeCodeItemPositionColumn(true); - config.setIncludeKMLColumnForCoordinates(true); - csvDataExportProcess.setConfiguration(config); - return csvDataExportProcess; } - public EarthSurveyService getEarthSurveyService() { - return earthSurveyService; + public void generatePlacemarksKmzFile() throws IOException, KmlGenerationException, CsvValidationException { + generatePlacemarksKmzFile(false); } + public void generatePlacemarksKmzFile(boolean forceRegeneration ) throws IOException, KmlGenerationException, CsvValidationException { + + logger.info("START - Generate KMZ file"); //$NON-NLS-1$ + + if (forceRegeneration || !isKmlUpToDate()) { + + generateKml(); + + final KmzGenerator kmzGenerator = new KmzGenerator(); + + final String balloon = getLocalProperties().getBalloonFile(); + final File balloonFile = new File(balloon); + final String folderToInclude = balloonFile.getParent() + File.separator + EarthConstants.FOLDER_COPIED_TO_KMZ; + + kmzGenerator.generateKmzFile(KMZ_FILE_PATH, KML_RESULTING_TEMP_FILE, folderToInclude); + logger.info("KMZ File generated : {}", KMZ_FILE_PATH); //$NON-NLS-1$ + + copyContentsToGeneratedFolder(folderToInclude); + + final File kmlFile = new File(KML_RESULTING_TEMP_FILE); + if (kmlFile.exists()) { + final boolean deleted = kmlFile.delete(); + if (deleted) { + logger.info("KML File deleted : {}", KML_RESULTING_TEMP_FILE); //$NON-NLS-1$ + } else { + throw new IOException("The KML file could not be deleted at " + kmlFile.getPath()); //$NON-NLS-1$ + } + } + + } + logger.info("END - Generate KMZ file"); //$NON-NLS-1$ + } } From 064b61f32341189c1fb52a3e41e63ac41dc75219 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:25 +0100 Subject: [PATCH 0164/1620] New translations KmlGeneratorService.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 482 +++++++++++++++--- 1 file changed, 414 insertions(+), 68 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index c1b9c5db00..884dd929bc 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,105 +1,451 @@ package org.openforis.collect.earth.app.service; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.ipcc.IPCCGenerator; -import org.openforis.collect.earth.ipcc.IPCCGeneratorException; -import org.openforis.collect.earth.ipcc.RdbExportException; -import org.openforis.collect.model.CollectSurvey; -import org.openforis.collect.relational.CollectRDBPublisher; -import org.openforis.collect.relational.CollectRdbException; -import org.openforis.idm.metamodel.NodeDefinition; +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.app.view.Messages; +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.collect.earth.sampler.processor.CircleKmlGenerator; +import org.openforis.collect.earth.sampler.processor.HexagonKmlGenerator; +import org.openforis.collect.earth.sampler.processor.KmlGenerator; +import org.openforis.collect.earth.sampler.processor.KmzGenerator; +import org.openforis.collect.earth.sampler.processor.NfiFourCirclesGenerator; +import org.openforis.collect.earth.sampler.processor.NfiThreeCirclesGenerator; +import org.openforis.collect.earth.sampler.processor.NfmaKmlGenerator; +import org.openforis.collect.earth.sampler.processor.PolygonGeojsonGenerator; +import org.openforis.collect.earth.sampler.processor.PolygonKmlGenerator; +import org.openforis.collect.earth.sampler.processor.PolygonWktGenerator; +import org.openforis.collect.earth.sampler.processor.SquareKmlGenerator; +import org.openforis.collect.earth.sampler.processor.SquareWithCirclesKmlGenerator; +import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; +import org.openforis.collect.earth.sampler.utils.KmlGenerationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import com.opencsv.CSVReader; +import com.opencsv.exceptions.CsvValidationException; + +import freemarker.template.TemplateException; + @Component -public class IPCCGeneratorService extends GenerateDatabase{ +public class KmlGeneratorService { @Autowired - RDBExporter rdbExporter; - - @Autowired - CollectRDBPublisher collectRDBPublisher; + LocalPropertiesService localPropertiesService; @Autowired EarthSurveyService earthSurveyService; - @Autowired - public LocalPropertiesService localPropertiesService; + Logger logger = LoggerFactory.getLogger(KmlGeneratorService.class); - @Autowired - BrowserService browserService; + public static final String KML_RESULTING_TEMP_FILE = EarthConstants.GENERATED_FOLDER + File.separator + "plots.kml"; //$NON-NLS-1$ + public static final String KMZ_FILE_PATH = EarthConstants.GENERATED_FOLDER + File.separator + "gePlugin.kmz"; //$NON-NLS-1$ + public static final String KML_NETWORK_LINK_TEMPLATE = "resources/loadApp.fmt"; //$NON-NLS-1$ + public static final String KML_NETWORK_LINK_STARTER = EarthConstants.GENERATED_FOLDER + "/loadApp.kml"; //$NON-NLS-1$ - @Autowired - private IPCCGenerator ipccGenerator; - - final Logger logger = LoggerFactory.getLogger(IPCCGeneratorService.class); + public static interface PolygonTest{ + Boolean isPolygon(String[] strColumns); + } + + public void generateKmlFile() throws IOException, KmlGenerationException, CsvValidationException{ + checkFilesExist(); + generatePlacemarksKmzFile(); + + } + + private void checkFilesExist() throws KmlGenerationException { + + fixUserDirectory(); + + final String csvFilePath = getLocalProperties().getCsvFile(); + final String balloonPath = getLocalProperties().getBalloonFile(); + final String templatePath = getLocalProperties().getTemplateFile(); + boolean filesExist = true; + String errorMessage = "Error generating the KML file for Google Earth.
"; //$NON-NLS-1$ + File csvFile = null; + File balloon = null; + File template = null; + try { + csvFile = new File(csvFilePath); + balloon = new File(balloonPath); + template = new File(templatePath); + } catch (final Exception e) { + logger.error("One of the definition files is not defined", e); //$NON-NLS-1$ + } + if (csvFile != null && !csvFile.exists()) { + errorMessage += Messages.getString("EarthApp.21") //$NON-NLS-1$ + + csvFile.getAbsolutePath() + "

"; //$NON-NLS-1$ + filesExist = false; + } else if (csvFile == null) { + errorMessage += Messages.getString("EarthApp.23"); //$NON-NLS-1$ + filesExist = false; + } + + if (template != null && !template.exists()) { + errorMessage += Messages.getString("EarthApp.24") //$NON-NLS-1$ + + template.getAbsolutePath() + "

"; //$NON-NLS-1$ + filesExist = false; + } else if (template == null) { + errorMessage += Messages.getString("EarthApp.26"); //$NON-NLS-1$ + filesExist = false; + } + + if (balloon != null && !balloon.exists()) { + errorMessage += Messages.getString("EarthApp.27") + balloon.getAbsolutePath() //$NON-NLS-1$ + + "

"; //$NON-NLS-1$ + filesExist = false; + } else if (balloon == null) { + errorMessage += Messages.getString("EarthApp.29"); //$NON-NLS-1$ + filesExist = false; + } + + errorMessage += Messages.getString("EarthApp.30"); //$NON-NLS-1$ + + if( !filesExist ){ + throw new KmlGenerationException(errorMessage); + } + } + + private LocalPropertiesService getLocalProperties() { + return localPropertiesService; + } + + private void copyContentsToGeneratedFolder(String folderToInclude) throws IOException { + final File sourceDir = new File(folderToInclude); + final File targetDir = new File(EarthConstants.GENERATED_FOLDER + File.separator + sourceDir.getName()); + FileUtils.copyDirectory(sourceDir, targetDir); + } + + private void fixUserDirectory() { + final String csvFilePath = getLocalProperties().getCsvFile(); + final String balloonPath = getLocalProperties().getBalloonFile(); + final String templatePath = getLocalProperties().getTemplateFile(); + final String metadataPath = getLocalProperties().getImdFile(); + + File csvFile = null; + File balloon = null; + File template = null; + File idmFile = null; + try { + csvFile = new File(csvFilePath); + balloon = new File(balloonPath); + template = new File(templatePath); + idmFile = new File(metadataPath); + + final String prefixUserFolder = FolderFinder.getCollectEarthDataFolder() + File.separator; + + if (!csvFile.exists()) { + final File otherFile = new File(prefixUserFolder + getLocalProperties().getCsvFile()); + if (otherFile.exists()) { + getLocalProperties().setValue(EarthProperty.SAMPLE_FILE, otherFile.getAbsolutePath()); + } + } + + if (!balloon.exists()) { + final File otherFile = new File(prefixUserFolder + getLocalProperties().getBalloonFile()); + if (otherFile.exists()) { + getLocalProperties().setValue(EarthProperty.BALLOON_TEMPLATE_KEY, otherFile.getAbsolutePath()); + } + } + + if (!template.exists()) { + final File otherFile = new File(prefixUserFolder + getLocalProperties().getTemplateFile()); + if (otherFile.exists()) { + getLocalProperties().setValue(EarthProperty.KML_TEMPLATE_KEY, otherFile.getAbsolutePath()); + } + } + + if (!idmFile.exists()) { + final File otherFile = new File(prefixUserFolder + getLocalProperties().getImdFile()); + if (otherFile.exists()) { + getLocalProperties().setValue(EarthProperty.METADATA_FILE, otherFile.getAbsolutePath()); + } + } + + } catch (final Exception e) { + logger.error("One of the definition files is not defined", e); //$NON-NLS-1$ + } + + } + + + private int parseInt( String intNumber ){ + int i = 0; + try{ + if( StringUtils.isNoneBlank( intNumber ) ) { + i = Integer.parseInt( intNumber ); + } + }catch(Exception e){ + logger.error( "Error parsing integer number" ); + } + return i; + } + + public KmlGenerator getKmlGenerator() throws KmlGenerationException, CsvValidationException { + KmlGenerator generateKml =null; + + final String crsSystem = getLocalProperties().getCrs(); + final Integer innerPointSide = parseInt(getLocalProperties().getValue(EarthProperty.INNER_SUBPLOT_SIDE)); + final Integer largeCentralPlotSide = parseInt(getLocalProperties().getValue(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)); + final String distanceToBuffers = getLocalProperties().getValue(EarthProperty.DISTANCE_TO_BUFFERS); + SAMPLE_SHAPE plotShape = getLocalProperties().getSampleShape(); + final String hostAddress = ServerController.getHostAddress(getLocalProperties().getHost(), getLocalProperties().getPort()); + + final float distanceBetweenSamplePoints; + final float distanceToPlotBoundaries; + String dBSP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS); + try { + distanceBetweenSamplePoints = Float.parseFloat(dBSP); + } catch (Exception e) { + logger.error("Error parsing distance between sample points , wrong value : " + dBSP,e); + EarthApp.showMessage("Attention: Check earth.properties file. The distance between sample points must be a number! You have set it to : " + dBSP); //$NON-NLS-1$ + return null; + } - public void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws RdbExportException { + String dToPlotB = getLocalProperties().getValue(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES); try { + distanceToPlotBoundaries = Float.parseFloat(dToPlotB); + } catch (Exception e) { + logger.error("Error parsing distance between plots , wrong value : " + dToPlotB,e); + EarthApp.showMessage("Attention: Check earth.properties file. The distance between sample point and border of the plot must be a number ! You have set it to : " + dToPlotB); //$NON-NLS-1$ + return null; + } + final String localPort = getLocalProperties().getLocalPort(); + final String numberOfSamplingPlots = getLocalProperties().getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT); + final String csvFile = getLocalProperties().getCsvFile(); + + int numberOfPoints = 25; + if ((numberOfSamplingPlots != null) && (numberOfSamplingPlots.trim().length() > 0)) { + numberOfPoints = parseInt(numberOfSamplingPlots.trim()); + } + + try{ + // If there is a polygon column then the type of plot shape is assumed to be POLYGON + if( csvContainsKml(csvFile)){ + plotShape = SAMPLE_SHAPE.KML_POLYGON; + }else if( csvContainsWkt(csvFile)){ + plotShape = SAMPLE_SHAPE.WKT_POLYGON; + }else if( csvContainsGeoJson(csvFile)){ + plotShape = SAMPLE_SHAPE.GEOJSON_POLYGON; + } + + if (plotShape.equals(SAMPLE_SHAPE.CIRCLE)) { + generateKml = new CircleKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, distanceBetweenSamplePoints ); + } else if (plotShape.equals(SAMPLE_SHAPE.NFMA)) { + generateKml = new NfmaKmlGenerator(crsSystem, hostAddress, localPort, 150, false); + } else if (plotShape.equals(SAMPLE_SHAPE.NFMA_250)) { + generateKml = new NfmaKmlGenerator(crsSystem, hostAddress, localPort, 250, true); + } else if (plotShape.equals(SAMPLE_SHAPE.NFI_THREE_CIRCLES)) { + + String dBP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS ); + float distanceBetweenPlots; + try { + distanceBetweenPlots = Float.parseFloat(dBP); + } catch (Exception e) { + logger.error("Error parsing distance between plots , wrong value : " + dBP,e); + EarthApp.showMessage("Attention: Check earth.properties file. The distance between plots must be a number! You have set it to : " + dBP); //$NON-NLS-1$ + return null; + } + + generateKml = new NfiThreeCirclesGenerator(crsSystem, hostAddress, localPort, innerPointSide, distanceBetweenSamplePoints, distanceBetweenPlots ); + }else if (plotShape.equals(SAMPLE_SHAPE.NFI_FOUR_CIRCLES)) { - try { - - if ( - (localPropertiesService.isUsingSqliteDB() && !getZippedProjectDB( ExportType.IPCC ).exists()) - || - isRefreshDatabase() - ) { - - // The user clicked on the option to refresh the database, or there is no - // previous copy of the Saiku DB - // Generate the DB file - ipccGenerator.generateRDB( earthSurveyService.getCollectSurvey(), progressListener); - - try { - // Save the DB file in a zipped file to extends GenerateDatabase keep for the next usages - replaceZippedProjectDB( ExportType.IPCC ); - } catch (Exception e) { - logger.error("Error while refreshing the Zipped content of the project IPCC DB", e); - } - - } else if (getZippedProjectDB(ExportType.IPCC).exists()) { - // If the zipped version of the project exists ( and the user clicked on the - // option to not refresh it) then restore this last version of the data - if (localPropertiesService.isUsingSqliteDB()) { - restoreZippedProjectDB(ExportType.IPCC); - } + String dBP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS ); + float distanceBetweenPlots; + try { + distanceBetweenPlots = Float.parseFloat(dBP); + } catch (Exception e) { + logger.error(String.format("Error parsing distance between plots , wrong value : %s", dBP) ,e); + EarthApp.showMessage("Attention: Check earth.properties file. The distance between plots must be a number! You have set it to : " + dBP); //$NON-NLS-1$ + return null; } - - ipccGenerator.produceOutputs( earthSurveyService.getCollectSurvey(), progressListener ); - } catch (final IPCCGeneratorException e) { - logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ - } + generateKml = new NfiFourCirclesGenerator(crsSystem, hostAddress, localPort, innerPointSide, distanceBetweenSamplePoints, distanceBetweenPlots ); + }else if (plotShape.equals(SAMPLE_SHAPE.HEXAGON)) { + generateKml = new HexagonKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, distanceBetweenSamplePoints ); + } else if (plotShape.equals(SAMPLE_SHAPE.SQUARE_CIRCLE)) { + generateKml = new SquareWithCirclesKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, + distanceBetweenSamplePoints, distanceToPlotBoundaries); + } else if (plotShape.equals(SAMPLE_SHAPE.KML_POLYGON)) { + generateKml = new PolygonKmlGenerator(crsSystem, hostAddress, localPort); + } else if (plotShape.equals(SAMPLE_SHAPE.GEOJSON_POLYGON)) { + generateKml = new PolygonGeojsonGenerator(crsSystem, hostAddress, localPort); + }else if (plotShape.equals(SAMPLE_SHAPE.WKT_POLYGON)) { + generateKml = new PolygonWktGenerator(crsSystem, hostAddress, localPort); + }else { + generateKml = new SquareKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, + distanceBetweenSamplePoints, distanceToPlotBoundaries, largeCentralPlotSide, distanceToBuffers); + } + }catch(IOException e){ + logger.error("Error generating KML", e ); + } - } catch (final CollectRdbException e) { - logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ + if( generateKml == null ) { + throw new KmlGenerationException("Error getting the KML generator for parameters " + plotShape.name() ); } + + return generateKml; } + private boolean csvContains(String csvFile, PolygonTest test ) throws IOException, CsvValidationException { + try( CSVReader csvReader = CsvReaderUtils.getCsvReader(csvFile) ){ + csvReader.readNext(); // Ignore it might be the column headers - public static boolean surveyContains(String nodeName, CollectSurvey survey) { - NodeDefinition nodeDefForNAme = survey.getSchema().findNodeDefinition( nodeDef -> nodeDef.getName().equals(nodeName) ); - return nodeDefForNAme != null; + String[] secondLine = csvReader.readNext(); + if( secondLine != null && !CsvReaderUtils.onlyEmptyCells(secondLine) ){ + return test.isPolygon( secondLine ); + } + + return false; + } } + private boolean csvContainsGeoJson(String csvFile) throws IOException, CsvValidationException { + return + csvContains( + csvFile, + csvColumns -> new PolygonGeojsonGenerator(null, null, null ).isGeoJsonPolygonColumnFound(csvColumns) != null + ); + } + + private boolean csvContainsWkt(String csvFile) throws IOException, CsvValidationException { + return csvContains( + csvFile, + csvColumns -> new PolygonWktGenerator(null, null, null ).isWktPolygonColumnFound(csvColumns) != null + ); + } + + private boolean csvContainsKml(String csvFile) throws IOException, CsvValidationException { + return csvContains( + csvFile, + csvColumns -> new PolygonKmlGenerator(null, null, null ).isKmlPolygonColumnFound(csvColumns) != null + ); + } + + private void generateKml() throws KmlGenerationException, IOException, CsvValidationException { + + KmlGenerator kmlGenerator = null; + kmlGenerator = getKmlGenerator(); + + if ( kmlGenerator == null ){ + throw new KmlGenerationException("Error while generating KML"); + } + + final String csvFile = getLocalProperties().getCsvFile(); + String balloon = getLocalProperties().getBalloonFile(); + final String template = getLocalProperties().getTemplateFile(); + + // In case the user sets up the OPEN_BALLOON_IN_FIREFOX flag to + // true. Meaning that a small ballon opens in the placemark which in + // its turn + // opens a firefox browser with the real form + final Boolean openBalloonInFirefox = Boolean.valueOf(getLocalProperties().getValue(EarthProperty.OPEN_BALLOON_IN_BROWSER)); + if (Boolean.TRUE.equals( openBalloonInFirefox) ) { + String alternativeBalloon = getLocalProperties().getValue(EarthProperty.ALTERNATIVE_BALLOON_FOR_BROWSER); + if( !StringUtils.isBlank( alternativeBalloon ) ){ + balloon = alternativeBalloon; + } + } + + // Using all of the files that compose the final KML it is generated and stores in KML_RESULTING_TEMP_FILE + kmlGenerator.generateKmlFile(KML_RESULTING_TEMP_FILE, csvFile, balloon, template, earthSurveyService.getCollectSurvey()); + updateFilesUsedChecksum(); - @Override - public LocalPropertiesService getLocalPropertiesService() { - return localPropertiesService; } - @Override - public EarthSurveyService getEarthSurveyService() { - return earthSurveyService; + private void updateFilesUsedChecksum() throws IOException { + final String csvFile = getLocalProperties().getCsvFile(); + final String balloon = getLocalProperties().getBalloonFile(); + final String template = getLocalProperties().getTemplateFile(); + + getLocalProperties().saveBalloonFileChecksum(CollectEarthUtils.getMd5FromFile(balloon)); + getLocalProperties().saveCsvFileCehcksum(CollectEarthUtils.getMd5FromFile(csvFile)); + getLocalProperties().saveTemplateFileChecksum(CollectEarthUtils.getMd5FromFile(template)); } - @Override - public RDBExporter getRdbExporter() { - return rdbExporter; + public void generateLoaderKmlFile() throws IOException, TemplateException { + + getLocalProperties().saveGeneratedOn(System.currentTimeMillis() + ""); //$NON-NLS-1$ + + final Map data = new HashMap<>(); + data.put("host", ServerController.getHostAddress(getLocalProperties().getHost(), getLocalProperties().getLocalPort())); //$NON-NLS-1$ + data.put("kmlGeneratedOn", getLocalProperties().getGeneratedOn()); //$NON-NLS-1$ + data.put("surveyName", getLocalProperties().getValue(EarthProperty.SURVEY_NAME)); //$NON-NLS-1$ + data.put("plotFileName", KmlGenerator.getCsvFileName(getLocalProperties().getValue(EarthProperty.SAMPLE_FILE))); //$NON-NLS-1$ + + FreemarkerTemplateUtils.applyTemplate(new File(KML_NETWORK_LINK_TEMPLATE), new File(KML_NETWORK_LINK_STARTER), data); + } + + private boolean isKmlUpToDate() throws IOException { + + final String csvFile = getLocalProperties().getCsvFile(); + final String balloon = getLocalProperties().getBalloonFile(); + final String template = getLocalProperties().getTemplateFile(); + + boolean upToDate = true; + if (!getLocalProperties().getBalloonFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(balloon)) + || !getLocalProperties().getTemplateFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(template)) + || !getLocalProperties().getCsvFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(csvFile))) { + upToDate = false; + } + + final File kmzFile = new File(KmlGeneratorService.KMZ_FILE_PATH); + if (!kmzFile.exists()) { + upToDate = false; + } + + return upToDate; + } -} \ No newline at end of file + public void generatePlacemarksKmzFile() throws IOException, KmlGenerationException, CsvValidationException { + generatePlacemarksKmzFile(false); + } + + public void generatePlacemarksKmzFile(boolean forceRegeneration ) throws IOException, KmlGenerationException, CsvValidationException { + + logger.info("START - Generate KMZ file"); //$NON-NLS-1$ + + if (forceRegeneration || !isKmlUpToDate()) { + + generateKml(); + + final KmzGenerator kmzGenerator = new KmzGenerator(); + + final String balloon = getLocalProperties().getBalloonFile(); + final File balloonFile = new File(balloon); + final String folderToInclude = balloonFile.getParent() + File.separator + EarthConstants.FOLDER_COPIED_TO_KMZ; + + kmzGenerator.generateKmzFile(KMZ_FILE_PATH, KML_RESULTING_TEMP_FILE, folderToInclude); + logger.info("KMZ File generated : {}", KMZ_FILE_PATH); //$NON-NLS-1$ + + copyContentsToGeneratedFolder(folderToInclude); + + final File kmlFile = new File(KML_RESULTING_TEMP_FILE); + if (kmlFile.exists()) { + final boolean deleted = kmlFile.delete(); + if (deleted) { + logger.info("KML File deleted : {}", KML_RESULTING_TEMP_FILE); //$NON-NLS-1$ + } else { + throw new IOException("The KML file could not be deleted at " + kmlFile.getPath()); //$NON-NLS-1$ + } + } + + } + logger.info("END - Generate KMZ file"); //$NON-NLS-1$ + } +} From dd2e7967598c52c6d23ee646c9ed49042a8b9b36 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:26 +0100 Subject: [PATCH 0165/1620] New translations KmlGeneratorService.java (English) --- .../earth/app/view/Messages_en.properties | 482 +++++++++++++++--- 1 file changed, 414 insertions(+), 68 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index c1b9c5db00..884dd929bc 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,105 +1,451 @@ package org.openforis.collect.earth.app.service; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.ipcc.IPCCGenerator; -import org.openforis.collect.earth.ipcc.IPCCGeneratorException; -import org.openforis.collect.earth.ipcc.RdbExportException; -import org.openforis.collect.model.CollectSurvey; -import org.openforis.collect.relational.CollectRDBPublisher; -import org.openforis.collect.relational.CollectRdbException; -import org.openforis.idm.metamodel.NodeDefinition; +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.app.view.Messages; +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.collect.earth.sampler.processor.CircleKmlGenerator; +import org.openforis.collect.earth.sampler.processor.HexagonKmlGenerator; +import org.openforis.collect.earth.sampler.processor.KmlGenerator; +import org.openforis.collect.earth.sampler.processor.KmzGenerator; +import org.openforis.collect.earth.sampler.processor.NfiFourCirclesGenerator; +import org.openforis.collect.earth.sampler.processor.NfiThreeCirclesGenerator; +import org.openforis.collect.earth.sampler.processor.NfmaKmlGenerator; +import org.openforis.collect.earth.sampler.processor.PolygonGeojsonGenerator; +import org.openforis.collect.earth.sampler.processor.PolygonKmlGenerator; +import org.openforis.collect.earth.sampler.processor.PolygonWktGenerator; +import org.openforis.collect.earth.sampler.processor.SquareKmlGenerator; +import org.openforis.collect.earth.sampler.processor.SquareWithCirclesKmlGenerator; +import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; +import org.openforis.collect.earth.sampler.utils.KmlGenerationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import com.opencsv.CSVReader; +import com.opencsv.exceptions.CsvValidationException; + +import freemarker.template.TemplateException; + @Component -public class IPCCGeneratorService extends GenerateDatabase{ +public class KmlGeneratorService { @Autowired - RDBExporter rdbExporter; - - @Autowired - CollectRDBPublisher collectRDBPublisher; + LocalPropertiesService localPropertiesService; @Autowired EarthSurveyService earthSurveyService; - @Autowired - public LocalPropertiesService localPropertiesService; + Logger logger = LoggerFactory.getLogger(KmlGeneratorService.class); - @Autowired - BrowserService browserService; + public static final String KML_RESULTING_TEMP_FILE = EarthConstants.GENERATED_FOLDER + File.separator + "plots.kml"; //$NON-NLS-1$ + public static final String KMZ_FILE_PATH = EarthConstants.GENERATED_FOLDER + File.separator + "gePlugin.kmz"; //$NON-NLS-1$ + public static final String KML_NETWORK_LINK_TEMPLATE = "resources/loadApp.fmt"; //$NON-NLS-1$ + public static final String KML_NETWORK_LINK_STARTER = EarthConstants.GENERATED_FOLDER + "/loadApp.kml"; //$NON-NLS-1$ - @Autowired - private IPCCGenerator ipccGenerator; - - final Logger logger = LoggerFactory.getLogger(IPCCGeneratorService.class); + public static interface PolygonTest{ + Boolean isPolygon(String[] strColumns); + } + + public void generateKmlFile() throws IOException, KmlGenerationException, CsvValidationException{ + checkFilesExist(); + generatePlacemarksKmzFile(); + + } + + private void checkFilesExist() throws KmlGenerationException { + + fixUserDirectory(); + + final String csvFilePath = getLocalProperties().getCsvFile(); + final String balloonPath = getLocalProperties().getBalloonFile(); + final String templatePath = getLocalProperties().getTemplateFile(); + boolean filesExist = true; + String errorMessage = "Error generating the KML file for Google Earth.
"; //$NON-NLS-1$ + File csvFile = null; + File balloon = null; + File template = null; + try { + csvFile = new File(csvFilePath); + balloon = new File(balloonPath); + template = new File(templatePath); + } catch (final Exception e) { + logger.error("One of the definition files is not defined", e); //$NON-NLS-1$ + } + if (csvFile != null && !csvFile.exists()) { + errorMessage += Messages.getString("EarthApp.21") //$NON-NLS-1$ + + csvFile.getAbsolutePath() + "

"; //$NON-NLS-1$ + filesExist = false; + } else if (csvFile == null) { + errorMessage += Messages.getString("EarthApp.23"); //$NON-NLS-1$ + filesExist = false; + } + + if (template != null && !template.exists()) { + errorMessage += Messages.getString("EarthApp.24") //$NON-NLS-1$ + + template.getAbsolutePath() + "

"; //$NON-NLS-1$ + filesExist = false; + } else if (template == null) { + errorMessage += Messages.getString("EarthApp.26"); //$NON-NLS-1$ + filesExist = false; + } + + if (balloon != null && !balloon.exists()) { + errorMessage += Messages.getString("EarthApp.27") + balloon.getAbsolutePath() //$NON-NLS-1$ + + "

"; //$NON-NLS-1$ + filesExist = false; + } else if (balloon == null) { + errorMessage += Messages.getString("EarthApp.29"); //$NON-NLS-1$ + filesExist = false; + } + + errorMessage += Messages.getString("EarthApp.30"); //$NON-NLS-1$ + + if( !filesExist ){ + throw new KmlGenerationException(errorMessage); + } + } + + private LocalPropertiesService getLocalProperties() { + return localPropertiesService; + } + + private void copyContentsToGeneratedFolder(String folderToInclude) throws IOException { + final File sourceDir = new File(folderToInclude); + final File targetDir = new File(EarthConstants.GENERATED_FOLDER + File.separator + sourceDir.getName()); + FileUtils.copyDirectory(sourceDir, targetDir); + } + + private void fixUserDirectory() { + final String csvFilePath = getLocalProperties().getCsvFile(); + final String balloonPath = getLocalProperties().getBalloonFile(); + final String templatePath = getLocalProperties().getTemplateFile(); + final String metadataPath = getLocalProperties().getImdFile(); + + File csvFile = null; + File balloon = null; + File template = null; + File idmFile = null; + try { + csvFile = new File(csvFilePath); + balloon = new File(balloonPath); + template = new File(templatePath); + idmFile = new File(metadataPath); + + final String prefixUserFolder = FolderFinder.getCollectEarthDataFolder() + File.separator; + + if (!csvFile.exists()) { + final File otherFile = new File(prefixUserFolder + getLocalProperties().getCsvFile()); + if (otherFile.exists()) { + getLocalProperties().setValue(EarthProperty.SAMPLE_FILE, otherFile.getAbsolutePath()); + } + } + + if (!balloon.exists()) { + final File otherFile = new File(prefixUserFolder + getLocalProperties().getBalloonFile()); + if (otherFile.exists()) { + getLocalProperties().setValue(EarthProperty.BALLOON_TEMPLATE_KEY, otherFile.getAbsolutePath()); + } + } + + if (!template.exists()) { + final File otherFile = new File(prefixUserFolder + getLocalProperties().getTemplateFile()); + if (otherFile.exists()) { + getLocalProperties().setValue(EarthProperty.KML_TEMPLATE_KEY, otherFile.getAbsolutePath()); + } + } + + if (!idmFile.exists()) { + final File otherFile = new File(prefixUserFolder + getLocalProperties().getImdFile()); + if (otherFile.exists()) { + getLocalProperties().setValue(EarthProperty.METADATA_FILE, otherFile.getAbsolutePath()); + } + } + + } catch (final Exception e) { + logger.error("One of the definition files is not defined", e); //$NON-NLS-1$ + } + + } + + + private int parseInt( String intNumber ){ + int i = 0; + try{ + if( StringUtils.isNoneBlank( intNumber ) ) { + i = Integer.parseInt( intNumber ); + } + }catch(Exception e){ + logger.error( "Error parsing integer number" ); + } + return i; + } + + public KmlGenerator getKmlGenerator() throws KmlGenerationException, CsvValidationException { + KmlGenerator generateKml =null; + + final String crsSystem = getLocalProperties().getCrs(); + final Integer innerPointSide = parseInt(getLocalProperties().getValue(EarthProperty.INNER_SUBPLOT_SIDE)); + final Integer largeCentralPlotSide = parseInt(getLocalProperties().getValue(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)); + final String distanceToBuffers = getLocalProperties().getValue(EarthProperty.DISTANCE_TO_BUFFERS); + SAMPLE_SHAPE plotShape = getLocalProperties().getSampleShape(); + final String hostAddress = ServerController.getHostAddress(getLocalProperties().getHost(), getLocalProperties().getPort()); + + final float distanceBetweenSamplePoints; + final float distanceToPlotBoundaries; + String dBSP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS); + try { + distanceBetweenSamplePoints = Float.parseFloat(dBSP); + } catch (Exception e) { + logger.error("Error parsing distance between sample points , wrong value : " + dBSP,e); + EarthApp.showMessage("Attention: Check earth.properties file. The distance between sample points must be a number! You have set it to : " + dBSP); //$NON-NLS-1$ + return null; + } - public void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws RdbExportException { + String dToPlotB = getLocalProperties().getValue(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES); try { + distanceToPlotBoundaries = Float.parseFloat(dToPlotB); + } catch (Exception e) { + logger.error("Error parsing distance between plots , wrong value : " + dToPlotB,e); + EarthApp.showMessage("Attention: Check earth.properties file. The distance between sample point and border of the plot must be a number ! You have set it to : " + dToPlotB); //$NON-NLS-1$ + return null; + } + final String localPort = getLocalProperties().getLocalPort(); + final String numberOfSamplingPlots = getLocalProperties().getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT); + final String csvFile = getLocalProperties().getCsvFile(); + + int numberOfPoints = 25; + if ((numberOfSamplingPlots != null) && (numberOfSamplingPlots.trim().length() > 0)) { + numberOfPoints = parseInt(numberOfSamplingPlots.trim()); + } + + try{ + // If there is a polygon column then the type of plot shape is assumed to be POLYGON + if( csvContainsKml(csvFile)){ + plotShape = SAMPLE_SHAPE.KML_POLYGON; + }else if( csvContainsWkt(csvFile)){ + plotShape = SAMPLE_SHAPE.WKT_POLYGON; + }else if( csvContainsGeoJson(csvFile)){ + plotShape = SAMPLE_SHAPE.GEOJSON_POLYGON; + } + + if (plotShape.equals(SAMPLE_SHAPE.CIRCLE)) { + generateKml = new CircleKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, distanceBetweenSamplePoints ); + } else if (plotShape.equals(SAMPLE_SHAPE.NFMA)) { + generateKml = new NfmaKmlGenerator(crsSystem, hostAddress, localPort, 150, false); + } else if (plotShape.equals(SAMPLE_SHAPE.NFMA_250)) { + generateKml = new NfmaKmlGenerator(crsSystem, hostAddress, localPort, 250, true); + } else if (plotShape.equals(SAMPLE_SHAPE.NFI_THREE_CIRCLES)) { + + String dBP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS ); + float distanceBetweenPlots; + try { + distanceBetweenPlots = Float.parseFloat(dBP); + } catch (Exception e) { + logger.error("Error parsing distance between plots , wrong value : " + dBP,e); + EarthApp.showMessage("Attention: Check earth.properties file. The distance between plots must be a number! You have set it to : " + dBP); //$NON-NLS-1$ + return null; + } + + generateKml = new NfiThreeCirclesGenerator(crsSystem, hostAddress, localPort, innerPointSide, distanceBetweenSamplePoints, distanceBetweenPlots ); + }else if (plotShape.equals(SAMPLE_SHAPE.NFI_FOUR_CIRCLES)) { - try { - - if ( - (localPropertiesService.isUsingSqliteDB() && !getZippedProjectDB( ExportType.IPCC ).exists()) - || - isRefreshDatabase() - ) { - - // The user clicked on the option to refresh the database, or there is no - // previous copy of the Saiku DB - // Generate the DB file - ipccGenerator.generateRDB( earthSurveyService.getCollectSurvey(), progressListener); - - try { - // Save the DB file in a zipped file to extends GenerateDatabase keep for the next usages - replaceZippedProjectDB( ExportType.IPCC ); - } catch (Exception e) { - logger.error("Error while refreshing the Zipped content of the project IPCC DB", e); - } - - } else if (getZippedProjectDB(ExportType.IPCC).exists()) { - // If the zipped version of the project exists ( and the user clicked on the - // option to not refresh it) then restore this last version of the data - if (localPropertiesService.isUsingSqliteDB()) { - restoreZippedProjectDB(ExportType.IPCC); - } + String dBP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS ); + float distanceBetweenPlots; + try { + distanceBetweenPlots = Float.parseFloat(dBP); + } catch (Exception e) { + logger.error(String.format("Error parsing distance between plots , wrong value : %s", dBP) ,e); + EarthApp.showMessage("Attention: Check earth.properties file. The distance between plots must be a number! You have set it to : " + dBP); //$NON-NLS-1$ + return null; } - - ipccGenerator.produceOutputs( earthSurveyService.getCollectSurvey(), progressListener ); - } catch (final IPCCGeneratorException e) { - logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ - } + generateKml = new NfiFourCirclesGenerator(crsSystem, hostAddress, localPort, innerPointSide, distanceBetweenSamplePoints, distanceBetweenPlots ); + }else if (plotShape.equals(SAMPLE_SHAPE.HEXAGON)) { + generateKml = new HexagonKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, distanceBetweenSamplePoints ); + } else if (plotShape.equals(SAMPLE_SHAPE.SQUARE_CIRCLE)) { + generateKml = new SquareWithCirclesKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, + distanceBetweenSamplePoints, distanceToPlotBoundaries); + } else if (plotShape.equals(SAMPLE_SHAPE.KML_POLYGON)) { + generateKml = new PolygonKmlGenerator(crsSystem, hostAddress, localPort); + } else if (plotShape.equals(SAMPLE_SHAPE.GEOJSON_POLYGON)) { + generateKml = new PolygonGeojsonGenerator(crsSystem, hostAddress, localPort); + }else if (plotShape.equals(SAMPLE_SHAPE.WKT_POLYGON)) { + generateKml = new PolygonWktGenerator(crsSystem, hostAddress, localPort); + }else { + generateKml = new SquareKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, + distanceBetweenSamplePoints, distanceToPlotBoundaries, largeCentralPlotSide, distanceToBuffers); + } + }catch(IOException e){ + logger.error("Error generating KML", e ); + } - } catch (final CollectRdbException e) { - logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ + if( generateKml == null ) { + throw new KmlGenerationException("Error getting the KML generator for parameters " + plotShape.name() ); } + + return generateKml; } + private boolean csvContains(String csvFile, PolygonTest test ) throws IOException, CsvValidationException { + try( CSVReader csvReader = CsvReaderUtils.getCsvReader(csvFile) ){ + csvReader.readNext(); // Ignore it might be the column headers - public static boolean surveyContains(String nodeName, CollectSurvey survey) { - NodeDefinition nodeDefForNAme = survey.getSchema().findNodeDefinition( nodeDef -> nodeDef.getName().equals(nodeName) ); - return nodeDefForNAme != null; + String[] secondLine = csvReader.readNext(); + if( secondLine != null && !CsvReaderUtils.onlyEmptyCells(secondLine) ){ + return test.isPolygon( secondLine ); + } + + return false; + } } + private boolean csvContainsGeoJson(String csvFile) throws IOException, CsvValidationException { + return + csvContains( + csvFile, + csvColumns -> new PolygonGeojsonGenerator(null, null, null ).isGeoJsonPolygonColumnFound(csvColumns) != null + ); + } + + private boolean csvContainsWkt(String csvFile) throws IOException, CsvValidationException { + return csvContains( + csvFile, + csvColumns -> new PolygonWktGenerator(null, null, null ).isWktPolygonColumnFound(csvColumns) != null + ); + } + + private boolean csvContainsKml(String csvFile) throws IOException, CsvValidationException { + return csvContains( + csvFile, + csvColumns -> new PolygonKmlGenerator(null, null, null ).isKmlPolygonColumnFound(csvColumns) != null + ); + } + + private void generateKml() throws KmlGenerationException, IOException, CsvValidationException { + + KmlGenerator kmlGenerator = null; + kmlGenerator = getKmlGenerator(); + + if ( kmlGenerator == null ){ + throw new KmlGenerationException("Error while generating KML"); + } + + final String csvFile = getLocalProperties().getCsvFile(); + String balloon = getLocalProperties().getBalloonFile(); + final String template = getLocalProperties().getTemplateFile(); + + // In case the user sets up the OPEN_BALLOON_IN_FIREFOX flag to + // true. Meaning that a small ballon opens in the placemark which in + // its turn + // opens a firefox browser with the real form + final Boolean openBalloonInFirefox = Boolean.valueOf(getLocalProperties().getValue(EarthProperty.OPEN_BALLOON_IN_BROWSER)); + if (Boolean.TRUE.equals( openBalloonInFirefox) ) { + String alternativeBalloon = getLocalProperties().getValue(EarthProperty.ALTERNATIVE_BALLOON_FOR_BROWSER); + if( !StringUtils.isBlank( alternativeBalloon ) ){ + balloon = alternativeBalloon; + } + } + + // Using all of the files that compose the final KML it is generated and stores in KML_RESULTING_TEMP_FILE + kmlGenerator.generateKmlFile(KML_RESULTING_TEMP_FILE, csvFile, balloon, template, earthSurveyService.getCollectSurvey()); + updateFilesUsedChecksum(); - @Override - public LocalPropertiesService getLocalPropertiesService() { - return localPropertiesService; } - @Override - public EarthSurveyService getEarthSurveyService() { - return earthSurveyService; + private void updateFilesUsedChecksum() throws IOException { + final String csvFile = getLocalProperties().getCsvFile(); + final String balloon = getLocalProperties().getBalloonFile(); + final String template = getLocalProperties().getTemplateFile(); + + getLocalProperties().saveBalloonFileChecksum(CollectEarthUtils.getMd5FromFile(balloon)); + getLocalProperties().saveCsvFileCehcksum(CollectEarthUtils.getMd5FromFile(csvFile)); + getLocalProperties().saveTemplateFileChecksum(CollectEarthUtils.getMd5FromFile(template)); } - @Override - public RDBExporter getRdbExporter() { - return rdbExporter; + public void generateLoaderKmlFile() throws IOException, TemplateException { + + getLocalProperties().saveGeneratedOn(System.currentTimeMillis() + ""); //$NON-NLS-1$ + + final Map data = new HashMap<>(); + data.put("host", ServerController.getHostAddress(getLocalProperties().getHost(), getLocalProperties().getLocalPort())); //$NON-NLS-1$ + data.put("kmlGeneratedOn", getLocalProperties().getGeneratedOn()); //$NON-NLS-1$ + data.put("surveyName", getLocalProperties().getValue(EarthProperty.SURVEY_NAME)); //$NON-NLS-1$ + data.put("plotFileName", KmlGenerator.getCsvFileName(getLocalProperties().getValue(EarthProperty.SAMPLE_FILE))); //$NON-NLS-1$ + + FreemarkerTemplateUtils.applyTemplate(new File(KML_NETWORK_LINK_TEMPLATE), new File(KML_NETWORK_LINK_STARTER), data); + } + + private boolean isKmlUpToDate() throws IOException { + + final String csvFile = getLocalProperties().getCsvFile(); + final String balloon = getLocalProperties().getBalloonFile(); + final String template = getLocalProperties().getTemplateFile(); + + boolean upToDate = true; + if (!getLocalProperties().getBalloonFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(balloon)) + || !getLocalProperties().getTemplateFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(template)) + || !getLocalProperties().getCsvFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(csvFile))) { + upToDate = false; + } + + final File kmzFile = new File(KmlGeneratorService.KMZ_FILE_PATH); + if (!kmzFile.exists()) { + upToDate = false; + } + + return upToDate; + } -} \ No newline at end of file + public void generatePlacemarksKmzFile() throws IOException, KmlGenerationException, CsvValidationException { + generatePlacemarksKmzFile(false); + } + + public void generatePlacemarksKmzFile(boolean forceRegeneration ) throws IOException, KmlGenerationException, CsvValidationException { + + logger.info("START - Generate KMZ file"); //$NON-NLS-1$ + + if (forceRegeneration || !isKmlUpToDate()) { + + generateKml(); + + final KmzGenerator kmzGenerator = new KmzGenerator(); + + final String balloon = getLocalProperties().getBalloonFile(); + final File balloonFile = new File(balloon); + final String folderToInclude = balloonFile.getParent() + File.separator + EarthConstants.FOLDER_COPIED_TO_KMZ; + + kmzGenerator.generateKmzFile(KMZ_FILE_PATH, KML_RESULTING_TEMP_FILE, folderToInclude); + logger.info("KMZ File generated : {}", KMZ_FILE_PATH); //$NON-NLS-1$ + + copyContentsToGeneratedFolder(folderToInclude); + + final File kmlFile = new File(KML_RESULTING_TEMP_FILE); + if (kmlFile.exists()) { + final boolean deleted = kmlFile.delete(); + if (deleted) { + logger.info("KML File deleted : {}", KML_RESULTING_TEMP_FILE); //$NON-NLS-1$ + } else { + throw new IOException("The KML file could not be deleted at " + kmlFile.getPath()); //$NON-NLS-1$ + } + } + + } + logger.info("END - Generate KMZ file"); //$NON-NLS-1$ + } +} From 69df2530a32136c092c5d83f1586b377e90c5b02 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:27 +0100 Subject: [PATCH 0166/1620] New translations KmlImportService.java (French) --- .../earth/app/view/Messages_fr.properties | 578 ++++++------------ 1 file changed, 175 insertions(+), 403 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 884dd929bc..9fb3d5284e 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,451 +1,223 @@ package org.openforis.collect.earth.app.service; +import java.io.BufferedInputStream; +import java.io.BufferedWriter; import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FileReader; import java.io.IOException; +import java.io.OutputStreamWriter; +import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.xml.XMLConstants; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.desktop.ServerController; import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.app.view.DataFormat; +import org.openforis.collect.earth.app.view.JFileChooserExistsAware; import org.openforis.collect.earth.app.view.Messages; -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.collect.earth.sampler.processor.CircleKmlGenerator; -import org.openforis.collect.earth.sampler.processor.HexagonKmlGenerator; -import org.openforis.collect.earth.sampler.processor.KmlGenerator; -import org.openforis.collect.earth.sampler.processor.KmzGenerator; -import org.openforis.collect.earth.sampler.processor.NfiFourCirclesGenerator; -import org.openforis.collect.earth.sampler.processor.NfiThreeCirclesGenerator; -import org.openforis.collect.earth.sampler.processor.NfmaKmlGenerator; -import org.openforis.collect.earth.sampler.processor.PolygonGeojsonGenerator; -import org.openforis.collect.earth.sampler.processor.PolygonKmlGenerator; -import org.openforis.collect.earth.sampler.processor.PolygonWktGenerator; -import org.openforis.collect.earth.sampler.processor.SquareKmlGenerator; -import org.openforis.collect.earth.sampler.processor.SquareWithCirclesKmlGenerator; -import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; -import org.openforis.collect.earth.sampler.utils.KmlGenerationException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; +import org.openforis.collect.io.metadata.collectearth.CollectEarthProjectFileCreator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; - -import com.opencsv.CSVReader; -import com.opencsv.exceptions.CsvValidationException; - -import freemarker.template.TemplateException; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; @Component -public class KmlGeneratorService { +public class KmlImportService { + + Map namesAndTimes = new HashMap<>(); @Autowired LocalPropertiesService localPropertiesService; @Autowired - EarthSurveyService earthSurveyService; - - Logger logger = LoggerFactory.getLogger(KmlGeneratorService.class); - - public static final String KML_RESULTING_TEMP_FILE = EarthConstants.GENERATED_FOLDER + File.separator + "plots.kml"; //$NON-NLS-1$ - public static final String KMZ_FILE_PATH = EarthConstants.GENERATED_FOLDER + File.separator + "gePlugin.kmz"; //$NON-NLS-1$ - public static final String KML_NETWORK_LINK_TEMPLATE = "resources/loadApp.fmt"; //$NON-NLS-1$ - public static final String KML_NETWORK_LINK_STARTER = EarthConstants.GENERATED_FOLDER + "/loadApp.kml"; //$NON-NLS-1$ - - public static interface PolygonTest{ - Boolean isPolygon(String[] strColumns); - } - - public void generateKmlFile() throws IOException, KmlGenerationException, CsvValidationException{ - checkFilesExist(); - generatePlacemarksKmzFile(); - - } - - private void checkFilesExist() throws KmlGenerationException { - - fixUserDirectory(); - - final String csvFilePath = getLocalProperties().getCsvFile(); - final String balloonPath = getLocalProperties().getBalloonFile(); - final String templatePath = getLocalProperties().getTemplateFile(); - boolean filesExist = true; - String errorMessage = "Error generating the KML file for Google Earth.
"; //$NON-NLS-1$ - File csvFile = null; - File balloon = null; - File template = null; - try { - csvFile = new File(csvFilePath); - balloon = new File(balloonPath); - template = new File(templatePath); - } catch (final Exception e) { - logger.error("One of the definition files is not defined", e); //$NON-NLS-1$ - } - if (csvFile != null && !csvFile.exists()) { - errorMessage += Messages.getString("EarthApp.21") //$NON-NLS-1$ - + csvFile.getAbsolutePath() + "

"; //$NON-NLS-1$ - filesExist = false; - } else if (csvFile == null) { - errorMessage += Messages.getString("EarthApp.23"); //$NON-NLS-1$ - filesExist = false; - } - - if (template != null && !template.exists()) { - errorMessage += Messages.getString("EarthApp.24") //$NON-NLS-1$ - + template.getAbsolutePath() + "

"; //$NON-NLS-1$ - filesExist = false; - } else if (template == null) { - errorMessage += Messages.getString("EarthApp.26"); //$NON-NLS-1$ - filesExist = false; - } - - if (balloon != null && !balloon.exists()) { - errorMessage += Messages.getString("EarthApp.27") + balloon.getAbsolutePath() //$NON-NLS-1$ - + "

"; //$NON-NLS-1$ - filesExist = false; - } else if (balloon == null) { - errorMessage += Messages.getString("EarthApp.29"); //$NON-NLS-1$ - filesExist = false; - } - - errorMessage += Messages.getString("EarthApp.30"); //$NON-NLS-1$ - - if( !filesExist ){ - throw new KmlGenerationException(errorMessage); - } - } - - private LocalPropertiesService getLocalProperties() { - return localPropertiesService; - } - - private void copyContentsToGeneratedFolder(String folderToInclude) throws IOException { - final File sourceDir = new File(folderToInclude); - final File targetDir = new File(EarthConstants.GENERATED_FOLDER + File.separator + sourceDir.getName()); - FileUtils.copyDirectory(sourceDir, targetDir); - } - - private void fixUserDirectory() { - final String csvFilePath = getLocalProperties().getCsvFile(); - final String balloonPath = getLocalProperties().getBalloonFile(); - final String templatePath = getLocalProperties().getTemplateFile(); - final String metadataPath = getLocalProperties().getImdFile(); - - File csvFile = null; - File balloon = null; - File template = null; - File idmFile = null; - try { - csvFile = new File(csvFilePath); - balloon = new File(balloonPath); - template = new File(templatePath); - idmFile = new File(metadataPath); - - final String prefixUserFolder = FolderFinder.getCollectEarthDataFolder() + File.separator; - - if (!csvFile.exists()) { - final File otherFile = new File(prefixUserFolder + getLocalProperties().getCsvFile()); - if (otherFile.exists()) { - getLocalProperties().setValue(EarthProperty.SAMPLE_FILE, otherFile.getAbsolutePath()); - } - } - - if (!balloon.exists()) { - final File otherFile = new File(prefixUserFolder + getLocalProperties().getBalloonFile()); - if (otherFile.exists()) { - getLocalProperties().setValue(EarthProperty.BALLOON_TEMPLATE_KEY, otherFile.getAbsolutePath()); - } - } - - if (!template.exists()) { - final File otherFile = new File(prefixUserFolder + getLocalProperties().getTemplateFile()); - if (otherFile.exists()) { - getLocalProperties().setValue(EarthProperty.KML_TEMPLATE_KEY, otherFile.getAbsolutePath()); - } - } - - if (!idmFile.exists()) { - final File otherFile = new File(prefixUserFolder + getLocalProperties().getImdFile()); - if (otherFile.exists()) { - getLocalProperties().setValue(EarthProperty.METADATA_FILE, otherFile.getAbsolutePath()); - } - } - - } catch (final Exception e) { - logger.error("One of the definition files is not defined", e); //$NON-NLS-1$ - } - - } - - - private int parseInt( String intNumber ){ - int i = 0; - try{ - if( StringUtils.isNoneBlank( intNumber ) ) { - i = Integer.parseInt( intNumber ); - } - }catch(Exception e){ - logger.error( "Error parsing integer number" ); - } - return i; - } - - public KmlGenerator getKmlGenerator() throws KmlGenerationException, CsvValidationException { - KmlGenerator generateKml =null; - - final String crsSystem = getLocalProperties().getCrs(); - final Integer innerPointSide = parseInt(getLocalProperties().getValue(EarthProperty.INNER_SUBPLOT_SIDE)); - final Integer largeCentralPlotSide = parseInt(getLocalProperties().getValue(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)); - final String distanceToBuffers = getLocalProperties().getValue(EarthProperty.DISTANCE_TO_BUFFERS); - SAMPLE_SHAPE plotShape = getLocalProperties().getSampleShape(); - final String hostAddress = ServerController.getHostAddress(getLocalProperties().getHost(), getLocalProperties().getPort()); - - final float distanceBetweenSamplePoints; - final float distanceToPlotBoundaries; - String dBSP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS); - try { - distanceBetweenSamplePoints = Float.parseFloat(dBSP); - } catch (Exception e) { - logger.error("Error parsing distance between sample points , wrong value : " + dBSP,e); - EarthApp.showMessage("Attention: Check earth.properties file. The distance between sample points must be a number! You have set it to : " + dBSP); //$NON-NLS-1$ - return null; - } + EarthProjectsService earthProjectsService; + @Autowired + EarthSurveyService earthSurveyService; - String dToPlotB = getLocalProperties().getValue(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES); - try { - distanceToPlotBoundaries = Float.parseFloat(dToPlotB); - } catch (Exception e) { - logger.error("Error parsing distance between plots , wrong value : " + dToPlotB,e); - EarthApp.showMessage("Attention: Check earth.properties file. The distance between sample point and border of the plot must be a number ! You have set it to : " + dToPlotB); //$NON-NLS-1$ - return null; - } - final String localPort = getLocalProperties().getLocalPort(); - final String numberOfSamplingPlots = getLocalProperties().getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT); - final String csvFile = getLocalProperties().getCsvFile(); - - int numberOfPoints = 25; - if ((numberOfSamplingPlots != null) && (numberOfSamplingPlots.trim().length() > 0)) { - numberOfPoints = parseInt(numberOfSamplingPlots.trim()); - } - - try{ - // If there is a polygon column then the type of plot shape is assumed to be POLYGON - if( csvContainsKml(csvFile)){ - plotShape = SAMPLE_SHAPE.KML_POLYGON; - }else if( csvContainsWkt(csvFile)){ - plotShape = SAMPLE_SHAPE.WKT_POLYGON; - }else if( csvContainsGeoJson(csvFile)){ - plotShape = SAMPLE_SHAPE.GEOJSON_POLYGON; - } - - if (plotShape.equals(SAMPLE_SHAPE.CIRCLE)) { - generateKml = new CircleKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, distanceBetweenSamplePoints ); - } else if (plotShape.equals(SAMPLE_SHAPE.NFMA)) { - generateKml = new NfmaKmlGenerator(crsSystem, hostAddress, localPort, 150, false); - } else if (plotShape.equals(SAMPLE_SHAPE.NFMA_250)) { - generateKml = new NfmaKmlGenerator(crsSystem, hostAddress, localPort, 250, true); - } else if (plotShape.equals(SAMPLE_SHAPE.NFI_THREE_CIRCLES)) { - - String dBP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS ); - float distanceBetweenPlots; - try { - distanceBetweenPlots = Float.parseFloat(dBP); - } catch (Exception e) { - logger.error("Error parsing distance between plots , wrong value : " + dBP,e); - EarthApp.showMessage("Attention: Check earth.properties file. The distance between plots must be a number! You have set it to : " + dBP); //$NON-NLS-1$ - return null; - } - - generateKml = new NfiThreeCirclesGenerator(crsSystem, hostAddress, localPort, innerPointSide, distanceBetweenSamplePoints, distanceBetweenPlots ); - }else if (plotShape.equals(SAMPLE_SHAPE.NFI_FOUR_CIRCLES)) { - - String dBP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS ); - float distanceBetweenPlots; - try { - distanceBetweenPlots = Float.parseFloat(dBP); - } catch (Exception e) { - logger.error(String.format("Error parsing distance between plots , wrong value : %s", dBP) ,e); - EarthApp.showMessage("Attention: Check earth.properties file. The distance between plots must be a number! You have set it to : " + dBP); //$NON-NLS-1$ - return null; - } - - generateKml = new NfiFourCirclesGenerator(crsSystem, hostAddress, localPort, innerPointSide, distanceBetweenSamplePoints, distanceBetweenPlots ); - }else if (plotShape.equals(SAMPLE_SHAPE.HEXAGON)) { - generateKml = new HexagonKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, distanceBetweenSamplePoints ); - } else if (plotShape.equals(SAMPLE_SHAPE.SQUARE_CIRCLE)) { - generateKml = new SquareWithCirclesKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, - distanceBetweenSamplePoints, distanceToPlotBoundaries); - } else if (plotShape.equals(SAMPLE_SHAPE.KML_POLYGON)) { - generateKml = new PolygonKmlGenerator(crsSystem, hostAddress, localPort); - } else if (plotShape.equals(SAMPLE_SHAPE.GEOJSON_POLYGON)) { - generateKml = new PolygonGeojsonGenerator(crsSystem, hostAddress, localPort); - }else if (plotShape.equals(SAMPLE_SHAPE.WKT_POLYGON)) { - generateKml = new PolygonWktGenerator(crsSystem, hostAddress, localPort); - }else { - generateKml = new SquareKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, - distanceBetweenSamplePoints, distanceToPlotBoundaries, largeCentralPlotSide, distanceToBuffers); + private JFrame frame; + + /* + * + + one + + -5.89991123135449 + 41.60459478540565 + 0 + -1.425202537313517e-006 + 0 + 177418.783783632 + relativeToSeaFloor + + #m_ylw-pushpin + + 1 + -5.899911231354489,41.60459478540565,0 + + + * + * + */ + + private File createTempCsv( File kmlFile) throws ParserConfigurationException, SAXException, IOException{ + + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); // Compliant + factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); // compliant + DocumentBuilder builder = factory.newDocumentBuilder(); + InputSource is = new InputSource(new FileReader(kmlFile)); + Document doc = builder.parse(is); + + NodeList placemarks = doc.getElementsByTagName("Placemark"); //$NON-NLS-1$ + + StringBuilder sb = new StringBuilder(); + + sb.append( CollectEarthProjectFileCreator.PLACEHOLDER_ID_COLUMNS_HEADER ).append(",").append( "YCoordinate" ).append(",").append( "XCoordinate" ).append(CollectEarthProjectFileCreator.PLACEHOLDER_FOR_EXTRA_COLUMNS_HEADER).append( "\r\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + + for (int i = 0; i < placemarks.getLength(); i++) { + Node placemark = placemarks.item(i); + + if (placemark.hasChildNodes()) { + NodeList childNodes = placemark.getChildNodes(); + String longitude = "",latitude = "",name = "Placemark"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + name = "placemark" + i; + for (int j=0; j new PolygonGeojsonGenerator(null, null, null ).isGeoJsonPolygonColumnFound(csvColumns) != null - ); + return kmlImported; } - private boolean csvContainsWkt(String csvFile) throws IOException, CsvValidationException { - return csvContains( - csvFile, - csvColumns -> new PolygonWktGenerator(null, null, null ).isWktPolygonColumnFound(csvColumns) != null - ); - } - private boolean csvContainsKml(String csvFile) throws IOException, CsvValidationException { - return csvContains( - csvFile, - csvColumns -> new PolygonKmlGenerator(null, null, null ).isKmlPolygonColumnFound(csvColumns) != null - ); - } + public boolean loadFromKml( JFrame frame, File kmlFile) throws ParserConfigurationException, SAXException, IOException{ - private void generateKml() throws KmlGenerationException, IOException, CsvValidationException { + // Convert the KML into a CSV and save it into a temporary file + File convertedCsvFile = createTempCsv( kmlFile ); - KmlGenerator kmlGenerator = null; - kmlGenerator = getKmlGenerator(); + JOptionPane.showMessageDialog(frame, Messages.getString("KmlImportService.13")); //$NON-NLS-1$ - if ( kmlGenerator == null ){ - throw new KmlGenerationException("Error while generating KML"); - } + // Move the temporary file to the current project folder + //File finalCsvFile = moveCsvToProjectFolder(convertedCsvFile, kmlFile.getName()); + File finalCsvFile = selectAndSaveToCsv(convertedCsvFile, kmlFile.getName()); - final String csvFile = getLocalProperties().getCsvFile(); - String balloon = getLocalProperties().getBalloonFile(); - final String template = getLocalProperties().getTemplateFile(); - - // In case the user sets up the OPEN_BALLOON_IN_FIREFOX flag to - // true. Meaning that a small ballon opens in the placemark which in - // its turn - // opens a firefox browser with the real form - final Boolean openBalloonInFirefox = Boolean.valueOf(getLocalProperties().getValue(EarthProperty.OPEN_BALLOON_IN_BROWSER)); - if (Boolean.TRUE.equals( openBalloonInFirefox) ) { - String alternativeBalloon = getLocalProperties().getValue(EarthProperty.ALTERNATIVE_BALLOON_FOR_BROWSER); - if( !StringUtils.isBlank( alternativeBalloon ) ){ - balloon = alternativeBalloon; + boolean loaded = false; + if( finalCsvFile != null ){ + // Load the plots from the CSV + localPropertiesService.setValue(EarthProperty.SAMPLE_FILE, finalCsvFile.getAbsolutePath()); + loaded = true; } - } - - // Using all of the files that compose the final KML it is generated and stores in KML_RESULTING_TEMP_FILE - kmlGenerator.generateKmlFile(KML_RESULTING_TEMP_FILE, csvFile, balloon, template, earthSurveyService.getCollectSurvey()); - updateFilesUsedChecksum(); + return loaded; } - private void updateFilesUsedChecksum() throws IOException { - final String csvFile = getLocalProperties().getCsvFile(); - final String balloon = getLocalProperties().getBalloonFile(); - final String template = getLocalProperties().getTemplateFile(); - - getLocalProperties().saveBalloonFileChecksum(CollectEarthUtils.getMd5FromFile(balloon)); - getLocalProperties().saveCsvFileCehcksum(CollectEarthUtils.getMd5FromFile(csvFile)); - getLocalProperties().saveTemplateFileChecksum(CollectEarthUtils.getMd5FromFile(template)); - } + private File selectAndSaveToCsv(File convertedCsvFile, String name) throws IOException { + final File[] saveToCsvFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, true, false, "importedFromKml_" + name + ".csv", //$NON-NLS-1$ //$NON-NLS-2$ + localPropertiesService, frame); - public void generateLoaderKmlFile() throws IOException, TemplateException { - - getLocalProperties().saveGeneratedOn(System.currentTimeMillis() + ""); //$NON-NLS-1$ - - final Map data = new HashMap<>(); - data.put("host", ServerController.getHostAddress(getLocalProperties().getHost(), getLocalProperties().getLocalPort())); //$NON-NLS-1$ - data.put("kmlGeneratedOn", getLocalProperties().getGeneratedOn()); //$NON-NLS-1$ - data.put("surveyName", getLocalProperties().getValue(EarthProperty.SURVEY_NAME)); //$NON-NLS-1$ - data.put("plotFileName", KmlGenerator.getCsvFileName(getLocalProperties().getValue(EarthProperty.SAMPLE_FILE))); //$NON-NLS-1$ - - FreemarkerTemplateUtils.applyTemplate(new File(KML_NETWORK_LINK_TEMPLATE), new File(KML_NETWORK_LINK_STARTER), data); + if( saveToCsvFile != null && saveToCsvFile.length == 1 ){ + FileUtils.copyFile( convertedCsvFile, saveToCsvFile[0]); + return saveToCsvFile[0]; + }else { + return null; + } } - private boolean isKmlUpToDate() throws IOException { - - final String csvFile = getLocalProperties().getCsvFile(); - final String balloon = getLocalProperties().getBalloonFile(); - final String template = getLocalProperties().getTemplateFile(); +/* private File moveCsvToProjectFolder(File convertedCsvFile, String originalKmlFilename) throws IOException { + File destination = new File( earthProjectsService.getProjectsFolder() + File.separator + "generatedFromKml_" + originalKmlFilename + ".ced"); + FileUtils.copyFile( convertedCsvFile, destination); + return destination; + }*/ - boolean upToDate = true; - if (!getLocalProperties().getBalloonFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(balloon)) - || !getLocalProperties().getTemplateFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(template)) - || !getLocalProperties().getCsvFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(csvFile))) { - upToDate = false; - } + private File chooseKmlFile() { + final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults(DataFormat.KML_FILE, false, false, null, + localPropertiesService, frame); - final File kmzFile = new File(KmlGeneratorService.KMZ_FILE_PATH); - if (!kmzFile.exists()) { - upToDate = false; + if( selectedPlotFiles != null && selectedPlotFiles.length == 1 ){ + return selectedPlotFiles[0]; + }else { + return null; } - - return upToDate; - - } - - public void generatePlacemarksKmzFile() throws IOException, KmlGenerationException, CsvValidationException { - generatePlacemarksKmzFile(false); } - public void generatePlacemarksKmzFile(boolean forceRegeneration ) throws IOException, KmlGenerationException, CsvValidationException { - logger.info("START - Generate KMZ file"); //$NON-NLS-1$ - - if (forceRegeneration || !isKmlUpToDate()) { - - generateKml(); - - final KmzGenerator kmzGenerator = new KmzGenerator(); - - final String balloon = getLocalProperties().getBalloonFile(); - final File balloonFile = new File(balloon); - final String folderToInclude = balloonFile.getParent() + File.separator + EarthConstants.FOLDER_COPIED_TO_KMZ; - - kmzGenerator.generateKmzFile(KMZ_FILE_PATH, KML_RESULTING_TEMP_FILE, folderToInclude); - logger.info("KMZ File generated : {}", KMZ_FILE_PATH); //$NON-NLS-1$ - - copyContentsToGeneratedFolder(folderToInclude); - - final File kmlFile = new File(KML_RESULTING_TEMP_FILE); - if (kmlFile.exists()) { - final boolean deleted = kmlFile.delete(); - if (deleted) { - logger.info("KML File deleted : {}", KML_RESULTING_TEMP_FILE); //$NON-NLS-1$ - } else { - throw new IOException("The KML file could not be deleted at " + kmlFile.getPath()); //$NON-NLS-1$ - } - } - - } - logger.info("END - Generate KMZ file"); //$NON-NLS-1$ - } } From 13a374132abce930e6183a86d3c2cabd845d48e8 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:28 +0100 Subject: [PATCH 0167/1620] New translations KmlImportService.java (Spanish) --- .../earth/app/view/Messages_es.properties | 578 ++++++------------ 1 file changed, 175 insertions(+), 403 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 884dd929bc..9fb3d5284e 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,451 +1,223 @@ package org.openforis.collect.earth.app.service; +import java.io.BufferedInputStream; +import java.io.BufferedWriter; import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FileReader; import java.io.IOException; +import java.io.OutputStreamWriter; +import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.xml.XMLConstants; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.desktop.ServerController; import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.app.view.DataFormat; +import org.openforis.collect.earth.app.view.JFileChooserExistsAware; import org.openforis.collect.earth.app.view.Messages; -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.collect.earth.sampler.processor.CircleKmlGenerator; -import org.openforis.collect.earth.sampler.processor.HexagonKmlGenerator; -import org.openforis.collect.earth.sampler.processor.KmlGenerator; -import org.openforis.collect.earth.sampler.processor.KmzGenerator; -import org.openforis.collect.earth.sampler.processor.NfiFourCirclesGenerator; -import org.openforis.collect.earth.sampler.processor.NfiThreeCirclesGenerator; -import org.openforis.collect.earth.sampler.processor.NfmaKmlGenerator; -import org.openforis.collect.earth.sampler.processor.PolygonGeojsonGenerator; -import org.openforis.collect.earth.sampler.processor.PolygonKmlGenerator; -import org.openforis.collect.earth.sampler.processor.PolygonWktGenerator; -import org.openforis.collect.earth.sampler.processor.SquareKmlGenerator; -import org.openforis.collect.earth.sampler.processor.SquareWithCirclesKmlGenerator; -import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; -import org.openforis.collect.earth.sampler.utils.KmlGenerationException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; +import org.openforis.collect.io.metadata.collectearth.CollectEarthProjectFileCreator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; - -import com.opencsv.CSVReader; -import com.opencsv.exceptions.CsvValidationException; - -import freemarker.template.TemplateException; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; @Component -public class KmlGeneratorService { +public class KmlImportService { + + Map namesAndTimes = new HashMap<>(); @Autowired LocalPropertiesService localPropertiesService; @Autowired - EarthSurveyService earthSurveyService; - - Logger logger = LoggerFactory.getLogger(KmlGeneratorService.class); - - public static final String KML_RESULTING_TEMP_FILE = EarthConstants.GENERATED_FOLDER + File.separator + "plots.kml"; //$NON-NLS-1$ - public static final String KMZ_FILE_PATH = EarthConstants.GENERATED_FOLDER + File.separator + "gePlugin.kmz"; //$NON-NLS-1$ - public static final String KML_NETWORK_LINK_TEMPLATE = "resources/loadApp.fmt"; //$NON-NLS-1$ - public static final String KML_NETWORK_LINK_STARTER = EarthConstants.GENERATED_FOLDER + "/loadApp.kml"; //$NON-NLS-1$ - - public static interface PolygonTest{ - Boolean isPolygon(String[] strColumns); - } - - public void generateKmlFile() throws IOException, KmlGenerationException, CsvValidationException{ - checkFilesExist(); - generatePlacemarksKmzFile(); - - } - - private void checkFilesExist() throws KmlGenerationException { - - fixUserDirectory(); - - final String csvFilePath = getLocalProperties().getCsvFile(); - final String balloonPath = getLocalProperties().getBalloonFile(); - final String templatePath = getLocalProperties().getTemplateFile(); - boolean filesExist = true; - String errorMessage = "Error generating the KML file for Google Earth.
"; //$NON-NLS-1$ - File csvFile = null; - File balloon = null; - File template = null; - try { - csvFile = new File(csvFilePath); - balloon = new File(balloonPath); - template = new File(templatePath); - } catch (final Exception e) { - logger.error("One of the definition files is not defined", e); //$NON-NLS-1$ - } - if (csvFile != null && !csvFile.exists()) { - errorMessage += Messages.getString("EarthApp.21") //$NON-NLS-1$ - + csvFile.getAbsolutePath() + "

"; //$NON-NLS-1$ - filesExist = false; - } else if (csvFile == null) { - errorMessage += Messages.getString("EarthApp.23"); //$NON-NLS-1$ - filesExist = false; - } - - if (template != null && !template.exists()) { - errorMessage += Messages.getString("EarthApp.24") //$NON-NLS-1$ - + template.getAbsolutePath() + "

"; //$NON-NLS-1$ - filesExist = false; - } else if (template == null) { - errorMessage += Messages.getString("EarthApp.26"); //$NON-NLS-1$ - filesExist = false; - } - - if (balloon != null && !balloon.exists()) { - errorMessage += Messages.getString("EarthApp.27") + balloon.getAbsolutePath() //$NON-NLS-1$ - + "

"; //$NON-NLS-1$ - filesExist = false; - } else if (balloon == null) { - errorMessage += Messages.getString("EarthApp.29"); //$NON-NLS-1$ - filesExist = false; - } - - errorMessage += Messages.getString("EarthApp.30"); //$NON-NLS-1$ - - if( !filesExist ){ - throw new KmlGenerationException(errorMessage); - } - } - - private LocalPropertiesService getLocalProperties() { - return localPropertiesService; - } - - private void copyContentsToGeneratedFolder(String folderToInclude) throws IOException { - final File sourceDir = new File(folderToInclude); - final File targetDir = new File(EarthConstants.GENERATED_FOLDER + File.separator + sourceDir.getName()); - FileUtils.copyDirectory(sourceDir, targetDir); - } - - private void fixUserDirectory() { - final String csvFilePath = getLocalProperties().getCsvFile(); - final String balloonPath = getLocalProperties().getBalloonFile(); - final String templatePath = getLocalProperties().getTemplateFile(); - final String metadataPath = getLocalProperties().getImdFile(); - - File csvFile = null; - File balloon = null; - File template = null; - File idmFile = null; - try { - csvFile = new File(csvFilePath); - balloon = new File(balloonPath); - template = new File(templatePath); - idmFile = new File(metadataPath); - - final String prefixUserFolder = FolderFinder.getCollectEarthDataFolder() + File.separator; - - if (!csvFile.exists()) { - final File otherFile = new File(prefixUserFolder + getLocalProperties().getCsvFile()); - if (otherFile.exists()) { - getLocalProperties().setValue(EarthProperty.SAMPLE_FILE, otherFile.getAbsolutePath()); - } - } - - if (!balloon.exists()) { - final File otherFile = new File(prefixUserFolder + getLocalProperties().getBalloonFile()); - if (otherFile.exists()) { - getLocalProperties().setValue(EarthProperty.BALLOON_TEMPLATE_KEY, otherFile.getAbsolutePath()); - } - } - - if (!template.exists()) { - final File otherFile = new File(prefixUserFolder + getLocalProperties().getTemplateFile()); - if (otherFile.exists()) { - getLocalProperties().setValue(EarthProperty.KML_TEMPLATE_KEY, otherFile.getAbsolutePath()); - } - } - - if (!idmFile.exists()) { - final File otherFile = new File(prefixUserFolder + getLocalProperties().getImdFile()); - if (otherFile.exists()) { - getLocalProperties().setValue(EarthProperty.METADATA_FILE, otherFile.getAbsolutePath()); - } - } - - } catch (final Exception e) { - logger.error("One of the definition files is not defined", e); //$NON-NLS-1$ - } - - } - - - private int parseInt( String intNumber ){ - int i = 0; - try{ - if( StringUtils.isNoneBlank( intNumber ) ) { - i = Integer.parseInt( intNumber ); - } - }catch(Exception e){ - logger.error( "Error parsing integer number" ); - } - return i; - } - - public KmlGenerator getKmlGenerator() throws KmlGenerationException, CsvValidationException { - KmlGenerator generateKml =null; - - final String crsSystem = getLocalProperties().getCrs(); - final Integer innerPointSide = parseInt(getLocalProperties().getValue(EarthProperty.INNER_SUBPLOT_SIDE)); - final Integer largeCentralPlotSide = parseInt(getLocalProperties().getValue(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)); - final String distanceToBuffers = getLocalProperties().getValue(EarthProperty.DISTANCE_TO_BUFFERS); - SAMPLE_SHAPE plotShape = getLocalProperties().getSampleShape(); - final String hostAddress = ServerController.getHostAddress(getLocalProperties().getHost(), getLocalProperties().getPort()); - - final float distanceBetweenSamplePoints; - final float distanceToPlotBoundaries; - String dBSP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS); - try { - distanceBetweenSamplePoints = Float.parseFloat(dBSP); - } catch (Exception e) { - logger.error("Error parsing distance between sample points , wrong value : " + dBSP,e); - EarthApp.showMessage("Attention: Check earth.properties file. The distance between sample points must be a number! You have set it to : " + dBSP); //$NON-NLS-1$ - return null; - } + EarthProjectsService earthProjectsService; + @Autowired + EarthSurveyService earthSurveyService; - String dToPlotB = getLocalProperties().getValue(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES); - try { - distanceToPlotBoundaries = Float.parseFloat(dToPlotB); - } catch (Exception e) { - logger.error("Error parsing distance between plots , wrong value : " + dToPlotB,e); - EarthApp.showMessage("Attention: Check earth.properties file. The distance between sample point and border of the plot must be a number ! You have set it to : " + dToPlotB); //$NON-NLS-1$ - return null; - } - final String localPort = getLocalProperties().getLocalPort(); - final String numberOfSamplingPlots = getLocalProperties().getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT); - final String csvFile = getLocalProperties().getCsvFile(); - - int numberOfPoints = 25; - if ((numberOfSamplingPlots != null) && (numberOfSamplingPlots.trim().length() > 0)) { - numberOfPoints = parseInt(numberOfSamplingPlots.trim()); - } - - try{ - // If there is a polygon column then the type of plot shape is assumed to be POLYGON - if( csvContainsKml(csvFile)){ - plotShape = SAMPLE_SHAPE.KML_POLYGON; - }else if( csvContainsWkt(csvFile)){ - plotShape = SAMPLE_SHAPE.WKT_POLYGON; - }else if( csvContainsGeoJson(csvFile)){ - plotShape = SAMPLE_SHAPE.GEOJSON_POLYGON; - } - - if (plotShape.equals(SAMPLE_SHAPE.CIRCLE)) { - generateKml = new CircleKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, distanceBetweenSamplePoints ); - } else if (plotShape.equals(SAMPLE_SHAPE.NFMA)) { - generateKml = new NfmaKmlGenerator(crsSystem, hostAddress, localPort, 150, false); - } else if (plotShape.equals(SAMPLE_SHAPE.NFMA_250)) { - generateKml = new NfmaKmlGenerator(crsSystem, hostAddress, localPort, 250, true); - } else if (plotShape.equals(SAMPLE_SHAPE.NFI_THREE_CIRCLES)) { - - String dBP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS ); - float distanceBetweenPlots; - try { - distanceBetweenPlots = Float.parseFloat(dBP); - } catch (Exception e) { - logger.error("Error parsing distance between plots , wrong value : " + dBP,e); - EarthApp.showMessage("Attention: Check earth.properties file. The distance between plots must be a number! You have set it to : " + dBP); //$NON-NLS-1$ - return null; - } - - generateKml = new NfiThreeCirclesGenerator(crsSystem, hostAddress, localPort, innerPointSide, distanceBetweenSamplePoints, distanceBetweenPlots ); - }else if (plotShape.equals(SAMPLE_SHAPE.NFI_FOUR_CIRCLES)) { - - String dBP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS ); - float distanceBetweenPlots; - try { - distanceBetweenPlots = Float.parseFloat(dBP); - } catch (Exception e) { - logger.error(String.format("Error parsing distance between plots , wrong value : %s", dBP) ,e); - EarthApp.showMessage("Attention: Check earth.properties file. The distance between plots must be a number! You have set it to : " + dBP); //$NON-NLS-1$ - return null; - } - - generateKml = new NfiFourCirclesGenerator(crsSystem, hostAddress, localPort, innerPointSide, distanceBetweenSamplePoints, distanceBetweenPlots ); - }else if (plotShape.equals(SAMPLE_SHAPE.HEXAGON)) { - generateKml = new HexagonKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, distanceBetweenSamplePoints ); - } else if (plotShape.equals(SAMPLE_SHAPE.SQUARE_CIRCLE)) { - generateKml = new SquareWithCirclesKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, - distanceBetweenSamplePoints, distanceToPlotBoundaries); - } else if (plotShape.equals(SAMPLE_SHAPE.KML_POLYGON)) { - generateKml = new PolygonKmlGenerator(crsSystem, hostAddress, localPort); - } else if (plotShape.equals(SAMPLE_SHAPE.GEOJSON_POLYGON)) { - generateKml = new PolygonGeojsonGenerator(crsSystem, hostAddress, localPort); - }else if (plotShape.equals(SAMPLE_SHAPE.WKT_POLYGON)) { - generateKml = new PolygonWktGenerator(crsSystem, hostAddress, localPort); - }else { - generateKml = new SquareKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, - distanceBetweenSamplePoints, distanceToPlotBoundaries, largeCentralPlotSide, distanceToBuffers); + private JFrame frame; + + /* + * + + one + + -5.89991123135449 + 41.60459478540565 + 0 + -1.425202537313517e-006 + 0 + 177418.783783632 + relativeToSeaFloor + + #m_ylw-pushpin + + 1 + -5.899911231354489,41.60459478540565,0 + + + * + * + */ + + private File createTempCsv( File kmlFile) throws ParserConfigurationException, SAXException, IOException{ + + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); // Compliant + factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); // compliant + DocumentBuilder builder = factory.newDocumentBuilder(); + InputSource is = new InputSource(new FileReader(kmlFile)); + Document doc = builder.parse(is); + + NodeList placemarks = doc.getElementsByTagName("Placemark"); //$NON-NLS-1$ + + StringBuilder sb = new StringBuilder(); + + sb.append( CollectEarthProjectFileCreator.PLACEHOLDER_ID_COLUMNS_HEADER ).append(",").append( "YCoordinate" ).append(",").append( "XCoordinate" ).append(CollectEarthProjectFileCreator.PLACEHOLDER_FOR_EXTRA_COLUMNS_HEADER).append( "\r\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + + for (int i = 0; i < placemarks.getLength(); i++) { + Node placemark = placemarks.item(i); + + if (placemark.hasChildNodes()) { + NodeList childNodes = placemark.getChildNodes(); + String longitude = "",latitude = "",name = "Placemark"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + name = "placemark" + i; + for (int j=0; j new PolygonGeojsonGenerator(null, null, null ).isGeoJsonPolygonColumnFound(csvColumns) != null - ); + return kmlImported; } - private boolean csvContainsWkt(String csvFile) throws IOException, CsvValidationException { - return csvContains( - csvFile, - csvColumns -> new PolygonWktGenerator(null, null, null ).isWktPolygonColumnFound(csvColumns) != null - ); - } - private boolean csvContainsKml(String csvFile) throws IOException, CsvValidationException { - return csvContains( - csvFile, - csvColumns -> new PolygonKmlGenerator(null, null, null ).isKmlPolygonColumnFound(csvColumns) != null - ); - } + public boolean loadFromKml( JFrame frame, File kmlFile) throws ParserConfigurationException, SAXException, IOException{ - private void generateKml() throws KmlGenerationException, IOException, CsvValidationException { + // Convert the KML into a CSV and save it into a temporary file + File convertedCsvFile = createTempCsv( kmlFile ); - KmlGenerator kmlGenerator = null; - kmlGenerator = getKmlGenerator(); + JOptionPane.showMessageDialog(frame, Messages.getString("KmlImportService.13")); //$NON-NLS-1$ - if ( kmlGenerator == null ){ - throw new KmlGenerationException("Error while generating KML"); - } + // Move the temporary file to the current project folder + //File finalCsvFile = moveCsvToProjectFolder(convertedCsvFile, kmlFile.getName()); + File finalCsvFile = selectAndSaveToCsv(convertedCsvFile, kmlFile.getName()); - final String csvFile = getLocalProperties().getCsvFile(); - String balloon = getLocalProperties().getBalloonFile(); - final String template = getLocalProperties().getTemplateFile(); - - // In case the user sets up the OPEN_BALLOON_IN_FIREFOX flag to - // true. Meaning that a small ballon opens in the placemark which in - // its turn - // opens a firefox browser with the real form - final Boolean openBalloonInFirefox = Boolean.valueOf(getLocalProperties().getValue(EarthProperty.OPEN_BALLOON_IN_BROWSER)); - if (Boolean.TRUE.equals( openBalloonInFirefox) ) { - String alternativeBalloon = getLocalProperties().getValue(EarthProperty.ALTERNATIVE_BALLOON_FOR_BROWSER); - if( !StringUtils.isBlank( alternativeBalloon ) ){ - balloon = alternativeBalloon; + boolean loaded = false; + if( finalCsvFile != null ){ + // Load the plots from the CSV + localPropertiesService.setValue(EarthProperty.SAMPLE_FILE, finalCsvFile.getAbsolutePath()); + loaded = true; } - } - - // Using all of the files that compose the final KML it is generated and stores in KML_RESULTING_TEMP_FILE - kmlGenerator.generateKmlFile(KML_RESULTING_TEMP_FILE, csvFile, balloon, template, earthSurveyService.getCollectSurvey()); - updateFilesUsedChecksum(); + return loaded; } - private void updateFilesUsedChecksum() throws IOException { - final String csvFile = getLocalProperties().getCsvFile(); - final String balloon = getLocalProperties().getBalloonFile(); - final String template = getLocalProperties().getTemplateFile(); - - getLocalProperties().saveBalloonFileChecksum(CollectEarthUtils.getMd5FromFile(balloon)); - getLocalProperties().saveCsvFileCehcksum(CollectEarthUtils.getMd5FromFile(csvFile)); - getLocalProperties().saveTemplateFileChecksum(CollectEarthUtils.getMd5FromFile(template)); - } + private File selectAndSaveToCsv(File convertedCsvFile, String name) throws IOException { + final File[] saveToCsvFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, true, false, "importedFromKml_" + name + ".csv", //$NON-NLS-1$ //$NON-NLS-2$ + localPropertiesService, frame); - public void generateLoaderKmlFile() throws IOException, TemplateException { - - getLocalProperties().saveGeneratedOn(System.currentTimeMillis() + ""); //$NON-NLS-1$ - - final Map data = new HashMap<>(); - data.put("host", ServerController.getHostAddress(getLocalProperties().getHost(), getLocalProperties().getLocalPort())); //$NON-NLS-1$ - data.put("kmlGeneratedOn", getLocalProperties().getGeneratedOn()); //$NON-NLS-1$ - data.put("surveyName", getLocalProperties().getValue(EarthProperty.SURVEY_NAME)); //$NON-NLS-1$ - data.put("plotFileName", KmlGenerator.getCsvFileName(getLocalProperties().getValue(EarthProperty.SAMPLE_FILE))); //$NON-NLS-1$ - - FreemarkerTemplateUtils.applyTemplate(new File(KML_NETWORK_LINK_TEMPLATE), new File(KML_NETWORK_LINK_STARTER), data); + if( saveToCsvFile != null && saveToCsvFile.length == 1 ){ + FileUtils.copyFile( convertedCsvFile, saveToCsvFile[0]); + return saveToCsvFile[0]; + }else { + return null; + } } - private boolean isKmlUpToDate() throws IOException { - - final String csvFile = getLocalProperties().getCsvFile(); - final String balloon = getLocalProperties().getBalloonFile(); - final String template = getLocalProperties().getTemplateFile(); +/* private File moveCsvToProjectFolder(File convertedCsvFile, String originalKmlFilename) throws IOException { + File destination = new File( earthProjectsService.getProjectsFolder() + File.separator + "generatedFromKml_" + originalKmlFilename + ".ced"); + FileUtils.copyFile( convertedCsvFile, destination); + return destination; + }*/ - boolean upToDate = true; - if (!getLocalProperties().getBalloonFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(balloon)) - || !getLocalProperties().getTemplateFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(template)) - || !getLocalProperties().getCsvFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(csvFile))) { - upToDate = false; - } + private File chooseKmlFile() { + final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults(DataFormat.KML_FILE, false, false, null, + localPropertiesService, frame); - final File kmzFile = new File(KmlGeneratorService.KMZ_FILE_PATH); - if (!kmzFile.exists()) { - upToDate = false; + if( selectedPlotFiles != null && selectedPlotFiles.length == 1 ){ + return selectedPlotFiles[0]; + }else { + return null; } - - return upToDate; - - } - - public void generatePlacemarksKmzFile() throws IOException, KmlGenerationException, CsvValidationException { - generatePlacemarksKmzFile(false); } - public void generatePlacemarksKmzFile(boolean forceRegeneration ) throws IOException, KmlGenerationException, CsvValidationException { - logger.info("START - Generate KMZ file"); //$NON-NLS-1$ - - if (forceRegeneration || !isKmlUpToDate()) { - - generateKml(); - - final KmzGenerator kmzGenerator = new KmzGenerator(); - - final String balloon = getLocalProperties().getBalloonFile(); - final File balloonFile = new File(balloon); - final String folderToInclude = balloonFile.getParent() + File.separator + EarthConstants.FOLDER_COPIED_TO_KMZ; - - kmzGenerator.generateKmzFile(KMZ_FILE_PATH, KML_RESULTING_TEMP_FILE, folderToInclude); - logger.info("KMZ File generated : {}", KMZ_FILE_PATH); //$NON-NLS-1$ - - copyContentsToGeneratedFolder(folderToInclude); - - final File kmlFile = new File(KML_RESULTING_TEMP_FILE); - if (kmlFile.exists()) { - final boolean deleted = kmlFile.delete(); - if (deleted) { - logger.info("KML File deleted : {}", KML_RESULTING_TEMP_FILE); //$NON-NLS-1$ - } else { - throw new IOException("The KML file could not be deleted at " + kmlFile.getPath()); //$NON-NLS-1$ - } - } - - } - logger.info("END - Generate KMZ file"); //$NON-NLS-1$ - } } From 91e207814a51974a4839f9a077c135e1fdb2712c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:29 +0100 Subject: [PATCH 0168/1620] New translations KmlImportService.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 578 ++++++------------ 1 file changed, 175 insertions(+), 403 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 884dd929bc..9fb3d5284e 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,451 +1,223 @@ package org.openforis.collect.earth.app.service; +import java.io.BufferedInputStream; +import java.io.BufferedWriter; import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FileReader; import java.io.IOException; +import java.io.OutputStreamWriter; +import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.xml.XMLConstants; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.desktop.ServerController; import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.app.view.DataFormat; +import org.openforis.collect.earth.app.view.JFileChooserExistsAware; import org.openforis.collect.earth.app.view.Messages; -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.collect.earth.sampler.processor.CircleKmlGenerator; -import org.openforis.collect.earth.sampler.processor.HexagonKmlGenerator; -import org.openforis.collect.earth.sampler.processor.KmlGenerator; -import org.openforis.collect.earth.sampler.processor.KmzGenerator; -import org.openforis.collect.earth.sampler.processor.NfiFourCirclesGenerator; -import org.openforis.collect.earth.sampler.processor.NfiThreeCirclesGenerator; -import org.openforis.collect.earth.sampler.processor.NfmaKmlGenerator; -import org.openforis.collect.earth.sampler.processor.PolygonGeojsonGenerator; -import org.openforis.collect.earth.sampler.processor.PolygonKmlGenerator; -import org.openforis.collect.earth.sampler.processor.PolygonWktGenerator; -import org.openforis.collect.earth.sampler.processor.SquareKmlGenerator; -import org.openforis.collect.earth.sampler.processor.SquareWithCirclesKmlGenerator; -import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; -import org.openforis.collect.earth.sampler.utils.KmlGenerationException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; +import org.openforis.collect.io.metadata.collectearth.CollectEarthProjectFileCreator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; - -import com.opencsv.CSVReader; -import com.opencsv.exceptions.CsvValidationException; - -import freemarker.template.TemplateException; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; @Component -public class KmlGeneratorService { +public class KmlImportService { + + Map namesAndTimes = new HashMap<>(); @Autowired LocalPropertiesService localPropertiesService; @Autowired - EarthSurveyService earthSurveyService; - - Logger logger = LoggerFactory.getLogger(KmlGeneratorService.class); - - public static final String KML_RESULTING_TEMP_FILE = EarthConstants.GENERATED_FOLDER + File.separator + "plots.kml"; //$NON-NLS-1$ - public static final String KMZ_FILE_PATH = EarthConstants.GENERATED_FOLDER + File.separator + "gePlugin.kmz"; //$NON-NLS-1$ - public static final String KML_NETWORK_LINK_TEMPLATE = "resources/loadApp.fmt"; //$NON-NLS-1$ - public static final String KML_NETWORK_LINK_STARTER = EarthConstants.GENERATED_FOLDER + "/loadApp.kml"; //$NON-NLS-1$ - - public static interface PolygonTest{ - Boolean isPolygon(String[] strColumns); - } - - public void generateKmlFile() throws IOException, KmlGenerationException, CsvValidationException{ - checkFilesExist(); - generatePlacemarksKmzFile(); - - } - - private void checkFilesExist() throws KmlGenerationException { - - fixUserDirectory(); - - final String csvFilePath = getLocalProperties().getCsvFile(); - final String balloonPath = getLocalProperties().getBalloonFile(); - final String templatePath = getLocalProperties().getTemplateFile(); - boolean filesExist = true; - String errorMessage = "Error generating the KML file for Google Earth.
"; //$NON-NLS-1$ - File csvFile = null; - File balloon = null; - File template = null; - try { - csvFile = new File(csvFilePath); - balloon = new File(balloonPath); - template = new File(templatePath); - } catch (final Exception e) { - logger.error("One of the definition files is not defined", e); //$NON-NLS-1$ - } - if (csvFile != null && !csvFile.exists()) { - errorMessage += Messages.getString("EarthApp.21") //$NON-NLS-1$ - + csvFile.getAbsolutePath() + "

"; //$NON-NLS-1$ - filesExist = false; - } else if (csvFile == null) { - errorMessage += Messages.getString("EarthApp.23"); //$NON-NLS-1$ - filesExist = false; - } - - if (template != null && !template.exists()) { - errorMessage += Messages.getString("EarthApp.24") //$NON-NLS-1$ - + template.getAbsolutePath() + "

"; //$NON-NLS-1$ - filesExist = false; - } else if (template == null) { - errorMessage += Messages.getString("EarthApp.26"); //$NON-NLS-1$ - filesExist = false; - } - - if (balloon != null && !balloon.exists()) { - errorMessage += Messages.getString("EarthApp.27") + balloon.getAbsolutePath() //$NON-NLS-1$ - + "

"; //$NON-NLS-1$ - filesExist = false; - } else if (balloon == null) { - errorMessage += Messages.getString("EarthApp.29"); //$NON-NLS-1$ - filesExist = false; - } - - errorMessage += Messages.getString("EarthApp.30"); //$NON-NLS-1$ - - if( !filesExist ){ - throw new KmlGenerationException(errorMessage); - } - } - - private LocalPropertiesService getLocalProperties() { - return localPropertiesService; - } - - private void copyContentsToGeneratedFolder(String folderToInclude) throws IOException { - final File sourceDir = new File(folderToInclude); - final File targetDir = new File(EarthConstants.GENERATED_FOLDER + File.separator + sourceDir.getName()); - FileUtils.copyDirectory(sourceDir, targetDir); - } - - private void fixUserDirectory() { - final String csvFilePath = getLocalProperties().getCsvFile(); - final String balloonPath = getLocalProperties().getBalloonFile(); - final String templatePath = getLocalProperties().getTemplateFile(); - final String metadataPath = getLocalProperties().getImdFile(); - - File csvFile = null; - File balloon = null; - File template = null; - File idmFile = null; - try { - csvFile = new File(csvFilePath); - balloon = new File(balloonPath); - template = new File(templatePath); - idmFile = new File(metadataPath); - - final String prefixUserFolder = FolderFinder.getCollectEarthDataFolder() + File.separator; - - if (!csvFile.exists()) { - final File otherFile = new File(prefixUserFolder + getLocalProperties().getCsvFile()); - if (otherFile.exists()) { - getLocalProperties().setValue(EarthProperty.SAMPLE_FILE, otherFile.getAbsolutePath()); - } - } - - if (!balloon.exists()) { - final File otherFile = new File(prefixUserFolder + getLocalProperties().getBalloonFile()); - if (otherFile.exists()) { - getLocalProperties().setValue(EarthProperty.BALLOON_TEMPLATE_KEY, otherFile.getAbsolutePath()); - } - } - - if (!template.exists()) { - final File otherFile = new File(prefixUserFolder + getLocalProperties().getTemplateFile()); - if (otherFile.exists()) { - getLocalProperties().setValue(EarthProperty.KML_TEMPLATE_KEY, otherFile.getAbsolutePath()); - } - } - - if (!idmFile.exists()) { - final File otherFile = new File(prefixUserFolder + getLocalProperties().getImdFile()); - if (otherFile.exists()) { - getLocalProperties().setValue(EarthProperty.METADATA_FILE, otherFile.getAbsolutePath()); - } - } - - } catch (final Exception e) { - logger.error("One of the definition files is not defined", e); //$NON-NLS-1$ - } - - } - - - private int parseInt( String intNumber ){ - int i = 0; - try{ - if( StringUtils.isNoneBlank( intNumber ) ) { - i = Integer.parseInt( intNumber ); - } - }catch(Exception e){ - logger.error( "Error parsing integer number" ); - } - return i; - } - - public KmlGenerator getKmlGenerator() throws KmlGenerationException, CsvValidationException { - KmlGenerator generateKml =null; - - final String crsSystem = getLocalProperties().getCrs(); - final Integer innerPointSide = parseInt(getLocalProperties().getValue(EarthProperty.INNER_SUBPLOT_SIDE)); - final Integer largeCentralPlotSide = parseInt(getLocalProperties().getValue(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)); - final String distanceToBuffers = getLocalProperties().getValue(EarthProperty.DISTANCE_TO_BUFFERS); - SAMPLE_SHAPE plotShape = getLocalProperties().getSampleShape(); - final String hostAddress = ServerController.getHostAddress(getLocalProperties().getHost(), getLocalProperties().getPort()); - - final float distanceBetweenSamplePoints; - final float distanceToPlotBoundaries; - String dBSP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS); - try { - distanceBetweenSamplePoints = Float.parseFloat(dBSP); - } catch (Exception e) { - logger.error("Error parsing distance between sample points , wrong value : " + dBSP,e); - EarthApp.showMessage("Attention: Check earth.properties file. The distance between sample points must be a number! You have set it to : " + dBSP); //$NON-NLS-1$ - return null; - } + EarthProjectsService earthProjectsService; + @Autowired + EarthSurveyService earthSurveyService; - String dToPlotB = getLocalProperties().getValue(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES); - try { - distanceToPlotBoundaries = Float.parseFloat(dToPlotB); - } catch (Exception e) { - logger.error("Error parsing distance between plots , wrong value : " + dToPlotB,e); - EarthApp.showMessage("Attention: Check earth.properties file. The distance between sample point and border of the plot must be a number ! You have set it to : " + dToPlotB); //$NON-NLS-1$ - return null; - } - final String localPort = getLocalProperties().getLocalPort(); - final String numberOfSamplingPlots = getLocalProperties().getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT); - final String csvFile = getLocalProperties().getCsvFile(); - - int numberOfPoints = 25; - if ((numberOfSamplingPlots != null) && (numberOfSamplingPlots.trim().length() > 0)) { - numberOfPoints = parseInt(numberOfSamplingPlots.trim()); - } - - try{ - // If there is a polygon column then the type of plot shape is assumed to be POLYGON - if( csvContainsKml(csvFile)){ - plotShape = SAMPLE_SHAPE.KML_POLYGON; - }else if( csvContainsWkt(csvFile)){ - plotShape = SAMPLE_SHAPE.WKT_POLYGON; - }else if( csvContainsGeoJson(csvFile)){ - plotShape = SAMPLE_SHAPE.GEOJSON_POLYGON; - } - - if (plotShape.equals(SAMPLE_SHAPE.CIRCLE)) { - generateKml = new CircleKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, distanceBetweenSamplePoints ); - } else if (plotShape.equals(SAMPLE_SHAPE.NFMA)) { - generateKml = new NfmaKmlGenerator(crsSystem, hostAddress, localPort, 150, false); - } else if (plotShape.equals(SAMPLE_SHAPE.NFMA_250)) { - generateKml = new NfmaKmlGenerator(crsSystem, hostAddress, localPort, 250, true); - } else if (plotShape.equals(SAMPLE_SHAPE.NFI_THREE_CIRCLES)) { - - String dBP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS ); - float distanceBetweenPlots; - try { - distanceBetweenPlots = Float.parseFloat(dBP); - } catch (Exception e) { - logger.error("Error parsing distance between plots , wrong value : " + dBP,e); - EarthApp.showMessage("Attention: Check earth.properties file. The distance between plots must be a number! You have set it to : " + dBP); //$NON-NLS-1$ - return null; - } - - generateKml = new NfiThreeCirclesGenerator(crsSystem, hostAddress, localPort, innerPointSide, distanceBetweenSamplePoints, distanceBetweenPlots ); - }else if (plotShape.equals(SAMPLE_SHAPE.NFI_FOUR_CIRCLES)) { - - String dBP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS ); - float distanceBetweenPlots; - try { - distanceBetweenPlots = Float.parseFloat(dBP); - } catch (Exception e) { - logger.error(String.format("Error parsing distance between plots , wrong value : %s", dBP) ,e); - EarthApp.showMessage("Attention: Check earth.properties file. The distance between plots must be a number! You have set it to : " + dBP); //$NON-NLS-1$ - return null; - } - - generateKml = new NfiFourCirclesGenerator(crsSystem, hostAddress, localPort, innerPointSide, distanceBetweenSamplePoints, distanceBetweenPlots ); - }else if (plotShape.equals(SAMPLE_SHAPE.HEXAGON)) { - generateKml = new HexagonKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, distanceBetweenSamplePoints ); - } else if (plotShape.equals(SAMPLE_SHAPE.SQUARE_CIRCLE)) { - generateKml = new SquareWithCirclesKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, - distanceBetweenSamplePoints, distanceToPlotBoundaries); - } else if (plotShape.equals(SAMPLE_SHAPE.KML_POLYGON)) { - generateKml = new PolygonKmlGenerator(crsSystem, hostAddress, localPort); - } else if (plotShape.equals(SAMPLE_SHAPE.GEOJSON_POLYGON)) { - generateKml = new PolygonGeojsonGenerator(crsSystem, hostAddress, localPort); - }else if (plotShape.equals(SAMPLE_SHAPE.WKT_POLYGON)) { - generateKml = new PolygonWktGenerator(crsSystem, hostAddress, localPort); - }else { - generateKml = new SquareKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, - distanceBetweenSamplePoints, distanceToPlotBoundaries, largeCentralPlotSide, distanceToBuffers); + private JFrame frame; + + /* + * + + one + + -5.89991123135449 + 41.60459478540565 + 0 + -1.425202537313517e-006 + 0 + 177418.783783632 + relativeToSeaFloor + + #m_ylw-pushpin + + 1 + -5.899911231354489,41.60459478540565,0 + + + * + * + */ + + private File createTempCsv( File kmlFile) throws ParserConfigurationException, SAXException, IOException{ + + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); // Compliant + factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); // compliant + DocumentBuilder builder = factory.newDocumentBuilder(); + InputSource is = new InputSource(new FileReader(kmlFile)); + Document doc = builder.parse(is); + + NodeList placemarks = doc.getElementsByTagName("Placemark"); //$NON-NLS-1$ + + StringBuilder sb = new StringBuilder(); + + sb.append( CollectEarthProjectFileCreator.PLACEHOLDER_ID_COLUMNS_HEADER ).append(",").append( "YCoordinate" ).append(",").append( "XCoordinate" ).append(CollectEarthProjectFileCreator.PLACEHOLDER_FOR_EXTRA_COLUMNS_HEADER).append( "\r\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + + for (int i = 0; i < placemarks.getLength(); i++) { + Node placemark = placemarks.item(i); + + if (placemark.hasChildNodes()) { + NodeList childNodes = placemark.getChildNodes(); + String longitude = "",latitude = "",name = "Placemark"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + name = "placemark" + i; + for (int j=0; j new PolygonGeojsonGenerator(null, null, null ).isGeoJsonPolygonColumnFound(csvColumns) != null - ); + return kmlImported; } - private boolean csvContainsWkt(String csvFile) throws IOException, CsvValidationException { - return csvContains( - csvFile, - csvColumns -> new PolygonWktGenerator(null, null, null ).isWktPolygonColumnFound(csvColumns) != null - ); - } - private boolean csvContainsKml(String csvFile) throws IOException, CsvValidationException { - return csvContains( - csvFile, - csvColumns -> new PolygonKmlGenerator(null, null, null ).isKmlPolygonColumnFound(csvColumns) != null - ); - } + public boolean loadFromKml( JFrame frame, File kmlFile) throws ParserConfigurationException, SAXException, IOException{ - private void generateKml() throws KmlGenerationException, IOException, CsvValidationException { + // Convert the KML into a CSV and save it into a temporary file + File convertedCsvFile = createTempCsv( kmlFile ); - KmlGenerator kmlGenerator = null; - kmlGenerator = getKmlGenerator(); + JOptionPane.showMessageDialog(frame, Messages.getString("KmlImportService.13")); //$NON-NLS-1$ - if ( kmlGenerator == null ){ - throw new KmlGenerationException("Error while generating KML"); - } + // Move the temporary file to the current project folder + //File finalCsvFile = moveCsvToProjectFolder(convertedCsvFile, kmlFile.getName()); + File finalCsvFile = selectAndSaveToCsv(convertedCsvFile, kmlFile.getName()); - final String csvFile = getLocalProperties().getCsvFile(); - String balloon = getLocalProperties().getBalloonFile(); - final String template = getLocalProperties().getTemplateFile(); - - // In case the user sets up the OPEN_BALLOON_IN_FIREFOX flag to - // true. Meaning that a small ballon opens in the placemark which in - // its turn - // opens a firefox browser with the real form - final Boolean openBalloonInFirefox = Boolean.valueOf(getLocalProperties().getValue(EarthProperty.OPEN_BALLOON_IN_BROWSER)); - if (Boolean.TRUE.equals( openBalloonInFirefox) ) { - String alternativeBalloon = getLocalProperties().getValue(EarthProperty.ALTERNATIVE_BALLOON_FOR_BROWSER); - if( !StringUtils.isBlank( alternativeBalloon ) ){ - balloon = alternativeBalloon; + boolean loaded = false; + if( finalCsvFile != null ){ + // Load the plots from the CSV + localPropertiesService.setValue(EarthProperty.SAMPLE_FILE, finalCsvFile.getAbsolutePath()); + loaded = true; } - } - - // Using all of the files that compose the final KML it is generated and stores in KML_RESULTING_TEMP_FILE - kmlGenerator.generateKmlFile(KML_RESULTING_TEMP_FILE, csvFile, balloon, template, earthSurveyService.getCollectSurvey()); - updateFilesUsedChecksum(); + return loaded; } - private void updateFilesUsedChecksum() throws IOException { - final String csvFile = getLocalProperties().getCsvFile(); - final String balloon = getLocalProperties().getBalloonFile(); - final String template = getLocalProperties().getTemplateFile(); - - getLocalProperties().saveBalloonFileChecksum(CollectEarthUtils.getMd5FromFile(balloon)); - getLocalProperties().saveCsvFileCehcksum(CollectEarthUtils.getMd5FromFile(csvFile)); - getLocalProperties().saveTemplateFileChecksum(CollectEarthUtils.getMd5FromFile(template)); - } + private File selectAndSaveToCsv(File convertedCsvFile, String name) throws IOException { + final File[] saveToCsvFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, true, false, "importedFromKml_" + name + ".csv", //$NON-NLS-1$ //$NON-NLS-2$ + localPropertiesService, frame); - public void generateLoaderKmlFile() throws IOException, TemplateException { - - getLocalProperties().saveGeneratedOn(System.currentTimeMillis() + ""); //$NON-NLS-1$ - - final Map data = new HashMap<>(); - data.put("host", ServerController.getHostAddress(getLocalProperties().getHost(), getLocalProperties().getLocalPort())); //$NON-NLS-1$ - data.put("kmlGeneratedOn", getLocalProperties().getGeneratedOn()); //$NON-NLS-1$ - data.put("surveyName", getLocalProperties().getValue(EarthProperty.SURVEY_NAME)); //$NON-NLS-1$ - data.put("plotFileName", KmlGenerator.getCsvFileName(getLocalProperties().getValue(EarthProperty.SAMPLE_FILE))); //$NON-NLS-1$ - - FreemarkerTemplateUtils.applyTemplate(new File(KML_NETWORK_LINK_TEMPLATE), new File(KML_NETWORK_LINK_STARTER), data); + if( saveToCsvFile != null && saveToCsvFile.length == 1 ){ + FileUtils.copyFile( convertedCsvFile, saveToCsvFile[0]); + return saveToCsvFile[0]; + }else { + return null; + } } - private boolean isKmlUpToDate() throws IOException { - - final String csvFile = getLocalProperties().getCsvFile(); - final String balloon = getLocalProperties().getBalloonFile(); - final String template = getLocalProperties().getTemplateFile(); +/* private File moveCsvToProjectFolder(File convertedCsvFile, String originalKmlFilename) throws IOException { + File destination = new File( earthProjectsService.getProjectsFolder() + File.separator + "generatedFromKml_" + originalKmlFilename + ".ced"); + FileUtils.copyFile( convertedCsvFile, destination); + return destination; + }*/ - boolean upToDate = true; - if (!getLocalProperties().getBalloonFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(balloon)) - || !getLocalProperties().getTemplateFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(template)) - || !getLocalProperties().getCsvFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(csvFile))) { - upToDate = false; - } + private File chooseKmlFile() { + final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults(DataFormat.KML_FILE, false, false, null, + localPropertiesService, frame); - final File kmzFile = new File(KmlGeneratorService.KMZ_FILE_PATH); - if (!kmzFile.exists()) { - upToDate = false; + if( selectedPlotFiles != null && selectedPlotFiles.length == 1 ){ + return selectedPlotFiles[0]; + }else { + return null; } - - return upToDate; - - } - - public void generatePlacemarksKmzFile() throws IOException, KmlGenerationException, CsvValidationException { - generatePlacemarksKmzFile(false); } - public void generatePlacemarksKmzFile(boolean forceRegeneration ) throws IOException, KmlGenerationException, CsvValidationException { - logger.info("START - Generate KMZ file"); //$NON-NLS-1$ - - if (forceRegeneration || !isKmlUpToDate()) { - - generateKml(); - - final KmzGenerator kmzGenerator = new KmzGenerator(); - - final String balloon = getLocalProperties().getBalloonFile(); - final File balloonFile = new File(balloon); - final String folderToInclude = balloonFile.getParent() + File.separator + EarthConstants.FOLDER_COPIED_TO_KMZ; - - kmzGenerator.generateKmzFile(KMZ_FILE_PATH, KML_RESULTING_TEMP_FILE, folderToInclude); - logger.info("KMZ File generated : {}", KMZ_FILE_PATH); //$NON-NLS-1$ - - copyContentsToGeneratedFolder(folderToInclude); - - final File kmlFile = new File(KML_RESULTING_TEMP_FILE); - if (kmlFile.exists()) { - final boolean deleted = kmlFile.delete(); - if (deleted) { - logger.info("KML File deleted : {}", KML_RESULTING_TEMP_FILE); //$NON-NLS-1$ - } else { - throw new IOException("The KML file could not be deleted at " + kmlFile.getPath()); //$NON-NLS-1$ - } - } - - } - logger.info("END - Generate KMZ file"); //$NON-NLS-1$ - } } From 2e81579de086c2a20890b7c73bbe2f1609e8adff Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:30 +0100 Subject: [PATCH 0169/1620] New translations MissingPlotService.java (French) --- .../earth/app/view/Messages_fr.properties | 348 +++++++++--------- 1 file changed, 176 insertions(+), 172 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 9fb3d5284e..1c73e5c34d 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,223 +1,227 @@ package org.openforis.collect.earth.app.service; -import java.io.BufferedInputStream; +import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.FileOutputStream; -import java.io.FileReader; import java.io.IOException; +import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; -import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.xml.XMLConstants; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; - -import org.apache.commons.io.FileUtils; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.app.view.DataFormat; -import org.openforis.collect.earth.app.view.JFileChooserExistsAware; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; import org.openforis.collect.earth.app.view.Messages; -import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; -import org.openforis.collect.io.metadata.collectearth.CollectEarthProjectFileCreator; +import org.openforis.collect.manager.RecordManager; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.CollectRecordSummary; +import org.openforis.collect.model.RecordFilter; +import org.openforis.idm.metamodel.AttributeDefinition; +import org.openforis.idm.model.BooleanAttribute; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.w3c.dom.Document; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; +import org.springframework.util.StringUtils; -@Component -public class KmlImportService { +import com.opencsv.CSVReader; +import com.opencsv.exceptions.CsvValidationException; - Map namesAndTimes = new HashMap<>(); +@Component +public class MissingPlotService { @Autowired - LocalPropertiesService localPropertiesService; + private RecordManager recordManager; @Autowired - EarthProjectsService earthProjectsService; + private EarthSurveyService earthSurveyService; - @Autowired - EarthSurveyService earthSurveyService; - - private JFrame frame; - - /* - * - - one - - -5.89991123135449 - 41.60459478540565 - 0 - -1.425202537313517e-006 - 0 - 177418.783783632 - relativeToSeaFloor - - #m_ylw-pushpin - - 1 - -5.899911231354489,41.60459478540565,0 - - - * - * - */ - - private File createTempCsv( File kmlFile) throws ParserConfigurationException, SAXException, IOException{ - - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); // Compliant - factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); // compliant - DocumentBuilder builder = factory.newDocumentBuilder(); - InputSource is = new InputSource(new FileReader(kmlFile)); - Document doc = builder.parse(is); - - NodeList placemarks = doc.getElementsByTagName("Placemark"); //$NON-NLS-1$ - - StringBuilder sb = new StringBuilder(); - - sb.append( CollectEarthProjectFileCreator.PLACEHOLDER_ID_COLUMNS_HEADER ).append(",").append( "YCoordinate" ).append(",").append( "XCoordinate" ).append(CollectEarthProjectFileCreator.PLACEHOLDER_FOR_EXTRA_COLUMNS_HEADER).append( "\r\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - - - for (int i = 0; i < placemarks.getLength(); i++) { - Node placemark = placemarks.item(i); - - if (placemark.hasChildNodes()) { - NodeList childNodes = placemark.getChildNodes(); - String longitude = "",latitude = "",name = "Placemark"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - name = "placemark" + i; - for (int j=0; j> missingPlotData) { + + File tempFile = null; + try { + tempFile = File.createTempFile("missingPlots", ".csv"); + tempFile.deleteOnExit(); + + try( BufferedWriter fw = new BufferedWriter(new OutputStreamWriter( new FileOutputStream( tempFile ), StandardCharsets.UTF_8 ) ) ){ + Set files = missingPlotData.keySet(); + for (String plotFile : files) { + + List missingPlots = missingPlotData.get(plotFile); + StringBuilder csvRow = new StringBuilder(""); + for (String[] plotData : missingPlots) { + csvRow = new StringBuilder(""); + for (String data : plotData) { + + data = data.replaceAll("\"", "\\\""); - public String processPoint(Node placemarkChild) { - NodeList lookAtNodes = placemarkChild.getChildNodes(); - String coordinates = null; - for (int h=0; h> allPlotDataInFiles, Map> missingPlotDataPerFile ) { + + String missingPlotsText = getTextMissingPlots( missingPlotDataPerFile ); - public boolean prompToOpenKml( JFrame frame) throws ParserConfigurationException, SAXException, IOException{ - this.frame = frame; - // Choose the file in the file system - File kmlFile = chooseKmlFile(); - boolean kmlImported = false; - if( kmlFile != null ){ - kmlImported = loadFromKml(frame, kmlFile); + int totalPlots = 0; + int missingPlots = 0; + for (Entry> entry : allPlotDataInFiles.entrySet() ) { + if( entry.getValue()!=null){ + totalPlots += entry.getValue().size(); + missingPlots += missingPlotDataPerFile.get( entry.getKey() ).size(); + } } + missingPlotsText += "\n\n"+Messages.getString("MissingPlotsListener.10") + totalPlots ; //$NON-NLS-1$ //$NON-NLS-2$ - return kmlImported; + if( missingPlots > 0 ){ + missingPlotsText += "\n"+Messages.getString("MissingPlotsListener.12") + missingPlots; //$NON-NLS-1$ //$NON-NLS-2$ + }else{ + missingPlotsText +="\n"+Messages.getString("MissingPlotsListener.14"); //$NON-NLS-1$ //$NON-NLS-2$ + } + return missingPlotsText; } + private String getTextMissingPlots(Map> missingPlotDataPerFile) { + StringBuilder missingPlots = new StringBuilder(""); //$NON-NLS-1$ - public boolean loadFromKml( JFrame frame, File kmlFile) throws ParserConfigurationException, SAXException, IOException{ + Set files = missingPlotDataPerFile.keySet(); + for (String fileToBeChecked : files) { - // Convert the KML into a CSV and save it into a temporary file - File convertedCsvFile = createTempCsv( kmlFile ); + missingPlots.append("\n").append(Messages.getString("MissingPlotsListener.5")).append( fileToBeChecked ).append(" : \n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - JOptionPane.showMessageDialog(frame, Messages.getString("KmlImportService.13")); //$NON-NLS-1$ - - // Move the temporary file to the current project folder - //File finalCsvFile = moveCsvToProjectFolder(convertedCsvFile, kmlFile.getName()); - File finalCsvFile = selectAndSaveToCsv(convertedCsvFile, kmlFile.getName()); + List missingIds = missingPlotDataPerFile.get(fileToBeChecked); + if( missingIds.isEmpty() ){ + missingPlots.append("COMPLETE "); //$NON-NLS-1$ + } - boolean loaded = false; - if( finalCsvFile != null ){ - // Load the plots from the CSV - localPropertiesService.setValue(EarthProperty.SAMPLE_FILE, finalCsvFile.getAbsolutePath()); - loaded = true; + for (String[] missingPlotData : missingIds) { + missingPlots.append( missingPlotData[0] ).append(","); //$NON-NLS-1$ } - return loaded; + missingPlots = missingPlots.delete(missingPlots.length() - 1, missingPlots.length() ).append("\n"); //$NON-NLS-1$ + + } + return missingPlots.toString(); + } + + private CSVReader getCsvReader(String csvFile) throws FileNotFoundException { + CSVReader reader; + final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8)); //$NON-NLS-1$ + reader = new CSVReader(bufferedReader); + return reader; } - private File selectAndSaveToCsv(File convertedCsvFile, String name) throws IOException { - final File[] saveToCsvFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, true, false, "importedFromKml_" + name + ".csv", //$NON-NLS-1$ //$NON-NLS-2$ - localPropertiesService, frame); - if( saveToCsvFile != null && saveToCsvFile.length == 1 ){ - FileUtils.copyFile( convertedCsvFile, saveToCsvFile[0]); - return saveToCsvFile[0]; - }else { - return null; + private List getPlotDataFromFile(String plotCoordinateFile) { + final List plotData = new ArrayList<>(); + try { + final CSVReader plotCsvReader = getCsvReader(plotCoordinateFile); + String[] csvRow; + while ((csvRow = plotCsvReader.readNext()) != null) { + plotData.add(csvRow); + } + } catch (final FileNotFoundException e) { + logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ + } catch (final IOException e) { + logger.error("Error reading CSV line", e); //$NON-NLS-1$ + } catch (CsvValidationException e) { + logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ } + return plotData; } -/* private File moveCsvToProjectFolder(File convertedCsvFile, String originalKmlFilename) throws IOException { - File destination = new File( earthProjectsService.getProjectsFolder() + File.separator + "generatedFromKml_" + originalKmlFilename + ".ced"); - FileUtils.copyFile( convertedCsvFile, destination); - return destination; - }*/ + private String[] getKeys(String[] plotData ) { + List keyAttributeDefinitions = earthSurveyService.getCollectSurvey().getSchema().getRootEntityDefinitions().get(0) + .getKeyAttributeDefinitions(); + String[] keys = new String[keyAttributeDefinitions.size()]; + int i = 0; + for (AttributeDefinition keyAttributeDefinition : keyAttributeDefinitions) { + keys[i] = plotData[i++]; + } + return keys; + } + + public Map> getMissingPlotsByFile(Map> plotDataByFIle, InfiniteProgressMonitor infiniteProgressMonitor) { + final Map> missingPlotIdsByFile = new HashMap<>(); + final Set plotFiles = plotDataByFIle.keySet(); + int i = 0; + for (final String plotFile : plotFiles) { + + infiniteProgressMonitor.updateProgress( ++i, plotFiles.size(), StringUtils.getFilename( StringUtils.cleanPath( plotFile ) ) ); + missingPlotIdsByFile.put(plotFile, new ArrayList()); + + final List plotDataInFile = plotDataByFIle.get(plotFile); + for (final String[] plotData : plotDataInFile) { + + String[] plotKeys = getKeys(plotData); + // If the plot ID is not contained in the DB + // And if the latitude cell (second column) actually contains a number (so it is not a header row) + if (!isIdActivelySavedInDB(plotKeys) && isLatitudeANumber(plotData[ plotKeys.length ]) ) { + missingPlotIdsByFile.get(plotFile).add(plotData); + } + } + } + return missingPlotIdsByFile; + } - private File chooseKmlFile() { - final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults(DataFormat.KML_FILE, false, false, null, - localPropertiesService, frame); + private boolean isLatitudeANumber(String string) { + try{ + Float.parseFloat(string); + return true; + }catch (Exception e){ + return false; + } + } - if( selectedPlotFiles != null && selectedPlotFiles.length == 1 ){ - return selectedPlotFiles[0]; - }else { - return null; + public Map> getPlotDataByFile(File[] selectedPlotFiles) { + final Map> plotDataByFile = new HashMap<>(); + if( selectedPlotFiles != null && selectedPlotFiles.length > 0 ) { + for (final File file : selectedPlotFiles) { + plotDataByFile.put(file.getAbsolutePath(), getPlotDataFromFile(file.getAbsolutePath())); + } } + return plotDataByFile; } + private boolean isIdActivelySavedInDB(String[] plotIds) { + RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey(), EarthConstants.ROOT_ENTITY_NAME); + rf.setKeyValues( Arrays.asList( plotIds )); + final List summaries = recordManager.loadSummaries(rf); + + if( summaries != null && summaries.size() == 1 ){ + CollectRecord record = recordManager.load(earthSurveyService.getCollectSurvey(), summaries.get(0).getId(), Step.ENTRY); + BooleanAttribute node = null; + try { + node = record.findNodeByPath("/plot/"+ EarthConstants.ACTIVELY_SAVED_ATTRIBUTE_NAME); //$NON-NLS-1$ + } catch (Exception e) { + logger.error("No actively_saved information found", e); //$NON-NLS-1$ + } + return (node != null && !node.isEmpty() && node.getValue().getValue() ); + }else{ + return false; + } + } } From 8dd4aa3ff76af05ca5cc4cdd7a097bfdc16e1a7a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:31 +0100 Subject: [PATCH 0170/1620] New translations IPCCGeneratorService.java (French) --- .../earth/app/view/Messages_fr.properties | 256 +++++------------- 1 file changed, 67 insertions(+), 189 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 1c73e5c34d..c1b9c5db00 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,227 +1,105 @@ package org.openforis.collect.earth.app.service; -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStreamWriter; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - -import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.app.view.Messages; -import org.openforis.collect.manager.RecordManager; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.CollectRecordSummary; -import org.openforis.collect.model.RecordFilter; -import org.openforis.idm.metamodel.AttributeDefinition; -import org.openforis.idm.model.BooleanAttribute; +import org.openforis.collect.earth.ipcc.IPCCGenerator; +import org.openforis.collect.earth.ipcc.IPCCGeneratorException; +import org.openforis.collect.earth.ipcc.RdbExportException; +import org.openforis.collect.model.CollectSurvey; +import org.openforis.collect.relational.CollectRDBPublisher; +import org.openforis.collect.relational.CollectRdbException; +import org.openforis.idm.metamodel.NodeDefinition; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.springframework.util.StringUtils; - -import com.opencsv.CSVReader; -import com.opencsv.exceptions.CsvValidationException; @Component -public class MissingPlotService { +public class IPCCGeneratorService extends GenerateDatabase{ @Autowired - private RecordManager recordManager; + RDBExporter rdbExporter; + + @Autowired + CollectRDBPublisher collectRDBPublisher; @Autowired - private EarthSurveyService earthSurveyService; + EarthSurveyService earthSurveyService; - private final Logger logger = LoggerFactory.getLogger(MissingPlotService.class); + @Autowired + public LocalPropertiesService localPropertiesService; - public File getMissingPlotFile(Map> missingPlotData) { + @Autowired + BrowserService browserService; - File tempFile = null; - try { - tempFile = File.createTempFile("missingPlots", ".csv"); - tempFile.deleteOnExit(); + @Autowired + private IPCCGenerator ipccGenerator; + + final Logger logger = LoggerFactory.getLogger(IPCCGeneratorService.class); - try( BufferedWriter fw = new BufferedWriter(new OutputStreamWriter( new FileOutputStream( tempFile ), StandardCharsets.UTF_8 ) ) ){ - Set files = missingPlotData.keySet(); - for (String plotFile : files) { + public void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws RdbExportException { - List missingPlots = missingPlotData.get(plotFile); - StringBuilder csvRow = new StringBuilder(""); - for (String[] plotData : missingPlots) { - csvRow = new StringBuilder(""); - for (String data : plotData) { + try { - data = data.replaceAll("\"", "\\\""); + try { - csvRow.append("\"").append(data).append("\"").append(","); - } - csvRow.delete(csvRow.length()-1, csvRow.length()).append("\n"); - fw.write(csvRow.toString()); + if ( + (localPropertiesService.isUsingSqliteDB() && !getZippedProjectDB( ExportType.IPCC ).exists()) + || + isRefreshDatabase() + ) { + + // The user clicked on the option to refresh the database, or there is no + // previous copy of the Saiku DB + // Generate the DB file + ipccGenerator.generateRDB( earthSurveyService.getCollectSurvey(), progressListener); + + try { + // Save the DB file in a zipped file to extends GenerateDatabase keep for the next usages + replaceZippedProjectDB( ExportType.IPCC ); + } catch (Exception e) { + logger.error("Error while refreshing the Zipped content of the project IPCC DB", e); } - } - } - - } catch (IOException e) { - logger.error("Error while producing the CSV with the missing plots" ); - } - - return tempFile; - } - public String getMissingPlotInformation(Map> allPlotDataInFiles, Map> missingPlotDataPerFile ) { - - String missingPlotsText = getTextMissingPlots( missingPlotDataPerFile ); - - int totalPlots = 0; - int missingPlots = 0; - for (Entry> entry : allPlotDataInFiles.entrySet() ) { - if( entry.getValue()!=null){ - totalPlots += entry.getValue().size(); - missingPlots += missingPlotDataPerFile.get( entry.getKey() ).size(); - } - } - missingPlotsText += "\n\n"+Messages.getString("MissingPlotsListener.10") + totalPlots ; //$NON-NLS-1$ //$NON-NLS-2$ - - if( missingPlots > 0 ){ - missingPlotsText += "\n"+Messages.getString("MissingPlotsListener.12") + missingPlots; //$NON-NLS-1$ //$NON-NLS-2$ - }else{ - missingPlotsText +="\n"+Messages.getString("MissingPlotsListener.14"); //$NON-NLS-1$ //$NON-NLS-2$ - } - return missingPlotsText; - } - - private String getTextMissingPlots(Map> missingPlotDataPerFile) { - StringBuilder missingPlots = new StringBuilder(""); //$NON-NLS-1$ - - Set files = missingPlotDataPerFile.keySet(); - for (String fileToBeChecked : files) { - missingPlots.append("\n").append(Messages.getString("MissingPlotsListener.5")).append( fileToBeChecked ).append(" : \n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - - List missingIds = missingPlotDataPerFile.get(fileToBeChecked); - if( missingIds.isEmpty() ){ - missingPlots.append("COMPLETE "); //$NON-NLS-1$ - } - - for (String[] missingPlotData : missingIds) { - missingPlots.append( missingPlotData[0] ).append(","); //$NON-NLS-1$ - } + } else if (getZippedProjectDB(ExportType.IPCC).exists()) { + // If the zipped version of the project exists ( and the user clicked on the + // option to not refresh it) then restore this last version of the data + if (localPropertiesService.isUsingSqliteDB()) { + restoreZippedProjectDB(ExportType.IPCC); + } + } + + ipccGenerator.produceOutputs( earthSurveyService.getCollectSurvey(), progressListener ); - missingPlots = missingPlots.delete(missingPlots.length() - 1, missingPlots.length() ).append("\n"); //$NON-NLS-1$ + } catch (final IPCCGeneratorException e) { + logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ + } + } catch (final CollectRdbException e) { + logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ } - return missingPlots.toString(); } - private CSVReader getCsvReader(String csvFile) throws FileNotFoundException { - CSVReader reader; - final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8)); //$NON-NLS-1$ - reader = new CSVReader(bufferedReader); - return reader; - } - private List getPlotDataFromFile(String plotCoordinateFile) { - final List plotData = new ArrayList<>(); - try { - final CSVReader plotCsvReader = getCsvReader(plotCoordinateFile); - String[] csvRow; - while ((csvRow = plotCsvReader.readNext()) != null) { - plotData.add(csvRow); - } - } catch (final FileNotFoundException e) { - logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ - } catch (final IOException e) { - logger.error("Error reading CSV line", e); //$NON-NLS-1$ - } catch (CsvValidationException e) { - logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ - } - return plotData; + public static boolean surveyContains(String nodeName, CollectSurvey survey) { + NodeDefinition nodeDefForNAme = survey.getSchema().findNodeDefinition( nodeDef -> nodeDef.getName().equals(nodeName) ); + return nodeDefForNAme != null; } - private String[] getKeys(String[] plotData ) { - List keyAttributeDefinitions = earthSurveyService.getCollectSurvey().getSchema().getRootEntityDefinitions().get(0) - .getKeyAttributeDefinitions(); - String[] keys = new String[keyAttributeDefinitions.size()]; - int i = 0; - for (AttributeDefinition keyAttributeDefinition : keyAttributeDefinitions) { - keys[i] = plotData[i++]; - } - return keys; - } - - public Map> getMissingPlotsByFile(Map> plotDataByFIle, InfiniteProgressMonitor infiniteProgressMonitor) { - final Map> missingPlotIdsByFile = new HashMap<>(); - final Set plotFiles = plotDataByFIle.keySet(); - int i = 0; - for (final String plotFile : plotFiles) { - - infiniteProgressMonitor.updateProgress( ++i, plotFiles.size(), StringUtils.getFilename( StringUtils.cleanPath( plotFile ) ) ); - missingPlotIdsByFile.put(plotFile, new ArrayList()); - final List plotDataInFile = plotDataByFIle.get(plotFile); - for (final String[] plotData : plotDataInFile) { - - String[] plotKeys = getKeys(plotData); - // If the plot ID is not contained in the DB - // And if the latitude cell (second column) actually contains a number (so it is not a header row) - if (!isIdActivelySavedInDB(plotKeys) && isLatitudeANumber(plotData[ plotKeys.length ]) ) { - missingPlotIdsByFile.get(plotFile).add(plotData); - } - } - } - return missingPlotIdsByFile; - } - - private boolean isLatitudeANumber(String string) { - try{ - Float.parseFloat(string); - return true; - }catch (Exception e){ - return false; - } + @Override + public LocalPropertiesService getLocalPropertiesService() { + return localPropertiesService; } - public Map> getPlotDataByFile(File[] selectedPlotFiles) { - final Map> plotDataByFile = new HashMap<>(); - if( selectedPlotFiles != null && selectedPlotFiles.length > 0 ) { - for (final File file : selectedPlotFiles) { - plotDataByFile.put(file.getAbsolutePath(), getPlotDataFromFile(file.getAbsolutePath())); - } - } - return plotDataByFile; + @Override + public EarthSurveyService getEarthSurveyService() { + return earthSurveyService; } - private boolean isIdActivelySavedInDB(String[] plotIds) { - RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey(), EarthConstants.ROOT_ENTITY_NAME); - rf.setKeyValues( Arrays.asList( plotIds )); - final List summaries = recordManager.loadSummaries(rf); - - if( summaries != null && summaries.size() == 1 ){ - CollectRecord record = recordManager.load(earthSurveyService.getCollectSurvey(), summaries.get(0).getId(), Step.ENTRY); - BooleanAttribute node = null; - try { - node = record.findNodeByPath("/plot/"+ EarthConstants.ACTIVELY_SAVED_ATTRIBUTE_NAME); //$NON-NLS-1$ - } catch (Exception e) { - logger.error("No actively_saved information found", e); //$NON-NLS-1$ - } - return (node != null && !node.isEmpty() && node.getValue().getValue() ); - }else{ - return false; - } + @Override + public RDBExporter getRdbExporter() { + return rdbExporter; } -} +} \ No newline at end of file From 4f9b004c07f0ef339cd862f85d945cc6b2610164 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:32 +0100 Subject: [PATCH 0171/1620] New translations MissingPlotService.java (Spanish) --- .../earth/app/view/Messages_es.properties | 348 +++++++++--------- 1 file changed, 176 insertions(+), 172 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 9fb3d5284e..1c73e5c34d 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,223 +1,227 @@ package org.openforis.collect.earth.app.service; -import java.io.BufferedInputStream; +import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.FileOutputStream; -import java.io.FileReader; import java.io.IOException; +import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; -import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.xml.XMLConstants; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; - -import org.apache.commons.io.FileUtils; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.app.view.DataFormat; -import org.openforis.collect.earth.app.view.JFileChooserExistsAware; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; import org.openforis.collect.earth.app.view.Messages; -import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; -import org.openforis.collect.io.metadata.collectearth.CollectEarthProjectFileCreator; +import org.openforis.collect.manager.RecordManager; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.CollectRecordSummary; +import org.openforis.collect.model.RecordFilter; +import org.openforis.idm.metamodel.AttributeDefinition; +import org.openforis.idm.model.BooleanAttribute; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.w3c.dom.Document; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; +import org.springframework.util.StringUtils; -@Component -public class KmlImportService { +import com.opencsv.CSVReader; +import com.opencsv.exceptions.CsvValidationException; - Map namesAndTimes = new HashMap<>(); +@Component +public class MissingPlotService { @Autowired - LocalPropertiesService localPropertiesService; + private RecordManager recordManager; @Autowired - EarthProjectsService earthProjectsService; + private EarthSurveyService earthSurveyService; - @Autowired - EarthSurveyService earthSurveyService; - - private JFrame frame; - - /* - * - - one - - -5.89991123135449 - 41.60459478540565 - 0 - -1.425202537313517e-006 - 0 - 177418.783783632 - relativeToSeaFloor - - #m_ylw-pushpin - - 1 - -5.899911231354489,41.60459478540565,0 - - - * - * - */ - - private File createTempCsv( File kmlFile) throws ParserConfigurationException, SAXException, IOException{ - - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); // Compliant - factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); // compliant - DocumentBuilder builder = factory.newDocumentBuilder(); - InputSource is = new InputSource(new FileReader(kmlFile)); - Document doc = builder.parse(is); - - NodeList placemarks = doc.getElementsByTagName("Placemark"); //$NON-NLS-1$ - - StringBuilder sb = new StringBuilder(); - - sb.append( CollectEarthProjectFileCreator.PLACEHOLDER_ID_COLUMNS_HEADER ).append(",").append( "YCoordinate" ).append(",").append( "XCoordinate" ).append(CollectEarthProjectFileCreator.PLACEHOLDER_FOR_EXTRA_COLUMNS_HEADER).append( "\r\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - - - for (int i = 0; i < placemarks.getLength(); i++) { - Node placemark = placemarks.item(i); - - if (placemark.hasChildNodes()) { - NodeList childNodes = placemark.getChildNodes(); - String longitude = "",latitude = "",name = "Placemark"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - name = "placemark" + i; - for (int j=0; j> missingPlotData) { + + File tempFile = null; + try { + tempFile = File.createTempFile("missingPlots", ".csv"); + tempFile.deleteOnExit(); + + try( BufferedWriter fw = new BufferedWriter(new OutputStreamWriter( new FileOutputStream( tempFile ), StandardCharsets.UTF_8 ) ) ){ + Set files = missingPlotData.keySet(); + for (String plotFile : files) { + + List missingPlots = missingPlotData.get(plotFile); + StringBuilder csvRow = new StringBuilder(""); + for (String[] plotData : missingPlots) { + csvRow = new StringBuilder(""); + for (String data : plotData) { + + data = data.replaceAll("\"", "\\\""); - public String processPoint(Node placemarkChild) { - NodeList lookAtNodes = placemarkChild.getChildNodes(); - String coordinates = null; - for (int h=0; h> allPlotDataInFiles, Map> missingPlotDataPerFile ) { + + String missingPlotsText = getTextMissingPlots( missingPlotDataPerFile ); - public boolean prompToOpenKml( JFrame frame) throws ParserConfigurationException, SAXException, IOException{ - this.frame = frame; - // Choose the file in the file system - File kmlFile = chooseKmlFile(); - boolean kmlImported = false; - if( kmlFile != null ){ - kmlImported = loadFromKml(frame, kmlFile); + int totalPlots = 0; + int missingPlots = 0; + for (Entry> entry : allPlotDataInFiles.entrySet() ) { + if( entry.getValue()!=null){ + totalPlots += entry.getValue().size(); + missingPlots += missingPlotDataPerFile.get( entry.getKey() ).size(); + } } + missingPlotsText += "\n\n"+Messages.getString("MissingPlotsListener.10") + totalPlots ; //$NON-NLS-1$ //$NON-NLS-2$ - return kmlImported; + if( missingPlots > 0 ){ + missingPlotsText += "\n"+Messages.getString("MissingPlotsListener.12") + missingPlots; //$NON-NLS-1$ //$NON-NLS-2$ + }else{ + missingPlotsText +="\n"+Messages.getString("MissingPlotsListener.14"); //$NON-NLS-1$ //$NON-NLS-2$ + } + return missingPlotsText; } + private String getTextMissingPlots(Map> missingPlotDataPerFile) { + StringBuilder missingPlots = new StringBuilder(""); //$NON-NLS-1$ - public boolean loadFromKml( JFrame frame, File kmlFile) throws ParserConfigurationException, SAXException, IOException{ + Set files = missingPlotDataPerFile.keySet(); + for (String fileToBeChecked : files) { - // Convert the KML into a CSV and save it into a temporary file - File convertedCsvFile = createTempCsv( kmlFile ); + missingPlots.append("\n").append(Messages.getString("MissingPlotsListener.5")).append( fileToBeChecked ).append(" : \n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - JOptionPane.showMessageDialog(frame, Messages.getString("KmlImportService.13")); //$NON-NLS-1$ - - // Move the temporary file to the current project folder - //File finalCsvFile = moveCsvToProjectFolder(convertedCsvFile, kmlFile.getName()); - File finalCsvFile = selectAndSaveToCsv(convertedCsvFile, kmlFile.getName()); + List missingIds = missingPlotDataPerFile.get(fileToBeChecked); + if( missingIds.isEmpty() ){ + missingPlots.append("COMPLETE "); //$NON-NLS-1$ + } - boolean loaded = false; - if( finalCsvFile != null ){ - // Load the plots from the CSV - localPropertiesService.setValue(EarthProperty.SAMPLE_FILE, finalCsvFile.getAbsolutePath()); - loaded = true; + for (String[] missingPlotData : missingIds) { + missingPlots.append( missingPlotData[0] ).append(","); //$NON-NLS-1$ } - return loaded; + missingPlots = missingPlots.delete(missingPlots.length() - 1, missingPlots.length() ).append("\n"); //$NON-NLS-1$ + + } + return missingPlots.toString(); + } + + private CSVReader getCsvReader(String csvFile) throws FileNotFoundException { + CSVReader reader; + final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8)); //$NON-NLS-1$ + reader = new CSVReader(bufferedReader); + return reader; } - private File selectAndSaveToCsv(File convertedCsvFile, String name) throws IOException { - final File[] saveToCsvFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, true, false, "importedFromKml_" + name + ".csv", //$NON-NLS-1$ //$NON-NLS-2$ - localPropertiesService, frame); - if( saveToCsvFile != null && saveToCsvFile.length == 1 ){ - FileUtils.copyFile( convertedCsvFile, saveToCsvFile[0]); - return saveToCsvFile[0]; - }else { - return null; + private List getPlotDataFromFile(String plotCoordinateFile) { + final List plotData = new ArrayList<>(); + try { + final CSVReader plotCsvReader = getCsvReader(plotCoordinateFile); + String[] csvRow; + while ((csvRow = plotCsvReader.readNext()) != null) { + plotData.add(csvRow); + } + } catch (final FileNotFoundException e) { + logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ + } catch (final IOException e) { + logger.error("Error reading CSV line", e); //$NON-NLS-1$ + } catch (CsvValidationException e) { + logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ } + return plotData; } -/* private File moveCsvToProjectFolder(File convertedCsvFile, String originalKmlFilename) throws IOException { - File destination = new File( earthProjectsService.getProjectsFolder() + File.separator + "generatedFromKml_" + originalKmlFilename + ".ced"); - FileUtils.copyFile( convertedCsvFile, destination); - return destination; - }*/ + private String[] getKeys(String[] plotData ) { + List keyAttributeDefinitions = earthSurveyService.getCollectSurvey().getSchema().getRootEntityDefinitions().get(0) + .getKeyAttributeDefinitions(); + String[] keys = new String[keyAttributeDefinitions.size()]; + int i = 0; + for (AttributeDefinition keyAttributeDefinition : keyAttributeDefinitions) { + keys[i] = plotData[i++]; + } + return keys; + } + + public Map> getMissingPlotsByFile(Map> plotDataByFIle, InfiniteProgressMonitor infiniteProgressMonitor) { + final Map> missingPlotIdsByFile = new HashMap<>(); + final Set plotFiles = plotDataByFIle.keySet(); + int i = 0; + for (final String plotFile : plotFiles) { + + infiniteProgressMonitor.updateProgress( ++i, plotFiles.size(), StringUtils.getFilename( StringUtils.cleanPath( plotFile ) ) ); + missingPlotIdsByFile.put(plotFile, new ArrayList()); + + final List plotDataInFile = plotDataByFIle.get(plotFile); + for (final String[] plotData : plotDataInFile) { + + String[] plotKeys = getKeys(plotData); + // If the plot ID is not contained in the DB + // And if the latitude cell (second column) actually contains a number (so it is not a header row) + if (!isIdActivelySavedInDB(plotKeys) && isLatitudeANumber(plotData[ plotKeys.length ]) ) { + missingPlotIdsByFile.get(plotFile).add(plotData); + } + } + } + return missingPlotIdsByFile; + } - private File chooseKmlFile() { - final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults(DataFormat.KML_FILE, false, false, null, - localPropertiesService, frame); + private boolean isLatitudeANumber(String string) { + try{ + Float.parseFloat(string); + return true; + }catch (Exception e){ + return false; + } + } - if( selectedPlotFiles != null && selectedPlotFiles.length == 1 ){ - return selectedPlotFiles[0]; - }else { - return null; + public Map> getPlotDataByFile(File[] selectedPlotFiles) { + final Map> plotDataByFile = new HashMap<>(); + if( selectedPlotFiles != null && selectedPlotFiles.length > 0 ) { + for (final File file : selectedPlotFiles) { + plotDataByFile.put(file.getAbsolutePath(), getPlotDataFromFile(file.getAbsolutePath())); + } } + return plotDataByFile; } + private boolean isIdActivelySavedInDB(String[] plotIds) { + RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey(), EarthConstants.ROOT_ENTITY_NAME); + rf.setKeyValues( Arrays.asList( plotIds )); + final List summaries = recordManager.loadSummaries(rf); + + if( summaries != null && summaries.size() == 1 ){ + CollectRecord record = recordManager.load(earthSurveyService.getCollectSurvey(), summaries.get(0).getId(), Step.ENTRY); + BooleanAttribute node = null; + try { + node = record.findNodeByPath("/plot/"+ EarthConstants.ACTIVELY_SAVED_ATTRIBUTE_NAME); //$NON-NLS-1$ + } catch (Exception e) { + logger.error("No actively_saved information found", e); //$NON-NLS-1$ + } + return (node != null && !node.isEmpty() && node.getValue().getValue() ); + }else{ + return false; + } + } } From dc7ed5c7301b42cfb979b119bb40c27eff7992e2 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:35 +0100 Subject: [PATCH 0172/1620] New translations MissingPlotService.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 348 +++++++++--------- 1 file changed, 176 insertions(+), 172 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 9fb3d5284e..1c73e5c34d 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,223 +1,227 @@ package org.openforis.collect.earth.app.service; -import java.io.BufferedInputStream; +import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.FileOutputStream; -import java.io.FileReader; import java.io.IOException; +import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; -import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.xml.XMLConstants; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; - -import org.apache.commons.io.FileUtils; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.app.view.DataFormat; -import org.openforis.collect.earth.app.view.JFileChooserExistsAware; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; import org.openforis.collect.earth.app.view.Messages; -import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; -import org.openforis.collect.io.metadata.collectearth.CollectEarthProjectFileCreator; +import org.openforis.collect.manager.RecordManager; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.CollectRecordSummary; +import org.openforis.collect.model.RecordFilter; +import org.openforis.idm.metamodel.AttributeDefinition; +import org.openforis.idm.model.BooleanAttribute; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.w3c.dom.Document; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; +import org.springframework.util.StringUtils; -@Component -public class KmlImportService { +import com.opencsv.CSVReader; +import com.opencsv.exceptions.CsvValidationException; - Map namesAndTimes = new HashMap<>(); +@Component +public class MissingPlotService { @Autowired - LocalPropertiesService localPropertiesService; + private RecordManager recordManager; @Autowired - EarthProjectsService earthProjectsService; + private EarthSurveyService earthSurveyService; - @Autowired - EarthSurveyService earthSurveyService; - - private JFrame frame; - - /* - * - - one - - -5.89991123135449 - 41.60459478540565 - 0 - -1.425202537313517e-006 - 0 - 177418.783783632 - relativeToSeaFloor - - #m_ylw-pushpin - - 1 - -5.899911231354489,41.60459478540565,0 - - - * - * - */ - - private File createTempCsv( File kmlFile) throws ParserConfigurationException, SAXException, IOException{ - - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); // Compliant - factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); // compliant - DocumentBuilder builder = factory.newDocumentBuilder(); - InputSource is = new InputSource(new FileReader(kmlFile)); - Document doc = builder.parse(is); - - NodeList placemarks = doc.getElementsByTagName("Placemark"); //$NON-NLS-1$ - - StringBuilder sb = new StringBuilder(); - - sb.append( CollectEarthProjectFileCreator.PLACEHOLDER_ID_COLUMNS_HEADER ).append(",").append( "YCoordinate" ).append(",").append( "XCoordinate" ).append(CollectEarthProjectFileCreator.PLACEHOLDER_FOR_EXTRA_COLUMNS_HEADER).append( "\r\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - - - for (int i = 0; i < placemarks.getLength(); i++) { - Node placemark = placemarks.item(i); - - if (placemark.hasChildNodes()) { - NodeList childNodes = placemark.getChildNodes(); - String longitude = "",latitude = "",name = "Placemark"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - name = "placemark" + i; - for (int j=0; j> missingPlotData) { + + File tempFile = null; + try { + tempFile = File.createTempFile("missingPlots", ".csv"); + tempFile.deleteOnExit(); + + try( BufferedWriter fw = new BufferedWriter(new OutputStreamWriter( new FileOutputStream( tempFile ), StandardCharsets.UTF_8 ) ) ){ + Set files = missingPlotData.keySet(); + for (String plotFile : files) { + + List missingPlots = missingPlotData.get(plotFile); + StringBuilder csvRow = new StringBuilder(""); + for (String[] plotData : missingPlots) { + csvRow = new StringBuilder(""); + for (String data : plotData) { + + data = data.replaceAll("\"", "\\\""); - public String processPoint(Node placemarkChild) { - NodeList lookAtNodes = placemarkChild.getChildNodes(); - String coordinates = null; - for (int h=0; h> allPlotDataInFiles, Map> missingPlotDataPerFile ) { + + String missingPlotsText = getTextMissingPlots( missingPlotDataPerFile ); - public boolean prompToOpenKml( JFrame frame) throws ParserConfigurationException, SAXException, IOException{ - this.frame = frame; - // Choose the file in the file system - File kmlFile = chooseKmlFile(); - boolean kmlImported = false; - if( kmlFile != null ){ - kmlImported = loadFromKml(frame, kmlFile); + int totalPlots = 0; + int missingPlots = 0; + for (Entry> entry : allPlotDataInFiles.entrySet() ) { + if( entry.getValue()!=null){ + totalPlots += entry.getValue().size(); + missingPlots += missingPlotDataPerFile.get( entry.getKey() ).size(); + } } + missingPlotsText += "\n\n"+Messages.getString("MissingPlotsListener.10") + totalPlots ; //$NON-NLS-1$ //$NON-NLS-2$ - return kmlImported; + if( missingPlots > 0 ){ + missingPlotsText += "\n"+Messages.getString("MissingPlotsListener.12") + missingPlots; //$NON-NLS-1$ //$NON-NLS-2$ + }else{ + missingPlotsText +="\n"+Messages.getString("MissingPlotsListener.14"); //$NON-NLS-1$ //$NON-NLS-2$ + } + return missingPlotsText; } + private String getTextMissingPlots(Map> missingPlotDataPerFile) { + StringBuilder missingPlots = new StringBuilder(""); //$NON-NLS-1$ - public boolean loadFromKml( JFrame frame, File kmlFile) throws ParserConfigurationException, SAXException, IOException{ + Set files = missingPlotDataPerFile.keySet(); + for (String fileToBeChecked : files) { - // Convert the KML into a CSV and save it into a temporary file - File convertedCsvFile = createTempCsv( kmlFile ); + missingPlots.append("\n").append(Messages.getString("MissingPlotsListener.5")).append( fileToBeChecked ).append(" : \n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - JOptionPane.showMessageDialog(frame, Messages.getString("KmlImportService.13")); //$NON-NLS-1$ - - // Move the temporary file to the current project folder - //File finalCsvFile = moveCsvToProjectFolder(convertedCsvFile, kmlFile.getName()); - File finalCsvFile = selectAndSaveToCsv(convertedCsvFile, kmlFile.getName()); + List missingIds = missingPlotDataPerFile.get(fileToBeChecked); + if( missingIds.isEmpty() ){ + missingPlots.append("COMPLETE "); //$NON-NLS-1$ + } - boolean loaded = false; - if( finalCsvFile != null ){ - // Load the plots from the CSV - localPropertiesService.setValue(EarthProperty.SAMPLE_FILE, finalCsvFile.getAbsolutePath()); - loaded = true; + for (String[] missingPlotData : missingIds) { + missingPlots.append( missingPlotData[0] ).append(","); //$NON-NLS-1$ } - return loaded; + missingPlots = missingPlots.delete(missingPlots.length() - 1, missingPlots.length() ).append("\n"); //$NON-NLS-1$ + + } + return missingPlots.toString(); + } + + private CSVReader getCsvReader(String csvFile) throws FileNotFoundException { + CSVReader reader; + final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8)); //$NON-NLS-1$ + reader = new CSVReader(bufferedReader); + return reader; } - private File selectAndSaveToCsv(File convertedCsvFile, String name) throws IOException { - final File[] saveToCsvFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, true, false, "importedFromKml_" + name + ".csv", //$NON-NLS-1$ //$NON-NLS-2$ - localPropertiesService, frame); - if( saveToCsvFile != null && saveToCsvFile.length == 1 ){ - FileUtils.copyFile( convertedCsvFile, saveToCsvFile[0]); - return saveToCsvFile[0]; - }else { - return null; + private List getPlotDataFromFile(String plotCoordinateFile) { + final List plotData = new ArrayList<>(); + try { + final CSVReader plotCsvReader = getCsvReader(plotCoordinateFile); + String[] csvRow; + while ((csvRow = plotCsvReader.readNext()) != null) { + plotData.add(csvRow); + } + } catch (final FileNotFoundException e) { + logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ + } catch (final IOException e) { + logger.error("Error reading CSV line", e); //$NON-NLS-1$ + } catch (CsvValidationException e) { + logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ } + return plotData; } -/* private File moveCsvToProjectFolder(File convertedCsvFile, String originalKmlFilename) throws IOException { - File destination = new File( earthProjectsService.getProjectsFolder() + File.separator + "generatedFromKml_" + originalKmlFilename + ".ced"); - FileUtils.copyFile( convertedCsvFile, destination); - return destination; - }*/ + private String[] getKeys(String[] plotData ) { + List keyAttributeDefinitions = earthSurveyService.getCollectSurvey().getSchema().getRootEntityDefinitions().get(0) + .getKeyAttributeDefinitions(); + String[] keys = new String[keyAttributeDefinitions.size()]; + int i = 0; + for (AttributeDefinition keyAttributeDefinition : keyAttributeDefinitions) { + keys[i] = plotData[i++]; + } + return keys; + } + + public Map> getMissingPlotsByFile(Map> plotDataByFIle, InfiniteProgressMonitor infiniteProgressMonitor) { + final Map> missingPlotIdsByFile = new HashMap<>(); + final Set plotFiles = plotDataByFIle.keySet(); + int i = 0; + for (final String plotFile : plotFiles) { + + infiniteProgressMonitor.updateProgress( ++i, plotFiles.size(), StringUtils.getFilename( StringUtils.cleanPath( plotFile ) ) ); + missingPlotIdsByFile.put(plotFile, new ArrayList()); + + final List plotDataInFile = plotDataByFIle.get(plotFile); + for (final String[] plotData : plotDataInFile) { + + String[] plotKeys = getKeys(plotData); + // If the plot ID is not contained in the DB + // And if the latitude cell (second column) actually contains a number (so it is not a header row) + if (!isIdActivelySavedInDB(plotKeys) && isLatitudeANumber(plotData[ plotKeys.length ]) ) { + missingPlotIdsByFile.get(plotFile).add(plotData); + } + } + } + return missingPlotIdsByFile; + } - private File chooseKmlFile() { - final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults(DataFormat.KML_FILE, false, false, null, - localPropertiesService, frame); + private boolean isLatitudeANumber(String string) { + try{ + Float.parseFloat(string); + return true; + }catch (Exception e){ + return false; + } + } - if( selectedPlotFiles != null && selectedPlotFiles.length == 1 ){ - return selectedPlotFiles[0]; - }else { - return null; + public Map> getPlotDataByFile(File[] selectedPlotFiles) { + final Map> plotDataByFile = new HashMap<>(); + if( selectedPlotFiles != null && selectedPlotFiles.length > 0 ) { + for (final File file : selectedPlotFiles) { + plotDataByFile.put(file.getAbsolutePath(), getPlotDataFromFile(file.getAbsolutePath())); + } } + return plotDataByFile; } + private boolean isIdActivelySavedInDB(String[] plotIds) { + RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey(), EarthConstants.ROOT_ENTITY_NAME); + rf.setKeyValues( Arrays.asList( plotIds )); + final List summaries = recordManager.loadSummaries(rf); + + if( summaries != null && summaries.size() == 1 ){ + CollectRecord record = recordManager.load(earthSurveyService.getCollectSurvey(), summaries.get(0).getId(), Step.ENTRY); + BooleanAttribute node = null; + try { + node = record.findNodeByPath("/plot/"+ EarthConstants.ACTIVELY_SAVED_ATTRIBUTE_NAME); //$NON-NLS-1$ + } catch (Exception e) { + logger.error("No actively_saved information found", e); //$NON-NLS-1$ + } + return (node != null && !node.isEmpty() && node.getValue().getValue() ); + }else{ + return false; + } + } } From 9902d997985cb46cfbfbae4842f45ffa0c706c66 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:36 +0100 Subject: [PATCH 0173/1620] New translations MissingPlotService.java (English) --- .../earth/app/view/Messages_en.properties | 528 +++++------------- 1 file changed, 152 insertions(+), 376 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 884dd929bc..1c73e5c34d 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,451 +1,227 @@ package org.openforis.collect.earth.app.service; +import java.io.BufferedReader; +import java.io.BufferedWriter; import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.desktop.ServerController; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; import org.openforis.collect.earth.app.view.Messages; -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.collect.earth.sampler.processor.CircleKmlGenerator; -import org.openforis.collect.earth.sampler.processor.HexagonKmlGenerator; -import org.openforis.collect.earth.sampler.processor.KmlGenerator; -import org.openforis.collect.earth.sampler.processor.KmzGenerator; -import org.openforis.collect.earth.sampler.processor.NfiFourCirclesGenerator; -import org.openforis.collect.earth.sampler.processor.NfiThreeCirclesGenerator; -import org.openforis.collect.earth.sampler.processor.NfmaKmlGenerator; -import org.openforis.collect.earth.sampler.processor.PolygonGeojsonGenerator; -import org.openforis.collect.earth.sampler.processor.PolygonKmlGenerator; -import org.openforis.collect.earth.sampler.processor.PolygonWktGenerator; -import org.openforis.collect.earth.sampler.processor.SquareKmlGenerator; -import org.openforis.collect.earth.sampler.processor.SquareWithCirclesKmlGenerator; -import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; -import org.openforis.collect.earth.sampler.utils.KmlGenerationException; +import org.openforis.collect.manager.RecordManager; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.CollectRecordSummary; +import org.openforis.collect.model.RecordFilter; +import org.openforis.idm.metamodel.AttributeDefinition; +import org.openforis.idm.model.BooleanAttribute; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; import com.opencsv.CSVReader; import com.opencsv.exceptions.CsvValidationException; -import freemarker.template.TemplateException; - @Component -public class KmlGeneratorService { +public class MissingPlotService { @Autowired - LocalPropertiesService localPropertiesService; + private RecordManager recordManager; @Autowired - EarthSurveyService earthSurveyService; - - Logger logger = LoggerFactory.getLogger(KmlGeneratorService.class); - - public static final String KML_RESULTING_TEMP_FILE = EarthConstants.GENERATED_FOLDER + File.separator + "plots.kml"; //$NON-NLS-1$ - public static final String KMZ_FILE_PATH = EarthConstants.GENERATED_FOLDER + File.separator + "gePlugin.kmz"; //$NON-NLS-1$ - public static final String KML_NETWORK_LINK_TEMPLATE = "resources/loadApp.fmt"; //$NON-NLS-1$ - public static final String KML_NETWORK_LINK_STARTER = EarthConstants.GENERATED_FOLDER + "/loadApp.kml"; //$NON-NLS-1$ - - public static interface PolygonTest{ - Boolean isPolygon(String[] strColumns); - } - - public void generateKmlFile() throws IOException, KmlGenerationException, CsvValidationException{ - checkFilesExist(); - generatePlacemarksKmzFile(); + private EarthSurveyService earthSurveyService; - } - - private void checkFilesExist() throws KmlGenerationException { + private final Logger logger = LoggerFactory.getLogger(MissingPlotService.class); - fixUserDirectory(); + public File getMissingPlotFile(Map> missingPlotData) { - final String csvFilePath = getLocalProperties().getCsvFile(); - final String balloonPath = getLocalProperties().getBalloonFile(); - final String templatePath = getLocalProperties().getTemplateFile(); - boolean filesExist = true; - String errorMessage = "Error generating the KML file for Google Earth.
"; //$NON-NLS-1$ - File csvFile = null; - File balloon = null; - File template = null; + File tempFile = null; try { - csvFile = new File(csvFilePath); - balloon = new File(balloonPath); - template = new File(templatePath); - } catch (final Exception e) { - logger.error("One of the definition files is not defined", e); //$NON-NLS-1$ - } - if (csvFile != null && !csvFile.exists()) { - errorMessage += Messages.getString("EarthApp.21") //$NON-NLS-1$ - + csvFile.getAbsolutePath() + "

"; //$NON-NLS-1$ - filesExist = false; - } else if (csvFile == null) { - errorMessage += Messages.getString("EarthApp.23"); //$NON-NLS-1$ - filesExist = false; - } + tempFile = File.createTempFile("missingPlots", ".csv"); + tempFile.deleteOnExit(); + + try( BufferedWriter fw = new BufferedWriter(new OutputStreamWriter( new FileOutputStream( tempFile ), StandardCharsets.UTF_8 ) ) ){ + Set files = missingPlotData.keySet(); + for (String plotFile : files) { + + List missingPlots = missingPlotData.get(plotFile); + StringBuilder csvRow = new StringBuilder(""); + for (String[] plotData : missingPlots) { + csvRow = new StringBuilder(""); + for (String data : plotData) { + + data = data.replaceAll("\"", "\\\""); + + csvRow.append("\"").append(data).append("\"").append(","); + } + csvRow.delete(csvRow.length()-1, csvRow.length()).append("\n"); + fw.write(csvRow.toString()); + } + } + } - if (template != null && !template.exists()) { - errorMessage += Messages.getString("EarthApp.24") //$NON-NLS-1$ - + template.getAbsolutePath() + "

"; //$NON-NLS-1$ - filesExist = false; - } else if (template == null) { - errorMessage += Messages.getString("EarthApp.26"); //$NON-NLS-1$ - filesExist = false; + } catch (IOException e) { + logger.error("Error while producing the CSV with the missing plots" ); } - if (balloon != null && !balloon.exists()) { - errorMessage += Messages.getString("EarthApp.27") + balloon.getAbsolutePath() //$NON-NLS-1$ - + "

"; //$NON-NLS-1$ - filesExist = false; - } else if (balloon == null) { - errorMessage += Messages.getString("EarthApp.29"); //$NON-NLS-1$ - filesExist = false; - } + return tempFile; + } + public String getMissingPlotInformation(Map> allPlotDataInFiles, Map> missingPlotDataPerFile ) { - errorMessage += Messages.getString("EarthApp.30"); //$NON-NLS-1$ + String missingPlotsText = getTextMissingPlots( missingPlotDataPerFile ); - if( !filesExist ){ - throw new KmlGenerationException(errorMessage); + int totalPlots = 0; + int missingPlots = 0; + for (Entry> entry : allPlotDataInFiles.entrySet() ) { + if( entry.getValue()!=null){ + totalPlots += entry.getValue().size(); + missingPlots += missingPlotDataPerFile.get( entry.getKey() ).size(); + } } - } - - private LocalPropertiesService getLocalProperties() { - return localPropertiesService; - } + missingPlotsText += "\n\n"+Messages.getString("MissingPlotsListener.10") + totalPlots ; //$NON-NLS-1$ //$NON-NLS-2$ - private void copyContentsToGeneratedFolder(String folderToInclude) throws IOException { - final File sourceDir = new File(folderToInclude); - final File targetDir = new File(EarthConstants.GENERATED_FOLDER + File.separator + sourceDir.getName()); - FileUtils.copyDirectory(sourceDir, targetDir); + if( missingPlots > 0 ){ + missingPlotsText += "\n"+Messages.getString("MissingPlotsListener.12") + missingPlots; //$NON-NLS-1$ //$NON-NLS-2$ + }else{ + missingPlotsText +="\n"+Messages.getString("MissingPlotsListener.14"); //$NON-NLS-1$ //$NON-NLS-2$ + } + return missingPlotsText; } - private void fixUserDirectory() { - final String csvFilePath = getLocalProperties().getCsvFile(); - final String balloonPath = getLocalProperties().getBalloonFile(); - final String templatePath = getLocalProperties().getTemplateFile(); - final String metadataPath = getLocalProperties().getImdFile(); - - File csvFile = null; - File balloon = null; - File template = null; - File idmFile = null; - try { - csvFile = new File(csvFilePath); - balloon = new File(balloonPath); - template = new File(templatePath); - idmFile = new File(metadataPath); + private String getTextMissingPlots(Map> missingPlotDataPerFile) { + StringBuilder missingPlots = new StringBuilder(""); //$NON-NLS-1$ - final String prefixUserFolder = FolderFinder.getCollectEarthDataFolder() + File.separator; + Set files = missingPlotDataPerFile.keySet(); + for (String fileToBeChecked : files) { - if (!csvFile.exists()) { - final File otherFile = new File(prefixUserFolder + getLocalProperties().getCsvFile()); - if (otherFile.exists()) { - getLocalProperties().setValue(EarthProperty.SAMPLE_FILE, otherFile.getAbsolutePath()); - } - } + missingPlots.append("\n").append(Messages.getString("MissingPlotsListener.5")).append( fileToBeChecked ).append(" : \n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - if (!balloon.exists()) { - final File otherFile = new File(prefixUserFolder + getLocalProperties().getBalloonFile()); - if (otherFile.exists()) { - getLocalProperties().setValue(EarthProperty.BALLOON_TEMPLATE_KEY, otherFile.getAbsolutePath()); - } + List missingIds = missingPlotDataPerFile.get(fileToBeChecked); + if( missingIds.isEmpty() ){ + missingPlots.append("COMPLETE "); //$NON-NLS-1$ } - if (!template.exists()) { - final File otherFile = new File(prefixUserFolder + getLocalProperties().getTemplateFile()); - if (otherFile.exists()) { - getLocalProperties().setValue(EarthProperty.KML_TEMPLATE_KEY, otherFile.getAbsolutePath()); - } + for (String[] missingPlotData : missingIds) { + missingPlots.append( missingPlotData[0] ).append(","); //$NON-NLS-1$ } - if (!idmFile.exists()) { - final File otherFile = new File(prefixUserFolder + getLocalProperties().getImdFile()); - if (otherFile.exists()) { - getLocalProperties().setValue(EarthProperty.METADATA_FILE, otherFile.getAbsolutePath()); - } - } + missingPlots = missingPlots.delete(missingPlots.length() - 1, missingPlots.length() ).append("\n"); //$NON-NLS-1$ - } catch (final Exception e) { - logger.error("One of the definition files is not defined", e); //$NON-NLS-1$ } - + return missingPlots.toString(); } - - private int parseInt( String intNumber ){ - int i = 0; - try{ - if( StringUtils.isNoneBlank( intNumber ) ) { - i = Integer.parseInt( intNumber ); - } - }catch(Exception e){ - logger.error( "Error parsing integer number" ); - } - return i; + private CSVReader getCsvReader(String csvFile) throws FileNotFoundException { + CSVReader reader; + final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8)); //$NON-NLS-1$ + reader = new CSVReader(bufferedReader); + return reader; } - public KmlGenerator getKmlGenerator() throws KmlGenerationException, CsvValidationException { - KmlGenerator generateKml =null; - final String crsSystem = getLocalProperties().getCrs(); - final Integer innerPointSide = parseInt(getLocalProperties().getValue(EarthProperty.INNER_SUBPLOT_SIDE)); - final Integer largeCentralPlotSide = parseInt(getLocalProperties().getValue(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)); - final String distanceToBuffers = getLocalProperties().getValue(EarthProperty.DISTANCE_TO_BUFFERS); - SAMPLE_SHAPE plotShape = getLocalProperties().getSampleShape(); - final String hostAddress = ServerController.getHostAddress(getLocalProperties().getHost(), getLocalProperties().getPort()); - - final float distanceBetweenSamplePoints; - final float distanceToPlotBoundaries; - String dBSP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS); + private List getPlotDataFromFile(String plotCoordinateFile) { + final List plotData = new ArrayList<>(); try { - distanceBetweenSamplePoints = Float.parseFloat(dBSP); - } catch (Exception e) { - logger.error("Error parsing distance between sample points , wrong value : " + dBSP,e); - EarthApp.showMessage("Attention: Check earth.properties file. The distance between sample points must be a number! You have set it to : " + dBSP); //$NON-NLS-1$ - return null; + final CSVReader plotCsvReader = getCsvReader(plotCoordinateFile); + String[] csvRow; + while ((csvRow = plotCsvReader.readNext()) != null) { + plotData.add(csvRow); + } + } catch (final FileNotFoundException e) { + logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ + } catch (final IOException e) { + logger.error("Error reading CSV line", e); //$NON-NLS-1$ + } catch (CsvValidationException e) { + logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ } + return plotData; + } - - String dToPlotB = getLocalProperties().getValue(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES); - try { - distanceToPlotBoundaries = Float.parseFloat(dToPlotB); - } catch (Exception e) { - logger.error("Error parsing distance between plots , wrong value : " + dToPlotB,e); - EarthApp.showMessage("Attention: Check earth.properties file. The distance between sample point and border of the plot must be a number ! You have set it to : " + dToPlotB); //$NON-NLS-1$ - return null; + private String[] getKeys(String[] plotData ) { + List keyAttributeDefinitions = earthSurveyService.getCollectSurvey().getSchema().getRootEntityDefinitions().get(0) + .getKeyAttributeDefinitions(); + String[] keys = new String[keyAttributeDefinitions.size()]; + int i = 0; + for (AttributeDefinition keyAttributeDefinition : keyAttributeDefinitions) { + keys[i] = plotData[i++]; } - final String localPort = getLocalProperties().getLocalPort(); - final String numberOfSamplingPlots = getLocalProperties().getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT); - final String csvFile = getLocalProperties().getCsvFile(); + return keys; + } - int numberOfPoints = 25; - if ((numberOfSamplingPlots != null) && (numberOfSamplingPlots.trim().length() > 0)) { - numberOfPoints = parseInt(numberOfSamplingPlots.trim()); - } + public Map> getMissingPlotsByFile(Map> plotDataByFIle, InfiniteProgressMonitor infiniteProgressMonitor) { + final Map> missingPlotIdsByFile = new HashMap<>(); + final Set plotFiles = plotDataByFIle.keySet(); + int i = 0; + for (final String plotFile : plotFiles) { - try{ - // If there is a polygon column then the type of plot shape is assumed to be POLYGON - if( csvContainsKml(csvFile)){ - plotShape = SAMPLE_SHAPE.KML_POLYGON; - }else if( csvContainsWkt(csvFile)){ - plotShape = SAMPLE_SHAPE.WKT_POLYGON; - }else if( csvContainsGeoJson(csvFile)){ - plotShape = SAMPLE_SHAPE.GEOJSON_POLYGON; - } + infiniteProgressMonitor.updateProgress( ++i, plotFiles.size(), StringUtils.getFilename( StringUtils.cleanPath( plotFile ) ) ); + missingPlotIdsByFile.put(plotFile, new ArrayList()); - if (plotShape.equals(SAMPLE_SHAPE.CIRCLE)) { - generateKml = new CircleKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, distanceBetweenSamplePoints ); - } else if (plotShape.equals(SAMPLE_SHAPE.NFMA)) { - generateKml = new NfmaKmlGenerator(crsSystem, hostAddress, localPort, 150, false); - } else if (plotShape.equals(SAMPLE_SHAPE.NFMA_250)) { - generateKml = new NfmaKmlGenerator(crsSystem, hostAddress, localPort, 250, true); - } else if (plotShape.equals(SAMPLE_SHAPE.NFI_THREE_CIRCLES)) { - - String dBP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS ); - float distanceBetweenPlots; - try { - distanceBetweenPlots = Float.parseFloat(dBP); - } catch (Exception e) { - logger.error("Error parsing distance between plots , wrong value : " + dBP,e); - EarthApp.showMessage("Attention: Check earth.properties file. The distance between plots must be a number! You have set it to : " + dBP); //$NON-NLS-1$ - return null; - } + final List plotDataInFile = plotDataByFIle.get(plotFile); + for (final String[] plotData : plotDataInFile) { - generateKml = new NfiThreeCirclesGenerator(crsSystem, hostAddress, localPort, innerPointSide, distanceBetweenSamplePoints, distanceBetweenPlots ); - }else if (plotShape.equals(SAMPLE_SHAPE.NFI_FOUR_CIRCLES)) { - - String dBP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS ); - float distanceBetweenPlots; - try { - distanceBetweenPlots = Float.parseFloat(dBP); - } catch (Exception e) { - logger.error(String.format("Error parsing distance between plots , wrong value : %s", dBP) ,e); - EarthApp.showMessage("Attention: Check earth.properties file. The distance between plots must be a number! You have set it to : " + dBP); //$NON-NLS-1$ - return null; + String[] plotKeys = getKeys(plotData); + // If the plot ID is not contained in the DB + // And if the latitude cell (second column) actually contains a number (so it is not a header row) + if (!isIdActivelySavedInDB(plotKeys) && isLatitudeANumber(plotData[ plotKeys.length ]) ) { + missingPlotIdsByFile.get(plotFile).add(plotData); } - - generateKml = new NfiFourCirclesGenerator(crsSystem, hostAddress, localPort, innerPointSide, distanceBetweenSamplePoints, distanceBetweenPlots ); - }else if (plotShape.equals(SAMPLE_SHAPE.HEXAGON)) { - generateKml = new HexagonKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, distanceBetweenSamplePoints ); - } else if (plotShape.equals(SAMPLE_SHAPE.SQUARE_CIRCLE)) { - generateKml = new SquareWithCirclesKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, - distanceBetweenSamplePoints, distanceToPlotBoundaries); - } else if (plotShape.equals(SAMPLE_SHAPE.KML_POLYGON)) { - generateKml = new PolygonKmlGenerator(crsSystem, hostAddress, localPort); - } else if (plotShape.equals(SAMPLE_SHAPE.GEOJSON_POLYGON)) { - generateKml = new PolygonGeojsonGenerator(crsSystem, hostAddress, localPort); - }else if (plotShape.equals(SAMPLE_SHAPE.WKT_POLYGON)) { - generateKml = new PolygonWktGenerator(crsSystem, hostAddress, localPort); - }else { - generateKml = new SquareKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, - distanceBetweenSamplePoints, distanceToPlotBoundaries, largeCentralPlotSide, distanceToBuffers); } - }catch(IOException e){ - logger.error("Error generating KML", e ); - } - - if( generateKml == null ) { - throw new KmlGenerationException("Error getting the KML generator for parameters " + plotShape.name() ); } - - return generateKml; + return missingPlotIdsByFile; } - - private boolean csvContains(String csvFile, PolygonTest test ) throws IOException, CsvValidationException { - try( CSVReader csvReader = CsvReaderUtils.getCsvReader(csvFile) ){ - csvReader.readNext(); // Ignore it might be the column headers - - String[] secondLine = csvReader.readNext(); - if( secondLine != null && !CsvReaderUtils.onlyEmptyCells(secondLine) ){ - return test.isPolygon( secondLine ); - } - + private boolean isLatitudeANumber(String string) { + try{ + Float.parseFloat(string); + return true; + }catch (Exception e){ return false; } } - private boolean csvContainsGeoJson(String csvFile) throws IOException, CsvValidationException { - return - csvContains( - csvFile, - csvColumns -> new PolygonGeojsonGenerator(null, null, null ).isGeoJsonPolygonColumnFound(csvColumns) != null - ); - } - - private boolean csvContainsWkt(String csvFile) throws IOException, CsvValidationException { - return csvContains( - csvFile, - csvColumns -> new PolygonWktGenerator(null, null, null ).isWktPolygonColumnFound(csvColumns) != null - ); - } - - private boolean csvContainsKml(String csvFile) throws IOException, CsvValidationException { - return csvContains( - csvFile, - csvColumns -> new PolygonKmlGenerator(null, null, null ).isKmlPolygonColumnFound(csvColumns) != null - ); - } - - private void generateKml() throws KmlGenerationException, IOException, CsvValidationException { - - KmlGenerator kmlGenerator = null; - kmlGenerator = getKmlGenerator(); - - if ( kmlGenerator == null ){ - throw new KmlGenerationException("Error while generating KML"); - } - - final String csvFile = getLocalProperties().getCsvFile(); - String balloon = getLocalProperties().getBalloonFile(); - final String template = getLocalProperties().getTemplateFile(); - - // In case the user sets up the OPEN_BALLOON_IN_FIREFOX flag to - // true. Meaning that a small ballon opens in the placemark which in - // its turn - // opens a firefox browser with the real form - final Boolean openBalloonInFirefox = Boolean.valueOf(getLocalProperties().getValue(EarthProperty.OPEN_BALLOON_IN_BROWSER)); - if (Boolean.TRUE.equals( openBalloonInFirefox) ) { - String alternativeBalloon = getLocalProperties().getValue(EarthProperty.ALTERNATIVE_BALLOON_FOR_BROWSER); - if( !StringUtils.isBlank( alternativeBalloon ) ){ - balloon = alternativeBalloon; + public Map> getPlotDataByFile(File[] selectedPlotFiles) { + final Map> plotDataByFile = new HashMap<>(); + if( selectedPlotFiles != null && selectedPlotFiles.length > 0 ) { + for (final File file : selectedPlotFiles) { + plotDataByFile.put(file.getAbsolutePath(), getPlotDataFromFile(file.getAbsolutePath())); } } - - // Using all of the files that compose the final KML it is generated and stores in KML_RESULTING_TEMP_FILE - kmlGenerator.generateKmlFile(KML_RESULTING_TEMP_FILE, csvFile, balloon, template, earthSurveyService.getCollectSurvey()); - updateFilesUsedChecksum(); - - } - - private void updateFilesUsedChecksum() throws IOException { - final String csvFile = getLocalProperties().getCsvFile(); - final String balloon = getLocalProperties().getBalloonFile(); - final String template = getLocalProperties().getTemplateFile(); - - getLocalProperties().saveBalloonFileChecksum(CollectEarthUtils.getMd5FromFile(balloon)); - getLocalProperties().saveCsvFileCehcksum(CollectEarthUtils.getMd5FromFile(csvFile)); - getLocalProperties().saveTemplateFileChecksum(CollectEarthUtils.getMd5FromFile(template)); - } - - public void generateLoaderKmlFile() throws IOException, TemplateException { - - getLocalProperties().saveGeneratedOn(System.currentTimeMillis() + ""); //$NON-NLS-1$ - - final Map data = new HashMap<>(); - data.put("host", ServerController.getHostAddress(getLocalProperties().getHost(), getLocalProperties().getLocalPort())); //$NON-NLS-1$ - data.put("kmlGeneratedOn", getLocalProperties().getGeneratedOn()); //$NON-NLS-1$ - data.put("surveyName", getLocalProperties().getValue(EarthProperty.SURVEY_NAME)); //$NON-NLS-1$ - data.put("plotFileName", KmlGenerator.getCsvFileName(getLocalProperties().getValue(EarthProperty.SAMPLE_FILE))); //$NON-NLS-1$ - - FreemarkerTemplateUtils.applyTemplate(new File(KML_NETWORK_LINK_TEMPLATE), new File(KML_NETWORK_LINK_STARTER), data); - } - - private boolean isKmlUpToDate() throws IOException { - - final String csvFile = getLocalProperties().getCsvFile(); - final String balloon = getLocalProperties().getBalloonFile(); - final String template = getLocalProperties().getTemplateFile(); - - boolean upToDate = true; - if (!getLocalProperties().getBalloonFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(balloon)) - || !getLocalProperties().getTemplateFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(template)) - || !getLocalProperties().getCsvFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(csvFile))) { - upToDate = false; - } - - final File kmzFile = new File(KmlGeneratorService.KMZ_FILE_PATH); - if (!kmzFile.exists()) { - upToDate = false; - } - - return upToDate; - - } - - public void generatePlacemarksKmzFile() throws IOException, KmlGenerationException, CsvValidationException { - generatePlacemarksKmzFile(false); + return plotDataByFile; } - public void generatePlacemarksKmzFile(boolean forceRegeneration ) throws IOException, KmlGenerationException, CsvValidationException { - - logger.info("START - Generate KMZ file"); //$NON-NLS-1$ - - if (forceRegeneration || !isKmlUpToDate()) { - - generateKml(); - - final KmzGenerator kmzGenerator = new KmzGenerator(); - - final String balloon = getLocalProperties().getBalloonFile(); - final File balloonFile = new File(balloon); - final String folderToInclude = balloonFile.getParent() + File.separator + EarthConstants.FOLDER_COPIED_TO_KMZ; + private boolean isIdActivelySavedInDB(String[] plotIds) { + RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey(), EarthConstants.ROOT_ENTITY_NAME); + rf.setKeyValues( Arrays.asList( plotIds )); + final List summaries = recordManager.loadSummaries(rf); - kmzGenerator.generateKmzFile(KMZ_FILE_PATH, KML_RESULTING_TEMP_FILE, folderToInclude); - logger.info("KMZ File generated : {}", KMZ_FILE_PATH); //$NON-NLS-1$ - - copyContentsToGeneratedFolder(folderToInclude); - - final File kmlFile = new File(KML_RESULTING_TEMP_FILE); - if (kmlFile.exists()) { - final boolean deleted = kmlFile.delete(); - if (deleted) { - logger.info("KML File deleted : {}", KML_RESULTING_TEMP_FILE); //$NON-NLS-1$ - } else { - throw new IOException("The KML file could not be deleted at " + kmlFile.getPath()); //$NON-NLS-1$ - } + if( summaries != null && summaries.size() == 1 ){ + CollectRecord record = recordManager.load(earthSurveyService.getCollectSurvey(), summaries.get(0).getId(), Step.ENTRY); + BooleanAttribute node = null; + try { + node = record.findNodeByPath("/plot/"+ EarthConstants.ACTIVELY_SAVED_ATTRIBUTE_NAME); //$NON-NLS-1$ + } catch (Exception e) { + logger.error("No actively_saved information found", e); //$NON-NLS-1$ } - + return (node != null && !node.isEmpty() && node.getValue().getValue() ); + }else{ + return false; } - logger.info("END - Generate KMZ file"); //$NON-NLS-1$ } + } From 09957b97f6e7b3a1b26feea66df67529ce1418a5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:37 +0100 Subject: [PATCH 0174/1620] New translations PreloadedFilesService.java (French) --- .../earth/app/view/Messages_fr.properties | 121 +++++------------- 1 file changed, 29 insertions(+), 92 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index c1b9c5db00..8d225e803d 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,105 +1,42 @@ package org.openforis.collect.earth.app.service; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.ipcc.IPCCGenerator; -import org.openforis.collect.earth.ipcc.IPCCGeneratorException; -import org.openforis.collect.earth.ipcc.RdbExportException; -import org.openforis.collect.model.CollectSurvey; -import org.openforis.collect.relational.CollectRDBPublisher; -import org.openforis.collect.relational.CollectRdbException; -import org.openforis.idm.metamodel.NodeDefinition; +import java.io.File; +import java.io.IOException; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import org.apache.commons.io.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ @Component -public class IPCCGeneratorService extends GenerateDatabase{ - - @Autowired - RDBExporter rdbExporter; - - @Autowired - CollectRDBPublisher collectRDBPublisher; - - @Autowired - EarthSurveyService earthSurveyService; +public class PreloadedFilesService { - @Autowired - public LocalPropertiesService localPropertiesService; + private final Logger logger = LoggerFactory.getLogger(PreloadedFilesService.class); - @Autowired - BrowserService browserService; - - @Autowired - private IPCCGenerator ipccGenerator; + private final Map filesInMemory; - final Logger logger = LoggerFactory.getLogger(IPCCGeneratorService.class); - - public void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws RdbExportException { - - try { - + public PreloadedFilesService() { + filesInMemory = new ConcurrentHashMap<>(); + } + + public byte[] getFileContent(File file) { + byte[] fileContents = filesInMemory.get(file.getPath()); + if (fileContents == null) { + byte[] content = new byte[0]; try { - - if ( - (localPropertiesService.isUsingSqliteDB() && !getZippedProjectDB( ExportType.IPCC ).exists()) - || - isRefreshDatabase() - ) { - - // The user clicked on the option to refresh the database, or there is no - // previous copy of the Saiku DB - // Generate the DB file - ipccGenerator.generateRDB( earthSurveyService.getCollectSurvey(), progressListener); - - try { - // Save the DB file in a zipped file to extends GenerateDatabase keep for the next usages - replaceZippedProjectDB( ExportType.IPCC ); - } catch (Exception e) { - logger.error("Error while refreshing the Zipped content of the project IPCC DB", e); - } - - } else if (getZippedProjectDB(ExportType.IPCC).exists()) { - // If the zipped version of the project exists ( and the user clicked on the - // option to not refresh it) then restore this last version of the data - if (localPropertiesService.isUsingSqliteDB()) { - restoreZippedProjectDB(ExportType.IPCC); - } - } - - ipccGenerator.produceOutputs( earthSurveyService.getCollectSurvey(), progressListener ); - - } catch (final IPCCGeneratorException e) { - logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ - } - - } catch (final CollectRdbException e) { - logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ + content = FileUtils.readFileToByteArray(file); + filesInMemory.put(file.getPath(), content); + } catch (IOException e) { + logger.error("Problems while reading the file " + file.getPath() + " was not found.", e); + } + fileContents = content; } + return fileContents; } - - - - public static boolean surveyContains(String nodeName, CollectSurvey survey) { - NodeDefinition nodeDefForNAme = survey.getSchema().findNodeDefinition( nodeDef -> nodeDef.getName().equals(nodeName) ); - return nodeDefForNAme != null; - } - - - @Override - public LocalPropertiesService getLocalPropertiesService() { - return localPropertiesService; - } - - @Override - public EarthSurveyService getEarthSurveyService() { - return earthSurveyService; - } - - @Override - public RDBExporter getRdbExporter() { - return rdbExporter; - } - -} \ No newline at end of file +} From 4b67c2c957ab5bb5b6ae67ca91c89be13b49a756 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:38 +0100 Subject: [PATCH 0175/1620] New translations PreloadedFilesService.java (Spanish) --- .../earth/app/view/Messages_es.properties | 231 ++---------------- 1 file changed, 23 insertions(+), 208 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 1c73e5c34d..8d225e803d 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,227 +1,42 @@ package org.openforis.collect.earth.app.service; -import java.io.BufferedReader; -import java.io.BufferedWriter; import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStreamWriter; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.app.view.Messages; -import org.openforis.collect.manager.RecordManager; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.CollectRecordSummary; -import org.openforis.collect.model.RecordFilter; -import org.openforis.idm.metamodel.AttributeDefinition; -import org.openforis.idm.model.BooleanAttribute; +import org.apache.commons.io.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.springframework.util.StringUtils; - -import com.opencsv.CSVReader; -import com.opencsv.exceptions.CsvValidationException; +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ @Component -public class MissingPlotService { - - @Autowired - private RecordManager recordManager; - - @Autowired - private EarthSurveyService earthSurveyService; - - private final Logger logger = LoggerFactory.getLogger(MissingPlotService.class); - - public File getMissingPlotFile(Map> missingPlotData) { - - File tempFile = null; - try { - tempFile = File.createTempFile("missingPlots", ".csv"); - tempFile.deleteOnExit(); - - try( BufferedWriter fw = new BufferedWriter(new OutputStreamWriter( new FileOutputStream( tempFile ), StandardCharsets.UTF_8 ) ) ){ - Set files = missingPlotData.keySet(); - for (String plotFile : files) { - - List missingPlots = missingPlotData.get(plotFile); - StringBuilder csvRow = new StringBuilder(""); - for (String[] plotData : missingPlots) { - csvRow = new StringBuilder(""); - for (String data : plotData) { +public class PreloadedFilesService { - data = data.replaceAll("\"", "\\\""); + private final Logger logger = LoggerFactory.getLogger(PreloadedFilesService.class); - csvRow.append("\"").append(data).append("\"").append(","); - } - csvRow.delete(csvRow.length()-1, csvRow.length()).append("\n"); - fw.write(csvRow.toString()); - } - } - } - - } catch (IOException e) { - logger.error("Error while producing the CSV with the missing plots" ); - } - - return tempFile; + private final Map filesInMemory; + + public PreloadedFilesService() { + filesInMemory = new ConcurrentHashMap<>(); } - public String getMissingPlotInformation(Map> allPlotDataInFiles, Map> missingPlotDataPerFile ) { - - String missingPlotsText = getTextMissingPlots( missingPlotDataPerFile ); - - int totalPlots = 0; - int missingPlots = 0; - for (Entry> entry : allPlotDataInFiles.entrySet() ) { - if( entry.getValue()!=null){ - totalPlots += entry.getValue().size(); - missingPlots += missingPlotDataPerFile.get( entry.getKey() ).size(); - } - } - missingPlotsText += "\n\n"+Messages.getString("MissingPlotsListener.10") + totalPlots ; //$NON-NLS-1$ //$NON-NLS-2$ - - if( missingPlots > 0 ){ - missingPlotsText += "\n"+Messages.getString("MissingPlotsListener.12") + missingPlots; //$NON-NLS-1$ //$NON-NLS-2$ - }else{ - missingPlotsText +="\n"+Messages.getString("MissingPlotsListener.14"); //$NON-NLS-1$ //$NON-NLS-2$ - } - return missingPlotsText; - } - - private String getTextMissingPlots(Map> missingPlotDataPerFile) { - StringBuilder missingPlots = new StringBuilder(""); //$NON-NLS-1$ - - Set files = missingPlotDataPerFile.keySet(); - for (String fileToBeChecked : files) { - - missingPlots.append("\n").append(Messages.getString("MissingPlotsListener.5")).append( fileToBeChecked ).append(" : \n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - - List missingIds = missingPlotDataPerFile.get(fileToBeChecked); - if( missingIds.isEmpty() ){ - missingPlots.append("COMPLETE "); //$NON-NLS-1$ - } - - for (String[] missingPlotData : missingIds) { - missingPlots.append( missingPlotData[0] ).append(","); //$NON-NLS-1$ - } - - missingPlots = missingPlots.delete(missingPlots.length() - 1, missingPlots.length() ).append("\n"); //$NON-NLS-1$ - - } - return missingPlots.toString(); - } - - private CSVReader getCsvReader(String csvFile) throws FileNotFoundException { - CSVReader reader; - final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8)); //$NON-NLS-1$ - reader = new CSVReader(bufferedReader); - return reader; - } - - - private List getPlotDataFromFile(String plotCoordinateFile) { - final List plotData = new ArrayList<>(); - try { - final CSVReader plotCsvReader = getCsvReader(plotCoordinateFile); - String[] csvRow; - while ((csvRow = plotCsvReader.readNext()) != null) { - plotData.add(csvRow); - } - } catch (final FileNotFoundException e) { - logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ - } catch (final IOException e) { - logger.error("Error reading CSV line", e); //$NON-NLS-1$ - } catch (CsvValidationException e) { - logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ - } - return plotData; - } - - private String[] getKeys(String[] plotData ) { - List keyAttributeDefinitions = earthSurveyService.getCollectSurvey().getSchema().getRootEntityDefinitions().get(0) - .getKeyAttributeDefinitions(); - String[] keys = new String[keyAttributeDefinitions.size()]; - int i = 0; - for (AttributeDefinition keyAttributeDefinition : keyAttributeDefinitions) { - keys[i] = plotData[i++]; - } - return keys; - } - - public Map> getMissingPlotsByFile(Map> plotDataByFIle, InfiniteProgressMonitor infiniteProgressMonitor) { - final Map> missingPlotIdsByFile = new HashMap<>(); - final Set plotFiles = plotDataByFIle.keySet(); - int i = 0; - for (final String plotFile : plotFiles) { - - infiniteProgressMonitor.updateProgress( ++i, plotFiles.size(), StringUtils.getFilename( StringUtils.cleanPath( plotFile ) ) ); - missingPlotIdsByFile.put(plotFile, new ArrayList()); - - final List plotDataInFile = plotDataByFIle.get(plotFile); - for (final String[] plotData : plotDataInFile) { - - String[] plotKeys = getKeys(plotData); - // If the plot ID is not contained in the DB - // And if the latitude cell (second column) actually contains a number (so it is not a header row) - if (!isIdActivelySavedInDB(plotKeys) && isLatitudeANumber(plotData[ plotKeys.length ]) ) { - missingPlotIdsByFile.get(plotFile).add(plotData); - } - } - } - return missingPlotIdsByFile; - } - - private boolean isLatitudeANumber(String string) { - try{ - Float.parseFloat(string); - return true; - }catch (Exception e){ - return false; - } - } - - public Map> getPlotDataByFile(File[] selectedPlotFiles) { - final Map> plotDataByFile = new HashMap<>(); - if( selectedPlotFiles != null && selectedPlotFiles.length > 0 ) { - for (final File file : selectedPlotFiles) { - plotDataByFile.put(file.getAbsolutePath(), getPlotDataFromFile(file.getAbsolutePath())); - } - } - return plotDataByFile; - } - - private boolean isIdActivelySavedInDB(String[] plotIds) { - RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey(), EarthConstants.ROOT_ENTITY_NAME); - rf.setKeyValues( Arrays.asList( plotIds )); - final List summaries = recordManager.loadSummaries(rf); - - if( summaries != null && summaries.size() == 1 ){ - CollectRecord record = recordManager.load(earthSurveyService.getCollectSurvey(), summaries.get(0).getId(), Step.ENTRY); - BooleanAttribute node = null; + + public byte[] getFileContent(File file) { + byte[] fileContents = filesInMemory.get(file.getPath()); + if (fileContents == null) { + byte[] content = new byte[0]; try { - node = record.findNodeByPath("/plot/"+ EarthConstants.ACTIVELY_SAVED_ATTRIBUTE_NAME); //$NON-NLS-1$ - } catch (Exception e) { - logger.error("No actively_saved information found", e); //$NON-NLS-1$ + content = FileUtils.readFileToByteArray(file); + filesInMemory.put(file.getPath(), content); + } catch (IOException e) { + logger.error("Problems while reading the file " + file.getPath() + " was not found.", e); } - return (node != null && !node.isEmpty() && node.getValue().getValue() ); - }else{ - return false; + fileContents = content; } + return fileContents; } - } From dc1189c859a64e03ef9fe85b178eb6e5b0a8d90c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:39 +0100 Subject: [PATCH 0176/1620] New translations PreloadedFilesService.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 231 ++---------------- 1 file changed, 23 insertions(+), 208 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 1c73e5c34d..8d225e803d 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,227 +1,42 @@ package org.openforis.collect.earth.app.service; -import java.io.BufferedReader; -import java.io.BufferedWriter; import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStreamWriter; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.app.view.Messages; -import org.openforis.collect.manager.RecordManager; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.CollectRecordSummary; -import org.openforis.collect.model.RecordFilter; -import org.openforis.idm.metamodel.AttributeDefinition; -import org.openforis.idm.model.BooleanAttribute; +import org.apache.commons.io.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.springframework.util.StringUtils; - -import com.opencsv.CSVReader; -import com.opencsv.exceptions.CsvValidationException; +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ @Component -public class MissingPlotService { - - @Autowired - private RecordManager recordManager; - - @Autowired - private EarthSurveyService earthSurveyService; - - private final Logger logger = LoggerFactory.getLogger(MissingPlotService.class); - - public File getMissingPlotFile(Map> missingPlotData) { - - File tempFile = null; - try { - tempFile = File.createTempFile("missingPlots", ".csv"); - tempFile.deleteOnExit(); - - try( BufferedWriter fw = new BufferedWriter(new OutputStreamWriter( new FileOutputStream( tempFile ), StandardCharsets.UTF_8 ) ) ){ - Set files = missingPlotData.keySet(); - for (String plotFile : files) { - - List missingPlots = missingPlotData.get(plotFile); - StringBuilder csvRow = new StringBuilder(""); - for (String[] plotData : missingPlots) { - csvRow = new StringBuilder(""); - for (String data : plotData) { +public class PreloadedFilesService { - data = data.replaceAll("\"", "\\\""); + private final Logger logger = LoggerFactory.getLogger(PreloadedFilesService.class); - csvRow.append("\"").append(data).append("\"").append(","); - } - csvRow.delete(csvRow.length()-1, csvRow.length()).append("\n"); - fw.write(csvRow.toString()); - } - } - } - - } catch (IOException e) { - logger.error("Error while producing the CSV with the missing plots" ); - } - - return tempFile; + private final Map filesInMemory; + + public PreloadedFilesService() { + filesInMemory = new ConcurrentHashMap<>(); } - public String getMissingPlotInformation(Map> allPlotDataInFiles, Map> missingPlotDataPerFile ) { - - String missingPlotsText = getTextMissingPlots( missingPlotDataPerFile ); - - int totalPlots = 0; - int missingPlots = 0; - for (Entry> entry : allPlotDataInFiles.entrySet() ) { - if( entry.getValue()!=null){ - totalPlots += entry.getValue().size(); - missingPlots += missingPlotDataPerFile.get( entry.getKey() ).size(); - } - } - missingPlotsText += "\n\n"+Messages.getString("MissingPlotsListener.10") + totalPlots ; //$NON-NLS-1$ //$NON-NLS-2$ - - if( missingPlots > 0 ){ - missingPlotsText += "\n"+Messages.getString("MissingPlotsListener.12") + missingPlots; //$NON-NLS-1$ //$NON-NLS-2$ - }else{ - missingPlotsText +="\n"+Messages.getString("MissingPlotsListener.14"); //$NON-NLS-1$ //$NON-NLS-2$ - } - return missingPlotsText; - } - - private String getTextMissingPlots(Map> missingPlotDataPerFile) { - StringBuilder missingPlots = new StringBuilder(""); //$NON-NLS-1$ - - Set files = missingPlotDataPerFile.keySet(); - for (String fileToBeChecked : files) { - - missingPlots.append("\n").append(Messages.getString("MissingPlotsListener.5")).append( fileToBeChecked ).append(" : \n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - - List missingIds = missingPlotDataPerFile.get(fileToBeChecked); - if( missingIds.isEmpty() ){ - missingPlots.append("COMPLETE "); //$NON-NLS-1$ - } - - for (String[] missingPlotData : missingIds) { - missingPlots.append( missingPlotData[0] ).append(","); //$NON-NLS-1$ - } - - missingPlots = missingPlots.delete(missingPlots.length() - 1, missingPlots.length() ).append("\n"); //$NON-NLS-1$ - - } - return missingPlots.toString(); - } - - private CSVReader getCsvReader(String csvFile) throws FileNotFoundException { - CSVReader reader; - final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8)); //$NON-NLS-1$ - reader = new CSVReader(bufferedReader); - return reader; - } - - - private List getPlotDataFromFile(String plotCoordinateFile) { - final List plotData = new ArrayList<>(); - try { - final CSVReader plotCsvReader = getCsvReader(plotCoordinateFile); - String[] csvRow; - while ((csvRow = plotCsvReader.readNext()) != null) { - plotData.add(csvRow); - } - } catch (final FileNotFoundException e) { - logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ - } catch (final IOException e) { - logger.error("Error reading CSV line", e); //$NON-NLS-1$ - } catch (CsvValidationException e) { - logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ - } - return plotData; - } - - private String[] getKeys(String[] plotData ) { - List keyAttributeDefinitions = earthSurveyService.getCollectSurvey().getSchema().getRootEntityDefinitions().get(0) - .getKeyAttributeDefinitions(); - String[] keys = new String[keyAttributeDefinitions.size()]; - int i = 0; - for (AttributeDefinition keyAttributeDefinition : keyAttributeDefinitions) { - keys[i] = plotData[i++]; - } - return keys; - } - - public Map> getMissingPlotsByFile(Map> plotDataByFIle, InfiniteProgressMonitor infiniteProgressMonitor) { - final Map> missingPlotIdsByFile = new HashMap<>(); - final Set plotFiles = plotDataByFIle.keySet(); - int i = 0; - for (final String plotFile : plotFiles) { - - infiniteProgressMonitor.updateProgress( ++i, plotFiles.size(), StringUtils.getFilename( StringUtils.cleanPath( plotFile ) ) ); - missingPlotIdsByFile.put(plotFile, new ArrayList()); - - final List plotDataInFile = plotDataByFIle.get(plotFile); - for (final String[] plotData : plotDataInFile) { - - String[] plotKeys = getKeys(plotData); - // If the plot ID is not contained in the DB - // And if the latitude cell (second column) actually contains a number (so it is not a header row) - if (!isIdActivelySavedInDB(plotKeys) && isLatitudeANumber(plotData[ plotKeys.length ]) ) { - missingPlotIdsByFile.get(plotFile).add(plotData); - } - } - } - return missingPlotIdsByFile; - } - - private boolean isLatitudeANumber(String string) { - try{ - Float.parseFloat(string); - return true; - }catch (Exception e){ - return false; - } - } - - public Map> getPlotDataByFile(File[] selectedPlotFiles) { - final Map> plotDataByFile = new HashMap<>(); - if( selectedPlotFiles != null && selectedPlotFiles.length > 0 ) { - for (final File file : selectedPlotFiles) { - plotDataByFile.put(file.getAbsolutePath(), getPlotDataFromFile(file.getAbsolutePath())); - } - } - return plotDataByFile; - } - - private boolean isIdActivelySavedInDB(String[] plotIds) { - RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey(), EarthConstants.ROOT_ENTITY_NAME); - rf.setKeyValues( Arrays.asList( plotIds )); - final List summaries = recordManager.loadSummaries(rf); - - if( summaries != null && summaries.size() == 1 ){ - CollectRecord record = recordManager.load(earthSurveyService.getCollectSurvey(), summaries.get(0).getId(), Step.ENTRY); - BooleanAttribute node = null; + + public byte[] getFileContent(File file) { + byte[] fileContents = filesInMemory.get(file.getPath()); + if (fileContents == null) { + byte[] content = new byte[0]; try { - node = record.findNodeByPath("/plot/"+ EarthConstants.ACTIVELY_SAVED_ATTRIBUTE_NAME); //$NON-NLS-1$ - } catch (Exception e) { - logger.error("No actively_saved information found", e); //$NON-NLS-1$ + content = FileUtils.readFileToByteArray(file); + filesInMemory.put(file.getPath(), content); + } catch (IOException e) { + logger.error("Problems while reading the file " + file.getPath() + " was not found.", e); } - return (node != null && !node.isEmpty() && node.getValue().getValue() ); - }else{ - return false; + fileContents = content; } + return fileContents; } - } From 9603afa5e88dee7943ffe22ab441b74ee552e580 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:40 +0100 Subject: [PATCH 0177/1620] New translations PreloadedFilesService.java (English) --- .../earth/app/view/Messages_en.properties | 231 ++---------------- 1 file changed, 23 insertions(+), 208 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 1c73e5c34d..8d225e803d 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,227 +1,42 @@ package org.openforis.collect.earth.app.service; -import java.io.BufferedReader; -import java.io.BufferedWriter; import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStreamWriter; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.app.view.Messages; -import org.openforis.collect.manager.RecordManager; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.CollectRecordSummary; -import org.openforis.collect.model.RecordFilter; -import org.openforis.idm.metamodel.AttributeDefinition; -import org.openforis.idm.model.BooleanAttribute; +import org.apache.commons.io.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.springframework.util.StringUtils; - -import com.opencsv.CSVReader; -import com.opencsv.exceptions.CsvValidationException; +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ @Component -public class MissingPlotService { - - @Autowired - private RecordManager recordManager; - - @Autowired - private EarthSurveyService earthSurveyService; - - private final Logger logger = LoggerFactory.getLogger(MissingPlotService.class); - - public File getMissingPlotFile(Map> missingPlotData) { - - File tempFile = null; - try { - tempFile = File.createTempFile("missingPlots", ".csv"); - tempFile.deleteOnExit(); - - try( BufferedWriter fw = new BufferedWriter(new OutputStreamWriter( new FileOutputStream( tempFile ), StandardCharsets.UTF_8 ) ) ){ - Set files = missingPlotData.keySet(); - for (String plotFile : files) { - - List missingPlots = missingPlotData.get(plotFile); - StringBuilder csvRow = new StringBuilder(""); - for (String[] plotData : missingPlots) { - csvRow = new StringBuilder(""); - for (String data : plotData) { +public class PreloadedFilesService { - data = data.replaceAll("\"", "\\\""); + private final Logger logger = LoggerFactory.getLogger(PreloadedFilesService.class); - csvRow.append("\"").append(data).append("\"").append(","); - } - csvRow.delete(csvRow.length()-1, csvRow.length()).append("\n"); - fw.write(csvRow.toString()); - } - } - } - - } catch (IOException e) { - logger.error("Error while producing the CSV with the missing plots" ); - } - - return tempFile; + private final Map filesInMemory; + + public PreloadedFilesService() { + filesInMemory = new ConcurrentHashMap<>(); } - public String getMissingPlotInformation(Map> allPlotDataInFiles, Map> missingPlotDataPerFile ) { - - String missingPlotsText = getTextMissingPlots( missingPlotDataPerFile ); - - int totalPlots = 0; - int missingPlots = 0; - for (Entry> entry : allPlotDataInFiles.entrySet() ) { - if( entry.getValue()!=null){ - totalPlots += entry.getValue().size(); - missingPlots += missingPlotDataPerFile.get( entry.getKey() ).size(); - } - } - missingPlotsText += "\n\n"+Messages.getString("MissingPlotsListener.10") + totalPlots ; //$NON-NLS-1$ //$NON-NLS-2$ - - if( missingPlots > 0 ){ - missingPlotsText += "\n"+Messages.getString("MissingPlotsListener.12") + missingPlots; //$NON-NLS-1$ //$NON-NLS-2$ - }else{ - missingPlotsText +="\n"+Messages.getString("MissingPlotsListener.14"); //$NON-NLS-1$ //$NON-NLS-2$ - } - return missingPlotsText; - } - - private String getTextMissingPlots(Map> missingPlotDataPerFile) { - StringBuilder missingPlots = new StringBuilder(""); //$NON-NLS-1$ - - Set files = missingPlotDataPerFile.keySet(); - for (String fileToBeChecked : files) { - - missingPlots.append("\n").append(Messages.getString("MissingPlotsListener.5")).append( fileToBeChecked ).append(" : \n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - - List missingIds = missingPlotDataPerFile.get(fileToBeChecked); - if( missingIds.isEmpty() ){ - missingPlots.append("COMPLETE "); //$NON-NLS-1$ - } - - for (String[] missingPlotData : missingIds) { - missingPlots.append( missingPlotData[0] ).append(","); //$NON-NLS-1$ - } - - missingPlots = missingPlots.delete(missingPlots.length() - 1, missingPlots.length() ).append("\n"); //$NON-NLS-1$ - - } - return missingPlots.toString(); - } - - private CSVReader getCsvReader(String csvFile) throws FileNotFoundException { - CSVReader reader; - final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8)); //$NON-NLS-1$ - reader = new CSVReader(bufferedReader); - return reader; - } - - - private List getPlotDataFromFile(String plotCoordinateFile) { - final List plotData = new ArrayList<>(); - try { - final CSVReader plotCsvReader = getCsvReader(plotCoordinateFile); - String[] csvRow; - while ((csvRow = plotCsvReader.readNext()) != null) { - plotData.add(csvRow); - } - } catch (final FileNotFoundException e) { - logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ - } catch (final IOException e) { - logger.error("Error reading CSV line", e); //$NON-NLS-1$ - } catch (CsvValidationException e) { - logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ - } - return plotData; - } - - private String[] getKeys(String[] plotData ) { - List keyAttributeDefinitions = earthSurveyService.getCollectSurvey().getSchema().getRootEntityDefinitions().get(0) - .getKeyAttributeDefinitions(); - String[] keys = new String[keyAttributeDefinitions.size()]; - int i = 0; - for (AttributeDefinition keyAttributeDefinition : keyAttributeDefinitions) { - keys[i] = plotData[i++]; - } - return keys; - } - - public Map> getMissingPlotsByFile(Map> plotDataByFIle, InfiniteProgressMonitor infiniteProgressMonitor) { - final Map> missingPlotIdsByFile = new HashMap<>(); - final Set plotFiles = plotDataByFIle.keySet(); - int i = 0; - for (final String plotFile : plotFiles) { - - infiniteProgressMonitor.updateProgress( ++i, plotFiles.size(), StringUtils.getFilename( StringUtils.cleanPath( plotFile ) ) ); - missingPlotIdsByFile.put(plotFile, new ArrayList()); - - final List plotDataInFile = plotDataByFIle.get(plotFile); - for (final String[] plotData : plotDataInFile) { - - String[] plotKeys = getKeys(plotData); - // If the plot ID is not contained in the DB - // And if the latitude cell (second column) actually contains a number (so it is not a header row) - if (!isIdActivelySavedInDB(plotKeys) && isLatitudeANumber(plotData[ plotKeys.length ]) ) { - missingPlotIdsByFile.get(plotFile).add(plotData); - } - } - } - return missingPlotIdsByFile; - } - - private boolean isLatitudeANumber(String string) { - try{ - Float.parseFloat(string); - return true; - }catch (Exception e){ - return false; - } - } - - public Map> getPlotDataByFile(File[] selectedPlotFiles) { - final Map> plotDataByFile = new HashMap<>(); - if( selectedPlotFiles != null && selectedPlotFiles.length > 0 ) { - for (final File file : selectedPlotFiles) { - plotDataByFile.put(file.getAbsolutePath(), getPlotDataFromFile(file.getAbsolutePath())); - } - } - return plotDataByFile; - } - - private boolean isIdActivelySavedInDB(String[] plotIds) { - RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey(), EarthConstants.ROOT_ENTITY_NAME); - rf.setKeyValues( Arrays.asList( plotIds )); - final List summaries = recordManager.loadSummaries(rf); - - if( summaries != null && summaries.size() == 1 ){ - CollectRecord record = recordManager.load(earthSurveyService.getCollectSurvey(), summaries.get(0).getId(), Step.ENTRY); - BooleanAttribute node = null; + + public byte[] getFileContent(File file) { + byte[] fileContents = filesInMemory.get(file.getPath()); + if (fileContents == null) { + byte[] content = new byte[0]; try { - node = record.findNodeByPath("/plot/"+ EarthConstants.ACTIVELY_SAVED_ATTRIBUTE_NAME); //$NON-NLS-1$ - } catch (Exception e) { - logger.error("No actively_saved information found", e); //$NON-NLS-1$ + content = FileUtils.readFileToByteArray(file); + filesInMemory.put(file.getPath(), content); + } catch (IOException e) { + logger.error("Problems while reading the file " + file.getPath() + " was not found.", e); } - return (node != null && !node.isEmpty() && node.getValue().getValue() ); - }else{ - return false; + fileContents = content; } + return fileContents; } - } From d83518ece1771b4057dc518e9adc4ad553b88b61 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:41 +0100 Subject: [PATCH 0178/1620] New translations ProcessLoggerThread.java (French) --- .../earth/app/view/Messages_fr.properties | 64 ++++++++++--------- 1 file changed, 35 insertions(+), 29 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 8d225e803d..4b902b8805 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,42 +1,48 @@ package org.openforis.collect.earth.app.service; -import java.io.File; +import java.io.BufferedReader; import java.io.IOException; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; +import java.io.InputStream; +import java.io.InputStreamReader; -import org.apache.commons.io.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ -@Component -public class PreloadedFilesService { - private final Logger logger = LoggerFactory.getLogger(PreloadedFilesService.class); +public class ProcessLoggerThread extends Thread { - private final Map filesInMemory; - - public PreloadedFilesService() { - filesInMemory = new ConcurrentHashMap<>(); + private static final Logger LOGGER = LoggerFactory.getLogger(ProcessLoggerThread.class); + + private InputStream inputStream; + + private Boolean logOutputAsError; + + + public ProcessLoggerThread(InputStream inputStream, Boolean logOutputAsError) { + super(); + + this.inputStream = inputStream; + this.logOutputAsError = logOutputAsError; } - - public byte[] getFileContent(File file) { - byte[] fileContents = filesInMemory.get(file.getPath()); - if (fileContents == null) { - byte[] content = new byte[0]; - try { - content = FileUtils.readFileToByteArray(file); - filesInMemory.put(file.getPath(), content); - } catch (IOException e) { - logger.error("Problems while reading the file " + file.getPath() + " was not found.", e); + + + @Override + public void run() { + try { + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); + String line = reader.readLine(); + while (line != null) { + if( Boolean.TRUE.equals( logOutputAsError ) ) + LOGGER.error(line); + else + LOGGER.warn(line); + + line = reader.readLine(); } - fileContents = content; + reader.close(); + LOGGER.warn("End of logs"); + } catch (IOException e) { + LOGGER.error("The log reader died unexpectedly.", e); } - return fileContents; } -} +} \ No newline at end of file From 0d5c096ce08b3a2249c1e68b768f3669e3af0fac Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:42 +0100 Subject: [PATCH 0179/1620] New translations ProcessLoggerThread.java (Spanish) --- .../earth/app/view/Messages_es.properties | 64 ++++++++++--------- 1 file changed, 35 insertions(+), 29 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 8d225e803d..4b902b8805 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,42 +1,48 @@ package org.openforis.collect.earth.app.service; -import java.io.File; +import java.io.BufferedReader; import java.io.IOException; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; +import java.io.InputStream; +import java.io.InputStreamReader; -import org.apache.commons.io.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ -@Component -public class PreloadedFilesService { - private final Logger logger = LoggerFactory.getLogger(PreloadedFilesService.class); +public class ProcessLoggerThread extends Thread { - private final Map filesInMemory; - - public PreloadedFilesService() { - filesInMemory = new ConcurrentHashMap<>(); + private static final Logger LOGGER = LoggerFactory.getLogger(ProcessLoggerThread.class); + + private InputStream inputStream; + + private Boolean logOutputAsError; + + + public ProcessLoggerThread(InputStream inputStream, Boolean logOutputAsError) { + super(); + + this.inputStream = inputStream; + this.logOutputAsError = logOutputAsError; } - - public byte[] getFileContent(File file) { - byte[] fileContents = filesInMemory.get(file.getPath()); - if (fileContents == null) { - byte[] content = new byte[0]; - try { - content = FileUtils.readFileToByteArray(file); - filesInMemory.put(file.getPath(), content); - } catch (IOException e) { - logger.error("Problems while reading the file " + file.getPath() + " was not found.", e); + + + @Override + public void run() { + try { + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); + String line = reader.readLine(); + while (line != null) { + if( Boolean.TRUE.equals( logOutputAsError ) ) + LOGGER.error(line); + else + LOGGER.warn(line); + + line = reader.readLine(); } - fileContents = content; + reader.close(); + LOGGER.warn("End of logs"); + } catch (IOException e) { + LOGGER.error("The log reader died unexpectedly.", e); } - return fileContents; } -} +} \ No newline at end of file From b80ac548e21b09c20bbb1c2217721fa9c834b5ee Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:43 +0100 Subject: [PATCH 0180/1620] New translations ProcessLoggerThread.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 64 ++++++++++--------- 1 file changed, 35 insertions(+), 29 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 8d225e803d..4b902b8805 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,42 +1,48 @@ package org.openforis.collect.earth.app.service; -import java.io.File; +import java.io.BufferedReader; import java.io.IOException; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; +import java.io.InputStream; +import java.io.InputStreamReader; -import org.apache.commons.io.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ -@Component -public class PreloadedFilesService { - private final Logger logger = LoggerFactory.getLogger(PreloadedFilesService.class); +public class ProcessLoggerThread extends Thread { - private final Map filesInMemory; - - public PreloadedFilesService() { - filesInMemory = new ConcurrentHashMap<>(); + private static final Logger LOGGER = LoggerFactory.getLogger(ProcessLoggerThread.class); + + private InputStream inputStream; + + private Boolean logOutputAsError; + + + public ProcessLoggerThread(InputStream inputStream, Boolean logOutputAsError) { + super(); + + this.inputStream = inputStream; + this.logOutputAsError = logOutputAsError; } - - public byte[] getFileContent(File file) { - byte[] fileContents = filesInMemory.get(file.getPath()); - if (fileContents == null) { - byte[] content = new byte[0]; - try { - content = FileUtils.readFileToByteArray(file); - filesInMemory.put(file.getPath(), content); - } catch (IOException e) { - logger.error("Problems while reading the file " + file.getPath() + " was not found.", e); + + + @Override + public void run() { + try { + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); + String line = reader.readLine(); + while (line != null) { + if( Boolean.TRUE.equals( logOutputAsError ) ) + LOGGER.error(line); + else + LOGGER.warn(line); + + line = reader.readLine(); } - fileContents = content; + reader.close(); + LOGGER.warn("End of logs"); + } catch (IOException e) { + LOGGER.error("The log reader died unexpectedly.", e); } - return fileContents; } -} +} \ No newline at end of file From 36e063feb835b745852c1cd19376bb5dfc31b75b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:44 +0100 Subject: [PATCH 0181/1620] New translations IPCCGeneratorService.java (Spanish) --- .../earth/app/view/Messages_es.properties | 117 +++++++++++++----- 1 file changed, 87 insertions(+), 30 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 4b902b8805..c1b9c5db00 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,48 +1,105 @@ package org.openforis.collect.earth.app.service; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; - +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.ipcc.IPCCGenerator; +import org.openforis.collect.earth.ipcc.IPCCGeneratorException; +import org.openforis.collect.earth.ipcc.RdbExportException; +import org.openforis.collect.model.CollectSurvey; +import org.openforis.collect.relational.CollectRDBPublisher; +import org.openforis.collect.relational.CollectRdbException; +import org.openforis.idm.metamodel.NodeDefinition; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class IPCCGeneratorService extends GenerateDatabase{ + + @Autowired + RDBExporter rdbExporter; + + @Autowired + CollectRDBPublisher collectRDBPublisher; + @Autowired + EarthSurveyService earthSurveyService; -public class ProcessLoggerThread extends Thread { + @Autowired + public LocalPropertiesService localPropertiesService; - private static final Logger LOGGER = LoggerFactory.getLogger(ProcessLoggerThread.class); + @Autowired + BrowserService browserService; - private InputStream inputStream; + @Autowired + private IPCCGenerator ipccGenerator; + + final Logger logger = LoggerFactory.getLogger(IPCCGeneratorService.class); + + public void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws RdbExportException { + + try { - private Boolean logOutputAsError; + try { + if ( + (localPropertiesService.isUsingSqliteDB() && !getZippedProjectDB( ExportType.IPCC ).exists()) + || + isRefreshDatabase() + ) { + + // The user clicked on the option to refresh the database, or there is no + // previous copy of the Saiku DB + // Generate the DB file + ipccGenerator.generateRDB( earthSurveyService.getCollectSurvey(), progressListener); + + try { + // Save the DB file in a zipped file to extends GenerateDatabase keep for the next usages + replaceZippedProjectDB( ExportType.IPCC ); + } catch (Exception e) { + logger.error("Error while refreshing the Zipped content of the project IPCC DB", e); + } - public ProcessLoggerThread(InputStream inputStream, Boolean logOutputAsError) { - super(); + } else if (getZippedProjectDB(ExportType.IPCC).exists()) { + // If the zipped version of the project exists ( and the user clicked on the + // option to not refresh it) then restore this last version of the data + if (localPropertiesService.isUsingSqliteDB()) { + restoreZippedProjectDB(ExportType.IPCC); + } + } + + ipccGenerator.produceOutputs( earthSurveyService.getCollectSurvey(), progressListener ); - this.inputStream = inputStream; - this.logOutputAsError = logOutputAsError; + } catch (final IPCCGeneratorException e) { + logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ + } + + } catch (final CollectRdbException e) { + logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ + } + } + + + + public static boolean surveyContains(String nodeName, CollectSurvey survey) { + NodeDefinition nodeDefForNAme = survey.getSchema().findNodeDefinition( nodeDef -> nodeDef.getName().equals(nodeName) ); + return nodeDefForNAme != null; } @Override - public void run() { - try { - BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); - String line = reader.readLine(); - while (line != null) { - if( Boolean.TRUE.equals( logOutputAsError ) ) - LOGGER.error(line); - else - LOGGER.warn(line); - - line = reader.readLine(); - } - reader.close(); - LOGGER.warn("End of logs"); - } catch (IOException e) { - LOGGER.error("The log reader died unexpectedly.", e); - } + public LocalPropertiesService getLocalPropertiesService() { + return localPropertiesService; + } + + @Override + public EarthSurveyService getEarthSurveyService() { + return earthSurveyService; } + + @Override + public RDBExporter getRdbExporter() { + return rdbExporter; + } + } \ No newline at end of file From c1f3d871c7effcb2fb4925c73758e61e8656c99a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:45 +0100 Subject: [PATCH 0182/1620] New translations GeolocalizeMapService.java (English) --- .../earth/app/view/Messages_en.properties | 183 ++++++++++++++++-- 1 file changed, 164 insertions(+), 19 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 8d225e803d..4ed72d856d 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -2,41 +2,186 @@ package org.openforis.collect.earth.app.service; import java.io.File; import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import org.apache.commons.io.FileUtils; +import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; +import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import freemarker.template.TemplateException; + /** + * Customizes a Bing Map page to open zoomed into a coordinate. The HTML page is + * created in a temporary file and its URL is returned so that it can be opened + * in a browser. A freemarker template that contains the javascript code to + * customize the Bing Map is used and the parameters for the specific + * coordinates are applied to it. This service uses the same code than the KML + * generator to get the plot sample deign as chosen through the configuration by + * the user. + * * @author Alfonso Sanchez-Paus Diaz * */ @Component -public class PreloadedFilesService { +public class GeolocalizeMapService { + + private static final String RESOURCES_FOLDER = "resources"; + + /** + * The file that contains the freemarker template used to produce the Bing Maps + * code. + */ + public static final String FREEMARKER_BING_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectBing.fmt"; + + public static final String FREEMARKER_BAIDU_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectBaidu.fmt"; + + public static final String FREEMARKER_PLANET_MONTHLY_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectPlanetMonthlyHtml.fmt"; + + public static final String FREEMARKER_PLANET_NICFI_ARGUMENTS = RESOURCES_FOLDER + File.separator + "collectPlanetNicfiTxt.fmt"; + + public static final String FREEMARKER_PLANET_DAILY_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectPlanetHtml.fmt"; + + public static final String FREEMARKER_PLANET_URL_TEMPLATE = RESOURCES_FOLDER + File.separator + + "collectPlanetUrl.fmt"; + + /** + * The file that contains the freemarker template used to produce the Yandex + * Maps code. + */ + public static final String FREEMARKER_YANDEX_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + + "collectYandex.fmt"; - private final Logger logger = LoggerFactory.getLogger(PreloadedFilesService.class); + public static final String FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME = "eePlaygroundScript.fmt"; + public static final String FREEMARKER_GEE_CODE_EDITOR_TEMPLATE_FILE_NAME = "eeCodeEditorScript.fmt"; + + /** + * The file that contains the freemarker template used to produce script that is + * run in GEE Code Editor. + */ + public static final String FREEMARKER_GEE_PLAYGROUND_TEMPLATE = RESOURCES_FOLDER + File.separator + + FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME; + public static final String FREEMARKER_GEE_CODE_EDITOR_TEMPLATE = RESOURCES_FOLDER + File.separator + + FREEMARKER_GEE_CODE_EDITOR_TEMPLATE_FILE_NAME; + + public static final String FREEMARKER_HERE_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + + "collectHereMaps.fmt"; + + public static final String FREEMARKER_STREET_VIEW_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + + "collectStreetView.fmt"; + @Autowired + LocalPropertiesService localPropertiesService; + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + KmlGeneratorService kmlGeneratorService; + + public void addDatesForImages(final Map data) { + SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-MM-dd"); + Date todayDate = new Date(); + String dateAsExpected = dt1.format(todayDate); + data.put("todayDate", dateAsExpected); + + Calendar cal = Calendar.getInstance(); + cal.setTime(todayDate); + cal.add(Calendar.YEAR, -1); + + data.put("oneYearAgoDate", dt1.format(cal.getTime())); - private final Map filesInMemory; - - public PreloadedFilesService() { - filesInMemory = new ConcurrentHashMap<>(); } - - public byte[] getFileContent(File file) { - byte[] fileContents = filesInMemory.get(file.getPath()); - if (fileContents == null) { - byte[] content = new byte[0]; + + private File applyData(Map data, String freemarkerTemplateFile) + throws IOException, TemplateException { + + final File templateFileSrc = new File(freemarkerTemplateFile); + + final File tempFileDst = File.createTempFile("selenium", ".html"); + tempFileDst.deleteOnExit(); + + FreemarkerTemplateUtils.applyTemplate(templateFileSrc, tempFileDst, data); + + return tempFileDst; + + } + + public Map getPlacemarkData(SimplePlacemarkObject placemarkObject) { + final Map data = new HashMap<>(); + data.put("placemark", placemarkObject); + return data; + } + + /** + * Produces a temporary file with the necessary HTML code to show the plot in + * Bing Maps + * + * @param placemarkObject + * The object containing information of the placemark. + * @param freemarkerTemplate + * The path to the freemarker template that is used to produce the + * file. + * @return The URL to the temporary file that can be used to load it in a + * browser. + */ + public URL getTemporaryUrl(SimplePlacemarkObject placemarkObject, String freemarkerTemplate) { + final Map data = getPlacemarkData(placemarkObject); + addDatesForImages(data); + return processTemplateWithData(freemarkerTemplate, data); + } + + /** + * Produces a URL using Planet Labs explorer expected format + * + * @param placemarkObject + * The data of the plot. + * @param freemarkerTemplate + * The freemarker template file to use + * @param extraData + * Variable listof key value strings + * @return The URL to the temporary file that can be used to load it in a + * browser. + */ + public URL getUrlToFreemarkerOutput(SimplePlacemarkObject placemarkObject, String freemarkerTemplate, + String... extraData) { + + final Map data = getPlacemarkData(placemarkObject); + + if( extraData !=null) { + for (int i = 0; i < extraData.length; i = i+2) { + data.put(extraData[i], extraData[i+1]); + } + } + return processTemplateWithData(freemarkerTemplate, data); + + } + + + private URL processTemplateWithData(String freemarkerTemplate, final Map data) { + File transformedHtml = null; + try { + transformedHtml = applyData(data, freemarkerTemplate); + } catch (final Exception e) { + logger.error("Exception when applying template " + freemarkerTemplate + "with data : " + data.toString(), + e); + } + if (transformedHtml != null) { try { - content = FileUtils.readFileToByteArray(file); - filesInMemory.put(file.getPath(), content); - } catch (IOException e) { - logger.error("Problems while reading the file " + file.getPath() + " was not found.", e); + return transformedHtml.toURI().toURL(); + } catch (MalformedURLException e) { + logger.error("Error generating URL for File " + transformedHtml.getAbsolutePath()); + return null; } - fileContents = content; + } else { + logger.error("No Bing map HTML generated."); + return null; } - return fileContents; } } From 8d1004657388ed579eed8c6f69ba479042514eae Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:46 +0100 Subject: [PATCH 0183/1620] New translations DataImportExportService.java (English) --- .../earth/app/view/Messages_en.properties | 285 +++++++++--------- 1 file changed, 146 insertions(+), 139 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 4ed72d856d..eb9f542d80 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,187 +1,194 @@ package org.openforis.collect.earth.app.service; import java.io.File; -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; -import java.text.SimpleDateFormat; -import java.util.Calendar; +import java.util.ArrayList; import java.util.Date; -import java.util.HashMap; -import java.util.Map; - -import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; -import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; +import java.util.List; + +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.io.data.CSVDataExportProcess; +import org.openforis.collect.io.data.CSVDataImportProcess; +import org.openforis.collect.io.data.DataExportStatus; +import org.openforis.collect.io.data.DataImportSummaryItem; +import org.openforis.collect.io.data.XMLDataExportProcess; +import org.openforis.collect.io.data.XMLDataImportProcess; +import org.openforis.collect.io.data.csv.CSVDataExportParameters; +import org.openforis.collect.io.data.csv.CSVDataImportSettings; +import org.openforis.collect.manager.process.AbstractProcess; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.RecordFilter; +import org.openforis.commons.collection.Predicate; +import org.openforis.idm.model.BooleanAttribute; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; -import freemarker.template.TemplateException; - /** - * Customizes a Bing Map page to open zoomed into a coordinate. The HTML page is - * created in a temporary file and its URL is returned so that it can be opened - * in a browser. A freemarker template that contains the javascript code to - * customize the Bing Map is used and the parameters for the specific - * coordinates are applied to it. This service uses the same code than the KML - * generator to get the plot sample deign as chosen through the configuration by - * the user. - * * @author Alfonso Sanchez-Paus Diaz * */ @Component -public class GeolocalizeMapService { - - private static final String RESOURCES_FOLDER = "resources"; - - /** - * The file that contains the freemarker template used to produce the Bing Maps - * code. - */ - public static final String FREEMARKER_BING_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectBing.fmt"; - - public static final String FREEMARKER_BAIDU_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectBaidu.fmt"; - - public static final String FREEMARKER_PLANET_MONTHLY_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectPlanetMonthlyHtml.fmt"; - - public static final String FREEMARKER_PLANET_NICFI_ARGUMENTS = RESOURCES_FOLDER + File.separator + "collectPlanetNicfiTxt.fmt"; +public class DataImportExportService { - public static final String FREEMARKER_PLANET_DAILY_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectPlanetHtml.fmt"; + @Autowired + private EarthSurveyService earthSurveyService; - public static final String FREEMARKER_PLANET_URL_TEMPLATE = RESOURCES_FOLDER + File.separator - + "collectPlanetUrl.fmt"; + @Autowired + private LocalPropertiesService localPropertiesService; + private final Logger logger = LoggerFactory.getLogger(DataImportExportService.class); /** - * The file that contains the freemarker template used to produce the Yandex - * Maps code. + * Use the application context to get a new bean everytime the data is exported ( as a new instance is needed every time) */ - public static final String FREEMARKER_YANDEX_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator - + "collectYandex.fmt"; + @Autowired + private ApplicationContext applicationContext; - public static final String FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME = "eePlaygroundScript.fmt"; - public static final String FREEMARKER_GEE_CODE_EDITOR_TEMPLATE_FILE_NAME = "eeCodeEditorScript.fmt"; + private void addRecordsToImportList( List recordsToImport, List entryIdsToImport) { + if (recordsToImport != null) { + List cleanRecordsToImport = recordsToImport; + for (final DataImportSummaryItem importRecord : cleanRecordsToImport) { + entryIdsToImport.add(importRecord.getEntryId()); + } + } + } - /** - * The file that contains the freemarker template used to produce script that is - * run in GEE Code Editor. - */ - public static final String FREEMARKER_GEE_PLAYGROUND_TEMPLATE = RESOURCES_FOLDER + File.separator - + FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME; - public static final String FREEMARKER_GEE_CODE_EDITOR_TEMPLATE = RESOURCES_FOLDER + File.separator - + FREEMARKER_GEE_CODE_EDITOR_TEMPLATE_FILE_NAME; + public CSVDataExportProcess exportSurveyAsCsv(File exportToFile, boolean includeCodeItemLabelColumn) { + final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); + csvDataExportProcess.setOutputFile(exportToFile); - public static final String FREEMARKER_HERE_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator - + "collectHereMaps.fmt"; + csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); + csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; - public static final String FREEMARKER_STREET_VIEW_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator - + "collectStreetView.fmt"; - @Autowired - LocalPropertiesService localPropertiesService; + CSVDataExportParameters config = new CSVDataExportParameters(); + config.setIncludeAllAncestorAttributes(true); + config.setIncludeEnumeratedEntities(true); + config.setLanguageCode( localPropertiesService.getValue(EarthProperty.UI_LANGUAGE) ); + config.setIncludeCodeItemLabelColumn(includeCodeItemLabelColumn); + csvDataExportProcess.setConfiguration(config); - private final Logger logger = LoggerFactory.getLogger(this.getClass()); + return csvDataExportProcess; + } - @Autowired - KmlGeneratorService kmlGeneratorService; + private RecordFilter getRecordFilter( ) { + RecordFilter recordFilter = new RecordFilter(earthSurveyService.getCollectSurvey(), earthSurveyService.getRootEntityDefinition().getId()); + recordFilter.setStepGreaterOrEqual(Step.ENTRY); + return recordFilter; + } - public void addDatesForImages(final Map data) { - SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-MM-dd"); - Date todayDate = new Date(); - String dateAsExpected = dt1.format(todayDate); - data.put("todayDate", dateAsExpected); + public CSVDataExportProcess exportSurveyAsFusionTable(File exportToFile, boolean includeCodeItemLabelColumn) { + + final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); + csvDataExportProcess.setOutputFile(exportToFile); + csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); + csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; + + CSVDataExportParameters config = new CSVDataExportParameters(); + config.setIncludeAllAncestorAttributes(true); + config.setLanguageCode( localPropertiesService.getValue(EarthProperty.UI_LANGUAGE) ); + config.setIncludeCodeItemPositionColumn(true); + config.setIncludeKMLColumnForCoordinates(true); + config.setIncludeCodeItemLabelColumn( includeCodeItemLabelColumn ); + csvDataExportProcess.setConfiguration(config); + return csvDataExportProcess; + } - Calendar cal = Calendar.getInstance(); - cal.setTime(todayDate); - cal.add(Calendar.YEAR, -1); + public XMLDataExportProcess exportSurveyAsZipWithXml(File exportToFile, Date modifiedSince) throws Exception { + final XMLDataExportProcess xmlDataExportProcess = applicationContext.getBean(XMLDataExportProcess.class); + xmlDataExportProcess.setOutputFile(exportToFile); + xmlDataExportProcess.setRootEntityName(EarthConstants.ROOT_ENTITY_NAME); + xmlDataExportProcess.setSurvey(earthSurveyService.getCollectSurvey()); + xmlDataExportProcess.setModifiedSince(modifiedSince); + xmlDataExportProcess.setIncludeIdm(true); + xmlDataExportProcess.setSteps(new Step[] { Step.ENTRY }); + return xmlDataExportProcess; + } - data.put("oneYearAgoDate", dt1.format(cal.getTime())); + public CSVDataImportProcess getCsvImporterProcess(File importFromFile) { + final CSVDataImportProcess importProcess = applicationContext.getBean("transactionalCsvDataImportProcess", CSVDataImportProcess.class); + + importProcess.setFile(importFromFile); + importProcess.setSurvey(earthSurveyService.getCollectSurvey()); + importProcess.setParentEntityDefinitionId(earthSurveyService.getRootEntityDefinition().getId()); + importProcess.setStep(Step.ENTRY ); + CSVDataImportSettings settings = new CSVDataImportSettings(); + settings.setRecordValidationEnabled(false); + settings.setInsertNewRecords(false); + settings.setNewRecordVersionName(null); + settings.setReportNoRecordFoundErrors(false); + importProcess.setSettings(settings); + return importProcess; } - private File applyData(Map data, String freemarkerTemplateFile) - throws IOException, TemplateException { - - final File templateFileSrc = new File(freemarkerTemplateFile); + public XMLDataImportProcess getImportSummary(File zipWithXml, boolean importNonFinishedPlots) throws Exception { + final XMLDataImportProcess dataImportProcess = applicationContext.getBean(XMLDataImportProcess.class); + dataImportProcess.init(); + dataImportProcess.setFile(zipWithXml); + dataImportProcess.setValidateRecords(false); + dataImportProcess.prepareToStartSummaryCreation(); - final File tempFileDst = File.createTempFile("selenium", ".html"); - tempFileDst.deleteOnExit(); + if( !importNonFinishedPlots ){ // Import only plots whose actively_saved state is set to true + dataImportProcess.setIncludeRecordPredicate( new Predicate() { - FreemarkerTemplateUtils.applyTemplate(templateFileSrc, tempFileDst, data); + @Override + public boolean evaluate(CollectRecord record) { + boolean include = true; - return tempFileDst; + try { + final BooleanAttribute node = (BooleanAttribute) record.getNodeByPath("/plot/" + EarthConstants.ACTIVELY_SAVED_ATTRIBUTE_NAME); //$NON-NLS-1$ - } + include = (node == null || (node != null && !node.isEmpty() && node.getValue().getValue()) ); + } catch (Exception e) { + logger.error("No \"/plot/actively_saved\" node found ", e ); //$NON-NLS-1$ + } - public Map getPlacemarkData(SimplePlacemarkObject placemarkObject) { - final Map data = new HashMap<>(); - data.put("placemark", placemarkObject); - return data; + return include; + } + }); + } + return dataImportProcess; } - /** - * Produces a temporary file with the necessary HTML code to show the plot in - * Bing Maps - * - * @param placemarkObject - * The object containing information of the placemark. - * @param freemarkerTemplate - * The path to the freemarker template that is used to produce the - * file. - * @return The URL to the temporary file that can be used to load it in a - * browser. - */ - public URL getTemporaryUrl(SimplePlacemarkObject placemarkObject, String freemarkerTemplate) { - final Map data = getPlacemarkData(placemarkObject); - addDatesForImages(data); - return processTemplateWithData(freemarkerTemplate, data); - } + public void importRecordsFrom(File zipWithXml, XMLDataImportProcess dataImportProcess, List listConflictingRecords) throws Exception { + final List entryIdsToImport = new ArrayList(); - /** - * Produces a URL using Planet Labs explorer expected format - * - * @param placemarkObject - * The data of the plot. - * @param freemarkerTemplate - * The freemarker template file to use - * @param extraData - * Variable listof key value strings - * @return The URL to the temporary file that can be used to load it in a - * browser. - */ - public URL getUrlToFreemarkerOutput(SimplePlacemarkObject placemarkObject, String freemarkerTemplate, - String... extraData) { + addRecordsToImportList( listConflictingRecords, entryIdsToImport); + addRecordsToImportList( dataImportProcess.getSummary().getRecordsToImport(),entryIdsToImport); - final Map data = getPlacemarkData(placemarkObject); + dataImportProcess.setEntryIdsToImport(entryIdsToImport); + dataImportProcess.prepareToStartImport(); + dataImportProcess.call(); - if( extraData !=null) { - for (int i = 0; i < extraData.length; i = i+2) { - data.put(extraData[i], extraData[i+1]); - } + int conflictingRecordsAdded = 0; + if (listConflictingRecords != null) { + conflictingRecordsAdded = listConflictingRecords.size(); } - return processTemplateWithData(freemarkerTemplate, data); + logger.warn("Data imported into db. Number of Records imported : {} Conflicting records added : {}" //$NON-NLS-1$ //$NON-NLS-2$ + ,entryIdsToImport.size(), conflictingRecordsAdded); } + public AbstractProcess exportSurveyAsBackup(File exportToFile) { + final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); + csvDataExportProcess.setOutputFile(exportToFile); + csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); + csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; - private URL processTemplateWithData(String freemarkerTemplate, final Map data) { - File transformedHtml = null; - try { - transformedHtml = applyData(data, freemarkerTemplate); - } catch (final Exception e) { - logger.error("Exception when applying template " + freemarkerTemplate + "with data : " + data.toString(), - e); - } - if (transformedHtml != null) { - try { - return transformedHtml.toURI().toURL(); - } catch (MalformedURLException e) { - logger.error("Error generating URL for File " + transformedHtml.getAbsolutePath()); - return null; - } - } else { - logger.error("No Bing map HTML generated."); - return null; - } + + CSVDataExportParameters config = new CSVDataExportParameters(); + config.setIncludeAllAncestorAttributes(true); + config.setIncludeCodeItemPositionColumn(true); + config.setIncludeKMLColumnForCoordinates(true); + csvDataExportProcess.setConfiguration(config); + return csvDataExportProcess; } + + public EarthSurveyService getEarthSurveyService() { + return earthSurveyService; + } + } From 6b281bbd400e0f65778a7287851f1f2c79d816bd Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:47 +0100 Subject: [PATCH 0184/1620] New translations ExportType.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 101 ++++++++++-------- 1 file changed, 54 insertions(+), 47 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 4b902b8805..7633aaf9fd 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,48 +1,55 @@ -package org.openforis.collect.earth.app.service; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - -public class ProcessLoggerThread extends Thread { - - private static final Logger LOGGER = LoggerFactory.getLogger(ProcessLoggerThread.class); - - private InputStream inputStream; - - private Boolean logOutputAsError; - - - public ProcessLoggerThread(InputStream inputStream, Boolean logOutputAsError) { - super(); - - this.inputStream = inputStream; - this.logOutputAsError = logOutputAsError; - } - - - @Override - public void run() { - try { - BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); - String line = reader.readLine(); - while (line != null) { - if( Boolean.TRUE.equals( logOutputAsError ) ) - LOGGER.error(line); - else - LOGGER.warn(line); - - line = reader.readLine(); - } - reader.close(); - LOGGER.warn("End of logs"); - } catch (IOException e) { - LOGGER.error("The log reader died unexpectedly.", e); - } - } +package org.openforis.collect.earth.app.service; + +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.desktop.ServerController; + +public enum ExportType { + SAIKU( + ServerController.SAIKU_RDB_SUFFIX, + "Saiku", + "SaikuDataFolder", + EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + ServerController.SAIKU_RDB_SUFFIX, + EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU + ), + IPCC( + ServerController.IPCC_RDB_SUFFIX, + "Ipcc", + "IPCCDataFolder", + EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + ServerController.IPCC_RDB_SUFFIX, + EarthConstants.POSTGRES_RDB_SCHEMA_IPCC + ); + + private String dbSuffix; + private String prefix; + private String dataFolder; + private String dbFileName; + private String rdbSchema; + + ExportType(String dbSuffix, String prefix, String dataFolder, String dbFileName, String rdbSchema ) { + this.dbSuffix = dbSuffix; + this.prefix = prefix; + this.dbFileName = dbFileName; + this.rdbSchema = rdbSchema; + } + + public String getDbSuffix() { + return dbSuffix; + } + + public String getPrefix() { + return prefix; + } + + public String getDataFolder() { + return dataFolder; + } + + public String getDbFileName() { + return dbFileName; + } + + public String getRdbSchema() { + return rdbSchema; + } + } \ No newline at end of file From 4e64b27a2577ca11100227a1e92acc266c941b5e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:48 +0100 Subject: [PATCH 0185/1620] New translations EarthProjectsService.java (French) --- .../earth/app/view/Messages_fr.properties | 352 ++++++++++++++++-- 1 file changed, 325 insertions(+), 27 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 4b902b8805..4f3bc4f7d2 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,48 +1,346 @@ package org.openforis.collect.earth.app.service; -import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.filefilter.IOFileFilter; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.exception.ZipException; -public class ProcessLoggerThread extends Thread { - private static final Logger LOGGER = LoggerFactory.getLogger(ProcessLoggerThread.class); - private InputStream inputStream; +@Component +public class EarthProjectsService { - private Boolean logOutputAsError; + private static final int OLD_MAX_FOLDER_LENGTH = 20; - public ProcessLoggerThread(InputStream inputStream, Boolean logOutputAsError) { - super(); + private static final int NEW_MAX_FOLDER_LENGTH = 255; + + private static final String PROJECT_PROPERTIES_FILE_NAME = "project_definition.properties"; //$NON-NLS-1$ + + private static final String PROJECTS = "projects"; //$NON-NLS-1$ + + @Autowired + LocalPropertiesService localPropertiesService; + + private Logger logger = LoggerFactory.getLogger( EarthProjectsService.class ); + + public void init(LocalPropertiesService localPropertiesService) { + this.localPropertiesService = localPropertiesService; + } + + public Map getProjectList(){ + ArrayList projectFolders = getProjects(); + + HashMap projectListByName = new HashMap<>(); + for (File projectFolder : projectFolders) { + + try { + + File projectPropertiesFile = getProjectPropertiesFile( projectFolder ); + String projectName = getProjectSurveyName(projectPropertiesFile); + if( projectName != null ) { + projectListByName.put( projectName , projectFolder); + } + } catch (IOException e) { + logger.error("The project definition file cannot be read.", e); //$NON-NLS-1$ + } + + } + + return projectListByName; + } + + + private String getProjectSurveyName(File projectPropertiesFile) throws IOException { + Properties properties = getProjectProperties(projectPropertiesFile); + if( properties != null) + return properties.getProperty( EarthProperty.SURVEY_NAME.toString() ); + else + return null; + } + + + private ArrayList getProjects() { + String loadedProjects = localPropertiesService.getValue( EarthProperty.LOADED_PROJECTS ); + + String[] projectFolderPaths = loadedProjects.split( File.pathSeparator ); + + ArrayList workingProjectFolders = new ArrayList<>(); + + for (String projectFolder : projectFolderPaths) { + try { + + File projectFolderFile = new File(projectFolder); + File projectDefinitionFile = getProjectPropertiesFile( projectFolderFile); + if( validateProjectDefinitionFile( projectDefinitionFile ) ){ + workingProjectFolders.add( projectFolderFile ); + } + + } catch (IllegalArgumentException e) { + logger.error("The project definition file is not complete.", e); //$NON-NLS-1$ + } catch (IOException e) { + logger.error("The project definition file cannot be read.", e); //$NON-NLS-1$ + } + + } + + + return workingProjectFolders; + } + + + private boolean checkValidContent(File definitionFile) throws IOException { + Properties projectProperties = getProjectProperties( definitionFile ); + return projectProperties.containsKey( EarthProperty.SURVEY_NAME.toString() ); - this.inputStream = inputStream; - this.logOutputAsError = logOutputAsError; } - @Override - public void run() { + /** + * Loads the contents of the project-specific properties into earth.properties + * + * @param projectFolder The folder where the project definition and the rest of the files reside. + * @return True is the project was loaded correctly + * @throws IOException If the project folder or one of its files cannot be found + */ + public boolean loadProjectInFolder(File projectFolder) throws IOException{ + + File projectPropertiesFile = getProjectPropertiesFile( projectFolder ); + + boolean success = false; + + // Change the loaded project only if the project definition file has changed or the user changes project + if( + !getProjectDefinitionMD5().equals( CollectEarthUtils.getMd5FromFolder( projectFolder ) ) + && + validateProjectDefinitionFile(projectPropertiesFile) + ){ + + // Remove the version of the survey used so that it is asked again to the user! + localPropertiesService.removeModelVersionName(); + + Properties projectProperties = getProjectProperties( projectPropertiesFile ); + + applyPropertiesToCollectEarth( projectProperties, projectFolder ); + + addToProjectList(projectFolder); + + setProjectDefinitionMD5(projectFolder); + + moveSaikuQueriesToRepository(projectFolder, (String) projectProperties.get("survey_name") ); + + success = true; + } + + + return success; + } + + + private void moveSaikuQueriesToRepository(File projectFolder, String surveyName) { + try { - BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); - String line = reader.readLine(); - while (line != null) { - if( Boolean.TRUE.equals( logOutputAsError ) ) - LOGGER.error(line); - else - LOGGER.warn(line); - - line = reader.readLine(); - } - reader.close(); - LOGGER.warn("End of logs"); + Collection saikuFiles = getSaikuFiles( projectFolder ); + + String repoDirectory = "tomcat/webapps/saiku/WEB-INF/classes/saiku-repository"; + File saikuRepo = new File( localPropertiesService.getSaikuFolder() + File.separator + repoDirectory + File.separator + surveyName ); + + for (File saikuFile : saikuFiles) { + FileUtils.copyFileToDirectory(saikuFile, saikuRepo, true); + } } catch (IOException e) { - LOGGER.error("The log reader died unexpectedly.", e); + logger.error("Error moving the Saiku files", e); + } + + + + } + + private Collection getSaikuFiles(File projectFolder) { + return FileUtils.listFiles(projectFolder, new IOFileFilter() { + + @Override + public boolean accept(File dir, String name) { + return name.endsWith("saiku"); + } + + @Override + public boolean accept(File file) { + + return file.getName().endsWith("saiku"); + } + }, null); + } + + private void setProjectDefinitionMD5(File projectFolder) throws IOException { + localPropertiesService.setValue( EarthProperty.ACTIVE_PROJECT_DEFINITION, CollectEarthUtils.getMd5FromFolder( projectFolder ) ); + } + + private String getProjectDefinitionMD5() { + return localPropertiesService.getValue( EarthProperty.ACTIVE_PROJECT_DEFINITION); + } + + + public File getProjectPropertiesFile(File projectFolder) { + return new File( projectFolder.getAbsolutePath() + File.separator + PROJECT_PROPERTIES_FILE_NAME ); + } + + public File getSurveyStructureFile(File projectFolder) { + return new File( projectFolder.getAbsolutePath() + File.separator + PROJECT_PROPERTIES_FILE_NAME ); + } + + private void applyPropertiesToCollectEarth(Properties projectProperties, File projectFolder) { + + for (Object key : projectProperties.keySet()) { + String value = projectProperties.getProperty((String) key); + value = value.replace("${project_path}", projectFolder.getAbsolutePath()); //$NON-NLS-1$ + EarthProperty earthPropertyEnum = getEarthPropertyEnum(key); + if( earthPropertyEnum != null ){ + localPropertiesService.setValue( earthPropertyEnum , value); + }else{ + logger.warn("The property in the is unknown : {}", key) ; //$NON-NLS-1$ + } + } + + } + + private EarthProperty getEarthPropertyEnum(Object key) { + EarthProperty[] values = EarthProperty.values(); + for (EarthProperty earthProperty : values) { + if( earthProperty.toString().equals( key ) ){ + return earthProperty; + } + } + return null; + } + + private Properties getProjectProperties(File definitionFile) throws IOException { + try( FileReader fr = new FileReader( definitionFile ) ){ + Properties properties = new Properties(); + properties.load(fr); + return properties; + }catch(IOException e ) { + logger.error("Impossible to open properties file ", e); + throw e; + } + } + + private void addToProjectList(File projectFolder) { + String loadedProjects = localPropertiesService.getValue( EarthProperty.LOADED_PROJECTS ); + + if( loadedProjects.length() > 0 ){ + + if( !ArrayUtils.contains(loadedProjects.split(File.pathSeparator), projectFolder.getAbsoluteFile() ) ){ + loadedProjects += File.pathSeparatorChar + projectFolder.getAbsolutePath(); + + } + }else{ + loadedProjects = projectFolder.getAbsolutePath(); + } + localPropertiesService.setValue( EarthProperty.LOADED_PROJECTS, loadedProjects ); + } + + + private boolean validateProjectDefinitionFile(File projectDefinitionFile) throws IOException{ + boolean success = false; + if( projectDefinitionFile.exists() ){ + if( checkValidContent(projectDefinitionFile) ){ + success = true; + }else{ + throw new IllegalArgumentException("The project definition file does not contain the necessary property " + EarthProperty.SURVEY_NAME.toString()+ ". File located at : " + projectDefinitionFile.getAbsolutePath() ); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + return success; + } + + + public boolean folderContainsProjectDefinition(File folder ) throws IOException{ + File projectPropertiesFile = getProjectPropertiesFile( folder ); + return validateProjectDefinitionFile(projectPropertiesFile); + } + + + public boolean loadCompressedProjectFile( File projectZipFile ) throws IOException{ + + File unzippedFolder = unzipContentsOnProjectFolder(projectZipFile); + return( loadProjectInFolder(unzippedFolder) ); + } + + + private File unzipContentsOnProjectFolder(File projectZipFile) throws IOException { + String projectFolderName = "" ; + // There was an error in the first versions of Collect Earth that limited the folder names to 20 characters + // Newer version support up to 255 but we need to take in consideration backwards compatibility! + if ( oldFormatFolderExists( projectZipFile ) ){ + // If there was already a project with the older format of the name then use that! + projectFolderName = getProjectFolderName( projectZipFile , OLD_MAX_FOLDER_LENGTH ); + }else{ + projectFolderName = getProjectFolderName( projectZipFile , NEW_MAX_FOLDER_LENGTH ); } + + return unzipContents(projectZipFile, projectFolderName); } -} \ No newline at end of file + + + private boolean oldFormatFolderExists(File projectZipFile) throws IOException { + String oldProjectFolderName = getProjectFolderName( projectZipFile , OLD_MAX_FOLDER_LENGTH ); + File oldProjectFolder = new File( getProjectsFolder() + File.separator + oldProjectFolderName ); + return oldProjectFolder.exists(); + } + + private String getProjectFolderName(File projectZipFile, int maxLenghtFolderName) throws IOException { + try( ZipFile zipFile = new ZipFile(projectZipFile) ){ + File definitionFolder = new File(EarthConstants.GENERATED_FOLDER); + zipFile.extractFile( PROJECT_PROPERTIES_FILE_NAME, definitionFolder.getAbsolutePath() ); + String projectName = getProjectSurveyName(new File( definitionFolder + File.separator + PROJECT_PROPERTIES_FILE_NAME) ); + if( projectName != null ) { + projectName = StringUtils.remove(projectName, " "); //$NON-NLS-1$ + + if( projectName.length() > maxLenghtFolderName ){ + projectName = projectName.substring(0, maxLenghtFolderName); + } + } + return projectName; + }catch(Exception e ) { + logger.error("Error opening project folder", projectZipFile.getAbsolutePath() ); + return null; + } + + } + + public String getProjectsFolder(){ + return FolderFinder.getCollectEarthDataFolder() + File.separator + PROJECTS; + } + + private File unzipContents(File projectZipFile, String projectName) throws ZipException { + File projectFolder = new File( getProjectsFolder() + File.separator + projectName ); + if( projectFolder.exists() || projectFolder.mkdirs() ){ + try( ZipFile zipFile = new ZipFile(projectZipFile) ){ + zipFile.extractAll( projectFolder.getAbsolutePath() ); + }catch(Exception e) { + logger.error("Error unzipping contents " + projectZipFile.getAbsolutePath(), e); + } + } + return projectFolder; + } + +} From 72cb103ef30cac03f41b069248b7a8d7f7771692 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:49 +0100 Subject: [PATCH 0186/1620] New translations EarthProjectsService.java (Spanish) --- .../earth/app/view/Messages_es.properties | 379 ++++++++++++++---- 1 file changed, 310 insertions(+), 69 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index c1b9c5db00..4f3bc4f7d2 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,105 +1,346 @@ package org.openforis.collect.earth.app.service; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.ipcc.IPCCGenerator; -import org.openforis.collect.earth.ipcc.IPCCGeneratorException; -import org.openforis.collect.earth.ipcc.RdbExportException; -import org.openforis.collect.model.CollectSurvey; -import org.openforis.collect.relational.CollectRDBPublisher; -import org.openforis.collect.relational.CollectRdbException; -import org.openforis.idm.metamodel.NodeDefinition; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.filefilter.IOFileFilter; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.exception.ZipException; + + + @Component -public class IPCCGeneratorService extends GenerateDatabase{ +public class EarthProjectsService { - @Autowired - RDBExporter rdbExporter; - - @Autowired - CollectRDBPublisher collectRDBPublisher; - @Autowired - EarthSurveyService earthSurveyService; + private static final int OLD_MAX_FOLDER_LENGTH = 20; - @Autowired - public LocalPropertiesService localPropertiesService; + private static final int NEW_MAX_FOLDER_LENGTH = 255; - @Autowired - BrowserService browserService; + private static final String PROJECT_PROPERTIES_FILE_NAME = "project_definition.properties"; //$NON-NLS-1$ + + private static final String PROJECTS = "projects"; //$NON-NLS-1$ @Autowired - private IPCCGenerator ipccGenerator; - - final Logger logger = LoggerFactory.getLogger(IPCCGeneratorService.class); + LocalPropertiesService localPropertiesService; - public void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws RdbExportException { + private Logger logger = LoggerFactory.getLogger( EarthProjectsService.class ); - try { + public void init(LocalPropertiesService localPropertiesService) { + this.localPropertiesService = localPropertiesService; + } + + public Map getProjectList(){ + ArrayList projectFolders = getProjects(); + + HashMap projectListByName = new HashMap<>(); + for (File projectFolder : projectFolders) { try { - if ( - (localPropertiesService.isUsingSqliteDB() && !getZippedProjectDB( ExportType.IPCC ).exists()) - || - isRefreshDatabase() - ) { - - // The user clicked on the option to refresh the database, or there is no - // previous copy of the Saiku DB - // Generate the DB file - ipccGenerator.generateRDB( earthSurveyService.getCollectSurvey(), progressListener); - - try { - // Save the DB file in a zipped file to extends GenerateDatabase keep for the next usages - replaceZippedProjectDB( ExportType.IPCC ); - } catch (Exception e) { - logger.error("Error while refreshing the Zipped content of the project IPCC DB", e); - } - - } else if (getZippedProjectDB(ExportType.IPCC).exists()) { - // If the zipped version of the project exists ( and the user clicked on the - // option to not refresh it) then restore this last version of the data - if (localPropertiesService.isUsingSqliteDB()) { - restoreZippedProjectDB(ExportType.IPCC); - } + File projectPropertiesFile = getProjectPropertiesFile( projectFolder ); + String projectName = getProjectSurveyName(projectPropertiesFile); + if( projectName != null ) { + projectListByName.put( projectName , projectFolder); } - - ipccGenerator.produceOutputs( earthSurveyService.getCollectSurvey(), progressListener ); + } catch (IOException e) { + logger.error("The project definition file cannot be read.", e); //$NON-NLS-1$ + } + + } + + return projectListByName; + } + + + private String getProjectSurveyName(File projectPropertiesFile) throws IOException { + Properties properties = getProjectProperties(projectPropertiesFile); + if( properties != null) + return properties.getProperty( EarthProperty.SURVEY_NAME.toString() ); + else + return null; + } + + + private ArrayList getProjects() { + String loadedProjects = localPropertiesService.getValue( EarthProperty.LOADED_PROJECTS ); + + String[] projectFolderPaths = loadedProjects.split( File.pathSeparator ); + + ArrayList workingProjectFolders = new ArrayList<>(); + + for (String projectFolder : projectFolderPaths) { + try { + + File projectFolderFile = new File(projectFolder); + File projectDefinitionFile = getProjectPropertiesFile( projectFolderFile); + if( validateProjectDefinitionFile( projectDefinitionFile ) ){ + workingProjectFolders.add( projectFolderFile ); + } + + } catch (IllegalArgumentException e) { + logger.error("The project definition file is not complete.", e); //$NON-NLS-1$ + } catch (IOException e) { + logger.error("The project definition file cannot be read.", e); //$NON-NLS-1$ + } + + } + + + return workingProjectFolders; + } + + + private boolean checkValidContent(File definitionFile) throws IOException { + Properties projectProperties = getProjectProperties( definitionFile ); + return projectProperties.containsKey( EarthProperty.SURVEY_NAME.toString() ); + + } + + + /** + * Loads the contents of the project-specific properties into earth.properties + * + * @param projectFolder The folder where the project definition and the rest of the files reside. + * @return True is the project was loaded correctly + * @throws IOException If the project folder or one of its files cannot be found + */ + public boolean loadProjectInFolder(File projectFolder) throws IOException{ + + File projectPropertiesFile = getProjectPropertiesFile( projectFolder ); + + boolean success = false; + + // Change the loaded project only if the project definition file has changed or the user changes project + if( + !getProjectDefinitionMD5().equals( CollectEarthUtils.getMd5FromFolder( projectFolder ) ) + && + validateProjectDefinitionFile(projectPropertiesFile) + ){ + + // Remove the version of the survey used so that it is asked again to the user! + localPropertiesService.removeModelVersionName(); + + Properties projectProperties = getProjectProperties( projectPropertiesFile ); + + applyPropertiesToCollectEarth( projectProperties, projectFolder ); + + addToProjectList(projectFolder); + + setProjectDefinitionMD5(projectFolder); + + moveSaikuQueriesToRepository(projectFolder, (String) projectProperties.get("survey_name") ); + + success = true; + } + + + return success; + } - } catch (final IPCCGeneratorException e) { - logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ - } - } catch (final CollectRdbException e) { - logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ + private void moveSaikuQueriesToRepository(File projectFolder, String surveyName) { + + try { + Collection saikuFiles = getSaikuFiles( projectFolder ); + + String repoDirectory = "tomcat/webapps/saiku/WEB-INF/classes/saiku-repository"; + File saikuRepo = new File( localPropertiesService.getSaikuFolder() + File.separator + repoDirectory + File.separator + surveyName ); + + for (File saikuFile : saikuFiles) { + FileUtils.copyFileToDirectory(saikuFile, saikuRepo, true); + } + } catch (IOException e) { + logger.error("Error moving the Saiku files", e); } + + + } + private Collection getSaikuFiles(File projectFolder) { + return FileUtils.listFiles(projectFolder, new IOFileFilter() { + + @Override + public boolean accept(File dir, String name) { + return name.endsWith("saiku"); + } + @Override + public boolean accept(File file) { - public static boolean surveyContains(String nodeName, CollectSurvey survey) { - NodeDefinition nodeDefForNAme = survey.getSchema().findNodeDefinition( nodeDef -> nodeDef.getName().equals(nodeName) ); - return nodeDefForNAme != null; + return file.getName().endsWith("saiku"); + } + }, null); + } + + private void setProjectDefinitionMD5(File projectFolder) throws IOException { + localPropertiesService.setValue( EarthProperty.ACTIVE_PROJECT_DEFINITION, CollectEarthUtils.getMd5FromFolder( projectFolder ) ); + } + + private String getProjectDefinitionMD5() { + return localPropertiesService.getValue( EarthProperty.ACTIVE_PROJECT_DEFINITION); } - @Override - public LocalPropertiesService getLocalPropertiesService() { - return localPropertiesService; + public File getProjectPropertiesFile(File projectFolder) { + return new File( projectFolder.getAbsolutePath() + File.separator + PROJECT_PROPERTIES_FILE_NAME ); } - @Override - public EarthSurveyService getEarthSurveyService() { - return earthSurveyService; + public File getSurveyStructureFile(File projectFolder) { + return new File( projectFolder.getAbsolutePath() + File.separator + PROJECT_PROPERTIES_FILE_NAME ); + } + + private void applyPropertiesToCollectEarth(Properties projectProperties, File projectFolder) { + + for (Object key : projectProperties.keySet()) { + String value = projectProperties.getProperty((String) key); + value = value.replace("${project_path}", projectFolder.getAbsolutePath()); //$NON-NLS-1$ + EarthProperty earthPropertyEnum = getEarthPropertyEnum(key); + if( earthPropertyEnum != null ){ + localPropertiesService.setValue( earthPropertyEnum , value); + }else{ + logger.warn("The property in the is unknown : {}", key) ; //$NON-NLS-1$ + } + } + + } + + private EarthProperty getEarthPropertyEnum(Object key) { + EarthProperty[] values = EarthProperty.values(); + for (EarthProperty earthProperty : values) { + if( earthProperty.toString().equals( key ) ){ + return earthProperty; + } + } + return null; + } + + private Properties getProjectProperties(File definitionFile) throws IOException { + try( FileReader fr = new FileReader( definitionFile ) ){ + Properties properties = new Properties(); + properties.load(fr); + return properties; + }catch(IOException e ) { + logger.error("Impossible to open properties file ", e); + throw e; + } + } + + private void addToProjectList(File projectFolder) { + String loadedProjects = localPropertiesService.getValue( EarthProperty.LOADED_PROJECTS ); + + if( loadedProjects.length() > 0 ){ + + if( !ArrayUtils.contains(loadedProjects.split(File.pathSeparator), projectFolder.getAbsoluteFile() ) ){ + loadedProjects += File.pathSeparatorChar + projectFolder.getAbsolutePath(); + + } + }else{ + loadedProjects = projectFolder.getAbsolutePath(); + } + localPropertiesService.setValue( EarthProperty.LOADED_PROJECTS, loadedProjects ); } - @Override - public RDBExporter getRdbExporter() { - return rdbExporter; + + private boolean validateProjectDefinitionFile(File projectDefinitionFile) throws IOException{ + boolean success = false; + if( projectDefinitionFile.exists() ){ + if( checkValidContent(projectDefinitionFile) ){ + success = true; + }else{ + throw new IllegalArgumentException("The project definition file does not contain the necessary property " + EarthProperty.SURVEY_NAME.toString()+ ". File located at : " + projectDefinitionFile.getAbsolutePath() ); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + return success; + } + + + public boolean folderContainsProjectDefinition(File folder ) throws IOException{ + File projectPropertiesFile = getProjectPropertiesFile( folder ); + return validateProjectDefinitionFile(projectPropertiesFile); + } + + + public boolean loadCompressedProjectFile( File projectZipFile ) throws IOException{ + + File unzippedFolder = unzipContentsOnProjectFolder(projectZipFile); + return( loadProjectInFolder(unzippedFolder) ); + } + + + private File unzipContentsOnProjectFolder(File projectZipFile) throws IOException { + String projectFolderName = "" ; + // There was an error in the first versions of Collect Earth that limited the folder names to 20 characters + // Newer version support up to 255 but we need to take in consideration backwards compatibility! + if ( oldFormatFolderExists( projectZipFile ) ){ + // If there was already a project with the older format of the name then use that! + projectFolderName = getProjectFolderName( projectZipFile , OLD_MAX_FOLDER_LENGTH ); + }else{ + projectFolderName = getProjectFolderName( projectZipFile , NEW_MAX_FOLDER_LENGTH ); + } + + return unzipContents(projectZipFile, projectFolderName); + } + + + private boolean oldFormatFolderExists(File projectZipFile) throws IOException { + String oldProjectFolderName = getProjectFolderName( projectZipFile , OLD_MAX_FOLDER_LENGTH ); + File oldProjectFolder = new File( getProjectsFolder() + File.separator + oldProjectFolderName ); + return oldProjectFolder.exists(); + } + + private String getProjectFolderName(File projectZipFile, int maxLenghtFolderName) throws IOException { + try( ZipFile zipFile = new ZipFile(projectZipFile) ){ + File definitionFolder = new File(EarthConstants.GENERATED_FOLDER); + zipFile.extractFile( PROJECT_PROPERTIES_FILE_NAME, definitionFolder.getAbsolutePath() ); + String projectName = getProjectSurveyName(new File( definitionFolder + File.separator + PROJECT_PROPERTIES_FILE_NAME) ); + if( projectName != null ) { + projectName = StringUtils.remove(projectName, " "); //$NON-NLS-1$ + + if( projectName.length() > maxLenghtFolderName ){ + projectName = projectName.substring(0, maxLenghtFolderName); + } + } + return projectName; + }catch(Exception e ) { + logger.error("Error opening project folder", projectZipFile.getAbsolutePath() ); + return null; + } + + } + + public String getProjectsFolder(){ + return FolderFinder.getCollectEarthDataFolder() + File.separator + PROJECTS; + } + + private File unzipContents(File projectZipFile, String projectName) throws ZipException { + File projectFolder = new File( getProjectsFolder() + File.separator + projectName ); + if( projectFolder.exists() || projectFolder.mkdirs() ){ + try( ZipFile zipFile = new ZipFile(projectZipFile) ){ + zipFile.extractAll( projectFolder.getAbsolutePath() ); + }catch(Exception e) { + logger.error("Error unzipping contents " + projectZipFile.getAbsolutePath(), e); + } + } + return projectFolder; } -} \ No newline at end of file +} From 2cf4a7ea20abb031a682b84a8c7b56bce0879857 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:50 +0100 Subject: [PATCH 0187/1620] New translations EarthProjectsService.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 401 +++++++++++++++--- 1 file changed, 346 insertions(+), 55 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 7633aaf9fd..4f3bc4f7d2 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,55 +1,346 @@ -package org.openforis.collect.earth.app.service; - -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.desktop.ServerController; - -public enum ExportType { - SAIKU( - ServerController.SAIKU_RDB_SUFFIX, - "Saiku", - "SaikuDataFolder", - EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + ServerController.SAIKU_RDB_SUFFIX, - EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU - ), - IPCC( - ServerController.IPCC_RDB_SUFFIX, - "Ipcc", - "IPCCDataFolder", - EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + ServerController.IPCC_RDB_SUFFIX, - EarthConstants.POSTGRES_RDB_SCHEMA_IPCC - ); - - private String dbSuffix; - private String prefix; - private String dataFolder; - private String dbFileName; - private String rdbSchema; - - ExportType(String dbSuffix, String prefix, String dataFolder, String dbFileName, String rdbSchema ) { - this.dbSuffix = dbSuffix; - this.prefix = prefix; - this.dbFileName = dbFileName; - this.rdbSchema = rdbSchema; - } - - public String getDbSuffix() { - return dbSuffix; - } - - public String getPrefix() { - return prefix; - } - - public String getDataFolder() { - return dataFolder; - } - - public String getDbFileName() { - return dbFileName; - } - - public String getRdbSchema() { - return rdbSchema; - } - -} \ No newline at end of file +package org.openforis.collect.earth.app.service; + +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.filefilter.IOFileFilter; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.exception.ZipException; + + + +@Component +public class EarthProjectsService { + + + private static final int OLD_MAX_FOLDER_LENGTH = 20; + + private static final int NEW_MAX_FOLDER_LENGTH = 255; + + private static final String PROJECT_PROPERTIES_FILE_NAME = "project_definition.properties"; //$NON-NLS-1$ + + private static final String PROJECTS = "projects"; //$NON-NLS-1$ + + @Autowired + LocalPropertiesService localPropertiesService; + + private Logger logger = LoggerFactory.getLogger( EarthProjectsService.class ); + + public void init(LocalPropertiesService localPropertiesService) { + this.localPropertiesService = localPropertiesService; + } + + public Map getProjectList(){ + ArrayList projectFolders = getProjects(); + + HashMap projectListByName = new HashMap<>(); + for (File projectFolder : projectFolders) { + + try { + + File projectPropertiesFile = getProjectPropertiesFile( projectFolder ); + String projectName = getProjectSurveyName(projectPropertiesFile); + if( projectName != null ) { + projectListByName.put( projectName , projectFolder); + } + } catch (IOException e) { + logger.error("The project definition file cannot be read.", e); //$NON-NLS-1$ + } + + } + + return projectListByName; + } + + + private String getProjectSurveyName(File projectPropertiesFile) throws IOException { + Properties properties = getProjectProperties(projectPropertiesFile); + if( properties != null) + return properties.getProperty( EarthProperty.SURVEY_NAME.toString() ); + else + return null; + } + + + private ArrayList getProjects() { + String loadedProjects = localPropertiesService.getValue( EarthProperty.LOADED_PROJECTS ); + + String[] projectFolderPaths = loadedProjects.split( File.pathSeparator ); + + ArrayList workingProjectFolders = new ArrayList<>(); + + for (String projectFolder : projectFolderPaths) { + try { + + File projectFolderFile = new File(projectFolder); + File projectDefinitionFile = getProjectPropertiesFile( projectFolderFile); + if( validateProjectDefinitionFile( projectDefinitionFile ) ){ + workingProjectFolders.add( projectFolderFile ); + } + + } catch (IllegalArgumentException e) { + logger.error("The project definition file is not complete.", e); //$NON-NLS-1$ + } catch (IOException e) { + logger.error("The project definition file cannot be read.", e); //$NON-NLS-1$ + } + + } + + + return workingProjectFolders; + } + + + private boolean checkValidContent(File definitionFile) throws IOException { + Properties projectProperties = getProjectProperties( definitionFile ); + return projectProperties.containsKey( EarthProperty.SURVEY_NAME.toString() ); + + } + + + /** + * Loads the contents of the project-specific properties into earth.properties + * + * @param projectFolder The folder where the project definition and the rest of the files reside. + * @return True is the project was loaded correctly + * @throws IOException If the project folder or one of its files cannot be found + */ + public boolean loadProjectInFolder(File projectFolder) throws IOException{ + + File projectPropertiesFile = getProjectPropertiesFile( projectFolder ); + + boolean success = false; + + // Change the loaded project only if the project definition file has changed or the user changes project + if( + !getProjectDefinitionMD5().equals( CollectEarthUtils.getMd5FromFolder( projectFolder ) ) + && + validateProjectDefinitionFile(projectPropertiesFile) + ){ + + // Remove the version of the survey used so that it is asked again to the user! + localPropertiesService.removeModelVersionName(); + + Properties projectProperties = getProjectProperties( projectPropertiesFile ); + + applyPropertiesToCollectEarth( projectProperties, projectFolder ); + + addToProjectList(projectFolder); + + setProjectDefinitionMD5(projectFolder); + + moveSaikuQueriesToRepository(projectFolder, (String) projectProperties.get("survey_name") ); + + success = true; + } + + + return success; + } + + + private void moveSaikuQueriesToRepository(File projectFolder, String surveyName) { + + try { + Collection saikuFiles = getSaikuFiles( projectFolder ); + + String repoDirectory = "tomcat/webapps/saiku/WEB-INF/classes/saiku-repository"; + File saikuRepo = new File( localPropertiesService.getSaikuFolder() + File.separator + repoDirectory + File.separator + surveyName ); + + for (File saikuFile : saikuFiles) { + FileUtils.copyFileToDirectory(saikuFile, saikuRepo, true); + } + } catch (IOException e) { + logger.error("Error moving the Saiku files", e); + } + + + + } + + private Collection getSaikuFiles(File projectFolder) { + return FileUtils.listFiles(projectFolder, new IOFileFilter() { + + @Override + public boolean accept(File dir, String name) { + return name.endsWith("saiku"); + } + + @Override + public boolean accept(File file) { + + return file.getName().endsWith("saiku"); + } + }, null); + } + + private void setProjectDefinitionMD5(File projectFolder) throws IOException { + localPropertiesService.setValue( EarthProperty.ACTIVE_PROJECT_DEFINITION, CollectEarthUtils.getMd5FromFolder( projectFolder ) ); + } + + private String getProjectDefinitionMD5() { + return localPropertiesService.getValue( EarthProperty.ACTIVE_PROJECT_DEFINITION); + } + + + public File getProjectPropertiesFile(File projectFolder) { + return new File( projectFolder.getAbsolutePath() + File.separator + PROJECT_PROPERTIES_FILE_NAME ); + } + + public File getSurveyStructureFile(File projectFolder) { + return new File( projectFolder.getAbsolutePath() + File.separator + PROJECT_PROPERTIES_FILE_NAME ); + } + + private void applyPropertiesToCollectEarth(Properties projectProperties, File projectFolder) { + + for (Object key : projectProperties.keySet()) { + String value = projectProperties.getProperty((String) key); + value = value.replace("${project_path}", projectFolder.getAbsolutePath()); //$NON-NLS-1$ + EarthProperty earthPropertyEnum = getEarthPropertyEnum(key); + if( earthPropertyEnum != null ){ + localPropertiesService.setValue( earthPropertyEnum , value); + }else{ + logger.warn("The property in the is unknown : {}", key) ; //$NON-NLS-1$ + } + } + + } + + private EarthProperty getEarthPropertyEnum(Object key) { + EarthProperty[] values = EarthProperty.values(); + for (EarthProperty earthProperty : values) { + if( earthProperty.toString().equals( key ) ){ + return earthProperty; + } + } + return null; + } + + private Properties getProjectProperties(File definitionFile) throws IOException { + try( FileReader fr = new FileReader( definitionFile ) ){ + Properties properties = new Properties(); + properties.load(fr); + return properties; + }catch(IOException e ) { + logger.error("Impossible to open properties file ", e); + throw e; + } + } + + private void addToProjectList(File projectFolder) { + String loadedProjects = localPropertiesService.getValue( EarthProperty.LOADED_PROJECTS ); + + if( loadedProjects.length() > 0 ){ + + if( !ArrayUtils.contains(loadedProjects.split(File.pathSeparator), projectFolder.getAbsoluteFile() ) ){ + loadedProjects += File.pathSeparatorChar + projectFolder.getAbsolutePath(); + + } + }else{ + loadedProjects = projectFolder.getAbsolutePath(); + } + localPropertiesService.setValue( EarthProperty.LOADED_PROJECTS, loadedProjects ); + } + + + private boolean validateProjectDefinitionFile(File projectDefinitionFile) throws IOException{ + boolean success = false; + if( projectDefinitionFile.exists() ){ + if( checkValidContent(projectDefinitionFile) ){ + success = true; + }else{ + throw new IllegalArgumentException("The project definition file does not contain the necessary property " + EarthProperty.SURVEY_NAME.toString()+ ". File located at : " + projectDefinitionFile.getAbsolutePath() ); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + return success; + } + + + public boolean folderContainsProjectDefinition(File folder ) throws IOException{ + File projectPropertiesFile = getProjectPropertiesFile( folder ); + return validateProjectDefinitionFile(projectPropertiesFile); + } + + + public boolean loadCompressedProjectFile( File projectZipFile ) throws IOException{ + + File unzippedFolder = unzipContentsOnProjectFolder(projectZipFile); + return( loadProjectInFolder(unzippedFolder) ); + } + + + private File unzipContentsOnProjectFolder(File projectZipFile) throws IOException { + String projectFolderName = "" ; + // There was an error in the first versions of Collect Earth that limited the folder names to 20 characters + // Newer version support up to 255 but we need to take in consideration backwards compatibility! + if ( oldFormatFolderExists( projectZipFile ) ){ + // If there was already a project with the older format of the name then use that! + projectFolderName = getProjectFolderName( projectZipFile , OLD_MAX_FOLDER_LENGTH ); + }else{ + projectFolderName = getProjectFolderName( projectZipFile , NEW_MAX_FOLDER_LENGTH ); + } + + return unzipContents(projectZipFile, projectFolderName); + } + + + private boolean oldFormatFolderExists(File projectZipFile) throws IOException { + String oldProjectFolderName = getProjectFolderName( projectZipFile , OLD_MAX_FOLDER_LENGTH ); + File oldProjectFolder = new File( getProjectsFolder() + File.separator + oldProjectFolderName ); + return oldProjectFolder.exists(); + } + + private String getProjectFolderName(File projectZipFile, int maxLenghtFolderName) throws IOException { + try( ZipFile zipFile = new ZipFile(projectZipFile) ){ + File definitionFolder = new File(EarthConstants.GENERATED_FOLDER); + zipFile.extractFile( PROJECT_PROPERTIES_FILE_NAME, definitionFolder.getAbsolutePath() ); + String projectName = getProjectSurveyName(new File( definitionFolder + File.separator + PROJECT_PROPERTIES_FILE_NAME) ); + if( projectName != null ) { + projectName = StringUtils.remove(projectName, " "); //$NON-NLS-1$ + + if( projectName.length() > maxLenghtFolderName ){ + projectName = projectName.substring(0, maxLenghtFolderName); + } + } + return projectName; + }catch(Exception e ) { + logger.error("Error opening project folder", projectZipFile.getAbsolutePath() ); + return null; + } + + } + + public String getProjectsFolder(){ + return FolderFinder.getCollectEarthDataFolder() + File.separator + PROJECTS; + } + + private File unzipContents(File projectZipFile, String projectName) throws ZipException { + File projectFolder = new File( getProjectsFolder() + File.separator + projectName ); + if( projectFolder.exists() || projectFolder.mkdirs() ){ + try( ZipFile zipFile = new ZipFile(projectZipFile) ){ + zipFile.extractAll( projectFolder.getAbsolutePath() ); + }catch(Exception e) { + logger.error("Error unzipping contents " + projectZipFile.getAbsolutePath(), e); + } + } + return projectFolder; + } + +} From da8237d8ca801c5c02d9f8dbaba2fa2d3b834019 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:51 +0100 Subject: [PATCH 0188/1620] New translations EarthProjectsService.java (English) --- .../earth/app/view/Messages_en.properties | 416 ++++++++++++------ 1 file changed, 284 insertions(+), 132 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index eb9f542d80..4f3bc4f7d2 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,194 +1,346 @@ package org.openforis.collect.earth.app.service; import java.io.File; +import java.io.FileReader; +import java.io.IOException; import java.util.ArrayList; -import java.util.Date; -import java.util.List; - +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.filefilter.IOFileFilter; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.io.data.CSVDataExportProcess; -import org.openforis.collect.io.data.CSVDataImportProcess; -import org.openforis.collect.io.data.DataExportStatus; -import org.openforis.collect.io.data.DataImportSummaryItem; -import org.openforis.collect.io.data.XMLDataExportProcess; -import org.openforis.collect.io.data.XMLDataImportProcess; -import org.openforis.collect.io.data.csv.CSVDataExportParameters; -import org.openforis.collect.io.data.csv.CSVDataImportSettings; -import org.openforis.collect.manager.process.AbstractProcess; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.RecordFilter; -import org.openforis.commons.collection.Predicate; -import org.openforis.idm.model.BooleanAttribute; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ +import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.exception.ZipException; + + + @Component -public class DataImportExportService { +public class EarthProjectsService { - @Autowired - private EarthSurveyService earthSurveyService; + + private static final int OLD_MAX_FOLDER_LENGTH = 20; + + private static final int NEW_MAX_FOLDER_LENGTH = 255; + + private static final String PROJECT_PROPERTIES_FILE_NAME = "project_definition.properties"; //$NON-NLS-1$ + + private static final String PROJECTS = "projects"; //$NON-NLS-1$ @Autowired - private LocalPropertiesService localPropertiesService; + LocalPropertiesService localPropertiesService; + + private Logger logger = LoggerFactory.getLogger( EarthProjectsService.class ); + + public void init(LocalPropertiesService localPropertiesService) { + this.localPropertiesService = localPropertiesService; + } + + public Map getProjectList(){ + ArrayList projectFolders = getProjects(); + + HashMap projectListByName = new HashMap<>(); + for (File projectFolder : projectFolders) { + + try { + + File projectPropertiesFile = getProjectPropertiesFile( projectFolder ); + String projectName = getProjectSurveyName(projectPropertiesFile); + if( projectName != null ) { + projectListByName.put( projectName , projectFolder); + } + } catch (IOException e) { + logger.error("The project definition file cannot be read.", e); //$NON-NLS-1$ + } + + } + + return projectListByName; + } + + + private String getProjectSurveyName(File projectPropertiesFile) throws IOException { + Properties properties = getProjectProperties(projectPropertiesFile); + if( properties != null) + return properties.getProperty( EarthProperty.SURVEY_NAME.toString() ); + else + return null; + } + + + private ArrayList getProjects() { + String loadedProjects = localPropertiesService.getValue( EarthProperty.LOADED_PROJECTS ); + + String[] projectFolderPaths = loadedProjects.split( File.pathSeparator ); + + ArrayList workingProjectFolders = new ArrayList<>(); + + for (String projectFolder : projectFolderPaths) { + try { + + File projectFolderFile = new File(projectFolder); + File projectDefinitionFile = getProjectPropertiesFile( projectFolderFile); + if( validateProjectDefinitionFile( projectDefinitionFile ) ){ + workingProjectFolders.add( projectFolderFile ); + } + + } catch (IllegalArgumentException e) { + logger.error("The project definition file is not complete.", e); //$NON-NLS-1$ + } catch (IOException e) { + logger.error("The project definition file cannot be read.", e); //$NON-NLS-1$ + } + + } + + + return workingProjectFolders; + } + + + private boolean checkValidContent(File definitionFile) throws IOException { + Properties projectProperties = getProjectProperties( definitionFile ); + return projectProperties.containsKey( EarthProperty.SURVEY_NAME.toString() ); + + } + - private final Logger logger = LoggerFactory.getLogger(DataImportExportService.class); /** - * Use the application context to get a new bean everytime the data is exported ( as a new instance is needed every time) + * Loads the contents of the project-specific properties into earth.properties + * + * @param projectFolder The folder where the project definition and the rest of the files reside. + * @return True is the project was loaded correctly + * @throws IOException If the project folder or one of its files cannot be found */ - @Autowired - private ApplicationContext applicationContext; + public boolean loadProjectInFolder(File projectFolder) throws IOException{ + + File projectPropertiesFile = getProjectPropertiesFile( projectFolder ); + + boolean success = false; + + // Change the loaded project only if the project definition file has changed or the user changes project + if( + !getProjectDefinitionMD5().equals( CollectEarthUtils.getMd5FromFolder( projectFolder ) ) + && + validateProjectDefinitionFile(projectPropertiesFile) + ){ + + // Remove the version of the survey used so that it is asked again to the user! + localPropertiesService.removeModelVersionName(); - private void addRecordsToImportList( List recordsToImport, List entryIdsToImport) { - if (recordsToImport != null) { - List cleanRecordsToImport = recordsToImport; - for (final DataImportSummaryItem importRecord : cleanRecordsToImport) { - entryIdsToImport.add(importRecord.getEntryId()); + Properties projectProperties = getProjectProperties( projectPropertiesFile ); + + applyPropertiesToCollectEarth( projectProperties, projectFolder ); + + addToProjectList(projectFolder); + + setProjectDefinitionMD5(projectFolder); + + moveSaikuQueriesToRepository(projectFolder, (String) projectProperties.get("survey_name") ); + + success = true; + } + + + return success; + } + + + private void moveSaikuQueriesToRepository(File projectFolder, String surveyName) { + + try { + Collection saikuFiles = getSaikuFiles( projectFolder ); + + String repoDirectory = "tomcat/webapps/saiku/WEB-INF/classes/saiku-repository"; + File saikuRepo = new File( localPropertiesService.getSaikuFolder() + File.separator + repoDirectory + File.separator + surveyName ); + + for (File saikuFile : saikuFiles) { + FileUtils.copyFileToDirectory(saikuFile, saikuRepo, true); } + } catch (IOException e) { + logger.error("Error moving the Saiku files", e); } + + + } - public CSVDataExportProcess exportSurveyAsCsv(File exportToFile, boolean includeCodeItemLabelColumn) { - final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); - csvDataExportProcess.setOutputFile(exportToFile); + private Collection getSaikuFiles(File projectFolder) { + return FileUtils.listFiles(projectFolder, new IOFileFilter() { - csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); - csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; + @Override + public boolean accept(File dir, String name) { + return name.endsWith("saiku"); + } - CSVDataExportParameters config = new CSVDataExportParameters(); - config.setIncludeAllAncestorAttributes(true); - config.setIncludeEnumeratedEntities(true); - config.setLanguageCode( localPropertiesService.getValue(EarthProperty.UI_LANGUAGE) ); - config.setIncludeCodeItemLabelColumn(includeCodeItemLabelColumn); - csvDataExportProcess.setConfiguration(config); + @Override + public boolean accept(File file) { - return csvDataExportProcess; + return file.getName().endsWith("saiku"); + } + }, null); } - private RecordFilter getRecordFilter( ) { - RecordFilter recordFilter = new RecordFilter(earthSurveyService.getCollectSurvey(), earthSurveyService.getRootEntityDefinition().getId()); - recordFilter.setStepGreaterOrEqual(Step.ENTRY); - return recordFilter; + private void setProjectDefinitionMD5(File projectFolder) throws IOException { + localPropertiesService.setValue( EarthProperty.ACTIVE_PROJECT_DEFINITION, CollectEarthUtils.getMd5FromFolder( projectFolder ) ); } - public CSVDataExportProcess exportSurveyAsFusionTable(File exportToFile, boolean includeCodeItemLabelColumn) { + private String getProjectDefinitionMD5() { + return localPropertiesService.getValue( EarthProperty.ACTIVE_PROJECT_DEFINITION); + } - final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); - csvDataExportProcess.setOutputFile(exportToFile); - csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); - csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; - CSVDataExportParameters config = new CSVDataExportParameters(); - config.setIncludeAllAncestorAttributes(true); - config.setLanguageCode( localPropertiesService.getValue(EarthProperty.UI_LANGUAGE) ); - config.setIncludeCodeItemPositionColumn(true); - config.setIncludeKMLColumnForCoordinates(true); - config.setIncludeCodeItemLabelColumn( includeCodeItemLabelColumn ); - csvDataExportProcess.setConfiguration(config); - return csvDataExportProcess; + public File getProjectPropertiesFile(File projectFolder) { + return new File( projectFolder.getAbsolutePath() + File.separator + PROJECT_PROPERTIES_FILE_NAME ); } - public XMLDataExportProcess exportSurveyAsZipWithXml(File exportToFile, Date modifiedSince) throws Exception { - final XMLDataExportProcess xmlDataExportProcess = applicationContext.getBean(XMLDataExportProcess.class); - xmlDataExportProcess.setOutputFile(exportToFile); - xmlDataExportProcess.setRootEntityName(EarthConstants.ROOT_ENTITY_NAME); - xmlDataExportProcess.setSurvey(earthSurveyService.getCollectSurvey()); - xmlDataExportProcess.setModifiedSince(modifiedSince); - xmlDataExportProcess.setIncludeIdm(true); - xmlDataExportProcess.setSteps(new Step[] { Step.ENTRY }); - return xmlDataExportProcess; + public File getSurveyStructureFile(File projectFolder) { + return new File( projectFolder.getAbsolutePath() + File.separator + PROJECT_PROPERTIES_FILE_NAME ); } + private void applyPropertiesToCollectEarth(Properties projectProperties, File projectFolder) { + + for (Object key : projectProperties.keySet()) { + String value = projectProperties.getProperty((String) key); + value = value.replace("${project_path}", projectFolder.getAbsolutePath()); //$NON-NLS-1$ + EarthProperty earthPropertyEnum = getEarthPropertyEnum(key); + if( earthPropertyEnum != null ){ + localPropertiesService.setValue( earthPropertyEnum , value); + }else{ + logger.warn("The property in the is unknown : {}", key) ; //$NON-NLS-1$ + } + } + + } - public CSVDataImportProcess getCsvImporterProcess(File importFromFile) { - final CSVDataImportProcess importProcess = applicationContext.getBean("transactionalCsvDataImportProcess", CSVDataImportProcess.class); + private EarthProperty getEarthPropertyEnum(Object key) { + EarthProperty[] values = EarthProperty.values(); + for (EarthProperty earthProperty : values) { + if( earthProperty.toString().equals( key ) ){ + return earthProperty; + } + } + return null; + } - importProcess.setFile(importFromFile); - importProcess.setSurvey(earthSurveyService.getCollectSurvey()); - importProcess.setParentEntityDefinitionId(earthSurveyService.getRootEntityDefinition().getId()); - importProcess.setStep(Step.ENTRY ); - CSVDataImportSettings settings = new CSVDataImportSettings(); - settings.setRecordValidationEnabled(false); - settings.setInsertNewRecords(false); - settings.setNewRecordVersionName(null); - settings.setReportNoRecordFoundErrors(false); - importProcess.setSettings(settings); - return importProcess; + private Properties getProjectProperties(File definitionFile) throws IOException { + try( FileReader fr = new FileReader( definitionFile ) ){ + Properties properties = new Properties(); + properties.load(fr); + return properties; + }catch(IOException e ) { + logger.error("Impossible to open properties file ", e); + throw e; + } } - public XMLDataImportProcess getImportSummary(File zipWithXml, boolean importNonFinishedPlots) throws Exception { - final XMLDataImportProcess dataImportProcess = applicationContext.getBean(XMLDataImportProcess.class); - dataImportProcess.init(); - dataImportProcess.setFile(zipWithXml); - dataImportProcess.setValidateRecords(false); - dataImportProcess.prepareToStartSummaryCreation(); + private void addToProjectList(File projectFolder) { + String loadedProjects = localPropertiesService.getValue( EarthProperty.LOADED_PROJECTS ); - if( !importNonFinishedPlots ){ // Import only plots whose actively_saved state is set to true - dataImportProcess.setIncludeRecordPredicate( new Predicate() { + if( loadedProjects.length() > 0 ){ - @Override - public boolean evaluate(CollectRecord record) { - boolean include = true; + if( !ArrayUtils.contains(loadedProjects.split(File.pathSeparator), projectFolder.getAbsoluteFile() ) ){ + loadedProjects += File.pathSeparatorChar + projectFolder.getAbsolutePath(); - try { - final BooleanAttribute node = (BooleanAttribute) record.getNodeByPath("/plot/" + EarthConstants.ACTIVELY_SAVED_ATTRIBUTE_NAME); //$NON-NLS-1$ + } + }else{ + loadedProjects = projectFolder.getAbsolutePath(); + } + localPropertiesService.setValue( EarthProperty.LOADED_PROJECTS, loadedProjects ); + } - include = (node == null || (node != null && !node.isEmpty() && node.getValue().getValue()) ); - } catch (Exception e) { - logger.error("No \"/plot/actively_saved\" node found ", e ); //$NON-NLS-1$ - } - return include; - } - }); + private boolean validateProjectDefinitionFile(File projectDefinitionFile) throws IOException{ + boolean success = false; + if( projectDefinitionFile.exists() ){ + if( checkValidContent(projectDefinitionFile) ){ + success = true; + }else{ + throw new IllegalArgumentException("The project definition file does not contain the necessary property " + EarthProperty.SURVEY_NAME.toString()+ ". File located at : " + projectDefinitionFile.getAbsolutePath() ); //$NON-NLS-1$ //$NON-NLS-2$ + } } - return dataImportProcess; + return success; + } + + + public boolean folderContainsProjectDefinition(File folder ) throws IOException{ + File projectPropertiesFile = getProjectPropertiesFile( folder ); + return validateProjectDefinitionFile(projectPropertiesFile); } - public void importRecordsFrom(File zipWithXml, XMLDataImportProcess dataImportProcess, List listConflictingRecords) throws Exception { - final List entryIdsToImport = new ArrayList(); - addRecordsToImportList( listConflictingRecords, entryIdsToImport); - addRecordsToImportList( dataImportProcess.getSummary().getRecordsToImport(),entryIdsToImport); + public boolean loadCompressedProjectFile( File projectZipFile ) throws IOException{ + + File unzippedFolder = unzipContentsOnProjectFolder(projectZipFile); + return( loadProjectInFolder(unzippedFolder) ); + } - dataImportProcess.setEntryIdsToImport(entryIdsToImport); - dataImportProcess.prepareToStartImport(); - dataImportProcess.call(); - int conflictingRecordsAdded = 0; - if (listConflictingRecords != null) { - conflictingRecordsAdded = listConflictingRecords.size(); + private File unzipContentsOnProjectFolder(File projectZipFile) throws IOException { + String projectFolderName = "" ; + // There was an error in the first versions of Collect Earth that limited the folder names to 20 characters + // Newer version support up to 255 but we need to take in consideration backwards compatibility! + if ( oldFormatFolderExists( projectZipFile ) ){ + // If there was already a project with the older format of the name then use that! + projectFolderName = getProjectFolderName( projectZipFile , OLD_MAX_FOLDER_LENGTH ); + }else{ + projectFolderName = getProjectFolderName( projectZipFile , NEW_MAX_FOLDER_LENGTH ); } - logger.warn("Data imported into db. Number of Records imported : {} Conflicting records added : {}" //$NON-NLS-1$ //$NON-NLS-2$ - ,entryIdsToImport.size(), conflictingRecordsAdded); + return unzipContents(projectZipFile, projectFolderName); + } + + + private boolean oldFormatFolderExists(File projectZipFile) throws IOException { + String oldProjectFolderName = getProjectFolderName( projectZipFile , OLD_MAX_FOLDER_LENGTH ); + File oldProjectFolder = new File( getProjectsFolder() + File.separator + oldProjectFolderName ); + return oldProjectFolder.exists(); } - public AbstractProcess exportSurveyAsBackup(File exportToFile) { - final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); - csvDataExportProcess.setOutputFile(exportToFile); - csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); - csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; + private String getProjectFolderName(File projectZipFile, int maxLenghtFolderName) throws IOException { + try( ZipFile zipFile = new ZipFile(projectZipFile) ){ + File definitionFolder = new File(EarthConstants.GENERATED_FOLDER); + zipFile.extractFile( PROJECT_PROPERTIES_FILE_NAME, definitionFolder.getAbsolutePath() ); + String projectName = getProjectSurveyName(new File( definitionFolder + File.separator + PROJECT_PROPERTIES_FILE_NAME) ); + if( projectName != null ) { + projectName = StringUtils.remove(projectName, " "); //$NON-NLS-1$ + + if( projectName.length() > maxLenghtFolderName ){ + projectName = projectName.substring(0, maxLenghtFolderName); + } + } + return projectName; + }catch(Exception e ) { + logger.error("Error opening project folder", projectZipFile.getAbsolutePath() ); + return null; + } + } - CSVDataExportParameters config = new CSVDataExportParameters(); - config.setIncludeAllAncestorAttributes(true); - config.setIncludeCodeItemPositionColumn(true); - config.setIncludeKMLColumnForCoordinates(true); - csvDataExportProcess.setConfiguration(config); - return csvDataExportProcess; + public String getProjectsFolder(){ + return FolderFinder.getCollectEarthDataFolder() + File.separator + PROJECTS; } - public EarthSurveyService getEarthSurveyService() { - return earthSurveyService; + private File unzipContents(File projectZipFile, String projectName) throws ZipException { + File projectFolder = new File( getProjectsFolder() + File.separator + projectName ); + if( projectFolder.exists() || projectFolder.mkdirs() ){ + try( ZipFile zipFile = new ZipFile(projectZipFile) ){ + zipFile.extractAll( projectFolder.getAbsolutePath() ); + }catch(Exception e) { + logger.error("Error unzipping contents " + projectZipFile.getAbsolutePath(), e); + } + } + return projectFolder; } } From d462df51d742f2905b17eee2d0b6f107b4085f9c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:52 +0100 Subject: [PATCH 0189/1620] New translations EarthSurveyService.java (French) --- .../earth/app/view/Messages_fr.properties | 364 ++---------------- 1 file changed, 35 insertions(+), 329 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 4f3bc4f7d2..cb792b907b 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,346 +1,52 @@ package org.openforis.collect.earth.app.service; +import static org.openforis.collect.earth.app.EarthConstants.EARTH_SURVEY_NAME; + import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; +import java.io.FileInputStream; -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.filefilter.IOFileFilter; -import org.apache.commons.lang3.ArrayUtils; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; +import org.openforis.collect.manager.exception.SurveyValidationException; +import org.openforis.collect.model.CollectSurvey; +import org.springframework.beans.factory.InitializingBean; import org.springframework.stereotype.Component; -import net.lingala.zip4j.ZipFile; -import net.lingala.zip4j.exception.ZipException; - - - @Component -public class EarthProjectsService { - - - private static final int OLD_MAX_FOLDER_LENGTH = 20; - - private static final int NEW_MAX_FOLDER_LENGTH = 255; - - private static final String PROJECT_PROPERTIES_FILE_NAME = "project_definition.properties"; //$NON-NLS-1$ - - private static final String PROJECTS = "projects"; //$NON-NLS-1$ - - @Autowired - LocalPropertiesService localPropertiesService; - - private Logger logger = LoggerFactory.getLogger( EarthProjectsService.class ); - - public void init(LocalPropertiesService localPropertiesService) { - this.localPropertiesService = localPropertiesService; - } - - public Map getProjectList(){ - ArrayList projectFolders = getProjects(); - - HashMap projectListByName = new HashMap<>(); - for (File projectFolder : projectFolders) { - - try { +public class EarthSurveyService extends AbstractEarthSurveyService implements InitializingBean{ - File projectPropertiesFile = getProjectPropertiesFile( projectFolder ); - String projectName = getProjectSurveyName(projectPropertiesFile); - if( projectName != null ) { - projectListByName.put( projectName , projectFolder); - } - } catch (IOException e) { - logger.error("The project definition file cannot be read.", e); //$NON-NLS-1$ - } - - } - - return projectListByName; - } - - - private String getProjectSurveyName(File projectPropertiesFile) throws IOException { - Properties properties = getProjectProperties(projectPropertiesFile); - if( properties != null) - return properties.getProperty( EarthProperty.SURVEY_NAME.toString() ); - else - return null; - } + @Override + public void afterPropertiesSet() throws Exception { + // Initialize the Collect survey using the idm + // This is only done if the survey has not yet been created in the DB - - private ArrayList getProjects() { - String loadedProjects = localPropertiesService.getValue( EarthProperty.LOADED_PROJECTS ); - - String[] projectFolderPaths = loadedProjects.split( File.pathSeparator ); - - ArrayList workingProjectFolders = new ArrayList<>(); - - for (String projectFolder : projectFolderPaths) { + if (getCollectSurvey() == null) { + CollectSurvey survey; try { - - File projectFolderFile = new File(projectFolder); - File projectDefinitionFile = getProjectPropertiesFile( projectFolderFile); - if( validateProjectDefinitionFile( projectDefinitionFile ) ){ - workingProjectFolders.add( projectFolderFile ); - } - - } catch (IllegalArgumentException e) { - logger.error("The project definition file is not complete.", e); //$NON-NLS-1$ - } catch (IOException e) { - logger.error("The project definition file cannot be read.", e); //$NON-NLS-1$ - } - - } - - - return workingProjectFolders; - } - - - private boolean checkValidContent(File definitionFile) throws IOException { - Properties projectProperties = getProjectProperties( definitionFile ); - return projectProperties.containsKey( EarthProperty.SURVEY_NAME.toString() ); - - } - - - /** - * Loads the contents of the project-specific properties into earth.properties - * - * @param projectFolder The folder where the project definition and the rest of the files reside. - * @return True is the project was loaded correctly - * @throws IOException If the project folder or one of its files cannot be found - */ - public boolean loadProjectInFolder(File projectFolder) throws IOException{ - - File projectPropertiesFile = getProjectPropertiesFile( projectFolder ); - - boolean success = false; - - // Change the loaded project only if the project definition file has changed or the user changes project - if( - !getProjectDefinitionMD5().equals( CollectEarthUtils.getMd5FromFolder( projectFolder ) ) - && - validateProjectDefinitionFile(projectPropertiesFile) - ){ - - // Remove the version of the survey used so that it is asked again to the user! - localPropertiesService.removeModelVersionName(); - - Properties projectProperties = getProjectProperties( projectPropertiesFile ); - - applyPropertiesToCollectEarth( projectProperties, projectFolder ); - - addToProjectList(projectFolder); - - setProjectDefinitionMD5(projectFolder); - - moveSaikuQueriesToRepository(projectFolder, (String) projectProperties.get("survey_name") ); - - success = true; - } - - - return success; - } - - - private void moveSaikuQueriesToRepository(File projectFolder, String surveyName) { - - try { - Collection saikuFiles = getSaikuFiles( projectFolder ); - - String repoDirectory = "tomcat/webapps/saiku/WEB-INF/classes/saiku-repository"; - File saikuRepo = new File( localPropertiesService.getSaikuFolder() + File.separator + repoDirectory + File.separator + surveyName ); - - for (File saikuFile : saikuFiles) { - FileUtils.copyFileToDirectory(saikuFile, saikuRepo, true); - } - } catch (IOException e) { - logger.error("Error moving the Saiku files", e); - } - - - - } - - private Collection getSaikuFiles(File projectFolder) { - return FileUtils.listFiles(projectFolder, new IOFileFilter() { - - @Override - public boolean accept(File dir, String name) { - return name.endsWith("saiku"); - } - - @Override - public boolean accept(File file) { - - return file.getName().endsWith("saiku"); - } - }, null); - } - - private void setProjectDefinitionMD5(File projectFolder) throws IOException { - localPropertiesService.setValue( EarthProperty.ACTIVE_PROJECT_DEFINITION, CollectEarthUtils.getMd5FromFolder( projectFolder ) ); - } - - private String getProjectDefinitionMD5() { - return localPropertiesService.getValue( EarthProperty.ACTIVE_PROJECT_DEFINITION); - } - - - public File getProjectPropertiesFile(File projectFolder) { - return new File( projectFolder.getAbsolutePath() + File.separator + PROJECT_PROPERTIES_FILE_NAME ); - } - - public File getSurveyStructureFile(File projectFolder) { - return new File( projectFolder.getAbsolutePath() + File.separator + PROJECT_PROPERTIES_FILE_NAME ); - } - - private void applyPropertiesToCollectEarth(Properties projectProperties, File projectFolder) { - - for (Object key : projectProperties.keySet()) { - String value = projectProperties.getProperty((String) key); - value = value.replace("${project_path}", projectFolder.getAbsolutePath()); //$NON-NLS-1$ - EarthProperty earthPropertyEnum = getEarthPropertyEnum(key); - if( earthPropertyEnum != null ){ - localPropertiesService.setValue( earthPropertyEnum , value); - }else{ - logger.warn("The property in the is unknown : {}", key) ; //$NON-NLS-1$ - } - } - - } - - private EarthProperty getEarthPropertyEnum(Object key) { - EarthProperty[] values = EarthProperty.values(); - for (EarthProperty earthProperty : values) { - if( earthProperty.toString().equals( key ) ){ - return earthProperty; - } - } - return null; - } - - private Properties getProjectProperties(File definitionFile) throws IOException { - try( FileReader fr = new FileReader( definitionFile ) ){ - Properties properties = new Properties(); - properties.load(fr); - return properties; - }catch(IOException e ) { - logger.error("Impossible to open properties file ", e); - throw e; - } - } - - private void addToProjectList(File projectFolder) { - String loadedProjects = localPropertiesService.getValue( EarthProperty.LOADED_PROJECTS ); - - if( loadedProjects.length() > 0 ){ - - if( !ArrayUtils.contains(loadedProjects.split(File.pathSeparator), projectFolder.getAbsoluteFile() ) ){ - loadedProjects += File.pathSeparatorChar + projectFolder.getAbsolutePath(); - - } - }else{ - loadedProjects = projectFolder.getAbsolutePath(); - } - localPropertiesService.setValue( EarthProperty.LOADED_PROJECTS, loadedProjects ); - } - - - private boolean validateProjectDefinitionFile(File projectDefinitionFile) throws IOException{ - boolean success = false; - if( projectDefinitionFile.exists() ){ - if( checkValidContent(projectDefinitionFile) ){ - success = true; - }else{ - throw new IllegalArgumentException("The project definition file does not contain the necessary property " + EarthProperty.SURVEY_NAME.toString()+ ". File located at : " + projectDefinitionFile.getAbsolutePath() ); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - return success; - } - - - public boolean folderContainsProjectDefinition(File folder ) throws IOException{ - File projectPropertiesFile = getProjectPropertiesFile( folder ); - return validateProjectDefinitionFile(projectPropertiesFile); - } - - - public boolean loadCompressedProjectFile( File projectZipFile ) throws IOException{ - - File unzippedFolder = unzipContentsOnProjectFolder(projectZipFile); - return( loadProjectInFolder(unzippedFolder) ); - } - - - private File unzipContentsOnProjectFolder(File projectZipFile) throws IOException { - String projectFolderName = "" ; - // There was an error in the first versions of Collect Earth that limited the folder names to 20 characters - // Newer version support up to 255 but we need to take in consideration backwards compatibility! - if ( oldFormatFolderExists( projectZipFile ) ){ - // If there was already a project with the older format of the name then use that! - projectFolderName = getProjectFolderName( projectZipFile , OLD_MAX_FOLDER_LENGTH ); - }else{ - projectFolderName = getProjectFolderName( projectZipFile , NEW_MAX_FOLDER_LENGTH ); - } - - return unzipContents(projectZipFile, projectFolderName); - } - - - private boolean oldFormatFolderExists(File projectZipFile) throws IOException { - String oldProjectFolderName = getProjectFolderName( projectZipFile , OLD_MAX_FOLDER_LENGTH ); - File oldProjectFolder = new File( getProjectsFolder() + File.separator + oldProjectFolderName ); - return oldProjectFolder.exists(); - } - - private String getProjectFolderName(File projectZipFile, int maxLenghtFolderName) throws IOException { - try( ZipFile zipFile = new ZipFile(projectZipFile) ){ - File definitionFolder = new File(EarthConstants.GENERATED_FOLDER); - zipFile.extractFile( PROJECT_PROPERTIES_FILE_NAME, definitionFolder.getAbsolutePath() ); - String projectName = getProjectSurveyName(new File( definitionFolder + File.separator + PROJECT_PROPERTIES_FILE_NAME) ); - if( projectName != null ) { - projectName = StringUtils.remove(projectName, " "); //$NON-NLS-1$ - - if( projectName.length() > maxLenghtFolderName ){ - projectName = projectName.substring(0, maxLenghtFolderName); + File idmSurveyModel = new File(getIdmFilePath()); + if (idmSurveyModel.exists()) { + survey = surveyManager.unmarshalSurvey(new FileInputStream(idmSurveyModel), true, true); + if (surveyManager.getByUri(survey.getUri()) == null) { // NOT + // IN + // THE DB + String surveyName = EARTH_SURVEY_NAME + + localPropertiesService.getValue(EarthProperty.SURVEY_NAME); + survey = surveyManager.importModel(idmSurveyModel, surveyName, false, true); + + } else { // UPDATE ALREADY EXISTANT MODEL + survey = surveyManager.updateModel(idmSurveyModel, false, true); + } + + checkVersions(survey); + + setCollectSurvey(survey); + } else { + logger.error( + "The survey definition file could not be found in " + idmSurveyModel.getAbsolutePath()); //$NON-NLS-1$ } + } catch (final SurveyValidationException e) { + logger.error("Unable to validate survey at " + getIdmFilePath(), e); //$NON-NLS-1$ } - return projectName; - }catch(Exception e ) { - logger.error("Error opening project folder", projectZipFile.getAbsolutePath() ); - return null; } } - - public String getProjectsFolder(){ - return FolderFinder.getCollectEarthDataFolder() + File.separator + PROJECTS; - } - - private File unzipContents(File projectZipFile, String projectName) throws ZipException { - File projectFolder = new File( getProjectsFolder() + File.separator + projectName ); - if( projectFolder.exists() || projectFolder.mkdirs() ){ - try( ZipFile zipFile = new ZipFile(projectZipFile) ){ - zipFile.extractAll( projectFolder.getAbsolutePath() ); - }catch(Exception e) { - logger.error("Error unzipping contents " + projectZipFile.getAbsolutePath(), e); - } - } - return projectFolder; - } - } From 29899597f2d84b787e67864923b7814ad63c212c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:53 +0100 Subject: [PATCH 0190/1620] New translations EarthSurveyService.java (Spanish) --- .../earth/app/view/Messages_es.properties | 364 ++---------------- 1 file changed, 35 insertions(+), 329 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 4f3bc4f7d2..cb792b907b 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,346 +1,52 @@ package org.openforis.collect.earth.app.service; +import static org.openforis.collect.earth.app.EarthConstants.EARTH_SURVEY_NAME; + import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; +import java.io.FileInputStream; -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.filefilter.IOFileFilter; -import org.apache.commons.lang3.ArrayUtils; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; +import org.openforis.collect.manager.exception.SurveyValidationException; +import org.openforis.collect.model.CollectSurvey; +import org.springframework.beans.factory.InitializingBean; import org.springframework.stereotype.Component; -import net.lingala.zip4j.ZipFile; -import net.lingala.zip4j.exception.ZipException; - - - @Component -public class EarthProjectsService { - - - private static final int OLD_MAX_FOLDER_LENGTH = 20; - - private static final int NEW_MAX_FOLDER_LENGTH = 255; - - private static final String PROJECT_PROPERTIES_FILE_NAME = "project_definition.properties"; //$NON-NLS-1$ - - private static final String PROJECTS = "projects"; //$NON-NLS-1$ - - @Autowired - LocalPropertiesService localPropertiesService; - - private Logger logger = LoggerFactory.getLogger( EarthProjectsService.class ); - - public void init(LocalPropertiesService localPropertiesService) { - this.localPropertiesService = localPropertiesService; - } - - public Map getProjectList(){ - ArrayList projectFolders = getProjects(); - - HashMap projectListByName = new HashMap<>(); - for (File projectFolder : projectFolders) { - - try { +public class EarthSurveyService extends AbstractEarthSurveyService implements InitializingBean{ - File projectPropertiesFile = getProjectPropertiesFile( projectFolder ); - String projectName = getProjectSurveyName(projectPropertiesFile); - if( projectName != null ) { - projectListByName.put( projectName , projectFolder); - } - } catch (IOException e) { - logger.error("The project definition file cannot be read.", e); //$NON-NLS-1$ - } - - } - - return projectListByName; - } - - - private String getProjectSurveyName(File projectPropertiesFile) throws IOException { - Properties properties = getProjectProperties(projectPropertiesFile); - if( properties != null) - return properties.getProperty( EarthProperty.SURVEY_NAME.toString() ); - else - return null; - } + @Override + public void afterPropertiesSet() throws Exception { + // Initialize the Collect survey using the idm + // This is only done if the survey has not yet been created in the DB - - private ArrayList getProjects() { - String loadedProjects = localPropertiesService.getValue( EarthProperty.LOADED_PROJECTS ); - - String[] projectFolderPaths = loadedProjects.split( File.pathSeparator ); - - ArrayList workingProjectFolders = new ArrayList<>(); - - for (String projectFolder : projectFolderPaths) { + if (getCollectSurvey() == null) { + CollectSurvey survey; try { - - File projectFolderFile = new File(projectFolder); - File projectDefinitionFile = getProjectPropertiesFile( projectFolderFile); - if( validateProjectDefinitionFile( projectDefinitionFile ) ){ - workingProjectFolders.add( projectFolderFile ); - } - - } catch (IllegalArgumentException e) { - logger.error("The project definition file is not complete.", e); //$NON-NLS-1$ - } catch (IOException e) { - logger.error("The project definition file cannot be read.", e); //$NON-NLS-1$ - } - - } - - - return workingProjectFolders; - } - - - private boolean checkValidContent(File definitionFile) throws IOException { - Properties projectProperties = getProjectProperties( definitionFile ); - return projectProperties.containsKey( EarthProperty.SURVEY_NAME.toString() ); - - } - - - /** - * Loads the contents of the project-specific properties into earth.properties - * - * @param projectFolder The folder where the project definition and the rest of the files reside. - * @return True is the project was loaded correctly - * @throws IOException If the project folder or one of its files cannot be found - */ - public boolean loadProjectInFolder(File projectFolder) throws IOException{ - - File projectPropertiesFile = getProjectPropertiesFile( projectFolder ); - - boolean success = false; - - // Change the loaded project only if the project definition file has changed or the user changes project - if( - !getProjectDefinitionMD5().equals( CollectEarthUtils.getMd5FromFolder( projectFolder ) ) - && - validateProjectDefinitionFile(projectPropertiesFile) - ){ - - // Remove the version of the survey used so that it is asked again to the user! - localPropertiesService.removeModelVersionName(); - - Properties projectProperties = getProjectProperties( projectPropertiesFile ); - - applyPropertiesToCollectEarth( projectProperties, projectFolder ); - - addToProjectList(projectFolder); - - setProjectDefinitionMD5(projectFolder); - - moveSaikuQueriesToRepository(projectFolder, (String) projectProperties.get("survey_name") ); - - success = true; - } - - - return success; - } - - - private void moveSaikuQueriesToRepository(File projectFolder, String surveyName) { - - try { - Collection saikuFiles = getSaikuFiles( projectFolder ); - - String repoDirectory = "tomcat/webapps/saiku/WEB-INF/classes/saiku-repository"; - File saikuRepo = new File( localPropertiesService.getSaikuFolder() + File.separator + repoDirectory + File.separator + surveyName ); - - for (File saikuFile : saikuFiles) { - FileUtils.copyFileToDirectory(saikuFile, saikuRepo, true); - } - } catch (IOException e) { - logger.error("Error moving the Saiku files", e); - } - - - - } - - private Collection getSaikuFiles(File projectFolder) { - return FileUtils.listFiles(projectFolder, new IOFileFilter() { - - @Override - public boolean accept(File dir, String name) { - return name.endsWith("saiku"); - } - - @Override - public boolean accept(File file) { - - return file.getName().endsWith("saiku"); - } - }, null); - } - - private void setProjectDefinitionMD5(File projectFolder) throws IOException { - localPropertiesService.setValue( EarthProperty.ACTIVE_PROJECT_DEFINITION, CollectEarthUtils.getMd5FromFolder( projectFolder ) ); - } - - private String getProjectDefinitionMD5() { - return localPropertiesService.getValue( EarthProperty.ACTIVE_PROJECT_DEFINITION); - } - - - public File getProjectPropertiesFile(File projectFolder) { - return new File( projectFolder.getAbsolutePath() + File.separator + PROJECT_PROPERTIES_FILE_NAME ); - } - - public File getSurveyStructureFile(File projectFolder) { - return new File( projectFolder.getAbsolutePath() + File.separator + PROJECT_PROPERTIES_FILE_NAME ); - } - - private void applyPropertiesToCollectEarth(Properties projectProperties, File projectFolder) { - - for (Object key : projectProperties.keySet()) { - String value = projectProperties.getProperty((String) key); - value = value.replace("${project_path}", projectFolder.getAbsolutePath()); //$NON-NLS-1$ - EarthProperty earthPropertyEnum = getEarthPropertyEnum(key); - if( earthPropertyEnum != null ){ - localPropertiesService.setValue( earthPropertyEnum , value); - }else{ - logger.warn("The property in the is unknown : {}", key) ; //$NON-NLS-1$ - } - } - - } - - private EarthProperty getEarthPropertyEnum(Object key) { - EarthProperty[] values = EarthProperty.values(); - for (EarthProperty earthProperty : values) { - if( earthProperty.toString().equals( key ) ){ - return earthProperty; - } - } - return null; - } - - private Properties getProjectProperties(File definitionFile) throws IOException { - try( FileReader fr = new FileReader( definitionFile ) ){ - Properties properties = new Properties(); - properties.load(fr); - return properties; - }catch(IOException e ) { - logger.error("Impossible to open properties file ", e); - throw e; - } - } - - private void addToProjectList(File projectFolder) { - String loadedProjects = localPropertiesService.getValue( EarthProperty.LOADED_PROJECTS ); - - if( loadedProjects.length() > 0 ){ - - if( !ArrayUtils.contains(loadedProjects.split(File.pathSeparator), projectFolder.getAbsoluteFile() ) ){ - loadedProjects += File.pathSeparatorChar + projectFolder.getAbsolutePath(); - - } - }else{ - loadedProjects = projectFolder.getAbsolutePath(); - } - localPropertiesService.setValue( EarthProperty.LOADED_PROJECTS, loadedProjects ); - } - - - private boolean validateProjectDefinitionFile(File projectDefinitionFile) throws IOException{ - boolean success = false; - if( projectDefinitionFile.exists() ){ - if( checkValidContent(projectDefinitionFile) ){ - success = true; - }else{ - throw new IllegalArgumentException("The project definition file does not contain the necessary property " + EarthProperty.SURVEY_NAME.toString()+ ". File located at : " + projectDefinitionFile.getAbsolutePath() ); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - return success; - } - - - public boolean folderContainsProjectDefinition(File folder ) throws IOException{ - File projectPropertiesFile = getProjectPropertiesFile( folder ); - return validateProjectDefinitionFile(projectPropertiesFile); - } - - - public boolean loadCompressedProjectFile( File projectZipFile ) throws IOException{ - - File unzippedFolder = unzipContentsOnProjectFolder(projectZipFile); - return( loadProjectInFolder(unzippedFolder) ); - } - - - private File unzipContentsOnProjectFolder(File projectZipFile) throws IOException { - String projectFolderName = "" ; - // There was an error in the first versions of Collect Earth that limited the folder names to 20 characters - // Newer version support up to 255 but we need to take in consideration backwards compatibility! - if ( oldFormatFolderExists( projectZipFile ) ){ - // If there was already a project with the older format of the name then use that! - projectFolderName = getProjectFolderName( projectZipFile , OLD_MAX_FOLDER_LENGTH ); - }else{ - projectFolderName = getProjectFolderName( projectZipFile , NEW_MAX_FOLDER_LENGTH ); - } - - return unzipContents(projectZipFile, projectFolderName); - } - - - private boolean oldFormatFolderExists(File projectZipFile) throws IOException { - String oldProjectFolderName = getProjectFolderName( projectZipFile , OLD_MAX_FOLDER_LENGTH ); - File oldProjectFolder = new File( getProjectsFolder() + File.separator + oldProjectFolderName ); - return oldProjectFolder.exists(); - } - - private String getProjectFolderName(File projectZipFile, int maxLenghtFolderName) throws IOException { - try( ZipFile zipFile = new ZipFile(projectZipFile) ){ - File definitionFolder = new File(EarthConstants.GENERATED_FOLDER); - zipFile.extractFile( PROJECT_PROPERTIES_FILE_NAME, definitionFolder.getAbsolutePath() ); - String projectName = getProjectSurveyName(new File( definitionFolder + File.separator + PROJECT_PROPERTIES_FILE_NAME) ); - if( projectName != null ) { - projectName = StringUtils.remove(projectName, " "); //$NON-NLS-1$ - - if( projectName.length() > maxLenghtFolderName ){ - projectName = projectName.substring(0, maxLenghtFolderName); + File idmSurveyModel = new File(getIdmFilePath()); + if (idmSurveyModel.exists()) { + survey = surveyManager.unmarshalSurvey(new FileInputStream(idmSurveyModel), true, true); + if (surveyManager.getByUri(survey.getUri()) == null) { // NOT + // IN + // THE DB + String surveyName = EARTH_SURVEY_NAME + + localPropertiesService.getValue(EarthProperty.SURVEY_NAME); + survey = surveyManager.importModel(idmSurveyModel, surveyName, false, true); + + } else { // UPDATE ALREADY EXISTANT MODEL + survey = surveyManager.updateModel(idmSurveyModel, false, true); + } + + checkVersions(survey); + + setCollectSurvey(survey); + } else { + logger.error( + "The survey definition file could not be found in " + idmSurveyModel.getAbsolutePath()); //$NON-NLS-1$ } + } catch (final SurveyValidationException e) { + logger.error("Unable to validate survey at " + getIdmFilePath(), e); //$NON-NLS-1$ } - return projectName; - }catch(Exception e ) { - logger.error("Error opening project folder", projectZipFile.getAbsolutePath() ); - return null; } } - - public String getProjectsFolder(){ - return FolderFinder.getCollectEarthDataFolder() + File.separator + PROJECTS; - } - - private File unzipContents(File projectZipFile, String projectName) throws ZipException { - File projectFolder = new File( getProjectsFolder() + File.separator + projectName ); - if( projectFolder.exists() || projectFolder.mkdirs() ){ - try( ZipFile zipFile = new ZipFile(projectZipFile) ){ - zipFile.extractAll( projectFolder.getAbsolutePath() ); - }catch(Exception e) { - logger.error("Error unzipping contents " + projectZipFile.getAbsolutePath(), e); - } - } - return projectFolder; - } - } From 684ea82a8e6a6085a53cb2bff4bae435f6a21280 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:54 +0100 Subject: [PATCH 0191/1620] New translations EarthSurveyService.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 364 ++---------------- 1 file changed, 35 insertions(+), 329 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 4f3bc4f7d2..cb792b907b 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,346 +1,52 @@ package org.openforis.collect.earth.app.service; +import static org.openforis.collect.earth.app.EarthConstants.EARTH_SURVEY_NAME; + import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; +import java.io.FileInputStream; -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.filefilter.IOFileFilter; -import org.apache.commons.lang3.ArrayUtils; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; +import org.openforis.collect.manager.exception.SurveyValidationException; +import org.openforis.collect.model.CollectSurvey; +import org.springframework.beans.factory.InitializingBean; import org.springframework.stereotype.Component; -import net.lingala.zip4j.ZipFile; -import net.lingala.zip4j.exception.ZipException; - - - @Component -public class EarthProjectsService { - - - private static final int OLD_MAX_FOLDER_LENGTH = 20; - - private static final int NEW_MAX_FOLDER_LENGTH = 255; - - private static final String PROJECT_PROPERTIES_FILE_NAME = "project_definition.properties"; //$NON-NLS-1$ - - private static final String PROJECTS = "projects"; //$NON-NLS-1$ - - @Autowired - LocalPropertiesService localPropertiesService; - - private Logger logger = LoggerFactory.getLogger( EarthProjectsService.class ); - - public void init(LocalPropertiesService localPropertiesService) { - this.localPropertiesService = localPropertiesService; - } - - public Map getProjectList(){ - ArrayList projectFolders = getProjects(); - - HashMap projectListByName = new HashMap<>(); - for (File projectFolder : projectFolders) { - - try { +public class EarthSurveyService extends AbstractEarthSurveyService implements InitializingBean{ - File projectPropertiesFile = getProjectPropertiesFile( projectFolder ); - String projectName = getProjectSurveyName(projectPropertiesFile); - if( projectName != null ) { - projectListByName.put( projectName , projectFolder); - } - } catch (IOException e) { - logger.error("The project definition file cannot be read.", e); //$NON-NLS-1$ - } - - } - - return projectListByName; - } - - - private String getProjectSurveyName(File projectPropertiesFile) throws IOException { - Properties properties = getProjectProperties(projectPropertiesFile); - if( properties != null) - return properties.getProperty( EarthProperty.SURVEY_NAME.toString() ); - else - return null; - } + @Override + public void afterPropertiesSet() throws Exception { + // Initialize the Collect survey using the idm + // This is only done if the survey has not yet been created in the DB - - private ArrayList getProjects() { - String loadedProjects = localPropertiesService.getValue( EarthProperty.LOADED_PROJECTS ); - - String[] projectFolderPaths = loadedProjects.split( File.pathSeparator ); - - ArrayList workingProjectFolders = new ArrayList<>(); - - for (String projectFolder : projectFolderPaths) { + if (getCollectSurvey() == null) { + CollectSurvey survey; try { - - File projectFolderFile = new File(projectFolder); - File projectDefinitionFile = getProjectPropertiesFile( projectFolderFile); - if( validateProjectDefinitionFile( projectDefinitionFile ) ){ - workingProjectFolders.add( projectFolderFile ); - } - - } catch (IllegalArgumentException e) { - logger.error("The project definition file is not complete.", e); //$NON-NLS-1$ - } catch (IOException e) { - logger.error("The project definition file cannot be read.", e); //$NON-NLS-1$ - } - - } - - - return workingProjectFolders; - } - - - private boolean checkValidContent(File definitionFile) throws IOException { - Properties projectProperties = getProjectProperties( definitionFile ); - return projectProperties.containsKey( EarthProperty.SURVEY_NAME.toString() ); - - } - - - /** - * Loads the contents of the project-specific properties into earth.properties - * - * @param projectFolder The folder where the project definition and the rest of the files reside. - * @return True is the project was loaded correctly - * @throws IOException If the project folder or one of its files cannot be found - */ - public boolean loadProjectInFolder(File projectFolder) throws IOException{ - - File projectPropertiesFile = getProjectPropertiesFile( projectFolder ); - - boolean success = false; - - // Change the loaded project only if the project definition file has changed or the user changes project - if( - !getProjectDefinitionMD5().equals( CollectEarthUtils.getMd5FromFolder( projectFolder ) ) - && - validateProjectDefinitionFile(projectPropertiesFile) - ){ - - // Remove the version of the survey used so that it is asked again to the user! - localPropertiesService.removeModelVersionName(); - - Properties projectProperties = getProjectProperties( projectPropertiesFile ); - - applyPropertiesToCollectEarth( projectProperties, projectFolder ); - - addToProjectList(projectFolder); - - setProjectDefinitionMD5(projectFolder); - - moveSaikuQueriesToRepository(projectFolder, (String) projectProperties.get("survey_name") ); - - success = true; - } - - - return success; - } - - - private void moveSaikuQueriesToRepository(File projectFolder, String surveyName) { - - try { - Collection saikuFiles = getSaikuFiles( projectFolder ); - - String repoDirectory = "tomcat/webapps/saiku/WEB-INF/classes/saiku-repository"; - File saikuRepo = new File( localPropertiesService.getSaikuFolder() + File.separator + repoDirectory + File.separator + surveyName ); - - for (File saikuFile : saikuFiles) { - FileUtils.copyFileToDirectory(saikuFile, saikuRepo, true); - } - } catch (IOException e) { - logger.error("Error moving the Saiku files", e); - } - - - - } - - private Collection getSaikuFiles(File projectFolder) { - return FileUtils.listFiles(projectFolder, new IOFileFilter() { - - @Override - public boolean accept(File dir, String name) { - return name.endsWith("saiku"); - } - - @Override - public boolean accept(File file) { - - return file.getName().endsWith("saiku"); - } - }, null); - } - - private void setProjectDefinitionMD5(File projectFolder) throws IOException { - localPropertiesService.setValue( EarthProperty.ACTIVE_PROJECT_DEFINITION, CollectEarthUtils.getMd5FromFolder( projectFolder ) ); - } - - private String getProjectDefinitionMD5() { - return localPropertiesService.getValue( EarthProperty.ACTIVE_PROJECT_DEFINITION); - } - - - public File getProjectPropertiesFile(File projectFolder) { - return new File( projectFolder.getAbsolutePath() + File.separator + PROJECT_PROPERTIES_FILE_NAME ); - } - - public File getSurveyStructureFile(File projectFolder) { - return new File( projectFolder.getAbsolutePath() + File.separator + PROJECT_PROPERTIES_FILE_NAME ); - } - - private void applyPropertiesToCollectEarth(Properties projectProperties, File projectFolder) { - - for (Object key : projectProperties.keySet()) { - String value = projectProperties.getProperty((String) key); - value = value.replace("${project_path}", projectFolder.getAbsolutePath()); //$NON-NLS-1$ - EarthProperty earthPropertyEnum = getEarthPropertyEnum(key); - if( earthPropertyEnum != null ){ - localPropertiesService.setValue( earthPropertyEnum , value); - }else{ - logger.warn("The property in the is unknown : {}", key) ; //$NON-NLS-1$ - } - } - - } - - private EarthProperty getEarthPropertyEnum(Object key) { - EarthProperty[] values = EarthProperty.values(); - for (EarthProperty earthProperty : values) { - if( earthProperty.toString().equals( key ) ){ - return earthProperty; - } - } - return null; - } - - private Properties getProjectProperties(File definitionFile) throws IOException { - try( FileReader fr = new FileReader( definitionFile ) ){ - Properties properties = new Properties(); - properties.load(fr); - return properties; - }catch(IOException e ) { - logger.error("Impossible to open properties file ", e); - throw e; - } - } - - private void addToProjectList(File projectFolder) { - String loadedProjects = localPropertiesService.getValue( EarthProperty.LOADED_PROJECTS ); - - if( loadedProjects.length() > 0 ){ - - if( !ArrayUtils.contains(loadedProjects.split(File.pathSeparator), projectFolder.getAbsoluteFile() ) ){ - loadedProjects += File.pathSeparatorChar + projectFolder.getAbsolutePath(); - - } - }else{ - loadedProjects = projectFolder.getAbsolutePath(); - } - localPropertiesService.setValue( EarthProperty.LOADED_PROJECTS, loadedProjects ); - } - - - private boolean validateProjectDefinitionFile(File projectDefinitionFile) throws IOException{ - boolean success = false; - if( projectDefinitionFile.exists() ){ - if( checkValidContent(projectDefinitionFile) ){ - success = true; - }else{ - throw new IllegalArgumentException("The project definition file does not contain the necessary property " + EarthProperty.SURVEY_NAME.toString()+ ". File located at : " + projectDefinitionFile.getAbsolutePath() ); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - return success; - } - - - public boolean folderContainsProjectDefinition(File folder ) throws IOException{ - File projectPropertiesFile = getProjectPropertiesFile( folder ); - return validateProjectDefinitionFile(projectPropertiesFile); - } - - - public boolean loadCompressedProjectFile( File projectZipFile ) throws IOException{ - - File unzippedFolder = unzipContentsOnProjectFolder(projectZipFile); - return( loadProjectInFolder(unzippedFolder) ); - } - - - private File unzipContentsOnProjectFolder(File projectZipFile) throws IOException { - String projectFolderName = "" ; - // There was an error in the first versions of Collect Earth that limited the folder names to 20 characters - // Newer version support up to 255 but we need to take in consideration backwards compatibility! - if ( oldFormatFolderExists( projectZipFile ) ){ - // If there was already a project with the older format of the name then use that! - projectFolderName = getProjectFolderName( projectZipFile , OLD_MAX_FOLDER_LENGTH ); - }else{ - projectFolderName = getProjectFolderName( projectZipFile , NEW_MAX_FOLDER_LENGTH ); - } - - return unzipContents(projectZipFile, projectFolderName); - } - - - private boolean oldFormatFolderExists(File projectZipFile) throws IOException { - String oldProjectFolderName = getProjectFolderName( projectZipFile , OLD_MAX_FOLDER_LENGTH ); - File oldProjectFolder = new File( getProjectsFolder() + File.separator + oldProjectFolderName ); - return oldProjectFolder.exists(); - } - - private String getProjectFolderName(File projectZipFile, int maxLenghtFolderName) throws IOException { - try( ZipFile zipFile = new ZipFile(projectZipFile) ){ - File definitionFolder = new File(EarthConstants.GENERATED_FOLDER); - zipFile.extractFile( PROJECT_PROPERTIES_FILE_NAME, definitionFolder.getAbsolutePath() ); - String projectName = getProjectSurveyName(new File( definitionFolder + File.separator + PROJECT_PROPERTIES_FILE_NAME) ); - if( projectName != null ) { - projectName = StringUtils.remove(projectName, " "); //$NON-NLS-1$ - - if( projectName.length() > maxLenghtFolderName ){ - projectName = projectName.substring(0, maxLenghtFolderName); + File idmSurveyModel = new File(getIdmFilePath()); + if (idmSurveyModel.exists()) { + survey = surveyManager.unmarshalSurvey(new FileInputStream(idmSurveyModel), true, true); + if (surveyManager.getByUri(survey.getUri()) == null) { // NOT + // IN + // THE DB + String surveyName = EARTH_SURVEY_NAME + + localPropertiesService.getValue(EarthProperty.SURVEY_NAME); + survey = surveyManager.importModel(idmSurveyModel, surveyName, false, true); + + } else { // UPDATE ALREADY EXISTANT MODEL + survey = surveyManager.updateModel(idmSurveyModel, false, true); + } + + checkVersions(survey); + + setCollectSurvey(survey); + } else { + logger.error( + "The survey definition file could not be found in " + idmSurveyModel.getAbsolutePath()); //$NON-NLS-1$ } + } catch (final SurveyValidationException e) { + logger.error("Unable to validate survey at " + getIdmFilePath(), e); //$NON-NLS-1$ } - return projectName; - }catch(Exception e ) { - logger.error("Error opening project folder", projectZipFile.getAbsolutePath() ); - return null; } } - - public String getProjectsFolder(){ - return FolderFinder.getCollectEarthDataFolder() + File.separator + PROJECTS; - } - - private File unzipContents(File projectZipFile, String projectName) throws ZipException { - File projectFolder = new File( getProjectsFolder() + File.separator + projectName ); - if( projectFolder.exists() || projectFolder.mkdirs() ){ - try( ZipFile zipFile = new ZipFile(projectZipFile) ){ - zipFile.extractAll( projectFolder.getAbsolutePath() ); - }catch(Exception e) { - logger.error("Error unzipping contents " + projectZipFile.getAbsolutePath(), e); - } - } - return projectFolder; - } - } From fd87abb359ab6582a996dc8661a314173f635353 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:55 +0100 Subject: [PATCH 0192/1620] New translations EarthSurveyService.java (English) --- .../earth/app/view/Messages_en.properties | 364 ++---------------- 1 file changed, 35 insertions(+), 329 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 4f3bc4f7d2..cb792b907b 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,346 +1,52 @@ package org.openforis.collect.earth.app.service; +import static org.openforis.collect.earth.app.EarthConstants.EARTH_SURVEY_NAME; + import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; +import java.io.FileInputStream; -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.filefilter.IOFileFilter; -import org.apache.commons.lang3.ArrayUtils; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; +import org.openforis.collect.manager.exception.SurveyValidationException; +import org.openforis.collect.model.CollectSurvey; +import org.springframework.beans.factory.InitializingBean; import org.springframework.stereotype.Component; -import net.lingala.zip4j.ZipFile; -import net.lingala.zip4j.exception.ZipException; - - - @Component -public class EarthProjectsService { - - - private static final int OLD_MAX_FOLDER_LENGTH = 20; - - private static final int NEW_MAX_FOLDER_LENGTH = 255; - - private static final String PROJECT_PROPERTIES_FILE_NAME = "project_definition.properties"; //$NON-NLS-1$ - - private static final String PROJECTS = "projects"; //$NON-NLS-1$ - - @Autowired - LocalPropertiesService localPropertiesService; - - private Logger logger = LoggerFactory.getLogger( EarthProjectsService.class ); - - public void init(LocalPropertiesService localPropertiesService) { - this.localPropertiesService = localPropertiesService; - } - - public Map getProjectList(){ - ArrayList projectFolders = getProjects(); - - HashMap projectListByName = new HashMap<>(); - for (File projectFolder : projectFolders) { - - try { +public class EarthSurveyService extends AbstractEarthSurveyService implements InitializingBean{ - File projectPropertiesFile = getProjectPropertiesFile( projectFolder ); - String projectName = getProjectSurveyName(projectPropertiesFile); - if( projectName != null ) { - projectListByName.put( projectName , projectFolder); - } - } catch (IOException e) { - logger.error("The project definition file cannot be read.", e); //$NON-NLS-1$ - } - - } - - return projectListByName; - } - - - private String getProjectSurveyName(File projectPropertiesFile) throws IOException { - Properties properties = getProjectProperties(projectPropertiesFile); - if( properties != null) - return properties.getProperty( EarthProperty.SURVEY_NAME.toString() ); - else - return null; - } + @Override + public void afterPropertiesSet() throws Exception { + // Initialize the Collect survey using the idm + // This is only done if the survey has not yet been created in the DB - - private ArrayList getProjects() { - String loadedProjects = localPropertiesService.getValue( EarthProperty.LOADED_PROJECTS ); - - String[] projectFolderPaths = loadedProjects.split( File.pathSeparator ); - - ArrayList workingProjectFolders = new ArrayList<>(); - - for (String projectFolder : projectFolderPaths) { + if (getCollectSurvey() == null) { + CollectSurvey survey; try { - - File projectFolderFile = new File(projectFolder); - File projectDefinitionFile = getProjectPropertiesFile( projectFolderFile); - if( validateProjectDefinitionFile( projectDefinitionFile ) ){ - workingProjectFolders.add( projectFolderFile ); - } - - } catch (IllegalArgumentException e) { - logger.error("The project definition file is not complete.", e); //$NON-NLS-1$ - } catch (IOException e) { - logger.error("The project definition file cannot be read.", e); //$NON-NLS-1$ - } - - } - - - return workingProjectFolders; - } - - - private boolean checkValidContent(File definitionFile) throws IOException { - Properties projectProperties = getProjectProperties( definitionFile ); - return projectProperties.containsKey( EarthProperty.SURVEY_NAME.toString() ); - - } - - - /** - * Loads the contents of the project-specific properties into earth.properties - * - * @param projectFolder The folder where the project definition and the rest of the files reside. - * @return True is the project was loaded correctly - * @throws IOException If the project folder or one of its files cannot be found - */ - public boolean loadProjectInFolder(File projectFolder) throws IOException{ - - File projectPropertiesFile = getProjectPropertiesFile( projectFolder ); - - boolean success = false; - - // Change the loaded project only if the project definition file has changed or the user changes project - if( - !getProjectDefinitionMD5().equals( CollectEarthUtils.getMd5FromFolder( projectFolder ) ) - && - validateProjectDefinitionFile(projectPropertiesFile) - ){ - - // Remove the version of the survey used so that it is asked again to the user! - localPropertiesService.removeModelVersionName(); - - Properties projectProperties = getProjectProperties( projectPropertiesFile ); - - applyPropertiesToCollectEarth( projectProperties, projectFolder ); - - addToProjectList(projectFolder); - - setProjectDefinitionMD5(projectFolder); - - moveSaikuQueriesToRepository(projectFolder, (String) projectProperties.get("survey_name") ); - - success = true; - } - - - return success; - } - - - private void moveSaikuQueriesToRepository(File projectFolder, String surveyName) { - - try { - Collection saikuFiles = getSaikuFiles( projectFolder ); - - String repoDirectory = "tomcat/webapps/saiku/WEB-INF/classes/saiku-repository"; - File saikuRepo = new File( localPropertiesService.getSaikuFolder() + File.separator + repoDirectory + File.separator + surveyName ); - - for (File saikuFile : saikuFiles) { - FileUtils.copyFileToDirectory(saikuFile, saikuRepo, true); - } - } catch (IOException e) { - logger.error("Error moving the Saiku files", e); - } - - - - } - - private Collection getSaikuFiles(File projectFolder) { - return FileUtils.listFiles(projectFolder, new IOFileFilter() { - - @Override - public boolean accept(File dir, String name) { - return name.endsWith("saiku"); - } - - @Override - public boolean accept(File file) { - - return file.getName().endsWith("saiku"); - } - }, null); - } - - private void setProjectDefinitionMD5(File projectFolder) throws IOException { - localPropertiesService.setValue( EarthProperty.ACTIVE_PROJECT_DEFINITION, CollectEarthUtils.getMd5FromFolder( projectFolder ) ); - } - - private String getProjectDefinitionMD5() { - return localPropertiesService.getValue( EarthProperty.ACTIVE_PROJECT_DEFINITION); - } - - - public File getProjectPropertiesFile(File projectFolder) { - return new File( projectFolder.getAbsolutePath() + File.separator + PROJECT_PROPERTIES_FILE_NAME ); - } - - public File getSurveyStructureFile(File projectFolder) { - return new File( projectFolder.getAbsolutePath() + File.separator + PROJECT_PROPERTIES_FILE_NAME ); - } - - private void applyPropertiesToCollectEarth(Properties projectProperties, File projectFolder) { - - for (Object key : projectProperties.keySet()) { - String value = projectProperties.getProperty((String) key); - value = value.replace("${project_path}", projectFolder.getAbsolutePath()); //$NON-NLS-1$ - EarthProperty earthPropertyEnum = getEarthPropertyEnum(key); - if( earthPropertyEnum != null ){ - localPropertiesService.setValue( earthPropertyEnum , value); - }else{ - logger.warn("The property in the is unknown : {}", key) ; //$NON-NLS-1$ - } - } - - } - - private EarthProperty getEarthPropertyEnum(Object key) { - EarthProperty[] values = EarthProperty.values(); - for (EarthProperty earthProperty : values) { - if( earthProperty.toString().equals( key ) ){ - return earthProperty; - } - } - return null; - } - - private Properties getProjectProperties(File definitionFile) throws IOException { - try( FileReader fr = new FileReader( definitionFile ) ){ - Properties properties = new Properties(); - properties.load(fr); - return properties; - }catch(IOException e ) { - logger.error("Impossible to open properties file ", e); - throw e; - } - } - - private void addToProjectList(File projectFolder) { - String loadedProjects = localPropertiesService.getValue( EarthProperty.LOADED_PROJECTS ); - - if( loadedProjects.length() > 0 ){ - - if( !ArrayUtils.contains(loadedProjects.split(File.pathSeparator), projectFolder.getAbsoluteFile() ) ){ - loadedProjects += File.pathSeparatorChar + projectFolder.getAbsolutePath(); - - } - }else{ - loadedProjects = projectFolder.getAbsolutePath(); - } - localPropertiesService.setValue( EarthProperty.LOADED_PROJECTS, loadedProjects ); - } - - - private boolean validateProjectDefinitionFile(File projectDefinitionFile) throws IOException{ - boolean success = false; - if( projectDefinitionFile.exists() ){ - if( checkValidContent(projectDefinitionFile) ){ - success = true; - }else{ - throw new IllegalArgumentException("The project definition file does not contain the necessary property " + EarthProperty.SURVEY_NAME.toString()+ ". File located at : " + projectDefinitionFile.getAbsolutePath() ); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - return success; - } - - - public boolean folderContainsProjectDefinition(File folder ) throws IOException{ - File projectPropertiesFile = getProjectPropertiesFile( folder ); - return validateProjectDefinitionFile(projectPropertiesFile); - } - - - public boolean loadCompressedProjectFile( File projectZipFile ) throws IOException{ - - File unzippedFolder = unzipContentsOnProjectFolder(projectZipFile); - return( loadProjectInFolder(unzippedFolder) ); - } - - - private File unzipContentsOnProjectFolder(File projectZipFile) throws IOException { - String projectFolderName = "" ; - // There was an error in the first versions of Collect Earth that limited the folder names to 20 characters - // Newer version support up to 255 but we need to take in consideration backwards compatibility! - if ( oldFormatFolderExists( projectZipFile ) ){ - // If there was already a project with the older format of the name then use that! - projectFolderName = getProjectFolderName( projectZipFile , OLD_MAX_FOLDER_LENGTH ); - }else{ - projectFolderName = getProjectFolderName( projectZipFile , NEW_MAX_FOLDER_LENGTH ); - } - - return unzipContents(projectZipFile, projectFolderName); - } - - - private boolean oldFormatFolderExists(File projectZipFile) throws IOException { - String oldProjectFolderName = getProjectFolderName( projectZipFile , OLD_MAX_FOLDER_LENGTH ); - File oldProjectFolder = new File( getProjectsFolder() + File.separator + oldProjectFolderName ); - return oldProjectFolder.exists(); - } - - private String getProjectFolderName(File projectZipFile, int maxLenghtFolderName) throws IOException { - try( ZipFile zipFile = new ZipFile(projectZipFile) ){ - File definitionFolder = new File(EarthConstants.GENERATED_FOLDER); - zipFile.extractFile( PROJECT_PROPERTIES_FILE_NAME, definitionFolder.getAbsolutePath() ); - String projectName = getProjectSurveyName(new File( definitionFolder + File.separator + PROJECT_PROPERTIES_FILE_NAME) ); - if( projectName != null ) { - projectName = StringUtils.remove(projectName, " "); //$NON-NLS-1$ - - if( projectName.length() > maxLenghtFolderName ){ - projectName = projectName.substring(0, maxLenghtFolderName); + File idmSurveyModel = new File(getIdmFilePath()); + if (idmSurveyModel.exists()) { + survey = surveyManager.unmarshalSurvey(new FileInputStream(idmSurveyModel), true, true); + if (surveyManager.getByUri(survey.getUri()) == null) { // NOT + // IN + // THE DB + String surveyName = EARTH_SURVEY_NAME + + localPropertiesService.getValue(EarthProperty.SURVEY_NAME); + survey = surveyManager.importModel(idmSurveyModel, surveyName, false, true); + + } else { // UPDATE ALREADY EXISTANT MODEL + survey = surveyManager.updateModel(idmSurveyModel, false, true); + } + + checkVersions(survey); + + setCollectSurvey(survey); + } else { + logger.error( + "The survey definition file could not be found in " + idmSurveyModel.getAbsolutePath()); //$NON-NLS-1$ } + } catch (final SurveyValidationException e) { + logger.error("Unable to validate survey at " + getIdmFilePath(), e); //$NON-NLS-1$ } - return projectName; - }catch(Exception e ) { - logger.error("Error opening project folder", projectZipFile.getAbsolutePath() ); - return null; } } - - public String getProjectsFolder(){ - return FolderFinder.getCollectEarthDataFolder() + File.separator + PROJECTS; - } - - private File unzipContents(File projectZipFile, String projectName) throws ZipException { - File projectFolder = new File( getProjectsFolder() + File.separator + projectName ); - if( projectFolder.exists() || projectFolder.mkdirs() ){ - try( ZipFile zipFile = new ZipFile(projectZipFile) ){ - zipFile.extractAll( projectFolder.getAbsolutePath() ); - }catch(Exception e) { - logger.error("Error unzipping contents " + projectZipFile.getAbsolutePath(), e); - } - } - return projectFolder; - } - } From 66716c922c61efcc4fb6b6fd2ce5d9fbffde657e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:56 +0100 Subject: [PATCH 0193/1620] New translations ExportType.java (French) --- .../earth/app/view/Messages_fr.properties | 107 +++++++++--------- 1 file changed, 55 insertions(+), 52 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index cb792b907b..7633aaf9fd 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,52 +1,55 @@ -package org.openforis.collect.earth.app.service; - -import static org.openforis.collect.earth.app.EarthConstants.EARTH_SURVEY_NAME; - -import java.io.File; -import java.io.FileInputStream; - -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.manager.exception.SurveyValidationException; -import org.openforis.collect.model.CollectSurvey; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.stereotype.Component; - -@Component -public class EarthSurveyService extends AbstractEarthSurveyService implements InitializingBean{ - - @Override - public void afterPropertiesSet() throws Exception { - // Initialize the Collect survey using the idm - // This is only done if the survey has not yet been created in the DB - - if (getCollectSurvey() == null) { - CollectSurvey survey; - try { - File idmSurveyModel = new File(getIdmFilePath()); - if (idmSurveyModel.exists()) { - survey = surveyManager.unmarshalSurvey(new FileInputStream(idmSurveyModel), true, true); - if (surveyManager.getByUri(survey.getUri()) == null) { // NOT - // IN - // THE DB - String surveyName = EARTH_SURVEY_NAME - + localPropertiesService.getValue(EarthProperty.SURVEY_NAME); - survey = surveyManager.importModel(idmSurveyModel, surveyName, false, true); - - } else { // UPDATE ALREADY EXISTANT MODEL - survey = surveyManager.updateModel(idmSurveyModel, false, true); - } - - checkVersions(survey); - - setCollectSurvey(survey); - } else { - logger.error( - "The survey definition file could not be found in " + idmSurveyModel.getAbsolutePath()); //$NON-NLS-1$ - } - } catch (final SurveyValidationException e) { - logger.error("Unable to validate survey at " + getIdmFilePath(), e); //$NON-NLS-1$ - } - } - - } -} +package org.openforis.collect.earth.app.service; + +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.desktop.ServerController; + +public enum ExportType { + SAIKU( + ServerController.SAIKU_RDB_SUFFIX, + "Saiku", + "SaikuDataFolder", + EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + ServerController.SAIKU_RDB_SUFFIX, + EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU + ), + IPCC( + ServerController.IPCC_RDB_SUFFIX, + "Ipcc", + "IPCCDataFolder", + EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + ServerController.IPCC_RDB_SUFFIX, + EarthConstants.POSTGRES_RDB_SCHEMA_IPCC + ); + + private String dbSuffix; + private String prefix; + private String dataFolder; + private String dbFileName; + private String rdbSchema; + + ExportType(String dbSuffix, String prefix, String dataFolder, String dbFileName, String rdbSchema ) { + this.dbSuffix = dbSuffix; + this.prefix = prefix; + this.dbFileName = dbFileName; + this.rdbSchema = rdbSchema; + } + + public String getDbSuffix() { + return dbSuffix; + } + + public String getPrefix() { + return prefix; + } + + public String getDataFolder() { + return dataFolder; + } + + public String getDbFileName() { + return dbFileName; + } + + public String getRdbSchema() { + return rdbSchema; + } + +} \ No newline at end of file From 18e8fcd488397a01d34ac575c8e2017409ff8bf0 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:57 +0100 Subject: [PATCH 0194/1620] New translations ExportType.java (Spanish) --- .../earth/app/view/Messages_es.properties | 107 +++++++++--------- 1 file changed, 55 insertions(+), 52 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index cb792b907b..7633aaf9fd 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,52 +1,55 @@ -package org.openforis.collect.earth.app.service; - -import static org.openforis.collect.earth.app.EarthConstants.EARTH_SURVEY_NAME; - -import java.io.File; -import java.io.FileInputStream; - -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.manager.exception.SurveyValidationException; -import org.openforis.collect.model.CollectSurvey; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.stereotype.Component; - -@Component -public class EarthSurveyService extends AbstractEarthSurveyService implements InitializingBean{ - - @Override - public void afterPropertiesSet() throws Exception { - // Initialize the Collect survey using the idm - // This is only done if the survey has not yet been created in the DB - - if (getCollectSurvey() == null) { - CollectSurvey survey; - try { - File idmSurveyModel = new File(getIdmFilePath()); - if (idmSurveyModel.exists()) { - survey = surveyManager.unmarshalSurvey(new FileInputStream(idmSurveyModel), true, true); - if (surveyManager.getByUri(survey.getUri()) == null) { // NOT - // IN - // THE DB - String surveyName = EARTH_SURVEY_NAME - + localPropertiesService.getValue(EarthProperty.SURVEY_NAME); - survey = surveyManager.importModel(idmSurveyModel, surveyName, false, true); - - } else { // UPDATE ALREADY EXISTANT MODEL - survey = surveyManager.updateModel(idmSurveyModel, false, true); - } - - checkVersions(survey); - - setCollectSurvey(survey); - } else { - logger.error( - "The survey definition file could not be found in " + idmSurveyModel.getAbsolutePath()); //$NON-NLS-1$ - } - } catch (final SurveyValidationException e) { - logger.error("Unable to validate survey at " + getIdmFilePath(), e); //$NON-NLS-1$ - } - } - - } -} +package org.openforis.collect.earth.app.service; + +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.desktop.ServerController; + +public enum ExportType { + SAIKU( + ServerController.SAIKU_RDB_SUFFIX, + "Saiku", + "SaikuDataFolder", + EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + ServerController.SAIKU_RDB_SUFFIX, + EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU + ), + IPCC( + ServerController.IPCC_RDB_SUFFIX, + "Ipcc", + "IPCCDataFolder", + EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + ServerController.IPCC_RDB_SUFFIX, + EarthConstants.POSTGRES_RDB_SCHEMA_IPCC + ); + + private String dbSuffix; + private String prefix; + private String dataFolder; + private String dbFileName; + private String rdbSchema; + + ExportType(String dbSuffix, String prefix, String dataFolder, String dbFileName, String rdbSchema ) { + this.dbSuffix = dbSuffix; + this.prefix = prefix; + this.dbFileName = dbFileName; + this.rdbSchema = rdbSchema; + } + + public String getDbSuffix() { + return dbSuffix; + } + + public String getPrefix() { + return prefix; + } + + public String getDataFolder() { + return dataFolder; + } + + public String getDbFileName() { + return dbFileName; + } + + public String getRdbSchema() { + return rdbSchema; + } + +} \ No newline at end of file From 6ebd994590edf4d186691c2d1da1e00955df8e68 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:58 +0100 Subject: [PATCH 0195/1620] New translations ExportType.java (English) --- .../earth/app/view/Messages_en.properties | 107 +++++++++--------- 1 file changed, 55 insertions(+), 52 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index cb792b907b..7633aaf9fd 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,52 +1,55 @@ -package org.openforis.collect.earth.app.service; - -import static org.openforis.collect.earth.app.EarthConstants.EARTH_SURVEY_NAME; - -import java.io.File; -import java.io.FileInputStream; - -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.manager.exception.SurveyValidationException; -import org.openforis.collect.model.CollectSurvey; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.stereotype.Component; - -@Component -public class EarthSurveyService extends AbstractEarthSurveyService implements InitializingBean{ - - @Override - public void afterPropertiesSet() throws Exception { - // Initialize the Collect survey using the idm - // This is only done if the survey has not yet been created in the DB - - if (getCollectSurvey() == null) { - CollectSurvey survey; - try { - File idmSurveyModel = new File(getIdmFilePath()); - if (idmSurveyModel.exists()) { - survey = surveyManager.unmarshalSurvey(new FileInputStream(idmSurveyModel), true, true); - if (surveyManager.getByUri(survey.getUri()) == null) { // NOT - // IN - // THE DB - String surveyName = EARTH_SURVEY_NAME - + localPropertiesService.getValue(EarthProperty.SURVEY_NAME); - survey = surveyManager.importModel(idmSurveyModel, surveyName, false, true); - - } else { // UPDATE ALREADY EXISTANT MODEL - survey = surveyManager.updateModel(idmSurveyModel, false, true); - } - - checkVersions(survey); - - setCollectSurvey(survey); - } else { - logger.error( - "The survey definition file could not be found in " + idmSurveyModel.getAbsolutePath()); //$NON-NLS-1$ - } - } catch (final SurveyValidationException e) { - logger.error("Unable to validate survey at " + getIdmFilePath(), e); //$NON-NLS-1$ - } - } - - } -} +package org.openforis.collect.earth.app.service; + +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.desktop.ServerController; + +public enum ExportType { + SAIKU( + ServerController.SAIKU_RDB_SUFFIX, + "Saiku", + "SaikuDataFolder", + EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + ServerController.SAIKU_RDB_SUFFIX, + EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU + ), + IPCC( + ServerController.IPCC_RDB_SUFFIX, + "Ipcc", + "IPCCDataFolder", + EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + ServerController.IPCC_RDB_SUFFIX, + EarthConstants.POSTGRES_RDB_SCHEMA_IPCC + ); + + private String dbSuffix; + private String prefix; + private String dataFolder; + private String dbFileName; + private String rdbSchema; + + ExportType(String dbSuffix, String prefix, String dataFolder, String dbFileName, String rdbSchema ) { + this.dbSuffix = dbSuffix; + this.prefix = prefix; + this.dbFileName = dbFileName; + this.rdbSchema = rdbSchema; + } + + public String getDbSuffix() { + return dbSuffix; + } + + public String getPrefix() { + return prefix; + } + + public String getDataFolder() { + return dataFolder; + } + + public String getDbFileName() { + return dbFileName; + } + + public String getRdbSchema() { + return rdbSchema; + } + +} \ No newline at end of file From 238a3de78ada008f3a0ba65e6e0d7a2e40058206 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:24:59 +0100 Subject: [PATCH 0196/1620] New translations GeolocalizeMapService.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 211 ++++++++++++++---- 1 file changed, 173 insertions(+), 38 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index cb792b907b..4ed72d856d 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,52 +1,187 @@ package org.openforis.collect.earth.app.service; -import static org.openforis.collect.earth.app.EarthConstants.EARTH_SURVEY_NAME; - import java.io.File; -import java.io.FileInputStream; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.manager.exception.SurveyValidationException; -import org.openforis.collect.model.CollectSurvey; -import org.springframework.beans.factory.InitializingBean; +import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; +import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import freemarker.template.TemplateException; + +/** + * Customizes a Bing Map page to open zoomed into a coordinate. The HTML page is + * created in a temporary file and its URL is returned so that it can be opened + * in a browser. A freemarker template that contains the javascript code to + * customize the Bing Map is used and the parameters for the specific + * coordinates are applied to it. This service uses the same code than the KML + * generator to get the plot sample deign as chosen through the configuration by + * the user. + * + * @author Alfonso Sanchez-Paus Diaz + * + */ @Component -public class EarthSurveyService extends AbstractEarthSurveyService implements InitializingBean{ +public class GeolocalizeMapService { - @Override - public void afterPropertiesSet() throws Exception { - // Initialize the Collect survey using the idm - // This is only done if the survey has not yet been created in the DB + private static final String RESOURCES_FOLDER = "resources"; - if (getCollectSurvey() == null) { - CollectSurvey survey; - try { - File idmSurveyModel = new File(getIdmFilePath()); - if (idmSurveyModel.exists()) { - survey = surveyManager.unmarshalSurvey(new FileInputStream(idmSurveyModel), true, true); - if (surveyManager.getByUri(survey.getUri()) == null) { // NOT - // IN - // THE DB - String surveyName = EARTH_SURVEY_NAME - + localPropertiesService.getValue(EarthProperty.SURVEY_NAME); - survey = surveyManager.importModel(idmSurveyModel, surveyName, false, true); - - } else { // UPDATE ALREADY EXISTANT MODEL - survey = surveyManager.updateModel(idmSurveyModel, false, true); - } - - checkVersions(survey); - - setCollectSurvey(survey); - } else { - logger.error( - "The survey definition file could not be found in " + idmSurveyModel.getAbsolutePath()); //$NON-NLS-1$ - } - } catch (final SurveyValidationException e) { - logger.error("Unable to validate survey at " + getIdmFilePath(), e); //$NON-NLS-1$ + /** + * The file that contains the freemarker template used to produce the Bing Maps + * code. + */ + public static final String FREEMARKER_BING_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectBing.fmt"; + + public static final String FREEMARKER_BAIDU_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectBaidu.fmt"; + + public static final String FREEMARKER_PLANET_MONTHLY_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectPlanetMonthlyHtml.fmt"; + + public static final String FREEMARKER_PLANET_NICFI_ARGUMENTS = RESOURCES_FOLDER + File.separator + "collectPlanetNicfiTxt.fmt"; + + public static final String FREEMARKER_PLANET_DAILY_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectPlanetHtml.fmt"; + + public static final String FREEMARKER_PLANET_URL_TEMPLATE = RESOURCES_FOLDER + File.separator + + "collectPlanetUrl.fmt"; + + /** + * The file that contains the freemarker template used to produce the Yandex + * Maps code. + */ + public static final String FREEMARKER_YANDEX_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + + "collectYandex.fmt"; + + public static final String FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME = "eePlaygroundScript.fmt"; + public static final String FREEMARKER_GEE_CODE_EDITOR_TEMPLATE_FILE_NAME = "eeCodeEditorScript.fmt"; + + /** + * The file that contains the freemarker template used to produce script that is + * run in GEE Code Editor. + */ + public static final String FREEMARKER_GEE_PLAYGROUND_TEMPLATE = RESOURCES_FOLDER + File.separator + + FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME; + public static final String FREEMARKER_GEE_CODE_EDITOR_TEMPLATE = RESOURCES_FOLDER + File.separator + + FREEMARKER_GEE_CODE_EDITOR_TEMPLATE_FILE_NAME; + + public static final String FREEMARKER_HERE_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + + "collectHereMaps.fmt"; + + public static final String FREEMARKER_STREET_VIEW_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + + "collectStreetView.fmt"; + @Autowired + LocalPropertiesService localPropertiesService; + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + KmlGeneratorService kmlGeneratorService; + + public void addDatesForImages(final Map data) { + SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-MM-dd"); + Date todayDate = new Date(); + String dateAsExpected = dt1.format(todayDate); + data.put("todayDate", dateAsExpected); + + Calendar cal = Calendar.getInstance(); + cal.setTime(todayDate); + cal.add(Calendar.YEAR, -1); + + data.put("oneYearAgoDate", dt1.format(cal.getTime())); + + } + + private File applyData(Map data, String freemarkerTemplateFile) + throws IOException, TemplateException { + + final File templateFileSrc = new File(freemarkerTemplateFile); + + final File tempFileDst = File.createTempFile("selenium", ".html"); + tempFileDst.deleteOnExit(); + + FreemarkerTemplateUtils.applyTemplate(templateFileSrc, tempFileDst, data); + + return tempFileDst; + + } + + public Map getPlacemarkData(SimplePlacemarkObject placemarkObject) { + final Map data = new HashMap<>(); + data.put("placemark", placemarkObject); + return data; + } + + /** + * Produces a temporary file with the necessary HTML code to show the plot in + * Bing Maps + * + * @param placemarkObject + * The object containing information of the placemark. + * @param freemarkerTemplate + * The path to the freemarker template that is used to produce the + * file. + * @return The URL to the temporary file that can be used to load it in a + * browser. + */ + public URL getTemporaryUrl(SimplePlacemarkObject placemarkObject, String freemarkerTemplate) { + final Map data = getPlacemarkData(placemarkObject); + addDatesForImages(data); + return processTemplateWithData(freemarkerTemplate, data); + } + + /** + * Produces a URL using Planet Labs explorer expected format + * + * @param placemarkObject + * The data of the plot. + * @param freemarkerTemplate + * The freemarker template file to use + * @param extraData + * Variable listof key value strings + * @return The URL to the temporary file that can be used to load it in a + * browser. + */ + public URL getUrlToFreemarkerOutput(SimplePlacemarkObject placemarkObject, String freemarkerTemplate, + String... extraData) { + + final Map data = getPlacemarkData(placemarkObject); + + if( extraData !=null) { + for (int i = 0; i < extraData.length; i = i+2) { + data.put(extraData[i], extraData[i+1]); } } + return processTemplateWithData(freemarkerTemplate, data); + + } + + private URL processTemplateWithData(String freemarkerTemplate, final Map data) { + File transformedHtml = null; + try { + transformedHtml = applyData(data, freemarkerTemplate); + } catch (final Exception e) { + logger.error("Exception when applying template " + freemarkerTemplate + "with data : " + data.toString(), + e); + } + if (transformedHtml != null) { + try { + return transformedHtml.toURI().toURL(); + } catch (MalformedURLException e) { + logger.error("Error generating URL for File " + transformedHtml.getAbsolutePath()); + return null; + } + } else { + logger.error("No Bing map HTML generated."); + return null; + } } } From 6b6185b99f472f2e14bd015dc76e84bc7b7eaeb7 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:00 +0100 Subject: [PATCH 0197/1620] New translations FirefoxLocatorFixed.java (French) --- .../earth/app/view/Messages_fr.properties | 119 ++++++++++-------- 1 file changed, 64 insertions(+), 55 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 7633aaf9fd..3f4bd647d1 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,55 +1,64 @@ -package org.openforis.collect.earth.app.service; - -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.desktop.ServerController; - -public enum ExportType { - SAIKU( - ServerController.SAIKU_RDB_SUFFIX, - "Saiku", - "SaikuDataFolder", - EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + ServerController.SAIKU_RDB_SUFFIX, - EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU - ), - IPCC( - ServerController.IPCC_RDB_SUFFIX, - "Ipcc", - "IPCCDataFolder", - EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + ServerController.IPCC_RDB_SUFFIX, - EarthConstants.POSTGRES_RDB_SCHEMA_IPCC - ); - - private String dbSuffix; - private String prefix; - private String dataFolder; - private String dbFileName; - private String rdbSchema; - - ExportType(String dbSuffix, String prefix, String dataFolder, String dbFileName, String rdbSchema ) { - this.dbSuffix = dbSuffix; - this.prefix = prefix; - this.dbFileName = dbFileName; - this.rdbSchema = rdbSchema; - } - - public String getDbSuffix() { - return dbSuffix; - } - - public String getPrefix() { - return prefix; - } - - public String getDataFolder() { - return dataFolder; - } - - public String getDbFileName() { - return dbFileName; - } - - public String getRdbSchema() { - return rdbSchema; - } - -} \ No newline at end of file +package org.openforis.collect.earth.app.service; + +import java.io.File; + +import org.apache.commons.lang3.SystemUtils; + + +public class FirefoxLocatorFixed{ + + private FirefoxLocatorFixed(){ + } + + public static String tryToFindFolder(){ + String path = null; + if (SystemUtils.IS_OS_WINDOWS){ + return findInUsualWindowsLocations(); + }else if (SystemUtils.IS_OS_MAC){ + return findInUsualMacLocations(); + } + + return path; + } + + /** + * Dynamic because the directory version number keep changing. + */ + private static String findInUsualMacLocations() { + + String[] localAppDataLocations = new String[]{ + FolderFinder.getLocalAppDataFolder() + "/Applications/Firefox.app/Contents/MacOS/firefox-bin" , + FolderFinder.getLocalAppDataFolder() + "/Applications/Mozilla Firefox.app/Contents/MacOS/firefox-bin" + }; + + for (String path : localAppDataLocations) { + File f = new File(path); + if( f.exists() ){ + return path; + } + + } + + return null; + } + + + private static String findInUsualWindowsLocations() { + + String[] localAppDataLocations = new String[]{ + FolderFinder.getLocalAppDataFolder() + "\\Firefox-3\\firefox.exe" , + FolderFinder.getLocalAppDataFolder() + "\\Mozilla Firefox\\firefox.exe", + FolderFinder.getLocalAppDataFolder() + "\\Firefox\\firefox.exe" + }; + + for (String path : localAppDataLocations) { + File f = new File(path); + if( f.exists() ){ + return path; + } + + } + return null; + } + +} From 0b13f9c1b8745fb14c998424048722f345114b64 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:01 +0100 Subject: [PATCH 0198/1620] New translations FirefoxLocatorFixed.java (Spanish) --- .../earth/app/view/Messages_es.properties | 119 ++++++++++-------- 1 file changed, 64 insertions(+), 55 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 7633aaf9fd..3f4bd647d1 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,55 +1,64 @@ -package org.openforis.collect.earth.app.service; - -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.desktop.ServerController; - -public enum ExportType { - SAIKU( - ServerController.SAIKU_RDB_SUFFIX, - "Saiku", - "SaikuDataFolder", - EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + ServerController.SAIKU_RDB_SUFFIX, - EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU - ), - IPCC( - ServerController.IPCC_RDB_SUFFIX, - "Ipcc", - "IPCCDataFolder", - EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + ServerController.IPCC_RDB_SUFFIX, - EarthConstants.POSTGRES_RDB_SCHEMA_IPCC - ); - - private String dbSuffix; - private String prefix; - private String dataFolder; - private String dbFileName; - private String rdbSchema; - - ExportType(String dbSuffix, String prefix, String dataFolder, String dbFileName, String rdbSchema ) { - this.dbSuffix = dbSuffix; - this.prefix = prefix; - this.dbFileName = dbFileName; - this.rdbSchema = rdbSchema; - } - - public String getDbSuffix() { - return dbSuffix; - } - - public String getPrefix() { - return prefix; - } - - public String getDataFolder() { - return dataFolder; - } - - public String getDbFileName() { - return dbFileName; - } - - public String getRdbSchema() { - return rdbSchema; - } - -} \ No newline at end of file +package org.openforis.collect.earth.app.service; + +import java.io.File; + +import org.apache.commons.lang3.SystemUtils; + + +public class FirefoxLocatorFixed{ + + private FirefoxLocatorFixed(){ + } + + public static String tryToFindFolder(){ + String path = null; + if (SystemUtils.IS_OS_WINDOWS){ + return findInUsualWindowsLocations(); + }else if (SystemUtils.IS_OS_MAC){ + return findInUsualMacLocations(); + } + + return path; + } + + /** + * Dynamic because the directory version number keep changing. + */ + private static String findInUsualMacLocations() { + + String[] localAppDataLocations = new String[]{ + FolderFinder.getLocalAppDataFolder() + "/Applications/Firefox.app/Contents/MacOS/firefox-bin" , + FolderFinder.getLocalAppDataFolder() + "/Applications/Mozilla Firefox.app/Contents/MacOS/firefox-bin" + }; + + for (String path : localAppDataLocations) { + File f = new File(path); + if( f.exists() ){ + return path; + } + + } + + return null; + } + + + private static String findInUsualWindowsLocations() { + + String[] localAppDataLocations = new String[]{ + FolderFinder.getLocalAppDataFolder() + "\\Firefox-3\\firefox.exe" , + FolderFinder.getLocalAppDataFolder() + "\\Mozilla Firefox\\firefox.exe", + FolderFinder.getLocalAppDataFolder() + "\\Firefox\\firefox.exe" + }; + + for (String path : localAppDataLocations) { + File f = new File(path); + if( f.exists() ){ + return path; + } + + } + return null; + } + +} From b5263a0e23cfe8fb2ee000cfc1177c162997b5f1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:02 +0100 Subject: [PATCH 0199/1620] New translations FirefoxLocatorFixed.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 199 ++++-------------- 1 file changed, 38 insertions(+), 161 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 4ed72d856d..3f4bd647d1 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,187 +1,64 @@ package org.openforis.collect.earth.app.service; import java.io.File; -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; - -import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; -import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import freemarker.template.TemplateException; - -/** - * Customizes a Bing Map page to open zoomed into a coordinate. The HTML page is - * created in a temporary file and its URL is returned so that it can be opened - * in a browser. A freemarker template that contains the javascript code to - * customize the Bing Map is used and the parameters for the specific - * coordinates are applied to it. This service uses the same code than the KML - * generator to get the plot sample deign as chosen through the configuration by - * the user. - * - * @author Alfonso Sanchez-Paus Diaz - * - */ -@Component -public class GeolocalizeMapService { - - private static final String RESOURCES_FOLDER = "resources"; - /** - * The file that contains the freemarker template used to produce the Bing Maps - * code. - */ - public static final String FREEMARKER_BING_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectBing.fmt"; - - public static final String FREEMARKER_BAIDU_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectBaidu.fmt"; - - public static final String FREEMARKER_PLANET_MONTHLY_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectPlanetMonthlyHtml.fmt"; - - public static final String FREEMARKER_PLANET_NICFI_ARGUMENTS = RESOURCES_FOLDER + File.separator + "collectPlanetNicfiTxt.fmt"; - - public static final String FREEMARKER_PLANET_DAILY_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectPlanetHtml.fmt"; - - public static final String FREEMARKER_PLANET_URL_TEMPLATE = RESOURCES_FOLDER + File.separator - + "collectPlanetUrl.fmt"; - - /** - * The file that contains the freemarker template used to produce the Yandex - * Maps code. - */ - public static final String FREEMARKER_YANDEX_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator - + "collectYandex.fmt"; - - public static final String FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME = "eePlaygroundScript.fmt"; - public static final String FREEMARKER_GEE_CODE_EDITOR_TEMPLATE_FILE_NAME = "eeCodeEditorScript.fmt"; - - /** - * The file that contains the freemarker template used to produce script that is - * run in GEE Code Editor. - */ - public static final String FREEMARKER_GEE_PLAYGROUND_TEMPLATE = RESOURCES_FOLDER + File.separator - + FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME; - public static final String FREEMARKER_GEE_CODE_EDITOR_TEMPLATE = RESOURCES_FOLDER + File.separator - + FREEMARKER_GEE_CODE_EDITOR_TEMPLATE_FILE_NAME; - - public static final String FREEMARKER_HERE_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator - + "collectHereMaps.fmt"; - - public static final String FREEMARKER_STREET_VIEW_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator - + "collectStreetView.fmt"; - @Autowired - LocalPropertiesService localPropertiesService; - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - @Autowired - KmlGeneratorService kmlGeneratorService; +import org.apache.commons.lang3.SystemUtils; - public void addDatesForImages(final Map data) { - SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-MM-dd"); - Date todayDate = new Date(); - String dateAsExpected = dt1.format(todayDate); - data.put("todayDate", dateAsExpected); - Calendar cal = Calendar.getInstance(); - cal.setTime(todayDate); - cal.add(Calendar.YEAR, -1); - - data.put("oneYearAgoDate", dt1.format(cal.getTime())); +public class FirefoxLocatorFixed{ + private FirefoxLocatorFixed(){ } - private File applyData(Map data, String freemarkerTemplateFile) - throws IOException, TemplateException { - - final File templateFileSrc = new File(freemarkerTemplateFile); - - final File tempFileDst = File.createTempFile("selenium", ".html"); - tempFileDst.deleteOnExit(); - - FreemarkerTemplateUtils.applyTemplate(templateFileSrc, tempFileDst, data); - - return tempFileDst; - - } - - public Map getPlacemarkData(SimplePlacemarkObject placemarkObject) { - final Map data = new HashMap<>(); - data.put("placemark", placemarkObject); - return data; - } + public static String tryToFindFolder(){ + String path = null; + if (SystemUtils.IS_OS_WINDOWS){ + return findInUsualWindowsLocations(); + }else if (SystemUtils.IS_OS_MAC){ + return findInUsualMacLocations(); + } - /** - * Produces a temporary file with the necessary HTML code to show the plot in - * Bing Maps - * - * @param placemarkObject - * The object containing information of the placemark. - * @param freemarkerTemplate - * The path to the freemarker template that is used to produce the - * file. - * @return The URL to the temporary file that can be used to load it in a - * browser. - */ - public URL getTemporaryUrl(SimplePlacemarkObject placemarkObject, String freemarkerTemplate) { - final Map data = getPlacemarkData(placemarkObject); - addDatesForImages(data); - return processTemplateWithData(freemarkerTemplate, data); + return path; } /** - * Produces a URL using Planet Labs explorer expected format - * - * @param placemarkObject - * The data of the plot. - * @param freemarkerTemplate - * The freemarker template file to use - * @param extraData - * Variable listof key value strings - * @return The URL to the temporary file that can be used to load it in a - * browser. + * Dynamic because the directory version number keep changing. */ - public URL getUrlToFreemarkerOutput(SimplePlacemarkObject placemarkObject, String freemarkerTemplate, - String... extraData) { + private static String findInUsualMacLocations() { - final Map data = getPlacemarkData(placemarkObject); + String[] localAppDataLocations = new String[]{ + FolderFinder.getLocalAppDataFolder() + "/Applications/Firefox.app/Contents/MacOS/firefox-bin" , + FolderFinder.getLocalAppDataFolder() + "/Applications/Mozilla Firefox.app/Contents/MacOS/firefox-bin" + }; - if( extraData !=null) { - for (int i = 0; i < extraData.length; i = i+2) { - data.put(extraData[i], extraData[i+1]); + for (String path : localAppDataLocations) { + File f = new File(path); + if( f.exists() ){ + return path; } + } - return processTemplateWithData(freemarkerTemplate, data); + return null; } - private URL processTemplateWithData(String freemarkerTemplate, final Map data) { - File transformedHtml = null; - try { - transformedHtml = applyData(data, freemarkerTemplate); - } catch (final Exception e) { - logger.error("Exception when applying template " + freemarkerTemplate + "with data : " + data.toString(), - e); - } - if (transformedHtml != null) { - try { - return transformedHtml.toURI().toURL(); - } catch (MalformedURLException e) { - logger.error("Error generating URL for File " + transformedHtml.getAbsolutePath()); - return null; + private static String findInUsualWindowsLocations() { + + String[] localAppDataLocations = new String[]{ + FolderFinder.getLocalAppDataFolder() + "\\Firefox-3\\firefox.exe" , + FolderFinder.getLocalAppDataFolder() + "\\Mozilla Firefox\\firefox.exe", + FolderFinder.getLocalAppDataFolder() + "\\Firefox\\firefox.exe" + }; + + for (String path : localAppDataLocations) { + File f = new File(path); + if( f.exists() ){ + return path; } - } else { - logger.error("No Bing map HTML generated."); - return null; + } + return null; } + } From 54eab03ccc594a55dd39931351fc14f668fc3adc Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:04 +0100 Subject: [PATCH 0200/1620] New translations FirefoxLocatorFixed.java (English) --- .../earth/app/view/Messages_en.properties | 119 ++++++++++-------- 1 file changed, 64 insertions(+), 55 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 7633aaf9fd..3f4bd647d1 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,55 +1,64 @@ -package org.openforis.collect.earth.app.service; - -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.desktop.ServerController; - -public enum ExportType { - SAIKU( - ServerController.SAIKU_RDB_SUFFIX, - "Saiku", - "SaikuDataFolder", - EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + ServerController.SAIKU_RDB_SUFFIX, - EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU - ), - IPCC( - ServerController.IPCC_RDB_SUFFIX, - "Ipcc", - "IPCCDataFolder", - EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + ServerController.IPCC_RDB_SUFFIX, - EarthConstants.POSTGRES_RDB_SCHEMA_IPCC - ); - - private String dbSuffix; - private String prefix; - private String dataFolder; - private String dbFileName; - private String rdbSchema; - - ExportType(String dbSuffix, String prefix, String dataFolder, String dbFileName, String rdbSchema ) { - this.dbSuffix = dbSuffix; - this.prefix = prefix; - this.dbFileName = dbFileName; - this.rdbSchema = rdbSchema; - } - - public String getDbSuffix() { - return dbSuffix; - } - - public String getPrefix() { - return prefix; - } - - public String getDataFolder() { - return dataFolder; - } - - public String getDbFileName() { - return dbFileName; - } - - public String getRdbSchema() { - return rdbSchema; - } - -} \ No newline at end of file +package org.openforis.collect.earth.app.service; + +import java.io.File; + +import org.apache.commons.lang3.SystemUtils; + + +public class FirefoxLocatorFixed{ + + private FirefoxLocatorFixed(){ + } + + public static String tryToFindFolder(){ + String path = null; + if (SystemUtils.IS_OS_WINDOWS){ + return findInUsualWindowsLocations(); + }else if (SystemUtils.IS_OS_MAC){ + return findInUsualMacLocations(); + } + + return path; + } + + /** + * Dynamic because the directory version number keep changing. + */ + private static String findInUsualMacLocations() { + + String[] localAppDataLocations = new String[]{ + FolderFinder.getLocalAppDataFolder() + "/Applications/Firefox.app/Contents/MacOS/firefox-bin" , + FolderFinder.getLocalAppDataFolder() + "/Applications/Mozilla Firefox.app/Contents/MacOS/firefox-bin" + }; + + for (String path : localAppDataLocations) { + File f = new File(path); + if( f.exists() ){ + return path; + } + + } + + return null; + } + + + private static String findInUsualWindowsLocations() { + + String[] localAppDataLocations = new String[]{ + FolderFinder.getLocalAppDataFolder() + "\\Firefox-3\\firefox.exe" , + FolderFinder.getLocalAppDataFolder() + "\\Mozilla Firefox\\firefox.exe", + FolderFinder.getLocalAppDataFolder() + "\\Firefox\\firefox.exe" + }; + + for (String path : localAppDataLocations) { + File f = new File(path); + if( f.exists() ){ + return path; + } + + } + return null; + } + +} From 66f087e8625d2bbbb44ef26067730c24cd59e9bb Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:05 +0100 Subject: [PATCH 0201/1620] New translations GenerateDatabase.java (French) --- .../earth/app/view/Messages_fr.properties | 193 ++++++++++++------ 1 file changed, 129 insertions(+), 64 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 3f4bd647d1..8f7c20dd42 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,64 +1,129 @@ -package org.openforis.collect.earth.app.service; - -import java.io.File; - -import org.apache.commons.lang3.SystemUtils; - - -public class FirefoxLocatorFixed{ - - private FirefoxLocatorFixed(){ - } - - public static String tryToFindFolder(){ - String path = null; - if (SystemUtils.IS_OS_WINDOWS){ - return findInUsualWindowsLocations(); - }else if (SystemUtils.IS_OS_MAC){ - return findInUsualMacLocations(); - } - - return path; - } - - /** - * Dynamic because the directory version number keep changing. - */ - private static String findInUsualMacLocations() { - - String[] localAppDataLocations = new String[]{ - FolderFinder.getLocalAppDataFolder() + "/Applications/Firefox.app/Contents/MacOS/firefox-bin" , - FolderFinder.getLocalAppDataFolder() + "/Applications/Mozilla Firefox.app/Contents/MacOS/firefox-bin" - }; - - for (String path : localAppDataLocations) { - File f = new File(path); - if( f.exists() ){ - return path; - } - - } - - return null; - } - - - private static String findInUsualWindowsLocations() { - - String[] localAppDataLocations = new String[]{ - FolderFinder.getLocalAppDataFolder() + "\\Firefox-3\\firefox.exe" , - FolderFinder.getLocalAppDataFolder() + "\\Mozilla Firefox\\firefox.exe", - FolderFinder.getLocalAppDataFolder() + "\\Firefox\\firefox.exe" - }; - - for (String path : localAppDataLocations) { - File f = new File(path); - if( f.exists() ){ - return path; - } - - } - return null; - } - -} +package org.openforis.collect.earth.app.service; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +import org.apache.commons.codec.binary.Hex; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.ipcc.RdbExportException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import net.lingala.zip4j.ZipFile; + +public abstract class GenerateDatabase { + + + Logger logger = LoggerFactory.getLogger( GenerateDatabase.class); + boolean refreshDatabase; + boolean userCancelledOperation = false; + + public GenerateDatabase() { + super(); + } + + public abstract EarthSurveyService getEarthSurveyService(); + public abstract LocalPropertiesService getLocalPropertiesService(); + public abstract RDBExporter getRdbExporter(); + + private String getRdbFilePrefix( ExportType type ) { + String result = ""; + try { + final MessageDigest messageDigest = MessageDigest.getInstance("MD5"); + messageDigest.reset(); + String concatenation = getEarthSurveyService().getCollectSurvey().getUri() + + getEarthSurveyService().getCollectSurvey().getName(); + messageDigest.update(concatenation.getBytes( StandardCharsets.UTF_8 ) ); + final byte[] resultByte = messageDigest.digest(); + result = new String(Hex.encodeHex(resultByte)); + } catch (NoSuchAlgorithmException e) { + logger.error("Problems getting the MD5 hash of the project name", e); + } + return result; + } + + protected String getSchemaName() { + if (getLocalPropertiesService().isUsingPostgreSqlDB()) { + return EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU; + } else { + return null; + } + } + + protected File getZippedProjectDB( ExportType type ) { + + File dbFolder = new File(FolderFinder.getCollectEarthDataFolder() + File.separator + type.getDataFolder()); + + if (!dbFolder.exists()) { + dbFolder.mkdir(); + } + + return new File(dbFolder.getAbsolutePath() + File.separator + getRdbFilePrefix( type ) + + type.getDbSuffix() + ".zip"); + } + + public boolean isRdbAlreadyGenerated(ExportType type) { + + boolean saikuDBAlreadyPresent = false; + if (getLocalPropertiesService().isUsingSqliteDB()) { + File rdbFile = getZippedProjectDB( type ); + saikuDBAlreadyPresent = rdbFile.exists(); + } else { + // Here we should check if the "rdbcollectearth" schema is created in the + // PostgreSQL database + saikuDBAlreadyPresent = true; + } + + return saikuDBAlreadyPresent; + } + + protected boolean isRefreshDatabase() { + return refreshDatabase; + } + + protected boolean isUserCancelledOperation() { + return userCancelledOperation; + } + + public abstract void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws RdbExportException; + + protected void replaceZippedProjectDB(ExportType type) throws IOException { + if ( getLocalPropertiesService().isUsingSqliteDB()) { + ZipFile zippedSaiku = CollectEarthUtils.addFileToZip( + getZippedProjectDB( type ), + getRdbExporter().getRdbFile( type ), + getRdbExporter().getRdbFile( type ).getName() + ); + zippedSaiku.close(); + } + } + + boolean restoreZippedProjectDB( ExportType type ) { + boolean restoredSaiku = false; + if (getZippedProjectDB( type ).exists()) { + // Unzip file + + try (ZipFile zippedProjectSaikuData = new ZipFile(getZippedProjectDB( type ))) { + zippedProjectSaikuData.extractAll(FolderFinder.getCollectEarthDataFolder()); + restoredSaiku = true; + } catch (IOException e) { + logger.error("Problems unzipping the contents of the zipped Saiku DB to the local user folder ", e); + } + + } + return restoredSaiku; + } + + public void setRefreshDatabase(boolean refreshDatabase) { + this.refreshDatabase = refreshDatabase; + } + + public void setUserCancelledOperation(boolean userCancelledOperation) { + this.userCancelledOperation = userCancelledOperation; + } +} \ No newline at end of file From 7870c979b62a1b303d083195b2f6307ec7dd5549 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:06 +0100 Subject: [PATCH 0202/1620] New translations GenerateDatabase.java (Spanish) --- .../earth/app/view/Messages_es.properties | 193 ++++++++++++------ 1 file changed, 129 insertions(+), 64 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 3f4bd647d1..8f7c20dd42 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,64 +1,129 @@ -package org.openforis.collect.earth.app.service; - -import java.io.File; - -import org.apache.commons.lang3.SystemUtils; - - -public class FirefoxLocatorFixed{ - - private FirefoxLocatorFixed(){ - } - - public static String tryToFindFolder(){ - String path = null; - if (SystemUtils.IS_OS_WINDOWS){ - return findInUsualWindowsLocations(); - }else if (SystemUtils.IS_OS_MAC){ - return findInUsualMacLocations(); - } - - return path; - } - - /** - * Dynamic because the directory version number keep changing. - */ - private static String findInUsualMacLocations() { - - String[] localAppDataLocations = new String[]{ - FolderFinder.getLocalAppDataFolder() + "/Applications/Firefox.app/Contents/MacOS/firefox-bin" , - FolderFinder.getLocalAppDataFolder() + "/Applications/Mozilla Firefox.app/Contents/MacOS/firefox-bin" - }; - - for (String path : localAppDataLocations) { - File f = new File(path); - if( f.exists() ){ - return path; - } - - } - - return null; - } - - - private static String findInUsualWindowsLocations() { - - String[] localAppDataLocations = new String[]{ - FolderFinder.getLocalAppDataFolder() + "\\Firefox-3\\firefox.exe" , - FolderFinder.getLocalAppDataFolder() + "\\Mozilla Firefox\\firefox.exe", - FolderFinder.getLocalAppDataFolder() + "\\Firefox\\firefox.exe" - }; - - for (String path : localAppDataLocations) { - File f = new File(path); - if( f.exists() ){ - return path; - } - - } - return null; - } - -} +package org.openforis.collect.earth.app.service; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +import org.apache.commons.codec.binary.Hex; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.ipcc.RdbExportException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import net.lingala.zip4j.ZipFile; + +public abstract class GenerateDatabase { + + + Logger logger = LoggerFactory.getLogger( GenerateDatabase.class); + boolean refreshDatabase; + boolean userCancelledOperation = false; + + public GenerateDatabase() { + super(); + } + + public abstract EarthSurveyService getEarthSurveyService(); + public abstract LocalPropertiesService getLocalPropertiesService(); + public abstract RDBExporter getRdbExporter(); + + private String getRdbFilePrefix( ExportType type ) { + String result = ""; + try { + final MessageDigest messageDigest = MessageDigest.getInstance("MD5"); + messageDigest.reset(); + String concatenation = getEarthSurveyService().getCollectSurvey().getUri() + + getEarthSurveyService().getCollectSurvey().getName(); + messageDigest.update(concatenation.getBytes( StandardCharsets.UTF_8 ) ); + final byte[] resultByte = messageDigest.digest(); + result = new String(Hex.encodeHex(resultByte)); + } catch (NoSuchAlgorithmException e) { + logger.error("Problems getting the MD5 hash of the project name", e); + } + return result; + } + + protected String getSchemaName() { + if (getLocalPropertiesService().isUsingPostgreSqlDB()) { + return EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU; + } else { + return null; + } + } + + protected File getZippedProjectDB( ExportType type ) { + + File dbFolder = new File(FolderFinder.getCollectEarthDataFolder() + File.separator + type.getDataFolder()); + + if (!dbFolder.exists()) { + dbFolder.mkdir(); + } + + return new File(dbFolder.getAbsolutePath() + File.separator + getRdbFilePrefix( type ) + + type.getDbSuffix() + ".zip"); + } + + public boolean isRdbAlreadyGenerated(ExportType type) { + + boolean saikuDBAlreadyPresent = false; + if (getLocalPropertiesService().isUsingSqliteDB()) { + File rdbFile = getZippedProjectDB( type ); + saikuDBAlreadyPresent = rdbFile.exists(); + } else { + // Here we should check if the "rdbcollectearth" schema is created in the + // PostgreSQL database + saikuDBAlreadyPresent = true; + } + + return saikuDBAlreadyPresent; + } + + protected boolean isRefreshDatabase() { + return refreshDatabase; + } + + protected boolean isUserCancelledOperation() { + return userCancelledOperation; + } + + public abstract void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws RdbExportException; + + protected void replaceZippedProjectDB(ExportType type) throws IOException { + if ( getLocalPropertiesService().isUsingSqliteDB()) { + ZipFile zippedSaiku = CollectEarthUtils.addFileToZip( + getZippedProjectDB( type ), + getRdbExporter().getRdbFile( type ), + getRdbExporter().getRdbFile( type ).getName() + ); + zippedSaiku.close(); + } + } + + boolean restoreZippedProjectDB( ExportType type ) { + boolean restoredSaiku = false; + if (getZippedProjectDB( type ).exists()) { + // Unzip file + + try (ZipFile zippedProjectSaikuData = new ZipFile(getZippedProjectDB( type ))) { + zippedProjectSaikuData.extractAll(FolderFinder.getCollectEarthDataFolder()); + restoredSaiku = true; + } catch (IOException e) { + logger.error("Problems unzipping the contents of the zipped Saiku DB to the local user folder ", e); + } + + } + return restoredSaiku; + } + + public void setRefreshDatabase(boolean refreshDatabase) { + this.refreshDatabase = refreshDatabase; + } + + public void setUserCancelledOperation(boolean userCancelledOperation) { + this.userCancelledOperation = userCancelledOperation; + } +} \ No newline at end of file From 4ed6625a31cd6304b46d88a98a8c083aa7b9c6cf Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:06 +0100 Subject: [PATCH 0203/1620] New translations GenerateDatabase.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 193 ++++++++++++------ 1 file changed, 129 insertions(+), 64 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 3f4bd647d1..8f7c20dd42 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,64 +1,129 @@ -package org.openforis.collect.earth.app.service; - -import java.io.File; - -import org.apache.commons.lang3.SystemUtils; - - -public class FirefoxLocatorFixed{ - - private FirefoxLocatorFixed(){ - } - - public static String tryToFindFolder(){ - String path = null; - if (SystemUtils.IS_OS_WINDOWS){ - return findInUsualWindowsLocations(); - }else if (SystemUtils.IS_OS_MAC){ - return findInUsualMacLocations(); - } - - return path; - } - - /** - * Dynamic because the directory version number keep changing. - */ - private static String findInUsualMacLocations() { - - String[] localAppDataLocations = new String[]{ - FolderFinder.getLocalAppDataFolder() + "/Applications/Firefox.app/Contents/MacOS/firefox-bin" , - FolderFinder.getLocalAppDataFolder() + "/Applications/Mozilla Firefox.app/Contents/MacOS/firefox-bin" - }; - - for (String path : localAppDataLocations) { - File f = new File(path); - if( f.exists() ){ - return path; - } - - } - - return null; - } - - - private static String findInUsualWindowsLocations() { - - String[] localAppDataLocations = new String[]{ - FolderFinder.getLocalAppDataFolder() + "\\Firefox-3\\firefox.exe" , - FolderFinder.getLocalAppDataFolder() + "\\Mozilla Firefox\\firefox.exe", - FolderFinder.getLocalAppDataFolder() + "\\Firefox\\firefox.exe" - }; - - for (String path : localAppDataLocations) { - File f = new File(path); - if( f.exists() ){ - return path; - } - - } - return null; - } - -} +package org.openforis.collect.earth.app.service; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +import org.apache.commons.codec.binary.Hex; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.ipcc.RdbExportException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import net.lingala.zip4j.ZipFile; + +public abstract class GenerateDatabase { + + + Logger logger = LoggerFactory.getLogger( GenerateDatabase.class); + boolean refreshDatabase; + boolean userCancelledOperation = false; + + public GenerateDatabase() { + super(); + } + + public abstract EarthSurveyService getEarthSurveyService(); + public abstract LocalPropertiesService getLocalPropertiesService(); + public abstract RDBExporter getRdbExporter(); + + private String getRdbFilePrefix( ExportType type ) { + String result = ""; + try { + final MessageDigest messageDigest = MessageDigest.getInstance("MD5"); + messageDigest.reset(); + String concatenation = getEarthSurveyService().getCollectSurvey().getUri() + + getEarthSurveyService().getCollectSurvey().getName(); + messageDigest.update(concatenation.getBytes( StandardCharsets.UTF_8 ) ); + final byte[] resultByte = messageDigest.digest(); + result = new String(Hex.encodeHex(resultByte)); + } catch (NoSuchAlgorithmException e) { + logger.error("Problems getting the MD5 hash of the project name", e); + } + return result; + } + + protected String getSchemaName() { + if (getLocalPropertiesService().isUsingPostgreSqlDB()) { + return EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU; + } else { + return null; + } + } + + protected File getZippedProjectDB( ExportType type ) { + + File dbFolder = new File(FolderFinder.getCollectEarthDataFolder() + File.separator + type.getDataFolder()); + + if (!dbFolder.exists()) { + dbFolder.mkdir(); + } + + return new File(dbFolder.getAbsolutePath() + File.separator + getRdbFilePrefix( type ) + + type.getDbSuffix() + ".zip"); + } + + public boolean isRdbAlreadyGenerated(ExportType type) { + + boolean saikuDBAlreadyPresent = false; + if (getLocalPropertiesService().isUsingSqliteDB()) { + File rdbFile = getZippedProjectDB( type ); + saikuDBAlreadyPresent = rdbFile.exists(); + } else { + // Here we should check if the "rdbcollectearth" schema is created in the + // PostgreSQL database + saikuDBAlreadyPresent = true; + } + + return saikuDBAlreadyPresent; + } + + protected boolean isRefreshDatabase() { + return refreshDatabase; + } + + protected boolean isUserCancelledOperation() { + return userCancelledOperation; + } + + public abstract void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws RdbExportException; + + protected void replaceZippedProjectDB(ExportType type) throws IOException { + if ( getLocalPropertiesService().isUsingSqliteDB()) { + ZipFile zippedSaiku = CollectEarthUtils.addFileToZip( + getZippedProjectDB( type ), + getRdbExporter().getRdbFile( type ), + getRdbExporter().getRdbFile( type ).getName() + ); + zippedSaiku.close(); + } + } + + boolean restoreZippedProjectDB( ExportType type ) { + boolean restoredSaiku = false; + if (getZippedProjectDB( type ).exists()) { + // Unzip file + + try (ZipFile zippedProjectSaikuData = new ZipFile(getZippedProjectDB( type ))) { + zippedProjectSaikuData.extractAll(FolderFinder.getCollectEarthDataFolder()); + restoredSaiku = true; + } catch (IOException e) { + logger.error("Problems unzipping the contents of the zipped Saiku DB to the local user folder ", e); + } + + } + return restoredSaiku; + } + + public void setRefreshDatabase(boolean refreshDatabase) { + this.refreshDatabase = refreshDatabase; + } + + public void setUserCancelledOperation(boolean userCancelledOperation) { + this.userCancelledOperation = userCancelledOperation; + } +} \ No newline at end of file From fd700bfe24f1cce68b95785e202eea10f0bcdc77 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:07 +0100 Subject: [PATCH 0204/1620] New translations GenerateDatabase.java (English) --- .../earth/app/view/Messages_en.properties | 193 ++++++++++++------ 1 file changed, 129 insertions(+), 64 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 3f4bd647d1..8f7c20dd42 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,64 +1,129 @@ -package org.openforis.collect.earth.app.service; - -import java.io.File; - -import org.apache.commons.lang3.SystemUtils; - - -public class FirefoxLocatorFixed{ - - private FirefoxLocatorFixed(){ - } - - public static String tryToFindFolder(){ - String path = null; - if (SystemUtils.IS_OS_WINDOWS){ - return findInUsualWindowsLocations(); - }else if (SystemUtils.IS_OS_MAC){ - return findInUsualMacLocations(); - } - - return path; - } - - /** - * Dynamic because the directory version number keep changing. - */ - private static String findInUsualMacLocations() { - - String[] localAppDataLocations = new String[]{ - FolderFinder.getLocalAppDataFolder() + "/Applications/Firefox.app/Contents/MacOS/firefox-bin" , - FolderFinder.getLocalAppDataFolder() + "/Applications/Mozilla Firefox.app/Contents/MacOS/firefox-bin" - }; - - for (String path : localAppDataLocations) { - File f = new File(path); - if( f.exists() ){ - return path; - } - - } - - return null; - } - - - private static String findInUsualWindowsLocations() { - - String[] localAppDataLocations = new String[]{ - FolderFinder.getLocalAppDataFolder() + "\\Firefox-3\\firefox.exe" , - FolderFinder.getLocalAppDataFolder() + "\\Mozilla Firefox\\firefox.exe", - FolderFinder.getLocalAppDataFolder() + "\\Firefox\\firefox.exe" - }; - - for (String path : localAppDataLocations) { - File f = new File(path); - if( f.exists() ){ - return path; - } - - } - return null; - } - -} +package org.openforis.collect.earth.app.service; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +import org.apache.commons.codec.binary.Hex; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.ipcc.RdbExportException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import net.lingala.zip4j.ZipFile; + +public abstract class GenerateDatabase { + + + Logger logger = LoggerFactory.getLogger( GenerateDatabase.class); + boolean refreshDatabase; + boolean userCancelledOperation = false; + + public GenerateDatabase() { + super(); + } + + public abstract EarthSurveyService getEarthSurveyService(); + public abstract LocalPropertiesService getLocalPropertiesService(); + public abstract RDBExporter getRdbExporter(); + + private String getRdbFilePrefix( ExportType type ) { + String result = ""; + try { + final MessageDigest messageDigest = MessageDigest.getInstance("MD5"); + messageDigest.reset(); + String concatenation = getEarthSurveyService().getCollectSurvey().getUri() + + getEarthSurveyService().getCollectSurvey().getName(); + messageDigest.update(concatenation.getBytes( StandardCharsets.UTF_8 ) ); + final byte[] resultByte = messageDigest.digest(); + result = new String(Hex.encodeHex(resultByte)); + } catch (NoSuchAlgorithmException e) { + logger.error("Problems getting the MD5 hash of the project name", e); + } + return result; + } + + protected String getSchemaName() { + if (getLocalPropertiesService().isUsingPostgreSqlDB()) { + return EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU; + } else { + return null; + } + } + + protected File getZippedProjectDB( ExportType type ) { + + File dbFolder = new File(FolderFinder.getCollectEarthDataFolder() + File.separator + type.getDataFolder()); + + if (!dbFolder.exists()) { + dbFolder.mkdir(); + } + + return new File(dbFolder.getAbsolutePath() + File.separator + getRdbFilePrefix( type ) + + type.getDbSuffix() + ".zip"); + } + + public boolean isRdbAlreadyGenerated(ExportType type) { + + boolean saikuDBAlreadyPresent = false; + if (getLocalPropertiesService().isUsingSqliteDB()) { + File rdbFile = getZippedProjectDB( type ); + saikuDBAlreadyPresent = rdbFile.exists(); + } else { + // Here we should check if the "rdbcollectearth" schema is created in the + // PostgreSQL database + saikuDBAlreadyPresent = true; + } + + return saikuDBAlreadyPresent; + } + + protected boolean isRefreshDatabase() { + return refreshDatabase; + } + + protected boolean isUserCancelledOperation() { + return userCancelledOperation; + } + + public abstract void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws RdbExportException; + + protected void replaceZippedProjectDB(ExportType type) throws IOException { + if ( getLocalPropertiesService().isUsingSqliteDB()) { + ZipFile zippedSaiku = CollectEarthUtils.addFileToZip( + getZippedProjectDB( type ), + getRdbExporter().getRdbFile( type ), + getRdbExporter().getRdbFile( type ).getName() + ); + zippedSaiku.close(); + } + } + + boolean restoreZippedProjectDB( ExportType type ) { + boolean restoredSaiku = false; + if (getZippedProjectDB( type ).exists()) { + // Unzip file + + try (ZipFile zippedProjectSaikuData = new ZipFile(getZippedProjectDB( type ))) { + zippedProjectSaikuData.extractAll(FolderFinder.getCollectEarthDataFolder()); + restoredSaiku = true; + } catch (IOException e) { + logger.error("Problems unzipping the contents of the zipped Saiku DB to the local user folder ", e); + } + + } + return restoredSaiku; + } + + public void setRefreshDatabase(boolean refreshDatabase) { + this.refreshDatabase = refreshDatabase; + } + + public void setUserCancelledOperation(boolean userCancelledOperation) { + this.userCancelledOperation = userCancelledOperation; + } +} \ No newline at end of file From f6cf44f60dbcec9be7f651066422e32fcda73ca5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:09 +0100 Subject: [PATCH 0205/1620] New translations GeolocalizeMapService.java (French) --- .../earth/app/view/Messages_fr.properties | 316 +++++++++++------- 1 file changed, 187 insertions(+), 129 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 8f7c20dd42..4ed72d856d 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,129 +1,187 @@ -package org.openforis.collect.earth.app.service; - -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; - -import org.apache.commons.codec.binary.Hex; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.ipcc.RdbExportException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import net.lingala.zip4j.ZipFile; - -public abstract class GenerateDatabase { - - - Logger logger = LoggerFactory.getLogger( GenerateDatabase.class); - boolean refreshDatabase; - boolean userCancelledOperation = false; - - public GenerateDatabase() { - super(); - } - - public abstract EarthSurveyService getEarthSurveyService(); - public abstract LocalPropertiesService getLocalPropertiesService(); - public abstract RDBExporter getRdbExporter(); - - private String getRdbFilePrefix( ExportType type ) { - String result = ""; - try { - final MessageDigest messageDigest = MessageDigest.getInstance("MD5"); - messageDigest.reset(); - String concatenation = getEarthSurveyService().getCollectSurvey().getUri() - + getEarthSurveyService().getCollectSurvey().getName(); - messageDigest.update(concatenation.getBytes( StandardCharsets.UTF_8 ) ); - final byte[] resultByte = messageDigest.digest(); - result = new String(Hex.encodeHex(resultByte)); - } catch (NoSuchAlgorithmException e) { - logger.error("Problems getting the MD5 hash of the project name", e); - } - return result; - } - - protected String getSchemaName() { - if (getLocalPropertiesService().isUsingPostgreSqlDB()) { - return EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU; - } else { - return null; - } - } - - protected File getZippedProjectDB( ExportType type ) { - - File dbFolder = new File(FolderFinder.getCollectEarthDataFolder() + File.separator + type.getDataFolder()); - - if (!dbFolder.exists()) { - dbFolder.mkdir(); - } - - return new File(dbFolder.getAbsolutePath() + File.separator + getRdbFilePrefix( type ) - + type.getDbSuffix() + ".zip"); - } - - public boolean isRdbAlreadyGenerated(ExportType type) { - - boolean saikuDBAlreadyPresent = false; - if (getLocalPropertiesService().isUsingSqliteDB()) { - File rdbFile = getZippedProjectDB( type ); - saikuDBAlreadyPresent = rdbFile.exists(); - } else { - // Here we should check if the "rdbcollectearth" schema is created in the - // PostgreSQL database - saikuDBAlreadyPresent = true; - } - - return saikuDBAlreadyPresent; - } - - protected boolean isRefreshDatabase() { - return refreshDatabase; - } - - protected boolean isUserCancelledOperation() { - return userCancelledOperation; - } - - public abstract void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws RdbExportException; - - protected void replaceZippedProjectDB(ExportType type) throws IOException { - if ( getLocalPropertiesService().isUsingSqliteDB()) { - ZipFile zippedSaiku = CollectEarthUtils.addFileToZip( - getZippedProjectDB( type ), - getRdbExporter().getRdbFile( type ), - getRdbExporter().getRdbFile( type ).getName() - ); - zippedSaiku.close(); - } - } - - boolean restoreZippedProjectDB( ExportType type ) { - boolean restoredSaiku = false; - if (getZippedProjectDB( type ).exists()) { - // Unzip file - - try (ZipFile zippedProjectSaikuData = new ZipFile(getZippedProjectDB( type ))) { - zippedProjectSaikuData.extractAll(FolderFinder.getCollectEarthDataFolder()); - restoredSaiku = true; - } catch (IOException e) { - logger.error("Problems unzipping the contents of the zipped Saiku DB to the local user folder ", e); - } - - } - return restoredSaiku; - } - - public void setRefreshDatabase(boolean refreshDatabase) { - this.refreshDatabase = refreshDatabase; - } - - public void setUserCancelledOperation(boolean userCancelledOperation) { - this.userCancelledOperation = userCancelledOperation; - } -} \ No newline at end of file +package org.openforis.collect.earth.app.service; + +import java.io.File; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; +import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import freemarker.template.TemplateException; + +/** + * Customizes a Bing Map page to open zoomed into a coordinate. The HTML page is + * created in a temporary file and its URL is returned so that it can be opened + * in a browser. A freemarker template that contains the javascript code to + * customize the Bing Map is used and the parameters for the specific + * coordinates are applied to it. This service uses the same code than the KML + * generator to get the plot sample deign as chosen through the configuration by + * the user. + * + * @author Alfonso Sanchez-Paus Diaz + * + */ +@Component +public class GeolocalizeMapService { + + private static final String RESOURCES_FOLDER = "resources"; + + /** + * The file that contains the freemarker template used to produce the Bing Maps + * code. + */ + public static final String FREEMARKER_BING_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectBing.fmt"; + + public static final String FREEMARKER_BAIDU_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectBaidu.fmt"; + + public static final String FREEMARKER_PLANET_MONTHLY_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectPlanetMonthlyHtml.fmt"; + + public static final String FREEMARKER_PLANET_NICFI_ARGUMENTS = RESOURCES_FOLDER + File.separator + "collectPlanetNicfiTxt.fmt"; + + public static final String FREEMARKER_PLANET_DAILY_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectPlanetHtml.fmt"; + + public static final String FREEMARKER_PLANET_URL_TEMPLATE = RESOURCES_FOLDER + File.separator + + "collectPlanetUrl.fmt"; + + /** + * The file that contains the freemarker template used to produce the Yandex + * Maps code. + */ + public static final String FREEMARKER_YANDEX_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + + "collectYandex.fmt"; + + public static final String FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME = "eePlaygroundScript.fmt"; + public static final String FREEMARKER_GEE_CODE_EDITOR_TEMPLATE_FILE_NAME = "eeCodeEditorScript.fmt"; + + /** + * The file that contains the freemarker template used to produce script that is + * run in GEE Code Editor. + */ + public static final String FREEMARKER_GEE_PLAYGROUND_TEMPLATE = RESOURCES_FOLDER + File.separator + + FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME; + public static final String FREEMARKER_GEE_CODE_EDITOR_TEMPLATE = RESOURCES_FOLDER + File.separator + + FREEMARKER_GEE_CODE_EDITOR_TEMPLATE_FILE_NAME; + + public static final String FREEMARKER_HERE_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + + "collectHereMaps.fmt"; + + public static final String FREEMARKER_STREET_VIEW_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + + "collectStreetView.fmt"; + @Autowired + LocalPropertiesService localPropertiesService; + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + KmlGeneratorService kmlGeneratorService; + + public void addDatesForImages(final Map data) { + SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-MM-dd"); + Date todayDate = new Date(); + String dateAsExpected = dt1.format(todayDate); + data.put("todayDate", dateAsExpected); + + Calendar cal = Calendar.getInstance(); + cal.setTime(todayDate); + cal.add(Calendar.YEAR, -1); + + data.put("oneYearAgoDate", dt1.format(cal.getTime())); + + } + + private File applyData(Map data, String freemarkerTemplateFile) + throws IOException, TemplateException { + + final File templateFileSrc = new File(freemarkerTemplateFile); + + final File tempFileDst = File.createTempFile("selenium", ".html"); + tempFileDst.deleteOnExit(); + + FreemarkerTemplateUtils.applyTemplate(templateFileSrc, tempFileDst, data); + + return tempFileDst; + + } + + public Map getPlacemarkData(SimplePlacemarkObject placemarkObject) { + final Map data = new HashMap<>(); + data.put("placemark", placemarkObject); + return data; + } + + /** + * Produces a temporary file with the necessary HTML code to show the plot in + * Bing Maps + * + * @param placemarkObject + * The object containing information of the placemark. + * @param freemarkerTemplate + * The path to the freemarker template that is used to produce the + * file. + * @return The URL to the temporary file that can be used to load it in a + * browser. + */ + public URL getTemporaryUrl(SimplePlacemarkObject placemarkObject, String freemarkerTemplate) { + final Map data = getPlacemarkData(placemarkObject); + addDatesForImages(data); + return processTemplateWithData(freemarkerTemplate, data); + } + + /** + * Produces a URL using Planet Labs explorer expected format + * + * @param placemarkObject + * The data of the plot. + * @param freemarkerTemplate + * The freemarker template file to use + * @param extraData + * Variable listof key value strings + * @return The URL to the temporary file that can be used to load it in a + * browser. + */ + public URL getUrlToFreemarkerOutput(SimplePlacemarkObject placemarkObject, String freemarkerTemplate, + String... extraData) { + + final Map data = getPlacemarkData(placemarkObject); + + if( extraData !=null) { + for (int i = 0; i < extraData.length; i = i+2) { + data.put(extraData[i], extraData[i+1]); + } + } + return processTemplateWithData(freemarkerTemplate, data); + + } + + + private URL processTemplateWithData(String freemarkerTemplate, final Map data) { + File transformedHtml = null; + try { + transformedHtml = applyData(data, freemarkerTemplate); + } catch (final Exception e) { + logger.error("Exception when applying template " + freemarkerTemplate + "with data : " + data.toString(), + e); + } + if (transformedHtml != null) { + try { + return transformedHtml.toURI().toURL(); + } catch (MalformedURLException e) { + logger.error("Error generating URL for File " + transformedHtml.getAbsolutePath()); + return null; + } + } else { + logger.error("No Bing map HTML generated."); + return null; + } + } +} From 35528f4deb8d82b7094074ad8a2b22c56189c221 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:10 +0100 Subject: [PATCH 0206/1620] New translations GeolocalizeMapService.java (Spanish) --- .../earth/app/view/Messages_es.properties | 316 +++++++++++------- 1 file changed, 187 insertions(+), 129 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 8f7c20dd42..4ed72d856d 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,129 +1,187 @@ -package org.openforis.collect.earth.app.service; - -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; - -import org.apache.commons.codec.binary.Hex; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.ipcc.RdbExportException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import net.lingala.zip4j.ZipFile; - -public abstract class GenerateDatabase { - - - Logger logger = LoggerFactory.getLogger( GenerateDatabase.class); - boolean refreshDatabase; - boolean userCancelledOperation = false; - - public GenerateDatabase() { - super(); - } - - public abstract EarthSurveyService getEarthSurveyService(); - public abstract LocalPropertiesService getLocalPropertiesService(); - public abstract RDBExporter getRdbExporter(); - - private String getRdbFilePrefix( ExportType type ) { - String result = ""; - try { - final MessageDigest messageDigest = MessageDigest.getInstance("MD5"); - messageDigest.reset(); - String concatenation = getEarthSurveyService().getCollectSurvey().getUri() - + getEarthSurveyService().getCollectSurvey().getName(); - messageDigest.update(concatenation.getBytes( StandardCharsets.UTF_8 ) ); - final byte[] resultByte = messageDigest.digest(); - result = new String(Hex.encodeHex(resultByte)); - } catch (NoSuchAlgorithmException e) { - logger.error("Problems getting the MD5 hash of the project name", e); - } - return result; - } - - protected String getSchemaName() { - if (getLocalPropertiesService().isUsingPostgreSqlDB()) { - return EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU; - } else { - return null; - } - } - - protected File getZippedProjectDB( ExportType type ) { - - File dbFolder = new File(FolderFinder.getCollectEarthDataFolder() + File.separator + type.getDataFolder()); - - if (!dbFolder.exists()) { - dbFolder.mkdir(); - } - - return new File(dbFolder.getAbsolutePath() + File.separator + getRdbFilePrefix( type ) - + type.getDbSuffix() + ".zip"); - } - - public boolean isRdbAlreadyGenerated(ExportType type) { - - boolean saikuDBAlreadyPresent = false; - if (getLocalPropertiesService().isUsingSqliteDB()) { - File rdbFile = getZippedProjectDB( type ); - saikuDBAlreadyPresent = rdbFile.exists(); - } else { - // Here we should check if the "rdbcollectearth" schema is created in the - // PostgreSQL database - saikuDBAlreadyPresent = true; - } - - return saikuDBAlreadyPresent; - } - - protected boolean isRefreshDatabase() { - return refreshDatabase; - } - - protected boolean isUserCancelledOperation() { - return userCancelledOperation; - } - - public abstract void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws RdbExportException; - - protected void replaceZippedProjectDB(ExportType type) throws IOException { - if ( getLocalPropertiesService().isUsingSqliteDB()) { - ZipFile zippedSaiku = CollectEarthUtils.addFileToZip( - getZippedProjectDB( type ), - getRdbExporter().getRdbFile( type ), - getRdbExporter().getRdbFile( type ).getName() - ); - zippedSaiku.close(); - } - } - - boolean restoreZippedProjectDB( ExportType type ) { - boolean restoredSaiku = false; - if (getZippedProjectDB( type ).exists()) { - // Unzip file - - try (ZipFile zippedProjectSaikuData = new ZipFile(getZippedProjectDB( type ))) { - zippedProjectSaikuData.extractAll(FolderFinder.getCollectEarthDataFolder()); - restoredSaiku = true; - } catch (IOException e) { - logger.error("Problems unzipping the contents of the zipped Saiku DB to the local user folder ", e); - } - - } - return restoredSaiku; - } - - public void setRefreshDatabase(boolean refreshDatabase) { - this.refreshDatabase = refreshDatabase; - } - - public void setUserCancelledOperation(boolean userCancelledOperation) { - this.userCancelledOperation = userCancelledOperation; - } -} \ No newline at end of file +package org.openforis.collect.earth.app.service; + +import java.io.File; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; +import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import freemarker.template.TemplateException; + +/** + * Customizes a Bing Map page to open zoomed into a coordinate. The HTML page is + * created in a temporary file and its URL is returned so that it can be opened + * in a browser. A freemarker template that contains the javascript code to + * customize the Bing Map is used and the parameters for the specific + * coordinates are applied to it. This service uses the same code than the KML + * generator to get the plot sample deign as chosen through the configuration by + * the user. + * + * @author Alfonso Sanchez-Paus Diaz + * + */ +@Component +public class GeolocalizeMapService { + + private static final String RESOURCES_FOLDER = "resources"; + + /** + * The file that contains the freemarker template used to produce the Bing Maps + * code. + */ + public static final String FREEMARKER_BING_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectBing.fmt"; + + public static final String FREEMARKER_BAIDU_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectBaidu.fmt"; + + public static final String FREEMARKER_PLANET_MONTHLY_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectPlanetMonthlyHtml.fmt"; + + public static final String FREEMARKER_PLANET_NICFI_ARGUMENTS = RESOURCES_FOLDER + File.separator + "collectPlanetNicfiTxt.fmt"; + + public static final String FREEMARKER_PLANET_DAILY_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectPlanetHtml.fmt"; + + public static final String FREEMARKER_PLANET_URL_TEMPLATE = RESOURCES_FOLDER + File.separator + + "collectPlanetUrl.fmt"; + + /** + * The file that contains the freemarker template used to produce the Yandex + * Maps code. + */ + public static final String FREEMARKER_YANDEX_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + + "collectYandex.fmt"; + + public static final String FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME = "eePlaygroundScript.fmt"; + public static final String FREEMARKER_GEE_CODE_EDITOR_TEMPLATE_FILE_NAME = "eeCodeEditorScript.fmt"; + + /** + * The file that contains the freemarker template used to produce script that is + * run in GEE Code Editor. + */ + public static final String FREEMARKER_GEE_PLAYGROUND_TEMPLATE = RESOURCES_FOLDER + File.separator + + FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME; + public static final String FREEMARKER_GEE_CODE_EDITOR_TEMPLATE = RESOURCES_FOLDER + File.separator + + FREEMARKER_GEE_CODE_EDITOR_TEMPLATE_FILE_NAME; + + public static final String FREEMARKER_HERE_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + + "collectHereMaps.fmt"; + + public static final String FREEMARKER_STREET_VIEW_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + + "collectStreetView.fmt"; + @Autowired + LocalPropertiesService localPropertiesService; + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + KmlGeneratorService kmlGeneratorService; + + public void addDatesForImages(final Map data) { + SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-MM-dd"); + Date todayDate = new Date(); + String dateAsExpected = dt1.format(todayDate); + data.put("todayDate", dateAsExpected); + + Calendar cal = Calendar.getInstance(); + cal.setTime(todayDate); + cal.add(Calendar.YEAR, -1); + + data.put("oneYearAgoDate", dt1.format(cal.getTime())); + + } + + private File applyData(Map data, String freemarkerTemplateFile) + throws IOException, TemplateException { + + final File templateFileSrc = new File(freemarkerTemplateFile); + + final File tempFileDst = File.createTempFile("selenium", ".html"); + tempFileDst.deleteOnExit(); + + FreemarkerTemplateUtils.applyTemplate(templateFileSrc, tempFileDst, data); + + return tempFileDst; + + } + + public Map getPlacemarkData(SimplePlacemarkObject placemarkObject) { + final Map data = new HashMap<>(); + data.put("placemark", placemarkObject); + return data; + } + + /** + * Produces a temporary file with the necessary HTML code to show the plot in + * Bing Maps + * + * @param placemarkObject + * The object containing information of the placemark. + * @param freemarkerTemplate + * The path to the freemarker template that is used to produce the + * file. + * @return The URL to the temporary file that can be used to load it in a + * browser. + */ + public URL getTemporaryUrl(SimplePlacemarkObject placemarkObject, String freemarkerTemplate) { + final Map data = getPlacemarkData(placemarkObject); + addDatesForImages(data); + return processTemplateWithData(freemarkerTemplate, data); + } + + /** + * Produces a URL using Planet Labs explorer expected format + * + * @param placemarkObject + * The data of the plot. + * @param freemarkerTemplate + * The freemarker template file to use + * @param extraData + * Variable listof key value strings + * @return The URL to the temporary file that can be used to load it in a + * browser. + */ + public URL getUrlToFreemarkerOutput(SimplePlacemarkObject placemarkObject, String freemarkerTemplate, + String... extraData) { + + final Map data = getPlacemarkData(placemarkObject); + + if( extraData !=null) { + for (int i = 0; i < extraData.length; i = i+2) { + data.put(extraData[i], extraData[i+1]); + } + } + return processTemplateWithData(freemarkerTemplate, data); + + } + + + private URL processTemplateWithData(String freemarkerTemplate, final Map data) { + File transformedHtml = null; + try { + transformedHtml = applyData(data, freemarkerTemplate); + } catch (final Exception e) { + logger.error("Exception when applying template " + freemarkerTemplate + "with data : " + data.toString(), + e); + } + if (transformedHtml != null) { + try { + return transformedHtml.toURI().toURL(); + } catch (MalformedURLException e) { + logger.error("Error generating URL for File " + transformedHtml.getAbsolutePath()); + return null; + } + } else { + logger.error("No Bing map HTML generated."); + return null; + } + } +} From b6516650d2b274b7d1378d7fa493db645d1feb2c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:11 +0100 Subject: [PATCH 0207/1620] New translations ProcessLoggerThread.java (English) --- .../earth/app/view/Messages_en.properties | 175 +++++------------- 1 file changed, 47 insertions(+), 128 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 8f7c20dd42..4b902b8805 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,129 +1,48 @@ -package org.openforis.collect.earth.app.service; - -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; - -import org.apache.commons.codec.binary.Hex; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.ipcc.RdbExportException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import net.lingala.zip4j.ZipFile; - -public abstract class GenerateDatabase { - - - Logger logger = LoggerFactory.getLogger( GenerateDatabase.class); - boolean refreshDatabase; - boolean userCancelledOperation = false; - - public GenerateDatabase() { - super(); - } - - public abstract EarthSurveyService getEarthSurveyService(); - public abstract LocalPropertiesService getLocalPropertiesService(); - public abstract RDBExporter getRdbExporter(); - - private String getRdbFilePrefix( ExportType type ) { - String result = ""; - try { - final MessageDigest messageDigest = MessageDigest.getInstance("MD5"); - messageDigest.reset(); - String concatenation = getEarthSurveyService().getCollectSurvey().getUri() - + getEarthSurveyService().getCollectSurvey().getName(); - messageDigest.update(concatenation.getBytes( StandardCharsets.UTF_8 ) ); - final byte[] resultByte = messageDigest.digest(); - result = new String(Hex.encodeHex(resultByte)); - } catch (NoSuchAlgorithmException e) { - logger.error("Problems getting the MD5 hash of the project name", e); - } - return result; - } - - protected String getSchemaName() { - if (getLocalPropertiesService().isUsingPostgreSqlDB()) { - return EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU; - } else { - return null; - } - } - - protected File getZippedProjectDB( ExportType type ) { - - File dbFolder = new File(FolderFinder.getCollectEarthDataFolder() + File.separator + type.getDataFolder()); - - if (!dbFolder.exists()) { - dbFolder.mkdir(); - } - - return new File(dbFolder.getAbsolutePath() + File.separator + getRdbFilePrefix( type ) - + type.getDbSuffix() + ".zip"); - } - - public boolean isRdbAlreadyGenerated(ExportType type) { - - boolean saikuDBAlreadyPresent = false; - if (getLocalPropertiesService().isUsingSqliteDB()) { - File rdbFile = getZippedProjectDB( type ); - saikuDBAlreadyPresent = rdbFile.exists(); - } else { - // Here we should check if the "rdbcollectearth" schema is created in the - // PostgreSQL database - saikuDBAlreadyPresent = true; - } - - return saikuDBAlreadyPresent; - } - - protected boolean isRefreshDatabase() { - return refreshDatabase; - } - - protected boolean isUserCancelledOperation() { - return userCancelledOperation; - } - - public abstract void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws RdbExportException; - - protected void replaceZippedProjectDB(ExportType type) throws IOException { - if ( getLocalPropertiesService().isUsingSqliteDB()) { - ZipFile zippedSaiku = CollectEarthUtils.addFileToZip( - getZippedProjectDB( type ), - getRdbExporter().getRdbFile( type ), - getRdbExporter().getRdbFile( type ).getName() - ); - zippedSaiku.close(); - } - } - - boolean restoreZippedProjectDB( ExportType type ) { - boolean restoredSaiku = false; - if (getZippedProjectDB( type ).exists()) { - // Unzip file - - try (ZipFile zippedProjectSaikuData = new ZipFile(getZippedProjectDB( type ))) { - zippedProjectSaikuData.extractAll(FolderFinder.getCollectEarthDataFolder()); - restoredSaiku = true; - } catch (IOException e) { - logger.error("Problems unzipping the contents of the zipped Saiku DB to the local user folder ", e); - } - - } - return restoredSaiku; - } - - public void setRefreshDatabase(boolean refreshDatabase) { - this.refreshDatabase = refreshDatabase; - } - - public void setUserCancelledOperation(boolean userCancelledOperation) { - this.userCancelledOperation = userCancelledOperation; - } +package org.openforis.collect.earth.app.service; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class ProcessLoggerThread extends Thread { + + private static final Logger LOGGER = LoggerFactory.getLogger(ProcessLoggerThread.class); + + private InputStream inputStream; + + private Boolean logOutputAsError; + + + public ProcessLoggerThread(InputStream inputStream, Boolean logOutputAsError) { + super(); + + this.inputStream = inputStream; + this.logOutputAsError = logOutputAsError; + } + + + @Override + public void run() { + try { + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); + String line = reader.readLine(); + while (line != null) { + if( Boolean.TRUE.equals( logOutputAsError ) ) + LOGGER.error(line); + else + LOGGER.warn(line); + + line = reader.readLine(); + } + reader.close(); + LOGGER.warn("End of logs"); + } catch (IOException e) { + LOGGER.error("The log reader died unexpectedly.", e); + } + } } \ No newline at end of file From 217d3d7cce19f144391861b521c1e361269b80c7 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:12 +0100 Subject: [PATCH 0208/1620] New translations RDBConnector.java (French) --- .../earth/app/view/Messages_fr.properties | 244 ++++-------------- 1 file changed, 57 insertions(+), 187 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 4ed72d856d..70e2ecd6d6 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,187 +1,57 @@ -package org.openforis.collect.earth.app.service; - -import java.io.File; -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; - -import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; -import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import freemarker.template.TemplateException; - -/** - * Customizes a Bing Map page to open zoomed into a coordinate. The HTML page is - * created in a temporary file and its URL is returned so that it can be opened - * in a browser. A freemarker template that contains the javascript code to - * customize the Bing Map is used and the parameters for the specific - * coordinates are applied to it. This service uses the same code than the KML - * generator to get the plot sample deign as chosen through the configuration by - * the user. - * - * @author Alfonso Sanchez-Paus Diaz - * - */ -@Component -public class GeolocalizeMapService { - - private static final String RESOURCES_FOLDER = "resources"; - - /** - * The file that contains the freemarker template used to produce the Bing Maps - * code. - */ - public static final String FREEMARKER_BING_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectBing.fmt"; - - public static final String FREEMARKER_BAIDU_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectBaidu.fmt"; - - public static final String FREEMARKER_PLANET_MONTHLY_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectPlanetMonthlyHtml.fmt"; - - public static final String FREEMARKER_PLANET_NICFI_ARGUMENTS = RESOURCES_FOLDER + File.separator + "collectPlanetNicfiTxt.fmt"; - - public static final String FREEMARKER_PLANET_DAILY_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectPlanetHtml.fmt"; - - public static final String FREEMARKER_PLANET_URL_TEMPLATE = RESOURCES_FOLDER + File.separator - + "collectPlanetUrl.fmt"; - - /** - * The file that contains the freemarker template used to produce the Yandex - * Maps code. - */ - public static final String FREEMARKER_YANDEX_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator - + "collectYandex.fmt"; - - public static final String FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME = "eePlaygroundScript.fmt"; - public static final String FREEMARKER_GEE_CODE_EDITOR_TEMPLATE_FILE_NAME = "eeCodeEditorScript.fmt"; - - /** - * The file that contains the freemarker template used to produce script that is - * run in GEE Code Editor. - */ - public static final String FREEMARKER_GEE_PLAYGROUND_TEMPLATE = RESOURCES_FOLDER + File.separator - + FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME; - public static final String FREEMARKER_GEE_CODE_EDITOR_TEMPLATE = RESOURCES_FOLDER + File.separator - + FREEMARKER_GEE_CODE_EDITOR_TEMPLATE_FILE_NAME; - - public static final String FREEMARKER_HERE_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator - + "collectHereMaps.fmt"; - - public static final String FREEMARKER_STREET_VIEW_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator - + "collectStreetView.fmt"; - @Autowired - LocalPropertiesService localPropertiesService; - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - @Autowired - KmlGeneratorService kmlGeneratorService; - - public void addDatesForImages(final Map data) { - SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-MM-dd"); - Date todayDate = new Date(); - String dateAsExpected = dt1.format(todayDate); - data.put("todayDate", dateAsExpected); - - Calendar cal = Calendar.getInstance(); - cal.setTime(todayDate); - cal.add(Calendar.YEAR, -1); - - data.put("oneYearAgoDate", dt1.format(cal.getTime())); - - } - - private File applyData(Map data, String freemarkerTemplateFile) - throws IOException, TemplateException { - - final File templateFileSrc = new File(freemarkerTemplateFile); - - final File tempFileDst = File.createTempFile("selenium", ".html"); - tempFileDst.deleteOnExit(); - - FreemarkerTemplateUtils.applyTemplate(templateFileSrc, tempFileDst, data); - - return tempFileDst; - - } - - public Map getPlacemarkData(SimplePlacemarkObject placemarkObject) { - final Map data = new HashMap<>(); - data.put("placemark", placemarkObject); - return data; - } - - /** - * Produces a temporary file with the necessary HTML code to show the plot in - * Bing Maps - * - * @param placemarkObject - * The object containing information of the placemark. - * @param freemarkerTemplate - * The path to the freemarker template that is used to produce the - * file. - * @return The URL to the temporary file that can be used to load it in a - * browser. - */ - public URL getTemporaryUrl(SimplePlacemarkObject placemarkObject, String freemarkerTemplate) { - final Map data = getPlacemarkData(placemarkObject); - addDatesForImages(data); - return processTemplateWithData(freemarkerTemplate, data); - } - - /** - * Produces a URL using Planet Labs explorer expected format - * - * @param placemarkObject - * The data of the plot. - * @param freemarkerTemplate - * The freemarker template file to use - * @param extraData - * Variable listof key value strings - * @return The URL to the temporary file that can be used to load it in a - * browser. - */ - public URL getUrlToFreemarkerOutput(SimplePlacemarkObject placemarkObject, String freemarkerTemplate, - String... extraData) { - - final Map data = getPlacemarkData(placemarkObject); - - if( extraData !=null) { - for (int i = 0; i < extraData.length; i = i+2) { - data.put(extraData[i], extraData[i+1]); - } - } - return processTemplateWithData(freemarkerTemplate, data); - - } - - - private URL processTemplateWithData(String freemarkerTemplate, final Map data) { - File transformedHtml = null; - try { - transformedHtml = applyData(data, freemarkerTemplate); - } catch (final Exception e) { - logger.error("Exception when applying template " + freemarkerTemplate + "with data : " + data.toString(), - e); - } - if (transformedHtml != null) { - try { - return transformedHtml.toURI().toURL(); - } catch (MalformedURLException e) { - logger.error("Error generating URL for File " + transformedHtml.getAbsolutePath()); - return null; - } - } else { - logger.error("No Bing map HTML generated."); - return null; - } - } -} +package org.openforis.collect.earth.app.service; + +import java.sql.Connection; + +import javax.sql.DataSource; + +import org.apache.commons.dbcp.BasicDataSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.DataSourceUtils; + +public abstract class RDBConnector { + @Autowired + @Qualifier("rdbDataSource") + private DataSource rdbDataSource; + + @Autowired + @Qualifier("rdbDataSourceIpcc") + private BasicDataSource rdbDataSourceIpcc; + + private JdbcTemplate jdbcTemplate; + + private ExportType exportTypeUsed; + + public JdbcTemplate getJdbcTemplate() { + if( jdbcTemplate == null ) { + if( getExportTypeUsed().equals( ExportType.SAIKU) ) { + jdbcTemplate = new JdbcTemplate(rdbDataSource); + }else if( getExportTypeUsed().equals( ExportType.IPCC ) ){ + jdbcTemplate = new JdbcTemplate(rdbDataSourceIpcc); + }else { + throw new IllegalArgumentException("The ExportType has not been set yet"); + } + } + return jdbcTemplate; + } + + protected Connection getJDBCConnection() { + if( getExportTypeUsed().equals( ExportType.SAIKU ) ) { + return DataSourceUtils.getConnection(rdbDataSource); + }else if( getExportTypeUsed().equals( ExportType.IPCC ) ){ + return DataSourceUtils.getConnection(rdbDataSourceIpcc); + }else { + throw new IllegalArgumentException("The ExportType has not been set yet"); + } + } + + public ExportType getExportTypeUsed() { + return exportTypeUsed; + } + + public void setExportTypeUsed(ExportType exportTypeUsed) { + this.exportTypeUsed = exportTypeUsed; + } + +} From 86d615383c4cc6e6757f344352a49238b2f02b14 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:13 +0100 Subject: [PATCH 0209/1620] New translations ApplyOptionChangesListener.java (Spanish) --- .../earth/app/view/Messages_es.properties | 275 ++++++++---------- 1 file changed, 115 insertions(+), 160 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 4ed72d856d..a4628939fc 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,187 +1,142 @@ -package org.openforis.collect.earth.app.service; - -import java.io.File; -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; +package org.openforis.collect.earth.app.view; -import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; -import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; +import java.awt.Window; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.HashMap; +import java.util.Set; + +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JList; +import javax.swing.JOptionPane; +import javax.swing.JPasswordField; +import javax.swing.JRadioButton; +import javax.swing.SwingUtilities; +import javax.swing.text.JTextComponent; + +import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import freemarker.template.TemplateException; - -/** - * Customizes a Bing Map page to open zoomed into a coordinate. The HTML page is - * created in a temporary file and its URL is returned so that it can be opened - * in a browser. A freemarker template that contains the javascript code to - * customize the Bing Map is used and the parameters for the specific - * coordinates are applied to it. This service uses the same code than the KML - * generator to get the plot sample deign as chosen through the configuration by - * the user. - * - * @author Alfonso Sanchez-Paus Diaz - * - */ -@Component -public class GeolocalizeMapService { - - private static final String RESOURCES_FOLDER = "resources"; - - /** - * The file that contains the freemarker template used to produce the Bing Maps - * code. - */ - public static final String FREEMARKER_BING_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectBing.fmt"; - - public static final String FREEMARKER_BAIDU_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectBaidu.fmt"; - - public static final String FREEMARKER_PLANET_MONTHLY_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectPlanetMonthlyHtml.fmt"; - - public static final String FREEMARKER_PLANET_NICFI_ARGUMENTS = RESOURCES_FOLDER + File.separator + "collectPlanetNicfiTxt.fmt"; - - public static final String FREEMARKER_PLANET_DAILY_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectPlanetHtml.fmt"; - - public static final String FREEMARKER_PLANET_URL_TEMPLATE = RESOURCES_FOLDER + File.separator - + "collectPlanetUrl.fmt"; - - /** - * The file that contains the freemarker template used to produce the Yandex - * Maps code. - */ - public static final String FREEMARKER_YANDEX_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator - + "collectYandex.fmt"; - - public static final String FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME = "eePlaygroundScript.fmt"; - public static final String FREEMARKER_GEE_CODE_EDITOR_TEMPLATE_FILE_NAME = "eeCodeEditorScript.fmt"; - - /** - * The file that contains the freemarker template used to produce script that is - * run in GEE Code Editor. - */ - public static final String FREEMARKER_GEE_PLAYGROUND_TEMPLATE = RESOURCES_FOLDER + File.separator - + FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME; - public static final String FREEMARKER_GEE_CODE_EDITOR_TEMPLATE = RESOURCES_FOLDER + File.separator - + FREEMARKER_GEE_CODE_EDITOR_TEMPLATE_FILE_NAME; - - public static final String FREEMARKER_HERE_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator - + "collectHereMaps.fmt"; - - public static final String FREEMARKER_STREET_VIEW_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator - + "collectStreetView.fmt"; - @Autowired - LocalPropertiesService localPropertiesService; +public abstract class ApplyOptionChangesListener implements ActionListener { + private LocalPropertiesService localPropertiesService; + private HashMap, JComponent[]> propertyToComponent; private final Logger logger = LoggerFactory.getLogger(this.getClass()); + protected Window callingDialog; - @Autowired - KmlGeneratorService kmlGeneratorService; - - public void addDatesForImages(final Map data) { - SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-MM-dd"); - Date todayDate = new Date(); - String dateAsExpected = dt1.format(todayDate); - data.put("todayDate", dateAsExpected); - Calendar cal = Calendar.getInstance(); - cal.setTime(todayDate); - cal.add(Calendar.YEAR, -1); - - data.put("oneYearAgoDate", dt1.format(cal.getTime())); + public ApplyOptionChangesListener(Window callingDialog, LocalPropertiesService localPropertiesService, HashMap, JComponent[]> propertyToComponent) { + this.callingDialog = callingDialog; + this.localPropertiesService = localPropertiesService; + this.propertyToComponent = propertyToComponent; } - private File applyData(Map data, String freemarkerTemplateFile) - throws IOException, TemplateException { - - final File templateFileSrc = new File(freemarkerTemplateFile); - - final File tempFileDst = File.createTempFile("selenium", ".html"); - tempFileDst.deleteOnExit(); - - FreemarkerTemplateUtils.applyTemplate(templateFileSrc, tempFileDst, data); - - return tempFileDst; - + public ApplyOptionChangesListener(Window callingDialog, LocalPropertiesService localPropertiesService) { + this.callingDialog = callingDialog; + this.localPropertiesService = localPropertiesService; } - public Map getPlacemarkData(SimplePlacemarkObject placemarkObject) { - final Map data = new HashMap<>(); - data.put("placemark", placemarkObject); - return data; + @Override + public void actionPerformed(ActionEvent arg0) { + try { + startWaiting(); + applyProperties(); + } catch (final Exception e) { + logger.error("Error applying the new properties", e); //$NON-NLS-1$ + } finally { + endWaiting(); + } } - /** - * Produces a temporary file with the necessary HTML code to show the plot in - * Bing Maps - * - * @param placemarkObject - * The object containing information of the placemark. - * @param freemarkerTemplate - * The path to the freemarker template that is used to produce the - * file. - * @return The URL to the temporary file that can be used to load it in a - * browser. - */ - public URL getTemporaryUrl(SimplePlacemarkObject placemarkObject, String freemarkerTemplate) { - final Map data = getPlacemarkData(placemarkObject); - addDatesForImages(data); - return processTemplateWithData(freemarkerTemplate, data); + private void setPropertyValue( Enum enumKey, String value ){ + + localPropertiesService.setValue((EarthProperty) enumKey, value); + } - /** - * Produces a URL using Planet Labs explorer expected format - * - * @param placemarkObject - * The data of the plot. - * @param freemarkerTemplate - * The freemarker template file to use - * @param extraData - * Variable listof key value strings - * @return The URL to the temporary file that can be used to load it in a - * browser. - */ - public URL getUrlToFreemarkerOutput(SimplePlacemarkObject placemarkObject, String freemarkerTemplate, - String... extraData) { - - final Map data = getPlacemarkData(placemarkObject); - - if( extraData !=null) { - for (int i = 0; i < extraData.length; i = i+2) { - data.put(extraData[i], extraData[i+1]); + protected abstract void applyProperties(); + + public void savePropertyValues() { + final Set> keySet = propertyToComponent.keySet(); + for (final Enum propertyKey : keySet) { + final JComponent component = propertyToComponent.get(propertyKey)[0]; + if( !component.isVisible() ) { + setPropertyValue(propertyKey, ""); + }else { + if (component instanceof JTextComponent) { + setPropertyValue(propertyKey, ((JTextComponent) component).getText()); + } else if (component instanceof JPasswordField) { + setPropertyValue(propertyKey, new String( ((JPasswordField) component).getPassword()) ); + }else if (component instanceof JCheckBox) { + setPropertyValue(propertyKey, ((JCheckBox) component).isSelected() + ""); //$NON-NLS-1$ + } else if (component instanceof JComboBox) { + if (((JComboBox) component).getItemAt(0) instanceof ComboBoxItem) { + setPropertyValue(propertyKey, + ((ComboBoxItem) ((JComboBox) component).getSelectedItem()).getNumberOfPoints() + ""); //$NON-NLS-1$ + } else if (((JComboBox) component).getItemAt(0) instanceof String) { + setPropertyValue(propertyKey, ((String) ((JComboBox) component).getSelectedItem() ) ); //$NON-NLS-1$ + } else if (((JComboBox) component).getItemAt(0) instanceof SAMPLE_SHAPE) { + setPropertyValue(propertyKey, ( (SAMPLE_SHAPE) ((JComboBox) component).getSelectedItem() ).name() ); + } + } else if (component instanceof JList) { + setPropertyValue(propertyKey, ((JList) component).getSelectedValue() + ""); //$NON-NLS-1$ + } else if (component instanceof JRadioButton) { + final JComponent[] jComponents = propertyToComponent.get(propertyKey); + for (final JComponent jComponent : jComponents) { + if (((JRadioButton) jComponent).isSelected()) { + setPropertyValue(propertyKey, ((JRadioButton) jComponent).getName()); + } + } + } else if (component instanceof JFilePicker) { + setPropertyValue(propertyKey, ((JFilePicker) component).getSelectedFilePath()); + } } } - return processTemplateWithData(freemarkerTemplate, data); - } + public void restartEarth() { + localPropertiesService.nullifyChecksumValues(); - private URL processTemplateWithData(String freemarkerTemplate, final Map data) { - File transformedHtml = null; try { - transformedHtml = applyData(data, freemarkerTemplate); + // Re-generate KMZ + new Thread("Restarting Collect Earth after changing properties/loading project/loading KML points"){ + @Override + public void run() { + EarthApp.restart(); + } + }.start(); + + SwingUtilities.invokeLater( ()->{ + JOptionPane.showMessageDialog( callingDialog, Messages.getString("OptionWizard.20"), //$NON-NLS-1$ + Messages.getString("OptionWizard.21"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ + if( callingDialog!= null && callingDialog instanceof PropertiesDialog){ + callingDialog.dispose(); + } + }); + } catch (final Exception e) { - logger.error("Exception when applying template " + freemarkerTemplate + "with data : " + data.toString(), - e); + logger.error("Error when re-generating the KML code to open in GE ", e); //$NON-NLS-1$ + JOptionPane.showMessageDialog(callingDialog, e.getMessage(), Messages.getString("OptionWizard.23"), //$NON-NLS-1$ + JOptionPane.WARNING_MESSAGE); } - if (transformedHtml != null) { - try { - return transformedHtml.toURI().toURL(); - } catch (MalformedURLException e) { - logger.error("Error generating URL for File " + transformedHtml.getAbsolutePath()); - return null; - } - } else { - logger.error("No Bing map HTML generated."); - return null; + } + + private void startWaiting() { + if( callingDialog != null ){ + callingDialog.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); + } + } + + + private void endWaiting() { + if( callingDialog != null ){ + callingDialog.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); } } } From 311c16ec35b03535606b4c615e798c99035afb5d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:14 +0100 Subject: [PATCH 0210/1620] New translations .gitignore (French) --- .../earth/app/view/Messages_fr.properties | 58 +------------------ 1 file changed, 1 insertion(+), 57 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 70e2ecd6d6..8c63826403 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,57 +1 @@ -package org.openforis.collect.earth.app.service; - -import java.sql.Connection; - -import javax.sql.DataSource; - -import org.apache.commons.dbcp.BasicDataSource; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.datasource.DataSourceUtils; - -public abstract class RDBConnector { - @Autowired - @Qualifier("rdbDataSource") - private DataSource rdbDataSource; - - @Autowired - @Qualifier("rdbDataSourceIpcc") - private BasicDataSource rdbDataSourceIpcc; - - private JdbcTemplate jdbcTemplate; - - private ExportType exportTypeUsed; - - public JdbcTemplate getJdbcTemplate() { - if( jdbcTemplate == null ) { - if( getExportTypeUsed().equals( ExportType.SAIKU) ) { - jdbcTemplate = new JdbcTemplate(rdbDataSource); - }else if( getExportTypeUsed().equals( ExportType.IPCC ) ){ - jdbcTemplate = new JdbcTemplate(rdbDataSourceIpcc); - }else { - throw new IllegalArgumentException("The ExportType has not been set yet"); - } - } - return jdbcTemplate; - } - - protected Connection getJDBCConnection() { - if( getExportTypeUsed().equals( ExportType.SAIKU ) ) { - return DataSourceUtils.getConnection(rdbDataSource); - }else if( getExportTypeUsed().equals( ExportType.IPCC ) ){ - return DataSourceUtils.getConnection(rdbDataSourceIpcc); - }else { - throw new IllegalArgumentException("The ExportType has not been set yet"); - } - } - - public ExportType getExportTypeUsed() { - return exportTypeUsed; - } - - public void setExportTypeUsed(ExportType exportTypeUsed) { - this.exportTypeUsed = exportTypeUsed; - } - -} +/SaikuToolGenerationDlg.java From 1f6436a195bd4227fb1d290bcadeae130b662478 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:15 +0100 Subject: [PATCH 0211/1620] New translations .gitignore (Spanish) --- .../earth/app/view/Messages_es.properties | 143 +----------------- 1 file changed, 1 insertion(+), 142 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index a4628939fc..8c63826403 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,142 +1 @@ -package org.openforis.collect.earth.app.view; - -import java.awt.Window; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.HashMap; -import java.util.Set; - -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JComponent; -import javax.swing.JList; -import javax.swing.JOptionPane; -import javax.swing.JPasswordField; -import javax.swing.JRadioButton; -import javax.swing.SwingUtilities; -import javax.swing.text.JTextComponent; - -import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public abstract class ApplyOptionChangesListener implements ActionListener { - private LocalPropertiesService localPropertiesService; - private HashMap, JComponent[]> propertyToComponent; - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - protected Window callingDialog; - - - public ApplyOptionChangesListener(Window callingDialog, LocalPropertiesService localPropertiesService, HashMap, JComponent[]> propertyToComponent) { - this.callingDialog = callingDialog; - this.localPropertiesService = localPropertiesService; - this.propertyToComponent = propertyToComponent; - - } - - public ApplyOptionChangesListener(Window callingDialog, LocalPropertiesService localPropertiesService) { - this.callingDialog = callingDialog; - this.localPropertiesService = localPropertiesService; - } - - @Override - public void actionPerformed(ActionEvent arg0) { - try { - startWaiting(); - applyProperties(); - } catch (final Exception e) { - logger.error("Error applying the new properties", e); //$NON-NLS-1$ - } finally { - endWaiting(); - } - } - - private void setPropertyValue( Enum enumKey, String value ){ - - localPropertiesService.setValue((EarthProperty) enumKey, value); - - } - - protected abstract void applyProperties(); - - public void savePropertyValues() { - final Set> keySet = propertyToComponent.keySet(); - for (final Enum propertyKey : keySet) { - final JComponent component = propertyToComponent.get(propertyKey)[0]; - if( !component.isVisible() ) { - setPropertyValue(propertyKey, ""); - }else { - if (component instanceof JTextComponent) { - setPropertyValue(propertyKey, ((JTextComponent) component).getText()); - } else if (component instanceof JPasswordField) { - setPropertyValue(propertyKey, new String( ((JPasswordField) component).getPassword()) ); - }else if (component instanceof JCheckBox) { - setPropertyValue(propertyKey, ((JCheckBox) component).isSelected() + ""); //$NON-NLS-1$ - } else if (component instanceof JComboBox) { - if (((JComboBox) component).getItemAt(0) instanceof ComboBoxItem) { - setPropertyValue(propertyKey, - ((ComboBoxItem) ((JComboBox) component).getSelectedItem()).getNumberOfPoints() + ""); //$NON-NLS-1$ - } else if (((JComboBox) component).getItemAt(0) instanceof String) { - setPropertyValue(propertyKey, ((String) ((JComboBox) component).getSelectedItem() ) ); //$NON-NLS-1$ - } else if (((JComboBox) component).getItemAt(0) instanceof SAMPLE_SHAPE) { - setPropertyValue(propertyKey, ( (SAMPLE_SHAPE) ((JComboBox) component).getSelectedItem() ).name() ); - } - } else if (component instanceof JList) { - setPropertyValue(propertyKey, ((JList) component).getSelectedValue() + ""); //$NON-NLS-1$ - } else if (component instanceof JRadioButton) { - final JComponent[] jComponents = propertyToComponent.get(propertyKey); - for (final JComponent jComponent : jComponents) { - if (((JRadioButton) jComponent).isSelected()) { - setPropertyValue(propertyKey, ((JRadioButton) jComponent).getName()); - } - } - } else if (component instanceof JFilePicker) { - setPropertyValue(propertyKey, ((JFilePicker) component).getSelectedFilePath()); - } - } - } - } - - public void restartEarth() { - localPropertiesService.nullifyChecksumValues(); - - try { - // Re-generate KMZ - new Thread("Restarting Collect Earth after changing properties/loading project/loading KML points"){ - @Override - public void run() { - EarthApp.restart(); - } - }.start(); - - SwingUtilities.invokeLater( ()->{ - JOptionPane.showMessageDialog( callingDialog, Messages.getString("OptionWizard.20"), //$NON-NLS-1$ - Messages.getString("OptionWizard.21"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ - if( callingDialog!= null && callingDialog instanceof PropertiesDialog){ - callingDialog.dispose(); - } - }); - - } catch (final Exception e) { - logger.error("Error when re-generating the KML code to open in GE ", e); //$NON-NLS-1$ - JOptionPane.showMessageDialog(callingDialog, e.getMessage(), Messages.getString("OptionWizard.23"), //$NON-NLS-1$ - JOptionPane.WARNING_MESSAGE); - } - } - - private void startWaiting() { - if( callingDialog != null ){ - callingDialog.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); - } - } - - - private void endWaiting() { - if( callingDialog != null ){ - callingDialog.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); - } - } -} +/SaikuToolGenerationDlg.java From a7be7a3380ad21dd3bf5f2322e210c977a775983 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:16 +0100 Subject: [PATCH 0212/1620] New translations .gitignore (Portuguese) --- .../earth/app/view/Messages_pt.properties | 130 +----------------- 1 file changed, 1 insertion(+), 129 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 8f7c20dd42..8c63826403 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,129 +1 @@ -package org.openforis.collect.earth.app.service; - -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; - -import org.apache.commons.codec.binary.Hex; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.ipcc.RdbExportException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import net.lingala.zip4j.ZipFile; - -public abstract class GenerateDatabase { - - - Logger logger = LoggerFactory.getLogger( GenerateDatabase.class); - boolean refreshDatabase; - boolean userCancelledOperation = false; - - public GenerateDatabase() { - super(); - } - - public abstract EarthSurveyService getEarthSurveyService(); - public abstract LocalPropertiesService getLocalPropertiesService(); - public abstract RDBExporter getRdbExporter(); - - private String getRdbFilePrefix( ExportType type ) { - String result = ""; - try { - final MessageDigest messageDigest = MessageDigest.getInstance("MD5"); - messageDigest.reset(); - String concatenation = getEarthSurveyService().getCollectSurvey().getUri() - + getEarthSurveyService().getCollectSurvey().getName(); - messageDigest.update(concatenation.getBytes( StandardCharsets.UTF_8 ) ); - final byte[] resultByte = messageDigest.digest(); - result = new String(Hex.encodeHex(resultByte)); - } catch (NoSuchAlgorithmException e) { - logger.error("Problems getting the MD5 hash of the project name", e); - } - return result; - } - - protected String getSchemaName() { - if (getLocalPropertiesService().isUsingPostgreSqlDB()) { - return EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU; - } else { - return null; - } - } - - protected File getZippedProjectDB( ExportType type ) { - - File dbFolder = new File(FolderFinder.getCollectEarthDataFolder() + File.separator + type.getDataFolder()); - - if (!dbFolder.exists()) { - dbFolder.mkdir(); - } - - return new File(dbFolder.getAbsolutePath() + File.separator + getRdbFilePrefix( type ) - + type.getDbSuffix() + ".zip"); - } - - public boolean isRdbAlreadyGenerated(ExportType type) { - - boolean saikuDBAlreadyPresent = false; - if (getLocalPropertiesService().isUsingSqliteDB()) { - File rdbFile = getZippedProjectDB( type ); - saikuDBAlreadyPresent = rdbFile.exists(); - } else { - // Here we should check if the "rdbcollectearth" schema is created in the - // PostgreSQL database - saikuDBAlreadyPresent = true; - } - - return saikuDBAlreadyPresent; - } - - protected boolean isRefreshDatabase() { - return refreshDatabase; - } - - protected boolean isUserCancelledOperation() { - return userCancelledOperation; - } - - public abstract void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws RdbExportException; - - protected void replaceZippedProjectDB(ExportType type) throws IOException { - if ( getLocalPropertiesService().isUsingSqliteDB()) { - ZipFile zippedSaiku = CollectEarthUtils.addFileToZip( - getZippedProjectDB( type ), - getRdbExporter().getRdbFile( type ), - getRdbExporter().getRdbFile( type ).getName() - ); - zippedSaiku.close(); - } - } - - boolean restoreZippedProjectDB( ExportType type ) { - boolean restoredSaiku = false; - if (getZippedProjectDB( type ).exists()) { - // Unzip file - - try (ZipFile zippedProjectSaikuData = new ZipFile(getZippedProjectDB( type ))) { - zippedProjectSaikuData.extractAll(FolderFinder.getCollectEarthDataFolder()); - restoredSaiku = true; - } catch (IOException e) { - logger.error("Problems unzipping the contents of the zipped Saiku DB to the local user folder ", e); - } - - } - return restoredSaiku; - } - - public void setRefreshDatabase(boolean refreshDatabase) { - this.refreshDatabase = refreshDatabase; - } - - public void setUserCancelledOperation(boolean userCancelledOperation) { - this.userCancelledOperation = userCancelledOperation; - } -} \ No newline at end of file +/SaikuToolGenerationDlg.java From 6409c8785f367e9c02dd88b38cecb524fbb28100 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:17 +0100 Subject: [PATCH 0213/1620] New translations .gitignore (English) --- .../earth/app/view/Messages_en.properties | 49 +------------------ 1 file changed, 1 insertion(+), 48 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 4b902b8805..8c63826403 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,48 +1 @@ -package org.openforis.collect.earth.app.service; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - -public class ProcessLoggerThread extends Thread { - - private static final Logger LOGGER = LoggerFactory.getLogger(ProcessLoggerThread.class); - - private InputStream inputStream; - - private Boolean logOutputAsError; - - - public ProcessLoggerThread(InputStream inputStream, Boolean logOutputAsError) { - super(); - - this.inputStream = inputStream; - this.logOutputAsError = logOutputAsError; - } - - - @Override - public void run() { - try { - BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); - String line = reader.readLine(); - while (line != null) { - if( Boolean.TRUE.equals( logOutputAsError ) ) - LOGGER.error(line); - else - LOGGER.warn(line); - - line = reader.readLine(); - } - reader.close(); - LOGGER.warn("End of logs"); - } catch (IOException e) { - LOGGER.error("The log reader died unexpectedly.", e); - } - } -} \ No newline at end of file +/SaikuToolGenerationDlg.java From c27bf83689fa20de9622880431640849505cdff5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:18 +0100 Subject: [PATCH 0214/1620] New translations AboutDialog.java (French) --- .../earth/app/view/Messages_fr.properties | 129 +++++++++++++++++- 1 file changed, 128 insertions(+), 1 deletion(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 8c63826403..1550d687ee 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1 +1,128 @@ -/SaikuToolGenerationDlg.java +package org.openforis.collect.earth.app.view; + +import java.awt.Desktop; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseListener; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.Properties; + +import javax.swing.Box; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; + +import org.openforis.collect.earth.app.service.UpdateIniUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class AboutDialog extends JDialog { + + private static final long serialVersionUID = 3108968706818898461L; + private transient Logger logger = LoggerFactory.getLogger( AboutDialog.class ); + + public AboutDialog(JFrame parent, String title) { + super(parent, title, true); + + UpdateIniUtils updateIniUtils = new UpdateIniUtils(); + String buildDate = updateIniUtils.convertToDate(getBuild()); + + Box b = Box.createVerticalBox(); + b.setAlignmentX(CENTER_ALIGNMENT); + b.add(Box.createGlue()); + b.add(new JLabel("Collect Earth v. " + getVersion() + " ( built " + buildDate + ") ")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + b.add(new JLabel("By Open Foris Initiative / Part of the Food and Agriculture Organization of the UN")); //$NON-NLS-1$ + JLabel comp = new JLabel("" + Messages.getString("AboutDialog.5") + ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + JLabel comp2 = new JLabel("CHECK THE CHANGE LOG"); + if (isBrowsingSupported()) { + makeLinkable(comp, new LinkMouseListener( "http://www.openforis.org" )); + makeLinkable(comp2, new LinkMouseListener( "https://github.com/openforis/collect-earth/blob/master/collect-earth/CHANGELOG.md" )); + } + b.add(comp); + b.add(comp2); + b.add(Box.createGlue()); + getContentPane().add(b, "Center"); //$NON-NLS-1$ + + JPanel p2 = new JPanel(); + JButton ok = new JButton(Messages.getString("AboutDialog.8")); //$NON-NLS-1$ + p2.add(ok); + getContentPane().add(p2, "South"); //$NON-NLS-1$ + + ok.addActionListener( e -> setVisible(false) ); + + setSize(380, 150); + } + + private String getBuild() { + String key = "version_id"; //$NON-NLS-1$ + return getValueFromUpdateIni(key); + } + + public String getValueFromUpdateIni(String key) { + Properties properties = new Properties(); + String value = "unknwown"; //$NON-NLS-1$ + try (FileInputStream fis = new FileInputStream("update.ini")) { //$NON-NLS-1$ + properties.load(fis); + value = properties.getProperty(key); + } catch (FileNotFoundException e) { + logger.error("The update.,ini file could not be found", e); //$NON-NLS-1$ + } catch (IOException e) { + logger.error("Error opening the update.ini file", e); //$NON-NLS-1$ + } + return value; + } + + private String getVersion() { + String key = "version"; //$NON-NLS-1$ + return getValueFromUpdateIni(key); + } + + private static void makeLinkable(JLabel c, MouseListener ml) { + assert ml != null; + + c.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); + c.addMouseListener(ml); + } + + private static boolean isBrowsingSupported() { + if (!Desktop.isDesktopSupported()) { + return false; + } + boolean result = false; + Desktop desktop = java.awt.Desktop.getDesktop(); + if (desktop.isSupported(Desktop.Action.BROWSE)) { + result = true; + } + return result; + + } + + private static class LinkMouseListener extends MouseAdapter { + String url; + + + public LinkMouseListener(String url) { + super(); + this.url = url; + } + + + @Override + public void mouseClicked(java.awt.event.MouseEvent evt) { + JLabel l = (JLabel) evt.getSource(); + try { + + URI uri = new java.net.URI(url); //$NON-NLS-1$ + (new LinkRunner(uri)).execute(); + } catch (URISyntaxException use) { + throw new AssertionError(use + ": " + l.getText()); //NOI18N //$NON-NLS-1$ + } + } + } + +} From 81d82d3a4b87d5d2fd3b54961b283407b75cd973 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:19 +0100 Subject: [PATCH 0215/1620] New translations AboutDialog.java (Spanish) --- .../earth/app/view/Messages_es.properties | 129 +++++++++++++++++- 1 file changed, 128 insertions(+), 1 deletion(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 8c63826403..1550d687ee 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1 +1,128 @@ -/SaikuToolGenerationDlg.java +package org.openforis.collect.earth.app.view; + +import java.awt.Desktop; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseListener; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.Properties; + +import javax.swing.Box; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; + +import org.openforis.collect.earth.app.service.UpdateIniUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class AboutDialog extends JDialog { + + private static final long serialVersionUID = 3108968706818898461L; + private transient Logger logger = LoggerFactory.getLogger( AboutDialog.class ); + + public AboutDialog(JFrame parent, String title) { + super(parent, title, true); + + UpdateIniUtils updateIniUtils = new UpdateIniUtils(); + String buildDate = updateIniUtils.convertToDate(getBuild()); + + Box b = Box.createVerticalBox(); + b.setAlignmentX(CENTER_ALIGNMENT); + b.add(Box.createGlue()); + b.add(new JLabel("Collect Earth v. " + getVersion() + " ( built " + buildDate + ") ")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + b.add(new JLabel("By Open Foris Initiative / Part of the Food and Agriculture Organization of the UN")); //$NON-NLS-1$ + JLabel comp = new JLabel("" + Messages.getString("AboutDialog.5") + ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + JLabel comp2 = new JLabel("CHECK THE CHANGE LOG"); + if (isBrowsingSupported()) { + makeLinkable(comp, new LinkMouseListener( "http://www.openforis.org" )); + makeLinkable(comp2, new LinkMouseListener( "https://github.com/openforis/collect-earth/blob/master/collect-earth/CHANGELOG.md" )); + } + b.add(comp); + b.add(comp2); + b.add(Box.createGlue()); + getContentPane().add(b, "Center"); //$NON-NLS-1$ + + JPanel p2 = new JPanel(); + JButton ok = new JButton(Messages.getString("AboutDialog.8")); //$NON-NLS-1$ + p2.add(ok); + getContentPane().add(p2, "South"); //$NON-NLS-1$ + + ok.addActionListener( e -> setVisible(false) ); + + setSize(380, 150); + } + + private String getBuild() { + String key = "version_id"; //$NON-NLS-1$ + return getValueFromUpdateIni(key); + } + + public String getValueFromUpdateIni(String key) { + Properties properties = new Properties(); + String value = "unknwown"; //$NON-NLS-1$ + try (FileInputStream fis = new FileInputStream("update.ini")) { //$NON-NLS-1$ + properties.load(fis); + value = properties.getProperty(key); + } catch (FileNotFoundException e) { + logger.error("The update.,ini file could not be found", e); //$NON-NLS-1$ + } catch (IOException e) { + logger.error("Error opening the update.ini file", e); //$NON-NLS-1$ + } + return value; + } + + private String getVersion() { + String key = "version"; //$NON-NLS-1$ + return getValueFromUpdateIni(key); + } + + private static void makeLinkable(JLabel c, MouseListener ml) { + assert ml != null; + + c.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); + c.addMouseListener(ml); + } + + private static boolean isBrowsingSupported() { + if (!Desktop.isDesktopSupported()) { + return false; + } + boolean result = false; + Desktop desktop = java.awt.Desktop.getDesktop(); + if (desktop.isSupported(Desktop.Action.BROWSE)) { + result = true; + } + return result; + + } + + private static class LinkMouseListener extends MouseAdapter { + String url; + + + public LinkMouseListener(String url) { + super(); + this.url = url; + } + + + @Override + public void mouseClicked(java.awt.event.MouseEvent evt) { + JLabel l = (JLabel) evt.getSource(); + try { + + URI uri = new java.net.URI(url); //$NON-NLS-1$ + (new LinkRunner(uri)).execute(); + } catch (URISyntaxException use) { + throw new AssertionError(use + ": " + l.getText()); //NOI18N //$NON-NLS-1$ + } + } + } + +} From 0e991511a28a3228c09f9bb3e93ca957ef30480b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:20 +0100 Subject: [PATCH 0216/1620] New translations AboutDialog.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 129 +++++++++++++++++- 1 file changed, 128 insertions(+), 1 deletion(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 8c63826403..1550d687ee 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1 +1,128 @@ -/SaikuToolGenerationDlg.java +package org.openforis.collect.earth.app.view; + +import java.awt.Desktop; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseListener; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.Properties; + +import javax.swing.Box; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; + +import org.openforis.collect.earth.app.service.UpdateIniUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class AboutDialog extends JDialog { + + private static final long serialVersionUID = 3108968706818898461L; + private transient Logger logger = LoggerFactory.getLogger( AboutDialog.class ); + + public AboutDialog(JFrame parent, String title) { + super(parent, title, true); + + UpdateIniUtils updateIniUtils = new UpdateIniUtils(); + String buildDate = updateIniUtils.convertToDate(getBuild()); + + Box b = Box.createVerticalBox(); + b.setAlignmentX(CENTER_ALIGNMENT); + b.add(Box.createGlue()); + b.add(new JLabel("Collect Earth v. " + getVersion() + " ( built " + buildDate + ") ")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + b.add(new JLabel("By Open Foris Initiative / Part of the Food and Agriculture Organization of the UN")); //$NON-NLS-1$ + JLabel comp = new JLabel("" + Messages.getString("AboutDialog.5") + ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + JLabel comp2 = new JLabel("CHECK THE CHANGE LOG"); + if (isBrowsingSupported()) { + makeLinkable(comp, new LinkMouseListener( "http://www.openforis.org" )); + makeLinkable(comp2, new LinkMouseListener( "https://github.com/openforis/collect-earth/blob/master/collect-earth/CHANGELOG.md" )); + } + b.add(comp); + b.add(comp2); + b.add(Box.createGlue()); + getContentPane().add(b, "Center"); //$NON-NLS-1$ + + JPanel p2 = new JPanel(); + JButton ok = new JButton(Messages.getString("AboutDialog.8")); //$NON-NLS-1$ + p2.add(ok); + getContentPane().add(p2, "South"); //$NON-NLS-1$ + + ok.addActionListener( e -> setVisible(false) ); + + setSize(380, 150); + } + + private String getBuild() { + String key = "version_id"; //$NON-NLS-1$ + return getValueFromUpdateIni(key); + } + + public String getValueFromUpdateIni(String key) { + Properties properties = new Properties(); + String value = "unknwown"; //$NON-NLS-1$ + try (FileInputStream fis = new FileInputStream("update.ini")) { //$NON-NLS-1$ + properties.load(fis); + value = properties.getProperty(key); + } catch (FileNotFoundException e) { + logger.error("The update.,ini file could not be found", e); //$NON-NLS-1$ + } catch (IOException e) { + logger.error("Error opening the update.ini file", e); //$NON-NLS-1$ + } + return value; + } + + private String getVersion() { + String key = "version"; //$NON-NLS-1$ + return getValueFromUpdateIni(key); + } + + private static void makeLinkable(JLabel c, MouseListener ml) { + assert ml != null; + + c.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); + c.addMouseListener(ml); + } + + private static boolean isBrowsingSupported() { + if (!Desktop.isDesktopSupported()) { + return false; + } + boolean result = false; + Desktop desktop = java.awt.Desktop.getDesktop(); + if (desktop.isSupported(Desktop.Action.BROWSE)) { + result = true; + } + return result; + + } + + private static class LinkMouseListener extends MouseAdapter { + String url; + + + public LinkMouseListener(String url) { + super(); + this.url = url; + } + + + @Override + public void mouseClicked(java.awt.event.MouseEvent evt) { + JLabel l = (JLabel) evt.getSource(); + try { + + URI uri = new java.net.URI(url); //$NON-NLS-1$ + (new LinkRunner(uri)).execute(); + } catch (URISyntaxException use) { + throw new AssertionError(use + ": " + l.getText()); //NOI18N //$NON-NLS-1$ + } + } + } + +} From 20cb56455fd1641790838184356f99bb3ee7e698 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:21 +0100 Subject: [PATCH 0217/1620] New translations AboutDialog.java (English) --- .../earth/app/view/Messages_en.properties | 129 +++++++++++++++++- 1 file changed, 128 insertions(+), 1 deletion(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 8c63826403..1550d687ee 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1 +1,128 @@ -/SaikuToolGenerationDlg.java +package org.openforis.collect.earth.app.view; + +import java.awt.Desktop; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseListener; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.Properties; + +import javax.swing.Box; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; + +import org.openforis.collect.earth.app.service.UpdateIniUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class AboutDialog extends JDialog { + + private static final long serialVersionUID = 3108968706818898461L; + private transient Logger logger = LoggerFactory.getLogger( AboutDialog.class ); + + public AboutDialog(JFrame parent, String title) { + super(parent, title, true); + + UpdateIniUtils updateIniUtils = new UpdateIniUtils(); + String buildDate = updateIniUtils.convertToDate(getBuild()); + + Box b = Box.createVerticalBox(); + b.setAlignmentX(CENTER_ALIGNMENT); + b.add(Box.createGlue()); + b.add(new JLabel("Collect Earth v. " + getVersion() + " ( built " + buildDate + ") ")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + b.add(new JLabel("By Open Foris Initiative / Part of the Food and Agriculture Organization of the UN")); //$NON-NLS-1$ + JLabel comp = new JLabel("" + Messages.getString("AboutDialog.5") + ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + JLabel comp2 = new JLabel("CHECK THE CHANGE LOG"); + if (isBrowsingSupported()) { + makeLinkable(comp, new LinkMouseListener( "http://www.openforis.org" )); + makeLinkable(comp2, new LinkMouseListener( "https://github.com/openforis/collect-earth/blob/master/collect-earth/CHANGELOG.md" )); + } + b.add(comp); + b.add(comp2); + b.add(Box.createGlue()); + getContentPane().add(b, "Center"); //$NON-NLS-1$ + + JPanel p2 = new JPanel(); + JButton ok = new JButton(Messages.getString("AboutDialog.8")); //$NON-NLS-1$ + p2.add(ok); + getContentPane().add(p2, "South"); //$NON-NLS-1$ + + ok.addActionListener( e -> setVisible(false) ); + + setSize(380, 150); + } + + private String getBuild() { + String key = "version_id"; //$NON-NLS-1$ + return getValueFromUpdateIni(key); + } + + public String getValueFromUpdateIni(String key) { + Properties properties = new Properties(); + String value = "unknwown"; //$NON-NLS-1$ + try (FileInputStream fis = new FileInputStream("update.ini")) { //$NON-NLS-1$ + properties.load(fis); + value = properties.getProperty(key); + } catch (FileNotFoundException e) { + logger.error("The update.,ini file could not be found", e); //$NON-NLS-1$ + } catch (IOException e) { + logger.error("Error opening the update.ini file", e); //$NON-NLS-1$ + } + return value; + } + + private String getVersion() { + String key = "version"; //$NON-NLS-1$ + return getValueFromUpdateIni(key); + } + + private static void makeLinkable(JLabel c, MouseListener ml) { + assert ml != null; + + c.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); + c.addMouseListener(ml); + } + + private static boolean isBrowsingSupported() { + if (!Desktop.isDesktopSupported()) { + return false; + } + boolean result = false; + Desktop desktop = java.awt.Desktop.getDesktop(); + if (desktop.isSupported(Desktop.Action.BROWSE)) { + result = true; + } + return result; + + } + + private static class LinkMouseListener extends MouseAdapter { + String url; + + + public LinkMouseListener(String url) { + super(); + this.url = url; + } + + + @Override + public void mouseClicked(java.awt.event.MouseEvent evt) { + JLabel l = (JLabel) evt.getSource(); + try { + + URI uri = new java.net.URI(url); //$NON-NLS-1$ + (new LinkRunner(uri)).execute(); + } catch (URISyntaxException use) { + throw new AssertionError(use + ": " + l.getText()); //NOI18N //$NON-NLS-1$ + } + } + } + +} From e4da53fff90337d6cd16b74fb47f3ca61e0ae094 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:22 +0100 Subject: [PATCH 0218/1620] New translations ApplyOptionChangesListener.java (French) --- .../earth/app/view/Messages_fr.properties | 222 ++++++++++-------- 1 file changed, 118 insertions(+), 104 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 1550d687ee..a4628939fc 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,128 +1,142 @@ package org.openforis.collect.earth.app.view; -import java.awt.Desktop; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseListener; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.Properties; - -import javax.swing.Box; -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JPanel; - -import org.openforis.collect.earth.app.service.UpdateIniUtils; +import java.awt.Window; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.HashMap; +import java.util.Set; + +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JList; +import javax.swing.JOptionPane; +import javax.swing.JPasswordField; +import javax.swing.JRadioButton; +import javax.swing.SwingUtilities; +import javax.swing.text.JTextComponent; + +import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class AboutDialog extends JDialog { - - private static final long serialVersionUID = 3108968706818898461L; - private transient Logger logger = LoggerFactory.getLogger( AboutDialog.class ); - - public AboutDialog(JFrame parent, String title) { - super(parent, title, true); - - UpdateIniUtils updateIniUtils = new UpdateIniUtils(); - String buildDate = updateIniUtils.convertToDate(getBuild()); - - Box b = Box.createVerticalBox(); - b.setAlignmentX(CENTER_ALIGNMENT); - b.add(Box.createGlue()); - b.add(new JLabel("Collect Earth v. " + getVersion() + " ( built " + buildDate + ") ")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - b.add(new JLabel("By Open Foris Initiative / Part of the Food and Agriculture Organization of the UN")); //$NON-NLS-1$ - JLabel comp = new JLabel("" + Messages.getString("AboutDialog.5") + ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - JLabel comp2 = new JLabel("CHECK THE CHANGE LOG"); - if (isBrowsingSupported()) { - makeLinkable(comp, new LinkMouseListener( "http://www.openforis.org" )); - makeLinkable(comp2, new LinkMouseListener( "https://github.com/openforis/collect-earth/blob/master/collect-earth/CHANGELOG.md" )); - } - b.add(comp); - b.add(comp2); - b.add(Box.createGlue()); - getContentPane().add(b, "Center"); //$NON-NLS-1$ - - JPanel p2 = new JPanel(); - JButton ok = new JButton(Messages.getString("AboutDialog.8")); //$NON-NLS-1$ - p2.add(ok); - getContentPane().add(p2, "South"); //$NON-NLS-1$ - - ok.addActionListener( e -> setVisible(false) ); - - setSize(380, 150); +public abstract class ApplyOptionChangesListener implements ActionListener { + private LocalPropertiesService localPropertiesService; + private HashMap, JComponent[]> propertyToComponent; + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + protected Window callingDialog; + + + public ApplyOptionChangesListener(Window callingDialog, LocalPropertiesService localPropertiesService, HashMap, JComponent[]> propertyToComponent) { + this.callingDialog = callingDialog; + this.localPropertiesService = localPropertiesService; + this.propertyToComponent = propertyToComponent; + } - private String getBuild() { - String key = "version_id"; //$NON-NLS-1$ - return getValueFromUpdateIni(key); + public ApplyOptionChangesListener(Window callingDialog, LocalPropertiesService localPropertiesService) { + this.callingDialog = callingDialog; + this.localPropertiesService = localPropertiesService; } - public String getValueFromUpdateIni(String key) { - Properties properties = new Properties(); - String value = "unknwown"; //$NON-NLS-1$ - try (FileInputStream fis = new FileInputStream("update.ini")) { //$NON-NLS-1$ - properties.load(fis); - value = properties.getProperty(key); - } catch (FileNotFoundException e) { - logger.error("The update.,ini file could not be found", e); //$NON-NLS-1$ - } catch (IOException e) { - logger.error("Error opening the update.ini file", e); //$NON-NLS-1$ + @Override + public void actionPerformed(ActionEvent arg0) { + try { + startWaiting(); + applyProperties(); + } catch (final Exception e) { + logger.error("Error applying the new properties", e); //$NON-NLS-1$ + } finally { + endWaiting(); } - return value; } - private String getVersion() { - String key = "version"; //$NON-NLS-1$ - return getValueFromUpdateIni(key); - } + private void setPropertyValue( Enum enumKey, String value ){ - private static void makeLinkable(JLabel c, MouseListener ml) { - assert ml != null; + localPropertiesService.setValue((EarthProperty) enumKey, value); - c.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); - c.addMouseListener(ml); } - private static boolean isBrowsingSupported() { - if (!Desktop.isDesktopSupported()) { - return false; - } - boolean result = false; - Desktop desktop = java.awt.Desktop.getDesktop(); - if (desktop.isSupported(Desktop.Action.BROWSE)) { - result = true; - } - return result; - + protected abstract void applyProperties(); + + public void savePropertyValues() { + final Set> keySet = propertyToComponent.keySet(); + for (final Enum propertyKey : keySet) { + final JComponent component = propertyToComponent.get(propertyKey)[0]; + if( !component.isVisible() ) { + setPropertyValue(propertyKey, ""); + }else { + if (component instanceof JTextComponent) { + setPropertyValue(propertyKey, ((JTextComponent) component).getText()); + } else if (component instanceof JPasswordField) { + setPropertyValue(propertyKey, new String( ((JPasswordField) component).getPassword()) ); + }else if (component instanceof JCheckBox) { + setPropertyValue(propertyKey, ((JCheckBox) component).isSelected() + ""); //$NON-NLS-1$ + } else if (component instanceof JComboBox) { + if (((JComboBox) component).getItemAt(0) instanceof ComboBoxItem) { + setPropertyValue(propertyKey, + ((ComboBoxItem) ((JComboBox) component).getSelectedItem()).getNumberOfPoints() + ""); //$NON-NLS-1$ + } else if (((JComboBox) component).getItemAt(0) instanceof String) { + setPropertyValue(propertyKey, ((String) ((JComboBox) component).getSelectedItem() ) ); //$NON-NLS-1$ + } else if (((JComboBox) component).getItemAt(0) instanceof SAMPLE_SHAPE) { + setPropertyValue(propertyKey, ( (SAMPLE_SHAPE) ((JComboBox) component).getSelectedItem() ).name() ); + } + } else if (component instanceof JList) { + setPropertyValue(propertyKey, ((JList) component).getSelectedValue() + ""); //$NON-NLS-1$ + } else if (component instanceof JRadioButton) { + final JComponent[] jComponents = propertyToComponent.get(propertyKey); + for (final JComponent jComponent : jComponents) { + if (((JRadioButton) jComponent).isSelected()) { + setPropertyValue(propertyKey, ((JRadioButton) jComponent).getName()); + } + } + } else if (component instanceof JFilePicker) { + setPropertyValue(propertyKey, ((JFilePicker) component).getSelectedFilePath()); + } + } + } } - private static class LinkMouseListener extends MouseAdapter { - String url; - - - public LinkMouseListener(String url) { - super(); - this.url = url; + public void restartEarth() { + localPropertiesService.nullifyChecksumValues(); + + try { + // Re-generate KMZ + new Thread("Restarting Collect Earth after changing properties/loading project/loading KML points"){ + @Override + public void run() { + EarthApp.restart(); + } + }.start(); + + SwingUtilities.invokeLater( ()->{ + JOptionPane.showMessageDialog( callingDialog, Messages.getString("OptionWizard.20"), //$NON-NLS-1$ + Messages.getString("OptionWizard.21"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ + if( callingDialog!= null && callingDialog instanceof PropertiesDialog){ + callingDialog.dispose(); + } + }); + + } catch (final Exception e) { + logger.error("Error when re-generating the KML code to open in GE ", e); //$NON-NLS-1$ + JOptionPane.showMessageDialog(callingDialog, e.getMessage(), Messages.getString("OptionWizard.23"), //$NON-NLS-1$ + JOptionPane.WARNING_MESSAGE); } + } + private void startWaiting() { + if( callingDialog != null ){ + callingDialog.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); + } + } - @Override - public void mouseClicked(java.awt.event.MouseEvent evt) { - JLabel l = (JLabel) evt.getSource(); - try { - URI uri = new java.net.URI(url); //$NON-NLS-1$ - (new LinkRunner(uri)).execute(); - } catch (URISyntaxException use) { - throw new AssertionError(use + ": " + l.getText()); //NOI18N //$NON-NLS-1$ - } - } + private void endWaiting() { + if( callingDialog != null ){ + callingDialog.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); + } } - } From bea4c0bb550cff58abaafab129f1514482a1356e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:23 +0100 Subject: [PATCH 0219/1620] New translations ApplyOptionChangesListener.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 222 ++++++++++-------- 1 file changed, 118 insertions(+), 104 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 1550d687ee..a4628939fc 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,128 +1,142 @@ package org.openforis.collect.earth.app.view; -import java.awt.Desktop; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseListener; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.Properties; - -import javax.swing.Box; -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JPanel; - -import org.openforis.collect.earth.app.service.UpdateIniUtils; +import java.awt.Window; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.HashMap; +import java.util.Set; + +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JList; +import javax.swing.JOptionPane; +import javax.swing.JPasswordField; +import javax.swing.JRadioButton; +import javax.swing.SwingUtilities; +import javax.swing.text.JTextComponent; + +import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class AboutDialog extends JDialog { - - private static final long serialVersionUID = 3108968706818898461L; - private transient Logger logger = LoggerFactory.getLogger( AboutDialog.class ); - - public AboutDialog(JFrame parent, String title) { - super(parent, title, true); - - UpdateIniUtils updateIniUtils = new UpdateIniUtils(); - String buildDate = updateIniUtils.convertToDate(getBuild()); - - Box b = Box.createVerticalBox(); - b.setAlignmentX(CENTER_ALIGNMENT); - b.add(Box.createGlue()); - b.add(new JLabel("Collect Earth v. " + getVersion() + " ( built " + buildDate + ") ")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - b.add(new JLabel("By Open Foris Initiative / Part of the Food and Agriculture Organization of the UN")); //$NON-NLS-1$ - JLabel comp = new JLabel("" + Messages.getString("AboutDialog.5") + ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - JLabel comp2 = new JLabel("CHECK THE CHANGE LOG"); - if (isBrowsingSupported()) { - makeLinkable(comp, new LinkMouseListener( "http://www.openforis.org" )); - makeLinkable(comp2, new LinkMouseListener( "https://github.com/openforis/collect-earth/blob/master/collect-earth/CHANGELOG.md" )); - } - b.add(comp); - b.add(comp2); - b.add(Box.createGlue()); - getContentPane().add(b, "Center"); //$NON-NLS-1$ - - JPanel p2 = new JPanel(); - JButton ok = new JButton(Messages.getString("AboutDialog.8")); //$NON-NLS-1$ - p2.add(ok); - getContentPane().add(p2, "South"); //$NON-NLS-1$ - - ok.addActionListener( e -> setVisible(false) ); - - setSize(380, 150); +public abstract class ApplyOptionChangesListener implements ActionListener { + private LocalPropertiesService localPropertiesService; + private HashMap, JComponent[]> propertyToComponent; + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + protected Window callingDialog; + + + public ApplyOptionChangesListener(Window callingDialog, LocalPropertiesService localPropertiesService, HashMap, JComponent[]> propertyToComponent) { + this.callingDialog = callingDialog; + this.localPropertiesService = localPropertiesService; + this.propertyToComponent = propertyToComponent; + } - private String getBuild() { - String key = "version_id"; //$NON-NLS-1$ - return getValueFromUpdateIni(key); + public ApplyOptionChangesListener(Window callingDialog, LocalPropertiesService localPropertiesService) { + this.callingDialog = callingDialog; + this.localPropertiesService = localPropertiesService; } - public String getValueFromUpdateIni(String key) { - Properties properties = new Properties(); - String value = "unknwown"; //$NON-NLS-1$ - try (FileInputStream fis = new FileInputStream("update.ini")) { //$NON-NLS-1$ - properties.load(fis); - value = properties.getProperty(key); - } catch (FileNotFoundException e) { - logger.error("The update.,ini file could not be found", e); //$NON-NLS-1$ - } catch (IOException e) { - logger.error("Error opening the update.ini file", e); //$NON-NLS-1$ + @Override + public void actionPerformed(ActionEvent arg0) { + try { + startWaiting(); + applyProperties(); + } catch (final Exception e) { + logger.error("Error applying the new properties", e); //$NON-NLS-1$ + } finally { + endWaiting(); } - return value; } - private String getVersion() { - String key = "version"; //$NON-NLS-1$ - return getValueFromUpdateIni(key); - } + private void setPropertyValue( Enum enumKey, String value ){ - private static void makeLinkable(JLabel c, MouseListener ml) { - assert ml != null; + localPropertiesService.setValue((EarthProperty) enumKey, value); - c.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); - c.addMouseListener(ml); } - private static boolean isBrowsingSupported() { - if (!Desktop.isDesktopSupported()) { - return false; - } - boolean result = false; - Desktop desktop = java.awt.Desktop.getDesktop(); - if (desktop.isSupported(Desktop.Action.BROWSE)) { - result = true; - } - return result; - + protected abstract void applyProperties(); + + public void savePropertyValues() { + final Set> keySet = propertyToComponent.keySet(); + for (final Enum propertyKey : keySet) { + final JComponent component = propertyToComponent.get(propertyKey)[0]; + if( !component.isVisible() ) { + setPropertyValue(propertyKey, ""); + }else { + if (component instanceof JTextComponent) { + setPropertyValue(propertyKey, ((JTextComponent) component).getText()); + } else if (component instanceof JPasswordField) { + setPropertyValue(propertyKey, new String( ((JPasswordField) component).getPassword()) ); + }else if (component instanceof JCheckBox) { + setPropertyValue(propertyKey, ((JCheckBox) component).isSelected() + ""); //$NON-NLS-1$ + } else if (component instanceof JComboBox) { + if (((JComboBox) component).getItemAt(0) instanceof ComboBoxItem) { + setPropertyValue(propertyKey, + ((ComboBoxItem) ((JComboBox) component).getSelectedItem()).getNumberOfPoints() + ""); //$NON-NLS-1$ + } else if (((JComboBox) component).getItemAt(0) instanceof String) { + setPropertyValue(propertyKey, ((String) ((JComboBox) component).getSelectedItem() ) ); //$NON-NLS-1$ + } else if (((JComboBox) component).getItemAt(0) instanceof SAMPLE_SHAPE) { + setPropertyValue(propertyKey, ( (SAMPLE_SHAPE) ((JComboBox) component).getSelectedItem() ).name() ); + } + } else if (component instanceof JList) { + setPropertyValue(propertyKey, ((JList) component).getSelectedValue() + ""); //$NON-NLS-1$ + } else if (component instanceof JRadioButton) { + final JComponent[] jComponents = propertyToComponent.get(propertyKey); + for (final JComponent jComponent : jComponents) { + if (((JRadioButton) jComponent).isSelected()) { + setPropertyValue(propertyKey, ((JRadioButton) jComponent).getName()); + } + } + } else if (component instanceof JFilePicker) { + setPropertyValue(propertyKey, ((JFilePicker) component).getSelectedFilePath()); + } + } + } } - private static class LinkMouseListener extends MouseAdapter { - String url; - - - public LinkMouseListener(String url) { - super(); - this.url = url; + public void restartEarth() { + localPropertiesService.nullifyChecksumValues(); + + try { + // Re-generate KMZ + new Thread("Restarting Collect Earth after changing properties/loading project/loading KML points"){ + @Override + public void run() { + EarthApp.restart(); + } + }.start(); + + SwingUtilities.invokeLater( ()->{ + JOptionPane.showMessageDialog( callingDialog, Messages.getString("OptionWizard.20"), //$NON-NLS-1$ + Messages.getString("OptionWizard.21"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ + if( callingDialog!= null && callingDialog instanceof PropertiesDialog){ + callingDialog.dispose(); + } + }); + + } catch (final Exception e) { + logger.error("Error when re-generating the KML code to open in GE ", e); //$NON-NLS-1$ + JOptionPane.showMessageDialog(callingDialog, e.getMessage(), Messages.getString("OptionWizard.23"), //$NON-NLS-1$ + JOptionPane.WARNING_MESSAGE); } + } + private void startWaiting() { + if( callingDialog != null ){ + callingDialog.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); + } + } - @Override - public void mouseClicked(java.awt.event.MouseEvent evt) { - JLabel l = (JLabel) evt.getSource(); - try { - URI uri = new java.net.URI(url); //$NON-NLS-1$ - (new LinkRunner(uri)).execute(); - } catch (URISyntaxException use) { - throw new AssertionError(use + ": " + l.getText()); //NOI18N //$NON-NLS-1$ - } - } + private void endWaiting() { + if( callingDialog != null ){ + callingDialog.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); + } } - } From ad69c936ef4b8bcd0fd04e114c90075e2377396d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:24 +0100 Subject: [PATCH 0220/1620] New translations UpdateIniUtils.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 274 +++++++++++------- 1 file changed, 165 insertions(+), 109 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index a4628939fc..758b0b1b1a 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,142 +1,198 @@ -package org.openforis.collect.earth.app.view; - -import java.awt.Window; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.HashMap; -import java.util.Set; - -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JComponent; -import javax.swing.JList; -import javax.swing.JOptionPane; -import javax.swing.JPasswordField; -import javax.swing.JRadioButton; -import javax.swing.SwingUtilities; -import javax.swing.text.JTextComponent; - -import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.LocalPropertiesService; +package org.openforis.collect.earth.app.service; + +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.net.URL; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Properties; +import java.util.concurrent.TimeUnit; + +import javax.xml.parsers.DocumentBuilderFactory; + +import org.apache.commons.lang3.StringUtils; import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.w3c.dom.Document; -public abstract class ApplyOptionChangesListener implements ActionListener { - private LocalPropertiesService localPropertiesService; - private HashMap, JComponent[]> propertyToComponent; - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - protected Window callingDialog; +public class UpdateIniUtils { + private static final String VERSION_ID = "version_id"; + private static final String VERSION_NAME = "version"; + private static final Logger logger = LoggerFactory.getLogger(UpdateIniUtils.class); + private final SimpleDateFormat fromXml = new SimpleDateFormat("yyyyMMddHHmm"); + public static final String UPDATE_INI = "update.ini"; - public ApplyOptionChangesListener(Window callingDialog, LocalPropertiesService localPropertiesService, HashMap, JComponent[]> propertyToComponent) { - this.callingDialog = callingDialog; - this.localPropertiesService = localPropertiesService; - this.propertyToComponent = propertyToComponent; + /** + * Checks if there is a newer version of the Collect Earth updater available + * @return The new version build-number if there is a new version. Null if the version online is not newer than the one installed + */ + public String getVersionAvailableOnline(){ - } + String installedVersionBuild = getVersionInstalled(); + String urlXmlUpdaterOnline = getValueFromUpdateIni("url", UPDATE_INI); //$NON-NLS-1$ + String onlineVersionBuild = getVersionBuild(urlXmlUpdaterOnline); - public ApplyOptionChangesListener(Window callingDialog, LocalPropertiesService localPropertiesService) { - this.callingDialog = callingDialog; - this.localPropertiesService = localPropertiesService; - } - @Override - public void actionPerformed(ActionEvent arg0) { try { - startWaiting(); - applyProperties(); - } catch (final Exception e) { - logger.error("Error applying the new properties", e); //$NON-NLS-1$ - } finally { - endWaiting(); + long installedBuild = Long.parseLong(installedVersionBuild); + long onlineBuild = Long.parseLong(onlineVersionBuild); + + if( onlineBuild > installedBuild ){ + return onlineBuild+""; //$NON-NLS-1$ + } + + } catch (NumberFormatException e) { + logger.error("Error parsing the buildNumber ", e); //$NON-NLS-1$ } + + return null; } - private void setPropertyValue( Enum enumKey, String value ){ + public static String getVersionInstalled() { + return getValueFromUpdateIni(VERSION_ID, UPDATE_INI); //$NON-NLS-1$ + } - localPropertiesService.setValue((EarthProperty) enumKey, value); + public static String getReleaseNameInstalled() { + return getValueFromUpdateIni(VERSION_NAME, UPDATE_INI); //$NON-NLS-1$ + } + public boolean shouldWarnUser(LocalPropertiesService localPropertiesService){ + boolean warnUser = false; + + // newVersionAvailable will be null if the version installed is not older than the current version of the updater + String currentVersionOnline = getVersionAvailableOnline(); + + if( !StringUtils.isBlank( currentVersionOnline ) ){ + + // There is a new version. did the user chose "Not to be bother"with this update? + String lastIgnoredBuildNumber = localPropertiesService.getValue(EarthProperty.LAST_IGNORED_UPDATE); + + if( + ( isCurrentNewerThanIgnoredUpdate(lastIgnoredBuildNumber, currentVersionOnline) && isMajorUpdate()) + || + isInstalledOlderThanOneMonth(currentVersionOnline, getVersionInstalled() ) + ){ + warnUser = true; + } + + } + return warnUser; } - protected abstract void applyProperties(); - - public void savePropertyValues() { - final Set> keySet = propertyToComponent.keySet(); - for (final Enum propertyKey : keySet) { - final JComponent component = propertyToComponent.get(propertyKey)[0]; - if( !component.isVisible() ) { - setPropertyValue(propertyKey, ""); - }else { - if (component instanceof JTextComponent) { - setPropertyValue(propertyKey, ((JTextComponent) component).getText()); - } else if (component instanceof JPasswordField) { - setPropertyValue(propertyKey, new String( ((JPasswordField) component).getPassword()) ); - }else if (component instanceof JCheckBox) { - setPropertyValue(propertyKey, ((JCheckBox) component).isSelected() + ""); //$NON-NLS-1$ - } else if (component instanceof JComboBox) { - if (((JComboBox) component).getItemAt(0) instanceof ComboBoxItem) { - setPropertyValue(propertyKey, - ((ComboBoxItem) ((JComboBox) component).getSelectedItem()).getNumberOfPoints() + ""); //$NON-NLS-1$ - } else if (((JComboBox) component).getItemAt(0) instanceof String) { - setPropertyValue(propertyKey, ((String) ((JComboBox) component).getSelectedItem() ) ); //$NON-NLS-1$ - } else if (((JComboBox) component).getItemAt(0) instanceof SAMPLE_SHAPE) { - setPropertyValue(propertyKey, ( (SAMPLE_SHAPE) ((JComboBox) component).getSelectedItem() ).name() ); - } - } else if (component instanceof JList) { - setPropertyValue(propertyKey, ((JList) component).getSelectedValue() + ""); //$NON-NLS-1$ - } else if (component instanceof JRadioButton) { - final JComponent[] jComponents = propertyToComponent.get(propertyKey); - for (final JComponent jComponent : jComponents) { - if (((JRadioButton) jComponent).isSelected()) { - setPropertyValue(propertyKey, ((JRadioButton) jComponent).getName()); - } - } - } else if (component instanceof JFilePicker) { - setPropertyValue(propertyKey, ((JFilePicker) component).getSelectedFilePath()); - } + + /** + * Check if the current version of the updater is newer than the version of the updater that was last ignored + * @param lastIgnoredBuildNumber The version of the last ignored updater as a string with the format yyyyMMddHHmm + * @param buildNumberOnline The version of the current updater in the server in the format yyyyMMddHHmm + * @return True is the new version of the updater is newer than the one last ignored. False otherwise + */ + private boolean isCurrentNewerThanIgnoredUpdate(String lastIgnoredBuildNumber, String buildNumberOnline){ + + boolean isNewerThanIgnored = true; + + try { + if( !StringUtils.isEmpty(lastIgnoredBuildNumber) && !StringUtils.isEmpty(buildNumberOnline) ){ + Long ignoredBuildNumberUpdate =new Long(lastIgnoredBuildNumber); + Long buildOnline = new Long( buildNumberOnline ); + + isNewerThanIgnored = ignoredBuildNumberUpdate{ - JOptionPane.showMessageDialog( callingDialog, Messages.getString("OptionWizard.20"), //$NON-NLS-1$ - Messages.getString("OptionWizard.21"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ - if( callingDialog!= null && callingDialog instanceof PropertiesDialog){ - callingDialog.dispose(); - } - }); - - } catch (final Exception e) { - logger.error("Error when re-generating the KML code to open in GE ", e); //$NON-NLS-1$ - JOptionPane.showMessageDialog(callingDialog, e.getMessage(), Messages.getString("OptionWizard.23"), //$NON-NLS-1$ - JOptionPane.WARNING_MESSAGE); + d1 = fromXml.parse(installedVersion); + d2 = fromXml.parse(currentVersion); + long diff = d2.getTime() - d1.getTime();//as given + long daysDifferenceInstalledAndCurrent = TimeUnit.MILLISECONDS.toDays(diff); + isOlderThanOneMonth = (daysDifferenceInstalledAndCurrent > 30); + } catch (Exception e) { + logger.error( "Error calculating difference in dates bvetween installed and available versions", e ); } + + return isOlderThanOneMonth; } - private void startWaiting() { - if( callingDialog != null ){ - callingDialog.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); + + /** + * Checks if the update in the server is a "Major"update, meaning that every user should update Collect Earth + * @return True if the version on the server should be installed by all users + */ + public boolean isMajorUpdate() { + String urlXmlUpdaterOnline = getValueFromUpdateIni("url", UPDATE_INI); //$NON-NLS-1$ + String majorUpdateString = getXmlValueFromTag(urlXmlUpdaterOnline, VERSION_NAME); + return majorUpdateString.toLowerCase().contains("major"); + } + + private String getVersionBuild(String urlXmlUpdate) { + String tagname = "versionId"; //$NON-NLS-1$ + return getXmlValueFromTag(urlXmlUpdate, tagname); + } + + public String getXmlValueFromTag(String urlXmlUpdate, String tagname) { + + String onlineVersion = "0"; //$NON-NLS-1$ + try { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + //factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); // Compliant + //factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); // compliant + + factory.setNamespaceAware(true); + Document parse = factory.newDocumentBuilder().parse(new URL(urlXmlUpdate).openStream()); + + onlineVersion = parse.getElementsByTagName(tagname).item(0).getChildNodes().item(0).getNodeValue(); + + logger.info("CE Online Version available {}" , onlineVersion); + } catch (Exception e) { + logger.warn("Error while reading the remote XML where the updater version is defined", e); //$NON-NLS-1$ + } + + return onlineVersion; + } + + public static String getValueFromUpdateIni(String key, String pathToUpdateIni) { + Properties properties = new Properties(); + String value = "unknown"; //$NON-NLS-1$ + try (FileInputStream fis = new FileInputStream(pathToUpdateIni) ){ + properties.load( fis ); + value = properties.getProperty(key); + } catch (FileNotFoundException e) { + logger.error("The update.ini file could not be found", e); //$NON-NLS-1$ + } catch (IOException e) { + logger.error("Error opening the update.ini file", e); //$NON-NLS-1$ } + return value; } + public String convertToDate(String buildVersionNumber) { + SimpleDateFormat humanReadable = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = buildVersionNumber; + try { - private void endWaiting() { - if( callingDialog != null ){ - callingDialog.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); + reformattedStr = humanReadable.format(fromXml.parse(buildVersionNumber)); + } catch (java.text.ParseException e) { + logger.error("Error parsing the date from the XML updater" , e ); } + + return reformattedStr; } } From 536155498866dffcda956ef5f0093c9f617f270b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:25 +0100 Subject: [PATCH 0221/1620] New translations ApplyOptionChangesListener.java (English) --- .../earth/app/view/Messages_en.properties | 222 ++++++++++-------- 1 file changed, 118 insertions(+), 104 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 1550d687ee..a4628939fc 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,128 +1,142 @@ package org.openforis.collect.earth.app.view; -import java.awt.Desktop; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseListener; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.Properties; - -import javax.swing.Box; -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JPanel; - -import org.openforis.collect.earth.app.service.UpdateIniUtils; +import java.awt.Window; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.HashMap; +import java.util.Set; + +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JList; +import javax.swing.JOptionPane; +import javax.swing.JPasswordField; +import javax.swing.JRadioButton; +import javax.swing.SwingUtilities; +import javax.swing.text.JTextComponent; + +import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class AboutDialog extends JDialog { - - private static final long serialVersionUID = 3108968706818898461L; - private transient Logger logger = LoggerFactory.getLogger( AboutDialog.class ); - - public AboutDialog(JFrame parent, String title) { - super(parent, title, true); - - UpdateIniUtils updateIniUtils = new UpdateIniUtils(); - String buildDate = updateIniUtils.convertToDate(getBuild()); - - Box b = Box.createVerticalBox(); - b.setAlignmentX(CENTER_ALIGNMENT); - b.add(Box.createGlue()); - b.add(new JLabel("Collect Earth v. " + getVersion() + " ( built " + buildDate + ") ")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - b.add(new JLabel("By Open Foris Initiative / Part of the Food and Agriculture Organization of the UN")); //$NON-NLS-1$ - JLabel comp = new JLabel("" + Messages.getString("AboutDialog.5") + ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - JLabel comp2 = new JLabel("CHECK THE CHANGE LOG"); - if (isBrowsingSupported()) { - makeLinkable(comp, new LinkMouseListener( "http://www.openforis.org" )); - makeLinkable(comp2, new LinkMouseListener( "https://github.com/openforis/collect-earth/blob/master/collect-earth/CHANGELOG.md" )); - } - b.add(comp); - b.add(comp2); - b.add(Box.createGlue()); - getContentPane().add(b, "Center"); //$NON-NLS-1$ - - JPanel p2 = new JPanel(); - JButton ok = new JButton(Messages.getString("AboutDialog.8")); //$NON-NLS-1$ - p2.add(ok); - getContentPane().add(p2, "South"); //$NON-NLS-1$ - - ok.addActionListener( e -> setVisible(false) ); - - setSize(380, 150); +public abstract class ApplyOptionChangesListener implements ActionListener { + private LocalPropertiesService localPropertiesService; + private HashMap, JComponent[]> propertyToComponent; + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + protected Window callingDialog; + + + public ApplyOptionChangesListener(Window callingDialog, LocalPropertiesService localPropertiesService, HashMap, JComponent[]> propertyToComponent) { + this.callingDialog = callingDialog; + this.localPropertiesService = localPropertiesService; + this.propertyToComponent = propertyToComponent; + } - private String getBuild() { - String key = "version_id"; //$NON-NLS-1$ - return getValueFromUpdateIni(key); + public ApplyOptionChangesListener(Window callingDialog, LocalPropertiesService localPropertiesService) { + this.callingDialog = callingDialog; + this.localPropertiesService = localPropertiesService; } - public String getValueFromUpdateIni(String key) { - Properties properties = new Properties(); - String value = "unknwown"; //$NON-NLS-1$ - try (FileInputStream fis = new FileInputStream("update.ini")) { //$NON-NLS-1$ - properties.load(fis); - value = properties.getProperty(key); - } catch (FileNotFoundException e) { - logger.error("The update.,ini file could not be found", e); //$NON-NLS-1$ - } catch (IOException e) { - logger.error("Error opening the update.ini file", e); //$NON-NLS-1$ + @Override + public void actionPerformed(ActionEvent arg0) { + try { + startWaiting(); + applyProperties(); + } catch (final Exception e) { + logger.error("Error applying the new properties", e); //$NON-NLS-1$ + } finally { + endWaiting(); } - return value; } - private String getVersion() { - String key = "version"; //$NON-NLS-1$ - return getValueFromUpdateIni(key); - } + private void setPropertyValue( Enum enumKey, String value ){ - private static void makeLinkable(JLabel c, MouseListener ml) { - assert ml != null; + localPropertiesService.setValue((EarthProperty) enumKey, value); - c.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); - c.addMouseListener(ml); } - private static boolean isBrowsingSupported() { - if (!Desktop.isDesktopSupported()) { - return false; - } - boolean result = false; - Desktop desktop = java.awt.Desktop.getDesktop(); - if (desktop.isSupported(Desktop.Action.BROWSE)) { - result = true; - } - return result; - + protected abstract void applyProperties(); + + public void savePropertyValues() { + final Set> keySet = propertyToComponent.keySet(); + for (final Enum propertyKey : keySet) { + final JComponent component = propertyToComponent.get(propertyKey)[0]; + if( !component.isVisible() ) { + setPropertyValue(propertyKey, ""); + }else { + if (component instanceof JTextComponent) { + setPropertyValue(propertyKey, ((JTextComponent) component).getText()); + } else if (component instanceof JPasswordField) { + setPropertyValue(propertyKey, new String( ((JPasswordField) component).getPassword()) ); + }else if (component instanceof JCheckBox) { + setPropertyValue(propertyKey, ((JCheckBox) component).isSelected() + ""); //$NON-NLS-1$ + } else if (component instanceof JComboBox) { + if (((JComboBox) component).getItemAt(0) instanceof ComboBoxItem) { + setPropertyValue(propertyKey, + ((ComboBoxItem) ((JComboBox) component).getSelectedItem()).getNumberOfPoints() + ""); //$NON-NLS-1$ + } else if (((JComboBox) component).getItemAt(0) instanceof String) { + setPropertyValue(propertyKey, ((String) ((JComboBox) component).getSelectedItem() ) ); //$NON-NLS-1$ + } else if (((JComboBox) component).getItemAt(0) instanceof SAMPLE_SHAPE) { + setPropertyValue(propertyKey, ( (SAMPLE_SHAPE) ((JComboBox) component).getSelectedItem() ).name() ); + } + } else if (component instanceof JList) { + setPropertyValue(propertyKey, ((JList) component).getSelectedValue() + ""); //$NON-NLS-1$ + } else if (component instanceof JRadioButton) { + final JComponent[] jComponents = propertyToComponent.get(propertyKey); + for (final JComponent jComponent : jComponents) { + if (((JRadioButton) jComponent).isSelected()) { + setPropertyValue(propertyKey, ((JRadioButton) jComponent).getName()); + } + } + } else if (component instanceof JFilePicker) { + setPropertyValue(propertyKey, ((JFilePicker) component).getSelectedFilePath()); + } + } + } } - private static class LinkMouseListener extends MouseAdapter { - String url; - - - public LinkMouseListener(String url) { - super(); - this.url = url; + public void restartEarth() { + localPropertiesService.nullifyChecksumValues(); + + try { + // Re-generate KMZ + new Thread("Restarting Collect Earth after changing properties/loading project/loading KML points"){ + @Override + public void run() { + EarthApp.restart(); + } + }.start(); + + SwingUtilities.invokeLater( ()->{ + JOptionPane.showMessageDialog( callingDialog, Messages.getString("OptionWizard.20"), //$NON-NLS-1$ + Messages.getString("OptionWizard.21"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ + if( callingDialog!= null && callingDialog instanceof PropertiesDialog){ + callingDialog.dispose(); + } + }); + + } catch (final Exception e) { + logger.error("Error when re-generating the KML code to open in GE ", e); //$NON-NLS-1$ + JOptionPane.showMessageDialog(callingDialog, e.getMessage(), Messages.getString("OptionWizard.23"), //$NON-NLS-1$ + JOptionPane.WARNING_MESSAGE); } + } + private void startWaiting() { + if( callingDialog != null ){ + callingDialog.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); + } + } - @Override - public void mouseClicked(java.awt.event.MouseEvent evt) { - JLabel l = (JLabel) evt.getSource(); - try { - URI uri = new java.net.URI(url); //$NON-NLS-1$ - (new LinkRunner(uri)).execute(); - } catch (URISyntaxException use) { - throw new AssertionError(use + ": " + l.getText()); //NOI18N //$NON-NLS-1$ - } - } + private void endWaiting() { + if( callingDialog != null ){ + callingDialog.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); + } } - } From 0730736c049b5818acb7669dcf0f2ac048074748 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:26 +0100 Subject: [PATCH 0222/1620] New translations CheckForUpdatesListener.java (French) --- .../earth/app/view/Messages_fr.properties | 164 ++++++------------ 1 file changed, 49 insertions(+), 115 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index a4628939fc..24b488682f 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,142 +1,76 @@ package org.openforis.collect.earth.app.view; -import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.util.HashMap; -import java.util.Set; - -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JComponent; -import javax.swing.JList; -import javax.swing.JOptionPane; -import javax.swing.JPasswordField; -import javax.swing.JRadioButton; -import javax.swing.SwingUtilities; -import javax.swing.text.JTextComponent; - -import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import java.io.File; +import java.io.IOException; + +import org.apache.commons.lang3.SystemUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.service.ProcessLoggerThread; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public abstract class ApplyOptionChangesListener implements ActionListener { - private LocalPropertiesService localPropertiesService; - private HashMap, JComponent[]> propertyToComponent; - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - protected Window callingDialog; - - - public ApplyOptionChangesListener(Window callingDialog, LocalPropertiesService localPropertiesService, HashMap, JComponent[]> propertyToComponent) { - this.callingDialog = callingDialog; - this.localPropertiesService = localPropertiesService; - this.propertyToComponent = propertyToComponent; - - } - - public ApplyOptionChangesListener(Window callingDialog, LocalPropertiesService localPropertiesService) { - this.callingDialog = callingDialog; - this.localPropertiesService = localPropertiesService; - } +public class CheckForUpdatesListener implements ActionListener { + Logger logger = LoggerFactory.getLogger( CheckForUpdatesListener.class ); @Override - public void actionPerformed(ActionEvent arg0) { + public void actionPerformed(ActionEvent e) { + // Start the auto_updater try { - startWaiting(); - applyProperties(); - } catch (final Exception e) { - logger.error("Error applying the new properties", e); //$NON-NLS-1$ - } finally { - endWaiting(); - } - } + String autoUpdateExecutable = getAutoUpdateExecutable(); - private void setPropertyValue( Enum enumKey, String value ){ + File autoupdateFile = new File( autoUpdateExecutable); - localPropertiesService.setValue((EarthProperty) enumKey, value); - - } + if( !autoupdateFile.exists() ){ + autoupdateFile = new File( "autoupdate/"+autoUpdateExecutable); //$NON-NLS-1$ + } - protected abstract void applyProperties(); - - public void savePropertyValues() { - final Set> keySet = propertyToComponent.keySet(); - for (final Enum propertyKey : keySet) { - final JComponent component = propertyToComponent.get(propertyKey)[0]; - if( !component.isVisible() ) { - setPropertyValue(propertyKey, ""); - }else { - if (component instanceof JTextComponent) { - setPropertyValue(propertyKey, ((JTextComponent) component).getText()); - } else if (component instanceof JPasswordField) { - setPropertyValue(propertyKey, new String( ((JPasswordField) component).getPassword()) ); - }else if (component instanceof JCheckBox) { - setPropertyValue(propertyKey, ((JCheckBox) component).isSelected() + ""); //$NON-NLS-1$ - } else if (component instanceof JComboBox) { - if (((JComboBox) component).getItemAt(0) instanceof ComboBoxItem) { - setPropertyValue(propertyKey, - ((ComboBoxItem) ((JComboBox) component).getSelectedItem()).getNumberOfPoints() + ""); //$NON-NLS-1$ - } else if (((JComboBox) component).getItemAt(0) instanceof String) { - setPropertyValue(propertyKey, ((String) ((JComboBox) component).getSelectedItem() ) ); //$NON-NLS-1$ - } else if (((JComboBox) component).getItemAt(0) instanceof SAMPLE_SHAPE) { - setPropertyValue(propertyKey, ( (SAMPLE_SHAPE) ((JComboBox) component).getSelectedItem() ).name() ); - } - } else if (component instanceof JList) { - setPropertyValue(propertyKey, ((JList) component).getSelectedValue() + ""); //$NON-NLS-1$ - } else if (component instanceof JRadioButton) { - final JComponent[] jComponents = propertyToComponent.get(propertyKey); - for (final JComponent jComponent : jComponents) { - if (((JRadioButton) jComponent).isSelected()) { - setPropertyValue(propertyKey, ((JRadioButton) jComponent).getName()); - } - } - } else if (component instanceof JFilePicker) { - setPropertyValue(propertyKey, ((JFilePicker) component).getSelectedFilePath()); - } + if( !autoupdateFile.exists() ){ + logger.error("No "+ autoUpdateExecutable + " found "); //$NON-NLS-1$ //$NON-NLS-2$ + return; } - } - } + if( SystemUtils.IS_OS_LINUX ){ + try { + final ProcessBuilder builder = new ProcessBuilder(new String[] { autoupdateFile.getAbsolutePath() }); - public void restartEarth() { - localPropertiesService.nullifyChecksumValues(); + builder.redirectErrorStream(true); + Process p = builder.start(); - try { - // Re-generate KMZ - new Thread("Restarting Collect Earth after changing properties/loading project/loading KML points"){ - @Override - public void run() { - EarthApp.restart(); - } - }.start(); + (new ProcessLoggerThread(p.getInputStream(), Boolean.FALSE)).start(); + (new ProcessLoggerThread(p.getErrorStream(), Boolean.TRUE)).start(); - SwingUtilities.invokeLater( ()->{ - JOptionPane.showMessageDialog( callingDialog, Messages.getString("OptionWizard.20"), //$NON-NLS-1$ - Messages.getString("OptionWizard.21"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ - if( callingDialog!= null && callingDialog instanceof PropertiesDialog){ - callingDialog.dispose(); + } catch (final IOException e2) { + logger.error("Error when starting the Autoupdate executable", e2); //$NON-NLS-1$ } - }); + }else{ - } catch (final Exception e) { - logger.error("Error when re-generating the KML code to open in GE ", e); //$NON-NLS-1$ - JOptionPane.showMessageDialog(callingDialog, e.getMessage(), Messages.getString("OptionWizard.23"), //$NON-NLS-1$ - JOptionPane.WARNING_MESSAGE); + CollectEarthUtils.openFile( autoupdateFile ); + } + } catch (Exception e1) { + logger.error("Error when opening the Autoupdate executable", e1); //$NON-NLS-1$ } } - private void startWaiting() { - if( callingDialog != null ){ - callingDialog.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); - } - } + private String getAutoUpdateExecutable() { + String autoUpdateExecutable = "autoupdate" ; //$NON-NLS-1$ + try { - private void endWaiting() { - if( callingDialog != null ){ - callingDialog.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); + if (SystemUtils.IS_OS_WINDOWS){ + autoUpdateExecutable += ".exe"; //$NON-NLS-1$ + }else if (SystemUtils.IS_OS_MAC){ + autoUpdateExecutable += ".app"; //$NON-NLS-1$ + }else if ( SystemUtils.IS_OS_UNIX && System.getProperty("sun.arch.data.model").equals("64")){ + autoUpdateExecutable += "-x64.run"; //$NON-NLS-1$ + }else if ( SystemUtils.IS_OS_UNIX ) { + autoUpdateExecutable += ".run"; //$NON-NLS-1$ + } + + } catch (Exception e) { + logger.error("Error in Autoupdate executable", e); //$NON-NLS-1$ } + return autoUpdateExecutable; } + } From 3ab096fd1b6d57f69fd9f294cbf26e9916775582 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:27 +0100 Subject: [PATCH 0223/1620] New translations CheckForUpdatesListener.java (Spanish) --- .../earth/app/view/Messages_es.properties | 162 ++++++------------ 1 file changed, 55 insertions(+), 107 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 1550d687ee..24b488682f 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,128 +1,76 @@ package org.openforis.collect.earth.app.view; -import java.awt.Desktop; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseListener; -import java.io.FileInputStream; -import java.io.FileNotFoundException; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.Properties; - -import javax.swing.Box; -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JPanel; - -import org.openforis.collect.earth.app.service.UpdateIniUtils; + +import org.apache.commons.lang3.SystemUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.service.ProcessLoggerThread; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class AboutDialog extends JDialog { - - private static final long serialVersionUID = 3108968706818898461L; - private transient Logger logger = LoggerFactory.getLogger( AboutDialog.class ); - - public AboutDialog(JFrame parent, String title) { - super(parent, title, true); - - UpdateIniUtils updateIniUtils = new UpdateIniUtils(); - String buildDate = updateIniUtils.convertToDate(getBuild()); - - Box b = Box.createVerticalBox(); - b.setAlignmentX(CENTER_ALIGNMENT); - b.add(Box.createGlue()); - b.add(new JLabel("Collect Earth v. " + getVersion() + " ( built " + buildDate + ") ")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - b.add(new JLabel("By Open Foris Initiative / Part of the Food and Agriculture Organization of the UN")); //$NON-NLS-1$ - JLabel comp = new JLabel("" + Messages.getString("AboutDialog.5") + ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - JLabel comp2 = new JLabel("CHECK THE CHANGE LOG"); - if (isBrowsingSupported()) { - makeLinkable(comp, new LinkMouseListener( "http://www.openforis.org" )); - makeLinkable(comp2, new LinkMouseListener( "https://github.com/openforis/collect-earth/blob/master/collect-earth/CHANGELOG.md" )); - } - b.add(comp); - b.add(comp2); - b.add(Box.createGlue()); - getContentPane().add(b, "Center"); //$NON-NLS-1$ - - JPanel p2 = new JPanel(); - JButton ok = new JButton(Messages.getString("AboutDialog.8")); //$NON-NLS-1$ - p2.add(ok); - getContentPane().add(p2, "South"); //$NON-NLS-1$ - - ok.addActionListener( e -> setVisible(false) ); - - setSize(380, 150); - } +public class CheckForUpdatesListener implements ActionListener { - private String getBuild() { - String key = "version_id"; //$NON-NLS-1$ - return getValueFromUpdateIni(key); - } + Logger logger = LoggerFactory.getLogger( CheckForUpdatesListener.class ); + @Override + public void actionPerformed(ActionEvent e) { + // Start the auto_updater + try { + String autoUpdateExecutable = getAutoUpdateExecutable(); - public String getValueFromUpdateIni(String key) { - Properties properties = new Properties(); - String value = "unknwown"; //$NON-NLS-1$ - try (FileInputStream fis = new FileInputStream("update.ini")) { //$NON-NLS-1$ - properties.load(fis); - value = properties.getProperty(key); - } catch (FileNotFoundException e) { - logger.error("The update.,ini file could not be found", e); //$NON-NLS-1$ - } catch (IOException e) { - logger.error("Error opening the update.ini file", e); //$NON-NLS-1$ - } - return value; - } + File autoupdateFile = new File( autoUpdateExecutable); - private String getVersion() { - String key = "version"; //$NON-NLS-1$ - return getValueFromUpdateIni(key); - } + if( !autoupdateFile.exists() ){ + autoupdateFile = new File( "autoupdate/"+autoUpdateExecutable); //$NON-NLS-1$ + } - private static void makeLinkable(JLabel c, MouseListener ml) { - assert ml != null; + if( !autoupdateFile.exists() ){ + logger.error("No "+ autoUpdateExecutable + " found "); //$NON-NLS-1$ //$NON-NLS-2$ + return; + } + if( SystemUtils.IS_OS_LINUX ){ + try { + final ProcessBuilder builder = new ProcessBuilder(new String[] { autoupdateFile.getAbsolutePath() }); - c.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); - c.addMouseListener(ml); - } + builder.redirectErrorStream(true); + Process p = builder.start(); - private static boolean isBrowsingSupported() { - if (!Desktop.isDesktopSupported()) { - return false; - } - boolean result = false; - Desktop desktop = java.awt.Desktop.getDesktop(); - if (desktop.isSupported(Desktop.Action.BROWSE)) { - result = true; - } - return result; - - } - - private static class LinkMouseListener extends MouseAdapter { - String url; + (new ProcessLoggerThread(p.getInputStream(), Boolean.FALSE)).start(); + (new ProcessLoggerThread(p.getErrorStream(), Boolean.TRUE)).start(); + } catch (final IOException e2) { + logger.error("Error when starting the Autoupdate executable", e2); //$NON-NLS-1$ + } + }else{ - public LinkMouseListener(String url) { - super(); - this.url = url; + CollectEarthUtils.openFile( autoupdateFile ); + } + } catch (Exception e1) { + logger.error("Error when opening the Autoupdate executable", e1); //$NON-NLS-1$ } + } + + private String getAutoUpdateExecutable() { + String autoUpdateExecutable = "autoupdate" ; //$NON-NLS-1$ + try { - @Override - public void mouseClicked(java.awt.event.MouseEvent evt) { - JLabel l = (JLabel) evt.getSource(); - try { + if (SystemUtils.IS_OS_WINDOWS){ + autoUpdateExecutable += ".exe"; //$NON-NLS-1$ + }else if (SystemUtils.IS_OS_MAC){ + autoUpdateExecutable += ".app"; //$NON-NLS-1$ + }else if ( SystemUtils.IS_OS_UNIX && System.getProperty("sun.arch.data.model").equals("64")){ + autoUpdateExecutable += "-x64.run"; //$NON-NLS-1$ + }else if ( SystemUtils.IS_OS_UNIX ) { + autoUpdateExecutable += ".run"; //$NON-NLS-1$ + } - URI uri = new java.net.URI(url); //$NON-NLS-1$ - (new LinkRunner(uri)).execute(); - } catch (URISyntaxException use) { - throw new AssertionError(use + ": " + l.getText()); //NOI18N //$NON-NLS-1$ - } - } + } catch (Exception e) { + logger.error("Error in Autoupdate executable", e); //$NON-NLS-1$ + } + return autoUpdateExecutable; } } From 263de04208b6fed3fb161187c67a138756db67eb Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:28 +0100 Subject: [PATCH 0224/1620] New translations CheckForUpdatesListener.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 216 ++++-------------- 1 file changed, 47 insertions(+), 169 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 758b0b1b1a..24b488682f 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,198 +1,76 @@ -package org.openforis.collect.earth.app.service; +package org.openforis.collect.earth.app.view; -import java.io.FileInputStream; -import java.io.FileNotFoundException; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; import java.io.IOException; -import java.net.URL; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Properties; -import java.util.concurrent.TimeUnit; -import javax.xml.parsers.DocumentBuilderFactory; - -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.apache.commons.lang3.SystemUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.service.ProcessLoggerThread; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.w3c.dom.Document; - -public class UpdateIniUtils { - - private static final String VERSION_ID = "version_id"; - private static final String VERSION_NAME = "version"; - private static final Logger logger = LoggerFactory.getLogger(UpdateIniUtils.class); - private final SimpleDateFormat fromXml = new SimpleDateFormat("yyyyMMddHHmm"); - public static final String UPDATE_INI = "update.ini"; - - /** - * Checks if there is a newer version of the Collect Earth updater available - * @return The new version build-number if there is a new version. Null if the version online is not newer than the one installed - */ - public String getVersionAvailableOnline(){ - - String installedVersionBuild = getVersionInstalled(); - String urlXmlUpdaterOnline = getValueFromUpdateIni("url", UPDATE_INI); //$NON-NLS-1$ - String onlineVersionBuild = getVersionBuild(urlXmlUpdaterOnline); +public class CheckForUpdatesListener implements ActionListener { + Logger logger = LoggerFactory.getLogger( CheckForUpdatesListener.class ); + @Override + public void actionPerformed(ActionEvent e) { + // Start the auto_updater try { - long installedBuild = Long.parseLong(installedVersionBuild); - long onlineBuild = Long.parseLong(onlineVersionBuild); - - if( onlineBuild > installedBuild ){ - return onlineBuild+""; //$NON-NLS-1$ - } - - } catch (NumberFormatException e) { - logger.error("Error parsing the buildNumber ", e); //$NON-NLS-1$ - } - - return null; - } - - public static String getVersionInstalled() { - return getValueFromUpdateIni(VERSION_ID, UPDATE_INI); //$NON-NLS-1$ - } - - public static String getReleaseNameInstalled() { - return getValueFromUpdateIni(VERSION_NAME, UPDATE_INI); //$NON-NLS-1$ - } - - public boolean shouldWarnUser(LocalPropertiesService localPropertiesService){ - boolean warnUser = false; - - // newVersionAvailable will be null if the version installed is not older than the current version of the updater - String currentVersionOnline = getVersionAvailableOnline(); - - if( !StringUtils.isBlank( currentVersionOnline ) ){ + String autoUpdateExecutable = getAutoUpdateExecutable(); - // There is a new version. did the user chose "Not to be bother"with this update? - String lastIgnoredBuildNumber = localPropertiesService.getValue(EarthProperty.LAST_IGNORED_UPDATE); + File autoupdateFile = new File( autoUpdateExecutable); - if( - ( isCurrentNewerThanIgnoredUpdate(lastIgnoredBuildNumber, currentVersionOnline) && isMajorUpdate()) - || - isInstalledOlderThanOneMonth(currentVersionOnline, getVersionInstalled() ) - ){ - warnUser = true; + if( !autoupdateFile.exists() ){ + autoupdateFile = new File( "autoupdate/"+autoUpdateExecutable); //$NON-NLS-1$ } - } - return warnUser; - } - - - /** - * Check if the current version of the updater is newer than the version of the updater that was last ignored - * @param lastIgnoredBuildNumber The version of the last ignored updater as a string with the format yyyyMMddHHmm - * @param buildNumberOnline The version of the current updater in the server in the format yyyyMMddHHmm - * @return True is the new version of the updater is newer than the one last ignored. False otherwise - */ - private boolean isCurrentNewerThanIgnoredUpdate(String lastIgnoredBuildNumber, String buildNumberOnline){ - - boolean isNewerThanIgnored = true; - - try { - if( !StringUtils.isEmpty(lastIgnoredBuildNumber) && !StringUtils.isEmpty(buildNumberOnline) ){ - Long ignoredBuildNumberUpdate =new Long(lastIgnoredBuildNumber); - Long buildOnline = new Long( buildNumberOnline ); - - isNewerThanIgnored = ignoredBuildNumberUpdate 30); - } catch (Exception e) { - logger.error( "Error calculating difference in dates bvetween installed and available versions", e ); + CollectEarthUtils.openFile( autoupdateFile ); + } + } catch (Exception e1) { + logger.error("Error when opening the Autoupdate executable", e1); //$NON-NLS-1$ } - - return isOlderThanOneMonth; - } - - - /** - * Checks if the update in the server is a "Major"update, meaning that every user should update Collect Earth - * @return True if the version on the server should be installed by all users - */ - public boolean isMajorUpdate() { - String urlXmlUpdaterOnline = getValueFromUpdateIni("url", UPDATE_INI); //$NON-NLS-1$ - String majorUpdateString = getXmlValueFromTag(urlXmlUpdaterOnline, VERSION_NAME); - return majorUpdateString.toLowerCase().contains("major"); - } - - private String getVersionBuild(String urlXmlUpdate) { - String tagname = "versionId"; //$NON-NLS-1$ - return getXmlValueFromTag(urlXmlUpdate, tagname); } - public String getXmlValueFromTag(String urlXmlUpdate, String tagname) { - - String onlineVersion = "0"; //$NON-NLS-1$ + private String getAutoUpdateExecutable() { + String autoUpdateExecutable = "autoupdate" ; //$NON-NLS-1$ try { - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - //factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); // Compliant - //factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); // compliant - factory.setNamespaceAware(true); - Document parse = factory.newDocumentBuilder().parse(new URL(urlXmlUpdate).openStream()); - onlineVersion = parse.getElementsByTagName(tagname).item(0).getChildNodes().item(0).getNodeValue(); + if (SystemUtils.IS_OS_WINDOWS){ + autoUpdateExecutable += ".exe"; //$NON-NLS-1$ + }else if (SystemUtils.IS_OS_MAC){ + autoUpdateExecutable += ".app"; //$NON-NLS-1$ + }else if ( SystemUtils.IS_OS_UNIX && System.getProperty("sun.arch.data.model").equals("64")){ + autoUpdateExecutable += "-x64.run"; //$NON-NLS-1$ + }else if ( SystemUtils.IS_OS_UNIX ) { + autoUpdateExecutable += ".run"; //$NON-NLS-1$ + } - logger.info("CE Online Version available {}" , onlineVersion); } catch (Exception e) { - logger.warn("Error while reading the remote XML where the updater version is defined", e); //$NON-NLS-1$ - } - - return onlineVersion; - } - - public static String getValueFromUpdateIni(String key, String pathToUpdateIni) { - Properties properties = new Properties(); - String value = "unknown"; //$NON-NLS-1$ - try (FileInputStream fis = new FileInputStream(pathToUpdateIni) ){ - properties.load( fis ); - value = properties.getProperty(key); - } catch (FileNotFoundException e) { - logger.error("The update.ini file could not be found", e); //$NON-NLS-1$ - } catch (IOException e) { - logger.error("Error opening the update.ini file", e); //$NON-NLS-1$ + logger.error("Error in Autoupdate executable", e); //$NON-NLS-1$ } - return value; + return autoUpdateExecutable; } - public String convertToDate(String buildVersionNumber) { - SimpleDateFormat humanReadable = new SimpleDateFormat("yyyy-MM-dd"); - String reformattedStr = buildVersionNumber; - try { - - reformattedStr = humanReadable.format(fromXml.parse(buildVersionNumber)); - } catch (java.text.ParseException e) { - logger.error("Error parsing the date from the XML updater" , e ); - } - - return reformattedStr; - } } From 870ed3f8b5f49727bdeafd849270f66c02e317f1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:29 +0100 Subject: [PATCH 0225/1620] New translations CheckForUpdatesListener.java (English) --- .../earth/app/view/Messages_en.properties | 164 ++++++------------ 1 file changed, 49 insertions(+), 115 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index a4628939fc..24b488682f 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,142 +1,76 @@ package org.openforis.collect.earth.app.view; -import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.util.HashMap; -import java.util.Set; - -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JComponent; -import javax.swing.JList; -import javax.swing.JOptionPane; -import javax.swing.JPasswordField; -import javax.swing.JRadioButton; -import javax.swing.SwingUtilities; -import javax.swing.text.JTextComponent; - -import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import java.io.File; +import java.io.IOException; + +import org.apache.commons.lang3.SystemUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.service.ProcessLoggerThread; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public abstract class ApplyOptionChangesListener implements ActionListener { - private LocalPropertiesService localPropertiesService; - private HashMap, JComponent[]> propertyToComponent; - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - protected Window callingDialog; - - - public ApplyOptionChangesListener(Window callingDialog, LocalPropertiesService localPropertiesService, HashMap, JComponent[]> propertyToComponent) { - this.callingDialog = callingDialog; - this.localPropertiesService = localPropertiesService; - this.propertyToComponent = propertyToComponent; - - } - - public ApplyOptionChangesListener(Window callingDialog, LocalPropertiesService localPropertiesService) { - this.callingDialog = callingDialog; - this.localPropertiesService = localPropertiesService; - } +public class CheckForUpdatesListener implements ActionListener { + Logger logger = LoggerFactory.getLogger( CheckForUpdatesListener.class ); @Override - public void actionPerformed(ActionEvent arg0) { + public void actionPerformed(ActionEvent e) { + // Start the auto_updater try { - startWaiting(); - applyProperties(); - } catch (final Exception e) { - logger.error("Error applying the new properties", e); //$NON-NLS-1$ - } finally { - endWaiting(); - } - } + String autoUpdateExecutable = getAutoUpdateExecutable(); - private void setPropertyValue( Enum enumKey, String value ){ + File autoupdateFile = new File( autoUpdateExecutable); - localPropertiesService.setValue((EarthProperty) enumKey, value); - - } + if( !autoupdateFile.exists() ){ + autoupdateFile = new File( "autoupdate/"+autoUpdateExecutable); //$NON-NLS-1$ + } - protected abstract void applyProperties(); - - public void savePropertyValues() { - final Set> keySet = propertyToComponent.keySet(); - for (final Enum propertyKey : keySet) { - final JComponent component = propertyToComponent.get(propertyKey)[0]; - if( !component.isVisible() ) { - setPropertyValue(propertyKey, ""); - }else { - if (component instanceof JTextComponent) { - setPropertyValue(propertyKey, ((JTextComponent) component).getText()); - } else if (component instanceof JPasswordField) { - setPropertyValue(propertyKey, new String( ((JPasswordField) component).getPassword()) ); - }else if (component instanceof JCheckBox) { - setPropertyValue(propertyKey, ((JCheckBox) component).isSelected() + ""); //$NON-NLS-1$ - } else if (component instanceof JComboBox) { - if (((JComboBox) component).getItemAt(0) instanceof ComboBoxItem) { - setPropertyValue(propertyKey, - ((ComboBoxItem) ((JComboBox) component).getSelectedItem()).getNumberOfPoints() + ""); //$NON-NLS-1$ - } else if (((JComboBox) component).getItemAt(0) instanceof String) { - setPropertyValue(propertyKey, ((String) ((JComboBox) component).getSelectedItem() ) ); //$NON-NLS-1$ - } else if (((JComboBox) component).getItemAt(0) instanceof SAMPLE_SHAPE) { - setPropertyValue(propertyKey, ( (SAMPLE_SHAPE) ((JComboBox) component).getSelectedItem() ).name() ); - } - } else if (component instanceof JList) { - setPropertyValue(propertyKey, ((JList) component).getSelectedValue() + ""); //$NON-NLS-1$ - } else if (component instanceof JRadioButton) { - final JComponent[] jComponents = propertyToComponent.get(propertyKey); - for (final JComponent jComponent : jComponents) { - if (((JRadioButton) jComponent).isSelected()) { - setPropertyValue(propertyKey, ((JRadioButton) jComponent).getName()); - } - } - } else if (component instanceof JFilePicker) { - setPropertyValue(propertyKey, ((JFilePicker) component).getSelectedFilePath()); - } + if( !autoupdateFile.exists() ){ + logger.error("No "+ autoUpdateExecutable + " found "); //$NON-NLS-1$ //$NON-NLS-2$ + return; } - } - } + if( SystemUtils.IS_OS_LINUX ){ + try { + final ProcessBuilder builder = new ProcessBuilder(new String[] { autoupdateFile.getAbsolutePath() }); - public void restartEarth() { - localPropertiesService.nullifyChecksumValues(); + builder.redirectErrorStream(true); + Process p = builder.start(); - try { - // Re-generate KMZ - new Thread("Restarting Collect Earth after changing properties/loading project/loading KML points"){ - @Override - public void run() { - EarthApp.restart(); - } - }.start(); + (new ProcessLoggerThread(p.getInputStream(), Boolean.FALSE)).start(); + (new ProcessLoggerThread(p.getErrorStream(), Boolean.TRUE)).start(); - SwingUtilities.invokeLater( ()->{ - JOptionPane.showMessageDialog( callingDialog, Messages.getString("OptionWizard.20"), //$NON-NLS-1$ - Messages.getString("OptionWizard.21"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ - if( callingDialog!= null && callingDialog instanceof PropertiesDialog){ - callingDialog.dispose(); + } catch (final IOException e2) { + logger.error("Error when starting the Autoupdate executable", e2); //$NON-NLS-1$ } - }); + }else{ - } catch (final Exception e) { - logger.error("Error when re-generating the KML code to open in GE ", e); //$NON-NLS-1$ - JOptionPane.showMessageDialog(callingDialog, e.getMessage(), Messages.getString("OptionWizard.23"), //$NON-NLS-1$ - JOptionPane.WARNING_MESSAGE); + CollectEarthUtils.openFile( autoupdateFile ); + } + } catch (Exception e1) { + logger.error("Error when opening the Autoupdate executable", e1); //$NON-NLS-1$ } } - private void startWaiting() { - if( callingDialog != null ){ - callingDialog.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); - } - } + private String getAutoUpdateExecutable() { + String autoUpdateExecutable = "autoupdate" ; //$NON-NLS-1$ + try { - private void endWaiting() { - if( callingDialog != null ){ - callingDialog.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); + if (SystemUtils.IS_OS_WINDOWS){ + autoUpdateExecutable += ".exe"; //$NON-NLS-1$ + }else if (SystemUtils.IS_OS_MAC){ + autoUpdateExecutable += ".app"; //$NON-NLS-1$ + }else if ( SystemUtils.IS_OS_UNIX && System.getProperty("sun.arch.data.model").equals("64")){ + autoUpdateExecutable += "-x64.run"; //$NON-NLS-1$ + }else if ( SystemUtils.IS_OS_UNIX ) { + autoUpdateExecutable += ".run"; //$NON-NLS-1$ + } + + } catch (Exception e) { + logger.error("Error in Autoupdate executable", e); //$NON-NLS-1$ } + return autoUpdateExecutable; } + } From ad559315b3f49e9b54721170399888a7affa9b91 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:30 +0100 Subject: [PATCH 0226/1620] New translations CollectEarthMenu.java (French) --- .../earth/app/view/Messages_fr.properties | 470 ++++++++++++++++-- 1 file changed, 427 insertions(+), 43 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 24b488682f..4c34fd0a7f 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,76 +1,460 @@ package org.openforis.collect.earth.app.view; -import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.ButtonGroup; +import javax.swing.JCheckBoxMenuItem; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JRadioButtonMenuItem; +import javax.swing.SwingUtilities; import org.apache.commons.lang3.SystemUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.LoggerContext; +import org.apache.logging.log4j.core.config.Configuration; import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.service.ProcessLoggerThread; -import org.slf4j.Logger; +import org.openforis.collect.earth.app.EarthConstants.UI_LANGUAGE; +import org.openforis.collect.earth.app.logging.JSwingAppender; +import org.openforis.collect.earth.app.service.AnalysisSaikuService; +import org.openforis.collect.earth.app.service.BackupSqlLiteService; +import org.openforis.collect.earth.app.service.DataImportExportService; +import org.openforis.collect.earth.app.service.EarthProjectsService; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.FolderFinder; +import org.openforis.collect.earth.app.service.IPCCGeneratorService; +import org.openforis.collect.earth.app.service.KmlImportService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.MissingPlotService; +import org.openforis.collect.earth.app.view.ExportActionListener.RecordsToExport; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class CollectEarthMenu extends JMenuBar implements InitializingBean { + + @Autowired + private transient DataImportExportService dataImportExportService; + + @Autowired + private transient KmlImportService kmlImportService; + + @Autowired + private transient MissingPlotService missingPlotService; + + @Autowired + private transient AnalysisSaikuService analysisSaikuService; + + @Autowired + private transient IPCCGeneratorService ipccGeneratorService; + + @Autowired + private transient LocalPropertiesService localPropertiesService; + + @Autowired + private transient CollectEarthWindow collectEarthWindow; + + @Autowired + private transient EarthSurveyService earthSurveyService; + + @Autowired + private transient EarthProjectsService earthProjectsService; + + @Autowired + private transient BackupSqlLiteService backupSqlLiteService; + + @Autowired + private transient RemovePlotsFromDBDlg removePlotsFromDBDlg; + + @Autowired + private transient EarthProjectsService projectsService; + + private static final long serialVersionUID = -2457052260968029351L; + private final List serverMenuItems = new ArrayList<>(); + private JFrame frame; + private final transient org.slf4j.Logger logger = LoggerFactory.getLogger(CollectEarthMenu.class); -public class CheckForUpdatesListener implements ActionListener { + public CollectEarthMenu() { + // Where the GUI is created: + super(); + } + + protected void init() { + setFrame(collectEarthWindow.getFrame()); + + // Build file menu in the menu bar. + this.add( getFileMenu() ); + + // Build tools menu in the menu bar. + this.add(getToolsMenu()); + + // Build help menu in the menu bar. + this.add(getHelpMenu()); + } + + @Override + public void afterPropertiesSet() throws Exception { + init(); + } - Logger logger = LoggerFactory.getLogger( CheckForUpdatesListener.class ); @Override - public void actionPerformed(ActionEvent e) { - // Start the auto_updater - try { - String autoUpdateExecutable = getAutoUpdateExecutable(); + public JMenu getHelpMenu() { + JMenu menuHelp = new JMenu(Messages.getString("CollectEarthWindow.16")); //$NON-NLS-1$ + JMenuItem menuItem; + File surveyGuide = earthSurveyService.getSurveyGuide(); + if( surveyGuide != null ) { + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.70")); //$NON-NLS-1$ + menuItem.addActionListener( (e) -> CollectEarthUtils.openFile( surveyGuide) ); + menuHelp.add(menuItem); + menuHelp.addSeparator(); + } + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.56")); //$NON-NLS-1$ + menuItem.addActionListener(new OpenAboutDialogListener(frame, Messages.getString("CollectEarthWindow.62"))); //$NON-NLS-1$ + menuHelp.add(menuItem); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.17")); //$NON-NLS-1$ + menuItem.addActionListener( + new OpenTextFileListener(frame, getDisclaimerFilePath(), Messages.getString("CollectEarthWindow.4")));//$NON-NLS-1$ + menuHelp.add(menuItem); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.50")); //$NON-NLS-1$ + menuItem.addActionListener( (e) -> CollectEarthUtils.openFile( new File("UserManual.pdf"))); + menuHelp.add(menuItem); + - File autoupdateFile = new File( autoUpdateExecutable); + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.64")); //$NON-NLS-1$ + menuItem.addActionListener(new OpenSupportForum()); + menuHelp.add(menuItem); + + menuHelp.addSeparator(); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.52")); //$NON-NLS-1$ + menuItem.addActionListener( + new OpenTextFileListener(frame, getLogFilePath(), Messages.getString("CollectEarthWindow.53"))); //$NON-NLS-1$ + menuHelp.add(menuItem); + + JCheckBoxMenuItem checkboxErrors = new JCheckBoxMenuItem("Show exception errors", localPropertiesService.isExceptionShown() ); //$NON-NLS-1$ + checkboxErrors.addActionListener( e -> { + // This sets/unsets the property that is checked when an exception is catch by the JSwingAppender log4j2 appender + + Boolean showException = checkboxErrors.isSelected(); + localPropertiesService.setExceptionShown( showException ); + + final LoggerContext ctx = (LoggerContext) LogManager.getContext(false); + final Configuration config = ctx.getConfiguration(); + + JSwingAppender jSwingAppender = config.getAppender("jswing-log"); + + jSwingAppender.setExceptionShown( showException ); + } + + ); + menuHelp.add(checkboxErrors); + + + menuHelp.addSeparator(); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.51")); //$NON-NLS-1$ + menuItem.addActionListener(new CheckForUpdatesListener()); + menuHelp.add(menuItem); + return menuHelp; + } + + private JMenu getToolsMenu() { + JMenu toolsMenu = new JMenu(Messages.getString("CollectEarthWindow.12")); //$NON-NLS-1$ + + addImportExportMenu(toolsMenu); + + JMenuItem menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.14")); //$NON-NLS-1$ + menuItem.addActionListener(getSaikuAnalysisActionListener()); + toolsMenu.add(menuItem); + + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.71")); //$NON-NLS-1$ + menuItem.addActionListener(getSaikuToolExportActionListener()); + menuItem.setEnabled(SystemUtils.IS_OS_WINDOWS ); // This option is only available in Windows!! + toolsMenu.add(menuItem); + +/* + toolsMenu.addSeparator(); + menuItem = new JMenuItem("Generate IPCC GHGi software LULUCF package"); //$NON-NLS-1$ + menuItem.addActionListener(getIPCCExportActionListener()); + toolsMenu.add(menuItem); + + + toolsMenu.addSeparator(); +*/ + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.54")); //$NON-NLS-1$ + menuItem.addActionListener(new ApplyOptionChangesListener(this.getFrame(), localPropertiesService) { + + @Override + protected void applyProperties() { + + try { + if (kmlImportService.prompToOpenKml(getFrame())) { + restartEarth(); + } + } catch (Exception e1) { + JOptionPane.showMessageDialog(getFrame(), e1.getMessage(), + Messages.getString("CollectEarthWindow.63"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + logger.error("Error importing KML file", e1); //$NON-NLS-1$ + } - if( !autoupdateFile.exists() ){ - autoupdateFile = new File( "autoupdate/"+autoUpdateExecutable); //$NON-NLS-1$ } - if( !autoupdateFile.exists() ){ - logger.error("No "+ autoUpdateExecutable + " found "); //$NON-NLS-1$ //$NON-NLS-2$ - return; + }); + serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is + // acting as a client ) + toolsMenu.add(menuItem); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.67")); //$NON-NLS-1$ + menuItem.addActionListener( e-> { + try { + CollectEarthUtils.openFolderInExplorer(FolderFinder.getCollectEarthDataFolder()); + } catch (IOException e1) { + logger.error("Could not find the data folder", e1); } - if( SystemUtils.IS_OS_LINUX ){ - try { - final ProcessBuilder builder = new ProcessBuilder(new String[] { autoupdateFile.getAbsolutePath() }); + }); + serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is + // acting as a client ) + toolsMenu.add(menuItem); - builder.redirectErrorStream(true); - Process p = builder.start(); + toolsMenu.addSeparator(); - (new ProcessLoggerThread(p.getInputStream(), Boolean.FALSE)).start(); - (new ProcessLoggerThread(p.getErrorStream(), Boolean.TRUE)).start(); + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.15")); //$NON-NLS-1$ + menuItem.addActionListener(getPropertiesAction(frame)); + toolsMenu.add(menuItem); + toolsMenu.add(getUtilitiesMenu() ); - } catch (final IOException e2) { - logger.error("Error when starting the Autoupdate executable", e2); //$NON-NLS-1$ - } - }else{ + toolsMenu.addSeparator(); + toolsMenu.add(getLanguageMenu()); + return toolsMenu; + } - CollectEarthUtils.openFile( autoupdateFile ); + private JMenu getUtilitiesMenu() { + JMenuItem menuItem; + JMenu utilities = new JMenu(Messages.getString("CollectEarthMenu.2")); //$NON-NLS-1$ + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.18")); //$NON-NLS-1$ + menuItem.addActionListener(new MissingPlotsListener(frame, localPropertiesService, missingPlotService)); + serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is + // acting as a client ) + + utilities.add(menuItem); + + menuItem = new JMenuItem(Messages.getString("CollectEarthMenu.3")); //$NON-NLS-1$ + menuItem.addActionListener( e -> FileDividerToolDlg.open(frame, earthSurveyService.getCollectSurvey()) ); + serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is // acting as a client ) + utilities.add(menuItem); + + menuItem = new JMenuItem("Delete Plots from DB using CSV"); + menuItem.addActionListener( e -> removePlotsFromDBDlg.open(frame, earthSurveyService.getCollectSurvey()) ); + utilities.add(menuItem); + + + utilities.add(menuItem); + return utilities; + } + + private JMenu getFileMenu() { + JMenu fileMenu = new JMenu(Messages.getString("CollectEarthWindow.10")); //$NON-NLS-1$ + + JMenuItem menuItem = new JMenuItem(Messages.getString("CollectEarthMenu.0")); //$NON-NLS-1$ + menuItem.addActionListener(new ApplyOptionChangesListener(this.getFrame(), localPropertiesService) { + + @Override + protected void applyProperties() { + final File[] selectedProjectFile = JFileChooserExistsAware.getFileChooserResults( + DataFormat.PROJECT_DEFINITION_FILE, false, false, null, localPropertiesService, + getFrame() ); + + if (selectedProjectFile != null && selectedProjectFile.length == 1) { + try { + projectsService.loadCompressedProjectFile(selectedProjectFile[0]); + + restartEarth(); + } catch (Exception e1) { + JOptionPane.showMessageDialog( getFrame(), e1.getMessage(), + Messages.getString("OptionWizard.51"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + logger.error("Error importing project file " + selectedProjectFile[0].getAbsolutePath(), e1); //$NON-NLS-1$ + } + } } - } catch (Exception e1) { - logger.error("Error when opening the Autoupdate executable", e1); //$NON-NLS-1$ + }); + fileMenu.add(menuItem); + this.add(fileMenu); + fileMenu.addSeparator(); + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.11")); //$NON-NLS-1$ + menuItem.addActionListener(collectEarthWindow.getCloseActionListener()); + fileMenu.add(menuItem); + return fileMenu; + } + + private void addImportExportMenu(JMenu menu) { + + final JMenu ieSubmenu = new JMenu(Messages.getString("CollectEarthWindow.44")); //$NON-NLS-1$ + JMenuItem menuItem; + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.13")); //$NON-NLS-1$ + menuItem.addActionListener(getExportActionListener(DataFormat.CSV, RecordsToExport.ALL)); + ieSubmenu.add(menuItem); + + final JMenu xmlExportSubmenu = new JMenu(Messages.getString("CollectEarthWindow.24")); //$NON-NLS-1$ + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.45")); //$NON-NLS-1$ + menuItem.addActionListener(getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.ALL)); + xmlExportSubmenu.add(menuItem); + + final JMenuItem exportModifiedRecords = new JMenuItem(Messages.getString("CollectEarthWindow.61")); //$NON-NLS-1$ + exportModifiedRecords.addActionListener( + getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.MODIFIED_SINCE_LAST_EXPORT)); + xmlExportSubmenu.add(exportModifiedRecords); + + final JMenuItem exportDataRangeRecords = new JMenuItem(Messages.getString("CollectEarthMenu.4")); //$NON-NLS-1$ + exportDataRangeRecords + .addActionListener(getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.PICK_FROM_DATE)); + xmlExportSubmenu.add(exportDataRangeRecords); + + ieSubmenu.add(xmlExportSubmenu); + + final JMenu backupExportSubmenu = new JMenu(Messages.getString("CollectEarthMenu.5")); //$NON-NLS-1$ + + final JMenuItem exportDataBackup = new JMenuItem(Messages.getString("CollectEarthMenu.6")); //$NON-NLS-1$ + exportDataBackup.addActionListener(getExportActionListener(DataFormat.COLLECT_BACKUP, RecordsToExport.ALL)); + backupExportSubmenu.add(exportDataBackup); + + final JMenuItem exportDataRangeBackup = new JMenuItem(Messages.getString("CollectEarthMenu.7")); //$NON-NLS-1$ + exportDataRangeBackup + .addActionListener(getExportActionListener(DataFormat.COLLECT_BACKUP, RecordsToExport.PICK_FROM_DATE)); + backupExportSubmenu.add(exportDataRangeBackup); + + ieSubmenu.add(backupExportSubmenu); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.6")); //$NON-NLS-1$ + menuItem.addActionListener(getExportActionListener(DataFormat.FUSION, RecordsToExport.ALL)); + ieSubmenu.add(menuItem); + + ieSubmenu.addSeparator(); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.46")); //$NON-NLS-1$ + menuItem.addActionListener(getImportActionListener(DataFormat.ZIP_WITH_XML)); + ieSubmenu.add(menuItem); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.55")); //$NON-NLS-1$ + menuItem.addActionListener(getImportActionListener(DataFormat.CSV)); + ieSubmenu.add(menuItem); + + menu.add(ieSubmenu); + + serverMenuItems.add(ieSubmenu); // This menu should only be shown if the DB is local ( not if Collect Earth is + // acting as a client ) + } + + private String getDisclaimerFilePath() { + final String suffixLang = localPropertiesService.getUiLanguage().getLocale().getLanguage(); + if (new File("resources/disclaimer_" + suffixLang + ".txt").exists()) { //$NON-NLS-1$ //$NON-NLS-2$ + return "resources/disclaimer_" + suffixLang + ".txt"; + } else { + return "resources/disclaimer_en.txt"; } } - private String getAutoUpdateExecutable() { - String autoUpdateExecutable = "autoupdate" ; //$NON-NLS-1$ - try { + private ActionListener getExportActionListener(final DataFormat exportFormat, final RecordsToExport xmlExportType) { + return new ExportActionListener(exportFormat, xmlExportType, getFrame(), localPropertiesService, + dataImportExportService, earthSurveyService); + } + + private ActionListener getImportActionListener(final DataFormat importFormat) { + return new ImportActionListener(importFormat, getFrame(), localPropertiesService, dataImportExportService); + } + + private JMenu getLanguageMenu() { + + final ActionListener actionLanguage = e -> { + try { + final String langName = ((JRadioButtonMenuItem) e.getSource()).getName(); + final UI_LANGUAGE language = UI_LANGUAGE.valueOf(langName); + CollectEarthUtils.setFontDependingOnLanguaue(language); + localPropertiesService.setUiLanguage(language); + + SwingUtilities.invokeLater( () -> { + getFrame().getContentPane().removeAll(); + getFrame().dispose(); + collectEarthWindow.openWindow(); + }); + + } catch (final Exception ex) { + logger.error("Error while changing language", ex); //$NON-NLS-1$ + } + }; + + final JMenu menuLanguage = new JMenu(Messages.getString("CollectEarthWindow.2")); //$NON-NLS-1$ + final ButtonGroup group = new ButtonGroup(); + final UI_LANGUAGE[] languages = UI_LANGUAGE.values(); - if (SystemUtils.IS_OS_WINDOWS){ - autoUpdateExecutable += ".exe"; //$NON-NLS-1$ - }else if (SystemUtils.IS_OS_MAC){ - autoUpdateExecutable += ".app"; //$NON-NLS-1$ - }else if ( SystemUtils.IS_OS_UNIX && System.getProperty("sun.arch.data.model").equals("64")){ - autoUpdateExecutable += "-x64.run"; //$NON-NLS-1$ - }else if ( SystemUtils.IS_OS_UNIX ) { - autoUpdateExecutable += ".run"; //$NON-NLS-1$ + for (final UI_LANGUAGE language : languages) { + final JRadioButtonMenuItem langItem = new JRadioButtonMenuItem(language.getLabel()); + langItem.setName(language.name()); + langItem.addActionListener(actionLanguage); + menuLanguage.add(langItem); + group.add(menuLanguage); + if (localPropertiesService.getUiLanguage().equals(language)) { + langItem.setSelected(true); } - } catch (Exception e) { - logger.error("Error in Autoupdate executable", e); //$NON-NLS-1$ } - return autoUpdateExecutable; + + return menuLanguage; + } + + public ActionListener getPropertiesAction(final JFrame owner) { + return e -> { + final JDialog dialog = new PropertiesDialog(owner, localPropertiesService, earthProjectsService, + backupSqlLiteService.getAutomaticBackUpFolder().getPath(), analysisSaikuService, + earthSurveyService.getCollectSurvey()); + dialog.setVisible(true); + dialog.pack(); + }; + } + + private ActionListener getSaikuAnalysisActionListener() { + return new GenerateRDBAnalysisListener(getFrame(), new GenerateDatabaseStarter(analysisSaikuService, getFrame() ) ); + } + + private ActionListener getSaikuToolExportActionListener() { + return new SaikuToolExportListener(getFrame(), new GenerateDatabaseStarter(analysisSaikuService, getFrame() ), localPropertiesService); + } + + + private ActionListener getIPCCExportActionListener() { + return new IPCCGeneratorListener(getFrame(), new GenerateDatabaseStarter(ipccGeneratorService, getFrame() ) ); + } + + private String getLogFilePath() { + return FolderFinder.getCollectEarthDataFolder() + "/earth_error.log"; //$NON-NLS-1$ + } + + public JFrame getFrame() { + return frame; } + public void setFrame(JFrame frame) { + this.frame = frame; + } + + public List getServerMenuItems() { + return serverMenuItems; + } } From a4b261024f2a4b8c9e4ac0eccf426d8f04735159 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:32 +0100 Subject: [PATCH 0227/1620] New translations CollectEarthMenu.java (Spanish) --- .../earth/app/view/Messages_es.properties | 470 ++++++++++++++++-- 1 file changed, 427 insertions(+), 43 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 24b488682f..4c34fd0a7f 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,76 +1,460 @@ package org.openforis.collect.earth.app.view; -import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.ButtonGroup; +import javax.swing.JCheckBoxMenuItem; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JRadioButtonMenuItem; +import javax.swing.SwingUtilities; import org.apache.commons.lang3.SystemUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.LoggerContext; +import org.apache.logging.log4j.core.config.Configuration; import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.service.ProcessLoggerThread; -import org.slf4j.Logger; +import org.openforis.collect.earth.app.EarthConstants.UI_LANGUAGE; +import org.openforis.collect.earth.app.logging.JSwingAppender; +import org.openforis.collect.earth.app.service.AnalysisSaikuService; +import org.openforis.collect.earth.app.service.BackupSqlLiteService; +import org.openforis.collect.earth.app.service.DataImportExportService; +import org.openforis.collect.earth.app.service.EarthProjectsService; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.FolderFinder; +import org.openforis.collect.earth.app.service.IPCCGeneratorService; +import org.openforis.collect.earth.app.service.KmlImportService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.MissingPlotService; +import org.openforis.collect.earth.app.view.ExportActionListener.RecordsToExport; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class CollectEarthMenu extends JMenuBar implements InitializingBean { + + @Autowired + private transient DataImportExportService dataImportExportService; + + @Autowired + private transient KmlImportService kmlImportService; + + @Autowired + private transient MissingPlotService missingPlotService; + + @Autowired + private transient AnalysisSaikuService analysisSaikuService; + + @Autowired + private transient IPCCGeneratorService ipccGeneratorService; + + @Autowired + private transient LocalPropertiesService localPropertiesService; + + @Autowired + private transient CollectEarthWindow collectEarthWindow; + + @Autowired + private transient EarthSurveyService earthSurveyService; + + @Autowired + private transient EarthProjectsService earthProjectsService; + + @Autowired + private transient BackupSqlLiteService backupSqlLiteService; + + @Autowired + private transient RemovePlotsFromDBDlg removePlotsFromDBDlg; + + @Autowired + private transient EarthProjectsService projectsService; + + private static final long serialVersionUID = -2457052260968029351L; + private final List serverMenuItems = new ArrayList<>(); + private JFrame frame; + private final transient org.slf4j.Logger logger = LoggerFactory.getLogger(CollectEarthMenu.class); -public class CheckForUpdatesListener implements ActionListener { + public CollectEarthMenu() { + // Where the GUI is created: + super(); + } + + protected void init() { + setFrame(collectEarthWindow.getFrame()); + + // Build file menu in the menu bar. + this.add( getFileMenu() ); + + // Build tools menu in the menu bar. + this.add(getToolsMenu()); + + // Build help menu in the menu bar. + this.add(getHelpMenu()); + } + + @Override + public void afterPropertiesSet() throws Exception { + init(); + } - Logger logger = LoggerFactory.getLogger( CheckForUpdatesListener.class ); @Override - public void actionPerformed(ActionEvent e) { - // Start the auto_updater - try { - String autoUpdateExecutable = getAutoUpdateExecutable(); + public JMenu getHelpMenu() { + JMenu menuHelp = new JMenu(Messages.getString("CollectEarthWindow.16")); //$NON-NLS-1$ + JMenuItem menuItem; + File surveyGuide = earthSurveyService.getSurveyGuide(); + if( surveyGuide != null ) { + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.70")); //$NON-NLS-1$ + menuItem.addActionListener( (e) -> CollectEarthUtils.openFile( surveyGuide) ); + menuHelp.add(menuItem); + menuHelp.addSeparator(); + } + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.56")); //$NON-NLS-1$ + menuItem.addActionListener(new OpenAboutDialogListener(frame, Messages.getString("CollectEarthWindow.62"))); //$NON-NLS-1$ + menuHelp.add(menuItem); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.17")); //$NON-NLS-1$ + menuItem.addActionListener( + new OpenTextFileListener(frame, getDisclaimerFilePath(), Messages.getString("CollectEarthWindow.4")));//$NON-NLS-1$ + menuHelp.add(menuItem); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.50")); //$NON-NLS-1$ + menuItem.addActionListener( (e) -> CollectEarthUtils.openFile( new File("UserManual.pdf"))); + menuHelp.add(menuItem); + - File autoupdateFile = new File( autoUpdateExecutable); + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.64")); //$NON-NLS-1$ + menuItem.addActionListener(new OpenSupportForum()); + menuHelp.add(menuItem); + + menuHelp.addSeparator(); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.52")); //$NON-NLS-1$ + menuItem.addActionListener( + new OpenTextFileListener(frame, getLogFilePath(), Messages.getString("CollectEarthWindow.53"))); //$NON-NLS-1$ + menuHelp.add(menuItem); + + JCheckBoxMenuItem checkboxErrors = new JCheckBoxMenuItem("Show exception errors", localPropertiesService.isExceptionShown() ); //$NON-NLS-1$ + checkboxErrors.addActionListener( e -> { + // This sets/unsets the property that is checked when an exception is catch by the JSwingAppender log4j2 appender + + Boolean showException = checkboxErrors.isSelected(); + localPropertiesService.setExceptionShown( showException ); + + final LoggerContext ctx = (LoggerContext) LogManager.getContext(false); + final Configuration config = ctx.getConfiguration(); + + JSwingAppender jSwingAppender = config.getAppender("jswing-log"); + + jSwingAppender.setExceptionShown( showException ); + } + + ); + menuHelp.add(checkboxErrors); + + + menuHelp.addSeparator(); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.51")); //$NON-NLS-1$ + menuItem.addActionListener(new CheckForUpdatesListener()); + menuHelp.add(menuItem); + return menuHelp; + } + + private JMenu getToolsMenu() { + JMenu toolsMenu = new JMenu(Messages.getString("CollectEarthWindow.12")); //$NON-NLS-1$ + + addImportExportMenu(toolsMenu); + + JMenuItem menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.14")); //$NON-NLS-1$ + menuItem.addActionListener(getSaikuAnalysisActionListener()); + toolsMenu.add(menuItem); + + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.71")); //$NON-NLS-1$ + menuItem.addActionListener(getSaikuToolExportActionListener()); + menuItem.setEnabled(SystemUtils.IS_OS_WINDOWS ); // This option is only available in Windows!! + toolsMenu.add(menuItem); + +/* + toolsMenu.addSeparator(); + menuItem = new JMenuItem("Generate IPCC GHGi software LULUCF package"); //$NON-NLS-1$ + menuItem.addActionListener(getIPCCExportActionListener()); + toolsMenu.add(menuItem); + + + toolsMenu.addSeparator(); +*/ + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.54")); //$NON-NLS-1$ + menuItem.addActionListener(new ApplyOptionChangesListener(this.getFrame(), localPropertiesService) { + + @Override + protected void applyProperties() { + + try { + if (kmlImportService.prompToOpenKml(getFrame())) { + restartEarth(); + } + } catch (Exception e1) { + JOptionPane.showMessageDialog(getFrame(), e1.getMessage(), + Messages.getString("CollectEarthWindow.63"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + logger.error("Error importing KML file", e1); //$NON-NLS-1$ + } - if( !autoupdateFile.exists() ){ - autoupdateFile = new File( "autoupdate/"+autoUpdateExecutable); //$NON-NLS-1$ } - if( !autoupdateFile.exists() ){ - logger.error("No "+ autoUpdateExecutable + " found "); //$NON-NLS-1$ //$NON-NLS-2$ - return; + }); + serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is + // acting as a client ) + toolsMenu.add(menuItem); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.67")); //$NON-NLS-1$ + menuItem.addActionListener( e-> { + try { + CollectEarthUtils.openFolderInExplorer(FolderFinder.getCollectEarthDataFolder()); + } catch (IOException e1) { + logger.error("Could not find the data folder", e1); } - if( SystemUtils.IS_OS_LINUX ){ - try { - final ProcessBuilder builder = new ProcessBuilder(new String[] { autoupdateFile.getAbsolutePath() }); + }); + serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is + // acting as a client ) + toolsMenu.add(menuItem); - builder.redirectErrorStream(true); - Process p = builder.start(); + toolsMenu.addSeparator(); - (new ProcessLoggerThread(p.getInputStream(), Boolean.FALSE)).start(); - (new ProcessLoggerThread(p.getErrorStream(), Boolean.TRUE)).start(); + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.15")); //$NON-NLS-1$ + menuItem.addActionListener(getPropertiesAction(frame)); + toolsMenu.add(menuItem); + toolsMenu.add(getUtilitiesMenu() ); - } catch (final IOException e2) { - logger.error("Error when starting the Autoupdate executable", e2); //$NON-NLS-1$ - } - }else{ + toolsMenu.addSeparator(); + toolsMenu.add(getLanguageMenu()); + return toolsMenu; + } - CollectEarthUtils.openFile( autoupdateFile ); + private JMenu getUtilitiesMenu() { + JMenuItem menuItem; + JMenu utilities = new JMenu(Messages.getString("CollectEarthMenu.2")); //$NON-NLS-1$ + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.18")); //$NON-NLS-1$ + menuItem.addActionListener(new MissingPlotsListener(frame, localPropertiesService, missingPlotService)); + serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is + // acting as a client ) + + utilities.add(menuItem); + + menuItem = new JMenuItem(Messages.getString("CollectEarthMenu.3")); //$NON-NLS-1$ + menuItem.addActionListener( e -> FileDividerToolDlg.open(frame, earthSurveyService.getCollectSurvey()) ); + serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is // acting as a client ) + utilities.add(menuItem); + + menuItem = new JMenuItem("Delete Plots from DB using CSV"); + menuItem.addActionListener( e -> removePlotsFromDBDlg.open(frame, earthSurveyService.getCollectSurvey()) ); + utilities.add(menuItem); + + + utilities.add(menuItem); + return utilities; + } + + private JMenu getFileMenu() { + JMenu fileMenu = new JMenu(Messages.getString("CollectEarthWindow.10")); //$NON-NLS-1$ + + JMenuItem menuItem = new JMenuItem(Messages.getString("CollectEarthMenu.0")); //$NON-NLS-1$ + menuItem.addActionListener(new ApplyOptionChangesListener(this.getFrame(), localPropertiesService) { + + @Override + protected void applyProperties() { + final File[] selectedProjectFile = JFileChooserExistsAware.getFileChooserResults( + DataFormat.PROJECT_DEFINITION_FILE, false, false, null, localPropertiesService, + getFrame() ); + + if (selectedProjectFile != null && selectedProjectFile.length == 1) { + try { + projectsService.loadCompressedProjectFile(selectedProjectFile[0]); + + restartEarth(); + } catch (Exception e1) { + JOptionPane.showMessageDialog( getFrame(), e1.getMessage(), + Messages.getString("OptionWizard.51"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + logger.error("Error importing project file " + selectedProjectFile[0].getAbsolutePath(), e1); //$NON-NLS-1$ + } + } } - } catch (Exception e1) { - logger.error("Error when opening the Autoupdate executable", e1); //$NON-NLS-1$ + }); + fileMenu.add(menuItem); + this.add(fileMenu); + fileMenu.addSeparator(); + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.11")); //$NON-NLS-1$ + menuItem.addActionListener(collectEarthWindow.getCloseActionListener()); + fileMenu.add(menuItem); + return fileMenu; + } + + private void addImportExportMenu(JMenu menu) { + + final JMenu ieSubmenu = new JMenu(Messages.getString("CollectEarthWindow.44")); //$NON-NLS-1$ + JMenuItem menuItem; + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.13")); //$NON-NLS-1$ + menuItem.addActionListener(getExportActionListener(DataFormat.CSV, RecordsToExport.ALL)); + ieSubmenu.add(menuItem); + + final JMenu xmlExportSubmenu = new JMenu(Messages.getString("CollectEarthWindow.24")); //$NON-NLS-1$ + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.45")); //$NON-NLS-1$ + menuItem.addActionListener(getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.ALL)); + xmlExportSubmenu.add(menuItem); + + final JMenuItem exportModifiedRecords = new JMenuItem(Messages.getString("CollectEarthWindow.61")); //$NON-NLS-1$ + exportModifiedRecords.addActionListener( + getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.MODIFIED_SINCE_LAST_EXPORT)); + xmlExportSubmenu.add(exportModifiedRecords); + + final JMenuItem exportDataRangeRecords = new JMenuItem(Messages.getString("CollectEarthMenu.4")); //$NON-NLS-1$ + exportDataRangeRecords + .addActionListener(getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.PICK_FROM_DATE)); + xmlExportSubmenu.add(exportDataRangeRecords); + + ieSubmenu.add(xmlExportSubmenu); + + final JMenu backupExportSubmenu = new JMenu(Messages.getString("CollectEarthMenu.5")); //$NON-NLS-1$ + + final JMenuItem exportDataBackup = new JMenuItem(Messages.getString("CollectEarthMenu.6")); //$NON-NLS-1$ + exportDataBackup.addActionListener(getExportActionListener(DataFormat.COLLECT_BACKUP, RecordsToExport.ALL)); + backupExportSubmenu.add(exportDataBackup); + + final JMenuItem exportDataRangeBackup = new JMenuItem(Messages.getString("CollectEarthMenu.7")); //$NON-NLS-1$ + exportDataRangeBackup + .addActionListener(getExportActionListener(DataFormat.COLLECT_BACKUP, RecordsToExport.PICK_FROM_DATE)); + backupExportSubmenu.add(exportDataRangeBackup); + + ieSubmenu.add(backupExportSubmenu); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.6")); //$NON-NLS-1$ + menuItem.addActionListener(getExportActionListener(DataFormat.FUSION, RecordsToExport.ALL)); + ieSubmenu.add(menuItem); + + ieSubmenu.addSeparator(); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.46")); //$NON-NLS-1$ + menuItem.addActionListener(getImportActionListener(DataFormat.ZIP_WITH_XML)); + ieSubmenu.add(menuItem); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.55")); //$NON-NLS-1$ + menuItem.addActionListener(getImportActionListener(DataFormat.CSV)); + ieSubmenu.add(menuItem); + + menu.add(ieSubmenu); + + serverMenuItems.add(ieSubmenu); // This menu should only be shown if the DB is local ( not if Collect Earth is + // acting as a client ) + } + + private String getDisclaimerFilePath() { + final String suffixLang = localPropertiesService.getUiLanguage().getLocale().getLanguage(); + if (new File("resources/disclaimer_" + suffixLang + ".txt").exists()) { //$NON-NLS-1$ //$NON-NLS-2$ + return "resources/disclaimer_" + suffixLang + ".txt"; + } else { + return "resources/disclaimer_en.txt"; } } - private String getAutoUpdateExecutable() { - String autoUpdateExecutable = "autoupdate" ; //$NON-NLS-1$ - try { + private ActionListener getExportActionListener(final DataFormat exportFormat, final RecordsToExport xmlExportType) { + return new ExportActionListener(exportFormat, xmlExportType, getFrame(), localPropertiesService, + dataImportExportService, earthSurveyService); + } + + private ActionListener getImportActionListener(final DataFormat importFormat) { + return new ImportActionListener(importFormat, getFrame(), localPropertiesService, dataImportExportService); + } + + private JMenu getLanguageMenu() { + + final ActionListener actionLanguage = e -> { + try { + final String langName = ((JRadioButtonMenuItem) e.getSource()).getName(); + final UI_LANGUAGE language = UI_LANGUAGE.valueOf(langName); + CollectEarthUtils.setFontDependingOnLanguaue(language); + localPropertiesService.setUiLanguage(language); + + SwingUtilities.invokeLater( () -> { + getFrame().getContentPane().removeAll(); + getFrame().dispose(); + collectEarthWindow.openWindow(); + }); + + } catch (final Exception ex) { + logger.error("Error while changing language", ex); //$NON-NLS-1$ + } + }; + + final JMenu menuLanguage = new JMenu(Messages.getString("CollectEarthWindow.2")); //$NON-NLS-1$ + final ButtonGroup group = new ButtonGroup(); + final UI_LANGUAGE[] languages = UI_LANGUAGE.values(); - if (SystemUtils.IS_OS_WINDOWS){ - autoUpdateExecutable += ".exe"; //$NON-NLS-1$ - }else if (SystemUtils.IS_OS_MAC){ - autoUpdateExecutable += ".app"; //$NON-NLS-1$ - }else if ( SystemUtils.IS_OS_UNIX && System.getProperty("sun.arch.data.model").equals("64")){ - autoUpdateExecutable += "-x64.run"; //$NON-NLS-1$ - }else if ( SystemUtils.IS_OS_UNIX ) { - autoUpdateExecutable += ".run"; //$NON-NLS-1$ + for (final UI_LANGUAGE language : languages) { + final JRadioButtonMenuItem langItem = new JRadioButtonMenuItem(language.getLabel()); + langItem.setName(language.name()); + langItem.addActionListener(actionLanguage); + menuLanguage.add(langItem); + group.add(menuLanguage); + if (localPropertiesService.getUiLanguage().equals(language)) { + langItem.setSelected(true); } - } catch (Exception e) { - logger.error("Error in Autoupdate executable", e); //$NON-NLS-1$ } - return autoUpdateExecutable; + + return menuLanguage; + } + + public ActionListener getPropertiesAction(final JFrame owner) { + return e -> { + final JDialog dialog = new PropertiesDialog(owner, localPropertiesService, earthProjectsService, + backupSqlLiteService.getAutomaticBackUpFolder().getPath(), analysisSaikuService, + earthSurveyService.getCollectSurvey()); + dialog.setVisible(true); + dialog.pack(); + }; + } + + private ActionListener getSaikuAnalysisActionListener() { + return new GenerateRDBAnalysisListener(getFrame(), new GenerateDatabaseStarter(analysisSaikuService, getFrame() ) ); + } + + private ActionListener getSaikuToolExportActionListener() { + return new SaikuToolExportListener(getFrame(), new GenerateDatabaseStarter(analysisSaikuService, getFrame() ), localPropertiesService); + } + + + private ActionListener getIPCCExportActionListener() { + return new IPCCGeneratorListener(getFrame(), new GenerateDatabaseStarter(ipccGeneratorService, getFrame() ) ); + } + + private String getLogFilePath() { + return FolderFinder.getCollectEarthDataFolder() + "/earth_error.log"; //$NON-NLS-1$ + } + + public JFrame getFrame() { + return frame; } + public void setFrame(JFrame frame) { + this.frame = frame; + } + + public List getServerMenuItems() { + return serverMenuItems; + } } From d1d0d3e7c8d30bbbb0d2690a405054a9d55e7b4a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:33 +0100 Subject: [PATCH 0228/1620] New translations CollectEarthMenu.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 470 ++++++++++++++++-- 1 file changed, 427 insertions(+), 43 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 24b488682f..4c34fd0a7f 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,76 +1,460 @@ package org.openforis.collect.earth.app.view; -import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.ButtonGroup; +import javax.swing.JCheckBoxMenuItem; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JRadioButtonMenuItem; +import javax.swing.SwingUtilities; import org.apache.commons.lang3.SystemUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.LoggerContext; +import org.apache.logging.log4j.core.config.Configuration; import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.service.ProcessLoggerThread; -import org.slf4j.Logger; +import org.openforis.collect.earth.app.EarthConstants.UI_LANGUAGE; +import org.openforis.collect.earth.app.logging.JSwingAppender; +import org.openforis.collect.earth.app.service.AnalysisSaikuService; +import org.openforis.collect.earth.app.service.BackupSqlLiteService; +import org.openforis.collect.earth.app.service.DataImportExportService; +import org.openforis.collect.earth.app.service.EarthProjectsService; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.FolderFinder; +import org.openforis.collect.earth.app.service.IPCCGeneratorService; +import org.openforis.collect.earth.app.service.KmlImportService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.MissingPlotService; +import org.openforis.collect.earth.app.view.ExportActionListener.RecordsToExport; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class CollectEarthMenu extends JMenuBar implements InitializingBean { + + @Autowired + private transient DataImportExportService dataImportExportService; + + @Autowired + private transient KmlImportService kmlImportService; + + @Autowired + private transient MissingPlotService missingPlotService; + + @Autowired + private transient AnalysisSaikuService analysisSaikuService; + + @Autowired + private transient IPCCGeneratorService ipccGeneratorService; + + @Autowired + private transient LocalPropertiesService localPropertiesService; + + @Autowired + private transient CollectEarthWindow collectEarthWindow; + + @Autowired + private transient EarthSurveyService earthSurveyService; + + @Autowired + private transient EarthProjectsService earthProjectsService; + + @Autowired + private transient BackupSqlLiteService backupSqlLiteService; + + @Autowired + private transient RemovePlotsFromDBDlg removePlotsFromDBDlg; + + @Autowired + private transient EarthProjectsService projectsService; + + private static final long serialVersionUID = -2457052260968029351L; + private final List serverMenuItems = new ArrayList<>(); + private JFrame frame; + private final transient org.slf4j.Logger logger = LoggerFactory.getLogger(CollectEarthMenu.class); -public class CheckForUpdatesListener implements ActionListener { + public CollectEarthMenu() { + // Where the GUI is created: + super(); + } + + protected void init() { + setFrame(collectEarthWindow.getFrame()); + + // Build file menu in the menu bar. + this.add( getFileMenu() ); + + // Build tools menu in the menu bar. + this.add(getToolsMenu()); + + // Build help menu in the menu bar. + this.add(getHelpMenu()); + } + + @Override + public void afterPropertiesSet() throws Exception { + init(); + } - Logger logger = LoggerFactory.getLogger( CheckForUpdatesListener.class ); @Override - public void actionPerformed(ActionEvent e) { - // Start the auto_updater - try { - String autoUpdateExecutable = getAutoUpdateExecutable(); + public JMenu getHelpMenu() { + JMenu menuHelp = new JMenu(Messages.getString("CollectEarthWindow.16")); //$NON-NLS-1$ + JMenuItem menuItem; + File surveyGuide = earthSurveyService.getSurveyGuide(); + if( surveyGuide != null ) { + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.70")); //$NON-NLS-1$ + menuItem.addActionListener( (e) -> CollectEarthUtils.openFile( surveyGuide) ); + menuHelp.add(menuItem); + menuHelp.addSeparator(); + } + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.56")); //$NON-NLS-1$ + menuItem.addActionListener(new OpenAboutDialogListener(frame, Messages.getString("CollectEarthWindow.62"))); //$NON-NLS-1$ + menuHelp.add(menuItem); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.17")); //$NON-NLS-1$ + menuItem.addActionListener( + new OpenTextFileListener(frame, getDisclaimerFilePath(), Messages.getString("CollectEarthWindow.4")));//$NON-NLS-1$ + menuHelp.add(menuItem); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.50")); //$NON-NLS-1$ + menuItem.addActionListener( (e) -> CollectEarthUtils.openFile( new File("UserManual.pdf"))); + menuHelp.add(menuItem); + - File autoupdateFile = new File( autoUpdateExecutable); + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.64")); //$NON-NLS-1$ + menuItem.addActionListener(new OpenSupportForum()); + menuHelp.add(menuItem); + + menuHelp.addSeparator(); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.52")); //$NON-NLS-1$ + menuItem.addActionListener( + new OpenTextFileListener(frame, getLogFilePath(), Messages.getString("CollectEarthWindow.53"))); //$NON-NLS-1$ + menuHelp.add(menuItem); + + JCheckBoxMenuItem checkboxErrors = new JCheckBoxMenuItem("Show exception errors", localPropertiesService.isExceptionShown() ); //$NON-NLS-1$ + checkboxErrors.addActionListener( e -> { + // This sets/unsets the property that is checked when an exception is catch by the JSwingAppender log4j2 appender + + Boolean showException = checkboxErrors.isSelected(); + localPropertiesService.setExceptionShown( showException ); + + final LoggerContext ctx = (LoggerContext) LogManager.getContext(false); + final Configuration config = ctx.getConfiguration(); + + JSwingAppender jSwingAppender = config.getAppender("jswing-log"); + + jSwingAppender.setExceptionShown( showException ); + } + + ); + menuHelp.add(checkboxErrors); + + + menuHelp.addSeparator(); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.51")); //$NON-NLS-1$ + menuItem.addActionListener(new CheckForUpdatesListener()); + menuHelp.add(menuItem); + return menuHelp; + } + + private JMenu getToolsMenu() { + JMenu toolsMenu = new JMenu(Messages.getString("CollectEarthWindow.12")); //$NON-NLS-1$ + + addImportExportMenu(toolsMenu); + + JMenuItem menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.14")); //$NON-NLS-1$ + menuItem.addActionListener(getSaikuAnalysisActionListener()); + toolsMenu.add(menuItem); + + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.71")); //$NON-NLS-1$ + menuItem.addActionListener(getSaikuToolExportActionListener()); + menuItem.setEnabled(SystemUtils.IS_OS_WINDOWS ); // This option is only available in Windows!! + toolsMenu.add(menuItem); + +/* + toolsMenu.addSeparator(); + menuItem = new JMenuItem("Generate IPCC GHGi software LULUCF package"); //$NON-NLS-1$ + menuItem.addActionListener(getIPCCExportActionListener()); + toolsMenu.add(menuItem); + + + toolsMenu.addSeparator(); +*/ + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.54")); //$NON-NLS-1$ + menuItem.addActionListener(new ApplyOptionChangesListener(this.getFrame(), localPropertiesService) { + + @Override + protected void applyProperties() { + + try { + if (kmlImportService.prompToOpenKml(getFrame())) { + restartEarth(); + } + } catch (Exception e1) { + JOptionPane.showMessageDialog(getFrame(), e1.getMessage(), + Messages.getString("CollectEarthWindow.63"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + logger.error("Error importing KML file", e1); //$NON-NLS-1$ + } - if( !autoupdateFile.exists() ){ - autoupdateFile = new File( "autoupdate/"+autoUpdateExecutable); //$NON-NLS-1$ } - if( !autoupdateFile.exists() ){ - logger.error("No "+ autoUpdateExecutable + " found "); //$NON-NLS-1$ //$NON-NLS-2$ - return; + }); + serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is + // acting as a client ) + toolsMenu.add(menuItem); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.67")); //$NON-NLS-1$ + menuItem.addActionListener( e-> { + try { + CollectEarthUtils.openFolderInExplorer(FolderFinder.getCollectEarthDataFolder()); + } catch (IOException e1) { + logger.error("Could not find the data folder", e1); } - if( SystemUtils.IS_OS_LINUX ){ - try { - final ProcessBuilder builder = new ProcessBuilder(new String[] { autoupdateFile.getAbsolutePath() }); + }); + serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is + // acting as a client ) + toolsMenu.add(menuItem); - builder.redirectErrorStream(true); - Process p = builder.start(); + toolsMenu.addSeparator(); - (new ProcessLoggerThread(p.getInputStream(), Boolean.FALSE)).start(); - (new ProcessLoggerThread(p.getErrorStream(), Boolean.TRUE)).start(); + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.15")); //$NON-NLS-1$ + menuItem.addActionListener(getPropertiesAction(frame)); + toolsMenu.add(menuItem); + toolsMenu.add(getUtilitiesMenu() ); - } catch (final IOException e2) { - logger.error("Error when starting the Autoupdate executable", e2); //$NON-NLS-1$ - } - }else{ + toolsMenu.addSeparator(); + toolsMenu.add(getLanguageMenu()); + return toolsMenu; + } - CollectEarthUtils.openFile( autoupdateFile ); + private JMenu getUtilitiesMenu() { + JMenuItem menuItem; + JMenu utilities = new JMenu(Messages.getString("CollectEarthMenu.2")); //$NON-NLS-1$ + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.18")); //$NON-NLS-1$ + menuItem.addActionListener(new MissingPlotsListener(frame, localPropertiesService, missingPlotService)); + serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is + // acting as a client ) + + utilities.add(menuItem); + + menuItem = new JMenuItem(Messages.getString("CollectEarthMenu.3")); //$NON-NLS-1$ + menuItem.addActionListener( e -> FileDividerToolDlg.open(frame, earthSurveyService.getCollectSurvey()) ); + serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is // acting as a client ) + utilities.add(menuItem); + + menuItem = new JMenuItem("Delete Plots from DB using CSV"); + menuItem.addActionListener( e -> removePlotsFromDBDlg.open(frame, earthSurveyService.getCollectSurvey()) ); + utilities.add(menuItem); + + + utilities.add(menuItem); + return utilities; + } + + private JMenu getFileMenu() { + JMenu fileMenu = new JMenu(Messages.getString("CollectEarthWindow.10")); //$NON-NLS-1$ + + JMenuItem menuItem = new JMenuItem(Messages.getString("CollectEarthMenu.0")); //$NON-NLS-1$ + menuItem.addActionListener(new ApplyOptionChangesListener(this.getFrame(), localPropertiesService) { + + @Override + protected void applyProperties() { + final File[] selectedProjectFile = JFileChooserExistsAware.getFileChooserResults( + DataFormat.PROJECT_DEFINITION_FILE, false, false, null, localPropertiesService, + getFrame() ); + + if (selectedProjectFile != null && selectedProjectFile.length == 1) { + try { + projectsService.loadCompressedProjectFile(selectedProjectFile[0]); + + restartEarth(); + } catch (Exception e1) { + JOptionPane.showMessageDialog( getFrame(), e1.getMessage(), + Messages.getString("OptionWizard.51"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + logger.error("Error importing project file " + selectedProjectFile[0].getAbsolutePath(), e1); //$NON-NLS-1$ + } + } } - } catch (Exception e1) { - logger.error("Error when opening the Autoupdate executable", e1); //$NON-NLS-1$ + }); + fileMenu.add(menuItem); + this.add(fileMenu); + fileMenu.addSeparator(); + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.11")); //$NON-NLS-1$ + menuItem.addActionListener(collectEarthWindow.getCloseActionListener()); + fileMenu.add(menuItem); + return fileMenu; + } + + private void addImportExportMenu(JMenu menu) { + + final JMenu ieSubmenu = new JMenu(Messages.getString("CollectEarthWindow.44")); //$NON-NLS-1$ + JMenuItem menuItem; + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.13")); //$NON-NLS-1$ + menuItem.addActionListener(getExportActionListener(DataFormat.CSV, RecordsToExport.ALL)); + ieSubmenu.add(menuItem); + + final JMenu xmlExportSubmenu = new JMenu(Messages.getString("CollectEarthWindow.24")); //$NON-NLS-1$ + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.45")); //$NON-NLS-1$ + menuItem.addActionListener(getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.ALL)); + xmlExportSubmenu.add(menuItem); + + final JMenuItem exportModifiedRecords = new JMenuItem(Messages.getString("CollectEarthWindow.61")); //$NON-NLS-1$ + exportModifiedRecords.addActionListener( + getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.MODIFIED_SINCE_LAST_EXPORT)); + xmlExportSubmenu.add(exportModifiedRecords); + + final JMenuItem exportDataRangeRecords = new JMenuItem(Messages.getString("CollectEarthMenu.4")); //$NON-NLS-1$ + exportDataRangeRecords + .addActionListener(getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.PICK_FROM_DATE)); + xmlExportSubmenu.add(exportDataRangeRecords); + + ieSubmenu.add(xmlExportSubmenu); + + final JMenu backupExportSubmenu = new JMenu(Messages.getString("CollectEarthMenu.5")); //$NON-NLS-1$ + + final JMenuItem exportDataBackup = new JMenuItem(Messages.getString("CollectEarthMenu.6")); //$NON-NLS-1$ + exportDataBackup.addActionListener(getExportActionListener(DataFormat.COLLECT_BACKUP, RecordsToExport.ALL)); + backupExportSubmenu.add(exportDataBackup); + + final JMenuItem exportDataRangeBackup = new JMenuItem(Messages.getString("CollectEarthMenu.7")); //$NON-NLS-1$ + exportDataRangeBackup + .addActionListener(getExportActionListener(DataFormat.COLLECT_BACKUP, RecordsToExport.PICK_FROM_DATE)); + backupExportSubmenu.add(exportDataRangeBackup); + + ieSubmenu.add(backupExportSubmenu); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.6")); //$NON-NLS-1$ + menuItem.addActionListener(getExportActionListener(DataFormat.FUSION, RecordsToExport.ALL)); + ieSubmenu.add(menuItem); + + ieSubmenu.addSeparator(); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.46")); //$NON-NLS-1$ + menuItem.addActionListener(getImportActionListener(DataFormat.ZIP_WITH_XML)); + ieSubmenu.add(menuItem); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.55")); //$NON-NLS-1$ + menuItem.addActionListener(getImportActionListener(DataFormat.CSV)); + ieSubmenu.add(menuItem); + + menu.add(ieSubmenu); + + serverMenuItems.add(ieSubmenu); // This menu should only be shown if the DB is local ( not if Collect Earth is + // acting as a client ) + } + + private String getDisclaimerFilePath() { + final String suffixLang = localPropertiesService.getUiLanguage().getLocale().getLanguage(); + if (new File("resources/disclaimer_" + suffixLang + ".txt").exists()) { //$NON-NLS-1$ //$NON-NLS-2$ + return "resources/disclaimer_" + suffixLang + ".txt"; + } else { + return "resources/disclaimer_en.txt"; } } - private String getAutoUpdateExecutable() { - String autoUpdateExecutable = "autoupdate" ; //$NON-NLS-1$ - try { + private ActionListener getExportActionListener(final DataFormat exportFormat, final RecordsToExport xmlExportType) { + return new ExportActionListener(exportFormat, xmlExportType, getFrame(), localPropertiesService, + dataImportExportService, earthSurveyService); + } + + private ActionListener getImportActionListener(final DataFormat importFormat) { + return new ImportActionListener(importFormat, getFrame(), localPropertiesService, dataImportExportService); + } + + private JMenu getLanguageMenu() { + + final ActionListener actionLanguage = e -> { + try { + final String langName = ((JRadioButtonMenuItem) e.getSource()).getName(); + final UI_LANGUAGE language = UI_LANGUAGE.valueOf(langName); + CollectEarthUtils.setFontDependingOnLanguaue(language); + localPropertiesService.setUiLanguage(language); + + SwingUtilities.invokeLater( () -> { + getFrame().getContentPane().removeAll(); + getFrame().dispose(); + collectEarthWindow.openWindow(); + }); + + } catch (final Exception ex) { + logger.error("Error while changing language", ex); //$NON-NLS-1$ + } + }; + + final JMenu menuLanguage = new JMenu(Messages.getString("CollectEarthWindow.2")); //$NON-NLS-1$ + final ButtonGroup group = new ButtonGroup(); + final UI_LANGUAGE[] languages = UI_LANGUAGE.values(); - if (SystemUtils.IS_OS_WINDOWS){ - autoUpdateExecutable += ".exe"; //$NON-NLS-1$ - }else if (SystemUtils.IS_OS_MAC){ - autoUpdateExecutable += ".app"; //$NON-NLS-1$ - }else if ( SystemUtils.IS_OS_UNIX && System.getProperty("sun.arch.data.model").equals("64")){ - autoUpdateExecutable += "-x64.run"; //$NON-NLS-1$ - }else if ( SystemUtils.IS_OS_UNIX ) { - autoUpdateExecutable += ".run"; //$NON-NLS-1$ + for (final UI_LANGUAGE language : languages) { + final JRadioButtonMenuItem langItem = new JRadioButtonMenuItem(language.getLabel()); + langItem.setName(language.name()); + langItem.addActionListener(actionLanguage); + menuLanguage.add(langItem); + group.add(menuLanguage); + if (localPropertiesService.getUiLanguage().equals(language)) { + langItem.setSelected(true); } - } catch (Exception e) { - logger.error("Error in Autoupdate executable", e); //$NON-NLS-1$ } - return autoUpdateExecutable; + + return menuLanguage; + } + + public ActionListener getPropertiesAction(final JFrame owner) { + return e -> { + final JDialog dialog = new PropertiesDialog(owner, localPropertiesService, earthProjectsService, + backupSqlLiteService.getAutomaticBackUpFolder().getPath(), analysisSaikuService, + earthSurveyService.getCollectSurvey()); + dialog.setVisible(true); + dialog.pack(); + }; + } + + private ActionListener getSaikuAnalysisActionListener() { + return new GenerateRDBAnalysisListener(getFrame(), new GenerateDatabaseStarter(analysisSaikuService, getFrame() ) ); + } + + private ActionListener getSaikuToolExportActionListener() { + return new SaikuToolExportListener(getFrame(), new GenerateDatabaseStarter(analysisSaikuService, getFrame() ), localPropertiesService); + } + + + private ActionListener getIPCCExportActionListener() { + return new IPCCGeneratorListener(getFrame(), new GenerateDatabaseStarter(ipccGeneratorService, getFrame() ) ); + } + + private String getLogFilePath() { + return FolderFinder.getCollectEarthDataFolder() + "/earth_error.log"; //$NON-NLS-1$ + } + + public JFrame getFrame() { + return frame; } + public void setFrame(JFrame frame) { + this.frame = frame; + } + + public List getServerMenuItems() { + return serverMenuItems; + } } From 31a86608e0f40e64611f7bd4911c207f360de243 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:34 +0100 Subject: [PATCH 0229/1620] New translations CollectEarthMenu.java (English) --- .../earth/app/view/Messages_en.properties | 470 ++++++++++++++++-- 1 file changed, 427 insertions(+), 43 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 24b488682f..4c34fd0a7f 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,76 +1,460 @@ package org.openforis.collect.earth.app.view; -import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.ButtonGroup; +import javax.swing.JCheckBoxMenuItem; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JRadioButtonMenuItem; +import javax.swing.SwingUtilities; import org.apache.commons.lang3.SystemUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.LoggerContext; +import org.apache.logging.log4j.core.config.Configuration; import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.service.ProcessLoggerThread; -import org.slf4j.Logger; +import org.openforis.collect.earth.app.EarthConstants.UI_LANGUAGE; +import org.openforis.collect.earth.app.logging.JSwingAppender; +import org.openforis.collect.earth.app.service.AnalysisSaikuService; +import org.openforis.collect.earth.app.service.BackupSqlLiteService; +import org.openforis.collect.earth.app.service.DataImportExportService; +import org.openforis.collect.earth.app.service.EarthProjectsService; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.FolderFinder; +import org.openforis.collect.earth.app.service.IPCCGeneratorService; +import org.openforis.collect.earth.app.service.KmlImportService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.MissingPlotService; +import org.openforis.collect.earth.app.view.ExportActionListener.RecordsToExport; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class CollectEarthMenu extends JMenuBar implements InitializingBean { + + @Autowired + private transient DataImportExportService dataImportExportService; + + @Autowired + private transient KmlImportService kmlImportService; + + @Autowired + private transient MissingPlotService missingPlotService; + + @Autowired + private transient AnalysisSaikuService analysisSaikuService; + + @Autowired + private transient IPCCGeneratorService ipccGeneratorService; + + @Autowired + private transient LocalPropertiesService localPropertiesService; + + @Autowired + private transient CollectEarthWindow collectEarthWindow; + + @Autowired + private transient EarthSurveyService earthSurveyService; + + @Autowired + private transient EarthProjectsService earthProjectsService; + + @Autowired + private transient BackupSqlLiteService backupSqlLiteService; + + @Autowired + private transient RemovePlotsFromDBDlg removePlotsFromDBDlg; + + @Autowired + private transient EarthProjectsService projectsService; + + private static final long serialVersionUID = -2457052260968029351L; + private final List serverMenuItems = new ArrayList<>(); + private JFrame frame; + private final transient org.slf4j.Logger logger = LoggerFactory.getLogger(CollectEarthMenu.class); -public class CheckForUpdatesListener implements ActionListener { + public CollectEarthMenu() { + // Where the GUI is created: + super(); + } + + protected void init() { + setFrame(collectEarthWindow.getFrame()); + + // Build file menu in the menu bar. + this.add( getFileMenu() ); + + // Build tools menu in the menu bar. + this.add(getToolsMenu()); + + // Build help menu in the menu bar. + this.add(getHelpMenu()); + } + + @Override + public void afterPropertiesSet() throws Exception { + init(); + } - Logger logger = LoggerFactory.getLogger( CheckForUpdatesListener.class ); @Override - public void actionPerformed(ActionEvent e) { - // Start the auto_updater - try { - String autoUpdateExecutable = getAutoUpdateExecutable(); + public JMenu getHelpMenu() { + JMenu menuHelp = new JMenu(Messages.getString("CollectEarthWindow.16")); //$NON-NLS-1$ + JMenuItem menuItem; + File surveyGuide = earthSurveyService.getSurveyGuide(); + if( surveyGuide != null ) { + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.70")); //$NON-NLS-1$ + menuItem.addActionListener( (e) -> CollectEarthUtils.openFile( surveyGuide) ); + menuHelp.add(menuItem); + menuHelp.addSeparator(); + } + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.56")); //$NON-NLS-1$ + menuItem.addActionListener(new OpenAboutDialogListener(frame, Messages.getString("CollectEarthWindow.62"))); //$NON-NLS-1$ + menuHelp.add(menuItem); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.17")); //$NON-NLS-1$ + menuItem.addActionListener( + new OpenTextFileListener(frame, getDisclaimerFilePath(), Messages.getString("CollectEarthWindow.4")));//$NON-NLS-1$ + menuHelp.add(menuItem); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.50")); //$NON-NLS-1$ + menuItem.addActionListener( (e) -> CollectEarthUtils.openFile( new File("UserManual.pdf"))); + menuHelp.add(menuItem); + - File autoupdateFile = new File( autoUpdateExecutable); + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.64")); //$NON-NLS-1$ + menuItem.addActionListener(new OpenSupportForum()); + menuHelp.add(menuItem); + + menuHelp.addSeparator(); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.52")); //$NON-NLS-1$ + menuItem.addActionListener( + new OpenTextFileListener(frame, getLogFilePath(), Messages.getString("CollectEarthWindow.53"))); //$NON-NLS-1$ + menuHelp.add(menuItem); + + JCheckBoxMenuItem checkboxErrors = new JCheckBoxMenuItem("Show exception errors", localPropertiesService.isExceptionShown() ); //$NON-NLS-1$ + checkboxErrors.addActionListener( e -> { + // This sets/unsets the property that is checked when an exception is catch by the JSwingAppender log4j2 appender + + Boolean showException = checkboxErrors.isSelected(); + localPropertiesService.setExceptionShown( showException ); + + final LoggerContext ctx = (LoggerContext) LogManager.getContext(false); + final Configuration config = ctx.getConfiguration(); + + JSwingAppender jSwingAppender = config.getAppender("jswing-log"); + + jSwingAppender.setExceptionShown( showException ); + } + + ); + menuHelp.add(checkboxErrors); + + + menuHelp.addSeparator(); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.51")); //$NON-NLS-1$ + menuItem.addActionListener(new CheckForUpdatesListener()); + menuHelp.add(menuItem); + return menuHelp; + } + + private JMenu getToolsMenu() { + JMenu toolsMenu = new JMenu(Messages.getString("CollectEarthWindow.12")); //$NON-NLS-1$ + + addImportExportMenu(toolsMenu); + + JMenuItem menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.14")); //$NON-NLS-1$ + menuItem.addActionListener(getSaikuAnalysisActionListener()); + toolsMenu.add(menuItem); + + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.71")); //$NON-NLS-1$ + menuItem.addActionListener(getSaikuToolExportActionListener()); + menuItem.setEnabled(SystemUtils.IS_OS_WINDOWS ); // This option is only available in Windows!! + toolsMenu.add(menuItem); + +/* + toolsMenu.addSeparator(); + menuItem = new JMenuItem("Generate IPCC GHGi software LULUCF package"); //$NON-NLS-1$ + menuItem.addActionListener(getIPCCExportActionListener()); + toolsMenu.add(menuItem); + + + toolsMenu.addSeparator(); +*/ + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.54")); //$NON-NLS-1$ + menuItem.addActionListener(new ApplyOptionChangesListener(this.getFrame(), localPropertiesService) { + + @Override + protected void applyProperties() { + + try { + if (kmlImportService.prompToOpenKml(getFrame())) { + restartEarth(); + } + } catch (Exception e1) { + JOptionPane.showMessageDialog(getFrame(), e1.getMessage(), + Messages.getString("CollectEarthWindow.63"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + logger.error("Error importing KML file", e1); //$NON-NLS-1$ + } - if( !autoupdateFile.exists() ){ - autoupdateFile = new File( "autoupdate/"+autoUpdateExecutable); //$NON-NLS-1$ } - if( !autoupdateFile.exists() ){ - logger.error("No "+ autoUpdateExecutable + " found "); //$NON-NLS-1$ //$NON-NLS-2$ - return; + }); + serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is + // acting as a client ) + toolsMenu.add(menuItem); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.67")); //$NON-NLS-1$ + menuItem.addActionListener( e-> { + try { + CollectEarthUtils.openFolderInExplorer(FolderFinder.getCollectEarthDataFolder()); + } catch (IOException e1) { + logger.error("Could not find the data folder", e1); } - if( SystemUtils.IS_OS_LINUX ){ - try { - final ProcessBuilder builder = new ProcessBuilder(new String[] { autoupdateFile.getAbsolutePath() }); + }); + serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is + // acting as a client ) + toolsMenu.add(menuItem); - builder.redirectErrorStream(true); - Process p = builder.start(); + toolsMenu.addSeparator(); - (new ProcessLoggerThread(p.getInputStream(), Boolean.FALSE)).start(); - (new ProcessLoggerThread(p.getErrorStream(), Boolean.TRUE)).start(); + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.15")); //$NON-NLS-1$ + menuItem.addActionListener(getPropertiesAction(frame)); + toolsMenu.add(menuItem); + toolsMenu.add(getUtilitiesMenu() ); - } catch (final IOException e2) { - logger.error("Error when starting the Autoupdate executable", e2); //$NON-NLS-1$ - } - }else{ + toolsMenu.addSeparator(); + toolsMenu.add(getLanguageMenu()); + return toolsMenu; + } - CollectEarthUtils.openFile( autoupdateFile ); + private JMenu getUtilitiesMenu() { + JMenuItem menuItem; + JMenu utilities = new JMenu(Messages.getString("CollectEarthMenu.2")); //$NON-NLS-1$ + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.18")); //$NON-NLS-1$ + menuItem.addActionListener(new MissingPlotsListener(frame, localPropertiesService, missingPlotService)); + serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is + // acting as a client ) + + utilities.add(menuItem); + + menuItem = new JMenuItem(Messages.getString("CollectEarthMenu.3")); //$NON-NLS-1$ + menuItem.addActionListener( e -> FileDividerToolDlg.open(frame, earthSurveyService.getCollectSurvey()) ); + serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is // acting as a client ) + utilities.add(menuItem); + + menuItem = new JMenuItem("Delete Plots from DB using CSV"); + menuItem.addActionListener( e -> removePlotsFromDBDlg.open(frame, earthSurveyService.getCollectSurvey()) ); + utilities.add(menuItem); + + + utilities.add(menuItem); + return utilities; + } + + private JMenu getFileMenu() { + JMenu fileMenu = new JMenu(Messages.getString("CollectEarthWindow.10")); //$NON-NLS-1$ + + JMenuItem menuItem = new JMenuItem(Messages.getString("CollectEarthMenu.0")); //$NON-NLS-1$ + menuItem.addActionListener(new ApplyOptionChangesListener(this.getFrame(), localPropertiesService) { + + @Override + protected void applyProperties() { + final File[] selectedProjectFile = JFileChooserExistsAware.getFileChooserResults( + DataFormat.PROJECT_DEFINITION_FILE, false, false, null, localPropertiesService, + getFrame() ); + + if (selectedProjectFile != null && selectedProjectFile.length == 1) { + try { + projectsService.loadCompressedProjectFile(selectedProjectFile[0]); + + restartEarth(); + } catch (Exception e1) { + JOptionPane.showMessageDialog( getFrame(), e1.getMessage(), + Messages.getString("OptionWizard.51"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + logger.error("Error importing project file " + selectedProjectFile[0].getAbsolutePath(), e1); //$NON-NLS-1$ + } + } } - } catch (Exception e1) { - logger.error("Error when opening the Autoupdate executable", e1); //$NON-NLS-1$ + }); + fileMenu.add(menuItem); + this.add(fileMenu); + fileMenu.addSeparator(); + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.11")); //$NON-NLS-1$ + menuItem.addActionListener(collectEarthWindow.getCloseActionListener()); + fileMenu.add(menuItem); + return fileMenu; + } + + private void addImportExportMenu(JMenu menu) { + + final JMenu ieSubmenu = new JMenu(Messages.getString("CollectEarthWindow.44")); //$NON-NLS-1$ + JMenuItem menuItem; + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.13")); //$NON-NLS-1$ + menuItem.addActionListener(getExportActionListener(DataFormat.CSV, RecordsToExport.ALL)); + ieSubmenu.add(menuItem); + + final JMenu xmlExportSubmenu = new JMenu(Messages.getString("CollectEarthWindow.24")); //$NON-NLS-1$ + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.45")); //$NON-NLS-1$ + menuItem.addActionListener(getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.ALL)); + xmlExportSubmenu.add(menuItem); + + final JMenuItem exportModifiedRecords = new JMenuItem(Messages.getString("CollectEarthWindow.61")); //$NON-NLS-1$ + exportModifiedRecords.addActionListener( + getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.MODIFIED_SINCE_LAST_EXPORT)); + xmlExportSubmenu.add(exportModifiedRecords); + + final JMenuItem exportDataRangeRecords = new JMenuItem(Messages.getString("CollectEarthMenu.4")); //$NON-NLS-1$ + exportDataRangeRecords + .addActionListener(getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.PICK_FROM_DATE)); + xmlExportSubmenu.add(exportDataRangeRecords); + + ieSubmenu.add(xmlExportSubmenu); + + final JMenu backupExportSubmenu = new JMenu(Messages.getString("CollectEarthMenu.5")); //$NON-NLS-1$ + + final JMenuItem exportDataBackup = new JMenuItem(Messages.getString("CollectEarthMenu.6")); //$NON-NLS-1$ + exportDataBackup.addActionListener(getExportActionListener(DataFormat.COLLECT_BACKUP, RecordsToExport.ALL)); + backupExportSubmenu.add(exportDataBackup); + + final JMenuItem exportDataRangeBackup = new JMenuItem(Messages.getString("CollectEarthMenu.7")); //$NON-NLS-1$ + exportDataRangeBackup + .addActionListener(getExportActionListener(DataFormat.COLLECT_BACKUP, RecordsToExport.PICK_FROM_DATE)); + backupExportSubmenu.add(exportDataRangeBackup); + + ieSubmenu.add(backupExportSubmenu); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.6")); //$NON-NLS-1$ + menuItem.addActionListener(getExportActionListener(DataFormat.FUSION, RecordsToExport.ALL)); + ieSubmenu.add(menuItem); + + ieSubmenu.addSeparator(); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.46")); //$NON-NLS-1$ + menuItem.addActionListener(getImportActionListener(DataFormat.ZIP_WITH_XML)); + ieSubmenu.add(menuItem); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.55")); //$NON-NLS-1$ + menuItem.addActionListener(getImportActionListener(DataFormat.CSV)); + ieSubmenu.add(menuItem); + + menu.add(ieSubmenu); + + serverMenuItems.add(ieSubmenu); // This menu should only be shown if the DB is local ( not if Collect Earth is + // acting as a client ) + } + + private String getDisclaimerFilePath() { + final String suffixLang = localPropertiesService.getUiLanguage().getLocale().getLanguage(); + if (new File("resources/disclaimer_" + suffixLang + ".txt").exists()) { //$NON-NLS-1$ //$NON-NLS-2$ + return "resources/disclaimer_" + suffixLang + ".txt"; + } else { + return "resources/disclaimer_en.txt"; } } - private String getAutoUpdateExecutable() { - String autoUpdateExecutable = "autoupdate" ; //$NON-NLS-1$ - try { + private ActionListener getExportActionListener(final DataFormat exportFormat, final RecordsToExport xmlExportType) { + return new ExportActionListener(exportFormat, xmlExportType, getFrame(), localPropertiesService, + dataImportExportService, earthSurveyService); + } + + private ActionListener getImportActionListener(final DataFormat importFormat) { + return new ImportActionListener(importFormat, getFrame(), localPropertiesService, dataImportExportService); + } + + private JMenu getLanguageMenu() { + + final ActionListener actionLanguage = e -> { + try { + final String langName = ((JRadioButtonMenuItem) e.getSource()).getName(); + final UI_LANGUAGE language = UI_LANGUAGE.valueOf(langName); + CollectEarthUtils.setFontDependingOnLanguaue(language); + localPropertiesService.setUiLanguage(language); + + SwingUtilities.invokeLater( () -> { + getFrame().getContentPane().removeAll(); + getFrame().dispose(); + collectEarthWindow.openWindow(); + }); + + } catch (final Exception ex) { + logger.error("Error while changing language", ex); //$NON-NLS-1$ + } + }; + + final JMenu menuLanguage = new JMenu(Messages.getString("CollectEarthWindow.2")); //$NON-NLS-1$ + final ButtonGroup group = new ButtonGroup(); + final UI_LANGUAGE[] languages = UI_LANGUAGE.values(); - if (SystemUtils.IS_OS_WINDOWS){ - autoUpdateExecutable += ".exe"; //$NON-NLS-1$ - }else if (SystemUtils.IS_OS_MAC){ - autoUpdateExecutable += ".app"; //$NON-NLS-1$ - }else if ( SystemUtils.IS_OS_UNIX && System.getProperty("sun.arch.data.model").equals("64")){ - autoUpdateExecutable += "-x64.run"; //$NON-NLS-1$ - }else if ( SystemUtils.IS_OS_UNIX ) { - autoUpdateExecutable += ".run"; //$NON-NLS-1$ + for (final UI_LANGUAGE language : languages) { + final JRadioButtonMenuItem langItem = new JRadioButtonMenuItem(language.getLabel()); + langItem.setName(language.name()); + langItem.addActionListener(actionLanguage); + menuLanguage.add(langItem); + group.add(menuLanguage); + if (localPropertiesService.getUiLanguage().equals(language)) { + langItem.setSelected(true); } - } catch (Exception e) { - logger.error("Error in Autoupdate executable", e); //$NON-NLS-1$ } - return autoUpdateExecutable; + + return menuLanguage; + } + + public ActionListener getPropertiesAction(final JFrame owner) { + return e -> { + final JDialog dialog = new PropertiesDialog(owner, localPropertiesService, earthProjectsService, + backupSqlLiteService.getAutomaticBackUpFolder().getPath(), analysisSaikuService, + earthSurveyService.getCollectSurvey()); + dialog.setVisible(true); + dialog.pack(); + }; + } + + private ActionListener getSaikuAnalysisActionListener() { + return new GenerateRDBAnalysisListener(getFrame(), new GenerateDatabaseStarter(analysisSaikuService, getFrame() ) ); + } + + private ActionListener getSaikuToolExportActionListener() { + return new SaikuToolExportListener(getFrame(), new GenerateDatabaseStarter(analysisSaikuService, getFrame() ), localPropertiesService); + } + + + private ActionListener getIPCCExportActionListener() { + return new IPCCGeneratorListener(getFrame(), new GenerateDatabaseStarter(ipccGeneratorService, getFrame() ) ); + } + + private String getLogFilePath() { + return FolderFinder.getCollectEarthDataFolder() + "/earth_error.log"; //$NON-NLS-1$ + } + + public JFrame getFrame() { + return frame; } + public void setFrame(JFrame frame) { + this.frame = frame; + } + + public List getServerMenuItems() { + return serverMenuItems; + } } From c94563f63f9de5cfefe128a85e5c4f5cbf8a1281 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:35 +0100 Subject: [PATCH 0230/1620] New translations CollectEarthTransferHandler.java (French) --- .../earth/app/view/Messages_fr.properties | 500 ++++-------------- 1 file changed, 104 insertions(+), 396 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 4c34fd0a7f..65dd7f9161 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,460 +1,168 @@ package org.openforis.collect.earth.app.view; -import java.awt.event.ActionListener; +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.Transferable; import java.io.File; -import java.io.IOException; -import java.util.ArrayList; import java.util.List; -import javax.swing.ButtonGroup; -import javax.swing.JCheckBoxMenuItem; -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JMenu; -import javax.swing.JMenuBar; -import javax.swing.JMenuItem; -import javax.swing.JOptionPane; -import javax.swing.JRadioButtonMenuItem; -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.SystemUtils; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.core.LoggerContext; -import org.apache.logging.log4j.core.config.Configuration; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants.UI_LANGUAGE; -import org.openforis.collect.earth.app.logging.JSwingAppender; -import org.openforis.collect.earth.app.service.AnalysisSaikuService; -import org.openforis.collect.earth.app.service.BackupSqlLiteService; -import org.openforis.collect.earth.app.service.DataImportExportService; -import org.openforis.collect.earth.app.service.EarthProjectsService; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.FolderFinder; -import org.openforis.collect.earth.app.service.IPCCGeneratorService; +import javax.swing.JComponent; +import javax.swing.TransferHandler; + +import org.openforis.collect.earth.app.desktop.EarthApp; import org.openforis.collect.earth.app.service.KmlImportService; import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.MissingPlotService; -import org.openforis.collect.earth.app.view.ExportActionListener.RecordsToExport; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component -public class CollectEarthMenu extends JMenuBar implements InitializingBean { - - @Autowired - private transient DataImportExportService dataImportExportService; +public class CollectEarthTransferHandler extends TransferHandler { @Autowired - private transient KmlImportService kmlImportService; - - @Autowired - private transient MissingPlotService missingPlotService; - - @Autowired - private transient AnalysisSaikuService analysisSaikuService; - - @Autowired - private transient IPCCGeneratorService ipccGeneratorService; + private transient CollectEarthWindow collectEarthWindow; @Autowired private transient LocalPropertiesService localPropertiesService; @Autowired - private transient CollectEarthWindow collectEarthWindow; - - @Autowired - private transient EarthSurveyService earthSurveyService; + private transient KmlImportService kmlImportService; - @Autowired - private transient EarthProjectsService earthProjectsService; + private static final long serialVersionUID = 1L; + private transient Logger logger = LoggerFactory.getLogger( CollectEarthTransferHandler.class); - @Autowired - private transient BackupSqlLiteService backupSqlLiteService; + /* + * Can Only import an object if it represents a SINGLE file + * (non-Javadoc) + * @see javax.swing.TransferHandler#canImport(javax.swing.TransferHandler.TransferSupport) + */ + @Override + public boolean canImport(TransferSupport support) { - @Autowired - private transient RemovePlotsFromDBDlg removePlotsFromDBDlg; + if( support.isDataFlavorSupported(DataFlavor.javaFileListFlavor) ){ + Transferable t = support.getTransferable(); + List data; + try { + data = (List)t.getTransferData(DataFlavor.javaFileListFlavor); - @Autowired - private transient EarthProjectsService projectsService; + if( data !=null && data.size() == 1){ + return isFileExtensionValid( data.get(0) ); + }else { + return false; + } - private static final long serialVersionUID = -2457052260968029351L; - private final List serverMenuItems = new ArrayList<>(); - private JFrame frame; - private final transient org.slf4j.Logger logger = LoggerFactory.getLogger(CollectEarthMenu.class); + }catch(java.awt.dnd.InvalidDnDOperationException unknownException) { + logger.warn("Why do I get this error?t", unknownException); + return true; + }catch (Exception e) { + logger.error("Error on the drop support assessment", e); + return false; + } + }else{ + return false; + } - public CollectEarthMenu() { - // Where the GUI is created: - super(); } - protected void init() { - setFrame(collectEarthWindow.getFrame()); - // Build file menu in the menu bar. - this.add( getFileMenu() ); + private String getFileExtension(File file) { + String fileName = file.getName(); + int lastIndexOf = fileName.lastIndexOf('.' ); + String fileExtenxion = null; + if( lastIndexOf >0 ){ + fileExtenxion = fileName.substring( lastIndexOf + 1 ); + } + return fileExtenxion; + } - // Build tools menu in the menu bar. - this.add(getToolsMenu()); - // Build help menu in the menu bar. - this.add(getHelpMenu()); + private boolean isFileExtensionValid(File file ){ + String fileExtension = getFileExtension(file); + return fileExtension!=null && ( DataFormat.COLLECT_COORDS.checkFileExtensionMatches(fileExtension) || DataFormat.PROJECT_DEFINITION_FILE.checkFileExtensionMatches(fileExtension) || DataFormat.KML_FILE.checkFileExtensionMatches(fileExtension) ); } + /* + * We support both copy and move actions. + * (non-Javadoc) + * @see javax.swing.TransferHandler#getSourceActions(javax.swing.JComponent) + */ @Override - public void afterPropertiesSet() throws Exception { - init(); + public int getSourceActions(JComponent c) { + return COPY_OR_MOVE; } - @Override - public JMenu getHelpMenu() { - JMenu menuHelp = new JMenu(Messages.getString("CollectEarthWindow.16")); //$NON-NLS-1$ - JMenuItem menuItem; - File surveyGuide = earthSurveyService.getSurveyGuide(); - if( surveyGuide != null ) { - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.70")); //$NON-NLS-1$ - menuItem.addActionListener( (e) -> CollectEarthUtils.openFile( surveyGuide) ); - menuHelp.add(menuItem); - menuHelp.addSeparator(); - } - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.56")); //$NON-NLS-1$ - menuItem.addActionListener(new OpenAboutDialogListener(frame, Messages.getString("CollectEarthWindow.62"))); //$NON-NLS-1$ - menuHelp.add(menuItem); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.17")); //$NON-NLS-1$ - menuItem.addActionListener( - new OpenTextFileListener(frame, getDisclaimerFilePath(), Messages.getString("CollectEarthWindow.4")));//$NON-NLS-1$ - menuHelp.add(menuItem); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.50")); //$NON-NLS-1$ - menuItem.addActionListener( (e) -> CollectEarthUtils.openFile( new File("UserManual.pdf"))); - menuHelp.add(menuItem); - - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.64")); //$NON-NLS-1$ - menuItem.addActionListener(new OpenSupportForum()); - menuHelp.add(menuItem); - - menuHelp.addSeparator(); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.52")); //$NON-NLS-1$ - menuItem.addActionListener( - new OpenTextFileListener(frame, getLogFilePath(), Messages.getString("CollectEarthWindow.53"))); //$NON-NLS-1$ - menuHelp.add(menuItem); - - JCheckBoxMenuItem checkboxErrors = new JCheckBoxMenuItem("Show exception errors", localPropertiesService.isExceptionShown() ); //$NON-NLS-1$ - checkboxErrors.addActionListener( e -> { - // This sets/unsets the property that is checked when an exception is catch by the JSwingAppender log4j2 appender - - Boolean showException = checkboxErrors.isSelected(); - localPropertiesService.setExceptionShown( showException ); - - final LoggerContext ctx = (LoggerContext) LogManager.getContext(false); - final Configuration config = ctx.getConfiguration(); - - JSwingAppender jSwingAppender = config.getAppender("jswing-log"); - jSwingAppender.setExceptionShown( showException ); + /* + * Perform the actual import. This demo only supports drag and drop. + * (non-Javadoc) + * @see javax.swing.TransferHandler#importData(javax.swing.TransferHandler.TransferSupport) + */ + @Override + public boolean importData(TransferSupport info) { + if (!info.isDrop()) { + return false; } - ); - menuHelp.add(checkboxErrors); - - - menuHelp.addSeparator(); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.51")); //$NON-NLS-1$ - menuItem.addActionListener(new CheckForUpdatesListener()); - menuHelp.add(menuItem); - return menuHelp; - } - - private JMenu getToolsMenu() { - JMenu toolsMenu = new JMenu(Messages.getString("CollectEarthWindow.12")); //$NON-NLS-1$ - - addImportExportMenu(toolsMenu); - - JMenuItem menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.14")); //$NON-NLS-1$ - menuItem.addActionListener(getSaikuAnalysisActionListener()); - toolsMenu.add(menuItem); - - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.71")); //$NON-NLS-1$ - menuItem.addActionListener(getSaikuToolExportActionListener()); - menuItem.setEnabled(SystemUtils.IS_OS_WINDOWS ); // This option is only available in Windows!! - toolsMenu.add(menuItem); - -/* - toolsMenu.addSeparator(); - menuItem = new JMenuItem("Generate IPCC GHGi software LULUCF package"); //$NON-NLS-1$ - menuItem.addActionListener(getIPCCExportActionListener()); - toolsMenu.add(menuItem); - - - toolsMenu.addSeparator(); -*/ - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.54")); //$NON-NLS-1$ - menuItem.addActionListener(new ApplyOptionChangesListener(this.getFrame(), localPropertiesService) { - - @Override - protected void applyProperties() { - - try { - if (kmlImportService.prompToOpenKml(getFrame())) { - restartEarth(); - } - } catch (Exception e1) { - JOptionPane.showMessageDialog(getFrame(), e1.getMessage(), - Messages.getString("CollectEarthWindow.63"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - logger.error("Error importing KML file", e1); //$NON-NLS-1$ - } - + // Get the file that is being dropped. + Transferable t = info.getTransferable(); + List data; + try { + data = (List)t.getTransferData(DataFlavor.javaFileListFlavor); + if( data.size()!=1){ + throw new IllegalArgumentException("The drop action supports only single file drops!"); } - }); - serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is - // acting as a client ) - toolsMenu.add(menuItem); + File fileToImport = data.get(0); - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.67")); //$NON-NLS-1$ - menuItem.addActionListener( e-> { - try { - CollectEarthUtils.openFolderInExplorer(FolderFinder.getCollectEarthDataFolder()); - } catch (IOException e1) { - logger.error("Could not find the data folder", e1); + if( !isFileExtensionValid(fileToImport)){ + throw new IllegalArgumentException("The drop action supports only files of type!" + DataFormat.COLLECT_COORDS + " or " + DataFormat.PROJECT_DEFINITION_FILE); } - }); - serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is - // acting as a client ) - toolsMenu.add(menuItem); - - toolsMenu.addSeparator(); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.15")); //$NON-NLS-1$ - menuItem.addActionListener(getPropertiesAction(frame)); - toolsMenu.add(menuItem); - toolsMenu.add(getUtilitiesMenu() ); - - toolsMenu.addSeparator(); - toolsMenu.add(getLanguageMenu()); - return toolsMenu; - } - - private JMenu getUtilitiesMenu() { - JMenuItem menuItem; - JMenu utilities = new JMenu(Messages.getString("CollectEarthMenu.2")); //$NON-NLS-1$ - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.18")); //$NON-NLS-1$ - menuItem.addActionListener(new MissingPlotsListener(frame, localPropertiesService, missingPlotService)); - serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is - // acting as a client ) - - utilities.add(menuItem); - menuItem = new JMenuItem(Messages.getString("CollectEarthMenu.3")); //$NON-NLS-1$ - menuItem.addActionListener( e -> FileDividerToolDlg.open(frame, earthSurveyService.getCollectSurvey()) ); - serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is // acting as a client ) - utilities.add(menuItem); + String fileExtension = getFileExtension(fileToImport); - menuItem = new JMenuItem("Delete Plots from DB using CSV"); - menuItem.addActionListener( e -> removePlotsFromDBDlg.open(frame, earthSurveyService.getCollectSurvey()) ); - utilities.add(menuItem); - - - utilities.add(menuItem); - return utilities; - } + // If it is a CEP file then import + if( DataFormat.PROJECT_DEFINITION_FILE.checkFileExtensionMatches(fileExtension)){ + EarthApp.openProjectFileInRunningCollectEarth( fileToImport.getAbsolutePath() ); + }else if( DataFormat.COLLECT_COORDS.checkFileExtensionMatches(fileExtension)){ - private JMenu getFileMenu() { - JMenu fileMenu = new JMenu(Messages.getString("CollectEarthWindow.10")); //$NON-NLS-1$ + importCSVWithPlots(fileToImport); - JMenuItem menuItem = new JMenuItem(Messages.getString("CollectEarthMenu.0")); //$NON-NLS-1$ - menuItem.addActionListener(new ApplyOptionChangesListener(this.getFrame(), localPropertiesService) { + }else if( DataFormat.KML_FILE.checkFileExtensionMatches( fileExtension ) ) { - @Override - protected void applyProperties() { - final File[] selectedProjectFile = JFileChooserExistsAware.getFileChooserResults( - DataFormat.PROJECT_DEFINITION_FILE, false, false, null, localPropertiesService, - getFrame() ); + // Check if the CSV file can be loaded in the survey!!! - if (selectedProjectFile != null && selectedProjectFile.length == 1) { - try { - projectsService.loadCompressedProjectFile(selectedProjectFile[0]); - - restartEarth(); - } catch (Exception e1) { - JOptionPane.showMessageDialog( getFrame(), e1.getMessage(), - Messages.getString("OptionWizard.51"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - logger.error("Error importing project file " + selectedProjectFile[0].getAbsolutePath(), e1); //$NON-NLS-1$ - } + if( kmlImportService.loadFromKml( null, fileToImport ) ){ + EarthApp.executeKmlLoadAsynchronously( collectEarthWindow.getFrame() ); } - } - }); - fileMenu.add(menuItem); - this.add(fileMenu); - fileMenu.addSeparator(); - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.11")); //$NON-NLS-1$ - menuItem.addActionListener(collectEarthWindow.getCloseActionListener()); - fileMenu.add(menuItem); - return fileMenu; - } - - private void addImportExportMenu(JMenu menu) { - - final JMenu ieSubmenu = new JMenu(Messages.getString("CollectEarthWindow.44")); //$NON-NLS-1$ - JMenuItem menuItem; - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.13")); //$NON-NLS-1$ - menuItem.addActionListener(getExportActionListener(DataFormat.CSV, RecordsToExport.ALL)); - ieSubmenu.add(menuItem); - - final JMenu xmlExportSubmenu = new JMenu(Messages.getString("CollectEarthWindow.24")); //$NON-NLS-1$ - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.45")); //$NON-NLS-1$ - menuItem.addActionListener(getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.ALL)); - xmlExportSubmenu.add(menuItem); - - final JMenuItem exportModifiedRecords = new JMenuItem(Messages.getString("CollectEarthWindow.61")); //$NON-NLS-1$ - exportModifiedRecords.addActionListener( - getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.MODIFIED_SINCE_LAST_EXPORT)); - xmlExportSubmenu.add(exportModifiedRecords); - - final JMenuItem exportDataRangeRecords = new JMenuItem(Messages.getString("CollectEarthMenu.4")); //$NON-NLS-1$ - exportDataRangeRecords - .addActionListener(getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.PICK_FROM_DATE)); - xmlExportSubmenu.add(exportDataRangeRecords); - - ieSubmenu.add(xmlExportSubmenu); - - final JMenu backupExportSubmenu = new JMenu(Messages.getString("CollectEarthMenu.5")); //$NON-NLS-1$ - - final JMenuItem exportDataBackup = new JMenuItem(Messages.getString("CollectEarthMenu.6")); //$NON-NLS-1$ - exportDataBackup.addActionListener(getExportActionListener(DataFormat.COLLECT_BACKUP, RecordsToExport.ALL)); - backupExportSubmenu.add(exportDataBackup); - - final JMenuItem exportDataRangeBackup = new JMenuItem(Messages.getString("CollectEarthMenu.7")); //$NON-NLS-1$ - exportDataRangeBackup - .addActionListener(getExportActionListener(DataFormat.COLLECT_BACKUP, RecordsToExport.PICK_FROM_DATE)); - backupExportSubmenu.add(exportDataRangeBackup); - - ieSubmenu.add(backupExportSubmenu); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.6")); //$NON-NLS-1$ - menuItem.addActionListener(getExportActionListener(DataFormat.FUSION, RecordsToExport.ALL)); - ieSubmenu.add(menuItem); - - ieSubmenu.addSeparator(); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.46")); //$NON-NLS-1$ - menuItem.addActionListener(getImportActionListener(DataFormat.ZIP_WITH_XML)); - ieSubmenu.add(menuItem); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.55")); //$NON-NLS-1$ - menuItem.addActionListener(getImportActionListener(DataFormat.CSV)); - ieSubmenu.add(menuItem); - menu.add(ieSubmenu); - serverMenuItems.add(ieSubmenu); // This menu should only be shown if the DB is local ( not if Collect Earth is - // acting as a client ) - } - - private String getDisclaimerFilePath() { - final String suffixLang = localPropertiesService.getUiLanguage().getLocale().getLanguage(); - if (new File("resources/disclaimer_" + suffixLang + ".txt").exists()) { //$NON-NLS-1$ //$NON-NLS-2$ - return "resources/disclaimer_" + suffixLang + ".txt"; - } else { - return "resources/disclaimer_en.txt"; - } - } - - private ActionListener getExportActionListener(final DataFormat exportFormat, final RecordsToExport xmlExportType) { - return new ExportActionListener(exportFormat, xmlExportType, getFrame(), localPropertiesService, - dataImportExportService, earthSurveyService); - } - - private ActionListener getImportActionListener(final DataFormat importFormat) { - return new ImportActionListener(importFormat, getFrame(), localPropertiesService, dataImportExportService); - } - - private JMenu getLanguageMenu() { - - final ActionListener actionLanguage = e -> { - try { - final String langName = ((JRadioButtonMenuItem) e.getSource()).getName(); - final UI_LANGUAGE language = UI_LANGUAGE.valueOf(langName); - CollectEarthUtils.setFontDependingOnLanguaue(language); - localPropertiesService.setUiLanguage(language); - - SwingUtilities.invokeLater( () -> { - getFrame().getContentPane().removeAll(); - getFrame().dispose(); - collectEarthWindow.openWindow(); - }); - - } catch (final Exception ex) { - logger.error("Error while changing language", ex); //$NON-NLS-1$ - } - }; - - final JMenu menuLanguage = new JMenu(Messages.getString("CollectEarthWindow.2")); //$NON-NLS-1$ - - final ButtonGroup group = new ButtonGroup(); - final UI_LANGUAGE[] languages = UI_LANGUAGE.values(); - - for (final UI_LANGUAGE language : languages) { - final JRadioButtonMenuItem langItem = new JRadioButtonMenuItem(language.getLabel()); - langItem.setName(language.name()); - langItem.addActionListener(actionLanguage); - menuLanguage.add(langItem); - group.add(menuLanguage); - if (localPropertiesService.getUiLanguage().equals(language)) { - langItem.setSelected(true); + }else{ + throw new IllegalArgumentException("Unknown file extension!!"); } } + catch (Exception e) { + logger.error("Error on the drop action", e); + return false; + } - return menuLanguage; - } - public ActionListener getPropertiesAction(final JFrame owner) { - return e -> { - final JDialog dialog = new PropertiesDialog(owner, localPropertiesService, earthProjectsService, - backupSqlLiteService.getAutomaticBackUpFolder().getPath(), analysisSaikuService, - earthSurveyService.getCollectSurvey()); - dialog.setVisible(true); - dialog.pack(); - }; - } - private ActionListener getSaikuAnalysisActionListener() { - return new GenerateRDBAnalysisListener(getFrame(), new GenerateDatabaseStarter(analysisSaikuService, getFrame() ) ); - } - - private ActionListener getSaikuToolExportActionListener() { - return new SaikuToolExportListener(getFrame(), new GenerateDatabaseStarter(analysisSaikuService, getFrame() ), localPropertiesService); - } - - private ActionListener getIPCCExportActionListener() { - return new IPCCGeneratorListener(getFrame(), new GenerateDatabaseStarter(ipccGeneratorService, getFrame() ) ); - } - - private String getLogFilePath() { - return FolderFinder.getCollectEarthDataFolder() + "/earth_error.log"; //$NON-NLS-1$ + return true; } - public JFrame getFrame() { - return frame; - } - public void setFrame(JFrame frame) { - this.frame = frame; + private void importCSVWithPlots(File fileToImport) { + try{ + localPropertiesService.setValue( EarthProperty.SAMPLE_FILE, fileToImport.getAbsolutePath() ); + EarthApp.executeKmlLoadAsynchronously( collectEarthWindow.getFrame() ); + }catch( Exception kmlGenerationException ){ + logger.error( "Problem loading CSV file dropped into the window" , kmlGenerationException ); + EarthApp.showMessage(" Problem loading CSV file" + kmlGenerationException.getCause() ); + } } - public List getServerMenuItems() { - return serverMenuItems; - } + } From 3a3021e47364f1eb1b7e9d22caa696076d5276b4 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:36 +0100 Subject: [PATCH 0231/1620] New translations UpdateIniUtils.java (English) --- .../earth/app/view/Messages_en.properties | 546 +++++------------- 1 file changed, 142 insertions(+), 404 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 4c34fd0a7f..758b0b1b1a 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,460 +1,198 @@ -package org.openforis.collect.earth.app.view; +package org.openforis.collect.earth.app.service; -import java.awt.event.ActionListener; -import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.ButtonGroup; -import javax.swing.JCheckBoxMenuItem; -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JMenu; -import javax.swing.JMenuBar; -import javax.swing.JMenuItem; -import javax.swing.JOptionPane; -import javax.swing.JRadioButtonMenuItem; -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.SystemUtils; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.core.LoggerContext; -import org.apache.logging.log4j.core.config.Configuration; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants.UI_LANGUAGE; -import org.openforis.collect.earth.app.logging.JSwingAppender; -import org.openforis.collect.earth.app.service.AnalysisSaikuService; -import org.openforis.collect.earth.app.service.BackupSqlLiteService; -import org.openforis.collect.earth.app.service.DataImportExportService; -import org.openforis.collect.earth.app.service.EarthProjectsService; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.FolderFinder; -import org.openforis.collect.earth.app.service.IPCCGeneratorService; -import org.openforis.collect.earth.app.service.KmlImportService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.MissingPlotService; -import org.openforis.collect.earth.app.view.ExportActionListener.RecordsToExport; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public class CollectEarthMenu extends JMenuBar implements InitializingBean { - - @Autowired - private transient DataImportExportService dataImportExportService; +import java.net.URL; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Properties; +import java.util.concurrent.TimeUnit; - @Autowired - private transient KmlImportService kmlImportService; +import javax.xml.parsers.DocumentBuilderFactory; - @Autowired - private transient MissingPlotService missingPlotService; - - @Autowired - private transient AnalysisSaikuService analysisSaikuService; - - @Autowired - private transient IPCCGeneratorService ipccGeneratorService; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.w3c.dom.Document; - @Autowired - private transient LocalPropertiesService localPropertiesService; +public class UpdateIniUtils { - @Autowired - private transient CollectEarthWindow collectEarthWindow; + private static final String VERSION_ID = "version_id"; + private static final String VERSION_NAME = "version"; + private static final Logger logger = LoggerFactory.getLogger(UpdateIniUtils.class); + private final SimpleDateFormat fromXml = new SimpleDateFormat("yyyyMMddHHmm"); + public static final String UPDATE_INI = "update.ini"; - @Autowired - private transient EarthSurveyService earthSurveyService; + /** + * Checks if there is a newer version of the Collect Earth updater available + * @return The new version build-number if there is a new version. Null if the version online is not newer than the one installed + */ + public String getVersionAvailableOnline(){ - @Autowired - private transient EarthProjectsService earthProjectsService; + String installedVersionBuild = getVersionInstalled(); + String urlXmlUpdaterOnline = getValueFromUpdateIni("url", UPDATE_INI); //$NON-NLS-1$ + String onlineVersionBuild = getVersionBuild(urlXmlUpdaterOnline); - @Autowired - private transient BackupSqlLiteService backupSqlLiteService; - @Autowired - private transient RemovePlotsFromDBDlg removePlotsFromDBDlg; + try { + long installedBuild = Long.parseLong(installedVersionBuild); + long onlineBuild = Long.parseLong(onlineVersionBuild); - @Autowired - private transient EarthProjectsService projectsService; + if( onlineBuild > installedBuild ){ + return onlineBuild+""; //$NON-NLS-1$ + } - private static final long serialVersionUID = -2457052260968029351L; - private final List serverMenuItems = new ArrayList<>(); - private JFrame frame; - private final transient org.slf4j.Logger logger = LoggerFactory.getLogger(CollectEarthMenu.class); + } catch (NumberFormatException e) { + logger.error("Error parsing the buildNumber ", e); //$NON-NLS-1$ + } - public CollectEarthMenu() { - // Where the GUI is created: - super(); + return null; } - protected void init() { - setFrame(collectEarthWindow.getFrame()); - - // Build file menu in the menu bar. - this.add( getFileMenu() ); - - // Build tools menu in the menu bar. - this.add(getToolsMenu()); - - // Build help menu in the menu bar. - this.add(getHelpMenu()); + public static String getVersionInstalled() { + return getValueFromUpdateIni(VERSION_ID, UPDATE_INI); //$NON-NLS-1$ } - @Override - public void afterPropertiesSet() throws Exception { - init(); + public static String getReleaseNameInstalled() { + return getValueFromUpdateIni(VERSION_NAME, UPDATE_INI); //$NON-NLS-1$ } - @Override - public JMenu getHelpMenu() { - JMenu menuHelp = new JMenu(Messages.getString("CollectEarthWindow.16")); //$NON-NLS-1$ - JMenuItem menuItem; - File surveyGuide = earthSurveyService.getSurveyGuide(); - if( surveyGuide != null ) { - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.70")); //$NON-NLS-1$ - menuItem.addActionListener( (e) -> CollectEarthUtils.openFile( surveyGuide) ); - menuHelp.add(menuItem); - menuHelp.addSeparator(); - } - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.56")); //$NON-NLS-1$ - menuItem.addActionListener(new OpenAboutDialogListener(frame, Messages.getString("CollectEarthWindow.62"))); //$NON-NLS-1$ - menuHelp.add(menuItem); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.17")); //$NON-NLS-1$ - menuItem.addActionListener( - new OpenTextFileListener(frame, getDisclaimerFilePath(), Messages.getString("CollectEarthWindow.4")));//$NON-NLS-1$ - menuHelp.add(menuItem); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.50")); //$NON-NLS-1$ - menuItem.addActionListener( (e) -> CollectEarthUtils.openFile( new File("UserManual.pdf"))); - menuHelp.add(menuItem); - + public boolean shouldWarnUser(LocalPropertiesService localPropertiesService){ + boolean warnUser = false; - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.64")); //$NON-NLS-1$ - menuItem.addActionListener(new OpenSupportForum()); - menuHelp.add(menuItem); + // newVersionAvailable will be null if the version installed is not older than the current version of the updater + String currentVersionOnline = getVersionAvailableOnline(); - menuHelp.addSeparator(); + if( !StringUtils.isBlank( currentVersionOnline ) ){ - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.52")); //$NON-NLS-1$ - menuItem.addActionListener( - new OpenTextFileListener(frame, getLogFilePath(), Messages.getString("CollectEarthWindow.53"))); //$NON-NLS-1$ - menuHelp.add(menuItem); + // There is a new version. did the user chose "Not to be bother"with this update? + String lastIgnoredBuildNumber = localPropertiesService.getValue(EarthProperty.LAST_IGNORED_UPDATE); - JCheckBoxMenuItem checkboxErrors = new JCheckBoxMenuItem("Show exception errors", localPropertiesService.isExceptionShown() ); //$NON-NLS-1$ - checkboxErrors.addActionListener( e -> { - // This sets/unsets the property that is checked when an exception is catch by the JSwingAppender log4j2 appender - - Boolean showException = checkboxErrors.isSelected(); - localPropertiesService.setExceptionShown( showException ); - - final LoggerContext ctx = (LoggerContext) LogManager.getContext(false); - final Configuration config = ctx.getConfiguration(); - - JSwingAppender jSwingAppender = config.getAppender("jswing-log"); + if( + ( isCurrentNewerThanIgnoredUpdate(lastIgnoredBuildNumber, currentVersionOnline) && isMajorUpdate()) + || + isInstalledOlderThanOneMonth(currentVersionOnline, getVersionInstalled() ) + ){ + warnUser = true; + } - jSwingAppender.setExceptionShown( showException ); } - - ); - menuHelp.add(checkboxErrors); - - - menuHelp.addSeparator(); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.51")); //$NON-NLS-1$ - menuItem.addActionListener(new CheckForUpdatesListener()); - menuHelp.add(menuItem); - return menuHelp; + return warnUser; } - private JMenu getToolsMenu() { - JMenu toolsMenu = new JMenu(Messages.getString("CollectEarthWindow.12")); //$NON-NLS-1$ - - addImportExportMenu(toolsMenu); - - JMenuItem menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.14")); //$NON-NLS-1$ - menuItem.addActionListener(getSaikuAnalysisActionListener()); - toolsMenu.add(menuItem); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.71")); //$NON-NLS-1$ - menuItem.addActionListener(getSaikuToolExportActionListener()); - menuItem.setEnabled(SystemUtils.IS_OS_WINDOWS ); // This option is only available in Windows!! - toolsMenu.add(menuItem); + /** + * Check if the current version of the updater is newer than the version of the updater that was last ignored + * @param lastIgnoredBuildNumber The version of the last ignored updater as a string with the format yyyyMMddHHmm + * @param buildNumberOnline The version of the current updater in the server in the format yyyyMMddHHmm + * @return True is the new version of the updater is newer than the one last ignored. False otherwise + */ + private boolean isCurrentNewerThanIgnoredUpdate(String lastIgnoredBuildNumber, String buildNumberOnline){ -/* - toolsMenu.addSeparator(); - menuItem = new JMenuItem("Generate IPCC GHGi software LULUCF package"); //$NON-NLS-1$ - menuItem.addActionListener(getIPCCExportActionListener()); - toolsMenu.add(menuItem); - + boolean isNewerThanIgnored = true; - toolsMenu.addSeparator(); -*/ - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.54")); //$NON-NLS-1$ - menuItem.addActionListener(new ApplyOptionChangesListener(this.getFrame(), localPropertiesService) { - - @Override - protected void applyProperties() { - - try { - if (kmlImportService.prompToOpenKml(getFrame())) { - restartEarth(); - } - } catch (Exception e1) { - JOptionPane.showMessageDialog(getFrame(), e1.getMessage(), - Messages.getString("CollectEarthWindow.63"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - logger.error("Error importing KML file", e1); //$NON-NLS-1$ - } - - } + try { + if( !StringUtils.isEmpty(lastIgnoredBuildNumber) && !StringUtils.isEmpty(buildNumberOnline) ){ + Long ignoredBuildNumberUpdate =new Long(lastIgnoredBuildNumber); + Long buildOnline = new Long( buildNumberOnline ); - }); - serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is - // acting as a client ) - toolsMenu.add(menuItem); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.67")); //$NON-NLS-1$ - menuItem.addActionListener( e-> { - try { - CollectEarthUtils.openFolderInExplorer(FolderFinder.getCollectEarthDataFolder()); - } catch (IOException e1) { - logger.error("Could not find the data folder", e1); + isNewerThanIgnored = ignoredBuildNumberUpdate 30); + } catch (Exception e) { + logger.error( "Error calculating difference in dates bvetween installed and available versions", e ); + } - toolsMenu.addSeparator(); - toolsMenu.add(getLanguageMenu()); - return toolsMenu; + return isOlderThanOneMonth; } - private JMenu getUtilitiesMenu() { - JMenuItem menuItem; - JMenu utilities = new JMenu(Messages.getString("CollectEarthMenu.2")); //$NON-NLS-1$ - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.18")); //$NON-NLS-1$ - menuItem.addActionListener(new MissingPlotsListener(frame, localPropertiesService, missingPlotService)); - serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is - // acting as a client ) - - utilities.add(menuItem); - menuItem = new JMenuItem(Messages.getString("CollectEarthMenu.3")); //$NON-NLS-1$ - menuItem.addActionListener( e -> FileDividerToolDlg.open(frame, earthSurveyService.getCollectSurvey()) ); - serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is // acting as a client ) - utilities.add(menuItem); - - menuItem = new JMenuItem("Delete Plots from DB using CSV"); - menuItem.addActionListener( e -> removePlotsFromDBDlg.open(frame, earthSurveyService.getCollectSurvey()) ); - utilities.add(menuItem); - - - utilities.add(menuItem); - return utilities; + /** + * Checks if the update in the server is a "Major"update, meaning that every user should update Collect Earth + * @return True if the version on the server should be installed by all users + */ + public boolean isMajorUpdate() { + String urlXmlUpdaterOnline = getValueFromUpdateIni("url", UPDATE_INI); //$NON-NLS-1$ + String majorUpdateString = getXmlValueFromTag(urlXmlUpdaterOnline, VERSION_NAME); + return majorUpdateString.toLowerCase().contains("major"); } - private JMenu getFileMenu() { - JMenu fileMenu = new JMenu(Messages.getString("CollectEarthWindow.10")); //$NON-NLS-1$ - - JMenuItem menuItem = new JMenuItem(Messages.getString("CollectEarthMenu.0")); //$NON-NLS-1$ - menuItem.addActionListener(new ApplyOptionChangesListener(this.getFrame(), localPropertiesService) { - - @Override - protected void applyProperties() { - final File[] selectedProjectFile = JFileChooserExistsAware.getFileChooserResults( - DataFormat.PROJECT_DEFINITION_FILE, false, false, null, localPropertiesService, - getFrame() ); - - if (selectedProjectFile != null && selectedProjectFile.length == 1) { - try { - projectsService.loadCompressedProjectFile(selectedProjectFile[0]); - - restartEarth(); - } catch (Exception e1) { - JOptionPane.showMessageDialog( getFrame(), e1.getMessage(), - Messages.getString("OptionWizard.51"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - logger.error("Error importing project file " + selectedProjectFile[0].getAbsolutePath(), e1); //$NON-NLS-1$ - } - } - } - }); - fileMenu.add(menuItem); - this.add(fileMenu); - fileMenu.addSeparator(); - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.11")); //$NON-NLS-1$ - menuItem.addActionListener(collectEarthWindow.getCloseActionListener()); - fileMenu.add(menuItem); - return fileMenu; + private String getVersionBuild(String urlXmlUpdate) { + String tagname = "versionId"; //$NON-NLS-1$ + return getXmlValueFromTag(urlXmlUpdate, tagname); } - private void addImportExportMenu(JMenu menu) { + public String getXmlValueFromTag(String urlXmlUpdate, String tagname) { - final JMenu ieSubmenu = new JMenu(Messages.getString("CollectEarthWindow.44")); //$NON-NLS-1$ - JMenuItem menuItem; - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.13")); //$NON-NLS-1$ - menuItem.addActionListener(getExportActionListener(DataFormat.CSV, RecordsToExport.ALL)); - ieSubmenu.add(menuItem); + String onlineVersion = "0"; //$NON-NLS-1$ + try { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + //factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); // Compliant + //factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); // compliant - final JMenu xmlExportSubmenu = new JMenu(Messages.getString("CollectEarthWindow.24")); //$NON-NLS-1$ + factory.setNamespaceAware(true); + Document parse = factory.newDocumentBuilder().parse(new URL(urlXmlUpdate).openStream()); - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.45")); //$NON-NLS-1$ - menuItem.addActionListener(getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.ALL)); - xmlExportSubmenu.add(menuItem); + onlineVersion = parse.getElementsByTagName(tagname).item(0).getChildNodes().item(0).getNodeValue(); - final JMenuItem exportModifiedRecords = new JMenuItem(Messages.getString("CollectEarthWindow.61")); //$NON-NLS-1$ - exportModifiedRecords.addActionListener( - getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.MODIFIED_SINCE_LAST_EXPORT)); - xmlExportSubmenu.add(exportModifiedRecords); - - final JMenuItem exportDataRangeRecords = new JMenuItem(Messages.getString("CollectEarthMenu.4")); //$NON-NLS-1$ - exportDataRangeRecords - .addActionListener(getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.PICK_FROM_DATE)); - xmlExportSubmenu.add(exportDataRangeRecords); - - ieSubmenu.add(xmlExportSubmenu); - - final JMenu backupExportSubmenu = new JMenu(Messages.getString("CollectEarthMenu.5")); //$NON-NLS-1$ - - final JMenuItem exportDataBackup = new JMenuItem(Messages.getString("CollectEarthMenu.6")); //$NON-NLS-1$ - exportDataBackup.addActionListener(getExportActionListener(DataFormat.COLLECT_BACKUP, RecordsToExport.ALL)); - backupExportSubmenu.add(exportDataBackup); - - final JMenuItem exportDataRangeBackup = new JMenuItem(Messages.getString("CollectEarthMenu.7")); //$NON-NLS-1$ - exportDataRangeBackup - .addActionListener(getExportActionListener(DataFormat.COLLECT_BACKUP, RecordsToExport.PICK_FROM_DATE)); - backupExportSubmenu.add(exportDataRangeBackup); - - ieSubmenu.add(backupExportSubmenu); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.6")); //$NON-NLS-1$ - menuItem.addActionListener(getExportActionListener(DataFormat.FUSION, RecordsToExport.ALL)); - ieSubmenu.add(menuItem); - - ieSubmenu.addSeparator(); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.46")); //$NON-NLS-1$ - menuItem.addActionListener(getImportActionListener(DataFormat.ZIP_WITH_XML)); - ieSubmenu.add(menuItem); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.55")); //$NON-NLS-1$ - menuItem.addActionListener(getImportActionListener(DataFormat.CSV)); - ieSubmenu.add(menuItem); - - menu.add(ieSubmenu); - - serverMenuItems.add(ieSubmenu); // This menu should only be shown if the DB is local ( not if Collect Earth is - // acting as a client ) - } - - private String getDisclaimerFilePath() { - final String suffixLang = localPropertiesService.getUiLanguage().getLocale().getLanguage(); - if (new File("resources/disclaimer_" + suffixLang + ".txt").exists()) { //$NON-NLS-1$ //$NON-NLS-2$ - return "resources/disclaimer_" + suffixLang + ".txt"; - } else { - return "resources/disclaimer_en.txt"; + logger.info("CE Online Version available {}" , onlineVersion); + } catch (Exception e) { + logger.warn("Error while reading the remote XML where the updater version is defined", e); //$NON-NLS-1$ } - } - private ActionListener getExportActionListener(final DataFormat exportFormat, final RecordsToExport xmlExportType) { - return new ExportActionListener(exportFormat, xmlExportType, getFrame(), localPropertiesService, - dataImportExportService, earthSurveyService); + return onlineVersion; } - private ActionListener getImportActionListener(final DataFormat importFormat) { - return new ImportActionListener(importFormat, getFrame(), localPropertiesService, dataImportExportService); - } - - private JMenu getLanguageMenu() { - - final ActionListener actionLanguage = e -> { - try { - final String langName = ((JRadioButtonMenuItem) e.getSource()).getName(); - final UI_LANGUAGE language = UI_LANGUAGE.valueOf(langName); - CollectEarthUtils.setFontDependingOnLanguaue(language); - localPropertiesService.setUiLanguage(language); - - SwingUtilities.invokeLater( () -> { - getFrame().getContentPane().removeAll(); - getFrame().dispose(); - collectEarthWindow.openWindow(); - }); - - } catch (final Exception ex) { - logger.error("Error while changing language", ex); //$NON-NLS-1$ - } - }; - - final JMenu menuLanguage = new JMenu(Messages.getString("CollectEarthWindow.2")); //$NON-NLS-1$ - - final ButtonGroup group = new ButtonGroup(); - final UI_LANGUAGE[] languages = UI_LANGUAGE.values(); - - for (final UI_LANGUAGE language : languages) { - final JRadioButtonMenuItem langItem = new JRadioButtonMenuItem(language.getLabel()); - langItem.setName(language.name()); - langItem.addActionListener(actionLanguage); - menuLanguage.add(langItem); - group.add(menuLanguage); - if (localPropertiesService.getUiLanguage().equals(language)) { - langItem.setSelected(true); - } - + public static String getValueFromUpdateIni(String key, String pathToUpdateIni) { + Properties properties = new Properties(); + String value = "unknown"; //$NON-NLS-1$ + try (FileInputStream fis = new FileInputStream(pathToUpdateIni) ){ + properties.load( fis ); + value = properties.getProperty(key); + } catch (FileNotFoundException e) { + logger.error("The update.ini file could not be found", e); //$NON-NLS-1$ + } catch (IOException e) { + logger.error("Error opening the update.ini file", e); //$NON-NLS-1$ } - - return menuLanguage; + return value; } - public ActionListener getPropertiesAction(final JFrame owner) { - return e -> { - final JDialog dialog = new PropertiesDialog(owner, localPropertiesService, earthProjectsService, - backupSqlLiteService.getAutomaticBackUpFolder().getPath(), analysisSaikuService, - earthSurveyService.getCollectSurvey()); - dialog.setVisible(true); - dialog.pack(); - }; - } + public String convertToDate(String buildVersionNumber) { + SimpleDateFormat humanReadable = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = buildVersionNumber; + try { - private ActionListener getSaikuAnalysisActionListener() { - return new GenerateRDBAnalysisListener(getFrame(), new GenerateDatabaseStarter(analysisSaikuService, getFrame() ) ); - } - - private ActionListener getSaikuToolExportActionListener() { - return new SaikuToolExportListener(getFrame(), new GenerateDatabaseStarter(analysisSaikuService, getFrame() ), localPropertiesService); - } - - - private ActionListener getIPCCExportActionListener() { - return new IPCCGeneratorListener(getFrame(), new GenerateDatabaseStarter(ipccGeneratorService, getFrame() ) ); - } - - private String getLogFilePath() { - return FolderFinder.getCollectEarthDataFolder() + "/earth_error.log"; //$NON-NLS-1$ - } - - public JFrame getFrame() { - return frame; - } - - public void setFrame(JFrame frame) { - this.frame = frame; - } + reformattedStr = humanReadable.format(fromXml.parse(buildVersionNumber)); + } catch (java.text.ParseException e) { + logger.error("Error parsing the date from the XML updater" , e ); + } - public List getServerMenuItems() { - return serverMenuItems; + return reformattedStr; } } From f2a60d419fd4529734219f680d124ca325db31d0 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:37 +0100 Subject: [PATCH 0232/1620] New translations UpdateIniUtils.java (Spanish) --- .../earth/app/view/Messages_es.properties | 546 +++++------------- 1 file changed, 142 insertions(+), 404 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 4c34fd0a7f..758b0b1b1a 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,460 +1,198 @@ -package org.openforis.collect.earth.app.view; +package org.openforis.collect.earth.app.service; -import java.awt.event.ActionListener; -import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.ButtonGroup; -import javax.swing.JCheckBoxMenuItem; -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JMenu; -import javax.swing.JMenuBar; -import javax.swing.JMenuItem; -import javax.swing.JOptionPane; -import javax.swing.JRadioButtonMenuItem; -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.SystemUtils; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.core.LoggerContext; -import org.apache.logging.log4j.core.config.Configuration; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants.UI_LANGUAGE; -import org.openforis.collect.earth.app.logging.JSwingAppender; -import org.openforis.collect.earth.app.service.AnalysisSaikuService; -import org.openforis.collect.earth.app.service.BackupSqlLiteService; -import org.openforis.collect.earth.app.service.DataImportExportService; -import org.openforis.collect.earth.app.service.EarthProjectsService; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.FolderFinder; -import org.openforis.collect.earth.app.service.IPCCGeneratorService; -import org.openforis.collect.earth.app.service.KmlImportService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.MissingPlotService; -import org.openforis.collect.earth.app.view.ExportActionListener.RecordsToExport; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public class CollectEarthMenu extends JMenuBar implements InitializingBean { - - @Autowired - private transient DataImportExportService dataImportExportService; +import java.net.URL; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Properties; +import java.util.concurrent.TimeUnit; - @Autowired - private transient KmlImportService kmlImportService; +import javax.xml.parsers.DocumentBuilderFactory; - @Autowired - private transient MissingPlotService missingPlotService; - - @Autowired - private transient AnalysisSaikuService analysisSaikuService; - - @Autowired - private transient IPCCGeneratorService ipccGeneratorService; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.w3c.dom.Document; - @Autowired - private transient LocalPropertiesService localPropertiesService; +public class UpdateIniUtils { - @Autowired - private transient CollectEarthWindow collectEarthWindow; + private static final String VERSION_ID = "version_id"; + private static final String VERSION_NAME = "version"; + private static final Logger logger = LoggerFactory.getLogger(UpdateIniUtils.class); + private final SimpleDateFormat fromXml = new SimpleDateFormat("yyyyMMddHHmm"); + public static final String UPDATE_INI = "update.ini"; - @Autowired - private transient EarthSurveyService earthSurveyService; + /** + * Checks if there is a newer version of the Collect Earth updater available + * @return The new version build-number if there is a new version. Null if the version online is not newer than the one installed + */ + public String getVersionAvailableOnline(){ - @Autowired - private transient EarthProjectsService earthProjectsService; + String installedVersionBuild = getVersionInstalled(); + String urlXmlUpdaterOnline = getValueFromUpdateIni("url", UPDATE_INI); //$NON-NLS-1$ + String onlineVersionBuild = getVersionBuild(urlXmlUpdaterOnline); - @Autowired - private transient BackupSqlLiteService backupSqlLiteService; - @Autowired - private transient RemovePlotsFromDBDlg removePlotsFromDBDlg; + try { + long installedBuild = Long.parseLong(installedVersionBuild); + long onlineBuild = Long.parseLong(onlineVersionBuild); - @Autowired - private transient EarthProjectsService projectsService; + if( onlineBuild > installedBuild ){ + return onlineBuild+""; //$NON-NLS-1$ + } - private static final long serialVersionUID = -2457052260968029351L; - private final List serverMenuItems = new ArrayList<>(); - private JFrame frame; - private final transient org.slf4j.Logger logger = LoggerFactory.getLogger(CollectEarthMenu.class); + } catch (NumberFormatException e) { + logger.error("Error parsing the buildNumber ", e); //$NON-NLS-1$ + } - public CollectEarthMenu() { - // Where the GUI is created: - super(); + return null; } - protected void init() { - setFrame(collectEarthWindow.getFrame()); - - // Build file menu in the menu bar. - this.add( getFileMenu() ); - - // Build tools menu in the menu bar. - this.add(getToolsMenu()); - - // Build help menu in the menu bar. - this.add(getHelpMenu()); + public static String getVersionInstalled() { + return getValueFromUpdateIni(VERSION_ID, UPDATE_INI); //$NON-NLS-1$ } - @Override - public void afterPropertiesSet() throws Exception { - init(); + public static String getReleaseNameInstalled() { + return getValueFromUpdateIni(VERSION_NAME, UPDATE_INI); //$NON-NLS-1$ } - @Override - public JMenu getHelpMenu() { - JMenu menuHelp = new JMenu(Messages.getString("CollectEarthWindow.16")); //$NON-NLS-1$ - JMenuItem menuItem; - File surveyGuide = earthSurveyService.getSurveyGuide(); - if( surveyGuide != null ) { - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.70")); //$NON-NLS-1$ - menuItem.addActionListener( (e) -> CollectEarthUtils.openFile( surveyGuide) ); - menuHelp.add(menuItem); - menuHelp.addSeparator(); - } - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.56")); //$NON-NLS-1$ - menuItem.addActionListener(new OpenAboutDialogListener(frame, Messages.getString("CollectEarthWindow.62"))); //$NON-NLS-1$ - menuHelp.add(menuItem); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.17")); //$NON-NLS-1$ - menuItem.addActionListener( - new OpenTextFileListener(frame, getDisclaimerFilePath(), Messages.getString("CollectEarthWindow.4")));//$NON-NLS-1$ - menuHelp.add(menuItem); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.50")); //$NON-NLS-1$ - menuItem.addActionListener( (e) -> CollectEarthUtils.openFile( new File("UserManual.pdf"))); - menuHelp.add(menuItem); - + public boolean shouldWarnUser(LocalPropertiesService localPropertiesService){ + boolean warnUser = false; - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.64")); //$NON-NLS-1$ - menuItem.addActionListener(new OpenSupportForum()); - menuHelp.add(menuItem); + // newVersionAvailable will be null if the version installed is not older than the current version of the updater + String currentVersionOnline = getVersionAvailableOnline(); - menuHelp.addSeparator(); + if( !StringUtils.isBlank( currentVersionOnline ) ){ - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.52")); //$NON-NLS-1$ - menuItem.addActionListener( - new OpenTextFileListener(frame, getLogFilePath(), Messages.getString("CollectEarthWindow.53"))); //$NON-NLS-1$ - menuHelp.add(menuItem); + // There is a new version. did the user chose "Not to be bother"with this update? + String lastIgnoredBuildNumber = localPropertiesService.getValue(EarthProperty.LAST_IGNORED_UPDATE); - JCheckBoxMenuItem checkboxErrors = new JCheckBoxMenuItem("Show exception errors", localPropertiesService.isExceptionShown() ); //$NON-NLS-1$ - checkboxErrors.addActionListener( e -> { - // This sets/unsets the property that is checked when an exception is catch by the JSwingAppender log4j2 appender - - Boolean showException = checkboxErrors.isSelected(); - localPropertiesService.setExceptionShown( showException ); - - final LoggerContext ctx = (LoggerContext) LogManager.getContext(false); - final Configuration config = ctx.getConfiguration(); - - JSwingAppender jSwingAppender = config.getAppender("jswing-log"); + if( + ( isCurrentNewerThanIgnoredUpdate(lastIgnoredBuildNumber, currentVersionOnline) && isMajorUpdate()) + || + isInstalledOlderThanOneMonth(currentVersionOnline, getVersionInstalled() ) + ){ + warnUser = true; + } - jSwingAppender.setExceptionShown( showException ); } - - ); - menuHelp.add(checkboxErrors); - - - menuHelp.addSeparator(); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.51")); //$NON-NLS-1$ - menuItem.addActionListener(new CheckForUpdatesListener()); - menuHelp.add(menuItem); - return menuHelp; + return warnUser; } - private JMenu getToolsMenu() { - JMenu toolsMenu = new JMenu(Messages.getString("CollectEarthWindow.12")); //$NON-NLS-1$ - - addImportExportMenu(toolsMenu); - - JMenuItem menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.14")); //$NON-NLS-1$ - menuItem.addActionListener(getSaikuAnalysisActionListener()); - toolsMenu.add(menuItem); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.71")); //$NON-NLS-1$ - menuItem.addActionListener(getSaikuToolExportActionListener()); - menuItem.setEnabled(SystemUtils.IS_OS_WINDOWS ); // This option is only available in Windows!! - toolsMenu.add(menuItem); + /** + * Check if the current version of the updater is newer than the version of the updater that was last ignored + * @param lastIgnoredBuildNumber The version of the last ignored updater as a string with the format yyyyMMddHHmm + * @param buildNumberOnline The version of the current updater in the server in the format yyyyMMddHHmm + * @return True is the new version of the updater is newer than the one last ignored. False otherwise + */ + private boolean isCurrentNewerThanIgnoredUpdate(String lastIgnoredBuildNumber, String buildNumberOnline){ -/* - toolsMenu.addSeparator(); - menuItem = new JMenuItem("Generate IPCC GHGi software LULUCF package"); //$NON-NLS-1$ - menuItem.addActionListener(getIPCCExportActionListener()); - toolsMenu.add(menuItem); - + boolean isNewerThanIgnored = true; - toolsMenu.addSeparator(); -*/ - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.54")); //$NON-NLS-1$ - menuItem.addActionListener(new ApplyOptionChangesListener(this.getFrame(), localPropertiesService) { - - @Override - protected void applyProperties() { - - try { - if (kmlImportService.prompToOpenKml(getFrame())) { - restartEarth(); - } - } catch (Exception e1) { - JOptionPane.showMessageDialog(getFrame(), e1.getMessage(), - Messages.getString("CollectEarthWindow.63"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - logger.error("Error importing KML file", e1); //$NON-NLS-1$ - } - - } + try { + if( !StringUtils.isEmpty(lastIgnoredBuildNumber) && !StringUtils.isEmpty(buildNumberOnline) ){ + Long ignoredBuildNumberUpdate =new Long(lastIgnoredBuildNumber); + Long buildOnline = new Long( buildNumberOnline ); - }); - serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is - // acting as a client ) - toolsMenu.add(menuItem); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.67")); //$NON-NLS-1$ - menuItem.addActionListener( e-> { - try { - CollectEarthUtils.openFolderInExplorer(FolderFinder.getCollectEarthDataFolder()); - } catch (IOException e1) { - logger.error("Could not find the data folder", e1); + isNewerThanIgnored = ignoredBuildNumberUpdate 30); + } catch (Exception e) { + logger.error( "Error calculating difference in dates bvetween installed and available versions", e ); + } - toolsMenu.addSeparator(); - toolsMenu.add(getLanguageMenu()); - return toolsMenu; + return isOlderThanOneMonth; } - private JMenu getUtilitiesMenu() { - JMenuItem menuItem; - JMenu utilities = new JMenu(Messages.getString("CollectEarthMenu.2")); //$NON-NLS-1$ - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.18")); //$NON-NLS-1$ - menuItem.addActionListener(new MissingPlotsListener(frame, localPropertiesService, missingPlotService)); - serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is - // acting as a client ) - - utilities.add(menuItem); - menuItem = new JMenuItem(Messages.getString("CollectEarthMenu.3")); //$NON-NLS-1$ - menuItem.addActionListener( e -> FileDividerToolDlg.open(frame, earthSurveyService.getCollectSurvey()) ); - serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is // acting as a client ) - utilities.add(menuItem); - - menuItem = new JMenuItem("Delete Plots from DB using CSV"); - menuItem.addActionListener( e -> removePlotsFromDBDlg.open(frame, earthSurveyService.getCollectSurvey()) ); - utilities.add(menuItem); - - - utilities.add(menuItem); - return utilities; + /** + * Checks if the update in the server is a "Major"update, meaning that every user should update Collect Earth + * @return True if the version on the server should be installed by all users + */ + public boolean isMajorUpdate() { + String urlXmlUpdaterOnline = getValueFromUpdateIni("url", UPDATE_INI); //$NON-NLS-1$ + String majorUpdateString = getXmlValueFromTag(urlXmlUpdaterOnline, VERSION_NAME); + return majorUpdateString.toLowerCase().contains("major"); } - private JMenu getFileMenu() { - JMenu fileMenu = new JMenu(Messages.getString("CollectEarthWindow.10")); //$NON-NLS-1$ - - JMenuItem menuItem = new JMenuItem(Messages.getString("CollectEarthMenu.0")); //$NON-NLS-1$ - menuItem.addActionListener(new ApplyOptionChangesListener(this.getFrame(), localPropertiesService) { - - @Override - protected void applyProperties() { - final File[] selectedProjectFile = JFileChooserExistsAware.getFileChooserResults( - DataFormat.PROJECT_DEFINITION_FILE, false, false, null, localPropertiesService, - getFrame() ); - - if (selectedProjectFile != null && selectedProjectFile.length == 1) { - try { - projectsService.loadCompressedProjectFile(selectedProjectFile[0]); - - restartEarth(); - } catch (Exception e1) { - JOptionPane.showMessageDialog( getFrame(), e1.getMessage(), - Messages.getString("OptionWizard.51"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - logger.error("Error importing project file " + selectedProjectFile[0].getAbsolutePath(), e1); //$NON-NLS-1$ - } - } - } - }); - fileMenu.add(menuItem); - this.add(fileMenu); - fileMenu.addSeparator(); - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.11")); //$NON-NLS-1$ - menuItem.addActionListener(collectEarthWindow.getCloseActionListener()); - fileMenu.add(menuItem); - return fileMenu; + private String getVersionBuild(String urlXmlUpdate) { + String tagname = "versionId"; //$NON-NLS-1$ + return getXmlValueFromTag(urlXmlUpdate, tagname); } - private void addImportExportMenu(JMenu menu) { + public String getXmlValueFromTag(String urlXmlUpdate, String tagname) { - final JMenu ieSubmenu = new JMenu(Messages.getString("CollectEarthWindow.44")); //$NON-NLS-1$ - JMenuItem menuItem; - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.13")); //$NON-NLS-1$ - menuItem.addActionListener(getExportActionListener(DataFormat.CSV, RecordsToExport.ALL)); - ieSubmenu.add(menuItem); + String onlineVersion = "0"; //$NON-NLS-1$ + try { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + //factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); // Compliant + //factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); // compliant - final JMenu xmlExportSubmenu = new JMenu(Messages.getString("CollectEarthWindow.24")); //$NON-NLS-1$ + factory.setNamespaceAware(true); + Document parse = factory.newDocumentBuilder().parse(new URL(urlXmlUpdate).openStream()); - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.45")); //$NON-NLS-1$ - menuItem.addActionListener(getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.ALL)); - xmlExportSubmenu.add(menuItem); + onlineVersion = parse.getElementsByTagName(tagname).item(0).getChildNodes().item(0).getNodeValue(); - final JMenuItem exportModifiedRecords = new JMenuItem(Messages.getString("CollectEarthWindow.61")); //$NON-NLS-1$ - exportModifiedRecords.addActionListener( - getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.MODIFIED_SINCE_LAST_EXPORT)); - xmlExportSubmenu.add(exportModifiedRecords); - - final JMenuItem exportDataRangeRecords = new JMenuItem(Messages.getString("CollectEarthMenu.4")); //$NON-NLS-1$ - exportDataRangeRecords - .addActionListener(getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.PICK_FROM_DATE)); - xmlExportSubmenu.add(exportDataRangeRecords); - - ieSubmenu.add(xmlExportSubmenu); - - final JMenu backupExportSubmenu = new JMenu(Messages.getString("CollectEarthMenu.5")); //$NON-NLS-1$ - - final JMenuItem exportDataBackup = new JMenuItem(Messages.getString("CollectEarthMenu.6")); //$NON-NLS-1$ - exportDataBackup.addActionListener(getExportActionListener(DataFormat.COLLECT_BACKUP, RecordsToExport.ALL)); - backupExportSubmenu.add(exportDataBackup); - - final JMenuItem exportDataRangeBackup = new JMenuItem(Messages.getString("CollectEarthMenu.7")); //$NON-NLS-1$ - exportDataRangeBackup - .addActionListener(getExportActionListener(DataFormat.COLLECT_BACKUP, RecordsToExport.PICK_FROM_DATE)); - backupExportSubmenu.add(exportDataRangeBackup); - - ieSubmenu.add(backupExportSubmenu); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.6")); //$NON-NLS-1$ - menuItem.addActionListener(getExportActionListener(DataFormat.FUSION, RecordsToExport.ALL)); - ieSubmenu.add(menuItem); - - ieSubmenu.addSeparator(); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.46")); //$NON-NLS-1$ - menuItem.addActionListener(getImportActionListener(DataFormat.ZIP_WITH_XML)); - ieSubmenu.add(menuItem); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.55")); //$NON-NLS-1$ - menuItem.addActionListener(getImportActionListener(DataFormat.CSV)); - ieSubmenu.add(menuItem); - - menu.add(ieSubmenu); - - serverMenuItems.add(ieSubmenu); // This menu should only be shown if the DB is local ( not if Collect Earth is - // acting as a client ) - } - - private String getDisclaimerFilePath() { - final String suffixLang = localPropertiesService.getUiLanguage().getLocale().getLanguage(); - if (new File("resources/disclaimer_" + suffixLang + ".txt").exists()) { //$NON-NLS-1$ //$NON-NLS-2$ - return "resources/disclaimer_" + suffixLang + ".txt"; - } else { - return "resources/disclaimer_en.txt"; + logger.info("CE Online Version available {}" , onlineVersion); + } catch (Exception e) { + logger.warn("Error while reading the remote XML where the updater version is defined", e); //$NON-NLS-1$ } - } - private ActionListener getExportActionListener(final DataFormat exportFormat, final RecordsToExport xmlExportType) { - return new ExportActionListener(exportFormat, xmlExportType, getFrame(), localPropertiesService, - dataImportExportService, earthSurveyService); + return onlineVersion; } - private ActionListener getImportActionListener(final DataFormat importFormat) { - return new ImportActionListener(importFormat, getFrame(), localPropertiesService, dataImportExportService); - } - - private JMenu getLanguageMenu() { - - final ActionListener actionLanguage = e -> { - try { - final String langName = ((JRadioButtonMenuItem) e.getSource()).getName(); - final UI_LANGUAGE language = UI_LANGUAGE.valueOf(langName); - CollectEarthUtils.setFontDependingOnLanguaue(language); - localPropertiesService.setUiLanguage(language); - - SwingUtilities.invokeLater( () -> { - getFrame().getContentPane().removeAll(); - getFrame().dispose(); - collectEarthWindow.openWindow(); - }); - - } catch (final Exception ex) { - logger.error("Error while changing language", ex); //$NON-NLS-1$ - } - }; - - final JMenu menuLanguage = new JMenu(Messages.getString("CollectEarthWindow.2")); //$NON-NLS-1$ - - final ButtonGroup group = new ButtonGroup(); - final UI_LANGUAGE[] languages = UI_LANGUAGE.values(); - - for (final UI_LANGUAGE language : languages) { - final JRadioButtonMenuItem langItem = new JRadioButtonMenuItem(language.getLabel()); - langItem.setName(language.name()); - langItem.addActionListener(actionLanguage); - menuLanguage.add(langItem); - group.add(menuLanguage); - if (localPropertiesService.getUiLanguage().equals(language)) { - langItem.setSelected(true); - } - + public static String getValueFromUpdateIni(String key, String pathToUpdateIni) { + Properties properties = new Properties(); + String value = "unknown"; //$NON-NLS-1$ + try (FileInputStream fis = new FileInputStream(pathToUpdateIni) ){ + properties.load( fis ); + value = properties.getProperty(key); + } catch (FileNotFoundException e) { + logger.error("The update.ini file could not be found", e); //$NON-NLS-1$ + } catch (IOException e) { + logger.error("Error opening the update.ini file", e); //$NON-NLS-1$ } - - return menuLanguage; + return value; } - public ActionListener getPropertiesAction(final JFrame owner) { - return e -> { - final JDialog dialog = new PropertiesDialog(owner, localPropertiesService, earthProjectsService, - backupSqlLiteService.getAutomaticBackUpFolder().getPath(), analysisSaikuService, - earthSurveyService.getCollectSurvey()); - dialog.setVisible(true); - dialog.pack(); - }; - } + public String convertToDate(String buildVersionNumber) { + SimpleDateFormat humanReadable = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = buildVersionNumber; + try { - private ActionListener getSaikuAnalysisActionListener() { - return new GenerateRDBAnalysisListener(getFrame(), new GenerateDatabaseStarter(analysisSaikuService, getFrame() ) ); - } - - private ActionListener getSaikuToolExportActionListener() { - return new SaikuToolExportListener(getFrame(), new GenerateDatabaseStarter(analysisSaikuService, getFrame() ), localPropertiesService); - } - - - private ActionListener getIPCCExportActionListener() { - return new IPCCGeneratorListener(getFrame(), new GenerateDatabaseStarter(ipccGeneratorService, getFrame() ) ); - } - - private String getLogFilePath() { - return FolderFinder.getCollectEarthDataFolder() + "/earth_error.log"; //$NON-NLS-1$ - } - - public JFrame getFrame() { - return frame; - } - - public void setFrame(JFrame frame) { - this.frame = frame; - } + reformattedStr = humanReadable.format(fromXml.parse(buildVersionNumber)); + } catch (java.text.ParseException e) { + logger.error("Error parsing the date from the XML updater" , e ); + } - public List getServerMenuItems() { - return serverMenuItems; + return reformattedStr; } } From a64ab48ea714c54a6b16052690d2294c3b4b7e31 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:38 +0100 Subject: [PATCH 0233/1620] New translations RDBConnector.java (Spanish) --- .../earth/app/view/Messages_es.properties | 255 ++++-------------- 1 file changed, 57 insertions(+), 198 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 758b0b1b1a..70e2ecd6d6 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,198 +1,57 @@ -package org.openforis.collect.earth.app.service; - -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.net.URL; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Properties; -import java.util.concurrent.TimeUnit; - -import javax.xml.parsers.DocumentBuilderFactory; - -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.w3c.dom.Document; - -public class UpdateIniUtils { - - private static final String VERSION_ID = "version_id"; - private static final String VERSION_NAME = "version"; - private static final Logger logger = LoggerFactory.getLogger(UpdateIniUtils.class); - private final SimpleDateFormat fromXml = new SimpleDateFormat("yyyyMMddHHmm"); - public static final String UPDATE_INI = "update.ini"; - - /** - * Checks if there is a newer version of the Collect Earth updater available - * @return The new version build-number if there is a new version. Null if the version online is not newer than the one installed - */ - public String getVersionAvailableOnline(){ - - String installedVersionBuild = getVersionInstalled(); - String urlXmlUpdaterOnline = getValueFromUpdateIni("url", UPDATE_INI); //$NON-NLS-1$ - String onlineVersionBuild = getVersionBuild(urlXmlUpdaterOnline); - - - try { - long installedBuild = Long.parseLong(installedVersionBuild); - long onlineBuild = Long.parseLong(onlineVersionBuild); - - if( onlineBuild > installedBuild ){ - return onlineBuild+""; //$NON-NLS-1$ - } - - } catch (NumberFormatException e) { - logger.error("Error parsing the buildNumber ", e); //$NON-NLS-1$ - } - - return null; - } - - public static String getVersionInstalled() { - return getValueFromUpdateIni(VERSION_ID, UPDATE_INI); //$NON-NLS-1$ - } - - public static String getReleaseNameInstalled() { - return getValueFromUpdateIni(VERSION_NAME, UPDATE_INI); //$NON-NLS-1$ - } - - public boolean shouldWarnUser(LocalPropertiesService localPropertiesService){ - boolean warnUser = false; - - // newVersionAvailable will be null if the version installed is not older than the current version of the updater - String currentVersionOnline = getVersionAvailableOnline(); - - if( !StringUtils.isBlank( currentVersionOnline ) ){ - - // There is a new version. did the user chose "Not to be bother"with this update? - String lastIgnoredBuildNumber = localPropertiesService.getValue(EarthProperty.LAST_IGNORED_UPDATE); - - if( - ( isCurrentNewerThanIgnoredUpdate(lastIgnoredBuildNumber, currentVersionOnline) && isMajorUpdate()) - || - isInstalledOlderThanOneMonth(currentVersionOnline, getVersionInstalled() ) - ){ - warnUser = true; - } - - } - return warnUser; - } - - - /** - * Check if the current version of the updater is newer than the version of the updater that was last ignored - * @param lastIgnoredBuildNumber The version of the last ignored updater as a string with the format yyyyMMddHHmm - * @param buildNumberOnline The version of the current updater in the server in the format yyyyMMddHHmm - * @return True is the new version of the updater is newer than the one last ignored. False otherwise - */ - private boolean isCurrentNewerThanIgnoredUpdate(String lastIgnoredBuildNumber, String buildNumberOnline){ - - boolean isNewerThanIgnored = true; - - try { - if( !StringUtils.isEmpty(lastIgnoredBuildNumber) && !StringUtils.isEmpty(buildNumberOnline) ){ - Long ignoredBuildNumberUpdate =new Long(lastIgnoredBuildNumber); - Long buildOnline = new Long( buildNumberOnline ); - - isNewerThanIgnored = ignoredBuildNumberUpdate 30); - } catch (Exception e) { - logger.error( "Error calculating difference in dates bvetween installed and available versions", e ); - } - - return isOlderThanOneMonth; - } - - - /** - * Checks if the update in the server is a "Major"update, meaning that every user should update Collect Earth - * @return True if the version on the server should be installed by all users - */ - public boolean isMajorUpdate() { - String urlXmlUpdaterOnline = getValueFromUpdateIni("url", UPDATE_INI); //$NON-NLS-1$ - String majorUpdateString = getXmlValueFromTag(urlXmlUpdaterOnline, VERSION_NAME); - return majorUpdateString.toLowerCase().contains("major"); - } - - private String getVersionBuild(String urlXmlUpdate) { - String tagname = "versionId"; //$NON-NLS-1$ - return getXmlValueFromTag(urlXmlUpdate, tagname); - } - - public String getXmlValueFromTag(String urlXmlUpdate, String tagname) { - - String onlineVersion = "0"; //$NON-NLS-1$ - try { - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - //factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); // Compliant - //factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); // compliant - - factory.setNamespaceAware(true); - Document parse = factory.newDocumentBuilder().parse(new URL(urlXmlUpdate).openStream()); - - onlineVersion = parse.getElementsByTagName(tagname).item(0).getChildNodes().item(0).getNodeValue(); - - logger.info("CE Online Version available {}" , onlineVersion); - } catch (Exception e) { - logger.warn("Error while reading the remote XML where the updater version is defined", e); //$NON-NLS-1$ - } - - return onlineVersion; - } - - public static String getValueFromUpdateIni(String key, String pathToUpdateIni) { - Properties properties = new Properties(); - String value = "unknown"; //$NON-NLS-1$ - try (FileInputStream fis = new FileInputStream(pathToUpdateIni) ){ - properties.load( fis ); - value = properties.getProperty(key); - } catch (FileNotFoundException e) { - logger.error("The update.ini file could not be found", e); //$NON-NLS-1$ - } catch (IOException e) { - logger.error("Error opening the update.ini file", e); //$NON-NLS-1$ - } - return value; - } - - public String convertToDate(String buildVersionNumber) { - SimpleDateFormat humanReadable = new SimpleDateFormat("yyyy-MM-dd"); - String reformattedStr = buildVersionNumber; - try { - - reformattedStr = humanReadable.format(fromXml.parse(buildVersionNumber)); - } catch (java.text.ParseException e) { - logger.error("Error parsing the date from the XML updater" , e ); - } - - return reformattedStr; - } -} +package org.openforis.collect.earth.app.service; + +import java.sql.Connection; + +import javax.sql.DataSource; + +import org.apache.commons.dbcp.BasicDataSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.DataSourceUtils; + +public abstract class RDBConnector { + @Autowired + @Qualifier("rdbDataSource") + private DataSource rdbDataSource; + + @Autowired + @Qualifier("rdbDataSourceIpcc") + private BasicDataSource rdbDataSourceIpcc; + + private JdbcTemplate jdbcTemplate; + + private ExportType exportTypeUsed; + + public JdbcTemplate getJdbcTemplate() { + if( jdbcTemplate == null ) { + if( getExportTypeUsed().equals( ExportType.SAIKU) ) { + jdbcTemplate = new JdbcTemplate(rdbDataSource); + }else if( getExportTypeUsed().equals( ExportType.IPCC ) ){ + jdbcTemplate = new JdbcTemplate(rdbDataSourceIpcc); + }else { + throw new IllegalArgumentException("The ExportType has not been set yet"); + } + } + return jdbcTemplate; + } + + protected Connection getJDBCConnection() { + if( getExportTypeUsed().equals( ExportType.SAIKU ) ) { + return DataSourceUtils.getConnection(rdbDataSource); + }else if( getExportTypeUsed().equals( ExportType.IPCC ) ){ + return DataSourceUtils.getConnection(rdbDataSourceIpcc); + }else { + throw new IllegalArgumentException("The ExportType has not been set yet"); + } + } + + public ExportType getExportTypeUsed() { + return exportTypeUsed; + } + + public void setExportTypeUsed(ExportType exportTypeUsed) { + this.exportTypeUsed = exportTypeUsed; + } + +} From 1118d9812afdd0bb2f406745961c86e6fdc74756 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:39 +0100 Subject: [PATCH 0234/1620] New translations RegionCalculationUtils.java (French) --- .../earth/app/view/Messages_fr.properties | 418 +++++++++++++----- 1 file changed, 313 insertions(+), 105 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 65dd7f9161..905f384f1e 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,167 +1,375 @@ -package org.openforis.collect.earth.app.view; +package org.openforis.collect.earth.app.service; -import java.awt.datatransfer.DataFlavor; -import java.awt.datatransfer.Transferable; import java.io.File; +import java.io.FileNotFoundException; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.Locale; -import javax.swing.JComponent; -import javax.swing.TransferHandler; - -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.KmlImportService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.idm.metamodel.BooleanAttributeDefinition; +import org.openforis.idm.metamodel.EntityDefinition; +import org.openforis.idm.metamodel.NodeDefinition; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Component; +import com.opencsv.CSVReader; + @Component -public class CollectEarthTransferHandler extends TransferHandler { +public class RegionCalculationUtils{ + + private static final String AREA_CSV_COLUMN = "area"; + private static final String WEIGHT_CSV_COLUMN = "weight"; + private static final String PLOT_SET = "plot SET "; + private static final String UPDATE = "UPDATE "; + private static final String PLOT_ADD = "plot ADD "; + private static final String FLOAT = " FLOAT"; + private static final String ALTER_TABLE = "ALTER TABLE "; + private static final String ALTER_TABLE2 = ALTER_TABLE; + private static final String SHRUB_COUNT = "shrub_count"; + private static final String TREE_COUNT = "tree_count"; + private static final String REGION_AREAS_CSV = "region_areas.csv"; //$NON-NLS-1$ + private static final String ATTRIBUTE_AREAS_CSV = "areas_per_attribute.csv"; //$NON-NLS-1$ + private static final String PLOT_WEIGHT = "plot_weight"; //$NON-NLS-1$ + private static final String TREES_PER_EXP_FACTOR = "trees_per_expansion_factor"; //$NON-NLS-1$ + private static final String SHRUBS_PER_EXP_FACTOR = "shrubs_per_expansion_factor"; //$NON-NLS-1$ + private static final String NO_DATA_LAND_USE = "noData"; //$NON-NLS-1$ + private static final String MANY_TREES = "many_trees"; + private static final String MANY_SHRUBS = "many_shrubs"; + + public static final String EXPANSION_FACTOR = "expansion_factor"; //$NON-NLS-1$ + private final Logger logger = LoggerFactory.getLogger(RegionCalculationUtils.class); @Autowired - private transient CollectEarthWindow collectEarthWindow; + EarthSurveyService earthSurveyService; @Autowired - private transient LocalPropertiesService localPropertiesService; + LocalPropertiesService localPropertiesService; @Autowired - private transient KmlImportService kmlImportService; + private SchemaService schemaService; - private static final long serialVersionUID = 1L; - private transient Logger logger = LoggerFactory.getLogger( CollectEarthTransferHandler.class); + private JdbcTemplate jdbcTemplate; - /* - * Can Only import an object if it represents a SINGLE file - * (non-Javadoc) - * @see javax.swing.TransferHandler#canImport(javax.swing.TransferHandler.TransferSupport) - */ - @Override - public boolean canImport(TransferSupport support) { - - if( support.isDataFlavorSupported(DataFlavor.javaFileListFlavor) ){ - Transferable t = support.getTransferable(); - List data; - try { - data = (List)t.getTransferData(DataFlavor.javaFileListFlavor); - - if( data !=null && data.size() == 1){ - return isFileExtensionValid( data.get(0) ); - }else { - return false; + private ExportType exportType; + + public void handleRegionCalculation(ExportType exportType, JdbcTemplate jdbcTemplate){ + + try { + setExportType(exportType); + setJdbcTemplate(jdbcTemplate); + createWeightFactors(); + + // If the region_areas.csv is not present then try to add the areas "per attribute" using the file areas_per_attribute.csv + boolean areasAdded = false; + if(!addAreasPerRegion()){ + if( addAreasPerAttribute() ){ + areasAdded = true; } + }else{ + areasAdded = true; + } - }catch(java.awt.dnd.InvalidDnDOperationException unknownException) { - logger.warn("Why do I get this error?t", unknownException); - return true; - }catch (Exception e) { - logger.error("Error on the drop support assessment", e); - return false; + if( areasAdded ){ + handleNumberOfTrees(); + handleNumberOfShrubs(); + recalculatePlotWeights(); } - }else{ - return false; + + } catch (Exception e) { + logger.error( "Error when calculating the expansion factors for the plots ", e); } + } + + private void recalculatePlotWeights() { + String schemaName = getSchemaPrefix(); + String selectMinExpansionFactorSql = String.format("SELECT MIN(%s) FROM %splot", EXPANSION_FACTOR, schemaName); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + Double minExpansionFactor = getJdbcTemplate().queryForObject(selectMinExpansionFactorSql, Double.class); + //set plot_weight = expansion_factor / minExpansionFactor + String updatePlotWeightSql = String.format(Locale.US, "UPDATE %splot SET %s=%s/%.5f", schemaName, PLOT_WEIGHT, EXPANSION_FACTOR, minExpansionFactor); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + getJdbcTemplate().update(updatePlotWeightSql); + } + private String getSchemaPrefix() { + return schemaService.getSchemaPrefix( getExportType() ); } + private void createWeightFactors(){ + final String schemaName = getSchemaPrefix(); + getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + EXPANSION_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + PLOT_WEIGHT + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + + /** + * This is the "old way"of assigning an expansion factor (the area in hectares that a plot represents) to a plot based on the information form the "region_areas.csv" file. + * @return True if there was a region_areas.csv file, false if not present so that areas were not assigned. + */ + private boolean addAreasPerRegion() { + + final File regionAreas = new File( localPropertiesService.getProjectFolder() + File.separatorChar + REGION_AREAS_CSV); + String schemaName = getSchemaPrefix(); + + if (regionAreas.exists()) { + + try( CSVReader csvReader = CsvReaderUtils.getCsvReader(regionAreas.getAbsolutePath()) ) { + + String[] csvLine = null; + + while( ( csvLine = csvReader.readNext() ) != null ){ + try { + String region = csvLine[0]; + String plotFile = csvLine[1]; + int areaHectares = Integer.parseInt( csvLine[2] ); + final Float plotWeight = 1f; // The plot weight will always be calculated in a later step + + Object[] parameters = new String[]{region,plotFile}; + + Integer plotsInRegion = getJdbcTemplate().queryForObject( + "SELECT count( DISTINCT "+EarthConstants.PLOT_ID+") FROM " + schemaName + "plot WHERE ( region=? OR plot_file=? ) AND land_use_category != '"+NO_DATA_LAND_USE+"' ", + Integer.class, + parameters); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + Float expansionFactorHectaresCalc = 0f; + if( plotsInRegion.intValue() != 0 ){ + expansionFactorHectaresCalc = (float)areaHectares / (float) plotsInRegion.intValue(); + } + + final Object[] updateValues = new Object[4]; + updateValues[0] = expansionFactorHectaresCalc; + updateValues[1] = plotWeight; + updateValues[2] = region; + updateValues[3] = plotFile; + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+EXPANSION_FACTOR+"=?, "+PLOT_WEIGHT+"=? WHERE region=? OR plot_file=?", updateValues); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + } catch (NumberFormatException e) { + logger.error("Possibly the header", e); //$NON-NLS-1$ + } + + } + + // FINALLY ASSIGN A WEIGHT OF CERO AND AN EXPANSION FACTOR OF 0 FOR THE PLOTS WITH NO_DATA + + final Object[] updateNoDataValues = new Object[3]; + updateNoDataValues[0] = 0; + updateNoDataValues[1] = 0; + updateNoDataValues[2] = NO_DATA_LAND_USE; + + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+EXPANSION_FACTOR+"=?, "+PLOT_WEIGHT+"=? WHERE land_use_category=?", updateNoDataValues); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + + } catch (FileNotFoundException e) { + logger.error("File not found?", e); //$NON-NLS-1$ + } catch (Exception e) { + logger.error("Error reading the CSV file", e); //$NON-NLS-1$ + } - private String getFileExtension(File file) { - String fileName = file.getName(); - int lastIndexOf = fileName.lastIndexOf('.' ); - String fileExtenxion = null; - if( lastIndexOf >0 ){ - fileExtenxion = fileName.substring( lastIndexOf + 1 ); + return true; + }else{ + logger.warn("No CSV " + REGION_AREAS_CSV + " present, calculating areas will not be possible"); //$NON-NLS-1$ + return false; } - return fileExtenxion; + } - private boolean isFileExtensionValid(File file ){ - String fileExtension = getFileExtension(file); - return fileExtension!=null && ( DataFormat.COLLECT_COORDS.checkFileExtensionMatches(fileExtension) || DataFormat.PROJECT_DEFINITION_FILE.checkFileExtensionMatches(fileExtension) || DataFormat.KML_FILE.checkFileExtensionMatches(fileExtension) ); + private void handleNumberOfShrubs() { + String schemaName = getSchemaPrefix(); + // This is specific to the Global Forest Survey - Drylands monitoring assessment + if( + AnalysisSaikuService.surveyContains(SHRUB_COUNT, earthSurveyService.getCollectSurvey() ) + && + AnalysisSaikuService.surveyContains(MANY_SHRUBS, earthSurveyService.getCollectSurvey() ) + ){ + // First set the number of shrubs to 30 if the user assessed that there were more than 30 shrubs on the plot + // This way we get a conservative estimation + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+SHRUB_COUNT+"=30 WHERE " + MANY_SHRUBS + "='1'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + SHRUBS_PER_EXP_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+SHRUBS_PER_EXP_FACTOR+"="+EXPANSION_FACTOR+"*2*" + SHRUB_COUNT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + } } - /* - * We support both copy and move actions. - * (non-Javadoc) - * @see javax.swing.TransferHandler#getSourceActions(javax.swing.JComponent) - */ - @Override - public int getSourceActions(JComponent c) { - return COPY_OR_MOVE; + private void handleNumberOfTrees() { + String schemaName = getSchemaPrefix(); + // This is specific to the Global Forest Survey - Drylands monitoring assessment + if( + AnalysisSaikuService.surveyContains(TREE_COUNT, earthSurveyService.getCollectSurvey() ) + && + AnalysisSaikuService.surveyContains(MANY_TREES, earthSurveyService.getCollectSurvey() ) + ){ + // First set the number of shrubs to 30 if the user assessed that there were more than 30 shrubs on the plot + // This way we get a conservative estimation + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+TREE_COUNT+"=30 WHERE " + MANY_TREES + "='1'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + TREES_PER_EXP_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+TREES_PER_EXP_FACTOR+"="+EXPANSION_FACTOR+"*2*" + TREE_COUNT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + } } + private boolean addAreasPerAttribute() { - /* - * Perform the actual import. This demo only supports drag and drop. - * (non-Javadoc) - * @see javax.swing.TransferHandler#importData(javax.swing.TransferHandler.TransferSupport) - */ - @Override - public boolean importData(TransferSupport info) { - if (!info.isDrop()) { - return false; - } + final File areasPerAttribute = new File( localPropertiesService.getProjectFolder() + File.separatorChar + ATTRIBUTE_AREAS_CSV); + String schemaName = getSchemaPrefix(); - // Get the file that is being dropped. - Transferable t = info.getTransferable(); - List data; - try { - data = (List)t.getTransferData(DataFlavor.javaFileListFlavor); - if( data.size()!=1){ - throw new IllegalArgumentException("The drop action supports only single file drops!"); - } + if (areasPerAttribute.exists()) { - File fileToImport = data.get(0); + try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(areasPerAttribute.getAbsolutePath(), false) ){ + // The header (first line) should contain the names of the three columns : attribute_name,area - if( !isFileExtensionValid(fileToImport)){ - throw new IllegalArgumentException("The drop action supports only files of type!" + DataFormat.COLLECT_COORDS + " or " + DataFormat.PROJECT_DEFINITION_FILE); - } + String[] columnNames = csvReader.readNext(); + - String fileExtension = getFileExtension(fileToImport); + ArrayList attributeNames = new ArrayList(); - // If it is a CEP file then import - if( DataFormat.PROJECT_DEFINITION_FILE.checkFileExtensionMatches(fileExtension)){ - EarthApp.openProjectFileInRunningCollectEarth( fileToImport.getAbsolutePath() ); - }else if( DataFormat.COLLECT_COORDS.checkFileExtensionMatches(fileExtension)){ + if(columnNames.length < 2 ){ + throw new RuntimeException("The " + areasPerAttribute.getAbsolutePath() + " file needs have this format : attribute_name1,attribute_name2,...attribute_nameN,"+AREA_CSV_COLUMN+"./nAt least one attribute is necessary. This would be the attribute or attributes (their name in the survey definition) that would relate the plot with its expansion factor"); + } - importCSVWithPlots(fileToImport); + // The weight column has been removed in the latest versions of the areas per attribute csv + // Lets add it again for backward compatibility + boolean weightColumnPresent = columnNames[columnNames.length -1].equalsIgnoreCase(WEIGHT_CSV_COLUMN); + if( ! weightColumnPresent ) { + // We need to create anew array with an extra item + String[] longer = new String[columnNames.length + 1]; + for (int i = 0; i < columnNames.length; i++) + longer[i] = columnNames[i]; + longer[columnNames.length] = WEIGHT_CSV_COLUMN; // add the + columnNames = longer; + } - }else if( DataFormat.KML_FILE.checkFileExtensionMatches( fileExtension ) ) { + for( int colPosition = 0; colPosition batchArgs = new ArrayList<>(); + int line = 1; + String[] csvLine = null; + while( ( csvLine = csvReader.readNext() ) != null ){ + try{ + float areaHectares = Float.parseFloat( csvLine[ columnNames.length-2 ] ); + final Float plotWeight = weightColumnPresent ? Float.parseFloat( csvLine[columnNames.length -1] ) : 1; // if no weight column present we assume same weight for all plots + + List attributeValues = extractAttributeValues(csvLine, attributeNames); + + Integer plotCountPerAttributes = getJdbcTemplate().queryForObject(plotCountSelectQuery, Integer.class, attributeValues.toArray()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + // Calculate the expansion factor: simply the division of the area for the selected attributes by the amount of plots that match the attribute values + Float expansionFactorHectaresCalc = 0f; + if( plotCountPerAttributes.intValue() != 0 ){ + expansionFactorHectaresCalc = areaHectares / (float) plotCountPerAttributes.intValue(); + } + + // Add the expansion factor and plot_weight to the values that will be sent with the update + attributeValues.add(0, expansionFactorHectaresCalc); + attributeValues.add(1, plotWeight); + + batchArgs.add(attributeValues.toArray()); + }catch( Exception e5){ + logger.error("Problem in line number " + line + " with values " + Arrays.toString( csvLine ), e5 ); + }finally{ + line++; + } + } + getJdbcTemplate().batchUpdate(updatePlotQuery, batchArgs); + } catch (FileNotFoundException e) { + logger.error("File not found?", e); //$NON-NLS-1$ + } catch (Exception e) { + logger.error("Error reading the CSV file", e); //$NON-NLS-1$ } - } - catch (Exception e) { - logger.error("Error on the drop action", e); + return true; + }else{ + logger.warn("No CSV " + ATTRIBUTE_AREAS_CSV + " present, calculating areas will not be possible"); //$NON-NLS-1$ return false; } + } + private List extractAttributeValues(String[] csvLine, List attributeNames) { + List values = new ArrayList<>(attributeNames.size()); + for(int colIndex = 0; colIndex < attributeNames.size(); colIndex++) { + String stringValue = csvLine[colIndex]; + String attributeName = attributeNames.get(colIndex); + Object value = getTypedValue(attributeName, stringValue); + values.add(value); + } + return values; + } + private Object getTypedValue(String attributeName, String stringValue) { + EntityDefinition rootEntityDef = earthSurveyService.getRootEntityDefinition(); + NodeDefinition attributeDef = rootEntityDef.getChildDefinition(attributeName); + if (attributeDef instanceof BooleanAttributeDefinition) { + return Boolean.TRUE.toString().equalsIgnoreCase(stringValue) || "1".equals(stringValue); + } else { + return stringValue; + } + } + private boolean isAttributeInPlotEntity(String attributeName) { + EntityDefinition rootEntityDefinition = earthSurveyService.getRootEntityDefinition(); + try { + rootEntityDefinition.getChildDefinition(attributeName); + } catch (Exception e) { + // The attribute does not exist under the plot entity + return false; + } return true; } + public ExportType getExportType() { + return exportType; + } - private void importCSVWithPlots(File fileToImport) { - try{ - localPropertiesService.setValue( EarthProperty.SAMPLE_FILE, fileToImport.getAbsolutePath() ); - EarthApp.executeKmlLoadAsynchronously( collectEarthWindow.getFrame() ); - }catch( Exception kmlGenerationException ){ - logger.error( "Problem loading CSV file dropped into the window" , kmlGenerationException ); - EarthApp.showMessage(" Problem loading CSV file" + kmlGenerationException.getCause() ); - } + public void setExportType(ExportType exportType) { + this.exportType = exportType; + } + + private JdbcTemplate getJdbcTemplate() { + return jdbcTemplate; + } + + private void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; } From 2978f9bfbab1e3d082a389b320b99dd68aef3b34 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:40 +0100 Subject: [PATCH 0235/1620] New translations RDBConnector.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 517 ++---------------- 1 file changed, 57 insertions(+), 460 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 4c34fd0a7f..70e2ecd6d6 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,460 +1,57 @@ -package org.openforis.collect.earth.app.view; - -import java.awt.event.ActionListener; -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.ButtonGroup; -import javax.swing.JCheckBoxMenuItem; -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JMenu; -import javax.swing.JMenuBar; -import javax.swing.JMenuItem; -import javax.swing.JOptionPane; -import javax.swing.JRadioButtonMenuItem; -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.SystemUtils; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.core.LoggerContext; -import org.apache.logging.log4j.core.config.Configuration; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants.UI_LANGUAGE; -import org.openforis.collect.earth.app.logging.JSwingAppender; -import org.openforis.collect.earth.app.service.AnalysisSaikuService; -import org.openforis.collect.earth.app.service.BackupSqlLiteService; -import org.openforis.collect.earth.app.service.DataImportExportService; -import org.openforis.collect.earth.app.service.EarthProjectsService; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.FolderFinder; -import org.openforis.collect.earth.app.service.IPCCGeneratorService; -import org.openforis.collect.earth.app.service.KmlImportService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.MissingPlotService; -import org.openforis.collect.earth.app.view.ExportActionListener.RecordsToExport; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public class CollectEarthMenu extends JMenuBar implements InitializingBean { - - @Autowired - private transient DataImportExportService dataImportExportService; - - @Autowired - private transient KmlImportService kmlImportService; - - @Autowired - private transient MissingPlotService missingPlotService; - - @Autowired - private transient AnalysisSaikuService analysisSaikuService; - - @Autowired - private transient IPCCGeneratorService ipccGeneratorService; - - @Autowired - private transient LocalPropertiesService localPropertiesService; - - @Autowired - private transient CollectEarthWindow collectEarthWindow; - - @Autowired - private transient EarthSurveyService earthSurveyService; - - @Autowired - private transient EarthProjectsService earthProjectsService; - - @Autowired - private transient BackupSqlLiteService backupSqlLiteService; - - @Autowired - private transient RemovePlotsFromDBDlg removePlotsFromDBDlg; - - @Autowired - private transient EarthProjectsService projectsService; - - private static final long serialVersionUID = -2457052260968029351L; - private final List serverMenuItems = new ArrayList<>(); - private JFrame frame; - private final transient org.slf4j.Logger logger = LoggerFactory.getLogger(CollectEarthMenu.class); - - public CollectEarthMenu() { - // Where the GUI is created: - super(); - } - - protected void init() { - setFrame(collectEarthWindow.getFrame()); - - // Build file menu in the menu bar. - this.add( getFileMenu() ); - - // Build tools menu in the menu bar. - this.add(getToolsMenu()); - - // Build help menu in the menu bar. - this.add(getHelpMenu()); - } - - @Override - public void afterPropertiesSet() throws Exception { - init(); - } - - @Override - public JMenu getHelpMenu() { - JMenu menuHelp = new JMenu(Messages.getString("CollectEarthWindow.16")); //$NON-NLS-1$ - JMenuItem menuItem; - File surveyGuide = earthSurveyService.getSurveyGuide(); - if( surveyGuide != null ) { - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.70")); //$NON-NLS-1$ - menuItem.addActionListener( (e) -> CollectEarthUtils.openFile( surveyGuide) ); - menuHelp.add(menuItem); - menuHelp.addSeparator(); - } - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.56")); //$NON-NLS-1$ - menuItem.addActionListener(new OpenAboutDialogListener(frame, Messages.getString("CollectEarthWindow.62"))); //$NON-NLS-1$ - menuHelp.add(menuItem); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.17")); //$NON-NLS-1$ - menuItem.addActionListener( - new OpenTextFileListener(frame, getDisclaimerFilePath(), Messages.getString("CollectEarthWindow.4")));//$NON-NLS-1$ - menuHelp.add(menuItem); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.50")); //$NON-NLS-1$ - menuItem.addActionListener( (e) -> CollectEarthUtils.openFile( new File("UserManual.pdf"))); - menuHelp.add(menuItem); - - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.64")); //$NON-NLS-1$ - menuItem.addActionListener(new OpenSupportForum()); - menuHelp.add(menuItem); - - menuHelp.addSeparator(); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.52")); //$NON-NLS-1$ - menuItem.addActionListener( - new OpenTextFileListener(frame, getLogFilePath(), Messages.getString("CollectEarthWindow.53"))); //$NON-NLS-1$ - menuHelp.add(menuItem); - - JCheckBoxMenuItem checkboxErrors = new JCheckBoxMenuItem("Show exception errors", localPropertiesService.isExceptionShown() ); //$NON-NLS-1$ - checkboxErrors.addActionListener( e -> { - // This sets/unsets the property that is checked when an exception is catch by the JSwingAppender log4j2 appender - - Boolean showException = checkboxErrors.isSelected(); - localPropertiesService.setExceptionShown( showException ); - - final LoggerContext ctx = (LoggerContext) LogManager.getContext(false); - final Configuration config = ctx.getConfiguration(); - - JSwingAppender jSwingAppender = config.getAppender("jswing-log"); - - jSwingAppender.setExceptionShown( showException ); - } - - ); - menuHelp.add(checkboxErrors); - - - menuHelp.addSeparator(); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.51")); //$NON-NLS-1$ - menuItem.addActionListener(new CheckForUpdatesListener()); - menuHelp.add(menuItem); - return menuHelp; - } - - private JMenu getToolsMenu() { - JMenu toolsMenu = new JMenu(Messages.getString("CollectEarthWindow.12")); //$NON-NLS-1$ - - addImportExportMenu(toolsMenu); - - JMenuItem menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.14")); //$NON-NLS-1$ - menuItem.addActionListener(getSaikuAnalysisActionListener()); - toolsMenu.add(menuItem); - - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.71")); //$NON-NLS-1$ - menuItem.addActionListener(getSaikuToolExportActionListener()); - menuItem.setEnabled(SystemUtils.IS_OS_WINDOWS ); // This option is only available in Windows!! - toolsMenu.add(menuItem); - -/* - toolsMenu.addSeparator(); - menuItem = new JMenuItem("Generate IPCC GHGi software LULUCF package"); //$NON-NLS-1$ - menuItem.addActionListener(getIPCCExportActionListener()); - toolsMenu.add(menuItem); - - - toolsMenu.addSeparator(); -*/ - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.54")); //$NON-NLS-1$ - menuItem.addActionListener(new ApplyOptionChangesListener(this.getFrame(), localPropertiesService) { - - @Override - protected void applyProperties() { - - try { - if (kmlImportService.prompToOpenKml(getFrame())) { - restartEarth(); - } - } catch (Exception e1) { - JOptionPane.showMessageDialog(getFrame(), e1.getMessage(), - Messages.getString("CollectEarthWindow.63"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - logger.error("Error importing KML file", e1); //$NON-NLS-1$ - } - - } - - }); - serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is - // acting as a client ) - toolsMenu.add(menuItem); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.67")); //$NON-NLS-1$ - menuItem.addActionListener( e-> { - try { - CollectEarthUtils.openFolderInExplorer(FolderFinder.getCollectEarthDataFolder()); - } catch (IOException e1) { - logger.error("Could not find the data folder", e1); - } - }); - serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is - // acting as a client ) - toolsMenu.add(menuItem); - - toolsMenu.addSeparator(); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.15")); //$NON-NLS-1$ - menuItem.addActionListener(getPropertiesAction(frame)); - toolsMenu.add(menuItem); - toolsMenu.add(getUtilitiesMenu() ); - - toolsMenu.addSeparator(); - toolsMenu.add(getLanguageMenu()); - return toolsMenu; - } - - private JMenu getUtilitiesMenu() { - JMenuItem menuItem; - JMenu utilities = new JMenu(Messages.getString("CollectEarthMenu.2")); //$NON-NLS-1$ - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.18")); //$NON-NLS-1$ - menuItem.addActionListener(new MissingPlotsListener(frame, localPropertiesService, missingPlotService)); - serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is - // acting as a client ) - - utilities.add(menuItem); - - menuItem = new JMenuItem(Messages.getString("CollectEarthMenu.3")); //$NON-NLS-1$ - menuItem.addActionListener( e -> FileDividerToolDlg.open(frame, earthSurveyService.getCollectSurvey()) ); - serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is // acting as a client ) - utilities.add(menuItem); - - menuItem = new JMenuItem("Delete Plots from DB using CSV"); - menuItem.addActionListener( e -> removePlotsFromDBDlg.open(frame, earthSurveyService.getCollectSurvey()) ); - utilities.add(menuItem); - - - utilities.add(menuItem); - return utilities; - } - - private JMenu getFileMenu() { - JMenu fileMenu = new JMenu(Messages.getString("CollectEarthWindow.10")); //$NON-NLS-1$ - - JMenuItem menuItem = new JMenuItem(Messages.getString("CollectEarthMenu.0")); //$NON-NLS-1$ - menuItem.addActionListener(new ApplyOptionChangesListener(this.getFrame(), localPropertiesService) { - - @Override - protected void applyProperties() { - final File[] selectedProjectFile = JFileChooserExistsAware.getFileChooserResults( - DataFormat.PROJECT_DEFINITION_FILE, false, false, null, localPropertiesService, - getFrame() ); - - if (selectedProjectFile != null && selectedProjectFile.length == 1) { - try { - projectsService.loadCompressedProjectFile(selectedProjectFile[0]); - - restartEarth(); - } catch (Exception e1) { - JOptionPane.showMessageDialog( getFrame(), e1.getMessage(), - Messages.getString("OptionWizard.51"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - logger.error("Error importing project file " + selectedProjectFile[0].getAbsolutePath(), e1); //$NON-NLS-1$ - } - } - } - }); - fileMenu.add(menuItem); - this.add(fileMenu); - fileMenu.addSeparator(); - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.11")); //$NON-NLS-1$ - menuItem.addActionListener(collectEarthWindow.getCloseActionListener()); - fileMenu.add(menuItem); - return fileMenu; - } - - private void addImportExportMenu(JMenu menu) { - - final JMenu ieSubmenu = new JMenu(Messages.getString("CollectEarthWindow.44")); //$NON-NLS-1$ - JMenuItem menuItem; - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.13")); //$NON-NLS-1$ - menuItem.addActionListener(getExportActionListener(DataFormat.CSV, RecordsToExport.ALL)); - ieSubmenu.add(menuItem); - - final JMenu xmlExportSubmenu = new JMenu(Messages.getString("CollectEarthWindow.24")); //$NON-NLS-1$ - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.45")); //$NON-NLS-1$ - menuItem.addActionListener(getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.ALL)); - xmlExportSubmenu.add(menuItem); - - final JMenuItem exportModifiedRecords = new JMenuItem(Messages.getString("CollectEarthWindow.61")); //$NON-NLS-1$ - exportModifiedRecords.addActionListener( - getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.MODIFIED_SINCE_LAST_EXPORT)); - xmlExportSubmenu.add(exportModifiedRecords); - - final JMenuItem exportDataRangeRecords = new JMenuItem(Messages.getString("CollectEarthMenu.4")); //$NON-NLS-1$ - exportDataRangeRecords - .addActionListener(getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.PICK_FROM_DATE)); - xmlExportSubmenu.add(exportDataRangeRecords); - - ieSubmenu.add(xmlExportSubmenu); - - final JMenu backupExportSubmenu = new JMenu(Messages.getString("CollectEarthMenu.5")); //$NON-NLS-1$ - - final JMenuItem exportDataBackup = new JMenuItem(Messages.getString("CollectEarthMenu.6")); //$NON-NLS-1$ - exportDataBackup.addActionListener(getExportActionListener(DataFormat.COLLECT_BACKUP, RecordsToExport.ALL)); - backupExportSubmenu.add(exportDataBackup); - - final JMenuItem exportDataRangeBackup = new JMenuItem(Messages.getString("CollectEarthMenu.7")); //$NON-NLS-1$ - exportDataRangeBackup - .addActionListener(getExportActionListener(DataFormat.COLLECT_BACKUP, RecordsToExport.PICK_FROM_DATE)); - backupExportSubmenu.add(exportDataRangeBackup); - - ieSubmenu.add(backupExportSubmenu); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.6")); //$NON-NLS-1$ - menuItem.addActionListener(getExportActionListener(DataFormat.FUSION, RecordsToExport.ALL)); - ieSubmenu.add(menuItem); - - ieSubmenu.addSeparator(); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.46")); //$NON-NLS-1$ - menuItem.addActionListener(getImportActionListener(DataFormat.ZIP_WITH_XML)); - ieSubmenu.add(menuItem); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.55")); //$NON-NLS-1$ - menuItem.addActionListener(getImportActionListener(DataFormat.CSV)); - ieSubmenu.add(menuItem); - - menu.add(ieSubmenu); - - serverMenuItems.add(ieSubmenu); // This menu should only be shown if the DB is local ( not if Collect Earth is - // acting as a client ) - } - - private String getDisclaimerFilePath() { - final String suffixLang = localPropertiesService.getUiLanguage().getLocale().getLanguage(); - if (new File("resources/disclaimer_" + suffixLang + ".txt").exists()) { //$NON-NLS-1$ //$NON-NLS-2$ - return "resources/disclaimer_" + suffixLang + ".txt"; - } else { - return "resources/disclaimer_en.txt"; - } - } - - private ActionListener getExportActionListener(final DataFormat exportFormat, final RecordsToExport xmlExportType) { - return new ExportActionListener(exportFormat, xmlExportType, getFrame(), localPropertiesService, - dataImportExportService, earthSurveyService); - } - - private ActionListener getImportActionListener(final DataFormat importFormat) { - return new ImportActionListener(importFormat, getFrame(), localPropertiesService, dataImportExportService); - } - - private JMenu getLanguageMenu() { - - final ActionListener actionLanguage = e -> { - try { - final String langName = ((JRadioButtonMenuItem) e.getSource()).getName(); - final UI_LANGUAGE language = UI_LANGUAGE.valueOf(langName); - CollectEarthUtils.setFontDependingOnLanguaue(language); - localPropertiesService.setUiLanguage(language); - - SwingUtilities.invokeLater( () -> { - getFrame().getContentPane().removeAll(); - getFrame().dispose(); - collectEarthWindow.openWindow(); - }); - - } catch (final Exception ex) { - logger.error("Error while changing language", ex); //$NON-NLS-1$ - } - }; - - final JMenu menuLanguage = new JMenu(Messages.getString("CollectEarthWindow.2")); //$NON-NLS-1$ - - final ButtonGroup group = new ButtonGroup(); - final UI_LANGUAGE[] languages = UI_LANGUAGE.values(); - - for (final UI_LANGUAGE language : languages) { - final JRadioButtonMenuItem langItem = new JRadioButtonMenuItem(language.getLabel()); - langItem.setName(language.name()); - langItem.addActionListener(actionLanguage); - menuLanguage.add(langItem); - group.add(menuLanguage); - if (localPropertiesService.getUiLanguage().equals(language)) { - langItem.setSelected(true); - } - - } - - return menuLanguage; - } - - public ActionListener getPropertiesAction(final JFrame owner) { - return e -> { - final JDialog dialog = new PropertiesDialog(owner, localPropertiesService, earthProjectsService, - backupSqlLiteService.getAutomaticBackUpFolder().getPath(), analysisSaikuService, - earthSurveyService.getCollectSurvey()); - dialog.setVisible(true); - dialog.pack(); - }; - } - - private ActionListener getSaikuAnalysisActionListener() { - return new GenerateRDBAnalysisListener(getFrame(), new GenerateDatabaseStarter(analysisSaikuService, getFrame() ) ); - } - - private ActionListener getSaikuToolExportActionListener() { - return new SaikuToolExportListener(getFrame(), new GenerateDatabaseStarter(analysisSaikuService, getFrame() ), localPropertiesService); - } - - - private ActionListener getIPCCExportActionListener() { - return new IPCCGeneratorListener(getFrame(), new GenerateDatabaseStarter(ipccGeneratorService, getFrame() ) ); - } - - private String getLogFilePath() { - return FolderFinder.getCollectEarthDataFolder() + "/earth_error.log"; //$NON-NLS-1$ - } - - public JFrame getFrame() { - return frame; - } - - public void setFrame(JFrame frame) { - this.frame = frame; - } - - public List getServerMenuItems() { - return serverMenuItems; - } -} +package org.openforis.collect.earth.app.service; + +import java.sql.Connection; + +import javax.sql.DataSource; + +import org.apache.commons.dbcp.BasicDataSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.DataSourceUtils; + +public abstract class RDBConnector { + @Autowired + @Qualifier("rdbDataSource") + private DataSource rdbDataSource; + + @Autowired + @Qualifier("rdbDataSourceIpcc") + private BasicDataSource rdbDataSourceIpcc; + + private JdbcTemplate jdbcTemplate; + + private ExportType exportTypeUsed; + + public JdbcTemplate getJdbcTemplate() { + if( jdbcTemplate == null ) { + if( getExportTypeUsed().equals( ExportType.SAIKU) ) { + jdbcTemplate = new JdbcTemplate(rdbDataSource); + }else if( getExportTypeUsed().equals( ExportType.IPCC ) ){ + jdbcTemplate = new JdbcTemplate(rdbDataSourceIpcc); + }else { + throw new IllegalArgumentException("The ExportType has not been set yet"); + } + } + return jdbcTemplate; + } + + protected Connection getJDBCConnection() { + if( getExportTypeUsed().equals( ExportType.SAIKU ) ) { + return DataSourceUtils.getConnection(rdbDataSource); + }else if( getExportTypeUsed().equals( ExportType.IPCC ) ){ + return DataSourceUtils.getConnection(rdbDataSourceIpcc); + }else { + throw new IllegalArgumentException("The ExportType has not been set yet"); + } + } + + public ExportType getExportTypeUsed() { + return exportTypeUsed; + } + + public void setExportTypeUsed(ExportType exportTypeUsed) { + this.exportTypeUsed = exportTypeUsed; + } + +} From 6fce37174c008b514810c8a4876002dc021c02b8 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:41 +0100 Subject: [PATCH 0236/1620] New translations RDBConnector.java (English) --- .../earth/app/view/Messages_en.properties | 255 ++++-------------- 1 file changed, 57 insertions(+), 198 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 758b0b1b1a..70e2ecd6d6 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,198 +1,57 @@ -package org.openforis.collect.earth.app.service; - -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.net.URL; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Properties; -import java.util.concurrent.TimeUnit; - -import javax.xml.parsers.DocumentBuilderFactory; - -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.w3c.dom.Document; - -public class UpdateIniUtils { - - private static final String VERSION_ID = "version_id"; - private static final String VERSION_NAME = "version"; - private static final Logger logger = LoggerFactory.getLogger(UpdateIniUtils.class); - private final SimpleDateFormat fromXml = new SimpleDateFormat("yyyyMMddHHmm"); - public static final String UPDATE_INI = "update.ini"; - - /** - * Checks if there is a newer version of the Collect Earth updater available - * @return The new version build-number if there is a new version. Null if the version online is not newer than the one installed - */ - public String getVersionAvailableOnline(){ - - String installedVersionBuild = getVersionInstalled(); - String urlXmlUpdaterOnline = getValueFromUpdateIni("url", UPDATE_INI); //$NON-NLS-1$ - String onlineVersionBuild = getVersionBuild(urlXmlUpdaterOnline); - - - try { - long installedBuild = Long.parseLong(installedVersionBuild); - long onlineBuild = Long.parseLong(onlineVersionBuild); - - if( onlineBuild > installedBuild ){ - return onlineBuild+""; //$NON-NLS-1$ - } - - } catch (NumberFormatException e) { - logger.error("Error parsing the buildNumber ", e); //$NON-NLS-1$ - } - - return null; - } - - public static String getVersionInstalled() { - return getValueFromUpdateIni(VERSION_ID, UPDATE_INI); //$NON-NLS-1$ - } - - public static String getReleaseNameInstalled() { - return getValueFromUpdateIni(VERSION_NAME, UPDATE_INI); //$NON-NLS-1$ - } - - public boolean shouldWarnUser(LocalPropertiesService localPropertiesService){ - boolean warnUser = false; - - // newVersionAvailable will be null if the version installed is not older than the current version of the updater - String currentVersionOnline = getVersionAvailableOnline(); - - if( !StringUtils.isBlank( currentVersionOnline ) ){ - - // There is a new version. did the user chose "Not to be bother"with this update? - String lastIgnoredBuildNumber = localPropertiesService.getValue(EarthProperty.LAST_IGNORED_UPDATE); - - if( - ( isCurrentNewerThanIgnoredUpdate(lastIgnoredBuildNumber, currentVersionOnline) && isMajorUpdate()) - || - isInstalledOlderThanOneMonth(currentVersionOnline, getVersionInstalled() ) - ){ - warnUser = true; - } - - } - return warnUser; - } - - - /** - * Check if the current version of the updater is newer than the version of the updater that was last ignored - * @param lastIgnoredBuildNumber The version of the last ignored updater as a string with the format yyyyMMddHHmm - * @param buildNumberOnline The version of the current updater in the server in the format yyyyMMddHHmm - * @return True is the new version of the updater is newer than the one last ignored. False otherwise - */ - private boolean isCurrentNewerThanIgnoredUpdate(String lastIgnoredBuildNumber, String buildNumberOnline){ - - boolean isNewerThanIgnored = true; - - try { - if( !StringUtils.isEmpty(lastIgnoredBuildNumber) && !StringUtils.isEmpty(buildNumberOnline) ){ - Long ignoredBuildNumberUpdate =new Long(lastIgnoredBuildNumber); - Long buildOnline = new Long( buildNumberOnline ); - - isNewerThanIgnored = ignoredBuildNumberUpdate 30); - } catch (Exception e) { - logger.error( "Error calculating difference in dates bvetween installed and available versions", e ); - } - - return isOlderThanOneMonth; - } - - - /** - * Checks if the update in the server is a "Major"update, meaning that every user should update Collect Earth - * @return True if the version on the server should be installed by all users - */ - public boolean isMajorUpdate() { - String urlXmlUpdaterOnline = getValueFromUpdateIni("url", UPDATE_INI); //$NON-NLS-1$ - String majorUpdateString = getXmlValueFromTag(urlXmlUpdaterOnline, VERSION_NAME); - return majorUpdateString.toLowerCase().contains("major"); - } - - private String getVersionBuild(String urlXmlUpdate) { - String tagname = "versionId"; //$NON-NLS-1$ - return getXmlValueFromTag(urlXmlUpdate, tagname); - } - - public String getXmlValueFromTag(String urlXmlUpdate, String tagname) { - - String onlineVersion = "0"; //$NON-NLS-1$ - try { - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - //factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); // Compliant - //factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); // compliant - - factory.setNamespaceAware(true); - Document parse = factory.newDocumentBuilder().parse(new URL(urlXmlUpdate).openStream()); - - onlineVersion = parse.getElementsByTagName(tagname).item(0).getChildNodes().item(0).getNodeValue(); - - logger.info("CE Online Version available {}" , onlineVersion); - } catch (Exception e) { - logger.warn("Error while reading the remote XML where the updater version is defined", e); //$NON-NLS-1$ - } - - return onlineVersion; - } - - public static String getValueFromUpdateIni(String key, String pathToUpdateIni) { - Properties properties = new Properties(); - String value = "unknown"; //$NON-NLS-1$ - try (FileInputStream fis = new FileInputStream(pathToUpdateIni) ){ - properties.load( fis ); - value = properties.getProperty(key); - } catch (FileNotFoundException e) { - logger.error("The update.ini file could not be found", e); //$NON-NLS-1$ - } catch (IOException e) { - logger.error("Error opening the update.ini file", e); //$NON-NLS-1$ - } - return value; - } - - public String convertToDate(String buildVersionNumber) { - SimpleDateFormat humanReadable = new SimpleDateFormat("yyyy-MM-dd"); - String reformattedStr = buildVersionNumber; - try { - - reformattedStr = humanReadable.format(fromXml.parse(buildVersionNumber)); - } catch (java.text.ParseException e) { - logger.error("Error parsing the date from the XML updater" , e ); - } - - return reformattedStr; - } -} +package org.openforis.collect.earth.app.service; + +import java.sql.Connection; + +import javax.sql.DataSource; + +import org.apache.commons.dbcp.BasicDataSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.DataSourceUtils; + +public abstract class RDBConnector { + @Autowired + @Qualifier("rdbDataSource") + private DataSource rdbDataSource; + + @Autowired + @Qualifier("rdbDataSourceIpcc") + private BasicDataSource rdbDataSourceIpcc; + + private JdbcTemplate jdbcTemplate; + + private ExportType exportTypeUsed; + + public JdbcTemplate getJdbcTemplate() { + if( jdbcTemplate == null ) { + if( getExportTypeUsed().equals( ExportType.SAIKU) ) { + jdbcTemplate = new JdbcTemplate(rdbDataSource); + }else if( getExportTypeUsed().equals( ExportType.IPCC ) ){ + jdbcTemplate = new JdbcTemplate(rdbDataSourceIpcc); + }else { + throw new IllegalArgumentException("The ExportType has not been set yet"); + } + } + return jdbcTemplate; + } + + protected Connection getJDBCConnection() { + if( getExportTypeUsed().equals( ExportType.SAIKU ) ) { + return DataSourceUtils.getConnection(rdbDataSource); + }else if( getExportTypeUsed().equals( ExportType.IPCC ) ){ + return DataSourceUtils.getConnection(rdbDataSourceIpcc); + }else { + throw new IllegalArgumentException("The ExportType has not been set yet"); + } + } + + public ExportType getExportTypeUsed() { + return exportTypeUsed; + } + + public void setExportTypeUsed(ExportType exportTypeUsed) { + this.exportTypeUsed = exportTypeUsed; + } + +} From 353270ae8827e0e3a6c77849bfc494c6f236d713 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:42 +0100 Subject: [PATCH 0237/1620] New translations RDBExporter.java (French) --- .../earth/app/view/Messages_fr.properties | 575 ++++++------------ 1 file changed, 199 insertions(+), 376 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 905f384f1e..8b698b71db 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,376 +1,199 @@ -package org.openforis.collect.earth.app.service; - -import java.io.File; -import java.io.FileNotFoundException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Locale; - -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.idm.metamodel.BooleanAttributeDefinition; -import org.openforis.idm.metamodel.EntityDefinition; -import org.openforis.idm.metamodel.NodeDefinition; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.stereotype.Component; - -import com.opencsv.CSVReader; - -@Component -public class RegionCalculationUtils{ - - private static final String AREA_CSV_COLUMN = "area"; - private static final String WEIGHT_CSV_COLUMN = "weight"; - private static final String PLOT_SET = "plot SET "; - private static final String UPDATE = "UPDATE "; - private static final String PLOT_ADD = "plot ADD "; - private static final String FLOAT = " FLOAT"; - private static final String ALTER_TABLE = "ALTER TABLE "; - private static final String ALTER_TABLE2 = ALTER_TABLE; - private static final String SHRUB_COUNT = "shrub_count"; - private static final String TREE_COUNT = "tree_count"; - private static final String REGION_AREAS_CSV = "region_areas.csv"; //$NON-NLS-1$ - private static final String ATTRIBUTE_AREAS_CSV = "areas_per_attribute.csv"; //$NON-NLS-1$ - private static final String PLOT_WEIGHT = "plot_weight"; //$NON-NLS-1$ - private static final String TREES_PER_EXP_FACTOR = "trees_per_expansion_factor"; //$NON-NLS-1$ - private static final String SHRUBS_PER_EXP_FACTOR = "shrubs_per_expansion_factor"; //$NON-NLS-1$ - private static final String NO_DATA_LAND_USE = "noData"; //$NON-NLS-1$ - private static final String MANY_TREES = "many_trees"; - private static final String MANY_SHRUBS = "many_shrubs"; - - public static final String EXPANSION_FACTOR = "expansion_factor"; //$NON-NLS-1$ - private final Logger logger = LoggerFactory.getLogger(RegionCalculationUtils.class); - - @Autowired - EarthSurveyService earthSurveyService; - - @Autowired - LocalPropertiesService localPropertiesService; - - @Autowired - private SchemaService schemaService; - - private JdbcTemplate jdbcTemplate; - - private ExportType exportType; - - public void handleRegionCalculation(ExportType exportType, JdbcTemplate jdbcTemplate){ - - try { - setExportType(exportType); - setJdbcTemplate(jdbcTemplate); - createWeightFactors(); - - // If the region_areas.csv is not present then try to add the areas "per attribute" using the file areas_per_attribute.csv - boolean areasAdded = false; - if(!addAreasPerRegion()){ - if( addAreasPerAttribute() ){ - areasAdded = true; - } - }else{ - areasAdded = true; - } - - if( areasAdded ){ - handleNumberOfTrees(); - handleNumberOfShrubs(); - recalculatePlotWeights(); - } - - } catch (Exception e) { - logger.error( "Error when calculating the expansion factors for the plots ", e); - } - } - - private void recalculatePlotWeights() { - String schemaName = getSchemaPrefix(); - String selectMinExpansionFactorSql = String.format("SELECT MIN(%s) FROM %splot", EXPANSION_FACTOR, schemaName); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - Double minExpansionFactor = getJdbcTemplate().queryForObject(selectMinExpansionFactorSql, Double.class); - //set plot_weight = expansion_factor / minExpansionFactor - String updatePlotWeightSql = String.format(Locale.US, "UPDATE %splot SET %s=%s/%.5f", schemaName, PLOT_WEIGHT, EXPANSION_FACTOR, minExpansionFactor); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - getJdbcTemplate().update(updatePlotWeightSql); - } - - private String getSchemaPrefix() { - return schemaService.getSchemaPrefix( getExportType() ); - } - - private void createWeightFactors(){ - final String schemaName = getSchemaPrefix(); - getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + EXPANSION_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + PLOT_WEIGHT + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - - /** - * This is the "old way"of assigning an expansion factor (the area in hectares that a plot represents) to a plot based on the information form the "region_areas.csv" file. - * @return True if there was a region_areas.csv file, false if not present so that areas were not assigned. - */ - private boolean addAreasPerRegion() { - - final File regionAreas = new File( localPropertiesService.getProjectFolder() + File.separatorChar + REGION_AREAS_CSV); - String schemaName = getSchemaPrefix(); - - if (regionAreas.exists()) { - - try( CSVReader csvReader = CsvReaderUtils.getCsvReader(regionAreas.getAbsolutePath()) ) { - - String[] csvLine = null; - - while( ( csvLine = csvReader.readNext() ) != null ){ - try { - String region = csvLine[0]; - String plotFile = csvLine[1]; - int areaHectares = Integer.parseInt( csvLine[2] ); - final Float plotWeight = 1f; // The plot weight will always be calculated in a later step - - Object[] parameters = new String[]{region,plotFile}; - - Integer plotsInRegion = getJdbcTemplate().queryForObject( - "SELECT count( DISTINCT "+EarthConstants.PLOT_ID+") FROM " + schemaName + "plot WHERE ( region=? OR plot_file=? ) AND land_use_category != '"+NO_DATA_LAND_USE+"' ", - Integer.class, - parameters); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - - Float expansionFactorHectaresCalc = 0f; - if( plotsInRegion.intValue() != 0 ){ - expansionFactorHectaresCalc = (float)areaHectares / (float) plotsInRegion.intValue(); - } - - final Object[] updateValues = new Object[4]; - updateValues[0] = expansionFactorHectaresCalc; - updateValues[1] = plotWeight; - updateValues[2] = region; - updateValues[3] = plotFile; - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+EXPANSION_FACTOR+"=?, "+PLOT_WEIGHT+"=? WHERE region=? OR plot_file=?", updateValues); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - - } catch (NumberFormatException e) { - logger.error("Possibly the header", e); //$NON-NLS-1$ - } - - } - - // FINALLY ASSIGN A WEIGHT OF CERO AND AN EXPANSION FACTOR OF 0 FOR THE PLOTS WITH NO_DATA - - final Object[] updateNoDataValues = new Object[3]; - updateNoDataValues[0] = 0; - updateNoDataValues[1] = 0; - updateNoDataValues[2] = NO_DATA_LAND_USE; - - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+EXPANSION_FACTOR+"=?, "+PLOT_WEIGHT+"=? WHERE land_use_category=?", updateNoDataValues); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - - - } catch (FileNotFoundException e) { - logger.error("File not found?", e); //$NON-NLS-1$ - } catch (Exception e) { - logger.error("Error reading the CSV file", e); //$NON-NLS-1$ - } - - return true; - }else{ - logger.warn("No CSV " + REGION_AREAS_CSV + " present, calculating areas will not be possible"); //$NON-NLS-1$ - return false; - } - - } - - - private void handleNumberOfShrubs() { - String schemaName = getSchemaPrefix(); - // This is specific to the Global Forest Survey - Drylands monitoring assessment - if( - AnalysisSaikuService.surveyContains(SHRUB_COUNT, earthSurveyService.getCollectSurvey() ) - && - AnalysisSaikuService.surveyContains(MANY_SHRUBS, earthSurveyService.getCollectSurvey() ) - ){ - // First set the number of shrubs to 30 if the user assessed that there were more than 30 shrubs on the plot - // This way we get a conservative estimation - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+SHRUB_COUNT+"=30 WHERE " + MANY_SHRUBS + "='1'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + SHRUBS_PER_EXP_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+SHRUBS_PER_EXP_FACTOR+"="+EXPANSION_FACTOR+"*2*" + SHRUB_COUNT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - } - } - - private void handleNumberOfTrees() { - String schemaName = getSchemaPrefix(); - // This is specific to the Global Forest Survey - Drylands monitoring assessment - if( - AnalysisSaikuService.surveyContains(TREE_COUNT, earthSurveyService.getCollectSurvey() ) - && - AnalysisSaikuService.surveyContains(MANY_TREES, earthSurveyService.getCollectSurvey() ) - ){ - // First set the number of shrubs to 30 if the user assessed that there were more than 30 shrubs on the plot - // This way we get a conservative estimation - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+TREE_COUNT+"=30 WHERE " + MANY_TREES + "='1'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + TREES_PER_EXP_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+TREES_PER_EXP_FACTOR+"="+EXPANSION_FACTOR+"*2*" + TREE_COUNT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - } - } - - private boolean addAreasPerAttribute() { - - final File areasPerAttribute = new File( localPropertiesService.getProjectFolder() + File.separatorChar + ATTRIBUTE_AREAS_CSV); - String schemaName = getSchemaPrefix(); - - if (areasPerAttribute.exists()) { - - try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(areasPerAttribute.getAbsolutePath(), false) ){ - // The header (first line) should contain the names of the three columns : attribute_name,area - - String[] columnNames = csvReader.readNext(); - - - ArrayList attributeNames = new ArrayList(); - - if(columnNames.length < 2 ){ - throw new RuntimeException("The " + areasPerAttribute.getAbsolutePath() + " file needs have this format : attribute_name1,attribute_name2,...attribute_nameN,"+AREA_CSV_COLUMN+"./nAt least one attribute is necessary. This would be the attribute or attributes (their name in the survey definition) that would relate the plot with its expansion factor"); - } - - // The weight column has been removed in the latest versions of the areas per attribute csv - // Lets add it again for backward compatibility - boolean weightColumnPresent = columnNames[columnNames.length -1].equalsIgnoreCase(WEIGHT_CSV_COLUMN); - if( ! weightColumnPresent ) { - // We need to create anew array with an extra item - String[] longer = new String[columnNames.length + 1]; - for (int i = 0; i < columnNames.length; i++) - longer[i] = columnNames[i]; - longer[columnNames.length] = WEIGHT_CSV_COLUMN; // add the - columnNames = longer; - } - - for( int colPosition = 0; colPosition batchArgs = new ArrayList<>(); - int line = 1; - String[] csvLine = null; - while( ( csvLine = csvReader.readNext() ) != null ){ - try{ - float areaHectares = Float.parseFloat( csvLine[ columnNames.length-2 ] ); - final Float plotWeight = weightColumnPresent ? Float.parseFloat( csvLine[columnNames.length -1] ) : 1; // if no weight column present we assume same weight for all plots - - List attributeValues = extractAttributeValues(csvLine, attributeNames); - - Integer plotCountPerAttributes = getJdbcTemplate().queryForObject(plotCountSelectQuery, Integer.class, attributeValues.toArray()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - - // Calculate the expansion factor: simply the division of the area for the selected attributes by the amount of plots that match the attribute values - Float expansionFactorHectaresCalc = 0f; - if( plotCountPerAttributes.intValue() != 0 ){ - expansionFactorHectaresCalc = areaHectares / (float) plotCountPerAttributes.intValue(); - } - - // Add the expansion factor and plot_weight to the values that will be sent with the update - attributeValues.add(0, expansionFactorHectaresCalc); - attributeValues.add(1, plotWeight); - - batchArgs.add(attributeValues.toArray()); - }catch( Exception e5){ - logger.error("Problem in line number " + line + " with values " + Arrays.toString( csvLine ), e5 ); - }finally{ - line++; - } - } - getJdbcTemplate().batchUpdate(updatePlotQuery, batchArgs); - } catch (FileNotFoundException e) { - logger.error("File not found?", e); //$NON-NLS-1$ - } catch (Exception e) { - logger.error("Error reading the CSV file", e); //$NON-NLS-1$ - } - - return true; - }else{ - logger.warn("No CSV " + ATTRIBUTE_AREAS_CSV + " present, calculating areas will not be possible"); //$NON-NLS-1$ - return false; - } - - } - - private List extractAttributeValues(String[] csvLine, List attributeNames) { - List values = new ArrayList<>(attributeNames.size()); - for(int colIndex = 0; colIndex < attributeNames.size(); colIndex++) { - String stringValue = csvLine[colIndex]; - String attributeName = attributeNames.get(colIndex); - Object value = getTypedValue(attributeName, stringValue); - values.add(value); - } - return values; - } - - private Object getTypedValue(String attributeName, String stringValue) { - EntityDefinition rootEntityDef = earthSurveyService.getRootEntityDefinition(); - NodeDefinition attributeDef = rootEntityDef.getChildDefinition(attributeName); - if (attributeDef instanceof BooleanAttributeDefinition) { - return Boolean.TRUE.toString().equalsIgnoreCase(stringValue) || "1".equals(stringValue); - } else { - return stringValue; - } - } - - private boolean isAttributeInPlotEntity(String attributeName) { - EntityDefinition rootEntityDefinition = earthSurveyService.getRootEntityDefinition(); - try { - rootEntityDefinition.getChildDefinition(attributeName); - } catch (Exception e) { - // The attribute does not exist under the plot entity - return false; - } - return true; - } - - public ExportType getExportType() { - return exportType; - } - - public void setExportType(ExportType exportType) { - this.exportType = exportType; - } - - private JdbcTemplate getJdbcTemplate() { - return jdbcTemplate; - } - - private void setJdbcTemplate(JdbcTemplate jdbcTemplate) { - this.jdbcTemplate = jdbcTemplate; - } - - -} +package org.openforis.collect.earth.app.service; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.swing.SwingUtilities; + +import org.apache.commons.lang3.SystemUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.core.rdb.RelationalSchemaContext; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.relational.CollectRDBPublisher; +import org.openforis.collect.relational.CollectRdbException; +import org.openforis.collect.relational.model.RelationalSchemaConfig; +import org.openforis.idm.metamodel.Survey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.CannotGetJdbcConnectionException; +import org.springframework.stereotype.Component; + +@Component +public class RDBExporter extends RDBConnector{ + + @Autowired + CollectRDBPublisher collectRDBPublisher; + + @Autowired + EarthSurveyService earthSurveyService; + + @Autowired + public LocalPropertiesService localPropertiesService; + + private final Logger logger = LoggerFactory.getLogger(RDBExporter.class); + + public static final String COLLECT_EARTH_IPCC_DATABASE_RDB_DB = + EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + + ServerController.IPCC_RDB_SUFFIX; + public static final String COLLECT_EARTH_SAIKU_DATABASE_RDB_DB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + + ServerController.SAIKU_RDB_SUFFIX; + + private boolean userCancelledOperation = false; + + private void removeOldRdb( ) { + + final List tables = new ArrayList<>(); + + if (localPropertiesService.isUsingSqliteDB()) { + + cleanSqlLiteDb( tables); + + } else if (localPropertiesService.isUsingPostgreSqlDB()) { + cleanPostgresDb(); + + } + + } + + private void cleanPostgresDb( ) { + getJdbcTemplate().execute("DROP SCHEMA IF EXISTS " + getExportTypeUsed().getRdbSchema() + " CASCADE"); //$NON-NLS-1$ //$NON-NLS-2$ + getJdbcTemplate().execute("CREATE SCHEMA IF NOT EXISTS " + getExportTypeUsed().getRdbSchema() ); //$NON-NLS-1$ + } + + public File getRdbFile( ExportType exportType) { + return new File(exportType.getDbFileName()); + } + + private void cleanSqlLiteDb( final List tables) { + final File oldRdbFile = getRdbFile( getExportTypeUsed() ) ; + if (oldRdbFile.exists()) { + + // Now we can remove the SQLite file so that a completely new connection is open + try { + Files.delete( Paths.get( oldRdbFile.toURI() ) ); + } catch (IOException e1) { + logger.error("Error deleteing old Relational DB sqlite file", e1); + + // We need to delete all tables before we can remove the file and drop the + // connection + final List> listOfTables = getJdbcTemplate() + .queryForList("SELECT name FROM sqlite_master WHERE type='table' OR type ;"); //$NON-NLS-1$ + for (final Map entry : listOfTables) { + final String tableName = (String) entry.get("name"); //$NON-NLS-1$ + if (!tableName.equals("sqlite_sequence")) { //$NON-NLS-1$ + tables.add(tableName); + } + } + + for (final String tableName : tables) { + getJdbcTemplate().execute("DROP TABLE IF EXISTS " + tableName); //$NON-NLS-1$ + } + + // DROP VIEWS! + final List> listOfViews = getJdbcTemplate() + .queryForList("SELECT name FROM sqlite_master WHERE type = 'view';"); //$NON-NLS-1$ + for (final Map entry : listOfViews) { + final String viewName = (String) entry.get("name"); //$NON-NLS-1$ + getJdbcTemplate().execute("DROP VIEW IF EXISTS " + viewName); //$NON-NLS-1$ + } + try { + if( getJdbcTemplate().getDataSource() != null && getJdbcTemplate().getDataSource().getConnection() != null){ + getJdbcTemplate().getDataSource().getConnection().close(); + } + } catch (CannotGetJdbcConnectionException | SQLException e2) { + logger.error("Error closing the DB connection", e2); + } + // Now we can remove the SQLite file so that a completely new connection is open + try { + Files.delete( Paths.get( oldRdbFile.toURI() ) ); + } catch (IOException e3) { + logger.error("Error deleteing old Saiku DB sqlite file", e3); + } + } + + + if (!SystemUtils.IS_OS_WINDOWS) { + try { + Thread.yield(); + Thread.sleep(10000); + } catch (InterruptedException e) { + logger.error("Error while giving pass to other processes", e); + Thread.currentThread().interrupt(); + } + } + + + } + + } + + + public String getSchemaName( ExportType exportType ) { + if (localPropertiesService.isUsingPostgreSqlDB()) { + return exportType.getRdbSchema(); + } else { + return null; + } + } + + public void exportDataToRDB( + Survey survey, + ExportType exportType, + InfiniteProgressMonitor progressListener, + RDBPostProcessor callbackProcessor ) throws CollectRdbException { + + setExportTypeUsed(exportType); + + // Clean the previous RDB + removeOldRdb( ); + + /* + * The SQLite DB has no limit on the length of the varchar. By default, if no + * RelationalSchemaConfig is passed to the export command text fields will be + * truncated to 255 characters + */ + final RelationalSchemaConfig rdbConfig = new RelationalSchemaContext().getRdbConfig(); + + final String rdbPostgreSQLSchema = getSchemaName( exportType ); + + SwingUtilities.invokeLater( () -> progressListener.setMessage("Exporting collected records into Relational DB") ); + + collectRDBPublisher.export( survey.getName(), + EarthConstants.ROOT_ENTITY_NAME, + Step.ENTRY, + rdbPostgreSQLSchema, + getJDBCConnection(), + rdbConfig, + progressListener); + + if (!isUserCancelledOperation()) { + System.currentTimeMillis(); + try { + setJDBCDefaultSchema( exportType); + callbackProcessor.processRDBData(progressListener); + } catch (final Exception e) { + logger.error("Error processing quantity data", e); //$NON-NLS-1$ + } + } + } + + private void setJDBCDefaultSchema( ExportType exportType ) { + if (localPropertiesService.isUsingPostgreSqlDB()) { + getJdbcTemplate().execute("SET search_path TO " + getSchemaName( exportType )); //$NON-NLS-1$ + } + } + + private boolean isUserCancelledOperation() { + return userCancelledOperation; + } + +} From b9592e62103ab01054a4860bae246222542941e6 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:43 +0100 Subject: [PATCH 0238/1620] New translations RDBExporter.java (Spanish) --- .../earth/app/view/Messages_es.properties | 212 +++++++++++++++--- 1 file changed, 177 insertions(+), 35 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 70e2ecd6d6..8b698b71db 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,57 +1,199 @@ package org.openforis.collect.earth.app.service; -import java.sql.Connection; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; -import javax.sql.DataSource; +import javax.swing.SwingUtilities; -import org.apache.commons.dbcp.BasicDataSource; +import org.apache.commons.lang3.SystemUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.core.rdb.RelationalSchemaContext; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.relational.CollectRDBPublisher; +import org.openforis.collect.relational.CollectRdbException; +import org.openforis.collect.relational.model.RelationalSchemaConfig; +import org.openforis.idm.metamodel.Survey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.datasource.DataSourceUtils; +import org.springframework.jdbc.CannotGetJdbcConnectionException; +import org.springframework.stereotype.Component; -public abstract class RDBConnector { - @Autowired - @Qualifier("rdbDataSource") - private DataSource rdbDataSource; +@Component +public class RDBExporter extends RDBConnector{ @Autowired - @Qualifier("rdbDataSourceIpcc") - private BasicDataSource rdbDataSourceIpcc; + CollectRDBPublisher collectRDBPublisher; + + @Autowired + EarthSurveyService earthSurveyService; + + @Autowired + public LocalPropertiesService localPropertiesService; + + private final Logger logger = LoggerFactory.getLogger(RDBExporter.class); - private JdbcTemplate jdbcTemplate; + public static final String COLLECT_EARTH_IPCC_DATABASE_RDB_DB = + EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + + ServerController.IPCC_RDB_SUFFIX; + public static final String COLLECT_EARTH_SAIKU_DATABASE_RDB_DB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + + ServerController.SAIKU_RDB_SUFFIX; + + private boolean userCancelledOperation = false; - private ExportType exportTypeUsed; + private void removeOldRdb( ) { + + final List tables = new ArrayList<>(); + + if (localPropertiesService.isUsingSqliteDB()) { + + cleanSqlLiteDb( tables); + + } else if (localPropertiesService.isUsingPostgreSqlDB()) { + cleanPostgresDb(); + + } + + } - public JdbcTemplate getJdbcTemplate() { - if( jdbcTemplate == null ) { - if( getExportTypeUsed().equals( ExportType.SAIKU) ) { - jdbcTemplate = new JdbcTemplate(rdbDataSource); - }else if( getExportTypeUsed().equals( ExportType.IPCC ) ){ - jdbcTemplate = new JdbcTemplate(rdbDataSourceIpcc); - }else { - throw new IllegalArgumentException("The ExportType has not been set yet"); + private void cleanPostgresDb( ) { + getJdbcTemplate().execute("DROP SCHEMA IF EXISTS " + getExportTypeUsed().getRdbSchema() + " CASCADE"); //$NON-NLS-1$ //$NON-NLS-2$ + getJdbcTemplate().execute("CREATE SCHEMA IF NOT EXISTS " + getExportTypeUsed().getRdbSchema() ); //$NON-NLS-1$ + } + + public File getRdbFile( ExportType exportType) { + return new File(exportType.getDbFileName()); + } + + private void cleanSqlLiteDb( final List tables) { + final File oldRdbFile = getRdbFile( getExportTypeUsed() ) ; + if (oldRdbFile.exists()) { + + // Now we can remove the SQLite file so that a completely new connection is open + try { + Files.delete( Paths.get( oldRdbFile.toURI() ) ); + } catch (IOException e1) { + logger.error("Error deleteing old Relational DB sqlite file", e1); + + // We need to delete all tables before we can remove the file and drop the + // connection + final List> listOfTables = getJdbcTemplate() + .queryForList("SELECT name FROM sqlite_master WHERE type='table' OR type ;"); //$NON-NLS-1$ + for (final Map entry : listOfTables) { + final String tableName = (String) entry.get("name"); //$NON-NLS-1$ + if (!tableName.equals("sqlite_sequence")) { //$NON-NLS-1$ + tables.add(tableName); + } + } + + for (final String tableName : tables) { + getJdbcTemplate().execute("DROP TABLE IF EXISTS " + tableName); //$NON-NLS-1$ + } + + // DROP VIEWS! + final List> listOfViews = getJdbcTemplate() + .queryForList("SELECT name FROM sqlite_master WHERE type = 'view';"); //$NON-NLS-1$ + for (final Map entry : listOfViews) { + final String viewName = (String) entry.get("name"); //$NON-NLS-1$ + getJdbcTemplate().execute("DROP VIEW IF EXISTS " + viewName); //$NON-NLS-1$ + } + try { + if( getJdbcTemplate().getDataSource() != null && getJdbcTemplate().getDataSource().getConnection() != null){ + getJdbcTemplate().getDataSource().getConnection().close(); + } + } catch (CannotGetJdbcConnectionException | SQLException e2) { + logger.error("Error closing the DB connection", e2); + } + // Now we can remove the SQLite file so that a completely new connection is open + try { + Files.delete( Paths.get( oldRdbFile.toURI() ) ); + } catch (IOException e3) { + logger.error("Error deleteing old Saiku DB sqlite file", e3); + } + } + + + if (!SystemUtils.IS_OS_WINDOWS) { + try { + Thread.yield(); + Thread.sleep(10000); + } catch (InterruptedException e) { + logger.error("Error while giving pass to other processes", e); + Thread.currentThread().interrupt(); + } } + + } - return jdbcTemplate; + } - - protected Connection getJDBCConnection() { - if( getExportTypeUsed().equals( ExportType.SAIKU ) ) { - return DataSourceUtils.getConnection(rdbDataSource); - }else if( getExportTypeUsed().equals( ExportType.IPCC ) ){ - return DataSourceUtils.getConnection(rdbDataSourceIpcc); - }else { - throw new IllegalArgumentException("The ExportType has not been set yet"); + + + public String getSchemaName( ExportType exportType ) { + if (localPropertiesService.isUsingPostgreSqlDB()) { + return exportType.getRdbSchema(); + } else { + return null; } } + + public void exportDataToRDB( + Survey survey, + ExportType exportType, + InfiniteProgressMonitor progressListener, + RDBPostProcessor callbackProcessor ) throws CollectRdbException { + + setExportTypeUsed(exportType); + + // Clean the previous RDB + removeOldRdb( ); + + /* + * The SQLite DB has no limit on the length of the varchar. By default, if no + * RelationalSchemaConfig is passed to the export command text fields will be + * truncated to 255 characters + */ + final RelationalSchemaConfig rdbConfig = new RelationalSchemaContext().getRdbConfig(); + + final String rdbPostgreSQLSchema = getSchemaName( exportType ); + + SwingUtilities.invokeLater( () -> progressListener.setMessage("Exporting collected records into Relational DB") ); - public ExportType getExportTypeUsed() { - return exportTypeUsed; + collectRDBPublisher.export( survey.getName(), + EarthConstants.ROOT_ENTITY_NAME, + Step.ENTRY, + rdbPostgreSQLSchema, + getJDBCConnection(), + rdbConfig, + progressListener); + + if (!isUserCancelledOperation()) { + System.currentTimeMillis(); + try { + setJDBCDefaultSchema( exportType); + callbackProcessor.processRDBData(progressListener); + } catch (final Exception e) { + logger.error("Error processing quantity data", e); //$NON-NLS-1$ + } + } + } + + private void setJDBCDefaultSchema( ExportType exportType ) { + if (localPropertiesService.isUsingPostgreSqlDB()) { + getJdbcTemplate().execute("SET search_path TO " + getSchemaName( exportType )); //$NON-NLS-1$ + } } - public void setExportTypeUsed(ExportType exportTypeUsed) { - this.exportTypeUsed = exportTypeUsed; + private boolean isUserCancelledOperation() { + return userCancelledOperation; } } From e1ad838e6029683ea6eeed1d7cc7b27e960478b6 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:44 +0100 Subject: [PATCH 0239/1620] New translations RDBExporter.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 212 +++++++++++++++--- 1 file changed, 177 insertions(+), 35 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 70e2ecd6d6..8b698b71db 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,57 +1,199 @@ package org.openforis.collect.earth.app.service; -import java.sql.Connection; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; -import javax.sql.DataSource; +import javax.swing.SwingUtilities; -import org.apache.commons.dbcp.BasicDataSource; +import org.apache.commons.lang3.SystemUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.core.rdb.RelationalSchemaContext; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.relational.CollectRDBPublisher; +import org.openforis.collect.relational.CollectRdbException; +import org.openforis.collect.relational.model.RelationalSchemaConfig; +import org.openforis.idm.metamodel.Survey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.datasource.DataSourceUtils; +import org.springframework.jdbc.CannotGetJdbcConnectionException; +import org.springframework.stereotype.Component; -public abstract class RDBConnector { - @Autowired - @Qualifier("rdbDataSource") - private DataSource rdbDataSource; +@Component +public class RDBExporter extends RDBConnector{ @Autowired - @Qualifier("rdbDataSourceIpcc") - private BasicDataSource rdbDataSourceIpcc; + CollectRDBPublisher collectRDBPublisher; + + @Autowired + EarthSurveyService earthSurveyService; + + @Autowired + public LocalPropertiesService localPropertiesService; + + private final Logger logger = LoggerFactory.getLogger(RDBExporter.class); - private JdbcTemplate jdbcTemplate; + public static final String COLLECT_EARTH_IPCC_DATABASE_RDB_DB = + EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + + ServerController.IPCC_RDB_SUFFIX; + public static final String COLLECT_EARTH_SAIKU_DATABASE_RDB_DB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + + ServerController.SAIKU_RDB_SUFFIX; + + private boolean userCancelledOperation = false; - private ExportType exportTypeUsed; + private void removeOldRdb( ) { + + final List tables = new ArrayList<>(); + + if (localPropertiesService.isUsingSqliteDB()) { + + cleanSqlLiteDb( tables); + + } else if (localPropertiesService.isUsingPostgreSqlDB()) { + cleanPostgresDb(); + + } + + } - public JdbcTemplate getJdbcTemplate() { - if( jdbcTemplate == null ) { - if( getExportTypeUsed().equals( ExportType.SAIKU) ) { - jdbcTemplate = new JdbcTemplate(rdbDataSource); - }else if( getExportTypeUsed().equals( ExportType.IPCC ) ){ - jdbcTemplate = new JdbcTemplate(rdbDataSourceIpcc); - }else { - throw new IllegalArgumentException("The ExportType has not been set yet"); + private void cleanPostgresDb( ) { + getJdbcTemplate().execute("DROP SCHEMA IF EXISTS " + getExportTypeUsed().getRdbSchema() + " CASCADE"); //$NON-NLS-1$ //$NON-NLS-2$ + getJdbcTemplate().execute("CREATE SCHEMA IF NOT EXISTS " + getExportTypeUsed().getRdbSchema() ); //$NON-NLS-1$ + } + + public File getRdbFile( ExportType exportType) { + return new File(exportType.getDbFileName()); + } + + private void cleanSqlLiteDb( final List tables) { + final File oldRdbFile = getRdbFile( getExportTypeUsed() ) ; + if (oldRdbFile.exists()) { + + // Now we can remove the SQLite file so that a completely new connection is open + try { + Files.delete( Paths.get( oldRdbFile.toURI() ) ); + } catch (IOException e1) { + logger.error("Error deleteing old Relational DB sqlite file", e1); + + // We need to delete all tables before we can remove the file and drop the + // connection + final List> listOfTables = getJdbcTemplate() + .queryForList("SELECT name FROM sqlite_master WHERE type='table' OR type ;"); //$NON-NLS-1$ + for (final Map entry : listOfTables) { + final String tableName = (String) entry.get("name"); //$NON-NLS-1$ + if (!tableName.equals("sqlite_sequence")) { //$NON-NLS-1$ + tables.add(tableName); + } + } + + for (final String tableName : tables) { + getJdbcTemplate().execute("DROP TABLE IF EXISTS " + tableName); //$NON-NLS-1$ + } + + // DROP VIEWS! + final List> listOfViews = getJdbcTemplate() + .queryForList("SELECT name FROM sqlite_master WHERE type = 'view';"); //$NON-NLS-1$ + for (final Map entry : listOfViews) { + final String viewName = (String) entry.get("name"); //$NON-NLS-1$ + getJdbcTemplate().execute("DROP VIEW IF EXISTS " + viewName); //$NON-NLS-1$ + } + try { + if( getJdbcTemplate().getDataSource() != null && getJdbcTemplate().getDataSource().getConnection() != null){ + getJdbcTemplate().getDataSource().getConnection().close(); + } + } catch (CannotGetJdbcConnectionException | SQLException e2) { + logger.error("Error closing the DB connection", e2); + } + // Now we can remove the SQLite file so that a completely new connection is open + try { + Files.delete( Paths.get( oldRdbFile.toURI() ) ); + } catch (IOException e3) { + logger.error("Error deleteing old Saiku DB sqlite file", e3); + } + } + + + if (!SystemUtils.IS_OS_WINDOWS) { + try { + Thread.yield(); + Thread.sleep(10000); + } catch (InterruptedException e) { + logger.error("Error while giving pass to other processes", e); + Thread.currentThread().interrupt(); + } } + + } - return jdbcTemplate; + } - - protected Connection getJDBCConnection() { - if( getExportTypeUsed().equals( ExportType.SAIKU ) ) { - return DataSourceUtils.getConnection(rdbDataSource); - }else if( getExportTypeUsed().equals( ExportType.IPCC ) ){ - return DataSourceUtils.getConnection(rdbDataSourceIpcc); - }else { - throw new IllegalArgumentException("The ExportType has not been set yet"); + + + public String getSchemaName( ExportType exportType ) { + if (localPropertiesService.isUsingPostgreSqlDB()) { + return exportType.getRdbSchema(); + } else { + return null; } } + + public void exportDataToRDB( + Survey survey, + ExportType exportType, + InfiniteProgressMonitor progressListener, + RDBPostProcessor callbackProcessor ) throws CollectRdbException { + + setExportTypeUsed(exportType); + + // Clean the previous RDB + removeOldRdb( ); + + /* + * The SQLite DB has no limit on the length of the varchar. By default, if no + * RelationalSchemaConfig is passed to the export command text fields will be + * truncated to 255 characters + */ + final RelationalSchemaConfig rdbConfig = new RelationalSchemaContext().getRdbConfig(); + + final String rdbPostgreSQLSchema = getSchemaName( exportType ); + + SwingUtilities.invokeLater( () -> progressListener.setMessage("Exporting collected records into Relational DB") ); - public ExportType getExportTypeUsed() { - return exportTypeUsed; + collectRDBPublisher.export( survey.getName(), + EarthConstants.ROOT_ENTITY_NAME, + Step.ENTRY, + rdbPostgreSQLSchema, + getJDBCConnection(), + rdbConfig, + progressListener); + + if (!isUserCancelledOperation()) { + System.currentTimeMillis(); + try { + setJDBCDefaultSchema( exportType); + callbackProcessor.processRDBData(progressListener); + } catch (final Exception e) { + logger.error("Error processing quantity data", e); //$NON-NLS-1$ + } + } + } + + private void setJDBCDefaultSchema( ExportType exportType ) { + if (localPropertiesService.isUsingPostgreSqlDB()) { + getJdbcTemplate().execute("SET search_path TO " + getSchemaName( exportType )); //$NON-NLS-1$ + } } - public void setExportTypeUsed(ExportType exportTypeUsed) { - this.exportTypeUsed = exportTypeUsed; + private boolean isUserCancelledOperation() { + return userCancelledOperation; } } From 59a66be0c4fbbce1ce62481c1386371f8921a405 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:45 +0100 Subject: [PATCH 0240/1620] New translations RDBExporter.java (English) --- .../earth/app/view/Messages_en.properties | 212 +++++++++++++++--- 1 file changed, 177 insertions(+), 35 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 70e2ecd6d6..8b698b71db 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,57 +1,199 @@ package org.openforis.collect.earth.app.service; -import java.sql.Connection; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; -import javax.sql.DataSource; +import javax.swing.SwingUtilities; -import org.apache.commons.dbcp.BasicDataSource; +import org.apache.commons.lang3.SystemUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.core.rdb.RelationalSchemaContext; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.relational.CollectRDBPublisher; +import org.openforis.collect.relational.CollectRdbException; +import org.openforis.collect.relational.model.RelationalSchemaConfig; +import org.openforis.idm.metamodel.Survey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.datasource.DataSourceUtils; +import org.springframework.jdbc.CannotGetJdbcConnectionException; +import org.springframework.stereotype.Component; -public abstract class RDBConnector { - @Autowired - @Qualifier("rdbDataSource") - private DataSource rdbDataSource; +@Component +public class RDBExporter extends RDBConnector{ @Autowired - @Qualifier("rdbDataSourceIpcc") - private BasicDataSource rdbDataSourceIpcc; + CollectRDBPublisher collectRDBPublisher; + + @Autowired + EarthSurveyService earthSurveyService; + + @Autowired + public LocalPropertiesService localPropertiesService; + + private final Logger logger = LoggerFactory.getLogger(RDBExporter.class); - private JdbcTemplate jdbcTemplate; + public static final String COLLECT_EARTH_IPCC_DATABASE_RDB_DB = + EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + + ServerController.IPCC_RDB_SUFFIX; + public static final String COLLECT_EARTH_SAIKU_DATABASE_RDB_DB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + + ServerController.SAIKU_RDB_SUFFIX; + + private boolean userCancelledOperation = false; - private ExportType exportTypeUsed; + private void removeOldRdb( ) { + + final List tables = new ArrayList<>(); + + if (localPropertiesService.isUsingSqliteDB()) { + + cleanSqlLiteDb( tables); + + } else if (localPropertiesService.isUsingPostgreSqlDB()) { + cleanPostgresDb(); + + } + + } - public JdbcTemplate getJdbcTemplate() { - if( jdbcTemplate == null ) { - if( getExportTypeUsed().equals( ExportType.SAIKU) ) { - jdbcTemplate = new JdbcTemplate(rdbDataSource); - }else if( getExportTypeUsed().equals( ExportType.IPCC ) ){ - jdbcTemplate = new JdbcTemplate(rdbDataSourceIpcc); - }else { - throw new IllegalArgumentException("The ExportType has not been set yet"); + private void cleanPostgresDb( ) { + getJdbcTemplate().execute("DROP SCHEMA IF EXISTS " + getExportTypeUsed().getRdbSchema() + " CASCADE"); //$NON-NLS-1$ //$NON-NLS-2$ + getJdbcTemplate().execute("CREATE SCHEMA IF NOT EXISTS " + getExportTypeUsed().getRdbSchema() ); //$NON-NLS-1$ + } + + public File getRdbFile( ExportType exportType) { + return new File(exportType.getDbFileName()); + } + + private void cleanSqlLiteDb( final List tables) { + final File oldRdbFile = getRdbFile( getExportTypeUsed() ) ; + if (oldRdbFile.exists()) { + + // Now we can remove the SQLite file so that a completely new connection is open + try { + Files.delete( Paths.get( oldRdbFile.toURI() ) ); + } catch (IOException e1) { + logger.error("Error deleteing old Relational DB sqlite file", e1); + + // We need to delete all tables before we can remove the file and drop the + // connection + final List> listOfTables = getJdbcTemplate() + .queryForList("SELECT name FROM sqlite_master WHERE type='table' OR type ;"); //$NON-NLS-1$ + for (final Map entry : listOfTables) { + final String tableName = (String) entry.get("name"); //$NON-NLS-1$ + if (!tableName.equals("sqlite_sequence")) { //$NON-NLS-1$ + tables.add(tableName); + } + } + + for (final String tableName : tables) { + getJdbcTemplate().execute("DROP TABLE IF EXISTS " + tableName); //$NON-NLS-1$ + } + + // DROP VIEWS! + final List> listOfViews = getJdbcTemplate() + .queryForList("SELECT name FROM sqlite_master WHERE type = 'view';"); //$NON-NLS-1$ + for (final Map entry : listOfViews) { + final String viewName = (String) entry.get("name"); //$NON-NLS-1$ + getJdbcTemplate().execute("DROP VIEW IF EXISTS " + viewName); //$NON-NLS-1$ + } + try { + if( getJdbcTemplate().getDataSource() != null && getJdbcTemplate().getDataSource().getConnection() != null){ + getJdbcTemplate().getDataSource().getConnection().close(); + } + } catch (CannotGetJdbcConnectionException | SQLException e2) { + logger.error("Error closing the DB connection", e2); + } + // Now we can remove the SQLite file so that a completely new connection is open + try { + Files.delete( Paths.get( oldRdbFile.toURI() ) ); + } catch (IOException e3) { + logger.error("Error deleteing old Saiku DB sqlite file", e3); + } + } + + + if (!SystemUtils.IS_OS_WINDOWS) { + try { + Thread.yield(); + Thread.sleep(10000); + } catch (InterruptedException e) { + logger.error("Error while giving pass to other processes", e); + Thread.currentThread().interrupt(); + } } + + } - return jdbcTemplate; + } - - protected Connection getJDBCConnection() { - if( getExportTypeUsed().equals( ExportType.SAIKU ) ) { - return DataSourceUtils.getConnection(rdbDataSource); - }else if( getExportTypeUsed().equals( ExportType.IPCC ) ){ - return DataSourceUtils.getConnection(rdbDataSourceIpcc); - }else { - throw new IllegalArgumentException("The ExportType has not been set yet"); + + + public String getSchemaName( ExportType exportType ) { + if (localPropertiesService.isUsingPostgreSqlDB()) { + return exportType.getRdbSchema(); + } else { + return null; } } + + public void exportDataToRDB( + Survey survey, + ExportType exportType, + InfiniteProgressMonitor progressListener, + RDBPostProcessor callbackProcessor ) throws CollectRdbException { + + setExportTypeUsed(exportType); + + // Clean the previous RDB + removeOldRdb( ); + + /* + * The SQLite DB has no limit on the length of the varchar. By default, if no + * RelationalSchemaConfig is passed to the export command text fields will be + * truncated to 255 characters + */ + final RelationalSchemaConfig rdbConfig = new RelationalSchemaContext().getRdbConfig(); + + final String rdbPostgreSQLSchema = getSchemaName( exportType ); + + SwingUtilities.invokeLater( () -> progressListener.setMessage("Exporting collected records into Relational DB") ); - public ExportType getExportTypeUsed() { - return exportTypeUsed; + collectRDBPublisher.export( survey.getName(), + EarthConstants.ROOT_ENTITY_NAME, + Step.ENTRY, + rdbPostgreSQLSchema, + getJDBCConnection(), + rdbConfig, + progressListener); + + if (!isUserCancelledOperation()) { + System.currentTimeMillis(); + try { + setJDBCDefaultSchema( exportType); + callbackProcessor.processRDBData(progressListener); + } catch (final Exception e) { + logger.error("Error processing quantity data", e); //$NON-NLS-1$ + } + } + } + + private void setJDBCDefaultSchema( ExportType exportType ) { + if (localPropertiesService.isUsingPostgreSqlDB()) { + getJdbcTemplate().execute("SET search_path TO " + getSchemaName( exportType )); //$NON-NLS-1$ + } } - public void setExportTypeUsed(ExportType exportTypeUsed) { - this.exportTypeUsed = exportTypeUsed; + private boolean isUserCancelledOperation() { + return userCancelledOperation; } } From b4a5a144010440ae0d99e476780d5ba53e67cc5f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:46 +0100 Subject: [PATCH 0241/1620] New translations RDBPostProcessor.java (French) --- .../earth/app/view/Messages_fr.properties | 194 +----------------- 1 file changed, 2 insertions(+), 192 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 8b698b71db..7ea79d00ff 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,199 +1,9 @@ package org.openforis.collect.earth.app.service; -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.SystemUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.desktop.ServerController; import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.core.rdb.RelationalSchemaContext; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.relational.CollectRDBPublisher; -import org.openforis.collect.relational.CollectRdbException; -import org.openforis.collect.relational.model.RelationalSchemaConfig; -import org.openforis.idm.metamodel.Survey; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.CannotGetJdbcConnectionException; -import org.springframework.stereotype.Component; - -@Component -public class RDBExporter extends RDBConnector{ - - @Autowired - CollectRDBPublisher collectRDBPublisher; - - @Autowired - EarthSurveyService earthSurveyService; - - @Autowired - public LocalPropertiesService localPropertiesService; - - private final Logger logger = LoggerFactory.getLogger(RDBExporter.class); - - public static final String COLLECT_EARTH_IPCC_DATABASE_RDB_DB = - EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB - + ServerController.IPCC_RDB_SUFFIX; - public static final String COLLECT_EARTH_SAIKU_DATABASE_RDB_DB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB - + ServerController.SAIKU_RDB_SUFFIX; - - private boolean userCancelledOperation = false; - - private void removeOldRdb( ) { - - final List tables = new ArrayList<>(); - - if (localPropertiesService.isUsingSqliteDB()) { - - cleanSqlLiteDb( tables); - - } else if (localPropertiesService.isUsingPostgreSqlDB()) { - cleanPostgresDb(); - - } - - } - - private void cleanPostgresDb( ) { - getJdbcTemplate().execute("DROP SCHEMA IF EXISTS " + getExportTypeUsed().getRdbSchema() + " CASCADE"); //$NON-NLS-1$ //$NON-NLS-2$ - getJdbcTemplate().execute("CREATE SCHEMA IF NOT EXISTS " + getExportTypeUsed().getRdbSchema() ); //$NON-NLS-1$ - } - - public File getRdbFile( ExportType exportType) { - return new File(exportType.getDbFileName()); - } - - private void cleanSqlLiteDb( final List tables) { - final File oldRdbFile = getRdbFile( getExportTypeUsed() ) ; - if (oldRdbFile.exists()) { - - // Now we can remove the SQLite file so that a completely new connection is open - try { - Files.delete( Paths.get( oldRdbFile.toURI() ) ); - } catch (IOException e1) { - logger.error("Error deleteing old Relational DB sqlite file", e1); - - // We need to delete all tables before we can remove the file and drop the - // connection - final List> listOfTables = getJdbcTemplate() - .queryForList("SELECT name FROM sqlite_master WHERE type='table' OR type ;"); //$NON-NLS-1$ - for (final Map entry : listOfTables) { - final String tableName = (String) entry.get("name"); //$NON-NLS-1$ - if (!tableName.equals("sqlite_sequence")) { //$NON-NLS-1$ - tables.add(tableName); - } - } - - for (final String tableName : tables) { - getJdbcTemplate().execute("DROP TABLE IF EXISTS " + tableName); //$NON-NLS-1$ - } - - // DROP VIEWS! - final List> listOfViews = getJdbcTemplate() - .queryForList("SELECT name FROM sqlite_master WHERE type = 'view';"); //$NON-NLS-1$ - for (final Map entry : listOfViews) { - final String viewName = (String) entry.get("name"); //$NON-NLS-1$ - getJdbcTemplate().execute("DROP VIEW IF EXISTS " + viewName); //$NON-NLS-1$ - } - try { - if( getJdbcTemplate().getDataSource() != null && getJdbcTemplate().getDataSource().getConnection() != null){ - getJdbcTemplate().getDataSource().getConnection().close(); - } - } catch (CannotGetJdbcConnectionException | SQLException e2) { - logger.error("Error closing the DB connection", e2); - } - // Now we can remove the SQLite file so that a completely new connection is open - try { - Files.delete( Paths.get( oldRdbFile.toURI() ) ); - } catch (IOException e3) { - logger.error("Error deleteing old Saiku DB sqlite file", e3); - } - } - - - if (!SystemUtils.IS_OS_WINDOWS) { - try { - Thread.yield(); - Thread.sleep(10000); - } catch (InterruptedException e) { - logger.error("Error while giving pass to other processes", e); - Thread.currentThread().interrupt(); - } - } - - - } - - } - - - public String getSchemaName( ExportType exportType ) { - if (localPropertiesService.isUsingPostgreSqlDB()) { - return exportType.getRdbSchema(); - } else { - return null; - } - } - - public void exportDataToRDB( - Survey survey, - ExportType exportType, - InfiniteProgressMonitor progressListener, - RDBPostProcessor callbackProcessor ) throws CollectRdbException { - - setExportTypeUsed(exportType); - - // Clean the previous RDB - removeOldRdb( ); - - /* - * The SQLite DB has no limit on the length of the varchar. By default, if no - * RelationalSchemaConfig is passed to the export command text fields will be - * truncated to 255 characters - */ - final RelationalSchemaConfig rdbConfig = new RelationalSchemaContext().getRdbConfig(); - - final String rdbPostgreSQLSchema = getSchemaName( exportType ); - - SwingUtilities.invokeLater( () -> progressListener.setMessage("Exporting collected records into Relational DB") ); - - collectRDBPublisher.export( survey.getName(), - EarthConstants.ROOT_ENTITY_NAME, - Step.ENTRY, - rdbPostgreSQLSchema, - getJDBCConnection(), - rdbConfig, - progressListener); - if (!isUserCancelledOperation()) { - System.currentTimeMillis(); - try { - setJDBCDefaultSchema( exportType); - callbackProcessor.processRDBData(progressListener); - } catch (final Exception e) { - logger.error("Error processing quantity data", e); //$NON-NLS-1$ - } - } - } - - private void setJDBCDefaultSchema( ExportType exportType ) { - if (localPropertiesService.isUsingPostgreSqlDB()) { - getJdbcTemplate().execute("SET search_path TO " + getSchemaName( exportType )); //$NON-NLS-1$ - } - } +public interface RDBPostProcessor { - private boolean isUserCancelledOperation() { - return userCancelledOperation; - } + void processRDBData(InfiniteProgressMonitor progressListener); } From 5b9799289ea5605158320f3ad45a712dc828e6e8 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:47 +0100 Subject: [PATCH 0242/1620] New translations RDBPostProcessor.java (Spanish) --- .../earth/app/view/Messages_es.properties | 194 +----------------- 1 file changed, 2 insertions(+), 192 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 8b698b71db..7ea79d00ff 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,199 +1,9 @@ package org.openforis.collect.earth.app.service; -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.SystemUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.desktop.ServerController; import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.core.rdb.RelationalSchemaContext; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.relational.CollectRDBPublisher; -import org.openforis.collect.relational.CollectRdbException; -import org.openforis.collect.relational.model.RelationalSchemaConfig; -import org.openforis.idm.metamodel.Survey; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.CannotGetJdbcConnectionException; -import org.springframework.stereotype.Component; - -@Component -public class RDBExporter extends RDBConnector{ - - @Autowired - CollectRDBPublisher collectRDBPublisher; - - @Autowired - EarthSurveyService earthSurveyService; - - @Autowired - public LocalPropertiesService localPropertiesService; - - private final Logger logger = LoggerFactory.getLogger(RDBExporter.class); - - public static final String COLLECT_EARTH_IPCC_DATABASE_RDB_DB = - EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB - + ServerController.IPCC_RDB_SUFFIX; - public static final String COLLECT_EARTH_SAIKU_DATABASE_RDB_DB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB - + ServerController.SAIKU_RDB_SUFFIX; - - private boolean userCancelledOperation = false; - - private void removeOldRdb( ) { - - final List tables = new ArrayList<>(); - - if (localPropertiesService.isUsingSqliteDB()) { - - cleanSqlLiteDb( tables); - - } else if (localPropertiesService.isUsingPostgreSqlDB()) { - cleanPostgresDb(); - - } - - } - - private void cleanPostgresDb( ) { - getJdbcTemplate().execute("DROP SCHEMA IF EXISTS " + getExportTypeUsed().getRdbSchema() + " CASCADE"); //$NON-NLS-1$ //$NON-NLS-2$ - getJdbcTemplate().execute("CREATE SCHEMA IF NOT EXISTS " + getExportTypeUsed().getRdbSchema() ); //$NON-NLS-1$ - } - - public File getRdbFile( ExportType exportType) { - return new File(exportType.getDbFileName()); - } - - private void cleanSqlLiteDb( final List tables) { - final File oldRdbFile = getRdbFile( getExportTypeUsed() ) ; - if (oldRdbFile.exists()) { - - // Now we can remove the SQLite file so that a completely new connection is open - try { - Files.delete( Paths.get( oldRdbFile.toURI() ) ); - } catch (IOException e1) { - logger.error("Error deleteing old Relational DB sqlite file", e1); - - // We need to delete all tables before we can remove the file and drop the - // connection - final List> listOfTables = getJdbcTemplate() - .queryForList("SELECT name FROM sqlite_master WHERE type='table' OR type ;"); //$NON-NLS-1$ - for (final Map entry : listOfTables) { - final String tableName = (String) entry.get("name"); //$NON-NLS-1$ - if (!tableName.equals("sqlite_sequence")) { //$NON-NLS-1$ - tables.add(tableName); - } - } - - for (final String tableName : tables) { - getJdbcTemplate().execute("DROP TABLE IF EXISTS " + tableName); //$NON-NLS-1$ - } - - // DROP VIEWS! - final List> listOfViews = getJdbcTemplate() - .queryForList("SELECT name FROM sqlite_master WHERE type = 'view';"); //$NON-NLS-1$ - for (final Map entry : listOfViews) { - final String viewName = (String) entry.get("name"); //$NON-NLS-1$ - getJdbcTemplate().execute("DROP VIEW IF EXISTS " + viewName); //$NON-NLS-1$ - } - try { - if( getJdbcTemplate().getDataSource() != null && getJdbcTemplate().getDataSource().getConnection() != null){ - getJdbcTemplate().getDataSource().getConnection().close(); - } - } catch (CannotGetJdbcConnectionException | SQLException e2) { - logger.error("Error closing the DB connection", e2); - } - // Now we can remove the SQLite file so that a completely new connection is open - try { - Files.delete( Paths.get( oldRdbFile.toURI() ) ); - } catch (IOException e3) { - logger.error("Error deleteing old Saiku DB sqlite file", e3); - } - } - - - if (!SystemUtils.IS_OS_WINDOWS) { - try { - Thread.yield(); - Thread.sleep(10000); - } catch (InterruptedException e) { - logger.error("Error while giving pass to other processes", e); - Thread.currentThread().interrupt(); - } - } - - - } - - } - - - public String getSchemaName( ExportType exportType ) { - if (localPropertiesService.isUsingPostgreSqlDB()) { - return exportType.getRdbSchema(); - } else { - return null; - } - } - - public void exportDataToRDB( - Survey survey, - ExportType exportType, - InfiniteProgressMonitor progressListener, - RDBPostProcessor callbackProcessor ) throws CollectRdbException { - - setExportTypeUsed(exportType); - - // Clean the previous RDB - removeOldRdb( ); - - /* - * The SQLite DB has no limit on the length of the varchar. By default, if no - * RelationalSchemaConfig is passed to the export command text fields will be - * truncated to 255 characters - */ - final RelationalSchemaConfig rdbConfig = new RelationalSchemaContext().getRdbConfig(); - - final String rdbPostgreSQLSchema = getSchemaName( exportType ); - - SwingUtilities.invokeLater( () -> progressListener.setMessage("Exporting collected records into Relational DB") ); - - collectRDBPublisher.export( survey.getName(), - EarthConstants.ROOT_ENTITY_NAME, - Step.ENTRY, - rdbPostgreSQLSchema, - getJDBCConnection(), - rdbConfig, - progressListener); - if (!isUserCancelledOperation()) { - System.currentTimeMillis(); - try { - setJDBCDefaultSchema( exportType); - callbackProcessor.processRDBData(progressListener); - } catch (final Exception e) { - logger.error("Error processing quantity data", e); //$NON-NLS-1$ - } - } - } - - private void setJDBCDefaultSchema( ExportType exportType ) { - if (localPropertiesService.isUsingPostgreSqlDB()) { - getJdbcTemplate().execute("SET search_path TO " + getSchemaName( exportType )); //$NON-NLS-1$ - } - } +public interface RDBPostProcessor { - private boolean isUserCancelledOperation() { - return userCancelledOperation; - } + void processRDBData(InfiniteProgressMonitor progressListener); } From 17073295fc4bf8897afb1b6274cf9b95cd7034ad Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:48 +0100 Subject: [PATCH 0243/1620] New translations RDBPostProcessor.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 194 +----------------- 1 file changed, 2 insertions(+), 192 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 8b698b71db..7ea79d00ff 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,199 +1,9 @@ package org.openforis.collect.earth.app.service; -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.SystemUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.desktop.ServerController; import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.core.rdb.RelationalSchemaContext; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.relational.CollectRDBPublisher; -import org.openforis.collect.relational.CollectRdbException; -import org.openforis.collect.relational.model.RelationalSchemaConfig; -import org.openforis.idm.metamodel.Survey; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.CannotGetJdbcConnectionException; -import org.springframework.stereotype.Component; - -@Component -public class RDBExporter extends RDBConnector{ - - @Autowired - CollectRDBPublisher collectRDBPublisher; - - @Autowired - EarthSurveyService earthSurveyService; - - @Autowired - public LocalPropertiesService localPropertiesService; - - private final Logger logger = LoggerFactory.getLogger(RDBExporter.class); - - public static final String COLLECT_EARTH_IPCC_DATABASE_RDB_DB = - EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB - + ServerController.IPCC_RDB_SUFFIX; - public static final String COLLECT_EARTH_SAIKU_DATABASE_RDB_DB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB - + ServerController.SAIKU_RDB_SUFFIX; - - private boolean userCancelledOperation = false; - - private void removeOldRdb( ) { - - final List tables = new ArrayList<>(); - - if (localPropertiesService.isUsingSqliteDB()) { - - cleanSqlLiteDb( tables); - - } else if (localPropertiesService.isUsingPostgreSqlDB()) { - cleanPostgresDb(); - - } - - } - - private void cleanPostgresDb( ) { - getJdbcTemplate().execute("DROP SCHEMA IF EXISTS " + getExportTypeUsed().getRdbSchema() + " CASCADE"); //$NON-NLS-1$ //$NON-NLS-2$ - getJdbcTemplate().execute("CREATE SCHEMA IF NOT EXISTS " + getExportTypeUsed().getRdbSchema() ); //$NON-NLS-1$ - } - - public File getRdbFile( ExportType exportType) { - return new File(exportType.getDbFileName()); - } - - private void cleanSqlLiteDb( final List tables) { - final File oldRdbFile = getRdbFile( getExportTypeUsed() ) ; - if (oldRdbFile.exists()) { - - // Now we can remove the SQLite file so that a completely new connection is open - try { - Files.delete( Paths.get( oldRdbFile.toURI() ) ); - } catch (IOException e1) { - logger.error("Error deleteing old Relational DB sqlite file", e1); - - // We need to delete all tables before we can remove the file and drop the - // connection - final List> listOfTables = getJdbcTemplate() - .queryForList("SELECT name FROM sqlite_master WHERE type='table' OR type ;"); //$NON-NLS-1$ - for (final Map entry : listOfTables) { - final String tableName = (String) entry.get("name"); //$NON-NLS-1$ - if (!tableName.equals("sqlite_sequence")) { //$NON-NLS-1$ - tables.add(tableName); - } - } - - for (final String tableName : tables) { - getJdbcTemplate().execute("DROP TABLE IF EXISTS " + tableName); //$NON-NLS-1$ - } - - // DROP VIEWS! - final List> listOfViews = getJdbcTemplate() - .queryForList("SELECT name FROM sqlite_master WHERE type = 'view';"); //$NON-NLS-1$ - for (final Map entry : listOfViews) { - final String viewName = (String) entry.get("name"); //$NON-NLS-1$ - getJdbcTemplate().execute("DROP VIEW IF EXISTS " + viewName); //$NON-NLS-1$ - } - try { - if( getJdbcTemplate().getDataSource() != null && getJdbcTemplate().getDataSource().getConnection() != null){ - getJdbcTemplate().getDataSource().getConnection().close(); - } - } catch (CannotGetJdbcConnectionException | SQLException e2) { - logger.error("Error closing the DB connection", e2); - } - // Now we can remove the SQLite file so that a completely new connection is open - try { - Files.delete( Paths.get( oldRdbFile.toURI() ) ); - } catch (IOException e3) { - logger.error("Error deleteing old Saiku DB sqlite file", e3); - } - } - - - if (!SystemUtils.IS_OS_WINDOWS) { - try { - Thread.yield(); - Thread.sleep(10000); - } catch (InterruptedException e) { - logger.error("Error while giving pass to other processes", e); - Thread.currentThread().interrupt(); - } - } - - - } - - } - - - public String getSchemaName( ExportType exportType ) { - if (localPropertiesService.isUsingPostgreSqlDB()) { - return exportType.getRdbSchema(); - } else { - return null; - } - } - - public void exportDataToRDB( - Survey survey, - ExportType exportType, - InfiniteProgressMonitor progressListener, - RDBPostProcessor callbackProcessor ) throws CollectRdbException { - - setExportTypeUsed(exportType); - - // Clean the previous RDB - removeOldRdb( ); - - /* - * The SQLite DB has no limit on the length of the varchar. By default, if no - * RelationalSchemaConfig is passed to the export command text fields will be - * truncated to 255 characters - */ - final RelationalSchemaConfig rdbConfig = new RelationalSchemaContext().getRdbConfig(); - - final String rdbPostgreSQLSchema = getSchemaName( exportType ); - - SwingUtilities.invokeLater( () -> progressListener.setMessage("Exporting collected records into Relational DB") ); - - collectRDBPublisher.export( survey.getName(), - EarthConstants.ROOT_ENTITY_NAME, - Step.ENTRY, - rdbPostgreSQLSchema, - getJDBCConnection(), - rdbConfig, - progressListener); - if (!isUserCancelledOperation()) { - System.currentTimeMillis(); - try { - setJDBCDefaultSchema( exportType); - callbackProcessor.processRDBData(progressListener); - } catch (final Exception e) { - logger.error("Error processing quantity data", e); //$NON-NLS-1$ - } - } - } - - private void setJDBCDefaultSchema( ExportType exportType ) { - if (localPropertiesService.isUsingPostgreSqlDB()) { - getJdbcTemplate().execute("SET search_path TO " + getSchemaName( exportType )); //$NON-NLS-1$ - } - } +public interface RDBPostProcessor { - private boolean isUserCancelledOperation() { - return userCancelledOperation; - } + void processRDBData(InfiniteProgressMonitor progressListener); } From 9687842f7a0e3bd5bec36600e0a84360dc89e33e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:49 +0100 Subject: [PATCH 0244/1620] New translations RDBPostProcessor.java (English) --- .../earth/app/view/Messages_en.properties | 194 +----------------- 1 file changed, 2 insertions(+), 192 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 8b698b71db..7ea79d00ff 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,199 +1,9 @@ package org.openforis.collect.earth.app.service; -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.SystemUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.desktop.ServerController; import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.core.rdb.RelationalSchemaContext; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.relational.CollectRDBPublisher; -import org.openforis.collect.relational.CollectRdbException; -import org.openforis.collect.relational.model.RelationalSchemaConfig; -import org.openforis.idm.metamodel.Survey; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.CannotGetJdbcConnectionException; -import org.springframework.stereotype.Component; - -@Component -public class RDBExporter extends RDBConnector{ - - @Autowired - CollectRDBPublisher collectRDBPublisher; - - @Autowired - EarthSurveyService earthSurveyService; - - @Autowired - public LocalPropertiesService localPropertiesService; - - private final Logger logger = LoggerFactory.getLogger(RDBExporter.class); - - public static final String COLLECT_EARTH_IPCC_DATABASE_RDB_DB = - EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB - + ServerController.IPCC_RDB_SUFFIX; - public static final String COLLECT_EARTH_SAIKU_DATABASE_RDB_DB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB - + ServerController.SAIKU_RDB_SUFFIX; - - private boolean userCancelledOperation = false; - - private void removeOldRdb( ) { - - final List tables = new ArrayList<>(); - - if (localPropertiesService.isUsingSqliteDB()) { - - cleanSqlLiteDb( tables); - - } else if (localPropertiesService.isUsingPostgreSqlDB()) { - cleanPostgresDb(); - - } - - } - - private void cleanPostgresDb( ) { - getJdbcTemplate().execute("DROP SCHEMA IF EXISTS " + getExportTypeUsed().getRdbSchema() + " CASCADE"); //$NON-NLS-1$ //$NON-NLS-2$ - getJdbcTemplate().execute("CREATE SCHEMA IF NOT EXISTS " + getExportTypeUsed().getRdbSchema() ); //$NON-NLS-1$ - } - - public File getRdbFile( ExportType exportType) { - return new File(exportType.getDbFileName()); - } - - private void cleanSqlLiteDb( final List tables) { - final File oldRdbFile = getRdbFile( getExportTypeUsed() ) ; - if (oldRdbFile.exists()) { - - // Now we can remove the SQLite file so that a completely new connection is open - try { - Files.delete( Paths.get( oldRdbFile.toURI() ) ); - } catch (IOException e1) { - logger.error("Error deleteing old Relational DB sqlite file", e1); - - // We need to delete all tables before we can remove the file and drop the - // connection - final List> listOfTables = getJdbcTemplate() - .queryForList("SELECT name FROM sqlite_master WHERE type='table' OR type ;"); //$NON-NLS-1$ - for (final Map entry : listOfTables) { - final String tableName = (String) entry.get("name"); //$NON-NLS-1$ - if (!tableName.equals("sqlite_sequence")) { //$NON-NLS-1$ - tables.add(tableName); - } - } - - for (final String tableName : tables) { - getJdbcTemplate().execute("DROP TABLE IF EXISTS " + tableName); //$NON-NLS-1$ - } - - // DROP VIEWS! - final List> listOfViews = getJdbcTemplate() - .queryForList("SELECT name FROM sqlite_master WHERE type = 'view';"); //$NON-NLS-1$ - for (final Map entry : listOfViews) { - final String viewName = (String) entry.get("name"); //$NON-NLS-1$ - getJdbcTemplate().execute("DROP VIEW IF EXISTS " + viewName); //$NON-NLS-1$ - } - try { - if( getJdbcTemplate().getDataSource() != null && getJdbcTemplate().getDataSource().getConnection() != null){ - getJdbcTemplate().getDataSource().getConnection().close(); - } - } catch (CannotGetJdbcConnectionException | SQLException e2) { - logger.error("Error closing the DB connection", e2); - } - // Now we can remove the SQLite file so that a completely new connection is open - try { - Files.delete( Paths.get( oldRdbFile.toURI() ) ); - } catch (IOException e3) { - logger.error("Error deleteing old Saiku DB sqlite file", e3); - } - } - - - if (!SystemUtils.IS_OS_WINDOWS) { - try { - Thread.yield(); - Thread.sleep(10000); - } catch (InterruptedException e) { - logger.error("Error while giving pass to other processes", e); - Thread.currentThread().interrupt(); - } - } - - - } - - } - - - public String getSchemaName( ExportType exportType ) { - if (localPropertiesService.isUsingPostgreSqlDB()) { - return exportType.getRdbSchema(); - } else { - return null; - } - } - - public void exportDataToRDB( - Survey survey, - ExportType exportType, - InfiniteProgressMonitor progressListener, - RDBPostProcessor callbackProcessor ) throws CollectRdbException { - - setExportTypeUsed(exportType); - - // Clean the previous RDB - removeOldRdb( ); - - /* - * The SQLite DB has no limit on the length of the varchar. By default, if no - * RelationalSchemaConfig is passed to the export command text fields will be - * truncated to 255 characters - */ - final RelationalSchemaConfig rdbConfig = new RelationalSchemaContext().getRdbConfig(); - - final String rdbPostgreSQLSchema = getSchemaName( exportType ); - - SwingUtilities.invokeLater( () -> progressListener.setMessage("Exporting collected records into Relational DB") ); - - collectRDBPublisher.export( survey.getName(), - EarthConstants.ROOT_ENTITY_NAME, - Step.ENTRY, - rdbPostgreSQLSchema, - getJDBCConnection(), - rdbConfig, - progressListener); - if (!isUserCancelledOperation()) { - System.currentTimeMillis(); - try { - setJDBCDefaultSchema( exportType); - callbackProcessor.processRDBData(progressListener); - } catch (final Exception e) { - logger.error("Error processing quantity data", e); //$NON-NLS-1$ - } - } - } - - private void setJDBCDefaultSchema( ExportType exportType ) { - if (localPropertiesService.isUsingPostgreSqlDB()) { - getJdbcTemplate().execute("SET search_path TO " + getSchemaName( exportType )); //$NON-NLS-1$ - } - } +public interface RDBPostProcessor { - private boolean isUserCancelledOperation() { - return userCancelledOperation; - } + void processRDBData(InfiniteProgressMonitor progressListener); } From 5e8011079bc83e7c610d6be6c93d7f52c00e2682 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:50 +0100 Subject: [PATCH 0245/1620] New translations RegionCalculationUtils.java (Spanish) --- .../earth/app/view/Messages_es.properties | 385 +++++++++++++++++- 1 file changed, 376 insertions(+), 9 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 7ea79d00ff..905f384f1e 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,9 +1,376 @@ -package org.openforis.collect.earth.app.service; - -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; - -public interface RDBPostProcessor { - - void processRDBData(InfiniteProgressMonitor progressListener); - -} +package org.openforis.collect.earth.app.service; + +import java.io.File; +import java.io.FileNotFoundException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Locale; + +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.idm.metamodel.BooleanAttributeDefinition; +import org.openforis.idm.metamodel.EntityDefinition; +import org.openforis.idm.metamodel.NodeDefinition; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Component; + +import com.opencsv.CSVReader; + +@Component +public class RegionCalculationUtils{ + + private static final String AREA_CSV_COLUMN = "area"; + private static final String WEIGHT_CSV_COLUMN = "weight"; + private static final String PLOT_SET = "plot SET "; + private static final String UPDATE = "UPDATE "; + private static final String PLOT_ADD = "plot ADD "; + private static final String FLOAT = " FLOAT"; + private static final String ALTER_TABLE = "ALTER TABLE "; + private static final String ALTER_TABLE2 = ALTER_TABLE; + private static final String SHRUB_COUNT = "shrub_count"; + private static final String TREE_COUNT = "tree_count"; + private static final String REGION_AREAS_CSV = "region_areas.csv"; //$NON-NLS-1$ + private static final String ATTRIBUTE_AREAS_CSV = "areas_per_attribute.csv"; //$NON-NLS-1$ + private static final String PLOT_WEIGHT = "plot_weight"; //$NON-NLS-1$ + private static final String TREES_PER_EXP_FACTOR = "trees_per_expansion_factor"; //$NON-NLS-1$ + private static final String SHRUBS_PER_EXP_FACTOR = "shrubs_per_expansion_factor"; //$NON-NLS-1$ + private static final String NO_DATA_LAND_USE = "noData"; //$NON-NLS-1$ + private static final String MANY_TREES = "many_trees"; + private static final String MANY_SHRUBS = "many_shrubs"; + + public static final String EXPANSION_FACTOR = "expansion_factor"; //$NON-NLS-1$ + private final Logger logger = LoggerFactory.getLogger(RegionCalculationUtils.class); + + @Autowired + EarthSurveyService earthSurveyService; + + @Autowired + LocalPropertiesService localPropertiesService; + + @Autowired + private SchemaService schemaService; + + private JdbcTemplate jdbcTemplate; + + private ExportType exportType; + + public void handleRegionCalculation(ExportType exportType, JdbcTemplate jdbcTemplate){ + + try { + setExportType(exportType); + setJdbcTemplate(jdbcTemplate); + createWeightFactors(); + + // If the region_areas.csv is not present then try to add the areas "per attribute" using the file areas_per_attribute.csv + boolean areasAdded = false; + if(!addAreasPerRegion()){ + if( addAreasPerAttribute() ){ + areasAdded = true; + } + }else{ + areasAdded = true; + } + + if( areasAdded ){ + handleNumberOfTrees(); + handleNumberOfShrubs(); + recalculatePlotWeights(); + } + + } catch (Exception e) { + logger.error( "Error when calculating the expansion factors for the plots ", e); + } + } + + private void recalculatePlotWeights() { + String schemaName = getSchemaPrefix(); + String selectMinExpansionFactorSql = String.format("SELECT MIN(%s) FROM %splot", EXPANSION_FACTOR, schemaName); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + Double minExpansionFactor = getJdbcTemplate().queryForObject(selectMinExpansionFactorSql, Double.class); + //set plot_weight = expansion_factor / minExpansionFactor + String updatePlotWeightSql = String.format(Locale.US, "UPDATE %splot SET %s=%s/%.5f", schemaName, PLOT_WEIGHT, EXPANSION_FACTOR, minExpansionFactor); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + getJdbcTemplate().update(updatePlotWeightSql); + } + + private String getSchemaPrefix() { + return schemaService.getSchemaPrefix( getExportType() ); + } + + private void createWeightFactors(){ + final String schemaName = getSchemaPrefix(); + getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + EXPANSION_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + PLOT_WEIGHT + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + + /** + * This is the "old way"of assigning an expansion factor (the area in hectares that a plot represents) to a plot based on the information form the "region_areas.csv" file. + * @return True if there was a region_areas.csv file, false if not present so that areas were not assigned. + */ + private boolean addAreasPerRegion() { + + final File regionAreas = new File( localPropertiesService.getProjectFolder() + File.separatorChar + REGION_AREAS_CSV); + String schemaName = getSchemaPrefix(); + + if (regionAreas.exists()) { + + try( CSVReader csvReader = CsvReaderUtils.getCsvReader(regionAreas.getAbsolutePath()) ) { + + String[] csvLine = null; + + while( ( csvLine = csvReader.readNext() ) != null ){ + try { + String region = csvLine[0]; + String plotFile = csvLine[1]; + int areaHectares = Integer.parseInt( csvLine[2] ); + final Float plotWeight = 1f; // The plot weight will always be calculated in a later step + + Object[] parameters = new String[]{region,plotFile}; + + Integer plotsInRegion = getJdbcTemplate().queryForObject( + "SELECT count( DISTINCT "+EarthConstants.PLOT_ID+") FROM " + schemaName + "plot WHERE ( region=? OR plot_file=? ) AND land_use_category != '"+NO_DATA_LAND_USE+"' ", + Integer.class, + parameters); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + Float expansionFactorHectaresCalc = 0f; + if( plotsInRegion.intValue() != 0 ){ + expansionFactorHectaresCalc = (float)areaHectares / (float) plotsInRegion.intValue(); + } + + final Object[] updateValues = new Object[4]; + updateValues[0] = expansionFactorHectaresCalc; + updateValues[1] = plotWeight; + updateValues[2] = region; + updateValues[3] = plotFile; + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+EXPANSION_FACTOR+"=?, "+PLOT_WEIGHT+"=? WHERE region=? OR plot_file=?", updateValues); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + } catch (NumberFormatException e) { + logger.error("Possibly the header", e); //$NON-NLS-1$ + } + + } + + // FINALLY ASSIGN A WEIGHT OF CERO AND AN EXPANSION FACTOR OF 0 FOR THE PLOTS WITH NO_DATA + + final Object[] updateNoDataValues = new Object[3]; + updateNoDataValues[0] = 0; + updateNoDataValues[1] = 0; + updateNoDataValues[2] = NO_DATA_LAND_USE; + + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+EXPANSION_FACTOR+"=?, "+PLOT_WEIGHT+"=? WHERE land_use_category=?", updateNoDataValues); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + + } catch (FileNotFoundException e) { + logger.error("File not found?", e); //$NON-NLS-1$ + } catch (Exception e) { + logger.error("Error reading the CSV file", e); //$NON-NLS-1$ + } + + return true; + }else{ + logger.warn("No CSV " + REGION_AREAS_CSV + " present, calculating areas will not be possible"); //$NON-NLS-1$ + return false; + } + + } + + + private void handleNumberOfShrubs() { + String schemaName = getSchemaPrefix(); + // This is specific to the Global Forest Survey - Drylands monitoring assessment + if( + AnalysisSaikuService.surveyContains(SHRUB_COUNT, earthSurveyService.getCollectSurvey() ) + && + AnalysisSaikuService.surveyContains(MANY_SHRUBS, earthSurveyService.getCollectSurvey() ) + ){ + // First set the number of shrubs to 30 if the user assessed that there were more than 30 shrubs on the plot + // This way we get a conservative estimation + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+SHRUB_COUNT+"=30 WHERE " + MANY_SHRUBS + "='1'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + SHRUBS_PER_EXP_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+SHRUBS_PER_EXP_FACTOR+"="+EXPANSION_FACTOR+"*2*" + SHRUB_COUNT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + } + } + + private void handleNumberOfTrees() { + String schemaName = getSchemaPrefix(); + // This is specific to the Global Forest Survey - Drylands monitoring assessment + if( + AnalysisSaikuService.surveyContains(TREE_COUNT, earthSurveyService.getCollectSurvey() ) + && + AnalysisSaikuService.surveyContains(MANY_TREES, earthSurveyService.getCollectSurvey() ) + ){ + // First set the number of shrubs to 30 if the user assessed that there were more than 30 shrubs on the plot + // This way we get a conservative estimation + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+TREE_COUNT+"=30 WHERE " + MANY_TREES + "='1'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + TREES_PER_EXP_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+TREES_PER_EXP_FACTOR+"="+EXPANSION_FACTOR+"*2*" + TREE_COUNT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + } + } + + private boolean addAreasPerAttribute() { + + final File areasPerAttribute = new File( localPropertiesService.getProjectFolder() + File.separatorChar + ATTRIBUTE_AREAS_CSV); + String schemaName = getSchemaPrefix(); + + if (areasPerAttribute.exists()) { + + try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(areasPerAttribute.getAbsolutePath(), false) ){ + // The header (first line) should contain the names of the three columns : attribute_name,area + + String[] columnNames = csvReader.readNext(); + + + ArrayList attributeNames = new ArrayList(); + + if(columnNames.length < 2 ){ + throw new RuntimeException("The " + areasPerAttribute.getAbsolutePath() + " file needs have this format : attribute_name1,attribute_name2,...attribute_nameN,"+AREA_CSV_COLUMN+"./nAt least one attribute is necessary. This would be the attribute or attributes (their name in the survey definition) that would relate the plot with its expansion factor"); + } + + // The weight column has been removed in the latest versions of the areas per attribute csv + // Lets add it again for backward compatibility + boolean weightColumnPresent = columnNames[columnNames.length -1].equalsIgnoreCase(WEIGHT_CSV_COLUMN); + if( ! weightColumnPresent ) { + // We need to create anew array with an extra item + String[] longer = new String[columnNames.length + 1]; + for (int i = 0; i < columnNames.length; i++) + longer[i] = columnNames[i]; + longer[columnNames.length] = WEIGHT_CSV_COLUMN; // add the + columnNames = longer; + } + + for( int colPosition = 0; colPosition batchArgs = new ArrayList<>(); + int line = 1; + String[] csvLine = null; + while( ( csvLine = csvReader.readNext() ) != null ){ + try{ + float areaHectares = Float.parseFloat( csvLine[ columnNames.length-2 ] ); + final Float plotWeight = weightColumnPresent ? Float.parseFloat( csvLine[columnNames.length -1] ) : 1; // if no weight column present we assume same weight for all plots + + List attributeValues = extractAttributeValues(csvLine, attributeNames); + + Integer plotCountPerAttributes = getJdbcTemplate().queryForObject(plotCountSelectQuery, Integer.class, attributeValues.toArray()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + // Calculate the expansion factor: simply the division of the area for the selected attributes by the amount of plots that match the attribute values + Float expansionFactorHectaresCalc = 0f; + if( plotCountPerAttributes.intValue() != 0 ){ + expansionFactorHectaresCalc = areaHectares / (float) plotCountPerAttributes.intValue(); + } + + // Add the expansion factor and plot_weight to the values that will be sent with the update + attributeValues.add(0, expansionFactorHectaresCalc); + attributeValues.add(1, plotWeight); + + batchArgs.add(attributeValues.toArray()); + }catch( Exception e5){ + logger.error("Problem in line number " + line + " with values " + Arrays.toString( csvLine ), e5 ); + }finally{ + line++; + } + } + getJdbcTemplate().batchUpdate(updatePlotQuery, batchArgs); + } catch (FileNotFoundException e) { + logger.error("File not found?", e); //$NON-NLS-1$ + } catch (Exception e) { + logger.error("Error reading the CSV file", e); //$NON-NLS-1$ + } + + return true; + }else{ + logger.warn("No CSV " + ATTRIBUTE_AREAS_CSV + " present, calculating areas will not be possible"); //$NON-NLS-1$ + return false; + } + + } + + private List extractAttributeValues(String[] csvLine, List attributeNames) { + List values = new ArrayList<>(attributeNames.size()); + for(int colIndex = 0; colIndex < attributeNames.size(); colIndex++) { + String stringValue = csvLine[colIndex]; + String attributeName = attributeNames.get(colIndex); + Object value = getTypedValue(attributeName, stringValue); + values.add(value); + } + return values; + } + + private Object getTypedValue(String attributeName, String stringValue) { + EntityDefinition rootEntityDef = earthSurveyService.getRootEntityDefinition(); + NodeDefinition attributeDef = rootEntityDef.getChildDefinition(attributeName); + if (attributeDef instanceof BooleanAttributeDefinition) { + return Boolean.TRUE.toString().equalsIgnoreCase(stringValue) || "1".equals(stringValue); + } else { + return stringValue; + } + } + + private boolean isAttributeInPlotEntity(String attributeName) { + EntityDefinition rootEntityDefinition = earthSurveyService.getRootEntityDefinition(); + try { + rootEntityDefinition.getChildDefinition(attributeName); + } catch (Exception e) { + // The attribute does not exist under the plot entity + return false; + } + return true; + } + + public ExportType getExportType() { + return exportType; + } + + public void setExportType(ExportType exportType) { + this.exportType = exportType; + } + + private JdbcTemplate getJdbcTemplate() { + return jdbcTemplate; + } + + private void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + +} From 88f95818b274c4cb54c0c70ac438604575bd2954 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:52 +0100 Subject: [PATCH 0246/1620] New translations UpdateIniUtils.java (French) --- .../earth/app/view/Messages_fr.properties | 207 +++++++++++++++++- 1 file changed, 198 insertions(+), 9 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 7ea79d00ff..758b0b1b1a 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,9 +1,198 @@ -package org.openforis.collect.earth.app.service; - -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; - -public interface RDBPostProcessor { - - void processRDBData(InfiniteProgressMonitor progressListener); - -} +package org.openforis.collect.earth.app.service; + +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.net.URL; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Properties; +import java.util.concurrent.TimeUnit; + +import javax.xml.parsers.DocumentBuilderFactory; + +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.w3c.dom.Document; + +public class UpdateIniUtils { + + private static final String VERSION_ID = "version_id"; + private static final String VERSION_NAME = "version"; + private static final Logger logger = LoggerFactory.getLogger(UpdateIniUtils.class); + private final SimpleDateFormat fromXml = new SimpleDateFormat("yyyyMMddHHmm"); + public static final String UPDATE_INI = "update.ini"; + + /** + * Checks if there is a newer version of the Collect Earth updater available + * @return The new version build-number if there is a new version. Null if the version online is not newer than the one installed + */ + public String getVersionAvailableOnline(){ + + String installedVersionBuild = getVersionInstalled(); + String urlXmlUpdaterOnline = getValueFromUpdateIni("url", UPDATE_INI); //$NON-NLS-1$ + String onlineVersionBuild = getVersionBuild(urlXmlUpdaterOnline); + + + try { + long installedBuild = Long.parseLong(installedVersionBuild); + long onlineBuild = Long.parseLong(onlineVersionBuild); + + if( onlineBuild > installedBuild ){ + return onlineBuild+""; //$NON-NLS-1$ + } + + } catch (NumberFormatException e) { + logger.error("Error parsing the buildNumber ", e); //$NON-NLS-1$ + } + + return null; + } + + public static String getVersionInstalled() { + return getValueFromUpdateIni(VERSION_ID, UPDATE_INI); //$NON-NLS-1$ + } + + public static String getReleaseNameInstalled() { + return getValueFromUpdateIni(VERSION_NAME, UPDATE_INI); //$NON-NLS-1$ + } + + public boolean shouldWarnUser(LocalPropertiesService localPropertiesService){ + boolean warnUser = false; + + // newVersionAvailable will be null if the version installed is not older than the current version of the updater + String currentVersionOnline = getVersionAvailableOnline(); + + if( !StringUtils.isBlank( currentVersionOnline ) ){ + + // There is a new version. did the user chose "Not to be bother"with this update? + String lastIgnoredBuildNumber = localPropertiesService.getValue(EarthProperty.LAST_IGNORED_UPDATE); + + if( + ( isCurrentNewerThanIgnoredUpdate(lastIgnoredBuildNumber, currentVersionOnline) && isMajorUpdate()) + || + isInstalledOlderThanOneMonth(currentVersionOnline, getVersionInstalled() ) + ){ + warnUser = true; + } + + } + return warnUser; + } + + + /** + * Check if the current version of the updater is newer than the version of the updater that was last ignored + * @param lastIgnoredBuildNumber The version of the last ignored updater as a string with the format yyyyMMddHHmm + * @param buildNumberOnline The version of the current updater in the server in the format yyyyMMddHHmm + * @return True is the new version of the updater is newer than the one last ignored. False otherwise + */ + private boolean isCurrentNewerThanIgnoredUpdate(String lastIgnoredBuildNumber, String buildNumberOnline){ + + boolean isNewerThanIgnored = true; + + try { + if( !StringUtils.isEmpty(lastIgnoredBuildNumber) && !StringUtils.isEmpty(buildNumberOnline) ){ + Long ignoredBuildNumberUpdate =new Long(lastIgnoredBuildNumber); + Long buildOnline = new Long( buildNumberOnline ); + + isNewerThanIgnored = ignoredBuildNumberUpdate 30); + } catch (Exception e) { + logger.error( "Error calculating difference in dates bvetween installed and available versions", e ); + } + + return isOlderThanOneMonth; + } + + + /** + * Checks if the update in the server is a "Major"update, meaning that every user should update Collect Earth + * @return True if the version on the server should be installed by all users + */ + public boolean isMajorUpdate() { + String urlXmlUpdaterOnline = getValueFromUpdateIni("url", UPDATE_INI); //$NON-NLS-1$ + String majorUpdateString = getXmlValueFromTag(urlXmlUpdaterOnline, VERSION_NAME); + return majorUpdateString.toLowerCase().contains("major"); + } + + private String getVersionBuild(String urlXmlUpdate) { + String tagname = "versionId"; //$NON-NLS-1$ + return getXmlValueFromTag(urlXmlUpdate, tagname); + } + + public String getXmlValueFromTag(String urlXmlUpdate, String tagname) { + + String onlineVersion = "0"; //$NON-NLS-1$ + try { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + //factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); // Compliant + //factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); // compliant + + factory.setNamespaceAware(true); + Document parse = factory.newDocumentBuilder().parse(new URL(urlXmlUpdate).openStream()); + + onlineVersion = parse.getElementsByTagName(tagname).item(0).getChildNodes().item(0).getNodeValue(); + + logger.info("CE Online Version available {}" , onlineVersion); + } catch (Exception e) { + logger.warn("Error while reading the remote XML where the updater version is defined", e); //$NON-NLS-1$ + } + + return onlineVersion; + } + + public static String getValueFromUpdateIni(String key, String pathToUpdateIni) { + Properties properties = new Properties(); + String value = "unknown"; //$NON-NLS-1$ + try (FileInputStream fis = new FileInputStream(pathToUpdateIni) ){ + properties.load( fis ); + value = properties.getProperty(key); + } catch (FileNotFoundException e) { + logger.error("The update.ini file could not be found", e); //$NON-NLS-1$ + } catch (IOException e) { + logger.error("Error opening the update.ini file", e); //$NON-NLS-1$ + } + return value; + } + + public String convertToDate(String buildVersionNumber) { + SimpleDateFormat humanReadable = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = buildVersionNumber; + try { + + reformattedStr = humanReadable.format(fromXml.parse(buildVersionNumber)); + } catch (java.text.ParseException e) { + logger.error("Error parsing the date from the XML updater" , e ); + } + + return reformattedStr; + } +} From fd1ed59468d31ad3b60c57ac222fe14241c9d180 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:53 +0100 Subject: [PATCH 0247/1620] New translations RegionCalculationUtils.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 385 +++++++++++++++++- 1 file changed, 376 insertions(+), 9 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 7ea79d00ff..905f384f1e 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,9 +1,376 @@ -package org.openforis.collect.earth.app.service; - -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; - -public interface RDBPostProcessor { - - void processRDBData(InfiniteProgressMonitor progressListener); - -} +package org.openforis.collect.earth.app.service; + +import java.io.File; +import java.io.FileNotFoundException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Locale; + +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.idm.metamodel.BooleanAttributeDefinition; +import org.openforis.idm.metamodel.EntityDefinition; +import org.openforis.idm.metamodel.NodeDefinition; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Component; + +import com.opencsv.CSVReader; + +@Component +public class RegionCalculationUtils{ + + private static final String AREA_CSV_COLUMN = "area"; + private static final String WEIGHT_CSV_COLUMN = "weight"; + private static final String PLOT_SET = "plot SET "; + private static final String UPDATE = "UPDATE "; + private static final String PLOT_ADD = "plot ADD "; + private static final String FLOAT = " FLOAT"; + private static final String ALTER_TABLE = "ALTER TABLE "; + private static final String ALTER_TABLE2 = ALTER_TABLE; + private static final String SHRUB_COUNT = "shrub_count"; + private static final String TREE_COUNT = "tree_count"; + private static final String REGION_AREAS_CSV = "region_areas.csv"; //$NON-NLS-1$ + private static final String ATTRIBUTE_AREAS_CSV = "areas_per_attribute.csv"; //$NON-NLS-1$ + private static final String PLOT_WEIGHT = "plot_weight"; //$NON-NLS-1$ + private static final String TREES_PER_EXP_FACTOR = "trees_per_expansion_factor"; //$NON-NLS-1$ + private static final String SHRUBS_PER_EXP_FACTOR = "shrubs_per_expansion_factor"; //$NON-NLS-1$ + private static final String NO_DATA_LAND_USE = "noData"; //$NON-NLS-1$ + private static final String MANY_TREES = "many_trees"; + private static final String MANY_SHRUBS = "many_shrubs"; + + public static final String EXPANSION_FACTOR = "expansion_factor"; //$NON-NLS-1$ + private final Logger logger = LoggerFactory.getLogger(RegionCalculationUtils.class); + + @Autowired + EarthSurveyService earthSurveyService; + + @Autowired + LocalPropertiesService localPropertiesService; + + @Autowired + private SchemaService schemaService; + + private JdbcTemplate jdbcTemplate; + + private ExportType exportType; + + public void handleRegionCalculation(ExportType exportType, JdbcTemplate jdbcTemplate){ + + try { + setExportType(exportType); + setJdbcTemplate(jdbcTemplate); + createWeightFactors(); + + // If the region_areas.csv is not present then try to add the areas "per attribute" using the file areas_per_attribute.csv + boolean areasAdded = false; + if(!addAreasPerRegion()){ + if( addAreasPerAttribute() ){ + areasAdded = true; + } + }else{ + areasAdded = true; + } + + if( areasAdded ){ + handleNumberOfTrees(); + handleNumberOfShrubs(); + recalculatePlotWeights(); + } + + } catch (Exception e) { + logger.error( "Error when calculating the expansion factors for the plots ", e); + } + } + + private void recalculatePlotWeights() { + String schemaName = getSchemaPrefix(); + String selectMinExpansionFactorSql = String.format("SELECT MIN(%s) FROM %splot", EXPANSION_FACTOR, schemaName); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + Double minExpansionFactor = getJdbcTemplate().queryForObject(selectMinExpansionFactorSql, Double.class); + //set plot_weight = expansion_factor / minExpansionFactor + String updatePlotWeightSql = String.format(Locale.US, "UPDATE %splot SET %s=%s/%.5f", schemaName, PLOT_WEIGHT, EXPANSION_FACTOR, minExpansionFactor); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + getJdbcTemplate().update(updatePlotWeightSql); + } + + private String getSchemaPrefix() { + return schemaService.getSchemaPrefix( getExportType() ); + } + + private void createWeightFactors(){ + final String schemaName = getSchemaPrefix(); + getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + EXPANSION_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + PLOT_WEIGHT + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + + /** + * This is the "old way"of assigning an expansion factor (the area in hectares that a plot represents) to a plot based on the information form the "region_areas.csv" file. + * @return True if there was a region_areas.csv file, false if not present so that areas were not assigned. + */ + private boolean addAreasPerRegion() { + + final File regionAreas = new File( localPropertiesService.getProjectFolder() + File.separatorChar + REGION_AREAS_CSV); + String schemaName = getSchemaPrefix(); + + if (regionAreas.exists()) { + + try( CSVReader csvReader = CsvReaderUtils.getCsvReader(regionAreas.getAbsolutePath()) ) { + + String[] csvLine = null; + + while( ( csvLine = csvReader.readNext() ) != null ){ + try { + String region = csvLine[0]; + String plotFile = csvLine[1]; + int areaHectares = Integer.parseInt( csvLine[2] ); + final Float plotWeight = 1f; // The plot weight will always be calculated in a later step + + Object[] parameters = new String[]{region,plotFile}; + + Integer plotsInRegion = getJdbcTemplate().queryForObject( + "SELECT count( DISTINCT "+EarthConstants.PLOT_ID+") FROM " + schemaName + "plot WHERE ( region=? OR plot_file=? ) AND land_use_category != '"+NO_DATA_LAND_USE+"' ", + Integer.class, + parameters); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + Float expansionFactorHectaresCalc = 0f; + if( plotsInRegion.intValue() != 0 ){ + expansionFactorHectaresCalc = (float)areaHectares / (float) plotsInRegion.intValue(); + } + + final Object[] updateValues = new Object[4]; + updateValues[0] = expansionFactorHectaresCalc; + updateValues[1] = plotWeight; + updateValues[2] = region; + updateValues[3] = plotFile; + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+EXPANSION_FACTOR+"=?, "+PLOT_WEIGHT+"=? WHERE region=? OR plot_file=?", updateValues); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + } catch (NumberFormatException e) { + logger.error("Possibly the header", e); //$NON-NLS-1$ + } + + } + + // FINALLY ASSIGN A WEIGHT OF CERO AND AN EXPANSION FACTOR OF 0 FOR THE PLOTS WITH NO_DATA + + final Object[] updateNoDataValues = new Object[3]; + updateNoDataValues[0] = 0; + updateNoDataValues[1] = 0; + updateNoDataValues[2] = NO_DATA_LAND_USE; + + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+EXPANSION_FACTOR+"=?, "+PLOT_WEIGHT+"=? WHERE land_use_category=?", updateNoDataValues); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + + } catch (FileNotFoundException e) { + logger.error("File not found?", e); //$NON-NLS-1$ + } catch (Exception e) { + logger.error("Error reading the CSV file", e); //$NON-NLS-1$ + } + + return true; + }else{ + logger.warn("No CSV " + REGION_AREAS_CSV + " present, calculating areas will not be possible"); //$NON-NLS-1$ + return false; + } + + } + + + private void handleNumberOfShrubs() { + String schemaName = getSchemaPrefix(); + // This is specific to the Global Forest Survey - Drylands monitoring assessment + if( + AnalysisSaikuService.surveyContains(SHRUB_COUNT, earthSurveyService.getCollectSurvey() ) + && + AnalysisSaikuService.surveyContains(MANY_SHRUBS, earthSurveyService.getCollectSurvey() ) + ){ + // First set the number of shrubs to 30 if the user assessed that there were more than 30 shrubs on the plot + // This way we get a conservative estimation + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+SHRUB_COUNT+"=30 WHERE " + MANY_SHRUBS + "='1'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + SHRUBS_PER_EXP_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+SHRUBS_PER_EXP_FACTOR+"="+EXPANSION_FACTOR+"*2*" + SHRUB_COUNT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + } + } + + private void handleNumberOfTrees() { + String schemaName = getSchemaPrefix(); + // This is specific to the Global Forest Survey - Drylands monitoring assessment + if( + AnalysisSaikuService.surveyContains(TREE_COUNT, earthSurveyService.getCollectSurvey() ) + && + AnalysisSaikuService.surveyContains(MANY_TREES, earthSurveyService.getCollectSurvey() ) + ){ + // First set the number of shrubs to 30 if the user assessed that there were more than 30 shrubs on the plot + // This way we get a conservative estimation + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+TREE_COUNT+"=30 WHERE " + MANY_TREES + "='1'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + TREES_PER_EXP_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+TREES_PER_EXP_FACTOR+"="+EXPANSION_FACTOR+"*2*" + TREE_COUNT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + } + } + + private boolean addAreasPerAttribute() { + + final File areasPerAttribute = new File( localPropertiesService.getProjectFolder() + File.separatorChar + ATTRIBUTE_AREAS_CSV); + String schemaName = getSchemaPrefix(); + + if (areasPerAttribute.exists()) { + + try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(areasPerAttribute.getAbsolutePath(), false) ){ + // The header (first line) should contain the names of the three columns : attribute_name,area + + String[] columnNames = csvReader.readNext(); + + + ArrayList attributeNames = new ArrayList(); + + if(columnNames.length < 2 ){ + throw new RuntimeException("The " + areasPerAttribute.getAbsolutePath() + " file needs have this format : attribute_name1,attribute_name2,...attribute_nameN,"+AREA_CSV_COLUMN+"./nAt least one attribute is necessary. This would be the attribute or attributes (their name in the survey definition) that would relate the plot with its expansion factor"); + } + + // The weight column has been removed in the latest versions of the areas per attribute csv + // Lets add it again for backward compatibility + boolean weightColumnPresent = columnNames[columnNames.length -1].equalsIgnoreCase(WEIGHT_CSV_COLUMN); + if( ! weightColumnPresent ) { + // We need to create anew array with an extra item + String[] longer = new String[columnNames.length + 1]; + for (int i = 0; i < columnNames.length; i++) + longer[i] = columnNames[i]; + longer[columnNames.length] = WEIGHT_CSV_COLUMN; // add the + columnNames = longer; + } + + for( int colPosition = 0; colPosition batchArgs = new ArrayList<>(); + int line = 1; + String[] csvLine = null; + while( ( csvLine = csvReader.readNext() ) != null ){ + try{ + float areaHectares = Float.parseFloat( csvLine[ columnNames.length-2 ] ); + final Float plotWeight = weightColumnPresent ? Float.parseFloat( csvLine[columnNames.length -1] ) : 1; // if no weight column present we assume same weight for all plots + + List attributeValues = extractAttributeValues(csvLine, attributeNames); + + Integer plotCountPerAttributes = getJdbcTemplate().queryForObject(plotCountSelectQuery, Integer.class, attributeValues.toArray()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + // Calculate the expansion factor: simply the division of the area for the selected attributes by the amount of plots that match the attribute values + Float expansionFactorHectaresCalc = 0f; + if( plotCountPerAttributes.intValue() != 0 ){ + expansionFactorHectaresCalc = areaHectares / (float) plotCountPerAttributes.intValue(); + } + + // Add the expansion factor and plot_weight to the values that will be sent with the update + attributeValues.add(0, expansionFactorHectaresCalc); + attributeValues.add(1, plotWeight); + + batchArgs.add(attributeValues.toArray()); + }catch( Exception e5){ + logger.error("Problem in line number " + line + " with values " + Arrays.toString( csvLine ), e5 ); + }finally{ + line++; + } + } + getJdbcTemplate().batchUpdate(updatePlotQuery, batchArgs); + } catch (FileNotFoundException e) { + logger.error("File not found?", e); //$NON-NLS-1$ + } catch (Exception e) { + logger.error("Error reading the CSV file", e); //$NON-NLS-1$ + } + + return true; + }else{ + logger.warn("No CSV " + ATTRIBUTE_AREAS_CSV + " present, calculating areas will not be possible"); //$NON-NLS-1$ + return false; + } + + } + + private List extractAttributeValues(String[] csvLine, List attributeNames) { + List values = new ArrayList<>(attributeNames.size()); + for(int colIndex = 0; colIndex < attributeNames.size(); colIndex++) { + String stringValue = csvLine[colIndex]; + String attributeName = attributeNames.get(colIndex); + Object value = getTypedValue(attributeName, stringValue); + values.add(value); + } + return values; + } + + private Object getTypedValue(String attributeName, String stringValue) { + EntityDefinition rootEntityDef = earthSurveyService.getRootEntityDefinition(); + NodeDefinition attributeDef = rootEntityDef.getChildDefinition(attributeName); + if (attributeDef instanceof BooleanAttributeDefinition) { + return Boolean.TRUE.toString().equalsIgnoreCase(stringValue) || "1".equals(stringValue); + } else { + return stringValue; + } + } + + private boolean isAttributeInPlotEntity(String attributeName) { + EntityDefinition rootEntityDefinition = earthSurveyService.getRootEntityDefinition(); + try { + rootEntityDefinition.getChildDefinition(attributeName); + } catch (Exception e) { + // The attribute does not exist under the plot entity + return false; + } + return true; + } + + public ExportType getExportType() { + return exportType; + } + + public void setExportType(ExportType exportType) { + this.exportType = exportType; + } + + private JdbcTemplate getJdbcTemplate() { + return jdbcTemplate; + } + + private void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + +} From c4e7cc5c799010186033f660879a55266427ae86 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:54 +0100 Subject: [PATCH 0248/1620] New translations RegionCalculationUtils.java (English) --- .../earth/app/view/Messages_en.properties | 385 +++++++++++++++++- 1 file changed, 376 insertions(+), 9 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 7ea79d00ff..905f384f1e 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,9 +1,376 @@ -package org.openforis.collect.earth.app.service; - -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; - -public interface RDBPostProcessor { - - void processRDBData(InfiniteProgressMonitor progressListener); - -} +package org.openforis.collect.earth.app.service; + +import java.io.File; +import java.io.FileNotFoundException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Locale; + +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.idm.metamodel.BooleanAttributeDefinition; +import org.openforis.idm.metamodel.EntityDefinition; +import org.openforis.idm.metamodel.NodeDefinition; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Component; + +import com.opencsv.CSVReader; + +@Component +public class RegionCalculationUtils{ + + private static final String AREA_CSV_COLUMN = "area"; + private static final String WEIGHT_CSV_COLUMN = "weight"; + private static final String PLOT_SET = "plot SET "; + private static final String UPDATE = "UPDATE "; + private static final String PLOT_ADD = "plot ADD "; + private static final String FLOAT = " FLOAT"; + private static final String ALTER_TABLE = "ALTER TABLE "; + private static final String ALTER_TABLE2 = ALTER_TABLE; + private static final String SHRUB_COUNT = "shrub_count"; + private static final String TREE_COUNT = "tree_count"; + private static final String REGION_AREAS_CSV = "region_areas.csv"; //$NON-NLS-1$ + private static final String ATTRIBUTE_AREAS_CSV = "areas_per_attribute.csv"; //$NON-NLS-1$ + private static final String PLOT_WEIGHT = "plot_weight"; //$NON-NLS-1$ + private static final String TREES_PER_EXP_FACTOR = "trees_per_expansion_factor"; //$NON-NLS-1$ + private static final String SHRUBS_PER_EXP_FACTOR = "shrubs_per_expansion_factor"; //$NON-NLS-1$ + private static final String NO_DATA_LAND_USE = "noData"; //$NON-NLS-1$ + private static final String MANY_TREES = "many_trees"; + private static final String MANY_SHRUBS = "many_shrubs"; + + public static final String EXPANSION_FACTOR = "expansion_factor"; //$NON-NLS-1$ + private final Logger logger = LoggerFactory.getLogger(RegionCalculationUtils.class); + + @Autowired + EarthSurveyService earthSurveyService; + + @Autowired + LocalPropertiesService localPropertiesService; + + @Autowired + private SchemaService schemaService; + + private JdbcTemplate jdbcTemplate; + + private ExportType exportType; + + public void handleRegionCalculation(ExportType exportType, JdbcTemplate jdbcTemplate){ + + try { + setExportType(exportType); + setJdbcTemplate(jdbcTemplate); + createWeightFactors(); + + // If the region_areas.csv is not present then try to add the areas "per attribute" using the file areas_per_attribute.csv + boolean areasAdded = false; + if(!addAreasPerRegion()){ + if( addAreasPerAttribute() ){ + areasAdded = true; + } + }else{ + areasAdded = true; + } + + if( areasAdded ){ + handleNumberOfTrees(); + handleNumberOfShrubs(); + recalculatePlotWeights(); + } + + } catch (Exception e) { + logger.error( "Error when calculating the expansion factors for the plots ", e); + } + } + + private void recalculatePlotWeights() { + String schemaName = getSchemaPrefix(); + String selectMinExpansionFactorSql = String.format("SELECT MIN(%s) FROM %splot", EXPANSION_FACTOR, schemaName); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + Double minExpansionFactor = getJdbcTemplate().queryForObject(selectMinExpansionFactorSql, Double.class); + //set plot_weight = expansion_factor / minExpansionFactor + String updatePlotWeightSql = String.format(Locale.US, "UPDATE %splot SET %s=%s/%.5f", schemaName, PLOT_WEIGHT, EXPANSION_FACTOR, minExpansionFactor); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + getJdbcTemplate().update(updatePlotWeightSql); + } + + private String getSchemaPrefix() { + return schemaService.getSchemaPrefix( getExportType() ); + } + + private void createWeightFactors(){ + final String schemaName = getSchemaPrefix(); + getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + EXPANSION_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + PLOT_WEIGHT + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + + /** + * This is the "old way"of assigning an expansion factor (the area in hectares that a plot represents) to a plot based on the information form the "region_areas.csv" file. + * @return True if there was a region_areas.csv file, false if not present so that areas were not assigned. + */ + private boolean addAreasPerRegion() { + + final File regionAreas = new File( localPropertiesService.getProjectFolder() + File.separatorChar + REGION_AREAS_CSV); + String schemaName = getSchemaPrefix(); + + if (regionAreas.exists()) { + + try( CSVReader csvReader = CsvReaderUtils.getCsvReader(regionAreas.getAbsolutePath()) ) { + + String[] csvLine = null; + + while( ( csvLine = csvReader.readNext() ) != null ){ + try { + String region = csvLine[0]; + String plotFile = csvLine[1]; + int areaHectares = Integer.parseInt( csvLine[2] ); + final Float plotWeight = 1f; // The plot weight will always be calculated in a later step + + Object[] parameters = new String[]{region,plotFile}; + + Integer plotsInRegion = getJdbcTemplate().queryForObject( + "SELECT count( DISTINCT "+EarthConstants.PLOT_ID+") FROM " + schemaName + "plot WHERE ( region=? OR plot_file=? ) AND land_use_category != '"+NO_DATA_LAND_USE+"' ", + Integer.class, + parameters); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + Float expansionFactorHectaresCalc = 0f; + if( plotsInRegion.intValue() != 0 ){ + expansionFactorHectaresCalc = (float)areaHectares / (float) plotsInRegion.intValue(); + } + + final Object[] updateValues = new Object[4]; + updateValues[0] = expansionFactorHectaresCalc; + updateValues[1] = plotWeight; + updateValues[2] = region; + updateValues[3] = plotFile; + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+EXPANSION_FACTOR+"=?, "+PLOT_WEIGHT+"=? WHERE region=? OR plot_file=?", updateValues); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + } catch (NumberFormatException e) { + logger.error("Possibly the header", e); //$NON-NLS-1$ + } + + } + + // FINALLY ASSIGN A WEIGHT OF CERO AND AN EXPANSION FACTOR OF 0 FOR THE PLOTS WITH NO_DATA + + final Object[] updateNoDataValues = new Object[3]; + updateNoDataValues[0] = 0; + updateNoDataValues[1] = 0; + updateNoDataValues[2] = NO_DATA_LAND_USE; + + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+EXPANSION_FACTOR+"=?, "+PLOT_WEIGHT+"=? WHERE land_use_category=?", updateNoDataValues); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + + } catch (FileNotFoundException e) { + logger.error("File not found?", e); //$NON-NLS-1$ + } catch (Exception e) { + logger.error("Error reading the CSV file", e); //$NON-NLS-1$ + } + + return true; + }else{ + logger.warn("No CSV " + REGION_AREAS_CSV + " present, calculating areas will not be possible"); //$NON-NLS-1$ + return false; + } + + } + + + private void handleNumberOfShrubs() { + String schemaName = getSchemaPrefix(); + // This is specific to the Global Forest Survey - Drylands monitoring assessment + if( + AnalysisSaikuService.surveyContains(SHRUB_COUNT, earthSurveyService.getCollectSurvey() ) + && + AnalysisSaikuService.surveyContains(MANY_SHRUBS, earthSurveyService.getCollectSurvey() ) + ){ + // First set the number of shrubs to 30 if the user assessed that there were more than 30 shrubs on the plot + // This way we get a conservative estimation + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+SHRUB_COUNT+"=30 WHERE " + MANY_SHRUBS + "='1'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + SHRUBS_PER_EXP_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+SHRUBS_PER_EXP_FACTOR+"="+EXPANSION_FACTOR+"*2*" + SHRUB_COUNT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + } + } + + private void handleNumberOfTrees() { + String schemaName = getSchemaPrefix(); + // This is specific to the Global Forest Survey - Drylands monitoring assessment + if( + AnalysisSaikuService.surveyContains(TREE_COUNT, earthSurveyService.getCollectSurvey() ) + && + AnalysisSaikuService.surveyContains(MANY_TREES, earthSurveyService.getCollectSurvey() ) + ){ + // First set the number of shrubs to 30 if the user assessed that there were more than 30 shrubs on the plot + // This way we get a conservative estimation + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+TREE_COUNT+"=30 WHERE " + MANY_TREES + "='1'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + TREES_PER_EXP_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+TREES_PER_EXP_FACTOR+"="+EXPANSION_FACTOR+"*2*" + TREE_COUNT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + } + } + + private boolean addAreasPerAttribute() { + + final File areasPerAttribute = new File( localPropertiesService.getProjectFolder() + File.separatorChar + ATTRIBUTE_AREAS_CSV); + String schemaName = getSchemaPrefix(); + + if (areasPerAttribute.exists()) { + + try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(areasPerAttribute.getAbsolutePath(), false) ){ + // The header (first line) should contain the names of the three columns : attribute_name,area + + String[] columnNames = csvReader.readNext(); + + + ArrayList attributeNames = new ArrayList(); + + if(columnNames.length < 2 ){ + throw new RuntimeException("The " + areasPerAttribute.getAbsolutePath() + " file needs have this format : attribute_name1,attribute_name2,...attribute_nameN,"+AREA_CSV_COLUMN+"./nAt least one attribute is necessary. This would be the attribute or attributes (their name in the survey definition) that would relate the plot with its expansion factor"); + } + + // The weight column has been removed in the latest versions of the areas per attribute csv + // Lets add it again for backward compatibility + boolean weightColumnPresent = columnNames[columnNames.length -1].equalsIgnoreCase(WEIGHT_CSV_COLUMN); + if( ! weightColumnPresent ) { + // We need to create anew array with an extra item + String[] longer = new String[columnNames.length + 1]; + for (int i = 0; i < columnNames.length; i++) + longer[i] = columnNames[i]; + longer[columnNames.length] = WEIGHT_CSV_COLUMN; // add the + columnNames = longer; + } + + for( int colPosition = 0; colPosition batchArgs = new ArrayList<>(); + int line = 1; + String[] csvLine = null; + while( ( csvLine = csvReader.readNext() ) != null ){ + try{ + float areaHectares = Float.parseFloat( csvLine[ columnNames.length-2 ] ); + final Float plotWeight = weightColumnPresent ? Float.parseFloat( csvLine[columnNames.length -1] ) : 1; // if no weight column present we assume same weight for all plots + + List attributeValues = extractAttributeValues(csvLine, attributeNames); + + Integer plotCountPerAttributes = getJdbcTemplate().queryForObject(plotCountSelectQuery, Integer.class, attributeValues.toArray()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + // Calculate the expansion factor: simply the division of the area for the selected attributes by the amount of plots that match the attribute values + Float expansionFactorHectaresCalc = 0f; + if( plotCountPerAttributes.intValue() != 0 ){ + expansionFactorHectaresCalc = areaHectares / (float) plotCountPerAttributes.intValue(); + } + + // Add the expansion factor and plot_weight to the values that will be sent with the update + attributeValues.add(0, expansionFactorHectaresCalc); + attributeValues.add(1, plotWeight); + + batchArgs.add(attributeValues.toArray()); + }catch( Exception e5){ + logger.error("Problem in line number " + line + " with values " + Arrays.toString( csvLine ), e5 ); + }finally{ + line++; + } + } + getJdbcTemplate().batchUpdate(updatePlotQuery, batchArgs); + } catch (FileNotFoundException e) { + logger.error("File not found?", e); //$NON-NLS-1$ + } catch (Exception e) { + logger.error("Error reading the CSV file", e); //$NON-NLS-1$ + } + + return true; + }else{ + logger.warn("No CSV " + ATTRIBUTE_AREAS_CSV + " present, calculating areas will not be possible"); //$NON-NLS-1$ + return false; + } + + } + + private List extractAttributeValues(String[] csvLine, List attributeNames) { + List values = new ArrayList<>(attributeNames.size()); + for(int colIndex = 0; colIndex < attributeNames.size(); colIndex++) { + String stringValue = csvLine[colIndex]; + String attributeName = attributeNames.get(colIndex); + Object value = getTypedValue(attributeName, stringValue); + values.add(value); + } + return values; + } + + private Object getTypedValue(String attributeName, String stringValue) { + EntityDefinition rootEntityDef = earthSurveyService.getRootEntityDefinition(); + NodeDefinition attributeDef = rootEntityDef.getChildDefinition(attributeName); + if (attributeDef instanceof BooleanAttributeDefinition) { + return Boolean.TRUE.toString().equalsIgnoreCase(stringValue) || "1".equals(stringValue); + } else { + return stringValue; + } + } + + private boolean isAttributeInPlotEntity(String attributeName) { + EntityDefinition rootEntityDefinition = earthSurveyService.getRootEntityDefinition(); + try { + rootEntityDefinition.getChildDefinition(attributeName); + } catch (Exception e) { + // The attribute does not exist under the plot entity + return false; + } + return true; + } + + public ExportType getExportType() { + return exportType; + } + + public void setExportType(ExportType exportType) { + this.exportType = exportType; + } + + private JdbcTemplate getJdbcTemplate() { + return jdbcTemplate; + } + + private void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + +} From 5e1b1cea28086736df7210d62ed106630ceee625 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:55 +0100 Subject: [PATCH 0249/1620] New translations SaikuExecutionException.java (French) --- .../earth/app/view/Messages_fr.properties | 195 ++---------------- 1 file changed, 13 insertions(+), 182 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 758b0b1b1a..27a0bdef28 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,198 +1,29 @@ package org.openforis.collect.earth.app.service; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.net.URL; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Properties; -import java.util.concurrent.TimeUnit; - -import javax.xml.parsers.DocumentBuilderFactory; - -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.w3c.dom.Document; - -public class UpdateIniUtils { - - private static final String VERSION_ID = "version_id"; - private static final String VERSION_NAME = "version"; - private static final Logger logger = LoggerFactory.getLogger(UpdateIniUtils.class); - private final SimpleDateFormat fromXml = new SimpleDateFormat("yyyyMMddHHmm"); - public static final String UPDATE_INI = "update.ini"; - - /** - * Checks if there is a newer version of the Collect Earth updater available - * @return The new version build-number if there is a new version. Null if the version online is not newer than the one installed - */ - public String getVersionAvailableOnline(){ - - String installedVersionBuild = getVersionInstalled(); - String urlXmlUpdaterOnline = getValueFromUpdateIni("url", UPDATE_INI); //$NON-NLS-1$ - String onlineVersionBuild = getVersionBuild(urlXmlUpdaterOnline); - - - try { - long installedBuild = Long.parseLong(installedVersionBuild); - long onlineBuild = Long.parseLong(onlineVersionBuild); - - if( onlineBuild > installedBuild ){ - return onlineBuild+""; //$NON-NLS-1$ - } - - } catch (NumberFormatException e) { - logger.error("Error parsing the buildNumber ", e); //$NON-NLS-1$ - } - - return null; - } - - public static String getVersionInstalled() { - return getValueFromUpdateIni(VERSION_ID, UPDATE_INI); //$NON-NLS-1$ - } - - public static String getReleaseNameInstalled() { - return getValueFromUpdateIni(VERSION_NAME, UPDATE_INI); //$NON-NLS-1$ - } - - public boolean shouldWarnUser(LocalPropertiesService localPropertiesService){ - boolean warnUser = false; - - // newVersionAvailable will be null if the version installed is not older than the current version of the updater - String currentVersionOnline = getVersionAvailableOnline(); - - if( !StringUtils.isBlank( currentVersionOnline ) ){ - - // There is a new version. did the user chose "Not to be bother"with this update? - String lastIgnoredBuildNumber = localPropertiesService.getValue(EarthProperty.LAST_IGNORED_UPDATE); - - if( - ( isCurrentNewerThanIgnoredUpdate(lastIgnoredBuildNumber, currentVersionOnline) && isMajorUpdate()) - || - isInstalledOlderThanOneMonth(currentVersionOnline, getVersionInstalled() ) - ){ - warnUser = true; - } - - } - return warnUser; - } - - - /** - * Check if the current version of the updater is newer than the version of the updater that was last ignored - * @param lastIgnoredBuildNumber The version of the last ignored updater as a string with the format yyyyMMddHHmm - * @param buildNumberOnline The version of the current updater in the server in the format yyyyMMddHHmm - * @return True is the new version of the updater is newer than the one last ignored. False otherwise - */ - private boolean isCurrentNewerThanIgnoredUpdate(String lastIgnoredBuildNumber, String buildNumberOnline){ - - boolean isNewerThanIgnored = true; - - try { - if( !StringUtils.isEmpty(lastIgnoredBuildNumber) && !StringUtils.isEmpty(buildNumberOnline) ){ - Long ignoredBuildNumberUpdate =new Long(lastIgnoredBuildNumber); - Long buildOnline = new Long( buildNumberOnline ); - - isNewerThanIgnored = ignoredBuildNumberUpdate 30); - } catch (Exception e) { - logger.error( "Error calculating difference in dates bvetween installed and available versions", e ); - } - - return isOlderThanOneMonth; - } - + private static final long serialVersionUID = 1L; - /** - * Checks if the update in the server is a "Major"update, meaning that every user should update Collect Earth - * @return True if the version on the server should be installed by all users - */ - public boolean isMajorUpdate() { - String urlXmlUpdaterOnline = getValueFromUpdateIni("url", UPDATE_INI); //$NON-NLS-1$ - String majorUpdateString = getXmlValueFromTag(urlXmlUpdaterOnline, VERSION_NAME); - return majorUpdateString.toLowerCase().contains("major"); + public SaikuExecutionException() { + super(); } - private String getVersionBuild(String urlXmlUpdate) { - String tagname = "versionId"; //$NON-NLS-1$ - return getXmlValueFromTag(urlXmlUpdate, tagname); + public SaikuExecutionException(String message, Throwable cause) { + super(message, cause); } - public String getXmlValueFromTag(String urlXmlUpdate, String tagname) { - - String onlineVersion = "0"; //$NON-NLS-1$ - try { - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - //factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); // Compliant - //factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); // compliant - - factory.setNamespaceAware(true); - Document parse = factory.newDocumentBuilder().parse(new URL(urlXmlUpdate).openStream()); - - onlineVersion = parse.getElementsByTagName(tagname).item(0).getChildNodes().item(0).getNodeValue(); - - logger.info("CE Online Version available {}" , onlineVersion); - } catch (Exception e) { - logger.warn("Error while reading the remote XML where the updater version is defined", e); //$NON-NLS-1$ - } - - return onlineVersion; + public SaikuExecutionException(String message) { + super(message); } - public static String getValueFromUpdateIni(String key, String pathToUpdateIni) { - Properties properties = new Properties(); - String value = "unknown"; //$NON-NLS-1$ - try (FileInputStream fis = new FileInputStream(pathToUpdateIni) ){ - properties.load( fis ); - value = properties.getProperty(key); - } catch (FileNotFoundException e) { - logger.error("The update.ini file could not be found", e); //$NON-NLS-1$ - } catch (IOException e) { - logger.error("Error opening the update.ini file", e); //$NON-NLS-1$ - } - return value; + public SaikuExecutionException(Throwable cause) { + super(cause); } + - public String convertToDate(String buildVersionNumber) { - SimpleDateFormat humanReadable = new SimpleDateFormat("yyyy-MM-dd"); - String reformattedStr = buildVersionNumber; - try { - - reformattedStr = humanReadable.format(fromXml.parse(buildVersionNumber)); - } catch (java.text.ParseException e) { - logger.error("Error parsing the date from the XML updater" , e ); - } - - return reformattedStr; - } } From 86e79b006ac29cb8ed2bc13b2be7953a8636c137 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:56 +0100 Subject: [PATCH 0250/1620] New translations SaikuExecutionException.java (Spanish) --- .../earth/app/view/Messages_es.properties | 373 +----------------- 1 file changed, 13 insertions(+), 360 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 905f384f1e..27a0bdef28 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,376 +1,29 @@ package org.openforis.collect.earth.app.service; -import java.io.File; -import java.io.FileNotFoundException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Locale; +import org.openforis.collect.earth.ipcc.RdbExportException; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.idm.metamodel.BooleanAttributeDefinition; -import org.openforis.idm.metamodel.EntityDefinition; -import org.openforis.idm.metamodel.NodeDefinition; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.stereotype.Component; - -import com.opencsv.CSVReader; - -@Component -public class RegionCalculationUtils{ - - private static final String AREA_CSV_COLUMN = "area"; - private static final String WEIGHT_CSV_COLUMN = "weight"; - private static final String PLOT_SET = "plot SET "; - private static final String UPDATE = "UPDATE "; - private static final String PLOT_ADD = "plot ADD "; - private static final String FLOAT = " FLOAT"; - private static final String ALTER_TABLE = "ALTER TABLE "; - private static final String ALTER_TABLE2 = ALTER_TABLE; - private static final String SHRUB_COUNT = "shrub_count"; - private static final String TREE_COUNT = "tree_count"; - private static final String REGION_AREAS_CSV = "region_areas.csv"; //$NON-NLS-1$ - private static final String ATTRIBUTE_AREAS_CSV = "areas_per_attribute.csv"; //$NON-NLS-1$ - private static final String PLOT_WEIGHT = "plot_weight"; //$NON-NLS-1$ - private static final String TREES_PER_EXP_FACTOR = "trees_per_expansion_factor"; //$NON-NLS-1$ - private static final String SHRUBS_PER_EXP_FACTOR = "shrubs_per_expansion_factor"; //$NON-NLS-1$ - private static final String NO_DATA_LAND_USE = "noData"; //$NON-NLS-1$ - private static final String MANY_TREES = "many_trees"; - private static final String MANY_SHRUBS = "many_shrubs"; - - public static final String EXPANSION_FACTOR = "expansion_factor"; //$NON-NLS-1$ - private final Logger logger = LoggerFactory.getLogger(RegionCalculationUtils.class); - - @Autowired - EarthSurveyService earthSurveyService; - - @Autowired - LocalPropertiesService localPropertiesService; - - @Autowired - private SchemaService schemaService; - - private JdbcTemplate jdbcTemplate; - - private ExportType exportType; - - public void handleRegionCalculation(ExportType exportType, JdbcTemplate jdbcTemplate){ - - try { - setExportType(exportType); - setJdbcTemplate(jdbcTemplate); - createWeightFactors(); - - // If the region_areas.csv is not present then try to add the areas "per attribute" using the file areas_per_attribute.csv - boolean areasAdded = false; - if(!addAreasPerRegion()){ - if( addAreasPerAttribute() ){ - areasAdded = true; - } - }else{ - areasAdded = true; - } - - if( areasAdded ){ - handleNumberOfTrees(); - handleNumberOfShrubs(); - recalculatePlotWeights(); - } - - } catch (Exception e) { - logger.error( "Error when calculating the expansion factors for the plots ", e); - } - } - - private void recalculatePlotWeights() { - String schemaName = getSchemaPrefix(); - String selectMinExpansionFactorSql = String.format("SELECT MIN(%s) FROM %splot", EXPANSION_FACTOR, schemaName); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - Double minExpansionFactor = getJdbcTemplate().queryForObject(selectMinExpansionFactorSql, Double.class); - //set plot_weight = expansion_factor / minExpansionFactor - String updatePlotWeightSql = String.format(Locale.US, "UPDATE %splot SET %s=%s/%.5f", schemaName, PLOT_WEIGHT, EXPANSION_FACTOR, minExpansionFactor); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - getJdbcTemplate().update(updatePlotWeightSql); - } - - private String getSchemaPrefix() { - return schemaService.getSchemaPrefix( getExportType() ); - } - - private void createWeightFactors(){ - final String schemaName = getSchemaPrefix(); - getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + EXPANSION_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + PLOT_WEIGHT + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } +public class SaikuExecutionException extends RdbExportException { /** - * This is the "old way"of assigning an expansion factor (the area in hectares that a plot represents) to a plot based on the information form the "region_areas.csv" file. - * @return True if there was a region_areas.csv file, false if not present so that areas were not assigned. + * */ - private boolean addAreasPerRegion() { - - final File regionAreas = new File( localPropertiesService.getProjectFolder() + File.separatorChar + REGION_AREAS_CSV); - String schemaName = getSchemaPrefix(); - - if (regionAreas.exists()) { - - try( CSVReader csvReader = CsvReaderUtils.getCsvReader(regionAreas.getAbsolutePath()) ) { - - String[] csvLine = null; - - while( ( csvLine = csvReader.readNext() ) != null ){ - try { - String region = csvLine[0]; - String plotFile = csvLine[1]; - int areaHectares = Integer.parseInt( csvLine[2] ); - final Float plotWeight = 1f; // The plot weight will always be calculated in a later step - - Object[] parameters = new String[]{region,plotFile}; - - Integer plotsInRegion = getJdbcTemplate().queryForObject( - "SELECT count( DISTINCT "+EarthConstants.PLOT_ID+") FROM " + schemaName + "plot WHERE ( region=? OR plot_file=? ) AND land_use_category != '"+NO_DATA_LAND_USE+"' ", - Integer.class, - parameters); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - - Float expansionFactorHectaresCalc = 0f; - if( plotsInRegion.intValue() != 0 ){ - expansionFactorHectaresCalc = (float)areaHectares / (float) plotsInRegion.intValue(); - } - - final Object[] updateValues = new Object[4]; - updateValues[0] = expansionFactorHectaresCalc; - updateValues[1] = plotWeight; - updateValues[2] = region; - updateValues[3] = plotFile; - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+EXPANSION_FACTOR+"=?, "+PLOT_WEIGHT+"=? WHERE region=? OR plot_file=?", updateValues); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - - } catch (NumberFormatException e) { - logger.error("Possibly the header", e); //$NON-NLS-1$ - } - - } - - // FINALLY ASSIGN A WEIGHT OF CERO AND AN EXPANSION FACTOR OF 0 FOR THE PLOTS WITH NO_DATA - - final Object[] updateNoDataValues = new Object[3]; - updateNoDataValues[0] = 0; - updateNoDataValues[1] = 0; - updateNoDataValues[2] = NO_DATA_LAND_USE; - - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+EXPANSION_FACTOR+"=?, "+PLOT_WEIGHT+"=? WHERE land_use_category=?", updateNoDataValues); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - - - } catch (FileNotFoundException e) { - logger.error("File not found?", e); //$NON-NLS-1$ - } catch (Exception e) { - logger.error("Error reading the CSV file", e); //$NON-NLS-1$ - } - - return true; - }else{ - logger.warn("No CSV " + REGION_AREAS_CSV + " present, calculating areas will not be possible"); //$NON-NLS-1$ - return false; - } - - } - - - private void handleNumberOfShrubs() { - String schemaName = getSchemaPrefix(); - // This is specific to the Global Forest Survey - Drylands monitoring assessment - if( - AnalysisSaikuService.surveyContains(SHRUB_COUNT, earthSurveyService.getCollectSurvey() ) - && - AnalysisSaikuService.surveyContains(MANY_SHRUBS, earthSurveyService.getCollectSurvey() ) - ){ - // First set the number of shrubs to 30 if the user assessed that there were more than 30 shrubs on the plot - // This way we get a conservative estimation - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+SHRUB_COUNT+"=30 WHERE " + MANY_SHRUBS + "='1'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + SHRUBS_PER_EXP_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+SHRUBS_PER_EXP_FACTOR+"="+EXPANSION_FACTOR+"*2*" + SHRUB_COUNT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - } - } - - private void handleNumberOfTrees() { - String schemaName = getSchemaPrefix(); - // This is specific to the Global Forest Survey - Drylands monitoring assessment - if( - AnalysisSaikuService.surveyContains(TREE_COUNT, earthSurveyService.getCollectSurvey() ) - && - AnalysisSaikuService.surveyContains(MANY_TREES, earthSurveyService.getCollectSurvey() ) - ){ - // First set the number of shrubs to 30 if the user assessed that there were more than 30 shrubs on the plot - // This way we get a conservative estimation - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+TREE_COUNT+"=30 WHERE " + MANY_TREES + "='1'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + TREES_PER_EXP_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+TREES_PER_EXP_FACTOR+"="+EXPANSION_FACTOR+"*2*" + TREE_COUNT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - } - } - - private boolean addAreasPerAttribute() { - - final File areasPerAttribute = new File( localPropertiesService.getProjectFolder() + File.separatorChar + ATTRIBUTE_AREAS_CSV); - String schemaName = getSchemaPrefix(); - - if (areasPerAttribute.exists()) { - - try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(areasPerAttribute.getAbsolutePath(), false) ){ - // The header (first line) should contain the names of the three columns : attribute_name,area - - String[] columnNames = csvReader.readNext(); - - - ArrayList attributeNames = new ArrayList(); - - if(columnNames.length < 2 ){ - throw new RuntimeException("The " + areasPerAttribute.getAbsolutePath() + " file needs have this format : attribute_name1,attribute_name2,...attribute_nameN,"+AREA_CSV_COLUMN+"./nAt least one attribute is necessary. This would be the attribute or attributes (their name in the survey definition) that would relate the plot with its expansion factor"); - } - - // The weight column has been removed in the latest versions of the areas per attribute csv - // Lets add it again for backward compatibility - boolean weightColumnPresent = columnNames[columnNames.length -1].equalsIgnoreCase(WEIGHT_CSV_COLUMN); - if( ! weightColumnPresent ) { - // We need to create anew array with an extra item - String[] longer = new String[columnNames.length + 1]; - for (int i = 0; i < columnNames.length; i++) - longer[i] = columnNames[i]; - longer[columnNames.length] = WEIGHT_CSV_COLUMN; // add the - columnNames = longer; - } - - for( int colPosition = 0; colPosition batchArgs = new ArrayList<>(); - int line = 1; - String[] csvLine = null; - while( ( csvLine = csvReader.readNext() ) != null ){ - try{ - float areaHectares = Float.parseFloat( csvLine[ columnNames.length-2 ] ); - final Float plotWeight = weightColumnPresent ? Float.parseFloat( csvLine[columnNames.length -1] ) : 1; // if no weight column present we assume same weight for all plots - - List attributeValues = extractAttributeValues(csvLine, attributeNames); - - Integer plotCountPerAttributes = getJdbcTemplate().queryForObject(plotCountSelectQuery, Integer.class, attributeValues.toArray()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - - // Calculate the expansion factor: simply the division of the area for the selected attributes by the amount of plots that match the attribute values - Float expansionFactorHectaresCalc = 0f; - if( plotCountPerAttributes.intValue() != 0 ){ - expansionFactorHectaresCalc = areaHectares / (float) plotCountPerAttributes.intValue(); - } - - // Add the expansion factor and plot_weight to the values that will be sent with the update - attributeValues.add(0, expansionFactorHectaresCalc); - attributeValues.add(1, plotWeight); - - batchArgs.add(attributeValues.toArray()); - }catch( Exception e5){ - logger.error("Problem in line number " + line + " with values " + Arrays.toString( csvLine ), e5 ); - }finally{ - line++; - } - } - getJdbcTemplate().batchUpdate(updatePlotQuery, batchArgs); - } catch (FileNotFoundException e) { - logger.error("File not found?", e); //$NON-NLS-1$ - } catch (Exception e) { - logger.error("Error reading the CSV file", e); //$NON-NLS-1$ - } - - return true; - }else{ - logger.warn("No CSV " + ATTRIBUTE_AREAS_CSV + " present, calculating areas will not be possible"); //$NON-NLS-1$ - return false; - } + private static final long serialVersionUID = 1L; + public SaikuExecutionException() { + super(); } - private List extractAttributeValues(String[] csvLine, List attributeNames) { - List values = new ArrayList<>(attributeNames.size()); - for(int colIndex = 0; colIndex < attributeNames.size(); colIndex++) { - String stringValue = csvLine[colIndex]; - String attributeName = attributeNames.get(colIndex); - Object value = getTypedValue(attributeName, stringValue); - values.add(value); - } - return values; + public SaikuExecutionException(String message, Throwable cause) { + super(message, cause); } - private Object getTypedValue(String attributeName, String stringValue) { - EntityDefinition rootEntityDef = earthSurveyService.getRootEntityDefinition(); - NodeDefinition attributeDef = rootEntityDef.getChildDefinition(attributeName); - if (attributeDef instanceof BooleanAttributeDefinition) { - return Boolean.TRUE.toString().equalsIgnoreCase(stringValue) || "1".equals(stringValue); - } else { - return stringValue; - } + public SaikuExecutionException(String message) { + super(message); } - private boolean isAttributeInPlotEntity(String attributeName) { - EntityDefinition rootEntityDefinition = earthSurveyService.getRootEntityDefinition(); - try { - rootEntityDefinition.getChildDefinition(attributeName); - } catch (Exception e) { - // The attribute does not exist under the plot entity - return false; - } - return true; + public SaikuExecutionException(Throwable cause) { + super(cause); } - - public ExportType getExportType() { - return exportType; - } - - public void setExportType(ExportType exportType) { - this.exportType = exportType; - } - - private JdbcTemplate getJdbcTemplate() { - return jdbcTemplate; - } - - private void setJdbcTemplate(JdbcTemplate jdbcTemplate) { - this.jdbcTemplate = jdbcTemplate; - } - + } From 06703cd29f5dbe9f4a23dbdf0506370f8e9d9e2d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:57 +0100 Subject: [PATCH 0251/1620] New translations SaikuExecutionException.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 373 +----------------- 1 file changed, 13 insertions(+), 360 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 905f384f1e..27a0bdef28 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,376 +1,29 @@ package org.openforis.collect.earth.app.service; -import java.io.File; -import java.io.FileNotFoundException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Locale; +import org.openforis.collect.earth.ipcc.RdbExportException; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.idm.metamodel.BooleanAttributeDefinition; -import org.openforis.idm.metamodel.EntityDefinition; -import org.openforis.idm.metamodel.NodeDefinition; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.stereotype.Component; - -import com.opencsv.CSVReader; - -@Component -public class RegionCalculationUtils{ - - private static final String AREA_CSV_COLUMN = "area"; - private static final String WEIGHT_CSV_COLUMN = "weight"; - private static final String PLOT_SET = "plot SET "; - private static final String UPDATE = "UPDATE "; - private static final String PLOT_ADD = "plot ADD "; - private static final String FLOAT = " FLOAT"; - private static final String ALTER_TABLE = "ALTER TABLE "; - private static final String ALTER_TABLE2 = ALTER_TABLE; - private static final String SHRUB_COUNT = "shrub_count"; - private static final String TREE_COUNT = "tree_count"; - private static final String REGION_AREAS_CSV = "region_areas.csv"; //$NON-NLS-1$ - private static final String ATTRIBUTE_AREAS_CSV = "areas_per_attribute.csv"; //$NON-NLS-1$ - private static final String PLOT_WEIGHT = "plot_weight"; //$NON-NLS-1$ - private static final String TREES_PER_EXP_FACTOR = "trees_per_expansion_factor"; //$NON-NLS-1$ - private static final String SHRUBS_PER_EXP_FACTOR = "shrubs_per_expansion_factor"; //$NON-NLS-1$ - private static final String NO_DATA_LAND_USE = "noData"; //$NON-NLS-1$ - private static final String MANY_TREES = "many_trees"; - private static final String MANY_SHRUBS = "many_shrubs"; - - public static final String EXPANSION_FACTOR = "expansion_factor"; //$NON-NLS-1$ - private final Logger logger = LoggerFactory.getLogger(RegionCalculationUtils.class); - - @Autowired - EarthSurveyService earthSurveyService; - - @Autowired - LocalPropertiesService localPropertiesService; - - @Autowired - private SchemaService schemaService; - - private JdbcTemplate jdbcTemplate; - - private ExportType exportType; - - public void handleRegionCalculation(ExportType exportType, JdbcTemplate jdbcTemplate){ - - try { - setExportType(exportType); - setJdbcTemplate(jdbcTemplate); - createWeightFactors(); - - // If the region_areas.csv is not present then try to add the areas "per attribute" using the file areas_per_attribute.csv - boolean areasAdded = false; - if(!addAreasPerRegion()){ - if( addAreasPerAttribute() ){ - areasAdded = true; - } - }else{ - areasAdded = true; - } - - if( areasAdded ){ - handleNumberOfTrees(); - handleNumberOfShrubs(); - recalculatePlotWeights(); - } - - } catch (Exception e) { - logger.error( "Error when calculating the expansion factors for the plots ", e); - } - } - - private void recalculatePlotWeights() { - String schemaName = getSchemaPrefix(); - String selectMinExpansionFactorSql = String.format("SELECT MIN(%s) FROM %splot", EXPANSION_FACTOR, schemaName); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - Double minExpansionFactor = getJdbcTemplate().queryForObject(selectMinExpansionFactorSql, Double.class); - //set plot_weight = expansion_factor / minExpansionFactor - String updatePlotWeightSql = String.format(Locale.US, "UPDATE %splot SET %s=%s/%.5f", schemaName, PLOT_WEIGHT, EXPANSION_FACTOR, minExpansionFactor); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - getJdbcTemplate().update(updatePlotWeightSql); - } - - private String getSchemaPrefix() { - return schemaService.getSchemaPrefix( getExportType() ); - } - - private void createWeightFactors(){ - final String schemaName = getSchemaPrefix(); - getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + EXPANSION_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + PLOT_WEIGHT + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } +public class SaikuExecutionException extends RdbExportException { /** - * This is the "old way"of assigning an expansion factor (the area in hectares that a plot represents) to a plot based on the information form the "region_areas.csv" file. - * @return True if there was a region_areas.csv file, false if not present so that areas were not assigned. + * */ - private boolean addAreasPerRegion() { - - final File regionAreas = new File( localPropertiesService.getProjectFolder() + File.separatorChar + REGION_AREAS_CSV); - String schemaName = getSchemaPrefix(); - - if (regionAreas.exists()) { - - try( CSVReader csvReader = CsvReaderUtils.getCsvReader(regionAreas.getAbsolutePath()) ) { - - String[] csvLine = null; - - while( ( csvLine = csvReader.readNext() ) != null ){ - try { - String region = csvLine[0]; - String plotFile = csvLine[1]; - int areaHectares = Integer.parseInt( csvLine[2] ); - final Float plotWeight = 1f; // The plot weight will always be calculated in a later step - - Object[] parameters = new String[]{region,plotFile}; - - Integer plotsInRegion = getJdbcTemplate().queryForObject( - "SELECT count( DISTINCT "+EarthConstants.PLOT_ID+") FROM " + schemaName + "plot WHERE ( region=? OR plot_file=? ) AND land_use_category != '"+NO_DATA_LAND_USE+"' ", - Integer.class, - parameters); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - - Float expansionFactorHectaresCalc = 0f; - if( plotsInRegion.intValue() != 0 ){ - expansionFactorHectaresCalc = (float)areaHectares / (float) plotsInRegion.intValue(); - } - - final Object[] updateValues = new Object[4]; - updateValues[0] = expansionFactorHectaresCalc; - updateValues[1] = plotWeight; - updateValues[2] = region; - updateValues[3] = plotFile; - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+EXPANSION_FACTOR+"=?, "+PLOT_WEIGHT+"=? WHERE region=? OR plot_file=?", updateValues); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - - } catch (NumberFormatException e) { - logger.error("Possibly the header", e); //$NON-NLS-1$ - } - - } - - // FINALLY ASSIGN A WEIGHT OF CERO AND AN EXPANSION FACTOR OF 0 FOR THE PLOTS WITH NO_DATA - - final Object[] updateNoDataValues = new Object[3]; - updateNoDataValues[0] = 0; - updateNoDataValues[1] = 0; - updateNoDataValues[2] = NO_DATA_LAND_USE; - - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+EXPANSION_FACTOR+"=?, "+PLOT_WEIGHT+"=? WHERE land_use_category=?", updateNoDataValues); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - - - } catch (FileNotFoundException e) { - logger.error("File not found?", e); //$NON-NLS-1$ - } catch (Exception e) { - logger.error("Error reading the CSV file", e); //$NON-NLS-1$ - } - - return true; - }else{ - logger.warn("No CSV " + REGION_AREAS_CSV + " present, calculating areas will not be possible"); //$NON-NLS-1$ - return false; - } - - } - - - private void handleNumberOfShrubs() { - String schemaName = getSchemaPrefix(); - // This is specific to the Global Forest Survey - Drylands monitoring assessment - if( - AnalysisSaikuService.surveyContains(SHRUB_COUNT, earthSurveyService.getCollectSurvey() ) - && - AnalysisSaikuService.surveyContains(MANY_SHRUBS, earthSurveyService.getCollectSurvey() ) - ){ - // First set the number of shrubs to 30 if the user assessed that there were more than 30 shrubs on the plot - // This way we get a conservative estimation - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+SHRUB_COUNT+"=30 WHERE " + MANY_SHRUBS + "='1'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + SHRUBS_PER_EXP_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+SHRUBS_PER_EXP_FACTOR+"="+EXPANSION_FACTOR+"*2*" + SHRUB_COUNT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - } - } - - private void handleNumberOfTrees() { - String schemaName = getSchemaPrefix(); - // This is specific to the Global Forest Survey - Drylands monitoring assessment - if( - AnalysisSaikuService.surveyContains(TREE_COUNT, earthSurveyService.getCollectSurvey() ) - && - AnalysisSaikuService.surveyContains(MANY_TREES, earthSurveyService.getCollectSurvey() ) - ){ - // First set the number of shrubs to 30 if the user assessed that there were more than 30 shrubs on the plot - // This way we get a conservative estimation - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+TREE_COUNT+"=30 WHERE " + MANY_TREES + "='1'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + TREES_PER_EXP_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+TREES_PER_EXP_FACTOR+"="+EXPANSION_FACTOR+"*2*" + TREE_COUNT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - } - } - - private boolean addAreasPerAttribute() { - - final File areasPerAttribute = new File( localPropertiesService.getProjectFolder() + File.separatorChar + ATTRIBUTE_AREAS_CSV); - String schemaName = getSchemaPrefix(); - - if (areasPerAttribute.exists()) { - - try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(areasPerAttribute.getAbsolutePath(), false) ){ - // The header (first line) should contain the names of the three columns : attribute_name,area - - String[] columnNames = csvReader.readNext(); - - - ArrayList attributeNames = new ArrayList(); - - if(columnNames.length < 2 ){ - throw new RuntimeException("The " + areasPerAttribute.getAbsolutePath() + " file needs have this format : attribute_name1,attribute_name2,...attribute_nameN,"+AREA_CSV_COLUMN+"./nAt least one attribute is necessary. This would be the attribute or attributes (their name in the survey definition) that would relate the plot with its expansion factor"); - } - - // The weight column has been removed in the latest versions of the areas per attribute csv - // Lets add it again for backward compatibility - boolean weightColumnPresent = columnNames[columnNames.length -1].equalsIgnoreCase(WEIGHT_CSV_COLUMN); - if( ! weightColumnPresent ) { - // We need to create anew array with an extra item - String[] longer = new String[columnNames.length + 1]; - for (int i = 0; i < columnNames.length; i++) - longer[i] = columnNames[i]; - longer[columnNames.length] = WEIGHT_CSV_COLUMN; // add the - columnNames = longer; - } - - for( int colPosition = 0; colPosition batchArgs = new ArrayList<>(); - int line = 1; - String[] csvLine = null; - while( ( csvLine = csvReader.readNext() ) != null ){ - try{ - float areaHectares = Float.parseFloat( csvLine[ columnNames.length-2 ] ); - final Float plotWeight = weightColumnPresent ? Float.parseFloat( csvLine[columnNames.length -1] ) : 1; // if no weight column present we assume same weight for all plots - - List attributeValues = extractAttributeValues(csvLine, attributeNames); - - Integer plotCountPerAttributes = getJdbcTemplate().queryForObject(plotCountSelectQuery, Integer.class, attributeValues.toArray()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - - // Calculate the expansion factor: simply the division of the area for the selected attributes by the amount of plots that match the attribute values - Float expansionFactorHectaresCalc = 0f; - if( plotCountPerAttributes.intValue() != 0 ){ - expansionFactorHectaresCalc = areaHectares / (float) plotCountPerAttributes.intValue(); - } - - // Add the expansion factor and plot_weight to the values that will be sent with the update - attributeValues.add(0, expansionFactorHectaresCalc); - attributeValues.add(1, plotWeight); - - batchArgs.add(attributeValues.toArray()); - }catch( Exception e5){ - logger.error("Problem in line number " + line + " with values " + Arrays.toString( csvLine ), e5 ); - }finally{ - line++; - } - } - getJdbcTemplate().batchUpdate(updatePlotQuery, batchArgs); - } catch (FileNotFoundException e) { - logger.error("File not found?", e); //$NON-NLS-1$ - } catch (Exception e) { - logger.error("Error reading the CSV file", e); //$NON-NLS-1$ - } - - return true; - }else{ - logger.warn("No CSV " + ATTRIBUTE_AREAS_CSV + " present, calculating areas will not be possible"); //$NON-NLS-1$ - return false; - } + private static final long serialVersionUID = 1L; + public SaikuExecutionException() { + super(); } - private List extractAttributeValues(String[] csvLine, List attributeNames) { - List values = new ArrayList<>(attributeNames.size()); - for(int colIndex = 0; colIndex < attributeNames.size(); colIndex++) { - String stringValue = csvLine[colIndex]; - String attributeName = attributeNames.get(colIndex); - Object value = getTypedValue(attributeName, stringValue); - values.add(value); - } - return values; + public SaikuExecutionException(String message, Throwable cause) { + super(message, cause); } - private Object getTypedValue(String attributeName, String stringValue) { - EntityDefinition rootEntityDef = earthSurveyService.getRootEntityDefinition(); - NodeDefinition attributeDef = rootEntityDef.getChildDefinition(attributeName); - if (attributeDef instanceof BooleanAttributeDefinition) { - return Boolean.TRUE.toString().equalsIgnoreCase(stringValue) || "1".equals(stringValue); - } else { - return stringValue; - } + public SaikuExecutionException(String message) { + super(message); } - private boolean isAttributeInPlotEntity(String attributeName) { - EntityDefinition rootEntityDefinition = earthSurveyService.getRootEntityDefinition(); - try { - rootEntityDefinition.getChildDefinition(attributeName); - } catch (Exception e) { - // The attribute does not exist under the plot entity - return false; - } - return true; + public SaikuExecutionException(Throwable cause) { + super(cause); } - - public ExportType getExportType() { - return exportType; - } - - public void setExportType(ExportType exportType) { - this.exportType = exportType; - } - - private JdbcTemplate getJdbcTemplate() { - return jdbcTemplate; - } - - private void setJdbcTemplate(JdbcTemplate jdbcTemplate) { - this.jdbcTemplate = jdbcTemplate; - } - + } From b3393ddef1c8589ecae470ffcc83b6e8809946b0 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:58 +0100 Subject: [PATCH 0252/1620] New translations SaikuExecutionException.java (English) --- .../earth/app/view/Messages_en.properties | 373 +----------------- 1 file changed, 13 insertions(+), 360 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 905f384f1e..27a0bdef28 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,376 +1,29 @@ package org.openforis.collect.earth.app.service; -import java.io.File; -import java.io.FileNotFoundException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Locale; +import org.openforis.collect.earth.ipcc.RdbExportException; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.idm.metamodel.BooleanAttributeDefinition; -import org.openforis.idm.metamodel.EntityDefinition; -import org.openforis.idm.metamodel.NodeDefinition; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.stereotype.Component; - -import com.opencsv.CSVReader; - -@Component -public class RegionCalculationUtils{ - - private static final String AREA_CSV_COLUMN = "area"; - private static final String WEIGHT_CSV_COLUMN = "weight"; - private static final String PLOT_SET = "plot SET "; - private static final String UPDATE = "UPDATE "; - private static final String PLOT_ADD = "plot ADD "; - private static final String FLOAT = " FLOAT"; - private static final String ALTER_TABLE = "ALTER TABLE "; - private static final String ALTER_TABLE2 = ALTER_TABLE; - private static final String SHRUB_COUNT = "shrub_count"; - private static final String TREE_COUNT = "tree_count"; - private static final String REGION_AREAS_CSV = "region_areas.csv"; //$NON-NLS-1$ - private static final String ATTRIBUTE_AREAS_CSV = "areas_per_attribute.csv"; //$NON-NLS-1$ - private static final String PLOT_WEIGHT = "plot_weight"; //$NON-NLS-1$ - private static final String TREES_PER_EXP_FACTOR = "trees_per_expansion_factor"; //$NON-NLS-1$ - private static final String SHRUBS_PER_EXP_FACTOR = "shrubs_per_expansion_factor"; //$NON-NLS-1$ - private static final String NO_DATA_LAND_USE = "noData"; //$NON-NLS-1$ - private static final String MANY_TREES = "many_trees"; - private static final String MANY_SHRUBS = "many_shrubs"; - - public static final String EXPANSION_FACTOR = "expansion_factor"; //$NON-NLS-1$ - private final Logger logger = LoggerFactory.getLogger(RegionCalculationUtils.class); - - @Autowired - EarthSurveyService earthSurveyService; - - @Autowired - LocalPropertiesService localPropertiesService; - - @Autowired - private SchemaService schemaService; - - private JdbcTemplate jdbcTemplate; - - private ExportType exportType; - - public void handleRegionCalculation(ExportType exportType, JdbcTemplate jdbcTemplate){ - - try { - setExportType(exportType); - setJdbcTemplate(jdbcTemplate); - createWeightFactors(); - - // If the region_areas.csv is not present then try to add the areas "per attribute" using the file areas_per_attribute.csv - boolean areasAdded = false; - if(!addAreasPerRegion()){ - if( addAreasPerAttribute() ){ - areasAdded = true; - } - }else{ - areasAdded = true; - } - - if( areasAdded ){ - handleNumberOfTrees(); - handleNumberOfShrubs(); - recalculatePlotWeights(); - } - - } catch (Exception e) { - logger.error( "Error when calculating the expansion factors for the plots ", e); - } - } - - private void recalculatePlotWeights() { - String schemaName = getSchemaPrefix(); - String selectMinExpansionFactorSql = String.format("SELECT MIN(%s) FROM %splot", EXPANSION_FACTOR, schemaName); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - Double minExpansionFactor = getJdbcTemplate().queryForObject(selectMinExpansionFactorSql, Double.class); - //set plot_weight = expansion_factor / minExpansionFactor - String updatePlotWeightSql = String.format(Locale.US, "UPDATE %splot SET %s=%s/%.5f", schemaName, PLOT_WEIGHT, EXPANSION_FACTOR, minExpansionFactor); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - getJdbcTemplate().update(updatePlotWeightSql); - } - - private String getSchemaPrefix() { - return schemaService.getSchemaPrefix( getExportType() ); - } - - private void createWeightFactors(){ - final String schemaName = getSchemaPrefix(); - getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + EXPANSION_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + PLOT_WEIGHT + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } +public class SaikuExecutionException extends RdbExportException { /** - * This is the "old way"of assigning an expansion factor (the area in hectares that a plot represents) to a plot based on the information form the "region_areas.csv" file. - * @return True if there was a region_areas.csv file, false if not present so that areas were not assigned. + * */ - private boolean addAreasPerRegion() { - - final File regionAreas = new File( localPropertiesService.getProjectFolder() + File.separatorChar + REGION_AREAS_CSV); - String schemaName = getSchemaPrefix(); - - if (regionAreas.exists()) { - - try( CSVReader csvReader = CsvReaderUtils.getCsvReader(regionAreas.getAbsolutePath()) ) { - - String[] csvLine = null; - - while( ( csvLine = csvReader.readNext() ) != null ){ - try { - String region = csvLine[0]; - String plotFile = csvLine[1]; - int areaHectares = Integer.parseInt( csvLine[2] ); - final Float plotWeight = 1f; // The plot weight will always be calculated in a later step - - Object[] parameters = new String[]{region,plotFile}; - - Integer plotsInRegion = getJdbcTemplate().queryForObject( - "SELECT count( DISTINCT "+EarthConstants.PLOT_ID+") FROM " + schemaName + "plot WHERE ( region=? OR plot_file=? ) AND land_use_category != '"+NO_DATA_LAND_USE+"' ", - Integer.class, - parameters); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - - Float expansionFactorHectaresCalc = 0f; - if( plotsInRegion.intValue() != 0 ){ - expansionFactorHectaresCalc = (float)areaHectares / (float) plotsInRegion.intValue(); - } - - final Object[] updateValues = new Object[4]; - updateValues[0] = expansionFactorHectaresCalc; - updateValues[1] = plotWeight; - updateValues[2] = region; - updateValues[3] = plotFile; - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+EXPANSION_FACTOR+"=?, "+PLOT_WEIGHT+"=? WHERE region=? OR plot_file=?", updateValues); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - - } catch (NumberFormatException e) { - logger.error("Possibly the header", e); //$NON-NLS-1$ - } - - } - - // FINALLY ASSIGN A WEIGHT OF CERO AND AN EXPANSION FACTOR OF 0 FOR THE PLOTS WITH NO_DATA - - final Object[] updateNoDataValues = new Object[3]; - updateNoDataValues[0] = 0; - updateNoDataValues[1] = 0; - updateNoDataValues[2] = NO_DATA_LAND_USE; - - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+EXPANSION_FACTOR+"=?, "+PLOT_WEIGHT+"=? WHERE land_use_category=?", updateNoDataValues); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - - - } catch (FileNotFoundException e) { - logger.error("File not found?", e); //$NON-NLS-1$ - } catch (Exception e) { - logger.error("Error reading the CSV file", e); //$NON-NLS-1$ - } - - return true; - }else{ - logger.warn("No CSV " + REGION_AREAS_CSV + " present, calculating areas will not be possible"); //$NON-NLS-1$ - return false; - } - - } - - - private void handleNumberOfShrubs() { - String schemaName = getSchemaPrefix(); - // This is specific to the Global Forest Survey - Drylands monitoring assessment - if( - AnalysisSaikuService.surveyContains(SHRUB_COUNT, earthSurveyService.getCollectSurvey() ) - && - AnalysisSaikuService.surveyContains(MANY_SHRUBS, earthSurveyService.getCollectSurvey() ) - ){ - // First set the number of shrubs to 30 if the user assessed that there were more than 30 shrubs on the plot - // This way we get a conservative estimation - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+SHRUB_COUNT+"=30 WHERE " + MANY_SHRUBS + "='1'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + SHRUBS_PER_EXP_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+SHRUBS_PER_EXP_FACTOR+"="+EXPANSION_FACTOR+"*2*" + SHRUB_COUNT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - } - } - - private void handleNumberOfTrees() { - String schemaName = getSchemaPrefix(); - // This is specific to the Global Forest Survey - Drylands monitoring assessment - if( - AnalysisSaikuService.surveyContains(TREE_COUNT, earthSurveyService.getCollectSurvey() ) - && - AnalysisSaikuService.surveyContains(MANY_TREES, earthSurveyService.getCollectSurvey() ) - ){ - // First set the number of shrubs to 30 if the user assessed that there were more than 30 shrubs on the plot - // This way we get a conservative estimation - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+TREE_COUNT+"=30 WHERE " + MANY_TREES + "='1'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + TREES_PER_EXP_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+TREES_PER_EXP_FACTOR+"="+EXPANSION_FACTOR+"*2*" + TREE_COUNT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - } - } - - private boolean addAreasPerAttribute() { - - final File areasPerAttribute = new File( localPropertiesService.getProjectFolder() + File.separatorChar + ATTRIBUTE_AREAS_CSV); - String schemaName = getSchemaPrefix(); - - if (areasPerAttribute.exists()) { - - try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(areasPerAttribute.getAbsolutePath(), false) ){ - // The header (first line) should contain the names of the three columns : attribute_name,area - - String[] columnNames = csvReader.readNext(); - - - ArrayList attributeNames = new ArrayList(); - - if(columnNames.length < 2 ){ - throw new RuntimeException("The " + areasPerAttribute.getAbsolutePath() + " file needs have this format : attribute_name1,attribute_name2,...attribute_nameN,"+AREA_CSV_COLUMN+"./nAt least one attribute is necessary. This would be the attribute or attributes (their name in the survey definition) that would relate the plot with its expansion factor"); - } - - // The weight column has been removed in the latest versions of the areas per attribute csv - // Lets add it again for backward compatibility - boolean weightColumnPresent = columnNames[columnNames.length -1].equalsIgnoreCase(WEIGHT_CSV_COLUMN); - if( ! weightColumnPresent ) { - // We need to create anew array with an extra item - String[] longer = new String[columnNames.length + 1]; - for (int i = 0; i < columnNames.length; i++) - longer[i] = columnNames[i]; - longer[columnNames.length] = WEIGHT_CSV_COLUMN; // add the - columnNames = longer; - } - - for( int colPosition = 0; colPosition batchArgs = new ArrayList<>(); - int line = 1; - String[] csvLine = null; - while( ( csvLine = csvReader.readNext() ) != null ){ - try{ - float areaHectares = Float.parseFloat( csvLine[ columnNames.length-2 ] ); - final Float plotWeight = weightColumnPresent ? Float.parseFloat( csvLine[columnNames.length -1] ) : 1; // if no weight column present we assume same weight for all plots - - List attributeValues = extractAttributeValues(csvLine, attributeNames); - - Integer plotCountPerAttributes = getJdbcTemplate().queryForObject(plotCountSelectQuery, Integer.class, attributeValues.toArray()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - - // Calculate the expansion factor: simply the division of the area for the selected attributes by the amount of plots that match the attribute values - Float expansionFactorHectaresCalc = 0f; - if( plotCountPerAttributes.intValue() != 0 ){ - expansionFactorHectaresCalc = areaHectares / (float) plotCountPerAttributes.intValue(); - } - - // Add the expansion factor and plot_weight to the values that will be sent with the update - attributeValues.add(0, expansionFactorHectaresCalc); - attributeValues.add(1, plotWeight); - - batchArgs.add(attributeValues.toArray()); - }catch( Exception e5){ - logger.error("Problem in line number " + line + " with values " + Arrays.toString( csvLine ), e5 ); - }finally{ - line++; - } - } - getJdbcTemplate().batchUpdate(updatePlotQuery, batchArgs); - } catch (FileNotFoundException e) { - logger.error("File not found?", e); //$NON-NLS-1$ - } catch (Exception e) { - logger.error("Error reading the CSV file", e); //$NON-NLS-1$ - } - - return true; - }else{ - logger.warn("No CSV " + ATTRIBUTE_AREAS_CSV + " present, calculating areas will not be possible"); //$NON-NLS-1$ - return false; - } + private static final long serialVersionUID = 1L; + public SaikuExecutionException() { + super(); } - private List extractAttributeValues(String[] csvLine, List attributeNames) { - List values = new ArrayList<>(attributeNames.size()); - for(int colIndex = 0; colIndex < attributeNames.size(); colIndex++) { - String stringValue = csvLine[colIndex]; - String attributeName = attributeNames.get(colIndex); - Object value = getTypedValue(attributeName, stringValue); - values.add(value); - } - return values; + public SaikuExecutionException(String message, Throwable cause) { + super(message, cause); } - private Object getTypedValue(String attributeName, String stringValue) { - EntityDefinition rootEntityDef = earthSurveyService.getRootEntityDefinition(); - NodeDefinition attributeDef = rootEntityDef.getChildDefinition(attributeName); - if (attributeDef instanceof BooleanAttributeDefinition) { - return Boolean.TRUE.toString().equalsIgnoreCase(stringValue) || "1".equals(stringValue); - } else { - return stringValue; - } + public SaikuExecutionException(String message) { + super(message); } - private boolean isAttributeInPlotEntity(String attributeName) { - EntityDefinition rootEntityDefinition = earthSurveyService.getRootEntityDefinition(); - try { - rootEntityDefinition.getChildDefinition(attributeName); - } catch (Exception e) { - // The attribute does not exist under the plot entity - return false; - } - return true; + public SaikuExecutionException(Throwable cause) { + super(cause); } - - public ExportType getExportType() { - return exportType; - } - - public void setExportType(ExportType exportType) { - this.exportType = exportType; - } - - private JdbcTemplate getJdbcTemplate() { - return jdbcTemplate; - } - - private void setJdbcTemplate(JdbcTemplate jdbcTemplate) { - this.jdbcTemplate = jdbcTemplate; - } - + } From 051f27e3a8927616c380f87ba07617a6f13555db Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:25:59 +0100 Subject: [PATCH 0253/1620] New translations SchemaService.java (French) --- .../earth/app/view/Messages_fr.properties | 45 ++++++++++--------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 27a0bdef28..ea8d41cfa0 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,29 +1,34 @@ package org.openforis.collect.earth.app.service; -import org.openforis.collect.earth.ipcc.RdbExportException; +import org.openforis.collect.earth.app.EarthConstants; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; -public class SaikuExecutionException extends RdbExportException { +@Component +public class SchemaService { - /** - * - */ - private static final long serialVersionUID = 1L; - - public SaikuExecutionException() { - super(); - } - - public SaikuExecutionException(String message, Throwable cause) { - super(message, cause); - } - - public SaikuExecutionException(String message) { - super(message); + @Autowired + LocalPropertiesService localPropertiesService; + + private String getSchemaName(ExportType exportType) { + String schemaName = null; + if (localPropertiesService.isUsingPostgreSqlDB()) { + if( exportType.equals( ExportType.SAIKU )) + schemaName = EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU; + else + schemaName = EarthConstants.POSTGRES_RDB_SCHEMA_IPCC; + } + return schemaName; } - public SaikuExecutionException(Throwable cause) { - super(cause); + public String getSchemaPrefix(ExportType exportType) { + String schemaName = getSchemaName(exportType); + if (schemaName != null) { + schemaName += "."; //$NON-NLS-1$ + } else { + schemaName = ""; //$NON-NLS-1$ + } + return schemaName; } - } From 2a8273449db5ecb7f88f15c9b120f91d51159b00 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:01 +0100 Subject: [PATCH 0254/1620] New translations SchemaService.java (Spanish) --- .../earth/app/view/Messages_es.properties | 45 ++++++++++--------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 27a0bdef28..ea8d41cfa0 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,29 +1,34 @@ package org.openforis.collect.earth.app.service; -import org.openforis.collect.earth.ipcc.RdbExportException; +import org.openforis.collect.earth.app.EarthConstants; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; -public class SaikuExecutionException extends RdbExportException { +@Component +public class SchemaService { - /** - * - */ - private static final long serialVersionUID = 1L; - - public SaikuExecutionException() { - super(); - } - - public SaikuExecutionException(String message, Throwable cause) { - super(message, cause); - } - - public SaikuExecutionException(String message) { - super(message); + @Autowired + LocalPropertiesService localPropertiesService; + + private String getSchemaName(ExportType exportType) { + String schemaName = null; + if (localPropertiesService.isUsingPostgreSqlDB()) { + if( exportType.equals( ExportType.SAIKU )) + schemaName = EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU; + else + schemaName = EarthConstants.POSTGRES_RDB_SCHEMA_IPCC; + } + return schemaName; } - public SaikuExecutionException(Throwable cause) { - super(cause); + public String getSchemaPrefix(ExportType exportType) { + String schemaName = getSchemaName(exportType); + if (schemaName != null) { + schemaName += "."; //$NON-NLS-1$ + } else { + schemaName = ""; //$NON-NLS-1$ + } + return schemaName; } - } From fd13da21dbe8580711c5d995582470a87ffca544 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:02 +0100 Subject: [PATCH 0255/1620] New translations SchemaService.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 45 ++++++++++--------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 27a0bdef28..ea8d41cfa0 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,29 +1,34 @@ package org.openforis.collect.earth.app.service; -import org.openforis.collect.earth.ipcc.RdbExportException; +import org.openforis.collect.earth.app.EarthConstants; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; -public class SaikuExecutionException extends RdbExportException { +@Component +public class SchemaService { - /** - * - */ - private static final long serialVersionUID = 1L; - - public SaikuExecutionException() { - super(); - } - - public SaikuExecutionException(String message, Throwable cause) { - super(message, cause); - } - - public SaikuExecutionException(String message) { - super(message); + @Autowired + LocalPropertiesService localPropertiesService; + + private String getSchemaName(ExportType exportType) { + String schemaName = null; + if (localPropertiesService.isUsingPostgreSqlDB()) { + if( exportType.equals( ExportType.SAIKU )) + schemaName = EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU; + else + schemaName = EarthConstants.POSTGRES_RDB_SCHEMA_IPCC; + } + return schemaName; } - public SaikuExecutionException(Throwable cause) { - super(cause); + public String getSchemaPrefix(ExportType exportType) { + String schemaName = getSchemaName(exportType); + if (schemaName != null) { + schemaName += "."; //$NON-NLS-1$ + } else { + schemaName = ""; //$NON-NLS-1$ + } + return schemaName; } - } From e903a44f56c4ff78b8ddacf8d707caa60d0b3289 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:03 +0100 Subject: [PATCH 0256/1620] New translations SchemaService.java (English) --- .../earth/app/view/Messages_en.properties | 45 ++++++++++--------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 27a0bdef28..ea8d41cfa0 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,29 +1,34 @@ package org.openforis.collect.earth.app.service; -import org.openforis.collect.earth.ipcc.RdbExportException; +import org.openforis.collect.earth.app.EarthConstants; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; -public class SaikuExecutionException extends RdbExportException { +@Component +public class SchemaService { - /** - * - */ - private static final long serialVersionUID = 1L; - - public SaikuExecutionException() { - super(); - } - - public SaikuExecutionException(String message, Throwable cause) { - super(message, cause); - } - - public SaikuExecutionException(String message) { - super(message); + @Autowired + LocalPropertiesService localPropertiesService; + + private String getSchemaName(ExportType exportType) { + String schemaName = null; + if (localPropertiesService.isUsingPostgreSqlDB()) { + if( exportType.equals( ExportType.SAIKU )) + schemaName = EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU; + else + schemaName = EarthConstants.POSTGRES_RDB_SCHEMA_IPCC; + } + return schemaName; } - public SaikuExecutionException(Throwable cause) { - super(cause); + public String getSchemaPrefix(ExportType exportType) { + String schemaName = getSchemaName(exportType); + if (schemaName != null) { + schemaName += "."; //$NON-NLS-1$ + } else { + schemaName = ""; //$NON-NLS-1$ + } + return schemaName; } - } From 312b3552ffa62cf782c8415ab38a73e8478edc6b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:04 +0100 Subject: [PATCH 0257/1620] New translations CollectEarthTransferHandler.java (Spanish) --- .../earth/app/view/Messages_es.properties | 176 +++++++++++++++--- 1 file changed, 155 insertions(+), 21 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index ea8d41cfa0..65dd7f9161 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,34 +1,168 @@ -package org.openforis.collect.earth.app.service; +package org.openforis.collect.earth.app.view; -import org.openforis.collect.earth.app.EarthConstants; +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.Transferable; +import java.io.File; +import java.util.List; + +import javax.swing.JComponent; +import javax.swing.TransferHandler; + +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.KmlImportService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component -public class SchemaService { +public class CollectEarthTransferHandler extends TransferHandler { + + @Autowired + private transient CollectEarthWindow collectEarthWindow; + + @Autowired + private transient LocalPropertiesService localPropertiesService; @Autowired - LocalPropertiesService localPropertiesService; - - private String getSchemaName(ExportType exportType) { - String schemaName = null; - if (localPropertiesService.isUsingPostgreSqlDB()) { - if( exportType.equals( ExportType.SAIKU )) - schemaName = EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU; - else - schemaName = EarthConstants.POSTGRES_RDB_SCHEMA_IPCC; + private transient KmlImportService kmlImportService; + + private static final long serialVersionUID = 1L; + private transient Logger logger = LoggerFactory.getLogger( CollectEarthTransferHandler.class); + + /* + * Can Only import an object if it represents a SINGLE file + * (non-Javadoc) + * @see javax.swing.TransferHandler#canImport(javax.swing.TransferHandler.TransferSupport) + */ + @Override + public boolean canImport(TransferSupport support) { + + if( support.isDataFlavorSupported(DataFlavor.javaFileListFlavor) ){ + Transferable t = support.getTransferable(); + List data; + try { + data = (List)t.getTransferData(DataFlavor.javaFileListFlavor); + + if( data !=null && data.size() == 1){ + return isFileExtensionValid( data.get(0) ); + }else { + return false; + } + + }catch(java.awt.dnd.InvalidDnDOperationException unknownException) { + logger.warn("Why do I get this error?t", unknownException); + return true; + }catch (Exception e) { + logger.error("Error on the drop support assessment", e); + return false; + } + }else{ + return false; + } + + } + + + private String getFileExtension(File file) { + String fileName = file.getName(); + int lastIndexOf = fileName.lastIndexOf('.' ); + String fileExtenxion = null; + if( lastIndexOf >0 ){ + fileExtenxion = fileName.substring( lastIndexOf + 1 ); + } + return fileExtenxion; + } + + + private boolean isFileExtensionValid(File file ){ + String fileExtension = getFileExtension(file); + return fileExtension!=null && ( DataFormat.COLLECT_COORDS.checkFileExtensionMatches(fileExtension) || DataFormat.PROJECT_DEFINITION_FILE.checkFileExtensionMatches(fileExtension) || DataFormat.KML_FILE.checkFileExtensionMatches(fileExtension) ); + } + + /* + * We support both copy and move actions. + * (non-Javadoc) + * @see javax.swing.TransferHandler#getSourceActions(javax.swing.JComponent) + */ + @Override + public int getSourceActions(JComponent c) { + return COPY_OR_MOVE; + } + + + /* + * Perform the actual import. This demo only supports drag and drop. + * (non-Javadoc) + * @see javax.swing.TransferHandler#importData(javax.swing.TransferHandler.TransferSupport) + */ + @Override + public boolean importData(TransferSupport info) { + if (!info.isDrop()) { + return false; } - return schemaName; + + // Get the file that is being dropped. + Transferable t = info.getTransferable(); + List data; + try { + data = (List)t.getTransferData(DataFlavor.javaFileListFlavor); + if( data.size()!=1){ + throw new IllegalArgumentException("The drop action supports only single file drops!"); + } + + File fileToImport = data.get(0); + + if( !isFileExtensionValid(fileToImport)){ + throw new IllegalArgumentException("The drop action supports only files of type!" + DataFormat.COLLECT_COORDS + " or " + DataFormat.PROJECT_DEFINITION_FILE); + } + + String fileExtension = getFileExtension(fileToImport); + + // If it is a CEP file then import + if( DataFormat.PROJECT_DEFINITION_FILE.checkFileExtensionMatches(fileExtension)){ + EarthApp.openProjectFileInRunningCollectEarth( fileToImport.getAbsolutePath() ); + }else if( DataFormat.COLLECT_COORDS.checkFileExtensionMatches(fileExtension)){ + + importCSVWithPlots(fileToImport); + + }else if( DataFormat.KML_FILE.checkFileExtensionMatches( fileExtension ) ) { + + // Check if the CSV file can be loaded in the survey!!! + + if( kmlImportService.loadFromKml( null, fileToImport ) ){ + EarthApp.executeKmlLoadAsynchronously( collectEarthWindow.getFrame() ); + } + + + }else{ + throw new IllegalArgumentException("Unknown file extension!!"); + } + + } + catch (Exception e) { + logger.error("Error on the drop action", e); + return false; + } + + + + + return true; } - public String getSchemaPrefix(ExportType exportType) { - String schemaName = getSchemaName(exportType); - if (schemaName != null) { - schemaName += "."; //$NON-NLS-1$ - } else { - schemaName = ""; //$NON-NLS-1$ + + private void importCSVWithPlots(File fileToImport) { + try{ + localPropertiesService.setValue( EarthProperty.SAMPLE_FILE, fileToImport.getAbsolutePath() ); + EarthApp.executeKmlLoadAsynchronously( collectEarthWindow.getFrame() ); + }catch( Exception kmlGenerationException ){ + logger.error( "Problem loading CSV file dropped into the window" , kmlGenerationException ); + EarthApp.showMessage(" Problem loading CSV file" + kmlGenerationException.getCause() ); } - return schemaName; } - + + } From 19f71b43d1acfe3205ebce6d1dd8107313c30bfe Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:05 +0100 Subject: [PATCH 0258/1620] New translations CollectEarthTransferHandler.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 176 +++++++++++++++--- 1 file changed, 155 insertions(+), 21 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index ea8d41cfa0..65dd7f9161 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,34 +1,168 @@ -package org.openforis.collect.earth.app.service; +package org.openforis.collect.earth.app.view; -import org.openforis.collect.earth.app.EarthConstants; +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.Transferable; +import java.io.File; +import java.util.List; + +import javax.swing.JComponent; +import javax.swing.TransferHandler; + +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.KmlImportService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component -public class SchemaService { +public class CollectEarthTransferHandler extends TransferHandler { + + @Autowired + private transient CollectEarthWindow collectEarthWindow; + + @Autowired + private transient LocalPropertiesService localPropertiesService; @Autowired - LocalPropertiesService localPropertiesService; - - private String getSchemaName(ExportType exportType) { - String schemaName = null; - if (localPropertiesService.isUsingPostgreSqlDB()) { - if( exportType.equals( ExportType.SAIKU )) - schemaName = EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU; - else - schemaName = EarthConstants.POSTGRES_RDB_SCHEMA_IPCC; + private transient KmlImportService kmlImportService; + + private static final long serialVersionUID = 1L; + private transient Logger logger = LoggerFactory.getLogger( CollectEarthTransferHandler.class); + + /* + * Can Only import an object if it represents a SINGLE file + * (non-Javadoc) + * @see javax.swing.TransferHandler#canImport(javax.swing.TransferHandler.TransferSupport) + */ + @Override + public boolean canImport(TransferSupport support) { + + if( support.isDataFlavorSupported(DataFlavor.javaFileListFlavor) ){ + Transferable t = support.getTransferable(); + List data; + try { + data = (List)t.getTransferData(DataFlavor.javaFileListFlavor); + + if( data !=null && data.size() == 1){ + return isFileExtensionValid( data.get(0) ); + }else { + return false; + } + + }catch(java.awt.dnd.InvalidDnDOperationException unknownException) { + logger.warn("Why do I get this error?t", unknownException); + return true; + }catch (Exception e) { + logger.error("Error on the drop support assessment", e); + return false; + } + }else{ + return false; + } + + } + + + private String getFileExtension(File file) { + String fileName = file.getName(); + int lastIndexOf = fileName.lastIndexOf('.' ); + String fileExtenxion = null; + if( lastIndexOf >0 ){ + fileExtenxion = fileName.substring( lastIndexOf + 1 ); + } + return fileExtenxion; + } + + + private boolean isFileExtensionValid(File file ){ + String fileExtension = getFileExtension(file); + return fileExtension!=null && ( DataFormat.COLLECT_COORDS.checkFileExtensionMatches(fileExtension) || DataFormat.PROJECT_DEFINITION_FILE.checkFileExtensionMatches(fileExtension) || DataFormat.KML_FILE.checkFileExtensionMatches(fileExtension) ); + } + + /* + * We support both copy and move actions. + * (non-Javadoc) + * @see javax.swing.TransferHandler#getSourceActions(javax.swing.JComponent) + */ + @Override + public int getSourceActions(JComponent c) { + return COPY_OR_MOVE; + } + + + /* + * Perform the actual import. This demo only supports drag and drop. + * (non-Javadoc) + * @see javax.swing.TransferHandler#importData(javax.swing.TransferHandler.TransferSupport) + */ + @Override + public boolean importData(TransferSupport info) { + if (!info.isDrop()) { + return false; } - return schemaName; + + // Get the file that is being dropped. + Transferable t = info.getTransferable(); + List data; + try { + data = (List)t.getTransferData(DataFlavor.javaFileListFlavor); + if( data.size()!=1){ + throw new IllegalArgumentException("The drop action supports only single file drops!"); + } + + File fileToImport = data.get(0); + + if( !isFileExtensionValid(fileToImport)){ + throw new IllegalArgumentException("The drop action supports only files of type!" + DataFormat.COLLECT_COORDS + " or " + DataFormat.PROJECT_DEFINITION_FILE); + } + + String fileExtension = getFileExtension(fileToImport); + + // If it is a CEP file then import + if( DataFormat.PROJECT_DEFINITION_FILE.checkFileExtensionMatches(fileExtension)){ + EarthApp.openProjectFileInRunningCollectEarth( fileToImport.getAbsolutePath() ); + }else if( DataFormat.COLLECT_COORDS.checkFileExtensionMatches(fileExtension)){ + + importCSVWithPlots(fileToImport); + + }else if( DataFormat.KML_FILE.checkFileExtensionMatches( fileExtension ) ) { + + // Check if the CSV file can be loaded in the survey!!! + + if( kmlImportService.loadFromKml( null, fileToImport ) ){ + EarthApp.executeKmlLoadAsynchronously( collectEarthWindow.getFrame() ); + } + + + }else{ + throw new IllegalArgumentException("Unknown file extension!!"); + } + + } + catch (Exception e) { + logger.error("Error on the drop action", e); + return false; + } + + + + + return true; } - public String getSchemaPrefix(ExportType exportType) { - String schemaName = getSchemaName(exportType); - if (schemaName != null) { - schemaName += "."; //$NON-NLS-1$ - } else { - schemaName = ""; //$NON-NLS-1$ + + private void importCSVWithPlots(File fileToImport) { + try{ + localPropertiesService.setValue( EarthProperty.SAMPLE_FILE, fileToImport.getAbsolutePath() ); + EarthApp.executeKmlLoadAsynchronously( collectEarthWindow.getFrame() ); + }catch( Exception kmlGenerationException ){ + logger.error( "Problem loading CSV file dropped into the window" , kmlGenerationException ); + EarthApp.showMessage(" Problem loading CSV file" + kmlGenerationException.getCause() ); } - return schemaName; } - + + } From 7dc0f254d847cdddf00380fab4d9a3e63c6d1ef3 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:06 +0100 Subject: [PATCH 0259/1620] New translations CollectEarthTransferHandler.java (English) --- .../earth/app/view/Messages_en.properties | 176 +++++++++++++++--- 1 file changed, 155 insertions(+), 21 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index ea8d41cfa0..65dd7f9161 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,34 +1,168 @@ -package org.openforis.collect.earth.app.service; +package org.openforis.collect.earth.app.view; -import org.openforis.collect.earth.app.EarthConstants; +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.Transferable; +import java.io.File; +import java.util.List; + +import javax.swing.JComponent; +import javax.swing.TransferHandler; + +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.KmlImportService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component -public class SchemaService { +public class CollectEarthTransferHandler extends TransferHandler { + + @Autowired + private transient CollectEarthWindow collectEarthWindow; + + @Autowired + private transient LocalPropertiesService localPropertiesService; @Autowired - LocalPropertiesService localPropertiesService; - - private String getSchemaName(ExportType exportType) { - String schemaName = null; - if (localPropertiesService.isUsingPostgreSqlDB()) { - if( exportType.equals( ExportType.SAIKU )) - schemaName = EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU; - else - schemaName = EarthConstants.POSTGRES_RDB_SCHEMA_IPCC; + private transient KmlImportService kmlImportService; + + private static final long serialVersionUID = 1L; + private transient Logger logger = LoggerFactory.getLogger( CollectEarthTransferHandler.class); + + /* + * Can Only import an object if it represents a SINGLE file + * (non-Javadoc) + * @see javax.swing.TransferHandler#canImport(javax.swing.TransferHandler.TransferSupport) + */ + @Override + public boolean canImport(TransferSupport support) { + + if( support.isDataFlavorSupported(DataFlavor.javaFileListFlavor) ){ + Transferable t = support.getTransferable(); + List data; + try { + data = (List)t.getTransferData(DataFlavor.javaFileListFlavor); + + if( data !=null && data.size() == 1){ + return isFileExtensionValid( data.get(0) ); + }else { + return false; + } + + }catch(java.awt.dnd.InvalidDnDOperationException unknownException) { + logger.warn("Why do I get this error?t", unknownException); + return true; + }catch (Exception e) { + logger.error("Error on the drop support assessment", e); + return false; + } + }else{ + return false; + } + + } + + + private String getFileExtension(File file) { + String fileName = file.getName(); + int lastIndexOf = fileName.lastIndexOf('.' ); + String fileExtenxion = null; + if( lastIndexOf >0 ){ + fileExtenxion = fileName.substring( lastIndexOf + 1 ); + } + return fileExtenxion; + } + + + private boolean isFileExtensionValid(File file ){ + String fileExtension = getFileExtension(file); + return fileExtension!=null && ( DataFormat.COLLECT_COORDS.checkFileExtensionMatches(fileExtension) || DataFormat.PROJECT_DEFINITION_FILE.checkFileExtensionMatches(fileExtension) || DataFormat.KML_FILE.checkFileExtensionMatches(fileExtension) ); + } + + /* + * We support both copy and move actions. + * (non-Javadoc) + * @see javax.swing.TransferHandler#getSourceActions(javax.swing.JComponent) + */ + @Override + public int getSourceActions(JComponent c) { + return COPY_OR_MOVE; + } + + + /* + * Perform the actual import. This demo only supports drag and drop. + * (non-Javadoc) + * @see javax.swing.TransferHandler#importData(javax.swing.TransferHandler.TransferSupport) + */ + @Override + public boolean importData(TransferSupport info) { + if (!info.isDrop()) { + return false; } - return schemaName; + + // Get the file that is being dropped. + Transferable t = info.getTransferable(); + List data; + try { + data = (List)t.getTransferData(DataFlavor.javaFileListFlavor); + if( data.size()!=1){ + throw new IllegalArgumentException("The drop action supports only single file drops!"); + } + + File fileToImport = data.get(0); + + if( !isFileExtensionValid(fileToImport)){ + throw new IllegalArgumentException("The drop action supports only files of type!" + DataFormat.COLLECT_COORDS + " or " + DataFormat.PROJECT_DEFINITION_FILE); + } + + String fileExtension = getFileExtension(fileToImport); + + // If it is a CEP file then import + if( DataFormat.PROJECT_DEFINITION_FILE.checkFileExtensionMatches(fileExtension)){ + EarthApp.openProjectFileInRunningCollectEarth( fileToImport.getAbsolutePath() ); + }else if( DataFormat.COLLECT_COORDS.checkFileExtensionMatches(fileExtension)){ + + importCSVWithPlots(fileToImport); + + }else if( DataFormat.KML_FILE.checkFileExtensionMatches( fileExtension ) ) { + + // Check if the CSV file can be loaded in the survey!!! + + if( kmlImportService.loadFromKml( null, fileToImport ) ){ + EarthApp.executeKmlLoadAsynchronously( collectEarthWindow.getFrame() ); + } + + + }else{ + throw new IllegalArgumentException("Unknown file extension!!"); + } + + } + catch (Exception e) { + logger.error("Error on the drop action", e); + return false; + } + + + + + return true; } - public String getSchemaPrefix(ExportType exportType) { - String schemaName = getSchemaName(exportType); - if (schemaName != null) { - schemaName += "."; //$NON-NLS-1$ - } else { - schemaName = ""; //$NON-NLS-1$ + + private void importCSVWithPlots(File fileToImport) { + try{ + localPropertiesService.setValue( EarthProperty.SAMPLE_FILE, fileToImport.getAbsolutePath() ); + EarthApp.executeKmlLoadAsynchronously( collectEarthWindow.getFrame() ); + }catch( Exception kmlGenerationException ){ + logger.error( "Problem loading CSV file dropped into the window" , kmlGenerationException ); + EarthApp.showMessage(" Problem loading CSV file" + kmlGenerationException.getCause() ); } - return schemaName; } - + + } From 0a1c1bb3db81e5c4e9770b36b20bc314268ed323 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:08 +0100 Subject: [PATCH 0260/1620] New translations FileDividerToolDlg.java (Spanish) --- .../earth/app/view/Messages_es.properties | 406 ++++++++++++------ 1 file changed, 281 insertions(+), 125 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 65dd7f9161..d275a15df8 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,168 +1,324 @@ package org.openforis.collect.earth.app.view; -import java.awt.datatransfer.DataFlavor; -import java.awt.datatransfer.Transferable; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; import java.io.File; +import java.io.IOException; import java.util.List; -import javax.swing.JComponent; -import javax.swing.TransferHandler; - -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.KmlImportService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import javax.swing.DefaultComboBoxModel; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JDialog; +import javax.swing.JFileChooser; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; + +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.collect.earth.sampler.utils.ProduceCsvFiles; +import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult; +import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult.ErrorType; +import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; +import org.openforis.collect.manager.validation.SurveyValidator.ValidationParameters; +import org.openforis.collect.model.CollectSurvey; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public class CollectEarthTransferHandler extends TransferHandler { - - @Autowired - private transient CollectEarthWindow collectEarthWindow; - - @Autowired - private transient LocalPropertiesService localPropertiesService; - - @Autowired - private transient KmlImportService kmlImportService; - - private static final long serialVersionUID = 1L; - private transient Logger logger = LoggerFactory.getLogger( CollectEarthTransferHandler.class); - - /* - * Can Only import an object if it represents a SINGLE file - * (non-Javadoc) - * @see javax.swing.TransferHandler#canImport(javax.swing.TransferHandler.TransferSupport) - */ - @Override - public boolean canImport(TransferSupport support) { - - if( support.isDataFlavorSupported(DataFlavor.javaFileListFlavor) ){ - Transferable t = support.getTransferable(); - List data; - try { - data = (List)t.getTransferData(DataFlavor.javaFileListFlavor); - - if( data !=null && data.size() == 1){ - return isFileExtensionValid( data.get(0) ); - }else { - return false; - } - }catch(java.awt.dnd.InvalidDnDOperationException unknownException) { - logger.warn("Why do I get this error?t", unknownException); - return true; - }catch (Exception e) { - logger.error("Error on the drop support assessment", e); - return false; - } - }else{ - return false; - } +public class FileDividerToolDlg extends JDialog{ + + private static final long serialVersionUID = 2241706750062961024L; + private static final int MAX_FILES = 500; + private CollectSurvey survey; + private transient Logger logger = LoggerFactory.getLogger( FileDividerToolDlg.class); + private JComboBox numberOfFiles ; + private JCheckBox randomSelector; + private JComboBox csvColumns; + private JFilePicker outputFolder; + private JButton generateGrids; + private JFilePicker filePicker; + + public static void open( Frame owner, CollectSurvey survey){ + FileDividerToolDlg dlg = new FileDividerToolDlg(owner, survey); + dlg.setVisible(true); + } + public FileDividerToolDlg( Frame owner,CollectSurvey survey ) { + super(owner); + this.survey = survey; + this.setModal(true); + this.setSize( new Dimension(700, 350)); + this.setLocationRelativeTo( owner ); + this.setTitle("Tool for dividing large CSV into smaller ones"); + initLayout(); } + private void initLayout() { + final JPanel panel = new JPanel(new GridBagLayout()); + GridBagConstraints c = new GridBagConstraints(); - private String getFileExtension(File file) { - String fileName = file.getName(); - int lastIndexOf = fileName.lastIndexOf('.' ); - String fileExtenxion = null; - if( lastIndexOf >0 ){ - fileExtenxion = fileName.substring( lastIndexOf + 1 ); - } - return fileExtenxion; - } + int row = 0; + c.fill = GridBagConstraints.BOTH; + c.gridx = 0; + c.gridwidth = 2; + c.gridy = row++; - private boolean isFileExtensionValid(File file ){ - String fileExtension = getFileExtension(file); - return fileExtension!=null && ( DataFormat.COLLECT_COORDS.checkFileExtensionMatches(fileExtension) || DataFormat.PROJECT_DEFINITION_FILE.checkFileExtensionMatches(fileExtension) || DataFormat.KML_FILE.checkFileExtensionMatches(fileExtension) ); - } + panel.add( getCsvFilePicker(), c ); + c.gridwidth = 1; + c.gridy = row++; - /* - * We support both copy and move actions. - * (non-Javadoc) - * @see javax.swing.TransferHandler#getSourceActions(javax.swing.JComponent) - */ - @Override - public int getSourceActions(JComponent c) { - return COPY_OR_MOVE; - } + c.gridx = 0; + panel.add( new JLabel("Number of files to split the CSV into"), c ); - /* - * Perform the actual import. This demo only supports drag and drop. - * (non-Javadoc) - * @see javax.swing.TransferHandler#importData(javax.swing.TransferHandler.TransferSupport) - */ - @Override - public boolean importData(TransferSupport info) { - if (!info.isDrop()) { - return false; - } + c.gridx = 1; + panel.add( getNumberOfFilesSelector(), c ); - // Get the file that is being dropped. - Transferable t = info.getTransferable(); - List data; - try { - data = (List)t.getTransferData(DataFlavor.javaFileListFlavor); - if( data.size()!=1){ - throw new IllegalArgumentException("The drop action supports only single file drops!"); - } + c.gridx = 0; + c.gridy = row++; + c.gridwidth = 2; + panel.add( getRandomSelector(), c ); - File fileToImport = data.get(0); + c.gridy = row++; + c.gridx = 0; + c.gridwidth = 1; + panel.add( new JLabel("Split files by strata (values of the column i.e : region )"), c ); - if( !isFileExtensionValid(fileToImport)){ - throw new IllegalArgumentException("The drop action supports only files of type!" + DataFormat.COLLECT_COORDS + " or " + DataFormat.PROJECT_DEFINITION_FILE); - } + c.gridx = 1; + panel.add( getColumnSelector(), c ); - String fileExtension = getFileExtension(fileToImport); + c.gridx = 0; + c.gridy = row++; + c.gridwidth = 2; + panel.add( getOutputFolder(), c ); - // If it is a CEP file then import - if( DataFormat.PROJECT_DEFINITION_FILE.checkFileExtensionMatches(fileExtension)){ - EarthApp.openProjectFileInRunningCollectEarth( fileToImport.getAbsolutePath() ); - }else if( DataFormat.COLLECT_COORDS.checkFileExtensionMatches(fileExtension)){ + c.gridx = 0; + c.gridy = row; - importCSVWithPlots(fileToImport); + panel.add( getGenerateButton(), c ); - }else if( DataFormat.KML_FILE.checkFileExtensionMatches( fileExtension ) ) { + this.add(panel); + } + + private JButton getGenerateButton() { + if( generateGrids == null ){ + generateGrids = new JButton("Divide file"); + generateGrids.setEnabled( false ); + generateGrids.addActionListener( e -> { + String sourceCsvFile = getCsvFilePicker().getSelectedFilePath(); + String destinationFolder = getOutputFolder().getSelectedFilePath(); + boolean randomizeLines = getRandomSelector().isSelected(); + Integer randomizeUsingColumnValues = null; + if( ( (CsvColumn) getColumnSelector().getSelectedItem() )!=null ){ + randomizeUsingColumnValues = ( (CsvColumn) getColumnSelector().getSelectedItem() ).getPos(); + } + Integer filesToDivideInto = getNumberOfFilesSelector().getSelectedIndex()+1; + ProduceCsvFiles produceCsvFiles = new ProduceCsvFiles(survey, sourceCsvFile, destinationFolder, randomizeLines, randomizeUsingColumnValues, filesToDivideInto); + File dest = produceCsvFiles.divideIntoFiles(); + + try { + CollectEarthUtils.openFolderInExplorer( dest.getAbsolutePath() ); + } catch (IOException e1) { + logger.error(" Error opening the destination folder", e); + } + }); + } + return generateGrids; + } - // Check if the CSV file can be loaded in the survey!!! + private JFilePicker getOutputFolder() { + if( outputFolder == null ){ + outputFolder = new JFilePicker("Select the output folder" , null, "Select...", DlgMode.MODE_SAVE); + outputFolder.getFileChooser().setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + outputFolder.setEnabled(false); - if( kmlImportService.loadFromKml( null, fileToImport ) ){ - EarthApp.executeKmlLoadAsynchronously( collectEarthWindow.getFrame() ); + outputFolder.addChangeListener( new DocumentListener() { + + @Override + public void removeUpdate(DocumentEvent e) { + // No need to do anything + } + + @Override + public void insertUpdate(DocumentEvent e) { + String outputFolderPath = outputFolder.getSelectedFilePath(); + File out = new File( outputFolderPath ); + getGenerateButton().setEnabled(out.exists() ); } + @Override + public void changedUpdate(DocumentEvent e) { + // No need to react to the update + } + }); + } + return outputFolder; + } + + + private void enableOtherControls(boolean validFile) { + getRandomSelector().setEnabled( true ); + getColumnSelector().setEnabled(validFile); + getNumberOfFilesSelector().setEnabled(true); + getOutputFolder().setEnabled(true); + setColumns( validFile ); + } + - }else{ - throw new IllegalArgumentException("Unknown file extension!!"); + private void setColumns( boolean validFile){ + if( validFile ){ + CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); + + List expectedHeaders = cegtg.getExpectedHeaders(survey); + CsvColumn[] columns = new CsvColumn[ expectedHeaders.size()+1 ]; + CsvColumn column = new CsvColumn(null,"DO NOT STRATIFY"); + columns[0] = column; + + int i = 0; + for (String header : expectedHeaders) { + column = new CsvColumn(i++,"Use :" + header); + columns[i] = column; } + getColumnSelector().setModel( new DefaultComboBoxModel( columns )); + }else{ + getColumnSelector().setModel( new DefaultComboBoxModel()); } - catch (Exception e) { - logger.error("Error on the drop action", e); - return false; - } + } + private JComboBox getColumnSelector() { + if( csvColumns == null ){ + csvColumns = new JComboBox<>(); + csvColumns.setEnabled(false); + } + return csvColumns; + } + private JCheckBox getRandomSelector() { + if( randomSelector == null ){ + randomSelector = new JCheckBox("Randomize the order of the lines from the source CSV file" , false); + randomSelector.setEnabled( false); + } + return randomSelector; + } - return true; + private JComboBox getNumberOfFilesSelector() { + if( numberOfFiles == null ){ + Integer[] items = new Integer[MAX_FILES]; + for (int i =1; i<= MAX_FILES; i++) { + items[i-1] = Integer.valueOf(i); + } + numberOfFiles = new JComboBox<>(items); + numberOfFiles.setEnabled( false ); + } + return numberOfFiles; } + private JFilePicker getCsvFilePicker() { + if( filePicker == null ){ + filePicker = new JFilePicker("Choose the CSV file with the sampling design (plots)", null, "Explore", DlgMode.MODE_OPEN); + + filePicker.getFileChooser().setAcceptAllFileFilterUsed(false); + filePicker.addFileTypeFilter("csv", " CSV file with plot (sampling design)", true); + + filePicker.addChangeListener( new DocumentListener() { + + @Override + public void removeUpdate(DocumentEvent e) { + // No need to validate + } + + @Override + public void insertUpdate(DocumentEvent e) { + validateCsv( filePicker.getTextField().getText() ); + } + + private boolean validateCsv(String filePath) { + boolean validFile = true; + try { + + filePicker.setTextBackground( Color.white); + + if( CsvReaderUtils.isCsvFile( filePath )){ + CollectEarthGridTemplateGenerator cetg = new CollectEarthGridTemplateGenerator(); + + File csvFile = new File( filePath ); + ValidationParameters validationParameters = new ValidationParameters(); + validationParameters.setValidateOnlyFirstLines(false); + CSVFileValidationResult validationResults = cetg.validate(csvFile, survey, validationParameters ); + + validFile = validationResults.isSuccessful(); + if( + !validFile + // If the message is that there are too many rows then we ignore the validation! + && ( + validationResults.getErrorType().equals( ErrorType.INVALID_NUMBER_OF_PLOTS_TOO_LARGE) + || + validationResults.getErrorType().equals( ErrorType.INVALID_NUMBER_OF_PLOTS_WARNING) + ) + ){ + validFile = true; + + } + + if( !validFile ){ + filePicker.setTextBackground( Color.yellow); + switch ( validationResults.getErrorType() ) { + case INVALID_FILE_TYPE: + filePicker.setTextBackground( Color.red); + JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), "The expected file type is CSV or CED ", "Expected File Type", JOptionPane.ERROR_MESSAGE); + break; + + case INVALID_HEADERS: + JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), String.format("The expected columns in the CSV for the survey %s are %s", survey.getName(), validationResults.getExpectedHeaders() ) , "Columns in CSV do not match survey", JOptionPane.ERROR_MESSAGE); + break; + + case INVALID_NUMBER_OF_COLUMNS: + JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), String.format("The number of columns in the CSV file do not coincide with the expercted columns expected for the survey %s /n%s", survey.getName(), validationResults.getExpectedHeaders() ), "Expected File Type", JOptionPane.ERROR_MESSAGE); + break; + + case INVALID_VALUES_IN_CSV: + // IN THIS CASE THE CELL RENDERER TAKES CARE OF HIGHLIGHTING THE CELLS!!! + JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), "The content of the CSV file is not correct!! The values on some cells are incorrect for the survey " + survey.getName() , "CSV content is not correct", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + break; + + default: + break; + } + } + + enableOtherControls( validFile ); + + }else{ + + JOptionPane.showMessageDialog(FileDividerToolDlg.this, String.format("The file in %s is NOT A CSV file ", filePath) ); + filePicker.setTextBackground( Color.red); + } + } catch (Exception e) { + JOptionPane.showMessageDialog(FileDividerToolDlg.this, String.format("The file in %s is NOT A CSV file ", filePath) ); + logger.error( "Error while validating the CSV file", e); + validFile = false; + } + return validFile; + } - private void importCSVWithPlots(File fileToImport) { - try{ - localPropertiesService.setValue( EarthProperty.SAMPLE_FILE, fileToImport.getAbsolutePath() ); - EarthApp.executeKmlLoadAsynchronously( collectEarthWindow.getFrame() ); - }catch( Exception kmlGenerationException ){ - logger.error( "Problem loading CSV file dropped into the window" , kmlGenerationException ); - EarthApp.showMessage(" Problem loading CSV file" + kmlGenerationException.getCause() ); + @Override + public void changedUpdate(DocumentEvent e) { + validateCsv( filePicker.getTextField().getText() ); + } + }); } + return filePicker ; } - } From dcbf5a9023acd2169f904c94660c59caa78f0a62 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:09 +0100 Subject: [PATCH 0261/1620] New translations FileDividerToolDlg.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 406 ++++++++++++------ 1 file changed, 281 insertions(+), 125 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 65dd7f9161..d275a15df8 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,168 +1,324 @@ package org.openforis.collect.earth.app.view; -import java.awt.datatransfer.DataFlavor; -import java.awt.datatransfer.Transferable; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; import java.io.File; +import java.io.IOException; import java.util.List; -import javax.swing.JComponent; -import javax.swing.TransferHandler; - -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.KmlImportService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import javax.swing.DefaultComboBoxModel; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JDialog; +import javax.swing.JFileChooser; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; + +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.collect.earth.sampler.utils.ProduceCsvFiles; +import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult; +import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult.ErrorType; +import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; +import org.openforis.collect.manager.validation.SurveyValidator.ValidationParameters; +import org.openforis.collect.model.CollectSurvey; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public class CollectEarthTransferHandler extends TransferHandler { - - @Autowired - private transient CollectEarthWindow collectEarthWindow; - - @Autowired - private transient LocalPropertiesService localPropertiesService; - - @Autowired - private transient KmlImportService kmlImportService; - - private static final long serialVersionUID = 1L; - private transient Logger logger = LoggerFactory.getLogger( CollectEarthTransferHandler.class); - - /* - * Can Only import an object if it represents a SINGLE file - * (non-Javadoc) - * @see javax.swing.TransferHandler#canImport(javax.swing.TransferHandler.TransferSupport) - */ - @Override - public boolean canImport(TransferSupport support) { - - if( support.isDataFlavorSupported(DataFlavor.javaFileListFlavor) ){ - Transferable t = support.getTransferable(); - List data; - try { - data = (List)t.getTransferData(DataFlavor.javaFileListFlavor); - - if( data !=null && data.size() == 1){ - return isFileExtensionValid( data.get(0) ); - }else { - return false; - } - }catch(java.awt.dnd.InvalidDnDOperationException unknownException) { - logger.warn("Why do I get this error?t", unknownException); - return true; - }catch (Exception e) { - logger.error("Error on the drop support assessment", e); - return false; - } - }else{ - return false; - } +public class FileDividerToolDlg extends JDialog{ + + private static final long serialVersionUID = 2241706750062961024L; + private static final int MAX_FILES = 500; + private CollectSurvey survey; + private transient Logger logger = LoggerFactory.getLogger( FileDividerToolDlg.class); + private JComboBox numberOfFiles ; + private JCheckBox randomSelector; + private JComboBox csvColumns; + private JFilePicker outputFolder; + private JButton generateGrids; + private JFilePicker filePicker; + + public static void open( Frame owner, CollectSurvey survey){ + FileDividerToolDlg dlg = new FileDividerToolDlg(owner, survey); + dlg.setVisible(true); + } + public FileDividerToolDlg( Frame owner,CollectSurvey survey ) { + super(owner); + this.survey = survey; + this.setModal(true); + this.setSize( new Dimension(700, 350)); + this.setLocationRelativeTo( owner ); + this.setTitle("Tool for dividing large CSV into smaller ones"); + initLayout(); } + private void initLayout() { + final JPanel panel = new JPanel(new GridBagLayout()); + GridBagConstraints c = new GridBagConstraints(); - private String getFileExtension(File file) { - String fileName = file.getName(); - int lastIndexOf = fileName.lastIndexOf('.' ); - String fileExtenxion = null; - if( lastIndexOf >0 ){ - fileExtenxion = fileName.substring( lastIndexOf + 1 ); - } - return fileExtenxion; - } + int row = 0; + c.fill = GridBagConstraints.BOTH; + c.gridx = 0; + c.gridwidth = 2; + c.gridy = row++; - private boolean isFileExtensionValid(File file ){ - String fileExtension = getFileExtension(file); - return fileExtension!=null && ( DataFormat.COLLECT_COORDS.checkFileExtensionMatches(fileExtension) || DataFormat.PROJECT_DEFINITION_FILE.checkFileExtensionMatches(fileExtension) || DataFormat.KML_FILE.checkFileExtensionMatches(fileExtension) ); - } + panel.add( getCsvFilePicker(), c ); + c.gridwidth = 1; + c.gridy = row++; - /* - * We support both copy and move actions. - * (non-Javadoc) - * @see javax.swing.TransferHandler#getSourceActions(javax.swing.JComponent) - */ - @Override - public int getSourceActions(JComponent c) { - return COPY_OR_MOVE; - } + c.gridx = 0; + panel.add( new JLabel("Number of files to split the CSV into"), c ); - /* - * Perform the actual import. This demo only supports drag and drop. - * (non-Javadoc) - * @see javax.swing.TransferHandler#importData(javax.swing.TransferHandler.TransferSupport) - */ - @Override - public boolean importData(TransferSupport info) { - if (!info.isDrop()) { - return false; - } + c.gridx = 1; + panel.add( getNumberOfFilesSelector(), c ); - // Get the file that is being dropped. - Transferable t = info.getTransferable(); - List data; - try { - data = (List)t.getTransferData(DataFlavor.javaFileListFlavor); - if( data.size()!=1){ - throw new IllegalArgumentException("The drop action supports only single file drops!"); - } + c.gridx = 0; + c.gridy = row++; + c.gridwidth = 2; + panel.add( getRandomSelector(), c ); - File fileToImport = data.get(0); + c.gridy = row++; + c.gridx = 0; + c.gridwidth = 1; + panel.add( new JLabel("Split files by strata (values of the column i.e : region )"), c ); - if( !isFileExtensionValid(fileToImport)){ - throw new IllegalArgumentException("The drop action supports only files of type!" + DataFormat.COLLECT_COORDS + " or " + DataFormat.PROJECT_DEFINITION_FILE); - } + c.gridx = 1; + panel.add( getColumnSelector(), c ); - String fileExtension = getFileExtension(fileToImport); + c.gridx = 0; + c.gridy = row++; + c.gridwidth = 2; + panel.add( getOutputFolder(), c ); - // If it is a CEP file then import - if( DataFormat.PROJECT_DEFINITION_FILE.checkFileExtensionMatches(fileExtension)){ - EarthApp.openProjectFileInRunningCollectEarth( fileToImport.getAbsolutePath() ); - }else if( DataFormat.COLLECT_COORDS.checkFileExtensionMatches(fileExtension)){ + c.gridx = 0; + c.gridy = row; - importCSVWithPlots(fileToImport); + panel.add( getGenerateButton(), c ); - }else if( DataFormat.KML_FILE.checkFileExtensionMatches( fileExtension ) ) { + this.add(panel); + } + + private JButton getGenerateButton() { + if( generateGrids == null ){ + generateGrids = new JButton("Divide file"); + generateGrids.setEnabled( false ); + generateGrids.addActionListener( e -> { + String sourceCsvFile = getCsvFilePicker().getSelectedFilePath(); + String destinationFolder = getOutputFolder().getSelectedFilePath(); + boolean randomizeLines = getRandomSelector().isSelected(); + Integer randomizeUsingColumnValues = null; + if( ( (CsvColumn) getColumnSelector().getSelectedItem() )!=null ){ + randomizeUsingColumnValues = ( (CsvColumn) getColumnSelector().getSelectedItem() ).getPos(); + } + Integer filesToDivideInto = getNumberOfFilesSelector().getSelectedIndex()+1; + ProduceCsvFiles produceCsvFiles = new ProduceCsvFiles(survey, sourceCsvFile, destinationFolder, randomizeLines, randomizeUsingColumnValues, filesToDivideInto); + File dest = produceCsvFiles.divideIntoFiles(); + + try { + CollectEarthUtils.openFolderInExplorer( dest.getAbsolutePath() ); + } catch (IOException e1) { + logger.error(" Error opening the destination folder", e); + } + }); + } + return generateGrids; + } - // Check if the CSV file can be loaded in the survey!!! + private JFilePicker getOutputFolder() { + if( outputFolder == null ){ + outputFolder = new JFilePicker("Select the output folder" , null, "Select...", DlgMode.MODE_SAVE); + outputFolder.getFileChooser().setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + outputFolder.setEnabled(false); - if( kmlImportService.loadFromKml( null, fileToImport ) ){ - EarthApp.executeKmlLoadAsynchronously( collectEarthWindow.getFrame() ); + outputFolder.addChangeListener( new DocumentListener() { + + @Override + public void removeUpdate(DocumentEvent e) { + // No need to do anything + } + + @Override + public void insertUpdate(DocumentEvent e) { + String outputFolderPath = outputFolder.getSelectedFilePath(); + File out = new File( outputFolderPath ); + getGenerateButton().setEnabled(out.exists() ); } + @Override + public void changedUpdate(DocumentEvent e) { + // No need to react to the update + } + }); + } + return outputFolder; + } + + + private void enableOtherControls(boolean validFile) { + getRandomSelector().setEnabled( true ); + getColumnSelector().setEnabled(validFile); + getNumberOfFilesSelector().setEnabled(true); + getOutputFolder().setEnabled(true); + setColumns( validFile ); + } + - }else{ - throw new IllegalArgumentException("Unknown file extension!!"); + private void setColumns( boolean validFile){ + if( validFile ){ + CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); + + List expectedHeaders = cegtg.getExpectedHeaders(survey); + CsvColumn[] columns = new CsvColumn[ expectedHeaders.size()+1 ]; + CsvColumn column = new CsvColumn(null,"DO NOT STRATIFY"); + columns[0] = column; + + int i = 0; + for (String header : expectedHeaders) { + column = new CsvColumn(i++,"Use :" + header); + columns[i] = column; } + getColumnSelector().setModel( new DefaultComboBoxModel( columns )); + }else{ + getColumnSelector().setModel( new DefaultComboBoxModel()); } - catch (Exception e) { - logger.error("Error on the drop action", e); - return false; - } + } + private JComboBox getColumnSelector() { + if( csvColumns == null ){ + csvColumns = new JComboBox<>(); + csvColumns.setEnabled(false); + } + return csvColumns; + } + private JCheckBox getRandomSelector() { + if( randomSelector == null ){ + randomSelector = new JCheckBox("Randomize the order of the lines from the source CSV file" , false); + randomSelector.setEnabled( false); + } + return randomSelector; + } - return true; + private JComboBox getNumberOfFilesSelector() { + if( numberOfFiles == null ){ + Integer[] items = new Integer[MAX_FILES]; + for (int i =1; i<= MAX_FILES; i++) { + items[i-1] = Integer.valueOf(i); + } + numberOfFiles = new JComboBox<>(items); + numberOfFiles.setEnabled( false ); + } + return numberOfFiles; } + private JFilePicker getCsvFilePicker() { + if( filePicker == null ){ + filePicker = new JFilePicker("Choose the CSV file with the sampling design (plots)", null, "Explore", DlgMode.MODE_OPEN); + + filePicker.getFileChooser().setAcceptAllFileFilterUsed(false); + filePicker.addFileTypeFilter("csv", " CSV file with plot (sampling design)", true); + + filePicker.addChangeListener( new DocumentListener() { + + @Override + public void removeUpdate(DocumentEvent e) { + // No need to validate + } + + @Override + public void insertUpdate(DocumentEvent e) { + validateCsv( filePicker.getTextField().getText() ); + } + + private boolean validateCsv(String filePath) { + boolean validFile = true; + try { + + filePicker.setTextBackground( Color.white); + + if( CsvReaderUtils.isCsvFile( filePath )){ + CollectEarthGridTemplateGenerator cetg = new CollectEarthGridTemplateGenerator(); + + File csvFile = new File( filePath ); + ValidationParameters validationParameters = new ValidationParameters(); + validationParameters.setValidateOnlyFirstLines(false); + CSVFileValidationResult validationResults = cetg.validate(csvFile, survey, validationParameters ); + + validFile = validationResults.isSuccessful(); + if( + !validFile + // If the message is that there are too many rows then we ignore the validation! + && ( + validationResults.getErrorType().equals( ErrorType.INVALID_NUMBER_OF_PLOTS_TOO_LARGE) + || + validationResults.getErrorType().equals( ErrorType.INVALID_NUMBER_OF_PLOTS_WARNING) + ) + ){ + validFile = true; + + } + + if( !validFile ){ + filePicker.setTextBackground( Color.yellow); + switch ( validationResults.getErrorType() ) { + case INVALID_FILE_TYPE: + filePicker.setTextBackground( Color.red); + JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), "The expected file type is CSV or CED ", "Expected File Type", JOptionPane.ERROR_MESSAGE); + break; + + case INVALID_HEADERS: + JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), String.format("The expected columns in the CSV for the survey %s are %s", survey.getName(), validationResults.getExpectedHeaders() ) , "Columns in CSV do not match survey", JOptionPane.ERROR_MESSAGE); + break; + + case INVALID_NUMBER_OF_COLUMNS: + JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), String.format("The number of columns in the CSV file do not coincide with the expercted columns expected for the survey %s /n%s", survey.getName(), validationResults.getExpectedHeaders() ), "Expected File Type", JOptionPane.ERROR_MESSAGE); + break; + + case INVALID_VALUES_IN_CSV: + // IN THIS CASE THE CELL RENDERER TAKES CARE OF HIGHLIGHTING THE CELLS!!! + JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), "The content of the CSV file is not correct!! The values on some cells are incorrect for the survey " + survey.getName() , "CSV content is not correct", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + break; + + default: + break; + } + } + + enableOtherControls( validFile ); + + }else{ + + JOptionPane.showMessageDialog(FileDividerToolDlg.this, String.format("The file in %s is NOT A CSV file ", filePath) ); + filePicker.setTextBackground( Color.red); + } + } catch (Exception e) { + JOptionPane.showMessageDialog(FileDividerToolDlg.this, String.format("The file in %s is NOT A CSV file ", filePath) ); + logger.error( "Error while validating the CSV file", e); + validFile = false; + } + return validFile; + } - private void importCSVWithPlots(File fileToImport) { - try{ - localPropertiesService.setValue( EarthProperty.SAMPLE_FILE, fileToImport.getAbsolutePath() ); - EarthApp.executeKmlLoadAsynchronously( collectEarthWindow.getFrame() ); - }catch( Exception kmlGenerationException ){ - logger.error( "Problem loading CSV file dropped into the window" , kmlGenerationException ); - EarthApp.showMessage(" Problem loading CSV file" + kmlGenerationException.getCause() ); + @Override + public void changedUpdate(DocumentEvent e) { + validateCsv( filePicker.getTextField().getText() ); + } + }); } + return filePicker ; } - } From 4404fca7b9bb5432d5493d34477bd1114aa6dddb Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:10 +0100 Subject: [PATCH 0262/1620] New translations FileDividerToolDlg.java (English) --- .../earth/app/view/Messages_en.properties | 406 ++++++++++++------ 1 file changed, 281 insertions(+), 125 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 65dd7f9161..d275a15df8 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,168 +1,324 @@ package org.openforis.collect.earth.app.view; -import java.awt.datatransfer.DataFlavor; -import java.awt.datatransfer.Transferable; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; import java.io.File; +import java.io.IOException; import java.util.List; -import javax.swing.JComponent; -import javax.swing.TransferHandler; - -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.KmlImportService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import javax.swing.DefaultComboBoxModel; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JDialog; +import javax.swing.JFileChooser; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; + +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.collect.earth.sampler.utils.ProduceCsvFiles; +import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult; +import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult.ErrorType; +import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; +import org.openforis.collect.manager.validation.SurveyValidator.ValidationParameters; +import org.openforis.collect.model.CollectSurvey; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public class CollectEarthTransferHandler extends TransferHandler { - - @Autowired - private transient CollectEarthWindow collectEarthWindow; - - @Autowired - private transient LocalPropertiesService localPropertiesService; - - @Autowired - private transient KmlImportService kmlImportService; - - private static final long serialVersionUID = 1L; - private transient Logger logger = LoggerFactory.getLogger( CollectEarthTransferHandler.class); - - /* - * Can Only import an object if it represents a SINGLE file - * (non-Javadoc) - * @see javax.swing.TransferHandler#canImport(javax.swing.TransferHandler.TransferSupport) - */ - @Override - public boolean canImport(TransferSupport support) { - - if( support.isDataFlavorSupported(DataFlavor.javaFileListFlavor) ){ - Transferable t = support.getTransferable(); - List data; - try { - data = (List)t.getTransferData(DataFlavor.javaFileListFlavor); - - if( data !=null && data.size() == 1){ - return isFileExtensionValid( data.get(0) ); - }else { - return false; - } - }catch(java.awt.dnd.InvalidDnDOperationException unknownException) { - logger.warn("Why do I get this error?t", unknownException); - return true; - }catch (Exception e) { - logger.error("Error on the drop support assessment", e); - return false; - } - }else{ - return false; - } +public class FileDividerToolDlg extends JDialog{ + + private static final long serialVersionUID = 2241706750062961024L; + private static final int MAX_FILES = 500; + private CollectSurvey survey; + private transient Logger logger = LoggerFactory.getLogger( FileDividerToolDlg.class); + private JComboBox numberOfFiles ; + private JCheckBox randomSelector; + private JComboBox csvColumns; + private JFilePicker outputFolder; + private JButton generateGrids; + private JFilePicker filePicker; + + public static void open( Frame owner, CollectSurvey survey){ + FileDividerToolDlg dlg = new FileDividerToolDlg(owner, survey); + dlg.setVisible(true); + } + public FileDividerToolDlg( Frame owner,CollectSurvey survey ) { + super(owner); + this.survey = survey; + this.setModal(true); + this.setSize( new Dimension(700, 350)); + this.setLocationRelativeTo( owner ); + this.setTitle("Tool for dividing large CSV into smaller ones"); + initLayout(); } + private void initLayout() { + final JPanel panel = new JPanel(new GridBagLayout()); + GridBagConstraints c = new GridBagConstraints(); - private String getFileExtension(File file) { - String fileName = file.getName(); - int lastIndexOf = fileName.lastIndexOf('.' ); - String fileExtenxion = null; - if( lastIndexOf >0 ){ - fileExtenxion = fileName.substring( lastIndexOf + 1 ); - } - return fileExtenxion; - } + int row = 0; + c.fill = GridBagConstraints.BOTH; + c.gridx = 0; + c.gridwidth = 2; + c.gridy = row++; - private boolean isFileExtensionValid(File file ){ - String fileExtension = getFileExtension(file); - return fileExtension!=null && ( DataFormat.COLLECT_COORDS.checkFileExtensionMatches(fileExtension) || DataFormat.PROJECT_DEFINITION_FILE.checkFileExtensionMatches(fileExtension) || DataFormat.KML_FILE.checkFileExtensionMatches(fileExtension) ); - } + panel.add( getCsvFilePicker(), c ); + c.gridwidth = 1; + c.gridy = row++; - /* - * We support both copy and move actions. - * (non-Javadoc) - * @see javax.swing.TransferHandler#getSourceActions(javax.swing.JComponent) - */ - @Override - public int getSourceActions(JComponent c) { - return COPY_OR_MOVE; - } + c.gridx = 0; + panel.add( new JLabel("Number of files to split the CSV into"), c ); - /* - * Perform the actual import. This demo only supports drag and drop. - * (non-Javadoc) - * @see javax.swing.TransferHandler#importData(javax.swing.TransferHandler.TransferSupport) - */ - @Override - public boolean importData(TransferSupport info) { - if (!info.isDrop()) { - return false; - } + c.gridx = 1; + panel.add( getNumberOfFilesSelector(), c ); - // Get the file that is being dropped. - Transferable t = info.getTransferable(); - List data; - try { - data = (List)t.getTransferData(DataFlavor.javaFileListFlavor); - if( data.size()!=1){ - throw new IllegalArgumentException("The drop action supports only single file drops!"); - } + c.gridx = 0; + c.gridy = row++; + c.gridwidth = 2; + panel.add( getRandomSelector(), c ); - File fileToImport = data.get(0); + c.gridy = row++; + c.gridx = 0; + c.gridwidth = 1; + panel.add( new JLabel("Split files by strata (values of the column i.e : region )"), c ); - if( !isFileExtensionValid(fileToImport)){ - throw new IllegalArgumentException("The drop action supports only files of type!" + DataFormat.COLLECT_COORDS + " or " + DataFormat.PROJECT_DEFINITION_FILE); - } + c.gridx = 1; + panel.add( getColumnSelector(), c ); - String fileExtension = getFileExtension(fileToImport); + c.gridx = 0; + c.gridy = row++; + c.gridwidth = 2; + panel.add( getOutputFolder(), c ); - // If it is a CEP file then import - if( DataFormat.PROJECT_DEFINITION_FILE.checkFileExtensionMatches(fileExtension)){ - EarthApp.openProjectFileInRunningCollectEarth( fileToImport.getAbsolutePath() ); - }else if( DataFormat.COLLECT_COORDS.checkFileExtensionMatches(fileExtension)){ + c.gridx = 0; + c.gridy = row; - importCSVWithPlots(fileToImport); + panel.add( getGenerateButton(), c ); - }else if( DataFormat.KML_FILE.checkFileExtensionMatches( fileExtension ) ) { + this.add(panel); + } + + private JButton getGenerateButton() { + if( generateGrids == null ){ + generateGrids = new JButton("Divide file"); + generateGrids.setEnabled( false ); + generateGrids.addActionListener( e -> { + String sourceCsvFile = getCsvFilePicker().getSelectedFilePath(); + String destinationFolder = getOutputFolder().getSelectedFilePath(); + boolean randomizeLines = getRandomSelector().isSelected(); + Integer randomizeUsingColumnValues = null; + if( ( (CsvColumn) getColumnSelector().getSelectedItem() )!=null ){ + randomizeUsingColumnValues = ( (CsvColumn) getColumnSelector().getSelectedItem() ).getPos(); + } + Integer filesToDivideInto = getNumberOfFilesSelector().getSelectedIndex()+1; + ProduceCsvFiles produceCsvFiles = new ProduceCsvFiles(survey, sourceCsvFile, destinationFolder, randomizeLines, randomizeUsingColumnValues, filesToDivideInto); + File dest = produceCsvFiles.divideIntoFiles(); + + try { + CollectEarthUtils.openFolderInExplorer( dest.getAbsolutePath() ); + } catch (IOException e1) { + logger.error(" Error opening the destination folder", e); + } + }); + } + return generateGrids; + } - // Check if the CSV file can be loaded in the survey!!! + private JFilePicker getOutputFolder() { + if( outputFolder == null ){ + outputFolder = new JFilePicker("Select the output folder" , null, "Select...", DlgMode.MODE_SAVE); + outputFolder.getFileChooser().setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + outputFolder.setEnabled(false); - if( kmlImportService.loadFromKml( null, fileToImport ) ){ - EarthApp.executeKmlLoadAsynchronously( collectEarthWindow.getFrame() ); + outputFolder.addChangeListener( new DocumentListener() { + + @Override + public void removeUpdate(DocumentEvent e) { + // No need to do anything + } + + @Override + public void insertUpdate(DocumentEvent e) { + String outputFolderPath = outputFolder.getSelectedFilePath(); + File out = new File( outputFolderPath ); + getGenerateButton().setEnabled(out.exists() ); } + @Override + public void changedUpdate(DocumentEvent e) { + // No need to react to the update + } + }); + } + return outputFolder; + } + + + private void enableOtherControls(boolean validFile) { + getRandomSelector().setEnabled( true ); + getColumnSelector().setEnabled(validFile); + getNumberOfFilesSelector().setEnabled(true); + getOutputFolder().setEnabled(true); + setColumns( validFile ); + } + - }else{ - throw new IllegalArgumentException("Unknown file extension!!"); + private void setColumns( boolean validFile){ + if( validFile ){ + CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); + + List expectedHeaders = cegtg.getExpectedHeaders(survey); + CsvColumn[] columns = new CsvColumn[ expectedHeaders.size()+1 ]; + CsvColumn column = new CsvColumn(null,"DO NOT STRATIFY"); + columns[0] = column; + + int i = 0; + for (String header : expectedHeaders) { + column = new CsvColumn(i++,"Use :" + header); + columns[i] = column; } + getColumnSelector().setModel( new DefaultComboBoxModel( columns )); + }else{ + getColumnSelector().setModel( new DefaultComboBoxModel()); } - catch (Exception e) { - logger.error("Error on the drop action", e); - return false; - } + } + private JComboBox getColumnSelector() { + if( csvColumns == null ){ + csvColumns = new JComboBox<>(); + csvColumns.setEnabled(false); + } + return csvColumns; + } + private JCheckBox getRandomSelector() { + if( randomSelector == null ){ + randomSelector = new JCheckBox("Randomize the order of the lines from the source CSV file" , false); + randomSelector.setEnabled( false); + } + return randomSelector; + } - return true; + private JComboBox getNumberOfFilesSelector() { + if( numberOfFiles == null ){ + Integer[] items = new Integer[MAX_FILES]; + for (int i =1; i<= MAX_FILES; i++) { + items[i-1] = Integer.valueOf(i); + } + numberOfFiles = new JComboBox<>(items); + numberOfFiles.setEnabled( false ); + } + return numberOfFiles; } + private JFilePicker getCsvFilePicker() { + if( filePicker == null ){ + filePicker = new JFilePicker("Choose the CSV file with the sampling design (plots)", null, "Explore", DlgMode.MODE_OPEN); + + filePicker.getFileChooser().setAcceptAllFileFilterUsed(false); + filePicker.addFileTypeFilter("csv", " CSV file with plot (sampling design)", true); + + filePicker.addChangeListener( new DocumentListener() { + + @Override + public void removeUpdate(DocumentEvent e) { + // No need to validate + } + + @Override + public void insertUpdate(DocumentEvent e) { + validateCsv( filePicker.getTextField().getText() ); + } + + private boolean validateCsv(String filePath) { + boolean validFile = true; + try { + + filePicker.setTextBackground( Color.white); + + if( CsvReaderUtils.isCsvFile( filePath )){ + CollectEarthGridTemplateGenerator cetg = new CollectEarthGridTemplateGenerator(); + + File csvFile = new File( filePath ); + ValidationParameters validationParameters = new ValidationParameters(); + validationParameters.setValidateOnlyFirstLines(false); + CSVFileValidationResult validationResults = cetg.validate(csvFile, survey, validationParameters ); + + validFile = validationResults.isSuccessful(); + if( + !validFile + // If the message is that there are too many rows then we ignore the validation! + && ( + validationResults.getErrorType().equals( ErrorType.INVALID_NUMBER_OF_PLOTS_TOO_LARGE) + || + validationResults.getErrorType().equals( ErrorType.INVALID_NUMBER_OF_PLOTS_WARNING) + ) + ){ + validFile = true; + + } + + if( !validFile ){ + filePicker.setTextBackground( Color.yellow); + switch ( validationResults.getErrorType() ) { + case INVALID_FILE_TYPE: + filePicker.setTextBackground( Color.red); + JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), "The expected file type is CSV or CED ", "Expected File Type", JOptionPane.ERROR_MESSAGE); + break; + + case INVALID_HEADERS: + JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), String.format("The expected columns in the CSV for the survey %s are %s", survey.getName(), validationResults.getExpectedHeaders() ) , "Columns in CSV do not match survey", JOptionPane.ERROR_MESSAGE); + break; + + case INVALID_NUMBER_OF_COLUMNS: + JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), String.format("The number of columns in the CSV file do not coincide with the expercted columns expected for the survey %s /n%s", survey.getName(), validationResults.getExpectedHeaders() ), "Expected File Type", JOptionPane.ERROR_MESSAGE); + break; + + case INVALID_VALUES_IN_CSV: + // IN THIS CASE THE CELL RENDERER TAKES CARE OF HIGHLIGHTING THE CELLS!!! + JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), "The content of the CSV file is not correct!! The values on some cells are incorrect for the survey " + survey.getName() , "CSV content is not correct", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + break; + + default: + break; + } + } + + enableOtherControls( validFile ); + + }else{ + + JOptionPane.showMessageDialog(FileDividerToolDlg.this, String.format("The file in %s is NOT A CSV file ", filePath) ); + filePicker.setTextBackground( Color.red); + } + } catch (Exception e) { + JOptionPane.showMessageDialog(FileDividerToolDlg.this, String.format("The file in %s is NOT A CSV file ", filePath) ); + logger.error( "Error while validating the CSV file", e); + validFile = false; + } + return validFile; + } - private void importCSVWithPlots(File fileToImport) { - try{ - localPropertiesService.setValue( EarthProperty.SAMPLE_FILE, fileToImport.getAbsolutePath() ); - EarthApp.executeKmlLoadAsynchronously( collectEarthWindow.getFrame() ); - }catch( Exception kmlGenerationException ){ - logger.error( "Problem loading CSV file dropped into the window" , kmlGenerationException ); - EarthApp.showMessage(" Problem loading CSV file" + kmlGenerationException.getCause() ); + @Override + public void changedUpdate(DocumentEvent e) { + validateCsv( filePicker.getTextField().getText() ); + } + }); } + return filePicker ; } - } From 6972bb84bedad12f2ebcdb9942a01fdf4a80c246 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:11 +0100 Subject: [PATCH 0263/1620] New translations FileTypeFilter.java (French) --- .../earth/app/view/Messages_fr.properties | 59 ++++++++++--------- 1 file changed, 32 insertions(+), 27 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index ea8d41cfa0..139e1bb847 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,34 +1,39 @@ -package org.openforis.collect.earth.app.service; +package org.openforis.collect.earth.app.view; -import org.openforis.collect.earth.app.EarthConstants; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; +import java.io.File; -@Component -public class SchemaService { +import javax.swing.filechooser.FileFilter; - @Autowired - LocalPropertiesService localPropertiesService; - - private String getSchemaName(ExportType exportType) { - String schemaName = null; - if (localPropertiesService.isUsingPostgreSqlDB()) { - if( exportType.equals( ExportType.SAIKU )) - schemaName = EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU; - else - schemaName = EarthConstants.POSTGRES_RDB_SCHEMA_IPCC; - } - return schemaName; +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ +public class FileTypeFilter extends FileFilter { + + private String extension; + private String description; + + public FileTypeFilter(String extension, String description) { + this.extension = extension; + this.description = description; } - public String getSchemaPrefix(ExportType exportType) { - String schemaName = getSchemaName(exportType); - if (schemaName != null) { - schemaName += "."; //$NON-NLS-1$ - } else { - schemaName = ""; //$NON-NLS-1$ + @Override + public boolean accept(File file) { + if (file.isDirectory()) { + return true; } - return schemaName; + boolean accepted = false; + String[] extensions = extension.split(","); //$NON-NLS-1$ + for (String item : extensions) { + accepted = accepted || file.getName().toLowerCase().endsWith(item); + } + return accepted; + + } + + @Override + public String getDescription() { + return description + String.format(" (*%s)", extension); //$NON-NLS-1$ } - -} +} \ No newline at end of file From 742bc63132e52d492567d64271c144e91581f7c9 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:12 +0100 Subject: [PATCH 0264/1620] New translations FileTypeFilter.java (Spanish) --- .../earth/app/view/Messages_es.properties | 335 ++---------------- 1 file changed, 25 insertions(+), 310 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index d275a15df8..139e1bb847 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,324 +1,39 @@ package org.openforis.collect.earth.app.view; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Frame; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; import java.io.File; -import java.io.IOException; -import java.util.List; -import javax.swing.DefaultComboBoxModel; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JDialog; -import javax.swing.JFileChooser; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; +import javax.swing.filechooser.FileFilter; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.collect.earth.sampler.utils.ProduceCsvFiles; -import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult; -import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult.ErrorType; -import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; -import org.openforis.collect.manager.validation.SurveyValidator.ValidationParameters; -import org.openforis.collect.model.CollectSurvey; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ +public class FileTypeFilter extends FileFilter { -public class FileDividerToolDlg extends JDialog{ + private String extension; + private String description; - private static final long serialVersionUID = 2241706750062961024L; - private static final int MAX_FILES = 500; - private CollectSurvey survey; - private transient Logger logger = LoggerFactory.getLogger( FileDividerToolDlg.class); - private JComboBox numberOfFiles ; - private JCheckBox randomSelector; - private JComboBox csvColumns; - private JFilePicker outputFolder; - private JButton generateGrids; - private JFilePicker filePicker; - - public static void open( Frame owner, CollectSurvey survey){ - FileDividerToolDlg dlg = new FileDividerToolDlg(owner, survey); - dlg.setVisible(true); - } - - public FileDividerToolDlg( Frame owner,CollectSurvey survey ) { - super(owner); - this.survey = survey; - this.setModal(true); - this.setSize( new Dimension(700, 350)); - this.setLocationRelativeTo( owner ); - this.setTitle("Tool for dividing large CSV into smaller ones"); - initLayout(); - } - - private void initLayout() { - final JPanel panel = new JPanel(new GridBagLayout()); - GridBagConstraints c = new GridBagConstraints(); - - int row = 0; - - c.fill = GridBagConstraints.BOTH; - c.gridx = 0; - c.gridwidth = 2; - c.gridy = row++; - - panel.add( getCsvFilePicker(), c ); - c.gridwidth = 1; - c.gridy = row++; - - c.gridx = 0; - - panel.add( new JLabel("Number of files to split the CSV into"), c ); - - c.gridx = 1; - panel.add( getNumberOfFilesSelector(), c ); - - c.gridx = 0; - c.gridy = row++; - c.gridwidth = 2; - panel.add( getRandomSelector(), c ); - - c.gridy = row++; - c.gridx = 0; - c.gridwidth = 1; - panel.add( new JLabel("Split files by strata (values of the column i.e : region )"), c ); - - c.gridx = 1; - panel.add( getColumnSelector(), c ); - - c.gridx = 0; - c.gridy = row++; - c.gridwidth = 2; - panel.add( getOutputFolder(), c ); - - c.gridx = 0; - c.gridy = row; - - panel.add( getGenerateButton(), c ); - - this.add(panel); - } - - private JButton getGenerateButton() { - if( generateGrids == null ){ - generateGrids = new JButton("Divide file"); - generateGrids.setEnabled( false ); - generateGrids.addActionListener( e -> { - String sourceCsvFile = getCsvFilePicker().getSelectedFilePath(); - String destinationFolder = getOutputFolder().getSelectedFilePath(); - boolean randomizeLines = getRandomSelector().isSelected(); - Integer randomizeUsingColumnValues = null; - if( ( (CsvColumn) getColumnSelector().getSelectedItem() )!=null ){ - randomizeUsingColumnValues = ( (CsvColumn) getColumnSelector().getSelectedItem() ).getPos(); - } - Integer filesToDivideInto = getNumberOfFilesSelector().getSelectedIndex()+1; - ProduceCsvFiles produceCsvFiles = new ProduceCsvFiles(survey, sourceCsvFile, destinationFolder, randomizeLines, randomizeUsingColumnValues, filesToDivideInto); - File dest = produceCsvFiles.divideIntoFiles(); - - try { - CollectEarthUtils.openFolderInExplorer( dest.getAbsolutePath() ); - } catch (IOException e1) { - logger.error(" Error opening the destination folder", e); - } - }); - } - return generateGrids; - } - - private JFilePicker getOutputFolder() { - if( outputFolder == null ){ - outputFolder = new JFilePicker("Select the output folder" , null, "Select...", DlgMode.MODE_SAVE); - outputFolder.getFileChooser().setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); - outputFolder.setEnabled(false); - - outputFolder.addChangeListener( new DocumentListener() { - - @Override - public void removeUpdate(DocumentEvent e) { - // No need to do anything - } - - @Override - public void insertUpdate(DocumentEvent e) { - String outputFolderPath = outputFolder.getSelectedFilePath(); - File out = new File( outputFolderPath ); - getGenerateButton().setEnabled(out.exists() ); - } - - @Override - public void changedUpdate(DocumentEvent e) { - // No need to react to the update - } - }); - } - return outputFolder; - } - - - private void enableOtherControls(boolean validFile) { - getRandomSelector().setEnabled( true ); - getColumnSelector().setEnabled(validFile); - getNumberOfFilesSelector().setEnabled(true); - getOutputFolder().setEnabled(true); - setColumns( validFile ); - } - - - private void setColumns( boolean validFile){ - if( validFile ){ - CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); - - List expectedHeaders = cegtg.getExpectedHeaders(survey); - CsvColumn[] columns = new CsvColumn[ expectedHeaders.size()+1 ]; - CsvColumn column = new CsvColumn(null,"DO NOT STRATIFY"); - columns[0] = column; - - int i = 0; - for (String header : expectedHeaders) { - column = new CsvColumn(i++,"Use :" + header); - columns[i] = column; - } - - getColumnSelector().setModel( new DefaultComboBoxModel( columns )); - }else{ - getColumnSelector().setModel( new DefaultComboBoxModel()); - } + public FileTypeFilter(String extension, String description) { + this.extension = extension; + this.description = description; } - - private JComboBox getColumnSelector() { - if( csvColumns == null ){ - csvColumns = new JComboBox<>(); - csvColumns.setEnabled(false); + @Override + public boolean accept(File file) { + if (file.isDirectory()) { + return true; } - return csvColumns; - } - - private JCheckBox getRandomSelector() { - if( randomSelector == null ){ - randomSelector = new JCheckBox("Randomize the order of the lines from the source CSV file" , false); - randomSelector.setEnabled( false); + boolean accepted = false; + String[] extensions = extension.split(","); //$NON-NLS-1$ + for (String item : extensions) { + accepted = accepted || file.getName().toLowerCase().endsWith(item); } - return randomSelector; + return accepted; + } - private JComboBox getNumberOfFilesSelector() { - if( numberOfFiles == null ){ - Integer[] items = new Integer[MAX_FILES]; - for (int i =1; i<= MAX_FILES; i++) { - items[i-1] = Integer.valueOf(i); - } - numberOfFiles = new JComboBox<>(items); - numberOfFiles.setEnabled( false ); - } - return numberOfFiles; + @Override + public String getDescription() { + return description + String.format(" (*%s)", extension); //$NON-NLS-1$ } - - private JFilePicker getCsvFilePicker() { - if( filePicker == null ){ - filePicker = new JFilePicker("Choose the CSV file with the sampling design (plots)", null, "Explore", DlgMode.MODE_OPEN); - - filePicker.getFileChooser().setAcceptAllFileFilterUsed(false); - filePicker.addFileTypeFilter("csv", " CSV file with plot (sampling design)", true); - - filePicker.addChangeListener( new DocumentListener() { - - @Override - public void removeUpdate(DocumentEvent e) { - // No need to validate - } - - @Override - public void insertUpdate(DocumentEvent e) { - validateCsv( filePicker.getTextField().getText() ); - } - - private boolean validateCsv(String filePath) { - boolean validFile = true; - try { - - filePicker.setTextBackground( Color.white); - - if( CsvReaderUtils.isCsvFile( filePath )){ - CollectEarthGridTemplateGenerator cetg = new CollectEarthGridTemplateGenerator(); - - File csvFile = new File( filePath ); - ValidationParameters validationParameters = new ValidationParameters(); - validationParameters.setValidateOnlyFirstLines(false); - CSVFileValidationResult validationResults = cetg.validate(csvFile, survey, validationParameters ); - - validFile = validationResults.isSuccessful(); - if( - !validFile - // If the message is that there are too many rows then we ignore the validation! - && ( - validationResults.getErrorType().equals( ErrorType.INVALID_NUMBER_OF_PLOTS_TOO_LARGE) - || - validationResults.getErrorType().equals( ErrorType.INVALID_NUMBER_OF_PLOTS_WARNING) - ) - ){ - validFile = true; - - } - - if( !validFile ){ - filePicker.setTextBackground( Color.yellow); - switch ( validationResults.getErrorType() ) { - case INVALID_FILE_TYPE: - filePicker.setTextBackground( Color.red); - JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), "The expected file type is CSV or CED ", "Expected File Type", JOptionPane.ERROR_MESSAGE); - break; - - case INVALID_HEADERS: - JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), String.format("The expected columns in the CSV for the survey %s are %s", survey.getName(), validationResults.getExpectedHeaders() ) , "Columns in CSV do not match survey", JOptionPane.ERROR_MESSAGE); - break; - - case INVALID_NUMBER_OF_COLUMNS: - JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), String.format("The number of columns in the CSV file do not coincide with the expercted columns expected for the survey %s /n%s", survey.getName(), validationResults.getExpectedHeaders() ), "Expected File Type", JOptionPane.ERROR_MESSAGE); - break; - - case INVALID_VALUES_IN_CSV: - // IN THIS CASE THE CELL RENDERER TAKES CARE OF HIGHLIGHTING THE CELLS!!! - JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), "The content of the CSV file is not correct!! The values on some cells are incorrect for the survey " + survey.getName() , "CSV content is not correct", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - break; - - default: - break; - } - } - - enableOtherControls( validFile ); - - }else{ - - JOptionPane.showMessageDialog(FileDividerToolDlg.this, String.format("The file in %s is NOT A CSV file ", filePath) ); - filePicker.setTextBackground( Color.red); - } - } catch (Exception e) { - JOptionPane.showMessageDialog(FileDividerToolDlg.this, String.format("The file in %s is NOT A CSV file ", filePath) ); - logger.error( "Error while validating the CSV file", e); - validFile = false; - } - return validFile; - } - - @Override - public void changedUpdate(DocumentEvent e) { - validateCsv( filePicker.getTextField().getText() ); - } - }); - } - return filePicker ; - } - -} +} \ No newline at end of file From 9f5186b08497fea20abb59a606e1d056ef57cdee Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:13 +0100 Subject: [PATCH 0265/1620] New translations FileTypeFilter.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 335 ++---------------- 1 file changed, 25 insertions(+), 310 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index d275a15df8..139e1bb847 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,324 +1,39 @@ package org.openforis.collect.earth.app.view; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Frame; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; import java.io.File; -import java.io.IOException; -import java.util.List; -import javax.swing.DefaultComboBoxModel; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JDialog; -import javax.swing.JFileChooser; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; +import javax.swing.filechooser.FileFilter; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.collect.earth.sampler.utils.ProduceCsvFiles; -import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult; -import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult.ErrorType; -import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; -import org.openforis.collect.manager.validation.SurveyValidator.ValidationParameters; -import org.openforis.collect.model.CollectSurvey; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ +public class FileTypeFilter extends FileFilter { -public class FileDividerToolDlg extends JDialog{ + private String extension; + private String description; - private static final long serialVersionUID = 2241706750062961024L; - private static final int MAX_FILES = 500; - private CollectSurvey survey; - private transient Logger logger = LoggerFactory.getLogger( FileDividerToolDlg.class); - private JComboBox numberOfFiles ; - private JCheckBox randomSelector; - private JComboBox csvColumns; - private JFilePicker outputFolder; - private JButton generateGrids; - private JFilePicker filePicker; - - public static void open( Frame owner, CollectSurvey survey){ - FileDividerToolDlg dlg = new FileDividerToolDlg(owner, survey); - dlg.setVisible(true); - } - - public FileDividerToolDlg( Frame owner,CollectSurvey survey ) { - super(owner); - this.survey = survey; - this.setModal(true); - this.setSize( new Dimension(700, 350)); - this.setLocationRelativeTo( owner ); - this.setTitle("Tool for dividing large CSV into smaller ones"); - initLayout(); - } - - private void initLayout() { - final JPanel panel = new JPanel(new GridBagLayout()); - GridBagConstraints c = new GridBagConstraints(); - - int row = 0; - - c.fill = GridBagConstraints.BOTH; - c.gridx = 0; - c.gridwidth = 2; - c.gridy = row++; - - panel.add( getCsvFilePicker(), c ); - c.gridwidth = 1; - c.gridy = row++; - - c.gridx = 0; - - panel.add( new JLabel("Number of files to split the CSV into"), c ); - - c.gridx = 1; - panel.add( getNumberOfFilesSelector(), c ); - - c.gridx = 0; - c.gridy = row++; - c.gridwidth = 2; - panel.add( getRandomSelector(), c ); - - c.gridy = row++; - c.gridx = 0; - c.gridwidth = 1; - panel.add( new JLabel("Split files by strata (values of the column i.e : region )"), c ); - - c.gridx = 1; - panel.add( getColumnSelector(), c ); - - c.gridx = 0; - c.gridy = row++; - c.gridwidth = 2; - panel.add( getOutputFolder(), c ); - - c.gridx = 0; - c.gridy = row; - - panel.add( getGenerateButton(), c ); - - this.add(panel); - } - - private JButton getGenerateButton() { - if( generateGrids == null ){ - generateGrids = new JButton("Divide file"); - generateGrids.setEnabled( false ); - generateGrids.addActionListener( e -> { - String sourceCsvFile = getCsvFilePicker().getSelectedFilePath(); - String destinationFolder = getOutputFolder().getSelectedFilePath(); - boolean randomizeLines = getRandomSelector().isSelected(); - Integer randomizeUsingColumnValues = null; - if( ( (CsvColumn) getColumnSelector().getSelectedItem() )!=null ){ - randomizeUsingColumnValues = ( (CsvColumn) getColumnSelector().getSelectedItem() ).getPos(); - } - Integer filesToDivideInto = getNumberOfFilesSelector().getSelectedIndex()+1; - ProduceCsvFiles produceCsvFiles = new ProduceCsvFiles(survey, sourceCsvFile, destinationFolder, randomizeLines, randomizeUsingColumnValues, filesToDivideInto); - File dest = produceCsvFiles.divideIntoFiles(); - - try { - CollectEarthUtils.openFolderInExplorer( dest.getAbsolutePath() ); - } catch (IOException e1) { - logger.error(" Error opening the destination folder", e); - } - }); - } - return generateGrids; - } - - private JFilePicker getOutputFolder() { - if( outputFolder == null ){ - outputFolder = new JFilePicker("Select the output folder" , null, "Select...", DlgMode.MODE_SAVE); - outputFolder.getFileChooser().setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); - outputFolder.setEnabled(false); - - outputFolder.addChangeListener( new DocumentListener() { - - @Override - public void removeUpdate(DocumentEvent e) { - // No need to do anything - } - - @Override - public void insertUpdate(DocumentEvent e) { - String outputFolderPath = outputFolder.getSelectedFilePath(); - File out = new File( outputFolderPath ); - getGenerateButton().setEnabled(out.exists() ); - } - - @Override - public void changedUpdate(DocumentEvent e) { - // No need to react to the update - } - }); - } - return outputFolder; - } - - - private void enableOtherControls(boolean validFile) { - getRandomSelector().setEnabled( true ); - getColumnSelector().setEnabled(validFile); - getNumberOfFilesSelector().setEnabled(true); - getOutputFolder().setEnabled(true); - setColumns( validFile ); - } - - - private void setColumns( boolean validFile){ - if( validFile ){ - CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); - - List expectedHeaders = cegtg.getExpectedHeaders(survey); - CsvColumn[] columns = new CsvColumn[ expectedHeaders.size()+1 ]; - CsvColumn column = new CsvColumn(null,"DO NOT STRATIFY"); - columns[0] = column; - - int i = 0; - for (String header : expectedHeaders) { - column = new CsvColumn(i++,"Use :" + header); - columns[i] = column; - } - - getColumnSelector().setModel( new DefaultComboBoxModel( columns )); - }else{ - getColumnSelector().setModel( new DefaultComboBoxModel()); - } + public FileTypeFilter(String extension, String description) { + this.extension = extension; + this.description = description; } - - private JComboBox getColumnSelector() { - if( csvColumns == null ){ - csvColumns = new JComboBox<>(); - csvColumns.setEnabled(false); + @Override + public boolean accept(File file) { + if (file.isDirectory()) { + return true; } - return csvColumns; - } - - private JCheckBox getRandomSelector() { - if( randomSelector == null ){ - randomSelector = new JCheckBox("Randomize the order of the lines from the source CSV file" , false); - randomSelector.setEnabled( false); + boolean accepted = false; + String[] extensions = extension.split(","); //$NON-NLS-1$ + for (String item : extensions) { + accepted = accepted || file.getName().toLowerCase().endsWith(item); } - return randomSelector; + return accepted; + } - private JComboBox getNumberOfFilesSelector() { - if( numberOfFiles == null ){ - Integer[] items = new Integer[MAX_FILES]; - for (int i =1; i<= MAX_FILES; i++) { - items[i-1] = Integer.valueOf(i); - } - numberOfFiles = new JComboBox<>(items); - numberOfFiles.setEnabled( false ); - } - return numberOfFiles; + @Override + public String getDescription() { + return description + String.format(" (*%s)", extension); //$NON-NLS-1$ } - - private JFilePicker getCsvFilePicker() { - if( filePicker == null ){ - filePicker = new JFilePicker("Choose the CSV file with the sampling design (plots)", null, "Explore", DlgMode.MODE_OPEN); - - filePicker.getFileChooser().setAcceptAllFileFilterUsed(false); - filePicker.addFileTypeFilter("csv", " CSV file with plot (sampling design)", true); - - filePicker.addChangeListener( new DocumentListener() { - - @Override - public void removeUpdate(DocumentEvent e) { - // No need to validate - } - - @Override - public void insertUpdate(DocumentEvent e) { - validateCsv( filePicker.getTextField().getText() ); - } - - private boolean validateCsv(String filePath) { - boolean validFile = true; - try { - - filePicker.setTextBackground( Color.white); - - if( CsvReaderUtils.isCsvFile( filePath )){ - CollectEarthGridTemplateGenerator cetg = new CollectEarthGridTemplateGenerator(); - - File csvFile = new File( filePath ); - ValidationParameters validationParameters = new ValidationParameters(); - validationParameters.setValidateOnlyFirstLines(false); - CSVFileValidationResult validationResults = cetg.validate(csvFile, survey, validationParameters ); - - validFile = validationResults.isSuccessful(); - if( - !validFile - // If the message is that there are too many rows then we ignore the validation! - && ( - validationResults.getErrorType().equals( ErrorType.INVALID_NUMBER_OF_PLOTS_TOO_LARGE) - || - validationResults.getErrorType().equals( ErrorType.INVALID_NUMBER_OF_PLOTS_WARNING) - ) - ){ - validFile = true; - - } - - if( !validFile ){ - filePicker.setTextBackground( Color.yellow); - switch ( validationResults.getErrorType() ) { - case INVALID_FILE_TYPE: - filePicker.setTextBackground( Color.red); - JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), "The expected file type is CSV or CED ", "Expected File Type", JOptionPane.ERROR_MESSAGE); - break; - - case INVALID_HEADERS: - JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), String.format("The expected columns in the CSV for the survey %s are %s", survey.getName(), validationResults.getExpectedHeaders() ) , "Columns in CSV do not match survey", JOptionPane.ERROR_MESSAGE); - break; - - case INVALID_NUMBER_OF_COLUMNS: - JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), String.format("The number of columns in the CSV file do not coincide with the expercted columns expected for the survey %s /n%s", survey.getName(), validationResults.getExpectedHeaders() ), "Expected File Type", JOptionPane.ERROR_MESSAGE); - break; - - case INVALID_VALUES_IN_CSV: - // IN THIS CASE THE CELL RENDERER TAKES CARE OF HIGHLIGHTING THE CELLS!!! - JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), "The content of the CSV file is not correct!! The values on some cells are incorrect for the survey " + survey.getName() , "CSV content is not correct", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - break; - - default: - break; - } - } - - enableOtherControls( validFile ); - - }else{ - - JOptionPane.showMessageDialog(FileDividerToolDlg.this, String.format("The file in %s is NOT A CSV file ", filePath) ); - filePicker.setTextBackground( Color.red); - } - } catch (Exception e) { - JOptionPane.showMessageDialog(FileDividerToolDlg.this, String.format("The file in %s is NOT A CSV file ", filePath) ); - logger.error( "Error while validating the CSV file", e); - validFile = false; - } - return validFile; - } - - @Override - public void changedUpdate(DocumentEvent e) { - validateCsv( filePicker.getTextField().getText() ); - } - }); - } - return filePicker ; - } - -} +} \ No newline at end of file From a7169425586f6c77a6ac053ad86b01e2f51258de Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:14 +0100 Subject: [PATCH 0266/1620] New translations FileTypeFilter.java (English) --- .../earth/app/view/Messages_en.properties | 335 ++---------------- 1 file changed, 25 insertions(+), 310 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index d275a15df8..139e1bb847 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,324 +1,39 @@ package org.openforis.collect.earth.app.view; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Frame; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; import java.io.File; -import java.io.IOException; -import java.util.List; -import javax.swing.DefaultComboBoxModel; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JDialog; -import javax.swing.JFileChooser; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; +import javax.swing.filechooser.FileFilter; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.collect.earth.sampler.utils.ProduceCsvFiles; -import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult; -import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult.ErrorType; -import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; -import org.openforis.collect.manager.validation.SurveyValidator.ValidationParameters; -import org.openforis.collect.model.CollectSurvey; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ +public class FileTypeFilter extends FileFilter { -public class FileDividerToolDlg extends JDialog{ + private String extension; + private String description; - private static final long serialVersionUID = 2241706750062961024L; - private static final int MAX_FILES = 500; - private CollectSurvey survey; - private transient Logger logger = LoggerFactory.getLogger( FileDividerToolDlg.class); - private JComboBox numberOfFiles ; - private JCheckBox randomSelector; - private JComboBox csvColumns; - private JFilePicker outputFolder; - private JButton generateGrids; - private JFilePicker filePicker; - - public static void open( Frame owner, CollectSurvey survey){ - FileDividerToolDlg dlg = new FileDividerToolDlg(owner, survey); - dlg.setVisible(true); - } - - public FileDividerToolDlg( Frame owner,CollectSurvey survey ) { - super(owner); - this.survey = survey; - this.setModal(true); - this.setSize( new Dimension(700, 350)); - this.setLocationRelativeTo( owner ); - this.setTitle("Tool for dividing large CSV into smaller ones"); - initLayout(); - } - - private void initLayout() { - final JPanel panel = new JPanel(new GridBagLayout()); - GridBagConstraints c = new GridBagConstraints(); - - int row = 0; - - c.fill = GridBagConstraints.BOTH; - c.gridx = 0; - c.gridwidth = 2; - c.gridy = row++; - - panel.add( getCsvFilePicker(), c ); - c.gridwidth = 1; - c.gridy = row++; - - c.gridx = 0; - - panel.add( new JLabel("Number of files to split the CSV into"), c ); - - c.gridx = 1; - panel.add( getNumberOfFilesSelector(), c ); - - c.gridx = 0; - c.gridy = row++; - c.gridwidth = 2; - panel.add( getRandomSelector(), c ); - - c.gridy = row++; - c.gridx = 0; - c.gridwidth = 1; - panel.add( new JLabel("Split files by strata (values of the column i.e : region )"), c ); - - c.gridx = 1; - panel.add( getColumnSelector(), c ); - - c.gridx = 0; - c.gridy = row++; - c.gridwidth = 2; - panel.add( getOutputFolder(), c ); - - c.gridx = 0; - c.gridy = row; - - panel.add( getGenerateButton(), c ); - - this.add(panel); - } - - private JButton getGenerateButton() { - if( generateGrids == null ){ - generateGrids = new JButton("Divide file"); - generateGrids.setEnabled( false ); - generateGrids.addActionListener( e -> { - String sourceCsvFile = getCsvFilePicker().getSelectedFilePath(); - String destinationFolder = getOutputFolder().getSelectedFilePath(); - boolean randomizeLines = getRandomSelector().isSelected(); - Integer randomizeUsingColumnValues = null; - if( ( (CsvColumn) getColumnSelector().getSelectedItem() )!=null ){ - randomizeUsingColumnValues = ( (CsvColumn) getColumnSelector().getSelectedItem() ).getPos(); - } - Integer filesToDivideInto = getNumberOfFilesSelector().getSelectedIndex()+1; - ProduceCsvFiles produceCsvFiles = new ProduceCsvFiles(survey, sourceCsvFile, destinationFolder, randomizeLines, randomizeUsingColumnValues, filesToDivideInto); - File dest = produceCsvFiles.divideIntoFiles(); - - try { - CollectEarthUtils.openFolderInExplorer( dest.getAbsolutePath() ); - } catch (IOException e1) { - logger.error(" Error opening the destination folder", e); - } - }); - } - return generateGrids; - } - - private JFilePicker getOutputFolder() { - if( outputFolder == null ){ - outputFolder = new JFilePicker("Select the output folder" , null, "Select...", DlgMode.MODE_SAVE); - outputFolder.getFileChooser().setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); - outputFolder.setEnabled(false); - - outputFolder.addChangeListener( new DocumentListener() { - - @Override - public void removeUpdate(DocumentEvent e) { - // No need to do anything - } - - @Override - public void insertUpdate(DocumentEvent e) { - String outputFolderPath = outputFolder.getSelectedFilePath(); - File out = new File( outputFolderPath ); - getGenerateButton().setEnabled(out.exists() ); - } - - @Override - public void changedUpdate(DocumentEvent e) { - // No need to react to the update - } - }); - } - return outputFolder; - } - - - private void enableOtherControls(boolean validFile) { - getRandomSelector().setEnabled( true ); - getColumnSelector().setEnabled(validFile); - getNumberOfFilesSelector().setEnabled(true); - getOutputFolder().setEnabled(true); - setColumns( validFile ); - } - - - private void setColumns( boolean validFile){ - if( validFile ){ - CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); - - List expectedHeaders = cegtg.getExpectedHeaders(survey); - CsvColumn[] columns = new CsvColumn[ expectedHeaders.size()+1 ]; - CsvColumn column = new CsvColumn(null,"DO NOT STRATIFY"); - columns[0] = column; - - int i = 0; - for (String header : expectedHeaders) { - column = new CsvColumn(i++,"Use :" + header); - columns[i] = column; - } - - getColumnSelector().setModel( new DefaultComboBoxModel( columns )); - }else{ - getColumnSelector().setModel( new DefaultComboBoxModel()); - } + public FileTypeFilter(String extension, String description) { + this.extension = extension; + this.description = description; } - - private JComboBox getColumnSelector() { - if( csvColumns == null ){ - csvColumns = new JComboBox<>(); - csvColumns.setEnabled(false); + @Override + public boolean accept(File file) { + if (file.isDirectory()) { + return true; } - return csvColumns; - } - - private JCheckBox getRandomSelector() { - if( randomSelector == null ){ - randomSelector = new JCheckBox("Randomize the order of the lines from the source CSV file" , false); - randomSelector.setEnabled( false); + boolean accepted = false; + String[] extensions = extension.split(","); //$NON-NLS-1$ + for (String item : extensions) { + accepted = accepted || file.getName().toLowerCase().endsWith(item); } - return randomSelector; + return accepted; + } - private JComboBox getNumberOfFilesSelector() { - if( numberOfFiles == null ){ - Integer[] items = new Integer[MAX_FILES]; - for (int i =1; i<= MAX_FILES; i++) { - items[i-1] = Integer.valueOf(i); - } - numberOfFiles = new JComboBox<>(items); - numberOfFiles.setEnabled( false ); - } - return numberOfFiles; + @Override + public String getDescription() { + return description + String.format(" (*%s)", extension); //$NON-NLS-1$ } - - private JFilePicker getCsvFilePicker() { - if( filePicker == null ){ - filePicker = new JFilePicker("Choose the CSV file with the sampling design (plots)", null, "Explore", DlgMode.MODE_OPEN); - - filePicker.getFileChooser().setAcceptAllFileFilterUsed(false); - filePicker.addFileTypeFilter("csv", " CSV file with plot (sampling design)", true); - - filePicker.addChangeListener( new DocumentListener() { - - @Override - public void removeUpdate(DocumentEvent e) { - // No need to validate - } - - @Override - public void insertUpdate(DocumentEvent e) { - validateCsv( filePicker.getTextField().getText() ); - } - - private boolean validateCsv(String filePath) { - boolean validFile = true; - try { - - filePicker.setTextBackground( Color.white); - - if( CsvReaderUtils.isCsvFile( filePath )){ - CollectEarthGridTemplateGenerator cetg = new CollectEarthGridTemplateGenerator(); - - File csvFile = new File( filePath ); - ValidationParameters validationParameters = new ValidationParameters(); - validationParameters.setValidateOnlyFirstLines(false); - CSVFileValidationResult validationResults = cetg.validate(csvFile, survey, validationParameters ); - - validFile = validationResults.isSuccessful(); - if( - !validFile - // If the message is that there are too many rows then we ignore the validation! - && ( - validationResults.getErrorType().equals( ErrorType.INVALID_NUMBER_OF_PLOTS_TOO_LARGE) - || - validationResults.getErrorType().equals( ErrorType.INVALID_NUMBER_OF_PLOTS_WARNING) - ) - ){ - validFile = true; - - } - - if( !validFile ){ - filePicker.setTextBackground( Color.yellow); - switch ( validationResults.getErrorType() ) { - case INVALID_FILE_TYPE: - filePicker.setTextBackground( Color.red); - JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), "The expected file type is CSV or CED ", "Expected File Type", JOptionPane.ERROR_MESSAGE); - break; - - case INVALID_HEADERS: - JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), String.format("The expected columns in the CSV for the survey %s are %s", survey.getName(), validationResults.getExpectedHeaders() ) , "Columns in CSV do not match survey", JOptionPane.ERROR_MESSAGE); - break; - - case INVALID_NUMBER_OF_COLUMNS: - JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), String.format("The number of columns in the CSV file do not coincide with the expercted columns expected for the survey %s /n%s", survey.getName(), validationResults.getExpectedHeaders() ), "Expected File Type", JOptionPane.ERROR_MESSAGE); - break; - - case INVALID_VALUES_IN_CSV: - // IN THIS CASE THE CELL RENDERER TAKES CARE OF HIGHLIGHTING THE CELLS!!! - JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), "The content of the CSV file is not correct!! The values on some cells are incorrect for the survey " + survey.getName() , "CSV content is not correct", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - break; - - default: - break; - } - } - - enableOtherControls( validFile ); - - }else{ - - JOptionPane.showMessageDialog(FileDividerToolDlg.this, String.format("The file in %s is NOT A CSV file ", filePath) ); - filePicker.setTextBackground( Color.red); - } - } catch (Exception e) { - JOptionPane.showMessageDialog(FileDividerToolDlg.this, String.format("The file in %s is NOT A CSV file ", filePath) ); - logger.error( "Error while validating the CSV file", e); - validFile = false; - } - return validFile; - } - - @Override - public void changedUpdate(DocumentEvent e) { - validateCsv( filePicker.getTextField().getText() ); - } - }); - } - return filePicker ; - } - -} +} \ No newline at end of file From 92729828461a727b34a8b90f43e7e7e956395515 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:15 +0100 Subject: [PATCH 0267/1620] New translations GenerateDatabaseStarter.java (French) --- .../earth/app/view/Messages_fr.properties | 103 +++++++++++++----- 1 file changed, 78 insertions(+), 25 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 139e1bb847..b0801c277f 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,39 +1,92 @@ package org.openforis.collect.earth.app.view; -import java.io.File; +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; -import javax.swing.filechooser.FileFilter; +import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.GenerateDatabase; +import org.openforis.collect.earth.ipcc.RdbExportException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ -public class FileTypeFilter extends FileFilter { +final class GenerateDatabaseStarter { + + private Logger logger = LoggerFactory.getLogger( GenerateDatabaseStarter.class); + private JFrame frame; + private GenerateDatabase generateDatabase; + private boolean shouldRefreshDb; + private boolean starting = false; + private InfiniteProgressMonitor progressMonitor; - private String extension; - private String description; + public boolean isShouldRefreshDb() { + return shouldRefreshDb; + } + + public void setShouldRefreshDb(boolean shouldRefreshDb) { + this.shouldRefreshDb = shouldRefreshDb; + } + + GenerateDatabaseStarter( final GenerateDatabase saikuService, final JFrame frame) { + super(); + this.generateDatabase = saikuService; + this.frame = frame; + } + + public boolean shouldShowRdbGenerationOption(ExportType exportType){ + return generateDatabase.isRdbAlreadyGenerated( exportType ); + } - public FileTypeFilter(String extension, String description) { - this.extension = extension; - this.description = description; + public boolean isStarting() { + return starting; + } + + private void generateDatabase(boolean startSaikuAfterDBExport) { + setStarting( true ); + generateDatabase.setRefreshDatabase( shouldRefreshDb ); + try { + generateDatabase.prepareDataForAnalysis(progressMonitor, startSaikuAfterDBExport); + }catch ( RdbExportException e1) { + JOptionPane.showMessageDialog( frame , "" + Messages.getString("CollectEarthWindow.29") + "
" +Messages.getString("CollectEarthWindow.40") + "
" + e1.getMessage() + "", Messages.getString("CollectEarthWindow.47"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ + logger.warn("The saiku server is not configured", e1); //$NON-NLS-1$ + } catch ( RuntimeException e) { + logger.error("Error starting Saiku", e); //$NON-NLS-1$ + } catch ( Exception e) { + logger.error("Error starting Saiku", e); //$NON-NLS-1$ + } finally{ + setStarting( false ); + if( progressMonitor != null ){ + progressMonitor.close(); + } + } } + + public void initializeAndOpen(boolean startSaikuAfterDBExport) { + progressMonitor = new InfiniteProgressMonitor( frame, Messages.getString("GenerateDatabaseStarter.1"), Messages.getString("GenerateDatabaseStarter.2")); //$NON-NLS-1$ //$NON-NLS-2$ + + if( SwingUtilities.isEventDispatchThread() ) { + Thread threadGeneratingDB = new Thread("Initialize RDB"){ //$NON-NLS-1$ + @Override + public void run() { + generateDatabase(startSaikuAfterDBExport); + } - @Override - public boolean accept(File file) { - if (file.isDirectory()) { - return true; + }; + threadGeneratingDB.start(); + progressMonitor.showLater(); + }else { + progressMonitor.showLater(); + generateDatabase(startSaikuAfterDBExport); } - boolean accepted = false; - String[] extensions = extension.split(","); //$NON-NLS-1$ - for (String item : extensions) { - accepted = accepted || file.getName().toLowerCase().endsWith(item); + + + if( progressMonitor.isUserCancelled() ){ + generateDatabase.setUserCancelledOperation(true); } - return accepted; - } - @Override - public String getDescription() { - return description + String.format(" (*%s)", extension); //$NON-NLS-1$ + public void setStarting(boolean starting) { + this.starting = starting; } + } \ No newline at end of file From 985c2cb2690912b249980c4441c20b3dba30b3f2 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:16 +0100 Subject: [PATCH 0268/1620] New translations GenerateDatabaseStarter.java (Spanish) --- .../earth/app/view/Messages_es.properties | 103 +++++++++++++----- 1 file changed, 78 insertions(+), 25 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 139e1bb847..b0801c277f 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,39 +1,92 @@ package org.openforis.collect.earth.app.view; -import java.io.File; +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; -import javax.swing.filechooser.FileFilter; +import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.GenerateDatabase; +import org.openforis.collect.earth.ipcc.RdbExportException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ -public class FileTypeFilter extends FileFilter { +final class GenerateDatabaseStarter { + + private Logger logger = LoggerFactory.getLogger( GenerateDatabaseStarter.class); + private JFrame frame; + private GenerateDatabase generateDatabase; + private boolean shouldRefreshDb; + private boolean starting = false; + private InfiniteProgressMonitor progressMonitor; - private String extension; - private String description; + public boolean isShouldRefreshDb() { + return shouldRefreshDb; + } + + public void setShouldRefreshDb(boolean shouldRefreshDb) { + this.shouldRefreshDb = shouldRefreshDb; + } + + GenerateDatabaseStarter( final GenerateDatabase saikuService, final JFrame frame) { + super(); + this.generateDatabase = saikuService; + this.frame = frame; + } + + public boolean shouldShowRdbGenerationOption(ExportType exportType){ + return generateDatabase.isRdbAlreadyGenerated( exportType ); + } - public FileTypeFilter(String extension, String description) { - this.extension = extension; - this.description = description; + public boolean isStarting() { + return starting; + } + + private void generateDatabase(boolean startSaikuAfterDBExport) { + setStarting( true ); + generateDatabase.setRefreshDatabase( shouldRefreshDb ); + try { + generateDatabase.prepareDataForAnalysis(progressMonitor, startSaikuAfterDBExport); + }catch ( RdbExportException e1) { + JOptionPane.showMessageDialog( frame , "" + Messages.getString("CollectEarthWindow.29") + "
" +Messages.getString("CollectEarthWindow.40") + "
" + e1.getMessage() + "", Messages.getString("CollectEarthWindow.47"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ + logger.warn("The saiku server is not configured", e1); //$NON-NLS-1$ + } catch ( RuntimeException e) { + logger.error("Error starting Saiku", e); //$NON-NLS-1$ + } catch ( Exception e) { + logger.error("Error starting Saiku", e); //$NON-NLS-1$ + } finally{ + setStarting( false ); + if( progressMonitor != null ){ + progressMonitor.close(); + } + } } + + public void initializeAndOpen(boolean startSaikuAfterDBExport) { + progressMonitor = new InfiniteProgressMonitor( frame, Messages.getString("GenerateDatabaseStarter.1"), Messages.getString("GenerateDatabaseStarter.2")); //$NON-NLS-1$ //$NON-NLS-2$ + + if( SwingUtilities.isEventDispatchThread() ) { + Thread threadGeneratingDB = new Thread("Initialize RDB"){ //$NON-NLS-1$ + @Override + public void run() { + generateDatabase(startSaikuAfterDBExport); + } - @Override - public boolean accept(File file) { - if (file.isDirectory()) { - return true; + }; + threadGeneratingDB.start(); + progressMonitor.showLater(); + }else { + progressMonitor.showLater(); + generateDatabase(startSaikuAfterDBExport); } - boolean accepted = false; - String[] extensions = extension.split(","); //$NON-NLS-1$ - for (String item : extensions) { - accepted = accepted || file.getName().toLowerCase().endsWith(item); + + + if( progressMonitor.isUserCancelled() ){ + generateDatabase.setUserCancelledOperation(true); } - return accepted; - } - @Override - public String getDescription() { - return description + String.format(" (*%s)", extension); //$NON-NLS-1$ + public void setStarting(boolean starting) { + this.starting = starting; } + } \ No newline at end of file From 6db527a797bfc2a0d3fa707c3aa0b4b701946b23 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:17 +0100 Subject: [PATCH 0269/1620] New translations GenerateDatabaseStarter.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 103 +++++++++++++----- 1 file changed, 78 insertions(+), 25 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 139e1bb847..b0801c277f 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,39 +1,92 @@ package org.openforis.collect.earth.app.view; -import java.io.File; +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; -import javax.swing.filechooser.FileFilter; +import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.GenerateDatabase; +import org.openforis.collect.earth.ipcc.RdbExportException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ -public class FileTypeFilter extends FileFilter { +final class GenerateDatabaseStarter { + + private Logger logger = LoggerFactory.getLogger( GenerateDatabaseStarter.class); + private JFrame frame; + private GenerateDatabase generateDatabase; + private boolean shouldRefreshDb; + private boolean starting = false; + private InfiniteProgressMonitor progressMonitor; - private String extension; - private String description; + public boolean isShouldRefreshDb() { + return shouldRefreshDb; + } + + public void setShouldRefreshDb(boolean shouldRefreshDb) { + this.shouldRefreshDb = shouldRefreshDb; + } + + GenerateDatabaseStarter( final GenerateDatabase saikuService, final JFrame frame) { + super(); + this.generateDatabase = saikuService; + this.frame = frame; + } + + public boolean shouldShowRdbGenerationOption(ExportType exportType){ + return generateDatabase.isRdbAlreadyGenerated( exportType ); + } - public FileTypeFilter(String extension, String description) { - this.extension = extension; - this.description = description; + public boolean isStarting() { + return starting; + } + + private void generateDatabase(boolean startSaikuAfterDBExport) { + setStarting( true ); + generateDatabase.setRefreshDatabase( shouldRefreshDb ); + try { + generateDatabase.prepareDataForAnalysis(progressMonitor, startSaikuAfterDBExport); + }catch ( RdbExportException e1) { + JOptionPane.showMessageDialog( frame , "" + Messages.getString("CollectEarthWindow.29") + "
" +Messages.getString("CollectEarthWindow.40") + "
" + e1.getMessage() + "", Messages.getString("CollectEarthWindow.47"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ + logger.warn("The saiku server is not configured", e1); //$NON-NLS-1$ + } catch ( RuntimeException e) { + logger.error("Error starting Saiku", e); //$NON-NLS-1$ + } catch ( Exception e) { + logger.error("Error starting Saiku", e); //$NON-NLS-1$ + } finally{ + setStarting( false ); + if( progressMonitor != null ){ + progressMonitor.close(); + } + } } + + public void initializeAndOpen(boolean startSaikuAfterDBExport) { + progressMonitor = new InfiniteProgressMonitor( frame, Messages.getString("GenerateDatabaseStarter.1"), Messages.getString("GenerateDatabaseStarter.2")); //$NON-NLS-1$ //$NON-NLS-2$ + + if( SwingUtilities.isEventDispatchThread() ) { + Thread threadGeneratingDB = new Thread("Initialize RDB"){ //$NON-NLS-1$ + @Override + public void run() { + generateDatabase(startSaikuAfterDBExport); + } - @Override - public boolean accept(File file) { - if (file.isDirectory()) { - return true; + }; + threadGeneratingDB.start(); + progressMonitor.showLater(); + }else { + progressMonitor.showLater(); + generateDatabase(startSaikuAfterDBExport); } - boolean accepted = false; - String[] extensions = extension.split(","); //$NON-NLS-1$ - for (String item : extensions) { - accepted = accepted || file.getName().toLowerCase().endsWith(item); + + + if( progressMonitor.isUserCancelled() ){ + generateDatabase.setUserCancelledOperation(true); } - return accepted; - } - @Override - public String getDescription() { - return description + String.format(" (*%s)", extension); //$NON-NLS-1$ + public void setStarting(boolean starting) { + this.starting = starting; } + } \ No newline at end of file From 483a260230c24834a9a1da053a4375188d98fd93 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:18 +0100 Subject: [PATCH 0270/1620] New translations GenerateRDBAnalysisListener.java (French) --- .../earth/app/view/Messages_fr.properties | 106 +++++++----------- 1 file changed, 38 insertions(+), 68 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index b0801c277f..0f68388dc7 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,92 +1,62 @@ package org.openforis.collect.earth.app.view; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.SwingUtilities; import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.GenerateDatabase; -import org.openforis.collect.earth.ipcc.RdbExportException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -final class GenerateDatabaseStarter { - - private Logger logger = LoggerFactory.getLogger( GenerateDatabaseStarter.class); +public class GenerateRDBAnalysisListener implements ActionListener { + private Logger logger = LoggerFactory.getLogger( GenerateRDBAnalysisListener.class); private JFrame frame; - private GenerateDatabase generateDatabase; - private boolean shouldRefreshDb; - private boolean starting = false; - private InfiniteProgressMonitor progressMonitor; - - public boolean isShouldRefreshDb() { - return shouldRefreshDb; - } - - public void setShouldRefreshDb(boolean shouldRefreshDb) { - this.shouldRefreshDb = shouldRefreshDb; - } + private GenerateDatabaseStarter saikuStarter; - GenerateDatabaseStarter( final GenerateDatabase saikuService, final JFrame frame) { - super(); - this.generateDatabase = saikuService; + public GenerateRDBAnalysisListener(JFrame frame, GenerateDatabaseStarter saikuStarter) { this.frame = frame; - } - - public boolean shouldShowRdbGenerationOption(ExportType exportType){ - return generateDatabase.isRdbAlreadyGenerated( exportType ); + this.saikuStarter = saikuStarter; } - public boolean isStarting() { - return starting; - } - - private void generateDatabase(boolean startSaikuAfterDBExport) { - setStarting( true ); - generateDatabase.setRefreshDatabase( shouldRefreshDb ); + @Override + public void actionPerformed(ActionEvent e) { try { - generateDatabase.prepareDataForAnalysis(progressMonitor, startSaikuAfterDBExport); - }catch ( RdbExportException e1) { - JOptionPane.showMessageDialog( frame , "" + Messages.getString("CollectEarthWindow.29") + "
" +Messages.getString("CollectEarthWindow.40") + "
" + e1.getMessage() + "", Messages.getString("CollectEarthWindow.47"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ - logger.warn("The saiku server is not configured", e1); //$NON-NLS-1$ - } catch ( RuntimeException e) { - logger.error("Error starting Saiku", e); //$NON-NLS-1$ - } catch ( Exception e) { - logger.error("Error starting Saiku", e); //$NON-NLS-1$ + CollectEarthWindow.startWaiting(frame); + exportDataToRDB(); + }catch (Exception e1) { + logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ } finally{ - setStarting( false ); - if( progressMonitor != null ){ - progressMonitor.close(); - } + CollectEarthWindow.endWaiting(frame); } } - - public void initializeAndOpen(boolean startSaikuAfterDBExport) { - progressMonitor = new InfiniteProgressMonitor( frame, Messages.getString("GenerateDatabaseStarter.1"), Messages.getString("GenerateDatabaseStarter.2")); //$NON-NLS-1$ //$NON-NLS-2$ - - if( SwingUtilities.isEventDispatchThread() ) { - Thread threadGeneratingDB = new Thread("Initialize RDB"){ //$NON-NLS-1$ - @Override - public void run() { - generateDatabase(startSaikuAfterDBExport); - } - }; - threadGeneratingDB.start(); - progressMonitor.showLater(); - }else { - progressMonitor.showLater(); - generateDatabase(startSaikuAfterDBExport); - } + private void exportDataToRDB() { + if( saikuStarter.isStarting() ){ + JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.57"), Messages.getString("CollectEarthWindow.58"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ + }else{ + + int shouldRefreshDb = JOptionPane.YES_OPTION; + + if( saikuStarter.shouldShowRdbGenerationOption( ExportType.IPCC ) ){ + + String refresh = Messages.getString("SaikuAnalysisListener.0"); //$NON-NLS-1$ + String close = Messages.getString("SaikuAnalysisListener.1"); //$NON-NLS-1$ + String[] options = new String[]{ refresh,close}; - - if( progressMonitor.isUserCancelled() ){ - generateDatabase.setUserCancelledOperation(true); - } - } - public void setStarting(boolean starting) { - this.starting = starting; + shouldRefreshDb = JOptionPane.showOptionDialog( + frame, Messages.getString("CollectEarthWindow.59"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.60"), //$NON-NLS-1$ + JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); + } + + if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ + saikuStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); + saikuStarter.initializeAndOpen( true ); + } + } } } \ No newline at end of file From 6e5cf9465c46ba9e55fb5c251b9fcfaa9dfe4456 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:19 +0100 Subject: [PATCH 0271/1620] New translations GenerateDatabaseStarter.java (English) --- .../earth/app/view/Messages_en.properties | 103 +++++++++++++----- 1 file changed, 78 insertions(+), 25 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 139e1bb847..b0801c277f 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,39 +1,92 @@ package org.openforis.collect.earth.app.view; -import java.io.File; +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; -import javax.swing.filechooser.FileFilter; +import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.GenerateDatabase; +import org.openforis.collect.earth.ipcc.RdbExportException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ -public class FileTypeFilter extends FileFilter { +final class GenerateDatabaseStarter { + + private Logger logger = LoggerFactory.getLogger( GenerateDatabaseStarter.class); + private JFrame frame; + private GenerateDatabase generateDatabase; + private boolean shouldRefreshDb; + private boolean starting = false; + private InfiniteProgressMonitor progressMonitor; - private String extension; - private String description; + public boolean isShouldRefreshDb() { + return shouldRefreshDb; + } + + public void setShouldRefreshDb(boolean shouldRefreshDb) { + this.shouldRefreshDb = shouldRefreshDb; + } + + GenerateDatabaseStarter( final GenerateDatabase saikuService, final JFrame frame) { + super(); + this.generateDatabase = saikuService; + this.frame = frame; + } + + public boolean shouldShowRdbGenerationOption(ExportType exportType){ + return generateDatabase.isRdbAlreadyGenerated( exportType ); + } - public FileTypeFilter(String extension, String description) { - this.extension = extension; - this.description = description; + public boolean isStarting() { + return starting; + } + + private void generateDatabase(boolean startSaikuAfterDBExport) { + setStarting( true ); + generateDatabase.setRefreshDatabase( shouldRefreshDb ); + try { + generateDatabase.prepareDataForAnalysis(progressMonitor, startSaikuAfterDBExport); + }catch ( RdbExportException e1) { + JOptionPane.showMessageDialog( frame , "" + Messages.getString("CollectEarthWindow.29") + "
" +Messages.getString("CollectEarthWindow.40") + "
" + e1.getMessage() + "", Messages.getString("CollectEarthWindow.47"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ + logger.warn("The saiku server is not configured", e1); //$NON-NLS-1$ + } catch ( RuntimeException e) { + logger.error("Error starting Saiku", e); //$NON-NLS-1$ + } catch ( Exception e) { + logger.error("Error starting Saiku", e); //$NON-NLS-1$ + } finally{ + setStarting( false ); + if( progressMonitor != null ){ + progressMonitor.close(); + } + } } + + public void initializeAndOpen(boolean startSaikuAfterDBExport) { + progressMonitor = new InfiniteProgressMonitor( frame, Messages.getString("GenerateDatabaseStarter.1"), Messages.getString("GenerateDatabaseStarter.2")); //$NON-NLS-1$ //$NON-NLS-2$ + + if( SwingUtilities.isEventDispatchThread() ) { + Thread threadGeneratingDB = new Thread("Initialize RDB"){ //$NON-NLS-1$ + @Override + public void run() { + generateDatabase(startSaikuAfterDBExport); + } - @Override - public boolean accept(File file) { - if (file.isDirectory()) { - return true; + }; + threadGeneratingDB.start(); + progressMonitor.showLater(); + }else { + progressMonitor.showLater(); + generateDatabase(startSaikuAfterDBExport); } - boolean accepted = false; - String[] extensions = extension.split(","); //$NON-NLS-1$ - for (String item : extensions) { - accepted = accepted || file.getName().toLowerCase().endsWith(item); + + + if( progressMonitor.isUserCancelled() ){ + generateDatabase.setUserCancelledOperation(true); } - return accepted; - } - @Override - public String getDescription() { - return description + String.format(" (*%s)", extension); //$NON-NLS-1$ + public void setStarting(boolean starting) { + this.starting = starting; } + } \ No newline at end of file From c534f684c5d09d5c5a272ba47e068452eb808590 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:20 +0100 Subject: [PATCH 0272/1620] New translations GenerateRDBAnalysisListener.java (Spanish) --- .../earth/app/view/Messages_es.properties | 106 +++++++----------- 1 file changed, 38 insertions(+), 68 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index b0801c277f..0f68388dc7 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,92 +1,62 @@ package org.openforis.collect.earth.app.view; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.SwingUtilities; import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.GenerateDatabase; -import org.openforis.collect.earth.ipcc.RdbExportException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -final class GenerateDatabaseStarter { - - private Logger logger = LoggerFactory.getLogger( GenerateDatabaseStarter.class); +public class GenerateRDBAnalysisListener implements ActionListener { + private Logger logger = LoggerFactory.getLogger( GenerateRDBAnalysisListener.class); private JFrame frame; - private GenerateDatabase generateDatabase; - private boolean shouldRefreshDb; - private boolean starting = false; - private InfiniteProgressMonitor progressMonitor; - - public boolean isShouldRefreshDb() { - return shouldRefreshDb; - } - - public void setShouldRefreshDb(boolean shouldRefreshDb) { - this.shouldRefreshDb = shouldRefreshDb; - } + private GenerateDatabaseStarter saikuStarter; - GenerateDatabaseStarter( final GenerateDatabase saikuService, final JFrame frame) { - super(); - this.generateDatabase = saikuService; + public GenerateRDBAnalysisListener(JFrame frame, GenerateDatabaseStarter saikuStarter) { this.frame = frame; - } - - public boolean shouldShowRdbGenerationOption(ExportType exportType){ - return generateDatabase.isRdbAlreadyGenerated( exportType ); + this.saikuStarter = saikuStarter; } - public boolean isStarting() { - return starting; - } - - private void generateDatabase(boolean startSaikuAfterDBExport) { - setStarting( true ); - generateDatabase.setRefreshDatabase( shouldRefreshDb ); + @Override + public void actionPerformed(ActionEvent e) { try { - generateDatabase.prepareDataForAnalysis(progressMonitor, startSaikuAfterDBExport); - }catch ( RdbExportException e1) { - JOptionPane.showMessageDialog( frame , "" + Messages.getString("CollectEarthWindow.29") + "
" +Messages.getString("CollectEarthWindow.40") + "
" + e1.getMessage() + "", Messages.getString("CollectEarthWindow.47"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ - logger.warn("The saiku server is not configured", e1); //$NON-NLS-1$ - } catch ( RuntimeException e) { - logger.error("Error starting Saiku", e); //$NON-NLS-1$ - } catch ( Exception e) { - logger.error("Error starting Saiku", e); //$NON-NLS-1$ + CollectEarthWindow.startWaiting(frame); + exportDataToRDB(); + }catch (Exception e1) { + logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ } finally{ - setStarting( false ); - if( progressMonitor != null ){ - progressMonitor.close(); - } + CollectEarthWindow.endWaiting(frame); } } - - public void initializeAndOpen(boolean startSaikuAfterDBExport) { - progressMonitor = new InfiniteProgressMonitor( frame, Messages.getString("GenerateDatabaseStarter.1"), Messages.getString("GenerateDatabaseStarter.2")); //$NON-NLS-1$ //$NON-NLS-2$ - - if( SwingUtilities.isEventDispatchThread() ) { - Thread threadGeneratingDB = new Thread("Initialize RDB"){ //$NON-NLS-1$ - @Override - public void run() { - generateDatabase(startSaikuAfterDBExport); - } - }; - threadGeneratingDB.start(); - progressMonitor.showLater(); - }else { - progressMonitor.showLater(); - generateDatabase(startSaikuAfterDBExport); - } + private void exportDataToRDB() { + if( saikuStarter.isStarting() ){ + JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.57"), Messages.getString("CollectEarthWindow.58"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ + }else{ + + int shouldRefreshDb = JOptionPane.YES_OPTION; + + if( saikuStarter.shouldShowRdbGenerationOption( ExportType.IPCC ) ){ + + String refresh = Messages.getString("SaikuAnalysisListener.0"); //$NON-NLS-1$ + String close = Messages.getString("SaikuAnalysisListener.1"); //$NON-NLS-1$ + String[] options = new String[]{ refresh,close}; - - if( progressMonitor.isUserCancelled() ){ - generateDatabase.setUserCancelledOperation(true); - } - } - public void setStarting(boolean starting) { - this.starting = starting; + shouldRefreshDb = JOptionPane.showOptionDialog( + frame, Messages.getString("CollectEarthWindow.59"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.60"), //$NON-NLS-1$ + JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); + } + + if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ + saikuStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); + saikuStarter.initializeAndOpen( true ); + } + } } } \ No newline at end of file From 762e83e908040ba34b69184ac2ee007383e1e2f6 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:21 +0100 Subject: [PATCH 0273/1620] New translations GenerateRDBAnalysisListener.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 106 +++++++----------- 1 file changed, 38 insertions(+), 68 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index b0801c277f..0f68388dc7 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,92 +1,62 @@ package org.openforis.collect.earth.app.view; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.SwingUtilities; import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.GenerateDatabase; -import org.openforis.collect.earth.ipcc.RdbExportException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -final class GenerateDatabaseStarter { - - private Logger logger = LoggerFactory.getLogger( GenerateDatabaseStarter.class); +public class GenerateRDBAnalysisListener implements ActionListener { + private Logger logger = LoggerFactory.getLogger( GenerateRDBAnalysisListener.class); private JFrame frame; - private GenerateDatabase generateDatabase; - private boolean shouldRefreshDb; - private boolean starting = false; - private InfiniteProgressMonitor progressMonitor; - - public boolean isShouldRefreshDb() { - return shouldRefreshDb; - } - - public void setShouldRefreshDb(boolean shouldRefreshDb) { - this.shouldRefreshDb = shouldRefreshDb; - } + private GenerateDatabaseStarter saikuStarter; - GenerateDatabaseStarter( final GenerateDatabase saikuService, final JFrame frame) { - super(); - this.generateDatabase = saikuService; + public GenerateRDBAnalysisListener(JFrame frame, GenerateDatabaseStarter saikuStarter) { this.frame = frame; - } - - public boolean shouldShowRdbGenerationOption(ExportType exportType){ - return generateDatabase.isRdbAlreadyGenerated( exportType ); + this.saikuStarter = saikuStarter; } - public boolean isStarting() { - return starting; - } - - private void generateDatabase(boolean startSaikuAfterDBExport) { - setStarting( true ); - generateDatabase.setRefreshDatabase( shouldRefreshDb ); + @Override + public void actionPerformed(ActionEvent e) { try { - generateDatabase.prepareDataForAnalysis(progressMonitor, startSaikuAfterDBExport); - }catch ( RdbExportException e1) { - JOptionPane.showMessageDialog( frame , "" + Messages.getString("CollectEarthWindow.29") + "
" +Messages.getString("CollectEarthWindow.40") + "
" + e1.getMessage() + "", Messages.getString("CollectEarthWindow.47"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ - logger.warn("The saiku server is not configured", e1); //$NON-NLS-1$ - } catch ( RuntimeException e) { - logger.error("Error starting Saiku", e); //$NON-NLS-1$ - } catch ( Exception e) { - logger.error("Error starting Saiku", e); //$NON-NLS-1$ + CollectEarthWindow.startWaiting(frame); + exportDataToRDB(); + }catch (Exception e1) { + logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ } finally{ - setStarting( false ); - if( progressMonitor != null ){ - progressMonitor.close(); - } + CollectEarthWindow.endWaiting(frame); } } - - public void initializeAndOpen(boolean startSaikuAfterDBExport) { - progressMonitor = new InfiniteProgressMonitor( frame, Messages.getString("GenerateDatabaseStarter.1"), Messages.getString("GenerateDatabaseStarter.2")); //$NON-NLS-1$ //$NON-NLS-2$ - - if( SwingUtilities.isEventDispatchThread() ) { - Thread threadGeneratingDB = new Thread("Initialize RDB"){ //$NON-NLS-1$ - @Override - public void run() { - generateDatabase(startSaikuAfterDBExport); - } - }; - threadGeneratingDB.start(); - progressMonitor.showLater(); - }else { - progressMonitor.showLater(); - generateDatabase(startSaikuAfterDBExport); - } + private void exportDataToRDB() { + if( saikuStarter.isStarting() ){ + JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.57"), Messages.getString("CollectEarthWindow.58"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ + }else{ + + int shouldRefreshDb = JOptionPane.YES_OPTION; + + if( saikuStarter.shouldShowRdbGenerationOption( ExportType.IPCC ) ){ + + String refresh = Messages.getString("SaikuAnalysisListener.0"); //$NON-NLS-1$ + String close = Messages.getString("SaikuAnalysisListener.1"); //$NON-NLS-1$ + String[] options = new String[]{ refresh,close}; - - if( progressMonitor.isUserCancelled() ){ - generateDatabase.setUserCancelledOperation(true); - } - } - public void setStarting(boolean starting) { - this.starting = starting; + shouldRefreshDb = JOptionPane.showOptionDialog( + frame, Messages.getString("CollectEarthWindow.59"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.60"), //$NON-NLS-1$ + JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); + } + + if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ + saikuStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); + saikuStarter.initializeAndOpen( true ); + } + } } } \ No newline at end of file From 5e6226ea99f0490966f37b15bdc506c1526c73ab Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:22 +0100 Subject: [PATCH 0274/1620] New translations GenerateRDBAnalysisListener.java (English) --- .../earth/app/view/Messages_en.properties | 106 +++++++----------- 1 file changed, 38 insertions(+), 68 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index b0801c277f..0f68388dc7 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,92 +1,62 @@ package org.openforis.collect.earth.app.view; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.SwingUtilities; import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.GenerateDatabase; -import org.openforis.collect.earth.ipcc.RdbExportException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -final class GenerateDatabaseStarter { - - private Logger logger = LoggerFactory.getLogger( GenerateDatabaseStarter.class); +public class GenerateRDBAnalysisListener implements ActionListener { + private Logger logger = LoggerFactory.getLogger( GenerateRDBAnalysisListener.class); private JFrame frame; - private GenerateDatabase generateDatabase; - private boolean shouldRefreshDb; - private boolean starting = false; - private InfiniteProgressMonitor progressMonitor; - - public boolean isShouldRefreshDb() { - return shouldRefreshDb; - } - - public void setShouldRefreshDb(boolean shouldRefreshDb) { - this.shouldRefreshDb = shouldRefreshDb; - } + private GenerateDatabaseStarter saikuStarter; - GenerateDatabaseStarter( final GenerateDatabase saikuService, final JFrame frame) { - super(); - this.generateDatabase = saikuService; + public GenerateRDBAnalysisListener(JFrame frame, GenerateDatabaseStarter saikuStarter) { this.frame = frame; - } - - public boolean shouldShowRdbGenerationOption(ExportType exportType){ - return generateDatabase.isRdbAlreadyGenerated( exportType ); + this.saikuStarter = saikuStarter; } - public boolean isStarting() { - return starting; - } - - private void generateDatabase(boolean startSaikuAfterDBExport) { - setStarting( true ); - generateDatabase.setRefreshDatabase( shouldRefreshDb ); + @Override + public void actionPerformed(ActionEvent e) { try { - generateDatabase.prepareDataForAnalysis(progressMonitor, startSaikuAfterDBExport); - }catch ( RdbExportException e1) { - JOptionPane.showMessageDialog( frame , "" + Messages.getString("CollectEarthWindow.29") + "
" +Messages.getString("CollectEarthWindow.40") + "
" + e1.getMessage() + "", Messages.getString("CollectEarthWindow.47"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ - logger.warn("The saiku server is not configured", e1); //$NON-NLS-1$ - } catch ( RuntimeException e) { - logger.error("Error starting Saiku", e); //$NON-NLS-1$ - } catch ( Exception e) { - logger.error("Error starting Saiku", e); //$NON-NLS-1$ + CollectEarthWindow.startWaiting(frame); + exportDataToRDB(); + }catch (Exception e1) { + logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ } finally{ - setStarting( false ); - if( progressMonitor != null ){ - progressMonitor.close(); - } + CollectEarthWindow.endWaiting(frame); } } - - public void initializeAndOpen(boolean startSaikuAfterDBExport) { - progressMonitor = new InfiniteProgressMonitor( frame, Messages.getString("GenerateDatabaseStarter.1"), Messages.getString("GenerateDatabaseStarter.2")); //$NON-NLS-1$ //$NON-NLS-2$ - - if( SwingUtilities.isEventDispatchThread() ) { - Thread threadGeneratingDB = new Thread("Initialize RDB"){ //$NON-NLS-1$ - @Override - public void run() { - generateDatabase(startSaikuAfterDBExport); - } - }; - threadGeneratingDB.start(); - progressMonitor.showLater(); - }else { - progressMonitor.showLater(); - generateDatabase(startSaikuAfterDBExport); - } + private void exportDataToRDB() { + if( saikuStarter.isStarting() ){ + JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.57"), Messages.getString("CollectEarthWindow.58"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ + }else{ + + int shouldRefreshDb = JOptionPane.YES_OPTION; + + if( saikuStarter.shouldShowRdbGenerationOption( ExportType.IPCC ) ){ + + String refresh = Messages.getString("SaikuAnalysisListener.0"); //$NON-NLS-1$ + String close = Messages.getString("SaikuAnalysisListener.1"); //$NON-NLS-1$ + String[] options = new String[]{ refresh,close}; - - if( progressMonitor.isUserCancelled() ){ - generateDatabase.setUserCancelledOperation(true); - } - } - public void setStarting(boolean starting) { - this.starting = starting; + shouldRefreshDb = JOptionPane.showOptionDialog( + frame, Messages.getString("CollectEarthWindow.59"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.60"), //$NON-NLS-1$ + JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); + } + + if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ + saikuStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); + saikuStarter.initializeAndOpen( true ); + } + } } } \ No newline at end of file From 850b4094ed7ee65dbd9ed66135dcc92931bf4133 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:23 +0100 Subject: [PATCH 0275/1620] New translations IPCCGeneratorListener.java (French) --- .../earth/app/view/Messages_fr.properties | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 0f68388dc7..7c0a5857ae 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -10,21 +10,22 @@ import org.openforis.collect.earth.app.service.ExportType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class GenerateRDBAnalysisListener implements ActionListener { - private Logger logger = LoggerFactory.getLogger( GenerateRDBAnalysisListener.class); +public class IPCCGeneratorListener implements ActionListener { + private Logger logger = LoggerFactory.getLogger( IPCCGeneratorListener.class); private JFrame frame; - private GenerateDatabaseStarter saikuStarter; + private GenerateDatabaseStarter ipccExporterStarter; - public GenerateRDBAnalysisListener(JFrame frame, GenerateDatabaseStarter saikuStarter) { + public IPCCGeneratorListener(JFrame frame, GenerateDatabaseStarter ipccExporterStarter) { this.frame = frame; - this.saikuStarter = saikuStarter; + this.ipccExporterStarter = ipccExporterStarter; } + @Override public void actionPerformed(ActionEvent e) { try { CollectEarthWindow.startWaiting(frame); - exportDataToRDB(); + generateIpccData(); }catch (Exception e1) { logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ } finally{ @@ -32,29 +33,29 @@ public class GenerateRDBAnalysisListener implements ActionListener { } } - private void exportDataToRDB() { - if( saikuStarter.isStarting() ){ - JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.57"), Messages.getString("CollectEarthWindow.58"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ + private void generateIpccData() { + if( ipccExporterStarter.isStarting() ){ + JOptionPane.showMessageDialog(frame, Messages.getString("IPCCGeneratorListener.1"), Messages.getString("IPCCGeneratorListener.2"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ }else{ int shouldRefreshDb = JOptionPane.YES_OPTION; - if( saikuStarter.shouldShowRdbGenerationOption( ExportType.IPCC ) ){ + if( ipccExporterStarter.shouldShowRdbGenerationOption(ExportType.IPCC) ){ - String refresh = Messages.getString("SaikuAnalysisListener.0"); //$NON-NLS-1$ - String close = Messages.getString("SaikuAnalysisListener.1"); //$NON-NLS-1$ + String refresh = Messages.getString("IPCCGeneratorListener.3"); //$NON-NLS-1$ + String close = Messages.getString("IPCCGeneratorListener.4"); //$NON-NLS-1$ String[] options = new String[]{ refresh,close}; shouldRefreshDb = JOptionPane.showOptionDialog( - frame, Messages.getString("CollectEarthWindow.59"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.60"), //$NON-NLS-1$ + frame, Messages.getString("IPCCGeneratorListener.6"), //$NON-NLS-1$ + Messages.getString("IPCCGeneratorListener.5"), //$NON-NLS-1$ JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); } if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ - saikuStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); - saikuStarter.initializeAndOpen( true ); + ipccExporterStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); + ipccExporterStarter.initializeAndOpen( true ); } } } From 8527d386521815c8c5b06f2bcbf2dde6a405b75b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:24 +0100 Subject: [PATCH 0276/1620] New translations IPCCGeneratorListener.java (Spanish) --- .../earth/app/view/Messages_es.properties | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 0f68388dc7..7c0a5857ae 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -10,21 +10,22 @@ import org.openforis.collect.earth.app.service.ExportType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class GenerateRDBAnalysisListener implements ActionListener { - private Logger logger = LoggerFactory.getLogger( GenerateRDBAnalysisListener.class); +public class IPCCGeneratorListener implements ActionListener { + private Logger logger = LoggerFactory.getLogger( IPCCGeneratorListener.class); private JFrame frame; - private GenerateDatabaseStarter saikuStarter; + private GenerateDatabaseStarter ipccExporterStarter; - public GenerateRDBAnalysisListener(JFrame frame, GenerateDatabaseStarter saikuStarter) { + public IPCCGeneratorListener(JFrame frame, GenerateDatabaseStarter ipccExporterStarter) { this.frame = frame; - this.saikuStarter = saikuStarter; + this.ipccExporterStarter = ipccExporterStarter; } + @Override public void actionPerformed(ActionEvent e) { try { CollectEarthWindow.startWaiting(frame); - exportDataToRDB(); + generateIpccData(); }catch (Exception e1) { logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ } finally{ @@ -32,29 +33,29 @@ public class GenerateRDBAnalysisListener implements ActionListener { } } - private void exportDataToRDB() { - if( saikuStarter.isStarting() ){ - JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.57"), Messages.getString("CollectEarthWindow.58"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ + private void generateIpccData() { + if( ipccExporterStarter.isStarting() ){ + JOptionPane.showMessageDialog(frame, Messages.getString("IPCCGeneratorListener.1"), Messages.getString("IPCCGeneratorListener.2"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ }else{ int shouldRefreshDb = JOptionPane.YES_OPTION; - if( saikuStarter.shouldShowRdbGenerationOption( ExportType.IPCC ) ){ + if( ipccExporterStarter.shouldShowRdbGenerationOption(ExportType.IPCC) ){ - String refresh = Messages.getString("SaikuAnalysisListener.0"); //$NON-NLS-1$ - String close = Messages.getString("SaikuAnalysisListener.1"); //$NON-NLS-1$ + String refresh = Messages.getString("IPCCGeneratorListener.3"); //$NON-NLS-1$ + String close = Messages.getString("IPCCGeneratorListener.4"); //$NON-NLS-1$ String[] options = new String[]{ refresh,close}; shouldRefreshDb = JOptionPane.showOptionDialog( - frame, Messages.getString("CollectEarthWindow.59"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.60"), //$NON-NLS-1$ + frame, Messages.getString("IPCCGeneratorListener.6"), //$NON-NLS-1$ + Messages.getString("IPCCGeneratorListener.5"), //$NON-NLS-1$ JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); } if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ - saikuStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); - saikuStarter.initializeAndOpen( true ); + ipccExporterStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); + ipccExporterStarter.initializeAndOpen( true ); } } } From 78344bbc6127ceeedac69b1f1c6acf2875cb709c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:25 +0100 Subject: [PATCH 0277/1620] New translations IPCCGeneratorListener.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 0f68388dc7..7c0a5857ae 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -10,21 +10,22 @@ import org.openforis.collect.earth.app.service.ExportType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class GenerateRDBAnalysisListener implements ActionListener { - private Logger logger = LoggerFactory.getLogger( GenerateRDBAnalysisListener.class); +public class IPCCGeneratorListener implements ActionListener { + private Logger logger = LoggerFactory.getLogger( IPCCGeneratorListener.class); private JFrame frame; - private GenerateDatabaseStarter saikuStarter; + private GenerateDatabaseStarter ipccExporterStarter; - public GenerateRDBAnalysisListener(JFrame frame, GenerateDatabaseStarter saikuStarter) { + public IPCCGeneratorListener(JFrame frame, GenerateDatabaseStarter ipccExporterStarter) { this.frame = frame; - this.saikuStarter = saikuStarter; + this.ipccExporterStarter = ipccExporterStarter; } + @Override public void actionPerformed(ActionEvent e) { try { CollectEarthWindow.startWaiting(frame); - exportDataToRDB(); + generateIpccData(); }catch (Exception e1) { logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ } finally{ @@ -32,29 +33,29 @@ public class GenerateRDBAnalysisListener implements ActionListener { } } - private void exportDataToRDB() { - if( saikuStarter.isStarting() ){ - JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.57"), Messages.getString("CollectEarthWindow.58"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ + private void generateIpccData() { + if( ipccExporterStarter.isStarting() ){ + JOptionPane.showMessageDialog(frame, Messages.getString("IPCCGeneratorListener.1"), Messages.getString("IPCCGeneratorListener.2"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ }else{ int shouldRefreshDb = JOptionPane.YES_OPTION; - if( saikuStarter.shouldShowRdbGenerationOption( ExportType.IPCC ) ){ + if( ipccExporterStarter.shouldShowRdbGenerationOption(ExportType.IPCC) ){ - String refresh = Messages.getString("SaikuAnalysisListener.0"); //$NON-NLS-1$ - String close = Messages.getString("SaikuAnalysisListener.1"); //$NON-NLS-1$ + String refresh = Messages.getString("IPCCGeneratorListener.3"); //$NON-NLS-1$ + String close = Messages.getString("IPCCGeneratorListener.4"); //$NON-NLS-1$ String[] options = new String[]{ refresh,close}; shouldRefreshDb = JOptionPane.showOptionDialog( - frame, Messages.getString("CollectEarthWindow.59"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.60"), //$NON-NLS-1$ + frame, Messages.getString("IPCCGeneratorListener.6"), //$NON-NLS-1$ + Messages.getString("IPCCGeneratorListener.5"), //$NON-NLS-1$ JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); } if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ - saikuStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); - saikuStarter.initializeAndOpen( true ); + ipccExporterStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); + ipccExporterStarter.initializeAndOpen( true ); } } } From c525a292803b4f58e01460b27a2afc10af730d5c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:26 +0100 Subject: [PATCH 0278/1620] New translations IPCCGeneratorListener.java (English) --- .../earth/app/view/Messages_en.properties | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 0f68388dc7..7c0a5857ae 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -10,21 +10,22 @@ import org.openforis.collect.earth.app.service.ExportType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class GenerateRDBAnalysisListener implements ActionListener { - private Logger logger = LoggerFactory.getLogger( GenerateRDBAnalysisListener.class); +public class IPCCGeneratorListener implements ActionListener { + private Logger logger = LoggerFactory.getLogger( IPCCGeneratorListener.class); private JFrame frame; - private GenerateDatabaseStarter saikuStarter; + private GenerateDatabaseStarter ipccExporterStarter; - public GenerateRDBAnalysisListener(JFrame frame, GenerateDatabaseStarter saikuStarter) { + public IPCCGeneratorListener(JFrame frame, GenerateDatabaseStarter ipccExporterStarter) { this.frame = frame; - this.saikuStarter = saikuStarter; + this.ipccExporterStarter = ipccExporterStarter; } + @Override public void actionPerformed(ActionEvent e) { try { CollectEarthWindow.startWaiting(frame); - exportDataToRDB(); + generateIpccData(); }catch (Exception e1) { logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ } finally{ @@ -32,29 +33,29 @@ public class GenerateRDBAnalysisListener implements ActionListener { } } - private void exportDataToRDB() { - if( saikuStarter.isStarting() ){ - JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.57"), Messages.getString("CollectEarthWindow.58"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ + private void generateIpccData() { + if( ipccExporterStarter.isStarting() ){ + JOptionPane.showMessageDialog(frame, Messages.getString("IPCCGeneratorListener.1"), Messages.getString("IPCCGeneratorListener.2"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ }else{ int shouldRefreshDb = JOptionPane.YES_OPTION; - if( saikuStarter.shouldShowRdbGenerationOption( ExportType.IPCC ) ){ + if( ipccExporterStarter.shouldShowRdbGenerationOption(ExportType.IPCC) ){ - String refresh = Messages.getString("SaikuAnalysisListener.0"); //$NON-NLS-1$ - String close = Messages.getString("SaikuAnalysisListener.1"); //$NON-NLS-1$ + String refresh = Messages.getString("IPCCGeneratorListener.3"); //$NON-NLS-1$ + String close = Messages.getString("IPCCGeneratorListener.4"); //$NON-NLS-1$ String[] options = new String[]{ refresh,close}; shouldRefreshDb = JOptionPane.showOptionDialog( - frame, Messages.getString("CollectEarthWindow.59"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.60"), //$NON-NLS-1$ + frame, Messages.getString("IPCCGeneratorListener.6"), //$NON-NLS-1$ + Messages.getString("IPCCGeneratorListener.5"), //$NON-NLS-1$ JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); } if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ - saikuStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); - saikuStarter.initializeAndOpen( true ); + ipccExporterStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); + ipccExporterStarter.initializeAndOpen( true ); } } } From 72897e239d6fc9d8ddbb478cb92c2f4f92837055 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:27 +0100 Subject: [PATCH 0279/1620] New translations ImportActionListener.java (French) --- .../earth/app/view/Messages_fr.properties | 205 +++++++++++++++--- 1 file changed, 175 insertions(+), 30 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 7c0a5857ae..88aa8edf1c 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -2,62 +2,207 @@ package org.openforis.collect.earth.app.view; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Arrays; import javax.swing.JFrame; import javax.swing.JOptionPane; -import org.openforis.collect.earth.app.service.ExportType; +import org.apache.commons.io.IOUtils; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.DataImportExportService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.io.data.CSVDataImportProcess; +import org.openforis.collect.io.data.XMLDataImportProcess; +import org.openforis.collect.manager.process.ProcessStatus; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class IPCCGeneratorListener implements ActionListener { - private Logger logger = LoggerFactory.getLogger( IPCCGeneratorListener.class); +public final class ImportActionListener implements ActionListener { + protected static final Integer YES = 0; + protected static final Integer YES_TO_ALL = 1; + protected static final Integer NO = 2; + protected static final Integer NO_TO_ALL = 3; + + private final DataFormat importFormat; private JFrame frame; - private GenerateDatabaseStarter ipccExporterStarter; + private LocalPropertiesService localPropertiesService; + private DataImportExportService dataImportService; + private Logger logger = LoggerFactory.getLogger( ImportActionListener.class ); - public IPCCGeneratorListener(JFrame frame, GenerateDatabaseStarter ipccExporterStarter) { + public ImportActionListener(DataFormat importFormat, JFrame frame, LocalPropertiesService localPropertiesService, DataImportExportService dataImportService) { + this.importFormat = importFormat; this.frame = frame; - this.ipccExporterStarter = ipccExporterStarter; + this.localPropertiesService = localPropertiesService; + this.dataImportService = dataImportService; } - @Override public void actionPerformed(ActionEvent e) { - try { + try{ CollectEarthWindow.startWaiting(frame); - generateIpccData(); - }catch (Exception e1) { - logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ - } finally{ - CollectEarthWindow.endWaiting(frame); + importDataFrom(e, importFormat ); + }finally{ + CollectEarthWindow.endWaiting( frame); } + } + + private void forceRefreshGoogleEarth() { + + EarthApp.executeKmlLoadAsynchronously( null ); + + } + private Integer shouldImportNonFinishedRecords( boolean moreThanOneFiles ) { + String message = "" //$NON-NLS-1$ + + Messages.getString("ImportActionListener.0") //$NON-NLS-1$ + +"
" //$NON-NLS-1$ + + Messages.getString("ImportActionListener.2") //$NON-NLS-1$ + + ""; + + if( !moreThanOneFiles ){ - private void generateIpccData() { - if( ipccExporterStarter.isStarting() ){ - JOptionPane.showMessageDialog(frame, Messages.getString("IPCCGeneratorListener.1"), Messages.getString("IPCCGeneratorListener.2"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ + final int selectedOption = JOptionPane.showConfirmDialog(null, + message //$NON-NLS-1$ + ,Messages.getString("ImportActionListener.3"), //$NON-NLS-1$ + JOptionPane.YES_NO_OPTION); + + if (selectedOption == JOptionPane.YES_OPTION){ + return YES; + }else if (selectedOption == JOptionPane.NO_OPTION){ + return NO; + }else{ + return JOptionPane.CLOSED_OPTION; + } }else{ - int shouldRefreshDb = JOptionPane.YES_OPTION; + String[] buttons = { Messages.getString("YES"), Messages.getString("YES_TO_ALL"), Messages.getString("NO"), Messages.getString("NO_TO_ALL") }; + + return JOptionPane.showOptionDialog(null, message, Messages.getString("ImportActionListener.3") , + JOptionPane.WARNING_MESSAGE, 0, null, buttons, buttons[1]); + + } + } - if( ipccExporterStarter.shouldShowRdbGenerationOption(ExportType.IPCC) ){ + private void importDataFrom(final ActionEvent e, final DataFormat importType) { + File[] filesToImport = JFileChooserExistsAware.getFileChooserResults( importType, false, true, null, localPropertiesService, frame ); + final ImportXMLDialogProcessMonitor importDialogProcessMonitor = new ImportXMLDialogProcessMonitor(); + if (filesToImport != null) { - String refresh = Messages.getString("IPCCGeneratorListener.3"); //$NON-NLS-1$ - String close = Messages.getString("IPCCGeneratorListener.4"); //$NON-NLS-1$ - String[] options = new String[]{ refresh,close}; + switch (importType) { + case ZIP_WITH_XML: + new Thread("XML Import Thread " ){ //$NON-NLS-1$ + @Override + public void run() { + Integer importNonFinishedPlots = shouldImportNonFinishedRecords( filesToImport.length > 1); + boolean firstFile = true; - shouldRefreshDb = JOptionPane.showOptionDialog( - frame, Messages.getString("IPCCGeneratorListener.6"), //$NON-NLS-1$ - Messages.getString("IPCCGeneratorListener.5"), //$NON-NLS-1$ - JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); - } + for (final File importedFile : filesToImport) { + XMLDataImportProcess dataImportProcess = null; + try{ + if ( firstFile ){ + firstFile = false; + }else if ( !firstFile && (importNonFinishedPlots.equals( YES ) || importNonFinishedPlots.equals( NO ) ) ){ + importNonFinishedPlots = shouldImportNonFinishedRecords( filesToImport.length > 1); + } + + if( importNonFinishedPlots.equals( JOptionPane.CLOSED_OPTION ) ){ + break; + } - if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ - ipccExporterStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); - ipccExporterStarter.initializeAndOpen( true ); + boolean importNotFinished= importNonFinishedPlots.equals( YES ) || importNonFinishedPlots.equals( YES_TO_ALL ); + + dataImportProcess = dataImportService.getImportSummary(importedFile, importNotFinished); + importDialogProcessMonitor.startImport(dataImportProcess, frame, dataImportService, importedFile ); + + } catch (Exception e1) { + logger.error("Error importing data" , e1); //$NON-NLS-1$ + importDialogProcessMonitor.closeProgressmonitor(); + JOptionPane.showMessageDialog( frame, importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.3"), importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.7"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + JOptionPane.ERROR_MESSAGE); + logger.error("Error importing data from " + importedFile.getAbsolutePath() + " in format " + importType.name() , e1); //$NON-NLS-1$ //$NON-NLS-2$ + } finally { + IOUtils.closeQuietly(dataImportProcess); + } + } + forceRefreshGoogleEarth(); + } + }.start(); + break; + case CSV: + new Thread("Update using CSV Thread " ){ //$NON-NLS-1$ + @Override + public void run() { + + String[] ids = dataImportService.getEarthSurveyService().getKeyNamesForSurvey(); + String keyAttributesForSurvey = Arrays.toString( ids ); + + JOptionPane.showMessageDialog( + frame, + "The CSV files used must have columns with at least the headers for the key attributes " + keyAttributesForSurvey+ " followed by one or more attribute names ( see http://www.openforis.org/support/questions/80/changing-plot-attributes-in-the-collect-earth-database ) ", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + "CSV file format info", + JOptionPane.INFORMATION_MESSAGE); + + + for (final File importedFile : filesToImport) { + + CSVDataImportProcess importSurveyAsCsv = null; + try { + importSurveyAsCsv = dataImportService.getCsvImporterProcess(importedFile); + + if( importSurveyAsCsv != null ){ + importSurveyAsCsv.init(); + ProcessStatus status = importSurveyAsCsv.getStatus(); + status.setTotal( getTotalNumberOfLines( importedFile ) ); + if ( status != null && ! importSurveyAsCsv.getStatus().isError() ) { + ImportProcessMonitorDialog importProcessWorker = new ImportProcessMonitorDialog(importSurveyAsCsv, frame ); + importProcessWorker.start(); + } + } + } catch (Exception e1) { + JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.7") + "\n" + e1.getMessage(), importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.3"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + JOptionPane.ERROR_MESSAGE); + logger.error("Error importing data from " + importedFile.getAbsolutePath() + " in format " + importType , e1); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + } + }.start(); + break; + case FUSION: + break; + default: + break; } } } -} \ No newline at end of file + private long getTotalNumberOfLines(File importedFile) { + long count = 0; + BufferedReader br = null; + try { + br = new BufferedReader(new InputStreamReader(new FileInputStream(importedFile))); + + while ( br.readLine() != null) { + count++; + } + } catch (IOException e) { + logger.error("Error counting the number of lines in file " + importedFile.getAbsolutePath() , e) ; //$NON-NLS-1$ + }finally { + if( br!=null) { + try { + br.close(); + } catch (IOException e) { + logger.error("Error closing file reader " + importedFile.getAbsolutePath() , e) ; + } + } + + + } + return count; + } +} From 2521e0d6f25872a5c5e1bb429faa7da27fcdbecc Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:28 +0100 Subject: [PATCH 0280/1620] New translations ImportActionListener.java (Spanish) --- .../earth/app/view/Messages_es.properties | 205 +++++++++++++++--- 1 file changed, 175 insertions(+), 30 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 7c0a5857ae..88aa8edf1c 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -2,62 +2,207 @@ package org.openforis.collect.earth.app.view; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Arrays; import javax.swing.JFrame; import javax.swing.JOptionPane; -import org.openforis.collect.earth.app.service.ExportType; +import org.apache.commons.io.IOUtils; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.DataImportExportService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.io.data.CSVDataImportProcess; +import org.openforis.collect.io.data.XMLDataImportProcess; +import org.openforis.collect.manager.process.ProcessStatus; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class IPCCGeneratorListener implements ActionListener { - private Logger logger = LoggerFactory.getLogger( IPCCGeneratorListener.class); +public final class ImportActionListener implements ActionListener { + protected static final Integer YES = 0; + protected static final Integer YES_TO_ALL = 1; + protected static final Integer NO = 2; + protected static final Integer NO_TO_ALL = 3; + + private final DataFormat importFormat; private JFrame frame; - private GenerateDatabaseStarter ipccExporterStarter; + private LocalPropertiesService localPropertiesService; + private DataImportExportService dataImportService; + private Logger logger = LoggerFactory.getLogger( ImportActionListener.class ); - public IPCCGeneratorListener(JFrame frame, GenerateDatabaseStarter ipccExporterStarter) { + public ImportActionListener(DataFormat importFormat, JFrame frame, LocalPropertiesService localPropertiesService, DataImportExportService dataImportService) { + this.importFormat = importFormat; this.frame = frame; - this.ipccExporterStarter = ipccExporterStarter; + this.localPropertiesService = localPropertiesService; + this.dataImportService = dataImportService; } - @Override public void actionPerformed(ActionEvent e) { - try { + try{ CollectEarthWindow.startWaiting(frame); - generateIpccData(); - }catch (Exception e1) { - logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ - } finally{ - CollectEarthWindow.endWaiting(frame); + importDataFrom(e, importFormat ); + }finally{ + CollectEarthWindow.endWaiting( frame); } + } + + private void forceRefreshGoogleEarth() { + + EarthApp.executeKmlLoadAsynchronously( null ); + + } + private Integer shouldImportNonFinishedRecords( boolean moreThanOneFiles ) { + String message = "" //$NON-NLS-1$ + + Messages.getString("ImportActionListener.0") //$NON-NLS-1$ + +"
" //$NON-NLS-1$ + + Messages.getString("ImportActionListener.2") //$NON-NLS-1$ + + ""; + + if( !moreThanOneFiles ){ - private void generateIpccData() { - if( ipccExporterStarter.isStarting() ){ - JOptionPane.showMessageDialog(frame, Messages.getString("IPCCGeneratorListener.1"), Messages.getString("IPCCGeneratorListener.2"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ + final int selectedOption = JOptionPane.showConfirmDialog(null, + message //$NON-NLS-1$ + ,Messages.getString("ImportActionListener.3"), //$NON-NLS-1$ + JOptionPane.YES_NO_OPTION); + + if (selectedOption == JOptionPane.YES_OPTION){ + return YES; + }else if (selectedOption == JOptionPane.NO_OPTION){ + return NO; + }else{ + return JOptionPane.CLOSED_OPTION; + } }else{ - int shouldRefreshDb = JOptionPane.YES_OPTION; + String[] buttons = { Messages.getString("YES"), Messages.getString("YES_TO_ALL"), Messages.getString("NO"), Messages.getString("NO_TO_ALL") }; + + return JOptionPane.showOptionDialog(null, message, Messages.getString("ImportActionListener.3") , + JOptionPane.WARNING_MESSAGE, 0, null, buttons, buttons[1]); + + } + } - if( ipccExporterStarter.shouldShowRdbGenerationOption(ExportType.IPCC) ){ + private void importDataFrom(final ActionEvent e, final DataFormat importType) { + File[] filesToImport = JFileChooserExistsAware.getFileChooserResults( importType, false, true, null, localPropertiesService, frame ); + final ImportXMLDialogProcessMonitor importDialogProcessMonitor = new ImportXMLDialogProcessMonitor(); + if (filesToImport != null) { - String refresh = Messages.getString("IPCCGeneratorListener.3"); //$NON-NLS-1$ - String close = Messages.getString("IPCCGeneratorListener.4"); //$NON-NLS-1$ - String[] options = new String[]{ refresh,close}; + switch (importType) { + case ZIP_WITH_XML: + new Thread("XML Import Thread " ){ //$NON-NLS-1$ + @Override + public void run() { + Integer importNonFinishedPlots = shouldImportNonFinishedRecords( filesToImport.length > 1); + boolean firstFile = true; - shouldRefreshDb = JOptionPane.showOptionDialog( - frame, Messages.getString("IPCCGeneratorListener.6"), //$NON-NLS-1$ - Messages.getString("IPCCGeneratorListener.5"), //$NON-NLS-1$ - JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); - } + for (final File importedFile : filesToImport) { + XMLDataImportProcess dataImportProcess = null; + try{ + if ( firstFile ){ + firstFile = false; + }else if ( !firstFile && (importNonFinishedPlots.equals( YES ) || importNonFinishedPlots.equals( NO ) ) ){ + importNonFinishedPlots = shouldImportNonFinishedRecords( filesToImport.length > 1); + } + + if( importNonFinishedPlots.equals( JOptionPane.CLOSED_OPTION ) ){ + break; + } - if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ - ipccExporterStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); - ipccExporterStarter.initializeAndOpen( true ); + boolean importNotFinished= importNonFinishedPlots.equals( YES ) || importNonFinishedPlots.equals( YES_TO_ALL ); + + dataImportProcess = dataImportService.getImportSummary(importedFile, importNotFinished); + importDialogProcessMonitor.startImport(dataImportProcess, frame, dataImportService, importedFile ); + + } catch (Exception e1) { + logger.error("Error importing data" , e1); //$NON-NLS-1$ + importDialogProcessMonitor.closeProgressmonitor(); + JOptionPane.showMessageDialog( frame, importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.3"), importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.7"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + JOptionPane.ERROR_MESSAGE); + logger.error("Error importing data from " + importedFile.getAbsolutePath() + " in format " + importType.name() , e1); //$NON-NLS-1$ //$NON-NLS-2$ + } finally { + IOUtils.closeQuietly(dataImportProcess); + } + } + forceRefreshGoogleEarth(); + } + }.start(); + break; + case CSV: + new Thread("Update using CSV Thread " ){ //$NON-NLS-1$ + @Override + public void run() { + + String[] ids = dataImportService.getEarthSurveyService().getKeyNamesForSurvey(); + String keyAttributesForSurvey = Arrays.toString( ids ); + + JOptionPane.showMessageDialog( + frame, + "The CSV files used must have columns with at least the headers for the key attributes " + keyAttributesForSurvey+ " followed by one or more attribute names ( see http://www.openforis.org/support/questions/80/changing-plot-attributes-in-the-collect-earth-database ) ", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + "CSV file format info", + JOptionPane.INFORMATION_MESSAGE); + + + for (final File importedFile : filesToImport) { + + CSVDataImportProcess importSurveyAsCsv = null; + try { + importSurveyAsCsv = dataImportService.getCsvImporterProcess(importedFile); + + if( importSurveyAsCsv != null ){ + importSurveyAsCsv.init(); + ProcessStatus status = importSurveyAsCsv.getStatus(); + status.setTotal( getTotalNumberOfLines( importedFile ) ); + if ( status != null && ! importSurveyAsCsv.getStatus().isError() ) { + ImportProcessMonitorDialog importProcessWorker = new ImportProcessMonitorDialog(importSurveyAsCsv, frame ); + importProcessWorker.start(); + } + } + } catch (Exception e1) { + JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.7") + "\n" + e1.getMessage(), importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.3"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + JOptionPane.ERROR_MESSAGE); + logger.error("Error importing data from " + importedFile.getAbsolutePath() + " in format " + importType , e1); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + } + }.start(); + break; + case FUSION: + break; + default: + break; } } } -} \ No newline at end of file + private long getTotalNumberOfLines(File importedFile) { + long count = 0; + BufferedReader br = null; + try { + br = new BufferedReader(new InputStreamReader(new FileInputStream(importedFile))); + + while ( br.readLine() != null) { + count++; + } + } catch (IOException e) { + logger.error("Error counting the number of lines in file " + importedFile.getAbsolutePath() , e) ; //$NON-NLS-1$ + }finally { + if( br!=null) { + try { + br.close(); + } catch (IOException e) { + logger.error("Error closing file reader " + importedFile.getAbsolutePath() , e) ; + } + } + + + } + return count; + } +} From 2743df5a5c084213ff101aae9f43cdaa023f3b86 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:29 +0100 Subject: [PATCH 0281/1620] New translations ImportActionListener.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 205 +++++++++++++++--- 1 file changed, 175 insertions(+), 30 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 7c0a5857ae..88aa8edf1c 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -2,62 +2,207 @@ package org.openforis.collect.earth.app.view; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Arrays; import javax.swing.JFrame; import javax.swing.JOptionPane; -import org.openforis.collect.earth.app.service.ExportType; +import org.apache.commons.io.IOUtils; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.DataImportExportService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.io.data.CSVDataImportProcess; +import org.openforis.collect.io.data.XMLDataImportProcess; +import org.openforis.collect.manager.process.ProcessStatus; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class IPCCGeneratorListener implements ActionListener { - private Logger logger = LoggerFactory.getLogger( IPCCGeneratorListener.class); +public final class ImportActionListener implements ActionListener { + protected static final Integer YES = 0; + protected static final Integer YES_TO_ALL = 1; + protected static final Integer NO = 2; + protected static final Integer NO_TO_ALL = 3; + + private final DataFormat importFormat; private JFrame frame; - private GenerateDatabaseStarter ipccExporterStarter; + private LocalPropertiesService localPropertiesService; + private DataImportExportService dataImportService; + private Logger logger = LoggerFactory.getLogger( ImportActionListener.class ); - public IPCCGeneratorListener(JFrame frame, GenerateDatabaseStarter ipccExporterStarter) { + public ImportActionListener(DataFormat importFormat, JFrame frame, LocalPropertiesService localPropertiesService, DataImportExportService dataImportService) { + this.importFormat = importFormat; this.frame = frame; - this.ipccExporterStarter = ipccExporterStarter; + this.localPropertiesService = localPropertiesService; + this.dataImportService = dataImportService; } - @Override public void actionPerformed(ActionEvent e) { - try { + try{ CollectEarthWindow.startWaiting(frame); - generateIpccData(); - }catch (Exception e1) { - logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ - } finally{ - CollectEarthWindow.endWaiting(frame); + importDataFrom(e, importFormat ); + }finally{ + CollectEarthWindow.endWaiting( frame); } + } + + private void forceRefreshGoogleEarth() { + + EarthApp.executeKmlLoadAsynchronously( null ); + + } + private Integer shouldImportNonFinishedRecords( boolean moreThanOneFiles ) { + String message = "" //$NON-NLS-1$ + + Messages.getString("ImportActionListener.0") //$NON-NLS-1$ + +"
" //$NON-NLS-1$ + + Messages.getString("ImportActionListener.2") //$NON-NLS-1$ + + ""; + + if( !moreThanOneFiles ){ - private void generateIpccData() { - if( ipccExporterStarter.isStarting() ){ - JOptionPane.showMessageDialog(frame, Messages.getString("IPCCGeneratorListener.1"), Messages.getString("IPCCGeneratorListener.2"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ + final int selectedOption = JOptionPane.showConfirmDialog(null, + message //$NON-NLS-1$ + ,Messages.getString("ImportActionListener.3"), //$NON-NLS-1$ + JOptionPane.YES_NO_OPTION); + + if (selectedOption == JOptionPane.YES_OPTION){ + return YES; + }else if (selectedOption == JOptionPane.NO_OPTION){ + return NO; + }else{ + return JOptionPane.CLOSED_OPTION; + } }else{ - int shouldRefreshDb = JOptionPane.YES_OPTION; + String[] buttons = { Messages.getString("YES"), Messages.getString("YES_TO_ALL"), Messages.getString("NO"), Messages.getString("NO_TO_ALL") }; + + return JOptionPane.showOptionDialog(null, message, Messages.getString("ImportActionListener.3") , + JOptionPane.WARNING_MESSAGE, 0, null, buttons, buttons[1]); + + } + } - if( ipccExporterStarter.shouldShowRdbGenerationOption(ExportType.IPCC) ){ + private void importDataFrom(final ActionEvent e, final DataFormat importType) { + File[] filesToImport = JFileChooserExistsAware.getFileChooserResults( importType, false, true, null, localPropertiesService, frame ); + final ImportXMLDialogProcessMonitor importDialogProcessMonitor = new ImportXMLDialogProcessMonitor(); + if (filesToImport != null) { - String refresh = Messages.getString("IPCCGeneratorListener.3"); //$NON-NLS-1$ - String close = Messages.getString("IPCCGeneratorListener.4"); //$NON-NLS-1$ - String[] options = new String[]{ refresh,close}; + switch (importType) { + case ZIP_WITH_XML: + new Thread("XML Import Thread " ){ //$NON-NLS-1$ + @Override + public void run() { + Integer importNonFinishedPlots = shouldImportNonFinishedRecords( filesToImport.length > 1); + boolean firstFile = true; - shouldRefreshDb = JOptionPane.showOptionDialog( - frame, Messages.getString("IPCCGeneratorListener.6"), //$NON-NLS-1$ - Messages.getString("IPCCGeneratorListener.5"), //$NON-NLS-1$ - JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); - } + for (final File importedFile : filesToImport) { + XMLDataImportProcess dataImportProcess = null; + try{ + if ( firstFile ){ + firstFile = false; + }else if ( !firstFile && (importNonFinishedPlots.equals( YES ) || importNonFinishedPlots.equals( NO ) ) ){ + importNonFinishedPlots = shouldImportNonFinishedRecords( filesToImport.length > 1); + } + + if( importNonFinishedPlots.equals( JOptionPane.CLOSED_OPTION ) ){ + break; + } - if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ - ipccExporterStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); - ipccExporterStarter.initializeAndOpen( true ); + boolean importNotFinished= importNonFinishedPlots.equals( YES ) || importNonFinishedPlots.equals( YES_TO_ALL ); + + dataImportProcess = dataImportService.getImportSummary(importedFile, importNotFinished); + importDialogProcessMonitor.startImport(dataImportProcess, frame, dataImportService, importedFile ); + + } catch (Exception e1) { + logger.error("Error importing data" , e1); //$NON-NLS-1$ + importDialogProcessMonitor.closeProgressmonitor(); + JOptionPane.showMessageDialog( frame, importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.3"), importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.7"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + JOptionPane.ERROR_MESSAGE); + logger.error("Error importing data from " + importedFile.getAbsolutePath() + " in format " + importType.name() , e1); //$NON-NLS-1$ //$NON-NLS-2$ + } finally { + IOUtils.closeQuietly(dataImportProcess); + } + } + forceRefreshGoogleEarth(); + } + }.start(); + break; + case CSV: + new Thread("Update using CSV Thread " ){ //$NON-NLS-1$ + @Override + public void run() { + + String[] ids = dataImportService.getEarthSurveyService().getKeyNamesForSurvey(); + String keyAttributesForSurvey = Arrays.toString( ids ); + + JOptionPane.showMessageDialog( + frame, + "The CSV files used must have columns with at least the headers for the key attributes " + keyAttributesForSurvey+ " followed by one or more attribute names ( see http://www.openforis.org/support/questions/80/changing-plot-attributes-in-the-collect-earth-database ) ", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + "CSV file format info", + JOptionPane.INFORMATION_MESSAGE); + + + for (final File importedFile : filesToImport) { + + CSVDataImportProcess importSurveyAsCsv = null; + try { + importSurveyAsCsv = dataImportService.getCsvImporterProcess(importedFile); + + if( importSurveyAsCsv != null ){ + importSurveyAsCsv.init(); + ProcessStatus status = importSurveyAsCsv.getStatus(); + status.setTotal( getTotalNumberOfLines( importedFile ) ); + if ( status != null && ! importSurveyAsCsv.getStatus().isError() ) { + ImportProcessMonitorDialog importProcessWorker = new ImportProcessMonitorDialog(importSurveyAsCsv, frame ); + importProcessWorker.start(); + } + } + } catch (Exception e1) { + JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.7") + "\n" + e1.getMessage(), importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.3"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + JOptionPane.ERROR_MESSAGE); + logger.error("Error importing data from " + importedFile.getAbsolutePath() + " in format " + importType , e1); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + } + }.start(); + break; + case FUSION: + break; + default: + break; } } } -} \ No newline at end of file + private long getTotalNumberOfLines(File importedFile) { + long count = 0; + BufferedReader br = null; + try { + br = new BufferedReader(new InputStreamReader(new FileInputStream(importedFile))); + + while ( br.readLine() != null) { + count++; + } + } catch (IOException e) { + logger.error("Error counting the number of lines in file " + importedFile.getAbsolutePath() , e) ; //$NON-NLS-1$ + }finally { + if( br!=null) { + try { + br.close(); + } catch (IOException e) { + logger.error("Error closing file reader " + importedFile.getAbsolutePath() , e) ; + } + } + + + } + return count; + } +} From 5880b953fbc0fe86dfea725e6e59d8c2b739c0bc Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:31 +0100 Subject: [PATCH 0282/1620] New translations FileDividerToolDlg.java (French) --- .../earth/app/view/Messages_fr.properties | 456 +++++++++++------- 1 file changed, 286 insertions(+), 170 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 88aa8edf1c..d275a15df8 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,208 +1,324 @@ package org.openforis.collect.earth.app.view; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.BufferedReader; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; import java.io.File; -import java.io.FileInputStream; import java.io.IOException; -import java.io.InputStreamReader; -import java.util.Arrays; - -import javax.swing.JFrame; +import java.util.List; + +import javax.swing.DefaultComboBoxModel; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JDialog; +import javax.swing.JFileChooser; +import javax.swing.JLabel; import javax.swing.JOptionPane; - -import org.apache.commons.io.IOUtils; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.DataImportExportService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.io.data.CSVDataImportProcess; -import org.openforis.collect.io.data.XMLDataImportProcess; -import org.openforis.collect.manager.process.ProcessStatus; +import javax.swing.JPanel; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; + +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.collect.earth.sampler.utils.ProduceCsvFiles; +import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult; +import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult.ErrorType; +import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; +import org.openforis.collect.manager.validation.SurveyValidator.ValidationParameters; +import org.openforis.collect.model.CollectSurvey; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public final class ImportActionListener implements ActionListener { - protected static final Integer YES = 0; - protected static final Integer YES_TO_ALL = 1; - protected static final Integer NO = 2; - protected static final Integer NO_TO_ALL = 3; - - private final DataFormat importFormat; - private JFrame frame; - private LocalPropertiesService localPropertiesService; - private DataImportExportService dataImportService; - private Logger logger = LoggerFactory.getLogger( ImportActionListener.class ); - - public ImportActionListener(DataFormat importFormat, JFrame frame, LocalPropertiesService localPropertiesService, DataImportExportService dataImportService) { - this.importFormat = importFormat; - this.frame = frame; - this.localPropertiesService = localPropertiesService; - this.dataImportService = dataImportService; +public class FileDividerToolDlg extends JDialog{ + + private static final long serialVersionUID = 2241706750062961024L; + private static final int MAX_FILES = 500; + private CollectSurvey survey; + private transient Logger logger = LoggerFactory.getLogger( FileDividerToolDlg.class); + private JComboBox numberOfFiles ; + private JCheckBox randomSelector; + private JComboBox csvColumns; + private JFilePicker outputFolder; + private JButton generateGrids; + private JFilePicker filePicker; + + public static void open( Frame owner, CollectSurvey survey){ + FileDividerToolDlg dlg = new FileDividerToolDlg(owner, survey); + dlg.setVisible(true); + } + + public FileDividerToolDlg( Frame owner,CollectSurvey survey ) { + super(owner); + this.survey = survey; + this.setModal(true); + this.setSize( new Dimension(700, 350)); + this.setLocationRelativeTo( owner ); + this.setTitle("Tool for dividing large CSV into smaller ones"); + initLayout(); } - @Override - public void actionPerformed(ActionEvent e) { - try{ - CollectEarthWindow.startWaiting(frame); - importDataFrom(e, importFormat ); - }finally{ - CollectEarthWindow.endWaiting( frame); + private void initLayout() { + final JPanel panel = new JPanel(new GridBagLayout()); + GridBagConstraints c = new GridBagConstraints(); + + int row = 0; + + c.fill = GridBagConstraints.BOTH; + c.gridx = 0; + c.gridwidth = 2; + c.gridy = row++; + + panel.add( getCsvFilePicker(), c ); + c.gridwidth = 1; + c.gridy = row++; + + c.gridx = 0; + + panel.add( new JLabel("Number of files to split the CSV into"), c ); + + c.gridx = 1; + panel.add( getNumberOfFilesSelector(), c ); + + c.gridx = 0; + c.gridy = row++; + c.gridwidth = 2; + panel.add( getRandomSelector(), c ); + + c.gridy = row++; + c.gridx = 0; + c.gridwidth = 1; + panel.add( new JLabel("Split files by strata (values of the column i.e : region )"), c ); + + c.gridx = 1; + panel.add( getColumnSelector(), c ); + + c.gridx = 0; + c.gridy = row++; + c.gridwidth = 2; + panel.add( getOutputFolder(), c ); + + c.gridx = 0; + c.gridy = row; + + panel.add( getGenerateButton(), c ); + + this.add(panel); + } + + private JButton getGenerateButton() { + if( generateGrids == null ){ + generateGrids = new JButton("Divide file"); + generateGrids.setEnabled( false ); + generateGrids.addActionListener( e -> { + String sourceCsvFile = getCsvFilePicker().getSelectedFilePath(); + String destinationFolder = getOutputFolder().getSelectedFilePath(); + boolean randomizeLines = getRandomSelector().isSelected(); + Integer randomizeUsingColumnValues = null; + if( ( (CsvColumn) getColumnSelector().getSelectedItem() )!=null ){ + randomizeUsingColumnValues = ( (CsvColumn) getColumnSelector().getSelectedItem() ).getPos(); + } + Integer filesToDivideInto = getNumberOfFilesSelector().getSelectedIndex()+1; + ProduceCsvFiles produceCsvFiles = new ProduceCsvFiles(survey, sourceCsvFile, destinationFolder, randomizeLines, randomizeUsingColumnValues, filesToDivideInto); + File dest = produceCsvFiles.divideIntoFiles(); + + try { + CollectEarthUtils.openFolderInExplorer( dest.getAbsolutePath() ); + } catch (IOException e1) { + logger.error(" Error opening the destination folder", e); + } + }); } + return generateGrids; + } + + private JFilePicker getOutputFolder() { + if( outputFolder == null ){ + outputFolder = new JFilePicker("Select the output folder" , null, "Select...", DlgMode.MODE_SAVE); + outputFolder.getFileChooser().setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + outputFolder.setEnabled(false); + + outputFolder.addChangeListener( new DocumentListener() { + @Override + public void removeUpdate(DocumentEvent e) { + // No need to do anything + } + + @Override + public void insertUpdate(DocumentEvent e) { + String outputFolderPath = outputFolder.getSelectedFilePath(); + File out = new File( outputFolderPath ); + getGenerateButton().setEnabled(out.exists() ); + } + + @Override + public void changedUpdate(DocumentEvent e) { + // No need to react to the update + } + }); + } + return outputFolder; } - - private void forceRefreshGoogleEarth() { - EarthApp.executeKmlLoadAsynchronously( null ); + private void enableOtherControls(boolean validFile) { + getRandomSelector().setEnabled( true ); + getColumnSelector().setEnabled(validFile); + getNumberOfFilesSelector().setEnabled(true); + getOutputFolder().setEnabled(true); + setColumns( validFile ); } - private Integer shouldImportNonFinishedRecords( boolean moreThanOneFiles ) { - String message = "" //$NON-NLS-1$ - + Messages.getString("ImportActionListener.0") //$NON-NLS-1$ - +"
" //$NON-NLS-1$ - + Messages.getString("ImportActionListener.2") //$NON-NLS-1$ - + ""; - - if( !moreThanOneFiles ){ - - final int selectedOption = JOptionPane.showConfirmDialog(null, - message //$NON-NLS-1$ - ,Messages.getString("ImportActionListener.3"), //$NON-NLS-1$ - JOptionPane.YES_NO_OPTION); - - if (selectedOption == JOptionPane.YES_OPTION){ - return YES; - }else if (selectedOption == JOptionPane.NO_OPTION){ - return NO; - }else{ - return JOptionPane.CLOSED_OPTION; + + + private void setColumns( boolean validFile){ + if( validFile ){ + CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); + + List expectedHeaders = cegtg.getExpectedHeaders(survey); + CsvColumn[] columns = new CsvColumn[ expectedHeaders.size()+1 ]; + CsvColumn column = new CsvColumn(null,"DO NOT STRATIFY"); + columns[0] = column; + + int i = 0; + for (String header : expectedHeaders) { + column = new CsvColumn(i++,"Use :" + header); + columns[i] = column; } + + getColumnSelector().setModel( new DefaultComboBoxModel( columns )); }else{ + getColumnSelector().setModel( new DefaultComboBoxModel()); + } + } - String[] buttons = { Messages.getString("YES"), Messages.getString("YES_TO_ALL"), Messages.getString("NO"), Messages.getString("NO_TO_ALL") }; - return JOptionPane.showOptionDialog(null, message, Messages.getString("ImportActionListener.3") , - JOptionPane.WARNING_MESSAGE, 0, null, buttons, buttons[1]); + private JComboBox getColumnSelector() { + if( csvColumns == null ){ + csvColumns = new JComboBox<>(); + csvColumns.setEnabled(false); + } + return csvColumns; + } + + private JCheckBox getRandomSelector() { + if( randomSelector == null ){ + randomSelector = new JCheckBox("Randomize the order of the lines from the source CSV file" , false); + randomSelector.setEnabled( false); + } + return randomSelector; + } + private JComboBox getNumberOfFilesSelector() { + if( numberOfFiles == null ){ + Integer[] items = new Integer[MAX_FILES]; + for (int i =1; i<= MAX_FILES; i++) { + items[i-1] = Integer.valueOf(i); + } + numberOfFiles = new JComboBox<>(items); + numberOfFiles.setEnabled( false ); } + return numberOfFiles; } - private void importDataFrom(final ActionEvent e, final DataFormat importType) { - File[] filesToImport = JFileChooserExistsAware.getFileChooserResults( importType, false, true, null, localPropertiesService, frame ); - final ImportXMLDialogProcessMonitor importDialogProcessMonitor = new ImportXMLDialogProcessMonitor(); - if (filesToImport != null) { - - - switch (importType) { - case ZIP_WITH_XML: - new Thread("XML Import Thread " ){ //$NON-NLS-1$ - @Override - public void run() { - Integer importNonFinishedPlots = shouldImportNonFinishedRecords( filesToImport.length > 1); - boolean firstFile = true; - - for (final File importedFile : filesToImport) { - XMLDataImportProcess dataImportProcess = null; - try{ - if ( firstFile ){ - firstFile = false; - }else if ( !firstFile && (importNonFinishedPlots.equals( YES ) || importNonFinishedPlots.equals( NO ) ) ){ - importNonFinishedPlots = shouldImportNonFinishedRecords( filesToImport.length > 1); - } + private JFilePicker getCsvFilePicker() { + if( filePicker == null ){ + filePicker = new JFilePicker("Choose the CSV file with the sampling design (plots)", null, "Explore", DlgMode.MODE_OPEN); - if( importNonFinishedPlots.equals( JOptionPane.CLOSED_OPTION ) ){ - break; - } + filePicker.getFileChooser().setAcceptAllFileFilterUsed(false); + filePicker.addFileTypeFilter("csv", " CSV file with plot (sampling design)", true); + + filePicker.addChangeListener( new DocumentListener() { - boolean importNotFinished= importNonFinishedPlots.equals( YES ) || importNonFinishedPlots.equals( YES_TO_ALL ); + @Override + public void removeUpdate(DocumentEvent e) { + // No need to validate + } + + @Override + public void insertUpdate(DocumentEvent e) { + validateCsv( filePicker.getTextField().getText() ); + } - dataImportProcess = dataImportService.getImportSummary(importedFile, importNotFinished); - importDialogProcessMonitor.startImport(dataImportProcess, frame, dataImportService, importedFile ); + private boolean validateCsv(String filePath) { + boolean validFile = true; + try { + + filePicker.setTextBackground( Color.white); + + if( CsvReaderUtils.isCsvFile( filePath )){ + CollectEarthGridTemplateGenerator cetg = new CollectEarthGridTemplateGenerator(); + + File csvFile = new File( filePath ); + ValidationParameters validationParameters = new ValidationParameters(); + validationParameters.setValidateOnlyFirstLines(false); + CSVFileValidationResult validationResults = cetg.validate(csvFile, survey, validationParameters ); + + validFile = validationResults.isSuccessful(); + if( + !validFile + // If the message is that there are too many rows then we ignore the validation! + && ( + validationResults.getErrorType().equals( ErrorType.INVALID_NUMBER_OF_PLOTS_TOO_LARGE) + || + validationResults.getErrorType().equals( ErrorType.INVALID_NUMBER_OF_PLOTS_WARNING) + ) + ){ + validFile = true; - } catch (Exception e1) { - logger.error("Error importing data" , e1); //$NON-NLS-1$ - importDialogProcessMonitor.closeProgressmonitor(); - JOptionPane.showMessageDialog( frame, importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.3"), importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.7"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - JOptionPane.ERROR_MESSAGE); - logger.error("Error importing data from " + importedFile.getAbsolutePath() + " in format " + importType.name() , e1); //$NON-NLS-1$ //$NON-NLS-2$ - } finally { - IOUtils.closeQuietly(dataImportProcess); } - } - forceRefreshGoogleEarth(); - } - }.start(); - break; - case CSV: - new Thread("Update using CSV Thread " ){ //$NON-NLS-1$ - @Override - public void run() { - - String[] ids = dataImportService.getEarthSurveyService().getKeyNamesForSurvey(); - String keyAttributesForSurvey = Arrays.toString( ids ); - - JOptionPane.showMessageDialog( - frame, - "The CSV files used must have columns with at least the headers for the key attributes " + keyAttributesForSurvey+ " followed by one or more attribute names ( see http://www.openforis.org/support/questions/80/changing-plot-attributes-in-the-collect-earth-database ) ", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - "CSV file format info", - JOptionPane.INFORMATION_MESSAGE); - - - for (final File importedFile : filesToImport) { - - CSVDataImportProcess importSurveyAsCsv = null; - try { - importSurveyAsCsv = dataImportService.getCsvImporterProcess(importedFile); - - if( importSurveyAsCsv != null ){ - importSurveyAsCsv.init(); - ProcessStatus status = importSurveyAsCsv.getStatus(); - status.setTotal( getTotalNumberOfLines( importedFile ) ); - if ( status != null && ! importSurveyAsCsv.getStatus().isError() ) { - ImportProcessMonitorDialog importProcessWorker = new ImportProcessMonitorDialog(importSurveyAsCsv, frame ); - importProcessWorker.start(); - } + + if( !validFile ){ + filePicker.setTextBackground( Color.yellow); + switch ( validationResults.getErrorType() ) { + case INVALID_FILE_TYPE: + filePicker.setTextBackground( Color.red); + JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), "The expected file type is CSV or CED ", "Expected File Type", JOptionPane.ERROR_MESSAGE); + break; + + case INVALID_HEADERS: + JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), String.format("The expected columns in the CSV for the survey %s are %s", survey.getName(), validationResults.getExpectedHeaders() ) , "Columns in CSV do not match survey", JOptionPane.ERROR_MESSAGE); + break; + + case INVALID_NUMBER_OF_COLUMNS: + JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), String.format("The number of columns in the CSV file do not coincide with the expercted columns expected for the survey %s /n%s", survey.getName(), validationResults.getExpectedHeaders() ), "Expected File Type", JOptionPane.ERROR_MESSAGE); + break; + + case INVALID_VALUES_IN_CSV: + // IN THIS CASE THE CELL RENDERER TAKES CARE OF HIGHLIGHTING THE CELLS!!! + JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), "The content of the CSV file is not correct!! The values on some cells are incorrect for the survey " + survey.getName() , "CSV content is not correct", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + break; + + default: + break; } - } catch (Exception e1) { - JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.7") + "\n" + e1.getMessage(), importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.3"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - JOptionPane.ERROR_MESSAGE); - logger.error("Error importing data from " + importedFile.getAbsolutePath() + " in format " + importType , e1); //$NON-NLS-1$ //$NON-NLS-2$ } - } - } - }.start(); - break; - case FUSION: - break; - default: - break; - } - } - } - private long getTotalNumberOfLines(File importedFile) { - long count = 0; - BufferedReader br = null; - try { - br = new BufferedReader(new InputStreamReader(new FileInputStream(importedFile))); + enableOtherControls( validFile ); - while ( br.readLine() != null) { - count++; - } - } catch (IOException e) { - logger.error("Error counting the number of lines in file " + importedFile.getAbsolutePath() , e) ; //$NON-NLS-1$ - }finally { - if( br!=null) { - try { - br.close(); - } catch (IOException e) { - logger.error("Error closing file reader " + importedFile.getAbsolutePath() , e) ; - } - } + }else{ + JOptionPane.showMessageDialog(FileDividerToolDlg.this, String.format("The file in %s is NOT A CSV file ", filePath) ); + filePicker.setTextBackground( Color.red); + } + } catch (Exception e) { + JOptionPane.showMessageDialog(FileDividerToolDlg.this, String.format("The file in %s is NOT A CSV file ", filePath) ); + logger.error( "Error while validating the CSV file", e); + validFile = false; + } + return validFile; + } + @Override + public void changedUpdate(DocumentEvent e) { + validateCsv( filePicker.getTextField().getText() ); + } + }); } - return count; + return filePicker ; } + } From be3c7407b4a1ed39569b27005379cdfe7a1bff58 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:32 +0100 Subject: [PATCH 0283/1620] New translations ExportProcessMonitorDialog.java (English) --- .../earth/app/view/Messages_en.properties | 90 ++++++++++--------- 1 file changed, 47 insertions(+), 43 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 7c0a5857ae..0ccb8f2366 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,63 +1,67 @@ package org.openforis.collect.earth.app.view; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; +import java.io.File; import javax.swing.JFrame; -import javax.swing.JOptionPane; +import javax.swing.ProgressMonitor; -import org.openforis.collect.earth.app.service.ExportType; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.view.ExportActionListener.RecordsToExport; +import org.openforis.collect.io.data.DataExportStatus; +import org.openforis.collect.manager.process.AbstractProcess; -public class IPCCGeneratorListener implements ActionListener { - private Logger logger = LoggerFactory.getLogger( IPCCGeneratorListener.class); - private JFrame frame; - private GenerateDatabaseStarter ipccExporterStarter; +public class ExportProcessMonitorDialog extends ProcessMonitorDialog { - public IPCCGeneratorListener(JFrame frame, GenerateDatabaseStarter ipccExporterStarter) { - this.frame = frame; - this.ipccExporterStarter = ipccExporterStarter; - } + private RecordsToExport recordsToExport; + private DataFormat exportFormat; + private EarthSurveyService earthSurveyService; + private LocalPropertiesService localPropertiesService; + private File exportToFile; - @Override - public void actionPerformed(ActionEvent e) { - try { - CollectEarthWindow.startWaiting(frame); - generateIpccData(); - }catch (Exception e1) { - logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ - } finally{ - CollectEarthWindow.endWaiting(frame); - } + public ExportProcessMonitorDialog(AbstractProcess exportProcess, JFrame parentFrame, RecordsToExport recordsToExport, DataFormat exportFormat, EarthSurveyService earthSurveyService, File exportToFile, LocalPropertiesService localPropertiesService ) { + super(); + this.process = exportProcess; + this.recordsToExport = recordsToExport; + this.exportFormat = exportFormat; + this.earthSurveyService = earthSurveyService; + this.exportToFile = exportToFile; + this.localPropertiesService = localPropertiesService; + progressMonitor = new ProgressMonitor(parentFrame, Messages.getString("ExportDialogProcessMonitor.0"), Messages.getString("ExportDialogProcessMonitor.1"), 0, 100); //$NON-NLS-1$ //$NON-NLS-2$ + progressMonitor.setMillisToPopup(1000); + } - private void generateIpccData() { - if( ipccExporterStarter.isStarting() ){ - JOptionPane.showMessageDialog(frame, Messages.getString("IPCCGeneratorListener.1"), Messages.getString("IPCCGeneratorListener.2"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ - }else{ - - int shouldRefreshDb = JOptionPane.YES_OPTION; - - if( ipccExporterStarter.shouldShowRdbGenerationOption(ExportType.IPCC) ){ + protected String getProcessActionMessage() { + return Messages.getString("ExportDialogProcessMonitor.4"); //$NON-NLS-1$ + } - String refresh = Messages.getString("IPCCGeneratorListener.3"); //$NON-NLS-1$ - String close = Messages.getString("IPCCGeneratorListener.4"); //$NON-NLS-1$ - String[] options = new String[]{ refresh,close}; + @Override + public void run() { + try { + monitorProgress(); + process.call(); + if( process.getStatus().isComplete() && exportFormat.equals( DataFormat.ZIP_WITH_XML ) && recordsToExport.equals(RecordsToExport.MODIFIED_SINCE_LAST_EXPORT) ){ + String surveyName = ""; //$NON-NLS-1$ + if( earthSurveyService.getCollectSurvey()!= null ){ + surveyName = earthSurveyService.getCollectSurvey().getName(); + } + localPropertiesService.setLastExportedDate( surveyName ); - shouldRefreshDb = JOptionPane.showOptionDialog( - frame, Messages.getString("IPCCGeneratorListener.6"), //$NON-NLS-1$ - Messages.getString("IPCCGeneratorListener.5"), //$NON-NLS-1$ - JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); } - if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ - ipccExporterStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); - ipccExporterStarter.initializeAndOpen( true ); + if( process.getStatus().isComplete() && ( exportFormat.equals( DataFormat.CSV ) || exportFormat.equals( DataFormat.FUSION ) || exportFormat.equals( DataFormat.KML_FILE ) ) ) { + CollectEarthUtils.openFile( exportToFile ); } + + } catch (final Exception e) { + logger.error("Error starting the process", e); //$NON-NLS-1$ } + } -} \ No newline at end of file + +} From 72e29f77a6f48daf79c88e91e2d110a7917a07fb Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:33 +0100 Subject: [PATCH 0284/1620] New translations ExportProcessMonitorDialog.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 229 ++++-------------- 1 file changed, 44 insertions(+), 185 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 88aa8edf1c..0ccb8f2366 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,208 +1,67 @@ package org.openforis.collect.earth.app.view; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.BufferedReader; import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.Arrays; import javax.swing.JFrame; -import javax.swing.JOptionPane; +import javax.swing.ProgressMonitor; -import org.apache.commons.io.IOUtils; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.DataImportExportService; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.service.EarthSurveyService; import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.io.data.CSVDataImportProcess; -import org.openforis.collect.io.data.XMLDataImportProcess; -import org.openforis.collect.manager.process.ProcessStatus; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public final class ImportActionListener implements ActionListener { - protected static final Integer YES = 0; - protected static final Integer YES_TO_ALL = 1; - protected static final Integer NO = 2; - protected static final Integer NO_TO_ALL = 3; - - private final DataFormat importFormat; - private JFrame frame; - private LocalPropertiesService localPropertiesService; - private DataImportExportService dataImportService; - private Logger logger = LoggerFactory.getLogger( ImportActionListener.class ); +import org.openforis.collect.earth.app.view.ExportActionListener.RecordsToExport; +import org.openforis.collect.io.data.DataExportStatus; +import org.openforis.collect.manager.process.AbstractProcess; - public ImportActionListener(DataFormat importFormat, JFrame frame, LocalPropertiesService localPropertiesService, DataImportExportService dataImportService) { - this.importFormat = importFormat; - this.frame = frame; - this.localPropertiesService = localPropertiesService; - this.dataImportService = dataImportService; - } +public class ExportProcessMonitorDialog extends ProcessMonitorDialog { - @Override - public void actionPerformed(ActionEvent e) { - try{ - CollectEarthWindow.startWaiting(frame); - importDataFrom(e, importFormat ); - }finally{ - CollectEarthWindow.endWaiting( frame); - } + private RecordsToExport recordsToExport; + private DataFormat exportFormat; + private EarthSurveyService earthSurveyService; + private LocalPropertiesService localPropertiesService; + private File exportToFile; + + public ExportProcessMonitorDialog(AbstractProcess exportProcess, JFrame parentFrame, RecordsToExport recordsToExport, DataFormat exportFormat, EarthSurveyService earthSurveyService, File exportToFile, LocalPropertiesService localPropertiesService ) { + super(); + this.process = exportProcess; + this.recordsToExport = recordsToExport; + this.exportFormat = exportFormat; + this.earthSurveyService = earthSurveyService; + this.exportToFile = exportToFile; + this.localPropertiesService = localPropertiesService; + progressMonitor = new ProgressMonitor(parentFrame, Messages.getString("ExportDialogProcessMonitor.0"), Messages.getString("ExportDialogProcessMonitor.1"), 0, 100); //$NON-NLS-1$ //$NON-NLS-2$ + progressMonitor.setMillisToPopup(1000); + } - - private void forceRefreshGoogleEarth() { - - EarthApp.executeKmlLoadAsynchronously( null ); + protected String getProcessActionMessage() { + return Messages.getString("ExportDialogProcessMonitor.4"); //$NON-NLS-1$ } - private Integer shouldImportNonFinishedRecords( boolean moreThanOneFiles ) { - String message = "" //$NON-NLS-1$ - + Messages.getString("ImportActionListener.0") //$NON-NLS-1$ - +"
" //$NON-NLS-1$ - + Messages.getString("ImportActionListener.2") //$NON-NLS-1$ - + ""; - - if( !moreThanOneFiles ){ - - final int selectedOption = JOptionPane.showConfirmDialog(null, - message //$NON-NLS-1$ - ,Messages.getString("ImportActionListener.3"), //$NON-NLS-1$ - JOptionPane.YES_NO_OPTION); - - if (selectedOption == JOptionPane.YES_OPTION){ - return YES; - }else if (selectedOption == JOptionPane.NO_OPTION){ - return NO; - }else{ - return JOptionPane.CLOSED_OPTION; - } - }else{ - - String[] buttons = { Messages.getString("YES"), Messages.getString("YES_TO_ALL"), Messages.getString("NO"), Messages.getString("NO_TO_ALL") }; - return JOptionPane.showOptionDialog(null, message, Messages.getString("ImportActionListener.3") , - JOptionPane.WARNING_MESSAGE, 0, null, buttons, buttons[1]); - - } - } - - private void importDataFrom(final ActionEvent e, final DataFormat importType) { - File[] filesToImport = JFileChooserExistsAware.getFileChooserResults( importType, false, true, null, localPropertiesService, frame ); - final ImportXMLDialogProcessMonitor importDialogProcessMonitor = new ImportXMLDialogProcessMonitor(); - if (filesToImport != null) { - - - switch (importType) { - case ZIP_WITH_XML: - new Thread("XML Import Thread " ){ //$NON-NLS-1$ - @Override - public void run() { - Integer importNonFinishedPlots = shouldImportNonFinishedRecords( filesToImport.length > 1); - boolean firstFile = true; - - for (final File importedFile : filesToImport) { - XMLDataImportProcess dataImportProcess = null; - try{ - if ( firstFile ){ - firstFile = false; - }else if ( !firstFile && (importNonFinishedPlots.equals( YES ) || importNonFinishedPlots.equals( NO ) ) ){ - importNonFinishedPlots = shouldImportNonFinishedRecords( filesToImport.length > 1); - } - - if( importNonFinishedPlots.equals( JOptionPane.CLOSED_OPTION ) ){ - break; - } - - boolean importNotFinished= importNonFinishedPlots.equals( YES ) || importNonFinishedPlots.equals( YES_TO_ALL ); - - dataImportProcess = dataImportService.getImportSummary(importedFile, importNotFinished); - importDialogProcessMonitor.startImport(dataImportProcess, frame, dataImportService, importedFile ); - - } catch (Exception e1) { - logger.error("Error importing data" , e1); //$NON-NLS-1$ - importDialogProcessMonitor.closeProgressmonitor(); - JOptionPane.showMessageDialog( frame, importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.3"), importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.7"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - JOptionPane.ERROR_MESSAGE); - logger.error("Error importing data from " + importedFile.getAbsolutePath() + " in format " + importType.name() , e1); //$NON-NLS-1$ //$NON-NLS-2$ - } finally { - IOUtils.closeQuietly(dataImportProcess); - } - } - forceRefreshGoogleEarth(); - } - }.start(); - break; - case CSV: - new Thread("Update using CSV Thread " ){ //$NON-NLS-1$ - @Override - public void run() { - - String[] ids = dataImportService.getEarthSurveyService().getKeyNamesForSurvey(); - String keyAttributesForSurvey = Arrays.toString( ids ); - - JOptionPane.showMessageDialog( - frame, - "The CSV files used must have columns with at least the headers for the key attributes " + keyAttributesForSurvey+ " followed by one or more attribute names ( see http://www.openforis.org/support/questions/80/changing-plot-attributes-in-the-collect-earth-database ) ", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - "CSV file format info", - JOptionPane.INFORMATION_MESSAGE); - - - for (final File importedFile : filesToImport) { - - CSVDataImportProcess importSurveyAsCsv = null; - try { - importSurveyAsCsv = dataImportService.getCsvImporterProcess(importedFile); - - if( importSurveyAsCsv != null ){ - importSurveyAsCsv.init(); - ProcessStatus status = importSurveyAsCsv.getStatus(); - status.setTotal( getTotalNumberOfLines( importedFile ) ); - if ( status != null && ! importSurveyAsCsv.getStatus().isError() ) { - ImportProcessMonitorDialog importProcessWorker = new ImportProcessMonitorDialog(importSurveyAsCsv, frame ); - importProcessWorker.start(); - } - } - } catch (Exception e1) { - JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.7") + "\n" + e1.getMessage(), importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.3"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - JOptionPane.ERROR_MESSAGE); - logger.error("Error importing data from " + importedFile.getAbsolutePath() + " in format " + importType , e1); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - } - }.start(); - break; - case FUSION: - break; - default: - break; - } - } - } + @Override + public void run() { - private long getTotalNumberOfLines(File importedFile) { - long count = 0; - BufferedReader br = null; try { - br = new BufferedReader(new InputStreamReader(new FileInputStream(importedFile))); - - while ( br.readLine() != null) { - count++; - } - } catch (IOException e) { - logger.error("Error counting the number of lines in file " + importedFile.getAbsolutePath() , e) ; //$NON-NLS-1$ - }finally { - if( br!=null) { - try { - br.close(); - } catch (IOException e) { - logger.error("Error closing file reader " + importedFile.getAbsolutePath() , e) ; + monitorProgress(); + process.call(); + if( process.getStatus().isComplete() && exportFormat.equals( DataFormat.ZIP_WITH_XML ) && recordsToExport.equals(RecordsToExport.MODIFIED_SINCE_LAST_EXPORT) ){ + String surveyName = ""; //$NON-NLS-1$ + if( earthSurveyService.getCollectSurvey()!= null ){ + surveyName = earthSurveyService.getCollectSurvey().getName(); } + localPropertiesService.setLastExportedDate( surveyName ); + } + if( process.getStatus().isComplete() && ( exportFormat.equals( DataFormat.CSV ) || exportFormat.equals( DataFormat.FUSION ) || exportFormat.equals( DataFormat.KML_FILE ) ) ) { + CollectEarthUtils.openFile( exportToFile ); + } + } catch (final Exception e) { + logger.error("Error starting the process", e); //$NON-NLS-1$ } - return count; + } + + } From dd4021b7ddc4de50a856ff33da66096c51ddbd1d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:34 +0100 Subject: [PATCH 0285/1620] New translations CsvColumn.java (Spanish) --- .../earth/app/view/Messages_es.properties | 207 ++---------------- 1 file changed, 16 insertions(+), 191 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 88aa8edf1c..e56dd39728 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,208 +1,33 @@ package org.openforis.collect.earth.app.view; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.Arrays; +public class CsvColumn { -import javax.swing.JFrame; -import javax.swing.JOptionPane; + private Integer pos; + private String name; -import org.apache.commons.io.IOUtils; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.DataImportExportService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.io.data.CSVDataImportProcess; -import org.openforis.collect.io.data.XMLDataImportProcess; -import org.openforis.collect.manager.process.ProcessStatus; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public final class ImportActionListener implements ActionListener { - protected static final Integer YES = 0; - protected static final Integer YES_TO_ALL = 1; - protected static final Integer NO = 2; - protected static final Integer NO_TO_ALL = 3; - - private final DataFormat importFormat; - private JFrame frame; - private LocalPropertiesService localPropertiesService; - private DataImportExportService dataImportService; - private Logger logger = LoggerFactory.getLogger( ImportActionListener.class ); - - public ImportActionListener(DataFormat importFormat, JFrame frame, LocalPropertiesService localPropertiesService, DataImportExportService dataImportService) { - this.importFormat = importFormat; - this.frame = frame; - this.localPropertiesService = localPropertiesService; - this.dataImportService = dataImportService; + public CsvColumn(Integer pos, String name) { + this.pos = pos; + this.name = name; } @Override - public void actionPerformed(ActionEvent e) { - try{ - CollectEarthWindow.startWaiting(frame); - importDataFrom(e, importFormat ); - }finally{ - CollectEarthWindow.endWaiting( frame); - } - + public String toString() { + return name; } - - private void forceRefreshGoogleEarth() { - - EarthApp.executeKmlLoadAsynchronously( null ); + public Integer getPos() { + return pos; } - private Integer shouldImportNonFinishedRecords( boolean moreThanOneFiles ) { - String message = "" //$NON-NLS-1$ - + Messages.getString("ImportActionListener.0") //$NON-NLS-1$ - +"
" //$NON-NLS-1$ - + Messages.getString("ImportActionListener.2") //$NON-NLS-1$ - + ""; - - if( !moreThanOneFiles ){ - - final int selectedOption = JOptionPane.showConfirmDialog(null, - message //$NON-NLS-1$ - ,Messages.getString("ImportActionListener.3"), //$NON-NLS-1$ - JOptionPane.YES_NO_OPTION); - if (selectedOption == JOptionPane.YES_OPTION){ - return YES; - }else if (selectedOption == JOptionPane.NO_OPTION){ - return NO; - }else{ - return JOptionPane.CLOSED_OPTION; - } - }else{ - - String[] buttons = { Messages.getString("YES"), Messages.getString("YES_TO_ALL"), Messages.getString("NO"), Messages.getString("NO_TO_ALL") }; - - return JOptionPane.showOptionDialog(null, message, Messages.getString("ImportActionListener.3") , - JOptionPane.WARNING_MESSAGE, 0, null, buttons, buttons[1]); - - } + public void setPos(Integer pos) { + this.pos = pos; } - private void importDataFrom(final ActionEvent e, final DataFormat importType) { - File[] filesToImport = JFileChooserExistsAware.getFileChooserResults( importType, false, true, null, localPropertiesService, frame ); - final ImportXMLDialogProcessMonitor importDialogProcessMonitor = new ImportXMLDialogProcessMonitor(); - if (filesToImport != null) { - - - switch (importType) { - case ZIP_WITH_XML: - new Thread("XML Import Thread " ){ //$NON-NLS-1$ - @Override - public void run() { - Integer importNonFinishedPlots = shouldImportNonFinishedRecords( filesToImport.length > 1); - boolean firstFile = true; - - for (final File importedFile : filesToImport) { - XMLDataImportProcess dataImportProcess = null; - try{ - if ( firstFile ){ - firstFile = false; - }else if ( !firstFile && (importNonFinishedPlots.equals( YES ) || importNonFinishedPlots.equals( NO ) ) ){ - importNonFinishedPlots = shouldImportNonFinishedRecords( filesToImport.length > 1); - } - - if( importNonFinishedPlots.equals( JOptionPane.CLOSED_OPTION ) ){ - break; - } - - boolean importNotFinished= importNonFinishedPlots.equals( YES ) || importNonFinishedPlots.equals( YES_TO_ALL ); - - dataImportProcess = dataImportService.getImportSummary(importedFile, importNotFinished); - importDialogProcessMonitor.startImport(dataImportProcess, frame, dataImportService, importedFile ); - - } catch (Exception e1) { - logger.error("Error importing data" , e1); //$NON-NLS-1$ - importDialogProcessMonitor.closeProgressmonitor(); - JOptionPane.showMessageDialog( frame, importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.3"), importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.7"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - JOptionPane.ERROR_MESSAGE); - logger.error("Error importing data from " + importedFile.getAbsolutePath() + " in format " + importType.name() , e1); //$NON-NLS-1$ //$NON-NLS-2$ - } finally { - IOUtils.closeQuietly(dataImportProcess); - } - } - forceRefreshGoogleEarth(); - } - }.start(); - break; - case CSV: - new Thread("Update using CSV Thread " ){ //$NON-NLS-1$ - @Override - public void run() { - - String[] ids = dataImportService.getEarthSurveyService().getKeyNamesForSurvey(); - String keyAttributesForSurvey = Arrays.toString( ids ); - - JOptionPane.showMessageDialog( - frame, - "The CSV files used must have columns with at least the headers for the key attributes " + keyAttributesForSurvey+ " followed by one or more attribute names ( see http://www.openforis.org/support/questions/80/changing-plot-attributes-in-the-collect-earth-database ) ", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - "CSV file format info", - JOptionPane.INFORMATION_MESSAGE); - - - for (final File importedFile : filesToImport) { - - CSVDataImportProcess importSurveyAsCsv = null; - try { - importSurveyAsCsv = dataImportService.getCsvImporterProcess(importedFile); - - if( importSurveyAsCsv != null ){ - importSurveyAsCsv.init(); - ProcessStatus status = importSurveyAsCsv.getStatus(); - status.setTotal( getTotalNumberOfLines( importedFile ) ); - if ( status != null && ! importSurveyAsCsv.getStatus().isError() ) { - ImportProcessMonitorDialog importProcessWorker = new ImportProcessMonitorDialog(importSurveyAsCsv, frame ); - importProcessWorker.start(); - } - } - } catch (Exception e1) { - JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.7") + "\n" + e1.getMessage(), importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.3"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - JOptionPane.ERROR_MESSAGE); - logger.error("Error importing data from " + importedFile.getAbsolutePath() + " in format " + importType , e1); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - } - }.start(); - break; - case FUSION: - break; - default: - break; - } - } + public String getName() { + return name; } - private long getTotalNumberOfLines(File importedFile) { - long count = 0; - BufferedReader br = null; - try { - br = new BufferedReader(new InputStreamReader(new FileInputStream(importedFile))); - - while ( br.readLine() != null) { - count++; - } - } catch (IOException e) { - logger.error("Error counting the number of lines in file " + importedFile.getAbsolutePath() , e) ; //$NON-NLS-1$ - }finally { - if( br!=null) { - try { - br.close(); - } catch (IOException e) { - logger.error("Error closing file reader " + importedFile.getAbsolutePath() , e) ; - } - } - - - } - return count; + public void setName(String name) { + this.name = name; } } From aa1b88738482635ff754f5a4dd83caffbd064072 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:35 +0100 Subject: [PATCH 0286/1620] New translations CollectEarthWindow.java (French) --- .../earth/app/view/Messages_fr.properties | 506 +++++++++--------- 1 file changed, 249 insertions(+), 257 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index d275a15df8..ee88f71564 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,324 +1,316 @@ package org.openforis.collect.earth.app.view; import java.awt.Color; -import java.awt.Dimension; -import java.awt.Frame; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.Window; +import java.awt.event.ActionListener; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; import java.io.File; import java.io.IOException; -import java.util.List; +import java.net.MalformedURLException; -import javax.swing.DefaultComboBoxModel; +import javax.swing.BorderFactory; +import javax.swing.ImageIcon; import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JDialog; -import javax.swing.JFileChooser; +import javax.swing.JFrame; import javax.swing.JLabel; +import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; - -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.collect.earth.sampler.utils.ProduceCsvFiles; -import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult; -import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult.ErrorType; -import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; -import org.openforis.collect.manager.validation.SurveyValidator.ValidationParameters; -import org.openforis.collect.model.CollectSurvey; +import javax.swing.JTextField; +import javax.swing.SwingConstants; +import javax.swing.SwingUtilities; +import javax.swing.Timer; +import javax.swing.WindowConstants; +import javax.swing.border.Border; + +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.EarthConstants.OperationMode; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - -public class FileDividerToolDlg extends JDialog{ - - private static final long serialVersionUID = 2241706750062961024L; - private static final int MAX_FILES = 500; - private CollectSurvey survey; - private transient Logger logger = LoggerFactory.getLogger( FileDividerToolDlg.class); - private JComboBox numberOfFiles ; - private JCheckBox randomSelector; - private JComboBox csvColumns; - private JFilePicker outputFolder; - private JButton generateGrids; - private JFilePicker filePicker; - - public static void open( Frame owner, CollectSurvey survey){ - FileDividerToolDlg dlg = new FileDividerToolDlg(owner, survey); - dlg.setVisible(true); +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; + +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ +@Component +@Lazy(false) +public class CollectEarthWindow implements InitializingBean, DisposableBean{ + + @Autowired + private LocalPropertiesService localPropertiesService; + + @Autowired + private EarthSurveyService earthSurveyService; + + @Autowired + private CollectEarthTransferHandler collectEarthTransferHandler; + + @Autowired + private CollectEarthMenu collectEarthMenu; + + public static void endWaiting(Window frame) { + frame.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); } - public FileDividerToolDlg( Frame owner,CollectSurvey survey ) { - super(owner); - this.survey = survey; - this.setModal(true); - this.setSize( new Dimension(700, 350)); - this.setLocationRelativeTo( owner ); - this.setTitle("Tool for dividing large CSV into smaller ones"); - initLayout(); + public static void startWaiting(Window frame) { + frame.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); } - private void initLayout() { - final JPanel panel = new JPanel(new GridBagLayout()); - GridBagConstraints c = new GridBagConstraints(); - - int row = 0; + private JFrame frame; + private final Logger logger = LoggerFactory.getLogger(CollectEarthWindow.class); + private JTextField operatorTextField; - c.fill = GridBagConstraints.BOTH; - c.gridx = 0; - c.gridwidth = 2; - c.gridy = row++; + public static final Color ERROR_COLOR = new Color(225, 124, 124); - panel.add( getCsvFilePicker(), c ); - c.gridwidth = 1; - c.gridy = row++; - - c.gridx = 0; + public CollectEarthWindow() throws IOException { + // Create and set up the window. + JFrame framePriv = new JFrame(Messages.getString("CollectEarthWindow.19"));//$NON-NLS-1$ - panel.add( new JLabel("Number of files to split the CSV into"), c ); - - c.gridx = 1; - panel.add( getNumberOfFilesSelector(), c ); - - c.gridx = 0; - c.gridy = row++; - c.gridwidth = 2; - panel.add( getRandomSelector(), c ); - - c.gridy = row++; - c.gridx = 0; - c.gridwidth = 1; - panel.add( new JLabel("Split files by strata (values of the column i.e : region )"), c ); - - c.gridx = 1; - panel.add( getColumnSelector(), c ); - - c.gridx = 0; - c.gridy = row++; - c.gridwidth = 2; - panel.add( getOutputFolder(), c ); - - c.gridx = 0; - c.gridy = row; + setFrame(framePriv); + } - panel.add( getGenerateButton(), c ); + private void init() { + Messages.setLocale(localPropertiesService.getUiLanguage().getLocale()); + javax.swing.SwingUtilities.invokeLater( () -> { + try { + CollectEarthWindow.this.openWindow(); + } catch (final Exception e) { + logger.error("Cannot start Earth App", e); //$NON-NLS-1$ + System.exit(0); + } + }); + } + @Override + public void afterPropertiesSet() throws Exception { + init(); + } - this.add(panel); + @Override + public void destroy() throws Exception { + SwingUtilities.invokeAndWait( () -> CollectEarthWindow.this.getFrame().dispose() ); } - private JButton getGenerateButton() { - if( generateGrids == null ){ - generateGrids = new JButton("Divide file"); - generateGrids.setEnabled( false ); - generateGrids.addActionListener( e -> { - String sourceCsvFile = getCsvFilePicker().getSelectedFilePath(); - String destinationFolder = getOutputFolder().getSelectedFilePath(); - boolean randomizeLines = getRandomSelector().isSelected(); - Integer randomizeUsingColumnValues = null; - if( ( (CsvColumn) getColumnSelector().getSelectedItem() )!=null ){ - randomizeUsingColumnValues = ( (CsvColumn) getColumnSelector().getSelectedItem() ).getPos(); - } - Integer filesToDivideInto = getNumberOfFilesSelector().getSelectedIndex()+1; - ProduceCsvFiles produceCsvFiles = new ProduceCsvFiles(survey, sourceCsvFile, destinationFolder, randomizeLines, randomizeUsingColumnValues, filesToDivideInto); - File dest = produceCsvFiles.divideIntoFiles(); + private void addWindowClosingListener() { + getFrame().addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) { try { - CollectEarthUtils.openFolderInExplorer( dest.getAbsolutePath() ); - } catch (IOException e1) { - logger.error(" Error opening the destination folder", e); - } - }); - } - return generateGrids; - } - - private JFilePicker getOutputFolder() { - if( outputFolder == null ){ - outputFolder = new JFilePicker("Select the output folder" , null, "Select...", DlgMode.MODE_SAVE); - outputFolder.getFileChooser().setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); - outputFolder.setEnabled(false); + final String keepOpen = Messages.getString("CollectEarthWindow.37"); //$NON-NLS-1$ + final String close = Messages.getString("CollectEarthWindow.42"); //$NON-NLS-1$ + final String[] options = new String[] { close, keepOpen }; + + final int confirmation = JOptionPane.showOptionDialog(getFrame(), + Messages.getString("CollectEarthWindow.22"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.23"), //$NON-NLS-1$ + JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, keepOpen); + + if (confirmation == JOptionPane.YES_OPTION) { + final Thread stopServer = new Thread("Stopping server") { + @Override + public void run() { + try { + EarthApp.quitServer(); + } catch (final Exception e) { + logger.error("Error when trying to closing the server", e); //$NON-NLS-1$ + } + } + }; - outputFolder.addChangeListener( new DocumentListener() { + getFrame().setVisible(false); + getFrame().dispose(); + stopServer.start(); + Thread.sleep(5000); - @Override - public void removeUpdate(DocumentEvent e) { - // No need to do anything + System.exit(0); + } + }catch (final InterruptedException e1) { + logger.error("Error when interupting thread", e1); //$NON-NLS-1$ + Thread.currentThread().interrupt(); + } catch (final Exception e1) { + logger.error("Error when trying to shutdown the server when window is closed", e1); //$NON-NLS-1$ } - @Override - public void insertUpdate(DocumentEvent e) { - String outputFolderPath = outputFolder.getSelectedFilePath(); - File out = new File( outputFolderPath ); - getGenerateButton().setEnabled(out.exists() ); - } + } + }); + } - @Override - public void changedUpdate(DocumentEvent e) { - // No need to react to the update - } - }); + private void disableMenuItems() { + if (localPropertiesService.getOperationMode().equals(OperationMode.CLIENT_MODE)) { + for (final JMenuItem menuItem : collectEarthMenu.getServerMenuItems()) { + menuItem.setEnabled(false); + } } - return outputFolder; } - - private void enableOtherControls(boolean validFile) { - getRandomSelector().setEnabled( true ); - getColumnSelector().setEnabled(validFile); - getNumberOfFilesSelector().setEnabled(true); - getOutputFolder().setEnabled(true); - setColumns( validFile ); + private void displayWindow() { + getFrame().setLocationRelativeTo(null); + getFrame().pack(); + getFrame().setVisible(true); } + protected ActionListener getCloseActionListener() { + return e -> getFrame().dispatchEvent(new WindowEvent(getFrame(), WindowEvent.WINDOW_CLOSING)); + } - private void setColumns( boolean validFile){ - if( validFile ){ - CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); - - List expectedHeaders = cegtg.getExpectedHeaders(survey); - CsvColumn[] columns = new CsvColumn[ expectedHeaders.size()+1 ]; - CsvColumn column = new CsvColumn(null,"DO NOT STRATIFY"); - columns[0] = column; - - int i = 0; - for (String header : expectedHeaders) { - column = new CsvColumn(i++,"Use :" + header); - columns[i] = column; - } + public JFrame getFrame() { + return frame; + } - getColumnSelector().setModel( new DefaultComboBoxModel( columns )); - }else{ - getColumnSelector().setModel( new DefaultComboBoxModel()); - } + private String getOperator() { + return localPropertiesService.getOperator(); } + private void initializeMenu() { - private JComboBox getColumnSelector() { - if( csvColumns == null ){ - csvColumns = new JComboBox<>(); - csvColumns.setEnabled(false); - } - return csvColumns; - } + collectEarthMenu.removeAll(); + collectEarthMenu.init(); + getFrame().setJMenuBar( collectEarthMenu ); - private JCheckBox getRandomSelector() { - if( randomSelector == null ){ - randomSelector = new JCheckBox("Randomize the order of the lines from the source CSV file" , false); - randomSelector.setEnabled( false); - } - return randomSelector; + disableMenuItems(); } - private JComboBox getNumberOfFilesSelector() { - if( numberOfFiles == null ){ - Integer[] items = new Integer[MAX_FILES]; - for (int i =1; i<= MAX_FILES; i++) { - items[i-1] = Integer.valueOf(i); + private void updateOperatorName() { + final String operatorName = operatorTextField.getText().trim(); + if( !operatorName.equals(localPropertiesService.getOperator() ) ) { + if (operatorName.length() > 5 && operatorName.length() < 50 ) { + localPropertiesService.saveOperator(operatorName); + operatorTextField.setBackground(Color.white); + JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.65"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.66"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ + } else{ + JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.33"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.34"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + operatorTextField.setText(getOperator()); } - numberOfFiles = new JComboBox<>(items); - numberOfFiles.setEnabled( false ); } - return numberOfFiles; } - private JFilePicker getCsvFilePicker() { - if( filePicker == null ){ - filePicker = new JFilePicker("Choose the CSV file with the sampling design (plots)", null, "Explore", DlgMode.MODE_OPEN); + private void initializePanel() { + final JPanel pane = new JPanel(new GridBagLayout()); - filePicker.getFileChooser().setAcceptAllFileFilterUsed(false); - filePicker.addFileTypeFilter("csv", " CSV file with plot (sampling design)", true); + final Border raisedetched = BorderFactory.createRaisedBevelBorder(); + pane.setBorder(raisedetched); - filePicker.addChangeListener( new DocumentListener() { + // Handle Drag and Drop of files into the panel + pane.setTransferHandler(collectEarthTransferHandler); - @Override - public void removeUpdate(DocumentEvent e) { - // No need to validate - } + final GridBagConstraints c = new GridBagConstraints(); - @Override - public void insertUpdate(DocumentEvent e) { - validateCsv( filePicker.getTextField().getText() ); - } + operatorTextField = new JTextField(getOperator(), 30); + if (StringUtils.isBlank(getOperator())) { + operatorTextField.setBackground(ERROR_COLOR); + } - private boolean validateCsv(String filePath) { - boolean validFile = true; - try { + final JLabel operatorTextLabel = new JLabel(Messages.getString("CollectEarthWindow.26"), SwingConstants.CENTER); //$NON-NLS-1$ + operatorTextLabel.setSize(100, 20); - filePicker.setTextBackground( Color.white); + // final JButton updateOperator = new JButton(Messages.getString("CollectEarthWindow.27")); //$NON-NLS-1$ + c.insets = new Insets(3, 3, 3, 3); + c.fill = GridBagConstraints.HORIZONTAL; + c.gridx = 0; + c.gridy = 0; + pane.add(operatorTextLabel, c); - if( CsvReaderUtils.isCsvFile( filePath )){ - CollectEarthGridTemplateGenerator cetg = new CollectEarthGridTemplateGenerator(); + c.weightx = 0; + c.gridx = 1; + c.gridy = 0; + pane.add(operatorTextField, c); - File csvFile = new File( filePath ); - ValidationParameters validationParameters = new ValidationParameters(); - validationParameters.setValidateOnlyFirstLines(false); - CSVFileValidationResult validationResults = cetg.validate(csvFile, survey, validationParameters ); + c.gridx = 2; + c.gridy = 0; + // pane.add(updateOperator, c); - validFile = validationResults.isSuccessful(); - if( - !validFile - // If the message is that there are too many rows then we ignore the validation! - && ( - validationResults.getErrorType().equals( ErrorType.INVALID_NUMBER_OF_PLOTS_TOO_LARGE) - || - validationResults.getErrorType().equals( ErrorType.INVALID_NUMBER_OF_PLOTS_WARNING) - ) - ){ - validFile = true; + c.gridx = 0; + c.gridy++; + c.gridwidth = GridBagConstraints.REMAINDER; + pane.add(new JLabel(Messages.getString("CollectEarthWindow.28") + "
" //$NON-NLS-1$ //$NON-NLS-2$ + + Messages.getString("CollectEarthWindow.30")), c); //$NON-NLS-1$ - } + c.gridx = 0; + c.gridy++; + c.gridwidth = GridBagConstraints.REMAINDER; + c.fill = GridBagConstraints.NONE; + final JButton propertiesButton = new JButton(Messages.getString("CollectEarthWindow.15")); //$NON-NLS-1$ + propertiesButton.addActionListener( collectEarthMenu.getPropertiesAction( frame ) ); + pane.add(propertiesButton, c); + + getFrame().getContentPane().add(pane); + + // Three seconds after the last key is typed on hte text field the operator name changes on the properties service + Timer timerOperatorChanged = new Timer(3000, e-> updateOperatorName() ); + + operatorTextField.addKeyListener( new KeyAdapter() { + @Override + public void keyTyped(KeyEvent e) { + timerOperatorChanged.restart(); + } + }); + } - if( !validFile ){ - filePicker.setTextBackground( Color.yellow); - switch ( validationResults.getErrorType() ) { - case INVALID_FILE_TYPE: - filePicker.setTextBackground( Color.red); - JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), "The expected file type is CSV or CED ", "Expected File Type", JOptionPane.ERROR_MESSAGE); - break; - - case INVALID_HEADERS: - JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), String.format("The expected columns in the CSV for the survey %s are %s", survey.getName(), validationResults.getExpectedHeaders() ) , "Columns in CSV do not match survey", JOptionPane.ERROR_MESSAGE); - break; - - case INVALID_NUMBER_OF_COLUMNS: - JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), String.format("The number of columns in the CSV file do not coincide with the expercted columns expected for the survey %s /n%s", survey.getName(), validationResults.getExpectedHeaders() ), "Expected File Type", JOptionPane.ERROR_MESSAGE); - break; - - case INVALID_VALUES_IN_CSV: - // IN THIS CASE THE CELL RENDERER TAKES CARE OF HIGHLIGHTING THE CELLS!!! - JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), "The content of the CSV file is not correct!! The values on some cells are incorrect for the survey " + survey.getName() , "CSV content is not correct", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - break; - - default: - break; - } - } + private void initializeWindow() { + + // Initialize the translations + Messages.setLocale(localPropertiesService.getUiLanguage().getLocale()); + getFrame().setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); + getFrame().setResizable(false); + try { + getFrame().setIconImage( + new ImageIcon(new File("images/smallOpenForisBanner.png").toURI().toURL()).getImage()); //$NON-NLS-1$ + } catch (final MalformedURLException e2) { + logger.error(Messages.getString("CollectEarthWindow.21"), e2); //$NON-NLS-1$ + } - enableOtherControls( validFile ); + addWindowClosingListener(); + } - }else{ + protected void openWindow() { + initializeWindow(); + initializePanel(); + initializeMenu(); + displayWindow(); - JOptionPane.showMessageDialog(FileDividerToolDlg.this, String.format("The file in %s is NOT A CSV file ", filePath) ); - filePicker.setTextBackground( Color.red); - } - } catch (Exception e) { - JOptionPane.showMessageDialog(FileDividerToolDlg.this, String.format("The file in %s is NOT A CSV file ", filePath) ); - logger.error( "Error while validating the CSV file", e); - validFile = false; - } - return validFile; - } + if (StringUtils.isBlank(getOperator())) { + JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.35"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.36"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + } - @Override - public void changedUpdate(DocumentEvent e) { - validateCsv( filePicker.getTextField().getText() ); - } - }); + changeFrameTitle(); + } + + public void changeFrameTitle() { + String name = " - No survey loaded"; + if (earthSurveyService.getCollectSurvey() != null) { + if (!StringUtils.isBlank(earthSurveyService.getCollectSurvey() + .getProjectName(localPropertiesService.getUiLanguage().getLocale().getLanguage()))) { + name = " - " + earthSurveyService.getCollectSurvey() + .getProjectName(localPropertiesService.getUiLanguage().getLocale().getLanguage()); + } else if (!StringUtils.isBlank(earthSurveyService.getCollectSurvey().getProjectName())) { + name = " - " + earthSurveyService.getCollectSurvey().getProjectName(); + } else { + name = " - " + earthSurveyService.getCollectSurvey() + .getDescription(localPropertiesService.getUiLanguage().getLocale().getLanguage()); + } } - return filePicker ; + getFrame().setTitle(Messages.getString("CollectEarthWindow.19") + name); + } + + void setFrame(JFrame frame) { + this.frame = frame; } -} +} \ No newline at end of file From 27af80c325e8fd0642b9c1af6ccf7e7aacea0be9 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:36 +0100 Subject: [PATCH 0287/1620] New translations CollectEarthWindow.java (Spanish) --- .../earth/app/view/Messages_es.properties | 317 +++++++++++++++++- 1 file changed, 300 insertions(+), 17 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index e56dd39728..ee88f71564 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,33 +1,316 @@ package org.openforis.collect.earth.app.view; -public class CsvColumn { +import java.awt.Color; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.Window; +import java.awt.event.ActionListener; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.io.File; +import java.io.IOException; +import java.net.MalformedURLException; - private Integer pos; - private String name; +import javax.swing.BorderFactory; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JTextField; +import javax.swing.SwingConstants; +import javax.swing.SwingUtilities; +import javax.swing.Timer; +import javax.swing.WindowConstants; +import javax.swing.border.Border; - public CsvColumn(Integer pos, String name) { - this.pos = pos; - this.name = name; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.EarthConstants.OperationMode; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; + +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ +@Component +@Lazy(false) +public class CollectEarthWindow implements InitializingBean, DisposableBean{ + + @Autowired + private LocalPropertiesService localPropertiesService; + + @Autowired + private EarthSurveyService earthSurveyService; + + @Autowired + private CollectEarthTransferHandler collectEarthTransferHandler; + + @Autowired + private CollectEarthMenu collectEarthMenu; + + public static void endWaiting(Window frame) { + frame.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); + } + + public static void startWaiting(Window frame) { + frame.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); } + private JFrame frame; + private final Logger logger = LoggerFactory.getLogger(CollectEarthWindow.class); + private JTextField operatorTextField; + + public static final Color ERROR_COLOR = new Color(225, 124, 124); + + public CollectEarthWindow() throws IOException { + // Create and set up the window. + JFrame framePriv = new JFrame(Messages.getString("CollectEarthWindow.19"));//$NON-NLS-1$ + + setFrame(framePriv); + } + + private void init() { + Messages.setLocale(localPropertiesService.getUiLanguage().getLocale()); + javax.swing.SwingUtilities.invokeLater( () -> { + try { + CollectEarthWindow.this.openWindow(); + } catch (final Exception e) { + logger.error("Cannot start Earth App", e); //$NON-NLS-1$ + System.exit(0); + } + }); + } @Override - public String toString() { - return name; + public void afterPropertiesSet() throws Exception { + init(); } - public Integer getPos() { - return pos; + @Override + public void destroy() throws Exception { + SwingUtilities.invokeAndWait( () -> CollectEarthWindow.this.getFrame().dispose() ); } - public void setPos(Integer pos) { - this.pos = pos; + private void addWindowClosingListener() { + getFrame().addWindowListener(new WindowAdapter() { + + @Override + public void windowClosing(WindowEvent e) { + try { + final String keepOpen = Messages.getString("CollectEarthWindow.37"); //$NON-NLS-1$ + final String close = Messages.getString("CollectEarthWindow.42"); //$NON-NLS-1$ + final String[] options = new String[] { close, keepOpen }; + + final int confirmation = JOptionPane.showOptionDialog(getFrame(), + Messages.getString("CollectEarthWindow.22"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.23"), //$NON-NLS-1$ + JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, keepOpen); + + if (confirmation == JOptionPane.YES_OPTION) { + final Thread stopServer = new Thread("Stopping server") { + @Override + public void run() { + try { + EarthApp.quitServer(); + } catch (final Exception e) { + logger.error("Error when trying to closing the server", e); //$NON-NLS-1$ + } + } + }; + + getFrame().setVisible(false); + getFrame().dispose(); + stopServer.start(); + Thread.sleep(5000); + + System.exit(0); + } + }catch (final InterruptedException e1) { + logger.error("Error when interupting thread", e1); //$NON-NLS-1$ + Thread.currentThread().interrupt(); + } catch (final Exception e1) { + logger.error("Error when trying to shutdown the server when window is closed", e1); //$NON-NLS-1$ + } + + } + }); + } + + private void disableMenuItems() { + if (localPropertiesService.getOperationMode().equals(OperationMode.CLIENT_MODE)) { + for (final JMenuItem menuItem : collectEarthMenu.getServerMenuItems()) { + menuItem.setEnabled(false); + } + } } - public String getName() { - return name; + private void displayWindow() { + getFrame().setLocationRelativeTo(null); + getFrame().pack(); + getFrame().setVisible(true); } - public void setName(String name) { - this.name = name; + protected ActionListener getCloseActionListener() { + return e -> getFrame().dispatchEvent(new WindowEvent(getFrame(), WindowEvent.WINDOW_CLOSING)); + } + + public JFrame getFrame() { + return frame; + } + + private String getOperator() { + return localPropertiesService.getOperator(); + } + + private void initializeMenu() { + + collectEarthMenu.removeAll(); + collectEarthMenu.init(); + getFrame().setJMenuBar( collectEarthMenu ); + + disableMenuItems(); } -} + + private void updateOperatorName() { + final String operatorName = operatorTextField.getText().trim(); + if( !operatorName.equals(localPropertiesService.getOperator() ) ) { + if (operatorName.length() > 5 && operatorName.length() < 50 ) { + localPropertiesService.saveOperator(operatorName); + operatorTextField.setBackground(Color.white); + JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.65"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.66"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ + } else{ + JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.33"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.34"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + operatorTextField.setText(getOperator()); + } + } + } + + private void initializePanel() { + final JPanel pane = new JPanel(new GridBagLayout()); + + final Border raisedetched = BorderFactory.createRaisedBevelBorder(); + pane.setBorder(raisedetched); + + // Handle Drag and Drop of files into the panel + pane.setTransferHandler(collectEarthTransferHandler); + + final GridBagConstraints c = new GridBagConstraints(); + + operatorTextField = new JTextField(getOperator(), 30); + if (StringUtils.isBlank(getOperator())) { + operatorTextField.setBackground(ERROR_COLOR); + } + + final JLabel operatorTextLabel = new JLabel(Messages.getString("CollectEarthWindow.26"), SwingConstants.CENTER); //$NON-NLS-1$ + operatorTextLabel.setSize(100, 20); + + // final JButton updateOperator = new JButton(Messages.getString("CollectEarthWindow.27")); //$NON-NLS-1$ + c.insets = new Insets(3, 3, 3, 3); + c.fill = GridBagConstraints.HORIZONTAL; + c.gridx = 0; + c.gridy = 0; + pane.add(operatorTextLabel, c); + + c.weightx = 0; + c.gridx = 1; + c.gridy = 0; + pane.add(operatorTextField, c); + + c.gridx = 2; + c.gridy = 0; + // pane.add(updateOperator, c); + + c.gridx = 0; + c.gridy++; + c.gridwidth = GridBagConstraints.REMAINDER; + pane.add(new JLabel(Messages.getString("CollectEarthWindow.28") + "
" //$NON-NLS-1$ //$NON-NLS-2$ + + Messages.getString("CollectEarthWindow.30")), c); //$NON-NLS-1$ + + c.gridx = 0; + c.gridy++; + c.gridwidth = GridBagConstraints.REMAINDER; + c.fill = GridBagConstraints.NONE; + final JButton propertiesButton = new JButton(Messages.getString("CollectEarthWindow.15")); //$NON-NLS-1$ + propertiesButton.addActionListener( collectEarthMenu.getPropertiesAction( frame ) ); + pane.add(propertiesButton, c); + + getFrame().getContentPane().add(pane); + + // Three seconds after the last key is typed on hte text field the operator name changes on the properties service + Timer timerOperatorChanged = new Timer(3000, e-> updateOperatorName() ); + + operatorTextField.addKeyListener( new KeyAdapter() { + @Override + public void keyTyped(KeyEvent e) { + timerOperatorChanged.restart(); + } + }); + } + + private void initializeWindow() { + + // Initialize the translations + Messages.setLocale(localPropertiesService.getUiLanguage().getLocale()); + getFrame().setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); + getFrame().setResizable(false); + try { + getFrame().setIconImage( + new ImageIcon(new File("images/smallOpenForisBanner.png").toURI().toURL()).getImage()); //$NON-NLS-1$ + } catch (final MalformedURLException e2) { + logger.error(Messages.getString("CollectEarthWindow.21"), e2); //$NON-NLS-1$ + } + + addWindowClosingListener(); + } + + protected void openWindow() { + initializeWindow(); + initializePanel(); + initializeMenu(); + displayWindow(); + + if (StringUtils.isBlank(getOperator())) { + JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.35"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.36"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + } + + changeFrameTitle(); + } + + public void changeFrameTitle() { + String name = " - No survey loaded"; + if (earthSurveyService.getCollectSurvey() != null) { + if (!StringUtils.isBlank(earthSurveyService.getCollectSurvey() + .getProjectName(localPropertiesService.getUiLanguage().getLocale().getLanguage()))) { + name = " - " + earthSurveyService.getCollectSurvey() + .getProjectName(localPropertiesService.getUiLanguage().getLocale().getLanguage()); + } else if (!StringUtils.isBlank(earthSurveyService.getCollectSurvey().getProjectName())) { + name = " - " + earthSurveyService.getCollectSurvey().getProjectName(); + } else { + name = " - " + earthSurveyService.getCollectSurvey() + .getDescription(localPropertiesService.getUiLanguage().getLocale().getLanguage()); + } + } + getFrame().setTitle(Messages.getString("CollectEarthWindow.19") + name); + } + + void setFrame(JFrame frame) { + this.frame = frame; + } + +} \ No newline at end of file From 646ea70ee6c6177d9d83ae76a37e3b01767033ef Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:37 +0100 Subject: [PATCH 0288/1620] New translations CollectEarthWindow.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 323 ++++++++++++++++-- 1 file changed, 286 insertions(+), 37 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 0ccb8f2366..ee88f71564 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,67 +1,316 @@ package org.openforis.collect.earth.app.view; +import java.awt.Color; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.Window; +import java.awt.event.ActionListener; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; import java.io.File; +import java.io.IOException; +import java.net.MalformedURLException; +import javax.swing.BorderFactory; +import javax.swing.ImageIcon; +import javax.swing.JButton; import javax.swing.JFrame; -import javax.swing.ProgressMonitor; +import javax.swing.JLabel; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JTextField; +import javax.swing.SwingConstants; +import javax.swing.SwingUtilities; +import javax.swing.Timer; +import javax.swing.WindowConstants; +import javax.swing.border.Border; -import org.openforis.collect.earth.app.CollectEarthUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.EarthConstants.OperationMode; +import org.openforis.collect.earth.app.desktop.EarthApp; import org.openforis.collect.earth.app.service.EarthSurveyService; import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.view.ExportActionListener.RecordsToExport; -import org.openforis.collect.io.data.DataExportStatus; -import org.openforis.collect.manager.process.AbstractProcess; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; -public class ExportProcessMonitorDialog extends ProcessMonitorDialog { +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ +@Component +@Lazy(false) +public class CollectEarthWindow implements InitializingBean, DisposableBean{ + @Autowired + private LocalPropertiesService localPropertiesService; - private RecordsToExport recordsToExport; - private DataFormat exportFormat; + @Autowired private EarthSurveyService earthSurveyService; - private LocalPropertiesService localPropertiesService; - private File exportToFile; - public ExportProcessMonitorDialog(AbstractProcess exportProcess, JFrame parentFrame, RecordsToExport recordsToExport, DataFormat exportFormat, EarthSurveyService earthSurveyService, File exportToFile, LocalPropertiesService localPropertiesService ) { - super(); - this.process = exportProcess; - this.recordsToExport = recordsToExport; - this.exportFormat = exportFormat; - this.earthSurveyService = earthSurveyService; - this.exportToFile = exportToFile; - this.localPropertiesService = localPropertiesService; - progressMonitor = new ProgressMonitor(parentFrame, Messages.getString("ExportDialogProcessMonitor.0"), Messages.getString("ExportDialogProcessMonitor.1"), 0, 100); //$NON-NLS-1$ //$NON-NLS-2$ - progressMonitor.setMillisToPopup(1000); - + @Autowired + private CollectEarthTransferHandler collectEarthTransferHandler; + + @Autowired + private CollectEarthMenu collectEarthMenu; + + public static void endWaiting(Window frame) { + frame.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); + } + + public static void startWaiting(Window frame) { + frame.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); + } + + private JFrame frame; + private final Logger logger = LoggerFactory.getLogger(CollectEarthWindow.class); + private JTextField operatorTextField; + + public static final Color ERROR_COLOR = new Color(225, 124, 124); + + public CollectEarthWindow() throws IOException { + // Create and set up the window. + JFrame framePriv = new JFrame(Messages.getString("CollectEarthWindow.19"));//$NON-NLS-1$ + + setFrame(framePriv); } - protected String getProcessActionMessage() { - return Messages.getString("ExportDialogProcessMonitor.4"); //$NON-NLS-1$ + private void init() { + Messages.setLocale(localPropertiesService.getUiLanguage().getLocale()); + javax.swing.SwingUtilities.invokeLater( () -> { + try { + CollectEarthWindow.this.openWindow(); + } catch (final Exception e) { + logger.error("Cannot start Earth App", e); //$NON-NLS-1$ + System.exit(0); + } + }); + } + @Override + public void afterPropertiesSet() throws Exception { + init(); } @Override - public void run() { + public void destroy() throws Exception { + SwingUtilities.invokeAndWait( () -> CollectEarthWindow.this.getFrame().dispose() ); + } - try { - monitorProgress(); - process.call(); - if( process.getStatus().isComplete() && exportFormat.equals( DataFormat.ZIP_WITH_XML ) && recordsToExport.equals(RecordsToExport.MODIFIED_SINCE_LAST_EXPORT) ){ - String surveyName = ""; //$NON-NLS-1$ - if( earthSurveyService.getCollectSurvey()!= null ){ - surveyName = earthSurveyService.getCollectSurvey().getName(); + private void addWindowClosingListener() { + getFrame().addWindowListener(new WindowAdapter() { + + @Override + public void windowClosing(WindowEvent e) { + try { + final String keepOpen = Messages.getString("CollectEarthWindow.37"); //$NON-NLS-1$ + final String close = Messages.getString("CollectEarthWindow.42"); //$NON-NLS-1$ + final String[] options = new String[] { close, keepOpen }; + + final int confirmation = JOptionPane.showOptionDialog(getFrame(), + Messages.getString("CollectEarthWindow.22"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.23"), //$NON-NLS-1$ + JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, keepOpen); + + if (confirmation == JOptionPane.YES_OPTION) { + final Thread stopServer = new Thread("Stopping server") { + @Override + public void run() { + try { + EarthApp.quitServer(); + } catch (final Exception e) { + logger.error("Error when trying to closing the server", e); //$NON-NLS-1$ + } + } + }; + + getFrame().setVisible(false); + getFrame().dispose(); + stopServer.start(); + Thread.sleep(5000); + + System.exit(0); + } + }catch (final InterruptedException e1) { + logger.error("Error when interupting thread", e1); //$NON-NLS-1$ + Thread.currentThread().interrupt(); + } catch (final Exception e1) { + logger.error("Error when trying to shutdown the server when window is closed", e1); //$NON-NLS-1$ } - localPropertiesService.setLastExportedDate( surveyName ); } + }); + } - if( process.getStatus().isComplete() && ( exportFormat.equals( DataFormat.CSV ) || exportFormat.equals( DataFormat.FUSION ) || exportFormat.equals( DataFormat.KML_FILE ) ) ) { - CollectEarthUtils.openFile( exportToFile ); + private void disableMenuItems() { + if (localPropertiesService.getOperationMode().equals(OperationMode.CLIENT_MODE)) { + for (final JMenuItem menuItem : collectEarthMenu.getServerMenuItems()) { + menuItem.setEnabled(false); } + } + } + + private void displayWindow() { + getFrame().setLocationRelativeTo(null); + getFrame().pack(); + getFrame().setVisible(true); + } - } catch (final Exception e) { - logger.error("Error starting the process", e); //$NON-NLS-1$ + protected ActionListener getCloseActionListener() { + return e -> getFrame().dispatchEvent(new WindowEvent(getFrame(), WindowEvent.WINDOW_CLOSING)); + } + + public JFrame getFrame() { + return frame; + } + + private String getOperator() { + return localPropertiesService.getOperator(); + } + + private void initializeMenu() { + + collectEarthMenu.removeAll(); + collectEarthMenu.init(); + getFrame().setJMenuBar( collectEarthMenu ); + + disableMenuItems(); + } + + private void updateOperatorName() { + final String operatorName = operatorTextField.getText().trim(); + if( !operatorName.equals(localPropertiesService.getOperator() ) ) { + if (operatorName.length() > 5 && operatorName.length() < 50 ) { + localPropertiesService.saveOperator(operatorName); + operatorTextField.setBackground(Color.white); + JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.65"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.66"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ + } else{ + JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.33"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.34"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + operatorTextField.setText(getOperator()); + } + } + } + + private void initializePanel() { + final JPanel pane = new JPanel(new GridBagLayout()); + + final Border raisedetched = BorderFactory.createRaisedBevelBorder(); + pane.setBorder(raisedetched); + + // Handle Drag and Drop of files into the panel + pane.setTransferHandler(collectEarthTransferHandler); + + final GridBagConstraints c = new GridBagConstraints(); + + operatorTextField = new JTextField(getOperator(), 30); + if (StringUtils.isBlank(getOperator())) { + operatorTextField.setBackground(ERROR_COLOR); + } + + final JLabel operatorTextLabel = new JLabel(Messages.getString("CollectEarthWindow.26"), SwingConstants.CENTER); //$NON-NLS-1$ + operatorTextLabel.setSize(100, 20); + + // final JButton updateOperator = new JButton(Messages.getString("CollectEarthWindow.27")); //$NON-NLS-1$ + c.insets = new Insets(3, 3, 3, 3); + c.fill = GridBagConstraints.HORIZONTAL; + c.gridx = 0; + c.gridy = 0; + pane.add(operatorTextLabel, c); + + c.weightx = 0; + c.gridx = 1; + c.gridy = 0; + pane.add(operatorTextField, c); + + c.gridx = 2; + c.gridy = 0; + // pane.add(updateOperator, c); + + c.gridx = 0; + c.gridy++; + c.gridwidth = GridBagConstraints.REMAINDER; + pane.add(new JLabel(Messages.getString("CollectEarthWindow.28") + "
" //$NON-NLS-1$ //$NON-NLS-2$ + + Messages.getString("CollectEarthWindow.30")), c); //$NON-NLS-1$ + + c.gridx = 0; + c.gridy++; + c.gridwidth = GridBagConstraints.REMAINDER; + c.fill = GridBagConstraints.NONE; + final JButton propertiesButton = new JButton(Messages.getString("CollectEarthWindow.15")); //$NON-NLS-1$ + propertiesButton.addActionListener( collectEarthMenu.getPropertiesAction( frame ) ); + pane.add(propertiesButton, c); + + getFrame().getContentPane().add(pane); + + // Three seconds after the last key is typed on hte text field the operator name changes on the properties service + Timer timerOperatorChanged = new Timer(3000, e-> updateOperatorName() ); + + operatorTextField.addKeyListener( new KeyAdapter() { + @Override + public void keyTyped(KeyEvent e) { + timerOperatorChanged.restart(); + } + }); + } + + private void initializeWindow() { + + // Initialize the translations + Messages.setLocale(localPropertiesService.getUiLanguage().getLocale()); + getFrame().setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); + getFrame().setResizable(false); + try { + getFrame().setIconImage( + new ImageIcon(new File("images/smallOpenForisBanner.png").toURI().toURL()).getImage()); //$NON-NLS-1$ + } catch (final MalformedURLException e2) { + logger.error(Messages.getString("CollectEarthWindow.21"), e2); //$NON-NLS-1$ } + addWindowClosingListener(); } + protected void openWindow() { + initializeWindow(); + initializePanel(); + initializeMenu(); + displayWindow(); + + if (StringUtils.isBlank(getOperator())) { + JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.35"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.36"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + } + + changeFrameTitle(); + } + + public void changeFrameTitle() { + String name = " - No survey loaded"; + if (earthSurveyService.getCollectSurvey() != null) { + if (!StringUtils.isBlank(earthSurveyService.getCollectSurvey() + .getProjectName(localPropertiesService.getUiLanguage().getLocale().getLanguage()))) { + name = " - " + earthSurveyService.getCollectSurvey() + .getProjectName(localPropertiesService.getUiLanguage().getLocale().getLanguage()); + } else if (!StringUtils.isBlank(earthSurveyService.getCollectSurvey().getProjectName())) { + name = " - " + earthSurveyService.getCollectSurvey().getProjectName(); + } else { + name = " - " + earthSurveyService.getCollectSurvey() + .getDescription(localPropertiesService.getUiLanguage().getLocale().getLanguage()); + } + } + getFrame().setTitle(Messages.getString("CollectEarthWindow.19") + name); + } + + void setFrame(JFrame frame) { + this.frame = frame; + } -} +} \ No newline at end of file From 503283874554de824f5f841ce5f2adbb326b51dc Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:38 +0100 Subject: [PATCH 0289/1620] New translations CollectEarthWindow.java (English) --- .../earth/app/view/Messages_en.properties | 323 ++++++++++++++++-- 1 file changed, 286 insertions(+), 37 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 0ccb8f2366..ee88f71564 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,67 +1,316 @@ package org.openforis.collect.earth.app.view; +import java.awt.Color; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.Window; +import java.awt.event.ActionListener; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; import java.io.File; +import java.io.IOException; +import java.net.MalformedURLException; +import javax.swing.BorderFactory; +import javax.swing.ImageIcon; +import javax.swing.JButton; import javax.swing.JFrame; -import javax.swing.ProgressMonitor; +import javax.swing.JLabel; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JTextField; +import javax.swing.SwingConstants; +import javax.swing.SwingUtilities; +import javax.swing.Timer; +import javax.swing.WindowConstants; +import javax.swing.border.Border; -import org.openforis.collect.earth.app.CollectEarthUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.EarthConstants.OperationMode; +import org.openforis.collect.earth.app.desktop.EarthApp; import org.openforis.collect.earth.app.service.EarthSurveyService; import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.view.ExportActionListener.RecordsToExport; -import org.openforis.collect.io.data.DataExportStatus; -import org.openforis.collect.manager.process.AbstractProcess; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; -public class ExportProcessMonitorDialog extends ProcessMonitorDialog { +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ +@Component +@Lazy(false) +public class CollectEarthWindow implements InitializingBean, DisposableBean{ + @Autowired + private LocalPropertiesService localPropertiesService; - private RecordsToExport recordsToExport; - private DataFormat exportFormat; + @Autowired private EarthSurveyService earthSurveyService; - private LocalPropertiesService localPropertiesService; - private File exportToFile; - public ExportProcessMonitorDialog(AbstractProcess exportProcess, JFrame parentFrame, RecordsToExport recordsToExport, DataFormat exportFormat, EarthSurveyService earthSurveyService, File exportToFile, LocalPropertiesService localPropertiesService ) { - super(); - this.process = exportProcess; - this.recordsToExport = recordsToExport; - this.exportFormat = exportFormat; - this.earthSurveyService = earthSurveyService; - this.exportToFile = exportToFile; - this.localPropertiesService = localPropertiesService; - progressMonitor = new ProgressMonitor(parentFrame, Messages.getString("ExportDialogProcessMonitor.0"), Messages.getString("ExportDialogProcessMonitor.1"), 0, 100); //$NON-NLS-1$ //$NON-NLS-2$ - progressMonitor.setMillisToPopup(1000); - + @Autowired + private CollectEarthTransferHandler collectEarthTransferHandler; + + @Autowired + private CollectEarthMenu collectEarthMenu; + + public static void endWaiting(Window frame) { + frame.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); + } + + public static void startWaiting(Window frame) { + frame.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); + } + + private JFrame frame; + private final Logger logger = LoggerFactory.getLogger(CollectEarthWindow.class); + private JTextField operatorTextField; + + public static final Color ERROR_COLOR = new Color(225, 124, 124); + + public CollectEarthWindow() throws IOException { + // Create and set up the window. + JFrame framePriv = new JFrame(Messages.getString("CollectEarthWindow.19"));//$NON-NLS-1$ + + setFrame(framePriv); } - protected String getProcessActionMessage() { - return Messages.getString("ExportDialogProcessMonitor.4"); //$NON-NLS-1$ + private void init() { + Messages.setLocale(localPropertiesService.getUiLanguage().getLocale()); + javax.swing.SwingUtilities.invokeLater( () -> { + try { + CollectEarthWindow.this.openWindow(); + } catch (final Exception e) { + logger.error("Cannot start Earth App", e); //$NON-NLS-1$ + System.exit(0); + } + }); + } + @Override + public void afterPropertiesSet() throws Exception { + init(); } @Override - public void run() { + public void destroy() throws Exception { + SwingUtilities.invokeAndWait( () -> CollectEarthWindow.this.getFrame().dispose() ); + } - try { - monitorProgress(); - process.call(); - if( process.getStatus().isComplete() && exportFormat.equals( DataFormat.ZIP_WITH_XML ) && recordsToExport.equals(RecordsToExport.MODIFIED_SINCE_LAST_EXPORT) ){ - String surveyName = ""; //$NON-NLS-1$ - if( earthSurveyService.getCollectSurvey()!= null ){ - surveyName = earthSurveyService.getCollectSurvey().getName(); + private void addWindowClosingListener() { + getFrame().addWindowListener(new WindowAdapter() { + + @Override + public void windowClosing(WindowEvent e) { + try { + final String keepOpen = Messages.getString("CollectEarthWindow.37"); //$NON-NLS-1$ + final String close = Messages.getString("CollectEarthWindow.42"); //$NON-NLS-1$ + final String[] options = new String[] { close, keepOpen }; + + final int confirmation = JOptionPane.showOptionDialog(getFrame(), + Messages.getString("CollectEarthWindow.22"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.23"), //$NON-NLS-1$ + JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, keepOpen); + + if (confirmation == JOptionPane.YES_OPTION) { + final Thread stopServer = new Thread("Stopping server") { + @Override + public void run() { + try { + EarthApp.quitServer(); + } catch (final Exception e) { + logger.error("Error when trying to closing the server", e); //$NON-NLS-1$ + } + } + }; + + getFrame().setVisible(false); + getFrame().dispose(); + stopServer.start(); + Thread.sleep(5000); + + System.exit(0); + } + }catch (final InterruptedException e1) { + logger.error("Error when interupting thread", e1); //$NON-NLS-1$ + Thread.currentThread().interrupt(); + } catch (final Exception e1) { + logger.error("Error when trying to shutdown the server when window is closed", e1); //$NON-NLS-1$ } - localPropertiesService.setLastExportedDate( surveyName ); } + }); + } - if( process.getStatus().isComplete() && ( exportFormat.equals( DataFormat.CSV ) || exportFormat.equals( DataFormat.FUSION ) || exportFormat.equals( DataFormat.KML_FILE ) ) ) { - CollectEarthUtils.openFile( exportToFile ); + private void disableMenuItems() { + if (localPropertiesService.getOperationMode().equals(OperationMode.CLIENT_MODE)) { + for (final JMenuItem menuItem : collectEarthMenu.getServerMenuItems()) { + menuItem.setEnabled(false); } + } + } + + private void displayWindow() { + getFrame().setLocationRelativeTo(null); + getFrame().pack(); + getFrame().setVisible(true); + } - } catch (final Exception e) { - logger.error("Error starting the process", e); //$NON-NLS-1$ + protected ActionListener getCloseActionListener() { + return e -> getFrame().dispatchEvent(new WindowEvent(getFrame(), WindowEvent.WINDOW_CLOSING)); + } + + public JFrame getFrame() { + return frame; + } + + private String getOperator() { + return localPropertiesService.getOperator(); + } + + private void initializeMenu() { + + collectEarthMenu.removeAll(); + collectEarthMenu.init(); + getFrame().setJMenuBar( collectEarthMenu ); + + disableMenuItems(); + } + + private void updateOperatorName() { + final String operatorName = operatorTextField.getText().trim(); + if( !operatorName.equals(localPropertiesService.getOperator() ) ) { + if (operatorName.length() > 5 && operatorName.length() < 50 ) { + localPropertiesService.saveOperator(operatorName); + operatorTextField.setBackground(Color.white); + JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.65"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.66"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ + } else{ + JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.33"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.34"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + operatorTextField.setText(getOperator()); + } + } + } + + private void initializePanel() { + final JPanel pane = new JPanel(new GridBagLayout()); + + final Border raisedetched = BorderFactory.createRaisedBevelBorder(); + pane.setBorder(raisedetched); + + // Handle Drag and Drop of files into the panel + pane.setTransferHandler(collectEarthTransferHandler); + + final GridBagConstraints c = new GridBagConstraints(); + + operatorTextField = new JTextField(getOperator(), 30); + if (StringUtils.isBlank(getOperator())) { + operatorTextField.setBackground(ERROR_COLOR); + } + + final JLabel operatorTextLabel = new JLabel(Messages.getString("CollectEarthWindow.26"), SwingConstants.CENTER); //$NON-NLS-1$ + operatorTextLabel.setSize(100, 20); + + // final JButton updateOperator = new JButton(Messages.getString("CollectEarthWindow.27")); //$NON-NLS-1$ + c.insets = new Insets(3, 3, 3, 3); + c.fill = GridBagConstraints.HORIZONTAL; + c.gridx = 0; + c.gridy = 0; + pane.add(operatorTextLabel, c); + + c.weightx = 0; + c.gridx = 1; + c.gridy = 0; + pane.add(operatorTextField, c); + + c.gridx = 2; + c.gridy = 0; + // pane.add(updateOperator, c); + + c.gridx = 0; + c.gridy++; + c.gridwidth = GridBagConstraints.REMAINDER; + pane.add(new JLabel(Messages.getString("CollectEarthWindow.28") + "
" //$NON-NLS-1$ //$NON-NLS-2$ + + Messages.getString("CollectEarthWindow.30")), c); //$NON-NLS-1$ + + c.gridx = 0; + c.gridy++; + c.gridwidth = GridBagConstraints.REMAINDER; + c.fill = GridBagConstraints.NONE; + final JButton propertiesButton = new JButton(Messages.getString("CollectEarthWindow.15")); //$NON-NLS-1$ + propertiesButton.addActionListener( collectEarthMenu.getPropertiesAction( frame ) ); + pane.add(propertiesButton, c); + + getFrame().getContentPane().add(pane); + + // Three seconds after the last key is typed on hte text field the operator name changes on the properties service + Timer timerOperatorChanged = new Timer(3000, e-> updateOperatorName() ); + + operatorTextField.addKeyListener( new KeyAdapter() { + @Override + public void keyTyped(KeyEvent e) { + timerOperatorChanged.restart(); + } + }); + } + + private void initializeWindow() { + + // Initialize the translations + Messages.setLocale(localPropertiesService.getUiLanguage().getLocale()); + getFrame().setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); + getFrame().setResizable(false); + try { + getFrame().setIconImage( + new ImageIcon(new File("images/smallOpenForisBanner.png").toURI().toURL()).getImage()); //$NON-NLS-1$ + } catch (final MalformedURLException e2) { + logger.error(Messages.getString("CollectEarthWindow.21"), e2); //$NON-NLS-1$ } + addWindowClosingListener(); } + protected void openWindow() { + initializeWindow(); + initializePanel(); + initializeMenu(); + displayWindow(); + + if (StringUtils.isBlank(getOperator())) { + JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.35"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.36"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + } + + changeFrameTitle(); + } + + public void changeFrameTitle() { + String name = " - No survey loaded"; + if (earthSurveyService.getCollectSurvey() != null) { + if (!StringUtils.isBlank(earthSurveyService.getCollectSurvey() + .getProjectName(localPropertiesService.getUiLanguage().getLocale().getLanguage()))) { + name = " - " + earthSurveyService.getCollectSurvey() + .getProjectName(localPropertiesService.getUiLanguage().getLocale().getLanguage()); + } else if (!StringUtils.isBlank(earthSurveyService.getCollectSurvey().getProjectName())) { + name = " - " + earthSurveyService.getCollectSurvey().getProjectName(); + } else { + name = " - " + earthSurveyService.getCollectSurvey() + .getDescription(localPropertiesService.getUiLanguage().getLocale().getLanguage()); + } + } + getFrame().setTitle(Messages.getString("CollectEarthWindow.19") + name); + } + + void setFrame(JFrame frame) { + this.frame = frame; + } -} +} \ No newline at end of file From 5db4f67b4a5aed77ba9aa1632d8d6518da53a7e2 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:39 +0100 Subject: [PATCH 0290/1620] New translations ComboBoxItem.java (French) --- .../earth/app/view/Messages_fr.properties | 328 ++---------------- 1 file changed, 34 insertions(+), 294 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index ee88f71564..b3ee730e05 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,316 +1,56 @@ package org.openforis.collect.earth.app.view; -import java.awt.Color; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.awt.Window; -import java.awt.event.ActionListener; -import java.awt.event.KeyAdapter; -import java.awt.event.KeyEvent; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.io.File; -import java.io.IOException; -import java.net.MalformedURLException; - -import javax.swing.BorderFactory; -import javax.swing.ImageIcon; -import javax.swing.JButton; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JMenuItem; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JTextField; -import javax.swing.SwingConstants; -import javax.swing.SwingUtilities; -import javax.swing.Timer; -import javax.swing.WindowConstants; -import javax.swing.border.Border; - -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.EarthConstants.OperationMode; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.DisposableBean; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; - /** * @author Alfonso Sanchez-Paus Diaz * */ -@Component -@Lazy(false) -public class CollectEarthWindow implements InitializingBean, DisposableBean{ - - @Autowired - private LocalPropertiesService localPropertiesService; - - @Autowired - private EarthSurveyService earthSurveyService; +class ComboBoxItem { - @Autowired - private CollectEarthTransferHandler collectEarthTransferHandler; + private Integer numberOfPoints; + private String label; - @Autowired - private CollectEarthMenu collectEarthMenu; - - public static void endWaiting(Window frame) { - frame.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); - } - - public static void startWaiting(Window frame) { - frame.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); - } - - private JFrame frame; - private final Logger logger = LoggerFactory.getLogger(CollectEarthWindow.class); - private JTextField operatorTextField; - - public static final Color ERROR_COLOR = new Color(225, 124, 124); - - public CollectEarthWindow() throws IOException { - // Create and set up the window. - JFrame framePriv = new JFrame(Messages.getString("CollectEarthWindow.19"));//$NON-NLS-1$ - - setFrame(framePriv); - } - - private void init() { - Messages.setLocale(localPropertiesService.getUiLanguage().getLocale()); - javax.swing.SwingUtilities.invokeLater( () -> { - try { - CollectEarthWindow.this.openWindow(); - } catch (final Exception e) { - logger.error("Cannot start Earth App", e); //$NON-NLS-1$ - System.exit(0); - } - }); - } - @Override - public void afterPropertiesSet() throws Exception { - init(); + protected ComboBoxItem(int numberOfPoints, String label) { + super(); + this.numberOfPoints = numberOfPoints; + this.label = label; } @Override - public void destroy() throws Exception { - SwingUtilities.invokeAndWait( () -> CollectEarthWindow.this.getFrame().dispose() ); - } - - private void addWindowClosingListener() { - getFrame().addWindowListener(new WindowAdapter() { - - @Override - public void windowClosing(WindowEvent e) { - try { - final String keepOpen = Messages.getString("CollectEarthWindow.37"); //$NON-NLS-1$ - final String close = Messages.getString("CollectEarthWindow.42"); //$NON-NLS-1$ - final String[] options = new String[] { close, keepOpen }; - - final int confirmation = JOptionPane.showOptionDialog(getFrame(), - Messages.getString("CollectEarthWindow.22"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.23"), //$NON-NLS-1$ - JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, keepOpen); - - if (confirmation == JOptionPane.YES_OPTION) { - final Thread stopServer = new Thread("Stopping server") { - @Override - public void run() { - try { - EarthApp.quitServer(); - } catch (final Exception e) { - logger.error("Error when trying to closing the server", e); //$NON-NLS-1$ - } - } - }; - - getFrame().setVisible(false); - getFrame().dispose(); - stopServer.start(); - Thread.sleep(5000); - - System.exit(0); - } - }catch (final InterruptedException e1) { - logger.error("Error when interupting thread", e1); //$NON-NLS-1$ - Thread.currentThread().interrupt(); - } catch (final Exception e1) { - logger.error("Error when trying to shutdown the server when window is closed", e1); //$NON-NLS-1$ - } - - } - }); - } - - private void disableMenuItems() { - if (localPropertiesService.getOperationMode().equals(OperationMode.CLIENT_MODE)) { - for (final JMenuItem menuItem : collectEarthMenu.getServerMenuItems()) { - menuItem.setEnabled(false); - } - } - } - - private void displayWindow() { - getFrame().setLocationRelativeTo(null); - getFrame().pack(); - getFrame().setVisible(true); - } - - protected ActionListener getCloseActionListener() { - return e -> getFrame().dispatchEvent(new WindowEvent(getFrame(), WindowEvent.WINDOW_CLOSING)); - } - - public JFrame getFrame() { - return frame; - } - - private String getOperator() { - return localPropertiesService.getOperator(); - } - - private void initializeMenu() { - - collectEarthMenu.removeAll(); - collectEarthMenu.init(); - getFrame().setJMenuBar( collectEarthMenu ); - - disableMenuItems(); - } - - private void updateOperatorName() { - final String operatorName = operatorTextField.getText().trim(); - if( !operatorName.equals(localPropertiesService.getOperator() ) ) { - if (operatorName.length() > 5 && operatorName.length() < 50 ) { - localPropertiesService.saveOperator(operatorName); - operatorTextField.setBackground(Color.white); - JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.65"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.66"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ - } else{ - JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.33"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.34"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - operatorTextField.setText(getOperator()); - } - } - } - - private void initializePanel() { - final JPanel pane = new JPanel(new GridBagLayout()); - - final Border raisedetched = BorderFactory.createRaisedBevelBorder(); - pane.setBorder(raisedetched); - - // Handle Drag and Drop of files into the panel - pane.setTransferHandler(collectEarthTransferHandler); - - final GridBagConstraints c = new GridBagConstraints(); - - operatorTextField = new JTextField(getOperator(), 30); - if (StringUtils.isBlank(getOperator())) { - operatorTextField.setBackground(ERROR_COLOR); - } - - final JLabel operatorTextLabel = new JLabel(Messages.getString("CollectEarthWindow.26"), SwingConstants.CENTER); //$NON-NLS-1$ - operatorTextLabel.setSize(100, 20); - - // final JButton updateOperator = new JButton(Messages.getString("CollectEarthWindow.27")); //$NON-NLS-1$ - c.insets = new Insets(3, 3, 3, 3); - c.fill = GridBagConstraints.HORIZONTAL; - c.gridx = 0; - c.gridy = 0; - pane.add(operatorTextLabel, c); - - c.weightx = 0; - c.gridx = 1; - c.gridy = 0; - pane.add(operatorTextField, c); - - c.gridx = 2; - c.gridy = 0; - // pane.add(updateOperator, c); - - c.gridx = 0; - c.gridy++; - c.gridwidth = GridBagConstraints.REMAINDER; - pane.add(new JLabel(Messages.getString("CollectEarthWindow.28") + "
" //$NON-NLS-1$ //$NON-NLS-2$ - + Messages.getString("CollectEarthWindow.30")), c); //$NON-NLS-1$ - - c.gridx = 0; - c.gridy++; - c.gridwidth = GridBagConstraints.REMAINDER; - c.fill = GridBagConstraints.NONE; - final JButton propertiesButton = new JButton(Messages.getString("CollectEarthWindow.15")); //$NON-NLS-1$ - propertiesButton.addActionListener( collectEarthMenu.getPropertiesAction( frame ) ); - pane.add(propertiesButton, c); - - getFrame().getContentPane().add(pane); - - // Three seconds after the last key is typed on hte text field the operator name changes on the properties service - Timer timerOperatorChanged = new Timer(3000, e-> updateOperatorName() ); - - operatorTextField.addKeyListener( new KeyAdapter() { - @Override - public void keyTyped(KeyEvent e) { - timerOperatorChanged.restart(); - } - }); - } - - private void initializeWindow() { - - // Initialize the translations - Messages.setLocale(localPropertiesService.getUiLanguage().getLocale()); - getFrame().setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - getFrame().setResizable(false); - try { - getFrame().setIconImage( - new ImageIcon(new File("images/smallOpenForisBanner.png").toURI().toURL()).getImage()); //$NON-NLS-1$ - } catch (final MalformedURLException e2) { - logger.error(Messages.getString("CollectEarthWindow.21"), e2); //$NON-NLS-1$ + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + ComboBoxItem other = (ComboBoxItem) obj; + if (numberOfPoints == null) { + if (other.numberOfPoints != null) + return false; + } else { + if (!numberOfPoints.equals(other.numberOfPoints)) + return false; } - addWindowClosingListener(); + return true; } - protected void openWindow() { - initializeWindow(); - initializePanel(); - initializeMenu(); - displayWindow(); - - if (StringUtils.isBlank(getOperator())) { - JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.35"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.36"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - } - - changeFrameTitle(); + public int getNumberOfPoints() { + return numberOfPoints; } - public void changeFrameTitle() { - String name = " - No survey loaded"; - if (earthSurveyService.getCollectSurvey() != null) { - if (!StringUtils.isBlank(earthSurveyService.getCollectSurvey() - .getProjectName(localPropertiesService.getUiLanguage().getLocale().getLanguage()))) { - name = " - " + earthSurveyService.getCollectSurvey() - .getProjectName(localPropertiesService.getUiLanguage().getLocale().getLanguage()); - } else if (!StringUtils.isBlank(earthSurveyService.getCollectSurvey().getProjectName())) { - name = " - " + earthSurveyService.getCollectSurvey().getProjectName(); - } else { - name = " - " + earthSurveyService.getCollectSurvey() - .getDescription(localPropertiesService.getUiLanguage().getLocale().getLanguage()); - } - } - getFrame().setTitle(Messages.getString("CollectEarthWindow.19") + name); + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((label == null) ? 0 : label.hashCode()); + result = prime * result + ((numberOfPoints == null) ? 0 : numberOfPoints.hashCode()); + return result; } - void setFrame(JFrame frame) { - this.frame = frame; + @Override + public String toString() { + return label; } } \ No newline at end of file From 77fae823bbaac70ad2d6ff3684dadd4b9cd83ded Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:40 +0100 Subject: [PATCH 0291/1620] New translations ComboBoxItem.java (Spanish) --- .../earth/app/view/Messages_es.properties | 328 ++---------------- 1 file changed, 34 insertions(+), 294 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index ee88f71564..b3ee730e05 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,316 +1,56 @@ package org.openforis.collect.earth.app.view; -import java.awt.Color; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.awt.Window; -import java.awt.event.ActionListener; -import java.awt.event.KeyAdapter; -import java.awt.event.KeyEvent; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.io.File; -import java.io.IOException; -import java.net.MalformedURLException; - -import javax.swing.BorderFactory; -import javax.swing.ImageIcon; -import javax.swing.JButton; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JMenuItem; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JTextField; -import javax.swing.SwingConstants; -import javax.swing.SwingUtilities; -import javax.swing.Timer; -import javax.swing.WindowConstants; -import javax.swing.border.Border; - -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.EarthConstants.OperationMode; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.DisposableBean; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; - /** * @author Alfonso Sanchez-Paus Diaz * */ -@Component -@Lazy(false) -public class CollectEarthWindow implements InitializingBean, DisposableBean{ - - @Autowired - private LocalPropertiesService localPropertiesService; - - @Autowired - private EarthSurveyService earthSurveyService; +class ComboBoxItem { - @Autowired - private CollectEarthTransferHandler collectEarthTransferHandler; + private Integer numberOfPoints; + private String label; - @Autowired - private CollectEarthMenu collectEarthMenu; - - public static void endWaiting(Window frame) { - frame.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); - } - - public static void startWaiting(Window frame) { - frame.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); - } - - private JFrame frame; - private final Logger logger = LoggerFactory.getLogger(CollectEarthWindow.class); - private JTextField operatorTextField; - - public static final Color ERROR_COLOR = new Color(225, 124, 124); - - public CollectEarthWindow() throws IOException { - // Create and set up the window. - JFrame framePriv = new JFrame(Messages.getString("CollectEarthWindow.19"));//$NON-NLS-1$ - - setFrame(framePriv); - } - - private void init() { - Messages.setLocale(localPropertiesService.getUiLanguage().getLocale()); - javax.swing.SwingUtilities.invokeLater( () -> { - try { - CollectEarthWindow.this.openWindow(); - } catch (final Exception e) { - logger.error("Cannot start Earth App", e); //$NON-NLS-1$ - System.exit(0); - } - }); - } - @Override - public void afterPropertiesSet() throws Exception { - init(); + protected ComboBoxItem(int numberOfPoints, String label) { + super(); + this.numberOfPoints = numberOfPoints; + this.label = label; } @Override - public void destroy() throws Exception { - SwingUtilities.invokeAndWait( () -> CollectEarthWindow.this.getFrame().dispose() ); - } - - private void addWindowClosingListener() { - getFrame().addWindowListener(new WindowAdapter() { - - @Override - public void windowClosing(WindowEvent e) { - try { - final String keepOpen = Messages.getString("CollectEarthWindow.37"); //$NON-NLS-1$ - final String close = Messages.getString("CollectEarthWindow.42"); //$NON-NLS-1$ - final String[] options = new String[] { close, keepOpen }; - - final int confirmation = JOptionPane.showOptionDialog(getFrame(), - Messages.getString("CollectEarthWindow.22"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.23"), //$NON-NLS-1$ - JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, keepOpen); - - if (confirmation == JOptionPane.YES_OPTION) { - final Thread stopServer = new Thread("Stopping server") { - @Override - public void run() { - try { - EarthApp.quitServer(); - } catch (final Exception e) { - logger.error("Error when trying to closing the server", e); //$NON-NLS-1$ - } - } - }; - - getFrame().setVisible(false); - getFrame().dispose(); - stopServer.start(); - Thread.sleep(5000); - - System.exit(0); - } - }catch (final InterruptedException e1) { - logger.error("Error when interupting thread", e1); //$NON-NLS-1$ - Thread.currentThread().interrupt(); - } catch (final Exception e1) { - logger.error("Error when trying to shutdown the server when window is closed", e1); //$NON-NLS-1$ - } - - } - }); - } - - private void disableMenuItems() { - if (localPropertiesService.getOperationMode().equals(OperationMode.CLIENT_MODE)) { - for (final JMenuItem menuItem : collectEarthMenu.getServerMenuItems()) { - menuItem.setEnabled(false); - } - } - } - - private void displayWindow() { - getFrame().setLocationRelativeTo(null); - getFrame().pack(); - getFrame().setVisible(true); - } - - protected ActionListener getCloseActionListener() { - return e -> getFrame().dispatchEvent(new WindowEvent(getFrame(), WindowEvent.WINDOW_CLOSING)); - } - - public JFrame getFrame() { - return frame; - } - - private String getOperator() { - return localPropertiesService.getOperator(); - } - - private void initializeMenu() { - - collectEarthMenu.removeAll(); - collectEarthMenu.init(); - getFrame().setJMenuBar( collectEarthMenu ); - - disableMenuItems(); - } - - private void updateOperatorName() { - final String operatorName = operatorTextField.getText().trim(); - if( !operatorName.equals(localPropertiesService.getOperator() ) ) { - if (operatorName.length() > 5 && operatorName.length() < 50 ) { - localPropertiesService.saveOperator(operatorName); - operatorTextField.setBackground(Color.white); - JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.65"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.66"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ - } else{ - JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.33"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.34"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - operatorTextField.setText(getOperator()); - } - } - } - - private void initializePanel() { - final JPanel pane = new JPanel(new GridBagLayout()); - - final Border raisedetched = BorderFactory.createRaisedBevelBorder(); - pane.setBorder(raisedetched); - - // Handle Drag and Drop of files into the panel - pane.setTransferHandler(collectEarthTransferHandler); - - final GridBagConstraints c = new GridBagConstraints(); - - operatorTextField = new JTextField(getOperator(), 30); - if (StringUtils.isBlank(getOperator())) { - operatorTextField.setBackground(ERROR_COLOR); - } - - final JLabel operatorTextLabel = new JLabel(Messages.getString("CollectEarthWindow.26"), SwingConstants.CENTER); //$NON-NLS-1$ - operatorTextLabel.setSize(100, 20); - - // final JButton updateOperator = new JButton(Messages.getString("CollectEarthWindow.27")); //$NON-NLS-1$ - c.insets = new Insets(3, 3, 3, 3); - c.fill = GridBagConstraints.HORIZONTAL; - c.gridx = 0; - c.gridy = 0; - pane.add(operatorTextLabel, c); - - c.weightx = 0; - c.gridx = 1; - c.gridy = 0; - pane.add(operatorTextField, c); - - c.gridx = 2; - c.gridy = 0; - // pane.add(updateOperator, c); - - c.gridx = 0; - c.gridy++; - c.gridwidth = GridBagConstraints.REMAINDER; - pane.add(new JLabel(Messages.getString("CollectEarthWindow.28") + "
" //$NON-NLS-1$ //$NON-NLS-2$ - + Messages.getString("CollectEarthWindow.30")), c); //$NON-NLS-1$ - - c.gridx = 0; - c.gridy++; - c.gridwidth = GridBagConstraints.REMAINDER; - c.fill = GridBagConstraints.NONE; - final JButton propertiesButton = new JButton(Messages.getString("CollectEarthWindow.15")); //$NON-NLS-1$ - propertiesButton.addActionListener( collectEarthMenu.getPropertiesAction( frame ) ); - pane.add(propertiesButton, c); - - getFrame().getContentPane().add(pane); - - // Three seconds after the last key is typed on hte text field the operator name changes on the properties service - Timer timerOperatorChanged = new Timer(3000, e-> updateOperatorName() ); - - operatorTextField.addKeyListener( new KeyAdapter() { - @Override - public void keyTyped(KeyEvent e) { - timerOperatorChanged.restart(); - } - }); - } - - private void initializeWindow() { - - // Initialize the translations - Messages.setLocale(localPropertiesService.getUiLanguage().getLocale()); - getFrame().setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - getFrame().setResizable(false); - try { - getFrame().setIconImage( - new ImageIcon(new File("images/smallOpenForisBanner.png").toURI().toURL()).getImage()); //$NON-NLS-1$ - } catch (final MalformedURLException e2) { - logger.error(Messages.getString("CollectEarthWindow.21"), e2); //$NON-NLS-1$ + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + ComboBoxItem other = (ComboBoxItem) obj; + if (numberOfPoints == null) { + if (other.numberOfPoints != null) + return false; + } else { + if (!numberOfPoints.equals(other.numberOfPoints)) + return false; } - addWindowClosingListener(); + return true; } - protected void openWindow() { - initializeWindow(); - initializePanel(); - initializeMenu(); - displayWindow(); - - if (StringUtils.isBlank(getOperator())) { - JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.35"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.36"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - } - - changeFrameTitle(); + public int getNumberOfPoints() { + return numberOfPoints; } - public void changeFrameTitle() { - String name = " - No survey loaded"; - if (earthSurveyService.getCollectSurvey() != null) { - if (!StringUtils.isBlank(earthSurveyService.getCollectSurvey() - .getProjectName(localPropertiesService.getUiLanguage().getLocale().getLanguage()))) { - name = " - " + earthSurveyService.getCollectSurvey() - .getProjectName(localPropertiesService.getUiLanguage().getLocale().getLanguage()); - } else if (!StringUtils.isBlank(earthSurveyService.getCollectSurvey().getProjectName())) { - name = " - " + earthSurveyService.getCollectSurvey().getProjectName(); - } else { - name = " - " + earthSurveyService.getCollectSurvey() - .getDescription(localPropertiesService.getUiLanguage().getLocale().getLanguage()); - } - } - getFrame().setTitle(Messages.getString("CollectEarthWindow.19") + name); + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((label == null) ? 0 : label.hashCode()); + result = prime * result + ((numberOfPoints == null) ? 0 : numberOfPoints.hashCode()); + return result; } - void setFrame(JFrame frame) { - this.frame = frame; + @Override + public String toString() { + return label; } } \ No newline at end of file From ad0888dc281718b5e04600d4fd90fb6fc9537d0d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:41 +0100 Subject: [PATCH 0292/1620] New translations ComboBoxItem.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 328 ++---------------- 1 file changed, 34 insertions(+), 294 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index ee88f71564..b3ee730e05 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,316 +1,56 @@ package org.openforis.collect.earth.app.view; -import java.awt.Color; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.awt.Window; -import java.awt.event.ActionListener; -import java.awt.event.KeyAdapter; -import java.awt.event.KeyEvent; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.io.File; -import java.io.IOException; -import java.net.MalformedURLException; - -import javax.swing.BorderFactory; -import javax.swing.ImageIcon; -import javax.swing.JButton; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JMenuItem; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JTextField; -import javax.swing.SwingConstants; -import javax.swing.SwingUtilities; -import javax.swing.Timer; -import javax.swing.WindowConstants; -import javax.swing.border.Border; - -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.EarthConstants.OperationMode; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.DisposableBean; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; - /** * @author Alfonso Sanchez-Paus Diaz * */ -@Component -@Lazy(false) -public class CollectEarthWindow implements InitializingBean, DisposableBean{ - - @Autowired - private LocalPropertiesService localPropertiesService; - - @Autowired - private EarthSurveyService earthSurveyService; +class ComboBoxItem { - @Autowired - private CollectEarthTransferHandler collectEarthTransferHandler; + private Integer numberOfPoints; + private String label; - @Autowired - private CollectEarthMenu collectEarthMenu; - - public static void endWaiting(Window frame) { - frame.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); - } - - public static void startWaiting(Window frame) { - frame.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); - } - - private JFrame frame; - private final Logger logger = LoggerFactory.getLogger(CollectEarthWindow.class); - private JTextField operatorTextField; - - public static final Color ERROR_COLOR = new Color(225, 124, 124); - - public CollectEarthWindow() throws IOException { - // Create and set up the window. - JFrame framePriv = new JFrame(Messages.getString("CollectEarthWindow.19"));//$NON-NLS-1$ - - setFrame(framePriv); - } - - private void init() { - Messages.setLocale(localPropertiesService.getUiLanguage().getLocale()); - javax.swing.SwingUtilities.invokeLater( () -> { - try { - CollectEarthWindow.this.openWindow(); - } catch (final Exception e) { - logger.error("Cannot start Earth App", e); //$NON-NLS-1$ - System.exit(0); - } - }); - } - @Override - public void afterPropertiesSet() throws Exception { - init(); + protected ComboBoxItem(int numberOfPoints, String label) { + super(); + this.numberOfPoints = numberOfPoints; + this.label = label; } @Override - public void destroy() throws Exception { - SwingUtilities.invokeAndWait( () -> CollectEarthWindow.this.getFrame().dispose() ); - } - - private void addWindowClosingListener() { - getFrame().addWindowListener(new WindowAdapter() { - - @Override - public void windowClosing(WindowEvent e) { - try { - final String keepOpen = Messages.getString("CollectEarthWindow.37"); //$NON-NLS-1$ - final String close = Messages.getString("CollectEarthWindow.42"); //$NON-NLS-1$ - final String[] options = new String[] { close, keepOpen }; - - final int confirmation = JOptionPane.showOptionDialog(getFrame(), - Messages.getString("CollectEarthWindow.22"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.23"), //$NON-NLS-1$ - JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, keepOpen); - - if (confirmation == JOptionPane.YES_OPTION) { - final Thread stopServer = new Thread("Stopping server") { - @Override - public void run() { - try { - EarthApp.quitServer(); - } catch (final Exception e) { - logger.error("Error when trying to closing the server", e); //$NON-NLS-1$ - } - } - }; - - getFrame().setVisible(false); - getFrame().dispose(); - stopServer.start(); - Thread.sleep(5000); - - System.exit(0); - } - }catch (final InterruptedException e1) { - logger.error("Error when interupting thread", e1); //$NON-NLS-1$ - Thread.currentThread().interrupt(); - } catch (final Exception e1) { - logger.error("Error when trying to shutdown the server when window is closed", e1); //$NON-NLS-1$ - } - - } - }); - } - - private void disableMenuItems() { - if (localPropertiesService.getOperationMode().equals(OperationMode.CLIENT_MODE)) { - for (final JMenuItem menuItem : collectEarthMenu.getServerMenuItems()) { - menuItem.setEnabled(false); - } - } - } - - private void displayWindow() { - getFrame().setLocationRelativeTo(null); - getFrame().pack(); - getFrame().setVisible(true); - } - - protected ActionListener getCloseActionListener() { - return e -> getFrame().dispatchEvent(new WindowEvent(getFrame(), WindowEvent.WINDOW_CLOSING)); - } - - public JFrame getFrame() { - return frame; - } - - private String getOperator() { - return localPropertiesService.getOperator(); - } - - private void initializeMenu() { - - collectEarthMenu.removeAll(); - collectEarthMenu.init(); - getFrame().setJMenuBar( collectEarthMenu ); - - disableMenuItems(); - } - - private void updateOperatorName() { - final String operatorName = operatorTextField.getText().trim(); - if( !operatorName.equals(localPropertiesService.getOperator() ) ) { - if (operatorName.length() > 5 && operatorName.length() < 50 ) { - localPropertiesService.saveOperator(operatorName); - operatorTextField.setBackground(Color.white); - JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.65"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.66"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ - } else{ - JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.33"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.34"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - operatorTextField.setText(getOperator()); - } - } - } - - private void initializePanel() { - final JPanel pane = new JPanel(new GridBagLayout()); - - final Border raisedetched = BorderFactory.createRaisedBevelBorder(); - pane.setBorder(raisedetched); - - // Handle Drag and Drop of files into the panel - pane.setTransferHandler(collectEarthTransferHandler); - - final GridBagConstraints c = new GridBagConstraints(); - - operatorTextField = new JTextField(getOperator(), 30); - if (StringUtils.isBlank(getOperator())) { - operatorTextField.setBackground(ERROR_COLOR); - } - - final JLabel operatorTextLabel = new JLabel(Messages.getString("CollectEarthWindow.26"), SwingConstants.CENTER); //$NON-NLS-1$ - operatorTextLabel.setSize(100, 20); - - // final JButton updateOperator = new JButton(Messages.getString("CollectEarthWindow.27")); //$NON-NLS-1$ - c.insets = new Insets(3, 3, 3, 3); - c.fill = GridBagConstraints.HORIZONTAL; - c.gridx = 0; - c.gridy = 0; - pane.add(operatorTextLabel, c); - - c.weightx = 0; - c.gridx = 1; - c.gridy = 0; - pane.add(operatorTextField, c); - - c.gridx = 2; - c.gridy = 0; - // pane.add(updateOperator, c); - - c.gridx = 0; - c.gridy++; - c.gridwidth = GridBagConstraints.REMAINDER; - pane.add(new JLabel(Messages.getString("CollectEarthWindow.28") + "
" //$NON-NLS-1$ //$NON-NLS-2$ - + Messages.getString("CollectEarthWindow.30")), c); //$NON-NLS-1$ - - c.gridx = 0; - c.gridy++; - c.gridwidth = GridBagConstraints.REMAINDER; - c.fill = GridBagConstraints.NONE; - final JButton propertiesButton = new JButton(Messages.getString("CollectEarthWindow.15")); //$NON-NLS-1$ - propertiesButton.addActionListener( collectEarthMenu.getPropertiesAction( frame ) ); - pane.add(propertiesButton, c); - - getFrame().getContentPane().add(pane); - - // Three seconds after the last key is typed on hte text field the operator name changes on the properties service - Timer timerOperatorChanged = new Timer(3000, e-> updateOperatorName() ); - - operatorTextField.addKeyListener( new KeyAdapter() { - @Override - public void keyTyped(KeyEvent e) { - timerOperatorChanged.restart(); - } - }); - } - - private void initializeWindow() { - - // Initialize the translations - Messages.setLocale(localPropertiesService.getUiLanguage().getLocale()); - getFrame().setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - getFrame().setResizable(false); - try { - getFrame().setIconImage( - new ImageIcon(new File("images/smallOpenForisBanner.png").toURI().toURL()).getImage()); //$NON-NLS-1$ - } catch (final MalformedURLException e2) { - logger.error(Messages.getString("CollectEarthWindow.21"), e2); //$NON-NLS-1$ + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + ComboBoxItem other = (ComboBoxItem) obj; + if (numberOfPoints == null) { + if (other.numberOfPoints != null) + return false; + } else { + if (!numberOfPoints.equals(other.numberOfPoints)) + return false; } - addWindowClosingListener(); + return true; } - protected void openWindow() { - initializeWindow(); - initializePanel(); - initializeMenu(); - displayWindow(); - - if (StringUtils.isBlank(getOperator())) { - JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.35"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.36"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - } - - changeFrameTitle(); + public int getNumberOfPoints() { + return numberOfPoints; } - public void changeFrameTitle() { - String name = " - No survey loaded"; - if (earthSurveyService.getCollectSurvey() != null) { - if (!StringUtils.isBlank(earthSurveyService.getCollectSurvey() - .getProjectName(localPropertiesService.getUiLanguage().getLocale().getLanguage()))) { - name = " - " + earthSurveyService.getCollectSurvey() - .getProjectName(localPropertiesService.getUiLanguage().getLocale().getLanguage()); - } else if (!StringUtils.isBlank(earthSurveyService.getCollectSurvey().getProjectName())) { - name = " - " + earthSurveyService.getCollectSurvey().getProjectName(); - } else { - name = " - " + earthSurveyService.getCollectSurvey() - .getDescription(localPropertiesService.getUiLanguage().getLocale().getLanguage()); - } - } - getFrame().setTitle(Messages.getString("CollectEarthWindow.19") + name); + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((label == null) ? 0 : label.hashCode()); + result = prime * result + ((numberOfPoints == null) ? 0 : numberOfPoints.hashCode()); + return result; } - void setFrame(JFrame frame) { - this.frame = frame; + @Override + public String toString() { + return label; } } \ No newline at end of file From 13b8e49051e3b9c28ed0ee9107d45e3c8cd2b93f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:42 +0100 Subject: [PATCH 0293/1620] New translations ComboBoxItem.java (English) --- .../earth/app/view/Messages_en.properties | 328 ++---------------- 1 file changed, 34 insertions(+), 294 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index ee88f71564..b3ee730e05 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,316 +1,56 @@ package org.openforis.collect.earth.app.view; -import java.awt.Color; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.awt.Window; -import java.awt.event.ActionListener; -import java.awt.event.KeyAdapter; -import java.awt.event.KeyEvent; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.io.File; -import java.io.IOException; -import java.net.MalformedURLException; - -import javax.swing.BorderFactory; -import javax.swing.ImageIcon; -import javax.swing.JButton; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JMenuItem; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JTextField; -import javax.swing.SwingConstants; -import javax.swing.SwingUtilities; -import javax.swing.Timer; -import javax.swing.WindowConstants; -import javax.swing.border.Border; - -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.EarthConstants.OperationMode; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.DisposableBean; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; - /** * @author Alfonso Sanchez-Paus Diaz * */ -@Component -@Lazy(false) -public class CollectEarthWindow implements InitializingBean, DisposableBean{ - - @Autowired - private LocalPropertiesService localPropertiesService; - - @Autowired - private EarthSurveyService earthSurveyService; +class ComboBoxItem { - @Autowired - private CollectEarthTransferHandler collectEarthTransferHandler; + private Integer numberOfPoints; + private String label; - @Autowired - private CollectEarthMenu collectEarthMenu; - - public static void endWaiting(Window frame) { - frame.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); - } - - public static void startWaiting(Window frame) { - frame.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); - } - - private JFrame frame; - private final Logger logger = LoggerFactory.getLogger(CollectEarthWindow.class); - private JTextField operatorTextField; - - public static final Color ERROR_COLOR = new Color(225, 124, 124); - - public CollectEarthWindow() throws IOException { - // Create and set up the window. - JFrame framePriv = new JFrame(Messages.getString("CollectEarthWindow.19"));//$NON-NLS-1$ - - setFrame(framePriv); - } - - private void init() { - Messages.setLocale(localPropertiesService.getUiLanguage().getLocale()); - javax.swing.SwingUtilities.invokeLater( () -> { - try { - CollectEarthWindow.this.openWindow(); - } catch (final Exception e) { - logger.error("Cannot start Earth App", e); //$NON-NLS-1$ - System.exit(0); - } - }); - } - @Override - public void afterPropertiesSet() throws Exception { - init(); + protected ComboBoxItem(int numberOfPoints, String label) { + super(); + this.numberOfPoints = numberOfPoints; + this.label = label; } @Override - public void destroy() throws Exception { - SwingUtilities.invokeAndWait( () -> CollectEarthWindow.this.getFrame().dispose() ); - } - - private void addWindowClosingListener() { - getFrame().addWindowListener(new WindowAdapter() { - - @Override - public void windowClosing(WindowEvent e) { - try { - final String keepOpen = Messages.getString("CollectEarthWindow.37"); //$NON-NLS-1$ - final String close = Messages.getString("CollectEarthWindow.42"); //$NON-NLS-1$ - final String[] options = new String[] { close, keepOpen }; - - final int confirmation = JOptionPane.showOptionDialog(getFrame(), - Messages.getString("CollectEarthWindow.22"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.23"), //$NON-NLS-1$ - JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, keepOpen); - - if (confirmation == JOptionPane.YES_OPTION) { - final Thread stopServer = new Thread("Stopping server") { - @Override - public void run() { - try { - EarthApp.quitServer(); - } catch (final Exception e) { - logger.error("Error when trying to closing the server", e); //$NON-NLS-1$ - } - } - }; - - getFrame().setVisible(false); - getFrame().dispose(); - stopServer.start(); - Thread.sleep(5000); - - System.exit(0); - } - }catch (final InterruptedException e1) { - logger.error("Error when interupting thread", e1); //$NON-NLS-1$ - Thread.currentThread().interrupt(); - } catch (final Exception e1) { - logger.error("Error when trying to shutdown the server when window is closed", e1); //$NON-NLS-1$ - } - - } - }); - } - - private void disableMenuItems() { - if (localPropertiesService.getOperationMode().equals(OperationMode.CLIENT_MODE)) { - for (final JMenuItem menuItem : collectEarthMenu.getServerMenuItems()) { - menuItem.setEnabled(false); - } - } - } - - private void displayWindow() { - getFrame().setLocationRelativeTo(null); - getFrame().pack(); - getFrame().setVisible(true); - } - - protected ActionListener getCloseActionListener() { - return e -> getFrame().dispatchEvent(new WindowEvent(getFrame(), WindowEvent.WINDOW_CLOSING)); - } - - public JFrame getFrame() { - return frame; - } - - private String getOperator() { - return localPropertiesService.getOperator(); - } - - private void initializeMenu() { - - collectEarthMenu.removeAll(); - collectEarthMenu.init(); - getFrame().setJMenuBar( collectEarthMenu ); - - disableMenuItems(); - } - - private void updateOperatorName() { - final String operatorName = operatorTextField.getText().trim(); - if( !operatorName.equals(localPropertiesService.getOperator() ) ) { - if (operatorName.length() > 5 && operatorName.length() < 50 ) { - localPropertiesService.saveOperator(operatorName); - operatorTextField.setBackground(Color.white); - JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.65"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.66"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ - } else{ - JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.33"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.34"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - operatorTextField.setText(getOperator()); - } - } - } - - private void initializePanel() { - final JPanel pane = new JPanel(new GridBagLayout()); - - final Border raisedetched = BorderFactory.createRaisedBevelBorder(); - pane.setBorder(raisedetched); - - // Handle Drag and Drop of files into the panel - pane.setTransferHandler(collectEarthTransferHandler); - - final GridBagConstraints c = new GridBagConstraints(); - - operatorTextField = new JTextField(getOperator(), 30); - if (StringUtils.isBlank(getOperator())) { - operatorTextField.setBackground(ERROR_COLOR); - } - - final JLabel operatorTextLabel = new JLabel(Messages.getString("CollectEarthWindow.26"), SwingConstants.CENTER); //$NON-NLS-1$ - operatorTextLabel.setSize(100, 20); - - // final JButton updateOperator = new JButton(Messages.getString("CollectEarthWindow.27")); //$NON-NLS-1$ - c.insets = new Insets(3, 3, 3, 3); - c.fill = GridBagConstraints.HORIZONTAL; - c.gridx = 0; - c.gridy = 0; - pane.add(operatorTextLabel, c); - - c.weightx = 0; - c.gridx = 1; - c.gridy = 0; - pane.add(operatorTextField, c); - - c.gridx = 2; - c.gridy = 0; - // pane.add(updateOperator, c); - - c.gridx = 0; - c.gridy++; - c.gridwidth = GridBagConstraints.REMAINDER; - pane.add(new JLabel(Messages.getString("CollectEarthWindow.28") + "
" //$NON-NLS-1$ //$NON-NLS-2$ - + Messages.getString("CollectEarthWindow.30")), c); //$NON-NLS-1$ - - c.gridx = 0; - c.gridy++; - c.gridwidth = GridBagConstraints.REMAINDER; - c.fill = GridBagConstraints.NONE; - final JButton propertiesButton = new JButton(Messages.getString("CollectEarthWindow.15")); //$NON-NLS-1$ - propertiesButton.addActionListener( collectEarthMenu.getPropertiesAction( frame ) ); - pane.add(propertiesButton, c); - - getFrame().getContentPane().add(pane); - - // Three seconds after the last key is typed on hte text field the operator name changes on the properties service - Timer timerOperatorChanged = new Timer(3000, e-> updateOperatorName() ); - - operatorTextField.addKeyListener( new KeyAdapter() { - @Override - public void keyTyped(KeyEvent e) { - timerOperatorChanged.restart(); - } - }); - } - - private void initializeWindow() { - - // Initialize the translations - Messages.setLocale(localPropertiesService.getUiLanguage().getLocale()); - getFrame().setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - getFrame().setResizable(false); - try { - getFrame().setIconImage( - new ImageIcon(new File("images/smallOpenForisBanner.png").toURI().toURL()).getImage()); //$NON-NLS-1$ - } catch (final MalformedURLException e2) { - logger.error(Messages.getString("CollectEarthWindow.21"), e2); //$NON-NLS-1$ + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + ComboBoxItem other = (ComboBoxItem) obj; + if (numberOfPoints == null) { + if (other.numberOfPoints != null) + return false; + } else { + if (!numberOfPoints.equals(other.numberOfPoints)) + return false; } - addWindowClosingListener(); + return true; } - protected void openWindow() { - initializeWindow(); - initializePanel(); - initializeMenu(); - displayWindow(); - - if (StringUtils.isBlank(getOperator())) { - JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.35"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.36"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - } - - changeFrameTitle(); + public int getNumberOfPoints() { + return numberOfPoints; } - public void changeFrameTitle() { - String name = " - No survey loaded"; - if (earthSurveyService.getCollectSurvey() != null) { - if (!StringUtils.isBlank(earthSurveyService.getCollectSurvey() - .getProjectName(localPropertiesService.getUiLanguage().getLocale().getLanguage()))) { - name = " - " + earthSurveyService.getCollectSurvey() - .getProjectName(localPropertiesService.getUiLanguage().getLocale().getLanguage()); - } else if (!StringUtils.isBlank(earthSurveyService.getCollectSurvey().getProjectName())) { - name = " - " + earthSurveyService.getCollectSurvey().getProjectName(); - } else { - name = " - " + earthSurveyService.getCollectSurvey() - .getDescription(localPropertiesService.getUiLanguage().getLocale().getLanguage()); - } - } - getFrame().setTitle(Messages.getString("CollectEarthWindow.19") + name); + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((label == null) ? 0 : label.hashCode()); + result = prime * result + ((numberOfPoints == null) ? 0 : numberOfPoints.hashCode()); + return result; } - void setFrame(JFrame frame) { - this.frame = frame; + @Override + public String toString() { + return label; } } \ No newline at end of file From bd855d38aabbaf829739cd9515e471d4a48e4ba6 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:43 +0100 Subject: [PATCH 0294/1620] New translations CsvColumn.java (French) --- .../earth/app/view/Messages_fr.properties | 63 ++++++------------- 1 file changed, 20 insertions(+), 43 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index b3ee730e05..e56dd39728 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,56 +1,33 @@ package org.openforis.collect.earth.app.view; -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ -class ComboBoxItem { - - private Integer numberOfPoints; - private String label; - - protected ComboBoxItem(int numberOfPoints, String label) { - super(); - this.numberOfPoints = numberOfPoints; - this.label = label; +public class CsvColumn { + + private Integer pos; + private String name; + + public CsvColumn(Integer pos, String name) { + this.pos = pos; + this.name = name; } @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - ComboBoxItem other = (ComboBoxItem) obj; - if (numberOfPoints == null) { - if (other.numberOfPoints != null) - return false; - } else { - if (!numberOfPoints.equals(other.numberOfPoints)) - return false; - } - - return true; + public String toString() { + return name; } - public int getNumberOfPoints() { - return numberOfPoints; + public Integer getPos() { + return pos; } - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((label == null) ? 0 : label.hashCode()); - result = prime * result + ((numberOfPoints == null) ? 0 : numberOfPoints.hashCode()); - return result; + public void setPos(Integer pos) { + this.pos = pos; } - @Override - public String toString() { - return label; + public String getName() { + return name; } -} \ No newline at end of file + public void setName(String name) { + this.name = name; + } +} From b00076a4e50f7d816c824de1e05973397d3f3d58 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:45 +0100 Subject: [PATCH 0295/1620] New translations CsvColumn.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 63 ++++++------------- 1 file changed, 20 insertions(+), 43 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index b3ee730e05..e56dd39728 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,56 +1,33 @@ package org.openforis.collect.earth.app.view; -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ -class ComboBoxItem { - - private Integer numberOfPoints; - private String label; - - protected ComboBoxItem(int numberOfPoints, String label) { - super(); - this.numberOfPoints = numberOfPoints; - this.label = label; +public class CsvColumn { + + private Integer pos; + private String name; + + public CsvColumn(Integer pos, String name) { + this.pos = pos; + this.name = name; } @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - ComboBoxItem other = (ComboBoxItem) obj; - if (numberOfPoints == null) { - if (other.numberOfPoints != null) - return false; - } else { - if (!numberOfPoints.equals(other.numberOfPoints)) - return false; - } - - return true; + public String toString() { + return name; } - public int getNumberOfPoints() { - return numberOfPoints; + public Integer getPos() { + return pos; } - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((label == null) ? 0 : label.hashCode()); - result = prime * result + ((numberOfPoints == null) ? 0 : numberOfPoints.hashCode()); - return result; + public void setPos(Integer pos) { + this.pos = pos; } - @Override - public String toString() { - return label; + public String getName() { + return name; } -} \ No newline at end of file + public void setName(String name) { + this.name = name; + } +} From 229cee43b648f6ceed20f5e6f46a0136269e3c72 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:46 +0100 Subject: [PATCH 0296/1620] New translations ExportProcessMonitorDialog.java (Spanish) --- .../earth/app/view/Messages_es.properties | 95 +++++++++++-------- 1 file changed, 53 insertions(+), 42 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index b3ee730e05..0ccb8f2366 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,56 +1,67 @@ package org.openforis.collect.earth.app.view; -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ -class ComboBoxItem { +import java.io.File; - private Integer numberOfPoints; - private String label; +import javax.swing.JFrame; +import javax.swing.ProgressMonitor; - protected ComboBoxItem(int numberOfPoints, String label) { - super(); - this.numberOfPoints = numberOfPoints; - this.label = label; - } +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.view.ExportActionListener.RecordsToExport; +import org.openforis.collect.io.data.DataExportStatus; +import org.openforis.collect.manager.process.AbstractProcess; - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - ComboBoxItem other = (ComboBoxItem) obj; - if (numberOfPoints == null) { - if (other.numberOfPoints != null) - return false; - } else { - if (!numberOfPoints.equals(other.numberOfPoints)) - return false; - } +public class ExportProcessMonitorDialog extends ProcessMonitorDialog { - return true; - } - public int getNumberOfPoints() { - return numberOfPoints; + private RecordsToExport recordsToExport; + private DataFormat exportFormat; + private EarthSurveyService earthSurveyService; + private LocalPropertiesService localPropertiesService; + private File exportToFile; + + public ExportProcessMonitorDialog(AbstractProcess exportProcess, JFrame parentFrame, RecordsToExport recordsToExport, DataFormat exportFormat, EarthSurveyService earthSurveyService, File exportToFile, LocalPropertiesService localPropertiesService ) { + super(); + this.process = exportProcess; + this.recordsToExport = recordsToExport; + this.exportFormat = exportFormat; + this.earthSurveyService = earthSurveyService; + this.exportToFile = exportToFile; + this.localPropertiesService = localPropertiesService; + progressMonitor = new ProgressMonitor(parentFrame, Messages.getString("ExportDialogProcessMonitor.0"), Messages.getString("ExportDialogProcessMonitor.1"), 0, 100); //$NON-NLS-1$ //$NON-NLS-2$ + progressMonitor.setMillisToPopup(1000); + } - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((label == null) ? 0 : label.hashCode()); - result = prime * result + ((numberOfPoints == null) ? 0 : numberOfPoints.hashCode()); - return result; + protected String getProcessActionMessage() { + return Messages.getString("ExportDialogProcessMonitor.4"); //$NON-NLS-1$ } @Override - public String toString() { - return label; + public void run() { + + try { + monitorProgress(); + process.call(); + if( process.getStatus().isComplete() && exportFormat.equals( DataFormat.ZIP_WITH_XML ) && recordsToExport.equals(RecordsToExport.MODIFIED_SINCE_LAST_EXPORT) ){ + String surveyName = ""; //$NON-NLS-1$ + if( earthSurveyService.getCollectSurvey()!= null ){ + surveyName = earthSurveyService.getCollectSurvey().getName(); + } + localPropertiesService.setLastExportedDate( surveyName ); + + } + + if( process.getStatus().isComplete() && ( exportFormat.equals( DataFormat.CSV ) || exportFormat.equals( DataFormat.FUSION ) || exportFormat.equals( DataFormat.KML_FILE ) ) ) { + CollectEarthUtils.openFile( exportToFile ); + } + + } catch (final Exception e) { + logger.error("Error starting the process", e); //$NON-NLS-1$ + } + } -} \ No newline at end of file + +} From 0d711b0454422c60f8196c3816dce3310f2aafc8 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:46 +0100 Subject: [PATCH 0297/1620] New translations CsvColumn.java (English) --- .../earth/app/view/Messages_en.properties | 63 ++++++------------- 1 file changed, 20 insertions(+), 43 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index b3ee730e05..e56dd39728 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,56 +1,33 @@ package org.openforis.collect.earth.app.view; -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ -class ComboBoxItem { - - private Integer numberOfPoints; - private String label; - - protected ComboBoxItem(int numberOfPoints, String label) { - super(); - this.numberOfPoints = numberOfPoints; - this.label = label; +public class CsvColumn { + + private Integer pos; + private String name; + + public CsvColumn(Integer pos, String name) { + this.pos = pos; + this.name = name; } @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - ComboBoxItem other = (ComboBoxItem) obj; - if (numberOfPoints == null) { - if (other.numberOfPoints != null) - return false; - } else { - if (!numberOfPoints.equals(other.numberOfPoints)) - return false; - } - - return true; + public String toString() { + return name; } - public int getNumberOfPoints() { - return numberOfPoints; + public Integer getPos() { + return pos; } - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((label == null) ? 0 : label.hashCode()); - result = prime * result + ((numberOfPoints == null) ? 0 : numberOfPoints.hashCode()); - return result; + public void setPos(Integer pos) { + this.pos = pos; } - @Override - public String toString() { - return label; + public String getName() { + return name; } -} \ No newline at end of file + public void setName(String name) { + this.name = name; + } +} From 743c49be229462bf87c433f6c8ce23d39c10bc8a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:47 +0100 Subject: [PATCH 0298/1620] New translations DataFormat.java (French) --- .../earth/app/view/Messages_fr.properties | 67 ++++++++++++------- 1 file changed, 43 insertions(+), 24 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index e56dd39728..521446a595 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,33 +1,52 @@ package org.openforis.collect.earth.app.view; -public class CsvColumn { - - private Integer pos; - private String name; - - public CsvColumn(Integer pos, String name) { - this.pos = pos; - this.name = name; +import java.util.Arrays; + +public enum DataFormat{ + PROJECT_DEFINITION_FILE( + new String[]{"cep"}, Messages.getString("JFileChooserExistsAware.0")), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + ZIP_WITH_XML(new String[]{"zip", "collect-data"},Messages.getString("CollectEarthWindow.48")), //$NON-NLS-1$ //$NON-NLS-2$ + CSV(new String[]{"csv"}, Messages.getString("CollectEarthWindow.38")), //$NON-NLS-1$ //$NON-NLS-2$ + FUSION(new String[]{"csv"}, Messages.getString("CollectEarthWindow.49")), //$NON-NLS-1$ //$NON-NLS-2$ + COLLECT_COORDS(new String[]{"ced", "csv"}, "Collect Earth plots"),//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + KML_FILE(new String[]{"kml"}, "Google Earth Kml File"), //$NON-NLS-1$ //$NON-NLS-2$ + COLLECT_BACKUP(new String[]{"collect-data"}, "Collect Backup"), + SAIKU_ZIP( new String[] {"zip"}, "ZIP Saiku Tool Export" ), + GHGI_ZIP_FILE(new String[]{"zip"}, "IPCC GHGi Tool Package"); //$NON-NLS-1$ //$NON-NLS-2$ + + private String[] fileExtension; + private String description; + + private DataFormat(String[] fileExtension, String description) { + this.fileExtension = fileExtension; + this.description = description; } - @Override - public String toString() { - return name; + public String[] getPossibleFileExtensions() { + return fileExtension; } - - public Integer getPos() { - return pos; + + public String getDefaultExtension() { + return fileExtension[0]; } - - public void setPos(Integer pos) { - this.pos = pos; + + + public String getDescription() { + return description; } - - public String getName() { - return name; + + public boolean checkFileExtensionMatches( String fileExtensionToCheck){ + for (String ext : fileExtension) { + if( ext.equalsIgnoreCase( fileExtensionToCheck)){ + return true; + } + } + return false; } - - public void setName(String name) { - this.name = name; + + @Override + public String toString() { + return Arrays.toString(fileExtension); } -} + +} \ No newline at end of file From 217f5ea7065128f9473739dcb865f957e18253a1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:48 +0100 Subject: [PATCH 0299/1620] New translations DataFormat.java (Spanish) --- .../earth/app/view/Messages_es.properties | 101 ++++++++---------- 1 file changed, 43 insertions(+), 58 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 0ccb8f2366..521446a595 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,67 +1,52 @@ package org.openforis.collect.earth.app.view; -import java.io.File; - -import javax.swing.JFrame; -import javax.swing.ProgressMonitor; - -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.view.ExportActionListener.RecordsToExport; -import org.openforis.collect.io.data.DataExportStatus; -import org.openforis.collect.manager.process.AbstractProcess; - -public class ExportProcessMonitorDialog extends ProcessMonitorDialog { - - - private RecordsToExport recordsToExport; - private DataFormat exportFormat; - private EarthSurveyService earthSurveyService; - private LocalPropertiesService localPropertiesService; - private File exportToFile; - - public ExportProcessMonitorDialog(AbstractProcess exportProcess, JFrame parentFrame, RecordsToExport recordsToExport, DataFormat exportFormat, EarthSurveyService earthSurveyService, File exportToFile, LocalPropertiesService localPropertiesService ) { - super(); - this.process = exportProcess; - this.recordsToExport = recordsToExport; - this.exportFormat = exportFormat; - this.earthSurveyService = earthSurveyService; - this.exportToFile = exportToFile; - this.localPropertiesService = localPropertiesService; - progressMonitor = new ProgressMonitor(parentFrame, Messages.getString("ExportDialogProcessMonitor.0"), Messages.getString("ExportDialogProcessMonitor.1"), 0, 100); //$NON-NLS-1$ //$NON-NLS-2$ - progressMonitor.setMillisToPopup(1000); - +import java.util.Arrays; + +public enum DataFormat{ + PROJECT_DEFINITION_FILE( + new String[]{"cep"}, Messages.getString("JFileChooserExistsAware.0")), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + ZIP_WITH_XML(new String[]{"zip", "collect-data"},Messages.getString("CollectEarthWindow.48")), //$NON-NLS-1$ //$NON-NLS-2$ + CSV(new String[]{"csv"}, Messages.getString("CollectEarthWindow.38")), //$NON-NLS-1$ //$NON-NLS-2$ + FUSION(new String[]{"csv"}, Messages.getString("CollectEarthWindow.49")), //$NON-NLS-1$ //$NON-NLS-2$ + COLLECT_COORDS(new String[]{"ced", "csv"}, "Collect Earth plots"),//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + KML_FILE(new String[]{"kml"}, "Google Earth Kml File"), //$NON-NLS-1$ //$NON-NLS-2$ + COLLECT_BACKUP(new String[]{"collect-data"}, "Collect Backup"), + SAIKU_ZIP( new String[] {"zip"}, "ZIP Saiku Tool Export" ), + GHGI_ZIP_FILE(new String[]{"zip"}, "IPCC GHGi Tool Package"); //$NON-NLS-1$ //$NON-NLS-2$ + + private String[] fileExtension; + private String description; + + private DataFormat(String[] fileExtension, String description) { + this.fileExtension = fileExtension; + this.description = description; } - protected String getProcessActionMessage() { - return Messages.getString("ExportDialogProcessMonitor.4"); //$NON-NLS-1$ + public String[] getPossibleFileExtensions() { + return fileExtension; } - - @Override - public void run() { - - try { - monitorProgress(); - process.call(); - if( process.getStatus().isComplete() && exportFormat.equals( DataFormat.ZIP_WITH_XML ) && recordsToExport.equals(RecordsToExport.MODIFIED_SINCE_LAST_EXPORT) ){ - String surveyName = ""; //$NON-NLS-1$ - if( earthSurveyService.getCollectSurvey()!= null ){ - surveyName = earthSurveyService.getCollectSurvey().getName(); - } - localPropertiesService.setLastExportedDate( surveyName ); - - } - - if( process.getStatus().isComplete() && ( exportFormat.equals( DataFormat.CSV ) || exportFormat.equals( DataFormat.FUSION ) || exportFormat.equals( DataFormat.KML_FILE ) ) ) { - CollectEarthUtils.openFile( exportToFile ); + + public String getDefaultExtension() { + return fileExtension[0]; + } + + + public String getDescription() { + return description; + } + + public boolean checkFileExtensionMatches( String fileExtensionToCheck){ + for (String ext : fileExtension) { + if( ext.equalsIgnoreCase( fileExtensionToCheck)){ + return true; } - - } catch (final Exception e) { - logger.error("Error starting the process", e); //$NON-NLS-1$ } - + return false; + } + + @Override + public String toString() { + return Arrays.toString(fileExtension); } - -} +} \ No newline at end of file From 0b379b67ba8a590a5cf51364d2932b1d79d1cfae Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:50 +0100 Subject: [PATCH 0300/1620] New translations DataFormat.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 67 ++++++++++++------- 1 file changed, 43 insertions(+), 24 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index e56dd39728..521446a595 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,33 +1,52 @@ package org.openforis.collect.earth.app.view; -public class CsvColumn { - - private Integer pos; - private String name; - - public CsvColumn(Integer pos, String name) { - this.pos = pos; - this.name = name; +import java.util.Arrays; + +public enum DataFormat{ + PROJECT_DEFINITION_FILE( + new String[]{"cep"}, Messages.getString("JFileChooserExistsAware.0")), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + ZIP_WITH_XML(new String[]{"zip", "collect-data"},Messages.getString("CollectEarthWindow.48")), //$NON-NLS-1$ //$NON-NLS-2$ + CSV(new String[]{"csv"}, Messages.getString("CollectEarthWindow.38")), //$NON-NLS-1$ //$NON-NLS-2$ + FUSION(new String[]{"csv"}, Messages.getString("CollectEarthWindow.49")), //$NON-NLS-1$ //$NON-NLS-2$ + COLLECT_COORDS(new String[]{"ced", "csv"}, "Collect Earth plots"),//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + KML_FILE(new String[]{"kml"}, "Google Earth Kml File"), //$NON-NLS-1$ //$NON-NLS-2$ + COLLECT_BACKUP(new String[]{"collect-data"}, "Collect Backup"), + SAIKU_ZIP( new String[] {"zip"}, "ZIP Saiku Tool Export" ), + GHGI_ZIP_FILE(new String[]{"zip"}, "IPCC GHGi Tool Package"); //$NON-NLS-1$ //$NON-NLS-2$ + + private String[] fileExtension; + private String description; + + private DataFormat(String[] fileExtension, String description) { + this.fileExtension = fileExtension; + this.description = description; } - @Override - public String toString() { - return name; + public String[] getPossibleFileExtensions() { + return fileExtension; } - - public Integer getPos() { - return pos; + + public String getDefaultExtension() { + return fileExtension[0]; } - - public void setPos(Integer pos) { - this.pos = pos; + + + public String getDescription() { + return description; } - - public String getName() { - return name; + + public boolean checkFileExtensionMatches( String fileExtensionToCheck){ + for (String ext : fileExtension) { + if( ext.equalsIgnoreCase( fileExtensionToCheck)){ + return true; + } + } + return false; } - - public void setName(String name) { - this.name = name; + + @Override + public String toString() { + return Arrays.toString(fileExtension); } -} + +} \ No newline at end of file From 2c7a80274e764440e2f998862ec939ff57fc44d3 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:51 +0100 Subject: [PATCH 0301/1620] New translations DataFormat.java (English) --- .../earth/app/view/Messages_en.properties | 67 ++++++++++++------- 1 file changed, 43 insertions(+), 24 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index e56dd39728..521446a595 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,33 +1,52 @@ package org.openforis.collect.earth.app.view; -public class CsvColumn { - - private Integer pos; - private String name; - - public CsvColumn(Integer pos, String name) { - this.pos = pos; - this.name = name; +import java.util.Arrays; + +public enum DataFormat{ + PROJECT_DEFINITION_FILE( + new String[]{"cep"}, Messages.getString("JFileChooserExistsAware.0")), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + ZIP_WITH_XML(new String[]{"zip", "collect-data"},Messages.getString("CollectEarthWindow.48")), //$NON-NLS-1$ //$NON-NLS-2$ + CSV(new String[]{"csv"}, Messages.getString("CollectEarthWindow.38")), //$NON-NLS-1$ //$NON-NLS-2$ + FUSION(new String[]{"csv"}, Messages.getString("CollectEarthWindow.49")), //$NON-NLS-1$ //$NON-NLS-2$ + COLLECT_COORDS(new String[]{"ced", "csv"}, "Collect Earth plots"),//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + KML_FILE(new String[]{"kml"}, "Google Earth Kml File"), //$NON-NLS-1$ //$NON-NLS-2$ + COLLECT_BACKUP(new String[]{"collect-data"}, "Collect Backup"), + SAIKU_ZIP( new String[] {"zip"}, "ZIP Saiku Tool Export" ), + GHGI_ZIP_FILE(new String[]{"zip"}, "IPCC GHGi Tool Package"); //$NON-NLS-1$ //$NON-NLS-2$ + + private String[] fileExtension; + private String description; + + private DataFormat(String[] fileExtension, String description) { + this.fileExtension = fileExtension; + this.description = description; } - @Override - public String toString() { - return name; + public String[] getPossibleFileExtensions() { + return fileExtension; } - - public Integer getPos() { - return pos; + + public String getDefaultExtension() { + return fileExtension[0]; } - - public void setPos(Integer pos) { - this.pos = pos; + + + public String getDescription() { + return description; } - - public String getName() { - return name; + + public boolean checkFileExtensionMatches( String fileExtensionToCheck){ + for (String ext : fileExtension) { + if( ext.equalsIgnoreCase( fileExtensionToCheck)){ + return true; + } + } + return false; } - - public void setName(String name) { - this.name = name; + + @Override + public String toString() { + return Arrays.toString(fileExtension); } -} + +} \ No newline at end of file From 94c02eaf19f175d60b14f84a76d8fd8332b84c6c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:52 +0100 Subject: [PATCH 0302/1620] New translations ExportActionListener.java (French) --- .../earth/app/view/Messages_fr.properties | 239 ++++++++++++++---- 1 file changed, 194 insertions(+), 45 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 521446a595..6f1756ce73 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,52 +1,201 @@ package org.openforis.collect.earth.app.view; -import java.util.Arrays; - -public enum DataFormat{ - PROJECT_DEFINITION_FILE( - new String[]{"cep"}, Messages.getString("JFileChooserExistsAware.0")), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - ZIP_WITH_XML(new String[]{"zip", "collect-data"},Messages.getString("CollectEarthWindow.48")), //$NON-NLS-1$ //$NON-NLS-2$ - CSV(new String[]{"csv"}, Messages.getString("CollectEarthWindow.38")), //$NON-NLS-1$ //$NON-NLS-2$ - FUSION(new String[]{"csv"}, Messages.getString("CollectEarthWindow.49")), //$NON-NLS-1$ //$NON-NLS-2$ - COLLECT_COORDS(new String[]{"ced", "csv"}, "Collect Earth plots"),//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - KML_FILE(new String[]{"kml"}, "Google Earth Kml File"), //$NON-NLS-1$ //$NON-NLS-2$ - COLLECT_BACKUP(new String[]{"collect-data"}, "Collect Backup"), - SAIKU_ZIP( new String[] {"zip"}, "ZIP Saiku Tool Export" ), - GHGI_ZIP_FILE(new String[]{"zip"}, "IPCC GHGi Tool Package"); //$NON-NLS-1$ //$NON-NLS-2$ - - private String[] fileExtension; - private String description; - - private DataFormat(String[] fileExtension, String description) { - this.fileExtension = fileExtension; - this.description = description; - } - - public String[] getPossibleFileExtensions() { - return fileExtension; - } - - public String getDefaultExtension() { - return fileExtension[0]; - } - - - public String getDescription() { - return description; - } - - public boolean checkFileExtensionMatches( String fileExtensionToCheck){ - for (String ext : fileExtension) { - if( ext.equalsIgnoreCase( fileExtensionToCheck)){ - return true; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.text.DateFormat; +import java.text.Normalizer; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.swing.JPanel; + +import org.apache.commons.lang3.StringUtils; +import org.jdesktop.swingx.JXDatePicker; +import org.openforis.collect.earth.app.service.DataImportExportService; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.io.data.DataExportStatus; +import org.openforis.collect.manager.process.AbstractProcess; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public final class ExportActionListener implements ActionListener { + private final DataFormat exportFormat; + private JFrame frame; + private LocalPropertiesService localPropertiesService; + private DataImportExportService dataExportService; + private EarthSurveyService earthSurveyService; + private Logger logger = LoggerFactory.getLogger(ExportActionListener.class); + private RecordsToExport recordsToExport; + + public enum RecordsToExport { + ALL, MODIFIED_SINCE_LAST_EXPORT, PICK_FROM_DATE + } + + public ExportActionListener(DataFormat exportFormat, RecordsToExport recordsToExport, JFrame frame, + LocalPropertiesService localPropertiesService, DataImportExportService dataExportService, + EarthSurveyService earthSurveyService) { + this.exportFormat = exportFormat; + this.frame = frame; + this.localPropertiesService = localPropertiesService; + this.dataExportService = dataExportService; + this.earthSurveyService = earthSurveyService; + this.recordsToExport = recordsToExport; + } + + @Override + public void actionPerformed(ActionEvent e) { + try { + CollectEarthWindow.startWaiting(frame); + + Date recordsModifiedSince = null; + if (recordsToExport.equals(RecordsToExport.MODIFIED_SINCE_LAST_EXPORT)) { + String surveyName = ""; //$NON-NLS-1$ + if (earthSurveyService.getCollectSurvey() != null) { + surveyName = earthSurveyService.getCollectSurvey().getName(); + } + recordsModifiedSince = localPropertiesService.getLastExportedDate(surveyName); + } else if (recordsToExport.equals(RecordsToExport.PICK_FROM_DATE)) { + recordsModifiedSince = getPickDateDlg(); + if (recordsModifiedSince == null) { + // No date chosen, do not proceed with the export + return; + } } + + exportDataTo(exportFormat, recordsModifiedSince); + } finally { + CollectEarthWindow.endWaiting(frame); } - return false; + } - - @Override - public String toString() { - return Arrays.toString(fileExtension); + + private Date getPickDateDlg() { + + JPanel panel = new JPanel(); + + JXDatePicker picker = new JXDatePicker(); + picker.setDate(Calendar.getInstance().getTime()); + picker.setFormats(new SimpleDateFormat("dd.MM.yyyy")); //$NON-NLS-1$ + + panel.add(picker); + + int result = JOptionPane.showConfirmDialog(frame, panel, Messages.getString("ExportActionListener.1"), //$NON-NLS-1$ + JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); + if (result == JOptionPane.OK_OPTION) { + return picker.getDate(); + } else { + return null; + } + } + + private File exportDataTo(DataFormat exportType, Date recordsModifiedSince) { + String preselectedName = getPreselectedName(exportType, recordsModifiedSince); + + File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(exportType, true, false, preselectedName, + localPropertiesService, frame); + + File exportedFile = null; + if (exportToFile != null && exportToFile.length > 0) { + startExportingData(exportType, recordsModifiedSince, exportToFile[0]); + exportedFile = exportToFile[0]; + } + + return exportedFile; } -} \ No newline at end of file + private boolean promptForLabelInclusion(DataFormat exportType) { + boolean includeLabels = false; + + if (exportType.equals(DataFormat.CSV)) { + int result = JOptionPane.showConfirmDialog(frame, "Include labels for code attributes", "Include labels", + JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); + includeLabels = (result == JOptionPane.YES_OPTION); + } + + return includeLabels; + } + + private void startExportingData(DataFormat exportType, Date recordsModifiedSince, File exportToFile) { + AbstractProcess exportProcess = null; + try { + exportProcess = getExportProcess(exportType, recordsModifiedSince, exportToFile); + if (exportProcess != null) { + ExportProcessMonitorDialog exportProcessWorker = new ExportProcessMonitorDialog(exportProcess, frame, + recordsToExport, exportType, earthSurveyService, exportToFile, localPropertiesService); + exportProcessWorker.start(); + } + } catch (Exception e1) { + logger.error("What happened?", e1); //$NON-NLS-1$ //$NON-NLS-2$ + JOptionPane.showMessageDialog(this.frame, Messages.getString("CollectEarthWindow.0"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.1"), //$NON-NLS-1$ + JOptionPane.ERROR_MESSAGE); + logger.error( + "Error exporting data to " + exportToFile.getAbsolutePath() + " in format " + exportType.name(), //$NON-NLS-1$ //$NON-NLS-2$ + e1); + } + } + + private AbstractProcess getExportProcess(DataFormat exportType, Date recordsModifiedSince, + File exportToFile) throws Exception { + AbstractProcess exportProcess = null; + boolean addLabels = false; + switch (exportType) { + case CSV: + addLabels = promptForLabelInclusion(exportType); + exportProcess = dataExportService.exportSurveyAsCsv(exportToFile, addLabels); + break; + case ZIP_WITH_XML: + exportProcess = dataExportService.exportSurveyAsZipWithXml(exportToFile, recordsModifiedSince); + break; + case FUSION: + addLabels = promptForLabelInclusion(exportType); + exportProcess = dataExportService.exportSurveyAsFusionTable(exportToFile, addLabels); + break; + case COLLECT_BACKUP: + exportProcess = dataExportService.exportSurveyAsBackup(exportToFile); + break; + default: + break; + } + return exportProcess; + } + + private String getPreselectedName(DataFormat exportType, Date modifiedSince) { + + String operator = ""; + + try { + operator = localPropertiesService.getOperator(); + + operator = StringUtils.deleteWhitespace(operator); + // Replaces character like TĥïŠĩš â fůňķŷ Šťŕĭńġ with This is a funky String + operator = Normalizer.normalize(operator, Normalizer.Form.NFD).replaceAll("[^\\p{ASCII}]", ""); + + // Remove non-alphanumeric characters + operator = operator.replaceAll("[^a-zA-Z0-9]", ""); + + } catch (Exception e) { + logger.error("Error normalizing operator name ", e); + } + + String preselectName = operator + "_collectedData_"; //$NON-NLS-1$ + + preselectName += earthSurveyService.getCollectSurvey().getName(); + DateFormat dateFormat = new SimpleDateFormat("ddMMyy_HHmmss"); //$NON-NLS-1$ + if (modifiedSince == null) { + preselectName += "_on_" + dateFormat.format(new Date()); //$NON-NLS-1$ + } else { + + preselectName += "_" + dateFormat.format(modifiedSince) + "_to_" + dateFormat.format(new Date()); //$NON-NLS-1$ //$NON-NLS-2$ + } + + preselectName += "_" + exportType.name() + "." + exportType.getDefaultExtension(); //$NON-NLS-1$ //$NON-NLS-2$ + + return preselectName; + } +} From f3b2b3b9c2a85cd97399a470abc5cbba3e2f066c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:53 +0100 Subject: [PATCH 0303/1620] New translations ExportActionListener.java (Spanish) --- .../earth/app/view/Messages_es.properties | 239 ++++++++++++++---- 1 file changed, 194 insertions(+), 45 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 521446a595..6f1756ce73 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,52 +1,201 @@ package org.openforis.collect.earth.app.view; -import java.util.Arrays; - -public enum DataFormat{ - PROJECT_DEFINITION_FILE( - new String[]{"cep"}, Messages.getString("JFileChooserExistsAware.0")), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - ZIP_WITH_XML(new String[]{"zip", "collect-data"},Messages.getString("CollectEarthWindow.48")), //$NON-NLS-1$ //$NON-NLS-2$ - CSV(new String[]{"csv"}, Messages.getString("CollectEarthWindow.38")), //$NON-NLS-1$ //$NON-NLS-2$ - FUSION(new String[]{"csv"}, Messages.getString("CollectEarthWindow.49")), //$NON-NLS-1$ //$NON-NLS-2$ - COLLECT_COORDS(new String[]{"ced", "csv"}, "Collect Earth plots"),//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - KML_FILE(new String[]{"kml"}, "Google Earth Kml File"), //$NON-NLS-1$ //$NON-NLS-2$ - COLLECT_BACKUP(new String[]{"collect-data"}, "Collect Backup"), - SAIKU_ZIP( new String[] {"zip"}, "ZIP Saiku Tool Export" ), - GHGI_ZIP_FILE(new String[]{"zip"}, "IPCC GHGi Tool Package"); //$NON-NLS-1$ //$NON-NLS-2$ - - private String[] fileExtension; - private String description; - - private DataFormat(String[] fileExtension, String description) { - this.fileExtension = fileExtension; - this.description = description; - } - - public String[] getPossibleFileExtensions() { - return fileExtension; - } - - public String getDefaultExtension() { - return fileExtension[0]; - } - - - public String getDescription() { - return description; - } - - public boolean checkFileExtensionMatches( String fileExtensionToCheck){ - for (String ext : fileExtension) { - if( ext.equalsIgnoreCase( fileExtensionToCheck)){ - return true; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.text.DateFormat; +import java.text.Normalizer; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.swing.JPanel; + +import org.apache.commons.lang3.StringUtils; +import org.jdesktop.swingx.JXDatePicker; +import org.openforis.collect.earth.app.service.DataImportExportService; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.io.data.DataExportStatus; +import org.openforis.collect.manager.process.AbstractProcess; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public final class ExportActionListener implements ActionListener { + private final DataFormat exportFormat; + private JFrame frame; + private LocalPropertiesService localPropertiesService; + private DataImportExportService dataExportService; + private EarthSurveyService earthSurveyService; + private Logger logger = LoggerFactory.getLogger(ExportActionListener.class); + private RecordsToExport recordsToExport; + + public enum RecordsToExport { + ALL, MODIFIED_SINCE_LAST_EXPORT, PICK_FROM_DATE + } + + public ExportActionListener(DataFormat exportFormat, RecordsToExport recordsToExport, JFrame frame, + LocalPropertiesService localPropertiesService, DataImportExportService dataExportService, + EarthSurveyService earthSurveyService) { + this.exportFormat = exportFormat; + this.frame = frame; + this.localPropertiesService = localPropertiesService; + this.dataExportService = dataExportService; + this.earthSurveyService = earthSurveyService; + this.recordsToExport = recordsToExport; + } + + @Override + public void actionPerformed(ActionEvent e) { + try { + CollectEarthWindow.startWaiting(frame); + + Date recordsModifiedSince = null; + if (recordsToExport.equals(RecordsToExport.MODIFIED_SINCE_LAST_EXPORT)) { + String surveyName = ""; //$NON-NLS-1$ + if (earthSurveyService.getCollectSurvey() != null) { + surveyName = earthSurveyService.getCollectSurvey().getName(); + } + recordsModifiedSince = localPropertiesService.getLastExportedDate(surveyName); + } else if (recordsToExport.equals(RecordsToExport.PICK_FROM_DATE)) { + recordsModifiedSince = getPickDateDlg(); + if (recordsModifiedSince == null) { + // No date chosen, do not proceed with the export + return; + } } + + exportDataTo(exportFormat, recordsModifiedSince); + } finally { + CollectEarthWindow.endWaiting(frame); } - return false; + } - - @Override - public String toString() { - return Arrays.toString(fileExtension); + + private Date getPickDateDlg() { + + JPanel panel = new JPanel(); + + JXDatePicker picker = new JXDatePicker(); + picker.setDate(Calendar.getInstance().getTime()); + picker.setFormats(new SimpleDateFormat("dd.MM.yyyy")); //$NON-NLS-1$ + + panel.add(picker); + + int result = JOptionPane.showConfirmDialog(frame, panel, Messages.getString("ExportActionListener.1"), //$NON-NLS-1$ + JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); + if (result == JOptionPane.OK_OPTION) { + return picker.getDate(); + } else { + return null; + } + } + + private File exportDataTo(DataFormat exportType, Date recordsModifiedSince) { + String preselectedName = getPreselectedName(exportType, recordsModifiedSince); + + File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(exportType, true, false, preselectedName, + localPropertiesService, frame); + + File exportedFile = null; + if (exportToFile != null && exportToFile.length > 0) { + startExportingData(exportType, recordsModifiedSince, exportToFile[0]); + exportedFile = exportToFile[0]; + } + + return exportedFile; } -} \ No newline at end of file + private boolean promptForLabelInclusion(DataFormat exportType) { + boolean includeLabels = false; + + if (exportType.equals(DataFormat.CSV)) { + int result = JOptionPane.showConfirmDialog(frame, "Include labels for code attributes", "Include labels", + JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); + includeLabels = (result == JOptionPane.YES_OPTION); + } + + return includeLabels; + } + + private void startExportingData(DataFormat exportType, Date recordsModifiedSince, File exportToFile) { + AbstractProcess exportProcess = null; + try { + exportProcess = getExportProcess(exportType, recordsModifiedSince, exportToFile); + if (exportProcess != null) { + ExportProcessMonitorDialog exportProcessWorker = new ExportProcessMonitorDialog(exportProcess, frame, + recordsToExport, exportType, earthSurveyService, exportToFile, localPropertiesService); + exportProcessWorker.start(); + } + } catch (Exception e1) { + logger.error("What happened?", e1); //$NON-NLS-1$ //$NON-NLS-2$ + JOptionPane.showMessageDialog(this.frame, Messages.getString("CollectEarthWindow.0"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.1"), //$NON-NLS-1$ + JOptionPane.ERROR_MESSAGE); + logger.error( + "Error exporting data to " + exportToFile.getAbsolutePath() + " in format " + exportType.name(), //$NON-NLS-1$ //$NON-NLS-2$ + e1); + } + } + + private AbstractProcess getExportProcess(DataFormat exportType, Date recordsModifiedSince, + File exportToFile) throws Exception { + AbstractProcess exportProcess = null; + boolean addLabels = false; + switch (exportType) { + case CSV: + addLabels = promptForLabelInclusion(exportType); + exportProcess = dataExportService.exportSurveyAsCsv(exportToFile, addLabels); + break; + case ZIP_WITH_XML: + exportProcess = dataExportService.exportSurveyAsZipWithXml(exportToFile, recordsModifiedSince); + break; + case FUSION: + addLabels = promptForLabelInclusion(exportType); + exportProcess = dataExportService.exportSurveyAsFusionTable(exportToFile, addLabels); + break; + case COLLECT_BACKUP: + exportProcess = dataExportService.exportSurveyAsBackup(exportToFile); + break; + default: + break; + } + return exportProcess; + } + + private String getPreselectedName(DataFormat exportType, Date modifiedSince) { + + String operator = ""; + + try { + operator = localPropertiesService.getOperator(); + + operator = StringUtils.deleteWhitespace(operator); + // Replaces character like TĥïŠĩš â fůňķŷ Šťŕĭńġ with This is a funky String + operator = Normalizer.normalize(operator, Normalizer.Form.NFD).replaceAll("[^\\p{ASCII}]", ""); + + // Remove non-alphanumeric characters + operator = operator.replaceAll("[^a-zA-Z0-9]", ""); + + } catch (Exception e) { + logger.error("Error normalizing operator name ", e); + } + + String preselectName = operator + "_collectedData_"; //$NON-NLS-1$ + + preselectName += earthSurveyService.getCollectSurvey().getName(); + DateFormat dateFormat = new SimpleDateFormat("ddMMyy_HHmmss"); //$NON-NLS-1$ + if (modifiedSince == null) { + preselectName += "_on_" + dateFormat.format(new Date()); //$NON-NLS-1$ + } else { + + preselectName += "_" + dateFormat.format(modifiedSince) + "_to_" + dateFormat.format(new Date()); //$NON-NLS-1$ //$NON-NLS-2$ + } + + preselectName += "_" + exportType.name() + "." + exportType.getDefaultExtension(); //$NON-NLS-1$ //$NON-NLS-2$ + + return preselectName; + } +} From ccfc565fe990a3aa79f50678fa354acf9acc2a0f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:54 +0100 Subject: [PATCH 0304/1620] New translations ExportActionListener.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 239 ++++++++++++++---- 1 file changed, 194 insertions(+), 45 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 521446a595..6f1756ce73 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,52 +1,201 @@ package org.openforis.collect.earth.app.view; -import java.util.Arrays; - -public enum DataFormat{ - PROJECT_DEFINITION_FILE( - new String[]{"cep"}, Messages.getString("JFileChooserExistsAware.0")), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - ZIP_WITH_XML(new String[]{"zip", "collect-data"},Messages.getString("CollectEarthWindow.48")), //$NON-NLS-1$ //$NON-NLS-2$ - CSV(new String[]{"csv"}, Messages.getString("CollectEarthWindow.38")), //$NON-NLS-1$ //$NON-NLS-2$ - FUSION(new String[]{"csv"}, Messages.getString("CollectEarthWindow.49")), //$NON-NLS-1$ //$NON-NLS-2$ - COLLECT_COORDS(new String[]{"ced", "csv"}, "Collect Earth plots"),//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - KML_FILE(new String[]{"kml"}, "Google Earth Kml File"), //$NON-NLS-1$ //$NON-NLS-2$ - COLLECT_BACKUP(new String[]{"collect-data"}, "Collect Backup"), - SAIKU_ZIP( new String[] {"zip"}, "ZIP Saiku Tool Export" ), - GHGI_ZIP_FILE(new String[]{"zip"}, "IPCC GHGi Tool Package"); //$NON-NLS-1$ //$NON-NLS-2$ - - private String[] fileExtension; - private String description; - - private DataFormat(String[] fileExtension, String description) { - this.fileExtension = fileExtension; - this.description = description; - } - - public String[] getPossibleFileExtensions() { - return fileExtension; - } - - public String getDefaultExtension() { - return fileExtension[0]; - } - - - public String getDescription() { - return description; - } - - public boolean checkFileExtensionMatches( String fileExtensionToCheck){ - for (String ext : fileExtension) { - if( ext.equalsIgnoreCase( fileExtensionToCheck)){ - return true; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.text.DateFormat; +import java.text.Normalizer; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.swing.JPanel; + +import org.apache.commons.lang3.StringUtils; +import org.jdesktop.swingx.JXDatePicker; +import org.openforis.collect.earth.app.service.DataImportExportService; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.io.data.DataExportStatus; +import org.openforis.collect.manager.process.AbstractProcess; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public final class ExportActionListener implements ActionListener { + private final DataFormat exportFormat; + private JFrame frame; + private LocalPropertiesService localPropertiesService; + private DataImportExportService dataExportService; + private EarthSurveyService earthSurveyService; + private Logger logger = LoggerFactory.getLogger(ExportActionListener.class); + private RecordsToExport recordsToExport; + + public enum RecordsToExport { + ALL, MODIFIED_SINCE_LAST_EXPORT, PICK_FROM_DATE + } + + public ExportActionListener(DataFormat exportFormat, RecordsToExport recordsToExport, JFrame frame, + LocalPropertiesService localPropertiesService, DataImportExportService dataExportService, + EarthSurveyService earthSurveyService) { + this.exportFormat = exportFormat; + this.frame = frame; + this.localPropertiesService = localPropertiesService; + this.dataExportService = dataExportService; + this.earthSurveyService = earthSurveyService; + this.recordsToExport = recordsToExport; + } + + @Override + public void actionPerformed(ActionEvent e) { + try { + CollectEarthWindow.startWaiting(frame); + + Date recordsModifiedSince = null; + if (recordsToExport.equals(RecordsToExport.MODIFIED_SINCE_LAST_EXPORT)) { + String surveyName = ""; //$NON-NLS-1$ + if (earthSurveyService.getCollectSurvey() != null) { + surveyName = earthSurveyService.getCollectSurvey().getName(); + } + recordsModifiedSince = localPropertiesService.getLastExportedDate(surveyName); + } else if (recordsToExport.equals(RecordsToExport.PICK_FROM_DATE)) { + recordsModifiedSince = getPickDateDlg(); + if (recordsModifiedSince == null) { + // No date chosen, do not proceed with the export + return; + } } + + exportDataTo(exportFormat, recordsModifiedSince); + } finally { + CollectEarthWindow.endWaiting(frame); } - return false; + } - - @Override - public String toString() { - return Arrays.toString(fileExtension); + + private Date getPickDateDlg() { + + JPanel panel = new JPanel(); + + JXDatePicker picker = new JXDatePicker(); + picker.setDate(Calendar.getInstance().getTime()); + picker.setFormats(new SimpleDateFormat("dd.MM.yyyy")); //$NON-NLS-1$ + + panel.add(picker); + + int result = JOptionPane.showConfirmDialog(frame, panel, Messages.getString("ExportActionListener.1"), //$NON-NLS-1$ + JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); + if (result == JOptionPane.OK_OPTION) { + return picker.getDate(); + } else { + return null; + } + } + + private File exportDataTo(DataFormat exportType, Date recordsModifiedSince) { + String preselectedName = getPreselectedName(exportType, recordsModifiedSince); + + File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(exportType, true, false, preselectedName, + localPropertiesService, frame); + + File exportedFile = null; + if (exportToFile != null && exportToFile.length > 0) { + startExportingData(exportType, recordsModifiedSince, exportToFile[0]); + exportedFile = exportToFile[0]; + } + + return exportedFile; } -} \ No newline at end of file + private boolean promptForLabelInclusion(DataFormat exportType) { + boolean includeLabels = false; + + if (exportType.equals(DataFormat.CSV)) { + int result = JOptionPane.showConfirmDialog(frame, "Include labels for code attributes", "Include labels", + JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); + includeLabels = (result == JOptionPane.YES_OPTION); + } + + return includeLabels; + } + + private void startExportingData(DataFormat exportType, Date recordsModifiedSince, File exportToFile) { + AbstractProcess exportProcess = null; + try { + exportProcess = getExportProcess(exportType, recordsModifiedSince, exportToFile); + if (exportProcess != null) { + ExportProcessMonitorDialog exportProcessWorker = new ExportProcessMonitorDialog(exportProcess, frame, + recordsToExport, exportType, earthSurveyService, exportToFile, localPropertiesService); + exportProcessWorker.start(); + } + } catch (Exception e1) { + logger.error("What happened?", e1); //$NON-NLS-1$ //$NON-NLS-2$ + JOptionPane.showMessageDialog(this.frame, Messages.getString("CollectEarthWindow.0"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.1"), //$NON-NLS-1$ + JOptionPane.ERROR_MESSAGE); + logger.error( + "Error exporting data to " + exportToFile.getAbsolutePath() + " in format " + exportType.name(), //$NON-NLS-1$ //$NON-NLS-2$ + e1); + } + } + + private AbstractProcess getExportProcess(DataFormat exportType, Date recordsModifiedSince, + File exportToFile) throws Exception { + AbstractProcess exportProcess = null; + boolean addLabels = false; + switch (exportType) { + case CSV: + addLabels = promptForLabelInclusion(exportType); + exportProcess = dataExportService.exportSurveyAsCsv(exportToFile, addLabels); + break; + case ZIP_WITH_XML: + exportProcess = dataExportService.exportSurveyAsZipWithXml(exportToFile, recordsModifiedSince); + break; + case FUSION: + addLabels = promptForLabelInclusion(exportType); + exportProcess = dataExportService.exportSurveyAsFusionTable(exportToFile, addLabels); + break; + case COLLECT_BACKUP: + exportProcess = dataExportService.exportSurveyAsBackup(exportToFile); + break; + default: + break; + } + return exportProcess; + } + + private String getPreselectedName(DataFormat exportType, Date modifiedSince) { + + String operator = ""; + + try { + operator = localPropertiesService.getOperator(); + + operator = StringUtils.deleteWhitespace(operator); + // Replaces character like TĥïŠĩš â fůňķŷ Šťŕĭńġ with This is a funky String + operator = Normalizer.normalize(operator, Normalizer.Form.NFD).replaceAll("[^\\p{ASCII}]", ""); + + // Remove non-alphanumeric characters + operator = operator.replaceAll("[^a-zA-Z0-9]", ""); + + } catch (Exception e) { + logger.error("Error normalizing operator name ", e); + } + + String preselectName = operator + "_collectedData_"; //$NON-NLS-1$ + + preselectName += earthSurveyService.getCollectSurvey().getName(); + DateFormat dateFormat = new SimpleDateFormat("ddMMyy_HHmmss"); //$NON-NLS-1$ + if (modifiedSince == null) { + preselectName += "_on_" + dateFormat.format(new Date()); //$NON-NLS-1$ + } else { + + preselectName += "_" + dateFormat.format(modifiedSince) + "_to_" + dateFormat.format(new Date()); //$NON-NLS-1$ //$NON-NLS-2$ + } + + preselectName += "_" + exportType.name() + "." + exportType.getDefaultExtension(); //$NON-NLS-1$ //$NON-NLS-2$ + + return preselectName; + } +} From 285171fb90714cd6c43ef89a4362f318addb05ce Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:55 +0100 Subject: [PATCH 0305/1620] New translations ExportActionListener.java (English) --- .../earth/app/view/Messages_en.properties | 239 ++++++++++++++---- 1 file changed, 194 insertions(+), 45 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 521446a595..6f1756ce73 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,52 +1,201 @@ package org.openforis.collect.earth.app.view; -import java.util.Arrays; - -public enum DataFormat{ - PROJECT_DEFINITION_FILE( - new String[]{"cep"}, Messages.getString("JFileChooserExistsAware.0")), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - ZIP_WITH_XML(new String[]{"zip", "collect-data"},Messages.getString("CollectEarthWindow.48")), //$NON-NLS-1$ //$NON-NLS-2$ - CSV(new String[]{"csv"}, Messages.getString("CollectEarthWindow.38")), //$NON-NLS-1$ //$NON-NLS-2$ - FUSION(new String[]{"csv"}, Messages.getString("CollectEarthWindow.49")), //$NON-NLS-1$ //$NON-NLS-2$ - COLLECT_COORDS(new String[]{"ced", "csv"}, "Collect Earth plots"),//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - KML_FILE(new String[]{"kml"}, "Google Earth Kml File"), //$NON-NLS-1$ //$NON-NLS-2$ - COLLECT_BACKUP(new String[]{"collect-data"}, "Collect Backup"), - SAIKU_ZIP( new String[] {"zip"}, "ZIP Saiku Tool Export" ), - GHGI_ZIP_FILE(new String[]{"zip"}, "IPCC GHGi Tool Package"); //$NON-NLS-1$ //$NON-NLS-2$ - - private String[] fileExtension; - private String description; - - private DataFormat(String[] fileExtension, String description) { - this.fileExtension = fileExtension; - this.description = description; - } - - public String[] getPossibleFileExtensions() { - return fileExtension; - } - - public String getDefaultExtension() { - return fileExtension[0]; - } - - - public String getDescription() { - return description; - } - - public boolean checkFileExtensionMatches( String fileExtensionToCheck){ - for (String ext : fileExtension) { - if( ext.equalsIgnoreCase( fileExtensionToCheck)){ - return true; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.text.DateFormat; +import java.text.Normalizer; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.swing.JPanel; + +import org.apache.commons.lang3.StringUtils; +import org.jdesktop.swingx.JXDatePicker; +import org.openforis.collect.earth.app.service.DataImportExportService; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.io.data.DataExportStatus; +import org.openforis.collect.manager.process.AbstractProcess; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public final class ExportActionListener implements ActionListener { + private final DataFormat exportFormat; + private JFrame frame; + private LocalPropertiesService localPropertiesService; + private DataImportExportService dataExportService; + private EarthSurveyService earthSurveyService; + private Logger logger = LoggerFactory.getLogger(ExportActionListener.class); + private RecordsToExport recordsToExport; + + public enum RecordsToExport { + ALL, MODIFIED_SINCE_LAST_EXPORT, PICK_FROM_DATE + } + + public ExportActionListener(DataFormat exportFormat, RecordsToExport recordsToExport, JFrame frame, + LocalPropertiesService localPropertiesService, DataImportExportService dataExportService, + EarthSurveyService earthSurveyService) { + this.exportFormat = exportFormat; + this.frame = frame; + this.localPropertiesService = localPropertiesService; + this.dataExportService = dataExportService; + this.earthSurveyService = earthSurveyService; + this.recordsToExport = recordsToExport; + } + + @Override + public void actionPerformed(ActionEvent e) { + try { + CollectEarthWindow.startWaiting(frame); + + Date recordsModifiedSince = null; + if (recordsToExport.equals(RecordsToExport.MODIFIED_SINCE_LAST_EXPORT)) { + String surveyName = ""; //$NON-NLS-1$ + if (earthSurveyService.getCollectSurvey() != null) { + surveyName = earthSurveyService.getCollectSurvey().getName(); + } + recordsModifiedSince = localPropertiesService.getLastExportedDate(surveyName); + } else if (recordsToExport.equals(RecordsToExport.PICK_FROM_DATE)) { + recordsModifiedSince = getPickDateDlg(); + if (recordsModifiedSince == null) { + // No date chosen, do not proceed with the export + return; + } } + + exportDataTo(exportFormat, recordsModifiedSince); + } finally { + CollectEarthWindow.endWaiting(frame); } - return false; + } - - @Override - public String toString() { - return Arrays.toString(fileExtension); + + private Date getPickDateDlg() { + + JPanel panel = new JPanel(); + + JXDatePicker picker = new JXDatePicker(); + picker.setDate(Calendar.getInstance().getTime()); + picker.setFormats(new SimpleDateFormat("dd.MM.yyyy")); //$NON-NLS-1$ + + panel.add(picker); + + int result = JOptionPane.showConfirmDialog(frame, panel, Messages.getString("ExportActionListener.1"), //$NON-NLS-1$ + JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); + if (result == JOptionPane.OK_OPTION) { + return picker.getDate(); + } else { + return null; + } + } + + private File exportDataTo(DataFormat exportType, Date recordsModifiedSince) { + String preselectedName = getPreselectedName(exportType, recordsModifiedSince); + + File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(exportType, true, false, preselectedName, + localPropertiesService, frame); + + File exportedFile = null; + if (exportToFile != null && exportToFile.length > 0) { + startExportingData(exportType, recordsModifiedSince, exportToFile[0]); + exportedFile = exportToFile[0]; + } + + return exportedFile; } -} \ No newline at end of file + private boolean promptForLabelInclusion(DataFormat exportType) { + boolean includeLabels = false; + + if (exportType.equals(DataFormat.CSV)) { + int result = JOptionPane.showConfirmDialog(frame, "Include labels for code attributes", "Include labels", + JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); + includeLabels = (result == JOptionPane.YES_OPTION); + } + + return includeLabels; + } + + private void startExportingData(DataFormat exportType, Date recordsModifiedSince, File exportToFile) { + AbstractProcess exportProcess = null; + try { + exportProcess = getExportProcess(exportType, recordsModifiedSince, exportToFile); + if (exportProcess != null) { + ExportProcessMonitorDialog exportProcessWorker = new ExportProcessMonitorDialog(exportProcess, frame, + recordsToExport, exportType, earthSurveyService, exportToFile, localPropertiesService); + exportProcessWorker.start(); + } + } catch (Exception e1) { + logger.error("What happened?", e1); //$NON-NLS-1$ //$NON-NLS-2$ + JOptionPane.showMessageDialog(this.frame, Messages.getString("CollectEarthWindow.0"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.1"), //$NON-NLS-1$ + JOptionPane.ERROR_MESSAGE); + logger.error( + "Error exporting data to " + exportToFile.getAbsolutePath() + " in format " + exportType.name(), //$NON-NLS-1$ //$NON-NLS-2$ + e1); + } + } + + private AbstractProcess getExportProcess(DataFormat exportType, Date recordsModifiedSince, + File exportToFile) throws Exception { + AbstractProcess exportProcess = null; + boolean addLabels = false; + switch (exportType) { + case CSV: + addLabels = promptForLabelInclusion(exportType); + exportProcess = dataExportService.exportSurveyAsCsv(exportToFile, addLabels); + break; + case ZIP_WITH_XML: + exportProcess = dataExportService.exportSurveyAsZipWithXml(exportToFile, recordsModifiedSince); + break; + case FUSION: + addLabels = promptForLabelInclusion(exportType); + exportProcess = dataExportService.exportSurveyAsFusionTable(exportToFile, addLabels); + break; + case COLLECT_BACKUP: + exportProcess = dataExportService.exportSurveyAsBackup(exportToFile); + break; + default: + break; + } + return exportProcess; + } + + private String getPreselectedName(DataFormat exportType, Date modifiedSince) { + + String operator = ""; + + try { + operator = localPropertiesService.getOperator(); + + operator = StringUtils.deleteWhitespace(operator); + // Replaces character like TĥïŠĩš â fůňķŷ Šťŕĭńġ with This is a funky String + operator = Normalizer.normalize(operator, Normalizer.Form.NFD).replaceAll("[^\\p{ASCII}]", ""); + + // Remove non-alphanumeric characters + operator = operator.replaceAll("[^a-zA-Z0-9]", ""); + + } catch (Exception e) { + logger.error("Error normalizing operator name ", e); + } + + String preselectName = operator + "_collectedData_"; //$NON-NLS-1$ + + preselectName += earthSurveyService.getCollectSurvey().getName(); + DateFormat dateFormat = new SimpleDateFormat("ddMMyy_HHmmss"); //$NON-NLS-1$ + if (modifiedSince == null) { + preselectName += "_on_" + dateFormat.format(new Date()); //$NON-NLS-1$ + } else { + + preselectName += "_" + dateFormat.format(modifiedSince) + "_to_" + dateFormat.format(new Date()); //$NON-NLS-1$ //$NON-NLS-2$ + } + + preselectName += "_" + exportType.name() + "." + exportType.getDefaultExtension(); //$NON-NLS-1$ //$NON-NLS-2$ + + return preselectName; + } +} From 8406a56e0ec7caffe41ad3644eb995642f71fff1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:56 +0100 Subject: [PATCH 0306/1620] New translations ExportProcessMonitorDialog.java (French) --- .../earth/app/view/Messages_fr.properties | 206 +++--------------- 1 file changed, 36 insertions(+), 170 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 6f1756ce73..0ccb8f2366 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,201 +1,67 @@ package org.openforis.collect.earth.app.view; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.io.File; -import java.text.DateFormat; -import java.text.Normalizer; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.swing.JPanel; +import javax.swing.ProgressMonitor; -import org.apache.commons.lang3.StringUtils; -import org.jdesktop.swingx.JXDatePicker; -import org.openforis.collect.earth.app.service.DataImportExportService; +import org.openforis.collect.earth.app.CollectEarthUtils; import org.openforis.collect.earth.app.service.EarthSurveyService; import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.view.ExportActionListener.RecordsToExport; import org.openforis.collect.io.data.DataExportStatus; import org.openforis.collect.manager.process.AbstractProcess; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -public final class ExportActionListener implements ActionListener { - private final DataFormat exportFormat; - private JFrame frame; - private LocalPropertiesService localPropertiesService; - private DataImportExportService dataExportService; - private EarthSurveyService earthSurveyService; - private Logger logger = LoggerFactory.getLogger(ExportActionListener.class); - private RecordsToExport recordsToExport; +public class ExportProcessMonitorDialog extends ProcessMonitorDialog { - public enum RecordsToExport { - ALL, MODIFIED_SINCE_LAST_EXPORT, PICK_FROM_DATE - } - public ExportActionListener(DataFormat exportFormat, RecordsToExport recordsToExport, JFrame frame, - LocalPropertiesService localPropertiesService, DataImportExportService dataExportService, - EarthSurveyService earthSurveyService) { + private RecordsToExport recordsToExport; + private DataFormat exportFormat; + private EarthSurveyService earthSurveyService; + private LocalPropertiesService localPropertiesService; + private File exportToFile; + + public ExportProcessMonitorDialog(AbstractProcess exportProcess, JFrame parentFrame, RecordsToExport recordsToExport, DataFormat exportFormat, EarthSurveyService earthSurveyService, File exportToFile, LocalPropertiesService localPropertiesService ) { + super(); + this.process = exportProcess; + this.recordsToExport = recordsToExport; this.exportFormat = exportFormat; - this.frame = frame; - this.localPropertiesService = localPropertiesService; - this.dataExportService = dataExportService; this.earthSurveyService = earthSurveyService; - this.recordsToExport = recordsToExport; + this.exportToFile = exportToFile; + this.localPropertiesService = localPropertiesService; + progressMonitor = new ProgressMonitor(parentFrame, Messages.getString("ExportDialogProcessMonitor.0"), Messages.getString("ExportDialogProcessMonitor.1"), 0, 100); //$NON-NLS-1$ //$NON-NLS-2$ + progressMonitor.setMillisToPopup(1000); + + } + + protected String getProcessActionMessage() { + return Messages.getString("ExportDialogProcessMonitor.4"); //$NON-NLS-1$ } @Override - public void actionPerformed(ActionEvent e) { - try { - CollectEarthWindow.startWaiting(frame); + public void run() { - Date recordsModifiedSince = null; - if (recordsToExport.equals(RecordsToExport.MODIFIED_SINCE_LAST_EXPORT)) { + try { + monitorProgress(); + process.call(); + if( process.getStatus().isComplete() && exportFormat.equals( DataFormat.ZIP_WITH_XML ) && recordsToExport.equals(RecordsToExport.MODIFIED_SINCE_LAST_EXPORT) ){ String surveyName = ""; //$NON-NLS-1$ - if (earthSurveyService.getCollectSurvey() != null) { + if( earthSurveyService.getCollectSurvey()!= null ){ surveyName = earthSurveyService.getCollectSurvey().getName(); } - recordsModifiedSince = localPropertiesService.getLastExportedDate(surveyName); - } else if (recordsToExport.equals(RecordsToExport.PICK_FROM_DATE)) { - recordsModifiedSince = getPickDateDlg(); - if (recordsModifiedSince == null) { - // No date chosen, do not proceed with the export - return; - } - } - - exportDataTo(exportFormat, recordsModifiedSince); - } finally { - CollectEarthWindow.endWaiting(frame); - } - - } - - private Date getPickDateDlg() { - - JPanel panel = new JPanel(); - - JXDatePicker picker = new JXDatePicker(); - picker.setDate(Calendar.getInstance().getTime()); - picker.setFormats(new SimpleDateFormat("dd.MM.yyyy")); //$NON-NLS-1$ - - panel.add(picker); - - int result = JOptionPane.showConfirmDialog(frame, panel, Messages.getString("ExportActionListener.1"), //$NON-NLS-1$ - JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); - if (result == JOptionPane.OK_OPTION) { - return picker.getDate(); - } else { - return null; - } - } + localPropertiesService.setLastExportedDate( surveyName ); - private File exportDataTo(DataFormat exportType, Date recordsModifiedSince) { - String preselectedName = getPreselectedName(exportType, recordsModifiedSince); - - File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(exportType, true, false, preselectedName, - localPropertiesService, frame); - - File exportedFile = null; - if (exportToFile != null && exportToFile.length > 0) { - startExportingData(exportType, recordsModifiedSince, exportToFile[0]); - exportedFile = exportToFile[0]; - } - - return exportedFile; - } - - private boolean promptForLabelInclusion(DataFormat exportType) { - boolean includeLabels = false; - - if (exportType.equals(DataFormat.CSV)) { - int result = JOptionPane.showConfirmDialog(frame, "Include labels for code attributes", "Include labels", - JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); - includeLabels = (result == JOptionPane.YES_OPTION); - } - - return includeLabels; - } - - private void startExportingData(DataFormat exportType, Date recordsModifiedSince, File exportToFile) { - AbstractProcess exportProcess = null; - try { - exportProcess = getExportProcess(exportType, recordsModifiedSince, exportToFile); - if (exportProcess != null) { - ExportProcessMonitorDialog exportProcessWorker = new ExportProcessMonitorDialog(exportProcess, frame, - recordsToExport, exportType, earthSurveyService, exportToFile, localPropertiesService); - exportProcessWorker.start(); } - } catch (Exception e1) { - logger.error("What happened?", e1); //$NON-NLS-1$ //$NON-NLS-2$ - JOptionPane.showMessageDialog(this.frame, Messages.getString("CollectEarthWindow.0"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.1"), //$NON-NLS-1$ - JOptionPane.ERROR_MESSAGE); - logger.error( - "Error exporting data to " + exportToFile.getAbsolutePath() + " in format " + exportType.name(), //$NON-NLS-1$ //$NON-NLS-2$ - e1); - } - } - private AbstractProcess getExportProcess(DataFormat exportType, Date recordsModifiedSince, - File exportToFile) throws Exception { - AbstractProcess exportProcess = null; - boolean addLabels = false; - switch (exportType) { - case CSV: - addLabels = promptForLabelInclusion(exportType); - exportProcess = dataExportService.exportSurveyAsCsv(exportToFile, addLabels); - break; - case ZIP_WITH_XML: - exportProcess = dataExportService.exportSurveyAsZipWithXml(exportToFile, recordsModifiedSince); - break; - case FUSION: - addLabels = promptForLabelInclusion(exportType); - exportProcess = dataExportService.exportSurveyAsFusionTable(exportToFile, addLabels); - break; - case COLLECT_BACKUP: - exportProcess = dataExportService.exportSurveyAsBackup(exportToFile); - break; - default: - break; - } - return exportProcess; - } - - private String getPreselectedName(DataFormat exportType, Date modifiedSince) { - - String operator = ""; - - try { - operator = localPropertiesService.getOperator(); - - operator = StringUtils.deleteWhitespace(operator); - // Replaces character like TĥïŠĩš â fůňķŷ Šťŕĭńġ with This is a funky String - operator = Normalizer.normalize(operator, Normalizer.Form.NFD).replaceAll("[^\\p{ASCII}]", ""); - - // Remove non-alphanumeric characters - operator = operator.replaceAll("[^a-zA-Z0-9]", ""); + if( process.getStatus().isComplete() && ( exportFormat.equals( DataFormat.CSV ) || exportFormat.equals( DataFormat.FUSION ) || exportFormat.equals( DataFormat.KML_FILE ) ) ) { + CollectEarthUtils.openFile( exportToFile ); + } - } catch (Exception e) { - logger.error("Error normalizing operator name ", e); + } catch (final Exception e) { + logger.error("Error starting the process", e); //$NON-NLS-1$ } - String preselectName = operator + "_collectedData_"; //$NON-NLS-1$ - - preselectName += earthSurveyService.getCollectSurvey().getName(); - DateFormat dateFormat = new SimpleDateFormat("ddMMyy_HHmmss"); //$NON-NLS-1$ - if (modifiedSince == null) { - preselectName += "_on_" + dateFormat.format(new Date()); //$NON-NLS-1$ - } else { - - preselectName += "_" + dateFormat.format(modifiedSince) + "_to_" + dateFormat.format(new Date()); //$NON-NLS-1$ //$NON-NLS-2$ - } + } - preselectName += "_" + exportType.name() + "." + exportType.getDefaultExtension(); //$NON-NLS-1$ //$NON-NLS-2$ - return preselectName; - } } From e4cc9f91c00d4def05366b5fa11c67c91c37def6 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:57 +0100 Subject: [PATCH 0307/1620] New translations ImportActionListener.java (English) --- .../earth/app/view/Messages_en.properties | 315 +++++++++--------- 1 file changed, 161 insertions(+), 154 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 6f1756ce73..88aa8edf1c 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -2,200 +2,207 @@ package org.openforis.collect.earth.app.view; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.io.BufferedReader; import java.io.File; -import java.text.DateFormat; -import java.text.Normalizer; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Arrays; import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.JPanel; -import org.apache.commons.lang3.StringUtils; -import org.jdesktop.swingx.JXDatePicker; +import org.apache.commons.io.IOUtils; +import org.openforis.collect.earth.app.desktop.EarthApp; import org.openforis.collect.earth.app.service.DataImportExportService; -import org.openforis.collect.earth.app.service.EarthSurveyService; import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.io.data.DataExportStatus; -import org.openforis.collect.manager.process.AbstractProcess; +import org.openforis.collect.io.data.CSVDataImportProcess; +import org.openforis.collect.io.data.XMLDataImportProcess; +import org.openforis.collect.manager.process.ProcessStatus; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public final class ExportActionListener implements ActionListener { - private final DataFormat exportFormat; +public final class ImportActionListener implements ActionListener { + protected static final Integer YES = 0; + protected static final Integer YES_TO_ALL = 1; + protected static final Integer NO = 2; + protected static final Integer NO_TO_ALL = 3; + + private final DataFormat importFormat; private JFrame frame; private LocalPropertiesService localPropertiesService; - private DataImportExportService dataExportService; - private EarthSurveyService earthSurveyService; - private Logger logger = LoggerFactory.getLogger(ExportActionListener.class); - private RecordsToExport recordsToExport; - - public enum RecordsToExport { - ALL, MODIFIED_SINCE_LAST_EXPORT, PICK_FROM_DATE - } + private DataImportExportService dataImportService; + private Logger logger = LoggerFactory.getLogger( ImportActionListener.class ); - public ExportActionListener(DataFormat exportFormat, RecordsToExport recordsToExport, JFrame frame, - LocalPropertiesService localPropertiesService, DataImportExportService dataExportService, - EarthSurveyService earthSurveyService) { - this.exportFormat = exportFormat; + public ImportActionListener(DataFormat importFormat, JFrame frame, LocalPropertiesService localPropertiesService, DataImportExportService dataImportService) { + this.importFormat = importFormat; this.frame = frame; this.localPropertiesService = localPropertiesService; - this.dataExportService = dataExportService; - this.earthSurveyService = earthSurveyService; - this.recordsToExport = recordsToExport; + this.dataImportService = dataImportService; } @Override public void actionPerformed(ActionEvent e) { - try { + try{ CollectEarthWindow.startWaiting(frame); - - Date recordsModifiedSince = null; - if (recordsToExport.equals(RecordsToExport.MODIFIED_SINCE_LAST_EXPORT)) { - String surveyName = ""; //$NON-NLS-1$ - if (earthSurveyService.getCollectSurvey() != null) { - surveyName = earthSurveyService.getCollectSurvey().getName(); - } - recordsModifiedSince = localPropertiesService.getLastExportedDate(surveyName); - } else if (recordsToExport.equals(RecordsToExport.PICK_FROM_DATE)) { - recordsModifiedSince = getPickDateDlg(); - if (recordsModifiedSince == null) { - // No date chosen, do not proceed with the export - return; - } - } - - exportDataTo(exportFormat, recordsModifiedSince); - } finally { - CollectEarthWindow.endWaiting(frame); + importDataFrom(e, importFormat ); + }finally{ + CollectEarthWindow.endWaiting( frame); } } + + private void forceRefreshGoogleEarth() { - private Date getPickDateDlg() { + EarthApp.executeKmlLoadAsynchronously( null ); - JPanel panel = new JPanel(); - - JXDatePicker picker = new JXDatePicker(); - picker.setDate(Calendar.getInstance().getTime()); - picker.setFormats(new SimpleDateFormat("dd.MM.yyyy")); //$NON-NLS-1$ - - panel.add(picker); - - int result = JOptionPane.showConfirmDialog(frame, panel, Messages.getString("ExportActionListener.1"), //$NON-NLS-1$ - JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); - if (result == JOptionPane.OK_OPTION) { - return picker.getDate(); - } else { - return null; - } } + private Integer shouldImportNonFinishedRecords( boolean moreThanOneFiles ) { + String message = "" //$NON-NLS-1$ + + Messages.getString("ImportActionListener.0") //$NON-NLS-1$ + +"
" //$NON-NLS-1$ + + Messages.getString("ImportActionListener.2") //$NON-NLS-1$ + + ""; + + if( !moreThanOneFiles ){ + + final int selectedOption = JOptionPane.showConfirmDialog(null, + message //$NON-NLS-1$ + ,Messages.getString("ImportActionListener.3"), //$NON-NLS-1$ + JOptionPane.YES_NO_OPTION); + + if (selectedOption == JOptionPane.YES_OPTION){ + return YES; + }else if (selectedOption == JOptionPane.NO_OPTION){ + return NO; + }else{ + return JOptionPane.CLOSED_OPTION; + } + }else{ - private File exportDataTo(DataFormat exportType, Date recordsModifiedSince) { - String preselectedName = getPreselectedName(exportType, recordsModifiedSince); + String[] buttons = { Messages.getString("YES"), Messages.getString("YES_TO_ALL"), Messages.getString("NO"), Messages.getString("NO_TO_ALL") }; - File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(exportType, true, false, preselectedName, - localPropertiesService, frame); + return JOptionPane.showOptionDialog(null, message, Messages.getString("ImportActionListener.3") , + JOptionPane.WARNING_MESSAGE, 0, null, buttons, buttons[1]); - File exportedFile = null; - if (exportToFile != null && exportToFile.length > 0) { - startExportingData(exportType, recordsModifiedSince, exportToFile[0]); - exportedFile = exportToFile[0]; } - - return exportedFile; } - private boolean promptForLabelInclusion(DataFormat exportType) { - boolean includeLabels = false; - - if (exportType.equals(DataFormat.CSV)) { - int result = JOptionPane.showConfirmDialog(frame, "Include labels for code attributes", "Include labels", - JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); - includeLabels = (result == JOptionPane.YES_OPTION); - } - - return includeLabels; - } - - private void startExportingData(DataFormat exportType, Date recordsModifiedSince, File exportToFile) { - AbstractProcess exportProcess = null; - try { - exportProcess = getExportProcess(exportType, recordsModifiedSince, exportToFile); - if (exportProcess != null) { - ExportProcessMonitorDialog exportProcessWorker = new ExportProcessMonitorDialog(exportProcess, frame, - recordsToExport, exportType, earthSurveyService, exportToFile, localPropertiesService); - exportProcessWorker.start(); + private void importDataFrom(final ActionEvent e, final DataFormat importType) { + File[] filesToImport = JFileChooserExistsAware.getFileChooserResults( importType, false, true, null, localPropertiesService, frame ); + final ImportXMLDialogProcessMonitor importDialogProcessMonitor = new ImportXMLDialogProcessMonitor(); + if (filesToImport != null) { + + + switch (importType) { + case ZIP_WITH_XML: + new Thread("XML Import Thread " ){ //$NON-NLS-1$ + @Override + public void run() { + Integer importNonFinishedPlots = shouldImportNonFinishedRecords( filesToImport.length > 1); + boolean firstFile = true; + + for (final File importedFile : filesToImport) { + XMLDataImportProcess dataImportProcess = null; + try{ + if ( firstFile ){ + firstFile = false; + }else if ( !firstFile && (importNonFinishedPlots.equals( YES ) || importNonFinishedPlots.equals( NO ) ) ){ + importNonFinishedPlots = shouldImportNonFinishedRecords( filesToImport.length > 1); + } + + if( importNonFinishedPlots.equals( JOptionPane.CLOSED_OPTION ) ){ + break; + } + + boolean importNotFinished= importNonFinishedPlots.equals( YES ) || importNonFinishedPlots.equals( YES_TO_ALL ); + + dataImportProcess = dataImportService.getImportSummary(importedFile, importNotFinished); + importDialogProcessMonitor.startImport(dataImportProcess, frame, dataImportService, importedFile ); + + } catch (Exception e1) { + logger.error("Error importing data" , e1); //$NON-NLS-1$ + importDialogProcessMonitor.closeProgressmonitor(); + JOptionPane.showMessageDialog( frame, importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.3"), importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.7"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + JOptionPane.ERROR_MESSAGE); + logger.error("Error importing data from " + importedFile.getAbsolutePath() + " in format " + importType.name() , e1); //$NON-NLS-1$ //$NON-NLS-2$ + } finally { + IOUtils.closeQuietly(dataImportProcess); + } + } + forceRefreshGoogleEarth(); + } + }.start(); + break; + case CSV: + new Thread("Update using CSV Thread " ){ //$NON-NLS-1$ + @Override + public void run() { + + String[] ids = dataImportService.getEarthSurveyService().getKeyNamesForSurvey(); + String keyAttributesForSurvey = Arrays.toString( ids ); + + JOptionPane.showMessageDialog( + frame, + "The CSV files used must have columns with at least the headers for the key attributes " + keyAttributesForSurvey+ " followed by one or more attribute names ( see http://www.openforis.org/support/questions/80/changing-plot-attributes-in-the-collect-earth-database ) ", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + "CSV file format info", + JOptionPane.INFORMATION_MESSAGE); + + + for (final File importedFile : filesToImport) { + + CSVDataImportProcess importSurveyAsCsv = null; + try { + importSurveyAsCsv = dataImportService.getCsvImporterProcess(importedFile); + + if( importSurveyAsCsv != null ){ + importSurveyAsCsv.init(); + ProcessStatus status = importSurveyAsCsv.getStatus(); + status.setTotal( getTotalNumberOfLines( importedFile ) ); + if ( status != null && ! importSurveyAsCsv.getStatus().isError() ) { + ImportProcessMonitorDialog importProcessWorker = new ImportProcessMonitorDialog(importSurveyAsCsv, frame ); + importProcessWorker.start(); + } + } + } catch (Exception e1) { + JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.7") + "\n" + e1.getMessage(), importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.3"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + JOptionPane.ERROR_MESSAGE); + logger.error("Error importing data from " + importedFile.getAbsolutePath() + " in format " + importType , e1); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + } + }.start(); + break; + case FUSION: + break; + default: + break; } - } catch (Exception e1) { - logger.error("What happened?", e1); //$NON-NLS-1$ //$NON-NLS-2$ - JOptionPane.showMessageDialog(this.frame, Messages.getString("CollectEarthWindow.0"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.1"), //$NON-NLS-1$ - JOptionPane.ERROR_MESSAGE); - logger.error( - "Error exporting data to " + exportToFile.getAbsolutePath() + " in format " + exportType.name(), //$NON-NLS-1$ //$NON-NLS-2$ - e1); } } - private AbstractProcess getExportProcess(DataFormat exportType, Date recordsModifiedSince, - File exportToFile) throws Exception { - AbstractProcess exportProcess = null; - boolean addLabels = false; - switch (exportType) { - case CSV: - addLabels = promptForLabelInclusion(exportType); - exportProcess = dataExportService.exportSurveyAsCsv(exportToFile, addLabels); - break; - case ZIP_WITH_XML: - exportProcess = dataExportService.exportSurveyAsZipWithXml(exportToFile, recordsModifiedSince); - break; - case FUSION: - addLabels = promptForLabelInclusion(exportType); - exportProcess = dataExportService.exportSurveyAsFusionTable(exportToFile, addLabels); - break; - case COLLECT_BACKUP: - exportProcess = dataExportService.exportSurveyAsBackup(exportToFile); - break; - default: - break; - } - return exportProcess; - } - - private String getPreselectedName(DataFormat exportType, Date modifiedSince) { - - String operator = ""; - + private long getTotalNumberOfLines(File importedFile) { + long count = 0; + BufferedReader br = null; try { - operator = localPropertiesService.getOperator(); - - operator = StringUtils.deleteWhitespace(operator); - // Replaces character like TĥïŠĩš â fůňķŷ Šťŕĭńġ with This is a funky String - operator = Normalizer.normalize(operator, Normalizer.Form.NFD).replaceAll("[^\\p{ASCII}]", ""); + br = new BufferedReader(new InputStreamReader(new FileInputStream(importedFile))); - // Remove non-alphanumeric characters - operator = operator.replaceAll("[^a-zA-Z0-9]", ""); - - } catch (Exception e) { - logger.error("Error normalizing operator name ", e); - } - - String preselectName = operator + "_collectedData_"; //$NON-NLS-1$ + while ( br.readLine() != null) { + count++; + } + } catch (IOException e) { + logger.error("Error counting the number of lines in file " + importedFile.getAbsolutePath() , e) ; //$NON-NLS-1$ + }finally { + if( br!=null) { + try { + br.close(); + } catch (IOException e) { + logger.error("Error closing file reader " + importedFile.getAbsolutePath() , e) ; + } + } - preselectName += earthSurveyService.getCollectSurvey().getName(); - DateFormat dateFormat = new SimpleDateFormat("ddMMyy_HHmmss"); //$NON-NLS-1$ - if (modifiedSince == null) { - preselectName += "_on_" + dateFormat.format(new Date()); //$NON-NLS-1$ - } else { - preselectName += "_" + dateFormat.format(modifiedSince) + "_to_" + dateFormat.format(new Date()); //$NON-NLS-1$ //$NON-NLS-2$ } - - preselectName += "_" + exportType.name() + "." + exportType.getDefaultExtension(); //$NON-NLS-1$ //$NON-NLS-2$ - - return preselectName; + return count; } } From b4634d5d6e116b38cec26550c2888352be5ecd22 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:58 +0100 Subject: [PATCH 0308/1620] New translations ImportProcessMonitorDialog.java (French) --- .../earth/app/view/Messages_fr.properties | 56 ++++++------------- 1 file changed, 18 insertions(+), 38 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 0ccb8f2366..68af760ca4 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,67 +1,47 @@ package org.openforis.collect.earth.app.view; -import java.io.File; - import javax.swing.JFrame; +import javax.swing.JOptionPane; import javax.swing.ProgressMonitor; +import javax.swing.SwingUtilities; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.view.ExportActionListener.RecordsToExport; -import org.openforis.collect.io.data.DataExportStatus; +import org.openforis.collect.io.ReferenceDataImportStatus; +import org.openforis.collect.io.metadata.parsing.ParsingError; import org.openforis.collect.manager.process.AbstractProcess; -public class ExportProcessMonitorDialog extends ProcessMonitorDialog { +public class ImportProcessMonitorDialog extends ProcessMonitorDialog> { + private JFrame parentFrame; - private RecordsToExport recordsToExport; - private DataFormat exportFormat; - private EarthSurveyService earthSurveyService; - private LocalPropertiesService localPropertiesService; - private File exportToFile; - public ExportProcessMonitorDialog(AbstractProcess exportProcess, JFrame parentFrame, RecordsToExport recordsToExport, DataFormat exportFormat, EarthSurveyService earthSurveyService, File exportToFile, LocalPropertiesService localPropertiesService ) { + public ImportProcessMonitorDialog(AbstractProcess> importProcess, JFrame parentFrame ) { super(); - this.process = exportProcess; - this.recordsToExport = recordsToExport; - this.exportFormat = exportFormat; - this.earthSurveyService = earthSurveyService; - this.exportToFile = exportToFile; - this.localPropertiesService = localPropertiesService; - progressMonitor = new ProgressMonitor(parentFrame, Messages.getString("ExportDialogProcessMonitor.0"), Messages.getString("ExportDialogProcessMonitor.1"), 0, 100); //$NON-NLS-1$ //$NON-NLS-2$ - progressMonitor.setMillisToPopup(1000); - + this.process = importProcess; + this.parentFrame = parentFrame; + SwingUtilities.invokeLater( () -> { + progressMonitor = new ProgressMonitor(parentFrame, Messages.getString("ExportDialogProcessMonitor.0"), Messages.getString("ExportDialogProcessMonitor.1"), 0, 100); //$NON-NLS-1$ //$NON-NLS-2$ + progressMonitor.setMillisToPopup(1000); + } ); } protected String getProcessActionMessage() { - return Messages.getString("ExportDialogProcessMonitor.4"); //$NON-NLS-1$ + return Messages.getString("ImportProcessMonitorDialog.0"); //$NON-NLS-1$ } - + + @Override public void run() { try { monitorProgress(); process.call(); - if( process.getStatus().isComplete() && exportFormat.equals( DataFormat.ZIP_WITH_XML ) && recordsToExport.equals(RecordsToExport.MODIFIED_SINCE_LAST_EXPORT) ){ - String surveyName = ""; //$NON-NLS-1$ - if( earthSurveyService.getCollectSurvey()!= null ){ - surveyName = earthSurveyService.getCollectSurvey().getName(); - } - localPropertiesService.setLastExportedDate( surveyName ); - + if( process.getStatus().isComplete() ) { + JOptionPane.showMessageDialog( parentFrame, "Update finished", "CSV Update", JOptionPane.INFORMATION_MESSAGE); } - - if( process.getStatus().isComplete() && ( exportFormat.equals( DataFormat.CSV ) || exportFormat.equals( DataFormat.FUSION ) || exportFormat.equals( DataFormat.KML_FILE ) ) ) { - CollectEarthUtils.openFile( exportToFile ); - } - } catch (final Exception e) { logger.error("Error starting the process", e); //$NON-NLS-1$ } } - } From 9a85bc2b7dc4fe4ef69b0133f27a8508d62e8e03 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:26:59 +0100 Subject: [PATCH 0309/1620] New translations OpenSupportForum.java (Spanish) --- .../earth/app/view/Messages_es.properties | 196 +----------------- 1 file changed, 8 insertions(+), 188 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 6f1756ce73..06f4b227eb 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -2,200 +2,20 @@ package org.openforis.collect.earth.app.view; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.io.File; -import java.text.DateFormat; -import java.text.Normalizer; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; +import java.net.URI; +import java.net.URISyntaxException; -import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.swing.JPanel; - -import org.apache.commons.lang3.StringUtils; -import org.jdesktop.swingx.JXDatePicker; -import org.openforis.collect.earth.app.service.DataImportExportService; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.io.data.DataExportStatus; -import org.openforis.collect.manager.process.AbstractProcess; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public final class ExportActionListener implements ActionListener { - private final DataFormat exportFormat; - private JFrame frame; - private LocalPropertiesService localPropertiesService; - private DataImportExportService dataExportService; - private EarthSurveyService earthSurveyService; - private Logger logger = LoggerFactory.getLogger(ExportActionListener.class); - private RecordsToExport recordsToExport; - - public enum RecordsToExport { - ALL, MODIFIED_SINCE_LAST_EXPORT, PICK_FROM_DATE - } - - public ExportActionListener(DataFormat exportFormat, RecordsToExport recordsToExport, JFrame frame, - LocalPropertiesService localPropertiesService, DataImportExportService dataExportService, - EarthSurveyService earthSurveyService) { - this.exportFormat = exportFormat; - this.frame = frame; - this.localPropertiesService = localPropertiesService; - this.dataExportService = dataExportService; - this.earthSurveyService = earthSurveyService; - this.recordsToExport = recordsToExport; - } +public class OpenSupportForum implements ActionListener { @Override public void actionPerformed(ActionEvent e) { try { - CollectEarthWindow.startWaiting(frame); - - Date recordsModifiedSince = null; - if (recordsToExport.equals(RecordsToExport.MODIFIED_SINCE_LAST_EXPORT)) { - String surveyName = ""; //$NON-NLS-1$ - if (earthSurveyService.getCollectSurvey() != null) { - surveyName = earthSurveyService.getCollectSurvey().getName(); - } - recordsModifiedSince = localPropertiesService.getLastExportedDate(surveyName); - } else if (recordsToExport.equals(RecordsToExport.PICK_FROM_DATE)) { - recordsModifiedSince = getPickDateDlg(); - if (recordsModifiedSince == null) { - // No date chosen, do not proceed with the export - return; - } - } - - exportDataTo(exportFormat, recordsModifiedSince); - } finally { - CollectEarthWindow.endWaiting(frame); - } - - } - - private Date getPickDateDlg() { - - JPanel panel = new JPanel(); - - JXDatePicker picker = new JXDatePicker(); - picker.setDate(Calendar.getInstance().getTime()); - picker.setFormats(new SimpleDateFormat("dd.MM.yyyy")); //$NON-NLS-1$ - - panel.add(picker); - - int result = JOptionPane.showConfirmDialog(frame, panel, Messages.getString("ExportActionListener.1"), //$NON-NLS-1$ - JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); - if (result == JOptionPane.OK_OPTION) { - return picker.getDate(); - } else { - return null; - } - } - - private File exportDataTo(DataFormat exportType, Date recordsModifiedSince) { - String preselectedName = getPreselectedName(exportType, recordsModifiedSince); - - File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(exportType, true, false, preselectedName, - localPropertiesService, frame); - - File exportedFile = null; - if (exportToFile != null && exportToFile.length > 0) { - startExportingData(exportType, recordsModifiedSince, exportToFile[0]); - exportedFile = exportToFile[0]; - } - - return exportedFile; - } - - private boolean promptForLabelInclusion(DataFormat exportType) { - boolean includeLabels = false; - - if (exportType.equals(DataFormat.CSV)) { - int result = JOptionPane.showConfirmDialog(frame, "Include labels for code attributes", "Include labels", - JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); - includeLabels = (result == JOptionPane.YES_OPTION); - } - - return includeLabels; - } - - private void startExportingData(DataFormat exportType, Date recordsModifiedSince, File exportToFile) { - AbstractProcess exportProcess = null; - try { - exportProcess = getExportProcess(exportType, recordsModifiedSince, exportToFile); - if (exportProcess != null) { - ExportProcessMonitorDialog exportProcessWorker = new ExportProcessMonitorDialog(exportProcess, frame, - recordsToExport, exportType, earthSurveyService, exportToFile, localPropertiesService); - exportProcessWorker.start(); - } - } catch (Exception e1) { - logger.error("What happened?", e1); //$NON-NLS-1$ //$NON-NLS-2$ - JOptionPane.showMessageDialog(this.frame, Messages.getString("CollectEarthWindow.0"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.1"), //$NON-NLS-1$ - JOptionPane.ERROR_MESSAGE); - logger.error( - "Error exporting data to " + exportToFile.getAbsolutePath() + " in format " + exportType.name(), //$NON-NLS-1$ //$NON-NLS-2$ - e1); - } - } + URI uri = new java.net.URI("http://www.openforis.org/support"); //$NON-NLS-1$ + (new LinkRunner(uri)).execute(); + } catch (URISyntaxException use) { + throw new AssertionError(use + ": " + "Open FOris support"); //NOI18N //$NON-NLS-1$ + } - private AbstractProcess getExportProcess(DataFormat exportType, Date recordsModifiedSince, - File exportToFile) throws Exception { - AbstractProcess exportProcess = null; - boolean addLabels = false; - switch (exportType) { - case CSV: - addLabels = promptForLabelInclusion(exportType); - exportProcess = dataExportService.exportSurveyAsCsv(exportToFile, addLabels); - break; - case ZIP_WITH_XML: - exportProcess = dataExportService.exportSurveyAsZipWithXml(exportToFile, recordsModifiedSince); - break; - case FUSION: - addLabels = promptForLabelInclusion(exportType); - exportProcess = dataExportService.exportSurveyAsFusionTable(exportToFile, addLabels); - break; - case COLLECT_BACKUP: - exportProcess = dataExportService.exportSurveyAsBackup(exportToFile); - break; - default: - break; - } - return exportProcess; } - private String getPreselectedName(DataFormat exportType, Date modifiedSince) { - - String operator = ""; - - try { - operator = localPropertiesService.getOperator(); - - operator = StringUtils.deleteWhitespace(operator); - // Replaces character like TĥïŠĩš â fůňķŷ Šťŕĭńġ with This is a funky String - operator = Normalizer.normalize(operator, Normalizer.Form.NFD).replaceAll("[^\\p{ASCII}]", ""); - - // Remove non-alphanumeric characters - operator = operator.replaceAll("[^a-zA-Z0-9]", ""); - - } catch (Exception e) { - logger.error("Error normalizing operator name ", e); - } - - String preselectName = operator + "_collectedData_"; //$NON-NLS-1$ - - preselectName += earthSurveyService.getCollectSurvey().getName(); - DateFormat dateFormat = new SimpleDateFormat("ddMMyy_HHmmss"); //$NON-NLS-1$ - if (modifiedSince == null) { - preselectName += "_on_" + dateFormat.format(new Date()); //$NON-NLS-1$ - } else { - - preselectName += "_" + dateFormat.format(modifiedSince) + "_to_" + dateFormat.format(new Date()); //$NON-NLS-1$ //$NON-NLS-2$ - } - - preselectName += "_" + exportType.name() + "." + exportType.getDefaultExtension(); //$NON-NLS-1$ //$NON-NLS-2$ - - return preselectName; - } } From 47e7b0fdca317015d11d9115f67967b1011367ad Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:00 +0100 Subject: [PATCH 0310/1620] New translations MissingPlotsListener.java (French) --- .../earth/app/view/Messages_fr.properties | 233 ++++++++++++++++-- 1 file changed, 206 insertions(+), 27 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 68af760ca4..3ad3d0b623 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,47 +1,226 @@ package org.openforis.collect.earth.app.view; +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.Toolkit; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.StringSelection; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.Map; + +import javax.swing.AbstractAction; +import javax.swing.Action; +import javax.swing.JButton; +import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.ProgressMonitor; +import javax.swing.JPanel; +import javax.swing.JPopupMenu; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; import javax.swing.SwingUtilities; -import org.openforis.collect.io.ReferenceDataImportStatus; -import org.openforis.collect.io.metadata.parsing.ParsingError; -import org.openforis.collect.manager.process.AbstractProcess; +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.ad_hoc.FixCoordinates; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.MissingPlotService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -public class ImportProcessMonitorDialog extends ProcessMonitorDialog> { +public final class MissingPlotsListener implements ActionListener { - private JFrame parentFrame; + private LocalPropertiesService localPropertiesService; + private JFrame frame; - public ImportProcessMonitorDialog(AbstractProcess> importProcess, JFrame parentFrame ) { - super(); - this.process = importProcess; - this.parentFrame = parentFrame; - SwingUtilities.invokeLater( () -> { - progressMonitor = new ProgressMonitor(parentFrame, Messages.getString("ExportDialogProcessMonitor.0"), Messages.getString("ExportDialogProcessMonitor.1"), 0, 100); //$NON-NLS-1$ //$NON-NLS-2$ - progressMonitor.setMillisToPopup(1000); - } ); - } + private final Logger logger = LoggerFactory.getLogger(FixCoordinates.class); + + private JTextArea disclaimerTextArea; + + private MissingPlotService missingPlotService; - protected String getProcessActionMessage() { - return Messages.getString("ImportProcessMonitorDialog.0"); //$NON-NLS-1$ + public MissingPlotsListener(JFrame frame, LocalPropertiesService localPropertiesService, + MissingPlotService missingPlotService) { + this.frame = frame; + this.localPropertiesService = localPropertiesService; + this.missingPlotService = missingPlotService; } - - + @Override - public void run() { + public void actionPerformed(ActionEvent e) { try { - monitorProgress(); - process.call(); - if( process.getStatus().isComplete() ) { - JOptionPane.showMessageDialog( parentFrame, "Update finished", "CSV Update", JOptionPane.INFORMATION_MESSAGE); - } - } catch (final Exception e) { - logger.error("Error starting the process", e); //$NON-NLS-1$ + CollectEarthWindow.startWaiting(frame); + findMissingPlots(); + } catch (Exception e1) { + logger.error(Messages.getString("MissingPlotsListener.0"), e1); //$NON-NLS-1$ + } finally { + + CollectEarthWindow.endWaiting(frame); + } + + } + + private void findMissingPlots() { + + showInfoAboutFunctionality(); + + String csvFile = localPropertiesService.getCsvFile(); + File currentFolder = null; + + if (!StringUtils.isBlank(csvFile)) { + File file = new File(csvFile); + if (file.exists()) + currentFolder = file.getParentFile(); + } + + final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults( + DataFormat.COLLECT_COORDS, false, true, null, localPropertiesService, frame, currentFolder); + if( selectedPlotFiles != null && selectedPlotFiles.length > 0 ) { + new Thread("Finding Missing plots") { + @Override + public void run() { + InfiniteProgressMonitor infiniteProgressMonitor = new InfiniteProgressMonitor(frame, + "Finding missing plots", "Please wait..."); + try { + infiniteProgressMonitor.showLater(); + + // Returns the list of all of the plots that are stored in the selected CSV + // files + final Map> allPlotsInFiles = missingPlotService + .getPlotDataByFile(selectedPlotFiles); + + // Returns the list of the plots that are not completely saved or not saved at + // all in the DB + Map> missingPlotData = missingPlotService + .getMissingPlotsByFile(allPlotsInFiles, infiniteProgressMonitor); + // Generates a text representation of the missing plots plus the brief on the + // total plots + String missingPlotsText = missingPlotService.getMissingPlotInformation(allPlotsInFiles, missingPlotData); + // Generates a temporary file that contains the missing plots as a CED + File tempFile = missingPlotService.getMissingPlotFile(missingPlotData); + SwingUtilities.invokeLater( infiniteProgressMonitor::close ); + + JDialog missingDlg = buildDialog(missingPlotsText, tempFile); + + Runnable setVisible =() -> missingDlg.setVisible(true); + SwingUtilities.invokeLater( setVisible ); + } catch (Exception e) { + logger.error("Error while finding missing plots", e); + } finally { + infiniteProgressMonitor.close(); + } + } + }.start(); + } + + } + + private JDialog buildDialog(String missingPlotsText, File tempFile) { + final JDialog dialog = new JDialog(frame, Messages.getString("MissingPlotsListener.1")); //$NON-NLS-1$ + dialog.setLocationRelativeTo(frame); + dialog.setSize(new Dimension(300, 400)); + dialog.setModal(false); + + final BorderLayout layoutManager = new BorderLayout(); + + final JPanel panel = new JPanel(layoutManager); + + dialog.add(panel); + + disclaimerTextArea = new JTextArea(missingPlotsText); + disclaimerTextArea.setEditable(false); + disclaimerTextArea.setLineWrap(true); + disclaimerTextArea.setWrapStyleWord(true); + final JScrollPane scrollPane = new JScrollPane(disclaimerTextArea); + panel.add(scrollPane, BorderLayout.CENTER); + scrollPane.setPreferredSize(new Dimension(250, 250)); + + final JButton close = new JButton(Messages.getString("CollectEarthWindow.5")); //$NON-NLS-1$ + close.addActionListener(e -> dialog.setVisible(false)); + panel.add(close, BorderLayout.SOUTH); + + if (tempFile != null) { + final JButton export = new JButton(Messages.getString(Messages.getString("MissingPlotsListener.6"))); //$NON-NLS-1$ + ActionListener exportListener = getSaveAsListener(tempFile); + export.addActionListener(exportListener); + panel.add(export, BorderLayout.SOUTH); } + disclaimerTextArea.addMouseListener(new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + check(e); + } + + @Override + public void mouseReleased(MouseEvent e) { + check(e); + } + + public void check(MouseEvent e) { + if (e.isPopupTrigger()) { // if the event shows the menu + getPopupMenu().show(disclaimerTextArea, e.getPoint().x, e.getPoint().y); + } + } + }); + + return dialog; + } + + private ActionListener getSaveAsListener(File tempFile) { + + return e -> { + final File[] saveToCsvFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, + true, false, "plotsWithMissingInfo.csv", //$NON-NLS-1$ //$NON-NLS-2$ + localPropertiesService, frame); + + if (saveToCsvFile != null && saveToCsvFile.length == 1) { + try { + FileUtils.copyFile(tempFile, saveToCsvFile[0]); + } catch (IOException e1) { + logger.error("Error when copying temporary file with missing plots to final destination " //$NON-NLS-1$ + + tempFile.getAbsolutePath() + " to " + saveToCsvFile[0].getAbsolutePath(), e); //$NON-NLS-1$ + } + } + }; + + } + + public void showInfoAboutFunctionality() { + JOptionPane.showMessageDialog(frame, Messages.getString("MissingPlotsListener.3"), //$NON-NLS-1$ + Messages.getString("MissingPlotsListener.4"), //$NON-NLS-1$ + JOptionPane.INFORMATION_MESSAGE); + } + + private JPopupMenu getPopupMenu() { + Action copyAction = new AbstractAction(Messages.getString("MissingPlotsListener.2")) { //$NON-NLS-1$ + + private static final long serialVersionUID = 1L; + + @Override + public void actionPerformed(ActionEvent e) { + disclaimerTextArea.selectAll(); + String selection = disclaimerTextArea.getSelectedText(); + Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); + if (selection == null) { + return; + } + StringSelection clipString = new StringSelection(selection); + clipboard.setContents(clipString, clipString); + } + }; + + JPopupMenu popup = new JPopupMenu(); + popup.add(copyAction); + return popup; } } From 5d8b7f74089ef7176300bbc8621dddea72431ac5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:01 +0100 Subject: [PATCH 0311/1620] New translations MissingPlotsListener.java (Spanish) --- .../earth/app/view/Messages_es.properties | 221 +++++++++++++++++- 1 file changed, 213 insertions(+), 8 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 06f4b227eb..3ad3d0b623 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,21 +1,226 @@ package org.openforis.collect.earth.app.view; +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.Toolkit; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.StringSelection; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.net.URI; -import java.net.URISyntaxException; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.Map; -public class OpenSupportForum implements ActionListener { +import javax.swing.AbstractAction; +import javax.swing.Action; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JPopupMenu; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.SwingUtilities; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.ad_hoc.FixCoordinates; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.MissingPlotService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public final class MissingPlotsListener implements ActionListener { + + private LocalPropertiesService localPropertiesService; + + private JFrame frame; + + private final Logger logger = LoggerFactory.getLogger(FixCoordinates.class); + + private JTextArea disclaimerTextArea; + + private MissingPlotService missingPlotService; + + public MissingPlotsListener(JFrame frame, LocalPropertiesService localPropertiesService, + MissingPlotService missingPlotService) { + this.frame = frame; + this.localPropertiesService = localPropertiesService; + this.missingPlotService = missingPlotService; + } @Override public void actionPerformed(ActionEvent e) { + try { - URI uri = new java.net.URI("http://www.openforis.org/support"); //$NON-NLS-1$ - (new LinkRunner(uri)).execute(); - } catch (URISyntaxException use) { - throw new AssertionError(use + ": " + "Open FOris support"); //NOI18N //$NON-NLS-1$ - } + CollectEarthWindow.startWaiting(frame); + findMissingPlots(); + } catch (Exception e1) { + logger.error(Messages.getString("MissingPlotsListener.0"), e1); //$NON-NLS-1$ + } finally { + + CollectEarthWindow.endWaiting(frame); + } + + } + + private void findMissingPlots() { + + showInfoAboutFunctionality(); + + String csvFile = localPropertiesService.getCsvFile(); + File currentFolder = null; + + if (!StringUtils.isBlank(csvFile)) { + File file = new File(csvFile); + if (file.exists()) + currentFolder = file.getParentFile(); + } + + final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults( + DataFormat.COLLECT_COORDS, false, true, null, localPropertiesService, frame, currentFolder); + if( selectedPlotFiles != null && selectedPlotFiles.length > 0 ) { + new Thread("Finding Missing plots") { + @Override + public void run() { + InfiniteProgressMonitor infiniteProgressMonitor = new InfiniteProgressMonitor(frame, + "Finding missing plots", "Please wait..."); + try { + infiniteProgressMonitor.showLater(); + + // Returns the list of all of the plots that are stored in the selected CSV + // files + final Map> allPlotsInFiles = missingPlotService + .getPlotDataByFile(selectedPlotFiles); + + // Returns the list of the plots that are not completely saved or not saved at + // all in the DB + Map> missingPlotData = missingPlotService + .getMissingPlotsByFile(allPlotsInFiles, infiniteProgressMonitor); + // Generates a text representation of the missing plots plus the brief on the + // total plots + String missingPlotsText = missingPlotService.getMissingPlotInformation(allPlotsInFiles, missingPlotData); + // Generates a temporary file that contains the missing plots as a CED + File tempFile = missingPlotService.getMissingPlotFile(missingPlotData); + SwingUtilities.invokeLater( infiniteProgressMonitor::close ); + + JDialog missingDlg = buildDialog(missingPlotsText, tempFile); + + Runnable setVisible =() -> missingDlg.setVisible(true); + SwingUtilities.invokeLater( setVisible ); + } catch (Exception e) { + logger.error("Error while finding missing plots", e); + } finally { + infiniteProgressMonitor.close(); + } + } + }.start(); + } + + } + + private JDialog buildDialog(String missingPlotsText, File tempFile) { + final JDialog dialog = new JDialog(frame, Messages.getString("MissingPlotsListener.1")); //$NON-NLS-1$ + dialog.setLocationRelativeTo(frame); + dialog.setSize(new Dimension(300, 400)); + dialog.setModal(false); + + final BorderLayout layoutManager = new BorderLayout(); + + final JPanel panel = new JPanel(layoutManager); + + dialog.add(panel); + + disclaimerTextArea = new JTextArea(missingPlotsText); + disclaimerTextArea.setEditable(false); + disclaimerTextArea.setLineWrap(true); + disclaimerTextArea.setWrapStyleWord(true); + final JScrollPane scrollPane = new JScrollPane(disclaimerTextArea); + panel.add(scrollPane, BorderLayout.CENTER); + scrollPane.setPreferredSize(new Dimension(250, 250)); + + final JButton close = new JButton(Messages.getString("CollectEarthWindow.5")); //$NON-NLS-1$ + close.addActionListener(e -> dialog.setVisible(false)); + panel.add(close, BorderLayout.SOUTH); + + if (tempFile != null) { + final JButton export = new JButton(Messages.getString(Messages.getString("MissingPlotsListener.6"))); //$NON-NLS-1$ + ActionListener exportListener = getSaveAsListener(tempFile); + export.addActionListener(exportListener); + panel.add(export, BorderLayout.SOUTH); + } + + disclaimerTextArea.addMouseListener(new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + check(e); + } + + @Override + public void mouseReleased(MouseEvent e) { + check(e); + } + + public void check(MouseEvent e) { + if (e.isPopupTrigger()) { // if the event shows the menu + getPopupMenu().show(disclaimerTextArea, e.getPoint().x, e.getPoint().y); + } + } + }); + + return dialog; + } + + private ActionListener getSaveAsListener(File tempFile) { + + return e -> { + final File[] saveToCsvFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, + true, false, "plotsWithMissingInfo.csv", //$NON-NLS-1$ //$NON-NLS-2$ + localPropertiesService, frame); + + if (saveToCsvFile != null && saveToCsvFile.length == 1) { + try { + FileUtils.copyFile(tempFile, saveToCsvFile[0]); + } catch (IOException e1) { + logger.error("Error when copying temporary file with missing plots to final destination " //$NON-NLS-1$ + + tempFile.getAbsolutePath() + " to " + saveToCsvFile[0].getAbsolutePath(), e); //$NON-NLS-1$ + } + } + }; + + } + + public void showInfoAboutFunctionality() { + JOptionPane.showMessageDialog(frame, Messages.getString("MissingPlotsListener.3"), //$NON-NLS-1$ + Messages.getString("MissingPlotsListener.4"), //$NON-NLS-1$ + JOptionPane.INFORMATION_MESSAGE); + } + + private JPopupMenu getPopupMenu() { + Action copyAction = new AbstractAction(Messages.getString("MissingPlotsListener.2")) { //$NON-NLS-1$ + + private static final long serialVersionUID = 1L; + + @Override + public void actionPerformed(ActionEvent e) { + disclaimerTextArea.selectAll(); + String selection = disclaimerTextArea.getSelectedText(); + Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); + if (selection == null) { + return; + } + StringSelection clipString = new StringSelection(selection); + clipboard.setContents(clipString, clipString); + } + }; + JPopupMenu popup = new JPopupMenu(); + popup.add(copyAction); + return popup; } } From 6d9aff287fbfdc9ac18eb5543e2d6c6304abb1ac Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:02 +0100 Subject: [PATCH 0312/1620] New translations MissingPlotsListener.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 307 ++++++++++-------- 1 file changed, 166 insertions(+), 141 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 6f1756ce73..3ad3d0b623 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,201 +1,226 @@ package org.openforis.collect.earth.app.view; +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.Toolkit; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.StringSelection; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; import java.io.File; -import java.text.DateFormat; -import java.text.Normalizer; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; - +import java.io.IOException; +import java.util.List; +import java.util.Map; + +import javax.swing.AbstractAction; +import javax.swing.Action; +import javax.swing.JButton; +import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; +import javax.swing.JPopupMenu; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.SwingUtilities; +import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; -import org.jdesktop.swingx.JXDatePicker; -import org.openforis.collect.earth.app.service.DataImportExportService; -import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.ad_hoc.FixCoordinates; import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.io.data.DataExportStatus; -import org.openforis.collect.manager.process.AbstractProcess; +import org.openforis.collect.earth.app.service.MissingPlotService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public final class ExportActionListener implements ActionListener { - private final DataFormat exportFormat; - private JFrame frame; +public final class MissingPlotsListener implements ActionListener { + private LocalPropertiesService localPropertiesService; - private DataImportExportService dataExportService; - private EarthSurveyService earthSurveyService; - private Logger logger = LoggerFactory.getLogger(ExportActionListener.class); - private RecordsToExport recordsToExport; - public enum RecordsToExport { - ALL, MODIFIED_SINCE_LAST_EXPORT, PICK_FROM_DATE - } + private JFrame frame; + + private final Logger logger = LoggerFactory.getLogger(FixCoordinates.class); - public ExportActionListener(DataFormat exportFormat, RecordsToExport recordsToExport, JFrame frame, - LocalPropertiesService localPropertiesService, DataImportExportService dataExportService, - EarthSurveyService earthSurveyService) { - this.exportFormat = exportFormat; + private JTextArea disclaimerTextArea; + + private MissingPlotService missingPlotService; + + public MissingPlotsListener(JFrame frame, LocalPropertiesService localPropertiesService, + MissingPlotService missingPlotService) { this.frame = frame; this.localPropertiesService = localPropertiesService; - this.dataExportService = dataExportService; - this.earthSurveyService = earthSurveyService; - this.recordsToExport = recordsToExport; + this.missingPlotService = missingPlotService; } @Override public void actionPerformed(ActionEvent e) { + try { CollectEarthWindow.startWaiting(frame); - - Date recordsModifiedSince = null; - if (recordsToExport.equals(RecordsToExport.MODIFIED_SINCE_LAST_EXPORT)) { - String surveyName = ""; //$NON-NLS-1$ - if (earthSurveyService.getCollectSurvey() != null) { - surveyName = earthSurveyService.getCollectSurvey().getName(); - } - recordsModifiedSince = localPropertiesService.getLastExportedDate(surveyName); - } else if (recordsToExport.equals(RecordsToExport.PICK_FROM_DATE)) { - recordsModifiedSince = getPickDateDlg(); - if (recordsModifiedSince == null) { - // No date chosen, do not proceed with the export - return; - } - } - - exportDataTo(exportFormat, recordsModifiedSince); + findMissingPlots(); + } catch (Exception e1) { + logger.error(Messages.getString("MissingPlotsListener.0"), e1); //$NON-NLS-1$ } finally { + CollectEarthWindow.endWaiting(frame); } } - private Date getPickDateDlg() { + private void findMissingPlots() { - JPanel panel = new JPanel(); + showInfoAboutFunctionality(); - JXDatePicker picker = new JXDatePicker(); - picker.setDate(Calendar.getInstance().getTime()); - picker.setFormats(new SimpleDateFormat("dd.MM.yyyy")); //$NON-NLS-1$ + String csvFile = localPropertiesService.getCsvFile(); + File currentFolder = null; - panel.add(picker); + if (!StringUtils.isBlank(csvFile)) { + File file = new File(csvFile); + if (file.exists()) + currentFolder = file.getParentFile(); + } - int result = JOptionPane.showConfirmDialog(frame, panel, Messages.getString("ExportActionListener.1"), //$NON-NLS-1$ - JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); - if (result == JOptionPane.OK_OPTION) { - return picker.getDate(); - } else { - return null; + final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults( + DataFormat.COLLECT_COORDS, false, true, null, localPropertiesService, frame, currentFolder); + if( selectedPlotFiles != null && selectedPlotFiles.length > 0 ) { + new Thread("Finding Missing plots") { + @Override + public void run() { + InfiniteProgressMonitor infiniteProgressMonitor = new InfiniteProgressMonitor(frame, + "Finding missing plots", "Please wait..."); + try { + infiniteProgressMonitor.showLater(); + + // Returns the list of all of the plots that are stored in the selected CSV + // files + final Map> allPlotsInFiles = missingPlotService + .getPlotDataByFile(selectedPlotFiles); + + // Returns the list of the plots that are not completely saved or not saved at + // all in the DB + Map> missingPlotData = missingPlotService + .getMissingPlotsByFile(allPlotsInFiles, infiniteProgressMonitor); + // Generates a text representation of the missing plots plus the brief on the + // total plots + String missingPlotsText = missingPlotService.getMissingPlotInformation(allPlotsInFiles, missingPlotData); + // Generates a temporary file that contains the missing plots as a CED + File tempFile = missingPlotService.getMissingPlotFile(missingPlotData); + SwingUtilities.invokeLater( infiniteProgressMonitor::close ); + + JDialog missingDlg = buildDialog(missingPlotsText, tempFile); + + Runnable setVisible =() -> missingDlg.setVisible(true); + SwingUtilities.invokeLater( setVisible ); + } catch (Exception e) { + logger.error("Error while finding missing plots", e); + } finally { + infiniteProgressMonitor.close(); + } + } + }.start(); } + } - private File exportDataTo(DataFormat exportType, Date recordsModifiedSince) { - String preselectedName = getPreselectedName(exportType, recordsModifiedSince); + private JDialog buildDialog(String missingPlotsText, File tempFile) { + final JDialog dialog = new JDialog(frame, Messages.getString("MissingPlotsListener.1")); //$NON-NLS-1$ + dialog.setLocationRelativeTo(frame); + dialog.setSize(new Dimension(300, 400)); + dialog.setModal(false); - File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(exportType, true, false, preselectedName, - localPropertiesService, frame); + final BorderLayout layoutManager = new BorderLayout(); - File exportedFile = null; - if (exportToFile != null && exportToFile.length > 0) { - startExportingData(exportType, recordsModifiedSince, exportToFile[0]); - exportedFile = exportToFile[0]; - } + final JPanel panel = new JPanel(layoutManager); - return exportedFile; - } + dialog.add(panel); - private boolean promptForLabelInclusion(DataFormat exportType) { - boolean includeLabels = false; + disclaimerTextArea = new JTextArea(missingPlotsText); + disclaimerTextArea.setEditable(false); + disclaimerTextArea.setLineWrap(true); + disclaimerTextArea.setWrapStyleWord(true); + final JScrollPane scrollPane = new JScrollPane(disclaimerTextArea); + panel.add(scrollPane, BorderLayout.CENTER); + scrollPane.setPreferredSize(new Dimension(250, 250)); - if (exportType.equals(DataFormat.CSV)) { - int result = JOptionPane.showConfirmDialog(frame, "Include labels for code attributes", "Include labels", - JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); - includeLabels = (result == JOptionPane.YES_OPTION); - } + final JButton close = new JButton(Messages.getString("CollectEarthWindow.5")); //$NON-NLS-1$ + close.addActionListener(e -> dialog.setVisible(false)); + panel.add(close, BorderLayout.SOUTH); - return includeLabels; - } + if (tempFile != null) { + final JButton export = new JButton(Messages.getString(Messages.getString("MissingPlotsListener.6"))); //$NON-NLS-1$ + ActionListener exportListener = getSaveAsListener(tempFile); + export.addActionListener(exportListener); + panel.add(export, BorderLayout.SOUTH); + } - private void startExportingData(DataFormat exportType, Date recordsModifiedSince, File exportToFile) { - AbstractProcess exportProcess = null; - try { - exportProcess = getExportProcess(exportType, recordsModifiedSince, exportToFile); - if (exportProcess != null) { - ExportProcessMonitorDialog exportProcessWorker = new ExportProcessMonitorDialog(exportProcess, frame, - recordsToExport, exportType, earthSurveyService, exportToFile, localPropertiesService); - exportProcessWorker.start(); + disclaimerTextArea.addMouseListener(new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + check(e); } - } catch (Exception e1) { - logger.error("What happened?", e1); //$NON-NLS-1$ //$NON-NLS-2$ - JOptionPane.showMessageDialog(this.frame, Messages.getString("CollectEarthWindow.0"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.1"), //$NON-NLS-1$ - JOptionPane.ERROR_MESSAGE); - logger.error( - "Error exporting data to " + exportToFile.getAbsolutePath() + " in format " + exportType.name(), //$NON-NLS-1$ //$NON-NLS-2$ - e1); - } - } - private AbstractProcess getExportProcess(DataFormat exportType, Date recordsModifiedSince, - File exportToFile) throws Exception { - AbstractProcess exportProcess = null; - boolean addLabels = false; - switch (exportType) { - case CSV: - addLabels = promptForLabelInclusion(exportType); - exportProcess = dataExportService.exportSurveyAsCsv(exportToFile, addLabels); - break; - case ZIP_WITH_XML: - exportProcess = dataExportService.exportSurveyAsZipWithXml(exportToFile, recordsModifiedSince); - break; - case FUSION: - addLabels = promptForLabelInclusion(exportType); - exportProcess = dataExportService.exportSurveyAsFusionTable(exportToFile, addLabels); - break; - case COLLECT_BACKUP: - exportProcess = dataExportService.exportSurveyAsBackup(exportToFile); - break; - default: - break; - } - return exportProcess; - } + @Override + public void mouseReleased(MouseEvent e) { + check(e); + } - private String getPreselectedName(DataFormat exportType, Date modifiedSince) { + public void check(MouseEvent e) { + if (e.isPopupTrigger()) { // if the event shows the menu + getPopupMenu().show(disclaimerTextArea, e.getPoint().x, e.getPoint().y); + } + } + }); - String operator = ""; + return dialog; + } - try { - operator = localPropertiesService.getOperator(); + private ActionListener getSaveAsListener(File tempFile) { - operator = StringUtils.deleteWhitespace(operator); - // Replaces character like TĥïŠĩš â fůňķŷ Šťŕĭńġ with This is a funky String - operator = Normalizer.normalize(operator, Normalizer.Form.NFD).replaceAll("[^\\p{ASCII}]", ""); + return e -> { + final File[] saveToCsvFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, + true, false, "plotsWithMissingInfo.csv", //$NON-NLS-1$ //$NON-NLS-2$ + localPropertiesService, frame); - // Remove non-alphanumeric characters - operator = operator.replaceAll("[^a-zA-Z0-9]", ""); + if (saveToCsvFile != null && saveToCsvFile.length == 1) { + try { + FileUtils.copyFile(tempFile, saveToCsvFile[0]); + } catch (IOException e1) { + logger.error("Error when copying temporary file with missing plots to final destination " //$NON-NLS-1$ + + tempFile.getAbsolutePath() + " to " + saveToCsvFile[0].getAbsolutePath(), e); //$NON-NLS-1$ + } + } + }; - } catch (Exception e) { - logger.error("Error normalizing operator name ", e); - } + } - String preselectName = operator + "_collectedData_"; //$NON-NLS-1$ + public void showInfoAboutFunctionality() { + JOptionPane.showMessageDialog(frame, Messages.getString("MissingPlotsListener.3"), //$NON-NLS-1$ + Messages.getString("MissingPlotsListener.4"), //$NON-NLS-1$ + JOptionPane.INFORMATION_MESSAGE); + } - preselectName += earthSurveyService.getCollectSurvey().getName(); - DateFormat dateFormat = new SimpleDateFormat("ddMMyy_HHmmss"); //$NON-NLS-1$ - if (modifiedSince == null) { - preselectName += "_on_" + dateFormat.format(new Date()); //$NON-NLS-1$ - } else { + private JPopupMenu getPopupMenu() { + Action copyAction = new AbstractAction(Messages.getString("MissingPlotsListener.2")) { //$NON-NLS-1$ - preselectName += "_" + dateFormat.format(modifiedSince) + "_to_" + dateFormat.format(new Date()); //$NON-NLS-1$ //$NON-NLS-2$ - } + private static final long serialVersionUID = 1L; - preselectName += "_" + exportType.name() + "." + exportType.getDefaultExtension(); //$NON-NLS-1$ //$NON-NLS-2$ + @Override + public void actionPerformed(ActionEvent e) { + disclaimerTextArea.selectAll(); + String selection = disclaimerTextArea.getSelectedText(); + Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); + if (selection == null) { + return; + } + StringSelection clipString = new StringSelection(selection); + clipboard.setContents(clipString, clipString); + } + }; - return preselectName; + JPopupMenu popup = new JPopupMenu(); + popup.add(copyAction); + return popup; } + } From 3e5abca1f32942a12323c24f310270dcb5fc4dbf Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:03 +0100 Subject: [PATCH 0313/1620] New translations MissingPlotsListener.java (English) --- .../earth/app/view/Messages_en.properties | 344 +++++++++--------- 1 file changed, 181 insertions(+), 163 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 88aa8edf1c..3ad3d0b623 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,208 +1,226 @@ package org.openforis.collect.earth.app.view; +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.Toolkit; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.StringSelection; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.io.BufferedReader; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; import java.io.File; -import java.io.FileInputStream; import java.io.IOException; -import java.io.InputStreamReader; -import java.util.Arrays; +import java.util.List; +import java.util.Map; +import javax.swing.AbstractAction; +import javax.swing.Action; +import javax.swing.JButton; +import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JOptionPane; - -import org.apache.commons.io.IOUtils; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.DataImportExportService; +import javax.swing.JPanel; +import javax.swing.JPopupMenu; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.SwingUtilities; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.ad_hoc.FixCoordinates; import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.io.data.CSVDataImportProcess; -import org.openforis.collect.io.data.XMLDataImportProcess; -import org.openforis.collect.manager.process.ProcessStatus; +import org.openforis.collect.earth.app.service.MissingPlotService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public final class ImportActionListener implements ActionListener { - protected static final Integer YES = 0; - protected static final Integer YES_TO_ALL = 1; - protected static final Integer NO = 2; - protected static final Integer NO_TO_ALL = 3; +public final class MissingPlotsListener implements ActionListener { - private final DataFormat importFormat; - private JFrame frame; private LocalPropertiesService localPropertiesService; - private DataImportExportService dataImportService; - private Logger logger = LoggerFactory.getLogger( ImportActionListener.class ); - public ImportActionListener(DataFormat importFormat, JFrame frame, LocalPropertiesService localPropertiesService, DataImportExportService dataImportService) { - this.importFormat = importFormat; + private JFrame frame; + + private final Logger logger = LoggerFactory.getLogger(FixCoordinates.class); + + private JTextArea disclaimerTextArea; + + private MissingPlotService missingPlotService; + + public MissingPlotsListener(JFrame frame, LocalPropertiesService localPropertiesService, + MissingPlotService missingPlotService) { this.frame = frame; this.localPropertiesService = localPropertiesService; - this.dataImportService = dataImportService; + this.missingPlotService = missingPlotService; } @Override public void actionPerformed(ActionEvent e) { - try{ + + try { CollectEarthWindow.startWaiting(frame); - importDataFrom(e, importFormat ); - }finally{ - CollectEarthWindow.endWaiting( frame); + findMissingPlots(); + } catch (Exception e1) { + logger.error(Messages.getString("MissingPlotsListener.0"), e1); //$NON-NLS-1$ + } finally { + + CollectEarthWindow.endWaiting(frame); } } - - private void forceRefreshGoogleEarth() { - EarthApp.executeKmlLoadAsynchronously( null ); + private void findMissingPlots() { - } - private Integer shouldImportNonFinishedRecords( boolean moreThanOneFiles ) { - String message = "" //$NON-NLS-1$ - + Messages.getString("ImportActionListener.0") //$NON-NLS-1$ - +"
" //$NON-NLS-1$ - + Messages.getString("ImportActionListener.2") //$NON-NLS-1$ - + ""; - - if( !moreThanOneFiles ){ - - final int selectedOption = JOptionPane.showConfirmDialog(null, - message //$NON-NLS-1$ - ,Messages.getString("ImportActionListener.3"), //$NON-NLS-1$ - JOptionPane.YES_NO_OPTION); - - if (selectedOption == JOptionPane.YES_OPTION){ - return YES; - }else if (selectedOption == JOptionPane.NO_OPTION){ - return NO; - }else{ - return JOptionPane.CLOSED_OPTION; - } - }else{ + showInfoAboutFunctionality(); - String[] buttons = { Messages.getString("YES"), Messages.getString("YES_TO_ALL"), Messages.getString("NO"), Messages.getString("NO_TO_ALL") }; - - return JOptionPane.showOptionDialog(null, message, Messages.getString("ImportActionListener.3") , - JOptionPane.WARNING_MESSAGE, 0, null, buttons, buttons[1]); + String csvFile = localPropertiesService.getCsvFile(); + File currentFolder = null; + if (!StringUtils.isBlank(csvFile)) { + File file = new File(csvFile); + if (file.exists()) + currentFolder = file.getParentFile(); } - } - private void importDataFrom(final ActionEvent e, final DataFormat importType) { - File[] filesToImport = JFileChooserExistsAware.getFileChooserResults( importType, false, true, null, localPropertiesService, frame ); - final ImportXMLDialogProcessMonitor importDialogProcessMonitor = new ImportXMLDialogProcessMonitor(); - if (filesToImport != null) { - - - switch (importType) { - case ZIP_WITH_XML: - new Thread("XML Import Thread " ){ //$NON-NLS-1$ - @Override - public void run() { - Integer importNonFinishedPlots = shouldImportNonFinishedRecords( filesToImport.length > 1); - boolean firstFile = true; - - for (final File importedFile : filesToImport) { - XMLDataImportProcess dataImportProcess = null; - try{ - if ( firstFile ){ - firstFile = false; - }else if ( !firstFile && (importNonFinishedPlots.equals( YES ) || importNonFinishedPlots.equals( NO ) ) ){ - importNonFinishedPlots = shouldImportNonFinishedRecords( filesToImport.length > 1); - } - - if( importNonFinishedPlots.equals( JOptionPane.CLOSED_OPTION ) ){ - break; - } - - boolean importNotFinished= importNonFinishedPlots.equals( YES ) || importNonFinishedPlots.equals( YES_TO_ALL ); - - dataImportProcess = dataImportService.getImportSummary(importedFile, importNotFinished); - importDialogProcessMonitor.startImport(dataImportProcess, frame, dataImportService, importedFile ); - - } catch (Exception e1) { - logger.error("Error importing data" , e1); //$NON-NLS-1$ - importDialogProcessMonitor.closeProgressmonitor(); - JOptionPane.showMessageDialog( frame, importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.3"), importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.7"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - JOptionPane.ERROR_MESSAGE); - logger.error("Error importing data from " + importedFile.getAbsolutePath() + " in format " + importType.name() , e1); //$NON-NLS-1$ //$NON-NLS-2$ - } finally { - IOUtils.closeQuietly(dataImportProcess); - } - } - forceRefreshGoogleEarth(); - } - }.start(); - break; - case CSV: - new Thread("Update using CSV Thread " ){ //$NON-NLS-1$ - @Override - public void run() { - - String[] ids = dataImportService.getEarthSurveyService().getKeyNamesForSurvey(); - String keyAttributesForSurvey = Arrays.toString( ids ); - - JOptionPane.showMessageDialog( - frame, - "The CSV files used must have columns with at least the headers for the key attributes " + keyAttributesForSurvey+ " followed by one or more attribute names ( see http://www.openforis.org/support/questions/80/changing-plot-attributes-in-the-collect-earth-database ) ", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - "CSV file format info", - JOptionPane.INFORMATION_MESSAGE); - - - for (final File importedFile : filesToImport) { - - CSVDataImportProcess importSurveyAsCsv = null; - try { - importSurveyAsCsv = dataImportService.getCsvImporterProcess(importedFile); - - if( importSurveyAsCsv != null ){ - importSurveyAsCsv.init(); - ProcessStatus status = importSurveyAsCsv.getStatus(); - status.setTotal( getTotalNumberOfLines( importedFile ) ); - if ( status != null && ! importSurveyAsCsv.getStatus().isError() ) { - ImportProcessMonitorDialog importProcessWorker = new ImportProcessMonitorDialog(importSurveyAsCsv, frame ); - importProcessWorker.start(); - } - } - } catch (Exception e1) { - JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.7") + "\n" + e1.getMessage(), importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.3"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - JOptionPane.ERROR_MESSAGE); - logger.error("Error importing data from " + importedFile.getAbsolutePath() + " in format " + importType , e1); //$NON-NLS-1$ //$NON-NLS-2$ - } - } + final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults( + DataFormat.COLLECT_COORDS, false, true, null, localPropertiesService, frame, currentFolder); + if( selectedPlotFiles != null && selectedPlotFiles.length > 0 ) { + new Thread("Finding Missing plots") { + @Override + public void run() { + InfiniteProgressMonitor infiniteProgressMonitor = new InfiniteProgressMonitor(frame, + "Finding missing plots", "Please wait..."); + try { + infiniteProgressMonitor.showLater(); + + // Returns the list of all of the plots that are stored in the selected CSV + // files + final Map> allPlotsInFiles = missingPlotService + .getPlotDataByFile(selectedPlotFiles); + + // Returns the list of the plots that are not completely saved or not saved at + // all in the DB + Map> missingPlotData = missingPlotService + .getMissingPlotsByFile(allPlotsInFiles, infiniteProgressMonitor); + // Generates a text representation of the missing plots plus the brief on the + // total plots + String missingPlotsText = missingPlotService.getMissingPlotInformation(allPlotsInFiles, missingPlotData); + // Generates a temporary file that contains the missing plots as a CED + File tempFile = missingPlotService.getMissingPlotFile(missingPlotData); + SwingUtilities.invokeLater( infiniteProgressMonitor::close ); + + JDialog missingDlg = buildDialog(missingPlotsText, tempFile); + + Runnable setVisible =() -> missingDlg.setVisible(true); + SwingUtilities.invokeLater( setVisible ); + } catch (Exception e) { + logger.error("Error while finding missing plots", e); + } finally { + infiniteProgressMonitor.close(); } - }.start(); - break; - case FUSION: - break; - default: - break; - } + } + }.start(); } + } - private long getTotalNumberOfLines(File importedFile) { - long count = 0; - BufferedReader br = null; - try { - br = new BufferedReader(new InputStreamReader(new FileInputStream(importedFile))); + private JDialog buildDialog(String missingPlotsText, File tempFile) { + final JDialog dialog = new JDialog(frame, Messages.getString("MissingPlotsListener.1")); //$NON-NLS-1$ + dialog.setLocationRelativeTo(frame); + dialog.setSize(new Dimension(300, 400)); + dialog.setModal(false); + + final BorderLayout layoutManager = new BorderLayout(); + + final JPanel panel = new JPanel(layoutManager); + + dialog.add(panel); + + disclaimerTextArea = new JTextArea(missingPlotsText); + disclaimerTextArea.setEditable(false); + disclaimerTextArea.setLineWrap(true); + disclaimerTextArea.setWrapStyleWord(true); + final JScrollPane scrollPane = new JScrollPane(disclaimerTextArea); + panel.add(scrollPane, BorderLayout.CENTER); + scrollPane.setPreferredSize(new Dimension(250, 250)); - while ( br.readLine() != null) { - count++; + final JButton close = new JButton(Messages.getString("CollectEarthWindow.5")); //$NON-NLS-1$ + close.addActionListener(e -> dialog.setVisible(false)); + panel.add(close, BorderLayout.SOUTH); + + if (tempFile != null) { + final JButton export = new JButton(Messages.getString(Messages.getString("MissingPlotsListener.6"))); //$NON-NLS-1$ + ActionListener exportListener = getSaveAsListener(tempFile); + export.addActionListener(exportListener); + panel.add(export, BorderLayout.SOUTH); + } + + disclaimerTextArea.addMouseListener(new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + check(e); + } + + @Override + public void mouseReleased(MouseEvent e) { + check(e); + } + + public void check(MouseEvent e) { + if (e.isPopupTrigger()) { // if the event shows the menu + getPopupMenu().show(disclaimerTextArea, e.getPoint().x, e.getPoint().y); + } } - } catch (IOException e) { - logger.error("Error counting the number of lines in file " + importedFile.getAbsolutePath() , e) ; //$NON-NLS-1$ - }finally { - if( br!=null) { + }); + + return dialog; + } + + private ActionListener getSaveAsListener(File tempFile) { + + return e -> { + final File[] saveToCsvFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, + true, false, "plotsWithMissingInfo.csv", //$NON-NLS-1$ //$NON-NLS-2$ + localPropertiesService, frame); + + if (saveToCsvFile != null && saveToCsvFile.length == 1) { try { - br.close(); - } catch (IOException e) { - logger.error("Error closing file reader " + importedFile.getAbsolutePath() , e) ; + FileUtils.copyFile(tempFile, saveToCsvFile[0]); + } catch (IOException e1) { + logger.error("Error when copying temporary file with missing plots to final destination " //$NON-NLS-1$ + + tempFile.getAbsolutePath() + " to " + saveToCsvFile[0].getAbsolutePath(), e); //$NON-NLS-1$ } } + }; + } - } - return count; + public void showInfoAboutFunctionality() { + JOptionPane.showMessageDialog(frame, Messages.getString("MissingPlotsListener.3"), //$NON-NLS-1$ + Messages.getString("MissingPlotsListener.4"), //$NON-NLS-1$ + JOptionPane.INFORMATION_MESSAGE); } + + private JPopupMenu getPopupMenu() { + Action copyAction = new AbstractAction(Messages.getString("MissingPlotsListener.2")) { //$NON-NLS-1$ + + private static final long serialVersionUID = 1L; + + @Override + public void actionPerformed(ActionEvent e) { + disclaimerTextArea.selectAll(); + String selection = disclaimerTextArea.getSelectedText(); + Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); + if (selection == null) { + return; + } + StringSelection clipString = new StringSelection(selection); + clipboard.setContents(clipString, clipString); + } + }; + + JPopupMenu popup = new JPopupMenu(); + popup.add(copyAction); + return popup; + } + } From 0c03a94b208d7e698ff1676b0f7531190fb76533 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:05 +0100 Subject: [PATCH 0314/1620] New translations OpenAboutDialogListener.java (French) --- .../earth/app/view/Messages_fr.properties | 225 +----------------- 1 file changed, 13 insertions(+), 212 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 3ad3d0b623..2f8596c07f 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,226 +1,27 @@ package org.openforis.collect.earth.app.view; -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.Toolkit; -import java.awt.datatransfer.Clipboard; -import java.awt.datatransfer.StringSelection; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.io.File; -import java.io.IOException; -import java.util.List; -import java.util.Map; -import javax.swing.AbstractAction; -import javax.swing.Action; -import javax.swing.JButton; -import javax.swing.JDialog; import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JPopupMenu; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; -import javax.swing.SwingUtilities; -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.ad_hoc.FixCoordinates; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.MissingPlotService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +public class OpenAboutDialogListener implements ActionListener{ -public final class MissingPlotsListener implements ActionListener { - - private LocalPropertiesService localPropertiesService; - - private JFrame frame; - - private final Logger logger = LoggerFactory.getLogger(FixCoordinates.class); - - private JTextArea disclaimerTextArea; - - private MissingPlotService missingPlotService; - - public MissingPlotsListener(JFrame frame, LocalPropertiesService localPropertiesService, - MissingPlotService missingPlotService) { - this.frame = frame; - this.localPropertiesService = localPropertiesService; - this.missingPlotService = missingPlotService; + JFrame parent; + String title; + + public OpenAboutDialogListener(JFrame parentFrame, String title) { + this.parent = parentFrame; + this.title = title; } - + @Override public void actionPerformed(ActionEvent e) { - - try { - CollectEarthWindow.startWaiting(frame); - findMissingPlots(); - } catch (Exception e1) { - logger.error(Messages.getString("MissingPlotsListener.0"), e1); //$NON-NLS-1$ - } finally { - - CollectEarthWindow.endWaiting(frame); - } - - } - - private void findMissingPlots() { - - showInfoAboutFunctionality(); - - String csvFile = localPropertiesService.getCsvFile(); - File currentFolder = null; - - if (!StringUtils.isBlank(csvFile)) { - File file = new File(csvFile); - if (file.exists()) - currentFolder = file.getParentFile(); - } - - final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults( - DataFormat.COLLECT_COORDS, false, true, null, localPropertiesService, frame, currentFolder); - if( selectedPlotFiles != null && selectedPlotFiles.length > 0 ) { - new Thread("Finding Missing plots") { - @Override - public void run() { - InfiniteProgressMonitor infiniteProgressMonitor = new InfiniteProgressMonitor(frame, - "Finding missing plots", "Please wait..."); - try { - infiniteProgressMonitor.showLater(); - - // Returns the list of all of the plots that are stored in the selected CSV - // files - final Map> allPlotsInFiles = missingPlotService - .getPlotDataByFile(selectedPlotFiles); - - // Returns the list of the plots that are not completely saved or not saved at - // all in the DB - Map> missingPlotData = missingPlotService - .getMissingPlotsByFile(allPlotsInFiles, infiniteProgressMonitor); - // Generates a text representation of the missing plots plus the brief on the - // total plots - String missingPlotsText = missingPlotService.getMissingPlotInformation(allPlotsInFiles, missingPlotData); - // Generates a temporary file that contains the missing plots as a CED - File tempFile = missingPlotService.getMissingPlotFile(missingPlotData); - SwingUtilities.invokeLater( infiniteProgressMonitor::close ); - - JDialog missingDlg = buildDialog(missingPlotsText, tempFile); - - Runnable setVisible =() -> missingDlg.setVisible(true); - SwingUtilities.invokeLater( setVisible ); - } catch (Exception e) { - logger.error("Error while finding missing plots", e); - } finally { - infiniteProgressMonitor.close(); - } - } - }.start(); - } - - } - - private JDialog buildDialog(String missingPlotsText, File tempFile) { - final JDialog dialog = new JDialog(frame, Messages.getString("MissingPlotsListener.1")); //$NON-NLS-1$ - dialog.setLocationRelativeTo(frame); - dialog.setSize(new Dimension(300, 400)); - dialog.setModal(false); - - final BorderLayout layoutManager = new BorderLayout(); - - final JPanel panel = new JPanel(layoutManager); - - dialog.add(panel); - - disclaimerTextArea = new JTextArea(missingPlotsText); - disclaimerTextArea.setEditable(false); - disclaimerTextArea.setLineWrap(true); - disclaimerTextArea.setWrapStyleWord(true); - final JScrollPane scrollPane = new JScrollPane(disclaimerTextArea); - panel.add(scrollPane, BorderLayout.CENTER); - scrollPane.setPreferredSize(new Dimension(250, 250)); - - final JButton close = new JButton(Messages.getString("CollectEarthWindow.5")); //$NON-NLS-1$ - close.addActionListener(e -> dialog.setVisible(false)); - panel.add(close, BorderLayout.SOUTH); - - if (tempFile != null) { - final JButton export = new JButton(Messages.getString(Messages.getString("MissingPlotsListener.6"))); //$NON-NLS-1$ - ActionListener exportListener = getSaveAsListener(tempFile); - export.addActionListener(exportListener); - panel.add(export, BorderLayout.SOUTH); - } - - disclaimerTextArea.addMouseListener(new MouseAdapter() { - @Override - public void mousePressed(MouseEvent e) { - check(e); - } - - @Override - public void mouseReleased(MouseEvent e) { - check(e); - } - - public void check(MouseEvent e) { - if (e.isPopupTrigger()) { // if the event shows the menu - getPopupMenu().show(disclaimerTextArea, e.getPoint().x, e.getPoint().y); - } - } - }); - - return dialog; - } - - private ActionListener getSaveAsListener(File tempFile) { - - return e -> { - final File[] saveToCsvFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, - true, false, "plotsWithMissingInfo.csv", //$NON-NLS-1$ //$NON-NLS-2$ - localPropertiesService, frame); - - if (saveToCsvFile != null && saveToCsvFile.length == 1) { - try { - FileUtils.copyFile(tempFile, saveToCsvFile[0]); - } catch (IOException e1) { - logger.error("Error when copying temporary file with missing plots to final destination " //$NON-NLS-1$ - + tempFile.getAbsolutePath() + " to " + saveToCsvFile[0].getAbsolutePath(), e); //$NON-NLS-1$ - } - } - }; - - } - - public void showInfoAboutFunctionality() { - JOptionPane.showMessageDialog(frame, Messages.getString("MissingPlotsListener.3"), //$NON-NLS-1$ - Messages.getString("MissingPlotsListener.4"), //$NON-NLS-1$ - JOptionPane.INFORMATION_MESSAGE); - } - - private JPopupMenu getPopupMenu() { - Action copyAction = new AbstractAction(Messages.getString("MissingPlotsListener.2")) { //$NON-NLS-1$ - - private static final long serialVersionUID = 1L; - - @Override - public void actionPerformed(ActionEvent e) { - disclaimerTextArea.selectAll(); - String selection = disclaimerTextArea.getSelectedText(); - Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); - if (selection == null) { - return; - } - StringSelection clipString = new StringSelection(selection); - clipboard.setContents(clipString, clipString); - } - }; - - JPopupMenu popup = new JPopupMenu(); - popup.add(copyAction); - return popup; + AboutDialog aboutDialog = new AboutDialog(parent, title); + aboutDialog.setLocationRelativeTo(parent); + + aboutDialog.setModal(true); + aboutDialog.setVisible(true); } } From d0f18e43cfbb6809001dad4c391d47ccb7e813f7 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:06 +0100 Subject: [PATCH 0315/1620] New translations OpenAboutDialogListener.java (Spanish) --- .../earth/app/view/Messages_es.properties | 225 +----------------- 1 file changed, 13 insertions(+), 212 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 3ad3d0b623..2f8596c07f 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,226 +1,27 @@ package org.openforis.collect.earth.app.view; -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.Toolkit; -import java.awt.datatransfer.Clipboard; -import java.awt.datatransfer.StringSelection; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.io.File; -import java.io.IOException; -import java.util.List; -import java.util.Map; -import javax.swing.AbstractAction; -import javax.swing.Action; -import javax.swing.JButton; -import javax.swing.JDialog; import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JPopupMenu; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; -import javax.swing.SwingUtilities; -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.ad_hoc.FixCoordinates; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.MissingPlotService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +public class OpenAboutDialogListener implements ActionListener{ -public final class MissingPlotsListener implements ActionListener { - - private LocalPropertiesService localPropertiesService; - - private JFrame frame; - - private final Logger logger = LoggerFactory.getLogger(FixCoordinates.class); - - private JTextArea disclaimerTextArea; - - private MissingPlotService missingPlotService; - - public MissingPlotsListener(JFrame frame, LocalPropertiesService localPropertiesService, - MissingPlotService missingPlotService) { - this.frame = frame; - this.localPropertiesService = localPropertiesService; - this.missingPlotService = missingPlotService; + JFrame parent; + String title; + + public OpenAboutDialogListener(JFrame parentFrame, String title) { + this.parent = parentFrame; + this.title = title; } - + @Override public void actionPerformed(ActionEvent e) { - - try { - CollectEarthWindow.startWaiting(frame); - findMissingPlots(); - } catch (Exception e1) { - logger.error(Messages.getString("MissingPlotsListener.0"), e1); //$NON-NLS-1$ - } finally { - - CollectEarthWindow.endWaiting(frame); - } - - } - - private void findMissingPlots() { - - showInfoAboutFunctionality(); - - String csvFile = localPropertiesService.getCsvFile(); - File currentFolder = null; - - if (!StringUtils.isBlank(csvFile)) { - File file = new File(csvFile); - if (file.exists()) - currentFolder = file.getParentFile(); - } - - final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults( - DataFormat.COLLECT_COORDS, false, true, null, localPropertiesService, frame, currentFolder); - if( selectedPlotFiles != null && selectedPlotFiles.length > 0 ) { - new Thread("Finding Missing plots") { - @Override - public void run() { - InfiniteProgressMonitor infiniteProgressMonitor = new InfiniteProgressMonitor(frame, - "Finding missing plots", "Please wait..."); - try { - infiniteProgressMonitor.showLater(); - - // Returns the list of all of the plots that are stored in the selected CSV - // files - final Map> allPlotsInFiles = missingPlotService - .getPlotDataByFile(selectedPlotFiles); - - // Returns the list of the plots that are not completely saved or not saved at - // all in the DB - Map> missingPlotData = missingPlotService - .getMissingPlotsByFile(allPlotsInFiles, infiniteProgressMonitor); - // Generates a text representation of the missing plots plus the brief on the - // total plots - String missingPlotsText = missingPlotService.getMissingPlotInformation(allPlotsInFiles, missingPlotData); - // Generates a temporary file that contains the missing plots as a CED - File tempFile = missingPlotService.getMissingPlotFile(missingPlotData); - SwingUtilities.invokeLater( infiniteProgressMonitor::close ); - - JDialog missingDlg = buildDialog(missingPlotsText, tempFile); - - Runnable setVisible =() -> missingDlg.setVisible(true); - SwingUtilities.invokeLater( setVisible ); - } catch (Exception e) { - logger.error("Error while finding missing plots", e); - } finally { - infiniteProgressMonitor.close(); - } - } - }.start(); - } - - } - - private JDialog buildDialog(String missingPlotsText, File tempFile) { - final JDialog dialog = new JDialog(frame, Messages.getString("MissingPlotsListener.1")); //$NON-NLS-1$ - dialog.setLocationRelativeTo(frame); - dialog.setSize(new Dimension(300, 400)); - dialog.setModal(false); - - final BorderLayout layoutManager = new BorderLayout(); - - final JPanel panel = new JPanel(layoutManager); - - dialog.add(panel); - - disclaimerTextArea = new JTextArea(missingPlotsText); - disclaimerTextArea.setEditable(false); - disclaimerTextArea.setLineWrap(true); - disclaimerTextArea.setWrapStyleWord(true); - final JScrollPane scrollPane = new JScrollPane(disclaimerTextArea); - panel.add(scrollPane, BorderLayout.CENTER); - scrollPane.setPreferredSize(new Dimension(250, 250)); - - final JButton close = new JButton(Messages.getString("CollectEarthWindow.5")); //$NON-NLS-1$ - close.addActionListener(e -> dialog.setVisible(false)); - panel.add(close, BorderLayout.SOUTH); - - if (tempFile != null) { - final JButton export = new JButton(Messages.getString(Messages.getString("MissingPlotsListener.6"))); //$NON-NLS-1$ - ActionListener exportListener = getSaveAsListener(tempFile); - export.addActionListener(exportListener); - panel.add(export, BorderLayout.SOUTH); - } - - disclaimerTextArea.addMouseListener(new MouseAdapter() { - @Override - public void mousePressed(MouseEvent e) { - check(e); - } - - @Override - public void mouseReleased(MouseEvent e) { - check(e); - } - - public void check(MouseEvent e) { - if (e.isPopupTrigger()) { // if the event shows the menu - getPopupMenu().show(disclaimerTextArea, e.getPoint().x, e.getPoint().y); - } - } - }); - - return dialog; - } - - private ActionListener getSaveAsListener(File tempFile) { - - return e -> { - final File[] saveToCsvFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, - true, false, "plotsWithMissingInfo.csv", //$NON-NLS-1$ //$NON-NLS-2$ - localPropertiesService, frame); - - if (saveToCsvFile != null && saveToCsvFile.length == 1) { - try { - FileUtils.copyFile(tempFile, saveToCsvFile[0]); - } catch (IOException e1) { - logger.error("Error when copying temporary file with missing plots to final destination " //$NON-NLS-1$ - + tempFile.getAbsolutePath() + " to " + saveToCsvFile[0].getAbsolutePath(), e); //$NON-NLS-1$ - } - } - }; - - } - - public void showInfoAboutFunctionality() { - JOptionPane.showMessageDialog(frame, Messages.getString("MissingPlotsListener.3"), //$NON-NLS-1$ - Messages.getString("MissingPlotsListener.4"), //$NON-NLS-1$ - JOptionPane.INFORMATION_MESSAGE); - } - - private JPopupMenu getPopupMenu() { - Action copyAction = new AbstractAction(Messages.getString("MissingPlotsListener.2")) { //$NON-NLS-1$ - - private static final long serialVersionUID = 1L; - - @Override - public void actionPerformed(ActionEvent e) { - disclaimerTextArea.selectAll(); - String selection = disclaimerTextArea.getSelectedText(); - Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); - if (selection == null) { - return; - } - StringSelection clipString = new StringSelection(selection); - clipboard.setContents(clipString, clipString); - } - }; - - JPopupMenu popup = new JPopupMenu(); - popup.add(copyAction); - return popup; + AboutDialog aboutDialog = new AboutDialog(parent, title); + aboutDialog.setLocationRelativeTo(parent); + + aboutDialog.setModal(true); + aboutDialog.setVisible(true); } } From 79733943ac067fc5ba67d00a3f90d52daefd0850 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:07 +0100 Subject: [PATCH 0316/1620] New translations OpenAboutDialogListener.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 225 +----------------- 1 file changed, 13 insertions(+), 212 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 3ad3d0b623..2f8596c07f 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,226 +1,27 @@ package org.openforis.collect.earth.app.view; -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.Toolkit; -import java.awt.datatransfer.Clipboard; -import java.awt.datatransfer.StringSelection; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.io.File; -import java.io.IOException; -import java.util.List; -import java.util.Map; -import javax.swing.AbstractAction; -import javax.swing.Action; -import javax.swing.JButton; -import javax.swing.JDialog; import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JPopupMenu; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; -import javax.swing.SwingUtilities; -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.ad_hoc.FixCoordinates; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.MissingPlotService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +public class OpenAboutDialogListener implements ActionListener{ -public final class MissingPlotsListener implements ActionListener { - - private LocalPropertiesService localPropertiesService; - - private JFrame frame; - - private final Logger logger = LoggerFactory.getLogger(FixCoordinates.class); - - private JTextArea disclaimerTextArea; - - private MissingPlotService missingPlotService; - - public MissingPlotsListener(JFrame frame, LocalPropertiesService localPropertiesService, - MissingPlotService missingPlotService) { - this.frame = frame; - this.localPropertiesService = localPropertiesService; - this.missingPlotService = missingPlotService; + JFrame parent; + String title; + + public OpenAboutDialogListener(JFrame parentFrame, String title) { + this.parent = parentFrame; + this.title = title; } - + @Override public void actionPerformed(ActionEvent e) { - - try { - CollectEarthWindow.startWaiting(frame); - findMissingPlots(); - } catch (Exception e1) { - logger.error(Messages.getString("MissingPlotsListener.0"), e1); //$NON-NLS-1$ - } finally { - - CollectEarthWindow.endWaiting(frame); - } - - } - - private void findMissingPlots() { - - showInfoAboutFunctionality(); - - String csvFile = localPropertiesService.getCsvFile(); - File currentFolder = null; - - if (!StringUtils.isBlank(csvFile)) { - File file = new File(csvFile); - if (file.exists()) - currentFolder = file.getParentFile(); - } - - final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults( - DataFormat.COLLECT_COORDS, false, true, null, localPropertiesService, frame, currentFolder); - if( selectedPlotFiles != null && selectedPlotFiles.length > 0 ) { - new Thread("Finding Missing plots") { - @Override - public void run() { - InfiniteProgressMonitor infiniteProgressMonitor = new InfiniteProgressMonitor(frame, - "Finding missing plots", "Please wait..."); - try { - infiniteProgressMonitor.showLater(); - - // Returns the list of all of the plots that are stored in the selected CSV - // files - final Map> allPlotsInFiles = missingPlotService - .getPlotDataByFile(selectedPlotFiles); - - // Returns the list of the plots that are not completely saved or not saved at - // all in the DB - Map> missingPlotData = missingPlotService - .getMissingPlotsByFile(allPlotsInFiles, infiniteProgressMonitor); - // Generates a text representation of the missing plots plus the brief on the - // total plots - String missingPlotsText = missingPlotService.getMissingPlotInformation(allPlotsInFiles, missingPlotData); - // Generates a temporary file that contains the missing plots as a CED - File tempFile = missingPlotService.getMissingPlotFile(missingPlotData); - SwingUtilities.invokeLater( infiniteProgressMonitor::close ); - - JDialog missingDlg = buildDialog(missingPlotsText, tempFile); - - Runnable setVisible =() -> missingDlg.setVisible(true); - SwingUtilities.invokeLater( setVisible ); - } catch (Exception e) { - logger.error("Error while finding missing plots", e); - } finally { - infiniteProgressMonitor.close(); - } - } - }.start(); - } - - } - - private JDialog buildDialog(String missingPlotsText, File tempFile) { - final JDialog dialog = new JDialog(frame, Messages.getString("MissingPlotsListener.1")); //$NON-NLS-1$ - dialog.setLocationRelativeTo(frame); - dialog.setSize(new Dimension(300, 400)); - dialog.setModal(false); - - final BorderLayout layoutManager = new BorderLayout(); - - final JPanel panel = new JPanel(layoutManager); - - dialog.add(panel); - - disclaimerTextArea = new JTextArea(missingPlotsText); - disclaimerTextArea.setEditable(false); - disclaimerTextArea.setLineWrap(true); - disclaimerTextArea.setWrapStyleWord(true); - final JScrollPane scrollPane = new JScrollPane(disclaimerTextArea); - panel.add(scrollPane, BorderLayout.CENTER); - scrollPane.setPreferredSize(new Dimension(250, 250)); - - final JButton close = new JButton(Messages.getString("CollectEarthWindow.5")); //$NON-NLS-1$ - close.addActionListener(e -> dialog.setVisible(false)); - panel.add(close, BorderLayout.SOUTH); - - if (tempFile != null) { - final JButton export = new JButton(Messages.getString(Messages.getString("MissingPlotsListener.6"))); //$NON-NLS-1$ - ActionListener exportListener = getSaveAsListener(tempFile); - export.addActionListener(exportListener); - panel.add(export, BorderLayout.SOUTH); - } - - disclaimerTextArea.addMouseListener(new MouseAdapter() { - @Override - public void mousePressed(MouseEvent e) { - check(e); - } - - @Override - public void mouseReleased(MouseEvent e) { - check(e); - } - - public void check(MouseEvent e) { - if (e.isPopupTrigger()) { // if the event shows the menu - getPopupMenu().show(disclaimerTextArea, e.getPoint().x, e.getPoint().y); - } - } - }); - - return dialog; - } - - private ActionListener getSaveAsListener(File tempFile) { - - return e -> { - final File[] saveToCsvFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, - true, false, "plotsWithMissingInfo.csv", //$NON-NLS-1$ //$NON-NLS-2$ - localPropertiesService, frame); - - if (saveToCsvFile != null && saveToCsvFile.length == 1) { - try { - FileUtils.copyFile(tempFile, saveToCsvFile[0]); - } catch (IOException e1) { - logger.error("Error when copying temporary file with missing plots to final destination " //$NON-NLS-1$ - + tempFile.getAbsolutePath() + " to " + saveToCsvFile[0].getAbsolutePath(), e); //$NON-NLS-1$ - } - } - }; - - } - - public void showInfoAboutFunctionality() { - JOptionPane.showMessageDialog(frame, Messages.getString("MissingPlotsListener.3"), //$NON-NLS-1$ - Messages.getString("MissingPlotsListener.4"), //$NON-NLS-1$ - JOptionPane.INFORMATION_MESSAGE); - } - - private JPopupMenu getPopupMenu() { - Action copyAction = new AbstractAction(Messages.getString("MissingPlotsListener.2")) { //$NON-NLS-1$ - - private static final long serialVersionUID = 1L; - - @Override - public void actionPerformed(ActionEvent e) { - disclaimerTextArea.selectAll(); - String selection = disclaimerTextArea.getSelectedText(); - Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); - if (selection == null) { - return; - } - StringSelection clipString = new StringSelection(selection); - clipboard.setContents(clipString, clipString); - } - }; - - JPopupMenu popup = new JPopupMenu(); - popup.add(copyAction); - return popup; + AboutDialog aboutDialog = new AboutDialog(parent, title); + aboutDialog.setLocationRelativeTo(parent); + + aboutDialog.setModal(true); + aboutDialog.setVisible(true); } } From acb16831239e4255eeee4952a8f4f2ccbf66df6c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:08 +0100 Subject: [PATCH 0317/1620] New translations OpenAboutDialogListener.java (English) --- .../earth/app/view/Messages_en.properties | 225 +----------------- 1 file changed, 13 insertions(+), 212 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 3ad3d0b623..2f8596c07f 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,226 +1,27 @@ package org.openforis.collect.earth.app.view; -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.Toolkit; -import java.awt.datatransfer.Clipboard; -import java.awt.datatransfer.StringSelection; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.io.File; -import java.io.IOException; -import java.util.List; -import java.util.Map; -import javax.swing.AbstractAction; -import javax.swing.Action; -import javax.swing.JButton; -import javax.swing.JDialog; import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JPopupMenu; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; -import javax.swing.SwingUtilities; -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.ad_hoc.FixCoordinates; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.MissingPlotService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +public class OpenAboutDialogListener implements ActionListener{ -public final class MissingPlotsListener implements ActionListener { - - private LocalPropertiesService localPropertiesService; - - private JFrame frame; - - private final Logger logger = LoggerFactory.getLogger(FixCoordinates.class); - - private JTextArea disclaimerTextArea; - - private MissingPlotService missingPlotService; - - public MissingPlotsListener(JFrame frame, LocalPropertiesService localPropertiesService, - MissingPlotService missingPlotService) { - this.frame = frame; - this.localPropertiesService = localPropertiesService; - this.missingPlotService = missingPlotService; + JFrame parent; + String title; + + public OpenAboutDialogListener(JFrame parentFrame, String title) { + this.parent = parentFrame; + this.title = title; } - + @Override public void actionPerformed(ActionEvent e) { - - try { - CollectEarthWindow.startWaiting(frame); - findMissingPlots(); - } catch (Exception e1) { - logger.error(Messages.getString("MissingPlotsListener.0"), e1); //$NON-NLS-1$ - } finally { - - CollectEarthWindow.endWaiting(frame); - } - - } - - private void findMissingPlots() { - - showInfoAboutFunctionality(); - - String csvFile = localPropertiesService.getCsvFile(); - File currentFolder = null; - - if (!StringUtils.isBlank(csvFile)) { - File file = new File(csvFile); - if (file.exists()) - currentFolder = file.getParentFile(); - } - - final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults( - DataFormat.COLLECT_COORDS, false, true, null, localPropertiesService, frame, currentFolder); - if( selectedPlotFiles != null && selectedPlotFiles.length > 0 ) { - new Thread("Finding Missing plots") { - @Override - public void run() { - InfiniteProgressMonitor infiniteProgressMonitor = new InfiniteProgressMonitor(frame, - "Finding missing plots", "Please wait..."); - try { - infiniteProgressMonitor.showLater(); - - // Returns the list of all of the plots that are stored in the selected CSV - // files - final Map> allPlotsInFiles = missingPlotService - .getPlotDataByFile(selectedPlotFiles); - - // Returns the list of the plots that are not completely saved or not saved at - // all in the DB - Map> missingPlotData = missingPlotService - .getMissingPlotsByFile(allPlotsInFiles, infiniteProgressMonitor); - // Generates a text representation of the missing plots plus the brief on the - // total plots - String missingPlotsText = missingPlotService.getMissingPlotInformation(allPlotsInFiles, missingPlotData); - // Generates a temporary file that contains the missing plots as a CED - File tempFile = missingPlotService.getMissingPlotFile(missingPlotData); - SwingUtilities.invokeLater( infiniteProgressMonitor::close ); - - JDialog missingDlg = buildDialog(missingPlotsText, tempFile); - - Runnable setVisible =() -> missingDlg.setVisible(true); - SwingUtilities.invokeLater( setVisible ); - } catch (Exception e) { - logger.error("Error while finding missing plots", e); - } finally { - infiniteProgressMonitor.close(); - } - } - }.start(); - } - - } - - private JDialog buildDialog(String missingPlotsText, File tempFile) { - final JDialog dialog = new JDialog(frame, Messages.getString("MissingPlotsListener.1")); //$NON-NLS-1$ - dialog.setLocationRelativeTo(frame); - dialog.setSize(new Dimension(300, 400)); - dialog.setModal(false); - - final BorderLayout layoutManager = new BorderLayout(); - - final JPanel panel = new JPanel(layoutManager); - - dialog.add(panel); - - disclaimerTextArea = new JTextArea(missingPlotsText); - disclaimerTextArea.setEditable(false); - disclaimerTextArea.setLineWrap(true); - disclaimerTextArea.setWrapStyleWord(true); - final JScrollPane scrollPane = new JScrollPane(disclaimerTextArea); - panel.add(scrollPane, BorderLayout.CENTER); - scrollPane.setPreferredSize(new Dimension(250, 250)); - - final JButton close = new JButton(Messages.getString("CollectEarthWindow.5")); //$NON-NLS-1$ - close.addActionListener(e -> dialog.setVisible(false)); - panel.add(close, BorderLayout.SOUTH); - - if (tempFile != null) { - final JButton export = new JButton(Messages.getString(Messages.getString("MissingPlotsListener.6"))); //$NON-NLS-1$ - ActionListener exportListener = getSaveAsListener(tempFile); - export.addActionListener(exportListener); - panel.add(export, BorderLayout.SOUTH); - } - - disclaimerTextArea.addMouseListener(new MouseAdapter() { - @Override - public void mousePressed(MouseEvent e) { - check(e); - } - - @Override - public void mouseReleased(MouseEvent e) { - check(e); - } - - public void check(MouseEvent e) { - if (e.isPopupTrigger()) { // if the event shows the menu - getPopupMenu().show(disclaimerTextArea, e.getPoint().x, e.getPoint().y); - } - } - }); - - return dialog; - } - - private ActionListener getSaveAsListener(File tempFile) { - - return e -> { - final File[] saveToCsvFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, - true, false, "plotsWithMissingInfo.csv", //$NON-NLS-1$ //$NON-NLS-2$ - localPropertiesService, frame); - - if (saveToCsvFile != null && saveToCsvFile.length == 1) { - try { - FileUtils.copyFile(tempFile, saveToCsvFile[0]); - } catch (IOException e1) { - logger.error("Error when copying temporary file with missing plots to final destination " //$NON-NLS-1$ - + tempFile.getAbsolutePath() + " to " + saveToCsvFile[0].getAbsolutePath(), e); //$NON-NLS-1$ - } - } - }; - - } - - public void showInfoAboutFunctionality() { - JOptionPane.showMessageDialog(frame, Messages.getString("MissingPlotsListener.3"), //$NON-NLS-1$ - Messages.getString("MissingPlotsListener.4"), //$NON-NLS-1$ - JOptionPane.INFORMATION_MESSAGE); - } - - private JPopupMenu getPopupMenu() { - Action copyAction = new AbstractAction(Messages.getString("MissingPlotsListener.2")) { //$NON-NLS-1$ - - private static final long serialVersionUID = 1L; - - @Override - public void actionPerformed(ActionEvent e) { - disclaimerTextArea.selectAll(); - String selection = disclaimerTextArea.getSelectedText(); - Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); - if (selection == null) { - return; - } - StringSelection clipString = new StringSelection(selection); - clipboard.setContents(clipString, clipString); - } - }; - - JPopupMenu popup = new JPopupMenu(); - popup.add(copyAction); - return popup; + AboutDialog aboutDialog = new AboutDialog(parent, title); + aboutDialog.setLocationRelativeTo(parent); + + aboutDialog.setModal(true); + aboutDialog.setVisible(true); } } From 7506e640c7e2e9b9b69a50a2edd2fe651fbe61dc Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:09 +0100 Subject: [PATCH 0318/1620] New translations OpenSupportForum.java (French) --- .../earth/app/view/Messages_fr.properties | 26 +++++++------------ 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 2f8596c07f..06f4b227eb 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -2,26 +2,20 @@ package org.openforis.collect.earth.app.view; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.net.URI; +import java.net.URISyntaxException; -import javax.swing.JFrame; +public class OpenSupportForum implements ActionListener { -public class OpenAboutDialogListener implements ActionListener{ - - JFrame parent; - String title; - - public OpenAboutDialogListener(JFrame parentFrame, String title) { - this.parent = parentFrame; - this.title = title; - } - @Override public void actionPerformed(ActionEvent e) { - AboutDialog aboutDialog = new AboutDialog(parent, title); - aboutDialog.setLocationRelativeTo(parent); - - aboutDialog.setModal(true); - aboutDialog.setVisible(true); + try { + URI uri = new java.net.URI("http://www.openforis.org/support"); //$NON-NLS-1$ + (new LinkRunner(uri)).execute(); + } catch (URISyntaxException use) { + throw new AssertionError(use + ": " + "Open FOris support"); //NOI18N //$NON-NLS-1$ + } + } } From a0c259bb5a3f46f6cf10896f2a2f2ac34f21a9cf Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:10 +0100 Subject: [PATCH 0319/1620] New translations OpenSupportForum.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 26 +++++++------------ 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 2f8596c07f..06f4b227eb 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -2,26 +2,20 @@ package org.openforis.collect.earth.app.view; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.net.URI; +import java.net.URISyntaxException; -import javax.swing.JFrame; +public class OpenSupportForum implements ActionListener { -public class OpenAboutDialogListener implements ActionListener{ - - JFrame parent; - String title; - - public OpenAboutDialogListener(JFrame parentFrame, String title) { - this.parent = parentFrame; - this.title = title; - } - @Override public void actionPerformed(ActionEvent e) { - AboutDialog aboutDialog = new AboutDialog(parent, title); - aboutDialog.setLocationRelativeTo(parent); - - aboutDialog.setModal(true); - aboutDialog.setVisible(true); + try { + URI uri = new java.net.URI("http://www.openforis.org/support"); //$NON-NLS-1$ + (new LinkRunner(uri)).execute(); + } catch (URISyntaxException use) { + throw new AssertionError(use + ": " + "Open FOris support"); //NOI18N //$NON-NLS-1$ + } + } } From 5f2138a112f47d731ab697dc9dad000b8958475d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:11 +0100 Subject: [PATCH 0320/1620] New translations LinkRunner.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 48 ++++++++++++++----- 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 06f4b227eb..c9f18857eb 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,21 +1,43 @@ package org.openforis.collect.earth.app.view; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; +import java.awt.Desktop; import java.net.URI; -import java.net.URISyntaxException; +import java.util.concurrent.ExecutionException; -public class OpenSupportForum implements ActionListener { +import javax.swing.JOptionPane; +import javax.swing.SwingWorker; - @Override - public void actionPerformed(ActionEvent e) { - try { - URI uri = new java.net.URI("http://www.openforis.org/support"); //$NON-NLS-1$ - (new LinkRunner(uri)).execute(); - } catch (URISyntaxException use) { - throw new AssertionError(use + ": " + "Open FOris support"); //NOI18N //$NON-NLS-1$ +class LinkRunner extends SwingWorker { + + private final URI uri; + + LinkRunner(URI u) { + if (u == null) { + throw new NullPointerException(); } + uri = u; + } + + @Override + protected Void doInBackground() throws Exception { + Desktop desktop = java.awt.Desktop.getDesktop(); + desktop.browse(uri); + return null; + } - } + @Override + protected void done() { + try { + get(); + } catch (ExecutionException ee) { + handleException(); + } catch (InterruptedException e) { + handleException(); + Thread.currentThread().interrupt(); + } + } -} + private static void handleException() { + JOptionPane.showMessageDialog(null, Messages.getString("AboutDialog.6"), Messages.getString("AboutDialog.19"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ + } +} \ No newline at end of file From 6d289397611f2f0981f19a29a143668733154131 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:12 +0100 Subject: [PATCH 0321/1620] New translations OpenSupportForum.java (English) --- .../earth/app/view/Messages_en.properties | 26 +++++++------------ 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 2f8596c07f..06f4b227eb 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -2,26 +2,20 @@ package org.openforis.collect.earth.app.view; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.net.URI; +import java.net.URISyntaxException; -import javax.swing.JFrame; +public class OpenSupportForum implements ActionListener { -public class OpenAboutDialogListener implements ActionListener{ - - JFrame parent; - String title; - - public OpenAboutDialogListener(JFrame parentFrame, String title) { - this.parent = parentFrame; - this.title = title; - } - @Override public void actionPerformed(ActionEvent e) { - AboutDialog aboutDialog = new AboutDialog(parent, title); - aboutDialog.setLocationRelativeTo(parent); - - aboutDialog.setModal(true); - aboutDialog.setVisible(true); + try { + URI uri = new java.net.URI("http://www.openforis.org/support"); //$NON-NLS-1$ + (new LinkRunner(uri)).execute(); + } catch (URISyntaxException use) { + throw new AssertionError(use + ": " + "Open FOris support"); //NOI18N //$NON-NLS-1$ + } + } } From 13f6218164d661c6c53981ff074370eca4ac4ddb Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:13 +0100 Subject: [PATCH 0322/1620] New translations OpenTextFileListener.java (French) --- .../earth/app/view/Messages_fr.properties | 67 ++++++++++++++++--- 1 file changed, 59 insertions(+), 8 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 06f4b227eb..a3e291cd48 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,21 +1,72 @@ package org.openforis.collect.earth.app.view; +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.net.URI; -import java.net.URISyntaxException; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; -public class OpenSupportForum implements ActionListener { +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; + +import org.apache.commons.io.FileUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class OpenTextFileListener implements ActionListener { + + JDialog dialog; + private final Logger logger = LoggerFactory.getLogger(OpenTextFileListener.class); + JTextArea disclaimerTextArea; + private String filePath; + + public OpenTextFileListener(Frame owner, String filePath, String title) { + + this.filePath = filePath; + dialog = new JDialog(owner, title + " " + filePath); //$NON-NLS-1$ + dialog.setLocationRelativeTo(owner); + dialog.setSize(new Dimension(300, 400)); + dialog.setModal(true); + + final BorderLayout layoutManager = new BorderLayout(); + + final JPanel panel = new JPanel(layoutManager); + + dialog.add(panel); + + disclaimerTextArea = new JTextArea(); + disclaimerTextArea.setEditable(false); + disclaimerTextArea.setLineWrap(true); + disclaimerTextArea.setWrapStyleWord(true); + final JScrollPane scrollPane = new JScrollPane(disclaimerTextArea); + panel.add(scrollPane, BorderLayout.CENTER); + scrollPane.setPreferredSize(new Dimension(250, 250)); + + final JButton close = new JButton(Messages.getString("CollectEarthWindow.5")); //$NON-NLS-1$ + close.addActionListener( e -> dialog.setVisible(false) ); + panel.add(close, BorderLayout.SOUTH); + } @Override public void actionPerformed(ActionEvent e) { + disclaimerTextArea.setText(getTextContents()); + dialog.setVisible(true); + } + + private String getTextContents() { try { - URI uri = new java.net.URI("http://www.openforis.org/support"); //$NON-NLS-1$ - (new LinkRunner(uri)).execute(); - } catch (URISyntaxException use) { - throw new AssertionError(use + ": " + "Open FOris support"); //NOI18N //$NON-NLS-1$ - } + return FileUtils.readFileToString(new File( filePath ), StandardCharsets.UTF_8); + } catch (final IOException e) { + logger.error(Messages.getString("OpenTextFileListener.0") + filePath.toString(), e); //$NON-NLS-1$ + return Messages.getString("CollectEarthWindow.8"); //$NON-NLS-1$ + } } } From 6cde54683c8ed374431142ae0a8dc51dfeb17368 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:14 +0100 Subject: [PATCH 0323/1620] New translations OpenTextFileListener.java (Spanish) --- .../earth/app/view/Messages_es.properties | 73 +++++++++++++++---- 1 file changed, 59 insertions(+), 14 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 2f8596c07f..a3e291cd48 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,27 +1,72 @@ package org.openforis.collect.earth.app.view; +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; -import javax.swing.JFrame; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; -public class OpenAboutDialogListener implements ActionListener{ +import org.apache.commons.io.FileUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; - JFrame parent; - String title; - - public OpenAboutDialogListener(JFrame parentFrame, String title) { - this.parent = parentFrame; - this.title = title; +public class OpenTextFileListener implements ActionListener { + + JDialog dialog; + private final Logger logger = LoggerFactory.getLogger(OpenTextFileListener.class); + JTextArea disclaimerTextArea; + private String filePath; + + public OpenTextFileListener(Frame owner, String filePath, String title) { + + this.filePath = filePath; + dialog = new JDialog(owner, title + " " + filePath); //$NON-NLS-1$ + dialog.setLocationRelativeTo(owner); + dialog.setSize(new Dimension(300, 400)); + dialog.setModal(true); + + final BorderLayout layoutManager = new BorderLayout(); + + final JPanel panel = new JPanel(layoutManager); + + dialog.add(panel); + + disclaimerTextArea = new JTextArea(); + disclaimerTextArea.setEditable(false); + disclaimerTextArea.setLineWrap(true); + disclaimerTextArea.setWrapStyleWord(true); + final JScrollPane scrollPane = new JScrollPane(disclaimerTextArea); + panel.add(scrollPane, BorderLayout.CENTER); + scrollPane.setPreferredSize(new Dimension(250, 250)); + + final JButton close = new JButton(Messages.getString("CollectEarthWindow.5")); //$NON-NLS-1$ + close.addActionListener( e -> dialog.setVisible(false) ); + panel.add(close, BorderLayout.SOUTH); } - + @Override public void actionPerformed(ActionEvent e) { - AboutDialog aboutDialog = new AboutDialog(parent, title); - aboutDialog.setLocationRelativeTo(parent); - - aboutDialog.setModal(true); - aboutDialog.setVisible(true); + disclaimerTextArea.setText(getTextContents()); + dialog.setVisible(true); + } + + private String getTextContents() { + try { + + return FileUtils.readFileToString(new File( filePath ), StandardCharsets.UTF_8); + } catch (final IOException e) { + logger.error(Messages.getString("OpenTextFileListener.0") + filePath.toString(), e); //$NON-NLS-1$ + return Messages.getString("CollectEarthWindow.8"); //$NON-NLS-1$ + } } } From d5a238c2726bfac2b93a7924b9b7dc4c2dfd285d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:15 +0100 Subject: [PATCH 0324/1620] New translations OpenTextFileListener.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 107 +++++++++++------- 1 file changed, 68 insertions(+), 39 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index c9f18857eb..a3e291cd48 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,43 +1,72 @@ package org.openforis.collect.earth.app.view; -import java.awt.Desktop; -import java.net.URI; -import java.util.concurrent.ExecutionException; - -import javax.swing.JOptionPane; -import javax.swing.SwingWorker; - -class LinkRunner extends SwingWorker { - - private final URI uri; - - LinkRunner(URI u) { - if (u == null) { - throw new NullPointerException(); - } - uri = u; - } - - @Override - protected Void doInBackground() throws Exception { - Desktop desktop = java.awt.Desktop.getDesktop(); - desktop.browse(uri); - return null; - } - - @Override - protected void done() { - try { - get(); - } catch (ExecutionException ee) { - handleException(); - } catch (InterruptedException e) { - handleException(); - Thread.currentThread().interrupt(); +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; + +import org.apache.commons.io.FileUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class OpenTextFileListener implements ActionListener { + + JDialog dialog; + private final Logger logger = LoggerFactory.getLogger(OpenTextFileListener.class); + JTextArea disclaimerTextArea; + private String filePath; + + public OpenTextFileListener(Frame owner, String filePath, String title) { + + this.filePath = filePath; + dialog = new JDialog(owner, title + " " + filePath); //$NON-NLS-1$ + dialog.setLocationRelativeTo(owner); + dialog.setSize(new Dimension(300, 400)); + dialog.setModal(true); + + final BorderLayout layoutManager = new BorderLayout(); + + final JPanel panel = new JPanel(layoutManager); + + dialog.add(panel); + + disclaimerTextArea = new JTextArea(); + disclaimerTextArea.setEditable(false); + disclaimerTextArea.setLineWrap(true); + disclaimerTextArea.setWrapStyleWord(true); + final JScrollPane scrollPane = new JScrollPane(disclaimerTextArea); + panel.add(scrollPane, BorderLayout.CENTER); + scrollPane.setPreferredSize(new Dimension(250, 250)); + + final JButton close = new JButton(Messages.getString("CollectEarthWindow.5")); //$NON-NLS-1$ + close.addActionListener( e -> dialog.setVisible(false) ); + panel.add(close, BorderLayout.SOUTH); + } + + @Override + public void actionPerformed(ActionEvent e) { + disclaimerTextArea.setText(getTextContents()); + dialog.setVisible(true); + } + + private String getTextContents() { + try { + + return FileUtils.readFileToString(new File( filePath ), StandardCharsets.UTF_8); + } catch (final IOException e) { + logger.error(Messages.getString("OpenTextFileListener.0") + filePath.toString(), e); //$NON-NLS-1$ + return Messages.getString("CollectEarthWindow.8"); //$NON-NLS-1$ } - } + } - private static void handleException() { - JOptionPane.showMessageDialog(null, Messages.getString("AboutDialog.6"), Messages.getString("AboutDialog.19"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ - } -} \ No newline at end of file +} From f5ad24e19cd14ecc7f1980a786982748ce0c6a45 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:16 +0100 Subject: [PATCH 0325/1620] New translations OpenTextFileListener.java (English) --- .../earth/app/view/Messages_en.properties | 67 ++++++++++++++++--- 1 file changed, 59 insertions(+), 8 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 06f4b227eb..a3e291cd48 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,21 +1,72 @@ package org.openforis.collect.earth.app.view; +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.net.URI; -import java.net.URISyntaxException; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; -public class OpenSupportForum implements ActionListener { +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; + +import org.apache.commons.io.FileUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class OpenTextFileListener implements ActionListener { + + JDialog dialog; + private final Logger logger = LoggerFactory.getLogger(OpenTextFileListener.class); + JTextArea disclaimerTextArea; + private String filePath; + + public OpenTextFileListener(Frame owner, String filePath, String title) { + + this.filePath = filePath; + dialog = new JDialog(owner, title + " " + filePath); //$NON-NLS-1$ + dialog.setLocationRelativeTo(owner); + dialog.setSize(new Dimension(300, 400)); + dialog.setModal(true); + + final BorderLayout layoutManager = new BorderLayout(); + + final JPanel panel = new JPanel(layoutManager); + + dialog.add(panel); + + disclaimerTextArea = new JTextArea(); + disclaimerTextArea.setEditable(false); + disclaimerTextArea.setLineWrap(true); + disclaimerTextArea.setWrapStyleWord(true); + final JScrollPane scrollPane = new JScrollPane(disclaimerTextArea); + panel.add(scrollPane, BorderLayout.CENTER); + scrollPane.setPreferredSize(new Dimension(250, 250)); + + final JButton close = new JButton(Messages.getString("CollectEarthWindow.5")); //$NON-NLS-1$ + close.addActionListener( e -> dialog.setVisible(false) ); + panel.add(close, BorderLayout.SOUTH); + } @Override public void actionPerformed(ActionEvent e) { + disclaimerTextArea.setText(getTextContents()); + dialog.setVisible(true); + } + + private String getTextContents() { try { - URI uri = new java.net.URI("http://www.openforis.org/support"); //$NON-NLS-1$ - (new LinkRunner(uri)).execute(); - } catch (URISyntaxException use) { - throw new AssertionError(use + ": " + "Open FOris support"); //NOI18N //$NON-NLS-1$ - } + return FileUtils.readFileToString(new File( filePath ), StandardCharsets.UTF_8); + } catch (final IOException e) { + logger.error(Messages.getString("OpenTextFileListener.0") + filePath.toString(), e); //$NON-NLS-1$ + return Messages.getString("CollectEarthWindow.8"); //$NON-NLS-1$ + } } } From e0ac0f185cc38fc5e35d7735f017c9fd7e394d9e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:17 +0100 Subject: [PATCH 0326/1620] New translations ProcessMonitorDialog.java (French) --- .../earth/app/view/Messages_fr.properties | 145 ++++++++++-------- 1 file changed, 81 insertions(+), 64 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index a3e291cd48..aee91325a9 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,72 +1,89 @@ package org.openforis.collect.earth.app.view; -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.Frame; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; - -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; - -import org.apache.commons.io.FileUtils; +import java.awt.Toolkit; +import java.util.List; + +import javax.swing.JOptionPane; +import javax.swing.ProgressMonitor; +import javax.swing.SwingUtilities; + +import org.apache.commons.lang3.ArrayUtils; +import org.openforis.collect.io.data.CSVDataImportProcess; +import org.openforis.collect.io.metadata.parsing.ParsingError; +import org.openforis.collect.manager.process.AbstractProcess; +import org.openforis.collect.manager.process.ProcessStatus; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class OpenTextFileListener implements ActionListener { - - JDialog dialog; - private final Logger logger = LoggerFactory.getLogger(OpenTextFileListener.class); - JTextArea disclaimerTextArea; - private String filePath; - - public OpenTextFileListener(Frame owner, String filePath, String title) { - - this.filePath = filePath; - dialog = new JDialog(owner, title + " " + filePath); //$NON-NLS-1$ - dialog.setLocationRelativeTo(owner); - dialog.setSize(new Dimension(300, 400)); - dialog.setModal(true); - - final BorderLayout layoutManager = new BorderLayout(); - - final JPanel panel = new JPanel(layoutManager); - - dialog.add(panel); - - disclaimerTextArea = new JTextArea(); - disclaimerTextArea.setEditable(false); - disclaimerTextArea.setLineWrap(true); - disclaimerTextArea.setWrapStyleWord(true); - final JScrollPane scrollPane = new JScrollPane(disclaimerTextArea); - panel.add(scrollPane, BorderLayout.CENTER); - scrollPane.setPreferredSize(new Dimension(250, 250)); - - final JButton close = new JButton(Messages.getString("CollectEarthWindow.5")); //$NON-NLS-1$ - close.addActionListener( e -> dialog.setVisible(false) ); - panel.add(close, BorderLayout.SOUTH); - } - - @Override - public void actionPerformed(ActionEvent e) { - disclaimerTextArea.setText(getTextContents()); - dialog.setVisible(true); - } - - private String getTextContents() { - try { - - return FileUtils.readFileToString(new File( filePath ), StandardCharsets.UTF_8); - } catch (final IOException e) { - logger.error(Messages.getString("OpenTextFileListener.0") + filePath.toString(), e); //$NON-NLS-1$ - return Messages.getString("CollectEarthWindow.8"); //$NON-NLS-1$ - } +public abstract class ProcessMonitorDialog extends Thread { + + private static final int MAX_ERRORS_SHOWN = 10; + ProgressMonitor progressMonitor; + Logger logger = LoggerFactory.getLogger(ProcessMonitorDialog.class); + AbstractProcess process; + + + protected abstract String getProcessActionMessage(); + + public synchronized void monitorProgress() { + + new Thread("Monitoring progress of a process") { + @Override + public void run() { + boolean keepRunning = true; + while (keepRunning) { + if (process.getStatus() != null) { + SwingUtilities.invokeLater( () -> { + progressMonitor.setProgress(process.getStatus().getProgressPercent()); + progressMonitor.setNote(getProcessActionMessage() + process.getStatus().getProcessed() + "/" //$NON-NLS-1$ //$NON-NLS-2$ + + process.getStatus().getTotal()); + }); + + if (progressMonitor.isCanceled() || process.getStatus().isComplete() || process.getStatus().isError() ) { + SwingUtilities.invokeLater( () -> { + progressMonitor.close(); + if( process.getStatus().isError() ){ + StringBuilder parsisngErrorMsg = new StringBuilder("\r\n"); //$NON-NLS-1$ + if( process instanceof CSVDataImportProcess ){ + List errors = ((CSVDataImportProcess) process ).getStatus().getErrors(); + + int numberOfErrors = 0; + for (ParsingError parsingError : errors) { + parsisngErrorMsg.append(Messages.getString("ProcessMonitorDialog.1")).append( parsingError.getRow() ).append(" - ").append( parsingError.getMessage() ).append(", ").append( parsingError.getErrorType() ).append(Messages.getString("ProcessMonitorDialog.4")).append( ArrayUtils.toString(parsingError.getColumns()) ).append(Messages.getString("ProcessMonitorDialog.5")).append( ArrayUtils.toString(parsingError.getMessageArgs()) ).append("\r\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ + numberOfErrors ++; + if( numberOfErrors > MAX_ERRORS_SHOWN ){ + break; + } + } + + if( errors.size() > MAX_ERRORS_SHOWN ){ + parsisngErrorMsg.append( "More lines not shown . Total warnings : " + errors.size() ); + } + + } + + String primaryErrorMsg = process.getStatus().getErrorMessage(); + JOptionPane.showMessageDialog(null, "Attention : " + ( primaryErrorMsg!=null?primaryErrorMsg:"") + parsisngErrorMsg.toString() ); //$NON-NLS-1$ //$NON-NLS-2$ + } + }); + Toolkit.getDefaultToolkit().beep(); + if ( !process.getStatus().isComplete() && !process.getStatus().isError() ) { + process.cancel(); + logger.warn("Task canceled.\n"); //$NON-NLS-1$ + } + keepRunning = false; + } + } + + try { + Thread.sleep( 1000 ); + } catch (InterruptedException e) { + logger.error("Error whille waiting in thread", e); //$NON-NLS-1$ + Thread.currentThread().interrupt(); + } + } + } + }.start(); } } From 95b96db63b0a82f1ba502fc815325a662ffbd4dd Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:18 +0100 Subject: [PATCH 0327/1620] New translations ProcessMonitorDialog.java (Spanish) --- .../earth/app/view/Messages_es.properties | 145 ++++++++++-------- 1 file changed, 81 insertions(+), 64 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index a3e291cd48..aee91325a9 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,72 +1,89 @@ package org.openforis.collect.earth.app.view; -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.Frame; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; - -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; - -import org.apache.commons.io.FileUtils; +import java.awt.Toolkit; +import java.util.List; + +import javax.swing.JOptionPane; +import javax.swing.ProgressMonitor; +import javax.swing.SwingUtilities; + +import org.apache.commons.lang3.ArrayUtils; +import org.openforis.collect.io.data.CSVDataImportProcess; +import org.openforis.collect.io.metadata.parsing.ParsingError; +import org.openforis.collect.manager.process.AbstractProcess; +import org.openforis.collect.manager.process.ProcessStatus; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class OpenTextFileListener implements ActionListener { - - JDialog dialog; - private final Logger logger = LoggerFactory.getLogger(OpenTextFileListener.class); - JTextArea disclaimerTextArea; - private String filePath; - - public OpenTextFileListener(Frame owner, String filePath, String title) { - - this.filePath = filePath; - dialog = new JDialog(owner, title + " " + filePath); //$NON-NLS-1$ - dialog.setLocationRelativeTo(owner); - dialog.setSize(new Dimension(300, 400)); - dialog.setModal(true); - - final BorderLayout layoutManager = new BorderLayout(); - - final JPanel panel = new JPanel(layoutManager); - - dialog.add(panel); - - disclaimerTextArea = new JTextArea(); - disclaimerTextArea.setEditable(false); - disclaimerTextArea.setLineWrap(true); - disclaimerTextArea.setWrapStyleWord(true); - final JScrollPane scrollPane = new JScrollPane(disclaimerTextArea); - panel.add(scrollPane, BorderLayout.CENTER); - scrollPane.setPreferredSize(new Dimension(250, 250)); - - final JButton close = new JButton(Messages.getString("CollectEarthWindow.5")); //$NON-NLS-1$ - close.addActionListener( e -> dialog.setVisible(false) ); - panel.add(close, BorderLayout.SOUTH); - } - - @Override - public void actionPerformed(ActionEvent e) { - disclaimerTextArea.setText(getTextContents()); - dialog.setVisible(true); - } - - private String getTextContents() { - try { - - return FileUtils.readFileToString(new File( filePath ), StandardCharsets.UTF_8); - } catch (final IOException e) { - logger.error(Messages.getString("OpenTextFileListener.0") + filePath.toString(), e); //$NON-NLS-1$ - return Messages.getString("CollectEarthWindow.8"); //$NON-NLS-1$ - } +public abstract class ProcessMonitorDialog extends Thread { + + private static final int MAX_ERRORS_SHOWN = 10; + ProgressMonitor progressMonitor; + Logger logger = LoggerFactory.getLogger(ProcessMonitorDialog.class); + AbstractProcess process; + + + protected abstract String getProcessActionMessage(); + + public synchronized void monitorProgress() { + + new Thread("Monitoring progress of a process") { + @Override + public void run() { + boolean keepRunning = true; + while (keepRunning) { + if (process.getStatus() != null) { + SwingUtilities.invokeLater( () -> { + progressMonitor.setProgress(process.getStatus().getProgressPercent()); + progressMonitor.setNote(getProcessActionMessage() + process.getStatus().getProcessed() + "/" //$NON-NLS-1$ //$NON-NLS-2$ + + process.getStatus().getTotal()); + }); + + if (progressMonitor.isCanceled() || process.getStatus().isComplete() || process.getStatus().isError() ) { + SwingUtilities.invokeLater( () -> { + progressMonitor.close(); + if( process.getStatus().isError() ){ + StringBuilder parsisngErrorMsg = new StringBuilder("\r\n"); //$NON-NLS-1$ + if( process instanceof CSVDataImportProcess ){ + List errors = ((CSVDataImportProcess) process ).getStatus().getErrors(); + + int numberOfErrors = 0; + for (ParsingError parsingError : errors) { + parsisngErrorMsg.append(Messages.getString("ProcessMonitorDialog.1")).append( parsingError.getRow() ).append(" - ").append( parsingError.getMessage() ).append(", ").append( parsingError.getErrorType() ).append(Messages.getString("ProcessMonitorDialog.4")).append( ArrayUtils.toString(parsingError.getColumns()) ).append(Messages.getString("ProcessMonitorDialog.5")).append( ArrayUtils.toString(parsingError.getMessageArgs()) ).append("\r\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ + numberOfErrors ++; + if( numberOfErrors > MAX_ERRORS_SHOWN ){ + break; + } + } + + if( errors.size() > MAX_ERRORS_SHOWN ){ + parsisngErrorMsg.append( "More lines not shown . Total warnings : " + errors.size() ); + } + + } + + String primaryErrorMsg = process.getStatus().getErrorMessage(); + JOptionPane.showMessageDialog(null, "Attention : " + ( primaryErrorMsg!=null?primaryErrorMsg:"") + parsisngErrorMsg.toString() ); //$NON-NLS-1$ //$NON-NLS-2$ + } + }); + Toolkit.getDefaultToolkit().beep(); + if ( !process.getStatus().isComplete() && !process.getStatus().isError() ) { + process.cancel(); + logger.warn("Task canceled.\n"); //$NON-NLS-1$ + } + keepRunning = false; + } + } + + try { + Thread.sleep( 1000 ); + } catch (InterruptedException e) { + logger.error("Error whille waiting in thread", e); //$NON-NLS-1$ + Thread.currentThread().interrupt(); + } + } + } + }.start(); } } From cc0eef40b616c3ccea112a64884c31618292d62e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:19 +0100 Subject: [PATCH 0328/1620] New translations ProcessMonitorDialog.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 145 ++++++++++-------- 1 file changed, 81 insertions(+), 64 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index a3e291cd48..aee91325a9 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,72 +1,89 @@ package org.openforis.collect.earth.app.view; -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.Frame; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; - -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; - -import org.apache.commons.io.FileUtils; +import java.awt.Toolkit; +import java.util.List; + +import javax.swing.JOptionPane; +import javax.swing.ProgressMonitor; +import javax.swing.SwingUtilities; + +import org.apache.commons.lang3.ArrayUtils; +import org.openforis.collect.io.data.CSVDataImportProcess; +import org.openforis.collect.io.metadata.parsing.ParsingError; +import org.openforis.collect.manager.process.AbstractProcess; +import org.openforis.collect.manager.process.ProcessStatus; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class OpenTextFileListener implements ActionListener { - - JDialog dialog; - private final Logger logger = LoggerFactory.getLogger(OpenTextFileListener.class); - JTextArea disclaimerTextArea; - private String filePath; - - public OpenTextFileListener(Frame owner, String filePath, String title) { - - this.filePath = filePath; - dialog = new JDialog(owner, title + " " + filePath); //$NON-NLS-1$ - dialog.setLocationRelativeTo(owner); - dialog.setSize(new Dimension(300, 400)); - dialog.setModal(true); - - final BorderLayout layoutManager = new BorderLayout(); - - final JPanel panel = new JPanel(layoutManager); - - dialog.add(panel); - - disclaimerTextArea = new JTextArea(); - disclaimerTextArea.setEditable(false); - disclaimerTextArea.setLineWrap(true); - disclaimerTextArea.setWrapStyleWord(true); - final JScrollPane scrollPane = new JScrollPane(disclaimerTextArea); - panel.add(scrollPane, BorderLayout.CENTER); - scrollPane.setPreferredSize(new Dimension(250, 250)); - - final JButton close = new JButton(Messages.getString("CollectEarthWindow.5")); //$NON-NLS-1$ - close.addActionListener( e -> dialog.setVisible(false) ); - panel.add(close, BorderLayout.SOUTH); - } - - @Override - public void actionPerformed(ActionEvent e) { - disclaimerTextArea.setText(getTextContents()); - dialog.setVisible(true); - } - - private String getTextContents() { - try { - - return FileUtils.readFileToString(new File( filePath ), StandardCharsets.UTF_8); - } catch (final IOException e) { - logger.error(Messages.getString("OpenTextFileListener.0") + filePath.toString(), e); //$NON-NLS-1$ - return Messages.getString("CollectEarthWindow.8"); //$NON-NLS-1$ - } +public abstract class ProcessMonitorDialog extends Thread { + + private static final int MAX_ERRORS_SHOWN = 10; + ProgressMonitor progressMonitor; + Logger logger = LoggerFactory.getLogger(ProcessMonitorDialog.class); + AbstractProcess process; + + + protected abstract String getProcessActionMessage(); + + public synchronized void monitorProgress() { + + new Thread("Monitoring progress of a process") { + @Override + public void run() { + boolean keepRunning = true; + while (keepRunning) { + if (process.getStatus() != null) { + SwingUtilities.invokeLater( () -> { + progressMonitor.setProgress(process.getStatus().getProgressPercent()); + progressMonitor.setNote(getProcessActionMessage() + process.getStatus().getProcessed() + "/" //$NON-NLS-1$ //$NON-NLS-2$ + + process.getStatus().getTotal()); + }); + + if (progressMonitor.isCanceled() || process.getStatus().isComplete() || process.getStatus().isError() ) { + SwingUtilities.invokeLater( () -> { + progressMonitor.close(); + if( process.getStatus().isError() ){ + StringBuilder parsisngErrorMsg = new StringBuilder("\r\n"); //$NON-NLS-1$ + if( process instanceof CSVDataImportProcess ){ + List errors = ((CSVDataImportProcess) process ).getStatus().getErrors(); + + int numberOfErrors = 0; + for (ParsingError parsingError : errors) { + parsisngErrorMsg.append(Messages.getString("ProcessMonitorDialog.1")).append( parsingError.getRow() ).append(" - ").append( parsingError.getMessage() ).append(", ").append( parsingError.getErrorType() ).append(Messages.getString("ProcessMonitorDialog.4")).append( ArrayUtils.toString(parsingError.getColumns()) ).append(Messages.getString("ProcessMonitorDialog.5")).append( ArrayUtils.toString(parsingError.getMessageArgs()) ).append("\r\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ + numberOfErrors ++; + if( numberOfErrors > MAX_ERRORS_SHOWN ){ + break; + } + } + + if( errors.size() > MAX_ERRORS_SHOWN ){ + parsisngErrorMsg.append( "More lines not shown . Total warnings : " + errors.size() ); + } + + } + + String primaryErrorMsg = process.getStatus().getErrorMessage(); + JOptionPane.showMessageDialog(null, "Attention : " + ( primaryErrorMsg!=null?primaryErrorMsg:"") + parsisngErrorMsg.toString() ); //$NON-NLS-1$ //$NON-NLS-2$ + } + }); + Toolkit.getDefaultToolkit().beep(); + if ( !process.getStatus().isComplete() && !process.getStatus().isError() ) { + process.cancel(); + logger.warn("Task canceled.\n"); //$NON-NLS-1$ + } + keepRunning = false; + } + } + + try { + Thread.sleep( 1000 ); + } catch (InterruptedException e) { + logger.error("Error whille waiting in thread", e); //$NON-NLS-1$ + Thread.currentThread().interrupt(); + } + } + } + }.start(); } } From 986ebb4f20b4f98891bb6120d9d98d9afb1a4c1e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:20 +0100 Subject: [PATCH 0329/1620] New translations ProcessMonitorDialog.java (English) --- .../earth/app/view/Messages_en.properties | 145 ++++++++++-------- 1 file changed, 81 insertions(+), 64 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index a3e291cd48..aee91325a9 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,72 +1,89 @@ package org.openforis.collect.earth.app.view; -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.Frame; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; - -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; - -import org.apache.commons.io.FileUtils; +import java.awt.Toolkit; +import java.util.List; + +import javax.swing.JOptionPane; +import javax.swing.ProgressMonitor; +import javax.swing.SwingUtilities; + +import org.apache.commons.lang3.ArrayUtils; +import org.openforis.collect.io.data.CSVDataImportProcess; +import org.openforis.collect.io.metadata.parsing.ParsingError; +import org.openforis.collect.manager.process.AbstractProcess; +import org.openforis.collect.manager.process.ProcessStatus; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class OpenTextFileListener implements ActionListener { - - JDialog dialog; - private final Logger logger = LoggerFactory.getLogger(OpenTextFileListener.class); - JTextArea disclaimerTextArea; - private String filePath; - - public OpenTextFileListener(Frame owner, String filePath, String title) { - - this.filePath = filePath; - dialog = new JDialog(owner, title + " " + filePath); //$NON-NLS-1$ - dialog.setLocationRelativeTo(owner); - dialog.setSize(new Dimension(300, 400)); - dialog.setModal(true); - - final BorderLayout layoutManager = new BorderLayout(); - - final JPanel panel = new JPanel(layoutManager); - - dialog.add(panel); - - disclaimerTextArea = new JTextArea(); - disclaimerTextArea.setEditable(false); - disclaimerTextArea.setLineWrap(true); - disclaimerTextArea.setWrapStyleWord(true); - final JScrollPane scrollPane = new JScrollPane(disclaimerTextArea); - panel.add(scrollPane, BorderLayout.CENTER); - scrollPane.setPreferredSize(new Dimension(250, 250)); - - final JButton close = new JButton(Messages.getString("CollectEarthWindow.5")); //$NON-NLS-1$ - close.addActionListener( e -> dialog.setVisible(false) ); - panel.add(close, BorderLayout.SOUTH); - } - - @Override - public void actionPerformed(ActionEvent e) { - disclaimerTextArea.setText(getTextContents()); - dialog.setVisible(true); - } - - private String getTextContents() { - try { - - return FileUtils.readFileToString(new File( filePath ), StandardCharsets.UTF_8); - } catch (final IOException e) { - logger.error(Messages.getString("OpenTextFileListener.0") + filePath.toString(), e); //$NON-NLS-1$ - return Messages.getString("CollectEarthWindow.8"); //$NON-NLS-1$ - } +public abstract class ProcessMonitorDialog extends Thread { + + private static final int MAX_ERRORS_SHOWN = 10; + ProgressMonitor progressMonitor; + Logger logger = LoggerFactory.getLogger(ProcessMonitorDialog.class); + AbstractProcess process; + + + protected abstract String getProcessActionMessage(); + + public synchronized void monitorProgress() { + + new Thread("Monitoring progress of a process") { + @Override + public void run() { + boolean keepRunning = true; + while (keepRunning) { + if (process.getStatus() != null) { + SwingUtilities.invokeLater( () -> { + progressMonitor.setProgress(process.getStatus().getProgressPercent()); + progressMonitor.setNote(getProcessActionMessage() + process.getStatus().getProcessed() + "/" //$NON-NLS-1$ //$NON-NLS-2$ + + process.getStatus().getTotal()); + }); + + if (progressMonitor.isCanceled() || process.getStatus().isComplete() || process.getStatus().isError() ) { + SwingUtilities.invokeLater( () -> { + progressMonitor.close(); + if( process.getStatus().isError() ){ + StringBuilder parsisngErrorMsg = new StringBuilder("\r\n"); //$NON-NLS-1$ + if( process instanceof CSVDataImportProcess ){ + List errors = ((CSVDataImportProcess) process ).getStatus().getErrors(); + + int numberOfErrors = 0; + for (ParsingError parsingError : errors) { + parsisngErrorMsg.append(Messages.getString("ProcessMonitorDialog.1")).append( parsingError.getRow() ).append(" - ").append( parsingError.getMessage() ).append(", ").append( parsingError.getErrorType() ).append(Messages.getString("ProcessMonitorDialog.4")).append( ArrayUtils.toString(parsingError.getColumns()) ).append(Messages.getString("ProcessMonitorDialog.5")).append( ArrayUtils.toString(parsingError.getMessageArgs()) ).append("\r\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ + numberOfErrors ++; + if( numberOfErrors > MAX_ERRORS_SHOWN ){ + break; + } + } + + if( errors.size() > MAX_ERRORS_SHOWN ){ + parsisngErrorMsg.append( "More lines not shown . Total warnings : " + errors.size() ); + } + + } + + String primaryErrorMsg = process.getStatus().getErrorMessage(); + JOptionPane.showMessageDialog(null, "Attention : " + ( primaryErrorMsg!=null?primaryErrorMsg:"") + parsisngErrorMsg.toString() ); //$NON-NLS-1$ //$NON-NLS-2$ + } + }); + Toolkit.getDefaultToolkit().beep(); + if ( !process.getStatus().isComplete() && !process.getStatus().isError() ) { + process.cancel(); + logger.warn("Task canceled.\n"); //$NON-NLS-1$ + } + keepRunning = false; + } + } + + try { + Thread.sleep( 1000 ); + } catch (InterruptedException e) { + logger.error("Error whille waiting in thread", e); //$NON-NLS-1$ + Thread.currentThread().interrupt(); + } + } + } + }.start(); } } From e31fef2f6fed6868592cd04071d93130620324ff Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:21 +0100 Subject: [PATCH 0330/1620] New translations PropertiesDialog.java (French) --- .../earth/app/view/Messages_fr.properties | 1250 ++++++++++++++++- 1 file changed, 1185 insertions(+), 65 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index aee91325a9..7eb0424502 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,89 +1,1209 @@ package org.openforis.collect.earth.app.view; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.GridLayout; +import java.awt.Insets; import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.io.IOException; +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; import java.util.List; +import javax.swing.AbstractAction; +import javax.swing.AbstractButton; +import javax.swing.ButtonGroup; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; import javax.swing.JOptionPane; -import javax.swing.ProgressMonitor; -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.ArrayUtils; -import org.openforis.collect.io.data.CSVDataImportProcess; -import org.openforis.collect.io.metadata.parsing.ParsingError; -import org.openforis.collect.manager.process.AbstractProcess; -import org.openforis.collect.manager.process.ProcessStatus; +import javax.swing.JPanel; +import javax.swing.JPasswordField; +import javax.swing.JRadioButton; +import javax.swing.JScrollPane; +import javax.swing.JTabbedPane; +import javax.swing.JTextField; +import javax.swing.ListSelectionModel; +import javax.swing.ScrollPaneConstants; +import javax.swing.border.BevelBorder; +import javax.swing.border.Border; +import javax.swing.border.TitledBorder; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; + +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; +import org.openforis.collect.earth.app.EarthConstants.OperationMode; +import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.AnalysisSaikuService; +import org.openforis.collect.earth.app.service.EarthProjectsService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; +import org.openforis.collect.model.CollectSurvey; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public abstract class ProcessMonitorDialog extends Thread { +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ +public class PropertiesDialog extends JDialog { - private static final int MAX_ERRORS_SHOWN = 10; - ProgressMonitor progressMonitor; - Logger logger = LoggerFactory.getLogger(ProcessMonitorDialog.class); - AbstractProcess process; + private static final ComboBoxItem COMBO_BOX_ITEM_CENTRAL_POINT = new ComboBoxItem(1, + Messages.getString("OptionWizard.54")); + private static final ComboBoxItem COMBO_BOX_ITEM_SQUARE = new ComboBoxItem(0, + Messages.getString("OptionWizard.53")); - protected abstract String getProcessActionMessage(); + private static final long serialVersionUID = -6760020609229102842L; - public synchronized void monitorProgress() { + private final HashMap, JComponent[]> propertyToComponent = new HashMap<>(); + private final transient Logger logger = LoggerFactory.getLogger(this.getClass()); - new Thread("Monitoring progress of a process") { - @Override - public void run() { - boolean keepRunning = true; - while (keepRunning) { - if (process.getStatus() != null) { - SwingUtilities.invokeLater( () -> { - progressMonitor.setProgress(process.getStatus().getProgressPercent()); - progressMonitor.setNote(getProcessActionMessage() + process.getStatus().getProcessed() + "/" //$NON-NLS-1$ //$NON-NLS-2$ - + process.getStatus().getTotal()); - }); - - if (progressMonitor.isCanceled() || process.getStatus().isComplete() || process.getStatus().isError() ) { - SwingUtilities.invokeLater( () -> { - progressMonitor.close(); - if( process.getStatus().isError() ){ - StringBuilder parsisngErrorMsg = new StringBuilder("\r\n"); //$NON-NLS-1$ - if( process instanceof CSVDataImportProcess ){ - List errors = ((CSVDataImportProcess) process ).getStatus().getErrors(); - - int numberOfErrors = 0; - for (ParsingError parsingError : errors) { - parsisngErrorMsg.append(Messages.getString("ProcessMonitorDialog.1")).append( parsingError.getRow() ).append(" - ").append( parsingError.getMessage() ).append(", ").append( parsingError.getErrorType() ).append(Messages.getString("ProcessMonitorDialog.4")).append( ArrayUtils.toString(parsingError.getColumns()) ).append(Messages.getString("ProcessMonitorDialog.5")).append( ArrayUtils.toString(parsingError.getMessageArgs()) ).append("\r\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ - numberOfErrors ++; - if( numberOfErrors > MAX_ERRORS_SHOWN ){ - break; - } - } - - if( errors.size() > MAX_ERRORS_SHOWN ){ - parsisngErrorMsg.append( "More lines not shown . Total warnings : " + errors.size() ); - } - - } - - String primaryErrorMsg = process.getStatus().getErrorMessage(); - JOptionPane.showMessageDialog(null, "Attention : " + ( primaryErrorMsg!=null?primaryErrorMsg:"") + parsisngErrorMsg.toString() ); //$NON-NLS-1$ //$NON-NLS-2$ + JPanel postgresPanel; + JPanel sqlitePanel; + + private transient LocalPropertiesService localPropertiesService; + + String backupFolder; + + private transient AnalysisSaikuService saikuService; + + private transient EarthProjectsService projectsService; + + private boolean restartRequired; + + private String oldSelectedDistance; + + private CollectSurvey surveyLoaded; + + private JButton applyChanges; + + public PropertiesDialog(JFrame frame, LocalPropertiesService localPropertiesService, + EarthProjectsService projectsService, String backupFolder, AnalysisSaikuService saikuService, + CollectSurvey surveyLoaded) { + super(frame, Messages.getString("OptionWizard.0")); //$NON-NLS-1$ + this.localPropertiesService = localPropertiesService; + this.projectsService = projectsService; + this.backupFolder = backupFolder; + this.saikuService = saikuService; + this.surveyLoaded = surveyLoaded; + this.setLocationRelativeTo(null); + this.setSize(new Dimension(600, 620)); + this.setModal(true); + this.setResizable(false); + initilizeInputs(); + buildMainPane(); + centreWindow(); + + } + + private void centreWindow() { + Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize(); + int x = (int) ((dimension.getWidth() - getWidth()) / 2); + int y = (int) ((dimension.getHeight() - getHeight()) / 2); + setLocation(x, y); + } + + private void buildMainPane() { + + final JPanel panel = new JPanel(new BorderLayout()); + panel.add(getOptionTabs(), BorderLayout.CENTER); + final JPanel buttonPanel = new JPanel(); + buttonPanel.add(getApplyChangesButton()); + buttonPanel.add(getCancelButton()); + panel.add(buttonPanel, BorderLayout.PAGE_END); + this.add(panel); + + } + + private void enableContainer(Container container, boolean enable) { + final Component[] components = container.getComponents(); + for (final Component component : components) { + component.setEnabled(enable); + if (component instanceof Container) { + enableContainer((Container) component, enable); + } + } + } + + private JComponent getBrowsersOptionsPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + final JPanel browserChooserPanel = new JPanel(); + final Border browserBorder = new TitledBorder(new BevelBorder(BevelBorder.LOWERED), + Messages.getString("OptionWizard.1")); //$NON-NLS-1$ + browserChooserPanel.setBorder(browserBorder); + GridLayout experimentLayout = new GridLayout(0,1); + browserChooserPanel.setLayout( experimentLayout ); + + final ButtonGroup browserChooser = new ButtonGroup(); + final JComponent[] browsers = propertyToComponent.get(EarthProperty.BROWSER_TO_USE); + + for (final JComponent browserRadioButton : browsers) { + browserChooserPanel.add(browserRadioButton); + browserChooser.add((AbstractButton) browserRadioButton); + + ((JRadioButton) browserRadioButton).addActionListener(e -> setRestartRequired(true)); + } + constraints.gridy++; + panel.add(browserChooserPanel, constraints); + + constraints.gridy++; + constraints.gridx = 0; + panel.add(propertyToComponent.get(EarthProperty.SAIKU_SERVER_FOLDER)[0], constraints); + + return panel; + } + + private JComponent getIntegrationsPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + panel.add(propertyToComponent.get(EarthProperty.OPEN_GEE_APP)[0], constraints); + + constraints.gridy++; + panel.add(propertyToComponent.get(EarthProperty.OPEN_BING_MAPS)[0], constraints); + + constraints.gridy++; + panel.add(propertyToComponent.get(EarthProperty.OPEN_EARTH_MAP)[0], constraints); + + + constraints.gridy++; + constraints.gridwidth = 1; + panel.add(propertyToComponent.get(EarthProperty.OPEN_PLANET_MAPS)[0], constraints); + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.PLANET_MAPS_MONHLY)[0], constraints); + + constraints.gridy++; + constraints.gridx = 0; + constraints.gridwidth = 1; + final JLabel label = new JLabel(Messages.getString("OptionWizard.101")); //$NON-NLS-1$ + panel.add(label, constraints); + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.PLANET_MAPS_KEY)[0], constraints); + + constraints.gridx = 0; + constraints.gridy++; + constraints.gridwidth = 2; + panel.add(propertyToComponent.get(EarthProperty.OPEN_MAXAR_SECUREWATCH)[0], constraints); + + constraints.gridy++; + constraints.gridwidth = 1; + final JLabel labelMaxar = new JLabel(Messages.getString("OptionWizard.1021")); //$NON-NLS-1$ + panel.add(labelMaxar, constraints); + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.MAXAR_SECUREWATCH_URL)[0], constraints); + + constraints.gridx = 0; + constraints.gridy++; + constraints.gridwidth = 2; + panel.add(propertyToComponent.get(EarthProperty.OPEN_YANDEX_MAPS)[0], constraints); + + constraints.gridy++; + panel.add(propertyToComponent.get(EarthProperty.OPEN_BAIDU_MAPS)[0], constraints); + + constraints.gridy++; + final JLabel label2 = new JLabel(Messages.getString("OptionWizard.103")); //$NON-NLS-1$ + panel.add(label2, constraints); + constraints.gridy++; + panel.add(propertyToComponent.get(EarthProperty.EXTRA_MAP_URL)[0], constraints); + + constraints.gridy++; + constraints.gridx = 0; + constraints.gridwidth = 2; + panel.add(propertyToComponent.get(EarthProperty.OPEN_GEE_CODE_EDITOR)[0], constraints); + + + return panel; + } + + + private Component getApplyChangesButton() { + if (applyChanges == null) { + applyChanges = new JButton(Messages.getString("OptionWizard.15")); + applyChanges.addActionListener( + new ApplyOptionChangesListener(this, localPropertiesService, propertyToComponent) { + @Override + protected void applyProperties() { + new Thread("Applying properties dialog") { + @Override + public void run() { + savePropertyValues(); + if (isRestartRequired()) { + + restartEarth(); + } else { + EarthApp.executeKmlLoadAsynchronously(PropertiesDialog.this); } - }); - Toolkit.getDefaultToolkit().beep(); - if ( !process.getStatus().isComplete() && !process.getStatus().isError() ) { - process.cancel(); - logger.warn("Task canceled.\n"); //$NON-NLS-1$ - } - keepRunning = false; + } + }.start(); } - } + }); + } + return applyChanges; + } + + public void closeDialog() { + this.dispose(); + } + + private Component getCancelButton() { + final JButton cancelButton = new JButton(Messages.getString("OptionWizard.24")); //$NON-NLS-1$ + cancelButton.addActionListener( e -> PropertiesDialog.this.dispose() ); + return cancelButton; + } + + private JComponent getOperationModePanel() { + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + final JPanel typeOfUsePanel = new JPanel(new GridBagLayout()); + final Border border = new TitledBorder(new BevelBorder(BevelBorder.LOWERED), + Messages.getString("OptionWizard.2")); //$NON-NLS-1$ + typeOfUsePanel.setBorder(border); + + JPanel serverPanel = getServerPanel(); + typeOfUsePanel.add(serverPanel, constraints); + + return typeOfUsePanel; + } + + private void enableDBOptions(boolean isPostgreDb) { + enableContainer(postgresPanel, isPostgreDb); + enableContainer(sqlitePanel, !isPostgreDb); + } + + private ActionListener getDbTypeListener() { + return e -> { + final JRadioButton theJRB = (JRadioButton) e.getSource(); + + boolean isPostgreDb = theJRB.getName().equals(CollectDBDriver.POSTGRESQL.name()); + enableDBOptions(isPostgreDb); + }; + } + + private JTabbedPane getOptionTabs() { + final JTabbedPane tabbedPane = new JTabbedPane(); + tabbedPane.setSize(550, 300); + final JComponent panel1 = getSampleDataPanel(); + tabbedPane.addTab(Messages.getString("OptionWizard.31"), panel1); //$NON-NLS-1$ + + final JComponent panel2 = getPlotOptionsPanel(); + tabbedPane.addTab(Messages.getString("OptionWizard.32"), panel2); //$NON-NLS-1$ + + final JComponent panel3 = getSurveyDefinitonPanel(); + tabbedPane.addTab(Messages.getString("OptionWizard.33"), panel3); //$NON-NLS-1$ + + final JComponent panel41 = getIntegrationsPanel(); + tabbedPane.addTab(Messages.getString("OptionWizard.34"), panel41); //$NON-NLS-1$ + + final JComponent panel4 = getBrowsersOptionsPanel(); + tabbedPane.addTab(Messages.getString("OptionWizard.104"), panel4); //$NON-NLS-1$ + + final JComponent panel5 = getOperationModePanelScroll(); + tabbedPane.addTab(Messages.getString("OptionWizard.25"), panel5); //$NON-NLS-1$ + + final JComponent panel6 = getProjectsPanelScroll(); + tabbedPane.addTab(Messages.getString("OptionWizard.40"), panel6); //$NON-NLS-1$ + + return tabbedPane; + } + + private JComponent getProjectsPanelScroll() { + final JComponent projectsPanel = getProjectsPanel(); + return new JScrollPane(projectsPanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + } + private JComponent getProjectsPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.fill = GridBagConstraints.BOTH; + + JButton importNewButton = new JButton(Messages.getString("OptionWizard.41")); //$NON-NLS-1$ + importNewButton.addActionListener(new ApplyOptionChangesListener(this, localPropertiesService) { + + @Override + protected void applyProperties() { + final File[] selectedProjectFile = JFileChooserExistsAware.getFileChooserResults( + DataFormat.PROJECT_DEFINITION_FILE, false, false, null, localPropertiesService, + (JFrame) PropertiesDialog.this.getParent()); + + if (selectedProjectFile != null && selectedProjectFile.length == 1) { try { - Thread.sleep( 1000 ); - } catch (InterruptedException e) { - logger.error("Error whille waiting in thread", e); //$NON-NLS-1$ - Thread.currentThread().interrupt(); + projectsService.loadCompressedProjectFile(selectedProjectFile[0]); + restartEarth(); + } catch (Exception e1) { + JOptionPane.showMessageDialog(PropertiesDialog.this, e1.getMessage(), + Messages.getString("OptionWizard.51"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + logger.error("Error importing project file " + selectedProjectFile[0].getAbsolutePath(), e1); //$NON-NLS-1$ } + + } + } + }); + + panel.add(importNewButton, constraints); + + final JPanel typeOfDbPanel = new JPanel(new GridBagLayout()); + final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), + Messages.getString("OptionWizard.57")); //$NON-NLS-1$ + typeOfDbPanel.setBorder(border); + + constraints.gridx = 0; + constraints.gridy = 1; + panel.add(typeOfDbPanel, constraints); + + List listOfProjectsByName = new ArrayList<>(); + listOfProjectsByName.addAll(projectsService.getProjectList().keySet()); + Collections.sort(listOfProjectsByName); + final JList listOfProjects = new JList<>(listOfProjectsByName.toArray(new String[0])); // data has type Object[] + listOfProjects.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + listOfProjects.setLayoutOrientation(JList.VERTICAL); + listOfProjects.setVisibleRowCount(-1); + + JScrollPane listScroller = new JScrollPane(listOfProjects); + listScroller.setPreferredSize(new Dimension(250, 300)); + + constraints.gridy = 0; + constraints.gridx = GridBagConstraints.RELATIVE; + typeOfDbPanel.add(listScroller, constraints); + + final JButton openProject = new JButton(Messages.getString("OptionWizard.56")); //$NON-NLS-1$ + openProject.setEnabled(false); + openProject.addActionListener(new ApplyOptionChangesListener(this, localPropertiesService) { + + @Override + protected void applyProperties() { + + File projectFolder = projectsService.getProjectList().get(listOfProjects.getSelectedValue()); + + try { + projectsService.loadProjectInFolder(projectFolder); + restartEarth(); + } catch (Exception e1) { + JOptionPane.showMessageDialog(PropertiesDialog.this, e1.getMessage(), + Messages.getString("OptionWizard.55"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + logger.error("Error importing project folder " + projectFolder.getAbsolutePath(), e1); //$NON-NLS-1$ + } + + } + + }); + + listOfProjects.addListSelectionListener(e -> openProject.setEnabled(listOfProjects.getSelectedValue() != null) ); + + typeOfDbPanel.add(openProject); + + return panel; + } + + private JScrollPane getOperationModePanelScroll() { + final JComponent operationModePanel = getOperationModePanel(); + return new JScrollPane(operationModePanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + } + + private JComponent getPlotOptionsPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.fill = GridBagConstraints.HORIZONTAL; + + JLabel label = new JLabel("Plot shape"); + panel.add(label, constraints); + + constraints.gridx = 1; + JComboBox plotShape = (JComboBox) propertyToComponent.get(EarthProperty.SAMPLE_SHAPE)[0]; + panel.add(plotShape, constraints); + + constraints.gridx = 0; + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.35")); //$NON-NLS-1$ + panel.add(label, constraints); + + constraints.gridx = 1; + JComboBox numberPoints = (JComboBox) propertyToComponent + .get(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT)[0]; + panel.add(numberPoints, constraints); + + constraints.gridx = 0; + constraints.gridy++; + JLabel distanceOrRadiuslabel = new JLabel(Messages.getString("OptionWizard.36")); //$NON-NLS-1$ + panel.add(distanceOrRadiuslabel, constraints); + + constraints.gridx = 1; + JComboBox distanceBetweenPoints = (JComboBox) propertyToComponent + .get(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS)[0]; + panel.add(new JScrollPane(distanceBetweenPoints), constraints); + + constraints.gridx = 0; + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.37")); //$NON-NLS-1$ + panel.add(label, constraints); + constraints.gridx = 1; + JComboBox distanceToFrame = (JComboBox) propertyToComponent + .get(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES)[0]; + panel.add(new JScrollPane(distanceToFrame), constraints); + + constraints.gridx = 0; + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.95")); //$NON-NLS-1$ + panel.add(label, constraints); + constraints.gridx = 1; + JComboBox dotsSide = (JComboBox) propertyToComponent.get(EarthProperty.INNER_SUBPLOT_SIDE)[0]; + panel.add(new JScrollPane(dotsSide), constraints); + + constraints.gridx = 0; + constraints.gridy++; + label = new JLabel("Central plot side"); //$NON-NLS-1$ + panel.add(label, constraints); + constraints.gridx = 1; + JComboBox largeCentralPlotSide = (JComboBox) propertyToComponent.get(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)[0]; + panel.add(new JScrollPane(largeCentralPlotSide), constraints); + + + + constraints.gridx = 0; + constraints.gridy++; + label = new JLabel("Distance between plots in cluster"); + panel.add(label, constraints); + constraints.gridx = 1; + JComboBox plotDistanceInCluster = (JComboBox) propertyToComponent + .get(EarthProperty.DISTANCE_BETWEEN_PLOTS)[0]; + panel.add(new JScrollPane(plotDistanceInCluster), constraints); + + constraints.gridx = 0; + constraints.gridy++; + JLabel area = new JLabel( + "Area (hectares) : " + calculateArea(numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide)); + panel.add(area, constraints); + + ActionListener calculateAreas = actionPerformed -> area.setText("Area (hectares) : " + calculateArea(numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide)); + + plotShape.addActionListener( e-> + handleVisibilityPlotLayout(plotShape, numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide, + plotDistanceInCluster, area, distanceOrRadiuslabel, largeCentralPlotSide) + ); + + numberPoints.addActionListener(calculateAreas); + distanceBetweenPoints.addActionListener(calculateAreas); + distanceToFrame.addActionListener(calculateAreas); + + handleVisibilityPlotLayout(plotShape, numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide, + plotDistanceInCluster, area, distanceOrRadiuslabel, largeCentralPlotSide); + + return panel; + } + + public void handleVisibilityPlotLayout(JComboBox plotShape, JComboBox numberPoints, JComboBox distanceBetweenPoints, + JComboBox distanceToFrame, JComboBox dotsSide, JComboBox distanceBetweenPlots, JLabel area, + JLabel distanceOrRadiuslabel, JComboBox largeCentralPlotSide ) { + numberPoints.setEnabled(false); + distanceBetweenPoints.setEnabled(false); + distanceToFrame.setEnabled(false); + dotsSide.setEnabled(false); + area.setVisible(false); + distanceBetweenPlots.setVisible(false); + distanceBetweenPlots.setEnabled(false); + largeCentralPlotSide.setVisible( false ); + largeCentralPlotSide.setEnabled(false); + + if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE) || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE_WITH_LARGE_CENTRAL_PLOT) ) { + numberPoints.setEnabled(true); + distanceBetweenPoints.setEnabled(true); + distanceToFrame.setEnabled(true); + dotsSide.setEnabled(true); + area.setVisible(true); + distanceOrRadiuslabel.setText(Messages.getString("OptionWizard.36")); + + if( plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE_WITH_LARGE_CENTRAL_PLOT) ) { + largeCentralPlotSide.setVisible( true ); + largeCentralPlotSide.setEnabled(true); + } + + } else if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.CIRCLE) + || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.HEXAGON)) { + distanceBetweenPoints.setEnabled(true); + dotsSide.setEnabled(true); + numberPoints.setEnabled(true); + distanceOrRadiuslabel.setText("Radius"); + } else if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.NFI_THREE_CIRCLES) || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.NFI_FOUR_CIRCLES)) { + dotsSide.setEnabled(true); + distanceBetweenPoints.setEnabled(true); + distanceBetweenPlots.setVisible(true); + distanceBetweenPlots.setEnabled(true); + distanceOrRadiuslabel.setText("Radius of the plots"); + } + } + + private String calculateArea(JComboBox numberOfPoints, JComboBox distanceBetweenPoints, JComboBox distanceToFrame, JComboBox dotsSide) { + double side = 0; + try { + int numberOfPointsI = ((ComboBoxItem) numberOfPoints.getSelectedItem()).getNumberOfPoints(); + int distanceBetweenPointsI = Integer.parseInt((String) distanceBetweenPoints.getSelectedItem()); + int distanceToFrameI = Integer.parseInt((String) distanceToFrame.getSelectedItem()); + + if (numberOfPointsI == 0 || numberOfPointsI == 1) { + + side = 2d * distanceToFrameI; + if (oldSelectedDistance == null) { + oldSelectedDistance = (String) distanceBetweenPoints.getSelectedItem(); + distanceBetweenPoints.setEnabled(false); + } + distanceBetweenPoints.setSelectedItem("0"); + + if (numberOfPointsI == 0) { + dotsSide.setEnabled(false); + } else if (numberOfPointsI == 1) { + dotsSide.setEnabled(true); + } + + } else { + if (oldSelectedDistance != null) { + distanceBetweenPoints.setSelectedItem(oldSelectedDistance); + oldSelectedDistance = null; + } + + distanceBetweenPoints.setEnabled(true); + distanceToFrame.setEnabled(true); + dotsSide.setEnabled(true); + + double pointsByLines = Math.sqrt(numberOfPointsI); + side = 2d * distanceToFrameI + (pointsByLines - 1) * distanceBetweenPointsI; + + } + + } catch (RuntimeException e) { + logger.error("Error calculating area of the plot", e); + } + + DecimalFormat df = new DecimalFormat("###.##"); + return df.format(side * side / 10000d); + } + + private JPanel getPostgreSqlPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), + Messages.getString("OptionWizard.6")); //$NON-NLS-1$ + panel.setBorder(border); + + JLabel label = new JLabel(Messages.getString("OptionWizard.7")); //$NON-NLS-1$ + constraints.gridx = 0; + panel.add(label, constraints); + + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.DB_USERNAME)[0], constraints); + + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.8")); //$NON-NLS-1$ + constraints.gridx = 0; + panel.add(label, constraints); + + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.DB_PASSWORD)[0], constraints); + + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.9")); //$NON-NLS-1$ + constraints.gridx = 0; + panel.add(label, constraints); + + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.DB_NAME)[0], constraints); + + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.26")); //$NON-NLS-1$ + constraints.gridx = 0; + panel.add(label, constraints); + + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.DB_HOST)[0], constraints); + + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.29")); //$NON-NLS-1$ + constraints.gridx = 0; + panel.add(label, constraints); + + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.DB_PORT)[0], constraints); + + constraints.gridx = 2; + panel.add(new JLabel("Default: 5432"), constraints); + + constraints.gridy++; + constraints.gridx = 1; + JButton button = new JButton("Test Connection"); //$NON-NLS-1$ + button.addActionListener( e-> { + String host = ((JTextField) (propertyToComponent.get(EarthProperty.DB_HOST)[0])).getText(); + String port = ((JTextField) (propertyToComponent.get(EarthProperty.DB_PORT)[0])).getText(); + String dbName = ((JTextField) (propertyToComponent.get(EarthProperty.DB_NAME)[0])).getText(); + String username = ((JTextField) (propertyToComponent.get(EarthProperty.DB_USERNAME)[0])).getText(); + String password = ((JTextField) (propertyToComponent.get(EarthProperty.DB_PASSWORD)[0])).getText(); + + String message = CollectEarthUtils.testPostgreSQLConnection(host, port, dbName, username, password); + JOptionPane.showMessageDialog(PropertiesDialog.this.getOwner(), message, "PostgreSQL Connection test", + JOptionPane.INFORMATION_MESSAGE); + }); + panel.add(button, constraints); + + return panel; + } + + private JPanel getSqlLitePanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), + Messages.getString("OptionWizard.30")); //$NON-NLS-1$ + panel.setBorder(border); + + panel.add(propertyToComponent.get(EarthProperty.AUTOMATIC_BACKUP)[0], constraints); + constraints.gridx++; + panel.add(getOpenBackupFolderButton()); + return panel; + } + + private JComponent getSampleDataPanel() { + final JPlotCsvTable samplePlots = new JPlotCsvTable(localPropertiesService.getValue(EarthProperty.SAMPLE_FILE), + surveyLoaded); + + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.fill = GridBagConstraints.BOTH; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + + final JFilePicker refreshTableOnFileChange = getFilePickerSamplePlots(samplePlots); + + panel.add(refreshTableOnFileChange, constraints); + + samplePlots.setFillsViewportHeight(true); + constraints.gridy = 1; + + constraints.weightx = 1.0; + constraints.weighty = 1.0; + constraints.gridwidth = GridBagConstraints.REMAINDER; + constraints.gridheight = GridBagConstraints.REMAINDER; + + samplePlots.setPreferredScrollableViewportSize(samplePlots.getPreferredSize()); + + panel.add(new JScrollPane(samplePlots, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, + ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), constraints); + + return panel; + } + + private JFilePicker getFilePickerSamplePlots(final JPlotCsvTable samplePlots) { + final JFilePicker refreshTableOnFileChange = (JFilePicker) (propertyToComponent + .get(EarthProperty.SAMPLE_FILE)[0]); + refreshTableOnFileChange.addChangeListener(new DocumentListener() { + + @Override + public void changedUpdate(DocumentEvent e) { + // Do not react + } + + @Override + public void insertUpdate(DocumentEvent e) { + refreshTable(); + } + + @Override + public void removeUpdate(DocumentEvent e) { + // Do not react + } + + private void refreshTable() { + samplePlots.refreshTable(refreshTableOnFileChange.getSelectedFilePath()); + + // Do not let the user save the changes if the sample data is wrong!!! + getApplyChangesButton().setEnabled(samplePlots.isDataValid()); + } + }); + return refreshTableOnFileChange; + } + + private JPanel getServerPanel() { + + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + final JPanel typeOfDbPanel = new JPanel(new GridBagLayout()); + final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), + Messages.getString("OptionWizard.3")); //$NON-NLS-1$ + typeOfDbPanel.setBorder(border); + + JLabel label = new JLabel(Messages.getString("OptionWizard.4") + CollectEarthUtils.getComputerIp()); //$NON-NLS-1$ + typeOfDbPanel.add(label, constraints); + constraints.gridy++; + + label = new JLabel(Messages.getString("OptionWizard.5")); //$NON-NLS-1$ + constraints.gridx = 0; + typeOfDbPanel.add(label, constraints); + + constraints.gridx = 1; + typeOfDbPanel.add(propertyToComponent.get(EarthProperty.HOST_PORT_KEY)[0], constraints); + + constraints.gridwidth = GridBagConstraints.REMAINDER; + constraints.gridy++; + constraints.gridx = 0; + + final ButtonGroup bg = new ButtonGroup(); + final JComponent[] dbTypes = propertyToComponent.get(EarthProperty.DB_DRIVER); + + postgresPanel = getPostgreSqlPanel(); + sqlitePanel = getSqlLitePanel(); + + boolean usingPostgreSQL = localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.POSTGRESQL); + enableDBOptions(usingPostgreSQL); + + for (final JComponent typeRadioButton : dbTypes) { + final JRadioButton dbTypeButton = (JRadioButton) typeRadioButton; + bg.add(dbTypeButton); + typeOfDbPanel.add(dbTypeButton, constraints); + constraints.gridy++; + + dbTypeButton.addActionListener(getDbTypeListener()); + dbTypeButton.addActionListener(e -> setRestartRequired(true)); + + if (dbTypeButton.getName().equals(EarthConstants.CollectDBDriver.POSTGRESQL.name())) { + typeOfDbPanel.add(postgresPanel, constraints); + constraints.gridy++; + + } else { + typeOfDbPanel.add(sqlitePanel, constraints); + constraints.gridy++; + } + } + return typeOfDbPanel; + } + + private Component getOpenBackupFolderButton() { + + AbstractAction backupAction = new AbstractAction(Messages.getString("OptionWizard.10")) { //$NON-NLS-1$ + + private static final long serialVersionUID = 1L; + + @Override + public void actionPerformed(ActionEvent e) { + try { + + CollectEarthUtils.openFolderInExplorer(backupFolder); + + } catch (final IOException e1) { + logger.error("Error when opening the explorer window to visualize backups", e1); //$NON-NLS-1$ } } - }.start(); + + }; + + return new JButton(backupAction); + + } + + private JComponent getSurveyDefinitonPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.fill = GridBagConstraints.HORIZONTAL; + constraints.gridwidth = 2; + panel.add(propertyToComponent.get(EarthProperty.OPEN_BALLOON_IN_BROWSER)[0], constraints); + + constraints.gridy++; + constraints.gridwidth = 1; + final JLabel label = new JLabel(Messages.getString("OptionWizard.43")); //$NON-NLS-1$ + panel.add(label, constraints); + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.SURVEY_NAME)[0], constraints); + + constraints.gridy++; + constraints.gridwidth = GridBagConstraints.REMAINDER; + constraints.gridx = 0; + panel.add(propertyToComponent.get(EarthProperty.KML_TEMPLATE_KEY)[0], constraints); + + constraints.gridy++; + constraints.gridx = 0; + panel.add(propertyToComponent.get(EarthProperty.BALLOON_TEMPLATE_KEY)[0], constraints); + + constraints.gridy++; + constraints.gridx = 0; + + panel.add(propertyToComponent.get(EarthProperty.METADATA_FILE)[0], constraints); + + return panel; + } + + private void initilizeInputs() { + + final JCheckBox backupCheckbox = new JCheckBox(Messages.getString("OptionWizard.44")); //$NON-NLS-1$ + backupCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.AUTOMATIC_BACKUP))); + propertyToComponent.put(EarthProperty.AUTOMATIC_BACKUP, new JComponent[] { backupCheckbox }); + + final JCheckBox openEarthEngineCheckbox = new JCheckBox(Messages.getString("OptionWizard.45")); //$NON-NLS-1$ + openEarthEngineCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_EXPLORER))); + propertyToComponent.put(EarthProperty.OPEN_GEE_EXPLORER, new JComponent[] { openEarthEngineCheckbox }); + + final JCheckBox openGEEAppCheckbox = new JCheckBox("Google Earth Engine APP (no sign-in)"); //$NON-NLS-1$ + openGEEAppCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_APP))); + propertyToComponent.put(EarthProperty.OPEN_GEE_APP, new JComponent[] { openGEEAppCheckbox }); + + final JCheckBox openTimelapseCheckbox = new JCheckBox(Messages.getString("OptionWizard.46")); //$NON-NLS-1$ + openTimelapseCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_TIMELAPSE))); + propertyToComponent.put(EarthProperty.OPEN_TIMELAPSE, new JComponent[] { openTimelapseCheckbox }); + + final JCheckBox openEarthMapCheckbox = new JCheckBox(Messages.getString("OptionWizard.105")); //$NON-NLS-1$ + openEarthMapCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_EARTH_MAP))); + propertyToComponent.put(EarthProperty.OPEN_EARTH_MAP, new JComponent[] { openEarthMapCheckbox }); + + final JCheckBox openBingCheckbox = new JCheckBox(Messages.getString("OptionWizard.47")); //$NON-NLS-1$ + openBingCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BING_MAPS))); + propertyToComponent.put(EarthProperty.OPEN_BING_MAPS, new JComponent[] { openBingCheckbox }); + + final JCheckBox openPlanetCheckbox = new JCheckBox(Messages.getString("OptionWizard.100")); //$NON-NLS-1$ + openPlanetCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_PLANET_MAPS))); + propertyToComponent.put(EarthProperty.OPEN_PLANET_MAPS, new JComponent[] { openPlanetCheckbox }); + + final JCheckBox openMonthlyNICFICheckbox = new JCheckBox(Messages.getString("OptionWizard.110")); //$NON-NLS-1$ + openMonthlyNICFICheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.PLANET_MAPS_MONHLY))); + propertyToComponent.put(EarthProperty.PLANET_MAPS_MONHLY, new JComponent[] { openMonthlyNICFICheckbox }); + + + final JPasswordField planetAPIKeyTextField = new JPasswordField( + localPropertiesService.getValue(EarthProperty.PLANET_MAPS_KEY)); + planetAPIKeyTextField.setMinimumSize(new Dimension( 250, 20 )); + planetAPIKeyTextField.setEnabled( localPropertiesService.isPlanetMapsSupported() ); + propertyToComponent.put(EarthProperty.PLANET_MAPS_KEY, new JComponent[] { planetAPIKeyTextField }); + + openMonthlyNICFICheckbox.setEnabled( openPlanetCheckbox.isSelected() ); + planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ); + + openPlanetCheckbox.addActionListener( e-> { + planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ); + openMonthlyNICFICheckbox.setEnabled( openPlanetCheckbox.isSelected() ); + }); + openMonthlyNICFICheckbox.addActionListener( e-> planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ) ); + + + final JCheckBox openSecureWatchCheckbox = new JCheckBox(Messages.getString("OptionWizard.102")); //$NON-NLS-1$ + openSecureWatchCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_MAXAR_SECUREWATCH))); + propertyToComponent.put(EarthProperty.OPEN_MAXAR_SECUREWATCH, new JComponent[] { openSecureWatchCheckbox }); + + final JTextField secureWatchUrlTextField = new JTextField( + localPropertiesService.getValue(EarthProperty.MAXAR_SECUREWATCH_URL)); + secureWatchUrlTextField.setMinimumSize(new Dimension( 250, 20 )); + propertyToComponent.put(EarthProperty.MAXAR_SECUREWATCH_URL, new JComponent[] { secureWatchUrlTextField }); + secureWatchUrlTextField.setEnabled( localPropertiesService.isSecureWatchSupported() ); + propertyToComponent.put(EarthProperty.MAXAR_SECUREWATCH_URL, new JComponent[] { secureWatchUrlTextField }); + openSecureWatchCheckbox.addActionListener( e -> secureWatchUrlTextField.setEnabled( openSecureWatchCheckbox.isSelected() ) ); + + final JTextField extraUrlTextField = new JTextField( + localPropertiesService.getValue(EarthProperty.EXTRA_MAP_URL)); + extraUrlTextField.setMinimumSize(new Dimension( 250, 20 )); + propertyToComponent.put(EarthProperty.EXTRA_MAP_URL, new JComponent[] { extraUrlTextField }); + + final JCheckBox openBaiduCheckbox = new JCheckBox("Open Baidu Maps"); + openBaiduCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BAIDU_MAPS))); + propertyToComponent.put(EarthProperty.OPEN_BAIDU_MAPS, new JComponent[] { openBaiduCheckbox }); + + final JCheckBox openYandexCheckbox = new JCheckBox("Open Yandex maps for the plot area"); + openYandexCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_YANDEX_MAPS))); + propertyToComponent.put(EarthProperty.OPEN_YANDEX_MAPS, new JComponent[] { openYandexCheckbox }); + + final JCheckBox openHereCheckbox = new JCheckBox(Messages.getString("OptionWizard.59")); //$NON-NLS-1$ + openHereCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_HERE_MAPS))); + propertyToComponent.put(EarthProperty.OPEN_HERE_MAPS, new JComponent[] { openHereCheckbox }); + + final JCheckBox openGeePlaygroundCheckbox = new JCheckBox(Messages.getString("OptionWizard.58")); //$NON-NLS-1$ + openGeePlaygroundCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_CODE_EDITOR))); + propertyToComponent.put(EarthProperty.OPEN_GEE_CODE_EDITOR, new JComponent[] { openGeePlaygroundCheckbox }); + + final JCheckBox openInSeparateWindowCheckbox = new JCheckBox(Messages.getString("OptionWizard.48")); //$NON-NLS-1$ + openInSeparateWindowCheckbox.setSelected( + Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BALLOON_IN_BROWSER))); + propertyToComponent.put(EarthProperty.OPEN_BALLOON_IN_BROWSER, + new JComponent[] { openInSeparateWindowCheckbox }); + + final JFilePicker csvWithPlotData = new JFilePicker(Messages.getString("OptionWizard.49"), //$NON-NLS-1$ + localPropertiesService.getValue(EarthProperty.SAMPLE_FILE), Messages.getString("OptionWizard.50"), DlgMode.MODE_OPEN); // $NON-NLS-1$ + + csvWithPlotData.addFileTypeFilter(".csv,.ced", Messages.getString("OptionWizard.52"), true); //$NON-NLS-1$ //$NON-NLS-2$ + propertyToComponent.put(EarthProperty.SAMPLE_FILE, new JComponent[] { csvWithPlotData }); + + final JComboBox plotShape = new JComboBox<>(SAMPLE_SHAPE.values()); + try { + plotShape.setSelectedItem(SAMPLE_SHAPE.valueOf(localPropertiesService.getValue(EarthProperty.SAMPLE_SHAPE))); + } catch (Exception e1) { + logger.error("The selected shape type is not supported " + localPropertiesService.getValue(EarthProperty.SAMPLE_SHAPE), e1 ); + } + propertyToComponent.put(EarthProperty.SAMPLE_SHAPE, new JComponent[] { plotShape }); + + final JComboBox comboNumberOfPoints = new JComboBox<>( + new ComboBoxItem[] { COMBO_BOX_ITEM_SQUARE, COMBO_BOX_ITEM_CENTRAL_POINT, new ComboBoxItem(4, "2x2"), //$NON-NLS-1$ //$NON-NLS-2$ + // //$NON-NLS-3$ + new ComboBoxItem(9, "3x3"), new ComboBoxItem(16, "4x4"), new ComboBoxItem(25, "5x5"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + new ComboBoxItem(36, "6x6"), //$NON-NLS-1$ + new ComboBoxItem(49, "7x7") }); //$NON-NLS-1$ + if( StringUtils.isNotBlank( localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT) ) ){ + try { + comboNumberOfPoints.setSelectedItem(new ComboBoxItem( + Integer.parseInt(localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT)), + "")); //$NON-NLS-1$ + } catch (NumberFormatException e1) { + logger.error("This should be a number {}", localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT), e1); + } + } + propertyToComponent.put(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT, + new JComponent[] { comboNumberOfPoints }); + + final String[] listOfNumbers = new String[1500]; + final String[] listOfNumbersFromTwo = new String[1500]; + + for (int index = 0; index < listOfNumbers.length; index++) { + listOfNumbers[index] = Integer.toString( index ); //$NON-NLS-1$ + listOfNumbersFromTwo[index] = Integer.toString( index + 2 ); //$NON-NLS-1$ + } + + final JComboBox listOfDistanceBetweenPoints = new JComboBox<>(listOfNumbersFromTwo); + listOfDistanceBetweenPoints + .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS)); + listOfDistanceBetweenPoints.setAutoscrolls(true); + + propertyToComponent.put(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS, + new JComponent[] { listOfDistanceBetweenPoints }); + + final JComboBox listOfDistanceBetweenPlots = new JComboBox<>(listOfNumbersFromTwo); + listOfDistanceBetweenPlots + .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS)); + listOfDistanceBetweenPlots.setAutoscrolls(true); + + propertyToComponent.put(EarthProperty.DISTANCE_BETWEEN_PLOTS, new JComponent[] { listOfDistanceBetweenPlots }); + + final JComboBox listOfDistanceToBorder = new JComboBox<>(listOfNumbers); + listOfDistanceToBorder + .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES)); + listOfDistanceToBorder.setAutoscrolls(true); + + propertyToComponent.put(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES, new JComponent[] { listOfDistanceToBorder }); + + final JComboBox listOfSizeofSamplingDot = new JComboBox<>(listOfNumbersFromTwo); + listOfSizeofSamplingDot.setSelectedItem(localPropertiesService.getValue(EarthProperty.INNER_SUBPLOT_SIDE)); + listOfSizeofSamplingDot.setAutoscrolls(true); + + propertyToComponent.put(EarthProperty.INNER_SUBPLOT_SIDE, new JComponent[] { listOfSizeofSamplingDot }); + + final JComboBox listOfSideOflargeCentralPlot = new JComboBox<>(listOfNumbersFromTwo); + listOfSideOflargeCentralPlot.setSelectedItem(localPropertiesService.getValue(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)); + listOfSideOflargeCentralPlot.setAutoscrolls(true); + + propertyToComponent.put(EarthProperty.LARGE_CENTRAL_PLOT_SIDE, new JComponent[] { listOfSideOflargeCentralPlot }); + + + final JRadioButton chromeChooser = new JRadioButton("Chrome"); //$NON-NLS-1$ + chromeChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() + .equals(EarthConstants.CHROME_BROWSER)); + chromeChooser.setName(EarthConstants.CHROME_BROWSER); + + final JRadioButton firefoxChooser = new JRadioButton("Firefox"); //$NON-NLS-1$ + firefoxChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() + .equals(EarthConstants.FIREFOX_BROWSER)); + firefoxChooser.setName(EarthConstants.FIREFOX_BROWSER); + + final JRadioButton edgeChooser = new JRadioButton("Edge"); //$NON-NLS-1$ + edgeChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() + .equals(EarthConstants.EDGE_BROWSER)); + edgeChooser.setName(EarthConstants.EDGE_BROWSER); + + propertyToComponent.put(EarthProperty.BROWSER_TO_USE, new JComponent[] { firefoxChooser, chromeChooser, edgeChooser}); + final JFilePicker saikuPath = new JFilePicker(Messages.getString("OptionWizard.65"), //$NON-NLS-1$ + localPropertiesService.getValue(EarthProperty.SAIKU_SERVER_FOLDER), + Messages.getString("OptionWizard.66"), DlgMode.MODE_OPEN); //$NON-NLS-1$ + saikuPath.setFolderChooser(); + saikuPath.addChangeListener(new DocumentListener() { + + private void showSaikuWarning() { + final File saikuFolder = new File(saikuPath.getSelectedFilePath()); + if ( !saikuService.isSaikuFolder(saikuFolder)) { + JOptionPane.showMessageDialog(PropertiesDialog.this, Messages.getString("OptionWizard.27"), //$NON-NLS-1$ + Messages.getString("OptionWizard.28"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ + saikuPath.getTextField().setBackground(CollectEarthWindow.ERROR_COLOR); + } else { + saikuPath.getTextField().setBackground(Color.white); + } + } + + @Override + public void removeUpdate(DocumentEvent e) { + // Do not react + } + + @Override + public void insertUpdate(DocumentEvent e) { + showSaikuWarning(); + } + + @Override + public void changedUpdate(DocumentEvent e) { + // Do not react + } + }); + propertyToComponent.put(EarthProperty.SAIKU_SERVER_FOLDER, new JComponent[] { saikuPath }); + + final JFilePicker kmlTemplatePath = new JFilePicker(Messages.getString("OptionWizard.79"), //$NON-NLS-1$ + localPropertiesService.getValue(EarthProperty.KML_TEMPLATE_KEY), Messages.getString("OptionWizard.80"), //$NON-NLS-1$ + DlgMode.MODE_OPEN); + kmlTemplatePath.addFileTypeFilter(".fmt", Messages.getString("OptionWizard.82"), true); //$NON-NLS-1$ //$NON-NLS-2$ + propertyToComponent.put(EarthProperty.KML_TEMPLATE_KEY, new JComponent[] { kmlTemplatePath }); + + final JFilePicker htmlBalloonPath = new JFilePicker(Messages.getString("OptionWizard.83"), //$NON-NLS-1$ + localPropertiesService.getValue(EarthProperty.BALLOON_TEMPLATE_KEY), + Messages.getString("OptionWizard.84"), DlgMode.MODE_OPEN); //$NON-NLS-1$ + htmlBalloonPath.addFileTypeFilter(".html,.htm", Messages.getString("OptionWizard.86"), true); //$NON-NLS-1$ //$NON-NLS-2$ + propertyToComponent.put(EarthProperty.BALLOON_TEMPLATE_KEY, new JComponent[] { htmlBalloonPath }); + + final JFilePicker idmPath = new JFilePicker(Messages.getString("OptionWizard.87"), //$NON-NLS-1$ + localPropertiesService.getImdFile(), Messages.getString("OptionWizard.88"), DlgMode.MODE_OPEN); //$NON-NLS-1$ + idmPath.addFileTypeFilter(".xml", Messages.getString("OptionWizard.90"), true); //$NON-NLS-1$ //$NON-NLS-2$ + propertyToComponent.put(EarthProperty.METADATA_FILE, new JComponent[] { idmPath }); + + final JTextField surveyNameTextField = new JTextField( + localPropertiesService.getValue(EarthProperty.SURVEY_NAME)); + surveyNameTextField.setEnabled(false); + propertyToComponent.put(EarthProperty.SURVEY_NAME, new JComponent[] { surveyNameTextField }); + + // Database options + + final JRadioButton instanceTypeServer = new JRadioButton(Messages.getString("OptionWizard.91")); //$NON-NLS-1$ + instanceTypeServer.setSelected(localPropertiesService.getOperationMode().equals(OperationMode.SERVER_MODE)); + instanceTypeServer.setName(EarthConstants.OperationMode.SERVER_MODE.name()); + + final JRadioButton instanceTypeClient = new JRadioButton(Messages.getString("OptionWizard.92")); //$NON-NLS-1$ + instanceTypeClient.setSelected(localPropertiesService.getOperationMode().equals(OperationMode.CLIENT_MODE)); + instanceTypeClient.setName(EarthConstants.OperationMode.CLIENT_MODE.name()); + propertyToComponent.put(EarthProperty.OPERATION_MODE, + new JComponent[] { instanceTypeServer, instanceTypeClient }); + + final JTextField collectEarthServerIp = new JTextField(localPropertiesService.getValue(EarthProperty.HOST_KEY)); + propertyToComponent.put(EarthProperty.HOST_KEY, new JComponent[] { collectEarthServerIp }); + + final JTextField collectEarthServerIpPort = new JTextField(localPropertiesService.getPort()); + final JTextField collectEarthServerLocalPort = new JTextField( + localPropertiesService.getValue(EarthProperty.HOST_PORT_KEY)); + propertyToComponent.put(EarthProperty.HOST_PORT_KEY, + new JComponent[] { collectEarthServerIpPort, collectEarthServerLocalPort }); + + final JRadioButton sqliteDbType = new JRadioButton(Messages.getString("OptionWizard.93")); //$NON-NLS-1$ + sqliteDbType.setSelected(localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.SQLITE)); + sqliteDbType.setName(CollectDBDriver.SQLITE.name()); + + final JRadioButton postgresDbType = new JRadioButton(Messages.getString("OptionWizard.94")); //$NON-NLS-1$ + boolean usingPostgreSQL = localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.POSTGRESQL); + postgresDbType.setSelected(usingPostgreSQL); + postgresDbType.setName(CollectDBDriver.POSTGRESQL.name()); + propertyToComponent.put(EarthProperty.DB_DRIVER, new JComponent[] { sqliteDbType, postgresDbType }); + + final JTextField dbUserName = new JTextField(localPropertiesService.getValue(EarthProperty.DB_USERNAME)); + propertyToComponent.put(EarthProperty.DB_USERNAME, new JComponent[] { dbUserName }); + + final JTextField dbPassword = new JTextField(localPropertiesService.getValue(EarthProperty.DB_PASSWORD)); + propertyToComponent.put(EarthProperty.DB_PASSWORD, new JComponent[] { dbPassword }); + + final JTextField dbName = new JTextField(localPropertiesService.getValue(EarthProperty.DB_NAME)); + propertyToComponent.put(EarthProperty.DB_NAME, new JComponent[] { dbName }); + + final JTextField dbHost = new JTextField(localPropertiesService.getValue(EarthProperty.DB_HOST)); + propertyToComponent.put(EarthProperty.DB_HOST, new JComponent[] { dbHost }); + + final JTextField dbPort = new JTextField(localPropertiesService.getValue(EarthProperty.DB_PORT)); + propertyToComponent.put(EarthProperty.DB_PORT, new JComponent[] { dbPort }); + + } + + public boolean isRestartRequired() { + return restartRequired; + } + + public void setRestartRequired(boolean restartRequired) { + this.restartRequired = restartRequired; } } From bd61f66b91d38d018d6154300dca2432123dbcb3 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:22 +0100 Subject: [PATCH 0331/1620] New translations LinkRunner.java (English) --- .../earth/app/view/Messages_en.properties | 124 ++++++------------ 1 file changed, 39 insertions(+), 85 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index aee91325a9..c9f18857eb 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,89 +1,43 @@ package org.openforis.collect.earth.app.view; -import java.awt.Toolkit; -import java.util.List; +import java.awt.Desktop; +import java.net.URI; +import java.util.concurrent.ExecutionException; import javax.swing.JOptionPane; -import javax.swing.ProgressMonitor; -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.ArrayUtils; -import org.openforis.collect.io.data.CSVDataImportProcess; -import org.openforis.collect.io.metadata.parsing.ParsingError; -import org.openforis.collect.manager.process.AbstractProcess; -import org.openforis.collect.manager.process.ProcessStatus; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public abstract class ProcessMonitorDialog extends Thread { - - private static final int MAX_ERRORS_SHOWN = 10; - ProgressMonitor progressMonitor; - Logger logger = LoggerFactory.getLogger(ProcessMonitorDialog.class); - AbstractProcess process; - - - protected abstract String getProcessActionMessage(); - - public synchronized void monitorProgress() { - - new Thread("Monitoring progress of a process") { - @Override - public void run() { - boolean keepRunning = true; - while (keepRunning) { - if (process.getStatus() != null) { - SwingUtilities.invokeLater( () -> { - progressMonitor.setProgress(process.getStatus().getProgressPercent()); - progressMonitor.setNote(getProcessActionMessage() + process.getStatus().getProcessed() + "/" //$NON-NLS-1$ //$NON-NLS-2$ - + process.getStatus().getTotal()); - }); - - if (progressMonitor.isCanceled() || process.getStatus().isComplete() || process.getStatus().isError() ) { - SwingUtilities.invokeLater( () -> { - progressMonitor.close(); - if( process.getStatus().isError() ){ - StringBuilder parsisngErrorMsg = new StringBuilder("\r\n"); //$NON-NLS-1$ - if( process instanceof CSVDataImportProcess ){ - List errors = ((CSVDataImportProcess) process ).getStatus().getErrors(); - - int numberOfErrors = 0; - for (ParsingError parsingError : errors) { - parsisngErrorMsg.append(Messages.getString("ProcessMonitorDialog.1")).append( parsingError.getRow() ).append(" - ").append( parsingError.getMessage() ).append(", ").append( parsingError.getErrorType() ).append(Messages.getString("ProcessMonitorDialog.4")).append( ArrayUtils.toString(parsingError.getColumns()) ).append(Messages.getString("ProcessMonitorDialog.5")).append( ArrayUtils.toString(parsingError.getMessageArgs()) ).append("\r\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ - numberOfErrors ++; - if( numberOfErrors > MAX_ERRORS_SHOWN ){ - break; - } - } - - if( errors.size() > MAX_ERRORS_SHOWN ){ - parsisngErrorMsg.append( "More lines not shown . Total warnings : " + errors.size() ); - } - - } - - String primaryErrorMsg = process.getStatus().getErrorMessage(); - JOptionPane.showMessageDialog(null, "Attention : " + ( primaryErrorMsg!=null?primaryErrorMsg:"") + parsisngErrorMsg.toString() ); //$NON-NLS-1$ //$NON-NLS-2$ - } - }); - Toolkit.getDefaultToolkit().beep(); - if ( !process.getStatus().isComplete() && !process.getStatus().isError() ) { - process.cancel(); - logger.warn("Task canceled.\n"); //$NON-NLS-1$ - } - keepRunning = false; - } - } - - try { - Thread.sleep( 1000 ); - } catch (InterruptedException e) { - logger.error("Error whille waiting in thread", e); //$NON-NLS-1$ - Thread.currentThread().interrupt(); - } - } - } - }.start(); - } - -} +import javax.swing.SwingWorker; + +class LinkRunner extends SwingWorker { + + private final URI uri; + + LinkRunner(URI u) { + if (u == null) { + throw new NullPointerException(); + } + uri = u; + } + + @Override + protected Void doInBackground() throws Exception { + Desktop desktop = java.awt.Desktop.getDesktop(); + desktop.browse(uri); + return null; + } + + @Override + protected void done() { + try { + get(); + } catch (ExecutionException ee) { + handleException(); + } catch (InterruptedException e) { + handleException(); + Thread.currentThread().interrupt(); + } + } + + private static void handleException() { + JOptionPane.showMessageDialog(null, Messages.getString("AboutDialog.6"), Messages.getString("AboutDialog.19"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ + } +} \ No newline at end of file From f668ba1e29fc63c6eb53199e1d27fe820a323663 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:23 +0100 Subject: [PATCH 0332/1620] New translations LinkRunner.java (Spanish) --- .../earth/app/view/Messages_es.properties | 124 ++++++------------ 1 file changed, 39 insertions(+), 85 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index aee91325a9..c9f18857eb 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,89 +1,43 @@ package org.openforis.collect.earth.app.view; -import java.awt.Toolkit; -import java.util.List; +import java.awt.Desktop; +import java.net.URI; +import java.util.concurrent.ExecutionException; import javax.swing.JOptionPane; -import javax.swing.ProgressMonitor; -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.ArrayUtils; -import org.openforis.collect.io.data.CSVDataImportProcess; -import org.openforis.collect.io.metadata.parsing.ParsingError; -import org.openforis.collect.manager.process.AbstractProcess; -import org.openforis.collect.manager.process.ProcessStatus; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public abstract class ProcessMonitorDialog extends Thread { - - private static final int MAX_ERRORS_SHOWN = 10; - ProgressMonitor progressMonitor; - Logger logger = LoggerFactory.getLogger(ProcessMonitorDialog.class); - AbstractProcess process; - - - protected abstract String getProcessActionMessage(); - - public synchronized void monitorProgress() { - - new Thread("Monitoring progress of a process") { - @Override - public void run() { - boolean keepRunning = true; - while (keepRunning) { - if (process.getStatus() != null) { - SwingUtilities.invokeLater( () -> { - progressMonitor.setProgress(process.getStatus().getProgressPercent()); - progressMonitor.setNote(getProcessActionMessage() + process.getStatus().getProcessed() + "/" //$NON-NLS-1$ //$NON-NLS-2$ - + process.getStatus().getTotal()); - }); - - if (progressMonitor.isCanceled() || process.getStatus().isComplete() || process.getStatus().isError() ) { - SwingUtilities.invokeLater( () -> { - progressMonitor.close(); - if( process.getStatus().isError() ){ - StringBuilder parsisngErrorMsg = new StringBuilder("\r\n"); //$NON-NLS-1$ - if( process instanceof CSVDataImportProcess ){ - List errors = ((CSVDataImportProcess) process ).getStatus().getErrors(); - - int numberOfErrors = 0; - for (ParsingError parsingError : errors) { - parsisngErrorMsg.append(Messages.getString("ProcessMonitorDialog.1")).append( parsingError.getRow() ).append(" - ").append( parsingError.getMessage() ).append(", ").append( parsingError.getErrorType() ).append(Messages.getString("ProcessMonitorDialog.4")).append( ArrayUtils.toString(parsingError.getColumns()) ).append(Messages.getString("ProcessMonitorDialog.5")).append( ArrayUtils.toString(parsingError.getMessageArgs()) ).append("\r\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ - numberOfErrors ++; - if( numberOfErrors > MAX_ERRORS_SHOWN ){ - break; - } - } - - if( errors.size() > MAX_ERRORS_SHOWN ){ - parsisngErrorMsg.append( "More lines not shown . Total warnings : " + errors.size() ); - } - - } - - String primaryErrorMsg = process.getStatus().getErrorMessage(); - JOptionPane.showMessageDialog(null, "Attention : " + ( primaryErrorMsg!=null?primaryErrorMsg:"") + parsisngErrorMsg.toString() ); //$NON-NLS-1$ //$NON-NLS-2$ - } - }); - Toolkit.getDefaultToolkit().beep(); - if ( !process.getStatus().isComplete() && !process.getStatus().isError() ) { - process.cancel(); - logger.warn("Task canceled.\n"); //$NON-NLS-1$ - } - keepRunning = false; - } - } - - try { - Thread.sleep( 1000 ); - } catch (InterruptedException e) { - logger.error("Error whille waiting in thread", e); //$NON-NLS-1$ - Thread.currentThread().interrupt(); - } - } - } - }.start(); - } - -} +import javax.swing.SwingWorker; + +class LinkRunner extends SwingWorker { + + private final URI uri; + + LinkRunner(URI u) { + if (u == null) { + throw new NullPointerException(); + } + uri = u; + } + + @Override + protected Void doInBackground() throws Exception { + Desktop desktop = java.awt.Desktop.getDesktop(); + desktop.browse(uri); + return null; + } + + @Override + protected void done() { + try { + get(); + } catch (ExecutionException ee) { + handleException(); + } catch (InterruptedException e) { + handleException(); + Thread.currentThread().interrupt(); + } + } + + private static void handleException() { + JOptionPane.showMessageDialog(null, Messages.getString("AboutDialog.6"), Messages.getString("AboutDialog.19"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ + } +} \ No newline at end of file From 9baa3ecbd06d9899a71bb73ab32fb565ff063027 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:24 +0100 Subject: [PATCH 0333/1620] New translations ImportProcessMonitorDialog.java (Spanish) --- .../earth/app/view/Messages_es.properties | 80 ++++++++++--------- 1 file changed, 42 insertions(+), 38 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index c9f18857eb..68af760ca4 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,43 +1,47 @@ package org.openforis.collect.earth.app.view; -import java.awt.Desktop; -import java.net.URI; -import java.util.concurrent.ExecutionException; - +import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.SwingWorker; - -class LinkRunner extends SwingWorker { - - private final URI uri; - - LinkRunner(URI u) { - if (u == null) { - throw new NullPointerException(); - } - uri = u; - } - - @Override - protected Void doInBackground() throws Exception { - Desktop desktop = java.awt.Desktop.getDesktop(); - desktop.browse(uri); - return null; - } - - @Override - protected void done() { - try { - get(); - } catch (ExecutionException ee) { - handleException(); - } catch (InterruptedException e) { - handleException(); - Thread.currentThread().interrupt(); +import javax.swing.ProgressMonitor; +import javax.swing.SwingUtilities; + +import org.openforis.collect.io.ReferenceDataImportStatus; +import org.openforis.collect.io.metadata.parsing.ParsingError; +import org.openforis.collect.manager.process.AbstractProcess; + +public class ImportProcessMonitorDialog extends ProcessMonitorDialog> { + + private JFrame parentFrame; + + + public ImportProcessMonitorDialog(AbstractProcess> importProcess, JFrame parentFrame ) { + super(); + this.process = importProcess; + this.parentFrame = parentFrame; + SwingUtilities.invokeLater( () -> { + progressMonitor = new ProgressMonitor(parentFrame, Messages.getString("ExportDialogProcessMonitor.0"), Messages.getString("ExportDialogProcessMonitor.1"), 0, 100); //$NON-NLS-1$ //$NON-NLS-2$ + progressMonitor.setMillisToPopup(1000); + } ); + } + + protected String getProcessActionMessage() { + return Messages.getString("ImportProcessMonitorDialog.0"); //$NON-NLS-1$ + } + + + @Override + public void run() { + + try { + monitorProgress(); + process.call(); + if( process.getStatus().isComplete() ) { + JOptionPane.showMessageDialog( parentFrame, "Update finished", "CSV Update", JOptionPane.INFORMATION_MESSAGE); + } + } catch (final Exception e) { + logger.error("Error starting the process", e); //$NON-NLS-1$ } - } - private static void handleException() { - JOptionPane.showMessageDialog(null, Messages.getString("AboutDialog.6"), Messages.getString("AboutDialog.19"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ - } -} \ No newline at end of file + } + +} From 4996221c2b1a3fe85f97b6244689a7933acad4c0 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:25 +0100 Subject: [PATCH 0334/1620] New translations JFileChooserExistsAware.java (French) --- .../earth/app/view/Messages_fr.properties | 1258 ++--------------- 1 file changed, 102 insertions(+), 1156 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 7eb0424502..21d900b58d 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,1209 +1,155 @@ package org.openforis.collect.earth.app.view; -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Component; -import java.awt.Container; -import java.awt.Dimension; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.GridLayout; -import java.awt.Insets; -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.io.File; -import java.io.IOException; -import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; +import java.util.Arrays; -import javax.swing.AbstractAction; -import javax.swing.AbstractButton; -import javax.swing.ButtonGroup; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JComponent; -import javax.swing.JDialog; +import javax.swing.JFileChooser; import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JList; import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JPasswordField; -import javax.swing.JRadioButton; -import javax.swing.JScrollPane; -import javax.swing.JTabbedPane; -import javax.swing.JTextField; -import javax.swing.ListSelectionModel; -import javax.swing.ScrollPaneConstants; -import javax.swing.border.BevelBorder; -import javax.swing.border.Border; -import javax.swing.border.TitledBorder; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; +import javax.swing.filechooser.FileFilter; import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; -import org.openforis.collect.earth.app.EarthConstants.OperationMode; -import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.AnalysisSaikuService; -import org.openforis.collect.earth.app.service.EarthProjectsService; import org.openforis.collect.earth.app.service.LocalPropertiesService; import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; -import org.openforis.collect.model.CollectSurvey; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ -public class PropertiesDialog extends JDialog { +public class JFileChooserExistsAware extends JFileChooser { - private static final ComboBoxItem COMBO_BOX_ITEM_CENTRAL_POINT = new ComboBoxItem(1, - Messages.getString("OptionWizard.54")); - - private static final ComboBoxItem COMBO_BOX_ITEM_SQUARE = new ComboBoxItem(0, - Messages.getString("OptionWizard.53")); - - private static final long serialVersionUID = -6760020609229102842L; - - private final HashMap, JComponent[]> propertyToComponent = new HashMap<>(); - private final transient Logger logger = LoggerFactory.getLogger(this.getClass()); - - JPanel postgresPanel; - JPanel sqlitePanel; - - private transient LocalPropertiesService localPropertiesService; - - String backupFolder; - - private transient AnalysisSaikuService saikuService; - - private transient EarthProjectsService projectsService; - - private boolean restartRequired; - - private String oldSelectedDistance; - - private CollectSurvey surveyLoaded; - - private JButton applyChanges; - - public PropertiesDialog(JFrame frame, LocalPropertiesService localPropertiesService, - EarthProjectsService projectsService, String backupFolder, AnalysisSaikuService saikuService, - CollectSurvey surveyLoaded) { - super(frame, Messages.getString("OptionWizard.0")); //$NON-NLS-1$ - this.localPropertiesService = localPropertiesService; - this.projectsService = projectsService; - this.backupFolder = backupFolder; - this.saikuService = saikuService; - this.surveyLoaded = surveyLoaded; - this.setLocationRelativeTo(null); - this.setSize(new Dimension(600, 620)); - this.setModal(true); - this.setResizable(false); - initilizeInputs(); - buildMainPane(); - centreWindow(); + private static final long serialVersionUID = 2571562963995019882L; + private JFileChooserExistsAware(File lastFolder) { + super(lastFolder); } - private void centreWindow() { - Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize(); - int x = (int) ((dimension.getWidth() - getWidth()) / 2); - int y = (int) ((dimension.getHeight() - getHeight()) / 2); - setLocation(x, y); + private JFileChooserExistsAware(){ + super(); } - private void buildMainPane() { - - final JPanel panel = new JPanel(new BorderLayout()); - panel.add(getOptionTabs(), BorderLayout.CENTER); - final JPanel buttonPanel = new JPanel(); - buttonPanel.add(getApplyChangesButton()); - buttonPanel.add(getCancelButton()); - panel.add(buttonPanel, BorderLayout.PAGE_END); - this.add(panel); - - } - - private void enableContainer(Container container, boolean enable) { - final Component[] components = container.getComponents(); - for (final Component component : components) { - component.setEnabled(enable); - if (component instanceof Container) { - enableContainer((Container) component, enable); + @Override + public void approveSelection(){ + File f = getSelectedFile(); + if( f!=null && f.exists() && getDialogType() == SAVE_DIALOG){ + int result = JOptionPane.showConfirmDialog(this,"The file exists, overwrite?","Existing file",JOptionPane.YES_NO_CANCEL_OPTION); //$NON-NLS-1$ //$NON-NLS-2$ + switch(result){ + case JOptionPane.YES_OPTION: + super.approveSelection(); + return; + case JOptionPane.NO_OPTION: + return; + case JOptionPane.CLOSED_OPTION: + return; + case JOptionPane.CANCEL_OPTION: + cancelSelection(); + return; } } + super.approveSelection(); } - private JComponent getBrowsersOptionsPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - final JPanel browserChooserPanel = new JPanel(); - final Border browserBorder = new TitledBorder(new BevelBorder(BevelBorder.LOWERED), - Messages.getString("OptionWizard.1")); //$NON-NLS-1$ - browserChooserPanel.setBorder(browserBorder); - GridLayout experimentLayout = new GridLayout(0,1); - browserChooserPanel.setLayout( experimentLayout ); - - final ButtonGroup browserChooser = new ButtonGroup(); - final JComponent[] browsers = propertyToComponent.get(EarthProperty.BROWSER_TO_USE); - - for (final JComponent browserRadioButton : browsers) { - browserChooserPanel.add(browserRadioButton); - browserChooser.add((AbstractButton) browserRadioButton); - - ((JRadioButton) browserRadioButton).addActionListener(e -> setRestartRequired(true)); - } - constraints.gridy++; - panel.add(browserChooserPanel, constraints); - - constraints.gridy++; - constraints.gridx = 0; - panel.add(propertyToComponent.get(EarthProperty.SAIKU_SERVER_FOLDER)[0], constraints); - - return panel; - } - - private JComponent getIntegrationsPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - panel.add(propertyToComponent.get(EarthProperty.OPEN_GEE_APP)[0], constraints); - - constraints.gridy++; - panel.add(propertyToComponent.get(EarthProperty.OPEN_BING_MAPS)[0], constraints); - - constraints.gridy++; - panel.add(propertyToComponent.get(EarthProperty.OPEN_EARTH_MAP)[0], constraints); - - - constraints.gridy++; - constraints.gridwidth = 1; - panel.add(propertyToComponent.get(EarthProperty.OPEN_PLANET_MAPS)[0], constraints); - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.PLANET_MAPS_MONHLY)[0], constraints); - - constraints.gridy++; - constraints.gridx = 0; - constraints.gridwidth = 1; - final JLabel label = new JLabel(Messages.getString("OptionWizard.101")); //$NON-NLS-1$ - panel.add(label, constraints); - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.PLANET_MAPS_KEY)[0], constraints); - - constraints.gridx = 0; - constraints.gridy++; - constraints.gridwidth = 2; - panel.add(propertyToComponent.get(EarthProperty.OPEN_MAXAR_SECUREWATCH)[0], constraints); - - constraints.gridy++; - constraints.gridwidth = 1; - final JLabel labelMaxar = new JLabel(Messages.getString("OptionWizard.1021")); //$NON-NLS-1$ - panel.add(labelMaxar, constraints); - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.MAXAR_SECUREWATCH_URL)[0], constraints); - - constraints.gridx = 0; - constraints.gridy++; - constraints.gridwidth = 2; - panel.add(propertyToComponent.get(EarthProperty.OPEN_YANDEX_MAPS)[0], constraints); - - constraints.gridy++; - panel.add(propertyToComponent.get(EarthProperty.OPEN_BAIDU_MAPS)[0], constraints); - - constraints.gridy++; - final JLabel label2 = new JLabel(Messages.getString("OptionWizard.103")); //$NON-NLS-1$ - panel.add(label2, constraints); - constraints.gridy++; - panel.add(propertyToComponent.get(EarthProperty.EXTRA_MAP_URL)[0], constraints); - - constraints.gridy++; - constraints.gridx = 0; - constraints.gridwidth = 2; - panel.add(propertyToComponent.get(EarthProperty.OPEN_GEE_CODE_EDITOR)[0], constraints); - - - return panel; - } - - - private Component getApplyChangesButton() { - if (applyChanges == null) { - applyChanges = new JButton(Messages.getString("OptionWizard.15")); - applyChanges.addActionListener( - new ApplyOptionChangesListener(this, localPropertiesService, propertyToComponent) { - @Override - protected void applyProperties() { - new Thread("Applying properties dialog") { - @Override - public void run() { - savePropertyValues(); - if (isRestartRequired()) { - - restartEarth(); - } else { - EarthApp.executeKmlLoadAsynchronously(PropertiesDialog.this); - } - } - }.start(); - } - }); - } - return applyChanges; - } - - public void closeDialog() { - this.dispose(); - } - - private Component getCancelButton() { - final JButton cancelButton = new JButton(Messages.getString("OptionWizard.24")); //$NON-NLS-1$ - cancelButton.addActionListener( e -> PropertiesDialog.this.dispose() ); - return cancelButton; - } - - private JComponent getOperationModePanel() { - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - final JPanel typeOfUsePanel = new JPanel(new GridBagLayout()); - final Border border = new TitledBorder(new BevelBorder(BevelBorder.LOWERED), - Messages.getString("OptionWizard.2")); //$NON-NLS-1$ - typeOfUsePanel.setBorder(border); - - JPanel serverPanel = getServerPanel(); - typeOfUsePanel.add(serverPanel, constraints); - - return typeOfUsePanel; - } - - private void enableDBOptions(boolean isPostgreDb) { - enableContainer(postgresPanel, isPostgreDb); - enableContainer(sqlitePanel, !isPostgreDb); - } - - private ActionListener getDbTypeListener() { - return e -> { - final JRadioButton theJRB = (JRadioButton) e.getSource(); - - boolean isPostgreDb = theJRB.getName().equals(CollectDBDriver.POSTGRESQL.name()); - enableDBOptions(isPostgreDb); - }; - } - - private JTabbedPane getOptionTabs() { - final JTabbedPane tabbedPane = new JTabbedPane(); - tabbedPane.setSize(550, 300); - final JComponent panel1 = getSampleDataPanel(); - tabbedPane.addTab(Messages.getString("OptionWizard.31"), panel1); //$NON-NLS-1$ - - final JComponent panel2 = getPlotOptionsPanel(); - tabbedPane.addTab(Messages.getString("OptionWizard.32"), panel2); //$NON-NLS-1$ - - final JComponent panel3 = getSurveyDefinitonPanel(); - tabbedPane.addTab(Messages.getString("OptionWizard.33"), panel3); //$NON-NLS-1$ - - final JComponent panel41 = getIntegrationsPanel(); - tabbedPane.addTab(Messages.getString("OptionWizard.34"), panel41); //$NON-NLS-1$ - - final JComponent panel4 = getBrowsersOptionsPanel(); - tabbedPane.addTab(Messages.getString("OptionWizard.104"), panel4); //$NON-NLS-1$ - - final JComponent panel5 = getOperationModePanelScroll(); - tabbedPane.addTab(Messages.getString("OptionWizard.25"), panel5); //$NON-NLS-1$ - - final JComponent panel6 = getProjectsPanelScroll(); - tabbedPane.addTab(Messages.getString("OptionWizard.40"), panel6); //$NON-NLS-1$ - - return tabbedPane; - } - - private JComponent getProjectsPanelScroll() { - final JComponent projectsPanel = getProjectsPanel(); - return new JScrollPane(projectsPanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + public static File[] getFileChooserResults(final DataFormat dataFormat, boolean isSaveDlg, boolean multipleSelect, String preselectedName, LocalPropertiesService localPropertiesService, JFrame frame) { + return getFileChooserResults(dataFormat, isSaveDlg, multipleSelect, preselectedName, localPropertiesService, frame, null); } - private JComponent getProjectsPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.fill = GridBagConstraints.BOTH; + public static File[] getFileChooserResults(final DataFormat dataFormat, boolean isSaveDlg, boolean multipleSelect, String preselectedName, LocalPropertiesService localPropertiesService, JFrame frame, File preSelectedFolder) { - JButton importNewButton = new JButton(Messages.getString("OptionWizard.41")); //$NON-NLS-1$ - importNewButton.addActionListener(new ApplyOptionChangesListener(this, localPropertiesService) { + JFileChooser fc ; - @Override - protected void applyProperties() { - final File[] selectedProjectFile = JFileChooserExistsAware.getFileChooserResults( - DataFormat.PROJECT_DEFINITION_FILE, false, false, null, localPropertiesService, - (JFrame) PropertiesDialog.this.getParent()); - - if (selectedProjectFile != null && selectedProjectFile.length == 1) { - try { - projectsService.loadCompressedProjectFile(selectedProjectFile[0]); - restartEarth(); - } catch (Exception e1) { - JOptionPane.showMessageDialog(PropertiesDialog.this, e1.getMessage(), - Messages.getString("OptionWizard.51"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - logger.error("Error importing project file " + selectedProjectFile[0].getAbsolutePath(), e1); //$NON-NLS-1$ - } - - } - } - }); - - panel.add(importNewButton, constraints); - - final JPanel typeOfDbPanel = new JPanel(new GridBagLayout()); - final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), - Messages.getString("OptionWizard.57")); //$NON-NLS-1$ - typeOfDbPanel.setBorder(border); - - constraints.gridx = 0; - constraints.gridy = 1; - panel.add(typeOfDbPanel, constraints); - - List listOfProjectsByName = new ArrayList<>(); - listOfProjectsByName.addAll(projectsService.getProjectList().keySet()); - Collections.sort(listOfProjectsByName); - final JList listOfProjects = new JList<>(listOfProjectsByName.toArray(new String[0])); // data has type Object[] - listOfProjects.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - listOfProjects.setLayoutOrientation(JList.VERTICAL); - listOfProjects.setVisibleRowCount(-1); - - JScrollPane listScroller = new JScrollPane(listOfProjects); - listScroller.setPreferredSize(new Dimension(250, 300)); - - constraints.gridy = 0; - constraints.gridx = GridBagConstraints.RELATIVE; - typeOfDbPanel.add(listScroller, constraints); - - final JButton openProject = new JButton(Messages.getString("OptionWizard.56")); //$NON-NLS-1$ - openProject.setEnabled(false); - openProject.addActionListener(new ApplyOptionChangesListener(this, localPropertiesService) { - - @Override - protected void applyProperties() { - - File projectFolder = projectsService.getProjectList().get(listOfProjects.getSelectedValue()); - - try { - projectsService.loadProjectInFolder(projectFolder); - restartEarth(); - } catch (Exception e1) { - JOptionPane.showMessageDialog(PropertiesDialog.this, e1.getMessage(), - Messages.getString("OptionWizard.55"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - logger.error("Error importing project folder " + projectFolder.getAbsolutePath(), e1); //$NON-NLS-1$ + if( preSelectedFolder == null ){ + String lastUsedFolder = localPropertiesService.getValue( EarthProperty.LAST_USED_FOLDER ); + if( !StringUtils.isBlank( lastUsedFolder ) ){ + preSelectedFolder = new File( lastUsedFolder ); + if( !preSelectedFolder.exists()){ + preSelectedFolder = null; } - - } - - }); - - listOfProjects.addListSelectionListener(e -> openProject.setEnabled(listOfProjects.getSelectedValue() != null) ); - - typeOfDbPanel.add(openProject); - - return panel; - } - - private JScrollPane getOperationModePanelScroll() { - final JComponent operationModePanel = getOperationModePanel(); - return new JScrollPane(operationModePanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); - } - - private JComponent getPlotOptionsPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.fill = GridBagConstraints.HORIZONTAL; - - JLabel label = new JLabel("Plot shape"); - panel.add(label, constraints); - - constraints.gridx = 1; - JComboBox plotShape = (JComboBox) propertyToComponent.get(EarthProperty.SAMPLE_SHAPE)[0]; - panel.add(plotShape, constraints); - - constraints.gridx = 0; - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.35")); //$NON-NLS-1$ - panel.add(label, constraints); - - constraints.gridx = 1; - JComboBox numberPoints = (JComboBox) propertyToComponent - .get(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT)[0]; - panel.add(numberPoints, constraints); - - constraints.gridx = 0; - constraints.gridy++; - JLabel distanceOrRadiuslabel = new JLabel(Messages.getString("OptionWizard.36")); //$NON-NLS-1$ - panel.add(distanceOrRadiuslabel, constraints); - - constraints.gridx = 1; - JComboBox distanceBetweenPoints = (JComboBox) propertyToComponent - .get(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS)[0]; - panel.add(new JScrollPane(distanceBetweenPoints), constraints); - - constraints.gridx = 0; - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.37")); //$NON-NLS-1$ - panel.add(label, constraints); - constraints.gridx = 1; - JComboBox distanceToFrame = (JComboBox) propertyToComponent - .get(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES)[0]; - panel.add(new JScrollPane(distanceToFrame), constraints); - - constraints.gridx = 0; - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.95")); //$NON-NLS-1$ - panel.add(label, constraints); - constraints.gridx = 1; - JComboBox dotsSide = (JComboBox) propertyToComponent.get(EarthProperty.INNER_SUBPLOT_SIDE)[0]; - panel.add(new JScrollPane(dotsSide), constraints); - - constraints.gridx = 0; - constraints.gridy++; - label = new JLabel("Central plot side"); //$NON-NLS-1$ - panel.add(label, constraints); - constraints.gridx = 1; - JComboBox largeCentralPlotSide = (JComboBox) propertyToComponent.get(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)[0]; - panel.add(new JScrollPane(largeCentralPlotSide), constraints); - - - - constraints.gridx = 0; - constraints.gridy++; - label = new JLabel("Distance between plots in cluster"); - panel.add(label, constraints); - constraints.gridx = 1; - JComboBox plotDistanceInCluster = (JComboBox) propertyToComponent - .get(EarthProperty.DISTANCE_BETWEEN_PLOTS)[0]; - panel.add(new JScrollPane(plotDistanceInCluster), constraints); - - constraints.gridx = 0; - constraints.gridy++; - JLabel area = new JLabel( - "Area (hectares) : " + calculateArea(numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide)); - panel.add(area, constraints); - - ActionListener calculateAreas = actionPerformed -> area.setText("Area (hectares) : " + calculateArea(numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide)); - - plotShape.addActionListener( e-> - handleVisibilityPlotLayout(plotShape, numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide, - plotDistanceInCluster, area, distanceOrRadiuslabel, largeCentralPlotSide) - ); - - numberPoints.addActionListener(calculateAreas); - distanceBetweenPoints.addActionListener(calculateAreas); - distanceToFrame.addActionListener(calculateAreas); - - handleVisibilityPlotLayout(plotShape, numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide, - plotDistanceInCluster, area, distanceOrRadiuslabel, largeCentralPlotSide); - - return panel; - } - - public void handleVisibilityPlotLayout(JComboBox plotShape, JComboBox numberPoints, JComboBox distanceBetweenPoints, - JComboBox distanceToFrame, JComboBox dotsSide, JComboBox distanceBetweenPlots, JLabel area, - JLabel distanceOrRadiuslabel, JComboBox largeCentralPlotSide ) { - numberPoints.setEnabled(false); - distanceBetweenPoints.setEnabled(false); - distanceToFrame.setEnabled(false); - dotsSide.setEnabled(false); - area.setVisible(false); - distanceBetweenPlots.setVisible(false); - distanceBetweenPlots.setEnabled(false); - largeCentralPlotSide.setVisible( false ); - largeCentralPlotSide.setEnabled(false); - - if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE) || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE_WITH_LARGE_CENTRAL_PLOT) ) { - numberPoints.setEnabled(true); - distanceBetweenPoints.setEnabled(true); - distanceToFrame.setEnabled(true); - dotsSide.setEnabled(true); - area.setVisible(true); - distanceOrRadiuslabel.setText(Messages.getString("OptionWizard.36")); - - if( plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE_WITH_LARGE_CENTRAL_PLOT) ) { - largeCentralPlotSide.setVisible( true ); - largeCentralPlotSide.setEnabled(true); } - - } else if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.CIRCLE) - || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.HEXAGON)) { - distanceBetweenPoints.setEnabled(true); - dotsSide.setEnabled(true); - numberPoints.setEnabled(true); - distanceOrRadiuslabel.setText("Radius"); - } else if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.NFI_THREE_CIRCLES) || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.NFI_FOUR_CIRCLES)) { - dotsSide.setEnabled(true); - distanceBetweenPoints.setEnabled(true); - distanceBetweenPlots.setVisible(true); - distanceBetweenPlots.setEnabled(true); - distanceOrRadiuslabel.setText("Radius of the plots"); } - } - - private String calculateArea(JComboBox numberOfPoints, JComboBox distanceBetweenPoints, JComboBox distanceToFrame, JComboBox dotsSide) { - double side = 0; - try { - int numberOfPointsI = ((ComboBoxItem) numberOfPoints.getSelectedItem()).getNumberOfPoints(); - int distanceBetweenPointsI = Integer.parseInt((String) distanceBetweenPoints.getSelectedItem()); - int distanceToFrameI = Integer.parseInt((String) distanceToFrame.getSelectedItem()); - - if (numberOfPointsI == 0 || numberOfPointsI == 1) { - - side = 2d * distanceToFrameI; - if (oldSelectedDistance == null) { - oldSelectedDistance = (String) distanceBetweenPoints.getSelectedItem(); - distanceBetweenPoints.setEnabled(false); - } - distanceBetweenPoints.setSelectedItem("0"); - - if (numberOfPointsI == 0) { - dotsSide.setEnabled(false); - } else if (numberOfPointsI == 1) { - dotsSide.setEnabled(true); - } - - } else { - if (oldSelectedDistance != null) { - distanceBetweenPoints.setSelectedItem(oldSelectedDistance); - oldSelectedDistance = null; - } - distanceBetweenPoints.setEnabled(true); - distanceToFrame.setEnabled(true); - dotsSide.setEnabled(true); + fc = new JFileChooserExistsAware( preSelectedFolder ); - double pointsByLines = Math.sqrt(numberOfPointsI); - side = 2d * distanceToFrameI + (pointsByLines - 1) * distanceBetweenPointsI; - - } - - } catch (RuntimeException e) { - logger.error("Error calculating area of the plot", e); + if( preselectedName != null ){ + File selectedFile = new File( fc.getCurrentDirectory().getAbsolutePath() + File.separatorChar + preselectedName ); + fc.setSelectedFile( selectedFile ); } - DecimalFormat df = new DecimalFormat("###.##"); - return df.format(side * side / 10000d); - } - - private JPanel getPostgreSqlPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), - Messages.getString("OptionWizard.6")); //$NON-NLS-1$ - panel.setBorder(border); - - JLabel label = new JLabel(Messages.getString("OptionWizard.7")); //$NON-NLS-1$ - constraints.gridx = 0; - panel.add(label, constraints); - - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.DB_USERNAME)[0], constraints); - - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.8")); //$NON-NLS-1$ - constraints.gridx = 0; - panel.add(label, constraints); - - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.DB_PASSWORD)[0], constraints); - - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.9")); //$NON-NLS-1$ - constraints.gridx = 0; - panel.add(label, constraints); - - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.DB_NAME)[0], constraints); - - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.26")); //$NON-NLS-1$ - constraints.gridx = 0; - panel.add(label, constraints); + fc.setMultiSelectionEnabled( multipleSelect ); - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.DB_HOST)[0], constraints); + File[] selectedFiles = null; + FileFilter addedFilter = getFileFilter(dataFormat); + fc.addChoosableFileFilter(addedFilter); - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.29")); //$NON-NLS-1$ - constraints.gridx = 0; - panel.add(label, constraints); + fc.setAcceptAllFileFilterUsed(true); + // Set the added file filter as the default chose filter + fc.setFileFilter(addedFilter); - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.DB_PORT)[0], constraints); - - constraints.gridx = 2; - panel.add(new JLabel("Default: 5432"), constraints); - - constraints.gridy++; - constraints.gridx = 1; - JButton button = new JButton("Test Connection"); //$NON-NLS-1$ - button.addActionListener( e-> { - String host = ((JTextField) (propertyToComponent.get(EarthProperty.DB_HOST)[0])).getText(); - String port = ((JTextField) (propertyToComponent.get(EarthProperty.DB_PORT)[0])).getText(); - String dbName = ((JTextField) (propertyToComponent.get(EarthProperty.DB_NAME)[0])).getText(); - String username = ((JTextField) (propertyToComponent.get(EarthProperty.DB_USERNAME)[0])).getText(); - String password = ((JTextField) (propertyToComponent.get(EarthProperty.DB_PASSWORD)[0])).getText(); - - String message = CollectEarthUtils.testPostgreSQLConnection(host, port, dbName, username, password); - JOptionPane.showMessageDialog(PropertiesDialog.this.getOwner(), message, "PostgreSQL Connection test", - JOptionPane.INFORMATION_MESSAGE); - }); - panel.add(button, constraints); - - return panel; - } - - private JPanel getSqlLitePanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), - Messages.getString("OptionWizard.30")); //$NON-NLS-1$ - panel.setBorder(border); - - panel.add(propertyToComponent.get(EarthProperty.AUTOMATIC_BACKUP)[0], constraints); - constraints.gridx++; - panel.add(getOpenBackupFolderButton()); - return panel; - } - - private JComponent getSampleDataPanel() { - final JPlotCsvTable samplePlots = new JPlotCsvTable(localPropertiesService.getValue(EarthProperty.SAMPLE_FILE), - surveyLoaded); - - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.fill = GridBagConstraints.BOTH; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - - final JFilePicker refreshTableOnFileChange = getFilePickerSamplePlots(samplePlots); - - panel.add(refreshTableOnFileChange, constraints); - - samplePlots.setFillsViewportHeight(true); - constraints.gridy = 1; - - constraints.weightx = 1.0; - constraints.weighty = 1.0; - constraints.gridwidth = GridBagConstraints.REMAINDER; - constraints.gridheight = GridBagConstraints.REMAINDER; - - samplePlots.setPreferredScrollableViewportSize(samplePlots.getPreferredSize()); - - panel.add(new JScrollPane(samplePlots, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, - ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), constraints); - - return panel; - } - - private JFilePicker getFilePickerSamplePlots(final JPlotCsvTable samplePlots) { - final JFilePicker refreshTableOnFileChange = (JFilePicker) (propertyToComponent - .get(EarthProperty.SAMPLE_FILE)[0]); - refreshTableOnFileChange.addChangeListener(new DocumentListener() { - - @Override - public void changedUpdate(DocumentEvent e) { - // Do not react - } - - @Override - public void insertUpdate(DocumentEvent e) { - refreshTable(); - } - - @Override - public void removeUpdate(DocumentEvent e) { - // Do not react - } - - private void refreshTable() { - samplePlots.refreshTable(refreshTableOnFileChange.getSelectedFilePath()); - - // Do not let the user save the changes if the sample data is wrong!!! - getApplyChangesButton().setEnabled(samplePlots.isDataValid()); - } - }); - return refreshTableOnFileChange; - } - - private JPanel getServerPanel() { - - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - final JPanel typeOfDbPanel = new JPanel(new GridBagLayout()); - final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), - Messages.getString("OptionWizard.3")); //$NON-NLS-1$ - typeOfDbPanel.setBorder(border); - - JLabel label = new JLabel(Messages.getString("OptionWizard.4") + CollectEarthUtils.getComputerIp()); //$NON-NLS-1$ - typeOfDbPanel.add(label, constraints); - constraints.gridy++; - - label = new JLabel(Messages.getString("OptionWizard.5")); //$NON-NLS-1$ - constraints.gridx = 0; - typeOfDbPanel.add(label, constraints); - - constraints.gridx = 1; - typeOfDbPanel.add(propertyToComponent.get(EarthProperty.HOST_PORT_KEY)[0], constraints); - - constraints.gridwidth = GridBagConstraints.REMAINDER; - constraints.gridy++; - constraints.gridx = 0; - - final ButtonGroup bg = new ButtonGroup(); - final JComponent[] dbTypes = propertyToComponent.get(EarthProperty.DB_DRIVER); - - postgresPanel = getPostgreSqlPanel(); - sqlitePanel = getSqlLitePanel(); - - boolean usingPostgreSQL = localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.POSTGRESQL); - enableDBOptions(usingPostgreSQL); - - for (final JComponent typeRadioButton : dbTypes) { - final JRadioButton dbTypeButton = (JRadioButton) typeRadioButton; - bg.add(dbTypeButton); - typeOfDbPanel.add(dbTypeButton, constraints); - constraints.gridy++; - - dbTypeButton.addActionListener(getDbTypeListener()); - dbTypeButton.addActionListener(e -> setRestartRequired(true)); - - if (dbTypeButton.getName().equals(EarthConstants.CollectDBDriver.POSTGRESQL.name())) { - typeOfDbPanel.add(postgresPanel, constraints); - constraints.gridy++; - - } else { - typeOfDbPanel.add(sqlitePanel, constraints); - constraints.gridy++; - } + // Handle open button action. + int returnVal ; + if( isSaveDlg ){ + returnVal = fc.showSaveDialog( frame ); + }else{ + returnVal = fc.showOpenDialog( frame); } - return typeOfDbPanel; - } - - private Component getOpenBackupFolderButton() { - - AbstractAction backupAction = new AbstractAction(Messages.getString("OptionWizard.10")) { //$NON-NLS-1$ - - private static final long serialVersionUID = 1L; - - @Override - public void actionPerformed(ActionEvent e) { - try { - CollectEarthUtils.openFolderInExplorer(backupFolder); - - } catch (final IOException e1) { - logger.error("Error when opening the explorer window to visualize backups", e1); //$NON-NLS-1$ + if ( returnVal == JFileChooser.APPROVE_OPTION) { + + if( multipleSelect ){ + selectedFiles = fc.getSelectedFiles(); + }else{ + selectedFiles = new File[]{fc.getSelectedFile()}; + } + + if( selectedFiles != null && selectedFiles.length > 0 ) { + if( isSaveDlg ){ + String fileName = selectedFiles[0].getAbsolutePath(); + + String fileExtension = null; + + if( fileName.lastIndexOf('.') != -1){ + fileExtension = fileName.substring( fileName.lastIndexOf('.') + 1 ).toLowerCase(); + } + + // If the chose file has no extension or the extension is not one of the default extensions for the dataformat + if ( fileExtension == null || Arrays.binarySearch( dataFormat.getPossibleFileExtensions(), fileExtension ) < 0 ) { //$NON-NLS-1$ + fileName += "." + dataFormat.getDefaultExtension(); //$NON-NLS-1$ + selectedFiles[0] = new File(fileName); + } } + + localPropertiesService.setValue(EarthProperty.LAST_USED_FOLDER, selectedFiles[0].getParent()); } - }; - - return new JButton(backupAction); - - } - - private JComponent getSurveyDefinitonPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.fill = GridBagConstraints.HORIZONTAL; - constraints.gridwidth = 2; - panel.add(propertyToComponent.get(EarthProperty.OPEN_BALLOON_IN_BROWSER)[0], constraints); - - constraints.gridy++; - constraints.gridwidth = 1; - final JLabel label = new JLabel(Messages.getString("OptionWizard.43")); //$NON-NLS-1$ - panel.add(label, constraints); - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.SURVEY_NAME)[0], constraints); - - constraints.gridy++; - constraints.gridwidth = GridBagConstraints.REMAINDER; - constraints.gridx = 0; - panel.add(propertyToComponent.get(EarthProperty.KML_TEMPLATE_KEY)[0], constraints); - - constraints.gridy++; - constraints.gridx = 0; - panel.add(propertyToComponent.get(EarthProperty.BALLOON_TEMPLATE_KEY)[0], constraints); - - constraints.gridy++; - constraints.gridx = 0; - - panel.add(propertyToComponent.get(EarthProperty.METADATA_FILE)[0], constraints); - - return panel; - } - - private void initilizeInputs() { - - final JCheckBox backupCheckbox = new JCheckBox(Messages.getString("OptionWizard.44")); //$NON-NLS-1$ - backupCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.AUTOMATIC_BACKUP))); - propertyToComponent.put(EarthProperty.AUTOMATIC_BACKUP, new JComponent[] { backupCheckbox }); - - final JCheckBox openEarthEngineCheckbox = new JCheckBox(Messages.getString("OptionWizard.45")); //$NON-NLS-1$ - openEarthEngineCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_EXPLORER))); - propertyToComponent.put(EarthProperty.OPEN_GEE_EXPLORER, new JComponent[] { openEarthEngineCheckbox }); - - final JCheckBox openGEEAppCheckbox = new JCheckBox("Google Earth Engine APP (no sign-in)"); //$NON-NLS-1$ - openGEEAppCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_APP))); - propertyToComponent.put(EarthProperty.OPEN_GEE_APP, new JComponent[] { openGEEAppCheckbox }); - - final JCheckBox openTimelapseCheckbox = new JCheckBox(Messages.getString("OptionWizard.46")); //$NON-NLS-1$ - openTimelapseCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_TIMELAPSE))); - propertyToComponent.put(EarthProperty.OPEN_TIMELAPSE, new JComponent[] { openTimelapseCheckbox }); - - final JCheckBox openEarthMapCheckbox = new JCheckBox(Messages.getString("OptionWizard.105")); //$NON-NLS-1$ - openEarthMapCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_EARTH_MAP))); - propertyToComponent.put(EarthProperty.OPEN_EARTH_MAP, new JComponent[] { openEarthMapCheckbox }); - - final JCheckBox openBingCheckbox = new JCheckBox(Messages.getString("OptionWizard.47")); //$NON-NLS-1$ - openBingCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BING_MAPS))); - propertyToComponent.put(EarthProperty.OPEN_BING_MAPS, new JComponent[] { openBingCheckbox }); - - final JCheckBox openPlanetCheckbox = new JCheckBox(Messages.getString("OptionWizard.100")); //$NON-NLS-1$ - openPlanetCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_PLANET_MAPS))); - propertyToComponent.put(EarthProperty.OPEN_PLANET_MAPS, new JComponent[] { openPlanetCheckbox }); - - final JCheckBox openMonthlyNICFICheckbox = new JCheckBox(Messages.getString("OptionWizard.110")); //$NON-NLS-1$ - openMonthlyNICFICheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.PLANET_MAPS_MONHLY))); - propertyToComponent.put(EarthProperty.PLANET_MAPS_MONHLY, new JComponent[] { openMonthlyNICFICheckbox }); - - - final JPasswordField planetAPIKeyTextField = new JPasswordField( - localPropertiesService.getValue(EarthProperty.PLANET_MAPS_KEY)); - planetAPIKeyTextField.setMinimumSize(new Dimension( 250, 20 )); - planetAPIKeyTextField.setEnabled( localPropertiesService.isPlanetMapsSupported() ); - propertyToComponent.put(EarthProperty.PLANET_MAPS_KEY, new JComponent[] { planetAPIKeyTextField }); - - openMonthlyNICFICheckbox.setEnabled( openPlanetCheckbox.isSelected() ); - planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ); - - openPlanetCheckbox.addActionListener( e-> { - planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ); - openMonthlyNICFICheckbox.setEnabled( openPlanetCheckbox.isSelected() ); - }); - openMonthlyNICFICheckbox.addActionListener( e-> planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ) ); - - - final JCheckBox openSecureWatchCheckbox = new JCheckBox(Messages.getString("OptionWizard.102")); //$NON-NLS-1$ - openSecureWatchCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_MAXAR_SECUREWATCH))); - propertyToComponent.put(EarthProperty.OPEN_MAXAR_SECUREWATCH, new JComponent[] { openSecureWatchCheckbox }); - - final JTextField secureWatchUrlTextField = new JTextField( - localPropertiesService.getValue(EarthProperty.MAXAR_SECUREWATCH_URL)); - secureWatchUrlTextField.setMinimumSize(new Dimension( 250, 20 )); - propertyToComponent.put(EarthProperty.MAXAR_SECUREWATCH_URL, new JComponent[] { secureWatchUrlTextField }); - secureWatchUrlTextField.setEnabled( localPropertiesService.isSecureWatchSupported() ); - propertyToComponent.put(EarthProperty.MAXAR_SECUREWATCH_URL, new JComponent[] { secureWatchUrlTextField }); - openSecureWatchCheckbox.addActionListener( e -> secureWatchUrlTextField.setEnabled( openSecureWatchCheckbox.isSelected() ) ); - - final JTextField extraUrlTextField = new JTextField( - localPropertiesService.getValue(EarthProperty.EXTRA_MAP_URL)); - extraUrlTextField.setMinimumSize(new Dimension( 250, 20 )); - propertyToComponent.put(EarthProperty.EXTRA_MAP_URL, new JComponent[] { extraUrlTextField }); - - final JCheckBox openBaiduCheckbox = new JCheckBox("Open Baidu Maps"); - openBaiduCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BAIDU_MAPS))); - propertyToComponent.put(EarthProperty.OPEN_BAIDU_MAPS, new JComponent[] { openBaiduCheckbox }); - - final JCheckBox openYandexCheckbox = new JCheckBox("Open Yandex maps for the plot area"); - openYandexCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_YANDEX_MAPS))); - propertyToComponent.put(EarthProperty.OPEN_YANDEX_MAPS, new JComponent[] { openYandexCheckbox }); - - final JCheckBox openHereCheckbox = new JCheckBox(Messages.getString("OptionWizard.59")); //$NON-NLS-1$ - openHereCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_HERE_MAPS))); - propertyToComponent.put(EarthProperty.OPEN_HERE_MAPS, new JComponent[] { openHereCheckbox }); - - final JCheckBox openGeePlaygroundCheckbox = new JCheckBox(Messages.getString("OptionWizard.58")); //$NON-NLS-1$ - openGeePlaygroundCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_CODE_EDITOR))); - propertyToComponent.put(EarthProperty.OPEN_GEE_CODE_EDITOR, new JComponent[] { openGeePlaygroundCheckbox }); - - final JCheckBox openInSeparateWindowCheckbox = new JCheckBox(Messages.getString("OptionWizard.48")); //$NON-NLS-1$ - openInSeparateWindowCheckbox.setSelected( - Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BALLOON_IN_BROWSER))); - propertyToComponent.put(EarthProperty.OPEN_BALLOON_IN_BROWSER, - new JComponent[] { openInSeparateWindowCheckbox }); - - final JFilePicker csvWithPlotData = new JFilePicker(Messages.getString("OptionWizard.49"), //$NON-NLS-1$ - localPropertiesService.getValue(EarthProperty.SAMPLE_FILE), Messages.getString("OptionWizard.50"), DlgMode.MODE_OPEN); // $NON-NLS-1$ - - csvWithPlotData.addFileTypeFilter(".csv,.ced", Messages.getString("OptionWizard.52"), true); //$NON-NLS-1$ //$NON-NLS-2$ - propertyToComponent.put(EarthProperty.SAMPLE_FILE, new JComponent[] { csvWithPlotData }); - - final JComboBox plotShape = new JComboBox<>(SAMPLE_SHAPE.values()); - try { - plotShape.setSelectedItem(SAMPLE_SHAPE.valueOf(localPropertiesService.getValue(EarthProperty.SAMPLE_SHAPE))); - } catch (Exception e1) { - logger.error("The selected shape type is not supported " + localPropertiesService.getValue(EarthProperty.SAMPLE_SHAPE), e1 ); - } - propertyToComponent.put(EarthProperty.SAMPLE_SHAPE, new JComponent[] { plotShape }); - - final JComboBox comboNumberOfPoints = new JComboBox<>( - new ComboBoxItem[] { COMBO_BOX_ITEM_SQUARE, COMBO_BOX_ITEM_CENTRAL_POINT, new ComboBoxItem(4, "2x2"), //$NON-NLS-1$ //$NON-NLS-2$ - // //$NON-NLS-3$ - new ComboBoxItem(9, "3x3"), new ComboBoxItem(16, "4x4"), new ComboBoxItem(25, "5x5"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - new ComboBoxItem(36, "6x6"), //$NON-NLS-1$ - new ComboBoxItem(49, "7x7") }); //$NON-NLS-1$ - if( StringUtils.isNotBlank( localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT) ) ){ - try { - comboNumberOfPoints.setSelectedItem(new ComboBoxItem( - Integer.parseInt(localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT)), - "")); //$NON-NLS-1$ - } catch (NumberFormatException e1) { - logger.error("This should be a number {}", localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT), e1); - } - } - propertyToComponent.put(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT, - new JComponent[] { comboNumberOfPoints }); - - final String[] listOfNumbers = new String[1500]; - final String[] listOfNumbersFromTwo = new String[1500]; - for (int index = 0; index < listOfNumbers.length; index++) { - listOfNumbers[index] = Integer.toString( index ); //$NON-NLS-1$ - listOfNumbersFromTwo[index] = Integer.toString( index + 2 ); //$NON-NLS-1$ } + return selectedFiles; + } - final JComboBox listOfDistanceBetweenPoints = new JComboBox<>(listOfNumbersFromTwo); - listOfDistanceBetweenPoints - .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS)); - listOfDistanceBetweenPoints.setAutoscrolls(true); - - propertyToComponent.put(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS, - new JComponent[] { listOfDistanceBetweenPoints }); - - final JComboBox listOfDistanceBetweenPlots = new JComboBox<>(listOfNumbersFromTwo); - listOfDistanceBetweenPlots - .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS)); - listOfDistanceBetweenPlots.setAutoscrolls(true); - - propertyToComponent.put(EarthProperty.DISTANCE_BETWEEN_PLOTS, new JComponent[] { listOfDistanceBetweenPlots }); - - final JComboBox listOfDistanceToBorder = new JComboBox<>(listOfNumbers); - listOfDistanceToBorder - .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES)); - listOfDistanceToBorder.setAutoscrolls(true); - - propertyToComponent.put(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES, new JComponent[] { listOfDistanceToBorder }); - - final JComboBox listOfSizeofSamplingDot = new JComboBox<>(listOfNumbersFromTwo); - listOfSizeofSamplingDot.setSelectedItem(localPropertiesService.getValue(EarthProperty.INNER_SUBPLOT_SIDE)); - listOfSizeofSamplingDot.setAutoscrolls(true); - - propertyToComponent.put(EarthProperty.INNER_SUBPLOT_SIDE, new JComponent[] { listOfSizeofSamplingDot }); - - final JComboBox listOfSideOflargeCentralPlot = new JComboBox<>(listOfNumbersFromTwo); - listOfSideOflargeCentralPlot.setSelectedItem(localPropertiesService.getValue(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)); - listOfSideOflargeCentralPlot.setAutoscrolls(true); - - propertyToComponent.put(EarthProperty.LARGE_CENTRAL_PLOT_SIDE, new JComponent[] { listOfSideOflargeCentralPlot }); - - - final JRadioButton chromeChooser = new JRadioButton("Chrome"); //$NON-NLS-1$ - chromeChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() - .equals(EarthConstants.CHROME_BROWSER)); - chromeChooser.setName(EarthConstants.CHROME_BROWSER); - - final JRadioButton firefoxChooser = new JRadioButton("Firefox"); //$NON-NLS-1$ - firefoxChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() - .equals(EarthConstants.FIREFOX_BROWSER)); - firefoxChooser.setName(EarthConstants.FIREFOX_BROWSER); - - final JRadioButton edgeChooser = new JRadioButton("Edge"); //$NON-NLS-1$ - edgeChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() - .equals(EarthConstants.EDGE_BROWSER)); - edgeChooser.setName(EarthConstants.EDGE_BROWSER); - - propertyToComponent.put(EarthProperty.BROWSER_TO_USE, new JComponent[] { firefoxChooser, chromeChooser, edgeChooser}); - final JFilePicker saikuPath = new JFilePicker(Messages.getString("OptionWizard.65"), //$NON-NLS-1$ - localPropertiesService.getValue(EarthProperty.SAIKU_SERVER_FOLDER), - Messages.getString("OptionWizard.66"), DlgMode.MODE_OPEN); //$NON-NLS-1$ - saikuPath.setFolderChooser(); - saikuPath.addChangeListener(new DocumentListener() { - - private void showSaikuWarning() { - final File saikuFolder = new File(saikuPath.getSelectedFilePath()); - if ( !saikuService.isSaikuFolder(saikuFolder)) { - JOptionPane.showMessageDialog(PropertiesDialog.this, Messages.getString("OptionWizard.27"), //$NON-NLS-1$ - Messages.getString("OptionWizard.28"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ - saikuPath.getTextField().setBackground(CollectEarthWindow.ERROR_COLOR); - } else { - saikuPath.getTextField().setBackground(Color.white); - } - } + private static FileFilter getFileFilter(final DataFormat dataFormat) { + return new FileFilter() { @Override - public void removeUpdate(DocumentEvent e) { - // Do not react - } + public boolean accept(File f) { + + String[] extensions = dataFormat.getPossibleFileExtensions(); + boolean acceptedFile = false; + boolean isFolder = f.isDirectory(); + if( isFolder ){ + acceptedFile = true; + }else{ + + for (String fileExtension : extensions) { + if( f.getName().toLowerCase().endsWith("." + fileExtension ) ){ //$NON-NLS-1$ + acceptedFile = true; + break; + } + } + } - @Override - public void insertUpdate(DocumentEvent e) { - showSaikuWarning(); + return acceptedFile; } @Override - public void changedUpdate(DocumentEvent e) { - // Do not react + public String getDescription() { + return dataFormat.getDescription(); } - }); - propertyToComponent.put(EarthProperty.SAIKU_SERVER_FOLDER, new JComponent[] { saikuPath }); - - final JFilePicker kmlTemplatePath = new JFilePicker(Messages.getString("OptionWizard.79"), //$NON-NLS-1$ - localPropertiesService.getValue(EarthProperty.KML_TEMPLATE_KEY), Messages.getString("OptionWizard.80"), //$NON-NLS-1$ - DlgMode.MODE_OPEN); - kmlTemplatePath.addFileTypeFilter(".fmt", Messages.getString("OptionWizard.82"), true); //$NON-NLS-1$ //$NON-NLS-2$ - propertyToComponent.put(EarthProperty.KML_TEMPLATE_KEY, new JComponent[] { kmlTemplatePath }); - - final JFilePicker htmlBalloonPath = new JFilePicker(Messages.getString("OptionWizard.83"), //$NON-NLS-1$ - localPropertiesService.getValue(EarthProperty.BALLOON_TEMPLATE_KEY), - Messages.getString("OptionWizard.84"), DlgMode.MODE_OPEN); //$NON-NLS-1$ - htmlBalloonPath.addFileTypeFilter(".html,.htm", Messages.getString("OptionWizard.86"), true); //$NON-NLS-1$ //$NON-NLS-2$ - propertyToComponent.put(EarthProperty.BALLOON_TEMPLATE_KEY, new JComponent[] { htmlBalloonPath }); - - final JFilePicker idmPath = new JFilePicker(Messages.getString("OptionWizard.87"), //$NON-NLS-1$ - localPropertiesService.getImdFile(), Messages.getString("OptionWizard.88"), DlgMode.MODE_OPEN); //$NON-NLS-1$ - idmPath.addFileTypeFilter(".xml", Messages.getString("OptionWizard.90"), true); //$NON-NLS-1$ //$NON-NLS-2$ - propertyToComponent.put(EarthProperty.METADATA_FILE, new JComponent[] { idmPath }); - - final JTextField surveyNameTextField = new JTextField( - localPropertiesService.getValue(EarthProperty.SURVEY_NAME)); - surveyNameTextField.setEnabled(false); - propertyToComponent.put(EarthProperty.SURVEY_NAME, new JComponent[] { surveyNameTextField }); - - // Database options - - final JRadioButton instanceTypeServer = new JRadioButton(Messages.getString("OptionWizard.91")); //$NON-NLS-1$ - instanceTypeServer.setSelected(localPropertiesService.getOperationMode().equals(OperationMode.SERVER_MODE)); - instanceTypeServer.setName(EarthConstants.OperationMode.SERVER_MODE.name()); - - final JRadioButton instanceTypeClient = new JRadioButton(Messages.getString("OptionWizard.92")); //$NON-NLS-1$ - instanceTypeClient.setSelected(localPropertiesService.getOperationMode().equals(OperationMode.CLIENT_MODE)); - instanceTypeClient.setName(EarthConstants.OperationMode.CLIENT_MODE.name()); - propertyToComponent.put(EarthProperty.OPERATION_MODE, - new JComponent[] { instanceTypeServer, instanceTypeClient }); - - final JTextField collectEarthServerIp = new JTextField(localPropertiesService.getValue(EarthProperty.HOST_KEY)); - propertyToComponent.put(EarthProperty.HOST_KEY, new JComponent[] { collectEarthServerIp }); - - final JTextField collectEarthServerIpPort = new JTextField(localPropertiesService.getPort()); - final JTextField collectEarthServerLocalPort = new JTextField( - localPropertiesService.getValue(EarthProperty.HOST_PORT_KEY)); - propertyToComponent.put(EarthProperty.HOST_PORT_KEY, - new JComponent[] { collectEarthServerIpPort, collectEarthServerLocalPort }); - - final JRadioButton sqliteDbType = new JRadioButton(Messages.getString("OptionWizard.93")); //$NON-NLS-1$ - sqliteDbType.setSelected(localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.SQLITE)); - sqliteDbType.setName(CollectDBDriver.SQLITE.name()); - - final JRadioButton postgresDbType = new JRadioButton(Messages.getString("OptionWizard.94")); //$NON-NLS-1$ - boolean usingPostgreSQL = localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.POSTGRESQL); - postgresDbType.setSelected(usingPostgreSQL); - postgresDbType.setName(CollectDBDriver.POSTGRESQL.name()); - propertyToComponent.put(EarthProperty.DB_DRIVER, new JComponent[] { sqliteDbType, postgresDbType }); - - final JTextField dbUserName = new JTextField(localPropertiesService.getValue(EarthProperty.DB_USERNAME)); - propertyToComponent.put(EarthProperty.DB_USERNAME, new JComponent[] { dbUserName }); - - final JTextField dbPassword = new JTextField(localPropertiesService.getValue(EarthProperty.DB_PASSWORD)); - propertyToComponent.put(EarthProperty.DB_PASSWORD, new JComponent[] { dbPassword }); - - final JTextField dbName = new JTextField(localPropertiesService.getValue(EarthProperty.DB_NAME)); - propertyToComponent.put(EarthProperty.DB_NAME, new JComponent[] { dbName }); - - final JTextField dbHost = new JTextField(localPropertiesService.getValue(EarthProperty.DB_HOST)); - propertyToComponent.put(EarthProperty.DB_HOST, new JComponent[] { dbHost }); - - final JTextField dbPort = new JTextField(localPropertiesService.getValue(EarthProperty.DB_PORT)); - propertyToComponent.put(EarthProperty.DB_PORT, new JComponent[] { dbPort }); - - } - - public boolean isRestartRequired() { - return restartRequired; - } - - public void setRestartRequired(boolean restartRequired) { - this.restartRequired = restartRequired; + }; } } From 90de80034b24a0ca2704a36ed6b1ef48b69f5e6a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:26 +0100 Subject: [PATCH 0335/1620] New translations ImportProcessMonitorDialog.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 102 ++++++------------ 1 file changed, 30 insertions(+), 72 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index aee91325a9..68af760ca4 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,89 +1,47 @@ package org.openforis.collect.earth.app.view; -import java.awt.Toolkit; -import java.util.List; - +import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.ProgressMonitor; import javax.swing.SwingUtilities; -import org.apache.commons.lang3.ArrayUtils; -import org.openforis.collect.io.data.CSVDataImportProcess; +import org.openforis.collect.io.ReferenceDataImportStatus; import org.openforis.collect.io.metadata.parsing.ParsingError; import org.openforis.collect.manager.process.AbstractProcess; -import org.openforis.collect.manager.process.ProcessStatus; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public abstract class ProcessMonitorDialog extends Thread { - - private static final int MAX_ERRORS_SHOWN = 10; - ProgressMonitor progressMonitor; - Logger logger = LoggerFactory.getLogger(ProcessMonitorDialog.class); - AbstractProcess process; - - - protected abstract String getProcessActionMessage(); - - public synchronized void monitorProgress() { - new Thread("Monitoring progress of a process") { - @Override - public void run() { - boolean keepRunning = true; - while (keepRunning) { - if (process.getStatus() != null) { - SwingUtilities.invokeLater( () -> { - progressMonitor.setProgress(process.getStatus().getProgressPercent()); - progressMonitor.setNote(getProcessActionMessage() + process.getStatus().getProcessed() + "/" //$NON-NLS-1$ //$NON-NLS-2$ - + process.getStatus().getTotal()); - }); +public class ImportProcessMonitorDialog extends ProcessMonitorDialog> { - if (progressMonitor.isCanceled() || process.getStatus().isComplete() || process.getStatus().isError() ) { - SwingUtilities.invokeLater( () -> { - progressMonitor.close(); - if( process.getStatus().isError() ){ - StringBuilder parsisngErrorMsg = new StringBuilder("\r\n"); //$NON-NLS-1$ - if( process instanceof CSVDataImportProcess ){ - List errors = ((CSVDataImportProcess) process ).getStatus().getErrors(); + private JFrame parentFrame; - int numberOfErrors = 0; - for (ParsingError parsingError : errors) { - parsisngErrorMsg.append(Messages.getString("ProcessMonitorDialog.1")).append( parsingError.getRow() ).append(" - ").append( parsingError.getMessage() ).append(", ").append( parsingError.getErrorType() ).append(Messages.getString("ProcessMonitorDialog.4")).append( ArrayUtils.toString(parsingError.getColumns()) ).append(Messages.getString("ProcessMonitorDialog.5")).append( ArrayUtils.toString(parsingError.getMessageArgs()) ).append("\r\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ - numberOfErrors ++; - if( numberOfErrors > MAX_ERRORS_SHOWN ){ - break; - } - } - if( errors.size() > MAX_ERRORS_SHOWN ){ - parsisngErrorMsg.append( "More lines not shown . Total warnings : " + errors.size() ); - } - - } - - String primaryErrorMsg = process.getStatus().getErrorMessage(); - JOptionPane.showMessageDialog(null, "Attention : " + ( primaryErrorMsg!=null?primaryErrorMsg:"") + parsisngErrorMsg.toString() ); //$NON-NLS-1$ //$NON-NLS-2$ - } - }); - Toolkit.getDefaultToolkit().beep(); - if ( !process.getStatus().isComplete() && !process.getStatus().isError() ) { - process.cancel(); - logger.warn("Task canceled.\n"); //$NON-NLS-1$ - } - keepRunning = false; - } - } + public ImportProcessMonitorDialog(AbstractProcess> importProcess, JFrame parentFrame ) { + super(); + this.process = importProcess; + this.parentFrame = parentFrame; + SwingUtilities.invokeLater( () -> { + progressMonitor = new ProgressMonitor(parentFrame, Messages.getString("ExportDialogProcessMonitor.0"), Messages.getString("ExportDialogProcessMonitor.1"), 0, 100); //$NON-NLS-1$ //$NON-NLS-2$ + progressMonitor.setMillisToPopup(1000); + } ); + } - try { - Thread.sleep( 1000 ); - } catch (InterruptedException e) { - logger.error("Error whille waiting in thread", e); //$NON-NLS-1$ - Thread.currentThread().interrupt(); - } - } + protected String getProcessActionMessage() { + return Messages.getString("ImportProcessMonitorDialog.0"); //$NON-NLS-1$ + } + + + @Override + public void run() { + + try { + monitorProgress(); + process.call(); + if( process.getStatus().isComplete() ) { + JOptionPane.showMessageDialog( parentFrame, "Update finished", "CSV Update", JOptionPane.INFORMATION_MESSAGE); } - }.start(); + } catch (final Exception e) { + logger.error("Error starting the process", e); //$NON-NLS-1$ + } + } } From e9363293be11641dc5c06d5e863609d04721adc0 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:28 +0100 Subject: [PATCH 0336/1620] New translations ImportProcessMonitorDialog.java (English) --- .../earth/app/view/Messages_en.properties | 80 ++++++++++--------- 1 file changed, 42 insertions(+), 38 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index c9f18857eb..68af760ca4 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,43 +1,47 @@ package org.openforis.collect.earth.app.view; -import java.awt.Desktop; -import java.net.URI; -import java.util.concurrent.ExecutionException; - +import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.SwingWorker; - -class LinkRunner extends SwingWorker { - - private final URI uri; - - LinkRunner(URI u) { - if (u == null) { - throw new NullPointerException(); - } - uri = u; - } - - @Override - protected Void doInBackground() throws Exception { - Desktop desktop = java.awt.Desktop.getDesktop(); - desktop.browse(uri); - return null; - } - - @Override - protected void done() { - try { - get(); - } catch (ExecutionException ee) { - handleException(); - } catch (InterruptedException e) { - handleException(); - Thread.currentThread().interrupt(); +import javax.swing.ProgressMonitor; +import javax.swing.SwingUtilities; + +import org.openforis.collect.io.ReferenceDataImportStatus; +import org.openforis.collect.io.metadata.parsing.ParsingError; +import org.openforis.collect.manager.process.AbstractProcess; + +public class ImportProcessMonitorDialog extends ProcessMonitorDialog> { + + private JFrame parentFrame; + + + public ImportProcessMonitorDialog(AbstractProcess> importProcess, JFrame parentFrame ) { + super(); + this.process = importProcess; + this.parentFrame = parentFrame; + SwingUtilities.invokeLater( () -> { + progressMonitor = new ProgressMonitor(parentFrame, Messages.getString("ExportDialogProcessMonitor.0"), Messages.getString("ExportDialogProcessMonitor.1"), 0, 100); //$NON-NLS-1$ //$NON-NLS-2$ + progressMonitor.setMillisToPopup(1000); + } ); + } + + protected String getProcessActionMessage() { + return Messages.getString("ImportProcessMonitorDialog.0"); //$NON-NLS-1$ + } + + + @Override + public void run() { + + try { + monitorProgress(); + process.call(); + if( process.getStatus().isComplete() ) { + JOptionPane.showMessageDialog( parentFrame, "Update finished", "CSV Update", JOptionPane.INFORMATION_MESSAGE); + } + } catch (final Exception e) { + logger.error("Error starting the process", e); //$NON-NLS-1$ } - } - private static void handleException() { - JOptionPane.showMessageDialog(null, Messages.getString("AboutDialog.6"), Messages.getString("AboutDialog.19"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ - } -} \ No newline at end of file + } + +} From 57bfbece73e22f9fbcffa8e1a078c306238b77d9 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:29 +0100 Subject: [PATCH 0337/1620] New translations ImportXMLDialogProcessMonitor.java (French) --- .../earth/app/view/Messages_fr.properties | 274 ++++++++++-------- 1 file changed, 160 insertions(+), 114 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 21d900b58d..ab7f149d0c 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,155 +1,201 @@ package org.openforis.collect.earth.app.view; +import java.awt.Toolkit; import java.io.File; -import java.util.Arrays; +import java.io.IOException; +import java.nio.file.Files; +import java.security.SecureRandom; +import java.util.List; +import java.util.Observable; +import java.util.Observer; +import java.util.Random; -import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.filechooser.FileFilter; +import javax.swing.SwingUtilities; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.apache.commons.io.FileUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.DataImportExportService; +import org.openforis.collect.io.data.DataImportState; +import org.openforis.collect.io.data.DataImportSummaryItem; +import org.openforis.collect.io.data.XMLDataImportProcess; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -public class JFileChooserExistsAware extends JFileChooser { +import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.exception.ZipException; - private static final long serialVersionUID = 2571562963995019882L; +public class ImportXMLDialogProcessMonitor implements Observer{ - private JFileChooserExistsAware(File lastFolder) { - super(lastFolder); - } + private static final Logger logger = LoggerFactory.getLogger(ImportXMLDialogProcessMonitor.class); + private InfiniteProgressMonitor progressMonitor; - private JFileChooserExistsAware(){ - super(); - } - @Override - public void approveSelection(){ - File f = getSelectedFile(); - if( f!=null && f.exists() && getDialogType() == SAVE_DIALOG){ - int result = JOptionPane.showConfirmDialog(this,"The file exists, overwrite?","Existing file",JOptionPane.YES_NO_CANCEL_OPTION); //$NON-NLS-1$ //$NON-NLS-2$ - switch(result){ - case JOptionPane.YES_OPTION: - super.approveSelection(); - return; - case JOptionPane.NO_OPTION: - return; - case JOptionPane.CLOSED_OPTION: - return; - case JOptionPane.CANCEL_OPTION: - cancelSelection(); - return; + public void closeProgressmonitor() { + + SwingUtilities.invokeLater( () -> { + if (progressMonitor != null) { + progressMonitor.close(); } - } - super.approveSelection(); + } ); } - public static File[] getFileChooserResults(final DataFormat dataFormat, boolean isSaveDlg, boolean multipleSelect, String preselectedName, LocalPropertiesService localPropertiesService, JFrame frame) { - return getFileChooserResults(dataFormat, isSaveDlg, multipleSelect, preselectedName, localPropertiesService, frame, null); + private boolean shouldAddConflictingRecords(List listConflictingRecords, String importedFileName) { + + if ( !listConflictingRecords.isEmpty() ) { + + Object[] options = {Messages.getString("ImportXMLDialogProcessMonitor.1"), Messages.getString("ImportXMLDialogProcessMonitor.2")}; + + final int selectedOption = JOptionPane.showOptionDialog(null, + + "" //$NON-NLS-1$ + + "" + importedFileName + " :
" //$NON-NLS-1$ //$NON-NLS-2$ + + Messages.getString("CollectEarthWindow.9") //$NON-NLS-1$ + + "
" //$NON-NLS-1$ + + Messages.getString("CollectEarthWindow.20") + listConflictingRecords.size() //$NON-NLS-1$ + + "
" //$NON-NLS-1$ + + Messages.getString("CollectEarthWindow.25") //$NON-NLS-1$ + + "
" //$NON-NLS-1$ + + "" //$NON-NLS-1$ + + Messages.getString("CollectEarthWindow.39") //$NON-NLS-1$ + + "" //$NON-NLS-1$ + + "", //$NON-NLS-1$ + + Messages.getString("CollectEarthWindow.43"), //$NON-NLS-1$ + + JOptionPane.YES_NO_OPTION, + JOptionPane.QUESTION_MESSAGE, + null, //do not use a custom Icon + options, //the titles of buttons + options[1] //default button title + ); + + return (selectedOption == JOptionPane.YES_OPTION); + } else { + return false; + } } - public static File[] getFileChooserResults(final DataFormat dataFormat, boolean isSaveDlg, boolean multipleSelect, String preselectedName, LocalPropertiesService localPropertiesService, JFrame frame, File preSelectedFolder) { + public synchronized void startImport(final XMLDataImportProcess importProcess, final JFrame parentFrame, + final DataImportExportService dataImportService, final File importedFile ) throws Exception { + + try { + + SwingUtilities.invokeLater( () -> { - JFileChooser fc ; + progressMonitor = new InfiniteProgressMonitor(parentFrame, Messages.getString("ImportDialogProcessMonitor.8") + "(" //$NON-NLS-1$ //$NON-NLS-2$ + + importedFile.getName() + ")", Messages.getString("ImportDialogProcessMonitor.11") + Messages.getString("ImportDialogProcessMonitor.0")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + progressMonitor.showLater(); + + if (progressMonitor != null && progressMonitor.isUserCancelled()) { + + Toolkit.getDefaultToolkit().beep(); + importProcess.cancel(); + logger.warn("Import Task canceled.\n"); //$NON-NLS-1$ - if( preSelectedFolder == null ){ - String lastUsedFolder = localPropertiesService.getValue( EarthProperty.LAST_USED_FOLDER ); - if( !StringUtils.isBlank( lastUsedFolder ) ){ - preSelectedFolder = new File( lastUsedFolder ); - if( !preSelectedFolder.exists()){ - preSelectedFolder = null; } } - } + ); + + File definitiveFileToImport = importedFile; + // If the file is exported from Collect rather than a XML export from Collect Earth + if( isCollectDataExport( definitiveFileToImport ) ){ + // Transform the file to a Collect Earth type of format + definitiveFileToImport = transformCollectDataFile( definitiveFileToImport ); + if( definitiveFileToImport == null ) return; // there was a problem with the file to import, execute finally + importProcess.setFile( definitiveFileToImport ); + } - fc = new JFileChooserExistsAware( preSelectedFolder ); + importProcess.callAndObserve( this ); - if( preselectedName != null ){ - File selectedFile = new File( fc.getCurrentDirectory().getAbsolutePath() + File.separatorChar + preselectedName ); - fc.setSelectedFile( selectedFile ); - } + if (importProcess.getSummary() != null && !importProcess.getState().isCancelled()) { - fc.setMultiSelectionEnabled( multipleSelect ); + final List conflictingRecords = importProcess.getSummary().getConflictingRecords(); - File[] selectedFiles = null; - FileFilter addedFilter = getFileFilter(dataFormat); - fc.addChoosableFileFilter(addedFilter); + if ( + conflictingRecords != null + && + !conflictingRecords.isEmpty() + && + !shouldAddConflictingRecords(conflictingRecords, definitiveFileToImport.getName()) + ) { + conflictingRecords.clear(); + } + final int totalRecords = ( conflictingRecords==null?0:conflictingRecords.size() ) + importProcess.getSummary().getRecordsToImport().size(); + SwingUtilities.invokeLater( () -> + progressMonitor.setMessage( Messages.getString("ImportDialogProcessMonitor.11") + totalRecords ) //$NON-NLS-1$ + ); - fc.setAcceptAllFileFilterUsed(true); - // Set the added file filter as the default chose filter - fc.setFileFilter(addedFilter); + dataImportService.importRecordsFrom(definitiveFileToImport, importProcess, conflictingRecords ); - // Handle open button action. - int returnVal ; - if( isSaveDlg ){ - returnVal = fc.showSaveDialog( frame ); - }else{ - returnVal = fc.showOpenDialog( frame); + } + } finally { + closeProgressmonitor(); } - if ( returnVal == JFileChooser.APPROVE_OPTION) { + } - if( multipleSelect ){ - selectedFiles = fc.getSelectedFiles(); - }else{ - selectedFiles = new File[]{fc.getSelectedFile()}; - } - - if( selectedFiles != null && selectedFiles.length > 0 ) { - if( isSaveDlg ){ - String fileName = selectedFiles[0].getAbsolutePath(); - - String fileExtension = null; - - if( fileName.lastIndexOf('.') != -1){ - fileExtension = fileName.substring( fileName.lastIndexOf('.') + 1 ).toLowerCase(); - } - - // If the chose file has no extension or the extension is not one of the default extensions for the dataformat - if ( fileExtension == null || Arrays.binarySearch( dataFormat.getPossibleFileExtensions(), fileExtension ) < 0 ) { //$NON-NLS-1$ - fileName += "." + dataFormat.getDefaultExtension(); //$NON-NLS-1$ - selectedFiles[0] = new File(fileName); - } + + private boolean isCollectDataExport(File importedFile) { + return importedFile.getName().endsWith(".collect-data"); + } + + private File transformCollectDataFile(File zipWithXml) throws ZipException, IOException { + + Random random; + File dst = null; + try { + random = SecureRandom.getInstanceStrong(); + + // Originally the collect-data file will look like this: + // root: idml.xml + // root : data (folder) + // root : data/1 (folder) + // the XML files will be under the data + File tempFolder = null; + try (ZipFile src = new ZipFile( zipWithXml )){ + tempFolder = Files.createTempDirectory("tempCE").toFile(); + src.extractAll( tempFolder.getAbsolutePath() ); + + + dst = new File( tempFolder.getParentFile(), "transform" + random.nextInt() + ".zip"); + dst.deleteOnExit(); + + String surveyDefinitonName = "idml.xml"; + File definition = new File(tempFolder, surveyDefinitonName); + + try( ZipFile transformedCollectData = CollectEarthUtils.addFileToZip(dst , definition , surveyDefinitonName) ){ + addStepToZip(tempFolder, transformedCollectData, "1"); + addStepToZip(tempFolder, transformedCollectData, "2"); + addStepToZip(tempFolder, transformedCollectData, "3"); } - - localPropertiesService.setValue(EarthProperty.LAST_USED_FOLDER, selectedFiles[0].getParent()); + } finally { + FileUtils.deleteQuietly(tempFolder); } + } catch (Exception e) { + logger.error( "Error importing data", e); + } + return dst; + } - } - return selectedFiles; + private void addStepToZip(File tempFolder, ZipFile dstZipFile, String step) + throws ZipException { + File folderToZip = new File( tempFolder, "data"+ File.separator+step); + CollectEarthUtils.addFolderToZip(dstZipFile, folderToZip); } - private static FileFilter getFileFilter(final DataFormat dataFormat) { - return new FileFilter() { - - @Override - public boolean accept(File f) { - - String[] extensions = dataFormat.getPossibleFileExtensions(); - boolean acceptedFile = false; - boolean isFolder = f.isDirectory(); - if( isFolder ){ - acceptedFile = true; - }else{ - - for (String fileExtension : extensions) { - if( f.getName().toLowerCase().endsWith("." + fileExtension ) ){ //$NON-NLS-1$ - acceptedFile = true; - break; - } - } - } + @Override + public void update(Observable o, Object arg) { - return acceptedFile; - } + SwingUtilities.invokeLater( () -> { + DataImportState importState = (DataImportState) o ; + progressMonitor.setMessage( Messages.getString("ImportDialogProcessMonitor.2") ); //$NON-NLS-1$ + progressMonitor.updateProgress( importState.getCount(), importState.getTotal()); + } ); - @Override - public String getDescription() { - return dataFormat.getDescription(); - } - }; } } From 02bcbb917e241e19e4eb6cf2912f7a999e6a07a6 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:30 +0100 Subject: [PATCH 0338/1620] New translations ImportXMLDialogProcessMonitor.java (Spanish) --- .../earth/app/view/Messages_es.properties | 202 +++++++++++++++--- 1 file changed, 178 insertions(+), 24 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 68af760ca4..ab7f149d0c 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,46 +1,200 @@ package org.openforis.collect.earth.app.view; +import java.awt.Toolkit; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.security.SecureRandom; +import java.util.List; +import java.util.Observable; +import java.util.Observer; +import java.util.Random; + import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.ProgressMonitor; import javax.swing.SwingUtilities; -import org.openforis.collect.io.ReferenceDataImportStatus; -import org.openforis.collect.io.metadata.parsing.ParsingError; -import org.openforis.collect.manager.process.AbstractProcess; +import org.apache.commons.io.FileUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.DataImportExportService; +import org.openforis.collect.io.data.DataImportState; +import org.openforis.collect.io.data.DataImportSummaryItem; +import org.openforis.collect.io.data.XMLDataImportProcess; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.exception.ZipException; -public class ImportProcessMonitorDialog extends ProcessMonitorDialog> { +public class ImportXMLDialogProcessMonitor implements Observer{ - private JFrame parentFrame; + private static final Logger logger = LoggerFactory.getLogger(ImportXMLDialogProcessMonitor.class); + private InfiniteProgressMonitor progressMonitor; - public ImportProcessMonitorDialog(AbstractProcess> importProcess, JFrame parentFrame ) { - super(); - this.process = importProcess; - this.parentFrame = parentFrame; + public void closeProgressmonitor() { + SwingUtilities.invokeLater( () -> { - progressMonitor = new ProgressMonitor(parentFrame, Messages.getString("ExportDialogProcessMonitor.0"), Messages.getString("ExportDialogProcessMonitor.1"), 0, 100); //$NON-NLS-1$ //$NON-NLS-2$ - progressMonitor.setMillisToPopup(1000); + if (progressMonitor != null) { + progressMonitor.close(); + } } ); } - protected String getProcessActionMessage() { - return Messages.getString("ImportProcessMonitorDialog.0"); //$NON-NLS-1$ + private boolean shouldAddConflictingRecords(List listConflictingRecords, String importedFileName) { + + if ( !listConflictingRecords.isEmpty() ) { + + Object[] options = {Messages.getString("ImportXMLDialogProcessMonitor.1"), Messages.getString("ImportXMLDialogProcessMonitor.2")}; + + final int selectedOption = JOptionPane.showOptionDialog(null, + + "" //$NON-NLS-1$ + + "" + importedFileName + " :
" //$NON-NLS-1$ //$NON-NLS-2$ + + Messages.getString("CollectEarthWindow.9") //$NON-NLS-1$ + + "
" //$NON-NLS-1$ + + Messages.getString("CollectEarthWindow.20") + listConflictingRecords.size() //$NON-NLS-1$ + + "
" //$NON-NLS-1$ + + Messages.getString("CollectEarthWindow.25") //$NON-NLS-1$ + + "
" //$NON-NLS-1$ + + "" //$NON-NLS-1$ + + Messages.getString("CollectEarthWindow.39") //$NON-NLS-1$ + + "" //$NON-NLS-1$ + + "", //$NON-NLS-1$ + + Messages.getString("CollectEarthWindow.43"), //$NON-NLS-1$ + + JOptionPane.YES_NO_OPTION, + JOptionPane.QUESTION_MESSAGE, + null, //do not use a custom Icon + options, //the titles of buttons + options[1] //default button title + ); + + return (selectedOption == JOptionPane.YES_OPTION); + } else { + return false; + } } - - - @Override - public void run() { + public synchronized void startImport(final XMLDataImportProcess importProcess, final JFrame parentFrame, + final DataImportExportService dataImportService, final File importedFile ) throws Exception { + + try { + + SwingUtilities.invokeLater( () -> { + + progressMonitor = new InfiniteProgressMonitor(parentFrame, Messages.getString("ImportDialogProcessMonitor.8") + "(" //$NON-NLS-1$ //$NON-NLS-2$ + + importedFile.getName() + ")", Messages.getString("ImportDialogProcessMonitor.11") + Messages.getString("ImportDialogProcessMonitor.0")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + progressMonitor.showLater(); + + if (progressMonitor != null && progressMonitor.isUserCancelled()) { + + Toolkit.getDefaultToolkit().beep(); + importProcess.cancel(); + logger.warn("Import Task canceled.\n"); //$NON-NLS-1$ + + } + } + ); + + File definitiveFileToImport = importedFile; + // If the file is exported from Collect rather than a XML export from Collect Earth + if( isCollectDataExport( definitiveFileToImport ) ){ + // Transform the file to a Collect Earth type of format + definitiveFileToImport = transformCollectDataFile( definitiveFileToImport ); + if( definitiveFileToImport == null ) return; // there was a problem with the file to import, execute finally + importProcess.setFile( definitiveFileToImport ); + } + + importProcess.callAndObserve( this ); + + if (importProcess.getSummary() != null && !importProcess.getState().isCancelled()) { + + final List conflictingRecords = importProcess.getSummary().getConflictingRecords(); + + if ( + conflictingRecords != null + && + !conflictingRecords.isEmpty() + && + !shouldAddConflictingRecords(conflictingRecords, definitiveFileToImport.getName()) + ) { + conflictingRecords.clear(); + } + final int totalRecords = ( conflictingRecords==null?0:conflictingRecords.size() ) + importProcess.getSummary().getRecordsToImport().size(); + SwingUtilities.invokeLater( () -> + progressMonitor.setMessage( Messages.getString("ImportDialogProcessMonitor.11") + totalRecords ) //$NON-NLS-1$ + ); + + dataImportService.importRecordsFrom(definitiveFileToImport, importProcess, conflictingRecords ); + + } + } finally { + closeProgressmonitor(); + } + + } + + + private boolean isCollectDataExport(File importedFile) { + return importedFile.getName().endsWith(".collect-data"); + } + + private File transformCollectDataFile(File zipWithXml) throws ZipException, IOException { + + Random random; + File dst = null; try { - monitorProgress(); - process.call(); - if( process.getStatus().isComplete() ) { - JOptionPane.showMessageDialog( parentFrame, "Update finished", "CSV Update", JOptionPane.INFORMATION_MESSAGE); + random = SecureRandom.getInstanceStrong(); + + // Originally the collect-data file will look like this: + // root: idml.xml + // root : data (folder) + // root : data/1 (folder) + // the XML files will be under the data + File tempFolder = null; + try (ZipFile src = new ZipFile( zipWithXml )){ + tempFolder = Files.createTempDirectory("tempCE").toFile(); + src.extractAll( tempFolder.getAbsolutePath() ); + + + dst = new File( tempFolder.getParentFile(), "transform" + random.nextInt() + ".zip"); + dst.deleteOnExit(); + + String surveyDefinitonName = "idml.xml"; + File definition = new File(tempFolder, surveyDefinitonName); + + try( ZipFile transformedCollectData = CollectEarthUtils.addFileToZip(dst , definition , surveyDefinitonName) ){ + addStepToZip(tempFolder, transformedCollectData, "1"); + addStepToZip(tempFolder, transformedCollectData, "2"); + addStepToZip(tempFolder, transformedCollectData, "3"); + } + } finally { + FileUtils.deleteQuietly(tempFolder); } - } catch (final Exception e) { - logger.error("Error starting the process", e); //$NON-NLS-1$ + } catch (Exception e) { + logger.error( "Error importing data", e); } + return dst; + } + + + private void addStepToZip(File tempFolder, ZipFile dstZipFile, String step) + throws ZipException { + File folderToZip = new File( tempFolder, "data"+ File.separator+step); + CollectEarthUtils.addFolderToZip(dstZipFile, folderToZip); + } + + @Override + public void update(Observable o, Object arg) { + + SwingUtilities.invokeLater( () -> { + DataImportState importState = (DataImportState) o ; + progressMonitor.setMessage( Messages.getString("ImportDialogProcessMonitor.2") ); //$NON-NLS-1$ + progressMonitor.updateProgress( importState.getCount(), importState.getTotal()); + } ); } From 3dfbd4f18fcbca5bd15ed26bc9de36925fd4afe4 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:31 +0100 Subject: [PATCH 0339/1620] New translations ImportXMLDialogProcessMonitor.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 202 +++++++++++++++--- 1 file changed, 178 insertions(+), 24 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 68af760ca4..ab7f149d0c 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,46 +1,200 @@ package org.openforis.collect.earth.app.view; +import java.awt.Toolkit; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.security.SecureRandom; +import java.util.List; +import java.util.Observable; +import java.util.Observer; +import java.util.Random; + import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.ProgressMonitor; import javax.swing.SwingUtilities; -import org.openforis.collect.io.ReferenceDataImportStatus; -import org.openforis.collect.io.metadata.parsing.ParsingError; -import org.openforis.collect.manager.process.AbstractProcess; +import org.apache.commons.io.FileUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.DataImportExportService; +import org.openforis.collect.io.data.DataImportState; +import org.openforis.collect.io.data.DataImportSummaryItem; +import org.openforis.collect.io.data.XMLDataImportProcess; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.exception.ZipException; -public class ImportProcessMonitorDialog extends ProcessMonitorDialog> { +public class ImportXMLDialogProcessMonitor implements Observer{ - private JFrame parentFrame; + private static final Logger logger = LoggerFactory.getLogger(ImportXMLDialogProcessMonitor.class); + private InfiniteProgressMonitor progressMonitor; - public ImportProcessMonitorDialog(AbstractProcess> importProcess, JFrame parentFrame ) { - super(); - this.process = importProcess; - this.parentFrame = parentFrame; + public void closeProgressmonitor() { + SwingUtilities.invokeLater( () -> { - progressMonitor = new ProgressMonitor(parentFrame, Messages.getString("ExportDialogProcessMonitor.0"), Messages.getString("ExportDialogProcessMonitor.1"), 0, 100); //$NON-NLS-1$ //$NON-NLS-2$ - progressMonitor.setMillisToPopup(1000); + if (progressMonitor != null) { + progressMonitor.close(); + } } ); } - protected String getProcessActionMessage() { - return Messages.getString("ImportProcessMonitorDialog.0"); //$NON-NLS-1$ + private boolean shouldAddConflictingRecords(List listConflictingRecords, String importedFileName) { + + if ( !listConflictingRecords.isEmpty() ) { + + Object[] options = {Messages.getString("ImportXMLDialogProcessMonitor.1"), Messages.getString("ImportXMLDialogProcessMonitor.2")}; + + final int selectedOption = JOptionPane.showOptionDialog(null, + + "" //$NON-NLS-1$ + + "" + importedFileName + " :
" //$NON-NLS-1$ //$NON-NLS-2$ + + Messages.getString("CollectEarthWindow.9") //$NON-NLS-1$ + + "
" //$NON-NLS-1$ + + Messages.getString("CollectEarthWindow.20") + listConflictingRecords.size() //$NON-NLS-1$ + + "
" //$NON-NLS-1$ + + Messages.getString("CollectEarthWindow.25") //$NON-NLS-1$ + + "
" //$NON-NLS-1$ + + "" //$NON-NLS-1$ + + Messages.getString("CollectEarthWindow.39") //$NON-NLS-1$ + + "" //$NON-NLS-1$ + + "", //$NON-NLS-1$ + + Messages.getString("CollectEarthWindow.43"), //$NON-NLS-1$ + + JOptionPane.YES_NO_OPTION, + JOptionPane.QUESTION_MESSAGE, + null, //do not use a custom Icon + options, //the titles of buttons + options[1] //default button title + ); + + return (selectedOption == JOptionPane.YES_OPTION); + } else { + return false; + } } - - - @Override - public void run() { + public synchronized void startImport(final XMLDataImportProcess importProcess, final JFrame parentFrame, + final DataImportExportService dataImportService, final File importedFile ) throws Exception { + + try { + + SwingUtilities.invokeLater( () -> { + + progressMonitor = new InfiniteProgressMonitor(parentFrame, Messages.getString("ImportDialogProcessMonitor.8") + "(" //$NON-NLS-1$ //$NON-NLS-2$ + + importedFile.getName() + ")", Messages.getString("ImportDialogProcessMonitor.11") + Messages.getString("ImportDialogProcessMonitor.0")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + progressMonitor.showLater(); + + if (progressMonitor != null && progressMonitor.isUserCancelled()) { + + Toolkit.getDefaultToolkit().beep(); + importProcess.cancel(); + logger.warn("Import Task canceled.\n"); //$NON-NLS-1$ + + } + } + ); + + File definitiveFileToImport = importedFile; + // If the file is exported from Collect rather than a XML export from Collect Earth + if( isCollectDataExport( definitiveFileToImport ) ){ + // Transform the file to a Collect Earth type of format + definitiveFileToImport = transformCollectDataFile( definitiveFileToImport ); + if( definitiveFileToImport == null ) return; // there was a problem with the file to import, execute finally + importProcess.setFile( definitiveFileToImport ); + } + + importProcess.callAndObserve( this ); + + if (importProcess.getSummary() != null && !importProcess.getState().isCancelled()) { + + final List conflictingRecords = importProcess.getSummary().getConflictingRecords(); + + if ( + conflictingRecords != null + && + !conflictingRecords.isEmpty() + && + !shouldAddConflictingRecords(conflictingRecords, definitiveFileToImport.getName()) + ) { + conflictingRecords.clear(); + } + final int totalRecords = ( conflictingRecords==null?0:conflictingRecords.size() ) + importProcess.getSummary().getRecordsToImport().size(); + SwingUtilities.invokeLater( () -> + progressMonitor.setMessage( Messages.getString("ImportDialogProcessMonitor.11") + totalRecords ) //$NON-NLS-1$ + ); + + dataImportService.importRecordsFrom(definitiveFileToImport, importProcess, conflictingRecords ); + + } + } finally { + closeProgressmonitor(); + } + + } + + + private boolean isCollectDataExport(File importedFile) { + return importedFile.getName().endsWith(".collect-data"); + } + + private File transformCollectDataFile(File zipWithXml) throws ZipException, IOException { + + Random random; + File dst = null; try { - monitorProgress(); - process.call(); - if( process.getStatus().isComplete() ) { - JOptionPane.showMessageDialog( parentFrame, "Update finished", "CSV Update", JOptionPane.INFORMATION_MESSAGE); + random = SecureRandom.getInstanceStrong(); + + // Originally the collect-data file will look like this: + // root: idml.xml + // root : data (folder) + // root : data/1 (folder) + // the XML files will be under the data + File tempFolder = null; + try (ZipFile src = new ZipFile( zipWithXml )){ + tempFolder = Files.createTempDirectory("tempCE").toFile(); + src.extractAll( tempFolder.getAbsolutePath() ); + + + dst = new File( tempFolder.getParentFile(), "transform" + random.nextInt() + ".zip"); + dst.deleteOnExit(); + + String surveyDefinitonName = "idml.xml"; + File definition = new File(tempFolder, surveyDefinitonName); + + try( ZipFile transformedCollectData = CollectEarthUtils.addFileToZip(dst , definition , surveyDefinitonName) ){ + addStepToZip(tempFolder, transformedCollectData, "1"); + addStepToZip(tempFolder, transformedCollectData, "2"); + addStepToZip(tempFolder, transformedCollectData, "3"); + } + } finally { + FileUtils.deleteQuietly(tempFolder); } - } catch (final Exception e) { - logger.error("Error starting the process", e); //$NON-NLS-1$ + } catch (Exception e) { + logger.error( "Error importing data", e); } + return dst; + } + + + private void addStepToZip(File tempFolder, ZipFile dstZipFile, String step) + throws ZipException { + File folderToZip = new File( tempFolder, "data"+ File.separator+step); + CollectEarthUtils.addFolderToZip(dstZipFile, folderToZip); + } + + @Override + public void update(Observable o, Object arg) { + + SwingUtilities.invokeLater( () -> { + DataImportState importState = (DataImportState) o ; + progressMonitor.setMessage( Messages.getString("ImportDialogProcessMonitor.2") ); //$NON-NLS-1$ + progressMonitor.updateProgress( importState.getCount(), importState.getTotal()); + } ); } From dde331ddf97ec8527bd894a43f8383bf9239a6d3 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:32 +0100 Subject: [PATCH 0340/1620] New translations ImportXMLDialogProcessMonitor.java (English) --- .../earth/app/view/Messages_en.properties | 202 +++++++++++++++--- 1 file changed, 178 insertions(+), 24 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 68af760ca4..ab7f149d0c 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,46 +1,200 @@ package org.openforis.collect.earth.app.view; +import java.awt.Toolkit; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.security.SecureRandom; +import java.util.List; +import java.util.Observable; +import java.util.Observer; +import java.util.Random; + import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.ProgressMonitor; import javax.swing.SwingUtilities; -import org.openforis.collect.io.ReferenceDataImportStatus; -import org.openforis.collect.io.metadata.parsing.ParsingError; -import org.openforis.collect.manager.process.AbstractProcess; +import org.apache.commons.io.FileUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.DataImportExportService; +import org.openforis.collect.io.data.DataImportState; +import org.openforis.collect.io.data.DataImportSummaryItem; +import org.openforis.collect.io.data.XMLDataImportProcess; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.exception.ZipException; -public class ImportProcessMonitorDialog extends ProcessMonitorDialog> { +public class ImportXMLDialogProcessMonitor implements Observer{ - private JFrame parentFrame; + private static final Logger logger = LoggerFactory.getLogger(ImportXMLDialogProcessMonitor.class); + private InfiniteProgressMonitor progressMonitor; - public ImportProcessMonitorDialog(AbstractProcess> importProcess, JFrame parentFrame ) { - super(); - this.process = importProcess; - this.parentFrame = parentFrame; + public void closeProgressmonitor() { + SwingUtilities.invokeLater( () -> { - progressMonitor = new ProgressMonitor(parentFrame, Messages.getString("ExportDialogProcessMonitor.0"), Messages.getString("ExportDialogProcessMonitor.1"), 0, 100); //$NON-NLS-1$ //$NON-NLS-2$ - progressMonitor.setMillisToPopup(1000); + if (progressMonitor != null) { + progressMonitor.close(); + } } ); } - protected String getProcessActionMessage() { - return Messages.getString("ImportProcessMonitorDialog.0"); //$NON-NLS-1$ + private boolean shouldAddConflictingRecords(List listConflictingRecords, String importedFileName) { + + if ( !listConflictingRecords.isEmpty() ) { + + Object[] options = {Messages.getString("ImportXMLDialogProcessMonitor.1"), Messages.getString("ImportXMLDialogProcessMonitor.2")}; + + final int selectedOption = JOptionPane.showOptionDialog(null, + + "" //$NON-NLS-1$ + + "" + importedFileName + " :
" //$NON-NLS-1$ //$NON-NLS-2$ + + Messages.getString("CollectEarthWindow.9") //$NON-NLS-1$ + + "
" //$NON-NLS-1$ + + Messages.getString("CollectEarthWindow.20") + listConflictingRecords.size() //$NON-NLS-1$ + + "
" //$NON-NLS-1$ + + Messages.getString("CollectEarthWindow.25") //$NON-NLS-1$ + + "
" //$NON-NLS-1$ + + "" //$NON-NLS-1$ + + Messages.getString("CollectEarthWindow.39") //$NON-NLS-1$ + + "" //$NON-NLS-1$ + + "", //$NON-NLS-1$ + + Messages.getString("CollectEarthWindow.43"), //$NON-NLS-1$ + + JOptionPane.YES_NO_OPTION, + JOptionPane.QUESTION_MESSAGE, + null, //do not use a custom Icon + options, //the titles of buttons + options[1] //default button title + ); + + return (selectedOption == JOptionPane.YES_OPTION); + } else { + return false; + } } - - - @Override - public void run() { + public synchronized void startImport(final XMLDataImportProcess importProcess, final JFrame parentFrame, + final DataImportExportService dataImportService, final File importedFile ) throws Exception { + + try { + + SwingUtilities.invokeLater( () -> { + + progressMonitor = new InfiniteProgressMonitor(parentFrame, Messages.getString("ImportDialogProcessMonitor.8") + "(" //$NON-NLS-1$ //$NON-NLS-2$ + + importedFile.getName() + ")", Messages.getString("ImportDialogProcessMonitor.11") + Messages.getString("ImportDialogProcessMonitor.0")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + progressMonitor.showLater(); + + if (progressMonitor != null && progressMonitor.isUserCancelled()) { + + Toolkit.getDefaultToolkit().beep(); + importProcess.cancel(); + logger.warn("Import Task canceled.\n"); //$NON-NLS-1$ + + } + } + ); + + File definitiveFileToImport = importedFile; + // If the file is exported from Collect rather than a XML export from Collect Earth + if( isCollectDataExport( definitiveFileToImport ) ){ + // Transform the file to a Collect Earth type of format + definitiveFileToImport = transformCollectDataFile( definitiveFileToImport ); + if( definitiveFileToImport == null ) return; // there was a problem with the file to import, execute finally + importProcess.setFile( definitiveFileToImport ); + } + + importProcess.callAndObserve( this ); + + if (importProcess.getSummary() != null && !importProcess.getState().isCancelled()) { + + final List conflictingRecords = importProcess.getSummary().getConflictingRecords(); + + if ( + conflictingRecords != null + && + !conflictingRecords.isEmpty() + && + !shouldAddConflictingRecords(conflictingRecords, definitiveFileToImport.getName()) + ) { + conflictingRecords.clear(); + } + final int totalRecords = ( conflictingRecords==null?0:conflictingRecords.size() ) + importProcess.getSummary().getRecordsToImport().size(); + SwingUtilities.invokeLater( () -> + progressMonitor.setMessage( Messages.getString("ImportDialogProcessMonitor.11") + totalRecords ) //$NON-NLS-1$ + ); + + dataImportService.importRecordsFrom(definitiveFileToImport, importProcess, conflictingRecords ); + + } + } finally { + closeProgressmonitor(); + } + + } + + + private boolean isCollectDataExport(File importedFile) { + return importedFile.getName().endsWith(".collect-data"); + } + + private File transformCollectDataFile(File zipWithXml) throws ZipException, IOException { + + Random random; + File dst = null; try { - monitorProgress(); - process.call(); - if( process.getStatus().isComplete() ) { - JOptionPane.showMessageDialog( parentFrame, "Update finished", "CSV Update", JOptionPane.INFORMATION_MESSAGE); + random = SecureRandom.getInstanceStrong(); + + // Originally the collect-data file will look like this: + // root: idml.xml + // root : data (folder) + // root : data/1 (folder) + // the XML files will be under the data + File tempFolder = null; + try (ZipFile src = new ZipFile( zipWithXml )){ + tempFolder = Files.createTempDirectory("tempCE").toFile(); + src.extractAll( tempFolder.getAbsolutePath() ); + + + dst = new File( tempFolder.getParentFile(), "transform" + random.nextInt() + ".zip"); + dst.deleteOnExit(); + + String surveyDefinitonName = "idml.xml"; + File definition = new File(tempFolder, surveyDefinitonName); + + try( ZipFile transformedCollectData = CollectEarthUtils.addFileToZip(dst , definition , surveyDefinitonName) ){ + addStepToZip(tempFolder, transformedCollectData, "1"); + addStepToZip(tempFolder, transformedCollectData, "2"); + addStepToZip(tempFolder, transformedCollectData, "3"); + } + } finally { + FileUtils.deleteQuietly(tempFolder); } - } catch (final Exception e) { - logger.error("Error starting the process", e); //$NON-NLS-1$ + } catch (Exception e) { + logger.error( "Error importing data", e); } + return dst; + } + + + private void addStepToZip(File tempFolder, ZipFile dstZipFile, String step) + throws ZipException { + File folderToZip = new File( tempFolder, "data"+ File.separator+step); + CollectEarthUtils.addFolderToZip(dstZipFile, folderToZip); + } + + @Override + public void update(Observable o, Object arg) { + + SwingUtilities.invokeLater( () -> { + DataImportState importState = (DataImportState) o ; + progressMonitor.setMessage( Messages.getString("ImportDialogProcessMonitor.2") ); //$NON-NLS-1$ + progressMonitor.updateProgress( importState.getCount(), importState.getTotal()); + } ); } From d2a00689bf918bd32410b891cb9da0a3b24e5998 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:33 +0100 Subject: [PATCH 0341/1620] New translations InfiniteProgressMonitor.java (French) --- .../earth/app/view/Messages_fr.properties | 268 ++++++++---------- 1 file changed, 120 insertions(+), 148 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index ab7f149d0c..ca537bed7a 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,201 +1,173 @@ package org.openforis.collect.earth.app.view; -import java.awt.Toolkit; -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.security.SecureRandom; -import java.util.List; -import java.util.Observable; -import java.util.Observer; -import java.util.Random; - -import javax.swing.JFrame; +import java.awt.Component; + +import javax.swing.JDialog; +import javax.swing.JLabel; import javax.swing.JOptionPane; +import javax.swing.JProgressBar; import javax.swing.SwingUtilities; -import org.apache.commons.io.FileUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.DataImportExportService; -import org.openforis.collect.io.data.DataImportState; -import org.openforis.collect.io.data.DataImportSummaryItem; -import org.openforis.collect.io.data.XMLDataImportProcess; +import org.apache.commons.lang3.StringUtils; +import org.openforis.concurrency.Progress; +import org.openforis.concurrency.ProgressListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import net.lingala.zip4j.ZipFile; -import net.lingala.zip4j.exception.ZipException; - -public class ImportXMLDialogProcessMonitor implements Observer{ +public class InfiniteProgressMonitor implements ProgressListener { - private static final Logger logger = LoggerFactory.getLogger(ImportXMLDialogProcessMonitor.class); - private InfiniteProgressMonitor progressMonitor; + JDialog infiniteWaitingDialog; + private boolean userCancelled = false; - public void closeProgressmonitor() { - - SwingUtilities.invokeLater( () -> { - if (progressMonitor != null) { - progressMonitor.close(); - } - } ); - } + private JDialog dialog; - private boolean shouldAddConflictingRecords(List listConflictingRecords, String importedFileName) { + private JOptionPane pane; - if ( !listConflictingRecords.isEmpty() ) { + private String cancelOption; - Object[] options = {Messages.getString("ImportXMLDialogProcessMonitor.1"), Messages.getString("ImportXMLDialogProcessMonitor.2")}; + private JLabel label; - final int selectedOption = JOptionPane.showOptionDialog(null, + JProgressBar infiniteProgress; + + private Logger logger = LoggerFactory.getLogger( InfiniteProgressMonitor.class ); + + public InfiniteProgressMonitor(Component parentFrame, String title, String message) { - "" //$NON-NLS-1$ - + "" + importedFileName + " :
" //$NON-NLS-1$ //$NON-NLS-2$ - + Messages.getString("CollectEarthWindow.9") //$NON-NLS-1$ - + "
" //$NON-NLS-1$ - + Messages.getString("CollectEarthWindow.20") + listConflictingRecords.size() //$NON-NLS-1$ - + "
" //$NON-NLS-1$ - + Messages.getString("CollectEarthWindow.25") //$NON-NLS-1$ - + "
" //$NON-NLS-1$ - + "" //$NON-NLS-1$ - + Messages.getString("CollectEarthWindow.39") //$NON-NLS-1$ - + "" //$NON-NLS-1$ - + "", //$NON-NLS-1$ + infiniteProgress = new JProgressBar(); + infiniteProgress.setIndeterminate(true); + label = new JLabel(message); - Messages.getString("CollectEarthWindow.43"), //$NON-NLS-1$ + final Object[] dialogItems = { label, infiniteProgress }; - JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE, - null, //do not use a custom Icon - options, //the titles of buttons - options[1] //default button title - ); + cancelOption = Messages.getString("InfiniteProgressMonitor.0"); //$NON-NLS-1$ + final Object[] options = { cancelOption }; + setPane(new JOptionPane(dialogItems, JOptionPane.PLAIN_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, + options)); + setDialog(getPane().createDialog(parentFrame, title)); + getDialog().setModal(true); - return (selectedOption == JOptionPane.YES_OPTION); - } else { - return false; - } } - public synchronized void startImport(final XMLDataImportProcess importProcess, final JFrame parentFrame, - final DataImportExportService dataImportService, final File importedFile ) throws Exception { + public void updateProgress(int current, int total) { - try { + updateProgress(current, total, null); - SwingUtilities.invokeLater( () -> { + } + + public void updateProgress(int current, int total, String msg) { + + Runnable updateTask = () -> { + infiniteProgress.setString(current + "/" + total); + if (infiniteProgress.isIndeterminate()) { + infiniteProgress.setIndeterminate(false); + infiniteProgress.setStringPainted(true); + } - progressMonitor = new InfiniteProgressMonitor(parentFrame, Messages.getString("ImportDialogProcessMonitor.8") + "(" //$NON-NLS-1$ //$NON-NLS-2$ - + importedFile.getName() + ")", Messages.getString("ImportDialogProcessMonitor.11") + Messages.getString("ImportDialogProcessMonitor.0")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - progressMonitor.showLater(); + infiniteProgress.setMaximum(total); - if (progressMonitor != null && progressMonitor.isUserCancelled()) { + infiniteProgress.setValue(current); + if( StringUtils.isNotBlank( msg )) + setMessage( msg ); + }; + + SwingUtilities.invokeLater( updateTask ); - Toolkit.getDefaultToolkit().beep(); - importProcess.cancel(); - logger.warn("Import Task canceled.\n"); //$NON-NLS-1$ + } - } - } - ); - - File definitiveFileToImport = importedFile; - // If the file is exported from Collect rather than a XML export from Collect Earth - if( isCollectDataExport( definitiveFileToImport ) ){ - // Transform the file to a Collect Earth type of format - definitiveFileToImport = transformCollectDataFile( definitiveFileToImport ); - if( definitiveFileToImport == null ) return; // there was a problem with the file to import, execute finally - importProcess.setFile( definitiveFileToImport ); + public void updateProgress(int currentPercentage) { + Runnable updateTask = () -> { + infiniteProgress.setString(currentPercentage + "%"); + if (infiniteProgress.isIndeterminate()) { + infiniteProgress.setIndeterminate(false); + infiniteProgress.setStringPainted(true); } - importProcess.callAndObserve( this ); + infiniteProgress.setMaximum(100); - if (importProcess.getSummary() != null && !importProcess.getState().isCancelled()) { + infiniteProgress.setValue(currentPercentage); + }; + + SwingUtilities.invokeLater( updateTask ); - final List conflictingRecords = importProcess.getSummary().getConflictingRecords(); - - if ( - conflictingRecords != null - && - !conflictingRecords.isEmpty() - && - !shouldAddConflictingRecords(conflictingRecords, definitiveFileToImport.getName()) - ) { - conflictingRecords.clear(); - } - final int totalRecords = ( conflictingRecords==null?0:conflictingRecords.size() ) + importProcess.getSummary().getRecordsToImport().size(); - SwingUtilities.invokeLater( () -> - progressMonitor.setMessage( Messages.getString("ImportDialogProcessMonitor.11") + totalRecords ) //$NON-NLS-1$ - ); - - dataImportService.importRecordsFrom(definitiveFileToImport, importProcess, conflictingRecords ); - - } - } finally { - closeProgressmonitor(); - } + } + public void setMessage(String msg) { + label.setText(msg); } + public void close() { + SwingUtilities.invokeLater(() -> { + hide(); + getDialog().dispose(); + }); + } - private boolean isCollectDataExport(File importedFile) { - return importedFile.getName().endsWith(".collect-data"); + private JDialog getDialog() { + return dialog; } - private File transformCollectDataFile(File zipWithXml) throws ZipException, IOException { + public void hide() { + getDialog().setVisible(false); + } - Random random; - File dst = null; - try { - random = SecureRandom.getInstanceStrong(); + public boolean isShowing() { + return getDialog().isShowing(); + } - // Originally the collect-data file will look like this: - // root: idml.xml - // root : data (folder) - // root : data/1 (folder) - // the XML files will be under the data - File tempFolder = null; - try (ZipFile src = new ZipFile( zipWithXml )){ - tempFolder = Files.createTempDirectory("tempCE").toFile(); - src.extractAll( tempFolder.getAbsolutePath() ); + public boolean isUserCancelled() { + return userCancelled; + } + private void setDialog(JDialog dialog) { + this.dialog = dialog; + } - dst = new File( tempFolder.getParentFile(), "transform" + random.nextInt() + ".zip"); - dst.deleteOnExit(); + public void setUserCancelled(boolean userCancelled) { + this.userCancelled = userCancelled; + } + + public void show() { + + Runnable showTask = () -> { + getDialog().setVisible(true); + if (getPane().getValue() == null // User closes the dialog + || + getPane().getValue().equals(cancelOption) // User clicks on cancel option + ) { + setUserCancelled(true); + } + }; + SwingUtilities.invokeLater( showTask ); + - String surveyDefinitonName = "idml.xml"; - File definition = new File(tempFolder, surveyDefinitonName); + } - try( ZipFile transformedCollectData = CollectEarthUtils.addFileToZip(dst , definition , surveyDefinitonName) ){ - addStepToZip(tempFolder, transformedCollectData, "1"); - addStepToZip(tempFolder, transformedCollectData, "2"); - addStepToZip(tempFolder, transformedCollectData, "3"); - } - } finally { - FileUtils.deleteQuietly(tempFolder); + public void showLater() { + Runnable showLater = () -> { + getDialog().setVisible(true); + if (getPane().getValue() == null // User closes the dialog + || + getPane().getValue().equals(cancelOption) // User clicks on cancel option + ) { + setUserCancelled(true); } - } catch (Exception e) { - logger.error( "Error importing data", e); - } - return dst; + }; + SwingUtilities.invokeLater( showLater ); + } + private JOptionPane getPane() { + return pane; + } - private void addStepToZip(File tempFolder, ZipFile dstZipFile, String step) - throws ZipException { - File folderToZip = new File( tempFolder, "data"+ File.separator+step); - CollectEarthUtils.addFolderToZip(dstZipFile, folderToZip); + private void setPane(JOptionPane pane) { + this.pane = pane; } @Override - public void update(Observable o, Object arg) { - - SwingUtilities.invokeLater( () -> { - DataImportState importState = (DataImportState) o ; - progressMonitor.setMessage( Messages.getString("ImportDialogProcessMonitor.2") ); //$NON-NLS-1$ - progressMonitor.updateProgress( importState.getCount(), importState.getTotal()); - } ); - + public void progressMade(Progress progress) { + updateProgress((int) progress.getProcessedItems()); } } From 3c7891f5165caf57dd2a8f574a012483c25707c7 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:34 +0100 Subject: [PATCH 0342/1620] New translations InfiniteProgressMonitor.java (Spanish) --- .../earth/app/view/Messages_es.properties | 268 ++++++++---------- 1 file changed, 120 insertions(+), 148 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index ab7f149d0c..ca537bed7a 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,201 +1,173 @@ package org.openforis.collect.earth.app.view; -import java.awt.Toolkit; -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.security.SecureRandom; -import java.util.List; -import java.util.Observable; -import java.util.Observer; -import java.util.Random; - -import javax.swing.JFrame; +import java.awt.Component; + +import javax.swing.JDialog; +import javax.swing.JLabel; import javax.swing.JOptionPane; +import javax.swing.JProgressBar; import javax.swing.SwingUtilities; -import org.apache.commons.io.FileUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.DataImportExportService; -import org.openforis.collect.io.data.DataImportState; -import org.openforis.collect.io.data.DataImportSummaryItem; -import org.openforis.collect.io.data.XMLDataImportProcess; +import org.apache.commons.lang3.StringUtils; +import org.openforis.concurrency.Progress; +import org.openforis.concurrency.ProgressListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import net.lingala.zip4j.ZipFile; -import net.lingala.zip4j.exception.ZipException; - -public class ImportXMLDialogProcessMonitor implements Observer{ +public class InfiniteProgressMonitor implements ProgressListener { - private static final Logger logger = LoggerFactory.getLogger(ImportXMLDialogProcessMonitor.class); - private InfiniteProgressMonitor progressMonitor; + JDialog infiniteWaitingDialog; + private boolean userCancelled = false; - public void closeProgressmonitor() { - - SwingUtilities.invokeLater( () -> { - if (progressMonitor != null) { - progressMonitor.close(); - } - } ); - } + private JDialog dialog; - private boolean shouldAddConflictingRecords(List listConflictingRecords, String importedFileName) { + private JOptionPane pane; - if ( !listConflictingRecords.isEmpty() ) { + private String cancelOption; - Object[] options = {Messages.getString("ImportXMLDialogProcessMonitor.1"), Messages.getString("ImportXMLDialogProcessMonitor.2")}; + private JLabel label; - final int selectedOption = JOptionPane.showOptionDialog(null, + JProgressBar infiniteProgress; + + private Logger logger = LoggerFactory.getLogger( InfiniteProgressMonitor.class ); + + public InfiniteProgressMonitor(Component parentFrame, String title, String message) { - "" //$NON-NLS-1$ - + "" + importedFileName + " :
" //$NON-NLS-1$ //$NON-NLS-2$ - + Messages.getString("CollectEarthWindow.9") //$NON-NLS-1$ - + "
" //$NON-NLS-1$ - + Messages.getString("CollectEarthWindow.20") + listConflictingRecords.size() //$NON-NLS-1$ - + "
" //$NON-NLS-1$ - + Messages.getString("CollectEarthWindow.25") //$NON-NLS-1$ - + "
" //$NON-NLS-1$ - + "" //$NON-NLS-1$ - + Messages.getString("CollectEarthWindow.39") //$NON-NLS-1$ - + "" //$NON-NLS-1$ - + "", //$NON-NLS-1$ + infiniteProgress = new JProgressBar(); + infiniteProgress.setIndeterminate(true); + label = new JLabel(message); - Messages.getString("CollectEarthWindow.43"), //$NON-NLS-1$ + final Object[] dialogItems = { label, infiniteProgress }; - JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE, - null, //do not use a custom Icon - options, //the titles of buttons - options[1] //default button title - ); + cancelOption = Messages.getString("InfiniteProgressMonitor.0"); //$NON-NLS-1$ + final Object[] options = { cancelOption }; + setPane(new JOptionPane(dialogItems, JOptionPane.PLAIN_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, + options)); + setDialog(getPane().createDialog(parentFrame, title)); + getDialog().setModal(true); - return (selectedOption == JOptionPane.YES_OPTION); - } else { - return false; - } } - public synchronized void startImport(final XMLDataImportProcess importProcess, final JFrame parentFrame, - final DataImportExportService dataImportService, final File importedFile ) throws Exception { + public void updateProgress(int current, int total) { - try { + updateProgress(current, total, null); - SwingUtilities.invokeLater( () -> { + } + + public void updateProgress(int current, int total, String msg) { + + Runnable updateTask = () -> { + infiniteProgress.setString(current + "/" + total); + if (infiniteProgress.isIndeterminate()) { + infiniteProgress.setIndeterminate(false); + infiniteProgress.setStringPainted(true); + } - progressMonitor = new InfiniteProgressMonitor(parentFrame, Messages.getString("ImportDialogProcessMonitor.8") + "(" //$NON-NLS-1$ //$NON-NLS-2$ - + importedFile.getName() + ")", Messages.getString("ImportDialogProcessMonitor.11") + Messages.getString("ImportDialogProcessMonitor.0")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - progressMonitor.showLater(); + infiniteProgress.setMaximum(total); - if (progressMonitor != null && progressMonitor.isUserCancelled()) { + infiniteProgress.setValue(current); + if( StringUtils.isNotBlank( msg )) + setMessage( msg ); + }; + + SwingUtilities.invokeLater( updateTask ); - Toolkit.getDefaultToolkit().beep(); - importProcess.cancel(); - logger.warn("Import Task canceled.\n"); //$NON-NLS-1$ + } - } - } - ); - - File definitiveFileToImport = importedFile; - // If the file is exported from Collect rather than a XML export from Collect Earth - if( isCollectDataExport( definitiveFileToImport ) ){ - // Transform the file to a Collect Earth type of format - definitiveFileToImport = transformCollectDataFile( definitiveFileToImport ); - if( definitiveFileToImport == null ) return; // there was a problem with the file to import, execute finally - importProcess.setFile( definitiveFileToImport ); + public void updateProgress(int currentPercentage) { + Runnable updateTask = () -> { + infiniteProgress.setString(currentPercentage + "%"); + if (infiniteProgress.isIndeterminate()) { + infiniteProgress.setIndeterminate(false); + infiniteProgress.setStringPainted(true); } - importProcess.callAndObserve( this ); + infiniteProgress.setMaximum(100); - if (importProcess.getSummary() != null && !importProcess.getState().isCancelled()) { + infiniteProgress.setValue(currentPercentage); + }; + + SwingUtilities.invokeLater( updateTask ); - final List conflictingRecords = importProcess.getSummary().getConflictingRecords(); - - if ( - conflictingRecords != null - && - !conflictingRecords.isEmpty() - && - !shouldAddConflictingRecords(conflictingRecords, definitiveFileToImport.getName()) - ) { - conflictingRecords.clear(); - } - final int totalRecords = ( conflictingRecords==null?0:conflictingRecords.size() ) + importProcess.getSummary().getRecordsToImport().size(); - SwingUtilities.invokeLater( () -> - progressMonitor.setMessage( Messages.getString("ImportDialogProcessMonitor.11") + totalRecords ) //$NON-NLS-1$ - ); - - dataImportService.importRecordsFrom(definitiveFileToImport, importProcess, conflictingRecords ); - - } - } finally { - closeProgressmonitor(); - } + } + public void setMessage(String msg) { + label.setText(msg); } + public void close() { + SwingUtilities.invokeLater(() -> { + hide(); + getDialog().dispose(); + }); + } - private boolean isCollectDataExport(File importedFile) { - return importedFile.getName().endsWith(".collect-data"); + private JDialog getDialog() { + return dialog; } - private File transformCollectDataFile(File zipWithXml) throws ZipException, IOException { + public void hide() { + getDialog().setVisible(false); + } - Random random; - File dst = null; - try { - random = SecureRandom.getInstanceStrong(); + public boolean isShowing() { + return getDialog().isShowing(); + } - // Originally the collect-data file will look like this: - // root: idml.xml - // root : data (folder) - // root : data/1 (folder) - // the XML files will be under the data - File tempFolder = null; - try (ZipFile src = new ZipFile( zipWithXml )){ - tempFolder = Files.createTempDirectory("tempCE").toFile(); - src.extractAll( tempFolder.getAbsolutePath() ); + public boolean isUserCancelled() { + return userCancelled; + } + private void setDialog(JDialog dialog) { + this.dialog = dialog; + } - dst = new File( tempFolder.getParentFile(), "transform" + random.nextInt() + ".zip"); - dst.deleteOnExit(); + public void setUserCancelled(boolean userCancelled) { + this.userCancelled = userCancelled; + } + + public void show() { + + Runnable showTask = () -> { + getDialog().setVisible(true); + if (getPane().getValue() == null // User closes the dialog + || + getPane().getValue().equals(cancelOption) // User clicks on cancel option + ) { + setUserCancelled(true); + } + }; + SwingUtilities.invokeLater( showTask ); + - String surveyDefinitonName = "idml.xml"; - File definition = new File(tempFolder, surveyDefinitonName); + } - try( ZipFile transformedCollectData = CollectEarthUtils.addFileToZip(dst , definition , surveyDefinitonName) ){ - addStepToZip(tempFolder, transformedCollectData, "1"); - addStepToZip(tempFolder, transformedCollectData, "2"); - addStepToZip(tempFolder, transformedCollectData, "3"); - } - } finally { - FileUtils.deleteQuietly(tempFolder); + public void showLater() { + Runnable showLater = () -> { + getDialog().setVisible(true); + if (getPane().getValue() == null // User closes the dialog + || + getPane().getValue().equals(cancelOption) // User clicks on cancel option + ) { + setUserCancelled(true); } - } catch (Exception e) { - logger.error( "Error importing data", e); - } - return dst; + }; + SwingUtilities.invokeLater( showLater ); + } + private JOptionPane getPane() { + return pane; + } - private void addStepToZip(File tempFolder, ZipFile dstZipFile, String step) - throws ZipException { - File folderToZip = new File( tempFolder, "data"+ File.separator+step); - CollectEarthUtils.addFolderToZip(dstZipFile, folderToZip); + private void setPane(JOptionPane pane) { + this.pane = pane; } @Override - public void update(Observable o, Object arg) { - - SwingUtilities.invokeLater( () -> { - DataImportState importState = (DataImportState) o ; - progressMonitor.setMessage( Messages.getString("ImportDialogProcessMonitor.2") ); //$NON-NLS-1$ - progressMonitor.updateProgress( importState.getCount(), importState.getTotal()); - } ); - + public void progressMade(Progress progress) { + updateProgress((int) progress.getProcessedItems()); } } From aadd7176bf6d2782ec051a8987485f7637a79b2c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:35 +0100 Subject: [PATCH 0343/1620] New translations InfiniteProgressMonitor.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 268 ++++++++---------- 1 file changed, 120 insertions(+), 148 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index ab7f149d0c..ca537bed7a 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,201 +1,173 @@ package org.openforis.collect.earth.app.view; -import java.awt.Toolkit; -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.security.SecureRandom; -import java.util.List; -import java.util.Observable; -import java.util.Observer; -import java.util.Random; - -import javax.swing.JFrame; +import java.awt.Component; + +import javax.swing.JDialog; +import javax.swing.JLabel; import javax.swing.JOptionPane; +import javax.swing.JProgressBar; import javax.swing.SwingUtilities; -import org.apache.commons.io.FileUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.DataImportExportService; -import org.openforis.collect.io.data.DataImportState; -import org.openforis.collect.io.data.DataImportSummaryItem; -import org.openforis.collect.io.data.XMLDataImportProcess; +import org.apache.commons.lang3.StringUtils; +import org.openforis.concurrency.Progress; +import org.openforis.concurrency.ProgressListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import net.lingala.zip4j.ZipFile; -import net.lingala.zip4j.exception.ZipException; - -public class ImportXMLDialogProcessMonitor implements Observer{ +public class InfiniteProgressMonitor implements ProgressListener { - private static final Logger logger = LoggerFactory.getLogger(ImportXMLDialogProcessMonitor.class); - private InfiniteProgressMonitor progressMonitor; + JDialog infiniteWaitingDialog; + private boolean userCancelled = false; - public void closeProgressmonitor() { - - SwingUtilities.invokeLater( () -> { - if (progressMonitor != null) { - progressMonitor.close(); - } - } ); - } + private JDialog dialog; - private boolean shouldAddConflictingRecords(List listConflictingRecords, String importedFileName) { + private JOptionPane pane; - if ( !listConflictingRecords.isEmpty() ) { + private String cancelOption; - Object[] options = {Messages.getString("ImportXMLDialogProcessMonitor.1"), Messages.getString("ImportXMLDialogProcessMonitor.2")}; + private JLabel label; - final int selectedOption = JOptionPane.showOptionDialog(null, + JProgressBar infiniteProgress; + + private Logger logger = LoggerFactory.getLogger( InfiniteProgressMonitor.class ); + + public InfiniteProgressMonitor(Component parentFrame, String title, String message) { - "" //$NON-NLS-1$ - + "" + importedFileName + " :
" //$NON-NLS-1$ //$NON-NLS-2$ - + Messages.getString("CollectEarthWindow.9") //$NON-NLS-1$ - + "
" //$NON-NLS-1$ - + Messages.getString("CollectEarthWindow.20") + listConflictingRecords.size() //$NON-NLS-1$ - + "
" //$NON-NLS-1$ - + Messages.getString("CollectEarthWindow.25") //$NON-NLS-1$ - + "
" //$NON-NLS-1$ - + "" //$NON-NLS-1$ - + Messages.getString("CollectEarthWindow.39") //$NON-NLS-1$ - + "" //$NON-NLS-1$ - + "", //$NON-NLS-1$ + infiniteProgress = new JProgressBar(); + infiniteProgress.setIndeterminate(true); + label = new JLabel(message); - Messages.getString("CollectEarthWindow.43"), //$NON-NLS-1$ + final Object[] dialogItems = { label, infiniteProgress }; - JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE, - null, //do not use a custom Icon - options, //the titles of buttons - options[1] //default button title - ); + cancelOption = Messages.getString("InfiniteProgressMonitor.0"); //$NON-NLS-1$ + final Object[] options = { cancelOption }; + setPane(new JOptionPane(dialogItems, JOptionPane.PLAIN_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, + options)); + setDialog(getPane().createDialog(parentFrame, title)); + getDialog().setModal(true); - return (selectedOption == JOptionPane.YES_OPTION); - } else { - return false; - } } - public synchronized void startImport(final XMLDataImportProcess importProcess, final JFrame parentFrame, - final DataImportExportService dataImportService, final File importedFile ) throws Exception { + public void updateProgress(int current, int total) { - try { + updateProgress(current, total, null); - SwingUtilities.invokeLater( () -> { + } + + public void updateProgress(int current, int total, String msg) { + + Runnable updateTask = () -> { + infiniteProgress.setString(current + "/" + total); + if (infiniteProgress.isIndeterminate()) { + infiniteProgress.setIndeterminate(false); + infiniteProgress.setStringPainted(true); + } - progressMonitor = new InfiniteProgressMonitor(parentFrame, Messages.getString("ImportDialogProcessMonitor.8") + "(" //$NON-NLS-1$ //$NON-NLS-2$ - + importedFile.getName() + ")", Messages.getString("ImportDialogProcessMonitor.11") + Messages.getString("ImportDialogProcessMonitor.0")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - progressMonitor.showLater(); + infiniteProgress.setMaximum(total); - if (progressMonitor != null && progressMonitor.isUserCancelled()) { + infiniteProgress.setValue(current); + if( StringUtils.isNotBlank( msg )) + setMessage( msg ); + }; + + SwingUtilities.invokeLater( updateTask ); - Toolkit.getDefaultToolkit().beep(); - importProcess.cancel(); - logger.warn("Import Task canceled.\n"); //$NON-NLS-1$ + } - } - } - ); - - File definitiveFileToImport = importedFile; - // If the file is exported from Collect rather than a XML export from Collect Earth - if( isCollectDataExport( definitiveFileToImport ) ){ - // Transform the file to a Collect Earth type of format - definitiveFileToImport = transformCollectDataFile( definitiveFileToImport ); - if( definitiveFileToImport == null ) return; // there was a problem with the file to import, execute finally - importProcess.setFile( definitiveFileToImport ); + public void updateProgress(int currentPercentage) { + Runnable updateTask = () -> { + infiniteProgress.setString(currentPercentage + "%"); + if (infiniteProgress.isIndeterminate()) { + infiniteProgress.setIndeterminate(false); + infiniteProgress.setStringPainted(true); } - importProcess.callAndObserve( this ); + infiniteProgress.setMaximum(100); - if (importProcess.getSummary() != null && !importProcess.getState().isCancelled()) { + infiniteProgress.setValue(currentPercentage); + }; + + SwingUtilities.invokeLater( updateTask ); - final List conflictingRecords = importProcess.getSummary().getConflictingRecords(); - - if ( - conflictingRecords != null - && - !conflictingRecords.isEmpty() - && - !shouldAddConflictingRecords(conflictingRecords, definitiveFileToImport.getName()) - ) { - conflictingRecords.clear(); - } - final int totalRecords = ( conflictingRecords==null?0:conflictingRecords.size() ) + importProcess.getSummary().getRecordsToImport().size(); - SwingUtilities.invokeLater( () -> - progressMonitor.setMessage( Messages.getString("ImportDialogProcessMonitor.11") + totalRecords ) //$NON-NLS-1$ - ); - - dataImportService.importRecordsFrom(definitiveFileToImport, importProcess, conflictingRecords ); - - } - } finally { - closeProgressmonitor(); - } + } + public void setMessage(String msg) { + label.setText(msg); } + public void close() { + SwingUtilities.invokeLater(() -> { + hide(); + getDialog().dispose(); + }); + } - private boolean isCollectDataExport(File importedFile) { - return importedFile.getName().endsWith(".collect-data"); + private JDialog getDialog() { + return dialog; } - private File transformCollectDataFile(File zipWithXml) throws ZipException, IOException { + public void hide() { + getDialog().setVisible(false); + } - Random random; - File dst = null; - try { - random = SecureRandom.getInstanceStrong(); + public boolean isShowing() { + return getDialog().isShowing(); + } - // Originally the collect-data file will look like this: - // root: idml.xml - // root : data (folder) - // root : data/1 (folder) - // the XML files will be under the data - File tempFolder = null; - try (ZipFile src = new ZipFile( zipWithXml )){ - tempFolder = Files.createTempDirectory("tempCE").toFile(); - src.extractAll( tempFolder.getAbsolutePath() ); + public boolean isUserCancelled() { + return userCancelled; + } + private void setDialog(JDialog dialog) { + this.dialog = dialog; + } - dst = new File( tempFolder.getParentFile(), "transform" + random.nextInt() + ".zip"); - dst.deleteOnExit(); + public void setUserCancelled(boolean userCancelled) { + this.userCancelled = userCancelled; + } + + public void show() { + + Runnable showTask = () -> { + getDialog().setVisible(true); + if (getPane().getValue() == null // User closes the dialog + || + getPane().getValue().equals(cancelOption) // User clicks on cancel option + ) { + setUserCancelled(true); + } + }; + SwingUtilities.invokeLater( showTask ); + - String surveyDefinitonName = "idml.xml"; - File definition = new File(tempFolder, surveyDefinitonName); + } - try( ZipFile transformedCollectData = CollectEarthUtils.addFileToZip(dst , definition , surveyDefinitonName) ){ - addStepToZip(tempFolder, transformedCollectData, "1"); - addStepToZip(tempFolder, transformedCollectData, "2"); - addStepToZip(tempFolder, transformedCollectData, "3"); - } - } finally { - FileUtils.deleteQuietly(tempFolder); + public void showLater() { + Runnable showLater = () -> { + getDialog().setVisible(true); + if (getPane().getValue() == null // User closes the dialog + || + getPane().getValue().equals(cancelOption) // User clicks on cancel option + ) { + setUserCancelled(true); } - } catch (Exception e) { - logger.error( "Error importing data", e); - } - return dst; + }; + SwingUtilities.invokeLater( showLater ); + } + private JOptionPane getPane() { + return pane; + } - private void addStepToZip(File tempFolder, ZipFile dstZipFile, String step) - throws ZipException { - File folderToZip = new File( tempFolder, "data"+ File.separator+step); - CollectEarthUtils.addFolderToZip(dstZipFile, folderToZip); + private void setPane(JOptionPane pane) { + this.pane = pane; } @Override - public void update(Observable o, Object arg) { - - SwingUtilities.invokeLater( () -> { - DataImportState importState = (DataImportState) o ; - progressMonitor.setMessage( Messages.getString("ImportDialogProcessMonitor.2") ); //$NON-NLS-1$ - progressMonitor.updateProgress( importState.getCount(), importState.getTotal()); - } ); - + public void progressMade(Progress progress) { + updateProgress((int) progress.getProcessedItems()); } } From aa342677a5857e1ca869b11fefd473746e99efb6 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:36 +0100 Subject: [PATCH 0344/1620] New translations InfiniteProgressMonitor.java (English) --- .../earth/app/view/Messages_en.properties | 268 ++++++++---------- 1 file changed, 120 insertions(+), 148 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index ab7f149d0c..ca537bed7a 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,201 +1,173 @@ package org.openforis.collect.earth.app.view; -import java.awt.Toolkit; -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.security.SecureRandom; -import java.util.List; -import java.util.Observable; -import java.util.Observer; -import java.util.Random; - -import javax.swing.JFrame; +import java.awt.Component; + +import javax.swing.JDialog; +import javax.swing.JLabel; import javax.swing.JOptionPane; +import javax.swing.JProgressBar; import javax.swing.SwingUtilities; -import org.apache.commons.io.FileUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.DataImportExportService; -import org.openforis.collect.io.data.DataImportState; -import org.openforis.collect.io.data.DataImportSummaryItem; -import org.openforis.collect.io.data.XMLDataImportProcess; +import org.apache.commons.lang3.StringUtils; +import org.openforis.concurrency.Progress; +import org.openforis.concurrency.ProgressListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import net.lingala.zip4j.ZipFile; -import net.lingala.zip4j.exception.ZipException; - -public class ImportXMLDialogProcessMonitor implements Observer{ +public class InfiniteProgressMonitor implements ProgressListener { - private static final Logger logger = LoggerFactory.getLogger(ImportXMLDialogProcessMonitor.class); - private InfiniteProgressMonitor progressMonitor; + JDialog infiniteWaitingDialog; + private boolean userCancelled = false; - public void closeProgressmonitor() { - - SwingUtilities.invokeLater( () -> { - if (progressMonitor != null) { - progressMonitor.close(); - } - } ); - } + private JDialog dialog; - private boolean shouldAddConflictingRecords(List listConflictingRecords, String importedFileName) { + private JOptionPane pane; - if ( !listConflictingRecords.isEmpty() ) { + private String cancelOption; - Object[] options = {Messages.getString("ImportXMLDialogProcessMonitor.1"), Messages.getString("ImportXMLDialogProcessMonitor.2")}; + private JLabel label; - final int selectedOption = JOptionPane.showOptionDialog(null, + JProgressBar infiniteProgress; + + private Logger logger = LoggerFactory.getLogger( InfiniteProgressMonitor.class ); + + public InfiniteProgressMonitor(Component parentFrame, String title, String message) { - "" //$NON-NLS-1$ - + "" + importedFileName + " :
" //$NON-NLS-1$ //$NON-NLS-2$ - + Messages.getString("CollectEarthWindow.9") //$NON-NLS-1$ - + "
" //$NON-NLS-1$ - + Messages.getString("CollectEarthWindow.20") + listConflictingRecords.size() //$NON-NLS-1$ - + "
" //$NON-NLS-1$ - + Messages.getString("CollectEarthWindow.25") //$NON-NLS-1$ - + "
" //$NON-NLS-1$ - + "" //$NON-NLS-1$ - + Messages.getString("CollectEarthWindow.39") //$NON-NLS-1$ - + "" //$NON-NLS-1$ - + "", //$NON-NLS-1$ + infiniteProgress = new JProgressBar(); + infiniteProgress.setIndeterminate(true); + label = new JLabel(message); - Messages.getString("CollectEarthWindow.43"), //$NON-NLS-1$ + final Object[] dialogItems = { label, infiniteProgress }; - JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE, - null, //do not use a custom Icon - options, //the titles of buttons - options[1] //default button title - ); + cancelOption = Messages.getString("InfiniteProgressMonitor.0"); //$NON-NLS-1$ + final Object[] options = { cancelOption }; + setPane(new JOptionPane(dialogItems, JOptionPane.PLAIN_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, + options)); + setDialog(getPane().createDialog(parentFrame, title)); + getDialog().setModal(true); - return (selectedOption == JOptionPane.YES_OPTION); - } else { - return false; - } } - public synchronized void startImport(final XMLDataImportProcess importProcess, final JFrame parentFrame, - final DataImportExportService dataImportService, final File importedFile ) throws Exception { + public void updateProgress(int current, int total) { - try { + updateProgress(current, total, null); - SwingUtilities.invokeLater( () -> { + } + + public void updateProgress(int current, int total, String msg) { + + Runnable updateTask = () -> { + infiniteProgress.setString(current + "/" + total); + if (infiniteProgress.isIndeterminate()) { + infiniteProgress.setIndeterminate(false); + infiniteProgress.setStringPainted(true); + } - progressMonitor = new InfiniteProgressMonitor(parentFrame, Messages.getString("ImportDialogProcessMonitor.8") + "(" //$NON-NLS-1$ //$NON-NLS-2$ - + importedFile.getName() + ")", Messages.getString("ImportDialogProcessMonitor.11") + Messages.getString("ImportDialogProcessMonitor.0")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - progressMonitor.showLater(); + infiniteProgress.setMaximum(total); - if (progressMonitor != null && progressMonitor.isUserCancelled()) { + infiniteProgress.setValue(current); + if( StringUtils.isNotBlank( msg )) + setMessage( msg ); + }; + + SwingUtilities.invokeLater( updateTask ); - Toolkit.getDefaultToolkit().beep(); - importProcess.cancel(); - logger.warn("Import Task canceled.\n"); //$NON-NLS-1$ + } - } - } - ); - - File definitiveFileToImport = importedFile; - // If the file is exported from Collect rather than a XML export from Collect Earth - if( isCollectDataExport( definitiveFileToImport ) ){ - // Transform the file to a Collect Earth type of format - definitiveFileToImport = transformCollectDataFile( definitiveFileToImport ); - if( definitiveFileToImport == null ) return; // there was a problem with the file to import, execute finally - importProcess.setFile( definitiveFileToImport ); + public void updateProgress(int currentPercentage) { + Runnable updateTask = () -> { + infiniteProgress.setString(currentPercentage + "%"); + if (infiniteProgress.isIndeterminate()) { + infiniteProgress.setIndeterminate(false); + infiniteProgress.setStringPainted(true); } - importProcess.callAndObserve( this ); + infiniteProgress.setMaximum(100); - if (importProcess.getSummary() != null && !importProcess.getState().isCancelled()) { + infiniteProgress.setValue(currentPercentage); + }; + + SwingUtilities.invokeLater( updateTask ); - final List conflictingRecords = importProcess.getSummary().getConflictingRecords(); - - if ( - conflictingRecords != null - && - !conflictingRecords.isEmpty() - && - !shouldAddConflictingRecords(conflictingRecords, definitiveFileToImport.getName()) - ) { - conflictingRecords.clear(); - } - final int totalRecords = ( conflictingRecords==null?0:conflictingRecords.size() ) + importProcess.getSummary().getRecordsToImport().size(); - SwingUtilities.invokeLater( () -> - progressMonitor.setMessage( Messages.getString("ImportDialogProcessMonitor.11") + totalRecords ) //$NON-NLS-1$ - ); - - dataImportService.importRecordsFrom(definitiveFileToImport, importProcess, conflictingRecords ); - - } - } finally { - closeProgressmonitor(); - } + } + public void setMessage(String msg) { + label.setText(msg); } + public void close() { + SwingUtilities.invokeLater(() -> { + hide(); + getDialog().dispose(); + }); + } - private boolean isCollectDataExport(File importedFile) { - return importedFile.getName().endsWith(".collect-data"); + private JDialog getDialog() { + return dialog; } - private File transformCollectDataFile(File zipWithXml) throws ZipException, IOException { + public void hide() { + getDialog().setVisible(false); + } - Random random; - File dst = null; - try { - random = SecureRandom.getInstanceStrong(); + public boolean isShowing() { + return getDialog().isShowing(); + } - // Originally the collect-data file will look like this: - // root: idml.xml - // root : data (folder) - // root : data/1 (folder) - // the XML files will be under the data - File tempFolder = null; - try (ZipFile src = new ZipFile( zipWithXml )){ - tempFolder = Files.createTempDirectory("tempCE").toFile(); - src.extractAll( tempFolder.getAbsolutePath() ); + public boolean isUserCancelled() { + return userCancelled; + } + private void setDialog(JDialog dialog) { + this.dialog = dialog; + } - dst = new File( tempFolder.getParentFile(), "transform" + random.nextInt() + ".zip"); - dst.deleteOnExit(); + public void setUserCancelled(boolean userCancelled) { + this.userCancelled = userCancelled; + } + + public void show() { + + Runnable showTask = () -> { + getDialog().setVisible(true); + if (getPane().getValue() == null // User closes the dialog + || + getPane().getValue().equals(cancelOption) // User clicks on cancel option + ) { + setUserCancelled(true); + } + }; + SwingUtilities.invokeLater( showTask ); + - String surveyDefinitonName = "idml.xml"; - File definition = new File(tempFolder, surveyDefinitonName); + } - try( ZipFile transformedCollectData = CollectEarthUtils.addFileToZip(dst , definition , surveyDefinitonName) ){ - addStepToZip(tempFolder, transformedCollectData, "1"); - addStepToZip(tempFolder, transformedCollectData, "2"); - addStepToZip(tempFolder, transformedCollectData, "3"); - } - } finally { - FileUtils.deleteQuietly(tempFolder); + public void showLater() { + Runnable showLater = () -> { + getDialog().setVisible(true); + if (getPane().getValue() == null // User closes the dialog + || + getPane().getValue().equals(cancelOption) // User clicks on cancel option + ) { + setUserCancelled(true); } - } catch (Exception e) { - logger.error( "Error importing data", e); - } - return dst; + }; + SwingUtilities.invokeLater( showLater ); + } + private JOptionPane getPane() { + return pane; + } - private void addStepToZip(File tempFolder, ZipFile dstZipFile, String step) - throws ZipException { - File folderToZip = new File( tempFolder, "data"+ File.separator+step); - CollectEarthUtils.addFolderToZip(dstZipFile, folderToZip); + private void setPane(JOptionPane pane) { + this.pane = pane; } @Override - public void update(Observable o, Object arg) { - - SwingUtilities.invokeLater( () -> { - DataImportState importState = (DataImportState) o ; - progressMonitor.setMessage( Messages.getString("ImportDialogProcessMonitor.2") ); //$NON-NLS-1$ - progressMonitor.updateProgress( importState.getCount(), importState.getTotal()); - } ); - + public void progressMade(Progress progress) { + updateProgress((int) progress.getProcessedItems()); } } From 1c402b3afaa94b4239a3dc32822566de5c8e5021 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:37 +0100 Subject: [PATCH 0345/1620] New translations JFileChooserExistsAware.java (Spanish) --- .../earth/app/view/Messages_es.properties | 248 ++++++++---------- 1 file changed, 115 insertions(+), 133 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index ca537bed7a..21d900b58d 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,173 +1,155 @@ package org.openforis.collect.earth.app.view; -import java.awt.Component; +import java.io.File; +import java.util.Arrays; -import javax.swing.JDialog; -import javax.swing.JLabel; +import javax.swing.JFileChooser; +import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.JProgressBar; -import javax.swing.SwingUtilities; +import javax.swing.filechooser.FileFilter; import org.apache.commons.lang3.StringUtils; -import org.openforis.concurrency.Progress; -import org.openforis.concurrency.ProgressListener; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -public class InfiniteProgressMonitor implements ProgressListener { +public class JFileChooserExistsAware extends JFileChooser { - JDialog infiniteWaitingDialog; + private static final long serialVersionUID = 2571562963995019882L; - private boolean userCancelled = false; - - private JDialog dialog; - - private JOptionPane pane; - - private String cancelOption; - - private JLabel label; - - JProgressBar infiniteProgress; - - private Logger logger = LoggerFactory.getLogger( InfiniteProgressMonitor.class ); - - public InfiniteProgressMonitor(Component parentFrame, String title, String message) { - - infiniteProgress = new JProgressBar(); - infiniteProgress.setIndeterminate(true); - label = new JLabel(message); - - final Object[] dialogItems = { label, infiniteProgress }; + private JFileChooserExistsAware(File lastFolder) { + super(lastFolder); + } - cancelOption = Messages.getString("InfiniteProgressMonitor.0"); //$NON-NLS-1$ - final Object[] options = { cancelOption }; - setPane(new JOptionPane(dialogItems, JOptionPane.PLAIN_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, - options)); - setDialog(getPane().createDialog(parentFrame, title)); - getDialog().setModal(true); + private JFileChooserExistsAware(){ + super(); + } + @Override + public void approveSelection(){ + File f = getSelectedFile(); + if( f!=null && f.exists() && getDialogType() == SAVE_DIALOG){ + int result = JOptionPane.showConfirmDialog(this,"The file exists, overwrite?","Existing file",JOptionPane.YES_NO_CANCEL_OPTION); //$NON-NLS-1$ //$NON-NLS-2$ + switch(result){ + case JOptionPane.YES_OPTION: + super.approveSelection(); + return; + case JOptionPane.NO_OPTION: + return; + case JOptionPane.CLOSED_OPTION: + return; + case JOptionPane.CANCEL_OPTION: + cancelSelection(); + return; + } + } + super.approveSelection(); } - public void updateProgress(int current, int total) { + public static File[] getFileChooserResults(final DataFormat dataFormat, boolean isSaveDlg, boolean multipleSelect, String preselectedName, LocalPropertiesService localPropertiesService, JFrame frame) { + return getFileChooserResults(dataFormat, isSaveDlg, multipleSelect, preselectedName, localPropertiesService, frame, null); + } - updateProgress(current, total, null); + public static File[] getFileChooserResults(final DataFormat dataFormat, boolean isSaveDlg, boolean multipleSelect, String preselectedName, LocalPropertiesService localPropertiesService, JFrame frame, File preSelectedFolder) { - } - - public void updateProgress(int current, int total, String msg) { + JFileChooser fc ; - Runnable updateTask = () -> { - infiniteProgress.setString(current + "/" + total); - if (infiniteProgress.isIndeterminate()) { - infiniteProgress.setIndeterminate(false); - infiniteProgress.setStringPainted(true); + if( preSelectedFolder == null ){ + String lastUsedFolder = localPropertiesService.getValue( EarthProperty.LAST_USED_FOLDER ); + if( !StringUtils.isBlank( lastUsedFolder ) ){ + preSelectedFolder = new File( lastUsedFolder ); + if( !preSelectedFolder.exists()){ + preSelectedFolder = null; + } } + } - infiniteProgress.setMaximum(total); - - infiniteProgress.setValue(current); - if( StringUtils.isNotBlank( msg )) - setMessage( msg ); - }; - - SwingUtilities.invokeLater( updateTask ); + fc = new JFileChooserExistsAware( preSelectedFolder ); - } + if( preselectedName != null ){ + File selectedFile = new File( fc.getCurrentDirectory().getAbsolutePath() + File.separatorChar + preselectedName ); + fc.setSelectedFile( selectedFile ); + } - public void updateProgress(int currentPercentage) { - Runnable updateTask = () -> { - infiniteProgress.setString(currentPercentage + "%"); - if (infiniteProgress.isIndeterminate()) { - infiniteProgress.setIndeterminate(false); - infiniteProgress.setStringPainted(true); - } + fc.setMultiSelectionEnabled( multipleSelect ); - infiniteProgress.setMaximum(100); + File[] selectedFiles = null; + FileFilter addedFilter = getFileFilter(dataFormat); + fc.addChoosableFileFilter(addedFilter); - infiniteProgress.setValue(currentPercentage); - }; - - SwingUtilities.invokeLater( updateTask ); + fc.setAcceptAllFileFilterUsed(true); + // Set the added file filter as the default chose filter + fc.setFileFilter(addedFilter); - } + // Handle open button action. + int returnVal ; + if( isSaveDlg ){ + returnVal = fc.showSaveDialog( frame ); + }else{ + returnVal = fc.showOpenDialog( frame); + } - public void setMessage(String msg) { - label.setText(msg); - } + if ( returnVal == JFileChooser.APPROVE_OPTION) { - public void close() { - SwingUtilities.invokeLater(() -> { - hide(); - getDialog().dispose(); - }); - } + if( multipleSelect ){ + selectedFiles = fc.getSelectedFiles(); + }else{ + selectedFiles = new File[]{fc.getSelectedFile()}; + } + + if( selectedFiles != null && selectedFiles.length > 0 ) { + if( isSaveDlg ){ + String fileName = selectedFiles[0].getAbsolutePath(); + + String fileExtension = null; + + if( fileName.lastIndexOf('.') != -1){ + fileExtension = fileName.substring( fileName.lastIndexOf('.') + 1 ).toLowerCase(); + } + + // If the chose file has no extension or the extension is not one of the default extensions for the dataformat + if ( fileExtension == null || Arrays.binarySearch( dataFormat.getPossibleFileExtensions(), fileExtension ) < 0 ) { //$NON-NLS-1$ + fileName += "." + dataFormat.getDefaultExtension(); //$NON-NLS-1$ + selectedFiles[0] = new File(fileName); + } + } + + localPropertiesService.setValue(EarthProperty.LAST_USED_FOLDER, selectedFiles[0].getParent()); + } - private JDialog getDialog() { - return dialog; - } - public void hide() { - getDialog().setVisible(false); + } + return selectedFiles; } - public boolean isShowing() { - return getDialog().isShowing(); - } + private static FileFilter getFileFilter(final DataFormat dataFormat) { + return new FileFilter() { - public boolean isUserCancelled() { - return userCancelled; - } + @Override + public boolean accept(File f) { - private void setDialog(JDialog dialog) { - this.dialog = dialog; - } + String[] extensions = dataFormat.getPossibleFileExtensions(); + boolean acceptedFile = false; + boolean isFolder = f.isDirectory(); + if( isFolder ){ + acceptedFile = true; + }else{ - public void setUserCancelled(boolean userCancelled) { - this.userCancelled = userCancelled; - } - - public void show() { - - Runnable showTask = () -> { - getDialog().setVisible(true); - if (getPane().getValue() == null // User closes the dialog - || - getPane().getValue().equals(cancelOption) // User clicks on cancel option - ) { - setUserCancelled(true); + for (String fileExtension : extensions) { + if( f.getName().toLowerCase().endsWith("." + fileExtension ) ){ //$NON-NLS-1$ + acceptedFile = true; + break; + } + } } - }; - SwingUtilities.invokeLater( showTask ); - - } + return acceptedFile; + } - public void showLater() { - Runnable showLater = () -> { - getDialog().setVisible(true); - if (getPane().getValue() == null // User closes the dialog - || - getPane().getValue().equals(cancelOption) // User clicks on cancel option - ) { - setUserCancelled(true); + @Override + public String getDescription() { + return dataFormat.getDescription(); } }; - SwingUtilities.invokeLater( showLater ); - - } - - private JOptionPane getPane() { - return pane; - } - - private void setPane(JOptionPane pane) { - this.pane = pane; - } - - @Override - public void progressMade(Progress progress) { - updateProgress((int) progress.getProcessedItems()); } } From 3b1bad717127f1b00c3b9a63c8e130466fa5684e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:38 +0100 Subject: [PATCH 0346/1620] New translations LinkRunner.java (French) --- .../earth/app/view/Messages_fr.properties | 208 ++++-------------- 1 file changed, 39 insertions(+), 169 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index ca537bed7a..c9f18857eb 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,173 +1,43 @@ package org.openforis.collect.earth.app.view; -import java.awt.Component; +import java.awt.Desktop; +import java.net.URI; +import java.util.concurrent.ExecutionException; -import javax.swing.JDialog; -import javax.swing.JLabel; import javax.swing.JOptionPane; -import javax.swing.JProgressBar; -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.StringUtils; -import org.openforis.concurrency.Progress; -import org.openforis.concurrency.ProgressListener; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class InfiniteProgressMonitor implements ProgressListener { - - JDialog infiniteWaitingDialog; - - private boolean userCancelled = false; - - private JDialog dialog; - - private JOptionPane pane; - - private String cancelOption; - - private JLabel label; - - JProgressBar infiniteProgress; - - private Logger logger = LoggerFactory.getLogger( InfiniteProgressMonitor.class ); - - public InfiniteProgressMonitor(Component parentFrame, String title, String message) { - - infiniteProgress = new JProgressBar(); - infiniteProgress.setIndeterminate(true); - label = new JLabel(message); - - final Object[] dialogItems = { label, infiniteProgress }; - - cancelOption = Messages.getString("InfiniteProgressMonitor.0"); //$NON-NLS-1$ - final Object[] options = { cancelOption }; - setPane(new JOptionPane(dialogItems, JOptionPane.PLAIN_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, - options)); - setDialog(getPane().createDialog(parentFrame, title)); - getDialog().setModal(true); - - } - - public void updateProgress(int current, int total) { - - updateProgress(current, total, null); - - } - - public void updateProgress(int current, int total, String msg) { - - Runnable updateTask = () -> { - infiniteProgress.setString(current + "/" + total); - if (infiniteProgress.isIndeterminate()) { - infiniteProgress.setIndeterminate(false); - infiniteProgress.setStringPainted(true); - } - - infiniteProgress.setMaximum(total); - - infiniteProgress.setValue(current); - if( StringUtils.isNotBlank( msg )) - setMessage( msg ); - }; - - SwingUtilities.invokeLater( updateTask ); - - } - - public void updateProgress(int currentPercentage) { - Runnable updateTask = () -> { - infiniteProgress.setString(currentPercentage + "%"); - if (infiniteProgress.isIndeterminate()) { - infiniteProgress.setIndeterminate(false); - infiniteProgress.setStringPainted(true); - } - - infiniteProgress.setMaximum(100); - - infiniteProgress.setValue(currentPercentage); - }; - - SwingUtilities.invokeLater( updateTask ); - - } - - public void setMessage(String msg) { - label.setText(msg); - } - - public void close() { - SwingUtilities.invokeLater(() -> { - hide(); - getDialog().dispose(); - }); - } - - private JDialog getDialog() { - return dialog; - } - - public void hide() { - getDialog().setVisible(false); - } - - public boolean isShowing() { - return getDialog().isShowing(); - } - - public boolean isUserCancelled() { - return userCancelled; - } - - private void setDialog(JDialog dialog) { - this.dialog = dialog; - } - - public void setUserCancelled(boolean userCancelled) { - this.userCancelled = userCancelled; - } - - public void show() { - - Runnable showTask = () -> { - getDialog().setVisible(true); - if (getPane().getValue() == null // User closes the dialog - || - getPane().getValue().equals(cancelOption) // User clicks on cancel option - ) { - setUserCancelled(true); - } - }; - SwingUtilities.invokeLater( showTask ); - - - } - - public void showLater() { - Runnable showLater = () -> { - getDialog().setVisible(true); - if (getPane().getValue() == null // User closes the dialog - || - getPane().getValue().equals(cancelOption) // User clicks on cancel option - ) { - setUserCancelled(true); - } - }; - SwingUtilities.invokeLater( showLater ); - - } - - private JOptionPane getPane() { - return pane; - } - - private void setPane(JOptionPane pane) { - this.pane = pane; - } - - @Override - public void progressMade(Progress progress) { - updateProgress((int) progress.getProcessedItems()); - } - -} +import javax.swing.SwingWorker; + +class LinkRunner extends SwingWorker { + + private final URI uri; + + LinkRunner(URI u) { + if (u == null) { + throw new NullPointerException(); + } + uri = u; + } + + @Override + protected Void doInBackground() throws Exception { + Desktop desktop = java.awt.Desktop.getDesktop(); + desktop.browse(uri); + return null; + } + + @Override + protected void done() { + try { + get(); + } catch (ExecutionException ee) { + handleException(); + } catch (InterruptedException e) { + handleException(); + Thread.currentThread().interrupt(); + } + } + + private static void handleException() { + JOptionPane.showMessageDialog(null, Messages.getString("AboutDialog.6"), Messages.getString("AboutDialog.19"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ + } +} \ No newline at end of file From 1342909ac8be7423677b0354e193ee71c6681376 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:39 +0100 Subject: [PATCH 0347/1620] New translations JFileChooserExistsAware.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 248 ++++++++---------- 1 file changed, 115 insertions(+), 133 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index ca537bed7a..21d900b58d 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,173 +1,155 @@ package org.openforis.collect.earth.app.view; -import java.awt.Component; +import java.io.File; +import java.util.Arrays; -import javax.swing.JDialog; -import javax.swing.JLabel; +import javax.swing.JFileChooser; +import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.JProgressBar; -import javax.swing.SwingUtilities; +import javax.swing.filechooser.FileFilter; import org.apache.commons.lang3.StringUtils; -import org.openforis.concurrency.Progress; -import org.openforis.concurrency.ProgressListener; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -public class InfiniteProgressMonitor implements ProgressListener { +public class JFileChooserExistsAware extends JFileChooser { - JDialog infiniteWaitingDialog; + private static final long serialVersionUID = 2571562963995019882L; - private boolean userCancelled = false; - - private JDialog dialog; - - private JOptionPane pane; - - private String cancelOption; - - private JLabel label; - - JProgressBar infiniteProgress; - - private Logger logger = LoggerFactory.getLogger( InfiniteProgressMonitor.class ); - - public InfiniteProgressMonitor(Component parentFrame, String title, String message) { - - infiniteProgress = new JProgressBar(); - infiniteProgress.setIndeterminate(true); - label = new JLabel(message); - - final Object[] dialogItems = { label, infiniteProgress }; + private JFileChooserExistsAware(File lastFolder) { + super(lastFolder); + } - cancelOption = Messages.getString("InfiniteProgressMonitor.0"); //$NON-NLS-1$ - final Object[] options = { cancelOption }; - setPane(new JOptionPane(dialogItems, JOptionPane.PLAIN_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, - options)); - setDialog(getPane().createDialog(parentFrame, title)); - getDialog().setModal(true); + private JFileChooserExistsAware(){ + super(); + } + @Override + public void approveSelection(){ + File f = getSelectedFile(); + if( f!=null && f.exists() && getDialogType() == SAVE_DIALOG){ + int result = JOptionPane.showConfirmDialog(this,"The file exists, overwrite?","Existing file",JOptionPane.YES_NO_CANCEL_OPTION); //$NON-NLS-1$ //$NON-NLS-2$ + switch(result){ + case JOptionPane.YES_OPTION: + super.approveSelection(); + return; + case JOptionPane.NO_OPTION: + return; + case JOptionPane.CLOSED_OPTION: + return; + case JOptionPane.CANCEL_OPTION: + cancelSelection(); + return; + } + } + super.approveSelection(); } - public void updateProgress(int current, int total) { + public static File[] getFileChooserResults(final DataFormat dataFormat, boolean isSaveDlg, boolean multipleSelect, String preselectedName, LocalPropertiesService localPropertiesService, JFrame frame) { + return getFileChooserResults(dataFormat, isSaveDlg, multipleSelect, preselectedName, localPropertiesService, frame, null); + } - updateProgress(current, total, null); + public static File[] getFileChooserResults(final DataFormat dataFormat, boolean isSaveDlg, boolean multipleSelect, String preselectedName, LocalPropertiesService localPropertiesService, JFrame frame, File preSelectedFolder) { - } - - public void updateProgress(int current, int total, String msg) { + JFileChooser fc ; - Runnable updateTask = () -> { - infiniteProgress.setString(current + "/" + total); - if (infiniteProgress.isIndeterminate()) { - infiniteProgress.setIndeterminate(false); - infiniteProgress.setStringPainted(true); + if( preSelectedFolder == null ){ + String lastUsedFolder = localPropertiesService.getValue( EarthProperty.LAST_USED_FOLDER ); + if( !StringUtils.isBlank( lastUsedFolder ) ){ + preSelectedFolder = new File( lastUsedFolder ); + if( !preSelectedFolder.exists()){ + preSelectedFolder = null; + } } + } - infiniteProgress.setMaximum(total); - - infiniteProgress.setValue(current); - if( StringUtils.isNotBlank( msg )) - setMessage( msg ); - }; - - SwingUtilities.invokeLater( updateTask ); + fc = new JFileChooserExistsAware( preSelectedFolder ); - } + if( preselectedName != null ){ + File selectedFile = new File( fc.getCurrentDirectory().getAbsolutePath() + File.separatorChar + preselectedName ); + fc.setSelectedFile( selectedFile ); + } - public void updateProgress(int currentPercentage) { - Runnable updateTask = () -> { - infiniteProgress.setString(currentPercentage + "%"); - if (infiniteProgress.isIndeterminate()) { - infiniteProgress.setIndeterminate(false); - infiniteProgress.setStringPainted(true); - } + fc.setMultiSelectionEnabled( multipleSelect ); - infiniteProgress.setMaximum(100); + File[] selectedFiles = null; + FileFilter addedFilter = getFileFilter(dataFormat); + fc.addChoosableFileFilter(addedFilter); - infiniteProgress.setValue(currentPercentage); - }; - - SwingUtilities.invokeLater( updateTask ); + fc.setAcceptAllFileFilterUsed(true); + // Set the added file filter as the default chose filter + fc.setFileFilter(addedFilter); - } + // Handle open button action. + int returnVal ; + if( isSaveDlg ){ + returnVal = fc.showSaveDialog( frame ); + }else{ + returnVal = fc.showOpenDialog( frame); + } - public void setMessage(String msg) { - label.setText(msg); - } + if ( returnVal == JFileChooser.APPROVE_OPTION) { - public void close() { - SwingUtilities.invokeLater(() -> { - hide(); - getDialog().dispose(); - }); - } + if( multipleSelect ){ + selectedFiles = fc.getSelectedFiles(); + }else{ + selectedFiles = new File[]{fc.getSelectedFile()}; + } + + if( selectedFiles != null && selectedFiles.length > 0 ) { + if( isSaveDlg ){ + String fileName = selectedFiles[0].getAbsolutePath(); + + String fileExtension = null; + + if( fileName.lastIndexOf('.') != -1){ + fileExtension = fileName.substring( fileName.lastIndexOf('.') + 1 ).toLowerCase(); + } + + // If the chose file has no extension or the extension is not one of the default extensions for the dataformat + if ( fileExtension == null || Arrays.binarySearch( dataFormat.getPossibleFileExtensions(), fileExtension ) < 0 ) { //$NON-NLS-1$ + fileName += "." + dataFormat.getDefaultExtension(); //$NON-NLS-1$ + selectedFiles[0] = new File(fileName); + } + } + + localPropertiesService.setValue(EarthProperty.LAST_USED_FOLDER, selectedFiles[0].getParent()); + } - private JDialog getDialog() { - return dialog; - } - public void hide() { - getDialog().setVisible(false); + } + return selectedFiles; } - public boolean isShowing() { - return getDialog().isShowing(); - } + private static FileFilter getFileFilter(final DataFormat dataFormat) { + return new FileFilter() { - public boolean isUserCancelled() { - return userCancelled; - } + @Override + public boolean accept(File f) { - private void setDialog(JDialog dialog) { - this.dialog = dialog; - } + String[] extensions = dataFormat.getPossibleFileExtensions(); + boolean acceptedFile = false; + boolean isFolder = f.isDirectory(); + if( isFolder ){ + acceptedFile = true; + }else{ - public void setUserCancelled(boolean userCancelled) { - this.userCancelled = userCancelled; - } - - public void show() { - - Runnable showTask = () -> { - getDialog().setVisible(true); - if (getPane().getValue() == null // User closes the dialog - || - getPane().getValue().equals(cancelOption) // User clicks on cancel option - ) { - setUserCancelled(true); + for (String fileExtension : extensions) { + if( f.getName().toLowerCase().endsWith("." + fileExtension ) ){ //$NON-NLS-1$ + acceptedFile = true; + break; + } + } } - }; - SwingUtilities.invokeLater( showTask ); - - } + return acceptedFile; + } - public void showLater() { - Runnable showLater = () -> { - getDialog().setVisible(true); - if (getPane().getValue() == null // User closes the dialog - || - getPane().getValue().equals(cancelOption) // User clicks on cancel option - ) { - setUserCancelled(true); + @Override + public String getDescription() { + return dataFormat.getDescription(); } }; - SwingUtilities.invokeLater( showLater ); - - } - - private JOptionPane getPane() { - return pane; - } - - private void setPane(JOptionPane pane) { - this.pane = pane; - } - - @Override - public void progressMade(Progress progress) { - updateProgress((int) progress.getProcessedItems()); } } From 8de097103eeb2c2767511bc472e56a5cb3ea0c3a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:40 +0100 Subject: [PATCH 0348/1620] New translations JFileChooserExistsAware.java (English) --- .../earth/app/view/Messages_en.properties | 248 ++++++++---------- 1 file changed, 115 insertions(+), 133 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index ca537bed7a..21d900b58d 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,173 +1,155 @@ package org.openforis.collect.earth.app.view; -import java.awt.Component; +import java.io.File; +import java.util.Arrays; -import javax.swing.JDialog; -import javax.swing.JLabel; +import javax.swing.JFileChooser; +import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.JProgressBar; -import javax.swing.SwingUtilities; +import javax.swing.filechooser.FileFilter; import org.apache.commons.lang3.StringUtils; -import org.openforis.concurrency.Progress; -import org.openforis.concurrency.ProgressListener; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -public class InfiniteProgressMonitor implements ProgressListener { +public class JFileChooserExistsAware extends JFileChooser { - JDialog infiniteWaitingDialog; + private static final long serialVersionUID = 2571562963995019882L; - private boolean userCancelled = false; - - private JDialog dialog; - - private JOptionPane pane; - - private String cancelOption; - - private JLabel label; - - JProgressBar infiniteProgress; - - private Logger logger = LoggerFactory.getLogger( InfiniteProgressMonitor.class ); - - public InfiniteProgressMonitor(Component parentFrame, String title, String message) { - - infiniteProgress = new JProgressBar(); - infiniteProgress.setIndeterminate(true); - label = new JLabel(message); - - final Object[] dialogItems = { label, infiniteProgress }; + private JFileChooserExistsAware(File lastFolder) { + super(lastFolder); + } - cancelOption = Messages.getString("InfiniteProgressMonitor.0"); //$NON-NLS-1$ - final Object[] options = { cancelOption }; - setPane(new JOptionPane(dialogItems, JOptionPane.PLAIN_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, - options)); - setDialog(getPane().createDialog(parentFrame, title)); - getDialog().setModal(true); + private JFileChooserExistsAware(){ + super(); + } + @Override + public void approveSelection(){ + File f = getSelectedFile(); + if( f!=null && f.exists() && getDialogType() == SAVE_DIALOG){ + int result = JOptionPane.showConfirmDialog(this,"The file exists, overwrite?","Existing file",JOptionPane.YES_NO_CANCEL_OPTION); //$NON-NLS-1$ //$NON-NLS-2$ + switch(result){ + case JOptionPane.YES_OPTION: + super.approveSelection(); + return; + case JOptionPane.NO_OPTION: + return; + case JOptionPane.CLOSED_OPTION: + return; + case JOptionPane.CANCEL_OPTION: + cancelSelection(); + return; + } + } + super.approveSelection(); } - public void updateProgress(int current, int total) { + public static File[] getFileChooserResults(final DataFormat dataFormat, boolean isSaveDlg, boolean multipleSelect, String preselectedName, LocalPropertiesService localPropertiesService, JFrame frame) { + return getFileChooserResults(dataFormat, isSaveDlg, multipleSelect, preselectedName, localPropertiesService, frame, null); + } - updateProgress(current, total, null); + public static File[] getFileChooserResults(final DataFormat dataFormat, boolean isSaveDlg, boolean multipleSelect, String preselectedName, LocalPropertiesService localPropertiesService, JFrame frame, File preSelectedFolder) { - } - - public void updateProgress(int current, int total, String msg) { + JFileChooser fc ; - Runnable updateTask = () -> { - infiniteProgress.setString(current + "/" + total); - if (infiniteProgress.isIndeterminate()) { - infiniteProgress.setIndeterminate(false); - infiniteProgress.setStringPainted(true); + if( preSelectedFolder == null ){ + String lastUsedFolder = localPropertiesService.getValue( EarthProperty.LAST_USED_FOLDER ); + if( !StringUtils.isBlank( lastUsedFolder ) ){ + preSelectedFolder = new File( lastUsedFolder ); + if( !preSelectedFolder.exists()){ + preSelectedFolder = null; + } } + } - infiniteProgress.setMaximum(total); - - infiniteProgress.setValue(current); - if( StringUtils.isNotBlank( msg )) - setMessage( msg ); - }; - - SwingUtilities.invokeLater( updateTask ); + fc = new JFileChooserExistsAware( preSelectedFolder ); - } + if( preselectedName != null ){ + File selectedFile = new File( fc.getCurrentDirectory().getAbsolutePath() + File.separatorChar + preselectedName ); + fc.setSelectedFile( selectedFile ); + } - public void updateProgress(int currentPercentage) { - Runnable updateTask = () -> { - infiniteProgress.setString(currentPercentage + "%"); - if (infiniteProgress.isIndeterminate()) { - infiniteProgress.setIndeterminate(false); - infiniteProgress.setStringPainted(true); - } + fc.setMultiSelectionEnabled( multipleSelect ); - infiniteProgress.setMaximum(100); + File[] selectedFiles = null; + FileFilter addedFilter = getFileFilter(dataFormat); + fc.addChoosableFileFilter(addedFilter); - infiniteProgress.setValue(currentPercentage); - }; - - SwingUtilities.invokeLater( updateTask ); + fc.setAcceptAllFileFilterUsed(true); + // Set the added file filter as the default chose filter + fc.setFileFilter(addedFilter); - } + // Handle open button action. + int returnVal ; + if( isSaveDlg ){ + returnVal = fc.showSaveDialog( frame ); + }else{ + returnVal = fc.showOpenDialog( frame); + } - public void setMessage(String msg) { - label.setText(msg); - } + if ( returnVal == JFileChooser.APPROVE_OPTION) { - public void close() { - SwingUtilities.invokeLater(() -> { - hide(); - getDialog().dispose(); - }); - } + if( multipleSelect ){ + selectedFiles = fc.getSelectedFiles(); + }else{ + selectedFiles = new File[]{fc.getSelectedFile()}; + } + + if( selectedFiles != null && selectedFiles.length > 0 ) { + if( isSaveDlg ){ + String fileName = selectedFiles[0].getAbsolutePath(); + + String fileExtension = null; + + if( fileName.lastIndexOf('.') != -1){ + fileExtension = fileName.substring( fileName.lastIndexOf('.') + 1 ).toLowerCase(); + } + + // If the chose file has no extension or the extension is not one of the default extensions for the dataformat + if ( fileExtension == null || Arrays.binarySearch( dataFormat.getPossibleFileExtensions(), fileExtension ) < 0 ) { //$NON-NLS-1$ + fileName += "." + dataFormat.getDefaultExtension(); //$NON-NLS-1$ + selectedFiles[0] = new File(fileName); + } + } + + localPropertiesService.setValue(EarthProperty.LAST_USED_FOLDER, selectedFiles[0].getParent()); + } - private JDialog getDialog() { - return dialog; - } - public void hide() { - getDialog().setVisible(false); + } + return selectedFiles; } - public boolean isShowing() { - return getDialog().isShowing(); - } + private static FileFilter getFileFilter(final DataFormat dataFormat) { + return new FileFilter() { - public boolean isUserCancelled() { - return userCancelled; - } + @Override + public boolean accept(File f) { - private void setDialog(JDialog dialog) { - this.dialog = dialog; - } + String[] extensions = dataFormat.getPossibleFileExtensions(); + boolean acceptedFile = false; + boolean isFolder = f.isDirectory(); + if( isFolder ){ + acceptedFile = true; + }else{ - public void setUserCancelled(boolean userCancelled) { - this.userCancelled = userCancelled; - } - - public void show() { - - Runnable showTask = () -> { - getDialog().setVisible(true); - if (getPane().getValue() == null // User closes the dialog - || - getPane().getValue().equals(cancelOption) // User clicks on cancel option - ) { - setUserCancelled(true); + for (String fileExtension : extensions) { + if( f.getName().toLowerCase().endsWith("." + fileExtension ) ){ //$NON-NLS-1$ + acceptedFile = true; + break; + } + } } - }; - SwingUtilities.invokeLater( showTask ); - - } + return acceptedFile; + } - public void showLater() { - Runnable showLater = () -> { - getDialog().setVisible(true); - if (getPane().getValue() == null // User closes the dialog - || - getPane().getValue().equals(cancelOption) // User clicks on cancel option - ) { - setUserCancelled(true); + @Override + public String getDescription() { + return dataFormat.getDescription(); } }; - SwingUtilities.invokeLater( showLater ); - - } - - private JOptionPane getPane() { - return pane; - } - - private void setPane(JOptionPane pane) { - this.pane = pane; - } - - @Override - public void progressMade(Progress progress) { - updateProgress((int) progress.getProcessedItems()); } } From 895da462c517d9ef6863e1b5f3939dd53fa8dac6 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:42 +0100 Subject: [PATCH 0349/1620] New translations JFilePicker.java (French) --- .../earth/app/view/Messages_fr.properties | 185 ++++++++++++++---- 1 file changed, 147 insertions(+), 38 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index c9f18857eb..31589044b8 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,43 +1,152 @@ package org.openforis.collect.earth.app.view; -import java.awt.Desktop; -import java.net.URI; -import java.util.concurrent.ExecutionException; - -import javax.swing.JOptionPane; -import javax.swing.SwingWorker; - -class LinkRunner extends SwingWorker { - - private final URI uri; - - LinkRunner(URI u) { - if (u == null) { - throw new NullPointerException(); - } - uri = u; - } - - @Override - protected Void doInBackground() throws Exception { - Desktop desktop = java.awt.Desktop.getDesktop(); - desktop.browse(uri); - return null; - } - - @Override - protected void done() { - try { - get(); - } catch (ExecutionException ee) { - handleException(); - } catch (InterruptedException e) { - handleException(); - Thread.currentThread().interrupt(); +import java.awt.Color; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.event.ActionEvent; +import java.io.File; + +import javax.swing.JButton; +import javax.swing.JFileChooser; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTextField; +import javax.swing.border.BevelBorder; +import javax.swing.event.DocumentListener; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ +public class JFilePicker extends JPanel { + + public enum DlgMode{MODE_OPEN,MODE_SAVE } + + private static final long serialVersionUID = 9057893034177011651L; + + private JLabel label; + private JTextField textField; + private JButton button; + private transient Logger logger = LoggerFactory.getLogger(this.getClass()); + private JFileChooser fileChooser; + + private DlgMode mode; + + private JFileChooser getFixedFileChooser() { + return new JFileChooser() { + private static final long serialVersionUID = 1541813407103968847L; + + @Override + public void updateUI() { + putClientProperty("FileChooser.useShellFolder", Boolean.FALSE); + super.updateUI(); + } + }; + } + + public JFilePicker(String textFieldLabel, String originalPathValue, String buttonLabel, DlgMode mode) { + + fileChooser = getFixedFileChooser(); + setBorder( new BevelBorder( BevelBorder.RAISED )); + this.mode = mode; + if (originalPathValue != null && originalPathValue.length() > 0) { + try { + File originalFile = new File(originalPathValue); + if( originalFile.exists() ){ + fileChooser.setCurrentDirectory(originalFile.getParentFile()); + } + } catch (Exception e) { + logger.error("Unable to find parent folder for " + originalPathValue, e); //$NON-NLS-1$ + } + } + + + // creates the GUI + label = new JLabel(textFieldLabel); + setTextField(new JTextField(originalPathValue, 20)); + button = new JButton(buttonLabel); + + if (originalPathValue != null && originalPathValue.length() > 0) { + getTextField().setCaretPosition(originalPathValue.length() - 1); } - } - private static void handleException() { - JOptionPane.showMessageDialog(null, Messages.getString("AboutDialog.6"), Messages.getString("AboutDialog.19"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ - } + button.addActionListener( this::buttonActionPerformed ); + + + setLayout(new GridBagLayout()); + + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.WEST; + constraints.insets = new Insets(2, 2, 2, 2); + constraints.fill = GridBagConstraints.BOTH; + + add(label, constraints); + + constraints.gridy = 1; + constraints.weightx =1; + add(getTextField(), constraints); + constraints.gridx = 1; + constraints.weightx = 0; + add(button, constraints); + + } + + public void addChangeListener(DocumentListener listener) { + getTextField().getDocument().addDocumentListener(listener); + } + + public void addFileTypeFilter(String extension, String description, boolean setSelected) { + FileTypeFilter filter = new FileTypeFilter(extension, description); + fileChooser.addChoosableFileFilter(filter); + if (setSelected) { + fileChooser.setFileFilter(filter); + } + } + + private void buttonActionPerformed(ActionEvent evt) { + if ( + ( mode == DlgMode.MODE_OPEN || mode == DlgMode.MODE_SAVE) && + fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION && + fileChooser.getSelectedFile() != null + ) { + getTextField().setText( fileChooser.getSelectedFile().getAbsolutePath() ); + } + } + + public JFileChooser getFileChooser() { + return this.fileChooser; + } + + public String getSelectedFilePath() { + return getTextField().getText(); + } + + public void setFolderChooser() { + fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + } + + public JTextField getTextField() { + return textField; + } + + private void setTextField(JTextField textField) { + this.textField = textField; + } + + public void setTextBackground(Color bgColor) { + getTextField().setBackground(bgColor); + } + + @Override + public void setEnabled(boolean enabled) { + button.setEnabled(enabled); + textField.setEnabled(enabled); + } + } \ No newline at end of file From d7768edf83059c177d6dcac26dfe8027bd4d5fa1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:43 +0100 Subject: [PATCH 0350/1620] New translations JFilePicker.java (Spanish) --- .../earth/app/view/Messages_es.properties | 233 +++++++++--------- 1 file changed, 115 insertions(+), 118 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 21d900b58d..31589044b8 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,155 +1,152 @@ package org.openforis.collect.earth.app.view; +import java.awt.Color; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.event.ActionEvent; import java.io.File; -import java.util.Arrays; +import javax.swing.JButton; import javax.swing.JFileChooser; -import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.swing.filechooser.FileFilter; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTextField; +import javax.swing.border.BevelBorder; +import javax.swing.event.DocumentListener; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -public class JFileChooserExistsAware extends JFileChooser { +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ +public class JFilePicker extends JPanel { - private static final long serialVersionUID = 2571562963995019882L; + public enum DlgMode{MODE_OPEN,MODE_SAVE } - private JFileChooserExistsAware(File lastFolder) { - super(lastFolder); - } + private static final long serialVersionUID = 9057893034177011651L; - private JFileChooserExistsAware(){ - super(); - } + private JLabel label; + private JTextField textField; + private JButton button; + private transient Logger logger = LoggerFactory.getLogger(this.getClass()); + private JFileChooser fileChooser; - @Override - public void approveSelection(){ - File f = getSelectedFile(); - if( f!=null && f.exists() && getDialogType() == SAVE_DIALOG){ - int result = JOptionPane.showConfirmDialog(this,"The file exists, overwrite?","Existing file",JOptionPane.YES_NO_CANCEL_OPTION); //$NON-NLS-1$ //$NON-NLS-2$ - switch(result){ - case JOptionPane.YES_OPTION: - super.approveSelection(); - return; - case JOptionPane.NO_OPTION: - return; - case JOptionPane.CLOSED_OPTION: - return; - case JOptionPane.CANCEL_OPTION: - cancelSelection(); - return; - } - } - super.approveSelection(); - } + private DlgMode mode; - public static File[] getFileChooserResults(final DataFormat dataFormat, boolean isSaveDlg, boolean multipleSelect, String preselectedName, LocalPropertiesService localPropertiesService, JFrame frame) { - return getFileChooserResults(dataFormat, isSaveDlg, multipleSelect, preselectedName, localPropertiesService, frame, null); - } + private JFileChooser getFixedFileChooser() { + return new JFileChooser() { + private static final long serialVersionUID = 1541813407103968847L; - public static File[] getFileChooserResults(final DataFormat dataFormat, boolean isSaveDlg, boolean multipleSelect, String preselectedName, LocalPropertiesService localPropertiesService, JFrame frame, File preSelectedFolder) { + @Override + public void updateUI() { + putClientProperty("FileChooser.useShellFolder", Boolean.FALSE); + super.updateUI(); + } + }; + } - JFileChooser fc ; + public JFilePicker(String textFieldLabel, String originalPathValue, String buttonLabel, DlgMode mode) { - if( preSelectedFolder == null ){ - String lastUsedFolder = localPropertiesService.getValue( EarthProperty.LAST_USED_FOLDER ); - if( !StringUtils.isBlank( lastUsedFolder ) ){ - preSelectedFolder = new File( lastUsedFolder ); - if( !preSelectedFolder.exists()){ - preSelectedFolder = null; + fileChooser = getFixedFileChooser(); + setBorder( new BevelBorder( BevelBorder.RAISED )); + this.mode = mode; + if (originalPathValue != null && originalPathValue.length() > 0) { + try { + File originalFile = new File(originalPathValue); + if( originalFile.exists() ){ + fileChooser.setCurrentDirectory(originalFile.getParentFile()); } + } catch (Exception e) { + logger.error("Unable to find parent folder for " + originalPathValue, e); //$NON-NLS-1$ } } - fc = new JFileChooserExistsAware( preSelectedFolder ); - if( preselectedName != null ){ - File selectedFile = new File( fc.getCurrentDirectory().getAbsolutePath() + File.separatorChar + preselectedName ); - fc.setSelectedFile( selectedFile ); + // creates the GUI + label = new JLabel(textFieldLabel); + setTextField(new JTextField(originalPathValue, 20)); + button = new JButton(buttonLabel); + + if (originalPathValue != null && originalPathValue.length() > 0) { + getTextField().setCaretPosition(originalPathValue.length() - 1); } - fc.setMultiSelectionEnabled( multipleSelect ); + button.addActionListener( this::buttonActionPerformed ); - File[] selectedFiles = null; - FileFilter addedFilter = getFileFilter(dataFormat); - fc.addChoosableFileFilter(addedFilter); - fc.setAcceptAllFileFilterUsed(true); - // Set the added file filter as the default chose filter - fc.setFileFilter(addedFilter); + setLayout(new GridBagLayout()); - // Handle open button action. - int returnVal ; - if( isSaveDlg ){ - returnVal = fc.showSaveDialog( frame ); - }else{ - returnVal = fc.showOpenDialog( frame); - } + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.WEST; + constraints.insets = new Insets(2, 2, 2, 2); + constraints.fill = GridBagConstraints.BOTH; - if ( returnVal == JFileChooser.APPROVE_OPTION) { + add(label, constraints); - if( multipleSelect ){ - selectedFiles = fc.getSelectedFiles(); - }else{ - selectedFiles = new File[]{fc.getSelectedFile()}; - } - - if( selectedFiles != null && selectedFiles.length > 0 ) { - if( isSaveDlg ){ - String fileName = selectedFiles[0].getAbsolutePath(); - - String fileExtension = null; - - if( fileName.lastIndexOf('.') != -1){ - fileExtension = fileName.substring( fileName.lastIndexOf('.') + 1 ).toLowerCase(); - } - - // If the chose file has no extension or the extension is not one of the default extensions for the dataformat - if ( fileExtension == null || Arrays.binarySearch( dataFormat.getPossibleFileExtensions(), fileExtension ) < 0 ) { //$NON-NLS-1$ - fileName += "." + dataFormat.getDefaultExtension(); //$NON-NLS-1$ - selectedFiles[0] = new File(fileName); - } - } - - localPropertiesService.setValue(EarthProperty.LAST_USED_FOLDER, selectedFiles[0].getParent()); - } + constraints.gridy = 1; + constraints.weightx =1; + add(getTextField(), constraints); + constraints.gridx = 1; + constraints.weightx = 0; + add(button, constraints); + + } + public void addChangeListener(DocumentListener listener) { + getTextField().getDocument().addDocumentListener(listener); + } + public void addFileTypeFilter(String extension, String description, boolean setSelected) { + FileTypeFilter filter = new FileTypeFilter(extension, description); + fileChooser.addChoosableFileFilter(filter); + if (setSelected) { + fileChooser.setFileFilter(filter); } - return selectedFiles; } - private static FileFilter getFileFilter(final DataFormat dataFormat) { - return new FileFilter() { + private void buttonActionPerformed(ActionEvent evt) { + if ( + ( mode == DlgMode.MODE_OPEN || mode == DlgMode.MODE_SAVE) && + fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION && + fileChooser.getSelectedFile() != null + ) { + getTextField().setText( fileChooser.getSelectedFile().getAbsolutePath() ); + } + } - @Override - public boolean accept(File f) { - - String[] extensions = dataFormat.getPossibleFileExtensions(); - boolean acceptedFile = false; - boolean isFolder = f.isDirectory(); - if( isFolder ){ - acceptedFile = true; - }else{ - - for (String fileExtension : extensions) { - if( f.getName().toLowerCase().endsWith("." + fileExtension ) ){ //$NON-NLS-1$ - acceptedFile = true; - break; - } - } - } + public JFileChooser getFileChooser() { + return this.fileChooser; + } - return acceptedFile; - } + public String getSelectedFilePath() { + return getTextField().getText(); + } - @Override - public String getDescription() { - return dataFormat.getDescription(); - } - }; + public void setFolderChooser() { + fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + } + + public JTextField getTextField() { + return textField; + } + + private void setTextField(JTextField textField) { + this.textField = textField; + } + + public void setTextBackground(Color bgColor) { + getTextField().setBackground(bgColor); + } + + @Override + public void setEnabled(boolean enabled) { + button.setEnabled(enabled); + textField.setEnabled(enabled); } -} +} \ No newline at end of file From bded75003d473893b77e5dc2ebcd7d8d8cc4d474 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:44 +0100 Subject: [PATCH 0351/1620] New translations JFilePicker.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 233 +++++++++--------- 1 file changed, 115 insertions(+), 118 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 21d900b58d..31589044b8 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,155 +1,152 @@ package org.openforis.collect.earth.app.view; +import java.awt.Color; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.event.ActionEvent; import java.io.File; -import java.util.Arrays; +import javax.swing.JButton; import javax.swing.JFileChooser; -import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.swing.filechooser.FileFilter; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTextField; +import javax.swing.border.BevelBorder; +import javax.swing.event.DocumentListener; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -public class JFileChooserExistsAware extends JFileChooser { +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ +public class JFilePicker extends JPanel { - private static final long serialVersionUID = 2571562963995019882L; + public enum DlgMode{MODE_OPEN,MODE_SAVE } - private JFileChooserExistsAware(File lastFolder) { - super(lastFolder); - } + private static final long serialVersionUID = 9057893034177011651L; - private JFileChooserExistsAware(){ - super(); - } + private JLabel label; + private JTextField textField; + private JButton button; + private transient Logger logger = LoggerFactory.getLogger(this.getClass()); + private JFileChooser fileChooser; - @Override - public void approveSelection(){ - File f = getSelectedFile(); - if( f!=null && f.exists() && getDialogType() == SAVE_DIALOG){ - int result = JOptionPane.showConfirmDialog(this,"The file exists, overwrite?","Existing file",JOptionPane.YES_NO_CANCEL_OPTION); //$NON-NLS-1$ //$NON-NLS-2$ - switch(result){ - case JOptionPane.YES_OPTION: - super.approveSelection(); - return; - case JOptionPane.NO_OPTION: - return; - case JOptionPane.CLOSED_OPTION: - return; - case JOptionPane.CANCEL_OPTION: - cancelSelection(); - return; - } - } - super.approveSelection(); - } + private DlgMode mode; - public static File[] getFileChooserResults(final DataFormat dataFormat, boolean isSaveDlg, boolean multipleSelect, String preselectedName, LocalPropertiesService localPropertiesService, JFrame frame) { - return getFileChooserResults(dataFormat, isSaveDlg, multipleSelect, preselectedName, localPropertiesService, frame, null); - } + private JFileChooser getFixedFileChooser() { + return new JFileChooser() { + private static final long serialVersionUID = 1541813407103968847L; - public static File[] getFileChooserResults(final DataFormat dataFormat, boolean isSaveDlg, boolean multipleSelect, String preselectedName, LocalPropertiesService localPropertiesService, JFrame frame, File preSelectedFolder) { + @Override + public void updateUI() { + putClientProperty("FileChooser.useShellFolder", Boolean.FALSE); + super.updateUI(); + } + }; + } - JFileChooser fc ; + public JFilePicker(String textFieldLabel, String originalPathValue, String buttonLabel, DlgMode mode) { - if( preSelectedFolder == null ){ - String lastUsedFolder = localPropertiesService.getValue( EarthProperty.LAST_USED_FOLDER ); - if( !StringUtils.isBlank( lastUsedFolder ) ){ - preSelectedFolder = new File( lastUsedFolder ); - if( !preSelectedFolder.exists()){ - preSelectedFolder = null; + fileChooser = getFixedFileChooser(); + setBorder( new BevelBorder( BevelBorder.RAISED )); + this.mode = mode; + if (originalPathValue != null && originalPathValue.length() > 0) { + try { + File originalFile = new File(originalPathValue); + if( originalFile.exists() ){ + fileChooser.setCurrentDirectory(originalFile.getParentFile()); } + } catch (Exception e) { + logger.error("Unable to find parent folder for " + originalPathValue, e); //$NON-NLS-1$ } } - fc = new JFileChooserExistsAware( preSelectedFolder ); - if( preselectedName != null ){ - File selectedFile = new File( fc.getCurrentDirectory().getAbsolutePath() + File.separatorChar + preselectedName ); - fc.setSelectedFile( selectedFile ); + // creates the GUI + label = new JLabel(textFieldLabel); + setTextField(new JTextField(originalPathValue, 20)); + button = new JButton(buttonLabel); + + if (originalPathValue != null && originalPathValue.length() > 0) { + getTextField().setCaretPosition(originalPathValue.length() - 1); } - fc.setMultiSelectionEnabled( multipleSelect ); + button.addActionListener( this::buttonActionPerformed ); - File[] selectedFiles = null; - FileFilter addedFilter = getFileFilter(dataFormat); - fc.addChoosableFileFilter(addedFilter); - fc.setAcceptAllFileFilterUsed(true); - // Set the added file filter as the default chose filter - fc.setFileFilter(addedFilter); + setLayout(new GridBagLayout()); - // Handle open button action. - int returnVal ; - if( isSaveDlg ){ - returnVal = fc.showSaveDialog( frame ); - }else{ - returnVal = fc.showOpenDialog( frame); - } + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.WEST; + constraints.insets = new Insets(2, 2, 2, 2); + constraints.fill = GridBagConstraints.BOTH; - if ( returnVal == JFileChooser.APPROVE_OPTION) { + add(label, constraints); - if( multipleSelect ){ - selectedFiles = fc.getSelectedFiles(); - }else{ - selectedFiles = new File[]{fc.getSelectedFile()}; - } - - if( selectedFiles != null && selectedFiles.length > 0 ) { - if( isSaveDlg ){ - String fileName = selectedFiles[0].getAbsolutePath(); - - String fileExtension = null; - - if( fileName.lastIndexOf('.') != -1){ - fileExtension = fileName.substring( fileName.lastIndexOf('.') + 1 ).toLowerCase(); - } - - // If the chose file has no extension or the extension is not one of the default extensions for the dataformat - if ( fileExtension == null || Arrays.binarySearch( dataFormat.getPossibleFileExtensions(), fileExtension ) < 0 ) { //$NON-NLS-1$ - fileName += "." + dataFormat.getDefaultExtension(); //$NON-NLS-1$ - selectedFiles[0] = new File(fileName); - } - } - - localPropertiesService.setValue(EarthProperty.LAST_USED_FOLDER, selectedFiles[0].getParent()); - } + constraints.gridy = 1; + constraints.weightx =1; + add(getTextField(), constraints); + constraints.gridx = 1; + constraints.weightx = 0; + add(button, constraints); + + } + public void addChangeListener(DocumentListener listener) { + getTextField().getDocument().addDocumentListener(listener); + } + public void addFileTypeFilter(String extension, String description, boolean setSelected) { + FileTypeFilter filter = new FileTypeFilter(extension, description); + fileChooser.addChoosableFileFilter(filter); + if (setSelected) { + fileChooser.setFileFilter(filter); } - return selectedFiles; } - private static FileFilter getFileFilter(final DataFormat dataFormat) { - return new FileFilter() { + private void buttonActionPerformed(ActionEvent evt) { + if ( + ( mode == DlgMode.MODE_OPEN || mode == DlgMode.MODE_SAVE) && + fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION && + fileChooser.getSelectedFile() != null + ) { + getTextField().setText( fileChooser.getSelectedFile().getAbsolutePath() ); + } + } - @Override - public boolean accept(File f) { - - String[] extensions = dataFormat.getPossibleFileExtensions(); - boolean acceptedFile = false; - boolean isFolder = f.isDirectory(); - if( isFolder ){ - acceptedFile = true; - }else{ - - for (String fileExtension : extensions) { - if( f.getName().toLowerCase().endsWith("." + fileExtension ) ){ //$NON-NLS-1$ - acceptedFile = true; - break; - } - } - } + public JFileChooser getFileChooser() { + return this.fileChooser; + } - return acceptedFile; - } + public String getSelectedFilePath() { + return getTextField().getText(); + } - @Override - public String getDescription() { - return dataFormat.getDescription(); - } - }; + public void setFolderChooser() { + fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + } + + public JTextField getTextField() { + return textField; + } + + private void setTextField(JTextField textField) { + this.textField = textField; + } + + public void setTextBackground(Color bgColor) { + getTextField().setBackground(bgColor); + } + + @Override + public void setEnabled(boolean enabled) { + button.setEnabled(enabled); + textField.setEnabled(enabled); } -} +} \ No newline at end of file From 236380ea903c74e680a3806389c84896275a9196 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:45 +0100 Subject: [PATCH 0352/1620] New translations JFilePicker.java (English) --- .../earth/app/view/Messages_en.properties | 233 +++++++++--------- 1 file changed, 115 insertions(+), 118 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 21d900b58d..31589044b8 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,155 +1,152 @@ package org.openforis.collect.earth.app.view; +import java.awt.Color; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.event.ActionEvent; import java.io.File; -import java.util.Arrays; +import javax.swing.JButton; import javax.swing.JFileChooser; -import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.swing.filechooser.FileFilter; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTextField; +import javax.swing.border.BevelBorder; +import javax.swing.event.DocumentListener; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -public class JFileChooserExistsAware extends JFileChooser { +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ +public class JFilePicker extends JPanel { - private static final long serialVersionUID = 2571562963995019882L; + public enum DlgMode{MODE_OPEN,MODE_SAVE } - private JFileChooserExistsAware(File lastFolder) { - super(lastFolder); - } + private static final long serialVersionUID = 9057893034177011651L; - private JFileChooserExistsAware(){ - super(); - } + private JLabel label; + private JTextField textField; + private JButton button; + private transient Logger logger = LoggerFactory.getLogger(this.getClass()); + private JFileChooser fileChooser; - @Override - public void approveSelection(){ - File f = getSelectedFile(); - if( f!=null && f.exists() && getDialogType() == SAVE_DIALOG){ - int result = JOptionPane.showConfirmDialog(this,"The file exists, overwrite?","Existing file",JOptionPane.YES_NO_CANCEL_OPTION); //$NON-NLS-1$ //$NON-NLS-2$ - switch(result){ - case JOptionPane.YES_OPTION: - super.approveSelection(); - return; - case JOptionPane.NO_OPTION: - return; - case JOptionPane.CLOSED_OPTION: - return; - case JOptionPane.CANCEL_OPTION: - cancelSelection(); - return; - } - } - super.approveSelection(); - } + private DlgMode mode; - public static File[] getFileChooserResults(final DataFormat dataFormat, boolean isSaveDlg, boolean multipleSelect, String preselectedName, LocalPropertiesService localPropertiesService, JFrame frame) { - return getFileChooserResults(dataFormat, isSaveDlg, multipleSelect, preselectedName, localPropertiesService, frame, null); - } + private JFileChooser getFixedFileChooser() { + return new JFileChooser() { + private static final long serialVersionUID = 1541813407103968847L; - public static File[] getFileChooserResults(final DataFormat dataFormat, boolean isSaveDlg, boolean multipleSelect, String preselectedName, LocalPropertiesService localPropertiesService, JFrame frame, File preSelectedFolder) { + @Override + public void updateUI() { + putClientProperty("FileChooser.useShellFolder", Boolean.FALSE); + super.updateUI(); + } + }; + } - JFileChooser fc ; + public JFilePicker(String textFieldLabel, String originalPathValue, String buttonLabel, DlgMode mode) { - if( preSelectedFolder == null ){ - String lastUsedFolder = localPropertiesService.getValue( EarthProperty.LAST_USED_FOLDER ); - if( !StringUtils.isBlank( lastUsedFolder ) ){ - preSelectedFolder = new File( lastUsedFolder ); - if( !preSelectedFolder.exists()){ - preSelectedFolder = null; + fileChooser = getFixedFileChooser(); + setBorder( new BevelBorder( BevelBorder.RAISED )); + this.mode = mode; + if (originalPathValue != null && originalPathValue.length() > 0) { + try { + File originalFile = new File(originalPathValue); + if( originalFile.exists() ){ + fileChooser.setCurrentDirectory(originalFile.getParentFile()); } + } catch (Exception e) { + logger.error("Unable to find parent folder for " + originalPathValue, e); //$NON-NLS-1$ } } - fc = new JFileChooserExistsAware( preSelectedFolder ); - if( preselectedName != null ){ - File selectedFile = new File( fc.getCurrentDirectory().getAbsolutePath() + File.separatorChar + preselectedName ); - fc.setSelectedFile( selectedFile ); + // creates the GUI + label = new JLabel(textFieldLabel); + setTextField(new JTextField(originalPathValue, 20)); + button = new JButton(buttonLabel); + + if (originalPathValue != null && originalPathValue.length() > 0) { + getTextField().setCaretPosition(originalPathValue.length() - 1); } - fc.setMultiSelectionEnabled( multipleSelect ); + button.addActionListener( this::buttonActionPerformed ); - File[] selectedFiles = null; - FileFilter addedFilter = getFileFilter(dataFormat); - fc.addChoosableFileFilter(addedFilter); - fc.setAcceptAllFileFilterUsed(true); - // Set the added file filter as the default chose filter - fc.setFileFilter(addedFilter); + setLayout(new GridBagLayout()); - // Handle open button action. - int returnVal ; - if( isSaveDlg ){ - returnVal = fc.showSaveDialog( frame ); - }else{ - returnVal = fc.showOpenDialog( frame); - } + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.WEST; + constraints.insets = new Insets(2, 2, 2, 2); + constraints.fill = GridBagConstraints.BOTH; - if ( returnVal == JFileChooser.APPROVE_OPTION) { + add(label, constraints); - if( multipleSelect ){ - selectedFiles = fc.getSelectedFiles(); - }else{ - selectedFiles = new File[]{fc.getSelectedFile()}; - } - - if( selectedFiles != null && selectedFiles.length > 0 ) { - if( isSaveDlg ){ - String fileName = selectedFiles[0].getAbsolutePath(); - - String fileExtension = null; - - if( fileName.lastIndexOf('.') != -1){ - fileExtension = fileName.substring( fileName.lastIndexOf('.') + 1 ).toLowerCase(); - } - - // If the chose file has no extension or the extension is not one of the default extensions for the dataformat - if ( fileExtension == null || Arrays.binarySearch( dataFormat.getPossibleFileExtensions(), fileExtension ) < 0 ) { //$NON-NLS-1$ - fileName += "." + dataFormat.getDefaultExtension(); //$NON-NLS-1$ - selectedFiles[0] = new File(fileName); - } - } - - localPropertiesService.setValue(EarthProperty.LAST_USED_FOLDER, selectedFiles[0].getParent()); - } + constraints.gridy = 1; + constraints.weightx =1; + add(getTextField(), constraints); + constraints.gridx = 1; + constraints.weightx = 0; + add(button, constraints); + + } + public void addChangeListener(DocumentListener listener) { + getTextField().getDocument().addDocumentListener(listener); + } + public void addFileTypeFilter(String extension, String description, boolean setSelected) { + FileTypeFilter filter = new FileTypeFilter(extension, description); + fileChooser.addChoosableFileFilter(filter); + if (setSelected) { + fileChooser.setFileFilter(filter); } - return selectedFiles; } - private static FileFilter getFileFilter(final DataFormat dataFormat) { - return new FileFilter() { + private void buttonActionPerformed(ActionEvent evt) { + if ( + ( mode == DlgMode.MODE_OPEN || mode == DlgMode.MODE_SAVE) && + fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION && + fileChooser.getSelectedFile() != null + ) { + getTextField().setText( fileChooser.getSelectedFile().getAbsolutePath() ); + } + } - @Override - public boolean accept(File f) { - - String[] extensions = dataFormat.getPossibleFileExtensions(); - boolean acceptedFile = false; - boolean isFolder = f.isDirectory(); - if( isFolder ){ - acceptedFile = true; - }else{ - - for (String fileExtension : extensions) { - if( f.getName().toLowerCase().endsWith("." + fileExtension ) ){ //$NON-NLS-1$ - acceptedFile = true; - break; - } - } - } + public JFileChooser getFileChooser() { + return this.fileChooser; + } - return acceptedFile; - } + public String getSelectedFilePath() { + return getTextField().getText(); + } - @Override - public String getDescription() { - return dataFormat.getDescription(); - } - }; + public void setFolderChooser() { + fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + } + + public JTextField getTextField() { + return textField; + } + + private void setTextField(JTextField textField) { + this.textField = textField; + } + + public void setTextBackground(Color bgColor) { + getTextField().setBackground(bgColor); + } + + @Override + public void setEnabled(boolean enabled) { + button.setEnabled(enabled); + textField.setEnabled(enabled); } -} +} \ No newline at end of file From 1b835501c3b8e178b0fbe9d4c4a5de064a199eef Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:46 +0100 Subject: [PATCH 0353/1620] New translations JPlotCsvTable.java (French) --- .../earth/app/view/Messages_fr.properties | 289 +++++++++++------- 1 file changed, 185 insertions(+), 104 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 31589044b8..e15ddb90b9 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,152 +1,233 @@ package org.openforis.collect.earth.app.view; import java.awt.Color; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.awt.event.ActionEvent; +import java.awt.Component; +import java.awt.event.MouseEvent; import java.io.File; - -import javax.swing.JButton; -import javax.swing.JFileChooser; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JTextField; -import javax.swing.border.BevelBorder; -import javax.swing.event.DocumentListener; - +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JOptionPane; +import javax.swing.JTable; +import javax.swing.table.DefaultTableModel; +import javax.swing.table.TableCellRenderer; + +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult; +import org.openforis.collect.io.metadata.collectearth.CSVRowValidationResult; +import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; +import org.openforis.collect.manager.validation.SurveyValidator.ValidationParameters; +import org.openforis.collect.model.CollectSurvey; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.opencsv.CSVReader; + /** + * Swing JTable used in the OptionWizard dialog. + * It contains methods to refresh the information loaded on the cells. * @author Alfonso Sanchez-Paus Diaz * */ -public class JFilePicker extends JPanel { +public class JPlotCsvTable extends JTable{ + + private static final Color WARNING_BG_COLOR = new Color(254, 255, 196); + private static final Color ERROR_BG_COLOR = new Color(218, 152, 152); + private static final long serialVersionUID = 3456854921119125693L; + private static final int LIMIT_LOADED_CSV_LINES = 400; + private final transient Logger logger = LoggerFactory.getLogger(this.getClass()); + private transient CollectSurvey forSurvey; + private transient CSVFileValidationResult validationResults; + + + /** + * Build a new JTable that contains the data from the CSV that is set as the file that contains the plots used by Collect Earth + * @param pathToCsvWithPlots Path to the file containing the plot locations that should be loaded in the table + * @param forSurvey Survey that the csv file belongs to + */ + public JPlotCsvTable(String pathToCsvWithPlots, CollectSurvey forSurvey) { + super(); + this.forSurvey = forSurvey; + + try { + refreshTable(pathToCsvWithPlots); + } catch (Exception e) { + logger.error("Error loading plot file"); + this.setBackground(Color.RED); + this.setToolTipText("The file chosen does not contain plot information"); - public enum DlgMode{MODE_OPEN,MODE_SAVE } + } + } - private static final long serialVersionUID = 9057893034177011651L; + /** + * The data of the CSV file is validated when the CSV/CED is loaded. This method determines if the data currently loaded is valid or not + * @return True if the data is valid. False otherwise + */ + public boolean isDataValid(){ + return validationResults==null?true:validationResults.isSuccessful(); + } - private JLabel label; - private JTextField textField; - private JButton button; - private transient Logger logger = LoggerFactory.getLogger(this.getClass()); - private JFileChooser fileChooser; - private DlgMode mode; + @Override + public Component prepareRenderer(TableCellRenderer renderer, int row, int col) { + Component comp = super.prepareRenderer(renderer, row, col); - private JFileChooser getFixedFileChooser() { - return new JFileChooser() { - private static final long serialVersionUID = 1541813407103968847L; + if ( cellHasError(row,col)){ + comp.setBackground( ERROR_BG_COLOR ); + }else{ + comp.setBackground(Color.WHITE); + } - @Override - public void updateUI() { - putClientProperty("FileChooser.useShellFolder", Boolean.FALSE); - super.updateUI(); - } - }; + return comp; } - public JFilePicker(String textFieldLabel, String originalPathValue, String buttonLabel, DlgMode mode) { + @Override + public String getToolTipText(MouseEvent event) { + String tip = null; + java.awt.Point p = event.getPoint(); + int row = rowAtPoint(p); + int col = columnAtPoint(p); - fileChooser = getFixedFileChooser(); - setBorder( new BevelBorder( BevelBorder.RAISED )); - this.mode = mode; - if (originalPathValue != null && originalPathValue.length() > 0) { - try { - File originalFile = new File(originalPathValue); - if( originalFile.exists() ){ - fileChooser.setCurrentDirectory(originalFile.getParentFile()); - } - } catch (Exception e) { - logger.error("Unable to find parent folder for " + originalPathValue, e); //$NON-NLS-1$ - } - } + try { + tip = getCellErrorMessage(row, col); + } catch (RuntimeException e1) { + //catch null pointer exception if mouse is over an empty line + } + return tip; - // creates the GUI - label = new JLabel(textFieldLabel); - setTextField(new JTextField(originalPathValue, 20)); - button = new JButton(buttonLabel); + } - if (originalPathValue != null && originalPathValue.length() > 0) { - getTextField().setCaretPosition(originalPathValue.length() - 1); + private boolean cellHasError(Integer row, Integer col) { + String errorMessage = getCellErrorMessage(row, col); + return errorMessage!=null; + } + + private String getCellErrorMessage(Integer row, Integer col) { + if( validationResults != null ){ + List rowValidations = validationResults.getRowValidations(); + for (CSVRowValidationResult csvRowValidationResult : rowValidations) { + if( csvRowValidationResult.getRowNumber().equals(row+1) && csvRowValidationResult.getColumnPosition().equals( col ) ){ + return csvRowValidationResult.getMessage(); + } + } } + return null; + } - button.addActionListener( this::buttonActionPerformed ); + /** + * Refreshes the data loaded in the table. Used when the user changes the file that contains the CSV file using the OptionWizard dialog. + * @param csvFilePath The path to the CSV file that contains the plot locations + */ + public void refreshTable(String csvFilePath) { + if( csvFilePath.trim().length() == 0 ) + return; - setLayout(new GridBagLayout()); + this.removeAll(); + boolean errorLoading = false; + final File csvFile = new File(csvFilePath); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.WEST; - constraints.insets = new Insets(2, 2, 2, 2); - constraints.fill = GridBagConstraints.BOTH; + if (csvFile.exists()) { + DefaultTableModel newTableModel = getPlotTableModel( csvFilePath ); - add(label, constraints); + validateCsvFile(csvFilePath); - constraints.gridy = 1; - constraints.weightx =1; - add(getTextField(), constraints); - constraints.gridx = 1; - constraints.weightx = 0; - add(button, constraints); + if (newTableModel.getRowCount() == 0) { + errorLoading = true; + } else { + this.setModel(newTableModel); + } + } else { + errorLoading = true; + } + if (errorLoading) { + this.setBackground(CollectEarthWindow.ERROR_COLOR); + this.setModel(new DefaultTableModel()); + } } - public void addChangeListener(DocumentListener listener) { - getTextField().getDocument().addDocumentListener(listener); - } + private String[] getColumnNames() { + // Check if the first line is actually a header. Possible if the first header column coincides with ID, PLOT_ID or PLOT + CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); + return cegtg.getExpectedHeaders( forSurvey ).toArray( new String[]{} ); - public void addFileTypeFilter(String extension, String description, boolean setSelected) { - FileTypeFilter filter = new FileTypeFilter(extension, description); - fileChooser.addChoosableFileFilter(filter); - if (setSelected) { - fileChooser.setFileFilter(filter); - } } - private void buttonActionPerformed(ActionEvent evt) { - if ( - ( mode == DlgMode.MODE_OPEN || mode == DlgMode.MODE_SAVE) && - fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION && - fileChooser.getSelectedFile() != null - ) { - getTextField().setText( fileChooser.getSelectedFile().getAbsolutePath() ); + private DefaultTableModel getPlotTableModel(String csvFilePath) { + + String[][] allValues = new String[0][0]; + + try ( CSVReader reader = CsvReaderUtils.getCsvReader(csvFilePath) ){ + String[] line; + List allLines = new ArrayList<>(); + int i =0; + while( ( line = reader.readNext() ) != null && i< LIMIT_LOADED_CSV_LINES ) { // we do this to avoid out of memory errors + i++; + allLines.add( line ); } - } - public JFileChooser getFileChooser() { - return this.fileChooser; - } + allValues = allLines.toArray(new String[][] {}); + } catch (Exception e) { + logger.error(" Error reading the CSV file " + csvFilePath, e); + } - public String getSelectedFilePath() { - return getTextField().getText(); + return new DefaultTableModel( allValues , getColumnNames()); } - public void setFolderChooser() { - fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); - } + protected void validateCsvFile(String csvFilePath) { + + CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); + ValidationParameters validationParameters = new ValidationParameters(); + validationParameters.setValidateOnlyFirstLines( false ); + CSVFileValidationResult validation = cegtg.validate( new File(csvFilePath), forSurvey, validationParameters); + + this.setBackground( Color.white ); + + + if( !validation.isSuccessful() ){ + switch ( validation.getErrorType() ) { + case INVALID_FILE_TYPE: + case INVALID_NUMBER_OF_COLUMNS: + JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); + JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The expected file type is CSV or CED ", "Expected File Type", JOptionPane.ERROR_MESSAGE); + break; + + case INVALID_HEADERS: + JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); + JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The expected columns in the CSV are " + validation.getExpectedHeaders(), "Columns in CSV do not match survey", JOptionPane.ERROR_MESSAGE); + validation = null; // not bad enough to stop the user from loading the CSV file + break; + case INVALID_NUMBER_OF_PLOTS_TOO_LARGE: + JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); + JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "Using CSV files that are too large makes Google Earth extremely slow.\nPlease divide this CSV file into smaller file (reccomended less than 2000 plots per CSV file.\nNumber of plots in this file : " + validation.getNumberOfRows() , "File too large", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + validation = null; // not bad enough to stop the user from loading the CSV file + break; + + case INVALID_NUMBER_OF_PLOTS_WARNING: + JPlotCsvTable.this.setBackground( WARNING_BG_COLOR); + JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "Using CSV files that are too large makes Google Earth slow.\n Please divide this CSV file into smaller file (reccomended size is less than 2000 plots per CSV file.\nNumber of plots in this file : " + validation.getNumberOfRows() , "File too large", JOptionPane.WARNING_MESSAGE); //$NON-NLS-1$ + validation = null; // not bad enough to stop the user from loading the CSV file + break; + + case INVALID_VALUES_IN_CSV: + // IN THIS CASE THE CELL RENDERER TAKES CARE OF HIGHLIGHTING THE CELLS!!! + JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The content of the CSV file is not correct!! The values on the cells highlighted are incorrect " , "CSV content is not correct", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + break; + + default: + break; + } + } - public JTextField getTextField() { - return textField; - } - private void setTextField(JTextField textField) { - this.textField = textField; + this.setValidationResults( validation ); } - public void setTextBackground(Color bgColor) { - getTextField().setBackground(bgColor); - } - @Override - public void setEnabled(boolean enabled) { - button.setEnabled(enabled); - textField.setEnabled(enabled); + private void setValidationResults(CSVFileValidationResult validationResults) { + this.validationResults = validationResults; } -} \ No newline at end of file +} From 4df3a15520f1659c093a0d42e60be65538139325 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:47 +0100 Subject: [PATCH 0354/1620] New translations JPlotCsvTable.java (Spanish) --- .../earth/app/view/Messages_es.properties | 289 +++++++++++------- 1 file changed, 185 insertions(+), 104 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 31589044b8..e15ddb90b9 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,152 +1,233 @@ package org.openforis.collect.earth.app.view; import java.awt.Color; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.awt.event.ActionEvent; +import java.awt.Component; +import java.awt.event.MouseEvent; import java.io.File; - -import javax.swing.JButton; -import javax.swing.JFileChooser; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JTextField; -import javax.swing.border.BevelBorder; -import javax.swing.event.DocumentListener; - +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JOptionPane; +import javax.swing.JTable; +import javax.swing.table.DefaultTableModel; +import javax.swing.table.TableCellRenderer; + +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult; +import org.openforis.collect.io.metadata.collectearth.CSVRowValidationResult; +import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; +import org.openforis.collect.manager.validation.SurveyValidator.ValidationParameters; +import org.openforis.collect.model.CollectSurvey; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.opencsv.CSVReader; + /** + * Swing JTable used in the OptionWizard dialog. + * It contains methods to refresh the information loaded on the cells. * @author Alfonso Sanchez-Paus Diaz * */ -public class JFilePicker extends JPanel { +public class JPlotCsvTable extends JTable{ + + private static final Color WARNING_BG_COLOR = new Color(254, 255, 196); + private static final Color ERROR_BG_COLOR = new Color(218, 152, 152); + private static final long serialVersionUID = 3456854921119125693L; + private static final int LIMIT_LOADED_CSV_LINES = 400; + private final transient Logger logger = LoggerFactory.getLogger(this.getClass()); + private transient CollectSurvey forSurvey; + private transient CSVFileValidationResult validationResults; + + + /** + * Build a new JTable that contains the data from the CSV that is set as the file that contains the plots used by Collect Earth + * @param pathToCsvWithPlots Path to the file containing the plot locations that should be loaded in the table + * @param forSurvey Survey that the csv file belongs to + */ + public JPlotCsvTable(String pathToCsvWithPlots, CollectSurvey forSurvey) { + super(); + this.forSurvey = forSurvey; + + try { + refreshTable(pathToCsvWithPlots); + } catch (Exception e) { + logger.error("Error loading plot file"); + this.setBackground(Color.RED); + this.setToolTipText("The file chosen does not contain plot information"); - public enum DlgMode{MODE_OPEN,MODE_SAVE } + } + } - private static final long serialVersionUID = 9057893034177011651L; + /** + * The data of the CSV file is validated when the CSV/CED is loaded. This method determines if the data currently loaded is valid or not + * @return True if the data is valid. False otherwise + */ + public boolean isDataValid(){ + return validationResults==null?true:validationResults.isSuccessful(); + } - private JLabel label; - private JTextField textField; - private JButton button; - private transient Logger logger = LoggerFactory.getLogger(this.getClass()); - private JFileChooser fileChooser; - private DlgMode mode; + @Override + public Component prepareRenderer(TableCellRenderer renderer, int row, int col) { + Component comp = super.prepareRenderer(renderer, row, col); - private JFileChooser getFixedFileChooser() { - return new JFileChooser() { - private static final long serialVersionUID = 1541813407103968847L; + if ( cellHasError(row,col)){ + comp.setBackground( ERROR_BG_COLOR ); + }else{ + comp.setBackground(Color.WHITE); + } - @Override - public void updateUI() { - putClientProperty("FileChooser.useShellFolder", Boolean.FALSE); - super.updateUI(); - } - }; + return comp; } - public JFilePicker(String textFieldLabel, String originalPathValue, String buttonLabel, DlgMode mode) { + @Override + public String getToolTipText(MouseEvent event) { + String tip = null; + java.awt.Point p = event.getPoint(); + int row = rowAtPoint(p); + int col = columnAtPoint(p); - fileChooser = getFixedFileChooser(); - setBorder( new BevelBorder( BevelBorder.RAISED )); - this.mode = mode; - if (originalPathValue != null && originalPathValue.length() > 0) { - try { - File originalFile = new File(originalPathValue); - if( originalFile.exists() ){ - fileChooser.setCurrentDirectory(originalFile.getParentFile()); - } - } catch (Exception e) { - logger.error("Unable to find parent folder for " + originalPathValue, e); //$NON-NLS-1$ - } - } + try { + tip = getCellErrorMessage(row, col); + } catch (RuntimeException e1) { + //catch null pointer exception if mouse is over an empty line + } + return tip; - // creates the GUI - label = new JLabel(textFieldLabel); - setTextField(new JTextField(originalPathValue, 20)); - button = new JButton(buttonLabel); + } - if (originalPathValue != null && originalPathValue.length() > 0) { - getTextField().setCaretPosition(originalPathValue.length() - 1); + private boolean cellHasError(Integer row, Integer col) { + String errorMessage = getCellErrorMessage(row, col); + return errorMessage!=null; + } + + private String getCellErrorMessage(Integer row, Integer col) { + if( validationResults != null ){ + List rowValidations = validationResults.getRowValidations(); + for (CSVRowValidationResult csvRowValidationResult : rowValidations) { + if( csvRowValidationResult.getRowNumber().equals(row+1) && csvRowValidationResult.getColumnPosition().equals( col ) ){ + return csvRowValidationResult.getMessage(); + } + } } + return null; + } - button.addActionListener( this::buttonActionPerformed ); + /** + * Refreshes the data loaded in the table. Used when the user changes the file that contains the CSV file using the OptionWizard dialog. + * @param csvFilePath The path to the CSV file that contains the plot locations + */ + public void refreshTable(String csvFilePath) { + if( csvFilePath.trim().length() == 0 ) + return; - setLayout(new GridBagLayout()); + this.removeAll(); + boolean errorLoading = false; + final File csvFile = new File(csvFilePath); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.WEST; - constraints.insets = new Insets(2, 2, 2, 2); - constraints.fill = GridBagConstraints.BOTH; + if (csvFile.exists()) { + DefaultTableModel newTableModel = getPlotTableModel( csvFilePath ); - add(label, constraints); + validateCsvFile(csvFilePath); - constraints.gridy = 1; - constraints.weightx =1; - add(getTextField(), constraints); - constraints.gridx = 1; - constraints.weightx = 0; - add(button, constraints); + if (newTableModel.getRowCount() == 0) { + errorLoading = true; + } else { + this.setModel(newTableModel); + } + } else { + errorLoading = true; + } + if (errorLoading) { + this.setBackground(CollectEarthWindow.ERROR_COLOR); + this.setModel(new DefaultTableModel()); + } } - public void addChangeListener(DocumentListener listener) { - getTextField().getDocument().addDocumentListener(listener); - } + private String[] getColumnNames() { + // Check if the first line is actually a header. Possible if the first header column coincides with ID, PLOT_ID or PLOT + CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); + return cegtg.getExpectedHeaders( forSurvey ).toArray( new String[]{} ); - public void addFileTypeFilter(String extension, String description, boolean setSelected) { - FileTypeFilter filter = new FileTypeFilter(extension, description); - fileChooser.addChoosableFileFilter(filter); - if (setSelected) { - fileChooser.setFileFilter(filter); - } } - private void buttonActionPerformed(ActionEvent evt) { - if ( - ( mode == DlgMode.MODE_OPEN || mode == DlgMode.MODE_SAVE) && - fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION && - fileChooser.getSelectedFile() != null - ) { - getTextField().setText( fileChooser.getSelectedFile().getAbsolutePath() ); + private DefaultTableModel getPlotTableModel(String csvFilePath) { + + String[][] allValues = new String[0][0]; + + try ( CSVReader reader = CsvReaderUtils.getCsvReader(csvFilePath) ){ + String[] line; + List allLines = new ArrayList<>(); + int i =0; + while( ( line = reader.readNext() ) != null && i< LIMIT_LOADED_CSV_LINES ) { // we do this to avoid out of memory errors + i++; + allLines.add( line ); } - } - public JFileChooser getFileChooser() { - return this.fileChooser; - } + allValues = allLines.toArray(new String[][] {}); + } catch (Exception e) { + logger.error(" Error reading the CSV file " + csvFilePath, e); + } - public String getSelectedFilePath() { - return getTextField().getText(); + return new DefaultTableModel( allValues , getColumnNames()); } - public void setFolderChooser() { - fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); - } + protected void validateCsvFile(String csvFilePath) { + + CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); + ValidationParameters validationParameters = new ValidationParameters(); + validationParameters.setValidateOnlyFirstLines( false ); + CSVFileValidationResult validation = cegtg.validate( new File(csvFilePath), forSurvey, validationParameters); + + this.setBackground( Color.white ); + + + if( !validation.isSuccessful() ){ + switch ( validation.getErrorType() ) { + case INVALID_FILE_TYPE: + case INVALID_NUMBER_OF_COLUMNS: + JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); + JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The expected file type is CSV or CED ", "Expected File Type", JOptionPane.ERROR_MESSAGE); + break; + + case INVALID_HEADERS: + JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); + JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The expected columns in the CSV are " + validation.getExpectedHeaders(), "Columns in CSV do not match survey", JOptionPane.ERROR_MESSAGE); + validation = null; // not bad enough to stop the user from loading the CSV file + break; + case INVALID_NUMBER_OF_PLOTS_TOO_LARGE: + JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); + JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "Using CSV files that are too large makes Google Earth extremely slow.\nPlease divide this CSV file into smaller file (reccomended less than 2000 plots per CSV file.\nNumber of plots in this file : " + validation.getNumberOfRows() , "File too large", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + validation = null; // not bad enough to stop the user from loading the CSV file + break; + + case INVALID_NUMBER_OF_PLOTS_WARNING: + JPlotCsvTable.this.setBackground( WARNING_BG_COLOR); + JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "Using CSV files that are too large makes Google Earth slow.\n Please divide this CSV file into smaller file (reccomended size is less than 2000 plots per CSV file.\nNumber of plots in this file : " + validation.getNumberOfRows() , "File too large", JOptionPane.WARNING_MESSAGE); //$NON-NLS-1$ + validation = null; // not bad enough to stop the user from loading the CSV file + break; + + case INVALID_VALUES_IN_CSV: + // IN THIS CASE THE CELL RENDERER TAKES CARE OF HIGHLIGHTING THE CELLS!!! + JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The content of the CSV file is not correct!! The values on the cells highlighted are incorrect " , "CSV content is not correct", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + break; + + default: + break; + } + } - public JTextField getTextField() { - return textField; - } - private void setTextField(JTextField textField) { - this.textField = textField; + this.setValidationResults( validation ); } - public void setTextBackground(Color bgColor) { - getTextField().setBackground(bgColor); - } - @Override - public void setEnabled(boolean enabled) { - button.setEnabled(enabled); - textField.setEnabled(enabled); + private void setValidationResults(CSVFileValidationResult validationResults) { + this.validationResults = validationResults; } -} \ No newline at end of file +} From f55cf6bc1bb0c39ebc103cd41cec168fd0b484b9 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:48 +0100 Subject: [PATCH 0355/1620] New translations JPlotCsvTable.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 289 +++++++++++------- 1 file changed, 185 insertions(+), 104 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 31589044b8..e15ddb90b9 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,152 +1,233 @@ package org.openforis.collect.earth.app.view; import java.awt.Color; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.awt.event.ActionEvent; +import java.awt.Component; +import java.awt.event.MouseEvent; import java.io.File; - -import javax.swing.JButton; -import javax.swing.JFileChooser; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JTextField; -import javax.swing.border.BevelBorder; -import javax.swing.event.DocumentListener; - +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JOptionPane; +import javax.swing.JTable; +import javax.swing.table.DefaultTableModel; +import javax.swing.table.TableCellRenderer; + +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult; +import org.openforis.collect.io.metadata.collectearth.CSVRowValidationResult; +import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; +import org.openforis.collect.manager.validation.SurveyValidator.ValidationParameters; +import org.openforis.collect.model.CollectSurvey; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.opencsv.CSVReader; + /** + * Swing JTable used in the OptionWizard dialog. + * It contains methods to refresh the information loaded on the cells. * @author Alfonso Sanchez-Paus Diaz * */ -public class JFilePicker extends JPanel { +public class JPlotCsvTable extends JTable{ + + private static final Color WARNING_BG_COLOR = new Color(254, 255, 196); + private static final Color ERROR_BG_COLOR = new Color(218, 152, 152); + private static final long serialVersionUID = 3456854921119125693L; + private static final int LIMIT_LOADED_CSV_LINES = 400; + private final transient Logger logger = LoggerFactory.getLogger(this.getClass()); + private transient CollectSurvey forSurvey; + private transient CSVFileValidationResult validationResults; + + + /** + * Build a new JTable that contains the data from the CSV that is set as the file that contains the plots used by Collect Earth + * @param pathToCsvWithPlots Path to the file containing the plot locations that should be loaded in the table + * @param forSurvey Survey that the csv file belongs to + */ + public JPlotCsvTable(String pathToCsvWithPlots, CollectSurvey forSurvey) { + super(); + this.forSurvey = forSurvey; + + try { + refreshTable(pathToCsvWithPlots); + } catch (Exception e) { + logger.error("Error loading plot file"); + this.setBackground(Color.RED); + this.setToolTipText("The file chosen does not contain plot information"); - public enum DlgMode{MODE_OPEN,MODE_SAVE } + } + } - private static final long serialVersionUID = 9057893034177011651L; + /** + * The data of the CSV file is validated when the CSV/CED is loaded. This method determines if the data currently loaded is valid or not + * @return True if the data is valid. False otherwise + */ + public boolean isDataValid(){ + return validationResults==null?true:validationResults.isSuccessful(); + } - private JLabel label; - private JTextField textField; - private JButton button; - private transient Logger logger = LoggerFactory.getLogger(this.getClass()); - private JFileChooser fileChooser; - private DlgMode mode; + @Override + public Component prepareRenderer(TableCellRenderer renderer, int row, int col) { + Component comp = super.prepareRenderer(renderer, row, col); - private JFileChooser getFixedFileChooser() { - return new JFileChooser() { - private static final long serialVersionUID = 1541813407103968847L; + if ( cellHasError(row,col)){ + comp.setBackground( ERROR_BG_COLOR ); + }else{ + comp.setBackground(Color.WHITE); + } - @Override - public void updateUI() { - putClientProperty("FileChooser.useShellFolder", Boolean.FALSE); - super.updateUI(); - } - }; + return comp; } - public JFilePicker(String textFieldLabel, String originalPathValue, String buttonLabel, DlgMode mode) { + @Override + public String getToolTipText(MouseEvent event) { + String tip = null; + java.awt.Point p = event.getPoint(); + int row = rowAtPoint(p); + int col = columnAtPoint(p); - fileChooser = getFixedFileChooser(); - setBorder( new BevelBorder( BevelBorder.RAISED )); - this.mode = mode; - if (originalPathValue != null && originalPathValue.length() > 0) { - try { - File originalFile = new File(originalPathValue); - if( originalFile.exists() ){ - fileChooser.setCurrentDirectory(originalFile.getParentFile()); - } - } catch (Exception e) { - logger.error("Unable to find parent folder for " + originalPathValue, e); //$NON-NLS-1$ - } - } + try { + tip = getCellErrorMessage(row, col); + } catch (RuntimeException e1) { + //catch null pointer exception if mouse is over an empty line + } + return tip; - // creates the GUI - label = new JLabel(textFieldLabel); - setTextField(new JTextField(originalPathValue, 20)); - button = new JButton(buttonLabel); + } - if (originalPathValue != null && originalPathValue.length() > 0) { - getTextField().setCaretPosition(originalPathValue.length() - 1); + private boolean cellHasError(Integer row, Integer col) { + String errorMessage = getCellErrorMessage(row, col); + return errorMessage!=null; + } + + private String getCellErrorMessage(Integer row, Integer col) { + if( validationResults != null ){ + List rowValidations = validationResults.getRowValidations(); + for (CSVRowValidationResult csvRowValidationResult : rowValidations) { + if( csvRowValidationResult.getRowNumber().equals(row+1) && csvRowValidationResult.getColumnPosition().equals( col ) ){ + return csvRowValidationResult.getMessage(); + } + } } + return null; + } - button.addActionListener( this::buttonActionPerformed ); + /** + * Refreshes the data loaded in the table. Used when the user changes the file that contains the CSV file using the OptionWizard dialog. + * @param csvFilePath The path to the CSV file that contains the plot locations + */ + public void refreshTable(String csvFilePath) { + if( csvFilePath.trim().length() == 0 ) + return; - setLayout(new GridBagLayout()); + this.removeAll(); + boolean errorLoading = false; + final File csvFile = new File(csvFilePath); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.WEST; - constraints.insets = new Insets(2, 2, 2, 2); - constraints.fill = GridBagConstraints.BOTH; + if (csvFile.exists()) { + DefaultTableModel newTableModel = getPlotTableModel( csvFilePath ); - add(label, constraints); + validateCsvFile(csvFilePath); - constraints.gridy = 1; - constraints.weightx =1; - add(getTextField(), constraints); - constraints.gridx = 1; - constraints.weightx = 0; - add(button, constraints); + if (newTableModel.getRowCount() == 0) { + errorLoading = true; + } else { + this.setModel(newTableModel); + } + } else { + errorLoading = true; + } + if (errorLoading) { + this.setBackground(CollectEarthWindow.ERROR_COLOR); + this.setModel(new DefaultTableModel()); + } } - public void addChangeListener(DocumentListener listener) { - getTextField().getDocument().addDocumentListener(listener); - } + private String[] getColumnNames() { + // Check if the first line is actually a header. Possible if the first header column coincides with ID, PLOT_ID or PLOT + CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); + return cegtg.getExpectedHeaders( forSurvey ).toArray( new String[]{} ); - public void addFileTypeFilter(String extension, String description, boolean setSelected) { - FileTypeFilter filter = new FileTypeFilter(extension, description); - fileChooser.addChoosableFileFilter(filter); - if (setSelected) { - fileChooser.setFileFilter(filter); - } } - private void buttonActionPerformed(ActionEvent evt) { - if ( - ( mode == DlgMode.MODE_OPEN || mode == DlgMode.MODE_SAVE) && - fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION && - fileChooser.getSelectedFile() != null - ) { - getTextField().setText( fileChooser.getSelectedFile().getAbsolutePath() ); + private DefaultTableModel getPlotTableModel(String csvFilePath) { + + String[][] allValues = new String[0][0]; + + try ( CSVReader reader = CsvReaderUtils.getCsvReader(csvFilePath) ){ + String[] line; + List allLines = new ArrayList<>(); + int i =0; + while( ( line = reader.readNext() ) != null && i< LIMIT_LOADED_CSV_LINES ) { // we do this to avoid out of memory errors + i++; + allLines.add( line ); } - } - public JFileChooser getFileChooser() { - return this.fileChooser; - } + allValues = allLines.toArray(new String[][] {}); + } catch (Exception e) { + logger.error(" Error reading the CSV file " + csvFilePath, e); + } - public String getSelectedFilePath() { - return getTextField().getText(); + return new DefaultTableModel( allValues , getColumnNames()); } - public void setFolderChooser() { - fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); - } + protected void validateCsvFile(String csvFilePath) { + + CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); + ValidationParameters validationParameters = new ValidationParameters(); + validationParameters.setValidateOnlyFirstLines( false ); + CSVFileValidationResult validation = cegtg.validate( new File(csvFilePath), forSurvey, validationParameters); + + this.setBackground( Color.white ); + + + if( !validation.isSuccessful() ){ + switch ( validation.getErrorType() ) { + case INVALID_FILE_TYPE: + case INVALID_NUMBER_OF_COLUMNS: + JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); + JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The expected file type is CSV or CED ", "Expected File Type", JOptionPane.ERROR_MESSAGE); + break; + + case INVALID_HEADERS: + JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); + JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The expected columns in the CSV are " + validation.getExpectedHeaders(), "Columns in CSV do not match survey", JOptionPane.ERROR_MESSAGE); + validation = null; // not bad enough to stop the user from loading the CSV file + break; + case INVALID_NUMBER_OF_PLOTS_TOO_LARGE: + JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); + JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "Using CSV files that are too large makes Google Earth extremely slow.\nPlease divide this CSV file into smaller file (reccomended less than 2000 plots per CSV file.\nNumber of plots in this file : " + validation.getNumberOfRows() , "File too large", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + validation = null; // not bad enough to stop the user from loading the CSV file + break; + + case INVALID_NUMBER_OF_PLOTS_WARNING: + JPlotCsvTable.this.setBackground( WARNING_BG_COLOR); + JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "Using CSV files that are too large makes Google Earth slow.\n Please divide this CSV file into smaller file (reccomended size is less than 2000 plots per CSV file.\nNumber of plots in this file : " + validation.getNumberOfRows() , "File too large", JOptionPane.WARNING_MESSAGE); //$NON-NLS-1$ + validation = null; // not bad enough to stop the user from loading the CSV file + break; + + case INVALID_VALUES_IN_CSV: + // IN THIS CASE THE CELL RENDERER TAKES CARE OF HIGHLIGHTING THE CELLS!!! + JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The content of the CSV file is not correct!! The values on the cells highlighted are incorrect " , "CSV content is not correct", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + break; + + default: + break; + } + } - public JTextField getTextField() { - return textField; - } - private void setTextField(JTextField textField) { - this.textField = textField; + this.setValidationResults( validation ); } - public void setTextBackground(Color bgColor) { - getTextField().setBackground(bgColor); - } - @Override - public void setEnabled(boolean enabled) { - button.setEnabled(enabled); - textField.setEnabled(enabled); + private void setValidationResults(CSVFileValidationResult validationResults) { + this.validationResults = validationResults; } -} \ No newline at end of file +} From e06ae9f80b3b4cda7beb377b73640e3c4afe1ad3 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:49 +0100 Subject: [PATCH 0356/1620] New translations JPlotCsvTable.java (English) --- .../earth/app/view/Messages_en.properties | 289 +++++++++++------- 1 file changed, 185 insertions(+), 104 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 31589044b8..e15ddb90b9 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,152 +1,233 @@ package org.openforis.collect.earth.app.view; import java.awt.Color; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.awt.event.ActionEvent; +import java.awt.Component; +import java.awt.event.MouseEvent; import java.io.File; - -import javax.swing.JButton; -import javax.swing.JFileChooser; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JTextField; -import javax.swing.border.BevelBorder; -import javax.swing.event.DocumentListener; - +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JOptionPane; +import javax.swing.JTable; +import javax.swing.table.DefaultTableModel; +import javax.swing.table.TableCellRenderer; + +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult; +import org.openforis.collect.io.metadata.collectearth.CSVRowValidationResult; +import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; +import org.openforis.collect.manager.validation.SurveyValidator.ValidationParameters; +import org.openforis.collect.model.CollectSurvey; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.opencsv.CSVReader; + /** + * Swing JTable used in the OptionWizard dialog. + * It contains methods to refresh the information loaded on the cells. * @author Alfonso Sanchez-Paus Diaz * */ -public class JFilePicker extends JPanel { +public class JPlotCsvTable extends JTable{ + + private static final Color WARNING_BG_COLOR = new Color(254, 255, 196); + private static final Color ERROR_BG_COLOR = new Color(218, 152, 152); + private static final long serialVersionUID = 3456854921119125693L; + private static final int LIMIT_LOADED_CSV_LINES = 400; + private final transient Logger logger = LoggerFactory.getLogger(this.getClass()); + private transient CollectSurvey forSurvey; + private transient CSVFileValidationResult validationResults; + + + /** + * Build a new JTable that contains the data from the CSV that is set as the file that contains the plots used by Collect Earth + * @param pathToCsvWithPlots Path to the file containing the plot locations that should be loaded in the table + * @param forSurvey Survey that the csv file belongs to + */ + public JPlotCsvTable(String pathToCsvWithPlots, CollectSurvey forSurvey) { + super(); + this.forSurvey = forSurvey; + + try { + refreshTable(pathToCsvWithPlots); + } catch (Exception e) { + logger.error("Error loading plot file"); + this.setBackground(Color.RED); + this.setToolTipText("The file chosen does not contain plot information"); - public enum DlgMode{MODE_OPEN,MODE_SAVE } + } + } - private static final long serialVersionUID = 9057893034177011651L; + /** + * The data of the CSV file is validated when the CSV/CED is loaded. This method determines if the data currently loaded is valid or not + * @return True if the data is valid. False otherwise + */ + public boolean isDataValid(){ + return validationResults==null?true:validationResults.isSuccessful(); + } - private JLabel label; - private JTextField textField; - private JButton button; - private transient Logger logger = LoggerFactory.getLogger(this.getClass()); - private JFileChooser fileChooser; - private DlgMode mode; + @Override + public Component prepareRenderer(TableCellRenderer renderer, int row, int col) { + Component comp = super.prepareRenderer(renderer, row, col); - private JFileChooser getFixedFileChooser() { - return new JFileChooser() { - private static final long serialVersionUID = 1541813407103968847L; + if ( cellHasError(row,col)){ + comp.setBackground( ERROR_BG_COLOR ); + }else{ + comp.setBackground(Color.WHITE); + } - @Override - public void updateUI() { - putClientProperty("FileChooser.useShellFolder", Boolean.FALSE); - super.updateUI(); - } - }; + return comp; } - public JFilePicker(String textFieldLabel, String originalPathValue, String buttonLabel, DlgMode mode) { + @Override + public String getToolTipText(MouseEvent event) { + String tip = null; + java.awt.Point p = event.getPoint(); + int row = rowAtPoint(p); + int col = columnAtPoint(p); - fileChooser = getFixedFileChooser(); - setBorder( new BevelBorder( BevelBorder.RAISED )); - this.mode = mode; - if (originalPathValue != null && originalPathValue.length() > 0) { - try { - File originalFile = new File(originalPathValue); - if( originalFile.exists() ){ - fileChooser.setCurrentDirectory(originalFile.getParentFile()); - } - } catch (Exception e) { - logger.error("Unable to find parent folder for " + originalPathValue, e); //$NON-NLS-1$ - } - } + try { + tip = getCellErrorMessage(row, col); + } catch (RuntimeException e1) { + //catch null pointer exception if mouse is over an empty line + } + return tip; - // creates the GUI - label = new JLabel(textFieldLabel); - setTextField(new JTextField(originalPathValue, 20)); - button = new JButton(buttonLabel); + } - if (originalPathValue != null && originalPathValue.length() > 0) { - getTextField().setCaretPosition(originalPathValue.length() - 1); + private boolean cellHasError(Integer row, Integer col) { + String errorMessage = getCellErrorMessage(row, col); + return errorMessage!=null; + } + + private String getCellErrorMessage(Integer row, Integer col) { + if( validationResults != null ){ + List rowValidations = validationResults.getRowValidations(); + for (CSVRowValidationResult csvRowValidationResult : rowValidations) { + if( csvRowValidationResult.getRowNumber().equals(row+1) && csvRowValidationResult.getColumnPosition().equals( col ) ){ + return csvRowValidationResult.getMessage(); + } + } } + return null; + } - button.addActionListener( this::buttonActionPerformed ); + /** + * Refreshes the data loaded in the table. Used when the user changes the file that contains the CSV file using the OptionWizard dialog. + * @param csvFilePath The path to the CSV file that contains the plot locations + */ + public void refreshTable(String csvFilePath) { + if( csvFilePath.trim().length() == 0 ) + return; - setLayout(new GridBagLayout()); + this.removeAll(); + boolean errorLoading = false; + final File csvFile = new File(csvFilePath); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.WEST; - constraints.insets = new Insets(2, 2, 2, 2); - constraints.fill = GridBagConstraints.BOTH; + if (csvFile.exists()) { + DefaultTableModel newTableModel = getPlotTableModel( csvFilePath ); - add(label, constraints); + validateCsvFile(csvFilePath); - constraints.gridy = 1; - constraints.weightx =1; - add(getTextField(), constraints); - constraints.gridx = 1; - constraints.weightx = 0; - add(button, constraints); + if (newTableModel.getRowCount() == 0) { + errorLoading = true; + } else { + this.setModel(newTableModel); + } + } else { + errorLoading = true; + } + if (errorLoading) { + this.setBackground(CollectEarthWindow.ERROR_COLOR); + this.setModel(new DefaultTableModel()); + } } - public void addChangeListener(DocumentListener listener) { - getTextField().getDocument().addDocumentListener(listener); - } + private String[] getColumnNames() { + // Check if the first line is actually a header. Possible if the first header column coincides with ID, PLOT_ID or PLOT + CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); + return cegtg.getExpectedHeaders( forSurvey ).toArray( new String[]{} ); - public void addFileTypeFilter(String extension, String description, boolean setSelected) { - FileTypeFilter filter = new FileTypeFilter(extension, description); - fileChooser.addChoosableFileFilter(filter); - if (setSelected) { - fileChooser.setFileFilter(filter); - } } - private void buttonActionPerformed(ActionEvent evt) { - if ( - ( mode == DlgMode.MODE_OPEN || mode == DlgMode.MODE_SAVE) && - fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION && - fileChooser.getSelectedFile() != null - ) { - getTextField().setText( fileChooser.getSelectedFile().getAbsolutePath() ); + private DefaultTableModel getPlotTableModel(String csvFilePath) { + + String[][] allValues = new String[0][0]; + + try ( CSVReader reader = CsvReaderUtils.getCsvReader(csvFilePath) ){ + String[] line; + List allLines = new ArrayList<>(); + int i =0; + while( ( line = reader.readNext() ) != null && i< LIMIT_LOADED_CSV_LINES ) { // we do this to avoid out of memory errors + i++; + allLines.add( line ); } - } - public JFileChooser getFileChooser() { - return this.fileChooser; - } + allValues = allLines.toArray(new String[][] {}); + } catch (Exception e) { + logger.error(" Error reading the CSV file " + csvFilePath, e); + } - public String getSelectedFilePath() { - return getTextField().getText(); + return new DefaultTableModel( allValues , getColumnNames()); } - public void setFolderChooser() { - fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); - } + protected void validateCsvFile(String csvFilePath) { + + CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); + ValidationParameters validationParameters = new ValidationParameters(); + validationParameters.setValidateOnlyFirstLines( false ); + CSVFileValidationResult validation = cegtg.validate( new File(csvFilePath), forSurvey, validationParameters); + + this.setBackground( Color.white ); + + + if( !validation.isSuccessful() ){ + switch ( validation.getErrorType() ) { + case INVALID_FILE_TYPE: + case INVALID_NUMBER_OF_COLUMNS: + JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); + JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The expected file type is CSV or CED ", "Expected File Type", JOptionPane.ERROR_MESSAGE); + break; + + case INVALID_HEADERS: + JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); + JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The expected columns in the CSV are " + validation.getExpectedHeaders(), "Columns in CSV do not match survey", JOptionPane.ERROR_MESSAGE); + validation = null; // not bad enough to stop the user from loading the CSV file + break; + case INVALID_NUMBER_OF_PLOTS_TOO_LARGE: + JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); + JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "Using CSV files that are too large makes Google Earth extremely slow.\nPlease divide this CSV file into smaller file (reccomended less than 2000 plots per CSV file.\nNumber of plots in this file : " + validation.getNumberOfRows() , "File too large", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + validation = null; // not bad enough to stop the user from loading the CSV file + break; + + case INVALID_NUMBER_OF_PLOTS_WARNING: + JPlotCsvTable.this.setBackground( WARNING_BG_COLOR); + JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "Using CSV files that are too large makes Google Earth slow.\n Please divide this CSV file into smaller file (reccomended size is less than 2000 plots per CSV file.\nNumber of plots in this file : " + validation.getNumberOfRows() , "File too large", JOptionPane.WARNING_MESSAGE); //$NON-NLS-1$ + validation = null; // not bad enough to stop the user from loading the CSV file + break; + + case INVALID_VALUES_IN_CSV: + // IN THIS CASE THE CELL RENDERER TAKES CARE OF HIGHLIGHTING THE CELLS!!! + JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The content of the CSV file is not correct!! The values on the cells highlighted are incorrect " , "CSV content is not correct", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + break; + + default: + break; + } + } - public JTextField getTextField() { - return textField; - } - private void setTextField(JTextField textField) { - this.textField = textField; + this.setValidationResults( validation ); } - public void setTextBackground(Color bgColor) { - getTextField().setBackground(bgColor); - } - @Override - public void setEnabled(boolean enabled) { - button.setEnabled(enabled); - textField.setEnabled(enabled); + private void setValidationResults(CSVFileValidationResult validationResults) { + this.validationResults = validationResults; } -} \ No newline at end of file +} From ee1f91a0b264702388edc38712576ddcb76f4a22 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:50 +0100 Subject: [PATCH 0357/1620] New translations PropertiesDialog.java (Spanish) --- .../earth/app/view/Messages_es.properties | 1280 +++++++++++++++-- 1 file changed, 1128 insertions(+), 152 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index e15ddb90b9..7eb0424502 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,233 +1,1209 @@ package org.openforis.collect.earth.app.view; +import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; -import java.awt.event.MouseEvent; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.GridLayout; +import java.awt.Insets; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.io.File; +import java.io.IOException; +import java.text.DecimalFormat; import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; import java.util.List; +import javax.swing.AbstractAction; +import javax.swing.AbstractButton; +import javax.swing.ButtonGroup; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; import javax.swing.JOptionPane; -import javax.swing.JTable; -import javax.swing.table.DefaultTableModel; -import javax.swing.table.TableCellRenderer; - -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult; -import org.openforis.collect.io.metadata.collectearth.CSVRowValidationResult; -import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; -import org.openforis.collect.manager.validation.SurveyValidator.ValidationParameters; +import javax.swing.JPanel; +import javax.swing.JPasswordField; +import javax.swing.JRadioButton; +import javax.swing.JScrollPane; +import javax.swing.JTabbedPane; +import javax.swing.JTextField; +import javax.swing.ListSelectionModel; +import javax.swing.ScrollPaneConstants; +import javax.swing.border.BevelBorder; +import javax.swing.border.Border; +import javax.swing.border.TitledBorder; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; + +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; +import org.openforis.collect.earth.app.EarthConstants.OperationMode; +import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.AnalysisSaikuService; +import org.openforis.collect.earth.app.service.EarthProjectsService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; import org.openforis.collect.model.CollectSurvey; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.opencsv.CSVReader; - /** - * Swing JTable used in the OptionWizard dialog. - * It contains methods to refresh the information loaded on the cells. * @author Alfonso Sanchez-Paus Diaz * */ -public class JPlotCsvTable extends JTable{ - - private static final Color WARNING_BG_COLOR = new Color(254, 255, 196); - private static final Color ERROR_BG_COLOR = new Color(218, 152, 152); - private static final long serialVersionUID = 3456854921119125693L; - private static final int LIMIT_LOADED_CSV_LINES = 400; - private final transient Logger logger = LoggerFactory.getLogger(this.getClass()); - private transient CollectSurvey forSurvey; - private transient CSVFileValidationResult validationResults; - - - /** - * Build a new JTable that contains the data from the CSV that is set as the file that contains the plots used by Collect Earth - * @param pathToCsvWithPlots Path to the file containing the plot locations that should be loaded in the table - * @param forSurvey Survey that the csv file belongs to - */ - public JPlotCsvTable(String pathToCsvWithPlots, CollectSurvey forSurvey) { - super(); - this.forSurvey = forSurvey; +public class PropertiesDialog extends JDialog { - try { - refreshTable(pathToCsvWithPlots); - } catch (Exception e) { - logger.error("Error loading plot file"); - this.setBackground(Color.RED); - this.setToolTipText("The file chosen does not contain plot information"); + private static final ComboBoxItem COMBO_BOX_ITEM_CENTRAL_POINT = new ComboBoxItem(1, + Messages.getString("OptionWizard.54")); + + private static final ComboBoxItem COMBO_BOX_ITEM_SQUARE = new ComboBoxItem(0, + Messages.getString("OptionWizard.53")); + + private static final long serialVersionUID = -6760020609229102842L; + + private final HashMap, JComponent[]> propertyToComponent = new HashMap<>(); + private final transient Logger logger = LoggerFactory.getLogger(this.getClass()); + + JPanel postgresPanel; + JPanel sqlitePanel; + + private transient LocalPropertiesService localPropertiesService; + + String backupFolder; + + private transient AnalysisSaikuService saikuService; + + private transient EarthProjectsService projectsService; + + private boolean restartRequired; + + private String oldSelectedDistance; + + private CollectSurvey surveyLoaded; + + private JButton applyChanges; + + public PropertiesDialog(JFrame frame, LocalPropertiesService localPropertiesService, + EarthProjectsService projectsService, String backupFolder, AnalysisSaikuService saikuService, + CollectSurvey surveyLoaded) { + super(frame, Messages.getString("OptionWizard.0")); //$NON-NLS-1$ + this.localPropertiesService = localPropertiesService; + this.projectsService = projectsService; + this.backupFolder = backupFolder; + this.saikuService = saikuService; + this.surveyLoaded = surveyLoaded; + this.setLocationRelativeTo(null); + this.setSize(new Dimension(600, 620)); + this.setModal(true); + this.setResizable(false); + initilizeInputs(); + buildMainPane(); + centreWindow(); + + } + + private void centreWindow() { + Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize(); + int x = (int) ((dimension.getWidth() - getWidth()) / 2); + int y = (int) ((dimension.getHeight() - getHeight()) / 2); + setLocation(x, y); + } + + private void buildMainPane() { + + final JPanel panel = new JPanel(new BorderLayout()); + panel.add(getOptionTabs(), BorderLayout.CENTER); + final JPanel buttonPanel = new JPanel(); + buttonPanel.add(getApplyChangesButton()); + buttonPanel.add(getCancelButton()); + panel.add(buttonPanel, BorderLayout.PAGE_END); + this.add(panel); + + } + + private void enableContainer(Container container, boolean enable) { + final Component[] components = container.getComponents(); + for (final Component component : components) { + component.setEnabled(enable); + if (component instanceof Container) { + enableContainer((Container) component, enable); + } + } + } + + private JComponent getBrowsersOptionsPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + final JPanel browserChooserPanel = new JPanel(); + final Border browserBorder = new TitledBorder(new BevelBorder(BevelBorder.LOWERED), + Messages.getString("OptionWizard.1")); //$NON-NLS-1$ + browserChooserPanel.setBorder(browserBorder); + GridLayout experimentLayout = new GridLayout(0,1); + browserChooserPanel.setLayout( experimentLayout ); + + final ButtonGroup browserChooser = new ButtonGroup(); + final JComponent[] browsers = propertyToComponent.get(EarthProperty.BROWSER_TO_USE); + + for (final JComponent browserRadioButton : browsers) { + browserChooserPanel.add(browserRadioButton); + browserChooser.add((AbstractButton) browserRadioButton); + ((JRadioButton) browserRadioButton).addActionListener(e -> setRestartRequired(true)); } + constraints.gridy++; + panel.add(browserChooserPanel, constraints); + + constraints.gridy++; + constraints.gridx = 0; + panel.add(propertyToComponent.get(EarthProperty.SAIKU_SERVER_FOLDER)[0], constraints); + + return panel; } - /** - * The data of the CSV file is validated when the CSV/CED is loaded. This method determines if the data currently loaded is valid or not - * @return True if the data is valid. False otherwise - */ - public boolean isDataValid(){ - return validationResults==null?true:validationResults.isSuccessful(); + private JComponent getIntegrationsPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + panel.add(propertyToComponent.get(EarthProperty.OPEN_GEE_APP)[0], constraints); + + constraints.gridy++; + panel.add(propertyToComponent.get(EarthProperty.OPEN_BING_MAPS)[0], constraints); + + constraints.gridy++; + panel.add(propertyToComponent.get(EarthProperty.OPEN_EARTH_MAP)[0], constraints); + + + constraints.gridy++; + constraints.gridwidth = 1; + panel.add(propertyToComponent.get(EarthProperty.OPEN_PLANET_MAPS)[0], constraints); + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.PLANET_MAPS_MONHLY)[0], constraints); + + constraints.gridy++; + constraints.gridx = 0; + constraints.gridwidth = 1; + final JLabel label = new JLabel(Messages.getString("OptionWizard.101")); //$NON-NLS-1$ + panel.add(label, constraints); + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.PLANET_MAPS_KEY)[0], constraints); + + constraints.gridx = 0; + constraints.gridy++; + constraints.gridwidth = 2; + panel.add(propertyToComponent.get(EarthProperty.OPEN_MAXAR_SECUREWATCH)[0], constraints); + + constraints.gridy++; + constraints.gridwidth = 1; + final JLabel labelMaxar = new JLabel(Messages.getString("OptionWizard.1021")); //$NON-NLS-1$ + panel.add(labelMaxar, constraints); + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.MAXAR_SECUREWATCH_URL)[0], constraints); + + constraints.gridx = 0; + constraints.gridy++; + constraints.gridwidth = 2; + panel.add(propertyToComponent.get(EarthProperty.OPEN_YANDEX_MAPS)[0], constraints); + + constraints.gridy++; + panel.add(propertyToComponent.get(EarthProperty.OPEN_BAIDU_MAPS)[0], constraints); + + constraints.gridy++; + final JLabel label2 = new JLabel(Messages.getString("OptionWizard.103")); //$NON-NLS-1$ + panel.add(label2, constraints); + constraints.gridy++; + panel.add(propertyToComponent.get(EarthProperty.EXTRA_MAP_URL)[0], constraints); + + constraints.gridy++; + constraints.gridx = 0; + constraints.gridwidth = 2; + panel.add(propertyToComponent.get(EarthProperty.OPEN_GEE_CODE_EDITOR)[0], constraints); + + + return panel; } - @Override - public Component prepareRenderer(TableCellRenderer renderer, int row, int col) { - Component comp = super.prepareRenderer(renderer, row, col); + private Component getApplyChangesButton() { + if (applyChanges == null) { + applyChanges = new JButton(Messages.getString("OptionWizard.15")); + applyChanges.addActionListener( + new ApplyOptionChangesListener(this, localPropertiesService, propertyToComponent) { + @Override + protected void applyProperties() { + new Thread("Applying properties dialog") { + @Override + public void run() { + savePropertyValues(); + if (isRestartRequired()) { - if ( cellHasError(row,col)){ - comp.setBackground( ERROR_BG_COLOR ); - }else{ - comp.setBackground(Color.WHITE); + restartEarth(); + } else { + EarthApp.executeKmlLoadAsynchronously(PropertiesDialog.this); + } + } + }.start(); + } + }); } + return applyChanges; + } + + public void closeDialog() { + this.dispose(); + } + + private Component getCancelButton() { + final JButton cancelButton = new JButton(Messages.getString("OptionWizard.24")); //$NON-NLS-1$ + cancelButton.addActionListener( e -> PropertiesDialog.this.dispose() ); + return cancelButton; + } + + private JComponent getOperationModePanel() { + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + final JPanel typeOfUsePanel = new JPanel(new GridBagLayout()); + final Border border = new TitledBorder(new BevelBorder(BevelBorder.LOWERED), + Messages.getString("OptionWizard.2")); //$NON-NLS-1$ + typeOfUsePanel.setBorder(border); + + JPanel serverPanel = getServerPanel(); + typeOfUsePanel.add(serverPanel, constraints); - return comp; + return typeOfUsePanel; } - @Override - public String getToolTipText(MouseEvent event) { - String tip = null; - java.awt.Point p = event.getPoint(); - int row = rowAtPoint(p); - int col = columnAtPoint(p); + private void enableDBOptions(boolean isPostgreDb) { + enableContainer(postgresPanel, isPostgreDb); + enableContainer(sqlitePanel, !isPostgreDb); + } + + private ActionListener getDbTypeListener() { + return e -> { + final JRadioButton theJRB = (JRadioButton) e.getSource(); + + boolean isPostgreDb = theJRB.getName().equals(CollectDBDriver.POSTGRESQL.name()); + enableDBOptions(isPostgreDb); + }; + } + + private JTabbedPane getOptionTabs() { + final JTabbedPane tabbedPane = new JTabbedPane(); + tabbedPane.setSize(550, 300); + final JComponent panel1 = getSampleDataPanel(); + tabbedPane.addTab(Messages.getString("OptionWizard.31"), panel1); //$NON-NLS-1$ + + final JComponent panel2 = getPlotOptionsPanel(); + tabbedPane.addTab(Messages.getString("OptionWizard.32"), panel2); //$NON-NLS-1$ + + final JComponent panel3 = getSurveyDefinitonPanel(); + tabbedPane.addTab(Messages.getString("OptionWizard.33"), panel3); //$NON-NLS-1$ + + final JComponent panel41 = getIntegrationsPanel(); + tabbedPane.addTab(Messages.getString("OptionWizard.34"), panel41); //$NON-NLS-1$ - try { - tip = getCellErrorMessage(row, col); - } catch (RuntimeException e1) { - //catch null pointer exception if mouse is over an empty line - } + final JComponent panel4 = getBrowsersOptionsPanel(); + tabbedPane.addTab(Messages.getString("OptionWizard.104"), panel4); //$NON-NLS-1$ - return tip; + final JComponent panel5 = getOperationModePanelScroll(); + tabbedPane.addTab(Messages.getString("OptionWizard.25"), panel5); //$NON-NLS-1$ + final JComponent panel6 = getProjectsPanelScroll(); + tabbedPane.addTab(Messages.getString("OptionWizard.40"), panel6); //$NON-NLS-1$ + + return tabbedPane; } - private boolean cellHasError(Integer row, Integer col) { - String errorMessage = getCellErrorMessage(row, col); - return errorMessage!=null; + private JComponent getProjectsPanelScroll() { + final JComponent projectsPanel = getProjectsPanel(); + return new JScrollPane(projectsPanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); } - private String getCellErrorMessage(Integer row, Integer col) { - if( validationResults != null ){ - List rowValidations = validationResults.getRowValidations(); - for (CSVRowValidationResult csvRowValidationResult : rowValidations) { - if( csvRowValidationResult.getRowNumber().equals(row+1) && csvRowValidationResult.getColumnPosition().equals( col ) ){ - return csvRowValidationResult.getMessage(); + private JComponent getProjectsPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.fill = GridBagConstraints.BOTH; + + JButton importNewButton = new JButton(Messages.getString("OptionWizard.41")); //$NON-NLS-1$ + importNewButton.addActionListener(new ApplyOptionChangesListener(this, localPropertiesService) { + + @Override + protected void applyProperties() { + final File[] selectedProjectFile = JFileChooserExistsAware.getFileChooserResults( + DataFormat.PROJECT_DEFINITION_FILE, false, false, null, localPropertiesService, + (JFrame) PropertiesDialog.this.getParent()); + + if (selectedProjectFile != null && selectedProjectFile.length == 1) { + try { + projectsService.loadCompressedProjectFile(selectedProjectFile[0]); + restartEarth(); + } catch (Exception e1) { + JOptionPane.showMessageDialog(PropertiesDialog.this, e1.getMessage(), + Messages.getString("OptionWizard.51"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + logger.error("Error importing project file " + selectedProjectFile[0].getAbsolutePath(), e1); //$NON-NLS-1$ + } + } } - } - return null; + }); + + panel.add(importNewButton, constraints); + + final JPanel typeOfDbPanel = new JPanel(new GridBagLayout()); + final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), + Messages.getString("OptionWizard.57")); //$NON-NLS-1$ + typeOfDbPanel.setBorder(border); + + constraints.gridx = 0; + constraints.gridy = 1; + panel.add(typeOfDbPanel, constraints); + + List listOfProjectsByName = new ArrayList<>(); + listOfProjectsByName.addAll(projectsService.getProjectList().keySet()); + Collections.sort(listOfProjectsByName); + final JList listOfProjects = new JList<>(listOfProjectsByName.toArray(new String[0])); // data has type Object[] + listOfProjects.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + listOfProjects.setLayoutOrientation(JList.VERTICAL); + listOfProjects.setVisibleRowCount(-1); + + JScrollPane listScroller = new JScrollPane(listOfProjects); + listScroller.setPreferredSize(new Dimension(250, 300)); + + constraints.gridy = 0; + constraints.gridx = GridBagConstraints.RELATIVE; + typeOfDbPanel.add(listScroller, constraints); + + final JButton openProject = new JButton(Messages.getString("OptionWizard.56")); //$NON-NLS-1$ + openProject.setEnabled(false); + openProject.addActionListener(new ApplyOptionChangesListener(this, localPropertiesService) { + + @Override + protected void applyProperties() { + + File projectFolder = projectsService.getProjectList().get(listOfProjects.getSelectedValue()); + + try { + projectsService.loadProjectInFolder(projectFolder); + restartEarth(); + } catch (Exception e1) { + JOptionPane.showMessageDialog(PropertiesDialog.this, e1.getMessage(), + Messages.getString("OptionWizard.55"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + logger.error("Error importing project folder " + projectFolder.getAbsolutePath(), e1); //$NON-NLS-1$ + } + + } + + }); + + listOfProjects.addListSelectionListener(e -> openProject.setEnabled(listOfProjects.getSelectedValue() != null) ); + + typeOfDbPanel.add(openProject); + + return panel; + } + + private JScrollPane getOperationModePanelScroll() { + final JComponent operationModePanel = getOperationModePanel(); + return new JScrollPane(operationModePanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); } - /** - * Refreshes the data loaded in the table. Used when the user changes the file that contains the CSV file using the OptionWizard dialog. - * @param csvFilePath The path to the CSV file that contains the plot locations - */ - public void refreshTable(String csvFilePath) { + private JComponent getPlotOptionsPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.fill = GridBagConstraints.HORIZONTAL; - if( csvFilePath.trim().length() == 0 ) - return; + JLabel label = new JLabel("Plot shape"); + panel.add(label, constraints); - this.removeAll(); - boolean errorLoading = false; - final File csvFile = new File(csvFilePath); + constraints.gridx = 1; + JComboBox plotShape = (JComboBox) propertyToComponent.get(EarthProperty.SAMPLE_SHAPE)[0]; + panel.add(plotShape, constraints); - if (csvFile.exists()) { - DefaultTableModel newTableModel = getPlotTableModel( csvFilePath ); + constraints.gridx = 0; + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.35")); //$NON-NLS-1$ + panel.add(label, constraints); - validateCsvFile(csvFilePath); + constraints.gridx = 1; + JComboBox numberPoints = (JComboBox) propertyToComponent + .get(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT)[0]; + panel.add(numberPoints, constraints); - if (newTableModel.getRowCount() == 0) { - errorLoading = true; - } else { - this.setModel(newTableModel); + constraints.gridx = 0; + constraints.gridy++; + JLabel distanceOrRadiuslabel = new JLabel(Messages.getString("OptionWizard.36")); //$NON-NLS-1$ + panel.add(distanceOrRadiuslabel, constraints); + + constraints.gridx = 1; + JComboBox distanceBetweenPoints = (JComboBox) propertyToComponent + .get(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS)[0]; + panel.add(new JScrollPane(distanceBetweenPoints), constraints); + + constraints.gridx = 0; + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.37")); //$NON-NLS-1$ + panel.add(label, constraints); + constraints.gridx = 1; + JComboBox distanceToFrame = (JComboBox) propertyToComponent + .get(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES)[0]; + panel.add(new JScrollPane(distanceToFrame), constraints); + + constraints.gridx = 0; + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.95")); //$NON-NLS-1$ + panel.add(label, constraints); + constraints.gridx = 1; + JComboBox dotsSide = (JComboBox) propertyToComponent.get(EarthProperty.INNER_SUBPLOT_SIDE)[0]; + panel.add(new JScrollPane(dotsSide), constraints); + + constraints.gridx = 0; + constraints.gridy++; + label = new JLabel("Central plot side"); //$NON-NLS-1$ + panel.add(label, constraints); + constraints.gridx = 1; + JComboBox largeCentralPlotSide = (JComboBox) propertyToComponent.get(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)[0]; + panel.add(new JScrollPane(largeCentralPlotSide), constraints); + + + + constraints.gridx = 0; + constraints.gridy++; + label = new JLabel("Distance between plots in cluster"); + panel.add(label, constraints); + constraints.gridx = 1; + JComboBox plotDistanceInCluster = (JComboBox) propertyToComponent + .get(EarthProperty.DISTANCE_BETWEEN_PLOTS)[0]; + panel.add(new JScrollPane(plotDistanceInCluster), constraints); + + constraints.gridx = 0; + constraints.gridy++; + JLabel area = new JLabel( + "Area (hectares) : " + calculateArea(numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide)); + panel.add(area, constraints); + + ActionListener calculateAreas = actionPerformed -> area.setText("Area (hectares) : " + calculateArea(numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide)); + + plotShape.addActionListener( e-> + handleVisibilityPlotLayout(plotShape, numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide, + plotDistanceInCluster, area, distanceOrRadiuslabel, largeCentralPlotSide) + ); + + numberPoints.addActionListener(calculateAreas); + distanceBetweenPoints.addActionListener(calculateAreas); + distanceToFrame.addActionListener(calculateAreas); + + handleVisibilityPlotLayout(plotShape, numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide, + plotDistanceInCluster, area, distanceOrRadiuslabel, largeCentralPlotSide); + + return panel; + } + + public void handleVisibilityPlotLayout(JComboBox plotShape, JComboBox numberPoints, JComboBox distanceBetweenPoints, + JComboBox distanceToFrame, JComboBox dotsSide, JComboBox distanceBetweenPlots, JLabel area, + JLabel distanceOrRadiuslabel, JComboBox largeCentralPlotSide ) { + numberPoints.setEnabled(false); + distanceBetweenPoints.setEnabled(false); + distanceToFrame.setEnabled(false); + dotsSide.setEnabled(false); + area.setVisible(false); + distanceBetweenPlots.setVisible(false); + distanceBetweenPlots.setEnabled(false); + largeCentralPlotSide.setVisible( false ); + largeCentralPlotSide.setEnabled(false); + + if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE) || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE_WITH_LARGE_CENTRAL_PLOT) ) { + numberPoints.setEnabled(true); + distanceBetweenPoints.setEnabled(true); + distanceToFrame.setEnabled(true); + dotsSide.setEnabled(true); + area.setVisible(true); + distanceOrRadiuslabel.setText(Messages.getString("OptionWizard.36")); + + if( plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE_WITH_LARGE_CENTRAL_PLOT) ) { + largeCentralPlotSide.setVisible( true ); + largeCentralPlotSide.setEnabled(true); } - } else { - errorLoading = true; + + } else if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.CIRCLE) + || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.HEXAGON)) { + distanceBetweenPoints.setEnabled(true); + dotsSide.setEnabled(true); + numberPoints.setEnabled(true); + distanceOrRadiuslabel.setText("Radius"); + } else if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.NFI_THREE_CIRCLES) || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.NFI_FOUR_CIRCLES)) { + dotsSide.setEnabled(true); + distanceBetweenPoints.setEnabled(true); + distanceBetweenPlots.setVisible(true); + distanceBetweenPlots.setEnabled(true); + distanceOrRadiuslabel.setText("Radius of the plots"); } + } + + private String calculateArea(JComboBox numberOfPoints, JComboBox distanceBetweenPoints, JComboBox distanceToFrame, JComboBox dotsSide) { + double side = 0; + try { + int numberOfPointsI = ((ComboBoxItem) numberOfPoints.getSelectedItem()).getNumberOfPoints(); + int distanceBetweenPointsI = Integer.parseInt((String) distanceBetweenPoints.getSelectedItem()); + int distanceToFrameI = Integer.parseInt((String) distanceToFrame.getSelectedItem()); + + if (numberOfPointsI == 0 || numberOfPointsI == 1) { - if (errorLoading) { - this.setBackground(CollectEarthWindow.ERROR_COLOR); - this.setModel(new DefaultTableModel()); + side = 2d * distanceToFrameI; + if (oldSelectedDistance == null) { + oldSelectedDistance = (String) distanceBetweenPoints.getSelectedItem(); + distanceBetweenPoints.setEnabled(false); + } + distanceBetweenPoints.setSelectedItem("0"); + + if (numberOfPointsI == 0) { + dotsSide.setEnabled(false); + } else if (numberOfPointsI == 1) { + dotsSide.setEnabled(true); + } + + } else { + if (oldSelectedDistance != null) { + distanceBetweenPoints.setSelectedItem(oldSelectedDistance); + oldSelectedDistance = null; + } + + distanceBetweenPoints.setEnabled(true); + distanceToFrame.setEnabled(true); + dotsSide.setEnabled(true); + + double pointsByLines = Math.sqrt(numberOfPointsI); + side = 2d * distanceToFrameI + (pointsByLines - 1) * distanceBetweenPointsI; + + } + + } catch (RuntimeException e) { + logger.error("Error calculating area of the plot", e); } + + DecimalFormat df = new DecimalFormat("###.##"); + return df.format(side * side / 10000d); } - private String[] getColumnNames() { - // Check if the first line is actually a header. Possible if the first header column coincides with ID, PLOT_ID or PLOT - CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); - return cegtg.getExpectedHeaders( forSurvey ).toArray( new String[]{} ); + private JPanel getPostgreSqlPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), + Messages.getString("OptionWizard.6")); //$NON-NLS-1$ + panel.setBorder(border); + + JLabel label = new JLabel(Messages.getString("OptionWizard.7")); //$NON-NLS-1$ + constraints.gridx = 0; + panel.add(label, constraints); + + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.DB_USERNAME)[0], constraints); + + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.8")); //$NON-NLS-1$ + constraints.gridx = 0; + panel.add(label, constraints); + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.DB_PASSWORD)[0], constraints); + + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.9")); //$NON-NLS-1$ + constraints.gridx = 0; + panel.add(label, constraints); + + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.DB_NAME)[0], constraints); + + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.26")); //$NON-NLS-1$ + constraints.gridx = 0; + panel.add(label, constraints); + + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.DB_HOST)[0], constraints); + + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.29")); //$NON-NLS-1$ + constraints.gridx = 0; + panel.add(label, constraints); + + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.DB_PORT)[0], constraints); + + constraints.gridx = 2; + panel.add(new JLabel("Default: 5432"), constraints); + + constraints.gridy++; + constraints.gridx = 1; + JButton button = new JButton("Test Connection"); //$NON-NLS-1$ + button.addActionListener( e-> { + String host = ((JTextField) (propertyToComponent.get(EarthProperty.DB_HOST)[0])).getText(); + String port = ((JTextField) (propertyToComponent.get(EarthProperty.DB_PORT)[0])).getText(); + String dbName = ((JTextField) (propertyToComponent.get(EarthProperty.DB_NAME)[0])).getText(); + String username = ((JTextField) (propertyToComponent.get(EarthProperty.DB_USERNAME)[0])).getText(); + String password = ((JTextField) (propertyToComponent.get(EarthProperty.DB_PASSWORD)[0])).getText(); + + String message = CollectEarthUtils.testPostgreSQLConnection(host, port, dbName, username, password); + JOptionPane.showMessageDialog(PropertiesDialog.this.getOwner(), message, "PostgreSQL Connection test", + JOptionPane.INFORMATION_MESSAGE); + }); + panel.add(button, constraints); + + return panel; + } + + private JPanel getSqlLitePanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), + Messages.getString("OptionWizard.30")); //$NON-NLS-1$ + panel.setBorder(border); + + panel.add(propertyToComponent.get(EarthProperty.AUTOMATIC_BACKUP)[0], constraints); + constraints.gridx++; + panel.add(getOpenBackupFolderButton()); + return panel; + } + + private JComponent getSampleDataPanel() { + final JPlotCsvTable samplePlots = new JPlotCsvTable(localPropertiesService.getValue(EarthProperty.SAMPLE_FILE), + surveyLoaded); + + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.fill = GridBagConstraints.BOTH; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + + final JFilePicker refreshTableOnFileChange = getFilePickerSamplePlots(samplePlots); + + panel.add(refreshTableOnFileChange, constraints); + + samplePlots.setFillsViewportHeight(true); + constraints.gridy = 1; + + constraints.weightx = 1.0; + constraints.weighty = 1.0; + constraints.gridwidth = GridBagConstraints.REMAINDER; + constraints.gridheight = GridBagConstraints.REMAINDER; + + samplePlots.setPreferredScrollableViewportSize(samplePlots.getPreferredSize()); + + panel.add(new JScrollPane(samplePlots, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, + ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), constraints); + + return panel; } - private DefaultTableModel getPlotTableModel(String csvFilePath) { + private JFilePicker getFilePickerSamplePlots(final JPlotCsvTable samplePlots) { + final JFilePicker refreshTableOnFileChange = (JFilePicker) (propertyToComponent + .get(EarthProperty.SAMPLE_FILE)[0]); + refreshTableOnFileChange.addChangeListener(new DocumentListener() { - String[][] allValues = new String[0][0]; + @Override + public void changedUpdate(DocumentEvent e) { + // Do not react + } + + @Override + public void insertUpdate(DocumentEvent e) { + refreshTable(); + } + + @Override + public void removeUpdate(DocumentEvent e) { + // Do not react + } + + private void refreshTable() { + samplePlots.refreshTable(refreshTableOnFileChange.getSelectedFilePath()); - try ( CSVReader reader = CsvReaderUtils.getCsvReader(csvFilePath) ){ - String[] line; - List allLines = new ArrayList<>(); - int i =0; - while( ( line = reader.readNext() ) != null && i< LIMIT_LOADED_CSV_LINES ) { // we do this to avoid out of memory errors - i++; - allLines.add( line ); + // Do not let the user save the changes if the sample data is wrong!!! + getApplyChangesButton().setEnabled(samplePlots.isDataValid()); } + }); + return refreshTableOnFileChange; + } + + private JPanel getServerPanel() { - allValues = allLines.toArray(new String[][] {}); - } catch (Exception e) { - logger.error(" Error reading the CSV file " + csvFilePath, e); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + final JPanel typeOfDbPanel = new JPanel(new GridBagLayout()); + final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), + Messages.getString("OptionWizard.3")); //$NON-NLS-1$ + typeOfDbPanel.setBorder(border); + + JLabel label = new JLabel(Messages.getString("OptionWizard.4") + CollectEarthUtils.getComputerIp()); //$NON-NLS-1$ + typeOfDbPanel.add(label, constraints); + constraints.gridy++; + + label = new JLabel(Messages.getString("OptionWizard.5")); //$NON-NLS-1$ + constraints.gridx = 0; + typeOfDbPanel.add(label, constraints); + + constraints.gridx = 1; + typeOfDbPanel.add(propertyToComponent.get(EarthProperty.HOST_PORT_KEY)[0], constraints); + + constraints.gridwidth = GridBagConstraints.REMAINDER; + constraints.gridy++; + constraints.gridx = 0; + + final ButtonGroup bg = new ButtonGroup(); + final JComponent[] dbTypes = propertyToComponent.get(EarthProperty.DB_DRIVER); + + postgresPanel = getPostgreSqlPanel(); + sqlitePanel = getSqlLitePanel(); + + boolean usingPostgreSQL = localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.POSTGRESQL); + enableDBOptions(usingPostgreSQL); + + for (final JComponent typeRadioButton : dbTypes) { + final JRadioButton dbTypeButton = (JRadioButton) typeRadioButton; + bg.add(dbTypeButton); + typeOfDbPanel.add(dbTypeButton, constraints); + constraints.gridy++; + + dbTypeButton.addActionListener(getDbTypeListener()); + dbTypeButton.addActionListener(e -> setRestartRequired(true)); + + if (dbTypeButton.getName().equals(EarthConstants.CollectDBDriver.POSTGRESQL.name())) { + typeOfDbPanel.add(postgresPanel, constraints); + constraints.gridy++; + + } else { + typeOfDbPanel.add(sqlitePanel, constraints); + constraints.gridy++; + } } + return typeOfDbPanel; + } + + private Component getOpenBackupFolderButton() { + + AbstractAction backupAction = new AbstractAction(Messages.getString("OptionWizard.10")) { //$NON-NLS-1$ + + private static final long serialVersionUID = 1L; + + @Override + public void actionPerformed(ActionEvent e) { + try { + + CollectEarthUtils.openFolderInExplorer(backupFolder); + + } catch (final IOException e1) { + logger.error("Error when opening the explorer window to visualize backups", e1); //$NON-NLS-1$ + } + } + + }; + + return new JButton(backupAction); - return new DefaultTableModel( allValues , getColumnNames()); } - protected void validateCsvFile(String csvFilePath) { + private JComponent getSurveyDefinitonPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.fill = GridBagConstraints.HORIZONTAL; + constraints.gridwidth = 2; + panel.add(propertyToComponent.get(EarthProperty.OPEN_BALLOON_IN_BROWSER)[0], constraints); + + constraints.gridy++; + constraints.gridwidth = 1; + final JLabel label = new JLabel(Messages.getString("OptionWizard.43")); //$NON-NLS-1$ + panel.add(label, constraints); + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.SURVEY_NAME)[0], constraints); + + constraints.gridy++; + constraints.gridwidth = GridBagConstraints.REMAINDER; + constraints.gridx = 0; + panel.add(propertyToComponent.get(EarthProperty.KML_TEMPLATE_KEY)[0], constraints); + + constraints.gridy++; + constraints.gridx = 0; + panel.add(propertyToComponent.get(EarthProperty.BALLOON_TEMPLATE_KEY)[0], constraints); + + constraints.gridy++; + constraints.gridx = 0; + + panel.add(propertyToComponent.get(EarthProperty.METADATA_FILE)[0], constraints); + + return panel; + } - CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); - ValidationParameters validationParameters = new ValidationParameters(); - validationParameters.setValidateOnlyFirstLines( false ); - CSVFileValidationResult validation = cegtg.validate( new File(csvFilePath), forSurvey, validationParameters); + private void initilizeInputs() { - this.setBackground( Color.white ); + final JCheckBox backupCheckbox = new JCheckBox(Messages.getString("OptionWizard.44")); //$NON-NLS-1$ + backupCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.AUTOMATIC_BACKUP))); + propertyToComponent.put(EarthProperty.AUTOMATIC_BACKUP, new JComponent[] { backupCheckbox }); + final JCheckBox openEarthEngineCheckbox = new JCheckBox(Messages.getString("OptionWizard.45")); //$NON-NLS-1$ + openEarthEngineCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_EXPLORER))); + propertyToComponent.put(EarthProperty.OPEN_GEE_EXPLORER, new JComponent[] { openEarthEngineCheckbox }); - if( !validation.isSuccessful() ){ - switch ( validation.getErrorType() ) { - case INVALID_FILE_TYPE: - case INVALID_NUMBER_OF_COLUMNS: - JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); - JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The expected file type is CSV or CED ", "Expected File Type", JOptionPane.ERROR_MESSAGE); - break; + final JCheckBox openGEEAppCheckbox = new JCheckBox("Google Earth Engine APP (no sign-in)"); //$NON-NLS-1$ + openGEEAppCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_APP))); + propertyToComponent.put(EarthProperty.OPEN_GEE_APP, new JComponent[] { openGEEAppCheckbox }); - case INVALID_HEADERS: - JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); - JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The expected columns in the CSV are " + validation.getExpectedHeaders(), "Columns in CSV do not match survey", JOptionPane.ERROR_MESSAGE); - validation = null; // not bad enough to stop the user from loading the CSV file - break; - case INVALID_NUMBER_OF_PLOTS_TOO_LARGE: - JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); - JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "Using CSV files that are too large makes Google Earth extremely slow.\nPlease divide this CSV file into smaller file (reccomended less than 2000 plots per CSV file.\nNumber of plots in this file : " + validation.getNumberOfRows() , "File too large", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - validation = null; // not bad enough to stop the user from loading the CSV file - break; + final JCheckBox openTimelapseCheckbox = new JCheckBox(Messages.getString("OptionWizard.46")); //$NON-NLS-1$ + openTimelapseCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_TIMELAPSE))); + propertyToComponent.put(EarthProperty.OPEN_TIMELAPSE, new JComponent[] { openTimelapseCheckbox }); - case INVALID_NUMBER_OF_PLOTS_WARNING: - JPlotCsvTable.this.setBackground( WARNING_BG_COLOR); - JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "Using CSV files that are too large makes Google Earth slow.\n Please divide this CSV file into smaller file (reccomended size is less than 2000 plots per CSV file.\nNumber of plots in this file : " + validation.getNumberOfRows() , "File too large", JOptionPane.WARNING_MESSAGE); //$NON-NLS-1$ - validation = null; // not bad enough to stop the user from loading the CSV file - break; + final JCheckBox openEarthMapCheckbox = new JCheckBox(Messages.getString("OptionWizard.105")); //$NON-NLS-1$ + openEarthMapCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_EARTH_MAP))); + propertyToComponent.put(EarthProperty.OPEN_EARTH_MAP, new JComponent[] { openEarthMapCheckbox }); - case INVALID_VALUES_IN_CSV: - // IN THIS CASE THE CELL RENDERER TAKES CARE OF HIGHLIGHTING THE CELLS!!! - JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The content of the CSV file is not correct!! The values on the cells highlighted are incorrect " , "CSV content is not correct", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - break; + final JCheckBox openBingCheckbox = new JCheckBox(Messages.getString("OptionWizard.47")); //$NON-NLS-1$ + openBingCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BING_MAPS))); + propertyToComponent.put(EarthProperty.OPEN_BING_MAPS, new JComponent[] { openBingCheckbox }); - default: - break; + final JCheckBox openPlanetCheckbox = new JCheckBox(Messages.getString("OptionWizard.100")); //$NON-NLS-1$ + openPlanetCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_PLANET_MAPS))); + propertyToComponent.put(EarthProperty.OPEN_PLANET_MAPS, new JComponent[] { openPlanetCheckbox }); + + final JCheckBox openMonthlyNICFICheckbox = new JCheckBox(Messages.getString("OptionWizard.110")); //$NON-NLS-1$ + openMonthlyNICFICheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.PLANET_MAPS_MONHLY))); + propertyToComponent.put(EarthProperty.PLANET_MAPS_MONHLY, new JComponent[] { openMonthlyNICFICheckbox }); + + + final JPasswordField planetAPIKeyTextField = new JPasswordField( + localPropertiesService.getValue(EarthProperty.PLANET_MAPS_KEY)); + planetAPIKeyTextField.setMinimumSize(new Dimension( 250, 20 )); + planetAPIKeyTextField.setEnabled( localPropertiesService.isPlanetMapsSupported() ); + propertyToComponent.put(EarthProperty.PLANET_MAPS_KEY, new JComponent[] { planetAPIKeyTextField }); + + openMonthlyNICFICheckbox.setEnabled( openPlanetCheckbox.isSelected() ); + planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ); + + openPlanetCheckbox.addActionListener( e-> { + planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ); + openMonthlyNICFICheckbox.setEnabled( openPlanetCheckbox.isSelected() ); + }); + openMonthlyNICFICheckbox.addActionListener( e-> planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ) ); + + + final JCheckBox openSecureWatchCheckbox = new JCheckBox(Messages.getString("OptionWizard.102")); //$NON-NLS-1$ + openSecureWatchCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_MAXAR_SECUREWATCH))); + propertyToComponent.put(EarthProperty.OPEN_MAXAR_SECUREWATCH, new JComponent[] { openSecureWatchCheckbox }); + + final JTextField secureWatchUrlTextField = new JTextField( + localPropertiesService.getValue(EarthProperty.MAXAR_SECUREWATCH_URL)); + secureWatchUrlTextField.setMinimumSize(new Dimension( 250, 20 )); + propertyToComponent.put(EarthProperty.MAXAR_SECUREWATCH_URL, new JComponent[] { secureWatchUrlTextField }); + secureWatchUrlTextField.setEnabled( localPropertiesService.isSecureWatchSupported() ); + propertyToComponent.put(EarthProperty.MAXAR_SECUREWATCH_URL, new JComponent[] { secureWatchUrlTextField }); + openSecureWatchCheckbox.addActionListener( e -> secureWatchUrlTextField.setEnabled( openSecureWatchCheckbox.isSelected() ) ); + + final JTextField extraUrlTextField = new JTextField( + localPropertiesService.getValue(EarthProperty.EXTRA_MAP_URL)); + extraUrlTextField.setMinimumSize(new Dimension( 250, 20 )); + propertyToComponent.put(EarthProperty.EXTRA_MAP_URL, new JComponent[] { extraUrlTextField }); + + final JCheckBox openBaiduCheckbox = new JCheckBox("Open Baidu Maps"); + openBaiduCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BAIDU_MAPS))); + propertyToComponent.put(EarthProperty.OPEN_BAIDU_MAPS, new JComponent[] { openBaiduCheckbox }); + + final JCheckBox openYandexCheckbox = new JCheckBox("Open Yandex maps for the plot area"); + openYandexCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_YANDEX_MAPS))); + propertyToComponent.put(EarthProperty.OPEN_YANDEX_MAPS, new JComponent[] { openYandexCheckbox }); + + final JCheckBox openHereCheckbox = new JCheckBox(Messages.getString("OptionWizard.59")); //$NON-NLS-1$ + openHereCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_HERE_MAPS))); + propertyToComponent.put(EarthProperty.OPEN_HERE_MAPS, new JComponent[] { openHereCheckbox }); + + final JCheckBox openGeePlaygroundCheckbox = new JCheckBox(Messages.getString("OptionWizard.58")); //$NON-NLS-1$ + openGeePlaygroundCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_CODE_EDITOR))); + propertyToComponent.put(EarthProperty.OPEN_GEE_CODE_EDITOR, new JComponent[] { openGeePlaygroundCheckbox }); + + final JCheckBox openInSeparateWindowCheckbox = new JCheckBox(Messages.getString("OptionWizard.48")); //$NON-NLS-1$ + openInSeparateWindowCheckbox.setSelected( + Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BALLOON_IN_BROWSER))); + propertyToComponent.put(EarthProperty.OPEN_BALLOON_IN_BROWSER, + new JComponent[] { openInSeparateWindowCheckbox }); + + final JFilePicker csvWithPlotData = new JFilePicker(Messages.getString("OptionWizard.49"), //$NON-NLS-1$ + localPropertiesService.getValue(EarthProperty.SAMPLE_FILE), Messages.getString("OptionWizard.50"), DlgMode.MODE_OPEN); // $NON-NLS-1$ + + csvWithPlotData.addFileTypeFilter(".csv,.ced", Messages.getString("OptionWizard.52"), true); //$NON-NLS-1$ //$NON-NLS-2$ + propertyToComponent.put(EarthProperty.SAMPLE_FILE, new JComponent[] { csvWithPlotData }); + + final JComboBox plotShape = new JComboBox<>(SAMPLE_SHAPE.values()); + try { + plotShape.setSelectedItem(SAMPLE_SHAPE.valueOf(localPropertiesService.getValue(EarthProperty.SAMPLE_SHAPE))); + } catch (Exception e1) { + logger.error("The selected shape type is not supported " + localPropertiesService.getValue(EarthProperty.SAMPLE_SHAPE), e1 ); + } + propertyToComponent.put(EarthProperty.SAMPLE_SHAPE, new JComponent[] { plotShape }); + + final JComboBox comboNumberOfPoints = new JComboBox<>( + new ComboBoxItem[] { COMBO_BOX_ITEM_SQUARE, COMBO_BOX_ITEM_CENTRAL_POINT, new ComboBoxItem(4, "2x2"), //$NON-NLS-1$ //$NON-NLS-2$ + // //$NON-NLS-3$ + new ComboBoxItem(9, "3x3"), new ComboBoxItem(16, "4x4"), new ComboBoxItem(25, "5x5"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + new ComboBoxItem(36, "6x6"), //$NON-NLS-1$ + new ComboBoxItem(49, "7x7") }); //$NON-NLS-1$ + if( StringUtils.isNotBlank( localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT) ) ){ + try { + comboNumberOfPoints.setSelectedItem(new ComboBoxItem( + Integer.parseInt(localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT)), + "")); //$NON-NLS-1$ + } catch (NumberFormatException e1) { + logger.error("This should be a number {}", localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT), e1); } } + propertyToComponent.put(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT, + new JComponent[] { comboNumberOfPoints }); + + final String[] listOfNumbers = new String[1500]; + final String[] listOfNumbersFromTwo = new String[1500]; + + for (int index = 0; index < listOfNumbers.length; index++) { + listOfNumbers[index] = Integer.toString( index ); //$NON-NLS-1$ + listOfNumbersFromTwo[index] = Integer.toString( index + 2 ); //$NON-NLS-1$ + } + + final JComboBox listOfDistanceBetweenPoints = new JComboBox<>(listOfNumbersFromTwo); + listOfDistanceBetweenPoints + .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS)); + listOfDistanceBetweenPoints.setAutoscrolls(true); + + propertyToComponent.put(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS, + new JComponent[] { listOfDistanceBetweenPoints }); + + final JComboBox listOfDistanceBetweenPlots = new JComboBox<>(listOfNumbersFromTwo); + listOfDistanceBetweenPlots + .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS)); + listOfDistanceBetweenPlots.setAutoscrolls(true); + + propertyToComponent.put(EarthProperty.DISTANCE_BETWEEN_PLOTS, new JComponent[] { listOfDistanceBetweenPlots }); + + final JComboBox listOfDistanceToBorder = new JComboBox<>(listOfNumbers); + listOfDistanceToBorder + .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES)); + listOfDistanceToBorder.setAutoscrolls(true); + + propertyToComponent.put(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES, new JComponent[] { listOfDistanceToBorder }); + + final JComboBox listOfSizeofSamplingDot = new JComboBox<>(listOfNumbersFromTwo); + listOfSizeofSamplingDot.setSelectedItem(localPropertiesService.getValue(EarthProperty.INNER_SUBPLOT_SIDE)); + listOfSizeofSamplingDot.setAutoscrolls(true); + + propertyToComponent.put(EarthProperty.INNER_SUBPLOT_SIDE, new JComponent[] { listOfSizeofSamplingDot }); + + final JComboBox listOfSideOflargeCentralPlot = new JComboBox<>(listOfNumbersFromTwo); + listOfSideOflargeCentralPlot.setSelectedItem(localPropertiesService.getValue(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)); + listOfSideOflargeCentralPlot.setAutoscrolls(true); + propertyToComponent.put(EarthProperty.LARGE_CENTRAL_PLOT_SIDE, new JComponent[] { listOfSideOflargeCentralPlot }); + + + final JRadioButton chromeChooser = new JRadioButton("Chrome"); //$NON-NLS-1$ + chromeChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() + .equals(EarthConstants.CHROME_BROWSER)); + chromeChooser.setName(EarthConstants.CHROME_BROWSER); + + final JRadioButton firefoxChooser = new JRadioButton("Firefox"); //$NON-NLS-1$ + firefoxChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() + .equals(EarthConstants.FIREFOX_BROWSER)); + firefoxChooser.setName(EarthConstants.FIREFOX_BROWSER); + + final JRadioButton edgeChooser = new JRadioButton("Edge"); //$NON-NLS-1$ + edgeChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() + .equals(EarthConstants.EDGE_BROWSER)); + edgeChooser.setName(EarthConstants.EDGE_BROWSER); + + propertyToComponent.put(EarthProperty.BROWSER_TO_USE, new JComponent[] { firefoxChooser, chromeChooser, edgeChooser}); + final JFilePicker saikuPath = new JFilePicker(Messages.getString("OptionWizard.65"), //$NON-NLS-1$ + localPropertiesService.getValue(EarthProperty.SAIKU_SERVER_FOLDER), + Messages.getString("OptionWizard.66"), DlgMode.MODE_OPEN); //$NON-NLS-1$ + saikuPath.setFolderChooser(); + saikuPath.addChangeListener(new DocumentListener() { + + private void showSaikuWarning() { + final File saikuFolder = new File(saikuPath.getSelectedFilePath()); + if ( !saikuService.isSaikuFolder(saikuFolder)) { + JOptionPane.showMessageDialog(PropertiesDialog.this, Messages.getString("OptionWizard.27"), //$NON-NLS-1$ + Messages.getString("OptionWizard.28"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ + saikuPath.getTextField().setBackground(CollectEarthWindow.ERROR_COLOR); + } else { + saikuPath.getTextField().setBackground(Color.white); + } + } + + @Override + public void removeUpdate(DocumentEvent e) { + // Do not react + } + + @Override + public void insertUpdate(DocumentEvent e) { + showSaikuWarning(); + } + + @Override + public void changedUpdate(DocumentEvent e) { + // Do not react + } + }); + propertyToComponent.put(EarthProperty.SAIKU_SERVER_FOLDER, new JComponent[] { saikuPath }); + + final JFilePicker kmlTemplatePath = new JFilePicker(Messages.getString("OptionWizard.79"), //$NON-NLS-1$ + localPropertiesService.getValue(EarthProperty.KML_TEMPLATE_KEY), Messages.getString("OptionWizard.80"), //$NON-NLS-1$ + DlgMode.MODE_OPEN); + kmlTemplatePath.addFileTypeFilter(".fmt", Messages.getString("OptionWizard.82"), true); //$NON-NLS-1$ //$NON-NLS-2$ + propertyToComponent.put(EarthProperty.KML_TEMPLATE_KEY, new JComponent[] { kmlTemplatePath }); + + final JFilePicker htmlBalloonPath = new JFilePicker(Messages.getString("OptionWizard.83"), //$NON-NLS-1$ + localPropertiesService.getValue(EarthProperty.BALLOON_TEMPLATE_KEY), + Messages.getString("OptionWizard.84"), DlgMode.MODE_OPEN); //$NON-NLS-1$ + htmlBalloonPath.addFileTypeFilter(".html,.htm", Messages.getString("OptionWizard.86"), true); //$NON-NLS-1$ //$NON-NLS-2$ + propertyToComponent.put(EarthProperty.BALLOON_TEMPLATE_KEY, new JComponent[] { htmlBalloonPath }); + + final JFilePicker idmPath = new JFilePicker(Messages.getString("OptionWizard.87"), //$NON-NLS-1$ + localPropertiesService.getImdFile(), Messages.getString("OptionWizard.88"), DlgMode.MODE_OPEN); //$NON-NLS-1$ + idmPath.addFileTypeFilter(".xml", Messages.getString("OptionWizard.90"), true); //$NON-NLS-1$ //$NON-NLS-2$ + propertyToComponent.put(EarthProperty.METADATA_FILE, new JComponent[] { idmPath }); + + final JTextField surveyNameTextField = new JTextField( + localPropertiesService.getValue(EarthProperty.SURVEY_NAME)); + surveyNameTextField.setEnabled(false); + propertyToComponent.put(EarthProperty.SURVEY_NAME, new JComponent[] { surveyNameTextField }); + + // Database options + + final JRadioButton instanceTypeServer = new JRadioButton(Messages.getString("OptionWizard.91")); //$NON-NLS-1$ + instanceTypeServer.setSelected(localPropertiesService.getOperationMode().equals(OperationMode.SERVER_MODE)); + instanceTypeServer.setName(EarthConstants.OperationMode.SERVER_MODE.name()); + + final JRadioButton instanceTypeClient = new JRadioButton(Messages.getString("OptionWizard.92")); //$NON-NLS-1$ + instanceTypeClient.setSelected(localPropertiesService.getOperationMode().equals(OperationMode.CLIENT_MODE)); + instanceTypeClient.setName(EarthConstants.OperationMode.CLIENT_MODE.name()); + propertyToComponent.put(EarthProperty.OPERATION_MODE, + new JComponent[] { instanceTypeServer, instanceTypeClient }); + + final JTextField collectEarthServerIp = new JTextField(localPropertiesService.getValue(EarthProperty.HOST_KEY)); + propertyToComponent.put(EarthProperty.HOST_KEY, new JComponent[] { collectEarthServerIp }); + + final JTextField collectEarthServerIpPort = new JTextField(localPropertiesService.getPort()); + final JTextField collectEarthServerLocalPort = new JTextField( + localPropertiesService.getValue(EarthProperty.HOST_PORT_KEY)); + propertyToComponent.put(EarthProperty.HOST_PORT_KEY, + new JComponent[] { collectEarthServerIpPort, collectEarthServerLocalPort }); + + final JRadioButton sqliteDbType = new JRadioButton(Messages.getString("OptionWizard.93")); //$NON-NLS-1$ + sqliteDbType.setSelected(localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.SQLITE)); + sqliteDbType.setName(CollectDBDriver.SQLITE.name()); + + final JRadioButton postgresDbType = new JRadioButton(Messages.getString("OptionWizard.94")); //$NON-NLS-1$ + boolean usingPostgreSQL = localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.POSTGRESQL); + postgresDbType.setSelected(usingPostgreSQL); + postgresDbType.setName(CollectDBDriver.POSTGRESQL.name()); + propertyToComponent.put(EarthProperty.DB_DRIVER, new JComponent[] { sqliteDbType, postgresDbType }); + + final JTextField dbUserName = new JTextField(localPropertiesService.getValue(EarthProperty.DB_USERNAME)); + propertyToComponent.put(EarthProperty.DB_USERNAME, new JComponent[] { dbUserName }); + + final JTextField dbPassword = new JTextField(localPropertiesService.getValue(EarthProperty.DB_PASSWORD)); + propertyToComponent.put(EarthProperty.DB_PASSWORD, new JComponent[] { dbPassword }); + + final JTextField dbName = new JTextField(localPropertiesService.getValue(EarthProperty.DB_NAME)); + propertyToComponent.put(EarthProperty.DB_NAME, new JComponent[] { dbName }); + + final JTextField dbHost = new JTextField(localPropertiesService.getValue(EarthProperty.DB_HOST)); + propertyToComponent.put(EarthProperty.DB_HOST, new JComponent[] { dbHost }); + + final JTextField dbPort = new JTextField(localPropertiesService.getValue(EarthProperty.DB_PORT)); + propertyToComponent.put(EarthProperty.DB_PORT, new JComponent[] { dbPort }); - this.setValidationResults( validation ); } + public boolean isRestartRequired() { + return restartRequired; + } - private void setValidationResults(CSVFileValidationResult validationResults) { - this.validationResults = validationResults; + public void setRestartRequired(boolean restartRequired) { + this.restartRequired = restartRequired; } } From 2cffb12296eee6344f6d3e8ebbd3de2849a83cd3 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:51 +0100 Subject: [PATCH 0358/1620] New translations PropertiesDialog.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 1280 +++++++++++++++-- 1 file changed, 1128 insertions(+), 152 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index e15ddb90b9..7eb0424502 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,233 +1,1209 @@ package org.openforis.collect.earth.app.view; +import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; -import java.awt.event.MouseEvent; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.GridLayout; +import java.awt.Insets; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.io.File; +import java.io.IOException; +import java.text.DecimalFormat; import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; import java.util.List; +import javax.swing.AbstractAction; +import javax.swing.AbstractButton; +import javax.swing.ButtonGroup; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; import javax.swing.JOptionPane; -import javax.swing.JTable; -import javax.swing.table.DefaultTableModel; -import javax.swing.table.TableCellRenderer; - -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult; -import org.openforis.collect.io.metadata.collectearth.CSVRowValidationResult; -import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; -import org.openforis.collect.manager.validation.SurveyValidator.ValidationParameters; +import javax.swing.JPanel; +import javax.swing.JPasswordField; +import javax.swing.JRadioButton; +import javax.swing.JScrollPane; +import javax.swing.JTabbedPane; +import javax.swing.JTextField; +import javax.swing.ListSelectionModel; +import javax.swing.ScrollPaneConstants; +import javax.swing.border.BevelBorder; +import javax.swing.border.Border; +import javax.swing.border.TitledBorder; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; + +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; +import org.openforis.collect.earth.app.EarthConstants.OperationMode; +import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.AnalysisSaikuService; +import org.openforis.collect.earth.app.service.EarthProjectsService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; import org.openforis.collect.model.CollectSurvey; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.opencsv.CSVReader; - /** - * Swing JTable used in the OptionWizard dialog. - * It contains methods to refresh the information loaded on the cells. * @author Alfonso Sanchez-Paus Diaz * */ -public class JPlotCsvTable extends JTable{ - - private static final Color WARNING_BG_COLOR = new Color(254, 255, 196); - private static final Color ERROR_BG_COLOR = new Color(218, 152, 152); - private static final long serialVersionUID = 3456854921119125693L; - private static final int LIMIT_LOADED_CSV_LINES = 400; - private final transient Logger logger = LoggerFactory.getLogger(this.getClass()); - private transient CollectSurvey forSurvey; - private transient CSVFileValidationResult validationResults; - - - /** - * Build a new JTable that contains the data from the CSV that is set as the file that contains the plots used by Collect Earth - * @param pathToCsvWithPlots Path to the file containing the plot locations that should be loaded in the table - * @param forSurvey Survey that the csv file belongs to - */ - public JPlotCsvTable(String pathToCsvWithPlots, CollectSurvey forSurvey) { - super(); - this.forSurvey = forSurvey; +public class PropertiesDialog extends JDialog { - try { - refreshTable(pathToCsvWithPlots); - } catch (Exception e) { - logger.error("Error loading plot file"); - this.setBackground(Color.RED); - this.setToolTipText("The file chosen does not contain plot information"); + private static final ComboBoxItem COMBO_BOX_ITEM_CENTRAL_POINT = new ComboBoxItem(1, + Messages.getString("OptionWizard.54")); + + private static final ComboBoxItem COMBO_BOX_ITEM_SQUARE = new ComboBoxItem(0, + Messages.getString("OptionWizard.53")); + + private static final long serialVersionUID = -6760020609229102842L; + + private final HashMap, JComponent[]> propertyToComponent = new HashMap<>(); + private final transient Logger logger = LoggerFactory.getLogger(this.getClass()); + + JPanel postgresPanel; + JPanel sqlitePanel; + + private transient LocalPropertiesService localPropertiesService; + + String backupFolder; + + private transient AnalysisSaikuService saikuService; + + private transient EarthProjectsService projectsService; + + private boolean restartRequired; + + private String oldSelectedDistance; + + private CollectSurvey surveyLoaded; + + private JButton applyChanges; + + public PropertiesDialog(JFrame frame, LocalPropertiesService localPropertiesService, + EarthProjectsService projectsService, String backupFolder, AnalysisSaikuService saikuService, + CollectSurvey surveyLoaded) { + super(frame, Messages.getString("OptionWizard.0")); //$NON-NLS-1$ + this.localPropertiesService = localPropertiesService; + this.projectsService = projectsService; + this.backupFolder = backupFolder; + this.saikuService = saikuService; + this.surveyLoaded = surveyLoaded; + this.setLocationRelativeTo(null); + this.setSize(new Dimension(600, 620)); + this.setModal(true); + this.setResizable(false); + initilizeInputs(); + buildMainPane(); + centreWindow(); + + } + + private void centreWindow() { + Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize(); + int x = (int) ((dimension.getWidth() - getWidth()) / 2); + int y = (int) ((dimension.getHeight() - getHeight()) / 2); + setLocation(x, y); + } + + private void buildMainPane() { + + final JPanel panel = new JPanel(new BorderLayout()); + panel.add(getOptionTabs(), BorderLayout.CENTER); + final JPanel buttonPanel = new JPanel(); + buttonPanel.add(getApplyChangesButton()); + buttonPanel.add(getCancelButton()); + panel.add(buttonPanel, BorderLayout.PAGE_END); + this.add(panel); + + } + + private void enableContainer(Container container, boolean enable) { + final Component[] components = container.getComponents(); + for (final Component component : components) { + component.setEnabled(enable); + if (component instanceof Container) { + enableContainer((Container) component, enable); + } + } + } + + private JComponent getBrowsersOptionsPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + final JPanel browserChooserPanel = new JPanel(); + final Border browserBorder = new TitledBorder(new BevelBorder(BevelBorder.LOWERED), + Messages.getString("OptionWizard.1")); //$NON-NLS-1$ + browserChooserPanel.setBorder(browserBorder); + GridLayout experimentLayout = new GridLayout(0,1); + browserChooserPanel.setLayout( experimentLayout ); + + final ButtonGroup browserChooser = new ButtonGroup(); + final JComponent[] browsers = propertyToComponent.get(EarthProperty.BROWSER_TO_USE); + + for (final JComponent browserRadioButton : browsers) { + browserChooserPanel.add(browserRadioButton); + browserChooser.add((AbstractButton) browserRadioButton); + ((JRadioButton) browserRadioButton).addActionListener(e -> setRestartRequired(true)); } + constraints.gridy++; + panel.add(browserChooserPanel, constraints); + + constraints.gridy++; + constraints.gridx = 0; + panel.add(propertyToComponent.get(EarthProperty.SAIKU_SERVER_FOLDER)[0], constraints); + + return panel; } - /** - * The data of the CSV file is validated when the CSV/CED is loaded. This method determines if the data currently loaded is valid or not - * @return True if the data is valid. False otherwise - */ - public boolean isDataValid(){ - return validationResults==null?true:validationResults.isSuccessful(); + private JComponent getIntegrationsPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + panel.add(propertyToComponent.get(EarthProperty.OPEN_GEE_APP)[0], constraints); + + constraints.gridy++; + panel.add(propertyToComponent.get(EarthProperty.OPEN_BING_MAPS)[0], constraints); + + constraints.gridy++; + panel.add(propertyToComponent.get(EarthProperty.OPEN_EARTH_MAP)[0], constraints); + + + constraints.gridy++; + constraints.gridwidth = 1; + panel.add(propertyToComponent.get(EarthProperty.OPEN_PLANET_MAPS)[0], constraints); + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.PLANET_MAPS_MONHLY)[0], constraints); + + constraints.gridy++; + constraints.gridx = 0; + constraints.gridwidth = 1; + final JLabel label = new JLabel(Messages.getString("OptionWizard.101")); //$NON-NLS-1$ + panel.add(label, constraints); + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.PLANET_MAPS_KEY)[0], constraints); + + constraints.gridx = 0; + constraints.gridy++; + constraints.gridwidth = 2; + panel.add(propertyToComponent.get(EarthProperty.OPEN_MAXAR_SECUREWATCH)[0], constraints); + + constraints.gridy++; + constraints.gridwidth = 1; + final JLabel labelMaxar = new JLabel(Messages.getString("OptionWizard.1021")); //$NON-NLS-1$ + panel.add(labelMaxar, constraints); + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.MAXAR_SECUREWATCH_URL)[0], constraints); + + constraints.gridx = 0; + constraints.gridy++; + constraints.gridwidth = 2; + panel.add(propertyToComponent.get(EarthProperty.OPEN_YANDEX_MAPS)[0], constraints); + + constraints.gridy++; + panel.add(propertyToComponent.get(EarthProperty.OPEN_BAIDU_MAPS)[0], constraints); + + constraints.gridy++; + final JLabel label2 = new JLabel(Messages.getString("OptionWizard.103")); //$NON-NLS-1$ + panel.add(label2, constraints); + constraints.gridy++; + panel.add(propertyToComponent.get(EarthProperty.EXTRA_MAP_URL)[0], constraints); + + constraints.gridy++; + constraints.gridx = 0; + constraints.gridwidth = 2; + panel.add(propertyToComponent.get(EarthProperty.OPEN_GEE_CODE_EDITOR)[0], constraints); + + + return panel; } - @Override - public Component prepareRenderer(TableCellRenderer renderer, int row, int col) { - Component comp = super.prepareRenderer(renderer, row, col); + private Component getApplyChangesButton() { + if (applyChanges == null) { + applyChanges = new JButton(Messages.getString("OptionWizard.15")); + applyChanges.addActionListener( + new ApplyOptionChangesListener(this, localPropertiesService, propertyToComponent) { + @Override + protected void applyProperties() { + new Thread("Applying properties dialog") { + @Override + public void run() { + savePropertyValues(); + if (isRestartRequired()) { - if ( cellHasError(row,col)){ - comp.setBackground( ERROR_BG_COLOR ); - }else{ - comp.setBackground(Color.WHITE); + restartEarth(); + } else { + EarthApp.executeKmlLoadAsynchronously(PropertiesDialog.this); + } + } + }.start(); + } + }); } + return applyChanges; + } + + public void closeDialog() { + this.dispose(); + } + + private Component getCancelButton() { + final JButton cancelButton = new JButton(Messages.getString("OptionWizard.24")); //$NON-NLS-1$ + cancelButton.addActionListener( e -> PropertiesDialog.this.dispose() ); + return cancelButton; + } + + private JComponent getOperationModePanel() { + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + final JPanel typeOfUsePanel = new JPanel(new GridBagLayout()); + final Border border = new TitledBorder(new BevelBorder(BevelBorder.LOWERED), + Messages.getString("OptionWizard.2")); //$NON-NLS-1$ + typeOfUsePanel.setBorder(border); + + JPanel serverPanel = getServerPanel(); + typeOfUsePanel.add(serverPanel, constraints); - return comp; + return typeOfUsePanel; } - @Override - public String getToolTipText(MouseEvent event) { - String tip = null; - java.awt.Point p = event.getPoint(); - int row = rowAtPoint(p); - int col = columnAtPoint(p); + private void enableDBOptions(boolean isPostgreDb) { + enableContainer(postgresPanel, isPostgreDb); + enableContainer(sqlitePanel, !isPostgreDb); + } + + private ActionListener getDbTypeListener() { + return e -> { + final JRadioButton theJRB = (JRadioButton) e.getSource(); + + boolean isPostgreDb = theJRB.getName().equals(CollectDBDriver.POSTGRESQL.name()); + enableDBOptions(isPostgreDb); + }; + } + + private JTabbedPane getOptionTabs() { + final JTabbedPane tabbedPane = new JTabbedPane(); + tabbedPane.setSize(550, 300); + final JComponent panel1 = getSampleDataPanel(); + tabbedPane.addTab(Messages.getString("OptionWizard.31"), panel1); //$NON-NLS-1$ + + final JComponent panel2 = getPlotOptionsPanel(); + tabbedPane.addTab(Messages.getString("OptionWizard.32"), panel2); //$NON-NLS-1$ + + final JComponent panel3 = getSurveyDefinitonPanel(); + tabbedPane.addTab(Messages.getString("OptionWizard.33"), panel3); //$NON-NLS-1$ + + final JComponent panel41 = getIntegrationsPanel(); + tabbedPane.addTab(Messages.getString("OptionWizard.34"), panel41); //$NON-NLS-1$ - try { - tip = getCellErrorMessage(row, col); - } catch (RuntimeException e1) { - //catch null pointer exception if mouse is over an empty line - } + final JComponent panel4 = getBrowsersOptionsPanel(); + tabbedPane.addTab(Messages.getString("OptionWizard.104"), panel4); //$NON-NLS-1$ - return tip; + final JComponent panel5 = getOperationModePanelScroll(); + tabbedPane.addTab(Messages.getString("OptionWizard.25"), panel5); //$NON-NLS-1$ + final JComponent panel6 = getProjectsPanelScroll(); + tabbedPane.addTab(Messages.getString("OptionWizard.40"), panel6); //$NON-NLS-1$ + + return tabbedPane; } - private boolean cellHasError(Integer row, Integer col) { - String errorMessage = getCellErrorMessage(row, col); - return errorMessage!=null; + private JComponent getProjectsPanelScroll() { + final JComponent projectsPanel = getProjectsPanel(); + return new JScrollPane(projectsPanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); } - private String getCellErrorMessage(Integer row, Integer col) { - if( validationResults != null ){ - List rowValidations = validationResults.getRowValidations(); - for (CSVRowValidationResult csvRowValidationResult : rowValidations) { - if( csvRowValidationResult.getRowNumber().equals(row+1) && csvRowValidationResult.getColumnPosition().equals( col ) ){ - return csvRowValidationResult.getMessage(); + private JComponent getProjectsPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.fill = GridBagConstraints.BOTH; + + JButton importNewButton = new JButton(Messages.getString("OptionWizard.41")); //$NON-NLS-1$ + importNewButton.addActionListener(new ApplyOptionChangesListener(this, localPropertiesService) { + + @Override + protected void applyProperties() { + final File[] selectedProjectFile = JFileChooserExistsAware.getFileChooserResults( + DataFormat.PROJECT_DEFINITION_FILE, false, false, null, localPropertiesService, + (JFrame) PropertiesDialog.this.getParent()); + + if (selectedProjectFile != null && selectedProjectFile.length == 1) { + try { + projectsService.loadCompressedProjectFile(selectedProjectFile[0]); + restartEarth(); + } catch (Exception e1) { + JOptionPane.showMessageDialog(PropertiesDialog.this, e1.getMessage(), + Messages.getString("OptionWizard.51"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + logger.error("Error importing project file " + selectedProjectFile[0].getAbsolutePath(), e1); //$NON-NLS-1$ + } + } } - } - return null; + }); + + panel.add(importNewButton, constraints); + + final JPanel typeOfDbPanel = new JPanel(new GridBagLayout()); + final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), + Messages.getString("OptionWizard.57")); //$NON-NLS-1$ + typeOfDbPanel.setBorder(border); + + constraints.gridx = 0; + constraints.gridy = 1; + panel.add(typeOfDbPanel, constraints); + + List listOfProjectsByName = new ArrayList<>(); + listOfProjectsByName.addAll(projectsService.getProjectList().keySet()); + Collections.sort(listOfProjectsByName); + final JList listOfProjects = new JList<>(listOfProjectsByName.toArray(new String[0])); // data has type Object[] + listOfProjects.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + listOfProjects.setLayoutOrientation(JList.VERTICAL); + listOfProjects.setVisibleRowCount(-1); + + JScrollPane listScroller = new JScrollPane(listOfProjects); + listScroller.setPreferredSize(new Dimension(250, 300)); + + constraints.gridy = 0; + constraints.gridx = GridBagConstraints.RELATIVE; + typeOfDbPanel.add(listScroller, constraints); + + final JButton openProject = new JButton(Messages.getString("OptionWizard.56")); //$NON-NLS-1$ + openProject.setEnabled(false); + openProject.addActionListener(new ApplyOptionChangesListener(this, localPropertiesService) { + + @Override + protected void applyProperties() { + + File projectFolder = projectsService.getProjectList().get(listOfProjects.getSelectedValue()); + + try { + projectsService.loadProjectInFolder(projectFolder); + restartEarth(); + } catch (Exception e1) { + JOptionPane.showMessageDialog(PropertiesDialog.this, e1.getMessage(), + Messages.getString("OptionWizard.55"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + logger.error("Error importing project folder " + projectFolder.getAbsolutePath(), e1); //$NON-NLS-1$ + } + + } + + }); + + listOfProjects.addListSelectionListener(e -> openProject.setEnabled(listOfProjects.getSelectedValue() != null) ); + + typeOfDbPanel.add(openProject); + + return panel; + } + + private JScrollPane getOperationModePanelScroll() { + final JComponent operationModePanel = getOperationModePanel(); + return new JScrollPane(operationModePanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); } - /** - * Refreshes the data loaded in the table. Used when the user changes the file that contains the CSV file using the OptionWizard dialog. - * @param csvFilePath The path to the CSV file that contains the plot locations - */ - public void refreshTable(String csvFilePath) { + private JComponent getPlotOptionsPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.fill = GridBagConstraints.HORIZONTAL; - if( csvFilePath.trim().length() == 0 ) - return; + JLabel label = new JLabel("Plot shape"); + panel.add(label, constraints); - this.removeAll(); - boolean errorLoading = false; - final File csvFile = new File(csvFilePath); + constraints.gridx = 1; + JComboBox plotShape = (JComboBox) propertyToComponent.get(EarthProperty.SAMPLE_SHAPE)[0]; + panel.add(plotShape, constraints); - if (csvFile.exists()) { - DefaultTableModel newTableModel = getPlotTableModel( csvFilePath ); + constraints.gridx = 0; + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.35")); //$NON-NLS-1$ + panel.add(label, constraints); - validateCsvFile(csvFilePath); + constraints.gridx = 1; + JComboBox numberPoints = (JComboBox) propertyToComponent + .get(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT)[0]; + panel.add(numberPoints, constraints); - if (newTableModel.getRowCount() == 0) { - errorLoading = true; - } else { - this.setModel(newTableModel); + constraints.gridx = 0; + constraints.gridy++; + JLabel distanceOrRadiuslabel = new JLabel(Messages.getString("OptionWizard.36")); //$NON-NLS-1$ + panel.add(distanceOrRadiuslabel, constraints); + + constraints.gridx = 1; + JComboBox distanceBetweenPoints = (JComboBox) propertyToComponent + .get(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS)[0]; + panel.add(new JScrollPane(distanceBetweenPoints), constraints); + + constraints.gridx = 0; + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.37")); //$NON-NLS-1$ + panel.add(label, constraints); + constraints.gridx = 1; + JComboBox distanceToFrame = (JComboBox) propertyToComponent + .get(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES)[0]; + panel.add(new JScrollPane(distanceToFrame), constraints); + + constraints.gridx = 0; + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.95")); //$NON-NLS-1$ + panel.add(label, constraints); + constraints.gridx = 1; + JComboBox dotsSide = (JComboBox) propertyToComponent.get(EarthProperty.INNER_SUBPLOT_SIDE)[0]; + panel.add(new JScrollPane(dotsSide), constraints); + + constraints.gridx = 0; + constraints.gridy++; + label = new JLabel("Central plot side"); //$NON-NLS-1$ + panel.add(label, constraints); + constraints.gridx = 1; + JComboBox largeCentralPlotSide = (JComboBox) propertyToComponent.get(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)[0]; + panel.add(new JScrollPane(largeCentralPlotSide), constraints); + + + + constraints.gridx = 0; + constraints.gridy++; + label = new JLabel("Distance between plots in cluster"); + panel.add(label, constraints); + constraints.gridx = 1; + JComboBox plotDistanceInCluster = (JComboBox) propertyToComponent + .get(EarthProperty.DISTANCE_BETWEEN_PLOTS)[0]; + panel.add(new JScrollPane(plotDistanceInCluster), constraints); + + constraints.gridx = 0; + constraints.gridy++; + JLabel area = new JLabel( + "Area (hectares) : " + calculateArea(numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide)); + panel.add(area, constraints); + + ActionListener calculateAreas = actionPerformed -> area.setText("Area (hectares) : " + calculateArea(numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide)); + + plotShape.addActionListener( e-> + handleVisibilityPlotLayout(plotShape, numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide, + plotDistanceInCluster, area, distanceOrRadiuslabel, largeCentralPlotSide) + ); + + numberPoints.addActionListener(calculateAreas); + distanceBetweenPoints.addActionListener(calculateAreas); + distanceToFrame.addActionListener(calculateAreas); + + handleVisibilityPlotLayout(plotShape, numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide, + plotDistanceInCluster, area, distanceOrRadiuslabel, largeCentralPlotSide); + + return panel; + } + + public void handleVisibilityPlotLayout(JComboBox plotShape, JComboBox numberPoints, JComboBox distanceBetweenPoints, + JComboBox distanceToFrame, JComboBox dotsSide, JComboBox distanceBetweenPlots, JLabel area, + JLabel distanceOrRadiuslabel, JComboBox largeCentralPlotSide ) { + numberPoints.setEnabled(false); + distanceBetweenPoints.setEnabled(false); + distanceToFrame.setEnabled(false); + dotsSide.setEnabled(false); + area.setVisible(false); + distanceBetweenPlots.setVisible(false); + distanceBetweenPlots.setEnabled(false); + largeCentralPlotSide.setVisible( false ); + largeCentralPlotSide.setEnabled(false); + + if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE) || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE_WITH_LARGE_CENTRAL_PLOT) ) { + numberPoints.setEnabled(true); + distanceBetweenPoints.setEnabled(true); + distanceToFrame.setEnabled(true); + dotsSide.setEnabled(true); + area.setVisible(true); + distanceOrRadiuslabel.setText(Messages.getString("OptionWizard.36")); + + if( plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE_WITH_LARGE_CENTRAL_PLOT) ) { + largeCentralPlotSide.setVisible( true ); + largeCentralPlotSide.setEnabled(true); } - } else { - errorLoading = true; + + } else if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.CIRCLE) + || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.HEXAGON)) { + distanceBetweenPoints.setEnabled(true); + dotsSide.setEnabled(true); + numberPoints.setEnabled(true); + distanceOrRadiuslabel.setText("Radius"); + } else if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.NFI_THREE_CIRCLES) || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.NFI_FOUR_CIRCLES)) { + dotsSide.setEnabled(true); + distanceBetweenPoints.setEnabled(true); + distanceBetweenPlots.setVisible(true); + distanceBetweenPlots.setEnabled(true); + distanceOrRadiuslabel.setText("Radius of the plots"); } + } + + private String calculateArea(JComboBox numberOfPoints, JComboBox distanceBetweenPoints, JComboBox distanceToFrame, JComboBox dotsSide) { + double side = 0; + try { + int numberOfPointsI = ((ComboBoxItem) numberOfPoints.getSelectedItem()).getNumberOfPoints(); + int distanceBetweenPointsI = Integer.parseInt((String) distanceBetweenPoints.getSelectedItem()); + int distanceToFrameI = Integer.parseInt((String) distanceToFrame.getSelectedItem()); + + if (numberOfPointsI == 0 || numberOfPointsI == 1) { - if (errorLoading) { - this.setBackground(CollectEarthWindow.ERROR_COLOR); - this.setModel(new DefaultTableModel()); + side = 2d * distanceToFrameI; + if (oldSelectedDistance == null) { + oldSelectedDistance = (String) distanceBetweenPoints.getSelectedItem(); + distanceBetweenPoints.setEnabled(false); + } + distanceBetweenPoints.setSelectedItem("0"); + + if (numberOfPointsI == 0) { + dotsSide.setEnabled(false); + } else if (numberOfPointsI == 1) { + dotsSide.setEnabled(true); + } + + } else { + if (oldSelectedDistance != null) { + distanceBetweenPoints.setSelectedItem(oldSelectedDistance); + oldSelectedDistance = null; + } + + distanceBetweenPoints.setEnabled(true); + distanceToFrame.setEnabled(true); + dotsSide.setEnabled(true); + + double pointsByLines = Math.sqrt(numberOfPointsI); + side = 2d * distanceToFrameI + (pointsByLines - 1) * distanceBetweenPointsI; + + } + + } catch (RuntimeException e) { + logger.error("Error calculating area of the plot", e); } + + DecimalFormat df = new DecimalFormat("###.##"); + return df.format(side * side / 10000d); } - private String[] getColumnNames() { - // Check if the first line is actually a header. Possible if the first header column coincides with ID, PLOT_ID or PLOT - CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); - return cegtg.getExpectedHeaders( forSurvey ).toArray( new String[]{} ); + private JPanel getPostgreSqlPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), + Messages.getString("OptionWizard.6")); //$NON-NLS-1$ + panel.setBorder(border); + + JLabel label = new JLabel(Messages.getString("OptionWizard.7")); //$NON-NLS-1$ + constraints.gridx = 0; + panel.add(label, constraints); + + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.DB_USERNAME)[0], constraints); + + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.8")); //$NON-NLS-1$ + constraints.gridx = 0; + panel.add(label, constraints); + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.DB_PASSWORD)[0], constraints); + + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.9")); //$NON-NLS-1$ + constraints.gridx = 0; + panel.add(label, constraints); + + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.DB_NAME)[0], constraints); + + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.26")); //$NON-NLS-1$ + constraints.gridx = 0; + panel.add(label, constraints); + + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.DB_HOST)[0], constraints); + + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.29")); //$NON-NLS-1$ + constraints.gridx = 0; + panel.add(label, constraints); + + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.DB_PORT)[0], constraints); + + constraints.gridx = 2; + panel.add(new JLabel("Default: 5432"), constraints); + + constraints.gridy++; + constraints.gridx = 1; + JButton button = new JButton("Test Connection"); //$NON-NLS-1$ + button.addActionListener( e-> { + String host = ((JTextField) (propertyToComponent.get(EarthProperty.DB_HOST)[0])).getText(); + String port = ((JTextField) (propertyToComponent.get(EarthProperty.DB_PORT)[0])).getText(); + String dbName = ((JTextField) (propertyToComponent.get(EarthProperty.DB_NAME)[0])).getText(); + String username = ((JTextField) (propertyToComponent.get(EarthProperty.DB_USERNAME)[0])).getText(); + String password = ((JTextField) (propertyToComponent.get(EarthProperty.DB_PASSWORD)[0])).getText(); + + String message = CollectEarthUtils.testPostgreSQLConnection(host, port, dbName, username, password); + JOptionPane.showMessageDialog(PropertiesDialog.this.getOwner(), message, "PostgreSQL Connection test", + JOptionPane.INFORMATION_MESSAGE); + }); + panel.add(button, constraints); + + return panel; + } + + private JPanel getSqlLitePanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), + Messages.getString("OptionWizard.30")); //$NON-NLS-1$ + panel.setBorder(border); + + panel.add(propertyToComponent.get(EarthProperty.AUTOMATIC_BACKUP)[0], constraints); + constraints.gridx++; + panel.add(getOpenBackupFolderButton()); + return panel; + } + + private JComponent getSampleDataPanel() { + final JPlotCsvTable samplePlots = new JPlotCsvTable(localPropertiesService.getValue(EarthProperty.SAMPLE_FILE), + surveyLoaded); + + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.fill = GridBagConstraints.BOTH; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + + final JFilePicker refreshTableOnFileChange = getFilePickerSamplePlots(samplePlots); + + panel.add(refreshTableOnFileChange, constraints); + + samplePlots.setFillsViewportHeight(true); + constraints.gridy = 1; + + constraints.weightx = 1.0; + constraints.weighty = 1.0; + constraints.gridwidth = GridBagConstraints.REMAINDER; + constraints.gridheight = GridBagConstraints.REMAINDER; + + samplePlots.setPreferredScrollableViewportSize(samplePlots.getPreferredSize()); + + panel.add(new JScrollPane(samplePlots, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, + ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), constraints); + + return panel; } - private DefaultTableModel getPlotTableModel(String csvFilePath) { + private JFilePicker getFilePickerSamplePlots(final JPlotCsvTable samplePlots) { + final JFilePicker refreshTableOnFileChange = (JFilePicker) (propertyToComponent + .get(EarthProperty.SAMPLE_FILE)[0]); + refreshTableOnFileChange.addChangeListener(new DocumentListener() { - String[][] allValues = new String[0][0]; + @Override + public void changedUpdate(DocumentEvent e) { + // Do not react + } + + @Override + public void insertUpdate(DocumentEvent e) { + refreshTable(); + } + + @Override + public void removeUpdate(DocumentEvent e) { + // Do not react + } + + private void refreshTable() { + samplePlots.refreshTable(refreshTableOnFileChange.getSelectedFilePath()); - try ( CSVReader reader = CsvReaderUtils.getCsvReader(csvFilePath) ){ - String[] line; - List allLines = new ArrayList<>(); - int i =0; - while( ( line = reader.readNext() ) != null && i< LIMIT_LOADED_CSV_LINES ) { // we do this to avoid out of memory errors - i++; - allLines.add( line ); + // Do not let the user save the changes if the sample data is wrong!!! + getApplyChangesButton().setEnabled(samplePlots.isDataValid()); } + }); + return refreshTableOnFileChange; + } + + private JPanel getServerPanel() { - allValues = allLines.toArray(new String[][] {}); - } catch (Exception e) { - logger.error(" Error reading the CSV file " + csvFilePath, e); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + final JPanel typeOfDbPanel = new JPanel(new GridBagLayout()); + final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), + Messages.getString("OptionWizard.3")); //$NON-NLS-1$ + typeOfDbPanel.setBorder(border); + + JLabel label = new JLabel(Messages.getString("OptionWizard.4") + CollectEarthUtils.getComputerIp()); //$NON-NLS-1$ + typeOfDbPanel.add(label, constraints); + constraints.gridy++; + + label = new JLabel(Messages.getString("OptionWizard.5")); //$NON-NLS-1$ + constraints.gridx = 0; + typeOfDbPanel.add(label, constraints); + + constraints.gridx = 1; + typeOfDbPanel.add(propertyToComponent.get(EarthProperty.HOST_PORT_KEY)[0], constraints); + + constraints.gridwidth = GridBagConstraints.REMAINDER; + constraints.gridy++; + constraints.gridx = 0; + + final ButtonGroup bg = new ButtonGroup(); + final JComponent[] dbTypes = propertyToComponent.get(EarthProperty.DB_DRIVER); + + postgresPanel = getPostgreSqlPanel(); + sqlitePanel = getSqlLitePanel(); + + boolean usingPostgreSQL = localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.POSTGRESQL); + enableDBOptions(usingPostgreSQL); + + for (final JComponent typeRadioButton : dbTypes) { + final JRadioButton dbTypeButton = (JRadioButton) typeRadioButton; + bg.add(dbTypeButton); + typeOfDbPanel.add(dbTypeButton, constraints); + constraints.gridy++; + + dbTypeButton.addActionListener(getDbTypeListener()); + dbTypeButton.addActionListener(e -> setRestartRequired(true)); + + if (dbTypeButton.getName().equals(EarthConstants.CollectDBDriver.POSTGRESQL.name())) { + typeOfDbPanel.add(postgresPanel, constraints); + constraints.gridy++; + + } else { + typeOfDbPanel.add(sqlitePanel, constraints); + constraints.gridy++; + } } + return typeOfDbPanel; + } + + private Component getOpenBackupFolderButton() { + + AbstractAction backupAction = new AbstractAction(Messages.getString("OptionWizard.10")) { //$NON-NLS-1$ + + private static final long serialVersionUID = 1L; + + @Override + public void actionPerformed(ActionEvent e) { + try { + + CollectEarthUtils.openFolderInExplorer(backupFolder); + + } catch (final IOException e1) { + logger.error("Error when opening the explorer window to visualize backups", e1); //$NON-NLS-1$ + } + } + + }; + + return new JButton(backupAction); - return new DefaultTableModel( allValues , getColumnNames()); } - protected void validateCsvFile(String csvFilePath) { + private JComponent getSurveyDefinitonPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.fill = GridBagConstraints.HORIZONTAL; + constraints.gridwidth = 2; + panel.add(propertyToComponent.get(EarthProperty.OPEN_BALLOON_IN_BROWSER)[0], constraints); + + constraints.gridy++; + constraints.gridwidth = 1; + final JLabel label = new JLabel(Messages.getString("OptionWizard.43")); //$NON-NLS-1$ + panel.add(label, constraints); + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.SURVEY_NAME)[0], constraints); + + constraints.gridy++; + constraints.gridwidth = GridBagConstraints.REMAINDER; + constraints.gridx = 0; + panel.add(propertyToComponent.get(EarthProperty.KML_TEMPLATE_KEY)[0], constraints); + + constraints.gridy++; + constraints.gridx = 0; + panel.add(propertyToComponent.get(EarthProperty.BALLOON_TEMPLATE_KEY)[0], constraints); + + constraints.gridy++; + constraints.gridx = 0; + + panel.add(propertyToComponent.get(EarthProperty.METADATA_FILE)[0], constraints); + + return panel; + } - CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); - ValidationParameters validationParameters = new ValidationParameters(); - validationParameters.setValidateOnlyFirstLines( false ); - CSVFileValidationResult validation = cegtg.validate( new File(csvFilePath), forSurvey, validationParameters); + private void initilizeInputs() { - this.setBackground( Color.white ); + final JCheckBox backupCheckbox = new JCheckBox(Messages.getString("OptionWizard.44")); //$NON-NLS-1$ + backupCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.AUTOMATIC_BACKUP))); + propertyToComponent.put(EarthProperty.AUTOMATIC_BACKUP, new JComponent[] { backupCheckbox }); + final JCheckBox openEarthEngineCheckbox = new JCheckBox(Messages.getString("OptionWizard.45")); //$NON-NLS-1$ + openEarthEngineCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_EXPLORER))); + propertyToComponent.put(EarthProperty.OPEN_GEE_EXPLORER, new JComponent[] { openEarthEngineCheckbox }); - if( !validation.isSuccessful() ){ - switch ( validation.getErrorType() ) { - case INVALID_FILE_TYPE: - case INVALID_NUMBER_OF_COLUMNS: - JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); - JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The expected file type is CSV or CED ", "Expected File Type", JOptionPane.ERROR_MESSAGE); - break; + final JCheckBox openGEEAppCheckbox = new JCheckBox("Google Earth Engine APP (no sign-in)"); //$NON-NLS-1$ + openGEEAppCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_APP))); + propertyToComponent.put(EarthProperty.OPEN_GEE_APP, new JComponent[] { openGEEAppCheckbox }); - case INVALID_HEADERS: - JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); - JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The expected columns in the CSV are " + validation.getExpectedHeaders(), "Columns in CSV do not match survey", JOptionPane.ERROR_MESSAGE); - validation = null; // not bad enough to stop the user from loading the CSV file - break; - case INVALID_NUMBER_OF_PLOTS_TOO_LARGE: - JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); - JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "Using CSV files that are too large makes Google Earth extremely slow.\nPlease divide this CSV file into smaller file (reccomended less than 2000 plots per CSV file.\nNumber of plots in this file : " + validation.getNumberOfRows() , "File too large", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - validation = null; // not bad enough to stop the user from loading the CSV file - break; + final JCheckBox openTimelapseCheckbox = new JCheckBox(Messages.getString("OptionWizard.46")); //$NON-NLS-1$ + openTimelapseCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_TIMELAPSE))); + propertyToComponent.put(EarthProperty.OPEN_TIMELAPSE, new JComponent[] { openTimelapseCheckbox }); - case INVALID_NUMBER_OF_PLOTS_WARNING: - JPlotCsvTable.this.setBackground( WARNING_BG_COLOR); - JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "Using CSV files that are too large makes Google Earth slow.\n Please divide this CSV file into smaller file (reccomended size is less than 2000 plots per CSV file.\nNumber of plots in this file : " + validation.getNumberOfRows() , "File too large", JOptionPane.WARNING_MESSAGE); //$NON-NLS-1$ - validation = null; // not bad enough to stop the user from loading the CSV file - break; + final JCheckBox openEarthMapCheckbox = new JCheckBox(Messages.getString("OptionWizard.105")); //$NON-NLS-1$ + openEarthMapCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_EARTH_MAP))); + propertyToComponent.put(EarthProperty.OPEN_EARTH_MAP, new JComponent[] { openEarthMapCheckbox }); - case INVALID_VALUES_IN_CSV: - // IN THIS CASE THE CELL RENDERER TAKES CARE OF HIGHLIGHTING THE CELLS!!! - JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The content of the CSV file is not correct!! The values on the cells highlighted are incorrect " , "CSV content is not correct", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - break; + final JCheckBox openBingCheckbox = new JCheckBox(Messages.getString("OptionWizard.47")); //$NON-NLS-1$ + openBingCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BING_MAPS))); + propertyToComponent.put(EarthProperty.OPEN_BING_MAPS, new JComponent[] { openBingCheckbox }); - default: - break; + final JCheckBox openPlanetCheckbox = new JCheckBox(Messages.getString("OptionWizard.100")); //$NON-NLS-1$ + openPlanetCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_PLANET_MAPS))); + propertyToComponent.put(EarthProperty.OPEN_PLANET_MAPS, new JComponent[] { openPlanetCheckbox }); + + final JCheckBox openMonthlyNICFICheckbox = new JCheckBox(Messages.getString("OptionWizard.110")); //$NON-NLS-1$ + openMonthlyNICFICheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.PLANET_MAPS_MONHLY))); + propertyToComponent.put(EarthProperty.PLANET_MAPS_MONHLY, new JComponent[] { openMonthlyNICFICheckbox }); + + + final JPasswordField planetAPIKeyTextField = new JPasswordField( + localPropertiesService.getValue(EarthProperty.PLANET_MAPS_KEY)); + planetAPIKeyTextField.setMinimumSize(new Dimension( 250, 20 )); + planetAPIKeyTextField.setEnabled( localPropertiesService.isPlanetMapsSupported() ); + propertyToComponent.put(EarthProperty.PLANET_MAPS_KEY, new JComponent[] { planetAPIKeyTextField }); + + openMonthlyNICFICheckbox.setEnabled( openPlanetCheckbox.isSelected() ); + planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ); + + openPlanetCheckbox.addActionListener( e-> { + planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ); + openMonthlyNICFICheckbox.setEnabled( openPlanetCheckbox.isSelected() ); + }); + openMonthlyNICFICheckbox.addActionListener( e-> planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ) ); + + + final JCheckBox openSecureWatchCheckbox = new JCheckBox(Messages.getString("OptionWizard.102")); //$NON-NLS-1$ + openSecureWatchCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_MAXAR_SECUREWATCH))); + propertyToComponent.put(EarthProperty.OPEN_MAXAR_SECUREWATCH, new JComponent[] { openSecureWatchCheckbox }); + + final JTextField secureWatchUrlTextField = new JTextField( + localPropertiesService.getValue(EarthProperty.MAXAR_SECUREWATCH_URL)); + secureWatchUrlTextField.setMinimumSize(new Dimension( 250, 20 )); + propertyToComponent.put(EarthProperty.MAXAR_SECUREWATCH_URL, new JComponent[] { secureWatchUrlTextField }); + secureWatchUrlTextField.setEnabled( localPropertiesService.isSecureWatchSupported() ); + propertyToComponent.put(EarthProperty.MAXAR_SECUREWATCH_URL, new JComponent[] { secureWatchUrlTextField }); + openSecureWatchCheckbox.addActionListener( e -> secureWatchUrlTextField.setEnabled( openSecureWatchCheckbox.isSelected() ) ); + + final JTextField extraUrlTextField = new JTextField( + localPropertiesService.getValue(EarthProperty.EXTRA_MAP_URL)); + extraUrlTextField.setMinimumSize(new Dimension( 250, 20 )); + propertyToComponent.put(EarthProperty.EXTRA_MAP_URL, new JComponent[] { extraUrlTextField }); + + final JCheckBox openBaiduCheckbox = new JCheckBox("Open Baidu Maps"); + openBaiduCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BAIDU_MAPS))); + propertyToComponent.put(EarthProperty.OPEN_BAIDU_MAPS, new JComponent[] { openBaiduCheckbox }); + + final JCheckBox openYandexCheckbox = new JCheckBox("Open Yandex maps for the plot area"); + openYandexCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_YANDEX_MAPS))); + propertyToComponent.put(EarthProperty.OPEN_YANDEX_MAPS, new JComponent[] { openYandexCheckbox }); + + final JCheckBox openHereCheckbox = new JCheckBox(Messages.getString("OptionWizard.59")); //$NON-NLS-1$ + openHereCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_HERE_MAPS))); + propertyToComponent.put(EarthProperty.OPEN_HERE_MAPS, new JComponent[] { openHereCheckbox }); + + final JCheckBox openGeePlaygroundCheckbox = new JCheckBox(Messages.getString("OptionWizard.58")); //$NON-NLS-1$ + openGeePlaygroundCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_CODE_EDITOR))); + propertyToComponent.put(EarthProperty.OPEN_GEE_CODE_EDITOR, new JComponent[] { openGeePlaygroundCheckbox }); + + final JCheckBox openInSeparateWindowCheckbox = new JCheckBox(Messages.getString("OptionWizard.48")); //$NON-NLS-1$ + openInSeparateWindowCheckbox.setSelected( + Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BALLOON_IN_BROWSER))); + propertyToComponent.put(EarthProperty.OPEN_BALLOON_IN_BROWSER, + new JComponent[] { openInSeparateWindowCheckbox }); + + final JFilePicker csvWithPlotData = new JFilePicker(Messages.getString("OptionWizard.49"), //$NON-NLS-1$ + localPropertiesService.getValue(EarthProperty.SAMPLE_FILE), Messages.getString("OptionWizard.50"), DlgMode.MODE_OPEN); // $NON-NLS-1$ + + csvWithPlotData.addFileTypeFilter(".csv,.ced", Messages.getString("OptionWizard.52"), true); //$NON-NLS-1$ //$NON-NLS-2$ + propertyToComponent.put(EarthProperty.SAMPLE_FILE, new JComponent[] { csvWithPlotData }); + + final JComboBox plotShape = new JComboBox<>(SAMPLE_SHAPE.values()); + try { + plotShape.setSelectedItem(SAMPLE_SHAPE.valueOf(localPropertiesService.getValue(EarthProperty.SAMPLE_SHAPE))); + } catch (Exception e1) { + logger.error("The selected shape type is not supported " + localPropertiesService.getValue(EarthProperty.SAMPLE_SHAPE), e1 ); + } + propertyToComponent.put(EarthProperty.SAMPLE_SHAPE, new JComponent[] { plotShape }); + + final JComboBox comboNumberOfPoints = new JComboBox<>( + new ComboBoxItem[] { COMBO_BOX_ITEM_SQUARE, COMBO_BOX_ITEM_CENTRAL_POINT, new ComboBoxItem(4, "2x2"), //$NON-NLS-1$ //$NON-NLS-2$ + // //$NON-NLS-3$ + new ComboBoxItem(9, "3x3"), new ComboBoxItem(16, "4x4"), new ComboBoxItem(25, "5x5"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + new ComboBoxItem(36, "6x6"), //$NON-NLS-1$ + new ComboBoxItem(49, "7x7") }); //$NON-NLS-1$ + if( StringUtils.isNotBlank( localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT) ) ){ + try { + comboNumberOfPoints.setSelectedItem(new ComboBoxItem( + Integer.parseInt(localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT)), + "")); //$NON-NLS-1$ + } catch (NumberFormatException e1) { + logger.error("This should be a number {}", localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT), e1); } } + propertyToComponent.put(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT, + new JComponent[] { comboNumberOfPoints }); + + final String[] listOfNumbers = new String[1500]; + final String[] listOfNumbersFromTwo = new String[1500]; + + for (int index = 0; index < listOfNumbers.length; index++) { + listOfNumbers[index] = Integer.toString( index ); //$NON-NLS-1$ + listOfNumbersFromTwo[index] = Integer.toString( index + 2 ); //$NON-NLS-1$ + } + + final JComboBox listOfDistanceBetweenPoints = new JComboBox<>(listOfNumbersFromTwo); + listOfDistanceBetweenPoints + .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS)); + listOfDistanceBetweenPoints.setAutoscrolls(true); + + propertyToComponent.put(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS, + new JComponent[] { listOfDistanceBetweenPoints }); + + final JComboBox listOfDistanceBetweenPlots = new JComboBox<>(listOfNumbersFromTwo); + listOfDistanceBetweenPlots + .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS)); + listOfDistanceBetweenPlots.setAutoscrolls(true); + + propertyToComponent.put(EarthProperty.DISTANCE_BETWEEN_PLOTS, new JComponent[] { listOfDistanceBetweenPlots }); + + final JComboBox listOfDistanceToBorder = new JComboBox<>(listOfNumbers); + listOfDistanceToBorder + .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES)); + listOfDistanceToBorder.setAutoscrolls(true); + + propertyToComponent.put(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES, new JComponent[] { listOfDistanceToBorder }); + + final JComboBox listOfSizeofSamplingDot = new JComboBox<>(listOfNumbersFromTwo); + listOfSizeofSamplingDot.setSelectedItem(localPropertiesService.getValue(EarthProperty.INNER_SUBPLOT_SIDE)); + listOfSizeofSamplingDot.setAutoscrolls(true); + + propertyToComponent.put(EarthProperty.INNER_SUBPLOT_SIDE, new JComponent[] { listOfSizeofSamplingDot }); + + final JComboBox listOfSideOflargeCentralPlot = new JComboBox<>(listOfNumbersFromTwo); + listOfSideOflargeCentralPlot.setSelectedItem(localPropertiesService.getValue(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)); + listOfSideOflargeCentralPlot.setAutoscrolls(true); + propertyToComponent.put(EarthProperty.LARGE_CENTRAL_PLOT_SIDE, new JComponent[] { listOfSideOflargeCentralPlot }); + + + final JRadioButton chromeChooser = new JRadioButton("Chrome"); //$NON-NLS-1$ + chromeChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() + .equals(EarthConstants.CHROME_BROWSER)); + chromeChooser.setName(EarthConstants.CHROME_BROWSER); + + final JRadioButton firefoxChooser = new JRadioButton("Firefox"); //$NON-NLS-1$ + firefoxChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() + .equals(EarthConstants.FIREFOX_BROWSER)); + firefoxChooser.setName(EarthConstants.FIREFOX_BROWSER); + + final JRadioButton edgeChooser = new JRadioButton("Edge"); //$NON-NLS-1$ + edgeChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() + .equals(EarthConstants.EDGE_BROWSER)); + edgeChooser.setName(EarthConstants.EDGE_BROWSER); + + propertyToComponent.put(EarthProperty.BROWSER_TO_USE, new JComponent[] { firefoxChooser, chromeChooser, edgeChooser}); + final JFilePicker saikuPath = new JFilePicker(Messages.getString("OptionWizard.65"), //$NON-NLS-1$ + localPropertiesService.getValue(EarthProperty.SAIKU_SERVER_FOLDER), + Messages.getString("OptionWizard.66"), DlgMode.MODE_OPEN); //$NON-NLS-1$ + saikuPath.setFolderChooser(); + saikuPath.addChangeListener(new DocumentListener() { + + private void showSaikuWarning() { + final File saikuFolder = new File(saikuPath.getSelectedFilePath()); + if ( !saikuService.isSaikuFolder(saikuFolder)) { + JOptionPane.showMessageDialog(PropertiesDialog.this, Messages.getString("OptionWizard.27"), //$NON-NLS-1$ + Messages.getString("OptionWizard.28"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ + saikuPath.getTextField().setBackground(CollectEarthWindow.ERROR_COLOR); + } else { + saikuPath.getTextField().setBackground(Color.white); + } + } + + @Override + public void removeUpdate(DocumentEvent e) { + // Do not react + } + + @Override + public void insertUpdate(DocumentEvent e) { + showSaikuWarning(); + } + + @Override + public void changedUpdate(DocumentEvent e) { + // Do not react + } + }); + propertyToComponent.put(EarthProperty.SAIKU_SERVER_FOLDER, new JComponent[] { saikuPath }); + + final JFilePicker kmlTemplatePath = new JFilePicker(Messages.getString("OptionWizard.79"), //$NON-NLS-1$ + localPropertiesService.getValue(EarthProperty.KML_TEMPLATE_KEY), Messages.getString("OptionWizard.80"), //$NON-NLS-1$ + DlgMode.MODE_OPEN); + kmlTemplatePath.addFileTypeFilter(".fmt", Messages.getString("OptionWizard.82"), true); //$NON-NLS-1$ //$NON-NLS-2$ + propertyToComponent.put(EarthProperty.KML_TEMPLATE_KEY, new JComponent[] { kmlTemplatePath }); + + final JFilePicker htmlBalloonPath = new JFilePicker(Messages.getString("OptionWizard.83"), //$NON-NLS-1$ + localPropertiesService.getValue(EarthProperty.BALLOON_TEMPLATE_KEY), + Messages.getString("OptionWizard.84"), DlgMode.MODE_OPEN); //$NON-NLS-1$ + htmlBalloonPath.addFileTypeFilter(".html,.htm", Messages.getString("OptionWizard.86"), true); //$NON-NLS-1$ //$NON-NLS-2$ + propertyToComponent.put(EarthProperty.BALLOON_TEMPLATE_KEY, new JComponent[] { htmlBalloonPath }); + + final JFilePicker idmPath = new JFilePicker(Messages.getString("OptionWizard.87"), //$NON-NLS-1$ + localPropertiesService.getImdFile(), Messages.getString("OptionWizard.88"), DlgMode.MODE_OPEN); //$NON-NLS-1$ + idmPath.addFileTypeFilter(".xml", Messages.getString("OptionWizard.90"), true); //$NON-NLS-1$ //$NON-NLS-2$ + propertyToComponent.put(EarthProperty.METADATA_FILE, new JComponent[] { idmPath }); + + final JTextField surveyNameTextField = new JTextField( + localPropertiesService.getValue(EarthProperty.SURVEY_NAME)); + surveyNameTextField.setEnabled(false); + propertyToComponent.put(EarthProperty.SURVEY_NAME, new JComponent[] { surveyNameTextField }); + + // Database options + + final JRadioButton instanceTypeServer = new JRadioButton(Messages.getString("OptionWizard.91")); //$NON-NLS-1$ + instanceTypeServer.setSelected(localPropertiesService.getOperationMode().equals(OperationMode.SERVER_MODE)); + instanceTypeServer.setName(EarthConstants.OperationMode.SERVER_MODE.name()); + + final JRadioButton instanceTypeClient = new JRadioButton(Messages.getString("OptionWizard.92")); //$NON-NLS-1$ + instanceTypeClient.setSelected(localPropertiesService.getOperationMode().equals(OperationMode.CLIENT_MODE)); + instanceTypeClient.setName(EarthConstants.OperationMode.CLIENT_MODE.name()); + propertyToComponent.put(EarthProperty.OPERATION_MODE, + new JComponent[] { instanceTypeServer, instanceTypeClient }); + + final JTextField collectEarthServerIp = new JTextField(localPropertiesService.getValue(EarthProperty.HOST_KEY)); + propertyToComponent.put(EarthProperty.HOST_KEY, new JComponent[] { collectEarthServerIp }); + + final JTextField collectEarthServerIpPort = new JTextField(localPropertiesService.getPort()); + final JTextField collectEarthServerLocalPort = new JTextField( + localPropertiesService.getValue(EarthProperty.HOST_PORT_KEY)); + propertyToComponent.put(EarthProperty.HOST_PORT_KEY, + new JComponent[] { collectEarthServerIpPort, collectEarthServerLocalPort }); + + final JRadioButton sqliteDbType = new JRadioButton(Messages.getString("OptionWizard.93")); //$NON-NLS-1$ + sqliteDbType.setSelected(localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.SQLITE)); + sqliteDbType.setName(CollectDBDriver.SQLITE.name()); + + final JRadioButton postgresDbType = new JRadioButton(Messages.getString("OptionWizard.94")); //$NON-NLS-1$ + boolean usingPostgreSQL = localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.POSTGRESQL); + postgresDbType.setSelected(usingPostgreSQL); + postgresDbType.setName(CollectDBDriver.POSTGRESQL.name()); + propertyToComponent.put(EarthProperty.DB_DRIVER, new JComponent[] { sqliteDbType, postgresDbType }); + + final JTextField dbUserName = new JTextField(localPropertiesService.getValue(EarthProperty.DB_USERNAME)); + propertyToComponent.put(EarthProperty.DB_USERNAME, new JComponent[] { dbUserName }); + + final JTextField dbPassword = new JTextField(localPropertiesService.getValue(EarthProperty.DB_PASSWORD)); + propertyToComponent.put(EarthProperty.DB_PASSWORD, new JComponent[] { dbPassword }); + + final JTextField dbName = new JTextField(localPropertiesService.getValue(EarthProperty.DB_NAME)); + propertyToComponent.put(EarthProperty.DB_NAME, new JComponent[] { dbName }); + + final JTextField dbHost = new JTextField(localPropertiesService.getValue(EarthProperty.DB_HOST)); + propertyToComponent.put(EarthProperty.DB_HOST, new JComponent[] { dbHost }); + + final JTextField dbPort = new JTextField(localPropertiesService.getValue(EarthProperty.DB_PORT)); + propertyToComponent.put(EarthProperty.DB_PORT, new JComponent[] { dbPort }); - this.setValidationResults( validation ); } + public boolean isRestartRequired() { + return restartRequired; + } - private void setValidationResults(CSVFileValidationResult validationResults) { - this.validationResults = validationResults; + public void setRestartRequired(boolean restartRequired) { + this.restartRequired = restartRequired; } } From 6132482a0d8c4373a3108e3ef15888f385d64a39 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:52 +0100 Subject: [PATCH 0359/1620] New translations IPCCDataExportPerPlotCSV.java (English) --- .../earth/app/view/Messages_en.properties | 310 +++++------------- 1 file changed, 77 insertions(+), 233 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index e15ddb90b9..21431b088f 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,233 +1,77 @@ -package org.openforis.collect.earth.app.view; - -import java.awt.Color; -import java.awt.Component; -import java.awt.event.MouseEvent; -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.JOptionPane; -import javax.swing.JTable; -import javax.swing.table.DefaultTableModel; -import javax.swing.table.TableCellRenderer; - -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult; -import org.openforis.collect.io.metadata.collectearth.CSVRowValidationResult; -import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; -import org.openforis.collect.manager.validation.SurveyValidator.ValidationParameters; -import org.openforis.collect.model.CollectSurvey; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.opencsv.CSVReader; - -/** - * Swing JTable used in the OptionWizard dialog. - * It contains methods to refresh the information loaded on the cells. - * @author Alfonso Sanchez-Paus Diaz - * - */ -public class JPlotCsvTable extends JTable{ - - private static final Color WARNING_BG_COLOR = new Color(254, 255, 196); - private static final Color ERROR_BG_COLOR = new Color(218, 152, 152); - private static final long serialVersionUID = 3456854921119125693L; - private static final int LIMIT_LOADED_CSV_LINES = 400; - private final transient Logger logger = LoggerFactory.getLogger(this.getClass()); - private transient CollectSurvey forSurvey; - private transient CSVFileValidationResult validationResults; - - - /** - * Build a new JTable that contains the data from the CSV that is set as the file that contains the plots used by Collect Earth - * @param pathToCsvWithPlots Path to the file containing the plot locations that should be loaded in the table - * @param forSurvey Survey that the csv file belongs to - */ - public JPlotCsvTable(String pathToCsvWithPlots, CollectSurvey forSurvey) { - super(); - this.forSurvey = forSurvey; - - try { - refreshTable(pathToCsvWithPlots); - } catch (Exception e) { - logger.error("Error loading plot file"); - this.setBackground(Color.RED); - this.setToolTipText("The file chosen does not contain plot information"); - - } - } - - /** - * The data of the CSV file is validated when the CSV/CED is loaded. This method determines if the data currently loaded is valid or not - * @return True if the data is valid. False otherwise - */ - public boolean isDataValid(){ - return validationResults==null?true:validationResults.isSuccessful(); - } - - - @Override - public Component prepareRenderer(TableCellRenderer renderer, int row, int col) { - Component comp = super.prepareRenderer(renderer, row, col); - - if ( cellHasError(row,col)){ - comp.setBackground( ERROR_BG_COLOR ); - }else{ - comp.setBackground(Color.WHITE); - } - - return comp; - } - - @Override - public String getToolTipText(MouseEvent event) { - String tip = null; - java.awt.Point p = event.getPoint(); - int row = rowAtPoint(p); - int col = columnAtPoint(p); - - try { - tip = getCellErrorMessage(row, col); - } catch (RuntimeException e1) { - //catch null pointer exception if mouse is over an empty line - } - - return tip; - - } - - private boolean cellHasError(Integer row, Integer col) { - String errorMessage = getCellErrorMessage(row, col); - return errorMessage!=null; - } - - private String getCellErrorMessage(Integer row, Integer col) { - if( validationResults != null ){ - List rowValidations = validationResults.getRowValidations(); - for (CSVRowValidationResult csvRowValidationResult : rowValidations) { - if( csvRowValidationResult.getRowNumber().equals(row+1) && csvRowValidationResult.getColumnPosition().equals( col ) ){ - return csvRowValidationResult.getMessage(); - } - } - } - return null; - } - - /** - * Refreshes the data loaded in the table. Used when the user changes the file that contains the CSV file using the OptionWizard dialog. - * @param csvFilePath The path to the CSV file that contains the plot locations - */ - public void refreshTable(String csvFilePath) { - - if( csvFilePath.trim().length() == 0 ) - return; - - this.removeAll(); - boolean errorLoading = false; - final File csvFile = new File(csvFilePath); - - if (csvFile.exists()) { - DefaultTableModel newTableModel = getPlotTableModel( csvFilePath ); - - validateCsvFile(csvFilePath); - - if (newTableModel.getRowCount() == 0) { - errorLoading = true; - } else { - this.setModel(newTableModel); - } - } else { - errorLoading = true; - } - - if (errorLoading) { - this.setBackground(CollectEarthWindow.ERROR_COLOR); - this.setModel(new DefaultTableModel()); - } - } - - private String[] getColumnNames() { - // Check if the first line is actually a header. Possible if the first header column coincides with ID, PLOT_ID or PLOT - CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); - return cegtg.getExpectedHeaders( forSurvey ).toArray( new String[]{} ); - - } - - private DefaultTableModel getPlotTableModel(String csvFilePath) { - - String[][] allValues = new String[0][0]; - - try ( CSVReader reader = CsvReaderUtils.getCsvReader(csvFilePath) ){ - String[] line; - List allLines = new ArrayList<>(); - int i =0; - while( ( line = reader.readNext() ) != null && i< LIMIT_LOADED_CSV_LINES ) { // we do this to avoid out of memory errors - i++; - allLines.add( line ); - } - - allValues = allLines.toArray(new String[][] {}); - } catch (Exception e) { - logger.error(" Error reading the CSV file " + csvFilePath, e); - } - - return new DefaultTableModel( allValues , getColumnNames()); - } - - protected void validateCsvFile(String csvFilePath) { - - CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); - ValidationParameters validationParameters = new ValidationParameters(); - validationParameters.setValidateOnlyFirstLines( false ); - CSVFileValidationResult validation = cegtg.validate( new File(csvFilePath), forSurvey, validationParameters); - - this.setBackground( Color.white ); - - - if( !validation.isSuccessful() ){ - switch ( validation.getErrorType() ) { - case INVALID_FILE_TYPE: - case INVALID_NUMBER_OF_COLUMNS: - JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); - JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The expected file type is CSV or CED ", "Expected File Type", JOptionPane.ERROR_MESSAGE); - break; - - case INVALID_HEADERS: - JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); - JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The expected columns in the CSV are " + validation.getExpectedHeaders(), "Columns in CSV do not match survey", JOptionPane.ERROR_MESSAGE); - validation = null; // not bad enough to stop the user from loading the CSV file - break; - case INVALID_NUMBER_OF_PLOTS_TOO_LARGE: - JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); - JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "Using CSV files that are too large makes Google Earth extremely slow.\nPlease divide this CSV file into smaller file (reccomended less than 2000 plots per CSV file.\nNumber of plots in this file : " + validation.getNumberOfRows() , "File too large", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - validation = null; // not bad enough to stop the user from loading the CSV file - break; - - case INVALID_NUMBER_OF_PLOTS_WARNING: - JPlotCsvTable.this.setBackground( WARNING_BG_COLOR); - JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "Using CSV files that are too large makes Google Earth slow.\n Please divide this CSV file into smaller file (reccomended size is less than 2000 plots per CSV file.\nNumber of plots in this file : " + validation.getNumberOfRows() , "File too large", JOptionPane.WARNING_MESSAGE); //$NON-NLS-1$ - validation = null; // not bad enough to stop the user from loading the CSV file - break; - - case INVALID_VALUES_IN_CSV: - // IN THIS CASE THE CELL RENDERER TAKES CARE OF HIGHLIGHTING THE CELLS!!! - JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The content of the CSV file is not correct!! The values on the cells highlighted are incorrect " , "CSV content is not correct", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - break; - - default: - break; - } - } - - - this.setValidationResults( validation ); - } - - - private void setValidationResults(CSVFileValidationResult validationResults) { - this.validationResults = validationResults; - } - -} +package org.openforis.collect.earth.ipcc; + +import java.io.File; +import java.io.IOException; +import java.util.List; + +import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.RegionCalculationUtils; +import org.openforis.collect.earth.app.service.SchemaService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class IPCCDataExportPerPlotCSV extends IPCCDataExportCSV { + + private String schemaName; + + Logger logger = LoggerFactory.getLogger(IPCCDataExportPerPlotCSV.class); + + @Autowired + private SchemaService schemaService; + + public IPCCDataExportPerPlotCSV() { + setExportTypeUsed(ExportType.IPCC); + } + + public File generateTimeseriesData( int startYear, int endYear ) throws IOException { + schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); + + List luCombinations = generateLUCombinations(startYear, endYear); + + return createCsv( luCombinations); + } + + + private List generateLUCombinations(int startYear, int endYear) { + + String selectedYears = IPCCDataExportTimeSeries.PLOT_ID + + ", " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_LABEL + + ", " + IPCCDataExportTimeSeries.SOIL_COLUMN_LABEL + + ", " + IPCCDataExportTimeSeries.GEZ_COLUMN_LABEL + ", " ; + + for( int year = startYear ; year <= endYear; year++ ) { + + selectedYears += IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + ","; + + } + + String sqlSelect = "select " + + selectedYears + + RegionCalculationUtils.EXPANSION_FACTOR + + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.SOIL_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.CLIMATE_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.GEZ_TABLE + + + " where " + + IPCCDataExportTimeSeries.SOIL_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.SOIL_COLUMN_ID + + " and " + + IPCCDataExportTimeSeries.CLIMATE_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_ID + + " and " + + IPCCDataExportTimeSeries.GEZ_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.GEZ_COLUMN_ID + + + " ORDER BY "+ IPCCDataExportTimeSeries.PLOT_ID + " DESC"; // Remove trailing comma from list of years + + List luData = getJdbcTemplate().query( + sqlSelect + , + getRowMapper() + ); + + selectedYears+= "area"; // so the area columns appears too + luData.add( 0, selectedYears.split(",") ); + return luData; + } + +} From e8104d14b2f18165f44c5780b862730be581b38e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:53 +0100 Subject: [PATCH 0360/1620] New translations IPCCDataExportMatrixExcel.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 1443 +++-------------- 1 file changed, 234 insertions(+), 1209 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 7eb0424502..1230b9a5c0 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,1209 +1,234 @@ -package org.openforis.collect.earth.app.view; - -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Component; -import java.awt.Container; -import java.awt.Dimension; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.GridLayout; -import java.awt.Insets; -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; -import java.io.IOException; -import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; - -import javax.swing.AbstractAction; -import javax.swing.AbstractButton; -import javax.swing.ButtonGroup; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JComponent; -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JList; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JPasswordField; -import javax.swing.JRadioButton; -import javax.swing.JScrollPane; -import javax.swing.JTabbedPane; -import javax.swing.JTextField; -import javax.swing.ListSelectionModel; -import javax.swing.ScrollPaneConstants; -import javax.swing.border.BevelBorder; -import javax.swing.border.Border; -import javax.swing.border.TitledBorder; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; - -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; -import org.openforis.collect.earth.app.EarthConstants.OperationMode; -import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.AnalysisSaikuService; -import org.openforis.collect.earth.app.service.EarthProjectsService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; -import org.openforis.collect.model.CollectSurvey; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ -public class PropertiesDialog extends JDialog { - - private static final ComboBoxItem COMBO_BOX_ITEM_CENTRAL_POINT = new ComboBoxItem(1, - Messages.getString("OptionWizard.54")); - - private static final ComboBoxItem COMBO_BOX_ITEM_SQUARE = new ComboBoxItem(0, - Messages.getString("OptionWizard.53")); - - private static final long serialVersionUID = -6760020609229102842L; - - private final HashMap, JComponent[]> propertyToComponent = new HashMap<>(); - private final transient Logger logger = LoggerFactory.getLogger(this.getClass()); - - JPanel postgresPanel; - JPanel sqlitePanel; - - private transient LocalPropertiesService localPropertiesService; - - String backupFolder; - - private transient AnalysisSaikuService saikuService; - - private transient EarthProjectsService projectsService; - - private boolean restartRequired; - - private String oldSelectedDistance; - - private CollectSurvey surveyLoaded; - - private JButton applyChanges; - - public PropertiesDialog(JFrame frame, LocalPropertiesService localPropertiesService, - EarthProjectsService projectsService, String backupFolder, AnalysisSaikuService saikuService, - CollectSurvey surveyLoaded) { - super(frame, Messages.getString("OptionWizard.0")); //$NON-NLS-1$ - this.localPropertiesService = localPropertiesService; - this.projectsService = projectsService; - this.backupFolder = backupFolder; - this.saikuService = saikuService; - this.surveyLoaded = surveyLoaded; - this.setLocationRelativeTo(null); - this.setSize(new Dimension(600, 620)); - this.setModal(true); - this.setResizable(false); - initilizeInputs(); - buildMainPane(); - centreWindow(); - - } - - private void centreWindow() { - Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize(); - int x = (int) ((dimension.getWidth() - getWidth()) / 2); - int y = (int) ((dimension.getHeight() - getHeight()) / 2); - setLocation(x, y); - } - - private void buildMainPane() { - - final JPanel panel = new JPanel(new BorderLayout()); - panel.add(getOptionTabs(), BorderLayout.CENTER); - final JPanel buttonPanel = new JPanel(); - buttonPanel.add(getApplyChangesButton()); - buttonPanel.add(getCancelButton()); - panel.add(buttonPanel, BorderLayout.PAGE_END); - this.add(panel); - - } - - private void enableContainer(Container container, boolean enable) { - final Component[] components = container.getComponents(); - for (final Component component : components) { - component.setEnabled(enable); - if (component instanceof Container) { - enableContainer((Container) component, enable); - } - } - } - - private JComponent getBrowsersOptionsPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - final JPanel browserChooserPanel = new JPanel(); - final Border browserBorder = new TitledBorder(new BevelBorder(BevelBorder.LOWERED), - Messages.getString("OptionWizard.1")); //$NON-NLS-1$ - browserChooserPanel.setBorder(browserBorder); - GridLayout experimentLayout = new GridLayout(0,1); - browserChooserPanel.setLayout( experimentLayout ); - - final ButtonGroup browserChooser = new ButtonGroup(); - final JComponent[] browsers = propertyToComponent.get(EarthProperty.BROWSER_TO_USE); - - for (final JComponent browserRadioButton : browsers) { - browserChooserPanel.add(browserRadioButton); - browserChooser.add((AbstractButton) browserRadioButton); - - ((JRadioButton) browserRadioButton).addActionListener(e -> setRestartRequired(true)); - } - constraints.gridy++; - panel.add(browserChooserPanel, constraints); - - constraints.gridy++; - constraints.gridx = 0; - panel.add(propertyToComponent.get(EarthProperty.SAIKU_SERVER_FOLDER)[0], constraints); - - return panel; - } - - private JComponent getIntegrationsPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - panel.add(propertyToComponent.get(EarthProperty.OPEN_GEE_APP)[0], constraints); - - constraints.gridy++; - panel.add(propertyToComponent.get(EarthProperty.OPEN_BING_MAPS)[0], constraints); - - constraints.gridy++; - panel.add(propertyToComponent.get(EarthProperty.OPEN_EARTH_MAP)[0], constraints); - - - constraints.gridy++; - constraints.gridwidth = 1; - panel.add(propertyToComponent.get(EarthProperty.OPEN_PLANET_MAPS)[0], constraints); - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.PLANET_MAPS_MONHLY)[0], constraints); - - constraints.gridy++; - constraints.gridx = 0; - constraints.gridwidth = 1; - final JLabel label = new JLabel(Messages.getString("OptionWizard.101")); //$NON-NLS-1$ - panel.add(label, constraints); - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.PLANET_MAPS_KEY)[0], constraints); - - constraints.gridx = 0; - constraints.gridy++; - constraints.gridwidth = 2; - panel.add(propertyToComponent.get(EarthProperty.OPEN_MAXAR_SECUREWATCH)[0], constraints); - - constraints.gridy++; - constraints.gridwidth = 1; - final JLabel labelMaxar = new JLabel(Messages.getString("OptionWizard.1021")); //$NON-NLS-1$ - panel.add(labelMaxar, constraints); - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.MAXAR_SECUREWATCH_URL)[0], constraints); - - constraints.gridx = 0; - constraints.gridy++; - constraints.gridwidth = 2; - panel.add(propertyToComponent.get(EarthProperty.OPEN_YANDEX_MAPS)[0], constraints); - - constraints.gridy++; - panel.add(propertyToComponent.get(EarthProperty.OPEN_BAIDU_MAPS)[0], constraints); - - constraints.gridy++; - final JLabel label2 = new JLabel(Messages.getString("OptionWizard.103")); //$NON-NLS-1$ - panel.add(label2, constraints); - constraints.gridy++; - panel.add(propertyToComponent.get(EarthProperty.EXTRA_MAP_URL)[0], constraints); - - constraints.gridy++; - constraints.gridx = 0; - constraints.gridwidth = 2; - panel.add(propertyToComponent.get(EarthProperty.OPEN_GEE_CODE_EDITOR)[0], constraints); - - - return panel; - } - - - private Component getApplyChangesButton() { - if (applyChanges == null) { - applyChanges = new JButton(Messages.getString("OptionWizard.15")); - applyChanges.addActionListener( - new ApplyOptionChangesListener(this, localPropertiesService, propertyToComponent) { - @Override - protected void applyProperties() { - new Thread("Applying properties dialog") { - @Override - public void run() { - savePropertyValues(); - if (isRestartRequired()) { - - restartEarth(); - } else { - EarthApp.executeKmlLoadAsynchronously(PropertiesDialog.this); - } - } - }.start(); - } - }); - } - return applyChanges; - } - - public void closeDialog() { - this.dispose(); - } - - private Component getCancelButton() { - final JButton cancelButton = new JButton(Messages.getString("OptionWizard.24")); //$NON-NLS-1$ - cancelButton.addActionListener( e -> PropertiesDialog.this.dispose() ); - return cancelButton; - } - - private JComponent getOperationModePanel() { - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - final JPanel typeOfUsePanel = new JPanel(new GridBagLayout()); - final Border border = new TitledBorder(new BevelBorder(BevelBorder.LOWERED), - Messages.getString("OptionWizard.2")); //$NON-NLS-1$ - typeOfUsePanel.setBorder(border); - - JPanel serverPanel = getServerPanel(); - typeOfUsePanel.add(serverPanel, constraints); - - return typeOfUsePanel; - } - - private void enableDBOptions(boolean isPostgreDb) { - enableContainer(postgresPanel, isPostgreDb); - enableContainer(sqlitePanel, !isPostgreDb); - } - - private ActionListener getDbTypeListener() { - return e -> { - final JRadioButton theJRB = (JRadioButton) e.getSource(); - - boolean isPostgreDb = theJRB.getName().equals(CollectDBDriver.POSTGRESQL.name()); - enableDBOptions(isPostgreDb); - }; - } - - private JTabbedPane getOptionTabs() { - final JTabbedPane tabbedPane = new JTabbedPane(); - tabbedPane.setSize(550, 300); - final JComponent panel1 = getSampleDataPanel(); - tabbedPane.addTab(Messages.getString("OptionWizard.31"), panel1); //$NON-NLS-1$ - - final JComponent panel2 = getPlotOptionsPanel(); - tabbedPane.addTab(Messages.getString("OptionWizard.32"), panel2); //$NON-NLS-1$ - - final JComponent panel3 = getSurveyDefinitonPanel(); - tabbedPane.addTab(Messages.getString("OptionWizard.33"), panel3); //$NON-NLS-1$ - - final JComponent panel41 = getIntegrationsPanel(); - tabbedPane.addTab(Messages.getString("OptionWizard.34"), panel41); //$NON-NLS-1$ - - final JComponent panel4 = getBrowsersOptionsPanel(); - tabbedPane.addTab(Messages.getString("OptionWizard.104"), panel4); //$NON-NLS-1$ - - final JComponent panel5 = getOperationModePanelScroll(); - tabbedPane.addTab(Messages.getString("OptionWizard.25"), panel5); //$NON-NLS-1$ - - final JComponent panel6 = getProjectsPanelScroll(); - tabbedPane.addTab(Messages.getString("OptionWizard.40"), panel6); //$NON-NLS-1$ - - return tabbedPane; - } - - private JComponent getProjectsPanelScroll() { - final JComponent projectsPanel = getProjectsPanel(); - return new JScrollPane(projectsPanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); - } - - private JComponent getProjectsPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.fill = GridBagConstraints.BOTH; - - JButton importNewButton = new JButton(Messages.getString("OptionWizard.41")); //$NON-NLS-1$ - importNewButton.addActionListener(new ApplyOptionChangesListener(this, localPropertiesService) { - - @Override - protected void applyProperties() { - final File[] selectedProjectFile = JFileChooserExistsAware.getFileChooserResults( - DataFormat.PROJECT_DEFINITION_FILE, false, false, null, localPropertiesService, - (JFrame) PropertiesDialog.this.getParent()); - - if (selectedProjectFile != null && selectedProjectFile.length == 1) { - try { - projectsService.loadCompressedProjectFile(selectedProjectFile[0]); - restartEarth(); - } catch (Exception e1) { - JOptionPane.showMessageDialog(PropertiesDialog.this, e1.getMessage(), - Messages.getString("OptionWizard.51"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - logger.error("Error importing project file " + selectedProjectFile[0].getAbsolutePath(), e1); //$NON-NLS-1$ - } - - } - } - }); - - panel.add(importNewButton, constraints); - - final JPanel typeOfDbPanel = new JPanel(new GridBagLayout()); - final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), - Messages.getString("OptionWizard.57")); //$NON-NLS-1$ - typeOfDbPanel.setBorder(border); - - constraints.gridx = 0; - constraints.gridy = 1; - panel.add(typeOfDbPanel, constraints); - - List listOfProjectsByName = new ArrayList<>(); - listOfProjectsByName.addAll(projectsService.getProjectList().keySet()); - Collections.sort(listOfProjectsByName); - final JList listOfProjects = new JList<>(listOfProjectsByName.toArray(new String[0])); // data has type Object[] - listOfProjects.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - listOfProjects.setLayoutOrientation(JList.VERTICAL); - listOfProjects.setVisibleRowCount(-1); - - JScrollPane listScroller = new JScrollPane(listOfProjects); - listScroller.setPreferredSize(new Dimension(250, 300)); - - constraints.gridy = 0; - constraints.gridx = GridBagConstraints.RELATIVE; - typeOfDbPanel.add(listScroller, constraints); - - final JButton openProject = new JButton(Messages.getString("OptionWizard.56")); //$NON-NLS-1$ - openProject.setEnabled(false); - openProject.addActionListener(new ApplyOptionChangesListener(this, localPropertiesService) { - - @Override - protected void applyProperties() { - - File projectFolder = projectsService.getProjectList().get(listOfProjects.getSelectedValue()); - - try { - projectsService.loadProjectInFolder(projectFolder); - restartEarth(); - } catch (Exception e1) { - JOptionPane.showMessageDialog(PropertiesDialog.this, e1.getMessage(), - Messages.getString("OptionWizard.55"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - logger.error("Error importing project folder " + projectFolder.getAbsolutePath(), e1); //$NON-NLS-1$ - } - - } - - }); - - listOfProjects.addListSelectionListener(e -> openProject.setEnabled(listOfProjects.getSelectedValue() != null) ); - - typeOfDbPanel.add(openProject); - - return panel; - } - - private JScrollPane getOperationModePanelScroll() { - final JComponent operationModePanel = getOperationModePanel(); - return new JScrollPane(operationModePanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); - } - - private JComponent getPlotOptionsPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.fill = GridBagConstraints.HORIZONTAL; - - JLabel label = new JLabel("Plot shape"); - panel.add(label, constraints); - - constraints.gridx = 1; - JComboBox plotShape = (JComboBox) propertyToComponent.get(EarthProperty.SAMPLE_SHAPE)[0]; - panel.add(plotShape, constraints); - - constraints.gridx = 0; - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.35")); //$NON-NLS-1$ - panel.add(label, constraints); - - constraints.gridx = 1; - JComboBox numberPoints = (JComboBox) propertyToComponent - .get(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT)[0]; - panel.add(numberPoints, constraints); - - constraints.gridx = 0; - constraints.gridy++; - JLabel distanceOrRadiuslabel = new JLabel(Messages.getString("OptionWizard.36")); //$NON-NLS-1$ - panel.add(distanceOrRadiuslabel, constraints); - - constraints.gridx = 1; - JComboBox distanceBetweenPoints = (JComboBox) propertyToComponent - .get(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS)[0]; - panel.add(new JScrollPane(distanceBetweenPoints), constraints); - - constraints.gridx = 0; - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.37")); //$NON-NLS-1$ - panel.add(label, constraints); - constraints.gridx = 1; - JComboBox distanceToFrame = (JComboBox) propertyToComponent - .get(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES)[0]; - panel.add(new JScrollPane(distanceToFrame), constraints); - - constraints.gridx = 0; - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.95")); //$NON-NLS-1$ - panel.add(label, constraints); - constraints.gridx = 1; - JComboBox dotsSide = (JComboBox) propertyToComponent.get(EarthProperty.INNER_SUBPLOT_SIDE)[0]; - panel.add(new JScrollPane(dotsSide), constraints); - - constraints.gridx = 0; - constraints.gridy++; - label = new JLabel("Central plot side"); //$NON-NLS-1$ - panel.add(label, constraints); - constraints.gridx = 1; - JComboBox largeCentralPlotSide = (JComboBox) propertyToComponent.get(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)[0]; - panel.add(new JScrollPane(largeCentralPlotSide), constraints); - - - - constraints.gridx = 0; - constraints.gridy++; - label = new JLabel("Distance between plots in cluster"); - panel.add(label, constraints); - constraints.gridx = 1; - JComboBox plotDistanceInCluster = (JComboBox) propertyToComponent - .get(EarthProperty.DISTANCE_BETWEEN_PLOTS)[0]; - panel.add(new JScrollPane(plotDistanceInCluster), constraints); - - constraints.gridx = 0; - constraints.gridy++; - JLabel area = new JLabel( - "Area (hectares) : " + calculateArea(numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide)); - panel.add(area, constraints); - - ActionListener calculateAreas = actionPerformed -> area.setText("Area (hectares) : " + calculateArea(numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide)); - - plotShape.addActionListener( e-> - handleVisibilityPlotLayout(plotShape, numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide, - plotDistanceInCluster, area, distanceOrRadiuslabel, largeCentralPlotSide) - ); - - numberPoints.addActionListener(calculateAreas); - distanceBetweenPoints.addActionListener(calculateAreas); - distanceToFrame.addActionListener(calculateAreas); - - handleVisibilityPlotLayout(plotShape, numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide, - plotDistanceInCluster, area, distanceOrRadiuslabel, largeCentralPlotSide); - - return panel; - } - - public void handleVisibilityPlotLayout(JComboBox plotShape, JComboBox numberPoints, JComboBox distanceBetweenPoints, - JComboBox distanceToFrame, JComboBox dotsSide, JComboBox distanceBetweenPlots, JLabel area, - JLabel distanceOrRadiuslabel, JComboBox largeCentralPlotSide ) { - numberPoints.setEnabled(false); - distanceBetweenPoints.setEnabled(false); - distanceToFrame.setEnabled(false); - dotsSide.setEnabled(false); - area.setVisible(false); - distanceBetweenPlots.setVisible(false); - distanceBetweenPlots.setEnabled(false); - largeCentralPlotSide.setVisible( false ); - largeCentralPlotSide.setEnabled(false); - - if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE) || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE_WITH_LARGE_CENTRAL_PLOT) ) { - numberPoints.setEnabled(true); - distanceBetweenPoints.setEnabled(true); - distanceToFrame.setEnabled(true); - dotsSide.setEnabled(true); - area.setVisible(true); - distanceOrRadiuslabel.setText(Messages.getString("OptionWizard.36")); - - if( plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE_WITH_LARGE_CENTRAL_PLOT) ) { - largeCentralPlotSide.setVisible( true ); - largeCentralPlotSide.setEnabled(true); - } - - } else if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.CIRCLE) - || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.HEXAGON)) { - distanceBetweenPoints.setEnabled(true); - dotsSide.setEnabled(true); - numberPoints.setEnabled(true); - distanceOrRadiuslabel.setText("Radius"); - } else if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.NFI_THREE_CIRCLES) || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.NFI_FOUR_CIRCLES)) { - dotsSide.setEnabled(true); - distanceBetweenPoints.setEnabled(true); - distanceBetweenPlots.setVisible(true); - distanceBetweenPlots.setEnabled(true); - distanceOrRadiuslabel.setText("Radius of the plots"); - } - } - - private String calculateArea(JComboBox numberOfPoints, JComboBox distanceBetweenPoints, JComboBox distanceToFrame, JComboBox dotsSide) { - double side = 0; - try { - int numberOfPointsI = ((ComboBoxItem) numberOfPoints.getSelectedItem()).getNumberOfPoints(); - int distanceBetweenPointsI = Integer.parseInt((String) distanceBetweenPoints.getSelectedItem()); - int distanceToFrameI = Integer.parseInt((String) distanceToFrame.getSelectedItem()); - - if (numberOfPointsI == 0 || numberOfPointsI == 1) { - - side = 2d * distanceToFrameI; - if (oldSelectedDistance == null) { - oldSelectedDistance = (String) distanceBetweenPoints.getSelectedItem(); - distanceBetweenPoints.setEnabled(false); - } - distanceBetweenPoints.setSelectedItem("0"); - - if (numberOfPointsI == 0) { - dotsSide.setEnabled(false); - } else if (numberOfPointsI == 1) { - dotsSide.setEnabled(true); - } - - } else { - if (oldSelectedDistance != null) { - distanceBetweenPoints.setSelectedItem(oldSelectedDistance); - oldSelectedDistance = null; - } - - distanceBetweenPoints.setEnabled(true); - distanceToFrame.setEnabled(true); - dotsSide.setEnabled(true); - - double pointsByLines = Math.sqrt(numberOfPointsI); - side = 2d * distanceToFrameI + (pointsByLines - 1) * distanceBetweenPointsI; - - } - - } catch (RuntimeException e) { - logger.error("Error calculating area of the plot", e); - } - - DecimalFormat df = new DecimalFormat("###.##"); - return df.format(side * side / 10000d); - } - - private JPanel getPostgreSqlPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), - Messages.getString("OptionWizard.6")); //$NON-NLS-1$ - panel.setBorder(border); - - JLabel label = new JLabel(Messages.getString("OptionWizard.7")); //$NON-NLS-1$ - constraints.gridx = 0; - panel.add(label, constraints); - - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.DB_USERNAME)[0], constraints); - - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.8")); //$NON-NLS-1$ - constraints.gridx = 0; - panel.add(label, constraints); - - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.DB_PASSWORD)[0], constraints); - - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.9")); //$NON-NLS-1$ - constraints.gridx = 0; - panel.add(label, constraints); - - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.DB_NAME)[0], constraints); - - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.26")); //$NON-NLS-1$ - constraints.gridx = 0; - panel.add(label, constraints); - - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.DB_HOST)[0], constraints); - - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.29")); //$NON-NLS-1$ - constraints.gridx = 0; - panel.add(label, constraints); - - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.DB_PORT)[0], constraints); - - constraints.gridx = 2; - panel.add(new JLabel("Default: 5432"), constraints); - - constraints.gridy++; - constraints.gridx = 1; - JButton button = new JButton("Test Connection"); //$NON-NLS-1$ - button.addActionListener( e-> { - String host = ((JTextField) (propertyToComponent.get(EarthProperty.DB_HOST)[0])).getText(); - String port = ((JTextField) (propertyToComponent.get(EarthProperty.DB_PORT)[0])).getText(); - String dbName = ((JTextField) (propertyToComponent.get(EarthProperty.DB_NAME)[0])).getText(); - String username = ((JTextField) (propertyToComponent.get(EarthProperty.DB_USERNAME)[0])).getText(); - String password = ((JTextField) (propertyToComponent.get(EarthProperty.DB_PASSWORD)[0])).getText(); - - String message = CollectEarthUtils.testPostgreSQLConnection(host, port, dbName, username, password); - JOptionPane.showMessageDialog(PropertiesDialog.this.getOwner(), message, "PostgreSQL Connection test", - JOptionPane.INFORMATION_MESSAGE); - }); - panel.add(button, constraints); - - return panel; - } - - private JPanel getSqlLitePanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), - Messages.getString("OptionWizard.30")); //$NON-NLS-1$ - panel.setBorder(border); - - panel.add(propertyToComponent.get(EarthProperty.AUTOMATIC_BACKUP)[0], constraints); - constraints.gridx++; - panel.add(getOpenBackupFolderButton()); - return panel; - } - - private JComponent getSampleDataPanel() { - final JPlotCsvTable samplePlots = new JPlotCsvTable(localPropertiesService.getValue(EarthProperty.SAMPLE_FILE), - surveyLoaded); - - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.fill = GridBagConstraints.BOTH; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - - final JFilePicker refreshTableOnFileChange = getFilePickerSamplePlots(samplePlots); - - panel.add(refreshTableOnFileChange, constraints); - - samplePlots.setFillsViewportHeight(true); - constraints.gridy = 1; - - constraints.weightx = 1.0; - constraints.weighty = 1.0; - constraints.gridwidth = GridBagConstraints.REMAINDER; - constraints.gridheight = GridBagConstraints.REMAINDER; - - samplePlots.setPreferredScrollableViewportSize(samplePlots.getPreferredSize()); - - panel.add(new JScrollPane(samplePlots, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, - ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), constraints); - - return panel; - } - - private JFilePicker getFilePickerSamplePlots(final JPlotCsvTable samplePlots) { - final JFilePicker refreshTableOnFileChange = (JFilePicker) (propertyToComponent - .get(EarthProperty.SAMPLE_FILE)[0]); - refreshTableOnFileChange.addChangeListener(new DocumentListener() { - - @Override - public void changedUpdate(DocumentEvent e) { - // Do not react - } - - @Override - public void insertUpdate(DocumentEvent e) { - refreshTable(); - } - - @Override - public void removeUpdate(DocumentEvent e) { - // Do not react - } - - private void refreshTable() { - samplePlots.refreshTable(refreshTableOnFileChange.getSelectedFilePath()); - - // Do not let the user save the changes if the sample data is wrong!!! - getApplyChangesButton().setEnabled(samplePlots.isDataValid()); - } - }); - return refreshTableOnFileChange; - } - - private JPanel getServerPanel() { - - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - final JPanel typeOfDbPanel = new JPanel(new GridBagLayout()); - final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), - Messages.getString("OptionWizard.3")); //$NON-NLS-1$ - typeOfDbPanel.setBorder(border); - - JLabel label = new JLabel(Messages.getString("OptionWizard.4") + CollectEarthUtils.getComputerIp()); //$NON-NLS-1$ - typeOfDbPanel.add(label, constraints); - constraints.gridy++; - - label = new JLabel(Messages.getString("OptionWizard.5")); //$NON-NLS-1$ - constraints.gridx = 0; - typeOfDbPanel.add(label, constraints); - - constraints.gridx = 1; - typeOfDbPanel.add(propertyToComponent.get(EarthProperty.HOST_PORT_KEY)[0], constraints); - - constraints.gridwidth = GridBagConstraints.REMAINDER; - constraints.gridy++; - constraints.gridx = 0; - - final ButtonGroup bg = new ButtonGroup(); - final JComponent[] dbTypes = propertyToComponent.get(EarthProperty.DB_DRIVER); - - postgresPanel = getPostgreSqlPanel(); - sqlitePanel = getSqlLitePanel(); - - boolean usingPostgreSQL = localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.POSTGRESQL); - enableDBOptions(usingPostgreSQL); - - for (final JComponent typeRadioButton : dbTypes) { - final JRadioButton dbTypeButton = (JRadioButton) typeRadioButton; - bg.add(dbTypeButton); - typeOfDbPanel.add(dbTypeButton, constraints); - constraints.gridy++; - - dbTypeButton.addActionListener(getDbTypeListener()); - dbTypeButton.addActionListener(e -> setRestartRequired(true)); - - if (dbTypeButton.getName().equals(EarthConstants.CollectDBDriver.POSTGRESQL.name())) { - typeOfDbPanel.add(postgresPanel, constraints); - constraints.gridy++; - - } else { - typeOfDbPanel.add(sqlitePanel, constraints); - constraints.gridy++; - } - } - return typeOfDbPanel; - } - - private Component getOpenBackupFolderButton() { - - AbstractAction backupAction = new AbstractAction(Messages.getString("OptionWizard.10")) { //$NON-NLS-1$ - - private static final long serialVersionUID = 1L; - - @Override - public void actionPerformed(ActionEvent e) { - try { - - CollectEarthUtils.openFolderInExplorer(backupFolder); - - } catch (final IOException e1) { - logger.error("Error when opening the explorer window to visualize backups", e1); //$NON-NLS-1$ - } - } - - }; - - return new JButton(backupAction); - - } - - private JComponent getSurveyDefinitonPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.fill = GridBagConstraints.HORIZONTAL; - constraints.gridwidth = 2; - panel.add(propertyToComponent.get(EarthProperty.OPEN_BALLOON_IN_BROWSER)[0], constraints); - - constraints.gridy++; - constraints.gridwidth = 1; - final JLabel label = new JLabel(Messages.getString("OptionWizard.43")); //$NON-NLS-1$ - panel.add(label, constraints); - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.SURVEY_NAME)[0], constraints); - - constraints.gridy++; - constraints.gridwidth = GridBagConstraints.REMAINDER; - constraints.gridx = 0; - panel.add(propertyToComponent.get(EarthProperty.KML_TEMPLATE_KEY)[0], constraints); - - constraints.gridy++; - constraints.gridx = 0; - panel.add(propertyToComponent.get(EarthProperty.BALLOON_TEMPLATE_KEY)[0], constraints); - - constraints.gridy++; - constraints.gridx = 0; - - panel.add(propertyToComponent.get(EarthProperty.METADATA_FILE)[0], constraints); - - return panel; - } - - private void initilizeInputs() { - - final JCheckBox backupCheckbox = new JCheckBox(Messages.getString("OptionWizard.44")); //$NON-NLS-1$ - backupCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.AUTOMATIC_BACKUP))); - propertyToComponent.put(EarthProperty.AUTOMATIC_BACKUP, new JComponent[] { backupCheckbox }); - - final JCheckBox openEarthEngineCheckbox = new JCheckBox(Messages.getString("OptionWizard.45")); //$NON-NLS-1$ - openEarthEngineCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_EXPLORER))); - propertyToComponent.put(EarthProperty.OPEN_GEE_EXPLORER, new JComponent[] { openEarthEngineCheckbox }); - - final JCheckBox openGEEAppCheckbox = new JCheckBox("Google Earth Engine APP (no sign-in)"); //$NON-NLS-1$ - openGEEAppCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_APP))); - propertyToComponent.put(EarthProperty.OPEN_GEE_APP, new JComponent[] { openGEEAppCheckbox }); - - final JCheckBox openTimelapseCheckbox = new JCheckBox(Messages.getString("OptionWizard.46")); //$NON-NLS-1$ - openTimelapseCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_TIMELAPSE))); - propertyToComponent.put(EarthProperty.OPEN_TIMELAPSE, new JComponent[] { openTimelapseCheckbox }); - - final JCheckBox openEarthMapCheckbox = new JCheckBox(Messages.getString("OptionWizard.105")); //$NON-NLS-1$ - openEarthMapCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_EARTH_MAP))); - propertyToComponent.put(EarthProperty.OPEN_EARTH_MAP, new JComponent[] { openEarthMapCheckbox }); - - final JCheckBox openBingCheckbox = new JCheckBox(Messages.getString("OptionWizard.47")); //$NON-NLS-1$ - openBingCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BING_MAPS))); - propertyToComponent.put(EarthProperty.OPEN_BING_MAPS, new JComponent[] { openBingCheckbox }); - - final JCheckBox openPlanetCheckbox = new JCheckBox(Messages.getString("OptionWizard.100")); //$NON-NLS-1$ - openPlanetCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_PLANET_MAPS))); - propertyToComponent.put(EarthProperty.OPEN_PLANET_MAPS, new JComponent[] { openPlanetCheckbox }); - - final JCheckBox openMonthlyNICFICheckbox = new JCheckBox(Messages.getString("OptionWizard.110")); //$NON-NLS-1$ - openMonthlyNICFICheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.PLANET_MAPS_MONHLY))); - propertyToComponent.put(EarthProperty.PLANET_MAPS_MONHLY, new JComponent[] { openMonthlyNICFICheckbox }); - - - final JPasswordField planetAPIKeyTextField = new JPasswordField( - localPropertiesService.getValue(EarthProperty.PLANET_MAPS_KEY)); - planetAPIKeyTextField.setMinimumSize(new Dimension( 250, 20 )); - planetAPIKeyTextField.setEnabled( localPropertiesService.isPlanetMapsSupported() ); - propertyToComponent.put(EarthProperty.PLANET_MAPS_KEY, new JComponent[] { planetAPIKeyTextField }); - - openMonthlyNICFICheckbox.setEnabled( openPlanetCheckbox.isSelected() ); - planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ); - - openPlanetCheckbox.addActionListener( e-> { - planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ); - openMonthlyNICFICheckbox.setEnabled( openPlanetCheckbox.isSelected() ); - }); - openMonthlyNICFICheckbox.addActionListener( e-> planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ) ); - - - final JCheckBox openSecureWatchCheckbox = new JCheckBox(Messages.getString("OptionWizard.102")); //$NON-NLS-1$ - openSecureWatchCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_MAXAR_SECUREWATCH))); - propertyToComponent.put(EarthProperty.OPEN_MAXAR_SECUREWATCH, new JComponent[] { openSecureWatchCheckbox }); - - final JTextField secureWatchUrlTextField = new JTextField( - localPropertiesService.getValue(EarthProperty.MAXAR_SECUREWATCH_URL)); - secureWatchUrlTextField.setMinimumSize(new Dimension( 250, 20 )); - propertyToComponent.put(EarthProperty.MAXAR_SECUREWATCH_URL, new JComponent[] { secureWatchUrlTextField }); - secureWatchUrlTextField.setEnabled( localPropertiesService.isSecureWatchSupported() ); - propertyToComponent.put(EarthProperty.MAXAR_SECUREWATCH_URL, new JComponent[] { secureWatchUrlTextField }); - openSecureWatchCheckbox.addActionListener( e -> secureWatchUrlTextField.setEnabled( openSecureWatchCheckbox.isSelected() ) ); - - final JTextField extraUrlTextField = new JTextField( - localPropertiesService.getValue(EarthProperty.EXTRA_MAP_URL)); - extraUrlTextField.setMinimumSize(new Dimension( 250, 20 )); - propertyToComponent.put(EarthProperty.EXTRA_MAP_URL, new JComponent[] { extraUrlTextField }); - - final JCheckBox openBaiduCheckbox = new JCheckBox("Open Baidu Maps"); - openBaiduCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BAIDU_MAPS))); - propertyToComponent.put(EarthProperty.OPEN_BAIDU_MAPS, new JComponent[] { openBaiduCheckbox }); - - final JCheckBox openYandexCheckbox = new JCheckBox("Open Yandex maps for the plot area"); - openYandexCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_YANDEX_MAPS))); - propertyToComponent.put(EarthProperty.OPEN_YANDEX_MAPS, new JComponent[] { openYandexCheckbox }); - - final JCheckBox openHereCheckbox = new JCheckBox(Messages.getString("OptionWizard.59")); //$NON-NLS-1$ - openHereCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_HERE_MAPS))); - propertyToComponent.put(EarthProperty.OPEN_HERE_MAPS, new JComponent[] { openHereCheckbox }); - - final JCheckBox openGeePlaygroundCheckbox = new JCheckBox(Messages.getString("OptionWizard.58")); //$NON-NLS-1$ - openGeePlaygroundCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_CODE_EDITOR))); - propertyToComponent.put(EarthProperty.OPEN_GEE_CODE_EDITOR, new JComponent[] { openGeePlaygroundCheckbox }); - - final JCheckBox openInSeparateWindowCheckbox = new JCheckBox(Messages.getString("OptionWizard.48")); //$NON-NLS-1$ - openInSeparateWindowCheckbox.setSelected( - Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BALLOON_IN_BROWSER))); - propertyToComponent.put(EarthProperty.OPEN_BALLOON_IN_BROWSER, - new JComponent[] { openInSeparateWindowCheckbox }); - - final JFilePicker csvWithPlotData = new JFilePicker(Messages.getString("OptionWizard.49"), //$NON-NLS-1$ - localPropertiesService.getValue(EarthProperty.SAMPLE_FILE), Messages.getString("OptionWizard.50"), DlgMode.MODE_OPEN); // $NON-NLS-1$ - - csvWithPlotData.addFileTypeFilter(".csv,.ced", Messages.getString("OptionWizard.52"), true); //$NON-NLS-1$ //$NON-NLS-2$ - propertyToComponent.put(EarthProperty.SAMPLE_FILE, new JComponent[] { csvWithPlotData }); - - final JComboBox plotShape = new JComboBox<>(SAMPLE_SHAPE.values()); - try { - plotShape.setSelectedItem(SAMPLE_SHAPE.valueOf(localPropertiesService.getValue(EarthProperty.SAMPLE_SHAPE))); - } catch (Exception e1) { - logger.error("The selected shape type is not supported " + localPropertiesService.getValue(EarthProperty.SAMPLE_SHAPE), e1 ); - } - propertyToComponent.put(EarthProperty.SAMPLE_SHAPE, new JComponent[] { plotShape }); - - final JComboBox comboNumberOfPoints = new JComboBox<>( - new ComboBoxItem[] { COMBO_BOX_ITEM_SQUARE, COMBO_BOX_ITEM_CENTRAL_POINT, new ComboBoxItem(4, "2x2"), //$NON-NLS-1$ //$NON-NLS-2$ - // //$NON-NLS-3$ - new ComboBoxItem(9, "3x3"), new ComboBoxItem(16, "4x4"), new ComboBoxItem(25, "5x5"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - new ComboBoxItem(36, "6x6"), //$NON-NLS-1$ - new ComboBoxItem(49, "7x7") }); //$NON-NLS-1$ - if( StringUtils.isNotBlank( localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT) ) ){ - try { - comboNumberOfPoints.setSelectedItem(new ComboBoxItem( - Integer.parseInt(localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT)), - "")); //$NON-NLS-1$ - } catch (NumberFormatException e1) { - logger.error("This should be a number {}", localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT), e1); - } - } - propertyToComponent.put(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT, - new JComponent[] { comboNumberOfPoints }); - - final String[] listOfNumbers = new String[1500]; - final String[] listOfNumbersFromTwo = new String[1500]; - - for (int index = 0; index < listOfNumbers.length; index++) { - listOfNumbers[index] = Integer.toString( index ); //$NON-NLS-1$ - listOfNumbersFromTwo[index] = Integer.toString( index + 2 ); //$NON-NLS-1$ - } - - final JComboBox listOfDistanceBetweenPoints = new JComboBox<>(listOfNumbersFromTwo); - listOfDistanceBetweenPoints - .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS)); - listOfDistanceBetweenPoints.setAutoscrolls(true); - - propertyToComponent.put(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS, - new JComponent[] { listOfDistanceBetweenPoints }); - - final JComboBox listOfDistanceBetweenPlots = new JComboBox<>(listOfNumbersFromTwo); - listOfDistanceBetweenPlots - .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS)); - listOfDistanceBetweenPlots.setAutoscrolls(true); - - propertyToComponent.put(EarthProperty.DISTANCE_BETWEEN_PLOTS, new JComponent[] { listOfDistanceBetweenPlots }); - - final JComboBox listOfDistanceToBorder = new JComboBox<>(listOfNumbers); - listOfDistanceToBorder - .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES)); - listOfDistanceToBorder.setAutoscrolls(true); - - propertyToComponent.put(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES, new JComponent[] { listOfDistanceToBorder }); - - final JComboBox listOfSizeofSamplingDot = new JComboBox<>(listOfNumbersFromTwo); - listOfSizeofSamplingDot.setSelectedItem(localPropertiesService.getValue(EarthProperty.INNER_SUBPLOT_SIDE)); - listOfSizeofSamplingDot.setAutoscrolls(true); - - propertyToComponent.put(EarthProperty.INNER_SUBPLOT_SIDE, new JComponent[] { listOfSizeofSamplingDot }); - - final JComboBox listOfSideOflargeCentralPlot = new JComboBox<>(listOfNumbersFromTwo); - listOfSideOflargeCentralPlot.setSelectedItem(localPropertiesService.getValue(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)); - listOfSideOflargeCentralPlot.setAutoscrolls(true); - - propertyToComponent.put(EarthProperty.LARGE_CENTRAL_PLOT_SIDE, new JComponent[] { listOfSideOflargeCentralPlot }); - - - final JRadioButton chromeChooser = new JRadioButton("Chrome"); //$NON-NLS-1$ - chromeChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() - .equals(EarthConstants.CHROME_BROWSER)); - chromeChooser.setName(EarthConstants.CHROME_BROWSER); - - final JRadioButton firefoxChooser = new JRadioButton("Firefox"); //$NON-NLS-1$ - firefoxChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() - .equals(EarthConstants.FIREFOX_BROWSER)); - firefoxChooser.setName(EarthConstants.FIREFOX_BROWSER); - - final JRadioButton edgeChooser = new JRadioButton("Edge"); //$NON-NLS-1$ - edgeChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() - .equals(EarthConstants.EDGE_BROWSER)); - edgeChooser.setName(EarthConstants.EDGE_BROWSER); - - propertyToComponent.put(EarthProperty.BROWSER_TO_USE, new JComponent[] { firefoxChooser, chromeChooser, edgeChooser}); - final JFilePicker saikuPath = new JFilePicker(Messages.getString("OptionWizard.65"), //$NON-NLS-1$ - localPropertiesService.getValue(EarthProperty.SAIKU_SERVER_FOLDER), - Messages.getString("OptionWizard.66"), DlgMode.MODE_OPEN); //$NON-NLS-1$ - saikuPath.setFolderChooser(); - saikuPath.addChangeListener(new DocumentListener() { - - private void showSaikuWarning() { - final File saikuFolder = new File(saikuPath.getSelectedFilePath()); - if ( !saikuService.isSaikuFolder(saikuFolder)) { - JOptionPane.showMessageDialog(PropertiesDialog.this, Messages.getString("OptionWizard.27"), //$NON-NLS-1$ - Messages.getString("OptionWizard.28"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ - saikuPath.getTextField().setBackground(CollectEarthWindow.ERROR_COLOR); - } else { - saikuPath.getTextField().setBackground(Color.white); - } - } - - @Override - public void removeUpdate(DocumentEvent e) { - // Do not react - } - - @Override - public void insertUpdate(DocumentEvent e) { - showSaikuWarning(); - } - - @Override - public void changedUpdate(DocumentEvent e) { - // Do not react - } - }); - propertyToComponent.put(EarthProperty.SAIKU_SERVER_FOLDER, new JComponent[] { saikuPath }); - - final JFilePicker kmlTemplatePath = new JFilePicker(Messages.getString("OptionWizard.79"), //$NON-NLS-1$ - localPropertiesService.getValue(EarthProperty.KML_TEMPLATE_KEY), Messages.getString("OptionWizard.80"), //$NON-NLS-1$ - DlgMode.MODE_OPEN); - kmlTemplatePath.addFileTypeFilter(".fmt", Messages.getString("OptionWizard.82"), true); //$NON-NLS-1$ //$NON-NLS-2$ - propertyToComponent.put(EarthProperty.KML_TEMPLATE_KEY, new JComponent[] { kmlTemplatePath }); - - final JFilePicker htmlBalloonPath = new JFilePicker(Messages.getString("OptionWizard.83"), //$NON-NLS-1$ - localPropertiesService.getValue(EarthProperty.BALLOON_TEMPLATE_KEY), - Messages.getString("OptionWizard.84"), DlgMode.MODE_OPEN); //$NON-NLS-1$ - htmlBalloonPath.addFileTypeFilter(".html,.htm", Messages.getString("OptionWizard.86"), true); //$NON-NLS-1$ //$NON-NLS-2$ - propertyToComponent.put(EarthProperty.BALLOON_TEMPLATE_KEY, new JComponent[] { htmlBalloonPath }); - - final JFilePicker idmPath = new JFilePicker(Messages.getString("OptionWizard.87"), //$NON-NLS-1$ - localPropertiesService.getImdFile(), Messages.getString("OptionWizard.88"), DlgMode.MODE_OPEN); //$NON-NLS-1$ - idmPath.addFileTypeFilter(".xml", Messages.getString("OptionWizard.90"), true); //$NON-NLS-1$ //$NON-NLS-2$ - propertyToComponent.put(EarthProperty.METADATA_FILE, new JComponent[] { idmPath }); - - final JTextField surveyNameTextField = new JTextField( - localPropertiesService.getValue(EarthProperty.SURVEY_NAME)); - surveyNameTextField.setEnabled(false); - propertyToComponent.put(EarthProperty.SURVEY_NAME, new JComponent[] { surveyNameTextField }); - - // Database options - - final JRadioButton instanceTypeServer = new JRadioButton(Messages.getString("OptionWizard.91")); //$NON-NLS-1$ - instanceTypeServer.setSelected(localPropertiesService.getOperationMode().equals(OperationMode.SERVER_MODE)); - instanceTypeServer.setName(EarthConstants.OperationMode.SERVER_MODE.name()); - - final JRadioButton instanceTypeClient = new JRadioButton(Messages.getString("OptionWizard.92")); //$NON-NLS-1$ - instanceTypeClient.setSelected(localPropertiesService.getOperationMode().equals(OperationMode.CLIENT_MODE)); - instanceTypeClient.setName(EarthConstants.OperationMode.CLIENT_MODE.name()); - propertyToComponent.put(EarthProperty.OPERATION_MODE, - new JComponent[] { instanceTypeServer, instanceTypeClient }); - - final JTextField collectEarthServerIp = new JTextField(localPropertiesService.getValue(EarthProperty.HOST_KEY)); - propertyToComponent.put(EarthProperty.HOST_KEY, new JComponent[] { collectEarthServerIp }); - - final JTextField collectEarthServerIpPort = new JTextField(localPropertiesService.getPort()); - final JTextField collectEarthServerLocalPort = new JTextField( - localPropertiesService.getValue(EarthProperty.HOST_PORT_KEY)); - propertyToComponent.put(EarthProperty.HOST_PORT_KEY, - new JComponent[] { collectEarthServerIpPort, collectEarthServerLocalPort }); - - final JRadioButton sqliteDbType = new JRadioButton(Messages.getString("OptionWizard.93")); //$NON-NLS-1$ - sqliteDbType.setSelected(localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.SQLITE)); - sqliteDbType.setName(CollectDBDriver.SQLITE.name()); - - final JRadioButton postgresDbType = new JRadioButton(Messages.getString("OptionWizard.94")); //$NON-NLS-1$ - boolean usingPostgreSQL = localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.POSTGRESQL); - postgresDbType.setSelected(usingPostgreSQL); - postgresDbType.setName(CollectDBDriver.POSTGRESQL.name()); - propertyToComponent.put(EarthProperty.DB_DRIVER, new JComponent[] { sqliteDbType, postgresDbType }); - - final JTextField dbUserName = new JTextField(localPropertiesService.getValue(EarthProperty.DB_USERNAME)); - propertyToComponent.put(EarthProperty.DB_USERNAME, new JComponent[] { dbUserName }); - - final JTextField dbPassword = new JTextField(localPropertiesService.getValue(EarthProperty.DB_PASSWORD)); - propertyToComponent.put(EarthProperty.DB_PASSWORD, new JComponent[] { dbPassword }); - - final JTextField dbName = new JTextField(localPropertiesService.getValue(EarthProperty.DB_NAME)); - propertyToComponent.put(EarthProperty.DB_NAME, new JComponent[] { dbName }); - - final JTextField dbHost = new JTextField(localPropertiesService.getValue(EarthProperty.DB_HOST)); - propertyToComponent.put(EarthProperty.DB_HOST, new JComponent[] { dbHost }); - - final JTextField dbPort = new JTextField(localPropertiesService.getValue(EarthProperty.DB_PORT)); - propertyToComponent.put(EarthProperty.DB_PORT, new JComponent[] { dbPort }); - - } - - public boolean isRestartRequired() { - return restartRequired; - } - - public void setRestartRequired(boolean restartRequired) { - this.restartRequired = restartRequired; - } - -} +package org.openforis.collect.earth.ipcc; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections.Predicate; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.Font; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.RDBConnector; +import org.openforis.collect.earth.app.service.RegionCalculationUtils; +import org.openforis.collect.earth.app.service.SchemaService; +import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Component; + +import liquibase.pro.packaged.E; + +@Component +public class IPCCDataExportMatrixExcel extends RDBConnector { + + private String schemaName; + + Logger logger = LoggerFactory.getLogger(IPCCDataExportMatrixExcel.class); + + @Autowired + private SchemaService schemaService; + + public IPCCDataExportMatrixExcel() { + setExportTypeUsed(ExportType.IPCC); + } + + public File generateTimeseriesData( int startYear, int endYear ) throws IOException { + schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); + + List matrixSheets = new ArrayList(); + + for (int year = startYear; year < endYear; year++) { + MatrixSheet yearMatrixData = generateLUMatrixForYear(year); + if (yearMatrixData != null) + matrixSheets.add(yearMatrixData); + } + + return createExcel( matrixSheets); + } + + + private MatrixSheet generateLUMatrixForYear(int year) { + + List luData = getJdbcTemplate().query( + "select " + + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " + + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1) + "," + + "sum( " + RegionCalculationUtils.EXPANSION_FACTOR + ")" + + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE + + " GROUP BY " + + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + "," + + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1), + getRowMapper() + ); + + if (luData.size() == 0) { // No LU data for the climate, soil, gez combination + return null; + } + + YearData yearData = new YearData(year, luData); + + return new MatrixSheet( yearData ); + } + + + protected RowMapper getRowMapper() { + return new RowMapper() { + @Override + public LUDataPerYear mapRow(ResultSet rs, int rowNum) throws SQLException { + + String categoryInitial = rs.getString(1); + String categoryFinal = rs.getString(2); + String subdivInitial = rs.getString(3); + String subdivFinal = rs.getString(4); + + return new LUDataPerYear( + LandUseSubdivisionUtils.getSubdivision(categoryInitial, subdivInitial), + LandUseSubdivisionUtils.getSubdivision(categoryFinal, subdivFinal), + rs.getDouble(5) // area + ); + } + }; + } + + protected static LUDataPerYear findLuData( LandUseSubdivision initialSubdivision, LandUseSubdivision finalSubdivision, List luData ) { + Collection result = CollectionUtils.select(luData, new Predicate() { + public boolean evaluate(Object a) { + return + ( (LUDataPerYear) a ).getLu().equals(initialSubdivision) + && + ( (LUDataPerYear) a ).getLuNextYear().equals(finalSubdivision); + } + }); + if( result.size() == 1 ) + return (LUDataPerYear) result.toArray(new LUDataPerYear[result.size()])[0]; + else + return new LUDataPerYear(initialSubdivision, finalSubdivision, 0); + + } + + private File createExcel( List matrixData ) throws IOException { + File excelDestination = File.createTempFile("LuMatrixTimeseries", ".xls"); + excelDestination.deleteOnExit(); + // Create a Workbook + try (Workbook workbook = new HSSFWorkbook() ){ + /* CreationHelper helps us create instances of various things like DataFormat, + Hyperlink, RichTextString etc, in a format (HSSF, XSSF) independent way */ + //CreationHelper createHelper = workbook.getCreationHelper(); + + // Create a Font for styling header cells + Font cornerFont = workbook.createFont(); + cornerFont.setBold(true); + cornerFont.setFontHeightInPoints((short) 15); + cornerFont.setColor(IndexedColors.GREY_80_PERCENT.getIndex()); + // Create a CellStyle with the font + CellStyle cornerCellStyle = workbook.createCellStyle(); + cornerCellStyle.setFont(cornerFont); + + // Create a Font for styling header cells + Font headerFont = workbook.createFont(); + headerFont.setBold(true); + headerFont.setFontHeightInPoints((short) 14); + headerFont.setColor(IndexedColors.DARK_TEAL.getIndex()); + // Create a CellStyle with the font + CellStyle headerCellStyle = workbook.createCellStyle(); + headerCellStyle.setFont(headerFont); + + // Create a Font for styling non-diagonal cells + Font stdFont = workbook.createFont(); + stdFont.setBold(false); + stdFont.setFontHeightInPoints((short) 14); + stdFont.setColor(IndexedColors.DARK_RED.getIndex()); + // Create a CellStyle with the font + CellStyle stdCellStyle = workbook.createCellStyle(); + stdCellStyle.setFont(stdFont); + + // Create a Font for styling non-diagonal cells + Font diagonalFont = workbook.createFont(); + diagonalFont.setBold(true); + diagonalFont.setFontHeightInPoints((short) 14); + diagonalFont.setColor(IndexedColors.DARK_GREEN.getIndex()); + // Create a CellStyle with the font + CellStyle diagonalCellStyle = workbook.createCellStyle(); + diagonalCellStyle.setFont(diagonalFont); + + for (MatrixSheet matrix : matrixData) { + // Create a Sheet + Sheet sheet = workbook.createSheet("LU Matrix " + matrix.getYearData().getYear() + "-" + (matrix.getYearData().getYear()+1 ) ); + + // Create a Row + Row headerRow = sheet.createRow(0); + Cell cell = headerRow.createCell(0); + cell.setCellValue( "Transition " + matrix.getYearData().getYear() + "/" + ( matrix.getYearData().getYear() +1 ) ); + cell.setCellStyle(cornerCellStyle); + + int i = 1; + for (LandUseSubdivision subdivision : matrix.getSubdivisions()) { + cell = headerRow.createCell(i++); + cell.setCellValue(subdivision.toString()); + cell.setCellStyle(headerCellStyle); + } + + + int rowNum = 1; + int colNum = 0; + for (LandUseSubdivision subdivisionH : matrix.getSubdivisions()) { + colNum = 0; + Row row = sheet.createRow(rowNum++); + + Cell columnCell = row.createCell(colNum++); + columnCell.setCellStyle(headerCellStyle); + columnCell.setCellValue(subdivisionH.toString()); + + colNum = 1; + for (LandUseSubdivision subdivisionV : matrix.getSubdivisions()) { + + cell = row.createCell(colNum++); + cell.setCellValue( findLuData( subdivisionH, subdivisionV, matrix.getYearData().getLuData() ).getAreaHa() ); + if( subdivisionH.equals( subdivisionV ) ) { + cell.setCellStyle(diagonalCellStyle); + }else { + cell.setCellStyle(stdCellStyle); + } + } + + } + + // Resize all columns to fit the content size + for(int j = 0; j < colNum; j++) { + sheet.autoSizeColumn(j); + } + + } + + // Write the output to a file + try( FileOutputStream fileOut = new FileOutputStream(excelDestination) ){ + workbook.write(fileOut); + } catch (IOException e) { + logger.error("Error generating Excel file", e); + } + } catch (Exception e) { + logger.error("Error generating Excel data", e); + } + return excelDestination; + } + +} From 3ff30e0d24597b6e1ff1fbfeb66d63cae49ff7f9 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:54 +0100 Subject: [PATCH 0361/1620] New translations IPCCDataExportMatrixExcel.java (English) --- .../earth/app/view/Messages_en.properties | 229 +++++++++++++++--- 1 file changed, 193 insertions(+), 36 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 21431b088f..1230b9a5c0 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,77 +1,234 @@ package org.openforis.collect.earth.ipcc; import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; import java.util.List; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections.Predicate; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.Font; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.RDBConnector; import org.openforis.collect.earth.app.service.RegionCalculationUtils; import org.openforis.collect.earth.app.service.SchemaService; +import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Component; +import liquibase.pro.packaged.E; + @Component -public class IPCCDataExportPerPlotCSV extends IPCCDataExportCSV { +public class IPCCDataExportMatrixExcel extends RDBConnector { private String schemaName; - - Logger logger = LoggerFactory.getLogger(IPCCDataExportPerPlotCSV.class); + + Logger logger = LoggerFactory.getLogger(IPCCDataExportMatrixExcel.class); @Autowired private SchemaService schemaService; - public IPCCDataExportPerPlotCSV() { + public IPCCDataExportMatrixExcel() { setExportTypeUsed(ExportType.IPCC); } public File generateTimeseriesData( int startYear, int endYear ) throws IOException { schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - List luCombinations = generateLUCombinations(startYear, endYear); + List matrixSheets = new ArrayList(); - return createCsv( luCombinations); - } + for (int year = startYear; year < endYear; year++) { + MatrixSheet yearMatrixData = generateLUMatrixForYear(year); + if (yearMatrixData != null) + matrixSheets.add(yearMatrixData); + } + return createExcel( matrixSheets); + } - private List generateLUCombinations(int startYear, int endYear) { - - String selectedYears = IPCCDataExportTimeSeries.PLOT_ID + - ", " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_LABEL + - ", " + IPCCDataExportTimeSeries.SOIL_COLUMN_LABEL + - ", " + IPCCDataExportTimeSeries.GEZ_COLUMN_LABEL + ", " ; - - for( int year = startYear ; year <= endYear; year++ ) { - selectedYears += IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + ","; + private MatrixSheet generateLUMatrixForYear(int year) { + + List luData = getJdbcTemplate().query( + "select " + + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " + + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1) + "," + + "sum( " + RegionCalculationUtils.EXPANSION_FACTOR + ")" + + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE + + " GROUP BY " + + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + "," + + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1), + getRowMapper() + ); + if (luData.size() == 0) { // No LU data for the climate, soil, gez combination + return null; } - String sqlSelect = "select " - + selectedYears - + RegionCalculationUtils.EXPANSION_FACTOR - + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.SOIL_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.CLIMATE_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.GEZ_TABLE + YearData yearData = new YearData(year, luData); + + return new MatrixSheet( yearData ); + } + + + protected RowMapper getRowMapper() { + return new RowMapper() { + @Override + public LUDataPerYear mapRow(ResultSet rs, int rowNum) throws SQLException { - + " where " - + IPCCDataExportTimeSeries.SOIL_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.SOIL_COLUMN_ID - + " and " - + IPCCDataExportTimeSeries.CLIMATE_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_ID - + " and " - + IPCCDataExportTimeSeries.GEZ_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.GEZ_COLUMN_ID + String categoryInitial = rs.getString(1); + String categoryFinal = rs.getString(2); + String subdivInitial = rs.getString(3); + String subdivFinal = rs.getString(4); - + " ORDER BY "+ IPCCDataExportTimeSeries.PLOT_ID + " DESC"; // Remove trailing comma from list of years + return new LUDataPerYear( + LandUseSubdivisionUtils.getSubdivision(categoryInitial, subdivInitial), + LandUseSubdivisionUtils.getSubdivision(categoryFinal, subdivFinal), + rs.getDouble(5) // area + ); + } + }; + } - List luData = getJdbcTemplate().query( - sqlSelect - , - getRowMapper() - ); + protected static LUDataPerYear findLuData( LandUseSubdivision initialSubdivision, LandUseSubdivision finalSubdivision, List luData ) { + Collection result = CollectionUtils.select(luData, new Predicate() { + public boolean evaluate(Object a) { + return + ( (LUDataPerYear) a ).getLu().equals(initialSubdivision) + && + ( (LUDataPerYear) a ).getLuNextYear().equals(finalSubdivision); + } + }); + if( result.size() == 1 ) + return (LUDataPerYear) result.toArray(new LUDataPerYear[result.size()])[0]; + else + return new LUDataPerYear(initialSubdivision, finalSubdivision, 0); - selectedYears+= "area"; // so the area columns appears too - luData.add( 0, selectedYears.split(",") ); - return luData; + } + + private File createExcel( List matrixData ) throws IOException { + File excelDestination = File.createTempFile("LuMatrixTimeseries", ".xls"); + excelDestination.deleteOnExit(); + // Create a Workbook + try (Workbook workbook = new HSSFWorkbook() ){ + /* CreationHelper helps us create instances of various things like DataFormat, + Hyperlink, RichTextString etc, in a format (HSSF, XSSF) independent way */ + //CreationHelper createHelper = workbook.getCreationHelper(); + + // Create a Font for styling header cells + Font cornerFont = workbook.createFont(); + cornerFont.setBold(true); + cornerFont.setFontHeightInPoints((short) 15); + cornerFont.setColor(IndexedColors.GREY_80_PERCENT.getIndex()); + // Create a CellStyle with the font + CellStyle cornerCellStyle = workbook.createCellStyle(); + cornerCellStyle.setFont(cornerFont); + + // Create a Font for styling header cells + Font headerFont = workbook.createFont(); + headerFont.setBold(true); + headerFont.setFontHeightInPoints((short) 14); + headerFont.setColor(IndexedColors.DARK_TEAL.getIndex()); + // Create a CellStyle with the font + CellStyle headerCellStyle = workbook.createCellStyle(); + headerCellStyle.setFont(headerFont); + + // Create a Font for styling non-diagonal cells + Font stdFont = workbook.createFont(); + stdFont.setBold(false); + stdFont.setFontHeightInPoints((short) 14); + stdFont.setColor(IndexedColors.DARK_RED.getIndex()); + // Create a CellStyle with the font + CellStyle stdCellStyle = workbook.createCellStyle(); + stdCellStyle.setFont(stdFont); + + // Create a Font for styling non-diagonal cells + Font diagonalFont = workbook.createFont(); + diagonalFont.setBold(true); + diagonalFont.setFontHeightInPoints((short) 14); + diagonalFont.setColor(IndexedColors.DARK_GREEN.getIndex()); + // Create a CellStyle with the font + CellStyle diagonalCellStyle = workbook.createCellStyle(); + diagonalCellStyle.setFont(diagonalFont); + + for (MatrixSheet matrix : matrixData) { + // Create a Sheet + Sheet sheet = workbook.createSheet("LU Matrix " + matrix.getYearData().getYear() + "-" + (matrix.getYearData().getYear()+1 ) ); + + // Create a Row + Row headerRow = sheet.createRow(0); + Cell cell = headerRow.createCell(0); + cell.setCellValue( "Transition " + matrix.getYearData().getYear() + "/" + ( matrix.getYearData().getYear() +1 ) ); + cell.setCellStyle(cornerCellStyle); + + int i = 1; + for (LandUseSubdivision subdivision : matrix.getSubdivisions()) { + cell = headerRow.createCell(i++); + cell.setCellValue(subdivision.toString()); + cell.setCellStyle(headerCellStyle); + } + + + int rowNum = 1; + int colNum = 0; + for (LandUseSubdivision subdivisionH : matrix.getSubdivisions()) { + colNum = 0; + Row row = sheet.createRow(rowNum++); + + Cell columnCell = row.createCell(colNum++); + columnCell.setCellStyle(headerCellStyle); + columnCell.setCellValue(subdivisionH.toString()); + + colNum = 1; + for (LandUseSubdivision subdivisionV : matrix.getSubdivisions()) { + + cell = row.createCell(colNum++); + cell.setCellValue( findLuData( subdivisionH, subdivisionV, matrix.getYearData().getLuData() ).getAreaHa() ); + if( subdivisionH.equals( subdivisionV ) ) { + cell.setCellStyle(diagonalCellStyle); + }else { + cell.setCellStyle(stdCellStyle); + } + } + + } + + // Resize all columns to fit the content size + for(int j = 0; j < colNum; j++) { + sheet.autoSizeColumn(j); + } + + } + + // Write the output to a file + try( FileOutputStream fileOut = new FileOutputStream(excelDestination) ){ + workbook.write(fileOut); + } catch (IOException e) { + logger.error("Error generating Excel file", e); + } + } catch (Exception e) { + logger.error("Error generating Excel data", e); + } + return excelDestination; } } From ddbee2f0907d62924e5066c220440c887d1d1443 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:55 +0100 Subject: [PATCH 0362/1620] New translations IPCCDataExportMatrixExtendedExcel.java (French) --- .../earth/app/view/Messages_fr.properties | 442 +++++++++--------- 1 file changed, 209 insertions(+), 233 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index e15ddb90b9..c15098bfaa 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,233 +1,209 @@ -package org.openforis.collect.earth.app.view; - -import java.awt.Color; -import java.awt.Component; -import java.awt.event.MouseEvent; -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.JOptionPane; -import javax.swing.JTable; -import javax.swing.table.DefaultTableModel; -import javax.swing.table.TableCellRenderer; - -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult; -import org.openforis.collect.io.metadata.collectearth.CSVRowValidationResult; -import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; -import org.openforis.collect.manager.validation.SurveyValidator.ValidationParameters; -import org.openforis.collect.model.CollectSurvey; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.opencsv.CSVReader; - -/** - * Swing JTable used in the OptionWizard dialog. - * It contains methods to refresh the information loaded on the cells. - * @author Alfonso Sanchez-Paus Diaz - * - */ -public class JPlotCsvTable extends JTable{ - - private static final Color WARNING_BG_COLOR = new Color(254, 255, 196); - private static final Color ERROR_BG_COLOR = new Color(218, 152, 152); - private static final long serialVersionUID = 3456854921119125693L; - private static final int LIMIT_LOADED_CSV_LINES = 400; - private final transient Logger logger = LoggerFactory.getLogger(this.getClass()); - private transient CollectSurvey forSurvey; - private transient CSVFileValidationResult validationResults; - - - /** - * Build a new JTable that contains the data from the CSV that is set as the file that contains the plots used by Collect Earth - * @param pathToCsvWithPlots Path to the file containing the plot locations that should be loaded in the table - * @param forSurvey Survey that the csv file belongs to - */ - public JPlotCsvTable(String pathToCsvWithPlots, CollectSurvey forSurvey) { - super(); - this.forSurvey = forSurvey; - - try { - refreshTable(pathToCsvWithPlots); - } catch (Exception e) { - logger.error("Error loading plot file"); - this.setBackground(Color.RED); - this.setToolTipText("The file chosen does not contain plot information"); - - } - } - - /** - * The data of the CSV file is validated when the CSV/CED is loaded. This method determines if the data currently loaded is valid or not - * @return True if the data is valid. False otherwise - */ - public boolean isDataValid(){ - return validationResults==null?true:validationResults.isSuccessful(); - } - - - @Override - public Component prepareRenderer(TableCellRenderer renderer, int row, int col) { - Component comp = super.prepareRenderer(renderer, row, col); - - if ( cellHasError(row,col)){ - comp.setBackground( ERROR_BG_COLOR ); - }else{ - comp.setBackground(Color.WHITE); - } - - return comp; - } - - @Override - public String getToolTipText(MouseEvent event) { - String tip = null; - java.awt.Point p = event.getPoint(); - int row = rowAtPoint(p); - int col = columnAtPoint(p); - - try { - tip = getCellErrorMessage(row, col); - } catch (RuntimeException e1) { - //catch null pointer exception if mouse is over an empty line - } - - return tip; - - } - - private boolean cellHasError(Integer row, Integer col) { - String errorMessage = getCellErrorMessage(row, col); - return errorMessage!=null; - } - - private String getCellErrorMessage(Integer row, Integer col) { - if( validationResults != null ){ - List rowValidations = validationResults.getRowValidations(); - for (CSVRowValidationResult csvRowValidationResult : rowValidations) { - if( csvRowValidationResult.getRowNumber().equals(row+1) && csvRowValidationResult.getColumnPosition().equals( col ) ){ - return csvRowValidationResult.getMessage(); - } - } - } - return null; - } - - /** - * Refreshes the data loaded in the table. Used when the user changes the file that contains the CSV file using the OptionWizard dialog. - * @param csvFilePath The path to the CSV file that contains the plot locations - */ - public void refreshTable(String csvFilePath) { - - if( csvFilePath.trim().length() == 0 ) - return; - - this.removeAll(); - boolean errorLoading = false; - final File csvFile = new File(csvFilePath); - - if (csvFile.exists()) { - DefaultTableModel newTableModel = getPlotTableModel( csvFilePath ); - - validateCsvFile(csvFilePath); - - if (newTableModel.getRowCount() == 0) { - errorLoading = true; - } else { - this.setModel(newTableModel); - } - } else { - errorLoading = true; - } - - if (errorLoading) { - this.setBackground(CollectEarthWindow.ERROR_COLOR); - this.setModel(new DefaultTableModel()); - } - } - - private String[] getColumnNames() { - // Check if the first line is actually a header. Possible if the first header column coincides with ID, PLOT_ID or PLOT - CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); - return cegtg.getExpectedHeaders( forSurvey ).toArray( new String[]{} ); - - } - - private DefaultTableModel getPlotTableModel(String csvFilePath) { - - String[][] allValues = new String[0][0]; - - try ( CSVReader reader = CsvReaderUtils.getCsvReader(csvFilePath) ){ - String[] line; - List allLines = new ArrayList<>(); - int i =0; - while( ( line = reader.readNext() ) != null && i< LIMIT_LOADED_CSV_LINES ) { // we do this to avoid out of memory errors - i++; - allLines.add( line ); - } - - allValues = allLines.toArray(new String[][] {}); - } catch (Exception e) { - logger.error(" Error reading the CSV file " + csvFilePath, e); - } - - return new DefaultTableModel( allValues , getColumnNames()); - } - - protected void validateCsvFile(String csvFilePath) { - - CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); - ValidationParameters validationParameters = new ValidationParameters(); - validationParameters.setValidateOnlyFirstLines( false ); - CSVFileValidationResult validation = cegtg.validate( new File(csvFilePath), forSurvey, validationParameters); - - this.setBackground( Color.white ); - - - if( !validation.isSuccessful() ){ - switch ( validation.getErrorType() ) { - case INVALID_FILE_TYPE: - case INVALID_NUMBER_OF_COLUMNS: - JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); - JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The expected file type is CSV or CED ", "Expected File Type", JOptionPane.ERROR_MESSAGE); - break; - - case INVALID_HEADERS: - JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); - JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The expected columns in the CSV are " + validation.getExpectedHeaders(), "Columns in CSV do not match survey", JOptionPane.ERROR_MESSAGE); - validation = null; // not bad enough to stop the user from loading the CSV file - break; - case INVALID_NUMBER_OF_PLOTS_TOO_LARGE: - JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); - JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "Using CSV files that are too large makes Google Earth extremely slow.\nPlease divide this CSV file into smaller file (reccomended less than 2000 plots per CSV file.\nNumber of plots in this file : " + validation.getNumberOfRows() , "File too large", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - validation = null; // not bad enough to stop the user from loading the CSV file - break; - - case INVALID_NUMBER_OF_PLOTS_WARNING: - JPlotCsvTable.this.setBackground( WARNING_BG_COLOR); - JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "Using CSV files that are too large makes Google Earth slow.\n Please divide this CSV file into smaller file (reccomended size is less than 2000 plots per CSV file.\nNumber of plots in this file : " + validation.getNumberOfRows() , "File too large", JOptionPane.WARNING_MESSAGE); //$NON-NLS-1$ - validation = null; // not bad enough to stop the user from loading the CSV file - break; - - case INVALID_VALUES_IN_CSV: - // IN THIS CASE THE CELL RENDERER TAKES CARE OF HIGHLIGHTING THE CELLS!!! - JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The content of the CSV file is not correct!! The values on the cells highlighted are incorrect " , "CSV content is not correct", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - break; - - default: - break; - } - } - - - this.setValidationResults( validation ); - } - - - private void setValidationResults(CSVFileValidationResult validationResults) { - this.validationResults = validationResults; - } - -} +package org.openforis.collect.earth.ipcc; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.Font; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +@Component +public class IPCCDataExportMatrixExtendedExcel extends IPCCDataExportTimeSeries { + + Logger logger = LoggerFactory.getLogger(IPCCDataExportMatrixExtendedExcel.class); + + public IPCCDataExportMatrixExtendedExcel() { + super(); + setExportTypeUsed(ExportType.IPCC); + } + + @Override + protected File generateFile(List strataData) throws IOException { + File excelDestination = File.createTempFile("LuMatrixTimeseries_EXTENDED", ".xls"); + excelDestination.deleteOnExit(); + // Create a Workbook + try(Workbook workbook = new HSSFWorkbook() ) {// new HSSFWorkbook() for generating `.xls` file + + /* + * CreationHelper helps us create instances of various things like DataFormat, + * Hyperlink, RichTextString etc, in a format (HSSF, XSSF) independent way + */ + // CreationHelper createHelper = workbook.getCreationHelper(); + + // Create a Font for styling header cells + Font cornerFont = workbook.createFont(); + cornerFont.setBold(true); + cornerFont.setFontHeightInPoints((short) 15); + cornerFont.setColor(IndexedColors.GREY_80_PERCENT.getIndex()); + // Create a CellStyle with the font + CellStyle cornerCellStyle = workbook.createCellStyle(); + cornerCellStyle.setFont(cornerFont); + + // Create a Font for styling header cells + Font headerFont = workbook.createFont(); + headerFont.setBold(true); + headerFont.setFontHeightInPoints((short) 14); + headerFont.setColor(IndexedColors.DARK_TEAL.getIndex()); + // Create a CellStyle with the font + CellStyle headerCellStyle = workbook.createCellStyle(); + headerCellStyle.setFont(headerFont); + + // Create a Font for styling non-diagonal cells + Font stdFont = workbook.createFont(); + stdFont.setBold(false); + stdFont.setFontHeightInPoints((short) 14); + stdFont.setColor(IndexedColors.DARK_RED.getIndex()); + // Create a CellStyle with the font + CellStyle stdCellStyle = workbook.createCellStyle(); + stdCellStyle.setFont(stdFont); + + // Create a Font for styling diagonal cells + Font diagonalFont = workbook.createFont(); + diagonalFont.setBold(true); + diagonalFont.setFontHeightInPoints((short) 14); + diagonalFont.setColor(IndexedColors.DARK_GREEN.getIndex()); + // Create a CellStyle with the font + CellStyle diagonalCellStyle = workbook.createCellStyle(); + diagonalCellStyle.setFont(diagonalFont); + + // Create a Font for styling diagonal cells + Font strataFont = workbook.createFont(); + strataFont.setBold(true); + strataFont.setFontHeightInPoints((short) 16); + strataFont.setColor(IndexedColors.BLUE.getIndex()); + // Create a CellStyle with the font + CellStyle strataCellStyle = workbook.createCellStyle(); + strataCellStyle.setFont(strataFont); + + List availableYears = new ArrayList(); + for (StratumPerYearData yearDataStratumP : strataData) { + if (!availableYears.contains(Integer.valueOf(yearDataStratumP.getYear()))) { + availableYears.add(yearDataStratumP.getYear()); + } + } + + for (Integer yearToOutput : availableYears) { + + int rowNum = 0; + // Create a Sheet + Sheet sheet = workbook.createSheet("LU Matrix " + yearToOutput + "-" + (yearToOutput + 1)); + + for (StratumPerYearData yearDataStratum : strataData) { + // Get the stratums for the year + if (yearDataStratum.getYear() != yearToOutput) { + continue; // The stratum contains data for a different year that we are going to output in + // the sheet + } + + + sheet.createRow(rowNum++); // create empty row + + // Create a Row + Row infoRow = sheet.createRow(rowNum++); + Cell cell = infoRow.createCell(0); + cell.setCellStyle(headerCellStyle); + cell.setCellValue("Climate"); + cell = infoRow.createCell(1); + cell.setCellStyle(strataCellStyle); + cell.setCellValue(yearDataStratum.getClimate()); + + infoRow = sheet.createRow(rowNum++); + cell = infoRow.createCell(0); + cell.setCellStyle(headerCellStyle); + cell.setCellValue("Soil"); + cell = infoRow.createCell(1); + cell.setCellStyle(strataCellStyle); + cell.setCellValue(yearDataStratum.getSoil()); + + infoRow = sheet.createRow(rowNum++); + cell = infoRow.createCell(0); + cell.setCellStyle(headerCellStyle); + cell.setCellValue("Global Ecological Zone (GEZ)"); + cell = infoRow.createCell(1); + cell.setCellStyle(strataCellStyle); + cell.setCellValue(yearDataStratum.getGez()); + + // Add some empty rows before next section + sheet.createRow(rowNum++); + + // Create a Row + Row headerRow = sheet.createRow(rowNum++); + cell = headerRow.createCell(0); + cell.setCellValue( + "Transition " + yearDataStratum.getYear() + "/" + (yearDataStratum.getYear() + 1)); + cell.setCellStyle(cornerCellStyle); + + MatrixSheet matrix = new MatrixSheet(yearDataStratum); + int cellPosition = 1; + for (LandUseSubdivision subdivision : matrix.getSubdivisions()) { + cell = headerRow.createCell(cellPosition++); + cell.setCellValue(subdivision.toString()); + cell.setCellStyle(headerCellStyle); + } + + int colNum = 0; + for (LandUseSubdivision subdivisionH : matrix.getSubdivisions()) { + colNum = 0; + Row row = sheet.createRow(rowNum++); + + Cell columnCell = row.createCell(colNum++); + columnCell.setCellStyle(headerCellStyle); + columnCell.setCellValue(subdivisionH.toString()); + + colNum = 1; + for (LandUseSubdivision subdivisionV : matrix.getSubdivisions()) { + + cell = row.createCell(colNum++); + cell.setCellValue(IPCCDataExportMatrixExcel + .findLuData(subdivisionH, subdivisionV, matrix.getYearData().getLuData()) + .getAreaHa()); + if (subdivisionH.equals(subdivisionV)) { + cell.setCellStyle(diagonalCellStyle); + } else { + cell.setCellStyle(stdCellStyle); + } + } + + } + + // Add some empty rows before next section + sheet.createRow(rowNum++); + sheet.createRow(rowNum++); + sheet.createRow(rowNum++); + + + // Resize all columns to fit the content size + for (int j = 0; j < colNum; j++) { + sheet.autoSizeColumn(j); + } + + } + + } + + // Write the output to a file + try (FileOutputStream fileOut = new FileOutputStream(excelDestination)) { + workbook.write(fileOut); + } catch (IOException e) { + logger.error("Error generating Excel file", e); + } + } catch (Exception e) { + logger.error("Error generating Excel data", e); + } + return excelDestination; + } + +} From 167f7110857955d94d5894327eed0333629c9c6f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:56 +0100 Subject: [PATCH 0363/1620] New translations IPCCDataExportMatrixExtendedExcel.java (Spanish) --- .../earth/app/view/Messages_es.properties | 1418 +++-------------- 1 file changed, 209 insertions(+), 1209 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 7eb0424502..c15098bfaa 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,1209 +1,209 @@ -package org.openforis.collect.earth.app.view; - -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Component; -import java.awt.Container; -import java.awt.Dimension; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.GridLayout; -import java.awt.Insets; -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; -import java.io.IOException; -import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; - -import javax.swing.AbstractAction; -import javax.swing.AbstractButton; -import javax.swing.ButtonGroup; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JComponent; -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JList; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JPasswordField; -import javax.swing.JRadioButton; -import javax.swing.JScrollPane; -import javax.swing.JTabbedPane; -import javax.swing.JTextField; -import javax.swing.ListSelectionModel; -import javax.swing.ScrollPaneConstants; -import javax.swing.border.BevelBorder; -import javax.swing.border.Border; -import javax.swing.border.TitledBorder; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; - -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; -import org.openforis.collect.earth.app.EarthConstants.OperationMode; -import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.AnalysisSaikuService; -import org.openforis.collect.earth.app.service.EarthProjectsService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; -import org.openforis.collect.model.CollectSurvey; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ -public class PropertiesDialog extends JDialog { - - private static final ComboBoxItem COMBO_BOX_ITEM_CENTRAL_POINT = new ComboBoxItem(1, - Messages.getString("OptionWizard.54")); - - private static final ComboBoxItem COMBO_BOX_ITEM_SQUARE = new ComboBoxItem(0, - Messages.getString("OptionWizard.53")); - - private static final long serialVersionUID = -6760020609229102842L; - - private final HashMap, JComponent[]> propertyToComponent = new HashMap<>(); - private final transient Logger logger = LoggerFactory.getLogger(this.getClass()); - - JPanel postgresPanel; - JPanel sqlitePanel; - - private transient LocalPropertiesService localPropertiesService; - - String backupFolder; - - private transient AnalysisSaikuService saikuService; - - private transient EarthProjectsService projectsService; - - private boolean restartRequired; - - private String oldSelectedDistance; - - private CollectSurvey surveyLoaded; - - private JButton applyChanges; - - public PropertiesDialog(JFrame frame, LocalPropertiesService localPropertiesService, - EarthProjectsService projectsService, String backupFolder, AnalysisSaikuService saikuService, - CollectSurvey surveyLoaded) { - super(frame, Messages.getString("OptionWizard.0")); //$NON-NLS-1$ - this.localPropertiesService = localPropertiesService; - this.projectsService = projectsService; - this.backupFolder = backupFolder; - this.saikuService = saikuService; - this.surveyLoaded = surveyLoaded; - this.setLocationRelativeTo(null); - this.setSize(new Dimension(600, 620)); - this.setModal(true); - this.setResizable(false); - initilizeInputs(); - buildMainPane(); - centreWindow(); - - } - - private void centreWindow() { - Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize(); - int x = (int) ((dimension.getWidth() - getWidth()) / 2); - int y = (int) ((dimension.getHeight() - getHeight()) / 2); - setLocation(x, y); - } - - private void buildMainPane() { - - final JPanel panel = new JPanel(new BorderLayout()); - panel.add(getOptionTabs(), BorderLayout.CENTER); - final JPanel buttonPanel = new JPanel(); - buttonPanel.add(getApplyChangesButton()); - buttonPanel.add(getCancelButton()); - panel.add(buttonPanel, BorderLayout.PAGE_END); - this.add(panel); - - } - - private void enableContainer(Container container, boolean enable) { - final Component[] components = container.getComponents(); - for (final Component component : components) { - component.setEnabled(enable); - if (component instanceof Container) { - enableContainer((Container) component, enable); - } - } - } - - private JComponent getBrowsersOptionsPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - final JPanel browserChooserPanel = new JPanel(); - final Border browserBorder = new TitledBorder(new BevelBorder(BevelBorder.LOWERED), - Messages.getString("OptionWizard.1")); //$NON-NLS-1$ - browserChooserPanel.setBorder(browserBorder); - GridLayout experimentLayout = new GridLayout(0,1); - browserChooserPanel.setLayout( experimentLayout ); - - final ButtonGroup browserChooser = new ButtonGroup(); - final JComponent[] browsers = propertyToComponent.get(EarthProperty.BROWSER_TO_USE); - - for (final JComponent browserRadioButton : browsers) { - browserChooserPanel.add(browserRadioButton); - browserChooser.add((AbstractButton) browserRadioButton); - - ((JRadioButton) browserRadioButton).addActionListener(e -> setRestartRequired(true)); - } - constraints.gridy++; - panel.add(browserChooserPanel, constraints); - - constraints.gridy++; - constraints.gridx = 0; - panel.add(propertyToComponent.get(EarthProperty.SAIKU_SERVER_FOLDER)[0], constraints); - - return panel; - } - - private JComponent getIntegrationsPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - panel.add(propertyToComponent.get(EarthProperty.OPEN_GEE_APP)[0], constraints); - - constraints.gridy++; - panel.add(propertyToComponent.get(EarthProperty.OPEN_BING_MAPS)[0], constraints); - - constraints.gridy++; - panel.add(propertyToComponent.get(EarthProperty.OPEN_EARTH_MAP)[0], constraints); - - - constraints.gridy++; - constraints.gridwidth = 1; - panel.add(propertyToComponent.get(EarthProperty.OPEN_PLANET_MAPS)[0], constraints); - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.PLANET_MAPS_MONHLY)[0], constraints); - - constraints.gridy++; - constraints.gridx = 0; - constraints.gridwidth = 1; - final JLabel label = new JLabel(Messages.getString("OptionWizard.101")); //$NON-NLS-1$ - panel.add(label, constraints); - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.PLANET_MAPS_KEY)[0], constraints); - - constraints.gridx = 0; - constraints.gridy++; - constraints.gridwidth = 2; - panel.add(propertyToComponent.get(EarthProperty.OPEN_MAXAR_SECUREWATCH)[0], constraints); - - constraints.gridy++; - constraints.gridwidth = 1; - final JLabel labelMaxar = new JLabel(Messages.getString("OptionWizard.1021")); //$NON-NLS-1$ - panel.add(labelMaxar, constraints); - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.MAXAR_SECUREWATCH_URL)[0], constraints); - - constraints.gridx = 0; - constraints.gridy++; - constraints.gridwidth = 2; - panel.add(propertyToComponent.get(EarthProperty.OPEN_YANDEX_MAPS)[0], constraints); - - constraints.gridy++; - panel.add(propertyToComponent.get(EarthProperty.OPEN_BAIDU_MAPS)[0], constraints); - - constraints.gridy++; - final JLabel label2 = new JLabel(Messages.getString("OptionWizard.103")); //$NON-NLS-1$ - panel.add(label2, constraints); - constraints.gridy++; - panel.add(propertyToComponent.get(EarthProperty.EXTRA_MAP_URL)[0], constraints); - - constraints.gridy++; - constraints.gridx = 0; - constraints.gridwidth = 2; - panel.add(propertyToComponent.get(EarthProperty.OPEN_GEE_CODE_EDITOR)[0], constraints); - - - return panel; - } - - - private Component getApplyChangesButton() { - if (applyChanges == null) { - applyChanges = new JButton(Messages.getString("OptionWizard.15")); - applyChanges.addActionListener( - new ApplyOptionChangesListener(this, localPropertiesService, propertyToComponent) { - @Override - protected void applyProperties() { - new Thread("Applying properties dialog") { - @Override - public void run() { - savePropertyValues(); - if (isRestartRequired()) { - - restartEarth(); - } else { - EarthApp.executeKmlLoadAsynchronously(PropertiesDialog.this); - } - } - }.start(); - } - }); - } - return applyChanges; - } - - public void closeDialog() { - this.dispose(); - } - - private Component getCancelButton() { - final JButton cancelButton = new JButton(Messages.getString("OptionWizard.24")); //$NON-NLS-1$ - cancelButton.addActionListener( e -> PropertiesDialog.this.dispose() ); - return cancelButton; - } - - private JComponent getOperationModePanel() { - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - final JPanel typeOfUsePanel = new JPanel(new GridBagLayout()); - final Border border = new TitledBorder(new BevelBorder(BevelBorder.LOWERED), - Messages.getString("OptionWizard.2")); //$NON-NLS-1$ - typeOfUsePanel.setBorder(border); - - JPanel serverPanel = getServerPanel(); - typeOfUsePanel.add(serverPanel, constraints); - - return typeOfUsePanel; - } - - private void enableDBOptions(boolean isPostgreDb) { - enableContainer(postgresPanel, isPostgreDb); - enableContainer(sqlitePanel, !isPostgreDb); - } - - private ActionListener getDbTypeListener() { - return e -> { - final JRadioButton theJRB = (JRadioButton) e.getSource(); - - boolean isPostgreDb = theJRB.getName().equals(CollectDBDriver.POSTGRESQL.name()); - enableDBOptions(isPostgreDb); - }; - } - - private JTabbedPane getOptionTabs() { - final JTabbedPane tabbedPane = new JTabbedPane(); - tabbedPane.setSize(550, 300); - final JComponent panel1 = getSampleDataPanel(); - tabbedPane.addTab(Messages.getString("OptionWizard.31"), panel1); //$NON-NLS-1$ - - final JComponent panel2 = getPlotOptionsPanel(); - tabbedPane.addTab(Messages.getString("OptionWizard.32"), panel2); //$NON-NLS-1$ - - final JComponent panel3 = getSurveyDefinitonPanel(); - tabbedPane.addTab(Messages.getString("OptionWizard.33"), panel3); //$NON-NLS-1$ - - final JComponent panel41 = getIntegrationsPanel(); - tabbedPane.addTab(Messages.getString("OptionWizard.34"), panel41); //$NON-NLS-1$ - - final JComponent panel4 = getBrowsersOptionsPanel(); - tabbedPane.addTab(Messages.getString("OptionWizard.104"), panel4); //$NON-NLS-1$ - - final JComponent panel5 = getOperationModePanelScroll(); - tabbedPane.addTab(Messages.getString("OptionWizard.25"), panel5); //$NON-NLS-1$ - - final JComponent panel6 = getProjectsPanelScroll(); - tabbedPane.addTab(Messages.getString("OptionWizard.40"), panel6); //$NON-NLS-1$ - - return tabbedPane; - } - - private JComponent getProjectsPanelScroll() { - final JComponent projectsPanel = getProjectsPanel(); - return new JScrollPane(projectsPanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); - } - - private JComponent getProjectsPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.fill = GridBagConstraints.BOTH; - - JButton importNewButton = new JButton(Messages.getString("OptionWizard.41")); //$NON-NLS-1$ - importNewButton.addActionListener(new ApplyOptionChangesListener(this, localPropertiesService) { - - @Override - protected void applyProperties() { - final File[] selectedProjectFile = JFileChooserExistsAware.getFileChooserResults( - DataFormat.PROJECT_DEFINITION_FILE, false, false, null, localPropertiesService, - (JFrame) PropertiesDialog.this.getParent()); - - if (selectedProjectFile != null && selectedProjectFile.length == 1) { - try { - projectsService.loadCompressedProjectFile(selectedProjectFile[0]); - restartEarth(); - } catch (Exception e1) { - JOptionPane.showMessageDialog(PropertiesDialog.this, e1.getMessage(), - Messages.getString("OptionWizard.51"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - logger.error("Error importing project file " + selectedProjectFile[0].getAbsolutePath(), e1); //$NON-NLS-1$ - } - - } - } - }); - - panel.add(importNewButton, constraints); - - final JPanel typeOfDbPanel = new JPanel(new GridBagLayout()); - final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), - Messages.getString("OptionWizard.57")); //$NON-NLS-1$ - typeOfDbPanel.setBorder(border); - - constraints.gridx = 0; - constraints.gridy = 1; - panel.add(typeOfDbPanel, constraints); - - List listOfProjectsByName = new ArrayList<>(); - listOfProjectsByName.addAll(projectsService.getProjectList().keySet()); - Collections.sort(listOfProjectsByName); - final JList listOfProjects = new JList<>(listOfProjectsByName.toArray(new String[0])); // data has type Object[] - listOfProjects.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - listOfProjects.setLayoutOrientation(JList.VERTICAL); - listOfProjects.setVisibleRowCount(-1); - - JScrollPane listScroller = new JScrollPane(listOfProjects); - listScroller.setPreferredSize(new Dimension(250, 300)); - - constraints.gridy = 0; - constraints.gridx = GridBagConstraints.RELATIVE; - typeOfDbPanel.add(listScroller, constraints); - - final JButton openProject = new JButton(Messages.getString("OptionWizard.56")); //$NON-NLS-1$ - openProject.setEnabled(false); - openProject.addActionListener(new ApplyOptionChangesListener(this, localPropertiesService) { - - @Override - protected void applyProperties() { - - File projectFolder = projectsService.getProjectList().get(listOfProjects.getSelectedValue()); - - try { - projectsService.loadProjectInFolder(projectFolder); - restartEarth(); - } catch (Exception e1) { - JOptionPane.showMessageDialog(PropertiesDialog.this, e1.getMessage(), - Messages.getString("OptionWizard.55"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - logger.error("Error importing project folder " + projectFolder.getAbsolutePath(), e1); //$NON-NLS-1$ - } - - } - - }); - - listOfProjects.addListSelectionListener(e -> openProject.setEnabled(listOfProjects.getSelectedValue() != null) ); - - typeOfDbPanel.add(openProject); - - return panel; - } - - private JScrollPane getOperationModePanelScroll() { - final JComponent operationModePanel = getOperationModePanel(); - return new JScrollPane(operationModePanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); - } - - private JComponent getPlotOptionsPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.fill = GridBagConstraints.HORIZONTAL; - - JLabel label = new JLabel("Plot shape"); - panel.add(label, constraints); - - constraints.gridx = 1; - JComboBox plotShape = (JComboBox) propertyToComponent.get(EarthProperty.SAMPLE_SHAPE)[0]; - panel.add(plotShape, constraints); - - constraints.gridx = 0; - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.35")); //$NON-NLS-1$ - panel.add(label, constraints); - - constraints.gridx = 1; - JComboBox numberPoints = (JComboBox) propertyToComponent - .get(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT)[0]; - panel.add(numberPoints, constraints); - - constraints.gridx = 0; - constraints.gridy++; - JLabel distanceOrRadiuslabel = new JLabel(Messages.getString("OptionWizard.36")); //$NON-NLS-1$ - panel.add(distanceOrRadiuslabel, constraints); - - constraints.gridx = 1; - JComboBox distanceBetweenPoints = (JComboBox) propertyToComponent - .get(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS)[0]; - panel.add(new JScrollPane(distanceBetweenPoints), constraints); - - constraints.gridx = 0; - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.37")); //$NON-NLS-1$ - panel.add(label, constraints); - constraints.gridx = 1; - JComboBox distanceToFrame = (JComboBox) propertyToComponent - .get(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES)[0]; - panel.add(new JScrollPane(distanceToFrame), constraints); - - constraints.gridx = 0; - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.95")); //$NON-NLS-1$ - panel.add(label, constraints); - constraints.gridx = 1; - JComboBox dotsSide = (JComboBox) propertyToComponent.get(EarthProperty.INNER_SUBPLOT_SIDE)[0]; - panel.add(new JScrollPane(dotsSide), constraints); - - constraints.gridx = 0; - constraints.gridy++; - label = new JLabel("Central plot side"); //$NON-NLS-1$ - panel.add(label, constraints); - constraints.gridx = 1; - JComboBox largeCentralPlotSide = (JComboBox) propertyToComponent.get(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)[0]; - panel.add(new JScrollPane(largeCentralPlotSide), constraints); - - - - constraints.gridx = 0; - constraints.gridy++; - label = new JLabel("Distance between plots in cluster"); - panel.add(label, constraints); - constraints.gridx = 1; - JComboBox plotDistanceInCluster = (JComboBox) propertyToComponent - .get(EarthProperty.DISTANCE_BETWEEN_PLOTS)[0]; - panel.add(new JScrollPane(plotDistanceInCluster), constraints); - - constraints.gridx = 0; - constraints.gridy++; - JLabel area = new JLabel( - "Area (hectares) : " + calculateArea(numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide)); - panel.add(area, constraints); - - ActionListener calculateAreas = actionPerformed -> area.setText("Area (hectares) : " + calculateArea(numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide)); - - plotShape.addActionListener( e-> - handleVisibilityPlotLayout(plotShape, numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide, - plotDistanceInCluster, area, distanceOrRadiuslabel, largeCentralPlotSide) - ); - - numberPoints.addActionListener(calculateAreas); - distanceBetweenPoints.addActionListener(calculateAreas); - distanceToFrame.addActionListener(calculateAreas); - - handleVisibilityPlotLayout(plotShape, numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide, - plotDistanceInCluster, area, distanceOrRadiuslabel, largeCentralPlotSide); - - return panel; - } - - public void handleVisibilityPlotLayout(JComboBox plotShape, JComboBox numberPoints, JComboBox distanceBetweenPoints, - JComboBox distanceToFrame, JComboBox dotsSide, JComboBox distanceBetweenPlots, JLabel area, - JLabel distanceOrRadiuslabel, JComboBox largeCentralPlotSide ) { - numberPoints.setEnabled(false); - distanceBetweenPoints.setEnabled(false); - distanceToFrame.setEnabled(false); - dotsSide.setEnabled(false); - area.setVisible(false); - distanceBetweenPlots.setVisible(false); - distanceBetweenPlots.setEnabled(false); - largeCentralPlotSide.setVisible( false ); - largeCentralPlotSide.setEnabled(false); - - if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE) || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE_WITH_LARGE_CENTRAL_PLOT) ) { - numberPoints.setEnabled(true); - distanceBetweenPoints.setEnabled(true); - distanceToFrame.setEnabled(true); - dotsSide.setEnabled(true); - area.setVisible(true); - distanceOrRadiuslabel.setText(Messages.getString("OptionWizard.36")); - - if( plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE_WITH_LARGE_CENTRAL_PLOT) ) { - largeCentralPlotSide.setVisible( true ); - largeCentralPlotSide.setEnabled(true); - } - - } else if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.CIRCLE) - || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.HEXAGON)) { - distanceBetweenPoints.setEnabled(true); - dotsSide.setEnabled(true); - numberPoints.setEnabled(true); - distanceOrRadiuslabel.setText("Radius"); - } else if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.NFI_THREE_CIRCLES) || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.NFI_FOUR_CIRCLES)) { - dotsSide.setEnabled(true); - distanceBetweenPoints.setEnabled(true); - distanceBetweenPlots.setVisible(true); - distanceBetweenPlots.setEnabled(true); - distanceOrRadiuslabel.setText("Radius of the plots"); - } - } - - private String calculateArea(JComboBox numberOfPoints, JComboBox distanceBetweenPoints, JComboBox distanceToFrame, JComboBox dotsSide) { - double side = 0; - try { - int numberOfPointsI = ((ComboBoxItem) numberOfPoints.getSelectedItem()).getNumberOfPoints(); - int distanceBetweenPointsI = Integer.parseInt((String) distanceBetweenPoints.getSelectedItem()); - int distanceToFrameI = Integer.parseInt((String) distanceToFrame.getSelectedItem()); - - if (numberOfPointsI == 0 || numberOfPointsI == 1) { - - side = 2d * distanceToFrameI; - if (oldSelectedDistance == null) { - oldSelectedDistance = (String) distanceBetweenPoints.getSelectedItem(); - distanceBetweenPoints.setEnabled(false); - } - distanceBetweenPoints.setSelectedItem("0"); - - if (numberOfPointsI == 0) { - dotsSide.setEnabled(false); - } else if (numberOfPointsI == 1) { - dotsSide.setEnabled(true); - } - - } else { - if (oldSelectedDistance != null) { - distanceBetweenPoints.setSelectedItem(oldSelectedDistance); - oldSelectedDistance = null; - } - - distanceBetweenPoints.setEnabled(true); - distanceToFrame.setEnabled(true); - dotsSide.setEnabled(true); - - double pointsByLines = Math.sqrt(numberOfPointsI); - side = 2d * distanceToFrameI + (pointsByLines - 1) * distanceBetweenPointsI; - - } - - } catch (RuntimeException e) { - logger.error("Error calculating area of the plot", e); - } - - DecimalFormat df = new DecimalFormat("###.##"); - return df.format(side * side / 10000d); - } - - private JPanel getPostgreSqlPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), - Messages.getString("OptionWizard.6")); //$NON-NLS-1$ - panel.setBorder(border); - - JLabel label = new JLabel(Messages.getString("OptionWizard.7")); //$NON-NLS-1$ - constraints.gridx = 0; - panel.add(label, constraints); - - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.DB_USERNAME)[0], constraints); - - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.8")); //$NON-NLS-1$ - constraints.gridx = 0; - panel.add(label, constraints); - - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.DB_PASSWORD)[0], constraints); - - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.9")); //$NON-NLS-1$ - constraints.gridx = 0; - panel.add(label, constraints); - - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.DB_NAME)[0], constraints); - - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.26")); //$NON-NLS-1$ - constraints.gridx = 0; - panel.add(label, constraints); - - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.DB_HOST)[0], constraints); - - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.29")); //$NON-NLS-1$ - constraints.gridx = 0; - panel.add(label, constraints); - - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.DB_PORT)[0], constraints); - - constraints.gridx = 2; - panel.add(new JLabel("Default: 5432"), constraints); - - constraints.gridy++; - constraints.gridx = 1; - JButton button = new JButton("Test Connection"); //$NON-NLS-1$ - button.addActionListener( e-> { - String host = ((JTextField) (propertyToComponent.get(EarthProperty.DB_HOST)[0])).getText(); - String port = ((JTextField) (propertyToComponent.get(EarthProperty.DB_PORT)[0])).getText(); - String dbName = ((JTextField) (propertyToComponent.get(EarthProperty.DB_NAME)[0])).getText(); - String username = ((JTextField) (propertyToComponent.get(EarthProperty.DB_USERNAME)[0])).getText(); - String password = ((JTextField) (propertyToComponent.get(EarthProperty.DB_PASSWORD)[0])).getText(); - - String message = CollectEarthUtils.testPostgreSQLConnection(host, port, dbName, username, password); - JOptionPane.showMessageDialog(PropertiesDialog.this.getOwner(), message, "PostgreSQL Connection test", - JOptionPane.INFORMATION_MESSAGE); - }); - panel.add(button, constraints); - - return panel; - } - - private JPanel getSqlLitePanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), - Messages.getString("OptionWizard.30")); //$NON-NLS-1$ - panel.setBorder(border); - - panel.add(propertyToComponent.get(EarthProperty.AUTOMATIC_BACKUP)[0], constraints); - constraints.gridx++; - panel.add(getOpenBackupFolderButton()); - return panel; - } - - private JComponent getSampleDataPanel() { - final JPlotCsvTable samplePlots = new JPlotCsvTable(localPropertiesService.getValue(EarthProperty.SAMPLE_FILE), - surveyLoaded); - - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.fill = GridBagConstraints.BOTH; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - - final JFilePicker refreshTableOnFileChange = getFilePickerSamplePlots(samplePlots); - - panel.add(refreshTableOnFileChange, constraints); - - samplePlots.setFillsViewportHeight(true); - constraints.gridy = 1; - - constraints.weightx = 1.0; - constraints.weighty = 1.0; - constraints.gridwidth = GridBagConstraints.REMAINDER; - constraints.gridheight = GridBagConstraints.REMAINDER; - - samplePlots.setPreferredScrollableViewportSize(samplePlots.getPreferredSize()); - - panel.add(new JScrollPane(samplePlots, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, - ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), constraints); - - return panel; - } - - private JFilePicker getFilePickerSamplePlots(final JPlotCsvTable samplePlots) { - final JFilePicker refreshTableOnFileChange = (JFilePicker) (propertyToComponent - .get(EarthProperty.SAMPLE_FILE)[0]); - refreshTableOnFileChange.addChangeListener(new DocumentListener() { - - @Override - public void changedUpdate(DocumentEvent e) { - // Do not react - } - - @Override - public void insertUpdate(DocumentEvent e) { - refreshTable(); - } - - @Override - public void removeUpdate(DocumentEvent e) { - // Do not react - } - - private void refreshTable() { - samplePlots.refreshTable(refreshTableOnFileChange.getSelectedFilePath()); - - // Do not let the user save the changes if the sample data is wrong!!! - getApplyChangesButton().setEnabled(samplePlots.isDataValid()); - } - }); - return refreshTableOnFileChange; - } - - private JPanel getServerPanel() { - - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - final JPanel typeOfDbPanel = new JPanel(new GridBagLayout()); - final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), - Messages.getString("OptionWizard.3")); //$NON-NLS-1$ - typeOfDbPanel.setBorder(border); - - JLabel label = new JLabel(Messages.getString("OptionWizard.4") + CollectEarthUtils.getComputerIp()); //$NON-NLS-1$ - typeOfDbPanel.add(label, constraints); - constraints.gridy++; - - label = new JLabel(Messages.getString("OptionWizard.5")); //$NON-NLS-1$ - constraints.gridx = 0; - typeOfDbPanel.add(label, constraints); - - constraints.gridx = 1; - typeOfDbPanel.add(propertyToComponent.get(EarthProperty.HOST_PORT_KEY)[0], constraints); - - constraints.gridwidth = GridBagConstraints.REMAINDER; - constraints.gridy++; - constraints.gridx = 0; - - final ButtonGroup bg = new ButtonGroup(); - final JComponent[] dbTypes = propertyToComponent.get(EarthProperty.DB_DRIVER); - - postgresPanel = getPostgreSqlPanel(); - sqlitePanel = getSqlLitePanel(); - - boolean usingPostgreSQL = localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.POSTGRESQL); - enableDBOptions(usingPostgreSQL); - - for (final JComponent typeRadioButton : dbTypes) { - final JRadioButton dbTypeButton = (JRadioButton) typeRadioButton; - bg.add(dbTypeButton); - typeOfDbPanel.add(dbTypeButton, constraints); - constraints.gridy++; - - dbTypeButton.addActionListener(getDbTypeListener()); - dbTypeButton.addActionListener(e -> setRestartRequired(true)); - - if (dbTypeButton.getName().equals(EarthConstants.CollectDBDriver.POSTGRESQL.name())) { - typeOfDbPanel.add(postgresPanel, constraints); - constraints.gridy++; - - } else { - typeOfDbPanel.add(sqlitePanel, constraints); - constraints.gridy++; - } - } - return typeOfDbPanel; - } - - private Component getOpenBackupFolderButton() { - - AbstractAction backupAction = new AbstractAction(Messages.getString("OptionWizard.10")) { //$NON-NLS-1$ - - private static final long serialVersionUID = 1L; - - @Override - public void actionPerformed(ActionEvent e) { - try { - - CollectEarthUtils.openFolderInExplorer(backupFolder); - - } catch (final IOException e1) { - logger.error("Error when opening the explorer window to visualize backups", e1); //$NON-NLS-1$ - } - } - - }; - - return new JButton(backupAction); - - } - - private JComponent getSurveyDefinitonPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.fill = GridBagConstraints.HORIZONTAL; - constraints.gridwidth = 2; - panel.add(propertyToComponent.get(EarthProperty.OPEN_BALLOON_IN_BROWSER)[0], constraints); - - constraints.gridy++; - constraints.gridwidth = 1; - final JLabel label = new JLabel(Messages.getString("OptionWizard.43")); //$NON-NLS-1$ - panel.add(label, constraints); - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.SURVEY_NAME)[0], constraints); - - constraints.gridy++; - constraints.gridwidth = GridBagConstraints.REMAINDER; - constraints.gridx = 0; - panel.add(propertyToComponent.get(EarthProperty.KML_TEMPLATE_KEY)[0], constraints); - - constraints.gridy++; - constraints.gridx = 0; - panel.add(propertyToComponent.get(EarthProperty.BALLOON_TEMPLATE_KEY)[0], constraints); - - constraints.gridy++; - constraints.gridx = 0; - - panel.add(propertyToComponent.get(EarthProperty.METADATA_FILE)[0], constraints); - - return panel; - } - - private void initilizeInputs() { - - final JCheckBox backupCheckbox = new JCheckBox(Messages.getString("OptionWizard.44")); //$NON-NLS-1$ - backupCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.AUTOMATIC_BACKUP))); - propertyToComponent.put(EarthProperty.AUTOMATIC_BACKUP, new JComponent[] { backupCheckbox }); - - final JCheckBox openEarthEngineCheckbox = new JCheckBox(Messages.getString("OptionWizard.45")); //$NON-NLS-1$ - openEarthEngineCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_EXPLORER))); - propertyToComponent.put(EarthProperty.OPEN_GEE_EXPLORER, new JComponent[] { openEarthEngineCheckbox }); - - final JCheckBox openGEEAppCheckbox = new JCheckBox("Google Earth Engine APP (no sign-in)"); //$NON-NLS-1$ - openGEEAppCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_APP))); - propertyToComponent.put(EarthProperty.OPEN_GEE_APP, new JComponent[] { openGEEAppCheckbox }); - - final JCheckBox openTimelapseCheckbox = new JCheckBox(Messages.getString("OptionWizard.46")); //$NON-NLS-1$ - openTimelapseCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_TIMELAPSE))); - propertyToComponent.put(EarthProperty.OPEN_TIMELAPSE, new JComponent[] { openTimelapseCheckbox }); - - final JCheckBox openEarthMapCheckbox = new JCheckBox(Messages.getString("OptionWizard.105")); //$NON-NLS-1$ - openEarthMapCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_EARTH_MAP))); - propertyToComponent.put(EarthProperty.OPEN_EARTH_MAP, new JComponent[] { openEarthMapCheckbox }); - - final JCheckBox openBingCheckbox = new JCheckBox(Messages.getString("OptionWizard.47")); //$NON-NLS-1$ - openBingCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BING_MAPS))); - propertyToComponent.put(EarthProperty.OPEN_BING_MAPS, new JComponent[] { openBingCheckbox }); - - final JCheckBox openPlanetCheckbox = new JCheckBox(Messages.getString("OptionWizard.100")); //$NON-NLS-1$ - openPlanetCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_PLANET_MAPS))); - propertyToComponent.put(EarthProperty.OPEN_PLANET_MAPS, new JComponent[] { openPlanetCheckbox }); - - final JCheckBox openMonthlyNICFICheckbox = new JCheckBox(Messages.getString("OptionWizard.110")); //$NON-NLS-1$ - openMonthlyNICFICheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.PLANET_MAPS_MONHLY))); - propertyToComponent.put(EarthProperty.PLANET_MAPS_MONHLY, new JComponent[] { openMonthlyNICFICheckbox }); - - - final JPasswordField planetAPIKeyTextField = new JPasswordField( - localPropertiesService.getValue(EarthProperty.PLANET_MAPS_KEY)); - planetAPIKeyTextField.setMinimumSize(new Dimension( 250, 20 )); - planetAPIKeyTextField.setEnabled( localPropertiesService.isPlanetMapsSupported() ); - propertyToComponent.put(EarthProperty.PLANET_MAPS_KEY, new JComponent[] { planetAPIKeyTextField }); - - openMonthlyNICFICheckbox.setEnabled( openPlanetCheckbox.isSelected() ); - planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ); - - openPlanetCheckbox.addActionListener( e-> { - planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ); - openMonthlyNICFICheckbox.setEnabled( openPlanetCheckbox.isSelected() ); - }); - openMonthlyNICFICheckbox.addActionListener( e-> planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ) ); - - - final JCheckBox openSecureWatchCheckbox = new JCheckBox(Messages.getString("OptionWizard.102")); //$NON-NLS-1$ - openSecureWatchCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_MAXAR_SECUREWATCH))); - propertyToComponent.put(EarthProperty.OPEN_MAXAR_SECUREWATCH, new JComponent[] { openSecureWatchCheckbox }); - - final JTextField secureWatchUrlTextField = new JTextField( - localPropertiesService.getValue(EarthProperty.MAXAR_SECUREWATCH_URL)); - secureWatchUrlTextField.setMinimumSize(new Dimension( 250, 20 )); - propertyToComponent.put(EarthProperty.MAXAR_SECUREWATCH_URL, new JComponent[] { secureWatchUrlTextField }); - secureWatchUrlTextField.setEnabled( localPropertiesService.isSecureWatchSupported() ); - propertyToComponent.put(EarthProperty.MAXAR_SECUREWATCH_URL, new JComponent[] { secureWatchUrlTextField }); - openSecureWatchCheckbox.addActionListener( e -> secureWatchUrlTextField.setEnabled( openSecureWatchCheckbox.isSelected() ) ); - - final JTextField extraUrlTextField = new JTextField( - localPropertiesService.getValue(EarthProperty.EXTRA_MAP_URL)); - extraUrlTextField.setMinimumSize(new Dimension( 250, 20 )); - propertyToComponent.put(EarthProperty.EXTRA_MAP_URL, new JComponent[] { extraUrlTextField }); - - final JCheckBox openBaiduCheckbox = new JCheckBox("Open Baidu Maps"); - openBaiduCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BAIDU_MAPS))); - propertyToComponent.put(EarthProperty.OPEN_BAIDU_MAPS, new JComponent[] { openBaiduCheckbox }); - - final JCheckBox openYandexCheckbox = new JCheckBox("Open Yandex maps for the plot area"); - openYandexCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_YANDEX_MAPS))); - propertyToComponent.put(EarthProperty.OPEN_YANDEX_MAPS, new JComponent[] { openYandexCheckbox }); - - final JCheckBox openHereCheckbox = new JCheckBox(Messages.getString("OptionWizard.59")); //$NON-NLS-1$ - openHereCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_HERE_MAPS))); - propertyToComponent.put(EarthProperty.OPEN_HERE_MAPS, new JComponent[] { openHereCheckbox }); - - final JCheckBox openGeePlaygroundCheckbox = new JCheckBox(Messages.getString("OptionWizard.58")); //$NON-NLS-1$ - openGeePlaygroundCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_CODE_EDITOR))); - propertyToComponent.put(EarthProperty.OPEN_GEE_CODE_EDITOR, new JComponent[] { openGeePlaygroundCheckbox }); - - final JCheckBox openInSeparateWindowCheckbox = new JCheckBox(Messages.getString("OptionWizard.48")); //$NON-NLS-1$ - openInSeparateWindowCheckbox.setSelected( - Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BALLOON_IN_BROWSER))); - propertyToComponent.put(EarthProperty.OPEN_BALLOON_IN_BROWSER, - new JComponent[] { openInSeparateWindowCheckbox }); - - final JFilePicker csvWithPlotData = new JFilePicker(Messages.getString("OptionWizard.49"), //$NON-NLS-1$ - localPropertiesService.getValue(EarthProperty.SAMPLE_FILE), Messages.getString("OptionWizard.50"), DlgMode.MODE_OPEN); // $NON-NLS-1$ - - csvWithPlotData.addFileTypeFilter(".csv,.ced", Messages.getString("OptionWizard.52"), true); //$NON-NLS-1$ //$NON-NLS-2$ - propertyToComponent.put(EarthProperty.SAMPLE_FILE, new JComponent[] { csvWithPlotData }); - - final JComboBox plotShape = new JComboBox<>(SAMPLE_SHAPE.values()); - try { - plotShape.setSelectedItem(SAMPLE_SHAPE.valueOf(localPropertiesService.getValue(EarthProperty.SAMPLE_SHAPE))); - } catch (Exception e1) { - logger.error("The selected shape type is not supported " + localPropertiesService.getValue(EarthProperty.SAMPLE_SHAPE), e1 ); - } - propertyToComponent.put(EarthProperty.SAMPLE_SHAPE, new JComponent[] { plotShape }); - - final JComboBox comboNumberOfPoints = new JComboBox<>( - new ComboBoxItem[] { COMBO_BOX_ITEM_SQUARE, COMBO_BOX_ITEM_CENTRAL_POINT, new ComboBoxItem(4, "2x2"), //$NON-NLS-1$ //$NON-NLS-2$ - // //$NON-NLS-3$ - new ComboBoxItem(9, "3x3"), new ComboBoxItem(16, "4x4"), new ComboBoxItem(25, "5x5"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - new ComboBoxItem(36, "6x6"), //$NON-NLS-1$ - new ComboBoxItem(49, "7x7") }); //$NON-NLS-1$ - if( StringUtils.isNotBlank( localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT) ) ){ - try { - comboNumberOfPoints.setSelectedItem(new ComboBoxItem( - Integer.parseInt(localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT)), - "")); //$NON-NLS-1$ - } catch (NumberFormatException e1) { - logger.error("This should be a number {}", localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT), e1); - } - } - propertyToComponent.put(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT, - new JComponent[] { comboNumberOfPoints }); - - final String[] listOfNumbers = new String[1500]; - final String[] listOfNumbersFromTwo = new String[1500]; - - for (int index = 0; index < listOfNumbers.length; index++) { - listOfNumbers[index] = Integer.toString( index ); //$NON-NLS-1$ - listOfNumbersFromTwo[index] = Integer.toString( index + 2 ); //$NON-NLS-1$ - } - - final JComboBox listOfDistanceBetweenPoints = new JComboBox<>(listOfNumbersFromTwo); - listOfDistanceBetweenPoints - .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS)); - listOfDistanceBetweenPoints.setAutoscrolls(true); - - propertyToComponent.put(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS, - new JComponent[] { listOfDistanceBetweenPoints }); - - final JComboBox listOfDistanceBetweenPlots = new JComboBox<>(listOfNumbersFromTwo); - listOfDistanceBetweenPlots - .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS)); - listOfDistanceBetweenPlots.setAutoscrolls(true); - - propertyToComponent.put(EarthProperty.DISTANCE_BETWEEN_PLOTS, new JComponent[] { listOfDistanceBetweenPlots }); - - final JComboBox listOfDistanceToBorder = new JComboBox<>(listOfNumbers); - listOfDistanceToBorder - .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES)); - listOfDistanceToBorder.setAutoscrolls(true); - - propertyToComponent.put(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES, new JComponent[] { listOfDistanceToBorder }); - - final JComboBox listOfSizeofSamplingDot = new JComboBox<>(listOfNumbersFromTwo); - listOfSizeofSamplingDot.setSelectedItem(localPropertiesService.getValue(EarthProperty.INNER_SUBPLOT_SIDE)); - listOfSizeofSamplingDot.setAutoscrolls(true); - - propertyToComponent.put(EarthProperty.INNER_SUBPLOT_SIDE, new JComponent[] { listOfSizeofSamplingDot }); - - final JComboBox listOfSideOflargeCentralPlot = new JComboBox<>(listOfNumbersFromTwo); - listOfSideOflargeCentralPlot.setSelectedItem(localPropertiesService.getValue(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)); - listOfSideOflargeCentralPlot.setAutoscrolls(true); - - propertyToComponent.put(EarthProperty.LARGE_CENTRAL_PLOT_SIDE, new JComponent[] { listOfSideOflargeCentralPlot }); - - - final JRadioButton chromeChooser = new JRadioButton("Chrome"); //$NON-NLS-1$ - chromeChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() - .equals(EarthConstants.CHROME_BROWSER)); - chromeChooser.setName(EarthConstants.CHROME_BROWSER); - - final JRadioButton firefoxChooser = new JRadioButton("Firefox"); //$NON-NLS-1$ - firefoxChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() - .equals(EarthConstants.FIREFOX_BROWSER)); - firefoxChooser.setName(EarthConstants.FIREFOX_BROWSER); - - final JRadioButton edgeChooser = new JRadioButton("Edge"); //$NON-NLS-1$ - edgeChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() - .equals(EarthConstants.EDGE_BROWSER)); - edgeChooser.setName(EarthConstants.EDGE_BROWSER); - - propertyToComponent.put(EarthProperty.BROWSER_TO_USE, new JComponent[] { firefoxChooser, chromeChooser, edgeChooser}); - final JFilePicker saikuPath = new JFilePicker(Messages.getString("OptionWizard.65"), //$NON-NLS-1$ - localPropertiesService.getValue(EarthProperty.SAIKU_SERVER_FOLDER), - Messages.getString("OptionWizard.66"), DlgMode.MODE_OPEN); //$NON-NLS-1$ - saikuPath.setFolderChooser(); - saikuPath.addChangeListener(new DocumentListener() { - - private void showSaikuWarning() { - final File saikuFolder = new File(saikuPath.getSelectedFilePath()); - if ( !saikuService.isSaikuFolder(saikuFolder)) { - JOptionPane.showMessageDialog(PropertiesDialog.this, Messages.getString("OptionWizard.27"), //$NON-NLS-1$ - Messages.getString("OptionWizard.28"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ - saikuPath.getTextField().setBackground(CollectEarthWindow.ERROR_COLOR); - } else { - saikuPath.getTextField().setBackground(Color.white); - } - } - - @Override - public void removeUpdate(DocumentEvent e) { - // Do not react - } - - @Override - public void insertUpdate(DocumentEvent e) { - showSaikuWarning(); - } - - @Override - public void changedUpdate(DocumentEvent e) { - // Do not react - } - }); - propertyToComponent.put(EarthProperty.SAIKU_SERVER_FOLDER, new JComponent[] { saikuPath }); - - final JFilePicker kmlTemplatePath = new JFilePicker(Messages.getString("OptionWizard.79"), //$NON-NLS-1$ - localPropertiesService.getValue(EarthProperty.KML_TEMPLATE_KEY), Messages.getString("OptionWizard.80"), //$NON-NLS-1$ - DlgMode.MODE_OPEN); - kmlTemplatePath.addFileTypeFilter(".fmt", Messages.getString("OptionWizard.82"), true); //$NON-NLS-1$ //$NON-NLS-2$ - propertyToComponent.put(EarthProperty.KML_TEMPLATE_KEY, new JComponent[] { kmlTemplatePath }); - - final JFilePicker htmlBalloonPath = new JFilePicker(Messages.getString("OptionWizard.83"), //$NON-NLS-1$ - localPropertiesService.getValue(EarthProperty.BALLOON_TEMPLATE_KEY), - Messages.getString("OptionWizard.84"), DlgMode.MODE_OPEN); //$NON-NLS-1$ - htmlBalloonPath.addFileTypeFilter(".html,.htm", Messages.getString("OptionWizard.86"), true); //$NON-NLS-1$ //$NON-NLS-2$ - propertyToComponent.put(EarthProperty.BALLOON_TEMPLATE_KEY, new JComponent[] { htmlBalloonPath }); - - final JFilePicker idmPath = new JFilePicker(Messages.getString("OptionWizard.87"), //$NON-NLS-1$ - localPropertiesService.getImdFile(), Messages.getString("OptionWizard.88"), DlgMode.MODE_OPEN); //$NON-NLS-1$ - idmPath.addFileTypeFilter(".xml", Messages.getString("OptionWizard.90"), true); //$NON-NLS-1$ //$NON-NLS-2$ - propertyToComponent.put(EarthProperty.METADATA_FILE, new JComponent[] { idmPath }); - - final JTextField surveyNameTextField = new JTextField( - localPropertiesService.getValue(EarthProperty.SURVEY_NAME)); - surveyNameTextField.setEnabled(false); - propertyToComponent.put(EarthProperty.SURVEY_NAME, new JComponent[] { surveyNameTextField }); - - // Database options - - final JRadioButton instanceTypeServer = new JRadioButton(Messages.getString("OptionWizard.91")); //$NON-NLS-1$ - instanceTypeServer.setSelected(localPropertiesService.getOperationMode().equals(OperationMode.SERVER_MODE)); - instanceTypeServer.setName(EarthConstants.OperationMode.SERVER_MODE.name()); - - final JRadioButton instanceTypeClient = new JRadioButton(Messages.getString("OptionWizard.92")); //$NON-NLS-1$ - instanceTypeClient.setSelected(localPropertiesService.getOperationMode().equals(OperationMode.CLIENT_MODE)); - instanceTypeClient.setName(EarthConstants.OperationMode.CLIENT_MODE.name()); - propertyToComponent.put(EarthProperty.OPERATION_MODE, - new JComponent[] { instanceTypeServer, instanceTypeClient }); - - final JTextField collectEarthServerIp = new JTextField(localPropertiesService.getValue(EarthProperty.HOST_KEY)); - propertyToComponent.put(EarthProperty.HOST_KEY, new JComponent[] { collectEarthServerIp }); - - final JTextField collectEarthServerIpPort = new JTextField(localPropertiesService.getPort()); - final JTextField collectEarthServerLocalPort = new JTextField( - localPropertiesService.getValue(EarthProperty.HOST_PORT_KEY)); - propertyToComponent.put(EarthProperty.HOST_PORT_KEY, - new JComponent[] { collectEarthServerIpPort, collectEarthServerLocalPort }); - - final JRadioButton sqliteDbType = new JRadioButton(Messages.getString("OptionWizard.93")); //$NON-NLS-1$ - sqliteDbType.setSelected(localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.SQLITE)); - sqliteDbType.setName(CollectDBDriver.SQLITE.name()); - - final JRadioButton postgresDbType = new JRadioButton(Messages.getString("OptionWizard.94")); //$NON-NLS-1$ - boolean usingPostgreSQL = localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.POSTGRESQL); - postgresDbType.setSelected(usingPostgreSQL); - postgresDbType.setName(CollectDBDriver.POSTGRESQL.name()); - propertyToComponent.put(EarthProperty.DB_DRIVER, new JComponent[] { sqliteDbType, postgresDbType }); - - final JTextField dbUserName = new JTextField(localPropertiesService.getValue(EarthProperty.DB_USERNAME)); - propertyToComponent.put(EarthProperty.DB_USERNAME, new JComponent[] { dbUserName }); - - final JTextField dbPassword = new JTextField(localPropertiesService.getValue(EarthProperty.DB_PASSWORD)); - propertyToComponent.put(EarthProperty.DB_PASSWORD, new JComponent[] { dbPassword }); - - final JTextField dbName = new JTextField(localPropertiesService.getValue(EarthProperty.DB_NAME)); - propertyToComponent.put(EarthProperty.DB_NAME, new JComponent[] { dbName }); - - final JTextField dbHost = new JTextField(localPropertiesService.getValue(EarthProperty.DB_HOST)); - propertyToComponent.put(EarthProperty.DB_HOST, new JComponent[] { dbHost }); - - final JTextField dbPort = new JTextField(localPropertiesService.getValue(EarthProperty.DB_PORT)); - propertyToComponent.put(EarthProperty.DB_PORT, new JComponent[] { dbPort }); - - } - - public boolean isRestartRequired() { - return restartRequired; - } - - public void setRestartRequired(boolean restartRequired) { - this.restartRequired = restartRequired; - } - -} +package org.openforis.collect.earth.ipcc; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.Font; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +@Component +public class IPCCDataExportMatrixExtendedExcel extends IPCCDataExportTimeSeries { + + Logger logger = LoggerFactory.getLogger(IPCCDataExportMatrixExtendedExcel.class); + + public IPCCDataExportMatrixExtendedExcel() { + super(); + setExportTypeUsed(ExportType.IPCC); + } + + @Override + protected File generateFile(List strataData) throws IOException { + File excelDestination = File.createTempFile("LuMatrixTimeseries_EXTENDED", ".xls"); + excelDestination.deleteOnExit(); + // Create a Workbook + try(Workbook workbook = new HSSFWorkbook() ) {// new HSSFWorkbook() for generating `.xls` file + + /* + * CreationHelper helps us create instances of various things like DataFormat, + * Hyperlink, RichTextString etc, in a format (HSSF, XSSF) independent way + */ + // CreationHelper createHelper = workbook.getCreationHelper(); + + // Create a Font for styling header cells + Font cornerFont = workbook.createFont(); + cornerFont.setBold(true); + cornerFont.setFontHeightInPoints((short) 15); + cornerFont.setColor(IndexedColors.GREY_80_PERCENT.getIndex()); + // Create a CellStyle with the font + CellStyle cornerCellStyle = workbook.createCellStyle(); + cornerCellStyle.setFont(cornerFont); + + // Create a Font for styling header cells + Font headerFont = workbook.createFont(); + headerFont.setBold(true); + headerFont.setFontHeightInPoints((short) 14); + headerFont.setColor(IndexedColors.DARK_TEAL.getIndex()); + // Create a CellStyle with the font + CellStyle headerCellStyle = workbook.createCellStyle(); + headerCellStyle.setFont(headerFont); + + // Create a Font for styling non-diagonal cells + Font stdFont = workbook.createFont(); + stdFont.setBold(false); + stdFont.setFontHeightInPoints((short) 14); + stdFont.setColor(IndexedColors.DARK_RED.getIndex()); + // Create a CellStyle with the font + CellStyle stdCellStyle = workbook.createCellStyle(); + stdCellStyle.setFont(stdFont); + + // Create a Font for styling diagonal cells + Font diagonalFont = workbook.createFont(); + diagonalFont.setBold(true); + diagonalFont.setFontHeightInPoints((short) 14); + diagonalFont.setColor(IndexedColors.DARK_GREEN.getIndex()); + // Create a CellStyle with the font + CellStyle diagonalCellStyle = workbook.createCellStyle(); + diagonalCellStyle.setFont(diagonalFont); + + // Create a Font for styling diagonal cells + Font strataFont = workbook.createFont(); + strataFont.setBold(true); + strataFont.setFontHeightInPoints((short) 16); + strataFont.setColor(IndexedColors.BLUE.getIndex()); + // Create a CellStyle with the font + CellStyle strataCellStyle = workbook.createCellStyle(); + strataCellStyle.setFont(strataFont); + + List availableYears = new ArrayList(); + for (StratumPerYearData yearDataStratumP : strataData) { + if (!availableYears.contains(Integer.valueOf(yearDataStratumP.getYear()))) { + availableYears.add(yearDataStratumP.getYear()); + } + } + + for (Integer yearToOutput : availableYears) { + + int rowNum = 0; + // Create a Sheet + Sheet sheet = workbook.createSheet("LU Matrix " + yearToOutput + "-" + (yearToOutput + 1)); + + for (StratumPerYearData yearDataStratum : strataData) { + // Get the stratums for the year + if (yearDataStratum.getYear() != yearToOutput) { + continue; // The stratum contains data for a different year that we are going to output in + // the sheet + } + + + sheet.createRow(rowNum++); // create empty row + + // Create a Row + Row infoRow = sheet.createRow(rowNum++); + Cell cell = infoRow.createCell(0); + cell.setCellStyle(headerCellStyle); + cell.setCellValue("Climate"); + cell = infoRow.createCell(1); + cell.setCellStyle(strataCellStyle); + cell.setCellValue(yearDataStratum.getClimate()); + + infoRow = sheet.createRow(rowNum++); + cell = infoRow.createCell(0); + cell.setCellStyle(headerCellStyle); + cell.setCellValue("Soil"); + cell = infoRow.createCell(1); + cell.setCellStyle(strataCellStyle); + cell.setCellValue(yearDataStratum.getSoil()); + + infoRow = sheet.createRow(rowNum++); + cell = infoRow.createCell(0); + cell.setCellStyle(headerCellStyle); + cell.setCellValue("Global Ecological Zone (GEZ)"); + cell = infoRow.createCell(1); + cell.setCellStyle(strataCellStyle); + cell.setCellValue(yearDataStratum.getGez()); + + // Add some empty rows before next section + sheet.createRow(rowNum++); + + // Create a Row + Row headerRow = sheet.createRow(rowNum++); + cell = headerRow.createCell(0); + cell.setCellValue( + "Transition " + yearDataStratum.getYear() + "/" + (yearDataStratum.getYear() + 1)); + cell.setCellStyle(cornerCellStyle); + + MatrixSheet matrix = new MatrixSheet(yearDataStratum); + int cellPosition = 1; + for (LandUseSubdivision subdivision : matrix.getSubdivisions()) { + cell = headerRow.createCell(cellPosition++); + cell.setCellValue(subdivision.toString()); + cell.setCellStyle(headerCellStyle); + } + + int colNum = 0; + for (LandUseSubdivision subdivisionH : matrix.getSubdivisions()) { + colNum = 0; + Row row = sheet.createRow(rowNum++); + + Cell columnCell = row.createCell(colNum++); + columnCell.setCellStyle(headerCellStyle); + columnCell.setCellValue(subdivisionH.toString()); + + colNum = 1; + for (LandUseSubdivision subdivisionV : matrix.getSubdivisions()) { + + cell = row.createCell(colNum++); + cell.setCellValue(IPCCDataExportMatrixExcel + .findLuData(subdivisionH, subdivisionV, matrix.getYearData().getLuData()) + .getAreaHa()); + if (subdivisionH.equals(subdivisionV)) { + cell.setCellStyle(diagonalCellStyle); + } else { + cell.setCellStyle(stdCellStyle); + } + } + + } + + // Add some empty rows before next section + sheet.createRow(rowNum++); + sheet.createRow(rowNum++); + sheet.createRow(rowNum++); + + + // Resize all columns to fit the content size + for (int j = 0; j < colNum; j++) { + sheet.autoSizeColumn(j); + } + + } + + } + + // Write the output to a file + try (FileOutputStream fileOut = new FileOutputStream(excelDestination)) { + workbook.write(fileOut); + } catch (IOException e) { + logger.error("Error generating Excel file", e); + } + } catch (Exception e) { + logger.error("Error generating Excel data", e); + } + return excelDestination; + } + +} From 5f1d92ac0d4861d0e476754d7b1c5bc78b8133f7 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:57 +0100 Subject: [PATCH 0364/1620] New translations IPCCDataExportMatrixExtendedExcel.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 271 ++++++++---------- 1 file changed, 123 insertions(+), 148 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 1230b9a5c0..c15098bfaa 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -3,14 +3,9 @@ package org.openforis.collect.earth.ipcc; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; -import java.sql.ResultSet; -import java.sql.SQLException; import java.util.ArrayList; -import java.util.Collection; import java.util.List; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.collections.Predicate; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; @@ -20,119 +15,33 @@ import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.RDBConnector; -import org.openforis.collect.earth.app.service.RegionCalculationUtils; -import org.openforis.collect.earth.app.service.SchemaService; -import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Component; -import liquibase.pro.packaged.E; - @Component -public class IPCCDataExportMatrixExcel extends RDBConnector { - - private String schemaName; - - Logger logger = LoggerFactory.getLogger(IPCCDataExportMatrixExcel.class); +public class IPCCDataExportMatrixExtendedExcel extends IPCCDataExportTimeSeries { - @Autowired - private SchemaService schemaService; + Logger logger = LoggerFactory.getLogger(IPCCDataExportMatrixExtendedExcel.class); - public IPCCDataExportMatrixExcel() { + public IPCCDataExportMatrixExtendedExcel() { + super(); setExportTypeUsed(ExportType.IPCC); } - public File generateTimeseriesData( int startYear, int endYear ) throws IOException { - schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - - List matrixSheets = new ArrayList(); - - for (int year = startYear; year < endYear; year++) { - MatrixSheet yearMatrixData = generateLUMatrixForYear(year); - if (yearMatrixData != null) - matrixSheets.add(yearMatrixData); - } - - return createExcel( matrixSheets); - } - - - private MatrixSheet generateLUMatrixForYear(int year) { - - List luData = getJdbcTemplate().query( - "select " - + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " - + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1) + "," - + "sum( " + RegionCalculationUtils.EXPANSION_FACTOR + ")" - + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE - + " GROUP BY " - + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + "," - + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1), - getRowMapper() - ); - - if (luData.size() == 0) { // No LU data for the climate, soil, gez combination - return null; - } - - YearData yearData = new YearData(year, luData); - - return new MatrixSheet( yearData ); - } - - - protected RowMapper getRowMapper() { - return new RowMapper() { - @Override - public LUDataPerYear mapRow(ResultSet rs, int rowNum) throws SQLException { - - String categoryInitial = rs.getString(1); - String categoryFinal = rs.getString(2); - String subdivInitial = rs.getString(3); - String subdivFinal = rs.getString(4); - - return new LUDataPerYear( - LandUseSubdivisionUtils.getSubdivision(categoryInitial, subdivInitial), - LandUseSubdivisionUtils.getSubdivision(categoryFinal, subdivFinal), - rs.getDouble(5) // area - ); - } - }; - } - - protected static LUDataPerYear findLuData( LandUseSubdivision initialSubdivision, LandUseSubdivision finalSubdivision, List luData ) { - Collection result = CollectionUtils.select(luData, new Predicate() { - public boolean evaluate(Object a) { - return - ( (LUDataPerYear) a ).getLu().equals(initialSubdivision) - && - ( (LUDataPerYear) a ).getLuNextYear().equals(finalSubdivision); - } - }); - if( result.size() == 1 ) - return (LUDataPerYear) result.toArray(new LUDataPerYear[result.size()])[0]; - else - return new LUDataPerYear(initialSubdivision, finalSubdivision, 0); - - } - - private File createExcel( List matrixData ) throws IOException { - File excelDestination = File.createTempFile("LuMatrixTimeseries", ".xls"); + @Override + protected File generateFile(List strataData) throws IOException { + File excelDestination = File.createTempFile("LuMatrixTimeseries_EXTENDED", ".xls"); excelDestination.deleteOnExit(); // Create a Workbook - try (Workbook workbook = new HSSFWorkbook() ){ - /* CreationHelper helps us create instances of various things like DataFormat, - Hyperlink, RichTextString etc, in a format (HSSF, XSSF) independent way */ - //CreationHelper createHelper = workbook.getCreationHelper(); + try(Workbook workbook = new HSSFWorkbook() ) {// new HSSFWorkbook() for generating `.xls` file + + /* + * CreationHelper helps us create instances of various things like DataFormat, + * Hyperlink, RichTextString etc, in a format (HSSF, XSSF) independent way + */ + // CreationHelper createHelper = workbook.getCreationHelper(); // Create a Font for styling header cells Font cornerFont = workbook.createFont(); @@ -142,7 +51,7 @@ public class IPCCDataExportMatrixExcel extends RDBConnector { // Create a CellStyle with the font CellStyle cornerCellStyle = workbook.createCellStyle(); cornerCellStyle.setFont(cornerFont); - + // Create a Font for styling header cells Font headerFont = workbook.createFont(); headerFont.setBold(true); @@ -151,7 +60,7 @@ public class IPCCDataExportMatrixExcel extends RDBConnector { // Create a CellStyle with the font CellStyle headerCellStyle = workbook.createCellStyle(); headerCellStyle.setFont(headerFont); - + // Create a Font for styling non-diagonal cells Font stdFont = workbook.createFont(); stdFont.setBold(false); @@ -160,8 +69,8 @@ public class IPCCDataExportMatrixExcel extends RDBConnector { // Create a CellStyle with the font CellStyle stdCellStyle = workbook.createCellStyle(); stdCellStyle.setFont(stdFont); - - // Create a Font for styling non-diagonal cells + + // Create a Font for styling diagonal cells Font diagonalFont = workbook.createFont(); diagonalFont.setBold(true); diagonalFont.setFontHeightInPoints((short) 14); @@ -169,58 +78,124 @@ public class IPCCDataExportMatrixExcel extends RDBConnector { // Create a CellStyle with the font CellStyle diagonalCellStyle = workbook.createCellStyle(); diagonalCellStyle.setFont(diagonalFont); + + // Create a Font for styling diagonal cells + Font strataFont = workbook.createFont(); + strataFont.setBold(true); + strataFont.setFontHeightInPoints((short) 16); + strataFont.setColor(IndexedColors.BLUE.getIndex()); + // Create a CellStyle with the font + CellStyle strataCellStyle = workbook.createCellStyle(); + strataCellStyle.setFont(strataFont); - for (MatrixSheet matrix : matrixData) { + List availableYears = new ArrayList(); + for (StratumPerYearData yearDataStratumP : strataData) { + if (!availableYears.contains(Integer.valueOf(yearDataStratumP.getYear()))) { + availableYears.add(yearDataStratumP.getYear()); + } + } + + for (Integer yearToOutput : availableYears) { + + int rowNum = 0; // Create a Sheet - Sheet sheet = workbook.createSheet("LU Matrix " + matrix.getYearData().getYear() + "-" + (matrix.getYearData().getYear()+1 ) ); - - // Create a Row - Row headerRow = sheet.createRow(0); - Cell cell = headerRow.createCell(0); - cell.setCellValue( "Transition " + matrix.getYearData().getYear() + "/" + ( matrix.getYearData().getYear() +1 ) ); - cell.setCellStyle(cornerCellStyle); - - int i = 1; - for (LandUseSubdivision subdivision : matrix.getSubdivisions()) { - cell = headerRow.createCell(i++); - cell.setCellValue(subdivision.toString()); + Sheet sheet = workbook.createSheet("LU Matrix " + yearToOutput + "-" + (yearToOutput + 1)); + + for (StratumPerYearData yearDataStratum : strataData) { + // Get the stratums for the year + if (yearDataStratum.getYear() != yearToOutput) { + continue; // The stratum contains data for a different year that we are going to output in + // the sheet + } + + + sheet.createRow(rowNum++); // create empty row + + // Create a Row + Row infoRow = sheet.createRow(rowNum++); + Cell cell = infoRow.createCell(0); cell.setCellStyle(headerCellStyle); - } + cell.setCellValue("Climate"); + cell = infoRow.createCell(1); + cell.setCellStyle(strataCellStyle); + cell.setCellValue(yearDataStratum.getClimate()); + + infoRow = sheet.createRow(rowNum++); + cell = infoRow.createCell(0); + cell.setCellStyle(headerCellStyle); + cell.setCellValue("Soil"); + cell = infoRow.createCell(1); + cell.setCellStyle(strataCellStyle); + cell.setCellValue(yearDataStratum.getSoil()); + + infoRow = sheet.createRow(rowNum++); + cell = infoRow.createCell(0); + cell.setCellStyle(headerCellStyle); + cell.setCellValue("Global Ecological Zone (GEZ)"); + cell = infoRow.createCell(1); + cell.setCellStyle(strataCellStyle); + cell.setCellValue(yearDataStratum.getGez()); + + // Add some empty rows before next section + sheet.createRow(rowNum++); + + // Create a Row + Row headerRow = sheet.createRow(rowNum++); + cell = headerRow.createCell(0); + cell.setCellValue( + "Transition " + yearDataStratum.getYear() + "/" + (yearDataStratum.getYear() + 1)); + cell.setCellStyle(cornerCellStyle); + + MatrixSheet matrix = new MatrixSheet(yearDataStratum); + int cellPosition = 1; + for (LandUseSubdivision subdivision : matrix.getSubdivisions()) { + cell = headerRow.createCell(cellPosition++); + cell.setCellValue(subdivision.toString()); + cell.setCellStyle(headerCellStyle); + } - - int rowNum = 1; - int colNum = 0; - for (LandUseSubdivision subdivisionH : matrix.getSubdivisions()) { - colNum = 0; - Row row = sheet.createRow(rowNum++); - - Cell columnCell = row.createCell(colNum++); - columnCell.setCellStyle(headerCellStyle); - columnCell.setCellValue(subdivisionH.toString()); - - colNum = 1; - for (LandUseSubdivision subdivisionV : matrix.getSubdivisions()) { - - cell = row.createCell(colNum++); - cell.setCellValue( findLuData( subdivisionH, subdivisionV, matrix.getYearData().getLuData() ).getAreaHa() ); - if( subdivisionH.equals( subdivisionV ) ) { - cell.setCellStyle(diagonalCellStyle); - }else { - cell.setCellStyle(stdCellStyle); + int colNum = 0; + for (LandUseSubdivision subdivisionH : matrix.getSubdivisions()) { + colNum = 0; + Row row = sheet.createRow(rowNum++); + + Cell columnCell = row.createCell(colNum++); + columnCell.setCellStyle(headerCellStyle); + columnCell.setCellValue(subdivisionH.toString()); + + colNum = 1; + for (LandUseSubdivision subdivisionV : matrix.getSubdivisions()) { + + cell = row.createCell(colNum++); + cell.setCellValue(IPCCDataExportMatrixExcel + .findLuData(subdivisionH, subdivisionV, matrix.getYearData().getLuData()) + .getAreaHa()); + if (subdivisionH.equals(subdivisionV)) { + cell.setCellStyle(diagonalCellStyle); + } else { + cell.setCellStyle(stdCellStyle); + } } + } + + // Add some empty rows before next section + sheet.createRow(rowNum++); + sheet.createRow(rowNum++); + sheet.createRow(rowNum++); - } - // Resize all columns to fit the content size - for(int j = 0; j < colNum; j++) { - sheet.autoSizeColumn(j); + // Resize all columns to fit the content size + for (int j = 0; j < colNum; j++) { + sheet.autoSizeColumn(j); + } + } } // Write the output to a file - try( FileOutputStream fileOut = new FileOutputStream(excelDestination) ){ + try (FileOutputStream fileOut = new FileOutputStream(excelDestination)) { workbook.write(fileOut); } catch (IOException e) { logger.error("Error generating Excel file", e); From 83b7ccc5fafad0c3fbde88e7a040535f63687c1c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:58 +0100 Subject: [PATCH 0365/1620] New translations IPCCDataExportMatrixExtendedExcel.java (English) --- .../earth/app/view/Messages_en.properties | 271 ++++++++---------- 1 file changed, 123 insertions(+), 148 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 1230b9a5c0..c15098bfaa 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -3,14 +3,9 @@ package org.openforis.collect.earth.ipcc; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; -import java.sql.ResultSet; -import java.sql.SQLException; import java.util.ArrayList; -import java.util.Collection; import java.util.List; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.collections.Predicate; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; @@ -20,119 +15,33 @@ import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.RDBConnector; -import org.openforis.collect.earth.app.service.RegionCalculationUtils; -import org.openforis.collect.earth.app.service.SchemaService; -import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Component; -import liquibase.pro.packaged.E; - @Component -public class IPCCDataExportMatrixExcel extends RDBConnector { - - private String schemaName; - - Logger logger = LoggerFactory.getLogger(IPCCDataExportMatrixExcel.class); +public class IPCCDataExportMatrixExtendedExcel extends IPCCDataExportTimeSeries { - @Autowired - private SchemaService schemaService; + Logger logger = LoggerFactory.getLogger(IPCCDataExportMatrixExtendedExcel.class); - public IPCCDataExportMatrixExcel() { + public IPCCDataExportMatrixExtendedExcel() { + super(); setExportTypeUsed(ExportType.IPCC); } - public File generateTimeseriesData( int startYear, int endYear ) throws IOException { - schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - - List matrixSheets = new ArrayList(); - - for (int year = startYear; year < endYear; year++) { - MatrixSheet yearMatrixData = generateLUMatrixForYear(year); - if (yearMatrixData != null) - matrixSheets.add(yearMatrixData); - } - - return createExcel( matrixSheets); - } - - - private MatrixSheet generateLUMatrixForYear(int year) { - - List luData = getJdbcTemplate().query( - "select " - + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " - + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1) + "," - + "sum( " + RegionCalculationUtils.EXPANSION_FACTOR + ")" - + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE - + " GROUP BY " - + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + "," - + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1), - getRowMapper() - ); - - if (luData.size() == 0) { // No LU data for the climate, soil, gez combination - return null; - } - - YearData yearData = new YearData(year, luData); - - return new MatrixSheet( yearData ); - } - - - protected RowMapper getRowMapper() { - return new RowMapper() { - @Override - public LUDataPerYear mapRow(ResultSet rs, int rowNum) throws SQLException { - - String categoryInitial = rs.getString(1); - String categoryFinal = rs.getString(2); - String subdivInitial = rs.getString(3); - String subdivFinal = rs.getString(4); - - return new LUDataPerYear( - LandUseSubdivisionUtils.getSubdivision(categoryInitial, subdivInitial), - LandUseSubdivisionUtils.getSubdivision(categoryFinal, subdivFinal), - rs.getDouble(5) // area - ); - } - }; - } - - protected static LUDataPerYear findLuData( LandUseSubdivision initialSubdivision, LandUseSubdivision finalSubdivision, List luData ) { - Collection result = CollectionUtils.select(luData, new Predicate() { - public boolean evaluate(Object a) { - return - ( (LUDataPerYear) a ).getLu().equals(initialSubdivision) - && - ( (LUDataPerYear) a ).getLuNextYear().equals(finalSubdivision); - } - }); - if( result.size() == 1 ) - return (LUDataPerYear) result.toArray(new LUDataPerYear[result.size()])[0]; - else - return new LUDataPerYear(initialSubdivision, finalSubdivision, 0); - - } - - private File createExcel( List matrixData ) throws IOException { - File excelDestination = File.createTempFile("LuMatrixTimeseries", ".xls"); + @Override + protected File generateFile(List strataData) throws IOException { + File excelDestination = File.createTempFile("LuMatrixTimeseries_EXTENDED", ".xls"); excelDestination.deleteOnExit(); // Create a Workbook - try (Workbook workbook = new HSSFWorkbook() ){ - /* CreationHelper helps us create instances of various things like DataFormat, - Hyperlink, RichTextString etc, in a format (HSSF, XSSF) independent way */ - //CreationHelper createHelper = workbook.getCreationHelper(); + try(Workbook workbook = new HSSFWorkbook() ) {// new HSSFWorkbook() for generating `.xls` file + + /* + * CreationHelper helps us create instances of various things like DataFormat, + * Hyperlink, RichTextString etc, in a format (HSSF, XSSF) independent way + */ + // CreationHelper createHelper = workbook.getCreationHelper(); // Create a Font for styling header cells Font cornerFont = workbook.createFont(); @@ -142,7 +51,7 @@ public class IPCCDataExportMatrixExcel extends RDBConnector { // Create a CellStyle with the font CellStyle cornerCellStyle = workbook.createCellStyle(); cornerCellStyle.setFont(cornerFont); - + // Create a Font for styling header cells Font headerFont = workbook.createFont(); headerFont.setBold(true); @@ -151,7 +60,7 @@ public class IPCCDataExportMatrixExcel extends RDBConnector { // Create a CellStyle with the font CellStyle headerCellStyle = workbook.createCellStyle(); headerCellStyle.setFont(headerFont); - + // Create a Font for styling non-diagonal cells Font stdFont = workbook.createFont(); stdFont.setBold(false); @@ -160,8 +69,8 @@ public class IPCCDataExportMatrixExcel extends RDBConnector { // Create a CellStyle with the font CellStyle stdCellStyle = workbook.createCellStyle(); stdCellStyle.setFont(stdFont); - - // Create a Font for styling non-diagonal cells + + // Create a Font for styling diagonal cells Font diagonalFont = workbook.createFont(); diagonalFont.setBold(true); diagonalFont.setFontHeightInPoints((short) 14); @@ -169,58 +78,124 @@ public class IPCCDataExportMatrixExcel extends RDBConnector { // Create a CellStyle with the font CellStyle diagonalCellStyle = workbook.createCellStyle(); diagonalCellStyle.setFont(diagonalFont); + + // Create a Font for styling diagonal cells + Font strataFont = workbook.createFont(); + strataFont.setBold(true); + strataFont.setFontHeightInPoints((short) 16); + strataFont.setColor(IndexedColors.BLUE.getIndex()); + // Create a CellStyle with the font + CellStyle strataCellStyle = workbook.createCellStyle(); + strataCellStyle.setFont(strataFont); - for (MatrixSheet matrix : matrixData) { + List availableYears = new ArrayList(); + for (StratumPerYearData yearDataStratumP : strataData) { + if (!availableYears.contains(Integer.valueOf(yearDataStratumP.getYear()))) { + availableYears.add(yearDataStratumP.getYear()); + } + } + + for (Integer yearToOutput : availableYears) { + + int rowNum = 0; // Create a Sheet - Sheet sheet = workbook.createSheet("LU Matrix " + matrix.getYearData().getYear() + "-" + (matrix.getYearData().getYear()+1 ) ); - - // Create a Row - Row headerRow = sheet.createRow(0); - Cell cell = headerRow.createCell(0); - cell.setCellValue( "Transition " + matrix.getYearData().getYear() + "/" + ( matrix.getYearData().getYear() +1 ) ); - cell.setCellStyle(cornerCellStyle); - - int i = 1; - for (LandUseSubdivision subdivision : matrix.getSubdivisions()) { - cell = headerRow.createCell(i++); - cell.setCellValue(subdivision.toString()); + Sheet sheet = workbook.createSheet("LU Matrix " + yearToOutput + "-" + (yearToOutput + 1)); + + for (StratumPerYearData yearDataStratum : strataData) { + // Get the stratums for the year + if (yearDataStratum.getYear() != yearToOutput) { + continue; // The stratum contains data for a different year that we are going to output in + // the sheet + } + + + sheet.createRow(rowNum++); // create empty row + + // Create a Row + Row infoRow = sheet.createRow(rowNum++); + Cell cell = infoRow.createCell(0); cell.setCellStyle(headerCellStyle); - } + cell.setCellValue("Climate"); + cell = infoRow.createCell(1); + cell.setCellStyle(strataCellStyle); + cell.setCellValue(yearDataStratum.getClimate()); + + infoRow = sheet.createRow(rowNum++); + cell = infoRow.createCell(0); + cell.setCellStyle(headerCellStyle); + cell.setCellValue("Soil"); + cell = infoRow.createCell(1); + cell.setCellStyle(strataCellStyle); + cell.setCellValue(yearDataStratum.getSoil()); + + infoRow = sheet.createRow(rowNum++); + cell = infoRow.createCell(0); + cell.setCellStyle(headerCellStyle); + cell.setCellValue("Global Ecological Zone (GEZ)"); + cell = infoRow.createCell(1); + cell.setCellStyle(strataCellStyle); + cell.setCellValue(yearDataStratum.getGez()); + + // Add some empty rows before next section + sheet.createRow(rowNum++); + + // Create a Row + Row headerRow = sheet.createRow(rowNum++); + cell = headerRow.createCell(0); + cell.setCellValue( + "Transition " + yearDataStratum.getYear() + "/" + (yearDataStratum.getYear() + 1)); + cell.setCellStyle(cornerCellStyle); + + MatrixSheet matrix = new MatrixSheet(yearDataStratum); + int cellPosition = 1; + for (LandUseSubdivision subdivision : matrix.getSubdivisions()) { + cell = headerRow.createCell(cellPosition++); + cell.setCellValue(subdivision.toString()); + cell.setCellStyle(headerCellStyle); + } - - int rowNum = 1; - int colNum = 0; - for (LandUseSubdivision subdivisionH : matrix.getSubdivisions()) { - colNum = 0; - Row row = sheet.createRow(rowNum++); - - Cell columnCell = row.createCell(colNum++); - columnCell.setCellStyle(headerCellStyle); - columnCell.setCellValue(subdivisionH.toString()); - - colNum = 1; - for (LandUseSubdivision subdivisionV : matrix.getSubdivisions()) { - - cell = row.createCell(colNum++); - cell.setCellValue( findLuData( subdivisionH, subdivisionV, matrix.getYearData().getLuData() ).getAreaHa() ); - if( subdivisionH.equals( subdivisionV ) ) { - cell.setCellStyle(diagonalCellStyle); - }else { - cell.setCellStyle(stdCellStyle); + int colNum = 0; + for (LandUseSubdivision subdivisionH : matrix.getSubdivisions()) { + colNum = 0; + Row row = sheet.createRow(rowNum++); + + Cell columnCell = row.createCell(colNum++); + columnCell.setCellStyle(headerCellStyle); + columnCell.setCellValue(subdivisionH.toString()); + + colNum = 1; + for (LandUseSubdivision subdivisionV : matrix.getSubdivisions()) { + + cell = row.createCell(colNum++); + cell.setCellValue(IPCCDataExportMatrixExcel + .findLuData(subdivisionH, subdivisionV, matrix.getYearData().getLuData()) + .getAreaHa()); + if (subdivisionH.equals(subdivisionV)) { + cell.setCellStyle(diagonalCellStyle); + } else { + cell.setCellStyle(stdCellStyle); + } } + } + + // Add some empty rows before next section + sheet.createRow(rowNum++); + sheet.createRow(rowNum++); + sheet.createRow(rowNum++); - } - // Resize all columns to fit the content size - for(int j = 0; j < colNum; j++) { - sheet.autoSizeColumn(j); + // Resize all columns to fit the content size + for (int j = 0; j < colNum; j++) { + sheet.autoSizeColumn(j); + } + } } // Write the output to a file - try( FileOutputStream fileOut = new FileOutputStream(excelDestination) ){ + try (FileOutputStream fileOut = new FileOutputStream(excelDestination)) { workbook.write(fileOut); } catch (IOException e) { logger.error("Error generating Excel file", e); From 0ac88500006af2dafa9bec0221d5ffcf447ea3bd Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:27:59 +0100 Subject: [PATCH 0366/1620] New translations IPCCDataExportPerPlotCSV.java (French) --- .../earth/app/view/Messages_fr.properties | 244 ++++-------------- 1 file changed, 56 insertions(+), 188 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index c15098bfaa..21431b088f 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,209 +1,77 @@ package org.openforis.collect.earth.ipcc; import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; -import java.util.ArrayList; import java.util.List; -import org.apache.poi.hssf.usermodel.HSSFWorkbook; -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.CellStyle; -import org.apache.poi.ss.usermodel.Font; -import org.apache.poi.ss.usermodel.IndexedColors; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.ss.usermodel.Workbook; import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +import org.openforis.collect.earth.app.service.RegionCalculationUtils; +import org.openforis.collect.earth.app.service.SchemaService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component -public class IPCCDataExportMatrixExtendedExcel extends IPCCDataExportTimeSeries { +public class IPCCDataExportPerPlotCSV extends IPCCDataExportCSV { - Logger logger = LoggerFactory.getLogger(IPCCDataExportMatrixExtendedExcel.class); + private String schemaName; - public IPCCDataExportMatrixExtendedExcel() { - super(); + Logger logger = LoggerFactory.getLogger(IPCCDataExportPerPlotCSV.class); + + @Autowired + private SchemaService schemaService; + + public IPCCDataExportPerPlotCSV() { setExportTypeUsed(ExportType.IPCC); } - @Override - protected File generateFile(List strataData) throws IOException { - File excelDestination = File.createTempFile("LuMatrixTimeseries_EXTENDED", ".xls"); - excelDestination.deleteOnExit(); - // Create a Workbook - try(Workbook workbook = new HSSFWorkbook() ) {// new HSSFWorkbook() for generating `.xls` file - - /* - * CreationHelper helps us create instances of various things like DataFormat, - * Hyperlink, RichTextString etc, in a format (HSSF, XSSF) independent way - */ - // CreationHelper createHelper = workbook.getCreationHelper(); - - // Create a Font for styling header cells - Font cornerFont = workbook.createFont(); - cornerFont.setBold(true); - cornerFont.setFontHeightInPoints((short) 15); - cornerFont.setColor(IndexedColors.GREY_80_PERCENT.getIndex()); - // Create a CellStyle with the font - CellStyle cornerCellStyle = workbook.createCellStyle(); - cornerCellStyle.setFont(cornerFont); - - // Create a Font for styling header cells - Font headerFont = workbook.createFont(); - headerFont.setBold(true); - headerFont.setFontHeightInPoints((short) 14); - headerFont.setColor(IndexedColors.DARK_TEAL.getIndex()); - // Create a CellStyle with the font - CellStyle headerCellStyle = workbook.createCellStyle(); - headerCellStyle.setFont(headerFont); - - // Create a Font for styling non-diagonal cells - Font stdFont = workbook.createFont(); - stdFont.setBold(false); - stdFont.setFontHeightInPoints((short) 14); - stdFont.setColor(IndexedColors.DARK_RED.getIndex()); - // Create a CellStyle with the font - CellStyle stdCellStyle = workbook.createCellStyle(); - stdCellStyle.setFont(stdFont); - - // Create a Font for styling diagonal cells - Font diagonalFont = workbook.createFont(); - diagonalFont.setBold(true); - diagonalFont.setFontHeightInPoints((short) 14); - diagonalFont.setColor(IndexedColors.DARK_GREEN.getIndex()); - // Create a CellStyle with the font - CellStyle diagonalCellStyle = workbook.createCellStyle(); - diagonalCellStyle.setFont(diagonalFont); - - // Create a Font for styling diagonal cells - Font strataFont = workbook.createFont(); - strataFont.setBold(true); - strataFont.setFontHeightInPoints((short) 16); - strataFont.setColor(IndexedColors.BLUE.getIndex()); - // Create a CellStyle with the font - CellStyle strataCellStyle = workbook.createCellStyle(); - strataCellStyle.setFont(strataFont); - - List availableYears = new ArrayList(); - for (StratumPerYearData yearDataStratumP : strataData) { - if (!availableYears.contains(Integer.valueOf(yearDataStratumP.getYear()))) { - availableYears.add(yearDataStratumP.getYear()); - } - } - - for (Integer yearToOutput : availableYears) { - - int rowNum = 0; - // Create a Sheet - Sheet sheet = workbook.createSheet("LU Matrix " + yearToOutput + "-" + (yearToOutput + 1)); - - for (StratumPerYearData yearDataStratum : strataData) { - // Get the stratums for the year - if (yearDataStratum.getYear() != yearToOutput) { - continue; // The stratum contains data for a different year that we are going to output in - // the sheet - } - - - sheet.createRow(rowNum++); // create empty row - - // Create a Row - Row infoRow = sheet.createRow(rowNum++); - Cell cell = infoRow.createCell(0); - cell.setCellStyle(headerCellStyle); - cell.setCellValue("Climate"); - cell = infoRow.createCell(1); - cell.setCellStyle(strataCellStyle); - cell.setCellValue(yearDataStratum.getClimate()); - - infoRow = sheet.createRow(rowNum++); - cell = infoRow.createCell(0); - cell.setCellStyle(headerCellStyle); - cell.setCellValue("Soil"); - cell = infoRow.createCell(1); - cell.setCellStyle(strataCellStyle); - cell.setCellValue(yearDataStratum.getSoil()); - - infoRow = sheet.createRow(rowNum++); - cell = infoRow.createCell(0); - cell.setCellStyle(headerCellStyle); - cell.setCellValue("Global Ecological Zone (GEZ)"); - cell = infoRow.createCell(1); - cell.setCellStyle(strataCellStyle); - cell.setCellValue(yearDataStratum.getGez()); - - // Add some empty rows before next section - sheet.createRow(rowNum++); - - // Create a Row - Row headerRow = sheet.createRow(rowNum++); - cell = headerRow.createCell(0); - cell.setCellValue( - "Transition " + yearDataStratum.getYear() + "/" + (yearDataStratum.getYear() + 1)); - cell.setCellStyle(cornerCellStyle); - - MatrixSheet matrix = new MatrixSheet(yearDataStratum); - int cellPosition = 1; - for (LandUseSubdivision subdivision : matrix.getSubdivisions()) { - cell = headerRow.createCell(cellPosition++); - cell.setCellValue(subdivision.toString()); - cell.setCellStyle(headerCellStyle); - } - - int colNum = 0; - for (LandUseSubdivision subdivisionH : matrix.getSubdivisions()) { - colNum = 0; - Row row = sheet.createRow(rowNum++); - - Cell columnCell = row.createCell(colNum++); - columnCell.setCellStyle(headerCellStyle); - columnCell.setCellValue(subdivisionH.toString()); - - colNum = 1; - for (LandUseSubdivision subdivisionV : matrix.getSubdivisions()) { - - cell = row.createCell(colNum++); - cell.setCellValue(IPCCDataExportMatrixExcel - .findLuData(subdivisionH, subdivisionV, matrix.getYearData().getLuData()) - .getAreaHa()); - if (subdivisionH.equals(subdivisionV)) { - cell.setCellStyle(diagonalCellStyle); - } else { - cell.setCellStyle(stdCellStyle); - } - } - - } - - // Add some empty rows before next section - sheet.createRow(rowNum++); - sheet.createRow(rowNum++); - sheet.createRow(rowNum++); - - - // Resize all columns to fit the content size - for (int j = 0; j < colNum; j++) { - sheet.autoSizeColumn(j); - } - - } - - } - - // Write the output to a file - try (FileOutputStream fileOut = new FileOutputStream(excelDestination)) { - workbook.write(fileOut); - } catch (IOException e) { - logger.error("Error generating Excel file", e); - } - } catch (Exception e) { - logger.error("Error generating Excel data", e); + public File generateTimeseriesData( int startYear, int endYear ) throws IOException { + schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); + + List luCombinations = generateLUCombinations(startYear, endYear); + + return createCsv( luCombinations); + } + + + private List generateLUCombinations(int startYear, int endYear) { + + String selectedYears = IPCCDataExportTimeSeries.PLOT_ID + + ", " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_LABEL + + ", " + IPCCDataExportTimeSeries.SOIL_COLUMN_LABEL + + ", " + IPCCDataExportTimeSeries.GEZ_COLUMN_LABEL + ", " ; + + for( int year = startYear ; year <= endYear; year++ ) { + + selectedYears += IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + ","; + } - return excelDestination; + + String sqlSelect = "select " + + selectedYears + + RegionCalculationUtils.EXPANSION_FACTOR + + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.SOIL_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.CLIMATE_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.GEZ_TABLE + + + " where " + + IPCCDataExportTimeSeries.SOIL_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.SOIL_COLUMN_ID + + " and " + + IPCCDataExportTimeSeries.CLIMATE_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_ID + + " and " + + IPCCDataExportTimeSeries.GEZ_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.GEZ_COLUMN_ID + + + " ORDER BY "+ IPCCDataExportTimeSeries.PLOT_ID + " DESC"; // Remove trailing comma from list of years + + List luData = getJdbcTemplate().query( + sqlSelect + , + getRowMapper() + ); + + selectedYears+= "area"; // so the area columns appears too + luData.add( 0, selectedYears.split(",") ); + return luData; } } From 6804be6e6794acf6cbd4328be1d24037a9056da2 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:00 +0100 Subject: [PATCH 0367/1620] New translations IPCCDataExportPerPlotCSV.java (Spanish) --- .../earth/app/view/Messages_es.properties | 244 ++++-------------- 1 file changed, 56 insertions(+), 188 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index c15098bfaa..21431b088f 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,209 +1,77 @@ package org.openforis.collect.earth.ipcc; import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; -import java.util.ArrayList; import java.util.List; -import org.apache.poi.hssf.usermodel.HSSFWorkbook; -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.CellStyle; -import org.apache.poi.ss.usermodel.Font; -import org.apache.poi.ss.usermodel.IndexedColors; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.ss.usermodel.Workbook; import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +import org.openforis.collect.earth.app.service.RegionCalculationUtils; +import org.openforis.collect.earth.app.service.SchemaService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component -public class IPCCDataExportMatrixExtendedExcel extends IPCCDataExportTimeSeries { +public class IPCCDataExportPerPlotCSV extends IPCCDataExportCSV { - Logger logger = LoggerFactory.getLogger(IPCCDataExportMatrixExtendedExcel.class); + private String schemaName; - public IPCCDataExportMatrixExtendedExcel() { - super(); + Logger logger = LoggerFactory.getLogger(IPCCDataExportPerPlotCSV.class); + + @Autowired + private SchemaService schemaService; + + public IPCCDataExportPerPlotCSV() { setExportTypeUsed(ExportType.IPCC); } - @Override - protected File generateFile(List strataData) throws IOException { - File excelDestination = File.createTempFile("LuMatrixTimeseries_EXTENDED", ".xls"); - excelDestination.deleteOnExit(); - // Create a Workbook - try(Workbook workbook = new HSSFWorkbook() ) {// new HSSFWorkbook() for generating `.xls` file - - /* - * CreationHelper helps us create instances of various things like DataFormat, - * Hyperlink, RichTextString etc, in a format (HSSF, XSSF) independent way - */ - // CreationHelper createHelper = workbook.getCreationHelper(); - - // Create a Font for styling header cells - Font cornerFont = workbook.createFont(); - cornerFont.setBold(true); - cornerFont.setFontHeightInPoints((short) 15); - cornerFont.setColor(IndexedColors.GREY_80_PERCENT.getIndex()); - // Create a CellStyle with the font - CellStyle cornerCellStyle = workbook.createCellStyle(); - cornerCellStyle.setFont(cornerFont); - - // Create a Font for styling header cells - Font headerFont = workbook.createFont(); - headerFont.setBold(true); - headerFont.setFontHeightInPoints((short) 14); - headerFont.setColor(IndexedColors.DARK_TEAL.getIndex()); - // Create a CellStyle with the font - CellStyle headerCellStyle = workbook.createCellStyle(); - headerCellStyle.setFont(headerFont); - - // Create a Font for styling non-diagonal cells - Font stdFont = workbook.createFont(); - stdFont.setBold(false); - stdFont.setFontHeightInPoints((short) 14); - stdFont.setColor(IndexedColors.DARK_RED.getIndex()); - // Create a CellStyle with the font - CellStyle stdCellStyle = workbook.createCellStyle(); - stdCellStyle.setFont(stdFont); - - // Create a Font for styling diagonal cells - Font diagonalFont = workbook.createFont(); - diagonalFont.setBold(true); - diagonalFont.setFontHeightInPoints((short) 14); - diagonalFont.setColor(IndexedColors.DARK_GREEN.getIndex()); - // Create a CellStyle with the font - CellStyle diagonalCellStyle = workbook.createCellStyle(); - diagonalCellStyle.setFont(diagonalFont); - - // Create a Font for styling diagonal cells - Font strataFont = workbook.createFont(); - strataFont.setBold(true); - strataFont.setFontHeightInPoints((short) 16); - strataFont.setColor(IndexedColors.BLUE.getIndex()); - // Create a CellStyle with the font - CellStyle strataCellStyle = workbook.createCellStyle(); - strataCellStyle.setFont(strataFont); - - List availableYears = new ArrayList(); - for (StratumPerYearData yearDataStratumP : strataData) { - if (!availableYears.contains(Integer.valueOf(yearDataStratumP.getYear()))) { - availableYears.add(yearDataStratumP.getYear()); - } - } - - for (Integer yearToOutput : availableYears) { - - int rowNum = 0; - // Create a Sheet - Sheet sheet = workbook.createSheet("LU Matrix " + yearToOutput + "-" + (yearToOutput + 1)); - - for (StratumPerYearData yearDataStratum : strataData) { - // Get the stratums for the year - if (yearDataStratum.getYear() != yearToOutput) { - continue; // The stratum contains data for a different year that we are going to output in - // the sheet - } - - - sheet.createRow(rowNum++); // create empty row - - // Create a Row - Row infoRow = sheet.createRow(rowNum++); - Cell cell = infoRow.createCell(0); - cell.setCellStyle(headerCellStyle); - cell.setCellValue("Climate"); - cell = infoRow.createCell(1); - cell.setCellStyle(strataCellStyle); - cell.setCellValue(yearDataStratum.getClimate()); - - infoRow = sheet.createRow(rowNum++); - cell = infoRow.createCell(0); - cell.setCellStyle(headerCellStyle); - cell.setCellValue("Soil"); - cell = infoRow.createCell(1); - cell.setCellStyle(strataCellStyle); - cell.setCellValue(yearDataStratum.getSoil()); - - infoRow = sheet.createRow(rowNum++); - cell = infoRow.createCell(0); - cell.setCellStyle(headerCellStyle); - cell.setCellValue("Global Ecological Zone (GEZ)"); - cell = infoRow.createCell(1); - cell.setCellStyle(strataCellStyle); - cell.setCellValue(yearDataStratum.getGez()); - - // Add some empty rows before next section - sheet.createRow(rowNum++); - - // Create a Row - Row headerRow = sheet.createRow(rowNum++); - cell = headerRow.createCell(0); - cell.setCellValue( - "Transition " + yearDataStratum.getYear() + "/" + (yearDataStratum.getYear() + 1)); - cell.setCellStyle(cornerCellStyle); - - MatrixSheet matrix = new MatrixSheet(yearDataStratum); - int cellPosition = 1; - for (LandUseSubdivision subdivision : matrix.getSubdivisions()) { - cell = headerRow.createCell(cellPosition++); - cell.setCellValue(subdivision.toString()); - cell.setCellStyle(headerCellStyle); - } - - int colNum = 0; - for (LandUseSubdivision subdivisionH : matrix.getSubdivisions()) { - colNum = 0; - Row row = sheet.createRow(rowNum++); - - Cell columnCell = row.createCell(colNum++); - columnCell.setCellStyle(headerCellStyle); - columnCell.setCellValue(subdivisionH.toString()); - - colNum = 1; - for (LandUseSubdivision subdivisionV : matrix.getSubdivisions()) { - - cell = row.createCell(colNum++); - cell.setCellValue(IPCCDataExportMatrixExcel - .findLuData(subdivisionH, subdivisionV, matrix.getYearData().getLuData()) - .getAreaHa()); - if (subdivisionH.equals(subdivisionV)) { - cell.setCellStyle(diagonalCellStyle); - } else { - cell.setCellStyle(stdCellStyle); - } - } - - } - - // Add some empty rows before next section - sheet.createRow(rowNum++); - sheet.createRow(rowNum++); - sheet.createRow(rowNum++); - - - // Resize all columns to fit the content size - for (int j = 0; j < colNum; j++) { - sheet.autoSizeColumn(j); - } - - } - - } - - // Write the output to a file - try (FileOutputStream fileOut = new FileOutputStream(excelDestination)) { - workbook.write(fileOut); - } catch (IOException e) { - logger.error("Error generating Excel file", e); - } - } catch (Exception e) { - logger.error("Error generating Excel data", e); + public File generateTimeseriesData( int startYear, int endYear ) throws IOException { + schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); + + List luCombinations = generateLUCombinations(startYear, endYear); + + return createCsv( luCombinations); + } + + + private List generateLUCombinations(int startYear, int endYear) { + + String selectedYears = IPCCDataExportTimeSeries.PLOT_ID + + ", " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_LABEL + + ", " + IPCCDataExportTimeSeries.SOIL_COLUMN_LABEL + + ", " + IPCCDataExportTimeSeries.GEZ_COLUMN_LABEL + ", " ; + + for( int year = startYear ; year <= endYear; year++ ) { + + selectedYears += IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + ","; + } - return excelDestination; + + String sqlSelect = "select " + + selectedYears + + RegionCalculationUtils.EXPANSION_FACTOR + + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.SOIL_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.CLIMATE_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.GEZ_TABLE + + + " where " + + IPCCDataExportTimeSeries.SOIL_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.SOIL_COLUMN_ID + + " and " + + IPCCDataExportTimeSeries.CLIMATE_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_ID + + " and " + + IPCCDataExportTimeSeries.GEZ_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.GEZ_COLUMN_ID + + + " ORDER BY "+ IPCCDataExportTimeSeries.PLOT_ID + " DESC"; // Remove trailing comma from list of years + + List luData = getJdbcTemplate().query( + sqlSelect + , + getRowMapper() + ); + + selectedYears+= "area"; // so the area columns appears too + luData.add( 0, selectedYears.split(",") ); + return luData; } } From 4a65e60f85eee370429e517f8571bd16ccd725fe Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:02 +0100 Subject: [PATCH 0368/1620] New translations IPCCDataExportPerPlotCSV.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 244 ++++-------------- 1 file changed, 56 insertions(+), 188 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index c15098bfaa..21431b088f 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,209 +1,77 @@ package org.openforis.collect.earth.ipcc; import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; -import java.util.ArrayList; import java.util.List; -import org.apache.poi.hssf.usermodel.HSSFWorkbook; -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.CellStyle; -import org.apache.poi.ss.usermodel.Font; -import org.apache.poi.ss.usermodel.IndexedColors; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.ss.usermodel.Workbook; import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +import org.openforis.collect.earth.app.service.RegionCalculationUtils; +import org.openforis.collect.earth.app.service.SchemaService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component -public class IPCCDataExportMatrixExtendedExcel extends IPCCDataExportTimeSeries { +public class IPCCDataExportPerPlotCSV extends IPCCDataExportCSV { - Logger logger = LoggerFactory.getLogger(IPCCDataExportMatrixExtendedExcel.class); + private String schemaName; - public IPCCDataExportMatrixExtendedExcel() { - super(); + Logger logger = LoggerFactory.getLogger(IPCCDataExportPerPlotCSV.class); + + @Autowired + private SchemaService schemaService; + + public IPCCDataExportPerPlotCSV() { setExportTypeUsed(ExportType.IPCC); } - @Override - protected File generateFile(List strataData) throws IOException { - File excelDestination = File.createTempFile("LuMatrixTimeseries_EXTENDED", ".xls"); - excelDestination.deleteOnExit(); - // Create a Workbook - try(Workbook workbook = new HSSFWorkbook() ) {// new HSSFWorkbook() for generating `.xls` file - - /* - * CreationHelper helps us create instances of various things like DataFormat, - * Hyperlink, RichTextString etc, in a format (HSSF, XSSF) independent way - */ - // CreationHelper createHelper = workbook.getCreationHelper(); - - // Create a Font for styling header cells - Font cornerFont = workbook.createFont(); - cornerFont.setBold(true); - cornerFont.setFontHeightInPoints((short) 15); - cornerFont.setColor(IndexedColors.GREY_80_PERCENT.getIndex()); - // Create a CellStyle with the font - CellStyle cornerCellStyle = workbook.createCellStyle(); - cornerCellStyle.setFont(cornerFont); - - // Create a Font for styling header cells - Font headerFont = workbook.createFont(); - headerFont.setBold(true); - headerFont.setFontHeightInPoints((short) 14); - headerFont.setColor(IndexedColors.DARK_TEAL.getIndex()); - // Create a CellStyle with the font - CellStyle headerCellStyle = workbook.createCellStyle(); - headerCellStyle.setFont(headerFont); - - // Create a Font for styling non-diagonal cells - Font stdFont = workbook.createFont(); - stdFont.setBold(false); - stdFont.setFontHeightInPoints((short) 14); - stdFont.setColor(IndexedColors.DARK_RED.getIndex()); - // Create a CellStyle with the font - CellStyle stdCellStyle = workbook.createCellStyle(); - stdCellStyle.setFont(stdFont); - - // Create a Font for styling diagonal cells - Font diagonalFont = workbook.createFont(); - diagonalFont.setBold(true); - diagonalFont.setFontHeightInPoints((short) 14); - diagonalFont.setColor(IndexedColors.DARK_GREEN.getIndex()); - // Create a CellStyle with the font - CellStyle diagonalCellStyle = workbook.createCellStyle(); - diagonalCellStyle.setFont(diagonalFont); - - // Create a Font for styling diagonal cells - Font strataFont = workbook.createFont(); - strataFont.setBold(true); - strataFont.setFontHeightInPoints((short) 16); - strataFont.setColor(IndexedColors.BLUE.getIndex()); - // Create a CellStyle with the font - CellStyle strataCellStyle = workbook.createCellStyle(); - strataCellStyle.setFont(strataFont); - - List availableYears = new ArrayList(); - for (StratumPerYearData yearDataStratumP : strataData) { - if (!availableYears.contains(Integer.valueOf(yearDataStratumP.getYear()))) { - availableYears.add(yearDataStratumP.getYear()); - } - } - - for (Integer yearToOutput : availableYears) { - - int rowNum = 0; - // Create a Sheet - Sheet sheet = workbook.createSheet("LU Matrix " + yearToOutput + "-" + (yearToOutput + 1)); - - for (StratumPerYearData yearDataStratum : strataData) { - // Get the stratums for the year - if (yearDataStratum.getYear() != yearToOutput) { - continue; // The stratum contains data for a different year that we are going to output in - // the sheet - } - - - sheet.createRow(rowNum++); // create empty row - - // Create a Row - Row infoRow = sheet.createRow(rowNum++); - Cell cell = infoRow.createCell(0); - cell.setCellStyle(headerCellStyle); - cell.setCellValue("Climate"); - cell = infoRow.createCell(1); - cell.setCellStyle(strataCellStyle); - cell.setCellValue(yearDataStratum.getClimate()); - - infoRow = sheet.createRow(rowNum++); - cell = infoRow.createCell(0); - cell.setCellStyle(headerCellStyle); - cell.setCellValue("Soil"); - cell = infoRow.createCell(1); - cell.setCellStyle(strataCellStyle); - cell.setCellValue(yearDataStratum.getSoil()); - - infoRow = sheet.createRow(rowNum++); - cell = infoRow.createCell(0); - cell.setCellStyle(headerCellStyle); - cell.setCellValue("Global Ecological Zone (GEZ)"); - cell = infoRow.createCell(1); - cell.setCellStyle(strataCellStyle); - cell.setCellValue(yearDataStratum.getGez()); - - // Add some empty rows before next section - sheet.createRow(rowNum++); - - // Create a Row - Row headerRow = sheet.createRow(rowNum++); - cell = headerRow.createCell(0); - cell.setCellValue( - "Transition " + yearDataStratum.getYear() + "/" + (yearDataStratum.getYear() + 1)); - cell.setCellStyle(cornerCellStyle); - - MatrixSheet matrix = new MatrixSheet(yearDataStratum); - int cellPosition = 1; - for (LandUseSubdivision subdivision : matrix.getSubdivisions()) { - cell = headerRow.createCell(cellPosition++); - cell.setCellValue(subdivision.toString()); - cell.setCellStyle(headerCellStyle); - } - - int colNum = 0; - for (LandUseSubdivision subdivisionH : matrix.getSubdivisions()) { - colNum = 0; - Row row = sheet.createRow(rowNum++); - - Cell columnCell = row.createCell(colNum++); - columnCell.setCellStyle(headerCellStyle); - columnCell.setCellValue(subdivisionH.toString()); - - colNum = 1; - for (LandUseSubdivision subdivisionV : matrix.getSubdivisions()) { - - cell = row.createCell(colNum++); - cell.setCellValue(IPCCDataExportMatrixExcel - .findLuData(subdivisionH, subdivisionV, matrix.getYearData().getLuData()) - .getAreaHa()); - if (subdivisionH.equals(subdivisionV)) { - cell.setCellStyle(diagonalCellStyle); - } else { - cell.setCellStyle(stdCellStyle); - } - } - - } - - // Add some empty rows before next section - sheet.createRow(rowNum++); - sheet.createRow(rowNum++); - sheet.createRow(rowNum++); - - - // Resize all columns to fit the content size - for (int j = 0; j < colNum; j++) { - sheet.autoSizeColumn(j); - } - - } - - } - - // Write the output to a file - try (FileOutputStream fileOut = new FileOutputStream(excelDestination)) { - workbook.write(fileOut); - } catch (IOException e) { - logger.error("Error generating Excel file", e); - } - } catch (Exception e) { - logger.error("Error generating Excel data", e); + public File generateTimeseriesData( int startYear, int endYear ) throws IOException { + schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); + + List luCombinations = generateLUCombinations(startYear, endYear); + + return createCsv( luCombinations); + } + + + private List generateLUCombinations(int startYear, int endYear) { + + String selectedYears = IPCCDataExportTimeSeries.PLOT_ID + + ", " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_LABEL + + ", " + IPCCDataExportTimeSeries.SOIL_COLUMN_LABEL + + ", " + IPCCDataExportTimeSeries.GEZ_COLUMN_LABEL + ", " ; + + for( int year = startYear ; year <= endYear; year++ ) { + + selectedYears += IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + ","; + } - return excelDestination; + + String sqlSelect = "select " + + selectedYears + + RegionCalculationUtils.EXPANSION_FACTOR + + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.SOIL_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.CLIMATE_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.GEZ_TABLE + + + " where " + + IPCCDataExportTimeSeries.SOIL_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.SOIL_COLUMN_ID + + " and " + + IPCCDataExportTimeSeries.CLIMATE_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_ID + + " and " + + IPCCDataExportTimeSeries.GEZ_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.GEZ_COLUMN_ID + + + " ORDER BY "+ IPCCDataExportTimeSeries.PLOT_ID + " DESC"; // Remove trailing comma from list of years + + List luData = getJdbcTemplate().query( + sqlSelect + , + getRowMapper() + ); + + selectedYears+= "area"; // so the area columns appears too + luData.add( 0, selectedYears.split(",") ); + return luData; } } From 189d1fe8504057a6e1afa140187f7c8108062460 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:03 +0100 Subject: [PATCH 0369/1620] New translations IPCCDataExportTimeSeries.java (French) --- .../earth/app/view/Messages_fr.properties | 164 ++++++++++++++---- 1 file changed, 128 insertions(+), 36 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 21431b088f..c94c09f2e8 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -2,76 +2,168 @@ package org.openforis.collect.earth.ipcc; import java.io.File; import java.io.IOException; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; import java.util.List; import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.RDBConnector; import org.openforis.collect.earth.app.service.RegionCalculationUtils; import org.openforis.collect.earth.app.service.SchemaService; +import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; +import org.openforis.collect.earth.ipcc.model.StratumObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Component; @Component -public class IPCCDataExportPerPlotCSV extends IPCCDataExportCSV { - +public abstract class IPCCDataExportTimeSeries extends RDBConnector { + + public static final String CLIMATE_COLUMN = "climate"; + public static final String GEZ_COLUMN = "gez"; + public static final String SOIL_COLUMN = "soil"; + + public static final String CLIMATE_COLUMN_VALUE = "climate_zones"; + public static final String CLIMATE_TABLE = CLIMATE_COLUMN_VALUE + "_code"; + public static final String CLIMATE_COLUMN_LABEL = CLIMATE_COLUMN_VALUE + "_label"; + public static final String CLIMATE_COLUMN_ID = CLIMATE_COLUMN_VALUE + "_code_id"; + public static final String CLIMATE_COLUMN_IN_PLOT = "climate_code_id"; + + public static final String GEZ_COLUMN_VALUE = "ecological_zones"; + public static final String GEZ_TABLE = GEZ_COLUMN_VALUE + "_code"; + public static final String GEZ_COLUMN_LABEL = GEZ_COLUMN_VALUE + "_label"; + public static final String GEZ_COLUMN_ID = GEZ_COLUMN_VALUE + "_code_id"; + public static final String GEZ_COLUMN_IN_PLOT = "gez_code_id"; + + + public static final String SOIL_COLUMN_VALUE = "soil_types"; + public static final String SOIL_TABLE = SOIL_COLUMN_VALUE + "_code"; + public static final String SOIL_COLUMN_LABEL = SOIL_COLUMN_VALUE + "_label"; + public static final String SOIL_COLUMN_ID = SOIL_COLUMN_VALUE + "_code_id"; + public static final String SOIL_COLUMN_IN_PLOT = "soil_code_id"; + private String schemaName; + public static final String PLOT_TABLE = "plot"; + public static final String PLOT_ID = "id"; - Logger logger = LoggerFactory.getLogger(IPCCDataExportPerPlotCSV.class); + Logger logger = LoggerFactory.getLogger(IPCCDataExportTimeSeries.class); @Autowired private SchemaService schemaService; - public IPCCDataExportPerPlotCSV() { + + public IPCCDataExportTimeSeries() { setExportTypeUsed(ExportType.IPCC); } public File generateTimeseriesData( int startYear, int endYear ) throws IOException { + schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - List luCombinations = generateLUCombinations(startYear, endYear); + List strataClimate = getStrataClimate(); + List strataSoil = getStrataSoil(); + List strataGEZ = getStrataGEZ(); + + List strataData = new ArrayList(); + + for (int year = startYear; year < endYear; year++) { + for (StratumObject gez : strataGEZ) { + for (StratumObject climate : strataClimate) { + for (StratumObject soil : strataSoil) { + E yearLuData = (E) generateLUTimeseriesForStrata(year, gez, climate, soil); + if (yearLuData != null) + strataData.add(yearLuData); + } + } + } + } - return createCsv( luCombinations); - } + return generateFile( strataData); + } - private List generateLUCombinations(int startYear, int endYear) { - - String selectedYears = IPCCDataExportTimeSeries.PLOT_ID + - ", " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_LABEL + - ", " + IPCCDataExportTimeSeries.SOIL_COLUMN_LABEL + - ", " + IPCCDataExportTimeSeries.GEZ_COLUMN_LABEL + ", " ; - - for( int year = startYear ; year <= endYear; year++ ) { + protected abstract File generateFile( List strataData) throws IOException; - selectedYears += IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + ","; + private StratumPerYearData generateLUTimeseriesForStrata(int year, StratumObject gez, StratumObject climate,StratumObject soil) { + List luData = getJdbcTemplate().query( + + "select " + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + + ", " + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1) + ", sum( " + + RegionCalculationUtils.EXPANSION_FACTOR + ")" + + " from " + schemaName + PLOT_TABLE + + " where " + + CLIMATE_COLUMN + " = " + climate.getValue() + " and " + SOIL_COLUMN + " = " + soil.getValue() + " and " + GEZ_COLUMN + " = " + gez.getValue() + + " GROUP BY " + + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + "," + + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1), + + getRowMapper() + + ); + + if (luData.size() == 0) { // No LU data for the climate, soil, gez combination + return null; } - String sqlSelect = "select " - + selectedYears - + RegionCalculationUtils.EXPANSION_FACTOR - + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.SOIL_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.CLIMATE_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.GEZ_TABLE + StratumPerYearData strataPerYearData = new StratumPerYearData(year, climate.getLabel(), soil.getLabel(), gez.getLabel()); + strataPerYearData.setLuData(luData); + return strataPerYearData; + } + + protected RowMapper getRowMapper() { + return new RowMapper() { + @Override + public LUDataPerYear mapRow(ResultSet rs, int rowNum) throws SQLException { - + " where " - + IPCCDataExportTimeSeries.SOIL_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.SOIL_COLUMN_ID - + " and " - + IPCCDataExportTimeSeries.CLIMATE_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_ID - + " and " - + IPCCDataExportTimeSeries.GEZ_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.GEZ_COLUMN_ID + String categoryInitial = rs.getString(1); + String categoryFinal = rs.getString(2); + String subdivInitial = rs.getString(3); + String subdivFinal = rs.getString(4); - + " ORDER BY "+ IPCCDataExportTimeSeries.PLOT_ID + " DESC"; // Remove trailing comma from list of years + return new LUDataPerYear( + LandUseSubdivisionUtils.getSubdivision(categoryInitial, subdivInitial), + LandUseSubdivisionUtils.getSubdivision(categoryFinal, subdivFinal), + rs.getDouble(5) // area + ); + } + }; + } + + private List getStrataClimate() { + return distinctValue(CLIMATE_COLUMN_VALUE, CLIMATE_COLUMN_LABEL, CLIMATE_TABLE, CLIMATE_COLUMN_IN_PLOT); + } + + private List getStrataSoil() { + return distinctValue(SOIL_COLUMN_VALUE, SOIL_COLUMN_LABEL, SOIL_TABLE, SOIL_COLUMN_IN_PLOT); + } + + private List getStrataGEZ() { + return distinctValue(GEZ_COLUMN_VALUE, GEZ_COLUMN_LABEL, GEZ_TABLE, GEZ_COLUMN_IN_PLOT ); + } + + private List distinctValue(String valueColumn, String labelColumn, String table, String plotColumnId) { + + return getJdbcTemplate().query( + "SELECT DISTINCT(" + valueColumn +"),"+ labelColumn + + " FROM " + schemaName + table + ", " + schemaName + PLOT_TABLE + + " WHERE " + PLOT_TABLE + "." + plotColumnId + " = " + table + "." + table + "_id" + , + new RowMapper() { + @Override + public StratumObject mapRow(ResultSet rs, int rowNum) throws SQLException { - List luData = getJdbcTemplate().query( - sqlSelect - , - getRowMapper() - ); + return new StratumObject( rs.getString(valueColumn), rs.getString(labelColumn) ); + } - selectedYears+= "area"; // so the area columns appears too - luData.add( 0, selectedYears.split(",") ); - return luData; + }); } } From 5c2f36fa858d11a0500a1b65fbdc93c6af682a12 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:04 +0100 Subject: [PATCH 0370/1620] New translations IPCCDataExportMatrixExcel.java (French) --- .../earth/app/view/Messages_fr.properties | 247 +++++++++++------- 1 file changed, 156 insertions(+), 91 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index c94c09f2e8..1230b9a5c0 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,123 +1,95 @@ package org.openforis.collect.earth.ipcc; import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; +import java.util.Collection; import java.util.List; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections.Predicate; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.Font; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; import org.openforis.collect.earth.app.service.ExportType; import org.openforis.collect.earth.app.service.RDBConnector; import org.openforis.collect.earth.app.service.RegionCalculationUtils; import org.openforis.collect.earth.app.service.SchemaService; import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; -import org.openforis.collect.earth.ipcc.model.StratumObject; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Component; +import liquibase.pro.packaged.E; + @Component -public abstract class IPCCDataExportTimeSeries extends RDBConnector { +public class IPCCDataExportMatrixExcel extends RDBConnector { - public static final String CLIMATE_COLUMN = "climate"; - public static final String GEZ_COLUMN = "gez"; - public static final String SOIL_COLUMN = "soil"; - - public static final String CLIMATE_COLUMN_VALUE = "climate_zones"; - public static final String CLIMATE_TABLE = CLIMATE_COLUMN_VALUE + "_code"; - public static final String CLIMATE_COLUMN_LABEL = CLIMATE_COLUMN_VALUE + "_label"; - public static final String CLIMATE_COLUMN_ID = CLIMATE_COLUMN_VALUE + "_code_id"; - public static final String CLIMATE_COLUMN_IN_PLOT = "climate_code_id"; - - public static final String GEZ_COLUMN_VALUE = "ecological_zones"; - public static final String GEZ_TABLE = GEZ_COLUMN_VALUE + "_code"; - public static final String GEZ_COLUMN_LABEL = GEZ_COLUMN_VALUE + "_label"; - public static final String GEZ_COLUMN_ID = GEZ_COLUMN_VALUE + "_code_id"; - public static final String GEZ_COLUMN_IN_PLOT = "gez_code_id"; - - - public static final String SOIL_COLUMN_VALUE = "soil_types"; - public static final String SOIL_TABLE = SOIL_COLUMN_VALUE + "_code"; - public static final String SOIL_COLUMN_LABEL = SOIL_COLUMN_VALUE + "_label"; - public static final String SOIL_COLUMN_ID = SOIL_COLUMN_VALUE + "_code_id"; - public static final String SOIL_COLUMN_IN_PLOT = "soil_code_id"; - private String schemaName; - public static final String PLOT_TABLE = "plot"; - public static final String PLOT_ID = "id"; - - Logger logger = LoggerFactory.getLogger(IPCCDataExportTimeSeries.class); + + Logger logger = LoggerFactory.getLogger(IPCCDataExportMatrixExcel.class); @Autowired private SchemaService schemaService; - - public IPCCDataExportTimeSeries() { + public IPCCDataExportMatrixExcel() { setExportTypeUsed(ExportType.IPCC); } public File generateTimeseriesData( int startYear, int endYear ) throws IOException { - schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - List strataClimate = getStrataClimate(); - List strataSoil = getStrataSoil(); - List strataGEZ = getStrataGEZ(); - - List strataData = new ArrayList(); + List matrixSheets = new ArrayList(); for (int year = startYear; year < endYear; year++) { - for (StratumObject gez : strataGEZ) { - for (StratumObject climate : strataClimate) { - for (StratumObject soil : strataSoil) { - E yearLuData = (E) generateLUTimeseriesForStrata(year, gez, climate, soil); - if (yearLuData != null) - strataData.add(yearLuData); - } - } - } + MatrixSheet yearMatrixData = generateLUMatrixForYear(year); + if (yearMatrixData != null) + matrixSheets.add(yearMatrixData); } - return generateFile( strataData); - + return createExcel( matrixSheets); } - protected abstract File generateFile( List strataData) throws IOException; - private StratumPerYearData generateLUTimeseriesForStrata(int year, StratumObject gez, StratumObject climate,StratumObject soil) { + private MatrixSheet generateLUMatrixForYear(int year) { List luData = getJdbcTemplate().query( - - "select " + IPCCSurveyAdapter.getIpccCategoryAttrName(year) - + ", " + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1) + ", sum( " - + RegionCalculationUtils.EXPANSION_FACTOR + ")" - + " from " + schemaName + PLOT_TABLE - + " where " - + CLIMATE_COLUMN + " = " + climate.getValue() + " and " + SOIL_COLUMN + " = " + soil.getValue() + " and " + GEZ_COLUMN + " = " + gez.getValue() - + " GROUP BY " - + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + "," - + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1), - - getRowMapper() - - ); + "select " + + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " + + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1) + "," + + "sum( " + RegionCalculationUtils.EXPANSION_FACTOR + ")" + + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE + + " GROUP BY " + + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + "," + + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1), + getRowMapper() + ); if (luData.size() == 0) { // No LU data for the climate, soil, gez combination return null; } - StratumPerYearData strataPerYearData = new StratumPerYearData(year, climate.getLabel(), soil.getLabel(), gez.getLabel()); - strataPerYearData.setLuData(luData); - return strataPerYearData; + YearData yearData = new YearData(year, luData); + + return new MatrixSheet( yearData ); } + protected RowMapper getRowMapper() { return new RowMapper() { @Override @@ -137,33 +109,126 @@ public abstract class IPCCDataExportTimeSeries extends RDBConnector { }; } - private List getStrataClimate() { - return distinctValue(CLIMATE_COLUMN_VALUE, CLIMATE_COLUMN_LABEL, CLIMATE_TABLE, CLIMATE_COLUMN_IN_PLOT); - } + protected static LUDataPerYear findLuData( LandUseSubdivision initialSubdivision, LandUseSubdivision finalSubdivision, List luData ) { + Collection result = CollectionUtils.select(luData, new Predicate() { + public boolean evaluate(Object a) { + return + ( (LUDataPerYear) a ).getLu().equals(initialSubdivision) + && + ( (LUDataPerYear) a ).getLuNextYear().equals(finalSubdivision); + } + }); + if( result.size() == 1 ) + return (LUDataPerYear) result.toArray(new LUDataPerYear[result.size()])[0]; + else + return new LUDataPerYear(initialSubdivision, finalSubdivision, 0); - private List getStrataSoil() { - return distinctValue(SOIL_COLUMN_VALUE, SOIL_COLUMN_LABEL, SOIL_TABLE, SOIL_COLUMN_IN_PLOT); } - private List getStrataGEZ() { - return distinctValue(GEZ_COLUMN_VALUE, GEZ_COLUMN_LABEL, GEZ_TABLE, GEZ_COLUMN_IN_PLOT ); - } + private File createExcel( List matrixData ) throws IOException { + File excelDestination = File.createTempFile("LuMatrixTimeseries", ".xls"); + excelDestination.deleteOnExit(); + // Create a Workbook + try (Workbook workbook = new HSSFWorkbook() ){ + /* CreationHelper helps us create instances of various things like DataFormat, + Hyperlink, RichTextString etc, in a format (HSSF, XSSF) independent way */ + //CreationHelper createHelper = workbook.getCreationHelper(); + + // Create a Font for styling header cells + Font cornerFont = workbook.createFont(); + cornerFont.setBold(true); + cornerFont.setFontHeightInPoints((short) 15); + cornerFont.setColor(IndexedColors.GREY_80_PERCENT.getIndex()); + // Create a CellStyle with the font + CellStyle cornerCellStyle = workbook.createCellStyle(); + cornerCellStyle.setFont(cornerFont); + + // Create a Font for styling header cells + Font headerFont = workbook.createFont(); + headerFont.setBold(true); + headerFont.setFontHeightInPoints((short) 14); + headerFont.setColor(IndexedColors.DARK_TEAL.getIndex()); + // Create a CellStyle with the font + CellStyle headerCellStyle = workbook.createCellStyle(); + headerCellStyle.setFont(headerFont); + + // Create a Font for styling non-diagonal cells + Font stdFont = workbook.createFont(); + stdFont.setBold(false); + stdFont.setFontHeightInPoints((short) 14); + stdFont.setColor(IndexedColors.DARK_RED.getIndex()); + // Create a CellStyle with the font + CellStyle stdCellStyle = workbook.createCellStyle(); + stdCellStyle.setFont(stdFont); + + // Create a Font for styling non-diagonal cells + Font diagonalFont = workbook.createFont(); + diagonalFont.setBold(true); + diagonalFont.setFontHeightInPoints((short) 14); + diagonalFont.setColor(IndexedColors.DARK_GREEN.getIndex()); + // Create a CellStyle with the font + CellStyle diagonalCellStyle = workbook.createCellStyle(); + diagonalCellStyle.setFont(diagonalFont); + + for (MatrixSheet matrix : matrixData) { + // Create a Sheet + Sheet sheet = workbook.createSheet("LU Matrix " + matrix.getYearData().getYear() + "-" + (matrix.getYearData().getYear()+1 ) ); + + // Create a Row + Row headerRow = sheet.createRow(0); + Cell cell = headerRow.createCell(0); + cell.setCellValue( "Transition " + matrix.getYearData().getYear() + "/" + ( matrix.getYearData().getYear() +1 ) ); + cell.setCellStyle(cornerCellStyle); + + int i = 1; + for (LandUseSubdivision subdivision : matrix.getSubdivisions()) { + cell = headerRow.createCell(i++); + cell.setCellValue(subdivision.toString()); + cell.setCellStyle(headerCellStyle); + } - private List distinctValue(String valueColumn, String labelColumn, String table, String plotColumnId) { + + int rowNum = 1; + int colNum = 0; + for (LandUseSubdivision subdivisionH : matrix.getSubdivisions()) { + colNum = 0; + Row row = sheet.createRow(rowNum++); + + Cell columnCell = row.createCell(colNum++); + columnCell.setCellStyle(headerCellStyle); + columnCell.setCellValue(subdivisionH.toString()); + + colNum = 1; + for (LandUseSubdivision subdivisionV : matrix.getSubdivisions()) { + + cell = row.createCell(colNum++); + cell.setCellValue( findLuData( subdivisionH, subdivisionV, matrix.getYearData().getLuData() ).getAreaHa() ); + if( subdivisionH.equals( subdivisionV ) ) { + cell.setCellStyle(diagonalCellStyle); + }else { + cell.setCellStyle(stdCellStyle); + } + } - return getJdbcTemplate().query( - "SELECT DISTINCT(" + valueColumn +"),"+ labelColumn + - " FROM " + schemaName + table + ", " + schemaName + PLOT_TABLE + - " WHERE " + PLOT_TABLE + "." + plotColumnId + " = " + table + "." + table + "_id" - , - new RowMapper() { - @Override - public StratumObject mapRow(ResultSet rs, int rowNum) throws SQLException { + } - return new StratumObject( rs.getString(valueColumn), rs.getString(labelColumn) ); - } + // Resize all columns to fit the content size + for(int j = 0; j < colNum; j++) { + sheet.autoSizeColumn(j); + } - }); + } + + // Write the output to a file + try( FileOutputStream fileOut = new FileOutputStream(excelDestination) ){ + workbook.write(fileOut); + } catch (IOException e) { + logger.error("Error generating Excel file", e); + } + } catch (Exception e) { + logger.error("Error generating Excel data", e); + } + return excelDestination; } } From c76b530cc4db2c94cbafe406fa5b739883ebc85d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:05 +0100 Subject: [PATCH 0371/1620] New translations IPCCDataExportTimeSeries.java (Spanish) --- .../earth/app/view/Messages_es.properties | 164 ++++++++++++++---- 1 file changed, 128 insertions(+), 36 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 21431b088f..c94c09f2e8 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -2,76 +2,168 @@ package org.openforis.collect.earth.ipcc; import java.io.File; import java.io.IOException; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; import java.util.List; import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.RDBConnector; import org.openforis.collect.earth.app.service.RegionCalculationUtils; import org.openforis.collect.earth.app.service.SchemaService; +import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; +import org.openforis.collect.earth.ipcc.model.StratumObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Component; @Component -public class IPCCDataExportPerPlotCSV extends IPCCDataExportCSV { - +public abstract class IPCCDataExportTimeSeries extends RDBConnector { + + public static final String CLIMATE_COLUMN = "climate"; + public static final String GEZ_COLUMN = "gez"; + public static final String SOIL_COLUMN = "soil"; + + public static final String CLIMATE_COLUMN_VALUE = "climate_zones"; + public static final String CLIMATE_TABLE = CLIMATE_COLUMN_VALUE + "_code"; + public static final String CLIMATE_COLUMN_LABEL = CLIMATE_COLUMN_VALUE + "_label"; + public static final String CLIMATE_COLUMN_ID = CLIMATE_COLUMN_VALUE + "_code_id"; + public static final String CLIMATE_COLUMN_IN_PLOT = "climate_code_id"; + + public static final String GEZ_COLUMN_VALUE = "ecological_zones"; + public static final String GEZ_TABLE = GEZ_COLUMN_VALUE + "_code"; + public static final String GEZ_COLUMN_LABEL = GEZ_COLUMN_VALUE + "_label"; + public static final String GEZ_COLUMN_ID = GEZ_COLUMN_VALUE + "_code_id"; + public static final String GEZ_COLUMN_IN_PLOT = "gez_code_id"; + + + public static final String SOIL_COLUMN_VALUE = "soil_types"; + public static final String SOIL_TABLE = SOIL_COLUMN_VALUE + "_code"; + public static final String SOIL_COLUMN_LABEL = SOIL_COLUMN_VALUE + "_label"; + public static final String SOIL_COLUMN_ID = SOIL_COLUMN_VALUE + "_code_id"; + public static final String SOIL_COLUMN_IN_PLOT = "soil_code_id"; + private String schemaName; + public static final String PLOT_TABLE = "plot"; + public static final String PLOT_ID = "id"; - Logger logger = LoggerFactory.getLogger(IPCCDataExportPerPlotCSV.class); + Logger logger = LoggerFactory.getLogger(IPCCDataExportTimeSeries.class); @Autowired private SchemaService schemaService; - public IPCCDataExportPerPlotCSV() { + + public IPCCDataExportTimeSeries() { setExportTypeUsed(ExportType.IPCC); } public File generateTimeseriesData( int startYear, int endYear ) throws IOException { + schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - List luCombinations = generateLUCombinations(startYear, endYear); + List strataClimate = getStrataClimate(); + List strataSoil = getStrataSoil(); + List strataGEZ = getStrataGEZ(); + + List strataData = new ArrayList(); + + for (int year = startYear; year < endYear; year++) { + for (StratumObject gez : strataGEZ) { + for (StratumObject climate : strataClimate) { + for (StratumObject soil : strataSoil) { + E yearLuData = (E) generateLUTimeseriesForStrata(year, gez, climate, soil); + if (yearLuData != null) + strataData.add(yearLuData); + } + } + } + } - return createCsv( luCombinations); - } + return generateFile( strataData); + } - private List generateLUCombinations(int startYear, int endYear) { - - String selectedYears = IPCCDataExportTimeSeries.PLOT_ID + - ", " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_LABEL + - ", " + IPCCDataExportTimeSeries.SOIL_COLUMN_LABEL + - ", " + IPCCDataExportTimeSeries.GEZ_COLUMN_LABEL + ", " ; - - for( int year = startYear ; year <= endYear; year++ ) { + protected abstract File generateFile( List strataData) throws IOException; - selectedYears += IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + ","; + private StratumPerYearData generateLUTimeseriesForStrata(int year, StratumObject gez, StratumObject climate,StratumObject soil) { + List luData = getJdbcTemplate().query( + + "select " + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + + ", " + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1) + ", sum( " + + RegionCalculationUtils.EXPANSION_FACTOR + ")" + + " from " + schemaName + PLOT_TABLE + + " where " + + CLIMATE_COLUMN + " = " + climate.getValue() + " and " + SOIL_COLUMN + " = " + soil.getValue() + " and " + GEZ_COLUMN + " = " + gez.getValue() + + " GROUP BY " + + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + "," + + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1), + + getRowMapper() + + ); + + if (luData.size() == 0) { // No LU data for the climate, soil, gez combination + return null; } - String sqlSelect = "select " - + selectedYears - + RegionCalculationUtils.EXPANSION_FACTOR - + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.SOIL_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.CLIMATE_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.GEZ_TABLE + StratumPerYearData strataPerYearData = new StratumPerYearData(year, climate.getLabel(), soil.getLabel(), gez.getLabel()); + strataPerYearData.setLuData(luData); + return strataPerYearData; + } + + protected RowMapper getRowMapper() { + return new RowMapper() { + @Override + public LUDataPerYear mapRow(ResultSet rs, int rowNum) throws SQLException { - + " where " - + IPCCDataExportTimeSeries.SOIL_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.SOIL_COLUMN_ID - + " and " - + IPCCDataExportTimeSeries.CLIMATE_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_ID - + " and " - + IPCCDataExportTimeSeries.GEZ_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.GEZ_COLUMN_ID + String categoryInitial = rs.getString(1); + String categoryFinal = rs.getString(2); + String subdivInitial = rs.getString(3); + String subdivFinal = rs.getString(4); - + " ORDER BY "+ IPCCDataExportTimeSeries.PLOT_ID + " DESC"; // Remove trailing comma from list of years + return new LUDataPerYear( + LandUseSubdivisionUtils.getSubdivision(categoryInitial, subdivInitial), + LandUseSubdivisionUtils.getSubdivision(categoryFinal, subdivFinal), + rs.getDouble(5) // area + ); + } + }; + } + + private List getStrataClimate() { + return distinctValue(CLIMATE_COLUMN_VALUE, CLIMATE_COLUMN_LABEL, CLIMATE_TABLE, CLIMATE_COLUMN_IN_PLOT); + } + + private List getStrataSoil() { + return distinctValue(SOIL_COLUMN_VALUE, SOIL_COLUMN_LABEL, SOIL_TABLE, SOIL_COLUMN_IN_PLOT); + } + + private List getStrataGEZ() { + return distinctValue(GEZ_COLUMN_VALUE, GEZ_COLUMN_LABEL, GEZ_TABLE, GEZ_COLUMN_IN_PLOT ); + } + + private List distinctValue(String valueColumn, String labelColumn, String table, String plotColumnId) { + + return getJdbcTemplate().query( + "SELECT DISTINCT(" + valueColumn +"),"+ labelColumn + + " FROM " + schemaName + table + ", " + schemaName + PLOT_TABLE + + " WHERE " + PLOT_TABLE + "." + plotColumnId + " = " + table + "." + table + "_id" + , + new RowMapper() { + @Override + public StratumObject mapRow(ResultSet rs, int rowNum) throws SQLException { - List luData = getJdbcTemplate().query( - sqlSelect - , - getRowMapper() - ); + return new StratumObject( rs.getString(valueColumn), rs.getString(labelColumn) ); + } - selectedYears+= "area"; // so the area columns appears too - luData.add( 0, selectedYears.split(",") ); - return luData; + }); } } From ddb1ef2cd5bc08f81b5cf1645ade32066ddf579f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:06 +0100 Subject: [PATCH 0372/1620] New translations IPCCDataExportTimeSeries.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 164 ++++++++++++++---- 1 file changed, 128 insertions(+), 36 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 21431b088f..c94c09f2e8 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -2,76 +2,168 @@ package org.openforis.collect.earth.ipcc; import java.io.File; import java.io.IOException; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; import java.util.List; import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.RDBConnector; import org.openforis.collect.earth.app.service.RegionCalculationUtils; import org.openforis.collect.earth.app.service.SchemaService; +import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; +import org.openforis.collect.earth.ipcc.model.StratumObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Component; @Component -public class IPCCDataExportPerPlotCSV extends IPCCDataExportCSV { - +public abstract class IPCCDataExportTimeSeries extends RDBConnector { + + public static final String CLIMATE_COLUMN = "climate"; + public static final String GEZ_COLUMN = "gez"; + public static final String SOIL_COLUMN = "soil"; + + public static final String CLIMATE_COLUMN_VALUE = "climate_zones"; + public static final String CLIMATE_TABLE = CLIMATE_COLUMN_VALUE + "_code"; + public static final String CLIMATE_COLUMN_LABEL = CLIMATE_COLUMN_VALUE + "_label"; + public static final String CLIMATE_COLUMN_ID = CLIMATE_COLUMN_VALUE + "_code_id"; + public static final String CLIMATE_COLUMN_IN_PLOT = "climate_code_id"; + + public static final String GEZ_COLUMN_VALUE = "ecological_zones"; + public static final String GEZ_TABLE = GEZ_COLUMN_VALUE + "_code"; + public static final String GEZ_COLUMN_LABEL = GEZ_COLUMN_VALUE + "_label"; + public static final String GEZ_COLUMN_ID = GEZ_COLUMN_VALUE + "_code_id"; + public static final String GEZ_COLUMN_IN_PLOT = "gez_code_id"; + + + public static final String SOIL_COLUMN_VALUE = "soil_types"; + public static final String SOIL_TABLE = SOIL_COLUMN_VALUE + "_code"; + public static final String SOIL_COLUMN_LABEL = SOIL_COLUMN_VALUE + "_label"; + public static final String SOIL_COLUMN_ID = SOIL_COLUMN_VALUE + "_code_id"; + public static final String SOIL_COLUMN_IN_PLOT = "soil_code_id"; + private String schemaName; + public static final String PLOT_TABLE = "plot"; + public static final String PLOT_ID = "id"; - Logger logger = LoggerFactory.getLogger(IPCCDataExportPerPlotCSV.class); + Logger logger = LoggerFactory.getLogger(IPCCDataExportTimeSeries.class); @Autowired private SchemaService schemaService; - public IPCCDataExportPerPlotCSV() { + + public IPCCDataExportTimeSeries() { setExportTypeUsed(ExportType.IPCC); } public File generateTimeseriesData( int startYear, int endYear ) throws IOException { + schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - List luCombinations = generateLUCombinations(startYear, endYear); + List strataClimate = getStrataClimate(); + List strataSoil = getStrataSoil(); + List strataGEZ = getStrataGEZ(); + + List strataData = new ArrayList(); + + for (int year = startYear; year < endYear; year++) { + for (StratumObject gez : strataGEZ) { + for (StratumObject climate : strataClimate) { + for (StratumObject soil : strataSoil) { + E yearLuData = (E) generateLUTimeseriesForStrata(year, gez, climate, soil); + if (yearLuData != null) + strataData.add(yearLuData); + } + } + } + } - return createCsv( luCombinations); - } + return generateFile( strataData); + } - private List generateLUCombinations(int startYear, int endYear) { - - String selectedYears = IPCCDataExportTimeSeries.PLOT_ID + - ", " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_LABEL + - ", " + IPCCDataExportTimeSeries.SOIL_COLUMN_LABEL + - ", " + IPCCDataExportTimeSeries.GEZ_COLUMN_LABEL + ", " ; - - for( int year = startYear ; year <= endYear; year++ ) { + protected abstract File generateFile( List strataData) throws IOException; - selectedYears += IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + ","; + private StratumPerYearData generateLUTimeseriesForStrata(int year, StratumObject gez, StratumObject climate,StratumObject soil) { + List luData = getJdbcTemplate().query( + + "select " + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + + ", " + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1) + ", sum( " + + RegionCalculationUtils.EXPANSION_FACTOR + ")" + + " from " + schemaName + PLOT_TABLE + + " where " + + CLIMATE_COLUMN + " = " + climate.getValue() + " and " + SOIL_COLUMN + " = " + soil.getValue() + " and " + GEZ_COLUMN + " = " + gez.getValue() + + " GROUP BY " + + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + "," + + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1), + + getRowMapper() + + ); + + if (luData.size() == 0) { // No LU data for the climate, soil, gez combination + return null; } - String sqlSelect = "select " - + selectedYears - + RegionCalculationUtils.EXPANSION_FACTOR - + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.SOIL_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.CLIMATE_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.GEZ_TABLE + StratumPerYearData strataPerYearData = new StratumPerYearData(year, climate.getLabel(), soil.getLabel(), gez.getLabel()); + strataPerYearData.setLuData(luData); + return strataPerYearData; + } + + protected RowMapper getRowMapper() { + return new RowMapper() { + @Override + public LUDataPerYear mapRow(ResultSet rs, int rowNum) throws SQLException { - + " where " - + IPCCDataExportTimeSeries.SOIL_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.SOIL_COLUMN_ID - + " and " - + IPCCDataExportTimeSeries.CLIMATE_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_ID - + " and " - + IPCCDataExportTimeSeries.GEZ_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.GEZ_COLUMN_ID + String categoryInitial = rs.getString(1); + String categoryFinal = rs.getString(2); + String subdivInitial = rs.getString(3); + String subdivFinal = rs.getString(4); - + " ORDER BY "+ IPCCDataExportTimeSeries.PLOT_ID + " DESC"; // Remove trailing comma from list of years + return new LUDataPerYear( + LandUseSubdivisionUtils.getSubdivision(categoryInitial, subdivInitial), + LandUseSubdivisionUtils.getSubdivision(categoryFinal, subdivFinal), + rs.getDouble(5) // area + ); + } + }; + } + + private List getStrataClimate() { + return distinctValue(CLIMATE_COLUMN_VALUE, CLIMATE_COLUMN_LABEL, CLIMATE_TABLE, CLIMATE_COLUMN_IN_PLOT); + } + + private List getStrataSoil() { + return distinctValue(SOIL_COLUMN_VALUE, SOIL_COLUMN_LABEL, SOIL_TABLE, SOIL_COLUMN_IN_PLOT); + } + + private List getStrataGEZ() { + return distinctValue(GEZ_COLUMN_VALUE, GEZ_COLUMN_LABEL, GEZ_TABLE, GEZ_COLUMN_IN_PLOT ); + } + + private List distinctValue(String valueColumn, String labelColumn, String table, String plotColumnId) { + + return getJdbcTemplate().query( + "SELECT DISTINCT(" + valueColumn +"),"+ labelColumn + + " FROM " + schemaName + table + ", " + schemaName + PLOT_TABLE + + " WHERE " + PLOT_TABLE + "." + plotColumnId + " = " + table + "." + table + "_id" + , + new RowMapper() { + @Override + public StratumObject mapRow(ResultSet rs, int rowNum) throws SQLException { - List luData = getJdbcTemplate().query( - sqlSelect - , - getRowMapper() - ); + return new StratumObject( rs.getString(valueColumn), rs.getString(labelColumn) ); + } - selectedYears+= "area"; // so the area columns appears too - luData.add( 0, selectedYears.split(",") ); - return luData; + }); } } From 5fb5faacaf5475912ad8c47f35a07068cfdf49b8 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:07 +0100 Subject: [PATCH 0373/1620] New translations IPCCDataExportTimeSeries.java (English) --- .../earth/app/view/Messages_en.properties | 312 ++++++++---------- 1 file changed, 136 insertions(+), 176 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index c15098bfaa..c94c09f2e8 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,209 +1,169 @@ package org.openforis.collect.earth.ipcc; import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.ArrayList; import java.util.List; -import org.apache.poi.hssf.usermodel.HSSFWorkbook; -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.CellStyle; -import org.apache.poi.ss.usermodel.Font; -import org.apache.poi.ss.usermodel.IndexedColors; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.ss.usermodel.Workbook; import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +import org.openforis.collect.earth.app.service.RDBConnector; +import org.openforis.collect.earth.app.service.RegionCalculationUtils; +import org.openforis.collect.earth.app.service.SchemaService; +import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; +import org.openforis.collect.earth.ipcc.model.StratumObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Component; @Component -public class IPCCDataExportMatrixExtendedExcel extends IPCCDataExportTimeSeries { - - Logger logger = LoggerFactory.getLogger(IPCCDataExportMatrixExtendedExcel.class); - - public IPCCDataExportMatrixExtendedExcel() { - super(); +public abstract class IPCCDataExportTimeSeries extends RDBConnector { + + public static final String CLIMATE_COLUMN = "climate"; + public static final String GEZ_COLUMN = "gez"; + public static final String SOIL_COLUMN = "soil"; + + public static final String CLIMATE_COLUMN_VALUE = "climate_zones"; + public static final String CLIMATE_TABLE = CLIMATE_COLUMN_VALUE + "_code"; + public static final String CLIMATE_COLUMN_LABEL = CLIMATE_COLUMN_VALUE + "_label"; + public static final String CLIMATE_COLUMN_ID = CLIMATE_COLUMN_VALUE + "_code_id"; + public static final String CLIMATE_COLUMN_IN_PLOT = "climate_code_id"; + + public static final String GEZ_COLUMN_VALUE = "ecological_zones"; + public static final String GEZ_TABLE = GEZ_COLUMN_VALUE + "_code"; + public static final String GEZ_COLUMN_LABEL = GEZ_COLUMN_VALUE + "_label"; + public static final String GEZ_COLUMN_ID = GEZ_COLUMN_VALUE + "_code_id"; + public static final String GEZ_COLUMN_IN_PLOT = "gez_code_id"; + + + public static final String SOIL_COLUMN_VALUE = "soil_types"; + public static final String SOIL_TABLE = SOIL_COLUMN_VALUE + "_code"; + public static final String SOIL_COLUMN_LABEL = SOIL_COLUMN_VALUE + "_label"; + public static final String SOIL_COLUMN_ID = SOIL_COLUMN_VALUE + "_code_id"; + public static final String SOIL_COLUMN_IN_PLOT = "soil_code_id"; + + private String schemaName; + public static final String PLOT_TABLE = "plot"; + public static final String PLOT_ID = "id"; + + Logger logger = LoggerFactory.getLogger(IPCCDataExportTimeSeries.class); + + @Autowired + private SchemaService schemaService; + + + public IPCCDataExportTimeSeries() { setExportTypeUsed(ExportType.IPCC); } - @Override - protected File generateFile(List strataData) throws IOException { - File excelDestination = File.createTempFile("LuMatrixTimeseries_EXTENDED", ".xls"); - excelDestination.deleteOnExit(); - // Create a Workbook - try(Workbook workbook = new HSSFWorkbook() ) {// new HSSFWorkbook() for generating `.xls` file - - /* - * CreationHelper helps us create instances of various things like DataFormat, - * Hyperlink, RichTextString etc, in a format (HSSF, XSSF) independent way - */ - // CreationHelper createHelper = workbook.getCreationHelper(); - - // Create a Font for styling header cells - Font cornerFont = workbook.createFont(); - cornerFont.setBold(true); - cornerFont.setFontHeightInPoints((short) 15); - cornerFont.setColor(IndexedColors.GREY_80_PERCENT.getIndex()); - // Create a CellStyle with the font - CellStyle cornerCellStyle = workbook.createCellStyle(); - cornerCellStyle.setFont(cornerFont); - - // Create a Font for styling header cells - Font headerFont = workbook.createFont(); - headerFont.setBold(true); - headerFont.setFontHeightInPoints((short) 14); - headerFont.setColor(IndexedColors.DARK_TEAL.getIndex()); - // Create a CellStyle with the font - CellStyle headerCellStyle = workbook.createCellStyle(); - headerCellStyle.setFont(headerFont); - - // Create a Font for styling non-diagonal cells - Font stdFont = workbook.createFont(); - stdFont.setBold(false); - stdFont.setFontHeightInPoints((short) 14); - stdFont.setColor(IndexedColors.DARK_RED.getIndex()); - // Create a CellStyle with the font - CellStyle stdCellStyle = workbook.createCellStyle(); - stdCellStyle.setFont(stdFont); - - // Create a Font for styling diagonal cells - Font diagonalFont = workbook.createFont(); - diagonalFont.setBold(true); - diagonalFont.setFontHeightInPoints((short) 14); - diagonalFont.setColor(IndexedColors.DARK_GREEN.getIndex()); - // Create a CellStyle with the font - CellStyle diagonalCellStyle = workbook.createCellStyle(); - diagonalCellStyle.setFont(diagonalFont); - - // Create a Font for styling diagonal cells - Font strataFont = workbook.createFont(); - strataFont.setBold(true); - strataFont.setFontHeightInPoints((short) 16); - strataFont.setColor(IndexedColors.BLUE.getIndex()); - // Create a CellStyle with the font - CellStyle strataCellStyle = workbook.createCellStyle(); - strataCellStyle.setFont(strataFont); - - List availableYears = new ArrayList(); - for (StratumPerYearData yearDataStratumP : strataData) { - if (!availableYears.contains(Integer.valueOf(yearDataStratumP.getYear()))) { - availableYears.add(yearDataStratumP.getYear()); + public File generateTimeseriesData( int startYear, int endYear ) throws IOException { + + schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); + + List strataClimate = getStrataClimate(); + List strataSoil = getStrataSoil(); + List strataGEZ = getStrataGEZ(); + + List strataData = new ArrayList(); + + for (int year = startYear; year < endYear; year++) { + for (StratumObject gez : strataGEZ) { + for (StratumObject climate : strataClimate) { + for (StratumObject soil : strataSoil) { + E yearLuData = (E) generateLUTimeseriesForStrata(year, gez, climate, soil); + if (yearLuData != null) + strataData.add(yearLuData); + } } } + } - for (Integer yearToOutput : availableYears) { + return generateFile( strataData); - int rowNum = 0; - // Create a Sheet - Sheet sheet = workbook.createSheet("LU Matrix " + yearToOutput + "-" + (yearToOutput + 1)); + } - for (StratumPerYearData yearDataStratum : strataData) { - // Get the stratums for the year - if (yearDataStratum.getYear() != yearToOutput) { - continue; // The stratum contains data for a different year that we are going to output in - // the sheet - } + protected abstract File generateFile( List strataData) throws IOException; + + private StratumPerYearData generateLUTimeseriesForStrata(int year, StratumObject gez, StratumObject climate,StratumObject soil) { + + List luData = getJdbcTemplate().query( + + "select " + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + + ", " + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1) + ", sum( " + + RegionCalculationUtils.EXPANSION_FACTOR + ")" + + " from " + schemaName + PLOT_TABLE + + " where " + + CLIMATE_COLUMN + " = " + climate.getValue() + " and " + SOIL_COLUMN + " = " + soil.getValue() + " and " + GEZ_COLUMN + " = " + gez.getValue() + + " GROUP BY " + + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + "," + + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1), + + getRowMapper() + + ); + + if (luData.size() == 0) { // No LU data for the climate, soil, gez combination + return null; + } + StratumPerYearData strataPerYearData = new StratumPerYearData(year, climate.getLabel(), soil.getLabel(), gez.getLabel()); + strataPerYearData.setLuData(luData); + return strataPerYearData; + } - sheet.createRow(rowNum++); // create empty row - - // Create a Row - Row infoRow = sheet.createRow(rowNum++); - Cell cell = infoRow.createCell(0); - cell.setCellStyle(headerCellStyle); - cell.setCellValue("Climate"); - cell = infoRow.createCell(1); - cell.setCellStyle(strataCellStyle); - cell.setCellValue(yearDataStratum.getClimate()); - - infoRow = sheet.createRow(rowNum++); - cell = infoRow.createCell(0); - cell.setCellStyle(headerCellStyle); - cell.setCellValue("Soil"); - cell = infoRow.createCell(1); - cell.setCellStyle(strataCellStyle); - cell.setCellValue(yearDataStratum.getSoil()); - - infoRow = sheet.createRow(rowNum++); - cell = infoRow.createCell(0); - cell.setCellStyle(headerCellStyle); - cell.setCellValue("Global Ecological Zone (GEZ)"); - cell = infoRow.createCell(1); - cell.setCellStyle(strataCellStyle); - cell.setCellValue(yearDataStratum.getGez()); - - // Add some empty rows before next section - sheet.createRow(rowNum++); - - // Create a Row - Row headerRow = sheet.createRow(rowNum++); - cell = headerRow.createCell(0); - cell.setCellValue( - "Transition " + yearDataStratum.getYear() + "/" + (yearDataStratum.getYear() + 1)); - cell.setCellStyle(cornerCellStyle); - - MatrixSheet matrix = new MatrixSheet(yearDataStratum); - int cellPosition = 1; - for (LandUseSubdivision subdivision : matrix.getSubdivisions()) { - cell = headerRow.createCell(cellPosition++); - cell.setCellValue(subdivision.toString()); - cell.setCellStyle(headerCellStyle); - } + protected RowMapper getRowMapper() { + return new RowMapper() { + @Override + public LUDataPerYear mapRow(ResultSet rs, int rowNum) throws SQLException { + + String categoryInitial = rs.getString(1); + String categoryFinal = rs.getString(2); + String subdivInitial = rs.getString(3); + String subdivFinal = rs.getString(4); + + return new LUDataPerYear( + LandUseSubdivisionUtils.getSubdivision(categoryInitial, subdivInitial), + LandUseSubdivisionUtils.getSubdivision(categoryFinal, subdivFinal), + rs.getDouble(5) // area + ); + } + }; + } - int colNum = 0; - for (LandUseSubdivision subdivisionH : matrix.getSubdivisions()) { - colNum = 0; - Row row = sheet.createRow(rowNum++); - - Cell columnCell = row.createCell(colNum++); - columnCell.setCellStyle(headerCellStyle); - columnCell.setCellValue(subdivisionH.toString()); - - colNum = 1; - for (LandUseSubdivision subdivisionV : matrix.getSubdivisions()) { - - cell = row.createCell(colNum++); - cell.setCellValue(IPCCDataExportMatrixExcel - .findLuData(subdivisionH, subdivisionV, matrix.getYearData().getLuData()) - .getAreaHa()); - if (subdivisionH.equals(subdivisionV)) { - cell.setCellStyle(diagonalCellStyle); - } else { - cell.setCellStyle(stdCellStyle); - } - } + private List getStrataClimate() { + return distinctValue(CLIMATE_COLUMN_VALUE, CLIMATE_COLUMN_LABEL, CLIMATE_TABLE, CLIMATE_COLUMN_IN_PLOT); + } - } - - // Add some empty rows before next section - sheet.createRow(rowNum++); - sheet.createRow(rowNum++); - sheet.createRow(rowNum++); + private List getStrataSoil() { + return distinctValue(SOIL_COLUMN_VALUE, SOIL_COLUMN_LABEL, SOIL_TABLE, SOIL_COLUMN_IN_PLOT); + } + private List getStrataGEZ() { + return distinctValue(GEZ_COLUMN_VALUE, GEZ_COLUMN_LABEL, GEZ_TABLE, GEZ_COLUMN_IN_PLOT ); + } - // Resize all columns to fit the content size - for (int j = 0; j < colNum; j++) { - sheet.autoSizeColumn(j); - } + private List distinctValue(String valueColumn, String labelColumn, String table, String plotColumnId) { - } + return getJdbcTemplate().query( + "SELECT DISTINCT(" + valueColumn +"),"+ labelColumn + + " FROM " + schemaName + table + ", " + schemaName + PLOT_TABLE + + " WHERE " + PLOT_TABLE + "." + plotColumnId + " = " + table + "." + table + "_id" + , + new RowMapper() { + @Override + public StratumObject mapRow(ResultSet rs, int rowNum) throws SQLException { - } + return new StratumObject( rs.getString(valueColumn), rs.getString(labelColumn) ); + } - // Write the output to a file - try (FileOutputStream fileOut = new FileOutputStream(excelDestination)) { - workbook.write(fileOut); - } catch (IOException e) { - logger.error("Error generating Excel file", e); - } - } catch (Exception e) { - logger.error("Error generating Excel data", e); - } - return excelDestination; + }); } } From b8756cb06ffba003a4262383ac75256918b17b46 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:08 +0100 Subject: [PATCH 0374/1620] New translations IPCCDataExportTimeSeriesXML.java (French) --- .../earth/app/view/Messages_fr.properties | 213 ++---------------- 1 file changed, 20 insertions(+), 193 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 1230b9a5c0..60af2b664f 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -5,91 +5,19 @@ import java.io.FileOutputStream; import java.io.IOException; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Collection; import java.util.List; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.collections.Predicate; -import org.apache.poi.hssf.usermodel.HSSFWorkbook; -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.CellStyle; -import org.apache.poi.ss.usermodel.Font; -import org.apache.poi.ss.usermodel.IndexedColors; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.ss.usermodel.Workbook; -import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.RDBConnector; -import org.openforis.collect.earth.app.service.RegionCalculationUtils; -import org.openforis.collect.earth.app.service.SchemaService; import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Component; -import liquibase.pro.packaged.E; +import com.thoughtworks.xstream.XStream; @Component -public class IPCCDataExportMatrixExcel extends RDBConnector { - - private String schemaName; - - Logger logger = LoggerFactory.getLogger(IPCCDataExportMatrixExcel.class); - - @Autowired - private SchemaService schemaService; - - public IPCCDataExportMatrixExcel() { - setExportTypeUsed(ExportType.IPCC); - } - - public File generateTimeseriesData( int startYear, int endYear ) throws IOException { - schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - - List matrixSheets = new ArrayList(); - - for (int year = startYear; year < endYear; year++) { - MatrixSheet yearMatrixData = generateLUMatrixForYear(year); - if (yearMatrixData != null) - matrixSheets.add(yearMatrixData); - } - - return createExcel( matrixSheets); - } - - - private MatrixSheet generateLUMatrixForYear(int year) { - - List luData = getJdbcTemplate().query( - "select " - + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " - + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1) + "," - + "sum( " + RegionCalculationUtils.EXPANSION_FACTOR + ")" - + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE - + " GROUP BY " - + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + "," - + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1), - getRowMapper() - ); - - if (luData.size() == 0) { // No LU data for the climate, soil, gez combination - return null; - } - - YearData yearData = new YearData(year, luData); - - return new MatrixSheet( yearData ); - } - +public class IPCCDataExportTimeSeriesXML extends IPCCDataExportTimeSeries { + @Override protected RowMapper getRowMapper() { return new RowMapper() { @Override @@ -109,126 +37,25 @@ public class IPCCDataExportMatrixExcel extends RDBConnector { }; } - protected static LUDataPerYear findLuData( LandUseSubdivision initialSubdivision, LandUseSubdivision finalSubdivision, List luData ) { - Collection result = CollectionUtils.select(luData, new Predicate() { - public boolean evaluate(Object a) { - return - ( (LUDataPerYear) a ).getLu().equals(initialSubdivision) - && - ( (LUDataPerYear) a ).getLuNextYear().equals(finalSubdivision); - } - }); - if( result.size() == 1 ) - return (LUDataPerYear) result.toArray(new LUDataPerYear[result.size()])[0]; - else - return new LUDataPerYear(initialSubdivision, finalSubdivision, 0); - - } - - private File createExcel( List matrixData ) throws IOException { - File excelDestination = File.createTempFile("LuMatrixTimeseries", ".xls"); - excelDestination.deleteOnExit(); - // Create a Workbook - try (Workbook workbook = new HSSFWorkbook() ){ - /* CreationHelper helps us create instances of various things like DataFormat, - Hyperlink, RichTextString etc, in a format (HSSF, XSSF) independent way */ - //CreationHelper createHelper = workbook.getCreationHelper(); - - // Create a Font for styling header cells - Font cornerFont = workbook.createFont(); - cornerFont.setBold(true); - cornerFont.setFontHeightInPoints((short) 15); - cornerFont.setColor(IndexedColors.GREY_80_PERCENT.getIndex()); - // Create a CellStyle with the font - CellStyle cornerCellStyle = workbook.createCellStyle(); - cornerCellStyle.setFont(cornerFont); - - // Create a Font for styling header cells - Font headerFont = workbook.createFont(); - headerFont.setBold(true); - headerFont.setFontHeightInPoints((short) 14); - headerFont.setColor(IndexedColors.DARK_TEAL.getIndex()); - // Create a CellStyle with the font - CellStyle headerCellStyle = workbook.createCellStyle(); - headerCellStyle.setFont(headerFont); - - // Create a Font for styling non-diagonal cells - Font stdFont = workbook.createFont(); - stdFont.setBold(false); - stdFont.setFontHeightInPoints((short) 14); - stdFont.setColor(IndexedColors.DARK_RED.getIndex()); - // Create a CellStyle with the font - CellStyle stdCellStyle = workbook.createCellStyle(); - stdCellStyle.setFont(stdFont); - - // Create a Font for styling non-diagonal cells - Font diagonalFont = workbook.createFont(); - diagonalFont.setBold(true); - diagonalFont.setFontHeightInPoints((short) 14); - diagonalFont.setColor(IndexedColors.DARK_GREEN.getIndex()); - // Create a CellStyle with the font - CellStyle diagonalCellStyle = workbook.createCellStyle(); - diagonalCellStyle.setFont(diagonalFont); - - for (MatrixSheet matrix : matrixData) { - // Create a Sheet - Sheet sheet = workbook.createSheet("LU Matrix " + matrix.getYearData().getYear() + "-" + (matrix.getYearData().getYear()+1 ) ); + @Override + protected File generateFile( List strataData) throws IOException { + File xmlFileDestination = File.createTempFile("landUsesTimeseries", ".xml"); + xmlFileDestination.deleteOnExit(); + XStream xStream = new XStream(); + xStream.alias("LandUse", LUDataPerYear.class); + xStream.alias("Stratum", StratumPerYearData.class); + xStream.alias("Subdivision", LandUseSubdivision.class); + + xStream.setMode(XStream.NO_REFERENCES); + String xmlSchema = xStream.toXML(strataData); - // Create a Row - Row headerRow = sheet.createRow(0); - Cell cell = headerRow.createCell(0); - cell.setCellValue( "Transition " + matrix.getYearData().getYear() + "/" + ( matrix.getYearData().getYear() +1 ) ); - cell.setCellStyle(cornerCellStyle); - - int i = 1; - for (LandUseSubdivision subdivision : matrix.getSubdivisions()) { - cell = headerRow.createCell(i++); - cell.setCellValue(subdivision.toString()); - cell.setCellStyle(headerCellStyle); - } - - - int rowNum = 1; - int colNum = 0; - for (LandUseSubdivision subdivisionH : matrix.getSubdivisions()) { - colNum = 0; - Row row = sheet.createRow(rowNum++); - - Cell columnCell = row.createCell(colNum++); - columnCell.setCellStyle(headerCellStyle); - columnCell.setCellValue(subdivisionH.toString()); - - colNum = 1; - for (LandUseSubdivision subdivisionV : matrix.getSubdivisions()) { - - cell = row.createCell(colNum++); - cell.setCellValue( findLuData( subdivisionH, subdivisionV, matrix.getYearData().getLuData() ).getAreaHa() ); - if( subdivisionH.equals( subdivisionV ) ) { - cell.setCellStyle(diagonalCellStyle); - }else { - cell.setCellStyle(stdCellStyle); - } - } - - } - - // Resize all columns to fit the content size - for(int j = 0; j < colNum; j++) { - sheet.autoSizeColumn(j); - } - - } - - // Write the output to a file - try( FileOutputStream fileOut = new FileOutputStream(excelDestination) ){ - workbook.write(fileOut); - } catch (IOException e) { - logger.error("Error generating Excel file", e); - } + try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { + byte[] strToBytes = xmlSchema.getBytes(); + outputStream.write(strToBytes); } catch (Exception e) { - logger.error("Error generating Excel data", e); + logger.error("Error saving data to file", e); } - return excelDestination; + + return xmlFileDestination; } - } From 7d3f46d318fc76ae29ace776906a683c5fca087f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:09 +0100 Subject: [PATCH 0375/1620] New translations IPCCDataExportTimeSeriesXML.java (Spanish) --- .../earth/app/view/Messages_es.properties | 160 +++--------------- 1 file changed, 26 insertions(+), 134 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index c94c09f2e8..60af2b664f 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,123 +1,23 @@ package org.openforis.collect.earth.ipcc; import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.ArrayList; import java.util.List; -import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.RDBConnector; -import org.openforis.collect.earth.app.service.RegionCalculationUtils; -import org.openforis.collect.earth.app.service.SchemaService; import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; -import org.openforis.collect.earth.ipcc.model.StratumObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Component; -@Component -public abstract class IPCCDataExportTimeSeries extends RDBConnector { - - public static final String CLIMATE_COLUMN = "climate"; - public static final String GEZ_COLUMN = "gez"; - public static final String SOIL_COLUMN = "soil"; - - public static final String CLIMATE_COLUMN_VALUE = "climate_zones"; - public static final String CLIMATE_TABLE = CLIMATE_COLUMN_VALUE + "_code"; - public static final String CLIMATE_COLUMN_LABEL = CLIMATE_COLUMN_VALUE + "_label"; - public static final String CLIMATE_COLUMN_ID = CLIMATE_COLUMN_VALUE + "_code_id"; - public static final String CLIMATE_COLUMN_IN_PLOT = "climate_code_id"; - - public static final String GEZ_COLUMN_VALUE = "ecological_zones"; - public static final String GEZ_TABLE = GEZ_COLUMN_VALUE + "_code"; - public static final String GEZ_COLUMN_LABEL = GEZ_COLUMN_VALUE + "_label"; - public static final String GEZ_COLUMN_ID = GEZ_COLUMN_VALUE + "_code_id"; - public static final String GEZ_COLUMN_IN_PLOT = "gez_code_id"; - - - public static final String SOIL_COLUMN_VALUE = "soil_types"; - public static final String SOIL_TABLE = SOIL_COLUMN_VALUE + "_code"; - public static final String SOIL_COLUMN_LABEL = SOIL_COLUMN_VALUE + "_label"; - public static final String SOIL_COLUMN_ID = SOIL_COLUMN_VALUE + "_code_id"; - public static final String SOIL_COLUMN_IN_PLOT = "soil_code_id"; - - private String schemaName; - public static final String PLOT_TABLE = "plot"; - public static final String PLOT_ID = "id"; - - Logger logger = LoggerFactory.getLogger(IPCCDataExportTimeSeries.class); - - @Autowired - private SchemaService schemaService; - - - public IPCCDataExportTimeSeries() { - setExportTypeUsed(ExportType.IPCC); - } - - public File generateTimeseriesData( int startYear, int endYear ) throws IOException { - - schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - - List strataClimate = getStrataClimate(); - List strataSoil = getStrataSoil(); - List strataGEZ = getStrataGEZ(); - - List strataData = new ArrayList(); - - for (int year = startYear; year < endYear; year++) { - for (StratumObject gez : strataGEZ) { - for (StratumObject climate : strataClimate) { - for (StratumObject soil : strataSoil) { - E yearLuData = (E) generateLUTimeseriesForStrata(year, gez, climate, soil); - if (yearLuData != null) - strataData.add(yearLuData); - } - } - } - } - - return generateFile( strataData); - - } - - protected abstract File generateFile( List strataData) throws IOException; - - private StratumPerYearData generateLUTimeseriesForStrata(int year, StratumObject gez, StratumObject climate,StratumObject soil) { +import com.thoughtworks.xstream.XStream; - List luData = getJdbcTemplate().query( - - "select " + IPCCSurveyAdapter.getIpccCategoryAttrName(year) - + ", " + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1) + ", sum( " - + RegionCalculationUtils.EXPANSION_FACTOR + ")" - + " from " + schemaName + PLOT_TABLE - + " where " - + CLIMATE_COLUMN + " = " + climate.getValue() + " and " + SOIL_COLUMN + " = " + soil.getValue() + " and " + GEZ_COLUMN + " = " + gez.getValue() - + " GROUP BY " - + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + "," - + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1), - - getRowMapper() - - ); - - if (luData.size() == 0) { // No LU data for the climate, soil, gez combination - return null; - } - - StratumPerYearData strataPerYearData = new StratumPerYearData(year, climate.getLabel(), soil.getLabel(), gez.getLabel()); - strataPerYearData.setLuData(luData); - return strataPerYearData; - } +@Component +public class IPCCDataExportTimeSeriesXML extends IPCCDataExportTimeSeries { + @Override protected RowMapper getRowMapper() { return new RowMapper() { @Override @@ -137,33 +37,25 @@ public abstract class IPCCDataExportTimeSeries extends RDBConnector { }; } - private List getStrataClimate() { - return distinctValue(CLIMATE_COLUMN_VALUE, CLIMATE_COLUMN_LABEL, CLIMATE_TABLE, CLIMATE_COLUMN_IN_PLOT); - } - - private List getStrataSoil() { - return distinctValue(SOIL_COLUMN_VALUE, SOIL_COLUMN_LABEL, SOIL_TABLE, SOIL_COLUMN_IN_PLOT); - } - - private List getStrataGEZ() { - return distinctValue(GEZ_COLUMN_VALUE, GEZ_COLUMN_LABEL, GEZ_TABLE, GEZ_COLUMN_IN_PLOT ); - } - - private List distinctValue(String valueColumn, String labelColumn, String table, String plotColumnId) { - - return getJdbcTemplate().query( - "SELECT DISTINCT(" + valueColumn +"),"+ labelColumn + - " FROM " + schemaName + table + ", " + schemaName + PLOT_TABLE + - " WHERE " + PLOT_TABLE + "." + plotColumnId + " = " + table + "." + table + "_id" - , - new RowMapper() { - @Override - public StratumObject mapRow(ResultSet rs, int rowNum) throws SQLException { - - return new StratumObject( rs.getString(valueColumn), rs.getString(labelColumn) ); - } - - }); + @Override + protected File generateFile( List strataData) throws IOException { + File xmlFileDestination = File.createTempFile("landUsesTimeseries", ".xml"); + xmlFileDestination.deleteOnExit(); + XStream xStream = new XStream(); + xStream.alias("LandUse", LUDataPerYear.class); + xStream.alias("Stratum", StratumPerYearData.class); + xStream.alias("Subdivision", LandUseSubdivision.class); + + xStream.setMode(XStream.NO_REFERENCES); + String xmlSchema = xStream.toXML(strataData); + + try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { + byte[] strToBytes = xmlSchema.getBytes(); + outputStream.write(strToBytes); + } catch (Exception e) { + logger.error("Error saving data to file", e); + } + + return xmlFileDestination; } - } From e691c650527a4127a9fa6e56bb4aa2d2ceca9468 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:10 +0100 Subject: [PATCH 0376/1620] New translations IPCCDataExportTimeSeriesXML.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 160 +++--------------- 1 file changed, 26 insertions(+), 134 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index c94c09f2e8..60af2b664f 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,123 +1,23 @@ package org.openforis.collect.earth.ipcc; import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.ArrayList; import java.util.List; -import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.RDBConnector; -import org.openforis.collect.earth.app.service.RegionCalculationUtils; -import org.openforis.collect.earth.app.service.SchemaService; import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; -import org.openforis.collect.earth.ipcc.model.StratumObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Component; -@Component -public abstract class IPCCDataExportTimeSeries extends RDBConnector { - - public static final String CLIMATE_COLUMN = "climate"; - public static final String GEZ_COLUMN = "gez"; - public static final String SOIL_COLUMN = "soil"; - - public static final String CLIMATE_COLUMN_VALUE = "climate_zones"; - public static final String CLIMATE_TABLE = CLIMATE_COLUMN_VALUE + "_code"; - public static final String CLIMATE_COLUMN_LABEL = CLIMATE_COLUMN_VALUE + "_label"; - public static final String CLIMATE_COLUMN_ID = CLIMATE_COLUMN_VALUE + "_code_id"; - public static final String CLIMATE_COLUMN_IN_PLOT = "climate_code_id"; - - public static final String GEZ_COLUMN_VALUE = "ecological_zones"; - public static final String GEZ_TABLE = GEZ_COLUMN_VALUE + "_code"; - public static final String GEZ_COLUMN_LABEL = GEZ_COLUMN_VALUE + "_label"; - public static final String GEZ_COLUMN_ID = GEZ_COLUMN_VALUE + "_code_id"; - public static final String GEZ_COLUMN_IN_PLOT = "gez_code_id"; - - - public static final String SOIL_COLUMN_VALUE = "soil_types"; - public static final String SOIL_TABLE = SOIL_COLUMN_VALUE + "_code"; - public static final String SOIL_COLUMN_LABEL = SOIL_COLUMN_VALUE + "_label"; - public static final String SOIL_COLUMN_ID = SOIL_COLUMN_VALUE + "_code_id"; - public static final String SOIL_COLUMN_IN_PLOT = "soil_code_id"; - - private String schemaName; - public static final String PLOT_TABLE = "plot"; - public static final String PLOT_ID = "id"; - - Logger logger = LoggerFactory.getLogger(IPCCDataExportTimeSeries.class); - - @Autowired - private SchemaService schemaService; - - - public IPCCDataExportTimeSeries() { - setExportTypeUsed(ExportType.IPCC); - } - - public File generateTimeseriesData( int startYear, int endYear ) throws IOException { - - schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - - List strataClimate = getStrataClimate(); - List strataSoil = getStrataSoil(); - List strataGEZ = getStrataGEZ(); - - List strataData = new ArrayList(); - - for (int year = startYear; year < endYear; year++) { - for (StratumObject gez : strataGEZ) { - for (StratumObject climate : strataClimate) { - for (StratumObject soil : strataSoil) { - E yearLuData = (E) generateLUTimeseriesForStrata(year, gez, climate, soil); - if (yearLuData != null) - strataData.add(yearLuData); - } - } - } - } - - return generateFile( strataData); - - } - - protected abstract File generateFile( List strataData) throws IOException; - - private StratumPerYearData generateLUTimeseriesForStrata(int year, StratumObject gez, StratumObject climate,StratumObject soil) { +import com.thoughtworks.xstream.XStream; - List luData = getJdbcTemplate().query( - - "select " + IPCCSurveyAdapter.getIpccCategoryAttrName(year) - + ", " + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1) + ", sum( " - + RegionCalculationUtils.EXPANSION_FACTOR + ")" - + " from " + schemaName + PLOT_TABLE - + " where " - + CLIMATE_COLUMN + " = " + climate.getValue() + " and " + SOIL_COLUMN + " = " + soil.getValue() + " and " + GEZ_COLUMN + " = " + gez.getValue() - + " GROUP BY " - + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + "," - + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1), - - getRowMapper() - - ); - - if (luData.size() == 0) { // No LU data for the climate, soil, gez combination - return null; - } - - StratumPerYearData strataPerYearData = new StratumPerYearData(year, climate.getLabel(), soil.getLabel(), gez.getLabel()); - strataPerYearData.setLuData(luData); - return strataPerYearData; - } +@Component +public class IPCCDataExportTimeSeriesXML extends IPCCDataExportTimeSeries { + @Override protected RowMapper getRowMapper() { return new RowMapper() { @Override @@ -137,33 +37,25 @@ public abstract class IPCCDataExportTimeSeries extends RDBConnector { }; } - private List getStrataClimate() { - return distinctValue(CLIMATE_COLUMN_VALUE, CLIMATE_COLUMN_LABEL, CLIMATE_TABLE, CLIMATE_COLUMN_IN_PLOT); - } - - private List getStrataSoil() { - return distinctValue(SOIL_COLUMN_VALUE, SOIL_COLUMN_LABEL, SOIL_TABLE, SOIL_COLUMN_IN_PLOT); - } - - private List getStrataGEZ() { - return distinctValue(GEZ_COLUMN_VALUE, GEZ_COLUMN_LABEL, GEZ_TABLE, GEZ_COLUMN_IN_PLOT ); - } - - private List distinctValue(String valueColumn, String labelColumn, String table, String plotColumnId) { - - return getJdbcTemplate().query( - "SELECT DISTINCT(" + valueColumn +"),"+ labelColumn + - " FROM " + schemaName + table + ", " + schemaName + PLOT_TABLE + - " WHERE " + PLOT_TABLE + "." + plotColumnId + " = " + table + "." + table + "_id" - , - new RowMapper() { - @Override - public StratumObject mapRow(ResultSet rs, int rowNum) throws SQLException { - - return new StratumObject( rs.getString(valueColumn), rs.getString(labelColumn) ); - } - - }); + @Override + protected File generateFile( List strataData) throws IOException { + File xmlFileDestination = File.createTempFile("landUsesTimeseries", ".xml"); + xmlFileDestination.deleteOnExit(); + XStream xStream = new XStream(); + xStream.alias("LandUse", LUDataPerYear.class); + xStream.alias("Stratum", StratumPerYearData.class); + xStream.alias("Subdivision", LandUseSubdivision.class); + + xStream.setMode(XStream.NO_REFERENCES); + String xmlSchema = xStream.toXML(strataData); + + try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { + byte[] strToBytes = xmlSchema.getBytes(); + outputStream.write(strToBytes); + } catch (Exception e) { + logger.error("Error saving data to file", e); + } + + return xmlFileDestination; } - } From 1556553ea7149c7962789444b7738d55978743f0 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:11 +0100 Subject: [PATCH 0377/1620] New translations IPCCDataExportTimeSeriesXML.java (English) --- .../earth/app/view/Messages_en.properties | 160 +++--------------- 1 file changed, 26 insertions(+), 134 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index c94c09f2e8..60af2b664f 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,123 +1,23 @@ package org.openforis.collect.earth.ipcc; import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.ArrayList; import java.util.List; -import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.RDBConnector; -import org.openforis.collect.earth.app.service.RegionCalculationUtils; -import org.openforis.collect.earth.app.service.SchemaService; import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; -import org.openforis.collect.earth.ipcc.model.StratumObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Component; -@Component -public abstract class IPCCDataExportTimeSeries extends RDBConnector { - - public static final String CLIMATE_COLUMN = "climate"; - public static final String GEZ_COLUMN = "gez"; - public static final String SOIL_COLUMN = "soil"; - - public static final String CLIMATE_COLUMN_VALUE = "climate_zones"; - public static final String CLIMATE_TABLE = CLIMATE_COLUMN_VALUE + "_code"; - public static final String CLIMATE_COLUMN_LABEL = CLIMATE_COLUMN_VALUE + "_label"; - public static final String CLIMATE_COLUMN_ID = CLIMATE_COLUMN_VALUE + "_code_id"; - public static final String CLIMATE_COLUMN_IN_PLOT = "climate_code_id"; - - public static final String GEZ_COLUMN_VALUE = "ecological_zones"; - public static final String GEZ_TABLE = GEZ_COLUMN_VALUE + "_code"; - public static final String GEZ_COLUMN_LABEL = GEZ_COLUMN_VALUE + "_label"; - public static final String GEZ_COLUMN_ID = GEZ_COLUMN_VALUE + "_code_id"; - public static final String GEZ_COLUMN_IN_PLOT = "gez_code_id"; - - - public static final String SOIL_COLUMN_VALUE = "soil_types"; - public static final String SOIL_TABLE = SOIL_COLUMN_VALUE + "_code"; - public static final String SOIL_COLUMN_LABEL = SOIL_COLUMN_VALUE + "_label"; - public static final String SOIL_COLUMN_ID = SOIL_COLUMN_VALUE + "_code_id"; - public static final String SOIL_COLUMN_IN_PLOT = "soil_code_id"; - - private String schemaName; - public static final String PLOT_TABLE = "plot"; - public static final String PLOT_ID = "id"; - - Logger logger = LoggerFactory.getLogger(IPCCDataExportTimeSeries.class); - - @Autowired - private SchemaService schemaService; - - - public IPCCDataExportTimeSeries() { - setExportTypeUsed(ExportType.IPCC); - } - - public File generateTimeseriesData( int startYear, int endYear ) throws IOException { - - schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - - List strataClimate = getStrataClimate(); - List strataSoil = getStrataSoil(); - List strataGEZ = getStrataGEZ(); - - List strataData = new ArrayList(); - - for (int year = startYear; year < endYear; year++) { - for (StratumObject gez : strataGEZ) { - for (StratumObject climate : strataClimate) { - for (StratumObject soil : strataSoil) { - E yearLuData = (E) generateLUTimeseriesForStrata(year, gez, climate, soil); - if (yearLuData != null) - strataData.add(yearLuData); - } - } - } - } - - return generateFile( strataData); - - } - - protected abstract File generateFile( List strataData) throws IOException; - - private StratumPerYearData generateLUTimeseriesForStrata(int year, StratumObject gez, StratumObject climate,StratumObject soil) { +import com.thoughtworks.xstream.XStream; - List luData = getJdbcTemplate().query( - - "select " + IPCCSurveyAdapter.getIpccCategoryAttrName(year) - + ", " + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1) + ", sum( " - + RegionCalculationUtils.EXPANSION_FACTOR + ")" - + " from " + schemaName + PLOT_TABLE - + " where " - + CLIMATE_COLUMN + " = " + climate.getValue() + " and " + SOIL_COLUMN + " = " + soil.getValue() + " and " + GEZ_COLUMN + " = " + gez.getValue() - + " GROUP BY " - + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + "," - + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1), - - getRowMapper() - - ); - - if (luData.size() == 0) { // No LU data for the climate, soil, gez combination - return null; - } - - StratumPerYearData strataPerYearData = new StratumPerYearData(year, climate.getLabel(), soil.getLabel(), gez.getLabel()); - strataPerYearData.setLuData(luData); - return strataPerYearData; - } +@Component +public class IPCCDataExportTimeSeriesXML extends IPCCDataExportTimeSeries { + @Override protected RowMapper getRowMapper() { return new RowMapper() { @Override @@ -137,33 +37,25 @@ public abstract class IPCCDataExportTimeSeries extends RDBConnector { }; } - private List getStrataClimate() { - return distinctValue(CLIMATE_COLUMN_VALUE, CLIMATE_COLUMN_LABEL, CLIMATE_TABLE, CLIMATE_COLUMN_IN_PLOT); - } - - private List getStrataSoil() { - return distinctValue(SOIL_COLUMN_VALUE, SOIL_COLUMN_LABEL, SOIL_TABLE, SOIL_COLUMN_IN_PLOT); - } - - private List getStrataGEZ() { - return distinctValue(GEZ_COLUMN_VALUE, GEZ_COLUMN_LABEL, GEZ_TABLE, GEZ_COLUMN_IN_PLOT ); - } - - private List distinctValue(String valueColumn, String labelColumn, String table, String plotColumnId) { - - return getJdbcTemplate().query( - "SELECT DISTINCT(" + valueColumn +"),"+ labelColumn + - " FROM " + schemaName + table + ", " + schemaName + PLOT_TABLE + - " WHERE " + PLOT_TABLE + "." + plotColumnId + " = " + table + "." + table + "_id" - , - new RowMapper() { - @Override - public StratumObject mapRow(ResultSet rs, int rowNum) throws SQLException { - - return new StratumObject( rs.getString(valueColumn), rs.getString(labelColumn) ); - } - - }); + @Override + protected File generateFile( List strataData) throws IOException { + File xmlFileDestination = File.createTempFile("landUsesTimeseries", ".xml"); + xmlFileDestination.deleteOnExit(); + XStream xStream = new XStream(); + xStream.alias("LandUse", LUDataPerYear.class); + xStream.alias("Stratum", StratumPerYearData.class); + xStream.alias("Subdivision", LandUseSubdivision.class); + + xStream.setMode(XStream.NO_REFERENCES); + String xmlSchema = xStream.toXML(strataData); + + try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { + byte[] strToBytes = xmlSchema.getBytes(); + outputStream.write(strToBytes); + } catch (Exception e) { + logger.error("Error saving data to file", e); + } + + return xmlFileDestination; } - } From 384cd28e0e4aade38d6f15676c5f2f96e20da15e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:12 +0100 Subject: [PATCH 0378/1620] New translations IPCCGenerator.java (French) --- .../earth/app/view/Messages_fr.properties | 190 ++++++++++++++---- 1 file changed, 146 insertions(+), 44 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 60af2b664f..4dbb57be78 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,61 +1,163 @@ +/** + * Main class to generate the IPCC Inventory Software compliant file + */ package org.openforis.collect.earth.ipcc; import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; +import java.util.Calendar; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.view.DataFormat; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.app.view.JFileChooserExistsAware; import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.springframework.jdbc.core.RowMapper; +import org.openforis.collect.earth.ipcc.controller.StratumUtils; +import org.openforis.collect.earth.ipcc.view.AssignSubdivisionTypesWizard; +import org.openforis.idm.metamodel.Survey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.thoughtworks.xstream.XStream; - +/** + * @author Alfonso Sanchez-Paus + * + */ @Component -public class IPCCDataExportTimeSeriesXML extends IPCCDataExportTimeSeries { +public class IPCCGenerator { - @Override - protected RowMapper getRowMapper() { - return new RowMapper() { - @Override - public LUDataPerYear mapRow(ResultSet rs, int rowNum) throws SQLException { - - String categoryInitial = rs.getString(1); - String categoryFinal = rs.getString(2); - String subdivInitial = rs.getString(3); - String subdivFinal = rs.getString(4); - - return new LUDataPerYear( - LandUseSubdivisionUtils.getSubdivision(categoryInitial, subdivInitial), - LandUseSubdivisionUtils.getSubdivision(categoryFinal, subdivFinal), - rs.getDouble(5) // area - ); - } - }; + @Autowired + IPCCRDBGenerator ipccRdbGenerator; + + @Autowired + IPCCDataExportTimeSeriesXML ipccDataExportToXML; + + @Autowired + LocalPropertiesService localPropertiesService; + + @Autowired + IPCCDataExportMatrixExcel dataExportMatrixExcel; + + @Autowired + IPCCDataExportMatrixExtendedExcel dataExportMatrixExtendedExcel; + + @Autowired + IPCCDataExportLandUnitsCSV dataExportLandUnitsCSV; + + @Autowired + IPCCDataExportPerPlotCSV dataExportPerPlotCSV; + + @Autowired + IPCCLandUses landUses; + + IPCCSurveyAdapter ipccSurveyAdapter; + + Logger logger = LoggerFactory.getLogger( IPCCGenerator.class ); + + public static final int END_YEAR = Calendar.getInstance().get(Calendar.YEAR); // Assume the last year is current year + public static final int START_YEAR = 2000; // Assume start year at 2000 + + public File generateRDB( Survey survey, InfiniteProgressMonitor progressListener) throws IPCCGeneratorException { + + ipccSurveyAdapter = new IPCCSurveyAdapter(); + + // Add attributes for each year containing the LU Category and Subdivision if not present + Survey modifiedSurvey = ipccSurveyAdapter.addIPCCAttributesToSurvey( survey ); + + // Generate Relational Database of the survey data + ipccRdbGenerator.generateRelationalDatabase( modifiedSurvey, progressListener); + + return null; } - @Override - protected File generateFile( List strataData) throws IOException { - File xmlFileDestination = File.createTempFile("landUsesTimeseries", ".xml"); - xmlFileDestination.deleteOnExit(); - XStream xStream = new XStream(); - xStream.alias("LandUse", LUDataPerYear.class); - xStream.alias("Stratum", StratumPerYearData.class); - xStream.alias("Subdivision", LandUseSubdivision.class); + public void produceOutputs( Survey survey, InfiniteProgressMonitor progressListener ) { - xStream.setMode(XStream.NO_REFERENCES); - String xmlSchema = xStream.toXML(strataData); - - try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { - byte[] strToBytes = xmlSchema.getBytes(); - outputStream.write(strToBytes); - } catch (Exception e) { - logger.error("Error saving data to file", e); + progressListener.hide(); + + // Assign Management types to the Land Use Subdivisions found in the survey data + AssignSubdivisionTypesWizard wizard = new AssignSubdivisionTypesWizard(); + wizard.initializeTypes(landUses.getLandUseSubdivisions()); + + if( !wizard.isWizardFinished() ) { + logger.info( "The user closed the wizard without finishing assigning management types"); + return; } + + File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.GHGI_ZIP_FILE, true, false, "LandUseForGHGi", localPropertiesService, null); + + if( exportToFile== null || exportToFile.length != 1 ) { + logger.info("The user should choose a ZIP file to export the results to! No file chosen, aborting the rest of the execution"); + return; + } + + try { + File destinationZip = exportToFile[0]; + + final int STEPS = 7; + int currentStep = 1; + + progressListener.show(); + + progressListener.updateProgress(currentStep++, STEPS, "Generating CSV aggregated time-series" ); + // Extract data from the Relational Database into an excel file of transition Matrixes per year + File landUnitsCSVFile =dataExportLandUnitsCSV.generateTimeseriesData(START_YEAR, END_YEAR); + if( progressListener.isUserCancelled() ) return; - return xmlFileDestination; + progressListener.updateProgress(currentStep++, STEPS, "Generating CSV per plot time-series" ); + // Extract data from the Relational Database into an excel file of transition Matrixes per year + File perPlotCSVFile =dataExportPerPlotCSV.generateTimeseriesData(START_YEAR, END_YEAR); + if( progressListener.isUserCancelled() ) return; + + progressListener.updateProgress(currentStep++, STEPS, "Generating survey setup files" ); + // Generate list of subdivisions in survey + File subdivisionsFile = LandUseSubdivisionUtils.getSubdivisionsXML(); + File climateZones = StratumUtils.getClimateZonesXML( survey ); + File ecologicalZones = StratumUtils.getEcologicalZonesXML( survey ); + File soilTypes = StratumUtils.getSoilTypesXML( survey ); + if( progressListener.isUserCancelled() ) return; + + progressListener.updateProgress(currentStep++, STEPS, "Generating XML timeseries file" ); + // Extract data from the Relational Database into an XML File with information per year + File timeseriesXMLFile =ipccDataExportToXML.generateTimeseriesData(IPCCGenerator.START_YEAR, IPCCGenerator.END_YEAR ); + if( progressListener.isUserCancelled() ) return; + + progressListener.updateProgress(currentStep++, STEPS, "Generating Excel LU Matrixes per year" ); + // Extract data from the Relational Database into an excel file of transition Matrixes per year + File matrixXLSFile =dataExportMatrixExcel.generateTimeseriesData(START_YEAR, END_YEAR); + if( progressListener.isUserCancelled() ) return; + + progressListener.updateProgress(currentStep++, STEPS, "Generating Excel LU Matrixes per year STRATIFIED" ); + // Extract data from the Relational Database into an excel file of transition Matrixes per year + File matrixXLSExtendedFile =dataExportMatrixExtendedExcel.generateTimeseriesData(START_YEAR, END_YEAR); + if( progressListener.isUserCancelled() ) return; + + try { + progressListener.updateProgress(currentStep++, STEPS, "Compressing files into selected destination" ); + CollectEarthUtils.addFileToZip( destinationZip , timeseriesXMLFile, "LU_Timeseries.xml"); + CollectEarthUtils.addFileToZip( destinationZip , matrixXLSFile, "LU_Matrixes.xls"); + CollectEarthUtils.addFileToZip( destinationZip , matrixXLSExtendedFile, "LU_Matrixes_stratified.xls"); + CollectEarthUtils.addFileToZip( destinationZip , subdivisionsFile, "ConfigLandUseSubdivisions.xml"); + CollectEarthUtils.addFileToZip( destinationZip , climateZones, "ConfigClimateZones.xml"); + CollectEarthUtils.addFileToZip( destinationZip , ecologicalZones, "ConfigEclogicalZones.xml"); + CollectEarthUtils.addFileToZip( destinationZip , soilTypes, "ConfigSoilTypes.xml"); + CollectEarthUtils.addFileToZip( destinationZip , landUnitsCSVFile, "LU_Timeseries_grouped.csv"); + CollectEarthUtils.addFileToZip( destinationZip , perPlotCSVFile, "LU_Timeseries_per_plot.csv"); + progressListener.hide(); + } catch (IOException e) { + logger.error("Error when creating ZIP file with timeseries content " + destinationZip, e); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (Exception e) { + logger.error("Error when zipping the timeseries content into " + destinationZip, e); //$NON-NLS-1$ //$NON-NLS-2$ + } + + // Open the ZIP file automatically to inspect the output + CollectEarthUtils.openFile( destinationZip ); + + } catch (IOException e) { + logger.error("Error generating file", e); + } + } + } From 662f86a1d52b4b0d722aca4930803855da26dcb5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:13 +0100 Subject: [PATCH 0379/1620] New translations IPCCGenerator.java (Spanish) --- .../earth/app/view/Messages_es.properties | 190 ++++++++++++++---- 1 file changed, 146 insertions(+), 44 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 60af2b664f..4dbb57be78 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,61 +1,163 @@ +/** + * Main class to generate the IPCC Inventory Software compliant file + */ package org.openforis.collect.earth.ipcc; import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; +import java.util.Calendar; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.view.DataFormat; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.app.view.JFileChooserExistsAware; import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.springframework.jdbc.core.RowMapper; +import org.openforis.collect.earth.ipcc.controller.StratumUtils; +import org.openforis.collect.earth.ipcc.view.AssignSubdivisionTypesWizard; +import org.openforis.idm.metamodel.Survey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.thoughtworks.xstream.XStream; - +/** + * @author Alfonso Sanchez-Paus + * + */ @Component -public class IPCCDataExportTimeSeriesXML extends IPCCDataExportTimeSeries { +public class IPCCGenerator { - @Override - protected RowMapper getRowMapper() { - return new RowMapper() { - @Override - public LUDataPerYear mapRow(ResultSet rs, int rowNum) throws SQLException { - - String categoryInitial = rs.getString(1); - String categoryFinal = rs.getString(2); - String subdivInitial = rs.getString(3); - String subdivFinal = rs.getString(4); - - return new LUDataPerYear( - LandUseSubdivisionUtils.getSubdivision(categoryInitial, subdivInitial), - LandUseSubdivisionUtils.getSubdivision(categoryFinal, subdivFinal), - rs.getDouble(5) // area - ); - } - }; + @Autowired + IPCCRDBGenerator ipccRdbGenerator; + + @Autowired + IPCCDataExportTimeSeriesXML ipccDataExportToXML; + + @Autowired + LocalPropertiesService localPropertiesService; + + @Autowired + IPCCDataExportMatrixExcel dataExportMatrixExcel; + + @Autowired + IPCCDataExportMatrixExtendedExcel dataExportMatrixExtendedExcel; + + @Autowired + IPCCDataExportLandUnitsCSV dataExportLandUnitsCSV; + + @Autowired + IPCCDataExportPerPlotCSV dataExportPerPlotCSV; + + @Autowired + IPCCLandUses landUses; + + IPCCSurveyAdapter ipccSurveyAdapter; + + Logger logger = LoggerFactory.getLogger( IPCCGenerator.class ); + + public static final int END_YEAR = Calendar.getInstance().get(Calendar.YEAR); // Assume the last year is current year + public static final int START_YEAR = 2000; // Assume start year at 2000 + + public File generateRDB( Survey survey, InfiniteProgressMonitor progressListener) throws IPCCGeneratorException { + + ipccSurveyAdapter = new IPCCSurveyAdapter(); + + // Add attributes for each year containing the LU Category and Subdivision if not present + Survey modifiedSurvey = ipccSurveyAdapter.addIPCCAttributesToSurvey( survey ); + + // Generate Relational Database of the survey data + ipccRdbGenerator.generateRelationalDatabase( modifiedSurvey, progressListener); + + return null; } - @Override - protected File generateFile( List strataData) throws IOException { - File xmlFileDestination = File.createTempFile("landUsesTimeseries", ".xml"); - xmlFileDestination.deleteOnExit(); - XStream xStream = new XStream(); - xStream.alias("LandUse", LUDataPerYear.class); - xStream.alias("Stratum", StratumPerYearData.class); - xStream.alias("Subdivision", LandUseSubdivision.class); + public void produceOutputs( Survey survey, InfiniteProgressMonitor progressListener ) { - xStream.setMode(XStream.NO_REFERENCES); - String xmlSchema = xStream.toXML(strataData); - - try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { - byte[] strToBytes = xmlSchema.getBytes(); - outputStream.write(strToBytes); - } catch (Exception e) { - logger.error("Error saving data to file", e); + progressListener.hide(); + + // Assign Management types to the Land Use Subdivisions found in the survey data + AssignSubdivisionTypesWizard wizard = new AssignSubdivisionTypesWizard(); + wizard.initializeTypes(landUses.getLandUseSubdivisions()); + + if( !wizard.isWizardFinished() ) { + logger.info( "The user closed the wizard without finishing assigning management types"); + return; } + + File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.GHGI_ZIP_FILE, true, false, "LandUseForGHGi", localPropertiesService, null); + + if( exportToFile== null || exportToFile.length != 1 ) { + logger.info("The user should choose a ZIP file to export the results to! No file chosen, aborting the rest of the execution"); + return; + } + + try { + File destinationZip = exportToFile[0]; + + final int STEPS = 7; + int currentStep = 1; + + progressListener.show(); + + progressListener.updateProgress(currentStep++, STEPS, "Generating CSV aggregated time-series" ); + // Extract data from the Relational Database into an excel file of transition Matrixes per year + File landUnitsCSVFile =dataExportLandUnitsCSV.generateTimeseriesData(START_YEAR, END_YEAR); + if( progressListener.isUserCancelled() ) return; - return xmlFileDestination; + progressListener.updateProgress(currentStep++, STEPS, "Generating CSV per plot time-series" ); + // Extract data from the Relational Database into an excel file of transition Matrixes per year + File perPlotCSVFile =dataExportPerPlotCSV.generateTimeseriesData(START_YEAR, END_YEAR); + if( progressListener.isUserCancelled() ) return; + + progressListener.updateProgress(currentStep++, STEPS, "Generating survey setup files" ); + // Generate list of subdivisions in survey + File subdivisionsFile = LandUseSubdivisionUtils.getSubdivisionsXML(); + File climateZones = StratumUtils.getClimateZonesXML( survey ); + File ecologicalZones = StratumUtils.getEcologicalZonesXML( survey ); + File soilTypes = StratumUtils.getSoilTypesXML( survey ); + if( progressListener.isUserCancelled() ) return; + + progressListener.updateProgress(currentStep++, STEPS, "Generating XML timeseries file" ); + // Extract data from the Relational Database into an XML File with information per year + File timeseriesXMLFile =ipccDataExportToXML.generateTimeseriesData(IPCCGenerator.START_YEAR, IPCCGenerator.END_YEAR ); + if( progressListener.isUserCancelled() ) return; + + progressListener.updateProgress(currentStep++, STEPS, "Generating Excel LU Matrixes per year" ); + // Extract data from the Relational Database into an excel file of transition Matrixes per year + File matrixXLSFile =dataExportMatrixExcel.generateTimeseriesData(START_YEAR, END_YEAR); + if( progressListener.isUserCancelled() ) return; + + progressListener.updateProgress(currentStep++, STEPS, "Generating Excel LU Matrixes per year STRATIFIED" ); + // Extract data from the Relational Database into an excel file of transition Matrixes per year + File matrixXLSExtendedFile =dataExportMatrixExtendedExcel.generateTimeseriesData(START_YEAR, END_YEAR); + if( progressListener.isUserCancelled() ) return; + + try { + progressListener.updateProgress(currentStep++, STEPS, "Compressing files into selected destination" ); + CollectEarthUtils.addFileToZip( destinationZip , timeseriesXMLFile, "LU_Timeseries.xml"); + CollectEarthUtils.addFileToZip( destinationZip , matrixXLSFile, "LU_Matrixes.xls"); + CollectEarthUtils.addFileToZip( destinationZip , matrixXLSExtendedFile, "LU_Matrixes_stratified.xls"); + CollectEarthUtils.addFileToZip( destinationZip , subdivisionsFile, "ConfigLandUseSubdivisions.xml"); + CollectEarthUtils.addFileToZip( destinationZip , climateZones, "ConfigClimateZones.xml"); + CollectEarthUtils.addFileToZip( destinationZip , ecologicalZones, "ConfigEclogicalZones.xml"); + CollectEarthUtils.addFileToZip( destinationZip , soilTypes, "ConfigSoilTypes.xml"); + CollectEarthUtils.addFileToZip( destinationZip , landUnitsCSVFile, "LU_Timeseries_grouped.csv"); + CollectEarthUtils.addFileToZip( destinationZip , perPlotCSVFile, "LU_Timeseries_per_plot.csv"); + progressListener.hide(); + } catch (IOException e) { + logger.error("Error when creating ZIP file with timeseries content " + destinationZip, e); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (Exception e) { + logger.error("Error when zipping the timeseries content into " + destinationZip, e); //$NON-NLS-1$ //$NON-NLS-2$ + } + + // Open the ZIP file automatically to inspect the output + CollectEarthUtils.openFile( destinationZip ); + + } catch (IOException e) { + logger.error("Error generating file", e); + } + } + } From d485c0c8459f45bba1f8cdbc4f1fb3ffd75f8ebe Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:14 +0100 Subject: [PATCH 0380/1620] New translations IPCCGenerator.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 190 ++++++++++++++---- 1 file changed, 146 insertions(+), 44 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 60af2b664f..4dbb57be78 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,61 +1,163 @@ +/** + * Main class to generate the IPCC Inventory Software compliant file + */ package org.openforis.collect.earth.ipcc; import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; +import java.util.Calendar; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.view.DataFormat; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.app.view.JFileChooserExistsAware; import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.springframework.jdbc.core.RowMapper; +import org.openforis.collect.earth.ipcc.controller.StratumUtils; +import org.openforis.collect.earth.ipcc.view.AssignSubdivisionTypesWizard; +import org.openforis.idm.metamodel.Survey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.thoughtworks.xstream.XStream; - +/** + * @author Alfonso Sanchez-Paus + * + */ @Component -public class IPCCDataExportTimeSeriesXML extends IPCCDataExportTimeSeries { +public class IPCCGenerator { - @Override - protected RowMapper getRowMapper() { - return new RowMapper() { - @Override - public LUDataPerYear mapRow(ResultSet rs, int rowNum) throws SQLException { - - String categoryInitial = rs.getString(1); - String categoryFinal = rs.getString(2); - String subdivInitial = rs.getString(3); - String subdivFinal = rs.getString(4); - - return new LUDataPerYear( - LandUseSubdivisionUtils.getSubdivision(categoryInitial, subdivInitial), - LandUseSubdivisionUtils.getSubdivision(categoryFinal, subdivFinal), - rs.getDouble(5) // area - ); - } - }; + @Autowired + IPCCRDBGenerator ipccRdbGenerator; + + @Autowired + IPCCDataExportTimeSeriesXML ipccDataExportToXML; + + @Autowired + LocalPropertiesService localPropertiesService; + + @Autowired + IPCCDataExportMatrixExcel dataExportMatrixExcel; + + @Autowired + IPCCDataExportMatrixExtendedExcel dataExportMatrixExtendedExcel; + + @Autowired + IPCCDataExportLandUnitsCSV dataExportLandUnitsCSV; + + @Autowired + IPCCDataExportPerPlotCSV dataExportPerPlotCSV; + + @Autowired + IPCCLandUses landUses; + + IPCCSurveyAdapter ipccSurveyAdapter; + + Logger logger = LoggerFactory.getLogger( IPCCGenerator.class ); + + public static final int END_YEAR = Calendar.getInstance().get(Calendar.YEAR); // Assume the last year is current year + public static final int START_YEAR = 2000; // Assume start year at 2000 + + public File generateRDB( Survey survey, InfiniteProgressMonitor progressListener) throws IPCCGeneratorException { + + ipccSurveyAdapter = new IPCCSurveyAdapter(); + + // Add attributes for each year containing the LU Category and Subdivision if not present + Survey modifiedSurvey = ipccSurveyAdapter.addIPCCAttributesToSurvey( survey ); + + // Generate Relational Database of the survey data + ipccRdbGenerator.generateRelationalDatabase( modifiedSurvey, progressListener); + + return null; } - @Override - protected File generateFile( List strataData) throws IOException { - File xmlFileDestination = File.createTempFile("landUsesTimeseries", ".xml"); - xmlFileDestination.deleteOnExit(); - XStream xStream = new XStream(); - xStream.alias("LandUse", LUDataPerYear.class); - xStream.alias("Stratum", StratumPerYearData.class); - xStream.alias("Subdivision", LandUseSubdivision.class); + public void produceOutputs( Survey survey, InfiniteProgressMonitor progressListener ) { - xStream.setMode(XStream.NO_REFERENCES); - String xmlSchema = xStream.toXML(strataData); - - try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { - byte[] strToBytes = xmlSchema.getBytes(); - outputStream.write(strToBytes); - } catch (Exception e) { - logger.error("Error saving data to file", e); + progressListener.hide(); + + // Assign Management types to the Land Use Subdivisions found in the survey data + AssignSubdivisionTypesWizard wizard = new AssignSubdivisionTypesWizard(); + wizard.initializeTypes(landUses.getLandUseSubdivisions()); + + if( !wizard.isWizardFinished() ) { + logger.info( "The user closed the wizard without finishing assigning management types"); + return; } + + File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.GHGI_ZIP_FILE, true, false, "LandUseForGHGi", localPropertiesService, null); + + if( exportToFile== null || exportToFile.length != 1 ) { + logger.info("The user should choose a ZIP file to export the results to! No file chosen, aborting the rest of the execution"); + return; + } + + try { + File destinationZip = exportToFile[0]; + + final int STEPS = 7; + int currentStep = 1; + + progressListener.show(); + + progressListener.updateProgress(currentStep++, STEPS, "Generating CSV aggregated time-series" ); + // Extract data from the Relational Database into an excel file of transition Matrixes per year + File landUnitsCSVFile =dataExportLandUnitsCSV.generateTimeseriesData(START_YEAR, END_YEAR); + if( progressListener.isUserCancelled() ) return; - return xmlFileDestination; + progressListener.updateProgress(currentStep++, STEPS, "Generating CSV per plot time-series" ); + // Extract data from the Relational Database into an excel file of transition Matrixes per year + File perPlotCSVFile =dataExportPerPlotCSV.generateTimeseriesData(START_YEAR, END_YEAR); + if( progressListener.isUserCancelled() ) return; + + progressListener.updateProgress(currentStep++, STEPS, "Generating survey setup files" ); + // Generate list of subdivisions in survey + File subdivisionsFile = LandUseSubdivisionUtils.getSubdivisionsXML(); + File climateZones = StratumUtils.getClimateZonesXML( survey ); + File ecologicalZones = StratumUtils.getEcologicalZonesXML( survey ); + File soilTypes = StratumUtils.getSoilTypesXML( survey ); + if( progressListener.isUserCancelled() ) return; + + progressListener.updateProgress(currentStep++, STEPS, "Generating XML timeseries file" ); + // Extract data from the Relational Database into an XML File with information per year + File timeseriesXMLFile =ipccDataExportToXML.generateTimeseriesData(IPCCGenerator.START_YEAR, IPCCGenerator.END_YEAR ); + if( progressListener.isUserCancelled() ) return; + + progressListener.updateProgress(currentStep++, STEPS, "Generating Excel LU Matrixes per year" ); + // Extract data from the Relational Database into an excel file of transition Matrixes per year + File matrixXLSFile =dataExportMatrixExcel.generateTimeseriesData(START_YEAR, END_YEAR); + if( progressListener.isUserCancelled() ) return; + + progressListener.updateProgress(currentStep++, STEPS, "Generating Excel LU Matrixes per year STRATIFIED" ); + // Extract data from the Relational Database into an excel file of transition Matrixes per year + File matrixXLSExtendedFile =dataExportMatrixExtendedExcel.generateTimeseriesData(START_YEAR, END_YEAR); + if( progressListener.isUserCancelled() ) return; + + try { + progressListener.updateProgress(currentStep++, STEPS, "Compressing files into selected destination" ); + CollectEarthUtils.addFileToZip( destinationZip , timeseriesXMLFile, "LU_Timeseries.xml"); + CollectEarthUtils.addFileToZip( destinationZip , matrixXLSFile, "LU_Matrixes.xls"); + CollectEarthUtils.addFileToZip( destinationZip , matrixXLSExtendedFile, "LU_Matrixes_stratified.xls"); + CollectEarthUtils.addFileToZip( destinationZip , subdivisionsFile, "ConfigLandUseSubdivisions.xml"); + CollectEarthUtils.addFileToZip( destinationZip , climateZones, "ConfigClimateZones.xml"); + CollectEarthUtils.addFileToZip( destinationZip , ecologicalZones, "ConfigEclogicalZones.xml"); + CollectEarthUtils.addFileToZip( destinationZip , soilTypes, "ConfigSoilTypes.xml"); + CollectEarthUtils.addFileToZip( destinationZip , landUnitsCSVFile, "LU_Timeseries_grouped.csv"); + CollectEarthUtils.addFileToZip( destinationZip , perPlotCSVFile, "LU_Timeseries_per_plot.csv"); + progressListener.hide(); + } catch (IOException e) { + logger.error("Error when creating ZIP file with timeseries content " + destinationZip, e); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (Exception e) { + logger.error("Error when zipping the timeseries content into " + destinationZip, e); //$NON-NLS-1$ //$NON-NLS-2$ + } + + // Open the ZIP file automatically to inspect the output + CollectEarthUtils.openFile( destinationZip ); + + } catch (IOException e) { + logger.error("Error generating file", e); + } + } + } From 14695ff269948012e09e40c07921b48ee72910bd Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:15 +0100 Subject: [PATCH 0381/1620] New translations IPCCDataExportMatrixExcel.java (Spanish) --- .../earth/app/view/Messages_es.properties | 327 +++++++++++------- 1 file changed, 199 insertions(+), 128 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 4dbb57be78..1230b9a5c0 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,163 +1,234 @@ -/** - * Main class to generate the IPCC Inventory Software compliant file - */ package org.openforis.collect.earth.ipcc; import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; -import java.util.Calendar; - -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.view.DataFormat; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.app.view.JFileChooserExistsAware; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections.Predicate; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.Font; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.RDBConnector; +import org.openforis.collect.earth.app.service.RegionCalculationUtils; +import org.openforis.collect.earth.app.service.SchemaService; import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; -import org.openforis.collect.earth.ipcc.controller.StratumUtils; -import org.openforis.collect.earth.ipcc.view.AssignSubdivisionTypesWizard; -import org.openforis.idm.metamodel.Survey; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Component; -/** - * @author Alfonso Sanchez-Paus - * - */ +import liquibase.pro.packaged.E; + @Component -public class IPCCGenerator { +public class IPCCDataExportMatrixExcel extends RDBConnector { - @Autowired - IPCCRDBGenerator ipccRdbGenerator; + private String schemaName; - @Autowired - IPCCDataExportTimeSeriesXML ipccDataExportToXML; - - @Autowired - LocalPropertiesService localPropertiesService; + Logger logger = LoggerFactory.getLogger(IPCCDataExportMatrixExcel.class); @Autowired - IPCCDataExportMatrixExcel dataExportMatrixExcel; - - @Autowired - IPCCDataExportMatrixExtendedExcel dataExportMatrixExtendedExcel; - - @Autowired - IPCCDataExportLandUnitsCSV dataExportLandUnitsCSV; - - @Autowired - IPCCDataExportPerPlotCSV dataExportPerPlotCSV; - - @Autowired - IPCCLandUses landUses; - - IPCCSurveyAdapter ipccSurveyAdapter; + private SchemaService schemaService; - Logger logger = LoggerFactory.getLogger( IPCCGenerator.class ); + public IPCCDataExportMatrixExcel() { + setExportTypeUsed(ExportType.IPCC); + } - public static final int END_YEAR = Calendar.getInstance().get(Calendar.YEAR); // Assume the last year is current year - public static final int START_YEAR = 2000; // Assume start year at 2000 + public File generateTimeseriesData( int startYear, int endYear ) throws IOException { + schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - public File generateRDB( Survey survey, InfiniteProgressMonitor progressListener) throws IPCCGeneratorException { + List matrixSheets = new ArrayList(); - ipccSurveyAdapter = new IPCCSurveyAdapter(); + for (int year = startYear; year < endYear; year++) { + MatrixSheet yearMatrixData = generateLUMatrixForYear(year); + if (yearMatrixData != null) + matrixSheets.add(yearMatrixData); + } + + return createExcel( matrixSheets); + } - // Add attributes for each year containing the LU Category and Subdivision if not present - Survey modifiedSurvey = ipccSurveyAdapter.addIPCCAttributesToSurvey( survey ); - // Generate Relational Database of the survey data - ipccRdbGenerator.generateRelationalDatabase( modifiedSurvey, progressListener); + private MatrixSheet generateLUMatrixForYear(int year) { + + List luData = getJdbcTemplate().query( + "select " + + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " + + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1) + "," + + "sum( " + RegionCalculationUtils.EXPANSION_FACTOR + ")" + + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE + + " GROUP BY " + + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + "," + + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1), + getRowMapper() + ); + + if (luData.size() == 0) { // No LU data for the climate, soil, gez combination + return null; + } - return null; + YearData yearData = new YearData(year, luData); + + return new MatrixSheet( yearData ); } - public void produceOutputs( Survey survey, InfiniteProgressMonitor progressListener ) { - - progressListener.hide(); - - // Assign Management types to the Land Use Subdivisions found in the survey data - AssignSubdivisionTypesWizard wizard = new AssignSubdivisionTypesWizard(); - wizard.initializeTypes(landUses.getLandUseSubdivisions()); - - if( !wizard.isWizardFinished() ) { - logger.info( "The user closed the wizard without finishing assigning management types"); - return; - } - - File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.GHGI_ZIP_FILE, true, false, "LandUseForGHGi", localPropertiesService, null); - if( exportToFile== null || exportToFile.length != 1 ) { - logger.info("The user should choose a ZIP file to export the results to! No file chosen, aborting the rest of the execution"); - return; - } - - try { - File destinationZip = exportToFile[0]; - - final int STEPS = 7; - int currentStep = 1; - - progressListener.show(); - - progressListener.updateProgress(currentStep++, STEPS, "Generating CSV aggregated time-series" ); - // Extract data from the Relational Database into an excel file of transition Matrixes per year - File landUnitsCSVFile =dataExportLandUnitsCSV.generateTimeseriesData(START_YEAR, END_YEAR); - if( progressListener.isUserCancelled() ) return; + protected RowMapper getRowMapper() { + return new RowMapper() { + @Override + public LUDataPerYear mapRow(ResultSet rs, int rowNum) throws SQLException { + + String categoryInitial = rs.getString(1); + String categoryFinal = rs.getString(2); + String subdivInitial = rs.getString(3); + String subdivFinal = rs.getString(4); - progressListener.updateProgress(currentStep++, STEPS, "Generating CSV per plot time-series" ); - // Extract data from the Relational Database into an excel file of transition Matrixes per year - File perPlotCSVFile =dataExportPerPlotCSV.generateTimeseriesData(START_YEAR, END_YEAR); - if( progressListener.isUserCancelled() ) return; + return new LUDataPerYear( + LandUseSubdivisionUtils.getSubdivision(categoryInitial, subdivInitial), + LandUseSubdivisionUtils.getSubdivision(categoryFinal, subdivFinal), + rs.getDouble(5) // area + ); + } + }; + } + + protected static LUDataPerYear findLuData( LandUseSubdivision initialSubdivision, LandUseSubdivision finalSubdivision, List luData ) { + Collection result = CollectionUtils.select(luData, new Predicate() { + public boolean evaluate(Object a) { + return + ( (LUDataPerYear) a ).getLu().equals(initialSubdivision) + && + ( (LUDataPerYear) a ).getLuNextYear().equals(finalSubdivision); + } + }); + if( result.size() == 1 ) + return (LUDataPerYear) result.toArray(new LUDataPerYear[result.size()])[0]; + else + return new LUDataPerYear(initialSubdivision, finalSubdivision, 0); + + } + + private File createExcel( List matrixData ) throws IOException { + File excelDestination = File.createTempFile("LuMatrixTimeseries", ".xls"); + excelDestination.deleteOnExit(); + // Create a Workbook + try (Workbook workbook = new HSSFWorkbook() ){ + /* CreationHelper helps us create instances of various things like DataFormat, + Hyperlink, RichTextString etc, in a format (HSSF, XSSF) independent way */ + //CreationHelper createHelper = workbook.getCreationHelper(); + + // Create a Font for styling header cells + Font cornerFont = workbook.createFont(); + cornerFont.setBold(true); + cornerFont.setFontHeightInPoints((short) 15); + cornerFont.setColor(IndexedColors.GREY_80_PERCENT.getIndex()); + // Create a CellStyle with the font + CellStyle cornerCellStyle = workbook.createCellStyle(); + cornerCellStyle.setFont(cornerFont); - progressListener.updateProgress(currentStep++, STEPS, "Generating survey setup files" ); - // Generate list of subdivisions in survey - File subdivisionsFile = LandUseSubdivisionUtils.getSubdivisionsXML(); - File climateZones = StratumUtils.getClimateZonesXML( survey ); - File ecologicalZones = StratumUtils.getEcologicalZonesXML( survey ); - File soilTypes = StratumUtils.getSoilTypesXML( survey ); - if( progressListener.isUserCancelled() ) return; + // Create a Font for styling header cells + Font headerFont = workbook.createFont(); + headerFont.setBold(true); + headerFont.setFontHeightInPoints((short) 14); + headerFont.setColor(IndexedColors.DARK_TEAL.getIndex()); + // Create a CellStyle with the font + CellStyle headerCellStyle = workbook.createCellStyle(); + headerCellStyle.setFont(headerFont); - progressListener.updateProgress(currentStep++, STEPS, "Generating XML timeseries file" ); - // Extract data from the Relational Database into an XML File with information per year - File timeseriesXMLFile =ipccDataExportToXML.generateTimeseriesData(IPCCGenerator.START_YEAR, IPCCGenerator.END_YEAR ); - if( progressListener.isUserCancelled() ) return; - - progressListener.updateProgress(currentStep++, STEPS, "Generating Excel LU Matrixes per year" ); - // Extract data from the Relational Database into an excel file of transition Matrixes per year - File matrixXLSFile =dataExportMatrixExcel.generateTimeseriesData(START_YEAR, END_YEAR); - if( progressListener.isUserCancelled() ) return; + // Create a Font for styling non-diagonal cells + Font stdFont = workbook.createFont(); + stdFont.setBold(false); + stdFont.setFontHeightInPoints((short) 14); + stdFont.setColor(IndexedColors.DARK_RED.getIndex()); + // Create a CellStyle with the font + CellStyle stdCellStyle = workbook.createCellStyle(); + stdCellStyle.setFont(stdFont); - progressListener.updateProgress(currentStep++, STEPS, "Generating Excel LU Matrixes per year STRATIFIED" ); - // Extract data from the Relational Database into an excel file of transition Matrixes per year - File matrixXLSExtendedFile =dataExportMatrixExtendedExcel.generateTimeseriesData(START_YEAR, END_YEAR); - if( progressListener.isUserCancelled() ) return; - - try { - progressListener.updateProgress(currentStep++, STEPS, "Compressing files into selected destination" ); - CollectEarthUtils.addFileToZip( destinationZip , timeseriesXMLFile, "LU_Timeseries.xml"); - CollectEarthUtils.addFileToZip( destinationZip , matrixXLSFile, "LU_Matrixes.xls"); - CollectEarthUtils.addFileToZip( destinationZip , matrixXLSExtendedFile, "LU_Matrixes_stratified.xls"); - CollectEarthUtils.addFileToZip( destinationZip , subdivisionsFile, "ConfigLandUseSubdivisions.xml"); - CollectEarthUtils.addFileToZip( destinationZip , climateZones, "ConfigClimateZones.xml"); - CollectEarthUtils.addFileToZip( destinationZip , ecologicalZones, "ConfigEclogicalZones.xml"); - CollectEarthUtils.addFileToZip( destinationZip , soilTypes, "ConfigSoilTypes.xml"); - CollectEarthUtils.addFileToZip( destinationZip , landUnitsCSVFile, "LU_Timeseries_grouped.csv"); - CollectEarthUtils.addFileToZip( destinationZip , perPlotCSVFile, "LU_Timeseries_per_plot.csv"); - progressListener.hide(); - } catch (IOException e) { - logger.error("Error when creating ZIP file with timeseries content " + destinationZip, e); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (Exception e) { - logger.error("Error when zipping the timeseries content into " + destinationZip, e); //$NON-NLS-1$ //$NON-NLS-2$ + // Create a Font for styling non-diagonal cells + Font diagonalFont = workbook.createFont(); + diagonalFont.setBold(true); + diagonalFont.setFontHeightInPoints((short) 14); + diagonalFont.setColor(IndexedColors.DARK_GREEN.getIndex()); + // Create a CellStyle with the font + CellStyle diagonalCellStyle = workbook.createCellStyle(); + diagonalCellStyle.setFont(diagonalFont); + + for (MatrixSheet matrix : matrixData) { + // Create a Sheet + Sheet sheet = workbook.createSheet("LU Matrix " + matrix.getYearData().getYear() + "-" + (matrix.getYearData().getYear()+1 ) ); + + // Create a Row + Row headerRow = sheet.createRow(0); + Cell cell = headerRow.createCell(0); + cell.setCellValue( "Transition " + matrix.getYearData().getYear() + "/" + ( matrix.getYearData().getYear() +1 ) ); + cell.setCellStyle(cornerCellStyle); + + int i = 1; + for (LandUseSubdivision subdivision : matrix.getSubdivisions()) { + cell = headerRow.createCell(i++); + cell.setCellValue(subdivision.toString()); + cell.setCellStyle(headerCellStyle); + } + + + int rowNum = 1; + int colNum = 0; + for (LandUseSubdivision subdivisionH : matrix.getSubdivisions()) { + colNum = 0; + Row row = sheet.createRow(rowNum++); + + Cell columnCell = row.createCell(colNum++); + columnCell.setCellStyle(headerCellStyle); + columnCell.setCellValue(subdivisionH.toString()); + + colNum = 1; + for (LandUseSubdivision subdivisionV : matrix.getSubdivisions()) { + + cell = row.createCell(colNum++); + cell.setCellValue( findLuData( subdivisionH, subdivisionV, matrix.getYearData().getLuData() ).getAreaHa() ); + if( subdivisionH.equals( subdivisionV ) ) { + cell.setCellStyle(diagonalCellStyle); + }else { + cell.setCellStyle(stdCellStyle); + } + } + + } + + // Resize all columns to fit the content size + for(int j = 0; j < colNum; j++) { + sheet.autoSizeColumn(j); + } + } - - // Open the ZIP file automatically to inspect the output - CollectEarthUtils.openFile( destinationZip ); - } catch (IOException e) { - logger.error("Error generating file", e); + // Write the output to a file + try( FileOutputStream fileOut = new FileOutputStream(excelDestination) ){ + workbook.write(fileOut); + } catch (IOException e) { + logger.error("Error generating Excel file", e); + } + } catch (Exception e) { + logger.error("Error generating Excel data", e); } - + return excelDestination; } } From 2edae2fe0d1cc8ffa2cb8617f1401467f407602a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:16 +0100 Subject: [PATCH 0382/1620] New translations IPCCDataExportLandUnitsCSV.java (English) --- .../earth/app/view/Messages_en.properties | 106 +++++++++++------- 1 file changed, 68 insertions(+), 38 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 60af2b664f..1c57311278 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,61 +1,91 @@ package org.openforis.collect.earth.ipcc; import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; -import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.RegionCalculationUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Component; -import com.thoughtworks.xstream.XStream; - @Component -public class IPCCDataExportTimeSeriesXML extends IPCCDataExportTimeSeries { +public class IPCCDataExportLandUnitsCSV extends IPCCDataExportCSV { + + private String schemaName; + + Logger logger = LoggerFactory.getLogger(IPCCDataExportLandUnitsCSV.class); + + private final static String LAND_UNIT_ID = "land_unit_id"; + + public IPCCDataExportLandUnitsCSV() { + super(); + setExportTypeUsed(ExportType.IPCC); + } + + public File generateTimeseriesData( int startYear, int endYear ) throws IOException { + schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); + List luCombinations = generateLUCombinations(startYear, endYear); + return createCsv( luCombinations); + } @Override - protected RowMapper getRowMapper() { - return new RowMapper() { + protected RowMapper getRowMapper() { + return new RowMapper() { @Override - public LUDataPerYear mapRow(ResultSet rs, int rowNum) throws SQLException { - - String categoryInitial = rs.getString(1); - String categoryFinal = rs.getString(2); - String subdivInitial = rs.getString(3); - String subdivFinal = rs.getString(4); - - return new LUDataPerYear( - LandUseSubdivisionUtils.getSubdivision(categoryInitial, subdivInitial), - LandUseSubdivisionUtils.getSubdivision(categoryFinal, subdivFinal), - rs.getDouble(5) // area - ); + public String[] mapRow(ResultSet rs, int rowNum) throws SQLException { + int columnCount = rs.getMetaData().getColumnCount(); + columnCount++; // adding an extra column with the row number + String[] columns = new String[ columnCount ]; + columns[0] = "LU_" + String.format("%04d", rs.getRow()) ; + for (int i = 1; i < columnCount; i++) { + columns[i] = rs.getString(i); + } + return columns; } }; } + + private List generateLUCombinations(int startYear, int endYear) { + String selectedYears = IPCCDataExportTimeSeries.CLIMATE_COLUMN_LABEL + + ", " + IPCCDataExportTimeSeries.SOIL_COLUMN_LABEL + + ", " + IPCCDataExportTimeSeries.GEZ_COLUMN_LABEL + ", " ; + for( int year = startYear ; year <= endYear; year++ ) { + selectedYears += IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + ","; + } - @Override - protected File generateFile( List strataData) throws IOException { - File xmlFileDestination = File.createTempFile("landUsesTimeseries", ".xml"); - xmlFileDestination.deleteOnExit(); - XStream xStream = new XStream(); - xStream.alias("LandUse", LUDataPerYear.class); - xStream.alias("Stratum", StratumPerYearData.class); - xStream.alias("Subdivision", LandUseSubdivision.class); - - xStream.setMode(XStream.NO_REFERENCES); - String xmlSchema = xStream.toXML(strataData); + String sqlSelect = "select " + + selectedYears + + " sum( " + RegionCalculationUtils.EXPANSION_FACTOR + ")" + + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.SOIL_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.CLIMATE_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.GEZ_TABLE - try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { - byte[] strToBytes = xmlSchema.getBytes(); - outputStream.write(strToBytes); - } catch (Exception e) { - logger.error("Error saving data to file", e); - } + + " where " + + IPCCDataExportTimeSeries.SOIL_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.SOIL_COLUMN_ID + + " and " + + IPCCDataExportTimeSeries.CLIMATE_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_ID + + " and " + + IPCCDataExportTimeSeries.GEZ_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.GEZ_COLUMN_ID - return xmlFileDestination; + + " GROUP BY " + + selectedYears.substring(0, selectedYears.length()-1) + + " ORDER BY sum( "+ RegionCalculationUtils.EXPANSION_FACTOR + " ) DESC"; // Remove trailing comma from list of years + + + List luData = getJdbcTemplate().query( + sqlSelect + , + getRowMapper() + ); + + selectedYears= LAND_UNIT_ID + "," + selectedYears; // Add the Land Unit ID which is basically the row number + selectedYears+= "area"; // so the area columns appears too + luData.add( 0, selectedYears.split(",") ); // Add the header row for the CSV output in the first position of the List + return luData; } + } From 4cd877a60ff90b1e24a8786e80b8d8d03a3122dc Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:17 +0100 Subject: [PATCH 0383/1620] New translations PropertiesDialog.java (English) --- .../earth/app/view/Messages_en.properties | 1300 +++++++++++++++-- 1 file changed, 1209 insertions(+), 91 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 1c57311278..7eb0424502 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,91 +1,1209 @@ -package org.openforis.collect.earth.ipcc; - -import java.io.File; -import java.io.IOException; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; - -import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.RegionCalculationUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.jdbc.core.RowMapper; -import org.springframework.stereotype.Component; - -@Component -public class IPCCDataExportLandUnitsCSV extends IPCCDataExportCSV { - - private String schemaName; - - Logger logger = LoggerFactory.getLogger(IPCCDataExportLandUnitsCSV.class); - - private final static String LAND_UNIT_ID = "land_unit_id"; - - public IPCCDataExportLandUnitsCSV() { - super(); - setExportTypeUsed(ExportType.IPCC); - } - - public File generateTimeseriesData( int startYear, int endYear ) throws IOException { - schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - List luCombinations = generateLUCombinations(startYear, endYear); - return createCsv( luCombinations); - } - - @Override - protected RowMapper getRowMapper() { - return new RowMapper() { - @Override - public String[] mapRow(ResultSet rs, int rowNum) throws SQLException { - int columnCount = rs.getMetaData().getColumnCount(); - columnCount++; // adding an extra column with the row number - String[] columns = new String[ columnCount ]; - columns[0] = "LU_" + String.format("%04d", rs.getRow()) ; - for (int i = 1; i < columnCount; i++) { - columns[i] = rs.getString(i); - } - return columns; - } - }; - } - - private List generateLUCombinations(int startYear, int endYear) { - String selectedYears = IPCCDataExportTimeSeries.CLIMATE_COLUMN_LABEL + - ", " + IPCCDataExportTimeSeries.SOIL_COLUMN_LABEL + - ", " + IPCCDataExportTimeSeries.GEZ_COLUMN_LABEL + ", " ; - for( int year = startYear ; year <= endYear; year++ ) { - selectedYears += IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + ","; - } - - String sqlSelect = "select " - + selectedYears - + " sum( " + RegionCalculationUtils.EXPANSION_FACTOR + ")" - + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.SOIL_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.CLIMATE_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.GEZ_TABLE - - + " where " - + IPCCDataExportTimeSeries.SOIL_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.SOIL_COLUMN_ID - + " and " - + IPCCDataExportTimeSeries.CLIMATE_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_ID - + " and " - + IPCCDataExportTimeSeries.GEZ_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.GEZ_COLUMN_ID - - + " GROUP BY " - + selectedYears.substring(0, selectedYears.length()-1) - + " ORDER BY sum( "+ RegionCalculationUtils.EXPANSION_FACTOR + " ) DESC"; // Remove trailing comma from list of years - - - List luData = getJdbcTemplate().query( - sqlSelect - , - getRowMapper() - ); - - selectedYears= LAND_UNIT_ID + "," + selectedYears; // Add the Land Unit ID which is basically the row number - selectedYears+= "area"; // so the area columns appears too - luData.add( 0, selectedYears.split(",") ); // Add the header row for the CSV output in the first position of the List - return luData; - } - -} +package org.openforis.collect.earth.app.view; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.GridLayout; +import java.awt.Insets; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.io.IOException; +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; + +import javax.swing.AbstractAction; +import javax.swing.AbstractButton; +import javax.swing.ButtonGroup; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JPasswordField; +import javax.swing.JRadioButton; +import javax.swing.JScrollPane; +import javax.swing.JTabbedPane; +import javax.swing.JTextField; +import javax.swing.ListSelectionModel; +import javax.swing.ScrollPaneConstants; +import javax.swing.border.BevelBorder; +import javax.swing.border.Border; +import javax.swing.border.TitledBorder; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; + +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; +import org.openforis.collect.earth.app.EarthConstants.OperationMode; +import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.AnalysisSaikuService; +import org.openforis.collect.earth.app.service.EarthProjectsService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; +import org.openforis.collect.model.CollectSurvey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ +public class PropertiesDialog extends JDialog { + + private static final ComboBoxItem COMBO_BOX_ITEM_CENTRAL_POINT = new ComboBoxItem(1, + Messages.getString("OptionWizard.54")); + + private static final ComboBoxItem COMBO_BOX_ITEM_SQUARE = new ComboBoxItem(0, + Messages.getString("OptionWizard.53")); + + private static final long serialVersionUID = -6760020609229102842L; + + private final HashMap, JComponent[]> propertyToComponent = new HashMap<>(); + private final transient Logger logger = LoggerFactory.getLogger(this.getClass()); + + JPanel postgresPanel; + JPanel sqlitePanel; + + private transient LocalPropertiesService localPropertiesService; + + String backupFolder; + + private transient AnalysisSaikuService saikuService; + + private transient EarthProjectsService projectsService; + + private boolean restartRequired; + + private String oldSelectedDistance; + + private CollectSurvey surveyLoaded; + + private JButton applyChanges; + + public PropertiesDialog(JFrame frame, LocalPropertiesService localPropertiesService, + EarthProjectsService projectsService, String backupFolder, AnalysisSaikuService saikuService, + CollectSurvey surveyLoaded) { + super(frame, Messages.getString("OptionWizard.0")); //$NON-NLS-1$ + this.localPropertiesService = localPropertiesService; + this.projectsService = projectsService; + this.backupFolder = backupFolder; + this.saikuService = saikuService; + this.surveyLoaded = surveyLoaded; + this.setLocationRelativeTo(null); + this.setSize(new Dimension(600, 620)); + this.setModal(true); + this.setResizable(false); + initilizeInputs(); + buildMainPane(); + centreWindow(); + + } + + private void centreWindow() { + Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize(); + int x = (int) ((dimension.getWidth() - getWidth()) / 2); + int y = (int) ((dimension.getHeight() - getHeight()) / 2); + setLocation(x, y); + } + + private void buildMainPane() { + + final JPanel panel = new JPanel(new BorderLayout()); + panel.add(getOptionTabs(), BorderLayout.CENTER); + final JPanel buttonPanel = new JPanel(); + buttonPanel.add(getApplyChangesButton()); + buttonPanel.add(getCancelButton()); + panel.add(buttonPanel, BorderLayout.PAGE_END); + this.add(panel); + + } + + private void enableContainer(Container container, boolean enable) { + final Component[] components = container.getComponents(); + for (final Component component : components) { + component.setEnabled(enable); + if (component instanceof Container) { + enableContainer((Container) component, enable); + } + } + } + + private JComponent getBrowsersOptionsPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + final JPanel browserChooserPanel = new JPanel(); + final Border browserBorder = new TitledBorder(new BevelBorder(BevelBorder.LOWERED), + Messages.getString("OptionWizard.1")); //$NON-NLS-1$ + browserChooserPanel.setBorder(browserBorder); + GridLayout experimentLayout = new GridLayout(0,1); + browserChooserPanel.setLayout( experimentLayout ); + + final ButtonGroup browserChooser = new ButtonGroup(); + final JComponent[] browsers = propertyToComponent.get(EarthProperty.BROWSER_TO_USE); + + for (final JComponent browserRadioButton : browsers) { + browserChooserPanel.add(browserRadioButton); + browserChooser.add((AbstractButton) browserRadioButton); + + ((JRadioButton) browserRadioButton).addActionListener(e -> setRestartRequired(true)); + } + constraints.gridy++; + panel.add(browserChooserPanel, constraints); + + constraints.gridy++; + constraints.gridx = 0; + panel.add(propertyToComponent.get(EarthProperty.SAIKU_SERVER_FOLDER)[0], constraints); + + return panel; + } + + private JComponent getIntegrationsPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + panel.add(propertyToComponent.get(EarthProperty.OPEN_GEE_APP)[0], constraints); + + constraints.gridy++; + panel.add(propertyToComponent.get(EarthProperty.OPEN_BING_MAPS)[0], constraints); + + constraints.gridy++; + panel.add(propertyToComponent.get(EarthProperty.OPEN_EARTH_MAP)[0], constraints); + + + constraints.gridy++; + constraints.gridwidth = 1; + panel.add(propertyToComponent.get(EarthProperty.OPEN_PLANET_MAPS)[0], constraints); + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.PLANET_MAPS_MONHLY)[0], constraints); + + constraints.gridy++; + constraints.gridx = 0; + constraints.gridwidth = 1; + final JLabel label = new JLabel(Messages.getString("OptionWizard.101")); //$NON-NLS-1$ + panel.add(label, constraints); + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.PLANET_MAPS_KEY)[0], constraints); + + constraints.gridx = 0; + constraints.gridy++; + constraints.gridwidth = 2; + panel.add(propertyToComponent.get(EarthProperty.OPEN_MAXAR_SECUREWATCH)[0], constraints); + + constraints.gridy++; + constraints.gridwidth = 1; + final JLabel labelMaxar = new JLabel(Messages.getString("OptionWizard.1021")); //$NON-NLS-1$ + panel.add(labelMaxar, constraints); + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.MAXAR_SECUREWATCH_URL)[0], constraints); + + constraints.gridx = 0; + constraints.gridy++; + constraints.gridwidth = 2; + panel.add(propertyToComponent.get(EarthProperty.OPEN_YANDEX_MAPS)[0], constraints); + + constraints.gridy++; + panel.add(propertyToComponent.get(EarthProperty.OPEN_BAIDU_MAPS)[0], constraints); + + constraints.gridy++; + final JLabel label2 = new JLabel(Messages.getString("OptionWizard.103")); //$NON-NLS-1$ + panel.add(label2, constraints); + constraints.gridy++; + panel.add(propertyToComponent.get(EarthProperty.EXTRA_MAP_URL)[0], constraints); + + constraints.gridy++; + constraints.gridx = 0; + constraints.gridwidth = 2; + panel.add(propertyToComponent.get(EarthProperty.OPEN_GEE_CODE_EDITOR)[0], constraints); + + + return panel; + } + + + private Component getApplyChangesButton() { + if (applyChanges == null) { + applyChanges = new JButton(Messages.getString("OptionWizard.15")); + applyChanges.addActionListener( + new ApplyOptionChangesListener(this, localPropertiesService, propertyToComponent) { + @Override + protected void applyProperties() { + new Thread("Applying properties dialog") { + @Override + public void run() { + savePropertyValues(); + if (isRestartRequired()) { + + restartEarth(); + } else { + EarthApp.executeKmlLoadAsynchronously(PropertiesDialog.this); + } + } + }.start(); + } + }); + } + return applyChanges; + } + + public void closeDialog() { + this.dispose(); + } + + private Component getCancelButton() { + final JButton cancelButton = new JButton(Messages.getString("OptionWizard.24")); //$NON-NLS-1$ + cancelButton.addActionListener( e -> PropertiesDialog.this.dispose() ); + return cancelButton; + } + + private JComponent getOperationModePanel() { + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + final JPanel typeOfUsePanel = new JPanel(new GridBagLayout()); + final Border border = new TitledBorder(new BevelBorder(BevelBorder.LOWERED), + Messages.getString("OptionWizard.2")); //$NON-NLS-1$ + typeOfUsePanel.setBorder(border); + + JPanel serverPanel = getServerPanel(); + typeOfUsePanel.add(serverPanel, constraints); + + return typeOfUsePanel; + } + + private void enableDBOptions(boolean isPostgreDb) { + enableContainer(postgresPanel, isPostgreDb); + enableContainer(sqlitePanel, !isPostgreDb); + } + + private ActionListener getDbTypeListener() { + return e -> { + final JRadioButton theJRB = (JRadioButton) e.getSource(); + + boolean isPostgreDb = theJRB.getName().equals(CollectDBDriver.POSTGRESQL.name()); + enableDBOptions(isPostgreDb); + }; + } + + private JTabbedPane getOptionTabs() { + final JTabbedPane tabbedPane = new JTabbedPane(); + tabbedPane.setSize(550, 300); + final JComponent panel1 = getSampleDataPanel(); + tabbedPane.addTab(Messages.getString("OptionWizard.31"), panel1); //$NON-NLS-1$ + + final JComponent panel2 = getPlotOptionsPanel(); + tabbedPane.addTab(Messages.getString("OptionWizard.32"), panel2); //$NON-NLS-1$ + + final JComponent panel3 = getSurveyDefinitonPanel(); + tabbedPane.addTab(Messages.getString("OptionWizard.33"), panel3); //$NON-NLS-1$ + + final JComponent panel41 = getIntegrationsPanel(); + tabbedPane.addTab(Messages.getString("OptionWizard.34"), panel41); //$NON-NLS-1$ + + final JComponent panel4 = getBrowsersOptionsPanel(); + tabbedPane.addTab(Messages.getString("OptionWizard.104"), panel4); //$NON-NLS-1$ + + final JComponent panel5 = getOperationModePanelScroll(); + tabbedPane.addTab(Messages.getString("OptionWizard.25"), panel5); //$NON-NLS-1$ + + final JComponent panel6 = getProjectsPanelScroll(); + tabbedPane.addTab(Messages.getString("OptionWizard.40"), panel6); //$NON-NLS-1$ + + return tabbedPane; + } + + private JComponent getProjectsPanelScroll() { + final JComponent projectsPanel = getProjectsPanel(); + return new JScrollPane(projectsPanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + } + + private JComponent getProjectsPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.fill = GridBagConstraints.BOTH; + + JButton importNewButton = new JButton(Messages.getString("OptionWizard.41")); //$NON-NLS-1$ + importNewButton.addActionListener(new ApplyOptionChangesListener(this, localPropertiesService) { + + @Override + protected void applyProperties() { + final File[] selectedProjectFile = JFileChooserExistsAware.getFileChooserResults( + DataFormat.PROJECT_DEFINITION_FILE, false, false, null, localPropertiesService, + (JFrame) PropertiesDialog.this.getParent()); + + if (selectedProjectFile != null && selectedProjectFile.length == 1) { + try { + projectsService.loadCompressedProjectFile(selectedProjectFile[0]); + restartEarth(); + } catch (Exception e1) { + JOptionPane.showMessageDialog(PropertiesDialog.this, e1.getMessage(), + Messages.getString("OptionWizard.51"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + logger.error("Error importing project file " + selectedProjectFile[0].getAbsolutePath(), e1); //$NON-NLS-1$ + } + + } + } + }); + + panel.add(importNewButton, constraints); + + final JPanel typeOfDbPanel = new JPanel(new GridBagLayout()); + final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), + Messages.getString("OptionWizard.57")); //$NON-NLS-1$ + typeOfDbPanel.setBorder(border); + + constraints.gridx = 0; + constraints.gridy = 1; + panel.add(typeOfDbPanel, constraints); + + List listOfProjectsByName = new ArrayList<>(); + listOfProjectsByName.addAll(projectsService.getProjectList().keySet()); + Collections.sort(listOfProjectsByName); + final JList listOfProjects = new JList<>(listOfProjectsByName.toArray(new String[0])); // data has type Object[] + listOfProjects.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + listOfProjects.setLayoutOrientation(JList.VERTICAL); + listOfProjects.setVisibleRowCount(-1); + + JScrollPane listScroller = new JScrollPane(listOfProjects); + listScroller.setPreferredSize(new Dimension(250, 300)); + + constraints.gridy = 0; + constraints.gridx = GridBagConstraints.RELATIVE; + typeOfDbPanel.add(listScroller, constraints); + + final JButton openProject = new JButton(Messages.getString("OptionWizard.56")); //$NON-NLS-1$ + openProject.setEnabled(false); + openProject.addActionListener(new ApplyOptionChangesListener(this, localPropertiesService) { + + @Override + protected void applyProperties() { + + File projectFolder = projectsService.getProjectList().get(listOfProjects.getSelectedValue()); + + try { + projectsService.loadProjectInFolder(projectFolder); + restartEarth(); + } catch (Exception e1) { + JOptionPane.showMessageDialog(PropertiesDialog.this, e1.getMessage(), + Messages.getString("OptionWizard.55"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + logger.error("Error importing project folder " + projectFolder.getAbsolutePath(), e1); //$NON-NLS-1$ + } + + } + + }); + + listOfProjects.addListSelectionListener(e -> openProject.setEnabled(listOfProjects.getSelectedValue() != null) ); + + typeOfDbPanel.add(openProject); + + return panel; + } + + private JScrollPane getOperationModePanelScroll() { + final JComponent operationModePanel = getOperationModePanel(); + return new JScrollPane(operationModePanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + } + + private JComponent getPlotOptionsPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.fill = GridBagConstraints.HORIZONTAL; + + JLabel label = new JLabel("Plot shape"); + panel.add(label, constraints); + + constraints.gridx = 1; + JComboBox plotShape = (JComboBox) propertyToComponent.get(EarthProperty.SAMPLE_SHAPE)[0]; + panel.add(plotShape, constraints); + + constraints.gridx = 0; + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.35")); //$NON-NLS-1$ + panel.add(label, constraints); + + constraints.gridx = 1; + JComboBox numberPoints = (JComboBox) propertyToComponent + .get(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT)[0]; + panel.add(numberPoints, constraints); + + constraints.gridx = 0; + constraints.gridy++; + JLabel distanceOrRadiuslabel = new JLabel(Messages.getString("OptionWizard.36")); //$NON-NLS-1$ + panel.add(distanceOrRadiuslabel, constraints); + + constraints.gridx = 1; + JComboBox distanceBetweenPoints = (JComboBox) propertyToComponent + .get(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS)[0]; + panel.add(new JScrollPane(distanceBetweenPoints), constraints); + + constraints.gridx = 0; + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.37")); //$NON-NLS-1$ + panel.add(label, constraints); + constraints.gridx = 1; + JComboBox distanceToFrame = (JComboBox) propertyToComponent + .get(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES)[0]; + panel.add(new JScrollPane(distanceToFrame), constraints); + + constraints.gridx = 0; + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.95")); //$NON-NLS-1$ + panel.add(label, constraints); + constraints.gridx = 1; + JComboBox dotsSide = (JComboBox) propertyToComponent.get(EarthProperty.INNER_SUBPLOT_SIDE)[0]; + panel.add(new JScrollPane(dotsSide), constraints); + + constraints.gridx = 0; + constraints.gridy++; + label = new JLabel("Central plot side"); //$NON-NLS-1$ + panel.add(label, constraints); + constraints.gridx = 1; + JComboBox largeCentralPlotSide = (JComboBox) propertyToComponent.get(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)[0]; + panel.add(new JScrollPane(largeCentralPlotSide), constraints); + + + + constraints.gridx = 0; + constraints.gridy++; + label = new JLabel("Distance between plots in cluster"); + panel.add(label, constraints); + constraints.gridx = 1; + JComboBox plotDistanceInCluster = (JComboBox) propertyToComponent + .get(EarthProperty.DISTANCE_BETWEEN_PLOTS)[0]; + panel.add(new JScrollPane(plotDistanceInCluster), constraints); + + constraints.gridx = 0; + constraints.gridy++; + JLabel area = new JLabel( + "Area (hectares) : " + calculateArea(numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide)); + panel.add(area, constraints); + + ActionListener calculateAreas = actionPerformed -> area.setText("Area (hectares) : " + calculateArea(numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide)); + + plotShape.addActionListener( e-> + handleVisibilityPlotLayout(plotShape, numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide, + plotDistanceInCluster, area, distanceOrRadiuslabel, largeCentralPlotSide) + ); + + numberPoints.addActionListener(calculateAreas); + distanceBetweenPoints.addActionListener(calculateAreas); + distanceToFrame.addActionListener(calculateAreas); + + handleVisibilityPlotLayout(plotShape, numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide, + plotDistanceInCluster, area, distanceOrRadiuslabel, largeCentralPlotSide); + + return panel; + } + + public void handleVisibilityPlotLayout(JComboBox plotShape, JComboBox numberPoints, JComboBox distanceBetweenPoints, + JComboBox distanceToFrame, JComboBox dotsSide, JComboBox distanceBetweenPlots, JLabel area, + JLabel distanceOrRadiuslabel, JComboBox largeCentralPlotSide ) { + numberPoints.setEnabled(false); + distanceBetweenPoints.setEnabled(false); + distanceToFrame.setEnabled(false); + dotsSide.setEnabled(false); + area.setVisible(false); + distanceBetweenPlots.setVisible(false); + distanceBetweenPlots.setEnabled(false); + largeCentralPlotSide.setVisible( false ); + largeCentralPlotSide.setEnabled(false); + + if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE) || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE_WITH_LARGE_CENTRAL_PLOT) ) { + numberPoints.setEnabled(true); + distanceBetweenPoints.setEnabled(true); + distanceToFrame.setEnabled(true); + dotsSide.setEnabled(true); + area.setVisible(true); + distanceOrRadiuslabel.setText(Messages.getString("OptionWizard.36")); + + if( plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE_WITH_LARGE_CENTRAL_PLOT) ) { + largeCentralPlotSide.setVisible( true ); + largeCentralPlotSide.setEnabled(true); + } + + } else if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.CIRCLE) + || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.HEXAGON)) { + distanceBetweenPoints.setEnabled(true); + dotsSide.setEnabled(true); + numberPoints.setEnabled(true); + distanceOrRadiuslabel.setText("Radius"); + } else if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.NFI_THREE_CIRCLES) || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.NFI_FOUR_CIRCLES)) { + dotsSide.setEnabled(true); + distanceBetweenPoints.setEnabled(true); + distanceBetweenPlots.setVisible(true); + distanceBetweenPlots.setEnabled(true); + distanceOrRadiuslabel.setText("Radius of the plots"); + } + } + + private String calculateArea(JComboBox numberOfPoints, JComboBox distanceBetweenPoints, JComboBox distanceToFrame, JComboBox dotsSide) { + double side = 0; + try { + int numberOfPointsI = ((ComboBoxItem) numberOfPoints.getSelectedItem()).getNumberOfPoints(); + int distanceBetweenPointsI = Integer.parseInt((String) distanceBetweenPoints.getSelectedItem()); + int distanceToFrameI = Integer.parseInt((String) distanceToFrame.getSelectedItem()); + + if (numberOfPointsI == 0 || numberOfPointsI == 1) { + + side = 2d * distanceToFrameI; + if (oldSelectedDistance == null) { + oldSelectedDistance = (String) distanceBetweenPoints.getSelectedItem(); + distanceBetweenPoints.setEnabled(false); + } + distanceBetweenPoints.setSelectedItem("0"); + + if (numberOfPointsI == 0) { + dotsSide.setEnabled(false); + } else if (numberOfPointsI == 1) { + dotsSide.setEnabled(true); + } + + } else { + if (oldSelectedDistance != null) { + distanceBetweenPoints.setSelectedItem(oldSelectedDistance); + oldSelectedDistance = null; + } + + distanceBetweenPoints.setEnabled(true); + distanceToFrame.setEnabled(true); + dotsSide.setEnabled(true); + + double pointsByLines = Math.sqrt(numberOfPointsI); + side = 2d * distanceToFrameI + (pointsByLines - 1) * distanceBetweenPointsI; + + } + + } catch (RuntimeException e) { + logger.error("Error calculating area of the plot", e); + } + + DecimalFormat df = new DecimalFormat("###.##"); + return df.format(side * side / 10000d); + } + + private JPanel getPostgreSqlPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), + Messages.getString("OptionWizard.6")); //$NON-NLS-1$ + panel.setBorder(border); + + JLabel label = new JLabel(Messages.getString("OptionWizard.7")); //$NON-NLS-1$ + constraints.gridx = 0; + panel.add(label, constraints); + + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.DB_USERNAME)[0], constraints); + + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.8")); //$NON-NLS-1$ + constraints.gridx = 0; + panel.add(label, constraints); + + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.DB_PASSWORD)[0], constraints); + + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.9")); //$NON-NLS-1$ + constraints.gridx = 0; + panel.add(label, constraints); + + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.DB_NAME)[0], constraints); + + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.26")); //$NON-NLS-1$ + constraints.gridx = 0; + panel.add(label, constraints); + + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.DB_HOST)[0], constraints); + + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.29")); //$NON-NLS-1$ + constraints.gridx = 0; + panel.add(label, constraints); + + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.DB_PORT)[0], constraints); + + constraints.gridx = 2; + panel.add(new JLabel("Default: 5432"), constraints); + + constraints.gridy++; + constraints.gridx = 1; + JButton button = new JButton("Test Connection"); //$NON-NLS-1$ + button.addActionListener( e-> { + String host = ((JTextField) (propertyToComponent.get(EarthProperty.DB_HOST)[0])).getText(); + String port = ((JTextField) (propertyToComponent.get(EarthProperty.DB_PORT)[0])).getText(); + String dbName = ((JTextField) (propertyToComponent.get(EarthProperty.DB_NAME)[0])).getText(); + String username = ((JTextField) (propertyToComponent.get(EarthProperty.DB_USERNAME)[0])).getText(); + String password = ((JTextField) (propertyToComponent.get(EarthProperty.DB_PASSWORD)[0])).getText(); + + String message = CollectEarthUtils.testPostgreSQLConnection(host, port, dbName, username, password); + JOptionPane.showMessageDialog(PropertiesDialog.this.getOwner(), message, "PostgreSQL Connection test", + JOptionPane.INFORMATION_MESSAGE); + }); + panel.add(button, constraints); + + return panel; + } + + private JPanel getSqlLitePanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), + Messages.getString("OptionWizard.30")); //$NON-NLS-1$ + panel.setBorder(border); + + panel.add(propertyToComponent.get(EarthProperty.AUTOMATIC_BACKUP)[0], constraints); + constraints.gridx++; + panel.add(getOpenBackupFolderButton()); + return panel; + } + + private JComponent getSampleDataPanel() { + final JPlotCsvTable samplePlots = new JPlotCsvTable(localPropertiesService.getValue(EarthProperty.SAMPLE_FILE), + surveyLoaded); + + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.fill = GridBagConstraints.BOTH; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + + final JFilePicker refreshTableOnFileChange = getFilePickerSamplePlots(samplePlots); + + panel.add(refreshTableOnFileChange, constraints); + + samplePlots.setFillsViewportHeight(true); + constraints.gridy = 1; + + constraints.weightx = 1.0; + constraints.weighty = 1.0; + constraints.gridwidth = GridBagConstraints.REMAINDER; + constraints.gridheight = GridBagConstraints.REMAINDER; + + samplePlots.setPreferredScrollableViewportSize(samplePlots.getPreferredSize()); + + panel.add(new JScrollPane(samplePlots, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, + ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), constraints); + + return panel; + } + + private JFilePicker getFilePickerSamplePlots(final JPlotCsvTable samplePlots) { + final JFilePicker refreshTableOnFileChange = (JFilePicker) (propertyToComponent + .get(EarthProperty.SAMPLE_FILE)[0]); + refreshTableOnFileChange.addChangeListener(new DocumentListener() { + + @Override + public void changedUpdate(DocumentEvent e) { + // Do not react + } + + @Override + public void insertUpdate(DocumentEvent e) { + refreshTable(); + } + + @Override + public void removeUpdate(DocumentEvent e) { + // Do not react + } + + private void refreshTable() { + samplePlots.refreshTable(refreshTableOnFileChange.getSelectedFilePath()); + + // Do not let the user save the changes if the sample data is wrong!!! + getApplyChangesButton().setEnabled(samplePlots.isDataValid()); + } + }); + return refreshTableOnFileChange; + } + + private JPanel getServerPanel() { + + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + final JPanel typeOfDbPanel = new JPanel(new GridBagLayout()); + final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), + Messages.getString("OptionWizard.3")); //$NON-NLS-1$ + typeOfDbPanel.setBorder(border); + + JLabel label = new JLabel(Messages.getString("OptionWizard.4") + CollectEarthUtils.getComputerIp()); //$NON-NLS-1$ + typeOfDbPanel.add(label, constraints); + constraints.gridy++; + + label = new JLabel(Messages.getString("OptionWizard.5")); //$NON-NLS-1$ + constraints.gridx = 0; + typeOfDbPanel.add(label, constraints); + + constraints.gridx = 1; + typeOfDbPanel.add(propertyToComponent.get(EarthProperty.HOST_PORT_KEY)[0], constraints); + + constraints.gridwidth = GridBagConstraints.REMAINDER; + constraints.gridy++; + constraints.gridx = 0; + + final ButtonGroup bg = new ButtonGroup(); + final JComponent[] dbTypes = propertyToComponent.get(EarthProperty.DB_DRIVER); + + postgresPanel = getPostgreSqlPanel(); + sqlitePanel = getSqlLitePanel(); + + boolean usingPostgreSQL = localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.POSTGRESQL); + enableDBOptions(usingPostgreSQL); + + for (final JComponent typeRadioButton : dbTypes) { + final JRadioButton dbTypeButton = (JRadioButton) typeRadioButton; + bg.add(dbTypeButton); + typeOfDbPanel.add(dbTypeButton, constraints); + constraints.gridy++; + + dbTypeButton.addActionListener(getDbTypeListener()); + dbTypeButton.addActionListener(e -> setRestartRequired(true)); + + if (dbTypeButton.getName().equals(EarthConstants.CollectDBDriver.POSTGRESQL.name())) { + typeOfDbPanel.add(postgresPanel, constraints); + constraints.gridy++; + + } else { + typeOfDbPanel.add(sqlitePanel, constraints); + constraints.gridy++; + } + } + return typeOfDbPanel; + } + + private Component getOpenBackupFolderButton() { + + AbstractAction backupAction = new AbstractAction(Messages.getString("OptionWizard.10")) { //$NON-NLS-1$ + + private static final long serialVersionUID = 1L; + + @Override + public void actionPerformed(ActionEvent e) { + try { + + CollectEarthUtils.openFolderInExplorer(backupFolder); + + } catch (final IOException e1) { + logger.error("Error when opening the explorer window to visualize backups", e1); //$NON-NLS-1$ + } + } + + }; + + return new JButton(backupAction); + + } + + private JComponent getSurveyDefinitonPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.fill = GridBagConstraints.HORIZONTAL; + constraints.gridwidth = 2; + panel.add(propertyToComponent.get(EarthProperty.OPEN_BALLOON_IN_BROWSER)[0], constraints); + + constraints.gridy++; + constraints.gridwidth = 1; + final JLabel label = new JLabel(Messages.getString("OptionWizard.43")); //$NON-NLS-1$ + panel.add(label, constraints); + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.SURVEY_NAME)[0], constraints); + + constraints.gridy++; + constraints.gridwidth = GridBagConstraints.REMAINDER; + constraints.gridx = 0; + panel.add(propertyToComponent.get(EarthProperty.KML_TEMPLATE_KEY)[0], constraints); + + constraints.gridy++; + constraints.gridx = 0; + panel.add(propertyToComponent.get(EarthProperty.BALLOON_TEMPLATE_KEY)[0], constraints); + + constraints.gridy++; + constraints.gridx = 0; + + panel.add(propertyToComponent.get(EarthProperty.METADATA_FILE)[0], constraints); + + return panel; + } + + private void initilizeInputs() { + + final JCheckBox backupCheckbox = new JCheckBox(Messages.getString("OptionWizard.44")); //$NON-NLS-1$ + backupCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.AUTOMATIC_BACKUP))); + propertyToComponent.put(EarthProperty.AUTOMATIC_BACKUP, new JComponent[] { backupCheckbox }); + + final JCheckBox openEarthEngineCheckbox = new JCheckBox(Messages.getString("OptionWizard.45")); //$NON-NLS-1$ + openEarthEngineCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_EXPLORER))); + propertyToComponent.put(EarthProperty.OPEN_GEE_EXPLORER, new JComponent[] { openEarthEngineCheckbox }); + + final JCheckBox openGEEAppCheckbox = new JCheckBox("Google Earth Engine APP (no sign-in)"); //$NON-NLS-1$ + openGEEAppCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_APP))); + propertyToComponent.put(EarthProperty.OPEN_GEE_APP, new JComponent[] { openGEEAppCheckbox }); + + final JCheckBox openTimelapseCheckbox = new JCheckBox(Messages.getString("OptionWizard.46")); //$NON-NLS-1$ + openTimelapseCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_TIMELAPSE))); + propertyToComponent.put(EarthProperty.OPEN_TIMELAPSE, new JComponent[] { openTimelapseCheckbox }); + + final JCheckBox openEarthMapCheckbox = new JCheckBox(Messages.getString("OptionWizard.105")); //$NON-NLS-1$ + openEarthMapCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_EARTH_MAP))); + propertyToComponent.put(EarthProperty.OPEN_EARTH_MAP, new JComponent[] { openEarthMapCheckbox }); + + final JCheckBox openBingCheckbox = new JCheckBox(Messages.getString("OptionWizard.47")); //$NON-NLS-1$ + openBingCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BING_MAPS))); + propertyToComponent.put(EarthProperty.OPEN_BING_MAPS, new JComponent[] { openBingCheckbox }); + + final JCheckBox openPlanetCheckbox = new JCheckBox(Messages.getString("OptionWizard.100")); //$NON-NLS-1$ + openPlanetCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_PLANET_MAPS))); + propertyToComponent.put(EarthProperty.OPEN_PLANET_MAPS, new JComponent[] { openPlanetCheckbox }); + + final JCheckBox openMonthlyNICFICheckbox = new JCheckBox(Messages.getString("OptionWizard.110")); //$NON-NLS-1$ + openMonthlyNICFICheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.PLANET_MAPS_MONHLY))); + propertyToComponent.put(EarthProperty.PLANET_MAPS_MONHLY, new JComponent[] { openMonthlyNICFICheckbox }); + + + final JPasswordField planetAPIKeyTextField = new JPasswordField( + localPropertiesService.getValue(EarthProperty.PLANET_MAPS_KEY)); + planetAPIKeyTextField.setMinimumSize(new Dimension( 250, 20 )); + planetAPIKeyTextField.setEnabled( localPropertiesService.isPlanetMapsSupported() ); + propertyToComponent.put(EarthProperty.PLANET_MAPS_KEY, new JComponent[] { planetAPIKeyTextField }); + + openMonthlyNICFICheckbox.setEnabled( openPlanetCheckbox.isSelected() ); + planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ); + + openPlanetCheckbox.addActionListener( e-> { + planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ); + openMonthlyNICFICheckbox.setEnabled( openPlanetCheckbox.isSelected() ); + }); + openMonthlyNICFICheckbox.addActionListener( e-> planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ) ); + + + final JCheckBox openSecureWatchCheckbox = new JCheckBox(Messages.getString("OptionWizard.102")); //$NON-NLS-1$ + openSecureWatchCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_MAXAR_SECUREWATCH))); + propertyToComponent.put(EarthProperty.OPEN_MAXAR_SECUREWATCH, new JComponent[] { openSecureWatchCheckbox }); + + final JTextField secureWatchUrlTextField = new JTextField( + localPropertiesService.getValue(EarthProperty.MAXAR_SECUREWATCH_URL)); + secureWatchUrlTextField.setMinimumSize(new Dimension( 250, 20 )); + propertyToComponent.put(EarthProperty.MAXAR_SECUREWATCH_URL, new JComponent[] { secureWatchUrlTextField }); + secureWatchUrlTextField.setEnabled( localPropertiesService.isSecureWatchSupported() ); + propertyToComponent.put(EarthProperty.MAXAR_SECUREWATCH_URL, new JComponent[] { secureWatchUrlTextField }); + openSecureWatchCheckbox.addActionListener( e -> secureWatchUrlTextField.setEnabled( openSecureWatchCheckbox.isSelected() ) ); + + final JTextField extraUrlTextField = new JTextField( + localPropertiesService.getValue(EarthProperty.EXTRA_MAP_URL)); + extraUrlTextField.setMinimumSize(new Dimension( 250, 20 )); + propertyToComponent.put(EarthProperty.EXTRA_MAP_URL, new JComponent[] { extraUrlTextField }); + + final JCheckBox openBaiduCheckbox = new JCheckBox("Open Baidu Maps"); + openBaiduCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BAIDU_MAPS))); + propertyToComponent.put(EarthProperty.OPEN_BAIDU_MAPS, new JComponent[] { openBaiduCheckbox }); + + final JCheckBox openYandexCheckbox = new JCheckBox("Open Yandex maps for the plot area"); + openYandexCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_YANDEX_MAPS))); + propertyToComponent.put(EarthProperty.OPEN_YANDEX_MAPS, new JComponent[] { openYandexCheckbox }); + + final JCheckBox openHereCheckbox = new JCheckBox(Messages.getString("OptionWizard.59")); //$NON-NLS-1$ + openHereCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_HERE_MAPS))); + propertyToComponent.put(EarthProperty.OPEN_HERE_MAPS, new JComponent[] { openHereCheckbox }); + + final JCheckBox openGeePlaygroundCheckbox = new JCheckBox(Messages.getString("OptionWizard.58")); //$NON-NLS-1$ + openGeePlaygroundCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_CODE_EDITOR))); + propertyToComponent.put(EarthProperty.OPEN_GEE_CODE_EDITOR, new JComponent[] { openGeePlaygroundCheckbox }); + + final JCheckBox openInSeparateWindowCheckbox = new JCheckBox(Messages.getString("OptionWizard.48")); //$NON-NLS-1$ + openInSeparateWindowCheckbox.setSelected( + Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BALLOON_IN_BROWSER))); + propertyToComponent.put(EarthProperty.OPEN_BALLOON_IN_BROWSER, + new JComponent[] { openInSeparateWindowCheckbox }); + + final JFilePicker csvWithPlotData = new JFilePicker(Messages.getString("OptionWizard.49"), //$NON-NLS-1$ + localPropertiesService.getValue(EarthProperty.SAMPLE_FILE), Messages.getString("OptionWizard.50"), DlgMode.MODE_OPEN); // $NON-NLS-1$ + + csvWithPlotData.addFileTypeFilter(".csv,.ced", Messages.getString("OptionWizard.52"), true); //$NON-NLS-1$ //$NON-NLS-2$ + propertyToComponent.put(EarthProperty.SAMPLE_FILE, new JComponent[] { csvWithPlotData }); + + final JComboBox plotShape = new JComboBox<>(SAMPLE_SHAPE.values()); + try { + plotShape.setSelectedItem(SAMPLE_SHAPE.valueOf(localPropertiesService.getValue(EarthProperty.SAMPLE_SHAPE))); + } catch (Exception e1) { + logger.error("The selected shape type is not supported " + localPropertiesService.getValue(EarthProperty.SAMPLE_SHAPE), e1 ); + } + propertyToComponent.put(EarthProperty.SAMPLE_SHAPE, new JComponent[] { plotShape }); + + final JComboBox comboNumberOfPoints = new JComboBox<>( + new ComboBoxItem[] { COMBO_BOX_ITEM_SQUARE, COMBO_BOX_ITEM_CENTRAL_POINT, new ComboBoxItem(4, "2x2"), //$NON-NLS-1$ //$NON-NLS-2$ + // //$NON-NLS-3$ + new ComboBoxItem(9, "3x3"), new ComboBoxItem(16, "4x4"), new ComboBoxItem(25, "5x5"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + new ComboBoxItem(36, "6x6"), //$NON-NLS-1$ + new ComboBoxItem(49, "7x7") }); //$NON-NLS-1$ + if( StringUtils.isNotBlank( localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT) ) ){ + try { + comboNumberOfPoints.setSelectedItem(new ComboBoxItem( + Integer.parseInt(localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT)), + "")); //$NON-NLS-1$ + } catch (NumberFormatException e1) { + logger.error("This should be a number {}", localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT), e1); + } + } + propertyToComponent.put(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT, + new JComponent[] { comboNumberOfPoints }); + + final String[] listOfNumbers = new String[1500]; + final String[] listOfNumbersFromTwo = new String[1500]; + + for (int index = 0; index < listOfNumbers.length; index++) { + listOfNumbers[index] = Integer.toString( index ); //$NON-NLS-1$ + listOfNumbersFromTwo[index] = Integer.toString( index + 2 ); //$NON-NLS-1$ + } + + final JComboBox listOfDistanceBetweenPoints = new JComboBox<>(listOfNumbersFromTwo); + listOfDistanceBetweenPoints + .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS)); + listOfDistanceBetweenPoints.setAutoscrolls(true); + + propertyToComponent.put(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS, + new JComponent[] { listOfDistanceBetweenPoints }); + + final JComboBox listOfDistanceBetweenPlots = new JComboBox<>(listOfNumbersFromTwo); + listOfDistanceBetweenPlots + .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS)); + listOfDistanceBetweenPlots.setAutoscrolls(true); + + propertyToComponent.put(EarthProperty.DISTANCE_BETWEEN_PLOTS, new JComponent[] { listOfDistanceBetweenPlots }); + + final JComboBox listOfDistanceToBorder = new JComboBox<>(listOfNumbers); + listOfDistanceToBorder + .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES)); + listOfDistanceToBorder.setAutoscrolls(true); + + propertyToComponent.put(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES, new JComponent[] { listOfDistanceToBorder }); + + final JComboBox listOfSizeofSamplingDot = new JComboBox<>(listOfNumbersFromTwo); + listOfSizeofSamplingDot.setSelectedItem(localPropertiesService.getValue(EarthProperty.INNER_SUBPLOT_SIDE)); + listOfSizeofSamplingDot.setAutoscrolls(true); + + propertyToComponent.put(EarthProperty.INNER_SUBPLOT_SIDE, new JComponent[] { listOfSizeofSamplingDot }); + + final JComboBox listOfSideOflargeCentralPlot = new JComboBox<>(listOfNumbersFromTwo); + listOfSideOflargeCentralPlot.setSelectedItem(localPropertiesService.getValue(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)); + listOfSideOflargeCentralPlot.setAutoscrolls(true); + + propertyToComponent.put(EarthProperty.LARGE_CENTRAL_PLOT_SIDE, new JComponent[] { listOfSideOflargeCentralPlot }); + + + final JRadioButton chromeChooser = new JRadioButton("Chrome"); //$NON-NLS-1$ + chromeChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() + .equals(EarthConstants.CHROME_BROWSER)); + chromeChooser.setName(EarthConstants.CHROME_BROWSER); + + final JRadioButton firefoxChooser = new JRadioButton("Firefox"); //$NON-NLS-1$ + firefoxChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() + .equals(EarthConstants.FIREFOX_BROWSER)); + firefoxChooser.setName(EarthConstants.FIREFOX_BROWSER); + + final JRadioButton edgeChooser = new JRadioButton("Edge"); //$NON-NLS-1$ + edgeChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() + .equals(EarthConstants.EDGE_BROWSER)); + edgeChooser.setName(EarthConstants.EDGE_BROWSER); + + propertyToComponent.put(EarthProperty.BROWSER_TO_USE, new JComponent[] { firefoxChooser, chromeChooser, edgeChooser}); + final JFilePicker saikuPath = new JFilePicker(Messages.getString("OptionWizard.65"), //$NON-NLS-1$ + localPropertiesService.getValue(EarthProperty.SAIKU_SERVER_FOLDER), + Messages.getString("OptionWizard.66"), DlgMode.MODE_OPEN); //$NON-NLS-1$ + saikuPath.setFolderChooser(); + saikuPath.addChangeListener(new DocumentListener() { + + private void showSaikuWarning() { + final File saikuFolder = new File(saikuPath.getSelectedFilePath()); + if ( !saikuService.isSaikuFolder(saikuFolder)) { + JOptionPane.showMessageDialog(PropertiesDialog.this, Messages.getString("OptionWizard.27"), //$NON-NLS-1$ + Messages.getString("OptionWizard.28"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ + saikuPath.getTextField().setBackground(CollectEarthWindow.ERROR_COLOR); + } else { + saikuPath.getTextField().setBackground(Color.white); + } + } + + @Override + public void removeUpdate(DocumentEvent e) { + // Do not react + } + + @Override + public void insertUpdate(DocumentEvent e) { + showSaikuWarning(); + } + + @Override + public void changedUpdate(DocumentEvent e) { + // Do not react + } + }); + propertyToComponent.put(EarthProperty.SAIKU_SERVER_FOLDER, new JComponent[] { saikuPath }); + + final JFilePicker kmlTemplatePath = new JFilePicker(Messages.getString("OptionWizard.79"), //$NON-NLS-1$ + localPropertiesService.getValue(EarthProperty.KML_TEMPLATE_KEY), Messages.getString("OptionWizard.80"), //$NON-NLS-1$ + DlgMode.MODE_OPEN); + kmlTemplatePath.addFileTypeFilter(".fmt", Messages.getString("OptionWizard.82"), true); //$NON-NLS-1$ //$NON-NLS-2$ + propertyToComponent.put(EarthProperty.KML_TEMPLATE_KEY, new JComponent[] { kmlTemplatePath }); + + final JFilePicker htmlBalloonPath = new JFilePicker(Messages.getString("OptionWizard.83"), //$NON-NLS-1$ + localPropertiesService.getValue(EarthProperty.BALLOON_TEMPLATE_KEY), + Messages.getString("OptionWizard.84"), DlgMode.MODE_OPEN); //$NON-NLS-1$ + htmlBalloonPath.addFileTypeFilter(".html,.htm", Messages.getString("OptionWizard.86"), true); //$NON-NLS-1$ //$NON-NLS-2$ + propertyToComponent.put(EarthProperty.BALLOON_TEMPLATE_KEY, new JComponent[] { htmlBalloonPath }); + + final JFilePicker idmPath = new JFilePicker(Messages.getString("OptionWizard.87"), //$NON-NLS-1$ + localPropertiesService.getImdFile(), Messages.getString("OptionWizard.88"), DlgMode.MODE_OPEN); //$NON-NLS-1$ + idmPath.addFileTypeFilter(".xml", Messages.getString("OptionWizard.90"), true); //$NON-NLS-1$ //$NON-NLS-2$ + propertyToComponent.put(EarthProperty.METADATA_FILE, new JComponent[] { idmPath }); + + final JTextField surveyNameTextField = new JTextField( + localPropertiesService.getValue(EarthProperty.SURVEY_NAME)); + surveyNameTextField.setEnabled(false); + propertyToComponent.put(EarthProperty.SURVEY_NAME, new JComponent[] { surveyNameTextField }); + + // Database options + + final JRadioButton instanceTypeServer = new JRadioButton(Messages.getString("OptionWizard.91")); //$NON-NLS-1$ + instanceTypeServer.setSelected(localPropertiesService.getOperationMode().equals(OperationMode.SERVER_MODE)); + instanceTypeServer.setName(EarthConstants.OperationMode.SERVER_MODE.name()); + + final JRadioButton instanceTypeClient = new JRadioButton(Messages.getString("OptionWizard.92")); //$NON-NLS-1$ + instanceTypeClient.setSelected(localPropertiesService.getOperationMode().equals(OperationMode.CLIENT_MODE)); + instanceTypeClient.setName(EarthConstants.OperationMode.CLIENT_MODE.name()); + propertyToComponent.put(EarthProperty.OPERATION_MODE, + new JComponent[] { instanceTypeServer, instanceTypeClient }); + + final JTextField collectEarthServerIp = new JTextField(localPropertiesService.getValue(EarthProperty.HOST_KEY)); + propertyToComponent.put(EarthProperty.HOST_KEY, new JComponent[] { collectEarthServerIp }); + + final JTextField collectEarthServerIpPort = new JTextField(localPropertiesService.getPort()); + final JTextField collectEarthServerLocalPort = new JTextField( + localPropertiesService.getValue(EarthProperty.HOST_PORT_KEY)); + propertyToComponent.put(EarthProperty.HOST_PORT_KEY, + new JComponent[] { collectEarthServerIpPort, collectEarthServerLocalPort }); + + final JRadioButton sqliteDbType = new JRadioButton(Messages.getString("OptionWizard.93")); //$NON-NLS-1$ + sqliteDbType.setSelected(localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.SQLITE)); + sqliteDbType.setName(CollectDBDriver.SQLITE.name()); + + final JRadioButton postgresDbType = new JRadioButton(Messages.getString("OptionWizard.94")); //$NON-NLS-1$ + boolean usingPostgreSQL = localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.POSTGRESQL); + postgresDbType.setSelected(usingPostgreSQL); + postgresDbType.setName(CollectDBDriver.POSTGRESQL.name()); + propertyToComponent.put(EarthProperty.DB_DRIVER, new JComponent[] { sqliteDbType, postgresDbType }); + + final JTextField dbUserName = new JTextField(localPropertiesService.getValue(EarthProperty.DB_USERNAME)); + propertyToComponent.put(EarthProperty.DB_USERNAME, new JComponent[] { dbUserName }); + + final JTextField dbPassword = new JTextField(localPropertiesService.getValue(EarthProperty.DB_PASSWORD)); + propertyToComponent.put(EarthProperty.DB_PASSWORD, new JComponent[] { dbPassword }); + + final JTextField dbName = new JTextField(localPropertiesService.getValue(EarthProperty.DB_NAME)); + propertyToComponent.put(EarthProperty.DB_NAME, new JComponent[] { dbName }); + + final JTextField dbHost = new JTextField(localPropertiesService.getValue(EarthProperty.DB_HOST)); + propertyToComponent.put(EarthProperty.DB_HOST, new JComponent[] { dbHost }); + + final JTextField dbPort = new JTextField(localPropertiesService.getValue(EarthProperty.DB_PORT)); + propertyToComponent.put(EarthProperty.DB_PORT, new JComponent[] { dbPort }); + + } + + public boolean isRestartRequired() { + return restartRequired; + } + + public void setRestartRequired(boolean restartRequired) { + this.restartRequired = restartRequired; + } + +} From 1b2517c45b5b34730d35cce8eee2c9c40aedb67f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:18 +0100 Subject: [PATCH 0384/1620] New translations SaikuStarter.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 238 ++++++------------ 1 file changed, 75 insertions(+), 163 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 4dbb57be78..220f8ccd9f 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,163 +1,75 @@ -/** - * Main class to generate the IPCC Inventory Software compliant file - */ -package org.openforis.collect.earth.ipcc; - -import java.io.File; -import java.io.IOException; -import java.util.Calendar; - -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.view.DataFormat; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.app.view.JFileChooserExistsAware; -import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; -import org.openforis.collect.earth.ipcc.controller.StratumUtils; -import org.openforis.collect.earth.ipcc.view.AssignSubdivisionTypesWizard; -import org.openforis.idm.metamodel.Survey; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -/** - * @author Alfonso Sanchez-Paus - * - */ -@Component -public class IPCCGenerator { - - @Autowired - IPCCRDBGenerator ipccRdbGenerator; - - @Autowired - IPCCDataExportTimeSeriesXML ipccDataExportToXML; - - @Autowired - LocalPropertiesService localPropertiesService; - - @Autowired - IPCCDataExportMatrixExcel dataExportMatrixExcel; - - @Autowired - IPCCDataExportMatrixExtendedExcel dataExportMatrixExtendedExcel; - - @Autowired - IPCCDataExportLandUnitsCSV dataExportLandUnitsCSV; - - @Autowired - IPCCDataExportPerPlotCSV dataExportPerPlotCSV; - - @Autowired - IPCCLandUses landUses; - - IPCCSurveyAdapter ipccSurveyAdapter; - - Logger logger = LoggerFactory.getLogger( IPCCGenerator.class ); - - public static final int END_YEAR = Calendar.getInstance().get(Calendar.YEAR); // Assume the last year is current year - public static final int START_YEAR = 2000; // Assume start year at 2000 - - public File generateRDB( Survey survey, InfiniteProgressMonitor progressListener) throws IPCCGeneratorException { - - ipccSurveyAdapter = new IPCCSurveyAdapter(); - - // Add attributes for each year containing the LU Category and Subdivision if not present - Survey modifiedSurvey = ipccSurveyAdapter.addIPCCAttributesToSurvey( survey ); - - // Generate Relational Database of the survey data - ipccRdbGenerator.generateRelationalDatabase( modifiedSurvey, progressListener); - - return null; - } - - public void produceOutputs( Survey survey, InfiniteProgressMonitor progressListener ) { - - progressListener.hide(); - - // Assign Management types to the Land Use Subdivisions found in the survey data - AssignSubdivisionTypesWizard wizard = new AssignSubdivisionTypesWizard(); - wizard.initializeTypes(landUses.getLandUseSubdivisions()); - - if( !wizard.isWizardFinished() ) { - logger.info( "The user closed the wizard without finishing assigning management types"); - return; - } - - File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.GHGI_ZIP_FILE, true, false, "LandUseForGHGi", localPropertiesService, null); - - if( exportToFile== null || exportToFile.length != 1 ) { - logger.info("The user should choose a ZIP file to export the results to! No file chosen, aborting the rest of the execution"); - return; - } - - try { - File destinationZip = exportToFile[0]; - - final int STEPS = 7; - int currentStep = 1; - - progressListener.show(); - - progressListener.updateProgress(currentStep++, STEPS, "Generating CSV aggregated time-series" ); - // Extract data from the Relational Database into an excel file of transition Matrixes per year - File landUnitsCSVFile =dataExportLandUnitsCSV.generateTimeseriesData(START_YEAR, END_YEAR); - if( progressListener.isUserCancelled() ) return; - - progressListener.updateProgress(currentStep++, STEPS, "Generating CSV per plot time-series" ); - // Extract data from the Relational Database into an excel file of transition Matrixes per year - File perPlotCSVFile =dataExportPerPlotCSV.generateTimeseriesData(START_YEAR, END_YEAR); - if( progressListener.isUserCancelled() ) return; - - progressListener.updateProgress(currentStep++, STEPS, "Generating survey setup files" ); - // Generate list of subdivisions in survey - File subdivisionsFile = LandUseSubdivisionUtils.getSubdivisionsXML(); - File climateZones = StratumUtils.getClimateZonesXML( survey ); - File ecologicalZones = StratumUtils.getEcologicalZonesXML( survey ); - File soilTypes = StratumUtils.getSoilTypesXML( survey ); - if( progressListener.isUserCancelled() ) return; - - progressListener.updateProgress(currentStep++, STEPS, "Generating XML timeseries file" ); - // Extract data from the Relational Database into an XML File with information per year - File timeseriesXMLFile =ipccDataExportToXML.generateTimeseriesData(IPCCGenerator.START_YEAR, IPCCGenerator.END_YEAR ); - if( progressListener.isUserCancelled() ) return; - - progressListener.updateProgress(currentStep++, STEPS, "Generating Excel LU Matrixes per year" ); - // Extract data from the Relational Database into an excel file of transition Matrixes per year - File matrixXLSFile =dataExportMatrixExcel.generateTimeseriesData(START_YEAR, END_YEAR); - if( progressListener.isUserCancelled() ) return; - - progressListener.updateProgress(currentStep++, STEPS, "Generating Excel LU Matrixes per year STRATIFIED" ); - // Extract data from the Relational Database into an excel file of transition Matrixes per year - File matrixXLSExtendedFile =dataExportMatrixExtendedExcel.generateTimeseriesData(START_YEAR, END_YEAR); - if( progressListener.isUserCancelled() ) return; - - try { - progressListener.updateProgress(currentStep++, STEPS, "Compressing files into selected destination" ); - CollectEarthUtils.addFileToZip( destinationZip , timeseriesXMLFile, "LU_Timeseries.xml"); - CollectEarthUtils.addFileToZip( destinationZip , matrixXLSFile, "LU_Matrixes.xls"); - CollectEarthUtils.addFileToZip( destinationZip , matrixXLSExtendedFile, "LU_Matrixes_stratified.xls"); - CollectEarthUtils.addFileToZip( destinationZip , subdivisionsFile, "ConfigLandUseSubdivisions.xml"); - CollectEarthUtils.addFileToZip( destinationZip , climateZones, "ConfigClimateZones.xml"); - CollectEarthUtils.addFileToZip( destinationZip , ecologicalZones, "ConfigEclogicalZones.xml"); - CollectEarthUtils.addFileToZip( destinationZip , soilTypes, "ConfigSoilTypes.xml"); - CollectEarthUtils.addFileToZip( destinationZip , landUnitsCSVFile, "LU_Timeseries_grouped.csv"); - CollectEarthUtils.addFileToZip( destinationZip , perPlotCSVFile, "LU_Timeseries_per_plot.csv"); - progressListener.hide(); - } catch (IOException e) { - logger.error("Error when creating ZIP file with timeseries content " + destinationZip, e); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (Exception e) { - logger.error("Error when zipping the timeseries content into " + destinationZip, e); //$NON-NLS-1$ //$NON-NLS-2$ - } - - // Open the ZIP file automatically to inspect the output - CollectEarthUtils.openFile( destinationZip ); - - } catch (IOException e) { - logger.error("Error generating file", e); - } - - } - -} +package org.openforis.collect.earth.app.view; + +import javax.swing.JFrame; +import javax.swing.JOptionPane; + +import org.openforis.collect.earth.app.service.AnalysisSaikuService; +import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.SaikuExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +final class SaikuStarter { + + private Logger logger = LoggerFactory.getLogger( SaikuStarter.class); + private JFrame frame; + private AnalysisSaikuService saikuService; + private boolean shouldRefreshDb; + private boolean starting = false; + private InfiniteProgressMonitor progressStartSaiku; + + public boolean isShouldRefreshDb() { + return shouldRefreshDb; + } + + public void setShouldRefreshDb(boolean shouldRefreshDb) { + this.shouldRefreshDb = shouldRefreshDb; + } + + SaikuStarter( final AnalysisSaikuService saikuService, final JFrame frame) { + super(); + this.saikuService = saikuService; + this.frame = frame; + } + + public boolean shouldShowRdbGenerationOption(){ + return saikuService.isRdbAlreadyGenerated( ExportType.SAIKU); + } + + public boolean isStarting() { + return starting; + } + + public void initializeAndOpen(boolean startSaikuAfterDBExport) { + progressStartSaiku = new InfiniteProgressMonitor( frame, Messages.getString("SaikuStarter.1"), Messages.getString("SaikuStarter.2")); //$NON-NLS-1$ //$NON-NLS-2$ + + Thread threadInitializingSaiku = new Thread("Start Saiku server/initialize RDB"){ //$NON-NLS-1$ + @Override + public void run() { + starting = true; + saikuService.setRefreshDatabase( shouldRefreshDb ); + try { + saikuService.prepareDataForAnalysis(progressStartSaiku, startSaikuAfterDBExport); + }catch ( SaikuExecutionException e1) { + JOptionPane.showMessageDialog( frame , "" + Messages.getString("CollectEarthWindow.29") + "
" +Messages.getString("CollectEarthWindow.40") + "
" + e1.getMessage() + "", Messages.getString("CollectEarthWindow.47"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ + logger.warn("The saiku server is not configured", e1); //$NON-NLS-1$ + } catch ( RuntimeException e) { + logger.error("Error starting Saiku", e); //$NON-NLS-1$ + } finally{ + starting = false; + if( progressStartSaiku != null ){ + progressStartSaiku.close(); + } + } + } + }; + + threadInitializingSaiku.start(); + + progressStartSaiku.showLater(); + + if( progressStartSaiku.isUserCancelled() ){ + saikuService.setUserCancelledOperation(true); + } + } +} \ No newline at end of file From 2c867e74e4a1b0bdb6107a643403263d40638506 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:19 +0100 Subject: [PATCH 0385/1620] New translations RemovePlotsFromDBDlg.java (French) --- .../earth/app/view/Messages_fr.properties | 489 ++++++++++++------ 1 file changed, 326 insertions(+), 163 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 4dbb57be78..eb9b80be90 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,163 +1,326 @@ -/** - * Main class to generate the IPCC Inventory Software compliant file - */ -package org.openforis.collect.earth.ipcc; - -import java.io.File; -import java.io.IOException; -import java.util.Calendar; - -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.view.DataFormat; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.app.view.JFileChooserExistsAware; -import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; -import org.openforis.collect.earth.ipcc.controller.StratumUtils; -import org.openforis.collect.earth.ipcc.view.AssignSubdivisionTypesWizard; -import org.openforis.idm.metamodel.Survey; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -/** - * @author Alfonso Sanchez-Paus - * - */ -@Component -public class IPCCGenerator { - - @Autowired - IPCCRDBGenerator ipccRdbGenerator; - - @Autowired - IPCCDataExportTimeSeriesXML ipccDataExportToXML; - - @Autowired - LocalPropertiesService localPropertiesService; - - @Autowired - IPCCDataExportMatrixExcel dataExportMatrixExcel; - - @Autowired - IPCCDataExportMatrixExtendedExcel dataExportMatrixExtendedExcel; - - @Autowired - IPCCDataExportLandUnitsCSV dataExportLandUnitsCSV; - - @Autowired - IPCCDataExportPerPlotCSV dataExportPerPlotCSV; - - @Autowired - IPCCLandUses landUses; - - IPCCSurveyAdapter ipccSurveyAdapter; - - Logger logger = LoggerFactory.getLogger( IPCCGenerator.class ); - - public static final int END_YEAR = Calendar.getInstance().get(Calendar.YEAR); // Assume the last year is current year - public static final int START_YEAR = 2000; // Assume start year at 2000 - - public File generateRDB( Survey survey, InfiniteProgressMonitor progressListener) throws IPCCGeneratorException { - - ipccSurveyAdapter = new IPCCSurveyAdapter(); - - // Add attributes for each year containing the LU Category and Subdivision if not present - Survey modifiedSurvey = ipccSurveyAdapter.addIPCCAttributesToSurvey( survey ); - - // Generate Relational Database of the survey data - ipccRdbGenerator.generateRelationalDatabase( modifiedSurvey, progressListener); - - return null; - } - - public void produceOutputs( Survey survey, InfiniteProgressMonitor progressListener ) { - - progressListener.hide(); - - // Assign Management types to the Land Use Subdivisions found in the survey data - AssignSubdivisionTypesWizard wizard = new AssignSubdivisionTypesWizard(); - wizard.initializeTypes(landUses.getLandUseSubdivisions()); - - if( !wizard.isWizardFinished() ) { - logger.info( "The user closed the wizard without finishing assigning management types"); - return; - } - - File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.GHGI_ZIP_FILE, true, false, "LandUseForGHGi", localPropertiesService, null); - - if( exportToFile== null || exportToFile.length != 1 ) { - logger.info("The user should choose a ZIP file to export the results to! No file chosen, aborting the rest of the execution"); - return; - } - - try { - File destinationZip = exportToFile[0]; - - final int STEPS = 7; - int currentStep = 1; - - progressListener.show(); - - progressListener.updateProgress(currentStep++, STEPS, "Generating CSV aggregated time-series" ); - // Extract data from the Relational Database into an excel file of transition Matrixes per year - File landUnitsCSVFile =dataExportLandUnitsCSV.generateTimeseriesData(START_YEAR, END_YEAR); - if( progressListener.isUserCancelled() ) return; - - progressListener.updateProgress(currentStep++, STEPS, "Generating CSV per plot time-series" ); - // Extract data from the Relational Database into an excel file of transition Matrixes per year - File perPlotCSVFile =dataExportPerPlotCSV.generateTimeseriesData(START_YEAR, END_YEAR); - if( progressListener.isUserCancelled() ) return; - - progressListener.updateProgress(currentStep++, STEPS, "Generating survey setup files" ); - // Generate list of subdivisions in survey - File subdivisionsFile = LandUseSubdivisionUtils.getSubdivisionsXML(); - File climateZones = StratumUtils.getClimateZonesXML( survey ); - File ecologicalZones = StratumUtils.getEcologicalZonesXML( survey ); - File soilTypes = StratumUtils.getSoilTypesXML( survey ); - if( progressListener.isUserCancelled() ) return; - - progressListener.updateProgress(currentStep++, STEPS, "Generating XML timeseries file" ); - // Extract data from the Relational Database into an XML File with information per year - File timeseriesXMLFile =ipccDataExportToXML.generateTimeseriesData(IPCCGenerator.START_YEAR, IPCCGenerator.END_YEAR ); - if( progressListener.isUserCancelled() ) return; - - progressListener.updateProgress(currentStep++, STEPS, "Generating Excel LU Matrixes per year" ); - // Extract data from the Relational Database into an excel file of transition Matrixes per year - File matrixXLSFile =dataExportMatrixExcel.generateTimeseriesData(START_YEAR, END_YEAR); - if( progressListener.isUserCancelled() ) return; - - progressListener.updateProgress(currentStep++, STEPS, "Generating Excel LU Matrixes per year STRATIFIED" ); - // Extract data from the Relational Database into an excel file of transition Matrixes per year - File matrixXLSExtendedFile =dataExportMatrixExtendedExcel.generateTimeseriesData(START_YEAR, END_YEAR); - if( progressListener.isUserCancelled() ) return; - - try { - progressListener.updateProgress(currentStep++, STEPS, "Compressing files into selected destination" ); - CollectEarthUtils.addFileToZip( destinationZip , timeseriesXMLFile, "LU_Timeseries.xml"); - CollectEarthUtils.addFileToZip( destinationZip , matrixXLSFile, "LU_Matrixes.xls"); - CollectEarthUtils.addFileToZip( destinationZip , matrixXLSExtendedFile, "LU_Matrixes_stratified.xls"); - CollectEarthUtils.addFileToZip( destinationZip , subdivisionsFile, "ConfigLandUseSubdivisions.xml"); - CollectEarthUtils.addFileToZip( destinationZip , climateZones, "ConfigClimateZones.xml"); - CollectEarthUtils.addFileToZip( destinationZip , ecologicalZones, "ConfigEclogicalZones.xml"); - CollectEarthUtils.addFileToZip( destinationZip , soilTypes, "ConfigSoilTypes.xml"); - CollectEarthUtils.addFileToZip( destinationZip , landUnitsCSVFile, "LU_Timeseries_grouped.csv"); - CollectEarthUtils.addFileToZip( destinationZip , perPlotCSVFile, "LU_Timeseries_per_plot.csv"); - progressListener.hide(); - } catch (IOException e) { - logger.error("Error when creating ZIP file with timeseries content " + destinationZip, e); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (Exception e) { - logger.error("Error when zipping the timeseries content into " + destinationZip, e); //$NON-NLS-1$ //$NON-NLS-2$ - } - - // Open the ZIP file automatically to inspect the output - CollectEarthUtils.openFile( destinationZip ); - - } catch (IOException e) { - logger.error("Error generating file", e); - } - - } - -} +package org.openforis.collect.earth.app.view; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JEditorPane; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.SwingUtilities; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; + +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.collect.manager.RecordManager; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectSurvey; +import org.openforis.collect.persistence.RecordPersistenceException; +import org.openforis.idm.metamodel.AttributeDefinition; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; + +import com.opencsv.CSVReader; + +@Component +@Lazy +public class RemovePlotsFromDBDlg { + + @Autowired + private RecordManager recordManager; + + @Autowired + private EarthSurveyService earthSurveyService; + + @SuppressWarnings("unused") + private static final long serialVersionUID = 5175096170385736616L; + private CollectSurvey survey; + private Logger logger = LoggerFactory.getLogger(RemovePlotsFromDBDlg.class); + + private JButton deleteFromDB; + private JFilePicker filePicker; + + private JDialog dlg; + + public RemovePlotsFromDBDlg() { + super(); + } + + private class DeleteResults { + private boolean success; + private Integer plotsDeleted; + private Integer plotsNotFoundInDB; + private Integer plotsErrorWhenDeleting; + private List messages; + + public DeleteResults(boolean success, Integer plotsDeleted, Integer plotsNotFoundInDB, + Integer plotsErrorWhenDeleting, List messages) { + super(); + this.success = success; + this.plotsDeleted = plotsDeleted; + this.plotsNotFoundInDB = plotsNotFoundInDB; + this.plotsErrorWhenDeleting = plotsErrorWhenDeleting; + this.messages = messages; + } + + } + + public void open(Frame owner, CollectSurvey survey) { + this.dlg = new JDialog(owner); + this.survey = survey; + this.dlg.setModal(true); + this.dlg.setSize(new Dimension(700, 350)); + this.dlg.setLocationRelativeTo(owner); + this.dlg.setTitle("Tool for removing plots from DB using a CSV with plot IDs"); + initLayout(); + dlg.setVisible(true); + } + + private void initLayout() { + final JPanel panel = new JPanel(new GridBagLayout()); + GridBagConstraints c = new GridBagConstraints(); + + int row = 0; + c.fill = GridBagConstraints.BOTH; + + c.gridx = 0; + c.gridwidth = 2; + panel.add(new JLabel("" + + "This utility deletes plots that are already collected and present in the Collect Earth Database.
" + + "Make sure to backup the data in your DB before attempting to delete plots ( use the Tools->Data Import/Export->Export data to Collect Backup function)." + + "
" + + "The next field expects a CSV file for which the IDs of the plots to be deleted are present.The headers of the columns should be the names of the key attributes of the survey (usually just one, called ID, but it could be more)." + + ""), c); + c.gridy = row++; + + c.gridx = 0; + c.gridwidth = 2; + c.gridy = row++; + panel.add(getCsvFilePicker(), c); + c.gridy = row; + + panel.add(getDeleteButton(), c); + this.dlg.add(panel); + } + + private JButton getDeleteButton() { + if (deleteFromDB == null) { + deleteFromDB = new JButton("Delete plots with IDs in the CSV from the database"); + deleteFromDB.setEnabled(false); + deleteFromDB.addActionListener( e -> { + if (JOptionPane.showConfirmDialog(RemovePlotsFromDBDlg.this.dlg, + "Are you sure you want to remove the plots with the IDs that are specified in the CSV file??", + "Confirm deletion of plots in DB", JOptionPane.YES_NO_OPTION, + JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) { + deletePlotsFromDB(); + } + }); + } + return deleteFromDB; + } + + private boolean validateCsv(String filePath) { + boolean validFile = true; + + try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(filePath, false) ){ + + filePicker.setTextBackground(Color.white); + + if (CsvReaderUtils.isCsvFile(filePath)) { + + // Get the first line + String[] csvHeaders = csvReader.readNext(); + String[] expectedHeaders = getKeyAttributesName(); + if (!Arrays.equals(expectedHeaders, csvHeaders)) { + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, + String.format("The Headers of the CSV file used should be %s, instead they are %s", + Arrays.toString(expectedHeaders), + StringUtils.abbreviate(Arrays.toString(csvHeaders), 35))); + filePicker.setTextBackground(Color.red); + validFile = false; + } + + } else { + + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, + String.format("The file in %s is NOT A CSV file ", filePath)); + validFile = false; + filePicker.setTextBackground(Color.red); + } + } catch (Exception e) { + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, + String.format("Error opening file at %s. %s ", filePath, e.getMessage())); + logger.error("Error while validating the CSV file", e); + validFile = false; + } + + getDeleteButton().setEnabled(validFile); + return validFile; + } + + private void deletePlotsFromDB() { + InfiniteProgressMonitor progressDeletion = new InfiniteProgressMonitor(this.dlg, "Deleting plots", + "Wait while the plots are deleted from the database"); + + Thread treadDeleting = new Thread("Deleting plots from Database") { + int plotsDeleted = 0; + int plotsNotFoundInDB = 0; + int plotsCouldNotBeDeleted = 0; + boolean success = true; + ArrayList messages = new ArrayList<>(); + + @Override + public void run() { + try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(getCsvFilePicker().getSelectedFilePath(), false) ){ + List allLines = csvReader.readAll(); + int totalLines = allLines.size() - 1; + boolean skipFirst = true; + int plot = 0; + progressDeletion.showLater(); + for (String[] csvRow : allLines) { + + if (skipFirst) { + skipFirst = false; + continue; + } + + progressDeletion.updateProgress(++plot, totalLines); + + CollectRecord record = earthSurveyService.loadRecord(csvRow); + if (record == null) { + plotsNotFoundInDB++; + messages.add(String.format(" Could not find plot with ID %s in the Database", + Arrays.toString(csvRow))); + } else { + deleteRecord(csvRow, record); + } + } + + } catch (Exception e) { + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, + "Error reading CSV file or CSV File too big!"); + logger.error("Error while validating the CSV file", e); + success = false; + } finally { + + if (progressDeletion != null) { + progressDeletion.close(); + } + + } + + DeleteResults deleteResults = new DeleteResults(success, plotsDeleted, plotsNotFoundInDB, + plotsCouldNotBeDeleted, messages); + String result = "Plots Deleted : " + deleteResults.plotsDeleted + "
" + + "Plots Not Found :
" + deleteResults.plotsNotFoundInDB + "
" + + "Plots that could not be deleted because a exception : " + deleteResults.plotsErrorWhenDeleting + "
" + + " Messages :
" + StringUtils.join(deleteResults.messages, "
"); + if( success ) { + result = "" + + "Results of the deletion process:
" + + result + ""; + }else { + result = "" + + "There was an error while deleting the plots. Review the Collect Earth Log file in the Help menu.
" + + result + ""; + } + + + JEditorPane web = new JEditorPane(); + web.setEditable(false); + web.setContentType("text/html"); + web.setText(result); + + + JScrollPane scrollPane = new JScrollPane(web); + scrollPane.setPreferredSize( new Dimension( 450, 350 )); + + // Refresh contents of Google Earth! + EarthApp.executeKmlLoadAsynchronously( null ); + + SwingUtilities.invokeLater( () -> { + if (deleteResults.success) { + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, scrollPane, "Success deleting plots", JOptionPane.INFORMATION_MESSAGE); + } else { + + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, scrollPane, "Error deleting plots", JOptionPane.WARNING_MESSAGE); + } + }); + } + + private void deleteRecord(String[] csvRow, CollectRecord record) { + try { + recordManager.delete(record.getId()); + messages.add(String.format("Deleted plot with ID %s ", Arrays.toString(csvRow))); + plotsDeleted++; + } catch (RecordPersistenceException e) { + plotsCouldNotBeDeleted++; + messages.add(String.format("Error when deleting plot with ID %s. Error Message: %s", + Arrays.toString(csvRow), e.getMessage())); + logger.error("Error deleting plot with ID " + Arrays.toString(csvRow)); + success = false; + } + } + }; + + treadDeleting.start(); + + } + + private String[] getKeyAttributesName() { + List keyAttributeDefinitions = survey.getSchema().getRootEntityDefinitions().get(0) + .getKeyAttributeDefinitions(); + String[] keyAttributeNames = new String[keyAttributeDefinitions.size()]; + int i = 0; + for (AttributeDefinition keyAttributeDefinition : keyAttributeDefinitions) { + keyAttributeNames[i++] = keyAttributeDefinition.getName(); + } + return keyAttributeNames; + } + + private JFilePicker getCsvFilePicker() { + if (filePicker == null) { + filePicker = new JFilePicker("Choose the CSV file containing the IDs of the plots to remove", null, + "Explore", DlgMode.MODE_OPEN); + + filePicker.getFileChooser().setAcceptAllFileFilterUsed(false); + filePicker.addFileTypeFilter("csv", " CSV file with plot IDs", true); + + filePicker.addChangeListener(new DocumentListener() { + + @Override + public void removeUpdate(DocumentEvent e) { + // Do not react + } + + @Override + public void insertUpdate(DocumentEvent e) { + validateCsv(filePicker.getTextField().getText()); + } + + @Override + public void changedUpdate(DocumentEvent e) { + validateCsv(filePicker.getTextField().getText()); + } + }); + } + return filePicker; + } + +} From ad9b0c8d1ce15e2bdbe80807e8770147c0261147 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:21 +0100 Subject: [PATCH 0386/1620] New translations RemovePlotsFromDBDlg.java (Spanish) --- .../earth/app/view/Messages_es.properties | 560 ++++++++++-------- 1 file changed, 326 insertions(+), 234 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 1230b9a5c0..eb9b80be90 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,234 +1,326 @@ -package org.openforis.collect.earth.ipcc; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.collections.Predicate; -import org.apache.poi.hssf.usermodel.HSSFWorkbook; -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.CellStyle; -import org.apache.poi.ss.usermodel.Font; -import org.apache.poi.ss.usermodel.IndexedColors; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.ss.usermodel.Workbook; -import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.RDBConnector; -import org.openforis.collect.earth.app.service.RegionCalculationUtils; -import org.openforis.collect.earth.app.service.SchemaService; -import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.RowMapper; -import org.springframework.stereotype.Component; - -import liquibase.pro.packaged.E; - -@Component -public class IPCCDataExportMatrixExcel extends RDBConnector { - - private String schemaName; - - Logger logger = LoggerFactory.getLogger(IPCCDataExportMatrixExcel.class); - - @Autowired - private SchemaService schemaService; - - public IPCCDataExportMatrixExcel() { - setExportTypeUsed(ExportType.IPCC); - } - - public File generateTimeseriesData( int startYear, int endYear ) throws IOException { - schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - - List matrixSheets = new ArrayList(); - - for (int year = startYear; year < endYear; year++) { - MatrixSheet yearMatrixData = generateLUMatrixForYear(year); - if (yearMatrixData != null) - matrixSheets.add(yearMatrixData); - } - - return createExcel( matrixSheets); - } - - - private MatrixSheet generateLUMatrixForYear(int year) { - - List luData = getJdbcTemplate().query( - "select " - + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " - + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1) + "," - + "sum( " + RegionCalculationUtils.EXPANSION_FACTOR + ")" - + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE - + " GROUP BY " - + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + "," - + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1), - getRowMapper() - ); - - if (luData.size() == 0) { // No LU data for the climate, soil, gez combination - return null; - } - - YearData yearData = new YearData(year, luData); - - return new MatrixSheet( yearData ); - } - - - protected RowMapper getRowMapper() { - return new RowMapper() { - @Override - public LUDataPerYear mapRow(ResultSet rs, int rowNum) throws SQLException { - - String categoryInitial = rs.getString(1); - String categoryFinal = rs.getString(2); - String subdivInitial = rs.getString(3); - String subdivFinal = rs.getString(4); - - return new LUDataPerYear( - LandUseSubdivisionUtils.getSubdivision(categoryInitial, subdivInitial), - LandUseSubdivisionUtils.getSubdivision(categoryFinal, subdivFinal), - rs.getDouble(5) // area - ); - } - }; - } - - protected static LUDataPerYear findLuData( LandUseSubdivision initialSubdivision, LandUseSubdivision finalSubdivision, List luData ) { - Collection result = CollectionUtils.select(luData, new Predicate() { - public boolean evaluate(Object a) { - return - ( (LUDataPerYear) a ).getLu().equals(initialSubdivision) - && - ( (LUDataPerYear) a ).getLuNextYear().equals(finalSubdivision); - } - }); - if( result.size() == 1 ) - return (LUDataPerYear) result.toArray(new LUDataPerYear[result.size()])[0]; - else - return new LUDataPerYear(initialSubdivision, finalSubdivision, 0); - - } - - private File createExcel( List matrixData ) throws IOException { - File excelDestination = File.createTempFile("LuMatrixTimeseries", ".xls"); - excelDestination.deleteOnExit(); - // Create a Workbook - try (Workbook workbook = new HSSFWorkbook() ){ - /* CreationHelper helps us create instances of various things like DataFormat, - Hyperlink, RichTextString etc, in a format (HSSF, XSSF) independent way */ - //CreationHelper createHelper = workbook.getCreationHelper(); - - // Create a Font for styling header cells - Font cornerFont = workbook.createFont(); - cornerFont.setBold(true); - cornerFont.setFontHeightInPoints((short) 15); - cornerFont.setColor(IndexedColors.GREY_80_PERCENT.getIndex()); - // Create a CellStyle with the font - CellStyle cornerCellStyle = workbook.createCellStyle(); - cornerCellStyle.setFont(cornerFont); - - // Create a Font for styling header cells - Font headerFont = workbook.createFont(); - headerFont.setBold(true); - headerFont.setFontHeightInPoints((short) 14); - headerFont.setColor(IndexedColors.DARK_TEAL.getIndex()); - // Create a CellStyle with the font - CellStyle headerCellStyle = workbook.createCellStyle(); - headerCellStyle.setFont(headerFont); - - // Create a Font for styling non-diagonal cells - Font stdFont = workbook.createFont(); - stdFont.setBold(false); - stdFont.setFontHeightInPoints((short) 14); - stdFont.setColor(IndexedColors.DARK_RED.getIndex()); - // Create a CellStyle with the font - CellStyle stdCellStyle = workbook.createCellStyle(); - stdCellStyle.setFont(stdFont); - - // Create a Font for styling non-diagonal cells - Font diagonalFont = workbook.createFont(); - diagonalFont.setBold(true); - diagonalFont.setFontHeightInPoints((short) 14); - diagonalFont.setColor(IndexedColors.DARK_GREEN.getIndex()); - // Create a CellStyle with the font - CellStyle diagonalCellStyle = workbook.createCellStyle(); - diagonalCellStyle.setFont(diagonalFont); - - for (MatrixSheet matrix : matrixData) { - // Create a Sheet - Sheet sheet = workbook.createSheet("LU Matrix " + matrix.getYearData().getYear() + "-" + (matrix.getYearData().getYear()+1 ) ); - - // Create a Row - Row headerRow = sheet.createRow(0); - Cell cell = headerRow.createCell(0); - cell.setCellValue( "Transition " + matrix.getYearData().getYear() + "/" + ( matrix.getYearData().getYear() +1 ) ); - cell.setCellStyle(cornerCellStyle); - - int i = 1; - for (LandUseSubdivision subdivision : matrix.getSubdivisions()) { - cell = headerRow.createCell(i++); - cell.setCellValue(subdivision.toString()); - cell.setCellStyle(headerCellStyle); - } - - - int rowNum = 1; - int colNum = 0; - for (LandUseSubdivision subdivisionH : matrix.getSubdivisions()) { - colNum = 0; - Row row = sheet.createRow(rowNum++); - - Cell columnCell = row.createCell(colNum++); - columnCell.setCellStyle(headerCellStyle); - columnCell.setCellValue(subdivisionH.toString()); - - colNum = 1; - for (LandUseSubdivision subdivisionV : matrix.getSubdivisions()) { - - cell = row.createCell(colNum++); - cell.setCellValue( findLuData( subdivisionH, subdivisionV, matrix.getYearData().getLuData() ).getAreaHa() ); - if( subdivisionH.equals( subdivisionV ) ) { - cell.setCellStyle(diagonalCellStyle); - }else { - cell.setCellStyle(stdCellStyle); - } - } - - } - - // Resize all columns to fit the content size - for(int j = 0; j < colNum; j++) { - sheet.autoSizeColumn(j); - } - - } - - // Write the output to a file - try( FileOutputStream fileOut = new FileOutputStream(excelDestination) ){ - workbook.write(fileOut); - } catch (IOException e) { - logger.error("Error generating Excel file", e); - } - } catch (Exception e) { - logger.error("Error generating Excel data", e); - } - return excelDestination; - } - -} +package org.openforis.collect.earth.app.view; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JEditorPane; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.SwingUtilities; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; + +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.collect.manager.RecordManager; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectSurvey; +import org.openforis.collect.persistence.RecordPersistenceException; +import org.openforis.idm.metamodel.AttributeDefinition; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; + +import com.opencsv.CSVReader; + +@Component +@Lazy +public class RemovePlotsFromDBDlg { + + @Autowired + private RecordManager recordManager; + + @Autowired + private EarthSurveyService earthSurveyService; + + @SuppressWarnings("unused") + private static final long serialVersionUID = 5175096170385736616L; + private CollectSurvey survey; + private Logger logger = LoggerFactory.getLogger(RemovePlotsFromDBDlg.class); + + private JButton deleteFromDB; + private JFilePicker filePicker; + + private JDialog dlg; + + public RemovePlotsFromDBDlg() { + super(); + } + + private class DeleteResults { + private boolean success; + private Integer plotsDeleted; + private Integer plotsNotFoundInDB; + private Integer plotsErrorWhenDeleting; + private List messages; + + public DeleteResults(boolean success, Integer plotsDeleted, Integer plotsNotFoundInDB, + Integer plotsErrorWhenDeleting, List messages) { + super(); + this.success = success; + this.plotsDeleted = plotsDeleted; + this.plotsNotFoundInDB = plotsNotFoundInDB; + this.plotsErrorWhenDeleting = plotsErrorWhenDeleting; + this.messages = messages; + } + + } + + public void open(Frame owner, CollectSurvey survey) { + this.dlg = new JDialog(owner); + this.survey = survey; + this.dlg.setModal(true); + this.dlg.setSize(new Dimension(700, 350)); + this.dlg.setLocationRelativeTo(owner); + this.dlg.setTitle("Tool for removing plots from DB using a CSV with plot IDs"); + initLayout(); + dlg.setVisible(true); + } + + private void initLayout() { + final JPanel panel = new JPanel(new GridBagLayout()); + GridBagConstraints c = new GridBagConstraints(); + + int row = 0; + c.fill = GridBagConstraints.BOTH; + + c.gridx = 0; + c.gridwidth = 2; + panel.add(new JLabel("" + + "This utility deletes plots that are already collected and present in the Collect Earth Database.
" + + "Make sure to backup the data in your DB before attempting to delete plots ( use the Tools->Data Import/Export->Export data to Collect Backup function)." + + "
" + + "The next field expects a CSV file for which the IDs of the plots to be deleted are present.The headers of the columns should be the names of the key attributes of the survey (usually just one, called ID, but it could be more)." + + ""), c); + c.gridy = row++; + + c.gridx = 0; + c.gridwidth = 2; + c.gridy = row++; + panel.add(getCsvFilePicker(), c); + c.gridy = row; + + panel.add(getDeleteButton(), c); + this.dlg.add(panel); + } + + private JButton getDeleteButton() { + if (deleteFromDB == null) { + deleteFromDB = new JButton("Delete plots with IDs in the CSV from the database"); + deleteFromDB.setEnabled(false); + deleteFromDB.addActionListener( e -> { + if (JOptionPane.showConfirmDialog(RemovePlotsFromDBDlg.this.dlg, + "Are you sure you want to remove the plots with the IDs that are specified in the CSV file??", + "Confirm deletion of plots in DB", JOptionPane.YES_NO_OPTION, + JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) { + deletePlotsFromDB(); + } + }); + } + return deleteFromDB; + } + + private boolean validateCsv(String filePath) { + boolean validFile = true; + + try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(filePath, false) ){ + + filePicker.setTextBackground(Color.white); + + if (CsvReaderUtils.isCsvFile(filePath)) { + + // Get the first line + String[] csvHeaders = csvReader.readNext(); + String[] expectedHeaders = getKeyAttributesName(); + if (!Arrays.equals(expectedHeaders, csvHeaders)) { + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, + String.format("The Headers of the CSV file used should be %s, instead they are %s", + Arrays.toString(expectedHeaders), + StringUtils.abbreviate(Arrays.toString(csvHeaders), 35))); + filePicker.setTextBackground(Color.red); + validFile = false; + } + + } else { + + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, + String.format("The file in %s is NOT A CSV file ", filePath)); + validFile = false; + filePicker.setTextBackground(Color.red); + } + } catch (Exception e) { + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, + String.format("Error opening file at %s. %s ", filePath, e.getMessage())); + logger.error("Error while validating the CSV file", e); + validFile = false; + } + + getDeleteButton().setEnabled(validFile); + return validFile; + } + + private void deletePlotsFromDB() { + InfiniteProgressMonitor progressDeletion = new InfiniteProgressMonitor(this.dlg, "Deleting plots", + "Wait while the plots are deleted from the database"); + + Thread treadDeleting = new Thread("Deleting plots from Database") { + int plotsDeleted = 0; + int plotsNotFoundInDB = 0; + int plotsCouldNotBeDeleted = 0; + boolean success = true; + ArrayList messages = new ArrayList<>(); + + @Override + public void run() { + try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(getCsvFilePicker().getSelectedFilePath(), false) ){ + List allLines = csvReader.readAll(); + int totalLines = allLines.size() - 1; + boolean skipFirst = true; + int plot = 0; + progressDeletion.showLater(); + for (String[] csvRow : allLines) { + + if (skipFirst) { + skipFirst = false; + continue; + } + + progressDeletion.updateProgress(++plot, totalLines); + + CollectRecord record = earthSurveyService.loadRecord(csvRow); + if (record == null) { + plotsNotFoundInDB++; + messages.add(String.format(" Could not find plot with ID %s in the Database", + Arrays.toString(csvRow))); + } else { + deleteRecord(csvRow, record); + } + } + + } catch (Exception e) { + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, + "Error reading CSV file or CSV File too big!"); + logger.error("Error while validating the CSV file", e); + success = false; + } finally { + + if (progressDeletion != null) { + progressDeletion.close(); + } + + } + + DeleteResults deleteResults = new DeleteResults(success, plotsDeleted, plotsNotFoundInDB, + plotsCouldNotBeDeleted, messages); + String result = "Plots Deleted : " + deleteResults.plotsDeleted + "
" + + "Plots Not Found :
" + deleteResults.plotsNotFoundInDB + "
" + + "Plots that could not be deleted because a exception : " + deleteResults.plotsErrorWhenDeleting + "
" + + " Messages :
" + StringUtils.join(deleteResults.messages, "
"); + if( success ) { + result = "" + + "Results of the deletion process:
" + + result + ""; + }else { + result = "" + + "There was an error while deleting the plots. Review the Collect Earth Log file in the Help menu.
" + + result + ""; + } + + + JEditorPane web = new JEditorPane(); + web.setEditable(false); + web.setContentType("text/html"); + web.setText(result); + + + JScrollPane scrollPane = new JScrollPane(web); + scrollPane.setPreferredSize( new Dimension( 450, 350 )); + + // Refresh contents of Google Earth! + EarthApp.executeKmlLoadAsynchronously( null ); + + SwingUtilities.invokeLater( () -> { + if (deleteResults.success) { + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, scrollPane, "Success deleting plots", JOptionPane.INFORMATION_MESSAGE); + } else { + + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, scrollPane, "Error deleting plots", JOptionPane.WARNING_MESSAGE); + } + }); + } + + private void deleteRecord(String[] csvRow, CollectRecord record) { + try { + recordManager.delete(record.getId()); + messages.add(String.format("Deleted plot with ID %s ", Arrays.toString(csvRow))); + plotsDeleted++; + } catch (RecordPersistenceException e) { + plotsCouldNotBeDeleted++; + messages.add(String.format("Error when deleting plot with ID %s. Error Message: %s", + Arrays.toString(csvRow), e.getMessage())); + logger.error("Error deleting plot with ID " + Arrays.toString(csvRow)); + success = false; + } + } + }; + + treadDeleting.start(); + + } + + private String[] getKeyAttributesName() { + List keyAttributeDefinitions = survey.getSchema().getRootEntityDefinitions().get(0) + .getKeyAttributeDefinitions(); + String[] keyAttributeNames = new String[keyAttributeDefinitions.size()]; + int i = 0; + for (AttributeDefinition keyAttributeDefinition : keyAttributeDefinitions) { + keyAttributeNames[i++] = keyAttributeDefinition.getName(); + } + return keyAttributeNames; + } + + private JFilePicker getCsvFilePicker() { + if (filePicker == null) { + filePicker = new JFilePicker("Choose the CSV file containing the IDs of the plots to remove", null, + "Explore", DlgMode.MODE_OPEN); + + filePicker.getFileChooser().setAcceptAllFileFilterUsed(false); + filePicker.addFileTypeFilter("csv", " CSV file with plot IDs", true); + + filePicker.addChangeListener(new DocumentListener() { + + @Override + public void removeUpdate(DocumentEvent e) { + // Do not react + } + + @Override + public void insertUpdate(DocumentEvent e) { + validateCsv(filePicker.getTextField().getText()); + } + + @Override + public void changedUpdate(DocumentEvent e) { + validateCsv(filePicker.getTextField().getText()); + } + }); + } + return filePicker; + } + +} From deea13d3999a0a208f172b482bf3dda081bb15be Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:22 +0100 Subject: [PATCH 0387/1620] New translations RemovePlotsFromDBDlg.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 349 +++++++++++++++--- 1 file changed, 300 insertions(+), 49 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 220f8ccd9f..eb9b80be90 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,75 +1,326 @@ package org.openforis.collect.earth.app.view; -import javax.swing.JFrame; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JEditorPane; +import javax.swing.JLabel; import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.SwingUtilities; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; -import org.openforis.collect.earth.app.service.AnalysisSaikuService; -import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.SaikuExecutionException; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.collect.manager.RecordManager; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectSurvey; +import org.openforis.collect.persistence.RecordPersistenceException; +import org.openforis.idm.metamodel.AttributeDefinition; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; + +import com.opencsv.CSVReader; + +@Component +@Lazy +public class RemovePlotsFromDBDlg { + + @Autowired + private RecordManager recordManager; + + @Autowired + private EarthSurveyService earthSurveyService; -final class SaikuStarter { + @SuppressWarnings("unused") + private static final long serialVersionUID = 5175096170385736616L; + private CollectSurvey survey; + private Logger logger = LoggerFactory.getLogger(RemovePlotsFromDBDlg.class); - private Logger logger = LoggerFactory.getLogger( SaikuStarter.class); - private JFrame frame; - private AnalysisSaikuService saikuService; - private boolean shouldRefreshDb; - private boolean starting = false; - private InfiniteProgressMonitor progressStartSaiku; + private JButton deleteFromDB; + private JFilePicker filePicker; - public boolean isShouldRefreshDb() { - return shouldRefreshDb; + private JDialog dlg; + + public RemovePlotsFromDBDlg() { + super(); } - public void setShouldRefreshDb(boolean shouldRefreshDb) { - this.shouldRefreshDb = shouldRefreshDb; + private class DeleteResults { + private boolean success; + private Integer plotsDeleted; + private Integer plotsNotFoundInDB; + private Integer plotsErrorWhenDeleting; + private List messages; + + public DeleteResults(boolean success, Integer plotsDeleted, Integer plotsNotFoundInDB, + Integer plotsErrorWhenDeleting, List messages) { + super(); + this.success = success; + this.plotsDeleted = plotsDeleted; + this.plotsNotFoundInDB = plotsNotFoundInDB; + this.plotsErrorWhenDeleting = plotsErrorWhenDeleting; + this.messages = messages; + } + } - SaikuStarter( final AnalysisSaikuService saikuService, final JFrame frame) { - super(); - this.saikuService = saikuService; - this.frame = frame; + public void open(Frame owner, CollectSurvey survey) { + this.dlg = new JDialog(owner); + this.survey = survey; + this.dlg.setModal(true); + this.dlg.setSize(new Dimension(700, 350)); + this.dlg.setLocationRelativeTo(owner); + this.dlg.setTitle("Tool for removing plots from DB using a CSV with plot IDs"); + initLayout(); + dlg.setVisible(true); } - - public boolean shouldShowRdbGenerationOption(){ - return saikuService.isRdbAlreadyGenerated( ExportType.SAIKU); + + private void initLayout() { + final JPanel panel = new JPanel(new GridBagLayout()); + GridBagConstraints c = new GridBagConstraints(); + + int row = 0; + c.fill = GridBagConstraints.BOTH; + + c.gridx = 0; + c.gridwidth = 2; + panel.add(new JLabel("" + + "This utility deletes plots that are already collected and present in the Collect Earth Database.
" + + "Make sure to backup the data in your DB before attempting to delete plots ( use the Tools->Data Import/Export->Export data to Collect Backup function)." + + "
" + + "The next field expects a CSV file for which the IDs of the plots to be deleted are present.The headers of the columns should be the names of the key attributes of the survey (usually just one, called ID, but it could be more)." + + ""), c); + c.gridy = row++; + + c.gridx = 0; + c.gridwidth = 2; + c.gridy = row++; + panel.add(getCsvFilePicker(), c); + c.gridy = row; + + panel.add(getDeleteButton(), c); + this.dlg.add(panel); } - public boolean isStarting() { - return starting; + private JButton getDeleteButton() { + if (deleteFromDB == null) { + deleteFromDB = new JButton("Delete plots with IDs in the CSV from the database"); + deleteFromDB.setEnabled(false); + deleteFromDB.addActionListener( e -> { + if (JOptionPane.showConfirmDialog(RemovePlotsFromDBDlg.this.dlg, + "Are you sure you want to remove the plots with the IDs that are specified in the CSV file??", + "Confirm deletion of plots in DB", JOptionPane.YES_NO_OPTION, + JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) { + deletePlotsFromDB(); + } + }); + } + return deleteFromDB; } - - public void initializeAndOpen(boolean startSaikuAfterDBExport) { - progressStartSaiku = new InfiniteProgressMonitor( frame, Messages.getString("SaikuStarter.1"), Messages.getString("SaikuStarter.2")); //$NON-NLS-1$ //$NON-NLS-2$ - - Thread threadInitializingSaiku = new Thread("Start Saiku server/initialize RDB"){ //$NON-NLS-1$ + + private boolean validateCsv(String filePath) { + boolean validFile = true; + + try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(filePath, false) ){ + + filePicker.setTextBackground(Color.white); + + if (CsvReaderUtils.isCsvFile(filePath)) { + + // Get the first line + String[] csvHeaders = csvReader.readNext(); + String[] expectedHeaders = getKeyAttributesName(); + if (!Arrays.equals(expectedHeaders, csvHeaders)) { + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, + String.format("The Headers of the CSV file used should be %s, instead they are %s", + Arrays.toString(expectedHeaders), + StringUtils.abbreviate(Arrays.toString(csvHeaders), 35))); + filePicker.setTextBackground(Color.red); + validFile = false; + } + + } else { + + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, + String.format("The file in %s is NOT A CSV file ", filePath)); + validFile = false; + filePicker.setTextBackground(Color.red); + } + } catch (Exception e) { + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, + String.format("Error opening file at %s. %s ", filePath, e.getMessage())); + logger.error("Error while validating the CSV file", e); + validFile = false; + } + + getDeleteButton().setEnabled(validFile); + return validFile; + } + + private void deletePlotsFromDB() { + InfiniteProgressMonitor progressDeletion = new InfiniteProgressMonitor(this.dlg, "Deleting plots", + "Wait while the plots are deleted from the database"); + + Thread treadDeleting = new Thread("Deleting plots from Database") { + int plotsDeleted = 0; + int plotsNotFoundInDB = 0; + int plotsCouldNotBeDeleted = 0; + boolean success = true; + ArrayList messages = new ArrayList<>(); + @Override public void run() { - starting = true; - saikuService.setRefreshDatabase( shouldRefreshDb ); - try { - saikuService.prepareDataForAnalysis(progressStartSaiku, startSaikuAfterDBExport); - }catch ( SaikuExecutionException e1) { - JOptionPane.showMessageDialog( frame , "" + Messages.getString("CollectEarthWindow.29") + "
" +Messages.getString("CollectEarthWindow.40") + "
" + e1.getMessage() + "", Messages.getString("CollectEarthWindow.47"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ - logger.warn("The saiku server is not configured", e1); //$NON-NLS-1$ - } catch ( RuntimeException e) { - logger.error("Error starting Saiku", e); //$NON-NLS-1$ - } finally{ - starting = false; - if( progressStartSaiku != null ){ - progressStartSaiku.close(); + try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(getCsvFilePicker().getSelectedFilePath(), false) ){ + List allLines = csvReader.readAll(); + int totalLines = allLines.size() - 1; + boolean skipFirst = true; + int plot = 0; + progressDeletion.showLater(); + for (String[] csvRow : allLines) { + + if (skipFirst) { + skipFirst = false; + continue; + } + + progressDeletion.updateProgress(++plot, totalLines); + + CollectRecord record = earthSurveyService.loadRecord(csvRow); + if (record == null) { + plotsNotFoundInDB++; + messages.add(String.format(" Could not find plot with ID %s in the Database", + Arrays.toString(csvRow))); + } else { + deleteRecord(csvRow, record); + } + } + + } catch (Exception e) { + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, + "Error reading CSV file or CSV File too big!"); + logger.error("Error while validating the CSV file", e); + success = false; + } finally { + + if (progressDeletion != null) { + progressDeletion.close(); } + + } + + DeleteResults deleteResults = new DeleteResults(success, plotsDeleted, plotsNotFoundInDB, + plotsCouldNotBeDeleted, messages); + String result = "Plots Deleted : " + deleteResults.plotsDeleted + "
" + + "Plots Not Found :
" + deleteResults.plotsNotFoundInDB + "
" + + "Plots that could not be deleted because a exception : " + deleteResults.plotsErrorWhenDeleting + "
" + + " Messages :
" + StringUtils.join(deleteResults.messages, "
"); + if( success ) { + result = "" + + "Results of the deletion process:
" + + result + ""; + }else { + result = "" + + "There was an error while deleting the plots. Review the Collect Earth Log file in the Help menu.
" + + result + ""; + } + + + JEditorPane web = new JEditorPane(); + web.setEditable(false); + web.setContentType("text/html"); + web.setText(result); + + + JScrollPane scrollPane = new JScrollPane(web); + scrollPane.setPreferredSize( new Dimension( 450, 350 )); + + // Refresh contents of Google Earth! + EarthApp.executeKmlLoadAsynchronously( null ); + + SwingUtilities.invokeLater( () -> { + if (deleteResults.success) { + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, scrollPane, "Success deleting plots", JOptionPane.INFORMATION_MESSAGE); + } else { + + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, scrollPane, "Error deleting plots", JOptionPane.WARNING_MESSAGE); + } + }); + } + + private void deleteRecord(String[] csvRow, CollectRecord record) { + try { + recordManager.delete(record.getId()); + messages.add(String.format("Deleted plot with ID %s ", Arrays.toString(csvRow))); + plotsDeleted++; + } catch (RecordPersistenceException e) { + plotsCouldNotBeDeleted++; + messages.add(String.format("Error when deleting plot with ID %s. Error Message: %s", + Arrays.toString(csvRow), e.getMessage())); + logger.error("Error deleting plot with ID " + Arrays.toString(csvRow)); + success = false; } } }; - - threadInitializingSaiku.start(); - progressStartSaiku.showLater(); - - if( progressStartSaiku.isUserCancelled() ){ - saikuService.setUserCancelledOperation(true); + treadDeleting.start(); + + } + + private String[] getKeyAttributesName() { + List keyAttributeDefinitions = survey.getSchema().getRootEntityDefinitions().get(0) + .getKeyAttributeDefinitions(); + String[] keyAttributeNames = new String[keyAttributeDefinitions.size()]; + int i = 0; + for (AttributeDefinition keyAttributeDefinition : keyAttributeDefinitions) { + keyAttributeNames[i++] = keyAttributeDefinition.getName(); } + return keyAttributeNames; } -} \ No newline at end of file + + private JFilePicker getCsvFilePicker() { + if (filePicker == null) { + filePicker = new JFilePicker("Choose the CSV file containing the IDs of the plots to remove", null, + "Explore", DlgMode.MODE_OPEN); + + filePicker.getFileChooser().setAcceptAllFileFilterUsed(false); + filePicker.addFileTypeFilter("csv", " CSV file with plot IDs", true); + + filePicker.addChangeListener(new DocumentListener() { + + @Override + public void removeUpdate(DocumentEvent e) { + // Do not react + } + + @Override + public void insertUpdate(DocumentEvent e) { + validateCsv(filePicker.getTextField().getText()); + } + + @Override + public void changedUpdate(DocumentEvent e) { + validateCsv(filePicker.getTextField().getText()); + } + }); + } + return filePicker; + } + +} From 61c2f4aa4493047ba7cb2a14ac3b300a1d318d40 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:23 +0100 Subject: [PATCH 0388/1620] New translations RemovePlotsFromDBDlg.java (English) --- .../earth/app/view/Messages_en.properties | 1345 +++-------------- 1 file changed, 231 insertions(+), 1114 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 7eb0424502..eb9b80be90 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,1209 +1,326 @@ package org.openforis.collect.earth.app.view; -import java.awt.BorderLayout; import java.awt.Color; -import java.awt.Component; -import java.awt.Container; import java.awt.Dimension; +import java.awt.Frame; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; -import java.awt.GridLayout; -import java.awt.Insets; -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; -import java.io.IOException; -import java.text.DecimalFormat; import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; +import java.util.Arrays; import java.util.List; -import javax.swing.AbstractAction; -import javax.swing.AbstractButton; -import javax.swing.ButtonGroup; import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JComponent; import javax.swing.JDialog; -import javax.swing.JFrame; +import javax.swing.JEditorPane; import javax.swing.JLabel; -import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; -import javax.swing.JPasswordField; -import javax.swing.JRadioButton; import javax.swing.JScrollPane; -import javax.swing.JTabbedPane; -import javax.swing.JTextField; -import javax.swing.ListSelectionModel; -import javax.swing.ScrollPaneConstants; -import javax.swing.border.BevelBorder; -import javax.swing.border.Border; -import javax.swing.border.TitledBorder; +import javax.swing.SwingUtilities; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; -import org.openforis.collect.earth.app.EarthConstants.OperationMode; -import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.AnalysisSaikuService; -import org.openforis.collect.earth.app.service.EarthProjectsService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.app.service.EarthSurveyService; import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.collect.manager.RecordManager; +import org.openforis.collect.model.CollectRecord; import org.openforis.collect.model.CollectSurvey; +import org.openforis.collect.persistence.RecordPersistenceException; +import org.openforis.idm.metamodel.AttributeDefinition; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ -public class PropertiesDialog extends JDialog { +import com.opencsv.CSVReader; - private static final ComboBoxItem COMBO_BOX_ITEM_CENTRAL_POINT = new ComboBoxItem(1, - Messages.getString("OptionWizard.54")); +@Component +@Lazy +public class RemovePlotsFromDBDlg { - private static final ComboBoxItem COMBO_BOX_ITEM_SQUARE = new ComboBoxItem(0, - Messages.getString("OptionWizard.53")); + @Autowired + private RecordManager recordManager; - private static final long serialVersionUID = -6760020609229102842L; + @Autowired + private EarthSurveyService earthSurveyService; - private final HashMap, JComponent[]> propertyToComponent = new HashMap<>(); - private final transient Logger logger = LoggerFactory.getLogger(this.getClass()); + @SuppressWarnings("unused") + private static final long serialVersionUID = 5175096170385736616L; + private CollectSurvey survey; + private Logger logger = LoggerFactory.getLogger(RemovePlotsFromDBDlg.class); - JPanel postgresPanel; - JPanel sqlitePanel; + private JButton deleteFromDB; + private JFilePicker filePicker; - private transient LocalPropertiesService localPropertiesService; + private JDialog dlg; - String backupFolder; - - private transient AnalysisSaikuService saikuService; - - private transient EarthProjectsService projectsService; - - private boolean restartRequired; - - private String oldSelectedDistance; - - private CollectSurvey surveyLoaded; - - private JButton applyChanges; - - public PropertiesDialog(JFrame frame, LocalPropertiesService localPropertiesService, - EarthProjectsService projectsService, String backupFolder, AnalysisSaikuService saikuService, - CollectSurvey surveyLoaded) { - super(frame, Messages.getString("OptionWizard.0")); //$NON-NLS-1$ - this.localPropertiesService = localPropertiesService; - this.projectsService = projectsService; - this.backupFolder = backupFolder; - this.saikuService = saikuService; - this.surveyLoaded = surveyLoaded; - this.setLocationRelativeTo(null); - this.setSize(new Dimension(600, 620)); - this.setModal(true); - this.setResizable(false); - initilizeInputs(); - buildMainPane(); - centreWindow(); - - } - - private void centreWindow() { - Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize(); - int x = (int) ((dimension.getWidth() - getWidth()) / 2); - int y = (int) ((dimension.getHeight() - getHeight()) / 2); - setLocation(x, y); - } - - private void buildMainPane() { - - final JPanel panel = new JPanel(new BorderLayout()); - panel.add(getOptionTabs(), BorderLayout.CENTER); - final JPanel buttonPanel = new JPanel(); - buttonPanel.add(getApplyChangesButton()); - buttonPanel.add(getCancelButton()); - panel.add(buttonPanel, BorderLayout.PAGE_END); - this.add(panel); - - } - - private void enableContainer(Container container, boolean enable) { - final Component[] components = container.getComponents(); - for (final Component component : components) { - component.setEnabled(enable); - if (component instanceof Container) { - enableContainer((Container) component, enable); - } - } - } - - private JComponent getBrowsersOptionsPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - final JPanel browserChooserPanel = new JPanel(); - final Border browserBorder = new TitledBorder(new BevelBorder(BevelBorder.LOWERED), - Messages.getString("OptionWizard.1")); //$NON-NLS-1$ - browserChooserPanel.setBorder(browserBorder); - GridLayout experimentLayout = new GridLayout(0,1); - browserChooserPanel.setLayout( experimentLayout ); - - final ButtonGroup browserChooser = new ButtonGroup(); - final JComponent[] browsers = propertyToComponent.get(EarthProperty.BROWSER_TO_USE); - - for (final JComponent browserRadioButton : browsers) { - browserChooserPanel.add(browserRadioButton); - browserChooser.add((AbstractButton) browserRadioButton); - - ((JRadioButton) browserRadioButton).addActionListener(e -> setRestartRequired(true)); - } - constraints.gridy++; - panel.add(browserChooserPanel, constraints); - - constraints.gridy++; - constraints.gridx = 0; - panel.add(propertyToComponent.get(EarthProperty.SAIKU_SERVER_FOLDER)[0], constraints); - - return panel; - } - - private JComponent getIntegrationsPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - panel.add(propertyToComponent.get(EarthProperty.OPEN_GEE_APP)[0], constraints); - - constraints.gridy++; - panel.add(propertyToComponent.get(EarthProperty.OPEN_BING_MAPS)[0], constraints); - - constraints.gridy++; - panel.add(propertyToComponent.get(EarthProperty.OPEN_EARTH_MAP)[0], constraints); - - - constraints.gridy++; - constraints.gridwidth = 1; - panel.add(propertyToComponent.get(EarthProperty.OPEN_PLANET_MAPS)[0], constraints); - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.PLANET_MAPS_MONHLY)[0], constraints); - - constraints.gridy++; - constraints.gridx = 0; - constraints.gridwidth = 1; - final JLabel label = new JLabel(Messages.getString("OptionWizard.101")); //$NON-NLS-1$ - panel.add(label, constraints); - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.PLANET_MAPS_KEY)[0], constraints); - - constraints.gridx = 0; - constraints.gridy++; - constraints.gridwidth = 2; - panel.add(propertyToComponent.get(EarthProperty.OPEN_MAXAR_SECUREWATCH)[0], constraints); - - constraints.gridy++; - constraints.gridwidth = 1; - final JLabel labelMaxar = new JLabel(Messages.getString("OptionWizard.1021")); //$NON-NLS-1$ - panel.add(labelMaxar, constraints); - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.MAXAR_SECUREWATCH_URL)[0], constraints); - - constraints.gridx = 0; - constraints.gridy++; - constraints.gridwidth = 2; - panel.add(propertyToComponent.get(EarthProperty.OPEN_YANDEX_MAPS)[0], constraints); - - constraints.gridy++; - panel.add(propertyToComponent.get(EarthProperty.OPEN_BAIDU_MAPS)[0], constraints); - - constraints.gridy++; - final JLabel label2 = new JLabel(Messages.getString("OptionWizard.103")); //$NON-NLS-1$ - panel.add(label2, constraints); - constraints.gridy++; - panel.add(propertyToComponent.get(EarthProperty.EXTRA_MAP_URL)[0], constraints); - - constraints.gridy++; - constraints.gridx = 0; - constraints.gridwidth = 2; - panel.add(propertyToComponent.get(EarthProperty.OPEN_GEE_CODE_EDITOR)[0], constraints); - - - return panel; + public RemovePlotsFromDBDlg() { + super(); } - - private Component getApplyChangesButton() { - if (applyChanges == null) { - applyChanges = new JButton(Messages.getString("OptionWizard.15")); - applyChanges.addActionListener( - new ApplyOptionChangesListener(this, localPropertiesService, propertyToComponent) { - @Override - protected void applyProperties() { - new Thread("Applying properties dialog") { - @Override - public void run() { - savePropertyValues(); - if (isRestartRequired()) { - - restartEarth(); - } else { - EarthApp.executeKmlLoadAsynchronously(PropertiesDialog.this); - } - } - }.start(); - } - }); + private class DeleteResults { + private boolean success; + private Integer plotsDeleted; + private Integer plotsNotFoundInDB; + private Integer plotsErrorWhenDeleting; + private List messages; + + public DeleteResults(boolean success, Integer plotsDeleted, Integer plotsNotFoundInDB, + Integer plotsErrorWhenDeleting, List messages) { + super(); + this.success = success; + this.plotsDeleted = plotsDeleted; + this.plotsNotFoundInDB = plotsNotFoundInDB; + this.plotsErrorWhenDeleting = plotsErrorWhenDeleting; + this.messages = messages; } - return applyChanges; - } - public void closeDialog() { - this.dispose(); } - private Component getCancelButton() { - final JButton cancelButton = new JButton(Messages.getString("OptionWizard.24")); //$NON-NLS-1$ - cancelButton.addActionListener( e -> PropertiesDialog.this.dispose() ); - return cancelButton; + public void open(Frame owner, CollectSurvey survey) { + this.dlg = new JDialog(owner); + this.survey = survey; + this.dlg.setModal(true); + this.dlg.setSize(new Dimension(700, 350)); + this.dlg.setLocationRelativeTo(owner); + this.dlg.setTitle("Tool for removing plots from DB using a CSV with plot IDs"); + initLayout(); + dlg.setVisible(true); } - private JComponent getOperationModePanel() { - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - final JPanel typeOfUsePanel = new JPanel(new GridBagLayout()); - final Border border = new TitledBorder(new BevelBorder(BevelBorder.LOWERED), - Messages.getString("OptionWizard.2")); //$NON-NLS-1$ - typeOfUsePanel.setBorder(border); - - JPanel serverPanel = getServerPanel(); - typeOfUsePanel.add(serverPanel, constraints); - - return typeOfUsePanel; - } - - private void enableDBOptions(boolean isPostgreDb) { - enableContainer(postgresPanel, isPostgreDb); - enableContainer(sqlitePanel, !isPostgreDb); - } - - private ActionListener getDbTypeListener() { - return e -> { - final JRadioButton theJRB = (JRadioButton) e.getSource(); - - boolean isPostgreDb = theJRB.getName().equals(CollectDBDriver.POSTGRESQL.name()); - enableDBOptions(isPostgreDb); - }; - } - - private JTabbedPane getOptionTabs() { - final JTabbedPane tabbedPane = new JTabbedPane(); - tabbedPane.setSize(550, 300); - final JComponent panel1 = getSampleDataPanel(); - tabbedPane.addTab(Messages.getString("OptionWizard.31"), panel1); //$NON-NLS-1$ - - final JComponent panel2 = getPlotOptionsPanel(); - tabbedPane.addTab(Messages.getString("OptionWizard.32"), panel2); //$NON-NLS-1$ - - final JComponent panel3 = getSurveyDefinitonPanel(); - tabbedPane.addTab(Messages.getString("OptionWizard.33"), panel3); //$NON-NLS-1$ - - final JComponent panel41 = getIntegrationsPanel(); - tabbedPane.addTab(Messages.getString("OptionWizard.34"), panel41); //$NON-NLS-1$ - - final JComponent panel4 = getBrowsersOptionsPanel(); - tabbedPane.addTab(Messages.getString("OptionWizard.104"), panel4); //$NON-NLS-1$ - - final JComponent panel5 = getOperationModePanelScroll(); - tabbedPane.addTab(Messages.getString("OptionWizard.25"), panel5); //$NON-NLS-1$ - - final JComponent panel6 = getProjectsPanelScroll(); - tabbedPane.addTab(Messages.getString("OptionWizard.40"), panel6); //$NON-NLS-1$ - - return tabbedPane; - } - - private JComponent getProjectsPanelScroll() { - final JComponent projectsPanel = getProjectsPanel(); - return new JScrollPane(projectsPanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); - } - - private JComponent getProjectsPanel() { + private void initLayout() { final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.fill = GridBagConstraints.BOTH; - - JButton importNewButton = new JButton(Messages.getString("OptionWizard.41")); //$NON-NLS-1$ - importNewButton.addActionListener(new ApplyOptionChangesListener(this, localPropertiesService) { - - @Override - protected void applyProperties() { - final File[] selectedProjectFile = JFileChooserExistsAware.getFileChooserResults( - DataFormat.PROJECT_DEFINITION_FILE, false, false, null, localPropertiesService, - (JFrame) PropertiesDialog.this.getParent()); - - if (selectedProjectFile != null && selectedProjectFile.length == 1) { - try { - projectsService.loadCompressedProjectFile(selectedProjectFile[0]); - restartEarth(); - } catch (Exception e1) { - JOptionPane.showMessageDialog(PropertiesDialog.this, e1.getMessage(), - Messages.getString("OptionWizard.51"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - logger.error("Error importing project file " + selectedProjectFile[0].getAbsolutePath(), e1); //$NON-NLS-1$ - } - - } - } - }); - - panel.add(importNewButton, constraints); - - final JPanel typeOfDbPanel = new JPanel(new GridBagLayout()); - final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), - Messages.getString("OptionWizard.57")); //$NON-NLS-1$ - typeOfDbPanel.setBorder(border); - - constraints.gridx = 0; - constraints.gridy = 1; - panel.add(typeOfDbPanel, constraints); - - List listOfProjectsByName = new ArrayList<>(); - listOfProjectsByName.addAll(projectsService.getProjectList().keySet()); - Collections.sort(listOfProjectsByName); - final JList listOfProjects = new JList<>(listOfProjectsByName.toArray(new String[0])); // data has type Object[] - listOfProjects.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - listOfProjects.setLayoutOrientation(JList.VERTICAL); - listOfProjects.setVisibleRowCount(-1); - - JScrollPane listScroller = new JScrollPane(listOfProjects); - listScroller.setPreferredSize(new Dimension(250, 300)); - - constraints.gridy = 0; - constraints.gridx = GridBagConstraints.RELATIVE; - typeOfDbPanel.add(listScroller, constraints); - - final JButton openProject = new JButton(Messages.getString("OptionWizard.56")); //$NON-NLS-1$ - openProject.setEnabled(false); - openProject.addActionListener(new ApplyOptionChangesListener(this, localPropertiesService) { - - @Override - protected void applyProperties() { - - File projectFolder = projectsService.getProjectList().get(listOfProjects.getSelectedValue()); - - try { - projectsService.loadProjectInFolder(projectFolder); - restartEarth(); - } catch (Exception e1) { - JOptionPane.showMessageDialog(PropertiesDialog.this, e1.getMessage(), - Messages.getString("OptionWizard.55"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - logger.error("Error importing project folder " + projectFolder.getAbsolutePath(), e1); //$NON-NLS-1$ - } - - } - - }); - - listOfProjects.addListSelectionListener(e -> openProject.setEnabled(listOfProjects.getSelectedValue() != null) ); - - typeOfDbPanel.add(openProject); - - return panel; - } - - private JScrollPane getOperationModePanelScroll() { - final JComponent operationModePanel = getOperationModePanel(); - return new JScrollPane(operationModePanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + GridBagConstraints c = new GridBagConstraints(); + + int row = 0; + c.fill = GridBagConstraints.BOTH; + + c.gridx = 0; + c.gridwidth = 2; + panel.add(new JLabel("" + + "This utility deletes plots that are already collected and present in the Collect Earth Database.
" + + "Make sure to backup the data in your DB before attempting to delete plots ( use the Tools->Data Import/Export->Export data to Collect Backup function)." + + "
" + + "The next field expects a CSV file for which the IDs of the plots to be deleted are present.The headers of the columns should be the names of the key attributes of the survey (usually just one, called ID, but it could be more)." + + ""), c); + c.gridy = row++; + + c.gridx = 0; + c.gridwidth = 2; + c.gridy = row++; + panel.add(getCsvFilePicker(), c); + c.gridy = row; + + panel.add(getDeleteButton(), c); + this.dlg.add(panel); } - private JComponent getPlotOptionsPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.fill = GridBagConstraints.HORIZONTAL; - - JLabel label = new JLabel("Plot shape"); - panel.add(label, constraints); - - constraints.gridx = 1; - JComboBox plotShape = (JComboBox) propertyToComponent.get(EarthProperty.SAMPLE_SHAPE)[0]; - panel.add(plotShape, constraints); - - constraints.gridx = 0; - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.35")); //$NON-NLS-1$ - panel.add(label, constraints); - - constraints.gridx = 1; - JComboBox numberPoints = (JComboBox) propertyToComponent - .get(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT)[0]; - panel.add(numberPoints, constraints); - - constraints.gridx = 0; - constraints.gridy++; - JLabel distanceOrRadiuslabel = new JLabel(Messages.getString("OptionWizard.36")); //$NON-NLS-1$ - panel.add(distanceOrRadiuslabel, constraints); - - constraints.gridx = 1; - JComboBox distanceBetweenPoints = (JComboBox) propertyToComponent - .get(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS)[0]; - panel.add(new JScrollPane(distanceBetweenPoints), constraints); - - constraints.gridx = 0; - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.37")); //$NON-NLS-1$ - panel.add(label, constraints); - constraints.gridx = 1; - JComboBox distanceToFrame = (JComboBox) propertyToComponent - .get(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES)[0]; - panel.add(new JScrollPane(distanceToFrame), constraints); - - constraints.gridx = 0; - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.95")); //$NON-NLS-1$ - panel.add(label, constraints); - constraints.gridx = 1; - JComboBox dotsSide = (JComboBox) propertyToComponent.get(EarthProperty.INNER_SUBPLOT_SIDE)[0]; - panel.add(new JScrollPane(dotsSide), constraints); - - constraints.gridx = 0; - constraints.gridy++; - label = new JLabel("Central plot side"); //$NON-NLS-1$ - panel.add(label, constraints); - constraints.gridx = 1; - JComboBox largeCentralPlotSide = (JComboBox) propertyToComponent.get(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)[0]; - panel.add(new JScrollPane(largeCentralPlotSide), constraints); - - - - constraints.gridx = 0; - constraints.gridy++; - label = new JLabel("Distance between plots in cluster"); - panel.add(label, constraints); - constraints.gridx = 1; - JComboBox plotDistanceInCluster = (JComboBox) propertyToComponent - .get(EarthProperty.DISTANCE_BETWEEN_PLOTS)[0]; - panel.add(new JScrollPane(plotDistanceInCluster), constraints); - - constraints.gridx = 0; - constraints.gridy++; - JLabel area = new JLabel( - "Area (hectares) : " + calculateArea(numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide)); - panel.add(area, constraints); - - ActionListener calculateAreas = actionPerformed -> area.setText("Area (hectares) : " + calculateArea(numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide)); - - plotShape.addActionListener( e-> - handleVisibilityPlotLayout(plotShape, numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide, - plotDistanceInCluster, area, distanceOrRadiuslabel, largeCentralPlotSide) - ); - - numberPoints.addActionListener(calculateAreas); - distanceBetweenPoints.addActionListener(calculateAreas); - distanceToFrame.addActionListener(calculateAreas); - - handleVisibilityPlotLayout(plotShape, numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide, - plotDistanceInCluster, area, distanceOrRadiuslabel, largeCentralPlotSide); - - return panel; - } - - public void handleVisibilityPlotLayout(JComboBox plotShape, JComboBox numberPoints, JComboBox distanceBetweenPoints, - JComboBox distanceToFrame, JComboBox dotsSide, JComboBox distanceBetweenPlots, JLabel area, - JLabel distanceOrRadiuslabel, JComboBox largeCentralPlotSide ) { - numberPoints.setEnabled(false); - distanceBetweenPoints.setEnabled(false); - distanceToFrame.setEnabled(false); - dotsSide.setEnabled(false); - area.setVisible(false); - distanceBetweenPlots.setVisible(false); - distanceBetweenPlots.setEnabled(false); - largeCentralPlotSide.setVisible( false ); - largeCentralPlotSide.setEnabled(false); - - if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE) || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE_WITH_LARGE_CENTRAL_PLOT) ) { - numberPoints.setEnabled(true); - distanceBetweenPoints.setEnabled(true); - distanceToFrame.setEnabled(true); - dotsSide.setEnabled(true); - area.setVisible(true); - distanceOrRadiuslabel.setText(Messages.getString("OptionWizard.36")); - - if( plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE_WITH_LARGE_CENTRAL_PLOT) ) { - largeCentralPlotSide.setVisible( true ); - largeCentralPlotSide.setEnabled(true); - } - - } else if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.CIRCLE) - || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.HEXAGON)) { - distanceBetweenPoints.setEnabled(true); - dotsSide.setEnabled(true); - numberPoints.setEnabled(true); - distanceOrRadiuslabel.setText("Radius"); - } else if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.NFI_THREE_CIRCLES) || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.NFI_FOUR_CIRCLES)) { - dotsSide.setEnabled(true); - distanceBetweenPoints.setEnabled(true); - distanceBetweenPlots.setVisible(true); - distanceBetweenPlots.setEnabled(true); - distanceOrRadiuslabel.setText("Radius of the plots"); + private JButton getDeleteButton() { + if (deleteFromDB == null) { + deleteFromDB = new JButton("Delete plots with IDs in the CSV from the database"); + deleteFromDB.setEnabled(false); + deleteFromDB.addActionListener( e -> { + if (JOptionPane.showConfirmDialog(RemovePlotsFromDBDlg.this.dlg, + "Are you sure you want to remove the plots with the IDs that are specified in the CSV file??", + "Confirm deletion of plots in DB", JOptionPane.YES_NO_OPTION, + JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) { + deletePlotsFromDB(); + } + }); } + return deleteFromDB; } - private String calculateArea(JComboBox numberOfPoints, JComboBox distanceBetweenPoints, JComboBox distanceToFrame, JComboBox dotsSide) { - double side = 0; - try { - int numberOfPointsI = ((ComboBoxItem) numberOfPoints.getSelectedItem()).getNumberOfPoints(); - int distanceBetweenPointsI = Integer.parseInt((String) distanceBetweenPoints.getSelectedItem()); - int distanceToFrameI = Integer.parseInt((String) distanceToFrame.getSelectedItem()); + private boolean validateCsv(String filePath) { + boolean validFile = true; - if (numberOfPointsI == 0 || numberOfPointsI == 1) { + try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(filePath, false) ){ - side = 2d * distanceToFrameI; - if (oldSelectedDistance == null) { - oldSelectedDistance = (String) distanceBetweenPoints.getSelectedItem(); - distanceBetweenPoints.setEnabled(false); - } - distanceBetweenPoints.setSelectedItem("0"); + filePicker.setTextBackground(Color.white); - if (numberOfPointsI == 0) { - dotsSide.setEnabled(false); - } else if (numberOfPointsI == 1) { - dotsSide.setEnabled(true); - } + if (CsvReaderUtils.isCsvFile(filePath)) { - } else { - if (oldSelectedDistance != null) { - distanceBetweenPoints.setSelectedItem(oldSelectedDistance); - oldSelectedDistance = null; + // Get the first line + String[] csvHeaders = csvReader.readNext(); + String[] expectedHeaders = getKeyAttributesName(); + if (!Arrays.equals(expectedHeaders, csvHeaders)) { + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, + String.format("The Headers of the CSV file used should be %s, instead they are %s", + Arrays.toString(expectedHeaders), + StringUtils.abbreviate(Arrays.toString(csvHeaders), 35))); + filePicker.setTextBackground(Color.red); + validFile = false; } - distanceBetweenPoints.setEnabled(true); - distanceToFrame.setEnabled(true); - dotsSide.setEnabled(true); - - double pointsByLines = Math.sqrt(numberOfPointsI); - side = 2d * distanceToFrameI + (pointsByLines - 1) * distanceBetweenPointsI; + } else { + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, + String.format("The file in %s is NOT A CSV file ", filePath)); + validFile = false; + filePicker.setTextBackground(Color.red); } - - } catch (RuntimeException e) { - logger.error("Error calculating area of the plot", e); + } catch (Exception e) { + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, + String.format("Error opening file at %s. %s ", filePath, e.getMessage())); + logger.error("Error while validating the CSV file", e); + validFile = false; } - DecimalFormat df = new DecimalFormat("###.##"); - return df.format(side * side / 10000d); - } - - private JPanel getPostgreSqlPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), - Messages.getString("OptionWizard.6")); //$NON-NLS-1$ - panel.setBorder(border); - - JLabel label = new JLabel(Messages.getString("OptionWizard.7")); //$NON-NLS-1$ - constraints.gridx = 0; - panel.add(label, constraints); - - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.DB_USERNAME)[0], constraints); - - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.8")); //$NON-NLS-1$ - constraints.gridx = 0; - panel.add(label, constraints); - - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.DB_PASSWORD)[0], constraints); - - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.9")); //$NON-NLS-1$ - constraints.gridx = 0; - panel.add(label, constraints); - - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.DB_NAME)[0], constraints); - - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.26")); //$NON-NLS-1$ - constraints.gridx = 0; - panel.add(label, constraints); - - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.DB_HOST)[0], constraints); - - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.29")); //$NON-NLS-1$ - constraints.gridx = 0; - panel.add(label, constraints); - - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.DB_PORT)[0], constraints); - - constraints.gridx = 2; - panel.add(new JLabel("Default: 5432"), constraints); - - constraints.gridy++; - constraints.gridx = 1; - JButton button = new JButton("Test Connection"); //$NON-NLS-1$ - button.addActionListener( e-> { - String host = ((JTextField) (propertyToComponent.get(EarthProperty.DB_HOST)[0])).getText(); - String port = ((JTextField) (propertyToComponent.get(EarthProperty.DB_PORT)[0])).getText(); - String dbName = ((JTextField) (propertyToComponent.get(EarthProperty.DB_NAME)[0])).getText(); - String username = ((JTextField) (propertyToComponent.get(EarthProperty.DB_USERNAME)[0])).getText(); - String password = ((JTextField) (propertyToComponent.get(EarthProperty.DB_PASSWORD)[0])).getText(); - - String message = CollectEarthUtils.testPostgreSQLConnection(host, port, dbName, username, password); - JOptionPane.showMessageDialog(PropertiesDialog.this.getOwner(), message, "PostgreSQL Connection test", - JOptionPane.INFORMATION_MESSAGE); - }); - panel.add(button, constraints); - - return panel; + getDeleteButton().setEnabled(validFile); + return validFile; } - private JPanel getSqlLitePanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), - Messages.getString("OptionWizard.30")); //$NON-NLS-1$ - panel.setBorder(border); - - panel.add(propertyToComponent.get(EarthProperty.AUTOMATIC_BACKUP)[0], constraints); - constraints.gridx++; - panel.add(getOpenBackupFolderButton()); - return panel; - } - - private JComponent getSampleDataPanel() { - final JPlotCsvTable samplePlots = new JPlotCsvTable(localPropertiesService.getValue(EarthProperty.SAMPLE_FILE), - surveyLoaded); - - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.fill = GridBagConstraints.BOTH; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; + private void deletePlotsFromDB() { + InfiniteProgressMonitor progressDeletion = new InfiniteProgressMonitor(this.dlg, "Deleting plots", + "Wait while the plots are deleted from the database"); - final JFilePicker refreshTableOnFileChange = getFilePickerSamplePlots(samplePlots); - - panel.add(refreshTableOnFileChange, constraints); - - samplePlots.setFillsViewportHeight(true); - constraints.gridy = 1; - - constraints.weightx = 1.0; - constraints.weighty = 1.0; - constraints.gridwidth = GridBagConstraints.REMAINDER; - constraints.gridheight = GridBagConstraints.REMAINDER; - - samplePlots.setPreferredScrollableViewportSize(samplePlots.getPreferredSize()); - - panel.add(new JScrollPane(samplePlots, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, - ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), constraints); - - return panel; - } - - private JFilePicker getFilePickerSamplePlots(final JPlotCsvTable samplePlots) { - final JFilePicker refreshTableOnFileChange = (JFilePicker) (propertyToComponent - .get(EarthProperty.SAMPLE_FILE)[0]); - refreshTableOnFileChange.addChangeListener(new DocumentListener() { + Thread treadDeleting = new Thread("Deleting plots from Database") { + int plotsDeleted = 0; + int plotsNotFoundInDB = 0; + int plotsCouldNotBeDeleted = 0; + boolean success = true; + ArrayList messages = new ArrayList<>(); @Override - public void changedUpdate(DocumentEvent e) { - // Do not react - } - - @Override - public void insertUpdate(DocumentEvent e) { - refreshTable(); - } - - @Override - public void removeUpdate(DocumentEvent e) { - // Do not react - } - - private void refreshTable() { - samplePlots.refreshTable(refreshTableOnFileChange.getSelectedFilePath()); - - // Do not let the user save the changes if the sample data is wrong!!! - getApplyChangesButton().setEnabled(samplePlots.isDataValid()); - } - }); - return refreshTableOnFileChange; - } - - private JPanel getServerPanel() { + public void run() { + try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(getCsvFilePicker().getSelectedFilePath(), false) ){ + List allLines = csvReader.readAll(); + int totalLines = allLines.size() - 1; + boolean skipFirst = true; + int plot = 0; + progressDeletion.showLater(); + for (String[] csvRow : allLines) { + + if (skipFirst) { + skipFirst = false; + continue; + } - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; + progressDeletion.updateProgress(++plot, totalLines); - final JPanel typeOfDbPanel = new JPanel(new GridBagLayout()); - final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), - Messages.getString("OptionWizard.3")); //$NON-NLS-1$ - typeOfDbPanel.setBorder(border); + CollectRecord record = earthSurveyService.loadRecord(csvRow); + if (record == null) { + plotsNotFoundInDB++; + messages.add(String.format(" Could not find plot with ID %s in the Database", + Arrays.toString(csvRow))); + } else { + deleteRecord(csvRow, record); + } + } - JLabel label = new JLabel(Messages.getString("OptionWizard.4") + CollectEarthUtils.getComputerIp()); //$NON-NLS-1$ - typeOfDbPanel.add(label, constraints); - constraints.gridy++; + } catch (Exception e) { + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, + "Error reading CSV file or CSV File too big!"); + logger.error("Error while validating the CSV file", e); + success = false; + } finally { - label = new JLabel(Messages.getString("OptionWizard.5")); //$NON-NLS-1$ - constraints.gridx = 0; - typeOfDbPanel.add(label, constraints); + if (progressDeletion != null) { + progressDeletion.close(); + } - constraints.gridx = 1; - typeOfDbPanel.add(propertyToComponent.get(EarthProperty.HOST_PORT_KEY)[0], constraints); + } - constraints.gridwidth = GridBagConstraints.REMAINDER; - constraints.gridy++; - constraints.gridx = 0; + DeleteResults deleteResults = new DeleteResults(success, plotsDeleted, plotsNotFoundInDB, + plotsCouldNotBeDeleted, messages); + String result = "Plots Deleted : " + deleteResults.plotsDeleted + "
" + + "Plots Not Found :
" + deleteResults.plotsNotFoundInDB + "
" + + "Plots that could not be deleted because a exception : " + deleteResults.plotsErrorWhenDeleting + "
" + + " Messages :
" + StringUtils.join(deleteResults.messages, "
"); + if( success ) { + result = "" + + "Results of the deletion process:
" + + result + ""; + }else { + result = "" + + "There was an error while deleting the plots. Review the Collect Earth Log file in the Help menu.
" + + result + ""; + } - final ButtonGroup bg = new ButtonGroup(); - final JComponent[] dbTypes = propertyToComponent.get(EarthProperty.DB_DRIVER); - postgresPanel = getPostgreSqlPanel(); - sqlitePanel = getSqlLitePanel(); + JEditorPane web = new JEditorPane(); + web.setEditable(false); + web.setContentType("text/html"); + web.setText(result); - boolean usingPostgreSQL = localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.POSTGRESQL); - enableDBOptions(usingPostgreSQL); - for (final JComponent typeRadioButton : dbTypes) { - final JRadioButton dbTypeButton = (JRadioButton) typeRadioButton; - bg.add(dbTypeButton); - typeOfDbPanel.add(dbTypeButton, constraints); - constraints.gridy++; + JScrollPane scrollPane = new JScrollPane(web); + scrollPane.setPreferredSize( new Dimension( 450, 350 )); - dbTypeButton.addActionListener(getDbTypeListener()); - dbTypeButton.addActionListener(e -> setRestartRequired(true)); + // Refresh contents of Google Earth! + EarthApp.executeKmlLoadAsynchronously( null ); - if (dbTypeButton.getName().equals(EarthConstants.CollectDBDriver.POSTGRESQL.name())) { - typeOfDbPanel.add(postgresPanel, constraints); - constraints.gridy++; + SwingUtilities.invokeLater( () -> { + if (deleteResults.success) { + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, scrollPane, "Success deleting plots", JOptionPane.INFORMATION_MESSAGE); + } else { - } else { - typeOfDbPanel.add(sqlitePanel, constraints); - constraints.gridy++; + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, scrollPane, "Error deleting plots", JOptionPane.WARNING_MESSAGE); + } + }); } - } - return typeOfDbPanel; - } - - private Component getOpenBackupFolderButton() { - AbstractAction backupAction = new AbstractAction(Messages.getString("OptionWizard.10")) { //$NON-NLS-1$ - - private static final long serialVersionUID = 1L; - - @Override - public void actionPerformed(ActionEvent e) { + private void deleteRecord(String[] csvRow, CollectRecord record) { try { - - CollectEarthUtils.openFolderInExplorer(backupFolder); - - } catch (final IOException e1) { - logger.error("Error when opening the explorer window to visualize backups", e1); //$NON-NLS-1$ + recordManager.delete(record.getId()); + messages.add(String.format("Deleted plot with ID %s ", Arrays.toString(csvRow))); + plotsDeleted++; + } catch (RecordPersistenceException e) { + plotsCouldNotBeDeleted++; + messages.add(String.format("Error when deleting plot with ID %s. Error Message: %s", + Arrays.toString(csvRow), e.getMessage())); + logger.error("Error deleting plot with ID " + Arrays.toString(csvRow)); + success = false; } } - }; - return new JButton(backupAction); + treadDeleting.start(); } - private JComponent getSurveyDefinitonPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.fill = GridBagConstraints.HORIZONTAL; - constraints.gridwidth = 2; - panel.add(propertyToComponent.get(EarthProperty.OPEN_BALLOON_IN_BROWSER)[0], constraints); - - constraints.gridy++; - constraints.gridwidth = 1; - final JLabel label = new JLabel(Messages.getString("OptionWizard.43")); //$NON-NLS-1$ - panel.add(label, constraints); - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.SURVEY_NAME)[0], constraints); - - constraints.gridy++; - constraints.gridwidth = GridBagConstraints.REMAINDER; - constraints.gridx = 0; - panel.add(propertyToComponent.get(EarthProperty.KML_TEMPLATE_KEY)[0], constraints); - - constraints.gridy++; - constraints.gridx = 0; - panel.add(propertyToComponent.get(EarthProperty.BALLOON_TEMPLATE_KEY)[0], constraints); - - constraints.gridy++; - constraints.gridx = 0; - - panel.add(propertyToComponent.get(EarthProperty.METADATA_FILE)[0], constraints); - - return panel; - } - - private void initilizeInputs() { - - final JCheckBox backupCheckbox = new JCheckBox(Messages.getString("OptionWizard.44")); //$NON-NLS-1$ - backupCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.AUTOMATIC_BACKUP))); - propertyToComponent.put(EarthProperty.AUTOMATIC_BACKUP, new JComponent[] { backupCheckbox }); - - final JCheckBox openEarthEngineCheckbox = new JCheckBox(Messages.getString("OptionWizard.45")); //$NON-NLS-1$ - openEarthEngineCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_EXPLORER))); - propertyToComponent.put(EarthProperty.OPEN_GEE_EXPLORER, new JComponent[] { openEarthEngineCheckbox }); - - final JCheckBox openGEEAppCheckbox = new JCheckBox("Google Earth Engine APP (no sign-in)"); //$NON-NLS-1$ - openGEEAppCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_APP))); - propertyToComponent.put(EarthProperty.OPEN_GEE_APP, new JComponent[] { openGEEAppCheckbox }); - - final JCheckBox openTimelapseCheckbox = new JCheckBox(Messages.getString("OptionWizard.46")); //$NON-NLS-1$ - openTimelapseCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_TIMELAPSE))); - propertyToComponent.put(EarthProperty.OPEN_TIMELAPSE, new JComponent[] { openTimelapseCheckbox }); - - final JCheckBox openEarthMapCheckbox = new JCheckBox(Messages.getString("OptionWizard.105")); //$NON-NLS-1$ - openEarthMapCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_EARTH_MAP))); - propertyToComponent.put(EarthProperty.OPEN_EARTH_MAP, new JComponent[] { openEarthMapCheckbox }); - - final JCheckBox openBingCheckbox = new JCheckBox(Messages.getString("OptionWizard.47")); //$NON-NLS-1$ - openBingCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BING_MAPS))); - propertyToComponent.put(EarthProperty.OPEN_BING_MAPS, new JComponent[] { openBingCheckbox }); - - final JCheckBox openPlanetCheckbox = new JCheckBox(Messages.getString("OptionWizard.100")); //$NON-NLS-1$ - openPlanetCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_PLANET_MAPS))); - propertyToComponent.put(EarthProperty.OPEN_PLANET_MAPS, new JComponent[] { openPlanetCheckbox }); - - final JCheckBox openMonthlyNICFICheckbox = new JCheckBox(Messages.getString("OptionWizard.110")); //$NON-NLS-1$ - openMonthlyNICFICheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.PLANET_MAPS_MONHLY))); - propertyToComponent.put(EarthProperty.PLANET_MAPS_MONHLY, new JComponent[] { openMonthlyNICFICheckbox }); - - - final JPasswordField planetAPIKeyTextField = new JPasswordField( - localPropertiesService.getValue(EarthProperty.PLANET_MAPS_KEY)); - planetAPIKeyTextField.setMinimumSize(new Dimension( 250, 20 )); - planetAPIKeyTextField.setEnabled( localPropertiesService.isPlanetMapsSupported() ); - propertyToComponent.put(EarthProperty.PLANET_MAPS_KEY, new JComponent[] { planetAPIKeyTextField }); - - openMonthlyNICFICheckbox.setEnabled( openPlanetCheckbox.isSelected() ); - planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ); - - openPlanetCheckbox.addActionListener( e-> { - planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ); - openMonthlyNICFICheckbox.setEnabled( openPlanetCheckbox.isSelected() ); - }); - openMonthlyNICFICheckbox.addActionListener( e-> planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ) ); - - - final JCheckBox openSecureWatchCheckbox = new JCheckBox(Messages.getString("OptionWizard.102")); //$NON-NLS-1$ - openSecureWatchCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_MAXAR_SECUREWATCH))); - propertyToComponent.put(EarthProperty.OPEN_MAXAR_SECUREWATCH, new JComponent[] { openSecureWatchCheckbox }); - - final JTextField secureWatchUrlTextField = new JTextField( - localPropertiesService.getValue(EarthProperty.MAXAR_SECUREWATCH_URL)); - secureWatchUrlTextField.setMinimumSize(new Dimension( 250, 20 )); - propertyToComponent.put(EarthProperty.MAXAR_SECUREWATCH_URL, new JComponent[] { secureWatchUrlTextField }); - secureWatchUrlTextField.setEnabled( localPropertiesService.isSecureWatchSupported() ); - propertyToComponent.put(EarthProperty.MAXAR_SECUREWATCH_URL, new JComponent[] { secureWatchUrlTextField }); - openSecureWatchCheckbox.addActionListener( e -> secureWatchUrlTextField.setEnabled( openSecureWatchCheckbox.isSelected() ) ); - - final JTextField extraUrlTextField = new JTextField( - localPropertiesService.getValue(EarthProperty.EXTRA_MAP_URL)); - extraUrlTextField.setMinimumSize(new Dimension( 250, 20 )); - propertyToComponent.put(EarthProperty.EXTRA_MAP_URL, new JComponent[] { extraUrlTextField }); - - final JCheckBox openBaiduCheckbox = new JCheckBox("Open Baidu Maps"); - openBaiduCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BAIDU_MAPS))); - propertyToComponent.put(EarthProperty.OPEN_BAIDU_MAPS, new JComponent[] { openBaiduCheckbox }); - - final JCheckBox openYandexCheckbox = new JCheckBox("Open Yandex maps for the plot area"); - openYandexCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_YANDEX_MAPS))); - propertyToComponent.put(EarthProperty.OPEN_YANDEX_MAPS, new JComponent[] { openYandexCheckbox }); - - final JCheckBox openHereCheckbox = new JCheckBox(Messages.getString("OptionWizard.59")); //$NON-NLS-1$ - openHereCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_HERE_MAPS))); - propertyToComponent.put(EarthProperty.OPEN_HERE_MAPS, new JComponent[] { openHereCheckbox }); - - final JCheckBox openGeePlaygroundCheckbox = new JCheckBox(Messages.getString("OptionWizard.58")); //$NON-NLS-1$ - openGeePlaygroundCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_CODE_EDITOR))); - propertyToComponent.put(EarthProperty.OPEN_GEE_CODE_EDITOR, new JComponent[] { openGeePlaygroundCheckbox }); - - final JCheckBox openInSeparateWindowCheckbox = new JCheckBox(Messages.getString("OptionWizard.48")); //$NON-NLS-1$ - openInSeparateWindowCheckbox.setSelected( - Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BALLOON_IN_BROWSER))); - propertyToComponent.put(EarthProperty.OPEN_BALLOON_IN_BROWSER, - new JComponent[] { openInSeparateWindowCheckbox }); - - final JFilePicker csvWithPlotData = new JFilePicker(Messages.getString("OptionWizard.49"), //$NON-NLS-1$ - localPropertiesService.getValue(EarthProperty.SAMPLE_FILE), Messages.getString("OptionWizard.50"), DlgMode.MODE_OPEN); // $NON-NLS-1$ - - csvWithPlotData.addFileTypeFilter(".csv,.ced", Messages.getString("OptionWizard.52"), true); //$NON-NLS-1$ //$NON-NLS-2$ - propertyToComponent.put(EarthProperty.SAMPLE_FILE, new JComponent[] { csvWithPlotData }); - - final JComboBox plotShape = new JComboBox<>(SAMPLE_SHAPE.values()); - try { - plotShape.setSelectedItem(SAMPLE_SHAPE.valueOf(localPropertiesService.getValue(EarthProperty.SAMPLE_SHAPE))); - } catch (Exception e1) { - logger.error("The selected shape type is not supported " + localPropertiesService.getValue(EarthProperty.SAMPLE_SHAPE), e1 ); + private String[] getKeyAttributesName() { + List keyAttributeDefinitions = survey.getSchema().getRootEntityDefinitions().get(0) + .getKeyAttributeDefinitions(); + String[] keyAttributeNames = new String[keyAttributeDefinitions.size()]; + int i = 0; + for (AttributeDefinition keyAttributeDefinition : keyAttributeDefinitions) { + keyAttributeNames[i++] = keyAttributeDefinition.getName(); } - propertyToComponent.put(EarthProperty.SAMPLE_SHAPE, new JComponent[] { plotShape }); - - final JComboBox comboNumberOfPoints = new JComboBox<>( - new ComboBoxItem[] { COMBO_BOX_ITEM_SQUARE, COMBO_BOX_ITEM_CENTRAL_POINT, new ComboBoxItem(4, "2x2"), //$NON-NLS-1$ //$NON-NLS-2$ - // //$NON-NLS-3$ - new ComboBoxItem(9, "3x3"), new ComboBoxItem(16, "4x4"), new ComboBoxItem(25, "5x5"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - new ComboBoxItem(36, "6x6"), //$NON-NLS-1$ - new ComboBoxItem(49, "7x7") }); //$NON-NLS-1$ - if( StringUtils.isNotBlank( localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT) ) ){ - try { - comboNumberOfPoints.setSelectedItem(new ComboBoxItem( - Integer.parseInt(localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT)), - "")); //$NON-NLS-1$ - } catch (NumberFormatException e1) { - logger.error("This should be a number {}", localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT), e1); - } - } - propertyToComponent.put(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT, - new JComponent[] { comboNumberOfPoints }); - - final String[] listOfNumbers = new String[1500]; - final String[] listOfNumbersFromTwo = new String[1500]; - - for (int index = 0; index < listOfNumbers.length; index++) { - listOfNumbers[index] = Integer.toString( index ); //$NON-NLS-1$ - listOfNumbersFromTwo[index] = Integer.toString( index + 2 ); //$NON-NLS-1$ - } - - final JComboBox listOfDistanceBetweenPoints = new JComboBox<>(listOfNumbersFromTwo); - listOfDistanceBetweenPoints - .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS)); - listOfDistanceBetweenPoints.setAutoscrolls(true); - - propertyToComponent.put(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS, - new JComponent[] { listOfDistanceBetweenPoints }); - - final JComboBox listOfDistanceBetweenPlots = new JComboBox<>(listOfNumbersFromTwo); - listOfDistanceBetweenPlots - .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS)); - listOfDistanceBetweenPlots.setAutoscrolls(true); - - propertyToComponent.put(EarthProperty.DISTANCE_BETWEEN_PLOTS, new JComponent[] { listOfDistanceBetweenPlots }); - - final JComboBox listOfDistanceToBorder = new JComboBox<>(listOfNumbers); - listOfDistanceToBorder - .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES)); - listOfDistanceToBorder.setAutoscrolls(true); - - propertyToComponent.put(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES, new JComponent[] { listOfDistanceToBorder }); - - final JComboBox listOfSizeofSamplingDot = new JComboBox<>(listOfNumbersFromTwo); - listOfSizeofSamplingDot.setSelectedItem(localPropertiesService.getValue(EarthProperty.INNER_SUBPLOT_SIDE)); - listOfSizeofSamplingDot.setAutoscrolls(true); - - propertyToComponent.put(EarthProperty.INNER_SUBPLOT_SIDE, new JComponent[] { listOfSizeofSamplingDot }); - - final JComboBox listOfSideOflargeCentralPlot = new JComboBox<>(listOfNumbersFromTwo); - listOfSideOflargeCentralPlot.setSelectedItem(localPropertiesService.getValue(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)); - listOfSideOflargeCentralPlot.setAutoscrolls(true); - - propertyToComponent.put(EarthProperty.LARGE_CENTRAL_PLOT_SIDE, new JComponent[] { listOfSideOflargeCentralPlot }); - - - final JRadioButton chromeChooser = new JRadioButton("Chrome"); //$NON-NLS-1$ - chromeChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() - .equals(EarthConstants.CHROME_BROWSER)); - chromeChooser.setName(EarthConstants.CHROME_BROWSER); + return keyAttributeNames; + } - final JRadioButton firefoxChooser = new JRadioButton("Firefox"); //$NON-NLS-1$ - firefoxChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() - .equals(EarthConstants.FIREFOX_BROWSER)); - firefoxChooser.setName(EarthConstants.FIREFOX_BROWSER); + private JFilePicker getCsvFilePicker() { + if (filePicker == null) { + filePicker = new JFilePicker("Choose the CSV file containing the IDs of the plots to remove", null, + "Explore", DlgMode.MODE_OPEN); - final JRadioButton edgeChooser = new JRadioButton("Edge"); //$NON-NLS-1$ - edgeChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() - .equals(EarthConstants.EDGE_BROWSER)); - edgeChooser.setName(EarthConstants.EDGE_BROWSER); + filePicker.getFileChooser().setAcceptAllFileFilterUsed(false); + filePicker.addFileTypeFilter("csv", " CSV file with plot IDs", true); - propertyToComponent.put(EarthProperty.BROWSER_TO_USE, new JComponent[] { firefoxChooser, chromeChooser, edgeChooser}); - final JFilePicker saikuPath = new JFilePicker(Messages.getString("OptionWizard.65"), //$NON-NLS-1$ - localPropertiesService.getValue(EarthProperty.SAIKU_SERVER_FOLDER), - Messages.getString("OptionWizard.66"), DlgMode.MODE_OPEN); //$NON-NLS-1$ - saikuPath.setFolderChooser(); - saikuPath.addChangeListener(new DocumentListener() { + filePicker.addChangeListener(new DocumentListener() { - private void showSaikuWarning() { - final File saikuFolder = new File(saikuPath.getSelectedFilePath()); - if ( !saikuService.isSaikuFolder(saikuFolder)) { - JOptionPane.showMessageDialog(PropertiesDialog.this, Messages.getString("OptionWizard.27"), //$NON-NLS-1$ - Messages.getString("OptionWizard.28"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ - saikuPath.getTextField().setBackground(CollectEarthWindow.ERROR_COLOR); - } else { - saikuPath.getTextField().setBackground(Color.white); + @Override + public void removeUpdate(DocumentEvent e) { + // Do not react } - } - - @Override - public void removeUpdate(DocumentEvent e) { - // Do not react - } - - @Override - public void insertUpdate(DocumentEvent e) { - showSaikuWarning(); - } - - @Override - public void changedUpdate(DocumentEvent e) { - // Do not react - } - }); - propertyToComponent.put(EarthProperty.SAIKU_SERVER_FOLDER, new JComponent[] { saikuPath }); - - final JFilePicker kmlTemplatePath = new JFilePicker(Messages.getString("OptionWizard.79"), //$NON-NLS-1$ - localPropertiesService.getValue(EarthProperty.KML_TEMPLATE_KEY), Messages.getString("OptionWizard.80"), //$NON-NLS-1$ - DlgMode.MODE_OPEN); - kmlTemplatePath.addFileTypeFilter(".fmt", Messages.getString("OptionWizard.82"), true); //$NON-NLS-1$ //$NON-NLS-2$ - propertyToComponent.put(EarthProperty.KML_TEMPLATE_KEY, new JComponent[] { kmlTemplatePath }); - - final JFilePicker htmlBalloonPath = new JFilePicker(Messages.getString("OptionWizard.83"), //$NON-NLS-1$ - localPropertiesService.getValue(EarthProperty.BALLOON_TEMPLATE_KEY), - Messages.getString("OptionWizard.84"), DlgMode.MODE_OPEN); //$NON-NLS-1$ - htmlBalloonPath.addFileTypeFilter(".html,.htm", Messages.getString("OptionWizard.86"), true); //$NON-NLS-1$ //$NON-NLS-2$ - propertyToComponent.put(EarthProperty.BALLOON_TEMPLATE_KEY, new JComponent[] { htmlBalloonPath }); - - final JFilePicker idmPath = new JFilePicker(Messages.getString("OptionWizard.87"), //$NON-NLS-1$ - localPropertiesService.getImdFile(), Messages.getString("OptionWizard.88"), DlgMode.MODE_OPEN); //$NON-NLS-1$ - idmPath.addFileTypeFilter(".xml", Messages.getString("OptionWizard.90"), true); //$NON-NLS-1$ //$NON-NLS-2$ - propertyToComponent.put(EarthProperty.METADATA_FILE, new JComponent[] { idmPath }); - - final JTextField surveyNameTextField = new JTextField( - localPropertiesService.getValue(EarthProperty.SURVEY_NAME)); - surveyNameTextField.setEnabled(false); - propertyToComponent.put(EarthProperty.SURVEY_NAME, new JComponent[] { surveyNameTextField }); - - // Database options - final JRadioButton instanceTypeServer = new JRadioButton(Messages.getString("OptionWizard.91")); //$NON-NLS-1$ - instanceTypeServer.setSelected(localPropertiesService.getOperationMode().equals(OperationMode.SERVER_MODE)); - instanceTypeServer.setName(EarthConstants.OperationMode.SERVER_MODE.name()); - - final JRadioButton instanceTypeClient = new JRadioButton(Messages.getString("OptionWizard.92")); //$NON-NLS-1$ - instanceTypeClient.setSelected(localPropertiesService.getOperationMode().equals(OperationMode.CLIENT_MODE)); - instanceTypeClient.setName(EarthConstants.OperationMode.CLIENT_MODE.name()); - propertyToComponent.put(EarthProperty.OPERATION_MODE, - new JComponent[] { instanceTypeServer, instanceTypeClient }); - - final JTextField collectEarthServerIp = new JTextField(localPropertiesService.getValue(EarthProperty.HOST_KEY)); - propertyToComponent.put(EarthProperty.HOST_KEY, new JComponent[] { collectEarthServerIp }); - - final JTextField collectEarthServerIpPort = new JTextField(localPropertiesService.getPort()); - final JTextField collectEarthServerLocalPort = new JTextField( - localPropertiesService.getValue(EarthProperty.HOST_PORT_KEY)); - propertyToComponent.put(EarthProperty.HOST_PORT_KEY, - new JComponent[] { collectEarthServerIpPort, collectEarthServerLocalPort }); - - final JRadioButton sqliteDbType = new JRadioButton(Messages.getString("OptionWizard.93")); //$NON-NLS-1$ - sqliteDbType.setSelected(localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.SQLITE)); - sqliteDbType.setName(CollectDBDriver.SQLITE.name()); - - final JRadioButton postgresDbType = new JRadioButton(Messages.getString("OptionWizard.94")); //$NON-NLS-1$ - boolean usingPostgreSQL = localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.POSTGRESQL); - postgresDbType.setSelected(usingPostgreSQL); - postgresDbType.setName(CollectDBDriver.POSTGRESQL.name()); - propertyToComponent.put(EarthProperty.DB_DRIVER, new JComponent[] { sqliteDbType, postgresDbType }); - - final JTextField dbUserName = new JTextField(localPropertiesService.getValue(EarthProperty.DB_USERNAME)); - propertyToComponent.put(EarthProperty.DB_USERNAME, new JComponent[] { dbUserName }); - - final JTextField dbPassword = new JTextField(localPropertiesService.getValue(EarthProperty.DB_PASSWORD)); - propertyToComponent.put(EarthProperty.DB_PASSWORD, new JComponent[] { dbPassword }); - - final JTextField dbName = new JTextField(localPropertiesService.getValue(EarthProperty.DB_NAME)); - propertyToComponent.put(EarthProperty.DB_NAME, new JComponent[] { dbName }); - - final JTextField dbHost = new JTextField(localPropertiesService.getValue(EarthProperty.DB_HOST)); - propertyToComponent.put(EarthProperty.DB_HOST, new JComponent[] { dbHost }); - - final JTextField dbPort = new JTextField(localPropertiesService.getValue(EarthProperty.DB_PORT)); - propertyToComponent.put(EarthProperty.DB_PORT, new JComponent[] { dbPort }); - - } - - public boolean isRestartRequired() { - return restartRequired; - } + @Override + public void insertUpdate(DocumentEvent e) { + validateCsv(filePicker.getTextField().getText()); + } - public void setRestartRequired(boolean restartRequired) { - this.restartRequired = restartRequired; + @Override + public void changedUpdate(DocumentEvent e) { + validateCsv(filePicker.getTextField().getText()); + } + }); + } + return filePicker; } } From c062423cd2386db02cf8ba286f24b172c5398203 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:24 +0100 Subject: [PATCH 0389/1620] New translations SaikuAnalysisListener.java (French) --- .../earth/app/view/Messages_fr.properties | 337 ++---------------- 1 file changed, 37 insertions(+), 300 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index eb9b80be90..29c9a75479 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,326 +1,63 @@ package org.openforis.collect.earth.app.view; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Frame; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JEditorPane; -import javax.swing.JLabel; +import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.SwingUtilities; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.collect.manager.RecordManager; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectSurvey; -import org.openforis.collect.persistence.RecordPersistenceException; -import org.openforis.idm.metamodel.AttributeDefinition; +import org.openforis.collect.earth.app.service.ExportType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; -import com.opencsv.CSVReader; +public class SaikuAnalysisListener implements ActionListener { + private Logger logger = LoggerFactory.getLogger( SaikuAnalysisListener.class); + protected JFrame frame; + protected GenerateDatabaseStarter saikuStarter; -@Component -@Lazy -public class RemovePlotsFromDBDlg { - - @Autowired - private RecordManager recordManager; - - @Autowired - private EarthSurveyService earthSurveyService; - - @SuppressWarnings("unused") - private static final long serialVersionUID = 5175096170385736616L; - private CollectSurvey survey; - private Logger logger = LoggerFactory.getLogger(RemovePlotsFromDBDlg.class); - - private JButton deleteFromDB; - private JFilePicker filePicker; - - private JDialog dlg; - - public RemovePlotsFromDBDlg() { - super(); - } - - private class DeleteResults { - private boolean success; - private Integer plotsDeleted; - private Integer plotsNotFoundInDB; - private Integer plotsErrorWhenDeleting; - private List messages; - - public DeleteResults(boolean success, Integer plotsDeleted, Integer plotsNotFoundInDB, - Integer plotsErrorWhenDeleting, List messages) { - super(); - this.success = success; - this.plotsDeleted = plotsDeleted; - this.plotsNotFoundInDB = plotsNotFoundInDB; - this.plotsErrorWhenDeleting = plotsErrorWhenDeleting; - this.messages = messages; - } - - } - - public void open(Frame owner, CollectSurvey survey) { - this.dlg = new JDialog(owner); - this.survey = survey; - this.dlg.setModal(true); - this.dlg.setSize(new Dimension(700, 350)); - this.dlg.setLocationRelativeTo(owner); - this.dlg.setTitle("Tool for removing plots from DB using a CSV with plot IDs"); - initLayout(); - dlg.setVisible(true); + public SaikuAnalysisListener(JFrame frame, GenerateDatabaseStarter saikuStarter) { + this.frame = frame; + this.saikuStarter = saikuStarter; } - private void initLayout() { - final JPanel panel = new JPanel(new GridBagLayout()); - GridBagConstraints c = new GridBagConstraints(); - - int row = 0; - c.fill = GridBagConstraints.BOTH; - - c.gridx = 0; - c.gridwidth = 2; - panel.add(new JLabel("" - + "This utility deletes plots that are already collected and present in the Collect Earth Database.
" - + "Make sure to backup the data in your DB before attempting to delete plots ( use the Tools->Data Import/Export->Export data to Collect Backup function)." - + "
" - + "The next field expects a CSV file for which the IDs of the plots to be deleted are present.The headers of the columns should be the names of the key attributes of the survey (usually just one, called ID, but it could be more)." - + ""), c); - c.gridy = row++; - - c.gridx = 0; - c.gridwidth = 2; - c.gridy = row++; - panel.add(getCsvFilePicker(), c); - c.gridy = row; - - panel.add(getDeleteButton(), c); - this.dlg.add(panel); - } - - private JButton getDeleteButton() { - if (deleteFromDB == null) { - deleteFromDB = new JButton("Delete plots with IDs in the CSV from the database"); - deleteFromDB.setEnabled(false); - deleteFromDB.addActionListener( e -> { - if (JOptionPane.showConfirmDialog(RemovePlotsFromDBDlg.this.dlg, - "Are you sure you want to remove the plots with the IDs that are specified in the CSV file??", - "Confirm deletion of plots in DB", JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) { - deletePlotsFromDB(); - } - }); - } - return deleteFromDB; - } - - private boolean validateCsv(String filePath) { - boolean validFile = true; - - try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(filePath, false) ){ - - filePicker.setTextBackground(Color.white); - - if (CsvReaderUtils.isCsvFile(filePath)) { - - // Get the first line - String[] csvHeaders = csvReader.readNext(); - String[] expectedHeaders = getKeyAttributesName(); - if (!Arrays.equals(expectedHeaders, csvHeaders)) { - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, - String.format("The Headers of the CSV file used should be %s, instead they are %s", - Arrays.toString(expectedHeaders), - StringUtils.abbreviate(Arrays.toString(csvHeaders), 35))); - filePicker.setTextBackground(Color.red); - validFile = false; - } + @Override + public void actionPerformed(ActionEvent e) { + try { - } else { - - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, - String.format("The file in %s is NOT A CSV file ", filePath)); - validFile = false; - filePicker.setTextBackground(Color.red); - } - } catch (Exception e) { - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, - String.format("Error opening file at %s. %s ", filePath, e.getMessage())); - logger.error("Error while validating the CSV file", e); - validFile = false; + CollectEarthWindow.startWaiting(frame); + exportDataToRDB( true ); + }catch (Exception e1) { + logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ + } finally{ + CollectEarthWindow.endWaiting(frame); } - - getDeleteButton().setEnabled(validFile); - return validFile; } - private void deletePlotsFromDB() { - InfiniteProgressMonitor progressDeletion = new InfiniteProgressMonitor(this.dlg, "Deleting plots", - "Wait while the plots are deleted from the database"); - - Thread treadDeleting = new Thread("Deleting plots from Database") { - int plotsDeleted = 0; - int plotsNotFoundInDB = 0; - int plotsCouldNotBeDeleted = 0; - boolean success = true; - ArrayList messages = new ArrayList<>(); - - @Override - public void run() { - try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(getCsvFilePicker().getSelectedFilePath(), false) ){ - List allLines = csvReader.readAll(); - int totalLines = allLines.size() - 1; - boolean skipFirst = true; - int plot = 0; - progressDeletion.showLater(); - for (String[] csvRow : allLines) { - - if (skipFirst) { - skipFirst = false; - continue; - } - - progressDeletion.updateProgress(++plot, totalLines); - - CollectRecord record = earthSurveyService.loadRecord(csvRow); - if (record == null) { - plotsNotFoundInDB++; - messages.add(String.format(" Could not find plot with ID %s in the Database", - Arrays.toString(csvRow))); - } else { - deleteRecord(csvRow, record); - } - } - - } catch (Exception e) { - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, - "Error reading CSV file or CSV File too big!"); - logger.error("Error while validating the CSV file", e); - success = false; - } finally { - - if (progressDeletion != null) { - progressDeletion.close(); - } - - } - - DeleteResults deleteResults = new DeleteResults(success, plotsDeleted, plotsNotFoundInDB, - plotsCouldNotBeDeleted, messages); - String result = "Plots Deleted : " + deleteResults.plotsDeleted + "
" + - "Plots Not Found :
" + deleteResults.plotsNotFoundInDB + "
" - + "Plots that could not be deleted because a exception : " + deleteResults.plotsErrorWhenDeleting + "
" + - " Messages :
" + StringUtils.join(deleteResults.messages, "
"); - if( success ) { - result = "" - + "Results of the deletion process:
" - + result + ""; - }else { - result = "" - + "There was an error while deleting the plots. Review the Collect Earth Log file in the Help menu.
" - + result + ""; - } - + protected void exportDataToRDB(boolean startSaikuAfterDBExport) { + if( saikuStarter.isStarting() ){ + JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.57"), Messages.getString("CollectEarthWindow.58"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ + }else{ - JEditorPane web = new JEditorPane(); - web.setEditable(false); - web.setContentType("text/html"); - web.setText(result); + int shouldRefreshDb = JOptionPane.YES_OPTION; + if( saikuStarter.shouldShowRdbGenerationOption( ExportType.SAIKU ) ){ - JScrollPane scrollPane = new JScrollPane(web); - scrollPane.setPreferredSize( new Dimension( 450, 350 )); + String refresh = Messages.getString("SaikuAnalysisListener.0"); //$NON-NLS-1$ + String close = Messages.getString("SaikuAnalysisListener.1"); //$NON-NLS-1$ + String[] options = new String[]{ refresh,close}; - // Refresh contents of Google Earth! - EarthApp.executeKmlLoadAsynchronously( null ); - SwingUtilities.invokeLater( () -> { - if (deleteResults.success) { - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, scrollPane, "Success deleting plots", JOptionPane.INFORMATION_MESSAGE); - } else { - - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, scrollPane, "Error deleting plots", JOptionPane.WARNING_MESSAGE); - } - }); + shouldRefreshDb = JOptionPane.showOptionDialog( + frame, Messages.getString("CollectEarthWindow.59"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.60"), //$NON-NLS-1$ + JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); } - private void deleteRecord(String[] csvRow, CollectRecord record) { - try { - recordManager.delete(record.getId()); - messages.add(String.format("Deleted plot with ID %s ", Arrays.toString(csvRow))); - plotsDeleted++; - } catch (RecordPersistenceException e) { - plotsCouldNotBeDeleted++; - messages.add(String.format("Error when deleting plot with ID %s. Error Message: %s", - Arrays.toString(csvRow), e.getMessage())); - logger.error("Error deleting plot with ID " + Arrays.toString(csvRow)); - success = false; - } + if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ + saikuStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); + saikuStarter.initializeAndOpen( startSaikuAfterDBExport); } - }; - - treadDeleting.start(); - - } - - private String[] getKeyAttributesName() { - List keyAttributeDefinitions = survey.getSchema().getRootEntityDefinitions().get(0) - .getKeyAttributeDefinitions(); - String[] keyAttributeNames = new String[keyAttributeDefinitions.size()]; - int i = 0; - for (AttributeDefinition keyAttributeDefinition : keyAttributeDefinitions) { - keyAttributeNames[i++] = keyAttributeDefinition.getName(); - } - return keyAttributeNames; - } - - private JFilePicker getCsvFilePicker() { - if (filePicker == null) { - filePicker = new JFilePicker("Choose the CSV file containing the IDs of the plots to remove", null, - "Explore", DlgMode.MODE_OPEN); - - filePicker.getFileChooser().setAcceptAllFileFilterUsed(false); - filePicker.addFileTypeFilter("csv", " CSV file with plot IDs", true); - - filePicker.addChangeListener(new DocumentListener() { - - @Override - public void removeUpdate(DocumentEvent e) { - // Do not react - } - - @Override - public void insertUpdate(DocumentEvent e) { - validateCsv(filePicker.getTextField().getText()); - } - - @Override - public void changedUpdate(DocumentEvent e) { - validateCsv(filePicker.getTextField().getText()); - } - }); } - return filePicker; } -} +} \ No newline at end of file From cc4fd5b572d0f4ec7b0e4318deef090a78b9a3f1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:25 +0100 Subject: [PATCH 0390/1620] New translations SaikuAnalysisListener.java (Spanish) --- .../earth/app/view/Messages_es.properties | 337 ++---------------- 1 file changed, 37 insertions(+), 300 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index eb9b80be90..29c9a75479 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,326 +1,63 @@ package org.openforis.collect.earth.app.view; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Frame; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JEditorPane; -import javax.swing.JLabel; +import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.SwingUtilities; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.collect.manager.RecordManager; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectSurvey; -import org.openforis.collect.persistence.RecordPersistenceException; -import org.openforis.idm.metamodel.AttributeDefinition; +import org.openforis.collect.earth.app.service.ExportType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; -import com.opencsv.CSVReader; +public class SaikuAnalysisListener implements ActionListener { + private Logger logger = LoggerFactory.getLogger( SaikuAnalysisListener.class); + protected JFrame frame; + protected GenerateDatabaseStarter saikuStarter; -@Component -@Lazy -public class RemovePlotsFromDBDlg { - - @Autowired - private RecordManager recordManager; - - @Autowired - private EarthSurveyService earthSurveyService; - - @SuppressWarnings("unused") - private static final long serialVersionUID = 5175096170385736616L; - private CollectSurvey survey; - private Logger logger = LoggerFactory.getLogger(RemovePlotsFromDBDlg.class); - - private JButton deleteFromDB; - private JFilePicker filePicker; - - private JDialog dlg; - - public RemovePlotsFromDBDlg() { - super(); - } - - private class DeleteResults { - private boolean success; - private Integer plotsDeleted; - private Integer plotsNotFoundInDB; - private Integer plotsErrorWhenDeleting; - private List messages; - - public DeleteResults(boolean success, Integer plotsDeleted, Integer plotsNotFoundInDB, - Integer plotsErrorWhenDeleting, List messages) { - super(); - this.success = success; - this.plotsDeleted = plotsDeleted; - this.plotsNotFoundInDB = plotsNotFoundInDB; - this.plotsErrorWhenDeleting = plotsErrorWhenDeleting; - this.messages = messages; - } - - } - - public void open(Frame owner, CollectSurvey survey) { - this.dlg = new JDialog(owner); - this.survey = survey; - this.dlg.setModal(true); - this.dlg.setSize(new Dimension(700, 350)); - this.dlg.setLocationRelativeTo(owner); - this.dlg.setTitle("Tool for removing plots from DB using a CSV with plot IDs"); - initLayout(); - dlg.setVisible(true); + public SaikuAnalysisListener(JFrame frame, GenerateDatabaseStarter saikuStarter) { + this.frame = frame; + this.saikuStarter = saikuStarter; } - private void initLayout() { - final JPanel panel = new JPanel(new GridBagLayout()); - GridBagConstraints c = new GridBagConstraints(); - - int row = 0; - c.fill = GridBagConstraints.BOTH; - - c.gridx = 0; - c.gridwidth = 2; - panel.add(new JLabel("" - + "This utility deletes plots that are already collected and present in the Collect Earth Database.
" - + "Make sure to backup the data in your DB before attempting to delete plots ( use the Tools->Data Import/Export->Export data to Collect Backup function)." - + "
" - + "The next field expects a CSV file for which the IDs of the plots to be deleted are present.The headers of the columns should be the names of the key attributes of the survey (usually just one, called ID, but it could be more)." - + ""), c); - c.gridy = row++; - - c.gridx = 0; - c.gridwidth = 2; - c.gridy = row++; - panel.add(getCsvFilePicker(), c); - c.gridy = row; - - panel.add(getDeleteButton(), c); - this.dlg.add(panel); - } - - private JButton getDeleteButton() { - if (deleteFromDB == null) { - deleteFromDB = new JButton("Delete plots with IDs in the CSV from the database"); - deleteFromDB.setEnabled(false); - deleteFromDB.addActionListener( e -> { - if (JOptionPane.showConfirmDialog(RemovePlotsFromDBDlg.this.dlg, - "Are you sure you want to remove the plots with the IDs that are specified in the CSV file??", - "Confirm deletion of plots in DB", JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) { - deletePlotsFromDB(); - } - }); - } - return deleteFromDB; - } - - private boolean validateCsv(String filePath) { - boolean validFile = true; - - try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(filePath, false) ){ - - filePicker.setTextBackground(Color.white); - - if (CsvReaderUtils.isCsvFile(filePath)) { - - // Get the first line - String[] csvHeaders = csvReader.readNext(); - String[] expectedHeaders = getKeyAttributesName(); - if (!Arrays.equals(expectedHeaders, csvHeaders)) { - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, - String.format("The Headers of the CSV file used should be %s, instead they are %s", - Arrays.toString(expectedHeaders), - StringUtils.abbreviate(Arrays.toString(csvHeaders), 35))); - filePicker.setTextBackground(Color.red); - validFile = false; - } + @Override + public void actionPerformed(ActionEvent e) { + try { - } else { - - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, - String.format("The file in %s is NOT A CSV file ", filePath)); - validFile = false; - filePicker.setTextBackground(Color.red); - } - } catch (Exception e) { - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, - String.format("Error opening file at %s. %s ", filePath, e.getMessage())); - logger.error("Error while validating the CSV file", e); - validFile = false; + CollectEarthWindow.startWaiting(frame); + exportDataToRDB( true ); + }catch (Exception e1) { + logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ + } finally{ + CollectEarthWindow.endWaiting(frame); } - - getDeleteButton().setEnabled(validFile); - return validFile; } - private void deletePlotsFromDB() { - InfiniteProgressMonitor progressDeletion = new InfiniteProgressMonitor(this.dlg, "Deleting plots", - "Wait while the plots are deleted from the database"); - - Thread treadDeleting = new Thread("Deleting plots from Database") { - int plotsDeleted = 0; - int plotsNotFoundInDB = 0; - int plotsCouldNotBeDeleted = 0; - boolean success = true; - ArrayList messages = new ArrayList<>(); - - @Override - public void run() { - try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(getCsvFilePicker().getSelectedFilePath(), false) ){ - List allLines = csvReader.readAll(); - int totalLines = allLines.size() - 1; - boolean skipFirst = true; - int plot = 0; - progressDeletion.showLater(); - for (String[] csvRow : allLines) { - - if (skipFirst) { - skipFirst = false; - continue; - } - - progressDeletion.updateProgress(++plot, totalLines); - - CollectRecord record = earthSurveyService.loadRecord(csvRow); - if (record == null) { - plotsNotFoundInDB++; - messages.add(String.format(" Could not find plot with ID %s in the Database", - Arrays.toString(csvRow))); - } else { - deleteRecord(csvRow, record); - } - } - - } catch (Exception e) { - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, - "Error reading CSV file or CSV File too big!"); - logger.error("Error while validating the CSV file", e); - success = false; - } finally { - - if (progressDeletion != null) { - progressDeletion.close(); - } - - } - - DeleteResults deleteResults = new DeleteResults(success, plotsDeleted, plotsNotFoundInDB, - plotsCouldNotBeDeleted, messages); - String result = "Plots Deleted : " + deleteResults.plotsDeleted + "
" + - "Plots Not Found :
" + deleteResults.plotsNotFoundInDB + "
" - + "Plots that could not be deleted because a exception : " + deleteResults.plotsErrorWhenDeleting + "
" + - " Messages :
" + StringUtils.join(deleteResults.messages, "
"); - if( success ) { - result = "" - + "Results of the deletion process:
" - + result + ""; - }else { - result = "" - + "There was an error while deleting the plots. Review the Collect Earth Log file in the Help menu.
" - + result + ""; - } - + protected void exportDataToRDB(boolean startSaikuAfterDBExport) { + if( saikuStarter.isStarting() ){ + JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.57"), Messages.getString("CollectEarthWindow.58"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ + }else{ - JEditorPane web = new JEditorPane(); - web.setEditable(false); - web.setContentType("text/html"); - web.setText(result); + int shouldRefreshDb = JOptionPane.YES_OPTION; + if( saikuStarter.shouldShowRdbGenerationOption( ExportType.SAIKU ) ){ - JScrollPane scrollPane = new JScrollPane(web); - scrollPane.setPreferredSize( new Dimension( 450, 350 )); + String refresh = Messages.getString("SaikuAnalysisListener.0"); //$NON-NLS-1$ + String close = Messages.getString("SaikuAnalysisListener.1"); //$NON-NLS-1$ + String[] options = new String[]{ refresh,close}; - // Refresh contents of Google Earth! - EarthApp.executeKmlLoadAsynchronously( null ); - SwingUtilities.invokeLater( () -> { - if (deleteResults.success) { - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, scrollPane, "Success deleting plots", JOptionPane.INFORMATION_MESSAGE); - } else { - - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, scrollPane, "Error deleting plots", JOptionPane.WARNING_MESSAGE); - } - }); + shouldRefreshDb = JOptionPane.showOptionDialog( + frame, Messages.getString("CollectEarthWindow.59"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.60"), //$NON-NLS-1$ + JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); } - private void deleteRecord(String[] csvRow, CollectRecord record) { - try { - recordManager.delete(record.getId()); - messages.add(String.format("Deleted plot with ID %s ", Arrays.toString(csvRow))); - plotsDeleted++; - } catch (RecordPersistenceException e) { - plotsCouldNotBeDeleted++; - messages.add(String.format("Error when deleting plot with ID %s. Error Message: %s", - Arrays.toString(csvRow), e.getMessage())); - logger.error("Error deleting plot with ID " + Arrays.toString(csvRow)); - success = false; - } + if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ + saikuStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); + saikuStarter.initializeAndOpen( startSaikuAfterDBExport); } - }; - - treadDeleting.start(); - - } - - private String[] getKeyAttributesName() { - List keyAttributeDefinitions = survey.getSchema().getRootEntityDefinitions().get(0) - .getKeyAttributeDefinitions(); - String[] keyAttributeNames = new String[keyAttributeDefinitions.size()]; - int i = 0; - for (AttributeDefinition keyAttributeDefinition : keyAttributeDefinitions) { - keyAttributeNames[i++] = keyAttributeDefinition.getName(); - } - return keyAttributeNames; - } - - private JFilePicker getCsvFilePicker() { - if (filePicker == null) { - filePicker = new JFilePicker("Choose the CSV file containing the IDs of the plots to remove", null, - "Explore", DlgMode.MODE_OPEN); - - filePicker.getFileChooser().setAcceptAllFileFilterUsed(false); - filePicker.addFileTypeFilter("csv", " CSV file with plot IDs", true); - - filePicker.addChangeListener(new DocumentListener() { - - @Override - public void removeUpdate(DocumentEvent e) { - // Do not react - } - - @Override - public void insertUpdate(DocumentEvent e) { - validateCsv(filePicker.getTextField().getText()); - } - - @Override - public void changedUpdate(DocumentEvent e) { - validateCsv(filePicker.getTextField().getText()); - } - }); } - return filePicker; } -} +} \ No newline at end of file From f12b6260518d27dd73b9dde56bb430f7a20547d7 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:26 +0100 Subject: [PATCH 0391/1620] New translations SaikuAnalysisListener.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 337 ++---------------- 1 file changed, 37 insertions(+), 300 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index eb9b80be90..29c9a75479 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,326 +1,63 @@ package org.openforis.collect.earth.app.view; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Frame; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JEditorPane; -import javax.swing.JLabel; +import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.SwingUtilities; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.collect.manager.RecordManager; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectSurvey; -import org.openforis.collect.persistence.RecordPersistenceException; -import org.openforis.idm.metamodel.AttributeDefinition; +import org.openforis.collect.earth.app.service.ExportType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; -import com.opencsv.CSVReader; +public class SaikuAnalysisListener implements ActionListener { + private Logger logger = LoggerFactory.getLogger( SaikuAnalysisListener.class); + protected JFrame frame; + protected GenerateDatabaseStarter saikuStarter; -@Component -@Lazy -public class RemovePlotsFromDBDlg { - - @Autowired - private RecordManager recordManager; - - @Autowired - private EarthSurveyService earthSurveyService; - - @SuppressWarnings("unused") - private static final long serialVersionUID = 5175096170385736616L; - private CollectSurvey survey; - private Logger logger = LoggerFactory.getLogger(RemovePlotsFromDBDlg.class); - - private JButton deleteFromDB; - private JFilePicker filePicker; - - private JDialog dlg; - - public RemovePlotsFromDBDlg() { - super(); - } - - private class DeleteResults { - private boolean success; - private Integer plotsDeleted; - private Integer plotsNotFoundInDB; - private Integer plotsErrorWhenDeleting; - private List messages; - - public DeleteResults(boolean success, Integer plotsDeleted, Integer plotsNotFoundInDB, - Integer plotsErrorWhenDeleting, List messages) { - super(); - this.success = success; - this.plotsDeleted = plotsDeleted; - this.plotsNotFoundInDB = plotsNotFoundInDB; - this.plotsErrorWhenDeleting = plotsErrorWhenDeleting; - this.messages = messages; - } - - } - - public void open(Frame owner, CollectSurvey survey) { - this.dlg = new JDialog(owner); - this.survey = survey; - this.dlg.setModal(true); - this.dlg.setSize(new Dimension(700, 350)); - this.dlg.setLocationRelativeTo(owner); - this.dlg.setTitle("Tool for removing plots from DB using a CSV with plot IDs"); - initLayout(); - dlg.setVisible(true); + public SaikuAnalysisListener(JFrame frame, GenerateDatabaseStarter saikuStarter) { + this.frame = frame; + this.saikuStarter = saikuStarter; } - private void initLayout() { - final JPanel panel = new JPanel(new GridBagLayout()); - GridBagConstraints c = new GridBagConstraints(); - - int row = 0; - c.fill = GridBagConstraints.BOTH; - - c.gridx = 0; - c.gridwidth = 2; - panel.add(new JLabel("" - + "This utility deletes plots that are already collected and present in the Collect Earth Database.
" - + "Make sure to backup the data in your DB before attempting to delete plots ( use the Tools->Data Import/Export->Export data to Collect Backup function)." - + "
" - + "The next field expects a CSV file for which the IDs of the plots to be deleted are present.The headers of the columns should be the names of the key attributes of the survey (usually just one, called ID, but it could be more)." - + ""), c); - c.gridy = row++; - - c.gridx = 0; - c.gridwidth = 2; - c.gridy = row++; - panel.add(getCsvFilePicker(), c); - c.gridy = row; - - panel.add(getDeleteButton(), c); - this.dlg.add(panel); - } - - private JButton getDeleteButton() { - if (deleteFromDB == null) { - deleteFromDB = new JButton("Delete plots with IDs in the CSV from the database"); - deleteFromDB.setEnabled(false); - deleteFromDB.addActionListener( e -> { - if (JOptionPane.showConfirmDialog(RemovePlotsFromDBDlg.this.dlg, - "Are you sure you want to remove the plots with the IDs that are specified in the CSV file??", - "Confirm deletion of plots in DB", JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) { - deletePlotsFromDB(); - } - }); - } - return deleteFromDB; - } - - private boolean validateCsv(String filePath) { - boolean validFile = true; - - try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(filePath, false) ){ - - filePicker.setTextBackground(Color.white); - - if (CsvReaderUtils.isCsvFile(filePath)) { - - // Get the first line - String[] csvHeaders = csvReader.readNext(); - String[] expectedHeaders = getKeyAttributesName(); - if (!Arrays.equals(expectedHeaders, csvHeaders)) { - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, - String.format("The Headers of the CSV file used should be %s, instead they are %s", - Arrays.toString(expectedHeaders), - StringUtils.abbreviate(Arrays.toString(csvHeaders), 35))); - filePicker.setTextBackground(Color.red); - validFile = false; - } + @Override + public void actionPerformed(ActionEvent e) { + try { - } else { - - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, - String.format("The file in %s is NOT A CSV file ", filePath)); - validFile = false; - filePicker.setTextBackground(Color.red); - } - } catch (Exception e) { - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, - String.format("Error opening file at %s. %s ", filePath, e.getMessage())); - logger.error("Error while validating the CSV file", e); - validFile = false; + CollectEarthWindow.startWaiting(frame); + exportDataToRDB( true ); + }catch (Exception e1) { + logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ + } finally{ + CollectEarthWindow.endWaiting(frame); } - - getDeleteButton().setEnabled(validFile); - return validFile; } - private void deletePlotsFromDB() { - InfiniteProgressMonitor progressDeletion = new InfiniteProgressMonitor(this.dlg, "Deleting plots", - "Wait while the plots are deleted from the database"); - - Thread treadDeleting = new Thread("Deleting plots from Database") { - int plotsDeleted = 0; - int plotsNotFoundInDB = 0; - int plotsCouldNotBeDeleted = 0; - boolean success = true; - ArrayList messages = new ArrayList<>(); - - @Override - public void run() { - try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(getCsvFilePicker().getSelectedFilePath(), false) ){ - List allLines = csvReader.readAll(); - int totalLines = allLines.size() - 1; - boolean skipFirst = true; - int plot = 0; - progressDeletion.showLater(); - for (String[] csvRow : allLines) { - - if (skipFirst) { - skipFirst = false; - continue; - } - - progressDeletion.updateProgress(++plot, totalLines); - - CollectRecord record = earthSurveyService.loadRecord(csvRow); - if (record == null) { - plotsNotFoundInDB++; - messages.add(String.format(" Could not find plot with ID %s in the Database", - Arrays.toString(csvRow))); - } else { - deleteRecord(csvRow, record); - } - } - - } catch (Exception e) { - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, - "Error reading CSV file or CSV File too big!"); - logger.error("Error while validating the CSV file", e); - success = false; - } finally { - - if (progressDeletion != null) { - progressDeletion.close(); - } - - } - - DeleteResults deleteResults = new DeleteResults(success, plotsDeleted, plotsNotFoundInDB, - plotsCouldNotBeDeleted, messages); - String result = "Plots Deleted : " + deleteResults.plotsDeleted + "
" + - "Plots Not Found :
" + deleteResults.plotsNotFoundInDB + "
" - + "Plots that could not be deleted because a exception : " + deleteResults.plotsErrorWhenDeleting + "
" + - " Messages :
" + StringUtils.join(deleteResults.messages, "
"); - if( success ) { - result = "" - + "Results of the deletion process:
" - + result + ""; - }else { - result = "" - + "There was an error while deleting the plots. Review the Collect Earth Log file in the Help menu.
" - + result + ""; - } - + protected void exportDataToRDB(boolean startSaikuAfterDBExport) { + if( saikuStarter.isStarting() ){ + JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.57"), Messages.getString("CollectEarthWindow.58"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ + }else{ - JEditorPane web = new JEditorPane(); - web.setEditable(false); - web.setContentType("text/html"); - web.setText(result); + int shouldRefreshDb = JOptionPane.YES_OPTION; + if( saikuStarter.shouldShowRdbGenerationOption( ExportType.SAIKU ) ){ - JScrollPane scrollPane = new JScrollPane(web); - scrollPane.setPreferredSize( new Dimension( 450, 350 )); + String refresh = Messages.getString("SaikuAnalysisListener.0"); //$NON-NLS-1$ + String close = Messages.getString("SaikuAnalysisListener.1"); //$NON-NLS-1$ + String[] options = new String[]{ refresh,close}; - // Refresh contents of Google Earth! - EarthApp.executeKmlLoadAsynchronously( null ); - SwingUtilities.invokeLater( () -> { - if (deleteResults.success) { - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, scrollPane, "Success deleting plots", JOptionPane.INFORMATION_MESSAGE); - } else { - - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, scrollPane, "Error deleting plots", JOptionPane.WARNING_MESSAGE); - } - }); + shouldRefreshDb = JOptionPane.showOptionDialog( + frame, Messages.getString("CollectEarthWindow.59"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.60"), //$NON-NLS-1$ + JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); } - private void deleteRecord(String[] csvRow, CollectRecord record) { - try { - recordManager.delete(record.getId()); - messages.add(String.format("Deleted plot with ID %s ", Arrays.toString(csvRow))); - plotsDeleted++; - } catch (RecordPersistenceException e) { - plotsCouldNotBeDeleted++; - messages.add(String.format("Error when deleting plot with ID %s. Error Message: %s", - Arrays.toString(csvRow), e.getMessage())); - logger.error("Error deleting plot with ID " + Arrays.toString(csvRow)); - success = false; - } + if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ + saikuStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); + saikuStarter.initializeAndOpen( startSaikuAfterDBExport); } - }; - - treadDeleting.start(); - - } - - private String[] getKeyAttributesName() { - List keyAttributeDefinitions = survey.getSchema().getRootEntityDefinitions().get(0) - .getKeyAttributeDefinitions(); - String[] keyAttributeNames = new String[keyAttributeDefinitions.size()]; - int i = 0; - for (AttributeDefinition keyAttributeDefinition : keyAttributeDefinitions) { - keyAttributeNames[i++] = keyAttributeDefinition.getName(); - } - return keyAttributeNames; - } - - private JFilePicker getCsvFilePicker() { - if (filePicker == null) { - filePicker = new JFilePicker("Choose the CSV file containing the IDs of the plots to remove", null, - "Explore", DlgMode.MODE_OPEN); - - filePicker.getFileChooser().setAcceptAllFileFilterUsed(false); - filePicker.addFileTypeFilter("csv", " CSV file with plot IDs", true); - - filePicker.addChangeListener(new DocumentListener() { - - @Override - public void removeUpdate(DocumentEvent e) { - // Do not react - } - - @Override - public void insertUpdate(DocumentEvent e) { - validateCsv(filePicker.getTextField().getText()); - } - - @Override - public void changedUpdate(DocumentEvent e) { - validateCsv(filePicker.getTextField().getText()); - } - }); } - return filePicker; } -} +} \ No newline at end of file From 8c019e458be58c76c1da8d8bf2cb1604a5bcb9e8 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:27 +0100 Subject: [PATCH 0392/1620] New translations SaikuAnalysisListener.java (English) --- .../earth/app/view/Messages_en.properties | 337 ++---------------- 1 file changed, 37 insertions(+), 300 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index eb9b80be90..29c9a75479 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,326 +1,63 @@ package org.openforis.collect.earth.app.view; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Frame; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JEditorPane; -import javax.swing.JLabel; +import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.SwingUtilities; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.collect.manager.RecordManager; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectSurvey; -import org.openforis.collect.persistence.RecordPersistenceException; -import org.openforis.idm.metamodel.AttributeDefinition; +import org.openforis.collect.earth.app.service.ExportType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; -import com.opencsv.CSVReader; +public class SaikuAnalysisListener implements ActionListener { + private Logger logger = LoggerFactory.getLogger( SaikuAnalysisListener.class); + protected JFrame frame; + protected GenerateDatabaseStarter saikuStarter; -@Component -@Lazy -public class RemovePlotsFromDBDlg { - - @Autowired - private RecordManager recordManager; - - @Autowired - private EarthSurveyService earthSurveyService; - - @SuppressWarnings("unused") - private static final long serialVersionUID = 5175096170385736616L; - private CollectSurvey survey; - private Logger logger = LoggerFactory.getLogger(RemovePlotsFromDBDlg.class); - - private JButton deleteFromDB; - private JFilePicker filePicker; - - private JDialog dlg; - - public RemovePlotsFromDBDlg() { - super(); - } - - private class DeleteResults { - private boolean success; - private Integer plotsDeleted; - private Integer plotsNotFoundInDB; - private Integer plotsErrorWhenDeleting; - private List messages; - - public DeleteResults(boolean success, Integer plotsDeleted, Integer plotsNotFoundInDB, - Integer plotsErrorWhenDeleting, List messages) { - super(); - this.success = success; - this.plotsDeleted = plotsDeleted; - this.plotsNotFoundInDB = plotsNotFoundInDB; - this.plotsErrorWhenDeleting = plotsErrorWhenDeleting; - this.messages = messages; - } - - } - - public void open(Frame owner, CollectSurvey survey) { - this.dlg = new JDialog(owner); - this.survey = survey; - this.dlg.setModal(true); - this.dlg.setSize(new Dimension(700, 350)); - this.dlg.setLocationRelativeTo(owner); - this.dlg.setTitle("Tool for removing plots from DB using a CSV with plot IDs"); - initLayout(); - dlg.setVisible(true); + public SaikuAnalysisListener(JFrame frame, GenerateDatabaseStarter saikuStarter) { + this.frame = frame; + this.saikuStarter = saikuStarter; } - private void initLayout() { - final JPanel panel = new JPanel(new GridBagLayout()); - GridBagConstraints c = new GridBagConstraints(); - - int row = 0; - c.fill = GridBagConstraints.BOTH; - - c.gridx = 0; - c.gridwidth = 2; - panel.add(new JLabel("" - + "This utility deletes plots that are already collected and present in the Collect Earth Database.
" - + "Make sure to backup the data in your DB before attempting to delete plots ( use the Tools->Data Import/Export->Export data to Collect Backup function)." - + "
" - + "The next field expects a CSV file for which the IDs of the plots to be deleted are present.The headers of the columns should be the names of the key attributes of the survey (usually just one, called ID, but it could be more)." - + ""), c); - c.gridy = row++; - - c.gridx = 0; - c.gridwidth = 2; - c.gridy = row++; - panel.add(getCsvFilePicker(), c); - c.gridy = row; - - panel.add(getDeleteButton(), c); - this.dlg.add(panel); - } - - private JButton getDeleteButton() { - if (deleteFromDB == null) { - deleteFromDB = new JButton("Delete plots with IDs in the CSV from the database"); - deleteFromDB.setEnabled(false); - deleteFromDB.addActionListener( e -> { - if (JOptionPane.showConfirmDialog(RemovePlotsFromDBDlg.this.dlg, - "Are you sure you want to remove the plots with the IDs that are specified in the CSV file??", - "Confirm deletion of plots in DB", JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) { - deletePlotsFromDB(); - } - }); - } - return deleteFromDB; - } - - private boolean validateCsv(String filePath) { - boolean validFile = true; - - try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(filePath, false) ){ - - filePicker.setTextBackground(Color.white); - - if (CsvReaderUtils.isCsvFile(filePath)) { - - // Get the first line - String[] csvHeaders = csvReader.readNext(); - String[] expectedHeaders = getKeyAttributesName(); - if (!Arrays.equals(expectedHeaders, csvHeaders)) { - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, - String.format("The Headers of the CSV file used should be %s, instead they are %s", - Arrays.toString(expectedHeaders), - StringUtils.abbreviate(Arrays.toString(csvHeaders), 35))); - filePicker.setTextBackground(Color.red); - validFile = false; - } + @Override + public void actionPerformed(ActionEvent e) { + try { - } else { - - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, - String.format("The file in %s is NOT A CSV file ", filePath)); - validFile = false; - filePicker.setTextBackground(Color.red); - } - } catch (Exception e) { - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, - String.format("Error opening file at %s. %s ", filePath, e.getMessage())); - logger.error("Error while validating the CSV file", e); - validFile = false; + CollectEarthWindow.startWaiting(frame); + exportDataToRDB( true ); + }catch (Exception e1) { + logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ + } finally{ + CollectEarthWindow.endWaiting(frame); } - - getDeleteButton().setEnabled(validFile); - return validFile; } - private void deletePlotsFromDB() { - InfiniteProgressMonitor progressDeletion = new InfiniteProgressMonitor(this.dlg, "Deleting plots", - "Wait while the plots are deleted from the database"); - - Thread treadDeleting = new Thread("Deleting plots from Database") { - int plotsDeleted = 0; - int plotsNotFoundInDB = 0; - int plotsCouldNotBeDeleted = 0; - boolean success = true; - ArrayList messages = new ArrayList<>(); - - @Override - public void run() { - try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(getCsvFilePicker().getSelectedFilePath(), false) ){ - List allLines = csvReader.readAll(); - int totalLines = allLines.size() - 1; - boolean skipFirst = true; - int plot = 0; - progressDeletion.showLater(); - for (String[] csvRow : allLines) { - - if (skipFirst) { - skipFirst = false; - continue; - } - - progressDeletion.updateProgress(++plot, totalLines); - - CollectRecord record = earthSurveyService.loadRecord(csvRow); - if (record == null) { - plotsNotFoundInDB++; - messages.add(String.format(" Could not find plot with ID %s in the Database", - Arrays.toString(csvRow))); - } else { - deleteRecord(csvRow, record); - } - } - - } catch (Exception e) { - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, - "Error reading CSV file or CSV File too big!"); - logger.error("Error while validating the CSV file", e); - success = false; - } finally { - - if (progressDeletion != null) { - progressDeletion.close(); - } - - } - - DeleteResults deleteResults = new DeleteResults(success, plotsDeleted, plotsNotFoundInDB, - plotsCouldNotBeDeleted, messages); - String result = "Plots Deleted : " + deleteResults.plotsDeleted + "
" + - "Plots Not Found :
" + deleteResults.plotsNotFoundInDB + "
" - + "Plots that could not be deleted because a exception : " + deleteResults.plotsErrorWhenDeleting + "
" + - " Messages :
" + StringUtils.join(deleteResults.messages, "
"); - if( success ) { - result = "" - + "Results of the deletion process:
" - + result + ""; - }else { - result = "" - + "There was an error while deleting the plots. Review the Collect Earth Log file in the Help menu.
" - + result + ""; - } - + protected void exportDataToRDB(boolean startSaikuAfterDBExport) { + if( saikuStarter.isStarting() ){ + JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.57"), Messages.getString("CollectEarthWindow.58"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ + }else{ - JEditorPane web = new JEditorPane(); - web.setEditable(false); - web.setContentType("text/html"); - web.setText(result); + int shouldRefreshDb = JOptionPane.YES_OPTION; + if( saikuStarter.shouldShowRdbGenerationOption( ExportType.SAIKU ) ){ - JScrollPane scrollPane = new JScrollPane(web); - scrollPane.setPreferredSize( new Dimension( 450, 350 )); + String refresh = Messages.getString("SaikuAnalysisListener.0"); //$NON-NLS-1$ + String close = Messages.getString("SaikuAnalysisListener.1"); //$NON-NLS-1$ + String[] options = new String[]{ refresh,close}; - // Refresh contents of Google Earth! - EarthApp.executeKmlLoadAsynchronously( null ); - SwingUtilities.invokeLater( () -> { - if (deleteResults.success) { - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, scrollPane, "Success deleting plots", JOptionPane.INFORMATION_MESSAGE); - } else { - - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, scrollPane, "Error deleting plots", JOptionPane.WARNING_MESSAGE); - } - }); + shouldRefreshDb = JOptionPane.showOptionDialog( + frame, Messages.getString("CollectEarthWindow.59"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.60"), //$NON-NLS-1$ + JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); } - private void deleteRecord(String[] csvRow, CollectRecord record) { - try { - recordManager.delete(record.getId()); - messages.add(String.format("Deleted plot with ID %s ", Arrays.toString(csvRow))); - plotsDeleted++; - } catch (RecordPersistenceException e) { - plotsCouldNotBeDeleted++; - messages.add(String.format("Error when deleting plot with ID %s. Error Message: %s", - Arrays.toString(csvRow), e.getMessage())); - logger.error("Error deleting plot with ID " + Arrays.toString(csvRow)); - success = false; - } + if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ + saikuStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); + saikuStarter.initializeAndOpen( startSaikuAfterDBExport); } - }; - - treadDeleting.start(); - - } - - private String[] getKeyAttributesName() { - List keyAttributeDefinitions = survey.getSchema().getRootEntityDefinitions().get(0) - .getKeyAttributeDefinitions(); - String[] keyAttributeNames = new String[keyAttributeDefinitions.size()]; - int i = 0; - for (AttributeDefinition keyAttributeDefinition : keyAttributeDefinitions) { - keyAttributeNames[i++] = keyAttributeDefinition.getName(); - } - return keyAttributeNames; - } - - private JFilePicker getCsvFilePicker() { - if (filePicker == null) { - filePicker = new JFilePicker("Choose the CSV file containing the IDs of the plots to remove", null, - "Explore", DlgMode.MODE_OPEN); - - filePicker.getFileChooser().setAcceptAllFileFilterUsed(false); - filePicker.addFileTypeFilter("csv", " CSV file with plot IDs", true); - - filePicker.addChangeListener(new DocumentListener() { - - @Override - public void removeUpdate(DocumentEvent e) { - // Do not react - } - - @Override - public void insertUpdate(DocumentEvent e) { - validateCsv(filePicker.getTextField().getText()); - } - - @Override - public void changedUpdate(DocumentEvent e) { - validateCsv(filePicker.getTextField().getText()); - } - }); } - return filePicker; } -} +} \ No newline at end of file From 53179d16affa68d5e8d8294db68c7cb85082b13c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:28 +0100 Subject: [PATCH 0393/1620] New translations SaikuStarter.java (French) --- .../earth/app/view/Messages_fr.properties | 98 +++++++++++-------- 1 file changed, 55 insertions(+), 43 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 29c9a75479..220f8ccd9f 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,63 +1,75 @@ package org.openforis.collect.earth.app.view; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - import javax.swing.JFrame; import javax.swing.JOptionPane; +import org.openforis.collect.earth.app.service.AnalysisSaikuService; import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.SaikuExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class SaikuAnalysisListener implements ActionListener { - private Logger logger = LoggerFactory.getLogger( SaikuAnalysisListener.class); - protected JFrame frame; - protected GenerateDatabaseStarter saikuStarter; - - public SaikuAnalysisListener(JFrame frame, GenerateDatabaseStarter saikuStarter) { - this.frame = frame; - this.saikuStarter = saikuStarter; - } +final class SaikuStarter { - @Override - public void actionPerformed(ActionEvent e) { - try { + private Logger logger = LoggerFactory.getLogger( SaikuStarter.class); + private JFrame frame; + private AnalysisSaikuService saikuService; + private boolean shouldRefreshDb; + private boolean starting = false; + private InfiniteProgressMonitor progressStartSaiku; - CollectEarthWindow.startWaiting(frame); - exportDataToRDB( true ); - }catch (Exception e1) { - logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ - } finally{ - CollectEarthWindow.endWaiting(frame); - } + public boolean isShouldRefreshDb() { + return shouldRefreshDb; } - protected void exportDataToRDB(boolean startSaikuAfterDBExport) { - if( saikuStarter.isStarting() ){ - JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.57"), Messages.getString("CollectEarthWindow.58"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ - }else{ - - int shouldRefreshDb = JOptionPane.YES_OPTION; - - if( saikuStarter.shouldShowRdbGenerationOption( ExportType.SAIKU ) ){ - - String refresh = Messages.getString("SaikuAnalysisListener.0"); //$NON-NLS-1$ - String close = Messages.getString("SaikuAnalysisListener.1"); //$NON-NLS-1$ - String[] options = new String[]{ refresh,close}; + public void setShouldRefreshDb(boolean shouldRefreshDb) { + this.shouldRefreshDb = shouldRefreshDb; + } + SaikuStarter( final AnalysisSaikuService saikuService, final JFrame frame) { + super(); + this.saikuService = saikuService; + this.frame = frame; + } + + public boolean shouldShowRdbGenerationOption(){ + return saikuService.isRdbAlreadyGenerated( ExportType.SAIKU); + } - shouldRefreshDb = JOptionPane.showOptionDialog( - frame, Messages.getString("CollectEarthWindow.59"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.60"), //$NON-NLS-1$ - JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); + public boolean isStarting() { + return starting; + } + + public void initializeAndOpen(boolean startSaikuAfterDBExport) { + progressStartSaiku = new InfiniteProgressMonitor( frame, Messages.getString("SaikuStarter.1"), Messages.getString("SaikuStarter.2")); //$NON-NLS-1$ //$NON-NLS-2$ + + Thread threadInitializingSaiku = new Thread("Start Saiku server/initialize RDB"){ //$NON-NLS-1$ + @Override + public void run() { + starting = true; + saikuService.setRefreshDatabase( shouldRefreshDb ); + try { + saikuService.prepareDataForAnalysis(progressStartSaiku, startSaikuAfterDBExport); + }catch ( SaikuExecutionException e1) { + JOptionPane.showMessageDialog( frame , "" + Messages.getString("CollectEarthWindow.29") + "
" +Messages.getString("CollectEarthWindow.40") + "
" + e1.getMessage() + "", Messages.getString("CollectEarthWindow.47"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ + logger.warn("The saiku server is not configured", e1); //$NON-NLS-1$ + } catch ( RuntimeException e) { + logger.error("Error starting Saiku", e); //$NON-NLS-1$ + } finally{ + starting = false; + if( progressStartSaiku != null ){ + progressStartSaiku.close(); + } + } } + }; + + threadInitializingSaiku.start(); - if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ - saikuStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); - saikuStarter.initializeAndOpen( startSaikuAfterDBExport); - } + progressStartSaiku.showLater(); + + if( progressStartSaiku.isUserCancelled() ){ + saikuService.setUserCancelledOperation(true); } } - } \ No newline at end of file From 8ffec96e190f374a4b21b6ae0cdc3c64687cf4fa Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:29 +0100 Subject: [PATCH 0394/1620] New translations SaikuStarter.java (Spanish) --- .../earth/app/view/Messages_es.properties | 98 +++++++++++-------- 1 file changed, 55 insertions(+), 43 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 29c9a75479..220f8ccd9f 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,63 +1,75 @@ package org.openforis.collect.earth.app.view; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - import javax.swing.JFrame; import javax.swing.JOptionPane; +import org.openforis.collect.earth.app.service.AnalysisSaikuService; import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.SaikuExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class SaikuAnalysisListener implements ActionListener { - private Logger logger = LoggerFactory.getLogger( SaikuAnalysisListener.class); - protected JFrame frame; - protected GenerateDatabaseStarter saikuStarter; - - public SaikuAnalysisListener(JFrame frame, GenerateDatabaseStarter saikuStarter) { - this.frame = frame; - this.saikuStarter = saikuStarter; - } +final class SaikuStarter { - @Override - public void actionPerformed(ActionEvent e) { - try { + private Logger logger = LoggerFactory.getLogger( SaikuStarter.class); + private JFrame frame; + private AnalysisSaikuService saikuService; + private boolean shouldRefreshDb; + private boolean starting = false; + private InfiniteProgressMonitor progressStartSaiku; - CollectEarthWindow.startWaiting(frame); - exportDataToRDB( true ); - }catch (Exception e1) { - logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ - } finally{ - CollectEarthWindow.endWaiting(frame); - } + public boolean isShouldRefreshDb() { + return shouldRefreshDb; } - protected void exportDataToRDB(boolean startSaikuAfterDBExport) { - if( saikuStarter.isStarting() ){ - JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.57"), Messages.getString("CollectEarthWindow.58"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ - }else{ - - int shouldRefreshDb = JOptionPane.YES_OPTION; - - if( saikuStarter.shouldShowRdbGenerationOption( ExportType.SAIKU ) ){ - - String refresh = Messages.getString("SaikuAnalysisListener.0"); //$NON-NLS-1$ - String close = Messages.getString("SaikuAnalysisListener.1"); //$NON-NLS-1$ - String[] options = new String[]{ refresh,close}; + public void setShouldRefreshDb(boolean shouldRefreshDb) { + this.shouldRefreshDb = shouldRefreshDb; + } + SaikuStarter( final AnalysisSaikuService saikuService, final JFrame frame) { + super(); + this.saikuService = saikuService; + this.frame = frame; + } + + public boolean shouldShowRdbGenerationOption(){ + return saikuService.isRdbAlreadyGenerated( ExportType.SAIKU); + } - shouldRefreshDb = JOptionPane.showOptionDialog( - frame, Messages.getString("CollectEarthWindow.59"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.60"), //$NON-NLS-1$ - JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); + public boolean isStarting() { + return starting; + } + + public void initializeAndOpen(boolean startSaikuAfterDBExport) { + progressStartSaiku = new InfiniteProgressMonitor( frame, Messages.getString("SaikuStarter.1"), Messages.getString("SaikuStarter.2")); //$NON-NLS-1$ //$NON-NLS-2$ + + Thread threadInitializingSaiku = new Thread("Start Saiku server/initialize RDB"){ //$NON-NLS-1$ + @Override + public void run() { + starting = true; + saikuService.setRefreshDatabase( shouldRefreshDb ); + try { + saikuService.prepareDataForAnalysis(progressStartSaiku, startSaikuAfterDBExport); + }catch ( SaikuExecutionException e1) { + JOptionPane.showMessageDialog( frame , "" + Messages.getString("CollectEarthWindow.29") + "
" +Messages.getString("CollectEarthWindow.40") + "
" + e1.getMessage() + "", Messages.getString("CollectEarthWindow.47"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ + logger.warn("The saiku server is not configured", e1); //$NON-NLS-1$ + } catch ( RuntimeException e) { + logger.error("Error starting Saiku", e); //$NON-NLS-1$ + } finally{ + starting = false; + if( progressStartSaiku != null ){ + progressStartSaiku.close(); + } + } } + }; + + threadInitializingSaiku.start(); - if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ - saikuStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); - saikuStarter.initializeAndOpen( startSaikuAfterDBExport); - } + progressStartSaiku.showLater(); + + if( progressStartSaiku.isUserCancelled() ){ + saikuService.setUserCancelledOperation(true); } } - } \ No newline at end of file From 4301f3548e2e8e1f4071c06bf089401213b5f164 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:30 +0100 Subject: [PATCH 0395/1620] New translations SaikuStarter.java (English) --- .../earth/app/view/Messages_en.properties | 98 +++++++++++-------- 1 file changed, 55 insertions(+), 43 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 29c9a75479..220f8ccd9f 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,63 +1,75 @@ package org.openforis.collect.earth.app.view; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - import javax.swing.JFrame; import javax.swing.JOptionPane; +import org.openforis.collect.earth.app.service.AnalysisSaikuService; import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.SaikuExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class SaikuAnalysisListener implements ActionListener { - private Logger logger = LoggerFactory.getLogger( SaikuAnalysisListener.class); - protected JFrame frame; - protected GenerateDatabaseStarter saikuStarter; - - public SaikuAnalysisListener(JFrame frame, GenerateDatabaseStarter saikuStarter) { - this.frame = frame; - this.saikuStarter = saikuStarter; - } +final class SaikuStarter { - @Override - public void actionPerformed(ActionEvent e) { - try { + private Logger logger = LoggerFactory.getLogger( SaikuStarter.class); + private JFrame frame; + private AnalysisSaikuService saikuService; + private boolean shouldRefreshDb; + private boolean starting = false; + private InfiniteProgressMonitor progressStartSaiku; - CollectEarthWindow.startWaiting(frame); - exportDataToRDB( true ); - }catch (Exception e1) { - logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ - } finally{ - CollectEarthWindow.endWaiting(frame); - } + public boolean isShouldRefreshDb() { + return shouldRefreshDb; } - protected void exportDataToRDB(boolean startSaikuAfterDBExport) { - if( saikuStarter.isStarting() ){ - JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.57"), Messages.getString("CollectEarthWindow.58"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ - }else{ - - int shouldRefreshDb = JOptionPane.YES_OPTION; - - if( saikuStarter.shouldShowRdbGenerationOption( ExportType.SAIKU ) ){ - - String refresh = Messages.getString("SaikuAnalysisListener.0"); //$NON-NLS-1$ - String close = Messages.getString("SaikuAnalysisListener.1"); //$NON-NLS-1$ - String[] options = new String[]{ refresh,close}; + public void setShouldRefreshDb(boolean shouldRefreshDb) { + this.shouldRefreshDb = shouldRefreshDb; + } + SaikuStarter( final AnalysisSaikuService saikuService, final JFrame frame) { + super(); + this.saikuService = saikuService; + this.frame = frame; + } + + public boolean shouldShowRdbGenerationOption(){ + return saikuService.isRdbAlreadyGenerated( ExportType.SAIKU); + } - shouldRefreshDb = JOptionPane.showOptionDialog( - frame, Messages.getString("CollectEarthWindow.59"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.60"), //$NON-NLS-1$ - JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); + public boolean isStarting() { + return starting; + } + + public void initializeAndOpen(boolean startSaikuAfterDBExport) { + progressStartSaiku = new InfiniteProgressMonitor( frame, Messages.getString("SaikuStarter.1"), Messages.getString("SaikuStarter.2")); //$NON-NLS-1$ //$NON-NLS-2$ + + Thread threadInitializingSaiku = new Thread("Start Saiku server/initialize RDB"){ //$NON-NLS-1$ + @Override + public void run() { + starting = true; + saikuService.setRefreshDatabase( shouldRefreshDb ); + try { + saikuService.prepareDataForAnalysis(progressStartSaiku, startSaikuAfterDBExport); + }catch ( SaikuExecutionException e1) { + JOptionPane.showMessageDialog( frame , "" + Messages.getString("CollectEarthWindow.29") + "
" +Messages.getString("CollectEarthWindow.40") + "
" + e1.getMessage() + "", Messages.getString("CollectEarthWindow.47"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ + logger.warn("The saiku server is not configured", e1); //$NON-NLS-1$ + } catch ( RuntimeException e) { + logger.error("Error starting Saiku", e); //$NON-NLS-1$ + } finally{ + starting = false; + if( progressStartSaiku != null ){ + progressStartSaiku.close(); + } + } } + }; + + threadInitializingSaiku.start(); - if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ - saikuStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); - saikuStarter.initializeAndOpen( startSaikuAfterDBExport); - } + progressStartSaiku.showLater(); + + if( progressStartSaiku.isUserCancelled() ){ + saikuService.setUserCancelledOperation(true); } } - } \ No newline at end of file From 92e7b5ff146af036be48a194e994f73ad4a9dd90 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:31 +0100 Subject: [PATCH 0396/1620] New translations IPCCDataExportLandUnitsCSV.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 154 +++++++++++------- 1 file changed, 91 insertions(+), 63 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 29c9a75479..1c57311278 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,63 +1,91 @@ -package org.openforis.collect.earth.app.view; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -import javax.swing.JFrame; -import javax.swing.JOptionPane; - -import org.openforis.collect.earth.app.service.ExportType; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class SaikuAnalysisListener implements ActionListener { - private Logger logger = LoggerFactory.getLogger( SaikuAnalysisListener.class); - protected JFrame frame; - protected GenerateDatabaseStarter saikuStarter; - - public SaikuAnalysisListener(JFrame frame, GenerateDatabaseStarter saikuStarter) { - this.frame = frame; - this.saikuStarter = saikuStarter; - } - - @Override - public void actionPerformed(ActionEvent e) { - try { - - CollectEarthWindow.startWaiting(frame); - exportDataToRDB( true ); - }catch (Exception e1) { - logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ - } finally{ - CollectEarthWindow.endWaiting(frame); - } - } - - protected void exportDataToRDB(boolean startSaikuAfterDBExport) { - if( saikuStarter.isStarting() ){ - JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.57"), Messages.getString("CollectEarthWindow.58"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ - }else{ - - int shouldRefreshDb = JOptionPane.YES_OPTION; - - if( saikuStarter.shouldShowRdbGenerationOption( ExportType.SAIKU ) ){ - - String refresh = Messages.getString("SaikuAnalysisListener.0"); //$NON-NLS-1$ - String close = Messages.getString("SaikuAnalysisListener.1"); //$NON-NLS-1$ - String[] options = new String[]{ refresh,close}; - - - shouldRefreshDb = JOptionPane.showOptionDialog( - frame, Messages.getString("CollectEarthWindow.59"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.60"), //$NON-NLS-1$ - JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); - } - - if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ - saikuStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); - saikuStarter.initializeAndOpen( startSaikuAfterDBExport); - } - } - } - -} \ No newline at end of file +package org.openforis.collect.earth.ipcc; + +import java.io.File; +import java.io.IOException; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.RegionCalculationUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Component; + +@Component +public class IPCCDataExportLandUnitsCSV extends IPCCDataExportCSV { + + private String schemaName; + + Logger logger = LoggerFactory.getLogger(IPCCDataExportLandUnitsCSV.class); + + private final static String LAND_UNIT_ID = "land_unit_id"; + + public IPCCDataExportLandUnitsCSV() { + super(); + setExportTypeUsed(ExportType.IPCC); + } + + public File generateTimeseriesData( int startYear, int endYear ) throws IOException { + schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); + List luCombinations = generateLUCombinations(startYear, endYear); + return createCsv( luCombinations); + } + + @Override + protected RowMapper getRowMapper() { + return new RowMapper() { + @Override + public String[] mapRow(ResultSet rs, int rowNum) throws SQLException { + int columnCount = rs.getMetaData().getColumnCount(); + columnCount++; // adding an extra column with the row number + String[] columns = new String[ columnCount ]; + columns[0] = "LU_" + String.format("%04d", rs.getRow()) ; + for (int i = 1; i < columnCount; i++) { + columns[i] = rs.getString(i); + } + return columns; + } + }; + } + + private List generateLUCombinations(int startYear, int endYear) { + String selectedYears = IPCCDataExportTimeSeries.CLIMATE_COLUMN_LABEL + + ", " + IPCCDataExportTimeSeries.SOIL_COLUMN_LABEL + + ", " + IPCCDataExportTimeSeries.GEZ_COLUMN_LABEL + ", " ; + for( int year = startYear ; year <= endYear; year++ ) { + selectedYears += IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + ","; + } + + String sqlSelect = "select " + + selectedYears + + " sum( " + RegionCalculationUtils.EXPANSION_FACTOR + ")" + + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.SOIL_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.CLIMATE_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.GEZ_TABLE + + + " where " + + IPCCDataExportTimeSeries.SOIL_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.SOIL_COLUMN_ID + + " and " + + IPCCDataExportTimeSeries.CLIMATE_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_ID + + " and " + + IPCCDataExportTimeSeries.GEZ_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.GEZ_COLUMN_ID + + + " GROUP BY " + + selectedYears.substring(0, selectedYears.length()-1) + + " ORDER BY sum( "+ RegionCalculationUtils.EXPANSION_FACTOR + " ) DESC"; // Remove trailing comma from list of years + + + List luData = getJdbcTemplate().query( + sqlSelect + , + getRowMapper() + ); + + selectedYears= LAND_UNIT_ID + "," + selectedYears; // Add the Land Unit ID which is basically the row number + selectedYears+= "area"; // so the area columns appears too + luData.add( 0, selectedYears.split(",") ); // Add the header row for the CSV output in the first position of the List + return luData; + } + +} From 7e3c240196911bf4804513b29204e3f302922241 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:32 +0100 Subject: [PATCH 0397/1620] New translations SaikuToolExportListener.java (French) --- .../earth/app/view/Messages_fr.properties | 163 ++++++++++++------ 1 file changed, 113 insertions(+), 50 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 220f8ccd9f..5ec1dff27b 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,75 +1,138 @@ package org.openforis.collect.earth.app.view; +import java.awt.event.ActionEvent; +import java.io.File; +import java.io.IOException; + import javax.swing.JFrame; -import javax.swing.JOptionPane; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.service.AnalysisSaikuService; -import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.SaikuExecutionException; +import org.openforis.collect.earth.app.service.LocalPropertiesService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -final class SaikuStarter { +import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.model.ZipParameters; - private Logger logger = LoggerFactory.getLogger( SaikuStarter.class); - private JFrame frame; - private AnalysisSaikuService saikuService; - private boolean shouldRefreshDb; - private boolean starting = false; - private InfiniteProgressMonitor progressStartSaiku; +public class SaikuToolExportListener extends SaikuAnalysisListener { + private Logger logger = LoggerFactory.getLogger( SaikuToolExportListener.class); + private LocalPropertiesService localPropertiesService; - public boolean isShouldRefreshDb() { - return shouldRefreshDb; - } + private final static String PREFIX_FOLDER = "saiku-server_2.6"; - public void setShouldRefreshDb(boolean shouldRefreshDb) { - this.shouldRefreshDb = shouldRefreshDb; + public SaikuToolExportListener(JFrame frame, GenerateDatabaseStarter saikuStarter, LocalPropertiesService localPropertiesService) { + super(frame, saikuStarter); + this.localPropertiesService = localPropertiesService; } - SaikuStarter( final AnalysisSaikuService saikuService, final JFrame frame) { - super(); - this.saikuService = saikuService; - this.frame = frame; - } - - public boolean shouldShowRdbGenerationOption(){ - return saikuService.isRdbAlreadyGenerated( ExportType.SAIKU); - } + @Override + public void actionPerformed(ActionEvent e) { + try { + + File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.SAIKU_ZIP, true, false, "SaikuTool", localPropertiesService, frame); + + if (exportToFile != null && exportToFile.length > 0) { + CollectEarthWindow.startWaiting(frame); + + generateNewSaikuZip( exportToFile[0] ); + } - public boolean isStarting() { - return starting; + }catch (Exception e1) { + logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ + } finally{ + CollectEarthWindow.endWaiting(frame); + } } - - public void initializeAndOpen(boolean startSaikuAfterDBExport) { - progressStartSaiku = new InfiniteProgressMonitor( frame, Messages.getString("SaikuStarter.1"), Messages.getString("SaikuStarter.2")); //$NON-NLS-1$ //$NON-NLS-2$ + + private void generateNewSaikuZip(File zipFileOutput ) { + InfiniteProgressMonitor progressMonitor = new InfiniteProgressMonitor( + frame, + Messages.getString("SaikuToolExportListener.1"), + Messages.getString("SaikuToolExportListener.2") + ); - Thread threadInitializingSaiku = new Thread("Start Saiku server/initialize RDB"){ //$NON-NLS-1$ + Thread threadGeneratingDB = new Thread("Generating ZIP Saiku Tool"){ //$NON-NLS-1$ @Override public void run() { - starting = true; - saikuService.setRefreshDatabase( shouldRefreshDb ); - try { - saikuService.prepareDataForAnalysis(progressStartSaiku, startSaikuAfterDBExport); - }catch ( SaikuExecutionException e1) { - JOptionPane.showMessageDialog( frame , "" + Messages.getString("CollectEarthWindow.29") + "
" +Messages.getString("CollectEarthWindow.40") + "
" + e1.getMessage() + "", Messages.getString("CollectEarthWindow.47"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ - logger.warn("The saiku server is not configured", e1); //$NON-NLS-1$ - } catch ( RuntimeException e) { - logger.error("Error starting Saiku", e); //$NON-NLS-1$ + exportDataToRDB(false); + try ( + ZipFile outputSaikuZip = new ZipFile(zipFileOutput); + ){ + + File saikuFolder = new File(localPropertiesService.getSaikuFolder() ); + File javaFolder = new File( saikuFolder.getAbsolutePath() + "/../java" ); // The Java and Saiku folders are on the same level + + ZipParameters zipParameters = new ZipParameters(); + zipParameters.setExcludeFileFilter( + file -> + file.getName().endsWith( "log") // exclude log files! + || + file.getParent().endsWith("temp" ) // exclude temp folder! + ); + outputSaikuZip.addFolder( saikuFolder, zipParameters ); + + // Copy the original ZIP files contained in the root ( saiku-server_2.6.zip ) to a new temporary file + + // create DB folder + // Copy the Saiku DB to DB/collectEarthDatabase.dbSaiku + zipParameters.setFileNameInZip(PREFIX_FOLDER+"/DB/" + EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME + + EarthConstants.SAIKU_RDB_SUFFIX); + outputSaikuZip.addFile( + new File(AnalysisSaikuService.COLLECT_EARTH_DATABASE_RDB_DB), zipParameters + ); + + // Copy the Mondrian Cube XML to DB/collectEarthCubes.xml + zipParameters = new ZipParameters(); + zipParameters.setFileNameInZip(PREFIX_FOLDER+"/DB/" + AnalysisSaikuService.MDX_XML ); + File mdxFile = new File(localPropertiesService.getProjectFolder() + File.separatorChar + AnalysisSaikuService.MDX_XML); + outputSaikuZip.addFile( + mdxFile, zipParameters + ); + + + // Change the configuration file to use the stand alone version! + + // Add java to the Saiku ZIP + zipParameters = new ZipParameters(); + zipParameters.setRootFolderNameInZip(PREFIX_FOLDER ); + outputSaikuZip.addFolder( javaFolder, zipParameters ); + + + // Move START_SAIKU and TERMINATE SAIKU to the root folder + File startSaiku = new File("resources/START SAIKU.bat"); + outputSaikuZip.addFile( + startSaiku + ); + + File terminateSaiku = new File("resources/TERMINATE SAIKU.bat"); + outputSaikuZip.addFile( + terminateSaiku + ); + + File readme = new File("resources/README - INSTALLATION AND RUNNING.txt"); + outputSaikuZip.addFile( + readme + ); + + + } catch (IOException e) { + logger.error("Error generating SAIKU tool at " + zipFileOutput.getAbsolutePath() ); } finally{ - starting = false; - if( progressStartSaiku != null ){ - progressStartSaiku.close(); + if( progressMonitor != null ){ + progressMonitor.close(); } + + CollectEarthUtils.openFile( zipFileOutput ); } } }; - - threadInitializingSaiku.start(); - progressStartSaiku.showLater(); - - if( progressStartSaiku.isUserCancelled() ){ - saikuService.setUserCancelledOperation(true); - } + threadGeneratingDB.start(); + + progressMonitor.showLater(); + + } -} \ No newline at end of file +} From fea4c61b0c7b70e05f1657f12300c0adf3b96183 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:33 +0100 Subject: [PATCH 0398/1620] New translations SaikuToolExportListener.java (Spanish) --- .../earth/app/view/Messages_es.properties | 163 ++++++++++++------ 1 file changed, 113 insertions(+), 50 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 220f8ccd9f..5ec1dff27b 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,75 +1,138 @@ package org.openforis.collect.earth.app.view; +import java.awt.event.ActionEvent; +import java.io.File; +import java.io.IOException; + import javax.swing.JFrame; -import javax.swing.JOptionPane; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.service.AnalysisSaikuService; -import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.SaikuExecutionException; +import org.openforis.collect.earth.app.service.LocalPropertiesService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -final class SaikuStarter { +import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.model.ZipParameters; - private Logger logger = LoggerFactory.getLogger( SaikuStarter.class); - private JFrame frame; - private AnalysisSaikuService saikuService; - private boolean shouldRefreshDb; - private boolean starting = false; - private InfiniteProgressMonitor progressStartSaiku; +public class SaikuToolExportListener extends SaikuAnalysisListener { + private Logger logger = LoggerFactory.getLogger( SaikuToolExportListener.class); + private LocalPropertiesService localPropertiesService; - public boolean isShouldRefreshDb() { - return shouldRefreshDb; - } + private final static String PREFIX_FOLDER = "saiku-server_2.6"; - public void setShouldRefreshDb(boolean shouldRefreshDb) { - this.shouldRefreshDb = shouldRefreshDb; + public SaikuToolExportListener(JFrame frame, GenerateDatabaseStarter saikuStarter, LocalPropertiesService localPropertiesService) { + super(frame, saikuStarter); + this.localPropertiesService = localPropertiesService; } - SaikuStarter( final AnalysisSaikuService saikuService, final JFrame frame) { - super(); - this.saikuService = saikuService; - this.frame = frame; - } - - public boolean shouldShowRdbGenerationOption(){ - return saikuService.isRdbAlreadyGenerated( ExportType.SAIKU); - } + @Override + public void actionPerformed(ActionEvent e) { + try { + + File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.SAIKU_ZIP, true, false, "SaikuTool", localPropertiesService, frame); + + if (exportToFile != null && exportToFile.length > 0) { + CollectEarthWindow.startWaiting(frame); + + generateNewSaikuZip( exportToFile[0] ); + } - public boolean isStarting() { - return starting; + }catch (Exception e1) { + logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ + } finally{ + CollectEarthWindow.endWaiting(frame); + } } - - public void initializeAndOpen(boolean startSaikuAfterDBExport) { - progressStartSaiku = new InfiniteProgressMonitor( frame, Messages.getString("SaikuStarter.1"), Messages.getString("SaikuStarter.2")); //$NON-NLS-1$ //$NON-NLS-2$ + + private void generateNewSaikuZip(File zipFileOutput ) { + InfiniteProgressMonitor progressMonitor = new InfiniteProgressMonitor( + frame, + Messages.getString("SaikuToolExportListener.1"), + Messages.getString("SaikuToolExportListener.2") + ); - Thread threadInitializingSaiku = new Thread("Start Saiku server/initialize RDB"){ //$NON-NLS-1$ + Thread threadGeneratingDB = new Thread("Generating ZIP Saiku Tool"){ //$NON-NLS-1$ @Override public void run() { - starting = true; - saikuService.setRefreshDatabase( shouldRefreshDb ); - try { - saikuService.prepareDataForAnalysis(progressStartSaiku, startSaikuAfterDBExport); - }catch ( SaikuExecutionException e1) { - JOptionPane.showMessageDialog( frame , "" + Messages.getString("CollectEarthWindow.29") + "
" +Messages.getString("CollectEarthWindow.40") + "
" + e1.getMessage() + "", Messages.getString("CollectEarthWindow.47"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ - logger.warn("The saiku server is not configured", e1); //$NON-NLS-1$ - } catch ( RuntimeException e) { - logger.error("Error starting Saiku", e); //$NON-NLS-1$ + exportDataToRDB(false); + try ( + ZipFile outputSaikuZip = new ZipFile(zipFileOutput); + ){ + + File saikuFolder = new File(localPropertiesService.getSaikuFolder() ); + File javaFolder = new File( saikuFolder.getAbsolutePath() + "/../java" ); // The Java and Saiku folders are on the same level + + ZipParameters zipParameters = new ZipParameters(); + zipParameters.setExcludeFileFilter( + file -> + file.getName().endsWith( "log") // exclude log files! + || + file.getParent().endsWith("temp" ) // exclude temp folder! + ); + outputSaikuZip.addFolder( saikuFolder, zipParameters ); + + // Copy the original ZIP files contained in the root ( saiku-server_2.6.zip ) to a new temporary file + + // create DB folder + // Copy the Saiku DB to DB/collectEarthDatabase.dbSaiku + zipParameters.setFileNameInZip(PREFIX_FOLDER+"/DB/" + EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME + + EarthConstants.SAIKU_RDB_SUFFIX); + outputSaikuZip.addFile( + new File(AnalysisSaikuService.COLLECT_EARTH_DATABASE_RDB_DB), zipParameters + ); + + // Copy the Mondrian Cube XML to DB/collectEarthCubes.xml + zipParameters = new ZipParameters(); + zipParameters.setFileNameInZip(PREFIX_FOLDER+"/DB/" + AnalysisSaikuService.MDX_XML ); + File mdxFile = new File(localPropertiesService.getProjectFolder() + File.separatorChar + AnalysisSaikuService.MDX_XML); + outputSaikuZip.addFile( + mdxFile, zipParameters + ); + + + // Change the configuration file to use the stand alone version! + + // Add java to the Saiku ZIP + zipParameters = new ZipParameters(); + zipParameters.setRootFolderNameInZip(PREFIX_FOLDER ); + outputSaikuZip.addFolder( javaFolder, zipParameters ); + + + // Move START_SAIKU and TERMINATE SAIKU to the root folder + File startSaiku = new File("resources/START SAIKU.bat"); + outputSaikuZip.addFile( + startSaiku + ); + + File terminateSaiku = new File("resources/TERMINATE SAIKU.bat"); + outputSaikuZip.addFile( + terminateSaiku + ); + + File readme = new File("resources/README - INSTALLATION AND RUNNING.txt"); + outputSaikuZip.addFile( + readme + ); + + + } catch (IOException e) { + logger.error("Error generating SAIKU tool at " + zipFileOutput.getAbsolutePath() ); } finally{ - starting = false; - if( progressStartSaiku != null ){ - progressStartSaiku.close(); + if( progressMonitor != null ){ + progressMonitor.close(); } + + CollectEarthUtils.openFile( zipFileOutput ); } } }; - - threadInitializingSaiku.start(); - progressStartSaiku.showLater(); - - if( progressStartSaiku.isUserCancelled() ){ - saikuService.setUserCancelledOperation(true); - } + threadGeneratingDB.start(); + + progressMonitor.showLater(); + + } -} \ No newline at end of file +} From 4202181f981910d135cf101835e46fa6bec1912c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:34 +0100 Subject: [PATCH 0399/1620] New translations SaikuToolExportListener.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 229 +++++++++++------- 1 file changed, 138 insertions(+), 91 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 1c57311278..5ec1dff27b 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,91 +1,138 @@ -package org.openforis.collect.earth.ipcc; - -import java.io.File; -import java.io.IOException; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; - -import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.RegionCalculationUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.jdbc.core.RowMapper; -import org.springframework.stereotype.Component; - -@Component -public class IPCCDataExportLandUnitsCSV extends IPCCDataExportCSV { - - private String schemaName; - - Logger logger = LoggerFactory.getLogger(IPCCDataExportLandUnitsCSV.class); - - private final static String LAND_UNIT_ID = "land_unit_id"; - - public IPCCDataExportLandUnitsCSV() { - super(); - setExportTypeUsed(ExportType.IPCC); - } - - public File generateTimeseriesData( int startYear, int endYear ) throws IOException { - schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - List luCombinations = generateLUCombinations(startYear, endYear); - return createCsv( luCombinations); - } - - @Override - protected RowMapper getRowMapper() { - return new RowMapper() { - @Override - public String[] mapRow(ResultSet rs, int rowNum) throws SQLException { - int columnCount = rs.getMetaData().getColumnCount(); - columnCount++; // adding an extra column with the row number - String[] columns = new String[ columnCount ]; - columns[0] = "LU_" + String.format("%04d", rs.getRow()) ; - for (int i = 1; i < columnCount; i++) { - columns[i] = rs.getString(i); - } - return columns; - } - }; - } - - private List generateLUCombinations(int startYear, int endYear) { - String selectedYears = IPCCDataExportTimeSeries.CLIMATE_COLUMN_LABEL + - ", " + IPCCDataExportTimeSeries.SOIL_COLUMN_LABEL + - ", " + IPCCDataExportTimeSeries.GEZ_COLUMN_LABEL + ", " ; - for( int year = startYear ; year <= endYear; year++ ) { - selectedYears += IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + ","; - } - - String sqlSelect = "select " - + selectedYears - + " sum( " + RegionCalculationUtils.EXPANSION_FACTOR + ")" - + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.SOIL_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.CLIMATE_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.GEZ_TABLE - - + " where " - + IPCCDataExportTimeSeries.SOIL_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.SOIL_COLUMN_ID - + " and " - + IPCCDataExportTimeSeries.CLIMATE_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_ID - + " and " - + IPCCDataExportTimeSeries.GEZ_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.GEZ_COLUMN_ID - - + " GROUP BY " - + selectedYears.substring(0, selectedYears.length()-1) - + " ORDER BY sum( "+ RegionCalculationUtils.EXPANSION_FACTOR + " ) DESC"; // Remove trailing comma from list of years - - - List luData = getJdbcTemplate().query( - sqlSelect - , - getRowMapper() - ); - - selectedYears= LAND_UNIT_ID + "," + selectedYears; // Add the Land Unit ID which is basically the row number - selectedYears+= "area"; // so the area columns appears too - luData.add( 0, selectedYears.split(",") ); // Add the header row for the CSV output in the first position of the List - return luData; - } - -} +package org.openforis.collect.earth.app.view; + +import java.awt.event.ActionEvent; +import java.io.File; +import java.io.IOException; + +import javax.swing.JFrame; + +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.service.AnalysisSaikuService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.model.ZipParameters; + +public class SaikuToolExportListener extends SaikuAnalysisListener { + private Logger logger = LoggerFactory.getLogger( SaikuToolExportListener.class); + private LocalPropertiesService localPropertiesService; + + private final static String PREFIX_FOLDER = "saiku-server_2.6"; + + public SaikuToolExportListener(JFrame frame, GenerateDatabaseStarter saikuStarter, LocalPropertiesService localPropertiesService) { + super(frame, saikuStarter); + this.localPropertiesService = localPropertiesService; + } + + @Override + public void actionPerformed(ActionEvent e) { + try { + + File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.SAIKU_ZIP, true, false, "SaikuTool", localPropertiesService, frame); + + if (exportToFile != null && exportToFile.length > 0) { + CollectEarthWindow.startWaiting(frame); + + generateNewSaikuZip( exportToFile[0] ); + } + + }catch (Exception e1) { + logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ + } finally{ + CollectEarthWindow.endWaiting(frame); + } + } + + private void generateNewSaikuZip(File zipFileOutput ) { + InfiniteProgressMonitor progressMonitor = new InfiniteProgressMonitor( + frame, + Messages.getString("SaikuToolExportListener.1"), + Messages.getString("SaikuToolExportListener.2") + ); + + Thread threadGeneratingDB = new Thread("Generating ZIP Saiku Tool"){ //$NON-NLS-1$ + @Override + public void run() { + exportDataToRDB(false); + try ( + ZipFile outputSaikuZip = new ZipFile(zipFileOutput); + ){ + + File saikuFolder = new File(localPropertiesService.getSaikuFolder() ); + File javaFolder = new File( saikuFolder.getAbsolutePath() + "/../java" ); // The Java and Saiku folders are on the same level + + ZipParameters zipParameters = new ZipParameters(); + zipParameters.setExcludeFileFilter( + file -> + file.getName().endsWith( "log") // exclude log files! + || + file.getParent().endsWith("temp" ) // exclude temp folder! + ); + outputSaikuZip.addFolder( saikuFolder, zipParameters ); + + // Copy the original ZIP files contained in the root ( saiku-server_2.6.zip ) to a new temporary file + + // create DB folder + // Copy the Saiku DB to DB/collectEarthDatabase.dbSaiku + zipParameters.setFileNameInZip(PREFIX_FOLDER+"/DB/" + EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME + + EarthConstants.SAIKU_RDB_SUFFIX); + outputSaikuZip.addFile( + new File(AnalysisSaikuService.COLLECT_EARTH_DATABASE_RDB_DB), zipParameters + ); + + // Copy the Mondrian Cube XML to DB/collectEarthCubes.xml + zipParameters = new ZipParameters(); + zipParameters.setFileNameInZip(PREFIX_FOLDER+"/DB/" + AnalysisSaikuService.MDX_XML ); + File mdxFile = new File(localPropertiesService.getProjectFolder() + File.separatorChar + AnalysisSaikuService.MDX_XML); + outputSaikuZip.addFile( + mdxFile, zipParameters + ); + + + // Change the configuration file to use the stand alone version! + + // Add java to the Saiku ZIP + zipParameters = new ZipParameters(); + zipParameters.setRootFolderNameInZip(PREFIX_FOLDER ); + outputSaikuZip.addFolder( javaFolder, zipParameters ); + + + // Move START_SAIKU and TERMINATE SAIKU to the root folder + File startSaiku = new File("resources/START SAIKU.bat"); + outputSaikuZip.addFile( + startSaiku + ); + + File terminateSaiku = new File("resources/TERMINATE SAIKU.bat"); + outputSaikuZip.addFile( + terminateSaiku + ); + + File readme = new File("resources/README - INSTALLATION AND RUNNING.txt"); + outputSaikuZip.addFile( + readme + ); + + + } catch (IOException e) { + logger.error("Error generating SAIKU tool at " + zipFileOutput.getAbsolutePath() ); + } finally{ + if( progressMonitor != null ){ + progressMonitor.close(); + } + + CollectEarthUtils.openFile( zipFileOutput ); + } + } + }; + + threadGeneratingDB.start(); + + progressMonitor.showLater(); + + + } +} From e9914be372c1bcb69476a37148928c3002f0eb95 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:35 +0100 Subject: [PATCH 0400/1620] New translations SaikuToolExportListener.java (English) --- .../earth/app/view/Messages_en.properties | 163 ++++++++++++------ 1 file changed, 113 insertions(+), 50 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 220f8ccd9f..5ec1dff27b 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,75 +1,138 @@ package org.openforis.collect.earth.app.view; +import java.awt.event.ActionEvent; +import java.io.File; +import java.io.IOException; + import javax.swing.JFrame; -import javax.swing.JOptionPane; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.service.AnalysisSaikuService; -import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.SaikuExecutionException; +import org.openforis.collect.earth.app.service.LocalPropertiesService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -final class SaikuStarter { +import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.model.ZipParameters; - private Logger logger = LoggerFactory.getLogger( SaikuStarter.class); - private JFrame frame; - private AnalysisSaikuService saikuService; - private boolean shouldRefreshDb; - private boolean starting = false; - private InfiniteProgressMonitor progressStartSaiku; +public class SaikuToolExportListener extends SaikuAnalysisListener { + private Logger logger = LoggerFactory.getLogger( SaikuToolExportListener.class); + private LocalPropertiesService localPropertiesService; - public boolean isShouldRefreshDb() { - return shouldRefreshDb; - } + private final static String PREFIX_FOLDER = "saiku-server_2.6"; - public void setShouldRefreshDb(boolean shouldRefreshDb) { - this.shouldRefreshDb = shouldRefreshDb; + public SaikuToolExportListener(JFrame frame, GenerateDatabaseStarter saikuStarter, LocalPropertiesService localPropertiesService) { + super(frame, saikuStarter); + this.localPropertiesService = localPropertiesService; } - SaikuStarter( final AnalysisSaikuService saikuService, final JFrame frame) { - super(); - this.saikuService = saikuService; - this.frame = frame; - } - - public boolean shouldShowRdbGenerationOption(){ - return saikuService.isRdbAlreadyGenerated( ExportType.SAIKU); - } + @Override + public void actionPerformed(ActionEvent e) { + try { + + File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.SAIKU_ZIP, true, false, "SaikuTool", localPropertiesService, frame); + + if (exportToFile != null && exportToFile.length > 0) { + CollectEarthWindow.startWaiting(frame); + + generateNewSaikuZip( exportToFile[0] ); + } - public boolean isStarting() { - return starting; + }catch (Exception e1) { + logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ + } finally{ + CollectEarthWindow.endWaiting(frame); + } } - - public void initializeAndOpen(boolean startSaikuAfterDBExport) { - progressStartSaiku = new InfiniteProgressMonitor( frame, Messages.getString("SaikuStarter.1"), Messages.getString("SaikuStarter.2")); //$NON-NLS-1$ //$NON-NLS-2$ + + private void generateNewSaikuZip(File zipFileOutput ) { + InfiniteProgressMonitor progressMonitor = new InfiniteProgressMonitor( + frame, + Messages.getString("SaikuToolExportListener.1"), + Messages.getString("SaikuToolExportListener.2") + ); - Thread threadInitializingSaiku = new Thread("Start Saiku server/initialize RDB"){ //$NON-NLS-1$ + Thread threadGeneratingDB = new Thread("Generating ZIP Saiku Tool"){ //$NON-NLS-1$ @Override public void run() { - starting = true; - saikuService.setRefreshDatabase( shouldRefreshDb ); - try { - saikuService.prepareDataForAnalysis(progressStartSaiku, startSaikuAfterDBExport); - }catch ( SaikuExecutionException e1) { - JOptionPane.showMessageDialog( frame , "" + Messages.getString("CollectEarthWindow.29") + "
" +Messages.getString("CollectEarthWindow.40") + "
" + e1.getMessage() + "", Messages.getString("CollectEarthWindow.47"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ - logger.warn("The saiku server is not configured", e1); //$NON-NLS-1$ - } catch ( RuntimeException e) { - logger.error("Error starting Saiku", e); //$NON-NLS-1$ + exportDataToRDB(false); + try ( + ZipFile outputSaikuZip = new ZipFile(zipFileOutput); + ){ + + File saikuFolder = new File(localPropertiesService.getSaikuFolder() ); + File javaFolder = new File( saikuFolder.getAbsolutePath() + "/../java" ); // The Java and Saiku folders are on the same level + + ZipParameters zipParameters = new ZipParameters(); + zipParameters.setExcludeFileFilter( + file -> + file.getName().endsWith( "log") // exclude log files! + || + file.getParent().endsWith("temp" ) // exclude temp folder! + ); + outputSaikuZip.addFolder( saikuFolder, zipParameters ); + + // Copy the original ZIP files contained in the root ( saiku-server_2.6.zip ) to a new temporary file + + // create DB folder + // Copy the Saiku DB to DB/collectEarthDatabase.dbSaiku + zipParameters.setFileNameInZip(PREFIX_FOLDER+"/DB/" + EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME + + EarthConstants.SAIKU_RDB_SUFFIX); + outputSaikuZip.addFile( + new File(AnalysisSaikuService.COLLECT_EARTH_DATABASE_RDB_DB), zipParameters + ); + + // Copy the Mondrian Cube XML to DB/collectEarthCubes.xml + zipParameters = new ZipParameters(); + zipParameters.setFileNameInZip(PREFIX_FOLDER+"/DB/" + AnalysisSaikuService.MDX_XML ); + File mdxFile = new File(localPropertiesService.getProjectFolder() + File.separatorChar + AnalysisSaikuService.MDX_XML); + outputSaikuZip.addFile( + mdxFile, zipParameters + ); + + + // Change the configuration file to use the stand alone version! + + // Add java to the Saiku ZIP + zipParameters = new ZipParameters(); + zipParameters.setRootFolderNameInZip(PREFIX_FOLDER ); + outputSaikuZip.addFolder( javaFolder, zipParameters ); + + + // Move START_SAIKU and TERMINATE SAIKU to the root folder + File startSaiku = new File("resources/START SAIKU.bat"); + outputSaikuZip.addFile( + startSaiku + ); + + File terminateSaiku = new File("resources/TERMINATE SAIKU.bat"); + outputSaikuZip.addFile( + terminateSaiku + ); + + File readme = new File("resources/README - INSTALLATION AND RUNNING.txt"); + outputSaikuZip.addFile( + readme + ); + + + } catch (IOException e) { + logger.error("Error generating SAIKU tool at " + zipFileOutput.getAbsolutePath() ); } finally{ - starting = false; - if( progressStartSaiku != null ){ - progressStartSaiku.close(); + if( progressMonitor != null ){ + progressMonitor.close(); } + + CollectEarthUtils.openFile( zipFileOutput ); } } }; - - threadInitializingSaiku.start(); - progressStartSaiku.showLater(); - - if( progressStartSaiku.isUserCancelled() ){ - saikuService.setUserCancelledOperation(true); - } + threadGeneratingDB.start(); + + progressMonitor.showLater(); + + } -} \ No newline at end of file +} From 0905a87940f0fe8b9b47d47f2ee2ea1bee68734a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:36 +0100 Subject: [PATCH 0401/1620] New translations IPCCDataExportCSV.java (French) --- .../earth/app/view/Messages_fr.properties | 199 ++++++------------ 1 file changed, 61 insertions(+), 138 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 5ec1dff27b..9365dd0666 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,138 +1,61 @@ -package org.openforis.collect.earth.app.view; - -import java.awt.event.ActionEvent; -import java.io.File; -import java.io.IOException; - -import javax.swing.JFrame; - -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.AnalysisSaikuService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import net.lingala.zip4j.ZipFile; -import net.lingala.zip4j.model.ZipParameters; - -public class SaikuToolExportListener extends SaikuAnalysisListener { - private Logger logger = LoggerFactory.getLogger( SaikuToolExportListener.class); - private LocalPropertiesService localPropertiesService; - - private final static String PREFIX_FOLDER = "saiku-server_2.6"; - - public SaikuToolExportListener(JFrame frame, GenerateDatabaseStarter saikuStarter, LocalPropertiesService localPropertiesService) { - super(frame, saikuStarter); - this.localPropertiesService = localPropertiesService; - } - - @Override - public void actionPerformed(ActionEvent e) { - try { - - File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.SAIKU_ZIP, true, false, "SaikuTool", localPropertiesService, frame); - - if (exportToFile != null && exportToFile.length > 0) { - CollectEarthWindow.startWaiting(frame); - - generateNewSaikuZip( exportToFile[0] ); - } - - }catch (Exception e1) { - logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ - } finally{ - CollectEarthWindow.endWaiting(frame); - } - } - - private void generateNewSaikuZip(File zipFileOutput ) { - InfiniteProgressMonitor progressMonitor = new InfiniteProgressMonitor( - frame, - Messages.getString("SaikuToolExportListener.1"), - Messages.getString("SaikuToolExportListener.2") - ); - - Thread threadGeneratingDB = new Thread("Generating ZIP Saiku Tool"){ //$NON-NLS-1$ - @Override - public void run() { - exportDataToRDB(false); - try ( - ZipFile outputSaikuZip = new ZipFile(zipFileOutput); - ){ - - File saikuFolder = new File(localPropertiesService.getSaikuFolder() ); - File javaFolder = new File( saikuFolder.getAbsolutePath() + "/../java" ); // The Java and Saiku folders are on the same level - - ZipParameters zipParameters = new ZipParameters(); - zipParameters.setExcludeFileFilter( - file -> - file.getName().endsWith( "log") // exclude log files! - || - file.getParent().endsWith("temp" ) // exclude temp folder! - ); - outputSaikuZip.addFolder( saikuFolder, zipParameters ); - - // Copy the original ZIP files contained in the root ( saiku-server_2.6.zip ) to a new temporary file - - // create DB folder - // Copy the Saiku DB to DB/collectEarthDatabase.dbSaiku - zipParameters.setFileNameInZip(PREFIX_FOLDER+"/DB/" + EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME - + EarthConstants.SAIKU_RDB_SUFFIX); - outputSaikuZip.addFile( - new File(AnalysisSaikuService.COLLECT_EARTH_DATABASE_RDB_DB), zipParameters - ); - - // Copy the Mondrian Cube XML to DB/collectEarthCubes.xml - zipParameters = new ZipParameters(); - zipParameters.setFileNameInZip(PREFIX_FOLDER+"/DB/" + AnalysisSaikuService.MDX_XML ); - File mdxFile = new File(localPropertiesService.getProjectFolder() + File.separatorChar + AnalysisSaikuService.MDX_XML); - outputSaikuZip.addFile( - mdxFile, zipParameters - ); - - - // Change the configuration file to use the stand alone version! - - // Add java to the Saiku ZIP - zipParameters = new ZipParameters(); - zipParameters.setRootFolderNameInZip(PREFIX_FOLDER ); - outputSaikuZip.addFolder( javaFolder, zipParameters ); - - - // Move START_SAIKU and TERMINATE SAIKU to the root folder - File startSaiku = new File("resources/START SAIKU.bat"); - outputSaikuZip.addFile( - startSaiku - ); - - File terminateSaiku = new File("resources/TERMINATE SAIKU.bat"); - outputSaikuZip.addFile( - terminateSaiku - ); - - File readme = new File("resources/README - INSTALLATION AND RUNNING.txt"); - outputSaikuZip.addFile( - readme - ); - - - } catch (IOException e) { - logger.error("Error generating SAIKU tool at " + zipFileOutput.getAbsolutePath() ); - } finally{ - if( progressMonitor != null ){ - progressMonitor.close(); - } - - CollectEarthUtils.openFile( zipFileOutput ); - } - } - }; - - threadGeneratingDB.start(); - - progressMonitor.showLater(); - - - } -} +package org.openforis.collect.earth.ipcc; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +import org.openforis.collect.earth.app.service.RDBConnector; +import org.openforis.collect.earth.app.service.SchemaService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; + +import com.opencsv.CSVWriter; + +public abstract class IPCCDataExportCSV extends RDBConnector { + + @Autowired + protected SchemaService schemaService; + Logger logger = LoggerFactory.getLogger(IPCCDataExportCSV.class); + + public IPCCDataExportCSV() { + super(); + } + + protected RowMapper getRowMapper() { + return new RowMapper() { + @Override + public String[] mapRow(ResultSet rs, int rowNum) throws SQLException { + int columnCount = rs.getMetaData().getColumnCount(); + String[] columns = new String[ columnCount ]; + for (int i = 1; i <= columnCount; i++) { + columns[i-1] = rs.getString(i); + } + return columns; + } + }; + } + + protected File createCsv(List luData) throws IOException { + File csvDestination = File.createTempFile("TimeSeriesData", ".csv"); + csvDestination.deleteOnExit(); + try ( + FileWriter fw = new FileWriter(csvDestination); + CSVWriter csvWriter = new CSVWriter(fw) + ){ + + for (String[] row : luData) { + csvWriter.writeNext(row); + } + + } catch (Exception e) { + logger.error("Error generating CSV", e); + } + return csvDestination; + } + +} \ No newline at end of file From 20344fa8e3b495d460eca65e0508ebc14a42c855 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:37 +0100 Subject: [PATCH 0402/1620] New translations IPCCDataExportCSV.java (Spanish) --- .../earth/app/view/Messages_es.properties | 199 ++++++------------ 1 file changed, 61 insertions(+), 138 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 5ec1dff27b..9365dd0666 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,138 +1,61 @@ -package org.openforis.collect.earth.app.view; - -import java.awt.event.ActionEvent; -import java.io.File; -import java.io.IOException; - -import javax.swing.JFrame; - -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.AnalysisSaikuService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import net.lingala.zip4j.ZipFile; -import net.lingala.zip4j.model.ZipParameters; - -public class SaikuToolExportListener extends SaikuAnalysisListener { - private Logger logger = LoggerFactory.getLogger( SaikuToolExportListener.class); - private LocalPropertiesService localPropertiesService; - - private final static String PREFIX_FOLDER = "saiku-server_2.6"; - - public SaikuToolExportListener(JFrame frame, GenerateDatabaseStarter saikuStarter, LocalPropertiesService localPropertiesService) { - super(frame, saikuStarter); - this.localPropertiesService = localPropertiesService; - } - - @Override - public void actionPerformed(ActionEvent e) { - try { - - File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.SAIKU_ZIP, true, false, "SaikuTool", localPropertiesService, frame); - - if (exportToFile != null && exportToFile.length > 0) { - CollectEarthWindow.startWaiting(frame); - - generateNewSaikuZip( exportToFile[0] ); - } - - }catch (Exception e1) { - logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ - } finally{ - CollectEarthWindow.endWaiting(frame); - } - } - - private void generateNewSaikuZip(File zipFileOutput ) { - InfiniteProgressMonitor progressMonitor = new InfiniteProgressMonitor( - frame, - Messages.getString("SaikuToolExportListener.1"), - Messages.getString("SaikuToolExportListener.2") - ); - - Thread threadGeneratingDB = new Thread("Generating ZIP Saiku Tool"){ //$NON-NLS-1$ - @Override - public void run() { - exportDataToRDB(false); - try ( - ZipFile outputSaikuZip = new ZipFile(zipFileOutput); - ){ - - File saikuFolder = new File(localPropertiesService.getSaikuFolder() ); - File javaFolder = new File( saikuFolder.getAbsolutePath() + "/../java" ); // The Java and Saiku folders are on the same level - - ZipParameters zipParameters = new ZipParameters(); - zipParameters.setExcludeFileFilter( - file -> - file.getName().endsWith( "log") // exclude log files! - || - file.getParent().endsWith("temp" ) // exclude temp folder! - ); - outputSaikuZip.addFolder( saikuFolder, zipParameters ); - - // Copy the original ZIP files contained in the root ( saiku-server_2.6.zip ) to a new temporary file - - // create DB folder - // Copy the Saiku DB to DB/collectEarthDatabase.dbSaiku - zipParameters.setFileNameInZip(PREFIX_FOLDER+"/DB/" + EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME - + EarthConstants.SAIKU_RDB_SUFFIX); - outputSaikuZip.addFile( - new File(AnalysisSaikuService.COLLECT_EARTH_DATABASE_RDB_DB), zipParameters - ); - - // Copy the Mondrian Cube XML to DB/collectEarthCubes.xml - zipParameters = new ZipParameters(); - zipParameters.setFileNameInZip(PREFIX_FOLDER+"/DB/" + AnalysisSaikuService.MDX_XML ); - File mdxFile = new File(localPropertiesService.getProjectFolder() + File.separatorChar + AnalysisSaikuService.MDX_XML); - outputSaikuZip.addFile( - mdxFile, zipParameters - ); - - - // Change the configuration file to use the stand alone version! - - // Add java to the Saiku ZIP - zipParameters = new ZipParameters(); - zipParameters.setRootFolderNameInZip(PREFIX_FOLDER ); - outputSaikuZip.addFolder( javaFolder, zipParameters ); - - - // Move START_SAIKU and TERMINATE SAIKU to the root folder - File startSaiku = new File("resources/START SAIKU.bat"); - outputSaikuZip.addFile( - startSaiku - ); - - File terminateSaiku = new File("resources/TERMINATE SAIKU.bat"); - outputSaikuZip.addFile( - terminateSaiku - ); - - File readme = new File("resources/README - INSTALLATION AND RUNNING.txt"); - outputSaikuZip.addFile( - readme - ); - - - } catch (IOException e) { - logger.error("Error generating SAIKU tool at " + zipFileOutput.getAbsolutePath() ); - } finally{ - if( progressMonitor != null ){ - progressMonitor.close(); - } - - CollectEarthUtils.openFile( zipFileOutput ); - } - } - }; - - threadGeneratingDB.start(); - - progressMonitor.showLater(); - - - } -} +package org.openforis.collect.earth.ipcc; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +import org.openforis.collect.earth.app.service.RDBConnector; +import org.openforis.collect.earth.app.service.SchemaService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; + +import com.opencsv.CSVWriter; + +public abstract class IPCCDataExportCSV extends RDBConnector { + + @Autowired + protected SchemaService schemaService; + Logger logger = LoggerFactory.getLogger(IPCCDataExportCSV.class); + + public IPCCDataExportCSV() { + super(); + } + + protected RowMapper getRowMapper() { + return new RowMapper() { + @Override + public String[] mapRow(ResultSet rs, int rowNum) throws SQLException { + int columnCount = rs.getMetaData().getColumnCount(); + String[] columns = new String[ columnCount ]; + for (int i = 1; i <= columnCount; i++) { + columns[i-1] = rs.getString(i); + } + return columns; + } + }; + } + + protected File createCsv(List luData) throws IOException { + File csvDestination = File.createTempFile("TimeSeriesData", ".csv"); + csvDestination.deleteOnExit(); + try ( + FileWriter fw = new FileWriter(csvDestination); + CSVWriter csvWriter = new CSVWriter(fw) + ){ + + for (String[] row : luData) { + csvWriter.writeNext(row); + } + + } catch (Exception e) { + logger.error("Error generating CSV", e); + } + return csvDestination; + } + +} \ No newline at end of file From 2ccde043a224fc4e604c02a8133d0f9e70de9d34 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:38 +0100 Subject: [PATCH 0403/1620] New translations IPCCDataExportCSV.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 199 ++++++------------ 1 file changed, 61 insertions(+), 138 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 5ec1dff27b..9365dd0666 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,138 +1,61 @@ -package org.openforis.collect.earth.app.view; - -import java.awt.event.ActionEvent; -import java.io.File; -import java.io.IOException; - -import javax.swing.JFrame; - -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.AnalysisSaikuService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import net.lingala.zip4j.ZipFile; -import net.lingala.zip4j.model.ZipParameters; - -public class SaikuToolExportListener extends SaikuAnalysisListener { - private Logger logger = LoggerFactory.getLogger( SaikuToolExportListener.class); - private LocalPropertiesService localPropertiesService; - - private final static String PREFIX_FOLDER = "saiku-server_2.6"; - - public SaikuToolExportListener(JFrame frame, GenerateDatabaseStarter saikuStarter, LocalPropertiesService localPropertiesService) { - super(frame, saikuStarter); - this.localPropertiesService = localPropertiesService; - } - - @Override - public void actionPerformed(ActionEvent e) { - try { - - File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.SAIKU_ZIP, true, false, "SaikuTool", localPropertiesService, frame); - - if (exportToFile != null && exportToFile.length > 0) { - CollectEarthWindow.startWaiting(frame); - - generateNewSaikuZip( exportToFile[0] ); - } - - }catch (Exception e1) { - logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ - } finally{ - CollectEarthWindow.endWaiting(frame); - } - } - - private void generateNewSaikuZip(File zipFileOutput ) { - InfiniteProgressMonitor progressMonitor = new InfiniteProgressMonitor( - frame, - Messages.getString("SaikuToolExportListener.1"), - Messages.getString("SaikuToolExportListener.2") - ); - - Thread threadGeneratingDB = new Thread("Generating ZIP Saiku Tool"){ //$NON-NLS-1$ - @Override - public void run() { - exportDataToRDB(false); - try ( - ZipFile outputSaikuZip = new ZipFile(zipFileOutput); - ){ - - File saikuFolder = new File(localPropertiesService.getSaikuFolder() ); - File javaFolder = new File( saikuFolder.getAbsolutePath() + "/../java" ); // The Java and Saiku folders are on the same level - - ZipParameters zipParameters = new ZipParameters(); - zipParameters.setExcludeFileFilter( - file -> - file.getName().endsWith( "log") // exclude log files! - || - file.getParent().endsWith("temp" ) // exclude temp folder! - ); - outputSaikuZip.addFolder( saikuFolder, zipParameters ); - - // Copy the original ZIP files contained in the root ( saiku-server_2.6.zip ) to a new temporary file - - // create DB folder - // Copy the Saiku DB to DB/collectEarthDatabase.dbSaiku - zipParameters.setFileNameInZip(PREFIX_FOLDER+"/DB/" + EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME - + EarthConstants.SAIKU_RDB_SUFFIX); - outputSaikuZip.addFile( - new File(AnalysisSaikuService.COLLECT_EARTH_DATABASE_RDB_DB), zipParameters - ); - - // Copy the Mondrian Cube XML to DB/collectEarthCubes.xml - zipParameters = new ZipParameters(); - zipParameters.setFileNameInZip(PREFIX_FOLDER+"/DB/" + AnalysisSaikuService.MDX_XML ); - File mdxFile = new File(localPropertiesService.getProjectFolder() + File.separatorChar + AnalysisSaikuService.MDX_XML); - outputSaikuZip.addFile( - mdxFile, zipParameters - ); - - - // Change the configuration file to use the stand alone version! - - // Add java to the Saiku ZIP - zipParameters = new ZipParameters(); - zipParameters.setRootFolderNameInZip(PREFIX_FOLDER ); - outputSaikuZip.addFolder( javaFolder, zipParameters ); - - - // Move START_SAIKU and TERMINATE SAIKU to the root folder - File startSaiku = new File("resources/START SAIKU.bat"); - outputSaikuZip.addFile( - startSaiku - ); - - File terminateSaiku = new File("resources/TERMINATE SAIKU.bat"); - outputSaikuZip.addFile( - terminateSaiku - ); - - File readme = new File("resources/README - INSTALLATION AND RUNNING.txt"); - outputSaikuZip.addFile( - readme - ); - - - } catch (IOException e) { - logger.error("Error generating SAIKU tool at " + zipFileOutput.getAbsolutePath() ); - } finally{ - if( progressMonitor != null ){ - progressMonitor.close(); - } - - CollectEarthUtils.openFile( zipFileOutput ); - } - } - }; - - threadGeneratingDB.start(); - - progressMonitor.showLater(); - - - } -} +package org.openforis.collect.earth.ipcc; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +import org.openforis.collect.earth.app.service.RDBConnector; +import org.openforis.collect.earth.app.service.SchemaService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; + +import com.opencsv.CSVWriter; + +public abstract class IPCCDataExportCSV extends RDBConnector { + + @Autowired + protected SchemaService schemaService; + Logger logger = LoggerFactory.getLogger(IPCCDataExportCSV.class); + + public IPCCDataExportCSV() { + super(); + } + + protected RowMapper getRowMapper() { + return new RowMapper() { + @Override + public String[] mapRow(ResultSet rs, int rowNum) throws SQLException { + int columnCount = rs.getMetaData().getColumnCount(); + String[] columns = new String[ columnCount ]; + for (int i = 1; i <= columnCount; i++) { + columns[i-1] = rs.getString(i); + } + return columns; + } + }; + } + + protected File createCsv(List luData) throws IOException { + File csvDestination = File.createTempFile("TimeSeriesData", ".csv"); + csvDestination.deleteOnExit(); + try ( + FileWriter fw = new FileWriter(csvDestination); + CSVWriter csvWriter = new CSVWriter(fw) + ){ + + for (String[] row : luData) { + csvWriter.writeNext(row); + } + + } catch (Exception e) { + logger.error("Error generating CSV", e); + } + return csvDestination; + } + +} \ No newline at end of file From e166b945f342d4b8d9a4b95df3d62f7a4ec0cdca Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:39 +0100 Subject: [PATCH 0404/1620] New translations IPCCDataExportCSV.java (English) --- .../earth/app/view/Messages_en.properties | 199 ++++++------------ 1 file changed, 61 insertions(+), 138 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 5ec1dff27b..9365dd0666 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,138 +1,61 @@ -package org.openforis.collect.earth.app.view; - -import java.awt.event.ActionEvent; -import java.io.File; -import java.io.IOException; - -import javax.swing.JFrame; - -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.AnalysisSaikuService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import net.lingala.zip4j.ZipFile; -import net.lingala.zip4j.model.ZipParameters; - -public class SaikuToolExportListener extends SaikuAnalysisListener { - private Logger logger = LoggerFactory.getLogger( SaikuToolExportListener.class); - private LocalPropertiesService localPropertiesService; - - private final static String PREFIX_FOLDER = "saiku-server_2.6"; - - public SaikuToolExportListener(JFrame frame, GenerateDatabaseStarter saikuStarter, LocalPropertiesService localPropertiesService) { - super(frame, saikuStarter); - this.localPropertiesService = localPropertiesService; - } - - @Override - public void actionPerformed(ActionEvent e) { - try { - - File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.SAIKU_ZIP, true, false, "SaikuTool", localPropertiesService, frame); - - if (exportToFile != null && exportToFile.length > 0) { - CollectEarthWindow.startWaiting(frame); - - generateNewSaikuZip( exportToFile[0] ); - } - - }catch (Exception e1) { - logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ - } finally{ - CollectEarthWindow.endWaiting(frame); - } - } - - private void generateNewSaikuZip(File zipFileOutput ) { - InfiniteProgressMonitor progressMonitor = new InfiniteProgressMonitor( - frame, - Messages.getString("SaikuToolExportListener.1"), - Messages.getString("SaikuToolExportListener.2") - ); - - Thread threadGeneratingDB = new Thread("Generating ZIP Saiku Tool"){ //$NON-NLS-1$ - @Override - public void run() { - exportDataToRDB(false); - try ( - ZipFile outputSaikuZip = new ZipFile(zipFileOutput); - ){ - - File saikuFolder = new File(localPropertiesService.getSaikuFolder() ); - File javaFolder = new File( saikuFolder.getAbsolutePath() + "/../java" ); // The Java and Saiku folders are on the same level - - ZipParameters zipParameters = new ZipParameters(); - zipParameters.setExcludeFileFilter( - file -> - file.getName().endsWith( "log") // exclude log files! - || - file.getParent().endsWith("temp" ) // exclude temp folder! - ); - outputSaikuZip.addFolder( saikuFolder, zipParameters ); - - // Copy the original ZIP files contained in the root ( saiku-server_2.6.zip ) to a new temporary file - - // create DB folder - // Copy the Saiku DB to DB/collectEarthDatabase.dbSaiku - zipParameters.setFileNameInZip(PREFIX_FOLDER+"/DB/" + EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME - + EarthConstants.SAIKU_RDB_SUFFIX); - outputSaikuZip.addFile( - new File(AnalysisSaikuService.COLLECT_EARTH_DATABASE_RDB_DB), zipParameters - ); - - // Copy the Mondrian Cube XML to DB/collectEarthCubes.xml - zipParameters = new ZipParameters(); - zipParameters.setFileNameInZip(PREFIX_FOLDER+"/DB/" + AnalysisSaikuService.MDX_XML ); - File mdxFile = new File(localPropertiesService.getProjectFolder() + File.separatorChar + AnalysisSaikuService.MDX_XML); - outputSaikuZip.addFile( - mdxFile, zipParameters - ); - - - // Change the configuration file to use the stand alone version! - - // Add java to the Saiku ZIP - zipParameters = new ZipParameters(); - zipParameters.setRootFolderNameInZip(PREFIX_FOLDER ); - outputSaikuZip.addFolder( javaFolder, zipParameters ); - - - // Move START_SAIKU and TERMINATE SAIKU to the root folder - File startSaiku = new File("resources/START SAIKU.bat"); - outputSaikuZip.addFile( - startSaiku - ); - - File terminateSaiku = new File("resources/TERMINATE SAIKU.bat"); - outputSaikuZip.addFile( - terminateSaiku - ); - - File readme = new File("resources/README - INSTALLATION AND RUNNING.txt"); - outputSaikuZip.addFile( - readme - ); - - - } catch (IOException e) { - logger.error("Error generating SAIKU tool at " + zipFileOutput.getAbsolutePath() ); - } finally{ - if( progressMonitor != null ){ - progressMonitor.close(); - } - - CollectEarthUtils.openFile( zipFileOutput ); - } - } - }; - - threadGeneratingDB.start(); - - progressMonitor.showLater(); - - - } -} +package org.openforis.collect.earth.ipcc; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +import org.openforis.collect.earth.app.service.RDBConnector; +import org.openforis.collect.earth.app.service.SchemaService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; + +import com.opencsv.CSVWriter; + +public abstract class IPCCDataExportCSV extends RDBConnector { + + @Autowired + protected SchemaService schemaService; + Logger logger = LoggerFactory.getLogger(IPCCDataExportCSV.class); + + public IPCCDataExportCSV() { + super(); + } + + protected RowMapper getRowMapper() { + return new RowMapper() { + @Override + public String[] mapRow(ResultSet rs, int rowNum) throws SQLException { + int columnCount = rs.getMetaData().getColumnCount(); + String[] columns = new String[ columnCount ]; + for (int i = 1; i <= columnCount; i++) { + columns[i-1] = rs.getString(i); + } + return columns; + } + }; + } + + protected File createCsv(List luData) throws IOException { + File csvDestination = File.createTempFile("TimeSeriesData", ".csv"); + csvDestination.deleteOnExit(); + try ( + FileWriter fw = new FileWriter(csvDestination); + CSVWriter csvWriter = new CSVWriter(fw) + ){ + + for (String[] row : luData) { + csvWriter.writeNext(row); + } + + } catch (Exception e) { + logger.error("Error generating CSV", e); + } + return csvDestination; + } + +} \ No newline at end of file From 7962b4be971880e31b48f0d45e2d853dfd472e30 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:40 +0100 Subject: [PATCH 0405/1620] New translations IPCCDataExportLandUnitsCSV.java (French) --- .../earth/app/view/Messages_fr.properties | 86 +++++++++++++------ 1 file changed, 58 insertions(+), 28 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 9365dd0666..1c57311278 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,61 +1,91 @@ package org.openforis.collect.earth.ipcc; import java.io.File; -import java.io.FileWriter; import java.io.IOException; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; -import org.openforis.collect.earth.app.service.RDBConnector; -import org.openforis.collect.earth.app.service.SchemaService; +import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.RegionCalculationUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Component; -import com.opencsv.CSVWriter; +@Component +public class IPCCDataExportLandUnitsCSV extends IPCCDataExportCSV { -public abstract class IPCCDataExportCSV extends RDBConnector { + private String schemaName; - @Autowired - protected SchemaService schemaService; - Logger logger = LoggerFactory.getLogger(IPCCDataExportCSV.class); + Logger logger = LoggerFactory.getLogger(IPCCDataExportLandUnitsCSV.class); + + private final static String LAND_UNIT_ID = "land_unit_id"; - public IPCCDataExportCSV() { + public IPCCDataExportLandUnitsCSV() { super(); + setExportTypeUsed(ExportType.IPCC); + } + + public File generateTimeseriesData( int startYear, int endYear ) throws IOException { + schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); + List luCombinations = generateLUCombinations(startYear, endYear); + return createCsv( luCombinations); } + @Override protected RowMapper getRowMapper() { return new RowMapper() { @Override public String[] mapRow(ResultSet rs, int rowNum) throws SQLException { int columnCount = rs.getMetaData().getColumnCount(); + columnCount++; // adding an extra column with the row number String[] columns = new String[ columnCount ]; - for (int i = 1; i <= columnCount; i++) { - columns[i-1] = rs.getString(i); + columns[0] = "LU_" + String.format("%04d", rs.getRow()) ; + for (int i = 1; i < columnCount; i++) { + columns[i] = rs.getString(i); } return columns; } }; } - - protected File createCsv(List luData) throws IOException { - File csvDestination = File.createTempFile("TimeSeriesData", ".csv"); - csvDestination.deleteOnExit(); - try ( - FileWriter fw = new FileWriter(csvDestination); - CSVWriter csvWriter = new CSVWriter(fw) - ){ - - for (String[] row : luData) { - csvWriter.writeNext(row); - } - } catch (Exception e) { - logger.error("Error generating CSV", e); + private List generateLUCombinations(int startYear, int endYear) { + String selectedYears = IPCCDataExportTimeSeries.CLIMATE_COLUMN_LABEL + + ", " + IPCCDataExportTimeSeries.SOIL_COLUMN_LABEL + + ", " + IPCCDataExportTimeSeries.GEZ_COLUMN_LABEL + ", " ; + for( int year = startYear ; year <= endYear; year++ ) { + selectedYears += IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + ","; } - return csvDestination; + + String sqlSelect = "select " + + selectedYears + + " sum( " + RegionCalculationUtils.EXPANSION_FACTOR + ")" + + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.SOIL_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.CLIMATE_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.GEZ_TABLE + + + " where " + + IPCCDataExportTimeSeries.SOIL_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.SOIL_COLUMN_ID + + " and " + + IPCCDataExportTimeSeries.CLIMATE_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_ID + + " and " + + IPCCDataExportTimeSeries.GEZ_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.GEZ_COLUMN_ID + + + " GROUP BY " + + selectedYears.substring(0, selectedYears.length()-1) + + " ORDER BY sum( "+ RegionCalculationUtils.EXPANSION_FACTOR + " ) DESC"; // Remove trailing comma from list of years + + + List luData = getJdbcTemplate().query( + sqlSelect + , + getRowMapper() + ); + + selectedYears= LAND_UNIT_ID + "," + selectedYears; // Add the Land Unit ID which is basically the row number + selectedYears+= "area"; // so the area columns appears too + luData.add( 0, selectedYears.split(",") ); // Add the header row for the CSV output in the first position of the List + return luData; } -} \ No newline at end of file +} From a340f2dbcba0d2f86540dcd211d5d3e1c25afb2f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:41 +0100 Subject: [PATCH 0406/1620] New translations IPCCDataExportLandUnitsCSV.java (Spanish) --- .../earth/app/view/Messages_es.properties | 86 +++++++++++++------ 1 file changed, 58 insertions(+), 28 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 9365dd0666..1c57311278 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,61 +1,91 @@ package org.openforis.collect.earth.ipcc; import java.io.File; -import java.io.FileWriter; import java.io.IOException; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; -import org.openforis.collect.earth.app.service.RDBConnector; -import org.openforis.collect.earth.app.service.SchemaService; +import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.RegionCalculationUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Component; -import com.opencsv.CSVWriter; +@Component +public class IPCCDataExportLandUnitsCSV extends IPCCDataExportCSV { -public abstract class IPCCDataExportCSV extends RDBConnector { + private String schemaName; - @Autowired - protected SchemaService schemaService; - Logger logger = LoggerFactory.getLogger(IPCCDataExportCSV.class); + Logger logger = LoggerFactory.getLogger(IPCCDataExportLandUnitsCSV.class); + + private final static String LAND_UNIT_ID = "land_unit_id"; - public IPCCDataExportCSV() { + public IPCCDataExportLandUnitsCSV() { super(); + setExportTypeUsed(ExportType.IPCC); + } + + public File generateTimeseriesData( int startYear, int endYear ) throws IOException { + schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); + List luCombinations = generateLUCombinations(startYear, endYear); + return createCsv( luCombinations); } + @Override protected RowMapper getRowMapper() { return new RowMapper() { @Override public String[] mapRow(ResultSet rs, int rowNum) throws SQLException { int columnCount = rs.getMetaData().getColumnCount(); + columnCount++; // adding an extra column with the row number String[] columns = new String[ columnCount ]; - for (int i = 1; i <= columnCount; i++) { - columns[i-1] = rs.getString(i); + columns[0] = "LU_" + String.format("%04d", rs.getRow()) ; + for (int i = 1; i < columnCount; i++) { + columns[i] = rs.getString(i); } return columns; } }; } - - protected File createCsv(List luData) throws IOException { - File csvDestination = File.createTempFile("TimeSeriesData", ".csv"); - csvDestination.deleteOnExit(); - try ( - FileWriter fw = new FileWriter(csvDestination); - CSVWriter csvWriter = new CSVWriter(fw) - ){ - - for (String[] row : luData) { - csvWriter.writeNext(row); - } - } catch (Exception e) { - logger.error("Error generating CSV", e); + private List generateLUCombinations(int startYear, int endYear) { + String selectedYears = IPCCDataExportTimeSeries.CLIMATE_COLUMN_LABEL + + ", " + IPCCDataExportTimeSeries.SOIL_COLUMN_LABEL + + ", " + IPCCDataExportTimeSeries.GEZ_COLUMN_LABEL + ", " ; + for( int year = startYear ; year <= endYear; year++ ) { + selectedYears += IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + ","; } - return csvDestination; + + String sqlSelect = "select " + + selectedYears + + " sum( " + RegionCalculationUtils.EXPANSION_FACTOR + ")" + + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.SOIL_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.CLIMATE_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.GEZ_TABLE + + + " where " + + IPCCDataExportTimeSeries.SOIL_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.SOIL_COLUMN_ID + + " and " + + IPCCDataExportTimeSeries.CLIMATE_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_ID + + " and " + + IPCCDataExportTimeSeries.GEZ_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.GEZ_COLUMN_ID + + + " GROUP BY " + + selectedYears.substring(0, selectedYears.length()-1) + + " ORDER BY sum( "+ RegionCalculationUtils.EXPANSION_FACTOR + " ) DESC"; // Remove trailing comma from list of years + + + List luData = getJdbcTemplate().query( + sqlSelect + , + getRowMapper() + ); + + selectedYears= LAND_UNIT_ID + "," + selectedYears; // Add the Land Unit ID which is basically the row number + selectedYears+= "area"; // so the area columns appears too + luData.add( 0, selectedYears.split(",") ); // Add the header row for the CSV output in the first position of the List + return luData; } -} \ No newline at end of file +} From aca657f9ebfa9dbac87f6f65ed3ab9f03eca8377 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:42 +0100 Subject: [PATCH 0407/1620] New translations IPCCGenerator.java (English) --- .../earth/app/view/Messages_en.properties | 182 ++++++++++++++---- 1 file changed, 142 insertions(+), 40 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 9365dd0666..4dbb57be78 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,61 +1,163 @@ +/** + * Main class to generate the IPCC Inventory Software compliant file + */ package org.openforis.collect.earth.ipcc; import java.io.File; -import java.io.FileWriter; import java.io.IOException; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; +import java.util.Calendar; -import org.openforis.collect.earth.app.service.RDBConnector; -import org.openforis.collect.earth.app.service.SchemaService; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.view.DataFormat; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.app.view.JFileChooserExistsAware; +import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; +import org.openforis.collect.earth.ipcc.controller.StratumUtils; +import org.openforis.collect.earth.ipcc.view.AssignSubdivisionTypesWizard; +import org.openforis.idm.metamodel.Survey; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Component; -import com.opencsv.CSVWriter; +/** + * @author Alfonso Sanchez-Paus + * + */ +@Component +public class IPCCGenerator { -public abstract class IPCCDataExportCSV extends RDBConnector { + @Autowired + IPCCRDBGenerator ipccRdbGenerator; + + @Autowired + IPCCDataExportTimeSeriesXML ipccDataExportToXML; + + @Autowired + LocalPropertiesService localPropertiesService; @Autowired - protected SchemaService schemaService; - Logger logger = LoggerFactory.getLogger(IPCCDataExportCSV.class); + IPCCDataExportMatrixExcel dataExportMatrixExcel; + + @Autowired + IPCCDataExportMatrixExtendedExcel dataExportMatrixExtendedExcel; + + @Autowired + IPCCDataExportLandUnitsCSV dataExportLandUnitsCSV; + + @Autowired + IPCCDataExportPerPlotCSV dataExportPerPlotCSV; + + @Autowired + IPCCLandUses landUses; + + IPCCSurveyAdapter ipccSurveyAdapter; - public IPCCDataExportCSV() { - super(); - } + Logger logger = LoggerFactory.getLogger( IPCCGenerator.class ); - protected RowMapper getRowMapper() { - return new RowMapper() { - @Override - public String[] mapRow(ResultSet rs, int rowNum) throws SQLException { - int columnCount = rs.getMetaData().getColumnCount(); - String[] columns = new String[ columnCount ]; - for (int i = 1; i <= columnCount; i++) { - columns[i-1] = rs.getString(i); - } - return columns; - } - }; + public static final int END_YEAR = Calendar.getInstance().get(Calendar.YEAR); // Assume the last year is current year + public static final int START_YEAR = 2000; // Assume start year at 2000 + + public File generateRDB( Survey survey, InfiniteProgressMonitor progressListener) throws IPCCGeneratorException { + + ipccSurveyAdapter = new IPCCSurveyAdapter(); + + // Add attributes for each year containing the LU Category and Subdivision if not present + Survey modifiedSurvey = ipccSurveyAdapter.addIPCCAttributesToSurvey( survey ); + + // Generate Relational Database of the survey data + ipccRdbGenerator.generateRelationalDatabase( modifiedSurvey, progressListener); + + return null; } - protected File createCsv(List luData) throws IOException { - File csvDestination = File.createTempFile("TimeSeriesData", ".csv"); - csvDestination.deleteOnExit(); - try ( - FileWriter fw = new FileWriter(csvDestination); - CSVWriter csvWriter = new CSVWriter(fw) - ){ + public void produceOutputs( Survey survey, InfiniteProgressMonitor progressListener ) { + + progressListener.hide(); + + // Assign Management types to the Land Use Subdivisions found in the survey data + AssignSubdivisionTypesWizard wizard = new AssignSubdivisionTypesWizard(); + wizard.initializeTypes(landUses.getLandUseSubdivisions()); + + if( !wizard.isWizardFinished() ) { + logger.info( "The user closed the wizard without finishing assigning management types"); + return; + } + + File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.GHGI_ZIP_FILE, true, false, "LandUseForGHGi", localPropertiesService, null); + + if( exportToFile== null || exportToFile.length != 1 ) { + logger.info("The user should choose a ZIP file to export the results to! No file chosen, aborting the rest of the execution"); + return; + } + + try { + File destinationZip = exportToFile[0]; + + final int STEPS = 7; + int currentStep = 1; + + progressListener.show(); + + progressListener.updateProgress(currentStep++, STEPS, "Generating CSV aggregated time-series" ); + // Extract data from the Relational Database into an excel file of transition Matrixes per year + File landUnitsCSVFile =dataExportLandUnitsCSV.generateTimeseriesData(START_YEAR, END_YEAR); + if( progressListener.isUserCancelled() ) return; + + progressListener.updateProgress(currentStep++, STEPS, "Generating CSV per plot time-series" ); + // Extract data from the Relational Database into an excel file of transition Matrixes per year + File perPlotCSVFile =dataExportPerPlotCSV.generateTimeseriesData(START_YEAR, END_YEAR); + if( progressListener.isUserCancelled() ) return; - for (String[] row : luData) { - csvWriter.writeNext(row); + progressListener.updateProgress(currentStep++, STEPS, "Generating survey setup files" ); + // Generate list of subdivisions in survey + File subdivisionsFile = LandUseSubdivisionUtils.getSubdivisionsXML(); + File climateZones = StratumUtils.getClimateZonesXML( survey ); + File ecologicalZones = StratumUtils.getEcologicalZonesXML( survey ); + File soilTypes = StratumUtils.getSoilTypesXML( survey ); + if( progressListener.isUserCancelled() ) return; + + progressListener.updateProgress(currentStep++, STEPS, "Generating XML timeseries file" ); + // Extract data from the Relational Database into an XML File with information per year + File timeseriesXMLFile =ipccDataExportToXML.generateTimeseriesData(IPCCGenerator.START_YEAR, IPCCGenerator.END_YEAR ); + if( progressListener.isUserCancelled() ) return; + + progressListener.updateProgress(currentStep++, STEPS, "Generating Excel LU Matrixes per year" ); + // Extract data from the Relational Database into an excel file of transition Matrixes per year + File matrixXLSFile =dataExportMatrixExcel.generateTimeseriesData(START_YEAR, END_YEAR); + if( progressListener.isUserCancelled() ) return; + + progressListener.updateProgress(currentStep++, STEPS, "Generating Excel LU Matrixes per year STRATIFIED" ); + // Extract data from the Relational Database into an excel file of transition Matrixes per year + File matrixXLSExtendedFile =dataExportMatrixExtendedExcel.generateTimeseriesData(START_YEAR, END_YEAR); + if( progressListener.isUserCancelled() ) return; + + try { + progressListener.updateProgress(currentStep++, STEPS, "Compressing files into selected destination" ); + CollectEarthUtils.addFileToZip( destinationZip , timeseriesXMLFile, "LU_Timeseries.xml"); + CollectEarthUtils.addFileToZip( destinationZip , matrixXLSFile, "LU_Matrixes.xls"); + CollectEarthUtils.addFileToZip( destinationZip , matrixXLSExtendedFile, "LU_Matrixes_stratified.xls"); + CollectEarthUtils.addFileToZip( destinationZip , subdivisionsFile, "ConfigLandUseSubdivisions.xml"); + CollectEarthUtils.addFileToZip( destinationZip , climateZones, "ConfigClimateZones.xml"); + CollectEarthUtils.addFileToZip( destinationZip , ecologicalZones, "ConfigEclogicalZones.xml"); + CollectEarthUtils.addFileToZip( destinationZip , soilTypes, "ConfigSoilTypes.xml"); + CollectEarthUtils.addFileToZip( destinationZip , landUnitsCSVFile, "LU_Timeseries_grouped.csv"); + CollectEarthUtils.addFileToZip( destinationZip , perPlotCSVFile, "LU_Timeseries_per_plot.csv"); + progressListener.hide(); + } catch (IOException e) { + logger.error("Error when creating ZIP file with timeseries content " + destinationZip, e); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (Exception e) { + logger.error("Error when zipping the timeseries content into " + destinationZip, e); //$NON-NLS-1$ //$NON-NLS-2$ } - - } catch (Exception e) { - logger.error("Error generating CSV", e); + + // Open the ZIP file automatically to inspect the output + CollectEarthUtils.openFile( destinationZip ); + + } catch (IOException e) { + logger.error("Error generating file", e); } - return csvDestination; + } -} \ No newline at end of file +} From e9dcc070a0207cff485d9cef51379f8880ca79ce Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:43 +0100 Subject: [PATCH 0408/1620] New translations IPCCGeneratorException.java (French) --- .../earth/app/view/Messages_fr.properties | 93 ++++--------------- 1 file changed, 17 insertions(+), 76 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 1c57311278..fed659b97f 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,91 +1,32 @@ package org.openforis.collect.earth.ipcc; -import java.io.File; -import java.io.IOException; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; +public class IPCCGeneratorException extends RdbExportException { -import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.RegionCalculationUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.jdbc.core.RowMapper; -import org.springframework.stereotype.Component; + /** + * + */ + private static final long serialVersionUID = 6236105290795112340L; -@Component -public class IPCCDataExportLandUnitsCSV extends IPCCDataExportCSV { - - private String schemaName; - - Logger logger = LoggerFactory.getLogger(IPCCDataExportLandUnitsCSV.class); - - private final static String LAND_UNIT_ID = "land_unit_id"; - - public IPCCDataExportLandUnitsCSV() { + public IPCCGeneratorException() { super(); - setExportTypeUsed(ExportType.IPCC); + // TODO Auto-generated constructor stub } - public File generateTimeseriesData( int startYear, int endYear ) throws IOException { - schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - List luCombinations = generateLUCombinations(startYear, endYear); - return createCsv( luCombinations); + public IPCCGeneratorException(String message, Throwable cause, boolean enableSuppression, + boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); } - @Override - protected RowMapper getRowMapper() { - return new RowMapper() { - @Override - public String[] mapRow(ResultSet rs, int rowNum) throws SQLException { - int columnCount = rs.getMetaData().getColumnCount(); - columnCount++; // adding an extra column with the row number - String[] columns = new String[ columnCount ]; - columns[0] = "LU_" + String.format("%04d", rs.getRow()) ; - for (int i = 1; i < columnCount; i++) { - columns[i] = rs.getString(i); - } - return columns; - } - }; + public IPCCGeneratorException(String message, Throwable cause) { + super(message, cause); } - - private List generateLUCombinations(int startYear, int endYear) { - String selectedYears = IPCCDataExportTimeSeries.CLIMATE_COLUMN_LABEL + - ", " + IPCCDataExportTimeSeries.SOIL_COLUMN_LABEL + - ", " + IPCCDataExportTimeSeries.GEZ_COLUMN_LABEL + ", " ; - for( int year = startYear ; year <= endYear; year++ ) { - selectedYears += IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + ","; - } - String sqlSelect = "select " - + selectedYears - + " sum( " + RegionCalculationUtils.EXPANSION_FACTOR + ")" - + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.SOIL_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.CLIMATE_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.GEZ_TABLE - - + " where " - + IPCCDataExportTimeSeries.SOIL_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.SOIL_COLUMN_ID - + " and " - + IPCCDataExportTimeSeries.CLIMATE_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_ID - + " and " - + IPCCDataExportTimeSeries.GEZ_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.GEZ_COLUMN_ID - - + " GROUP BY " - + selectedYears.substring(0, selectedYears.length()-1) - + " ORDER BY sum( "+ RegionCalculationUtils.EXPANSION_FACTOR + " ) DESC"; // Remove trailing comma from list of years - - - List luData = getJdbcTemplate().query( - sqlSelect - , - getRowMapper() - ); + public IPCCGeneratorException(String message) { + super(message); + } - selectedYears= LAND_UNIT_ID + "," + selectedYears; // Add the Land Unit ID which is basically the row number - selectedYears+= "area"; // so the area columns appears too - luData.add( 0, selectedYears.split(",") ); // Add the header row for the CSV output in the first position of the List - return luData; + public IPCCGeneratorException(Throwable cause) { + super(cause); } } From b8aae70abcf1e212607036125ad039be038d999b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:44 +0100 Subject: [PATCH 0409/1620] New translations LandUseSubdivisionUtils.java (Spanish) --- .../earth/app/view/Messages_es.properties | 143 ++++++++++-------- 1 file changed, 76 insertions(+), 67 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 1c57311278..572652125f 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,91 +1,100 @@ -package org.openforis.collect.earth.ipcc; +package org.openforis.collect.earth.ipcc.controller; import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; -import java.sql.ResultSet; -import java.sql.SQLException; +import java.util.ArrayList; import java.util.List; -import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.RegionCalculationUtils; +import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; +import org.openforis.collect.earth.ipcc.model.ForestSubdivision; +import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; +import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; +import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; +import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.jdbc.core.RowMapper; -import org.springframework.stereotype.Component; -@Component -public class IPCCDataExportLandUnitsCSV extends IPCCDataExportCSV { +import com.thoughtworks.xstream.XStream; - private String schemaName; - Logger logger = LoggerFactory.getLogger(IPCCDataExportLandUnitsCSV.class); +public class LandUseSubdivisionUtils { - private final static String LAND_UNIT_ID = "land_unit_id"; + private static Logger logger = LoggerFactory.getLogger( LandUseSubdivisionUtils.class ); + + static List landUseSubdivisions; - public IPCCDataExportLandUnitsCSV() { - super(); - setExportTypeUsed(ExportType.IPCC); + public static List> getSubdivisionsByCategory(LandUseCategory category) { + List> subdivisionsInCategory = new ArrayList>(); + for (LandUseSubdivision landUseSubdivision : landUseSubdivisions) { + if( landUseSubdivision.getCategory().equals( category ) ) { + subdivisionsInCategory.add(landUseSubdivision); + } + } + + return subdivisionsInCategory; + } + + public static void setSubdivisionType(LandUseSubdivision subdivision, Object type) { + landUseSubdivisions.get( landUseSubdivisions.indexOf(subdivision)).setType( type); } - public File generateTimeseriesData( int startYear, int endYear ) throws IOException { - schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - List luCombinations = generateLUCombinations(startYear, endYear); - return createCsv( luCombinations); + public static List getLandUseSubdivisions() { + return landUseSubdivisions; } - @Override - protected RowMapper getRowMapper() { - return new RowMapper() { - @Override - public String[] mapRow(ResultSet rs, int rowNum) throws SQLException { - int columnCount = rs.getMetaData().getColumnCount(); - columnCount++; // adding an extra column with the row number - String[] columns = new String[ columnCount ]; - columns[0] = "LU_" + String.format("%04d", rs.getRow()) ; - for (int i = 1; i < columnCount; i++) { - columns[i] = rs.getString(i); - } - return columns; - } - }; + public static void setLandUseSubdivisions(List landUseSubdivisions) { + LandUseSubdivisionUtils.landUseSubdivisions = landUseSubdivisions; } - private List generateLUCombinations(int startYear, int endYear) { - String selectedYears = IPCCDataExportTimeSeries.CLIMATE_COLUMN_LABEL + - ", " + IPCCDataExportTimeSeries.SOIL_COLUMN_LABEL + - ", " + IPCCDataExportTimeSeries.GEZ_COLUMN_LABEL + ", " ; - for( int year = startYear ; year <= endYear; year++ ) { - selectedYears += IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + ","; + public static LandUseSubdivision getSubdivision( String luCategoryCode, String luSubdivisionCode ) { + + LandUseCategory[] luCategories = LandUseCategory.values(); + LandUseCategory landUseCategory = null; + for (LandUseCategory luCat : luCategories) { + if( luCat.getCode().equals(luCategoryCode)) { + landUseCategory = luCat; + } } - - String sqlSelect = "select " - + selectedYears - + " sum( " + RegionCalculationUtils.EXPANSION_FACTOR + ")" - + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.SOIL_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.CLIMATE_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.GEZ_TABLE - - + " where " - + IPCCDataExportTimeSeries.SOIL_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.SOIL_COLUMN_ID - + " and " - + IPCCDataExportTimeSeries.CLIMATE_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_ID - + " and " - + IPCCDataExportTimeSeries.GEZ_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.GEZ_COLUMN_ID - - + " GROUP BY " - + selectedYears.substring(0, selectedYears.length()-1) - + " ORDER BY sum( "+ RegionCalculationUtils.EXPANSION_FACTOR + " ) DESC"; // Remove trailing comma from list of years + for (LandUseSubdivision landUseSubdiv : landUseSubdivisions) { + if( landUseSubdiv.getCategory().equals(landUseCategory) && landUseSubdiv.getCode().equals( luSubdivisionCode ) ) { + return landUseSubdiv; + } + + } - List luData = getJdbcTemplate().query( - sqlSelect - , - getRowMapper() - ); - - selectedYears= LAND_UNIT_ID + "," + selectedYears; // Add the Land Unit ID which is basically the row number - selectedYears+= "area"; // so the area columns appears too - luData.add( 0, selectedYears.split(",") ); // Add the header row for the CSV output in the first position of the List - return luData; + logger.info("No LU Subdivision found for category : " + luCategoryCode + " / subdivision code : " + luSubdivisionCode ); + return null; + } + + public static File getSubdivisionsXML() throws IOException { + XStream xStream = new XStream(); + + final String subdivisionLabel = "Subdivision"; + + xStream.alias(subdivisionLabel, ForestSubdivision.class); + xStream.alias(subdivisionLabel, CroplandSubdivision.class); + xStream.alias(subdivisionLabel, SettlementSubdivision.class); + xStream.alias(subdivisionLabel, OtherlandSubdivision.class); + xStream.alias(subdivisionLabel, GrasslandSubdivision.class); + xStream.alias(subdivisionLabel, WetlandSubdivision.class); + + xStream.setMode(XStream.NO_REFERENCES); + String xmlSchema = xStream.toXML(getLandUseSubdivisions()); + + File xmlFileDestination = File.createTempFile( "subdivisionsInSurvey", ".xml" ); + xmlFileDestination.deleteOnExit(); + try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { + byte[] strToBytes = xmlSchema.getBytes(); + outputStream.write(strToBytes); + } catch (Exception e) { + logger.error("Error saving data to file", e); + } + + return xmlFileDestination; } } From b17a45704e23cef83edbf56354958e9e2f672776 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:45 +0100 Subject: [PATCH 0410/1620] New translations StratumPerYearData.java (French) --- .../earth/app/view/Messages_fr.properties | 56 +++++++++++++------ 1 file changed, 39 insertions(+), 17 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index fed659b97f..1a7a0b1759 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,32 +1,54 @@ package org.openforis.collect.earth.ipcc; -public class IPCCGeneratorException extends RdbExportException { +import liquibase.repackaged.org.apache.commons.lang3.ArrayUtils; + +public class StratumPerYearData extends YearData{ + + private String climate; + private String soil; + private String gez; + public StratumPerYearData(int year, String climate, String soil, String gez) { + super(year); + this.climate = climate; + this.soil = soil; + this.gez = gez; + } - /** - * - */ - private static final long serialVersionUID = 6236105290795112340L; - public IPCCGeneratorException() { - super(); - // TODO Auto-generated constructor stub + @Override + public String toString() { + return "StratumPerYearData [year=" + year + ", climate=" + climate + ", soil=" + soil + ", gez=" + gez + + ", luData=" + ArrayUtils.toString( luData ) + "]"; } - public IPCCGeneratorException(String message, Throwable cause, boolean enableSuppression, - boolean writableStackTrace) { - super(message, cause, enableSuppression, writableStackTrace); + + public String getClimate() { + return climate; } - public IPCCGeneratorException(String message, Throwable cause) { - super(message, cause); + + public String getSoil() { + return soil; } - public IPCCGeneratorException(String message) { - super(message); + + public String getGez() { + return gez; } - public IPCCGeneratorException(Throwable cause) { - super(cause); + + public void setClimate(String climate) { + this.climate = climate; + } + + + public void setSoil(String soil) { + this.soil = soil; + } + + + public void setGez(String gez) { + this.gez = gez; } } From 7b1bb4a145d60aecf9ce2596e1331faa4371e4f6 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:46 +0100 Subject: [PATCH 0411/1620] New translations StratumPerYearData.java (Spanish) --- .../earth/app/view/Messages_es.properties | 134 ++++++------------ 1 file changed, 44 insertions(+), 90 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 572652125f..1a7a0b1759 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,100 +1,54 @@ -package org.openforis.collect.earth.ipcc.controller; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; -import org.openforis.collect.earth.ipcc.model.ForestSubdivision; -import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; -import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; -import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; -import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.thoughtworks.xstream.XStream; - - -public class LandUseSubdivisionUtils { - - private static Logger logger = LoggerFactory.getLogger( LandUseSubdivisionUtils.class ); - - static List landUseSubdivisions; - - public static List> getSubdivisionsByCategory(LandUseCategory category) { - List> subdivisionsInCategory = new ArrayList>(); - for (LandUseSubdivision landUseSubdivision : landUseSubdivisions) { - if( landUseSubdivision.getCategory().equals( category ) ) { - subdivisionsInCategory.add(landUseSubdivision); - } - } - - return subdivisionsInCategory; +package org.openforis.collect.earth.ipcc; + +import liquibase.repackaged.org.apache.commons.lang3.ArrayUtils; + +public class StratumPerYearData extends YearData{ + + private String climate; + private String soil; + private String gez; + public StratumPerYearData(int year, String climate, String soil, String gez) { + super(year); + this.climate = climate; + this.soil = soil; + this.gez = gez; } - - public static void setSubdivisionType(LandUseSubdivision subdivision, Object type) { - landUseSubdivisions.get( landUseSubdivisions.indexOf(subdivision)).setType( type); + + + @Override + public String toString() { + return "StratumPerYearData [year=" + year + ", climate=" + climate + ", soil=" + soil + ", gez=" + gez + + ", luData=" + ArrayUtils.toString( luData ) + "]"; } - public static List getLandUseSubdivisions() { - return landUseSubdivisions; + + public String getClimate() { + return climate; } - public static void setLandUseSubdivisions(List landUseSubdivisions) { - LandUseSubdivisionUtils.landUseSubdivisions = landUseSubdivisions; + + public String getSoil() { + return soil; } - - public static LandUseSubdivision getSubdivision( String luCategoryCode, String luSubdivisionCode ) { - - LandUseCategory[] luCategories = LandUseCategory.values(); - LandUseCategory landUseCategory = null; - for (LandUseCategory luCat : luCategories) { - if( luCat.getCode().equals(luCategoryCode)) { - landUseCategory = luCat; - } - } - - for (LandUseSubdivision landUseSubdiv : landUseSubdivisions) { - if( landUseSubdiv.getCategory().equals(landUseCategory) && landUseSubdiv.getCode().equals( luSubdivisionCode ) ) { - return landUseSubdiv; - } - - } - - logger.info("No LU Subdivision found for category : " + luCategoryCode + " / subdivision code : " + luSubdivisionCode ); - return null; + + + public String getGez() { + return gez; } - - public static File getSubdivisionsXML() throws IOException { - XStream xStream = new XStream(); - - final String subdivisionLabel = "Subdivision"; - - xStream.alias(subdivisionLabel, ForestSubdivision.class); - xStream.alias(subdivisionLabel, CroplandSubdivision.class); - xStream.alias(subdivisionLabel, SettlementSubdivision.class); - xStream.alias(subdivisionLabel, OtherlandSubdivision.class); - xStream.alias(subdivisionLabel, GrasslandSubdivision.class); - xStream.alias(subdivisionLabel, WetlandSubdivision.class); - - xStream.setMode(XStream.NO_REFERENCES); - String xmlSchema = xStream.toXML(getLandUseSubdivisions()); - - File xmlFileDestination = File.createTempFile( "subdivisionsInSurvey", ".xml" ); - xmlFileDestination.deleteOnExit(); - try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { - byte[] strToBytes = xmlSchema.getBytes(); - outputStream.write(strToBytes); - } catch (Exception e) { - logger.error("Error saving data to file", e); - } - - return xmlFileDestination; + + + public void setClimate(String climate) { + this.climate = climate; + } + + + public void setSoil(String soil) { + this.soil = soil; + } + + + public void setGez(String gez) { + this.gez = gez; } } From 689edfc0a3c5a6b4dfa27e09526cbb0f194dfca8 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:47 +0100 Subject: [PATCH 0412/1620] New translations StratumPerYearData.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 111 ++++++++---------- 1 file changed, 52 insertions(+), 59 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 9365dd0666..1a7a0b1759 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,61 +1,54 @@ package org.openforis.collect.earth.ipcc; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; - -import org.openforis.collect.earth.app.service.RDBConnector; -import org.openforis.collect.earth.app.service.SchemaService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.RowMapper; - -import com.opencsv.CSVWriter; - -public abstract class IPCCDataExportCSV extends RDBConnector { - - @Autowired - protected SchemaService schemaService; - Logger logger = LoggerFactory.getLogger(IPCCDataExportCSV.class); - - public IPCCDataExportCSV() { - super(); - } - - protected RowMapper getRowMapper() { - return new RowMapper() { - @Override - public String[] mapRow(ResultSet rs, int rowNum) throws SQLException { - int columnCount = rs.getMetaData().getColumnCount(); - String[] columns = new String[ columnCount ]; - for (int i = 1; i <= columnCount; i++) { - columns[i-1] = rs.getString(i); - } - return columns; - } - }; - } - - protected File createCsv(List luData) throws IOException { - File csvDestination = File.createTempFile("TimeSeriesData", ".csv"); - csvDestination.deleteOnExit(); - try ( - FileWriter fw = new FileWriter(csvDestination); - CSVWriter csvWriter = new CSVWriter(fw) - ){ - - for (String[] row : luData) { - csvWriter.writeNext(row); - } - - } catch (Exception e) { - logger.error("Error generating CSV", e); - } - return csvDestination; - } - -} \ No newline at end of file +import liquibase.repackaged.org.apache.commons.lang3.ArrayUtils; + +public class StratumPerYearData extends YearData{ + + private String climate; + private String soil; + private String gez; + public StratumPerYearData(int year, String climate, String soil, String gez) { + super(year); + this.climate = climate; + this.soil = soil; + this.gez = gez; + } + + + @Override + public String toString() { + return "StratumPerYearData [year=" + year + ", climate=" + climate + ", soil=" + soil + ", gez=" + gez + + ", luData=" + ArrayUtils.toString( luData ) + "]"; + } + + + public String getClimate() { + return climate; + } + + + public String getSoil() { + return soil; + } + + + public String getGez() { + return gez; + } + + + public void setClimate(String climate) { + this.climate = climate; + } + + + public void setSoil(String soil) { + this.soil = soil; + } + + + public void setGez(String gez) { + this.gez = gez; + } + +} From 09c907041201a9c22e2da98c2b099f03ea13aa1a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:48 +0100 Subject: [PATCH 0413/1620] New translations StratumPerYearData.java (English) --- .../earth/app/view/Messages_en.properties | 201 ++++-------------- 1 file changed, 46 insertions(+), 155 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 4dbb57be78..1a7a0b1759 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,163 +1,54 @@ -/** - * Main class to generate the IPCC Inventory Software compliant file - */ package org.openforis.collect.earth.ipcc; -import java.io.File; -import java.io.IOException; -import java.util.Calendar; - -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.view.DataFormat; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.app.view.JFileChooserExistsAware; -import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; -import org.openforis.collect.earth.ipcc.controller.StratumUtils; -import org.openforis.collect.earth.ipcc.view.AssignSubdivisionTypesWizard; -import org.openforis.idm.metamodel.Survey; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -/** - * @author Alfonso Sanchez-Paus - * - */ -@Component -public class IPCCGenerator { - - @Autowired - IPCCRDBGenerator ipccRdbGenerator; - - @Autowired - IPCCDataExportTimeSeriesXML ipccDataExportToXML; - - @Autowired - LocalPropertiesService localPropertiesService; - - @Autowired - IPCCDataExportMatrixExcel dataExportMatrixExcel; - - @Autowired - IPCCDataExportMatrixExtendedExcel dataExportMatrixExtendedExcel; - - @Autowired - IPCCDataExportLandUnitsCSV dataExportLandUnitsCSV; - - @Autowired - IPCCDataExportPerPlotCSV dataExportPerPlotCSV; - - @Autowired - IPCCLandUses landUses; - - IPCCSurveyAdapter ipccSurveyAdapter; - - Logger logger = LoggerFactory.getLogger( IPCCGenerator.class ); - - public static final int END_YEAR = Calendar.getInstance().get(Calendar.YEAR); // Assume the last year is current year - public static final int START_YEAR = 2000; // Assume start year at 2000 - - public File generateRDB( Survey survey, InfiniteProgressMonitor progressListener) throws IPCCGeneratorException { - - ipccSurveyAdapter = new IPCCSurveyAdapter(); - - // Add attributes for each year containing the LU Category and Subdivision if not present - Survey modifiedSurvey = ipccSurveyAdapter.addIPCCAttributesToSurvey( survey ); - - // Generate Relational Database of the survey data - ipccRdbGenerator.generateRelationalDatabase( modifiedSurvey, progressListener); - - return null; +import liquibase.repackaged.org.apache.commons.lang3.ArrayUtils; + +public class StratumPerYearData extends YearData{ + + private String climate; + private String soil; + private String gez; + public StratumPerYearData(int year, String climate, String soil, String gez) { + super(year); + this.climate = climate; + this.soil = soil; + this.gez = gez; + } + + + @Override + public String toString() { + return "StratumPerYearData [year=" + year + ", climate=" + climate + ", soil=" + soil + ", gez=" + gez + + ", luData=" + ArrayUtils.toString( luData ) + "]"; + } + + + public String getClimate() { + return climate; + } + + + public String getSoil() { + return soil; + } + + + public String getGez() { + return gez; + } + + + public void setClimate(String climate) { + this.climate = climate; + } + + + public void setSoil(String soil) { + this.soil = soil; } - public void produceOutputs( Survey survey, InfiniteProgressMonitor progressListener ) { - - progressListener.hide(); - - // Assign Management types to the Land Use Subdivisions found in the survey data - AssignSubdivisionTypesWizard wizard = new AssignSubdivisionTypesWizard(); - wizard.initializeTypes(landUses.getLandUseSubdivisions()); - - if( !wizard.isWizardFinished() ) { - logger.info( "The user closed the wizard without finishing assigning management types"); - return; - } - - File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.GHGI_ZIP_FILE, true, false, "LandUseForGHGi", localPropertiesService, null); - - if( exportToFile== null || exportToFile.length != 1 ) { - logger.info("The user should choose a ZIP file to export the results to! No file chosen, aborting the rest of the execution"); - return; - } - - try { - File destinationZip = exportToFile[0]; - - final int STEPS = 7; - int currentStep = 1; - - progressListener.show(); - - progressListener.updateProgress(currentStep++, STEPS, "Generating CSV aggregated time-series" ); - // Extract data from the Relational Database into an excel file of transition Matrixes per year - File landUnitsCSVFile =dataExportLandUnitsCSV.generateTimeseriesData(START_YEAR, END_YEAR); - if( progressListener.isUserCancelled() ) return; - - progressListener.updateProgress(currentStep++, STEPS, "Generating CSV per plot time-series" ); - // Extract data from the Relational Database into an excel file of transition Matrixes per year - File perPlotCSVFile =dataExportPerPlotCSV.generateTimeseriesData(START_YEAR, END_YEAR); - if( progressListener.isUserCancelled() ) return; - - progressListener.updateProgress(currentStep++, STEPS, "Generating survey setup files" ); - // Generate list of subdivisions in survey - File subdivisionsFile = LandUseSubdivisionUtils.getSubdivisionsXML(); - File climateZones = StratumUtils.getClimateZonesXML( survey ); - File ecologicalZones = StratumUtils.getEcologicalZonesXML( survey ); - File soilTypes = StratumUtils.getSoilTypesXML( survey ); - if( progressListener.isUserCancelled() ) return; - - progressListener.updateProgress(currentStep++, STEPS, "Generating XML timeseries file" ); - // Extract data from the Relational Database into an XML File with information per year - File timeseriesXMLFile =ipccDataExportToXML.generateTimeseriesData(IPCCGenerator.START_YEAR, IPCCGenerator.END_YEAR ); - if( progressListener.isUserCancelled() ) return; - - progressListener.updateProgress(currentStep++, STEPS, "Generating Excel LU Matrixes per year" ); - // Extract data from the Relational Database into an excel file of transition Matrixes per year - File matrixXLSFile =dataExportMatrixExcel.generateTimeseriesData(START_YEAR, END_YEAR); - if( progressListener.isUserCancelled() ) return; - - progressListener.updateProgress(currentStep++, STEPS, "Generating Excel LU Matrixes per year STRATIFIED" ); - // Extract data from the Relational Database into an excel file of transition Matrixes per year - File matrixXLSExtendedFile =dataExportMatrixExtendedExcel.generateTimeseriesData(START_YEAR, END_YEAR); - if( progressListener.isUserCancelled() ) return; - - try { - progressListener.updateProgress(currentStep++, STEPS, "Compressing files into selected destination" ); - CollectEarthUtils.addFileToZip( destinationZip , timeseriesXMLFile, "LU_Timeseries.xml"); - CollectEarthUtils.addFileToZip( destinationZip , matrixXLSFile, "LU_Matrixes.xls"); - CollectEarthUtils.addFileToZip( destinationZip , matrixXLSExtendedFile, "LU_Matrixes_stratified.xls"); - CollectEarthUtils.addFileToZip( destinationZip , subdivisionsFile, "ConfigLandUseSubdivisions.xml"); - CollectEarthUtils.addFileToZip( destinationZip , climateZones, "ConfigClimateZones.xml"); - CollectEarthUtils.addFileToZip( destinationZip , ecologicalZones, "ConfigEclogicalZones.xml"); - CollectEarthUtils.addFileToZip( destinationZip , soilTypes, "ConfigSoilTypes.xml"); - CollectEarthUtils.addFileToZip( destinationZip , landUnitsCSVFile, "LU_Timeseries_grouped.csv"); - CollectEarthUtils.addFileToZip( destinationZip , perPlotCSVFile, "LU_Timeseries_per_plot.csv"); - progressListener.hide(); - } catch (IOException e) { - logger.error("Error when creating ZIP file with timeseries content " + destinationZip, e); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (Exception e) { - logger.error("Error when zipping the timeseries content into " + destinationZip, e); //$NON-NLS-1$ //$NON-NLS-2$ - } - - // Open the ZIP file automatically to inspect the output - CollectEarthUtils.openFile( destinationZip ); - - } catch (IOException e) { - logger.error("Error generating file", e); - } + public void setGez(String gez) { + this.gez = gez; } } From ac25e961d7f8a1b197857dd291ca2d8b72e834c5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:49 +0100 Subject: [PATCH 0414/1620] New translations YearData.java (French) --- .../earth/app/view/Messages_fr.properties | 60 ++++++------------- 1 file changed, 19 insertions(+), 41 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 1a7a0b1759..569b22cb08 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,54 +1,32 @@ package org.openforis.collect.earth.ipcc; -import liquibase.repackaged.org.apache.commons.lang3.ArrayUtils; +import java.util.List; -public class StratumPerYearData extends YearData{ - - private String climate; - private String soil; - private String gez; - public StratumPerYearData(int year, String climate, String soil, String gez) { - super(year); - this.climate = climate; - this.soil = soil; - this.gez = gez; - } +public class YearData { + protected int year; + protected List luData; - @Override - public String toString() { - return "StratumPerYearData [year=" + year + ", climate=" + climate + ", soil=" + soil + ", gez=" + gez - + ", luData=" + ArrayUtils.toString( luData ) + "]"; + public YearData(int year) { + super(); + this.year = year; } - - - public String getClimate() { - return climate; + + public YearData(int year, List luData) { + super(); + this.year = year; + this.luData = luData; } - - - public String getSoil() { - return soil; + + public List getLuData() { + return luData; } - - public String getGez() { - return gez; + public void setLuData(List luData) { + this.luData = luData; } - - public void setClimate(String climate) { - this.climate = climate; + public int getYear() { + return year; } - - - public void setSoil(String soil) { - this.soil = soil; - } - - - public void setGez(String gez) { - this.gez = gez; - } - } From 59a85899936464b4e8c3915f109379cfbdf9cac3 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:50 +0100 Subject: [PATCH 0415/1620] New translations YearData.java (Spanish) --- .../earth/app/view/Messages_es.properties | 60 ++++++------------- 1 file changed, 19 insertions(+), 41 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 1a7a0b1759..569b22cb08 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,54 +1,32 @@ package org.openforis.collect.earth.ipcc; -import liquibase.repackaged.org.apache.commons.lang3.ArrayUtils; +import java.util.List; -public class StratumPerYearData extends YearData{ - - private String climate; - private String soil; - private String gez; - public StratumPerYearData(int year, String climate, String soil, String gez) { - super(year); - this.climate = climate; - this.soil = soil; - this.gez = gez; - } +public class YearData { + protected int year; + protected List luData; - @Override - public String toString() { - return "StratumPerYearData [year=" + year + ", climate=" + climate + ", soil=" + soil + ", gez=" + gez - + ", luData=" + ArrayUtils.toString( luData ) + "]"; + public YearData(int year) { + super(); + this.year = year; } - - - public String getClimate() { - return climate; + + public YearData(int year, List luData) { + super(); + this.year = year; + this.luData = luData; } - - - public String getSoil() { - return soil; + + public List getLuData() { + return luData; } - - public String getGez() { - return gez; + public void setLuData(List luData) { + this.luData = luData; } - - public void setClimate(String climate) { - this.climate = climate; + public int getYear() { + return year; } - - - public void setSoil(String soil) { - this.soil = soil; - } - - - public void setGez(String gez) { - this.gez = gez; - } - } From 0e464dbfd6eebd6ccdf2fdfdf9711800d7eebe8a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:51 +0100 Subject: [PATCH 0416/1620] New translations YearData.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 60 ++++++------------- 1 file changed, 19 insertions(+), 41 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 1a7a0b1759..569b22cb08 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,54 +1,32 @@ package org.openforis.collect.earth.ipcc; -import liquibase.repackaged.org.apache.commons.lang3.ArrayUtils; +import java.util.List; -public class StratumPerYearData extends YearData{ - - private String climate; - private String soil; - private String gez; - public StratumPerYearData(int year, String climate, String soil, String gez) { - super(year); - this.climate = climate; - this.soil = soil; - this.gez = gez; - } +public class YearData { + protected int year; + protected List luData; - @Override - public String toString() { - return "StratumPerYearData [year=" + year + ", climate=" + climate + ", soil=" + soil + ", gez=" + gez - + ", luData=" + ArrayUtils.toString( luData ) + "]"; + public YearData(int year) { + super(); + this.year = year; } - - - public String getClimate() { - return climate; + + public YearData(int year, List luData) { + super(); + this.year = year; + this.luData = luData; } - - - public String getSoil() { - return soil; + + public List getLuData() { + return luData; } - - public String getGez() { - return gez; + public void setLuData(List luData) { + this.luData = luData; } - - public void setClimate(String climate) { - this.climate = climate; + public int getYear() { + return year; } - - - public void setSoil(String soil) { - this.soil = soil; - } - - - public void setGez(String gez) { - this.gez = gez; - } - } From adcca84e9a8a44398ac01ad75fb3b998d94c0b3e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:52 +0100 Subject: [PATCH 0417/1620] New translations YearData.java (English) --- .../earth/app/view/Messages_en.properties | 60 ++++++------------- 1 file changed, 19 insertions(+), 41 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 1a7a0b1759..569b22cb08 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,54 +1,32 @@ package org.openforis.collect.earth.ipcc; -import liquibase.repackaged.org.apache.commons.lang3.ArrayUtils; +import java.util.List; -public class StratumPerYearData extends YearData{ - - private String climate; - private String soil; - private String gez; - public StratumPerYearData(int year, String climate, String soil, String gez) { - super(year); - this.climate = climate; - this.soil = soil; - this.gez = gez; - } +public class YearData { + protected int year; + protected List luData; - @Override - public String toString() { - return "StratumPerYearData [year=" + year + ", climate=" + climate + ", soil=" + soil + ", gez=" + gez - + ", luData=" + ArrayUtils.toString( luData ) + "]"; + public YearData(int year) { + super(); + this.year = year; } - - - public String getClimate() { - return climate; + + public YearData(int year, List luData) { + super(); + this.year = year; + this.luData = luData; } - - - public String getSoil() { - return soil; + + public List getLuData() { + return luData; } - - public String getGez() { - return gez; + public void setLuData(List luData) { + this.luData = luData; } - - public void setClimate(String climate) { - this.climate = climate; + public int getYear() { + return year; } - - - public void setSoil(String soil) { - this.soil = soil; - } - - - public void setGez(String gez) { - this.gez = gez; - } - } From 6374eac31140f812e220c7f8e1f41fa313550b76 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:54 +0100 Subject: [PATCH 0418/1620] New translations LandUseSubdivisionUtils.java (French) --- .../earth/app/view/Messages_fr.properties | 104 +++++++++++++++--- 1 file changed, 86 insertions(+), 18 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 569b22cb08..572652125f 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,32 +1,100 @@ -package org.openforis.collect.earth.ipcc; +package org.openforis.collect.earth.ipcc.controller; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; import java.util.List; -public class YearData { +import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; +import org.openforis.collect.earth.ipcc.model.ForestSubdivision; +import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; +import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; +import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; +import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; - protected int year; - protected List luData; +import com.thoughtworks.xstream.XStream; - public YearData(int year) { - super(); - this.year = year; - } + +public class LandUseSubdivisionUtils { + + private static Logger logger = LoggerFactory.getLogger( LandUseSubdivisionUtils.class ); - public YearData(int year, List luData) { - super(); - this.year = year; - this.luData = luData; + static List landUseSubdivisions; + + public static List> getSubdivisionsByCategory(LandUseCategory category) { + List> subdivisionsInCategory = new ArrayList>(); + for (LandUseSubdivision landUseSubdivision : landUseSubdivisions) { + if( landUseSubdivision.getCategory().equals( category ) ) { + subdivisionsInCategory.add(landUseSubdivision); + } + } + + return subdivisionsInCategory; } - public List getLuData() { - return luData; + public static void setSubdivisionType(LandUseSubdivision subdivision, Object type) { + landUseSubdivisions.get( landUseSubdivisions.indexOf(subdivision)).setType( type); } - public void setLuData(List luData) { - this.luData = luData; + public static List getLandUseSubdivisions() { + return landUseSubdivisions; } - public int getYear() { - return year; + public static void setLandUseSubdivisions(List landUseSubdivisions) { + LandUseSubdivisionUtils.landUseSubdivisions = landUseSubdivisions; } + + public static LandUseSubdivision getSubdivision( String luCategoryCode, String luSubdivisionCode ) { + + LandUseCategory[] luCategories = LandUseCategory.values(); + LandUseCategory landUseCategory = null; + for (LandUseCategory luCat : luCategories) { + if( luCat.getCode().equals(luCategoryCode)) { + landUseCategory = luCat; + } + } + + for (LandUseSubdivision landUseSubdiv : landUseSubdivisions) { + if( landUseSubdiv.getCategory().equals(landUseCategory) && landUseSubdiv.getCode().equals( luSubdivisionCode ) ) { + return landUseSubdiv; + } + + } + + logger.info("No LU Subdivision found for category : " + luCategoryCode + " / subdivision code : " + luSubdivisionCode ); + return null; + } + + public static File getSubdivisionsXML() throws IOException { + XStream xStream = new XStream(); + + final String subdivisionLabel = "Subdivision"; + + xStream.alias(subdivisionLabel, ForestSubdivision.class); + xStream.alias(subdivisionLabel, CroplandSubdivision.class); + xStream.alias(subdivisionLabel, SettlementSubdivision.class); + xStream.alias(subdivisionLabel, OtherlandSubdivision.class); + xStream.alias(subdivisionLabel, GrasslandSubdivision.class); + xStream.alias(subdivisionLabel, WetlandSubdivision.class); + + xStream.setMode(XStream.NO_REFERENCES); + String xmlSchema = xStream.toXML(getLandUseSubdivisions()); + + File xmlFileDestination = File.createTempFile( "subdivisionsInSurvey", ".xml" ); + xmlFileDestination.deleteOnExit(); + try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { + byte[] strToBytes = xmlSchema.getBytes(); + outputStream.write(strToBytes); + } catch (Exception e) { + logger.error("Error saving data to file", e); + } + + return xmlFileDestination; + } + } From 8ef8376a1a716c1beab7ec5b4e06df8e1ac22cf1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:54 +0100 Subject: [PATCH 0419/1620] New translations LandUseSubdivisionUtils.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 104 +++++++++++++++--- 1 file changed, 86 insertions(+), 18 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 569b22cb08..572652125f 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,32 +1,100 @@ -package org.openforis.collect.earth.ipcc; +package org.openforis.collect.earth.ipcc.controller; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; import java.util.List; -public class YearData { +import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; +import org.openforis.collect.earth.ipcc.model.ForestSubdivision; +import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; +import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; +import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; +import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; - protected int year; - protected List luData; +import com.thoughtworks.xstream.XStream; - public YearData(int year) { - super(); - this.year = year; - } + +public class LandUseSubdivisionUtils { + + private static Logger logger = LoggerFactory.getLogger( LandUseSubdivisionUtils.class ); - public YearData(int year, List luData) { - super(); - this.year = year; - this.luData = luData; + static List landUseSubdivisions; + + public static List> getSubdivisionsByCategory(LandUseCategory category) { + List> subdivisionsInCategory = new ArrayList>(); + for (LandUseSubdivision landUseSubdivision : landUseSubdivisions) { + if( landUseSubdivision.getCategory().equals( category ) ) { + subdivisionsInCategory.add(landUseSubdivision); + } + } + + return subdivisionsInCategory; } - public List getLuData() { - return luData; + public static void setSubdivisionType(LandUseSubdivision subdivision, Object type) { + landUseSubdivisions.get( landUseSubdivisions.indexOf(subdivision)).setType( type); } - public void setLuData(List luData) { - this.luData = luData; + public static List getLandUseSubdivisions() { + return landUseSubdivisions; } - public int getYear() { - return year; + public static void setLandUseSubdivisions(List landUseSubdivisions) { + LandUseSubdivisionUtils.landUseSubdivisions = landUseSubdivisions; } + + public static LandUseSubdivision getSubdivision( String luCategoryCode, String luSubdivisionCode ) { + + LandUseCategory[] luCategories = LandUseCategory.values(); + LandUseCategory landUseCategory = null; + for (LandUseCategory luCat : luCategories) { + if( luCat.getCode().equals(luCategoryCode)) { + landUseCategory = luCat; + } + } + + for (LandUseSubdivision landUseSubdiv : landUseSubdivisions) { + if( landUseSubdiv.getCategory().equals(landUseCategory) && landUseSubdiv.getCode().equals( luSubdivisionCode ) ) { + return landUseSubdiv; + } + + } + + logger.info("No LU Subdivision found for category : " + luCategoryCode + " / subdivision code : " + luSubdivisionCode ); + return null; + } + + public static File getSubdivisionsXML() throws IOException { + XStream xStream = new XStream(); + + final String subdivisionLabel = "Subdivision"; + + xStream.alias(subdivisionLabel, ForestSubdivision.class); + xStream.alias(subdivisionLabel, CroplandSubdivision.class); + xStream.alias(subdivisionLabel, SettlementSubdivision.class); + xStream.alias(subdivisionLabel, OtherlandSubdivision.class); + xStream.alias(subdivisionLabel, GrasslandSubdivision.class); + xStream.alias(subdivisionLabel, WetlandSubdivision.class); + + xStream.setMode(XStream.NO_REFERENCES); + String xmlSchema = xStream.toXML(getLandUseSubdivisions()); + + File xmlFileDestination = File.createTempFile( "subdivisionsInSurvey", ".xml" ); + xmlFileDestination.deleteOnExit(); + try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { + byte[] strToBytes = xmlSchema.getBytes(); + outputStream.write(strToBytes); + } catch (Exception e) { + logger.error("Error saving data to file", e); + } + + return xmlFileDestination; + } + } From 1ae0953a5fe45aa0ff8c4a7c88e36af4a2e97d6e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:56 +0100 Subject: [PATCH 0420/1620] New translations RdbExportException.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 115 ++++-------------- 1 file changed, 25 insertions(+), 90 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 572652125f..e13bbc0b81 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,100 +1,35 @@ -package org.openforis.collect.earth.ipcc.controller; +package org.openforis.collect.earth.ipcc; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +public class RdbExportException extends Exception { -import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; -import org.openforis.collect.earth.ipcc.model.ForestSubdivision; -import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; -import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; -import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; -import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.thoughtworks.xstream.XStream; - - -public class LandUseSubdivisionUtils { - - private static Logger logger = LoggerFactory.getLogger( LandUseSubdivisionUtils.class ); - - static List landUseSubdivisions; - - public static List> getSubdivisionsByCategory(LandUseCategory category) { - List> subdivisionsInCategory = new ArrayList>(); - for (LandUseSubdivision landUseSubdivision : landUseSubdivisions) { - if( landUseSubdivision.getCategory().equals( category ) ) { - subdivisionsInCategory.add(landUseSubdivision); - } - } - - return subdivisionsInCategory; - } - - public static void setSubdivisionType(LandUseSubdivision subdivision, Object type) { - landUseSubdivisions.get( landUseSubdivisions.indexOf(subdivision)).setType( type); + public RdbExportException() { + super(); + // TODO Auto-generated constructor stub } - public static List getLandUseSubdivisions() { - return landUseSubdivisions; + public RdbExportException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + // TODO Auto-generated constructor stub } - public static void setLandUseSubdivisions(List landUseSubdivisions) { - LandUseSubdivisionUtils.landUseSubdivisions = landUseSubdivisions; + public RdbExportException(String message, Throwable cause) { + super(message, cause); + // TODO Auto-generated constructor stub } - - public static LandUseSubdivision getSubdivision( String luCategoryCode, String luSubdivisionCode ) { - - LandUseCategory[] luCategories = LandUseCategory.values(); - LandUseCategory landUseCategory = null; - for (LandUseCategory luCat : luCategories) { - if( luCat.getCode().equals(luCategoryCode)) { - landUseCategory = luCat; - } - } - - for (LandUseSubdivision landUseSubdiv : landUseSubdivisions) { - if( landUseSubdiv.getCategory().equals(landUseCategory) && landUseSubdiv.getCode().equals( luSubdivisionCode ) ) { - return landUseSubdiv; - } - - } - - logger.info("No LU Subdivision found for category : " + luCategoryCode + " / subdivision code : " + luSubdivisionCode ); - return null; + + public RdbExportException(String message) { + super(message); + // TODO Auto-generated constructor stub } - - public static File getSubdivisionsXML() throws IOException { - XStream xStream = new XStream(); - - final String subdivisionLabel = "Subdivision"; - - xStream.alias(subdivisionLabel, ForestSubdivision.class); - xStream.alias(subdivisionLabel, CroplandSubdivision.class); - xStream.alias(subdivisionLabel, SettlementSubdivision.class); - xStream.alias(subdivisionLabel, OtherlandSubdivision.class); - xStream.alias(subdivisionLabel, GrasslandSubdivision.class); - xStream.alias(subdivisionLabel, WetlandSubdivision.class); - - xStream.setMode(XStream.NO_REFERENCES); - String xmlSchema = xStream.toXML(getLandUseSubdivisions()); - - File xmlFileDestination = File.createTempFile( "subdivisionsInSurvey", ".xml" ); - xmlFileDestination.deleteOnExit(); - try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { - byte[] strToBytes = xmlSchema.getBytes(); - outputStream.write(strToBytes); - } catch (Exception e) { - logger.error("Error saving data to file", e); - } - - return xmlFileDestination; + + public RdbExportException(Throwable cause) { + super(cause); + // TODO Auto-generated constructor stub } -} + /** + * + */ + private static final long serialVersionUID = -5210016260577827042L; + +} \ No newline at end of file From 981e07305db0b6c255e161c3bec4cd0acf07db53 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:57 +0100 Subject: [PATCH 0421/1620] New translations LandUseSubdivisionUtils.java (English) --- .../earth/app/view/Messages_en.properties | 104 +++++++++++++++--- 1 file changed, 86 insertions(+), 18 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 569b22cb08..572652125f 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,32 +1,100 @@ -package org.openforis.collect.earth.ipcc; +package org.openforis.collect.earth.ipcc.controller; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; import java.util.List; -public class YearData { +import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; +import org.openforis.collect.earth.ipcc.model.ForestSubdivision; +import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; +import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; +import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; +import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; - protected int year; - protected List luData; +import com.thoughtworks.xstream.XStream; - public YearData(int year) { - super(); - this.year = year; - } + +public class LandUseSubdivisionUtils { + + private static Logger logger = LoggerFactory.getLogger( LandUseSubdivisionUtils.class ); - public YearData(int year, List luData) { - super(); - this.year = year; - this.luData = luData; + static List landUseSubdivisions; + + public static List> getSubdivisionsByCategory(LandUseCategory category) { + List> subdivisionsInCategory = new ArrayList>(); + for (LandUseSubdivision landUseSubdivision : landUseSubdivisions) { + if( landUseSubdivision.getCategory().equals( category ) ) { + subdivisionsInCategory.add(landUseSubdivision); + } + } + + return subdivisionsInCategory; } - public List getLuData() { - return luData; + public static void setSubdivisionType(LandUseSubdivision subdivision, Object type) { + landUseSubdivisions.get( landUseSubdivisions.indexOf(subdivision)).setType( type); } - public void setLuData(List luData) { - this.luData = luData; + public static List getLandUseSubdivisions() { + return landUseSubdivisions; } - public int getYear() { - return year; + public static void setLandUseSubdivisions(List landUseSubdivisions) { + LandUseSubdivisionUtils.landUseSubdivisions = landUseSubdivisions; } + + public static LandUseSubdivision getSubdivision( String luCategoryCode, String luSubdivisionCode ) { + + LandUseCategory[] luCategories = LandUseCategory.values(); + LandUseCategory landUseCategory = null; + for (LandUseCategory luCat : luCategories) { + if( luCat.getCode().equals(luCategoryCode)) { + landUseCategory = luCat; + } + } + + for (LandUseSubdivision landUseSubdiv : landUseSubdivisions) { + if( landUseSubdiv.getCategory().equals(landUseCategory) && landUseSubdiv.getCode().equals( luSubdivisionCode ) ) { + return landUseSubdiv; + } + + } + + logger.info("No LU Subdivision found for category : " + luCategoryCode + " / subdivision code : " + luSubdivisionCode ); + return null; + } + + public static File getSubdivisionsXML() throws IOException { + XStream xStream = new XStream(); + + final String subdivisionLabel = "Subdivision"; + + xStream.alias(subdivisionLabel, ForestSubdivision.class); + xStream.alias(subdivisionLabel, CroplandSubdivision.class); + xStream.alias(subdivisionLabel, SettlementSubdivision.class); + xStream.alias(subdivisionLabel, OtherlandSubdivision.class); + xStream.alias(subdivisionLabel, GrasslandSubdivision.class); + xStream.alias(subdivisionLabel, WetlandSubdivision.class); + + xStream.setMode(XStream.NO_REFERENCES); + String xmlSchema = xStream.toXML(getLandUseSubdivisions()); + + File xmlFileDestination = File.createTempFile( "subdivisionsInSurvey", ".xml" ); + xmlFileDestination.deleteOnExit(); + try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { + byte[] strToBytes = xmlSchema.getBytes(); + outputStream.write(strToBytes); + } catch (Exception e) { + logger.error("Error saving data to file", e); + } + + return xmlFileDestination; + } + } From 00223d1e1441bcda156bce69425d0b4821d91d08 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:58 +0100 Subject: [PATCH 0422/1620] New translations StratumUtils.java (French) --- .../earth/app/view/Messages_fr.properties | 85 ++++++------------- 1 file changed, 26 insertions(+), 59 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 572652125f..1baa564fe0 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -6,86 +6,53 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; -import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; -import org.openforis.collect.earth.ipcc.model.ForestSubdivision; -import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; -import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; -import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; -import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; +import org.openforis.collect.earth.ipcc.model.StratumObject; +import org.openforis.idm.metamodel.CodeListItem; +import org.openforis.idm.metamodel.Survey; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.thoughtworks.xstream.XStream; +public class StratumUtils { -public class LandUseSubdivisionUtils { + public static final String CODE_LIST_CLIMATE = "climate_zones"; + public static final String CODE_LIST_SOIL = "soil_types"; + public static final String CODE_LIST_GEZ = "ecological_zones"; - private static Logger logger = LoggerFactory.getLogger( LandUseSubdivisionUtils.class ); + private static Logger logger = LoggerFactory.getLogger( StratumUtils.class ); - static List landUseSubdivisions; - - public static List> getSubdivisionsByCategory(LandUseCategory category) { - List> subdivisionsInCategory = new ArrayList>(); - for (LandUseSubdivision landUseSubdivision : landUseSubdivisions) { - if( landUseSubdivision.getCategory().equals( category ) ) { - subdivisionsInCategory.add(landUseSubdivision); - } + + private static List getCodeList(Survey survey, String codeList ) { + List items = survey.getCodeList( codeList ).getItems(); + List itemsInfo = new ArrayList(); + for (CodeListItem item : items) { + itemsInfo.add( new StratumObject(item.getCode(), item.getLabel(), item.getDescription() ) ); } - - return subdivisionsInCategory; + return itemsInfo; } - public static void setSubdivisionType(LandUseSubdivision subdivision, Object type) { - landUseSubdivisions.get( landUseSubdivisions.indexOf(subdivision)).setType( type); + public static File getClimateZonesXML( Survey survey ) throws IOException { + return getStratumXML(survey, CODE_LIST_CLIMATE, "climate"); } - - public static List getLandUseSubdivisions() { - return landUseSubdivisions; - } - - public static void setLandUseSubdivisions(List landUseSubdivisions) { - LandUseSubdivisionUtils.landUseSubdivisions = landUseSubdivisions; + + public static File getEcologicalZonesXML(Survey survey) throws IOException { + return getStratumXML(survey, CODE_LIST_GEZ, "gez"); } - public static LandUseSubdivision getSubdivision( String luCategoryCode, String luSubdivisionCode ) { - - LandUseCategory[] luCategories = LandUseCategory.values(); - LandUseCategory landUseCategory = null; - for (LandUseCategory luCat : luCategories) { - if( luCat.getCode().equals(luCategoryCode)) { - landUseCategory = luCat; - } - } - - for (LandUseSubdivision landUseSubdiv : landUseSubdivisions) { - if( landUseSubdiv.getCategory().equals(landUseCategory) && landUseSubdiv.getCode().equals( luSubdivisionCode ) ) { - return landUseSubdiv; - } - - } - - logger.info("No LU Subdivision found for category : " + luCategoryCode + " / subdivision code : " + luSubdivisionCode ); - return null; + public static File getSoilTypesXML(Survey survey) throws IOException { + return getStratumXML(survey, CODE_LIST_SOIL, "soil"); } - public static File getSubdivisionsXML() throws IOException { + private static File getStratumXML( Survey survey, String codeList, String nameForXml ) throws IOException { XStream xStream = new XStream(); - final String subdivisionLabel = "Subdivision"; - - xStream.alias(subdivisionLabel, ForestSubdivision.class); - xStream.alias(subdivisionLabel, CroplandSubdivision.class); - xStream.alias(subdivisionLabel, SettlementSubdivision.class); - xStream.alias(subdivisionLabel, OtherlandSubdivision.class); - xStream.alias(subdivisionLabel, GrasslandSubdivision.class); - xStream.alias(subdivisionLabel, WetlandSubdivision.class); + xStream.alias(nameForXml, StratumObject.class); xStream.setMode(XStream.NO_REFERENCES); - String xmlSchema = xStream.toXML(getLandUseSubdivisions()); + String xmlSchema = xStream.toXML( getCodeList(survey, codeList)); - File xmlFileDestination = File.createTempFile( "subdivisionsInSurvey", ".xml" ); + File xmlFileDestination = File.createTempFile( "codeListInSurvey", ".xml" ); xmlFileDestination.deleteOnExit(); try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { byte[] strToBytes = xmlSchema.getBytes(); From b40325bd41b3e57f45c4a73b1abc5590e13c65e1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:28:59 +0100 Subject: [PATCH 0423/1620] New translations StratumUtils.java (Spanish) --- .../earth/app/view/Messages_es.properties | 73 ++++++++++++++----- 1 file changed, 54 insertions(+), 19 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 569b22cb08..1baa564fe0 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,32 +1,67 @@ -package org.openforis.collect.earth.ipcc; +package org.openforis.collect.earth.ipcc.controller; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; import java.util.List; -public class YearData { +import org.openforis.collect.earth.ipcc.model.StratumObject; +import org.openforis.idm.metamodel.CodeListItem; +import org.openforis.idm.metamodel.Survey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; - protected int year; - protected List luData; +import com.thoughtworks.xstream.XStream; - public YearData(int year) { - super(); - this.year = year; +public class StratumUtils { + + public static final String CODE_LIST_CLIMATE = "climate_zones"; + public static final String CODE_LIST_SOIL = "soil_types"; + public static final String CODE_LIST_GEZ = "ecological_zones"; + + private static Logger logger = LoggerFactory.getLogger( StratumUtils.class ); + + + private static List getCodeList(Survey survey, String codeList ) { + List items = survey.getCodeList( codeList ).getItems(); + List itemsInfo = new ArrayList(); + for (CodeListItem item : items) { + itemsInfo.add( new StratumObject(item.getCode(), item.getLabel(), item.getDescription() ) ); + } + return itemsInfo; } - public YearData(int year, List luData) { - super(); - this.year = year; - this.luData = luData; + public static File getClimateZonesXML( Survey survey ) throws IOException { + return getStratumXML(survey, CODE_LIST_CLIMATE, "climate"); } - public List getLuData() { - return luData; + public static File getEcologicalZonesXML(Survey survey) throws IOException { + return getStratumXML(survey, CODE_LIST_GEZ, "gez"); } - - public void setLuData(List luData) { - this.luData = luData; + + public static File getSoilTypesXML(Survey survey) throws IOException { + return getStratumXML(survey, CODE_LIST_SOIL, "soil"); } - - public int getYear() { - return year; + + private static File getStratumXML( Survey survey, String codeList, String nameForXml ) throws IOException { + XStream xStream = new XStream(); + + xStream.alias(nameForXml, StratumObject.class); + + xStream.setMode(XStream.NO_REFERENCES); + String xmlSchema = xStream.toXML( getCodeList(survey, codeList)); + + File xmlFileDestination = File.createTempFile( "codeListInSurvey", ".xml" ); + xmlFileDestination.deleteOnExit(); + try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { + byte[] strToBytes = xmlSchema.getBytes(); + outputStream.write(strToBytes); + } catch (Exception e) { + logger.error("Error saving data to file", e); + } + + return xmlFileDestination; } + } From 96c56cf2b14b9a20410045be1b1ba1868ed45a06 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:00 +0100 Subject: [PATCH 0424/1620] New translations StratumUtils.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 86 +++++++++++++------ 1 file changed, 59 insertions(+), 27 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index e13bbc0b81..1baa564fe0 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,35 +1,67 @@ -package org.openforis.collect.earth.ipcc; +package org.openforis.collect.earth.ipcc.controller; -public class RdbExportException extends Exception { +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; - public RdbExportException() { - super(); - // TODO Auto-generated constructor stub - } +import org.openforis.collect.earth.ipcc.model.StratumObject; +import org.openforis.idm.metamodel.CodeListItem; +import org.openforis.idm.metamodel.Survey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; - public RdbExportException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { - super(message, cause, enableSuppression, writableStackTrace); - // TODO Auto-generated constructor stub - } +import com.thoughtworks.xstream.XStream; - public RdbExportException(String message, Throwable cause) { - super(message, cause); - // TODO Auto-generated constructor stub - } +public class StratumUtils { - public RdbExportException(String message) { - super(message); - // TODO Auto-generated constructor stub + public static final String CODE_LIST_CLIMATE = "climate_zones"; + public static final String CODE_LIST_SOIL = "soil_types"; + public static final String CODE_LIST_GEZ = "ecological_zones"; + + private static Logger logger = LoggerFactory.getLogger( StratumUtils.class ); + + + private static List getCodeList(Survey survey, String codeList ) { + List items = survey.getCodeList( codeList ).getItems(); + List itemsInfo = new ArrayList(); + for (CodeListItem item : items) { + itemsInfo.add( new StratumObject(item.getCode(), item.getLabel(), item.getDescription() ) ); + } + return itemsInfo; } - - public RdbExportException(Throwable cause) { - super(cause); - // TODO Auto-generated constructor stub + + public static File getClimateZonesXML( Survey survey ) throws IOException { + return getStratumXML(survey, CODE_LIST_CLIMATE, "climate"); + } + + public static File getEcologicalZonesXML(Survey survey) throws IOException { + return getStratumXML(survey, CODE_LIST_GEZ, "gez"); + } + + public static File getSoilTypesXML(Survey survey) throws IOException { + return getStratumXML(survey, CODE_LIST_SOIL, "soil"); + } + + private static File getStratumXML( Survey survey, String codeList, String nameForXml ) throws IOException { + XStream xStream = new XStream(); + + xStream.alias(nameForXml, StratumObject.class); + + xStream.setMode(XStream.NO_REFERENCES); + String xmlSchema = xStream.toXML( getCodeList(survey, codeList)); + + File xmlFileDestination = File.createTempFile( "codeListInSurvey", ".xml" ); + xmlFileDestination.deleteOnExit(); + try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { + byte[] strToBytes = xmlSchema.getBytes(); + outputStream.write(strToBytes); + } catch (Exception e) { + logger.error("Error saving data to file", e); + } + + return xmlFileDestination; } - /** - * - */ - private static final long serialVersionUID = -5210016260577827042L; - -} \ No newline at end of file +} From 74e83fa422ecb558c39804e0190fb6eecb495252 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:01 +0100 Subject: [PATCH 0425/1620] New translations StratumUtils.java (English) --- .../earth/app/view/Messages_en.properties | 85 ++++++------------- 1 file changed, 26 insertions(+), 59 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 572652125f..1baa564fe0 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -6,86 +6,53 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; -import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; -import org.openforis.collect.earth.ipcc.model.ForestSubdivision; -import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; -import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; -import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; -import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; +import org.openforis.collect.earth.ipcc.model.StratumObject; +import org.openforis.idm.metamodel.CodeListItem; +import org.openforis.idm.metamodel.Survey; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.thoughtworks.xstream.XStream; +public class StratumUtils { -public class LandUseSubdivisionUtils { + public static final String CODE_LIST_CLIMATE = "climate_zones"; + public static final String CODE_LIST_SOIL = "soil_types"; + public static final String CODE_LIST_GEZ = "ecological_zones"; - private static Logger logger = LoggerFactory.getLogger( LandUseSubdivisionUtils.class ); + private static Logger logger = LoggerFactory.getLogger( StratumUtils.class ); - static List landUseSubdivisions; - - public static List> getSubdivisionsByCategory(LandUseCategory category) { - List> subdivisionsInCategory = new ArrayList>(); - for (LandUseSubdivision landUseSubdivision : landUseSubdivisions) { - if( landUseSubdivision.getCategory().equals( category ) ) { - subdivisionsInCategory.add(landUseSubdivision); - } + + private static List getCodeList(Survey survey, String codeList ) { + List items = survey.getCodeList( codeList ).getItems(); + List itemsInfo = new ArrayList(); + for (CodeListItem item : items) { + itemsInfo.add( new StratumObject(item.getCode(), item.getLabel(), item.getDescription() ) ); } - - return subdivisionsInCategory; + return itemsInfo; } - public static void setSubdivisionType(LandUseSubdivision subdivision, Object type) { - landUseSubdivisions.get( landUseSubdivisions.indexOf(subdivision)).setType( type); + public static File getClimateZonesXML( Survey survey ) throws IOException { + return getStratumXML(survey, CODE_LIST_CLIMATE, "climate"); } - - public static List getLandUseSubdivisions() { - return landUseSubdivisions; - } - - public static void setLandUseSubdivisions(List landUseSubdivisions) { - LandUseSubdivisionUtils.landUseSubdivisions = landUseSubdivisions; + + public static File getEcologicalZonesXML(Survey survey) throws IOException { + return getStratumXML(survey, CODE_LIST_GEZ, "gez"); } - public static LandUseSubdivision getSubdivision( String luCategoryCode, String luSubdivisionCode ) { - - LandUseCategory[] luCategories = LandUseCategory.values(); - LandUseCategory landUseCategory = null; - for (LandUseCategory luCat : luCategories) { - if( luCat.getCode().equals(luCategoryCode)) { - landUseCategory = luCat; - } - } - - for (LandUseSubdivision landUseSubdiv : landUseSubdivisions) { - if( landUseSubdiv.getCategory().equals(landUseCategory) && landUseSubdiv.getCode().equals( luSubdivisionCode ) ) { - return landUseSubdiv; - } - - } - - logger.info("No LU Subdivision found for category : " + luCategoryCode + " / subdivision code : " + luSubdivisionCode ); - return null; + public static File getSoilTypesXML(Survey survey) throws IOException { + return getStratumXML(survey, CODE_LIST_SOIL, "soil"); } - public static File getSubdivisionsXML() throws IOException { + private static File getStratumXML( Survey survey, String codeList, String nameForXml ) throws IOException { XStream xStream = new XStream(); - final String subdivisionLabel = "Subdivision"; - - xStream.alias(subdivisionLabel, ForestSubdivision.class); - xStream.alias(subdivisionLabel, CroplandSubdivision.class); - xStream.alias(subdivisionLabel, SettlementSubdivision.class); - xStream.alias(subdivisionLabel, OtherlandSubdivision.class); - xStream.alias(subdivisionLabel, GrasslandSubdivision.class); - xStream.alias(subdivisionLabel, WetlandSubdivision.class); + xStream.alias(nameForXml, StratumObject.class); xStream.setMode(XStream.NO_REFERENCES); - String xmlSchema = xStream.toXML(getLandUseSubdivisions()); + String xmlSchema = xStream.toXML( getCodeList(survey, codeList)); - File xmlFileDestination = File.createTempFile( "subdivisionsInSurvey", ".xml" ); + File xmlFileDestination = File.createTempFile( "codeListInSurvey", ".xml" ); xmlFileDestination.deleteOnExit(); try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { byte[] strToBytes = xmlSchema.getBytes(); From fd559f8c7ce9b818f6c04412c8d038680b75086e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:02 +0100 Subject: [PATCH 0426/1620] New translations CroplandSubdivision.java (French) --- .../earth/app/view/Messages_fr.properties | 73 ++++--------------- 1 file changed, 13 insertions(+), 60 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 1baa564fe0..fb27fb933b 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,67 +1,20 @@ -package org.openforis.collect.earth.ipcc.controller; +package org.openforis.collect.earth.ipcc.model; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import org.openforis.collect.earth.ipcc.model.StratumObject; -import org.openforis.idm.metamodel.CodeListItem; -import org.openforis.idm.metamodel.Survey; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.thoughtworks.xstream.XStream; - -public class StratumUtils { - - public static final String CODE_LIST_CLIMATE = "climate_zones"; - public static final String CODE_LIST_SOIL = "soil_types"; - public static final String CODE_LIST_GEZ = "ecological_zones"; - - private static Logger logger = LoggerFactory.getLogger( StratumUtils.class ); - - - private static List getCodeList(Survey survey, String codeList ) { - List items = survey.getCodeList( codeList ).getItems(); - List itemsInfo = new ArrayList(); - for (CodeListItem item : items) { - itemsInfo.add( new StratumObject(item.getCode(), item.getLabel(), item.getDescription() ) ); - } - return itemsInfo; - } - - public static File getClimateZonesXML( Survey survey ) throws IOException { - return getStratumXML(survey, CODE_LIST_CLIMATE, "climate"); - } +public class CroplandSubdivision extends LandUseSubdivision{ - public static File getEcologicalZonesXML(Survey survey) throws IOException { - return getStratumXML(survey, CODE_LIST_GEZ, "gez"); - } + protected CroplandType type; - public static File getSoilTypesXML(Survey survey) throws IOException { - return getStratumXML(survey, CODE_LIST_SOIL, "soil"); + public CroplandSubdivision( String code, String name, CroplandType type) { + super(LandUseCategory.C, code, name); + setType(type); } - - private static File getStratumXML( Survey survey, String codeList, String nameForXml ) throws IOException { - XStream xStream = new XStream(); - - xStream.alias(nameForXml, StratumObject.class); - - xStream.setMode(XStream.NO_REFERENCES); - String xmlSchema = xStream.toXML( getCodeList(survey, codeList)); - - File xmlFileDestination = File.createTempFile( "codeListInSurvey", ".xml" ); - xmlFileDestination.deleteOnExit(); - try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { - byte[] strToBytes = xmlSchema.getBytes(); - outputStream.write(strToBytes); - } catch (Exception e) { - logger.error("Error saving data to file", e); - } - - return xmlFileDestination; + + public CroplandType getType() { + return type; } + public void setType(CroplandType type) { + this.type = type; + }; + } From d813f478836fc9e4e4d229238984a6f4ac0bfeef Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:03 +0100 Subject: [PATCH 0427/1620] New translations CroplandSubdivision.java (Spanish) --- .../earth/app/view/Messages_es.properties | 73 ++++--------------- 1 file changed, 13 insertions(+), 60 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 1baa564fe0..fb27fb933b 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,67 +1,20 @@ -package org.openforis.collect.earth.ipcc.controller; +package org.openforis.collect.earth.ipcc.model; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import org.openforis.collect.earth.ipcc.model.StratumObject; -import org.openforis.idm.metamodel.CodeListItem; -import org.openforis.idm.metamodel.Survey; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.thoughtworks.xstream.XStream; - -public class StratumUtils { - - public static final String CODE_LIST_CLIMATE = "climate_zones"; - public static final String CODE_LIST_SOIL = "soil_types"; - public static final String CODE_LIST_GEZ = "ecological_zones"; - - private static Logger logger = LoggerFactory.getLogger( StratumUtils.class ); - - - private static List getCodeList(Survey survey, String codeList ) { - List items = survey.getCodeList( codeList ).getItems(); - List itemsInfo = new ArrayList(); - for (CodeListItem item : items) { - itemsInfo.add( new StratumObject(item.getCode(), item.getLabel(), item.getDescription() ) ); - } - return itemsInfo; - } - - public static File getClimateZonesXML( Survey survey ) throws IOException { - return getStratumXML(survey, CODE_LIST_CLIMATE, "climate"); - } +public class CroplandSubdivision extends LandUseSubdivision{ - public static File getEcologicalZonesXML(Survey survey) throws IOException { - return getStratumXML(survey, CODE_LIST_GEZ, "gez"); - } + protected CroplandType type; - public static File getSoilTypesXML(Survey survey) throws IOException { - return getStratumXML(survey, CODE_LIST_SOIL, "soil"); + public CroplandSubdivision( String code, String name, CroplandType type) { + super(LandUseCategory.C, code, name); + setType(type); } - - private static File getStratumXML( Survey survey, String codeList, String nameForXml ) throws IOException { - XStream xStream = new XStream(); - - xStream.alias(nameForXml, StratumObject.class); - - xStream.setMode(XStream.NO_REFERENCES); - String xmlSchema = xStream.toXML( getCodeList(survey, codeList)); - - File xmlFileDestination = File.createTempFile( "codeListInSurvey", ".xml" ); - xmlFileDestination.deleteOnExit(); - try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { - byte[] strToBytes = xmlSchema.getBytes(); - outputStream.write(strToBytes); - } catch (Exception e) { - logger.error("Error saving data to file", e); - } - - return xmlFileDestination; + + public CroplandType getType() { + return type; } + public void setType(CroplandType type) { + this.type = type; + }; + } From 805d5869dd3119cabbdf08207b70ac36323cacd2 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:04 +0100 Subject: [PATCH 0428/1620] New translations CroplandSubdivision.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 73 ++++--------------- 1 file changed, 13 insertions(+), 60 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 1baa564fe0..fb27fb933b 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,67 +1,20 @@ -package org.openforis.collect.earth.ipcc.controller; +package org.openforis.collect.earth.ipcc.model; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import org.openforis.collect.earth.ipcc.model.StratumObject; -import org.openforis.idm.metamodel.CodeListItem; -import org.openforis.idm.metamodel.Survey; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.thoughtworks.xstream.XStream; - -public class StratumUtils { - - public static final String CODE_LIST_CLIMATE = "climate_zones"; - public static final String CODE_LIST_SOIL = "soil_types"; - public static final String CODE_LIST_GEZ = "ecological_zones"; - - private static Logger logger = LoggerFactory.getLogger( StratumUtils.class ); - - - private static List getCodeList(Survey survey, String codeList ) { - List items = survey.getCodeList( codeList ).getItems(); - List itemsInfo = new ArrayList(); - for (CodeListItem item : items) { - itemsInfo.add( new StratumObject(item.getCode(), item.getLabel(), item.getDescription() ) ); - } - return itemsInfo; - } - - public static File getClimateZonesXML( Survey survey ) throws IOException { - return getStratumXML(survey, CODE_LIST_CLIMATE, "climate"); - } +public class CroplandSubdivision extends LandUseSubdivision{ - public static File getEcologicalZonesXML(Survey survey) throws IOException { - return getStratumXML(survey, CODE_LIST_GEZ, "gez"); - } + protected CroplandType type; - public static File getSoilTypesXML(Survey survey) throws IOException { - return getStratumXML(survey, CODE_LIST_SOIL, "soil"); + public CroplandSubdivision( String code, String name, CroplandType type) { + super(LandUseCategory.C, code, name); + setType(type); } - - private static File getStratumXML( Survey survey, String codeList, String nameForXml ) throws IOException { - XStream xStream = new XStream(); - - xStream.alias(nameForXml, StratumObject.class); - - xStream.setMode(XStream.NO_REFERENCES); - String xmlSchema = xStream.toXML( getCodeList(survey, codeList)); - - File xmlFileDestination = File.createTempFile( "codeListInSurvey", ".xml" ); - xmlFileDestination.deleteOnExit(); - try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { - byte[] strToBytes = xmlSchema.getBytes(); - outputStream.write(strToBytes); - } catch (Exception e) { - logger.error("Error saving data to file", e); - } - - return xmlFileDestination; + + public CroplandType getType() { + return type; } + public void setType(CroplandType type) { + this.type = type; + }; + } From 7523c1b912dbcd3e34908aa48a79258137bd3328 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:05 +0100 Subject: [PATCH 0429/1620] New translations CroplandSubdivision.java (English) --- .../earth/app/view/Messages_en.properties | 73 ++++--------------- 1 file changed, 13 insertions(+), 60 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 1baa564fe0..fb27fb933b 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,67 +1,20 @@ -package org.openforis.collect.earth.ipcc.controller; +package org.openforis.collect.earth.ipcc.model; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import org.openforis.collect.earth.ipcc.model.StratumObject; -import org.openforis.idm.metamodel.CodeListItem; -import org.openforis.idm.metamodel.Survey; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.thoughtworks.xstream.XStream; - -public class StratumUtils { - - public static final String CODE_LIST_CLIMATE = "climate_zones"; - public static final String CODE_LIST_SOIL = "soil_types"; - public static final String CODE_LIST_GEZ = "ecological_zones"; - - private static Logger logger = LoggerFactory.getLogger( StratumUtils.class ); - - - private static List getCodeList(Survey survey, String codeList ) { - List items = survey.getCodeList( codeList ).getItems(); - List itemsInfo = new ArrayList(); - for (CodeListItem item : items) { - itemsInfo.add( new StratumObject(item.getCode(), item.getLabel(), item.getDescription() ) ); - } - return itemsInfo; - } - - public static File getClimateZonesXML( Survey survey ) throws IOException { - return getStratumXML(survey, CODE_LIST_CLIMATE, "climate"); - } +public class CroplandSubdivision extends LandUseSubdivision{ - public static File getEcologicalZonesXML(Survey survey) throws IOException { - return getStratumXML(survey, CODE_LIST_GEZ, "gez"); - } + protected CroplandType type; - public static File getSoilTypesXML(Survey survey) throws IOException { - return getStratumXML(survey, CODE_LIST_SOIL, "soil"); + public CroplandSubdivision( String code, String name, CroplandType type) { + super(LandUseCategory.C, code, name); + setType(type); } - - private static File getStratumXML( Survey survey, String codeList, String nameForXml ) throws IOException { - XStream xStream = new XStream(); - - xStream.alias(nameForXml, StratumObject.class); - - xStream.setMode(XStream.NO_REFERENCES); - String xmlSchema = xStream.toXML( getCodeList(survey, codeList)); - - File xmlFileDestination = File.createTempFile( "codeListInSurvey", ".xml" ); - xmlFileDestination.deleteOnExit(); - try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { - byte[] strToBytes = xmlSchema.getBytes(); - outputStream.write(strToBytes); - } catch (Exception e) { - logger.error("Error saving data to file", e); - } - - return xmlFileDestination; + + public CroplandType getType() { + return type; } + public void setType(CroplandType type) { + this.type = type; + }; + } From ab9a62c70f264f05af0391a729b5e4fcd0de5491 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:06 +0100 Subject: [PATCH 0430/1620] New translations CroplandType.java (French) --- .../earth/app/view/Messages_fr.properties | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index fb27fb933b..e6464b6c58 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,20 +1,21 @@ package org.openforis.collect.earth.ipcc.model; -public class CroplandSubdivision extends LandUseSubdivision{ +public enum CroplandType { + + ANNUAL("Annual"),PERENNIAL("Perennial"); - protected CroplandType type; + public final String name; - public CroplandSubdivision( String code, String name, CroplandType type) { - super(LandUseCategory.C, code, name); - setType(type); - } + private CroplandType(String name) { + this.name = name; + } - public CroplandType getType() { - return type; + public String getName() { + return name; } - public void setType(CroplandType type) { - this.type = type; - }; - + @Override + public String toString() { + return getName(); + } } From c26a74698fb9ea29b98f66c94c49c3202cb9f002 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:07 +0100 Subject: [PATCH 0431/1620] New translations RdbExportException.java (English) --- .../earth/app/view/Messages_en.properties | 47 ++++++++++++------- 1 file changed, 31 insertions(+), 16 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index fb27fb933b..e13bbc0b81 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,20 +1,35 @@ -package org.openforis.collect.earth.ipcc.model; - -public class CroplandSubdivision extends LandUseSubdivision{ - - protected CroplandType type; - - public CroplandSubdivision( String code, String name, CroplandType type) { - super(LandUseCategory.C, code, name); - setType(type); +package org.openforis.collect.earth.ipcc; + +public class RdbExportException extends Exception { + + public RdbExportException() { + super(); + // TODO Auto-generated constructor stub } - public CroplandType getType() { - return type; + public RdbExportException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + // TODO Auto-generated constructor stub } - public void setType(CroplandType type) { - this.type = type; - }; - -} + public RdbExportException(String message, Throwable cause) { + super(message, cause); + // TODO Auto-generated constructor stub + } + + public RdbExportException(String message) { + super(message); + // TODO Auto-generated constructor stub + } + + public RdbExportException(Throwable cause) { + super(cause); + // TODO Auto-generated constructor stub + } + + /** + * + */ + private static final long serialVersionUID = -5210016260577827042L; + +} \ No newline at end of file From c10e68b47bccda837d6ade990f7215cd7739b6ef Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:08 +0100 Subject: [PATCH 0432/1620] New translations RdbExportException.java (Spanish) --- .../earth/app/view/Messages_es.properties | 47 ++++++++++++------- 1 file changed, 31 insertions(+), 16 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index fb27fb933b..e13bbc0b81 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,20 +1,35 @@ -package org.openforis.collect.earth.ipcc.model; - -public class CroplandSubdivision extends LandUseSubdivision{ - - protected CroplandType type; - - public CroplandSubdivision( String code, String name, CroplandType type) { - super(LandUseCategory.C, code, name); - setType(type); +package org.openforis.collect.earth.ipcc; + +public class RdbExportException extends Exception { + + public RdbExportException() { + super(); + // TODO Auto-generated constructor stub } - public CroplandType getType() { - return type; + public RdbExportException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + // TODO Auto-generated constructor stub } - public void setType(CroplandType type) { - this.type = type; - }; - -} + public RdbExportException(String message, Throwable cause) { + super(message, cause); + // TODO Auto-generated constructor stub + } + + public RdbExportException(String message) { + super(message); + // TODO Auto-generated constructor stub + } + + public RdbExportException(Throwable cause) { + super(cause); + // TODO Auto-generated constructor stub + } + + /** + * + */ + private static final long serialVersionUID = -5210016260577827042L; + +} \ No newline at end of file From bb9145b9e941dd8add0f82025a9ae8100ea41fe0 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:09 +0100 Subject: [PATCH 0433/1620] New translations IPCCGeneratorException.java (Spanish) --- .../earth/app/view/Messages_es.properties | 29 +++++++++---------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index e13bbc0b81..fed659b97f 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,35 +1,32 @@ package org.openforis.collect.earth.ipcc; -public class RdbExportException extends Exception { +public class IPCCGeneratorException extends RdbExportException { - public RdbExportException() { + /** + * + */ + private static final long serialVersionUID = 6236105290795112340L; + + public IPCCGeneratorException() { super(); // TODO Auto-generated constructor stub } - public RdbExportException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + public IPCCGeneratorException(String message, Throwable cause, boolean enableSuppression, + boolean writableStackTrace) { super(message, cause, enableSuppression, writableStackTrace); - // TODO Auto-generated constructor stub } - public RdbExportException(String message, Throwable cause) { + public IPCCGeneratorException(String message, Throwable cause) { super(message, cause); - // TODO Auto-generated constructor stub } - public RdbExportException(String message) { + public IPCCGeneratorException(String message) { super(message); - // TODO Auto-generated constructor stub } - public RdbExportException(Throwable cause) { + public IPCCGeneratorException(Throwable cause) { super(cause); - // TODO Auto-generated constructor stub } - /** - * - */ - private static final long serialVersionUID = -5210016260577827042L; - -} \ No newline at end of file +} From 597f38a418a4a955cf79e0e0e1d5bf50ae5c0e92 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:10 +0100 Subject: [PATCH 0434/1620] New translations IPCCSurveyAdapter.java (French) --- .../earth/app/view/Messages_fr.properties | 391 +++++++++++++++++- 1 file changed, 378 insertions(+), 13 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index e6464b6c58..32e67d9b02 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,21 +1,386 @@ -package org.openforis.collect.earth.ipcc.model; +package org.openforis.collect.earth.ipcc; -public enum CroplandType { +import java.util.ArrayList; - ANNUAL("Annual"),PERENNIAL("Perennial"); - - public final String name; +import org.openforis.idm.metamodel.AttributeDefault; +import org.openforis.idm.metamodel.CodeAttributeDefinition; +import org.openforis.idm.metamodel.EntityDefinition; +import org.openforis.idm.metamodel.NodeLabel; +import org.openforis.idm.metamodel.Survey; +import org.openforis.idm.metamodel.TextAttributeDefinition; +import org.openforis.idm.path.InvalidPathException; + +public class IPCCSurveyAdapter { + + public static final String IPCC_ATTR_PARENT_SUFIX = "_parent"; + public static final String IPCC_ATTR_PREFIX = "ipcc_"; + public static final String IPCC_CATEGORY = "_category"; + public static final String IPCC_SUBCATEGORY = "_subcategory"; + public static final String IPCC_SUBDIVISION = "_subdivision"; + + public static final String ATTR_CURRENT_CATEGORY = IPCC_ATTR_PREFIX + "current_category"; + public static final String ATTR_CURRENT_SUBDIVISION = IPCC_ATTR_PREFIX + "current_subdivision"; + public static final String ATTR_OLDEST_CATEGORY = IPCC_ATTR_PREFIX + "oldest_category"; + public static final String ATTR_PREVIOUS_CATEGORY = IPCC_ATTR_PREFIX + "previous_category"; + public static final String ATTR_PREVIOUS_SUBDIVISION = IPCC_ATTR_PREFIX + "previous_subdivision"; + private static final String CODE_LIST_LAND_USE = "land_use"; + private static final String CODE_LIST_LAND_USE_SUBCATEGORY = "land_use_subcategory"; + + private static final int IPCC_20_YEARS_RULE = 20; + + + private static final String PLOT_ENTITY = "plot"; + + private static final String TEMPLATE_LAND_USE_CATEGORY = "land_use_category"; + private static final String TEMPLATE_LAND_USE_CATEGORY_CHANGED = "land_use_category_has_changed"; + private static final String TEMPLATE_LAND_USE_CHANGE_ONCE = "land_use_change_once"; + private static final String TEMPLATE_LAND_USE_INITIAL_SUBDIVISION = "land_use_initial_subdivision"; + private static final String TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION = "land_use_initial_subdivision"; + private static final String TEMPLATE_LAND_USE_SECOND_SUBDIVISION = "second_lu_subdivision"; + private static final String TEMPLATE_LAND_USE_SUBCATEGORY = "land_use_subcategory"; + private static final String TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED = "land_use_subcategory_year_of_change"; + private static final String TEMPLATE_LAND_USE_SUBDIVISION = "land_use_subdivision"; + private static final String TEMPLATE_LAND_USE_SUBDIVISION_CHANGED = "land_use_subdivision_change"; + private static final String TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED = "land_use_subdivision_year_of_change"; + private static final String TEMPLATE_SECOND_LU_CHANGE = "second_lu_change"; + private static final String TEMPLATE_SECOND_LU_CONVERSION = "second_lu_conversion"; + private static final String TEMPLATE_SECOND_LU_CONVERSION_YEAR = "second_lu_conversion_year"; - private CroplandType(String name) { - this.name = name; - } + public static String getIpccCategoryAttrName(int year) { + return IPCC_ATTR_PREFIX + year + IPCC_CATEGORY; + } - public String getName() { - return name; + public static String getIpccSubdivisionAttrName(int year) { + return IPCC_ATTR_PREFIX + year + IPCC_SUBDIVISION; } - @Override - public String toString() { - return getName(); + private void addAuxilliaryAttributes(Survey survey, EntityDefinition plot) { + // Adds a Current Category LU 2022 calculated attribute to be used for the + // Subdivision as parent + CodeAttributeDefinition currentLu = survey.getSchema().createCodeAttributeDefinition(); + currentLu.setName(ATTR_CURRENT_CATEGORY); + currentLu.setListName(CODE_LIST_LAND_USE); + currentLu.setCalculated(true); + currentLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - current"); + AttributeDefault attributeDefault = new AttributeDefault(); + attributeDefault.setExpression("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 2, 1)"); // get the second + // character of the + // LU conversion CF + // --> F + ArrayList calculation = new ArrayList(); + calculation.add(attributeDefault); + currentLu.setAttributeDefaults(calculation); + plot.addChildDefinition(currentLu); + + // adds the Current Subdivision 2022 attribute, which is just a copy of + // land_use_subdivision + CodeAttributeDefinition currentLuSubdivision = survey.getSchema().createCodeAttributeDefinition(); + currentLuSubdivision.setName(ATTR_CURRENT_SUBDIVISION); + currentLuSubdivision.setListName(CODE_LIST_LAND_USE); + currentLuSubdivision.setParentCodeAttributeDefinition(currentLu); + currentLuSubdivision.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Subdivision - current"); + attributeDefault = new AttributeDefault(); + attributeDefault.setExpression(TEMPLATE_LAND_USE_SUBDIVISION); // gets the current LU subdivision + calculation = new ArrayList(); + calculation.add(attributeDefault); + currentLuSubdivision.setAttributeDefaults(calculation); + plot.addChildDefinition(currentLuSubdivision); + + // Adds a Previous Category LU using the LU Conversion attribute + CodeAttributeDefinition previousLu = survey.getSchema().createCodeAttributeDefinition(); + previousLu.setName(ATTR_PREVIOUS_CATEGORY); + previousLu.setListName(CODE_LIST_LAND_USE); + previousLu.setCalculated(true); + previousLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - previous"); + attributeDefault = new AttributeDefault(); + attributeDefault.setExpression("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 1, 1)"); // get the first + // character of the + // LU conversion CF + // --> C + calculation = new ArrayList(); + calculation.add(attributeDefault); + previousLu.setAttributeDefaults(calculation); + plot.addChildDefinition(previousLu); + + // Adds a Previous Category LU using the LU Conversion attribute + CodeAttributeDefinition oldestLu = survey.getSchema().createCodeAttributeDefinition(); + oldestLu.setName(ATTR_OLDEST_CATEGORY); + oldestLu.setListName(CODE_LIST_LAND_USE); + oldestLu.setCalculated(true); + oldestLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - oldest"); + calculation = new ArrayList(); + calculation.add(new AttributeDefault("substring( " + TEMPLATE_SECOND_LU_CONVERSION + ", 1,1)", // if the oldest + // LU conversion + // was FS then + // it becomes F + TEMPLATE_SECOND_LU_CHANGE + " = true() ")); + calculation.add(new AttributeDefault("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 1,1)", // if the oldest + // LU conversion + // was FS then + // it becomes F + "idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + ") or " + TEMPLATE_SECOND_LU_CHANGE + " = true() ")); + + oldestLu.setAttributeDefaults(calculation); + plot.addChildDefinition(oldestLu); + } + + private Survey addIPCCAttributes(Survey survey) { + EntityDefinition plot = survey.getSchema().getRootEntityDefinition("plot"); + addAuxilliaryAttributes(survey, plot); + + for (int year = IPCCGenerator.START_YEAR; year <= IPCCGenerator.END_YEAR; year++) { + addLuSubcategory(survey, plot, year); + CodeAttributeDefinition category = addLuCategory(survey, plot, year); + addLuSubdivision(survey, plot, category, year); + } + + return survey; } + + public Survey addIPCCAttributesToSurvey(Survey survey) throws IPCCGeneratorException { + // Check if the Survey follows the latest 2022 IPCC Survey Template + // If the survey is based on the latest IPCC 2022 Template no further processing + // is needed + if (!is2022IPCCTemplate(survey)) { + // Check that survey has necessary attributes and code-lists + checkSurveyLUAttributes(survey); + checkSurveyLUCodeLists(survey); + + // All the necessary attributes are present + // Add the yearly LAND USE cat/subcategory/subdivision attributes! + return addIPCCAttributes(survey); + + } else { + return survey; + } + } + + private CodeAttributeDefinition addLuCategory(Survey survey, EntityDefinition plot, int year) { + // Create the parent attribute for the LU Subcategory ( the initial Land Use) + CodeAttributeDefinition category = survey.getSchema().createCodeAttributeDefinition(); + category.setName(getIpccCategoryAttrName(year)); + category.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Category "); + category.setListName(CODE_LIST_LAND_USE); + category.setCalculated(true); + + ArrayList calculation = new ArrayList(); + calculation.add(new AttributeDefault("substring(" + (IPCC_ATTR_PREFIX + year + IPCC_SUBCATEGORY) + ", 2, 1)")); + + category.setAttributeDefaults(calculation); + plot.addChildDefinition(category); + return category; + } + + private void addLuSubcategory(Survey survey, EntityDefinition plot, int year) { + + // Create the parent attribute for the LU Subcategory ( the initial Land Use) + TextAttributeDefinition subcategory = survey.getSchema().createTextAttributeDefinition(); + subcategory.setName(IPCC_ATTR_PREFIX + year + IPCC_SUBCATEGORY); + subcategory.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Conversion "); + subcategory.setCalculated(true); + + int thresHold20Years = year - IPCC_20_YEARS_RULE; + + ArrayList calculation = new ArrayList(); + + calculation.add( + new AttributeDefault( + TEMPLATE_LAND_USE_SUBCATEGORY, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "!= true()" + + " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + ) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBCATEGORY, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + + " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year + + " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " >=" + thresHold20Years) + ); + + calculation.add(new AttributeDefault( + "concat(" + ATTR_CURRENT_CATEGORY + "," + ATTR_CURRENT_CATEGORY + ")", + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " < " + thresHold20Years) + ); + + calculation.add(new AttributeDefault( + "concat(" + ATTR_PREVIOUS_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", + TEMPLATE_LAND_USE_CATEGORY_CHANGED + + " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + + "and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " > " + year) + ); + + calculation.add(new AttributeDefault( + "concat(" + ATTR_OLDEST_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", + TEMPLATE_SECOND_LU_CHANGE + "=true() " + + "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year + + " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " >= " + thresHold20Years) + ); + + calculation.add(new AttributeDefault( + "concat(" + ATTR_PREVIOUS_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", + TEMPLATE_SECOND_LU_CHANGE + "=true() " + + " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " < " + thresHold20Years) + ); + + calculation.add(new AttributeDefault( + "concat(" + ATTR_OLDEST_CATEGORY + "," + ATTR_OLDEST_CATEGORY + ")", + TEMPLATE_SECOND_LU_CHANGE + "=true() " + + "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " >= "+ thresHold20Years) + ); + + subcategory.setAttributeDefaults(calculation); + subcategory.setAnnotation(null, ATTR_CURRENT_CATEGORY); + plot.addChildDefinition(subcategory); + } + + private void addLuSubdivision(Survey survey, EntityDefinition plot, CodeAttributeDefinition categoryParent, + int year) { + CodeAttributeDefinition subdivision = survey.getSchema().createCodeAttributeDefinition(); + subdivision.setName(getIpccSubdivisionAttrName(year)); + subdivision.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Subdivision "); + subdivision.setListName(CODE_LIST_LAND_USE); + subdivision.setParentCodeAttributeDefinition(categoryParent); + subdivision.setCalculated(true); + + ArrayList calculation = new ArrayList(); + + calculation + .add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBDIVISION, + TEMPLATE_LAND_USE_CHANGE_ONCE + "!= true()") + ); + + calculation + .add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBDIVISION, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + + " and ( idm:blank(" + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + " ) or " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + " != true() ) " + + " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, + TEMPLATE_SECOND_LU_CHANGE + " = true()" + + " and ( idm:blank(" + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " ) or " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " != true() ) "+ + " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year + + " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year + )); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBDIVISION, + TEMPLATE_SECOND_LU_CHANGE + " = true()" + + " and ( idm:blank(" + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " ) or " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " != true() ) "+ + " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year + )); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " = true() " + + " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + + "and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " > " + year) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, + TEMPLATE_SECOND_LU_CHANGE + "=true() " + + "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_SECOND_SUBDIVISION, + TEMPLATE_SECOND_LU_CHANGE + "=true() " + + "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " > " + year) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, + "( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + + " and " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=true() "+ + " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year + + " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year + + )); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBDIVISION, + "( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) "+ + " and " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() "+ + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=false() " + + "and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year + + )); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBDIVISION, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=false() "+ + " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year) + ); + + subdivision.setAttributeDefaults(calculation); + plot.addChildDefinition(subdivision); + + } + + private void checkSurveyLUAttributes(Survey survey) throws IPCCGeneratorException { + // Check that the LU attributes are already on the survey + // If one of them is not available an exception is thrown! + ArrayList luDefaultAttributePaths = new ArrayList(); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CATEGORY); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBCATEGORY); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_INITIAL_SUBDIVISION); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CONVERSION); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CONVERSION_YEAR); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CHANGE); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SECOND_SUBDIVISION); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CATEGORY_CHANGED); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CHANGE_ONCE); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED); + + for (String attributePath : luDefaultAttributePaths) { + try { + survey.getSchema().getDefinitionByPath(attributePath); + } catch (InvalidPathException e) { + throw new IPCCGeneratorException("Missing attribute in Survey : " + attributePath, e); + } + } + + } + + private void checkSurveyLUCodeLists(Survey survey) throws IPCCGeneratorException { + + ArrayList luCodeLists = new ArrayList(); + luCodeLists.add(CODE_LIST_LAND_USE); + luCodeLists.add(CODE_LIST_LAND_USE_SUBCATEGORY); + + for (String codeList : luCodeLists) { + try { + survey.getCodeList(codeList); + } catch (InvalidPathException e) { + throw new IPCCGeneratorException("Missing Code List in Survey : " + codeList, e); + } + } + } + + private boolean is2022IPCCTemplate(Survey survey) { + // TODO Auto-generated method stub + // Check if the survey is based on the very latest 2022 IPCC survey template + // with all the LU changes + return false; + } + } From 1dc127ba10076a19532a57f2b75e3f6d0cce0704 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:11 +0100 Subject: [PATCH 0435/1620] New translations IPCCGeneratorException.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 42 ++++++++++++------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index fb27fb933b..fed659b97f 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,20 +1,32 @@ -package org.openforis.collect.earth.ipcc.model; - -public class CroplandSubdivision extends LandUseSubdivision{ - - protected CroplandType type; - - public CroplandSubdivision( String code, String name, CroplandType type) { - super(LandUseCategory.C, code, name); - setType(type); +package org.openforis.collect.earth.ipcc; + +public class IPCCGeneratorException extends RdbExportException { + + /** + * + */ + private static final long serialVersionUID = 6236105290795112340L; + + public IPCCGeneratorException() { + super(); + // TODO Auto-generated constructor stub + } + + public IPCCGeneratorException(String message, Throwable cause, boolean enableSuppression, + boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } + + public IPCCGeneratorException(String message, Throwable cause) { + super(message, cause); + } + + public IPCCGeneratorException(String message) { + super(message); } - public CroplandType getType() { - return type; + public IPCCGeneratorException(Throwable cause) { + super(cause); } - public void setType(CroplandType type) { - this.type = type; - }; - } From d87f0f342830cc654d37b86654ad79d398fa69d5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:12 +0100 Subject: [PATCH 0436/1620] New translations IPCCGeneratorException.java (English) --- .../earth/app/view/Messages_en.properties | 29 +++++++++---------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index e13bbc0b81..fed659b97f 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,35 +1,32 @@ package org.openforis.collect.earth.ipcc; -public class RdbExportException extends Exception { +public class IPCCGeneratorException extends RdbExportException { - public RdbExportException() { + /** + * + */ + private static final long serialVersionUID = 6236105290795112340L; + + public IPCCGeneratorException() { super(); // TODO Auto-generated constructor stub } - public RdbExportException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + public IPCCGeneratorException(String message, Throwable cause, boolean enableSuppression, + boolean writableStackTrace) { super(message, cause, enableSuppression, writableStackTrace); - // TODO Auto-generated constructor stub } - public RdbExportException(String message, Throwable cause) { + public IPCCGeneratorException(String message, Throwable cause) { super(message, cause); - // TODO Auto-generated constructor stub } - public RdbExportException(String message) { + public IPCCGeneratorException(String message) { super(message); - // TODO Auto-generated constructor stub } - public RdbExportException(Throwable cause) { + public IPCCGeneratorException(Throwable cause) { super(cause); - // TODO Auto-generated constructor stub } - /** - * - */ - private static final long serialVersionUID = -5210016260577827042L; - -} \ No newline at end of file +} From 10da49cc1e115560223227d3c532afae69d924cb Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:13 +0100 Subject: [PATCH 0437/1620] New translations IPCCLandUses.java (French) --- .../earth/app/view/Messages_fr.properties | 479 +++++------------- 1 file changed, 115 insertions(+), 364 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 32e67d9b02..dd01ad946d 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,386 +1,137 @@ package org.openforis.collect.earth.ipcc; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.ArrayList; - -import org.openforis.idm.metamodel.AttributeDefault; -import org.openforis.idm.metamodel.CodeAttributeDefinition; -import org.openforis.idm.metamodel.EntityDefinition; -import org.openforis.idm.metamodel.NodeLabel; -import org.openforis.idm.metamodel.Survey; -import org.openforis.idm.metamodel.TextAttributeDefinition; -import org.openforis.idm.path.InvalidPathException; - -public class IPCCSurveyAdapter { - - public static final String IPCC_ATTR_PARENT_SUFIX = "_parent"; - public static final String IPCC_ATTR_PREFIX = "ipcc_"; - public static final String IPCC_CATEGORY = "_category"; - public static final String IPCC_SUBCATEGORY = "_subcategory"; - public static final String IPCC_SUBDIVISION = "_subdivision"; - - public static final String ATTR_CURRENT_CATEGORY = IPCC_ATTR_PREFIX + "current_category"; - public static final String ATTR_CURRENT_SUBDIVISION = IPCC_ATTR_PREFIX + "current_subdivision"; - public static final String ATTR_OLDEST_CATEGORY = IPCC_ATTR_PREFIX + "oldest_category"; - public static final String ATTR_PREVIOUS_CATEGORY = IPCC_ATTR_PREFIX + "previous_category"; - public static final String ATTR_PREVIOUS_SUBDIVISION = IPCC_ATTR_PREFIX + "previous_subdivision"; - private static final String CODE_LIST_LAND_USE = "land_use"; - private static final String CODE_LIST_LAND_USE_SUBCATEGORY = "land_use_subcategory"; - - private static final int IPCC_20_YEARS_RULE = 20; - - - private static final String PLOT_ENTITY = "plot"; - - private static final String TEMPLATE_LAND_USE_CATEGORY = "land_use_category"; - private static final String TEMPLATE_LAND_USE_CATEGORY_CHANGED = "land_use_category_has_changed"; - private static final String TEMPLATE_LAND_USE_CHANGE_ONCE = "land_use_change_once"; - private static final String TEMPLATE_LAND_USE_INITIAL_SUBDIVISION = "land_use_initial_subdivision"; - private static final String TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION = "land_use_initial_subdivision"; - private static final String TEMPLATE_LAND_USE_SECOND_SUBDIVISION = "second_lu_subdivision"; - private static final String TEMPLATE_LAND_USE_SUBCATEGORY = "land_use_subcategory"; - private static final String TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED = "land_use_subcategory_year_of_change"; - private static final String TEMPLATE_LAND_USE_SUBDIVISION = "land_use_subdivision"; - private static final String TEMPLATE_LAND_USE_SUBDIVISION_CHANGED = "land_use_subdivision_change"; - private static final String TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED = "land_use_subdivision_year_of_change"; - private static final String TEMPLATE_SECOND_LU_CHANGE = "second_lu_change"; - private static final String TEMPLATE_SECOND_LU_CONVERSION = "second_lu_conversion"; - private static final String TEMPLATE_SECOND_LU_CONVERSION_YEAR = "second_lu_conversion_year"; - - public static String getIpccCategoryAttrName(int year) { - return IPCC_ATTR_PREFIX + year + IPCC_CATEGORY; +import java.util.Collection; +import java.util.List; + +import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.RDBConnector; +import org.openforis.collect.earth.app.service.SchemaService; +import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; +import org.openforis.collect.earth.ipcc.model.CroplandType; +import org.openforis.collect.earth.ipcc.model.ForestSubdivision; +import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; +import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +import org.openforis.collect.earth.ipcc.model.ManagementType; +import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; +import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; +import org.openforis.collect.earth.ipcc.model.SettlementType; +import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Component; + +@Component +public class IPCCLandUses extends RDBConnector { + + private String schemaName; + private static final String LU_TABLE = "land_use_use_code"; + private static final String LU_CODE_COLUMN = "land_use_use"; + private static final String LU_SUBDIVISION_TABLE = "land_use_subdivision_code"; + private static final String LU_CATEGORY_ID = LU_TABLE +"_id"; + + Logger logger = LoggerFactory.getLogger(IPCCLandUses.class); + + @Autowired + private SchemaService schemaService; + + + public IPCCLandUses() { + setExportTypeUsed(ExportType.IPCC); } - public static String getIpccSubdivisionAttrName(int year) { - return IPCC_ATTR_PREFIX + year + IPCC_SUBDIVISION; - } - - private void addAuxilliaryAttributes(Survey survey, EntityDefinition plot) { - // Adds a Current Category LU 2022 calculated attribute to be used for the - // Subdivision as parent - CodeAttributeDefinition currentLu = survey.getSchema().createCodeAttributeDefinition(); - currentLu.setName(ATTR_CURRENT_CATEGORY); - currentLu.setListName(CODE_LIST_LAND_USE); - currentLu.setCalculated(true); - currentLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - current"); - AttributeDefault attributeDefault = new AttributeDefault(); - attributeDefault.setExpression("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 2, 1)"); // get the second - // character of the - // LU conversion CF - // --> F - ArrayList calculation = new ArrayList(); - calculation.add(attributeDefault); - currentLu.setAttributeDefaults(calculation); - plot.addChildDefinition(currentLu); + public List getLandUseSubdivisions() { - // adds the Current Subdivision 2022 attribute, which is just a copy of - // land_use_subdivision - CodeAttributeDefinition currentLuSubdivision = survey.getSchema().createCodeAttributeDefinition(); - currentLuSubdivision.setName(ATTR_CURRENT_SUBDIVISION); - currentLuSubdivision.setListName(CODE_LIST_LAND_USE); - currentLuSubdivision.setParentCodeAttributeDefinition(currentLu); - currentLuSubdivision.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Subdivision - current"); - attributeDefault = new AttributeDefault(); - attributeDefault.setExpression(TEMPLATE_LAND_USE_SUBDIVISION); // gets the current LU subdivision - calculation = new ArrayList(); - calculation.add(attributeDefault); - currentLuSubdivision.setAttributeDefaults(calculation); - plot.addChildDefinition(currentLuSubdivision); + schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - // Adds a Previous Category LU using the LU Conversion attribute - CodeAttributeDefinition previousLu = survey.getSchema().createCodeAttributeDefinition(); - previousLu.setName(ATTR_PREVIOUS_CATEGORY); - previousLu.setListName(CODE_LIST_LAND_USE); - previousLu.setCalculated(true); - previousLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - previous"); - attributeDefault = new AttributeDefault(); - attributeDefault.setExpression("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 1, 1)"); // get the first - // character of the - // LU conversion CF - // --> C - calculation = new ArrayList(); - calculation.add(attributeDefault); - previousLu.setAttributeDefaults(calculation); - plot.addChildDefinition(previousLu); + LandUseCategory[] lUseCategories = LandUseCategory.values(); - // Adds a Previous Category LU using the LU Conversion attribute - CodeAttributeDefinition oldestLu = survey.getSchema().createCodeAttributeDefinition(); - oldestLu.setName(ATTR_OLDEST_CATEGORY); - oldestLu.setListName(CODE_LIST_LAND_USE); - oldestLu.setCalculated(true); - oldestLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - oldest"); - calculation = new ArrayList(); - calculation.add(new AttributeDefault("substring( " + TEMPLATE_SECOND_LU_CONVERSION + ", 1,1)", // if the oldest - // LU conversion - // was FS then - // it becomes F - TEMPLATE_SECOND_LU_CHANGE + " = true() ")); - calculation.add(new AttributeDefault("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 1,1)", // if the oldest - // LU conversion - // was FS then - // it becomes F - "idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + ") or " + TEMPLATE_SECOND_LU_CHANGE + " = true() ")); - - oldestLu.setAttributeDefaults(calculation); - plot.addChildDefinition(oldestLu); - } + List lUseSubdivisions = new ArrayList(); - private Survey addIPCCAttributes(Survey survey) { - EntityDefinition plot = survey.getSchema().getRootEntityDefinition("plot"); - addAuxilliaryAttributes(survey, plot); - - for (int year = IPCCGenerator.START_YEAR; year <= IPCCGenerator.END_YEAR; year++) { - addLuSubcategory(survey, plot, year); - CodeAttributeDefinition category = addLuCategory(survey, plot, year); - addLuSubdivision(survey, plot, category, year); + for (int i = 0; i < lUseCategories.length; i++) { + + lUseSubdivisions.addAll( getSubdivisions(lUseCategories[i])); + } - return survey; - } - - public Survey addIPCCAttributesToSurvey(Survey survey) throws IPCCGeneratorException { - // Check if the Survey follows the latest 2022 IPCC Survey Template - // If the survey is based on the latest IPCC 2022 Template no further processing - // is needed - if (!is2022IPCCTemplate(survey)) { - // Check that survey has necessary attributes and code-lists - checkSurveyLUAttributes(survey); - checkSurveyLUCodeLists(survey); - - // All the necessary attributes are present - // Add the yearly LAND USE cat/subcategory/subdivision attributes! - return addIPCCAttributes(survey); - - } else { - return survey; - } - } - - private CodeAttributeDefinition addLuCategory(Survey survey, EntityDefinition plot, int year) { - // Create the parent attribute for the LU Subcategory ( the initial Land Use) - CodeAttributeDefinition category = survey.getSchema().createCodeAttributeDefinition(); - category.setName(getIpccCategoryAttrName(year)); - category.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Category "); - category.setListName(CODE_LIST_LAND_USE); - category.setCalculated(true); - - ArrayList calculation = new ArrayList(); - calculation.add(new AttributeDefault("substring(" + (IPCC_ATTR_PREFIX + year + IPCC_SUBCATEGORY) + ", 2, 1)")); - - category.setAttributeDefaults(calculation); - plot.addChildDefinition(category); - return category; - } - - private void addLuSubcategory(Survey survey, EntityDefinition plot, int year) { - - // Create the parent attribute for the LU Subcategory ( the initial Land Use) - TextAttributeDefinition subcategory = survey.getSchema().createTextAttributeDefinition(); - subcategory.setName(IPCC_ATTR_PREFIX + year + IPCC_SUBCATEGORY); - subcategory.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Conversion "); - subcategory.setCalculated(true); - - int thresHold20Years = year - IPCC_20_YEARS_RULE; - - ArrayList calculation = new ArrayList(); - - calculation.add( - new AttributeDefault( - TEMPLATE_LAND_USE_SUBCATEGORY, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + "!= true()" + - " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " - ) - ); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBCATEGORY, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + - " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year + - " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " >=" + thresHold20Years) - ); + return lUseSubdivisions; - calculation.add(new AttributeDefault( - "concat(" + ATTR_CURRENT_CATEGORY + "," + ATTR_CURRENT_CATEGORY + ")", - TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " < " + thresHold20Years) - ); - - calculation.add(new AttributeDefault( - "concat(" + ATTR_PREVIOUS_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", - TEMPLATE_LAND_USE_CATEGORY_CHANGED + - " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + - "and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " > " + year) - ); - - calculation.add(new AttributeDefault( - "concat(" + ATTR_OLDEST_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", - TEMPLATE_SECOND_LU_CHANGE + "=true() " + - "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year + - " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " >= " + thresHold20Years) - ); - - calculation.add(new AttributeDefault( - "concat(" + ATTR_PREVIOUS_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", - TEMPLATE_SECOND_LU_CHANGE + "=true() " + - " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " < " + thresHold20Years) - ); - - calculation.add(new AttributeDefault( - "concat(" + ATTR_OLDEST_CATEGORY + "," + ATTR_OLDEST_CATEGORY + ")", - TEMPLATE_SECOND_LU_CHANGE + "=true() " + - "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " >= "+ thresHold20Years) - ); - - subcategory.setAttributeDefaults(calculation); - subcategory.setAnnotation(null, ATTR_CURRENT_CATEGORY); - plot.addChildDefinition(subcategory); } - private void addLuSubdivision(Survey survey, EntityDefinition plot, CodeAttributeDefinition categoryParent, - int year) { - CodeAttributeDefinition subdivision = survey.getSchema().createCodeAttributeDefinition(); - subdivision.setName(getIpccSubdivisionAttrName(year)); - subdivision.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Subdivision "); - subdivision.setListName(CODE_LIST_LAND_USE); - subdivision.setParentCodeAttributeDefinition(categoryParent); - subdivision.setCalculated(true); - - ArrayList calculation = new ArrayList(); - - calculation - .add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBDIVISION, - TEMPLATE_LAND_USE_CHANGE_ONCE + "!= true()") - ); - - calculation - .add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBDIVISION, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + - " and ( idm:blank(" + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + " ) or " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + " != true() ) " + - " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year) - ); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, - TEMPLATE_SECOND_LU_CHANGE + " = true()" + - " and ( idm:blank(" + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " ) or " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " != true() ) "+ - " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year + - " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year - )); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBDIVISION, - TEMPLATE_SECOND_LU_CHANGE + " = true()" + - " and ( idm:blank(" + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " ) or " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " != true() ) "+ - " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year - )); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + " = true() " + - " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + - "and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " > " + year) + private Collection> getSubdivisions(LandUseCategory landUseCategory) { + + List> luSubdivisions = getJdbcTemplate().query( + "select " + + "land_use_subdivision,land_use_subdivision_label_fr" + + " from " + schemaName + LU_SUBDIVISION_TABLE + + " where " + LU_CATEGORY_ID + + " IN ( select " + LU_CATEGORY_ID + + " from " + schemaName + LU_TABLE + + " where " + LU_CODE_COLUMN + " = '" + landUseCategory.getCode()+ "'" + + ")" + , + getRowMapper(landUseCategory) ); - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, - TEMPLATE_SECOND_LU_CHANGE + "=true() " + - "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year) - ); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_SECOND_SUBDIVISION, - TEMPLATE_SECOND_LU_CHANGE + "=true() " + - "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " > " + year) - ); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, - "( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + - " and " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=true() "+ - " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year + - " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year - - )); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBDIVISION, - "( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) "+ - " and " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() "+ - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year) - ); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=false() " + - "and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year - - )); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBDIVISION, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=false() "+ - " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year) - ); - - subdivision.setAttributeDefaults(calculation); - plot.addChildDefinition(subdivision); - - } - - private void checkSurveyLUAttributes(Survey survey) throws IPCCGeneratorException { - // Check that the LU attributes are already on the survey - // If one of them is not available an exception is thrown! - ArrayList luDefaultAttributePaths = new ArrayList(); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CATEGORY); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBCATEGORY); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_INITIAL_SUBDIVISION); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CONVERSION); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CONVERSION_YEAR); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CHANGE); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SECOND_SUBDIVISION); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CATEGORY_CHANGED); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CHANGE_ONCE); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED); - - for (String attributePath : luDefaultAttributePaths) { - try { - survey.getSchema().getDefinitionByPath(attributePath); - } catch (InvalidPathException e) { - throw new IPCCGeneratorException("Missing attribute in Survey : " + attributePath, e); - } - } - + return luSubdivisions; } - private void checkSurveyLUCodeLists(Survey survey) throws IPCCGeneratorException { - - ArrayList luCodeLists = new ArrayList(); - luCodeLists.add(CODE_LIST_LAND_USE); - luCodeLists.add(CODE_LIST_LAND_USE_SUBCATEGORY); - - for (String codeList : luCodeLists) { - try { - survey.getCodeList(codeList); - } catch (InvalidPathException e) { - throw new IPCCGeneratorException("Missing Code List in Survey : " + codeList, e); + private RowMapper> getRowMapper(LandUseCategory landUseCategory) { + return new RowMapper>() { + @Override + public LandUseSubdivision mapRow(ResultSet rs, int rowNum) throws SQLException { + + String subdivisionCode = rs.getString(1); + String subdivisionName = rs.getString(2); + + switch (landUseCategory.getCode()) { + case "F": + return new ForestSubdivision( + subdivisionCode, + subdivisionName, + ManagementType.MANAGED // Assign default management + ); + case "C": + return new CroplandSubdivision( + subdivisionCode, + subdivisionName, + CroplandType.ANNUAL // Assign default management + ); + case "G": + return new GrasslandSubdivision( + subdivisionCode, + subdivisionName, + ManagementType.MANAGED // Assign default management + ); + case "S": + return new SettlementSubdivision( + subdivisionCode, + subdivisionName, + SettlementType.OTHER // Assign default management + ); + case "W": + return new WetlandSubdivision( + subdivisionCode, + subdivisionName, + ManagementType.UNMANAGED // Assign default management + ); + case "O": + return new OtherlandSubdivision( + subdivisionCode, + subdivisionName, + ManagementType.UNMANAGED // Assign default management + ); + default: + throw new IllegalArgumentException("Unknown code " + landUseCategory.getCode() ); + } + } - } + }; } - private boolean is2022IPCCTemplate(Survey survey) { - // TODO Auto-generated method stub - // Check if the survey is based on the very latest 2022 IPCC survey template - // with all the LU changes - return false; - } - } From ccfe206dc9c8b6990927fb6d48f350ddeaee5bbc Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:14 +0100 Subject: [PATCH 0438/1620] New translations IPCCLandUses.java (Spanish) --- .../earth/app/view/Messages_es.properties | 141 +++++++++++++++--- 1 file changed, 123 insertions(+), 18 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index fed659b97f..dd01ad946d 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,32 +1,137 @@ package org.openforis.collect.earth.ipcc; -public class IPCCGeneratorException extends RdbExportException { +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; - /** - * - */ - private static final long serialVersionUID = 6236105290795112340L; +import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.RDBConnector; +import org.openforis.collect.earth.app.service.SchemaService; +import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; +import org.openforis.collect.earth.ipcc.model.CroplandType; +import org.openforis.collect.earth.ipcc.model.ForestSubdivision; +import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; +import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +import org.openforis.collect.earth.ipcc.model.ManagementType; +import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; +import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; +import org.openforis.collect.earth.ipcc.model.SettlementType; +import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Component; - public IPCCGeneratorException() { - super(); - // TODO Auto-generated constructor stub - } +@Component +public class IPCCLandUses extends RDBConnector { + + private String schemaName; + private static final String LU_TABLE = "land_use_use_code"; + private static final String LU_CODE_COLUMN = "land_use_use"; + private static final String LU_SUBDIVISION_TABLE = "land_use_subdivision_code"; + private static final String LU_CATEGORY_ID = LU_TABLE +"_id"; + + Logger logger = LoggerFactory.getLogger(IPCCLandUses.class); + + @Autowired + private SchemaService schemaService; - public IPCCGeneratorException(String message, Throwable cause, boolean enableSuppression, - boolean writableStackTrace) { - super(message, cause, enableSuppression, writableStackTrace); + + public IPCCLandUses() { + setExportTypeUsed(ExportType.IPCC); } - public IPCCGeneratorException(String message, Throwable cause) { - super(message, cause); + public List getLandUseSubdivisions() { + + schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); + + LandUseCategory[] lUseCategories = LandUseCategory.values(); + + List lUseSubdivisions = new ArrayList(); + + for (int i = 0; i < lUseCategories.length; i++) { + + lUseSubdivisions.addAll( getSubdivisions(lUseCategories[i])); + + } + + return lUseSubdivisions; + } - public IPCCGeneratorException(String message) { - super(message); + private Collection> getSubdivisions(LandUseCategory landUseCategory) { + + List> luSubdivisions = getJdbcTemplate().query( + "select " + + "land_use_subdivision,land_use_subdivision_label_fr" + + " from " + schemaName + LU_SUBDIVISION_TABLE + + " where " + LU_CATEGORY_ID + + " IN ( select " + LU_CATEGORY_ID + + " from " + schemaName + LU_TABLE + + " where " + LU_CODE_COLUMN + " = '" + landUseCategory.getCode()+ "'" + + ")" + , + getRowMapper(landUseCategory) + ); + + return luSubdivisions; } - public IPCCGeneratorException(Throwable cause) { - super(cause); + private RowMapper> getRowMapper(LandUseCategory landUseCategory) { + return new RowMapper>() { + @Override + public LandUseSubdivision mapRow(ResultSet rs, int rowNum) throws SQLException { + + String subdivisionCode = rs.getString(1); + String subdivisionName = rs.getString(2); + + switch (landUseCategory.getCode()) { + case "F": + return new ForestSubdivision( + subdivisionCode, + subdivisionName, + ManagementType.MANAGED // Assign default management + ); + case "C": + return new CroplandSubdivision( + subdivisionCode, + subdivisionName, + CroplandType.ANNUAL // Assign default management + ); + case "G": + return new GrasslandSubdivision( + subdivisionCode, + subdivisionName, + ManagementType.MANAGED // Assign default management + ); + case "S": + return new SettlementSubdivision( + subdivisionCode, + subdivisionName, + SettlementType.OTHER // Assign default management + ); + case "W": + return new WetlandSubdivision( + subdivisionCode, + subdivisionName, + ManagementType.UNMANAGED // Assign default management + ); + case "O": + return new OtherlandSubdivision( + subdivisionCode, + subdivisionName, + ManagementType.UNMANAGED // Assign default management + ); + default: + throw new IllegalArgumentException("Unknown code " + landUseCategory.getCode() ); + } + + } + }; } } From 1d6e7ca548ce10a89dc6f2b878f228191d5cc8f0 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:16 +0100 Subject: [PATCH 0439/1620] New translations IPCCLandUses.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 141 +++++++++++++++--- 1 file changed, 123 insertions(+), 18 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index fed659b97f..dd01ad946d 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,32 +1,137 @@ package org.openforis.collect.earth.ipcc; -public class IPCCGeneratorException extends RdbExportException { +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; - /** - * - */ - private static final long serialVersionUID = 6236105290795112340L; +import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.RDBConnector; +import org.openforis.collect.earth.app.service.SchemaService; +import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; +import org.openforis.collect.earth.ipcc.model.CroplandType; +import org.openforis.collect.earth.ipcc.model.ForestSubdivision; +import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; +import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +import org.openforis.collect.earth.ipcc.model.ManagementType; +import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; +import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; +import org.openforis.collect.earth.ipcc.model.SettlementType; +import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Component; - public IPCCGeneratorException() { - super(); - // TODO Auto-generated constructor stub - } +@Component +public class IPCCLandUses extends RDBConnector { + + private String schemaName; + private static final String LU_TABLE = "land_use_use_code"; + private static final String LU_CODE_COLUMN = "land_use_use"; + private static final String LU_SUBDIVISION_TABLE = "land_use_subdivision_code"; + private static final String LU_CATEGORY_ID = LU_TABLE +"_id"; + + Logger logger = LoggerFactory.getLogger(IPCCLandUses.class); + + @Autowired + private SchemaService schemaService; - public IPCCGeneratorException(String message, Throwable cause, boolean enableSuppression, - boolean writableStackTrace) { - super(message, cause, enableSuppression, writableStackTrace); + + public IPCCLandUses() { + setExportTypeUsed(ExportType.IPCC); } - public IPCCGeneratorException(String message, Throwable cause) { - super(message, cause); + public List getLandUseSubdivisions() { + + schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); + + LandUseCategory[] lUseCategories = LandUseCategory.values(); + + List lUseSubdivisions = new ArrayList(); + + for (int i = 0; i < lUseCategories.length; i++) { + + lUseSubdivisions.addAll( getSubdivisions(lUseCategories[i])); + + } + + return lUseSubdivisions; + } - public IPCCGeneratorException(String message) { - super(message); + private Collection> getSubdivisions(LandUseCategory landUseCategory) { + + List> luSubdivisions = getJdbcTemplate().query( + "select " + + "land_use_subdivision,land_use_subdivision_label_fr" + + " from " + schemaName + LU_SUBDIVISION_TABLE + + " where " + LU_CATEGORY_ID + + " IN ( select " + LU_CATEGORY_ID + + " from " + schemaName + LU_TABLE + + " where " + LU_CODE_COLUMN + " = '" + landUseCategory.getCode()+ "'" + + ")" + , + getRowMapper(landUseCategory) + ); + + return luSubdivisions; } - public IPCCGeneratorException(Throwable cause) { - super(cause); + private RowMapper> getRowMapper(LandUseCategory landUseCategory) { + return new RowMapper>() { + @Override + public LandUseSubdivision mapRow(ResultSet rs, int rowNum) throws SQLException { + + String subdivisionCode = rs.getString(1); + String subdivisionName = rs.getString(2); + + switch (landUseCategory.getCode()) { + case "F": + return new ForestSubdivision( + subdivisionCode, + subdivisionName, + ManagementType.MANAGED // Assign default management + ); + case "C": + return new CroplandSubdivision( + subdivisionCode, + subdivisionName, + CroplandType.ANNUAL // Assign default management + ); + case "G": + return new GrasslandSubdivision( + subdivisionCode, + subdivisionName, + ManagementType.MANAGED // Assign default management + ); + case "S": + return new SettlementSubdivision( + subdivisionCode, + subdivisionName, + SettlementType.OTHER // Assign default management + ); + case "W": + return new WetlandSubdivision( + subdivisionCode, + subdivisionName, + ManagementType.UNMANAGED // Assign default management + ); + case "O": + return new OtherlandSubdivision( + subdivisionCode, + subdivisionName, + ManagementType.UNMANAGED // Assign default management + ); + default: + throw new IllegalArgumentException("Unknown code " + landUseCategory.getCode() ); + } + + } + }; } } From 6a37c736d097efb45922f6bf27afba1ed4a9d895 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:17 +0100 Subject: [PATCH 0440/1620] New translations IPCCLandUses.java (English) --- .../earth/app/view/Messages_en.properties | 141 +++++++++++++++--- 1 file changed, 123 insertions(+), 18 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index fed659b97f..dd01ad946d 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,32 +1,137 @@ package org.openforis.collect.earth.ipcc; -public class IPCCGeneratorException extends RdbExportException { +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; - /** - * - */ - private static final long serialVersionUID = 6236105290795112340L; +import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.RDBConnector; +import org.openforis.collect.earth.app.service.SchemaService; +import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; +import org.openforis.collect.earth.ipcc.model.CroplandType; +import org.openforis.collect.earth.ipcc.model.ForestSubdivision; +import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; +import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +import org.openforis.collect.earth.ipcc.model.ManagementType; +import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; +import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; +import org.openforis.collect.earth.ipcc.model.SettlementType; +import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Component; - public IPCCGeneratorException() { - super(); - // TODO Auto-generated constructor stub - } +@Component +public class IPCCLandUses extends RDBConnector { + + private String schemaName; + private static final String LU_TABLE = "land_use_use_code"; + private static final String LU_CODE_COLUMN = "land_use_use"; + private static final String LU_SUBDIVISION_TABLE = "land_use_subdivision_code"; + private static final String LU_CATEGORY_ID = LU_TABLE +"_id"; + + Logger logger = LoggerFactory.getLogger(IPCCLandUses.class); + + @Autowired + private SchemaService schemaService; - public IPCCGeneratorException(String message, Throwable cause, boolean enableSuppression, - boolean writableStackTrace) { - super(message, cause, enableSuppression, writableStackTrace); + + public IPCCLandUses() { + setExportTypeUsed(ExportType.IPCC); } - public IPCCGeneratorException(String message, Throwable cause) { - super(message, cause); + public List getLandUseSubdivisions() { + + schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); + + LandUseCategory[] lUseCategories = LandUseCategory.values(); + + List lUseSubdivisions = new ArrayList(); + + for (int i = 0; i < lUseCategories.length; i++) { + + lUseSubdivisions.addAll( getSubdivisions(lUseCategories[i])); + + } + + return lUseSubdivisions; + } - public IPCCGeneratorException(String message) { - super(message); + private Collection> getSubdivisions(LandUseCategory landUseCategory) { + + List> luSubdivisions = getJdbcTemplate().query( + "select " + + "land_use_subdivision,land_use_subdivision_label_fr" + + " from " + schemaName + LU_SUBDIVISION_TABLE + + " where " + LU_CATEGORY_ID + + " IN ( select " + LU_CATEGORY_ID + + " from " + schemaName + LU_TABLE + + " where " + LU_CODE_COLUMN + " = '" + landUseCategory.getCode()+ "'" + + ")" + , + getRowMapper(landUseCategory) + ); + + return luSubdivisions; } - public IPCCGeneratorException(Throwable cause) { - super(cause); + private RowMapper> getRowMapper(LandUseCategory landUseCategory) { + return new RowMapper>() { + @Override + public LandUseSubdivision mapRow(ResultSet rs, int rowNum) throws SQLException { + + String subdivisionCode = rs.getString(1); + String subdivisionName = rs.getString(2); + + switch (landUseCategory.getCode()) { + case "F": + return new ForestSubdivision( + subdivisionCode, + subdivisionName, + ManagementType.MANAGED // Assign default management + ); + case "C": + return new CroplandSubdivision( + subdivisionCode, + subdivisionName, + CroplandType.ANNUAL // Assign default management + ); + case "G": + return new GrasslandSubdivision( + subdivisionCode, + subdivisionName, + ManagementType.MANAGED // Assign default management + ); + case "S": + return new SettlementSubdivision( + subdivisionCode, + subdivisionName, + SettlementType.OTHER // Assign default management + ); + case "W": + return new WetlandSubdivision( + subdivisionCode, + subdivisionName, + ManagementType.UNMANAGED // Assign default management + ); + case "O": + return new OtherlandSubdivision( + subdivisionCode, + subdivisionName, + ManagementType.UNMANAGED // Assign default management + ); + default: + throw new IllegalArgumentException("Unknown code " + landUseCategory.getCode() ); + } + + } + }; } } From d42ffa4c9525e6533546037781bb5befa7ed7ecc Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:18 +0100 Subject: [PATCH 0441/1620] New translations IPCCRDBGenerator.java (French) --- .../earth/app/view/Messages_fr.properties | 147 ++++-------------- 1 file changed, 26 insertions(+), 121 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index dd01ad946d..d10cc6fb23 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,137 +1,42 @@ package org.openforis.collect.earth.ipcc; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; +import javax.swing.SwingUtilities; import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.RDBConnector; -import org.openforis.collect.earth.app.service.SchemaService; -import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; -import org.openforis.collect.earth.ipcc.model.CroplandType; -import org.openforis.collect.earth.ipcc.model.ForestSubdivision; -import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; -import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.openforis.collect.earth.ipcc.model.ManagementType; -import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; -import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; -import org.openforis.collect.earth.ipcc.model.SettlementType; -import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.openforis.collect.earth.app.service.RDBExporter; +import org.openforis.collect.earth.app.service.RDBPostProcessor; +import org.openforis.collect.earth.app.service.RegionCalculationUtils; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.concurrency.Progress; +import org.openforis.idm.metamodel.Survey; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Component; @Component -public class IPCCLandUses extends RDBConnector { - - private String schemaName; - private static final String LU_TABLE = "land_use_use_code"; - private static final String LU_CODE_COLUMN = "land_use_use"; - private static final String LU_SUBDIVISION_TABLE = "land_use_subdivision_code"; - private static final String LU_CATEGORY_ID = LU_TABLE +"_id"; - - Logger logger = LoggerFactory.getLogger(IPCCLandUses.class); - +public class IPCCRDBGenerator { + @Autowired - private SchemaService schemaService; - - - public IPCCLandUses() { - setExportTypeUsed(ExportType.IPCC); + RDBExporter rdbExporter; + + @Autowired + private RegionCalculationUtils regionCalculation; + + public void generateRelationalDatabase(Survey modifiedSurvey, InfiniteProgressMonitor infiniteProgressMonitor) { + RDBPostProcessor ipccCallback = postProcessIpccData(); + rdbExporter.exportDataToRDB(modifiedSurvey, ExportType.IPCC, infiniteProgressMonitor, ipccCallback); } - public List getLandUseSubdivisions() { - - schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - - LandUseCategory[] lUseCategories = LandUseCategory.values(); - - List lUseSubdivisions = new ArrayList(); - - for (int i = 0; i < lUseCategories.length; i++) { + private RDBPostProcessor postProcessIpccData() { + // return the implementation of a RDBPostProcessor interface (the callback when the initial RDB export is done so that we can add expansion factors ) + return (progressMonitor) -> { - lUseSubdivisions.addAll( getSubdivisions(lUseCategories[i])); + SwingUtilities.invokeLater( () -> progressMonitor.setMessage("Calculating expansion factors") ); + progressMonitor.progressMade(new Progress(0, 100)); + regionCalculation.handleRegionCalculation( ExportType.IPCC, rdbExporter.getJdbcTemplate() ); + progressMonitor.progressMade(new Progress(100, 100)); - } - - return lUseSubdivisions; - - } - - private Collection> getSubdivisions(LandUseCategory landUseCategory) { - - List> luSubdivisions = getJdbcTemplate().query( - "select " - + "land_use_subdivision,land_use_subdivision_label_fr" - + " from " + schemaName + LU_SUBDIVISION_TABLE - + " where " + LU_CATEGORY_ID - + " IN ( select " + LU_CATEGORY_ID - + " from " + schemaName + LU_TABLE - + " where " + LU_CODE_COLUMN + " = '" + landUseCategory.getCode()+ "'" - + ")" - , - getRowMapper(landUseCategory) - ); - - return luSubdivisions; - } - - private RowMapper> getRowMapper(LandUseCategory landUseCategory) { - return new RowMapper>() { - @Override - public LandUseSubdivision mapRow(ResultSet rs, int rowNum) throws SQLException { - - String subdivisionCode = rs.getString(1); - String subdivisionName = rs.getString(2); - - switch (landUseCategory.getCode()) { - case "F": - return new ForestSubdivision( - subdivisionCode, - subdivisionName, - ManagementType.MANAGED // Assign default management - ); - case "C": - return new CroplandSubdivision( - subdivisionCode, - subdivisionName, - CroplandType.ANNUAL // Assign default management - ); - case "G": - return new GrasslandSubdivision( - subdivisionCode, - subdivisionName, - ManagementType.MANAGED // Assign default management - ); - case "S": - return new SettlementSubdivision( - subdivisionCode, - subdivisionName, - SettlementType.OTHER // Assign default management - ); - case "W": - return new WetlandSubdivision( - subdivisionCode, - subdivisionName, - ManagementType.UNMANAGED // Assign default management - ); - case "O": - return new OtherlandSubdivision( - subdivisionCode, - subdivisionName, - ManagementType.UNMANAGED // Assign default management - ); - default: - throw new IllegalArgumentException("Unknown code " + landUseCategory.getCode() ); - } - - } }; } - + + } From bb752086d21a0ec2284f2f4b77f6e392b20040f4 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:19 +0100 Subject: [PATCH 0442/1620] New translations IPCCRDBGenerator.java (Spanish) --- .../earth/app/view/Messages_es.properties | 147 ++++-------------- 1 file changed, 26 insertions(+), 121 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index dd01ad946d..d10cc6fb23 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,137 +1,42 @@ package org.openforis.collect.earth.ipcc; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; +import javax.swing.SwingUtilities; import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.RDBConnector; -import org.openforis.collect.earth.app.service.SchemaService; -import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; -import org.openforis.collect.earth.ipcc.model.CroplandType; -import org.openforis.collect.earth.ipcc.model.ForestSubdivision; -import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; -import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.openforis.collect.earth.ipcc.model.ManagementType; -import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; -import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; -import org.openforis.collect.earth.ipcc.model.SettlementType; -import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.openforis.collect.earth.app.service.RDBExporter; +import org.openforis.collect.earth.app.service.RDBPostProcessor; +import org.openforis.collect.earth.app.service.RegionCalculationUtils; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.concurrency.Progress; +import org.openforis.idm.metamodel.Survey; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Component; @Component -public class IPCCLandUses extends RDBConnector { - - private String schemaName; - private static final String LU_TABLE = "land_use_use_code"; - private static final String LU_CODE_COLUMN = "land_use_use"; - private static final String LU_SUBDIVISION_TABLE = "land_use_subdivision_code"; - private static final String LU_CATEGORY_ID = LU_TABLE +"_id"; - - Logger logger = LoggerFactory.getLogger(IPCCLandUses.class); - +public class IPCCRDBGenerator { + @Autowired - private SchemaService schemaService; - - - public IPCCLandUses() { - setExportTypeUsed(ExportType.IPCC); + RDBExporter rdbExporter; + + @Autowired + private RegionCalculationUtils regionCalculation; + + public void generateRelationalDatabase(Survey modifiedSurvey, InfiniteProgressMonitor infiniteProgressMonitor) { + RDBPostProcessor ipccCallback = postProcessIpccData(); + rdbExporter.exportDataToRDB(modifiedSurvey, ExportType.IPCC, infiniteProgressMonitor, ipccCallback); } - public List getLandUseSubdivisions() { - - schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - - LandUseCategory[] lUseCategories = LandUseCategory.values(); - - List lUseSubdivisions = new ArrayList(); - - for (int i = 0; i < lUseCategories.length; i++) { + private RDBPostProcessor postProcessIpccData() { + // return the implementation of a RDBPostProcessor interface (the callback when the initial RDB export is done so that we can add expansion factors ) + return (progressMonitor) -> { - lUseSubdivisions.addAll( getSubdivisions(lUseCategories[i])); + SwingUtilities.invokeLater( () -> progressMonitor.setMessage("Calculating expansion factors") ); + progressMonitor.progressMade(new Progress(0, 100)); + regionCalculation.handleRegionCalculation( ExportType.IPCC, rdbExporter.getJdbcTemplate() ); + progressMonitor.progressMade(new Progress(100, 100)); - } - - return lUseSubdivisions; - - } - - private Collection> getSubdivisions(LandUseCategory landUseCategory) { - - List> luSubdivisions = getJdbcTemplate().query( - "select " - + "land_use_subdivision,land_use_subdivision_label_fr" - + " from " + schemaName + LU_SUBDIVISION_TABLE - + " where " + LU_CATEGORY_ID - + " IN ( select " + LU_CATEGORY_ID - + " from " + schemaName + LU_TABLE - + " where " + LU_CODE_COLUMN + " = '" + landUseCategory.getCode()+ "'" - + ")" - , - getRowMapper(landUseCategory) - ); - - return luSubdivisions; - } - - private RowMapper> getRowMapper(LandUseCategory landUseCategory) { - return new RowMapper>() { - @Override - public LandUseSubdivision mapRow(ResultSet rs, int rowNum) throws SQLException { - - String subdivisionCode = rs.getString(1); - String subdivisionName = rs.getString(2); - - switch (landUseCategory.getCode()) { - case "F": - return new ForestSubdivision( - subdivisionCode, - subdivisionName, - ManagementType.MANAGED // Assign default management - ); - case "C": - return new CroplandSubdivision( - subdivisionCode, - subdivisionName, - CroplandType.ANNUAL // Assign default management - ); - case "G": - return new GrasslandSubdivision( - subdivisionCode, - subdivisionName, - ManagementType.MANAGED // Assign default management - ); - case "S": - return new SettlementSubdivision( - subdivisionCode, - subdivisionName, - SettlementType.OTHER // Assign default management - ); - case "W": - return new WetlandSubdivision( - subdivisionCode, - subdivisionName, - ManagementType.UNMANAGED // Assign default management - ); - case "O": - return new OtherlandSubdivision( - subdivisionCode, - subdivisionName, - ManagementType.UNMANAGED // Assign default management - ); - default: - throw new IllegalArgumentException("Unknown code " + landUseCategory.getCode() ); - } - - } }; } - + + } From a353eed199603c27f6ae0327ae89479ee6223d1c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:20 +0100 Subject: [PATCH 0443/1620] New translations IPCCRDBGenerator.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 147 ++++-------------- 1 file changed, 26 insertions(+), 121 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index dd01ad946d..d10cc6fb23 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,137 +1,42 @@ package org.openforis.collect.earth.ipcc; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; +import javax.swing.SwingUtilities; import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.RDBConnector; -import org.openforis.collect.earth.app.service.SchemaService; -import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; -import org.openforis.collect.earth.ipcc.model.CroplandType; -import org.openforis.collect.earth.ipcc.model.ForestSubdivision; -import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; -import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.openforis.collect.earth.ipcc.model.ManagementType; -import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; -import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; -import org.openforis.collect.earth.ipcc.model.SettlementType; -import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.openforis.collect.earth.app.service.RDBExporter; +import org.openforis.collect.earth.app.service.RDBPostProcessor; +import org.openforis.collect.earth.app.service.RegionCalculationUtils; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.concurrency.Progress; +import org.openforis.idm.metamodel.Survey; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Component; @Component -public class IPCCLandUses extends RDBConnector { - - private String schemaName; - private static final String LU_TABLE = "land_use_use_code"; - private static final String LU_CODE_COLUMN = "land_use_use"; - private static final String LU_SUBDIVISION_TABLE = "land_use_subdivision_code"; - private static final String LU_CATEGORY_ID = LU_TABLE +"_id"; - - Logger logger = LoggerFactory.getLogger(IPCCLandUses.class); - +public class IPCCRDBGenerator { + @Autowired - private SchemaService schemaService; - - - public IPCCLandUses() { - setExportTypeUsed(ExportType.IPCC); + RDBExporter rdbExporter; + + @Autowired + private RegionCalculationUtils regionCalculation; + + public void generateRelationalDatabase(Survey modifiedSurvey, InfiniteProgressMonitor infiniteProgressMonitor) { + RDBPostProcessor ipccCallback = postProcessIpccData(); + rdbExporter.exportDataToRDB(modifiedSurvey, ExportType.IPCC, infiniteProgressMonitor, ipccCallback); } - public List getLandUseSubdivisions() { - - schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - - LandUseCategory[] lUseCategories = LandUseCategory.values(); - - List lUseSubdivisions = new ArrayList(); - - for (int i = 0; i < lUseCategories.length; i++) { + private RDBPostProcessor postProcessIpccData() { + // return the implementation of a RDBPostProcessor interface (the callback when the initial RDB export is done so that we can add expansion factors ) + return (progressMonitor) -> { - lUseSubdivisions.addAll( getSubdivisions(lUseCategories[i])); + SwingUtilities.invokeLater( () -> progressMonitor.setMessage("Calculating expansion factors") ); + progressMonitor.progressMade(new Progress(0, 100)); + regionCalculation.handleRegionCalculation( ExportType.IPCC, rdbExporter.getJdbcTemplate() ); + progressMonitor.progressMade(new Progress(100, 100)); - } - - return lUseSubdivisions; - - } - - private Collection> getSubdivisions(LandUseCategory landUseCategory) { - - List> luSubdivisions = getJdbcTemplate().query( - "select " - + "land_use_subdivision,land_use_subdivision_label_fr" - + " from " + schemaName + LU_SUBDIVISION_TABLE - + " where " + LU_CATEGORY_ID - + " IN ( select " + LU_CATEGORY_ID - + " from " + schemaName + LU_TABLE - + " where " + LU_CODE_COLUMN + " = '" + landUseCategory.getCode()+ "'" - + ")" - , - getRowMapper(landUseCategory) - ); - - return luSubdivisions; - } - - private RowMapper> getRowMapper(LandUseCategory landUseCategory) { - return new RowMapper>() { - @Override - public LandUseSubdivision mapRow(ResultSet rs, int rowNum) throws SQLException { - - String subdivisionCode = rs.getString(1); - String subdivisionName = rs.getString(2); - - switch (landUseCategory.getCode()) { - case "F": - return new ForestSubdivision( - subdivisionCode, - subdivisionName, - ManagementType.MANAGED // Assign default management - ); - case "C": - return new CroplandSubdivision( - subdivisionCode, - subdivisionName, - CroplandType.ANNUAL // Assign default management - ); - case "G": - return new GrasslandSubdivision( - subdivisionCode, - subdivisionName, - ManagementType.MANAGED // Assign default management - ); - case "S": - return new SettlementSubdivision( - subdivisionCode, - subdivisionName, - SettlementType.OTHER // Assign default management - ); - case "W": - return new WetlandSubdivision( - subdivisionCode, - subdivisionName, - ManagementType.UNMANAGED // Assign default management - ); - case "O": - return new OtherlandSubdivision( - subdivisionCode, - subdivisionName, - ManagementType.UNMANAGED // Assign default management - ); - default: - throw new IllegalArgumentException("Unknown code " + landUseCategory.getCode() ); - } - - } }; } - + + } From ee31f5a39fd7352250ceff2f264097fccd141cd4 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:21 +0100 Subject: [PATCH 0444/1620] New translations IPCCRDBGenerator.java (English) --- .../earth/app/view/Messages_en.properties | 147 ++++-------------- 1 file changed, 26 insertions(+), 121 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index dd01ad946d..d10cc6fb23 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,137 +1,42 @@ package org.openforis.collect.earth.ipcc; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; +import javax.swing.SwingUtilities; import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.RDBConnector; -import org.openforis.collect.earth.app.service.SchemaService; -import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; -import org.openforis.collect.earth.ipcc.model.CroplandType; -import org.openforis.collect.earth.ipcc.model.ForestSubdivision; -import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; -import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.openforis.collect.earth.ipcc.model.ManagementType; -import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; -import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; -import org.openforis.collect.earth.ipcc.model.SettlementType; -import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.openforis.collect.earth.app.service.RDBExporter; +import org.openforis.collect.earth.app.service.RDBPostProcessor; +import org.openforis.collect.earth.app.service.RegionCalculationUtils; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.concurrency.Progress; +import org.openforis.idm.metamodel.Survey; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Component; @Component -public class IPCCLandUses extends RDBConnector { - - private String schemaName; - private static final String LU_TABLE = "land_use_use_code"; - private static final String LU_CODE_COLUMN = "land_use_use"; - private static final String LU_SUBDIVISION_TABLE = "land_use_subdivision_code"; - private static final String LU_CATEGORY_ID = LU_TABLE +"_id"; - - Logger logger = LoggerFactory.getLogger(IPCCLandUses.class); - +public class IPCCRDBGenerator { + @Autowired - private SchemaService schemaService; - - - public IPCCLandUses() { - setExportTypeUsed(ExportType.IPCC); + RDBExporter rdbExporter; + + @Autowired + private RegionCalculationUtils regionCalculation; + + public void generateRelationalDatabase(Survey modifiedSurvey, InfiniteProgressMonitor infiniteProgressMonitor) { + RDBPostProcessor ipccCallback = postProcessIpccData(); + rdbExporter.exportDataToRDB(modifiedSurvey, ExportType.IPCC, infiniteProgressMonitor, ipccCallback); } - public List getLandUseSubdivisions() { - - schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - - LandUseCategory[] lUseCategories = LandUseCategory.values(); - - List lUseSubdivisions = new ArrayList(); - - for (int i = 0; i < lUseCategories.length; i++) { + private RDBPostProcessor postProcessIpccData() { + // return the implementation of a RDBPostProcessor interface (the callback when the initial RDB export is done so that we can add expansion factors ) + return (progressMonitor) -> { - lUseSubdivisions.addAll( getSubdivisions(lUseCategories[i])); + SwingUtilities.invokeLater( () -> progressMonitor.setMessage("Calculating expansion factors") ); + progressMonitor.progressMade(new Progress(0, 100)); + regionCalculation.handleRegionCalculation( ExportType.IPCC, rdbExporter.getJdbcTemplate() ); + progressMonitor.progressMade(new Progress(100, 100)); - } - - return lUseSubdivisions; - - } - - private Collection> getSubdivisions(LandUseCategory landUseCategory) { - - List> luSubdivisions = getJdbcTemplate().query( - "select " - + "land_use_subdivision,land_use_subdivision_label_fr" - + " from " + schemaName + LU_SUBDIVISION_TABLE - + " where " + LU_CATEGORY_ID - + " IN ( select " + LU_CATEGORY_ID - + " from " + schemaName + LU_TABLE - + " where " + LU_CODE_COLUMN + " = '" + landUseCategory.getCode()+ "'" - + ")" - , - getRowMapper(landUseCategory) - ); - - return luSubdivisions; - } - - private RowMapper> getRowMapper(LandUseCategory landUseCategory) { - return new RowMapper>() { - @Override - public LandUseSubdivision mapRow(ResultSet rs, int rowNum) throws SQLException { - - String subdivisionCode = rs.getString(1); - String subdivisionName = rs.getString(2); - - switch (landUseCategory.getCode()) { - case "F": - return new ForestSubdivision( - subdivisionCode, - subdivisionName, - ManagementType.MANAGED // Assign default management - ); - case "C": - return new CroplandSubdivision( - subdivisionCode, - subdivisionName, - CroplandType.ANNUAL // Assign default management - ); - case "G": - return new GrasslandSubdivision( - subdivisionCode, - subdivisionName, - ManagementType.MANAGED // Assign default management - ); - case "S": - return new SettlementSubdivision( - subdivisionCode, - subdivisionName, - SettlementType.OTHER // Assign default management - ); - case "W": - return new WetlandSubdivision( - subdivisionCode, - subdivisionName, - ManagementType.UNMANAGED // Assign default management - ); - case "O": - return new OtherlandSubdivision( - subdivisionCode, - subdivisionName, - ManagementType.UNMANAGED // Assign default management - ); - default: - throw new IllegalArgumentException("Unknown code " + landUseCategory.getCode() ); - } - - } }; } - + + } From e5ea998ab652f4d70d58363ff668d8b835a85910 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:22 +0100 Subject: [PATCH 0445/1620] New translations IPCCSurveyAdapter.java (Spanish) --- .../earth/app/view/Messages_es.properties | 414 ++++++++++++++++-- 1 file changed, 379 insertions(+), 35 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index d10cc6fb23..32e67d9b02 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,42 +1,386 @@ package org.openforis.collect.earth.ipcc; -import javax.swing.SwingUtilities; - -import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.RDBExporter; -import org.openforis.collect.earth.app.service.RDBPostProcessor; -import org.openforis.collect.earth.app.service.RegionCalculationUtils; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.concurrency.Progress; +import java.util.ArrayList; + +import org.openforis.idm.metamodel.AttributeDefault; +import org.openforis.idm.metamodel.CodeAttributeDefinition; +import org.openforis.idm.metamodel.EntityDefinition; +import org.openforis.idm.metamodel.NodeLabel; import org.openforis.idm.metamodel.Survey; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; +import org.openforis.idm.metamodel.TextAttributeDefinition; +import org.openforis.idm.path.InvalidPathException; -@Component -public class IPCCRDBGenerator { - - @Autowired - RDBExporter rdbExporter; - - @Autowired - private RegionCalculationUtils regionCalculation; +public class IPCCSurveyAdapter { + + public static final String IPCC_ATTR_PARENT_SUFIX = "_parent"; + public static final String IPCC_ATTR_PREFIX = "ipcc_"; + public static final String IPCC_CATEGORY = "_category"; + public static final String IPCC_SUBCATEGORY = "_subcategory"; + public static final String IPCC_SUBDIVISION = "_subdivision"; + + public static final String ATTR_CURRENT_CATEGORY = IPCC_ATTR_PREFIX + "current_category"; + public static final String ATTR_CURRENT_SUBDIVISION = IPCC_ATTR_PREFIX + "current_subdivision"; + public static final String ATTR_OLDEST_CATEGORY = IPCC_ATTR_PREFIX + "oldest_category"; + public static final String ATTR_PREVIOUS_CATEGORY = IPCC_ATTR_PREFIX + "previous_category"; + public static final String ATTR_PREVIOUS_SUBDIVISION = IPCC_ATTR_PREFIX + "previous_subdivision"; + private static final String CODE_LIST_LAND_USE = "land_use"; + private static final String CODE_LIST_LAND_USE_SUBCATEGORY = "land_use_subcategory"; + + private static final int IPCC_20_YEARS_RULE = 20; + + + private static final String PLOT_ENTITY = "plot"; + + private static final String TEMPLATE_LAND_USE_CATEGORY = "land_use_category"; + private static final String TEMPLATE_LAND_USE_CATEGORY_CHANGED = "land_use_category_has_changed"; + private static final String TEMPLATE_LAND_USE_CHANGE_ONCE = "land_use_change_once"; + private static final String TEMPLATE_LAND_USE_INITIAL_SUBDIVISION = "land_use_initial_subdivision"; + private static final String TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION = "land_use_initial_subdivision"; + private static final String TEMPLATE_LAND_USE_SECOND_SUBDIVISION = "second_lu_subdivision"; + private static final String TEMPLATE_LAND_USE_SUBCATEGORY = "land_use_subcategory"; + private static final String TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED = "land_use_subcategory_year_of_change"; + private static final String TEMPLATE_LAND_USE_SUBDIVISION = "land_use_subdivision"; + private static final String TEMPLATE_LAND_USE_SUBDIVISION_CHANGED = "land_use_subdivision_change"; + private static final String TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED = "land_use_subdivision_year_of_change"; + private static final String TEMPLATE_SECOND_LU_CHANGE = "second_lu_change"; + private static final String TEMPLATE_SECOND_LU_CONVERSION = "second_lu_conversion"; + private static final String TEMPLATE_SECOND_LU_CONVERSION_YEAR = "second_lu_conversion_year"; - public void generateRelationalDatabase(Survey modifiedSurvey, InfiniteProgressMonitor infiniteProgressMonitor) { - RDBPostProcessor ipccCallback = postProcessIpccData(); - rdbExporter.exportDataToRDB(modifiedSurvey, ExportType.IPCC, infiniteProgressMonitor, ipccCallback); - } - - private RDBPostProcessor postProcessIpccData() { - // return the implementation of a RDBPostProcessor interface (the callback when the initial RDB export is done so that we can add expansion factors ) - return (progressMonitor) -> { - - SwingUtilities.invokeLater( () -> progressMonitor.setMessage("Calculating expansion factors") ); - progressMonitor.progressMade(new Progress(0, 100)); - regionCalculation.handleRegionCalculation( ExportType.IPCC, rdbExporter.getJdbcTemplate() ); - progressMonitor.progressMade(new Progress(100, 100)); - - }; + public static String getIpccCategoryAttrName(int year) { + return IPCC_ATTR_PREFIX + year + IPCC_CATEGORY; } - - + + public static String getIpccSubdivisionAttrName(int year) { + return IPCC_ATTR_PREFIX + year + IPCC_SUBDIVISION; + } + + private void addAuxilliaryAttributes(Survey survey, EntityDefinition plot) { + // Adds a Current Category LU 2022 calculated attribute to be used for the + // Subdivision as parent + CodeAttributeDefinition currentLu = survey.getSchema().createCodeAttributeDefinition(); + currentLu.setName(ATTR_CURRENT_CATEGORY); + currentLu.setListName(CODE_LIST_LAND_USE); + currentLu.setCalculated(true); + currentLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - current"); + AttributeDefault attributeDefault = new AttributeDefault(); + attributeDefault.setExpression("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 2, 1)"); // get the second + // character of the + // LU conversion CF + // --> F + ArrayList calculation = new ArrayList(); + calculation.add(attributeDefault); + currentLu.setAttributeDefaults(calculation); + plot.addChildDefinition(currentLu); + + // adds the Current Subdivision 2022 attribute, which is just a copy of + // land_use_subdivision + CodeAttributeDefinition currentLuSubdivision = survey.getSchema().createCodeAttributeDefinition(); + currentLuSubdivision.setName(ATTR_CURRENT_SUBDIVISION); + currentLuSubdivision.setListName(CODE_LIST_LAND_USE); + currentLuSubdivision.setParentCodeAttributeDefinition(currentLu); + currentLuSubdivision.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Subdivision - current"); + attributeDefault = new AttributeDefault(); + attributeDefault.setExpression(TEMPLATE_LAND_USE_SUBDIVISION); // gets the current LU subdivision + calculation = new ArrayList(); + calculation.add(attributeDefault); + currentLuSubdivision.setAttributeDefaults(calculation); + plot.addChildDefinition(currentLuSubdivision); + + // Adds a Previous Category LU using the LU Conversion attribute + CodeAttributeDefinition previousLu = survey.getSchema().createCodeAttributeDefinition(); + previousLu.setName(ATTR_PREVIOUS_CATEGORY); + previousLu.setListName(CODE_LIST_LAND_USE); + previousLu.setCalculated(true); + previousLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - previous"); + attributeDefault = new AttributeDefault(); + attributeDefault.setExpression("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 1, 1)"); // get the first + // character of the + // LU conversion CF + // --> C + calculation = new ArrayList(); + calculation.add(attributeDefault); + previousLu.setAttributeDefaults(calculation); + plot.addChildDefinition(previousLu); + + // Adds a Previous Category LU using the LU Conversion attribute + CodeAttributeDefinition oldestLu = survey.getSchema().createCodeAttributeDefinition(); + oldestLu.setName(ATTR_OLDEST_CATEGORY); + oldestLu.setListName(CODE_LIST_LAND_USE); + oldestLu.setCalculated(true); + oldestLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - oldest"); + calculation = new ArrayList(); + calculation.add(new AttributeDefault("substring( " + TEMPLATE_SECOND_LU_CONVERSION + ", 1,1)", // if the oldest + // LU conversion + // was FS then + // it becomes F + TEMPLATE_SECOND_LU_CHANGE + " = true() ")); + calculation.add(new AttributeDefault("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 1,1)", // if the oldest + // LU conversion + // was FS then + // it becomes F + "idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + ") or " + TEMPLATE_SECOND_LU_CHANGE + " = true() ")); + + oldestLu.setAttributeDefaults(calculation); + plot.addChildDefinition(oldestLu); + } + + private Survey addIPCCAttributes(Survey survey) { + EntityDefinition plot = survey.getSchema().getRootEntityDefinition("plot"); + addAuxilliaryAttributes(survey, plot); + + for (int year = IPCCGenerator.START_YEAR; year <= IPCCGenerator.END_YEAR; year++) { + addLuSubcategory(survey, plot, year); + CodeAttributeDefinition category = addLuCategory(survey, plot, year); + addLuSubdivision(survey, plot, category, year); + } + + return survey; + } + + public Survey addIPCCAttributesToSurvey(Survey survey) throws IPCCGeneratorException { + // Check if the Survey follows the latest 2022 IPCC Survey Template + // If the survey is based on the latest IPCC 2022 Template no further processing + // is needed + if (!is2022IPCCTemplate(survey)) { + // Check that survey has necessary attributes and code-lists + checkSurveyLUAttributes(survey); + checkSurveyLUCodeLists(survey); + + // All the necessary attributes are present + // Add the yearly LAND USE cat/subcategory/subdivision attributes! + return addIPCCAttributes(survey); + + } else { + return survey; + } + } + + private CodeAttributeDefinition addLuCategory(Survey survey, EntityDefinition plot, int year) { + // Create the parent attribute for the LU Subcategory ( the initial Land Use) + CodeAttributeDefinition category = survey.getSchema().createCodeAttributeDefinition(); + category.setName(getIpccCategoryAttrName(year)); + category.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Category "); + category.setListName(CODE_LIST_LAND_USE); + category.setCalculated(true); + + ArrayList calculation = new ArrayList(); + calculation.add(new AttributeDefault("substring(" + (IPCC_ATTR_PREFIX + year + IPCC_SUBCATEGORY) + ", 2, 1)")); + + category.setAttributeDefaults(calculation); + plot.addChildDefinition(category); + return category; + } + + private void addLuSubcategory(Survey survey, EntityDefinition plot, int year) { + + // Create the parent attribute for the LU Subcategory ( the initial Land Use) + TextAttributeDefinition subcategory = survey.getSchema().createTextAttributeDefinition(); + subcategory.setName(IPCC_ATTR_PREFIX + year + IPCC_SUBCATEGORY); + subcategory.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Conversion "); + subcategory.setCalculated(true); + + int thresHold20Years = year - IPCC_20_YEARS_RULE; + + ArrayList calculation = new ArrayList(); + + calculation.add( + new AttributeDefault( + TEMPLATE_LAND_USE_SUBCATEGORY, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "!= true()" + + " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + ) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBCATEGORY, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + + " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year + + " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " >=" + thresHold20Years) + ); + + calculation.add(new AttributeDefault( + "concat(" + ATTR_CURRENT_CATEGORY + "," + ATTR_CURRENT_CATEGORY + ")", + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " < " + thresHold20Years) + ); + + calculation.add(new AttributeDefault( + "concat(" + ATTR_PREVIOUS_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", + TEMPLATE_LAND_USE_CATEGORY_CHANGED + + " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + + "and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " > " + year) + ); + + calculation.add(new AttributeDefault( + "concat(" + ATTR_OLDEST_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", + TEMPLATE_SECOND_LU_CHANGE + "=true() " + + "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year + + " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " >= " + thresHold20Years) + ); + + calculation.add(new AttributeDefault( + "concat(" + ATTR_PREVIOUS_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", + TEMPLATE_SECOND_LU_CHANGE + "=true() " + + " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " < " + thresHold20Years) + ); + + calculation.add(new AttributeDefault( + "concat(" + ATTR_OLDEST_CATEGORY + "," + ATTR_OLDEST_CATEGORY + ")", + TEMPLATE_SECOND_LU_CHANGE + "=true() " + + "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " >= "+ thresHold20Years) + ); + + subcategory.setAttributeDefaults(calculation); + subcategory.setAnnotation(null, ATTR_CURRENT_CATEGORY); + plot.addChildDefinition(subcategory); + } + + private void addLuSubdivision(Survey survey, EntityDefinition plot, CodeAttributeDefinition categoryParent, + int year) { + CodeAttributeDefinition subdivision = survey.getSchema().createCodeAttributeDefinition(); + subdivision.setName(getIpccSubdivisionAttrName(year)); + subdivision.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Subdivision "); + subdivision.setListName(CODE_LIST_LAND_USE); + subdivision.setParentCodeAttributeDefinition(categoryParent); + subdivision.setCalculated(true); + + ArrayList calculation = new ArrayList(); + + calculation + .add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBDIVISION, + TEMPLATE_LAND_USE_CHANGE_ONCE + "!= true()") + ); + + calculation + .add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBDIVISION, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + + " and ( idm:blank(" + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + " ) or " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + " != true() ) " + + " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, + TEMPLATE_SECOND_LU_CHANGE + " = true()" + + " and ( idm:blank(" + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " ) or " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " != true() ) "+ + " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year + + " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year + )); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBDIVISION, + TEMPLATE_SECOND_LU_CHANGE + " = true()" + + " and ( idm:blank(" + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " ) or " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " != true() ) "+ + " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year + )); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " = true() " + + " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + + "and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " > " + year) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, + TEMPLATE_SECOND_LU_CHANGE + "=true() " + + "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_SECOND_SUBDIVISION, + TEMPLATE_SECOND_LU_CHANGE + "=true() " + + "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " > " + year) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, + "( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + + " and " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=true() "+ + " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year + + " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year + + )); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBDIVISION, + "( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) "+ + " and " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() "+ + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=false() " + + "and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year + + )); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBDIVISION, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=false() "+ + " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year) + ); + + subdivision.setAttributeDefaults(calculation); + plot.addChildDefinition(subdivision); + + } + + private void checkSurveyLUAttributes(Survey survey) throws IPCCGeneratorException { + // Check that the LU attributes are already on the survey + // If one of them is not available an exception is thrown! + ArrayList luDefaultAttributePaths = new ArrayList(); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CATEGORY); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBCATEGORY); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_INITIAL_SUBDIVISION); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CONVERSION); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CONVERSION_YEAR); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CHANGE); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SECOND_SUBDIVISION); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CATEGORY_CHANGED); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CHANGE_ONCE); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED); + + for (String attributePath : luDefaultAttributePaths) { + try { + survey.getSchema().getDefinitionByPath(attributePath); + } catch (InvalidPathException e) { + throw new IPCCGeneratorException("Missing attribute in Survey : " + attributePath, e); + } + } + + } + + private void checkSurveyLUCodeLists(Survey survey) throws IPCCGeneratorException { + + ArrayList luCodeLists = new ArrayList(); + luCodeLists.add(CODE_LIST_LAND_USE); + luCodeLists.add(CODE_LIST_LAND_USE_SUBCATEGORY); + + for (String codeList : luCodeLists) { + try { + survey.getCodeList(codeList); + } catch (InvalidPathException e) { + throw new IPCCGeneratorException("Missing Code List in Survey : " + codeList, e); + } + } + } + + private boolean is2022IPCCTemplate(Survey survey) { + // TODO Auto-generated method stub + // Check if the survey is based on the very latest 2022 IPCC survey template + // with all the LU changes + return false; + } + } From da82e423d012376ecee728f2d6039281ba959046 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:23 +0100 Subject: [PATCH 0446/1620] New translations RdbExportException.java (French) --- .../earth/app/view/Messages_fr.properties | 67 +++++++++---------- 1 file changed, 30 insertions(+), 37 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index d10cc6fb23..e13bbc0b81 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,42 +1,35 @@ package org.openforis.collect.earth.ipcc; -import javax.swing.SwingUtilities; - -import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.RDBExporter; -import org.openforis.collect.earth.app.service.RDBPostProcessor; -import org.openforis.collect.earth.app.service.RegionCalculationUtils; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.concurrency.Progress; -import org.openforis.idm.metamodel.Survey; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public class IPCCRDBGenerator { - - @Autowired - RDBExporter rdbExporter; - - @Autowired - private RegionCalculationUtils regionCalculation; - - public void generateRelationalDatabase(Survey modifiedSurvey, InfiniteProgressMonitor infiniteProgressMonitor) { - RDBPostProcessor ipccCallback = postProcessIpccData(); - rdbExporter.exportDataToRDB(modifiedSurvey, ExportType.IPCC, infiniteProgressMonitor, ipccCallback); +public class RdbExportException extends Exception { + + public RdbExportException() { + super(); + // TODO Auto-generated constructor stub + } + + public RdbExportException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + // TODO Auto-generated constructor stub + } + + public RdbExportException(String message, Throwable cause) { + super(message, cause); + // TODO Auto-generated constructor stub } - private RDBPostProcessor postProcessIpccData() { - // return the implementation of a RDBPostProcessor interface (the callback when the initial RDB export is done so that we can add expansion factors ) - return (progressMonitor) -> { - - SwingUtilities.invokeLater( () -> progressMonitor.setMessage("Calculating expansion factors") ); - progressMonitor.progressMade(new Progress(0, 100)); - regionCalculation.handleRegionCalculation( ExportType.IPCC, rdbExporter.getJdbcTemplate() ); - progressMonitor.progressMade(new Progress(100, 100)); - - }; + public RdbExportException(String message) { + super(message); + // TODO Auto-generated constructor stub } - - -} + + public RdbExportException(Throwable cause) { + super(cause); + // TODO Auto-generated constructor stub + } + + /** + * + */ + private static final long serialVersionUID = -5210016260577827042L; + +} \ No newline at end of file From 0ee3427d8b8cba19a12743927629eaa049d00fe5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:24 +0100 Subject: [PATCH 0447/1620] New translations IPCCSurveyAdapter.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 414 ++++++++++++++++-- 1 file changed, 379 insertions(+), 35 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index d10cc6fb23..32e67d9b02 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,42 +1,386 @@ package org.openforis.collect.earth.ipcc; -import javax.swing.SwingUtilities; - -import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.RDBExporter; -import org.openforis.collect.earth.app.service.RDBPostProcessor; -import org.openforis.collect.earth.app.service.RegionCalculationUtils; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.concurrency.Progress; +import java.util.ArrayList; + +import org.openforis.idm.metamodel.AttributeDefault; +import org.openforis.idm.metamodel.CodeAttributeDefinition; +import org.openforis.idm.metamodel.EntityDefinition; +import org.openforis.idm.metamodel.NodeLabel; import org.openforis.idm.metamodel.Survey; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; +import org.openforis.idm.metamodel.TextAttributeDefinition; +import org.openforis.idm.path.InvalidPathException; -@Component -public class IPCCRDBGenerator { - - @Autowired - RDBExporter rdbExporter; - - @Autowired - private RegionCalculationUtils regionCalculation; +public class IPCCSurveyAdapter { + + public static final String IPCC_ATTR_PARENT_SUFIX = "_parent"; + public static final String IPCC_ATTR_PREFIX = "ipcc_"; + public static final String IPCC_CATEGORY = "_category"; + public static final String IPCC_SUBCATEGORY = "_subcategory"; + public static final String IPCC_SUBDIVISION = "_subdivision"; + + public static final String ATTR_CURRENT_CATEGORY = IPCC_ATTR_PREFIX + "current_category"; + public static final String ATTR_CURRENT_SUBDIVISION = IPCC_ATTR_PREFIX + "current_subdivision"; + public static final String ATTR_OLDEST_CATEGORY = IPCC_ATTR_PREFIX + "oldest_category"; + public static final String ATTR_PREVIOUS_CATEGORY = IPCC_ATTR_PREFIX + "previous_category"; + public static final String ATTR_PREVIOUS_SUBDIVISION = IPCC_ATTR_PREFIX + "previous_subdivision"; + private static final String CODE_LIST_LAND_USE = "land_use"; + private static final String CODE_LIST_LAND_USE_SUBCATEGORY = "land_use_subcategory"; + + private static final int IPCC_20_YEARS_RULE = 20; + + + private static final String PLOT_ENTITY = "plot"; + + private static final String TEMPLATE_LAND_USE_CATEGORY = "land_use_category"; + private static final String TEMPLATE_LAND_USE_CATEGORY_CHANGED = "land_use_category_has_changed"; + private static final String TEMPLATE_LAND_USE_CHANGE_ONCE = "land_use_change_once"; + private static final String TEMPLATE_LAND_USE_INITIAL_SUBDIVISION = "land_use_initial_subdivision"; + private static final String TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION = "land_use_initial_subdivision"; + private static final String TEMPLATE_LAND_USE_SECOND_SUBDIVISION = "second_lu_subdivision"; + private static final String TEMPLATE_LAND_USE_SUBCATEGORY = "land_use_subcategory"; + private static final String TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED = "land_use_subcategory_year_of_change"; + private static final String TEMPLATE_LAND_USE_SUBDIVISION = "land_use_subdivision"; + private static final String TEMPLATE_LAND_USE_SUBDIVISION_CHANGED = "land_use_subdivision_change"; + private static final String TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED = "land_use_subdivision_year_of_change"; + private static final String TEMPLATE_SECOND_LU_CHANGE = "second_lu_change"; + private static final String TEMPLATE_SECOND_LU_CONVERSION = "second_lu_conversion"; + private static final String TEMPLATE_SECOND_LU_CONVERSION_YEAR = "second_lu_conversion_year"; - public void generateRelationalDatabase(Survey modifiedSurvey, InfiniteProgressMonitor infiniteProgressMonitor) { - RDBPostProcessor ipccCallback = postProcessIpccData(); - rdbExporter.exportDataToRDB(modifiedSurvey, ExportType.IPCC, infiniteProgressMonitor, ipccCallback); - } - - private RDBPostProcessor postProcessIpccData() { - // return the implementation of a RDBPostProcessor interface (the callback when the initial RDB export is done so that we can add expansion factors ) - return (progressMonitor) -> { - - SwingUtilities.invokeLater( () -> progressMonitor.setMessage("Calculating expansion factors") ); - progressMonitor.progressMade(new Progress(0, 100)); - regionCalculation.handleRegionCalculation( ExportType.IPCC, rdbExporter.getJdbcTemplate() ); - progressMonitor.progressMade(new Progress(100, 100)); - - }; + public static String getIpccCategoryAttrName(int year) { + return IPCC_ATTR_PREFIX + year + IPCC_CATEGORY; } - - + + public static String getIpccSubdivisionAttrName(int year) { + return IPCC_ATTR_PREFIX + year + IPCC_SUBDIVISION; + } + + private void addAuxilliaryAttributes(Survey survey, EntityDefinition plot) { + // Adds a Current Category LU 2022 calculated attribute to be used for the + // Subdivision as parent + CodeAttributeDefinition currentLu = survey.getSchema().createCodeAttributeDefinition(); + currentLu.setName(ATTR_CURRENT_CATEGORY); + currentLu.setListName(CODE_LIST_LAND_USE); + currentLu.setCalculated(true); + currentLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - current"); + AttributeDefault attributeDefault = new AttributeDefault(); + attributeDefault.setExpression("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 2, 1)"); // get the second + // character of the + // LU conversion CF + // --> F + ArrayList calculation = new ArrayList(); + calculation.add(attributeDefault); + currentLu.setAttributeDefaults(calculation); + plot.addChildDefinition(currentLu); + + // adds the Current Subdivision 2022 attribute, which is just a copy of + // land_use_subdivision + CodeAttributeDefinition currentLuSubdivision = survey.getSchema().createCodeAttributeDefinition(); + currentLuSubdivision.setName(ATTR_CURRENT_SUBDIVISION); + currentLuSubdivision.setListName(CODE_LIST_LAND_USE); + currentLuSubdivision.setParentCodeAttributeDefinition(currentLu); + currentLuSubdivision.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Subdivision - current"); + attributeDefault = new AttributeDefault(); + attributeDefault.setExpression(TEMPLATE_LAND_USE_SUBDIVISION); // gets the current LU subdivision + calculation = new ArrayList(); + calculation.add(attributeDefault); + currentLuSubdivision.setAttributeDefaults(calculation); + plot.addChildDefinition(currentLuSubdivision); + + // Adds a Previous Category LU using the LU Conversion attribute + CodeAttributeDefinition previousLu = survey.getSchema().createCodeAttributeDefinition(); + previousLu.setName(ATTR_PREVIOUS_CATEGORY); + previousLu.setListName(CODE_LIST_LAND_USE); + previousLu.setCalculated(true); + previousLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - previous"); + attributeDefault = new AttributeDefault(); + attributeDefault.setExpression("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 1, 1)"); // get the first + // character of the + // LU conversion CF + // --> C + calculation = new ArrayList(); + calculation.add(attributeDefault); + previousLu.setAttributeDefaults(calculation); + plot.addChildDefinition(previousLu); + + // Adds a Previous Category LU using the LU Conversion attribute + CodeAttributeDefinition oldestLu = survey.getSchema().createCodeAttributeDefinition(); + oldestLu.setName(ATTR_OLDEST_CATEGORY); + oldestLu.setListName(CODE_LIST_LAND_USE); + oldestLu.setCalculated(true); + oldestLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - oldest"); + calculation = new ArrayList(); + calculation.add(new AttributeDefault("substring( " + TEMPLATE_SECOND_LU_CONVERSION + ", 1,1)", // if the oldest + // LU conversion + // was FS then + // it becomes F + TEMPLATE_SECOND_LU_CHANGE + " = true() ")); + calculation.add(new AttributeDefault("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 1,1)", // if the oldest + // LU conversion + // was FS then + // it becomes F + "idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + ") or " + TEMPLATE_SECOND_LU_CHANGE + " = true() ")); + + oldestLu.setAttributeDefaults(calculation); + plot.addChildDefinition(oldestLu); + } + + private Survey addIPCCAttributes(Survey survey) { + EntityDefinition plot = survey.getSchema().getRootEntityDefinition("plot"); + addAuxilliaryAttributes(survey, plot); + + for (int year = IPCCGenerator.START_YEAR; year <= IPCCGenerator.END_YEAR; year++) { + addLuSubcategory(survey, plot, year); + CodeAttributeDefinition category = addLuCategory(survey, plot, year); + addLuSubdivision(survey, plot, category, year); + } + + return survey; + } + + public Survey addIPCCAttributesToSurvey(Survey survey) throws IPCCGeneratorException { + // Check if the Survey follows the latest 2022 IPCC Survey Template + // If the survey is based on the latest IPCC 2022 Template no further processing + // is needed + if (!is2022IPCCTemplate(survey)) { + // Check that survey has necessary attributes and code-lists + checkSurveyLUAttributes(survey); + checkSurveyLUCodeLists(survey); + + // All the necessary attributes are present + // Add the yearly LAND USE cat/subcategory/subdivision attributes! + return addIPCCAttributes(survey); + + } else { + return survey; + } + } + + private CodeAttributeDefinition addLuCategory(Survey survey, EntityDefinition plot, int year) { + // Create the parent attribute for the LU Subcategory ( the initial Land Use) + CodeAttributeDefinition category = survey.getSchema().createCodeAttributeDefinition(); + category.setName(getIpccCategoryAttrName(year)); + category.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Category "); + category.setListName(CODE_LIST_LAND_USE); + category.setCalculated(true); + + ArrayList calculation = new ArrayList(); + calculation.add(new AttributeDefault("substring(" + (IPCC_ATTR_PREFIX + year + IPCC_SUBCATEGORY) + ", 2, 1)")); + + category.setAttributeDefaults(calculation); + plot.addChildDefinition(category); + return category; + } + + private void addLuSubcategory(Survey survey, EntityDefinition plot, int year) { + + // Create the parent attribute for the LU Subcategory ( the initial Land Use) + TextAttributeDefinition subcategory = survey.getSchema().createTextAttributeDefinition(); + subcategory.setName(IPCC_ATTR_PREFIX + year + IPCC_SUBCATEGORY); + subcategory.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Conversion "); + subcategory.setCalculated(true); + + int thresHold20Years = year - IPCC_20_YEARS_RULE; + + ArrayList calculation = new ArrayList(); + + calculation.add( + new AttributeDefault( + TEMPLATE_LAND_USE_SUBCATEGORY, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "!= true()" + + " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + ) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBCATEGORY, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + + " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year + + " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " >=" + thresHold20Years) + ); + + calculation.add(new AttributeDefault( + "concat(" + ATTR_CURRENT_CATEGORY + "," + ATTR_CURRENT_CATEGORY + ")", + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " < " + thresHold20Years) + ); + + calculation.add(new AttributeDefault( + "concat(" + ATTR_PREVIOUS_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", + TEMPLATE_LAND_USE_CATEGORY_CHANGED + + " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + + "and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " > " + year) + ); + + calculation.add(new AttributeDefault( + "concat(" + ATTR_OLDEST_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", + TEMPLATE_SECOND_LU_CHANGE + "=true() " + + "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year + + " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " >= " + thresHold20Years) + ); + + calculation.add(new AttributeDefault( + "concat(" + ATTR_PREVIOUS_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", + TEMPLATE_SECOND_LU_CHANGE + "=true() " + + " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " < " + thresHold20Years) + ); + + calculation.add(new AttributeDefault( + "concat(" + ATTR_OLDEST_CATEGORY + "," + ATTR_OLDEST_CATEGORY + ")", + TEMPLATE_SECOND_LU_CHANGE + "=true() " + + "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " >= "+ thresHold20Years) + ); + + subcategory.setAttributeDefaults(calculation); + subcategory.setAnnotation(null, ATTR_CURRENT_CATEGORY); + plot.addChildDefinition(subcategory); + } + + private void addLuSubdivision(Survey survey, EntityDefinition plot, CodeAttributeDefinition categoryParent, + int year) { + CodeAttributeDefinition subdivision = survey.getSchema().createCodeAttributeDefinition(); + subdivision.setName(getIpccSubdivisionAttrName(year)); + subdivision.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Subdivision "); + subdivision.setListName(CODE_LIST_LAND_USE); + subdivision.setParentCodeAttributeDefinition(categoryParent); + subdivision.setCalculated(true); + + ArrayList calculation = new ArrayList(); + + calculation + .add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBDIVISION, + TEMPLATE_LAND_USE_CHANGE_ONCE + "!= true()") + ); + + calculation + .add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBDIVISION, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + + " and ( idm:blank(" + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + " ) or " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + " != true() ) " + + " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, + TEMPLATE_SECOND_LU_CHANGE + " = true()" + + " and ( idm:blank(" + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " ) or " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " != true() ) "+ + " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year + + " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year + )); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBDIVISION, + TEMPLATE_SECOND_LU_CHANGE + " = true()" + + " and ( idm:blank(" + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " ) or " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " != true() ) "+ + " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year + )); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " = true() " + + " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + + "and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " > " + year) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, + TEMPLATE_SECOND_LU_CHANGE + "=true() " + + "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_SECOND_SUBDIVISION, + TEMPLATE_SECOND_LU_CHANGE + "=true() " + + "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " > " + year) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, + "( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + + " and " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=true() "+ + " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year + + " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year + + )); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBDIVISION, + "( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) "+ + " and " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() "+ + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=false() " + + "and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year + + )); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBDIVISION, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=false() "+ + " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year) + ); + + subdivision.setAttributeDefaults(calculation); + plot.addChildDefinition(subdivision); + + } + + private void checkSurveyLUAttributes(Survey survey) throws IPCCGeneratorException { + // Check that the LU attributes are already on the survey + // If one of them is not available an exception is thrown! + ArrayList luDefaultAttributePaths = new ArrayList(); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CATEGORY); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBCATEGORY); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_INITIAL_SUBDIVISION); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CONVERSION); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CONVERSION_YEAR); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CHANGE); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SECOND_SUBDIVISION); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CATEGORY_CHANGED); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CHANGE_ONCE); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED); + + for (String attributePath : luDefaultAttributePaths) { + try { + survey.getSchema().getDefinitionByPath(attributePath); + } catch (InvalidPathException e) { + throw new IPCCGeneratorException("Missing attribute in Survey : " + attributePath, e); + } + } + + } + + private void checkSurveyLUCodeLists(Survey survey) throws IPCCGeneratorException { + + ArrayList luCodeLists = new ArrayList(); + luCodeLists.add(CODE_LIST_LAND_USE); + luCodeLists.add(CODE_LIST_LAND_USE_SUBCATEGORY); + + for (String codeList : luCodeLists) { + try { + survey.getCodeList(codeList); + } catch (InvalidPathException e) { + throw new IPCCGeneratorException("Missing Code List in Survey : " + codeList, e); + } + } + } + + private boolean is2022IPCCTemplate(Survey survey) { + // TODO Auto-generated method stub + // Check if the survey is based on the very latest 2022 IPCC survey template + // with all the LU changes + return false; + } + } From 53deb18dcb1df68700264c1ddfa7c94b9f6888fb Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:25 +0100 Subject: [PATCH 0448/1620] New translations IPCCSurveyAdapter.java (English) --- .../earth/app/view/Messages_en.properties | 414 ++++++++++++++++-- 1 file changed, 379 insertions(+), 35 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index d10cc6fb23..32e67d9b02 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,42 +1,386 @@ package org.openforis.collect.earth.ipcc; -import javax.swing.SwingUtilities; - -import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.RDBExporter; -import org.openforis.collect.earth.app.service.RDBPostProcessor; -import org.openforis.collect.earth.app.service.RegionCalculationUtils; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.concurrency.Progress; +import java.util.ArrayList; + +import org.openforis.idm.metamodel.AttributeDefault; +import org.openforis.idm.metamodel.CodeAttributeDefinition; +import org.openforis.idm.metamodel.EntityDefinition; +import org.openforis.idm.metamodel.NodeLabel; import org.openforis.idm.metamodel.Survey; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; +import org.openforis.idm.metamodel.TextAttributeDefinition; +import org.openforis.idm.path.InvalidPathException; -@Component -public class IPCCRDBGenerator { - - @Autowired - RDBExporter rdbExporter; - - @Autowired - private RegionCalculationUtils regionCalculation; +public class IPCCSurveyAdapter { + + public static final String IPCC_ATTR_PARENT_SUFIX = "_parent"; + public static final String IPCC_ATTR_PREFIX = "ipcc_"; + public static final String IPCC_CATEGORY = "_category"; + public static final String IPCC_SUBCATEGORY = "_subcategory"; + public static final String IPCC_SUBDIVISION = "_subdivision"; + + public static final String ATTR_CURRENT_CATEGORY = IPCC_ATTR_PREFIX + "current_category"; + public static final String ATTR_CURRENT_SUBDIVISION = IPCC_ATTR_PREFIX + "current_subdivision"; + public static final String ATTR_OLDEST_CATEGORY = IPCC_ATTR_PREFIX + "oldest_category"; + public static final String ATTR_PREVIOUS_CATEGORY = IPCC_ATTR_PREFIX + "previous_category"; + public static final String ATTR_PREVIOUS_SUBDIVISION = IPCC_ATTR_PREFIX + "previous_subdivision"; + private static final String CODE_LIST_LAND_USE = "land_use"; + private static final String CODE_LIST_LAND_USE_SUBCATEGORY = "land_use_subcategory"; + + private static final int IPCC_20_YEARS_RULE = 20; + + + private static final String PLOT_ENTITY = "plot"; + + private static final String TEMPLATE_LAND_USE_CATEGORY = "land_use_category"; + private static final String TEMPLATE_LAND_USE_CATEGORY_CHANGED = "land_use_category_has_changed"; + private static final String TEMPLATE_LAND_USE_CHANGE_ONCE = "land_use_change_once"; + private static final String TEMPLATE_LAND_USE_INITIAL_SUBDIVISION = "land_use_initial_subdivision"; + private static final String TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION = "land_use_initial_subdivision"; + private static final String TEMPLATE_LAND_USE_SECOND_SUBDIVISION = "second_lu_subdivision"; + private static final String TEMPLATE_LAND_USE_SUBCATEGORY = "land_use_subcategory"; + private static final String TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED = "land_use_subcategory_year_of_change"; + private static final String TEMPLATE_LAND_USE_SUBDIVISION = "land_use_subdivision"; + private static final String TEMPLATE_LAND_USE_SUBDIVISION_CHANGED = "land_use_subdivision_change"; + private static final String TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED = "land_use_subdivision_year_of_change"; + private static final String TEMPLATE_SECOND_LU_CHANGE = "second_lu_change"; + private static final String TEMPLATE_SECOND_LU_CONVERSION = "second_lu_conversion"; + private static final String TEMPLATE_SECOND_LU_CONVERSION_YEAR = "second_lu_conversion_year"; - public void generateRelationalDatabase(Survey modifiedSurvey, InfiniteProgressMonitor infiniteProgressMonitor) { - RDBPostProcessor ipccCallback = postProcessIpccData(); - rdbExporter.exportDataToRDB(modifiedSurvey, ExportType.IPCC, infiniteProgressMonitor, ipccCallback); - } - - private RDBPostProcessor postProcessIpccData() { - // return the implementation of a RDBPostProcessor interface (the callback when the initial RDB export is done so that we can add expansion factors ) - return (progressMonitor) -> { - - SwingUtilities.invokeLater( () -> progressMonitor.setMessage("Calculating expansion factors") ); - progressMonitor.progressMade(new Progress(0, 100)); - regionCalculation.handleRegionCalculation( ExportType.IPCC, rdbExporter.getJdbcTemplate() ); - progressMonitor.progressMade(new Progress(100, 100)); - - }; + public static String getIpccCategoryAttrName(int year) { + return IPCC_ATTR_PREFIX + year + IPCC_CATEGORY; } - - + + public static String getIpccSubdivisionAttrName(int year) { + return IPCC_ATTR_PREFIX + year + IPCC_SUBDIVISION; + } + + private void addAuxilliaryAttributes(Survey survey, EntityDefinition plot) { + // Adds a Current Category LU 2022 calculated attribute to be used for the + // Subdivision as parent + CodeAttributeDefinition currentLu = survey.getSchema().createCodeAttributeDefinition(); + currentLu.setName(ATTR_CURRENT_CATEGORY); + currentLu.setListName(CODE_LIST_LAND_USE); + currentLu.setCalculated(true); + currentLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - current"); + AttributeDefault attributeDefault = new AttributeDefault(); + attributeDefault.setExpression("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 2, 1)"); // get the second + // character of the + // LU conversion CF + // --> F + ArrayList calculation = new ArrayList(); + calculation.add(attributeDefault); + currentLu.setAttributeDefaults(calculation); + plot.addChildDefinition(currentLu); + + // adds the Current Subdivision 2022 attribute, which is just a copy of + // land_use_subdivision + CodeAttributeDefinition currentLuSubdivision = survey.getSchema().createCodeAttributeDefinition(); + currentLuSubdivision.setName(ATTR_CURRENT_SUBDIVISION); + currentLuSubdivision.setListName(CODE_LIST_LAND_USE); + currentLuSubdivision.setParentCodeAttributeDefinition(currentLu); + currentLuSubdivision.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Subdivision - current"); + attributeDefault = new AttributeDefault(); + attributeDefault.setExpression(TEMPLATE_LAND_USE_SUBDIVISION); // gets the current LU subdivision + calculation = new ArrayList(); + calculation.add(attributeDefault); + currentLuSubdivision.setAttributeDefaults(calculation); + plot.addChildDefinition(currentLuSubdivision); + + // Adds a Previous Category LU using the LU Conversion attribute + CodeAttributeDefinition previousLu = survey.getSchema().createCodeAttributeDefinition(); + previousLu.setName(ATTR_PREVIOUS_CATEGORY); + previousLu.setListName(CODE_LIST_LAND_USE); + previousLu.setCalculated(true); + previousLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - previous"); + attributeDefault = new AttributeDefault(); + attributeDefault.setExpression("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 1, 1)"); // get the first + // character of the + // LU conversion CF + // --> C + calculation = new ArrayList(); + calculation.add(attributeDefault); + previousLu.setAttributeDefaults(calculation); + plot.addChildDefinition(previousLu); + + // Adds a Previous Category LU using the LU Conversion attribute + CodeAttributeDefinition oldestLu = survey.getSchema().createCodeAttributeDefinition(); + oldestLu.setName(ATTR_OLDEST_CATEGORY); + oldestLu.setListName(CODE_LIST_LAND_USE); + oldestLu.setCalculated(true); + oldestLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - oldest"); + calculation = new ArrayList(); + calculation.add(new AttributeDefault("substring( " + TEMPLATE_SECOND_LU_CONVERSION + ", 1,1)", // if the oldest + // LU conversion + // was FS then + // it becomes F + TEMPLATE_SECOND_LU_CHANGE + " = true() ")); + calculation.add(new AttributeDefault("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 1,1)", // if the oldest + // LU conversion + // was FS then + // it becomes F + "idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + ") or " + TEMPLATE_SECOND_LU_CHANGE + " = true() ")); + + oldestLu.setAttributeDefaults(calculation); + plot.addChildDefinition(oldestLu); + } + + private Survey addIPCCAttributes(Survey survey) { + EntityDefinition plot = survey.getSchema().getRootEntityDefinition("plot"); + addAuxilliaryAttributes(survey, plot); + + for (int year = IPCCGenerator.START_YEAR; year <= IPCCGenerator.END_YEAR; year++) { + addLuSubcategory(survey, plot, year); + CodeAttributeDefinition category = addLuCategory(survey, plot, year); + addLuSubdivision(survey, plot, category, year); + } + + return survey; + } + + public Survey addIPCCAttributesToSurvey(Survey survey) throws IPCCGeneratorException { + // Check if the Survey follows the latest 2022 IPCC Survey Template + // If the survey is based on the latest IPCC 2022 Template no further processing + // is needed + if (!is2022IPCCTemplate(survey)) { + // Check that survey has necessary attributes and code-lists + checkSurveyLUAttributes(survey); + checkSurveyLUCodeLists(survey); + + // All the necessary attributes are present + // Add the yearly LAND USE cat/subcategory/subdivision attributes! + return addIPCCAttributes(survey); + + } else { + return survey; + } + } + + private CodeAttributeDefinition addLuCategory(Survey survey, EntityDefinition plot, int year) { + // Create the parent attribute for the LU Subcategory ( the initial Land Use) + CodeAttributeDefinition category = survey.getSchema().createCodeAttributeDefinition(); + category.setName(getIpccCategoryAttrName(year)); + category.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Category "); + category.setListName(CODE_LIST_LAND_USE); + category.setCalculated(true); + + ArrayList calculation = new ArrayList(); + calculation.add(new AttributeDefault("substring(" + (IPCC_ATTR_PREFIX + year + IPCC_SUBCATEGORY) + ", 2, 1)")); + + category.setAttributeDefaults(calculation); + plot.addChildDefinition(category); + return category; + } + + private void addLuSubcategory(Survey survey, EntityDefinition plot, int year) { + + // Create the parent attribute for the LU Subcategory ( the initial Land Use) + TextAttributeDefinition subcategory = survey.getSchema().createTextAttributeDefinition(); + subcategory.setName(IPCC_ATTR_PREFIX + year + IPCC_SUBCATEGORY); + subcategory.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Conversion "); + subcategory.setCalculated(true); + + int thresHold20Years = year - IPCC_20_YEARS_RULE; + + ArrayList calculation = new ArrayList(); + + calculation.add( + new AttributeDefault( + TEMPLATE_LAND_USE_SUBCATEGORY, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "!= true()" + + " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + ) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBCATEGORY, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + + " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year + + " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " >=" + thresHold20Years) + ); + + calculation.add(new AttributeDefault( + "concat(" + ATTR_CURRENT_CATEGORY + "," + ATTR_CURRENT_CATEGORY + ")", + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " < " + thresHold20Years) + ); + + calculation.add(new AttributeDefault( + "concat(" + ATTR_PREVIOUS_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", + TEMPLATE_LAND_USE_CATEGORY_CHANGED + + " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + + "and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " > " + year) + ); + + calculation.add(new AttributeDefault( + "concat(" + ATTR_OLDEST_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", + TEMPLATE_SECOND_LU_CHANGE + "=true() " + + "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year + + " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " >= " + thresHold20Years) + ); + + calculation.add(new AttributeDefault( + "concat(" + ATTR_PREVIOUS_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", + TEMPLATE_SECOND_LU_CHANGE + "=true() " + + " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " < " + thresHold20Years) + ); + + calculation.add(new AttributeDefault( + "concat(" + ATTR_OLDEST_CATEGORY + "," + ATTR_OLDEST_CATEGORY + ")", + TEMPLATE_SECOND_LU_CHANGE + "=true() " + + "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " >= "+ thresHold20Years) + ); + + subcategory.setAttributeDefaults(calculation); + subcategory.setAnnotation(null, ATTR_CURRENT_CATEGORY); + plot.addChildDefinition(subcategory); + } + + private void addLuSubdivision(Survey survey, EntityDefinition plot, CodeAttributeDefinition categoryParent, + int year) { + CodeAttributeDefinition subdivision = survey.getSchema().createCodeAttributeDefinition(); + subdivision.setName(getIpccSubdivisionAttrName(year)); + subdivision.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Subdivision "); + subdivision.setListName(CODE_LIST_LAND_USE); + subdivision.setParentCodeAttributeDefinition(categoryParent); + subdivision.setCalculated(true); + + ArrayList calculation = new ArrayList(); + + calculation + .add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBDIVISION, + TEMPLATE_LAND_USE_CHANGE_ONCE + "!= true()") + ); + + calculation + .add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBDIVISION, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + + " and ( idm:blank(" + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + " ) or " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + " != true() ) " + + " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, + TEMPLATE_SECOND_LU_CHANGE + " = true()" + + " and ( idm:blank(" + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " ) or " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " != true() ) "+ + " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year + + " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year + )); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBDIVISION, + TEMPLATE_SECOND_LU_CHANGE + " = true()" + + " and ( idm:blank(" + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " ) or " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " != true() ) "+ + " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year + )); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " = true() " + + " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + + "and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " > " + year) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, + TEMPLATE_SECOND_LU_CHANGE + "=true() " + + "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_SECOND_SUBDIVISION, + TEMPLATE_SECOND_LU_CHANGE + "=true() " + + "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " > " + year) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, + "( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + + " and " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=true() "+ + " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year + + " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year + + )); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBDIVISION, + "( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) "+ + " and " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() "+ + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=false() " + + "and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year + + )); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBDIVISION, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=false() "+ + " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year) + ); + + subdivision.setAttributeDefaults(calculation); + plot.addChildDefinition(subdivision); + + } + + private void checkSurveyLUAttributes(Survey survey) throws IPCCGeneratorException { + // Check that the LU attributes are already on the survey + // If one of them is not available an exception is thrown! + ArrayList luDefaultAttributePaths = new ArrayList(); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CATEGORY); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBCATEGORY); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_INITIAL_SUBDIVISION); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CONVERSION); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CONVERSION_YEAR); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CHANGE); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SECOND_SUBDIVISION); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CATEGORY_CHANGED); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CHANGE_ONCE); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED); + + for (String attributePath : luDefaultAttributePaths) { + try { + survey.getSchema().getDefinitionByPath(attributePath); + } catch (InvalidPathException e) { + throw new IPCCGeneratorException("Missing attribute in Survey : " + attributePath, e); + } + } + + } + + private void checkSurveyLUCodeLists(Survey survey) throws IPCCGeneratorException { + + ArrayList luCodeLists = new ArrayList(); + luCodeLists.add(CODE_LIST_LAND_USE); + luCodeLists.add(CODE_LIST_LAND_USE_SUBCATEGORY); + + for (String codeList : luCodeLists) { + try { + survey.getCodeList(codeList); + } catch (InvalidPathException e) { + throw new IPCCGeneratorException("Missing Code List in Survey : " + codeList, e); + } + } + } + + private boolean is2022IPCCTemplate(Survey survey) { + // TODO Auto-generated method stub + // Check if the survey is based on the very latest 2022 IPCC survey template + // with all the LU changes + return false; + } + } From ab1984dd126ef7610348e1d80b6406fd87634b95 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:26 +0100 Subject: [PATCH 0449/1620] New translations LUDataPerYear.java (French) --- .../earth/app/view/Messages_fr.properties | 66 +++++++++++++------ 1 file changed, 46 insertions(+), 20 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index e13bbc0b81..b914ced46d 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,35 +1,61 @@ package org.openforis.collect.earth.ipcc; -public class RdbExportException extends Exception { +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; - public RdbExportException() { +public class LUDataPerYear { + + private LandUseSubdivision lu; + private LandUseSubdivision luNextYear; + private double areaHa; + + public LUDataPerYear(LandUseSubdivision lu, LandUseSubdivision luNextYear, double areaHa) { super(); - // TODO Auto-generated constructor stub + this.lu = lu; + this.luNextYear = luNextYear; + this.areaHa = areaHa; } - public RdbExportException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { - super(message, cause, enableSuppression, writableStackTrace); - // TODO Auto-generated constructor stub + + public double getAreaHa() { + return areaHa; } - public RdbExportException(String message, Throwable cause) { - super(message, cause); - // TODO Auto-generated constructor stub + + @Override + public String toString() { + return "LUDataPerYear [lu=" + lu + ", luNextYear=" + luNextYear + ", areaHa=" + areaHa + "]"; } - public RdbExportException(String message) { - super(message); - // TODO Auto-generated constructor stub + + + + + public LandUseSubdivision getLu() { + return lu; + } + + + + + + public LandUseSubdivision getLuNextYear() { + return luNextYear; } - public RdbExportException(Throwable cause) { - super(cause); - // TODO Auto-generated constructor stub + + + + + public void setLu(LandUseSubdivision lu) { + this.lu = lu; } - /** - * - */ - private static final long serialVersionUID = -5210016260577827042L; -} \ No newline at end of file + + + + public void setLuNextYear(LandUseSubdivision luNextYear) { + this.luNextYear = luNextYear; + } + +} From bdd7f644a03f1da9174627b362a4355f1939331a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:27 +0100 Subject: [PATCH 0450/1620] New translations LUDataPerYear.java (Spanish) --- .../earth/app/view/Messages_es.properties | 371 ++---------------- 1 file changed, 23 insertions(+), 348 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 32e67d9b02..b914ced46d 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,386 +1,61 @@ package org.openforis.collect.earth.ipcc; -import java.util.ArrayList; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.openforis.idm.metamodel.AttributeDefault; -import org.openforis.idm.metamodel.CodeAttributeDefinition; -import org.openforis.idm.metamodel.EntityDefinition; -import org.openforis.idm.metamodel.NodeLabel; -import org.openforis.idm.metamodel.Survey; -import org.openforis.idm.metamodel.TextAttributeDefinition; -import org.openforis.idm.path.InvalidPathException; +public class LUDataPerYear { -public class IPCCSurveyAdapter { - - public static final String IPCC_ATTR_PARENT_SUFIX = "_parent"; - public static final String IPCC_ATTR_PREFIX = "ipcc_"; - public static final String IPCC_CATEGORY = "_category"; - public static final String IPCC_SUBCATEGORY = "_subcategory"; - public static final String IPCC_SUBDIVISION = "_subdivision"; - - public static final String ATTR_CURRENT_CATEGORY = IPCC_ATTR_PREFIX + "current_category"; - public static final String ATTR_CURRENT_SUBDIVISION = IPCC_ATTR_PREFIX + "current_subdivision"; - public static final String ATTR_OLDEST_CATEGORY = IPCC_ATTR_PREFIX + "oldest_category"; - public static final String ATTR_PREVIOUS_CATEGORY = IPCC_ATTR_PREFIX + "previous_category"; - public static final String ATTR_PREVIOUS_SUBDIVISION = IPCC_ATTR_PREFIX + "previous_subdivision"; - private static final String CODE_LIST_LAND_USE = "land_use"; - private static final String CODE_LIST_LAND_USE_SUBCATEGORY = "land_use_subcategory"; - - private static final int IPCC_20_YEARS_RULE = 20; - - - private static final String PLOT_ENTITY = "plot"; - - private static final String TEMPLATE_LAND_USE_CATEGORY = "land_use_category"; - private static final String TEMPLATE_LAND_USE_CATEGORY_CHANGED = "land_use_category_has_changed"; - private static final String TEMPLATE_LAND_USE_CHANGE_ONCE = "land_use_change_once"; - private static final String TEMPLATE_LAND_USE_INITIAL_SUBDIVISION = "land_use_initial_subdivision"; - private static final String TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION = "land_use_initial_subdivision"; - private static final String TEMPLATE_LAND_USE_SECOND_SUBDIVISION = "second_lu_subdivision"; - private static final String TEMPLATE_LAND_USE_SUBCATEGORY = "land_use_subcategory"; - private static final String TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED = "land_use_subcategory_year_of_change"; - private static final String TEMPLATE_LAND_USE_SUBDIVISION = "land_use_subdivision"; - private static final String TEMPLATE_LAND_USE_SUBDIVISION_CHANGED = "land_use_subdivision_change"; - private static final String TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED = "land_use_subdivision_year_of_change"; - private static final String TEMPLATE_SECOND_LU_CHANGE = "second_lu_change"; - private static final String TEMPLATE_SECOND_LU_CONVERSION = "second_lu_conversion"; - private static final String TEMPLATE_SECOND_LU_CONVERSION_YEAR = "second_lu_conversion_year"; + private LandUseSubdivision lu; + private LandUseSubdivision luNextYear; + private double areaHa; - public static String getIpccCategoryAttrName(int year) { - return IPCC_ATTR_PREFIX + year + IPCC_CATEGORY; - } - - public static String getIpccSubdivisionAttrName(int year) { - return IPCC_ATTR_PREFIX + year + IPCC_SUBDIVISION; + public LUDataPerYear(LandUseSubdivision lu, LandUseSubdivision luNextYear, double areaHa) { + super(); + this.lu = lu; + this.luNextYear = luNextYear; + this.areaHa = areaHa; } - private void addAuxilliaryAttributes(Survey survey, EntityDefinition plot) { - // Adds a Current Category LU 2022 calculated attribute to be used for the - // Subdivision as parent - CodeAttributeDefinition currentLu = survey.getSchema().createCodeAttributeDefinition(); - currentLu.setName(ATTR_CURRENT_CATEGORY); - currentLu.setListName(CODE_LIST_LAND_USE); - currentLu.setCalculated(true); - currentLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - current"); - AttributeDefault attributeDefault = new AttributeDefault(); - attributeDefault.setExpression("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 2, 1)"); // get the second - // character of the - // LU conversion CF - // --> F - ArrayList calculation = new ArrayList(); - calculation.add(attributeDefault); - currentLu.setAttributeDefaults(calculation); - plot.addChildDefinition(currentLu); - - // adds the Current Subdivision 2022 attribute, which is just a copy of - // land_use_subdivision - CodeAttributeDefinition currentLuSubdivision = survey.getSchema().createCodeAttributeDefinition(); - currentLuSubdivision.setName(ATTR_CURRENT_SUBDIVISION); - currentLuSubdivision.setListName(CODE_LIST_LAND_USE); - currentLuSubdivision.setParentCodeAttributeDefinition(currentLu); - currentLuSubdivision.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Subdivision - current"); - attributeDefault = new AttributeDefault(); - attributeDefault.setExpression(TEMPLATE_LAND_USE_SUBDIVISION); // gets the current LU subdivision - calculation = new ArrayList(); - calculation.add(attributeDefault); - currentLuSubdivision.setAttributeDefaults(calculation); - plot.addChildDefinition(currentLuSubdivision); - // Adds a Previous Category LU using the LU Conversion attribute - CodeAttributeDefinition previousLu = survey.getSchema().createCodeAttributeDefinition(); - previousLu.setName(ATTR_PREVIOUS_CATEGORY); - previousLu.setListName(CODE_LIST_LAND_USE); - previousLu.setCalculated(true); - previousLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - previous"); - attributeDefault = new AttributeDefault(); - attributeDefault.setExpression("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 1, 1)"); // get the first - // character of the - // LU conversion CF - // --> C - calculation = new ArrayList(); - calculation.add(attributeDefault); - previousLu.setAttributeDefaults(calculation); - plot.addChildDefinition(previousLu); - - // Adds a Previous Category LU using the LU Conversion attribute - CodeAttributeDefinition oldestLu = survey.getSchema().createCodeAttributeDefinition(); - oldestLu.setName(ATTR_OLDEST_CATEGORY); - oldestLu.setListName(CODE_LIST_LAND_USE); - oldestLu.setCalculated(true); - oldestLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - oldest"); - calculation = new ArrayList(); - calculation.add(new AttributeDefault("substring( " + TEMPLATE_SECOND_LU_CONVERSION + ", 1,1)", // if the oldest - // LU conversion - // was FS then - // it becomes F - TEMPLATE_SECOND_LU_CHANGE + " = true() ")); - calculation.add(new AttributeDefault("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 1,1)", // if the oldest - // LU conversion - // was FS then - // it becomes F - "idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + ") or " + TEMPLATE_SECOND_LU_CHANGE + " = true() ")); - - oldestLu.setAttributeDefaults(calculation); - plot.addChildDefinition(oldestLu); + public double getAreaHa() { + return areaHa; } - private Survey addIPCCAttributes(Survey survey) { - EntityDefinition plot = survey.getSchema().getRootEntityDefinition("plot"); - addAuxilliaryAttributes(survey, plot); - - for (int year = IPCCGenerator.START_YEAR; year <= IPCCGenerator.END_YEAR; year++) { - addLuSubcategory(survey, plot, year); - CodeAttributeDefinition category = addLuCategory(survey, plot, year); - addLuSubdivision(survey, plot, category, year); - } - return survey; + @Override + public String toString() { + return "LUDataPerYear [lu=" + lu + ", luNextYear=" + luNextYear + ", areaHa=" + areaHa + "]"; } - public Survey addIPCCAttributesToSurvey(Survey survey) throws IPCCGeneratorException { - // Check if the Survey follows the latest 2022 IPCC Survey Template - // If the survey is based on the latest IPCC 2022 Template no further processing - // is needed - if (!is2022IPCCTemplate(survey)) { - // Check that survey has necessary attributes and code-lists - checkSurveyLUAttributes(survey); - checkSurveyLUCodeLists(survey); - // All the necessary attributes are present - // Add the yearly LAND USE cat/subcategory/subdivision attributes! - return addIPCCAttributes(survey); - - } else { - return survey; - } - } - private CodeAttributeDefinition addLuCategory(Survey survey, EntityDefinition plot, int year) { - // Create the parent attribute for the LU Subcategory ( the initial Land Use) - CodeAttributeDefinition category = survey.getSchema().createCodeAttributeDefinition(); - category.setName(getIpccCategoryAttrName(year)); - category.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Category "); - category.setListName(CODE_LIST_LAND_USE); - category.setCalculated(true); - ArrayList calculation = new ArrayList(); - calculation.add(new AttributeDefault("substring(" + (IPCC_ATTR_PREFIX + year + IPCC_SUBCATEGORY) + ", 2, 1)")); - category.setAttributeDefaults(calculation); - plot.addChildDefinition(category); - return category; + public LandUseSubdivision getLu() { + return lu; } - private void addLuSubcategory(Survey survey, EntityDefinition plot, int year) { - - // Create the parent attribute for the LU Subcategory ( the initial Land Use) - TextAttributeDefinition subcategory = survey.getSchema().createTextAttributeDefinition(); - subcategory.setName(IPCC_ATTR_PREFIX + year + IPCC_SUBCATEGORY); - subcategory.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Conversion "); - subcategory.setCalculated(true); - - int thresHold20Years = year - IPCC_20_YEARS_RULE; - - ArrayList calculation = new ArrayList(); - - calculation.add( - new AttributeDefault( - TEMPLATE_LAND_USE_SUBCATEGORY, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + "!= true()" + - " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " - ) - ); - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBCATEGORY, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + - " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year + - " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " >=" + thresHold20Years) - ); - calculation.add(new AttributeDefault( - "concat(" + ATTR_CURRENT_CATEGORY + "," + ATTR_CURRENT_CATEGORY + ")", - TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " < " + thresHold20Years) - ); - calculation.add(new AttributeDefault( - "concat(" + ATTR_PREVIOUS_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", - TEMPLATE_LAND_USE_CATEGORY_CHANGED + - " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + - "and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " > " + year) - ); - calculation.add(new AttributeDefault( - "concat(" + ATTR_OLDEST_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", - TEMPLATE_SECOND_LU_CHANGE + "=true() " + - "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year + - " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " >= " + thresHold20Years) - ); - - calculation.add(new AttributeDefault( - "concat(" + ATTR_PREVIOUS_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", - TEMPLATE_SECOND_LU_CHANGE + "=true() " + - " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " < " + thresHold20Years) - ); - - calculation.add(new AttributeDefault( - "concat(" + ATTR_OLDEST_CATEGORY + "," + ATTR_OLDEST_CATEGORY + ")", - TEMPLATE_SECOND_LU_CHANGE + "=true() " + - "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " >= "+ thresHold20Years) - ); - - subcategory.setAttributeDefaults(calculation); - subcategory.setAnnotation(null, ATTR_CURRENT_CATEGORY); - plot.addChildDefinition(subcategory); + public LandUseSubdivision getLuNextYear() { + return luNextYear; } - private void addLuSubdivision(Survey survey, EntityDefinition plot, CodeAttributeDefinition categoryParent, - int year) { - CodeAttributeDefinition subdivision = survey.getSchema().createCodeAttributeDefinition(); - subdivision.setName(getIpccSubdivisionAttrName(year)); - subdivision.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Subdivision "); - subdivision.setListName(CODE_LIST_LAND_USE); - subdivision.setParentCodeAttributeDefinition(categoryParent); - subdivision.setCalculated(true); - - ArrayList calculation = new ArrayList(); - - calculation - .add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBDIVISION, - TEMPLATE_LAND_USE_CHANGE_ONCE + "!= true()") - ); - - calculation - .add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBDIVISION, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + - " and ( idm:blank(" + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + " ) or " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + " != true() ) " + - " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year) - ); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, - TEMPLATE_SECOND_LU_CHANGE + " = true()" + - " and ( idm:blank(" + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " ) or " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " != true() ) "+ - " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year + - " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year - )); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBDIVISION, - TEMPLATE_SECOND_LU_CHANGE + " = true()" + - " and ( idm:blank(" + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " ) or " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " != true() ) "+ - " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year - )); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + " = true() " + - " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + - "and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " > " + year) - ); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, - TEMPLATE_SECOND_LU_CHANGE + "=true() " + - "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year) - ); - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_SECOND_SUBDIVISION, - TEMPLATE_SECOND_LU_CHANGE + "=true() " + - "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " > " + year) - ); - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, - "( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + - " and " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=true() "+ - " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year + - " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year - )); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBDIVISION, - "( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) "+ - " and " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() "+ - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year) - ); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=false() " + - "and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year - - )); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBDIVISION, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=false() "+ - " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year) - ); - - subdivision.setAttributeDefaults(calculation); - plot.addChildDefinition(subdivision); + public void setLu(LandUseSubdivision lu) { + this.lu = lu; } - private void checkSurveyLUAttributes(Survey survey) throws IPCCGeneratorException { - // Check that the LU attributes are already on the survey - // If one of them is not available an exception is thrown! - ArrayList luDefaultAttributePaths = new ArrayList(); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CATEGORY); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBCATEGORY); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_INITIAL_SUBDIVISION); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CONVERSION); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CONVERSION_YEAR); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CHANGE); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SECOND_SUBDIVISION); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CATEGORY_CHANGED); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CHANGE_ONCE); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED); - - for (String attributePath : luDefaultAttributePaths) { - try { - survey.getSchema().getDefinitionByPath(attributePath); - } catch (InvalidPathException e) { - throw new IPCCGeneratorException("Missing attribute in Survey : " + attributePath, e); - } - } - } - private void checkSurveyLUCodeLists(Survey survey) throws IPCCGeneratorException { - ArrayList luCodeLists = new ArrayList(); - luCodeLists.add(CODE_LIST_LAND_USE); - luCodeLists.add(CODE_LIST_LAND_USE_SUBCATEGORY); - for (String codeList : luCodeLists) { - try { - survey.getCodeList(codeList); - } catch (InvalidPathException e) { - throw new IPCCGeneratorException("Missing Code List in Survey : " + codeList, e); - } - } + public void setLuNextYear(LandUseSubdivision luNextYear) { + this.luNextYear = luNextYear; } - private boolean is2022IPCCTemplate(Survey survey) { - // TODO Auto-generated method stub - // Check if the survey is based on the very latest 2022 IPCC survey template - // with all the LU changes - return false; - } - } From b4fb3256f63905c38dee4318bb936834a7aed734 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:28 +0100 Subject: [PATCH 0451/1620] New translations LUDataPerYear.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 371 ++---------------- 1 file changed, 23 insertions(+), 348 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 32e67d9b02..b914ced46d 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,386 +1,61 @@ package org.openforis.collect.earth.ipcc; -import java.util.ArrayList; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.openforis.idm.metamodel.AttributeDefault; -import org.openforis.idm.metamodel.CodeAttributeDefinition; -import org.openforis.idm.metamodel.EntityDefinition; -import org.openforis.idm.metamodel.NodeLabel; -import org.openforis.idm.metamodel.Survey; -import org.openforis.idm.metamodel.TextAttributeDefinition; -import org.openforis.idm.path.InvalidPathException; +public class LUDataPerYear { -public class IPCCSurveyAdapter { - - public static final String IPCC_ATTR_PARENT_SUFIX = "_parent"; - public static final String IPCC_ATTR_PREFIX = "ipcc_"; - public static final String IPCC_CATEGORY = "_category"; - public static final String IPCC_SUBCATEGORY = "_subcategory"; - public static final String IPCC_SUBDIVISION = "_subdivision"; - - public static final String ATTR_CURRENT_CATEGORY = IPCC_ATTR_PREFIX + "current_category"; - public static final String ATTR_CURRENT_SUBDIVISION = IPCC_ATTR_PREFIX + "current_subdivision"; - public static final String ATTR_OLDEST_CATEGORY = IPCC_ATTR_PREFIX + "oldest_category"; - public static final String ATTR_PREVIOUS_CATEGORY = IPCC_ATTR_PREFIX + "previous_category"; - public static final String ATTR_PREVIOUS_SUBDIVISION = IPCC_ATTR_PREFIX + "previous_subdivision"; - private static final String CODE_LIST_LAND_USE = "land_use"; - private static final String CODE_LIST_LAND_USE_SUBCATEGORY = "land_use_subcategory"; - - private static final int IPCC_20_YEARS_RULE = 20; - - - private static final String PLOT_ENTITY = "plot"; - - private static final String TEMPLATE_LAND_USE_CATEGORY = "land_use_category"; - private static final String TEMPLATE_LAND_USE_CATEGORY_CHANGED = "land_use_category_has_changed"; - private static final String TEMPLATE_LAND_USE_CHANGE_ONCE = "land_use_change_once"; - private static final String TEMPLATE_LAND_USE_INITIAL_SUBDIVISION = "land_use_initial_subdivision"; - private static final String TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION = "land_use_initial_subdivision"; - private static final String TEMPLATE_LAND_USE_SECOND_SUBDIVISION = "second_lu_subdivision"; - private static final String TEMPLATE_LAND_USE_SUBCATEGORY = "land_use_subcategory"; - private static final String TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED = "land_use_subcategory_year_of_change"; - private static final String TEMPLATE_LAND_USE_SUBDIVISION = "land_use_subdivision"; - private static final String TEMPLATE_LAND_USE_SUBDIVISION_CHANGED = "land_use_subdivision_change"; - private static final String TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED = "land_use_subdivision_year_of_change"; - private static final String TEMPLATE_SECOND_LU_CHANGE = "second_lu_change"; - private static final String TEMPLATE_SECOND_LU_CONVERSION = "second_lu_conversion"; - private static final String TEMPLATE_SECOND_LU_CONVERSION_YEAR = "second_lu_conversion_year"; + private LandUseSubdivision lu; + private LandUseSubdivision luNextYear; + private double areaHa; - public static String getIpccCategoryAttrName(int year) { - return IPCC_ATTR_PREFIX + year + IPCC_CATEGORY; - } - - public static String getIpccSubdivisionAttrName(int year) { - return IPCC_ATTR_PREFIX + year + IPCC_SUBDIVISION; + public LUDataPerYear(LandUseSubdivision lu, LandUseSubdivision luNextYear, double areaHa) { + super(); + this.lu = lu; + this.luNextYear = luNextYear; + this.areaHa = areaHa; } - private void addAuxilliaryAttributes(Survey survey, EntityDefinition plot) { - // Adds a Current Category LU 2022 calculated attribute to be used for the - // Subdivision as parent - CodeAttributeDefinition currentLu = survey.getSchema().createCodeAttributeDefinition(); - currentLu.setName(ATTR_CURRENT_CATEGORY); - currentLu.setListName(CODE_LIST_LAND_USE); - currentLu.setCalculated(true); - currentLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - current"); - AttributeDefault attributeDefault = new AttributeDefault(); - attributeDefault.setExpression("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 2, 1)"); // get the second - // character of the - // LU conversion CF - // --> F - ArrayList calculation = new ArrayList(); - calculation.add(attributeDefault); - currentLu.setAttributeDefaults(calculation); - plot.addChildDefinition(currentLu); - - // adds the Current Subdivision 2022 attribute, which is just a copy of - // land_use_subdivision - CodeAttributeDefinition currentLuSubdivision = survey.getSchema().createCodeAttributeDefinition(); - currentLuSubdivision.setName(ATTR_CURRENT_SUBDIVISION); - currentLuSubdivision.setListName(CODE_LIST_LAND_USE); - currentLuSubdivision.setParentCodeAttributeDefinition(currentLu); - currentLuSubdivision.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Subdivision - current"); - attributeDefault = new AttributeDefault(); - attributeDefault.setExpression(TEMPLATE_LAND_USE_SUBDIVISION); // gets the current LU subdivision - calculation = new ArrayList(); - calculation.add(attributeDefault); - currentLuSubdivision.setAttributeDefaults(calculation); - plot.addChildDefinition(currentLuSubdivision); - // Adds a Previous Category LU using the LU Conversion attribute - CodeAttributeDefinition previousLu = survey.getSchema().createCodeAttributeDefinition(); - previousLu.setName(ATTR_PREVIOUS_CATEGORY); - previousLu.setListName(CODE_LIST_LAND_USE); - previousLu.setCalculated(true); - previousLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - previous"); - attributeDefault = new AttributeDefault(); - attributeDefault.setExpression("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 1, 1)"); // get the first - // character of the - // LU conversion CF - // --> C - calculation = new ArrayList(); - calculation.add(attributeDefault); - previousLu.setAttributeDefaults(calculation); - plot.addChildDefinition(previousLu); - - // Adds a Previous Category LU using the LU Conversion attribute - CodeAttributeDefinition oldestLu = survey.getSchema().createCodeAttributeDefinition(); - oldestLu.setName(ATTR_OLDEST_CATEGORY); - oldestLu.setListName(CODE_LIST_LAND_USE); - oldestLu.setCalculated(true); - oldestLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - oldest"); - calculation = new ArrayList(); - calculation.add(new AttributeDefault("substring( " + TEMPLATE_SECOND_LU_CONVERSION + ", 1,1)", // if the oldest - // LU conversion - // was FS then - // it becomes F - TEMPLATE_SECOND_LU_CHANGE + " = true() ")); - calculation.add(new AttributeDefault("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 1,1)", // if the oldest - // LU conversion - // was FS then - // it becomes F - "idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + ") or " + TEMPLATE_SECOND_LU_CHANGE + " = true() ")); - - oldestLu.setAttributeDefaults(calculation); - plot.addChildDefinition(oldestLu); + public double getAreaHa() { + return areaHa; } - private Survey addIPCCAttributes(Survey survey) { - EntityDefinition plot = survey.getSchema().getRootEntityDefinition("plot"); - addAuxilliaryAttributes(survey, plot); - - for (int year = IPCCGenerator.START_YEAR; year <= IPCCGenerator.END_YEAR; year++) { - addLuSubcategory(survey, plot, year); - CodeAttributeDefinition category = addLuCategory(survey, plot, year); - addLuSubdivision(survey, plot, category, year); - } - return survey; + @Override + public String toString() { + return "LUDataPerYear [lu=" + lu + ", luNextYear=" + luNextYear + ", areaHa=" + areaHa + "]"; } - public Survey addIPCCAttributesToSurvey(Survey survey) throws IPCCGeneratorException { - // Check if the Survey follows the latest 2022 IPCC Survey Template - // If the survey is based on the latest IPCC 2022 Template no further processing - // is needed - if (!is2022IPCCTemplate(survey)) { - // Check that survey has necessary attributes and code-lists - checkSurveyLUAttributes(survey); - checkSurveyLUCodeLists(survey); - // All the necessary attributes are present - // Add the yearly LAND USE cat/subcategory/subdivision attributes! - return addIPCCAttributes(survey); - - } else { - return survey; - } - } - private CodeAttributeDefinition addLuCategory(Survey survey, EntityDefinition plot, int year) { - // Create the parent attribute for the LU Subcategory ( the initial Land Use) - CodeAttributeDefinition category = survey.getSchema().createCodeAttributeDefinition(); - category.setName(getIpccCategoryAttrName(year)); - category.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Category "); - category.setListName(CODE_LIST_LAND_USE); - category.setCalculated(true); - ArrayList calculation = new ArrayList(); - calculation.add(new AttributeDefault("substring(" + (IPCC_ATTR_PREFIX + year + IPCC_SUBCATEGORY) + ", 2, 1)")); - category.setAttributeDefaults(calculation); - plot.addChildDefinition(category); - return category; + public LandUseSubdivision getLu() { + return lu; } - private void addLuSubcategory(Survey survey, EntityDefinition plot, int year) { - - // Create the parent attribute for the LU Subcategory ( the initial Land Use) - TextAttributeDefinition subcategory = survey.getSchema().createTextAttributeDefinition(); - subcategory.setName(IPCC_ATTR_PREFIX + year + IPCC_SUBCATEGORY); - subcategory.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Conversion "); - subcategory.setCalculated(true); - - int thresHold20Years = year - IPCC_20_YEARS_RULE; - - ArrayList calculation = new ArrayList(); - - calculation.add( - new AttributeDefault( - TEMPLATE_LAND_USE_SUBCATEGORY, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + "!= true()" + - " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " - ) - ); - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBCATEGORY, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + - " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year + - " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " >=" + thresHold20Years) - ); - calculation.add(new AttributeDefault( - "concat(" + ATTR_CURRENT_CATEGORY + "," + ATTR_CURRENT_CATEGORY + ")", - TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " < " + thresHold20Years) - ); - calculation.add(new AttributeDefault( - "concat(" + ATTR_PREVIOUS_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", - TEMPLATE_LAND_USE_CATEGORY_CHANGED + - " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + - "and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " > " + year) - ); - calculation.add(new AttributeDefault( - "concat(" + ATTR_OLDEST_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", - TEMPLATE_SECOND_LU_CHANGE + "=true() " + - "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year + - " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " >= " + thresHold20Years) - ); - - calculation.add(new AttributeDefault( - "concat(" + ATTR_PREVIOUS_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", - TEMPLATE_SECOND_LU_CHANGE + "=true() " + - " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " < " + thresHold20Years) - ); - - calculation.add(new AttributeDefault( - "concat(" + ATTR_OLDEST_CATEGORY + "," + ATTR_OLDEST_CATEGORY + ")", - TEMPLATE_SECOND_LU_CHANGE + "=true() " + - "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " >= "+ thresHold20Years) - ); - - subcategory.setAttributeDefaults(calculation); - subcategory.setAnnotation(null, ATTR_CURRENT_CATEGORY); - plot.addChildDefinition(subcategory); + public LandUseSubdivision getLuNextYear() { + return luNextYear; } - private void addLuSubdivision(Survey survey, EntityDefinition plot, CodeAttributeDefinition categoryParent, - int year) { - CodeAttributeDefinition subdivision = survey.getSchema().createCodeAttributeDefinition(); - subdivision.setName(getIpccSubdivisionAttrName(year)); - subdivision.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Subdivision "); - subdivision.setListName(CODE_LIST_LAND_USE); - subdivision.setParentCodeAttributeDefinition(categoryParent); - subdivision.setCalculated(true); - - ArrayList calculation = new ArrayList(); - - calculation - .add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBDIVISION, - TEMPLATE_LAND_USE_CHANGE_ONCE + "!= true()") - ); - - calculation - .add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBDIVISION, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + - " and ( idm:blank(" + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + " ) or " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + " != true() ) " + - " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year) - ); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, - TEMPLATE_SECOND_LU_CHANGE + " = true()" + - " and ( idm:blank(" + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " ) or " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " != true() ) "+ - " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year + - " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year - )); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBDIVISION, - TEMPLATE_SECOND_LU_CHANGE + " = true()" + - " and ( idm:blank(" + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " ) or " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " != true() ) "+ - " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year - )); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + " = true() " + - " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + - "and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " > " + year) - ); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, - TEMPLATE_SECOND_LU_CHANGE + "=true() " + - "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year) - ); - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_SECOND_SUBDIVISION, - TEMPLATE_SECOND_LU_CHANGE + "=true() " + - "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " > " + year) - ); - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, - "( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + - " and " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=true() "+ - " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year + - " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year - )); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBDIVISION, - "( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) "+ - " and " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() "+ - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year) - ); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=false() " + - "and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year - - )); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBDIVISION, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=false() "+ - " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year) - ); - - subdivision.setAttributeDefaults(calculation); - plot.addChildDefinition(subdivision); + public void setLu(LandUseSubdivision lu) { + this.lu = lu; } - private void checkSurveyLUAttributes(Survey survey) throws IPCCGeneratorException { - // Check that the LU attributes are already on the survey - // If one of them is not available an exception is thrown! - ArrayList luDefaultAttributePaths = new ArrayList(); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CATEGORY); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBCATEGORY); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_INITIAL_SUBDIVISION); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CONVERSION); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CONVERSION_YEAR); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CHANGE); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SECOND_SUBDIVISION); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CATEGORY_CHANGED); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CHANGE_ONCE); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED); - - for (String attributePath : luDefaultAttributePaths) { - try { - survey.getSchema().getDefinitionByPath(attributePath); - } catch (InvalidPathException e) { - throw new IPCCGeneratorException("Missing attribute in Survey : " + attributePath, e); - } - } - } - private void checkSurveyLUCodeLists(Survey survey) throws IPCCGeneratorException { - ArrayList luCodeLists = new ArrayList(); - luCodeLists.add(CODE_LIST_LAND_USE); - luCodeLists.add(CODE_LIST_LAND_USE_SUBCATEGORY); - for (String codeList : luCodeLists) { - try { - survey.getCodeList(codeList); - } catch (InvalidPathException e) { - throw new IPCCGeneratorException("Missing Code List in Survey : " + codeList, e); - } - } + public void setLuNextYear(LandUseSubdivision luNextYear) { + this.luNextYear = luNextYear; } - private boolean is2022IPCCTemplate(Survey survey) { - // TODO Auto-generated method stub - // Check if the survey is based on the very latest 2022 IPCC survey template - // with all the LU changes - return false; - } - } From aedc39b12b00094ecd8ee49a6ee1e5f3fc04bcb5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:29 +0100 Subject: [PATCH 0452/1620] New translations LUDataPerYear.java (English) --- .../earth/app/view/Messages_en.properties | 371 ++---------------- 1 file changed, 23 insertions(+), 348 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 32e67d9b02..b914ced46d 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,386 +1,61 @@ package org.openforis.collect.earth.ipcc; -import java.util.ArrayList; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.openforis.idm.metamodel.AttributeDefault; -import org.openforis.idm.metamodel.CodeAttributeDefinition; -import org.openforis.idm.metamodel.EntityDefinition; -import org.openforis.idm.metamodel.NodeLabel; -import org.openforis.idm.metamodel.Survey; -import org.openforis.idm.metamodel.TextAttributeDefinition; -import org.openforis.idm.path.InvalidPathException; +public class LUDataPerYear { -public class IPCCSurveyAdapter { - - public static final String IPCC_ATTR_PARENT_SUFIX = "_parent"; - public static final String IPCC_ATTR_PREFIX = "ipcc_"; - public static final String IPCC_CATEGORY = "_category"; - public static final String IPCC_SUBCATEGORY = "_subcategory"; - public static final String IPCC_SUBDIVISION = "_subdivision"; - - public static final String ATTR_CURRENT_CATEGORY = IPCC_ATTR_PREFIX + "current_category"; - public static final String ATTR_CURRENT_SUBDIVISION = IPCC_ATTR_PREFIX + "current_subdivision"; - public static final String ATTR_OLDEST_CATEGORY = IPCC_ATTR_PREFIX + "oldest_category"; - public static final String ATTR_PREVIOUS_CATEGORY = IPCC_ATTR_PREFIX + "previous_category"; - public static final String ATTR_PREVIOUS_SUBDIVISION = IPCC_ATTR_PREFIX + "previous_subdivision"; - private static final String CODE_LIST_LAND_USE = "land_use"; - private static final String CODE_LIST_LAND_USE_SUBCATEGORY = "land_use_subcategory"; - - private static final int IPCC_20_YEARS_RULE = 20; - - - private static final String PLOT_ENTITY = "plot"; - - private static final String TEMPLATE_LAND_USE_CATEGORY = "land_use_category"; - private static final String TEMPLATE_LAND_USE_CATEGORY_CHANGED = "land_use_category_has_changed"; - private static final String TEMPLATE_LAND_USE_CHANGE_ONCE = "land_use_change_once"; - private static final String TEMPLATE_LAND_USE_INITIAL_SUBDIVISION = "land_use_initial_subdivision"; - private static final String TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION = "land_use_initial_subdivision"; - private static final String TEMPLATE_LAND_USE_SECOND_SUBDIVISION = "second_lu_subdivision"; - private static final String TEMPLATE_LAND_USE_SUBCATEGORY = "land_use_subcategory"; - private static final String TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED = "land_use_subcategory_year_of_change"; - private static final String TEMPLATE_LAND_USE_SUBDIVISION = "land_use_subdivision"; - private static final String TEMPLATE_LAND_USE_SUBDIVISION_CHANGED = "land_use_subdivision_change"; - private static final String TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED = "land_use_subdivision_year_of_change"; - private static final String TEMPLATE_SECOND_LU_CHANGE = "second_lu_change"; - private static final String TEMPLATE_SECOND_LU_CONVERSION = "second_lu_conversion"; - private static final String TEMPLATE_SECOND_LU_CONVERSION_YEAR = "second_lu_conversion_year"; + private LandUseSubdivision lu; + private LandUseSubdivision luNextYear; + private double areaHa; - public static String getIpccCategoryAttrName(int year) { - return IPCC_ATTR_PREFIX + year + IPCC_CATEGORY; - } - - public static String getIpccSubdivisionAttrName(int year) { - return IPCC_ATTR_PREFIX + year + IPCC_SUBDIVISION; + public LUDataPerYear(LandUseSubdivision lu, LandUseSubdivision luNextYear, double areaHa) { + super(); + this.lu = lu; + this.luNextYear = luNextYear; + this.areaHa = areaHa; } - private void addAuxilliaryAttributes(Survey survey, EntityDefinition plot) { - // Adds a Current Category LU 2022 calculated attribute to be used for the - // Subdivision as parent - CodeAttributeDefinition currentLu = survey.getSchema().createCodeAttributeDefinition(); - currentLu.setName(ATTR_CURRENT_CATEGORY); - currentLu.setListName(CODE_LIST_LAND_USE); - currentLu.setCalculated(true); - currentLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - current"); - AttributeDefault attributeDefault = new AttributeDefault(); - attributeDefault.setExpression("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 2, 1)"); // get the second - // character of the - // LU conversion CF - // --> F - ArrayList calculation = new ArrayList(); - calculation.add(attributeDefault); - currentLu.setAttributeDefaults(calculation); - plot.addChildDefinition(currentLu); - - // adds the Current Subdivision 2022 attribute, which is just a copy of - // land_use_subdivision - CodeAttributeDefinition currentLuSubdivision = survey.getSchema().createCodeAttributeDefinition(); - currentLuSubdivision.setName(ATTR_CURRENT_SUBDIVISION); - currentLuSubdivision.setListName(CODE_LIST_LAND_USE); - currentLuSubdivision.setParentCodeAttributeDefinition(currentLu); - currentLuSubdivision.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Subdivision - current"); - attributeDefault = new AttributeDefault(); - attributeDefault.setExpression(TEMPLATE_LAND_USE_SUBDIVISION); // gets the current LU subdivision - calculation = new ArrayList(); - calculation.add(attributeDefault); - currentLuSubdivision.setAttributeDefaults(calculation); - plot.addChildDefinition(currentLuSubdivision); - // Adds a Previous Category LU using the LU Conversion attribute - CodeAttributeDefinition previousLu = survey.getSchema().createCodeAttributeDefinition(); - previousLu.setName(ATTR_PREVIOUS_CATEGORY); - previousLu.setListName(CODE_LIST_LAND_USE); - previousLu.setCalculated(true); - previousLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - previous"); - attributeDefault = new AttributeDefault(); - attributeDefault.setExpression("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 1, 1)"); // get the first - // character of the - // LU conversion CF - // --> C - calculation = new ArrayList(); - calculation.add(attributeDefault); - previousLu.setAttributeDefaults(calculation); - plot.addChildDefinition(previousLu); - - // Adds a Previous Category LU using the LU Conversion attribute - CodeAttributeDefinition oldestLu = survey.getSchema().createCodeAttributeDefinition(); - oldestLu.setName(ATTR_OLDEST_CATEGORY); - oldestLu.setListName(CODE_LIST_LAND_USE); - oldestLu.setCalculated(true); - oldestLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - oldest"); - calculation = new ArrayList(); - calculation.add(new AttributeDefault("substring( " + TEMPLATE_SECOND_LU_CONVERSION + ", 1,1)", // if the oldest - // LU conversion - // was FS then - // it becomes F - TEMPLATE_SECOND_LU_CHANGE + " = true() ")); - calculation.add(new AttributeDefault("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 1,1)", // if the oldest - // LU conversion - // was FS then - // it becomes F - "idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + ") or " + TEMPLATE_SECOND_LU_CHANGE + " = true() ")); - - oldestLu.setAttributeDefaults(calculation); - plot.addChildDefinition(oldestLu); + public double getAreaHa() { + return areaHa; } - private Survey addIPCCAttributes(Survey survey) { - EntityDefinition plot = survey.getSchema().getRootEntityDefinition("plot"); - addAuxilliaryAttributes(survey, plot); - - for (int year = IPCCGenerator.START_YEAR; year <= IPCCGenerator.END_YEAR; year++) { - addLuSubcategory(survey, plot, year); - CodeAttributeDefinition category = addLuCategory(survey, plot, year); - addLuSubdivision(survey, plot, category, year); - } - return survey; + @Override + public String toString() { + return "LUDataPerYear [lu=" + lu + ", luNextYear=" + luNextYear + ", areaHa=" + areaHa + "]"; } - public Survey addIPCCAttributesToSurvey(Survey survey) throws IPCCGeneratorException { - // Check if the Survey follows the latest 2022 IPCC Survey Template - // If the survey is based on the latest IPCC 2022 Template no further processing - // is needed - if (!is2022IPCCTemplate(survey)) { - // Check that survey has necessary attributes and code-lists - checkSurveyLUAttributes(survey); - checkSurveyLUCodeLists(survey); - // All the necessary attributes are present - // Add the yearly LAND USE cat/subcategory/subdivision attributes! - return addIPCCAttributes(survey); - - } else { - return survey; - } - } - private CodeAttributeDefinition addLuCategory(Survey survey, EntityDefinition plot, int year) { - // Create the parent attribute for the LU Subcategory ( the initial Land Use) - CodeAttributeDefinition category = survey.getSchema().createCodeAttributeDefinition(); - category.setName(getIpccCategoryAttrName(year)); - category.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Category "); - category.setListName(CODE_LIST_LAND_USE); - category.setCalculated(true); - ArrayList calculation = new ArrayList(); - calculation.add(new AttributeDefault("substring(" + (IPCC_ATTR_PREFIX + year + IPCC_SUBCATEGORY) + ", 2, 1)")); - category.setAttributeDefaults(calculation); - plot.addChildDefinition(category); - return category; + public LandUseSubdivision getLu() { + return lu; } - private void addLuSubcategory(Survey survey, EntityDefinition plot, int year) { - - // Create the parent attribute for the LU Subcategory ( the initial Land Use) - TextAttributeDefinition subcategory = survey.getSchema().createTextAttributeDefinition(); - subcategory.setName(IPCC_ATTR_PREFIX + year + IPCC_SUBCATEGORY); - subcategory.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Conversion "); - subcategory.setCalculated(true); - - int thresHold20Years = year - IPCC_20_YEARS_RULE; - - ArrayList calculation = new ArrayList(); - - calculation.add( - new AttributeDefault( - TEMPLATE_LAND_USE_SUBCATEGORY, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + "!= true()" + - " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " - ) - ); - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBCATEGORY, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + - " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year + - " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " >=" + thresHold20Years) - ); - calculation.add(new AttributeDefault( - "concat(" + ATTR_CURRENT_CATEGORY + "," + ATTR_CURRENT_CATEGORY + ")", - TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " < " + thresHold20Years) - ); - calculation.add(new AttributeDefault( - "concat(" + ATTR_PREVIOUS_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", - TEMPLATE_LAND_USE_CATEGORY_CHANGED + - " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + - "and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " > " + year) - ); - calculation.add(new AttributeDefault( - "concat(" + ATTR_OLDEST_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", - TEMPLATE_SECOND_LU_CHANGE + "=true() " + - "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year + - " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " >= " + thresHold20Years) - ); - - calculation.add(new AttributeDefault( - "concat(" + ATTR_PREVIOUS_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", - TEMPLATE_SECOND_LU_CHANGE + "=true() " + - " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " < " + thresHold20Years) - ); - - calculation.add(new AttributeDefault( - "concat(" + ATTR_OLDEST_CATEGORY + "," + ATTR_OLDEST_CATEGORY + ")", - TEMPLATE_SECOND_LU_CHANGE + "=true() " + - "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " >= "+ thresHold20Years) - ); - - subcategory.setAttributeDefaults(calculation); - subcategory.setAnnotation(null, ATTR_CURRENT_CATEGORY); - plot.addChildDefinition(subcategory); + public LandUseSubdivision getLuNextYear() { + return luNextYear; } - private void addLuSubdivision(Survey survey, EntityDefinition plot, CodeAttributeDefinition categoryParent, - int year) { - CodeAttributeDefinition subdivision = survey.getSchema().createCodeAttributeDefinition(); - subdivision.setName(getIpccSubdivisionAttrName(year)); - subdivision.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Subdivision "); - subdivision.setListName(CODE_LIST_LAND_USE); - subdivision.setParentCodeAttributeDefinition(categoryParent); - subdivision.setCalculated(true); - - ArrayList calculation = new ArrayList(); - - calculation - .add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBDIVISION, - TEMPLATE_LAND_USE_CHANGE_ONCE + "!= true()") - ); - - calculation - .add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBDIVISION, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + - " and ( idm:blank(" + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + " ) or " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + " != true() ) " + - " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year) - ); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, - TEMPLATE_SECOND_LU_CHANGE + " = true()" + - " and ( idm:blank(" + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " ) or " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " != true() ) "+ - " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year + - " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year - )); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBDIVISION, - TEMPLATE_SECOND_LU_CHANGE + " = true()" + - " and ( idm:blank(" + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " ) or " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " != true() ) "+ - " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year - )); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + " = true() " + - " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + - "and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " > " + year) - ); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, - TEMPLATE_SECOND_LU_CHANGE + "=true() " + - "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year) - ); - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_SECOND_SUBDIVISION, - TEMPLATE_SECOND_LU_CHANGE + "=true() " + - "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " > " + year) - ); - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, - "( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + - " and " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=true() "+ - " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year + - " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year - )); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBDIVISION, - "( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) "+ - " and " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() "+ - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year) - ); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=false() " + - "and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year - - )); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBDIVISION, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=false() "+ - " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year) - ); - - subdivision.setAttributeDefaults(calculation); - plot.addChildDefinition(subdivision); + public void setLu(LandUseSubdivision lu) { + this.lu = lu; } - private void checkSurveyLUAttributes(Survey survey) throws IPCCGeneratorException { - // Check that the LU attributes are already on the survey - // If one of them is not available an exception is thrown! - ArrayList luDefaultAttributePaths = new ArrayList(); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CATEGORY); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBCATEGORY); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_INITIAL_SUBDIVISION); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CONVERSION); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CONVERSION_YEAR); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CHANGE); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SECOND_SUBDIVISION); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CATEGORY_CHANGED); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CHANGE_ONCE); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED); - - for (String attributePath : luDefaultAttributePaths) { - try { - survey.getSchema().getDefinitionByPath(attributePath); - } catch (InvalidPathException e) { - throw new IPCCGeneratorException("Missing attribute in Survey : " + attributePath, e); - } - } - } - private void checkSurveyLUCodeLists(Survey survey) throws IPCCGeneratorException { - ArrayList luCodeLists = new ArrayList(); - luCodeLists.add(CODE_LIST_LAND_USE); - luCodeLists.add(CODE_LIST_LAND_USE_SUBCATEGORY); - for (String codeList : luCodeLists) { - try { - survey.getCodeList(codeList); - } catch (InvalidPathException e) { - throw new IPCCGeneratorException("Missing Code List in Survey : " + codeList, e); - } - } + public void setLuNextYear(LandUseSubdivision luNextYear) { + this.luNextYear = luNextYear; } - private boolean is2022IPCCTemplate(Survey survey) { - // TODO Auto-generated method stub - // Check if the survey is based on the very latest 2022 IPCC survey template - // with all the LU changes - return false; - } - } From d1aa2cb8667167a6c3a3a4f334769a87995cd478 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:30 +0100 Subject: [PATCH 0453/1620] New translations MatrixSheet.java (French) --- .../earth/app/view/Messages_fr.properties | 69 +++++++------------ 1 file changed, 25 insertions(+), 44 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index b914ced46d..d7ce509776 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,61 +1,42 @@ package org.openforis.collect.earth.ipcc; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; - -public class LUDataPerYear { - - private LandUseSubdivision lu; - private LandUseSubdivision luNextYear; - private double areaHa; - - public LUDataPerYear(LandUseSubdivision lu, LandUseSubdivision luNextYear, double areaHa) { - super(); - this.lu = lu; - this.luNextYear = luNextYear; - this.areaHa = areaHa; - } - - - public double getAreaHa() { - return areaHa; - } - - - @Override - public String toString() { - return "LUDataPerYear [lu=" + lu + ", luNextYear=" + luNextYear + ", areaHa=" + areaHa + "]"; - } - - - - - - public LandUseSubdivision getLu() { - return lu; - } - +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +public class MatrixSheet { + private YearData yearData; - public LandUseSubdivision getLuNextYear() { - return luNextYear; + public MatrixSheet(YearData yearData) { + this.yearData = yearData; } + public List> getSubdivisions() { + List> subdivisions = new ArrayList<>(); + for (LUDataPerYear luDataYear : yearData.getLuData()) { + if( subdivisions.indexOf( luDataYear.getLu() ) == -1 ) { + subdivisions.add( luDataYear.getLu()); + } + if( subdivisions.indexOf( luDataYear.getLuNextYear() ) == -1 ) { + subdivisions.add( luDataYear.getLuNextYear()); + } + } + + Collections.sort( subdivisions ); - public void setLu(LandUseSubdivision lu) { - this.lu = lu; + return subdivisions; + } + - - - - - public void setLuNextYear(LandUseSubdivision luNextYear) { - this.luNextYear = luNextYear; + public YearData getYearData() { + return yearData; } } From 7aa50dec8d1fa7ee5b9948a2c0e08ecb78162263 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:32 +0100 Subject: [PATCH 0454/1620] New translations MatrixSheet.java (Spanish) --- .../earth/app/view/Messages_es.properties | 69 +++++++------------ 1 file changed, 25 insertions(+), 44 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index b914ced46d..d7ce509776 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,61 +1,42 @@ package org.openforis.collect.earth.ipcc; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; - -public class LUDataPerYear { - - private LandUseSubdivision lu; - private LandUseSubdivision luNextYear; - private double areaHa; - - public LUDataPerYear(LandUseSubdivision lu, LandUseSubdivision luNextYear, double areaHa) { - super(); - this.lu = lu; - this.luNextYear = luNextYear; - this.areaHa = areaHa; - } - - - public double getAreaHa() { - return areaHa; - } - - - @Override - public String toString() { - return "LUDataPerYear [lu=" + lu + ", luNextYear=" + luNextYear + ", areaHa=" + areaHa + "]"; - } - - - - - - public LandUseSubdivision getLu() { - return lu; - } - +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +public class MatrixSheet { + private YearData yearData; - public LandUseSubdivision getLuNextYear() { - return luNextYear; + public MatrixSheet(YearData yearData) { + this.yearData = yearData; } + public List> getSubdivisions() { + List> subdivisions = new ArrayList<>(); + for (LUDataPerYear luDataYear : yearData.getLuData()) { + if( subdivisions.indexOf( luDataYear.getLu() ) == -1 ) { + subdivisions.add( luDataYear.getLu()); + } + if( subdivisions.indexOf( luDataYear.getLuNextYear() ) == -1 ) { + subdivisions.add( luDataYear.getLuNextYear()); + } + } + + Collections.sort( subdivisions ); - public void setLu(LandUseSubdivision lu) { - this.lu = lu; + return subdivisions; + } + - - - - - public void setLuNextYear(LandUseSubdivision luNextYear) { - this.luNextYear = luNextYear; + public YearData getYearData() { + return yearData; } } From 79f696c3fb48c1460eca644f94b2bb87ef197268 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:33 +0100 Subject: [PATCH 0455/1620] New translations MatrixSheet.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 69 +++++++------------ 1 file changed, 25 insertions(+), 44 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index b914ced46d..d7ce509776 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,61 +1,42 @@ package org.openforis.collect.earth.ipcc; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; - -public class LUDataPerYear { - - private LandUseSubdivision lu; - private LandUseSubdivision luNextYear; - private double areaHa; - - public LUDataPerYear(LandUseSubdivision lu, LandUseSubdivision luNextYear, double areaHa) { - super(); - this.lu = lu; - this.luNextYear = luNextYear; - this.areaHa = areaHa; - } - - - public double getAreaHa() { - return areaHa; - } - - - @Override - public String toString() { - return "LUDataPerYear [lu=" + lu + ", luNextYear=" + luNextYear + ", areaHa=" + areaHa + "]"; - } - - - - - - public LandUseSubdivision getLu() { - return lu; - } - +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +public class MatrixSheet { + private YearData yearData; - public LandUseSubdivision getLuNextYear() { - return luNextYear; + public MatrixSheet(YearData yearData) { + this.yearData = yearData; } + public List> getSubdivisions() { + List> subdivisions = new ArrayList<>(); + for (LUDataPerYear luDataYear : yearData.getLuData()) { + if( subdivisions.indexOf( luDataYear.getLu() ) == -1 ) { + subdivisions.add( luDataYear.getLu()); + } + if( subdivisions.indexOf( luDataYear.getLuNextYear() ) == -1 ) { + subdivisions.add( luDataYear.getLuNextYear()); + } + } + + Collections.sort( subdivisions ); - public void setLu(LandUseSubdivision lu) { - this.lu = lu; + return subdivisions; + } + - - - - - public void setLuNextYear(LandUseSubdivision luNextYear) { - this.luNextYear = luNextYear; + public YearData getYearData() { + return yearData; } } From 6c38fc043abff45c7b47427eb2a7a1158cea1d81 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:34 +0100 Subject: [PATCH 0456/1620] New translations MatrixSheet.java (English) --- .../earth/app/view/Messages_en.properties | 69 +++++++------------ 1 file changed, 25 insertions(+), 44 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index b914ced46d..d7ce509776 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,61 +1,42 @@ package org.openforis.collect.earth.ipcc; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; - -public class LUDataPerYear { - - private LandUseSubdivision lu; - private LandUseSubdivision luNextYear; - private double areaHa; - - public LUDataPerYear(LandUseSubdivision lu, LandUseSubdivision luNextYear, double areaHa) { - super(); - this.lu = lu; - this.luNextYear = luNextYear; - this.areaHa = areaHa; - } - - - public double getAreaHa() { - return areaHa; - } - - - @Override - public String toString() { - return "LUDataPerYear [lu=" + lu + ", luNextYear=" + luNextYear + ", areaHa=" + areaHa + "]"; - } - - - - - - public LandUseSubdivision getLu() { - return lu; - } - +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +public class MatrixSheet { + private YearData yearData; - public LandUseSubdivision getLuNextYear() { - return luNextYear; + public MatrixSheet(YearData yearData) { + this.yearData = yearData; } + public List> getSubdivisions() { + List> subdivisions = new ArrayList<>(); + for (LUDataPerYear luDataYear : yearData.getLuData()) { + if( subdivisions.indexOf( luDataYear.getLu() ) == -1 ) { + subdivisions.add( luDataYear.getLu()); + } + if( subdivisions.indexOf( luDataYear.getLuNextYear() ) == -1 ) { + subdivisions.add( luDataYear.getLuNextYear()); + } + } + + Collections.sort( subdivisions ); - public void setLu(LandUseSubdivision lu) { - this.lu = lu; + return subdivisions; + } + - - - - - public void setLuNextYear(LandUseSubdivision luNextYear) { - this.luNextYear = luNextYear; + public YearData getYearData() { + return yearData; } } From cbc8769540c778c3d59879eda2e2a8ffb89fd0b4 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:35 +0100 Subject: [PATCH 0457/1620] New translations CroplandType.java (Spanish) --- .../earth/app/view/Messages_es.properties | 49 ++++++------------- 1 file changed, 14 insertions(+), 35 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index d7ce509776..e6464b6c58 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,42 +1,21 @@ -package org.openforis.collect.earth.ipcc; +package org.openforis.collect.earth.ipcc.model; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +public enum CroplandType { -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; - -public class MatrixSheet { - - private YearData yearData; - - public MatrixSheet(YearData yearData) { - this.yearData = yearData; - } - - public List> getSubdivisions() { - List> subdivisions = new ArrayList<>(); - - for (LUDataPerYear luDataYear : yearData.getLuData()) { - - if( subdivisions.indexOf( luDataYear.getLu() ) == -1 ) { - subdivisions.add( luDataYear.getLu()); - } - - if( subdivisions.indexOf( luDataYear.getLuNextYear() ) == -1 ) { - subdivisions.add( luDataYear.getLuNextYear()); - } - } - - Collections.sort( subdivisions ); - - return subdivisions; - - } + ANNUAL("Annual"),PERENNIAL("Perennial"); + + public final String name; + private CroplandType(String name) { + this.name = name; + } - public YearData getYearData() { - return yearData; + public String getName() { + return name; } + @Override + public String toString() { + return getName(); + } } From 808e300246647818f2e528110ee4a6b45e8e64ab Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:36 +0100 Subject: [PATCH 0458/1620] New translations CroplandType.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 49 ++++++------------- 1 file changed, 14 insertions(+), 35 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index d7ce509776..e6464b6c58 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,42 +1,21 @@ -package org.openforis.collect.earth.ipcc; +package org.openforis.collect.earth.ipcc.model; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +public enum CroplandType { -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; - -public class MatrixSheet { - - private YearData yearData; - - public MatrixSheet(YearData yearData) { - this.yearData = yearData; - } - - public List> getSubdivisions() { - List> subdivisions = new ArrayList<>(); - - for (LUDataPerYear luDataYear : yearData.getLuData()) { - - if( subdivisions.indexOf( luDataYear.getLu() ) == -1 ) { - subdivisions.add( luDataYear.getLu()); - } - - if( subdivisions.indexOf( luDataYear.getLuNextYear() ) == -1 ) { - subdivisions.add( luDataYear.getLuNextYear()); - } - } - - Collections.sort( subdivisions ); - - return subdivisions; - - } + ANNUAL("Annual"),PERENNIAL("Perennial"); + + public final String name; + private CroplandType(String name) { + this.name = name; + } - public YearData getYearData() { - return yearData; + public String getName() { + return name; } + @Override + public String toString() { + return getName(); + } } From a366a8fd4a6ce334a59422229bb099c9adceeb4c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:37 +0100 Subject: [PATCH 0459/1620] New translations SettlementType.java (English) --- .../earth/app/view/Messages_en.properties | 48 ++++++------------- 1 file changed, 14 insertions(+), 34 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index d7ce509776..5c0501083e 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,42 +1,22 @@ -package org.openforis.collect.earth.ipcc; +package org.openforis.collect.earth.ipcc.model; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +public enum SettlementType { -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; - -public class MatrixSheet { - - private YearData yearData; + TREED("Treed"),OTHER("Other"); + + public final String name; + + private SettlementType(String name) { + this.name = name; + } - public MatrixSheet(YearData yearData) { - this.yearData = yearData; + public String getName() { + return name; } - public List> getSubdivisions() { - List> subdivisions = new ArrayList<>(); - - for (LUDataPerYear luDataYear : yearData.getLuData()) { - - if( subdivisions.indexOf( luDataYear.getLu() ) == -1 ) { - subdivisions.add( luDataYear.getLu()); - } - - if( subdivisions.indexOf( luDataYear.getLuNextYear() ) == -1 ) { - subdivisions.add( luDataYear.getLuNextYear()); - } - } - - Collections.sort( subdivisions ); - - return subdivisions; - + @Override + public String toString() { + return getName(); } - - public YearData getYearData() { - return yearData; - } - } From 55e5734dfe487ccb1e014b4593f6dd383211047c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:38 +0100 Subject: [PATCH 0460/1620] New translations OtherlandSubdivision.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 20 ++++--------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index e6464b6c58..8e3ce015dd 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,21 +1,9 @@ package org.openforis.collect.earth.ipcc.model; -public enum CroplandType { - - ANNUAL("Annual"),PERENNIAL("Perennial"); - - public final String name; +public class OtherlandSubdivision extends ManagementLandUseSubdivision{ - private CroplandType(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - @Override - public String toString() { - return getName(); + public OtherlandSubdivision( String code, String name, ManagementType type) { + super( LandUseCategory.O, code, name, type); } + } From 7d99cdfe5edb97551be405000f2d38013eea5668 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:39 +0100 Subject: [PATCH 0461/1620] New translations OtherlandSubdivision.java (English) --- .../earth/app/view/Messages_en.properties | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 5c0501083e..8e3ce015dd 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,22 +1,9 @@ package org.openforis.collect.earth.ipcc.model; -public enum SettlementType { - - TREED("Treed"),OTHER("Other"); - - public final String name; +public class OtherlandSubdivision extends ManagementLandUseSubdivision{ - private SettlementType(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - @Override - public String toString() { - return getName(); + public OtherlandSubdivision( String code, String name, ManagementType type) { + super( LandUseCategory.O, code, name, type); } } From 3bf89a91f024eaa49e9da3c003efbc331b3807fd Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:40 +0100 Subject: [PATCH 0462/1620] New translations SettlementSubdivision.java (French) --- .../earth/app/view/Messages_fr.properties | 50 ++++++------------- 1 file changed, 14 insertions(+), 36 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index d7ce509776..3978dc2be1 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,42 +1,20 @@ -package org.openforis.collect.earth.ipcc; +package org.openforis.collect.earth.ipcc.model; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; - -public class MatrixSheet { - - private YearData yearData; - - public MatrixSheet(YearData yearData) { - this.yearData = yearData; - } - - public List> getSubdivisions() { - List> subdivisions = new ArrayList<>(); - - for (LUDataPerYear luDataYear : yearData.getLuData()) { - - if( subdivisions.indexOf( luDataYear.getLu() ) == -1 ) { - subdivisions.add( luDataYear.getLu()); - } - - if( subdivisions.indexOf( luDataYear.getLuNextYear() ) == -1 ) { - subdivisions.add( luDataYear.getLuNextYear()); - } - } - - Collections.sort( subdivisions ); - - return subdivisions; - - } +public class SettlementSubdivision extends LandUseSubdivision{ + protected SettlementType type; + + public SettlementSubdivision( String code, String name, SettlementType type) { + super(LandUseCategory.S, code, name); + setType(type); + } - public YearData getYearData() { - return yearData; + public SettlementType getType() { + return type; } + public void setType(SettlementType type) { + this.type = type; + }; + } From f1562676bd9d9cfadb5d473ac314b802ee91ac43 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:41 +0100 Subject: [PATCH 0463/1620] New translations SettlementSubdivision.java (Spanish) --- .../earth/app/view/Messages_es.properties | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index e6464b6c58..3978dc2be1 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,21 +1,20 @@ package org.openforis.collect.earth.ipcc.model; -public enum CroplandType { - - ANNUAL("Annual"),PERENNIAL("Perennial"); +public class SettlementSubdivision extends LandUseSubdivision{ - public final String name; + protected SettlementType type; - private CroplandType(String name) { - this.name = name; - } - - public String getName() { - return name; + public SettlementSubdivision( String code, String name, SettlementType type) { + super(LandUseCategory.S, code, name); + setType(type); } - @Override - public String toString() { - return getName(); + public SettlementType getType() { + return type; } + + public void setType(SettlementType type) { + this.type = type; + }; + } From b3d18ff2460039b5d58f6d06f44e59b78677b658 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:42 +0100 Subject: [PATCH 0464/1620] New translations SettlementSubdivision.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 8e3ce015dd..3978dc2be1 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,9 +1,20 @@ package org.openforis.collect.earth.ipcc.model; -public class OtherlandSubdivision extends ManagementLandUseSubdivision{ +public class SettlementSubdivision extends LandUseSubdivision{ - public OtherlandSubdivision( String code, String name, ManagementType type) { - super( LandUseCategory.O, code, name, type); + protected SettlementType type; + + public SettlementSubdivision( String code, String name, SettlementType type) { + super(LandUseCategory.S, code, name); + setType(type); + } + + public SettlementType getType() { + return type; } + + public void setType(SettlementType type) { + this.type = type; + }; } From 0fec5a0aa73f08736664824c914fe09cf7749571 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:43 +0100 Subject: [PATCH 0465/1620] New translations SettlementSubdivision.java (English) --- .../earth/app/view/Messages_en.properties | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 8e3ce015dd..3978dc2be1 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,9 +1,20 @@ package org.openforis.collect.earth.ipcc.model; -public class OtherlandSubdivision extends ManagementLandUseSubdivision{ +public class SettlementSubdivision extends LandUseSubdivision{ - public OtherlandSubdivision( String code, String name, ManagementType type) { - super( LandUseCategory.O, code, name, type); + protected SettlementType type; + + public SettlementSubdivision( String code, String name, SettlementType type) { + super(LandUseCategory.S, code, name); + setType(type); + } + + public SettlementType getType() { + return type; } + + public void setType(SettlementType type) { + this.type = type; + }; } From 4ccc7e8778cc4acf89598f6680f37114565882ba Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:44 +0100 Subject: [PATCH 0466/1620] New translations SettlementType.java (French) --- .../earth/app/view/Messages_fr.properties | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 3978dc2be1..5c0501083e 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,20 +1,22 @@ package org.openforis.collect.earth.ipcc.model; -public class SettlementSubdivision extends LandUseSubdivision{ +public enum SettlementType { + + TREED("Treed"),OTHER("Other"); - protected SettlementType type; + public final String name; - public SettlementSubdivision( String code, String name, SettlementType type) { - super(LandUseCategory.S, code, name); - setType(type); - } + private SettlementType(String name) { + this.name = name; + } - public SettlementType getType() { - return type; + public String getName() { + return name; } - public void setType(SettlementType type) { - this.type = type; - }; + @Override + public String toString() { + return getName(); + } } From cdde113aec33c1c0cc2b2ee6eb9c681d03c0635f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:45 +0100 Subject: [PATCH 0467/1620] New translations SettlementType.java (Spanish) --- .../earth/app/view/Messages_es.properties | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 3978dc2be1..5c0501083e 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,20 +1,22 @@ package org.openforis.collect.earth.ipcc.model; -public class SettlementSubdivision extends LandUseSubdivision{ +public enum SettlementType { + + TREED("Treed"),OTHER("Other"); - protected SettlementType type; + public final String name; - public SettlementSubdivision( String code, String name, SettlementType type) { - super(LandUseCategory.S, code, name); - setType(type); - } + private SettlementType(String name) { + this.name = name; + } - public SettlementType getType() { - return type; + public String getName() { + return name; } - public void setType(SettlementType type) { - this.type = type; - }; + @Override + public String toString() { + return getName(); + } } From 2aba8484039e585bd3721a4041e2e5d0535dc9fa Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:46 +0100 Subject: [PATCH 0468/1620] New translations SettlementType.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 3978dc2be1..5c0501083e 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,20 +1,22 @@ package org.openforis.collect.earth.ipcc.model; -public class SettlementSubdivision extends LandUseSubdivision{ +public enum SettlementType { + + TREED("Treed"),OTHER("Other"); - protected SettlementType type; + public final String name; - public SettlementSubdivision( String code, String name, SettlementType type) { - super(LandUseCategory.S, code, name); - setType(type); - } + private SettlementType(String name) { + this.name = name; + } - public SettlementType getType() { - return type; + public String getName() { + return name; } - public void setType(SettlementType type) { - this.type = type; - }; + @Override + public String toString() { + return getName(); + } } From 691469e669c47e79e720929019af57d3d488d25a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:47 +0100 Subject: [PATCH 0469/1620] New translations StratumObject.java (French) --- .../earth/app/view/Messages_fr.properties | 49 ++++++++++++++----- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 5c0501083e..3af8a2cee0 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,22 +1,49 @@ package org.openforis.collect.earth.ipcc.model; -public enum SettlementType { +public class StratumObject { - TREED("Treed"),OTHER("Other"); + String value; + String label; + String description; + + public StratumObject(String value, String label) { + super(); + this.value = value; + this.label = label; + } - public final String name; + public StratumObject(String value, String label, String description) { + super(); + this.value = value; + this.label = label; + this.description = description; + } - private SettlementType(String name) { - this.name = name; - } - public String getName() { - return name; + public String getValue() { + return value; + } + + public String getLabel() { + return label; + } + + public void setValue(String value) { + this.value = value; } - @Override - public String toString() { - return getName(); + public void setLabel(String label) { + this.label = label; } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + } From 0e72de16b36ec56053a5277783c5097d59e1c85e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:48 +0100 Subject: [PATCH 0470/1620] New translations OtherlandSubdivision.java (French) --- .../earth/app/view/Messages_fr.properties | 46 ++----------------- 1 file changed, 3 insertions(+), 43 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 3af8a2cee0..8e3ce015dd 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,49 +1,9 @@ package org.openforis.collect.earth.ipcc.model; -public class StratumObject { - - String value; - String label; - String description; - - public StratumObject(String value, String label) { - super(); - this.value = value; - this.label = label; - } - - public StratumObject(String value, String label, String description) { - super(); - this.value = value; - this.label = label; - this.description = description; - } +public class OtherlandSubdivision extends ManagementLandUseSubdivision{ - - public String getValue() { - return value; - } - - public String getLabel() { - return label; - } - - public void setValue(String value) { - this.value = value; - } - - public void setLabel(String label) { - this.label = label; - } - - public String getDescription() { - return description; + public OtherlandSubdivision( String code, String name, ManagementType type) { + super( LandUseCategory.O, code, name, type); } - - public void setDescription(String description) { - this.description = description; - } - - } From 1f9e8cbf7c4d93b1578a7a41dd01fe8029a04d2f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:49 +0100 Subject: [PATCH 0471/1620] New translations StratumObject.java (Spanish) --- .../earth/app/view/Messages_es.properties | 49 ++++++++++++++----- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 5c0501083e..3af8a2cee0 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,22 +1,49 @@ package org.openforis.collect.earth.ipcc.model; -public enum SettlementType { +public class StratumObject { - TREED("Treed"),OTHER("Other"); + String value; + String label; + String description; + + public StratumObject(String value, String label) { + super(); + this.value = value; + this.label = label; + } - public final String name; + public StratumObject(String value, String label, String description) { + super(); + this.value = value; + this.label = label; + this.description = description; + } - private SettlementType(String name) { - this.name = name; - } - public String getName() { - return name; + public String getValue() { + return value; + } + + public String getLabel() { + return label; + } + + public void setValue(String value) { + this.value = value; } - @Override - public String toString() { - return getName(); + public void setLabel(String label) { + this.label = label; } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + } From 6c85cd33ab91db373032b9f5e8d46e7e179562c0 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:50 +0100 Subject: [PATCH 0472/1620] New translations StratumObject.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 49 ++++++++++++++----- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 5c0501083e..3af8a2cee0 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,22 +1,49 @@ package org.openforis.collect.earth.ipcc.model; -public enum SettlementType { +public class StratumObject { - TREED("Treed"),OTHER("Other"); + String value; + String label; + String description; + + public StratumObject(String value, String label) { + super(); + this.value = value; + this.label = label; + } - public final String name; + public StratumObject(String value, String label, String description) { + super(); + this.value = value; + this.label = label; + this.description = description; + } - private SettlementType(String name) { - this.name = name; - } - public String getName() { - return name; + public String getValue() { + return value; + } + + public String getLabel() { + return label; + } + + public void setValue(String value) { + this.value = value; } - @Override - public String toString() { - return getName(); + public void setLabel(String label) { + this.label = label; } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + } From c3eb3824adc1d533133e276dbb0a96e53e58e58c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:51 +0100 Subject: [PATCH 0473/1620] New translations StratumObject.java (English) --- .../earth/app/view/Messages_en.properties | 49 +++++++++++++++---- 1 file changed, 39 insertions(+), 10 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 3978dc2be1..3af8a2cee0 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,20 +1,49 @@ package org.openforis.collect.earth.ipcc.model; -public class SettlementSubdivision extends LandUseSubdivision{ +public class StratumObject { + + String value; + String label; + String description; + + public StratumObject(String value, String label) { + super(); + this.value = value; + this.label = label; + } - protected SettlementType type; + public StratumObject(String value, String label, String description) { + super(); + this.value = value; + this.label = label; + this.description = description; + } - public SettlementSubdivision( String code, String name, SettlementType type) { - super(LandUseCategory.S, code, name); - setType(type); + + public String getValue() { + return value; + } + + public String getLabel() { + return label; } - public SettlementType getType() { - return type; + public void setValue(String value) { + this.value = value; } - public void setType(SettlementType type) { - this.type = type; - }; + public void setLabel(String label) { + this.label = label; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + } From 020ea2374a572ac5ecd3ab2f33d89c21b46bc838 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:52 +0100 Subject: [PATCH 0474/1620] New translations WetlandSubdivision.java (French) --- .../openforis/collect/earth/app/view/Messages_fr.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 8e3ce015dd..6cae1b99f2 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,9 +1,9 @@ package org.openforis.collect.earth.ipcc.model; -public class OtherlandSubdivision extends ManagementLandUseSubdivision{ +public class WetlandSubdivision extends ManagementLandUseSubdivision{ - public OtherlandSubdivision( String code, String name, ManagementType type) { - super( LandUseCategory.O, code, name, type); + public WetlandSubdivision( String code, String name, ManagementType type) { + super( LandUseCategory.W, code, name, type); } } From 5ceab7ae715fc0a1e645b1a7db721a5a4ff4db30 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:53 +0100 Subject: [PATCH 0475/1620] New translations WetlandSubdivision.java (Spanish) --- .../earth/app/view/Messages_es.properties | 46 ++----------------- 1 file changed, 3 insertions(+), 43 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 3af8a2cee0..6cae1b99f2 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,49 +1,9 @@ package org.openforis.collect.earth.ipcc.model; -public class StratumObject { - - String value; - String label; - String description; - - public StratumObject(String value, String label) { - super(); - this.value = value; - this.label = label; - } - - public StratumObject(String value, String label, String description) { - super(); - this.value = value; - this.label = label; - this.description = description; - } +public class WetlandSubdivision extends ManagementLandUseSubdivision{ - - public String getValue() { - return value; - } - - public String getLabel() { - return label; - } - - public void setValue(String value) { - this.value = value; - } - - public void setLabel(String label) { - this.label = label; - } - - public String getDescription() { - return description; + public WetlandSubdivision( String code, String name, ManagementType type) { + super( LandUseCategory.W, code, name, type); } - - public void setDescription(String description) { - this.description = description; - } - - } From f8e441681d66fc5121ec58467395748fa1891b58 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:54 +0100 Subject: [PATCH 0476/1620] New translations WetlandSubdivision.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 46 ++----------------- 1 file changed, 3 insertions(+), 43 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 3af8a2cee0..6cae1b99f2 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,49 +1,9 @@ package org.openforis.collect.earth.ipcc.model; -public class StratumObject { - - String value; - String label; - String description; - - public StratumObject(String value, String label) { - super(); - this.value = value; - this.label = label; - } - - public StratumObject(String value, String label, String description) { - super(); - this.value = value; - this.label = label; - this.description = description; - } +public class WetlandSubdivision extends ManagementLandUseSubdivision{ - - public String getValue() { - return value; - } - - public String getLabel() { - return label; - } - - public void setValue(String value) { - this.value = value; - } - - public void setLabel(String label) { - this.label = label; - } - - public String getDescription() { - return description; + public WetlandSubdivision( String code, String name, ManagementType type) { + super( LandUseCategory.W, code, name, type); } - - public void setDescription(String description) { - this.description = description; - } - - } From 14d861472b4315fc8a4fccadba9b15f4c6f24f17 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:55 +0100 Subject: [PATCH 0477/1620] New translations WetlandSubdivision.java (English) --- .../earth/app/view/Messages_en.properties | 46 ++----------------- 1 file changed, 3 insertions(+), 43 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 3af8a2cee0..6cae1b99f2 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,49 +1,9 @@ package org.openforis.collect.earth.ipcc.model; -public class StratumObject { - - String value; - String label; - String description; - - public StratumObject(String value, String label) { - super(); - this.value = value; - this.label = label; - } - - public StratumObject(String value, String label, String description) { - super(); - this.value = value; - this.label = label; - this.description = description; - } +public class WetlandSubdivision extends ManagementLandUseSubdivision{ - - public String getValue() { - return value; - } - - public String getLabel() { - return label; - } - - public void setValue(String value) { - this.value = value; - } - - public void setLabel(String label) { - this.label = label; - } - - public String getDescription() { - return description; + public WetlandSubdivision( String code, String name, ManagementType type) { + super( LandUseCategory.W, code, name, type); } - - public void setDescription(String description) { - this.description = description; - } - - } From 63145d3a771f2a42d211c0e434faa6471022a4cc Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:56 +0100 Subject: [PATCH 0478/1620] New translations AssignSubdivisionTypesWizard.java (French) --- .../earth/app/view/Messages_fr.properties | 168 +++++++++++++++++- 1 file changed, 164 insertions(+), 4 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 6cae1b99f2..f4649a2339 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,9 +1,169 @@ -package org.openforis.collect.earth.ipcc.model; +package org.openforis.collect.earth.ipcc.view; -public class WetlandSubdivision extends ManagementLandUseSubdivision{ +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; + +import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; +import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; +import org.openforis.collect.earth.ipcc.model.CroplandType; +import org.openforis.collect.earth.ipcc.model.ForestSubdivision; +import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +import org.openforis.collect.earth.ipcc.model.ManagementType; +import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; +import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; +import org.openforis.collect.earth.ipcc.model.SettlementType; +import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import se.gustavkarlsson.gwiz.AbstractWizardPage; +import se.gustavkarlsson.gwiz.WizardController; + +public class AssignSubdivisionTypesWizard { + + JDialogWizard wizard ; + private Logger logger = LoggerFactory.getLogger( AssignSubdivisionTypesWizard.class); - public WetlandSubdivision( String code, String name, ManagementType type) { - super( LandUseCategory.W, code, name, type); + public void initializeTypes(List landUseSubdivisions ) { + + LandUseSubdivisionUtils.setLandUseSubdivisions(landUseSubdivisions); + + // Create a new wizard (this one is based on a JFrame) + wizard = new JDialogWizard(null, "Assign Management Type", true); + + wizard.addWindowListener( new WindowAdapter() { + public void windowClosing(WindowEvent e) { + if( !isWizardFinished() ) { + try { + SwingUtilities.invokeLater( + () -> JOptionPane.showMessageDialog(wizard, + "You need to assign management types for all subdivisions and then click on \"Finish\" to proceed" , + "Closing without finishing assginment of subdivisions", JOptionPane.WARNING_MESSAGE) + ); + } catch (Exception ex) { + logger.error("Error showing message",ex); + } + } + } + }); + + // Create the first page of the wizard + AbstractWizardPage forestPage = new ForestPage(); + + // Create the controller for wizard + WizardController wizardController = new WizardController(wizard); + + // Start the wizard and show it + wizardController.startWizard(forestPage); + wizard.setVisible(true); + } + public boolean isWizardFinished() { + return wizard.isWizardFinished(); + } + + public static void main(String[] args) { + + List luses = new ArrayList(); + + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + + luses.add( new WetlandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new WetlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new WetlandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new WetlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new WetlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new WetlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + + luses.add( new GrasslandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new GrasslandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new GrasslandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new GrasslandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new GrasslandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new GrasslandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + + luses.add( new OtherlandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new OtherlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new OtherlandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new OtherlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new OtherlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new OtherlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + + luses.add( new SettlementSubdivision("a", "aaaaa", SettlementType.TREED ) ); + luses.add( new SettlementSubdivision("b", "aaaaa", SettlementType.TREED ) ); + luses.add( new SettlementSubdivision("c", "aaaaa", SettlementType.TREED ) ); + luses.add( new SettlementSubdivision("f", "aaaaa", SettlementType.TREED ) ); + luses.add( new SettlementSubdivision("b", "aaaaa", SettlementType.OTHER ) ); + luses.add( new SettlementSubdivision("f", "aaaaa", SettlementType.OTHER ) ); + + AssignSubdivisionTypesWizard wizard = new AssignSubdivisionTypesWizard(); + + wizard.initializeTypes(luses); + } + } + + From 0fc5ea105bb9bd0330921ae17b9b724dc1332eb5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:57 +0100 Subject: [PATCH 0479/1620] New translations AssignSubdivisionTypesWizard.java (Spanish) --- .../earth/app/view/Messages_es.properties | 168 +++++++++++++++++- 1 file changed, 164 insertions(+), 4 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 6cae1b99f2..f4649a2339 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,9 +1,169 @@ -package org.openforis.collect.earth.ipcc.model; +package org.openforis.collect.earth.ipcc.view; -public class WetlandSubdivision extends ManagementLandUseSubdivision{ +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; + +import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; +import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; +import org.openforis.collect.earth.ipcc.model.CroplandType; +import org.openforis.collect.earth.ipcc.model.ForestSubdivision; +import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +import org.openforis.collect.earth.ipcc.model.ManagementType; +import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; +import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; +import org.openforis.collect.earth.ipcc.model.SettlementType; +import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import se.gustavkarlsson.gwiz.AbstractWizardPage; +import se.gustavkarlsson.gwiz.WizardController; + +public class AssignSubdivisionTypesWizard { + + JDialogWizard wizard ; + private Logger logger = LoggerFactory.getLogger( AssignSubdivisionTypesWizard.class); - public WetlandSubdivision( String code, String name, ManagementType type) { - super( LandUseCategory.W, code, name, type); + public void initializeTypes(List landUseSubdivisions ) { + + LandUseSubdivisionUtils.setLandUseSubdivisions(landUseSubdivisions); + + // Create a new wizard (this one is based on a JFrame) + wizard = new JDialogWizard(null, "Assign Management Type", true); + + wizard.addWindowListener( new WindowAdapter() { + public void windowClosing(WindowEvent e) { + if( !isWizardFinished() ) { + try { + SwingUtilities.invokeLater( + () -> JOptionPane.showMessageDialog(wizard, + "You need to assign management types for all subdivisions and then click on \"Finish\" to proceed" , + "Closing without finishing assginment of subdivisions", JOptionPane.WARNING_MESSAGE) + ); + } catch (Exception ex) { + logger.error("Error showing message",ex); + } + } + } + }); + + // Create the first page of the wizard + AbstractWizardPage forestPage = new ForestPage(); + + // Create the controller for wizard + WizardController wizardController = new WizardController(wizard); + + // Start the wizard and show it + wizardController.startWizard(forestPage); + wizard.setVisible(true); + } + public boolean isWizardFinished() { + return wizard.isWizardFinished(); + } + + public static void main(String[] args) { + + List luses = new ArrayList(); + + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + + luses.add( new WetlandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new WetlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new WetlandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new WetlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new WetlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new WetlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + + luses.add( new GrasslandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new GrasslandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new GrasslandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new GrasslandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new GrasslandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new GrasslandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + + luses.add( new OtherlandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new OtherlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new OtherlandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new OtherlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new OtherlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new OtherlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + + luses.add( new SettlementSubdivision("a", "aaaaa", SettlementType.TREED ) ); + luses.add( new SettlementSubdivision("b", "aaaaa", SettlementType.TREED ) ); + luses.add( new SettlementSubdivision("c", "aaaaa", SettlementType.TREED ) ); + luses.add( new SettlementSubdivision("f", "aaaaa", SettlementType.TREED ) ); + luses.add( new SettlementSubdivision("b", "aaaaa", SettlementType.OTHER ) ); + luses.add( new SettlementSubdivision("f", "aaaaa", SettlementType.OTHER ) ); + + AssignSubdivisionTypesWizard wizard = new AssignSubdivisionTypesWizard(); + + wizard.initializeTypes(luses); + } + } + + From 269a8bac2a418df8e3e29cbe5ad988bf1a098b2e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:58 +0100 Subject: [PATCH 0480/1620] New translations AssignSubdivisionTypesWizard.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 168 +++++++++++++++++- 1 file changed, 164 insertions(+), 4 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 6cae1b99f2..f4649a2339 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,9 +1,169 @@ -package org.openforis.collect.earth.ipcc.model; +package org.openforis.collect.earth.ipcc.view; -public class WetlandSubdivision extends ManagementLandUseSubdivision{ +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; + +import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; +import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; +import org.openforis.collect.earth.ipcc.model.CroplandType; +import org.openforis.collect.earth.ipcc.model.ForestSubdivision; +import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +import org.openforis.collect.earth.ipcc.model.ManagementType; +import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; +import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; +import org.openforis.collect.earth.ipcc.model.SettlementType; +import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import se.gustavkarlsson.gwiz.AbstractWizardPage; +import se.gustavkarlsson.gwiz.WizardController; + +public class AssignSubdivisionTypesWizard { + + JDialogWizard wizard ; + private Logger logger = LoggerFactory.getLogger( AssignSubdivisionTypesWizard.class); - public WetlandSubdivision( String code, String name, ManagementType type) { - super( LandUseCategory.W, code, name, type); + public void initializeTypes(List landUseSubdivisions ) { + + LandUseSubdivisionUtils.setLandUseSubdivisions(landUseSubdivisions); + + // Create a new wizard (this one is based on a JFrame) + wizard = new JDialogWizard(null, "Assign Management Type", true); + + wizard.addWindowListener( new WindowAdapter() { + public void windowClosing(WindowEvent e) { + if( !isWizardFinished() ) { + try { + SwingUtilities.invokeLater( + () -> JOptionPane.showMessageDialog(wizard, + "You need to assign management types for all subdivisions and then click on \"Finish\" to proceed" , + "Closing without finishing assginment of subdivisions", JOptionPane.WARNING_MESSAGE) + ); + } catch (Exception ex) { + logger.error("Error showing message",ex); + } + } + } + }); + + // Create the first page of the wizard + AbstractWizardPage forestPage = new ForestPage(); + + // Create the controller for wizard + WizardController wizardController = new WizardController(wizard); + + // Start the wizard and show it + wizardController.startWizard(forestPage); + wizard.setVisible(true); + } + public boolean isWizardFinished() { + return wizard.isWizardFinished(); + } + + public static void main(String[] args) { + + List luses = new ArrayList(); + + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + + luses.add( new WetlandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new WetlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new WetlandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new WetlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new WetlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new WetlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + + luses.add( new GrasslandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new GrasslandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new GrasslandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new GrasslandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new GrasslandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new GrasslandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + + luses.add( new OtherlandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new OtherlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new OtherlandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new OtherlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new OtherlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new OtherlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + + luses.add( new SettlementSubdivision("a", "aaaaa", SettlementType.TREED ) ); + luses.add( new SettlementSubdivision("b", "aaaaa", SettlementType.TREED ) ); + luses.add( new SettlementSubdivision("c", "aaaaa", SettlementType.TREED ) ); + luses.add( new SettlementSubdivision("f", "aaaaa", SettlementType.TREED ) ); + luses.add( new SettlementSubdivision("b", "aaaaa", SettlementType.OTHER ) ); + luses.add( new SettlementSubdivision("f", "aaaaa", SettlementType.OTHER ) ); + + AssignSubdivisionTypesWizard wizard = new AssignSubdivisionTypesWizard(); + + wizard.initializeTypes(luses); + } + } + + From b883f7c8ddffcf19f6dd4715a5523b8b12cd90fc Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:29:59 +0100 Subject: [PATCH 0481/1620] New translations OtherlandSubdivision.java (Spanish) --- .../earth/app/view/Messages_es.properties | 168 +----------------- 1 file changed, 4 insertions(+), 164 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index f4649a2339..8e3ce015dd 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,169 +1,9 @@ -package org.openforis.collect.earth.ipcc.view; +package org.openforis.collect.earth.ipcc.model; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.JOptionPane; -import javax.swing.SwingUtilities; - -import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; -import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; -import org.openforis.collect.earth.ipcc.model.CroplandType; -import org.openforis.collect.earth.ipcc.model.ForestSubdivision; -import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.openforis.collect.earth.ipcc.model.ManagementType; -import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; -import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; -import org.openforis.collect.earth.ipcc.model.SettlementType; -import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import se.gustavkarlsson.gwiz.AbstractWizardPage; -import se.gustavkarlsson.gwiz.WizardController; - -public class AssignSubdivisionTypesWizard { - - JDialogWizard wizard ; - private Logger logger = LoggerFactory.getLogger( AssignSubdivisionTypesWizard.class); +public class OtherlandSubdivision extends ManagementLandUseSubdivision{ - public void initializeTypes(List landUseSubdivisions ) { - - LandUseSubdivisionUtils.setLandUseSubdivisions(landUseSubdivisions); - - // Create a new wizard (this one is based on a JFrame) - wizard = new JDialogWizard(null, "Assign Management Type", true); - - wizard.addWindowListener( new WindowAdapter() { - public void windowClosing(WindowEvent e) { - if( !isWizardFinished() ) { - try { - SwingUtilities.invokeLater( - () -> JOptionPane.showMessageDialog(wizard, - "You need to assign management types for all subdivisions and then click on \"Finish\" to proceed" , - "Closing without finishing assginment of subdivisions", JOptionPane.WARNING_MESSAGE) - ); - } catch (Exception ex) { - logger.error("Error showing message",ex); - } - } - } - }); - - // Create the first page of the wizard - AbstractWizardPage forestPage = new ForestPage(); - - // Create the controller for wizard - WizardController wizardController = new WizardController(wizard); - - // Start the wizard and show it - wizardController.startWizard(forestPage); - wizard.setVisible(true); - + public OtherlandSubdivision( String code, String name, ManagementType type) { + super( LandUseCategory.O, code, name, type); } - public boolean isWizardFinished() { - return wizard.isWizardFinished(); - } - - public static void main(String[] args) { - - List luses = new ArrayList(); - - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - - luses.add( new WetlandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new WetlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new WetlandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new WetlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new WetlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new WetlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - - luses.add( new GrasslandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new GrasslandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new GrasslandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new GrasslandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new GrasslandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new GrasslandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - - luses.add( new OtherlandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new OtherlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new OtherlandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new OtherlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new OtherlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new OtherlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - - luses.add( new SettlementSubdivision("a", "aaaaa", SettlementType.TREED ) ); - luses.add( new SettlementSubdivision("b", "aaaaa", SettlementType.TREED ) ); - luses.add( new SettlementSubdivision("c", "aaaaa", SettlementType.TREED ) ); - luses.add( new SettlementSubdivision("f", "aaaaa", SettlementType.TREED ) ); - luses.add( new SettlementSubdivision("b", "aaaaa", SettlementType.OTHER ) ); - luses.add( new SettlementSubdivision("f", "aaaaa", SettlementType.OTHER ) ); - - AssignSubdivisionTypesWizard wizard = new AssignSubdivisionTypesWizard(); - - wizard.initializeTypes(luses); - } - } - - From 953b78d8fc8e729af42e58f4a422cfa53a5a4fb3 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:00 +0100 Subject: [PATCH 0482/1620] New translations ManagementType.java (English) --- .../earth/app/view/Messages_en.properties | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 6cae1b99f2..85ce8040d7 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,9 +1,21 @@ package org.openforis.collect.earth.ipcc.model; -public class WetlandSubdivision extends ManagementLandUseSubdivision{ +public enum ManagementType { + + MANAGED("Managed"),UNMANAGED("Unmanaged"); - public WetlandSubdivision( String code, String name, ManagementType type) { - super( LandUseCategory.W, code, name, type); - } + public final String name; + private ManagementType(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + @Override + public String toString() { + return getName(); + } } From 183085b139b2073cc255c300ee353bf43ee0b214 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:01 +0100 Subject: [PATCH 0483/1620] New translations CroplandType.java (English) --- .../openforis/collect/earth/app/view/Messages_en.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 85ce8040d7..e6464b6c58 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,12 +1,12 @@ package org.openforis.collect.earth.ipcc.model; -public enum ManagementType { +public enum CroplandType { - MANAGED("Managed"),UNMANAGED("Unmanaged"); + ANNUAL("Annual"),PERENNIAL("Perennial"); public final String name; - private ManagementType(String name) { + private CroplandType(String name) { this.name = name; } From 5decc938b641462058bf74d15e9536382b210cff Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:03 +0100 Subject: [PATCH 0484/1620] New translations LandUseCategory.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 184 +++--------------- 1 file changed, 23 insertions(+), 161 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index f4649a2339..5a783a70d8 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,169 +1,31 @@ -package org.openforis.collect.earth.ipcc.view; - -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.JOptionPane; -import javax.swing.SwingUtilities; - -import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; -import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; -import org.openforis.collect.earth.ipcc.model.CroplandType; -import org.openforis.collect.earth.ipcc.model.ForestSubdivision; -import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.openforis.collect.earth.ipcc.model.ManagementType; -import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; -import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; -import org.openforis.collect.earth.ipcc.model.SettlementType; -import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import se.gustavkarlsson.gwiz.AbstractWizardPage; -import se.gustavkarlsson.gwiz.WizardController; - -public class AssignSubdivisionTypesWizard { - - JDialogWizard wizard ; - private Logger logger = LoggerFactory.getLogger( AssignSubdivisionTypesWizard.class); +package org.openforis.collect.earth.ipcc.model; + +public enum LandUseCategory { + F ("F", "Forest"), + C ("C", "Cropland"), + S ("S", "Settlement"), + W ("W", "Wetland"), + G ("G","Grassland"), + O ("O", "Otherland"); - public void initializeTypes(List landUseSubdivisions ) { - - LandUseSubdivisionUtils.setLandUseSubdivisions(landUseSubdivisions); - - // Create a new wizard (this one is based on a JFrame) - wizard = new JDialogWizard(null, "Assign Management Type", true); - - wizard.addWindowListener( new WindowAdapter() { - public void windowClosing(WindowEvent e) { - if( !isWizardFinished() ) { - try { - SwingUtilities.invokeLater( - () -> JOptionPane.showMessageDialog(wizard, - "You need to assign management types for all subdivisions and then click on \"Finish\" to proceed" , - "Closing without finishing assginment of subdivisions", JOptionPane.WARNING_MESSAGE) - ); - } catch (Exception ex) { - logger.error("Error showing message",ex); - } - } - } - }); - - // Create the first page of the wizard - AbstractWizardPage forestPage = new ForestPage(); + private final String code; + private final String name; - // Create the controller for wizard - WizardController wizardController = new WizardController(wizard); + private LandUseCategory(String code, String name) { + this.code = code; + this.name = name; + } - // Start the wizard and show it - wizardController.startWizard(forestPage); - wizard.setVisible(true); - - } - - public boolean isWizardFinished() { - return wizard.isWizardFinished(); + public String getCode() { + return code; } - public static void main(String[] args) { - - List luses = new ArrayList(); - - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - - luses.add( new WetlandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new WetlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new WetlandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new WetlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new WetlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new WetlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - - luses.add( new GrasslandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new GrasslandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new GrasslandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new GrasslandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new GrasslandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new GrasslandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - - luses.add( new OtherlandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new OtherlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new OtherlandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new OtherlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new OtherlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new OtherlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - - luses.add( new SettlementSubdivision("a", "aaaaa", SettlementType.TREED ) ); - luses.add( new SettlementSubdivision("b", "aaaaa", SettlementType.TREED ) ); - luses.add( new SettlementSubdivision("c", "aaaaa", SettlementType.TREED ) ); - luses.add( new SettlementSubdivision("f", "aaaaa", SettlementType.TREED ) ); - luses.add( new SettlementSubdivision("b", "aaaaa", SettlementType.OTHER ) ); - luses.add( new SettlementSubdivision("f", "aaaaa", SettlementType.OTHER ) ); - - AssignSubdivisionTypesWizard wizard = new AssignSubdivisionTypesWizard(); - - wizard.initializeTypes(luses); + public String getName() { + return name; } + @Override + public String toString() { + return getCode(); + } } - - From 8106bc6bb76b533ffa9656df5eb1b4345ab8a04d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:05 +0100 Subject: [PATCH 0485/1620] New translations ForestSubdivision.java (French) --- .../earth/app/view/Messages_fr.properties | 168 +----------------- 1 file changed, 4 insertions(+), 164 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index f4649a2339..45d2698475 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,169 +1,9 @@ -package org.openforis.collect.earth.ipcc.view; +package org.openforis.collect.earth.ipcc.model; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.JOptionPane; -import javax.swing.SwingUtilities; - -import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; -import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; -import org.openforis.collect.earth.ipcc.model.CroplandType; -import org.openforis.collect.earth.ipcc.model.ForestSubdivision; -import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.openforis.collect.earth.ipcc.model.ManagementType; -import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; -import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; -import org.openforis.collect.earth.ipcc.model.SettlementType; -import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import se.gustavkarlsson.gwiz.AbstractWizardPage; -import se.gustavkarlsson.gwiz.WizardController; - -public class AssignSubdivisionTypesWizard { - - JDialogWizard wizard ; - private Logger logger = LoggerFactory.getLogger( AssignSubdivisionTypesWizard.class); +public class ForestSubdivision extends ManagementLandUseSubdivision{ - public void initializeTypes(List landUseSubdivisions ) { - - LandUseSubdivisionUtils.setLandUseSubdivisions(landUseSubdivisions); - - // Create a new wizard (this one is based on a JFrame) - wizard = new JDialogWizard(null, "Assign Management Type", true); - - wizard.addWindowListener( new WindowAdapter() { - public void windowClosing(WindowEvent e) { - if( !isWizardFinished() ) { - try { - SwingUtilities.invokeLater( - () -> JOptionPane.showMessageDialog(wizard, - "You need to assign management types for all subdivisions and then click on \"Finish\" to proceed" , - "Closing without finishing assginment of subdivisions", JOptionPane.WARNING_MESSAGE) - ); - } catch (Exception ex) { - logger.error("Error showing message",ex); - } - } - } - }); - - // Create the first page of the wizard - AbstractWizardPage forestPage = new ForestPage(); - - // Create the controller for wizard - WizardController wizardController = new WizardController(wizard); - - // Start the wizard and show it - wizardController.startWizard(forestPage); - wizard.setVisible(true); - + public ForestSubdivision( String code, String name, ManagementType type) { + super( LandUseCategory.F, code, name, type); } - public boolean isWizardFinished() { - return wizard.isWizardFinished(); - } - - public static void main(String[] args) { - - List luses = new ArrayList(); - - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - - luses.add( new WetlandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new WetlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new WetlandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new WetlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new WetlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new WetlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - - luses.add( new GrasslandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new GrasslandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new GrasslandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new GrasslandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new GrasslandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new GrasslandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - - luses.add( new OtherlandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new OtherlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new OtherlandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new OtherlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new OtherlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new OtherlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - - luses.add( new SettlementSubdivision("a", "aaaaa", SettlementType.TREED ) ); - luses.add( new SettlementSubdivision("b", "aaaaa", SettlementType.TREED ) ); - luses.add( new SettlementSubdivision("c", "aaaaa", SettlementType.TREED ) ); - luses.add( new SettlementSubdivision("f", "aaaaa", SettlementType.TREED ) ); - luses.add( new SettlementSubdivision("b", "aaaaa", SettlementType.OTHER ) ); - luses.add( new SettlementSubdivision("f", "aaaaa", SettlementType.OTHER ) ); - - AssignSubdivisionTypesWizard wizard = new AssignSubdivisionTypesWizard(); - - wizard.initializeTypes(luses); - } - } - - From 3952cfad66a80a252c4e9d4d3e48c68bc10984e8 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:06 +0100 Subject: [PATCH 0486/1620] New translations ForestSubdivision.java (Spanish) --- .../openforis/collect/earth/app/view/Messages_es.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 8e3ce015dd..45d2698475 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,9 +1,9 @@ package org.openforis.collect.earth.ipcc.model; -public class OtherlandSubdivision extends ManagementLandUseSubdivision{ +public class ForestSubdivision extends ManagementLandUseSubdivision{ - public OtherlandSubdivision( String code, String name, ManagementType type) { - super( LandUseCategory.O, code, name, type); + public ForestSubdivision( String code, String name, ManagementType type) { + super( LandUseCategory.F, code, name, type); } } From fffb13d86d901761d9be30f71b3e640e588a733b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:07 +0100 Subject: [PATCH 0487/1620] New translations ForestSubdivision.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 30 +++---------------- 1 file changed, 4 insertions(+), 26 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 5a783a70d8..45d2698475 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,31 +1,9 @@ package org.openforis.collect.earth.ipcc.model; -public enum LandUseCategory { - F ("F", "Forest"), - C ("C", "Cropland"), - S ("S", "Settlement"), - W ("W", "Wetland"), - G ("G","Grassland"), - O ("O", "Otherland"); +public class ForestSubdivision extends ManagementLandUseSubdivision{ - private final String code; - private final String name; - - private LandUseCategory(String code, String name) { - this.code = code; - this.name = name; - } - - public String getCode() { - return code; - } - - public String getName() { - return name; - } - - @Override - public String toString() { - return getCode(); + public ForestSubdivision( String code, String name, ManagementType type) { + super( LandUseCategory.F, code, name, type); } + } From 0ba3a3f78669181139ca90efe1ee03fd9935ebbe Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:08 +0100 Subject: [PATCH 0488/1620] New translations ForestSubdivision.java (English) --- .../earth/app/view/Messages_en.properties | 20 ++++--------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index e6464b6c58..45d2698475 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,21 +1,9 @@ package org.openforis.collect.earth.ipcc.model; -public enum CroplandType { - - ANNUAL("Annual"),PERENNIAL("Perennial"); - - public final String name; +public class ForestSubdivision extends ManagementLandUseSubdivision{ - private CroplandType(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - @Override - public String toString() { - return getName(); + public ForestSubdivision( String code, String name, ManagementType type) { + super( LandUseCategory.F, code, name, type); } + } From 9fbc7a6b9954c89f6e3cf4d614d5009944d1d292 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:09 +0100 Subject: [PATCH 0489/1620] New translations GrasslandSubdivision.java (French) --- .../collect/earth/app/view/Messages_fr.properties | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 45d2698475..0a8edd0b43 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,9 +1,9 @@ package org.openforis.collect.earth.ipcc.model; -public class ForestSubdivision extends ManagementLandUseSubdivision{ +public class GrasslandSubdivision extends ManagementLandUseSubdivision{ - public ForestSubdivision( String code, String name, ManagementType type) { - super( LandUseCategory.F, code, name, type); + public GrasslandSubdivision( String code, String name, ManagementType type) { + super( LandUseCategory.G, code, name, type); } -} +} \ No newline at end of file From 8db04187681f71d2e1000a5db84c80a9a43e969b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:10 +0100 Subject: [PATCH 0490/1620] New translations GrasslandSubdivision.java (Spanish) --- .../collect/earth/app/view/Messages_es.properties | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 45d2698475..0a8edd0b43 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,9 +1,9 @@ package org.openforis.collect.earth.ipcc.model; -public class ForestSubdivision extends ManagementLandUseSubdivision{ +public class GrasslandSubdivision extends ManagementLandUseSubdivision{ - public ForestSubdivision( String code, String name, ManagementType type) { - super( LandUseCategory.F, code, name, type); + public GrasslandSubdivision( String code, String name, ManagementType type) { + super( LandUseCategory.G, code, name, type); } -} +} \ No newline at end of file From a10876b46084c30041f70c0461fe7be2d1643e0d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:11 +0100 Subject: [PATCH 0491/1620] New translations GrasslandSubdivision.java (Portuguese) --- .../collect/earth/app/view/Messages_pt.properties | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 45d2698475..0a8edd0b43 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,9 +1,9 @@ package org.openforis.collect.earth.ipcc.model; -public class ForestSubdivision extends ManagementLandUseSubdivision{ +public class GrasslandSubdivision extends ManagementLandUseSubdivision{ - public ForestSubdivision( String code, String name, ManagementType type) { - super( LandUseCategory.F, code, name, type); + public GrasslandSubdivision( String code, String name, ManagementType type) { + super( LandUseCategory.G, code, name, type); } -} +} \ No newline at end of file From 6045b17dd776c9e1bb0ca18e3d93e49fed78c360 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:12 +0100 Subject: [PATCH 0492/1620] New translations GrasslandSubdivision.java (English) --- .../collect/earth/app/view/Messages_en.properties | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 45d2698475..0a8edd0b43 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,9 +1,9 @@ package org.openforis.collect.earth.ipcc.model; -public class ForestSubdivision extends ManagementLandUseSubdivision{ +public class GrasslandSubdivision extends ManagementLandUseSubdivision{ - public ForestSubdivision( String code, String name, ManagementType type) { - super( LandUseCategory.F, code, name, type); + public GrasslandSubdivision( String code, String name, ManagementType type) { + super( LandUseCategory.G, code, name, type); } -} +} \ No newline at end of file From 3abbe6a59f39aacd1ed4129e06567952bba1d54c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:13 +0100 Subject: [PATCH 0493/1620] New translations LandUseCategory.java (French) --- .../earth/app/view/Messages_fr.properties | 32 ++++++++++++++++--- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 0a8edd0b43..5a783a70d8 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,9 +1,31 @@ package org.openforis.collect.earth.ipcc.model; -public class GrasslandSubdivision extends ManagementLandUseSubdivision{ +public enum LandUseCategory { + F ("F", "Forest"), + C ("C", "Cropland"), + S ("S", "Settlement"), + W ("W", "Wetland"), + G ("G","Grassland"), + O ("O", "Otherland"); - public GrasslandSubdivision( String code, String name, ManagementType type) { - super( LandUseCategory.G, code, name, type); + private final String code; + private final String name; + + private LandUseCategory(String code, String name) { + this.code = code; + this.name = name; + } + + public String getCode() { + return code; } - -} \ No newline at end of file + + public String getName() { + return name; + } + + @Override + public String toString() { + return getCode(); + } +} From e7a3b39eb6a09f332d70ad74dad18a2d7e7f0632 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:14 +0100 Subject: [PATCH 0494/1620] New translations LandUseCategory.java (Spanish) --- .../earth/app/view/Messages_es.properties | 32 ++++++++++++++++--- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 0a8edd0b43..5a783a70d8 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,9 +1,31 @@ package org.openforis.collect.earth.ipcc.model; -public class GrasslandSubdivision extends ManagementLandUseSubdivision{ +public enum LandUseCategory { + F ("F", "Forest"), + C ("C", "Cropland"), + S ("S", "Settlement"), + W ("W", "Wetland"), + G ("G","Grassland"), + O ("O", "Otherland"); - public GrasslandSubdivision( String code, String name, ManagementType type) { - super( LandUseCategory.G, code, name, type); + private final String code; + private final String name; + + private LandUseCategory(String code, String name) { + this.code = code; + this.name = name; + } + + public String getCode() { + return code; } - -} \ No newline at end of file + + public String getName() { + return name; + } + + @Override + public String toString() { + return getCode(); + } +} From 65f12918c185829adb3e88641e42071530b6d238 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:16 +0100 Subject: [PATCH 0495/1620] New translations LandUseCategory.java (English) --- .../earth/app/view/Messages_en.properties | 32 ++++++++++++++++--- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 0a8edd0b43..5a783a70d8 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,9 +1,31 @@ package org.openforis.collect.earth.ipcc.model; -public class GrasslandSubdivision extends ManagementLandUseSubdivision{ +public enum LandUseCategory { + F ("F", "Forest"), + C ("C", "Cropland"), + S ("S", "Settlement"), + W ("W", "Wetland"), + G ("G","Grassland"), + O ("O", "Otherland"); - public GrasslandSubdivision( String code, String name, ManagementType type) { - super( LandUseCategory.G, code, name, type); + private final String code; + private final String name; + + private LandUseCategory(String code, String name) { + this.code = code; + this.name = name; + } + + public String getCode() { + return code; } - -} \ No newline at end of file + + public String getName() { + return name; + } + + @Override + public String toString() { + return getCode(); + } +} From 1c466c5e0b6ea52aef282baf80048fc638cc4dd4 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:17 +0100 Subject: [PATCH 0496/1620] New translations ManagementType.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 0a8edd0b43..85ce8040d7 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,9 +1,21 @@ package org.openforis.collect.earth.ipcc.model; -public class GrasslandSubdivision extends ManagementLandUseSubdivision{ +public enum ManagementType { + + MANAGED("Managed"),UNMANAGED("Unmanaged"); - public GrasslandSubdivision( String code, String name, ManagementType type) { - super( LandUseCategory.G, code, name, type); - } + public final String name; -} \ No newline at end of file + private ManagementType(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + @Override + public String toString() { + return getName(); + } +} From d5a92cd046165d62b7fcb93e70d76fa0c7d28ee0 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:18 +0100 Subject: [PATCH 0497/1620] New translations LandUseSubdivision.java (French) --- .../earth/app/view/Messages_fr.properties | 71 ++++++++++++++----- 1 file changed, 55 insertions(+), 16 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 5a783a70d8..f0d4740ff8 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,31 +1,70 @@ package org.openforis.collect.earth.ipcc.model; -public enum LandUseCategory { - F ("F", "Forest"), - C ("C", "Cropland"), - S ("S", "Settlement"), - W ("W", "Wetland"), - G ("G","Grassland"), - O ("O", "Otherland"); - - private final String code; - private final String name; +import java.util.Objects; - private LandUseCategory(String code, String name) { - this.code = code; - this.name = name; - } +public abstract class LandUseSubdivision implements Comparable>{ + protected LandUseCategory category; + protected String code; + protected String name; + + public LandUseSubdivision(LandUseCategory category, String code, String name) { + super(); + this.category = category; + this.code = code; + this.name = name; + } + + public abstract F getType(); + public abstract void setType(F type); + + public LandUseCategory getCategory() { + return category; + } public String getCode() { return code; } - public String getName() { return name; } + public void setCategory(LandUseCategory category) { + this.category = category; + } + public void setCode(String code) { + this.code = code; + } + public void setName(String name) { + this.name = name; + } + + @Override + public int compareTo(LandUseSubdivision other) { + if( this.getCategory().equals( other.getCategory() ) ){ + return this.getCode().compareTo( other.getCode() ); + }else { + return this.getCategory().getCode().compareTo( other.getCategory().getCode() ); + } + } + + @Override + public int hashCode() { + return Objects.hash(category, code, name); + } + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + LandUseSubdivision other = (LandUseSubdivision) obj; + return category == other.category && Objects.equals(code, other.code) && Objects.equals(name, other.name); + } + @Override public String toString() { - return getCode(); + return getCategory().getCode() + " / " + getType() + " / " + getCode(); } } From a3d0d5ce673571b19b65b629b873e023feae908f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:19 +0100 Subject: [PATCH 0498/1620] New translations LandUseSubdivision.java (Spanish) --- .../earth/app/view/Messages_es.properties | 71 ++++++++++++++----- 1 file changed, 55 insertions(+), 16 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 5a783a70d8..f0d4740ff8 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,31 +1,70 @@ package org.openforis.collect.earth.ipcc.model; -public enum LandUseCategory { - F ("F", "Forest"), - C ("C", "Cropland"), - S ("S", "Settlement"), - W ("W", "Wetland"), - G ("G","Grassland"), - O ("O", "Otherland"); - - private final String code; - private final String name; +import java.util.Objects; - private LandUseCategory(String code, String name) { - this.code = code; - this.name = name; - } +public abstract class LandUseSubdivision implements Comparable>{ + protected LandUseCategory category; + protected String code; + protected String name; + + public LandUseSubdivision(LandUseCategory category, String code, String name) { + super(); + this.category = category; + this.code = code; + this.name = name; + } + + public abstract F getType(); + public abstract void setType(F type); + + public LandUseCategory getCategory() { + return category; + } public String getCode() { return code; } - public String getName() { return name; } + public void setCategory(LandUseCategory category) { + this.category = category; + } + public void setCode(String code) { + this.code = code; + } + public void setName(String name) { + this.name = name; + } + + @Override + public int compareTo(LandUseSubdivision other) { + if( this.getCategory().equals( other.getCategory() ) ){ + return this.getCode().compareTo( other.getCode() ); + }else { + return this.getCategory().getCode().compareTo( other.getCategory().getCode() ); + } + } + + @Override + public int hashCode() { + return Objects.hash(category, code, name); + } + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + LandUseSubdivision other = (LandUseSubdivision) obj; + return category == other.category && Objects.equals(code, other.code) && Objects.equals(name, other.name); + } + @Override public String toString() { - return getCode(); + return getCategory().getCode() + " / " + getType() + " / " + getCode(); } } From 4c549f5f1908bc9d65b9340574fac8b15aedb7b0 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:20 +0100 Subject: [PATCH 0499/1620] New translations LandUseSubdivision.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 65 ++++++++++++++++--- 1 file changed, 57 insertions(+), 8 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 85ce8040d7..f0d4740ff8 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,21 +1,70 @@ package org.openforis.collect.earth.ipcc.model; -public enum ManagementType { +import java.util.Objects; - MANAGED("Managed"),UNMANAGED("Unmanaged"); +public abstract class LandUseSubdivision implements Comparable>{ + + protected LandUseCategory category; + protected String code; + protected String name; - public final String name; + public LandUseSubdivision(LandUseCategory category, String code, String name) { + super(); + this.category = category; + this.code = code; + this.name = name; + } - private ManagementType(String name) { - this.name = name; - } - + public abstract F getType(); + public abstract void setType(F type); + + public LandUseCategory getCategory() { + return category; + } + public String getCode() { + return code; + } public String getName() { return name; } + public void setCategory(LandUseCategory category) { + this.category = category; + } + public void setCode(String code) { + this.code = code; + } + public void setName(String name) { + this.name = name; + } + + @Override + public int compareTo(LandUseSubdivision other) { + if( this.getCategory().equals( other.getCategory() ) ){ + return this.getCode().compareTo( other.getCode() ); + }else { + return this.getCategory().getCode().compareTo( other.getCategory().getCode() ); + } + } + + @Override + public int hashCode() { + return Objects.hash(category, code, name); + } + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + LandUseSubdivision other = (LandUseSubdivision) obj; + return category == other.category && Objects.equals(code, other.code) && Objects.equals(name, other.name); + } + @Override public String toString() { - return getName(); + return getCategory().getCode() + " / " + getType() + " / " + getCode(); } } From a48b7bc8b6f24d1fc4c760772788110450c33910 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:21 +0100 Subject: [PATCH 0500/1620] New translations LandUseSubdivision.java (English) --- .../earth/app/view/Messages_en.properties | 71 ++++++++++++++----- 1 file changed, 55 insertions(+), 16 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 5a783a70d8..f0d4740ff8 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,31 +1,70 @@ package org.openforis.collect.earth.ipcc.model; -public enum LandUseCategory { - F ("F", "Forest"), - C ("C", "Cropland"), - S ("S", "Settlement"), - W ("W", "Wetland"), - G ("G","Grassland"), - O ("O", "Otherland"); - - private final String code; - private final String name; +import java.util.Objects; - private LandUseCategory(String code, String name) { - this.code = code; - this.name = name; - } +public abstract class LandUseSubdivision implements Comparable>{ + protected LandUseCategory category; + protected String code; + protected String name; + + public LandUseSubdivision(LandUseCategory category, String code, String name) { + super(); + this.category = category; + this.code = code; + this.name = name; + } + + public abstract F getType(); + public abstract void setType(F type); + + public LandUseCategory getCategory() { + return category; + } public String getCode() { return code; } - public String getName() { return name; } + public void setCategory(LandUseCategory category) { + this.category = category; + } + public void setCode(String code) { + this.code = code; + } + public void setName(String name) { + this.name = name; + } + + @Override + public int compareTo(LandUseSubdivision other) { + if( this.getCategory().equals( other.getCategory() ) ){ + return this.getCode().compareTo( other.getCode() ); + }else { + return this.getCategory().getCode().compareTo( other.getCategory().getCode() ); + } + } + + @Override + public int hashCode() { + return Objects.hash(category, code, name); + } + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + LandUseSubdivision other = (LandUseSubdivision) obj; + return category == other.category && Objects.equals(code, other.code) && Objects.equals(name, other.name); + } + @Override public String toString() { - return getCode(); + return getCategory().getCode() + " / " + getType() + " / " + getCode(); } } From 6ad67b83e513a0a7237ad0bab370610b2aa0f6f0 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:22 +0100 Subject: [PATCH 0501/1620] New translations ManagementLandUseSubdivision.java (French) --- .../earth/app/view/Messages_fr.properties | 72 ++++--------------- 1 file changed, 13 insertions(+), 59 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index f0d4740ff8..b99c8caa67 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,70 +1,24 @@ package org.openforis.collect.earth.ipcc.model; -import java.util.Objects; +public abstract class ManagementLandUseSubdivision extends LandUseSubdivision{ -public abstract class LandUseSubdivision implements Comparable>{ - protected LandUseCategory category; - protected String code; - protected String name; - - public LandUseSubdivision(LandUseCategory category, String code, String name) { - super(); - this.category = category; - this.code = code; - this.name = name; - } - - public abstract F getType(); - public abstract void setType(F type); + + protected ManagementType type; - public LandUseCategory getCategory() { - return category; - } - public String getCode() { - return code; - } - public String getName() { - return name; - } - public void setCategory(LandUseCategory category) { - this.category = category; - } - public void setCode(String code) { - this.code = code; + public ManagementLandUseSubdivision( LandUseCategory category, String code, String name, ManagementType type) { + super(category, code, name); + setType(type); } - public void setName(String name) { - this.name = name; + + public ManagementType getType() { + return type; } + + public void setType(ManagementType type) { + this.type = type; + }; - @Override - public int compareTo(LandUseSubdivision other) { - if( this.getCategory().equals( other.getCategory() ) ){ - return this.getCode().compareTo( other.getCode() ); - }else { - return this.getCategory().getCode().compareTo( other.getCategory().getCode() ); - } - } - @Override - public int hashCode() { - return Objects.hash(category, code, name); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - LandUseSubdivision other = (LandUseSubdivision) obj; - return category == other.category && Objects.equals(code, other.code) && Objects.equals(name, other.name); - } - @Override - public String toString() { - return getCategory().getCode() + " / " + getType() + " / " + getCode(); - } } From 0f223ccd5068e760d192e3ac65f9c84f906562e1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:24 +0100 Subject: [PATCH 0502/1620] New translations ManagementLandUseSubdivision.java (Spanish) --- .../earth/app/view/Messages_es.properties | 72 ++++--------------- 1 file changed, 13 insertions(+), 59 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index f0d4740ff8..b99c8caa67 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,70 +1,24 @@ package org.openforis.collect.earth.ipcc.model; -import java.util.Objects; +public abstract class ManagementLandUseSubdivision extends LandUseSubdivision{ -public abstract class LandUseSubdivision implements Comparable>{ - protected LandUseCategory category; - protected String code; - protected String name; - - public LandUseSubdivision(LandUseCategory category, String code, String name) { - super(); - this.category = category; - this.code = code; - this.name = name; - } - - public abstract F getType(); - public abstract void setType(F type); + + protected ManagementType type; - public LandUseCategory getCategory() { - return category; - } - public String getCode() { - return code; - } - public String getName() { - return name; - } - public void setCategory(LandUseCategory category) { - this.category = category; - } - public void setCode(String code) { - this.code = code; + public ManagementLandUseSubdivision( LandUseCategory category, String code, String name, ManagementType type) { + super(category, code, name); + setType(type); } - public void setName(String name) { - this.name = name; + + public ManagementType getType() { + return type; } + + public void setType(ManagementType type) { + this.type = type; + }; - @Override - public int compareTo(LandUseSubdivision other) { - if( this.getCategory().equals( other.getCategory() ) ){ - return this.getCode().compareTo( other.getCode() ); - }else { - return this.getCategory().getCode().compareTo( other.getCategory().getCode() ); - } - } - @Override - public int hashCode() { - return Objects.hash(category, code, name); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - LandUseSubdivision other = (LandUseSubdivision) obj; - return category == other.category && Objects.equals(code, other.code) && Objects.equals(name, other.name); - } - @Override - public String toString() { - return getCategory().getCode() + " / " + getType() + " / " + getCode(); - } } From e7711359a2c0ec855a55b2d2694ada2f934b464d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:25 +0100 Subject: [PATCH 0503/1620] New translations ManagementLandUseSubdivision.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 72 ++++--------------- 1 file changed, 13 insertions(+), 59 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index f0d4740ff8..b99c8caa67 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,70 +1,24 @@ package org.openforis.collect.earth.ipcc.model; -import java.util.Objects; +public abstract class ManagementLandUseSubdivision extends LandUseSubdivision{ -public abstract class LandUseSubdivision implements Comparable>{ - protected LandUseCategory category; - protected String code; - protected String name; - - public LandUseSubdivision(LandUseCategory category, String code, String name) { - super(); - this.category = category; - this.code = code; - this.name = name; - } - - public abstract F getType(); - public abstract void setType(F type); + + protected ManagementType type; - public LandUseCategory getCategory() { - return category; - } - public String getCode() { - return code; - } - public String getName() { - return name; - } - public void setCategory(LandUseCategory category) { - this.category = category; - } - public void setCode(String code) { - this.code = code; + public ManagementLandUseSubdivision( LandUseCategory category, String code, String name, ManagementType type) { + super(category, code, name); + setType(type); } - public void setName(String name) { - this.name = name; + + public ManagementType getType() { + return type; } + + public void setType(ManagementType type) { + this.type = type; + }; - @Override - public int compareTo(LandUseSubdivision other) { - if( this.getCategory().equals( other.getCategory() ) ){ - return this.getCode().compareTo( other.getCode() ); - }else { - return this.getCategory().getCode().compareTo( other.getCategory().getCode() ); - } - } - @Override - public int hashCode() { - return Objects.hash(category, code, name); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - LandUseSubdivision other = (LandUseSubdivision) obj; - return category == other.category && Objects.equals(code, other.code) && Objects.equals(name, other.name); - } - @Override - public String toString() { - return getCategory().getCode() + " / " + getType() + " / " + getCode(); - } } From adfb97ef8654c0853a50cf2214d89b97f17596bd Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:26 +0100 Subject: [PATCH 0504/1620] New translations ManagementLandUseSubdivision.java (English) --- .../earth/app/view/Messages_en.properties | 72 ++++--------------- 1 file changed, 13 insertions(+), 59 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index f0d4740ff8..b99c8caa67 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,70 +1,24 @@ package org.openforis.collect.earth.ipcc.model; -import java.util.Objects; +public abstract class ManagementLandUseSubdivision extends LandUseSubdivision{ -public abstract class LandUseSubdivision implements Comparable>{ - protected LandUseCategory category; - protected String code; - protected String name; - - public LandUseSubdivision(LandUseCategory category, String code, String name) { - super(); - this.category = category; - this.code = code; - this.name = name; - } - - public abstract F getType(); - public abstract void setType(F type); + + protected ManagementType type; - public LandUseCategory getCategory() { - return category; - } - public String getCode() { - return code; - } - public String getName() { - return name; - } - public void setCategory(LandUseCategory category) { - this.category = category; - } - public void setCode(String code) { - this.code = code; + public ManagementLandUseSubdivision( LandUseCategory category, String code, String name, ManagementType type) { + super(category, code, name); + setType(type); } - public void setName(String name) { - this.name = name; + + public ManagementType getType() { + return type; } + + public void setType(ManagementType type) { + this.type = type; + }; - @Override - public int compareTo(LandUseSubdivision other) { - if( this.getCategory().equals( other.getCategory() ) ){ - return this.getCode().compareTo( other.getCode() ); - }else { - return this.getCategory().getCode().compareTo( other.getCategory().getCode() ); - } - } - @Override - public int hashCode() { - return Objects.hash(category, code, name); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - LandUseSubdivision other = (LandUseSubdivision) obj; - return category == other.category && Objects.equals(code, other.code) && Objects.equals(name, other.name); - } - @Override - public String toString() { - return getCategory().getCode() + " / " + getType() + " / " + getCode(); - } } From b9182f5a26f8b4944c2025a6176b51f62b4dbfcc Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:27 +0100 Subject: [PATCH 0505/1620] New translations ManagementType.java (French) --- .../earth/app/view/Messages_fr.properties | 29 +++++++++---------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index b99c8caa67..85ce8040d7 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,24 +1,21 @@ package org.openforis.collect.earth.ipcc.model; -public abstract class ManagementLandUseSubdivision extends LandUseSubdivision{ +public enum ManagementType { - - - protected ManagementType type; + MANAGED("Managed"),UNMANAGED("Unmanaged"); - public ManagementLandUseSubdivision( LandUseCategory category, String code, String name, ManagementType type) { - super(category, code, name); - setType(type); - } + public final String name; + + private ManagementType(String name) { + this.name = name; + } - public ManagementType getType() { - return type; + public String getName() { + return name; } - public void setType(ManagementType type) { - this.type = type; - }; - - - + @Override + public String toString() { + return getName(); + } } From 8bee953f175e421cd6593cb7b19926c4dcc13bc3 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:28 +0100 Subject: [PATCH 0506/1620] New translations ManagementType.java (Spanish) --- .../earth/app/view/Messages_es.properties | 29 +++++++++---------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index b99c8caa67..85ce8040d7 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,24 +1,21 @@ package org.openforis.collect.earth.ipcc.model; -public abstract class ManagementLandUseSubdivision extends LandUseSubdivision{ +public enum ManagementType { - - - protected ManagementType type; + MANAGED("Managed"),UNMANAGED("Unmanaged"); - public ManagementLandUseSubdivision( LandUseCategory category, String code, String name, ManagementType type) { - super(category, code, name); - setType(type); - } + public final String name; + + private ManagementType(String name) { + this.name = name; + } - public ManagementType getType() { - return type; + public String getName() { + return name; } - public void setType(ManagementType type) { - this.type = type; - }; - - - + @Override + public String toString() { + return getName(); + } } From c66650523a4a68a4df848c64e3f3a5f3e487985e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:29 +0100 Subject: [PATCH 0507/1620] New translations AssignSubdivisionTypesWizard.java (English) --- .../earth/app/view/Messages_en.properties | 173 ++++++++++++++++-- 1 file changed, 159 insertions(+), 14 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index b99c8caa67..f4649a2339 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,24 +1,169 @@ -package org.openforis.collect.earth.ipcc.model; +package org.openforis.collect.earth.ipcc.view; -public abstract class ManagementLandUseSubdivision extends LandUseSubdivision{ +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.util.ArrayList; +import java.util.List; +import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; +import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; +import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; +import org.openforis.collect.earth.ipcc.model.CroplandType; +import org.openforis.collect.earth.ipcc.model.ForestSubdivision; +import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +import org.openforis.collect.earth.ipcc.model.ManagementType; +import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; +import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; +import org.openforis.collect.earth.ipcc.model.SettlementType; +import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; - protected ManagementType type; +import se.gustavkarlsson.gwiz.AbstractWizardPage; +import se.gustavkarlsson.gwiz.WizardController; + +public class AssignSubdivisionTypesWizard { + + JDialogWizard wizard ; + private Logger logger = LoggerFactory.getLogger( AssignSubdivisionTypesWizard.class); + + public void initializeTypes(List landUseSubdivisions ) { + + LandUseSubdivisionUtils.setLandUseSubdivisions(landUseSubdivisions); + + // Create a new wizard (this one is based on a JFrame) + wizard = new JDialogWizard(null, "Assign Management Type", true); + + wizard.addWindowListener( new WindowAdapter() { + public void windowClosing(WindowEvent e) { + if( !isWizardFinished() ) { + try { + SwingUtilities.invokeLater( + () -> JOptionPane.showMessageDialog(wizard, + "You need to assign management types for all subdivisions and then click on \"Finish\" to proceed" , + "Closing without finishing assginment of subdivisions", JOptionPane.WARNING_MESSAGE) + ); + } catch (Exception ex) { + logger.error("Error showing message",ex); + } + } + } + }); + + // Create the first page of the wizard + AbstractWizardPage forestPage = new ForestPage(); + + // Create the controller for wizard + WizardController wizardController = new WizardController(wizard); + + // Start the wizard and show it + wizardController.startWizard(forestPage); + wizard.setVisible(true); + + } - public ManagementLandUseSubdivision( LandUseCategory category, String code, String name, ManagementType type) { - super(category, code, name); - setType(type); + public boolean isWizardFinished() { + return wizard.isWizardFinished(); } - public ManagementType getType() { - return type; + public static void main(String[] args) { + + List luses = new ArrayList(); + + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + + luses.add( new WetlandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new WetlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new WetlandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new WetlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new WetlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new WetlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + + luses.add( new GrasslandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new GrasslandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new GrasslandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new GrasslandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new GrasslandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new GrasslandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + + luses.add( new OtherlandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new OtherlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new OtherlandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new OtherlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new OtherlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new OtherlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + + luses.add( new SettlementSubdivision("a", "aaaaa", SettlementType.TREED ) ); + luses.add( new SettlementSubdivision("b", "aaaaa", SettlementType.TREED ) ); + luses.add( new SettlementSubdivision("c", "aaaaa", SettlementType.TREED ) ); + luses.add( new SettlementSubdivision("f", "aaaaa", SettlementType.TREED ) ); + luses.add( new SettlementSubdivision("b", "aaaaa", SettlementType.OTHER ) ); + luses.add( new SettlementSubdivision("f", "aaaaa", SettlementType.OTHER ) ); + + AssignSubdivisionTypesWizard wizard = new AssignSubdivisionTypesWizard(); + + wizard.initializeTypes(luses); } - public void setType(ManagementType type) { - this.type = type; - }; - - - } + + From 6ea531fbb90d1ed4a9f530b6b9bdbb69bc2f3f32 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:30 +0100 Subject: [PATCH 0508/1620] New translations CroplandPage.java (French) --- .../earth/app/view/Messages_fr.properties | 42 +++++++++++++------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 85ce8040d7..74424e2c9b 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,21 +1,39 @@ -package org.openforis.collect.earth.ipcc.model; +package org.openforis.collect.earth.ipcc.view; -public enum ManagementType { +import org.openforis.collect.earth.ipcc.model.CroplandType; +import org.openforis.collect.earth.ipcc.model.LandUseCategory; - MANAGED("Managed"),UNMANAGED("Unmanaged"); - - public final String name; +import se.gustavkarlsson.gwiz.AbstractWizardPage; + +public class CroplandPage extends SubdivisionPage { + + + private static final long serialVersionUID = -8470656687978500741L; + private AbstractWizardPage nextPage = new GrasslandPage(); - private ManagementType(String name) { - this.name = name; - } + public CroplandPage() { + super( LandUseCategory.C ); + } + + @Override + protected AbstractWizardPage getNextPage() { + return nextPage; + } + - public String getName() { - return name; + @Override + protected boolean isFinishAllowed() { + return false; } @Override - public String toString() { - return getName(); + protected Object[] getValues() { + return CroplandType.values(); } + + @Override + protected String getLabel() { + return Messages.getString("CroplandPage.0"); //$NON-NLS-1$ + } + } From 9c52b5039f8e5e2a113dc34493c4ade851107a54 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:31 +0100 Subject: [PATCH 0509/1620] New translations CroplandPage.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 43 +++++++++++++------ 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index b99c8caa67..74424e2c9b 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,24 +1,39 @@ -package org.openforis.collect.earth.ipcc.model; +package org.openforis.collect.earth.ipcc.view; -public abstract class ManagementLandUseSubdivision extends LandUseSubdivision{ +import org.openforis.collect.earth.ipcc.model.CroplandType; +import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import se.gustavkarlsson.gwiz.AbstractWizardPage; +public class CroplandPage extends SubdivisionPage { - protected ManagementType type; + + private static final long serialVersionUID = -8470656687978500741L; + private AbstractWizardPage nextPage = new GrasslandPage(); - public ManagementLandUseSubdivision( LandUseCategory category, String code, String name, ManagementType type) { - super(category, code, name); - setType(type); + public CroplandPage() { + super( LandUseCategory.C ); } - public ManagementType getType() { - return type; + @Override + protected AbstractWizardPage getNextPage() { + return nextPage; + } + + + @Override + protected boolean isFinishAllowed() { + return false; + } + + @Override + protected Object[] getValues() { + return CroplandType.values(); + } + + @Override + protected String getLabel() { + return Messages.getString("CroplandPage.0"); //$NON-NLS-1$ } - public void setType(ManagementType type) { - this.type = type; - }; - - - } From 0fa731ea3f54654300877f67c56d8b5bc095fc05 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:32 +0100 Subject: [PATCH 0510/1620] New translations CroplandPage.java (English) --- .../earth/app/view/Messages_en.properties | 172 +++--------------- 1 file changed, 21 insertions(+), 151 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index f4649a2339..74424e2c9b 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,169 +1,39 @@ package org.openforis.collect.earth.ipcc.view; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.JOptionPane; -import javax.swing.SwingUtilities; - -import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; -import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; import org.openforis.collect.earth.ipcc.model.CroplandType; -import org.openforis.collect.earth.ipcc.model.ForestSubdivision; -import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.openforis.collect.earth.ipcc.model.ManagementType; -import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; -import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; -import org.openforis.collect.earth.ipcc.model.SettlementType; -import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.openforis.collect.earth.ipcc.model.LandUseCategory; import se.gustavkarlsson.gwiz.AbstractWizardPage; -import se.gustavkarlsson.gwiz.WizardController; - -public class AssignSubdivisionTypesWizard { - - JDialogWizard wizard ; - private Logger logger = LoggerFactory.getLogger( AssignSubdivisionTypesWizard.class); - - public void initializeTypes(List landUseSubdivisions ) { - - LandUseSubdivisionUtils.setLandUseSubdivisions(landUseSubdivisions); - - // Create a new wizard (this one is based on a JFrame) - wizard = new JDialogWizard(null, "Assign Management Type", true); - - wizard.addWindowListener( new WindowAdapter() { - public void windowClosing(WindowEvent e) { - if( !isWizardFinished() ) { - try { - SwingUtilities.invokeLater( - () -> JOptionPane.showMessageDialog(wizard, - "You need to assign management types for all subdivisions and then click on \"Finish\" to proceed" , - "Closing without finishing assginment of subdivisions", JOptionPane.WARNING_MESSAGE) - ); - } catch (Exception ex) { - logger.error("Error showing message",ex); - } - } - } - }); - // Create the first page of the wizard - AbstractWizardPage forestPage = new ForestPage(); +public class CroplandPage extends SubdivisionPage { - // Create the controller for wizard - WizardController wizardController = new WizardController(wizard); - // Start the wizard and show it - wizardController.startWizard(forestPage); - wizard.setVisible(true); - - } + private static final long serialVersionUID = -8470656687978500741L; + private AbstractWizardPage nextPage = new GrasslandPage(); - public boolean isWizardFinished() { - return wizard.isWizardFinished(); + public CroplandPage() { + super( LandUseCategory.C ); } - public static void main(String[] args) { - - List luses = new ArrayList(); - - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + @Override + protected AbstractWizardPage getNextPage() { + return nextPage; + } - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new WetlandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new WetlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new WetlandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new WetlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new WetlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new WetlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - - luses.add( new GrasslandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new GrasslandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new GrasslandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new GrasslandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new GrasslandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new GrasslandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - - luses.add( new OtherlandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new OtherlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new OtherlandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new OtherlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new OtherlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new OtherlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + @Override + protected boolean isFinishAllowed() { + return false; + } - luses.add( new SettlementSubdivision("a", "aaaaa", SettlementType.TREED ) ); - luses.add( new SettlementSubdivision("b", "aaaaa", SettlementType.TREED ) ); - luses.add( new SettlementSubdivision("c", "aaaaa", SettlementType.TREED ) ); - luses.add( new SettlementSubdivision("f", "aaaaa", SettlementType.TREED ) ); - luses.add( new SettlementSubdivision("b", "aaaaa", SettlementType.OTHER ) ); - luses.add( new SettlementSubdivision("f", "aaaaa", SettlementType.OTHER ) ); - - AssignSubdivisionTypesWizard wizard = new AssignSubdivisionTypesWizard(); + @Override + protected Object[] getValues() { + return CroplandType.values(); + } - wizard.initializeTypes(luses); + @Override + protected String getLabel() { + return Messages.getString("CroplandPage.0"); //$NON-NLS-1$ } } - - From 1c824f2dc8c1f8f058d35f16b0313a8c9ecba647 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:33 +0100 Subject: [PATCH 0511/1620] New translations EndPage.java (French) --- .../earth/app/view/Messages_fr.properties | 97 +++++++++++-------- 1 file changed, 58 insertions(+), 39 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 74424e2c9b..63ae88c539 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,39 +1,58 @@ -package org.openforis.collect.earth.ipcc.view; - -import org.openforis.collect.earth.ipcc.model.CroplandType; -import org.openforis.collect.earth.ipcc.model.LandUseCategory; - -import se.gustavkarlsson.gwiz.AbstractWizardPage; - -public class CroplandPage extends SubdivisionPage { - - - private static final long serialVersionUID = -8470656687978500741L; - private AbstractWizardPage nextPage = new GrasslandPage(); - - public CroplandPage() { - super( LandUseCategory.C ); - } - - @Override - protected AbstractWizardPage getNextPage() { - return nextPage; - } - - - @Override - protected boolean isFinishAllowed() { - return false; - } - - @Override - protected Object[] getValues() { - return CroplandType.values(); - } - - @Override - protected String getLabel() { - return Messages.getString("CroplandPage.0"); //$NON-NLS-1$ - } - -} +package org.openforis.collect.earth.ipcc.view; + +import java.awt.FlowLayout; +import java.awt.Label; +import java.awt.TextField; +import java.awt.event.TextEvent; +import java.awt.event.TextListener; + +import se.gustavkarlsson.gwiz.AbstractWizardPage; + +@SuppressWarnings("serial") +public class EndPage extends AbstractWizardPage { + + private final TextField finishTextField = new TextField("no", 5); + + public EndPage() { + setLayout(new FlowLayout()); + + add(new Label("Do you want to finish? Type in your answer:")); + add(finishTextField); + + // Add a listener for updating the wizard buttons + finishTextField.addTextListener(new TextListener() { + @Override + public void textValueChanged(TextEvent e) { + updateWizardButtons(); + } + }); + } + + @Override + protected AbstractWizardPage getNextPage() { + return null; + } + + @Override + protected boolean isCancelAllowed() { + return true; + } + + @Override + protected boolean isPreviousAllowed() { + return true; + } + + @Override + protected boolean isNextAllowed() { + return false; + } + + @Override + protected + boolean isFinishAllowed() { + // Only allow finish if the user typed "yes" in the text field + return finishTextField.getText().trim().equalsIgnoreCase("yes"); + } + +} From 170fb7d87425ca256b4b56ed19a45bccff404bff Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:34 +0100 Subject: [PATCH 0512/1620] New translations EndPage.java (Spanish) --- .../earth/app/view/Messages_es.properties | 79 ++++++++++++++----- 1 file changed, 58 insertions(+), 21 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 85ce8040d7..63ae88c539 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,21 +1,58 @@ -package org.openforis.collect.earth.ipcc.model; - -public enum ManagementType { - - MANAGED("Managed"),UNMANAGED("Unmanaged"); - - public final String name; - - private ManagementType(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - @Override - public String toString() { - return getName(); - } -} +package org.openforis.collect.earth.ipcc.view; + +import java.awt.FlowLayout; +import java.awt.Label; +import java.awt.TextField; +import java.awt.event.TextEvent; +import java.awt.event.TextListener; + +import se.gustavkarlsson.gwiz.AbstractWizardPage; + +@SuppressWarnings("serial") +public class EndPage extends AbstractWizardPage { + + private final TextField finishTextField = new TextField("no", 5); + + public EndPage() { + setLayout(new FlowLayout()); + + add(new Label("Do you want to finish? Type in your answer:")); + add(finishTextField); + + // Add a listener for updating the wizard buttons + finishTextField.addTextListener(new TextListener() { + @Override + public void textValueChanged(TextEvent e) { + updateWizardButtons(); + } + }); + } + + @Override + protected AbstractWizardPage getNextPage() { + return null; + } + + @Override + protected boolean isCancelAllowed() { + return true; + } + + @Override + protected boolean isPreviousAllowed() { + return true; + } + + @Override + protected boolean isNextAllowed() { + return false; + } + + @Override + protected + boolean isFinishAllowed() { + // Only allow finish if the user typed "yes" in the text field + return finishTextField.getText().trim().equalsIgnoreCase("yes"); + } + +} From 18ab5c671b60f47beb0bd7b610631165923de3f0 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:35 +0100 Subject: [PATCH 0513/1620] New translations CroplandPage.java (Spanish) --- .../earth/app/view/Messages_es.properties | 97 ++++++++----------- 1 file changed, 39 insertions(+), 58 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 63ae88c539..74424e2c9b 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,58 +1,39 @@ -package org.openforis.collect.earth.ipcc.view; - -import java.awt.FlowLayout; -import java.awt.Label; -import java.awt.TextField; -import java.awt.event.TextEvent; -import java.awt.event.TextListener; - -import se.gustavkarlsson.gwiz.AbstractWizardPage; - -@SuppressWarnings("serial") -public class EndPage extends AbstractWizardPage { - - private final TextField finishTextField = new TextField("no", 5); - - public EndPage() { - setLayout(new FlowLayout()); - - add(new Label("Do you want to finish? Type in your answer:")); - add(finishTextField); - - // Add a listener for updating the wizard buttons - finishTextField.addTextListener(new TextListener() { - @Override - public void textValueChanged(TextEvent e) { - updateWizardButtons(); - } - }); - } - - @Override - protected AbstractWizardPage getNextPage() { - return null; - } - - @Override - protected boolean isCancelAllowed() { - return true; - } - - @Override - protected boolean isPreviousAllowed() { - return true; - } - - @Override - protected boolean isNextAllowed() { - return false; - } - - @Override - protected - boolean isFinishAllowed() { - // Only allow finish if the user typed "yes" in the text field - return finishTextField.getText().trim().equalsIgnoreCase("yes"); - } - -} +package org.openforis.collect.earth.ipcc.view; + +import org.openforis.collect.earth.ipcc.model.CroplandType; +import org.openforis.collect.earth.ipcc.model.LandUseCategory; + +import se.gustavkarlsson.gwiz.AbstractWizardPage; + +public class CroplandPage extends SubdivisionPage { + + + private static final long serialVersionUID = -8470656687978500741L; + private AbstractWizardPage nextPage = new GrasslandPage(); + + public CroplandPage() { + super( LandUseCategory.C ); + } + + @Override + protected AbstractWizardPage getNextPage() { + return nextPage; + } + + + @Override + protected boolean isFinishAllowed() { + return false; + } + + @Override + protected Object[] getValues() { + return CroplandType.values(); + } + + @Override + protected String getLabel() { + return Messages.getString("CroplandPage.0"); //$NON-NLS-1$ + } + +} From 2ecb75e1a0b15c20ac1079d7ad6c27d53c94c4a1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:36 +0100 Subject: [PATCH 0514/1620] New translations WetlandPage.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 74424e2c9b..b55115af7f 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,18 +1,17 @@ package org.openforis.collect.earth.ipcc.view; -import org.openforis.collect.earth.ipcc.model.CroplandType; import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import org.openforis.collect.earth.ipcc.model.ManagementType; import se.gustavkarlsson.gwiz.AbstractWizardPage; -public class CroplandPage extends SubdivisionPage { +public class WetlandPage extends SubdivisionPage { - - private static final long serialVersionUID = -8470656687978500741L; - private AbstractWizardPage nextPage = new GrasslandPage(); + private static final long serialVersionUID = 5385335458259411328L; + private AbstractWizardPage nextPage = new OtherlandPage(); - public CroplandPage() { - super( LandUseCategory.C ); + public WetlandPage() { + super( LandUseCategory.W ); } @Override @@ -28,12 +27,12 @@ public class CroplandPage extends SubdivisionPage { @Override protected Object[] getValues() { - return CroplandType.values(); + return ManagementType.values(); } @Override protected String getLabel() { - return Messages.getString("CroplandPage.0"); //$NON-NLS-1$ + return Messages.getString("WetlandPage.0"); //$NON-NLS-1$ } } From 3045a510a5c0d19d44c2ee7c681282238bd05215 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:37 +0100 Subject: [PATCH 0515/1620] New translations SettlementPage.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index b55115af7f..2fbf2f293f 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,17 +1,18 @@ package org.openforis.collect.earth.ipcc.view; import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.ManagementType; +import org.openforis.collect.earth.ipcc.model.SettlementType; import se.gustavkarlsson.gwiz.AbstractWizardPage; -public class WetlandPage extends SubdivisionPage { +public class SettlementPage extends SubdivisionPage { - private static final long serialVersionUID = 5385335458259411328L; - private AbstractWizardPage nextPage = new OtherlandPage(); + + private static final long serialVersionUID = 1548578357804057242L; + private AbstractWizardPage nextPage = new WetlandPage(); - public WetlandPage() { - super( LandUseCategory.W ); + public SettlementPage() { + super( LandUseCategory.S ); } @Override @@ -27,12 +28,12 @@ public class WetlandPage extends SubdivisionPage { @Override protected Object[] getValues() { - return ManagementType.values(); + return SettlementType.values(); } @Override protected String getLabel() { - return Messages.getString("WetlandPage.0"); //$NON-NLS-1$ + return Messages.getString("SettlementPage.0"); //$NON-NLS-1$ } } From 765a319946813702ea2884720b4192e7215d79d4 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:39 +0100 Subject: [PATCH 0516/1620] New translations SettlementPage.java (English) --- .../earth/app/view/Messages_en.properties | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 74424e2c9b..2fbf2f293f 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,18 +1,18 @@ package org.openforis.collect.earth.ipcc.view; -import org.openforis.collect.earth.ipcc.model.CroplandType; import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import org.openforis.collect.earth.ipcc.model.SettlementType; import se.gustavkarlsson.gwiz.AbstractWizardPage; -public class CroplandPage extends SubdivisionPage { +public class SettlementPage extends SubdivisionPage { - private static final long serialVersionUID = -8470656687978500741L; - private AbstractWizardPage nextPage = new GrasslandPage(); + private static final long serialVersionUID = 1548578357804057242L; + private AbstractWizardPage nextPage = new WetlandPage(); - public CroplandPage() { - super( LandUseCategory.C ); + public SettlementPage() { + super( LandUseCategory.S ); } @Override @@ -28,12 +28,12 @@ public class CroplandPage extends SubdivisionPage { @Override protected Object[] getValues() { - return CroplandType.values(); + return SettlementType.values(); } @Override protected String getLabel() { - return Messages.getString("CroplandPage.0"); //$NON-NLS-1$ + return Messages.getString("SettlementPage.0"); //$NON-NLS-1$ } } From 517a8f32900ed6f9cef6e7d4ee4b000095a82932 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:40 +0100 Subject: [PATCH 0517/1620] New translations SubdivisionPage.java (French) --- .../earth/app/view/Messages_fr.properties | 163 +++++++++++------- 1 file changed, 105 insertions(+), 58 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 63ae88c539..903c70789d 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,58 +1,105 @@ -package org.openforis.collect.earth.ipcc.view; - -import java.awt.FlowLayout; -import java.awt.Label; -import java.awt.TextField; -import java.awt.event.TextEvent; -import java.awt.event.TextListener; - -import se.gustavkarlsson.gwiz.AbstractWizardPage; - -@SuppressWarnings("serial") -public class EndPage extends AbstractWizardPage { - - private final TextField finishTextField = new TextField("no", 5); - - public EndPage() { - setLayout(new FlowLayout()); - - add(new Label("Do you want to finish? Type in your answer:")); - add(finishTextField); - - // Add a listener for updating the wizard buttons - finishTextField.addTextListener(new TextListener() { - @Override - public void textValueChanged(TextEvent e) { - updateWizardButtons(); - } - }); - } - - @Override - protected AbstractWizardPage getNextPage() { - return null; - } - - @Override - protected boolean isCancelAllowed() { - return true; - } - - @Override - protected boolean isPreviousAllowed() { - return true; - } - - @Override - protected boolean isNextAllowed() { - return false; - } - - @Override - protected - boolean isFinishAllowed() { - // Only allow finish if the user typed "yes" in the text field - return finishTextField.getText().trim().equalsIgnoreCase("yes"); - } - -} +package org.openforis.collect.earth.ipcc.view; + +import java.awt.Dimension; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.util.List; + +import javax.swing.JComboBox; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.border.BevelBorder; +import javax.swing.border.Border; +import javax.swing.border.TitledBorder; + +import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; +import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; + +import se.gustavkarlsson.gwiz.AbstractWizardPage; + +public abstract class SubdivisionPage extends AbstractWizardPage { + + public SubdivisionPage( LandUseCategory category) { + + List> subdivisionsInCategory = LandUseSubdivisionUtils.getSubdivisionsByCategory( category ); + + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + JPanel contentPane = new JPanel(new GridBagLayout()); + JScrollPane scrollPane = new JScrollPane(contentPane); + scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + scrollPane.setBounds(50, 30, 300, 50); + scrollPane.setPreferredSize(new Dimension(450, 350)); + + final Border border = new TitledBorder( + new BevelBorder(BevelBorder.LOWERED), + getLabel()); + setBorder(border); + + for (LandUseSubdivision subdiv : subdivisionsInCategory) { + + constraints.gridx = 0; + + JLabel labelCode = new JLabel( subdiv.getCode() ); + contentPane.add(labelCode, constraints); + + constraints.gridx = 1; + + JLabel labelName = new JLabel( subdiv.getName()); + contentPane.add(labelName, constraints); + + constraints.gridx = 2; + JComboBox mgmtType = new JComboBox(getValues()); + mgmtType.setSelectedItem( subdiv.getType() ); + contentPane.add(mgmtType, constraints); + mgmtType.addActionListener( e-> + LandUseSubdivisionUtils.setSubdivisionType( subdiv, mgmtType.getSelectedItem() ) + ); + + constraints.gridy++; + } + + this.add(scrollPane); + + + + } + + + protected abstract String getLabel(); + + + protected abstract Object[] getValues(); + + + @Override + protected boolean isCancelAllowed() { + return false; + } + + @Override + protected boolean isPreviousAllowed() { + return true; + } + + @Override + protected boolean isNextAllowed() { + return true; + } + + @Override + protected boolean isFinishAllowed() { + return false; + } + +} From 0e2560f43784e7d4fe641b9adbb6a2426d0b8e93 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:41 +0100 Subject: [PATCH 0518/1620] New translations SubdivisionPage.java (Spanish) --- .../earth/app/view/Messages_es.properties | 98 ++++++++++++++++--- 1 file changed, 82 insertions(+), 16 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 74424e2c9b..903c70789d 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,39 +1,105 @@ package org.openforis.collect.earth.ipcc.view; -import org.openforis.collect.earth.ipcc.model.CroplandType; +import java.awt.Dimension; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.util.List; + +import javax.swing.JComboBox; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.border.BevelBorder; +import javax.swing.border.Border; +import javax.swing.border.TitledBorder; + +import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; import se.gustavkarlsson.gwiz.AbstractWizardPage; -public class CroplandPage extends SubdivisionPage { +public abstract class SubdivisionPage extends AbstractWizardPage { + + public SubdivisionPage( LandUseCategory category) { + + List> subdivisionsInCategory = LandUseSubdivisionUtils.getSubdivisionsByCategory( category ); + + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + JPanel contentPane = new JPanel(new GridBagLayout()); + JScrollPane scrollPane = new JScrollPane(contentPane); + scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + scrollPane.setBounds(50, 30, 300, 50); + scrollPane.setPreferredSize(new Dimension(450, 350)); + + final Border border = new TitledBorder( + new BevelBorder(BevelBorder.LOWERED), + getLabel()); + setBorder(border); + for (LandUseSubdivision subdiv : subdivisionsInCategory) { + + constraints.gridx = 0; + + JLabel labelCode = new JLabel( subdiv.getCode() ); + contentPane.add(labelCode, constraints); + + constraints.gridx = 1; + + JLabel labelName = new JLabel( subdiv.getName()); + contentPane.add(labelName, constraints); - private static final long serialVersionUID = -8470656687978500741L; - private AbstractWizardPage nextPage = new GrasslandPage(); - - public CroplandPage() { - super( LandUseCategory.C ); - } + constraints.gridx = 2; + JComboBox mgmtType = new JComboBox(getValues()); + mgmtType.setSelectedItem( subdiv.getType() ); + contentPane.add(mgmtType, constraints); + mgmtType.addActionListener( e-> + LandUseSubdivisionUtils.setSubdivisionType( subdiv, mgmtType.getSelectedItem() ) + ); + + constraints.gridy++; + } + + this.add(scrollPane); + + - @Override - protected AbstractWizardPage getNextPage() { - return nextPage; } + protected abstract String getLabel(); + + + protected abstract Object[] getValues(); + + @Override - protected boolean isFinishAllowed() { + protected boolean isCancelAllowed() { return false; } @Override - protected Object[] getValues() { - return CroplandType.values(); + protected boolean isPreviousAllowed() { + return true; + } + + @Override + protected boolean isNextAllowed() { + return true; } @Override - protected String getLabel() { - return Messages.getString("CroplandPage.0"); //$NON-NLS-1$ + protected boolean isFinishAllowed() { + return false; } } From 12f21775382bddc8ec2e608e41d1fd2721b4675a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:42 +0100 Subject: [PATCH 0519/1620] New translations SubdivisionPage.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 98 ++++++++++++++++--- 1 file changed, 82 insertions(+), 16 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 2fbf2f293f..903c70789d 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,39 +1,105 @@ package org.openforis.collect.earth.ipcc.view; +import java.awt.Dimension; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.util.List; + +import javax.swing.JComboBox; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.border.BevelBorder; +import javax.swing.border.Border; +import javax.swing.border.TitledBorder; + +import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.SettlementType; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; import se.gustavkarlsson.gwiz.AbstractWizardPage; -public class SettlementPage extends SubdivisionPage { +public abstract class SubdivisionPage extends AbstractWizardPage { + + public SubdivisionPage( LandUseCategory category) { + + List> subdivisionsInCategory = LandUseSubdivisionUtils.getSubdivisionsByCategory( category ); + + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + JPanel contentPane = new JPanel(new GridBagLayout()); + JScrollPane scrollPane = new JScrollPane(contentPane); + scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + scrollPane.setBounds(50, 30, 300, 50); + scrollPane.setPreferredSize(new Dimension(450, 350)); + + final Border border = new TitledBorder( + new BevelBorder(BevelBorder.LOWERED), + getLabel()); + setBorder(border); + for (LandUseSubdivision subdiv : subdivisionsInCategory) { + + constraints.gridx = 0; + + JLabel labelCode = new JLabel( subdiv.getCode() ); + contentPane.add(labelCode, constraints); + + constraints.gridx = 1; + + JLabel labelName = new JLabel( subdiv.getName()); + contentPane.add(labelName, constraints); - private static final long serialVersionUID = 1548578357804057242L; - private AbstractWizardPage nextPage = new WetlandPage(); - - public SettlementPage() { - super( LandUseCategory.S ); - } + constraints.gridx = 2; + JComboBox mgmtType = new JComboBox(getValues()); + mgmtType.setSelectedItem( subdiv.getType() ); + contentPane.add(mgmtType, constraints); + mgmtType.addActionListener( e-> + LandUseSubdivisionUtils.setSubdivisionType( subdiv, mgmtType.getSelectedItem() ) + ); + + constraints.gridy++; + } + + this.add(scrollPane); + + - @Override - protected AbstractWizardPage getNextPage() { - return nextPage; } + protected abstract String getLabel(); + + + protected abstract Object[] getValues(); + + @Override - protected boolean isFinishAllowed() { + protected boolean isCancelAllowed() { return false; } @Override - protected Object[] getValues() { - return SettlementType.values(); + protected boolean isPreviousAllowed() { + return true; + } + + @Override + protected boolean isNextAllowed() { + return true; } @Override - protected String getLabel() { - return Messages.getString("SettlementPage.0"); //$NON-NLS-1$ + protected boolean isFinishAllowed() { + return false; } } From 8b786f0a9b0d01c29cb5fa36e882e30a21bed5a0 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:43 +0100 Subject: [PATCH 0520/1620] New translations SubdivisionPage.java (English) --- .../earth/app/view/Messages_en.properties | 98 ++++++++++++++++--- 1 file changed, 82 insertions(+), 16 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 2fbf2f293f..903c70789d 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,39 +1,105 @@ package org.openforis.collect.earth.ipcc.view; +import java.awt.Dimension; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.util.List; + +import javax.swing.JComboBox; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.border.BevelBorder; +import javax.swing.border.Border; +import javax.swing.border.TitledBorder; + +import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.SettlementType; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; import se.gustavkarlsson.gwiz.AbstractWizardPage; -public class SettlementPage extends SubdivisionPage { +public abstract class SubdivisionPage extends AbstractWizardPage { + + public SubdivisionPage( LandUseCategory category) { + + List> subdivisionsInCategory = LandUseSubdivisionUtils.getSubdivisionsByCategory( category ); + + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + JPanel contentPane = new JPanel(new GridBagLayout()); + JScrollPane scrollPane = new JScrollPane(contentPane); + scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + scrollPane.setBounds(50, 30, 300, 50); + scrollPane.setPreferredSize(new Dimension(450, 350)); + + final Border border = new TitledBorder( + new BevelBorder(BevelBorder.LOWERED), + getLabel()); + setBorder(border); + for (LandUseSubdivision subdiv : subdivisionsInCategory) { + + constraints.gridx = 0; + + JLabel labelCode = new JLabel( subdiv.getCode() ); + contentPane.add(labelCode, constraints); + + constraints.gridx = 1; + + JLabel labelName = new JLabel( subdiv.getName()); + contentPane.add(labelName, constraints); - private static final long serialVersionUID = 1548578357804057242L; - private AbstractWizardPage nextPage = new WetlandPage(); - - public SettlementPage() { - super( LandUseCategory.S ); - } + constraints.gridx = 2; + JComboBox mgmtType = new JComboBox(getValues()); + mgmtType.setSelectedItem( subdiv.getType() ); + contentPane.add(mgmtType, constraints); + mgmtType.addActionListener( e-> + LandUseSubdivisionUtils.setSubdivisionType( subdiv, mgmtType.getSelectedItem() ) + ); + + constraints.gridy++; + } + + this.add(scrollPane); + + - @Override - protected AbstractWizardPage getNextPage() { - return nextPage; } + protected abstract String getLabel(); + + + protected abstract Object[] getValues(); + + @Override - protected boolean isFinishAllowed() { + protected boolean isCancelAllowed() { return false; } @Override - protected Object[] getValues() { - return SettlementType.values(); + protected boolean isPreviousAllowed() { + return true; + } + + @Override + protected boolean isNextAllowed() { + return true; } @Override - protected String getLabel() { - return Messages.getString("SettlementPage.0"); //$NON-NLS-1$ + protected boolean isFinishAllowed() { + return false; } } From 0f619b62b3ecbe48d22ad4fea4b9ab0b9c62203c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:44 +0100 Subject: [PATCH 0521/1620] New translations WetlandPage.java (French) --- .../earth/app/view/Messages_fr.properties | 99 +++---------------- 1 file changed, 16 insertions(+), 83 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 903c70789d..b55115af7f 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,105 +1,38 @@ package org.openforis.collect.earth.ipcc.view; -import java.awt.Dimension; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.util.List; - -import javax.swing.JComboBox; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.border.BevelBorder; -import javax.swing.border.Border; -import javax.swing.border.TitledBorder; - -import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +import org.openforis.collect.earth.ipcc.model.ManagementType; import se.gustavkarlsson.gwiz.AbstractWizardPage; -public abstract class SubdivisionPage extends AbstractWizardPage { - - public SubdivisionPage( LandUseCategory category) { - - List> subdivisionsInCategory = LandUseSubdivisionUtils.getSubdivisionsByCategory( category ); - - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - JPanel contentPane = new JPanel(new GridBagLayout()); - JScrollPane scrollPane = new JScrollPane(contentPane); - scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - scrollPane.setBounds(50, 30, 300, 50); - scrollPane.setPreferredSize(new Dimension(450, 350)); - - final Border border = new TitledBorder( - new BevelBorder(BevelBorder.LOWERED), - getLabel()); - setBorder(border); - - for (LandUseSubdivision subdiv : subdivisionsInCategory) { - - constraints.gridx = 0; - - JLabel labelCode = new JLabel( subdiv.getCode() ); - contentPane.add(labelCode, constraints); - - constraints.gridx = 1; - - JLabel labelName = new JLabel( subdiv.getName()); - contentPane.add(labelName, constraints); - - constraints.gridx = 2; - JComboBox mgmtType = new JComboBox(getValues()); - mgmtType.setSelectedItem( subdiv.getType() ); - contentPane.add(mgmtType, constraints); - mgmtType.addActionListener( e-> - LandUseSubdivisionUtils.setSubdivisionType( subdiv, mgmtType.getSelectedItem() ) - ); - - constraints.gridy++; - } - - this.add(scrollPane); - - +public class WetlandPage extends SubdivisionPage { + private static final long serialVersionUID = 5385335458259411328L; + private AbstractWizardPage nextPage = new OtherlandPage(); + + public WetlandPage() { + super( LandUseCategory.W ); } - - protected abstract String getLabel(); - - - protected abstract Object[] getValues(); - - @Override - protected boolean isCancelAllowed() { - return false; + protected AbstractWizardPage getNextPage() { + return nextPage; } + @Override - protected boolean isPreviousAllowed() { - return true; + protected boolean isFinishAllowed() { + return false; } @Override - protected boolean isNextAllowed() { - return true; + protected Object[] getValues() { + return ManagementType.values(); } @Override - protected boolean isFinishAllowed() { - return false; + protected String getLabel() { + return Messages.getString("WetlandPage.0"); //$NON-NLS-1$ } } From f3db932576b478316d199975c14066c5e41daaed Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:45 +0100 Subject: [PATCH 0522/1620] New translations WetlandPage.java (Spanish) --- .../earth/app/view/Messages_es.properties | 99 +++---------------- 1 file changed, 16 insertions(+), 83 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 903c70789d..b55115af7f 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,105 +1,38 @@ package org.openforis.collect.earth.ipcc.view; -import java.awt.Dimension; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.util.List; - -import javax.swing.JComboBox; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.border.BevelBorder; -import javax.swing.border.Border; -import javax.swing.border.TitledBorder; - -import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +import org.openforis.collect.earth.ipcc.model.ManagementType; import se.gustavkarlsson.gwiz.AbstractWizardPage; -public abstract class SubdivisionPage extends AbstractWizardPage { - - public SubdivisionPage( LandUseCategory category) { - - List> subdivisionsInCategory = LandUseSubdivisionUtils.getSubdivisionsByCategory( category ); - - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - JPanel contentPane = new JPanel(new GridBagLayout()); - JScrollPane scrollPane = new JScrollPane(contentPane); - scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - scrollPane.setBounds(50, 30, 300, 50); - scrollPane.setPreferredSize(new Dimension(450, 350)); - - final Border border = new TitledBorder( - new BevelBorder(BevelBorder.LOWERED), - getLabel()); - setBorder(border); - - for (LandUseSubdivision subdiv : subdivisionsInCategory) { - - constraints.gridx = 0; - - JLabel labelCode = new JLabel( subdiv.getCode() ); - contentPane.add(labelCode, constraints); - - constraints.gridx = 1; - - JLabel labelName = new JLabel( subdiv.getName()); - contentPane.add(labelName, constraints); - - constraints.gridx = 2; - JComboBox mgmtType = new JComboBox(getValues()); - mgmtType.setSelectedItem( subdiv.getType() ); - contentPane.add(mgmtType, constraints); - mgmtType.addActionListener( e-> - LandUseSubdivisionUtils.setSubdivisionType( subdiv, mgmtType.getSelectedItem() ) - ); - - constraints.gridy++; - } - - this.add(scrollPane); - - +public class WetlandPage extends SubdivisionPage { + private static final long serialVersionUID = 5385335458259411328L; + private AbstractWizardPage nextPage = new OtherlandPage(); + + public WetlandPage() { + super( LandUseCategory.W ); } - - protected abstract String getLabel(); - - - protected abstract Object[] getValues(); - - @Override - protected boolean isCancelAllowed() { - return false; + protected AbstractWizardPage getNextPage() { + return nextPage; } + @Override - protected boolean isPreviousAllowed() { - return true; + protected boolean isFinishAllowed() { + return false; } @Override - protected boolean isNextAllowed() { - return true; + protected Object[] getValues() { + return ManagementType.values(); } @Override - protected boolean isFinishAllowed() { - return false; + protected String getLabel() { + return Messages.getString("WetlandPage.0"); //$NON-NLS-1$ } } From 90e43478f760054d9a9fc7acfe50ffd733dcb4d7 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:46 +0100 Subject: [PATCH 0523/1620] New translations messages.properties (Spanish) --- .../earth/app/view/Messages_es.properties | 49 +++++-------------- 1 file changed, 11 insertions(+), 38 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index b55115af7f..6e3b722ec9 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,38 +1,11 @@ -package org.openforis.collect.earth.ipcc.view; - -import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.ManagementType; - -import se.gustavkarlsson.gwiz.AbstractWizardPage; - -public class WetlandPage extends SubdivisionPage { - - private static final long serialVersionUID = 5385335458259411328L; - private AbstractWizardPage nextPage = new OtherlandPage(); - - public WetlandPage() { - super( LandUseCategory.W ); - } - - @Override - protected AbstractWizardPage getNextPage() { - return nextPage; - } - - - @Override - protected boolean isFinishAllowed() { - return false; - } - - @Override - protected Object[] getValues() { - return ManagementType.values(); - } - - @Override - protected String getLabel() { - return Messages.getString("WetlandPage.0"); //$NON-NLS-1$ - } - -} +CroplandPage.0=Cropland subdivisions / Management +ForestPage.0=Forest subdivisions / Management +GrasslandPage.0=Grassland subdivisions / Management +JDialogWizard.0=Cancel +JDialogWizard.1=Previous +JDialogWizard.2=Next +JDialogWizard.3=Finish +JDialogWizard.4=Wizard finished\! +OtherlandPage.0=Otherland subdivisions / tree presence +SettlementPage.0=Settlement subdivisions / tree presence +WetlandPage.0=Wetland subdivisions / tree presence From 46a1e899a2d530a4ae29394fdd16ae12ceecad5e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:48 +0100 Subject: [PATCH 0524/1620] New translations WetlandPage.java (English) --- .../earth/app/view/Messages_en.properties | 99 +++---------------- 1 file changed, 16 insertions(+), 83 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 903c70789d..b55115af7f 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,105 +1,38 @@ package org.openforis.collect.earth.ipcc.view; -import java.awt.Dimension; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.util.List; - -import javax.swing.JComboBox; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.border.BevelBorder; -import javax.swing.border.Border; -import javax.swing.border.TitledBorder; - -import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +import org.openforis.collect.earth.ipcc.model.ManagementType; import se.gustavkarlsson.gwiz.AbstractWizardPage; -public abstract class SubdivisionPage extends AbstractWizardPage { - - public SubdivisionPage( LandUseCategory category) { - - List> subdivisionsInCategory = LandUseSubdivisionUtils.getSubdivisionsByCategory( category ); - - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - JPanel contentPane = new JPanel(new GridBagLayout()); - JScrollPane scrollPane = new JScrollPane(contentPane); - scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - scrollPane.setBounds(50, 30, 300, 50); - scrollPane.setPreferredSize(new Dimension(450, 350)); - - final Border border = new TitledBorder( - new BevelBorder(BevelBorder.LOWERED), - getLabel()); - setBorder(border); - - for (LandUseSubdivision subdiv : subdivisionsInCategory) { - - constraints.gridx = 0; - - JLabel labelCode = new JLabel( subdiv.getCode() ); - contentPane.add(labelCode, constraints); - - constraints.gridx = 1; - - JLabel labelName = new JLabel( subdiv.getName()); - contentPane.add(labelName, constraints); - - constraints.gridx = 2; - JComboBox mgmtType = new JComboBox(getValues()); - mgmtType.setSelectedItem( subdiv.getType() ); - contentPane.add(mgmtType, constraints); - mgmtType.addActionListener( e-> - LandUseSubdivisionUtils.setSubdivisionType( subdiv, mgmtType.getSelectedItem() ) - ); - - constraints.gridy++; - } - - this.add(scrollPane); - - +public class WetlandPage extends SubdivisionPage { + private static final long serialVersionUID = 5385335458259411328L; + private AbstractWizardPage nextPage = new OtherlandPage(); + + public WetlandPage() { + super( LandUseCategory.W ); } - - protected abstract String getLabel(); - - - protected abstract Object[] getValues(); - - @Override - protected boolean isCancelAllowed() { - return false; + protected AbstractWizardPage getNextPage() { + return nextPage; } + @Override - protected boolean isPreviousAllowed() { - return true; + protected boolean isFinishAllowed() { + return false; } @Override - protected boolean isNextAllowed() { - return true; + protected Object[] getValues() { + return ManagementType.values(); } @Override - protected boolean isFinishAllowed() { - return false; + protected String getLabel() { + return Messages.getString("WetlandPage.0"); //$NON-NLS-1$ } } From 5fdfe856edc57468ee98600798c1ae39beba760f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:49 +0100 Subject: [PATCH 0525/1620] New translations messages.properties (French) --- .../earth/app/view/Messages_fr.properties | 49 +++++-------------- 1 file changed, 11 insertions(+), 38 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index b55115af7f..6e3b722ec9 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,38 +1,11 @@ -package org.openforis.collect.earth.ipcc.view; - -import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.ManagementType; - -import se.gustavkarlsson.gwiz.AbstractWizardPage; - -public class WetlandPage extends SubdivisionPage { - - private static final long serialVersionUID = 5385335458259411328L; - private AbstractWizardPage nextPage = new OtherlandPage(); - - public WetlandPage() { - super( LandUseCategory.W ); - } - - @Override - protected AbstractWizardPage getNextPage() { - return nextPage; - } - - - @Override - protected boolean isFinishAllowed() { - return false; - } - - @Override - protected Object[] getValues() { - return ManagementType.values(); - } - - @Override - protected String getLabel() { - return Messages.getString("WetlandPage.0"); //$NON-NLS-1$ - } - -} +CroplandPage.0=Cropland subdivisions / Management +ForestPage.0=Forest subdivisions / Management +GrasslandPage.0=Grassland subdivisions / Management +JDialogWizard.0=Cancel +JDialogWizard.1=Previous +JDialogWizard.2=Next +JDialogWizard.3=Finish +JDialogWizard.4=Wizard finished\! +OtherlandPage.0=Otherland subdivisions / tree presence +SettlementPage.0=Settlement subdivisions / tree presence +WetlandPage.0=Wetland subdivisions / tree presence From abb7c52b021f7f51716897910b7b2fb27227d8b5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:50 +0100 Subject: [PATCH 0526/1620] New translations SettlementPage.java (French) --- .../earth/app/view/Messages_fr.properties | 50 +++++++++++++++---- 1 file changed, 39 insertions(+), 11 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 6e3b722ec9..2fbf2f293f 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,11 +1,39 @@ -CroplandPage.0=Cropland subdivisions / Management -ForestPage.0=Forest subdivisions / Management -GrasslandPage.0=Grassland subdivisions / Management -JDialogWizard.0=Cancel -JDialogWizard.1=Previous -JDialogWizard.2=Next -JDialogWizard.3=Finish -JDialogWizard.4=Wizard finished\! -OtherlandPage.0=Otherland subdivisions / tree presence -SettlementPage.0=Settlement subdivisions / tree presence -WetlandPage.0=Wetland subdivisions / tree presence +package org.openforis.collect.earth.ipcc.view; + +import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import org.openforis.collect.earth.ipcc.model.SettlementType; + +import se.gustavkarlsson.gwiz.AbstractWizardPage; + +public class SettlementPage extends SubdivisionPage { + + + private static final long serialVersionUID = 1548578357804057242L; + private AbstractWizardPage nextPage = new WetlandPage(); + + public SettlementPage() { + super( LandUseCategory.S ); + } + + @Override + protected AbstractWizardPage getNextPage() { + return nextPage; + } + + + @Override + protected boolean isFinishAllowed() { + return false; + } + + @Override + protected Object[] getValues() { + return SettlementType.values(); + } + + @Override + protected String getLabel() { + return Messages.getString("SettlementPage.0"); //$NON-NLS-1$ + } + +} From 43a446a41b5da657fd677a273dea173daf402d5d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:51 +0100 Subject: [PATCH 0527/1620] New translations messages.properties (Portuguese) --- .../earth/app/view/Messages_pt.properties | 116 ++---------------- 1 file changed, 11 insertions(+), 105 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 903c70789d..6e3b722ec9 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,105 +1,11 @@ -package org.openforis.collect.earth.ipcc.view; - -import java.awt.Dimension; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.util.List; - -import javax.swing.JComboBox; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.border.BevelBorder; -import javax.swing.border.Border; -import javax.swing.border.TitledBorder; - -import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; -import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; - -import se.gustavkarlsson.gwiz.AbstractWizardPage; - -public abstract class SubdivisionPage extends AbstractWizardPage { - - public SubdivisionPage( LandUseCategory category) { - - List> subdivisionsInCategory = LandUseSubdivisionUtils.getSubdivisionsByCategory( category ); - - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - JPanel contentPane = new JPanel(new GridBagLayout()); - JScrollPane scrollPane = new JScrollPane(contentPane); - scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - scrollPane.setBounds(50, 30, 300, 50); - scrollPane.setPreferredSize(new Dimension(450, 350)); - - final Border border = new TitledBorder( - new BevelBorder(BevelBorder.LOWERED), - getLabel()); - setBorder(border); - - for (LandUseSubdivision subdiv : subdivisionsInCategory) { - - constraints.gridx = 0; - - JLabel labelCode = new JLabel( subdiv.getCode() ); - contentPane.add(labelCode, constraints); - - constraints.gridx = 1; - - JLabel labelName = new JLabel( subdiv.getName()); - contentPane.add(labelName, constraints); - - constraints.gridx = 2; - JComboBox mgmtType = new JComboBox(getValues()); - mgmtType.setSelectedItem( subdiv.getType() ); - contentPane.add(mgmtType, constraints); - mgmtType.addActionListener( e-> - LandUseSubdivisionUtils.setSubdivisionType( subdiv, mgmtType.getSelectedItem() ) - ); - - constraints.gridy++; - } - - this.add(scrollPane); - - - - } - - - protected abstract String getLabel(); - - - protected abstract Object[] getValues(); - - - @Override - protected boolean isCancelAllowed() { - return false; - } - - @Override - protected boolean isPreviousAllowed() { - return true; - } - - @Override - protected boolean isNextAllowed() { - return true; - } - - @Override - protected boolean isFinishAllowed() { - return false; - } - -} +CroplandPage.0=Cropland subdivisions / Management +ForestPage.0=Forest subdivisions / Management +GrasslandPage.0=Grassland subdivisions / Management +JDialogWizard.0=Cancel +JDialogWizard.1=Previous +JDialogWizard.2=Next +JDialogWizard.3=Finish +JDialogWizard.4=Wizard finished\! +OtherlandPage.0=Otherland subdivisions / tree presence +SettlementPage.0=Settlement subdivisions / tree presence +WetlandPage.0=Wetland subdivisions / tree presence From 33c955fc95ab9fcbf5020a0c6a6bb7da73f9d20e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:52 +0100 Subject: [PATCH 0528/1620] New translations messages.properties (English) --- .../earth/app/view/Messages_en.properties | 49 +++++-------------- 1 file changed, 11 insertions(+), 38 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index b55115af7f..6e3b722ec9 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,38 +1,11 @@ -package org.openforis.collect.earth.ipcc.view; - -import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.ManagementType; - -import se.gustavkarlsson.gwiz.AbstractWizardPage; - -public class WetlandPage extends SubdivisionPage { - - private static final long serialVersionUID = 5385335458259411328L; - private AbstractWizardPage nextPage = new OtherlandPage(); - - public WetlandPage() { - super( LandUseCategory.W ); - } - - @Override - protected AbstractWizardPage getNextPage() { - return nextPage; - } - - - @Override - protected boolean isFinishAllowed() { - return false; - } - - @Override - protected Object[] getValues() { - return ManagementType.values(); - } - - @Override - protected String getLabel() { - return Messages.getString("WetlandPage.0"); //$NON-NLS-1$ - } - -} +CroplandPage.0=Cropland subdivisions / Management +ForestPage.0=Forest subdivisions / Management +GrasslandPage.0=Grassland subdivisions / Management +JDialogWizard.0=Cancel +JDialogWizard.1=Previous +JDialogWizard.2=Next +JDialogWizard.3=Finish +JDialogWizard.4=Wizard finished\! +OtherlandPage.0=Otherland subdivisions / tree presence +SettlementPage.0=Settlement subdivisions / tree presence +WetlandPage.0=Wetland subdivisions / tree presence From 2e3d789ea42b5effd191d44a41dfc0ddf136b881 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:53 +0100 Subject: [PATCH 0529/1620] New translations DatePlanet.java (French) --- .../earth/app/view/Messages_fr.properties | 59 +++++++------------ 1 file changed, 20 insertions(+), 39 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 2fbf2f293f..9a41e4b725 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,39 +1,20 @@ -package org.openforis.collect.earth.ipcc.view; - -import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.SettlementType; - -import se.gustavkarlsson.gwiz.AbstractWizardPage; - -public class SettlementPage extends SubdivisionPage { - - - private static final long serialVersionUID = 1548578357804057242L; - private AbstractWizardPage nextPage = new WetlandPage(); - - public SettlementPage() { - super( LandUseCategory.S ); - } - - @Override - protected AbstractWizardPage getNextPage() { - return nextPage; - } - - - @Override - protected boolean isFinishAllowed() { - return false; - } - - @Override - protected Object[] getValues() { - return SettlementType.values(); - } - - @Override - protected String getLabel() { - return Messages.getString("SettlementPage.0"); //$NON-NLS-1$ - } - -} +package org.openforis.collect.earth.planet; + +import java.text.SimpleDateFormat; +import java.util.Date; + +public class DatePlanet extends Date { + private static final long serialVersionUID = 1L; + private static final String DATE_FORMAT = "yyyy-MM-ddTHH:mm:ss.SSSZ"; + + public DatePlanet(Date date) { + super(date.getTime()); + } + + @Override + public String toString() { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATE_FORMAT); + return simpleDateFormat.format(this); + } + +} From 86accae96031ca8413484486860f2f78f0509526 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:54 +0100 Subject: [PATCH 0530/1620] New translations DatePlanet.java (Spanish) --- .../earth/app/view/Messages_es.properties | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 6e3b722ec9..9a41e4b725 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,11 +1,20 @@ -CroplandPage.0=Cropland subdivisions / Management -ForestPage.0=Forest subdivisions / Management -GrasslandPage.0=Grassland subdivisions / Management -JDialogWizard.0=Cancel -JDialogWizard.1=Previous -JDialogWizard.2=Next -JDialogWizard.3=Finish -JDialogWizard.4=Wizard finished\! -OtherlandPage.0=Otherland subdivisions / tree presence -SettlementPage.0=Settlement subdivisions / tree presence -WetlandPage.0=Wetland subdivisions / tree presence +package org.openforis.collect.earth.planet; + +import java.text.SimpleDateFormat; +import java.util.Date; + +public class DatePlanet extends Date { + private static final long serialVersionUID = 1L; + private static final String DATE_FORMAT = "yyyy-MM-ddTHH:mm:ss.SSSZ"; + + public DatePlanet(Date date) { + super(date.getTime()); + } + + @Override + public String toString() { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATE_FORMAT); + return simpleDateFormat.format(this); + } + +} From d717d894021fd22a4a7614bfec48a63a1a288f4d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:55 +0100 Subject: [PATCH 0531/1620] New translations DatePlanet.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 6e3b722ec9..9a41e4b725 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,11 +1,20 @@ -CroplandPage.0=Cropland subdivisions / Management -ForestPage.0=Forest subdivisions / Management -GrasslandPage.0=Grassland subdivisions / Management -JDialogWizard.0=Cancel -JDialogWizard.1=Previous -JDialogWizard.2=Next -JDialogWizard.3=Finish -JDialogWizard.4=Wizard finished\! -OtherlandPage.0=Otherland subdivisions / tree presence -SettlementPage.0=Settlement subdivisions / tree presence -WetlandPage.0=Wetland subdivisions / tree presence +package org.openforis.collect.earth.planet; + +import java.text.SimpleDateFormat; +import java.util.Date; + +public class DatePlanet extends Date { + private static final long serialVersionUID = 1L; + private static final String DATE_FORMAT = "yyyy-MM-ddTHH:mm:ss.SSSZ"; + + public DatePlanet(Date date) { + super(date.getTime()); + } + + @Override + public String toString() { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATE_FORMAT); + return simpleDateFormat.format(this); + } + +} From 0b70a119ab27349017ceb0fa08f369d7b77b4f1c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:56 +0100 Subject: [PATCH 0532/1620] New translations DatePlanet.java (English) --- .../earth/app/view/Messages_en.properties | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 6e3b722ec9..9a41e4b725 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,11 +1,20 @@ -CroplandPage.0=Cropland subdivisions / Management -ForestPage.0=Forest subdivisions / Management -GrasslandPage.0=Grassland subdivisions / Management -JDialogWizard.0=Cancel -JDialogWizard.1=Previous -JDialogWizard.2=Next -JDialogWizard.3=Finish -JDialogWizard.4=Wizard finished\! -OtherlandPage.0=Otherland subdivisions / tree presence -SettlementPage.0=Settlement subdivisions / tree presence -WetlandPage.0=Wetland subdivisions / tree presence +package org.openforis.collect.earth.planet; + +import java.text.SimpleDateFormat; +import java.util.Date; + +public class DatePlanet extends Date { + private static final long serialVersionUID = 1L; + private static final String DATE_FORMAT = "yyyy-MM-ddTHH:mm:ss.SSSZ"; + + public DatePlanet(Date date) { + super(date.getTime()); + } + + @Override + public String toString() { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATE_FORMAT); + return simpleDateFormat.format(this); + } + +} From b261fc1e702cdb467d6bf7a556a7191e90e58892 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:57 +0100 Subject: [PATCH 0533/1620] New translations DateUtils.java (French) --- .../earth/app/view/Messages_fr.properties | 40 +++++++++++-------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 9a41e4b725..300057dbb3 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,20 +1,26 @@ package org.openforis.collect.earth.planet; -import java.text.SimpleDateFormat; +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; import java.util.Date; - -public class DatePlanet extends Date { - private static final long serialVersionUID = 1L; - private static final String DATE_FORMAT = "yyyy-MM-ddTHH:mm:ss.SSSZ"; - - public DatePlanet(Date date) { - super(date.getTime()); - } - - @Override - public String toString() { - SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATE_FORMAT); - return simpleDateFormat.format(this); - } - -} + +public class DateUtils { + + public static Date asDate(LocalDate localDate) { + return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant()); + } + + public static Date asDate(LocalDateTime localDateTime) { + return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()); + } + + public static LocalDate asLocalDate(Date date) { + return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate(); + } + + public static LocalDateTime asLocalDateTime(Date date) { + return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime(); + } +} \ No newline at end of file From adc4a6d56d737df6d284b6c0e3462d3a82771792 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:58 +0100 Subject: [PATCH 0534/1620] New translations SettlementPage.java (Spanish) --- .../earth/app/view/Messages_es.properties | 59 ++++++++++++------- 1 file changed, 39 insertions(+), 20 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 9a41e4b725..2fbf2f293f 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,20 +1,39 @@ -package org.openforis.collect.earth.planet; - -import java.text.SimpleDateFormat; -import java.util.Date; - -public class DatePlanet extends Date { - private static final long serialVersionUID = 1L; - private static final String DATE_FORMAT = "yyyy-MM-ddTHH:mm:ss.SSSZ"; - - public DatePlanet(Date date) { - super(date.getTime()); - } - - @Override - public String toString() { - SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATE_FORMAT); - return simpleDateFormat.format(this); - } - -} +package org.openforis.collect.earth.ipcc.view; + +import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import org.openforis.collect.earth.ipcc.model.SettlementType; + +import se.gustavkarlsson.gwiz.AbstractWizardPage; + +public class SettlementPage extends SubdivisionPage { + + + private static final long serialVersionUID = 1548578357804057242L; + private AbstractWizardPage nextPage = new WetlandPage(); + + public SettlementPage() { + super( LandUseCategory.S ); + } + + @Override + protected AbstractWizardPage getNextPage() { + return nextPage; + } + + + @Override + protected boolean isFinishAllowed() { + return false; + } + + @Override + protected Object[] getValues() { + return SettlementType.values(); + } + + @Override + protected String getLabel() { + return Messages.getString("SettlementPage.0"); //$NON-NLS-1$ + } + +} From 293165fe88809d788c2534c13ac72f6cc57fb9b4 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:30:59 +0100 Subject: [PATCH 0535/1620] New translations OtherlandPage.java (Spanish) --- .../earth/app/view/Messages_es.properties | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 2fbf2f293f..005a6f2fdd 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,39 +1,38 @@ package org.openforis.collect.earth.ipcc.view; import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.SettlementType; +import org.openforis.collect.earth.ipcc.model.ManagementType; import se.gustavkarlsson.gwiz.AbstractWizardPage; -public class SettlementPage extends SubdivisionPage { +public class OtherlandPage extends SubdivisionPage { - - private static final long serialVersionUID = 1548578357804057242L; - private AbstractWizardPage nextPage = new WetlandPage(); + private static final long serialVersionUID = -7092466238152990994L; + //private AbstractWizardPage nextPage; - public SettlementPage() { - super( LandUseCategory.S ); + public OtherlandPage() { + super( LandUseCategory.O ); } @Override protected AbstractWizardPage getNextPage() { - return nextPage; + return null; } @Override protected boolean isFinishAllowed() { - return false; + return true; } @Override protected Object[] getValues() { - return SettlementType.values(); + return ManagementType.values(); } @Override protected String getLabel() { - return Messages.getString("SettlementPage.0"); //$NON-NLS-1$ + return Messages.getString("OtherlandPage.0"); //$NON-NLS-1$ } } From 00bb6b8c2d9b1fbaffe873821cfa9c56dc1d16a0 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:00 +0100 Subject: [PATCH 0536/1620] New translations OtherlandPage.java (English) --- .../earth/app/view/Messages_en.properties | 58 ++++++++++++------- 1 file changed, 38 insertions(+), 20 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 9a41e4b725..005a6f2fdd 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,20 +1,38 @@ -package org.openforis.collect.earth.planet; - -import java.text.SimpleDateFormat; -import java.util.Date; - -public class DatePlanet extends Date { - private static final long serialVersionUID = 1L; - private static final String DATE_FORMAT = "yyyy-MM-ddTHH:mm:ss.SSSZ"; - - public DatePlanet(Date date) { - super(date.getTime()); - } - - @Override - public String toString() { - SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATE_FORMAT); - return simpleDateFormat.format(this); - } - -} +package org.openforis.collect.earth.ipcc.view; + +import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import org.openforis.collect.earth.ipcc.model.ManagementType; + +import se.gustavkarlsson.gwiz.AbstractWizardPage; + +public class OtherlandPage extends SubdivisionPage { + + private static final long serialVersionUID = -7092466238152990994L; + //private AbstractWizardPage nextPage; + + public OtherlandPage() { + super( LandUseCategory.O ); + } + + @Override + protected AbstractWizardPage getNextPage() { + return null; + } + + + @Override + protected boolean isFinishAllowed() { + return true; + } + + @Override + protected Object[] getValues() { + return ManagementType.values(); + } + + @Override + protected String getLabel() { + return Messages.getString("OtherlandPage.0"); //$NON-NLS-1$ + } + +} From a5087fc7f1162ab21f7331fadb16847c0b6fe661 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:01 +0100 Subject: [PATCH 0537/1620] New translations GrasslandPage.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 59 ++++++++++++------- 1 file changed, 39 insertions(+), 20 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 9a41e4b725..3b8a2af7e3 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,20 +1,39 @@ -package org.openforis.collect.earth.planet; - -import java.text.SimpleDateFormat; -import java.util.Date; - -public class DatePlanet extends Date { - private static final long serialVersionUID = 1L; - private static final String DATE_FORMAT = "yyyy-MM-ddTHH:mm:ss.SSSZ"; - - public DatePlanet(Date date) { - super(date.getTime()); - } - - @Override - public String toString() { - SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATE_FORMAT); - return simpleDateFormat.format(this); - } - -} +package org.openforis.collect.earth.ipcc.view; + +import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import org.openforis.collect.earth.ipcc.model.ManagementType; + +import se.gustavkarlsson.gwiz.AbstractWizardPage; + +public class GrasslandPage extends SubdivisionPage { + + + private static final long serialVersionUID = -2022500980698210420L; + private AbstractWizardPage nextPage = new SettlementPage(); + + public GrasslandPage() { + super( LandUseCategory.G ); + } + + @Override + protected AbstractWizardPage getNextPage() { + return nextPage; + } + + + @Override + protected boolean isFinishAllowed() { + return false; + } + + @Override + protected Object[] getValues() { + return ManagementType.values(); + } + + @Override + protected String getLabel() { + return Messages.getString("GrasslandPage.0"); //$NON-NLS-1$ + } + +} From 9c675986be812aa2f01e61d65197e759790bcf9a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:02 +0100 Subject: [PATCH 0538/1620] New translations EndPage.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 97 +++++++++++-------- 1 file changed, 58 insertions(+), 39 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 3b8a2af7e3..63ae88c539 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,39 +1,58 @@ -package org.openforis.collect.earth.ipcc.view; - -import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.ManagementType; - -import se.gustavkarlsson.gwiz.AbstractWizardPage; - -public class GrasslandPage extends SubdivisionPage { - - - private static final long serialVersionUID = -2022500980698210420L; - private AbstractWizardPage nextPage = new SettlementPage(); - - public GrasslandPage() { - super( LandUseCategory.G ); - } - - @Override - protected AbstractWizardPage getNextPage() { - return nextPage; - } - - - @Override - protected boolean isFinishAllowed() { - return false; - } - - @Override - protected Object[] getValues() { - return ManagementType.values(); - } - - @Override - protected String getLabel() { - return Messages.getString("GrasslandPage.0"); //$NON-NLS-1$ - } - -} +package org.openforis.collect.earth.ipcc.view; + +import java.awt.FlowLayout; +import java.awt.Label; +import java.awt.TextField; +import java.awt.event.TextEvent; +import java.awt.event.TextListener; + +import se.gustavkarlsson.gwiz.AbstractWizardPage; + +@SuppressWarnings("serial") +public class EndPage extends AbstractWizardPage { + + private final TextField finishTextField = new TextField("no", 5); + + public EndPage() { + setLayout(new FlowLayout()); + + add(new Label("Do you want to finish? Type in your answer:")); + add(finishTextField); + + // Add a listener for updating the wizard buttons + finishTextField.addTextListener(new TextListener() { + @Override + public void textValueChanged(TextEvent e) { + updateWizardButtons(); + } + }); + } + + @Override + protected AbstractWizardPage getNextPage() { + return null; + } + + @Override + protected boolean isCancelAllowed() { + return true; + } + + @Override + protected boolean isPreviousAllowed() { + return true; + } + + @Override + protected boolean isNextAllowed() { + return false; + } + + @Override + protected + boolean isFinishAllowed() { + // Only allow finish if the user typed "yes" in the text field + return finishTextField.getText().trim().equalsIgnoreCase("yes"); + } + +} From ab497cd43d71c4bd37c188bd57644e681fc892de Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:03 +0100 Subject: [PATCH 0539/1620] New translations EndPage.java (English) --- .../earth/app/view/Messages_en.properties | 96 +++++++++++-------- 1 file changed, 58 insertions(+), 38 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 005a6f2fdd..63ae88c539 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,38 +1,58 @@ -package org.openforis.collect.earth.ipcc.view; - -import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.ManagementType; - -import se.gustavkarlsson.gwiz.AbstractWizardPage; - -public class OtherlandPage extends SubdivisionPage { - - private static final long serialVersionUID = -7092466238152990994L; - //private AbstractWizardPage nextPage; - - public OtherlandPage() { - super( LandUseCategory.O ); - } - - @Override - protected AbstractWizardPage getNextPage() { - return null; - } - - - @Override - protected boolean isFinishAllowed() { - return true; - } - - @Override - protected Object[] getValues() { - return ManagementType.values(); - } - - @Override - protected String getLabel() { - return Messages.getString("OtherlandPage.0"); //$NON-NLS-1$ - } - -} +package org.openforis.collect.earth.ipcc.view; + +import java.awt.FlowLayout; +import java.awt.Label; +import java.awt.TextField; +import java.awt.event.TextEvent; +import java.awt.event.TextListener; + +import se.gustavkarlsson.gwiz.AbstractWizardPage; + +@SuppressWarnings("serial") +public class EndPage extends AbstractWizardPage { + + private final TextField finishTextField = new TextField("no", 5); + + public EndPage() { + setLayout(new FlowLayout()); + + add(new Label("Do you want to finish? Type in your answer:")); + add(finishTextField); + + // Add a listener for updating the wizard buttons + finishTextField.addTextListener(new TextListener() { + @Override + public void textValueChanged(TextEvent e) { + updateWizardButtons(); + } + }); + } + + @Override + protected AbstractWizardPage getNextPage() { + return null; + } + + @Override + protected boolean isCancelAllowed() { + return true; + } + + @Override + protected boolean isPreviousAllowed() { + return true; + } + + @Override + protected boolean isNextAllowed() { + return false; + } + + @Override + protected + boolean isFinishAllowed() { + // Only allow finish if the user typed "yes" in the text field + return finishTextField.getText().trim().equalsIgnoreCase("yes"); + } + +} From 0f1713132de8de53d289c4489ca9d95eb42d3d60 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:04 +0100 Subject: [PATCH 0540/1620] New translations ForestPage.java (French) --- .../earth/app/view/Messages_fr.properties | 64 +++++++++++-------- 1 file changed, 38 insertions(+), 26 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 300057dbb3..0110c75fd0 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,26 +1,38 @@ -package org.openforis.collect.earth.planet; - -import java.time.Instant; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.util.Date; - -public class DateUtils { - - public static Date asDate(LocalDate localDate) { - return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant()); - } - - public static Date asDate(LocalDateTime localDateTime) { - return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()); - } - - public static LocalDate asLocalDate(Date date) { - return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate(); - } - - public static LocalDateTime asLocalDateTime(Date date) { - return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime(); - } -} \ No newline at end of file +package org.openforis.collect.earth.ipcc.view; + +import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import org.openforis.collect.earth.ipcc.model.ManagementType; + +import se.gustavkarlsson.gwiz.AbstractWizardPage; + +public class ForestPage extends SubdivisionPage { + + private static final long serialVersionUID = -1544068125437624279L; + private AbstractWizardPage nextPage = new CroplandPage(); + + public ForestPage() { + super( LandUseCategory.F ); + } + + @Override + protected AbstractWizardPage getNextPage() { + return nextPage; + } + + + @Override + protected boolean isFinishAllowed() { + return false; + } + + @Override + protected Object[] getValues() { + return ManagementType.values(); + } + + @Override + protected String getLabel() { + return Messages.getString("ForestPage.0"); //$NON-NLS-1$ + } + +} From 5c2e516a08eefcad46c5111bf12b3df3e59514de Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:05 +0100 Subject: [PATCH 0541/1620] New translations ForestPage.java (Spanish) --- .../earth/app/view/Messages_es.properties | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 005a6f2fdd..0110c75fd0 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -5,24 +5,24 @@ import org.openforis.collect.earth.ipcc.model.ManagementType; import se.gustavkarlsson.gwiz.AbstractWizardPage; -public class OtherlandPage extends SubdivisionPage { +public class ForestPage extends SubdivisionPage { - private static final long serialVersionUID = -7092466238152990994L; - //private AbstractWizardPage nextPage; + private static final long serialVersionUID = -1544068125437624279L; + private AbstractWizardPage nextPage = new CroplandPage(); - public OtherlandPage() { - super( LandUseCategory.O ); + public ForestPage() { + super( LandUseCategory.F ); } @Override protected AbstractWizardPage getNextPage() { - return null; + return nextPage; } @Override protected boolean isFinishAllowed() { - return true; + return false; } @Override @@ -32,7 +32,7 @@ public class OtherlandPage extends SubdivisionPage { @Override protected String getLabel() { - return Messages.getString("OtherlandPage.0"); //$NON-NLS-1$ + return Messages.getString("ForestPage.0"); //$NON-NLS-1$ } } From 3053040c26e9ae501550bf5f89e30d88277cb6ef Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:06 +0100 Subject: [PATCH 0542/1620] New translations ForestPage.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 96 ++++++++----------- 1 file changed, 38 insertions(+), 58 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 63ae88c539..0110c75fd0 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,58 +1,38 @@ -package org.openforis.collect.earth.ipcc.view; - -import java.awt.FlowLayout; -import java.awt.Label; -import java.awt.TextField; -import java.awt.event.TextEvent; -import java.awt.event.TextListener; - -import se.gustavkarlsson.gwiz.AbstractWizardPage; - -@SuppressWarnings("serial") -public class EndPage extends AbstractWizardPage { - - private final TextField finishTextField = new TextField("no", 5); - - public EndPage() { - setLayout(new FlowLayout()); - - add(new Label("Do you want to finish? Type in your answer:")); - add(finishTextField); - - // Add a listener for updating the wizard buttons - finishTextField.addTextListener(new TextListener() { - @Override - public void textValueChanged(TextEvent e) { - updateWizardButtons(); - } - }); - } - - @Override - protected AbstractWizardPage getNextPage() { - return null; - } - - @Override - protected boolean isCancelAllowed() { - return true; - } - - @Override - protected boolean isPreviousAllowed() { - return true; - } - - @Override - protected boolean isNextAllowed() { - return false; - } - - @Override - protected - boolean isFinishAllowed() { - // Only allow finish if the user typed "yes" in the text field - return finishTextField.getText().trim().equalsIgnoreCase("yes"); - } - -} +package org.openforis.collect.earth.ipcc.view; + +import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import org.openforis.collect.earth.ipcc.model.ManagementType; + +import se.gustavkarlsson.gwiz.AbstractWizardPage; + +public class ForestPage extends SubdivisionPage { + + private static final long serialVersionUID = -1544068125437624279L; + private AbstractWizardPage nextPage = new CroplandPage(); + + public ForestPage() { + super( LandUseCategory.F ); + } + + @Override + protected AbstractWizardPage getNextPage() { + return nextPage; + } + + + @Override + protected boolean isFinishAllowed() { + return false; + } + + @Override + protected Object[] getValues() { + return ManagementType.values(); + } + + @Override + protected String getLabel() { + return Messages.getString("ForestPage.0"); //$NON-NLS-1$ + } + +} From 9ccd7f37a6a14f403ff8e0940a9fdb85cf2b7938 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:07 +0100 Subject: [PATCH 0543/1620] New translations ForestPage.java (English) --- .../earth/app/view/Messages_en.properties | 96 ++++++++----------- 1 file changed, 38 insertions(+), 58 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 63ae88c539..0110c75fd0 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,58 +1,38 @@ -package org.openforis.collect.earth.ipcc.view; - -import java.awt.FlowLayout; -import java.awt.Label; -import java.awt.TextField; -import java.awt.event.TextEvent; -import java.awt.event.TextListener; - -import se.gustavkarlsson.gwiz.AbstractWizardPage; - -@SuppressWarnings("serial") -public class EndPage extends AbstractWizardPage { - - private final TextField finishTextField = new TextField("no", 5); - - public EndPage() { - setLayout(new FlowLayout()); - - add(new Label("Do you want to finish? Type in your answer:")); - add(finishTextField); - - // Add a listener for updating the wizard buttons - finishTextField.addTextListener(new TextListener() { - @Override - public void textValueChanged(TextEvent e) { - updateWizardButtons(); - } - }); - } - - @Override - protected AbstractWizardPage getNextPage() { - return null; - } - - @Override - protected boolean isCancelAllowed() { - return true; - } - - @Override - protected boolean isPreviousAllowed() { - return true; - } - - @Override - protected boolean isNextAllowed() { - return false; - } - - @Override - protected - boolean isFinishAllowed() { - // Only allow finish if the user typed "yes" in the text field - return finishTextField.getText().trim().equalsIgnoreCase("yes"); - } - -} +package org.openforis.collect.earth.ipcc.view; + +import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import org.openforis.collect.earth.ipcc.model.ManagementType; + +import se.gustavkarlsson.gwiz.AbstractWizardPage; + +public class ForestPage extends SubdivisionPage { + + private static final long serialVersionUID = -1544068125437624279L; + private AbstractWizardPage nextPage = new CroplandPage(); + + public ForestPage() { + super( LandUseCategory.F ); + } + + @Override + protected AbstractWizardPage getNextPage() { + return nextPage; + } + + + @Override + protected boolean isFinishAllowed() { + return false; + } + + @Override + protected Object[] getValues() { + return ManagementType.values(); + } + + @Override + protected String getLabel() { + return Messages.getString("ForestPage.0"); //$NON-NLS-1$ + } + +} From 6bca0225cd9da8eaf3c38947da395be602e85508 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:08 +0100 Subject: [PATCH 0544/1620] New translations GrasslandPage.java (French) --- .../collect/earth/app/view/Messages_fr.properties | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 0110c75fd0..3b8a2af7e3 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -5,13 +5,14 @@ import org.openforis.collect.earth.ipcc.model.ManagementType; import se.gustavkarlsson.gwiz.AbstractWizardPage; -public class ForestPage extends SubdivisionPage { +public class GrasslandPage extends SubdivisionPage { - private static final long serialVersionUID = -1544068125437624279L; - private AbstractWizardPage nextPage = new CroplandPage(); + + private static final long serialVersionUID = -2022500980698210420L; + private AbstractWizardPage nextPage = new SettlementPage(); - public ForestPage() { - super( LandUseCategory.F ); + public GrasslandPage() { + super( LandUseCategory.G ); } @Override @@ -32,7 +33,7 @@ public class ForestPage extends SubdivisionPage { @Override protected String getLabel() { - return Messages.getString("ForestPage.0"); //$NON-NLS-1$ + return Messages.getString("GrasslandPage.0"); //$NON-NLS-1$ } } From 7863fc50beba61ffa393f356eab42ddcec828a49 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:09 +0100 Subject: [PATCH 0545/1620] New translations GrasslandPage.java (Spanish) --- .../collect/earth/app/view/Messages_es.properties | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 0110c75fd0..3b8a2af7e3 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -5,13 +5,14 @@ import org.openforis.collect.earth.ipcc.model.ManagementType; import se.gustavkarlsson.gwiz.AbstractWizardPage; -public class ForestPage extends SubdivisionPage { +public class GrasslandPage extends SubdivisionPage { - private static final long serialVersionUID = -1544068125437624279L; - private AbstractWizardPage nextPage = new CroplandPage(); + + private static final long serialVersionUID = -2022500980698210420L; + private AbstractWizardPage nextPage = new SettlementPage(); - public ForestPage() { - super( LandUseCategory.F ); + public GrasslandPage() { + super( LandUseCategory.G ); } @Override @@ -32,7 +33,7 @@ public class ForestPage extends SubdivisionPage { @Override protected String getLabel() { - return Messages.getString("ForestPage.0"); //$NON-NLS-1$ + return Messages.getString("GrasslandPage.0"); //$NON-NLS-1$ } } From 9fd1b7c6e7895af2cf4c089de0bece15a2b5c6c9 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:10 +0100 Subject: [PATCH 0546/1620] New translations GrasslandPage.java (English) --- .../collect/earth/app/view/Messages_en.properties | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 0110c75fd0..3b8a2af7e3 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -5,13 +5,14 @@ import org.openforis.collect.earth.ipcc.model.ManagementType; import se.gustavkarlsson.gwiz.AbstractWizardPage; -public class ForestPage extends SubdivisionPage { +public class GrasslandPage extends SubdivisionPage { - private static final long serialVersionUID = -1544068125437624279L; - private AbstractWizardPage nextPage = new CroplandPage(); + + private static final long serialVersionUID = -2022500980698210420L; + private AbstractWizardPage nextPage = new SettlementPage(); - public ForestPage() { - super( LandUseCategory.F ); + public GrasslandPage() { + super( LandUseCategory.G ); } @Override @@ -32,7 +33,7 @@ public class ForestPage extends SubdivisionPage { @Override protected String getLabel() { - return Messages.getString("ForestPage.0"); //$NON-NLS-1$ + return Messages.getString("GrasslandPage.0"); //$NON-NLS-1$ } } From 13c212d3d38d47beaf31d893e9c7dd1f22ee8dd4 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:12 +0100 Subject: [PATCH 0547/1620] New translations OtherlandPage.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 0110c75fd0..005a6f2fdd 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -5,24 +5,24 @@ import org.openforis.collect.earth.ipcc.model.ManagementType; import se.gustavkarlsson.gwiz.AbstractWizardPage; -public class ForestPage extends SubdivisionPage { +public class OtherlandPage extends SubdivisionPage { - private static final long serialVersionUID = -1544068125437624279L; - private AbstractWizardPage nextPage = new CroplandPage(); + private static final long serialVersionUID = -7092466238152990994L; + //private AbstractWizardPage nextPage; - public ForestPage() { - super( LandUseCategory.F ); + public OtherlandPage() { + super( LandUseCategory.O ); } @Override protected AbstractWizardPage getNextPage() { - return nextPage; + return null; } @Override protected boolean isFinishAllowed() { - return false; + return true; } @Override @@ -32,7 +32,7 @@ public class ForestPage extends SubdivisionPage { @Override protected String getLabel() { - return Messages.getString("ForestPage.0"); //$NON-NLS-1$ + return Messages.getString("OtherlandPage.0"); //$NON-NLS-1$ } } From 2b3b45b92f6948f349f98dec2e3fb79c3660d062 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:13 +0100 Subject: [PATCH 0548/1620] New translations JDialogWizard.java (French) --- .../earth/app/view/Messages_fr.properties | 264 +++++++++++++++--- 1 file changed, 225 insertions(+), 39 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 3b8a2af7e3..71cc316cbd 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,39 +1,225 @@ -package org.openforis.collect.earth.ipcc.view; - -import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.ManagementType; - -import se.gustavkarlsson.gwiz.AbstractWizardPage; - -public class GrasslandPage extends SubdivisionPage { - - - private static final long serialVersionUID = -2022500980698210420L; - private AbstractWizardPage nextPage = new SettlementPage(); - - public GrasslandPage() { - super( LandUseCategory.G ); - } - - @Override - protected AbstractWizardPage getNextPage() { - return nextPage; - } - - - @Override - protected boolean isFinishAllowed() { - return false; - } - - @Override - protected Object[] getValues() { - return ManagementType.values(); - } - - @Override - protected String getLabel() { - return Messages.getString("GrasslandPage.0"); //$NON-NLS-1$ - } - -} +/******************************************************************************* + * Copyright (c) 2012 Gustav Karlsson . + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the GNU Public License v3.0 + * which accompanies this distribution, and is available at + * http://www.gnu.org/licenses/gpl.html + * + * Contributors: + * Gustav Karlsson - initial API and implementation + ******************************************************************************/ +package org.openforis.collect.earth.ipcc.view; + +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.GridLayout; +import java.awt.Insets; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.ContainerEvent; +import java.awt.event.ContainerListener; +import java.awt.event.KeyEvent; + +import javax.swing.AbstractButton; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JSeparator; + +import se.gustavkarlsson.gwiz.Wizard; + +/** + * A very simple Wizard implementation that suits the most basic needs. Extends {@link JFrame} and has + * navigation buttons at the bottom. + * + * @author Gustav Karlsson + */ +public class JDialogWizard extends JDialog implements Wizard { + private static final long serialVersionUID = 2818290889333414291L; + + private static final Dimension defaultminimumSize = new Dimension(500, 500); + + private final JPanel wizardPageContainer = new JPanel(new GridLayout(1, 1)); + private final JButton cancelButton = new JButton(Messages.getString("JDialogWizard.0")); //$NON-NLS-1$ + private final JButton previousButton = new JButton(Messages.getString("JDialogWizard.1")); //$NON-NLS-1$ + private final JButton nextButton = new JButton(Messages.getString("JDialogWizard.2")); //$NON-NLS-1$ + private final JButton finishButton = new JButton(Messages.getString("JDialogWizard.3")); //$NON-NLS-1$ + + private boolean wizardFinished = false; + + /** + * Creates an JDialogWizard with a title and GraphicsConfiguration. + * + * @param title + * the title of the frame + * @param gc + * the GraphicsConfiguration of the frame + * @see JFrame + */ + public JDialogWizard(Frame owner, String title, boolean modal) { + super(owner, title, modal); + setupWizard(); + } + + /** + * Creates an JDialogWizard. + * + * @see JFrame + */ + public JDialogWizard() { + super(); + setupWizard(); + } + + /** + * Sets up wizard upon construction. + */ + private void setupWizard() { + setupComponents(); + layoutComponents(); + + setMinimumSize(defaultminimumSize); + + // Center on screen + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + int xPosition = (screenSize.width / 2) - (defaultminimumSize.width / 2); + int yPosition = (screenSize.height / 2) - (defaultminimumSize.height / 2); + setLocation(xPosition, yPosition); + + setDefaultCloseOperation(DISPOSE_ON_CLOSE); + } + + /** + * Sets up the components of the wizard with listeners and mnemonics. + */ + private void setupComponents() { + cancelButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + dispose(); + } + }); + + finishButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + //JOptionPane.showMessageDialog(getContentPane(), Messages.getString("JDialogWizard.4")); //$NON-NLS-1$ + wizardFinished = true; + dispose(); + } + }); + + cancelButton.setMnemonic(KeyEvent.VK_C); + previousButton.setMnemonic(KeyEvent.VK_P); + nextButton.setMnemonic(KeyEvent.VK_N); + finishButton.setMnemonic(KeyEvent.VK_F); + + wizardPageContainer.addContainerListener(new MinimumSizeAdjuster()); + } + + /** + * Lays out the components in the wizards content pane. + */ + private void layoutComponents() { + GridBagLayout layout = new GridBagLayout(); + layout.rowWeights = new double[]{1.0, 0.0, 0.0}; + layout.columnWeights = new double[]{1.0, 0.0, 0.0, 0.0, 0.0}; + layout.rowHeights = new int[] {0, 0, 0}; + layout.columnWidths = new int[] {0, 0, 0, 0, 0}; + getContentPane().setLayout(layout); + + GridBagConstraints wizardPageContainerConstraint = new GridBagConstraints(); + wizardPageContainerConstraint.gridwidth = 5; + wizardPageContainerConstraint.fill = GridBagConstraints.BOTH; + wizardPageContainerConstraint.gridx = 0; + wizardPageContainerConstraint.gridy = 0; + wizardPageContainerConstraint.insets = new Insets(5, 5, 5, 5); + getContentPane().add(wizardPageContainer, wizardPageContainerConstraint); + + GridBagConstraints separatorConstraints = new GridBagConstraints(); + separatorConstraints.gridwidth = 5; + separatorConstraints.fill = GridBagConstraints.HORIZONTAL; + separatorConstraints.gridx = 0; + separatorConstraints.gridy = 1; + separatorConstraints.insets = new Insets(5, 5, 5, 5); + getContentPane().add(new JSeparator(), separatorConstraints); + + GridBagConstraints cancelButtonConstraints = new GridBagConstraints(); + cancelButtonConstraints.gridx = 1; + cancelButtonConstraints.gridy = 2; + cancelButtonConstraints.insets = new Insets(5, 5, 5, 0); + getContentPane().add(cancelButton, cancelButtonConstraints); + + GridBagConstraints previousButtonConstraints = new GridBagConstraints(); + previousButtonConstraints.gridx = 2; + previousButtonConstraints.gridy = 2; + previousButtonConstraints.insets = new Insets(5, 5, 5, 0); + getContentPane().add(previousButton, previousButtonConstraints); + + GridBagConstraints nextButtonConstraints = new GridBagConstraints(); + nextButtonConstraints.gridx = 3; + nextButtonConstraints.gridy = 2; + nextButtonConstraints.insets = new Insets(5, 5, 5, 0); + getContentPane().add(nextButton, nextButtonConstraints); + + GridBagConstraints finishButtonConstraints = new GridBagConstraints(); + finishButtonConstraints.gridx = 4; + finishButtonConstraints.gridy = 2; + finishButtonConstraints.insets = new Insets(5, 5, 5, 5); + getContentPane().add(finishButton, finishButtonConstraints); + } + + @Override + public JPanel getWizardPageContainer() { + return wizardPageContainer; + } + + @Override + public AbstractButton getCancelButton() { + return cancelButton; + } + + @Override + public JButton getPreviousButton() { + return previousButton; + } + + @Override + public JButton getNextButton() { + return nextButton; + } + + @Override + public JButton getFinishButton() { + return finishButton; + } + + private class MinimumSizeAdjuster implements ContainerListener { + + @Override + public void componentAdded(ContainerEvent e) { + Dimension currentSize = getSize(); + Dimension preferredSize = getPreferredSize(); + + Dimension newSize = new Dimension(currentSize); + newSize.width = Math.max(currentSize.width, preferredSize.width); + newSize.height = Math.max(currentSize.height, preferredSize.height); + + setMinimumSize(newSize); + } + + @Override + public void componentRemoved(ContainerEvent e) { + } + + } + + public boolean isWizardFinished() { + return wizardFinished; + } + +} From 88f3f4b892137f13fb177f2e0a95c5369e96cdf6 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:14 +0100 Subject: [PATCH 0549/1620] New translations JDialogWizard.java (Spanish) --- .../earth/app/view/Messages_es.properties | 264 +++++++++++++++--- 1 file changed, 225 insertions(+), 39 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 3b8a2af7e3..71cc316cbd 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,39 +1,225 @@ -package org.openforis.collect.earth.ipcc.view; - -import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.ManagementType; - -import se.gustavkarlsson.gwiz.AbstractWizardPage; - -public class GrasslandPage extends SubdivisionPage { - - - private static final long serialVersionUID = -2022500980698210420L; - private AbstractWizardPage nextPage = new SettlementPage(); - - public GrasslandPage() { - super( LandUseCategory.G ); - } - - @Override - protected AbstractWizardPage getNextPage() { - return nextPage; - } - - - @Override - protected boolean isFinishAllowed() { - return false; - } - - @Override - protected Object[] getValues() { - return ManagementType.values(); - } - - @Override - protected String getLabel() { - return Messages.getString("GrasslandPage.0"); //$NON-NLS-1$ - } - -} +/******************************************************************************* + * Copyright (c) 2012 Gustav Karlsson . + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the GNU Public License v3.0 + * which accompanies this distribution, and is available at + * http://www.gnu.org/licenses/gpl.html + * + * Contributors: + * Gustav Karlsson - initial API and implementation + ******************************************************************************/ +package org.openforis.collect.earth.ipcc.view; + +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.GridLayout; +import java.awt.Insets; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.ContainerEvent; +import java.awt.event.ContainerListener; +import java.awt.event.KeyEvent; + +import javax.swing.AbstractButton; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JSeparator; + +import se.gustavkarlsson.gwiz.Wizard; + +/** + * A very simple Wizard implementation that suits the most basic needs. Extends {@link JFrame} and has + * navigation buttons at the bottom. + * + * @author Gustav Karlsson + */ +public class JDialogWizard extends JDialog implements Wizard { + private static final long serialVersionUID = 2818290889333414291L; + + private static final Dimension defaultminimumSize = new Dimension(500, 500); + + private final JPanel wizardPageContainer = new JPanel(new GridLayout(1, 1)); + private final JButton cancelButton = new JButton(Messages.getString("JDialogWizard.0")); //$NON-NLS-1$ + private final JButton previousButton = new JButton(Messages.getString("JDialogWizard.1")); //$NON-NLS-1$ + private final JButton nextButton = new JButton(Messages.getString("JDialogWizard.2")); //$NON-NLS-1$ + private final JButton finishButton = new JButton(Messages.getString("JDialogWizard.3")); //$NON-NLS-1$ + + private boolean wizardFinished = false; + + /** + * Creates an JDialogWizard with a title and GraphicsConfiguration. + * + * @param title + * the title of the frame + * @param gc + * the GraphicsConfiguration of the frame + * @see JFrame + */ + public JDialogWizard(Frame owner, String title, boolean modal) { + super(owner, title, modal); + setupWizard(); + } + + /** + * Creates an JDialogWizard. + * + * @see JFrame + */ + public JDialogWizard() { + super(); + setupWizard(); + } + + /** + * Sets up wizard upon construction. + */ + private void setupWizard() { + setupComponents(); + layoutComponents(); + + setMinimumSize(defaultminimumSize); + + // Center on screen + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + int xPosition = (screenSize.width / 2) - (defaultminimumSize.width / 2); + int yPosition = (screenSize.height / 2) - (defaultminimumSize.height / 2); + setLocation(xPosition, yPosition); + + setDefaultCloseOperation(DISPOSE_ON_CLOSE); + } + + /** + * Sets up the components of the wizard with listeners and mnemonics. + */ + private void setupComponents() { + cancelButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + dispose(); + } + }); + + finishButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + //JOptionPane.showMessageDialog(getContentPane(), Messages.getString("JDialogWizard.4")); //$NON-NLS-1$ + wizardFinished = true; + dispose(); + } + }); + + cancelButton.setMnemonic(KeyEvent.VK_C); + previousButton.setMnemonic(KeyEvent.VK_P); + nextButton.setMnemonic(KeyEvent.VK_N); + finishButton.setMnemonic(KeyEvent.VK_F); + + wizardPageContainer.addContainerListener(new MinimumSizeAdjuster()); + } + + /** + * Lays out the components in the wizards content pane. + */ + private void layoutComponents() { + GridBagLayout layout = new GridBagLayout(); + layout.rowWeights = new double[]{1.0, 0.0, 0.0}; + layout.columnWeights = new double[]{1.0, 0.0, 0.0, 0.0, 0.0}; + layout.rowHeights = new int[] {0, 0, 0}; + layout.columnWidths = new int[] {0, 0, 0, 0, 0}; + getContentPane().setLayout(layout); + + GridBagConstraints wizardPageContainerConstraint = new GridBagConstraints(); + wizardPageContainerConstraint.gridwidth = 5; + wizardPageContainerConstraint.fill = GridBagConstraints.BOTH; + wizardPageContainerConstraint.gridx = 0; + wizardPageContainerConstraint.gridy = 0; + wizardPageContainerConstraint.insets = new Insets(5, 5, 5, 5); + getContentPane().add(wizardPageContainer, wizardPageContainerConstraint); + + GridBagConstraints separatorConstraints = new GridBagConstraints(); + separatorConstraints.gridwidth = 5; + separatorConstraints.fill = GridBagConstraints.HORIZONTAL; + separatorConstraints.gridx = 0; + separatorConstraints.gridy = 1; + separatorConstraints.insets = new Insets(5, 5, 5, 5); + getContentPane().add(new JSeparator(), separatorConstraints); + + GridBagConstraints cancelButtonConstraints = new GridBagConstraints(); + cancelButtonConstraints.gridx = 1; + cancelButtonConstraints.gridy = 2; + cancelButtonConstraints.insets = new Insets(5, 5, 5, 0); + getContentPane().add(cancelButton, cancelButtonConstraints); + + GridBagConstraints previousButtonConstraints = new GridBagConstraints(); + previousButtonConstraints.gridx = 2; + previousButtonConstraints.gridy = 2; + previousButtonConstraints.insets = new Insets(5, 5, 5, 0); + getContentPane().add(previousButton, previousButtonConstraints); + + GridBagConstraints nextButtonConstraints = new GridBagConstraints(); + nextButtonConstraints.gridx = 3; + nextButtonConstraints.gridy = 2; + nextButtonConstraints.insets = new Insets(5, 5, 5, 0); + getContentPane().add(nextButton, nextButtonConstraints); + + GridBagConstraints finishButtonConstraints = new GridBagConstraints(); + finishButtonConstraints.gridx = 4; + finishButtonConstraints.gridy = 2; + finishButtonConstraints.insets = new Insets(5, 5, 5, 5); + getContentPane().add(finishButton, finishButtonConstraints); + } + + @Override + public JPanel getWizardPageContainer() { + return wizardPageContainer; + } + + @Override + public AbstractButton getCancelButton() { + return cancelButton; + } + + @Override + public JButton getPreviousButton() { + return previousButton; + } + + @Override + public JButton getNextButton() { + return nextButton; + } + + @Override + public JButton getFinishButton() { + return finishButton; + } + + private class MinimumSizeAdjuster implements ContainerListener { + + @Override + public void componentAdded(ContainerEvent e) { + Dimension currentSize = getSize(); + Dimension preferredSize = getPreferredSize(); + + Dimension newSize = new Dimension(currentSize); + newSize.width = Math.max(currentSize.width, preferredSize.width); + newSize.height = Math.max(currentSize.height, preferredSize.height); + + setMinimumSize(newSize); + } + + @Override + public void componentRemoved(ContainerEvent e) { + } + + } + + public boolean isWizardFinished() { + return wizardFinished; + } + +} From cdde61ae5b4bf92b56ff9f7a4832d8b3962dcd45 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:15 +0100 Subject: [PATCH 0550/1620] New translations JDialogWizard.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 263 +++++++++++++++--- 1 file changed, 225 insertions(+), 38 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 005a6f2fdd..71cc316cbd 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,38 +1,225 @@ -package org.openforis.collect.earth.ipcc.view; - -import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.ManagementType; - -import se.gustavkarlsson.gwiz.AbstractWizardPage; - -public class OtherlandPage extends SubdivisionPage { - - private static final long serialVersionUID = -7092466238152990994L; - //private AbstractWizardPage nextPage; - - public OtherlandPage() { - super( LandUseCategory.O ); - } - - @Override - protected AbstractWizardPage getNextPage() { - return null; - } - - - @Override - protected boolean isFinishAllowed() { - return true; - } - - @Override - protected Object[] getValues() { - return ManagementType.values(); - } - - @Override - protected String getLabel() { - return Messages.getString("OtherlandPage.0"); //$NON-NLS-1$ - } - -} +/******************************************************************************* + * Copyright (c) 2012 Gustav Karlsson . + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the GNU Public License v3.0 + * which accompanies this distribution, and is available at + * http://www.gnu.org/licenses/gpl.html + * + * Contributors: + * Gustav Karlsson - initial API and implementation + ******************************************************************************/ +package org.openforis.collect.earth.ipcc.view; + +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.GridLayout; +import java.awt.Insets; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.ContainerEvent; +import java.awt.event.ContainerListener; +import java.awt.event.KeyEvent; + +import javax.swing.AbstractButton; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JSeparator; + +import se.gustavkarlsson.gwiz.Wizard; + +/** + * A very simple Wizard implementation that suits the most basic needs. Extends {@link JFrame} and has + * navigation buttons at the bottom. + * + * @author Gustav Karlsson + */ +public class JDialogWizard extends JDialog implements Wizard { + private static final long serialVersionUID = 2818290889333414291L; + + private static final Dimension defaultminimumSize = new Dimension(500, 500); + + private final JPanel wizardPageContainer = new JPanel(new GridLayout(1, 1)); + private final JButton cancelButton = new JButton(Messages.getString("JDialogWizard.0")); //$NON-NLS-1$ + private final JButton previousButton = new JButton(Messages.getString("JDialogWizard.1")); //$NON-NLS-1$ + private final JButton nextButton = new JButton(Messages.getString("JDialogWizard.2")); //$NON-NLS-1$ + private final JButton finishButton = new JButton(Messages.getString("JDialogWizard.3")); //$NON-NLS-1$ + + private boolean wizardFinished = false; + + /** + * Creates an JDialogWizard with a title and GraphicsConfiguration. + * + * @param title + * the title of the frame + * @param gc + * the GraphicsConfiguration of the frame + * @see JFrame + */ + public JDialogWizard(Frame owner, String title, boolean modal) { + super(owner, title, modal); + setupWizard(); + } + + /** + * Creates an JDialogWizard. + * + * @see JFrame + */ + public JDialogWizard() { + super(); + setupWizard(); + } + + /** + * Sets up wizard upon construction. + */ + private void setupWizard() { + setupComponents(); + layoutComponents(); + + setMinimumSize(defaultminimumSize); + + // Center on screen + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + int xPosition = (screenSize.width / 2) - (defaultminimumSize.width / 2); + int yPosition = (screenSize.height / 2) - (defaultminimumSize.height / 2); + setLocation(xPosition, yPosition); + + setDefaultCloseOperation(DISPOSE_ON_CLOSE); + } + + /** + * Sets up the components of the wizard with listeners and mnemonics. + */ + private void setupComponents() { + cancelButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + dispose(); + } + }); + + finishButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + //JOptionPane.showMessageDialog(getContentPane(), Messages.getString("JDialogWizard.4")); //$NON-NLS-1$ + wizardFinished = true; + dispose(); + } + }); + + cancelButton.setMnemonic(KeyEvent.VK_C); + previousButton.setMnemonic(KeyEvent.VK_P); + nextButton.setMnemonic(KeyEvent.VK_N); + finishButton.setMnemonic(KeyEvent.VK_F); + + wizardPageContainer.addContainerListener(new MinimumSizeAdjuster()); + } + + /** + * Lays out the components in the wizards content pane. + */ + private void layoutComponents() { + GridBagLayout layout = new GridBagLayout(); + layout.rowWeights = new double[]{1.0, 0.0, 0.0}; + layout.columnWeights = new double[]{1.0, 0.0, 0.0, 0.0, 0.0}; + layout.rowHeights = new int[] {0, 0, 0}; + layout.columnWidths = new int[] {0, 0, 0, 0, 0}; + getContentPane().setLayout(layout); + + GridBagConstraints wizardPageContainerConstraint = new GridBagConstraints(); + wizardPageContainerConstraint.gridwidth = 5; + wizardPageContainerConstraint.fill = GridBagConstraints.BOTH; + wizardPageContainerConstraint.gridx = 0; + wizardPageContainerConstraint.gridy = 0; + wizardPageContainerConstraint.insets = new Insets(5, 5, 5, 5); + getContentPane().add(wizardPageContainer, wizardPageContainerConstraint); + + GridBagConstraints separatorConstraints = new GridBagConstraints(); + separatorConstraints.gridwidth = 5; + separatorConstraints.fill = GridBagConstraints.HORIZONTAL; + separatorConstraints.gridx = 0; + separatorConstraints.gridy = 1; + separatorConstraints.insets = new Insets(5, 5, 5, 5); + getContentPane().add(new JSeparator(), separatorConstraints); + + GridBagConstraints cancelButtonConstraints = new GridBagConstraints(); + cancelButtonConstraints.gridx = 1; + cancelButtonConstraints.gridy = 2; + cancelButtonConstraints.insets = new Insets(5, 5, 5, 0); + getContentPane().add(cancelButton, cancelButtonConstraints); + + GridBagConstraints previousButtonConstraints = new GridBagConstraints(); + previousButtonConstraints.gridx = 2; + previousButtonConstraints.gridy = 2; + previousButtonConstraints.insets = new Insets(5, 5, 5, 0); + getContentPane().add(previousButton, previousButtonConstraints); + + GridBagConstraints nextButtonConstraints = new GridBagConstraints(); + nextButtonConstraints.gridx = 3; + nextButtonConstraints.gridy = 2; + nextButtonConstraints.insets = new Insets(5, 5, 5, 0); + getContentPane().add(nextButton, nextButtonConstraints); + + GridBagConstraints finishButtonConstraints = new GridBagConstraints(); + finishButtonConstraints.gridx = 4; + finishButtonConstraints.gridy = 2; + finishButtonConstraints.insets = new Insets(5, 5, 5, 5); + getContentPane().add(finishButton, finishButtonConstraints); + } + + @Override + public JPanel getWizardPageContainer() { + return wizardPageContainer; + } + + @Override + public AbstractButton getCancelButton() { + return cancelButton; + } + + @Override + public JButton getPreviousButton() { + return previousButton; + } + + @Override + public JButton getNextButton() { + return nextButton; + } + + @Override + public JButton getFinishButton() { + return finishButton; + } + + private class MinimumSizeAdjuster implements ContainerListener { + + @Override + public void componentAdded(ContainerEvent e) { + Dimension currentSize = getSize(); + Dimension preferredSize = getPreferredSize(); + + Dimension newSize = new Dimension(currentSize); + newSize.width = Math.max(currentSize.width, preferredSize.width); + newSize.height = Math.max(currentSize.height, preferredSize.height); + + setMinimumSize(newSize); + } + + @Override + public void componentRemoved(ContainerEvent e) { + } + + } + + public boolean isWizardFinished() { + return wizardFinished; + } + +} From ab67a4329a7ad8facaa4147dd80048c23950d5dc Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:16 +0100 Subject: [PATCH 0551/1620] New translations JDialogWizard.java (English) --- .../earth/app/view/Messages_en.properties | 264 +++++++++++++++--- 1 file changed, 225 insertions(+), 39 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 3b8a2af7e3..71cc316cbd 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,39 +1,225 @@ -package org.openforis.collect.earth.ipcc.view; - -import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.ManagementType; - -import se.gustavkarlsson.gwiz.AbstractWizardPage; - -public class GrasslandPage extends SubdivisionPage { - - - private static final long serialVersionUID = -2022500980698210420L; - private AbstractWizardPage nextPage = new SettlementPage(); - - public GrasslandPage() { - super( LandUseCategory.G ); - } - - @Override - protected AbstractWizardPage getNextPage() { - return nextPage; - } - - - @Override - protected boolean isFinishAllowed() { - return false; - } - - @Override - protected Object[] getValues() { - return ManagementType.values(); - } - - @Override - protected String getLabel() { - return Messages.getString("GrasslandPage.0"); //$NON-NLS-1$ - } - -} +/******************************************************************************* + * Copyright (c) 2012 Gustav Karlsson . + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the GNU Public License v3.0 + * which accompanies this distribution, and is available at + * http://www.gnu.org/licenses/gpl.html + * + * Contributors: + * Gustav Karlsson - initial API and implementation + ******************************************************************************/ +package org.openforis.collect.earth.ipcc.view; + +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.GridLayout; +import java.awt.Insets; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.ContainerEvent; +import java.awt.event.ContainerListener; +import java.awt.event.KeyEvent; + +import javax.swing.AbstractButton; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JSeparator; + +import se.gustavkarlsson.gwiz.Wizard; + +/** + * A very simple Wizard implementation that suits the most basic needs. Extends {@link JFrame} and has + * navigation buttons at the bottom. + * + * @author Gustav Karlsson + */ +public class JDialogWizard extends JDialog implements Wizard { + private static final long serialVersionUID = 2818290889333414291L; + + private static final Dimension defaultminimumSize = new Dimension(500, 500); + + private final JPanel wizardPageContainer = new JPanel(new GridLayout(1, 1)); + private final JButton cancelButton = new JButton(Messages.getString("JDialogWizard.0")); //$NON-NLS-1$ + private final JButton previousButton = new JButton(Messages.getString("JDialogWizard.1")); //$NON-NLS-1$ + private final JButton nextButton = new JButton(Messages.getString("JDialogWizard.2")); //$NON-NLS-1$ + private final JButton finishButton = new JButton(Messages.getString("JDialogWizard.3")); //$NON-NLS-1$ + + private boolean wizardFinished = false; + + /** + * Creates an JDialogWizard with a title and GraphicsConfiguration. + * + * @param title + * the title of the frame + * @param gc + * the GraphicsConfiguration of the frame + * @see JFrame + */ + public JDialogWizard(Frame owner, String title, boolean modal) { + super(owner, title, modal); + setupWizard(); + } + + /** + * Creates an JDialogWizard. + * + * @see JFrame + */ + public JDialogWizard() { + super(); + setupWizard(); + } + + /** + * Sets up wizard upon construction. + */ + private void setupWizard() { + setupComponents(); + layoutComponents(); + + setMinimumSize(defaultminimumSize); + + // Center on screen + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + int xPosition = (screenSize.width / 2) - (defaultminimumSize.width / 2); + int yPosition = (screenSize.height / 2) - (defaultminimumSize.height / 2); + setLocation(xPosition, yPosition); + + setDefaultCloseOperation(DISPOSE_ON_CLOSE); + } + + /** + * Sets up the components of the wizard with listeners and mnemonics. + */ + private void setupComponents() { + cancelButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + dispose(); + } + }); + + finishButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + //JOptionPane.showMessageDialog(getContentPane(), Messages.getString("JDialogWizard.4")); //$NON-NLS-1$ + wizardFinished = true; + dispose(); + } + }); + + cancelButton.setMnemonic(KeyEvent.VK_C); + previousButton.setMnemonic(KeyEvent.VK_P); + nextButton.setMnemonic(KeyEvent.VK_N); + finishButton.setMnemonic(KeyEvent.VK_F); + + wizardPageContainer.addContainerListener(new MinimumSizeAdjuster()); + } + + /** + * Lays out the components in the wizards content pane. + */ + private void layoutComponents() { + GridBagLayout layout = new GridBagLayout(); + layout.rowWeights = new double[]{1.0, 0.0, 0.0}; + layout.columnWeights = new double[]{1.0, 0.0, 0.0, 0.0, 0.0}; + layout.rowHeights = new int[] {0, 0, 0}; + layout.columnWidths = new int[] {0, 0, 0, 0, 0}; + getContentPane().setLayout(layout); + + GridBagConstraints wizardPageContainerConstraint = new GridBagConstraints(); + wizardPageContainerConstraint.gridwidth = 5; + wizardPageContainerConstraint.fill = GridBagConstraints.BOTH; + wizardPageContainerConstraint.gridx = 0; + wizardPageContainerConstraint.gridy = 0; + wizardPageContainerConstraint.insets = new Insets(5, 5, 5, 5); + getContentPane().add(wizardPageContainer, wizardPageContainerConstraint); + + GridBagConstraints separatorConstraints = new GridBagConstraints(); + separatorConstraints.gridwidth = 5; + separatorConstraints.fill = GridBagConstraints.HORIZONTAL; + separatorConstraints.gridx = 0; + separatorConstraints.gridy = 1; + separatorConstraints.insets = new Insets(5, 5, 5, 5); + getContentPane().add(new JSeparator(), separatorConstraints); + + GridBagConstraints cancelButtonConstraints = new GridBagConstraints(); + cancelButtonConstraints.gridx = 1; + cancelButtonConstraints.gridy = 2; + cancelButtonConstraints.insets = new Insets(5, 5, 5, 0); + getContentPane().add(cancelButton, cancelButtonConstraints); + + GridBagConstraints previousButtonConstraints = new GridBagConstraints(); + previousButtonConstraints.gridx = 2; + previousButtonConstraints.gridy = 2; + previousButtonConstraints.insets = new Insets(5, 5, 5, 0); + getContentPane().add(previousButton, previousButtonConstraints); + + GridBagConstraints nextButtonConstraints = new GridBagConstraints(); + nextButtonConstraints.gridx = 3; + nextButtonConstraints.gridy = 2; + nextButtonConstraints.insets = new Insets(5, 5, 5, 0); + getContentPane().add(nextButton, nextButtonConstraints); + + GridBagConstraints finishButtonConstraints = new GridBagConstraints(); + finishButtonConstraints.gridx = 4; + finishButtonConstraints.gridy = 2; + finishButtonConstraints.insets = new Insets(5, 5, 5, 5); + getContentPane().add(finishButton, finishButtonConstraints); + } + + @Override + public JPanel getWizardPageContainer() { + return wizardPageContainer; + } + + @Override + public AbstractButton getCancelButton() { + return cancelButton; + } + + @Override + public JButton getPreviousButton() { + return previousButton; + } + + @Override + public JButton getNextButton() { + return nextButton; + } + + @Override + public JButton getFinishButton() { + return finishButton; + } + + private class MinimumSizeAdjuster implements ContainerListener { + + @Override + public void componentAdded(ContainerEvent e) { + Dimension currentSize = getSize(); + Dimension preferredSize = getPreferredSize(); + + Dimension newSize = new Dimension(currentSize); + newSize.width = Math.max(currentSize.width, preferredSize.width); + newSize.height = Math.max(currentSize.height, preferredSize.height); + + setMinimumSize(newSize); + } + + @Override + public void componentRemoved(ContainerEvent e) { + } + + } + + public boolean isWizardFinished() { + return wizardFinished; + } + +} From 18640f6158cd7d37a8ac9eeae9ae1793946070fc Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:17 +0100 Subject: [PATCH 0552/1620] New translations Messages.java (French) --- .../earth/app/view/Messages_fr.properties | 246 ++---------------- 1 file changed, 21 insertions(+), 225 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 71cc316cbd..74599635a0 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,225 +1,21 @@ -/******************************************************************************* - * Copyright (c) 2012 Gustav Karlsson . - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0 - * which accompanies this distribution, and is available at - * http://www.gnu.org/licenses/gpl.html - * - * Contributors: - * Gustav Karlsson - initial API and implementation - ******************************************************************************/ -package org.openforis.collect.earth.ipcc.view; - -import java.awt.Dimension; -import java.awt.Frame; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.GridLayout; -import java.awt.Insets; -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.ContainerEvent; -import java.awt.event.ContainerListener; -import java.awt.event.KeyEvent; - -import javax.swing.AbstractButton; -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JPanel; -import javax.swing.JSeparator; - -import se.gustavkarlsson.gwiz.Wizard; - -/** - * A very simple Wizard implementation that suits the most basic needs. Extends {@link JFrame} and has - * navigation buttons at the bottom. - * - * @author Gustav Karlsson - */ -public class JDialogWizard extends JDialog implements Wizard { - private static final long serialVersionUID = 2818290889333414291L; - - private static final Dimension defaultminimumSize = new Dimension(500, 500); - - private final JPanel wizardPageContainer = new JPanel(new GridLayout(1, 1)); - private final JButton cancelButton = new JButton(Messages.getString("JDialogWizard.0")); //$NON-NLS-1$ - private final JButton previousButton = new JButton(Messages.getString("JDialogWizard.1")); //$NON-NLS-1$ - private final JButton nextButton = new JButton(Messages.getString("JDialogWizard.2")); //$NON-NLS-1$ - private final JButton finishButton = new JButton(Messages.getString("JDialogWizard.3")); //$NON-NLS-1$ - - private boolean wizardFinished = false; - - /** - * Creates an JDialogWizard with a title and GraphicsConfiguration. - * - * @param title - * the title of the frame - * @param gc - * the GraphicsConfiguration of the frame - * @see JFrame - */ - public JDialogWizard(Frame owner, String title, boolean modal) { - super(owner, title, modal); - setupWizard(); - } - - /** - * Creates an JDialogWizard. - * - * @see JFrame - */ - public JDialogWizard() { - super(); - setupWizard(); - } - - /** - * Sets up wizard upon construction. - */ - private void setupWizard() { - setupComponents(); - layoutComponents(); - - setMinimumSize(defaultminimumSize); - - // Center on screen - Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); - int xPosition = (screenSize.width / 2) - (defaultminimumSize.width / 2); - int yPosition = (screenSize.height / 2) - (defaultminimumSize.height / 2); - setLocation(xPosition, yPosition); - - setDefaultCloseOperation(DISPOSE_ON_CLOSE); - } - - /** - * Sets up the components of the wizard with listeners and mnemonics. - */ - private void setupComponents() { - cancelButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - dispose(); - } - }); - - finishButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - //JOptionPane.showMessageDialog(getContentPane(), Messages.getString("JDialogWizard.4")); //$NON-NLS-1$ - wizardFinished = true; - dispose(); - } - }); - - cancelButton.setMnemonic(KeyEvent.VK_C); - previousButton.setMnemonic(KeyEvent.VK_P); - nextButton.setMnemonic(KeyEvent.VK_N); - finishButton.setMnemonic(KeyEvent.VK_F); - - wizardPageContainer.addContainerListener(new MinimumSizeAdjuster()); - } - - /** - * Lays out the components in the wizards content pane. - */ - private void layoutComponents() { - GridBagLayout layout = new GridBagLayout(); - layout.rowWeights = new double[]{1.0, 0.0, 0.0}; - layout.columnWeights = new double[]{1.0, 0.0, 0.0, 0.0, 0.0}; - layout.rowHeights = new int[] {0, 0, 0}; - layout.columnWidths = new int[] {0, 0, 0, 0, 0}; - getContentPane().setLayout(layout); - - GridBagConstraints wizardPageContainerConstraint = new GridBagConstraints(); - wizardPageContainerConstraint.gridwidth = 5; - wizardPageContainerConstraint.fill = GridBagConstraints.BOTH; - wizardPageContainerConstraint.gridx = 0; - wizardPageContainerConstraint.gridy = 0; - wizardPageContainerConstraint.insets = new Insets(5, 5, 5, 5); - getContentPane().add(wizardPageContainer, wizardPageContainerConstraint); - - GridBagConstraints separatorConstraints = new GridBagConstraints(); - separatorConstraints.gridwidth = 5; - separatorConstraints.fill = GridBagConstraints.HORIZONTAL; - separatorConstraints.gridx = 0; - separatorConstraints.gridy = 1; - separatorConstraints.insets = new Insets(5, 5, 5, 5); - getContentPane().add(new JSeparator(), separatorConstraints); - - GridBagConstraints cancelButtonConstraints = new GridBagConstraints(); - cancelButtonConstraints.gridx = 1; - cancelButtonConstraints.gridy = 2; - cancelButtonConstraints.insets = new Insets(5, 5, 5, 0); - getContentPane().add(cancelButton, cancelButtonConstraints); - - GridBagConstraints previousButtonConstraints = new GridBagConstraints(); - previousButtonConstraints.gridx = 2; - previousButtonConstraints.gridy = 2; - previousButtonConstraints.insets = new Insets(5, 5, 5, 0); - getContentPane().add(previousButton, previousButtonConstraints); - - GridBagConstraints nextButtonConstraints = new GridBagConstraints(); - nextButtonConstraints.gridx = 3; - nextButtonConstraints.gridy = 2; - nextButtonConstraints.insets = new Insets(5, 5, 5, 0); - getContentPane().add(nextButton, nextButtonConstraints); - - GridBagConstraints finishButtonConstraints = new GridBagConstraints(); - finishButtonConstraints.gridx = 4; - finishButtonConstraints.gridy = 2; - finishButtonConstraints.insets = new Insets(5, 5, 5, 5); - getContentPane().add(finishButton, finishButtonConstraints); - } - - @Override - public JPanel getWizardPageContainer() { - return wizardPageContainer; - } - - @Override - public AbstractButton getCancelButton() { - return cancelButton; - } - - @Override - public JButton getPreviousButton() { - return previousButton; - } - - @Override - public JButton getNextButton() { - return nextButton; - } - - @Override - public JButton getFinishButton() { - return finishButton; - } - - private class MinimumSizeAdjuster implements ContainerListener { - - @Override - public void componentAdded(ContainerEvent e) { - Dimension currentSize = getSize(); - Dimension preferredSize = getPreferredSize(); - - Dimension newSize = new Dimension(currentSize); - newSize.width = Math.max(currentSize.width, preferredSize.width); - newSize.height = Math.max(currentSize.height, preferredSize.height); - - setMinimumSize(newSize); - } - - @Override - public void componentRemoved(ContainerEvent e) { - } - - } - - public boolean isWizardFinished() { - return wizardFinished; - } - -} +package org.openforis.collect.earth.ipcc.view; + +import java.util.MissingResourceException; +import java.util.ResourceBundle; + +public class Messages { + private static final String BUNDLE_NAME = "org.openforis.collect.earth.ipcc.view.Messages"; //$NON-NLS-1$ + + private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME); + + private Messages() { + } + + public static String getString(String key) { + try { + return RESOURCE_BUNDLE.getString(key); + } catch (MissingResourceException e) { + return '!' + key + '!'; + } + } +} From bd0ec602b8fca87d7f3a6d1a00da83e0f1399ed4 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:18 +0100 Subject: [PATCH 0553/1620] New translations Messages.java (Spanish) --- .../earth/app/view/Messages_es.properties | 246 ++---------------- 1 file changed, 21 insertions(+), 225 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 71cc316cbd..74599635a0 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,225 +1,21 @@ -/******************************************************************************* - * Copyright (c) 2012 Gustav Karlsson . - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0 - * which accompanies this distribution, and is available at - * http://www.gnu.org/licenses/gpl.html - * - * Contributors: - * Gustav Karlsson - initial API and implementation - ******************************************************************************/ -package org.openforis.collect.earth.ipcc.view; - -import java.awt.Dimension; -import java.awt.Frame; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.GridLayout; -import java.awt.Insets; -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.ContainerEvent; -import java.awt.event.ContainerListener; -import java.awt.event.KeyEvent; - -import javax.swing.AbstractButton; -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JPanel; -import javax.swing.JSeparator; - -import se.gustavkarlsson.gwiz.Wizard; - -/** - * A very simple Wizard implementation that suits the most basic needs. Extends {@link JFrame} and has - * navigation buttons at the bottom. - * - * @author Gustav Karlsson - */ -public class JDialogWizard extends JDialog implements Wizard { - private static final long serialVersionUID = 2818290889333414291L; - - private static final Dimension defaultminimumSize = new Dimension(500, 500); - - private final JPanel wizardPageContainer = new JPanel(new GridLayout(1, 1)); - private final JButton cancelButton = new JButton(Messages.getString("JDialogWizard.0")); //$NON-NLS-1$ - private final JButton previousButton = new JButton(Messages.getString("JDialogWizard.1")); //$NON-NLS-1$ - private final JButton nextButton = new JButton(Messages.getString("JDialogWizard.2")); //$NON-NLS-1$ - private final JButton finishButton = new JButton(Messages.getString("JDialogWizard.3")); //$NON-NLS-1$ - - private boolean wizardFinished = false; - - /** - * Creates an JDialogWizard with a title and GraphicsConfiguration. - * - * @param title - * the title of the frame - * @param gc - * the GraphicsConfiguration of the frame - * @see JFrame - */ - public JDialogWizard(Frame owner, String title, boolean modal) { - super(owner, title, modal); - setupWizard(); - } - - /** - * Creates an JDialogWizard. - * - * @see JFrame - */ - public JDialogWizard() { - super(); - setupWizard(); - } - - /** - * Sets up wizard upon construction. - */ - private void setupWizard() { - setupComponents(); - layoutComponents(); - - setMinimumSize(defaultminimumSize); - - // Center on screen - Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); - int xPosition = (screenSize.width / 2) - (defaultminimumSize.width / 2); - int yPosition = (screenSize.height / 2) - (defaultminimumSize.height / 2); - setLocation(xPosition, yPosition); - - setDefaultCloseOperation(DISPOSE_ON_CLOSE); - } - - /** - * Sets up the components of the wizard with listeners and mnemonics. - */ - private void setupComponents() { - cancelButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - dispose(); - } - }); - - finishButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - //JOptionPane.showMessageDialog(getContentPane(), Messages.getString("JDialogWizard.4")); //$NON-NLS-1$ - wizardFinished = true; - dispose(); - } - }); - - cancelButton.setMnemonic(KeyEvent.VK_C); - previousButton.setMnemonic(KeyEvent.VK_P); - nextButton.setMnemonic(KeyEvent.VK_N); - finishButton.setMnemonic(KeyEvent.VK_F); - - wizardPageContainer.addContainerListener(new MinimumSizeAdjuster()); - } - - /** - * Lays out the components in the wizards content pane. - */ - private void layoutComponents() { - GridBagLayout layout = new GridBagLayout(); - layout.rowWeights = new double[]{1.0, 0.0, 0.0}; - layout.columnWeights = new double[]{1.0, 0.0, 0.0, 0.0, 0.0}; - layout.rowHeights = new int[] {0, 0, 0}; - layout.columnWidths = new int[] {0, 0, 0, 0, 0}; - getContentPane().setLayout(layout); - - GridBagConstraints wizardPageContainerConstraint = new GridBagConstraints(); - wizardPageContainerConstraint.gridwidth = 5; - wizardPageContainerConstraint.fill = GridBagConstraints.BOTH; - wizardPageContainerConstraint.gridx = 0; - wizardPageContainerConstraint.gridy = 0; - wizardPageContainerConstraint.insets = new Insets(5, 5, 5, 5); - getContentPane().add(wizardPageContainer, wizardPageContainerConstraint); - - GridBagConstraints separatorConstraints = new GridBagConstraints(); - separatorConstraints.gridwidth = 5; - separatorConstraints.fill = GridBagConstraints.HORIZONTAL; - separatorConstraints.gridx = 0; - separatorConstraints.gridy = 1; - separatorConstraints.insets = new Insets(5, 5, 5, 5); - getContentPane().add(new JSeparator(), separatorConstraints); - - GridBagConstraints cancelButtonConstraints = new GridBagConstraints(); - cancelButtonConstraints.gridx = 1; - cancelButtonConstraints.gridy = 2; - cancelButtonConstraints.insets = new Insets(5, 5, 5, 0); - getContentPane().add(cancelButton, cancelButtonConstraints); - - GridBagConstraints previousButtonConstraints = new GridBagConstraints(); - previousButtonConstraints.gridx = 2; - previousButtonConstraints.gridy = 2; - previousButtonConstraints.insets = new Insets(5, 5, 5, 0); - getContentPane().add(previousButton, previousButtonConstraints); - - GridBagConstraints nextButtonConstraints = new GridBagConstraints(); - nextButtonConstraints.gridx = 3; - nextButtonConstraints.gridy = 2; - nextButtonConstraints.insets = new Insets(5, 5, 5, 0); - getContentPane().add(nextButton, nextButtonConstraints); - - GridBagConstraints finishButtonConstraints = new GridBagConstraints(); - finishButtonConstraints.gridx = 4; - finishButtonConstraints.gridy = 2; - finishButtonConstraints.insets = new Insets(5, 5, 5, 5); - getContentPane().add(finishButton, finishButtonConstraints); - } - - @Override - public JPanel getWizardPageContainer() { - return wizardPageContainer; - } - - @Override - public AbstractButton getCancelButton() { - return cancelButton; - } - - @Override - public JButton getPreviousButton() { - return previousButton; - } - - @Override - public JButton getNextButton() { - return nextButton; - } - - @Override - public JButton getFinishButton() { - return finishButton; - } - - private class MinimumSizeAdjuster implements ContainerListener { - - @Override - public void componentAdded(ContainerEvent e) { - Dimension currentSize = getSize(); - Dimension preferredSize = getPreferredSize(); - - Dimension newSize = new Dimension(currentSize); - newSize.width = Math.max(currentSize.width, preferredSize.width); - newSize.height = Math.max(currentSize.height, preferredSize.height); - - setMinimumSize(newSize); - } - - @Override - public void componentRemoved(ContainerEvent e) { - } - - } - - public boolean isWizardFinished() { - return wizardFinished; - } - -} +package org.openforis.collect.earth.ipcc.view; + +import java.util.MissingResourceException; +import java.util.ResourceBundle; + +public class Messages { + private static final String BUNDLE_NAME = "org.openforis.collect.earth.ipcc.view.Messages"; //$NON-NLS-1$ + + private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME); + + private Messages() { + } + + public static String getString(String key) { + try { + return RESOURCE_BUNDLE.getString(key); + } catch (MissingResourceException e) { + return '!' + key + '!'; + } + } +} From 2de5ecf0441eae89f043b2b3e791a9e8995a85cb Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:19 +0100 Subject: [PATCH 0554/1620] New translations Messages.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 246 ++---------------- 1 file changed, 21 insertions(+), 225 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 71cc316cbd..74599635a0 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,225 +1,21 @@ -/******************************************************************************* - * Copyright (c) 2012 Gustav Karlsson . - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0 - * which accompanies this distribution, and is available at - * http://www.gnu.org/licenses/gpl.html - * - * Contributors: - * Gustav Karlsson - initial API and implementation - ******************************************************************************/ -package org.openforis.collect.earth.ipcc.view; - -import java.awt.Dimension; -import java.awt.Frame; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.GridLayout; -import java.awt.Insets; -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.ContainerEvent; -import java.awt.event.ContainerListener; -import java.awt.event.KeyEvent; - -import javax.swing.AbstractButton; -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JPanel; -import javax.swing.JSeparator; - -import se.gustavkarlsson.gwiz.Wizard; - -/** - * A very simple Wizard implementation that suits the most basic needs. Extends {@link JFrame} and has - * navigation buttons at the bottom. - * - * @author Gustav Karlsson - */ -public class JDialogWizard extends JDialog implements Wizard { - private static final long serialVersionUID = 2818290889333414291L; - - private static final Dimension defaultminimumSize = new Dimension(500, 500); - - private final JPanel wizardPageContainer = new JPanel(new GridLayout(1, 1)); - private final JButton cancelButton = new JButton(Messages.getString("JDialogWizard.0")); //$NON-NLS-1$ - private final JButton previousButton = new JButton(Messages.getString("JDialogWizard.1")); //$NON-NLS-1$ - private final JButton nextButton = new JButton(Messages.getString("JDialogWizard.2")); //$NON-NLS-1$ - private final JButton finishButton = new JButton(Messages.getString("JDialogWizard.3")); //$NON-NLS-1$ - - private boolean wizardFinished = false; - - /** - * Creates an JDialogWizard with a title and GraphicsConfiguration. - * - * @param title - * the title of the frame - * @param gc - * the GraphicsConfiguration of the frame - * @see JFrame - */ - public JDialogWizard(Frame owner, String title, boolean modal) { - super(owner, title, modal); - setupWizard(); - } - - /** - * Creates an JDialogWizard. - * - * @see JFrame - */ - public JDialogWizard() { - super(); - setupWizard(); - } - - /** - * Sets up wizard upon construction. - */ - private void setupWizard() { - setupComponents(); - layoutComponents(); - - setMinimumSize(defaultminimumSize); - - // Center on screen - Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); - int xPosition = (screenSize.width / 2) - (defaultminimumSize.width / 2); - int yPosition = (screenSize.height / 2) - (defaultminimumSize.height / 2); - setLocation(xPosition, yPosition); - - setDefaultCloseOperation(DISPOSE_ON_CLOSE); - } - - /** - * Sets up the components of the wizard with listeners and mnemonics. - */ - private void setupComponents() { - cancelButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - dispose(); - } - }); - - finishButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - //JOptionPane.showMessageDialog(getContentPane(), Messages.getString("JDialogWizard.4")); //$NON-NLS-1$ - wizardFinished = true; - dispose(); - } - }); - - cancelButton.setMnemonic(KeyEvent.VK_C); - previousButton.setMnemonic(KeyEvent.VK_P); - nextButton.setMnemonic(KeyEvent.VK_N); - finishButton.setMnemonic(KeyEvent.VK_F); - - wizardPageContainer.addContainerListener(new MinimumSizeAdjuster()); - } - - /** - * Lays out the components in the wizards content pane. - */ - private void layoutComponents() { - GridBagLayout layout = new GridBagLayout(); - layout.rowWeights = new double[]{1.0, 0.0, 0.0}; - layout.columnWeights = new double[]{1.0, 0.0, 0.0, 0.0, 0.0}; - layout.rowHeights = new int[] {0, 0, 0}; - layout.columnWidths = new int[] {0, 0, 0, 0, 0}; - getContentPane().setLayout(layout); - - GridBagConstraints wizardPageContainerConstraint = new GridBagConstraints(); - wizardPageContainerConstraint.gridwidth = 5; - wizardPageContainerConstraint.fill = GridBagConstraints.BOTH; - wizardPageContainerConstraint.gridx = 0; - wizardPageContainerConstraint.gridy = 0; - wizardPageContainerConstraint.insets = new Insets(5, 5, 5, 5); - getContentPane().add(wizardPageContainer, wizardPageContainerConstraint); - - GridBagConstraints separatorConstraints = new GridBagConstraints(); - separatorConstraints.gridwidth = 5; - separatorConstraints.fill = GridBagConstraints.HORIZONTAL; - separatorConstraints.gridx = 0; - separatorConstraints.gridy = 1; - separatorConstraints.insets = new Insets(5, 5, 5, 5); - getContentPane().add(new JSeparator(), separatorConstraints); - - GridBagConstraints cancelButtonConstraints = new GridBagConstraints(); - cancelButtonConstraints.gridx = 1; - cancelButtonConstraints.gridy = 2; - cancelButtonConstraints.insets = new Insets(5, 5, 5, 0); - getContentPane().add(cancelButton, cancelButtonConstraints); - - GridBagConstraints previousButtonConstraints = new GridBagConstraints(); - previousButtonConstraints.gridx = 2; - previousButtonConstraints.gridy = 2; - previousButtonConstraints.insets = new Insets(5, 5, 5, 0); - getContentPane().add(previousButton, previousButtonConstraints); - - GridBagConstraints nextButtonConstraints = new GridBagConstraints(); - nextButtonConstraints.gridx = 3; - nextButtonConstraints.gridy = 2; - nextButtonConstraints.insets = new Insets(5, 5, 5, 0); - getContentPane().add(nextButton, nextButtonConstraints); - - GridBagConstraints finishButtonConstraints = new GridBagConstraints(); - finishButtonConstraints.gridx = 4; - finishButtonConstraints.gridy = 2; - finishButtonConstraints.insets = new Insets(5, 5, 5, 5); - getContentPane().add(finishButton, finishButtonConstraints); - } - - @Override - public JPanel getWizardPageContainer() { - return wizardPageContainer; - } - - @Override - public AbstractButton getCancelButton() { - return cancelButton; - } - - @Override - public JButton getPreviousButton() { - return previousButton; - } - - @Override - public JButton getNextButton() { - return nextButton; - } - - @Override - public JButton getFinishButton() { - return finishButton; - } - - private class MinimumSizeAdjuster implements ContainerListener { - - @Override - public void componentAdded(ContainerEvent e) { - Dimension currentSize = getSize(); - Dimension preferredSize = getPreferredSize(); - - Dimension newSize = new Dimension(currentSize); - newSize.width = Math.max(currentSize.width, preferredSize.width); - newSize.height = Math.max(currentSize.height, preferredSize.height); - - setMinimumSize(newSize); - } - - @Override - public void componentRemoved(ContainerEvent e) { - } - - } - - public boolean isWizardFinished() { - return wizardFinished; - } - -} +package org.openforis.collect.earth.ipcc.view; + +import java.util.MissingResourceException; +import java.util.ResourceBundle; + +public class Messages { + private static final String BUNDLE_NAME = "org.openforis.collect.earth.ipcc.view.Messages"; //$NON-NLS-1$ + + private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME); + + private Messages() { + } + + public static String getString(String key) { + try { + return RESOURCE_BUNDLE.getString(key); + } catch (MissingResourceException e) { + return '!' + key + '!'; + } + } +} From 13d17dc7f07d5968e3cb002d2dcfe3e526f05b77 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:20 +0100 Subject: [PATCH 0555/1620] New translations Messages.java (English) --- .../earth/app/view/Messages_en.properties | 246 ++---------------- 1 file changed, 21 insertions(+), 225 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 71cc316cbd..74599635a0 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,225 +1,21 @@ -/******************************************************************************* - * Copyright (c) 2012 Gustav Karlsson . - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0 - * which accompanies this distribution, and is available at - * http://www.gnu.org/licenses/gpl.html - * - * Contributors: - * Gustav Karlsson - initial API and implementation - ******************************************************************************/ -package org.openforis.collect.earth.ipcc.view; - -import java.awt.Dimension; -import java.awt.Frame; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.GridLayout; -import java.awt.Insets; -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.ContainerEvent; -import java.awt.event.ContainerListener; -import java.awt.event.KeyEvent; - -import javax.swing.AbstractButton; -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JPanel; -import javax.swing.JSeparator; - -import se.gustavkarlsson.gwiz.Wizard; - -/** - * A very simple Wizard implementation that suits the most basic needs. Extends {@link JFrame} and has - * navigation buttons at the bottom. - * - * @author Gustav Karlsson - */ -public class JDialogWizard extends JDialog implements Wizard { - private static final long serialVersionUID = 2818290889333414291L; - - private static final Dimension defaultminimumSize = new Dimension(500, 500); - - private final JPanel wizardPageContainer = new JPanel(new GridLayout(1, 1)); - private final JButton cancelButton = new JButton(Messages.getString("JDialogWizard.0")); //$NON-NLS-1$ - private final JButton previousButton = new JButton(Messages.getString("JDialogWizard.1")); //$NON-NLS-1$ - private final JButton nextButton = new JButton(Messages.getString("JDialogWizard.2")); //$NON-NLS-1$ - private final JButton finishButton = new JButton(Messages.getString("JDialogWizard.3")); //$NON-NLS-1$ - - private boolean wizardFinished = false; - - /** - * Creates an JDialogWizard with a title and GraphicsConfiguration. - * - * @param title - * the title of the frame - * @param gc - * the GraphicsConfiguration of the frame - * @see JFrame - */ - public JDialogWizard(Frame owner, String title, boolean modal) { - super(owner, title, modal); - setupWizard(); - } - - /** - * Creates an JDialogWizard. - * - * @see JFrame - */ - public JDialogWizard() { - super(); - setupWizard(); - } - - /** - * Sets up wizard upon construction. - */ - private void setupWizard() { - setupComponents(); - layoutComponents(); - - setMinimumSize(defaultminimumSize); - - // Center on screen - Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); - int xPosition = (screenSize.width / 2) - (defaultminimumSize.width / 2); - int yPosition = (screenSize.height / 2) - (defaultminimumSize.height / 2); - setLocation(xPosition, yPosition); - - setDefaultCloseOperation(DISPOSE_ON_CLOSE); - } - - /** - * Sets up the components of the wizard with listeners and mnemonics. - */ - private void setupComponents() { - cancelButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - dispose(); - } - }); - - finishButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - //JOptionPane.showMessageDialog(getContentPane(), Messages.getString("JDialogWizard.4")); //$NON-NLS-1$ - wizardFinished = true; - dispose(); - } - }); - - cancelButton.setMnemonic(KeyEvent.VK_C); - previousButton.setMnemonic(KeyEvent.VK_P); - nextButton.setMnemonic(KeyEvent.VK_N); - finishButton.setMnemonic(KeyEvent.VK_F); - - wizardPageContainer.addContainerListener(new MinimumSizeAdjuster()); - } - - /** - * Lays out the components in the wizards content pane. - */ - private void layoutComponents() { - GridBagLayout layout = new GridBagLayout(); - layout.rowWeights = new double[]{1.0, 0.0, 0.0}; - layout.columnWeights = new double[]{1.0, 0.0, 0.0, 0.0, 0.0}; - layout.rowHeights = new int[] {0, 0, 0}; - layout.columnWidths = new int[] {0, 0, 0, 0, 0}; - getContentPane().setLayout(layout); - - GridBagConstraints wizardPageContainerConstraint = new GridBagConstraints(); - wizardPageContainerConstraint.gridwidth = 5; - wizardPageContainerConstraint.fill = GridBagConstraints.BOTH; - wizardPageContainerConstraint.gridx = 0; - wizardPageContainerConstraint.gridy = 0; - wizardPageContainerConstraint.insets = new Insets(5, 5, 5, 5); - getContentPane().add(wizardPageContainer, wizardPageContainerConstraint); - - GridBagConstraints separatorConstraints = new GridBagConstraints(); - separatorConstraints.gridwidth = 5; - separatorConstraints.fill = GridBagConstraints.HORIZONTAL; - separatorConstraints.gridx = 0; - separatorConstraints.gridy = 1; - separatorConstraints.insets = new Insets(5, 5, 5, 5); - getContentPane().add(new JSeparator(), separatorConstraints); - - GridBagConstraints cancelButtonConstraints = new GridBagConstraints(); - cancelButtonConstraints.gridx = 1; - cancelButtonConstraints.gridy = 2; - cancelButtonConstraints.insets = new Insets(5, 5, 5, 0); - getContentPane().add(cancelButton, cancelButtonConstraints); - - GridBagConstraints previousButtonConstraints = new GridBagConstraints(); - previousButtonConstraints.gridx = 2; - previousButtonConstraints.gridy = 2; - previousButtonConstraints.insets = new Insets(5, 5, 5, 0); - getContentPane().add(previousButton, previousButtonConstraints); - - GridBagConstraints nextButtonConstraints = new GridBagConstraints(); - nextButtonConstraints.gridx = 3; - nextButtonConstraints.gridy = 2; - nextButtonConstraints.insets = new Insets(5, 5, 5, 0); - getContentPane().add(nextButton, nextButtonConstraints); - - GridBagConstraints finishButtonConstraints = new GridBagConstraints(); - finishButtonConstraints.gridx = 4; - finishButtonConstraints.gridy = 2; - finishButtonConstraints.insets = new Insets(5, 5, 5, 5); - getContentPane().add(finishButton, finishButtonConstraints); - } - - @Override - public JPanel getWizardPageContainer() { - return wizardPageContainer; - } - - @Override - public AbstractButton getCancelButton() { - return cancelButton; - } - - @Override - public JButton getPreviousButton() { - return previousButton; - } - - @Override - public JButton getNextButton() { - return nextButton; - } - - @Override - public JButton getFinishButton() { - return finishButton; - } - - private class MinimumSizeAdjuster implements ContainerListener { - - @Override - public void componentAdded(ContainerEvent e) { - Dimension currentSize = getSize(); - Dimension preferredSize = getPreferredSize(); - - Dimension newSize = new Dimension(currentSize); - newSize.width = Math.max(currentSize.width, preferredSize.width); - newSize.height = Math.max(currentSize.height, preferredSize.height); - - setMinimumSize(newSize); - } - - @Override - public void componentRemoved(ContainerEvent e) { - } - - } - - public boolean isWizardFinished() { - return wizardFinished; - } - -} +package org.openforis.collect.earth.ipcc.view; + +import java.util.MissingResourceException; +import java.util.ResourceBundle; + +public class Messages { + private static final String BUNDLE_NAME = "org.openforis.collect.earth.ipcc.view.Messages"; //$NON-NLS-1$ + + private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME); + + private Messages() { + } + + public static String getString(String key) { + try { + return RESOURCE_BUNDLE.getString(key); + } catch (MissingResourceException e) { + return '!' + key + '!'; + } + } +} From f496ce7a0156e766b2251ba0437e18ae2c22a787 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:21 +0100 Subject: [PATCH 0556/1620] New translations OtherlandPage.java (French) --- .../earth/app/view/Messages_fr.properties | 41 +++++++++++++------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 74599635a0..005a6f2fdd 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,21 +1,38 @@ package org.openforis.collect.earth.ipcc.view; -import java.util.MissingResourceException; -import java.util.ResourceBundle; +import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import org.openforis.collect.earth.ipcc.model.ManagementType; -public class Messages { - private static final String BUNDLE_NAME = "org.openforis.collect.earth.ipcc.view.Messages"; //$NON-NLS-1$ +import se.gustavkarlsson.gwiz.AbstractWizardPage; - private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME); +public class OtherlandPage extends SubdivisionPage { - private Messages() { + private static final long serialVersionUID = -7092466238152990994L; + //private AbstractWizardPage nextPage; + + public OtherlandPage() { + super( LandUseCategory.O ); } - public static String getString(String key) { - try { - return RESOURCE_BUNDLE.getString(key); - } catch (MissingResourceException e) { - return '!' + key + '!'; - } + @Override + protected AbstractWizardPage getNextPage() { + return null; } + + + @Override + protected boolean isFinishAllowed() { + return true; + } + + @Override + protected Object[] getValues() { + return ManagementType.values(); + } + + @Override + protected String getLabel() { + return Messages.getString("OtherlandPage.0"); //$NON-NLS-1$ + } + } From bf96e8012f15047edc743007531ebb8a47e85665 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:23 +0100 Subject: [PATCH 0557/1620] New translations DateUtils.java (Spanish) --- .../earth/app/view/Messages_es.properties | 47 ++++++++++--------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 74599635a0..300057dbb3 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,21 +1,26 @@ -package org.openforis.collect.earth.ipcc.view; - -import java.util.MissingResourceException; -import java.util.ResourceBundle; - -public class Messages { - private static final String BUNDLE_NAME = "org.openforis.collect.earth.ipcc.view.Messages"; //$NON-NLS-1$ - - private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME); - - private Messages() { - } - - public static String getString(String key) { - try { - return RESOURCE_BUNDLE.getString(key); - } catch (MissingResourceException e) { - return '!' + key + '!'; - } - } -} +package org.openforis.collect.earth.planet; + +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.Date; + +public class DateUtils { + + public static Date asDate(LocalDate localDate) { + return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant()); + } + + public static Date asDate(LocalDateTime localDateTime) { + return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()); + } + + public static LocalDate asLocalDate(Date date) { + return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate(); + } + + public static LocalDateTime asLocalDateTime(Date date) { + return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime(); + } +} \ No newline at end of file From 0e0e5175ab811ad703d0345fdf720103c846d9f5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:24 +0100 Subject: [PATCH 0558/1620] New translations DateUtils.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 47 ++++++++++--------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 74599635a0..300057dbb3 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,21 +1,26 @@ -package org.openforis.collect.earth.ipcc.view; - -import java.util.MissingResourceException; -import java.util.ResourceBundle; - -public class Messages { - private static final String BUNDLE_NAME = "org.openforis.collect.earth.ipcc.view.Messages"; //$NON-NLS-1$ - - private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME); - - private Messages() { - } - - public static String getString(String key) { - try { - return RESOURCE_BUNDLE.getString(key); - } catch (MissingResourceException e) { - return '!' + key + '!'; - } - } -} +package org.openforis.collect.earth.planet; + +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.Date; + +public class DateUtils { + + public static Date asDate(LocalDate localDate) { + return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant()); + } + + public static Date asDate(LocalDateTime localDateTime) { + return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()); + } + + public static LocalDate asLocalDate(Date date) { + return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate(); + } + + public static LocalDateTime asLocalDateTime(Date date) { + return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime(); + } +} \ No newline at end of file From 28250330f453e95191dfe4c72314b9611ed9696a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:25 +0100 Subject: [PATCH 0559/1620] New translations Links.java (English) --- .../earth/app/view/Messages_en.properties | 52 +++++++++++-------- 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 74599635a0..50ffb5df5e 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,21 +1,31 @@ -package org.openforis.collect.earth.ipcc.view; - -import java.util.MissingResourceException; -import java.util.ResourceBundle; - -public class Messages { - private static final String BUNDLE_NAME = "org.openforis.collect.earth.ipcc.view.Messages"; //$NON-NLS-1$ - - private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME); - - private Messages() { - } - - public static String getString(String key) { - try { - return RESOURCE_BUNDLE.getString(key); - } catch (MissingResourceException e) { - return '!' + key + '!'; - } - } -} +package org.openforis.collect.earth.planet; + +import com.google.gson.annotations.SerializedName; + +public class Links { + @SerializedName("_next") String next; + @SerializedName("_self") String self; + @SerializedName("_first") String first; + + public String getNext() { + return next; + } + public void setNext(String next) { + this.next = next; + } + public String getSelf() { + return self; + } + public void setSelf(String self) { + this.self = self; + } + public String getFirst() { + return first; + } + public void setFirst(String first) { + this.first = first; + } + + + +} From 54e3c305a6809c80a30ecfd828c20f6b6577a790 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:26 +0100 Subject: [PATCH 0560/1620] New translations GeoJson.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 300057dbb3..16edcc9124 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,26 +1,26 @@ package org.openforis.collect.earth.planet; -import java.time.Instant; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.util.Date; - -public class DateUtils { - - public static Date asDate(LocalDate localDate) { - return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant()); - } - - public static Date asDate(LocalDateTime localDateTime) { - return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()); - } - - public static LocalDate asLocalDate(Date date) { - return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate(); - } - - public static LocalDateTime asLocalDateTime(Date date) { - return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime(); - } -} \ No newline at end of file +public class GeoJson { + + String type; // for geojson + double[][][] coordinates; + + public GeoJson(String type, double[][][] coordinates) { + super(); + this.type = type; + this.coordinates = coordinates; + } + public String getType() { + return type; + } + public void setType(String type) { + this.type = type; + } + public double[][][] getCoordinates() { + return coordinates; + } + public void setCoordinates(double[][][] coordinates) { + this.coordinates = coordinates; + } + +} From 4c8574c58a7c177207c71c108e9452fbff621609 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:27 +0100 Subject: [PATCH 0561/1620] New translations GeoJson.java (English) --- .../earth/app/view/Messages_en.properties | 35 ++++++++----------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 50ffb5df5e..16edcc9124 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,31 +1,26 @@ package org.openforis.collect.earth.planet; -import com.google.gson.annotations.SerializedName; +public class GeoJson { -public class Links { - @SerializedName("_next") String next; - @SerializedName("_self") String self; - @SerializedName("_first") String first; + String type; // for geojson + double[][][] coordinates; - public String getNext() { - return next; + public GeoJson(String type, double[][][] coordinates) { + super(); + this.type = type; + this.coordinates = coordinates; } - public void setNext(String next) { - this.next = next; + public String getType() { + return type; } - public String getSelf() { - return self; + public void setType(String type) { + this.type = type; } - public void setSelf(String self) { - this.self = self; + public double[][][] getCoordinates() { + return coordinates; } - public String getFirst() { - return first; + public void setCoordinates(double[][][] coordinates) { + this.coordinates = coordinates; } - public void setFirst(String first) { - this.first = first; - } - - } From 0e2f370542b38011f4d2c1eef0287d0e52de1a0c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:28 +0100 Subject: [PATCH 0562/1620] New translations LayerResponse.java (French) --- .../earth/app/view/Messages_fr.properties | 87 +++++++++++-------- 1 file changed, 49 insertions(+), 38 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 005a6f2fdd..62c4020b05 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,38 +1,49 @@ -package org.openforis.collect.earth.ipcc.view; - -import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.ManagementType; - -import se.gustavkarlsson.gwiz.AbstractWizardPage; - -public class OtherlandPage extends SubdivisionPage { - - private static final long serialVersionUID = -7092466238152990994L; - //private AbstractWizardPage nextPage; - - public OtherlandPage() { - super( LandUseCategory.O ); - } - - @Override - protected AbstractWizardPage getNextPage() { - return null; - } - - - @Override - protected boolean isFinishAllowed() { - return true; - } - - @Override - protected Object[] getValues() { - return ManagementType.values(); - } - - @Override - protected String getLabel() { - return Messages.getString("OtherlandPage.0"); //$NON-NLS-1$ - } - -} +package org.openforis.collect.earth.planet; + +public class LayerResponse { + String name; + String[] items; + Float[] bounds; + String scheme; + String[] tiles; + String version; + + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String[] getItems() { + return items; + } + public void setItems(String[] items) { + this.items = items; + } + public Float[] getBounds() { + return bounds; + } + public void setBounds(Float[] bounds) { + this.bounds = bounds; + } + public String getScheme() { + return scheme; + } + public void setScheme(String scheme) { + this.scheme = scheme; + } + public String[] getTiles() { + return tiles; + } + public void setTiles(String[] tiles) { + this.tiles = tiles; + } + public String getVersion() { + return version; + } + public void setVersion(String version) { + this.version = version; + } + + +} From e3b44f9a17418e1d857df24b7e2b87523f88d1bc Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:29 +0100 Subject: [PATCH 0563/1620] New translations LayerResponse.java (Spanish) --- .../earth/app/view/Messages_es.properties | 71 ++++++++++++------- 1 file changed, 47 insertions(+), 24 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 300057dbb3..62c4020b05 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,26 +1,49 @@ package org.openforis.collect.earth.planet; -import java.time.Instant; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.util.Date; - -public class DateUtils { - - public static Date asDate(LocalDate localDate) { - return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant()); - } - - public static Date asDate(LocalDateTime localDateTime) { - return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()); - } - - public static LocalDate asLocalDate(Date date) { - return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate(); - } - - public static LocalDateTime asLocalDateTime(Date date) { - return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime(); - } -} \ No newline at end of file +public class LayerResponse { + String name; + String[] items; + Float[] bounds; + String scheme; + String[] tiles; + String version; + + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String[] getItems() { + return items; + } + public void setItems(String[] items) { + this.items = items; + } + public Float[] getBounds() { + return bounds; + } + public void setBounds(Float[] bounds) { + this.bounds = bounds; + } + public String getScheme() { + return scheme; + } + public void setScheme(String scheme) { + this.scheme = scheme; + } + public String[] getTiles() { + return tiles; + } + public void setTiles(String[] tiles) { + this.tiles = tiles; + } + public String getVersion() { + return version; + } + public void setVersion(String version) { + this.version = version; + } + + +} From dc2751de778172edba8637420e9daef1d1c38bfe Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:30 +0100 Subject: [PATCH 0564/1620] New translations LayerResponse.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 55 +++++++++++++------ 1 file changed, 39 insertions(+), 16 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 16edcc9124..62c4020b05 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,26 +1,49 @@ package org.openforis.collect.earth.planet; -public class GeoJson { - - String type; // for geojson - double[][][] coordinates; +public class LayerResponse { + String name; + String[] items; + Float[] bounds; + String scheme; + String[] tiles; + String version; - public GeoJson(String type, double[][][] coordinates) { - super(); - this.type = type; - this.coordinates = coordinates; + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String[] getItems() { + return items; + } + public void setItems(String[] items) { + this.items = items; + } + public Float[] getBounds() { + return bounds; } - public String getType() { - return type; + public void setBounds(Float[] bounds) { + this.bounds = bounds; } - public void setType(String type) { - this.type = type; + public String getScheme() { + return scheme; } - public double[][][] getCoordinates() { - return coordinates; + public void setScheme(String scheme) { + this.scheme = scheme; } - public void setCoordinates(double[][][] coordinates) { - this.coordinates = coordinates; + public String[] getTiles() { + return tiles; } + public void setTiles(String[] tiles) { + this.tiles = tiles; + } + public String getVersion() { + return version; + } + public void setVersion(String version) { + this.version = version; + } + } From 9ad5c71d8af261fccecc1e88273cadfa52effe58 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:31 +0100 Subject: [PATCH 0565/1620] New translations LayerResponse.java (English) --- .../earth/app/view/Messages_en.properties | 55 +++++++++++++------ 1 file changed, 39 insertions(+), 16 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 16edcc9124..62c4020b05 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,26 +1,49 @@ package org.openforis.collect.earth.planet; -public class GeoJson { - - String type; // for geojson - double[][][] coordinates; +public class LayerResponse { + String name; + String[] items; + Float[] bounds; + String scheme; + String[] tiles; + String version; - public GeoJson(String type, double[][][] coordinates) { - super(); - this.type = type; - this.coordinates = coordinates; + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String[] getItems() { + return items; + } + public void setItems(String[] items) { + this.items = items; + } + public Float[] getBounds() { + return bounds; } - public String getType() { - return type; + public void setBounds(Float[] bounds) { + this.bounds = bounds; } - public void setType(String type) { - this.type = type; + public String getScheme() { + return scheme; } - public double[][][] getCoordinates() { - return coordinates; + public void setScheme(String scheme) { + this.scheme = scheme; } - public void setCoordinates(double[][][] coordinates) { - this.coordinates = coordinates; + public String[] getTiles() { + return tiles; } + public void setTiles(String[] tiles) { + this.tiles = tiles; + } + public String getVersion() { + return version; + } + public void setVersion(String version) { + this.version = version; + } + } From 0d4837e2fc93dc677c9e15b407ebcec0940a4fff Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:32 +0100 Subject: [PATCH 0566/1620] New translations Links.java (French) --- .../earth/app/view/Messages_fr.properties | 56 +++++++------------ 1 file changed, 19 insertions(+), 37 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 62c4020b05..50ffb5df5e 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,49 +1,31 @@ package org.openforis.collect.earth.planet; -public class LayerResponse { - String name; - String[] items; - Float[] bounds; - String scheme; - String[] tiles; - String version; +import com.google.gson.annotations.SerializedName; + +public class Links { + @SerializedName("_next") String next; + @SerializedName("_self") String self; + @SerializedName("_first") String first; - public String getName() { - return name; - } - public void setName(String name) { - this.name = name; - } - public String[] getItems() { - return items; - } - public void setItems(String[] items) { - this.items = items; + public String getNext() { + return next; } - public Float[] getBounds() { - return bounds; + public void setNext(String next) { + this.next = next; } - public void setBounds(Float[] bounds) { - this.bounds = bounds; + public String getSelf() { + return self; } - public String getScheme() { - return scheme; + public void setSelf(String self) { + this.self = self; } - public void setScheme(String scheme) { - this.scheme = scheme; + public String getFirst() { + return first; } - public String[] getTiles() { - return tiles; - } - public void setTiles(String[] tiles) { - this.tiles = tiles; - } - public String getVersion() { - return version; - } - public void setVersion(String version) { - this.version = version; + public void setFirst(String first) { + this.first = first; } + } From f211740dd18a3d51f166d4fabbe3744f6a88b4b8 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:34 +0100 Subject: [PATCH 0567/1620] New translations Links.java (Spanish) --- .../earth/app/view/Messages_es.properties | 56 +++++++------------ 1 file changed, 19 insertions(+), 37 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 62c4020b05..50ffb5df5e 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,49 +1,31 @@ package org.openforis.collect.earth.planet; -public class LayerResponse { - String name; - String[] items; - Float[] bounds; - String scheme; - String[] tiles; - String version; +import com.google.gson.annotations.SerializedName; + +public class Links { + @SerializedName("_next") String next; + @SerializedName("_self") String self; + @SerializedName("_first") String first; - public String getName() { - return name; - } - public void setName(String name) { - this.name = name; - } - public String[] getItems() { - return items; - } - public void setItems(String[] items) { - this.items = items; + public String getNext() { + return next; } - public Float[] getBounds() { - return bounds; + public void setNext(String next) { + this.next = next; } - public void setBounds(Float[] bounds) { - this.bounds = bounds; + public String getSelf() { + return self; } - public String getScheme() { - return scheme; + public void setSelf(String self) { + this.self = self; } - public void setScheme(String scheme) { - this.scheme = scheme; + public String getFirst() { + return first; } - public String[] getTiles() { - return tiles; - } - public void setTiles(String[] tiles) { - this.tiles = tiles; - } - public String getVersion() { - return version; - } - public void setVersion(String version) { - this.version = version; + public void setFirst(String first) { + this.first = first; } + } From 4b3dc371125160d52c79e5736390e1da81a4d8b5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:35 +0100 Subject: [PATCH 0568/1620] New translations Links.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 56 +++++++------------ 1 file changed, 19 insertions(+), 37 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 62c4020b05..50ffb5df5e 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,49 +1,31 @@ package org.openforis.collect.earth.planet; -public class LayerResponse { - String name; - String[] items; - Float[] bounds; - String scheme; - String[] tiles; - String version; +import com.google.gson.annotations.SerializedName; + +public class Links { + @SerializedName("_next") String next; + @SerializedName("_self") String self; + @SerializedName("_first") String first; - public String getName() { - return name; - } - public void setName(String name) { - this.name = name; - } - public String[] getItems() { - return items; - } - public void setItems(String[] items) { - this.items = items; + public String getNext() { + return next; } - public Float[] getBounds() { - return bounds; + public void setNext(String next) { + this.next = next; } - public void setBounds(Float[] bounds) { - this.bounds = bounds; + public String getSelf() { + return self; } - public String getScheme() { - return scheme; + public void setSelf(String self) { + this.self = self; } - public void setScheme(String scheme) { - this.scheme = scheme; + public String getFirst() { + return first; } - public String[] getTiles() { - return tiles; - } - public void setTiles(String[] tiles) { - this.tiles = tiles; - } - public String getVersion() { - return version; - } - public void setVersion(String version) { - this.version = version; + public void setFirst(String first) { + this.first = first; } + } From 55a69e1a3d62fdfc529504604fe25383cd04b759 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:36 +0100 Subject: [PATCH 0569/1620] New translations PlanetAttributes.java (French) --- .../earth/app/view/Messages_fr.properties | 29 +++---------------- 1 file changed, 4 insertions(+), 25 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 50ffb5df5e..a3da2ae001 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,31 +1,10 @@ package org.openforis.collect.earth.planet; -import com.google.gson.annotations.SerializedName; +public final class PlanetAttributes { -public class Links { - @SerializedName("_next") String next; - @SerializedName("_self") String self; - @SerializedName("_first") String first; + private PlanetAttributes() {} - public String getNext() { - return next; - } - public void setNext(String next) { - this.next = next; - } - public String getSelf() { - return self; - } - public void setSelf(String self) { - this.self = self; - } - public String getFirst() { - return first; - } - public void setFirst(String first) { - this.first = first; - } - - + public static final String ACQUIRED = "acquired"; + public static final String GEOMETRY = "geometry"; } From af440bce983cc4155efa8af913b78cdae1a3f352 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:37 +0100 Subject: [PATCH 0570/1620] New translations GeoJson.java (French) --- .../earth/app/view/Messages_fr.properties | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index a3da2ae001..16edcc9124 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,10 +1,26 @@ package org.openforis.collect.earth.planet; -public final class PlanetAttributes { +public class GeoJson { - private PlanetAttributes() {} + String type; // for geojson + double[][][] coordinates; - public static final String ACQUIRED = "acquired"; - public static final String GEOMETRY = "geometry"; + public GeoJson(String type, double[][][] coordinates) { + super(); + this.type = type; + this.coordinates = coordinates; + } + public String getType() { + return type; + } + public void setType(String type) { + this.type = type; + } + public double[][][] getCoordinates() { + return coordinates; + } + public void setCoordinates(double[][][] coordinates) { + this.coordinates = coordinates; + } } From e9afec43fbadb413234878ac4c6cb5396e2f8b6e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:38 +0100 Subject: [PATCH 0571/1620] New translations PlanetAttributes.java (Spanish) --- .../earth/app/view/Messages_es.properties | 29 +++---------------- 1 file changed, 4 insertions(+), 25 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 50ffb5df5e..a3da2ae001 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,31 +1,10 @@ package org.openforis.collect.earth.planet; -import com.google.gson.annotations.SerializedName; +public final class PlanetAttributes { -public class Links { - @SerializedName("_next") String next; - @SerializedName("_self") String self; - @SerializedName("_first") String first; + private PlanetAttributes() {} - public String getNext() { - return next; - } - public void setNext(String next) { - this.next = next; - } - public String getSelf() { - return self; - } - public void setSelf(String self) { - this.self = self; - } - public String getFirst() { - return first; - } - public void setFirst(String first) { - this.first = first; - } - - + public static final String ACQUIRED = "acquired"; + public static final String GEOMETRY = "geometry"; } From 48e9f9136aff372ff6dd37ac9f32fb00f7165e50 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:39 +0100 Subject: [PATCH 0572/1620] New translations PlanetAttributes.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 29 +++---------------- 1 file changed, 4 insertions(+), 25 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 50ffb5df5e..a3da2ae001 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,31 +1,10 @@ package org.openforis.collect.earth.planet; -import com.google.gson.annotations.SerializedName; +public final class PlanetAttributes { -public class Links { - @SerializedName("_next") String next; - @SerializedName("_self") String self; - @SerializedName("_first") String first; + private PlanetAttributes() {} - public String getNext() { - return next; - } - public void setNext(String next) { - this.next = next; - } - public String getSelf() { - return self; - } - public void setSelf(String self) { - this.self = self; - } - public String getFirst() { - return first; - } - public void setFirst(String first) { - this.first = first; - } - - + public static final String ACQUIRED = "acquired"; + public static final String GEOMETRY = "geometry"; } From 4307a62faa507a9bef342b55fbc242376c391c4c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:40 +0100 Subject: [PATCH 0573/1620] New translations PlanetAttributes.java (English) --- .../earth/app/view/Messages_en.properties | 49 ++----------------- 1 file changed, 5 insertions(+), 44 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 62c4020b05..a3da2ae001 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,49 +1,10 @@ package org.openforis.collect.earth.planet; -public class LayerResponse { - String name; - String[] items; - Float[] bounds; - String scheme; - String[] tiles; - String version; - - public String getName() { - return name; - } - public void setName(String name) { - this.name = name; - } - public String[] getItems() { - return items; - } - public void setItems(String[] items) { - this.items = items; - } - public Float[] getBounds() { - return bounds; - } - public void setBounds(Float[] bounds) { - this.bounds = bounds; - } - public String getScheme() { - return scheme; - } - public void setScheme(String scheme) { - this.scheme = scheme; - } - public String[] getTiles() { - return tiles; - } - public void setTiles(String[] tiles) { - this.tiles = tiles; - } - public String getVersion() { - return version; - } - public void setVersion(String version) { - this.version = version; - } +public final class PlanetAttributes { + private PlanetAttributes() {} + + public static final String ACQUIRED = "acquired"; + public static final String GEOMETRY = "geometry"; } From 0262a2bba38df2603a09cba3b7bf870c04d0b562 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:41 +0100 Subject: [PATCH 0574/1620] New translations PlanetImagery.java (French) --- .../earth/app/view/Messages_fr.properties | 350 +++++++++++++++++- 1 file changed, 334 insertions(+), 16 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 16edcc9124..34f161190b 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,26 +1,344 @@ package org.openforis.collect.earth.planet; -public class GeoJson { +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.security.Security; +import java.time.LocalDateTime; +import java.util.Arrays; +import java.util.Base64; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; - String type; // for geojson - double[][][] coordinates; - - public GeoJson(String type, double[][][] coordinates) { +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; + +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.service.TrustAllCertificates; +import org.openforis.collect.earth.sampler.model.SimpleCoordinate; +import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +public class PlanetImagery { + + private static final Logger logger = LoggerFactory.getLogger(PlanetImagery.class); + private static final Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").create(); + private static final SSLSocketFactory factory = getSSLAcceptAllFactory(); + + private String apiKey; + + private int retries = 0; + + private static final int MAX_RETRIES = 6; + + public PlanetImagery(String apiKey) { super(); - this.type = type; - this.coordinates = coordinates; + this.apiKey = apiKey; + } + + private Filter getDateFilter(Date start, Date end) { + Filter dateFilter = new Filter<>(); + dateFilter.setType(FilterType.DATERANGE); + dateFilter.setFieldName(PlanetAttributes.ACQUIRED); + dateFilter.setConfig(new FilterConfig(new DatePlanet(start), new DatePlanet(end))); + return dateFilter; } - public String getType() { - return type; + + private Filter withinDaysFilter(Feature feature, int days) { + Date acquriredDate = feature.getProperties().getAcquired(); + LocalDateTime localDateTime = DateUtils.asLocalDateTime(acquriredDate); + Date start = DateUtils.asDate(localDateTime.minusDays(days)); + Date end = DateUtils.asDate(localDateTime.plusDays(days - 1)); + return getDateFilter(start, end); } - public void setType(String type) { - this.type = type; + + private Filter getGeometryFilter(GeoJson geoJson) { + Filter geoFilter = new Filter<>(); + geoFilter.setType(FilterType.GEOMETRY); + geoFilter.setFieldName(PlanetAttributes.GEOMETRY); + geoFilter.setConfig(new FilterConfig(geoJson.getType(), geoJson.getCoordinates())); + return geoFilter; } - public double[][][] getCoordinates() { - return coordinates; + + private Filter getAndFilter(Filter[] filters) { + Filter andFilter = new Filter<>(); + andFilter.setType(FilterType.AND); + andFilter.setConfig(filters); + return andFilter; } - public void setCoordinates(double[][][] coordinates) { - this.coordinates = coordinates; + + private Filter getOrFilter(Filter[] filters) { + Filter andFilter = new Filter<>(); + andFilter.setType(FilterType.OR); + andFilter.setConfig(filters); + return andFilter; + } + + private Filter getStringInFilter(String fieldName, String[] strings) { + Filter stringInFilter = new Filter<>(); + stringInFilter.setType(FilterType.STRING_IN); + stringInFilter.setFieldName(fieldName); + stringInFilter.setConfig(strings); + return stringInFilter; + } + + private int getQuality(Feature feature) { + FeatureProperties p = feature.getProperties(); + Integer quality = p.getClearPercent(); + if (quality != null) + return quality; + else { + return (int) ((1 - p.getCloudCover()) * 50); + } + } + + private String sendRequest(URL url, Object jsonObject) throws IOException { + try { + + HttpURLConnection conn = getAuthenticatedConnection(url, jsonObject); + + buildRequet(jsonObject, conn); + + StringBuilder response = null; + try { + response = readStream(conn.getInputStream()); + } finally { + conn.disconnect(); + } + + retries = 0; // reset the counter as it was a success + return response.toString(); + } catch (IOException e) { + if( e.getMessage()!=null && e.getMessage().contains("429") ) { // This happens when there are too many consecutive requests! Make the user wait a bit and try again! + try { + if( retries < MAX_RETRIES ) { + Thread.sleep( 5000 ); + retries++; + }else { + retries = 0; + throw e; + } + } catch (InterruptedException e1) { + logger.error( "Error waiting for Thread requesting Planet imagery"); + } + return sendRequest(url, jsonObject); + }else { + throw e; // Another type of error throw! + } + } + } + + private void buildRequet(Object jsonObject, HttpURLConnection conn) + throws IOException { + byte[] postDataBytes = null; + if (jsonObject != null) { + String jsonInputString = gson.toJson(jsonObject); + postDataBytes = jsonInputString.getBytes( StandardCharsets.UTF_8.name()); + logger.info(jsonInputString); + } + if (postDataBytes != null) { + conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length)); + conn.getOutputStream().write(postDataBytes); + } else { + conn.setRequestProperty("Content-Length", "0"); + } + } + + private HttpURLConnection getAuthenticatedConnection(URL url, Object jsonObject) + throws IOException { + HttpURLConnection conn = null; + if( factory != null ) { // THIS IS A WORKAROUND TO REMOVE SSL CERTIFICATE ISSUES + conn = (HttpsURLConnection) url.openConnection(); + ((HttpsURLConnection)conn).setSSLSocketFactory(factory); + }else { + conn = (HttpURLConnection) url.openConnection(); + } + + // very important to keep the semicolon at the end + String basicAuth = "Basic " + new String(Base64.getEncoder().encode((apiKey + ":").getBytes())); + conn.setRequestProperty("Authorization", basicAuth); + + conn.setRequestMethod(jsonObject != null ? "POST" : "GET"); + conn.setRequestProperty("Content-Type", "application/json"); + conn.setRequestProperty("Accept", "application/json"); + conn.setDoOutput(true); + return conn; + } + + // Workaround for computers that have trouble accepting Planet's SSL certificates + private static SSLSocketFactory getSSLAcceptAllFactory(){ + SSLSocketFactory factory = null; + try { + Security.getProviders(); + final SSLContext ssl = SSLContext.getInstance("TLSv1.2"); + ssl.init(null, new TrustManager[] { new TrustAllCertificates() }, null); + return ssl.getSocketFactory(); + } catch (Exception e) { + logger.error( "Error obtaining SSL factory when opeining Planet REST URL",e); + } + + return factory; + } + + private StringBuilder readStream(InputStream is) throws IOException { + StringBuilder response = new StringBuilder(); + try (BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) { + String responseLine = null; + while ((responseLine = br.readLine()) != null) { + response.append(responseLine.trim()); + } + } + return response; + } + + private Feature[] search(String[] itemTypes, Filter[] filters, Integer maxResults) throws IOException { + + Filter andFilter = getAndFilter(filters); + SearchRequest searchRequest = new SearchRequest(itemTypes, andFilter); + + String response = sendRequest(new URL("https://api.planet.com/data/v1/quick-search"), searchRequest); + Feature[] featuresInPage = getNextPage(response); + + if (featuresInPage != null && maxResults != null ) { + Arrays.sort(featuresInPage, new FeatureSorter()); + + if (featuresInPage.length > maxResults) { + featuresInPage = ArrayUtils.subarray(featuresInPage, 0, maxResults); + } + ArrayUtils.reverse(featuresInPage); + } + + return featuresInPage; + + } + + private Feature[] getNextPage(String resJson) throws IOException { + if (StringUtils.isNotBlank(resJson)) { + Response resp = gson.fromJson(resJson, Response.class); + Feature[] features = resp.getFeatures(); + Links links = resp.getLinks(); + if (links != null && links.getNext() != null) { + String nextUrl = links.getNext(); + String res = sendRequest(new URL(nextUrl), null); + Feature[] nextFeatures = getNextPage(res); + return ArrayUtils.addAll(features, nextFeatures); + } else { + return features; + } + } else { + return new Feature[] {}; + } + } + + private String getLayers(Feature[] features) throws IOException { + String layerUrl = ""; + if (features.length > 0) { + String[] ids = new String[features.length]; + for (int i = 0; i < ids.length; i++) { + Feature feature = features[i]; + + String idSearch = feature.getProperties().getItemType() + ':' + feature.getId(); + ids[i] = idSearch; + } + + SearchRequest layerRequest = new SearchRequest(ids); + String layers = sendRequest(new URL("https://tiles0.planet.com/data/v1/layers"), layerRequest); + LayerResponse layerResponse = gson.fromJson(layers, LayerResponse.class); + if (layerResponse != null) { + layerUrl = layerResponse.getTiles()[0]; + } + } + return layerUrl; + } + + private Feature[] getFeatures (PlanetRequestParameters planetRequestParameters ) throws IOException { + Calendar thresholdQuality = Calendar.getInstance(); + thresholdQuality.set(2016, 0,1); + + GeoJson geometry = new GeoJson("Polygon", planetRequestParameters.getCoords()); + Filter geometryFilter = getGeometryFilter(geometry); + Filter[] filters = null; + /* maybe we can use test quality anyway + * it gets complicated when the filter start/end date is multiyear + */ + if( planetRequestParameters.getStart().before( thresholdQuality.getTime() ) && planetRequestParameters.getEnd().after( thresholdQuality.getTime() ) ) { + + Filter qualityFilter = getStringInFilter("quality_category", new String[] { "standard" }); + Filter before2016Filter = getDateFilter(planetRequestParameters.getStart(), thresholdQuality.getTime() ); + Filter after2016Filter = getDateFilter(thresholdQuality.getTime(), planetRequestParameters.getEnd() ); + + Filter after2016AndStandardQuality = getAndFilter( new Filter[] { after2016Filter, qualityFilter } ); + Filter before2016OrAfter2016AndStandardQuality = getOrFilter( new Filter[] { before2016Filter, after2016AndStandardQuality } ); + + // Add quality filter only for images after 2016 + + filters = new Filter[] { before2016OrAfter2016AndStandardQuality, geometryFilter }; + + }else if( planetRequestParameters.getStart().after( thresholdQuality.getTime() ) ) { + Filter dateFilter = getDateFilter(planetRequestParameters.getStart(), planetRequestParameters.getEnd()); + // Add quality filter only for images after 2016 + Filter qualityFilter = getStringInFilter("quality_category", new String[] { "standard" }); + filters = new Filter[] { dateFilter, geometryFilter, qualityFilter }; + }else { + Filter dateFilter = getDateFilter(planetRequestParameters.getStart(), planetRequestParameters.getEnd()); + filters = new Filter[] { dateFilter, geometryFilter }; + } + + return search(planetRequestParameters.getItemTypes(), filters, null); + } + + public String getLayerUrl(PlanetRequestParameters planetRequestParameters) throws IOException { + Feature[] searchResults = getFeatures (planetRequestParameters); + return searchResults!=null ? getLayers(searchResults) : null; + } + + public Map getAvailableDates(PlanetRequestParameters planetRequestParameters) throws IOException { + + Feature[] searchResults = getFeatures (planetRequestParameters); + + Map datesAvailable = new HashMap<>(); + + Calendar cal = Calendar.getInstance(); + if( searchResults != null ) { + for (Feature feature : searchResults) { + cal.setTime( feature.getProperties().acquired ); + int year = cal.get( Calendar.YEAR ); + int month = cal.get( Calendar.MONTH ) + 1; + int day = cal.get( Calendar.DATE ); + datesAvailable.put( year+""+ ( month<10?"0"+month:month ), "true"); // THe month, in order to know for whcioh moinths there are images + datesAvailable.put( year+""+ ( month<10?"0"+month:month )+ ( day<10?"0"+day:day ), "true"); + } + } + return datesAvailable; + } + + public String getLatestUrl(SimplePlacemarkObject placemarkObject) throws IOException { + LocalDateTime localDateTime = DateUtils.asLocalDateTime(new Date()); + Date start = DateUtils.asDate(localDateTime.minusDays(30)); + + List shape = placemarkObject.getMultiShape().get(0); + + double[][][] polygon = new double[1][shape.size()][2]; + int i = 0; + for (SimpleCoordinate simpleCoordinate : shape) { + polygon[0][i][1] = Double.parseDouble(simpleCoordinate.getLatitude()); + polygon[0][i++][0] = Double.parseDouble(simpleCoordinate.getLongitude()); + } + String[] itemTypes = { "PSScene3Band", "PSScene4Band" }; + return getLayerUrl(new PlanetRequestParameters(start, new Date(), polygon, itemTypes)); } - } From c0872f50025997ed04bef00ffa102bcc5a37e74f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:42 +0100 Subject: [PATCH 0575/1620] New translations PlanetImagery.java (Spanish) --- .../earth/app/view/Messages_es.properties | 346 +++++++++++++++++- 1 file changed, 340 insertions(+), 6 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index a3da2ae001..34f161190b 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,10 +1,344 @@ package org.openforis.collect.earth.planet; -public final class PlanetAttributes { +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.security.Security; +import java.time.LocalDateTime; +import java.util.Arrays; +import java.util.Base64; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; - private PlanetAttributes() {} - - public static final String ACQUIRED = "acquired"; - public static final String GEOMETRY = "geometry"; - +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; + +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.service.TrustAllCertificates; +import org.openforis.collect.earth.sampler.model.SimpleCoordinate; +import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +public class PlanetImagery { + + private static final Logger logger = LoggerFactory.getLogger(PlanetImagery.class); + private static final Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").create(); + private static final SSLSocketFactory factory = getSSLAcceptAllFactory(); + + private String apiKey; + + private int retries = 0; + + private static final int MAX_RETRIES = 6; + + public PlanetImagery(String apiKey) { + super(); + this.apiKey = apiKey; + } + + private Filter getDateFilter(Date start, Date end) { + Filter dateFilter = new Filter<>(); + dateFilter.setType(FilterType.DATERANGE); + dateFilter.setFieldName(PlanetAttributes.ACQUIRED); + dateFilter.setConfig(new FilterConfig(new DatePlanet(start), new DatePlanet(end))); + return dateFilter; + } + + private Filter withinDaysFilter(Feature feature, int days) { + Date acquriredDate = feature.getProperties().getAcquired(); + LocalDateTime localDateTime = DateUtils.asLocalDateTime(acquriredDate); + Date start = DateUtils.asDate(localDateTime.minusDays(days)); + Date end = DateUtils.asDate(localDateTime.plusDays(days - 1)); + return getDateFilter(start, end); + } + + private Filter getGeometryFilter(GeoJson geoJson) { + Filter geoFilter = new Filter<>(); + geoFilter.setType(FilterType.GEOMETRY); + geoFilter.setFieldName(PlanetAttributes.GEOMETRY); + geoFilter.setConfig(new FilterConfig(geoJson.getType(), geoJson.getCoordinates())); + return geoFilter; + } + + private Filter getAndFilter(Filter[] filters) { + Filter andFilter = new Filter<>(); + andFilter.setType(FilterType.AND); + andFilter.setConfig(filters); + return andFilter; + } + + private Filter getOrFilter(Filter[] filters) { + Filter andFilter = new Filter<>(); + andFilter.setType(FilterType.OR); + andFilter.setConfig(filters); + return andFilter; + } + + private Filter getStringInFilter(String fieldName, String[] strings) { + Filter stringInFilter = new Filter<>(); + stringInFilter.setType(FilterType.STRING_IN); + stringInFilter.setFieldName(fieldName); + stringInFilter.setConfig(strings); + return stringInFilter; + } + + private int getQuality(Feature feature) { + FeatureProperties p = feature.getProperties(); + Integer quality = p.getClearPercent(); + if (quality != null) + return quality; + else { + return (int) ((1 - p.getCloudCover()) * 50); + } + } + + private String sendRequest(URL url, Object jsonObject) throws IOException { + try { + + HttpURLConnection conn = getAuthenticatedConnection(url, jsonObject); + + buildRequet(jsonObject, conn); + + StringBuilder response = null; + try { + response = readStream(conn.getInputStream()); + } finally { + conn.disconnect(); + } + + retries = 0; // reset the counter as it was a success + return response.toString(); + } catch (IOException e) { + if( e.getMessage()!=null && e.getMessage().contains("429") ) { // This happens when there are too many consecutive requests! Make the user wait a bit and try again! + try { + if( retries < MAX_RETRIES ) { + Thread.sleep( 5000 ); + retries++; + }else { + retries = 0; + throw e; + } + } catch (InterruptedException e1) { + logger.error( "Error waiting for Thread requesting Planet imagery"); + } + return sendRequest(url, jsonObject); + }else { + throw e; // Another type of error throw! + } + } + } + + private void buildRequet(Object jsonObject, HttpURLConnection conn) + throws IOException { + byte[] postDataBytes = null; + if (jsonObject != null) { + String jsonInputString = gson.toJson(jsonObject); + postDataBytes = jsonInputString.getBytes( StandardCharsets.UTF_8.name()); + logger.info(jsonInputString); + } + if (postDataBytes != null) { + conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length)); + conn.getOutputStream().write(postDataBytes); + } else { + conn.setRequestProperty("Content-Length", "0"); + } + } + + private HttpURLConnection getAuthenticatedConnection(URL url, Object jsonObject) + throws IOException { + HttpURLConnection conn = null; + if( factory != null ) { // THIS IS A WORKAROUND TO REMOVE SSL CERTIFICATE ISSUES + conn = (HttpsURLConnection) url.openConnection(); + ((HttpsURLConnection)conn).setSSLSocketFactory(factory); + }else { + conn = (HttpURLConnection) url.openConnection(); + } + + // very important to keep the semicolon at the end + String basicAuth = "Basic " + new String(Base64.getEncoder().encode((apiKey + ":").getBytes())); + conn.setRequestProperty("Authorization", basicAuth); + + conn.setRequestMethod(jsonObject != null ? "POST" : "GET"); + conn.setRequestProperty("Content-Type", "application/json"); + conn.setRequestProperty("Accept", "application/json"); + conn.setDoOutput(true); + return conn; + } + + // Workaround for computers that have trouble accepting Planet's SSL certificates + private static SSLSocketFactory getSSLAcceptAllFactory(){ + SSLSocketFactory factory = null; + try { + Security.getProviders(); + final SSLContext ssl = SSLContext.getInstance("TLSv1.2"); + ssl.init(null, new TrustManager[] { new TrustAllCertificates() }, null); + return ssl.getSocketFactory(); + } catch (Exception e) { + logger.error( "Error obtaining SSL factory when opeining Planet REST URL",e); + } + + return factory; + } + + private StringBuilder readStream(InputStream is) throws IOException { + StringBuilder response = new StringBuilder(); + try (BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) { + String responseLine = null; + while ((responseLine = br.readLine()) != null) { + response.append(responseLine.trim()); + } + } + return response; + } + + private Feature[] search(String[] itemTypes, Filter[] filters, Integer maxResults) throws IOException { + + Filter andFilter = getAndFilter(filters); + SearchRequest searchRequest = new SearchRequest(itemTypes, andFilter); + + String response = sendRequest(new URL("https://api.planet.com/data/v1/quick-search"), searchRequest); + Feature[] featuresInPage = getNextPage(response); + + if (featuresInPage != null && maxResults != null ) { + Arrays.sort(featuresInPage, new FeatureSorter()); + + if (featuresInPage.length > maxResults) { + featuresInPage = ArrayUtils.subarray(featuresInPage, 0, maxResults); + } + ArrayUtils.reverse(featuresInPage); + } + + return featuresInPage; + + } + + private Feature[] getNextPage(String resJson) throws IOException { + if (StringUtils.isNotBlank(resJson)) { + Response resp = gson.fromJson(resJson, Response.class); + Feature[] features = resp.getFeatures(); + Links links = resp.getLinks(); + if (links != null && links.getNext() != null) { + String nextUrl = links.getNext(); + String res = sendRequest(new URL(nextUrl), null); + Feature[] nextFeatures = getNextPage(res); + return ArrayUtils.addAll(features, nextFeatures); + } else { + return features; + } + } else { + return new Feature[] {}; + } + } + + private String getLayers(Feature[] features) throws IOException { + String layerUrl = ""; + if (features.length > 0) { + String[] ids = new String[features.length]; + for (int i = 0; i < ids.length; i++) { + Feature feature = features[i]; + + String idSearch = feature.getProperties().getItemType() + ':' + feature.getId(); + ids[i] = idSearch; + } + + SearchRequest layerRequest = new SearchRequest(ids); + String layers = sendRequest(new URL("https://tiles0.planet.com/data/v1/layers"), layerRequest); + LayerResponse layerResponse = gson.fromJson(layers, LayerResponse.class); + if (layerResponse != null) { + layerUrl = layerResponse.getTiles()[0]; + } + } + return layerUrl; + } + + private Feature[] getFeatures (PlanetRequestParameters planetRequestParameters ) throws IOException { + Calendar thresholdQuality = Calendar.getInstance(); + thresholdQuality.set(2016, 0,1); + + GeoJson geometry = new GeoJson("Polygon", planetRequestParameters.getCoords()); + Filter geometryFilter = getGeometryFilter(geometry); + Filter[] filters = null; + /* maybe we can use test quality anyway + * it gets complicated when the filter start/end date is multiyear + */ + if( planetRequestParameters.getStart().before( thresholdQuality.getTime() ) && planetRequestParameters.getEnd().after( thresholdQuality.getTime() ) ) { + + Filter qualityFilter = getStringInFilter("quality_category", new String[] { "standard" }); + Filter before2016Filter = getDateFilter(planetRequestParameters.getStart(), thresholdQuality.getTime() ); + Filter after2016Filter = getDateFilter(thresholdQuality.getTime(), planetRequestParameters.getEnd() ); + + Filter after2016AndStandardQuality = getAndFilter( new Filter[] { after2016Filter, qualityFilter } ); + Filter before2016OrAfter2016AndStandardQuality = getOrFilter( new Filter[] { before2016Filter, after2016AndStandardQuality } ); + + // Add quality filter only for images after 2016 + + filters = new Filter[] { before2016OrAfter2016AndStandardQuality, geometryFilter }; + + }else if( planetRequestParameters.getStart().after( thresholdQuality.getTime() ) ) { + Filter dateFilter = getDateFilter(planetRequestParameters.getStart(), planetRequestParameters.getEnd()); + // Add quality filter only for images after 2016 + Filter qualityFilter = getStringInFilter("quality_category", new String[] { "standard" }); + filters = new Filter[] { dateFilter, geometryFilter, qualityFilter }; + }else { + Filter dateFilter = getDateFilter(planetRequestParameters.getStart(), planetRequestParameters.getEnd()); + filters = new Filter[] { dateFilter, geometryFilter }; + } + + return search(planetRequestParameters.getItemTypes(), filters, null); + } + + public String getLayerUrl(PlanetRequestParameters planetRequestParameters) throws IOException { + Feature[] searchResults = getFeatures (planetRequestParameters); + return searchResults!=null ? getLayers(searchResults) : null; + } + + public Map getAvailableDates(PlanetRequestParameters planetRequestParameters) throws IOException { + + Feature[] searchResults = getFeatures (planetRequestParameters); + + Map datesAvailable = new HashMap<>(); + + Calendar cal = Calendar.getInstance(); + if( searchResults != null ) { + for (Feature feature : searchResults) { + cal.setTime( feature.getProperties().acquired ); + int year = cal.get( Calendar.YEAR ); + int month = cal.get( Calendar.MONTH ) + 1; + int day = cal.get( Calendar.DATE ); + datesAvailable.put( year+""+ ( month<10?"0"+month:month ), "true"); // THe month, in order to know for whcioh moinths there are images + datesAvailable.put( year+""+ ( month<10?"0"+month:month )+ ( day<10?"0"+day:day ), "true"); + } + } + return datesAvailable; + } + + public String getLatestUrl(SimplePlacemarkObject placemarkObject) throws IOException { + LocalDateTime localDateTime = DateUtils.asLocalDateTime(new Date()); + Date start = DateUtils.asDate(localDateTime.minusDays(30)); + + List shape = placemarkObject.getMultiShape().get(0); + + double[][][] polygon = new double[1][shape.size()][2]; + int i = 0; + for (SimpleCoordinate simpleCoordinate : shape) { + polygon[0][i][1] = Double.parseDouble(simpleCoordinate.getLatitude()); + polygon[0][i++][0] = Double.parseDouble(simpleCoordinate.getLongitude()); + } + String[] itemTypes = { "PSScene3Band", "PSScene4Band" }; + return getLayerUrl(new PlanetRequestParameters(start, new Date(), polygon, itemTypes)); + } } From 99ffc6d3555aaa739f20d7b77f80a1b5f4132f1d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:44 +0100 Subject: [PATCH 0576/1620] New translations PlanetImagery.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 346 +++++++++++++++++- 1 file changed, 340 insertions(+), 6 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index a3da2ae001..34f161190b 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,10 +1,344 @@ package org.openforis.collect.earth.planet; -public final class PlanetAttributes { +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.security.Security; +import java.time.LocalDateTime; +import java.util.Arrays; +import java.util.Base64; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; - private PlanetAttributes() {} - - public static final String ACQUIRED = "acquired"; - public static final String GEOMETRY = "geometry"; - +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; + +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.service.TrustAllCertificates; +import org.openforis.collect.earth.sampler.model.SimpleCoordinate; +import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +public class PlanetImagery { + + private static final Logger logger = LoggerFactory.getLogger(PlanetImagery.class); + private static final Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").create(); + private static final SSLSocketFactory factory = getSSLAcceptAllFactory(); + + private String apiKey; + + private int retries = 0; + + private static final int MAX_RETRIES = 6; + + public PlanetImagery(String apiKey) { + super(); + this.apiKey = apiKey; + } + + private Filter getDateFilter(Date start, Date end) { + Filter dateFilter = new Filter<>(); + dateFilter.setType(FilterType.DATERANGE); + dateFilter.setFieldName(PlanetAttributes.ACQUIRED); + dateFilter.setConfig(new FilterConfig(new DatePlanet(start), new DatePlanet(end))); + return dateFilter; + } + + private Filter withinDaysFilter(Feature feature, int days) { + Date acquriredDate = feature.getProperties().getAcquired(); + LocalDateTime localDateTime = DateUtils.asLocalDateTime(acquriredDate); + Date start = DateUtils.asDate(localDateTime.minusDays(days)); + Date end = DateUtils.asDate(localDateTime.plusDays(days - 1)); + return getDateFilter(start, end); + } + + private Filter getGeometryFilter(GeoJson geoJson) { + Filter geoFilter = new Filter<>(); + geoFilter.setType(FilterType.GEOMETRY); + geoFilter.setFieldName(PlanetAttributes.GEOMETRY); + geoFilter.setConfig(new FilterConfig(geoJson.getType(), geoJson.getCoordinates())); + return geoFilter; + } + + private Filter getAndFilter(Filter[] filters) { + Filter andFilter = new Filter<>(); + andFilter.setType(FilterType.AND); + andFilter.setConfig(filters); + return andFilter; + } + + private Filter getOrFilter(Filter[] filters) { + Filter andFilter = new Filter<>(); + andFilter.setType(FilterType.OR); + andFilter.setConfig(filters); + return andFilter; + } + + private Filter getStringInFilter(String fieldName, String[] strings) { + Filter stringInFilter = new Filter<>(); + stringInFilter.setType(FilterType.STRING_IN); + stringInFilter.setFieldName(fieldName); + stringInFilter.setConfig(strings); + return stringInFilter; + } + + private int getQuality(Feature feature) { + FeatureProperties p = feature.getProperties(); + Integer quality = p.getClearPercent(); + if (quality != null) + return quality; + else { + return (int) ((1 - p.getCloudCover()) * 50); + } + } + + private String sendRequest(URL url, Object jsonObject) throws IOException { + try { + + HttpURLConnection conn = getAuthenticatedConnection(url, jsonObject); + + buildRequet(jsonObject, conn); + + StringBuilder response = null; + try { + response = readStream(conn.getInputStream()); + } finally { + conn.disconnect(); + } + + retries = 0; // reset the counter as it was a success + return response.toString(); + } catch (IOException e) { + if( e.getMessage()!=null && e.getMessage().contains("429") ) { // This happens when there are too many consecutive requests! Make the user wait a bit and try again! + try { + if( retries < MAX_RETRIES ) { + Thread.sleep( 5000 ); + retries++; + }else { + retries = 0; + throw e; + } + } catch (InterruptedException e1) { + logger.error( "Error waiting for Thread requesting Planet imagery"); + } + return sendRequest(url, jsonObject); + }else { + throw e; // Another type of error throw! + } + } + } + + private void buildRequet(Object jsonObject, HttpURLConnection conn) + throws IOException { + byte[] postDataBytes = null; + if (jsonObject != null) { + String jsonInputString = gson.toJson(jsonObject); + postDataBytes = jsonInputString.getBytes( StandardCharsets.UTF_8.name()); + logger.info(jsonInputString); + } + if (postDataBytes != null) { + conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length)); + conn.getOutputStream().write(postDataBytes); + } else { + conn.setRequestProperty("Content-Length", "0"); + } + } + + private HttpURLConnection getAuthenticatedConnection(URL url, Object jsonObject) + throws IOException { + HttpURLConnection conn = null; + if( factory != null ) { // THIS IS A WORKAROUND TO REMOVE SSL CERTIFICATE ISSUES + conn = (HttpsURLConnection) url.openConnection(); + ((HttpsURLConnection)conn).setSSLSocketFactory(factory); + }else { + conn = (HttpURLConnection) url.openConnection(); + } + + // very important to keep the semicolon at the end + String basicAuth = "Basic " + new String(Base64.getEncoder().encode((apiKey + ":").getBytes())); + conn.setRequestProperty("Authorization", basicAuth); + + conn.setRequestMethod(jsonObject != null ? "POST" : "GET"); + conn.setRequestProperty("Content-Type", "application/json"); + conn.setRequestProperty("Accept", "application/json"); + conn.setDoOutput(true); + return conn; + } + + // Workaround for computers that have trouble accepting Planet's SSL certificates + private static SSLSocketFactory getSSLAcceptAllFactory(){ + SSLSocketFactory factory = null; + try { + Security.getProviders(); + final SSLContext ssl = SSLContext.getInstance("TLSv1.2"); + ssl.init(null, new TrustManager[] { new TrustAllCertificates() }, null); + return ssl.getSocketFactory(); + } catch (Exception e) { + logger.error( "Error obtaining SSL factory when opeining Planet REST URL",e); + } + + return factory; + } + + private StringBuilder readStream(InputStream is) throws IOException { + StringBuilder response = new StringBuilder(); + try (BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) { + String responseLine = null; + while ((responseLine = br.readLine()) != null) { + response.append(responseLine.trim()); + } + } + return response; + } + + private Feature[] search(String[] itemTypes, Filter[] filters, Integer maxResults) throws IOException { + + Filter andFilter = getAndFilter(filters); + SearchRequest searchRequest = new SearchRequest(itemTypes, andFilter); + + String response = sendRequest(new URL("https://api.planet.com/data/v1/quick-search"), searchRequest); + Feature[] featuresInPage = getNextPage(response); + + if (featuresInPage != null && maxResults != null ) { + Arrays.sort(featuresInPage, new FeatureSorter()); + + if (featuresInPage.length > maxResults) { + featuresInPage = ArrayUtils.subarray(featuresInPage, 0, maxResults); + } + ArrayUtils.reverse(featuresInPage); + } + + return featuresInPage; + + } + + private Feature[] getNextPage(String resJson) throws IOException { + if (StringUtils.isNotBlank(resJson)) { + Response resp = gson.fromJson(resJson, Response.class); + Feature[] features = resp.getFeatures(); + Links links = resp.getLinks(); + if (links != null && links.getNext() != null) { + String nextUrl = links.getNext(); + String res = sendRequest(new URL(nextUrl), null); + Feature[] nextFeatures = getNextPage(res); + return ArrayUtils.addAll(features, nextFeatures); + } else { + return features; + } + } else { + return new Feature[] {}; + } + } + + private String getLayers(Feature[] features) throws IOException { + String layerUrl = ""; + if (features.length > 0) { + String[] ids = new String[features.length]; + for (int i = 0; i < ids.length; i++) { + Feature feature = features[i]; + + String idSearch = feature.getProperties().getItemType() + ':' + feature.getId(); + ids[i] = idSearch; + } + + SearchRequest layerRequest = new SearchRequest(ids); + String layers = sendRequest(new URL("https://tiles0.planet.com/data/v1/layers"), layerRequest); + LayerResponse layerResponse = gson.fromJson(layers, LayerResponse.class); + if (layerResponse != null) { + layerUrl = layerResponse.getTiles()[0]; + } + } + return layerUrl; + } + + private Feature[] getFeatures (PlanetRequestParameters planetRequestParameters ) throws IOException { + Calendar thresholdQuality = Calendar.getInstance(); + thresholdQuality.set(2016, 0,1); + + GeoJson geometry = new GeoJson("Polygon", planetRequestParameters.getCoords()); + Filter geometryFilter = getGeometryFilter(geometry); + Filter[] filters = null; + /* maybe we can use test quality anyway + * it gets complicated when the filter start/end date is multiyear + */ + if( planetRequestParameters.getStart().before( thresholdQuality.getTime() ) && planetRequestParameters.getEnd().after( thresholdQuality.getTime() ) ) { + + Filter qualityFilter = getStringInFilter("quality_category", new String[] { "standard" }); + Filter before2016Filter = getDateFilter(planetRequestParameters.getStart(), thresholdQuality.getTime() ); + Filter after2016Filter = getDateFilter(thresholdQuality.getTime(), planetRequestParameters.getEnd() ); + + Filter after2016AndStandardQuality = getAndFilter( new Filter[] { after2016Filter, qualityFilter } ); + Filter before2016OrAfter2016AndStandardQuality = getOrFilter( new Filter[] { before2016Filter, after2016AndStandardQuality } ); + + // Add quality filter only for images after 2016 + + filters = new Filter[] { before2016OrAfter2016AndStandardQuality, geometryFilter }; + + }else if( planetRequestParameters.getStart().after( thresholdQuality.getTime() ) ) { + Filter dateFilter = getDateFilter(planetRequestParameters.getStart(), planetRequestParameters.getEnd()); + // Add quality filter only for images after 2016 + Filter qualityFilter = getStringInFilter("quality_category", new String[] { "standard" }); + filters = new Filter[] { dateFilter, geometryFilter, qualityFilter }; + }else { + Filter dateFilter = getDateFilter(planetRequestParameters.getStart(), planetRequestParameters.getEnd()); + filters = new Filter[] { dateFilter, geometryFilter }; + } + + return search(planetRequestParameters.getItemTypes(), filters, null); + } + + public String getLayerUrl(PlanetRequestParameters planetRequestParameters) throws IOException { + Feature[] searchResults = getFeatures (planetRequestParameters); + return searchResults!=null ? getLayers(searchResults) : null; + } + + public Map getAvailableDates(PlanetRequestParameters planetRequestParameters) throws IOException { + + Feature[] searchResults = getFeatures (planetRequestParameters); + + Map datesAvailable = new HashMap<>(); + + Calendar cal = Calendar.getInstance(); + if( searchResults != null ) { + for (Feature feature : searchResults) { + cal.setTime( feature.getProperties().acquired ); + int year = cal.get( Calendar.YEAR ); + int month = cal.get( Calendar.MONTH ) + 1; + int day = cal.get( Calendar.DATE ); + datesAvailable.put( year+""+ ( month<10?"0"+month:month ), "true"); // THe month, in order to know for whcioh moinths there are images + datesAvailable.put( year+""+ ( month<10?"0"+month:month )+ ( day<10?"0"+day:day ), "true"); + } + } + return datesAvailable; + } + + public String getLatestUrl(SimplePlacemarkObject placemarkObject) throws IOException { + LocalDateTime localDateTime = DateUtils.asLocalDateTime(new Date()); + Date start = DateUtils.asDate(localDateTime.minusDays(30)); + + List shape = placemarkObject.getMultiShape().get(0); + + double[][][] polygon = new double[1][shape.size()][2]; + int i = 0; + for (SimpleCoordinate simpleCoordinate : shape) { + polygon[0][i][1] = Double.parseDouble(simpleCoordinate.getLatitude()); + polygon[0][i++][0] = Double.parseDouble(simpleCoordinate.getLongitude()); + } + String[] itemTypes = { "PSScene3Band", "PSScene4Band" }; + return getLayerUrl(new PlanetRequestParameters(start, new Date(), polygon, itemTypes)); + } } From c039ae2c1b3da24e0e9af1f1cae74cdd2950d76b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:45 +0100 Subject: [PATCH 0577/1620] New translations PlanetImagery.java (English) --- .../earth/app/view/Messages_en.properties | 346 +++++++++++++++++- 1 file changed, 340 insertions(+), 6 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index a3da2ae001..34f161190b 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,10 +1,344 @@ package org.openforis.collect.earth.planet; -public final class PlanetAttributes { +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.security.Security; +import java.time.LocalDateTime; +import java.util.Arrays; +import java.util.Base64; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; - private PlanetAttributes() {} - - public static final String ACQUIRED = "acquired"; - public static final String GEOMETRY = "geometry"; - +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; + +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.service.TrustAllCertificates; +import org.openforis.collect.earth.sampler.model.SimpleCoordinate; +import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +public class PlanetImagery { + + private static final Logger logger = LoggerFactory.getLogger(PlanetImagery.class); + private static final Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").create(); + private static final SSLSocketFactory factory = getSSLAcceptAllFactory(); + + private String apiKey; + + private int retries = 0; + + private static final int MAX_RETRIES = 6; + + public PlanetImagery(String apiKey) { + super(); + this.apiKey = apiKey; + } + + private Filter getDateFilter(Date start, Date end) { + Filter dateFilter = new Filter<>(); + dateFilter.setType(FilterType.DATERANGE); + dateFilter.setFieldName(PlanetAttributes.ACQUIRED); + dateFilter.setConfig(new FilterConfig(new DatePlanet(start), new DatePlanet(end))); + return dateFilter; + } + + private Filter withinDaysFilter(Feature feature, int days) { + Date acquriredDate = feature.getProperties().getAcquired(); + LocalDateTime localDateTime = DateUtils.asLocalDateTime(acquriredDate); + Date start = DateUtils.asDate(localDateTime.minusDays(days)); + Date end = DateUtils.asDate(localDateTime.plusDays(days - 1)); + return getDateFilter(start, end); + } + + private Filter getGeometryFilter(GeoJson geoJson) { + Filter geoFilter = new Filter<>(); + geoFilter.setType(FilterType.GEOMETRY); + geoFilter.setFieldName(PlanetAttributes.GEOMETRY); + geoFilter.setConfig(new FilterConfig(geoJson.getType(), geoJson.getCoordinates())); + return geoFilter; + } + + private Filter getAndFilter(Filter[] filters) { + Filter andFilter = new Filter<>(); + andFilter.setType(FilterType.AND); + andFilter.setConfig(filters); + return andFilter; + } + + private Filter getOrFilter(Filter[] filters) { + Filter andFilter = new Filter<>(); + andFilter.setType(FilterType.OR); + andFilter.setConfig(filters); + return andFilter; + } + + private Filter getStringInFilter(String fieldName, String[] strings) { + Filter stringInFilter = new Filter<>(); + stringInFilter.setType(FilterType.STRING_IN); + stringInFilter.setFieldName(fieldName); + stringInFilter.setConfig(strings); + return stringInFilter; + } + + private int getQuality(Feature feature) { + FeatureProperties p = feature.getProperties(); + Integer quality = p.getClearPercent(); + if (quality != null) + return quality; + else { + return (int) ((1 - p.getCloudCover()) * 50); + } + } + + private String sendRequest(URL url, Object jsonObject) throws IOException { + try { + + HttpURLConnection conn = getAuthenticatedConnection(url, jsonObject); + + buildRequet(jsonObject, conn); + + StringBuilder response = null; + try { + response = readStream(conn.getInputStream()); + } finally { + conn.disconnect(); + } + + retries = 0; // reset the counter as it was a success + return response.toString(); + } catch (IOException e) { + if( e.getMessage()!=null && e.getMessage().contains("429") ) { // This happens when there are too many consecutive requests! Make the user wait a bit and try again! + try { + if( retries < MAX_RETRIES ) { + Thread.sleep( 5000 ); + retries++; + }else { + retries = 0; + throw e; + } + } catch (InterruptedException e1) { + logger.error( "Error waiting for Thread requesting Planet imagery"); + } + return sendRequest(url, jsonObject); + }else { + throw e; // Another type of error throw! + } + } + } + + private void buildRequet(Object jsonObject, HttpURLConnection conn) + throws IOException { + byte[] postDataBytes = null; + if (jsonObject != null) { + String jsonInputString = gson.toJson(jsonObject); + postDataBytes = jsonInputString.getBytes( StandardCharsets.UTF_8.name()); + logger.info(jsonInputString); + } + if (postDataBytes != null) { + conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length)); + conn.getOutputStream().write(postDataBytes); + } else { + conn.setRequestProperty("Content-Length", "0"); + } + } + + private HttpURLConnection getAuthenticatedConnection(URL url, Object jsonObject) + throws IOException { + HttpURLConnection conn = null; + if( factory != null ) { // THIS IS A WORKAROUND TO REMOVE SSL CERTIFICATE ISSUES + conn = (HttpsURLConnection) url.openConnection(); + ((HttpsURLConnection)conn).setSSLSocketFactory(factory); + }else { + conn = (HttpURLConnection) url.openConnection(); + } + + // very important to keep the semicolon at the end + String basicAuth = "Basic " + new String(Base64.getEncoder().encode((apiKey + ":").getBytes())); + conn.setRequestProperty("Authorization", basicAuth); + + conn.setRequestMethod(jsonObject != null ? "POST" : "GET"); + conn.setRequestProperty("Content-Type", "application/json"); + conn.setRequestProperty("Accept", "application/json"); + conn.setDoOutput(true); + return conn; + } + + // Workaround for computers that have trouble accepting Planet's SSL certificates + private static SSLSocketFactory getSSLAcceptAllFactory(){ + SSLSocketFactory factory = null; + try { + Security.getProviders(); + final SSLContext ssl = SSLContext.getInstance("TLSv1.2"); + ssl.init(null, new TrustManager[] { new TrustAllCertificates() }, null); + return ssl.getSocketFactory(); + } catch (Exception e) { + logger.error( "Error obtaining SSL factory when opeining Planet REST URL",e); + } + + return factory; + } + + private StringBuilder readStream(InputStream is) throws IOException { + StringBuilder response = new StringBuilder(); + try (BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) { + String responseLine = null; + while ((responseLine = br.readLine()) != null) { + response.append(responseLine.trim()); + } + } + return response; + } + + private Feature[] search(String[] itemTypes, Filter[] filters, Integer maxResults) throws IOException { + + Filter andFilter = getAndFilter(filters); + SearchRequest searchRequest = new SearchRequest(itemTypes, andFilter); + + String response = sendRequest(new URL("https://api.planet.com/data/v1/quick-search"), searchRequest); + Feature[] featuresInPage = getNextPage(response); + + if (featuresInPage != null && maxResults != null ) { + Arrays.sort(featuresInPage, new FeatureSorter()); + + if (featuresInPage.length > maxResults) { + featuresInPage = ArrayUtils.subarray(featuresInPage, 0, maxResults); + } + ArrayUtils.reverse(featuresInPage); + } + + return featuresInPage; + + } + + private Feature[] getNextPage(String resJson) throws IOException { + if (StringUtils.isNotBlank(resJson)) { + Response resp = gson.fromJson(resJson, Response.class); + Feature[] features = resp.getFeatures(); + Links links = resp.getLinks(); + if (links != null && links.getNext() != null) { + String nextUrl = links.getNext(); + String res = sendRequest(new URL(nextUrl), null); + Feature[] nextFeatures = getNextPage(res); + return ArrayUtils.addAll(features, nextFeatures); + } else { + return features; + } + } else { + return new Feature[] {}; + } + } + + private String getLayers(Feature[] features) throws IOException { + String layerUrl = ""; + if (features.length > 0) { + String[] ids = new String[features.length]; + for (int i = 0; i < ids.length; i++) { + Feature feature = features[i]; + + String idSearch = feature.getProperties().getItemType() + ':' + feature.getId(); + ids[i] = idSearch; + } + + SearchRequest layerRequest = new SearchRequest(ids); + String layers = sendRequest(new URL("https://tiles0.planet.com/data/v1/layers"), layerRequest); + LayerResponse layerResponse = gson.fromJson(layers, LayerResponse.class); + if (layerResponse != null) { + layerUrl = layerResponse.getTiles()[0]; + } + } + return layerUrl; + } + + private Feature[] getFeatures (PlanetRequestParameters planetRequestParameters ) throws IOException { + Calendar thresholdQuality = Calendar.getInstance(); + thresholdQuality.set(2016, 0,1); + + GeoJson geometry = new GeoJson("Polygon", planetRequestParameters.getCoords()); + Filter geometryFilter = getGeometryFilter(geometry); + Filter[] filters = null; + /* maybe we can use test quality anyway + * it gets complicated when the filter start/end date is multiyear + */ + if( planetRequestParameters.getStart().before( thresholdQuality.getTime() ) && planetRequestParameters.getEnd().after( thresholdQuality.getTime() ) ) { + + Filter qualityFilter = getStringInFilter("quality_category", new String[] { "standard" }); + Filter before2016Filter = getDateFilter(planetRequestParameters.getStart(), thresholdQuality.getTime() ); + Filter after2016Filter = getDateFilter(thresholdQuality.getTime(), planetRequestParameters.getEnd() ); + + Filter after2016AndStandardQuality = getAndFilter( new Filter[] { after2016Filter, qualityFilter } ); + Filter before2016OrAfter2016AndStandardQuality = getOrFilter( new Filter[] { before2016Filter, after2016AndStandardQuality } ); + + // Add quality filter only for images after 2016 + + filters = new Filter[] { before2016OrAfter2016AndStandardQuality, geometryFilter }; + + }else if( planetRequestParameters.getStart().after( thresholdQuality.getTime() ) ) { + Filter dateFilter = getDateFilter(planetRequestParameters.getStart(), planetRequestParameters.getEnd()); + // Add quality filter only for images after 2016 + Filter qualityFilter = getStringInFilter("quality_category", new String[] { "standard" }); + filters = new Filter[] { dateFilter, geometryFilter, qualityFilter }; + }else { + Filter dateFilter = getDateFilter(planetRequestParameters.getStart(), planetRequestParameters.getEnd()); + filters = new Filter[] { dateFilter, geometryFilter }; + } + + return search(planetRequestParameters.getItemTypes(), filters, null); + } + + public String getLayerUrl(PlanetRequestParameters planetRequestParameters) throws IOException { + Feature[] searchResults = getFeatures (planetRequestParameters); + return searchResults!=null ? getLayers(searchResults) : null; + } + + public Map getAvailableDates(PlanetRequestParameters planetRequestParameters) throws IOException { + + Feature[] searchResults = getFeatures (planetRequestParameters); + + Map datesAvailable = new HashMap<>(); + + Calendar cal = Calendar.getInstance(); + if( searchResults != null ) { + for (Feature feature : searchResults) { + cal.setTime( feature.getProperties().acquired ); + int year = cal.get( Calendar.YEAR ); + int month = cal.get( Calendar.MONTH ) + 1; + int day = cal.get( Calendar.DATE ); + datesAvailable.put( year+""+ ( month<10?"0"+month:month ), "true"); // THe month, in order to know for whcioh moinths there are images + datesAvailable.put( year+""+ ( month<10?"0"+month:month )+ ( day<10?"0"+day:day ), "true"); + } + } + return datesAvailable; + } + + public String getLatestUrl(SimplePlacemarkObject placemarkObject) throws IOException { + LocalDateTime localDateTime = DateUtils.asLocalDateTime(new Date()); + Date start = DateUtils.asDate(localDateTime.minusDays(30)); + + List shape = placemarkObject.getMultiShape().get(0); + + double[][][] polygon = new double[1][shape.size()][2]; + int i = 0; + for (SimpleCoordinate simpleCoordinate : shape) { + polygon[0][i][1] = Double.parseDouble(simpleCoordinate.getLatitude()); + polygon[0][i++][0] = Double.parseDouble(simpleCoordinate.getLongitude()); + } + String[] itemTypes = { "PSScene3Band", "PSScene4Band" }; + return getLayerUrl(new PlanetRequestParameters(start, new Date(), polygon, itemTypes)); + } } From b2e54215d9ee4ab2cf4ca5c2ce710ac328ef0051 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:46 +0100 Subject: [PATCH 0578/1620] New translations PlanetRequestParameters.java (French) --- .../earth/app/view/Messages_fr.properties | 393 +++--------------- 1 file changed, 49 insertions(+), 344 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 34f161190b..afe14d18fd 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,344 +1,49 @@ -package org.openforis.collect.earth.planet; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.HttpURLConnection; -import java.net.URL; -import java.nio.charset.StandardCharsets; -import java.security.Security; -import java.time.LocalDateTime; -import java.util.Arrays; -import java.util.Base64; -import java.util.Calendar; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSocketFactory; -import javax.net.ssl.TrustManager; - -import org.apache.commons.lang3.ArrayUtils; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.service.TrustAllCertificates; -import org.openforis.collect.earth.sampler.model.SimpleCoordinate; -import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; - -public class PlanetImagery { - - private static final Logger logger = LoggerFactory.getLogger(PlanetImagery.class); - private static final Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").create(); - private static final SSLSocketFactory factory = getSSLAcceptAllFactory(); - - private String apiKey; - - private int retries = 0; - - private static final int MAX_RETRIES = 6; - - public PlanetImagery(String apiKey) { - super(); - this.apiKey = apiKey; - } - - private Filter getDateFilter(Date start, Date end) { - Filter dateFilter = new Filter<>(); - dateFilter.setType(FilterType.DATERANGE); - dateFilter.setFieldName(PlanetAttributes.ACQUIRED); - dateFilter.setConfig(new FilterConfig(new DatePlanet(start), new DatePlanet(end))); - return dateFilter; - } - - private Filter withinDaysFilter(Feature feature, int days) { - Date acquriredDate = feature.getProperties().getAcquired(); - LocalDateTime localDateTime = DateUtils.asLocalDateTime(acquriredDate); - Date start = DateUtils.asDate(localDateTime.minusDays(days)); - Date end = DateUtils.asDate(localDateTime.plusDays(days - 1)); - return getDateFilter(start, end); - } - - private Filter getGeometryFilter(GeoJson geoJson) { - Filter geoFilter = new Filter<>(); - geoFilter.setType(FilterType.GEOMETRY); - geoFilter.setFieldName(PlanetAttributes.GEOMETRY); - geoFilter.setConfig(new FilterConfig(geoJson.getType(), geoJson.getCoordinates())); - return geoFilter; - } - - private Filter getAndFilter(Filter[] filters) { - Filter andFilter = new Filter<>(); - andFilter.setType(FilterType.AND); - andFilter.setConfig(filters); - return andFilter; - } - - private Filter getOrFilter(Filter[] filters) { - Filter andFilter = new Filter<>(); - andFilter.setType(FilterType.OR); - andFilter.setConfig(filters); - return andFilter; - } - - private Filter getStringInFilter(String fieldName, String[] strings) { - Filter stringInFilter = new Filter<>(); - stringInFilter.setType(FilterType.STRING_IN); - stringInFilter.setFieldName(fieldName); - stringInFilter.setConfig(strings); - return stringInFilter; - } - - private int getQuality(Feature feature) { - FeatureProperties p = feature.getProperties(); - Integer quality = p.getClearPercent(); - if (quality != null) - return quality; - else { - return (int) ((1 - p.getCloudCover()) * 50); - } - } - - private String sendRequest(URL url, Object jsonObject) throws IOException { - try { - - HttpURLConnection conn = getAuthenticatedConnection(url, jsonObject); - - buildRequet(jsonObject, conn); - - StringBuilder response = null; - try { - response = readStream(conn.getInputStream()); - } finally { - conn.disconnect(); - } - - retries = 0; // reset the counter as it was a success - return response.toString(); - } catch (IOException e) { - if( e.getMessage()!=null && e.getMessage().contains("429") ) { // This happens when there are too many consecutive requests! Make the user wait a bit and try again! - try { - if( retries < MAX_RETRIES ) { - Thread.sleep( 5000 ); - retries++; - }else { - retries = 0; - throw e; - } - } catch (InterruptedException e1) { - logger.error( "Error waiting for Thread requesting Planet imagery"); - } - return sendRequest(url, jsonObject); - }else { - throw e; // Another type of error throw! - } - } - } - - private void buildRequet(Object jsonObject, HttpURLConnection conn) - throws IOException { - byte[] postDataBytes = null; - if (jsonObject != null) { - String jsonInputString = gson.toJson(jsonObject); - postDataBytes = jsonInputString.getBytes( StandardCharsets.UTF_8.name()); - logger.info(jsonInputString); - } - if (postDataBytes != null) { - conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length)); - conn.getOutputStream().write(postDataBytes); - } else { - conn.setRequestProperty("Content-Length", "0"); - } - } - - private HttpURLConnection getAuthenticatedConnection(URL url, Object jsonObject) - throws IOException { - HttpURLConnection conn = null; - if( factory != null ) { // THIS IS A WORKAROUND TO REMOVE SSL CERTIFICATE ISSUES - conn = (HttpsURLConnection) url.openConnection(); - ((HttpsURLConnection)conn).setSSLSocketFactory(factory); - }else { - conn = (HttpURLConnection) url.openConnection(); - } - - // very important to keep the semicolon at the end - String basicAuth = "Basic " + new String(Base64.getEncoder().encode((apiKey + ":").getBytes())); - conn.setRequestProperty("Authorization", basicAuth); - - conn.setRequestMethod(jsonObject != null ? "POST" : "GET"); - conn.setRequestProperty("Content-Type", "application/json"); - conn.setRequestProperty("Accept", "application/json"); - conn.setDoOutput(true); - return conn; - } - - // Workaround for computers that have trouble accepting Planet's SSL certificates - private static SSLSocketFactory getSSLAcceptAllFactory(){ - SSLSocketFactory factory = null; - try { - Security.getProviders(); - final SSLContext ssl = SSLContext.getInstance("TLSv1.2"); - ssl.init(null, new TrustManager[] { new TrustAllCertificates() }, null); - return ssl.getSocketFactory(); - } catch (Exception e) { - logger.error( "Error obtaining SSL factory when opeining Planet REST URL",e); - } - - return factory; - } - - private StringBuilder readStream(InputStream is) throws IOException { - StringBuilder response = new StringBuilder(); - try (BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) { - String responseLine = null; - while ((responseLine = br.readLine()) != null) { - response.append(responseLine.trim()); - } - } - return response; - } - - private Feature[] search(String[] itemTypes, Filter[] filters, Integer maxResults) throws IOException { - - Filter andFilter = getAndFilter(filters); - SearchRequest searchRequest = new SearchRequest(itemTypes, andFilter); - - String response = sendRequest(new URL("https://api.planet.com/data/v1/quick-search"), searchRequest); - Feature[] featuresInPage = getNextPage(response); - - if (featuresInPage != null && maxResults != null ) { - Arrays.sort(featuresInPage, new FeatureSorter()); - - if (featuresInPage.length > maxResults) { - featuresInPage = ArrayUtils.subarray(featuresInPage, 0, maxResults); - } - ArrayUtils.reverse(featuresInPage); - } - - return featuresInPage; - - } - - private Feature[] getNextPage(String resJson) throws IOException { - if (StringUtils.isNotBlank(resJson)) { - Response resp = gson.fromJson(resJson, Response.class); - Feature[] features = resp.getFeatures(); - Links links = resp.getLinks(); - if (links != null && links.getNext() != null) { - String nextUrl = links.getNext(); - String res = sendRequest(new URL(nextUrl), null); - Feature[] nextFeatures = getNextPage(res); - return ArrayUtils.addAll(features, nextFeatures); - } else { - return features; - } - } else { - return new Feature[] {}; - } - } - - private String getLayers(Feature[] features) throws IOException { - String layerUrl = ""; - if (features.length > 0) { - String[] ids = new String[features.length]; - for (int i = 0; i < ids.length; i++) { - Feature feature = features[i]; - - String idSearch = feature.getProperties().getItemType() + ':' + feature.getId(); - ids[i] = idSearch; - } - - SearchRequest layerRequest = new SearchRequest(ids); - String layers = sendRequest(new URL("https://tiles0.planet.com/data/v1/layers"), layerRequest); - LayerResponse layerResponse = gson.fromJson(layers, LayerResponse.class); - if (layerResponse != null) { - layerUrl = layerResponse.getTiles()[0]; - } - } - return layerUrl; - } - - private Feature[] getFeatures (PlanetRequestParameters planetRequestParameters ) throws IOException { - Calendar thresholdQuality = Calendar.getInstance(); - thresholdQuality.set(2016, 0,1); - - GeoJson geometry = new GeoJson("Polygon", planetRequestParameters.getCoords()); - Filter geometryFilter = getGeometryFilter(geometry); - Filter[] filters = null; - /* maybe we can use test quality anyway - * it gets complicated when the filter start/end date is multiyear - */ - if( planetRequestParameters.getStart().before( thresholdQuality.getTime() ) && planetRequestParameters.getEnd().after( thresholdQuality.getTime() ) ) { - - Filter qualityFilter = getStringInFilter("quality_category", new String[] { "standard" }); - Filter before2016Filter = getDateFilter(planetRequestParameters.getStart(), thresholdQuality.getTime() ); - Filter after2016Filter = getDateFilter(thresholdQuality.getTime(), planetRequestParameters.getEnd() ); - - Filter after2016AndStandardQuality = getAndFilter( new Filter[] { after2016Filter, qualityFilter } ); - Filter before2016OrAfter2016AndStandardQuality = getOrFilter( new Filter[] { before2016Filter, after2016AndStandardQuality } ); - - // Add quality filter only for images after 2016 - - filters = new Filter[] { before2016OrAfter2016AndStandardQuality, geometryFilter }; - - }else if( planetRequestParameters.getStart().after( thresholdQuality.getTime() ) ) { - Filter dateFilter = getDateFilter(planetRequestParameters.getStart(), planetRequestParameters.getEnd()); - // Add quality filter only for images after 2016 - Filter qualityFilter = getStringInFilter("quality_category", new String[] { "standard" }); - filters = new Filter[] { dateFilter, geometryFilter, qualityFilter }; - }else { - Filter dateFilter = getDateFilter(planetRequestParameters.getStart(), planetRequestParameters.getEnd()); - filters = new Filter[] { dateFilter, geometryFilter }; - } - - return search(planetRequestParameters.getItemTypes(), filters, null); - } - - public String getLayerUrl(PlanetRequestParameters planetRequestParameters) throws IOException { - Feature[] searchResults = getFeatures (planetRequestParameters); - return searchResults!=null ? getLayers(searchResults) : null; - } - - public Map getAvailableDates(PlanetRequestParameters planetRequestParameters) throws IOException { - - Feature[] searchResults = getFeatures (planetRequestParameters); - - Map datesAvailable = new HashMap<>(); - - Calendar cal = Calendar.getInstance(); - if( searchResults != null ) { - for (Feature feature : searchResults) { - cal.setTime( feature.getProperties().acquired ); - int year = cal.get( Calendar.YEAR ); - int month = cal.get( Calendar.MONTH ) + 1; - int day = cal.get( Calendar.DATE ); - datesAvailable.put( year+""+ ( month<10?"0"+month:month ), "true"); // THe month, in order to know for whcioh moinths there are images - datesAvailable.put( year+""+ ( month<10?"0"+month:month )+ ( day<10?"0"+day:day ), "true"); - } - } - return datesAvailable; - } - - public String getLatestUrl(SimplePlacemarkObject placemarkObject) throws IOException { - LocalDateTime localDateTime = DateUtils.asLocalDateTime(new Date()); - Date start = DateUtils.asDate(localDateTime.minusDays(30)); - - List shape = placemarkObject.getMultiShape().get(0); - - double[][][] polygon = new double[1][shape.size()][2]; - int i = 0; - for (SimpleCoordinate simpleCoordinate : shape) { - polygon[0][i][1] = Double.parseDouble(simpleCoordinate.getLatitude()); - polygon[0][i++][0] = Double.parseDouble(simpleCoordinate.getLongitude()); - } - String[] itemTypes = { "PSScene3Band", "PSScene4Band" }; - return getLayerUrl(new PlanetRequestParameters(start, new Date(), polygon, itemTypes)); - } -} +package org.openforis.collect.earth.planet; + +import java.util.Date; + +public class PlanetRequestParameters { + private Date start; + private Date end; + private double[][][] coords; + private String[] itemTypes; + + public PlanetRequestParameters(Date start, Date end, double[][][] coords, String[] itemTypes) { + this.start = start; + this.end = end; + this.coords = coords; + this.itemTypes = itemTypes; + } + + public Date getStart() { + return start; + } + + public void setStart(Date start) { + this.start = start; + } + + public Date getEnd() { + return end; + } + + public void setEnd(Date end) { + this.end = end; + } + + public double[][][] getCoords() { + return coords; + } + + public void setCoords(double[][][] coords) { + this.coords = coords; + } + + public String[] getItemTypes() { + return itemTypes; + } + + public void setItemTypes(String[] itemTypes) { + this.itemTypes = itemTypes; + } +} \ No newline at end of file From 4fc865a7e646ee0aa1f9f1dc2dcdcdd4f77330e9 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:47 +0100 Subject: [PATCH 0579/1620] New translations PlanetRequestParameters.java (Spanish) --- .../earth/app/view/Messages_es.properties | 393 +++--------------- 1 file changed, 49 insertions(+), 344 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 34f161190b..afe14d18fd 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,344 +1,49 @@ -package org.openforis.collect.earth.planet; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.HttpURLConnection; -import java.net.URL; -import java.nio.charset.StandardCharsets; -import java.security.Security; -import java.time.LocalDateTime; -import java.util.Arrays; -import java.util.Base64; -import java.util.Calendar; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSocketFactory; -import javax.net.ssl.TrustManager; - -import org.apache.commons.lang3.ArrayUtils; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.service.TrustAllCertificates; -import org.openforis.collect.earth.sampler.model.SimpleCoordinate; -import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; - -public class PlanetImagery { - - private static final Logger logger = LoggerFactory.getLogger(PlanetImagery.class); - private static final Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").create(); - private static final SSLSocketFactory factory = getSSLAcceptAllFactory(); - - private String apiKey; - - private int retries = 0; - - private static final int MAX_RETRIES = 6; - - public PlanetImagery(String apiKey) { - super(); - this.apiKey = apiKey; - } - - private Filter getDateFilter(Date start, Date end) { - Filter dateFilter = new Filter<>(); - dateFilter.setType(FilterType.DATERANGE); - dateFilter.setFieldName(PlanetAttributes.ACQUIRED); - dateFilter.setConfig(new FilterConfig(new DatePlanet(start), new DatePlanet(end))); - return dateFilter; - } - - private Filter withinDaysFilter(Feature feature, int days) { - Date acquriredDate = feature.getProperties().getAcquired(); - LocalDateTime localDateTime = DateUtils.asLocalDateTime(acquriredDate); - Date start = DateUtils.asDate(localDateTime.minusDays(days)); - Date end = DateUtils.asDate(localDateTime.plusDays(days - 1)); - return getDateFilter(start, end); - } - - private Filter getGeometryFilter(GeoJson geoJson) { - Filter geoFilter = new Filter<>(); - geoFilter.setType(FilterType.GEOMETRY); - geoFilter.setFieldName(PlanetAttributes.GEOMETRY); - geoFilter.setConfig(new FilterConfig(geoJson.getType(), geoJson.getCoordinates())); - return geoFilter; - } - - private Filter getAndFilter(Filter[] filters) { - Filter andFilter = new Filter<>(); - andFilter.setType(FilterType.AND); - andFilter.setConfig(filters); - return andFilter; - } - - private Filter getOrFilter(Filter[] filters) { - Filter andFilter = new Filter<>(); - andFilter.setType(FilterType.OR); - andFilter.setConfig(filters); - return andFilter; - } - - private Filter getStringInFilter(String fieldName, String[] strings) { - Filter stringInFilter = new Filter<>(); - stringInFilter.setType(FilterType.STRING_IN); - stringInFilter.setFieldName(fieldName); - stringInFilter.setConfig(strings); - return stringInFilter; - } - - private int getQuality(Feature feature) { - FeatureProperties p = feature.getProperties(); - Integer quality = p.getClearPercent(); - if (quality != null) - return quality; - else { - return (int) ((1 - p.getCloudCover()) * 50); - } - } - - private String sendRequest(URL url, Object jsonObject) throws IOException { - try { - - HttpURLConnection conn = getAuthenticatedConnection(url, jsonObject); - - buildRequet(jsonObject, conn); - - StringBuilder response = null; - try { - response = readStream(conn.getInputStream()); - } finally { - conn.disconnect(); - } - - retries = 0; // reset the counter as it was a success - return response.toString(); - } catch (IOException e) { - if( e.getMessage()!=null && e.getMessage().contains("429") ) { // This happens when there are too many consecutive requests! Make the user wait a bit and try again! - try { - if( retries < MAX_RETRIES ) { - Thread.sleep( 5000 ); - retries++; - }else { - retries = 0; - throw e; - } - } catch (InterruptedException e1) { - logger.error( "Error waiting for Thread requesting Planet imagery"); - } - return sendRequest(url, jsonObject); - }else { - throw e; // Another type of error throw! - } - } - } - - private void buildRequet(Object jsonObject, HttpURLConnection conn) - throws IOException { - byte[] postDataBytes = null; - if (jsonObject != null) { - String jsonInputString = gson.toJson(jsonObject); - postDataBytes = jsonInputString.getBytes( StandardCharsets.UTF_8.name()); - logger.info(jsonInputString); - } - if (postDataBytes != null) { - conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length)); - conn.getOutputStream().write(postDataBytes); - } else { - conn.setRequestProperty("Content-Length", "0"); - } - } - - private HttpURLConnection getAuthenticatedConnection(URL url, Object jsonObject) - throws IOException { - HttpURLConnection conn = null; - if( factory != null ) { // THIS IS A WORKAROUND TO REMOVE SSL CERTIFICATE ISSUES - conn = (HttpsURLConnection) url.openConnection(); - ((HttpsURLConnection)conn).setSSLSocketFactory(factory); - }else { - conn = (HttpURLConnection) url.openConnection(); - } - - // very important to keep the semicolon at the end - String basicAuth = "Basic " + new String(Base64.getEncoder().encode((apiKey + ":").getBytes())); - conn.setRequestProperty("Authorization", basicAuth); - - conn.setRequestMethod(jsonObject != null ? "POST" : "GET"); - conn.setRequestProperty("Content-Type", "application/json"); - conn.setRequestProperty("Accept", "application/json"); - conn.setDoOutput(true); - return conn; - } - - // Workaround for computers that have trouble accepting Planet's SSL certificates - private static SSLSocketFactory getSSLAcceptAllFactory(){ - SSLSocketFactory factory = null; - try { - Security.getProviders(); - final SSLContext ssl = SSLContext.getInstance("TLSv1.2"); - ssl.init(null, new TrustManager[] { new TrustAllCertificates() }, null); - return ssl.getSocketFactory(); - } catch (Exception e) { - logger.error( "Error obtaining SSL factory when opeining Planet REST URL",e); - } - - return factory; - } - - private StringBuilder readStream(InputStream is) throws IOException { - StringBuilder response = new StringBuilder(); - try (BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) { - String responseLine = null; - while ((responseLine = br.readLine()) != null) { - response.append(responseLine.trim()); - } - } - return response; - } - - private Feature[] search(String[] itemTypes, Filter[] filters, Integer maxResults) throws IOException { - - Filter andFilter = getAndFilter(filters); - SearchRequest searchRequest = new SearchRequest(itemTypes, andFilter); - - String response = sendRequest(new URL("https://api.planet.com/data/v1/quick-search"), searchRequest); - Feature[] featuresInPage = getNextPage(response); - - if (featuresInPage != null && maxResults != null ) { - Arrays.sort(featuresInPage, new FeatureSorter()); - - if (featuresInPage.length > maxResults) { - featuresInPage = ArrayUtils.subarray(featuresInPage, 0, maxResults); - } - ArrayUtils.reverse(featuresInPage); - } - - return featuresInPage; - - } - - private Feature[] getNextPage(String resJson) throws IOException { - if (StringUtils.isNotBlank(resJson)) { - Response resp = gson.fromJson(resJson, Response.class); - Feature[] features = resp.getFeatures(); - Links links = resp.getLinks(); - if (links != null && links.getNext() != null) { - String nextUrl = links.getNext(); - String res = sendRequest(new URL(nextUrl), null); - Feature[] nextFeatures = getNextPage(res); - return ArrayUtils.addAll(features, nextFeatures); - } else { - return features; - } - } else { - return new Feature[] {}; - } - } - - private String getLayers(Feature[] features) throws IOException { - String layerUrl = ""; - if (features.length > 0) { - String[] ids = new String[features.length]; - for (int i = 0; i < ids.length; i++) { - Feature feature = features[i]; - - String idSearch = feature.getProperties().getItemType() + ':' + feature.getId(); - ids[i] = idSearch; - } - - SearchRequest layerRequest = new SearchRequest(ids); - String layers = sendRequest(new URL("https://tiles0.planet.com/data/v1/layers"), layerRequest); - LayerResponse layerResponse = gson.fromJson(layers, LayerResponse.class); - if (layerResponse != null) { - layerUrl = layerResponse.getTiles()[0]; - } - } - return layerUrl; - } - - private Feature[] getFeatures (PlanetRequestParameters planetRequestParameters ) throws IOException { - Calendar thresholdQuality = Calendar.getInstance(); - thresholdQuality.set(2016, 0,1); - - GeoJson geometry = new GeoJson("Polygon", planetRequestParameters.getCoords()); - Filter geometryFilter = getGeometryFilter(geometry); - Filter[] filters = null; - /* maybe we can use test quality anyway - * it gets complicated when the filter start/end date is multiyear - */ - if( planetRequestParameters.getStart().before( thresholdQuality.getTime() ) && planetRequestParameters.getEnd().after( thresholdQuality.getTime() ) ) { - - Filter qualityFilter = getStringInFilter("quality_category", new String[] { "standard" }); - Filter before2016Filter = getDateFilter(planetRequestParameters.getStart(), thresholdQuality.getTime() ); - Filter after2016Filter = getDateFilter(thresholdQuality.getTime(), planetRequestParameters.getEnd() ); - - Filter after2016AndStandardQuality = getAndFilter( new Filter[] { after2016Filter, qualityFilter } ); - Filter before2016OrAfter2016AndStandardQuality = getOrFilter( new Filter[] { before2016Filter, after2016AndStandardQuality } ); - - // Add quality filter only for images after 2016 - - filters = new Filter[] { before2016OrAfter2016AndStandardQuality, geometryFilter }; - - }else if( planetRequestParameters.getStart().after( thresholdQuality.getTime() ) ) { - Filter dateFilter = getDateFilter(planetRequestParameters.getStart(), planetRequestParameters.getEnd()); - // Add quality filter only for images after 2016 - Filter qualityFilter = getStringInFilter("quality_category", new String[] { "standard" }); - filters = new Filter[] { dateFilter, geometryFilter, qualityFilter }; - }else { - Filter dateFilter = getDateFilter(planetRequestParameters.getStart(), planetRequestParameters.getEnd()); - filters = new Filter[] { dateFilter, geometryFilter }; - } - - return search(planetRequestParameters.getItemTypes(), filters, null); - } - - public String getLayerUrl(PlanetRequestParameters planetRequestParameters) throws IOException { - Feature[] searchResults = getFeatures (planetRequestParameters); - return searchResults!=null ? getLayers(searchResults) : null; - } - - public Map getAvailableDates(PlanetRequestParameters planetRequestParameters) throws IOException { - - Feature[] searchResults = getFeatures (planetRequestParameters); - - Map datesAvailable = new HashMap<>(); - - Calendar cal = Calendar.getInstance(); - if( searchResults != null ) { - for (Feature feature : searchResults) { - cal.setTime( feature.getProperties().acquired ); - int year = cal.get( Calendar.YEAR ); - int month = cal.get( Calendar.MONTH ) + 1; - int day = cal.get( Calendar.DATE ); - datesAvailable.put( year+""+ ( month<10?"0"+month:month ), "true"); // THe month, in order to know for whcioh moinths there are images - datesAvailable.put( year+""+ ( month<10?"0"+month:month )+ ( day<10?"0"+day:day ), "true"); - } - } - return datesAvailable; - } - - public String getLatestUrl(SimplePlacemarkObject placemarkObject) throws IOException { - LocalDateTime localDateTime = DateUtils.asLocalDateTime(new Date()); - Date start = DateUtils.asDate(localDateTime.minusDays(30)); - - List shape = placemarkObject.getMultiShape().get(0); - - double[][][] polygon = new double[1][shape.size()][2]; - int i = 0; - for (SimpleCoordinate simpleCoordinate : shape) { - polygon[0][i][1] = Double.parseDouble(simpleCoordinate.getLatitude()); - polygon[0][i++][0] = Double.parseDouble(simpleCoordinate.getLongitude()); - } - String[] itemTypes = { "PSScene3Band", "PSScene4Band" }; - return getLayerUrl(new PlanetRequestParameters(start, new Date(), polygon, itemTypes)); - } -} +package org.openforis.collect.earth.planet; + +import java.util.Date; + +public class PlanetRequestParameters { + private Date start; + private Date end; + private double[][][] coords; + private String[] itemTypes; + + public PlanetRequestParameters(Date start, Date end, double[][][] coords, String[] itemTypes) { + this.start = start; + this.end = end; + this.coords = coords; + this.itemTypes = itemTypes; + } + + public Date getStart() { + return start; + } + + public void setStart(Date start) { + this.start = start; + } + + public Date getEnd() { + return end; + } + + public void setEnd(Date end) { + this.end = end; + } + + public double[][][] getCoords() { + return coords; + } + + public void setCoords(double[][][] coords) { + this.coords = coords; + } + + public String[] getItemTypes() { + return itemTypes; + } + + public void setItemTypes(String[] itemTypes) { + this.itemTypes = itemTypes; + } +} \ No newline at end of file From 40462d7475f17ed05bb5fe0da322f1dc70370105 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:48 +0100 Subject: [PATCH 0580/1620] New translations PlanetRequestParameters.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 393 +++--------------- 1 file changed, 49 insertions(+), 344 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 34f161190b..afe14d18fd 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,344 +1,49 @@ -package org.openforis.collect.earth.planet; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.HttpURLConnection; -import java.net.URL; -import java.nio.charset.StandardCharsets; -import java.security.Security; -import java.time.LocalDateTime; -import java.util.Arrays; -import java.util.Base64; -import java.util.Calendar; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSocketFactory; -import javax.net.ssl.TrustManager; - -import org.apache.commons.lang3.ArrayUtils; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.service.TrustAllCertificates; -import org.openforis.collect.earth.sampler.model.SimpleCoordinate; -import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; - -public class PlanetImagery { - - private static final Logger logger = LoggerFactory.getLogger(PlanetImagery.class); - private static final Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").create(); - private static final SSLSocketFactory factory = getSSLAcceptAllFactory(); - - private String apiKey; - - private int retries = 0; - - private static final int MAX_RETRIES = 6; - - public PlanetImagery(String apiKey) { - super(); - this.apiKey = apiKey; - } - - private Filter getDateFilter(Date start, Date end) { - Filter dateFilter = new Filter<>(); - dateFilter.setType(FilterType.DATERANGE); - dateFilter.setFieldName(PlanetAttributes.ACQUIRED); - dateFilter.setConfig(new FilterConfig(new DatePlanet(start), new DatePlanet(end))); - return dateFilter; - } - - private Filter withinDaysFilter(Feature feature, int days) { - Date acquriredDate = feature.getProperties().getAcquired(); - LocalDateTime localDateTime = DateUtils.asLocalDateTime(acquriredDate); - Date start = DateUtils.asDate(localDateTime.minusDays(days)); - Date end = DateUtils.asDate(localDateTime.plusDays(days - 1)); - return getDateFilter(start, end); - } - - private Filter getGeometryFilter(GeoJson geoJson) { - Filter geoFilter = new Filter<>(); - geoFilter.setType(FilterType.GEOMETRY); - geoFilter.setFieldName(PlanetAttributes.GEOMETRY); - geoFilter.setConfig(new FilterConfig(geoJson.getType(), geoJson.getCoordinates())); - return geoFilter; - } - - private Filter getAndFilter(Filter[] filters) { - Filter andFilter = new Filter<>(); - andFilter.setType(FilterType.AND); - andFilter.setConfig(filters); - return andFilter; - } - - private Filter getOrFilter(Filter[] filters) { - Filter andFilter = new Filter<>(); - andFilter.setType(FilterType.OR); - andFilter.setConfig(filters); - return andFilter; - } - - private Filter getStringInFilter(String fieldName, String[] strings) { - Filter stringInFilter = new Filter<>(); - stringInFilter.setType(FilterType.STRING_IN); - stringInFilter.setFieldName(fieldName); - stringInFilter.setConfig(strings); - return stringInFilter; - } - - private int getQuality(Feature feature) { - FeatureProperties p = feature.getProperties(); - Integer quality = p.getClearPercent(); - if (quality != null) - return quality; - else { - return (int) ((1 - p.getCloudCover()) * 50); - } - } - - private String sendRequest(URL url, Object jsonObject) throws IOException { - try { - - HttpURLConnection conn = getAuthenticatedConnection(url, jsonObject); - - buildRequet(jsonObject, conn); - - StringBuilder response = null; - try { - response = readStream(conn.getInputStream()); - } finally { - conn.disconnect(); - } - - retries = 0; // reset the counter as it was a success - return response.toString(); - } catch (IOException e) { - if( e.getMessage()!=null && e.getMessage().contains("429") ) { // This happens when there are too many consecutive requests! Make the user wait a bit and try again! - try { - if( retries < MAX_RETRIES ) { - Thread.sleep( 5000 ); - retries++; - }else { - retries = 0; - throw e; - } - } catch (InterruptedException e1) { - logger.error( "Error waiting for Thread requesting Planet imagery"); - } - return sendRequest(url, jsonObject); - }else { - throw e; // Another type of error throw! - } - } - } - - private void buildRequet(Object jsonObject, HttpURLConnection conn) - throws IOException { - byte[] postDataBytes = null; - if (jsonObject != null) { - String jsonInputString = gson.toJson(jsonObject); - postDataBytes = jsonInputString.getBytes( StandardCharsets.UTF_8.name()); - logger.info(jsonInputString); - } - if (postDataBytes != null) { - conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length)); - conn.getOutputStream().write(postDataBytes); - } else { - conn.setRequestProperty("Content-Length", "0"); - } - } - - private HttpURLConnection getAuthenticatedConnection(URL url, Object jsonObject) - throws IOException { - HttpURLConnection conn = null; - if( factory != null ) { // THIS IS A WORKAROUND TO REMOVE SSL CERTIFICATE ISSUES - conn = (HttpsURLConnection) url.openConnection(); - ((HttpsURLConnection)conn).setSSLSocketFactory(factory); - }else { - conn = (HttpURLConnection) url.openConnection(); - } - - // very important to keep the semicolon at the end - String basicAuth = "Basic " + new String(Base64.getEncoder().encode((apiKey + ":").getBytes())); - conn.setRequestProperty("Authorization", basicAuth); - - conn.setRequestMethod(jsonObject != null ? "POST" : "GET"); - conn.setRequestProperty("Content-Type", "application/json"); - conn.setRequestProperty("Accept", "application/json"); - conn.setDoOutput(true); - return conn; - } - - // Workaround for computers that have trouble accepting Planet's SSL certificates - private static SSLSocketFactory getSSLAcceptAllFactory(){ - SSLSocketFactory factory = null; - try { - Security.getProviders(); - final SSLContext ssl = SSLContext.getInstance("TLSv1.2"); - ssl.init(null, new TrustManager[] { new TrustAllCertificates() }, null); - return ssl.getSocketFactory(); - } catch (Exception e) { - logger.error( "Error obtaining SSL factory when opeining Planet REST URL",e); - } - - return factory; - } - - private StringBuilder readStream(InputStream is) throws IOException { - StringBuilder response = new StringBuilder(); - try (BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) { - String responseLine = null; - while ((responseLine = br.readLine()) != null) { - response.append(responseLine.trim()); - } - } - return response; - } - - private Feature[] search(String[] itemTypes, Filter[] filters, Integer maxResults) throws IOException { - - Filter andFilter = getAndFilter(filters); - SearchRequest searchRequest = new SearchRequest(itemTypes, andFilter); - - String response = sendRequest(new URL("https://api.planet.com/data/v1/quick-search"), searchRequest); - Feature[] featuresInPage = getNextPage(response); - - if (featuresInPage != null && maxResults != null ) { - Arrays.sort(featuresInPage, new FeatureSorter()); - - if (featuresInPage.length > maxResults) { - featuresInPage = ArrayUtils.subarray(featuresInPage, 0, maxResults); - } - ArrayUtils.reverse(featuresInPage); - } - - return featuresInPage; - - } - - private Feature[] getNextPage(String resJson) throws IOException { - if (StringUtils.isNotBlank(resJson)) { - Response resp = gson.fromJson(resJson, Response.class); - Feature[] features = resp.getFeatures(); - Links links = resp.getLinks(); - if (links != null && links.getNext() != null) { - String nextUrl = links.getNext(); - String res = sendRequest(new URL(nextUrl), null); - Feature[] nextFeatures = getNextPage(res); - return ArrayUtils.addAll(features, nextFeatures); - } else { - return features; - } - } else { - return new Feature[] {}; - } - } - - private String getLayers(Feature[] features) throws IOException { - String layerUrl = ""; - if (features.length > 0) { - String[] ids = new String[features.length]; - for (int i = 0; i < ids.length; i++) { - Feature feature = features[i]; - - String idSearch = feature.getProperties().getItemType() + ':' + feature.getId(); - ids[i] = idSearch; - } - - SearchRequest layerRequest = new SearchRequest(ids); - String layers = sendRequest(new URL("https://tiles0.planet.com/data/v1/layers"), layerRequest); - LayerResponse layerResponse = gson.fromJson(layers, LayerResponse.class); - if (layerResponse != null) { - layerUrl = layerResponse.getTiles()[0]; - } - } - return layerUrl; - } - - private Feature[] getFeatures (PlanetRequestParameters planetRequestParameters ) throws IOException { - Calendar thresholdQuality = Calendar.getInstance(); - thresholdQuality.set(2016, 0,1); - - GeoJson geometry = new GeoJson("Polygon", planetRequestParameters.getCoords()); - Filter geometryFilter = getGeometryFilter(geometry); - Filter[] filters = null; - /* maybe we can use test quality anyway - * it gets complicated when the filter start/end date is multiyear - */ - if( planetRequestParameters.getStart().before( thresholdQuality.getTime() ) && planetRequestParameters.getEnd().after( thresholdQuality.getTime() ) ) { - - Filter qualityFilter = getStringInFilter("quality_category", new String[] { "standard" }); - Filter before2016Filter = getDateFilter(planetRequestParameters.getStart(), thresholdQuality.getTime() ); - Filter after2016Filter = getDateFilter(thresholdQuality.getTime(), planetRequestParameters.getEnd() ); - - Filter after2016AndStandardQuality = getAndFilter( new Filter[] { after2016Filter, qualityFilter } ); - Filter before2016OrAfter2016AndStandardQuality = getOrFilter( new Filter[] { before2016Filter, after2016AndStandardQuality } ); - - // Add quality filter only for images after 2016 - - filters = new Filter[] { before2016OrAfter2016AndStandardQuality, geometryFilter }; - - }else if( planetRequestParameters.getStart().after( thresholdQuality.getTime() ) ) { - Filter dateFilter = getDateFilter(planetRequestParameters.getStart(), planetRequestParameters.getEnd()); - // Add quality filter only for images after 2016 - Filter qualityFilter = getStringInFilter("quality_category", new String[] { "standard" }); - filters = new Filter[] { dateFilter, geometryFilter, qualityFilter }; - }else { - Filter dateFilter = getDateFilter(planetRequestParameters.getStart(), planetRequestParameters.getEnd()); - filters = new Filter[] { dateFilter, geometryFilter }; - } - - return search(planetRequestParameters.getItemTypes(), filters, null); - } - - public String getLayerUrl(PlanetRequestParameters planetRequestParameters) throws IOException { - Feature[] searchResults = getFeatures (planetRequestParameters); - return searchResults!=null ? getLayers(searchResults) : null; - } - - public Map getAvailableDates(PlanetRequestParameters planetRequestParameters) throws IOException { - - Feature[] searchResults = getFeatures (planetRequestParameters); - - Map datesAvailable = new HashMap<>(); - - Calendar cal = Calendar.getInstance(); - if( searchResults != null ) { - for (Feature feature : searchResults) { - cal.setTime( feature.getProperties().acquired ); - int year = cal.get( Calendar.YEAR ); - int month = cal.get( Calendar.MONTH ) + 1; - int day = cal.get( Calendar.DATE ); - datesAvailable.put( year+""+ ( month<10?"0"+month:month ), "true"); // THe month, in order to know for whcioh moinths there are images - datesAvailable.put( year+""+ ( month<10?"0"+month:month )+ ( day<10?"0"+day:day ), "true"); - } - } - return datesAvailable; - } - - public String getLatestUrl(SimplePlacemarkObject placemarkObject) throws IOException { - LocalDateTime localDateTime = DateUtils.asLocalDateTime(new Date()); - Date start = DateUtils.asDate(localDateTime.minusDays(30)); - - List shape = placemarkObject.getMultiShape().get(0); - - double[][][] polygon = new double[1][shape.size()][2]; - int i = 0; - for (SimpleCoordinate simpleCoordinate : shape) { - polygon[0][i][1] = Double.parseDouble(simpleCoordinate.getLatitude()); - polygon[0][i++][0] = Double.parseDouble(simpleCoordinate.getLongitude()); - } - String[] itemTypes = { "PSScene3Band", "PSScene4Band" }; - return getLayerUrl(new PlanetRequestParameters(start, new Date(), polygon, itemTypes)); - } -} +package org.openforis.collect.earth.planet; + +import java.util.Date; + +public class PlanetRequestParameters { + private Date start; + private Date end; + private double[][][] coords; + private String[] itemTypes; + + public PlanetRequestParameters(Date start, Date end, double[][][] coords, String[] itemTypes) { + this.start = start; + this.end = end; + this.coords = coords; + this.itemTypes = itemTypes; + } + + public Date getStart() { + return start; + } + + public void setStart(Date start) { + this.start = start; + } + + public Date getEnd() { + return end; + } + + public void setEnd(Date end) { + this.end = end; + } + + public double[][][] getCoords() { + return coords; + } + + public void setCoords(double[][][] coords) { + this.coords = coords; + } + + public String[] getItemTypes() { + return itemTypes; + } + + public void setItemTypes(String[] itemTypes) { + this.itemTypes = itemTypes; + } +} \ No newline at end of file From ed7ae436a44af3e0220f47ff3cdd09070c3c9a16 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:49 +0100 Subject: [PATCH 0581/1620] New translations GeoJson.java (Spanish) --- .../earth/app/view/Messages_es.properties | 75 +++++++------------ 1 file changed, 26 insertions(+), 49 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index afe14d18fd..16edcc9124 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,49 +1,26 @@ -package org.openforis.collect.earth.planet; - -import java.util.Date; - -public class PlanetRequestParameters { - private Date start; - private Date end; - private double[][][] coords; - private String[] itemTypes; - - public PlanetRequestParameters(Date start, Date end, double[][][] coords, String[] itemTypes) { - this.start = start; - this.end = end; - this.coords = coords; - this.itemTypes = itemTypes; - } - - public Date getStart() { - return start; - } - - public void setStart(Date start) { - this.start = start; - } - - public Date getEnd() { - return end; - } - - public void setEnd(Date end) { - this.end = end; - } - - public double[][][] getCoords() { - return coords; - } - - public void setCoords(double[][][] coords) { - this.coords = coords; - } - - public String[] getItemTypes() { - return itemTypes; - } - - public void setItemTypes(String[] itemTypes) { - this.itemTypes = itemTypes; - } -} \ No newline at end of file +package org.openforis.collect.earth.planet; + +public class GeoJson { + + String type; // for geojson + double[][][] coordinates; + + public GeoJson(String type, double[][][] coordinates) { + super(); + this.type = type; + this.coordinates = coordinates; + } + public String getType() { + return type; + } + public void setType(String type) { + this.type = type; + } + public double[][][] getCoordinates() { + return coordinates; + } + public void setCoordinates(double[][][] coordinates) { + this.coordinates = coordinates; + } + +} From bc84544a8b72acd2d3fa40080ab5bceab2685a05 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:50 +0100 Subject: [PATCH 0582/1620] New translations FilterType.java (English) --- .../earth/app/view/Messages_en.properties | 347 +----------------- 1 file changed, 13 insertions(+), 334 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 34f161190b..bc34210ad4 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,344 +1,23 @@ package org.openforis.collect.earth.planet; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.HttpURLConnection; -import java.net.URL; -import java.nio.charset.StandardCharsets; -import java.security.Security; -import java.time.LocalDateTime; -import java.util.Arrays; -import java.util.Base64; -import java.util.Calendar; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import com.google.gson.annotations.SerializedName; -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSocketFactory; -import javax.net.ssl.TrustManager; +public enum FilterType { + @SerializedName("DateRangeFilter") DATERANGE("DateRangeFilter"), + @SerializedName("StringInFilter") STRING_IN("StringInFilter"), + @SerializedName("AndFilter") AND("AndFilter"), + @SerializedName("OrFilter") OR("OrFilter"), + @SerializedName("GeometryFilter") GEOMETRY("GeometryFilter"); -import org.apache.commons.lang3.ArrayUtils; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.service.TrustAllCertificates; -import org.openforis.collect.earth.sampler.model.SimpleCoordinate; -import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; + private String type; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; - -public class PlanetImagery { - - private static final Logger logger = LoggerFactory.getLogger(PlanetImagery.class); - private static final Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").create(); - private static final SSLSocketFactory factory = getSSLAcceptAllFactory(); - - private String apiKey; - - private int retries = 0; - - private static final int MAX_RETRIES = 6; - - public PlanetImagery(String apiKey) { - super(); - this.apiKey = apiKey; - } - - private Filter getDateFilter(Date start, Date end) { - Filter dateFilter = new Filter<>(); - dateFilter.setType(FilterType.DATERANGE); - dateFilter.setFieldName(PlanetAttributes.ACQUIRED); - dateFilter.setConfig(new FilterConfig(new DatePlanet(start), new DatePlanet(end))); - return dateFilter; - } - - private Filter withinDaysFilter(Feature feature, int days) { - Date acquriredDate = feature.getProperties().getAcquired(); - LocalDateTime localDateTime = DateUtils.asLocalDateTime(acquriredDate); - Date start = DateUtils.asDate(localDateTime.minusDays(days)); - Date end = DateUtils.asDate(localDateTime.plusDays(days - 1)); - return getDateFilter(start, end); - } - - private Filter getGeometryFilter(GeoJson geoJson) { - Filter geoFilter = new Filter<>(); - geoFilter.setType(FilterType.GEOMETRY); - geoFilter.setFieldName(PlanetAttributes.GEOMETRY); - geoFilter.setConfig(new FilterConfig(geoJson.getType(), geoJson.getCoordinates())); - return geoFilter; - } - - private Filter getAndFilter(Filter[] filters) { - Filter andFilter = new Filter<>(); - andFilter.setType(FilterType.AND); - andFilter.setConfig(filters); - return andFilter; - } - - private Filter getOrFilter(Filter[] filters) { - Filter andFilter = new Filter<>(); - andFilter.setType(FilterType.OR); - andFilter.setConfig(filters); - return andFilter; - } - - private Filter getStringInFilter(String fieldName, String[] strings) { - Filter stringInFilter = new Filter<>(); - stringInFilter.setType(FilterType.STRING_IN); - stringInFilter.setFieldName(fieldName); - stringInFilter.setConfig(strings); - return stringInFilter; - } - - private int getQuality(Feature feature) { - FeatureProperties p = feature.getProperties(); - Integer quality = p.getClearPercent(); - if (quality != null) - return quality; - else { - return (int) ((1 - p.getCloudCover()) * 50); - } - } - - private String sendRequest(URL url, Object jsonObject) throws IOException { - try { - - HttpURLConnection conn = getAuthenticatedConnection(url, jsonObject); - - buildRequet(jsonObject, conn); - - StringBuilder response = null; - try { - response = readStream(conn.getInputStream()); - } finally { - conn.disconnect(); - } - - retries = 0; // reset the counter as it was a success - return response.toString(); - } catch (IOException e) { - if( e.getMessage()!=null && e.getMessage().contains("429") ) { // This happens when there are too many consecutive requests! Make the user wait a bit and try again! - try { - if( retries < MAX_RETRIES ) { - Thread.sleep( 5000 ); - retries++; - }else { - retries = 0; - throw e; - } - } catch (InterruptedException e1) { - logger.error( "Error waiting for Thread requesting Planet imagery"); - } - return sendRequest(url, jsonObject); - }else { - throw e; // Another type of error throw! - } - } - } - - private void buildRequet(Object jsonObject, HttpURLConnection conn) - throws IOException { - byte[] postDataBytes = null; - if (jsonObject != null) { - String jsonInputString = gson.toJson(jsonObject); - postDataBytes = jsonInputString.getBytes( StandardCharsets.UTF_8.name()); - logger.info(jsonInputString); - } - if (postDataBytes != null) { - conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length)); - conn.getOutputStream().write(postDataBytes); - } else { - conn.setRequestProperty("Content-Length", "0"); - } - } - - private HttpURLConnection getAuthenticatedConnection(URL url, Object jsonObject) - throws IOException { - HttpURLConnection conn = null; - if( factory != null ) { // THIS IS A WORKAROUND TO REMOVE SSL CERTIFICATE ISSUES - conn = (HttpsURLConnection) url.openConnection(); - ((HttpsURLConnection)conn).setSSLSocketFactory(factory); - }else { - conn = (HttpURLConnection) url.openConnection(); - } - - // very important to keep the semicolon at the end - String basicAuth = "Basic " + new String(Base64.getEncoder().encode((apiKey + ":").getBytes())); - conn.setRequestProperty("Authorization", basicAuth); - - conn.setRequestMethod(jsonObject != null ? "POST" : "GET"); - conn.setRequestProperty("Content-Type", "application/json"); - conn.setRequestProperty("Accept", "application/json"); - conn.setDoOutput(true); - return conn; - } - - // Workaround for computers that have trouble accepting Planet's SSL certificates - private static SSLSocketFactory getSSLAcceptAllFactory(){ - SSLSocketFactory factory = null; - try { - Security.getProviders(); - final SSLContext ssl = SSLContext.getInstance("TLSv1.2"); - ssl.init(null, new TrustManager[] { new TrustAllCertificates() }, null); - return ssl.getSocketFactory(); - } catch (Exception e) { - logger.error( "Error obtaining SSL factory when opeining Planet REST URL",e); - } - - return factory; - } - - private StringBuilder readStream(InputStream is) throws IOException { - StringBuilder response = new StringBuilder(); - try (BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) { - String responseLine = null; - while ((responseLine = br.readLine()) != null) { - response.append(responseLine.trim()); - } - } - return response; - } - - private Feature[] search(String[] itemTypes, Filter[] filters, Integer maxResults) throws IOException { - - Filter andFilter = getAndFilter(filters); - SearchRequest searchRequest = new SearchRequest(itemTypes, andFilter); - - String response = sendRequest(new URL("https://api.planet.com/data/v1/quick-search"), searchRequest); - Feature[] featuresInPage = getNextPage(response); - - if (featuresInPage != null && maxResults != null ) { - Arrays.sort(featuresInPage, new FeatureSorter()); - - if (featuresInPage.length > maxResults) { - featuresInPage = ArrayUtils.subarray(featuresInPage, 0, maxResults); - } - ArrayUtils.reverse(featuresInPage); - } - - return featuresInPage; - - } - - private Feature[] getNextPage(String resJson) throws IOException { - if (StringUtils.isNotBlank(resJson)) { - Response resp = gson.fromJson(resJson, Response.class); - Feature[] features = resp.getFeatures(); - Links links = resp.getLinks(); - if (links != null && links.getNext() != null) { - String nextUrl = links.getNext(); - String res = sendRequest(new URL(nextUrl), null); - Feature[] nextFeatures = getNextPage(res); - return ArrayUtils.addAll(features, nextFeatures); - } else { - return features; - } - } else { - return new Feature[] {}; - } - } - - private String getLayers(Feature[] features) throws IOException { - String layerUrl = ""; - if (features.length > 0) { - String[] ids = new String[features.length]; - for (int i = 0; i < ids.length; i++) { - Feature feature = features[i]; - - String idSearch = feature.getProperties().getItemType() + ':' + feature.getId(); - ids[i] = idSearch; - } - - SearchRequest layerRequest = new SearchRequest(ids); - String layers = sendRequest(new URL("https://tiles0.planet.com/data/v1/layers"), layerRequest); - LayerResponse layerResponse = gson.fromJson(layers, LayerResponse.class); - if (layerResponse != null) { - layerUrl = layerResponse.getTiles()[0]; - } - } - return layerUrl; + private FilterType(String type) { + this.type = type; } - private Feature[] getFeatures (PlanetRequestParameters planetRequestParameters ) throws IOException { - Calendar thresholdQuality = Calendar.getInstance(); - thresholdQuality.set(2016, 0,1); - - GeoJson geometry = new GeoJson("Polygon", planetRequestParameters.getCoords()); - Filter geometryFilter = getGeometryFilter(geometry); - Filter[] filters = null; - /* maybe we can use test quality anyway - * it gets complicated when the filter start/end date is multiyear - */ - if( planetRequestParameters.getStart().before( thresholdQuality.getTime() ) && planetRequestParameters.getEnd().after( thresholdQuality.getTime() ) ) { - - Filter qualityFilter = getStringInFilter("quality_category", new String[] { "standard" }); - Filter before2016Filter = getDateFilter(planetRequestParameters.getStart(), thresholdQuality.getTime() ); - Filter after2016Filter = getDateFilter(thresholdQuality.getTime(), planetRequestParameters.getEnd() ); - - Filter after2016AndStandardQuality = getAndFilter( new Filter[] { after2016Filter, qualityFilter } ); - Filter before2016OrAfter2016AndStandardQuality = getOrFilter( new Filter[] { before2016Filter, after2016AndStandardQuality } ); - - // Add quality filter only for images after 2016 - - filters = new Filter[] { before2016OrAfter2016AndStandardQuality, geometryFilter }; - - }else if( planetRequestParameters.getStart().after( thresholdQuality.getTime() ) ) { - Filter dateFilter = getDateFilter(planetRequestParameters.getStart(), planetRequestParameters.getEnd()); - // Add quality filter only for images after 2016 - Filter qualityFilter = getStringInFilter("quality_category", new String[] { "standard" }); - filters = new Filter[] { dateFilter, geometryFilter, qualityFilter }; - }else { - Filter dateFilter = getDateFilter(planetRequestParameters.getStart(), planetRequestParameters.getEnd()); - filters = new Filter[] { dateFilter, geometryFilter }; - } - - return search(planetRequestParameters.getItemTypes(), filters, null); - } - - public String getLayerUrl(PlanetRequestParameters planetRequestParameters) throws IOException { - Feature[] searchResults = getFeatures (planetRequestParameters); - return searchResults!=null ? getLayers(searchResults) : null; + @Override + public String toString() { + return type; } - public Map getAvailableDates(PlanetRequestParameters planetRequestParameters) throws IOException { - - Feature[] searchResults = getFeatures (planetRequestParameters); - - Map datesAvailable = new HashMap<>(); - - Calendar cal = Calendar.getInstance(); - if( searchResults != null ) { - for (Feature feature : searchResults) { - cal.setTime( feature.getProperties().acquired ); - int year = cal.get( Calendar.YEAR ); - int month = cal.get( Calendar.MONTH ) + 1; - int day = cal.get( Calendar.DATE ); - datesAvailable.put( year+""+ ( month<10?"0"+month:month ), "true"); // THe month, in order to know for whcioh moinths there are images - datesAvailable.put( year+""+ ( month<10?"0"+month:month )+ ( day<10?"0"+day:day ), "true"); - } - } - return datesAvailable; - } - - public String getLatestUrl(SimplePlacemarkObject placemarkObject) throws IOException { - LocalDateTime localDateTime = DateUtils.asLocalDateTime(new Date()); - Date start = DateUtils.asDate(localDateTime.minusDays(30)); - - List shape = placemarkObject.getMultiShape().get(0); - - double[][][] polygon = new double[1][shape.size()][2]; - int i = 0; - for (SimpleCoordinate simpleCoordinate : shape) { - polygon[0][i][1] = Double.parseDouble(simpleCoordinate.getLatitude()); - polygon[0][i++][0] = Double.parseDouble(simpleCoordinate.getLongitude()); - } - String[] itemTypes = { "PSScene3Band", "PSScene4Band" }; - return getLayerUrl(new PlanetRequestParameters(start, new Date(), polygon, itemTypes)); - } } From a54a8954c0623668013eaf615c4bc4bee259b9c2 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:51 +0100 Subject: [PATCH 0583/1620] New translations DateUtils.java (English) --- .../earth/app/view/Messages_en.properties | 45 ++++++++++--------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index bc34210ad4..300057dbb3 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,23 +1,26 @@ package org.openforis.collect.earth.planet; -import com.google.gson.annotations.SerializedName; - -public enum FilterType { - @SerializedName("DateRangeFilter") DATERANGE("DateRangeFilter"), - @SerializedName("StringInFilter") STRING_IN("StringInFilter"), - @SerializedName("AndFilter") AND("AndFilter"), - @SerializedName("OrFilter") OR("OrFilter"), - @SerializedName("GeometryFilter") GEOMETRY("GeometryFilter"); - - private String type; - - private FilterType(String type) { - this.type = type; - } - - @Override - public String toString() { - return type; - } - -} +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.Date; + +public class DateUtils { + + public static Date asDate(LocalDate localDate) { + return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant()); + } + + public static Date asDate(LocalDateTime localDateTime) { + return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()); + } + + public static LocalDate asLocalDate(Date date) { + return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate(); + } + + public static LocalDateTime asLocalDateTime(Date date) { + return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime(); + } +} \ No newline at end of file From bf4fc4c04c639cd98243cbd2329a503107114e39 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:52 +0100 Subject: [PATCH 0584/1620] New translations FeatureSorter.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 79 ++++++++----------- 1 file changed, 32 insertions(+), 47 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index afe14d18fd..1e116c4a2d 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,49 +1,34 @@ package org.openforis.collect.earth.planet; -import java.util.Date; - -public class PlanetRequestParameters { - private Date start; - private Date end; - private double[][][] coords; - private String[] itemTypes; - - public PlanetRequestParameters(Date start, Date end, double[][][] coords, String[] itemTypes) { - this.start = start; - this.end = end; - this.coords = coords; - this.itemTypes = itemTypes; - } - - public Date getStart() { - return start; - } - - public void setStart(Date start) { - this.start = start; - } - - public Date getEnd() { - return end; - } - - public void setEnd(Date end) { - this.end = end; - } - - public double[][][] getCoords() { - return coords; - } - - public void setCoords(double[][][] coords) { - this.coords = coords; - } - - public String[] getItemTypes() { - return itemTypes; - } - - public void setItemTypes(String[] itemTypes) { - this.itemTypes = itemTypes; - } -} \ No newline at end of file +import java.util.Comparator;; + +public class FeatureSorter implements Comparator{ + + @Override + public int compare(Feature o1, Feature o2) { + if( o1.getProperties().getCloudPercent() !=null && o2.getProperties().getCloudPercent() != null ) { + if( o1.getProperties().getCloudPercent().equals( o2.getProperties().getCloudPercent() ) ) { + if( o2.getProperties().getVisibleConfidencePercent() !=null && o1.getProperties().getVisibleConfidencePercent() != null ) { + return o2.getProperties().getVisibleConfidencePercent() - o1.getProperties().getVisibleConfidencePercent(); + }else if( o2.getProperties().getVisibleConfidencePercent() !=null ) { + return 1; + }else{ + return -1; + } + }else { + return o1.getProperties().getCloudPercent() - o2.getProperties().getCloudPercent(); + } + }else if( o1.getProperties().getCloudPercent() != null ) { + return -1; + }else if( o2.getProperties().getCloudPercent() != null) { + return 1; + }else { + if( o1.getProperties().getCloudCover()!=null && o2.getProperties().getCloudCover()!=null ) { + return (int) ( (o1.getProperties().getCloudCover() - o2.getProperties().getCloudCover() ) * 100 ); + } else { + return 1; // No way to know so return the latest + } + } + } + +} From be198b7060ba02506e75d93ae20e8e8cec4aaa26 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:53 +0100 Subject: [PATCH 0585/1620] New translations Feature.java (French) --- .../earth/app/view/Messages_fr.properties | 81 ++++++++----------- 1 file changed, 32 insertions(+), 49 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index afe14d18fd..d3d85cb7ab 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,49 +1,32 @@ -package org.openforis.collect.earth.planet; - -import java.util.Date; - -public class PlanetRequestParameters { - private Date start; - private Date end; - private double[][][] coords; - private String[] itemTypes; - - public PlanetRequestParameters(Date start, Date end, double[][][] coords, String[] itemTypes) { - this.start = start; - this.end = end; - this.coords = coords; - this.itemTypes = itemTypes; - } - - public Date getStart() { - return start; - } - - public void setStart(Date start) { - this.start = start; - } - - public Date getEnd() { - return end; - } - - public void setEnd(Date end) { - this.end = end; - } - - public double[][][] getCoords() { - return coords; - } - - public void setCoords(double[][][] coords) { - this.coords = coords; - } - - public String[] getItemTypes() { - return itemTypes; - } - - public void setItemTypes(String[] itemTypes) { - this.itemTypes = itemTypes; - } -} \ No newline at end of file +package org.openforis.collect.earth.planet; + +public class Feature { + + FeatureProperties properties; + String id; + + public FeatureProperties getProperties() { + return properties; + } + + public void setProperties(FeatureProperties properties) { + this.properties = properties; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + @Override + public String toString() { + return id + + " - cloud percent " + (properties.getCloudPercent()!=null?properties.getCloudPercent():"NULL") + + " - visible confidence percent " + (properties.getVisibleConfidencePercent()!=null?properties.getVisibleConfidencePercent():"NULL") + + " - cloud cover " + (properties.getCloudCover()!=null?properties.getCloudCover():"NULL") + + " - item type " + properties.getItemType() + "\n"; + } +} From 9e31cc54cf4be3036d55fd4a074e8e4d2fd995e5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:54 +0100 Subject: [PATCH 0586/1620] New translations Feature.java (Spanish) --- .../earth/app/view/Messages_es.properties | 40 +++++++++++-------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 16edcc9124..d3d85cb7ab 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,26 +1,32 @@ package org.openforis.collect.earth.planet; -public class GeoJson { +public class Feature { - String type; // for geojson - double[][][] coordinates; - - public GeoJson(String type, double[][][] coordinates) { - super(); - this.type = type; - this.coordinates = coordinates; - } - public String getType() { - return type; + FeatureProperties properties; + String id; + + public FeatureProperties getProperties() { + return properties; } - public void setType(String type) { - this.type = type; + + public void setProperties(FeatureProperties properties) { + this.properties = properties; } - public double[][][] getCoordinates() { - return coordinates; + + public String getId() { + return id; } - public void setCoordinates(double[][][] coordinates) { - this.coordinates = coordinates; + + public void setId(String id) { + this.id = id; } + @Override + public String toString() { + return id + + " - cloud percent " + (properties.getCloudPercent()!=null?properties.getCloudPercent():"NULL") + + " - visible confidence percent " + (properties.getVisibleConfidencePercent()!=null?properties.getVisibleConfidencePercent():"NULL") + + " - cloud cover " + (properties.getCloudCover()!=null?properties.getCloudCover():"NULL") + + " - item type " + properties.getItemType() + "\n"; + } } From e3ad7eb8a90443e23d117d3746b28011bdfc6bdb Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:55 +0100 Subject: [PATCH 0587/1620] New translations Feature.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 66 +++++++++---------- 1 file changed, 32 insertions(+), 34 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 1e116c4a2d..d3d85cb7ab 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,34 +1,32 @@ -package org.openforis.collect.earth.planet; - -import java.util.Comparator;; - -public class FeatureSorter implements Comparator{ - - @Override - public int compare(Feature o1, Feature o2) { - if( o1.getProperties().getCloudPercent() !=null && o2.getProperties().getCloudPercent() != null ) { - if( o1.getProperties().getCloudPercent().equals( o2.getProperties().getCloudPercent() ) ) { - if( o2.getProperties().getVisibleConfidencePercent() !=null && o1.getProperties().getVisibleConfidencePercent() != null ) { - return o2.getProperties().getVisibleConfidencePercent() - o1.getProperties().getVisibleConfidencePercent(); - }else if( o2.getProperties().getVisibleConfidencePercent() !=null ) { - return 1; - }else{ - return -1; - } - }else { - return o1.getProperties().getCloudPercent() - o2.getProperties().getCloudPercent(); - } - }else if( o1.getProperties().getCloudPercent() != null ) { - return -1; - }else if( o2.getProperties().getCloudPercent() != null) { - return 1; - }else { - if( o1.getProperties().getCloudCover()!=null && o2.getProperties().getCloudCover()!=null ) { - return (int) ( (o1.getProperties().getCloudCover() - o2.getProperties().getCloudCover() ) * 100 ); - } else { - return 1; // No way to know so return the latest - } - } - } - -} +package org.openforis.collect.earth.planet; + +public class Feature { + + FeatureProperties properties; + String id; + + public FeatureProperties getProperties() { + return properties; + } + + public void setProperties(FeatureProperties properties) { + this.properties = properties; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + @Override + public String toString() { + return id + + " - cloud percent " + (properties.getCloudPercent()!=null?properties.getCloudPercent():"NULL") + + " - visible confidence percent " + (properties.getVisibleConfidencePercent()!=null?properties.getVisibleConfidencePercent():"NULL") + + " - cloud cover " + (properties.getCloudCover()!=null?properties.getCloudCover():"NULL") + + " - item type " + properties.getItemType() + "\n"; + } +} From b866a203d4c033f3998f57972f8b436df956e3d5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:56 +0100 Subject: [PATCH 0588/1620] New translations Feature.java (English) --- .../earth/app/view/Messages_en.properties | 54 ++++++++++--------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 300057dbb3..d3d85cb7ab 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,26 +1,32 @@ package org.openforis.collect.earth.planet; -import java.time.Instant; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.util.Date; - -public class DateUtils { - - public static Date asDate(LocalDate localDate) { - return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant()); - } - - public static Date asDate(LocalDateTime localDateTime) { - return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()); - } - - public static LocalDate asLocalDate(Date date) { - return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate(); - } - - public static LocalDateTime asLocalDateTime(Date date) { - return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime(); - } -} \ No newline at end of file +public class Feature { + + FeatureProperties properties; + String id; + + public FeatureProperties getProperties() { + return properties; + } + + public void setProperties(FeatureProperties properties) { + this.properties = properties; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + @Override + public String toString() { + return id + + " - cloud percent " + (properties.getCloudPercent()!=null?properties.getCloudPercent():"NULL") + + " - visible confidence percent " + (properties.getVisibleConfidencePercent()!=null?properties.getVisibleConfidencePercent():"NULL") + + " - cloud cover " + (properties.getCloudCover()!=null?properties.getCloudCover():"NULL") + + " - item type " + properties.getItemType() + "\n"; + } +} From c647fbcad68f8a3a568d8eb4c7fd12e20d269f11 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:58 +0100 Subject: [PATCH 0589/1620] New translations FeatureProperties.java (French) --- .../earth/app/view/Messages_fr.properties | 231 ++++++++++++++++-- 1 file changed, 209 insertions(+), 22 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index d3d85cb7ab..cd7f57b2a1 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,32 +1,219 @@ package org.openforis.collect.earth.planet; -public class Feature { +import java.util.Date; - FeatureProperties properties; - String id; +public class FeatureProperties { - public FeatureProperties getProperties() { - return properties; + Date acquired; + Float anomalous_pixels; + Integer clear_confidence_percent; + Integer clear_percent; + Float cloud_cover; + Integer cloud_percent; + Integer columns; + String epsg_code; + Boolean ground_control; + Integer heavy_haze_percent; + String instrument; + String item_type; + Integer light_haze_percent; + Integer origin_x; + Integer origin_y; + Float pixel_resolution; + String provider; + Date published; + String quality_category; + Integer rows; + String satellite_id; + Integer shadow_percent; + Integer snow_ice_percent; + Integer strip_id; + Float sun_azimuth; + Float sun_elevation; + Date updated; + Float view_angle; + Integer visible_confidence_percent; + Integer visible_percent; + public Date getAcquired() { + return acquired; } - - public void setProperties(FeatureProperties properties) { - this.properties = properties; + public void setAcquired(Date acquired) { + this.acquired = acquired; } - - public String getId() { - return id; + public Float getAnomalousPixels() { + return anomalous_pixels; } - - public void setId(String id) { - this.id = id; + public void setAnomalousPixels(Float anomalous_pixels) { + this.anomalous_pixels = anomalous_pixels; } - - @Override - public String toString() { - return id + - " - cloud percent " + (properties.getCloudPercent()!=null?properties.getCloudPercent():"NULL") + - " - visible confidence percent " + (properties.getVisibleConfidencePercent()!=null?properties.getVisibleConfidencePercent():"NULL") + - " - cloud cover " + (properties.getCloudCover()!=null?properties.getCloudCover():"NULL") + - " - item type " + properties.getItemType() + "\n"; + public Integer getClearConfidence_percent() { + return clear_confidence_percent; + } + public void setClearConfidencePercent(Integer clear_confidence_percent) { + this.clear_confidence_percent = clear_confidence_percent; + } + public Integer getClearPercent() { + return clear_percent; + } + public void setClearPercent(Integer clear_percent) { + this.clear_percent = clear_percent; + } + public Float getCloudCover() { + return cloud_cover; + } + public void setCloudCover(Float cloud_cover) { + this.cloud_cover = cloud_cover; + } + public Integer getCloudPercent() { + return cloud_percent; + } + public void setCloudPercent(Integer cloud_percent) { + this.cloud_percent = cloud_percent; + } + public Integer getColumns() { + return columns; + } + public void setColumns(Integer columns) { + this.columns = columns; + } + public String getEpsgCode() { + return epsg_code; + } + public void setEpsgCode(String epsg_code) { + this.epsg_code = epsg_code; + } + public Boolean getGroundControl() { + return ground_control; + } + public void setGroundControl(Boolean ground_control) { + this.ground_control = ground_control; + } + public Integer getHeavyHazePercent() { + return heavy_haze_percent; + } + public void setHeavyHazePercent(Integer heavy_haze_percent) { + this.heavy_haze_percent = heavy_haze_percent; + } + public String getInstrument() { + return instrument; + } + public void setInstrument(String instrument) { + this.instrument = instrument; + } + public String getItemType() { + return item_type; + } + public void setItemType(String item_type) { + this.item_type = item_type; + } + public Integer getLightHaze_percent() { + return light_haze_percent; + } + public void setLightHazePercent(Integer light_haze_percent) { + this.light_haze_percent = light_haze_percent; + } + public Integer getOriginX() { + return origin_x; + } + public void setOriginX(Integer origin_x) { + this.origin_x = origin_x; + } + public Integer getOriginY() { + return origin_y; + } + public void setOriginY(Integer origin_y) { + this.origin_y = origin_y; + } + public Float getPixelResolution() { + return pixel_resolution; + } + public void setPixelResolution(Float pixel_resolution) { + this.pixel_resolution = pixel_resolution; } + public String getProvider() { + return provider; + } + public void setProvider(String provider) { + this.provider = provider; + } + public Date getPublished() { + return published; + } + public void setPublished(Date published) { + this.published = published; + } + public String getQualityCategory() { + return quality_category; + } + public void setQualityCategory(String quality_category) { + this.quality_category = quality_category; + } + public Integer getRows() { + return rows; + } + public void setRows(Integer rows) { + this.rows = rows; + } + public String getSatelliteId() { + return satellite_id; + } + public void setSatelliteId(String satellite_id) { + this.satellite_id = satellite_id; + } + public Integer getShadowPercent() { + return shadow_percent; + } + public void setShadowPercent(Integer shadow_percent) { + this.shadow_percent = shadow_percent; + } + public Integer getSnowIcePercent() { + return snow_ice_percent; + } + public void setSnowIcePercent(Integer snow_ice_percent) { + this.snow_ice_percent = snow_ice_percent; + } + public Integer getStripId() { + return strip_id; + } + public void setStripId(Integer strip_id) { + this.strip_id = strip_id; + } + public Float getSunAzimuth() { + return sun_azimuth; + } + public void setSunAzimuth(Float sun_azimuth) { + this.sun_azimuth = sun_azimuth; + } + public Float getSunElevation() { + return sun_elevation; + } + public void setSunElevation(Float sun_elevation) { + this.sun_elevation = sun_elevation; + } + public Date getUpdated() { + return updated; + } + public void setUpdated(Date updated) { + this.updated = updated; + } + public Float getViewAngle() { + return view_angle; + } + public void setViewAngle(Float view_angle) { + this.view_angle = view_angle; + } + public Integer getVisibleConfidencePercent() { + return visible_confidence_percent; + } + public void setVisibleConfidencePercent(Integer visible_confidence_percent) { + this.visible_confidence_percent = visible_confidence_percent; + } + public Integer getVisiblePercent() { + return visible_percent; + } + public void setVisiblePercent(Integer visible_percent) { + this.visible_percent = visible_percent; + } + + } From 175c1d23c8010e1bca2d650d820601700b8e6951 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:31:59 +0100 Subject: [PATCH 0590/1620] New translations FeatureProperties.java (Spanish) --- .../earth/app/view/Messages_es.properties | 231 ++++++++++++++++-- 1 file changed, 209 insertions(+), 22 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index d3d85cb7ab..cd7f57b2a1 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,32 +1,219 @@ package org.openforis.collect.earth.planet; -public class Feature { +import java.util.Date; - FeatureProperties properties; - String id; +public class FeatureProperties { - public FeatureProperties getProperties() { - return properties; + Date acquired; + Float anomalous_pixels; + Integer clear_confidence_percent; + Integer clear_percent; + Float cloud_cover; + Integer cloud_percent; + Integer columns; + String epsg_code; + Boolean ground_control; + Integer heavy_haze_percent; + String instrument; + String item_type; + Integer light_haze_percent; + Integer origin_x; + Integer origin_y; + Float pixel_resolution; + String provider; + Date published; + String quality_category; + Integer rows; + String satellite_id; + Integer shadow_percent; + Integer snow_ice_percent; + Integer strip_id; + Float sun_azimuth; + Float sun_elevation; + Date updated; + Float view_angle; + Integer visible_confidence_percent; + Integer visible_percent; + public Date getAcquired() { + return acquired; } - - public void setProperties(FeatureProperties properties) { - this.properties = properties; + public void setAcquired(Date acquired) { + this.acquired = acquired; } - - public String getId() { - return id; + public Float getAnomalousPixels() { + return anomalous_pixels; } - - public void setId(String id) { - this.id = id; + public void setAnomalousPixels(Float anomalous_pixels) { + this.anomalous_pixels = anomalous_pixels; } - - @Override - public String toString() { - return id + - " - cloud percent " + (properties.getCloudPercent()!=null?properties.getCloudPercent():"NULL") + - " - visible confidence percent " + (properties.getVisibleConfidencePercent()!=null?properties.getVisibleConfidencePercent():"NULL") + - " - cloud cover " + (properties.getCloudCover()!=null?properties.getCloudCover():"NULL") + - " - item type " + properties.getItemType() + "\n"; + public Integer getClearConfidence_percent() { + return clear_confidence_percent; + } + public void setClearConfidencePercent(Integer clear_confidence_percent) { + this.clear_confidence_percent = clear_confidence_percent; + } + public Integer getClearPercent() { + return clear_percent; + } + public void setClearPercent(Integer clear_percent) { + this.clear_percent = clear_percent; + } + public Float getCloudCover() { + return cloud_cover; + } + public void setCloudCover(Float cloud_cover) { + this.cloud_cover = cloud_cover; + } + public Integer getCloudPercent() { + return cloud_percent; + } + public void setCloudPercent(Integer cloud_percent) { + this.cloud_percent = cloud_percent; + } + public Integer getColumns() { + return columns; + } + public void setColumns(Integer columns) { + this.columns = columns; + } + public String getEpsgCode() { + return epsg_code; + } + public void setEpsgCode(String epsg_code) { + this.epsg_code = epsg_code; + } + public Boolean getGroundControl() { + return ground_control; + } + public void setGroundControl(Boolean ground_control) { + this.ground_control = ground_control; + } + public Integer getHeavyHazePercent() { + return heavy_haze_percent; + } + public void setHeavyHazePercent(Integer heavy_haze_percent) { + this.heavy_haze_percent = heavy_haze_percent; + } + public String getInstrument() { + return instrument; + } + public void setInstrument(String instrument) { + this.instrument = instrument; + } + public String getItemType() { + return item_type; + } + public void setItemType(String item_type) { + this.item_type = item_type; + } + public Integer getLightHaze_percent() { + return light_haze_percent; + } + public void setLightHazePercent(Integer light_haze_percent) { + this.light_haze_percent = light_haze_percent; + } + public Integer getOriginX() { + return origin_x; + } + public void setOriginX(Integer origin_x) { + this.origin_x = origin_x; + } + public Integer getOriginY() { + return origin_y; + } + public void setOriginY(Integer origin_y) { + this.origin_y = origin_y; + } + public Float getPixelResolution() { + return pixel_resolution; + } + public void setPixelResolution(Float pixel_resolution) { + this.pixel_resolution = pixel_resolution; } + public String getProvider() { + return provider; + } + public void setProvider(String provider) { + this.provider = provider; + } + public Date getPublished() { + return published; + } + public void setPublished(Date published) { + this.published = published; + } + public String getQualityCategory() { + return quality_category; + } + public void setQualityCategory(String quality_category) { + this.quality_category = quality_category; + } + public Integer getRows() { + return rows; + } + public void setRows(Integer rows) { + this.rows = rows; + } + public String getSatelliteId() { + return satellite_id; + } + public void setSatelliteId(String satellite_id) { + this.satellite_id = satellite_id; + } + public Integer getShadowPercent() { + return shadow_percent; + } + public void setShadowPercent(Integer shadow_percent) { + this.shadow_percent = shadow_percent; + } + public Integer getSnowIcePercent() { + return snow_ice_percent; + } + public void setSnowIcePercent(Integer snow_ice_percent) { + this.snow_ice_percent = snow_ice_percent; + } + public Integer getStripId() { + return strip_id; + } + public void setStripId(Integer strip_id) { + this.strip_id = strip_id; + } + public Float getSunAzimuth() { + return sun_azimuth; + } + public void setSunAzimuth(Float sun_azimuth) { + this.sun_azimuth = sun_azimuth; + } + public Float getSunElevation() { + return sun_elevation; + } + public void setSunElevation(Float sun_elevation) { + this.sun_elevation = sun_elevation; + } + public Date getUpdated() { + return updated; + } + public void setUpdated(Date updated) { + this.updated = updated; + } + public Float getViewAngle() { + return view_angle; + } + public void setViewAngle(Float view_angle) { + this.view_angle = view_angle; + } + public Integer getVisibleConfidencePercent() { + return visible_confidence_percent; + } + public void setVisibleConfidencePercent(Integer visible_confidence_percent) { + this.visible_confidence_percent = visible_confidence_percent; + } + public Integer getVisiblePercent() { + return visible_percent; + } + public void setVisiblePercent(Integer visible_percent) { + this.visible_percent = visible_percent; + } + + } From 7010f87772bcbe2b7f0e1504f3e5fc131f58e40a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:00 +0100 Subject: [PATCH 0591/1620] New translations FeatureProperties.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 231 ++++++++++++++++-- 1 file changed, 209 insertions(+), 22 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index d3d85cb7ab..cd7f57b2a1 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,32 +1,219 @@ package org.openforis.collect.earth.planet; -public class Feature { +import java.util.Date; - FeatureProperties properties; - String id; +public class FeatureProperties { - public FeatureProperties getProperties() { - return properties; + Date acquired; + Float anomalous_pixels; + Integer clear_confidence_percent; + Integer clear_percent; + Float cloud_cover; + Integer cloud_percent; + Integer columns; + String epsg_code; + Boolean ground_control; + Integer heavy_haze_percent; + String instrument; + String item_type; + Integer light_haze_percent; + Integer origin_x; + Integer origin_y; + Float pixel_resolution; + String provider; + Date published; + String quality_category; + Integer rows; + String satellite_id; + Integer shadow_percent; + Integer snow_ice_percent; + Integer strip_id; + Float sun_azimuth; + Float sun_elevation; + Date updated; + Float view_angle; + Integer visible_confidence_percent; + Integer visible_percent; + public Date getAcquired() { + return acquired; } - - public void setProperties(FeatureProperties properties) { - this.properties = properties; + public void setAcquired(Date acquired) { + this.acquired = acquired; } - - public String getId() { - return id; + public Float getAnomalousPixels() { + return anomalous_pixels; } - - public void setId(String id) { - this.id = id; + public void setAnomalousPixels(Float anomalous_pixels) { + this.anomalous_pixels = anomalous_pixels; } - - @Override - public String toString() { - return id + - " - cloud percent " + (properties.getCloudPercent()!=null?properties.getCloudPercent():"NULL") + - " - visible confidence percent " + (properties.getVisibleConfidencePercent()!=null?properties.getVisibleConfidencePercent():"NULL") + - " - cloud cover " + (properties.getCloudCover()!=null?properties.getCloudCover():"NULL") + - " - item type " + properties.getItemType() + "\n"; + public Integer getClearConfidence_percent() { + return clear_confidence_percent; + } + public void setClearConfidencePercent(Integer clear_confidence_percent) { + this.clear_confidence_percent = clear_confidence_percent; + } + public Integer getClearPercent() { + return clear_percent; + } + public void setClearPercent(Integer clear_percent) { + this.clear_percent = clear_percent; + } + public Float getCloudCover() { + return cloud_cover; + } + public void setCloudCover(Float cloud_cover) { + this.cloud_cover = cloud_cover; + } + public Integer getCloudPercent() { + return cloud_percent; + } + public void setCloudPercent(Integer cloud_percent) { + this.cloud_percent = cloud_percent; + } + public Integer getColumns() { + return columns; + } + public void setColumns(Integer columns) { + this.columns = columns; + } + public String getEpsgCode() { + return epsg_code; + } + public void setEpsgCode(String epsg_code) { + this.epsg_code = epsg_code; + } + public Boolean getGroundControl() { + return ground_control; + } + public void setGroundControl(Boolean ground_control) { + this.ground_control = ground_control; + } + public Integer getHeavyHazePercent() { + return heavy_haze_percent; + } + public void setHeavyHazePercent(Integer heavy_haze_percent) { + this.heavy_haze_percent = heavy_haze_percent; + } + public String getInstrument() { + return instrument; + } + public void setInstrument(String instrument) { + this.instrument = instrument; + } + public String getItemType() { + return item_type; + } + public void setItemType(String item_type) { + this.item_type = item_type; + } + public Integer getLightHaze_percent() { + return light_haze_percent; + } + public void setLightHazePercent(Integer light_haze_percent) { + this.light_haze_percent = light_haze_percent; + } + public Integer getOriginX() { + return origin_x; + } + public void setOriginX(Integer origin_x) { + this.origin_x = origin_x; + } + public Integer getOriginY() { + return origin_y; + } + public void setOriginY(Integer origin_y) { + this.origin_y = origin_y; + } + public Float getPixelResolution() { + return pixel_resolution; + } + public void setPixelResolution(Float pixel_resolution) { + this.pixel_resolution = pixel_resolution; } + public String getProvider() { + return provider; + } + public void setProvider(String provider) { + this.provider = provider; + } + public Date getPublished() { + return published; + } + public void setPublished(Date published) { + this.published = published; + } + public String getQualityCategory() { + return quality_category; + } + public void setQualityCategory(String quality_category) { + this.quality_category = quality_category; + } + public Integer getRows() { + return rows; + } + public void setRows(Integer rows) { + this.rows = rows; + } + public String getSatelliteId() { + return satellite_id; + } + public void setSatelliteId(String satellite_id) { + this.satellite_id = satellite_id; + } + public Integer getShadowPercent() { + return shadow_percent; + } + public void setShadowPercent(Integer shadow_percent) { + this.shadow_percent = shadow_percent; + } + public Integer getSnowIcePercent() { + return snow_ice_percent; + } + public void setSnowIcePercent(Integer snow_ice_percent) { + this.snow_ice_percent = snow_ice_percent; + } + public Integer getStripId() { + return strip_id; + } + public void setStripId(Integer strip_id) { + this.strip_id = strip_id; + } + public Float getSunAzimuth() { + return sun_azimuth; + } + public void setSunAzimuth(Float sun_azimuth) { + this.sun_azimuth = sun_azimuth; + } + public Float getSunElevation() { + return sun_elevation; + } + public void setSunElevation(Float sun_elevation) { + this.sun_elevation = sun_elevation; + } + public Date getUpdated() { + return updated; + } + public void setUpdated(Date updated) { + this.updated = updated; + } + public Float getViewAngle() { + return view_angle; + } + public void setViewAngle(Float view_angle) { + this.view_angle = view_angle; + } + public Integer getVisibleConfidencePercent() { + return visible_confidence_percent; + } + public void setVisibleConfidencePercent(Integer visible_confidence_percent) { + this.visible_confidence_percent = visible_confidence_percent; + } + public Integer getVisiblePercent() { + return visible_percent; + } + public void setVisiblePercent(Integer visible_percent) { + this.visible_percent = visible_percent; + } + + } From d595429fbfd6a0bc68d5c7a5678ca3ef39f6a30f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:01 +0100 Subject: [PATCH 0592/1620] New translations FeatureProperties.java (English) --- .../earth/app/view/Messages_en.properties | 231 ++++++++++++++++-- 1 file changed, 209 insertions(+), 22 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index d3d85cb7ab..cd7f57b2a1 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,32 +1,219 @@ package org.openforis.collect.earth.planet; -public class Feature { +import java.util.Date; - FeatureProperties properties; - String id; +public class FeatureProperties { - public FeatureProperties getProperties() { - return properties; + Date acquired; + Float anomalous_pixels; + Integer clear_confidence_percent; + Integer clear_percent; + Float cloud_cover; + Integer cloud_percent; + Integer columns; + String epsg_code; + Boolean ground_control; + Integer heavy_haze_percent; + String instrument; + String item_type; + Integer light_haze_percent; + Integer origin_x; + Integer origin_y; + Float pixel_resolution; + String provider; + Date published; + String quality_category; + Integer rows; + String satellite_id; + Integer shadow_percent; + Integer snow_ice_percent; + Integer strip_id; + Float sun_azimuth; + Float sun_elevation; + Date updated; + Float view_angle; + Integer visible_confidence_percent; + Integer visible_percent; + public Date getAcquired() { + return acquired; } - - public void setProperties(FeatureProperties properties) { - this.properties = properties; + public void setAcquired(Date acquired) { + this.acquired = acquired; } - - public String getId() { - return id; + public Float getAnomalousPixels() { + return anomalous_pixels; } - - public void setId(String id) { - this.id = id; + public void setAnomalousPixels(Float anomalous_pixels) { + this.anomalous_pixels = anomalous_pixels; } - - @Override - public String toString() { - return id + - " - cloud percent " + (properties.getCloudPercent()!=null?properties.getCloudPercent():"NULL") + - " - visible confidence percent " + (properties.getVisibleConfidencePercent()!=null?properties.getVisibleConfidencePercent():"NULL") + - " - cloud cover " + (properties.getCloudCover()!=null?properties.getCloudCover():"NULL") + - " - item type " + properties.getItemType() + "\n"; + public Integer getClearConfidence_percent() { + return clear_confidence_percent; + } + public void setClearConfidencePercent(Integer clear_confidence_percent) { + this.clear_confidence_percent = clear_confidence_percent; + } + public Integer getClearPercent() { + return clear_percent; + } + public void setClearPercent(Integer clear_percent) { + this.clear_percent = clear_percent; + } + public Float getCloudCover() { + return cloud_cover; + } + public void setCloudCover(Float cloud_cover) { + this.cloud_cover = cloud_cover; + } + public Integer getCloudPercent() { + return cloud_percent; + } + public void setCloudPercent(Integer cloud_percent) { + this.cloud_percent = cloud_percent; + } + public Integer getColumns() { + return columns; + } + public void setColumns(Integer columns) { + this.columns = columns; + } + public String getEpsgCode() { + return epsg_code; + } + public void setEpsgCode(String epsg_code) { + this.epsg_code = epsg_code; + } + public Boolean getGroundControl() { + return ground_control; + } + public void setGroundControl(Boolean ground_control) { + this.ground_control = ground_control; + } + public Integer getHeavyHazePercent() { + return heavy_haze_percent; + } + public void setHeavyHazePercent(Integer heavy_haze_percent) { + this.heavy_haze_percent = heavy_haze_percent; + } + public String getInstrument() { + return instrument; + } + public void setInstrument(String instrument) { + this.instrument = instrument; + } + public String getItemType() { + return item_type; + } + public void setItemType(String item_type) { + this.item_type = item_type; + } + public Integer getLightHaze_percent() { + return light_haze_percent; + } + public void setLightHazePercent(Integer light_haze_percent) { + this.light_haze_percent = light_haze_percent; + } + public Integer getOriginX() { + return origin_x; + } + public void setOriginX(Integer origin_x) { + this.origin_x = origin_x; + } + public Integer getOriginY() { + return origin_y; + } + public void setOriginY(Integer origin_y) { + this.origin_y = origin_y; + } + public Float getPixelResolution() { + return pixel_resolution; + } + public void setPixelResolution(Float pixel_resolution) { + this.pixel_resolution = pixel_resolution; } + public String getProvider() { + return provider; + } + public void setProvider(String provider) { + this.provider = provider; + } + public Date getPublished() { + return published; + } + public void setPublished(Date published) { + this.published = published; + } + public String getQualityCategory() { + return quality_category; + } + public void setQualityCategory(String quality_category) { + this.quality_category = quality_category; + } + public Integer getRows() { + return rows; + } + public void setRows(Integer rows) { + this.rows = rows; + } + public String getSatelliteId() { + return satellite_id; + } + public void setSatelliteId(String satellite_id) { + this.satellite_id = satellite_id; + } + public Integer getShadowPercent() { + return shadow_percent; + } + public void setShadowPercent(Integer shadow_percent) { + this.shadow_percent = shadow_percent; + } + public Integer getSnowIcePercent() { + return snow_ice_percent; + } + public void setSnowIcePercent(Integer snow_ice_percent) { + this.snow_ice_percent = snow_ice_percent; + } + public Integer getStripId() { + return strip_id; + } + public void setStripId(Integer strip_id) { + this.strip_id = strip_id; + } + public Float getSunAzimuth() { + return sun_azimuth; + } + public void setSunAzimuth(Float sun_azimuth) { + this.sun_azimuth = sun_azimuth; + } + public Float getSunElevation() { + return sun_elevation; + } + public void setSunElevation(Float sun_elevation) { + this.sun_elevation = sun_elevation; + } + public Date getUpdated() { + return updated; + } + public void setUpdated(Date updated) { + this.updated = updated; + } + public Float getViewAngle() { + return view_angle; + } + public void setViewAngle(Float view_angle) { + this.view_angle = view_angle; + } + public Integer getVisibleConfidencePercent() { + return visible_confidence_percent; + } + public void setVisibleConfidencePercent(Integer visible_confidence_percent) { + this.visible_confidence_percent = visible_confidence_percent; + } + public Integer getVisiblePercent() { + return visible_percent; + } + public void setVisiblePercent(Integer visible_percent) { + this.visible_percent = visible_percent; + } + + } From 1439284801613707de44a9a50d6505de1224eaea Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:02 +0100 Subject: [PATCH 0593/1620] New translations FeatureSorter.java (French) --- .../earth/app/view/Messages_fr.properties | 253 +++--------------- 1 file changed, 34 insertions(+), 219 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index cd7f57b2a1..1e116c4a2d 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,219 +1,34 @@ -package org.openforis.collect.earth.planet; - -import java.util.Date; - -public class FeatureProperties { - - Date acquired; - Float anomalous_pixels; - Integer clear_confidence_percent; - Integer clear_percent; - Float cloud_cover; - Integer cloud_percent; - Integer columns; - String epsg_code; - Boolean ground_control; - Integer heavy_haze_percent; - String instrument; - String item_type; - Integer light_haze_percent; - Integer origin_x; - Integer origin_y; - Float pixel_resolution; - String provider; - Date published; - String quality_category; - Integer rows; - String satellite_id; - Integer shadow_percent; - Integer snow_ice_percent; - Integer strip_id; - Float sun_azimuth; - Float sun_elevation; - Date updated; - Float view_angle; - Integer visible_confidence_percent; - Integer visible_percent; - public Date getAcquired() { - return acquired; - } - public void setAcquired(Date acquired) { - this.acquired = acquired; - } - public Float getAnomalousPixels() { - return anomalous_pixels; - } - public void setAnomalousPixels(Float anomalous_pixels) { - this.anomalous_pixels = anomalous_pixels; - } - public Integer getClearConfidence_percent() { - return clear_confidence_percent; - } - public void setClearConfidencePercent(Integer clear_confidence_percent) { - this.clear_confidence_percent = clear_confidence_percent; - } - public Integer getClearPercent() { - return clear_percent; - } - public void setClearPercent(Integer clear_percent) { - this.clear_percent = clear_percent; - } - public Float getCloudCover() { - return cloud_cover; - } - public void setCloudCover(Float cloud_cover) { - this.cloud_cover = cloud_cover; - } - public Integer getCloudPercent() { - return cloud_percent; - } - public void setCloudPercent(Integer cloud_percent) { - this.cloud_percent = cloud_percent; - } - public Integer getColumns() { - return columns; - } - public void setColumns(Integer columns) { - this.columns = columns; - } - public String getEpsgCode() { - return epsg_code; - } - public void setEpsgCode(String epsg_code) { - this.epsg_code = epsg_code; - } - public Boolean getGroundControl() { - return ground_control; - } - public void setGroundControl(Boolean ground_control) { - this.ground_control = ground_control; - } - public Integer getHeavyHazePercent() { - return heavy_haze_percent; - } - public void setHeavyHazePercent(Integer heavy_haze_percent) { - this.heavy_haze_percent = heavy_haze_percent; - } - public String getInstrument() { - return instrument; - } - public void setInstrument(String instrument) { - this.instrument = instrument; - } - public String getItemType() { - return item_type; - } - public void setItemType(String item_type) { - this.item_type = item_type; - } - public Integer getLightHaze_percent() { - return light_haze_percent; - } - public void setLightHazePercent(Integer light_haze_percent) { - this.light_haze_percent = light_haze_percent; - } - public Integer getOriginX() { - return origin_x; - } - public void setOriginX(Integer origin_x) { - this.origin_x = origin_x; - } - public Integer getOriginY() { - return origin_y; - } - public void setOriginY(Integer origin_y) { - this.origin_y = origin_y; - } - public Float getPixelResolution() { - return pixel_resolution; - } - public void setPixelResolution(Float pixel_resolution) { - this.pixel_resolution = pixel_resolution; - } - public String getProvider() { - return provider; - } - public void setProvider(String provider) { - this.provider = provider; - } - public Date getPublished() { - return published; - } - public void setPublished(Date published) { - this.published = published; - } - public String getQualityCategory() { - return quality_category; - } - public void setQualityCategory(String quality_category) { - this.quality_category = quality_category; - } - public Integer getRows() { - return rows; - } - public void setRows(Integer rows) { - this.rows = rows; - } - public String getSatelliteId() { - return satellite_id; - } - public void setSatelliteId(String satellite_id) { - this.satellite_id = satellite_id; - } - public Integer getShadowPercent() { - return shadow_percent; - } - public void setShadowPercent(Integer shadow_percent) { - this.shadow_percent = shadow_percent; - } - public Integer getSnowIcePercent() { - return snow_ice_percent; - } - public void setSnowIcePercent(Integer snow_ice_percent) { - this.snow_ice_percent = snow_ice_percent; - } - public Integer getStripId() { - return strip_id; - } - public void setStripId(Integer strip_id) { - this.strip_id = strip_id; - } - public Float getSunAzimuth() { - return sun_azimuth; - } - public void setSunAzimuth(Float sun_azimuth) { - this.sun_azimuth = sun_azimuth; - } - public Float getSunElevation() { - return sun_elevation; - } - public void setSunElevation(Float sun_elevation) { - this.sun_elevation = sun_elevation; - } - public Date getUpdated() { - return updated; - } - public void setUpdated(Date updated) { - this.updated = updated; - } - public Float getViewAngle() { - return view_angle; - } - public void setViewAngle(Float view_angle) { - this.view_angle = view_angle; - } - public Integer getVisibleConfidencePercent() { - return visible_confidence_percent; - } - public void setVisibleConfidencePercent(Integer visible_confidence_percent) { - this.visible_confidence_percent = visible_confidence_percent; - } - public Integer getVisiblePercent() { - return visible_percent; - } - public void setVisiblePercent(Integer visible_percent) { - this.visible_percent = visible_percent; - } - - -} +package org.openforis.collect.earth.planet; + +import java.util.Comparator;; + +public class FeatureSorter implements Comparator{ + + @Override + public int compare(Feature o1, Feature o2) { + if( o1.getProperties().getCloudPercent() !=null && o2.getProperties().getCloudPercent() != null ) { + if( o1.getProperties().getCloudPercent().equals( o2.getProperties().getCloudPercent() ) ) { + if( o2.getProperties().getVisibleConfidencePercent() !=null && o1.getProperties().getVisibleConfidencePercent() != null ) { + return o2.getProperties().getVisibleConfidencePercent() - o1.getProperties().getVisibleConfidencePercent(); + }else if( o2.getProperties().getVisibleConfidencePercent() !=null ) { + return 1; + }else{ + return -1; + } + }else { + return o1.getProperties().getCloudPercent() - o2.getProperties().getCloudPercent(); + } + }else if( o1.getProperties().getCloudPercent() != null ) { + return -1; + }else if( o2.getProperties().getCloudPercent() != null) { + return 1; + }else { + if( o1.getProperties().getCloudCover()!=null && o2.getProperties().getCloudCover()!=null ) { + return (int) ( (o1.getProperties().getCloudCover() - o2.getProperties().getCloudCover() ) * 100 ); + } else { + return 1; // No way to know so return the latest + } + } + } + +} From de1f7b3f6c58b19e9d93f4fe16859bdfbb31c77e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:04 +0100 Subject: [PATCH 0594/1620] New translations FeatureSorter.java (Spanish) --- .../earth/app/view/Messages_es.properties | 253 +++--------------- 1 file changed, 34 insertions(+), 219 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index cd7f57b2a1..1e116c4a2d 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,219 +1,34 @@ -package org.openforis.collect.earth.planet; - -import java.util.Date; - -public class FeatureProperties { - - Date acquired; - Float anomalous_pixels; - Integer clear_confidence_percent; - Integer clear_percent; - Float cloud_cover; - Integer cloud_percent; - Integer columns; - String epsg_code; - Boolean ground_control; - Integer heavy_haze_percent; - String instrument; - String item_type; - Integer light_haze_percent; - Integer origin_x; - Integer origin_y; - Float pixel_resolution; - String provider; - Date published; - String quality_category; - Integer rows; - String satellite_id; - Integer shadow_percent; - Integer snow_ice_percent; - Integer strip_id; - Float sun_azimuth; - Float sun_elevation; - Date updated; - Float view_angle; - Integer visible_confidence_percent; - Integer visible_percent; - public Date getAcquired() { - return acquired; - } - public void setAcquired(Date acquired) { - this.acquired = acquired; - } - public Float getAnomalousPixels() { - return anomalous_pixels; - } - public void setAnomalousPixels(Float anomalous_pixels) { - this.anomalous_pixels = anomalous_pixels; - } - public Integer getClearConfidence_percent() { - return clear_confidence_percent; - } - public void setClearConfidencePercent(Integer clear_confidence_percent) { - this.clear_confidence_percent = clear_confidence_percent; - } - public Integer getClearPercent() { - return clear_percent; - } - public void setClearPercent(Integer clear_percent) { - this.clear_percent = clear_percent; - } - public Float getCloudCover() { - return cloud_cover; - } - public void setCloudCover(Float cloud_cover) { - this.cloud_cover = cloud_cover; - } - public Integer getCloudPercent() { - return cloud_percent; - } - public void setCloudPercent(Integer cloud_percent) { - this.cloud_percent = cloud_percent; - } - public Integer getColumns() { - return columns; - } - public void setColumns(Integer columns) { - this.columns = columns; - } - public String getEpsgCode() { - return epsg_code; - } - public void setEpsgCode(String epsg_code) { - this.epsg_code = epsg_code; - } - public Boolean getGroundControl() { - return ground_control; - } - public void setGroundControl(Boolean ground_control) { - this.ground_control = ground_control; - } - public Integer getHeavyHazePercent() { - return heavy_haze_percent; - } - public void setHeavyHazePercent(Integer heavy_haze_percent) { - this.heavy_haze_percent = heavy_haze_percent; - } - public String getInstrument() { - return instrument; - } - public void setInstrument(String instrument) { - this.instrument = instrument; - } - public String getItemType() { - return item_type; - } - public void setItemType(String item_type) { - this.item_type = item_type; - } - public Integer getLightHaze_percent() { - return light_haze_percent; - } - public void setLightHazePercent(Integer light_haze_percent) { - this.light_haze_percent = light_haze_percent; - } - public Integer getOriginX() { - return origin_x; - } - public void setOriginX(Integer origin_x) { - this.origin_x = origin_x; - } - public Integer getOriginY() { - return origin_y; - } - public void setOriginY(Integer origin_y) { - this.origin_y = origin_y; - } - public Float getPixelResolution() { - return pixel_resolution; - } - public void setPixelResolution(Float pixel_resolution) { - this.pixel_resolution = pixel_resolution; - } - public String getProvider() { - return provider; - } - public void setProvider(String provider) { - this.provider = provider; - } - public Date getPublished() { - return published; - } - public void setPublished(Date published) { - this.published = published; - } - public String getQualityCategory() { - return quality_category; - } - public void setQualityCategory(String quality_category) { - this.quality_category = quality_category; - } - public Integer getRows() { - return rows; - } - public void setRows(Integer rows) { - this.rows = rows; - } - public String getSatelliteId() { - return satellite_id; - } - public void setSatelliteId(String satellite_id) { - this.satellite_id = satellite_id; - } - public Integer getShadowPercent() { - return shadow_percent; - } - public void setShadowPercent(Integer shadow_percent) { - this.shadow_percent = shadow_percent; - } - public Integer getSnowIcePercent() { - return snow_ice_percent; - } - public void setSnowIcePercent(Integer snow_ice_percent) { - this.snow_ice_percent = snow_ice_percent; - } - public Integer getStripId() { - return strip_id; - } - public void setStripId(Integer strip_id) { - this.strip_id = strip_id; - } - public Float getSunAzimuth() { - return sun_azimuth; - } - public void setSunAzimuth(Float sun_azimuth) { - this.sun_azimuth = sun_azimuth; - } - public Float getSunElevation() { - return sun_elevation; - } - public void setSunElevation(Float sun_elevation) { - this.sun_elevation = sun_elevation; - } - public Date getUpdated() { - return updated; - } - public void setUpdated(Date updated) { - this.updated = updated; - } - public Float getViewAngle() { - return view_angle; - } - public void setViewAngle(Float view_angle) { - this.view_angle = view_angle; - } - public Integer getVisibleConfidencePercent() { - return visible_confidence_percent; - } - public void setVisibleConfidencePercent(Integer visible_confidence_percent) { - this.visible_confidence_percent = visible_confidence_percent; - } - public Integer getVisiblePercent() { - return visible_percent; - } - public void setVisiblePercent(Integer visible_percent) { - this.visible_percent = visible_percent; - } - - -} +package org.openforis.collect.earth.planet; + +import java.util.Comparator;; + +public class FeatureSorter implements Comparator{ + + @Override + public int compare(Feature o1, Feature o2) { + if( o1.getProperties().getCloudPercent() !=null && o2.getProperties().getCloudPercent() != null ) { + if( o1.getProperties().getCloudPercent().equals( o2.getProperties().getCloudPercent() ) ) { + if( o2.getProperties().getVisibleConfidencePercent() !=null && o1.getProperties().getVisibleConfidencePercent() != null ) { + return o2.getProperties().getVisibleConfidencePercent() - o1.getProperties().getVisibleConfidencePercent(); + }else if( o2.getProperties().getVisibleConfidencePercent() !=null ) { + return 1; + }else{ + return -1; + } + }else { + return o1.getProperties().getCloudPercent() - o2.getProperties().getCloudPercent(); + } + }else if( o1.getProperties().getCloudPercent() != null ) { + return -1; + }else if( o2.getProperties().getCloudPercent() != null) { + return 1; + }else { + if( o1.getProperties().getCloudCover()!=null && o2.getProperties().getCloudCover()!=null ) { + return (int) ( (o1.getProperties().getCloudCover() - o2.getProperties().getCloudCover() ) * 100 ); + } else { + return 1; // No way to know so return the latest + } + } + } + +} From 3dcd9571069c85a1e6f23ac1937a843f6ba873a1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:05 +0100 Subject: [PATCH 0595/1620] New translations FeatureSorter.java (English) --- .../earth/app/view/Messages_en.properties | 253 +++--------------- 1 file changed, 34 insertions(+), 219 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index cd7f57b2a1..1e116c4a2d 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,219 +1,34 @@ -package org.openforis.collect.earth.planet; - -import java.util.Date; - -public class FeatureProperties { - - Date acquired; - Float anomalous_pixels; - Integer clear_confidence_percent; - Integer clear_percent; - Float cloud_cover; - Integer cloud_percent; - Integer columns; - String epsg_code; - Boolean ground_control; - Integer heavy_haze_percent; - String instrument; - String item_type; - Integer light_haze_percent; - Integer origin_x; - Integer origin_y; - Float pixel_resolution; - String provider; - Date published; - String quality_category; - Integer rows; - String satellite_id; - Integer shadow_percent; - Integer snow_ice_percent; - Integer strip_id; - Float sun_azimuth; - Float sun_elevation; - Date updated; - Float view_angle; - Integer visible_confidence_percent; - Integer visible_percent; - public Date getAcquired() { - return acquired; - } - public void setAcquired(Date acquired) { - this.acquired = acquired; - } - public Float getAnomalousPixels() { - return anomalous_pixels; - } - public void setAnomalousPixels(Float anomalous_pixels) { - this.anomalous_pixels = anomalous_pixels; - } - public Integer getClearConfidence_percent() { - return clear_confidence_percent; - } - public void setClearConfidencePercent(Integer clear_confidence_percent) { - this.clear_confidence_percent = clear_confidence_percent; - } - public Integer getClearPercent() { - return clear_percent; - } - public void setClearPercent(Integer clear_percent) { - this.clear_percent = clear_percent; - } - public Float getCloudCover() { - return cloud_cover; - } - public void setCloudCover(Float cloud_cover) { - this.cloud_cover = cloud_cover; - } - public Integer getCloudPercent() { - return cloud_percent; - } - public void setCloudPercent(Integer cloud_percent) { - this.cloud_percent = cloud_percent; - } - public Integer getColumns() { - return columns; - } - public void setColumns(Integer columns) { - this.columns = columns; - } - public String getEpsgCode() { - return epsg_code; - } - public void setEpsgCode(String epsg_code) { - this.epsg_code = epsg_code; - } - public Boolean getGroundControl() { - return ground_control; - } - public void setGroundControl(Boolean ground_control) { - this.ground_control = ground_control; - } - public Integer getHeavyHazePercent() { - return heavy_haze_percent; - } - public void setHeavyHazePercent(Integer heavy_haze_percent) { - this.heavy_haze_percent = heavy_haze_percent; - } - public String getInstrument() { - return instrument; - } - public void setInstrument(String instrument) { - this.instrument = instrument; - } - public String getItemType() { - return item_type; - } - public void setItemType(String item_type) { - this.item_type = item_type; - } - public Integer getLightHaze_percent() { - return light_haze_percent; - } - public void setLightHazePercent(Integer light_haze_percent) { - this.light_haze_percent = light_haze_percent; - } - public Integer getOriginX() { - return origin_x; - } - public void setOriginX(Integer origin_x) { - this.origin_x = origin_x; - } - public Integer getOriginY() { - return origin_y; - } - public void setOriginY(Integer origin_y) { - this.origin_y = origin_y; - } - public Float getPixelResolution() { - return pixel_resolution; - } - public void setPixelResolution(Float pixel_resolution) { - this.pixel_resolution = pixel_resolution; - } - public String getProvider() { - return provider; - } - public void setProvider(String provider) { - this.provider = provider; - } - public Date getPublished() { - return published; - } - public void setPublished(Date published) { - this.published = published; - } - public String getQualityCategory() { - return quality_category; - } - public void setQualityCategory(String quality_category) { - this.quality_category = quality_category; - } - public Integer getRows() { - return rows; - } - public void setRows(Integer rows) { - this.rows = rows; - } - public String getSatelliteId() { - return satellite_id; - } - public void setSatelliteId(String satellite_id) { - this.satellite_id = satellite_id; - } - public Integer getShadowPercent() { - return shadow_percent; - } - public void setShadowPercent(Integer shadow_percent) { - this.shadow_percent = shadow_percent; - } - public Integer getSnowIcePercent() { - return snow_ice_percent; - } - public void setSnowIcePercent(Integer snow_ice_percent) { - this.snow_ice_percent = snow_ice_percent; - } - public Integer getStripId() { - return strip_id; - } - public void setStripId(Integer strip_id) { - this.strip_id = strip_id; - } - public Float getSunAzimuth() { - return sun_azimuth; - } - public void setSunAzimuth(Float sun_azimuth) { - this.sun_azimuth = sun_azimuth; - } - public Float getSunElevation() { - return sun_elevation; - } - public void setSunElevation(Float sun_elevation) { - this.sun_elevation = sun_elevation; - } - public Date getUpdated() { - return updated; - } - public void setUpdated(Date updated) { - this.updated = updated; - } - public Float getViewAngle() { - return view_angle; - } - public void setViewAngle(Float view_angle) { - this.view_angle = view_angle; - } - public Integer getVisibleConfidencePercent() { - return visible_confidence_percent; - } - public void setVisibleConfidencePercent(Integer visible_confidence_percent) { - this.visible_confidence_percent = visible_confidence_percent; - } - public Integer getVisiblePercent() { - return visible_percent; - } - public void setVisiblePercent(Integer visible_percent) { - this.visible_percent = visible_percent; - } - - -} +package org.openforis.collect.earth.planet; + +import java.util.Comparator;; + +public class FeatureSorter implements Comparator{ + + @Override + public int compare(Feature o1, Feature o2) { + if( o1.getProperties().getCloudPercent() !=null && o2.getProperties().getCloudPercent() != null ) { + if( o1.getProperties().getCloudPercent().equals( o2.getProperties().getCloudPercent() ) ) { + if( o2.getProperties().getVisibleConfidencePercent() !=null && o1.getProperties().getVisibleConfidencePercent() != null ) { + return o2.getProperties().getVisibleConfidencePercent() - o1.getProperties().getVisibleConfidencePercent(); + }else if( o2.getProperties().getVisibleConfidencePercent() !=null ) { + return 1; + }else{ + return -1; + } + }else { + return o1.getProperties().getCloudPercent() - o2.getProperties().getCloudPercent(); + } + }else if( o1.getProperties().getCloudPercent() != null ) { + return -1; + }else if( o2.getProperties().getCloudPercent() != null) { + return 1; + }else { + if( o1.getProperties().getCloudCover()!=null && o2.getProperties().getCloudCover()!=null ) { + return (int) ( (o1.getProperties().getCloudCover() - o2.getProperties().getCloudCover() ) * 100 ); + } else { + return 1; // No way to know so return the latest + } + } + } + +} From ef7de4d749c8ab4ecf282ae915401a78c18cdfc1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:06 +0100 Subject: [PATCH 0596/1620] New translations FilterType.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 226 ++---------------- 1 file changed, 15 insertions(+), 211 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index cd7f57b2a1..bc34210ad4 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,219 +1,23 @@ package org.openforis.collect.earth.planet; -import java.util.Date; +import com.google.gson.annotations.SerializedName; -public class FeatureProperties { +public enum FilterType { + @SerializedName("DateRangeFilter") DATERANGE("DateRangeFilter"), + @SerializedName("StringInFilter") STRING_IN("StringInFilter"), + @SerializedName("AndFilter") AND("AndFilter"), + @SerializedName("OrFilter") OR("OrFilter"), + @SerializedName("GeometryFilter") GEOMETRY("GeometryFilter"); - Date acquired; - Float anomalous_pixels; - Integer clear_confidence_percent; - Integer clear_percent; - Float cloud_cover; - Integer cloud_percent; - Integer columns; - String epsg_code; - Boolean ground_control; - Integer heavy_haze_percent; - String instrument; - String item_type; - Integer light_haze_percent; - Integer origin_x; - Integer origin_y; - Float pixel_resolution; - String provider; - Date published; - String quality_category; - Integer rows; - String satellite_id; - Integer shadow_percent; - Integer snow_ice_percent; - Integer strip_id; - Float sun_azimuth; - Float sun_elevation; - Date updated; - Float view_angle; - Integer visible_confidence_percent; - Integer visible_percent; - public Date getAcquired() { - return acquired; - } - public void setAcquired(Date acquired) { - this.acquired = acquired; - } - public Float getAnomalousPixels() { - return anomalous_pixels; - } - public void setAnomalousPixels(Float anomalous_pixels) { - this.anomalous_pixels = anomalous_pixels; - } - public Integer getClearConfidence_percent() { - return clear_confidence_percent; - } - public void setClearConfidencePercent(Integer clear_confidence_percent) { - this.clear_confidence_percent = clear_confidence_percent; - } - public Integer getClearPercent() { - return clear_percent; - } - public void setClearPercent(Integer clear_percent) { - this.clear_percent = clear_percent; - } - public Float getCloudCover() { - return cloud_cover; - } - public void setCloudCover(Float cloud_cover) { - this.cloud_cover = cloud_cover; - } - public Integer getCloudPercent() { - return cloud_percent; - } - public void setCloudPercent(Integer cloud_percent) { - this.cloud_percent = cloud_percent; - } - public Integer getColumns() { - return columns; - } - public void setColumns(Integer columns) { - this.columns = columns; - } - public String getEpsgCode() { - return epsg_code; - } - public void setEpsgCode(String epsg_code) { - this.epsg_code = epsg_code; - } - public Boolean getGroundControl() { - return ground_control; - } - public void setGroundControl(Boolean ground_control) { - this.ground_control = ground_control; - } - public Integer getHeavyHazePercent() { - return heavy_haze_percent; - } - public void setHeavyHazePercent(Integer heavy_haze_percent) { - this.heavy_haze_percent = heavy_haze_percent; - } - public String getInstrument() { - return instrument; - } - public void setInstrument(String instrument) { - this.instrument = instrument; - } - public String getItemType() { - return item_type; - } - public void setItemType(String item_type) { - this.item_type = item_type; - } - public Integer getLightHaze_percent() { - return light_haze_percent; - } - public void setLightHazePercent(Integer light_haze_percent) { - this.light_haze_percent = light_haze_percent; - } - public Integer getOriginX() { - return origin_x; - } - public void setOriginX(Integer origin_x) { - this.origin_x = origin_x; - } - public Integer getOriginY() { - return origin_y; - } - public void setOriginY(Integer origin_y) { - this.origin_y = origin_y; - } - public Float getPixelResolution() { - return pixel_resolution; - } - public void setPixelResolution(Float pixel_resolution) { - this.pixel_resolution = pixel_resolution; - } - public String getProvider() { - return provider; - } - public void setProvider(String provider) { - this.provider = provider; - } - public Date getPublished() { - return published; - } - public void setPublished(Date published) { - this.published = published; - } - public String getQualityCategory() { - return quality_category; - } - public void setQualityCategory(String quality_category) { - this.quality_category = quality_category; - } - public Integer getRows() { - return rows; - } - public void setRows(Integer rows) { - this.rows = rows; - } - public String getSatelliteId() { - return satellite_id; - } - public void setSatelliteId(String satellite_id) { - this.satellite_id = satellite_id; - } - public Integer getShadowPercent() { - return shadow_percent; - } - public void setShadowPercent(Integer shadow_percent) { - this.shadow_percent = shadow_percent; - } - public Integer getSnowIcePercent() { - return snow_ice_percent; - } - public void setSnowIcePercent(Integer snow_ice_percent) { - this.snow_ice_percent = snow_ice_percent; - } - public Integer getStripId() { - return strip_id; - } - public void setStripId(Integer strip_id) { - this.strip_id = strip_id; - } - public Float getSunAzimuth() { - return sun_azimuth; - } - public void setSunAzimuth(Float sun_azimuth) { - this.sun_azimuth = sun_azimuth; - } - public Float getSunElevation() { - return sun_elevation; - } - public void setSunElevation(Float sun_elevation) { - this.sun_elevation = sun_elevation; - } - public Date getUpdated() { - return updated; - } - public void setUpdated(Date updated) { - this.updated = updated; - } - public Float getViewAngle() { - return view_angle; - } - public void setViewAngle(Float view_angle) { - this.view_angle = view_angle; - } - public Integer getVisibleConfidencePercent() { - return visible_confidence_percent; - } - public void setVisibleConfidencePercent(Integer visible_confidence_percent) { - this.visible_confidence_percent = visible_confidence_percent; - } - public Integer getVisiblePercent() { - return visible_percent; + private String type; + + private FilterType(String type) { + this.type = type; } - public void setVisiblePercent(Integer visible_percent) { - this.visible_percent = visible_percent; + + @Override + public String toString() { + return type; } - } From ce143c0d35258044c80276c1dcc56141137cbcf8 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:07 +0100 Subject: [PATCH 0597/1620] New translations Filter.java (French) --- .../earth/app/view/Messages_fr.properties | 61 ++++++++----------- 1 file changed, 27 insertions(+), 34 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 1e116c4a2d..11f4ff87a6 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,34 +1,27 @@ -package org.openforis.collect.earth.planet; - -import java.util.Comparator;; - -public class FeatureSorter implements Comparator{ - - @Override - public int compare(Feature o1, Feature o2) { - if( o1.getProperties().getCloudPercent() !=null && o2.getProperties().getCloudPercent() != null ) { - if( o1.getProperties().getCloudPercent().equals( o2.getProperties().getCloudPercent() ) ) { - if( o2.getProperties().getVisibleConfidencePercent() !=null && o1.getProperties().getVisibleConfidencePercent() != null ) { - return o2.getProperties().getVisibleConfidencePercent() - o1.getProperties().getVisibleConfidencePercent(); - }else if( o2.getProperties().getVisibleConfidencePercent() !=null ) { - return 1; - }else{ - return -1; - } - }else { - return o1.getProperties().getCloudPercent() - o2.getProperties().getCloudPercent(); - } - }else if( o1.getProperties().getCloudPercent() != null ) { - return -1; - }else if( o2.getProperties().getCloudPercent() != null) { - return 1; - }else { - if( o1.getProperties().getCloudCover()!=null && o2.getProperties().getCloudCover()!=null ) { - return (int) ( (o1.getProperties().getCloudCover() - o2.getProperties().getCloudCover() ) * 100 ); - } else { - return 1; // No way to know so return the latest - } - } - } - -} +package org.openforis.collect.earth.planet; + +public class Filter { + + FilterType type; + String field_name; + e config; + + public FilterType getType() { + return type; + } + public void setType(FilterType type) { + this.type = type; + } + public String getFieldName() { + return field_name; + } + public void setFieldName(String field_name) { + this.field_name = field_name; + } + public e getConfig() { + return config; + } + public void setConfig(e config) { + this.config = config; + } +} From 3812a327e5368879e89da9ad207fa0c15a35a875 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:08 +0100 Subject: [PATCH 0598/1620] New translations Filter.java (Spanish) --- .../earth/app/view/Messages_es.properties | 61 ++++++++----------- 1 file changed, 27 insertions(+), 34 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 1e116c4a2d..11f4ff87a6 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,34 +1,27 @@ -package org.openforis.collect.earth.planet; - -import java.util.Comparator;; - -public class FeatureSorter implements Comparator{ - - @Override - public int compare(Feature o1, Feature o2) { - if( o1.getProperties().getCloudPercent() !=null && o2.getProperties().getCloudPercent() != null ) { - if( o1.getProperties().getCloudPercent().equals( o2.getProperties().getCloudPercent() ) ) { - if( o2.getProperties().getVisibleConfidencePercent() !=null && o1.getProperties().getVisibleConfidencePercent() != null ) { - return o2.getProperties().getVisibleConfidencePercent() - o1.getProperties().getVisibleConfidencePercent(); - }else if( o2.getProperties().getVisibleConfidencePercent() !=null ) { - return 1; - }else{ - return -1; - } - }else { - return o1.getProperties().getCloudPercent() - o2.getProperties().getCloudPercent(); - } - }else if( o1.getProperties().getCloudPercent() != null ) { - return -1; - }else if( o2.getProperties().getCloudPercent() != null) { - return 1; - }else { - if( o1.getProperties().getCloudCover()!=null && o2.getProperties().getCloudCover()!=null ) { - return (int) ( (o1.getProperties().getCloudCover() - o2.getProperties().getCloudCover() ) * 100 ); - } else { - return 1; // No way to know so return the latest - } - } - } - -} +package org.openforis.collect.earth.planet; + +public class Filter { + + FilterType type; + String field_name; + e config; + + public FilterType getType() { + return type; + } + public void setType(FilterType type) { + this.type = type; + } + public String getFieldName() { + return field_name; + } + public void setFieldName(String field_name) { + this.field_name = field_name; + } + public e getConfig() { + return config; + } + public void setConfig(e config) { + this.config = config; + } +} From 7de97413c04f9777adcf778242a732192ae06014 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:09 +0100 Subject: [PATCH 0599/1620] New translations Filter.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 36 ++++++++++--------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index bc34210ad4..11f4ff87a6 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,23 +1,27 @@ package org.openforis.collect.earth.planet; -import com.google.gson.annotations.SerializedName; +public class Filter { -public enum FilterType { - @SerializedName("DateRangeFilter") DATERANGE("DateRangeFilter"), - @SerializedName("StringInFilter") STRING_IN("StringInFilter"), - @SerializedName("AndFilter") AND("AndFilter"), - @SerializedName("OrFilter") OR("OrFilter"), - @SerializedName("GeometryFilter") GEOMETRY("GeometryFilter"); - - private String type; - - private FilterType(String type) { + FilterType type; + String field_name; + e config; + + public FilterType getType() { + return type; + } + public void setType(FilterType type) { this.type = type; } - - @Override - public String toString() { - return type; + public String getFieldName() { + return field_name; + } + public void setFieldName(String field_name) { + this.field_name = field_name; + } + public e getConfig() { + return config; + } + public void setConfig(e config) { + this.config = config; } - } From cae5ca614697c4787624ee64ddfe1341543f1bc8 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:10 +0100 Subject: [PATCH 0600/1620] New translations Filter.java (English) --- .../earth/app/view/Messages_en.properties | 61 ++++++++----------- 1 file changed, 27 insertions(+), 34 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 1e116c4a2d..11f4ff87a6 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,34 +1,27 @@ -package org.openforis.collect.earth.planet; - -import java.util.Comparator;; - -public class FeatureSorter implements Comparator{ - - @Override - public int compare(Feature o1, Feature o2) { - if( o1.getProperties().getCloudPercent() !=null && o2.getProperties().getCloudPercent() != null ) { - if( o1.getProperties().getCloudPercent().equals( o2.getProperties().getCloudPercent() ) ) { - if( o2.getProperties().getVisibleConfidencePercent() !=null && o1.getProperties().getVisibleConfidencePercent() != null ) { - return o2.getProperties().getVisibleConfidencePercent() - o1.getProperties().getVisibleConfidencePercent(); - }else if( o2.getProperties().getVisibleConfidencePercent() !=null ) { - return 1; - }else{ - return -1; - } - }else { - return o1.getProperties().getCloudPercent() - o2.getProperties().getCloudPercent(); - } - }else if( o1.getProperties().getCloudPercent() != null ) { - return -1; - }else if( o2.getProperties().getCloudPercent() != null) { - return 1; - }else { - if( o1.getProperties().getCloudCover()!=null && o2.getProperties().getCloudCover()!=null ) { - return (int) ( (o1.getProperties().getCloudCover() - o2.getProperties().getCloudCover() ) * 100 ); - } else { - return 1; // No way to know so return the latest - } - } - } - -} +package org.openforis.collect.earth.planet; + +public class Filter { + + FilterType type; + String field_name; + e config; + + public FilterType getType() { + return type; + } + public void setType(FilterType type) { + this.type = type; + } + public String getFieldName() { + return field_name; + } + public void setFieldName(String field_name) { + this.field_name = field_name; + } + public e getConfig() { + return config; + } + public void setConfig(e config) { + this.config = config; + } +} From 590e95be7415fcad6f199ef843ea2b41fe23c263 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:11 +0100 Subject: [PATCH 0601/1620] New translations FilterConfig.java (French) --- .../earth/app/view/Messages_fr.properties | 49 +++++++++++++------ 1 file changed, 34 insertions(+), 15 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 11f4ff87a6..0f21aea725 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,27 +1,46 @@ package org.openforis.collect.earth.planet; -public class Filter { +import java.util.Date; - FilterType type; - String field_name; - e config; +public class FilterConfig { + Date gte; // DateRangeFiter gte; + Date lt; + String type; // for geojson + double[][][] coordinates; - public FilterType getType() { - return type; + public FilterConfig(Date gte, Date lt) { + super(); + this.gte = gte; + this.lt = lt; } - public void setType(FilterType type) { + + public FilterConfig(String type, double[][][] coordinates) { + super(); this.type = type; + this.coordinates = coordinates; } - public String getFieldName() { - return field_name; + + public Date getGte() { + return gte; } - public void setFieldName(String field_name) { - this.field_name = field_name; + public void setGte(Date gte) { + this.gte = gte; } - public e getConfig() { - return config; + public Date getLt() { + return lt; } - public void setConfig(e config) { - this.config = config; + public void setLt(Date lt) { + this.lt = lt; } + + public double[][][] getCoordinates() { + return coordinates; + } + + public void setCoordinates(double[][][] coordinates) { + this.coordinates = coordinates; + } + + + } From fd22531a3733f0af0a9d484f80a2feef3e38bdcd Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:12 +0100 Subject: [PATCH 0602/1620] New translations FilterConfig.java (Spanish) --- .../earth/app/view/Messages_es.properties | 49 +++++++++++++------ 1 file changed, 34 insertions(+), 15 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 11f4ff87a6..0f21aea725 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,27 +1,46 @@ package org.openforis.collect.earth.planet; -public class Filter { +import java.util.Date; - FilterType type; - String field_name; - e config; +public class FilterConfig { + Date gte; // DateRangeFiter gte; + Date lt; + String type; // for geojson + double[][][] coordinates; - public FilterType getType() { - return type; + public FilterConfig(Date gte, Date lt) { + super(); + this.gte = gte; + this.lt = lt; } - public void setType(FilterType type) { + + public FilterConfig(String type, double[][][] coordinates) { + super(); this.type = type; + this.coordinates = coordinates; } - public String getFieldName() { - return field_name; + + public Date getGte() { + return gte; } - public void setFieldName(String field_name) { - this.field_name = field_name; + public void setGte(Date gte) { + this.gte = gte; } - public e getConfig() { - return config; + public Date getLt() { + return lt; } - public void setConfig(e config) { - this.config = config; + public void setLt(Date lt) { + this.lt = lt; } + + public double[][][] getCoordinates() { + return coordinates; + } + + public void setCoordinates(double[][][] coordinates) { + this.coordinates = coordinates; + } + + + } From 0b03bfe66d0dbfa7cee7ad8c687a38e78437e996 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:13 +0100 Subject: [PATCH 0603/1620] New translations FilterConfig.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 49 +++++++++++++------ 1 file changed, 34 insertions(+), 15 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 11f4ff87a6..0f21aea725 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,27 +1,46 @@ package org.openforis.collect.earth.planet; -public class Filter { +import java.util.Date; - FilterType type; - String field_name; - e config; +public class FilterConfig { + Date gte; // DateRangeFiter gte; + Date lt; + String type; // for geojson + double[][][] coordinates; - public FilterType getType() { - return type; + public FilterConfig(Date gte, Date lt) { + super(); + this.gte = gte; + this.lt = lt; } - public void setType(FilterType type) { + + public FilterConfig(String type, double[][][] coordinates) { + super(); this.type = type; + this.coordinates = coordinates; } - public String getFieldName() { - return field_name; + + public Date getGte() { + return gte; } - public void setFieldName(String field_name) { - this.field_name = field_name; + public void setGte(Date gte) { + this.gte = gte; } - public e getConfig() { - return config; + public Date getLt() { + return lt; } - public void setConfig(e config) { - this.config = config; + public void setLt(Date lt) { + this.lt = lt; } + + public double[][][] getCoordinates() { + return coordinates; + } + + public void setCoordinates(double[][][] coordinates) { + this.coordinates = coordinates; + } + + + } From 946b03d85e5f7e047f6d37eda9b41f2c109cdef7 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:14 +0100 Subject: [PATCH 0604/1620] New translations FilterConfig.java (English) --- .../earth/app/view/Messages_en.properties | 49 +++++++++++++------ 1 file changed, 34 insertions(+), 15 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 11f4ff87a6..0f21aea725 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,27 +1,46 @@ package org.openforis.collect.earth.planet; -public class Filter { +import java.util.Date; - FilterType type; - String field_name; - e config; +public class FilterConfig { + Date gte; // DateRangeFiter gte; + Date lt; + String type; // for geojson + double[][][] coordinates; - public FilterType getType() { - return type; + public FilterConfig(Date gte, Date lt) { + super(); + this.gte = gte; + this.lt = lt; } - public void setType(FilterType type) { + + public FilterConfig(String type, double[][][] coordinates) { + super(); this.type = type; + this.coordinates = coordinates; } - public String getFieldName() { - return field_name; + + public Date getGte() { + return gte; } - public void setFieldName(String field_name) { - this.field_name = field_name; + public void setGte(Date gte) { + this.gte = gte; } - public e getConfig() { - return config; + public Date getLt() { + return lt; } - public void setConfig(e config) { - this.config = config; + public void setLt(Date lt) { + this.lt = lt; } + + public double[][][] getCoordinates() { + return coordinates; + } + + public void setCoordinates(double[][][] coordinates) { + this.coordinates = coordinates; + } + + + } From 24946826c032ca46f25b61f5f1761da26764da9c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:15 +0100 Subject: [PATCH 0605/1620] New translations FilterType.java (French) --- .../earth/app/view/Messages_fr.properties | 51 +++++-------------- 1 file changed, 14 insertions(+), 37 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 0f21aea725..bc34210ad4 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,46 +1,23 @@ package org.openforis.collect.earth.planet; -import java.util.Date; +import com.google.gson.annotations.SerializedName; -public class FilterConfig { - Date gte; // DateRangeFiter gte; - Date lt; - String type; // for geojson - double[][][] coordinates; - - public FilterConfig(Date gte, Date lt) { - super(); - this.gte = gte; - this.lt = lt; - } - - public FilterConfig(String type, double[][][] coordinates) { - super(); - this.type = type; - this.coordinates = coordinates; - } +public enum FilterType { + @SerializedName("DateRangeFilter") DATERANGE("DateRangeFilter"), + @SerializedName("StringInFilter") STRING_IN("StringInFilter"), + @SerializedName("AndFilter") AND("AndFilter"), + @SerializedName("OrFilter") OR("OrFilter"), + @SerializedName("GeometryFilter") GEOMETRY("GeometryFilter"); - public Date getGte() { - return gte; - } - public void setGte(Date gte) { - this.gte = gte; - } - public Date getLt() { - return lt; - } - public void setLt(Date lt) { - this.lt = lt; - } + private String type; - public double[][][] getCoordinates() { - return coordinates; + private FilterType(String type) { + this.type = type; } - public void setCoordinates(double[][][] coordinates) { - this.coordinates = coordinates; + @Override + public String toString() { + return type; } - - - + } From d89f5360aaac1e6f469cf2a48dc888c5c8fe776d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:16 +0100 Subject: [PATCH 0606/1620] New translations FilterType.java (Spanish) --- .../earth/app/view/Messages_es.properties | 51 +++++-------------- 1 file changed, 14 insertions(+), 37 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 0f21aea725..bc34210ad4 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,46 +1,23 @@ package org.openforis.collect.earth.planet; -import java.util.Date; +import com.google.gson.annotations.SerializedName; -public class FilterConfig { - Date gte; // DateRangeFiter gte; - Date lt; - String type; // for geojson - double[][][] coordinates; - - public FilterConfig(Date gte, Date lt) { - super(); - this.gte = gte; - this.lt = lt; - } - - public FilterConfig(String type, double[][][] coordinates) { - super(); - this.type = type; - this.coordinates = coordinates; - } +public enum FilterType { + @SerializedName("DateRangeFilter") DATERANGE("DateRangeFilter"), + @SerializedName("StringInFilter") STRING_IN("StringInFilter"), + @SerializedName("AndFilter") AND("AndFilter"), + @SerializedName("OrFilter") OR("OrFilter"), + @SerializedName("GeometryFilter") GEOMETRY("GeometryFilter"); - public Date getGte() { - return gte; - } - public void setGte(Date gte) { - this.gte = gte; - } - public Date getLt() { - return lt; - } - public void setLt(Date lt) { - this.lt = lt; - } + private String type; - public double[][][] getCoordinates() { - return coordinates; + private FilterType(String type) { + this.type = type; } - public void setCoordinates(double[][][] coordinates) { - this.coordinates = coordinates; + @Override + public String toString() { + return type; } - - - + } From 1f27c275642e0b1c581f21e6c2803c5f5435ffd6 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:17 +0100 Subject: [PATCH 0607/1620] New translations PlanetRequestParameters.java (English) --- .../earth/app/view/Messages_en.properties | 95 ++++++++++--------- 1 file changed, 49 insertions(+), 46 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 0f21aea725..afe14d18fd 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,46 +1,49 @@ -package org.openforis.collect.earth.planet; - -import java.util.Date; - -public class FilterConfig { - Date gte; // DateRangeFiter gte; - Date lt; - String type; // for geojson - double[][][] coordinates; - - public FilterConfig(Date gte, Date lt) { - super(); - this.gte = gte; - this.lt = lt; - } - - public FilterConfig(String type, double[][][] coordinates) { - super(); - this.type = type; - this.coordinates = coordinates; - } - - public Date getGte() { - return gte; - } - public void setGte(Date gte) { - this.gte = gte; - } - public Date getLt() { - return lt; - } - public void setLt(Date lt) { - this.lt = lt; - } - - public double[][][] getCoordinates() { - return coordinates; - } - - public void setCoordinates(double[][][] coordinates) { - this.coordinates = coordinates; - } - - - -} +package org.openforis.collect.earth.planet; + +import java.util.Date; + +public class PlanetRequestParameters { + private Date start; + private Date end; + private double[][][] coords; + private String[] itemTypes; + + public PlanetRequestParameters(Date start, Date end, double[][][] coords, String[] itemTypes) { + this.start = start; + this.end = end; + this.coords = coords; + this.itemTypes = itemTypes; + } + + public Date getStart() { + return start; + } + + public void setStart(Date start) { + this.start = start; + } + + public Date getEnd() { + return end; + } + + public void setEnd(Date end) { + this.end = end; + } + + public double[][][] getCoords() { + return coords; + } + + public void setCoords(double[][][] coords) { + this.coords = coords; + } + + public String[] getItemTypes() { + return itemTypes; + } + + public void setItemTypes(String[] itemTypes) { + this.itemTypes = itemTypes; + } +} \ No newline at end of file From c0fdfd3190712027897079672268bb0d74b1486a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:18 +0100 Subject: [PATCH 0608/1620] New translations Response.java (French) --- .../earth/app/view/Messages_fr.properties | 22 ++++++------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index bc34210ad4..21d609c128 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,23 +1,15 @@ package org.openforis.collect.earth.planet; -import com.google.gson.annotations.SerializedName; +public class Response { -public enum FilterType { - @SerializedName("DateRangeFilter") DATERANGE("DateRangeFilter"), - @SerializedName("StringInFilter") STRING_IN("StringInFilter"), - @SerializedName("AndFilter") AND("AndFilter"), - @SerializedName("OrFilter") OR("OrFilter"), - @SerializedName("GeometryFilter") GEOMETRY("GeometryFilter"); + public Feature[] features; + public Links _links; - private String type; - - private FilterType(String type) { - this.type = type; + public Feature[] getFeatures() { + return features; } - @Override - public String toString() { - return type; + public Links getLinks() { + return _links; } - } From 2d1a26278cc68193f7387d8174cbc66c333429c0 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:19 +0100 Subject: [PATCH 0609/1620] New translations EntityChangeProxy.java (Spanish) --- .../earth/app/view/Messages_es.properties | 60 ++++++++++++++----- 1 file changed, 45 insertions(+), 15 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index bc34210ad4..f636beae70 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,23 +1,53 @@ -package org.openforis.collect.earth.planet; +package org.openforis.collect.model.proxy; -import com.google.gson.annotations.SerializedName; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; -public enum FilterType { - @SerializedName("DateRangeFilter") DATERANGE("DateRangeFilter"), - @SerializedName("StringInFilter") STRING_IN("StringInFilter"), - @SerializedName("AndFilter") AND("AndFilter"), - @SerializedName("OrFilter") OR("OrFilter"), - @SerializedName("GeometryFilter") GEOMETRY("GeometryFilter"); +import org.openforis.collect.ProxyContext; +import org.openforis.collect.model.EntityChange; +import org.openforis.idm.metamodel.validation.ValidationResultFlag; - private String type; +/** + * + * @author S. Ricci + * + */ +public class EntityChangeProxy extends NodeChangeProxy { - private FilterType(String type) { - this.type = type; + public EntityChangeProxy(EntityChange change, ProxyContext context) { + super(change, context); } - @Override - public String toString() { - return type; + public Map getRelevant() { + return convertToChildDefinitionIdMap(change.getChildrenRelevance()); } -} + public Map getMinCountByChildDefinitionId() { + return change.getMinCountByChildDefinitionId(); + } + + public Map getMaxCountByChildDefinitionId() { + return change.getMaxCountByChildDefinitionId(); + } + + public Map getMinCountValidation() { + return convertToChildDefinitionIdMap(change.getChildrenMinCountValidation()); + } + + public Map getMaxCountValidation() { + return convertToChildDefinitionIdMap(change.getChildrenMaxCountValidation()); + } + + private Map convertToChildDefinitionIdMap(Map from) { + Map map = new HashMap<>(); + Set> entries = from.entrySet(); + for (Entry entry : entries) { + Integer childDefId = entry.getKey(); + map.put(childDefId, entry.getValue()); + } + return map; + } + +} \ No newline at end of file From 7162349d1285dcabd8be974c3b43e7059ddca756 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:20 +0100 Subject: [PATCH 0610/1620] New translations CodeAttributeProxy.java (French) --- .../earth/app/view/Messages_fr.properties | 45 +++++++++++++++---- 1 file changed, 37 insertions(+), 8 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 21d609c128..42d1e5f858 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,15 +1,44 @@ -package org.openforis.collect.earth.planet; +/** + * + */ +package org.openforis.collect.model.proxy; -public class Response { +import org.openforis.collect.ProxyContext; +import org.openforis.idm.metamodel.CodeAttributeDefinition; +import org.openforis.idm.metamodel.CodeList; +import org.openforis.idm.metamodel.EntityDefinition; +import org.openforis.idm.model.CodeAttribute; - public Feature[] features; - public Links _links; +/** + * @author S. Ricci + * + */ +public class CodeAttributeProxy extends AttributeProxy { - public Feature[] getFeatures() { - return features; + private CodeAttribute codeAttribute; + + public CodeAttributeProxy(EntityProxy parent, + CodeAttribute attribute, ProxyContext context) { + super(parent, attribute, context); + this.codeAttribute = attribute; } - public Links getLinks() { - return _links; + public boolean isEnumerator() { + CodeAttributeDefinition definition = codeAttribute.getDefinition(); + EntityDefinition parentDefinition = (EntityDefinition) definition.getParentDefinition(); + return ( + parentDefinition.isEnumerable() && + definition.isKey() && + definition.getList() != null && + !definition.getList().isExternal() + ); + } + + protected boolean isExternalCodeList() { + CodeAttributeDefinition defn = codeAttribute.getDefinition(); + CodeList list = defn.getList(); + return list.isExternal(); + } + } From cf0228ce92f820e9e70385bb05232080b1ae29c4 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:21 +0100 Subject: [PATCH 0611/1620] New translations CodeAttributeProxy.java (Spanish) --- .../earth/app/view/Messages_es.properties | 71 ++++++++----------- 1 file changed, 31 insertions(+), 40 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index f636beae70..42d1e5f858 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,53 +1,44 @@ +/** + * + */ package org.openforis.collect.model.proxy; -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.EntityChange; -import org.openforis.idm.metamodel.validation.ValidationResultFlag; +import org.openforis.idm.metamodel.CodeAttributeDefinition; +import org.openforis.idm.metamodel.CodeList; +import org.openforis.idm.metamodel.EntityDefinition; +import org.openforis.idm.model.CodeAttribute; /** - * * @author S. Ricci * */ -public class EntityChangeProxy extends NodeChangeProxy { - - public EntityChangeProxy(EntityChange change, ProxyContext context) { - super(change, context); - } - - public Map getRelevant() { - return convertToChildDefinitionIdMap(change.getChildrenRelevance()); +public class CodeAttributeProxy extends AttributeProxy { + + private CodeAttribute codeAttribute; + + public CodeAttributeProxy(EntityProxy parent, + CodeAttribute attribute, ProxyContext context) { + super(parent, attribute, context); + this.codeAttribute = attribute; } - public Map getMinCountByChildDefinitionId() { - return change.getMinCountByChildDefinitionId(); + public boolean isEnumerator() { + CodeAttributeDefinition definition = codeAttribute.getDefinition(); + EntityDefinition parentDefinition = (EntityDefinition) definition.getParentDefinition(); + return ( + parentDefinition.isEnumerable() && + definition.isKey() && + definition.getList() != null && + !definition.getList().isExternal() + ); + } - public Map getMaxCountByChildDefinitionId() { - return change.getMaxCountByChildDefinitionId(); + protected boolean isExternalCodeList() { + CodeAttributeDefinition defn = codeAttribute.getDefinition(); + CodeList list = defn.getList(); + return list.isExternal(); } - - public Map getMinCountValidation() { - return convertToChildDefinitionIdMap(change.getChildrenMinCountValidation()); - } - - public Map getMaxCountValidation() { - return convertToChildDefinitionIdMap(change.getChildrenMaxCountValidation()); - } - - private Map convertToChildDefinitionIdMap(Map from) { - Map map = new HashMap<>(); - Set> entries = from.entrySet(); - for (Entry entry : entries) { - Integer childDefId = entry.getKey(); - map.put(childDefId, entry.getValue()); - } - return map; - } - -} \ No newline at end of file + +} From 0e6d8d4a7433033a3f577b0166b774471145efd5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:22 +0100 Subject: [PATCH 0612/1620] New translations CodeAttributeProxy.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 70 +++++++++---------- 1 file changed, 34 insertions(+), 36 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 0f21aea725..42d1e5f858 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,46 +1,44 @@ -package org.openforis.collect.earth.planet; +/** + * + */ +package org.openforis.collect.model.proxy; -import java.util.Date; +import org.openforis.collect.ProxyContext; +import org.openforis.idm.metamodel.CodeAttributeDefinition; +import org.openforis.idm.metamodel.CodeList; +import org.openforis.idm.metamodel.EntityDefinition; +import org.openforis.idm.model.CodeAttribute; -public class FilterConfig { - Date gte; // DateRangeFiter gte; - Date lt; - String type; // for geojson - double[][][] coordinates; - - public FilterConfig(Date gte, Date lt) { - super(); - this.gte = gte; - this.lt = lt; - } - - public FilterConfig(String type, double[][][] coordinates) { - super(); - this.type = type; - this.coordinates = coordinates; - } +/** + * @author S. Ricci + * + */ +public class CodeAttributeProxy extends AttributeProxy { - public Date getGte() { - return gte; - } - public void setGte(Date gte) { - this.gte = gte; - } - public Date getLt() { - return lt; - } - public void setLt(Date lt) { - this.lt = lt; + private CodeAttribute codeAttribute; + + public CodeAttributeProxy(EntityProxy parent, + CodeAttribute attribute, ProxyContext context) { + super(parent, attribute, context); + this.codeAttribute = attribute; } - public double[][][] getCoordinates() { - return coordinates; + public boolean isEnumerator() { + CodeAttributeDefinition definition = codeAttribute.getDefinition(); + EntityDefinition parentDefinition = (EntityDefinition) definition.getParentDefinition(); + return ( + parentDefinition.isEnumerable() && + definition.isKey() && + definition.getList() != null && + !definition.getList().isExternal() + ); + } - public void setCoordinates(double[][][] coordinates) { - this.coordinates = coordinates; + protected boolean isExternalCodeList() { + CodeAttributeDefinition defn = codeAttribute.getDefinition(); + CodeList list = defn.getList(); + return list.isExternal(); } - - } From a446f5d4d41e10d3974cad762653c7610d752a52 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:23 +0100 Subject: [PATCH 0613/1620] New translations CodeAttributeProxy.java (English) --- .../earth/app/view/Messages_en.properties | 93 +++++++++---------- 1 file changed, 44 insertions(+), 49 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index afe14d18fd..42d1e5f858 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,49 +1,44 @@ -package org.openforis.collect.earth.planet; - -import java.util.Date; - -public class PlanetRequestParameters { - private Date start; - private Date end; - private double[][][] coords; - private String[] itemTypes; - - public PlanetRequestParameters(Date start, Date end, double[][][] coords, String[] itemTypes) { - this.start = start; - this.end = end; - this.coords = coords; - this.itemTypes = itemTypes; - } - - public Date getStart() { - return start; - } - - public void setStart(Date start) { - this.start = start; - } - - public Date getEnd() { - return end; - } - - public void setEnd(Date end) { - this.end = end; - } - - public double[][][] getCoords() { - return coords; - } - - public void setCoords(double[][][] coords) { - this.coords = coords; - } - - public String[] getItemTypes() { - return itemTypes; - } - - public void setItemTypes(String[] itemTypes) { - this.itemTypes = itemTypes; - } -} \ No newline at end of file +/** + * + */ +package org.openforis.collect.model.proxy; + +import org.openforis.collect.ProxyContext; +import org.openforis.idm.metamodel.CodeAttributeDefinition; +import org.openforis.idm.metamodel.CodeList; +import org.openforis.idm.metamodel.EntityDefinition; +import org.openforis.idm.model.CodeAttribute; + +/** + * @author S. Ricci + * + */ +public class CodeAttributeProxy extends AttributeProxy { + + private CodeAttribute codeAttribute; + + public CodeAttributeProxy(EntityProxy parent, + CodeAttribute attribute, ProxyContext context) { + super(parent, attribute, context); + this.codeAttribute = attribute; + } + + public boolean isEnumerator() { + CodeAttributeDefinition definition = codeAttribute.getDefinition(); + EntityDefinition parentDefinition = (EntityDefinition) definition.getParentDefinition(); + return ( + parentDefinition.isEnumerable() && + definition.isKey() && + definition.getList() != null && + !definition.getList().isExternal() + ); + + } + + protected boolean isExternalCodeList() { + CodeAttributeDefinition defn = codeAttribute.getDefinition(); + CodeList list = defn.getList(); + return list.isExternal(); + } + +} From 129f6ded3a9cd10b9b8166a49c8ffd2e05d73d5f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:25 +0100 Subject: [PATCH 0614/1620] New translations EntityAddChangeProxy.java (French) --- .../earth/app/view/Messages_fr.properties | 40 +++++-------------- 1 file changed, 9 insertions(+), 31 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 42d1e5f858..5fafbba101 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,44 +1,22 @@ -/** - * - */ package org.openforis.collect.model.proxy; import org.openforis.collect.ProxyContext; -import org.openforis.idm.metamodel.CodeAttributeDefinition; -import org.openforis.idm.metamodel.CodeList; -import org.openforis.idm.metamodel.EntityDefinition; -import org.openforis.idm.model.CodeAttribute; +import org.openforis.collect.model.EntityChange; /** + * * @author S. Ricci * */ -public class CodeAttributeProxy extends AttributeProxy { - - private CodeAttribute codeAttribute; - - public CodeAttributeProxy(EntityProxy parent, - CodeAttribute attribute, ProxyContext context) { - super(parent, attribute, context); - this.codeAttribute = attribute; - } +public class EntityAddChangeProxy extends EntityChangeProxy implements NodeAddChangeProxy { - public boolean isEnumerator() { - CodeAttributeDefinition definition = codeAttribute.getDefinition(); - EntityDefinition parentDefinition = (EntityDefinition) definition.getParentDefinition(); - return ( - parentDefinition.isEnumerable() && - definition.isKey() && - definition.getList() != null && - !definition.getList().isExternal() - ); - + public EntityAddChangeProxy(EntityChange change, ProxyContext context) { + super(change, context); } - protected boolean isExternalCodeList() { - CodeAttributeDefinition defn = codeAttribute.getDefinition(); - CodeList list = defn.getList(); - return list.isExternal(); + @Override + public NodeProxy getCreatedNode() { + return NodeProxy.fromNode(change.getNode(), context); } -} +} \ No newline at end of file From 55036e291673cebe1a322b53891394c17c6565ce Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:26 +0100 Subject: [PATCH 0615/1620] New translations EntityAddChangeProxy.java (Spanish) --- .../earth/app/view/Messages_es.properties | 40 +++++-------------- 1 file changed, 9 insertions(+), 31 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 42d1e5f858..5fafbba101 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,44 +1,22 @@ -/** - * - */ package org.openforis.collect.model.proxy; import org.openforis.collect.ProxyContext; -import org.openforis.idm.metamodel.CodeAttributeDefinition; -import org.openforis.idm.metamodel.CodeList; -import org.openforis.idm.metamodel.EntityDefinition; -import org.openforis.idm.model.CodeAttribute; +import org.openforis.collect.model.EntityChange; /** + * * @author S. Ricci * */ -public class CodeAttributeProxy extends AttributeProxy { - - private CodeAttribute codeAttribute; - - public CodeAttributeProxy(EntityProxy parent, - CodeAttribute attribute, ProxyContext context) { - super(parent, attribute, context); - this.codeAttribute = attribute; - } +public class EntityAddChangeProxy extends EntityChangeProxy implements NodeAddChangeProxy { - public boolean isEnumerator() { - CodeAttributeDefinition definition = codeAttribute.getDefinition(); - EntityDefinition parentDefinition = (EntityDefinition) definition.getParentDefinition(); - return ( - parentDefinition.isEnumerable() && - definition.isKey() && - definition.getList() != null && - !definition.getList().isExternal() - ); - + public EntityAddChangeProxy(EntityChange change, ProxyContext context) { + super(change, context); } - protected boolean isExternalCodeList() { - CodeAttributeDefinition defn = codeAttribute.getDefinition(); - CodeList list = defn.getList(); - return list.isExternal(); + @Override + public NodeProxy getCreatedNode() { + return NodeProxy.fromNode(change.getNode(), context); } -} +} \ No newline at end of file From fa9e065bd605705d3ddacc27ee5e502f1081f548 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:27 +0100 Subject: [PATCH 0616/1620] New translations EntityAddChangeProxy.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 40 +++++-------------- 1 file changed, 9 insertions(+), 31 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 42d1e5f858..5fafbba101 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,44 +1,22 @@ -/** - * - */ package org.openforis.collect.model.proxy; import org.openforis.collect.ProxyContext; -import org.openforis.idm.metamodel.CodeAttributeDefinition; -import org.openforis.idm.metamodel.CodeList; -import org.openforis.idm.metamodel.EntityDefinition; -import org.openforis.idm.model.CodeAttribute; +import org.openforis.collect.model.EntityChange; /** + * * @author S. Ricci * */ -public class CodeAttributeProxy extends AttributeProxy { - - private CodeAttribute codeAttribute; - - public CodeAttributeProxy(EntityProxy parent, - CodeAttribute attribute, ProxyContext context) { - super(parent, attribute, context); - this.codeAttribute = attribute; - } +public class EntityAddChangeProxy extends EntityChangeProxy implements NodeAddChangeProxy { - public boolean isEnumerator() { - CodeAttributeDefinition definition = codeAttribute.getDefinition(); - EntityDefinition parentDefinition = (EntityDefinition) definition.getParentDefinition(); - return ( - parentDefinition.isEnumerable() && - definition.isKey() && - definition.getList() != null && - !definition.getList().isExternal() - ); - + public EntityAddChangeProxy(EntityChange change, ProxyContext context) { + super(change, context); } - protected boolean isExternalCodeList() { - CodeAttributeDefinition defn = codeAttribute.getDefinition(); - CodeList list = defn.getList(); - return list.isExternal(); + @Override + public NodeProxy getCreatedNode() { + return NodeProxy.fromNode(change.getNode(), context); } -} +} \ No newline at end of file From 049bedb1850960214d833597cf58d7e0cf715ee7 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:28 +0100 Subject: [PATCH 0617/1620] New translations EntityAddChangeProxy.java (English) --- .../earth/app/view/Messages_en.properties | 40 +++++-------------- 1 file changed, 9 insertions(+), 31 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 42d1e5f858..5fafbba101 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,44 +1,22 @@ -/** - * - */ package org.openforis.collect.model.proxy; import org.openforis.collect.ProxyContext; -import org.openforis.idm.metamodel.CodeAttributeDefinition; -import org.openforis.idm.metamodel.CodeList; -import org.openforis.idm.metamodel.EntityDefinition; -import org.openforis.idm.model.CodeAttribute; +import org.openforis.collect.model.EntityChange; /** + * * @author S. Ricci * */ -public class CodeAttributeProxy extends AttributeProxy { - - private CodeAttribute codeAttribute; - - public CodeAttributeProxy(EntityProxy parent, - CodeAttribute attribute, ProxyContext context) { - super(parent, attribute, context); - this.codeAttribute = attribute; - } +public class EntityAddChangeProxy extends EntityChangeProxy implements NodeAddChangeProxy { - public boolean isEnumerator() { - CodeAttributeDefinition definition = codeAttribute.getDefinition(); - EntityDefinition parentDefinition = (EntityDefinition) definition.getParentDefinition(); - return ( - parentDefinition.isEnumerable() && - definition.isKey() && - definition.getList() != null && - !definition.getList().isExternal() - ); - + public EntityAddChangeProxy(EntityChange change, ProxyContext context) { + super(change, context); } - protected boolean isExternalCodeList() { - CodeAttributeDefinition defn = codeAttribute.getDefinition(); - CodeList list = defn.getList(); - return list.isExternal(); + @Override + public NodeProxy getCreatedNode() { + return NodeProxy.fromNode(change.getNode(), context); } -} +} \ No newline at end of file From 4a3087df0eeb6975236e0ddb53785ecb88cf1bf0 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:29 +0100 Subject: [PATCH 0618/1620] New translations EntityChangeProxy.java (French) --- .../earth/app/view/Messages_fr.properties | 45 ++++++++++++++++--- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 5fafbba101..f636beae70 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,22 +1,53 @@ package org.openforis.collect.model.proxy; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + import org.openforis.collect.ProxyContext; import org.openforis.collect.model.EntityChange; +import org.openforis.idm.metamodel.validation.ValidationResultFlag; /** - * + * * @author S. Ricci * */ -public class EntityAddChangeProxy extends EntityChangeProxy implements NodeAddChangeProxy { +public class EntityChangeProxy extends NodeChangeProxy { - public EntityAddChangeProxy(EntityChange change, ProxyContext context) { + public EntityChangeProxy(EntityChange change, ProxyContext context) { super(change, context); } - @Override - public NodeProxy getCreatedNode() { - return NodeProxy.fromNode(change.getNode(), context); + public Map getRelevant() { + return convertToChildDefinitionIdMap(change.getChildrenRelevance()); + } + + public Map getMinCountByChildDefinitionId() { + return change.getMinCountByChildDefinitionId(); } - + + public Map getMaxCountByChildDefinitionId() { + return change.getMaxCountByChildDefinitionId(); + } + + public Map getMinCountValidation() { + return convertToChildDefinitionIdMap(change.getChildrenMinCountValidation()); + } + + public Map getMaxCountValidation() { + return convertToChildDefinitionIdMap(change.getChildrenMaxCountValidation()); + } + + private Map convertToChildDefinitionIdMap(Map from) { + Map map = new HashMap<>(); + Set> entries = from.entrySet(); + for (Entry entry : entries) { + Integer childDefId = entry.getKey(); + map.put(childDefId, entry.getValue()); + } + return map; + } + } \ No newline at end of file From d153e28593c569e2dd29f9bc5b535b4d26c50e1d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:30 +0100 Subject: [PATCH 0619/1620] New translations EntityChangeProxy.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 45 ++++++++++++++++--- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 5fafbba101..f636beae70 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,22 +1,53 @@ package org.openforis.collect.model.proxy; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + import org.openforis.collect.ProxyContext; import org.openforis.collect.model.EntityChange; +import org.openforis.idm.metamodel.validation.ValidationResultFlag; /** - * + * * @author S. Ricci * */ -public class EntityAddChangeProxy extends EntityChangeProxy implements NodeAddChangeProxy { +public class EntityChangeProxy extends NodeChangeProxy { - public EntityAddChangeProxy(EntityChange change, ProxyContext context) { + public EntityChangeProxy(EntityChange change, ProxyContext context) { super(change, context); } - @Override - public NodeProxy getCreatedNode() { - return NodeProxy.fromNode(change.getNode(), context); + public Map getRelevant() { + return convertToChildDefinitionIdMap(change.getChildrenRelevance()); + } + + public Map getMinCountByChildDefinitionId() { + return change.getMinCountByChildDefinitionId(); } - + + public Map getMaxCountByChildDefinitionId() { + return change.getMaxCountByChildDefinitionId(); + } + + public Map getMinCountValidation() { + return convertToChildDefinitionIdMap(change.getChildrenMinCountValidation()); + } + + public Map getMaxCountValidation() { + return convertToChildDefinitionIdMap(change.getChildrenMaxCountValidation()); + } + + private Map convertToChildDefinitionIdMap(Map from) { + Map map = new HashMap<>(); + Set> entries = from.entrySet(); + for (Entry entry : entries) { + Integer childDefId = entry.getKey(); + map.put(childDefId, entry.getValue()); + } + return map; + } + } \ No newline at end of file From 2c61674bd7e5228e26036fc90f633b4c9e5d9139 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:31 +0100 Subject: [PATCH 0620/1620] New translations AttributeProxy.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 81 ++++++++++--------- 1 file changed, 45 insertions(+), 36 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index f636beae70..bc3c287e47 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,53 +1,62 @@ +/** + * + */ package org.openforis.collect.model.proxy; -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; +import java.util.ArrayList; +import java.util.List; import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.EntityChange; -import org.openforis.idm.metamodel.validation.ValidationResultFlag; +import org.openforis.collect.model.CollectRecord; +import org.openforis.idm.metamodel.validation.ValidationResults; +import org.openforis.idm.model.Attribute; +import org.openforis.idm.model.Field; /** - * + * @author M. Togna * @author S. Ricci - * - */ -public class EntityChangeProxy extends NodeChangeProxy { - - public EntityChangeProxy(EntityChange change, ProxyContext context) { - super(change, context); - } - - public Map getRelevant() { - return convertToChildDefinitionIdMap(change.getChildrenRelevance()); + * + * */ +public class AttributeProxy extends NodeProxy { + + private transient Attribute attribute; + private ValidationResultsProxy validationResults; + private boolean errorConfirmed; + + public AttributeProxy(EntityProxy parent, Attribute attribute, ProxyContext context) { + super(parent, attribute, context); + this.attribute = attribute; + ValidationResults validationRes = attribute.getValidationResults(); + if ( validationRes == null ) { + validationRes = new ValidationResults(); + } + this.validationResults = new ValidationResultsProxy(context, attribute, validationRes); + this.errorConfirmed = ((CollectRecord) attribute.getRecord()).isErrorConfirmed(attribute); } - public Map getMinCountByChildDefinitionId() { - return change.getMinCountByChildDefinitionId(); + public ValidationResultsProxy getValidationResults(){ + return validationResults; } - public Map getMaxCountByChildDefinitionId() { - return change.getMaxCountByChildDefinitionId(); + public void setValidationResults(ValidationResultsProxy value) { + this.validationResults = value; } - public Map getMinCountValidation() { - return convertToChildDefinitionIdMap(change.getChildrenMinCountValidation()); + public List getFields() { + List> fields = attribute.getFields(); + List result = new ArrayList(fields.size()); + for (Field field : fields) { + result.add(new FieldProxy(field)); + } + return result; } - - public Map getMaxCountValidation() { - return convertToChildDefinitionIdMap(change.getChildrenMaxCountValidation()); + + public boolean isErrorConfirmed() { + return errorConfirmed; } - - private Map convertToChildDefinitionIdMap(Map from) { - Map map = new HashMap<>(); - Set> entries = from.entrySet(); - for (Entry entry : entries) { - Integer childDefId = entry.getKey(); - map.put(childDefId, entry.getValue()); - } - return map; + + public void setErrorConfirmed(boolean value) { + this.errorConfirmed = value; } -} \ No newline at end of file +} From 75a06cd0faa252e1e04feeb43b5a86cb48bb102b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:32 +0100 Subject: [PATCH 0621/1620] New translations EntityChangeProxy.java (English) --- .../earth/app/view/Messages_en.properties | 45 ++++++++++++++++--- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 5fafbba101..f636beae70 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,22 +1,53 @@ package org.openforis.collect.model.proxy; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + import org.openforis.collect.ProxyContext; import org.openforis.collect.model.EntityChange; +import org.openforis.idm.metamodel.validation.ValidationResultFlag; /** - * + * * @author S. Ricci * */ -public class EntityAddChangeProxy extends EntityChangeProxy implements NodeAddChangeProxy { +public class EntityChangeProxy extends NodeChangeProxy { - public EntityAddChangeProxy(EntityChange change, ProxyContext context) { + public EntityChangeProxy(EntityChange change, ProxyContext context) { super(change, context); } - @Override - public NodeProxy getCreatedNode() { - return NodeProxy.fromNode(change.getNode(), context); + public Map getRelevant() { + return convertToChildDefinitionIdMap(change.getChildrenRelevance()); + } + + public Map getMinCountByChildDefinitionId() { + return change.getMinCountByChildDefinitionId(); } - + + public Map getMaxCountByChildDefinitionId() { + return change.getMaxCountByChildDefinitionId(); + } + + public Map getMinCountValidation() { + return convertToChildDefinitionIdMap(change.getChildrenMinCountValidation()); + } + + public Map getMaxCountValidation() { + return convertToChildDefinitionIdMap(change.getChildrenMaxCountValidation()); + } + + private Map convertToChildDefinitionIdMap(Map from) { + Map map = new HashMap<>(); + Set> entries = from.entrySet(); + for (Entry entry : entries) { + Integer childDefId = entry.getKey(); + map.put(childDefId, entry.getValue()); + } + return map; + } + } \ No newline at end of file From 222fda28bf85f449b35af23cef1871ce6e08e30f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:33 +0100 Subject: [PATCH 0622/1620] New translations EntityProxy.java (French) --- .../earth/app/view/Messages_fr.properties | 127 ++++++++++++++---- 1 file changed, 101 insertions(+), 26 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index f636beae70..71392d44df 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,53 +1,128 @@ +/** + * + */ package org.openforis.collect.model.proxy; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.EntityChange; +import org.openforis.collect.metamodel.ui.UIOptions; +import org.openforis.collect.model.CollectSurvey; +import org.openforis.idm.metamodel.EntityDefinition; +import org.openforis.idm.metamodel.ModelVersion; +import org.openforis.idm.metamodel.NodeDefinition; import org.openforis.idm.metamodel.validation.ValidationResultFlag; +import org.openforis.idm.model.Entity; +import org.openforis.idm.model.Node; +import org.openforis.idm.model.Record; /** - * + * @author M. Togna * @author S. Ricci - * + * */ -public class EntityChangeProxy extends NodeChangeProxy { +public class EntityProxy extends NodeProxy { - public EntityChangeProxy(EntityChange change, ProxyContext context) { - super(change, context); + private Entity entity; + private List availableChildDefinitions; + + public EntityProxy(EntityProxy parent, Entity entity, ProxyContext context) { + super(parent, entity, context); + this.entity = entity; + this.availableChildDefinitions = getAvailableChildDefinitions(); } - public Map getRelevant() { - return convertToChildDefinitionIdMap(change.getChildrenRelevance()); + public Map> getChildrenByDefinitionId() { + Map> result = new HashMap>(); + for (NodeDefinition childDefinition : availableChildDefinitions) { + List> nodes = this.entity.getChildren(childDefinition); + List proxies = NodeProxy.fromList(this, nodes, context); + result.put(childDefinition.getId(), proxies); + } + return result; } - public Map getMinCountByChildDefinitionId() { - return change.getMinCountByChildDefinitionId(); + public List getChildrenRelevance() { + List result = new ArrayList(availableChildDefinitions.size()); + for (NodeDefinition childDefinition : availableChildDefinitions) { + boolean relevant = entity.isRelevant(childDefinition); + result.add(relevant); + } + return result; } - public Map getMaxCountByChildDefinitionId() { - return change.getMaxCountByChildDefinitionId(); + public List getChildrenMinCountValidation() { + List result = new ArrayList(availableChildDefinitions.size()); + for (NodeDefinition childDefinition : availableChildDefinitions) { + ValidationResultFlag valid = entity.getMinCountValidationResult(childDefinition); + result.add(valid); + } + return result; } - public Map getMinCountValidation() { - return convertToChildDefinitionIdMap(change.getChildrenMinCountValidation()); + public List getChildrenMaxCountValidation() { + List result = new ArrayList(availableChildDefinitions.size()); + for (NodeDefinition childDefinition : availableChildDefinitions) { + ValidationResultFlag valid = entity.getMaxCountValidationResult(childDefinition); + result.add(valid); + } + return result; + } + + public List getChildrenMinCount() { + List result = new ArrayList(availableChildDefinitions.size()); + for (NodeDefinition childDefinition : availableChildDefinitions) { + int count = entity.getMinCount(childDefinition); + result.add(count); + } + return result; } - public Map getMaxCountValidation() { - return convertToChildDefinitionIdMap(change.getChildrenMaxCountValidation()); + public List getChildrenMaxCount() { + List result = new ArrayList(availableChildDefinitions.size()); + for (NodeDefinition childDefinition : availableChildDefinitions) { + Integer count = entity.getMaxCount(childDefinition); + result.add(count); + } + return result; } - private Map convertToChildDefinitionIdMap(Map from) { - Map map = new HashMap<>(); - Set> entries = from.entrySet(); - for (Entry entry : entries) { - Integer childDefId = entry.getKey(); - map.put(childDefId, entry.getValue()); + public List getChildrenErrorVisible() { + List result = new ArrayList(availableChildDefinitions.size()); + for (int i = 0; i < availableChildDefinitions.size(); i++) { + result.add(Boolean.FALSE); } - return map; + return result; } -} \ No newline at end of file + private List getAvailableChildDefinitions() { + List result = new ArrayList(); + UIOptions uiOptions = ((CollectSurvey) entity.getSurvey()).getUIOptions(); + for (NodeDefinition childDefinition : getChildDefinitions()) { + if ( isApplicable(childDefinition) && ! uiOptions.isHidden(childDefinition) ) { + result.add(childDefinition); + } + } + return result; + } + + protected boolean isApplicable(NodeDefinition childDefinition) { + Record record = entity.getRecord(); + ModelVersion version = record.getVersion(); + return version == null || version.isApplicable(childDefinition); + } + + public boolean isEnumerated() { + EntityDefinition definition = entity.getDefinition(); + return definition.isEnumerable(); + } + + private List getChildDefinitions() { + EntityDefinition definition = entity.getDefinition(); + return definition.getChildDefinitions(); + } + +} From 12b771ad9a4508fedcf1a7d15f4f667afbdc881d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:34 +0100 Subject: [PATCH 0623/1620] New translations EntityProxy.java (Spanish) --- .../earth/app/view/Messages_es.properties | 126 ++++++++++++++++-- 1 file changed, 116 insertions(+), 10 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 5fafbba101..71392d44df 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,22 +1,128 @@ +/** + * + */ package org.openforis.collect.model.proxy; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.EntityChange; +import org.openforis.collect.metamodel.ui.UIOptions; +import org.openforis.collect.model.CollectSurvey; +import org.openforis.idm.metamodel.EntityDefinition; +import org.openforis.idm.metamodel.ModelVersion; +import org.openforis.idm.metamodel.NodeDefinition; +import org.openforis.idm.metamodel.validation.ValidationResultFlag; +import org.openforis.idm.model.Entity; +import org.openforis.idm.model.Node; +import org.openforis.idm.model.Record; /** - * + * @author M. Togna * @author S. Ricci - * + * */ -public class EntityAddChangeProxy extends EntityChangeProxy implements NodeAddChangeProxy { +public class EntityProxy extends NodeProxy { + + private Entity entity; + private List availableChildDefinitions; + + public EntityProxy(EntityProxy parent, Entity entity, ProxyContext context) { + super(parent, entity, context); + this.entity = entity; + this.availableChildDefinitions = getAvailableChildDefinitions(); + } + + public Map> getChildrenByDefinitionId() { + Map> result = new HashMap>(); + for (NodeDefinition childDefinition : availableChildDefinitions) { + List> nodes = this.entity.getChildren(childDefinition); + List proxies = NodeProxy.fromList(this, nodes, context); + result.put(childDefinition.getId(), proxies); + } + return result; + } - public EntityAddChangeProxy(EntityChange change, ProxyContext context) { - super(change, context); + public List getChildrenRelevance() { + List result = new ArrayList(availableChildDefinitions.size()); + for (NodeDefinition childDefinition : availableChildDefinitions) { + boolean relevant = entity.isRelevant(childDefinition); + result.add(relevant); + } + return result; } - @Override - public NodeProxy getCreatedNode() { - return NodeProxy.fromNode(change.getNode(), context); + public List getChildrenMinCountValidation() { + List result = new ArrayList(availableChildDefinitions.size()); + for (NodeDefinition childDefinition : availableChildDefinitions) { + ValidationResultFlag valid = entity.getMinCountValidationResult(childDefinition); + result.add(valid); + } + return result; + } + + public List getChildrenMaxCountValidation() { + List result = new ArrayList(availableChildDefinitions.size()); + for (NodeDefinition childDefinition : availableChildDefinitions) { + ValidationResultFlag valid = entity.getMaxCountValidationResult(childDefinition); + result.add(valid); + } + return result; + } + + public List getChildrenMinCount() { + List result = new ArrayList(availableChildDefinitions.size()); + for (NodeDefinition childDefinition : availableChildDefinitions) { + int count = entity.getMinCount(childDefinition); + result.add(count); + } + return result; + } + + public List getChildrenMaxCount() { + List result = new ArrayList(availableChildDefinitions.size()); + for (NodeDefinition childDefinition : availableChildDefinitions) { + Integer count = entity.getMaxCount(childDefinition); + result.add(count); + } + return result; + } + + public List getChildrenErrorVisible() { + List result = new ArrayList(availableChildDefinitions.size()); + for (int i = 0; i < availableChildDefinitions.size(); i++) { + result.add(Boolean.FALSE); + } + return result; + } + + private List getAvailableChildDefinitions() { + List result = new ArrayList(); + UIOptions uiOptions = ((CollectSurvey) entity.getSurvey()).getUIOptions(); + for (NodeDefinition childDefinition : getChildDefinitions()) { + if ( isApplicable(childDefinition) && ! uiOptions.isHidden(childDefinition) ) { + result.add(childDefinition); + } + } + return result; + } + + protected boolean isApplicable(NodeDefinition childDefinition) { + Record record = entity.getRecord(); + ModelVersion version = record.getVersion(); + return version == null || version.isApplicable(childDefinition); + } + + public boolean isEnumerated() { + EntityDefinition definition = entity.getDefinition(); + return definition.isEnumerable(); + } + + private List getChildDefinitions() { + EntityDefinition definition = entity.getDefinition(); + return definition.getChildDefinitions(); } -} \ No newline at end of file +} From 956e73c8da6c9244aed7ded34beb3f907810f517 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:35 +0100 Subject: [PATCH 0624/1620] New translations EntityProxy.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 128 +++++++++++++----- 1 file changed, 97 insertions(+), 31 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index bc3c287e47..71392d44df 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -4,59 +4,125 @@ package org.openforis.collect.model.proxy; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.CollectRecord; -import org.openforis.idm.metamodel.validation.ValidationResults; -import org.openforis.idm.model.Attribute; -import org.openforis.idm.model.Field; +import org.openforis.collect.metamodel.ui.UIOptions; +import org.openforis.collect.model.CollectSurvey; +import org.openforis.idm.metamodel.EntityDefinition; +import org.openforis.idm.metamodel.ModelVersion; +import org.openforis.idm.metamodel.NodeDefinition; +import org.openforis.idm.metamodel.validation.ValidationResultFlag; +import org.openforis.idm.model.Entity; +import org.openforis.idm.model.Node; +import org.openforis.idm.model.Record; /** * @author M. Togna * @author S. Ricci * - * */ -public class AttributeProxy extends NodeProxy { + */ +public class EntityProxy extends NodeProxy { - private transient Attribute attribute; - private ValidationResultsProxy validationResults; - private boolean errorConfirmed; + private Entity entity; + private List availableChildDefinitions; - public AttributeProxy(EntityProxy parent, Attribute attribute, ProxyContext context) { - super(parent, attribute, context); - this.attribute = attribute; - ValidationResults validationRes = attribute.getValidationResults(); - if ( validationRes == null ) { - validationRes = new ValidationResults(); + public EntityProxy(EntityProxy parent, Entity entity, ProxyContext context) { + super(parent, entity, context); + this.entity = entity; + this.availableChildDefinitions = getAvailableChildDefinitions(); + } + + public Map> getChildrenByDefinitionId() { + Map> result = new HashMap>(); + for (NodeDefinition childDefinition : availableChildDefinitions) { + List> nodes = this.entity.getChildren(childDefinition); + List proxies = NodeProxy.fromList(this, nodes, context); + result.put(childDefinition.getId(), proxies); } - this.validationResults = new ValidationResultsProxy(context, attribute, validationRes); - this.errorConfirmed = ((CollectRecord) attribute.getRecord()).isErrorConfirmed(attribute); + return result; } - public ValidationResultsProxy getValidationResults(){ - return validationResults; + public List getChildrenRelevance() { + List result = new ArrayList(availableChildDefinitions.size()); + for (NodeDefinition childDefinition : availableChildDefinitions) { + boolean relevant = entity.isRelevant(childDefinition); + result.add(relevant); + } + return result; } - public void setValidationResults(ValidationResultsProxy value) { - this.validationResults = value; + public List getChildrenMinCountValidation() { + List result = new ArrayList(availableChildDefinitions.size()); + for (NodeDefinition childDefinition : availableChildDefinitions) { + ValidationResultFlag valid = entity.getMinCountValidationResult(childDefinition); + result.add(valid); + } + return result; } - public List getFields() { - List> fields = attribute.getFields(); - List result = new ArrayList(fields.size()); - for (Field field : fields) { - result.add(new FieldProxy(field)); + public List getChildrenMaxCountValidation() { + List result = new ArrayList(availableChildDefinitions.size()); + for (NodeDefinition childDefinition : availableChildDefinitions) { + ValidationResultFlag valid = entity.getMaxCountValidationResult(childDefinition); + result.add(valid); } return result; } - public boolean isErrorConfirmed() { - return errorConfirmed; + public List getChildrenMinCount() { + List result = new ArrayList(availableChildDefinitions.size()); + for (NodeDefinition childDefinition : availableChildDefinitions) { + int count = entity.getMinCount(childDefinition); + result.add(count); + } + return result; } - - public void setErrorConfirmed(boolean value) { - this.errorConfirmed = value; + + public List getChildrenMaxCount() { + List result = new ArrayList(availableChildDefinitions.size()); + for (NodeDefinition childDefinition : availableChildDefinitions) { + Integer count = entity.getMaxCount(childDefinition); + result.add(count); + } + return result; } + public List getChildrenErrorVisible() { + List result = new ArrayList(availableChildDefinitions.size()); + for (int i = 0; i < availableChildDefinitions.size(); i++) { + result.add(Boolean.FALSE); + } + return result; + } + + private List getAvailableChildDefinitions() { + List result = new ArrayList(); + UIOptions uiOptions = ((CollectSurvey) entity.getSurvey()).getUIOptions(); + for (NodeDefinition childDefinition : getChildDefinitions()) { + if ( isApplicable(childDefinition) && ! uiOptions.isHidden(childDefinition) ) { + result.add(childDefinition); + } + } + return result; + } + + protected boolean isApplicable(NodeDefinition childDefinition) { + Record record = entity.getRecord(); + ModelVersion version = record.getVersion(); + return version == null || version.isApplicable(childDefinition); + } + + public boolean isEnumerated() { + EntityDefinition definition = entity.getDefinition(); + return definition.isEnumerable(); + } + + private List getChildDefinitions() { + EntityDefinition definition = entity.getDefinition(); + return definition.getChildDefinitions(); + } + } From 5be255a6d60f38088098f4de35c7ddf20435ed95 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:36 +0100 Subject: [PATCH 0625/1620] New translations EntityProxy.java (English) --- .../earth/app/view/Messages_en.properties | 127 ++++++++++++++---- 1 file changed, 101 insertions(+), 26 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index f636beae70..71392d44df 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,53 +1,128 @@ +/** + * + */ package org.openforis.collect.model.proxy; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.EntityChange; +import org.openforis.collect.metamodel.ui.UIOptions; +import org.openforis.collect.model.CollectSurvey; +import org.openforis.idm.metamodel.EntityDefinition; +import org.openforis.idm.metamodel.ModelVersion; +import org.openforis.idm.metamodel.NodeDefinition; import org.openforis.idm.metamodel.validation.ValidationResultFlag; +import org.openforis.idm.model.Entity; +import org.openforis.idm.model.Node; +import org.openforis.idm.model.Record; /** - * + * @author M. Togna * @author S. Ricci - * + * */ -public class EntityChangeProxy extends NodeChangeProxy { +public class EntityProxy extends NodeProxy { - public EntityChangeProxy(EntityChange change, ProxyContext context) { - super(change, context); + private Entity entity; + private List availableChildDefinitions; + + public EntityProxy(EntityProxy parent, Entity entity, ProxyContext context) { + super(parent, entity, context); + this.entity = entity; + this.availableChildDefinitions = getAvailableChildDefinitions(); } - public Map getRelevant() { - return convertToChildDefinitionIdMap(change.getChildrenRelevance()); + public Map> getChildrenByDefinitionId() { + Map> result = new HashMap>(); + for (NodeDefinition childDefinition : availableChildDefinitions) { + List> nodes = this.entity.getChildren(childDefinition); + List proxies = NodeProxy.fromList(this, nodes, context); + result.put(childDefinition.getId(), proxies); + } + return result; } - public Map getMinCountByChildDefinitionId() { - return change.getMinCountByChildDefinitionId(); + public List getChildrenRelevance() { + List result = new ArrayList(availableChildDefinitions.size()); + for (NodeDefinition childDefinition : availableChildDefinitions) { + boolean relevant = entity.isRelevant(childDefinition); + result.add(relevant); + } + return result; } - public Map getMaxCountByChildDefinitionId() { - return change.getMaxCountByChildDefinitionId(); + public List getChildrenMinCountValidation() { + List result = new ArrayList(availableChildDefinitions.size()); + for (NodeDefinition childDefinition : availableChildDefinitions) { + ValidationResultFlag valid = entity.getMinCountValidationResult(childDefinition); + result.add(valid); + } + return result; } - public Map getMinCountValidation() { - return convertToChildDefinitionIdMap(change.getChildrenMinCountValidation()); + public List getChildrenMaxCountValidation() { + List result = new ArrayList(availableChildDefinitions.size()); + for (NodeDefinition childDefinition : availableChildDefinitions) { + ValidationResultFlag valid = entity.getMaxCountValidationResult(childDefinition); + result.add(valid); + } + return result; + } + + public List getChildrenMinCount() { + List result = new ArrayList(availableChildDefinitions.size()); + for (NodeDefinition childDefinition : availableChildDefinitions) { + int count = entity.getMinCount(childDefinition); + result.add(count); + } + return result; } - public Map getMaxCountValidation() { - return convertToChildDefinitionIdMap(change.getChildrenMaxCountValidation()); + public List getChildrenMaxCount() { + List result = new ArrayList(availableChildDefinitions.size()); + for (NodeDefinition childDefinition : availableChildDefinitions) { + Integer count = entity.getMaxCount(childDefinition); + result.add(count); + } + return result; } - private Map convertToChildDefinitionIdMap(Map from) { - Map map = new HashMap<>(); - Set> entries = from.entrySet(); - for (Entry entry : entries) { - Integer childDefId = entry.getKey(); - map.put(childDefId, entry.getValue()); + public List getChildrenErrorVisible() { + List result = new ArrayList(availableChildDefinitions.size()); + for (int i = 0; i < availableChildDefinitions.size(); i++) { + result.add(Boolean.FALSE); } - return map; + return result; } -} \ No newline at end of file + private List getAvailableChildDefinitions() { + List result = new ArrayList(); + UIOptions uiOptions = ((CollectSurvey) entity.getSurvey()).getUIOptions(); + for (NodeDefinition childDefinition : getChildDefinitions()) { + if ( isApplicable(childDefinition) && ! uiOptions.isHidden(childDefinition) ) { + result.add(childDefinition); + } + } + return result; + } + + protected boolean isApplicable(NodeDefinition childDefinition) { + Record record = entity.getRecord(); + ModelVersion version = record.getVersion(); + return version == null || version.isApplicable(childDefinition); + } + + public boolean isEnumerated() { + EntityDefinition definition = entity.getDefinition(); + return definition.isEnumerable(); + } + + private List getChildDefinitions() { + EntityDefinition definition = entity.getDefinition(); + return definition.getChildDefinitions(); + } + +} From 3515af7b1d06b4ae0c4cd2578ffec8a120a9821d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:37 +0100 Subject: [PATCH 0626/1620] New translations FieldProxy.java (French) --- .../earth/app/view/Messages_fr.properties | 130 +++++------------- 1 file changed, 35 insertions(+), 95 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 71392d44df..11b4d244d0 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -4,125 +4,65 @@ package org.openforis.collect.model.proxy; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import org.openforis.collect.ProxyContext; -import org.openforis.collect.metamodel.ui.UIOptions; -import org.openforis.collect.model.CollectSurvey; -import org.openforis.idm.metamodel.EntityDefinition; -import org.openforis.idm.metamodel.ModelVersion; -import org.openforis.idm.metamodel.NodeDefinition; -import org.openforis.idm.metamodel.validation.ValidationResultFlag; -import org.openforis.idm.model.Entity; -import org.openforis.idm.model.Node; -import org.openforis.idm.model.Record; +import org.openforis.collect.Proxy; +import org.openforis.collect.model.FieldSymbol; +import org.openforis.idm.model.Field; /** - * @author M. Togna * @author S. Ricci - * + * */ -public class EntityProxy extends NodeProxy { +public class FieldProxy implements Proxy { - private Entity entity; - private List availableChildDefinitions; - - public EntityProxy(EntityProxy parent, Entity entity, ProxyContext context) { - super(parent, entity, context); - this.entity = entity; - this.availableChildDefinitions = getAvailableChildDefinitions(); - } + private Object value; + private FieldSymbol symbol; + private String remarks; - public Map> getChildrenByDefinitionId() { - Map> result = new HashMap>(); - for (NodeDefinition childDefinition : availableChildDefinitions) { - List> nodes = this.entity.getChildren(childDefinition); - List proxies = NodeProxy.fromList(this, nodes, context); - result.put(childDefinition.getId(), proxies); + public FieldProxy(Field field) { + super(); + value = field.getValue(); + if(field.getSymbol() != null) { + symbol = FieldSymbol.valueOf(field.getSymbol()); } - return result; + remarks = field.getRemarks(); } - public List getChildrenRelevance() { - List result = new ArrayList(availableChildDefinitions.size()); - for (NodeDefinition childDefinition : availableChildDefinitions) { - boolean relevant = entity.isRelevant(childDefinition); - result.add(relevant); - } - return result; - } - public List getChildrenMinCountValidation() { - List result = new ArrayList(availableChildDefinitions.size()); - for (NodeDefinition childDefinition : availableChildDefinitions) { - ValidationResultFlag valid = entity.getMinCountValidationResult(childDefinition); - result.add(valid); - } - return result; - } - - public List getChildrenMaxCountValidation() { - List result = new ArrayList(availableChildDefinitions.size()); - for (NodeDefinition childDefinition : availableChildDefinitions) { - ValidationResultFlag valid = entity.getMaxCountValidationResult(childDefinition); - result.add(valid); + public static List fromList(List> list) { + List proxies = new ArrayList(); + if (list != null) { + for (Field item : list) { + FieldProxy proxy = new FieldProxy(item); + proxies.add(proxy); + } } - return result; + return proxies; } - public List getChildrenMinCount() { - List result = new ArrayList(availableChildDefinitions.size()); - for (NodeDefinition childDefinition : availableChildDefinitions) { - int count = entity.getMinCount(childDefinition); - result.add(count); - } - return result; + public Object getValue() { + return value; } - - public List getChildrenMaxCount() { - List result = new ArrayList(availableChildDefinitions.size()); - for (NodeDefinition childDefinition : availableChildDefinitions) { - Integer count = entity.getMaxCount(childDefinition); - result.add(count); - } - return result; + + public void setValue(Object value) { + this.value = value; } - public List getChildrenErrorVisible() { - List result = new ArrayList(availableChildDefinitions.size()); - for (int i = 0; i < availableChildDefinitions.size(); i++) { - result.add(Boolean.FALSE); - } - return result; + public String getRemarks() { + return remarks; } - private List getAvailableChildDefinitions() { - List result = new ArrayList(); - UIOptions uiOptions = ((CollectSurvey) entity.getSurvey()).getUIOptions(); - for (NodeDefinition childDefinition : getChildDefinitions()) { - if ( isApplicable(childDefinition) && ! uiOptions.isHidden(childDefinition) ) { - result.add(childDefinition); - } - } - return result; - } - - protected boolean isApplicable(NodeDefinition childDefinition) { - Record record = entity.getRecord(); - ModelVersion version = record.getVersion(); - return version == null || version.isApplicable(childDefinition); + public FieldSymbol getSymbol() { + return symbol; } - public boolean isEnumerated() { - EntityDefinition definition = entity.getDefinition(); - return definition.isEnumerable(); + public void setSymbol(FieldSymbol symbol) { + this.symbol = symbol; } - private List getChildDefinitions() { - EntityDefinition definition = entity.getDefinition(); - return definition.getChildDefinitions(); + public void setRemarks(String remarks) { + this.remarks = remarks; } } From ed6af5bd705a69a1bc276d26c45401bd61b9afe3 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:38 +0100 Subject: [PATCH 0627/1620] New translations FieldProxy.java (Spanish) --- .../earth/app/view/Messages_es.properties | 130 +++++------------- 1 file changed, 35 insertions(+), 95 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 71392d44df..11b4d244d0 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -4,125 +4,65 @@ package org.openforis.collect.model.proxy; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import org.openforis.collect.ProxyContext; -import org.openforis.collect.metamodel.ui.UIOptions; -import org.openforis.collect.model.CollectSurvey; -import org.openforis.idm.metamodel.EntityDefinition; -import org.openforis.idm.metamodel.ModelVersion; -import org.openforis.idm.metamodel.NodeDefinition; -import org.openforis.idm.metamodel.validation.ValidationResultFlag; -import org.openforis.idm.model.Entity; -import org.openforis.idm.model.Node; -import org.openforis.idm.model.Record; +import org.openforis.collect.Proxy; +import org.openforis.collect.model.FieldSymbol; +import org.openforis.idm.model.Field; /** - * @author M. Togna * @author S. Ricci - * + * */ -public class EntityProxy extends NodeProxy { +public class FieldProxy implements Proxy { - private Entity entity; - private List availableChildDefinitions; - - public EntityProxy(EntityProxy parent, Entity entity, ProxyContext context) { - super(parent, entity, context); - this.entity = entity; - this.availableChildDefinitions = getAvailableChildDefinitions(); - } + private Object value; + private FieldSymbol symbol; + private String remarks; - public Map> getChildrenByDefinitionId() { - Map> result = new HashMap>(); - for (NodeDefinition childDefinition : availableChildDefinitions) { - List> nodes = this.entity.getChildren(childDefinition); - List proxies = NodeProxy.fromList(this, nodes, context); - result.put(childDefinition.getId(), proxies); + public FieldProxy(Field field) { + super(); + value = field.getValue(); + if(field.getSymbol() != null) { + symbol = FieldSymbol.valueOf(field.getSymbol()); } - return result; + remarks = field.getRemarks(); } - public List getChildrenRelevance() { - List result = new ArrayList(availableChildDefinitions.size()); - for (NodeDefinition childDefinition : availableChildDefinitions) { - boolean relevant = entity.isRelevant(childDefinition); - result.add(relevant); - } - return result; - } - public List getChildrenMinCountValidation() { - List result = new ArrayList(availableChildDefinitions.size()); - for (NodeDefinition childDefinition : availableChildDefinitions) { - ValidationResultFlag valid = entity.getMinCountValidationResult(childDefinition); - result.add(valid); - } - return result; - } - - public List getChildrenMaxCountValidation() { - List result = new ArrayList(availableChildDefinitions.size()); - for (NodeDefinition childDefinition : availableChildDefinitions) { - ValidationResultFlag valid = entity.getMaxCountValidationResult(childDefinition); - result.add(valid); + public static List fromList(List> list) { + List proxies = new ArrayList(); + if (list != null) { + for (Field item : list) { + FieldProxy proxy = new FieldProxy(item); + proxies.add(proxy); + } } - return result; + return proxies; } - public List getChildrenMinCount() { - List result = new ArrayList(availableChildDefinitions.size()); - for (NodeDefinition childDefinition : availableChildDefinitions) { - int count = entity.getMinCount(childDefinition); - result.add(count); - } - return result; + public Object getValue() { + return value; } - - public List getChildrenMaxCount() { - List result = new ArrayList(availableChildDefinitions.size()); - for (NodeDefinition childDefinition : availableChildDefinitions) { - Integer count = entity.getMaxCount(childDefinition); - result.add(count); - } - return result; + + public void setValue(Object value) { + this.value = value; } - public List getChildrenErrorVisible() { - List result = new ArrayList(availableChildDefinitions.size()); - for (int i = 0; i < availableChildDefinitions.size(); i++) { - result.add(Boolean.FALSE); - } - return result; + public String getRemarks() { + return remarks; } - private List getAvailableChildDefinitions() { - List result = new ArrayList(); - UIOptions uiOptions = ((CollectSurvey) entity.getSurvey()).getUIOptions(); - for (NodeDefinition childDefinition : getChildDefinitions()) { - if ( isApplicable(childDefinition) && ! uiOptions.isHidden(childDefinition) ) { - result.add(childDefinition); - } - } - return result; - } - - protected boolean isApplicable(NodeDefinition childDefinition) { - Record record = entity.getRecord(); - ModelVersion version = record.getVersion(); - return version == null || version.isApplicable(childDefinition); + public FieldSymbol getSymbol() { + return symbol; } - public boolean isEnumerated() { - EntityDefinition definition = entity.getDefinition(); - return definition.isEnumerable(); + public void setSymbol(FieldSymbol symbol) { + this.symbol = symbol; } - private List getChildDefinitions() { - EntityDefinition definition = entity.getDefinition(); - return definition.getChildDefinitions(); + public void setRemarks(String remarks) { + this.remarks = remarks; } } From bc974157a7d60eada862764c74fe846af666d709 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:39 +0100 Subject: [PATCH 0628/1620] New translations FieldProxy.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 130 +++++------------- 1 file changed, 35 insertions(+), 95 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 71392d44df..11b4d244d0 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -4,125 +4,65 @@ package org.openforis.collect.model.proxy; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import org.openforis.collect.ProxyContext; -import org.openforis.collect.metamodel.ui.UIOptions; -import org.openforis.collect.model.CollectSurvey; -import org.openforis.idm.metamodel.EntityDefinition; -import org.openforis.idm.metamodel.ModelVersion; -import org.openforis.idm.metamodel.NodeDefinition; -import org.openforis.idm.metamodel.validation.ValidationResultFlag; -import org.openforis.idm.model.Entity; -import org.openforis.idm.model.Node; -import org.openforis.idm.model.Record; +import org.openforis.collect.Proxy; +import org.openforis.collect.model.FieldSymbol; +import org.openforis.idm.model.Field; /** - * @author M. Togna * @author S. Ricci - * + * */ -public class EntityProxy extends NodeProxy { +public class FieldProxy implements Proxy { - private Entity entity; - private List availableChildDefinitions; - - public EntityProxy(EntityProxy parent, Entity entity, ProxyContext context) { - super(parent, entity, context); - this.entity = entity; - this.availableChildDefinitions = getAvailableChildDefinitions(); - } + private Object value; + private FieldSymbol symbol; + private String remarks; - public Map> getChildrenByDefinitionId() { - Map> result = new HashMap>(); - for (NodeDefinition childDefinition : availableChildDefinitions) { - List> nodes = this.entity.getChildren(childDefinition); - List proxies = NodeProxy.fromList(this, nodes, context); - result.put(childDefinition.getId(), proxies); + public FieldProxy(Field field) { + super(); + value = field.getValue(); + if(field.getSymbol() != null) { + symbol = FieldSymbol.valueOf(field.getSymbol()); } - return result; + remarks = field.getRemarks(); } - public List getChildrenRelevance() { - List result = new ArrayList(availableChildDefinitions.size()); - for (NodeDefinition childDefinition : availableChildDefinitions) { - boolean relevant = entity.isRelevant(childDefinition); - result.add(relevant); - } - return result; - } - public List getChildrenMinCountValidation() { - List result = new ArrayList(availableChildDefinitions.size()); - for (NodeDefinition childDefinition : availableChildDefinitions) { - ValidationResultFlag valid = entity.getMinCountValidationResult(childDefinition); - result.add(valid); - } - return result; - } - - public List getChildrenMaxCountValidation() { - List result = new ArrayList(availableChildDefinitions.size()); - for (NodeDefinition childDefinition : availableChildDefinitions) { - ValidationResultFlag valid = entity.getMaxCountValidationResult(childDefinition); - result.add(valid); + public static List fromList(List> list) { + List proxies = new ArrayList(); + if (list != null) { + for (Field item : list) { + FieldProxy proxy = new FieldProxy(item); + proxies.add(proxy); + } } - return result; + return proxies; } - public List getChildrenMinCount() { - List result = new ArrayList(availableChildDefinitions.size()); - for (NodeDefinition childDefinition : availableChildDefinitions) { - int count = entity.getMinCount(childDefinition); - result.add(count); - } - return result; + public Object getValue() { + return value; } - - public List getChildrenMaxCount() { - List result = new ArrayList(availableChildDefinitions.size()); - for (NodeDefinition childDefinition : availableChildDefinitions) { - Integer count = entity.getMaxCount(childDefinition); - result.add(count); - } - return result; + + public void setValue(Object value) { + this.value = value; } - public List getChildrenErrorVisible() { - List result = new ArrayList(availableChildDefinitions.size()); - for (int i = 0; i < availableChildDefinitions.size(); i++) { - result.add(Boolean.FALSE); - } - return result; + public String getRemarks() { + return remarks; } - private List getAvailableChildDefinitions() { - List result = new ArrayList(); - UIOptions uiOptions = ((CollectSurvey) entity.getSurvey()).getUIOptions(); - for (NodeDefinition childDefinition : getChildDefinitions()) { - if ( isApplicable(childDefinition) && ! uiOptions.isHidden(childDefinition) ) { - result.add(childDefinition); - } - } - return result; - } - - protected boolean isApplicable(NodeDefinition childDefinition) { - Record record = entity.getRecord(); - ModelVersion version = record.getVersion(); - return version == null || version.isApplicable(childDefinition); + public FieldSymbol getSymbol() { + return symbol; } - public boolean isEnumerated() { - EntityDefinition definition = entity.getDefinition(); - return definition.isEnumerable(); + public void setSymbol(FieldSymbol symbol) { + this.symbol = symbol; } - private List getChildDefinitions() { - EntityDefinition definition = entity.getDefinition(); - return definition.getChildDefinitions(); + public void setRemarks(String remarks) { + this.remarks = remarks; } } From 2d18ec584ac362e5e24e93a89965e6b90246c609 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:41 +0100 Subject: [PATCH 0629/1620] New translations FieldProxy.java (English) --- .../earth/app/view/Messages_en.properties | 130 +++++------------- 1 file changed, 35 insertions(+), 95 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 71392d44df..11b4d244d0 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -4,125 +4,65 @@ package org.openforis.collect.model.proxy; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import org.openforis.collect.ProxyContext; -import org.openforis.collect.metamodel.ui.UIOptions; -import org.openforis.collect.model.CollectSurvey; -import org.openforis.idm.metamodel.EntityDefinition; -import org.openforis.idm.metamodel.ModelVersion; -import org.openforis.idm.metamodel.NodeDefinition; -import org.openforis.idm.metamodel.validation.ValidationResultFlag; -import org.openforis.idm.model.Entity; -import org.openforis.idm.model.Node; -import org.openforis.idm.model.Record; +import org.openforis.collect.Proxy; +import org.openforis.collect.model.FieldSymbol; +import org.openforis.idm.model.Field; /** - * @author M. Togna * @author S. Ricci - * + * */ -public class EntityProxy extends NodeProxy { +public class FieldProxy implements Proxy { - private Entity entity; - private List availableChildDefinitions; - - public EntityProxy(EntityProxy parent, Entity entity, ProxyContext context) { - super(parent, entity, context); - this.entity = entity; - this.availableChildDefinitions = getAvailableChildDefinitions(); - } + private Object value; + private FieldSymbol symbol; + private String remarks; - public Map> getChildrenByDefinitionId() { - Map> result = new HashMap>(); - for (NodeDefinition childDefinition : availableChildDefinitions) { - List> nodes = this.entity.getChildren(childDefinition); - List proxies = NodeProxy.fromList(this, nodes, context); - result.put(childDefinition.getId(), proxies); + public FieldProxy(Field field) { + super(); + value = field.getValue(); + if(field.getSymbol() != null) { + symbol = FieldSymbol.valueOf(field.getSymbol()); } - return result; + remarks = field.getRemarks(); } - public List getChildrenRelevance() { - List result = new ArrayList(availableChildDefinitions.size()); - for (NodeDefinition childDefinition : availableChildDefinitions) { - boolean relevant = entity.isRelevant(childDefinition); - result.add(relevant); - } - return result; - } - public List getChildrenMinCountValidation() { - List result = new ArrayList(availableChildDefinitions.size()); - for (NodeDefinition childDefinition : availableChildDefinitions) { - ValidationResultFlag valid = entity.getMinCountValidationResult(childDefinition); - result.add(valid); - } - return result; - } - - public List getChildrenMaxCountValidation() { - List result = new ArrayList(availableChildDefinitions.size()); - for (NodeDefinition childDefinition : availableChildDefinitions) { - ValidationResultFlag valid = entity.getMaxCountValidationResult(childDefinition); - result.add(valid); + public static List fromList(List> list) { + List proxies = new ArrayList(); + if (list != null) { + for (Field item : list) { + FieldProxy proxy = new FieldProxy(item); + proxies.add(proxy); + } } - return result; + return proxies; } - public List getChildrenMinCount() { - List result = new ArrayList(availableChildDefinitions.size()); - for (NodeDefinition childDefinition : availableChildDefinitions) { - int count = entity.getMinCount(childDefinition); - result.add(count); - } - return result; + public Object getValue() { + return value; } - - public List getChildrenMaxCount() { - List result = new ArrayList(availableChildDefinitions.size()); - for (NodeDefinition childDefinition : availableChildDefinitions) { - Integer count = entity.getMaxCount(childDefinition); - result.add(count); - } - return result; + + public void setValue(Object value) { + this.value = value; } - public List getChildrenErrorVisible() { - List result = new ArrayList(availableChildDefinitions.size()); - for (int i = 0; i < availableChildDefinitions.size(); i++) { - result.add(Boolean.FALSE); - } - return result; + public String getRemarks() { + return remarks; } - private List getAvailableChildDefinitions() { - List result = new ArrayList(); - UIOptions uiOptions = ((CollectSurvey) entity.getSurvey()).getUIOptions(); - for (NodeDefinition childDefinition : getChildDefinitions()) { - if ( isApplicable(childDefinition) && ! uiOptions.isHidden(childDefinition) ) { - result.add(childDefinition); - } - } - return result; - } - - protected boolean isApplicable(NodeDefinition childDefinition) { - Record record = entity.getRecord(); - ModelVersion version = record.getVersion(); - return version == null || version.isApplicable(childDefinition); + public FieldSymbol getSymbol() { + return symbol; } - public boolean isEnumerated() { - EntityDefinition definition = entity.getDefinition(); - return definition.isEnumerable(); + public void setSymbol(FieldSymbol symbol) { + this.symbol = symbol; } - private List getChildDefinitions() { - EntityDefinition definition = entity.getDefinition(); - return definition.getChildDefinitions(); + public void setRemarks(String remarks) { + this.remarks = remarks; } } From ed47532002dadec053008b0c0c115af068f1f072 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:42 +0100 Subject: [PATCH 0630/1620] New translations NodeAddChangeProxy.java (French) --- .../earth/app/view/Messages_fr.properties | 62 ++----------------- 1 file changed, 4 insertions(+), 58 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 11b4d244d0..2cea96468e 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,68 +1,14 @@ -/** - * - */ package org.openforis.collect.model.proxy; -import java.util.ArrayList; -import java.util.List; -import org.openforis.collect.Proxy; -import org.openforis.collect.model.FieldSymbol; -import org.openforis.idm.model.Field; /** + * * @author S. Ricci * */ -public class FieldProxy implements Proxy { - - private Object value; - private FieldSymbol symbol; - private String remarks; - - public FieldProxy(Field field) { - super(); - value = field.getValue(); - if(field.getSymbol() != null) { - symbol = FieldSymbol.valueOf(field.getSymbol()); - } - remarks = field.getRemarks(); - } - - - public static List fromList(List> list) { - List proxies = new ArrayList(); - if (list != null) { - for (Field item : list) { - FieldProxy proxy = new FieldProxy(item); - proxies.add(proxy); - } - } - return proxies; - } - - public Object getValue() { - return value; - } - - public void setValue(Object value) { - this.value = value; - } - - public String getRemarks() { - return remarks; - } - - public FieldSymbol getSymbol() { - return symbol; - } - - public void setSymbol(FieldSymbol symbol) { - this.symbol = symbol; - } +public interface NodeAddChangeProxy { - public void setRemarks(String remarks) { - this.remarks = remarks; - } + NodeProxy getCreatedNode(); -} +} \ No newline at end of file From 83a392c8aab481e020b613ea355f5984fe707641 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:43 +0100 Subject: [PATCH 0631/1620] New translations AttributeProxy.java (English) --- .../earth/app/view/Messages_en.properties | 78 +++++++++---------- 1 file changed, 36 insertions(+), 42 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 11b4d244d0..bc3c287e47 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -6,63 +6,57 @@ package org.openforis.collect.model.proxy; import java.util.ArrayList; import java.util.List; -import org.openforis.collect.Proxy; -import org.openforis.collect.model.FieldSymbol; +import org.openforis.collect.ProxyContext; +import org.openforis.collect.model.CollectRecord; +import org.openforis.idm.metamodel.validation.ValidationResults; +import org.openforis.idm.model.Attribute; import org.openforis.idm.model.Field; /** + * @author M. Togna * @author S. Ricci - * - */ -public class FieldProxy implements Proxy { - - private Object value; - private FieldSymbol symbol; - private String remarks; + * + * */ +public class AttributeProxy extends NodeProxy { - public FieldProxy(Field field) { - super(); - value = field.getValue(); - if(field.getSymbol() != null) { - symbol = FieldSymbol.valueOf(field.getSymbol()); + private transient Attribute attribute; + private ValidationResultsProxy validationResults; + private boolean errorConfirmed; + + public AttributeProxy(EntityProxy parent, Attribute attribute, ProxyContext context) { + super(parent, attribute, context); + this.attribute = attribute; + ValidationResults validationRes = attribute.getValidationResults(); + if ( validationRes == null ) { + validationRes = new ValidationResults(); } - remarks = field.getRemarks(); + this.validationResults = new ValidationResultsProxy(context, attribute, validationRes); + this.errorConfirmed = ((CollectRecord) attribute.getRecord()).isErrorConfirmed(attribute); } - - public static List fromList(List> list) { - List proxies = new ArrayList(); - if (list != null) { - for (Field item : list) { - FieldProxy proxy = new FieldProxy(item); - proxies.add(proxy); - } - } - return proxies; - } - - public Object getValue() { - return value; - } - - public void setValue(Object value) { - this.value = value; + public ValidationResultsProxy getValidationResults(){ + return validationResults; } - public String getRemarks() { - return remarks; + public void setValidationResults(ValidationResultsProxy value) { + this.validationResults = value; } - public FieldSymbol getSymbol() { - return symbol; + public List getFields() { + List> fields = attribute.getFields(); + List result = new ArrayList(fields.size()); + for (Field field : fields) { + result.add(new FieldProxy(field)); + } + return result; } - public void setSymbol(FieldSymbol symbol) { - this.symbol = symbol; + public boolean isErrorConfirmed() { + return errorConfirmed; } - public void setRemarks(String remarks) { - this.remarks = remarks; + public void setErrorConfirmed(boolean value) { + this.errorConfirmed = value; } - + } From 19f397d194ebf36a625011e0575d38d591d797fb Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:44 +0100 Subject: [PATCH 0632/1620] New translations AttributeProxy.java (Spanish) --- .../earth/app/view/Messages_es.properties | 78 +++++++++---------- 1 file changed, 36 insertions(+), 42 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 11b4d244d0..bc3c287e47 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -6,63 +6,57 @@ package org.openforis.collect.model.proxy; import java.util.ArrayList; import java.util.List; -import org.openforis.collect.Proxy; -import org.openforis.collect.model.FieldSymbol; +import org.openforis.collect.ProxyContext; +import org.openforis.collect.model.CollectRecord; +import org.openforis.idm.metamodel.validation.ValidationResults; +import org.openforis.idm.model.Attribute; import org.openforis.idm.model.Field; /** + * @author M. Togna * @author S. Ricci - * - */ -public class FieldProxy implements Proxy { - - private Object value; - private FieldSymbol symbol; - private String remarks; + * + * */ +public class AttributeProxy extends NodeProxy { - public FieldProxy(Field field) { - super(); - value = field.getValue(); - if(field.getSymbol() != null) { - symbol = FieldSymbol.valueOf(field.getSymbol()); + private transient Attribute attribute; + private ValidationResultsProxy validationResults; + private boolean errorConfirmed; + + public AttributeProxy(EntityProxy parent, Attribute attribute, ProxyContext context) { + super(parent, attribute, context); + this.attribute = attribute; + ValidationResults validationRes = attribute.getValidationResults(); + if ( validationRes == null ) { + validationRes = new ValidationResults(); } - remarks = field.getRemarks(); + this.validationResults = new ValidationResultsProxy(context, attribute, validationRes); + this.errorConfirmed = ((CollectRecord) attribute.getRecord()).isErrorConfirmed(attribute); } - - public static List fromList(List> list) { - List proxies = new ArrayList(); - if (list != null) { - for (Field item : list) { - FieldProxy proxy = new FieldProxy(item); - proxies.add(proxy); - } - } - return proxies; - } - - public Object getValue() { - return value; - } - - public void setValue(Object value) { - this.value = value; + public ValidationResultsProxy getValidationResults(){ + return validationResults; } - public String getRemarks() { - return remarks; + public void setValidationResults(ValidationResultsProxy value) { + this.validationResults = value; } - public FieldSymbol getSymbol() { - return symbol; + public List getFields() { + List> fields = attribute.getFields(); + List result = new ArrayList(fields.size()); + for (Field field : fields) { + result.add(new FieldProxy(field)); + } + return result; } - public void setSymbol(FieldSymbol symbol) { - this.symbol = symbol; + public boolean isErrorConfirmed() { + return errorConfirmed; } - public void setRemarks(String remarks) { - this.remarks = remarks; + public void setErrorConfirmed(boolean value) { + this.errorConfirmed = value; } - + } From 8ee867a68d353d36445b8b1a64a8dee00b1d4405 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:45 +0100 Subject: [PATCH 0633/1620] New translations Response.java (Spanish) --- .../earth/app/view/Messages_es.properties | 63 +++---------------- 1 file changed, 8 insertions(+), 55 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index bc3c287e47..21d609c128 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,62 +1,15 @@ -/** - * - */ -package org.openforis.collect.model.proxy; +package org.openforis.collect.earth.planet; -import java.util.ArrayList; -import java.util.List; +public class Response { -import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.CollectRecord; -import org.openforis.idm.metamodel.validation.ValidationResults; -import org.openforis.idm.model.Attribute; -import org.openforis.idm.model.Field; + public Feature[] features; + public Links _links; -/** - * @author M. Togna - * @author S. Ricci - * - * */ -public class AttributeProxy extends NodeProxy { - - private transient Attribute attribute; - private ValidationResultsProxy validationResults; - private boolean errorConfirmed; - - public AttributeProxy(EntityProxy parent, Attribute attribute, ProxyContext context) { - super(parent, attribute, context); - this.attribute = attribute; - ValidationResults validationRes = attribute.getValidationResults(); - if ( validationRes == null ) { - validationRes = new ValidationResults(); - } - this.validationResults = new ValidationResultsProxy(context, attribute, validationRes); - this.errorConfirmed = ((CollectRecord) attribute.getRecord()).isErrorConfirmed(attribute); - } - - public ValidationResultsProxy getValidationResults(){ - return validationResults; - } - - public void setValidationResults(ValidationResultsProxy value) { - this.validationResults = value; + public Feature[] getFeatures() { + return features; } - public List getFields() { - List> fields = attribute.getFields(); - List result = new ArrayList(fields.size()); - for (Field field : fields) { - result.add(new FieldProxy(field)); - } - return result; - } - - public boolean isErrorConfirmed() { - return errorConfirmed; + public Links getLinks() { + return _links; } - - public void setErrorConfirmed(boolean value) { - this.errorConfirmed = value; - } - } From 638b80d67ea4b18d3599ee816cd464837f9c826d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:46 +0100 Subject: [PATCH 0634/1620] New translations AbstractSummariesProxy.java (French) --- .../earth/app/view/Messages_fr.properties | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 2cea96468e..1bba5b2b7a 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,14 +1,28 @@ package org.openforis.collect.model.proxy; +import java.util.List; +import org.openforis.collect.Proxy; +import org.openforis.collect.model.AbstractSummaries; /** * * @author S. Ricci * */ -public interface NodeAddChangeProxy { +public abstract class AbstractSummariesProxy implements Proxy { - NodeProxy getCreatedNode(); - -} \ No newline at end of file + protected AbstractSummaries summaries; + + public AbstractSummariesProxy(AbstractSummaries summaries) { + super(); + this.summaries = summaries; + } + + public int getTotalCount() { + return summaries.getTotalCount(); + } + + public abstract List getRecords(); + +} From b8eac79d85b03c9622fae15449ac526fc5f79646 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:47 +0100 Subject: [PATCH 0635/1620] New translations Response.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 69 +++---------------- 1 file changed, 8 insertions(+), 61 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 11b4d244d0..21d609c128 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,68 +1,15 @@ -/** - * - */ -package org.openforis.collect.model.proxy; +package org.openforis.collect.earth.planet; -import java.util.ArrayList; -import java.util.List; +public class Response { -import org.openforis.collect.Proxy; -import org.openforis.collect.model.FieldSymbol; -import org.openforis.idm.model.Field; + public Feature[] features; + public Links _links; -/** - * @author S. Ricci - * - */ -public class FieldProxy implements Proxy { - - private Object value; - private FieldSymbol symbol; - private String remarks; - - public FieldProxy(Field field) { - super(); - value = field.getValue(); - if(field.getSymbol() != null) { - symbol = FieldSymbol.valueOf(field.getSymbol()); - } - remarks = field.getRemarks(); + public Feature[] getFeatures() { + return features; } - - public static List fromList(List> list) { - List proxies = new ArrayList(); - if (list != null) { - for (Field item : list) { - FieldProxy proxy = new FieldProxy(item); - proxies.add(proxy); - } - } - return proxies; - } - - public Object getValue() { - return value; - } - - public void setValue(Object value) { - this.value = value; - } - - public String getRemarks() { - return remarks; - } - - public FieldSymbol getSymbol() { - return symbol; - } - - public void setSymbol(FieldSymbol symbol) { - this.symbol = symbol; - } - - public void setRemarks(String remarks) { - this.remarks = remarks; + public Links getLinks() { + return _links; } - } From 1509fb03f3cdf85d6515fae939540d746b015d78 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:48 +0100 Subject: [PATCH 0636/1620] New translations Response.java (English) --- .../earth/app/view/Messages_en.properties | 63 +++---------------- 1 file changed, 8 insertions(+), 55 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index bc3c287e47..21d609c128 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,62 +1,15 @@ -/** - * - */ -package org.openforis.collect.model.proxy; +package org.openforis.collect.earth.planet; -import java.util.ArrayList; -import java.util.List; +public class Response { -import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.CollectRecord; -import org.openforis.idm.metamodel.validation.ValidationResults; -import org.openforis.idm.model.Attribute; -import org.openforis.idm.model.Field; + public Feature[] features; + public Links _links; -/** - * @author M. Togna - * @author S. Ricci - * - * */ -public class AttributeProxy extends NodeProxy { - - private transient Attribute attribute; - private ValidationResultsProxy validationResults; - private boolean errorConfirmed; - - public AttributeProxy(EntityProxy parent, Attribute attribute, ProxyContext context) { - super(parent, attribute, context); - this.attribute = attribute; - ValidationResults validationRes = attribute.getValidationResults(); - if ( validationRes == null ) { - validationRes = new ValidationResults(); - } - this.validationResults = new ValidationResultsProxy(context, attribute, validationRes); - this.errorConfirmed = ((CollectRecord) attribute.getRecord()).isErrorConfirmed(attribute); - } - - public ValidationResultsProxy getValidationResults(){ - return validationResults; - } - - public void setValidationResults(ValidationResultsProxy value) { - this.validationResults = value; + public Feature[] getFeatures() { + return features; } - public List getFields() { - List> fields = attribute.getFields(); - List result = new ArrayList(fields.size()); - for (Field field : fields) { - result.add(new FieldProxy(field)); - } - return result; - } - - public boolean isErrorConfirmed() { - return errorConfirmed; + public Links getLinks() { + return _links; } - - public void setErrorConfirmed(boolean value) { - this.errorConfirmed = value; - } - } From 7186196b4fe5920c7324ab47ae280d9aa765d244 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:49 +0100 Subject: [PATCH 0637/1620] New translations SearchRequest.java (French) --- .../earth/app/view/Messages_fr.properties | 42 +++++++++++-------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 1bba5b2b7a..34ef3a1eb1 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,28 +1,36 @@ -package org.openforis.collect.model.proxy; +package org.openforis.collect.earth.planet; -import java.util.List; +public class SearchRequest{ -import org.openforis.collect.Proxy; -import org.openforis.collect.model.AbstractSummaries; + String[] item_types; + Filter filter; + String[] ids; -/** - * - * @author S. Ricci - * - */ -public abstract class AbstractSummariesProxy implements Proxy { - - protected AbstractSummaries summaries; + public SearchRequest(String[] ids) { + super(); + this.ids = ids; + } - public AbstractSummariesProxy(AbstractSummaries summaries) { + public SearchRequest(String[] itemTypes, Filter filter) { super(); - this.summaries = summaries; + this.item_types = itemTypes; + this.filter = filter; + } + + public String[] getItemTypes() { + return item_types; } - public int getTotalCount() { - return summaries.getTotalCount(); + public void setItemTypes(String[] itemTypes) { + this.item_types = itemTypes; } - public abstract List getRecords(); + public Filter getFilter() { + return filter; + } + + public void setFilter(Filter filter) { + this.filter = filter; + } } From e81ac96aabb8a46af6134d94e7d399eb539d747e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:50 +0100 Subject: [PATCH 0638/1620] New translations SearchRequest.java (Spanish) --- .../earth/app/view/Messages_es.properties | 35 +++++++++++++++---- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 21d609c128..34ef3a1eb1 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,15 +1,36 @@ package org.openforis.collect.earth.planet; -public class Response { +public class SearchRequest{ - public Feature[] features; - public Links _links; + String[] item_types; + Filter filter; + String[] ids; - public Feature[] getFeatures() { - return features; + public SearchRequest(String[] ids) { + super(); + this.ids = ids; } - public Links getLinks() { - return _links; + public SearchRequest(String[] itemTypes, Filter filter) { + super(); + this.item_types = itemTypes; + this.filter = filter; } + + public String[] getItemTypes() { + return item_types; + } + + public void setItemTypes(String[] itemTypes) { + this.item_types = itemTypes; + } + + public Filter getFilter() { + return filter; + } + + public void setFilter(Filter filter) { + this.filter = filter; + } + } From e0e524f05a16e9d1d1c881b9418bc1c12283b827 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:51 +0100 Subject: [PATCH 0639/1620] New translations SearchRequest.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 35 +++++++++++++++---- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 21d609c128..34ef3a1eb1 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,15 +1,36 @@ package org.openforis.collect.earth.planet; -public class Response { +public class SearchRequest{ - public Feature[] features; - public Links _links; + String[] item_types; + Filter filter; + String[] ids; - public Feature[] getFeatures() { - return features; + public SearchRequest(String[] ids) { + super(); + this.ids = ids; } - public Links getLinks() { - return _links; + public SearchRequest(String[] itemTypes, Filter filter) { + super(); + this.item_types = itemTypes; + this.filter = filter; } + + public String[] getItemTypes() { + return item_types; + } + + public void setItemTypes(String[] itemTypes) { + this.item_types = itemTypes; + } + + public Filter getFilter() { + return filter; + } + + public void setFilter(Filter filter) { + this.filter = filter; + } + } From ca84626f374937b5ab03dc19e5dd3c0b816ec91a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:52 +0100 Subject: [PATCH 0640/1620] New translations SearchRequest.java (English) --- .../earth/app/view/Messages_en.properties | 35 +++++++++++++++---- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 21d609c128..34ef3a1eb1 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,15 +1,36 @@ package org.openforis.collect.earth.planet; -public class Response { +public class SearchRequest{ - public Feature[] features; - public Links _links; + String[] item_types; + Filter filter; + String[] ids; - public Feature[] getFeatures() { - return features; + public SearchRequest(String[] ids) { + super(); + this.ids = ids; } - public Links getLinks() { - return _links; + public SearchRequest(String[] itemTypes, Filter filter) { + super(); + this.item_types = itemTypes; + this.filter = filter; } + + public String[] getItemTypes() { + return item_types; + } + + public void setItemTypes(String[] itemTypes) { + this.item_types = itemTypes; + } + + public Filter getFilter() { + return filter; + } + + public void setFilter(Filter filter) { + this.filter = filter; + } + } From 597847991034c8a9052e59023a962919333ce57a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:53 +0100 Subject: [PATCH 0641/1620] New translations Test.java (French) --- .../earth/app/view/Messages_fr.properties | 83 +++++++++++-------- 1 file changed, 50 insertions(+), 33 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 34ef3a1eb1..13502650b2 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,36 +1,53 @@ package org.openforis.collect.earth.planet; -public class SearchRequest{ - - String[] item_types; - Filter filter; - String[] ids; - - public SearchRequest(String[] ids) { - super(); - this.ids = ids; - } - - public SearchRequest(String[] itemTypes, Filter filter) { - super(); - this.item_types = itemTypes; - this.filter = filter; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class Test { + + + public static void main(String[] args) { + try { + PlanetImagery planet = new PlanetImagery( "YOUR API KEY FOR DAILY IMAGERY" ); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + Date start = formatter.parse("2013-01-01"); + Date end = formatter.parse("2013-12-01"); + String[] itemTypes = {"PSScene3Band", "PSScene4Band", "REOrthoTile"};/* + double[][][] coords = {{ + { + -1.8230438232421875, + 5.66433079911972 + }, + { + -1.8195247650146482, + 5.66433079911972 + }, + { + -1.8195247650146482, + 5.6671493748802915 + }, + { + -1.8230438232421875, + 5.6671493748802915 + }, + { + -1.8230438232421875, + 5.66433079911972 + } } + }; + */ + + double[][][] coords = {{{148.440013,-5.763688}, {148.440645,-5.763688}, {148.440645,-5.76432}, {148.440013,-5.76432}, {148.440013,-5.763688}}}; + //double[][][] coords = {{{-39.611883, -72.612975}, {-39.611883, -72.611833}, {-39.612765, -72.611833}, {-39.612765, -72.612975}, {-39.611883, -72.612975}}}; + System.out.println( + planet.getAvailableDates( new PlanetRequestParameters(start, end, coords, itemTypes) ) + ); + System.out.println( + planet.getLayerUrl( new PlanetRequestParameters(start, end, coords, itemTypes) ) + ); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } } - - public String[] getItemTypes() { - return item_types; - } - - public void setItemTypes(String[] itemTypes) { - this.item_types = itemTypes; - } - - public Filter getFilter() { - return filter; - } - - public void setFilter(Filter filter) { - this.filter = filter; - } - -} +} \ No newline at end of file From 9b7e16d5cbd491db6b15aa0676a8f858a9617fbc Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:54 +0100 Subject: [PATCH 0642/1620] New translations Test.java (Spanish) --- .../earth/app/view/Messages_es.properties | 83 +++++++++++-------- 1 file changed, 50 insertions(+), 33 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 34ef3a1eb1..13502650b2 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,36 +1,53 @@ package org.openforis.collect.earth.planet; -public class SearchRequest{ - - String[] item_types; - Filter filter; - String[] ids; - - public SearchRequest(String[] ids) { - super(); - this.ids = ids; - } - - public SearchRequest(String[] itemTypes, Filter filter) { - super(); - this.item_types = itemTypes; - this.filter = filter; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class Test { + + + public static void main(String[] args) { + try { + PlanetImagery planet = new PlanetImagery( "YOUR API KEY FOR DAILY IMAGERY" ); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + Date start = formatter.parse("2013-01-01"); + Date end = formatter.parse("2013-12-01"); + String[] itemTypes = {"PSScene3Band", "PSScene4Band", "REOrthoTile"};/* + double[][][] coords = {{ + { + -1.8230438232421875, + 5.66433079911972 + }, + { + -1.8195247650146482, + 5.66433079911972 + }, + { + -1.8195247650146482, + 5.6671493748802915 + }, + { + -1.8230438232421875, + 5.6671493748802915 + }, + { + -1.8230438232421875, + 5.66433079911972 + } } + }; + */ + + double[][][] coords = {{{148.440013,-5.763688}, {148.440645,-5.763688}, {148.440645,-5.76432}, {148.440013,-5.76432}, {148.440013,-5.763688}}}; + //double[][][] coords = {{{-39.611883, -72.612975}, {-39.611883, -72.611833}, {-39.612765, -72.611833}, {-39.612765, -72.612975}, {-39.611883, -72.612975}}}; + System.out.println( + planet.getAvailableDates( new PlanetRequestParameters(start, end, coords, itemTypes) ) + ); + System.out.println( + planet.getLayerUrl( new PlanetRequestParameters(start, end, coords, itemTypes) ) + ); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } } - - public String[] getItemTypes() { - return item_types; - } - - public void setItemTypes(String[] itemTypes) { - this.item_types = itemTypes; - } - - public Filter getFilter() { - return filter; - } - - public void setFilter(Filter filter) { - this.filter = filter; - } - -} +} \ No newline at end of file From 8e34201d64453c1191d053b619d7a1db3c06da35 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:55 +0100 Subject: [PATCH 0643/1620] New translations Test.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 83 +++++++++++-------- 1 file changed, 50 insertions(+), 33 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 34ef3a1eb1..13502650b2 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,36 +1,53 @@ package org.openforis.collect.earth.planet; -public class SearchRequest{ - - String[] item_types; - Filter filter; - String[] ids; - - public SearchRequest(String[] ids) { - super(); - this.ids = ids; - } - - public SearchRequest(String[] itemTypes, Filter filter) { - super(); - this.item_types = itemTypes; - this.filter = filter; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class Test { + + + public static void main(String[] args) { + try { + PlanetImagery planet = new PlanetImagery( "YOUR API KEY FOR DAILY IMAGERY" ); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + Date start = formatter.parse("2013-01-01"); + Date end = formatter.parse("2013-12-01"); + String[] itemTypes = {"PSScene3Band", "PSScene4Band", "REOrthoTile"};/* + double[][][] coords = {{ + { + -1.8230438232421875, + 5.66433079911972 + }, + { + -1.8195247650146482, + 5.66433079911972 + }, + { + -1.8195247650146482, + 5.6671493748802915 + }, + { + -1.8230438232421875, + 5.6671493748802915 + }, + { + -1.8230438232421875, + 5.66433079911972 + } } + }; + */ + + double[][][] coords = {{{148.440013,-5.763688}, {148.440645,-5.763688}, {148.440645,-5.76432}, {148.440013,-5.76432}, {148.440013,-5.763688}}}; + //double[][][] coords = {{{-39.611883, -72.612975}, {-39.611883, -72.611833}, {-39.612765, -72.611833}, {-39.612765, -72.612975}, {-39.611883, -72.612975}}}; + System.out.println( + planet.getAvailableDates( new PlanetRequestParameters(start, end, coords, itemTypes) ) + ); + System.out.println( + planet.getLayerUrl( new PlanetRequestParameters(start, end, coords, itemTypes) ) + ); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } } - - public String[] getItemTypes() { - return item_types; - } - - public void setItemTypes(String[] itemTypes) { - this.item_types = itemTypes; - } - - public Filter getFilter() { - return filter; - } - - public void setFilter(Filter filter) { - this.filter = filter; - } - -} +} \ No newline at end of file From ba301c4e504459de7a04784a21b998cfd12fc9f5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:56 +0100 Subject: [PATCH 0644/1620] New translations Test.java (English) --- .../earth/app/view/Messages_en.properties | 83 +++++++++++-------- 1 file changed, 50 insertions(+), 33 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 34ef3a1eb1..13502650b2 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,36 +1,53 @@ package org.openforis.collect.earth.planet; -public class SearchRequest{ - - String[] item_types; - Filter filter; - String[] ids; - - public SearchRequest(String[] ids) { - super(); - this.ids = ids; - } - - public SearchRequest(String[] itemTypes, Filter filter) { - super(); - this.item_types = itemTypes; - this.filter = filter; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class Test { + + + public static void main(String[] args) { + try { + PlanetImagery planet = new PlanetImagery( "YOUR API KEY FOR DAILY IMAGERY" ); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + Date start = formatter.parse("2013-01-01"); + Date end = formatter.parse("2013-12-01"); + String[] itemTypes = {"PSScene3Band", "PSScene4Band", "REOrthoTile"};/* + double[][][] coords = {{ + { + -1.8230438232421875, + 5.66433079911972 + }, + { + -1.8195247650146482, + 5.66433079911972 + }, + { + -1.8195247650146482, + 5.6671493748802915 + }, + { + -1.8230438232421875, + 5.6671493748802915 + }, + { + -1.8230438232421875, + 5.66433079911972 + } } + }; + */ + + double[][][] coords = {{{148.440013,-5.763688}, {148.440645,-5.763688}, {148.440645,-5.76432}, {148.440013,-5.76432}, {148.440013,-5.763688}}}; + //double[][][] coords = {{{-39.611883, -72.612975}, {-39.611883, -72.611833}, {-39.612765, -72.611833}, {-39.612765, -72.612975}, {-39.611883, -72.612975}}}; + System.out.println( + planet.getAvailableDates( new PlanetRequestParameters(start, end, coords, itemTypes) ) + ); + System.out.println( + planet.getLayerUrl( new PlanetRequestParameters(start, end, coords, itemTypes) ) + ); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } } - - public String[] getItemTypes() { - return item_types; - } - - public void setItemTypes(String[] itemTypes) { - this.item_types = itemTypes; - } - - public Filter getFilter() { - return filter; - } - - public void setFilter(Filter filter) { - this.filter = filter; - } - -} +} \ No newline at end of file From fedd9a01a34b1fee7db49e54e0874351ff6a863a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:57 +0100 Subject: [PATCH 0645/1620] New translations AbstractSummariesProxy.java (Spanish) --- .../earth/app/view/Messages_es.properties | 69 ++++++------------- 1 file changed, 22 insertions(+), 47 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 13502650b2..1bba5b2b7a 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,53 +1,28 @@ -package org.openforis.collect.earth.planet; +package org.openforis.collect.model.proxy; -import java.text.SimpleDateFormat; -import java.util.Date; +import java.util.List; -public class Test { +import org.openforis.collect.Proxy; +import org.openforis.collect.model.AbstractSummaries; +/** + * + * @author S. Ricci + * + */ +public abstract class AbstractSummariesProxy implements Proxy { + + protected AbstractSummaries summaries; - public static void main(String[] args) { - try { - PlanetImagery planet = new PlanetImagery( "YOUR API KEY FOR DAILY IMAGERY" ); - SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); - Date start = formatter.parse("2013-01-01"); - Date end = formatter.parse("2013-12-01"); - String[] itemTypes = {"PSScene3Band", "PSScene4Band", "REOrthoTile"};/* - double[][][] coords = {{ - { - -1.8230438232421875, - 5.66433079911972 - }, - { - -1.8195247650146482, - 5.66433079911972 - }, - { - -1.8195247650146482, - 5.6671493748802915 - }, - { - -1.8230438232421875, - 5.6671493748802915 - }, - { - -1.8230438232421875, - 5.66433079911972 - } } - }; - */ + public AbstractSummariesProxy(AbstractSummaries summaries) { + super(); + this.summaries = summaries; + } - double[][][] coords = {{{148.440013,-5.763688}, {148.440645,-5.763688}, {148.440645,-5.76432}, {148.440013,-5.76432}, {148.440013,-5.763688}}}; - //double[][][] coords = {{{-39.611883, -72.612975}, {-39.611883, -72.611833}, {-39.612765, -72.611833}, {-39.612765, -72.612975}, {-39.611883, -72.612975}}}; - System.out.println( - planet.getAvailableDates( new PlanetRequestParameters(start, end, coords, itemTypes) ) - ); - System.out.println( - planet.getLayerUrl( new PlanetRequestParameters(start, end, coords, itemTypes) ) - ); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + public int getTotalCount() { + return summaries.getTotalCount(); } -} \ No newline at end of file + + public abstract List getRecords(); + +} From 316742385d834e01b3f2dcbd333c2b8817787eea Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:58 +0100 Subject: [PATCH 0646/1620] New translations AttributeProxy.java (French) --- .../earth/app/view/Messages_fr.properties | 111 ++++++++++-------- 1 file changed, 60 insertions(+), 51 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 13502650b2..bc3c287e47 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,53 +1,62 @@ -package org.openforis.collect.earth.planet; - -import java.text.SimpleDateFormat; -import java.util.Date; - -public class Test { - - - public static void main(String[] args) { - try { - PlanetImagery planet = new PlanetImagery( "YOUR API KEY FOR DAILY IMAGERY" ); - SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); - Date start = formatter.parse("2013-01-01"); - Date end = formatter.parse("2013-12-01"); - String[] itemTypes = {"PSScene3Band", "PSScene4Band", "REOrthoTile"};/* - double[][][] coords = {{ - { - -1.8230438232421875, - 5.66433079911972 - }, - { - -1.8195247650146482, - 5.66433079911972 - }, - { - -1.8195247650146482, - 5.6671493748802915 - }, - { - -1.8230438232421875, - 5.6671493748802915 - }, - { - -1.8230438232421875, - 5.66433079911972 - } } - }; - */ - - double[][][] coords = {{{148.440013,-5.763688}, {148.440645,-5.763688}, {148.440645,-5.76432}, {148.440013,-5.76432}, {148.440013,-5.763688}}}; - //double[][][] coords = {{{-39.611883, -72.612975}, {-39.611883, -72.611833}, {-39.612765, -72.611833}, {-39.612765, -72.612975}, {-39.611883, -72.612975}}}; - System.out.println( - planet.getAvailableDates( new PlanetRequestParameters(start, end, coords, itemTypes) ) - ); - System.out.println( - planet.getLayerUrl( new PlanetRequestParameters(start, end, coords, itemTypes) ) - ); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); +/** + * + */ +package org.openforis.collect.model.proxy; + +import java.util.ArrayList; +import java.util.List; + +import org.openforis.collect.ProxyContext; +import org.openforis.collect.model.CollectRecord; +import org.openforis.idm.metamodel.validation.ValidationResults; +import org.openforis.idm.model.Attribute; +import org.openforis.idm.model.Field; + +/** + * @author M. Togna + * @author S. Ricci + * + * */ +public class AttributeProxy extends NodeProxy { + + private transient Attribute attribute; + private ValidationResultsProxy validationResults; + private boolean errorConfirmed; + + public AttributeProxy(EntityProxy parent, Attribute attribute, ProxyContext context) { + super(parent, attribute, context); + this.attribute = attribute; + ValidationResults validationRes = attribute.getValidationResults(); + if ( validationRes == null ) { + validationRes = new ValidationResults(); + } + this.validationResults = new ValidationResultsProxy(context, attribute, validationRes); + this.errorConfirmed = ((CollectRecord) attribute.getRecord()).isErrorConfirmed(attribute); + } + + public ValidationResultsProxy getValidationResults(){ + return validationResults; + } + + public void setValidationResults(ValidationResultsProxy value) { + this.validationResults = value; + } + + public List getFields() { + List> fields = attribute.getFields(); + List result = new ArrayList(fields.size()); + for (Field field : fields) { + result.add(new FieldProxy(field)); } + return result; } -} \ No newline at end of file + + public boolean isErrorConfirmed() { + return errorConfirmed; + } + + public void setErrorConfirmed(boolean value) { + this.errorConfirmed = value; + } + +} From 0719aba51785162098bdeefc7e00f4235882d250 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:32:59 +0100 Subject: [PATCH 0647/1620] New translations AbstractSummariesProxy.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 69 ++++++------------- 1 file changed, 22 insertions(+), 47 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 13502650b2..1bba5b2b7a 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,53 +1,28 @@ -package org.openforis.collect.earth.planet; +package org.openforis.collect.model.proxy; -import java.text.SimpleDateFormat; -import java.util.Date; +import java.util.List; -public class Test { +import org.openforis.collect.Proxy; +import org.openforis.collect.model.AbstractSummaries; +/** + * + * @author S. Ricci + * + */ +public abstract class AbstractSummariesProxy implements Proxy { + + protected AbstractSummaries summaries; - public static void main(String[] args) { - try { - PlanetImagery planet = new PlanetImagery( "YOUR API KEY FOR DAILY IMAGERY" ); - SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); - Date start = formatter.parse("2013-01-01"); - Date end = formatter.parse("2013-12-01"); - String[] itemTypes = {"PSScene3Band", "PSScene4Band", "REOrthoTile"};/* - double[][][] coords = {{ - { - -1.8230438232421875, - 5.66433079911972 - }, - { - -1.8195247650146482, - 5.66433079911972 - }, - { - -1.8195247650146482, - 5.6671493748802915 - }, - { - -1.8230438232421875, - 5.6671493748802915 - }, - { - -1.8230438232421875, - 5.66433079911972 - } } - }; - */ + public AbstractSummariesProxy(AbstractSummaries summaries) { + super(); + this.summaries = summaries; + } - double[][][] coords = {{{148.440013,-5.763688}, {148.440645,-5.763688}, {148.440645,-5.76432}, {148.440013,-5.76432}, {148.440013,-5.763688}}}; - //double[][][] coords = {{{-39.611883, -72.612975}, {-39.611883, -72.611833}, {-39.612765, -72.611833}, {-39.612765, -72.612975}, {-39.611883, -72.612975}}}; - System.out.println( - planet.getAvailableDates( new PlanetRequestParameters(start, end, coords, itemTypes) ) - ); - System.out.println( - planet.getLayerUrl( new PlanetRequestParameters(start, end, coords, itemTypes) ) - ); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + public int getTotalCount() { + return summaries.getTotalCount(); } -} \ No newline at end of file + + public abstract List getRecords(); + +} From ac6ef06859e9b56a9b50cd607d0c06e3a7645a75 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:00 +0100 Subject: [PATCH 0648/1620] New translations AbstractSummariesProxy.java (English) --- .../earth/app/view/Messages_en.properties | 69 ++++++------------- 1 file changed, 22 insertions(+), 47 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 13502650b2..1bba5b2b7a 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,53 +1,28 @@ -package org.openforis.collect.earth.planet; +package org.openforis.collect.model.proxy; -import java.text.SimpleDateFormat; -import java.util.Date; +import java.util.List; -public class Test { +import org.openforis.collect.Proxy; +import org.openforis.collect.model.AbstractSummaries; +/** + * + * @author S. Ricci + * + */ +public abstract class AbstractSummariesProxy implements Proxy { + + protected AbstractSummaries summaries; - public static void main(String[] args) { - try { - PlanetImagery planet = new PlanetImagery( "YOUR API KEY FOR DAILY IMAGERY" ); - SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); - Date start = formatter.parse("2013-01-01"); - Date end = formatter.parse("2013-12-01"); - String[] itemTypes = {"PSScene3Band", "PSScene4Band", "REOrthoTile"};/* - double[][][] coords = {{ - { - -1.8230438232421875, - 5.66433079911972 - }, - { - -1.8195247650146482, - 5.66433079911972 - }, - { - -1.8195247650146482, - 5.6671493748802915 - }, - { - -1.8230438232421875, - 5.6671493748802915 - }, - { - -1.8230438232421875, - 5.66433079911972 - } } - }; - */ + public AbstractSummariesProxy(AbstractSummaries summaries) { + super(); + this.summaries = summaries; + } - double[][][] coords = {{{148.440013,-5.763688}, {148.440645,-5.763688}, {148.440645,-5.76432}, {148.440013,-5.76432}, {148.440013,-5.763688}}}; - //double[][][] coords = {{{-39.611883, -72.612975}, {-39.611883, -72.611833}, {-39.612765, -72.611833}, {-39.612765, -72.612975}, {-39.611883, -72.612975}}}; - System.out.println( - planet.getAvailableDates( new PlanetRequestParameters(start, end, coords, itemTypes) ) - ); - System.out.println( - planet.getLayerUrl( new PlanetRequestParameters(start, end, coords, itemTypes) ) - ); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + public int getTotalCount() { + return summaries.getTotalCount(); } -} \ No newline at end of file + + public abstract List getRecords(); + +} From 34b5311b445116ccbd3ef6633aaeb1c29e9a5e50 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:01 +0100 Subject: [PATCH 0649/1620] New translations AttributeAddChangeProxy.java (French) --- .../earth/app/view/Messages_fr.properties | 62 ++++--------------- 1 file changed, 11 insertions(+), 51 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index bc3c287e47..77ee59553a 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,62 +1,22 @@ -/** - * - */ package org.openforis.collect.model.proxy; -import java.util.ArrayList; -import java.util.List; - import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.CollectRecord; -import org.openforis.idm.metamodel.validation.ValidationResults; -import org.openforis.idm.model.Attribute; -import org.openforis.idm.model.Field; +import org.openforis.collect.model.AttributeChange; /** - * @author M. Togna - * @author S. Ricci * - * */ -public class AttributeProxy extends NodeProxy { - - private transient Attribute attribute; - private ValidationResultsProxy validationResults; - private boolean errorConfirmed; - - public AttributeProxy(EntityProxy parent, Attribute attribute, ProxyContext context) { - super(parent, attribute, context); - this.attribute = attribute; - ValidationResults validationRes = attribute.getValidationResults(); - if ( validationRes == null ) { - validationRes = new ValidationResults(); - } - this.validationResults = new ValidationResultsProxy(context, attribute, validationRes); - this.errorConfirmed = ((CollectRecord) attribute.getRecord()).isErrorConfirmed(attribute); - } - - public ValidationResultsProxy getValidationResults(){ - return validationResults; - } + * @author S. Ricci + * + */ +public class AttributeAddChangeProxy extends AttributeChangeProxy implements NodeAddChangeProxy { - public void setValidationResults(ValidationResultsProxy value) { - this.validationResults = value; + public AttributeAddChangeProxy(AttributeChange change, ProxyContext context) { + super(change, context); } - public List getFields() { - List> fields = attribute.getFields(); - List result = new ArrayList(fields.size()); - for (Field field : fields) { - result.add(new FieldProxy(field)); - } - return result; - } - - public boolean isErrorConfirmed() { - return errorConfirmed; - } - - public void setErrorConfirmed(boolean value) { - this.errorConfirmed = value; + @Override + public NodeProxy getCreatedNode() { + return NodeProxy.fromNode(change.getNode(), context); } -} +} \ No newline at end of file From aac3e62f0d963679ddfa9a1310cea6227ee9b401 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:02 +0100 Subject: [PATCH 0650/1620] New translations AttributeAddChangeProxy.java (Spanish) --- .../earth/app/view/Messages_es.properties | 24 +++++++------------ 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 1bba5b2b7a..77ee59553a 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,28 +1,22 @@ package org.openforis.collect.model.proxy; -import java.util.List; - -import org.openforis.collect.Proxy; -import org.openforis.collect.model.AbstractSummaries; +import org.openforis.collect.ProxyContext; +import org.openforis.collect.model.AttributeChange; /** * * @author S. Ricci * */ -public abstract class AbstractSummariesProxy implements Proxy { - - protected AbstractSummaries summaries; +public class AttributeAddChangeProxy extends AttributeChangeProxy implements NodeAddChangeProxy { - public AbstractSummariesProxy(AbstractSummaries summaries) { - super(); - this.summaries = summaries; + public AttributeAddChangeProxy(AttributeChange change, ProxyContext context) { + super(change, context); } - public int getTotalCount() { - return summaries.getTotalCount(); + @Override + public NodeProxy getCreatedNode() { + return NodeProxy.fromNode(change.getNode(), context); } - public abstract List getRecords(); - -} +} \ No newline at end of file From 36e6e424687df2e63da2bedb6493ae41f3e01e47 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:03 +0100 Subject: [PATCH 0651/1620] New translations AttributeAddChangeProxy.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 24 +++++++------------ 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 1bba5b2b7a..77ee59553a 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,28 +1,22 @@ package org.openforis.collect.model.proxy; -import java.util.List; - -import org.openforis.collect.Proxy; -import org.openforis.collect.model.AbstractSummaries; +import org.openforis.collect.ProxyContext; +import org.openforis.collect.model.AttributeChange; /** * * @author S. Ricci * */ -public abstract class AbstractSummariesProxy implements Proxy { - - protected AbstractSummaries summaries; +public class AttributeAddChangeProxy extends AttributeChangeProxy implements NodeAddChangeProxy { - public AbstractSummariesProxy(AbstractSummaries summaries) { - super(); - this.summaries = summaries; + public AttributeAddChangeProxy(AttributeChange change, ProxyContext context) { + super(change, context); } - public int getTotalCount() { - return summaries.getTotalCount(); + @Override + public NodeProxy getCreatedNode() { + return NodeProxy.fromNode(change.getNode(), context); } - public abstract List getRecords(); - -} +} \ No newline at end of file From 428943c589c332bbe378809cf7d3817df12cd2b9 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:04 +0100 Subject: [PATCH 0652/1620] New translations AttributeAddChangeProxy.java (English) --- .../earth/app/view/Messages_en.properties | 24 +++++++------------ 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 1bba5b2b7a..77ee59553a 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,28 +1,22 @@ package org.openforis.collect.model.proxy; -import java.util.List; - -import org.openforis.collect.Proxy; -import org.openforis.collect.model.AbstractSummaries; +import org.openforis.collect.ProxyContext; +import org.openforis.collect.model.AttributeChange; /** * * @author S. Ricci * */ -public abstract class AbstractSummariesProxy implements Proxy { - - protected AbstractSummaries summaries; +public class AttributeAddChangeProxy extends AttributeChangeProxy implements NodeAddChangeProxy { - public AbstractSummariesProxy(AbstractSummaries summaries) { - super(); - this.summaries = summaries; + public AttributeAddChangeProxy(AttributeChange change, ProxyContext context) { + super(change, context); } - public int getTotalCount() { - return summaries.getTotalCount(); + @Override + public NodeProxy getCreatedNode() { + return NodeProxy.fromNode(change.getNode(), context); } - public abstract List getRecords(); - -} +} \ No newline at end of file From 67db8a83d376591c49550c3c3d4b6a82aabc3d0a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:05 +0100 Subject: [PATCH 0653/1620] New translations AttributeChangeProxy.java (French) --- .../earth/app/view/Messages_fr.properties | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 77ee59553a..d87e45fe27 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,22 +1,32 @@ package org.openforis.collect.model.proxy; +import java.util.Map; + import org.openforis.collect.ProxyContext; import org.openforis.collect.model.AttributeChange; +import org.openforis.idm.model.Attribute; /** * * @author S. Ricci * */ -public class AttributeAddChangeProxy extends AttributeChangeProxy implements NodeAddChangeProxy { +public class AttributeChangeProxy extends NodeChangeProxy { - public AttributeAddChangeProxy(AttributeChange change, ProxyContext context) { + public AttributeChangeProxy(AttributeChange change, ProxyContext context) { super(change, context); } - @Override - public NodeProxy getCreatedNode() { - return NodeProxy.fromNode(change.getNode(), context); + public ValidationResultsProxy getValidationResults() { + if ( change.getValidationResults() == null ) { + return null; + } else { + return new ValidationResultsProxy(context, (Attribute) change.getNode(), change.getValidationResults()); + } } + public Map getUpdatedFieldValues() { + return change.getUpdatedFieldValues(); + } + } \ No newline at end of file From f9f959836b2d6ce6fb30d65eb8ebd07e5c16c898 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:07 +0100 Subject: [PATCH 0654/1620] New translations AttributeChangeProxy.java (Spanish) --- .../earth/app/view/Messages_es.properties | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 77ee59553a..d87e45fe27 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,22 +1,32 @@ package org.openforis.collect.model.proxy; +import java.util.Map; + import org.openforis.collect.ProxyContext; import org.openforis.collect.model.AttributeChange; +import org.openforis.idm.model.Attribute; /** * * @author S. Ricci * */ -public class AttributeAddChangeProxy extends AttributeChangeProxy implements NodeAddChangeProxy { +public class AttributeChangeProxy extends NodeChangeProxy { - public AttributeAddChangeProxy(AttributeChange change, ProxyContext context) { + public AttributeChangeProxy(AttributeChange change, ProxyContext context) { super(change, context); } - @Override - public NodeProxy getCreatedNode() { - return NodeProxy.fromNode(change.getNode(), context); + public ValidationResultsProxy getValidationResults() { + if ( change.getValidationResults() == null ) { + return null; + } else { + return new ValidationResultsProxy(context, (Attribute) change.getNode(), change.getValidationResults()); + } } + public Map getUpdatedFieldValues() { + return change.getUpdatedFieldValues(); + } + } \ No newline at end of file From eb8830d0cf1f87e04550d38f583d547d34ed3359 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:10 +0100 Subject: [PATCH 0655/1620] New translations AttributeChangeProxy.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 77ee59553a..d87e45fe27 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,22 +1,32 @@ package org.openforis.collect.model.proxy; +import java.util.Map; + import org.openforis.collect.ProxyContext; import org.openforis.collect.model.AttributeChange; +import org.openforis.idm.model.Attribute; /** * * @author S. Ricci * */ -public class AttributeAddChangeProxy extends AttributeChangeProxy implements NodeAddChangeProxy { +public class AttributeChangeProxy extends NodeChangeProxy { - public AttributeAddChangeProxy(AttributeChange change, ProxyContext context) { + public AttributeChangeProxy(AttributeChange change, ProxyContext context) { super(change, context); } - @Override - public NodeProxy getCreatedNode() { - return NodeProxy.fromNode(change.getNode(), context); + public ValidationResultsProxy getValidationResults() { + if ( change.getValidationResults() == null ) { + return null; + } else { + return new ValidationResultsProxy(context, (Attribute) change.getNode(), change.getValidationResults()); + } } + public Map getUpdatedFieldValues() { + return change.getUpdatedFieldValues(); + } + } \ No newline at end of file From b9b91fadcbe1b8846887a39ce241948fa345b446 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:11 +0100 Subject: [PATCH 0656/1620] New translations AttributeChangeProxy.java (English) --- .../earth/app/view/Messages_en.properties | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 77ee59553a..d87e45fe27 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,22 +1,32 @@ package org.openforis.collect.model.proxy; +import java.util.Map; + import org.openforis.collect.ProxyContext; import org.openforis.collect.model.AttributeChange; +import org.openforis.idm.model.Attribute; /** * * @author S. Ricci * */ -public class AttributeAddChangeProxy extends AttributeChangeProxy implements NodeAddChangeProxy { +public class AttributeChangeProxy extends NodeChangeProxy { - public AttributeAddChangeProxy(AttributeChange change, ProxyContext context) { + public AttributeChangeProxy(AttributeChange change, ProxyContext context) { super(change, context); } - @Override - public NodeProxy getCreatedNode() { - return NodeProxy.fromNode(change.getNode(), context); + public ValidationResultsProxy getValidationResults() { + if ( change.getValidationResults() == null ) { + return null; + } else { + return new ValidationResultsProxy(context, (Attribute) change.getNode(), change.getValidationResults()); + } } + public Map getUpdatedFieldValues() { + return change.getUpdatedFieldValues(); + } + } \ No newline at end of file From 9bbefb66d16f241fe8d9176dbe01248f67c2c355 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:12 +0100 Subject: [PATCH 0657/1620] New translations NodeAddChangeProxy.java (Spanish) --- .../earth/app/view/Messages_es.properties | 24 +++---------------- 1 file changed, 3 insertions(+), 21 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index d87e45fe27..2cea96468e 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,32 +1,14 @@ package org.openforis.collect.model.proxy; -import java.util.Map; -import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.AttributeChange; -import org.openforis.idm.model.Attribute; /** * * @author S. Ricci * */ -public class AttributeChangeProxy extends NodeChangeProxy { - - public AttributeChangeProxy(AttributeChange change, ProxyContext context) { - super(change, context); - } - - public ValidationResultsProxy getValidationResults() { - if ( change.getValidationResults() == null ) { - return null; - } else { - return new ValidationResultsProxy(context, (Attribute) change.getNode(), change.getValidationResults()); - } - } - - public Map getUpdatedFieldValues() { - return change.getUpdatedFieldValues(); - } +public interface NodeAddChangeProxy { + + NodeProxy getCreatedNode(); } \ No newline at end of file From c8b572c1fe6b00bc9ef82016963d2e33e64c4e83 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:13 +0100 Subject: [PATCH 0658/1620] New translations NodeAddChangeProxy.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 24 +++---------------- 1 file changed, 3 insertions(+), 21 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index d87e45fe27..2cea96468e 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,32 +1,14 @@ package org.openforis.collect.model.proxy; -import java.util.Map; -import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.AttributeChange; -import org.openforis.idm.model.Attribute; /** * * @author S. Ricci * */ -public class AttributeChangeProxy extends NodeChangeProxy { - - public AttributeChangeProxy(AttributeChange change, ProxyContext context) { - super(change, context); - } - - public ValidationResultsProxy getValidationResults() { - if ( change.getValidationResults() == null ) { - return null; - } else { - return new ValidationResultsProxy(context, (Attribute) change.getNode(), change.getValidationResults()); - } - } - - public Map getUpdatedFieldValues() { - return change.getUpdatedFieldValues(); - } +public interface NodeAddChangeProxy { + + NodeProxy getCreatedNode(); } \ No newline at end of file From f436fc536d9705b59744652dc3fbe92bf92c6a99 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:14 +0100 Subject: [PATCH 0659/1620] New translations ValidationResultsProxy.java (English) --- .../earth/app/view/Messages_en.properties | 60 ++++++++++++++----- 1 file changed, 44 insertions(+), 16 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index d87e45fe27..05119fdd7e 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,32 +1,60 @@ +/** + * + */ package org.openforis.collect.model.proxy; -import java.util.Map; +import java.util.ArrayList; +import java.util.List; +import org.openforis.collect.Proxy; import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.AttributeChange; +import org.openforis.collect.model.validation.SpecifiedValidator; +import org.openforis.collect.model.validation.ValidationMessageBuilder; +import org.openforis.idm.metamodel.validation.ValidationResult; +import org.openforis.idm.metamodel.validation.ValidationResults; import org.openforis.idm.model.Attribute; /** - * + * @author M. Togna * @author S. Ricci - * + * */ -public class AttributeChangeProxy extends NodeChangeProxy { +public class ValidationResultsProxy implements Proxy { + + private Attribute attribute; + private ValidationResults validationResults; + private ProxyContext context; - public AttributeChangeProxy(AttributeChange change, ProxyContext context) { - super(change, context); + public ValidationResultsProxy(ProxyContext context, Attribute attribute, ValidationResults validationResults) { + this.attribute = attribute; + this.validationResults = validationResults; + this.context = context; } - public ValidationResultsProxy getValidationResults() { - if ( change.getValidationResults() == null ) { - return null; - } else { - return new ValidationResultsProxy(context, (Attribute) change.getNode(), change.getValidationResults()); - } + public List getErrors() { + return extractValidationResultMessages(validationResults.getErrors()); + } + + public List getWarnings() { + return extractValidationResultMessages(validationResults.getWarnings()); } - public Map getUpdatedFieldValues() { - return change.getUpdatedFieldValues(); + public boolean isSpecifiedErrorPresent() { + List errors = validationResults.getErrors(); + for (ValidationResult validationResult : errors) { + if(validationResult.getValidator() instanceof SpecifiedValidator) { + return true; + } + } + return false; } -} \ No newline at end of file + private List extractValidationResultMessages(List validationResultList) { + List result = new ArrayList<>(); + ValidationMessageBuilder validationMessageBuilder = ValidationMessageBuilder.createInstance(context.getMessageSource()); + for (ValidationResult validationResult : validationResultList) { + result.add(validationMessageBuilder.getValidationMessage(attribute, validationResult, context.getLocale())); + } + return result; + } +} From d9f6cbc9a70c18276ff0f356aae59b464723f250 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:15 +0100 Subject: [PATCH 0660/1620] New translations TaxonomyProxy.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 72 ++++++++++++++++++- 1 file changed, 69 insertions(+), 3 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 2cea96468e..1f0698c58a 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,14 +1,80 @@ package org.openforis.collect.model.proxy; +import java.util.ArrayList; +import java.util.List; +import org.openforis.collect.Proxy; +import org.openforis.collect.model.CollectTaxonomy; /** * * @author S. Ricci * */ -public interface NodeAddChangeProxy { +public class TaxonomyProxy implements Proxy { + + private Integer id; + private String name; + private String uri; + private Integer surveyId; + + public TaxonomyProxy() { + } + + public TaxonomyProxy(CollectTaxonomy taxonomy) { + super(); + id = taxonomy.getId(); + name = taxonomy.getName(); + uri = taxonomy.getUri(); + surveyId = taxonomy.getSurveyId(); + } - NodeProxy getCreatedNode(); + public static List fromList(List list) { + List proxies = new ArrayList<>(); + if (list != null) { + for (CollectTaxonomy item : list) { + proxies.add(new TaxonomyProxy(item)); + } + } + return proxies; + } -} \ No newline at end of file + public void copyPropertiesForUpdate(CollectTaxonomy taxonomy) { + taxonomy.setName(name); + taxonomy.setUri(uri); + taxonomy.setSurveyId(surveyId); + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getUri() { + return uri; + } + + public void setUri(String uri) { + this.uri = uri; + } + + public Integer getSurveyId() { + return surveyId; + } + + public void setSurveyId(Integer surveyId) { + this.surveyId = surveyId; + } + +} From d014ed97c0059e7bc3536de85982fea1080c8edc Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:16 +0100 Subject: [PATCH 0661/1620] New translations TaxonomyProxy.java (English) --- .../earth/app/view/Messages_en.properties | 98 +++++++++++-------- 1 file changed, 59 insertions(+), 39 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 05119fdd7e..1f0698c58a 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,60 +1,80 @@ -/** - * - */ package org.openforis.collect.model.proxy; import java.util.ArrayList; import java.util.List; import org.openforis.collect.Proxy; -import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.validation.SpecifiedValidator; -import org.openforis.collect.model.validation.ValidationMessageBuilder; -import org.openforis.idm.metamodel.validation.ValidationResult; -import org.openforis.idm.metamodel.validation.ValidationResults; -import org.openforis.idm.model.Attribute; +import org.openforis.collect.model.CollectTaxonomy; /** - * @author M. Togna - * @author S. Ricci * + * @author S. Ricci + * */ -public class ValidationResultsProxy implements Proxy { +public class TaxonomyProxy implements Proxy { - private Attribute attribute; - private ValidationResults validationResults; - private ProxyContext context; + private Integer id; + private String name; + private String uri; + private Integer surveyId; + + public TaxonomyProxy() { + } + + public TaxonomyProxy(CollectTaxonomy taxonomy) { + super(); + id = taxonomy.getId(); + name = taxonomy.getName(); + uri = taxonomy.getUri(); + surveyId = taxonomy.getSurveyId(); + } + + public static List fromList(List list) { + List proxies = new ArrayList<>(); + if (list != null) { + for (CollectTaxonomy item : list) { + proxies.add(new TaxonomyProxy(item)); + } + } + return proxies; + } + + public void copyPropertiesForUpdate(CollectTaxonomy taxonomy) { + taxonomy.setName(name); + taxonomy.setUri(uri); + taxonomy.setSurveyId(surveyId); + } - public ValidationResultsProxy(ProxyContext context, Attribute attribute, ValidationResults validationResults) { - this.attribute = attribute; - this.validationResults = validationResults; - this.context = context; + public Integer getId() { + return id; } - public List getErrors() { - return extractValidationResultMessages(validationResults.getErrors()); + public void setId(Integer id) { + this.id = id; } - public List getWarnings() { - return extractValidationResultMessages(validationResults.getWarnings()); + public String getName() { + return name; } - public boolean isSpecifiedErrorPresent() { - List errors = validationResults.getErrors(); - for (ValidationResult validationResult : errors) { - if(validationResult.getValidator() instanceof SpecifiedValidator) { - return true; - } - } - return false; + public void setName(String name) { + this.name = name; } - - private List extractValidationResultMessages(List validationResultList) { - List result = new ArrayList<>(); - ValidationMessageBuilder validationMessageBuilder = ValidationMessageBuilder.createInstance(context.getMessageSource()); - for (ValidationResult validationResult : validationResultList) { - result.add(validationMessageBuilder.getValidationMessage(attribute, validationResult, context.getLocale())); - } - return result; + + public String getUri() { + return uri; } + + public void setUri(String uri) { + this.uri = uri; + } + + public Integer getSurveyId() { + return surveyId; + } + + public void setSurveyId(Integer surveyId) { + this.surveyId = surveyId; + } + } From 4a0ca23a77c9e6dacdd51ea38a3ead40e94e8660 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:17 +0100 Subject: [PATCH 0662/1620] New translations UserProxy.java (French) --- .../earth/app/view/Messages_fr.properties | 103 +++++++++++++++--- 1 file changed, 88 insertions(+), 15 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index d87e45fe27..e7425cc791 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,32 +1,105 @@ +/** + * + */ package org.openforis.collect.model.proxy; -import java.util.Map; +import java.util.ArrayList; +import java.util.List; -import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.AttributeChange; -import org.openforis.idm.model.Attribute; +import org.openforis.collect.Proxy; +import org.openforis.collect.model.User; +import org.openforis.collect.model.UserRole; /** * * @author S. Ricci * */ -public class AttributeChangeProxy extends NodeChangeProxy { +public class UserProxy implements Proxy { + + private Boolean enabled; + private Integer id; + private String name; + private String password; + private List roles; - public AttributeChangeProxy(AttributeChange change, ProxyContext context) { - super(change, context); + public UserProxy(User user) { + super(); + this.enabled = user.getEnabled(); + this.id = user.getId(); + this.name = user.getUsername(); + this.roles = user.getRoleCodes(); + //password is not initialized, so the client will not know its value } - public ValidationResultsProxy getValidationResults() { - if ( change.getValidationResults() == null ) { - return null; - } else { - return new ValidationResultsProxy(context, (Attribute) change.getNode(), change.getValidationResults()); + public static List fromList(List users) { + List result = new ArrayList<>(); + if ( users != null ) { + for (User user : users) { + UserProxy proxy = new UserProxy(user); + result.add(proxy); + } + } + return result; + } + + public User toUser() { + User user = new User(); + user.setEnabled(enabled); + user.setId(id); + user.setUsername(name); + user.setPassword(password); + user.setRoles(getRolesFromCodes(roles)); + return user; + } + + private List getRolesFromCodes(List codes) { + List roles = new ArrayList<>(); + for (String code : codes) { + UserRole role = UserRole.fromCode(code); + roles.add(role); } + return roles; + } + + public Boolean getEnabled() { + return enabled; } - public Map getUpdatedFieldValues() { - return change.getUpdatedFieldValues(); + public void setEnabled(Boolean enabled) { + this.enabled = enabled; } -} \ No newline at end of file + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getRoles() { + return roles; + } + + public void setRoles(List roles) { + this.roles = roles; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + +} From d6dc6fc19d1e42a2fd749f7af7a7068fa0a95e47 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:18 +0100 Subject: [PATCH 0663/1620] New translations UserProxy.java (Spanish) --- .../earth/app/view/Messages_es.properties | 97 ++++++++++++++++++- 1 file changed, 94 insertions(+), 3 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 2cea96468e..e7425cc791 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,14 +1,105 @@ +/** + * + */ package org.openforis.collect.model.proxy; +import java.util.ArrayList; +import java.util.List; +import org.openforis.collect.Proxy; +import org.openforis.collect.model.User; +import org.openforis.collect.model.UserRole; /** * * @author S. Ricci * */ -public interface NodeAddChangeProxy { +public class UserProxy implements Proxy { + + private Boolean enabled; + private Integer id; + private String name; + private String password; + private List roles; + + public UserProxy(User user) { + super(); + this.enabled = user.getEnabled(); + this.id = user.getId(); + this.name = user.getUsername(); + this.roles = user.getRoleCodes(); + //password is not initialized, so the client will not know its value + } + + public static List fromList(List users) { + List result = new ArrayList<>(); + if ( users != null ) { + for (User user : users) { + UserProxy proxy = new UserProxy(user); + result.add(proxy); + } + } + return result; + } + + public User toUser() { + User user = new User(); + user.setEnabled(enabled); + user.setId(id); + user.setUsername(name); + user.setPassword(password); + user.setRoles(getRolesFromCodes(roles)); + return user; + } - NodeProxy getCreatedNode(); + private List getRolesFromCodes(List codes) { + List roles = new ArrayList<>(); + for (String code : codes) { + UserRole role = UserRole.fromCode(code); + roles.add(role); + } + return roles; + } + + public Boolean getEnabled() { + return enabled; + } + + public void setEnabled(Boolean enabled) { + this.enabled = enabled; + } -} \ No newline at end of file + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getRoles() { + return roles; + } + + public void setRoles(List roles) { + this.roles = roles; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + +} From 8e83df6a09f54508ce41976e0537976c76ba07f5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:19 +0100 Subject: [PATCH 0664/1620] New translations UserProxy.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 91 ++++++++++++------- 1 file changed, 58 insertions(+), 33 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 1f0698c58a..e7425cc791 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,50 +1,75 @@ +/** + * + */ package org.openforis.collect.model.proxy; import java.util.ArrayList; import java.util.List; import org.openforis.collect.Proxy; -import org.openforis.collect.model.CollectTaxonomy; +import org.openforis.collect.model.User; +import org.openforis.collect.model.UserRole; /** * * @author S. Ricci * */ -public class TaxonomyProxy implements Proxy { +public class UserProxy implements Proxy { + private Boolean enabled; private Integer id; private String name; - private String uri; - private Integer surveyId; - - public TaxonomyProxy() { - } - - public TaxonomyProxy(CollectTaxonomy taxonomy) { + private String password; + private List roles; + + public UserProxy(User user) { super(); - id = taxonomy.getId(); - name = taxonomy.getName(); - uri = taxonomy.getUri(); - surveyId = taxonomy.getSurveyId(); + this.enabled = user.getEnabled(); + this.id = user.getId(); + this.name = user.getUsername(); + this.roles = user.getRoleCodes(); + //password is not initialized, so the client will not know its value } - - public static List fromList(List list) { - List proxies = new ArrayList<>(); - if (list != null) { - for (CollectTaxonomy item : list) { - proxies.add(new TaxonomyProxy(item)); + + public static List fromList(List users) { + List result = new ArrayList<>(); + if ( users != null ) { + for (User user : users) { + UserProxy proxy = new UserProxy(user); + result.add(proxy); } } - return proxies; + return result; } - public void copyPropertiesForUpdate(CollectTaxonomy taxonomy) { - taxonomy.setName(name); - taxonomy.setUri(uri); - taxonomy.setSurveyId(surveyId); + public User toUser() { + User user = new User(); + user.setEnabled(enabled); + user.setId(id); + user.setUsername(name); + user.setPassword(password); + user.setRoles(getRolesFromCodes(roles)); + return user; + } + + private List getRolesFromCodes(List codes) { + List roles = new ArrayList<>(); + for (String code : codes) { + UserRole role = UserRole.fromCode(code); + roles.add(role); + } + return roles; + } + + public Boolean getEnabled() { + return enabled; } + public void setEnabled(Boolean enabled) { + this.enabled = enabled; + } + public Integer getId() { return id; } @@ -52,7 +77,7 @@ public class TaxonomyProxy implements Proxy { public void setId(Integer id) { this.id = id; } - + public String getName() { return name; } @@ -61,20 +86,20 @@ public class TaxonomyProxy implements Proxy { this.name = name; } - public String getUri() { - return uri; + public List getRoles() { + return roles; } - public void setUri(String uri) { - this.uri = uri; + public void setRoles(List roles) { + this.roles = roles; } - public Integer getSurveyId() { - return surveyId; + public String getPassword() { + return password; } - public void setSurveyId(Integer surveyId) { - this.surveyId = surveyId; + public void setPassword(String password) { + this.password = password; } } From 7ea1444fff02a8d502277a44ea4bc533a9d3d8bc Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:20 +0100 Subject: [PATCH 0665/1620] New translations UserProxy.java (English) --- .../earth/app/view/Messages_en.properties | 91 ++++++++++++------- 1 file changed, 58 insertions(+), 33 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 1f0698c58a..e7425cc791 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,50 +1,75 @@ +/** + * + */ package org.openforis.collect.model.proxy; import java.util.ArrayList; import java.util.List; import org.openforis.collect.Proxy; -import org.openforis.collect.model.CollectTaxonomy; +import org.openforis.collect.model.User; +import org.openforis.collect.model.UserRole; /** * * @author S. Ricci * */ -public class TaxonomyProxy implements Proxy { +public class UserProxy implements Proxy { + private Boolean enabled; private Integer id; private String name; - private String uri; - private Integer surveyId; - - public TaxonomyProxy() { - } - - public TaxonomyProxy(CollectTaxonomy taxonomy) { + private String password; + private List roles; + + public UserProxy(User user) { super(); - id = taxonomy.getId(); - name = taxonomy.getName(); - uri = taxonomy.getUri(); - surveyId = taxonomy.getSurveyId(); + this.enabled = user.getEnabled(); + this.id = user.getId(); + this.name = user.getUsername(); + this.roles = user.getRoleCodes(); + //password is not initialized, so the client will not know its value } - - public static List fromList(List list) { - List proxies = new ArrayList<>(); - if (list != null) { - for (CollectTaxonomy item : list) { - proxies.add(new TaxonomyProxy(item)); + + public static List fromList(List users) { + List result = new ArrayList<>(); + if ( users != null ) { + for (User user : users) { + UserProxy proxy = new UserProxy(user); + result.add(proxy); } } - return proxies; + return result; } - public void copyPropertiesForUpdate(CollectTaxonomy taxonomy) { - taxonomy.setName(name); - taxonomy.setUri(uri); - taxonomy.setSurveyId(surveyId); + public User toUser() { + User user = new User(); + user.setEnabled(enabled); + user.setId(id); + user.setUsername(name); + user.setPassword(password); + user.setRoles(getRolesFromCodes(roles)); + return user; + } + + private List getRolesFromCodes(List codes) { + List roles = new ArrayList<>(); + for (String code : codes) { + UserRole role = UserRole.fromCode(code); + roles.add(role); + } + return roles; + } + + public Boolean getEnabled() { + return enabled; } + public void setEnabled(Boolean enabled) { + this.enabled = enabled; + } + public Integer getId() { return id; } @@ -52,7 +77,7 @@ public class TaxonomyProxy implements Proxy { public void setId(Integer id) { this.id = id; } - + public String getName() { return name; } @@ -61,20 +86,20 @@ public class TaxonomyProxy implements Proxy { this.name = name; } - public String getUri() { - return uri; + public List getRoles() { + return roles; } - public void setUri(String uri) { - this.uri = uri; + public void setRoles(List roles) { + this.roles = roles; } - public Integer getSurveyId() { - return surveyId; + public String getPassword() { + return password; } - public void setSurveyId(Integer surveyId) { - this.surveyId = surveyId; + public void setPassword(String password) { + this.password = password; } } From 10e32a2e4b299a19184a36e60e4b81dc62504da7 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:21 +0100 Subject: [PATCH 0666/1620] New translations ValidationResultsProxy.java (French) --- .../earth/app/view/Messages_fr.properties | 115 ++++++------------ 1 file changed, 35 insertions(+), 80 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index e7425cc791..05119fdd7e 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -7,99 +7,54 @@ import java.util.ArrayList; import java.util.List; import org.openforis.collect.Proxy; -import org.openforis.collect.model.User; -import org.openforis.collect.model.UserRole; +import org.openforis.collect.ProxyContext; +import org.openforis.collect.model.validation.SpecifiedValidator; +import org.openforis.collect.model.validation.ValidationMessageBuilder; +import org.openforis.idm.metamodel.validation.ValidationResult; +import org.openforis.idm.metamodel.validation.ValidationResults; +import org.openforis.idm.model.Attribute; /** - * + * @author M. Togna * @author S. Ricci - * + * */ -public class UserProxy implements Proxy { +public class ValidationResultsProxy implements Proxy { - private Boolean enabled; - private Integer id; - private String name; - private String password; - private List roles; + private Attribute attribute; + private ValidationResults validationResults; + private ProxyContext context; - public UserProxy(User user) { - super(); - this.enabled = user.getEnabled(); - this.id = user.getId(); - this.name = user.getUsername(); - this.roles = user.getRoleCodes(); - //password is not initialized, so the client will not know its value + public ValidationResultsProxy(ProxyContext context, Attribute attribute, ValidationResults validationResults) { + this.attribute = attribute; + this.validationResults = validationResults; + this.context = context; } - public static List fromList(List users) { - List result = new ArrayList<>(); - if ( users != null ) { - for (User user : users) { - UserProxy proxy = new UserProxy(user); - result.add(proxy); - } - } - return result; - } - - public User toUser() { - User user = new User(); - user.setEnabled(enabled); - user.setId(id); - user.setUsername(name); - user.setPassword(password); - user.setRoles(getRolesFromCodes(roles)); - return user; - } - - private List getRolesFromCodes(List codes) { - List roles = new ArrayList<>(); - for (String code : codes) { - UserRole role = UserRole.fromCode(code); - roles.add(role); - } - return roles; + public List getErrors() { + return extractValidationResultMessages(validationResults.getErrors()); } - public Boolean getEnabled() { - return enabled; + public List getWarnings() { + return extractValidationResultMessages(validationResults.getWarnings()); } - public void setEnabled(Boolean enabled) { - this.enabled = enabled; - } - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; + public boolean isSpecifiedErrorPresent() { + List errors = validationResults.getErrors(); + for (ValidationResult validationResult : errors) { + if(validationResult.getValidator() instanceof SpecifiedValidator) { + return true; + } + } + return false; } - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public List getRoles() { - return roles; - } - - public void setRoles(List roles) { - this.roles = roles; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; + private List extractValidationResultMessages(List validationResultList) { + List result = new ArrayList<>(); + ValidationMessageBuilder validationMessageBuilder = ValidationMessageBuilder.createInstance(context.getMessageSource()); + for (ValidationResult validationResult : validationResultList) { + result.add(validationMessageBuilder.getValidationMessage(attribute, validationResult, context.getLocale())); + } + return result; } - } From 6d61963df99e379b958b7c1cca88d5f93d527beb Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:22 +0100 Subject: [PATCH 0667/1620] New translations ValidationResultsProxy.java (Spanish) --- .../earth/app/view/Messages_es.properties | 115 ++++++------------ 1 file changed, 35 insertions(+), 80 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index e7425cc791..05119fdd7e 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -7,99 +7,54 @@ import java.util.ArrayList; import java.util.List; import org.openforis.collect.Proxy; -import org.openforis.collect.model.User; -import org.openforis.collect.model.UserRole; +import org.openforis.collect.ProxyContext; +import org.openforis.collect.model.validation.SpecifiedValidator; +import org.openforis.collect.model.validation.ValidationMessageBuilder; +import org.openforis.idm.metamodel.validation.ValidationResult; +import org.openforis.idm.metamodel.validation.ValidationResults; +import org.openforis.idm.model.Attribute; /** - * + * @author M. Togna * @author S. Ricci - * + * */ -public class UserProxy implements Proxy { +public class ValidationResultsProxy implements Proxy { - private Boolean enabled; - private Integer id; - private String name; - private String password; - private List roles; + private Attribute attribute; + private ValidationResults validationResults; + private ProxyContext context; - public UserProxy(User user) { - super(); - this.enabled = user.getEnabled(); - this.id = user.getId(); - this.name = user.getUsername(); - this.roles = user.getRoleCodes(); - //password is not initialized, so the client will not know its value + public ValidationResultsProxy(ProxyContext context, Attribute attribute, ValidationResults validationResults) { + this.attribute = attribute; + this.validationResults = validationResults; + this.context = context; } - public static List fromList(List users) { - List result = new ArrayList<>(); - if ( users != null ) { - for (User user : users) { - UserProxy proxy = new UserProxy(user); - result.add(proxy); - } - } - return result; - } - - public User toUser() { - User user = new User(); - user.setEnabled(enabled); - user.setId(id); - user.setUsername(name); - user.setPassword(password); - user.setRoles(getRolesFromCodes(roles)); - return user; - } - - private List getRolesFromCodes(List codes) { - List roles = new ArrayList<>(); - for (String code : codes) { - UserRole role = UserRole.fromCode(code); - roles.add(role); - } - return roles; + public List getErrors() { + return extractValidationResultMessages(validationResults.getErrors()); } - public Boolean getEnabled() { - return enabled; + public List getWarnings() { + return extractValidationResultMessages(validationResults.getWarnings()); } - public void setEnabled(Boolean enabled) { - this.enabled = enabled; - } - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; + public boolean isSpecifiedErrorPresent() { + List errors = validationResults.getErrors(); + for (ValidationResult validationResult : errors) { + if(validationResult.getValidator() instanceof SpecifiedValidator) { + return true; + } + } + return false; } - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public List getRoles() { - return roles; - } - - public void setRoles(List roles) { - this.roles = roles; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; + private List extractValidationResultMessages(List validationResultList) { + List result = new ArrayList<>(); + ValidationMessageBuilder validationMessageBuilder = ValidationMessageBuilder.createInstance(context.getMessageSource()); + for (ValidationResult validationResult : validationResultList) { + result.add(validationMessageBuilder.getValidationMessage(attribute, validationResult, context.getLocale())); + } + return result; } - } From 4d9d733e4d5c19dee5c3c2aaf7e87d0b04a4973e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:23 +0100 Subject: [PATCH 0668/1620] New translations ValidationResultsProxy.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 115 ++++++------------ 1 file changed, 35 insertions(+), 80 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index e7425cc791..05119fdd7e 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -7,99 +7,54 @@ import java.util.ArrayList; import java.util.List; import org.openforis.collect.Proxy; -import org.openforis.collect.model.User; -import org.openforis.collect.model.UserRole; +import org.openforis.collect.ProxyContext; +import org.openforis.collect.model.validation.SpecifiedValidator; +import org.openforis.collect.model.validation.ValidationMessageBuilder; +import org.openforis.idm.metamodel.validation.ValidationResult; +import org.openforis.idm.metamodel.validation.ValidationResults; +import org.openforis.idm.model.Attribute; /** - * + * @author M. Togna * @author S. Ricci - * + * */ -public class UserProxy implements Proxy { +public class ValidationResultsProxy implements Proxy { - private Boolean enabled; - private Integer id; - private String name; - private String password; - private List roles; + private Attribute attribute; + private ValidationResults validationResults; + private ProxyContext context; - public UserProxy(User user) { - super(); - this.enabled = user.getEnabled(); - this.id = user.getId(); - this.name = user.getUsername(); - this.roles = user.getRoleCodes(); - //password is not initialized, so the client will not know its value + public ValidationResultsProxy(ProxyContext context, Attribute attribute, ValidationResults validationResults) { + this.attribute = attribute; + this.validationResults = validationResults; + this.context = context; } - public static List fromList(List users) { - List result = new ArrayList<>(); - if ( users != null ) { - for (User user : users) { - UserProxy proxy = new UserProxy(user); - result.add(proxy); - } - } - return result; - } - - public User toUser() { - User user = new User(); - user.setEnabled(enabled); - user.setId(id); - user.setUsername(name); - user.setPassword(password); - user.setRoles(getRolesFromCodes(roles)); - return user; - } - - private List getRolesFromCodes(List codes) { - List roles = new ArrayList<>(); - for (String code : codes) { - UserRole role = UserRole.fromCode(code); - roles.add(role); - } - return roles; + public List getErrors() { + return extractValidationResultMessages(validationResults.getErrors()); } - public Boolean getEnabled() { - return enabled; + public List getWarnings() { + return extractValidationResultMessages(validationResults.getWarnings()); } - public void setEnabled(Boolean enabled) { - this.enabled = enabled; - } - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; + public boolean isSpecifiedErrorPresent() { + List errors = validationResults.getErrors(); + for (ValidationResult validationResult : errors) { + if(validationResult.getValidator() instanceof SpecifiedValidator) { + return true; + } + } + return false; } - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public List getRoles() { - return roles; - } - - public void setRoles(List roles) { - this.roles = roles; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; + private List extractValidationResultMessages(List validationResultList) { + List result = new ArrayList<>(); + ValidationMessageBuilder validationMessageBuilder = ValidationMessageBuilder.createInstance(context.getMessageSource()); + for (ValidationResult validationResult : validationResultList) { + result.add(validationMessageBuilder.getValidationMessage(attribute, validationResult, context.getLocale())); + } + return result; } - } From 468e70d26d2f4981d50376c104be1019c2384ac6 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:24 +0100 Subject: [PATCH 0669/1620] New translations context.xml (French) --- .../earth/app/view/Messages_fr.properties | 64 ++----------------- 1 file changed, 4 insertions(+), 60 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 05119fdd7e..64ca93cbce 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,60 +1,4 @@ -/** - * - */ -package org.openforis.collect.model.proxy; - -import java.util.ArrayList; -import java.util.List; - -import org.openforis.collect.Proxy; -import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.validation.SpecifiedValidator; -import org.openforis.collect.model.validation.ValidationMessageBuilder; -import org.openforis.idm.metamodel.validation.ValidationResult; -import org.openforis.idm.metamodel.validation.ValidationResults; -import org.openforis.idm.model.Attribute; - -/** - * @author M. Togna - * @author S. Ricci - * - */ -public class ValidationResultsProxy implements Proxy { - - private Attribute attribute; - private ValidationResults validationResults; - private ProxyContext context; - - public ValidationResultsProxy(ProxyContext context, Attribute attribute, ValidationResults validationResults) { - this.attribute = attribute; - this.validationResults = validationResults; - this.context = context; - } - - public List getErrors() { - return extractValidationResultMessages(validationResults.getErrors()); - } - - public List getWarnings() { - return extractValidationResultMessages(validationResults.getWarnings()); - } - - public boolean isSpecifiedErrorPresent() { - List errors = validationResults.getErrors(); - for (ValidationResult validationResult : errors) { - if(validationResult.getValidator() instanceof SpecifiedValidator) { - return true; - } - } - return false; - } - - private List extractValidationResultMessages(List validationResultList) { - List result = new ArrayList<>(); - ValidationMessageBuilder validationMessageBuilder = ValidationMessageBuilder.createInstance(context.getMessageSource()); - for (ValidationResult validationResult : validationResultList) { - result.add(validationMessageBuilder.getValidationMessage(attribute, validationResult, context.getLocale())); - } - return result; - } -} + + + + From e0be8bde56cf4fda8f96b13213d2ccec6937bcd6 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:25 +0100 Subject: [PATCH 0670/1620] New translations TaxonomyProxy.java (French) --- .../earth/app/view/Messages_fr.properties | 84 ++++++++++++++++++- 1 file changed, 80 insertions(+), 4 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 64ca93cbce..1f0698c58a 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,4 +1,80 @@ - - - - +package org.openforis.collect.model.proxy; + +import java.util.ArrayList; +import java.util.List; + +import org.openforis.collect.Proxy; +import org.openforis.collect.model.CollectTaxonomy; + +/** + * + * @author S. Ricci + * + */ +public class TaxonomyProxy implements Proxy { + + private Integer id; + private String name; + private String uri; + private Integer surveyId; + + public TaxonomyProxy() { + } + + public TaxonomyProxy(CollectTaxonomy taxonomy) { + super(); + id = taxonomy.getId(); + name = taxonomy.getName(); + uri = taxonomy.getUri(); + surveyId = taxonomy.getSurveyId(); + } + + public static List fromList(List list) { + List proxies = new ArrayList<>(); + if (list != null) { + for (CollectTaxonomy item : list) { + proxies.add(new TaxonomyProxy(item)); + } + } + return proxies; + } + + public void copyPropertiesForUpdate(CollectTaxonomy taxonomy) { + taxonomy.setName(name); + taxonomy.setUri(uri); + taxonomy.setSurveyId(surveyId); + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getUri() { + return uri; + } + + public void setUri(String uri) { + this.uri = uri; + } + + public Integer getSurveyId() { + return surveyId; + } + + public void setSurveyId(Integer surveyId) { + this.surveyId = surveyId; + } + +} From 1d2ab405114f4cdd0032784e5f9476fda666d6d5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:26 +0100 Subject: [PATCH 0671/1620] New translations context.xml (Spanish) --- .../earth/app/view/Messages_es.properties | 64 ++----------------- 1 file changed, 4 insertions(+), 60 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 05119fdd7e..64ca93cbce 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,60 +1,4 @@ -/** - * - */ -package org.openforis.collect.model.proxy; - -import java.util.ArrayList; -import java.util.List; - -import org.openforis.collect.Proxy; -import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.validation.SpecifiedValidator; -import org.openforis.collect.model.validation.ValidationMessageBuilder; -import org.openforis.idm.metamodel.validation.ValidationResult; -import org.openforis.idm.metamodel.validation.ValidationResults; -import org.openforis.idm.model.Attribute; - -/** - * @author M. Togna - * @author S. Ricci - * - */ -public class ValidationResultsProxy implements Proxy { - - private Attribute attribute; - private ValidationResults validationResults; - private ProxyContext context; - - public ValidationResultsProxy(ProxyContext context, Attribute attribute, ValidationResults validationResults) { - this.attribute = attribute; - this.validationResults = validationResults; - this.context = context; - } - - public List getErrors() { - return extractValidationResultMessages(validationResults.getErrors()); - } - - public List getWarnings() { - return extractValidationResultMessages(validationResults.getWarnings()); - } - - public boolean isSpecifiedErrorPresent() { - List errors = validationResults.getErrors(); - for (ValidationResult validationResult : errors) { - if(validationResult.getValidator() instanceof SpecifiedValidator) { - return true; - } - } - return false; - } - - private List extractValidationResultMessages(List validationResultList) { - List result = new ArrayList<>(); - ValidationMessageBuilder validationMessageBuilder = ValidationMessageBuilder.createInstance(context.getMessageSource()); - for (ValidationResult validationResult : validationResultList) { - result.add(validationMessageBuilder.getValidationMessage(attribute, validationResult, context.getLocale())); - } - return result; - } -} + + + + From 64ccf3af17588d0f8b4ce3ef1829744d5c59f201 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:27 +0100 Subject: [PATCH 0672/1620] New translations context.xml (Portuguese) --- .../earth/app/view/Messages_pt.properties | 64 ++----------------- 1 file changed, 4 insertions(+), 60 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 05119fdd7e..64ca93cbce 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,60 +1,4 @@ -/** - * - */ -package org.openforis.collect.model.proxy; - -import java.util.ArrayList; -import java.util.List; - -import org.openforis.collect.Proxy; -import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.validation.SpecifiedValidator; -import org.openforis.collect.model.validation.ValidationMessageBuilder; -import org.openforis.idm.metamodel.validation.ValidationResult; -import org.openforis.idm.metamodel.validation.ValidationResults; -import org.openforis.idm.model.Attribute; - -/** - * @author M. Togna - * @author S. Ricci - * - */ -public class ValidationResultsProxy implements Proxy { - - private Attribute attribute; - private ValidationResults validationResults; - private ProxyContext context; - - public ValidationResultsProxy(ProxyContext context, Attribute attribute, ValidationResults validationResults) { - this.attribute = attribute; - this.validationResults = validationResults; - this.context = context; - } - - public List getErrors() { - return extractValidationResultMessages(validationResults.getErrors()); - } - - public List getWarnings() { - return extractValidationResultMessages(validationResults.getWarnings()); - } - - public boolean isSpecifiedErrorPresent() { - List errors = validationResults.getErrors(); - for (ValidationResult validationResult : errors) { - if(validationResult.getValidator() instanceof SpecifiedValidator) { - return true; - } - } - return false; - } - - private List extractValidationResultMessages(List validationResultList) { - List result = new ArrayList<>(); - ValidationMessageBuilder validationMessageBuilder = ValidationMessageBuilder.createInstance(context.getMessageSource()); - for (ValidationResult validationResult : validationResultList) { - result.add(validationMessageBuilder.getValidationMessage(attribute, validationResult, context.getLocale())); - } - return result; - } -} + + + + From bd6a0d21bc478e0bb9f5643548439fb0d33e9cca Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:28 +0100 Subject: [PATCH 0673/1620] New translations context.xml (English) --- .../earth/app/view/Messages_en.properties | 109 +----------------- 1 file changed, 4 insertions(+), 105 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index e7425cc791..64ca93cbce 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,105 +1,4 @@ -/** - * - */ -package org.openforis.collect.model.proxy; - -import java.util.ArrayList; -import java.util.List; - -import org.openforis.collect.Proxy; -import org.openforis.collect.model.User; -import org.openforis.collect.model.UserRole; - -/** - * - * @author S. Ricci - * - */ -public class UserProxy implements Proxy { - - private Boolean enabled; - private Integer id; - private String name; - private String password; - private List roles; - - public UserProxy(User user) { - super(); - this.enabled = user.getEnabled(); - this.id = user.getId(); - this.name = user.getUsername(); - this.roles = user.getRoleCodes(); - //password is not initialized, so the client will not know its value - } - - public static List fromList(List users) { - List result = new ArrayList<>(); - if ( users != null ) { - for (User user : users) { - UserProxy proxy = new UserProxy(user); - result.add(proxy); - } - } - return result; - } - - public User toUser() { - User user = new User(); - user.setEnabled(enabled); - user.setId(id); - user.setUsername(name); - user.setPassword(password); - user.setRoles(getRolesFromCodes(roles)); - return user; - } - - private List getRolesFromCodes(List codes) { - List roles = new ArrayList<>(); - for (String code : codes) { - UserRole role = UserRole.fromCode(code); - roles.add(role); - } - return roles; - } - - public Boolean getEnabled() { - return enabled; - } - - public void setEnabled(Boolean enabled) { - this.enabled = enabled; - } - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public List getRoles() { - return roles; - } - - public void setRoles(List roles) { - this.roles = roles; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - -} + + + + From 7ad1abc68a2d5c1ef66ced474ed15b58bf13333e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:29 +0100 Subject: [PATCH 0674/1620] New translations jetty-env.xml (French) --- .../earth/app/view/Messages_fr.properties | 131 ++++++++---------- 1 file changed, 55 insertions(+), 76 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 1f0698c58a..ffc6c29d58 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,80 +1,59 @@ -package org.openforis.collect.model.proxy; - -import java.util.ArrayList; -import java.util.List; - -import org.openforis.collect.Proxy; -import org.openforis.collect.model.CollectTaxonomy; - -/** - * - * @author S. Ricci - * - */ -public class TaxonomyProxy implements Proxy { - - private Integer id; - private String name; - private String uri; - private Integer surveyId; + + + + + + + + + + + + + + + jdbc/collectDs + + + jdbc:sqlite::memory: + org.sqlite.JDBC + + + + - public TaxonomyProxy() { - } + + + - public TaxonomyProxy(CollectTaxonomy taxonomy) { - super(); - id = taxonomy.getId(); - name = taxonomy.getName(); - uri = taxonomy.getUri(); - surveyId = taxonomy.getSurveyId(); - } + + + * + Access-Control-Allow-Origin + * + + - public static List fromList(List list) { - List proxies = new ArrayList<>(); - if (list != null) { - for (CollectTaxonomy item : list) { - proxies.add(new TaxonomyProxy(item)); - } - } - return proxies; - } + + + - public void copyPropertiesForUpdate(CollectTaxonomy taxonomy) { - taxonomy.setName(name); - taxonomy.setUri(uri); - taxonomy.setSurveyId(surveyId); - } - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getUri() { - return uri; - } - - public void setUri(String uri) { - this.uri = uri; - } - - public Integer getSurveyId() { - return surveyId; - } - - public void setSurveyId(Integer surveyId) { - this.surveyId = surveyId; - } - -} + + + + + + + + + + + + + + + + + + + From 243cd04bc1706a8d41bb7ebbcfd582185142288b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:30 +0100 Subject: [PATCH 0675/1620] New translations jetty-env.xml (Spanish) --- .../earth/app/view/Messages_es.properties | 63 +++++++++++++++++-- 1 file changed, 59 insertions(+), 4 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 64ca93cbce..ffc6c29d58 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,4 +1,59 @@ - - - - + + + + + + + + + + + + + + + jdbc/collectDs + + + jdbc:sqlite::memory: + org.sqlite.JDBC + + + + + + + + + + + + * + Access-Control-Allow-Origin + * + + + + + + + + + + + + + + + + + + + + + + + + + + From ac7dfff75c1d90dc732bbc052202e59c4c0bf5c6 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:31 +0100 Subject: [PATCH 0676/1620] New translations jetty-env.xml (Portuguese) --- .../earth/app/view/Messages_pt.properties | 63 +++++++++++++++++-- 1 file changed, 59 insertions(+), 4 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 64ca93cbce..ffc6c29d58 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,4 +1,59 @@ - - - - + + + + + + + + + + + + + + + jdbc/collectDs + + + jdbc:sqlite::memory: + org.sqlite.JDBC + + + + + + + + + + + + * + Access-Control-Allow-Origin + * + + + + + + + + + + + + + + + + + + + + + + + + + + From 2cd198ac1dcbc38b27dff84af32815f14961cd73 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:32 +0100 Subject: [PATCH 0677/1620] New translations jetty-env.xml (English) --- .../earth/app/view/Messages_en.properties | 63 +++++++++++++++++-- 1 file changed, 59 insertions(+), 4 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 64ca93cbce..ffc6c29d58 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,4 +1,59 @@ - - - - + + + + + + + + + + + + + + + jdbc/collectDs + + + jdbc:sqlite::memory: + org.sqlite.JDBC + + + + + + + + + + + + * + Access-Control-Allow-Origin + * + + + + + + + + + + + + + + + + + + + + + + + + + + From 1612c90ea2a86882d02e22d1c099b7403fa93d48 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:33 +0100 Subject: [PATCH 0678/1620] New translations dispatcher-servlet.xml (French) --- .../earth/app/view/Messages_fr.properties | 63 ++----------------- 1 file changed, 4 insertions(+), 59 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index ffc6c29d58..bc1fe5558d 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,59 +1,4 @@ - - - - - - - - - - - - - - - jdbc/collectDs - - - jdbc:sqlite::memory: - org.sqlite.JDBC - - - - - - - - - - - - * - Access-Control-Allow-Origin - * - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + From 504d4b1eb2726aa49779501e805d1b3088b1eaaf Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:34 +0100 Subject: [PATCH 0679/1620] New translations dispatcher-servlet.xml (Spanish) --- .../earth/app/view/Messages_es.properties | 63 ++----------------- 1 file changed, 4 insertions(+), 59 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index ffc6c29d58..bc1fe5558d 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,59 +1,4 @@ - - - - - - - - - - - - - - - jdbc/collectDs - - - jdbc:sqlite::memory: - org.sqlite.JDBC - - - - - - - - - - - - * - Access-Control-Allow-Origin - * - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + From 83e02d06b543aca1fdee15624558908708c2a808 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:35 +0100 Subject: [PATCH 0680/1620] New translations dispatcher-servlet.xml (Portuguese) --- .../earth/app/view/Messages_pt.properties | 63 ++----------------- 1 file changed, 4 insertions(+), 59 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index ffc6c29d58..bc1fe5558d 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,59 +1,4 @@ - - - - - - - - - - - - - - - jdbc/collectDs - - - jdbc:sqlite::memory: - org.sqlite.JDBC - - - - - - - - - - - - * - Access-Control-Allow-Origin - * - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + From 41d2ab76591ba72f936d1320f4d2fdf9743d2249 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:36 +0100 Subject: [PATCH 0681/1620] New translations TaxonomyProxy.java (Spanish) --- .../earth/app/view/Messages_es.properties | 82 ++++++++++++++++++- 1 file changed, 79 insertions(+), 3 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index bc1fe5558d..1f0698c58a 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,4 +1,80 @@ - - +package org.openforis.collect.model.proxy; - +import java.util.ArrayList; +import java.util.List; + +import org.openforis.collect.Proxy; +import org.openforis.collect.model.CollectTaxonomy; + +/** + * + * @author S. Ricci + * + */ +public class TaxonomyProxy implements Proxy { + + private Integer id; + private String name; + private String uri; + private Integer surveyId; + + public TaxonomyProxy() { + } + + public TaxonomyProxy(CollectTaxonomy taxonomy) { + super(); + id = taxonomy.getId(); + name = taxonomy.getName(); + uri = taxonomy.getUri(); + surveyId = taxonomy.getSurveyId(); + } + + public static List fromList(List list) { + List proxies = new ArrayList<>(); + if (list != null) { + for (CollectTaxonomy item : list) { + proxies.add(new TaxonomyProxy(item)); + } + } + return proxies; + } + + public void copyPropertiesForUpdate(CollectTaxonomy taxonomy) { + taxonomy.setName(name); + taxonomy.setUri(uri); + taxonomy.setSurveyId(surveyId); + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getUri() { + return uri; + } + + public void setUri(String uri) { + this.uri = uri; + } + + public Integer getSurveyId() { + return surveyId; + } + + public void setSurveyId(Integer surveyId) { + this.surveyId = surveyId; + } + +} From f885c53ddef2fb8296ae72e32061f6a6f5344c14 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:37 +0100 Subject: [PATCH 0682/1620] New translations TaxonOccurrenceProxy.java (English) --- .../earth/app/view/Messages_en.properties | 110 +++++++++--------- 1 file changed, 53 insertions(+), 57 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index ffc6c29d58..a6fb237683 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,59 +1,55 @@ - - - - - - - - - - - - - - - jdbc/collectDs - - - jdbc:sqlite::memory: - org.sqlite.JDBC - - - - +/** + * + */ +package org.openforis.collect.model.proxy; + +import java.util.ArrayList; +import java.util.List; + +import org.openforis.collect.Proxy; +import org.openforis.idm.model.TaxonOccurrence; + +/** + * @author S. Ricci + * + */ +public class TaxonOccurrenceProxy implements Proxy { + + private TaxonOccurrence occurrence; + + public TaxonOccurrenceProxy(TaxonOccurrence occurence) { + super(); + this.occurrence = occurence; + } - - - + public static List fromList(List list) { + List proxies = new ArrayList<>(); + if (list != null) { + for (TaxonOccurrence item : list) { + proxies.add(new TaxonOccurrenceProxy(item)); + } + } + return proxies; + } + + public String getCode() { + return occurrence.getCode(); + } + + public String getScientificName() { + return occurrence.getScientificName(); + } + + public String getVernacularName() { + return occurrence.getVernacularName(); + } + + public String getLanguageCode() { + return occurrence.getLanguageCode(); + } + + public String getLanguageVariety() { + return occurrence.getLanguageVariety(); + } - - - * - Access-Control-Allow-Origin - * - - - - - - - - - - - - - - - - - - - - - - - - - - +} From 9d9d2fac138ef87b524015f53ecba387495b4aa1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:38 +0100 Subject: [PATCH 0683/1620] New translations NodeAddChangeProxy.java (English) --- .../earth/app/view/Messages_en.properties | 49 ++----------------- 1 file changed, 4 insertions(+), 45 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index a6fb237683..2cea96468e 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,55 +1,14 @@ -/** - * - */ package org.openforis.collect.model.proxy; -import java.util.ArrayList; -import java.util.List; -import org.openforis.collect.Proxy; -import org.openforis.idm.model.TaxonOccurrence; /** + * * @author S. Ricci * */ -public class TaxonOccurrenceProxy implements Proxy { - - private TaxonOccurrence occurrence; - - public TaxonOccurrenceProxy(TaxonOccurrence occurence) { - super(); - this.occurrence = occurence; - } +public interface NodeAddChangeProxy { - public static List fromList(List list) { - List proxies = new ArrayList<>(); - if (list != null) { - for (TaxonOccurrence item : list) { - proxies.add(new TaxonOccurrenceProxy(item)); - } - } - return proxies; - } - - public String getCode() { - return occurrence.getCode(); - } - - public String getScientificName() { - return occurrence.getScientificName(); - } - - public String getVernacularName() { - return occurrence.getVernacularName(); - } - - public String getLanguageCode() { - return occurrence.getLanguageCode(); - } - - public String getLanguageVariety() { - return occurrence.getLanguageVariety(); - } + NodeProxy getCreatedNode(); -} +} \ No newline at end of file From 0decfdac5b9c911885ac4bb601ee684873a0a0b0 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:39 +0100 Subject: [PATCH 0684/1620] New translations NodeDeleteChangeProxy.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index bc1fe5558d..28f2316f75 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,4 +1,21 @@ - - +package org.openforis.collect.model.proxy; - +import org.openforis.collect.ProxyContext; +import org.openforis.collect.model.NodeDeleteChange; + +/** + * + * @author S. Ricci + * + */ +public class NodeDeleteChangeProxy extends NodeChangeProxy { + + public NodeDeleteChangeProxy(NodeDeleteChange change, ProxyContext context) { + super(change, context); + } + + public Integer getDeletedNodeId() { + return change.getNode().getInternalId(); + } + +} \ No newline at end of file From 39fda75d5d1b2b10f5b9c8f0f5ad7499f44a2441 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:40 +0100 Subject: [PATCH 0685/1620] New translations NodeChangeProxy.java (French) --- .../earth/app/view/Messages_fr.properties | 72 ++++++++++++++++++- 1 file changed, 69 insertions(+), 3 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index bc1fe5558d..ab9b8602b0 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,4 +1,70 @@ - - +package org.openforis.collect.model.proxy; - +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Locale; + +import org.openforis.collect.Proxy; +import org.openforis.collect.ProxyContext; +import org.openforis.collect.manager.MessageSource; +import org.openforis.collect.model.AttributeAddChange; +import org.openforis.collect.model.AttributeChange; +import org.openforis.collect.model.EntityAddChange; +import org.openforis.collect.model.EntityChange; +import org.openforis.collect.model.NodeChange; +import org.openforis.collect.model.NodeDeleteChange; + + +/** + * + * @author S. Ricci + * + * @param The type of NodeChange + */ +public class NodeChangeProxy> implements Proxy { + + protected C change; + protected ProxyContext context; + + public NodeChangeProxy(C change, ProxyContext context) { + this.context = context; + } + + public static List> fromList(Collection> items, ProxyContext context) { + List> result = new ArrayList<>(); + if ( items != null ) { + for (NodeChange item : items) { + NodeChangeProxy proxy; + if ( item instanceof AttributeAddChange ) { + proxy = new AttributeAddChangeProxy((AttributeAddChange) item, context); + } else if ( item instanceof EntityAddChange ) { + proxy = new EntityAddChangeProxy((EntityAddChange) item, context); + } else if ( item instanceof AttributeChange ) { + proxy = new AttributeChangeProxy((AttributeChange) item, context); + } else if ( item instanceof EntityChange) { + proxy = new EntityChangeProxy((EntityChange) item, context); + } else if ( item instanceof NodeDeleteChange ) { + proxy = new NodeDeleteChangeProxy((NodeDeleteChange) item, context); + } else { + throw new IllegalArgumentException("NodeChange type not supported: " + item.getClass().getSimpleName()); + } + result.add(proxy); + } + } + return result; + } + + public int getNodeId() { + return change.getNode().getInternalId(); + } + + protected Locale getLocale() { + return context.getLocale(); + } + + protected MessageSource getMessageSource() { + return context.getMessageSource(); + } + +} \ No newline at end of file From 37995d8c752e39be676b5a96de286c982e806748 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:41 +0100 Subject: [PATCH 0686/1620] New translations NodeChangeProxy.java (Spanish) --- .../earth/app/view/Messages_es.properties | 106 ++++++++---------- 1 file changed, 48 insertions(+), 58 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 1f0698c58a..ab9b8602b0 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,80 +1,70 @@ package org.openforis.collect.model.proxy; import java.util.ArrayList; +import java.util.Collection; import java.util.List; +import java.util.Locale; import org.openforis.collect.Proxy; -import org.openforis.collect.model.CollectTaxonomy; +import org.openforis.collect.ProxyContext; +import org.openforis.collect.manager.MessageSource; +import org.openforis.collect.model.AttributeAddChange; +import org.openforis.collect.model.AttributeChange; +import org.openforis.collect.model.EntityAddChange; +import org.openforis.collect.model.EntityChange; +import org.openforis.collect.model.NodeChange; +import org.openforis.collect.model.NodeDeleteChange; + /** * * @author S. Ricci * + * @param The type of NodeChange */ -public class TaxonomyProxy implements Proxy { +public class NodeChangeProxy> implements Proxy { - private Integer id; - private String name; - private String uri; - private Integer surveyId; - - public TaxonomyProxy() { - } - - public TaxonomyProxy(CollectTaxonomy taxonomy) { - super(); - id = taxonomy.getId(); - name = taxonomy.getName(); - uri = taxonomy.getUri(); - surveyId = taxonomy.getSurveyId(); + protected C change; + protected ProxyContext context; + + public NodeChangeProxy(C change, ProxyContext context) { + this.context = context; } - - public static List fromList(List list) { - List proxies = new ArrayList<>(); - if (list != null) { - for (CollectTaxonomy item : list) { - proxies.add(new TaxonomyProxy(item)); + + public static List> fromList(Collection> items, ProxyContext context) { + List> result = new ArrayList<>(); + if ( items != null ) { + for (NodeChange item : items) { + NodeChangeProxy proxy; + if ( item instanceof AttributeAddChange ) { + proxy = new AttributeAddChangeProxy((AttributeAddChange) item, context); + } else if ( item instanceof EntityAddChange ) { + proxy = new EntityAddChangeProxy((EntityAddChange) item, context); + } else if ( item instanceof AttributeChange ) { + proxy = new AttributeChangeProxy((AttributeChange) item, context); + } else if ( item instanceof EntityChange) { + proxy = new EntityChangeProxy((EntityChange) item, context); + } else if ( item instanceof NodeDeleteChange ) { + proxy = new NodeDeleteChangeProxy((NodeDeleteChange) item, context); + } else { + throw new IllegalArgumentException("NodeChange type not supported: " + item.getClass().getSimpleName()); + } + result.add(proxy); } } - return proxies; + return result; } - public void copyPropertiesForUpdate(CollectTaxonomy taxonomy) { - taxonomy.setName(name); - taxonomy.setUri(uri); - taxonomy.setSurveyId(surveyId); - } - - public Integer getId() { - return id; + public int getNodeId() { + return change.getNode().getInternalId(); } - - public void setId(Integer id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getUri() { - return uri; - } - - public void setUri(String uri) { - this.uri = uri; - } - - public Integer getSurveyId() { - return surveyId; + + protected Locale getLocale() { + return context.getLocale(); } - - public void setSurveyId(Integer surveyId) { - this.surveyId = surveyId; + + protected MessageSource getMessageSource() { + return context.getMessageSource(); } -} +} \ No newline at end of file From b0040dda45e7dc4fc018bc1fb75df8fb2a48ddbc Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:42 +0100 Subject: [PATCH 0687/1620] New translations NodeChangeProxy.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 57 +++++++++++++++++-- 1 file changed, 53 insertions(+), 4 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 28f2316f75..ab9b8602b0 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,21 +1,70 @@ package org.openforis.collect.model.proxy; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Locale; + +import org.openforis.collect.Proxy; import org.openforis.collect.ProxyContext; +import org.openforis.collect.manager.MessageSource; +import org.openforis.collect.model.AttributeAddChange; +import org.openforis.collect.model.AttributeChange; +import org.openforis.collect.model.EntityAddChange; +import org.openforis.collect.model.EntityChange; +import org.openforis.collect.model.NodeChange; import org.openforis.collect.model.NodeDeleteChange; + /** * * @author S. Ricci * + * @param The type of NodeChange */ -public class NodeDeleteChangeProxy extends NodeChangeProxy { +public class NodeChangeProxy> implements Proxy { + + protected C change; + protected ProxyContext context; - public NodeDeleteChangeProxy(NodeDeleteChange change, ProxyContext context) { - super(change, context); + public NodeChangeProxy(C change, ProxyContext context) { + this.context = context; } - public Integer getDeletedNodeId() { + public static List> fromList(Collection> items, ProxyContext context) { + List> result = new ArrayList<>(); + if ( items != null ) { + for (NodeChange item : items) { + NodeChangeProxy proxy; + if ( item instanceof AttributeAddChange ) { + proxy = new AttributeAddChangeProxy((AttributeAddChange) item, context); + } else if ( item instanceof EntityAddChange ) { + proxy = new EntityAddChangeProxy((EntityAddChange) item, context); + } else if ( item instanceof AttributeChange ) { + proxy = new AttributeChangeProxy((AttributeChange) item, context); + } else if ( item instanceof EntityChange) { + proxy = new EntityChangeProxy((EntityChange) item, context); + } else if ( item instanceof NodeDeleteChange ) { + proxy = new NodeDeleteChangeProxy((NodeDeleteChange) item, context); + } else { + throw new IllegalArgumentException("NodeChange type not supported: " + item.getClass().getSimpleName()); + } + result.add(proxy); + } + } + return result; + } + + public int getNodeId() { return change.getNode().getInternalId(); } + + protected Locale getLocale() { + return context.getLocale(); + } + + protected MessageSource getMessageSource() { + return context.getMessageSource(); + } } \ No newline at end of file From 855dc9c09263809905e8efd534f6618f90cbb9d4 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:43 +0100 Subject: [PATCH 0688/1620] New translations NodeChangeProxy.java (English) --- .../earth/app/view/Messages_en.properties | 60 ++++++++++++++++++- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 2cea96468e..ab9b8602b0 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,14 +1,70 @@ package org.openforis.collect.model.proxy; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Locale; + +import org.openforis.collect.Proxy; +import org.openforis.collect.ProxyContext; +import org.openforis.collect.manager.MessageSource; +import org.openforis.collect.model.AttributeAddChange; +import org.openforis.collect.model.AttributeChange; +import org.openforis.collect.model.EntityAddChange; +import org.openforis.collect.model.EntityChange; +import org.openforis.collect.model.NodeChange; +import org.openforis.collect.model.NodeDeleteChange; /** * * @author S. Ricci * + * @param The type of NodeChange */ -public interface NodeAddChangeProxy { +public class NodeChangeProxy> implements Proxy { + + protected C change; + protected ProxyContext context; + + public NodeChangeProxy(C change, ProxyContext context) { + this.context = context; + } + + public static List> fromList(Collection> items, ProxyContext context) { + List> result = new ArrayList<>(); + if ( items != null ) { + for (NodeChange item : items) { + NodeChangeProxy proxy; + if ( item instanceof AttributeAddChange ) { + proxy = new AttributeAddChangeProxy((AttributeAddChange) item, context); + } else if ( item instanceof EntityAddChange ) { + proxy = new EntityAddChangeProxy((EntityAddChange) item, context); + } else if ( item instanceof AttributeChange ) { + proxy = new AttributeChangeProxy((AttributeChange) item, context); + } else if ( item instanceof EntityChange) { + proxy = new EntityChangeProxy((EntityChange) item, context); + } else if ( item instanceof NodeDeleteChange ) { + proxy = new NodeDeleteChangeProxy((NodeDeleteChange) item, context); + } else { + throw new IllegalArgumentException("NodeChange type not supported: " + item.getClass().getSimpleName()); + } + result.add(proxy); + } + } + return result; + } + + public int getNodeId() { + return change.getNode().getInternalId(); + } - NodeProxy getCreatedNode(); + protected Locale getLocale() { + return context.getLocale(); + } + protected MessageSource getMessageSource() { + return context.getMessageSource(); + } + } \ No newline at end of file From abe6372035d78e29aec67ff1cac194235206e1e9 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:44 +0100 Subject: [PATCH 0689/1620] New translations NodeChangeSetProxy.java (French) --- .../earth/app/view/Messages_fr.properties | 95 +++++++++---------- 1 file changed, 46 insertions(+), 49 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index ab9b8602b0..0f769ec936 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,70 +1,67 @@ +/** + * + */ package org.openforis.collect.model.proxy; -import java.util.ArrayList; -import java.util.Collection; import java.util.List; -import java.util.Locale; import org.openforis.collect.Proxy; import org.openforis.collect.ProxyContext; -import org.openforis.collect.manager.MessageSource; -import org.openforis.collect.model.AttributeAddChange; -import org.openforis.collect.model.AttributeChange; -import org.openforis.collect.model.EntityAddChange; -import org.openforis.collect.model.EntityChange; -import org.openforis.collect.model.NodeChange; -import org.openforis.collect.model.NodeDeleteChange; - +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.NodeChangeSet; /** - * * @author S. Ricci * - * @param The type of NodeChange */ -public class NodeChangeProxy> implements Proxy { - - protected C change; - protected ProxyContext context; +public class NodeChangeSetProxy implements Proxy { - public NodeChangeProxy(C change, ProxyContext context) { + private NodeChangeSet changeSet; + private CollectRecord record; + private boolean recordSaved; + private ProxyContext context; + + public NodeChangeSetProxy(CollectRecord record, NodeChangeSet changeSet, ProxyContext context) { + super(); + this.record = record; + this.changeSet = changeSet; this.context = context; } - public static List> fromList(Collection> items, ProxyContext context) { - List> result = new ArrayList<>(); - if ( items != null ) { - for (NodeChange item : items) { - NodeChangeProxy proxy; - if ( item instanceof AttributeAddChange ) { - proxy = new AttributeAddChangeProxy((AttributeAddChange) item, context); - } else if ( item instanceof EntityAddChange ) { - proxy = new EntityAddChangeProxy((EntityAddChange) item, context); - } else if ( item instanceof AttributeChange ) { - proxy = new AttributeChangeProxy((AttributeChange) item, context); - } else if ( item instanceof EntityChange) { - proxy = new EntityChangeProxy((EntityChange) item, context); - } else if ( item instanceof NodeDeleteChange ) { - proxy = new NodeDeleteChangeProxy((NodeDeleteChange) item, context); - } else { - throw new IllegalArgumentException("NodeChange type not supported: " + item.getClass().getSimpleName()); - } - result.add(proxy); - } - } - return result; + public List> getChanges() { + return NodeChangeProxy.fromList(changeSet.getChanges(), context); } - - public int getNodeId() { - return change.getNode().getInternalId(); + + public boolean isRecordSaved() { + return recordSaved; } - protected Locale getLocale() { - return context.getLocale(); + public void setRecordSaved(boolean recordSaved) { + this.recordSaved = recordSaved; } - - protected MessageSource getMessageSource() { - return context.getMessageSource(); + + public Integer getErrors() { + return record.getErrors(); } -} \ No newline at end of file + public Integer getSkipped() { + return record.getSkipped(); + } + + public Integer getMissing() { + return record.getMissing(); + } + + public Integer getWarnings() { + return record.getWarnings(); + } + + public Integer getMissingErrors() { + return record.getMissingErrors(); + } + + public Integer getMissingWarnings() { + return record.getMissingWarnings(); + } + +} From bb56855bb64f7fbf81127a9c924eb3c1d81f3173 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:45 +0100 Subject: [PATCH 0690/1620] New translations NodeChangeSetProxy.java (Spanish) --- .../earth/app/view/Messages_es.properties | 95 +++++++++---------- 1 file changed, 46 insertions(+), 49 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index ab9b8602b0..0f769ec936 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,70 +1,67 @@ +/** + * + */ package org.openforis.collect.model.proxy; -import java.util.ArrayList; -import java.util.Collection; import java.util.List; -import java.util.Locale; import org.openforis.collect.Proxy; import org.openforis.collect.ProxyContext; -import org.openforis.collect.manager.MessageSource; -import org.openforis.collect.model.AttributeAddChange; -import org.openforis.collect.model.AttributeChange; -import org.openforis.collect.model.EntityAddChange; -import org.openforis.collect.model.EntityChange; -import org.openforis.collect.model.NodeChange; -import org.openforis.collect.model.NodeDeleteChange; - +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.NodeChangeSet; /** - * * @author S. Ricci * - * @param The type of NodeChange */ -public class NodeChangeProxy> implements Proxy { - - protected C change; - protected ProxyContext context; +public class NodeChangeSetProxy implements Proxy { - public NodeChangeProxy(C change, ProxyContext context) { + private NodeChangeSet changeSet; + private CollectRecord record; + private boolean recordSaved; + private ProxyContext context; + + public NodeChangeSetProxy(CollectRecord record, NodeChangeSet changeSet, ProxyContext context) { + super(); + this.record = record; + this.changeSet = changeSet; this.context = context; } - public static List> fromList(Collection> items, ProxyContext context) { - List> result = new ArrayList<>(); - if ( items != null ) { - for (NodeChange item : items) { - NodeChangeProxy proxy; - if ( item instanceof AttributeAddChange ) { - proxy = new AttributeAddChangeProxy((AttributeAddChange) item, context); - } else if ( item instanceof EntityAddChange ) { - proxy = new EntityAddChangeProxy((EntityAddChange) item, context); - } else if ( item instanceof AttributeChange ) { - proxy = new AttributeChangeProxy((AttributeChange) item, context); - } else if ( item instanceof EntityChange) { - proxy = new EntityChangeProxy((EntityChange) item, context); - } else if ( item instanceof NodeDeleteChange ) { - proxy = new NodeDeleteChangeProxy((NodeDeleteChange) item, context); - } else { - throw new IllegalArgumentException("NodeChange type not supported: " + item.getClass().getSimpleName()); - } - result.add(proxy); - } - } - return result; + public List> getChanges() { + return NodeChangeProxy.fromList(changeSet.getChanges(), context); } - - public int getNodeId() { - return change.getNode().getInternalId(); + + public boolean isRecordSaved() { + return recordSaved; } - protected Locale getLocale() { - return context.getLocale(); + public void setRecordSaved(boolean recordSaved) { + this.recordSaved = recordSaved; } - - protected MessageSource getMessageSource() { - return context.getMessageSource(); + + public Integer getErrors() { + return record.getErrors(); } -} \ No newline at end of file + public Integer getSkipped() { + return record.getSkipped(); + } + + public Integer getMissing() { + return record.getMissing(); + } + + public Integer getWarnings() { + return record.getWarnings(); + } + + public Integer getMissingErrors() { + return record.getMissingErrors(); + } + + public Integer getMissingWarnings() { + return record.getMissingWarnings(); + } + +} From d710b4e6b3ce22f79d5e8b3556d082fcd7e8c120 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:46 +0100 Subject: [PATCH 0691/1620] New translations NodeChangeSetProxy.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 95 +++++++++---------- 1 file changed, 46 insertions(+), 49 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index ab9b8602b0..0f769ec936 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,70 +1,67 @@ +/** + * + */ package org.openforis.collect.model.proxy; -import java.util.ArrayList; -import java.util.Collection; import java.util.List; -import java.util.Locale; import org.openforis.collect.Proxy; import org.openforis.collect.ProxyContext; -import org.openforis.collect.manager.MessageSource; -import org.openforis.collect.model.AttributeAddChange; -import org.openforis.collect.model.AttributeChange; -import org.openforis.collect.model.EntityAddChange; -import org.openforis.collect.model.EntityChange; -import org.openforis.collect.model.NodeChange; -import org.openforis.collect.model.NodeDeleteChange; - +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.NodeChangeSet; /** - * * @author S. Ricci * - * @param The type of NodeChange */ -public class NodeChangeProxy> implements Proxy { - - protected C change; - protected ProxyContext context; +public class NodeChangeSetProxy implements Proxy { - public NodeChangeProxy(C change, ProxyContext context) { + private NodeChangeSet changeSet; + private CollectRecord record; + private boolean recordSaved; + private ProxyContext context; + + public NodeChangeSetProxy(CollectRecord record, NodeChangeSet changeSet, ProxyContext context) { + super(); + this.record = record; + this.changeSet = changeSet; this.context = context; } - public static List> fromList(Collection> items, ProxyContext context) { - List> result = new ArrayList<>(); - if ( items != null ) { - for (NodeChange item : items) { - NodeChangeProxy proxy; - if ( item instanceof AttributeAddChange ) { - proxy = new AttributeAddChangeProxy((AttributeAddChange) item, context); - } else if ( item instanceof EntityAddChange ) { - proxy = new EntityAddChangeProxy((EntityAddChange) item, context); - } else if ( item instanceof AttributeChange ) { - proxy = new AttributeChangeProxy((AttributeChange) item, context); - } else if ( item instanceof EntityChange) { - proxy = new EntityChangeProxy((EntityChange) item, context); - } else if ( item instanceof NodeDeleteChange ) { - proxy = new NodeDeleteChangeProxy((NodeDeleteChange) item, context); - } else { - throw new IllegalArgumentException("NodeChange type not supported: " + item.getClass().getSimpleName()); - } - result.add(proxy); - } - } - return result; + public List> getChanges() { + return NodeChangeProxy.fromList(changeSet.getChanges(), context); } - - public int getNodeId() { - return change.getNode().getInternalId(); + + public boolean isRecordSaved() { + return recordSaved; } - protected Locale getLocale() { - return context.getLocale(); + public void setRecordSaved(boolean recordSaved) { + this.recordSaved = recordSaved; } - - protected MessageSource getMessageSource() { - return context.getMessageSource(); + + public Integer getErrors() { + return record.getErrors(); } -} \ No newline at end of file + public Integer getSkipped() { + return record.getSkipped(); + } + + public Integer getMissing() { + return record.getMissing(); + } + + public Integer getWarnings() { + return record.getWarnings(); + } + + public Integer getMissingErrors() { + return record.getMissingErrors(); + } + + public Integer getMissingWarnings() { + return record.getMissingWarnings(); + } + +} From ec797fed3df715c82d0018ec52811cf94537114d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:47 +0100 Subject: [PATCH 0692/1620] New translations NodeChangeSetProxy.java (English) --- .../earth/app/view/Messages_en.properties | 95 +++++++++---------- 1 file changed, 46 insertions(+), 49 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index ab9b8602b0..0f769ec936 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,70 +1,67 @@ +/** + * + */ package org.openforis.collect.model.proxy; -import java.util.ArrayList; -import java.util.Collection; import java.util.List; -import java.util.Locale; import org.openforis.collect.Proxy; import org.openforis.collect.ProxyContext; -import org.openforis.collect.manager.MessageSource; -import org.openforis.collect.model.AttributeAddChange; -import org.openforis.collect.model.AttributeChange; -import org.openforis.collect.model.EntityAddChange; -import org.openforis.collect.model.EntityChange; -import org.openforis.collect.model.NodeChange; -import org.openforis.collect.model.NodeDeleteChange; - +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.NodeChangeSet; /** - * * @author S. Ricci * - * @param The type of NodeChange */ -public class NodeChangeProxy> implements Proxy { - - protected C change; - protected ProxyContext context; +public class NodeChangeSetProxy implements Proxy { - public NodeChangeProxy(C change, ProxyContext context) { + private NodeChangeSet changeSet; + private CollectRecord record; + private boolean recordSaved; + private ProxyContext context; + + public NodeChangeSetProxy(CollectRecord record, NodeChangeSet changeSet, ProxyContext context) { + super(); + this.record = record; + this.changeSet = changeSet; this.context = context; } - public static List> fromList(Collection> items, ProxyContext context) { - List> result = new ArrayList<>(); - if ( items != null ) { - for (NodeChange item : items) { - NodeChangeProxy proxy; - if ( item instanceof AttributeAddChange ) { - proxy = new AttributeAddChangeProxy((AttributeAddChange) item, context); - } else if ( item instanceof EntityAddChange ) { - proxy = new EntityAddChangeProxy((EntityAddChange) item, context); - } else if ( item instanceof AttributeChange ) { - proxy = new AttributeChangeProxy((AttributeChange) item, context); - } else if ( item instanceof EntityChange) { - proxy = new EntityChangeProxy((EntityChange) item, context); - } else if ( item instanceof NodeDeleteChange ) { - proxy = new NodeDeleteChangeProxy((NodeDeleteChange) item, context); - } else { - throw new IllegalArgumentException("NodeChange type not supported: " + item.getClass().getSimpleName()); - } - result.add(proxy); - } - } - return result; + public List> getChanges() { + return NodeChangeProxy.fromList(changeSet.getChanges(), context); } - - public int getNodeId() { - return change.getNode().getInternalId(); + + public boolean isRecordSaved() { + return recordSaved; } - protected Locale getLocale() { - return context.getLocale(); + public void setRecordSaved(boolean recordSaved) { + this.recordSaved = recordSaved; } - - protected MessageSource getMessageSource() { - return context.getMessageSource(); + + public Integer getErrors() { + return record.getErrors(); } -} \ No newline at end of file + public Integer getSkipped() { + return record.getSkipped(); + } + + public Integer getMissing() { + return record.getMissing(); + } + + public Integer getWarnings() { + return record.getWarnings(); + } + + public Integer getMissingErrors() { + return record.getMissingErrors(); + } + + public Integer getMissingWarnings() { + return record.getMissingWarnings(); + } + +} From d99d863ae82555d69673e949ae6588bc2594869d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:48 +0100 Subject: [PATCH 0693/1620] New translations NodeDeleteChangeProxy.java (French) --- .../earth/app/view/Messages_fr.properties | 62 +++---------------- 1 file changed, 8 insertions(+), 54 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 0f769ec936..28f2316f75 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,67 +1,21 @@ -/** - * - */ package org.openforis.collect.model.proxy; -import java.util.List; - -import org.openforis.collect.Proxy; import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.NodeChangeSet; +import org.openforis.collect.model.NodeDeleteChange; /** + * * @author S. Ricci * */ -public class NodeChangeSetProxy implements Proxy { +public class NodeDeleteChangeProxy extends NodeChangeProxy { - private NodeChangeSet changeSet; - private CollectRecord record; - private boolean recordSaved; - private ProxyContext context; - - public NodeChangeSetProxy(CollectRecord record, NodeChangeSet changeSet, ProxyContext context) { - super(); - this.record = record; - this.changeSet = changeSet; - this.context = context; - } - - public List> getChanges() { - return NodeChangeProxy.fromList(changeSet.getChanges(), context); - } - - public boolean isRecordSaved() { - return recordSaved; - } - - public void setRecordSaved(boolean recordSaved) { - this.recordSaved = recordSaved; + public NodeDeleteChangeProxy(NodeDeleteChange change, ProxyContext context) { + super(change, context); } - public Integer getErrors() { - return record.getErrors(); + public Integer getDeletedNodeId() { + return change.getNode().getInternalId(); } - public Integer getSkipped() { - return record.getSkipped(); - } - - public Integer getMissing() { - return record.getMissing(); - } - - public Integer getWarnings() { - return record.getWarnings(); - } - - public Integer getMissingErrors() { - return record.getMissingErrors(); - } - - public Integer getMissingWarnings() { - return record.getMissingWarnings(); - } - -} +} \ No newline at end of file From 386877d99c7917b64518e02724d312cc7c59cce1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:49 +0100 Subject: [PATCH 0694/1620] New translations NodeDeleteChangeProxy.java (Spanish) --- .../earth/app/view/Messages_es.properties | 62 +++---------------- 1 file changed, 8 insertions(+), 54 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 0f769ec936..28f2316f75 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,67 +1,21 @@ -/** - * - */ package org.openforis.collect.model.proxy; -import java.util.List; - -import org.openforis.collect.Proxy; import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.NodeChangeSet; +import org.openforis.collect.model.NodeDeleteChange; /** + * * @author S. Ricci * */ -public class NodeChangeSetProxy implements Proxy { +public class NodeDeleteChangeProxy extends NodeChangeProxy { - private NodeChangeSet changeSet; - private CollectRecord record; - private boolean recordSaved; - private ProxyContext context; - - public NodeChangeSetProxy(CollectRecord record, NodeChangeSet changeSet, ProxyContext context) { - super(); - this.record = record; - this.changeSet = changeSet; - this.context = context; - } - - public List> getChanges() { - return NodeChangeProxy.fromList(changeSet.getChanges(), context); - } - - public boolean isRecordSaved() { - return recordSaved; - } - - public void setRecordSaved(boolean recordSaved) { - this.recordSaved = recordSaved; + public NodeDeleteChangeProxy(NodeDeleteChange change, ProxyContext context) { + super(change, context); } - public Integer getErrors() { - return record.getErrors(); + public Integer getDeletedNodeId() { + return change.getNode().getInternalId(); } - public Integer getSkipped() { - return record.getSkipped(); - } - - public Integer getMissing() { - return record.getMissing(); - } - - public Integer getWarnings() { - return record.getWarnings(); - } - - public Integer getMissingErrors() { - return record.getMissingErrors(); - } - - public Integer getMissingWarnings() { - return record.getMissingWarnings(); - } - -} +} \ No newline at end of file From d0cb796b22de4b01ea47e40a9f1f03c5347f7a62 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:50 +0100 Subject: [PATCH 0695/1620] New translations NodeDeleteChangeProxy.java (English) --- .../earth/app/view/Messages_en.properties | 62 +++---------------- 1 file changed, 8 insertions(+), 54 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 0f769ec936..28f2316f75 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,67 +1,21 @@ -/** - * - */ package org.openforis.collect.model.proxy; -import java.util.List; - -import org.openforis.collect.Proxy; import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.NodeChangeSet; +import org.openforis.collect.model.NodeDeleteChange; /** + * * @author S. Ricci * */ -public class NodeChangeSetProxy implements Proxy { +public class NodeDeleteChangeProxy extends NodeChangeProxy { - private NodeChangeSet changeSet; - private CollectRecord record; - private boolean recordSaved; - private ProxyContext context; - - public NodeChangeSetProxy(CollectRecord record, NodeChangeSet changeSet, ProxyContext context) { - super(); - this.record = record; - this.changeSet = changeSet; - this.context = context; - } - - public List> getChanges() { - return NodeChangeProxy.fromList(changeSet.getChanges(), context); - } - - public boolean isRecordSaved() { - return recordSaved; - } - - public void setRecordSaved(boolean recordSaved) { - this.recordSaved = recordSaved; + public NodeDeleteChangeProxy(NodeDeleteChange change, ProxyContext context) { + super(change, context); } - public Integer getErrors() { - return record.getErrors(); + public Integer getDeletedNodeId() { + return change.getNode().getInternalId(); } - public Integer getSkipped() { - return record.getSkipped(); - } - - public Integer getMissing() { - return record.getMissing(); - } - - public Integer getWarnings() { - return record.getWarnings(); - } - - public Integer getMissingErrors() { - return record.getMissingErrors(); - } - - public Integer getMissingWarnings() { - return record.getMissingWarnings(); - } - -} +} \ No newline at end of file From 9dde7e1efde18f32fa0acf6ffc478c07cb757c7c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:51 +0100 Subject: [PATCH 0696/1620] New translations TaxonOccurrenceProxy.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 62 ++++++++----------- 1 file changed, 25 insertions(+), 37 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 0f769ec936..a6fb237683 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -3,65 +3,53 @@ */ package org.openforis.collect.model.proxy; +import java.util.ArrayList; import java.util.List; import org.openforis.collect.Proxy; -import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.NodeChangeSet; +import org.openforis.idm.model.TaxonOccurrence; /** * @author S. Ricci * */ -public class NodeChangeSetProxy implements Proxy { +public class TaxonOccurrenceProxy implements Proxy { - private NodeChangeSet changeSet; - private CollectRecord record; - private boolean recordSaved; - private ProxyContext context; - - public NodeChangeSetProxy(CollectRecord record, NodeChangeSet changeSet, ProxyContext context) { - super(); - this.record = record; - this.changeSet = changeSet; - this.context = context; - } - - public List> getChanges() { - return NodeChangeProxy.fromList(changeSet.getChanges(), context); - } + private TaxonOccurrence occurrence; - public boolean isRecordSaved() { - return recordSaved; + public TaxonOccurrenceProxy(TaxonOccurrence occurence) { + super(); + this.occurrence = occurence; } - public void setRecordSaved(boolean recordSaved) { - this.recordSaved = recordSaved; - } - - public Integer getErrors() { - return record.getErrors(); + public static List fromList(List list) { + List proxies = new ArrayList<>(); + if (list != null) { + for (TaxonOccurrence item : list) { + proxies.add(new TaxonOccurrenceProxy(item)); + } + } + return proxies; } - public Integer getSkipped() { - return record.getSkipped(); + public String getCode() { + return occurrence.getCode(); } - public Integer getMissing() { - return record.getMissing(); + public String getScientificName() { + return occurrence.getScientificName(); } - public Integer getWarnings() { - return record.getWarnings(); + public String getVernacularName() { + return occurrence.getVernacularName(); } - public Integer getMissingErrors() { - return record.getMissingErrors(); + public String getLanguageCode() { + return occurrence.getLanguageCode(); } - public Integer getMissingWarnings() { - return record.getMissingWarnings(); + public String getLanguageVariety() { + return occurrence.getLanguageVariety(); } } From 3117a7f24442c55d093389a23f7c82a8089dd322 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:52 +0100 Subject: [PATCH 0697/1620] New translations NodeProxy.java (French) --- .../earth/app/view/Messages_fr.properties | 86 +++++++++++++++++-- 1 file changed, 78 insertions(+), 8 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 28f2316f75..f52885c52c 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,21 +1,91 @@ +/** + * + */ package org.openforis.collect.model.proxy; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +import org.openforis.collect.Proxy; import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.NodeDeleteChange; +import org.openforis.collect.manager.MessageSource; +import org.openforis.idm.model.Attribute; +import org.openforis.idm.model.CodeAttribute; +import org.openforis.idm.model.Entity; +import org.openforis.idm.model.Node; /** - * * @author S. Ricci + * @author M. Togna * */ -public class NodeDeleteChangeProxy extends NodeChangeProxy { +public class NodeProxy implements Proxy { + + private Node node; + protected ProxyContext context; + + public static NodeProxy fromNode(Node node, ProxyContext context) { + if (node instanceof Attribute) { + return new AttributeProxy(null, (Attribute) node, context); + } else if (node instanceof Entity) { + return new EntityProxy(null, (Entity) node, context); + } + return null; + } + + public NodeProxy(EntityProxy parent, Node node, ProxyContext context) { + super(); + this.node = node; + this.context = context; + } - public NodeDeleteChangeProxy(NodeDeleteChange change, ProxyContext context) { - super(change, context); + public static List fromList(EntityProxy parent, + List> list, ProxyContext context) { + List result = new ArrayList<>(); + if(list != null) { + for (Node node : list) { + NodeProxy proxy; + if(node instanceof Attribute) { + if(node instanceof CodeAttribute) { + proxy = new CodeAttributeProxy(parent, (CodeAttribute) node, context); + } else { + proxy = new AttributeProxy(parent, (Attribute) node, context); + } + } else { + proxy = new EntityProxy(parent, (Entity) node, context); + } + result.add(proxy); + } + } + return result; + } + + public Integer getId() { + return node.getInternalId(); } - public Integer getDeletedNodeId() { - return change.getNode().getInternalId(); + public Integer getDefinitionId() { + if(node.getDefinition() == null) { + return null; + } else { + return node.getDefinition().getId(); + } + } + + public Integer getParentId() { + if(node.getParent() == null) { + return null; + } else { + return node.getParent().getInternalId(); + } + } + + protected MessageSource getMessageSource() { + return context.getMessageSource(); } -} \ No newline at end of file + protected Locale getLocale() { + return context.getLocale(); + } +} From 035772efc3ed5e30ae969909292001d357e585d8 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:53 +0100 Subject: [PATCH 0698/1620] New translations NodeProxy.java (Spanish) --- .../earth/app/view/Messages_es.properties | 86 +++++++++++++++++-- 1 file changed, 78 insertions(+), 8 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 28f2316f75..f52885c52c 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,21 +1,91 @@ +/** + * + */ package org.openforis.collect.model.proxy; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +import org.openforis.collect.Proxy; import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.NodeDeleteChange; +import org.openforis.collect.manager.MessageSource; +import org.openforis.idm.model.Attribute; +import org.openforis.idm.model.CodeAttribute; +import org.openforis.idm.model.Entity; +import org.openforis.idm.model.Node; /** - * * @author S. Ricci + * @author M. Togna * */ -public class NodeDeleteChangeProxy extends NodeChangeProxy { +public class NodeProxy implements Proxy { + + private Node node; + protected ProxyContext context; + + public static NodeProxy fromNode(Node node, ProxyContext context) { + if (node instanceof Attribute) { + return new AttributeProxy(null, (Attribute) node, context); + } else if (node instanceof Entity) { + return new EntityProxy(null, (Entity) node, context); + } + return null; + } + + public NodeProxy(EntityProxy parent, Node node, ProxyContext context) { + super(); + this.node = node; + this.context = context; + } - public NodeDeleteChangeProxy(NodeDeleteChange change, ProxyContext context) { - super(change, context); + public static List fromList(EntityProxy parent, + List> list, ProxyContext context) { + List result = new ArrayList<>(); + if(list != null) { + for (Node node : list) { + NodeProxy proxy; + if(node instanceof Attribute) { + if(node instanceof CodeAttribute) { + proxy = new CodeAttributeProxy(parent, (CodeAttribute) node, context); + } else { + proxy = new AttributeProxy(parent, (Attribute) node, context); + } + } else { + proxy = new EntityProxy(parent, (Entity) node, context); + } + result.add(proxy); + } + } + return result; + } + + public Integer getId() { + return node.getInternalId(); } - public Integer getDeletedNodeId() { - return change.getNode().getInternalId(); + public Integer getDefinitionId() { + if(node.getDefinition() == null) { + return null; + } else { + return node.getDefinition().getId(); + } + } + + public Integer getParentId() { + if(node.getParent() == null) { + return null; + } else { + return node.getParent().getInternalId(); + } + } + + protected MessageSource getMessageSource() { + return context.getMessageSource(); } -} \ No newline at end of file + protected Locale getLocale() { + return context.getLocale(); + } +} From 43e0704a1430347ee0a8a3164fb27eb250335138 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:54 +0100 Subject: [PATCH 0699/1620] New translations NodeProxy.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 90 +++++++++++++------ 1 file changed, 63 insertions(+), 27 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index a6fb237683..f52885c52c 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -5,51 +5,87 @@ package org.openforis.collect.model.proxy; import java.util.ArrayList; import java.util.List; +import java.util.Locale; import org.openforis.collect.Proxy; -import org.openforis.idm.model.TaxonOccurrence; +import org.openforis.collect.ProxyContext; +import org.openforis.collect.manager.MessageSource; +import org.openforis.idm.model.Attribute; +import org.openforis.idm.model.CodeAttribute; +import org.openforis.idm.model.Entity; +import org.openforis.idm.model.Node; /** * @author S. Ricci + * @author M. Togna * */ -public class TaxonOccurrenceProxy implements Proxy { +public class NodeProxy implements Proxy { - private TaxonOccurrence occurrence; - - public TaxonOccurrenceProxy(TaxonOccurrence occurence) { - super(); - this.occurrence = occurence; + private Node node; + protected ProxyContext context; + + public static NodeProxy fromNode(Node node, ProxyContext context) { + if (node instanceof Attribute) { + return new AttributeProxy(null, (Attribute) node, context); + } else if (node instanceof Entity) { + return new EntityProxy(null, (Entity) node, context); + } + return null; } - public static List fromList(List list) { - List proxies = new ArrayList<>(); - if (list != null) { - for (TaxonOccurrence item : list) { - proxies.add(new TaxonOccurrenceProxy(item)); + public NodeProxy(EntityProxy parent, Node node, ProxyContext context) { + super(); + this.node = node; + this.context = context; + } + + public static List fromList(EntityProxy parent, + List> list, ProxyContext context) { + List result = new ArrayList<>(); + if(list != null) { + for (Node node : list) { + NodeProxy proxy; + if(node instanceof Attribute) { + if(node instanceof CodeAttribute) { + proxy = new CodeAttributeProxy(parent, (CodeAttribute) node, context); + } else { + proxy = new AttributeProxy(parent, (Attribute) node, context); + } + } else { + proxy = new EntityProxy(parent, (Entity) node, context); + } + result.add(proxy); } } - return proxies; + return result; } - - public String getCode() { - return occurrence.getCode(); + + public Integer getId() { + return node.getInternalId(); } - public String getScientificName() { - return occurrence.getScientificName(); + public Integer getDefinitionId() { + if(node.getDefinition() == null) { + return null; + } else { + return node.getDefinition().getId(); + } } - - public String getVernacularName() { - return occurrence.getVernacularName(); + + public Integer getParentId() { + if(node.getParent() == null) { + return null; + } else { + return node.getParent().getInternalId(); + } } - - public String getLanguageCode() { - return occurrence.getLanguageCode(); + + protected MessageSource getMessageSource() { + return context.getMessageSource(); } - public String getLanguageVariety() { - return occurrence.getLanguageVariety(); + protected Locale getLocale() { + return context.getLocale(); } - } From c555fd38a36c5077d86dee36b8b68939a75752ab Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:56 +0100 Subject: [PATCH 0700/1620] New translations NodeProxy.java (English) --- .../earth/app/view/Messages_en.properties | 86 +++++++++++++++++-- 1 file changed, 78 insertions(+), 8 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 28f2316f75..f52885c52c 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,21 +1,91 @@ +/** + * + */ package org.openforis.collect.model.proxy; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +import org.openforis.collect.Proxy; import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.NodeDeleteChange; +import org.openforis.collect.manager.MessageSource; +import org.openforis.idm.model.Attribute; +import org.openforis.idm.model.CodeAttribute; +import org.openforis.idm.model.Entity; +import org.openforis.idm.model.Node; /** - * * @author S. Ricci + * @author M. Togna * */ -public class NodeDeleteChangeProxy extends NodeChangeProxy { +public class NodeProxy implements Proxy { + + private Node node; + protected ProxyContext context; + + public static NodeProxy fromNode(Node node, ProxyContext context) { + if (node instanceof Attribute) { + return new AttributeProxy(null, (Attribute) node, context); + } else if (node instanceof Entity) { + return new EntityProxy(null, (Entity) node, context); + } + return null; + } + + public NodeProxy(EntityProxy parent, Node node, ProxyContext context) { + super(); + this.node = node; + this.context = context; + } - public NodeDeleteChangeProxy(NodeDeleteChange change, ProxyContext context) { - super(change, context); + public static List fromList(EntityProxy parent, + List> list, ProxyContext context) { + List result = new ArrayList<>(); + if(list != null) { + for (Node node : list) { + NodeProxy proxy; + if(node instanceof Attribute) { + if(node instanceof CodeAttribute) { + proxy = new CodeAttributeProxy(parent, (CodeAttribute) node, context); + } else { + proxy = new AttributeProxy(parent, (Attribute) node, context); + } + } else { + proxy = new EntityProxy(parent, (Entity) node, context); + } + result.add(proxy); + } + } + return result; + } + + public Integer getId() { + return node.getInternalId(); } - public Integer getDeletedNodeId() { - return change.getNode().getInternalId(); + public Integer getDefinitionId() { + if(node.getDefinition() == null) { + return null; + } else { + return node.getDefinition().getId(); + } + } + + public Integer getParentId() { + if(node.getParent() == null) { + return null; + } else { + return node.getParent().getInternalId(); + } + } + + protected MessageSource getMessageSource() { + return context.getMessageSource(); } -} \ No newline at end of file + protected Locale getLocale() { + return context.getLocale(); + } +} From 7314052e2bd266d69037de4143fa2bc4658a3fc0 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:57 +0100 Subject: [PATCH 0701/1620] New translations RecordProxy.java (French) --- .../earth/app/view/Messages_fr.properties | 193 +++++++++++++----- 1 file changed, 139 insertions(+), 54 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index f52885c52c..af82dc31fd 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -4,88 +4,173 @@ package org.openforis.collect.model.proxy; import java.util.ArrayList; +import java.util.Date; import java.util.List; -import java.util.Locale; import org.openforis.collect.Proxy; import org.openforis.collect.ProxyContext; -import org.openforis.collect.manager.MessageSource; -import org.openforis.idm.model.Attribute; -import org.openforis.idm.model.CodeAttribute; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.State; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.User; import org.openforis.idm.model.Entity; -import org.openforis.idm.model.Node; /** - * @author S. Ricci * @author M. Togna - * + * @author S. Ricci + * */ -public class NodeProxy implements Proxy { +public class RecordProxy implements Proxy { - private Node node; - protected ProxyContext context; - - public static NodeProxy fromNode(Node node, ProxyContext context) { - if (node instanceof Attribute) { - return new AttributeProxy(null, (Attribute) node, context); - } else if (node instanceof Entity) { - return new EntityProxy(null, (Entity) node, context); - } - return null; - } + private CollectRecord record; + private ProxyContext context; + + private Integer errors; + private Integer skipped; + private Integer missing; + private Integer missingErrors; + private Integer missingWarnings; + private Integer warnings; + private UserProxy owner; - public NodeProxy(EntityProxy parent, Node node, ProxyContext context) { - super(); - this.node = node; + public RecordProxy(CollectRecord record, ProxyContext context) { + this.record = record; this.context = context; + + errors = record.getErrors(); + skipped = record.getSkipped(); + missing = record.getMissing(); + missingErrors = record.getMissingErrors(); + missingWarnings = record.getMissingWarnings(); + warnings = record.getWarnings(); + owner = record.getOwner() == null ? null: new UserProxy(record.getOwner()); } - public static List fromList(EntityProxy parent, - List> list, ProxyContext context) { - List result = new ArrayList<>(); - if(list != null) { - for (Node node : list) { - NodeProxy proxy; - if(node instanceof Attribute) { - if(node instanceof CodeAttribute) { - proxy = new CodeAttributeProxy(parent, (CodeAttribute) node, context); - } else { - proxy = new AttributeProxy(parent, (Attribute) node, context); - } - } else { - proxy = new EntityProxy(parent, (Entity) node, context); - } - result.add(proxy); + public static List fromList(List records, ProxyContext context) { + List result = new ArrayList<>(); + if ( records != null ) { + for (CollectRecord collectRecord : records) { + result.add(new RecordProxy(collectRecord, context)); } } return result; } + public Step getStep() { + return record.getStep(); + } + + public State getState() { + return record.getState(); + } + + public Date getCreationDate() { + return record.getCreationDate(); + } + + public UserProxy getCreatedBy() { + User createdBy = record.getCreatedBy(); + return createdBy == null ? null: new UserProxy(createdBy); + } + + public Date getModifiedDate() { + return record.getModifiedDate(); + } + public Integer getId() { - return node.getInternalId(); + return record.getId(); } - public Integer getDefinitionId() { - if(node.getDefinition() == null) { - return null; - } else { - return node.getDefinition().getId(); - } + public UserProxy getModifiedBy() { + User modifiedBy = record.getModifiedBy(); + return modifiedBy == null ? null: new UserProxy(modifiedBy); } - public Integer getParentId() { - if(node.getParent() == null) { - return null; - } else { - return node.getParent().getInternalId(); + public EntityProxy getRootEntity() { + Entity rootEntity = record.getRootEntity(); + return rootEntity == null ? null: new EntityProxy(null, record.getRootEntity(), context); + } + + public List getRootEntityKeys() { + return record.getRootEntityKeyValues(); + } + + public List getEntityCounts() { + return record.getEntityCounts(); + } + + public boolean isEntryComplete() { + if(record.getStep() != null) { + switch(record.getStep()) { + case ENTRY: + return false; + case CLEANSING: + case ANALYSIS: + return true; + } } + return false; } - protected MessageSource getMessageSource() { - return context.getMessageSource(); + public boolean isCleansingComplete() { + return ( + record.getStep() != null && record.getStep().equals( Step.ANALYSIS) + ); } - protected Locale getLocale() { - return context.getLocale(); + public Integer getErrors() { + return errors; + } + + public void setErrors(Integer errors) { + this.errors = errors; + } + + public Integer getSkipped() { + return skipped; + } + + public void setSkipped(Integer skipped) { + this.skipped = skipped; + } + + public Integer getMissing() { + return missing; + } + + public void setMissing(Integer missing) { + this.missing = missing; + } + + public Integer getWarnings() { + return warnings; + } + + public void setWarnings(Integer warnings) { + this.warnings = warnings; + } + + public Integer getMissingErrors() { + return missingErrors; + } + + public void setMissingErrors(Integer missingErrors) { + this.missingErrors = missingErrors; + } + + public Integer getMissingWarnings() { + return missingWarnings; + } + + public void setMissingWarnings(Integer missingWarnings) { + this.missingWarnings = missingWarnings; + } + + public UserProxy getOwner() { + return owner; + } + + public void setOwner(UserProxy owner) { + this.owner = owner; } } From 76d4e3f6fe56adb9d144f7b35b0ae1113803877d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:58 +0100 Subject: [PATCH 0702/1620] New translations RecordProxy.java (Spanish) --- .../earth/app/view/Messages_es.properties | 193 +++++++++++++----- 1 file changed, 139 insertions(+), 54 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index f52885c52c..af82dc31fd 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -4,88 +4,173 @@ package org.openforis.collect.model.proxy; import java.util.ArrayList; +import java.util.Date; import java.util.List; -import java.util.Locale; import org.openforis.collect.Proxy; import org.openforis.collect.ProxyContext; -import org.openforis.collect.manager.MessageSource; -import org.openforis.idm.model.Attribute; -import org.openforis.idm.model.CodeAttribute; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.State; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.User; import org.openforis.idm.model.Entity; -import org.openforis.idm.model.Node; /** - * @author S. Ricci * @author M. Togna - * + * @author S. Ricci + * */ -public class NodeProxy implements Proxy { +public class RecordProxy implements Proxy { - private Node node; - protected ProxyContext context; - - public static NodeProxy fromNode(Node node, ProxyContext context) { - if (node instanceof Attribute) { - return new AttributeProxy(null, (Attribute) node, context); - } else if (node instanceof Entity) { - return new EntityProxy(null, (Entity) node, context); - } - return null; - } + private CollectRecord record; + private ProxyContext context; + + private Integer errors; + private Integer skipped; + private Integer missing; + private Integer missingErrors; + private Integer missingWarnings; + private Integer warnings; + private UserProxy owner; - public NodeProxy(EntityProxy parent, Node node, ProxyContext context) { - super(); - this.node = node; + public RecordProxy(CollectRecord record, ProxyContext context) { + this.record = record; this.context = context; + + errors = record.getErrors(); + skipped = record.getSkipped(); + missing = record.getMissing(); + missingErrors = record.getMissingErrors(); + missingWarnings = record.getMissingWarnings(); + warnings = record.getWarnings(); + owner = record.getOwner() == null ? null: new UserProxy(record.getOwner()); } - public static List fromList(EntityProxy parent, - List> list, ProxyContext context) { - List result = new ArrayList<>(); - if(list != null) { - for (Node node : list) { - NodeProxy proxy; - if(node instanceof Attribute) { - if(node instanceof CodeAttribute) { - proxy = new CodeAttributeProxy(parent, (CodeAttribute) node, context); - } else { - proxy = new AttributeProxy(parent, (Attribute) node, context); - } - } else { - proxy = new EntityProxy(parent, (Entity) node, context); - } - result.add(proxy); + public static List fromList(List records, ProxyContext context) { + List result = new ArrayList<>(); + if ( records != null ) { + for (CollectRecord collectRecord : records) { + result.add(new RecordProxy(collectRecord, context)); } } return result; } + public Step getStep() { + return record.getStep(); + } + + public State getState() { + return record.getState(); + } + + public Date getCreationDate() { + return record.getCreationDate(); + } + + public UserProxy getCreatedBy() { + User createdBy = record.getCreatedBy(); + return createdBy == null ? null: new UserProxy(createdBy); + } + + public Date getModifiedDate() { + return record.getModifiedDate(); + } + public Integer getId() { - return node.getInternalId(); + return record.getId(); } - public Integer getDefinitionId() { - if(node.getDefinition() == null) { - return null; - } else { - return node.getDefinition().getId(); - } + public UserProxy getModifiedBy() { + User modifiedBy = record.getModifiedBy(); + return modifiedBy == null ? null: new UserProxy(modifiedBy); } - public Integer getParentId() { - if(node.getParent() == null) { - return null; - } else { - return node.getParent().getInternalId(); + public EntityProxy getRootEntity() { + Entity rootEntity = record.getRootEntity(); + return rootEntity == null ? null: new EntityProxy(null, record.getRootEntity(), context); + } + + public List getRootEntityKeys() { + return record.getRootEntityKeyValues(); + } + + public List getEntityCounts() { + return record.getEntityCounts(); + } + + public boolean isEntryComplete() { + if(record.getStep() != null) { + switch(record.getStep()) { + case ENTRY: + return false; + case CLEANSING: + case ANALYSIS: + return true; + } } + return false; } - protected MessageSource getMessageSource() { - return context.getMessageSource(); + public boolean isCleansingComplete() { + return ( + record.getStep() != null && record.getStep().equals( Step.ANALYSIS) + ); } - protected Locale getLocale() { - return context.getLocale(); + public Integer getErrors() { + return errors; + } + + public void setErrors(Integer errors) { + this.errors = errors; + } + + public Integer getSkipped() { + return skipped; + } + + public void setSkipped(Integer skipped) { + this.skipped = skipped; + } + + public Integer getMissing() { + return missing; + } + + public void setMissing(Integer missing) { + this.missing = missing; + } + + public Integer getWarnings() { + return warnings; + } + + public void setWarnings(Integer warnings) { + this.warnings = warnings; + } + + public Integer getMissingErrors() { + return missingErrors; + } + + public void setMissingErrors(Integer missingErrors) { + this.missingErrors = missingErrors; + } + + public Integer getMissingWarnings() { + return missingWarnings; + } + + public void setMissingWarnings(Integer missingWarnings) { + this.missingWarnings = missingWarnings; + } + + public UserProxy getOwner() { + return owner; + } + + public void setOwner(UserProxy owner) { + this.owner = owner; } } From f0f3541e1d4253c55a8cc09a473d7b9aef6ee3d6 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:33:59 +0100 Subject: [PATCH 0703/1620] New translations RecordProxy.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 193 +++++++++++++----- 1 file changed, 139 insertions(+), 54 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index f52885c52c..af82dc31fd 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -4,88 +4,173 @@ package org.openforis.collect.model.proxy; import java.util.ArrayList; +import java.util.Date; import java.util.List; -import java.util.Locale; import org.openforis.collect.Proxy; import org.openforis.collect.ProxyContext; -import org.openforis.collect.manager.MessageSource; -import org.openforis.idm.model.Attribute; -import org.openforis.idm.model.CodeAttribute; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.State; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.User; import org.openforis.idm.model.Entity; -import org.openforis.idm.model.Node; /** - * @author S. Ricci * @author M. Togna - * + * @author S. Ricci + * */ -public class NodeProxy implements Proxy { +public class RecordProxy implements Proxy { - private Node node; - protected ProxyContext context; - - public static NodeProxy fromNode(Node node, ProxyContext context) { - if (node instanceof Attribute) { - return new AttributeProxy(null, (Attribute) node, context); - } else if (node instanceof Entity) { - return new EntityProxy(null, (Entity) node, context); - } - return null; - } + private CollectRecord record; + private ProxyContext context; + + private Integer errors; + private Integer skipped; + private Integer missing; + private Integer missingErrors; + private Integer missingWarnings; + private Integer warnings; + private UserProxy owner; - public NodeProxy(EntityProxy parent, Node node, ProxyContext context) { - super(); - this.node = node; + public RecordProxy(CollectRecord record, ProxyContext context) { + this.record = record; this.context = context; + + errors = record.getErrors(); + skipped = record.getSkipped(); + missing = record.getMissing(); + missingErrors = record.getMissingErrors(); + missingWarnings = record.getMissingWarnings(); + warnings = record.getWarnings(); + owner = record.getOwner() == null ? null: new UserProxy(record.getOwner()); } - public static List fromList(EntityProxy parent, - List> list, ProxyContext context) { - List result = new ArrayList<>(); - if(list != null) { - for (Node node : list) { - NodeProxy proxy; - if(node instanceof Attribute) { - if(node instanceof CodeAttribute) { - proxy = new CodeAttributeProxy(parent, (CodeAttribute) node, context); - } else { - proxy = new AttributeProxy(parent, (Attribute) node, context); - } - } else { - proxy = new EntityProxy(parent, (Entity) node, context); - } - result.add(proxy); + public static List fromList(List records, ProxyContext context) { + List result = new ArrayList<>(); + if ( records != null ) { + for (CollectRecord collectRecord : records) { + result.add(new RecordProxy(collectRecord, context)); } } return result; } + public Step getStep() { + return record.getStep(); + } + + public State getState() { + return record.getState(); + } + + public Date getCreationDate() { + return record.getCreationDate(); + } + + public UserProxy getCreatedBy() { + User createdBy = record.getCreatedBy(); + return createdBy == null ? null: new UserProxy(createdBy); + } + + public Date getModifiedDate() { + return record.getModifiedDate(); + } + public Integer getId() { - return node.getInternalId(); + return record.getId(); } - public Integer getDefinitionId() { - if(node.getDefinition() == null) { - return null; - } else { - return node.getDefinition().getId(); - } + public UserProxy getModifiedBy() { + User modifiedBy = record.getModifiedBy(); + return modifiedBy == null ? null: new UserProxy(modifiedBy); } - public Integer getParentId() { - if(node.getParent() == null) { - return null; - } else { - return node.getParent().getInternalId(); + public EntityProxy getRootEntity() { + Entity rootEntity = record.getRootEntity(); + return rootEntity == null ? null: new EntityProxy(null, record.getRootEntity(), context); + } + + public List getRootEntityKeys() { + return record.getRootEntityKeyValues(); + } + + public List getEntityCounts() { + return record.getEntityCounts(); + } + + public boolean isEntryComplete() { + if(record.getStep() != null) { + switch(record.getStep()) { + case ENTRY: + return false; + case CLEANSING: + case ANALYSIS: + return true; + } } + return false; } - protected MessageSource getMessageSource() { - return context.getMessageSource(); + public boolean isCleansingComplete() { + return ( + record.getStep() != null && record.getStep().equals( Step.ANALYSIS) + ); } - protected Locale getLocale() { - return context.getLocale(); + public Integer getErrors() { + return errors; + } + + public void setErrors(Integer errors) { + this.errors = errors; + } + + public Integer getSkipped() { + return skipped; + } + + public void setSkipped(Integer skipped) { + this.skipped = skipped; + } + + public Integer getMissing() { + return missing; + } + + public void setMissing(Integer missing) { + this.missing = missing; + } + + public Integer getWarnings() { + return warnings; + } + + public void setWarnings(Integer warnings) { + this.warnings = warnings; + } + + public Integer getMissingErrors() { + return missingErrors; + } + + public void setMissingErrors(Integer missingErrors) { + this.missingErrors = missingErrors; + } + + public Integer getMissingWarnings() { + return missingWarnings; + } + + public void setMissingWarnings(Integer missingWarnings) { + this.missingWarnings = missingWarnings; + } + + public UserProxy getOwner() { + return owner; + } + + public void setOwner(UserProxy owner) { + this.owner = owner; } } From d0cf33efc67087c3db0b14f2f21104e12bd422dc Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:01 +0100 Subject: [PATCH 0704/1620] New translations RecordProxy.java (English) --- .../earth/app/view/Messages_en.properties | 193 +++++++++++++----- 1 file changed, 139 insertions(+), 54 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index f52885c52c..af82dc31fd 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -4,88 +4,173 @@ package org.openforis.collect.model.proxy; import java.util.ArrayList; +import java.util.Date; import java.util.List; -import java.util.Locale; import org.openforis.collect.Proxy; import org.openforis.collect.ProxyContext; -import org.openforis.collect.manager.MessageSource; -import org.openforis.idm.model.Attribute; -import org.openforis.idm.model.CodeAttribute; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.State; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.User; import org.openforis.idm.model.Entity; -import org.openforis.idm.model.Node; /** - * @author S. Ricci * @author M. Togna - * + * @author S. Ricci + * */ -public class NodeProxy implements Proxy { +public class RecordProxy implements Proxy { - private Node node; - protected ProxyContext context; - - public static NodeProxy fromNode(Node node, ProxyContext context) { - if (node instanceof Attribute) { - return new AttributeProxy(null, (Attribute) node, context); - } else if (node instanceof Entity) { - return new EntityProxy(null, (Entity) node, context); - } - return null; - } + private CollectRecord record; + private ProxyContext context; + + private Integer errors; + private Integer skipped; + private Integer missing; + private Integer missingErrors; + private Integer missingWarnings; + private Integer warnings; + private UserProxy owner; - public NodeProxy(EntityProxy parent, Node node, ProxyContext context) { - super(); - this.node = node; + public RecordProxy(CollectRecord record, ProxyContext context) { + this.record = record; this.context = context; + + errors = record.getErrors(); + skipped = record.getSkipped(); + missing = record.getMissing(); + missingErrors = record.getMissingErrors(); + missingWarnings = record.getMissingWarnings(); + warnings = record.getWarnings(); + owner = record.getOwner() == null ? null: new UserProxy(record.getOwner()); } - public static List fromList(EntityProxy parent, - List> list, ProxyContext context) { - List result = new ArrayList<>(); - if(list != null) { - for (Node node : list) { - NodeProxy proxy; - if(node instanceof Attribute) { - if(node instanceof CodeAttribute) { - proxy = new CodeAttributeProxy(parent, (CodeAttribute) node, context); - } else { - proxy = new AttributeProxy(parent, (Attribute) node, context); - } - } else { - proxy = new EntityProxy(parent, (Entity) node, context); - } - result.add(proxy); + public static List fromList(List records, ProxyContext context) { + List result = new ArrayList<>(); + if ( records != null ) { + for (CollectRecord collectRecord : records) { + result.add(new RecordProxy(collectRecord, context)); } } return result; } + public Step getStep() { + return record.getStep(); + } + + public State getState() { + return record.getState(); + } + + public Date getCreationDate() { + return record.getCreationDate(); + } + + public UserProxy getCreatedBy() { + User createdBy = record.getCreatedBy(); + return createdBy == null ? null: new UserProxy(createdBy); + } + + public Date getModifiedDate() { + return record.getModifiedDate(); + } + public Integer getId() { - return node.getInternalId(); + return record.getId(); } - public Integer getDefinitionId() { - if(node.getDefinition() == null) { - return null; - } else { - return node.getDefinition().getId(); - } + public UserProxy getModifiedBy() { + User modifiedBy = record.getModifiedBy(); + return modifiedBy == null ? null: new UserProxy(modifiedBy); } - public Integer getParentId() { - if(node.getParent() == null) { - return null; - } else { - return node.getParent().getInternalId(); + public EntityProxy getRootEntity() { + Entity rootEntity = record.getRootEntity(); + return rootEntity == null ? null: new EntityProxy(null, record.getRootEntity(), context); + } + + public List getRootEntityKeys() { + return record.getRootEntityKeyValues(); + } + + public List getEntityCounts() { + return record.getEntityCounts(); + } + + public boolean isEntryComplete() { + if(record.getStep() != null) { + switch(record.getStep()) { + case ENTRY: + return false; + case CLEANSING: + case ANALYSIS: + return true; + } } + return false; } - protected MessageSource getMessageSource() { - return context.getMessageSource(); + public boolean isCleansingComplete() { + return ( + record.getStep() != null && record.getStep().equals( Step.ANALYSIS) + ); } - protected Locale getLocale() { - return context.getLocale(); + public Integer getErrors() { + return errors; + } + + public void setErrors(Integer errors) { + this.errors = errors; + } + + public Integer getSkipped() { + return skipped; + } + + public void setSkipped(Integer skipped) { + this.skipped = skipped; + } + + public Integer getMissing() { + return missing; + } + + public void setMissing(Integer missing) { + this.missing = missing; + } + + public Integer getWarnings() { + return warnings; + } + + public void setWarnings(Integer warnings) { + this.warnings = warnings; + } + + public Integer getMissingErrors() { + return missingErrors; + } + + public void setMissingErrors(Integer missingErrors) { + this.missingErrors = missingErrors; + } + + public Integer getMissingWarnings() { + return missingWarnings; + } + + public void setMissingWarnings(Integer missingWarnings) { + this.missingWarnings = missingWarnings; + } + + public UserProxy getOwner() { + return owner; + } + + public void setOwner(UserProxy owner) { + this.owner = owner; } } From f61675415032d2b6ae7cb9be52a5f1af5b3c3f3e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:02 +0100 Subject: [PATCH 0705/1620] New translations TaxonOccurrenceProxy.java (French) --- .../earth/app/view/Messages_fr.properties | 167 +++--------------- 1 file changed, 23 insertions(+), 144 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index af82dc31fd..a6fb237683 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -4,173 +4,52 @@ package org.openforis.collect.model.proxy; import java.util.ArrayList; -import java.util.Date; import java.util.List; import org.openforis.collect.Proxy; -import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.State; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.User; -import org.openforis.idm.model.Entity; +import org.openforis.idm.model.TaxonOccurrence; /** - * @author M. Togna * @author S. Ricci - * + * */ -public class RecordProxy implements Proxy { - - private CollectRecord record; - private ProxyContext context; +public class TaxonOccurrenceProxy implements Proxy { - private Integer errors; - private Integer skipped; - private Integer missing; - private Integer missingErrors; - private Integer missingWarnings; - private Integer warnings; - private UserProxy owner; - - public RecordProxy(CollectRecord record, ProxyContext context) { - this.record = record; - this.context = context; - - errors = record.getErrors(); - skipped = record.getSkipped(); - missing = record.getMissing(); - missingErrors = record.getMissingErrors(); - missingWarnings = record.getMissingWarnings(); - warnings = record.getWarnings(); - owner = record.getOwner() == null ? null: new UserProxy(record.getOwner()); - } + private TaxonOccurrence occurrence; - public static List fromList(List records, ProxyContext context) { - List result = new ArrayList<>(); - if ( records != null ) { - for (CollectRecord collectRecord : records) { - result.add(new RecordProxy(collectRecord, context)); - } - } - return result; + public TaxonOccurrenceProxy(TaxonOccurrence occurence) { + super(); + this.occurrence = occurence; } - public Step getStep() { - return record.getStep(); - } - - public State getState() { - return record.getState(); - } - - public Date getCreationDate() { - return record.getCreationDate(); - } - - public UserProxy getCreatedBy() { - User createdBy = record.getCreatedBy(); - return createdBy == null ? null: new UserProxy(createdBy); - } - - public Date getModifiedDate() { - return record.getModifiedDate(); - } - - public Integer getId() { - return record.getId(); - } - - public UserProxy getModifiedBy() { - User modifiedBy = record.getModifiedBy(); - return modifiedBy == null ? null: new UserProxy(modifiedBy); - } - - public EntityProxy getRootEntity() { - Entity rootEntity = record.getRootEntity(); - return rootEntity == null ? null: new EntityProxy(null, record.getRootEntity(), context); - } - - public List getRootEntityKeys() { - return record.getRootEntityKeyValues(); - } - - public List getEntityCounts() { - return record.getEntityCounts(); - } - - public boolean isEntryComplete() { - if(record.getStep() != null) { - switch(record.getStep()) { - case ENTRY: - return false; - case CLEANSING: - case ANALYSIS: - return true; + public static List fromList(List list) { + List proxies = new ArrayList<>(); + if (list != null) { + for (TaxonOccurrence item : list) { + proxies.add(new TaxonOccurrenceProxy(item)); } } - return false; - } - - public boolean isCleansingComplete() { - return ( - record.getStep() != null && record.getStep().equals( Step.ANALYSIS) - ); - } - - public Integer getErrors() { - return errors; - } - - public void setErrors(Integer errors) { - this.errors = errors; - } - - public Integer getSkipped() { - return skipped; + return proxies; } - public void setSkipped(Integer skipped) { - this.skipped = skipped; + public String getCode() { + return occurrence.getCode(); } - public Integer getMissing() { - return missing; + public String getScientificName() { + return occurrence.getScientificName(); } - public void setMissing(Integer missing) { - this.missing = missing; + public String getVernacularName() { + return occurrence.getVernacularName(); } - public Integer getWarnings() { - return warnings; + public String getLanguageCode() { + return occurrence.getLanguageCode(); } - public void setWarnings(Integer warnings) { - this.warnings = warnings; - } - - public Integer getMissingErrors() { - return missingErrors; - } - - public void setMissingErrors(Integer missingErrors) { - this.missingErrors = missingErrors; - } - - public Integer getMissingWarnings() { - return missingWarnings; - } - - public void setMissingWarnings(Integer missingWarnings) { - this.missingWarnings = missingWarnings; - } - - public UserProxy getOwner() { - return owner; + public String getLanguageVariety() { + return occurrence.getLanguageVariety(); } - public void setOwner(UserProxy owner) { - this.owner = owner; - } } From 0a0f6fffff5b5aba402b7b750b043ea8f3560314 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:03 +0100 Subject: [PATCH 0706/1620] New translations TaxonOccurrenceProxy.java (Spanish) --- .../earth/app/view/Messages_es.properties | 167 +++--------------- 1 file changed, 23 insertions(+), 144 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index af82dc31fd..a6fb237683 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -4,173 +4,52 @@ package org.openforis.collect.model.proxy; import java.util.ArrayList; -import java.util.Date; import java.util.List; import org.openforis.collect.Proxy; -import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.State; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.User; -import org.openforis.idm.model.Entity; +import org.openforis.idm.model.TaxonOccurrence; /** - * @author M. Togna * @author S. Ricci - * + * */ -public class RecordProxy implements Proxy { - - private CollectRecord record; - private ProxyContext context; +public class TaxonOccurrenceProxy implements Proxy { - private Integer errors; - private Integer skipped; - private Integer missing; - private Integer missingErrors; - private Integer missingWarnings; - private Integer warnings; - private UserProxy owner; - - public RecordProxy(CollectRecord record, ProxyContext context) { - this.record = record; - this.context = context; - - errors = record.getErrors(); - skipped = record.getSkipped(); - missing = record.getMissing(); - missingErrors = record.getMissingErrors(); - missingWarnings = record.getMissingWarnings(); - warnings = record.getWarnings(); - owner = record.getOwner() == null ? null: new UserProxy(record.getOwner()); - } + private TaxonOccurrence occurrence; - public static List fromList(List records, ProxyContext context) { - List result = new ArrayList<>(); - if ( records != null ) { - for (CollectRecord collectRecord : records) { - result.add(new RecordProxy(collectRecord, context)); - } - } - return result; + public TaxonOccurrenceProxy(TaxonOccurrence occurence) { + super(); + this.occurrence = occurence; } - public Step getStep() { - return record.getStep(); - } - - public State getState() { - return record.getState(); - } - - public Date getCreationDate() { - return record.getCreationDate(); - } - - public UserProxy getCreatedBy() { - User createdBy = record.getCreatedBy(); - return createdBy == null ? null: new UserProxy(createdBy); - } - - public Date getModifiedDate() { - return record.getModifiedDate(); - } - - public Integer getId() { - return record.getId(); - } - - public UserProxy getModifiedBy() { - User modifiedBy = record.getModifiedBy(); - return modifiedBy == null ? null: new UserProxy(modifiedBy); - } - - public EntityProxy getRootEntity() { - Entity rootEntity = record.getRootEntity(); - return rootEntity == null ? null: new EntityProxy(null, record.getRootEntity(), context); - } - - public List getRootEntityKeys() { - return record.getRootEntityKeyValues(); - } - - public List getEntityCounts() { - return record.getEntityCounts(); - } - - public boolean isEntryComplete() { - if(record.getStep() != null) { - switch(record.getStep()) { - case ENTRY: - return false; - case CLEANSING: - case ANALYSIS: - return true; + public static List fromList(List list) { + List proxies = new ArrayList<>(); + if (list != null) { + for (TaxonOccurrence item : list) { + proxies.add(new TaxonOccurrenceProxy(item)); } } - return false; - } - - public boolean isCleansingComplete() { - return ( - record.getStep() != null && record.getStep().equals( Step.ANALYSIS) - ); - } - - public Integer getErrors() { - return errors; - } - - public void setErrors(Integer errors) { - this.errors = errors; - } - - public Integer getSkipped() { - return skipped; + return proxies; } - public void setSkipped(Integer skipped) { - this.skipped = skipped; + public String getCode() { + return occurrence.getCode(); } - public Integer getMissing() { - return missing; + public String getScientificName() { + return occurrence.getScientificName(); } - public void setMissing(Integer missing) { - this.missing = missing; + public String getVernacularName() { + return occurrence.getVernacularName(); } - public Integer getWarnings() { - return warnings; + public String getLanguageCode() { + return occurrence.getLanguageCode(); } - public void setWarnings(Integer warnings) { - this.warnings = warnings; - } - - public Integer getMissingErrors() { - return missingErrors; - } - - public void setMissingErrors(Integer missingErrors) { - this.missingErrors = missingErrors; - } - - public Integer getMissingWarnings() { - return missingWarnings; - } - - public void setMissingWarnings(Integer missingWarnings) { - this.missingWarnings = missingWarnings; - } - - public UserProxy getOwner() { - return owner; + public String getLanguageVariety() { + return occurrence.getLanguageVariety(); } - public void setOwner(UserProxy owner) { - this.owner = owner; - } } From 4cb074fc4d6583be3a9e72359f000580a3cdaf4f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:04 +0100 Subject: [PATCH 0707/1620] New translations dispatcher-servlet.xml (English) --- .../earth/app/view/Messages_en.properties | 178 +----------------- 1 file changed, 3 insertions(+), 175 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index af82dc31fd..bc1fe5558d 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,176 +1,4 @@ -/** - * - */ -package org.openforis.collect.model.proxy; + + -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -import org.openforis.collect.Proxy; -import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.State; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.User; -import org.openforis.idm.model.Entity; - -/** - * @author M. Togna - * @author S. Ricci - * - */ -public class RecordProxy implements Proxy { - - private CollectRecord record; - private ProxyContext context; - - private Integer errors; - private Integer skipped; - private Integer missing; - private Integer missingErrors; - private Integer missingWarnings; - private Integer warnings; - private UserProxy owner; - - public RecordProxy(CollectRecord record, ProxyContext context) { - this.record = record; - this.context = context; - - errors = record.getErrors(); - skipped = record.getSkipped(); - missing = record.getMissing(); - missingErrors = record.getMissingErrors(); - missingWarnings = record.getMissingWarnings(); - warnings = record.getWarnings(); - owner = record.getOwner() == null ? null: new UserProxy(record.getOwner()); - } - - public static List fromList(List records, ProxyContext context) { - List result = new ArrayList<>(); - if ( records != null ) { - for (CollectRecord collectRecord : records) { - result.add(new RecordProxy(collectRecord, context)); - } - } - return result; - } - - public Step getStep() { - return record.getStep(); - } - - public State getState() { - return record.getState(); - } - - public Date getCreationDate() { - return record.getCreationDate(); - } - - public UserProxy getCreatedBy() { - User createdBy = record.getCreatedBy(); - return createdBy == null ? null: new UserProxy(createdBy); - } - - public Date getModifiedDate() { - return record.getModifiedDate(); - } - - public Integer getId() { - return record.getId(); - } - - public UserProxy getModifiedBy() { - User modifiedBy = record.getModifiedBy(); - return modifiedBy == null ? null: new UserProxy(modifiedBy); - } - - public EntityProxy getRootEntity() { - Entity rootEntity = record.getRootEntity(); - return rootEntity == null ? null: new EntityProxy(null, record.getRootEntity(), context); - } - - public List getRootEntityKeys() { - return record.getRootEntityKeyValues(); - } - - public List getEntityCounts() { - return record.getEntityCounts(); - } - - public boolean isEntryComplete() { - if(record.getStep() != null) { - switch(record.getStep()) { - case ENTRY: - return false; - case CLEANSING: - case ANALYSIS: - return true; - } - } - return false; - } - - public boolean isCleansingComplete() { - return ( - record.getStep() != null && record.getStep().equals( Step.ANALYSIS) - ); - } - - public Integer getErrors() { - return errors; - } - - public void setErrors(Integer errors) { - this.errors = errors; - } - - public Integer getSkipped() { - return skipped; - } - - public void setSkipped(Integer skipped) { - this.skipped = skipped; - } - - public Integer getMissing() { - return missing; - } - - public void setMissing(Integer missing) { - this.missing = missing; - } - - public Integer getWarnings() { - return warnings; - } - - public void setWarnings(Integer warnings) { - this.warnings = warnings; - } - - public Integer getMissingErrors() { - return missingErrors; - } - - public void setMissingErrors(Integer missingErrors) { - this.missingErrors = missingErrors; - } - - public Integer getMissingWarnings() { - return missingWarnings; - } - - public void setMissingWarnings(Integer missingWarnings) { - this.missingWarnings = missingWarnings; - } - - public UserProxy getOwner() { - return owner; - } - - public void setOwner(UserProxy owner) { - this.owner = owner; - } -} + From 4e93ad6af62a899169f35cac9bf5e0c09a654086 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:05 +0100 Subject: [PATCH 0708/1620] New translations index.html (French) --- .../earth/app/view/Messages_fr.properties | 61 ++----------------- 1 file changed, 6 insertions(+), 55 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index a6fb237683..45cb1a2530 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,55 +1,6 @@ -/** - * - */ -package org.openforis.collect.model.proxy; - -import java.util.ArrayList; -import java.util.List; - -import org.openforis.collect.Proxy; -import org.openforis.idm.model.TaxonOccurrence; - -/** - * @author S. Ricci - * - */ -public class TaxonOccurrenceProxy implements Proxy { - - private TaxonOccurrence occurrence; - - public TaxonOccurrenceProxy(TaxonOccurrence occurence) { - super(); - this.occurrence = occurence; - } - - public static List fromList(List list) { - List proxies = new ArrayList<>(); - if (list != null) { - for (TaxonOccurrence item : list) { - proxies.add(new TaxonOccurrenceProxy(item)); - } - } - return proxies; - } - - public String getCode() { - return occurrence.getCode(); - } - - public String getScientificName() { - return occurrence.getScientificName(); - } - - public String getVernacularName() { - return occurrence.getVernacularName(); - } - - public String getLanguageCode() { - return occurrence.getLanguageCode(); - } - - public String getLanguageVariety() { - return occurrence.getLanguageVariety(); - } - -} + + +Collect Earth.
+This server is supposed to be used in conjunction with Google Earth! + + From 64e2f1cc6bb4666d49bb7afbc38e715d976289e4 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:06 +0100 Subject: [PATCH 0709/1620] New translations CollectEarth.png (Portuguese) --- .../earth/app/view/Messages_pt.properties | Bin 3807 -> 19074 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index af82dc31fd65dc5e1dac28394501ade26013f0b0..b6445ac6bf893204dfa034348cf755ec98dacf8a 100644 GIT binary patch literal 19074 zcmbTdbyS?svM36JJHg%E-QC?~aCdii3myoN;O;hPf)5bfLvVL@*F1iEpMCCo>z#Z5 zxU*)>bbnu0b#-+~OI56ziYy8u0U`th1d64lm>cg zx>$Sqn7La)h+DdtTan2-nb}xrSeaS+xs6x}K|ny++Gznjfyzn(7A{UKX8*Kd@pW?j zfQEn&67_X8vv9ETBr~_Nv2zxtxajDiAhWX+rqJb9W>a>Rw6e96^LMw>^jFcc@OQA_ zx1*VO{A>b=a@h`jrALV}@vr>@#tBI$BFvY)#0xGMKNxHaO zk#VzdGFz~*vy<`gu&{G+^YE}Uk#VrGbFi{~e0iAJxdga*1UPuf{_8{W(VM%awSb0{ z%zyRuQ4^-H_4ITVU}g33@nP}dWN~q~VP)s%=l=%>2M6;<3uX^LXHPR@yaVGl*qnWvjm!~kr2c`cWf|IMV@_!?C_V_PGeXxwx*UXiborR6n$?2bQ z{j0Tyr-s%4BIAE-?V;u8YQ?Hy<>BJxZt*c6)|CGN{@~sJxubs?eo!Nz>TdTjDQ1pR zE*4%+R?eRCQoR1Yw(bMc&#szw%9RgLwmBgK8G7%VW86O(&J?*nEkj2O!~?~LOuv94>xnK(FZifRghS`loILMXg8r#mNl(dB;^$Aui>`s-Unt8m`jj$?1 z<4;A=fZ0rQb6I>=-kjGA*=@M6d}p^QOc0 zQfWg{R)#t>p=wA>Nu_T@D-@tJp#{_vm5C2(;ebdO@|Z)j{m3cXv06GL^PaJV!pLV9 zbZE+LbP5G@Nfde=xz&Ui75Z5j;`suB)?ÐQv8PcsF+Tb*~)bHKqTdSVz0)=y>VZ z$opYK)0L)0<<0DpU1|a8VaLIBh66asA`>hW=-N&`HriaHB0q{1m~ns$@d>nt%>z=J zu4Md&L)DQb>AN!{3rQ;Hg4n_oRjGa{Sn_Hs%RXxj`$1=U*j_^4s;D`CtLYE`W--Rc z+q^M$yp~>z`!TKY=y4>@M2! zMMK_oQ)zGu;;1To>N_zV#qw}i&S%+?g{kx6%F*onTX#{7&5VWvxTUXDl-+-&DB=KR zX-tAoZ+$4YxmsUN&#SC`hDeR>4;&A-`Oy zk;La73vn|2h$Jd{^|`_d$x$r4z&5U<=R(!nYi)6Jijg@lmdb?nDA^`cE&i`Rt@($v zX9$C^jNa!eLxR0-eWWWWP{NUs&PZ48GqJn#tgeQ+ggJA4=^2x;LZnk1JvN1t{0=`; zj^P1KVc%D_Vq`TUGCD>juminc=HH*v^B>&D93PE^g6J|tv>4{oko|lf*RpfkKXhvh z4S0Y-+vD@7C{O<}77p~*;jygx$HjR#!dW|Q^~UQwP>D7^1_>k@}Mnqr6`lmD(W>Neo?giyDJ-`2( z6L3Q&ukSN1620C&*fQ9G&d4rLyV@b*6O5Mfvx!H|eCer;3TDXV;NL{bjO{G+1ed)- zO`+syQ|?@SMO7!J4EF6JdFYr$33oN&0X_{%@v64&H(c7BCZlX)2ggp=XYN&5lu29^ zpbr&&`OzN&=LzblR`L<-n@9XxHD!Dw-R;fVQ3UDGsA;D@i_+naUdZl^x;3RuAR?9XT$jkPWbqvuL(8#vI%zurv5965cm^$&7@2<6Mfm`yb| ztESwvze410JJ4nhB7c?|35zlN>s$|7uXIh~`%MQ{U>xZQIP;j@PFpjw@?ZJ{l1qIX z=gv1E)YsL_1Q*|=q}A;0r*7gc4}>2>F%TZ3q-iP7c|KyI!#<<0BECxYXWAk%i4VS7 z;v=Gl)h8tnfZ1*@m0TRaedw;omvSYHhjtGg@Uu~9kBXlWgPBaN>yZ6|00wU`W5>5q zhc3v)(@ioMS_X&Sc}^b3Ih09;fu={%_h-D_o(#{eA0)}dY51DnygZBejvX7=Yt&3i zYZTz|dzLPO16vDoBvyyR!8uywf9x#~n|zNfVz#JmWw5c@c&8~Sq8(&i-CTmIL~GRqhn`ke7fN`_#~~{N-6*FI zaB@&y)Ky+s_tX~E_oVUmc?~QKNR;{#vo!GF4D?z&UJacTv zory6eJNvz)0440a|96^IZ*HCvgcMi_Dm-*qJL=dbAuGw7uH*+Z#61-jK*mHvg986Z zf&!`vr@~-o#8GS$+CXW3l!le)@IY^qnC<+RZ=ly#*26mc=RTSZ?jrX>z9&-0giJA2UiU>X~+^~#{4nkh%(7}d>B#s#fC?ghKi(7GhIaa z^~>_Sw{%N0M?zR7bQ!j!X3$yKQnQAt@~(<-;CCxCPhZL&7n2x z#r9#Xk+K+9QW>P{&`{A3>#t1(Eu#xWKe10xp5D-3E)W)ZF~+n!?DL#%+WZyQ4?VY| z%fG;CQ-v6!h;@sl{i*ywEC0jeF180K$iV zq$K8UL9(ELq3Q+}NCD9A44-jaqlL1rnKX1djs($(InX=;Ka zB83W=QdXtCE<{B&|@h zOfCV$fh-9w zwh_AlC{9nXJ8V|#v!IP?DPM+l>(J1J@yu0kpNTO73*gxp#18=3w~N4L!QG|lW4O@p z$pKERLzBJwUdCG*^z2mWngxp^-t4ypL2ZzZ-|OYHh3uqWMY#UeUdJ~HT^Ompww!|= z!?4oB(c<#pOiArY*k5kQZK4HuqW8ar``dD3s$uE}VFq$R8O2>u- zzEEM`8uF+6c0V$LaNf=*h%mkF&6Jy;ufl>~GB_*(+CfQ)WMGj;~OHM?Hz)^^_E8xA^Zl!D1s5^yFUTmy-&6TSdx4STFoiGg9Mp; z-?H{RT;ixq=-(+A(Z-IOi!HV3>rwVo%|gp=(mQ@YfkG*rL>4rRCG~Z3a2sAjTS9KZ zo-}4&sK+|iBAo0{vL3v(?XBkI7O_l8lotpAz1Ixhj`;hg1k$sR_Ezq+boNZtc_Rvv zaX3>~TC~M>Y*6xHb9(w*su;wdU*7M*mQ(@LQ?m=+EgQ}4HXoaN?!t1;V>r^+90lGx z?{j|sI4Eb5#qRl!`9%Zv5c;b8IMSi1Vscc!IPYE_(>}a|3qbK{Zh15m3k!Flv_pWi z4=3lr80!oopP$t-M|al|$R8%b-a~>}*`Y{`>47%lUpSSLc_gi$rPm9urPo^$^gUl{ zikNVIUteE;;dQ=tH%#YUKgE77$519A$r_bP#pkhT1WT;`#%I7JkV$QxYGF^JsinJ5 zM&`j^_(FB^XCNB8X1dqF`39j@v3i;c&OQL?I?h*Fy}dKvRxEtPeF1IZzRskvq5FWk+sZ9zeA0b9G?)2KuK2csI*4b z?Z);!Efq#C*0SmEOKn7Qp3t-GHp zB?Ki1r59I!vsI4PTMtOG4n2Xif{R#8B7eN^sLx^g>GNU~_}ad1UI4~?kzfDzcVOj5 z@13Z(FZ>s{=yIUzSJ(UWav{FtSR@T1S!gsg1R(09=XG1#R&F3} zP%@cR%;~Px$(0ENl@z|F9|UMt(lo-@0zM)xUqkFtJZCQKY=0 z?9(*-?*D8k+c}KKL|-r;barPmHAwsSbkyhD5^=@x{`a&BV7r+OnA>VyT8Q$S{K4jS z2ff0ySHmHpQJU=PYgPL+qCREw{SpCUV{}1VIL_tTH&t_1_p7a+E&UDNPVhSjtq?k5 zeouWnaPM0|3pf>`-?4T^m^R0q1I(47lVFsE+`eDqdP7 z+jLoP%xE%*1qxIl$mykn#uUZhRh{6u3@xoKK#tgKJX(!zG+L2dHNI8~O_e+N7{QaP z18PqZT%1zavV-m&UFM(FX;v?mH4F~ZWi~D>Fi_KCQ5w7trNKalC#{#^9M{THmgiz3 zs*Siiz~xHfu}p-PMyYfudtj*6`1??zHH-3oy-TjAE86uo$T5D6K%iKr=mma5y%YcNK0)|Gll%bR=fXf26r2Z3WI{--9M@eDG1+$uVG0JN_NaYh@nBdOZXO3ra5QJir5n`mns;mnj%C*v3Erb}0pgw7|t5 z-fLXCngdVzyjCL%)sS{EU9Dz~7h)GD8jgO zs9T8)_@!V{`%BNM?CUR@a>?pwhykT#tDXG;a z;8q!d1axLg^&J6g9xNd}l(=v}7gdz3bB1`G&xZSsm2y+&bmxux=hx@=N1l^nC#Zh< zL4A%J8R1{K#z~%Sl&JIItS9VjQsgp^5#$~E&4+7umt@0xA74C}8%h|ya4D*3o$1B) z-0U|&HN^5K2=)#9#@F=emxmMIDw4y%8k8&Rgi&b!iA~+}CH)8ng3+93xGEK}En@%% zfYs6!diQe4`Ea26kn=ugoDQ47*G}I>I$XYQiWkqVMwL!udqynB8lIGjfPxZBe+GS6 zax~GPipL>vN<35zrlzDni8gRb;zWSp#u0sYRE$ven@1eAG`>wafT{%xMJ{i$zKEN8rn#?+gf{}`~LZB zoUy*eHayvpq$;!~+jfI3&1@Fm@OMoJP1cAv;dkk6l1jPhXl;=6%*W_7}m3>)y%)^FtXC zL!`J;gg9#3JX4r(Tx47q_?li$SVcl)D~N%L@FVic!EzE&;p!m*Pq9aGm|1S->H~|T z_ev=p@fo}VHVH+UuZDP$!kM}V9;qi(iqaMOJ8}CfI^Vc-M7Vu)3CiZ6Ru;NFp6?(h z{<{8EQJj_9GG)!L`JLxgLQ`4z&6R>Uer)^H@4!vAP#!7*NNmgKf@V%Q8sA8Z#lTna z9oVEY&KLa~u3D8ES+?A27kqtn$W))u65B3?(XNEYWd;u7pn`CK#V%QLk|htpb)20r zR$WU7o`(O8%t*btpO8<=-#FSeI&j_2ANE~Da1tkx#nXd0_y>0Y%xflkdg{^ln;4ML z3eBj6^zbCpu5>s);H)HzKN9o?{5oNUTca|`y}MYXU7J_XE+^eG<8Cy!MxP{L=CTnT zAqwhxeM~8Yb6MOa+b^;M7FXJh8Cf0a(Nv+=f~lD5%^+)Q?B3&g22>od__AEwt1=X< zRCPoAiWKYwwiEMZ6IMK&%Z`pC3(?!9D)c0xr76I9>f9QPBy?YW;?>h2l}hC!GO*qr z4pc0yv>W}F=;LlLnTDpn`9$l)1l_lJLkwjqyrlvRw#CzPSlelmlh<&K8?A!1sA&4wJ=@;mqL&Fh;9!#ir2z6~I&R&S=n@wnNICL(uP!T* z0dQboSCqoRB%qI#tA(P$K0d`us{(82n7uK#yG5_b`$t`Y$g^<3&rXO)ll^BH zBe&J01Q*jPoQX10Z(^%u+H@YnDvK+k*vh0fXA%i8hFOhf8c~Eb&N*r)?@|E0sYH@k zHbXx*_TkSR#o0(!ZfLX&xFpmTV8Ea3lo?s6HAajSAnd5*sN0i)!&jzu#w^r(#l>_ z7T)Fsicp8=W*sX{hXy5yT4+Vz1O@4bm@N@o<|$x?C~q!cIFBgV#r6i5Y7U_J zDPf2MA(uYYDzl(y(E4TbHp=iuxhoeqOTPbEx)ByuRL%a8W&QfYw`UMJeolv1>Q6pn zV0!H(Ex187h}9WnZq*&*1x;jycCEv%eUpKZ(~w4 z&x29H(hER_3q2pVK!eRkAl5_%Uml%l26(!_Pu-JWJKjP92CV;c6W*nUZf$i1;Stk>WGk{SYAdao7dCX$ zg#zE01qIaE4pfs#U)RaghJTLXj#o=qX4ArhQ@Op!c-B|`*v+Q8J7HHHWsX?7oG3~7 z=M~;6$Oqsp_u$oI+Nqk6&fCVl8KOCwXbxgYK>0XtL~H)S`krx#ZHlTD-IgUl0`a(* z;=w1V3^|!G-Vo)XCFJc}!H0~f*O;w4FAOQPx~6-+j+#8?th_)R|Ig$VRb`2=_G{Fz zRbBqT=KNW$Uxz{~O>Lpsh|HBb39ZvzKSAc%Hb^&`AdwB0*dxk;_AFDtH{Z>7+30kT ze(6QpNj?=d^~-0gomP;2co?sd4VcRNX)!^=N_#6yo1}`e$Xy2bg^eNNy1rZ zlKQ=xtaNo3?qbQ?0zC*+CJ6+Ji|gPp7Idd;qbcZFhc?Bf%lv?0z|(D8pm&scUE#nS zJkQC#@_74dAAmb8YPIi`#9djz`|&HV_Bzw(AR#lYKDVt zO=vq{*`B5Mywrr4-U%bf)lJ`~Cw^!8*F&UE?2iG=kV0{(kK0x`y-Mz`ghUkzF;?7$BU(#)UqxP zq33b1UPtB2_+}<<4D6U-UeVI6qe79A@q9iX`LQe3nWnNOl=Kx0rm7m&ftIW+QDt_t zm1d3H*!GN#;e|GgUpug!bCV>tRGgZhGxN|1sp9Ee(jX7Nwk%+nf%ATI#?JP>6q8~s z>;B2cq+!pK)kxpu=Ue+ZcX|1cF)=^)%l+L_>Cx$_ZFD;M#Z`l?j81$x6C*v>Ky_B5 zrA!fJQfE`>p4n3~1#U4SB~!JQ!a-z^N%YLVPbn33Ub?h2l(pYYgKk3U_dk5pLGw!N zaojbo%b+dR`mQ9g^ZS&)tq%x)JR{5) zi|mamCQxetw8RjMr_4lKM4oP#BTRU0hS&-?z^JA?G>@6kJ*97(!_@FKUp8YuFPUp) z@)Le;)*$y1kk!=t169$FNJn{M@K#QkmY2jIA40V^UXbtEM$tgA66Crf}_zG9=Gt!?Vyhj0>Gi0Fi+H;Eir1smSt1zv~Yt^=MP|!o4k?tyr zv#Y14s1RLX@+0h)7++xUfi!pijke!{S0^rA`D0c!Kd~Y6s{05oA}b7o1~;#{ks0@e z+uwJWetg~f?#f9pBK)*Sxpgr^xl;;VO>=lT5hHPGncw)=@V>bf96s(mP&A?q7B&d0zZwRiI(_E#4#V=Pu%&! z`^(O$ZB)mhmXi95?zlMuXv8qd0W7PvlBS#EwT>Rskc7D$+;2L2Mhhp#n=HouM~p^Bf}V4e!ST=QBj!PAN9M;?efPqvacrw~hR;5IsFIhb3jEM+gWs#kUIGZ+19Ty~lm}=Nq zKZR{n31wK6AU&)5F)6XGC#Jk_p=}z2N~vKyD^k0{Ts2|MzGy#!)cou4vtrI(^?!;5 zMeW0-TMs3v;xK9g&j8v0?+AvLfQN&Fs->T``qH&}9-6&*AgDA5CMZCbbWowrKrM^= ztg;DgLE2I;Kv}-A=k~YmR;E~XFLSx6%_5{TN=E+Q*KTG5k??HN)B7#73wpZa7|~Ar z?x>(DA+NOy7^F_aS3MNEc-0sax<84Pl|Qzk^j9vr9$tQ*7OKRc73WuPAE=!$v&PBW zS|^jAkr$UZ8E$#f7`?j|!UN0hWTOp?ez?JzRV zNpmI@LA`=Rj#(qwRdYI4|@3{)Cs#E9JfNDb9%D+kmlzs+! z2fY5nge}<)1(d(rh-KJZDgoI{vsGrizEvo}4wnWnNQShw@*obEC|uK_n_%C<$Aen& z^SbD=7JgO4<$>d0c`QZ4OU z3u1J7RWY7Vm^e(HGAyHChgJXxPdb&vS!ZZN*QN8Mns@ar`A5hh+5)zUaaVCrt`~g) zlm!31)};5yFoP~JsK)XJYXHg7po>X7;rp={k!=k1$!*h=h?a0|O%a4PNVGcvwj7(s zqPiqKcMK)iqyX3(4zqMGCDNiN;nANDffKYtCSQ_gy5?T4gIC7~@+*g^l+PcE1ywBb@#;1(^0@h zz_Vn?tq<>795bINtE0o1pUrxgdrv%ZmOj0~z@gMjO`_rUoB>sR#T! zRButa?KM=o$gJN9r|LFyqHT&ZW#pO~S_uZR+(lLKxS?UumdR;iA#{#Zt&ztIS~pV2 zSeF;fo@zFwgz&ZU_hPDYvfw;uP@|N6Yj06>z4JY6Y$3quW^}d1%;+1M-r9m^?c#Fu ztE{{pfyyq17IA)7dX8ljYiC=_P`D!#W7NJ{{Uw`oV>?)v(IQ_KsQb;wZ~IrhSVL9W zLVZ?ILHoxbY#9t%1EB@02$%4ni9v2mxdK(Xt|pHIy@WL)_vS2i&g-8i#`oZuzD!IQ zNmumMh_`NCRbC+yWPmxiuyOZFDsr+CJdnNgWGm(vH*r`dchzJx=S=22^x|!idV`j>=H2G*L6qF>q)YbQN*o z^`_!1v6e@@3E2jcPwAOr{76x>$5?yV(8t==&CTz>(XKCh+()j>&26Eq zH`>RqZQoofjr^QOie*}ig$%1k0E#RO`ukZHc+Z!@n5&)v0-on=ht((-x>h(UeZTNhS+$fpnKC0%+Yp~=VRueL29 ze0GIMcsvK+(eC}Hx*{r|*A-zpm;m(KqO^Y<#ER0(UUyH*{8}B+-?(ppzfLpG_Z_xv zXxW`je0FWU;dtQ22A$vCBF$;57`DOXcC|ydj#)E2+rp433w}&Qxbd4!xza*_hDJEg z1G@ZgvkkAEh7AC8I14t;bgj7_4f*d>g+$t!Jb}V~9M*d3{qHGzC-uZZ*W>8QpJ>a= z9f-7*4Od#6AL26Iyg$}@lIqG$wDQV|$G#jZpIo7S;qh3x_rb)a#+2^o7;#tl97GDg+{PY#&4ZkF@W6zPSou#y^9H0eS zkZ^KHV9U-{_Zct3Z}3bAZ+V1ux}HmXzpC?es@UnM*_qnxi|^wDa#&bitjCOAsG$?U zGW(5~6XU)ZGj%PVE;1uy!;blUEa;|G9R`JIkuI_-EFKgmz{_(jS;hEzvxsU@3zSRa zGb2dZ24e$GKOPM!8<6p=rkAf04ou|{m{4fUgcxz*ETcOGvAE6A0^!UbVU$fhA#@g@ z+6nlxBtBtcjZ%D9RIS-UP(64vq!1a9oUt(Uz-3 zP}+a@5D5j1Wij%2se9EN`Z{_@Vh^|}Lc`dCgF|$s6YCYQ_qP>lA2ik{&rUinF3qqm zG#EhzV4M6P_@pd{PN_SR=s0*|DbqH+^LA{9JV76VmC#>I+DNscK6O1ppf4wD{i@|s zV4Oo8Q*sK1wxu5 zdbQdtVPa7sl9$m$-T5Cyy8NlZc5!{($=4|LNdT0VGE_LVw@|&rO3OKaR__%j7OoE; zQJX5bNE>SL9IC@tOp@au22qf zT&%f*-zT^!22Kk*CZUYFr3@c4*xwTL5zKWTaI8Jx*6eQ-Zgs4U#Zu^&(=tGSNOo70 z;Ae>3YZtQryKs})G{UW}g#A7T<*8Gko5Mo=K)rJRptc$f)cV86$M?;m(h{=j(q96@ z}a}m9+!R7tOb+`No%I&OY zxI|th#tbqDVHid~-JAnn4tlZ3%;pcX{ddL+pRW>4NE-0KP<{{9ys~%SoBI!U)oupy zy;BG&5I_hD;h6d4`Yoq>L`-k1#dU7IdL-fTWR^02aoylS2FR)^ZWI^pk9M|OWa(T% z0HkHXH{J3icvydVYx90wnp%(FiBsGjuY=ziavvhzupbx9O-6%p^_YsD@Y721PtxJ+ zMfr$Q&}l$tgY7RvfwBGYDtYlGt^m~nC^{2rv_kqqX5W~pxokL`SV|B)7m`X8^aPkH zaavnK6JDDJ3qOHGB12A{qKSh^3pQgO;wDk>JaA)=aG~Wj_D5$=&K?E4EQ_FxeQfjVNi*?8MYz>J$VaY)AFoW~OBvoK zqd8sAi%8e{>Z0p#X`SWXzmzEidd;DkzVR{b*ZV8Eu^-ZQ163W-)Og6<_LRbh7f5hf zZJFiGwFj-NOBw)kJg1tJ8=$LdP%T?=5&w&LaT*@?TxIZx6juWajEXjGw}^vUixptc zf^vtrj`cd8wghKvn=UE=W~zYTi=QloVqzWIXfe}duex2`71%{XC9RRsG?+bwLRYhn z_{L2Pmjr;h^zCo^HQ?nFec^%B<*mB(OcNaZ;BFOgAiD9iuIk*AWP^xe`7@!UBGe4X zq0+CERx`KT^}G=AmRc5KJ6kp2`>n$##5e=<U5Q55zVc=R$jH6{mo7V~IXc}}hhPRTQ4r*rBJBB5ZGGpcXv7SZL!k&Z)$M{1zzRF$mr--!AR z_k-v%j3)eWb1!Fse}Y;*$JS`L3cJ>)D4~SuR+tZHhzfgqTY;OZJFM8(seuBa2#;Ms zN2T?KHAMwQP%sQ-iq6pg>|OR*1QO}n*ct8HmqKEg#UiAW@pIlT=9z=)T9 zFFekfi42S$Q2I}k+1hK&-;IbNc{jmBO}&BUIBLd8iPCUosrY)#7Q+o`=(mOqMNjYZ zo6Hv%9!^eoIzqYNX~7Nwk$^Mq9{;~@As%li2KtJ$MSZh0$I%Tmr%>@|b*@|@j0QrB zAlJRQp`t#_=il+N*b|SljPqaP?*-hZRFn(C{Po;z0@Ssaqxp6!GL@b*6F2^dLw4>Y z$+9(7Ic8dG^sDk>ZC--1?N_6G^BH1}OtW|kQd%%P0>`!f9d2q1UVFhFoYenBwJGf0|6`B*x{vzUvx+5aDNohc5ctS z#8xH*nlrGYE2`KG{Dj~Crt&2ktVS%N+cDHaPGpFAtDD0$&4z4B&DLB#63;ARiZeC6 zuf&gBmQH#U$^GRZR+F+GMb+y?*vAF9nipKNET&C}zl4@yl(}In1P6(S<$=-(mJS=# z(o`R#>&LRjfk0x5Z0X~0!_yhvlxc!<(}}ikw)TzCmZ|Ii8phl0b0Mjga*Vy|dKI>3 z-InaMa&@<0!XTE;y>$Eo?X;uJBPzQ##|>s0;!BpCH6%_~Z5ZZ`8zpH5;%;bE@yD$m zBu;CMN7vHCneh_xSf>l(LvWzgN;4tP>@ zqamzpcp$h^jWRp?1(o!jT#K)w>~a<{Bx{z}2|6AkL(1Ip^nEul_U54TZD^{@7-kF-WS_1O> z*a}nAv_$Gg<2-}_Xd-#=pN=aF{edR;uQ4X-Y;wcM88Hs|zQhpYT zAq&rwrGE9k>(I8=YA;u0@7u(qO3dshyb#h1AxOAU2QOJZ>U)Cwh}QL0b_a1`7JKD` z;U~O7-pSibZVJaVA10Ssxuf>o*p+AZSeC{D!mPALp&vcXp}=n^(kdm|j0yDlM>&ni z)h%Wjp#!Y8rSVF5y34x%OZpkHcI(;A%&jE{k~JBgvs+U=Iv8>RPhRmpQty&^NDU$> zU6~}hYU;DlS~K)k2{~_1`;soWZx$0Fnx?ilVs0!sDevV&u^{(E+b@=@1tf6yxce_a zdrlt#-<@-jQCQlV7~#i0b%O&sv(n3w84M}_pzA5%uKsyl(TL^etB6%K*#7r)Kk_z`v}<{Q1MszW2PO{yt6FJ`DfP1NcOD@aIoR@bQ8#1+!q4 z>lLhc@M)YA=~{csGXPTh<0Ahk4St@qOrv_Lh2pTa0+KFM$x86mxxhd}>4vUI!>?1)VWxP+X{YEL$U2IN4-kyuHvVHyBXNsGpJZH4*gfz%; zBdh^_^<`tD6Pt^vyp?}jt{4Jo*JdbLxN(EyT|E#dvm9F?!xY`5ee3xoz~7z$vw{l? z(sMVQr}q#l0Oh3Bua3$p;Q(L7xiau1@!a9GK7J6E1qC zG^qw)0>#QYN)GOi(x6GtpDxEV1qWXk^a$`HR{PXlybdxav412Ep};cH9oC2ZJ-s&_`Qt_2N)&6D*fq;&RWz-a+Yy$eyI1i@TY;BYc zs=G{sqC(S21b3ZJ^yx)cHTc0)bXvjmFn|4rhi3dnrOii@%4aaebYxj&^517(c6FwY z;MI{$%Hf-h_O}c_wsK$HU=~4AX|_;jvJKL$h`KmxWh5PK zBcjN3Kj+!Ly6cNPLSl=GA|h&K{tum~sk5#ky4e3nK3SlT^#}9P$yK{@z&FU=%AvLQkO_7`8X=8o8y6Orbsdzy7M57FDfEhX&!0phe4GxIA?5sw>S@MF z7|m!wH@RAtZTLo_KN7%a6c1QMY_m)V3Y(U`R^G@%=>YBHH(AY;l{zwlE9riO;LV< z8iT1MDp4P&i=lcTHz{A?U-wh65@dGL@F&_B60Rt289Xy4Bvbsh+orT9eR{PH0U=>f zbAT@FlXdwVzd7z|67p)6(nXV*K*Uu(r`ti>r%^=!)0c!Ik=N^P8`$VLb*m1x$fge7 zn)hApZ@e8*uz`(#AI`SwyZi+hMjw~ASOSS|?hIPjo2%xz&K`R$4)GpqGo45R)8*E?j74TTCpo(nmJF;^=R^@9 zYAuxRU2koPbXc)P@&FX6LOL$o>r_ajv8kl|XOoxp)N7*{Z>_BYI3@NlGf|M;nJkYB zJR(ZU76i$g<{K`_Qb?I-7LRq^{2|gykH=7JUTAq9O)lLyj!_O=ESHxN`ST)>K&c8AY#@$}veqpL-oiuSpEj>b)Wt3~700Fmu zHDqZS%~^kCtIJjeU4Ay7kNY{7_c>-;&wMaddf|O*f|0bn?pyvr;Abz`3n$V^1>w6_0o$*2ea^?Tu%1+sd-gS@0zO?`A2$uaOFSojEDxu_^{Kc`a_e1?t;M zdfRtlV$4X6j>LxTh()R0iZrON2;Z_oVea52&C%P0$Dra3{ZWvRT%YsTg`O{DRjQ)Z z6Bsy1x9kKurlX8EKGJ43s*D(yE2v*#ND@jz0v!)$Fe$GBhrtl8XrN$)q%lOu-1=ewOHy^k&?&;gQ=L$dt)q$13~Sm zf|mh`)n8n*&dV*(`O+xBvP!EHuypg@>HsYB5X#6O1+4~{)$D2pcr^*Zun_d|UXpN3 z$h_CWFj9(~R@8(Hp9oAzMM)zhs_ee`S@kmP60YrT+uhxE?TVHF&n^5iVxs)kc>KUv92P8UDjNejM^6kSen@-Spism7+ zU||7+`6owDfB(qoxFp+WvM`EJmB$B3=55K90Z(r@us$5v zo{MMtqp6eA$%7YSgRzuuoygW3V7aRRQV(9e?&j64b?s4^53meG4WnMbGR&1_3M{Lr znUW2{%XtF4FUb1>ychTt%y!bsV1rr(+zjbr z=#Y!|@~n?T3x2O@GciL%RAQ1G$td<;Evw{wBbkM&&8_}VT)F19wQcpT@eZ&S1z5I? z1cCkiX5;ZNE+6Oi!otFe3szhV=Vp08Yl|J%`zX|*89g>)<1n__$NpEk59!4 zP-QAsL;3U0EN;uzh39 z?d`g^x3kUDaFg7SM3wq*J+)@zlI56vCO0FaN@-QLe{1PDxvDkuYd34Q;3CA#q9HkJ z%W{533so?UjHWL9K{Rfh@%kqJXRqD-7dtOMbRqK0!01co$A{u+bJ9a{Hmai@S9bQAD4~zgi_R5YhET1Db4<|DFMkf!C zM-Poh2O~+nB&rH+KytRGFk=I<6umL*yP_j_ReNaXif~9^FX0+vI5ctOBGL*?hg=_X zcR7vZTH$xE@b|p84^0%7l$4XxiF1kcXfg}SSPB*~mX(sSmP1k=RbGza87Ayv!)~F? zBdqkhdjjtDVc*)IXSrmCxb%%PN71`P1O5M; zrAj)oo(y+>4eCzZoNh(bb9jm~R^HK?YQtaEm+TmN?|4g4Rm*n)&VytQupDu;6G!Sz zD>P0BjliwD)5RH0>WCwb)KhfbNXd%6IKN_!hIL76J_br!gyR?$O$9AoK?#gh70p0_ z(yKw;Qi++dgd_?<*3Cdpa^_+zGrH%HHyBWX}_NFC*tG0eprZA0J{4X2&Kqj_l3;7EdH2%aK1 z+Mua-MEiHZJRe#SL`soy9??ZQg#)aHqf_k%m}-=&NgCo*Zr%zV&ty>tKROgHqp87i zWTQyJMH4&&pABW4W4zQN7+GXaeRb>qk%0T&Q7rj{< zCclu4DWkMmpl!KX(#_BU?Yxjn2c`4Vp;HR-IV^T)qXVqvC#q@m$w-;XPjX#@hE`9i zDViSDjA=rGbvHx#SklEVWVo24>C{KnS$deJ6_i+c2@(Q3z*;^I0>iYo-0}j zvIvDRpz7hsg<|p;25AtiZmg5i5IxJkg1s!{AW-hfCf(FEil9ka#M>_RsFi4kU0HNVDp@1g|K1^o!w*?D zwuitG`R2{co8gcbXJ<2Z#^CQ_wyT@3^@cO4HkI7*el3;IRU^BOH>TRkmUq=o$#46s z*-UJAQW^G7{Zdzh5nXkwRK33!+FTv({aPD7v5aVfPka3n{dspMFbmlm{w;c+hGG&6 zOzDX?QnewlAGWAgCQa!7*zw&Dx%*3Vbp$BdtuMv0H^SIjTwo19)Ps4Jiak{9qulhh ztt+jqD)uCrM#NeVUpmpSrmMAPD1?)mfzln{^4@5M3vaVou~Xs&Qf8TOOnLpnwlnaB zU=0-{n%_Z*He4~TlvMiaa6^9;yB&v;1WGd53av%IIli+z#_26T)v5=ADX*`GTebk0 zzI^R%EeZ$;B}>FAr}Q{S-9|FZ+1sor%rhJ)l#N|S{czn21{*=T0^Am;R=`&qZZO$$ z4sjJ;vuuBbIwHUekO3Z0&J2L0Q?S(CNX{uZNsa8JZidVuPUCF<5371PXV=%PAG(hH z?0zm;&tF-nO^HfcK|J0H^4<0;mP*4pg(kOi=6zDO8@5(*YgbFRl~wV^mqnkd;~}Hs zdgu(~U?U8(@cj*HAl9rTUiOpE30tCoDa%HU)THx?U6Q3YD9~3`w{2;?C7G3({(}CtX#?C&ODi_+3@P>&URXF*A)O~F z4KDe#@Pnzao|P$uCvm0diMSGBw~wp4$KM>tE!{re-hW=*tuiyC z2DBQDB%*`mFvMeC3!9&P1&ng@1FH0aXrU}nvK_niW`1UK{ ze3FO^!FzZxq~85oAn!xUn=FXLgA?z51-wrZks)}G&xO=Iy)35v2OHuccoG3EK?wA3 zPDZv-fu$>Ten5TrxRn!()bQ3sn;9l?W$RI&DF;LqBMgZnp+6m-k~U99NuZL*N5+Sd rl0}S_R&qz#wM37+H#l!TO7{|UCUF3egb0re4x5DHz9E3f@qP9mbDjpC From 89f9fdc3d8687f461df2247ad504726819133f40 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:07 +0100 Subject: [PATCH 0710/1620] New translations index.html (Spanish) --- .../earth/app/view/Messages_es.properties | 61 ++----------------- 1 file changed, 6 insertions(+), 55 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index a6fb237683..45cb1a2530 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,55 +1,6 @@ -/** - * - */ -package org.openforis.collect.model.proxy; - -import java.util.ArrayList; -import java.util.List; - -import org.openforis.collect.Proxy; -import org.openforis.idm.model.TaxonOccurrence; - -/** - * @author S. Ricci - * - */ -public class TaxonOccurrenceProxy implements Proxy { - - private TaxonOccurrence occurrence; - - public TaxonOccurrenceProxy(TaxonOccurrence occurence) { - super(); - this.occurrence = occurence; - } - - public static List fromList(List list) { - List proxies = new ArrayList<>(); - if (list != null) { - for (TaxonOccurrence item : list) { - proxies.add(new TaxonOccurrenceProxy(item)); - } - } - return proxies; - } - - public String getCode() { - return occurrence.getCode(); - } - - public String getScientificName() { - return occurrence.getScientificName(); - } - - public String getVernacularName() { - return occurrence.getVernacularName(); - } - - public String getLanguageCode() { - return occurrence.getLanguageCode(); - } - - public String getLanguageVariety() { - return occurrence.getLanguageVariety(); - } - -} + + +Collect Earth.
+This server is supposed to be used in conjunction with Google Earth! + + From 3f886c78a7be1473d552093515ab31e12730ef1f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:08 +0100 Subject: [PATCH 0711/1620] New translations installer_icon.icns (French) --- .../earth/app/view/Messages_fr.properties | Bin 119 -> 11933 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 45cb1a25304930afe36577d6c4fd36a231460dcf..0589f39b42ac62e1df44c27797657da2936753cd 100644 GIT binary patch literal 11933 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 literal 119 zcmXBN!41P85CzdYRs1wy8d!0OA~%o*0$v#`!Xj7_xqHjv_D(Yt^_!g`FWc$NQ*!2@ zczv42g?zKlykqL<+kif#?4d^q#UCJO;Yer8nKG(nP=%?$j$-T`MUt3 CTqw2x From ebd32fa97cbffac788eb68e029feb3b5787e631b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:09 +0100 Subject: [PATCH 0712/1620] New translations fao-logo.png (English) --- .../earth/app/view/Messages_en.properties | Bin 582 -> 3038 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index bc1fe5558de89324a103f2396e7fb28dc25d3243..2eeeadd2c16af47e2282400756fb6654d7ff27bd 100644 GIT binary patch literal 3038 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 literal 582 zcmb8sy$*sf6b0a&r)auEQ5Qq_*_?1v6W3abHcCr+8{5aX6c|_x?C0yb_cpIw_d#E- zK`2?^U6NwNB~y)%&jR1Br}&7gGRhyENjTczKL(oX{H z#XCv@!K2CA4|i+fke!_av0(NPD)wo*BlmNC301L>V5nq#R{g^KnX#V*Q_^r}*19R~ yHHd87w^odra72XAh70-hmN*%=iNkdh2hHHuzA%lw8O)`VA8K(KMfv#0W%L8Nh|)L! From 2c6fe438f6e1c003800d8c66006ec7fbe6cc7cdd Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:10 +0100 Subject: [PATCH 0713/1620] New translations fao-logo.png (Portuguese) --- .../earth/app/view/Messages_pt.properties | Bin 19074 -> 3038 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index b6445ac6bf893204dfa034348cf755ec98dacf8a..2eeeadd2c16af47e2282400756fb6654d7ff27bd 100644 GIT binary patch literal 3038 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 literal 19074 zcmbTdbyS?svM36JJHg%E-QC?~aCdii3myoN;O;hPf)5bfLvVL@*F1iEpMCCo>z#Z5 zxU*)>bbnu0b#-+~OI56ziYy8u0U`th1d64lm>cg zx>$Sqn7La)h+DdtTan2-nb}xrSeaS+xs6x}K|ny++Gznjfyzn(7A{UKX8*Kd@pW?j zfQEn&67_X8vv9ETBr~_Nv2zxtxajDiAhWX+rqJb9W>a>Rw6e96^LMw>^jFcc@OQA_ zx1*VO{A>b=a@h`jrALV}@vr>@#tBI$BFvY)#0xGMKNxHaO zk#VzdGFz~*vy<`gu&{G+^YE}Uk#VrGbFi{~e0iAJxdga*1UPuf{_8{W(VM%awSb0{ z%zyRuQ4^-H_4ITVU}g33@nP}dWN~q~VP)s%=l=%>2M6;<3uX^LXHPR@yaVGl*qnWvjm!~kr2c`cWf|IMV@_!?C_V_PGeXxwx*UXiborR6n$?2bQ z{j0Tyr-s%4BIAE-?V;u8YQ?Hy<>BJxZt*c6)|CGN{@~sJxubs?eo!Nz>TdTjDQ1pR zE*4%+R?eRCQoR1Yw(bMc&#szw%9RgLwmBgK8G7%VW86O(&J?*nEkj2O!~?~LOuv94>xnK(FZifRghS`loILMXg8r#mNl(dB;^$Aui>`s-Unt8m`jj$?1 z<4;A=fZ0rQb6I>=-kjGA*=@M6d}p^QOc0 zQfWg{R)#t>p=wA>Nu_T@D-@tJp#{_vm5C2(;ebdO@|Z)j{m3cXv06GL^PaJV!pLV9 zbZE+LbP5G@Nfde=xz&Ui75Z5j;`suB)?ÐQv8PcsF+Tb*~)bHKqTdSVz0)=y>VZ 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 Date: Tue, 29 Nov 2022 12:34:11 +0100 Subject: [PATCH 0714/1620] New translations fao-logo.png (Spanish) --- .../earth/app/view/Messages_es.properties | Bin 119 -> 3038 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 45cb1a25304930afe36577d6c4fd36a231460dcf..2eeeadd2c16af47e2282400756fb6654d7ff27bd 100644 GIT binary patch literal 3038 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 literal 119 zcmXBN!41P85CzdYRs1wy8d!0OA~%o*0$v#`!Xj7_xqHjv_D(Yt^_!g`FWc$NQ*!2@ zczv42g?zKlykqL<+kif#?4d^q#UCJO;Yer8nKG(nP=%?$j$-T`MUt3 CTqw2x From 4a923c17607f938e6f8faa49c4e4d0e2e2889eab Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:12 +0100 Subject: [PATCH 0715/1620] New translations fao-logo.png (French) --- .../earth/app/view/Messages_fr.properties | Bin 11933 -> 3038 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 0589f39b42ac62e1df44c27797657da2936753cd..2eeeadd2c16af47e2282400756fb6654d7ff27bd 100644 GIT binary patch literal 3038 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 literal 11933 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 From f8ce72867589edc042c066762bfc7add5977f742 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:13 +0100 Subject: [PATCH 0716/1620] New translations dockIconMac.png (English) --- .../earth/app/view/Messages_en.properties | Bin 3038 -> 7227 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 2eeeadd2c16af47e2282400756fb6654d7ff27bd..411ea29eae07402a848bffe6829186428a5aefae 100644 GIT binary patch literal 7227 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 JPDHLkV1jsYk_Z3* literal 3038 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 From ae8dcfa4b64d618cb3a3f8dc6409279d77f9333d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:14 +0100 Subject: [PATCH 0717/1620] New translations dockIconMac.png (Portuguese) --- .../earth/app/view/Messages_pt.properties | Bin 3038 -> 7227 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 2eeeadd2c16af47e2282400756fb6654d7ff27bd..411ea29eae07402a848bffe6829186428a5aefae 100644 GIT binary patch literal 7227 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 JPDHLkV1jsYk_Z3* literal 3038 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 From 0655c13579016bc4bdffce01f3770edc98e970bc Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:15 +0100 Subject: [PATCH 0718/1620] New translations dockIconMac.png (Spanish) --- .../earth/app/view/Messages_es.properties | Bin 3038 -> 7227 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 2eeeadd2c16af47e2282400756fb6654d7ff27bd..411ea29eae07402a848bffe6829186428a5aefae 100644 GIT binary patch literal 7227 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 JPDHLkV1jsYk_Z3* literal 3038 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 From 8116df5db0707cea2bc4728512dc268bcdd887f1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:16 +0100 Subject: [PATCH 0719/1620] New translations dockIconMac.png (French) --- .../earth/app/view/Messages_fr.properties | Bin 3038 -> 7227 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 2eeeadd2c16af47e2282400756fb6654d7ff27bd..411ea29eae07402a848bffe6829186428a5aefae 100644 GIT binary patch literal 7227 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 JPDHLkV1jsYk_Z3* literal 3038 zcmV<43nBE0P)45Abw205W#-Mk za2=8};%ZXzizGn^T6_Vvxod-wFmP?j6@;{AGf=YH>;@80vB4~YmK zUIc^$fC#*#>8V^fl2E5YxnMM($QH|*CJBPmDmS{#ZS|IVx5=&u21x`W0w6#J2>7R4 z;{S_800^W5oEu%aKAQ+evx%&(6IDJI80fqb%|r%vv*2-?`~A+ny&i!f5h1dN_gqI> z&td%?a-#8jiC>+*n z{oOwQ)>gNGjEE2c=s|M#b0Q)jKtRA`uK2s5#VeCBjqBbj^I)H6o8M(oGoLU^6Po5kOF0JMTCO+EfdSOqK%W4DyLPU5N2?;q1rE{;pKat4rtj7Q8 zV0$=S{Ay3VEO0;p01@ElA5V_VB@F`p`sK%9J(7yN{QJ?hTBqq}$L|;=$!?K;{A_29 z)5N}1M)oCQa3!66{ewG^lxDTEA3f8y6w7wjo32cT5d|PZ-~@bRE?MVL3R-C{oB<#p zKxCt{DSwSQ7SH^{!7jH|jHlF}9-9cq3+q1u^Z*GF;~Dj}52hlC@~(|lhx?nFYt3t^ zVndbr@auTMJ1*7}($vnep~~5-Mkm_}Q_wR*!WyQfT*B_w{-n-%=Y*m4A9{ zI+`v3A`+(x5&>{dzrC=O$mrc(+jpMwcQ;w4mNN(Yy_cq9hj)2Tjf4;x0FB*CNsMjr zy9JRZBWYdN0O-_c`0%53SEix|`aCm%^hTfa+fVu)@jBCa^|$92xUO?x2*8L4fsf3s zU7L;@BzS3myFnCOHse$v?Qt8UDYdiFmdL0DRa47+F_JE7@XOP)K!X&386hm*e@Iss&=D-ZtxjzWSXTTr2THDyIkIYNyAsmMEEIoD8PzCfO*9 z9MEBwUj2)90REq67K@sO2n+#E4+n}m+tlLR)a(Gj%CoQ6bNu4cV_oid&M)-%-JgsE z3q?&9_;b5_Tbk|94K%wg@=7B2`?28GHplNSEbQoVAHA@&ueTlm7$5-aZnF2byLHk( zz8(Ysu~5=(%qJy=Pi?OHY&??8YQTVT@YgAw&5l%7X95eyb7n=3rAu%A&GvLbd-bic zpZwL%w~}Sv2rR~67NNF zIaS})?FL|iAlBJUKYX^^u1K6n=PXyyJZ>Wp0zhYzEfCF(FD49qnDO8 zH`~vSg$bwpQ0WLrXimt3<|tD$>D9oHHUKXz?hF zSTLFr6Pc1MNe*SbS=bc$`GF>@B6A=h?y?vftIhK(*&3Jf=~%>OVpGexqeBaK!$qe> zI)7`;u1JAc!D$g)7Guj{knLb0s1*W1qD3O~EE>CBClZ|rFXpeDDn zx2NvCp{3W3-#&FM+|g*+*6IWVQ4mUHO_T)WoHz%8!Ol)+QPU*xi=GPr(BM);QK+`c zI%f{6c(AYTqv7yZx7FE<(%5XGw#umK*jl3i017969FznvX$0QkpV!Y2ZI1^^x4jghM(9_ zBa1jTmwMyGrM`bHaEKo86qMeA_8E!td}&7zyNS@HLL6BaVf0BV?%@+ zbFuqp4@uWyUGmpgt;1xLaXDJ-YI5qJ%>?o#D0SA^;~5P}_qY_Si1z(;Y})3N_L zGn2}fhUeA?0|$l}Osl1K-jWK zxEg%p#N?qJzT+2{Dog=z1^~c_Q@+f9b9N!8mVfd0{aTqHIXhQSx%MUfCe#@U?+wjY zS&h58tNPok1%~Oe+Tc)}HY2kbrHx*zuH(?H$e(Sge(jq*ocQ;iZVe~12!zNgLx;E8 zNIHo!yEK`2>&(oBi8WD{Iq8iq<-w#tQYeu>@MzP``Pi|`0fUU!rekHDbv0QmMu8E) zV4oLAzc?97sk$t%c8~3|KZb_y#sQEM5ODxH&|9w)0HJ_%btcXL5%e!B zPWo&pGjcaR*zY~q?}??0LlZIJe6Y`pz!(uY%;MJve40)_`*6C<`KjSxu>=SDyoCB% zO05uWF)Kef)Lw0qiaO~!lsLLAhFA7?cpRqnQIhn3e*4zwT>RX4-74u$(fbhW1aRF_q5o|#%!_p?q|VFvGDR>w`EAhZ438x>ic z2&9K@g~~e5s@l;%EYC-Be>vbaEAo};*wCF-#UQ+}$16!vrQfjiMgY`YYkTEDhbY0Z zp@kzC7QeOE|KgsOoLUxuHv3!#Nk9Y+K!A3WEC_%Mj$c{|r;7I?nJR~QqtBYlYeq%< z=<4#jLyIzFFAcV}dmKm{5P(3uKgt3D?`pLD@NoB=AI}Wmi3dWtfBahKa|2#r!oq5D zXIGW4+Jp$46DI=T2yBzjNentXj!ahf)tErQe|hKjN~~ZuNZ&uuw#n-R;Dii82Nb?= z01s@)TqyOM&ljfy8Ka1gZ>rth?XIyK>?WBp0f)kfBp#JrnBmePoufuE%C-TEH=?fE~OuDQB2b~7DH$1bW(I7DbKqC0ky?)p~ z5m3d9U?iFQ=z3^oIkS?=X=Ts>OcE%Hl2=O>gPd2@OqoO=SrTd;hOP$NV1Hx1Q(2F$ zSPEhfxtjmu1}n4yA_3{?0$)uQZ!aaMgX!gHK3&idfBaYO3utWyaZK0n{{R3007*qoM6N<$f~f@91^@s6 From 39385dd070224f22547d3908a399feef3bc806a5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:17 +0100 Subject: [PATCH 0720/1620] New translations CollectEarth.png (English) --- .../earth/app/view/Messages_en.properties | Bin 7227 -> 19074 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 411ea29eae07402a848bffe6829186428a5aefae..b6445ac6bf893204dfa034348cf755ec98dacf8a 100644 GIT binary patch literal 19074 zcmbTdbyS?svM36JJHg%E-QC?~aCdii3myoN;O;hPf)5bfLvVL@*F1iEpMCCo>z#Z5 zxU*)>bbnu0b#-+~OI56ziYy8u0U`th1d64lm>cg zx>$Sqn7La)h+DdtTan2-nb}xrSeaS+xs6x}K|ny++Gznjfyzn(7A{UKX8*Kd@pW?j zfQEn&67_X8vv9ETBr~_Nv2zxtxajDiAhWX+rqJb9W>a>Rw6e96^LMw>^jFcc@OQA_ zx1*VO{A>b=a@h`jrALV}@vr>@#tBI$BFvY)#0xGMKNxHaO zk#VzdGFz~*vy<`gu&{G+^YE}Uk#VrGbFi{~e0iAJxdga*1UPuf{_8{W(VM%awSb0{ z%zyRuQ4^-H_4ITVU}g33@nP}dWN~q~VP)s%=l=%>2M6;<3uX^LXHPR@yaVGl*qnWvjm!~kr2c`cWf|IMV@_!?C_V_PGeXxwx*UXiborR6n$?2bQ z{j0Tyr-s%4BIAE-?V;u8YQ?Hy<>BJxZt*c6)|CGN{@~sJxubs?eo!Nz>TdTjDQ1pR zE*4%+R?eRCQoR1Yw(bMc&#szw%9RgLwmBgK8G7%VW86O(&J?*nEkj2O!~?~LOuv94>xnK(FZifRghS`loILMXg8r#mNl(dB;^$Aui>`s-Unt8m`jj$?1 z<4;A=fZ0rQb6I>=-kjGA*=@M6d}p^QOc0 zQfWg{R)#t>p=wA>Nu_T@D-@tJp#{_vm5C2(;ebdO@|Z)j{m3cXv06GL^PaJV!pLV9 zbZE+LbP5G@Nfde=xz&Ui75Z5j;`suB)?ÐQv8PcsF+Tb*~)bHKqTdSVz0)=y>VZ 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 JPDHLkV1jsYk_Z3* From 5a1d8587b13c76cdc3b3e410e1fc4f5dc130403d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:18 +0100 Subject: [PATCH 0721/1620] New translations installer_icon.icns (Spanish) --- .../earth/app/view/Messages_es.properties | Bin 7227 -> 11933 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 411ea29eae07402a848bffe6829186428a5aefae..0589f39b42ac62e1df44c27797657da2936753cd 100644 GIT binary patch literal 11933 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 literal 7227 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 JPDHLkV1jsYk_Z3* From 0f64a01d2dc5a610eb5de746a1ab54353e659a66 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:18 +0100 Subject: [PATCH 0722/1620] New translations CollectEarth.png (Spanish) --- .../earth/app/view/Messages_es.properties | Bin 11933 -> 19074 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 0589f39b42ac62e1df44c27797657da2936753cd..b6445ac6bf893204dfa034348cf755ec98dacf8a 100644 GIT binary patch literal 19074 zcmbTdbyS?svM36JJHg%E-QC?~aCdii3myoN;O;hPf)5bfLvVL@*F1iEpMCCo>z#Z5 zxU*)>bbnu0b#-+~OI56ziYy8u0U`th1d64lm>cg zx>$Sqn7La)h+DdtTan2-nb}xrSeaS+xs6x}K|ny++Gznjfyzn(7A{UKX8*Kd@pW?j zfQEn&67_X8vv9ETBr~_Nv2zxtxajDiAhWX+rqJb9W>a>Rw6e96^LMw>^jFcc@OQA_ zx1*VO{A>b=a@h`jrALV}@vr>@#tBI$BFvY)#0xGMKNxHaO zk#VzdGFz~*vy<`gu&{G+^YE}Uk#VrGbFi{~e0iAJxdga*1UPuf{_8{W(VM%awSb0{ z%zyRuQ4^-H_4ITVU}g33@nP}dWN~q~VP)s%=l=%>2M6;<3uX^LXHPR@yaVGl*qnWvjm!~kr2c`cWf|IMV@_!?C_V_PGeXxwx*UXiborR6n$?2bQ z{j0Tyr-s%4BIAE-?V;u8YQ?Hy<>BJxZt*c6)|CGN{@~sJxubs?eo!Nz>TdTjDQ1pR zE*4%+R?eRCQoR1Yw(bMc&#szw%9RgLwmBgK8G7%VW86O(&J?*nEkj2O!~?~LOuv94>xnK(FZifRghS`loILMXg8r#mNl(dB;^$Aui>`s-Unt8m`jj$?1 z<4;A=fZ0rQb6I>=-kjGA*=@M6d}p^QOc0 zQfWg{R)#t>p=wA>Nu_T@D-@tJp#{_vm5C2(;ebdO@|Z)j{m3cXv06GL^PaJV!pLV9 zbZE+LbP5G@Nfde=xz&Ui75Z5j;`suB)?ÐQv8PcsF+Tb*~)bHKqTdSVz0)=y>VZ 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 From 657ce901489034750aee1b0f49aef08c2ffa26e2 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:20 +0100 Subject: [PATCH 0723/1620] New translations web.xml (Portuguese) --- .../earth/app/view/Messages_pt.properties | Bin 7227 -> 3817 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 411ea29eae07402a848bffe6829186428a5aefae..06cc3503c42731f8bdcd4c8acd7b70385fff3744 100644 GIT binary patch literal 3817 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 JPDHLkV1jsYk_Z3* From b31caf02012ef283770957b54db5c2b359a42349 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:20 +0100 Subject: [PATCH 0724/1620] New translations CollectEarth.png (French) --- .../earth/app/view/Messages_fr.properties | Bin 7227 -> 19074 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 411ea29eae07402a848bffe6829186428a5aefae..b6445ac6bf893204dfa034348cf755ec98dacf8a 100644 GIT binary patch literal 19074 zcmbTdbyS?svM36JJHg%E-QC?~aCdii3myoN;O;hPf)5bfLvVL@*F1iEpMCCo>z#Z5 zxU*)>bbnu0b#-+~OI56ziYy8u0U`th1d64lm>cg zx>$Sqn7La)h+DdtTan2-nb}xrSeaS+xs6x}K|ny++Gznjfyzn(7A{UKX8*Kd@pW?j zfQEn&67_X8vv9ETBr~_Nv2zxtxajDiAhWX+rqJb9W>a>Rw6e96^LMw>^jFcc@OQA_ zx1*VO{A>b=a@h`jrALV}@vr>@#tBI$BFvY)#0xGMKNxHaO zk#VzdGFz~*vy<`gu&{G+^YE}Uk#VrGbFi{~e0iAJxdga*1UPuf{_8{W(VM%awSb0{ z%zyRuQ4^-H_4ITVU}g33@nP}dWN~q~VP)s%=l=%>2M6;<3uX^LXHPR@yaVGl*qnWvjm!~kr2c`cWf|IMV@_!?C_V_PGeXxwx*UXiborR6n$?2bQ z{j0Tyr-s%4BIAE-?V;u8YQ?Hy<>BJxZt*c6)|CGN{@~sJxubs?eo!Nz>TdTjDQ1pR zE*4%+R?eRCQoR1Yw(bMc&#szw%9RgLwmBgK8G7%VW86O(&J?*nEkj2O!~?~LOuv94>xnK(FZifRghS`loILMXg8r#mNl(dB;^$Aui>`s-Unt8m`jj$?1 z<4;A=fZ0rQb6I>=-kjGA*=@M6d}p^QOc0 zQfWg{R)#t>p=wA>Nu_T@D-@tJp#{_vm5C2(;ebdO@|Z)j{m3cXv06GL^PaJV!pLV9 zbZE+LbP5G@Nfde=xz&Ui75Z5j;`suB)?ÐQv8PcsF+Tb*~)bHKqTdSVz0)=y>VZ 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 JPDHLkV1jsYk_Z3* From 94fc4017ab88fb41bcb8d8da0822c9f0148572a1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:22 +0100 Subject: [PATCH 0725/1620] New translations index.html (English) --- .../earth/app/view/Messages_en.properties | Bin 19074 -> 119 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index b6445ac6bf893204dfa034348cf755ec98dacf8a..45cb1a25304930afe36577d6c4fd36a231460dcf 100644 GIT binary patch literal 119 zcmXBN!41P85CzdYRs1wy8d!0OA~%o*0$v#`!Xj7_xqHjv_D(Yt^_!g`FWc$NQ*!2@ zczv42g?zKlykqL<+kif#?4d^q#UCJO;Yer8nKG(nP=%?$j$-T`MUt3 CTqw2x literal 19074 zcmbTdbyS?svM36JJHg%E-QC?~aCdii3myoN;O;hPf)5bfLvVL@*F1iEpMCCo>z#Z5 zxU*)>bbnu0b#-+~OI56ziYy8u0U`th1d64lm>cg zx>$Sqn7La)h+DdtTan2-nb}xrSeaS+xs6x}K|ny++Gznjfyzn(7A{UKX8*Kd@pW?j zfQEn&67_X8vv9ETBr~_Nv2zxtxajDiAhWX+rqJb9W>a>Rw6e96^LMw>^jFcc@OQA_ zx1*VO{A>b=a@h`jrALV}@vr>@#tBI$BFvY)#0xGMKNxHaO zk#VzdGFz~*vy<`gu&{G+^YE}Uk#VrGbFi{~e0iAJxdga*1UPuf{_8{W(VM%awSb0{ z%zyRuQ4^-H_4ITVU}g33@nP}dWN~q~VP)s%=l=%>2M6;<3uX^LXHPR@yaVGl*qnWvjm!~kr2c`cWf|IMV@_!?C_V_PGeXxwx*UXiborR6n$?2bQ z{j0Tyr-s%4BIAE-?V;u8YQ?Hy<>BJxZt*c6)|CGN{@~sJxubs?eo!Nz>TdTjDQ1pR zE*4%+R?eRCQoR1Yw(bMc&#szw%9RgLwmBgK8G7%VW86O(&J?*nEkj2O!~?~LOuv94>xnK(FZifRghS`loILMXg8r#mNl(dB;^$Aui>`s-Unt8m`jj$?1 z<4;A=fZ0rQb6I>=-kjGA*=@M6d}p^QOc0 zQfWg{R)#t>p=wA>Nu_T@D-@tJp#{_vm5C2(;ebdO@|Z)j{m3cXv06GL^PaJV!pLV9 zbZE+LbP5G@Nfde=xz&Ui75Z5j;`suB)?ÐQv8PcsF+Tb*~)bHKqTdSVz0)=y>VZ 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 Date: Tue, 29 Nov 2022 12:34:23 +0100 Subject: [PATCH 0726/1620] New translations web.xml (French) --- .../earth/app/view/Messages_fr.properties | Bin 19074 -> 3817 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index b6445ac6bf893204dfa034348cf755ec98dacf8a..06cc3503c42731f8bdcd4c8acd7b70385fff3744 100644 GIT binary patch literal 3817 zcmb_f-EZ4A5P!D+3eVWn22x4Z0z;svSmIVS6iB`D`<#MU|vtr^EjD-jSj{ zY{zzo+rvZ!u=jF!AhI_qU^Yu?$n?-VQc6Ofp{pNm} zFJUE^EUXhnj#7;!7yKpau=3J+mV2EG=S@5cJ@S7?*^>H6A1*$;z(F!~YRY5kF3NF9@ zC)Y|r?rsT`R~F2jRx>dFCJQLQ2nVwS1E6H^1L`LmI66Hl58BYaWZS^Q7NZ}2Da-d- zyWim{D)SE5wsb02rGhCKj1o5}5V;RPf5+J9Fuu}@7Z2ayuUrXhOW~H6$zQkE?Dg9_ zdhk5)dU$Dc3C2mVM~xdXMln~?I&!g(Wc*+rCBt0hq7;~d9MvzdDCqx-2aZnT_jDp} zC~$Q=?rU9XvZaW^5=jVj0<0|!!p$+oV6Dw3k5~tmM>H)kLr%m*NX#@>zcU;|$||fa zCBOLky7Me)(!HlNsJ~mU>@zPg@%Qk#0vlbjr7>tAcLZ*VKy!-6x|Eh!U^!ZRTQ{UF zRZWft`A*0V7=GrXM7(p`9-((Y8;Ulqtd{x&8;_W*n z+bg56yE{z1B1?WqlkRt$x*dqXZ3@}sdW3zlz?q6)IL13y)X`9u#6oI5%s%EgMSP7+ zaB}o6Be#1hA)}RN!|i9qC&G!ThY$SzI`WFjEi-DEI_REwDK{t5Lt z*hRaCa5#QYMel-eBB3p#eSNRy;*&!$D6bxM?nwg~%4iNhppUT=TGu zN+dqADbmh6eSNmBZUkG8^a^vg5AG;G3Gi9}_t4t4cTWS}0j7;=m)O$6Q%^&7xV*e8 z6c+Bj4!n!vp)LJ@VwnAy_H`Wxl9MaYmCG*3y?qi2Hnb>-v^6OFJp~M>7BE^Gy}m9r zlf?`+eCcTW?_H3}E}@o3@(S(fw9i3`KOdkVtFup}rv0P}_uRgtVUETh9m!)c<6)q% hut=cfkG?QlezKsCbqxH=e+Ea%gTUkq|GPCCeg#S7BUbz#Z5 zxU*)>bbnu0b#-+~OI56ziYy8u0U`th1d64lm>cg zx>$Sqn7La)h+DdtTan2-nb}xrSeaS+xs6x}K|ny++Gznjfyzn(7A{UKX8*Kd@pW?j zfQEn&67_X8vv9ETBr~_Nv2zxtxajDiAhWX+rqJb9W>a>Rw6e96^LMw>^jFcc@OQA_ zx1*VO{A>b=a@h`jrALV}@vr>@#tBI$BFvY)#0xGMKNxHaO zk#VzdGFz~*vy<`gu&{G+^YE}Uk#VrGbFi{~e0iAJxdga*1UPuf{_8{W(VM%awSb0{ z%zyRuQ4^-H_4ITVU}g33@nP}dWN~q~VP)s%=l=%>2M6;<3uX^LXHPR@yaVGl*qnWvjm!~kr2c`cWf|IMV@_!?C_V_PGeXxwx*UXiborR6n$?2bQ z{j0Tyr-s%4BIAE-?V;u8YQ?Hy<>BJxZt*c6)|CGN{@~sJxubs?eo!Nz>TdTjDQ1pR zE*4%+R?eRCQoR1Yw(bMc&#szw%9RgLwmBgK8G7%VW86O(&J?*nEkj2O!~?~LOuv94>xnK(FZifRghS`loILMXg8r#mNl(dB;^$Aui>`s-Unt8m`jj$?1 z<4;A=fZ0rQb6I>=-kjGA*=@M6d}p^QOc0 zQfWg{R)#t>p=wA>Nu_T@D-@tJp#{_vm5C2(;ebdO@|Z)j{m3cXv06GL^PaJV!pLV9 zbZE+LbP5G@Nfde=xz&Ui75Z5j;`suB)?ÐQv8PcsF+Tb*~)bHKqTdSVz0)=y>VZ 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 Date: Tue, 29 Nov 2022 12:34:24 +0100 Subject: [PATCH 0727/1620] New translations web.xml (Spanish) --- .../earth/app/view/Messages_es.properties | Bin 19074 -> 3817 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index b6445ac6bf893204dfa034348cf755ec98dacf8a..06cc3503c42731f8bdcd4c8acd7b70385fff3744 100644 GIT binary patch literal 3817 zcmb_f-EZ4A5P!D+3eVWn22x4Z0z;svSmIVS6iB`D`<#MU|vtr^EjD-jSj{ zY{zzo+rvZ!u=jF!AhI_qU^Yu?$n?-VQc6Ofp{pNm} zFJUE^EUXhnj#7;!7yKpau=3J+mV2EG=S@5cJ@S7?*^>H6A1*$;z(F!~YRY5kF3NF9@ zC)Y|r?rsT`R~F2jRx>dFCJQLQ2nVwS1E6H^1L`LmI66Hl58BYaWZS^Q7NZ}2Da-d- zyWim{D)SE5wsb02rGhCKj1o5}5V;RPf5+J9Fuu}@7Z2ayuUrXhOW~H6$zQkE?Dg9_ zdhk5)dU$Dc3C2mVM~xdXMln~?I&!g(Wc*+rCBt0hq7;~d9MvzdDCqx-2aZnT_jDp} zC~$Q=?rU9XvZaW^5=jVj0<0|!!p$+oV6Dw3k5~tmM>H)kLr%m*NX#@>zcU;|$||fa zCBOLky7Me)(!HlNsJ~mU>@zPg@%Qk#0vlbjr7>tAcLZ*VKy!-6x|Eh!U^!ZRTQ{UF zRZWft`A*0V7=GrXM7(p`9-((Y8;Ulqtd{x&8;_W*n z+bg56yE{z1B1?WqlkRt$x*dqXZ3@}sdW3zlz?q6)IL13y)X`9u#6oI5%s%EgMSP7+ zaB}o6Be#1hA)}RN!|i9qC&G!ThY$SzI`WFjEi-DEI_REwDK{t5Lt z*hRaCa5#QYMel-eBB3p#eSNRy;*&!$D6bxM?nwg~%4iNhppUT=TGu zN+dqADbmh6eSNmBZUkG8^a^vg5AG;G3Gi9}_t4t4cTWS}0j7;=m)O$6Q%^&7xV*e8 z6c+Bj4!n!vp)LJ@VwnAy_H`Wxl9MaYmCG*3y?qi2Hnb>-v^6OFJp~M>7BE^Gy}m9r zlf?`+eCcTW?_H3}E}@o3@(S(fw9i3`KOdkVtFup}rv0P}_uRgtVUETh9m!)c<6)q% hut=cfkG?QlezKsCbqxH=e+Ea%gTUkq|GPCCeg#S7BUbz#Z5 zxU*)>bbnu0b#-+~OI56ziYy8u0U`th1d64lm>cg zx>$Sqn7La)h+DdtTan2-nb}xrSeaS+xs6x}K|ny++Gznjfyzn(7A{UKX8*Kd@pW?j zfQEn&67_X8vv9ETBr~_Nv2zxtxajDiAhWX+rqJb9W>a>Rw6e96^LMw>^jFcc@OQA_ zx1*VO{A>b=a@h`jrALV}@vr>@#tBI$BFvY)#0xGMKNxHaO zk#VzdGFz~*vy<`gu&{G+^YE}Uk#VrGbFi{~e0iAJxdga*1UPuf{_8{W(VM%awSb0{ z%zyRuQ4^-H_4ITVU}g33@nP}dWN~q~VP)s%=l=%>2M6;<3uX^LXHPR@yaVGl*qnWvjm!~kr2c`cWf|IMV@_!?C_V_PGeXxwx*UXiborR6n$?2bQ z{j0Tyr-s%4BIAE-?V;u8YQ?Hy<>BJxZt*c6)|CGN{@~sJxubs?eo!Nz>TdTjDQ1pR zE*4%+R?eRCQoR1Yw(bMc&#szw%9RgLwmBgK8G7%VW86O(&J?*nEkj2O!~?~LOuv94>xnK(FZifRghS`loILMXg8r#mNl(dB;^$Aui>`s-Unt8m`jj$?1 z<4;A=fZ0rQb6I>=-kjGA*=@M6d}p^QOc0 zQfWg{R)#t>p=wA>Nu_T@D-@tJp#{_vm5C2(;ebdO@|Z)j{m3cXv06GL^PaJV!pLV9 zbZE+LbP5G@Nfde=xz&Ui75Z5j;`suB)?ÐQv8PcsF+Tb*~)bHKqTdSVz0)=y>VZ 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 Date: Tue, 29 Nov 2022 12:34:25 +0100 Subject: [PATCH 0728/1620] New translations index.html (Portuguese) --- .../earth/app/view/Messages_pt.properties | 129 +----------------- 1 file changed, 6 insertions(+), 123 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 06cc3503c4..45cb1a2530 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,123 +1,6 @@ - - - earth - - - contextConfigLocation - file:${collectEarth.userFolder}/generated/applicationContext.xml - - - webAppRootKey - SimpleServer.root - - - - org.apache.logging.log4j.web.Log4jServletContextListener - - - - org.springframework.web.context.ContextLoaderListener - - - - localizationFilter - org.springframework.web.filter.RequestContextFilter - - - characterEncodingFilter - org.springframework.web.filter.CharacterEncodingFilter - - encoding - UTF-8 - - - - googleEarthHeaderFilter - org.openforis.collect.earth.app.server.GoogleEarthHeaderFilter - - - cross-origin - org.eclipse.jetty.servlets.CrossOriginFilter - - - - localizationFilter - /* - - - characterEncodingFilter - /* - - - googleEarthHeaderFilter - /* - - - cross-origin - /* - - - - - DB Connection - jdbc/collectDs - javax.sql.DataSource - Container - - - - dispatcher - org.springframework.web.servlet.DispatcherServlet - 1 - - contextConfigLocation - classpath:/WEB-INF/dispatcher-servlet.xml - - - - default - org.eclipse.jetty.servlet.DefaultServlet - - useFileMappedBuffer - false - - - - - dispatcher - / - - - - default - /generated/* - - - - default - /testOnline/* - - - - 2 - - - - index.html - - - - kml - application/vnd.google-earth.kml+xml - - - - kmz - application/vnd.google-earth.kmz - - - + + +Collect Earth.
+This server is supposed to be used in conjunction with Google Earth! + + From 3ee109c74094b95a7745f6fa9a9d19cc029b9537 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:26 +0100 Subject: [PATCH 0729/1620] New translations web.xml (English) --- .../earth/app/view/Messages_en.properties | 129 +++++++++++++++++- 1 file changed, 123 insertions(+), 6 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 45cb1a2530..06cc3503c4 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,6 +1,123 @@ - - -Collect Earth.
-This server is supposed to be used in conjunction with Google Earth! - - + + + earth + + + contextConfigLocation + file:${collectEarth.userFolder}/generated/applicationContext.xml + + + webAppRootKey + SimpleServer.root + + + + org.apache.logging.log4j.web.Log4jServletContextListener + + + + org.springframework.web.context.ContextLoaderListener + + + + localizationFilter + org.springframework.web.filter.RequestContextFilter + + + characterEncodingFilter + org.springframework.web.filter.CharacterEncodingFilter + + encoding + UTF-8 + + + + googleEarthHeaderFilter + org.openforis.collect.earth.app.server.GoogleEarthHeaderFilter + + + cross-origin + org.eclipse.jetty.servlets.CrossOriginFilter + + + + localizationFilter + /* + + + characterEncodingFilter + /* + + + googleEarthHeaderFilter + /* + + + cross-origin + /* + + + + + DB Connection + jdbc/collectDs + javax.sql.DataSource + Container + + + + dispatcher + org.springframework.web.servlet.DispatcherServlet + 1 + + contextConfigLocation + classpath:/WEB-INF/dispatcher-servlet.xml + + + + default + org.eclipse.jetty.servlet.DefaultServlet + + useFileMappedBuffer + false + + + + + dispatcher + / + + + + default + /generated/* + + + + default + /testOnline/* + + + + 2 + + + + index.html + + + + kml + application/vnd.google-earth.kml+xml + + + + kmz + application/vnd.google-earth.kmz + + + From f418888e846098fbefb626166886cf7bcd8ddfd5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:27 +0100 Subject: [PATCH 0730/1620] New translations webServer.xml (French) --- .../earth/app/view/Messages_fr.properties | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 06cc3503c4..de3ed9a2d3 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -4,26 +4,22 @@ contextConfigLocation - file:${collectEarth.userFolder}/generated/applicationContext.xml + + classpath:/WEB-INF/conf/applicationContextServer.xml + webAppRootKey SimpleServer.root - + org.apache.logging.log4j.web.Log4jServletContextListener - org.springframework.web.context.ContextLoaderListener - - + localizationFilter org.springframework.web.filter.RequestContextFilter @@ -82,9 +78,10 @@ default org.eclipse.jetty.servlet.DefaultServlet - useFileMappedBuffer - false - + cacheControl + max-age=3600,public + + From 76f161484f4b5ff0ff05db698d43d16f6d9e46fe Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:28 +0100 Subject: [PATCH 0731/1620] New translations webServer.xml (Spanish) --- .../earth/app/view/Messages_es.properties | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 06cc3503c4..de3ed9a2d3 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -4,26 +4,22 @@ contextConfigLocation - file:${collectEarth.userFolder}/generated/applicationContext.xml + + classpath:/WEB-INF/conf/applicationContextServer.xml + webAppRootKey SimpleServer.root - + org.apache.logging.log4j.web.Log4jServletContextListener - org.springframework.web.context.ContextLoaderListener - - + localizationFilter org.springframework.web.filter.RequestContextFilter @@ -82,9 +78,10 @@ default org.eclipse.jetty.servlet.DefaultServlet - useFileMappedBuffer - false - + cacheControl + max-age=3600,public + + From b38eb0c9bdc44cd70260b27a37715d509d399535 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:29 +0100 Subject: [PATCH 0732/1620] New translations webServer.xml (Portuguese) --- .../earth/app/view/Messages_pt.properties | 126 +++++++++++++++++- 1 file changed, 120 insertions(+), 6 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 45cb1a2530..de3ed9a2d3 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,6 +1,120 @@ - - -Collect Earth.
-This server is supposed to be used in conjunction with Google Earth! - - + + + earth + + + contextConfigLocation + + classpath:/WEB-INF/conf/applicationContextServer.xml + + + + webAppRootKey + SimpleServer.root + + + + org.apache.logging.log4j.web.Log4jServletContextListener + + + org.springframework.web.context.ContextLoaderListener + + + localizationFilter + org.springframework.web.filter.RequestContextFilter + + + characterEncodingFilter + org.springframework.web.filter.CharacterEncodingFilter + + encoding + UTF-8 + + + + googleEarthHeaderFilter + org.openforis.collect.earth.app.server.GoogleEarthHeaderFilter + + + cross-origin + org.eclipse.jetty.servlets.CrossOriginFilter + + + + localizationFilter + /* + + + characterEncodingFilter + /* + + + googleEarthHeaderFilter + /* + + + cross-origin + /* + + + + + DB Connection + jdbc/collectDs + javax.sql.DataSource + Container + + + + dispatcher + org.springframework.web.servlet.DispatcherServlet + 1 + + contextConfigLocation + classpath:/WEB-INF/dispatcher-servlet.xml + + + + default + org.eclipse.jetty.servlet.DefaultServlet + + cacheControl + max-age=3600,public + + + + + + dispatcher + / + + + + default + /generated/* + + + + default + /testOnline/* + + + + 2 + + + + index.html + + + + kml + application/vnd.google-earth.kml+xml + + + + kmz + application/vnd.google-earth.kmz + + + From 0408907360c714bee10a0f65d6b6293027b52d55 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:30 +0100 Subject: [PATCH 0733/1620] New translations webServer.xml (English) --- .../earth/app/view/Messages_en.properties | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 06cc3503c4..de3ed9a2d3 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -4,26 +4,22 @@ contextConfigLocation - file:${collectEarth.userFolder}/generated/applicationContext.xml + + classpath:/WEB-INF/conf/applicationContextServer.xml + webAppRootKey SimpleServer.root - + org.apache.logging.log4j.web.Log4jServletContextListener - org.springframework.web.context.ContextLoaderListener - - + localizationFilter org.springframework.web.filter.RequestContextFilter @@ -82,9 +78,10 @@ default org.eclipse.jetty.servlet.DefaultServlet - useFileMappedBuffer - false - + cacheControl + max-age=3600,public + + From 18da7634df206e236ff8e1b376c092c2fcf7d7cd Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:31 +0100 Subject: [PATCH 0734/1620] New translations list_filled.png (Portuguese) --- .../earth/app/view/Messages_pt.properties | Bin 3651 -> 682 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index de3ed9a2d3dd17acf22e70a4f4073dae2867bbc1..4524177685d013019b7d6ff8c0b6a8a4b7d6f486 100644 GIT binary patch literal 682 zcmV;b0#*HqP)djvRmvxnun58#g3e;_h37eVuR)H~l@~P}Eu>A$|#Rn;pz(^w~ zP0$FY4@PCCmqf@6U1oDbb5}PvHg&g$FhoY_dHitB`JB)BFgOajArppl@RXMY%KLcA z-D8g+mIy;eugOl?EEZsS%a4z1Q!+WMo-(xklDS5vgY-uRS7~;Mz0#!M zXJQHE*_8-HgP8d>>!XCa|D4bT1q2EhsAz+_C(h_GN`xUESJ_R3lNxdjc@Q}xp3S`g zOW4-QCRHQog2y5iO*>B3_2i@-n?^T0`-<~4S)5X?n1d~ZQJirK?^h-e-HCQiHmPF( zz=A>h?XngaI02XCTJ+BKx6eNOB8i;gaejK9>#C&zft_VoGD_f&tY9jr`Y1!)drJry zz{rbOORQpZH-tOq+h8xOa#2D@ThFy%ha@2KA~?ch=-V(Tq0R3aC$+yR(FiG&&@S4| zR>buf;(83WLK})D85O3p*uXkY7>eNajbTCax!+!y=-Xd1#SmWmYXkD;_NHPpTMI=&$sFP`xHcwj)Y)K@|vPu$l}alh1;I zi0J+N6x+#!!}sJzAf*8S#9t-`Vvd+RADUOJ<{D%PnaC4N@Gg#FL0fct9pilm#VK*- z`RN|#n>u}PyeTB-tkeJEGpU9b1}pCiRJbcpUZaFIkJNkBR6GFq4J)tFe*XqI Q5dZ)H07*qoM6N<$g1HzuTmS$7 literal 3651 zcmb_f+in{-5Pg=uLeOK|<;qS|6vldk#?%updqWf|w6d_ZNy#g|My)~SR$eI_-e|QD%jk8Mb|hMbCoXFs1BK+ql-#ba z(tmH?Ccpo6m!h3Tii}I)FOCKYbOset#E|QuzvpNajYn%4>Gm8v?lJQ4OIg0x+WrC0 z(U>D(*VCC;mlA>t6)HsOgV4y96vl#r$`KVm5_jVqLxJ&<;|nvXmrIN}`v2o2L!a0^ ztq4ql4Y$7!wz71`5aKjj^p5fP5U43D1Y6+y!A4gf9bRCKMJ&zdP@Ri7$QDA{a7(}R z@gOm9rTFZE_s)rAY4@Bs4&N;&``q(F>^*#{!9+rKEP4w>hLpQgW_Fdq5X=Vz1N;Q<^CMWu~N5EOGI zD*5+p%fX8WgF=eZ0DA;$pPg%%QHI@+t#{7U&Ygo>+-3FOkN>)$!i zURM%Jr^V1ydHP+JcE8)u?Lfr*I0Raph`Ja+Sr_S>AfFvPUyM9@ap|v)hojitH||hQ zZLR{N>#BgHf`xnNIhdjnCAHyv`gVkMQeo8N7xu``5mhwQB{d(KkMoBDdy>nMsmapb zVU)JdCFC?uY?=8a*_2y8bMRi?9YQ(u7exo(A1&H@C((bLCr;PWAWTiAT{i2$DJ*y`aWDuHp*Za&bZ=c^ zQ*U8*n8#xT(JVocQR(JFG5!0ztob(KOSpdZ(`52PSwG;Mb%Fs3uIAn?2c4|h<)R6S zMzN)%mz6JzV5G09d1nD0B)^BYq;ZT}nD48BFMtQ%5ZU77@=i(2+An}M^wT84(8rh$ zN$j_*Sc9%@eo6H9xBOf6HF0kP5`U>cf-MUYnh~A7?rtvB9JXv_DIt0XWU{*v^l^KQ ze)OUM=X6lyb^ejew4apTPTG~T&UBwXsX6oAB=J)OYJTssvXv(f`dFvHKYukiY90k9 KF5EA|eE2_Eo# Date: Tue, 29 Nov 2022 12:34:32 +0100 Subject: [PATCH 0735/1620] New translations smallOpenForisBanner.png (French) --- .../earth/app/view/Messages_fr.properties | Bin 3651 -> 2784 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index de3ed9a2d3dd17acf22e70a4f4073dae2867bbc1..800ed67a3ee630d85c4bd4b6e56a4af593a6ba00 100644 GIT binary patch literal 2784 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 KF5EA|eE2_Eo# Date: Tue, 29 Nov 2022 12:34:33 +0100 Subject: [PATCH 0736/1620] New translations macDockImageCE.png (English) --- .../earth/app/view/Messages_en.properties | Bin 3651 -> 7227 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index de3ed9a2d3dd17acf22e70a4f4073dae2867bbc1..411ea29eae07402a848bffe6829186428a5aefae 100644 GIT binary patch literal 7227 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 JPDHLkV1jsYk_Z3* literal 3651 zcmb_f+in{-5Pg=uLeOK|<;qS|6vldk#?%updqWf|w6d_ZNy#g|My)~SR$eI_-e|QD%jk8Mb|hMbCoXFs1BK+ql-#ba z(tmH?Ccpo6m!h3Tii}I)FOCKYbOset#E|QuzvpNajYn%4>Gm8v?lJQ4OIg0x+WrC0 z(U>D(*VCC;mlA>t6)HsOgV4y96vl#r$`KVm5_jVqLxJ&<;|nvXmrIN}`v2o2L!a0^ ztq4ql4Y$7!wz71`5aKjj^p5fP5U43D1Y6+y!A4gf9bRCKMJ&zdP@Ri7$QDA{a7(}R z@gOm9rTFZE_s)rAY4@Bs4&N;&``q(F>^*#{!9+rKEP4w>hLpQgW_Fdq5X=Vz1N;Q<^CMWu~N5EOGI zD*5+p%fX8WgF=eZ0DA;$pPg%%QHI@+t#{7U&Ygo>+-3FOkN>)$!i zURM%Jr^V1ydHP+JcE8)u?Lfr*I0Raph`Ja+Sr_S>AfFvPUyM9@ap|v)hojitH||hQ zZLR{N>#BgHf`xnNIhdjnCAHyv`gVkMQeo8N7xu``5mhwQB{d(KkMoBDdy>nMsmapb zVU)JdCFC?uY?=8a*_2y8bMRi?9YQ(u7exo(A1&H@C((bLCr;PWAWTiAT{i2$DJ*y`aWDuHp*Za&bZ=c^ zQ*U8*n8#xT(JVocQR(JFG5!0ztob(KOSpdZ(`52PSwG;Mb%Fs3uIAn?2c4|h<)R6S zMzN)%mz6JzV5G09d1nD0B)^BYq;ZT}nD48BFMtQ%5ZU77@=i(2+An}M^wT84(8rh$ zN$j_*Sc9%@eo6H9xBOf6HF0kP5`U>cf-MUYnh~A7?rtvB9JXv_DIt0XWU{*v^l^KQ ze)OUM=X6lyb^ejew4apTPTG~T&UBwXsX6oAB=J)OYJTssvXv(f`dFvHKYukiY90k9 KF5EA|eE2_Eo# Date: Tue, 29 Nov 2022 12:34:34 +0100 Subject: [PATCH 0737/1620] New translations macDockImageCE.png (Portuguese) --- .../earth/app/view/Messages_pt.properties | Bin 682 -> 7227 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 4524177685d013019b7d6ff8c0b6a8a4b7d6f486..411ea29eae07402a848bffe6829186428a5aefae 100644 GIT binary patch literal 7227 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 JPDHLkV1jsYk_Z3* literal 682 zcmV;b0#*HqP)djvRmvxnun58#g3e;_h37eVuR)H~l@~P}Eu>A$|#Rn;pz(^w~ zP0$FY4@PCCmqf@6U1oDbb5}PvHg&g$FhoY_dHitB`JB)BFgOajArppl@RXMY%KLcA z-D8g+mIy;eugOl?EEZsS%a4z1Q!+WMo-(xklDS5vgY-uRS7~;Mz0#!M zXJQHE*_8-HgP8d>>!XCa|D4bT1q2EhsAz+_C(h_GN`xUESJ_R3lNxdjc@Q}xp3S`g zOW4-QCRHQog2y5iO*>B3_2i@-n?^T0`-<~4S)5X?n1d~ZQJirK?^h-e-HCQiHmPF( zz=A>h?XngaI02XCTJ+BKx6eNOB8i;gaejK9>#C&zft_VoGD_f&tY9jr`Y1!)drJry zz{rbOORQpZH-tOq+h8xOa#2D@ThFy%ha@2KA~?ch=-V(Tq0R3aC$+yR(FiG&&@S4| zR>buf;(83WLK})D85O3p*uXkY7>eNajbTCax!+!y=-Xd1#SmWmYXkD;_NHPpTMI=&$sFP`xHcwj)Y)K@|vPu$l}alh1;I zi0J+N6x+#!!}sJzAf*8S#9t-`Vvd+RADUOJ<{D%PnaC4N@Gg#FL0fct9pilm#VK*- z`RN|#n>u}PyeTB-tkeJEGpU9b1}pCiRJbcpUZaFIkJNkBR6GFq4J)tFe*XqI Q5dZ)H07*qoM6N<$g1HzuTmS$7 From 15a19c6662cb65c6a2dc771359d8c7d2a4fde816 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:35 +0100 Subject: [PATCH 0738/1620] New translations macDockImageCE.png (Spanish) --- .../earth/app/view/Messages_es.properties | Bin 3651 -> 7227 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index de3ed9a2d3dd17acf22e70a4f4073dae2867bbc1..411ea29eae07402a848bffe6829186428a5aefae 100644 GIT binary patch literal 7227 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 JPDHLkV1jsYk_Z3* literal 3651 zcmb_f+in{-5Pg=uLeOK|<;qS|6vldk#?%updqWf|w6d_ZNy#g|My)~SR$eI_-e|QD%jk8Mb|hMbCoXFs1BK+ql-#ba z(tmH?Ccpo6m!h3Tii}I)FOCKYbOset#E|QuzvpNajYn%4>Gm8v?lJQ4OIg0x+WrC0 z(U>D(*VCC;mlA>t6)HsOgV4y96vl#r$`KVm5_jVqLxJ&<;|nvXmrIN}`v2o2L!a0^ ztq4ql4Y$7!wz71`5aKjj^p5fP5U43D1Y6+y!A4gf9bRCKMJ&zdP@Ri7$QDA{a7(}R z@gOm9rTFZE_s)rAY4@Bs4&N;&``q(F>^*#{!9+rKEP4w>hLpQgW_Fdq5X=Vz1N;Q<^CMWu~N5EOGI zD*5+p%fX8WgF=eZ0DA;$pPg%%QHI@+t#{7U&Ygo>+-3FOkN>)$!i zURM%Jr^V1ydHP+JcE8)u?Lfr*I0Raph`Ja+Sr_S>AfFvPUyM9@ap|v)hojitH||hQ zZLR{N>#BgHf`xnNIhdjnCAHyv`gVkMQeo8N7xu``5mhwQB{d(KkMoBDdy>nMsmapb zVU)JdCFC?uY?=8a*_2y8bMRi?9YQ(u7exo(A1&H@C((bLCr;PWAWTiAT{i2$DJ*y`aWDuHp*Za&bZ=c^ zQ*U8*n8#xT(JVocQR(JFG5!0ztob(KOSpdZ(`52PSwG;Mb%Fs3uIAn?2c4|h<)R6S zMzN)%mz6JzV5G09d1nD0B)^BYq;ZT}nD48BFMtQ%5ZU77@=i(2+An}M^wT84(8rh$ zN$j_*Sc9%@eo6H9xBOf6HF0kP5`U>cf-MUYnh~A7?rtvB9JXv_DIt0XWU{*v^l^KQ ze)OUM=X6lyb^ejew4apTPTG~T&UBwXsX6oAB=J)OYJTssvXv(f`dFvHKYukiY90k9 KF5EA|eE2_Eo# Date: Tue, 29 Nov 2022 12:34:36 +0100 Subject: [PATCH 0739/1620] New translations macDockImageCE.png (French) --- .../earth/app/view/Messages_fr.properties | Bin 2784 -> 7227 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 800ed67a3ee630d85c4bd4b6e56a4af593a6ba00..411ea29eae07402a848bffe6829186428a5aefae 100644 GIT binary patch literal 7227 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 JPDHLkV1jsYk_Z3* literal 2784 zcmV<63Lo`}P)n3T;V5 zK~z}7m6vOfRn?Wpe`}v}?)%>ErklQC3pQv#6O@E#BnVShFep=q@6jYWgw|2U2ZmUg znVPB8n5xud%p{Y97>yHYM#T^nBOxS`79_!FsTnDvh#+XLG_QWq-S_r=oO{mMYd+B3 zkwlrysycN(>{V;8|9`E$9>QNJU)p+wgptFIvu6c})apkF!a=NtuZWm$3(j+At)qF8GeLBwJB* z{Nm7Bij_LWNb@My}!asDJRN2>d^uee=|#NU8u9!M34#+-1+6z}S~R#q?C zVDIX>_McSU6`_qs_s+l1X-T$@qpJ8JM~;tB_9Of-q&btIwINAgvC7fGGTnV6G^S(Z z8&jm>E}&$R9}(3${iWZYYb3S}^db-ew9wOuta$b&ez^EC0PgJin+~h7HODJ8U3tMh zGPmu*an$b~8^&`T;;w@qM&uilgjVr`h(iM-wB}M2t97R5vvl{D39aRI%|j!v z=}={t2aKIwe-uJdmj3oZK&50Xv9$faWR3|Ba7 zQo}gKhX%?tXX7MeE=LB-SPPzO7##6Qc!u`Y9AL2;ab#eFjjS)Ai`(-Zzbf=}Vs6=d ztNd{BV>XDAcSJVZ6xy_V-8omIdLp3;y(K0$rHOlnp|XF{UsD<^zz=rD$tT z)0~NOT2qR_iqCo&oyn{JEwHuf*|$kQ1UW=KBW0tka6 zKGs??36FP9(0NU*)+QHvI&W;xcdRpyE?un^o4GBpX&I;~mrTD1Q2~YSff0-m3Oz-V zF_*Rp9tVzYWLM#JhAR<966`H`6pBd(Di!Yi%{EqcZ6L5ARuxs4(vqQfxH|se8q%{w zu>fBLFaUujudYW4j5Nw8C(S?wYC(u=glVlg>Neu^<}}BSZ=xYN%+%&OCEvwHhV{EM zBt~mP+;!PIaE$N$t_veV+;bQz`&9gpFtPxo;_V1xLC!4ntjU_Ip8i_a5995%C}!KT zd6I4n0gBat_SPJJ5Rq^bgwcBhQ4y;yB1&U2q&JAzGh}d$Aub*gxFpH4{`b4s^431y zJUB?T9x}77ky14P6l3BzCSidTNXmpZo{H2&BW^frD>_ zzN$mQbNKp;ud;F90fuW8rZr4tR!bYzpiUSmo@2UH~ zhM}52uH+iSl$H#+RE$DjjkudV5deW8GzD+P+-!++kzYEh=VM)N$S$8X8wh#a*iP2vtiWW;i%7m6Gp( zf~e3_H3Zg@a9yt1@Jnu(^-+4uC7!sdgIZK)-sv+L@$2N0G3sGN+%w~SQ*DIW`o_l0 zY-_qccX!>Y`5(n_s8rORatT!>6>~Xqe1u6&X;Lv|&a_!rh3?}S%D&5y5tksc%xrFC z(V0_uvHK9kdcd-uKT5)laox;|h`TP4RgRDNBs}+h4A}66J*&Q1_jii9 zwT5Tk*^7waxdzX12qMeSh>z!Hm^SfKoY6c$Di#ui4lS`5uN*waZ{9sZEeNUBL(~di zn}01sBXxo(qT&ZMW#XgIm2wcuS9jFEwfwWxmTexyM3G_Z7w+6)t-O(or})MGx2c68 zRxQ)>ISM@``b#x}(2_}>LvwB^2~RL?kzT(}C`u%j-b$I~WQzMQyN>C(JcH#LlNwVv z#^5<-EcSM9e=&IOo&NQzD(nBFOI^fK0ITLJg4uF-q-=K{J8I^gJ_UfYPj6)Zksiu zTYG=~#@lUy3NPPxq8%@I^kFeX#;SPR-iIcM1s&cTe#MG87eWeV z2(5Dd$_(NzcJ`4Z;bh93%Sp?t}7` zt*`HD%cefvGg7U0e`$&Rz;XPdwI@cixt;5-zp(Si)maZcrdK@qb6XfHs;a8BR;`{| z#^!TX)p9+w-+y(#o$#$qZ~l1S(M0mTp9;X)4{Z7Ksd(PnM|o-a-!ixJF<$PtiSyU2 zKM%~-NSUZA(Umi%J71oA9@&_8Qp~NMXb}RKKTgEDaqnUKZ!hh04ww8VCg&12ALuVt zrZgtC8brKv$Kq43W^>oB1B<+T^Nsq6ho9_paIP)-VOCXi@mW*2a>f~)IUz^fb?}TK zQpFD~$I3O?Ug*`wcX!Ky!E&K3m-_14f4^v5+xIq`!*?&SGamRAZ{L3DsaLZLJ0Itj zjxR80%}+o@cHVNm&i=2b+64CotE`M7nHr6b>5g#_43R=$p&ls~*#YwH)^z;WuigBa z;>-uSWZ&(J^dk>!VgK!y{pHK)oQI!a=PlRs@rRxQ!R)&AIt%cz2Y=QsVip)N=O`vC zDp-*ogV~i$B(}e}Y(W`d+WlJ`g-C!u+?tDnf=gD#Uh}FYPqHd?z#S?^Taov mmX=hUxZ`3$Pj%`0<$nS5#z Date: Tue, 29 Nov 2022 12:34:36 +0100 Subject: [PATCH 0740/1620] New translations list_not_finished.png (English) --- .../earth/app/view/Messages_en.properties | Bin 7227 -> 3498 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 411ea29eae07402a848bffe6829186428a5aefae..d7449eea8d9f158b954aeeccf8f1a9c2c209fd29 100644 GIT binary patch literal 3498 zcmV;b4OQ}qP)|D^_ww@lRz|vCuzLs)$;-`! zo*{AqUjza0dRV*yaMRE;fKCVhpQKsoe1Yhg01=zBIT!& zC1$=TK@rP|Ibo3vKKm@PqnO#LJhq6%Ij6Hz*<$V$@wQAMN5qJ)hzm2hoGcOF60t^# zFqJFfH{#e-4l@G)6iI9sa9D{VHW4w29}?su;^hF~NC{tY+*d5%WDCTXa!E_i;d2ub z1#}&jF5T4HnnCyEWTkKf0>c0%E1Ah>(_PY1)0w;+02c53Su*0<(nUqKG_|(0G&D0Z z{i;y^b@OjZ+}lNZ8Th$p5Uu}MTtq^NHl z*T1?CO*}7&0ztZsv2j*bmJyf3G7=Z`5B*PvzoDiKdLpOAxi2$L0#SX*@cY_n(^h55xYX z#km%V()bZjV~l{*bt*u9?FT3d5g^g~#a;iSZ@&02Abxq_DwB(I|L-^bXThc7C4-yr zInE_0gw7K3GZ**7&k~>k0Z0NWkO#^@9q0fwx1%qjZ=)yBuQ3=5 z4Wo^*!gyjLF-e%Um=erBOdIALW)L%unZshS@>qSW9o8Sq#0s#5*edK%>{;v(b^`kb zN5rY%%y90wC>#%$kE_5P!JWYk;U;klcqzOl-UjcFXXA75rT9jCH~u<)0>40zCTJ7v z2qAyk54cquI@7b&LHdZ`+zlTss6bJ7%PQ)z$cROu4wBhpu-r)01)S~6}jY?%U? zgEALn#wiFzo#H}aQ8rT=DHkadR18&{>P1bW7E`~Y4p3)hWn`DhhRJ5j*2tcg9i<^O zEt(fCg;q*CP8+7ZTcWhYX$fb^_9d-LhL+6BEtPYWVlfK zTBusSTASKKb%HuWJzl+By+?gkLq)?+BTu761jmyXF)a;mc z^>(B7bo*HQ1NNg1st!zt28YLv>W*y3CdWx9U8f|cqfXDAO`Q48?auQqHZJR2&bcD4 z9Ip>EY~kKEPV6Wm+eXFV)D)_R=tM0@&p?(!V*Qu1PXHG9o^TY0bZ?)4%0 z1p8F`JoeS|<@=<@RE7GY07EYX@lwd>4oW|Yi!o+Su@M`;WuSK8LKk71XR(_ zRKHM1xJ5XYX`fk>`6eqY>qNG6HZQwBM=xi4&Sb88?zd}EYguc1@>KIS<&CX#T35dw zS|7K*XM_5Nf(;WJJvJWRMA($P>8E^?{IdL4o5MGE7bq2MEEwP7v8AO@qL5!WvekBL z-8R%V?zVyL=G&{be=K4bT`e{#t|)$A!YaA?jp;X)-+bB;zhj`(vULAW%ue3U;av{9 z4wp%n<(7@__S@Z2PA@Mif3+uO&y|X06?J#o zSi8M;ejj_^(0<4Lt#wLu#dYrva1Y$6_o(k^&}yhSh&h;f@JVA>W8b%oZ=0JGnu?n~ z9O4}sJsfnnx7n(>`H13?(iXTy*fM=I`sj`CT)*pTHEgYKqqP+u1IL8No_-(u{qS+0 z<2@%BCt82d{Gqm;(q7a7b>wu+b|!X?c13m#p7cK1({0<`{-e>4hfb-UsyQuty7Ua; zOu?B?XLHZaol8GAb3Wnxcu!2v{R_`T4=x`(GvqLI{-*2AOSimkUAw*F_TX^n z@STz9kDQ$NC=!KfXWC z8h`dn#xL(D3Z9UkR7|Q&Hcy#Notk!^zVUSB(}`#4&lYA1f0h2V_PNgUAAWQEt$#LR zcH#y9#i!p(Udq2b^lI6wp1FXzN3T;~FU%Lck$-deE#qz9yYP3D3t8{6?<+s(e(3(_ z^YOu_)K8!O1p}D#{JO;G(*OVf24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV z0GgZ_00007bV*G`2i*!D4U zVT0+gu0nL^nunOeNF;(Hji9;c&5M749mEcHnLyH@Lq#5>T{|fC2L%3zYKXbS?jger z!X1!yx9ReXybd#)K@YsJ?E607=lAy+4MhUi0>E%Q0@um_CxDB<5HJ9A%hMfT9asid zfgQu~>Z*Pu8VM4(Rsk3XZUHSonUF0)z5*c{J!td+S>PA&6nJPj-ew$2k9!}u))=q` z+!5~z)UhOUUH&YAM$uIWGeJqPrMH0-#Gl z3&4zcK5RH%MF}&nrZSe^Gm)o;<5hrR!I%kLtIu#ebm^9HCA^B7HozcVbfxPeBcp;f z5x7=Hm)5%ptQd}0jDZ7$96=N#Mc}nycI&_(&wP)J? zhreV^(}lQ>1DW`3wUmo~UIo4>SKCrM^^GbS!Q9b>70&|gDu;;oR7*Kb+kXRCzy&#$ zY5Q;Gjs!+-7tD2CC^rlADqRpa(gs`u9>^K4mU3-L;8NtQoMm0uum(&wNzr{^9yl*& zK6;;$qG_S=RZXbkkx=fH_%v5bxlZ7FN)fwE+uv2a7iN70JO=LRhU3+NIce3!z_sG3 zI@P30PR77{6}q1@9Ivj+3yeF?Mm0>{F;05r6Dt(@7U zB|I$!y(DRwG#qb1tzp{I?*k@;a$A+9zpX6&d~E5@NvhMyD&e!GTj*TsRZU6uP07*qoM6N<$f-HNFVgLXD literal 7227 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 JPDHLkV1jsYk_Z3* From 5bdcd4e885972c3c8125f31a101cc6fe10c144da Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:37 +0100 Subject: [PATCH 0741/1620] New translations list_not_finished.png (Portuguese) --- .../earth/app/view/Messages_pt.properties | Bin 7227 -> 3498 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 411ea29eae07402a848bffe6829186428a5aefae..d7449eea8d9f158b954aeeccf8f1a9c2c209fd29 100644 GIT binary patch literal 3498 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 literal 7227 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 JPDHLkV1jsYk_Z3* From 017bcf19a1b4ac512e3b116cb7560ee4b3874014 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:38 +0100 Subject: [PATCH 0742/1620] New translations list_not_finished.png (Spanish) --- .../earth/app/view/Messages_es.properties | Bin 7227 -> 3498 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 411ea29eae07402a848bffe6829186428a5aefae..d7449eea8d9f158b954aeeccf8f1a9c2c209fd29 100644 GIT binary patch literal 3498 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 literal 7227 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 JPDHLkV1jsYk_Z3* From bfd3e7fd655ebc83924b292bbe355fbcd2ae1b60 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:39 +0100 Subject: [PATCH 0743/1620] New translations list_not_finished.png (French) --- .../earth/app/view/Messages_fr.properties | Bin 7227 -> 3498 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 411ea29eae07402a848bffe6829186428a5aefae..d7449eea8d9f158b954aeeccf8f1a9c2c209fd29 100644 GIT binary patch literal 3498 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 literal 7227 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 JPDHLkV1jsYk_Z3* From 9dd90c2f14c35f9593c96ce359acde19a360140a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:40 +0100 Subject: [PATCH 0744/1620] New translations list_filled.png (English) --- .../earth/app/view/Messages_en.properties | Bin 3498 -> 682 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index d7449eea8d9f158b954aeeccf8f1a9c2c209fd29..4524177685d013019b7d6ff8c0b6a8a4b7d6f486 100644 GIT binary patch literal 682 zcmV;b0#*HqP)djvRmvxnun58#g3e;_h37eVuR)H~l@~P}Eu>A$|#Rn;pz(^w~ zP0$FY4@PCCmqf@6U1oDbb5}PvHg&g$FhoY_dHitB`JB)BFgOajArppl@RXMY%KLcA z-D8g+mIy;eugOl?EEZsS%a4z1Q!+WMo-(xklDS5vgY-uRS7~;Mz0#!M zXJQHE*_8-HgP8d>>!XCa|D4bT1q2EhsAz+_C(h_GN`xUESJ_R3lNxdjc@Q}xp3S`g zOW4-QCRHQog2y5iO*>B3_2i@-n?^T0`-<~4S)5X?n1d~ZQJirK?^h-e-HCQiHmPF( zz=A>h?XngaI02XCTJ+BKx6eNOB8i;gaejK9>#C&zft_VoGD_f&tY9jr`Y1!)drJry zz{rbOORQpZH-tOq+h8xOa#2D@ThFy%ha@2KA~?ch=-V(Tq0R3aC$+yR(FiG&&@S4| zR>buf;(83WLK})D85O3p*uXkY7>eNajbTCax!+!y=-Xd1#SmWmYXkD;_NHPpTMI=&$sFP`xHcwj)Y)K@|vPu$l}alh1;I zi0J+N6x+#!!}sJzAf*8S#9t-`Vvd+RADUOJ<{D%PnaC4N@Gg#FL0fct9pilm#VK*- z`RN|#n>u}PyeTB-tkeJEGpU9b1}pCiRJbcpUZaFIkJNkBR6GFq4J)tFe*XqI Q5dZ)H07*qoM6N<$g1HzuTmS$7 literal 3498 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 From e945c9ae08c3a550655c7202af72c50ec4ed4c05 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:41 +0100 Subject: [PATCH 0745/1620] New translations list_empty.png (French) --- .../earth/app/view/Messages_fr.properties | Bin 3498 -> 472 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index d7449eea8d9f158b954aeeccf8f1a9c2c209fd29..7970bf0c5cba40b6e46c7a75190fcdf44909bc74 100644 GIT binary patch literal 472 zcmV;}0Vn>6P)NkloE@^#u)JJQyHVW8g@jxzNhGCKq9{pP)b3aK11P23C?zCGUgAn_ zC{dQkTQjY(Ih(WhbB?(`tH<~9`F;EJ>-QiqNV0dxp;niyA-mL;mX+w!#a(C9$>Ehz z7a2XKJ(CYqYfYW5YCxNL2%g?(_Qe&79PmyBP_5MtnLJ?P;L{%j+x#*j22wNQ0aR0J z2buwzV<2+>4rTL8{{TGGepJcUtG9j-ULN84HkfV<$viQT=8<@lv z%;R&cBM>lx?fB1VeIc89RL4dh@Wm8dl26LG`V&E?klekI)jKn~PibSkn zui$_*#y8-LYgLxo5?IQa%VxEWSi&`?XOD=1xFjx65%L+-CyD4)4^+`Wdd>`qwX&{G?@`b{lo?U O0000|D^_ww@lRz|vCuzLs)$;-`! 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 From 51dfe677fdde945bcaae2550e22dc5a05aed306a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:42 +0100 Subject: [PATCH 0746/1620] New translations list_filled.png (Spanish) --- .../earth/app/view/Messages_es.properties | Bin 3498 -> 682 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index d7449eea8d9f158b954aeeccf8f1a9c2c209fd29..4524177685d013019b7d6ff8c0b6a8a4b7d6f486 100644 GIT binary patch literal 682 zcmV;b0#*HqP)djvRmvxnun58#g3e;_h37eVuR)H~l@~P}Eu>A$|#Rn;pz(^w~ zP0$FY4@PCCmqf@6U1oDbb5}PvHg&g$FhoY_dHitB`JB)BFgOajArppl@RXMY%KLcA z-D8g+mIy;eugOl?EEZsS%a4z1Q!+WMo-(xklDS5vgY-uRS7~;Mz0#!M zXJQHE*_8-HgP8d>>!XCa|D4bT1q2EhsAz+_C(h_GN`xUESJ_R3lNxdjc@Q}xp3S`g zOW4-QCRHQog2y5iO*>B3_2i@-n?^T0`-<~4S)5X?n1d~ZQJirK?^h-e-HCQiHmPF( zz=A>h?XngaI02XCTJ+BKx6eNOB8i;gaejK9>#C&zft_VoGD_f&tY9jr`Y1!)drJry zz{rbOORQpZH-tOq+h8xOa#2D@ThFy%ha@2KA~?ch=-V(Tq0R3aC$+yR(FiG&&@S4| zR>buf;(83WLK})D85O3p*uXkY7>eNajbTCax!+!y=-Xd1#SmWmYXkD;_NHPpTMI=&$sFP`xHcwj)Y)K@|vPu$l}alh1;I zi0J+N6x+#!!}sJzAf*8S#9t-`Vvd+RADUOJ<{D%PnaC4N@Gg#FL0fct9pilm#VK*- z`RN|#n>u}PyeTB-tkeJEGpU9b1}pCiRJbcpUZaFIkJNkBR6GFq4J)tFe*XqI Q5dZ)H07*qoM6N<$g1HzuTmS$7 literal 3498 zcmV;b4OQ}qP)|D^_ww@lRz|vCuzLs)$;-`! zo*{AqUjza0dRV*yaMRE;fKCVhpQKsoe1Yhg01=zBIT!& zC1$=TK@rP|Ibo3vKKm@PqnO#LJhq6%Ij6Hz*<$V$@wQAMN5qJ)hzm2hoGcOF60t^# zFqJFfH{#e-4l@G)6iI9sa9D{VHW4w29}?su;^hF~NC{tY+*d5%WDCTXa!E_i;d2ub z1#}&jF5T4HnnCyEWTkKf0>c0%E1Ah>(_PY1)0w;+02c53Su*0<(nUqKG_|(0G&D0Z z{i;y^b@OjZ+}lNZ8Th$p5Uu}MTtq^NHl z*T1?CO*}7&0ztZsv2j*bmJyf3G7=Z`5B*PvzoDiKdLpOAxi2$L0#SX*@cY_n(^h55xYX z#km%V()bZjV~l{*bt*u9?FT3d5g^g~#a;iSZ@&02Abxq_DwB(I|L-^bXThc7C4-yr zInE_0gw7K3GZ**7&k~>k0Z0NWkO#^@9q0fwx1%qjZ=)yBuQ3=5 z4Wo^*!gyjLF-e%Um=erBOdIALW)L%unZshS@>qSW9o8Sq#0s#5*edK%>{;v(b^`kb zN5rY%%y90wC>#%$kE_5P!JWYk;U;klcqzOl-UjcFXXA75rT9jCH~u<)0>40zCTJ7v z2qAyk54cquI@7b&LHdZ`+zlTss6bJ7%PQ)z$cROu4wBhpu-r)01)S~6}jY?%U? zgEALn#wiFzo#H}aQ8rT=DHkadR18&{>P1bW7E`~Y4p3)hWn`DhhRJ5j*2tcg9i<^O zEt(fCg;q*CP8+7ZTcWhYX$fb^_9d-LhL+6BEtPYWVlfK zTBusSTASKKb%HuWJzl+By+?gkLq)?+BTu761jmyXF)a;mc z^>(B7bo*HQ1NNg1st!zt28YLv>W*y3CdWx9U8f|cqfXDAO`Q48?auQqHZJR2&bcD4 z9Ip>EY~kKEPV6Wm+eXFV)D)_R=tM0@&p?(!V*Qu1PXHG9o^TY0bZ?)4%0 z1p8F`JoeS|<@=<@RE7GY07EYX@lwd>4oW|Yi!o+Su@M`;WuSK8LKk71XR(_ zRKHM1xJ5XYX`fk>`6eqY>qNG6HZQwBM=xi4&Sb88?zd}EYguc1@>KIS<&CX#T35dw zS|7K*XM_5Nf(;WJJvJWRMA($P>8E^?{IdL4o5MGE7bq2MEEwP7v8AO@qL5!WvekBL z-8R%V?zVyL=G&{be=K4bT`e{#t|)$A!YaA?jp;X)-+bB;zhj`(vULAW%ue3U;av{9 z4wp%n<(7@__S@Z2PA@Mif3+uO&y|X06?J#o zSi8M;ejj_^(0<4Lt#wLu#dYrva1Y$6_o(k^&}yhSh&h;f@JVA>W8b%oZ=0JGnu?n~ z9O4}sJsfnnx7n(>`H13?(iXTy*fM=I`sj`CT)*pTHEgYKqqP+u1IL8No_-(u{qS+0 z<2@%BCt82d{Gqm;(q7a7b>wu+b|!X?c13m#p7cK1({0<`{-e>4hfb-UsyQuty7Ua; zOu?B?XLHZaol8GAb3Wnxcu!2v{R_`T4=x`(GvqLI{-*2AOSimkUAw*F_TX^n z@STz9kDQ$NC=!KfXWC z8h`dn#xL(D3Z9UkR7|Q&Hcy#Notk!^zVUSB(}`#4&lYA1f0h2V_PNgUAAWQEt$#LR zcH#y9#i!p(Udq2b^lI6wp1FXzN3T;~FU%Lck$-deE#qz9yYP3D3t8{6?<+s(e(3(_ z^YOu_)K8!O1p}D#{JO;G(*OVf24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV z0GgZ_00007bV*G`2i*!D4U zVT0+gu0nL^nunOeNF;(Hji9;c&5M749mEcHnLyH@Lq#5>T{|fC2L%3zYKXbS?jger z!X1!yx9ReXybd#)K@YsJ?E607=lAy+4MhUi0>E%Q0@um_CxDB<5HJ9A%hMfT9asid zfgQu~>Z*Pu8VM4(Rsk3XZUHSonUF0)z5*c{J!td+S>PA&6nJPj-ew$2k9!}u))=q` z+!5~z)UhOUUH&YAM$uIWGeJqPrMH0-#Gl z3&4zcK5RH%MF}&nrZSe^Gm)o;<5hrR!I%kLtIu#ebm^9HCA^B7HozcVbfxPeBcp;f z5x7=Hm)5%ptQd}0jDZ7$96=N#Mc}nycI&_(&wP)J? zhreV^(}lQ>1DW`3wUmo~UIo4>SKCrM^^GbS!Q9b>70&|gDu;;oR7*Kb+kXRCzy&#$ zY5Q;Gjs!+-7tD2CC^rlADqRpa(gs`u9>^K4mU3-L;8NtQoMm0uum(&wNzr{^9yl*& zK6;;$qG_S=RZXbkkx=fH_%v5bxlZ7FN)fwE+uv2a7iN70JO=LRhU3+NIce3!z_sG3 zI@P30PR77{6}q1@9Ivj+3yeF?Mm0>{F;05r6Dt(@7U zB|I$!y(DRwG#qb1tzp{I?*k@;a$A+9zpX6&d~E5@NvhMyD&e!GTj*TsRZU6uP07*qoM6N<$f-HNFVgLXD From e24595aeab380b1e2432bf721a14355308c4bb46 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:43 +0100 Subject: [PATCH 0747/1620] New translations list_filled.png (French) --- .../earth/app/view/Messages_fr.properties | Bin 472 -> 682 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 7970bf0c5cba40b6e46c7a75190fcdf44909bc74..4524177685d013019b7d6ff8c0b6a8a4b7d6f486 100644 GIT binary patch delta 659 zcmV;E0&M-*1F8j(BYy&MNkldjvRmvxnun58#g3e;_h z37eVuR)H~l@~P}Eu>A$|#Rn;pz(^w~P0$FY4@PCCmqf@6U1oDbb5}PvHg&g$FhoY_ zdHitB`JB)BFgOajArppl@RXMY%KLcA-D8g+mIy;eugOl?EPobYdCQNFYf~~gte!Ho z{gSyxwwbG8Of$fKyat(ky8TcIxCg8va$<*5uE+P-0suf~k^l$}m4GFz=T_-;@EnV% z9zj`lIXL*08z2pGV~i&#snVt;ctggfWkU@xq4Q9?&s&$VEO zBp~u4IKpG-+b}4h&F>l~wZAFR2q~1%F51mj#Pt~BdJMKg8;T_v6{fS;z&cJCis1E) zVL|h`-(H#M+g~!p5MKLh1M=qfreZT&5l0+ryFpasR3MBEu}PyeTB-tkeJEGpU9b t1}pCiRJbcpUZaFIkJNkBR6GFq4J)tFe*XqI5extT002ovPDHLkV1lCtIHLdn delta 447 zcmV;w0YLt$1=s_SBYy#(NkloE@^#u)JJQyHVW8g@jxz zNhGCKq9{pP)b3aK11P23C?zCGUgAn_C{dQkTQjY(Ih(WhbB?(`tH<~9`F;EJ>-Qiq zNV0dxp;niyA-mL;mX+w!#a(C9$>Ehz7a2XKJ(CYqYfYW5YJWhRc?h1~X!gYwiX8Ax z1yHTk4w*b);^5OC1l#;FA_h`3;{jAtY6qGDnqwex{|;sIOaA~o(|%OR)~mOE5MCbP z`Zkzu49Pq(km&9@hR=r%?KuEuNrcO=^42UT9mIgla%+?%xHXo8B9?;PkLXr!BH2$2 z#LUHBY+-%6u786CW7zqQulJ==!{i&7#1_osbF3o}FoNy)&uD)py-Eyx3t~BDP=G;z zxqM|)QF;b*nLT3QFAIFbt7;lp^51wKito3|ii`Y+R;!nDN Date: Tue, 29 Nov 2022 12:34:44 +0100 Subject: [PATCH 0748/1620] New translations list_empty.png (English) --- .../earth/app/view/Messages_en.properties | Bin 682 -> 472 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 4524177685d013019b7d6ff8c0b6a8a4b7d6f486..7970bf0c5cba40b6e46c7a75190fcdf44909bc74 100644 GIT binary patch delta 447 zcmV;w0YLt$1=s_SBYy#(NkloE@^#u)JJQyHVW8g@jxz zNhGCKq9{pP)b3aK11P23C?zCGUgAn_C{dQkTQjY(Ih(WhbB?(`tH<~9`F;EJ>-Qiq zNV0dxp;niyA-mL;mX+w!#a(C9$>Ehz7a2XKJ(CYqYfYW5YJWhRc?h1~X!gYwiX8Ax z1yHTk4w*b);^5OC1l#;FA_h`3;{jAtY6qGDnqwex{|;sIOaA~o(|%OR)~mOE5MCbP z`Zkzu49Pq(km&9@hR=r%?KuEuNrcO=^42UT9mIgla%+?%xHXo8B9?;PkLXr!BH2$2 z#LUHBY+-%6u786CW7zqQulJ==!{i&7#1_osbF3o}FoNy)&uD)py-Eyx3t~BDP=G;z zxqM|)QF;b*nLT3QFAIFbt7;lp^51wKito3|ii`Y+R;!nDNdjvRmvxnun58#g3e;_h z37eVuR)H~l@~P}Eu>A$|#Rn;pz(^w~P0$FY4@PCCmqf@6U1oDbb5}PvHg&g$FhoY_ zdHitB`JB)BFgOajArppl@RXMY%KLcA-D8g+mIy;eugOl?EPobYdCQNFYf~~gte!Ho z{gSyxwwbG8Of$fKyat(ky8TcIxCg8va$<*5uE+P-0suf~k^l$}m4GFz=T_-;@EnV% z9zj`lIXL*08z2pGV~i&#snVt;ctggfWkU@xq4Q9?&s&$VEO zBp~u4IKpG-+b}4h&F>l~wZAFR2q~1%F51mj#Pt~BdJMKg8;T_v6{fS;z&cJCis1E) zVL|h`-(H#M+g~!p5MKLh1M=qfreZT&5l0+ryFpasR3MBEu}PyeTB-tkeJEGpU9b t1}pCiRJbcpUZaFIkJNkBR6GFq4J)tFe*XqI5extT002ovPDHLkV1lCtIHLdn From 16f770e15a3d6093eb0403ce8d2caa463a57b901 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:45 +0100 Subject: [PATCH 0749/1620] New translations list_empty.png (Portuguese) --- .../earth/app/view/Messages_pt.properties | Bin 3498 -> 472 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index d7449eea8d9f158b954aeeccf8f1a9c2c209fd29..7970bf0c5cba40b6e46c7a75190fcdf44909bc74 100644 GIT binary patch literal 472 zcmV;}0Vn>6P)NkloE@^#u)JJQyHVW8g@jxzNhGCKq9{pP)b3aK11P23C?zCGUgAn_ zC{dQkTQjY(Ih(WhbB?(`tH<~9`F;EJ>-QiqNV0dxp;niyA-mL;mX+w!#a(C9$>Ehz z7a2XKJ(CYqYfYW5YCxNL2%g?(_Qe&79PmyBP_5MtnLJ?P;L{%j+x#*j22wNQ0aR0J z2buwzV<2+>4rTL8{{TGGepJcUtG9j-ULN84HkfV<$viQT=8<@lv z%;R&cBM>lx?fB1VeIc89RL4dh@Wm8dl26LG`V&E?klekI)jKn~PibSkn zui$_*#y8-LYgLxo5?IQa%VxEWSi&`?XOD=1xFjx65%L+-CyD4)4^+`Wdd>`qwX&{G?@`b{lo?U O0000|D^_ww@lRz|vCuzLs)$;-`! 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 From 247756d84e292145a70a28c7d10f3c616bf38da9 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:46 +0100 Subject: [PATCH 0750/1620] New translations list_empty.png (Spanish) --- .../earth/app/view/Messages_es.properties | Bin 682 -> 472 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 4524177685d013019b7d6ff8c0b6a8a4b7d6f486..7970bf0c5cba40b6e46c7a75190fcdf44909bc74 100644 GIT binary patch delta 447 zcmV;w0YLt$1=s_SBYy#(NkloE@^#u)JJQyHVW8g@jxz zNhGCKq9{pP)b3aK11P23C?zCGUgAn_C{dQkTQjY(Ih(WhbB?(`tH<~9`F;EJ>-Qiq zNV0dxp;niyA-mL;mX+w!#a(C9$>Ehz7a2XKJ(CYqYfYW5YJWhRc?h1~X!gYwiX8Ax z1yHTk4w*b);^5OC1l#;FA_h`3;{jAtY6qGDnqwex{|;sIOaA~o(|%OR)~mOE5MCbP z`Zkzu49Pq(km&9@hR=r%?KuEuNrcO=^42UT9mIgla%+?%xHXo8B9?;PkLXr!BH2$2 z#LUHBY+-%6u786CW7zqQulJ==!{i&7#1_osbF3o}FoNy)&uD)py-Eyx3t~BDP=G;z zxqM|)QF;b*nLT3QFAIFbt7;lp^51wKito3|ii`Y+R;!nDNdjvRmvxnun58#g3e;_h z37eVuR)H~l@~P}Eu>A$|#Rn;pz(^w~P0$FY4@PCCmqf@6U1oDbb5}PvHg&g$FhoY_ zdHitB`JB)BFgOajArppl@RXMY%KLcA-D8g+mIy;eugOl?EPobYdCQNFYf~~gte!Ho z{gSyxwwbG8Of$fKyat(ky8TcIxCg8va$<*5uE+P-0suf~k^l$}m4GFz=T_-;@EnV% z9zj`lIXL*08z2pGV~i&#snVt;ctggfWkU@xq4Q9?&s&$VEO zBp~u4IKpG-+b}4h&F>l~wZAFR2q~1%F51mj#Pt~BdJMKg8;T_v6{fS;z&cJCis1E) zVL|h`-(H#M+g~!p5MKLh1M=qfreZT&5l0+ryFpasR3MBEu}PyeTB-tkeJEGpU9b t1}pCiRJbcpUZaFIkJNkBR6GFq4J)tFe*XqI5extT002ovPDHLkV1lCtIHLdn From 57921ef57f7995e972f423fa260dfca03470ad68 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:47 +0100 Subject: [PATCH 0751/1620] New translations largeOpenForisIcon.jpg (English) --- .../earth/app/view/Messages_en.properties | Bin 472 -> 14209 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 7970bf0c5cba40b6e46c7a75190fcdf44909bc74..7498201fddebdd9c3bf0a85dd50ea3590128e3c7 100644 GIT binary patch literal 14209 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 O0000 Date: Tue, 29 Nov 2022 12:34:47 +0100 Subject: [PATCH 0752/1620] New translations largeOpenForisIcon.jpg (Portuguese) --- .../earth/app/view/Messages_pt.properties | Bin 472 -> 14209 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 7970bf0c5cba40b6e46c7a75190fcdf44909bc74..7498201fddebdd9c3bf0a85dd50ea3590128e3c7 100644 GIT binary patch literal 14209 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 O0000 Date: Tue, 29 Nov 2022 12:34:48 +0100 Subject: [PATCH 0753/1620] New translations largeOpenForisIcon.jpg (Spanish) --- .../earth/app/view/Messages_es.properties | Bin 472 -> 14209 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 7970bf0c5cba40b6e46c7a75190fcdf44909bc74..7498201fddebdd9c3bf0a85dd50ea3590128e3c7 100644 GIT binary patch literal 14209 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 O0000 Date: Tue, 29 Nov 2022 12:34:49 +0100 Subject: [PATCH 0754/1620] New translations largeOpenForisIcon.jpg (French) --- .../earth/app/view/Messages_fr.properties | Bin 682 -> 14209 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 4524177685d013019b7d6ff8c0b6a8a4b7d6f486..7498201fddebdd9c3bf0a85dd50ea3590128e3c7 100644 GIT binary patch literal 14209 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 Q5dZ)H07*qoM6N<$g1HzuTmS$7 From 88b472c369c96fc930315ef298b984bbff5f7c77 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:50 +0100 Subject: [PATCH 0755/1620] New translations installer_icon.icns (English) --- .../earth/app/view/Messages_en.properties | Bin 14209 -> 11933 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 7498201fddebdd9c3bf0a85dd50ea3590128e3c7..0589f39b42ac62e1df44c27797657da2936753cd 100644 GIT binary patch literal 11933 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 literal 14209 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 R)+^bDTQ+<5e^y Date: Tue, 29 Nov 2022 12:34:51 +0100 Subject: [PATCH 0756/1620] New translations installer_icon.icns (Portuguese) --- .../earth/app/view/Messages_pt.properties | Bin 14209 -> 11933 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 7498201fddebdd9c3bf0a85dd50ea3590128e3c7..0589f39b42ac62e1df44c27797657da2936753cd 100644 GIT binary patch literal 11933 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 literal 14209 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 R)+^bDTQ+<5e^y Date: Tue, 29 Nov 2022 12:34:52 +0100 Subject: [PATCH 0757/1620] New translations smallOpenForisBanner.png (Spanish) --- .../earth/app/view/Messages_es.properties | Bin 14209 -> 2784 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 7498201fddebdd9c3bf0a85dd50ea3590128e3c7..800ed67a3ee630d85c4bd4b6e56a4af593a6ba00 100644 GIT binary patch literal 2784 zcmV<63Lo`}P)n3T;V5 zK~z}7m6vOfRn?Wpe`}v}?)%>ErklQC3pQv#6O@E#BnVShFep=q@6jYWgw|2U2ZmUg znVPB8n5xud%p{Y97>yHYM#T^nBOxS`79_!FsTnDvh#+XLG_QWq-S_r=oO{mMYd+B3 zkwlrysycN(>{V;8|9`E$9>QNJU)p+wgptFIvu6c})apkF!a=NtuZWm$3(j+At)qF8GeLBwJB* z{Nm7Bij_LWNb@My}!asDJRN2>d^uee=|#NU8u9!M34#+-1+6z}S~R#q?C zVDIX>_McSU6`_qs_s+l1X-T$@qpJ8JM~;tB_9Of-q&btIwINAgvC7fGGTnV6G^S(Z z8&jm>E}&$R9}(3${iWZYYb3S}^db-ew9wOuta$b&ez^EC0PgJin+~h7HODJ8U3tMh zGPmu*an$b~8^&`T;;w@qM&uilgjVr`h(iM-wB}M2t97R5vvl{D39aRI%|j!v z=}={t2aKIwe-uJdmj3oZK&50Xv9$faWR3|Ba7 zQo}gKhX%?tXX7MeE=LB-SPPzO7##6Qc!u`Y9AL2;ab#eFjjS)Ai`(-Zzbf=}Vs6=d ztNd{BV>XDAcSJVZ6xy_V-8omIdLp3;y(K0$rHOlnp|XF{UsD<^zz=rD$tT z)0~NOT2qR_iqCo&oyn{JEwHuf*|$kQ1UW=KBW0tka6 zKGs??36FP9(0NU*)+QHvI&W;xcdRpyE?un^o4GBpX&I;~mrTD1Q2~YSff0-m3Oz-V zF_*Rp9tVzYWLM#JhAR<966`H`6pBd(Di!Yi%{EqcZ6L5ARuxs4(vqQfxH|se8q%{w zu>fBLFaUujudYW4j5Nw8C(S?wYC(u=glVlg>Neu^<}}BSZ=xYN%+%&OCEvwHhV{EM zBt~mP+;!PIaE$N$t_veV+;bQz`&9gpFtPxo;_V1xLC!4ntjU_Ip8i_a5995%C}!KT zd6I4n0gBat_SPJJ5Rq^bgwcBhQ4y;yB1&U2q&JAzGh}d$Aub*gxFpH4{`b4s^431y zJUB?T9x}77ky14P6l3BzCSidTNXmpZo{H2&BW^frD>_ zzN$mQbNKp;ud;F90fuW8rZr4tR!bYzpiUSmo@2UH~ zhM}52uH+iSl$H#+RE$DjjkudV5deW8GzD+P+-!++kzYEh=VM)N$S$8X8wh#a*iP2vtiWW;i%7m6Gp( zf~e3_H3Zg@a9yt1@Jnu(^-+4uC7!sdgIZK)-sv+L@$2N0G3sGN+%w~SQ*DIW`o_l0 zY-_qccX!>Y`5(n_s8rORatT!>6>~Xqe1u6&X;Lv|&a_!rh3?}S%D&5y5tksc%xrFC z(V0_uvHK9kdcd-uKT5)laox;|h`TP4RgRDNBs}+h4A}66J*&Q1_jii9 zwT5Tk*^7waxdzX12qMeSh>z!Hm^SfKoY6c$Di#ui4lS`5uN*waZ{9sZEeNUBL(~di zn}01sBXxo(qT&ZMW#XgIm2wcuS9jFEwfwWxmTexyM3G_Z7w+6)t-O(or})MGx2c68 zRxQ)>ISM@``b#x}(2_}>LvwB^2~RL?kzT(}C`u%j-b$I~WQzMQyN>C(JcH#LlNwVv z#^5<-EcSM9e=&IOo&NQzD(nBFOI^fK0ITLJg4uF-q-=K{J8I^gJ_UfYPj6)Zksiu zTYG=~#@lUy3NPPxq8%@I^kFeX#;SPR-iIcM1s&cTe#MG87eWeV z2(5Dd$_(NzcJ`4Z;bh93%Sp?t}7` zt*`HD%cefvGg7U0e`$&Rz;XPdwI@cixt;5-zp(Si)maZcrdK@qb6XfHs;a8BR;`{| z#^!TX)p9+w-+y(#o$#$qZ~l1S(M0mTp9;X)4{Z7Ksd(PnM|o-a-!ixJF<$PtiSyU2 zKM%~-NSUZA(Umi%J71oA9@&_8Qp~NMXb}RKKTgEDaqnUKZ!hh04ww8VCg&12ALuVt zrZgtC8brKv$Kq43W^>oB1B<+T^Nsq6ho9_paIP)-VOCXi@mW*2a>f~)IUz^fb?}TK zQpFD~$I3O?Ug*`wcX!Ky!E&K3m-_14f4^v5+xIq`!*?&SGamRAZ{L3DsaLZLJ0Itj zjxR80%}+o@cHVNm&i=2b+64CotE`M7nHr6b>5g#_43R=$p&ls~*#YwH)^z;WuigBa z;>-uSWZ&(J^dk>!VgK!y{pHK)oQI!a=PlRs@rRxQ!R)&AIt%cz2Y=QsVip)N=O`vC zDp-*ogV~i$B(}e}Y(W`d+WlJ`g-C!u+?tDnf=gD#Uh}FYPqHd?z#S?^Taov mmX=hUxZ`3$Pj%`0<$nS5#zFX5+sVe<*tR#eZQHh;Y;14rjqPMNwr$(|a^2Va+~52B_tu>0uKAtn zK2>#2*HO>s(&rWcNm5io6aWMP0F1vrfX_1k@(&jyD-Qq=00sa6c)p+u0GXh%ouLW9 zxaSK2f&$RNKp|k@0RSX(004a-03b;P0NDLLR{_BQ2rw`(a4-mPa0qCKuP-bV1OyZ; z91ILB3=A9++S2z`sle1B3j}-M`90 zLMCDqR6qeGG;oL~W(dfiW~viXL?vMs=rs(K-!1@iOb}KwazaA^0Kxxnr2xnR^7{Tn zKT*GK0R#aD{VMxkrGWrsA|ysaK?MVcfcSidy54DltL-LF6|-1Lk&5jO_IJxWRTDKQ#(;QjI|B*x1N7V z9(r)LPUu=+@;3XqjIKc)P->=)qG?o>M5#79{7^y}SgYEL0O{t6LmREM_WBC|%p1iK z3=YQ>)}EcOp4Ot(NGoK?GSzDtMw6<}HERtrI;IqQnr1e%pmU;gnoj=EIR}6#=pqIM zVioV&ynN(Lu|7_iH~fq=T(b)}*4;J`8>&P9^)0t&`=+N8DJ@SW!3eOb)j)$>r2;b}aCG?p>akJ(Me$tE|*W zBT^p%J2Om{0Z`&2kOK+F4Xy+adGY;q(qnYLlnbG}AN_T1ZOL8~j|xNhQl zL_JPnd=3QC`*!l@5PttH#36Kd!c__N~Zq zsNeB(dTJ~qXEjiza(H$-T37Ha%FcHWcujAm6S7tJ<%c_w~$u6o_ARCS1j zN}#s}PKrA=Z6DYS@WtiUnfSrGrmqy$B}Z2k?}XQAo3gC0aS@0GxlPWK+K6O1ho54U zl}r`RhmNAB6_ZB+wbG5;n&7>6Z{K-p5W2G8(Y?T_XFSKH)Qn^Zdxb;wSF#>U4lUYS zZYp0T9ukwux#TSLB+pK1q~rPeSpo_c6TMQ^K@V3vxL%DsSzqvVTduJ?nTNEr8~!rv z%-=5NUf$l}r$Q)am2oOA*00u&PIoMHEbQ9_GK*tpbMDEG^7dd`IoYo~N4P$FYPGpQ z6;tT(!@6{4tUy;;&gPtL#}a$$+2x9EWaAen9~(AJ;OG2uk7chJKYQk70N~``#<<*$a|-{}tSYKJ_{k$ey|7OUUtl>Q0h)Mx`|#{+<8%Z7YFgZOzPa1z zG;(o|@yaPOir~zCA4ScgUSUFtHR@+MgjH!S0~Ko~E7bL!Oq>M(AgY(_b?{YDamt<)_|Bm0;zk>!X{Urndu%m9TI`NgAaInwUoL=0h zO95YG7%NsYF?Tw7hmUBe{!c{3el_ZMepar@u{f?fKd!yVq5BGtJ1kl^H+a6bleDkC z{7M}EiM;wX)YH9V=YzP5EEi74>n8KRix(<>)mbZO&Mh8?=IZ(&yrtu%l9zP$f5qD` z0_m8|+KduxCdJu9xrTNp<7HcRcGiCHguu)B^&bHMfNGW3Hf^rSLB@wXN~gG;<}rol z|K$Al^wmK?eRUx~aF9;`wm9lY;skk)$6=PBrGVg@S{;(cIfce2z-XkgR92Nof*Zw^ z=1gKo+#G3c$2*+H0b~1#O-skhufYf_eG+G(edMIN@dydd(f~|g;70>~Gks376s;F_ z+s4q&m10gAV7N2}WroaY_TUwsvgpE>AG;0JfKb@S=@rD!)K6c~#~#UbS=CvL8VKgh z8^-=awC-umIG@!D-AMbueZ}>F9^btpC31lj3omAk)+NfYX_R^*{Jq4FKXqG%*AI0d zW7%6$B9=-#=}`{dsV_dUfx?YX47F3HMHNG373DmoIGGP&)mrnkX`$)wsr!bM%kRE} z@*WJ073vz3^IOe_$~r+OS#qB!ezEX_`idGW$y^e%#yyifupCz64CmGxtC|L8_i;;| zMl*S8ss%T?VDF>3vfw7ldM!0-nefdqfRgO zsHg7N&B}Kpc}3DX<29+VmyiTL0ZvlgSp;%d8J=;^n%c}Z^g(}KO5W=qOP`xF-rv%X zd6-w-yX$)&gd$tjGB0>8l+=2x9ruNa{ATSwGW06os&fiIbmKnW=Z75oy0=^@&$ag^ zPd9g~;8PrV#bR?6WY{#$%Zl4M{BGiU3ZJ+hsc^IDU-UX@byvwNt(}~^w?=HUS`x+ zT+O9nXRlHZ1Oy$LA&7*sO2Y`C8=;tpDik$#Z^a-n7KWoW>Ex~^%Sh10^ni=UAyBMKrxYn#yAL+Zx zKCS%;q_qH0IBf!kChaD2+9TdQ*&QjQPTES!|DHaV#BPORGle1wL#6Kc7Wd1Tx(nt| z|M&#lK_Au%HFbFtX2)5_Qn}aU`tHxkw;QLtcT2yAk67+iKumnEgS?o093C4T zgPtzKx0{sE?J{hh^?}oCBPKLL;`mfS^N35D^12Gwp6oLlH_-jl-M2Wy59WfG9rpcu zd&o#d9*`_oWvt2JogR-6D7LdaxT}FPdlhXbqWlTS51I<^ii$&>yHX`pQTt&3Psj!N zH{{}^Z;&T={FB_%-?aOUFPR}+p;ySj&QWXSa4DP-^y{xALdP*$AjOat8G!*WV^331 zWwF&HWRdS;J^+6sSF$f+XELvfO>FWPU~I-d)V?&C*206dQMMkK7`q%A)8h)KO!?orme?3ZL;pV@W?;8$8o~i%Ep6yg@u;jW7 zDPT@U;&VjmHz{oqn;g&g7!ymRgW>S8&CHOKolrM})JJC4o0jEJ2nEK=zTtw6hv!V7 z?N?og=PKRD$FW*JrGR;koxL>giO&n+*?4h}y7bI0WO z8@cZ{vbP`H|EU4ce`}zx{m>zZKQ&EHAU93ZOrSe$JP!%ZcI=BLx0x*=*bcR=;(ATz zznPk{8ToqtItnUwHL5(6XMEzAa-qh7xGn6`cO+h2s6ADGT45O)%{1iWY9h!fW^qdV z-E_jfrq_v3Xc24APC2RC-H8wiU##m&Woqa?PG@EEj_F)7%dql zJ6)a|BaLmObysyw<2`6CMw^A;xJS;TSQ>kxV z=g3mkY^J6?33ipf9hg7!VbeA^#>JfscjXiQ!TC&*{c6Q(_c%NHDwpTDa zlwC+fjW!4;;LI}$D*yWwE^MdW$Z2lXaMRla0U56Iut$vbveFHl zOr9#erE;mftSK{9S@dV)!qw8qMHLOhR#1lNtU>TqC8Q6_f;P&^k&0wKM5D z{B%Z|$a=roe*1ZMPoKE#8nP=CCMMJg!JNS_e&uIXLc$0o#bJ|)jw!eE$OJ8+Uy|v{ zKlBYn2d;zMK+nR3z|Q>Bi#A+gGYQuupXCbUlWqe}WKAaViBt$eU6i2LS7o;eR*XoK zHUgo}x?MO0KLHo({f7(Fil_&VaLjnv^!200Yd(;wzR9^ zuxN*bx)Ml&M)^j$QR3J~V@tjamtkmPGKbR3`H}(yQCY?NU7ASst+G*6RXe-f=L7-B z+IfJgZHTs8QV}N+MG#(tDPh7+2NgmZ;GZ!I>W!B>^ZG;v&o4#KJ^gH|)IjqRYU@91 zbHw7QiJJRYMRkk~8?E5l{RD5?HU3e07!>KMvs^x{3CJ8e7b2m;Jm*&WAw_Mcco)Jg zOXc0fdS7z4JT;!mzRqd~#rkm`yJbXS+9``OubRHY<_S*kQ0FbzIVd}zYZKghhUK|A zGq;edaN_1W;reoSy6)|()#>T`=d#s=#qllK0@7YXPG+k*Ml^@zR=3!RPpU>90mN6* z*o?p8ueb){6o$b?nO+^UVeSi;@8n@K+k5kTmppb%E4-+>QKyS$k%97+5^)8%?ZC*- zLgm0e8#m1xuKc$axvz+O6_0po&o3 zlb=?YYLzaNw}q{o1(%7Aex10|dvW0LA8{t9(i#j*WcyVd%?jQz_MBg-wN@|^) z^uogixAg=Q$c)15$4cP494R-;`(b`@FInttc^rOf8IR(jwn2Ka?6;8A*8u(no}{}q zTyDw?a9aNI_XQ_Cg}K&(0an&F=h}|E1?aC5tZT3`Y^m8F?g@Zzkt5qlTLx_DxI&3V zrR*zhE9xF0G76h=mW92SA=0U;6&~d%AD|Ob#}=WNta=LjtJQl&#mhUVKb<~`OZ?x^ z8nJOp@;(78m#mA$CgG)L->K9}2nXk`8s(JVh8+wNA}{>pQ9AZ9JfR)k?c z(|5n~kE?0D_+^}U#SwO5wIq|Vu=}T8ZT=fqL4o{4pMdf80F*;tlD|r?YafpYmXU|L zre_2@(=`gpwV0>%hx|w*kOFEaoULqXaY{&s-}bXBKLIfq`;o&8_@>Ke;pzRH`_ECQ z-hwDYlUu5}V^5r;-P-u$5jKe9qm;D!PM-k9U$1((1*EV+ZPjD0A&l)R4BY|uRh9?7 za&zK2k2|2PH(^O$a>tV=5kh~*^-|KZy8Zx7uA>@VLr379eEpK|+lR}`+L0X^HwyUfMS&A3EyOdLV824i)!J(D^8Q-5;kY8Vw`UC@_FY> z-(%QTdN<~JUf67TNmr9Fa#{vEX#ML;5B!-e!iKzyUfFHC^7VP2;r1E4iT9=OiV5N9 zu+0ER%u7nCa_Cy;`VOnyJ1uE)Vc{|Fv5nj7YR2y6BFHwo>O&$=nRgM-<3L8Q+}Y~E zDe{z$YFof9LskpFQ}QF}_ZprO8qfNign)U#Q_Nx=)=ci*#!V{pmuI8#Qa)y&z^q+m z1cfw=FT_6bnYA-&Ix~zswyT8az2e5LgqqcMjn2!AkA;zHzI}{3+K{<)O(HA(_CgN0 zqjQSBGyQW-C%5fqKNVIf^ZeQ^A!1~Zx3V5I18qhIXZK?DpeC6rtVyT9tNorR;J2zWI1#;6udlcz(oTKc|@3HNH;Fe4`h# ze6ytf)5*poW>w(Jy8f}uDw$bKF2#3r^%$6U-qwL7CpXaOsPg1w@KpBkQ1^T+XW(q^(rt zTe7>E20W1qm6@mzx(ln1>2SX9`{bjObeq?vOkLu}HJx4wme28gLE&#jJaj@-?Z5*Ry=BA7SK%vQWDB z`}VxJClzLWD!zAm)O;xGpMUM~v`9VgV0o@fK7uCXTHV5&KAE)kds^Sc%vLY#6}l16 zj*z<+uRggYJKgAX&WhEw@5Dm(K(ULAS`1W&*-T?E&e(9-&-r;_i+Cxu{4(*hW+b_* z(*ly@$oRGG{_Gu&p9_RGOIp@qpzcw-KF{|m-YGTF(2=A%dg!VcLuyA02^z$6u;U7 zV^z}RgY3)8fJg~TKC`d;{Y(wfZ60u?9sr;G7=&hCtPJA?$gU=ISY|-AR|@y+E`4k@ zNzc*g;NJl4%cJhs{`h!f?bSVa=a_l0@N;T<38YPrXvk#57rj&$@Hoz5q!6t8Rw!rK zZ9g?ray)gPX?dQyv?tYDZy7etEIt1Th#i$bsQItPmau6sQxGU43JXo632&50iAm4Yf$jb87Q4W4XsVtMQR0Q#+R zm(x7QZTtNdg|`ST)bNR#M8B=PaUkh1N#@IQ>V0DFnTr{{8eb8TBgElZW*A!+ zJPf^gQlHvi-|k;mzRf(Dxe_42wsV>;LO*&5yWXR?Uz6~=cBe#*w2%wVIzvJ_{Em}* z_YoM}AzX+aXGw38{Kh`R2YByAV+VD)8#~FGI(FS-;-d@r&RWsS zRs12+b?_Vu{YH!4I+fRV-^h*j0?2Z+l847nr!cq;J0Yfv6@I?$stOeW3H~nCxmv76TfXx4l0lv0B z|1$;<#8P#i#8MYWyq33vOlmi0yGS*3Ein>gP%?+Y-TDLo;CF8_N7?;t?&K$u6grg5 zzx2>b*`T_l3E01vA90g}t#W#n~+! zD^tt?!K9<<{8l766oe1SEy+00i2J)mJ_>{$5S4dSh4MseVbRwr8359VY)(3oacIi$-3w#@cq5WT3R_f<=z*92Uld zIy!B_6GO?z07aVh#@Lun5}GMxFU%io((jbf(P^Y39pCS%EZ?P1?sY80!zXbTC{&6r zpSP8{Q-PUtHo{EEv+!nx)J6TVwHY+`gUEmcbBIPi4t=a{TQgf!yGkP52_>N}!nAJ5 zGz)9t(|diP&A9@NBH3Wc7u$yrG@A~smqo7HnF8Wnm^u4YMd${+X}xWzZ1rzPfh5h> zLqe)Ks6(0zDqn-bf9K=>wvHXu0@794=9?ASU=7zR>SvdsDLS>o=d462{>*?87TE34 zf<|QnbUMU^3Qe9X24Q(p^C~)BXK^2)X&UFoF7N;hNRZIjs41)CoBJ}&O6Udz)QG9B z$T_W<;h_qM=oLM{iq1J(IKtDmIKMDNgQc@Lt9HvJ1$7O`lVB$v=Q{_QdC&B=emb-^ zTH~lz<~w*w=rG^~JT{e1x0(eWu_7*yjRO%DJ4T80N2U*?Em4$U|AhKowdaU+5@kxY zerfGgrbCBt2g-K8vu+Dr9e5)Z9moOFj*X?k5aqOeA1(xyW*xjR70OnNLH>}%QK>y0 z1KHG^dInPg+mQy-nJzqowr|R8RlwXf7V&UX@GY#hPCR;>b}5?hu}%e^J^MEIn37~N zwLqZP;7p6Hu9icwQjjga{oeKxp@%50uECBTgO!8!xT12W_Ev^rEAueqc<^QQ^$ss+ z?4k|5Hqf*TQ!=&S$!&Ujza(WBSs|HA=NvL1NW{F@Ow_p=udJiBdAeeQ)S|&P$Q!+o zX}_L<)WJGthuSqjPinCz^XP-Y_1&awBt$0`18n=hv~y=D0C3PAtm5BD)j z19s>oXQklth=l{4F{1lgL>IG3P-5znNV`l2fmoxUT^hlV>Yib2{e(w2%@ zz9-1uB_QH}Hhs@k`JRCO>n9(1G{o7@-R}tpzhc?Hqku2P)9xiq{K|nQWb&Xx(P>Ce zB>4~;-cBUnk;sZS`;IRrZ7oHXAyt_XK!~qxX7QICb+F;51&7^vN+g21)1Tms2u#cK zj7k@d90_N%2>v&l%#xPMSaHWhPC_PY+oCWrpFhSS=`Vx%dC3j>HLA{dZlu5e+%k^&qrfu->ZtWS zLDxAb4l;prIKk%2E{DWA9{%UG_%9npiWJ3pjvv4O{Ng3}7QQ?nK^Fhdkvs6qKN5RG z|L`Q#ZPDp?KmYY=+UhW7^V+|Bf*_g5KLY0M!(&>ZL-XHuqAKEixLK&{MV^g;5NbBnm6iG ztD>EXH(QuiD<9qtafC!GBW~_JcfW*{*-@+H;bG#-{sN7Ka@55gf;E$YXypgdpDm`! z{Xd_8gqZ0b<4!-t44=cZbThXywT6#9QldJOX~z_!r_`-0P=Rcm zs6T)P63dZcPA6QZUBYX7S2vO62V)yd_tA`7@NG#bZ7Y*)k4@**&PDV31Hm15;rpsb z`_egB(a1e#-C_V66~)wu;GU*)x1bHXx+$4&$?7l31<o#|8j<^vmuoet>L{vG*ldW|-GN*IO`t3lKByr#0PlJh(1jmgG(@m_X zR!y4G+U@J}FksLSB~4GXyjPu;k2Wd(p6>KWyFK>*XiBYAPK9Jm$sau4+T8AwJ< zqi)(X(H;|#ykUyKc2VYh{-BNRHfGn_ms;$+~e|y!shP#Km$J3k);!1WhXp8R!dzHPV zEOW^i*RFb+>wthre>fEB~i~A-E$Wx1e0bD*cd{;gmW!McR0op z_wk=HeGC-mhR;7L;I4f=oeD<8%_|@~&|fwklSemas$6&Xz*q-IP&#R(-?Mqtn*+^Fp8 zTk6u{Gx4$XiF}(lweeAP1NdwpV(1}Mj`Zp%R5az;22D;Ke`Mx*z5^kyRe*^ z?;vV-i~bauMW-fM4`DOA%@yk#{zz^nygpA+R<=^}#sZ*)<&%Gg7viV!3V!VcPsbFU zQu`?z&kPJ$<9-O%L8e&A%2;VjzL=}PW^gO=S&E_yj zLG-L?nbNdS>+u=4h1fq@ejQr~!Z-~cua~mzI9$=)(fD0kq%4aYZ1OwpzTN9s?G8vm zmdrcY9bbY<+Xxse0xRv#OPMzy2r#b^66U#_UUz*bF6|aCTsP1H&-}$(vr(MTKeAHA3_F0^~vP!5zUwS2% z_J`?U>d61OEc6LLSs&v^96K%A2ztx(g3}{UDuYc5UEFa2?irl3m5noZ3QmF3-P7DT z|Kw0u{suqYIH$d16GmYtoTD-ah+L&Qa3OJ~(DcUv3b+TeIz3Ff^@5K~OkI2!KyPN2 zyp;(Er>Y#`?hcmcdNRG>;I@EFEL-I_b~D=q#;C!PO!~$?corRLL6grTLcF^SWXQ)# z)IX(7Fz5fSJV(Dem>6eNrO75}2`^Bz6*{?bbO}7EjDp&i_erCx{n;j#Q0`Ufn;z1` zj?u(X7q=bPQyHzwN=O|k&b{y!C} z{1gw&YywYFSBr3-n*yVMs@<>dN{g^p>TfTB4~gT;xu zlHMcxwY`kTXKA$SO)39xKPG)@Iy_w#)`n!GUIIr=uJGD_P!*10xF!YOH@_DNlKoi* zN(SIwDukEGPRC>qIErY>sydLQkoqz2p#ccSW8MgeK|tjF5&XquLFSi;r)W7ZKWfJs z8Jyf7hzWh5@N~ji)?=DZ7v;rOECHGoGeFV_X^w%@_7{i3dDS3-sI~Kg@m#*ikQ-?f zk9nsfYJ~2^n#2_&f!zk{$6IFM5l=);^NoGEvIxl?1WjIY=FU;x(I7HeaXs{&pTcb; zrX}Qu-RAbx2N#3CF{;0I->u-a98q1~_j_V?N!WX<{dOyd?k&dEdVMaV6Y^@;*t~t} z7_AQT4mg9zQnOJV_Ec6A)8RaSHW>ey7ih(kgA?rbjLFG*C&kJe7M@i91kk!lF|=nJ zoy_i0DZ@)zVECjUIX1bKpAps$D&2a#1(K6V4XPwxG*Ibns<}!F)c6RY%<|YNb9TLu^~Xadjp0dTPAmD?ZaVk)=EN8uE~(k8)E4eT9wsR2MOxaHK^CzJ#wY1r@$gkj1>tt&TgRsf;1O z(g&zMm+JY8Abpy1`lt(qV+45x|06hpp%%9Y$f0L3?O`&jRVa6mjXhp%NBCUNUOoMi ziv+c=#T+Jz$hbF!C(`}SGkkNs54-=a?ff%a*ueHbbl8LYSp1MX_uJzPLY^q@*}N8S zl;_5P%|}?dMli6alUVT*X(fIuAsi24M9*SQ(@UEOhc>%{Z&X+s?oiQOMWum)hk5y~ zsExN~8X{^VEsMB-%k)apR25m89>%XM@?H9d#oN&z!{+Ymy}_4Yk^(F-C~b^fUaAOf zlDQv|?ZRIEM}3& zz{Dy@nL?I!=oGpD4{x~;{rd@7K@7t4H+08xqToCfB<0v5v8{z>Z>P#PlvM*Pm)5Ls zlt7|=&apkOgM(46W0a&nj~5>#oRSY)Y}fStRL)YVFAR9B?xlhdF)}EjH$%py5K9-q zoF|Uq%u*uF>mT;8jhltpTDmcmH9C$45c$?M(o#|55liNj4Xv_fl!tJl0ew&vjKPx5 z9V~fXry2o0Mor*@5z$Ut?S0PjZ)R^(L&(^HP@qYUG^Y!5mk?c{OBO+l2fD7qz+a1nOUb&Eyaj~ulY@Y7%hCVM{HEcQei&3h%|a>Zz^b4aS-;I3=Qe3g(l%Goqy`It^0W+YQ%CWJHcid^fI&=Sa>C6pxFJ5*$6 zsLSf%bj6dcg}`hG+G$hVQDVeui7`8>#tGgUyNO^@$7rpfHu+Wmfzoeq_Dl%&J)D+h z$yE5B6$93R;}oBOX%u2|^=7UkXDG~g>k=BpUGuvwB62m@dZ`%Eyg&#lQZ5Wp;)eU2 zmA5N!>hMvTfkNRL$T-r~ex)Kwt%dMg$8f_|$>8~rOEU_#Jx>~hAFA!#V|5^O`KS{g zZw?z41_}__=1Kb~Qq2+4B2xC?Jv;?#=qa>UPJD^_OS^Rr(5A`l19O(39Y@l^xcwe( zv}l2(a1sq#Tdmg0FRT+&qRMMH165C80!{(wr$vUK6H4*u?n>!#`w3&d-DB{v`rxH-_kF0U%~L4rtQO$}W#JCnCI3|h z+=2;Bkij#?^}Jh|7=#ghX@b5LtSOnYg@!6^JII_Yyt71z-GIJ|CsZV@ww8ee^#bD+{bMXj+yxH&hIq8TC-Gy4OfN1CR6DsEjt?EJ= zv@Q^Kz%9OHO?Jc4B%Af#sqjlc%6@WE3}=sqlcN%)F!hQH2RuHBNQ4ocX(ld)e%7(} zVFzxw`IM&YUn7q&WCr&f-1$_vMmQIpKotx+n=J?Uw&J`&j|tHdWN;5L$=g(>jz(o! zWA&=QCjq7g_cFyXZEn~1@xP4eU4$FeA0{58!?0B;U%FQ zZeT5Jca+^DVX_6;ug}fTES{a%BpJzWpfdX&$Jy{#jCh=kaYe;mb;gqF+Q6?dRV(Eb z7YwUhZ*kT&Ecf*F?MbPwQ~bGz6n51MouOO%`7oHv#cYfr;+cg3DJB_Kv#Qfy1XtnC z)gebW+(CqAwclV&w$~@Eke`#z}&ocRgvr9j`c#YKrkZ+dG`lXzKxWn+nW&Ko?$?3#6B%} z8wZpz4l3KuoKp`E#vwD;TAK^*)(n+1%QyUaFcTs+|3OVMg*L4~Q2Ae6SF9hHetzv& z8@SCZ#e0Y4+9D$3z4cPTrr!NRaB78>Tg}x0)M0M)2m*7H-Thibe2S8UH2#?-M(F$PmV^e*wG*War!2N-Kljhi_jv{&Gq zfRsIr=vM&>x=`r7&oy(K>~=4^ss%Cq(nj5{_9)|xQsFjSiLj_lD{c*%#3?^zuc-YY znXkVkXS#WQ0zBT4dh5+kvd6JL0sUYai2-nG6m`BC$_36T2R#VLhrY|F3_WPpK7<&C zD*3W8M!ZO;x>+B!u$rW~ZueYD=^wYDAVDYS*)Kz-o<}D`X$O#H2#tOc0!@a$y}gE+ zhGmtK_}Q?*As5&};^AIN$|apujHLVdj>h9gY=X`ogU&Jt*E1hm*+{SWUA{GVjBS`w ziY+F60^s?ZSbgh`ZKCIE^{o?OBm=_xwwU&z}G@ R)+^bDTQ+<5e^y Date: Tue, 29 Nov 2022 12:34:53 +0100 Subject: [PATCH 0758/1620] New translations smallOpenForisBanner.png (Portuguese) --- .../earth/app/view/Messages_pt.properties | Bin 11933 -> 2784 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 0589f39b42ac62e1df44c27797657da2936753cd..800ed67a3ee630d85c4bd4b6e56a4af593a6ba00 100644 GIT binary patch literal 2784 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 From 181efbac3c1e64237aaa8ddf362df6a2766172cd Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:54 +0100 Subject: [PATCH 0759/1620] New translations Messages_pt.properties (English) --- .../earth/app/view/Messages_en.properties | Bin 11933 -> 13932 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 0589f39b42ac62e1df44c27797657da2936753cd..c2ce51b7bde65b8728f35c203bc8e7743d28a01b 100644 GIT binary patch literal 13932 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 Q=-;lCN4kXZe+|^~A5C-NEdT%j literal 11933 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 From 2c4949622447f2f87a9d5292a2e3fc0b0a7019b8 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:55 +0100 Subject: [PATCH 0760/1620] New translations Messages_lo.properties (Portuguese) --- .../earth/app/view/Messages_pt.properties | Bin 2784 -> 27713 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 800ed67a3ee630d85c4bd4b6e56a4af593a6ba00..e5b9bd9e452d80cd97e8be13f45f089cdf970145 100644 GIT binary patch literal 27713 zcmc(oU5{MHafa{tD^7f43XoRfr#>K2p!s1lk|HIPV;SJhk{po(FFA|Zr77jgR1C;r z%sbi!sl>(-FbG(Xp$MeNopt`pBEKY0)!W^t&Y3>5vlNv81T;HyPIuK?Z@pFBr)PBX z;^fBW>GA5?&;2#ia{Vp;lzacWJKMqVj^oE2EHmA& z;%+Rs>v!KPe!hs;H9YNF^D9q~u=Tqc>06x2ApC2N1@C{IhEFfTATwOT;%^dAhMO)f zfZL1wX}l3^{Yt~=3&&PYU=r6m4eX=ayR#=A2rzQ+XTS5PxeK#b!TfUgn2_kVHV zvw6 z-tTAdQ0v7Mr`_3~ZK$2!HmA=2^KL)O|6_OdDDz!F+&xfnQp61j4OwfJRquVJ zIXhk(H5cBhetHPnM89y>C^U4rli!fSw<0G(hukIMD!5eVRZ{Hjl7q)&Ul@Ma8t)+Q z9{K082fM$n&ShD1eiPC(=TDw{=cm?2rIdIhFA!+{oDfM}#Yc=nY^AQTg779c>V0b% z@*oDg<6A~+rFi*BdsAYRA#^!4c)fFnnYyE6lhV!0#tvqY#kXqVk_MZ@HiBitH`U9$ zAk2Q#PG)6+Al>uZB9~&3$Bu8AI9}6SzOlYGzO=eIy3E@b-l)!|G`(-LseHO&KFpTG zDu{1;#%XwiyBS}aTqmwW-BoeZ1-cEq)$ghuhR&N;H?OUoVANh+#*oKu5y1rrV!dU5 z?tledkNO$HjSM`@PGlW5A>?{tXZ6edQ1VA8;dBwT@cwt802aPYVJ|ccqgu;TX8XdE z5IK`k58Os7y1O`oaPUtb;fnGu++LM617<5Dfw&0+PqNs#WU@MzK%2YT0jFteJwDa& z%}e70v)u5`eworL4l$1d&uv~@vvojq4wJ->-h0?9UF@!%Xecy~epvjqL=ZS;e0@td_v@tC>PSfE9Tl z!&950vqV6)3IjV>y@^{1k`D3@I}pa`p9Z?D0#OdU0ykH~^S4N z99%q64Ve|s53i1z^Q+@u+-S~^roS9b8{?Z%RB9a&pgupzl?#(v(O9XCZbEZ`(FANR z1+z+1>i9>0sTGm0AW75^sA?HLqB6|=LYZt-+JL*VSCLamv|`?$&!|QW9%rTkD;C&% zer1oWo;`}(vcc{os?oZ*mo_>)4Qw{{@q9cS;qTCaD4tpH!m1R<-imR{JEq<6K zjb$=CxnI57x8ic&7UA8yI=JPyypzSL!i|QDF8m$PkUbF{%p1x}G(;M{_%BnWgx)DYu#)1W$vm2nos)z4n1suNE-LF*P-#S`u=4egOaO+dKd#jr>ZkM&UjQj!spytfOkn;}lz8hkk^SLJXGCpo zU?GbKi2)0Y4rC5r8{uj*bacKdmk<#3I}U(UC z>+{k1MdK1nDXYdfR@$wi3z0~G33&uE;RXx4tfoFkRqh7Thcs-(W-woxmr2+R@bXR~|P9 zeVuNqo=l6AEfeHIV8KUHC6_Q!x8Pcm zu9~SweLK|jrISLLqDAgnP?xB#M{UJ*_QuATExCarD|Ug4$yd#=W92y%7d=kGYpbm7 z9QG~xDx*WpiM+V*UaDlJ8a2sUM86UuA28O=aJ>mNf0n2QlwD!{Ub4Qj_O5z(s5$kM zGpF7utXQVMJ!UHA&mz2*VQE@3`s9$lz=P9D0O-AwMg7-7tN!Z!4HaG0sU!@90b0CN zM&WddK-Gyk&0K^MV||rFCgYejHzRvtXgAv6`|#QKV9C5X!^*-UTVSnYCQW6gq%+Ms z@4ah8u!6%g@uCWm$=k|GwO}4oH;YRpRaN#vg z%=hC7CV6m8_*m?vkL-CVZ)iq_m7bM-1TNG@%kP~aR@myc>q*KoE&ZVFeMfDLSGo?8 z9RR+Te^q2nXNETEDa*9)h2A)v(d<0V1e33ue;Q%Pg*Svtxs2tQ?T+LG87j#`j~wER zgKp7);b!WZ-)`Q#IDPp9X6!`>lXTdiO%%%^2Xf1;m1d`EV(%M!#8Tp*E6MS{`Nen2 zlx?)#P=g>rwqw zO@C!9!!0LU>JCkKicQNjUUyx^6hQ7pc13y;poE~i@-Y^Y{Mt#0(+xvv&2pxRJ?vB3 zn+n>}w|<}70y~x|0mrRs50rr8N18L!>10~kfDBI%hA!inG#KkuVUD4q@GYxV)tIUF z;h9K5mPJ5&@0Z*l0gYKc8>!8o&Pco0)S))htHHZc;VX(1b2|oYaY?R_u4cq*y?jRr zP-I-$a*85Rf&n5u%FcnoUBzUt3TMyaa))J}0VdR}uI~If{@|iEV9*KvVhpzMr0WLw zAr|U)t+cqes_7Bhq4W!8v@-jkZ7sVpA08EdTo4ZqdmVy)o~TK(G5z9l*>kkff)D1(JAA$O;vYHDIB;&NhZuzKoa`T zII=b+VpO_frY*tTx%m!ZM(P=7^oHGNy2$Dub`%UvKO8@Ek>%qFFe*YTYv=RE=x;83CR|bsMp_v(c zJ{Yr|5z3Bdn>H8Tu;NfCZT|3QDOV(d!F1sL^-WgDKO6tc>h!YgHARgAOV{-z6n@$v z$J#Cv6TL^t&&;|5I%jR_?jY7$cKMzf9pzO1$ZkX;&F0>)T9-4*pFFv^juNfswy_gt zgFcUC2VqkT)qQU5?V6kC6G#d()_Y&10ns zc(-?vt#v=b#+NQlCezEk4{b5|^Tt2nk{5fQs%}QJ$RMy#Ov}7#7JG~p2Y>)RD}BN^ z7GFI}(yD}OaP?Mma6`ugY$uiBEA;6hec19MuSH|^wi)P;Ql-JSP%trM+uwmY?n+K& ze=~~9R?e|t`#@;8m$gP(NOE~;`=8pVW{cVdxvf2E=BJ$Ds2c4#lkHQ#t5bB8IozcI zVV3Ps_$-|YjdPMb|A^~R18*XSPMdIj+mTUf$XJh@!9$EoD>DdQyV&Yz&S7Z|1TJFC zYno|UL(2!J)HktS;R=`WDU_N}=^4v%{nYQ%KPS!4SREcLQ*z}cO01V1! zxN6Sj!5vR;$(jv2=CpEgl^W9NVYoH6H<+W5a8}CDR*Am0nK%zWdax|UgHA^GfRcXy zkyy=vXo*qIWc|*wPP)=oBb+v>UCS+o-q0b+L6tGyePMd3uN ziGQhrXlaR>aUff<6c(OE#&G{;hCSI8nL<=7BzhA!?I3g;FiWs99}Yz(^Jfv~x+#_r zr4{B96XqUck0>+okFf-9y0C0Wc{**8hyH>k4MuojF@y=GG^7$$o1RO!HI3b$+p;Bg z0__UKzkl&^bL!0LZf@EZlWHiVVuvjLDr2TBkJ{emhFjk~5@5n*kQ!b@h#sPHa@=*8yer>yB5U+3Eg4Dn*~QSWa*QN8USHPhe8|X{VEkPl_IcrgXgF;NTKw&OuwED{lhVIy9(M3?CvkBYYbz1bP zn?qTA0?X2tf^G^I^at|y$tp0jD$yHP(nn8(H?mq0(*!vg%|&T9ArJ*{wA>Qt06&u+ z-18^IU2oMZK?0g)wUbe+;xKhF?HRA`V~IT`L&_g?o4kCP7DMI~_u_?s?`ev2!}?ND zb*oUW2u;r#6J^`6X#5*^&6(?0#@9#C26ss!r;Sa?h@l1PSf+&1H3|m2!Yo;E*KO77 z2piW>Q+hS&sOk9T_}XY~b$!FEfQ+O}Nkqc;IMay12y0G?9kN*==1p!@(9!&{ z&3SekP0JmzUDI7ic(3`<`1%#Bjp6^^&Cuh{f%0!5i(uuH=Dt=52D$ zd#+>$r}OBgIW@Y>fuu_tztpqNt`v1TVUkDkxS&m2mgi+<;V=>%ye%}X?!Z}MR<~Xl zp)bgOI^{>x$xV{Rp6hh<>zGuSIT!To#Iq*Boggv-mjxN9trL55n^N1iJlVJ~g4HeX zn3&Kfyb}|gMX*?OB9^%?vxkZKwT((%YyVLS00R?0dd5h3t-$57;RH!arCEDhNt~T} zD?KvuEimZfT4K{8ZO#vq+bVd`kC+V|AbU2dldX){ygOO#?NaHuMs50Ljf)|=@yse) zp(*tgOUhCbsO-6Y&jyngSGXUaIn&rvjONVc@g~m%5Blzu?MQiSx<__8NnVSkVb&#( zy_1Sr^WliC@@ezo^alU6Z)EoJ|Cn`C(%nv$CKt@0tjBI#6nnx<$hZ6&q!68!COmTy z(5hWEOf5#rVV@e4sBNl+i380Cla0+Q(-Dioxh3auUlV&NMQZWQHN){zkTQ}0Z>CcWyNrhkyumOJ`klGwfxH7laMJGBYF zS5TiLrl+n>C)axW46mBx4MHjwe{Zn{jr!pgB7ojjpXue=(YN zXjbdUVA=5lD@`_U!_HgCqGyg*EK(A!%9E1JiSg?a4fwI;qu;U7&7kfKuUk{qJ_A` z5%hR54+~=*9DZQpmYNY>bFZoty#?jO+YakF@(CZSwAf=pbarLeDEm+?) zO-l+(Zb$1soe`gVH^~IO-aTMr>l{osEBm7xz1w1Z!1s|)USD1NbYr~Hdt8tIW--_| zF9Ano8Nj2DkEf%Jt7$tLbg9jS31x3H0BPG!SY}Pb3j>pDZ#Zq;`^>CkiMp0)j0Nmc z9B?McwsoHpTkAV3D(M`qrtn`%;S@qy3AA^mX2D^|ml=I-ymICgUy|%!2n=vtefE}n z;+zg#^gdrb5jU5PTraFCD<{i@6Bj-8;F8w5sDI*DUvk8gUygi};`Hj~s-@oAXfvHt zi1>D!QV*I9Z=96mfz>zl!7}hBJ4!d}4&1oVP1;CI_&9fXMEn_k8?0m@nO-VUg<(EB z)8*W<_Q=aIKMVoAB9s+gc6$GZw|il z(lKs&VNOA!AE{wJ;2}M^zP_Rp7{;VBi&k|`CTn^bzf`=GnC>pahVKqr9Zsjq+rjmy z)f*LeC%9=suXVnOhJV_TCw;@j-~SV!w%2&q=kIIxQQP&!ehj8WyKot0_*3#9rcR_Z zy2ZVC^C0*aADayv?sF?(Qmz>VMVofNYyn^bn;Huay6Ca}o8uD!NbQF99xS#> z-0>q4h|Z*N82<`~S&SK`c|VgF$XHi9L#<7&)*?Gj5Nz^={o>$eObsb}?G0nwsWoMP z)S)btSlD-1ziA_tB4{R*16YuPvR&e@j#JeBzloIE`<{7iq}I>v)SL#BoYe@LxtZ3U`*C*gNXv6byRw`i zXC)hAH|j}7qarSdohFgI`lij>J%2>RLPed>8XsnS=D{w_b}WTa$&5o?$c7S5Z7iL~ zcIErXOx7OUDP_vF2CG^HBOXQBc+F0eI<-;>bb-{L?&GO@kqT;yhVKH+9;h?+aHHK- zXjP=p7w@1<;u$sW%YyymTr2q$Y*H`oGowU!jI46k=V5+J!1!B2v!a3paTzU5!#zf_ zI_0CH)J!YY4(OP5{8<1ZoOi&^{VM=r;6SOLlYxefWX5aDBR_v(KedyeE^|X#T8NAx zm5hlZ=A4zCX@Eto>4L*Nt%rO|O1}%^EoK|90Ic>NDl`e#y#9TDF~NdR-+K2r5IRz( z14?U|Rgnw63hA>TTw|ScIb*PRvL%AvQR`v;#L8P;l~`Jo6ajv6LaPSjmN(Jb z*7}K6uQjyhWj(EWONnojQgz(LOeum`iL&rd9sn>_gL-8NlkC!uXY?o2C7I@p%sxn`XN}35(DtJ_)?cmYK zgqG|3|2izIHfrLDrYunMVIki4(?zu%rCLro$|>pm^}bfS4=Rh&R)jRvef#An zGCn_T&s&`KvrqQz@EFQSevEqR77cNO8{vZ_#CsKsmlT|MrInh^z(^_-?b})Kwez@a zFjwk9)S`LWL40*uO>rD5E9E#^NCM-R@<0t|S~4ZOs)A<8mVPua*BIloZK5o?Eq!HX z;6P_*3xcT8fyU;GJdz41S;zbe)Myy^G=i4~31oFT z_3+x9)#^vRI{kJLGWR?kOoMkIF1Mc@g2nn`<)e}yiy~`ZP>q-^E|ur_rV}N0M9JU@ zcPzN}Q)TELN#~_IQ4{@CC67}q=(RuBTB~D{4aMz6?bEX2z~9@q?oM5uOg2W-GoSG7 zyN#1KSEu^l2z+e6nO?rgWb~>XojCB$wKYXJH&N;PRLZL-Z6{(m(ylXoQ4m6{U}Q0DyD* zo%`AzuR^5mZeKMnx&oG~`AX-qAK;-4~*_kmC~4bsK$ z%|=~%;BiZ(28FF7C2@V;PIStBfYWvxu*kD0w_AgzX_sa{*x9s0%>t;k8xEyka|I#k z0PgWnOQ>g8E(;`As)2r^t%K{h3Rc9W$OHAfM3DFO>sN_&&84;R`o#%f+U+dRsu9zU zT}QS&FC&3thLyD2YMZki`kVQZb z=;&9?ydD0pEN4z1s4ib6?J;)j0_Bd^YA0m4+kCJ(wZaL(7F4ex(Tj{Clx1*;*E=b3 huWq9vNgF`&Th6>#zs!Kut{i}}n3T;V5 zK~z}7m6vOfRn?Wpe`}v}?)%>ErklQC3pQv#6O@E#BnVShFep=q@6jYWgw|2U2ZmUg znVPB8n5xud%p{Y97>yHYM#T^nBOxS`79_!FsTnDvh#+XLG_QWq-S_r=oO{mMYd+B3 zkwlrysycN(>{V;8|9`E$9>QNJU)p+wgptFIvu6c})apkF!a=NtuZWm$3(j+At)qF8GeLBwJB* z{Nm7Bij_LWNb@My}!asDJRN2>d^uee=|#NU8u9!M34#+-1+6z}S~R#q?C zVDIX>_McSU6`_qs_s+l1X-T$@qpJ8JM~;tB_9Of-q&btIwINAgvC7fGGTnV6G^S(Z z8&jm>E}&$R9}(3${iWZYYb3S}^db-ew9wOuta$b&ez^EC0PgJin+~h7HODJ8U3tMh zGPmu*an$b~8^&`T;;w@qM&uilgjVr`h(iM-wB}M2t97R5vvl{D39aRI%|j!v z=}={t2aKIwe-uJdmj3oZK&50Xv9$faWR3|Ba7 zQo}gKhX%?tXX7MeE=LB-SPPzO7##6Qc!u`Y9AL2;ab#eFjjS)Ai`(-Zzbf=}Vs6=d ztNd{BV>XDAcSJVZ6xy_V-8omIdLp3;y(K0$rHOlnp|XF{UsD<^zz=rD$tT z)0~NOT2qR_iqCo&oyn{JEwHuf*|$kQ1UW=KBW0tka6 zKGs??36FP9(0NU*)+QHvI&W;xcdRpyE?un^o4GBpX&I;~mrTD1Q2~YSff0-m3Oz-V zF_*Rp9tVzYWLM#JhAR<966`H`6pBd(Di!Yi%{EqcZ6L5ARuxs4(vqQfxH|se8q%{w zu>fBLFaUujudYW4j5Nw8C(S?wYC(u=glVlg>Neu^<}}BSZ=xYN%+%&OCEvwHhV{EM zBt~mP+;!PIaE$N$t_veV+;bQz`&9gpFtPxo;_V1xLC!4ntjU_Ip8i_a5995%C}!KT zd6I4n0gBat_SPJJ5Rq^bgwcBhQ4y;yB1&U2q&JAzGh}d$Aub*gxFpH4{`b4s^431y zJUB?T9x}77ky14P6l3BzCSidTNXmpZo{H2&BW^frD>_ zzN$mQbNKp;ud;F90fuW8rZr4tR!bYzpiUSmo@2UH~ zhM}52uH+iSl$H#+RE$DjjkudV5deW8GzD+P+-!++kzYEh=VM)N$S$8X8wh#a*iP2vtiWW;i%7m6Gp( zf~e3_H3Zg@a9yt1@Jnu(^-+4uC7!sdgIZK)-sv+L@$2N0G3sGN+%w~SQ*DIW`o_l0 zY-_qccX!>Y`5(n_s8rORatT!>6>~Xqe1u6&X;Lv|&a_!rh3?}S%D&5y5tksc%xrFC z(V0_uvHK9kdcd-uKT5)laox;|h`TP4RgRDNBs}+h4A}66J*&Q1_jii9 zwT5Tk*^7waxdzX12qMeSh>z!Hm^SfKoY6c$Di#ui4lS`5uN*waZ{9sZEeNUBL(~di zn}01sBXxo(qT&ZMW#XgIm2wcuS9jFEwfwWxmTexyM3G_Z7w+6)t-O(or})MGx2c68 zRxQ)>ISM@``b#x}(2_}>LvwB^2~RL?kzT(}C`u%j-b$I~WQzMQyN>C(JcH#LlNwVv z#^5<-EcSM9e=&IOo&NQzD(nBFOI^fK0ITLJg4uF-q-=K{J8I^gJ_UfYPj6)Zksiu zTYG=~#@lUy3NPPxq8%@I^kFeX#;SPR-iIcM1s&cTe#MG87eWeV z2(5Dd$_(NzcJ`4Z;bh93%Sp?t}7` zt*`HD%cefvGg7U0e`$&Rz;XPdwI@cixt;5-zp(Si)maZcrdK@qb6XfHs;a8BR;`{| z#^!TX)p9+w-+y(#o$#$qZ~l1S(M0mTp9;X)4{Z7Ksd(PnM|o-a-!ixJF<$PtiSyU2 zKM%~-NSUZA(Umi%J71oA9@&_8Qp~NMXb}RKKTgEDaqnUKZ!hh04ww8VCg&12ALuVt zrZgtC8brKv$Kq43W^>oB1B<+T^Nsq6ho9_paIP)-VOCXi@mW*2a>f~)IUz^fb?}TK zQpFD~$I3O?Ug*`wcX!Ky!E&K3m-_14f4^v5+xIq`!*?&SGamRAZ{L3DsaLZLJ0Itj zjxR80%}+o@cHVNm&i=2b+64CotE`M7nHr6b>5g#_43R=$p&ls~*#YwH)^z;WuigBa z;>-uSWZ&(J^dk>!VgK!y{pHK)oQI!a=PlRs@rRxQ!R)&AIt%cz2Y=QsVip)N=O`vC zDp-*ogV~i$B(}e}Y(W`d+WlJ`g-C!u+?tDnf=gD#Uh}FYPqHd?z#S?^Taov mmX=hUxZ`3$Pj%`0<$nS5#z Date: Tue, 29 Nov 2022 12:34:56 +0100 Subject: [PATCH 0761/1620] New translations Messages_lo.properties (English) --- .../earth/app/view/Messages_en.properties | 475 ++++++++---------- 1 file changed, 220 insertions(+), 255 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index c2ce51b7bd..e5b9bd9e45 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,255 +1,220 @@ -AboutDialog.19=Ocorreu um problema -AboutDialog.5=Para mais informações visite nosso site OpenForis.org -AboutDialog.6=Desculpe, um problema ocorreu ao tentar abrir esse link no seu navegador padrão. -AboutDialog.8=Ok -AspectCode.0=Norte -AspectCode.1=Nordeste -AspectCode.2=Leste -AspectCode.3=Sudeste -AspectCode.4=Sul -AspectCode.5=Sudoeste -AspectCode.6=Oeste -AspectCode.7=Noroeste -CollectEarthMenu.0=Importar Arquivo CEP -CollectEarthMenu.2=Utilidades -CollectEarthMenu.3=Separar arquivo CSV em partes -CollectEarthMenu.4=Exportar dados para XML (da data específica até o tempo presente) -CollectEarthMenu.5=Exportar para Collect Backup -CollectEarthMenu.6=Exportar dados como Collect Backup (todos os dados) -CollectEarthMenu.7=Exportar dados como Collect Backup (a partir de uma data) -CollectEarthMenu.8=Exportar dados para XML (filtrar por atributo) -CollectEarthWindow.0=Erro ao tentar exportar os dados para um arquivo CSV -CollectEarthWindow.10=Arquivo -CollectEarthWindow.11=Fechar -CollectEarthWindow.12=Ferramentas -CollectEarthWindow.13=Baixar dados para CSV (Excel) -CollectEarthWindow.14=Iniciar Análise SAIKU -CollectEarthWindow.15=Propiedades -CollectEarthWindow.16=Ajuda -CollectEarthWindow.17=Declaração -CollectEarthWindow.18=Encontrar parcelas ausentes em banco de dados -CollectEarthWindow.19=Collect Earth -CollectEarthWindow.1=Erro ao exportar -CollectEarthWindow.20=Número de registros duplicados\: -CollectEarthWindow.21=Não foi possível encontrar o ícone para a janela principal -CollectEarthWindow.22=Tem certeza de querer fechar Collect Earth?
Ao fechar a janela será fechada também o servidor de Collect Earth -CollectEarthWindow.23=Confirmação requerida -CollectEarthWindow.24=Exportar a XML -CollectEarthWindow.25=Quer importar estes registros de qualquer maneira e perder o seus dados atuais? -CollectEarthWindow.26=Operador -CollectEarthWindow.27=Atualizar -CollectEarthWindow.28=O servidor Open Foris Collect Earth deve estar em execução enquanto o operador interprete os dados. -CollectEarthWindow.29=O servidor Saiku não está configurado. -CollectEarthWindow.2=Idioma -CollectEarthWindow.30=Por favor mantenha esta janela aberta enquanto estiver usando o Google Earth. -CollectEarthWindow.31=Exportar os dados coletados para um arquivo CSV -CollectEarthWindow.32=Fechar -CollectEarthWindow.33=O nome do operador deve ser maior de que 5 caracteres e mais curto do que 50 -CollectEarthWindow.34= Erro de Validação -CollectEarthWindow.35=NOME DO OPERADOR VAZIO\!
Preencha o nome do operador e clique no botão "Atualizar". -CollectEarthWindow.36=Nome do operador não pode estar vazio -CollectEarthWindow.37=Permanecer Aberto -CollectEarthWindow.38=Arquivos de CSV -CollectEarthWindow.39=AVISO\:Se recomenda de fazer um back-up dos seus dados atuais(Exportar para XML) antes de importar os novos dados -CollectEarthWindow.3=\ Erro ao importar dados. -CollectEarthWindow.40=Configurar caminho para o arquivo onde o Servidor Saiku se encontra instalado em Ferramentas->Propiedades->Avançado. -CollectEarthWindow.41=Guardar dados exportados para o arquivo\: -CollectEarthWindow.42=Sair -CollectEarthWindow.43=Registros repetidos detectados -CollectEarthWindow.44=Importar/Exportar -CollectEarthWindow.45=Exportar dados para XML (comprimidos) -CollectEarthWindow.46=Importar novos dados do ZIP (XML comprimidos) -CollectEarthWindow.47=Servidor Saiku não configurado -CollectEarthWindow.48=Arquivos ZIP -CollectEarthWindow.49=Arquivos Fusion CSV -CollectEarthWindow.4=Isenção de responsabilidade da FAO -CollectEarthWindow.50=Abrir Manual de Usuário -CollectEarthWindow.51=Verificar atualizações de Collect Earth -CollectEarthWindow.52=Abrir Arquivo de Registro da aplicação -CollectEarthWindow.53=Arquivo de Registro de Collect Earth -CollectEarthWindow.54=Carregar pontos de KML -CollectEarthWindow.55=Atualizar registros atuais usando CSV -CollectEarthWindow.56=Sobre... -CollectEarthWindow.57=O processo de arranque de Saiku ainda está em execução, por favor aguarde. -CollectEarthWindow.58=Não é possível iniciar a análise com Saiku -CollectEarthWindow.59=Quer voltar a gerar o conjunto de dados para o análise de Saiku?
Este processo pode demorar vários minutos.
Se clicar em "SIM" um novo conjunto de dados com a mais recente informação será gerada. -CollectEarthWindow.5=Fechar -CollectEarthWindow.60=Geraço de dados para Saiku -CollectEarthWindow.61=Exportar dados para XML (apenas os registros adicionados/modificados) -CollectEarthWindow.62=Sobre... -CollectEarthWindow.63=Erro acessando pontos de KML -CollectEarthWindow.64=Suporte Técnico -CollectEarthWindow.65=O nome do operador foi alterado -CollectEarthWindow.66=Nome do operador -CollectEarthWindow.67=Abra a pasta de dados do CE -CollectEarthWindow.6=Exportar dados a Fusion Table -CollectEarthWindow.70=Abra o manuel desta pesquisa -CollectEarthWindow.71=Gerar ferramenta Saiku Independente -CollectEarthWindow.7=Erro ao importar os dados -CollectEarthWindow.8=Texto de isenção não foi possivel de ser encontrado -CollectEarthWindow.9=Os dados importados contém registros que já estão presentes no seu banco de dados. -DynamicsCode.0=Inicialmente Floresta -DynamicsCode.1=Inicialmente Ãrea de Pastagem -DynamicsCode.2=Inicialmente Ãrea Urbana -DynamicsCode.3=Inicialmente Outros -DynamicsCode.4=Inicialmente Ãrea Alagada -DynamicsCode.5=Inicialmente Ãrea Agrícola -EarthApp.11=Collect Earth já está em execução -EarthApp.21=O arquivo contendo o gride de pontos como CSV/CED não foi encontrado no caminho selecionado\:
-EarthApp.23=Nenhum arquivo CSV/CED foi configurado \:

-EarthApp.24=O arquivo contendo o modelo Freemarker com a definição KML não foi encontrado no caminho selecionado \:
-EarthApp.26=Nenhum arquivo de definição KML foi configurado \:

-EarthApp.27=O arquivo contendo o formato balão HTML não foi encontrado no caminho selecionado \:
-EarthApp.29=Nenhum arquivo balão HTML foi configurado \:

-EarthApp.30=Por favor corrija a localização do arquivo no menu Ferramentas->Propriedades. -EarthApp.3=Lembrar mais tarde -EarthApp.4=Atualizar Agora -EarthApp.57=Existe uma nova versão do Collect Earth disponível\!
Como gostaria de proceder? -EarthApp.58=Alerta de Atualização -EarthApp.59=Erro ao importar aquivo do projeto -EarthApp.5=Não me lembre novamente -EarthApp.61=O arquivo do Collect Earth não pôde ser aberto.
Por favor certifique-se que Google Earth esteja instalado. -EarthApp.6= - Versão -EarthApp.70=AVISO -EarthApp.71=No Mac OS X, os arquivos do projeto Collect Earth (* .cep) não serão abertos no Collect Earth quando forem clicados duas vezes.
-EarthApp.72=Use a barra de ferramentas Collect Earth para abrir os arquivos .cep \: -EarthApp.73=Collect Earth - problemas em computadores Mac OS X -EarthSurveyService.9=Campo obrigatório -ExportActionListener.1=Escolha data a partir da qual queira exportar os dados -ExportDialogProcessMonitor.0=Processando os dados... -ExportDialogProcessMonitor.1=Esperando de inicializar o processo \: -ExportDialogProcessMonitor.4=Registros importados \: -ImportActionListener.0=Deseja importar os dados das parcelas que não tenham sido completamente preenchidos? -ImportActionListener.2=Se clicar NÃO apenas os dados das parcelas em estado completo ("verde"), serão importados. -ImportActionListener.3=Importar registros incompletos -ImportDialogProcessMonitor.0=\ CALCULANDO -ImportDialogProcessMonitor.11=Cifra inicial de registros \: -ImportDialogProcessMonitor.2=Importando registros.... -ImportDialogProcessMonitor.5=Cifra final de registros importados \: -ImportDialogProcessMonitor.8=Processando dados... -ImportProcessMonitorDialog.0=Imported records \: -ImportXMLDialogProcessMonitor.1 = Substitua dados no banco de dados -ImportXMLDialogProcessMonitor.2 = Importe apenas registros não conflitantes -InfiniteProgressMonitor.0=Cancelar operação -JFileChooserExistsAware.0=Arquivo de projeto Collect Earth -KmlImportService.13=Selecione um arquivo CSV para salvar a localização dos pontos -MissingPlotsListener.0=Erro ao obter informação sobre parcelas ausentes na Base de Dados -MissingPlotsListener.10=Número total de ppontos no desenho de amostragem \: -MissingPlotsListener.12=Número de pontos perdidos \: -MissingPlotsListener.14=Todos os pontos foram preenchidos\! -MissingPlotsListener.1=Parcelas ausentes -MissingPlotsListener.2=Copiar conteúdos -MissingPlotsListener.3=Escolha os arquivos contendo informação sobre as parcelas ( .csv or .ced files ) para os quais deseja saber se todos os dados foram preenchidos. -MissingPlotsListener.4=Parcelas ausentes - informação -MissingPlotsListener.5=Do arquivo \: -MissingPlotsListener.6=Exportar para arquivo CED -NO=Não -NO_TO_ALL=Não para todos -OpenTextFileListener.0=O arquivo de texto não foi encontrado em \: -OptionWizard.0=Opções do Collect Earth -OptionWizard.100=Abrir Planet -OptionWizard.101=Llave da API do Planet -OptionWizard.1021=URL SecureWatch -OptionWizard.102=Abrir Maxar SecureWatch -OptionWizard.103=Configure o URL para o Mapa Extra (abre quando configurado) \: -OptionWizard.104=Navegadores -OptionWizard.105=Abrir Earth Map -OptionWizard.110=Use imagens mensais fornecidas pela NICFI -OptionWizard.10=Abrir arquivo de backup -OptionWizard.11=Desconhecido\: usar ifconfig -OptionWizard.12=Cliente Instância -OptionWizard.13=Collect Earth Server IP -OptionWizard.14=Collect Earth Porta de Servidor (p.ex. 8023) -OptionWizard.15=Guardar & Aplicar alteraçães -OptionWizard.16=ID -OptionWizard.17=X-coord -OptionWizard.18=Y-coord -OptionWizard.19=Elevação -OptionWizard.1=Escolher Navegador -OptionWizard.20= Os conteúdos de Google Earth foram alterados.
Por favor aceite a regarga do conteúdo uma vez que Google Earth lhe pergunte. -OptionWizard.21=Atualizado com sucesso -OptionWizard.22=Relevo -OptionWizard.23=Houve um erro ao reabrir os dados de Google Earth -OptionWizard.24=Cancelar -OptionWizard.25=Modo de Operação -OptionWizard.26=BBDD servidor -OptionWizard.27=Isto não é um Arquivo Saiku reconhecível (o arquivo start-saiku.bat não se encontra presente) -OptionWizard.28=Servidor Saiku não reconhecível -OptionWizard.29=BBDD porta -OptionWizard.2=Tipo de uso(servidor/cliente) -OptionWizard.30=Opçães SQLite -OptionWizard.31=Dados de amostra -OptionWizard.32=Disposição da Parcela -OptionWizard.33=Definiço de Questionários -OptionWizard.34=Serviços Integrados -OptionWizard.35=Número de pontos de control -OptionWizard.36=Distância entre os pontos de control (em metros) -OptionWizard.37=Margem com o perímetro da parcela (em metros) -OptionWizard.38=O arquivo CSV/CED não foi possivel ser lido corretamente.
O arquivo deve conter valores separados por vírgulas do seguinte modo\:
-OptionWizard.39=ID,Y-Coordenada,X-Coordenada,elevação,relevo,orientação -OptionWizard.3=Servidor Instance -OptionWizard.40=Projetos -OptionWizard.41=Carregar um novo arquivo de projeto -OptionWizard.42=Erro ao fechar o leitor CSV -OptionWizard.43=Nome do questionário -OptionWizard.44=Realizar automaticamente backup do banco de dados em -OptionWizard.45=Abrir Earth Engine Playground (descontinuado) -OptionWizard.46=Abrir Earth Engine Timelapse -OptionWizard.47=Abrir Bing Maps -OptionWizard.48=Abrir formulário em um navegador externo em vez de Google Earth (recomendado para LINUX) -OptionWizard.49=Caminho do arquivo CED/CSV com as coordenadas das parcelas -OptionWizard.4=IP do computador atual\: -OptionWizard.50=Navegar.. -OptionWizard.51=Erro ao importar os arquivos do projeto -OptionWizard.52= Arquivo CSV/CED com coordinadas -OptionWizard.53=Sem pontos -OptionWizard.54=Ponto Central -OptionWizard.55=Erro ao importar diretório do projeto -OptionWizard.56=Carregar projeto -OptionWizard.57=Projetos previamente carregados -OptionWizard.58=Abrir GEE Code Editor (requer acesso ao Trusted Tester) -OptionWizard.59=Abrir Here Maps focado no ponto -OptionWizard.5= Collect Earth Servidor porto\: -OptionWizard.65=Caminho para arquivo Saiku -OptionWizard.66=Navegar... -OptionWizard.67=Caminho para o executável do Firefox -OptionWizard.68=Navegar... -OptionWizard.6=Parâmetros BD PostgreSQL -OptionWizard.70=Arquivos executáveis -OptionWizard.72=Arquivos binários -OptionWizard.73=Caminho para o executável do Chrome -OptionWizard.74=Navegar... -OptionWizard.76=Arquivos executáveis -OptionWizard.78=Arquivos binarios -OptionWizard.79=Caminho para o padrão de KML Freemarker -OptionWizard.7=Nome de Usuário -OptionWizard.80=Navegar... -OptionWizard.82=Padrão Freemarker -OptionWizard.83=Caminho para formulário HTML Balloon -OptionWizard.84=Navegar... -OptionWizard.86=Pagina web HTML -OptionWizard.87=Caminho para XML com definição IDM -OptionWizard.88=Navegar... -OptionWizard.8=Senha -OptionWizard.90=Definiço XML IDM -OptionWizard.91=Servidor (versão para gerente ou uso autônomo) -OptionWizard.92=Cliente (operador/conectado ao servidor) -OptionWizard.93=SQLite (Embutido/com base em um único arquivo) -OptionWizard.94=PostgreSQL -OptionWizard.95=Side of the sampling dots (in meters) -OptionWizard.9= Nome da Base de Dados -ProcessMonitorDialog.1=Erro de análise na linha número -ProcessMonitorDialog.4=, colunas -ProcessMonitorDialog.5= -- valores -SaikuAnalysisListener.0=Sim - Atualizar dados Saiku (longo processo) -SaikuAnalysisListener.1=Não - Use a mesma versão dos dados da última vez que o Saiku foi usado -SaikuToolExportListener.1=Geração da ferramenta Saiku -SaikuToolExportListener.2=Gerando a Ferramenta Saiku com o banco de dados atual -SaikuStarter.1=Iniciando Saiku -SaikuStarter.2=Iniciando Saiku pode demorar uns minutos, por favor aguarde\! -SaveEarthDataServlet.0=Sem dados -SaveEarthDataServlet.1=Problema ocorreu ao guardar os dados na Base de Dados -SaveEarthDataServlet.2=Os dados foram guardados -SlopeCode.0=Plano (0-5) -YES=Sim -YES_TO_ALL=Sim a todas \ No newline at end of file +AboutDialog.19 = ບັນ​ຫາ​ເàºàºµàº” A +AboutDialog.5 = ສà»àº²â€‹àº¥àº±àºšâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹à»€àºžàºµà»ˆàº¡â€‹à»€àº•ີມ​ໄດ້​ທີ່ OpenForis.org ເວັບ​ໄຊ​ທ​໌​ຂອງ​ພວàºâ€‹à»€àº®àº»àº² +AboutDialog.6 = ຂà»â€‹à»‚ທດ​ນà»àº²â€‹, ບັນ​ຫາ​ທີ່​ເàºàºµàº”​ຂຶ້ນ​ໃນ​ຂະ​ນະ​ທີ່​ຄວາມ​ພະ​àºàº²â€‹àºàº²àº¡â€‹àº—ີ່​ຈະ​ເປີດ​àºàº²àº™â€‹à»€àºŠàº·à»ˆàº­àº¡â€‹àº•à»à»ˆâ€‹àº™àºµà»‰â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹àº¥àº°â€‹àºšàº»àºšâ€‹àº‚ອງ​ທ່ານ​ຕົວ​ທ່ອງ​ເວັບ​ຂອງ​ມາດ​ຕະ​ຖານ​. +AboutDialog.8 = Ok +AspectCode.0 = ເຫນືອ +AspectCode.1 = ວັນ​ອອàºâ€‹àºªà»ˆàº½àº‡â€‹à»€àº«àº™àº·àº­ +AspectCode.2 = ຕາ​ເວັນ​ອອຠ+AspectCode.3 = ພາàºâ€‹à»ƒàº•້​, ຕາ​ເວັນ​ອອຠ+AspectCode.4 = ໃຕ້ +AspectCode.5 = ພາàºâ€‹à»ƒàº•້​, ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ+AspectCode.6 = ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ+AspectCode.7 = ພາàºâ€‹à»€àº«àº™àº·àº­â€‹, ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ+CollectEarthWindow.0 = ໃນ​ເວ​ລາ​ທີ່​ພະ​àºàº²â€‹àºàº²àº¡â€‹à»€àºžàº·à»ˆàº­â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌ CSVຄວາມ​ຜິດ​ພາດ +CollectEarthWindow.1 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àº +CollectEarthWindow.10 File \= +CollectEarthWindow.11 ອອàºâ€‹àºˆàº²àº \= +CollectEarthWindow.12 = ເຄື່ອງ​ມືຂà»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.13 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ CSV àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ +CollectEarthWindow.14 = Start SAIKU +CollectEarthWindow.15 = ຄຸນ​ສົມ​ບັດ +CollectEarthWindow.16 = ຊ່ວàºâ€‹à»€àº«àº¼àº·àº­ +CollectEarthWindow.17 = ປະ​ຕິ​ເສດ +CollectEarthWindow.18 = ຄົ້ນ​ຫາ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ຫາàºâ€‹à»„ປ​ໃນ​ຖານ​ຂà»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.19 = ເàºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ+CollectEarthWindow.2 = ພາ​ສາ +CollectEarthWindow.20 = ຈà»àº²â€‹àº™àº§àº™â€‹àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™ duplicated​\: +CollectEarthWindow.21 = ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ຊອàºâ€‹àº«àº² icon ສà»àº²â€‹àº¥àº±àºšâ€‹àºžàº²â€‹àº•ົ້ນ​ຕ໠+CollectEarthWindow.22 = ທ່ານ​ມີ​ຄວາມ​à»àº™à»ˆâ€‹à»ƒàºˆàº§à»ˆâ€‹àº²â€‹àº—່ານ​ຕ້ອງ​àºàº²àº™â€‹àº›àº´àº”​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹? ໃນ​àºàº²àº™â€‹àº›àº´àº”​ປ່ອງ​ຢ້ຽມ​àºàº±àº‡â€‹àºˆàº°â€‹àº›àº´àº”​ເຄື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹àº‚ອງ​ໂລàºâ€‹à»„ດ້​ເàºàº±àºšâ€‹àºà»àº² +CollectEarthWindow.23 = àºàº²àº™â€‹àº¢àº±à»‰àº‡â€‹àº¢àº·àº™â€‹àº—ີ່​ຈà»àº²â€‹à»€àº›àº±àº™ +CollectEarthWindow.24 = XML ສົ່ງ​ອອຠ+CollectEarthWindow.25 = ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ເພີ່ມ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹à»€àº«àº¼àº»à»ˆàº²â€‹àº™àºµà»‰â€‹à»àº¥à»‰àº§â€‹à»àº¥àº°â€‹àºàº²àº™â€‹àºªàº¹àº™â€‹à»€àºªàºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº‚ອງ​ທ່ານ​? +CollectEarthWindow.26 = ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™ +CollectEarthWindow.27 = ປັບ​ປຸງ +CollectEarthWindow.28 = ເຮັດ​ຢູ່​ຕ່າງ​ປະ​ເທດ​ເàºàº±àºšâ€‹àºà»àº²â€‹à»€àº„ື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹àº„ວນ​ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹à»àº¥à»ˆàº™â€‹à»ƒàº™â€‹àº‚ະ​ນະ​ທີ່​ຜູ້​ປະ​àºàº­àºšâ€‹àºàº²àº™â€‹àº•ີ​ຄວາມ​ຫມາàºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹. +CollectEarthWindow.29 = The Saiku Server ບà»à»ˆâ€‹à»„ດ້​ຖືàºâ€‹àº•ັ້ງ​. +CollectEarthWindow.3 = \ ຄວາມ​ຜິດ​ພາດ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ +CollectEarthWindow.30 = àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº®àº±àºâ€‹àºªàº²â€‹àºàº²àº™â€‹à»€àº›àºµàº”​ຫນ້າ​ຕ່າງ​ນີ້​ໃນ​ຂະ​ນະ​ທີ່​ທ່ານ​àºà»àº²â€‹àº¥àº±àº‡â€‹à»ƒàºŠà»‰â€‹àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹. +CollectEarthWindow.31 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌ CSV +CollectEarthWindow.32 = ອອຠ+CollectEarthWindow.33 = ຊື່​ຜູ້​ປະ​àºàº­àºšâ€‹àºàº²àº™â€‹àºˆàº°â€‹àº•້ອງ​ມີ​àºàº²àº™â€‹àº•à»à»ˆâ€‹à»„ປ​ອີàºâ€‹à»àº¥à»‰àº§â€‹àºâ€‹à»ˆâ€‹àº§àº² 5 ລັàºâ€‹àºªàº°â€‹àº™àº°â€‹à»àº¥àº°â€‹àºªàº±à»‰àº™â€‹àºâ€‹à»ˆâ€‹àº§àº² 50ຄວາມ​ຜິດ​ພາດ +CollectEarthWindow.34 = àºàº§àº”​ສອບ +CollectEarthWindow.35 = ຜູ້​ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹àº¥àº»àºšâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™ ​\! ຫລັàºâ€‹àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº•ື່ມ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàºªà»ˆâ€‹àºŠàº·à»ˆâ€‹àºœàº¹à»‰â€‹àº›àº°â€‹àºàº­àºšâ€‹àºàº²àº™â€‹à»àº¥àº°â€‹à»ƒàº«à»‰â€‹àºàº»àº”​ປຸ່ມ "ປັບ​ປຸງ​"​. ຊື່ +CollectEarthWindow.36 = ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹àºšà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ເປົ່າ +CollectEarthWindow.37 = ຮັàºâ€‹àºªàº²â€‹àºˆàº±àº™à»„ຟລ​໌ +CollectEarthWindow.38 = CSV +CollectEarthWindow.39 à»àºˆà»‰àº‡ \= ມັນ​ເປັນ​àºàº²àº™â€‹àºªàº»àº¡â€‹àº„ວນ​ທີ່​ທ່ານ​ໄປ​ເຖິງ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº‚ອງ​ທ່ານ (àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ XML​) àºà»ˆàº­àº™â€‹àº—ີ່​ຈະ​ໄດ້​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº«àº¡à»ˆâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ +CollectEarthWindow.4 = FAO à»àºˆà»‰àº‡â€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ເສດ +CollectEarthWindow.40 = ທີ່​àºà»àº²â€‹àº™àº»àº”​ໄວ້​ຕາມ​ເສັ້ນ​ທາງ​àºàº±àºšâ€‹à»‚ຟນ​ເດີ​ທີ່ Saiku Server ໄດ້​ຖືàºâ€‹àº•ິດ​ຕັ້ງ​ຢູ່​ໃນ Tools-> Properties-> à»àº–ບ​à»àºšàºšâ€‹àºžàº´â€‹à»€àºªàº”​ໄດ້​. +CollectEarthWindow.41 = àºàº²àº™â€‹àº›àº°â€‹àº«àºàº±àº”​àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌​\: +CollectEarthWindow.42 = ອອຠ+CollectEarthWindow.43 = àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº•à»àº²â€‹àºàº±àº™â€‹àº—ີ່​ພົບ​ເຫັນ +CollectEarthWindow.44 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ / ສົ່ງ​ອອàºàº‚à»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.45 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ XML (à»àº›â€‹)ຂà»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.46 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ໃຫມ່​ຈາàºâ€‹à»„ປ​ສະ​ນີ (XML à»àº›â€‹)àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™ +CollectEarthWindow.55 ປັບ​ປຸງ \= àºàº²àº™â€‹àº™à»àº²â€‹à»ƒàºŠà»‰ CSV +CollectEarthWindow.47 = Saiku Server ບà»à»ˆâ€‹à»„ດ້​àºà»àº²â€‹àº«àº™àº»àº” +CollectEarthWindow.48 = ໄຟລ​໌​ຫັດ​ໄປ​ສະໄຟລ​໌ +CollectEarthWindow.49 = Fusion CSV +CollectEarthWindow.5 = ປິດ +CollectEarthWindow.50 = ເປີດ​ຄູ່​ມື​àºàº²àº™â€‹à»ƒàºŠà»‰àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™â€‹àº›àº±àºšâ€‹àº›àº¸àº‡â€‹àº‚ອງ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ+CollectEarthWindow.51 CHECK \= àºàº§àº”​ສອບ +CollectEarthWindow.52 = File ເຂົ້າ​ສູ່​ລະ​ບົບ​ຄà»àº²â€‹àº®à»‰àº­àº‡â€‹àºªàº°â€‹àº«àº¡àº±àºâ€‹à»€àº›àºµàº” +CollectEarthWindow.53 = àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»€àº­â€‹àºàº°â€‹àºªàº²àº™â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹à»€àº‚ົ້າ​ສູ່​ລະ​ບົບຈຸດ +CollectEarthWindow.54 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຈາຠKMLàºà»ˆàº½àº§â€‹àºàº±àºš +CollectEarthWindow.56 = ... +CollectEarthWindow.57 = ຂະ​ບວນ​àºàº²àº™â€‹à»€àº¥àºµà»ˆàº¡â€‹àº•ົ້ນ Saiku à»àº¡à»ˆàº™â€‹àºàº±àº‡â€‹à»àº¥à»ˆàº™â€‹, àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº¥à»â€‹àº–້າ​. +CollectEarthWindow.58 = ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ເລີ່ມ​ຕົ້ນ​àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ Saiku +CollectEarthWindow.59 = ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ Re​\: àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ Saiku ໄດ້​?
ຂະ​ບວນ​àºàº²àº™â€‹àº™àºµà»‰â€‹àºªàº²â€‹àº¡àº²àº”​ໃຊ້​ເວ​ລາ​ຫຼາàº
ຖ້າ​ທ່ານ​ຄລິàºâ€‹à»ƒàºªà»ˆ "à»àº¡à»ˆàº™â€‹à»àº¥à»‰àº§â€‹" ເປັນ​ຊຸດ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໃຫມ່​ທີ່​ມີ​ຄວາມ​ຫຼ້າ​ສຸດ​ໄດ້​. ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº‚ຶ້ນ​. +CollectEarthWindow.6 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ Fusion ຕາ​ຕະ​ລາງàºàº²àº™â€‹àºœàº°â€‹àº¥àº´àº”​ຂà»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.60 = Saiku +CollectEarthWindow.61 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່ XML (àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº”ັດ​à»àºà»‰â€‹àº™àº±àºšâ€‹àº•ັ້ງ​à»àº•່​àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àºªàº¸àº”​ທ້າàºâ€‹) ສົ່ງ​ອອàºàºà»ˆàº½àº§â€‹àºàº±àºš +CollectEarthWindow.62 = ... +CollectEarthWindow.63 Error \= àºàº²àº™â€‹à»„ດ້​ຮັບ​ຈຸດ​ທີ່​ໄດ້​ຈາຠKML +CollectEarthWindow.64 = ສະ​ຫນັບ​ສະ​ຫນູນ​ທາງ​ເທàºâ€‹àº™àº´àº +CollectEarthWindow.7 Error \= ໃນ​ເວ​ລາ​ທີ່​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຂà»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.8 ຂà»à»‰â€‹àº„ວາມ​ປະ​ຕິ​ເສດ \= ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ພົບ​ເຫັນ +CollectEarthWindow.9 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໄດ້​ນà»àº²â€‹à»€àº‚ົ້າ​ມາ​ປະ​àºàº­àºšâ€‹àº”້ວàºâ€‹àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àº—ີ່​ມີ​ຢູ່​à»àº¥à»‰àº§â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚ອງ​ທ່ານ​. +DynamicsCode.0 = ປ່າ​ໄມ້​ໃນ​ເບື້ອງ​ຕົ້ນ +DynamicsCode.1 = ທົ່ງ​ຫàºà»‰àº²â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ +DynamicsCode.2 = àºàº²àº™â€‹àº•ັ້ງ​ຖິ່ນ​ຖານ​ໃນ​ເບື້ອງ​ຕົ້ນ +DynamicsCode.3 = ເບື້ອງ​ຕົ້ນ Otherland +DynamicsCode.4 = ຊຸ່ມ​ນ​້​à»àº²â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ +DynamicsCode.5 = ເບື້ອງ​ຕົ້ນ Cro​​pland +OpenTextFileListener.0 = ໄຟລ​໌​ຂà»à»‰â€‹àº„ວາມ​à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹à»„ດ້​ພົບ​ໄດ້​ທີ່​\:àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +OptionWizard.0 = ທາງ​ເລືອàºâ€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ+OptionWizard.1 = ເລືອàºâ€‹àº‚ອງ​ຕົວ​ທ່ອງ​ເວັບ +OptionWizard.10 = ໂຟ​ເດີ​ສà»àº²â€‹àº®àº­àº‡â€‹àºˆàº±àº™ +OptionWizard.11 = ບà»à»ˆâ€‹àº®àº¹à»‰â€‹àºˆàº±àºâ€‹\: àºàº²àº™â€‹àº™à»àº²â€‹à»ƒàºŠà»‰ ifconfig +OptionWizard.12 = ລູàºâ€‹àº„້າ​ຕົວ​ຢ່າງàºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +OptionWizard.13 = ໂລຠIP Serveràºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +OptionWizard.14 = port ໂລຠServer (ຕົວ​ຢ່າງ​\: 8023​) +OptionWizard.15 = ບັນ​ທຶàºâ€‹à»àº¥àº°â€‹à»ƒàºŠà»‰â€‹àºàº²àº™â€‹àº›à»ˆàº½àº™â€‹à»àº›àº‡ +OptionWizard.16 = ລະ​ຫັດ +OptionWizard.17 = X​-coord +OptionWizard.18 = Y coord​, +OptionWizard.19 = àºàº²àº™â€‹àºàº»àºâ€‹àº¥àº°â€‹àº”ັບ +OptionWizard.2 = ບວນ​àºàº²àº™â€‹à»€àº®àº±àº”​ວຽຠ(server / ລູàºâ€‹àº„້າ​) +OptionWizard.20 = ໄດ້​ເນື້ອ​ໃນ​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»„ດ້​ມີ​àºàº²àº™â€‹àº›à»ˆàº½àº™â€‹à»àº›àº‡â€‹.
àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº®àº±àºšâ€‹à»‚ຫລດ​ເນື້ອ​ຫາ​ໃນ​ເວ​ລາ​ທີ່​ທ່ານ​àºà»àº²â€‹àº¥àº±àº‡â€‹àº®àº±àºšâ€‹àºàº²àº™â€‹àºàº°â€‹àº•ຸ້ນ​ໂດàºâ€‹àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹. +OptionWizard.21 = ປັບ​ປຸງ​ສົບ​ຜົນ​ສà»àº²â€‹à»€àº¥àº±àº” +OptionWizard.22 = ຄ້ອຠ+OptionWizard.23 = ມີ​ຄວາມ​ຜິດ​ພາດ​ໃນ​ເວ​ລາ Re​\: ເປີດ​ໄດ້​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»€àº›àº±àº™â€‹à»„ດ້àºàº»àºâ€‹à»€àº¥àºµàºâ€‹àºàº²àº™ +OptionWizard.24 = àºàº»àºà»€àº¥àºµàºàºàº²àº™ +OptionWizard.25 = ຮູບ​à»àºšàºšâ€‹àºàº²àº™â€‹àº”à»àº²â€‹à»€àº™àºµàº™â€‹àº‡àº²àº™ +OptionWizard.26 = àºàº²àº™â€‹à»€àº›àº±àº™â€‹à»€àºˆàº»à»‰àº²â€‹àºžàº²àºš DB +OptionWizard.27 = ນີ້​ບà»à»ˆâ€‹à»„ດ້​ເປັນ​ທີ່​àºàº­àº¡â€‹àº®àº±àºš Saiku Folder (ເອ​àºàº°â€‹àºªàº²àº™â€‹à»€àº¥àºµà»ˆàº¡ saiku.bat ບà»à»ˆâ€‹à»àº¡à»ˆàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹) +OptionWizard.28 = Saiku Server ບà»à»ˆâ€‹àº®àº­àº‡â€‹àº®àº±àºš +OptionWizard.29 = ພ໠DB +OptionWizard.3 = Server ຕົວ​ຢ່າງ +OptionWizard.30 = ທາງ​ເລືອຠSQLite +OptionWizard.31 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº•ົວ​ຢ່າງ +OptionWizard.32 = ຮູບ​à»àºšàºšâ€‹àº”ິນ​ຕອນ +OptionWizard.33 = ສà»àº²â€‹àº«àº¼àº§àº”​ນຸ​àºàº»àº¡ +OptionWizard.34 = à»àºšàºšâ€‹àºžàº´â€‹à»€àºªàº” +OptionWizard.35 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ຈຸດ​ຕົວ​ຢ່າງ +OptionWizard.36 = ໄລ​àºàº°â€‹àº—າງ​ລະ​ຫວ່າງ​ຈຸດ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àº•ົວ​ຢ່າງ (ໃນ​ຕາ​) +OptionWizard.37 = ອັດ​ຕາ​ທີ່​ມີ​ຊາàºâ€‹à»àº”ນ​ດິນ​ຕອນ (à»àº¡àº±àº”​) +OptionWizard.38 = ໄຟລ​໌ CSV / CED ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ອ່ານ​ໄດ້​ຢ່າງ​ຖືàºâ€‹àº•້ອງ
ເອ​àºàº°â€‹àºªàº²àº™â€‹à»„ດ້​ຖືàºâ€‹àº„າດ​ວ່າ​ຈະ​ມີ​ມູນ​ຄ່າ​àºàº²àº™â€‹à»àºàºâ€‹àºˆàº¸â€‹àº¥àº°â€‹àºžàº²àºâ€‹à»€àºŠàº±à»ˆàº™â€‹àº™àºµà»‰â€‹\:​.
+OptionWizard.39 = ລະ​ຫັດ​, YCoordinate​, XCoordinate​, ພູ​, ລັàºâ€‹àºªàº°â€‹àº™àº° +OptionWizard.4 = IP ຄອມ​ພິວ​ເຕີ​ປັດ​ຈຸ​ບັນ​\: +OptionWizard.40 = ໂຄງ​àºàº²àº™ +OptionWizard.41 = ໂຫຼດ​ໄຟລ​໌​ໂຄງ​àºàº²àº™â€‹à»ƒàº«àº¡à»ˆ +OptionWizard.42 = ຜິດ​ພາດ​ໃນ​ເວ​ລາ​ປິດ​àºàº²àº™â€‹àº­à»ˆàº²àº™ CSV +OptionWizard.43 = ຊື່​ຂອງ​àºàº²àº™â€‹àºªà»àº²â€‹àº«àº¼àº§àº” +OptionWizard.44 = ຖານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ປ​ໃຫ້​ເຖິງ​ອັດ​ຕະ​ໂນ​ມັດ​ທີ່ +OptionWizard.45 = Open Earth Engine ຊູມ​ເຂົ້າ​ໄປ​ໃນ​ເຂດ​ຕອນ​ດິນ​ຂອງ​ຕົນ +OptionWizard.46 = timelapse ຈັàºâ€‹à»€àº›àºµàº”​ໂລàºâ€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºžàº·à»‰àº™â€‹àº—ີ່​ຕອນ​ດິນ​ຂອງ​ຕົນ +OptionWizard.47 = Open à»àºœàº™ Bing ສà»àº²â€‹àº¥àº±àºšâ€‹àºžàº·à»‰àº™â€‹àº—ີ່​ຕອນ​ດິນ​ຂອງ​ຕົນ +OptionWizard.48 = ຮູບ​à»àºšàºšâ€‹à»€àº›àºµàº”​ໃນ​ຕົວ​ທ່ອງ​ເວັບ​ຂອງ​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»„ດ້ (à»àº™àº°â€‹àº™à»àº²â€‹à»ƒàº«à»‰â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™ LINUX​) +OptionWizard.49 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™ Ced / csv ໄຟລ​໌​ທີ່​ມີ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº•ອນ​ດິນ​ຂອງ​ຕົນàºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +OptionWizard.5 = port ໂລຠServer​\: +OptionWizard.50 = Browse ... +OptionWizard.51 = ເອ​àºàº°â€‹àºªàº²àº™â€‹à»‚ຄງ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຜິດ​ພາດ +OptionWizard.52 = CSV / ເອ​àºàº°â€‹àºªàº²àº™ Ced ມີ​àºàº²àº™â€‹àº›àº°â€‹àºªàº²àº™â€‹àº‡àº²àº™â€‹à»€àº—ົ່າ​ນັ້ນ +OptionWizard.54 = ຈຸດ​ສູນ​àºàº²àº‡ +OptionWizard.55 = Error ໂຟນ​ເດີ​ໂຄງ​àºàº²àº™â€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ +OptionWizard.56 = ໂຄງ​àºàº²àº™ Load +OptionWizard.57 = ໂຄງ​àºàº²àº™ loaded àºà»ˆàº­àº™â€‹àº«àº™à»‰àº²â€‹àº™àºµà»‰ +OptionWizard.58 = Open GEE Code Editor (ຮຽàºâ€‹àº®à»‰àº­àº‡â€‹à»ƒàº«à»‰â€‹àº¡àºµâ€‹àºàº²àº™â€‹à»€àº‚ົ້າ​ເຖິງ Tester Trusted​) +OptionWizard.59 = Open ທີ່​ນີ້​à»àºœàº™â€‹àº—ີ່​ສຸມ​ໃສ່​ຕອນ​ດິນ​ຂອງ​ຕົນ +OptionWizard.6 = ຕົວ​àºà»àº²â€‹àº™àº»àº”​àºàº²àº™ PostgreSQL DB +OptionWizard.65 = ເສັ້ນ​ທາງ​àºàº±àºšâ€‹à»‚ຟນ​ເດີ​ທີ່ Saiku +OptionWizard.66 = Browse ... +OptionWizard.67 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ບັດ​àºàº²àº™ Firefox +OptionWizard.68 = Browse ... +OptionWizard.7 = ຊື່​ຜູ້​ໃຊ້ +OptionWizard.70 = àºàº²àº™â€‹àºšà»â€‹àº¥àº´â€‹àº«àº²àº™â€‹à»„ຟ +OptionWizard.72 = ໄຟລ​໌​ຖານ​ສອງ +OptionWizard.73 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ບັດ​àºàº²àº™ Chrome +OptionWizard.74 = Browse ... +OptionWizard.76 = àºàº²àº™â€‹àºšà»â€‹àº¥àº´â€‹àº«àº²àº™â€‹à»„ຟ +OptionWizard.78 = ໄຟລ​໌​ຖານ​ສອງ +OptionWizard.79 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹à»àºšàºš KML Freemarker +OptionWizard.8 = ລະ​ຫັດ​ຜ່ານ +OptionWizard.80 = Browse ... +OptionWizard.82 = à»àº¡à»ˆâ€‹à»àºšàºš Freemarker +OptionWizard.83 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº­àº­àºâ€‹à»àºšàºšâ€‹àº®àº¹àºšâ€‹à»àºšàºš HTML ປູມ​ເປົ້າ +OptionWizard.84 = Browse ... +OptionWizard.86 = HTML webpage +OptionWizard.87 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™ XML àºàº±àºšâ€‹àº„à»àº²â€‹àº™àº´â€‹àºàº²àº¡ IDM +OptionWizard.88 = Browse ... +OptionWizard.9 = ຊື່ DB +OptionWizard.90 = ຫມາຠIDM XML +OptionWizard.91 = Server (ສະ​ບັບ​ຜູ້​ຈັດ​àºàº²àº™â€‹àº«àº¼àº·â€‹àº¢àº·àº™â€‹àº¢àº¹à»ˆâ€‹àº„ົນ​ດຽວ​ໃຊ້​) +OptionWizard.92 = ລູàºâ€‹àº„້າ (ປະ​ຕິ​ບັດ​àºàº²àº™ / àºàº²àº™â€‹à»€àºŠàº·à»ˆàº­àº¡â€‹àº•à»à»ˆâ€‹àºàº±àºšâ€‹à»€àº„ື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹) +OptionWizard.93 = SQLite (à»àºšàºšâ€‹àºàº±àº‡ / ໄຟລ​໌​ດຽວ​ຕາມ​) +OptionWizard.94 = PostgreSQL +SaikuAnalysisListener.0 = à»àº¡à»ˆàº™ - ຂà»à»‰â€‹àº¡àº¹àº™ Refresh Saiku (ຂະ​ບວນ​àºàº²àº™â€‹àºàº²àº§â€‹) +SaikuAnalysisListener.1 = ບà»à»ˆ - ພຽງ​à»àº•່​ເລີ່ມ​ຕົ້ນ Saiku +SaikuStarter.1 = ເລີ່ມ Saiku +SaikuStarter.2 = u0EC0ລີ່ມ Saiku ສາ​ມາດ​ໃຊ້​ເວ​ລາ​ນາ​ທີ \= àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº¥à»â€‹àº–້າ ​\! +SaveEarthDataServlet.0 = àºàº²àº™â€‹àº®à»‰àº­àº‡â€‹àº‚à»â€‹à»€àº›àº»à»ˆàº² +SaveEarthDataServlet.1 = ບັນ​ຫາ​ທີ່​ເàºàºµàº”​ຂຶ້ນ​ໃນ​ຂະ​ນະ​ທີ່​ປະ​ຢັດ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ດ້ +SaveEarthDataServlet.2 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໄດ້​ບັນ​ທືຠ+SlopeCode.0 = ລຽບ (0-5​)àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +EarthApp.11 = ໃນ​ທົ່ວ​ໂລàºâ€‹à»àº¡à»ˆàº™â€‹à»àº¥à»‰àº§â€‹à»àº¥à»ˆàº™ +EarthApp.21 = ໄຟ​ທີ່​ມີ​ຕາ​ຂ່າàºâ€‹à»„ຟ​ຟ້າ​ຂອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ເປັນ CSV / CED à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹àºžàº»àºšâ€‹à»€àº«àº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹à»€àºªàº±à»‰àº™â€‹àº—າງ​ທີ່​ເລືອàºâ€‹\:
+EarthApp.23 = ບà»à»ˆâ€‹à»„ຟລ​໌ CSV / CED ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

+EarthApp.24 = ໄຟ​ທີ່​ມີ​à»àº¡à»ˆâ€‹à»àºšàºš Freemarker ທີ່​ມີ​ຄà»àº²â€‹àº™àº´â€‹àºàº²àº¡ KML ບà»à»ˆâ€‹à»„ດ້​ພົບ​ເຫັນ​ຢູ່​ໃນ​ເສັ້ນ​ທາງ​ທີ່​ເລືອàºâ€‹\:
+EarthApp.26 = ບà»à»ˆâ€‹à»„ຟລ​໌​ຄà»àº²â€‹àº™àº´â€‹àºàº²àº¡ KML ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

+EarthApp.27 = ໄຟ​ທີ່​ມີ​ຮູບ​à»àºšàºšâ€‹àº›àº¹àº¡â€‹à»€àº›àº»à»‰àº² HTML ໄດ້​à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹àºžàº»àºšâ€‹à»€àº«àº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹à»€àºªàº±à»‰àº™â€‹àº—າງ​ທີ່​ເລືອàºâ€‹\:
+EarthApp.29 = ບà»à»ˆâ€‹à»„ຟລ​໌​ປູມ​ເປົ້າ HTML ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

+EarthApp.3 = ເຕືອນ​ຂ້ອàºâ€‹àº•à»à»ˆâ€‹àº¡àº² +EarthApp.30 = àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹à»àºà»‰â€‹à»„ຂ​ສະ​ຖານ​ທີ່​ໄຟລ​໌​ຢູ່​ໃນ​ເມ​ນູ Tools-> Properties​. +EarthApp.4 = àºàº²àº™â€‹àº›àº±àºšâ€‹àº›àº¸àº‡â€‹à»ƒàº™â€‹àº›àº±àº”​ຈຸ​ບັນ +EarthApp.5 = ຢ່າ​ເຕືອນ​ຂ້າ​ພະ​ເຈົ້າ​ອີàºâ€‹à»€àº—ື່ອ​ຫນຶ່ງ +EarthApp.57 = ມີ​ສະ​ບັບ​ໃຫມ່​ຂອງ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹àº—ີ່​ມີ à»àº¡à»ˆàº™â€‹\!
ທ່ານ​ບà»à»ˆâ€‹àº•້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹? ເຕືອນ +EarthApp.58 = ປັບ​ປຸງ +EarthApp.59 Error \= ໃນ​ເວ​ລາ​ທີ່​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ເອ​àºàº°â€‹àºªàº²àº™â€‹à»‚ຄງ​àºàº²àº™ +EarthApp.6 = \ - ສະ​ບັບ +EarthApp.61 = ເອ​àºàº°â€‹àºªàº²àº™â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹à»„ດ້​ເàºàº±àºšâ€‹àºà»àº²â€‹àºšà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ຈະ​ເປີດ​ເຜີàºâ€‹.
àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹à»€àº®àº±àº”​ໃຫ້​à»àº™à»ˆâ€‹à»ƒàºˆàº§à»ˆâ€‹àº²â€‹àº—ີ່​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»àº¡à»ˆàº™â€‹àºàº²àº™â€‹àº•ິດ​ຕັ້ງ​. +EarthSurveyService.9 = ພາàºâ€‹àºªàº°â€‹àº«àº™àº²àº¡â€‹àº—ີ່​ຕ້ອງ​àºàº²àº™à»€àº­àº»àº² +ExportActionListener.1 = ວັນ​ທີ່​ຈະ​ບັນ​ທຶàºâ€‹àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àºˆàº²àºàº‚à»à»‰â€‹àº¡àº¹àº™ +ExportDialogProcessMonitor.0 àºàº²àº™â€‹àº›àº¸àº‡â€‹à»àº•່ງ \= ... +ExportDialogProcessMonitor.1 = ລà»â€‹àº–້າ​ທີ່​ຈະ​ເລີ່ມ​ຕົ້ນ​ຂະ​ບວນ​àºàº²àº™â€‹\:àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àº +ExportDialogProcessMonitor.4 =​\: +ImportProcessMonitorDialog.0 = àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​\: +ImportActionListener.0 = ຄວນ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àº—ີ່​ດິນ​ທີ່​ບà»à»ˆâ€‹à»„ດ້​ຮັບ​àºàº²àº™â€‹à»€àº•ີມ​ລົງ​ໄປ​ໃນ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ໄດ້ +ImportActionListener.2 = ຖ້າ​ທ່ານ​ຄລິàºâ€‹à»ƒàºªà»ˆ ບà»à»ˆ ພຽງ​à»àº•່​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºˆàº²àºâ€‹àºžàº²àºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ຢູ່​ໃນ​ສະ​ພາບ "ສີ​ຂຽວ​"​, ທີ່​ບັນ​ຈຸ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ັງ​ຫມົດ​ໄດ້​, ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​. +ImportActionListener.3 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ບັນ​ທຶàºâ€‹àº—າງ​àºàº²àº™â€‹àºªà»àº²â€‹à»€àº¥àº±àº”​ຮູບ +ImportDialogProcessMonitor.0 = \ ຄິດ​ໄລ່ +ImportDialogProcessMonitor.11 = ຈà»àº²â€‹àº™àº§àº™â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ​ຂອງ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹\: +ImportDialogProcessMonitor.2 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ບັນ​ທຶàºâ€‹àºàº²àº™ ... +ImportDialogProcessMonitor.5 = ຈ​à»â€‹àº²â€‹àº™àº§àº™â€‹àº•ົວ​ຈິງ​ຂອງ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​\:ຂà»à»‰â€‹àº¡àº¹àº™ +ImportDialogProcessMonitor.8 àºàº²àº™â€‹àº›àº¸àº‡â€‹à»àº•່ງ \= ... +InfiniteProgressMonitor.0 = àºàº»àºâ€‹à»€àº¥àºµàºâ€‹àºàº²àº™â€‹àº”à»àº²â€‹à»€àº™àºµàº™â€‹àº‡àº²àº™àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +JFileChooserExistsAware.0 = file ໂລàºâ€‹à»‚ຄງ​àºàº²àº™ +KmlImportService.13 = ເລືອàºâ€‹à»„ຟລ​໌ CSV ເພື່ອ​ຊ່ວàºâ€‹àº›àº°â€‹àº¢àº±àº”​ສະ​ຖານ​ຕອນ​ດິນ​ຂອງ​ຕົນ​ເພື່ອ +MissingPlotsListener.0 Error \= ໃນ​ຂະ​ນະ​ທີ່​àºàº²àº™â€‹à»„ດ້​ຮັບ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àº—ີ່​ດິນ​ບà»à»ˆâ€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ດ້ +MissingPlotsListener.1 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ໄປ +MissingPlotsListener.10 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ໃນ​àºàº²àº™â€‹àº­àº­àºâ€‹à»àºšàºšâ€‹àºªàº¸à»ˆàº¡â€‹àº•ົວ​ຢ່າງ​\: +MissingPlotsListener.12 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ຫາàºâ€‹à»„ປ​\: +MissingPlotsListener.14 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທັງ​ຫມົດ​à»àº¡à»ˆàº™â€‹à»„ດ້​ເຕີມ​ລົງ​ໄປ ​\!ເນື້ອ​ໃນ +MissingPlotsListener.2 = ຄັດ​ລອàºâ€‹à»„ປ​ທີ່ clipboardເອົາ +MissingPlotsListener.3 = ໄຟລ​໌​ທີ່​ບັນ​ຈຸ​ມີ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ສານ​ຕອນ​ດິນ​ຂອງ​ຕົນ (.csv ຫຼື​ໄຟລ​໌ .ced​) ສà»àº²â€‹àº¥àº±àºšâ€‹àº—ີ່​ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ຮູ້​ວ່າ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ັງ​ຫມົດ​ໄດ້​ຮັບ​àºàº²àº™â€‹à»€àº•ີມ​ລົງ​ໄປ​. +MissingPlotsListener.4 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຫາàºâ€‹à»„ປ - ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ສານ +MissingPlotsListener.5 = ຈາàºâ€‹à»„ຟ​\: +MissingPlotsListener.6 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ​ໄຟລ​໌ CED +ProcessMonitorDialog.1 = ຂà»à»‰â€‹àºœàº´àº”​ພາດ Parsing àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àºˆà»àº²â€‹àº™àº§àº™â€‹àºàº²àº™â€‹àº•ິດ​ຕà»à»ˆâ€‹àºàº±àº™ +ProcessMonitorDialog.4 = ຖັນ​, +ProcessMonitorDialog.5 = \ - ຄຸນ​ຄ່າ \ No newline at end of file From 944b5e5f023781992eb2901190a54dd15ca80680 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:34:57 +0100 Subject: [PATCH 0762/1620] New translations Messages_mn.properties (French) --- .../earth/app/view/Messages_fr.properties | Bin 14209 -> 17309 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 7498201fddebdd9c3bf0a85dd50ea3590128e3c7..7531b1f880577174fbd54a1f934f5ea15407dcc7 100644 GIT binary patch literal 17309 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 JCm)K+e*iLS20#D+ literal 14209 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 R)+^bDTQ+<5e^y Date: Tue, 29 Nov 2022 12:34:58 +0100 Subject: [PATCH 0763/1620] New translations Messages_mn.properties (Spanish) --- .../earth/app/view/Messages_es.properties | Bin 2784 -> 17309 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 800ed67a3ee630d85c4bd4b6e56a4af593a6ba00..7531b1f880577174fbd54a1f934f5ea15407dcc7 100644 GIT binary patch literal 17309 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 JCm)K+e*iLS20#D+ literal 2784 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 mmX=hUxZ`3$Pj%`0<$nS5#z Date: Tue, 29 Nov 2022 12:34:59 +0100 Subject: [PATCH 0764/1620] New translations Messages_mn.properties (Portuguese) --- .../earth/app/view/Messages_pt.properties | 436 +++++++++--------- 1 file changed, 217 insertions(+), 219 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index e5b9bd9e45..7531b1f880 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,220 +1,218 @@ -AboutDialog.19 = ບັນ​ຫາ​ເàºàºµàº” A -AboutDialog.5 = ສà»àº²â€‹àº¥àº±àºšâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹à»€àºžàºµà»ˆàº¡â€‹à»€àº•ີມ​ໄດ້​ທີ່ OpenForis.org ເວັບ​ໄຊ​ທ​໌​ຂອງ​ພວàºâ€‹à»€àº®àº»àº² -AboutDialog.6 = ຂà»â€‹à»‚ທດ​ນà»àº²â€‹, ບັນ​ຫາ​ທີ່​ເàºàºµàº”​ຂຶ້ນ​ໃນ​ຂະ​ນະ​ທີ່​ຄວາມ​ພະ​àºàº²â€‹àºàº²àº¡â€‹àº—ີ່​ຈະ​ເປີດ​àºàº²àº™â€‹à»€àºŠàº·à»ˆàº­àº¡â€‹àº•à»à»ˆâ€‹àº™àºµà»‰â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹àº¥àº°â€‹àºšàº»àºšâ€‹àº‚ອງ​ທ່ານ​ຕົວ​ທ່ອງ​ເວັບ​ຂອງ​ມາດ​ຕະ​ຖານ​. -AboutDialog.8 = Ok -AspectCode.0 = ເຫນືອ -AspectCode.1 = ວັນ​ອອàºâ€‹àºªà»ˆàº½àº‡â€‹à»€àº«àº™àº·àº­ -AspectCode.2 = ຕາ​ເວັນ​ອອຠ-AspectCode.3 = ພາàºâ€‹à»ƒàº•້​, ຕາ​ເວັນ​ອອຠ-AspectCode.4 = ໃຕ້ -AspectCode.5 = ພາàºâ€‹à»ƒàº•້​, ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ-AspectCode.6 = ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ-AspectCode.7 = ພາàºâ€‹à»€àº«àº™àº·àº­â€‹, ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ-CollectEarthWindow.0 = ໃນ​ເວ​ລາ​ທີ່​ພະ​àºàº²â€‹àºàº²àº¡â€‹à»€àºžàº·à»ˆàº­â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌ CSVຄວາມ​ຜິດ​ພາດ -CollectEarthWindow.1 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àº -CollectEarthWindow.10 File \= -CollectEarthWindow.11 ອອàºâ€‹àºˆàº²àº \= -CollectEarthWindow.12 = ເຄື່ອງ​ມືຂà»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.13 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ CSV àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ -CollectEarthWindow.14 = Start SAIKU -CollectEarthWindow.15 = ຄຸນ​ສົມ​ບັດ -CollectEarthWindow.16 = ຊ່ວàºâ€‹à»€àº«àº¼àº·àº­ -CollectEarthWindow.17 = ປະ​ຕິ​ເສດ -CollectEarthWindow.18 = ຄົ້ນ​ຫາ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ຫາàºâ€‹à»„ປ​ໃນ​ຖານ​ຂà»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.19 = ເàºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ-CollectEarthWindow.2 = ພາ​ສາ -CollectEarthWindow.20 = ຈà»àº²â€‹àº™àº§àº™â€‹àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™ duplicated​\: -CollectEarthWindow.21 = ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ຊອàºâ€‹àº«àº² icon ສà»àº²â€‹àº¥àº±àºšâ€‹àºžàº²â€‹àº•ົ້ນ​ຕ໠-CollectEarthWindow.22 = ທ່ານ​ມີ​ຄວາມ​à»àº™à»ˆâ€‹à»ƒàºˆàº§à»ˆâ€‹àº²â€‹àº—່ານ​ຕ້ອງ​àºàº²àº™â€‹àº›àº´àº”​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹? ໃນ​àºàº²àº™â€‹àº›àº´àº”​ປ່ອງ​ຢ້ຽມ​àºàº±àº‡â€‹àºˆàº°â€‹àº›àº´àº”​ເຄື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹àº‚ອງ​ໂລàºâ€‹à»„ດ້​ເàºàº±àºšâ€‹àºà»àº² -CollectEarthWindow.23 = àºàº²àº™â€‹àº¢àº±à»‰àº‡â€‹àº¢àº·àº™â€‹àº—ີ່​ຈà»àº²â€‹à»€àº›àº±àº™ -CollectEarthWindow.24 = XML ສົ່ງ​ອອຠ-CollectEarthWindow.25 = ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ເພີ່ມ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹à»€àº«àº¼àº»à»ˆàº²â€‹àº™àºµà»‰â€‹à»àº¥à»‰àº§â€‹à»àº¥àº°â€‹àºàº²àº™â€‹àºªàº¹àº™â€‹à»€àºªàºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº‚ອງ​ທ່ານ​? -CollectEarthWindow.26 = ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™ -CollectEarthWindow.27 = ປັບ​ປຸງ -CollectEarthWindow.28 = ເຮັດ​ຢູ່​ຕ່າງ​ປະ​ເທດ​ເàºàº±àºšâ€‹àºà»àº²â€‹à»€àº„ື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹àº„ວນ​ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹à»àº¥à»ˆàº™â€‹à»ƒàº™â€‹àº‚ະ​ນະ​ທີ່​ຜູ້​ປະ​àºàº­àºšâ€‹àºàº²àº™â€‹àº•ີ​ຄວາມ​ຫມາàºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹. -CollectEarthWindow.29 = The Saiku Server ບà»à»ˆâ€‹à»„ດ້​ຖືàºâ€‹àº•ັ້ງ​. -CollectEarthWindow.3 = \ ຄວາມ​ຜິດ​ພາດ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ -CollectEarthWindow.30 = àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº®àº±àºâ€‹àºªàº²â€‹àºàº²àº™â€‹à»€àº›àºµàº”​ຫນ້າ​ຕ່າງ​ນີ້​ໃນ​ຂະ​ນະ​ທີ່​ທ່ານ​àºà»àº²â€‹àº¥àº±àº‡â€‹à»ƒàºŠà»‰â€‹àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹. -CollectEarthWindow.31 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌ CSV -CollectEarthWindow.32 = ອອຠ-CollectEarthWindow.33 = ຊື່​ຜູ້​ປະ​àºàº­àºšâ€‹àºàº²àº™â€‹àºˆàº°â€‹àº•້ອງ​ມີ​àºàº²àº™â€‹àº•à»à»ˆâ€‹à»„ປ​ອີàºâ€‹à»àº¥à»‰àº§â€‹àºâ€‹à»ˆâ€‹àº§àº² 5 ລັàºâ€‹àºªàº°â€‹àº™àº°â€‹à»àº¥àº°â€‹àºªàº±à»‰àº™â€‹àºâ€‹à»ˆâ€‹àº§àº² 50ຄວາມ​ຜິດ​ພາດ -CollectEarthWindow.34 = àºàº§àº”​ສອບ -CollectEarthWindow.35 = ຜູ້​ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹àº¥àº»àºšâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™ ​\! ຫລັàºâ€‹àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº•ື່ມ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàºªà»ˆâ€‹àºŠàº·à»ˆâ€‹àºœàº¹à»‰â€‹àº›àº°â€‹àºàº­àºšâ€‹àºàº²àº™â€‹à»àº¥àº°â€‹à»ƒàº«à»‰â€‹àºàº»àº”​ປຸ່ມ "ປັບ​ປຸງ​"​. ຊື່ -CollectEarthWindow.36 = ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹àºšà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ເປົ່າ -CollectEarthWindow.37 = ຮັàºâ€‹àºªàº²â€‹àºˆàº±àº™à»„ຟລ​໌ -CollectEarthWindow.38 = CSV -CollectEarthWindow.39 à»àºˆà»‰àº‡ \= ມັນ​ເປັນ​àºàº²àº™â€‹àºªàº»àº¡â€‹àº„ວນ​ທີ່​ທ່ານ​ໄປ​ເຖິງ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº‚ອງ​ທ່ານ (àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ XML​) àºà»ˆàº­àº™â€‹àº—ີ່​ຈະ​ໄດ້​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº«àº¡à»ˆâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ -CollectEarthWindow.4 = FAO à»àºˆà»‰àº‡â€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ເສດ -CollectEarthWindow.40 = ທີ່​àºà»àº²â€‹àº™àº»àº”​ໄວ້​ຕາມ​ເສັ້ນ​ທາງ​àºàº±àºšâ€‹à»‚ຟນ​ເດີ​ທີ່ Saiku Server ໄດ້​ຖືàºâ€‹àº•ິດ​ຕັ້ງ​ຢູ່​ໃນ Tools-> Properties-> à»àº–ບ​à»àºšàºšâ€‹àºžàº´â€‹à»€àºªàº”​ໄດ້​. -CollectEarthWindow.41 = àºàº²àº™â€‹àº›àº°â€‹àº«àºàº±àº”​àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌​\: -CollectEarthWindow.42 = ອອຠ-CollectEarthWindow.43 = àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº•à»àº²â€‹àºàº±àº™â€‹àº—ີ່​ພົບ​ເຫັນ -CollectEarthWindow.44 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ / ສົ່ງ​ອອàºàº‚à»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.45 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ XML (à»àº›â€‹)ຂà»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.46 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ໃຫມ່​ຈາàºâ€‹à»„ປ​ສະ​ນີ (XML à»àº›â€‹)àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™ -CollectEarthWindow.55 ປັບ​ປຸງ \= àºàº²àº™â€‹àº™à»àº²â€‹à»ƒàºŠà»‰ CSV -CollectEarthWindow.47 = Saiku Server ບà»à»ˆâ€‹à»„ດ້​àºà»àº²â€‹àº«àº™àº»àº” -CollectEarthWindow.48 = ໄຟລ​໌​ຫັດ​ໄປ​ສະໄຟລ​໌ -CollectEarthWindow.49 = Fusion CSV -CollectEarthWindow.5 = ປິດ -CollectEarthWindow.50 = ເປີດ​ຄູ່​ມື​àºàº²àº™â€‹à»ƒàºŠà»‰àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™â€‹àº›àº±àºšâ€‹àº›àº¸àº‡â€‹àº‚ອງ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ-CollectEarthWindow.51 CHECK \= àºàº§àº”​ສອບ -CollectEarthWindow.52 = File ເຂົ້າ​ສູ່​ລະ​ບົບ​ຄà»àº²â€‹àº®à»‰àº­àº‡â€‹àºªàº°â€‹àº«àº¡àº±àºâ€‹à»€àº›àºµàº” -CollectEarthWindow.53 = àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»€àº­â€‹àºàº°â€‹àºªàº²àº™â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹à»€àº‚ົ້າ​ສູ່​ລະ​ບົບຈຸດ -CollectEarthWindow.54 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຈາຠKMLàºà»ˆàº½àº§â€‹àºàº±àºš -CollectEarthWindow.56 = ... -CollectEarthWindow.57 = ຂະ​ບວນ​àºàº²àº™â€‹à»€àº¥àºµà»ˆàº¡â€‹àº•ົ້ນ Saiku à»àº¡à»ˆàº™â€‹àºàº±àº‡â€‹à»àº¥à»ˆàº™â€‹, àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº¥à»â€‹àº–້າ​. -CollectEarthWindow.58 = ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ເລີ່ມ​ຕົ້ນ​àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ Saiku -CollectEarthWindow.59 = ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ Re​\: àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ Saiku ໄດ້​?
ຂະ​ບວນ​àºàº²àº™â€‹àº™àºµà»‰â€‹àºªàº²â€‹àº¡àº²àº”​ໃຊ້​ເວ​ລາ​ຫຼາàº
ຖ້າ​ທ່ານ​ຄລິàºâ€‹à»ƒàºªà»ˆ "à»àº¡à»ˆàº™â€‹à»àº¥à»‰àº§â€‹" ເປັນ​ຊຸດ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໃຫມ່​ທີ່​ມີ​ຄວາມ​ຫຼ້າ​ສຸດ​ໄດ້​. ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº‚ຶ້ນ​. -CollectEarthWindow.6 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ Fusion ຕາ​ຕະ​ລາງàºàº²àº™â€‹àºœàº°â€‹àº¥àº´àº”​ຂà»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.60 = Saiku -CollectEarthWindow.61 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່ XML (àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº”ັດ​à»àºà»‰â€‹àº™àº±àºšâ€‹àº•ັ້ງ​à»àº•່​àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àºªàº¸àº”​ທ້າàºâ€‹) ສົ່ງ​ອອàºàºà»ˆàº½àº§â€‹àºàº±àºš -CollectEarthWindow.62 = ... -CollectEarthWindow.63 Error \= àºàº²àº™â€‹à»„ດ້​ຮັບ​ຈຸດ​ທີ່​ໄດ້​ຈາຠKML -CollectEarthWindow.64 = ສະ​ຫນັບ​ສະ​ຫນູນ​ທາງ​ເທàºâ€‹àº™àº´àº -CollectEarthWindow.7 Error \= ໃນ​ເວ​ລາ​ທີ່​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຂà»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.8 ຂà»à»‰â€‹àº„ວາມ​ປະ​ຕິ​ເສດ \= ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ພົບ​ເຫັນ -CollectEarthWindow.9 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໄດ້​ນà»àº²â€‹à»€àº‚ົ້າ​ມາ​ປະ​àºàº­àºšâ€‹àº”້ວàºâ€‹àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àº—ີ່​ມີ​ຢູ່​à»àº¥à»‰àº§â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚ອງ​ທ່ານ​. -DynamicsCode.0 = ປ່າ​ໄມ້​ໃນ​ເບື້ອງ​ຕົ້ນ -DynamicsCode.1 = ທົ່ງ​ຫàºà»‰àº²â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ -DynamicsCode.2 = àºàº²àº™â€‹àº•ັ້ງ​ຖິ່ນ​ຖານ​ໃນ​ເບື້ອງ​ຕົ້ນ -DynamicsCode.3 = ເບື້ອງ​ຕົ້ນ Otherland -DynamicsCode.4 = ຊຸ່ມ​ນ​້​à»àº²â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ -DynamicsCode.5 = ເບື້ອງ​ຕົ້ນ Cro​​pland -OpenTextFileListener.0 = ໄຟລ​໌​ຂà»à»‰â€‹àº„ວາມ​à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹à»„ດ້​ພົບ​ໄດ້​ທີ່​\:àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -OptionWizard.0 = ທາງ​ເລືອàºâ€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ-OptionWizard.1 = ເລືອàºâ€‹àº‚ອງ​ຕົວ​ທ່ອງ​ເວັບ -OptionWizard.10 = ໂຟ​ເດີ​ສà»àº²â€‹àº®àº­àº‡â€‹àºˆàº±àº™ -OptionWizard.11 = ບà»à»ˆâ€‹àº®àº¹à»‰â€‹àºˆàº±àºâ€‹\: àºàº²àº™â€‹àº™à»àº²â€‹à»ƒàºŠà»‰ ifconfig -OptionWizard.12 = ລູàºâ€‹àº„້າ​ຕົວ​ຢ່າງàºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -OptionWizard.13 = ໂລຠIP Serveràºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -OptionWizard.14 = port ໂລຠServer (ຕົວ​ຢ່າງ​\: 8023​) -OptionWizard.15 = ບັນ​ທຶàºâ€‹à»àº¥àº°â€‹à»ƒàºŠà»‰â€‹àºàº²àº™â€‹àº›à»ˆàº½àº™â€‹à»àº›àº‡ -OptionWizard.16 = ລະ​ຫັດ -OptionWizard.17 = X​-coord -OptionWizard.18 = Y coord​, -OptionWizard.19 = àºàº²àº™â€‹àºàº»àºâ€‹àº¥àº°â€‹àº”ັບ -OptionWizard.2 = ບວນ​àºàº²àº™â€‹à»€àº®àº±àº”​ວຽຠ(server / ລູàºâ€‹àº„້າ​) -OptionWizard.20 = ໄດ້​ເນື້ອ​ໃນ​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»„ດ້​ມີ​àºàº²àº™â€‹àº›à»ˆàº½àº™â€‹à»àº›àº‡â€‹.
àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº®àº±àºšâ€‹à»‚ຫລດ​ເນື້ອ​ຫາ​ໃນ​ເວ​ລາ​ທີ່​ທ່ານ​àºà»àº²â€‹àº¥àº±àº‡â€‹àº®àº±àºšâ€‹àºàº²àº™â€‹àºàº°â€‹àº•ຸ້ນ​ໂດàºâ€‹àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹. -OptionWizard.21 = ປັບ​ປຸງ​ສົບ​ຜົນ​ສà»àº²â€‹à»€àº¥àº±àº” -OptionWizard.22 = ຄ້ອຠ-OptionWizard.23 = ມີ​ຄວາມ​ຜິດ​ພາດ​ໃນ​ເວ​ລາ Re​\: ເປີດ​ໄດ້​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»€àº›àº±àº™â€‹à»„ດ້àºàº»àºâ€‹à»€àº¥àºµàºâ€‹àºàº²àº™ -OptionWizard.24 = àºàº»àºà»€àº¥àºµàºàºàº²àº™ -OptionWizard.25 = ຮູບ​à»àºšàºšâ€‹àºàº²àº™â€‹àº”à»àº²â€‹à»€àº™àºµàº™â€‹àº‡àº²àº™ -OptionWizard.26 = àºàº²àº™â€‹à»€àº›àº±àº™â€‹à»€àºˆàº»à»‰àº²â€‹àºžàº²àºš DB -OptionWizard.27 = ນີ້​ບà»à»ˆâ€‹à»„ດ້​ເປັນ​ທີ່​àºàº­àº¡â€‹àº®àº±àºš Saiku Folder (ເອ​àºàº°â€‹àºªàº²àº™â€‹à»€àº¥àºµà»ˆàº¡ saiku.bat ບà»à»ˆâ€‹à»àº¡à»ˆàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹) -OptionWizard.28 = Saiku Server ບà»à»ˆâ€‹àº®àº­àº‡â€‹àº®àº±àºš -OptionWizard.29 = ພ໠DB -OptionWizard.3 = Server ຕົວ​ຢ່າງ -OptionWizard.30 = ທາງ​ເລືອຠSQLite -OptionWizard.31 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº•ົວ​ຢ່າງ -OptionWizard.32 = ຮູບ​à»àºšàºšâ€‹àº”ິນ​ຕອນ -OptionWizard.33 = ສà»àº²â€‹àº«àº¼àº§àº”​ນຸ​àºàº»àº¡ -OptionWizard.34 = à»àºšàºšâ€‹àºžàº´â€‹à»€àºªàº” -OptionWizard.35 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ຈຸດ​ຕົວ​ຢ່າງ -OptionWizard.36 = ໄລ​àºàº°â€‹àº—າງ​ລະ​ຫວ່າງ​ຈຸດ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àº•ົວ​ຢ່າງ (ໃນ​ຕາ​) -OptionWizard.37 = ອັດ​ຕາ​ທີ່​ມີ​ຊາàºâ€‹à»àº”ນ​ດິນ​ຕອນ (à»àº¡àº±àº”​) -OptionWizard.38 = ໄຟລ​໌ CSV / CED ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ອ່ານ​ໄດ້​ຢ່າງ​ຖືàºâ€‹àº•້ອງ
ເອ​àºàº°â€‹àºªàº²àº™â€‹à»„ດ້​ຖືàºâ€‹àº„າດ​ວ່າ​ຈະ​ມີ​ມູນ​ຄ່າ​àºàº²àº™â€‹à»àºàºâ€‹àºˆàº¸â€‹àº¥àº°â€‹àºžàº²àºâ€‹à»€àºŠàº±à»ˆàº™â€‹àº™àºµà»‰â€‹\:​.
-OptionWizard.39 = ລະ​ຫັດ​, YCoordinate​, XCoordinate​, ພູ​, ລັàºâ€‹àºªàº°â€‹àº™àº° -OptionWizard.4 = IP ຄອມ​ພິວ​ເຕີ​ປັດ​ຈຸ​ບັນ​\: -OptionWizard.40 = ໂຄງ​àºàº²àº™ -OptionWizard.41 = ໂຫຼດ​ໄຟລ​໌​ໂຄງ​àºàº²àº™â€‹à»ƒàº«àº¡à»ˆ -OptionWizard.42 = ຜິດ​ພາດ​ໃນ​ເວ​ລາ​ປິດ​àºàº²àº™â€‹àº­à»ˆàº²àº™ CSV -OptionWizard.43 = ຊື່​ຂອງ​àºàº²àº™â€‹àºªà»àº²â€‹àº«àº¼àº§àº” -OptionWizard.44 = ຖານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ປ​ໃຫ້​ເຖິງ​ອັດ​ຕະ​ໂນ​ມັດ​ທີ່ -OptionWizard.45 = Open Earth Engine ຊູມ​ເຂົ້າ​ໄປ​ໃນ​ເຂດ​ຕອນ​ດິນ​ຂອງ​ຕົນ -OptionWizard.46 = timelapse ຈັàºâ€‹à»€àº›àºµàº”​ໂລàºâ€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºžàº·à»‰àº™â€‹àº—ີ່​ຕອນ​ດິນ​ຂອງ​ຕົນ -OptionWizard.47 = Open à»àºœàº™ Bing ສà»àº²â€‹àº¥àº±àºšâ€‹àºžàº·à»‰àº™â€‹àº—ີ່​ຕອນ​ດິນ​ຂອງ​ຕົນ -OptionWizard.48 = ຮູບ​à»àºšàºšâ€‹à»€àº›àºµàº”​ໃນ​ຕົວ​ທ່ອງ​ເວັບ​ຂອງ​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»„ດ້ (à»àº™àº°â€‹àº™à»àº²â€‹à»ƒàº«à»‰â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™ LINUX​) -OptionWizard.49 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™ Ced / csv ໄຟລ​໌​ທີ່​ມີ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº•ອນ​ດິນ​ຂອງ​ຕົນàºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -OptionWizard.5 = port ໂລຠServer​\: -OptionWizard.50 = Browse ... -OptionWizard.51 = ເອ​àºàº°â€‹àºªàº²àº™â€‹à»‚ຄງ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຜິດ​ພາດ -OptionWizard.52 = CSV / ເອ​àºàº°â€‹àºªàº²àº™ Ced ມີ​àºàº²àº™â€‹àº›àº°â€‹àºªàº²àº™â€‹àº‡àº²àº™â€‹à»€àº—ົ່າ​ນັ້ນ -OptionWizard.54 = ຈຸດ​ສູນ​àºàº²àº‡ -OptionWizard.55 = Error ໂຟນ​ເດີ​ໂຄງ​àºàº²àº™â€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ -OptionWizard.56 = ໂຄງ​àºàº²àº™ Load -OptionWizard.57 = ໂຄງ​àºàº²àº™ loaded àºà»ˆàº­àº™â€‹àº«àº™à»‰àº²â€‹àº™àºµà»‰ -OptionWizard.58 = Open GEE Code Editor (ຮຽàºâ€‹àº®à»‰àº­àº‡â€‹à»ƒàº«à»‰â€‹àº¡àºµâ€‹àºàº²àº™â€‹à»€àº‚ົ້າ​ເຖິງ Tester Trusted​) -OptionWizard.59 = Open ທີ່​ນີ້​à»àºœàº™â€‹àº—ີ່​ສຸມ​ໃສ່​ຕອນ​ດິນ​ຂອງ​ຕົນ -OptionWizard.6 = ຕົວ​àºà»àº²â€‹àº™àº»àº”​àºàº²àº™ PostgreSQL DB -OptionWizard.65 = ເສັ້ນ​ທາງ​àºàº±àºšâ€‹à»‚ຟນ​ເດີ​ທີ່ Saiku -OptionWizard.66 = Browse ... -OptionWizard.67 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ບັດ​àºàº²àº™ Firefox -OptionWizard.68 = Browse ... -OptionWizard.7 = ຊື່​ຜູ້​ໃຊ້ -OptionWizard.70 = àºàº²àº™â€‹àºšà»â€‹àº¥àº´â€‹àº«àº²àº™â€‹à»„ຟ -OptionWizard.72 = ໄຟລ​໌​ຖານ​ສອງ -OptionWizard.73 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ບັດ​àºàº²àº™ Chrome -OptionWizard.74 = Browse ... -OptionWizard.76 = àºàº²àº™â€‹àºšà»â€‹àº¥àº´â€‹àº«àº²àº™â€‹à»„ຟ -OptionWizard.78 = ໄຟລ​໌​ຖານ​ສອງ -OptionWizard.79 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹à»àºšàºš KML Freemarker -OptionWizard.8 = ລະ​ຫັດ​ຜ່ານ -OptionWizard.80 = Browse ... -OptionWizard.82 = à»àº¡à»ˆâ€‹à»àºšàºš Freemarker -OptionWizard.83 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº­àº­àºâ€‹à»àºšàºšâ€‹àº®àº¹àºšâ€‹à»àºšàºš HTML ປູມ​ເປົ້າ -OptionWizard.84 = Browse ... -OptionWizard.86 = HTML webpage -OptionWizard.87 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™ XML àºàº±àºšâ€‹àº„à»àº²â€‹àº™àº´â€‹àºàº²àº¡ IDM -OptionWizard.88 = Browse ... -OptionWizard.9 = ຊື່ DB -OptionWizard.90 = ຫມາຠIDM XML -OptionWizard.91 = Server (ສະ​ບັບ​ຜູ້​ຈັດ​àºàº²àº™â€‹àº«àº¼àº·â€‹àº¢àº·àº™â€‹àº¢àº¹à»ˆâ€‹àº„ົນ​ດຽວ​ໃຊ້​) -OptionWizard.92 = ລູàºâ€‹àº„້າ (ປະ​ຕິ​ບັດ​àºàº²àº™ / àºàº²àº™â€‹à»€àºŠàº·à»ˆàº­àº¡â€‹àº•à»à»ˆâ€‹àºàº±àºšâ€‹à»€àº„ື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹) -OptionWizard.93 = SQLite (à»àºšàºšâ€‹àºàº±àº‡ / ໄຟລ​໌​ດຽວ​ຕາມ​) +AboutDialog.19 = гарÑан нь аÑуудлыг +AboutDialog.5 = ДÑлгÑÑ€Ñнгүй мÑдÑÑллийг манай вÑб OpenForis.org очиж +AboutDialog.6 = Уучлаарай, аÑуудал нь таны ÑиÑтемийн Ñтандарт браузер ÑÐ½Ñ Ñ…Ð¾Ð»Ð±Ð¾Ð¾Ñыг нÑÑÑ… гÑж оролдож гарлаа. +AboutDialog.8 = Ок +AspectCode.0 = Хойд +AspectCode.1 = Зүүн Хойд +AspectCode.2 = Зүүн +AspectCode.3 = Зүүн-Өмнөд +AspectCode.4 = Өмнөд +AspectCode.5 = Баруун-Өмнөд +AspectCode.6 = Баруун +AspectCode.7 = Баруун Хойд +CollectEarthWindow.0 = CSV файл уруу өгөгдөл ÑкÑпортлох оролдож алдаа +CollectEarthWindow.1 = ЭкÑпортын алдаа +CollectEarthWindow.10 = Файлын +CollectEarthWindow.11 = Exit +CollectEarthWindow.12 Ñ…ÑÑ€ÑгÑÑл \= +CollectEarthWindow.13 = ЭкÑпортын CSV өгөгдөл +CollectEarthWindow.14 = Start SAIKU дүн шинжилгÑÑ +CollectEarthWindow.15 = Үл хөдлөх хөрөнгө +CollectEarthWindow.16 = туÑламж +CollectEarthWindow.17 = Disclaimer +CollectEarthWindow.18 = мÑдÑÑллийн Ñанд Ñураггүй алга газраа хай +CollectEarthWindow.19 = дÑлхийг цуглуулах +CollectEarthWindow.2 = Ñ…Ñл +CollectEarthWindow.20 = давхардÑан тоогоор бүртгÑлийн тоо\: +CollectEarthWindow.21 = гол хүрÑÑ Ð´Ò¯Ñ€Ñийг олж чадахгүй байна +CollectEarthWindow.22 = Ð¥ÑÑ€Ñв та цуглуулж дÑлхийг хаах Ñ…Ò¯ÑÑж байгаа гÑдÑгт итгÑлтÑй байна уу? Цонхыг хаах нь цуглуулж ДÑлхий Ñервер хаах болно
+CollectEarthWindow.23 = батлах Ñ…ÑÑ€ÑгтÑй +CollectEarthWindow.24 = XML ЭкÑпортын +CollectEarthWindow.25 = Та Ñмар ч байÑан ÑдгÑÑÑ€ бүртгÑлийг нÑмÑÑ…, таны одоогийн мÑдÑÑллийг алдах Ñ…Ò¯ÑÑж байна уу? +CollectEarthWindow.26 = Оператор +CollectEarthWindow.27 = шинÑчлÑÑ… +CollectEarthWindow.28 = <б> ÐÑÑлттÑй Foris оператор мÑдÑÑллийг хөрвүүлÑн ойлгох бол ДÑлхий Ñервер ажиллаж байх Ñ‘Ñтой цуглуулна. +CollectEarthWindow.29 = Saiku Ñерверийг тохируулаагүй байна. +CollectEarthWindow.3 = \ Импорт алдаа +CollectEarthWindow.30 = Та Google Earth ашиглаж байгаа бол ÑÐ½Ñ Ñ†Ð¾Ð½Ñ… нÑÑлттÑй байлгах уу. +CollectEarthWindow.31 = ЭкÑпортын CSV файлд мÑдÑÑллийг цуглуулÑан +CollectEarthWindow.32 = Quit +CollectEarthWindow.33 = операторын нÑÑ€ 5 Ñ‚ÑмдÑгтүүд болон 50 богино бодвол илүү урт байх Ñ‘Ñтой +CollectEarthWindow.34 = Баталгаажуулалт алдаа +CollectEarthWindow.35 = OPERATOR нÑÑ€ хооÑон \! Зар операторын нÑÑ€ бөглөх болон "шинÑчлÑÑ…" товчийг дарна уу. +CollectEarthWindow.36 = Оператор нÑÑ€ хооÑон байж болохгүй +CollectEarthWindow.37 = нÑÑлттÑй байлга +CollectEarthWindow.38 = CSV файлууд +CollectEarthWindow.39 = Ðнхааруулга\: Ð­Ð½Ñ Ð½ÑŒ зүйтÑй та нөөцлөх-ап таны одоогийн өгөгдөл (XML нь ЭкÑпортын) ÑˆÐ¸Ð½Ñ Ð¼ÑдÑÑллийг импортлогч өмнө +CollectEarthWindow.4 = ÐҮБ-ын ХХÐÐБ Disclaimer зар +CollectEarthWindow.40 Тодорхой хүртÑл \= Saiku Server Ð¥ÑÑ€ÑгÑÑл цÑÑÑн дотрооÑ> баÑлагт> ÐарийвчилÑан таб-д ÑуулгаÑан байна Ñ…Ð°Ð²Ñ‚Ð°Ñ Ð·Ð°Ð¼Ñ‹Ð³. +CollectEarthWindow.41 = Хадгаламж файл уруу өгөгдөл ÑкÑпортолÑон\: +CollectEarthWindow.42 = Quit +CollectEarthWindow.43 = ЗөрчилтÑй бүртгÑл олдлоо +CollectEarthWindow.44 = МÑдÑÑллийн Импорт / ЭкÑпортын +XML гÑж CollectEarthWindow.45 \= ЭкÑпортын мÑдÑÑ (шахÑан) +Zip-Ð°Ð°Ñ CollectEarthWindow.46 \= Импортын ÑˆÐ¸Ð½Ñ Ð¼ÑдÑÑ (шахÑан XML) +CSV ашиглан CollectEarthWindow.55 \= шинÑчлÑÑ… одоогийн бүртгÑл +CollectEarthWindow.47 = Saiku Ñерверийг тохируулаагүй бол +CollectEarthWindow.48 = Zip / цуглуулах-өгөгдлийн файлууд +CollectEarthWindow.49 = Fusion CSV файлууд +CollectEarthWindow.5 = Хаах +CollectEarthWindow.50 = ÐÑÑлттÑй Ñ…ÑÑ€ÑглÑгчийн гарын авлага +Цуглуулж дÑлхийн шинÑчлÑлтүүдийн хувьд CollectEarthWindow.51 \= шалгах +CollectEarthWindow.52 = ÐÑÑлттÑй Application нÑвтрÑÑ… Файлын +CollectEarthWindow.53 = цуглуулах ДÑлхий нÑвтрÑÑ… файл +KML нь CollectEarthWindow.54 \= ачааллын оноо +CollectEarthWindow.56 = тухай ... +CollectEarthWindow.57 = Saiku гарааны үйл Ñвц одоо ч ажиллаж байгаа, түр хүлÑÑÐ½Ñ Ò¯Ò¯. +CollectEarthWindow.58 = Saiku шинжилгÑÑг Ñхлүүлж чадахгүй +CollectEarthWindow.59 = Ð¥ÑÑ€Ñв та Saiku дүн шинжилгÑÑ Ñ…Ð¸Ð¹Ñ… мÑдÑÑллийн Ñанг дахин бий болгох Ñ…Ò¯ÑÑж байна уу?
Ð­Ð½Ñ Ò¯Ð¹Ð» Ñвц нь цаг хугацаа шаардÑан ажил байж болох юм.
Та хамгийн Ñүүлийн үеийн нь "YES" ÑˆÐ¸Ð½Ñ Ð´Ð°Ñ‚Ð°Ñетийн дÑÑÑ€ товшино уу мÑдÑÑллийг бий болно. +Fusion Ð¥Ò¯ÑнÑгт нь CollectEarthWindow.6 \= ЭкÑпортын +CollectEarthWindow.60 = Saiku мÑдÑÑ Ò¯ÐµÐ¸Ð¹Ð½ +CollectEarthWindow.61 = ЭкÑпортын XML өгөгдөл (Ñүүлийн ÑкÑпортын хойш өөрчлөгдÑөн бүртгÑл) +CollectEarthWindow.62 = тухай ... +CollectEarthWindow.63 = Ðлдаа KML авÑан оноо авах +CollectEarthWindow.64 = техникийн дÑмжлÑг үзүүлÑÑ… +CollectEarthWindow.7 = алдаа мÑдÑÑлÑл импортлох +CollectEarthWindow.8 = Disclaimer текÑÑ‚ олж чадахгүй байна +CollectEarthWindow.9 = оруулÑан мÑдÑÑллийг өөрийн мÑдÑÑллийн Ñанд нь байгаа бичлÑгийг агуулж байдаг. +DynamicsCode.0 = ЭхлÑÑд ой +DynamicsCode.1 = ЭхлÑÑд БÑлчÑÑрийн +DynamicsCode.2 = ЭхлÑÑд шийдвÑрлÑÑ… +DynamicsCode.3 = ЭхлÑÑд Otherland +DynamicsCode.4 = ЭхлÑÑд Ð£Ñ Ð½Ð°Ð¼Ð³Ð°Ñ€Ñ…Ð°Ð³ газрын +DynamicsCode.5 = ЭхлÑÑд Тариалангийн +OpenTextFileListener.0 = текÑÑ‚ файл олж байÑан юм\: +OptionWizard.0 = ДÑлхий Ñонголт цуглуулах +OptionWizard.1 = Хөтөч Ñонгоно уу +OptionWizard.10 = ÐÑÑлттÑй нөөц Ñ…Ð°Ð²Ñ‚Ð°Ñ +OptionWizard.11 = Тодорхойгүй\: ашиглах ifconfig +OptionWizard.12 = Ð¥ÑÑ€ÑглÑгч шатны +OptionWizard.13 = ДÑлхий Server IP цуглуулах +OptionWizard.14 = ДÑлхий Server портыг (жишÑÑ Ð½ÑŒ\: 8023) цуглуулах +OptionWizard.15 = Save & өөрчлөлт хийх +OptionWizard.16 = ID +OptionWizard.17 = X-coord +OptionWizard.18 = Y-coord +OptionWizard.19 = Elevation +OptionWizard.2 = урÑгал даÑгалын (Ñервер / үйлчлүүлÑгч) + OptionWizard.20 \= Google Earth агуулга нь өөрчлөгдÑөн байна.
Ðгуулга нь ачаалах хүлÑÑн авна уу та Google Earth-ÑÑÑ Ð°Ñуух үед. +OptionWizard.21 = шинÑчлÑÑ… амжилттай +OptionWizard.22 = Ð¥Ñвгий +OptionWizard.23 = дахин нÑÑÑ… Google Earth мÑдÑÑллийг үед алдаа гарлаа +OptionWizard.24 = Болих +OptionWizard.25 = үйл ажиллагааны горим +OptionWizard.26 = DB хоÑÑ‚ +OptionWizard.27 = Ð­Ð½Ñ Ð½ÑŒ хүлÑÑн зөвшөөрөгдÑөн Saiku Folder (ÑхлÑÑ… saiku.bat файл байхгүй бол) ороогүй байна +OptionWizard.28 = Saiku Server хүлÑÑн зөвшөөрөөгүй +OptionWizard.29 = DB порт +OptionWizard.3 = Server шатны +OptionWizard.30 = SQLite Ñонголт +OptionWizard.31 = ЖишÑÑ Ð¼ÑдÑÑлÑл +OptionWizard.32 = Plot зохион байгуулалт +OptionWizard.33 = Ñудалгаа тодорхойлолт +OptionWizard.34 = ÐарийвчилÑан +OptionWizard.35 = түүвÑÑ€ цÑгийн тоо +OptionWizard.36 = (метр) дÑÑж авах цÑгийн хоорондох зай +(Метр) ДÑÑж авах цÑгүүд OptionWizard.95 \= Side +OptionWizard.38 = CSV / CED файлыг зөв уншиж чадахгүй байгаа файлыг
иймÑрхүү таÑлалаар туÑгаарлаж утгыг байх төлөвтÑй байна\:.
<Б> +OptionWizard.39 = ID, YCoordinate, XCoordinate, өндрийн, налуу, тал +OptionWizard.4 = Одоогийн компьютерийн IP\: +OptionWizard.40 = төÑлүүд +OptionWizard.41 = ÑˆÐ¸Ð½Ñ Ñ‚Ó©Ñөл файлыг ачаалж +OptionWizard.42 = Ðлдаа CSV уншигч хаах +Судалгааны OptionWizard.43 \= нÑÑ€ +OptionWizard.44 = автоматаар нөөцлөх хүртÑл өгөгдлийн Ñан дÑÑÑ€ +OptionWizard.45 = ÐÑÑлттÑй Earth Engine талбай талбай руу томруулÑан +талбай мÑдÑÑлÑл / CSV файлыг ced нь OptionWizard.49 \= зам +Харин Google Earth-ийн браузер дÑÑÑ€ OptionWizard.48 \= ÐÑÑлттÑй Ñ…ÑлбÑÑ€ (ЛинукÑд зориулÑан байлгахыг зөвлөдөг) +OptionWizard.5 = цуглуулах ДÑлхий Server портыг\: +OptionWizard.50 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.51 = Ðлдаа импортлох төÑөл файл +Зөвхөн координат нь OptionWizard.52 \= CSV / CED файл +OptionWizard.53 = талбай +OptionWizard.54 = Төв цÑг нь +OptionWizard.55 = Ðлдаа импортлох төÑөл Ñ…Ð°Ð²Ñ‚Ð°Ñ +OptionWizard.56 = ачааллын төÑөл +OptionWizard.57 = Өмнө нь дуудагддаг төÑөл +OptionWizard.58 = ÐÑÑлттÑй Gee тоглоомын талбай (Trusted Tester хандах шаардлагатай) +OptionWizard.59 = ÐÑÑлттÑй Энд Maps газар дÑÑÑ€ анхаарлаа хандуулж +OptionWizard.6 = PostgreSQL DB параметрүүд +OptionWizard.65 = Saiku хавтÑанд зам +OptionWizard.66 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.67 = Firefox гүйцÑтгÑгдÑÑ… нь зам +OptionWizard.68 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.7 = Ð¥ÑÑ€ÑглÑгчийн нÑÑ€ +OptionWizard.70 = гүйцÑтгÑгдÑÑ… файлууд +OptionWizard.72 = Хоёртын файлууд +OptionWizard.73 = Chrome гүйцÑтгÑгдÑÑ… нь зам +OptionWizard.74 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.76 = гүйцÑтгÑгдÑÑ… файлууд +OptionWizard.78 = Хоёртын файлууд +OptionWizard.79 = KML Freemarker загварт зам +OptionWizard.8 = Ðууц үг +OptionWizard.80 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.82 = Freemarker загвар +OptionWizard.83 = HTML бөмбөлөг Ñ…ÑлбÑÑ€ дизайн зам +OptionWizard.84 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.86 = HTML вÑб Ñ…ÑƒÑƒÐ´Ð°Ñ +OptionWizard.87 = IDM тодорхойлолт нь XML нь зам +OptionWizard.88 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.9 = DB нÑÑ€ +OptionWizard.90 = XML IDM тодорхойлолт +OptionWizard.91 = Server (менежер хувилбар, ÑÑвÑл дангаараа ашиглах нь) +OptionWizard.92 = Ð¥ÑÑ€ÑглÑгч (оператор / Ñервер уруу холбогдÑон) +OptionWizard.93 = SQLite (Embedded / нÑг файл дÑÑÑ€ тулгуурлаÑан) OptionWizard.94 = PostgreSQL -SaikuAnalysisListener.0 = à»àº¡à»ˆàº™ - ຂà»à»‰â€‹àº¡àº¹àº™ Refresh Saiku (ຂະ​ບວນ​àºàº²àº™â€‹àºàº²àº§â€‹) -SaikuAnalysisListener.1 = ບà»à»ˆ - ພຽງ​à»àº•່​ເລີ່ມ​ຕົ້ນ Saiku -SaikuStarter.1 = ເລີ່ມ Saiku -SaikuStarter.2 = u0EC0ລີ່ມ Saiku ສາ​ມາດ​ໃຊ້​ເວ​ລາ​ນາ​ທີ \= àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº¥à»â€‹àº–້າ ​\! -SaveEarthDataServlet.0 = àºàº²àº™â€‹àº®à»‰àº­àº‡â€‹àº‚à»â€‹à»€àº›àº»à»ˆàº² -SaveEarthDataServlet.1 = ບັນ​ຫາ​ທີ່​ເàºàºµàº”​ຂຶ້ນ​ໃນ​ຂະ​ນະ​ທີ່​ປະ​ຢັດ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ດ້ -SaveEarthDataServlet.2 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໄດ້​ບັນ​ທືຠ-SlopeCode.0 = ລຽບ (0-5​)àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -EarthApp.11 = ໃນ​ທົ່ວ​ໂລàºâ€‹à»àº¡à»ˆàº™â€‹à»àº¥à»‰àº§â€‹à»àº¥à»ˆàº™ -EarthApp.21 = ໄຟ​ທີ່​ມີ​ຕາ​ຂ່າàºâ€‹à»„ຟ​ຟ້າ​ຂອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ເປັນ CSV / CED à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹àºžàº»àºšâ€‹à»€àº«àº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹à»€àºªàº±à»‰àº™â€‹àº—າງ​ທີ່​ເລືອàºâ€‹\:
-EarthApp.23 = ບà»à»ˆâ€‹à»„ຟລ​໌ CSV / CED ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

-EarthApp.24 = ໄຟ​ທີ່​ມີ​à»àº¡à»ˆâ€‹à»àºšàºš Freemarker ທີ່​ມີ​ຄà»àº²â€‹àº™àº´â€‹àºàº²àº¡ KML ບà»à»ˆâ€‹à»„ດ້​ພົບ​ເຫັນ​ຢູ່​ໃນ​ເສັ້ນ​ທາງ​ທີ່​ເລືອàºâ€‹\:
-EarthApp.26 = ບà»à»ˆâ€‹à»„ຟລ​໌​ຄà»àº²â€‹àº™àº´â€‹àºàº²àº¡ KML ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

-EarthApp.27 = ໄຟ​ທີ່​ມີ​ຮູບ​à»àºšàºšâ€‹àº›àº¹àº¡â€‹à»€àº›àº»à»‰àº² HTML ໄດ້​à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹àºžàº»àºšâ€‹à»€àº«àº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹à»€àºªàº±à»‰àº™â€‹àº—າງ​ທີ່​ເລືອàºâ€‹\:
-EarthApp.29 = ບà»à»ˆâ€‹à»„ຟລ​໌​ປູມ​ເປົ້າ HTML ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

-EarthApp.3 = ເຕືອນ​ຂ້ອàºâ€‹àº•à»à»ˆâ€‹àº¡àº² -EarthApp.30 = àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹à»àºà»‰â€‹à»„ຂ​ສະ​ຖານ​ທີ່​ໄຟລ​໌​ຢູ່​ໃນ​ເມ​ນູ Tools-> Properties​. -EarthApp.4 = àºàº²àº™â€‹àº›àº±àºšâ€‹àº›àº¸àº‡â€‹à»ƒàº™â€‹àº›àº±àº”​ຈຸ​ບັນ -EarthApp.5 = ຢ່າ​ເຕືອນ​ຂ້າ​ພະ​ເຈົ້າ​ອີàºâ€‹à»€àº—ື່ອ​ຫນຶ່ງ -EarthApp.57 = ມີ​ສະ​ບັບ​ໃຫມ່​ຂອງ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹àº—ີ່​ມີ à»àº¡à»ˆàº™â€‹\!
ທ່ານ​ບà»à»ˆâ€‹àº•້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹? ເຕືອນ -EarthApp.58 = ປັບ​ປຸງ -EarthApp.59 Error \= ໃນ​ເວ​ລາ​ທີ່​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ເອ​àºàº°â€‹àºªàº²àº™â€‹à»‚ຄງ​àºàº²àº™ -EarthApp.6 = \ - ສະ​ບັບ -EarthApp.61 = ເອ​àºàº°â€‹àºªàº²àº™â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹à»„ດ້​ເàºàº±àºšâ€‹àºà»àº²â€‹àºšà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ຈະ​ເປີດ​ເຜີàºâ€‹.
àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹à»€àº®àº±àº”​ໃຫ້​à»àº™à»ˆâ€‹à»ƒàºˆàº§à»ˆâ€‹àº²â€‹àº—ີ່​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»àº¡à»ˆàº™â€‹àºàº²àº™â€‹àº•ິດ​ຕັ້ງ​. -EarthSurveyService.9 = ພາàºâ€‹àºªàº°â€‹àº«àº™àº²àº¡â€‹àº—ີ່​ຕ້ອງ​àºàº²àº™à»€àº­àº»àº² -ExportActionListener.1 = ວັນ​ທີ່​ຈະ​ບັນ​ທຶàºâ€‹àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àºˆàº²àºàº‚à»à»‰â€‹àº¡àº¹àº™ -ExportDialogProcessMonitor.0 àºàº²àº™â€‹àº›àº¸àº‡â€‹à»àº•່ງ \= ... -ExportDialogProcessMonitor.1 = ລà»â€‹àº–້າ​ທີ່​ຈະ​ເລີ່ມ​ຕົ້ນ​ຂະ​ບວນ​àºàº²àº™â€‹\:àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àº -ExportDialogProcessMonitor.4 =​\: -ImportProcessMonitorDialog.0 = àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​\: -ImportActionListener.0 = ຄວນ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àº—ີ່​ດິນ​ທີ່​ບà»à»ˆâ€‹à»„ດ້​ຮັບ​àºàº²àº™â€‹à»€àº•ີມ​ລົງ​ໄປ​ໃນ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ໄດ້ -ImportActionListener.2 = ຖ້າ​ທ່ານ​ຄລິàºâ€‹à»ƒàºªà»ˆ ບà»à»ˆ ພຽງ​à»àº•່​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºˆàº²àºâ€‹àºžàº²àºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ຢູ່​ໃນ​ສະ​ພາບ "ສີ​ຂຽວ​"​, ທີ່​ບັນ​ຈຸ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ັງ​ຫມົດ​ໄດ້​, ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​. -ImportActionListener.3 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ບັນ​ທຶàºâ€‹àº—າງ​àºàº²àº™â€‹àºªà»àº²â€‹à»€àº¥àº±àº”​ຮູບ -ImportDialogProcessMonitor.0 = \ ຄິດ​ໄລ່ -ImportDialogProcessMonitor.11 = ຈà»àº²â€‹àº™àº§àº™â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ​ຂອງ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹\: -ImportDialogProcessMonitor.2 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ບັນ​ທຶàºâ€‹àºàº²àº™ ... -ImportDialogProcessMonitor.5 = ຈ​à»â€‹àº²â€‹àº™àº§àº™â€‹àº•ົວ​ຈິງ​ຂອງ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​\:ຂà»à»‰â€‹àº¡àº¹àº™ -ImportDialogProcessMonitor.8 àºàº²àº™â€‹àº›àº¸àº‡â€‹à»àº•່ງ \= ... -InfiniteProgressMonitor.0 = àºàº»àºâ€‹à»€àº¥àºµàºâ€‹àºàº²àº™â€‹àº”à»àº²â€‹à»€àº™àºµàº™â€‹àº‡àº²àº™àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -JFileChooserExistsAware.0 = file ໂລàºâ€‹à»‚ຄງ​àºàº²àº™ -KmlImportService.13 = ເລືອàºâ€‹à»„ຟລ​໌ CSV ເພື່ອ​ຊ່ວàºâ€‹àº›àº°â€‹àº¢àº±àº”​ສະ​ຖານ​ຕອນ​ດິນ​ຂອງ​ຕົນ​ເພື່ອ -MissingPlotsListener.0 Error \= ໃນ​ຂະ​ນະ​ທີ່​àºàº²àº™â€‹à»„ດ້​ຮັບ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àº—ີ່​ດິນ​ບà»à»ˆâ€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ດ້ -MissingPlotsListener.1 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ໄປ -MissingPlotsListener.10 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ໃນ​àºàº²àº™â€‹àº­àº­àºâ€‹à»àºšàºšâ€‹àºªàº¸à»ˆàº¡â€‹àº•ົວ​ຢ່າງ​\: -MissingPlotsListener.12 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ຫາàºâ€‹à»„ປ​\: -MissingPlotsListener.14 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທັງ​ຫມົດ​à»àº¡à»ˆàº™â€‹à»„ດ້​ເຕີມ​ລົງ​ໄປ ​\!ເນື້ອ​ໃນ -MissingPlotsListener.2 = ຄັດ​ລອàºâ€‹à»„ປ​ທີ່ clipboardເອົາ -MissingPlotsListener.3 = ໄຟລ​໌​ທີ່​ບັນ​ຈຸ​ມີ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ສານ​ຕອນ​ດິນ​ຂອງ​ຕົນ (.csv ຫຼື​ໄຟລ​໌ .ced​) ສà»àº²â€‹àº¥àº±àºšâ€‹àº—ີ່​ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ຮູ້​ວ່າ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ັງ​ຫມົດ​ໄດ້​ຮັບ​àºàº²àº™â€‹à»€àº•ີມ​ລົງ​ໄປ​. -MissingPlotsListener.4 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຫາàºâ€‹à»„ປ - ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ສານ -MissingPlotsListener.5 = ຈາàºâ€‹à»„ຟ​\: -MissingPlotsListener.6 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ​ໄຟລ​໌ CED -ProcessMonitorDialog.1 = ຂà»à»‰â€‹àºœàº´àº”​ພາດ Parsing àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àºˆà»àº²â€‹àº™àº§àº™â€‹àºàº²àº™â€‹àº•ິດ​ຕà»à»ˆâ€‹àºàº±àº™ -ProcessMonitorDialog.4 = ຖັນ​, -ProcessMonitorDialog.5 = \ - ຄຸນ​ຄ່າ \ No newline at end of file +SaikuAnalysisListener.0 = Тийм - СÑргÑÑÑ… Saiku мÑдÑÑлÑл (урт үйл Ñвц) +SaikuAnalysisListener.1 = Үгүй - ЗүгÑÑÑ€ л Saiku ÑхлÑÑ… +SaikuStarter.1 Saiku ÑхлÑн \= +SaikuStarter.2 Saiku ÑхлÑн зарим нÑг минут үргÑлжилж болох \= түр хүлÑÑÐ½Ñ Ò¯Ò¯ \! +SaveEarthDataServlet.0 = ХооÑон Ñ…Ò¯ÑÑлт +SaveEarthDataServlet.1 = ÐÑуудлын мÑдÑÑллийн Ñанд мÑдÑÑлÑл Ñ…ÑмнÑÑ… гарлаа +SaveEarthDataServlet.2 = өгөгдөл хадгалÑан байна +SlopeCode.0 = Хавтгай (0-5) +EarthApp.11 = дÑлхий аль Ñ…Ñдийн ажиллаж байгаа цуглуулах +EarthApp.21 хашааны ÑүлжÑÑ Ð°Ð³ÑƒÑƒÐ»Ñан файлыг \= а CSV / CED ÑонгоÑон зам олж чадаагүй байна гÑж\:
<би> +EarthApp.23 = Ямар ч CSV / CED файл тохируулга байна\:

+EarthApp.24 = KML тодорхойлолт нь Freemarker загварыг агуулÑан файлыг ÑонгоÑон замаар олж ороогүй байна\:
<би> +EarthApp.26 = Ямар ч KML тодорхойлолт файл тохируулга байна\:

+EarthApp.27 = HTML бөмбөлөг Ñ…ÑлбÑрийг агуулÑан файлыг ÑонгоÑон замаар олж ороогүй байна\:
<би> +EarthApp.29 = Ямар ч HTML бөмбөлөг файл тохируулга байна\:

+EarthApp.3 = дараа нь надад Ñануул +EarthApp.30 = Ð¥ÑÑ€ÑгÑÑл цÑÑÑн дотрооÑ> Properties цÑÑ Ñ„Ð°Ð¹Ð»Ñ‹Ð½ байршлыг зөв оруулна уу. +EarthApp.4 = шинÑчлÑÑ… Одоо +EarthApp.5 = намайг дахин Ñануулах байхгүй юу +EarthApp.57 = <б> цуглуулж ДÑлхий боломжтой -ийн ÑˆÐ¸Ð½Ñ Ñ…ÑƒÐ²Ð¸Ð»Ð±Ð°Ñ€ байна\! Ð¥ÑÑ€Ñв та Ñ…ÑрхÑн цааш Ñ…Ò¯ÑÑж байна вÑ?
+EarthApp.58 = шинÑчлÑÑ… бөгөөд дохио авах байрлуулах +EarthApp.59 = Ðлдаа төÑөл файлыг импортлох +EarthApp.6 = \ - Хувилбар +EarthApp.61 = цуглуулж ДÑлхий файл, нÑÑлттÑй байж чадÑангүй.
Google Earth ÑуулгаÑан ÑÑÑхийг шалгана уу. +EarthSurveyService.9 = талбар шаардлагатай +ExportActionListener.1 = ÑхлÑн ÑкÑпортын Records-руу огноо Ñонгох +ExportDialogProcessMonitor.0 = боловÑруулах мÑдÑÑ ... +ExportDialogProcessMonitor.1 = үйл Ñвцыг Ñхлүүлж хүлÑÑж байна\: +ExportDialogProcessMonitor.4 = ÑкÑпортлох бүртгÑл\: +ImportProcessMonitorDialog.0 = Импортын бүртгÑл\: +ImportActionListener.0 = бүрÑн дүүрÑн чадаагүй байна талбайд өгөгдлийн импортын Ñ‘Ñтой юу? +ImportActionListener.2 = Та дарна бол <и> <б> NO бүх өгөгдлийг агуулÑан "ногоон" төлөвт талбайд, зөвхөн өгөгдөл оруулÑан болно. +ImportActionListener.3 = Импорт Ð±ÑƒÑ Ð±Ð¾Ð»Ð¾Ð²ÑруулÑан бүртгÑл +ImportDialogProcessMonitor.0 = ТООЦОЖ бичлÑгүүдийн ImportDialogProcessMonitor.11 \= Эхний дугаар\: +ImportDialogProcessMonitor.2 = бүртгÑл импортлож байна ... +Импортын бүртгÑл ImportDialogProcessMonitor.5 \= бодит тоо\: +ImportDialogProcessMonitor.8 = боловÑруулах мÑдÑÑ ... +InfiniteProgressMonitor.0 = ажиллагааг Cancel +JFileChooserExistsAware.0 = ДÑлхий төÑөл файлыг цуглуулах +KmlImportService.13 = тулд талбай байршлыг хадгалахын тулд CSV файлыг Ñонгоно уу +Database дÑÑÑ€ нь байхгүй хашааны-ий тухай мÑдÑÑлÑл авах бол MissingPlotsListener.0 \= алдаа +MissingPlotsListener.1 = хайж байна газрууд +MissingPlotsListener.10 = дÑÑж дизайн талбайд нийт тоо\: +MissingPlotsListener.12 = алга хашааны тоо\: +MissingPlotsListener.14 = мÑдÑÑлÑл талбай дүүрÑн байдаг \! +MissingPlotsListener.2 = Хуулах Бал нь агуулга +MissingPlotsListener.3 = Та бүх мÑдÑÑлÑл ирÑÑн дүүрÑн байÑан ÑÑÑхийг мÑдÑхийг Ñ…Ò¯ÑÑж байгаа нь хуйвалдаан мÑдÑÑлÑл (.csv ÑÑвÑл .ced файлууд) агуулÑан файлуудыг Ñонгоорой. +MissingPlotsListener.4 = хайж байна талбай - мÑдÑÑлÑл +MissingPlotsListener.5 Ñ„Ð°Ð¹Ð»Ð°Ð°Ñ \=\: +CED файлд MissingPlotsListener.6 \= ЭкÑпортын +мөр нь Ñ…Ñд Ñ…ÑдÑн ProcessMonitorDialog.1 \= магадлах алдаа +ProcessMonitorDialog.4 = багана +ProcessMonitorDialog.5 = \ - утгууд \ No newline at end of file From 044feabd3c9b0384e72cf5ab217a80127ad74030 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:35:01 +0100 Subject: [PATCH 0765/1620] New translations Messages_mn.properties (English) --- .../earth/app/view/Messages_en.properties | 436 +++++++++--------- 1 file changed, 217 insertions(+), 219 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index e5b9bd9e45..7531b1f880 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,220 +1,218 @@ -AboutDialog.19 = ບັນ​ຫາ​ເàºàºµàº” A -AboutDialog.5 = ສà»àº²â€‹àº¥àº±àºšâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹à»€àºžàºµà»ˆàº¡â€‹à»€àº•ີມ​ໄດ້​ທີ່ OpenForis.org ເວັບ​ໄຊ​ທ​໌​ຂອງ​ພວàºâ€‹à»€àº®àº»àº² -AboutDialog.6 = ຂà»â€‹à»‚ທດ​ນà»àº²â€‹, ບັນ​ຫາ​ທີ່​ເàºàºµàº”​ຂຶ້ນ​ໃນ​ຂະ​ນະ​ທີ່​ຄວາມ​ພະ​àºàº²â€‹àºàº²àº¡â€‹àº—ີ່​ຈະ​ເປີດ​àºàº²àº™â€‹à»€àºŠàº·à»ˆàº­àº¡â€‹àº•à»à»ˆâ€‹àº™àºµà»‰â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹àº¥àº°â€‹àºšàº»àºšâ€‹àº‚ອງ​ທ່ານ​ຕົວ​ທ່ອງ​ເວັບ​ຂອງ​ມາດ​ຕະ​ຖານ​. -AboutDialog.8 = Ok -AspectCode.0 = ເຫນືອ -AspectCode.1 = ວັນ​ອອàºâ€‹àºªà»ˆàº½àº‡â€‹à»€àº«àº™àº·àº­ -AspectCode.2 = ຕາ​ເວັນ​ອອຠ-AspectCode.3 = ພາàºâ€‹à»ƒàº•້​, ຕາ​ເວັນ​ອອຠ-AspectCode.4 = ໃຕ້ -AspectCode.5 = ພາàºâ€‹à»ƒàº•້​, ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ-AspectCode.6 = ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ-AspectCode.7 = ພາàºâ€‹à»€àº«àº™àº·àº­â€‹, ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ-CollectEarthWindow.0 = ໃນ​ເວ​ລາ​ທີ່​ພະ​àºàº²â€‹àºàº²àº¡â€‹à»€àºžàº·à»ˆàº­â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌ CSVຄວາມ​ຜິດ​ພາດ -CollectEarthWindow.1 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àº -CollectEarthWindow.10 File \= -CollectEarthWindow.11 ອອàºâ€‹àºˆàº²àº \= -CollectEarthWindow.12 = ເຄື່ອງ​ມືຂà»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.13 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ CSV àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ -CollectEarthWindow.14 = Start SAIKU -CollectEarthWindow.15 = ຄຸນ​ສົມ​ບັດ -CollectEarthWindow.16 = ຊ່ວàºâ€‹à»€àº«àº¼àº·àº­ -CollectEarthWindow.17 = ປະ​ຕິ​ເສດ -CollectEarthWindow.18 = ຄົ້ນ​ຫາ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ຫາàºâ€‹à»„ປ​ໃນ​ຖານ​ຂà»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.19 = ເàºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ-CollectEarthWindow.2 = ພາ​ສາ -CollectEarthWindow.20 = ຈà»àº²â€‹àº™àº§àº™â€‹àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™ duplicated​\: -CollectEarthWindow.21 = ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ຊອàºâ€‹àº«àº² icon ສà»àº²â€‹àº¥àº±àºšâ€‹àºžàº²â€‹àº•ົ້ນ​ຕ໠-CollectEarthWindow.22 = ທ່ານ​ມີ​ຄວາມ​à»àº™à»ˆâ€‹à»ƒàºˆàº§à»ˆâ€‹àº²â€‹àº—່ານ​ຕ້ອງ​àºàº²àº™â€‹àº›àº´àº”​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹? ໃນ​àºàº²àº™â€‹àº›àº´àº”​ປ່ອງ​ຢ້ຽມ​àºàº±àº‡â€‹àºˆàº°â€‹àº›àº´àº”​ເຄື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹àº‚ອງ​ໂລàºâ€‹à»„ດ້​ເàºàº±àºšâ€‹àºà»àº² -CollectEarthWindow.23 = àºàº²àº™â€‹àº¢àº±à»‰àº‡â€‹àº¢àº·àº™â€‹àº—ີ່​ຈà»àº²â€‹à»€àº›àº±àº™ -CollectEarthWindow.24 = XML ສົ່ງ​ອອຠ-CollectEarthWindow.25 = ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ເພີ່ມ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹à»€àº«àº¼àº»à»ˆàº²â€‹àº™àºµà»‰â€‹à»àº¥à»‰àº§â€‹à»àº¥àº°â€‹àºàº²àº™â€‹àºªàº¹àº™â€‹à»€àºªàºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº‚ອງ​ທ່ານ​? -CollectEarthWindow.26 = ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™ -CollectEarthWindow.27 = ປັບ​ປຸງ -CollectEarthWindow.28 = ເຮັດ​ຢູ່​ຕ່າງ​ປະ​ເທດ​ເàºàº±àºšâ€‹àºà»àº²â€‹à»€àº„ື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹àº„ວນ​ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹à»àº¥à»ˆàº™â€‹à»ƒàº™â€‹àº‚ະ​ນະ​ທີ່​ຜູ້​ປະ​àºàº­àºšâ€‹àºàº²àº™â€‹àº•ີ​ຄວາມ​ຫມາàºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹. -CollectEarthWindow.29 = The Saiku Server ບà»à»ˆâ€‹à»„ດ້​ຖືàºâ€‹àº•ັ້ງ​. -CollectEarthWindow.3 = \ ຄວາມ​ຜິດ​ພາດ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ -CollectEarthWindow.30 = àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº®àº±àºâ€‹àºªàº²â€‹àºàº²àº™â€‹à»€àº›àºµàº”​ຫນ້າ​ຕ່າງ​ນີ້​ໃນ​ຂະ​ນະ​ທີ່​ທ່ານ​àºà»àº²â€‹àº¥àº±àº‡â€‹à»ƒàºŠà»‰â€‹àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹. -CollectEarthWindow.31 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌ CSV -CollectEarthWindow.32 = ອອຠ-CollectEarthWindow.33 = ຊື່​ຜູ້​ປະ​àºàº­àºšâ€‹àºàº²àº™â€‹àºˆàº°â€‹àº•້ອງ​ມີ​àºàº²àº™â€‹àº•à»à»ˆâ€‹à»„ປ​ອີàºâ€‹à»àº¥à»‰àº§â€‹àºâ€‹à»ˆâ€‹àº§àº² 5 ລັàºâ€‹àºªàº°â€‹àº™àº°â€‹à»àº¥àº°â€‹àºªàº±à»‰àº™â€‹àºâ€‹à»ˆâ€‹àº§àº² 50ຄວາມ​ຜິດ​ພາດ -CollectEarthWindow.34 = àºàº§àº”​ສອບ -CollectEarthWindow.35 = ຜູ້​ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹àº¥àº»àºšâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™ ​\! ຫລັàºâ€‹àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº•ື່ມ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàºªà»ˆâ€‹àºŠàº·à»ˆâ€‹àºœàº¹à»‰â€‹àº›àº°â€‹àºàº­àºšâ€‹àºàº²àº™â€‹à»àº¥àº°â€‹à»ƒàº«à»‰â€‹àºàº»àº”​ປຸ່ມ "ປັບ​ປຸງ​"​. ຊື່ -CollectEarthWindow.36 = ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹àºšà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ເປົ່າ -CollectEarthWindow.37 = ຮັàºâ€‹àºªàº²â€‹àºˆàº±àº™à»„ຟລ​໌ -CollectEarthWindow.38 = CSV -CollectEarthWindow.39 à»àºˆà»‰àº‡ \= ມັນ​ເປັນ​àºàº²àº™â€‹àºªàº»àº¡â€‹àº„ວນ​ທີ່​ທ່ານ​ໄປ​ເຖິງ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº‚ອງ​ທ່ານ (àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ XML​) àºà»ˆàº­àº™â€‹àº—ີ່​ຈະ​ໄດ້​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº«àº¡à»ˆâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ -CollectEarthWindow.4 = FAO à»àºˆà»‰àº‡â€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ເສດ -CollectEarthWindow.40 = ທີ່​àºà»àº²â€‹àº™àº»àº”​ໄວ້​ຕາມ​ເສັ້ນ​ທາງ​àºàº±àºšâ€‹à»‚ຟນ​ເດີ​ທີ່ Saiku Server ໄດ້​ຖືàºâ€‹àº•ິດ​ຕັ້ງ​ຢູ່​ໃນ Tools-> Properties-> à»àº–ບ​à»àºšàºšâ€‹àºžàº´â€‹à»€àºªàº”​ໄດ້​. -CollectEarthWindow.41 = àºàº²àº™â€‹àº›àº°â€‹àº«àºàº±àº”​àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌​\: -CollectEarthWindow.42 = ອອຠ-CollectEarthWindow.43 = àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº•à»àº²â€‹àºàº±àº™â€‹àº—ີ່​ພົບ​ເຫັນ -CollectEarthWindow.44 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ / ສົ່ງ​ອອàºàº‚à»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.45 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ XML (à»àº›â€‹)ຂà»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.46 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ໃຫມ່​ຈາàºâ€‹à»„ປ​ສະ​ນີ (XML à»àº›â€‹)àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™ -CollectEarthWindow.55 ປັບ​ປຸງ \= àºàº²àº™â€‹àº™à»àº²â€‹à»ƒàºŠà»‰ CSV -CollectEarthWindow.47 = Saiku Server ບà»à»ˆâ€‹à»„ດ້​àºà»àº²â€‹àº«àº™àº»àº” -CollectEarthWindow.48 = ໄຟລ​໌​ຫັດ​ໄປ​ສະໄຟລ​໌ -CollectEarthWindow.49 = Fusion CSV -CollectEarthWindow.5 = ປິດ -CollectEarthWindow.50 = ເປີດ​ຄູ່​ມື​àºàº²àº™â€‹à»ƒàºŠà»‰àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™â€‹àº›àº±àºšâ€‹àº›àº¸àº‡â€‹àº‚ອງ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ-CollectEarthWindow.51 CHECK \= àºàº§àº”​ສອບ -CollectEarthWindow.52 = File ເຂົ້າ​ສູ່​ລະ​ບົບ​ຄà»àº²â€‹àº®à»‰àº­àº‡â€‹àºªàº°â€‹àº«àº¡àº±àºâ€‹à»€àº›àºµàº” -CollectEarthWindow.53 = àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»€àº­â€‹àºàº°â€‹àºªàº²àº™â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹à»€àº‚ົ້າ​ສູ່​ລະ​ບົບຈຸດ -CollectEarthWindow.54 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຈາຠKMLàºà»ˆàº½àº§â€‹àºàº±àºš -CollectEarthWindow.56 = ... -CollectEarthWindow.57 = ຂະ​ບວນ​àºàº²àº™â€‹à»€àº¥àºµà»ˆàº¡â€‹àº•ົ້ນ Saiku à»àº¡à»ˆàº™â€‹àºàº±àº‡â€‹à»àº¥à»ˆàº™â€‹, àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº¥à»â€‹àº–້າ​. -CollectEarthWindow.58 = ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ເລີ່ມ​ຕົ້ນ​àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ Saiku -CollectEarthWindow.59 = ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ Re​\: àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ Saiku ໄດ້​?
ຂະ​ບວນ​àºàº²àº™â€‹àº™àºµà»‰â€‹àºªàº²â€‹àº¡àº²àº”​ໃຊ້​ເວ​ລາ​ຫຼາàº
ຖ້າ​ທ່ານ​ຄລິàºâ€‹à»ƒàºªà»ˆ "à»àº¡à»ˆàº™â€‹à»àº¥à»‰àº§â€‹" ເປັນ​ຊຸດ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໃຫມ່​ທີ່​ມີ​ຄວາມ​ຫຼ້າ​ສຸດ​ໄດ້​. ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº‚ຶ້ນ​. -CollectEarthWindow.6 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ Fusion ຕາ​ຕະ​ລາງàºàº²àº™â€‹àºœàº°â€‹àº¥àº´àº”​ຂà»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.60 = Saiku -CollectEarthWindow.61 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່ XML (àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº”ັດ​à»àºà»‰â€‹àº™àº±àºšâ€‹àº•ັ້ງ​à»àº•່​àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àºªàº¸àº”​ທ້າàºâ€‹) ສົ່ງ​ອອàºàºà»ˆàº½àº§â€‹àºàº±àºš -CollectEarthWindow.62 = ... -CollectEarthWindow.63 Error \= àºàº²àº™â€‹à»„ດ້​ຮັບ​ຈຸດ​ທີ່​ໄດ້​ຈາຠKML -CollectEarthWindow.64 = ສະ​ຫນັບ​ສະ​ຫນູນ​ທາງ​ເທàºâ€‹àº™àº´àº -CollectEarthWindow.7 Error \= ໃນ​ເວ​ລາ​ທີ່​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຂà»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.8 ຂà»à»‰â€‹àº„ວາມ​ປະ​ຕິ​ເສດ \= ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ພົບ​ເຫັນ -CollectEarthWindow.9 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໄດ້​ນà»àº²â€‹à»€àº‚ົ້າ​ມາ​ປະ​àºàº­àºšâ€‹àº”້ວàºâ€‹àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àº—ີ່​ມີ​ຢູ່​à»àº¥à»‰àº§â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚ອງ​ທ່ານ​. -DynamicsCode.0 = ປ່າ​ໄມ້​ໃນ​ເບື້ອງ​ຕົ້ນ -DynamicsCode.1 = ທົ່ງ​ຫàºà»‰àº²â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ -DynamicsCode.2 = àºàº²àº™â€‹àº•ັ້ງ​ຖິ່ນ​ຖານ​ໃນ​ເບື້ອງ​ຕົ້ນ -DynamicsCode.3 = ເບື້ອງ​ຕົ້ນ Otherland -DynamicsCode.4 = ຊຸ່ມ​ນ​້​à»àº²â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ -DynamicsCode.5 = ເບື້ອງ​ຕົ້ນ Cro​​pland -OpenTextFileListener.0 = ໄຟລ​໌​ຂà»à»‰â€‹àº„ວາມ​à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹à»„ດ້​ພົບ​ໄດ້​ທີ່​\:àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -OptionWizard.0 = ທາງ​ເລືອàºâ€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ-OptionWizard.1 = ເລືອàºâ€‹àº‚ອງ​ຕົວ​ທ່ອງ​ເວັບ -OptionWizard.10 = ໂຟ​ເດີ​ສà»àº²â€‹àº®àº­àº‡â€‹àºˆàº±àº™ -OptionWizard.11 = ບà»à»ˆâ€‹àº®àº¹à»‰â€‹àºˆàº±àºâ€‹\: àºàº²àº™â€‹àº™à»àº²â€‹à»ƒàºŠà»‰ ifconfig -OptionWizard.12 = ລູàºâ€‹àº„້າ​ຕົວ​ຢ່າງàºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -OptionWizard.13 = ໂລຠIP Serveràºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -OptionWizard.14 = port ໂລຠServer (ຕົວ​ຢ່າງ​\: 8023​) -OptionWizard.15 = ບັນ​ທຶàºâ€‹à»àº¥àº°â€‹à»ƒàºŠà»‰â€‹àºàº²àº™â€‹àº›à»ˆàº½àº™â€‹à»àº›àº‡ -OptionWizard.16 = ລະ​ຫັດ -OptionWizard.17 = X​-coord -OptionWizard.18 = Y coord​, -OptionWizard.19 = àºàº²àº™â€‹àºàº»àºâ€‹àº¥àº°â€‹àº”ັບ -OptionWizard.2 = ບວນ​àºàº²àº™â€‹à»€àº®àº±àº”​ວຽຠ(server / ລູàºâ€‹àº„້າ​) -OptionWizard.20 = ໄດ້​ເນື້ອ​ໃນ​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»„ດ້​ມີ​àºàº²àº™â€‹àº›à»ˆàº½àº™â€‹à»àº›àº‡â€‹.
àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº®àº±àºšâ€‹à»‚ຫລດ​ເນື້ອ​ຫາ​ໃນ​ເວ​ລາ​ທີ່​ທ່ານ​àºà»àº²â€‹àº¥àº±àº‡â€‹àº®àº±àºšâ€‹àºàº²àº™â€‹àºàº°â€‹àº•ຸ້ນ​ໂດàºâ€‹àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹. -OptionWizard.21 = ປັບ​ປຸງ​ສົບ​ຜົນ​ສà»àº²â€‹à»€àº¥àº±àº” -OptionWizard.22 = ຄ້ອຠ-OptionWizard.23 = ມີ​ຄວາມ​ຜິດ​ພາດ​ໃນ​ເວ​ລາ Re​\: ເປີດ​ໄດ້​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»€àº›àº±àº™â€‹à»„ດ້àºàº»àºâ€‹à»€àº¥àºµàºâ€‹àºàº²àº™ -OptionWizard.24 = àºàº»àºà»€àº¥àºµàºàºàº²àº™ -OptionWizard.25 = ຮູບ​à»àºšàºšâ€‹àºàº²àº™â€‹àº”à»àº²â€‹à»€àº™àºµàº™â€‹àº‡àº²àº™ -OptionWizard.26 = àºàº²àº™â€‹à»€àº›àº±àº™â€‹à»€àºˆàº»à»‰àº²â€‹àºžàº²àºš DB -OptionWizard.27 = ນີ້​ບà»à»ˆâ€‹à»„ດ້​ເປັນ​ທີ່​àºàº­àº¡â€‹àº®àº±àºš Saiku Folder (ເອ​àºàº°â€‹àºªàº²àº™â€‹à»€àº¥àºµà»ˆàº¡ saiku.bat ບà»à»ˆâ€‹à»àº¡à»ˆàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹) -OptionWizard.28 = Saiku Server ບà»à»ˆâ€‹àº®àº­àº‡â€‹àº®àº±àºš -OptionWizard.29 = ພ໠DB -OptionWizard.3 = Server ຕົວ​ຢ່າງ -OptionWizard.30 = ທາງ​ເລືອຠSQLite -OptionWizard.31 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº•ົວ​ຢ່າງ -OptionWizard.32 = ຮູບ​à»àºšàºšâ€‹àº”ິນ​ຕອນ -OptionWizard.33 = ສà»àº²â€‹àº«àº¼àº§àº”​ນຸ​àºàº»àº¡ -OptionWizard.34 = à»àºšàºšâ€‹àºžàº´â€‹à»€àºªàº” -OptionWizard.35 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ຈຸດ​ຕົວ​ຢ່າງ -OptionWizard.36 = ໄລ​àºàº°â€‹àº—າງ​ລະ​ຫວ່າງ​ຈຸດ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àº•ົວ​ຢ່າງ (ໃນ​ຕາ​) -OptionWizard.37 = ອັດ​ຕາ​ທີ່​ມີ​ຊາàºâ€‹à»àº”ນ​ດິນ​ຕອນ (à»àº¡àº±àº”​) -OptionWizard.38 = ໄຟລ​໌ CSV / CED ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ອ່ານ​ໄດ້​ຢ່າງ​ຖືàºâ€‹àº•້ອງ
ເອ​àºàº°â€‹àºªàº²àº™â€‹à»„ດ້​ຖືàºâ€‹àº„າດ​ວ່າ​ຈະ​ມີ​ມູນ​ຄ່າ​àºàº²àº™â€‹à»àºàºâ€‹àºˆàº¸â€‹àº¥àº°â€‹àºžàº²àºâ€‹à»€àºŠàº±à»ˆàº™â€‹àº™àºµà»‰â€‹\:​.
-OptionWizard.39 = ລະ​ຫັດ​, YCoordinate​, XCoordinate​, ພູ​, ລັàºâ€‹àºªàº°â€‹àº™àº° -OptionWizard.4 = IP ຄອມ​ພິວ​ເຕີ​ປັດ​ຈຸ​ບັນ​\: -OptionWizard.40 = ໂຄງ​àºàº²àº™ -OptionWizard.41 = ໂຫຼດ​ໄຟລ​໌​ໂຄງ​àºàº²àº™â€‹à»ƒàº«àº¡à»ˆ -OptionWizard.42 = ຜິດ​ພາດ​ໃນ​ເວ​ລາ​ປິດ​àºàº²àº™â€‹àº­à»ˆàº²àº™ CSV -OptionWizard.43 = ຊື່​ຂອງ​àºàº²àº™â€‹àºªà»àº²â€‹àº«àº¼àº§àº” -OptionWizard.44 = ຖານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ປ​ໃຫ້​ເຖິງ​ອັດ​ຕະ​ໂນ​ມັດ​ທີ່ -OptionWizard.45 = Open Earth Engine ຊູມ​ເຂົ້າ​ໄປ​ໃນ​ເຂດ​ຕອນ​ດິນ​ຂອງ​ຕົນ -OptionWizard.46 = timelapse ຈັàºâ€‹à»€àº›àºµàº”​ໂລàºâ€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºžàº·à»‰àº™â€‹àº—ີ່​ຕອນ​ດິນ​ຂອງ​ຕົນ -OptionWizard.47 = Open à»àºœàº™ Bing ສà»àº²â€‹àº¥àº±àºšâ€‹àºžàº·à»‰àº™â€‹àº—ີ່​ຕອນ​ດິນ​ຂອງ​ຕົນ -OptionWizard.48 = ຮູບ​à»àºšàºšâ€‹à»€àº›àºµàº”​ໃນ​ຕົວ​ທ່ອງ​ເວັບ​ຂອງ​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»„ດ້ (à»àº™àº°â€‹àº™à»àº²â€‹à»ƒàº«à»‰â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™ LINUX​) -OptionWizard.49 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™ Ced / csv ໄຟລ​໌​ທີ່​ມີ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº•ອນ​ດິນ​ຂອງ​ຕົນàºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -OptionWizard.5 = port ໂລຠServer​\: -OptionWizard.50 = Browse ... -OptionWizard.51 = ເອ​àºàº°â€‹àºªàº²àº™â€‹à»‚ຄງ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຜິດ​ພາດ -OptionWizard.52 = CSV / ເອ​àºàº°â€‹àºªàº²àº™ Ced ມີ​àºàº²àº™â€‹àº›àº°â€‹àºªàº²àº™â€‹àº‡àº²àº™â€‹à»€àº—ົ່າ​ນັ້ນ -OptionWizard.54 = ຈຸດ​ສູນ​àºàº²àº‡ -OptionWizard.55 = Error ໂຟນ​ເດີ​ໂຄງ​àºàº²àº™â€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ -OptionWizard.56 = ໂຄງ​àºàº²àº™ Load -OptionWizard.57 = ໂຄງ​àºàº²àº™ loaded àºà»ˆàº­àº™â€‹àº«àº™à»‰àº²â€‹àº™àºµà»‰ -OptionWizard.58 = Open GEE Code Editor (ຮຽàºâ€‹àº®à»‰àº­àº‡â€‹à»ƒàº«à»‰â€‹àº¡àºµâ€‹àºàº²àº™â€‹à»€àº‚ົ້າ​ເຖິງ Tester Trusted​) -OptionWizard.59 = Open ທີ່​ນີ້​à»àºœàº™â€‹àº—ີ່​ສຸມ​ໃສ່​ຕອນ​ດິນ​ຂອງ​ຕົນ -OptionWizard.6 = ຕົວ​àºà»àº²â€‹àº™àº»àº”​àºàº²àº™ PostgreSQL DB -OptionWizard.65 = ເສັ້ນ​ທາງ​àºàº±àºšâ€‹à»‚ຟນ​ເດີ​ທີ່ Saiku -OptionWizard.66 = Browse ... -OptionWizard.67 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ບັດ​àºàº²àº™ Firefox -OptionWizard.68 = Browse ... -OptionWizard.7 = ຊື່​ຜູ້​ໃຊ້ -OptionWizard.70 = àºàº²àº™â€‹àºšà»â€‹àº¥àº´â€‹àº«àº²àº™â€‹à»„ຟ -OptionWizard.72 = ໄຟລ​໌​ຖານ​ສອງ -OptionWizard.73 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ບັດ​àºàº²àº™ Chrome -OptionWizard.74 = Browse ... -OptionWizard.76 = àºàº²àº™â€‹àºšà»â€‹àº¥àº´â€‹àº«àº²àº™â€‹à»„ຟ -OptionWizard.78 = ໄຟລ​໌​ຖານ​ສອງ -OptionWizard.79 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹à»àºšàºš KML Freemarker -OptionWizard.8 = ລະ​ຫັດ​ຜ່ານ -OptionWizard.80 = Browse ... -OptionWizard.82 = à»àº¡à»ˆâ€‹à»àºšàºš Freemarker -OptionWizard.83 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº­àº­àºâ€‹à»àºšàºšâ€‹àº®àº¹àºšâ€‹à»àºšàºš HTML ປູມ​ເປົ້າ -OptionWizard.84 = Browse ... -OptionWizard.86 = HTML webpage -OptionWizard.87 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™ XML àºàº±àºšâ€‹àº„à»àº²â€‹àº™àº´â€‹àºàº²àº¡ IDM -OptionWizard.88 = Browse ... -OptionWizard.9 = ຊື່ DB -OptionWizard.90 = ຫມາຠIDM XML -OptionWizard.91 = Server (ສະ​ບັບ​ຜູ້​ຈັດ​àºàº²àº™â€‹àº«àº¼àº·â€‹àº¢àº·àº™â€‹àº¢àº¹à»ˆâ€‹àº„ົນ​ດຽວ​ໃຊ້​) -OptionWizard.92 = ລູàºâ€‹àº„້າ (ປະ​ຕິ​ບັດ​àºàº²àº™ / àºàº²àº™â€‹à»€àºŠàº·à»ˆàº­àº¡â€‹àº•à»à»ˆâ€‹àºàº±àºšâ€‹à»€àº„ື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹) -OptionWizard.93 = SQLite (à»àºšàºšâ€‹àºàº±àº‡ / ໄຟລ​໌​ດຽວ​ຕາມ​) +AboutDialog.19 = гарÑан нь аÑуудлыг +AboutDialog.5 = ДÑлгÑÑ€Ñнгүй мÑдÑÑллийг манай вÑб OpenForis.org очиж +AboutDialog.6 = Уучлаарай, аÑуудал нь таны ÑиÑтемийн Ñтандарт браузер ÑÐ½Ñ Ñ…Ð¾Ð»Ð±Ð¾Ð¾Ñыг нÑÑÑ… гÑж оролдож гарлаа. +AboutDialog.8 = Ок +AspectCode.0 = Хойд +AspectCode.1 = Зүүн Хойд +AspectCode.2 = Зүүн +AspectCode.3 = Зүүн-Өмнөд +AspectCode.4 = Өмнөд +AspectCode.5 = Баруун-Өмнөд +AspectCode.6 = Баруун +AspectCode.7 = Баруун Хойд +CollectEarthWindow.0 = CSV файл уруу өгөгдөл ÑкÑпортлох оролдож алдаа +CollectEarthWindow.1 = ЭкÑпортын алдаа +CollectEarthWindow.10 = Файлын +CollectEarthWindow.11 = Exit +CollectEarthWindow.12 Ñ…ÑÑ€ÑгÑÑл \= +CollectEarthWindow.13 = ЭкÑпортын CSV өгөгдөл +CollectEarthWindow.14 = Start SAIKU дүн шинжилгÑÑ +CollectEarthWindow.15 = Үл хөдлөх хөрөнгө +CollectEarthWindow.16 = туÑламж +CollectEarthWindow.17 = Disclaimer +CollectEarthWindow.18 = мÑдÑÑллийн Ñанд Ñураггүй алга газраа хай +CollectEarthWindow.19 = дÑлхийг цуглуулах +CollectEarthWindow.2 = Ñ…Ñл +CollectEarthWindow.20 = давхардÑан тоогоор бүртгÑлийн тоо\: +CollectEarthWindow.21 = гол хүрÑÑ Ð´Ò¯Ñ€Ñийг олж чадахгүй байна +CollectEarthWindow.22 = Ð¥ÑÑ€Ñв та цуглуулж дÑлхийг хаах Ñ…Ò¯ÑÑж байгаа гÑдÑгт итгÑлтÑй байна уу? Цонхыг хаах нь цуглуулж ДÑлхий Ñервер хаах болно
+CollectEarthWindow.23 = батлах Ñ…ÑÑ€ÑгтÑй +CollectEarthWindow.24 = XML ЭкÑпортын +CollectEarthWindow.25 = Та Ñмар ч байÑан ÑдгÑÑÑ€ бүртгÑлийг нÑмÑÑ…, таны одоогийн мÑдÑÑллийг алдах Ñ…Ò¯ÑÑж байна уу? +CollectEarthWindow.26 = Оператор +CollectEarthWindow.27 = шинÑчлÑÑ… +CollectEarthWindow.28 = <б> ÐÑÑлттÑй Foris оператор мÑдÑÑллийг хөрвүүлÑн ойлгох бол ДÑлхий Ñервер ажиллаж байх Ñ‘Ñтой цуглуулна. +CollectEarthWindow.29 = Saiku Ñерверийг тохируулаагүй байна. +CollectEarthWindow.3 = \ Импорт алдаа +CollectEarthWindow.30 = Та Google Earth ашиглаж байгаа бол ÑÐ½Ñ Ñ†Ð¾Ð½Ñ… нÑÑлттÑй байлгах уу. +CollectEarthWindow.31 = ЭкÑпортын CSV файлд мÑдÑÑллийг цуглуулÑан +CollectEarthWindow.32 = Quit +CollectEarthWindow.33 = операторын нÑÑ€ 5 Ñ‚ÑмдÑгтүүд болон 50 богино бодвол илүү урт байх Ñ‘Ñтой +CollectEarthWindow.34 = Баталгаажуулалт алдаа +CollectEarthWindow.35 = OPERATOR нÑÑ€ хооÑон \! Зар операторын нÑÑ€ бөглөх болон "шинÑчлÑÑ…" товчийг дарна уу. +CollectEarthWindow.36 = Оператор нÑÑ€ хооÑон байж болохгүй +CollectEarthWindow.37 = нÑÑлттÑй байлга +CollectEarthWindow.38 = CSV файлууд +CollectEarthWindow.39 = Ðнхааруулга\: Ð­Ð½Ñ Ð½ÑŒ зүйтÑй та нөөцлөх-ап таны одоогийн өгөгдөл (XML нь ЭкÑпортын) ÑˆÐ¸Ð½Ñ Ð¼ÑдÑÑллийг импортлогч өмнө +CollectEarthWindow.4 = ÐҮБ-ын ХХÐÐБ Disclaimer зар +CollectEarthWindow.40 Тодорхой хүртÑл \= Saiku Server Ð¥ÑÑ€ÑгÑÑл цÑÑÑн дотрооÑ> баÑлагт> ÐарийвчилÑан таб-д ÑуулгаÑан байна Ñ…Ð°Ð²Ñ‚Ð°Ñ Ð·Ð°Ð¼Ñ‹Ð³. +CollectEarthWindow.41 = Хадгаламж файл уруу өгөгдөл ÑкÑпортолÑон\: +CollectEarthWindow.42 = Quit +CollectEarthWindow.43 = ЗөрчилтÑй бүртгÑл олдлоо +CollectEarthWindow.44 = МÑдÑÑллийн Импорт / ЭкÑпортын +XML гÑж CollectEarthWindow.45 \= ЭкÑпортын мÑдÑÑ (шахÑан) +Zip-Ð°Ð°Ñ CollectEarthWindow.46 \= Импортын ÑˆÐ¸Ð½Ñ Ð¼ÑдÑÑ (шахÑан XML) +CSV ашиглан CollectEarthWindow.55 \= шинÑчлÑÑ… одоогийн бүртгÑл +CollectEarthWindow.47 = Saiku Ñерверийг тохируулаагүй бол +CollectEarthWindow.48 = Zip / цуглуулах-өгөгдлийн файлууд +CollectEarthWindow.49 = Fusion CSV файлууд +CollectEarthWindow.5 = Хаах +CollectEarthWindow.50 = ÐÑÑлттÑй Ñ…ÑÑ€ÑглÑгчийн гарын авлага +Цуглуулж дÑлхийн шинÑчлÑлтүүдийн хувьд CollectEarthWindow.51 \= шалгах +CollectEarthWindow.52 = ÐÑÑлттÑй Application нÑвтрÑÑ… Файлын +CollectEarthWindow.53 = цуглуулах ДÑлхий нÑвтрÑÑ… файл +KML нь CollectEarthWindow.54 \= ачааллын оноо +CollectEarthWindow.56 = тухай ... +CollectEarthWindow.57 = Saiku гарааны үйл Ñвц одоо ч ажиллаж байгаа, түр хүлÑÑÐ½Ñ Ò¯Ò¯. +CollectEarthWindow.58 = Saiku шинжилгÑÑг Ñхлүүлж чадахгүй +CollectEarthWindow.59 = Ð¥ÑÑ€Ñв та Saiku дүн шинжилгÑÑ Ñ…Ð¸Ð¹Ñ… мÑдÑÑллийн Ñанг дахин бий болгох Ñ…Ò¯ÑÑж байна уу?
Ð­Ð½Ñ Ò¯Ð¹Ð» Ñвц нь цаг хугацаа шаардÑан ажил байж болох юм.
Та хамгийн Ñүүлийн үеийн нь "YES" ÑˆÐ¸Ð½Ñ Ð´Ð°Ñ‚Ð°Ñетийн дÑÑÑ€ товшино уу мÑдÑÑллийг бий болно. +Fusion Ð¥Ò¯ÑнÑгт нь CollectEarthWindow.6 \= ЭкÑпортын +CollectEarthWindow.60 = Saiku мÑдÑÑ Ò¯ÐµÐ¸Ð¹Ð½ +CollectEarthWindow.61 = ЭкÑпортын XML өгөгдөл (Ñүүлийн ÑкÑпортын хойш өөрчлөгдÑөн бүртгÑл) +CollectEarthWindow.62 = тухай ... +CollectEarthWindow.63 = Ðлдаа KML авÑан оноо авах +CollectEarthWindow.64 = техникийн дÑмжлÑг үзүүлÑÑ… +CollectEarthWindow.7 = алдаа мÑдÑÑлÑл импортлох +CollectEarthWindow.8 = Disclaimer текÑÑ‚ олж чадахгүй байна +CollectEarthWindow.9 = оруулÑан мÑдÑÑллийг өөрийн мÑдÑÑллийн Ñанд нь байгаа бичлÑгийг агуулж байдаг. +DynamicsCode.0 = ЭхлÑÑд ой +DynamicsCode.1 = ЭхлÑÑд БÑлчÑÑрийн +DynamicsCode.2 = ЭхлÑÑд шийдвÑрлÑÑ… +DynamicsCode.3 = ЭхлÑÑд Otherland +DynamicsCode.4 = ЭхлÑÑд Ð£Ñ Ð½Ð°Ð¼Ð³Ð°Ñ€Ñ…Ð°Ð³ газрын +DynamicsCode.5 = ЭхлÑÑд Тариалангийн +OpenTextFileListener.0 = текÑÑ‚ файл олж байÑан юм\: +OptionWizard.0 = ДÑлхий Ñонголт цуглуулах +OptionWizard.1 = Хөтөч Ñонгоно уу +OptionWizard.10 = ÐÑÑлттÑй нөөц Ñ…Ð°Ð²Ñ‚Ð°Ñ +OptionWizard.11 = Тодорхойгүй\: ашиглах ifconfig +OptionWizard.12 = Ð¥ÑÑ€ÑглÑгч шатны +OptionWizard.13 = ДÑлхий Server IP цуглуулах +OptionWizard.14 = ДÑлхий Server портыг (жишÑÑ Ð½ÑŒ\: 8023) цуглуулах +OptionWizard.15 = Save & өөрчлөлт хийх +OptionWizard.16 = ID +OptionWizard.17 = X-coord +OptionWizard.18 = Y-coord +OptionWizard.19 = Elevation +OptionWizard.2 = урÑгал даÑгалын (Ñервер / үйлчлүүлÑгч) + OptionWizard.20 \= Google Earth агуулга нь өөрчлөгдÑөн байна.
Ðгуулга нь ачаалах хүлÑÑн авна уу та Google Earth-ÑÑÑ Ð°Ñуух үед. +OptionWizard.21 = шинÑчлÑÑ… амжилттай +OptionWizard.22 = Ð¥Ñвгий +OptionWizard.23 = дахин нÑÑÑ… Google Earth мÑдÑÑллийг үед алдаа гарлаа +OptionWizard.24 = Болих +OptionWizard.25 = үйл ажиллагааны горим +OptionWizard.26 = DB хоÑÑ‚ +OptionWizard.27 = Ð­Ð½Ñ Ð½ÑŒ хүлÑÑн зөвшөөрөгдÑөн Saiku Folder (ÑхлÑÑ… saiku.bat файл байхгүй бол) ороогүй байна +OptionWizard.28 = Saiku Server хүлÑÑн зөвшөөрөөгүй +OptionWizard.29 = DB порт +OptionWizard.3 = Server шатны +OptionWizard.30 = SQLite Ñонголт +OptionWizard.31 = ЖишÑÑ Ð¼ÑдÑÑлÑл +OptionWizard.32 = Plot зохион байгуулалт +OptionWizard.33 = Ñудалгаа тодорхойлолт +OptionWizard.34 = ÐарийвчилÑан +OptionWizard.35 = түүвÑÑ€ цÑгийн тоо +OptionWizard.36 = (метр) дÑÑж авах цÑгийн хоорондох зай +(Метр) ДÑÑж авах цÑгүүд OptionWizard.95 \= Side +OptionWizard.38 = CSV / CED файлыг зөв уншиж чадахгүй байгаа файлыг
иймÑрхүү таÑлалаар туÑгаарлаж утгыг байх төлөвтÑй байна\:.
<Б> +OptionWizard.39 = ID, YCoordinate, XCoordinate, өндрийн, налуу, тал +OptionWizard.4 = Одоогийн компьютерийн IP\: +OptionWizard.40 = төÑлүүд +OptionWizard.41 = ÑˆÐ¸Ð½Ñ Ñ‚Ó©Ñөл файлыг ачаалж +OptionWizard.42 = Ðлдаа CSV уншигч хаах +Судалгааны OptionWizard.43 \= нÑÑ€ +OptionWizard.44 = автоматаар нөөцлөх хүртÑл өгөгдлийн Ñан дÑÑÑ€ +OptionWizard.45 = ÐÑÑлттÑй Earth Engine талбай талбай руу томруулÑан +талбай мÑдÑÑлÑл / CSV файлыг ced нь OptionWizard.49 \= зам +Харин Google Earth-ийн браузер дÑÑÑ€ OptionWizard.48 \= ÐÑÑлттÑй Ñ…ÑлбÑÑ€ (ЛинукÑд зориулÑан байлгахыг зөвлөдөг) +OptionWizard.5 = цуглуулах ДÑлхий Server портыг\: +OptionWizard.50 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.51 = Ðлдаа импортлох төÑөл файл +Зөвхөн координат нь OptionWizard.52 \= CSV / CED файл +OptionWizard.53 = талбай +OptionWizard.54 = Төв цÑг нь +OptionWizard.55 = Ðлдаа импортлох төÑөл Ñ…Ð°Ð²Ñ‚Ð°Ñ +OptionWizard.56 = ачааллын төÑөл +OptionWizard.57 = Өмнө нь дуудагддаг төÑөл +OptionWizard.58 = ÐÑÑлттÑй Gee тоглоомын талбай (Trusted Tester хандах шаардлагатай) +OptionWizard.59 = ÐÑÑлттÑй Энд Maps газар дÑÑÑ€ анхаарлаа хандуулж +OptionWizard.6 = PostgreSQL DB параметрүүд +OptionWizard.65 = Saiku хавтÑанд зам +OptionWizard.66 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.67 = Firefox гүйцÑтгÑгдÑÑ… нь зам +OptionWizard.68 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.7 = Ð¥ÑÑ€ÑглÑгчийн нÑÑ€ +OptionWizard.70 = гүйцÑтгÑгдÑÑ… файлууд +OptionWizard.72 = Хоёртын файлууд +OptionWizard.73 = Chrome гүйцÑтгÑгдÑÑ… нь зам +OptionWizard.74 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.76 = гүйцÑтгÑгдÑÑ… файлууд +OptionWizard.78 = Хоёртын файлууд +OptionWizard.79 = KML Freemarker загварт зам +OptionWizard.8 = Ðууц үг +OptionWizard.80 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.82 = Freemarker загвар +OptionWizard.83 = HTML бөмбөлөг Ñ…ÑлбÑÑ€ дизайн зам +OptionWizard.84 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.86 = HTML вÑб Ñ…ÑƒÑƒÐ´Ð°Ñ +OptionWizard.87 = IDM тодорхойлолт нь XML нь зам +OptionWizard.88 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.9 = DB нÑÑ€ +OptionWizard.90 = XML IDM тодорхойлолт +OptionWizard.91 = Server (менежер хувилбар, ÑÑвÑл дангаараа ашиглах нь) +OptionWizard.92 = Ð¥ÑÑ€ÑглÑгч (оператор / Ñервер уруу холбогдÑон) +OptionWizard.93 = SQLite (Embedded / нÑг файл дÑÑÑ€ тулгуурлаÑан) OptionWizard.94 = PostgreSQL -SaikuAnalysisListener.0 = à»àº¡à»ˆàº™ - ຂà»à»‰â€‹àº¡àº¹àº™ Refresh Saiku (ຂະ​ບວນ​àºàº²àº™â€‹àºàº²àº§â€‹) -SaikuAnalysisListener.1 = ບà»à»ˆ - ພຽງ​à»àº•່​ເລີ່ມ​ຕົ້ນ Saiku -SaikuStarter.1 = ເລີ່ມ Saiku -SaikuStarter.2 = u0EC0ລີ່ມ Saiku ສາ​ມາດ​ໃຊ້​ເວ​ລາ​ນາ​ທີ \= àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº¥à»â€‹àº–້າ ​\! -SaveEarthDataServlet.0 = àºàº²àº™â€‹àº®à»‰àº­àº‡â€‹àº‚à»â€‹à»€àº›àº»à»ˆàº² -SaveEarthDataServlet.1 = ບັນ​ຫາ​ທີ່​ເàºàºµàº”​ຂຶ້ນ​ໃນ​ຂະ​ນະ​ທີ່​ປະ​ຢັດ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ດ້ -SaveEarthDataServlet.2 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໄດ້​ບັນ​ທືຠ-SlopeCode.0 = ລຽບ (0-5​)àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -EarthApp.11 = ໃນ​ທົ່ວ​ໂລàºâ€‹à»àº¡à»ˆàº™â€‹à»àº¥à»‰àº§â€‹à»àº¥à»ˆàº™ -EarthApp.21 = ໄຟ​ທີ່​ມີ​ຕາ​ຂ່າàºâ€‹à»„ຟ​ຟ້າ​ຂອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ເປັນ CSV / CED à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹àºžàº»àºšâ€‹à»€àº«àº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹à»€àºªàº±à»‰àº™â€‹àº—າງ​ທີ່​ເລືອàºâ€‹\:
-EarthApp.23 = ບà»à»ˆâ€‹à»„ຟລ​໌ CSV / CED ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

-EarthApp.24 = ໄຟ​ທີ່​ມີ​à»àº¡à»ˆâ€‹à»àºšàºš Freemarker ທີ່​ມີ​ຄà»àº²â€‹àº™àº´â€‹àºàº²àº¡ KML ບà»à»ˆâ€‹à»„ດ້​ພົບ​ເຫັນ​ຢູ່​ໃນ​ເສັ້ນ​ທາງ​ທີ່​ເລືອàºâ€‹\:
-EarthApp.26 = ບà»à»ˆâ€‹à»„ຟລ​໌​ຄà»àº²â€‹àº™àº´â€‹àºàº²àº¡ KML ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

-EarthApp.27 = ໄຟ​ທີ່​ມີ​ຮູບ​à»àºšàºšâ€‹àº›àº¹àº¡â€‹à»€àº›àº»à»‰àº² HTML ໄດ້​à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹àºžàº»àºšâ€‹à»€àº«àº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹à»€àºªàº±à»‰àº™â€‹àº—າງ​ທີ່​ເລືອàºâ€‹\:
-EarthApp.29 = ບà»à»ˆâ€‹à»„ຟລ​໌​ປູມ​ເປົ້າ HTML ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

-EarthApp.3 = ເຕືອນ​ຂ້ອàºâ€‹àº•à»à»ˆâ€‹àº¡àº² -EarthApp.30 = àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹à»àºà»‰â€‹à»„ຂ​ສະ​ຖານ​ທີ່​ໄຟລ​໌​ຢູ່​ໃນ​ເມ​ນູ Tools-> Properties​. -EarthApp.4 = àºàº²àº™â€‹àº›àº±àºšâ€‹àº›àº¸àº‡â€‹à»ƒàº™â€‹àº›àº±àº”​ຈຸ​ບັນ -EarthApp.5 = ຢ່າ​ເຕືອນ​ຂ້າ​ພະ​ເຈົ້າ​ອີàºâ€‹à»€àº—ື່ອ​ຫນຶ່ງ -EarthApp.57 = ມີ​ສະ​ບັບ​ໃຫມ່​ຂອງ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹àº—ີ່​ມີ à»àº¡à»ˆàº™â€‹\!
ທ່ານ​ບà»à»ˆâ€‹àº•້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹? ເຕືອນ -EarthApp.58 = ປັບ​ປຸງ -EarthApp.59 Error \= ໃນ​ເວ​ລາ​ທີ່​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ເອ​àºàº°â€‹àºªàº²àº™â€‹à»‚ຄງ​àºàº²àº™ -EarthApp.6 = \ - ສະ​ບັບ -EarthApp.61 = ເອ​àºàº°â€‹àºªàº²àº™â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹à»„ດ້​ເàºàº±àºšâ€‹àºà»àº²â€‹àºšà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ຈະ​ເປີດ​ເຜີàºâ€‹.
àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹à»€àº®àº±àº”​ໃຫ້​à»àº™à»ˆâ€‹à»ƒàºˆàº§à»ˆâ€‹àº²â€‹àº—ີ່​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»àº¡à»ˆàº™â€‹àºàº²àº™â€‹àº•ິດ​ຕັ້ງ​. -EarthSurveyService.9 = ພາàºâ€‹àºªàº°â€‹àº«àº™àº²àº¡â€‹àº—ີ່​ຕ້ອງ​àºàº²àº™à»€àº­àº»àº² -ExportActionListener.1 = ວັນ​ທີ່​ຈະ​ບັນ​ທຶàºâ€‹àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àºˆàº²àºàº‚à»à»‰â€‹àº¡àº¹àº™ -ExportDialogProcessMonitor.0 àºàº²àº™â€‹àº›àº¸àº‡â€‹à»àº•່ງ \= ... -ExportDialogProcessMonitor.1 = ລà»â€‹àº–້າ​ທີ່​ຈະ​ເລີ່ມ​ຕົ້ນ​ຂະ​ບວນ​àºàº²àº™â€‹\:àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àº -ExportDialogProcessMonitor.4 =​\: -ImportProcessMonitorDialog.0 = àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​\: -ImportActionListener.0 = ຄວນ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àº—ີ່​ດິນ​ທີ່​ບà»à»ˆâ€‹à»„ດ້​ຮັບ​àºàº²àº™â€‹à»€àº•ີມ​ລົງ​ໄປ​ໃນ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ໄດ້ -ImportActionListener.2 = ຖ້າ​ທ່ານ​ຄລິàºâ€‹à»ƒàºªà»ˆ ບà»à»ˆ ພຽງ​à»àº•່​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºˆàº²àºâ€‹àºžàº²àºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ຢູ່​ໃນ​ສະ​ພາບ "ສີ​ຂຽວ​"​, ທີ່​ບັນ​ຈຸ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ັງ​ຫມົດ​ໄດ້​, ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​. -ImportActionListener.3 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ບັນ​ທຶàºâ€‹àº—າງ​àºàº²àº™â€‹àºªà»àº²â€‹à»€àº¥àº±àº”​ຮູບ -ImportDialogProcessMonitor.0 = \ ຄິດ​ໄລ່ -ImportDialogProcessMonitor.11 = ຈà»àº²â€‹àº™àº§àº™â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ​ຂອງ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹\: -ImportDialogProcessMonitor.2 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ບັນ​ທຶàºâ€‹àºàº²àº™ ... -ImportDialogProcessMonitor.5 = ຈ​à»â€‹àº²â€‹àº™àº§àº™â€‹àº•ົວ​ຈິງ​ຂອງ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​\:ຂà»à»‰â€‹àº¡àº¹àº™ -ImportDialogProcessMonitor.8 àºàº²àº™â€‹àº›àº¸àº‡â€‹à»àº•່ງ \= ... -InfiniteProgressMonitor.0 = àºàº»àºâ€‹à»€àº¥àºµàºâ€‹àºàº²àº™â€‹àº”à»àº²â€‹à»€àº™àºµàº™â€‹àº‡àº²àº™àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -JFileChooserExistsAware.0 = file ໂລàºâ€‹à»‚ຄງ​àºàº²àº™ -KmlImportService.13 = ເລືອàºâ€‹à»„ຟລ​໌ CSV ເພື່ອ​ຊ່ວàºâ€‹àº›àº°â€‹àº¢àº±àº”​ສະ​ຖານ​ຕອນ​ດິນ​ຂອງ​ຕົນ​ເພື່ອ -MissingPlotsListener.0 Error \= ໃນ​ຂະ​ນະ​ທີ່​àºàº²àº™â€‹à»„ດ້​ຮັບ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àº—ີ່​ດິນ​ບà»à»ˆâ€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ດ້ -MissingPlotsListener.1 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ໄປ -MissingPlotsListener.10 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ໃນ​àºàº²àº™â€‹àº­àº­àºâ€‹à»àºšàºšâ€‹àºªàº¸à»ˆàº¡â€‹àº•ົວ​ຢ່າງ​\: -MissingPlotsListener.12 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ຫາàºâ€‹à»„ປ​\: -MissingPlotsListener.14 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທັງ​ຫມົດ​à»àº¡à»ˆàº™â€‹à»„ດ້​ເຕີມ​ລົງ​ໄປ ​\!ເນື້ອ​ໃນ -MissingPlotsListener.2 = ຄັດ​ລອàºâ€‹à»„ປ​ທີ່ clipboardເອົາ -MissingPlotsListener.3 = ໄຟລ​໌​ທີ່​ບັນ​ຈຸ​ມີ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ສານ​ຕອນ​ດິນ​ຂອງ​ຕົນ (.csv ຫຼື​ໄຟລ​໌ .ced​) ສà»àº²â€‹àº¥àº±àºšâ€‹àº—ີ່​ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ຮູ້​ວ່າ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ັງ​ຫມົດ​ໄດ້​ຮັບ​àºàº²àº™â€‹à»€àº•ີມ​ລົງ​ໄປ​. -MissingPlotsListener.4 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຫາàºâ€‹à»„ປ - ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ສານ -MissingPlotsListener.5 = ຈາàºâ€‹à»„ຟ​\: -MissingPlotsListener.6 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ​ໄຟລ​໌ CED -ProcessMonitorDialog.1 = ຂà»à»‰â€‹àºœàº´àº”​ພາດ Parsing àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àºˆà»àº²â€‹àº™àº§àº™â€‹àºàº²àº™â€‹àº•ິດ​ຕà»à»ˆâ€‹àºàº±àº™ -ProcessMonitorDialog.4 = ຖັນ​, -ProcessMonitorDialog.5 = \ - ຄຸນ​ຄ່າ \ No newline at end of file +SaikuAnalysisListener.0 = Тийм - СÑргÑÑÑ… Saiku мÑдÑÑлÑл (урт үйл Ñвц) +SaikuAnalysisListener.1 = Үгүй - ЗүгÑÑÑ€ л Saiku ÑхлÑÑ… +SaikuStarter.1 Saiku ÑхлÑн \= +SaikuStarter.2 Saiku ÑхлÑн зарим нÑг минут үргÑлжилж болох \= түр хүлÑÑÐ½Ñ Ò¯Ò¯ \! +SaveEarthDataServlet.0 = ХооÑон Ñ…Ò¯ÑÑлт +SaveEarthDataServlet.1 = ÐÑуудлын мÑдÑÑллийн Ñанд мÑдÑÑлÑл Ñ…ÑмнÑÑ… гарлаа +SaveEarthDataServlet.2 = өгөгдөл хадгалÑан байна +SlopeCode.0 = Хавтгай (0-5) +EarthApp.11 = дÑлхий аль Ñ…Ñдийн ажиллаж байгаа цуглуулах +EarthApp.21 хашааны ÑүлжÑÑ Ð°Ð³ÑƒÑƒÐ»Ñан файлыг \= а CSV / CED ÑонгоÑон зам олж чадаагүй байна гÑж\:
<би> +EarthApp.23 = Ямар ч CSV / CED файл тохируулга байна\:

+EarthApp.24 = KML тодорхойлолт нь Freemarker загварыг агуулÑан файлыг ÑонгоÑон замаар олж ороогүй байна\:
<би> +EarthApp.26 = Ямар ч KML тодорхойлолт файл тохируулга байна\:

+EarthApp.27 = HTML бөмбөлөг Ñ…ÑлбÑрийг агуулÑан файлыг ÑонгоÑон замаар олж ороогүй байна\:
<би> +EarthApp.29 = Ямар ч HTML бөмбөлөг файл тохируулга байна\:

+EarthApp.3 = дараа нь надад Ñануул +EarthApp.30 = Ð¥ÑÑ€ÑгÑÑл цÑÑÑн дотрооÑ> Properties цÑÑ Ñ„Ð°Ð¹Ð»Ñ‹Ð½ байршлыг зөв оруулна уу. +EarthApp.4 = шинÑчлÑÑ… Одоо +EarthApp.5 = намайг дахин Ñануулах байхгүй юу +EarthApp.57 = <б> цуглуулж ДÑлхий боломжтой -ийн ÑˆÐ¸Ð½Ñ Ñ…ÑƒÐ²Ð¸Ð»Ð±Ð°Ñ€ байна\! Ð¥ÑÑ€Ñв та Ñ…ÑрхÑн цааш Ñ…Ò¯ÑÑж байна вÑ?
+EarthApp.58 = шинÑчлÑÑ… бөгөөд дохио авах байрлуулах +EarthApp.59 = Ðлдаа төÑөл файлыг импортлох +EarthApp.6 = \ - Хувилбар +EarthApp.61 = цуглуулж ДÑлхий файл, нÑÑлттÑй байж чадÑангүй.
Google Earth ÑуулгаÑан ÑÑÑхийг шалгана уу. +EarthSurveyService.9 = талбар шаардлагатай +ExportActionListener.1 = ÑхлÑн ÑкÑпортын Records-руу огноо Ñонгох +ExportDialogProcessMonitor.0 = боловÑруулах мÑдÑÑ ... +ExportDialogProcessMonitor.1 = үйл Ñвцыг Ñхлүүлж хүлÑÑж байна\: +ExportDialogProcessMonitor.4 = ÑкÑпортлох бүртгÑл\: +ImportProcessMonitorDialog.0 = Импортын бүртгÑл\: +ImportActionListener.0 = бүрÑн дүүрÑн чадаагүй байна талбайд өгөгдлийн импортын Ñ‘Ñтой юу? +ImportActionListener.2 = Та дарна бол <и> <б> NO бүх өгөгдлийг агуулÑан "ногоон" төлөвт талбайд, зөвхөн өгөгдөл оруулÑан болно. +ImportActionListener.3 = Импорт Ð±ÑƒÑ Ð±Ð¾Ð»Ð¾Ð²ÑруулÑан бүртгÑл +ImportDialogProcessMonitor.0 = ТООЦОЖ бичлÑгүүдийн ImportDialogProcessMonitor.11 \= Эхний дугаар\: +ImportDialogProcessMonitor.2 = бүртгÑл импортлож байна ... +Импортын бүртгÑл ImportDialogProcessMonitor.5 \= бодит тоо\: +ImportDialogProcessMonitor.8 = боловÑруулах мÑдÑÑ ... +InfiniteProgressMonitor.0 = ажиллагааг Cancel +JFileChooserExistsAware.0 = ДÑлхий төÑөл файлыг цуглуулах +KmlImportService.13 = тулд талбай байршлыг хадгалахын тулд CSV файлыг Ñонгоно уу +Database дÑÑÑ€ нь байхгүй хашааны-ий тухай мÑдÑÑлÑл авах бол MissingPlotsListener.0 \= алдаа +MissingPlotsListener.1 = хайж байна газрууд +MissingPlotsListener.10 = дÑÑж дизайн талбайд нийт тоо\: +MissingPlotsListener.12 = алга хашааны тоо\: +MissingPlotsListener.14 = мÑдÑÑлÑл талбай дүүрÑн байдаг \! +MissingPlotsListener.2 = Хуулах Бал нь агуулга +MissingPlotsListener.3 = Та бүх мÑдÑÑлÑл ирÑÑн дүүрÑн байÑан ÑÑÑхийг мÑдÑхийг Ñ…Ò¯ÑÑж байгаа нь хуйвалдаан мÑдÑÑлÑл (.csv ÑÑвÑл .ced файлууд) агуулÑан файлуудыг Ñонгоорой. +MissingPlotsListener.4 = хайж байна талбай - мÑдÑÑлÑл +MissingPlotsListener.5 Ñ„Ð°Ð¹Ð»Ð°Ð°Ñ \=\: +CED файлд MissingPlotsListener.6 \= ЭкÑпортын +мөр нь Ñ…Ñд Ñ…ÑдÑн ProcessMonitorDialog.1 \= магадлах алдаа +ProcessMonitorDialog.4 = багана +ProcessMonitorDialog.5 = \ - утгууд \ No newline at end of file From b952720754286dacf3056ec5fa1a4f87af3203f4 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:35:02 +0100 Subject: [PATCH 0766/1620] New translations Messages_pt.properties (French) --- .../earth/app/view/Messages_fr.properties | 473 ++++++++++-------- 1 file changed, 255 insertions(+), 218 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 7531b1f880..c2ce51b7bd 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,218 +1,255 @@ -AboutDialog.19 = гарÑан нь аÑуудлыг -AboutDialog.5 = ДÑлгÑÑ€Ñнгүй мÑдÑÑллийг манай вÑб OpenForis.org очиж -AboutDialog.6 = Уучлаарай, аÑуудал нь таны ÑиÑтемийн Ñтандарт браузер ÑÐ½Ñ Ñ…Ð¾Ð»Ð±Ð¾Ð¾Ñыг нÑÑÑ… гÑж оролдож гарлаа. -AboutDialog.8 = Ок -AspectCode.0 = Хойд -AspectCode.1 = Зүүн Хойд -AspectCode.2 = Зүүн -AspectCode.3 = Зүүн-Өмнөд -AspectCode.4 = Өмнөд -AspectCode.5 = Баруун-Өмнөд -AspectCode.6 = Баруун -AspectCode.7 = Баруун Хойд -CollectEarthWindow.0 = CSV файл уруу өгөгдөл ÑкÑпортлох оролдож алдаа -CollectEarthWindow.1 = ЭкÑпортын алдаа -CollectEarthWindow.10 = Файлын -CollectEarthWindow.11 = Exit -CollectEarthWindow.12 Ñ…ÑÑ€ÑгÑÑл \= -CollectEarthWindow.13 = ЭкÑпортын CSV өгөгдөл -CollectEarthWindow.14 = Start SAIKU дүн шинжилгÑÑ -CollectEarthWindow.15 = Үл хөдлөх хөрөнгө -CollectEarthWindow.16 = туÑламж -CollectEarthWindow.17 = Disclaimer -CollectEarthWindow.18 = мÑдÑÑллийн Ñанд Ñураггүй алга газраа хай -CollectEarthWindow.19 = дÑлхийг цуглуулах -CollectEarthWindow.2 = Ñ…Ñл -CollectEarthWindow.20 = давхардÑан тоогоор бүртгÑлийн тоо\: -CollectEarthWindow.21 = гол хүрÑÑ Ð´Ò¯Ñ€Ñийг олж чадахгүй байна -CollectEarthWindow.22 = Ð¥ÑÑ€Ñв та цуглуулж дÑлхийг хаах Ñ…Ò¯ÑÑж байгаа гÑдÑгт итгÑлтÑй байна уу? Цонхыг хаах нь цуглуулж ДÑлхий Ñервер хаах болно
-CollectEarthWindow.23 = батлах Ñ…ÑÑ€ÑгтÑй -CollectEarthWindow.24 = XML ЭкÑпортын -CollectEarthWindow.25 = Та Ñмар ч байÑан ÑдгÑÑÑ€ бүртгÑлийг нÑмÑÑ…, таны одоогийн мÑдÑÑллийг алдах Ñ…Ò¯ÑÑж байна уу? -CollectEarthWindow.26 = Оператор -CollectEarthWindow.27 = шинÑчлÑÑ… -CollectEarthWindow.28 = <б> ÐÑÑлттÑй Foris оператор мÑдÑÑллийг хөрвүүлÑн ойлгох бол ДÑлхий Ñервер ажиллаж байх Ñ‘Ñтой цуглуулна. -CollectEarthWindow.29 = Saiku Ñерверийг тохируулаагүй байна. -CollectEarthWindow.3 = \ Импорт алдаа -CollectEarthWindow.30 = Та Google Earth ашиглаж байгаа бол ÑÐ½Ñ Ñ†Ð¾Ð½Ñ… нÑÑлттÑй байлгах уу. -CollectEarthWindow.31 = ЭкÑпортын CSV файлд мÑдÑÑллийг цуглуулÑан -CollectEarthWindow.32 = Quit -CollectEarthWindow.33 = операторын нÑÑ€ 5 Ñ‚ÑмдÑгтүүд болон 50 богино бодвол илүү урт байх Ñ‘Ñтой -CollectEarthWindow.34 = Баталгаажуулалт алдаа -CollectEarthWindow.35 = OPERATOR нÑÑ€ хооÑон \! Зар операторын нÑÑ€ бөглөх болон "шинÑчлÑÑ…" товчийг дарна уу. -CollectEarthWindow.36 = Оператор нÑÑ€ хооÑон байж болохгүй -CollectEarthWindow.37 = нÑÑлттÑй байлга -CollectEarthWindow.38 = CSV файлууд -CollectEarthWindow.39 = Ðнхааруулга\: Ð­Ð½Ñ Ð½ÑŒ зүйтÑй та нөөцлөх-ап таны одоогийн өгөгдөл (XML нь ЭкÑпортын) ÑˆÐ¸Ð½Ñ Ð¼ÑдÑÑллийг импортлогч өмнө -CollectEarthWindow.4 = ÐҮБ-ын ХХÐÐБ Disclaimer зар -CollectEarthWindow.40 Тодорхой хүртÑл \= Saiku Server Ð¥ÑÑ€ÑгÑÑл цÑÑÑн дотрооÑ> баÑлагт> ÐарийвчилÑан таб-д ÑуулгаÑан байна Ñ…Ð°Ð²Ñ‚Ð°Ñ Ð·Ð°Ð¼Ñ‹Ð³. -CollectEarthWindow.41 = Хадгаламж файл уруу өгөгдөл ÑкÑпортолÑон\: -CollectEarthWindow.42 = Quit -CollectEarthWindow.43 = ЗөрчилтÑй бүртгÑл олдлоо -CollectEarthWindow.44 = МÑдÑÑллийн Импорт / ЭкÑпортын -XML гÑж CollectEarthWindow.45 \= ЭкÑпортын мÑдÑÑ (шахÑан) -Zip-Ð°Ð°Ñ CollectEarthWindow.46 \= Импортын ÑˆÐ¸Ð½Ñ Ð¼ÑдÑÑ (шахÑан XML) -CSV ашиглан CollectEarthWindow.55 \= шинÑчлÑÑ… одоогийн бүртгÑл -CollectEarthWindow.47 = Saiku Ñерверийг тохируулаагүй бол -CollectEarthWindow.48 = Zip / цуглуулах-өгөгдлийн файлууд -CollectEarthWindow.49 = Fusion CSV файлууд -CollectEarthWindow.5 = Хаах -CollectEarthWindow.50 = ÐÑÑлттÑй Ñ…ÑÑ€ÑглÑгчийн гарын авлага -Цуглуулж дÑлхийн шинÑчлÑлтүүдийн хувьд CollectEarthWindow.51 \= шалгах -CollectEarthWindow.52 = ÐÑÑлттÑй Application нÑвтрÑÑ… Файлын -CollectEarthWindow.53 = цуглуулах ДÑлхий нÑвтрÑÑ… файл -KML нь CollectEarthWindow.54 \= ачааллын оноо -CollectEarthWindow.56 = тухай ... -CollectEarthWindow.57 = Saiku гарааны үйл Ñвц одоо ч ажиллаж байгаа, түр хүлÑÑÐ½Ñ Ò¯Ò¯. -CollectEarthWindow.58 = Saiku шинжилгÑÑг Ñхлүүлж чадахгүй -CollectEarthWindow.59 = Ð¥ÑÑ€Ñв та Saiku дүн шинжилгÑÑ Ñ…Ð¸Ð¹Ñ… мÑдÑÑллийн Ñанг дахин бий болгох Ñ…Ò¯ÑÑж байна уу?
Ð­Ð½Ñ Ò¯Ð¹Ð» Ñвц нь цаг хугацаа шаардÑан ажил байж болох юм.
Та хамгийн Ñүүлийн үеийн нь "YES" ÑˆÐ¸Ð½Ñ Ð´Ð°Ñ‚Ð°Ñетийн дÑÑÑ€ товшино уу мÑдÑÑллийг бий болно. -Fusion Ð¥Ò¯ÑнÑгт нь CollectEarthWindow.6 \= ЭкÑпортын -CollectEarthWindow.60 = Saiku мÑдÑÑ Ò¯ÐµÐ¸Ð¹Ð½ -CollectEarthWindow.61 = ЭкÑпортын XML өгөгдөл (Ñүүлийн ÑкÑпортын хойш өөрчлөгдÑөн бүртгÑл) -CollectEarthWindow.62 = тухай ... -CollectEarthWindow.63 = Ðлдаа KML авÑан оноо авах -CollectEarthWindow.64 = техникийн дÑмжлÑг үзүүлÑÑ… -CollectEarthWindow.7 = алдаа мÑдÑÑлÑл импортлох -CollectEarthWindow.8 = Disclaimer текÑÑ‚ олж чадахгүй байна -CollectEarthWindow.9 = оруулÑан мÑдÑÑллийг өөрийн мÑдÑÑллийн Ñанд нь байгаа бичлÑгийг агуулж байдаг. -DynamicsCode.0 = ЭхлÑÑд ой -DynamicsCode.1 = ЭхлÑÑд БÑлчÑÑрийн -DynamicsCode.2 = ЭхлÑÑд шийдвÑрлÑÑ… -DynamicsCode.3 = ЭхлÑÑд Otherland -DynamicsCode.4 = ЭхлÑÑд Ð£Ñ Ð½Ð°Ð¼Ð³Ð°Ñ€Ñ…Ð°Ð³ газрын -DynamicsCode.5 = ЭхлÑÑд Тариалангийн -OpenTextFileListener.0 = текÑÑ‚ файл олж байÑан юм\: -OptionWizard.0 = ДÑлхий Ñонголт цуглуулах -OptionWizard.1 = Хөтөч Ñонгоно уу -OptionWizard.10 = ÐÑÑлттÑй нөөц Ñ…Ð°Ð²Ñ‚Ð°Ñ -OptionWizard.11 = Тодорхойгүй\: ашиглах ifconfig -OptionWizard.12 = Ð¥ÑÑ€ÑглÑгч шатны -OptionWizard.13 = ДÑлхий Server IP цуглуулах -OptionWizard.14 = ДÑлхий Server портыг (жишÑÑ Ð½ÑŒ\: 8023) цуглуулах -OptionWizard.15 = Save & өөрчлөлт хийх -OptionWizard.16 = ID -OptionWizard.17 = X-coord -OptionWizard.18 = Y-coord -OptionWizard.19 = Elevation -OptionWizard.2 = урÑгал даÑгалын (Ñервер / үйлчлүүлÑгч) - OptionWizard.20 \= Google Earth агуулга нь өөрчлөгдÑөн байна.
Ðгуулга нь ачаалах хүлÑÑн авна уу та Google Earth-ÑÑÑ Ð°Ñуух үед. -OptionWizard.21 = шинÑчлÑÑ… амжилттай -OptionWizard.22 = Ð¥Ñвгий -OptionWizard.23 = дахин нÑÑÑ… Google Earth мÑдÑÑллийг үед алдаа гарлаа -OptionWizard.24 = Болих -OptionWizard.25 = үйл ажиллагааны горим -OptionWizard.26 = DB хоÑÑ‚ -OptionWizard.27 = Ð­Ð½Ñ Ð½ÑŒ хүлÑÑн зөвшөөрөгдÑөн Saiku Folder (ÑхлÑÑ… saiku.bat файл байхгүй бол) ороогүй байна -OptionWizard.28 = Saiku Server хүлÑÑн зөвшөөрөөгүй -OptionWizard.29 = DB порт -OptionWizard.3 = Server шатны -OptionWizard.30 = SQLite Ñонголт -OptionWizard.31 = ЖишÑÑ Ð¼ÑдÑÑлÑл -OptionWizard.32 = Plot зохион байгуулалт -OptionWizard.33 = Ñудалгаа тодорхойлолт -OptionWizard.34 = ÐарийвчилÑан -OptionWizard.35 = түүвÑÑ€ цÑгийн тоо -OptionWizard.36 = (метр) дÑÑж авах цÑгийн хоорондох зай -(Метр) ДÑÑж авах цÑгүүд OptionWizard.95 \= Side -OptionWizard.38 = CSV / CED файлыг зөв уншиж чадахгүй байгаа файлыг
иймÑрхүү таÑлалаар туÑгаарлаж утгыг байх төлөвтÑй байна\:.
<Б> -OptionWizard.39 = ID, YCoordinate, XCoordinate, өндрийн, налуу, тал -OptionWizard.4 = Одоогийн компьютерийн IP\: -OptionWizard.40 = төÑлүүд -OptionWizard.41 = ÑˆÐ¸Ð½Ñ Ñ‚Ó©Ñөл файлыг ачаалж -OptionWizard.42 = Ðлдаа CSV уншигч хаах -Судалгааны OptionWizard.43 \= нÑÑ€ -OptionWizard.44 = автоматаар нөөцлөх хүртÑл өгөгдлийн Ñан дÑÑÑ€ -OptionWizard.45 = ÐÑÑлттÑй Earth Engine талбай талбай руу томруулÑан -талбай мÑдÑÑлÑл / CSV файлыг ced нь OptionWizard.49 \= зам -Харин Google Earth-ийн браузер дÑÑÑ€ OptionWizard.48 \= ÐÑÑлттÑй Ñ…ÑлбÑÑ€ (ЛинукÑд зориулÑан байлгахыг зөвлөдөг) -OptionWizard.5 = цуглуулах ДÑлхий Server портыг\: -OptionWizard.50 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... -OptionWizard.51 = Ðлдаа импортлох төÑөл файл -Зөвхөн координат нь OptionWizard.52 \= CSV / CED файл -OptionWizard.53 = талбай -OptionWizard.54 = Төв цÑг нь -OptionWizard.55 = Ðлдаа импортлох төÑөл Ñ…Ð°Ð²Ñ‚Ð°Ñ -OptionWizard.56 = ачааллын төÑөл -OptionWizard.57 = Өмнө нь дуудагддаг төÑөл -OptionWizard.58 = ÐÑÑлттÑй Gee тоглоомын талбай (Trusted Tester хандах шаардлагатай) -OptionWizard.59 = ÐÑÑлттÑй Энд Maps газар дÑÑÑ€ анхаарлаа хандуулж -OptionWizard.6 = PostgreSQL DB параметрүүд -OptionWizard.65 = Saiku хавтÑанд зам -OptionWizard.66 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... -OptionWizard.67 = Firefox гүйцÑтгÑгдÑÑ… нь зам -OptionWizard.68 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... -OptionWizard.7 = Ð¥ÑÑ€ÑглÑгчийн нÑÑ€ -OptionWizard.70 = гүйцÑтгÑгдÑÑ… файлууд -OptionWizard.72 = Хоёртын файлууд -OptionWizard.73 = Chrome гүйцÑтгÑгдÑÑ… нь зам -OptionWizard.74 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... -OptionWizard.76 = гүйцÑтгÑгдÑÑ… файлууд -OptionWizard.78 = Хоёртын файлууд -OptionWizard.79 = KML Freemarker загварт зам -OptionWizard.8 = Ðууц үг -OptionWizard.80 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... -OptionWizard.82 = Freemarker загвар -OptionWizard.83 = HTML бөмбөлөг Ñ…ÑлбÑÑ€ дизайн зам -OptionWizard.84 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... -OptionWizard.86 = HTML вÑб Ñ…ÑƒÑƒÐ´Ð°Ñ -OptionWizard.87 = IDM тодорхойлолт нь XML нь зам -OptionWizard.88 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... -OptionWizard.9 = DB нÑÑ€ -OptionWizard.90 = XML IDM тодорхойлолт -OptionWizard.91 = Server (менежер хувилбар, ÑÑвÑл дангаараа ашиглах нь) -OptionWizard.92 = Ð¥ÑÑ€ÑглÑгч (оператор / Ñервер уруу холбогдÑон) -OptionWizard.93 = SQLite (Embedded / нÑг файл дÑÑÑ€ тулгуурлаÑан) -OptionWizard.94 = PostgreSQL -SaikuAnalysisListener.0 = Тийм - СÑргÑÑÑ… Saiku мÑдÑÑлÑл (урт үйл Ñвц) -SaikuAnalysisListener.1 = Үгүй - ЗүгÑÑÑ€ л Saiku ÑхлÑÑ… -SaikuStarter.1 Saiku ÑхлÑн \= -SaikuStarter.2 Saiku ÑхлÑн зарим нÑг минут үргÑлжилж болох \= түр хүлÑÑÐ½Ñ Ò¯Ò¯ \! -SaveEarthDataServlet.0 = ХооÑон Ñ…Ò¯ÑÑлт -SaveEarthDataServlet.1 = ÐÑуудлын мÑдÑÑллийн Ñанд мÑдÑÑлÑл Ñ…ÑмнÑÑ… гарлаа -SaveEarthDataServlet.2 = өгөгдөл хадгалÑан байна -SlopeCode.0 = Хавтгай (0-5) -EarthApp.11 = дÑлхий аль Ñ…Ñдийн ажиллаж байгаа цуглуулах -EarthApp.21 хашааны ÑүлжÑÑ Ð°Ð³ÑƒÑƒÐ»Ñан файлыг \= а CSV / CED ÑонгоÑон зам олж чадаагүй байна гÑж\:
<би> -EarthApp.23 = Ямар ч CSV / CED файл тохируулга байна\:

-EarthApp.24 = KML тодорхойлолт нь Freemarker загварыг агуулÑан файлыг ÑонгоÑон замаар олж ороогүй байна\:
<би> -EarthApp.26 = Ямар ч KML тодорхойлолт файл тохируулга байна\:

-EarthApp.27 = HTML бөмбөлөг Ñ…ÑлбÑрийг агуулÑан файлыг ÑонгоÑон замаар олж ороогүй байна\:
<би> -EarthApp.29 = Ямар ч HTML бөмбөлөг файл тохируулга байна\:

-EarthApp.3 = дараа нь надад Ñануул -EarthApp.30 = Ð¥ÑÑ€ÑгÑÑл цÑÑÑн дотрооÑ> Properties цÑÑ Ñ„Ð°Ð¹Ð»Ñ‹Ð½ байршлыг зөв оруулна уу. -EarthApp.4 = шинÑчлÑÑ… Одоо -EarthApp.5 = намайг дахин Ñануулах байхгүй юу -EarthApp.57 = <б> цуглуулж ДÑлхий боломжтой -ийн ÑˆÐ¸Ð½Ñ Ñ…ÑƒÐ²Ð¸Ð»Ð±Ð°Ñ€ байна\! Ð¥ÑÑ€Ñв та Ñ…ÑрхÑн цааш Ñ…Ò¯ÑÑж байна вÑ?
-EarthApp.58 = шинÑчлÑÑ… бөгөөд дохио авах байрлуулах -EarthApp.59 = Ðлдаа төÑөл файлыг импортлох -EarthApp.6 = \ - Хувилбар -EarthApp.61 = цуглуулж ДÑлхий файл, нÑÑлттÑй байж чадÑангүй.
Google Earth ÑуулгаÑан ÑÑÑхийг шалгана уу. -EarthSurveyService.9 = талбар шаардлагатай -ExportActionListener.1 = ÑхлÑн ÑкÑпортын Records-руу огноо Ñонгох -ExportDialogProcessMonitor.0 = боловÑруулах мÑдÑÑ ... -ExportDialogProcessMonitor.1 = үйл Ñвцыг Ñхлүүлж хүлÑÑж байна\: -ExportDialogProcessMonitor.4 = ÑкÑпортлох бүртгÑл\: -ImportProcessMonitorDialog.0 = Импортын бүртгÑл\: -ImportActionListener.0 = бүрÑн дүүрÑн чадаагүй байна талбайд өгөгдлийн импортын Ñ‘Ñтой юу? -ImportActionListener.2 = Та дарна бол <и> <б> NO бүх өгөгдлийг агуулÑан "ногоон" төлөвт талбайд, зөвхөн өгөгдөл оруулÑан болно. -ImportActionListener.3 = Импорт Ð±ÑƒÑ Ð±Ð¾Ð»Ð¾Ð²ÑруулÑан бүртгÑл -ImportDialogProcessMonitor.0 = ТООЦОЖ бичлÑгүүдийн ImportDialogProcessMonitor.11 \= Эхний дугаар\: -ImportDialogProcessMonitor.2 = бүртгÑл импортлож байна ... -Импортын бүртгÑл ImportDialogProcessMonitor.5 \= бодит тоо\: -ImportDialogProcessMonitor.8 = боловÑруулах мÑдÑÑ ... -InfiniteProgressMonitor.0 = ажиллагааг Cancel -JFileChooserExistsAware.0 = ДÑлхий төÑөл файлыг цуглуулах -KmlImportService.13 = тулд талбай байршлыг хадгалахын тулд CSV файлыг Ñонгоно уу -Database дÑÑÑ€ нь байхгүй хашааны-ий тухай мÑдÑÑлÑл авах бол MissingPlotsListener.0 \= алдаа -MissingPlotsListener.1 = хайж байна газрууд -MissingPlotsListener.10 = дÑÑж дизайн талбайд нийт тоо\: -MissingPlotsListener.12 = алга хашааны тоо\: -MissingPlotsListener.14 = мÑдÑÑлÑл талбай дүүрÑн байдаг \! -MissingPlotsListener.2 = Хуулах Бал нь агуулга -MissingPlotsListener.3 = Та бүх мÑдÑÑлÑл ирÑÑн дүүрÑн байÑан ÑÑÑхийг мÑдÑхийг Ñ…Ò¯ÑÑж байгаа нь хуйвалдаан мÑдÑÑлÑл (.csv ÑÑвÑл .ced файлууд) агуулÑан файлуудыг Ñонгоорой. -MissingPlotsListener.4 = хайж байна талбай - мÑдÑÑлÑл -MissingPlotsListener.5 Ñ„Ð°Ð¹Ð»Ð°Ð°Ñ \=\: -CED файлд MissingPlotsListener.6 \= ЭкÑпортын -мөр нь Ñ…Ñд Ñ…ÑдÑн ProcessMonitorDialog.1 \= магадлах алдаа -ProcessMonitorDialog.4 = багана -ProcessMonitorDialog.5 = \ - утгууд \ No newline at end of file +AboutDialog.19=Ocorreu um problema +AboutDialog.5=Para mais informações visite nosso site OpenForis.org +AboutDialog.6=Desculpe, um problema ocorreu ao tentar abrir esse link no seu navegador padrão. +AboutDialog.8=Ok +AspectCode.0=Norte +AspectCode.1=Nordeste +AspectCode.2=Leste +AspectCode.3=Sudeste +AspectCode.4=Sul +AspectCode.5=Sudoeste +AspectCode.6=Oeste +AspectCode.7=Noroeste +CollectEarthMenu.0=Importar Arquivo CEP +CollectEarthMenu.2=Utilidades +CollectEarthMenu.3=Separar arquivo CSV em partes +CollectEarthMenu.4=Exportar dados para XML (da data específica até o tempo presente) +CollectEarthMenu.5=Exportar para Collect Backup +CollectEarthMenu.6=Exportar dados como Collect Backup (todos os dados) +CollectEarthMenu.7=Exportar dados como Collect Backup (a partir de uma data) +CollectEarthMenu.8=Exportar dados para XML (filtrar por atributo) +CollectEarthWindow.0=Erro ao tentar exportar os dados para um arquivo CSV +CollectEarthWindow.10=Arquivo +CollectEarthWindow.11=Fechar +CollectEarthWindow.12=Ferramentas +CollectEarthWindow.13=Baixar dados para CSV (Excel) +CollectEarthWindow.14=Iniciar Análise SAIKU +CollectEarthWindow.15=Propiedades +CollectEarthWindow.16=Ajuda +CollectEarthWindow.17=Declaração +CollectEarthWindow.18=Encontrar parcelas ausentes em banco de dados +CollectEarthWindow.19=Collect Earth +CollectEarthWindow.1=Erro ao exportar +CollectEarthWindow.20=Número de registros duplicados\: +CollectEarthWindow.21=Não foi possível encontrar o ícone para a janela principal +CollectEarthWindow.22=Tem certeza de querer fechar Collect Earth?
Ao fechar a janela será fechada também o servidor de Collect Earth +CollectEarthWindow.23=Confirmação requerida +CollectEarthWindow.24=Exportar a XML +CollectEarthWindow.25=Quer importar estes registros de qualquer maneira e perder o seus dados atuais? +CollectEarthWindow.26=Operador +CollectEarthWindow.27=Atualizar +CollectEarthWindow.28=O servidor Open Foris Collect Earth deve estar em execução enquanto o operador interprete os dados. +CollectEarthWindow.29=O servidor Saiku não está configurado. +CollectEarthWindow.2=Idioma +CollectEarthWindow.30=Por favor mantenha esta janela aberta enquanto estiver usando o Google Earth. +CollectEarthWindow.31=Exportar os dados coletados para um arquivo CSV +CollectEarthWindow.32=Fechar +CollectEarthWindow.33=O nome do operador deve ser maior de que 5 caracteres e mais curto do que 50 +CollectEarthWindow.34= Erro de Validação +CollectEarthWindow.35=NOME DO OPERADOR VAZIO\!
Preencha o nome do operador e clique no botão "Atualizar". +CollectEarthWindow.36=Nome do operador não pode estar vazio +CollectEarthWindow.37=Permanecer Aberto +CollectEarthWindow.38=Arquivos de CSV +CollectEarthWindow.39=AVISO\:Se recomenda de fazer um back-up dos seus dados atuais(Exportar para XML) antes de importar os novos dados +CollectEarthWindow.3=\ Erro ao importar dados. +CollectEarthWindow.40=Configurar caminho para o arquivo onde o Servidor Saiku se encontra instalado em Ferramentas->Propiedades->Avançado. +CollectEarthWindow.41=Guardar dados exportados para o arquivo\: +CollectEarthWindow.42=Sair +CollectEarthWindow.43=Registros repetidos detectados +CollectEarthWindow.44=Importar/Exportar +CollectEarthWindow.45=Exportar dados para XML (comprimidos) +CollectEarthWindow.46=Importar novos dados do ZIP (XML comprimidos) +CollectEarthWindow.47=Servidor Saiku não configurado +CollectEarthWindow.48=Arquivos ZIP +CollectEarthWindow.49=Arquivos Fusion CSV +CollectEarthWindow.4=Isenção de responsabilidade da FAO +CollectEarthWindow.50=Abrir Manual de Usuário +CollectEarthWindow.51=Verificar atualizações de Collect Earth +CollectEarthWindow.52=Abrir Arquivo de Registro da aplicação +CollectEarthWindow.53=Arquivo de Registro de Collect Earth +CollectEarthWindow.54=Carregar pontos de KML +CollectEarthWindow.55=Atualizar registros atuais usando CSV +CollectEarthWindow.56=Sobre... +CollectEarthWindow.57=O processo de arranque de Saiku ainda está em execução, por favor aguarde. +CollectEarthWindow.58=Não é possível iniciar a análise com Saiku +CollectEarthWindow.59=Quer voltar a gerar o conjunto de dados para o análise de Saiku?
Este processo pode demorar vários minutos.
Se clicar em "SIM" um novo conjunto de dados com a mais recente informação será gerada. +CollectEarthWindow.5=Fechar +CollectEarthWindow.60=Geraço de dados para Saiku +CollectEarthWindow.61=Exportar dados para XML (apenas os registros adicionados/modificados) +CollectEarthWindow.62=Sobre... +CollectEarthWindow.63=Erro acessando pontos de KML +CollectEarthWindow.64=Suporte Técnico +CollectEarthWindow.65=O nome do operador foi alterado +CollectEarthWindow.66=Nome do operador +CollectEarthWindow.67=Abra a pasta de dados do CE +CollectEarthWindow.6=Exportar dados a Fusion Table +CollectEarthWindow.70=Abra o manuel desta pesquisa +CollectEarthWindow.71=Gerar ferramenta Saiku Independente +CollectEarthWindow.7=Erro ao importar os dados +CollectEarthWindow.8=Texto de isenção não foi possivel de ser encontrado +CollectEarthWindow.9=Os dados importados contém registros que já estão presentes no seu banco de dados. +DynamicsCode.0=Inicialmente Floresta +DynamicsCode.1=Inicialmente Ãrea de Pastagem +DynamicsCode.2=Inicialmente Ãrea Urbana +DynamicsCode.3=Inicialmente Outros +DynamicsCode.4=Inicialmente Ãrea Alagada +DynamicsCode.5=Inicialmente Ãrea Agrícola +EarthApp.11=Collect Earth já está em execução +EarthApp.21=O arquivo contendo o gride de pontos como CSV/CED não foi encontrado no caminho selecionado\:
+EarthApp.23=Nenhum arquivo CSV/CED foi configurado \:

+EarthApp.24=O arquivo contendo o modelo Freemarker com a definição KML não foi encontrado no caminho selecionado \:
+EarthApp.26=Nenhum arquivo de definição KML foi configurado \:

+EarthApp.27=O arquivo contendo o formato balão HTML não foi encontrado no caminho selecionado \:
+EarthApp.29=Nenhum arquivo balão HTML foi configurado \:

+EarthApp.30=Por favor corrija a localização do arquivo no menu Ferramentas->Propriedades. +EarthApp.3=Lembrar mais tarde +EarthApp.4=Atualizar Agora +EarthApp.57=Existe uma nova versão do Collect Earth disponível\!
Como gostaria de proceder? +EarthApp.58=Alerta de Atualização +EarthApp.59=Erro ao importar aquivo do projeto +EarthApp.5=Não me lembre novamente +EarthApp.61=O arquivo do Collect Earth não pôde ser aberto.
Por favor certifique-se que Google Earth esteja instalado. +EarthApp.6= - Versão +EarthApp.70=AVISO +EarthApp.71=No Mac OS X, os arquivos do projeto Collect Earth (* .cep) não serão abertos no Collect Earth quando forem clicados duas vezes.
+EarthApp.72=Use a barra de ferramentas Collect Earth para abrir os arquivos .cep \: +EarthApp.73=Collect Earth - problemas em computadores Mac OS X +EarthSurveyService.9=Campo obrigatório +ExportActionListener.1=Escolha data a partir da qual queira exportar os dados +ExportDialogProcessMonitor.0=Processando os dados... +ExportDialogProcessMonitor.1=Esperando de inicializar o processo \: +ExportDialogProcessMonitor.4=Registros importados \: +ImportActionListener.0=Deseja importar os dados das parcelas que não tenham sido completamente preenchidos? +ImportActionListener.2=Se clicar NÃO apenas os dados das parcelas em estado completo ("verde"), serão importados. +ImportActionListener.3=Importar registros incompletos +ImportDialogProcessMonitor.0=\ CALCULANDO +ImportDialogProcessMonitor.11=Cifra inicial de registros \: +ImportDialogProcessMonitor.2=Importando registros.... +ImportDialogProcessMonitor.5=Cifra final de registros importados \: +ImportDialogProcessMonitor.8=Processando dados... +ImportProcessMonitorDialog.0=Imported records \: +ImportXMLDialogProcessMonitor.1 = Substitua dados no banco de dados +ImportXMLDialogProcessMonitor.2 = Importe apenas registros não conflitantes +InfiniteProgressMonitor.0=Cancelar operação +JFileChooserExistsAware.0=Arquivo de projeto Collect Earth +KmlImportService.13=Selecione um arquivo CSV para salvar a localização dos pontos +MissingPlotsListener.0=Erro ao obter informação sobre parcelas ausentes na Base de Dados +MissingPlotsListener.10=Número total de ppontos no desenho de amostragem \: +MissingPlotsListener.12=Número de pontos perdidos \: +MissingPlotsListener.14=Todos os pontos foram preenchidos\! +MissingPlotsListener.1=Parcelas ausentes +MissingPlotsListener.2=Copiar conteúdos +MissingPlotsListener.3=Escolha os arquivos contendo informação sobre as parcelas ( .csv or .ced files ) para os quais deseja saber se todos os dados foram preenchidos. +MissingPlotsListener.4=Parcelas ausentes - informação +MissingPlotsListener.5=Do arquivo \: +MissingPlotsListener.6=Exportar para arquivo CED +NO=Não +NO_TO_ALL=Não para todos +OpenTextFileListener.0=O arquivo de texto não foi encontrado em \: +OptionWizard.0=Opções do Collect Earth +OptionWizard.100=Abrir Planet +OptionWizard.101=Llave da API do Planet +OptionWizard.1021=URL SecureWatch +OptionWizard.102=Abrir Maxar SecureWatch +OptionWizard.103=Configure o URL para o Mapa Extra (abre quando configurado) \: +OptionWizard.104=Navegadores +OptionWizard.105=Abrir Earth Map +OptionWizard.110=Use imagens mensais fornecidas pela NICFI +OptionWizard.10=Abrir arquivo de backup +OptionWizard.11=Desconhecido\: usar ifconfig +OptionWizard.12=Cliente Instância +OptionWizard.13=Collect Earth Server IP +OptionWizard.14=Collect Earth Porta de Servidor (p.ex. 8023) +OptionWizard.15=Guardar & Aplicar alteraçães +OptionWizard.16=ID +OptionWizard.17=X-coord +OptionWizard.18=Y-coord +OptionWizard.19=Elevação +OptionWizard.1=Escolher Navegador +OptionWizard.20= Os conteúdos de Google Earth foram alterados.
Por favor aceite a regarga do conteúdo uma vez que Google Earth lhe pergunte. +OptionWizard.21=Atualizado com sucesso +OptionWizard.22=Relevo +OptionWizard.23=Houve um erro ao reabrir os dados de Google Earth +OptionWizard.24=Cancelar +OptionWizard.25=Modo de Operação +OptionWizard.26=BBDD servidor +OptionWizard.27=Isto não é um Arquivo Saiku reconhecível (o arquivo start-saiku.bat não se encontra presente) +OptionWizard.28=Servidor Saiku não reconhecível +OptionWizard.29=BBDD porta +OptionWizard.2=Tipo de uso(servidor/cliente) +OptionWizard.30=Opçães SQLite +OptionWizard.31=Dados de amostra +OptionWizard.32=Disposição da Parcela +OptionWizard.33=Definiço de Questionários +OptionWizard.34=Serviços Integrados +OptionWizard.35=Número de pontos de control +OptionWizard.36=Distância entre os pontos de control (em metros) +OptionWizard.37=Margem com o perímetro da parcela (em metros) +OptionWizard.38=O arquivo CSV/CED não foi possivel ser lido corretamente.
O arquivo deve conter valores separados por vírgulas do seguinte modo\:
+OptionWizard.39=ID,Y-Coordenada,X-Coordenada,elevação,relevo,orientação +OptionWizard.3=Servidor Instance +OptionWizard.40=Projetos +OptionWizard.41=Carregar um novo arquivo de projeto +OptionWizard.42=Erro ao fechar o leitor CSV +OptionWizard.43=Nome do questionário +OptionWizard.44=Realizar automaticamente backup do banco de dados em +OptionWizard.45=Abrir Earth Engine Playground (descontinuado) +OptionWizard.46=Abrir Earth Engine Timelapse +OptionWizard.47=Abrir Bing Maps +OptionWizard.48=Abrir formulário em um navegador externo em vez de Google Earth (recomendado para LINUX) +OptionWizard.49=Caminho do arquivo CED/CSV com as coordenadas das parcelas +OptionWizard.4=IP do computador atual\: +OptionWizard.50=Navegar.. +OptionWizard.51=Erro ao importar os arquivos do projeto +OptionWizard.52= Arquivo CSV/CED com coordinadas +OptionWizard.53=Sem pontos +OptionWizard.54=Ponto Central +OptionWizard.55=Erro ao importar diretório do projeto +OptionWizard.56=Carregar projeto +OptionWizard.57=Projetos previamente carregados +OptionWizard.58=Abrir GEE Code Editor (requer acesso ao Trusted Tester) +OptionWizard.59=Abrir Here Maps focado no ponto +OptionWizard.5= Collect Earth Servidor porto\: +OptionWizard.65=Caminho para arquivo Saiku +OptionWizard.66=Navegar... +OptionWizard.67=Caminho para o executável do Firefox +OptionWizard.68=Navegar... +OptionWizard.6=Parâmetros BD PostgreSQL +OptionWizard.70=Arquivos executáveis +OptionWizard.72=Arquivos binários +OptionWizard.73=Caminho para o executável do Chrome +OptionWizard.74=Navegar... +OptionWizard.76=Arquivos executáveis +OptionWizard.78=Arquivos binarios +OptionWizard.79=Caminho para o padrão de KML Freemarker +OptionWizard.7=Nome de Usuário +OptionWizard.80=Navegar... +OptionWizard.82=Padrão Freemarker +OptionWizard.83=Caminho para formulário HTML Balloon +OptionWizard.84=Navegar... +OptionWizard.86=Pagina web HTML +OptionWizard.87=Caminho para XML com definição IDM +OptionWizard.88=Navegar... +OptionWizard.8=Senha +OptionWizard.90=Definiço XML IDM +OptionWizard.91=Servidor (versão para gerente ou uso autônomo) +OptionWizard.92=Cliente (operador/conectado ao servidor) +OptionWizard.93=SQLite (Embutido/com base em um único arquivo) +OptionWizard.94=PostgreSQL +OptionWizard.95=Side of the sampling dots (in meters) +OptionWizard.9= Nome da Base de Dados +ProcessMonitorDialog.1=Erro de análise na linha número +ProcessMonitorDialog.4=, colunas +ProcessMonitorDialog.5= -- valores +SaikuAnalysisListener.0=Sim - Atualizar dados Saiku (longo processo) +SaikuAnalysisListener.1=Não - Use a mesma versão dos dados da última vez que o Saiku foi usado +SaikuToolExportListener.1=Geração da ferramenta Saiku +SaikuToolExportListener.2=Gerando a Ferramenta Saiku com o banco de dados atual +SaikuStarter.1=Iniciando Saiku +SaikuStarter.2=Iniciando Saiku pode demorar uns minutos, por favor aguarde\! +SaveEarthDataServlet.0=Sem dados +SaveEarthDataServlet.1=Problema ocorreu ao guardar os dados na Base de Dados +SaveEarthDataServlet.2=Os dados foram guardados +SlopeCode.0=Plano (0-5) +YES=Sim +YES_TO_ALL=Sim a todas \ No newline at end of file From f5e410bd75cf08f9bc401b453ccf3a3723194708 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:35:03 +0100 Subject: [PATCH 0767/1620] New translations Messages_pt.properties (Spanish) --- .../earth/app/view/Messages_es.properties | 473 ++++++++++-------- 1 file changed, 255 insertions(+), 218 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 7531b1f880..c2ce51b7bd 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,218 +1,255 @@ -AboutDialog.19 = гарÑан нь аÑуудлыг -AboutDialog.5 = ДÑлгÑÑ€Ñнгүй мÑдÑÑллийг манай вÑб OpenForis.org очиж -AboutDialog.6 = Уучлаарай, аÑуудал нь таны ÑиÑтемийн Ñтандарт браузер ÑÐ½Ñ Ñ…Ð¾Ð»Ð±Ð¾Ð¾Ñыг нÑÑÑ… гÑж оролдож гарлаа. -AboutDialog.8 = Ок -AspectCode.0 = Хойд -AspectCode.1 = Зүүн Хойд -AspectCode.2 = Зүүн -AspectCode.3 = Зүүн-Өмнөд -AspectCode.4 = Өмнөд -AspectCode.5 = Баруун-Өмнөд -AspectCode.6 = Баруун -AspectCode.7 = Баруун Хойд -CollectEarthWindow.0 = CSV файл уруу өгөгдөл ÑкÑпортлох оролдож алдаа -CollectEarthWindow.1 = ЭкÑпортын алдаа -CollectEarthWindow.10 = Файлын -CollectEarthWindow.11 = Exit -CollectEarthWindow.12 Ñ…ÑÑ€ÑгÑÑл \= -CollectEarthWindow.13 = ЭкÑпортын CSV өгөгдөл -CollectEarthWindow.14 = Start SAIKU дүн шинжилгÑÑ -CollectEarthWindow.15 = Үл хөдлөх хөрөнгө -CollectEarthWindow.16 = туÑламж -CollectEarthWindow.17 = Disclaimer -CollectEarthWindow.18 = мÑдÑÑллийн Ñанд Ñураггүй алга газраа хай -CollectEarthWindow.19 = дÑлхийг цуглуулах -CollectEarthWindow.2 = Ñ…Ñл -CollectEarthWindow.20 = давхардÑан тоогоор бүртгÑлийн тоо\: -CollectEarthWindow.21 = гол хүрÑÑ Ð´Ò¯Ñ€Ñийг олж чадахгүй байна -CollectEarthWindow.22 = Ð¥ÑÑ€Ñв та цуглуулж дÑлхийг хаах Ñ…Ò¯ÑÑж байгаа гÑдÑгт итгÑлтÑй байна уу? Цонхыг хаах нь цуглуулж ДÑлхий Ñервер хаах болно
-CollectEarthWindow.23 = батлах Ñ…ÑÑ€ÑгтÑй -CollectEarthWindow.24 = XML ЭкÑпортын -CollectEarthWindow.25 = Та Ñмар ч байÑан ÑдгÑÑÑ€ бүртгÑлийг нÑмÑÑ…, таны одоогийн мÑдÑÑллийг алдах Ñ…Ò¯ÑÑж байна уу? -CollectEarthWindow.26 = Оператор -CollectEarthWindow.27 = шинÑчлÑÑ… -CollectEarthWindow.28 = <б> ÐÑÑлттÑй Foris оператор мÑдÑÑллийг хөрвүүлÑн ойлгох бол ДÑлхий Ñервер ажиллаж байх Ñ‘Ñтой цуглуулна. -CollectEarthWindow.29 = Saiku Ñерверийг тохируулаагүй байна. -CollectEarthWindow.3 = \ Импорт алдаа -CollectEarthWindow.30 = Та Google Earth ашиглаж байгаа бол ÑÐ½Ñ Ñ†Ð¾Ð½Ñ… нÑÑлттÑй байлгах уу. -CollectEarthWindow.31 = ЭкÑпортын CSV файлд мÑдÑÑллийг цуглуулÑан -CollectEarthWindow.32 = Quit -CollectEarthWindow.33 = операторын нÑÑ€ 5 Ñ‚ÑмдÑгтүүд болон 50 богино бодвол илүү урт байх Ñ‘Ñтой -CollectEarthWindow.34 = Баталгаажуулалт алдаа -CollectEarthWindow.35 = OPERATOR нÑÑ€ хооÑон \! Зар операторын нÑÑ€ бөглөх болон "шинÑчлÑÑ…" товчийг дарна уу. -CollectEarthWindow.36 = Оператор нÑÑ€ хооÑон байж болохгүй -CollectEarthWindow.37 = нÑÑлттÑй байлга -CollectEarthWindow.38 = CSV файлууд -CollectEarthWindow.39 = Ðнхааруулга\: Ð­Ð½Ñ Ð½ÑŒ зүйтÑй та нөөцлөх-ап таны одоогийн өгөгдөл (XML нь ЭкÑпортын) ÑˆÐ¸Ð½Ñ Ð¼ÑдÑÑллийг импортлогч өмнө -CollectEarthWindow.4 = ÐҮБ-ын ХХÐÐБ Disclaimer зар -CollectEarthWindow.40 Тодорхой хүртÑл \= Saiku Server Ð¥ÑÑ€ÑгÑÑл цÑÑÑн дотрооÑ> баÑлагт> ÐарийвчилÑан таб-д ÑуулгаÑан байна Ñ…Ð°Ð²Ñ‚Ð°Ñ Ð·Ð°Ð¼Ñ‹Ð³. -CollectEarthWindow.41 = Хадгаламж файл уруу өгөгдөл ÑкÑпортолÑон\: -CollectEarthWindow.42 = Quit -CollectEarthWindow.43 = ЗөрчилтÑй бүртгÑл олдлоо -CollectEarthWindow.44 = МÑдÑÑллийн Импорт / ЭкÑпортын -XML гÑж CollectEarthWindow.45 \= ЭкÑпортын мÑдÑÑ (шахÑан) -Zip-Ð°Ð°Ñ CollectEarthWindow.46 \= Импортын ÑˆÐ¸Ð½Ñ Ð¼ÑдÑÑ (шахÑан XML) -CSV ашиглан CollectEarthWindow.55 \= шинÑчлÑÑ… одоогийн бүртгÑл -CollectEarthWindow.47 = Saiku Ñерверийг тохируулаагүй бол -CollectEarthWindow.48 = Zip / цуглуулах-өгөгдлийн файлууд -CollectEarthWindow.49 = Fusion CSV файлууд -CollectEarthWindow.5 = Хаах -CollectEarthWindow.50 = ÐÑÑлттÑй Ñ…ÑÑ€ÑглÑгчийн гарын авлага -Цуглуулж дÑлхийн шинÑчлÑлтүүдийн хувьд CollectEarthWindow.51 \= шалгах -CollectEarthWindow.52 = ÐÑÑлттÑй Application нÑвтрÑÑ… Файлын -CollectEarthWindow.53 = цуглуулах ДÑлхий нÑвтрÑÑ… файл -KML нь CollectEarthWindow.54 \= ачааллын оноо -CollectEarthWindow.56 = тухай ... -CollectEarthWindow.57 = Saiku гарааны үйл Ñвц одоо ч ажиллаж байгаа, түр хүлÑÑÐ½Ñ Ò¯Ò¯. -CollectEarthWindow.58 = Saiku шинжилгÑÑг Ñхлүүлж чадахгүй -CollectEarthWindow.59 = Ð¥ÑÑ€Ñв та Saiku дүн шинжилгÑÑ Ñ…Ð¸Ð¹Ñ… мÑдÑÑллийн Ñанг дахин бий болгох Ñ…Ò¯ÑÑж байна уу?
Ð­Ð½Ñ Ò¯Ð¹Ð» Ñвц нь цаг хугацаа шаардÑан ажил байж болох юм.
Та хамгийн Ñүүлийн үеийн нь "YES" ÑˆÐ¸Ð½Ñ Ð´Ð°Ñ‚Ð°Ñетийн дÑÑÑ€ товшино уу мÑдÑÑллийг бий болно. -Fusion Ð¥Ò¯ÑнÑгт нь CollectEarthWindow.6 \= ЭкÑпортын -CollectEarthWindow.60 = Saiku мÑдÑÑ Ò¯ÐµÐ¸Ð¹Ð½ -CollectEarthWindow.61 = ЭкÑпортын XML өгөгдөл (Ñүүлийн ÑкÑпортын хойш өөрчлөгдÑөн бүртгÑл) -CollectEarthWindow.62 = тухай ... -CollectEarthWindow.63 = Ðлдаа KML авÑан оноо авах -CollectEarthWindow.64 = техникийн дÑмжлÑг үзүүлÑÑ… -CollectEarthWindow.7 = алдаа мÑдÑÑлÑл импортлох -CollectEarthWindow.8 = Disclaimer текÑÑ‚ олж чадахгүй байна -CollectEarthWindow.9 = оруулÑан мÑдÑÑллийг өөрийн мÑдÑÑллийн Ñанд нь байгаа бичлÑгийг агуулж байдаг. -DynamicsCode.0 = ЭхлÑÑд ой -DynamicsCode.1 = ЭхлÑÑд БÑлчÑÑрийн -DynamicsCode.2 = ЭхлÑÑд шийдвÑрлÑÑ… -DynamicsCode.3 = ЭхлÑÑд Otherland -DynamicsCode.4 = ЭхлÑÑд Ð£Ñ Ð½Ð°Ð¼Ð³Ð°Ñ€Ñ…Ð°Ð³ газрын -DynamicsCode.5 = ЭхлÑÑд Тариалангийн -OpenTextFileListener.0 = текÑÑ‚ файл олж байÑан юм\: -OptionWizard.0 = ДÑлхий Ñонголт цуглуулах -OptionWizard.1 = Хөтөч Ñонгоно уу -OptionWizard.10 = ÐÑÑлттÑй нөөц Ñ…Ð°Ð²Ñ‚Ð°Ñ -OptionWizard.11 = Тодорхойгүй\: ашиглах ifconfig -OptionWizard.12 = Ð¥ÑÑ€ÑглÑгч шатны -OptionWizard.13 = ДÑлхий Server IP цуглуулах -OptionWizard.14 = ДÑлхий Server портыг (жишÑÑ Ð½ÑŒ\: 8023) цуглуулах -OptionWizard.15 = Save & өөрчлөлт хийх -OptionWizard.16 = ID -OptionWizard.17 = X-coord -OptionWizard.18 = Y-coord -OptionWizard.19 = Elevation -OptionWizard.2 = урÑгал даÑгалын (Ñервер / үйлчлүүлÑгч) - OptionWizard.20 \= Google Earth агуулга нь өөрчлөгдÑөн байна.
Ðгуулга нь ачаалах хүлÑÑн авна уу та Google Earth-ÑÑÑ Ð°Ñуух үед. -OptionWizard.21 = шинÑчлÑÑ… амжилттай -OptionWizard.22 = Ð¥Ñвгий -OptionWizard.23 = дахин нÑÑÑ… Google Earth мÑдÑÑллийг үед алдаа гарлаа -OptionWizard.24 = Болих -OptionWizard.25 = үйл ажиллагааны горим -OptionWizard.26 = DB хоÑÑ‚ -OptionWizard.27 = Ð­Ð½Ñ Ð½ÑŒ хүлÑÑн зөвшөөрөгдÑөн Saiku Folder (ÑхлÑÑ… saiku.bat файл байхгүй бол) ороогүй байна -OptionWizard.28 = Saiku Server хүлÑÑн зөвшөөрөөгүй -OptionWizard.29 = DB порт -OptionWizard.3 = Server шатны -OptionWizard.30 = SQLite Ñонголт -OptionWizard.31 = ЖишÑÑ Ð¼ÑдÑÑлÑл -OptionWizard.32 = Plot зохион байгуулалт -OptionWizard.33 = Ñудалгаа тодорхойлолт -OptionWizard.34 = ÐарийвчилÑан -OptionWizard.35 = түүвÑÑ€ цÑгийн тоо -OptionWizard.36 = (метр) дÑÑж авах цÑгийн хоорондох зай -(Метр) ДÑÑж авах цÑгүүд OptionWizard.95 \= Side -OptionWizard.38 = CSV / CED файлыг зөв уншиж чадахгүй байгаа файлыг
иймÑрхүү таÑлалаар туÑгаарлаж утгыг байх төлөвтÑй байна\:.
<Б> -OptionWizard.39 = ID, YCoordinate, XCoordinate, өндрийн, налуу, тал -OptionWizard.4 = Одоогийн компьютерийн IP\: -OptionWizard.40 = төÑлүүд -OptionWizard.41 = ÑˆÐ¸Ð½Ñ Ñ‚Ó©Ñөл файлыг ачаалж -OptionWizard.42 = Ðлдаа CSV уншигч хаах -Судалгааны OptionWizard.43 \= нÑÑ€ -OptionWizard.44 = автоматаар нөөцлөх хүртÑл өгөгдлийн Ñан дÑÑÑ€ -OptionWizard.45 = ÐÑÑлттÑй Earth Engine талбай талбай руу томруулÑан -талбай мÑдÑÑлÑл / CSV файлыг ced нь OptionWizard.49 \= зам -Харин Google Earth-ийн браузер дÑÑÑ€ OptionWizard.48 \= ÐÑÑлттÑй Ñ…ÑлбÑÑ€ (ЛинукÑд зориулÑан байлгахыг зөвлөдөг) -OptionWizard.5 = цуглуулах ДÑлхий Server портыг\: -OptionWizard.50 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... -OptionWizard.51 = Ðлдаа импортлох төÑөл файл -Зөвхөн координат нь OptionWizard.52 \= CSV / CED файл -OptionWizard.53 = талбай -OptionWizard.54 = Төв цÑг нь -OptionWizard.55 = Ðлдаа импортлох төÑөл Ñ…Ð°Ð²Ñ‚Ð°Ñ -OptionWizard.56 = ачааллын төÑөл -OptionWizard.57 = Өмнө нь дуудагддаг төÑөл -OptionWizard.58 = ÐÑÑлттÑй Gee тоглоомын талбай (Trusted Tester хандах шаардлагатай) -OptionWizard.59 = ÐÑÑлттÑй Энд Maps газар дÑÑÑ€ анхаарлаа хандуулж -OptionWizard.6 = PostgreSQL DB параметрүүд -OptionWizard.65 = Saiku хавтÑанд зам -OptionWizard.66 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... -OptionWizard.67 = Firefox гүйцÑтгÑгдÑÑ… нь зам -OptionWizard.68 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... -OptionWizard.7 = Ð¥ÑÑ€ÑглÑгчийн нÑÑ€ -OptionWizard.70 = гүйцÑтгÑгдÑÑ… файлууд -OptionWizard.72 = Хоёртын файлууд -OptionWizard.73 = Chrome гүйцÑтгÑгдÑÑ… нь зам -OptionWizard.74 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... -OptionWizard.76 = гүйцÑтгÑгдÑÑ… файлууд -OptionWizard.78 = Хоёртын файлууд -OptionWizard.79 = KML Freemarker загварт зам -OptionWizard.8 = Ðууц үг -OptionWizard.80 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... -OptionWizard.82 = Freemarker загвар -OptionWizard.83 = HTML бөмбөлөг Ñ…ÑлбÑÑ€ дизайн зам -OptionWizard.84 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... -OptionWizard.86 = HTML вÑб Ñ…ÑƒÑƒÐ´Ð°Ñ -OptionWizard.87 = IDM тодорхойлолт нь XML нь зам -OptionWizard.88 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... -OptionWizard.9 = DB нÑÑ€ -OptionWizard.90 = XML IDM тодорхойлолт -OptionWizard.91 = Server (менежер хувилбар, ÑÑвÑл дангаараа ашиглах нь) -OptionWizard.92 = Ð¥ÑÑ€ÑглÑгч (оператор / Ñервер уруу холбогдÑон) -OptionWizard.93 = SQLite (Embedded / нÑг файл дÑÑÑ€ тулгуурлаÑан) -OptionWizard.94 = PostgreSQL -SaikuAnalysisListener.0 = Тийм - СÑргÑÑÑ… Saiku мÑдÑÑлÑл (урт үйл Ñвц) -SaikuAnalysisListener.1 = Үгүй - ЗүгÑÑÑ€ л Saiku ÑхлÑÑ… -SaikuStarter.1 Saiku ÑхлÑн \= -SaikuStarter.2 Saiku ÑхлÑн зарим нÑг минут үргÑлжилж болох \= түр хүлÑÑÐ½Ñ Ò¯Ò¯ \! -SaveEarthDataServlet.0 = ХооÑон Ñ…Ò¯ÑÑлт -SaveEarthDataServlet.1 = ÐÑуудлын мÑдÑÑллийн Ñанд мÑдÑÑлÑл Ñ…ÑмнÑÑ… гарлаа -SaveEarthDataServlet.2 = өгөгдөл хадгалÑан байна -SlopeCode.0 = Хавтгай (0-5) -EarthApp.11 = дÑлхий аль Ñ…Ñдийн ажиллаж байгаа цуглуулах -EarthApp.21 хашааны ÑүлжÑÑ Ð°Ð³ÑƒÑƒÐ»Ñан файлыг \= а CSV / CED ÑонгоÑон зам олж чадаагүй байна гÑж\:
<би> -EarthApp.23 = Ямар ч CSV / CED файл тохируулга байна\:

-EarthApp.24 = KML тодорхойлолт нь Freemarker загварыг агуулÑан файлыг ÑонгоÑон замаар олж ороогүй байна\:
<би> -EarthApp.26 = Ямар ч KML тодорхойлолт файл тохируулга байна\:

-EarthApp.27 = HTML бөмбөлөг Ñ…ÑлбÑрийг агуулÑан файлыг ÑонгоÑон замаар олж ороогүй байна\:
<би> -EarthApp.29 = Ямар ч HTML бөмбөлөг файл тохируулга байна\:

-EarthApp.3 = дараа нь надад Ñануул -EarthApp.30 = Ð¥ÑÑ€ÑгÑÑл цÑÑÑн дотрооÑ> Properties цÑÑ Ñ„Ð°Ð¹Ð»Ñ‹Ð½ байршлыг зөв оруулна уу. -EarthApp.4 = шинÑчлÑÑ… Одоо -EarthApp.5 = намайг дахин Ñануулах байхгүй юу -EarthApp.57 = <б> цуглуулж ДÑлхий боломжтой -ийн ÑˆÐ¸Ð½Ñ Ñ…ÑƒÐ²Ð¸Ð»Ð±Ð°Ñ€ байна\! Ð¥ÑÑ€Ñв та Ñ…ÑрхÑн цааш Ñ…Ò¯ÑÑж байна вÑ?
-EarthApp.58 = шинÑчлÑÑ… бөгөөд дохио авах байрлуулах -EarthApp.59 = Ðлдаа төÑөл файлыг импортлох -EarthApp.6 = \ - Хувилбар -EarthApp.61 = цуглуулж ДÑлхий файл, нÑÑлттÑй байж чадÑангүй.
Google Earth ÑуулгаÑан ÑÑÑхийг шалгана уу. -EarthSurveyService.9 = талбар шаардлагатай -ExportActionListener.1 = ÑхлÑн ÑкÑпортын Records-руу огноо Ñонгох -ExportDialogProcessMonitor.0 = боловÑруулах мÑдÑÑ ... -ExportDialogProcessMonitor.1 = үйл Ñвцыг Ñхлүүлж хүлÑÑж байна\: -ExportDialogProcessMonitor.4 = ÑкÑпортлох бүртгÑл\: -ImportProcessMonitorDialog.0 = Импортын бүртгÑл\: -ImportActionListener.0 = бүрÑн дүүрÑн чадаагүй байна талбайд өгөгдлийн импортын Ñ‘Ñтой юу? -ImportActionListener.2 = Та дарна бол <и> <б> NO бүх өгөгдлийг агуулÑан "ногоон" төлөвт талбайд, зөвхөн өгөгдөл оруулÑан болно. -ImportActionListener.3 = Импорт Ð±ÑƒÑ Ð±Ð¾Ð»Ð¾Ð²ÑруулÑан бүртгÑл -ImportDialogProcessMonitor.0 = ТООЦОЖ бичлÑгүүдийн ImportDialogProcessMonitor.11 \= Эхний дугаар\: -ImportDialogProcessMonitor.2 = бүртгÑл импортлож байна ... -Импортын бүртгÑл ImportDialogProcessMonitor.5 \= бодит тоо\: -ImportDialogProcessMonitor.8 = боловÑруулах мÑдÑÑ ... -InfiniteProgressMonitor.0 = ажиллагааг Cancel -JFileChooserExistsAware.0 = ДÑлхий төÑөл файлыг цуглуулах -KmlImportService.13 = тулд талбай байршлыг хадгалахын тулд CSV файлыг Ñонгоно уу -Database дÑÑÑ€ нь байхгүй хашааны-ий тухай мÑдÑÑлÑл авах бол MissingPlotsListener.0 \= алдаа -MissingPlotsListener.1 = хайж байна газрууд -MissingPlotsListener.10 = дÑÑж дизайн талбайд нийт тоо\: -MissingPlotsListener.12 = алга хашааны тоо\: -MissingPlotsListener.14 = мÑдÑÑлÑл талбай дүүрÑн байдаг \! -MissingPlotsListener.2 = Хуулах Бал нь агуулга -MissingPlotsListener.3 = Та бүх мÑдÑÑлÑл ирÑÑн дүүрÑн байÑан ÑÑÑхийг мÑдÑхийг Ñ…Ò¯ÑÑж байгаа нь хуйвалдаан мÑдÑÑлÑл (.csv ÑÑвÑл .ced файлууд) агуулÑан файлуудыг Ñонгоорой. -MissingPlotsListener.4 = хайж байна талбай - мÑдÑÑлÑл -MissingPlotsListener.5 Ñ„Ð°Ð¹Ð»Ð°Ð°Ñ \=\: -CED файлд MissingPlotsListener.6 \= ЭкÑпортын -мөр нь Ñ…Ñд Ñ…ÑдÑн ProcessMonitorDialog.1 \= магадлах алдаа -ProcessMonitorDialog.4 = багана -ProcessMonitorDialog.5 = \ - утгууд \ No newline at end of file +AboutDialog.19=Ocorreu um problema +AboutDialog.5=Para mais informações visite nosso site OpenForis.org +AboutDialog.6=Desculpe, um problema ocorreu ao tentar abrir esse link no seu navegador padrão. +AboutDialog.8=Ok +AspectCode.0=Norte +AspectCode.1=Nordeste +AspectCode.2=Leste +AspectCode.3=Sudeste +AspectCode.4=Sul +AspectCode.5=Sudoeste +AspectCode.6=Oeste +AspectCode.7=Noroeste +CollectEarthMenu.0=Importar Arquivo CEP +CollectEarthMenu.2=Utilidades +CollectEarthMenu.3=Separar arquivo CSV em partes +CollectEarthMenu.4=Exportar dados para XML (da data específica até o tempo presente) +CollectEarthMenu.5=Exportar para Collect Backup +CollectEarthMenu.6=Exportar dados como Collect Backup (todos os dados) +CollectEarthMenu.7=Exportar dados como Collect Backup (a partir de uma data) +CollectEarthMenu.8=Exportar dados para XML (filtrar por atributo) +CollectEarthWindow.0=Erro ao tentar exportar os dados para um arquivo CSV +CollectEarthWindow.10=Arquivo +CollectEarthWindow.11=Fechar +CollectEarthWindow.12=Ferramentas +CollectEarthWindow.13=Baixar dados para CSV (Excel) +CollectEarthWindow.14=Iniciar Análise SAIKU +CollectEarthWindow.15=Propiedades +CollectEarthWindow.16=Ajuda +CollectEarthWindow.17=Declaração +CollectEarthWindow.18=Encontrar parcelas ausentes em banco de dados +CollectEarthWindow.19=Collect Earth +CollectEarthWindow.1=Erro ao exportar +CollectEarthWindow.20=Número de registros duplicados\: +CollectEarthWindow.21=Não foi possível encontrar o ícone para a janela principal +CollectEarthWindow.22=Tem certeza de querer fechar Collect Earth?
Ao fechar a janela será fechada também o servidor de Collect Earth +CollectEarthWindow.23=Confirmação requerida +CollectEarthWindow.24=Exportar a XML +CollectEarthWindow.25=Quer importar estes registros de qualquer maneira e perder o seus dados atuais? +CollectEarthWindow.26=Operador +CollectEarthWindow.27=Atualizar +CollectEarthWindow.28=O servidor Open Foris Collect Earth deve estar em execução enquanto o operador interprete os dados. +CollectEarthWindow.29=O servidor Saiku não está configurado. +CollectEarthWindow.2=Idioma +CollectEarthWindow.30=Por favor mantenha esta janela aberta enquanto estiver usando o Google Earth. +CollectEarthWindow.31=Exportar os dados coletados para um arquivo CSV +CollectEarthWindow.32=Fechar +CollectEarthWindow.33=O nome do operador deve ser maior de que 5 caracteres e mais curto do que 50 +CollectEarthWindow.34= Erro de Validação +CollectEarthWindow.35=NOME DO OPERADOR VAZIO\!
Preencha o nome do operador e clique no botão "Atualizar". +CollectEarthWindow.36=Nome do operador não pode estar vazio +CollectEarthWindow.37=Permanecer Aberto +CollectEarthWindow.38=Arquivos de CSV +CollectEarthWindow.39=AVISO\:Se recomenda de fazer um back-up dos seus dados atuais(Exportar para XML) antes de importar os novos dados +CollectEarthWindow.3=\ Erro ao importar dados. +CollectEarthWindow.40=Configurar caminho para o arquivo onde o Servidor Saiku se encontra instalado em Ferramentas->Propiedades->Avançado. +CollectEarthWindow.41=Guardar dados exportados para o arquivo\: +CollectEarthWindow.42=Sair +CollectEarthWindow.43=Registros repetidos detectados +CollectEarthWindow.44=Importar/Exportar +CollectEarthWindow.45=Exportar dados para XML (comprimidos) +CollectEarthWindow.46=Importar novos dados do ZIP (XML comprimidos) +CollectEarthWindow.47=Servidor Saiku não configurado +CollectEarthWindow.48=Arquivos ZIP +CollectEarthWindow.49=Arquivos Fusion CSV +CollectEarthWindow.4=Isenção de responsabilidade da FAO +CollectEarthWindow.50=Abrir Manual de Usuário +CollectEarthWindow.51=Verificar atualizações de Collect Earth +CollectEarthWindow.52=Abrir Arquivo de Registro da aplicação +CollectEarthWindow.53=Arquivo de Registro de Collect Earth +CollectEarthWindow.54=Carregar pontos de KML +CollectEarthWindow.55=Atualizar registros atuais usando CSV +CollectEarthWindow.56=Sobre... +CollectEarthWindow.57=O processo de arranque de Saiku ainda está em execução, por favor aguarde. +CollectEarthWindow.58=Não é possível iniciar a análise com Saiku +CollectEarthWindow.59=Quer voltar a gerar o conjunto de dados para o análise de Saiku?
Este processo pode demorar vários minutos.
Se clicar em "SIM" um novo conjunto de dados com a mais recente informação será gerada. +CollectEarthWindow.5=Fechar +CollectEarthWindow.60=Geraço de dados para Saiku +CollectEarthWindow.61=Exportar dados para XML (apenas os registros adicionados/modificados) +CollectEarthWindow.62=Sobre... +CollectEarthWindow.63=Erro acessando pontos de KML +CollectEarthWindow.64=Suporte Técnico +CollectEarthWindow.65=O nome do operador foi alterado +CollectEarthWindow.66=Nome do operador +CollectEarthWindow.67=Abra a pasta de dados do CE +CollectEarthWindow.6=Exportar dados a Fusion Table +CollectEarthWindow.70=Abra o manuel desta pesquisa +CollectEarthWindow.71=Gerar ferramenta Saiku Independente +CollectEarthWindow.7=Erro ao importar os dados +CollectEarthWindow.8=Texto de isenção não foi possivel de ser encontrado +CollectEarthWindow.9=Os dados importados contém registros que já estão presentes no seu banco de dados. +DynamicsCode.0=Inicialmente Floresta +DynamicsCode.1=Inicialmente Ãrea de Pastagem +DynamicsCode.2=Inicialmente Ãrea Urbana +DynamicsCode.3=Inicialmente Outros +DynamicsCode.4=Inicialmente Ãrea Alagada +DynamicsCode.5=Inicialmente Ãrea Agrícola +EarthApp.11=Collect Earth já está em execução +EarthApp.21=O arquivo contendo o gride de pontos como CSV/CED não foi encontrado no caminho selecionado\:
+EarthApp.23=Nenhum arquivo CSV/CED foi configurado \:

+EarthApp.24=O arquivo contendo o modelo Freemarker com a definição KML não foi encontrado no caminho selecionado \:
+EarthApp.26=Nenhum arquivo de definição KML foi configurado \:

+EarthApp.27=O arquivo contendo o formato balão HTML não foi encontrado no caminho selecionado \:
+EarthApp.29=Nenhum arquivo balão HTML foi configurado \:

+EarthApp.30=Por favor corrija a localização do arquivo no menu Ferramentas->Propriedades. +EarthApp.3=Lembrar mais tarde +EarthApp.4=Atualizar Agora +EarthApp.57=Existe uma nova versão do Collect Earth disponível\!
Como gostaria de proceder? +EarthApp.58=Alerta de Atualização +EarthApp.59=Erro ao importar aquivo do projeto +EarthApp.5=Não me lembre novamente +EarthApp.61=O arquivo do Collect Earth não pôde ser aberto.
Por favor certifique-se que Google Earth esteja instalado. +EarthApp.6= - Versão +EarthApp.70=AVISO +EarthApp.71=No Mac OS X, os arquivos do projeto Collect Earth (* .cep) não serão abertos no Collect Earth quando forem clicados duas vezes.
+EarthApp.72=Use a barra de ferramentas Collect Earth para abrir os arquivos .cep \: +EarthApp.73=Collect Earth - problemas em computadores Mac OS X +EarthSurveyService.9=Campo obrigatório +ExportActionListener.1=Escolha data a partir da qual queira exportar os dados +ExportDialogProcessMonitor.0=Processando os dados... +ExportDialogProcessMonitor.1=Esperando de inicializar o processo \: +ExportDialogProcessMonitor.4=Registros importados \: +ImportActionListener.0=Deseja importar os dados das parcelas que não tenham sido completamente preenchidos? +ImportActionListener.2=Se clicar NÃO apenas os dados das parcelas em estado completo ("verde"), serão importados. +ImportActionListener.3=Importar registros incompletos +ImportDialogProcessMonitor.0=\ CALCULANDO +ImportDialogProcessMonitor.11=Cifra inicial de registros \: +ImportDialogProcessMonitor.2=Importando registros.... +ImportDialogProcessMonitor.5=Cifra final de registros importados \: +ImportDialogProcessMonitor.8=Processando dados... +ImportProcessMonitorDialog.0=Imported records \: +ImportXMLDialogProcessMonitor.1 = Substitua dados no banco de dados +ImportXMLDialogProcessMonitor.2 = Importe apenas registros não conflitantes +InfiniteProgressMonitor.0=Cancelar operação +JFileChooserExistsAware.0=Arquivo de projeto Collect Earth +KmlImportService.13=Selecione um arquivo CSV para salvar a localização dos pontos +MissingPlotsListener.0=Erro ao obter informação sobre parcelas ausentes na Base de Dados +MissingPlotsListener.10=Número total de ppontos no desenho de amostragem \: +MissingPlotsListener.12=Número de pontos perdidos \: +MissingPlotsListener.14=Todos os pontos foram preenchidos\! +MissingPlotsListener.1=Parcelas ausentes +MissingPlotsListener.2=Copiar conteúdos +MissingPlotsListener.3=Escolha os arquivos contendo informação sobre as parcelas ( .csv or .ced files ) para os quais deseja saber se todos os dados foram preenchidos. +MissingPlotsListener.4=Parcelas ausentes - informação +MissingPlotsListener.5=Do arquivo \: +MissingPlotsListener.6=Exportar para arquivo CED +NO=Não +NO_TO_ALL=Não para todos +OpenTextFileListener.0=O arquivo de texto não foi encontrado em \: +OptionWizard.0=Opções do Collect Earth +OptionWizard.100=Abrir Planet +OptionWizard.101=Llave da API do Planet +OptionWizard.1021=URL SecureWatch +OptionWizard.102=Abrir Maxar SecureWatch +OptionWizard.103=Configure o URL para o Mapa Extra (abre quando configurado) \: +OptionWizard.104=Navegadores +OptionWizard.105=Abrir Earth Map +OptionWizard.110=Use imagens mensais fornecidas pela NICFI +OptionWizard.10=Abrir arquivo de backup +OptionWizard.11=Desconhecido\: usar ifconfig +OptionWizard.12=Cliente Instância +OptionWizard.13=Collect Earth Server IP +OptionWizard.14=Collect Earth Porta de Servidor (p.ex. 8023) +OptionWizard.15=Guardar & Aplicar alteraçães +OptionWizard.16=ID +OptionWizard.17=X-coord +OptionWizard.18=Y-coord +OptionWizard.19=Elevação +OptionWizard.1=Escolher Navegador +OptionWizard.20= Os conteúdos de Google Earth foram alterados.
Por favor aceite a regarga do conteúdo uma vez que Google Earth lhe pergunte. +OptionWizard.21=Atualizado com sucesso +OptionWizard.22=Relevo +OptionWizard.23=Houve um erro ao reabrir os dados de Google Earth +OptionWizard.24=Cancelar +OptionWizard.25=Modo de Operação +OptionWizard.26=BBDD servidor +OptionWizard.27=Isto não é um Arquivo Saiku reconhecível (o arquivo start-saiku.bat não se encontra presente) +OptionWizard.28=Servidor Saiku não reconhecível +OptionWizard.29=BBDD porta +OptionWizard.2=Tipo de uso(servidor/cliente) +OptionWizard.30=Opçães SQLite +OptionWizard.31=Dados de amostra +OptionWizard.32=Disposição da Parcela +OptionWizard.33=Definiço de Questionários +OptionWizard.34=Serviços Integrados +OptionWizard.35=Número de pontos de control +OptionWizard.36=Distância entre os pontos de control (em metros) +OptionWizard.37=Margem com o perímetro da parcela (em metros) +OptionWizard.38=O arquivo CSV/CED não foi possivel ser lido corretamente.
O arquivo deve conter valores separados por vírgulas do seguinte modo\:
+OptionWizard.39=ID,Y-Coordenada,X-Coordenada,elevação,relevo,orientação +OptionWizard.3=Servidor Instance +OptionWizard.40=Projetos +OptionWizard.41=Carregar um novo arquivo de projeto +OptionWizard.42=Erro ao fechar o leitor CSV +OptionWizard.43=Nome do questionário +OptionWizard.44=Realizar automaticamente backup do banco de dados em +OptionWizard.45=Abrir Earth Engine Playground (descontinuado) +OptionWizard.46=Abrir Earth Engine Timelapse +OptionWizard.47=Abrir Bing Maps +OptionWizard.48=Abrir formulário em um navegador externo em vez de Google Earth (recomendado para LINUX) +OptionWizard.49=Caminho do arquivo CED/CSV com as coordenadas das parcelas +OptionWizard.4=IP do computador atual\: +OptionWizard.50=Navegar.. +OptionWizard.51=Erro ao importar os arquivos do projeto +OptionWizard.52= Arquivo CSV/CED com coordinadas +OptionWizard.53=Sem pontos +OptionWizard.54=Ponto Central +OptionWizard.55=Erro ao importar diretório do projeto +OptionWizard.56=Carregar projeto +OptionWizard.57=Projetos previamente carregados +OptionWizard.58=Abrir GEE Code Editor (requer acesso ao Trusted Tester) +OptionWizard.59=Abrir Here Maps focado no ponto +OptionWizard.5= Collect Earth Servidor porto\: +OptionWizard.65=Caminho para arquivo Saiku +OptionWizard.66=Navegar... +OptionWizard.67=Caminho para o executável do Firefox +OptionWizard.68=Navegar... +OptionWizard.6=Parâmetros BD PostgreSQL +OptionWizard.70=Arquivos executáveis +OptionWizard.72=Arquivos binários +OptionWizard.73=Caminho para o executável do Chrome +OptionWizard.74=Navegar... +OptionWizard.76=Arquivos executáveis +OptionWizard.78=Arquivos binarios +OptionWizard.79=Caminho para o padrão de KML Freemarker +OptionWizard.7=Nome de Usuário +OptionWizard.80=Navegar... +OptionWizard.82=Padrão Freemarker +OptionWizard.83=Caminho para formulário HTML Balloon +OptionWizard.84=Navegar... +OptionWizard.86=Pagina web HTML +OptionWizard.87=Caminho para XML com definição IDM +OptionWizard.88=Navegar... +OptionWizard.8=Senha +OptionWizard.90=Definiço XML IDM +OptionWizard.91=Servidor (versão para gerente ou uso autônomo) +OptionWizard.92=Cliente (operador/conectado ao servidor) +OptionWizard.93=SQLite (Embutido/com base em um único arquivo) +OptionWizard.94=PostgreSQL +OptionWizard.95=Side of the sampling dots (in meters) +OptionWizard.9= Nome da Base de Dados +ProcessMonitorDialog.1=Erro de análise na linha número +ProcessMonitorDialog.4=, colunas +ProcessMonitorDialog.5= -- valores +SaikuAnalysisListener.0=Sim - Atualizar dados Saiku (longo processo) +SaikuAnalysisListener.1=Não - Use a mesma versão dos dados da última vez que o Saiku foi usado +SaikuToolExportListener.1=Geração da ferramenta Saiku +SaikuToolExportListener.2=Gerando a Ferramenta Saiku com o banco de dados atual +SaikuStarter.1=Iniciando Saiku +SaikuStarter.2=Iniciando Saiku pode demorar uns minutos, por favor aguarde\! +SaveEarthDataServlet.0=Sem dados +SaveEarthDataServlet.1=Problema ocorreu ao guardar os dados na Base de Dados +SaveEarthDataServlet.2=Os dados foram guardados +SlopeCode.0=Plano (0-5) +YES=Sim +YES_TO_ALL=Sim a todas \ No newline at end of file From 77f22cdebdaae865138081ecc88518adee05163d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:35:04 +0100 Subject: [PATCH 0768/1620] New translations Messages_pt.properties (Portuguese) --- .../earth/app/view/Messages_pt.properties | 473 ++++++++++-------- 1 file changed, 255 insertions(+), 218 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 7531b1f880..c2ce51b7bd 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,218 +1,255 @@ -AboutDialog.19 = гарÑан нь аÑуудлыг -AboutDialog.5 = ДÑлгÑÑ€Ñнгүй мÑдÑÑллийг манай вÑб OpenForis.org очиж -AboutDialog.6 = Уучлаарай, аÑуудал нь таны ÑиÑтемийн Ñтандарт браузер ÑÐ½Ñ Ñ…Ð¾Ð»Ð±Ð¾Ð¾Ñыг нÑÑÑ… гÑж оролдож гарлаа. -AboutDialog.8 = Ок -AspectCode.0 = Хойд -AspectCode.1 = Зүүн Хойд -AspectCode.2 = Зүүн -AspectCode.3 = Зүүн-Өмнөд -AspectCode.4 = Өмнөд -AspectCode.5 = Баруун-Өмнөд -AspectCode.6 = Баруун -AspectCode.7 = Баруун Хойд -CollectEarthWindow.0 = CSV файл уруу өгөгдөл ÑкÑпортлох оролдож алдаа -CollectEarthWindow.1 = ЭкÑпортын алдаа -CollectEarthWindow.10 = Файлын -CollectEarthWindow.11 = Exit -CollectEarthWindow.12 Ñ…ÑÑ€ÑгÑÑл \= -CollectEarthWindow.13 = ЭкÑпортын CSV өгөгдөл -CollectEarthWindow.14 = Start SAIKU дүн шинжилгÑÑ -CollectEarthWindow.15 = Үл хөдлөх хөрөнгө -CollectEarthWindow.16 = туÑламж -CollectEarthWindow.17 = Disclaimer -CollectEarthWindow.18 = мÑдÑÑллийн Ñанд Ñураггүй алга газраа хай -CollectEarthWindow.19 = дÑлхийг цуглуулах -CollectEarthWindow.2 = Ñ…Ñл -CollectEarthWindow.20 = давхардÑан тоогоор бүртгÑлийн тоо\: -CollectEarthWindow.21 = гол хүрÑÑ Ð´Ò¯Ñ€Ñийг олж чадахгүй байна -CollectEarthWindow.22 = Ð¥ÑÑ€Ñв та цуглуулж дÑлхийг хаах Ñ…Ò¯ÑÑж байгаа гÑдÑгт итгÑлтÑй байна уу? Цонхыг хаах нь цуглуулж ДÑлхий Ñервер хаах болно
-CollectEarthWindow.23 = батлах Ñ…ÑÑ€ÑгтÑй -CollectEarthWindow.24 = XML ЭкÑпортын -CollectEarthWindow.25 = Та Ñмар ч байÑан ÑдгÑÑÑ€ бүртгÑлийг нÑмÑÑ…, таны одоогийн мÑдÑÑллийг алдах Ñ…Ò¯ÑÑж байна уу? -CollectEarthWindow.26 = Оператор -CollectEarthWindow.27 = шинÑчлÑÑ… -CollectEarthWindow.28 = <б> ÐÑÑлттÑй Foris оператор мÑдÑÑллийг хөрвүүлÑн ойлгох бол ДÑлхий Ñервер ажиллаж байх Ñ‘Ñтой цуглуулна. -CollectEarthWindow.29 = Saiku Ñерверийг тохируулаагүй байна. -CollectEarthWindow.3 = \ Импорт алдаа -CollectEarthWindow.30 = Та Google Earth ашиглаж байгаа бол ÑÐ½Ñ Ñ†Ð¾Ð½Ñ… нÑÑлттÑй байлгах уу. -CollectEarthWindow.31 = ЭкÑпортын CSV файлд мÑдÑÑллийг цуглуулÑан -CollectEarthWindow.32 = Quit -CollectEarthWindow.33 = операторын нÑÑ€ 5 Ñ‚ÑмдÑгтүүд болон 50 богино бодвол илүү урт байх Ñ‘Ñтой -CollectEarthWindow.34 = Баталгаажуулалт алдаа -CollectEarthWindow.35 = OPERATOR нÑÑ€ хооÑон \! Зар операторын нÑÑ€ бөглөх болон "шинÑчлÑÑ…" товчийг дарна уу. -CollectEarthWindow.36 = Оператор нÑÑ€ хооÑон байж болохгүй -CollectEarthWindow.37 = нÑÑлттÑй байлга -CollectEarthWindow.38 = CSV файлууд -CollectEarthWindow.39 = Ðнхааруулга\: Ð­Ð½Ñ Ð½ÑŒ зүйтÑй та нөөцлөх-ап таны одоогийн өгөгдөл (XML нь ЭкÑпортын) ÑˆÐ¸Ð½Ñ Ð¼ÑдÑÑллийг импортлогч өмнө -CollectEarthWindow.4 = ÐҮБ-ын ХХÐÐБ Disclaimer зар -CollectEarthWindow.40 Тодорхой хүртÑл \= Saiku Server Ð¥ÑÑ€ÑгÑÑл цÑÑÑн дотрооÑ> баÑлагт> ÐарийвчилÑан таб-д ÑуулгаÑан байна Ñ…Ð°Ð²Ñ‚Ð°Ñ Ð·Ð°Ð¼Ñ‹Ð³. -CollectEarthWindow.41 = Хадгаламж файл уруу өгөгдөл ÑкÑпортолÑон\: -CollectEarthWindow.42 = Quit -CollectEarthWindow.43 = ЗөрчилтÑй бүртгÑл олдлоо -CollectEarthWindow.44 = МÑдÑÑллийн Импорт / ЭкÑпортын -XML гÑж CollectEarthWindow.45 \= ЭкÑпортын мÑдÑÑ (шахÑан) -Zip-Ð°Ð°Ñ CollectEarthWindow.46 \= Импортын ÑˆÐ¸Ð½Ñ Ð¼ÑдÑÑ (шахÑан XML) -CSV ашиглан CollectEarthWindow.55 \= шинÑчлÑÑ… одоогийн бүртгÑл -CollectEarthWindow.47 = Saiku Ñерверийг тохируулаагүй бол -CollectEarthWindow.48 = Zip / цуглуулах-өгөгдлийн файлууд -CollectEarthWindow.49 = Fusion CSV файлууд -CollectEarthWindow.5 = Хаах -CollectEarthWindow.50 = ÐÑÑлттÑй Ñ…ÑÑ€ÑглÑгчийн гарын авлага -Цуглуулж дÑлхийн шинÑчлÑлтүүдийн хувьд CollectEarthWindow.51 \= шалгах -CollectEarthWindow.52 = ÐÑÑлттÑй Application нÑвтрÑÑ… Файлын -CollectEarthWindow.53 = цуглуулах ДÑлхий нÑвтрÑÑ… файл -KML нь CollectEarthWindow.54 \= ачааллын оноо -CollectEarthWindow.56 = тухай ... -CollectEarthWindow.57 = Saiku гарааны үйл Ñвц одоо ч ажиллаж байгаа, түр хүлÑÑÐ½Ñ Ò¯Ò¯. -CollectEarthWindow.58 = Saiku шинжилгÑÑг Ñхлүүлж чадахгүй -CollectEarthWindow.59 = Ð¥ÑÑ€Ñв та Saiku дүн шинжилгÑÑ Ñ…Ð¸Ð¹Ñ… мÑдÑÑллийн Ñанг дахин бий болгох Ñ…Ò¯ÑÑж байна уу?
Ð­Ð½Ñ Ò¯Ð¹Ð» Ñвц нь цаг хугацаа шаардÑан ажил байж болох юм.
Та хамгийн Ñүүлийн үеийн нь "YES" ÑˆÐ¸Ð½Ñ Ð´Ð°Ñ‚Ð°Ñетийн дÑÑÑ€ товшино уу мÑдÑÑллийг бий болно. -Fusion Ð¥Ò¯ÑнÑгт нь CollectEarthWindow.6 \= ЭкÑпортын -CollectEarthWindow.60 = Saiku мÑдÑÑ Ò¯ÐµÐ¸Ð¹Ð½ -CollectEarthWindow.61 = ЭкÑпортын XML өгөгдөл (Ñүүлийн ÑкÑпортын хойш өөрчлөгдÑөн бүртгÑл) -CollectEarthWindow.62 = тухай ... -CollectEarthWindow.63 = Ðлдаа KML авÑан оноо авах -CollectEarthWindow.64 = техникийн дÑмжлÑг үзүүлÑÑ… -CollectEarthWindow.7 = алдаа мÑдÑÑлÑл импортлох -CollectEarthWindow.8 = Disclaimer текÑÑ‚ олж чадахгүй байна -CollectEarthWindow.9 = оруулÑан мÑдÑÑллийг өөрийн мÑдÑÑллийн Ñанд нь байгаа бичлÑгийг агуулж байдаг. -DynamicsCode.0 = ЭхлÑÑд ой -DynamicsCode.1 = ЭхлÑÑд БÑлчÑÑрийн -DynamicsCode.2 = ЭхлÑÑд шийдвÑрлÑÑ… -DynamicsCode.3 = ЭхлÑÑд Otherland -DynamicsCode.4 = ЭхлÑÑд Ð£Ñ Ð½Ð°Ð¼Ð³Ð°Ñ€Ñ…Ð°Ð³ газрын -DynamicsCode.5 = ЭхлÑÑд Тариалангийн -OpenTextFileListener.0 = текÑÑ‚ файл олж байÑан юм\: -OptionWizard.0 = ДÑлхий Ñонголт цуглуулах -OptionWizard.1 = Хөтөч Ñонгоно уу -OptionWizard.10 = ÐÑÑлттÑй нөөц Ñ…Ð°Ð²Ñ‚Ð°Ñ -OptionWizard.11 = Тодорхойгүй\: ашиглах ifconfig -OptionWizard.12 = Ð¥ÑÑ€ÑглÑгч шатны -OptionWizard.13 = ДÑлхий Server IP цуглуулах -OptionWizard.14 = ДÑлхий Server портыг (жишÑÑ Ð½ÑŒ\: 8023) цуглуулах -OptionWizard.15 = Save & өөрчлөлт хийх -OptionWizard.16 = ID -OptionWizard.17 = X-coord -OptionWizard.18 = Y-coord -OptionWizard.19 = Elevation -OptionWizard.2 = урÑгал даÑгалын (Ñервер / үйлчлүүлÑгч) - OptionWizard.20 \= Google Earth агуулга нь өөрчлөгдÑөн байна.
Ðгуулга нь ачаалах хүлÑÑн авна уу та Google Earth-ÑÑÑ Ð°Ñуух үед. -OptionWizard.21 = шинÑчлÑÑ… амжилттай -OptionWizard.22 = Ð¥Ñвгий -OptionWizard.23 = дахин нÑÑÑ… Google Earth мÑдÑÑллийг үед алдаа гарлаа -OptionWizard.24 = Болих -OptionWizard.25 = үйл ажиллагааны горим -OptionWizard.26 = DB хоÑÑ‚ -OptionWizard.27 = Ð­Ð½Ñ Ð½ÑŒ хүлÑÑн зөвшөөрөгдÑөн Saiku Folder (ÑхлÑÑ… saiku.bat файл байхгүй бол) ороогүй байна -OptionWizard.28 = Saiku Server хүлÑÑн зөвшөөрөөгүй -OptionWizard.29 = DB порт -OptionWizard.3 = Server шатны -OptionWizard.30 = SQLite Ñонголт -OptionWizard.31 = ЖишÑÑ Ð¼ÑдÑÑлÑл -OptionWizard.32 = Plot зохион байгуулалт -OptionWizard.33 = Ñудалгаа тодорхойлолт -OptionWizard.34 = ÐарийвчилÑан -OptionWizard.35 = түүвÑÑ€ цÑгийн тоо -OptionWizard.36 = (метр) дÑÑж авах цÑгийн хоорондох зай -(Метр) ДÑÑж авах цÑгүүд OptionWizard.95 \= Side -OptionWizard.38 = CSV / CED файлыг зөв уншиж чадахгүй байгаа файлыг
иймÑрхүү таÑлалаар туÑгаарлаж утгыг байх төлөвтÑй байна\:.
<Б> -OptionWizard.39 = ID, YCoordinate, XCoordinate, өндрийн, налуу, тал -OptionWizard.4 = Одоогийн компьютерийн IP\: -OptionWizard.40 = төÑлүүд -OptionWizard.41 = ÑˆÐ¸Ð½Ñ Ñ‚Ó©Ñөл файлыг ачаалж -OptionWizard.42 = Ðлдаа CSV уншигч хаах -Судалгааны OptionWizard.43 \= нÑÑ€ -OptionWizard.44 = автоматаар нөөцлөх хүртÑл өгөгдлийн Ñан дÑÑÑ€ -OptionWizard.45 = ÐÑÑлттÑй Earth Engine талбай талбай руу томруулÑан -талбай мÑдÑÑлÑл / CSV файлыг ced нь OptionWizard.49 \= зам -Харин Google Earth-ийн браузер дÑÑÑ€ OptionWizard.48 \= ÐÑÑлттÑй Ñ…ÑлбÑÑ€ (ЛинукÑд зориулÑан байлгахыг зөвлөдөг) -OptionWizard.5 = цуглуулах ДÑлхий Server портыг\: -OptionWizard.50 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... -OptionWizard.51 = Ðлдаа импортлох төÑөл файл -Зөвхөн координат нь OptionWizard.52 \= CSV / CED файл -OptionWizard.53 = талбай -OptionWizard.54 = Төв цÑг нь -OptionWizard.55 = Ðлдаа импортлох төÑөл Ñ…Ð°Ð²Ñ‚Ð°Ñ -OptionWizard.56 = ачааллын төÑөл -OptionWizard.57 = Өмнө нь дуудагддаг төÑөл -OptionWizard.58 = ÐÑÑлттÑй Gee тоглоомын талбай (Trusted Tester хандах шаардлагатай) -OptionWizard.59 = ÐÑÑлттÑй Энд Maps газар дÑÑÑ€ анхаарлаа хандуулж -OptionWizard.6 = PostgreSQL DB параметрүүд -OptionWizard.65 = Saiku хавтÑанд зам -OptionWizard.66 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... -OptionWizard.67 = Firefox гүйцÑтгÑгдÑÑ… нь зам -OptionWizard.68 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... -OptionWizard.7 = Ð¥ÑÑ€ÑглÑгчийн нÑÑ€ -OptionWizard.70 = гүйцÑтгÑгдÑÑ… файлууд -OptionWizard.72 = Хоёртын файлууд -OptionWizard.73 = Chrome гүйцÑтгÑгдÑÑ… нь зам -OptionWizard.74 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... -OptionWizard.76 = гүйцÑтгÑгдÑÑ… файлууд -OptionWizard.78 = Хоёртын файлууд -OptionWizard.79 = KML Freemarker загварт зам -OptionWizard.8 = Ðууц үг -OptionWizard.80 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... -OptionWizard.82 = Freemarker загвар -OptionWizard.83 = HTML бөмбөлөг Ñ…ÑлбÑÑ€ дизайн зам -OptionWizard.84 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... -OptionWizard.86 = HTML вÑб Ñ…ÑƒÑƒÐ´Ð°Ñ -OptionWizard.87 = IDM тодорхойлолт нь XML нь зам -OptionWizard.88 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... -OptionWizard.9 = DB нÑÑ€ -OptionWizard.90 = XML IDM тодорхойлолт -OptionWizard.91 = Server (менежер хувилбар, ÑÑвÑл дангаараа ашиглах нь) -OptionWizard.92 = Ð¥ÑÑ€ÑглÑгч (оператор / Ñервер уруу холбогдÑон) -OptionWizard.93 = SQLite (Embedded / нÑг файл дÑÑÑ€ тулгуурлаÑан) -OptionWizard.94 = PostgreSQL -SaikuAnalysisListener.0 = Тийм - СÑргÑÑÑ… Saiku мÑдÑÑлÑл (урт үйл Ñвц) -SaikuAnalysisListener.1 = Үгүй - ЗүгÑÑÑ€ л Saiku ÑхлÑÑ… -SaikuStarter.1 Saiku ÑхлÑн \= -SaikuStarter.2 Saiku ÑхлÑн зарим нÑг минут үргÑлжилж болох \= түр хүлÑÑÐ½Ñ Ò¯Ò¯ \! -SaveEarthDataServlet.0 = ХооÑон Ñ…Ò¯ÑÑлт -SaveEarthDataServlet.1 = ÐÑуудлын мÑдÑÑллийн Ñанд мÑдÑÑлÑл Ñ…ÑмнÑÑ… гарлаа -SaveEarthDataServlet.2 = өгөгдөл хадгалÑан байна -SlopeCode.0 = Хавтгай (0-5) -EarthApp.11 = дÑлхий аль Ñ…Ñдийн ажиллаж байгаа цуглуулах -EarthApp.21 хашааны ÑүлжÑÑ Ð°Ð³ÑƒÑƒÐ»Ñан файлыг \= а CSV / CED ÑонгоÑон зам олж чадаагүй байна гÑж\:
<би> -EarthApp.23 = Ямар ч CSV / CED файл тохируулга байна\:

-EarthApp.24 = KML тодорхойлолт нь Freemarker загварыг агуулÑан файлыг ÑонгоÑон замаар олж ороогүй байна\:
<би> -EarthApp.26 = Ямар ч KML тодорхойлолт файл тохируулга байна\:

-EarthApp.27 = HTML бөмбөлөг Ñ…ÑлбÑрийг агуулÑан файлыг ÑонгоÑон замаар олж ороогүй байна\:
<би> -EarthApp.29 = Ямар ч HTML бөмбөлөг файл тохируулга байна\:

-EarthApp.3 = дараа нь надад Ñануул -EarthApp.30 = Ð¥ÑÑ€ÑгÑÑл цÑÑÑн дотрооÑ> Properties цÑÑ Ñ„Ð°Ð¹Ð»Ñ‹Ð½ байршлыг зөв оруулна уу. -EarthApp.4 = шинÑчлÑÑ… Одоо -EarthApp.5 = намайг дахин Ñануулах байхгүй юу -EarthApp.57 = <б> цуглуулж ДÑлхий боломжтой -ийн ÑˆÐ¸Ð½Ñ Ñ…ÑƒÐ²Ð¸Ð»Ð±Ð°Ñ€ байна\! Ð¥ÑÑ€Ñв та Ñ…ÑрхÑн цааш Ñ…Ò¯ÑÑж байна вÑ?
-EarthApp.58 = шинÑчлÑÑ… бөгөөд дохио авах байрлуулах -EarthApp.59 = Ðлдаа төÑөл файлыг импортлох -EarthApp.6 = \ - Хувилбар -EarthApp.61 = цуглуулж ДÑлхий файл, нÑÑлттÑй байж чадÑангүй.
Google Earth ÑуулгаÑан ÑÑÑхийг шалгана уу. -EarthSurveyService.9 = талбар шаардлагатай -ExportActionListener.1 = ÑхлÑн ÑкÑпортын Records-руу огноо Ñонгох -ExportDialogProcessMonitor.0 = боловÑруулах мÑдÑÑ ... -ExportDialogProcessMonitor.1 = үйл Ñвцыг Ñхлүүлж хүлÑÑж байна\: -ExportDialogProcessMonitor.4 = ÑкÑпортлох бүртгÑл\: -ImportProcessMonitorDialog.0 = Импортын бүртгÑл\: -ImportActionListener.0 = бүрÑн дүүрÑн чадаагүй байна талбайд өгөгдлийн импортын Ñ‘Ñтой юу? -ImportActionListener.2 = Та дарна бол <и> <б> NO бүх өгөгдлийг агуулÑан "ногоон" төлөвт талбайд, зөвхөн өгөгдөл оруулÑан болно. -ImportActionListener.3 = Импорт Ð±ÑƒÑ Ð±Ð¾Ð»Ð¾Ð²ÑруулÑан бүртгÑл -ImportDialogProcessMonitor.0 = ТООЦОЖ бичлÑгүүдийн ImportDialogProcessMonitor.11 \= Эхний дугаар\: -ImportDialogProcessMonitor.2 = бүртгÑл импортлож байна ... -Импортын бүртгÑл ImportDialogProcessMonitor.5 \= бодит тоо\: -ImportDialogProcessMonitor.8 = боловÑруулах мÑдÑÑ ... -InfiniteProgressMonitor.0 = ажиллагааг Cancel -JFileChooserExistsAware.0 = ДÑлхий төÑөл файлыг цуглуулах -KmlImportService.13 = тулд талбай байршлыг хадгалахын тулд CSV файлыг Ñонгоно уу -Database дÑÑÑ€ нь байхгүй хашааны-ий тухай мÑдÑÑлÑл авах бол MissingPlotsListener.0 \= алдаа -MissingPlotsListener.1 = хайж байна газрууд -MissingPlotsListener.10 = дÑÑж дизайн талбайд нийт тоо\: -MissingPlotsListener.12 = алга хашааны тоо\: -MissingPlotsListener.14 = мÑдÑÑлÑл талбай дүүрÑн байдаг \! -MissingPlotsListener.2 = Хуулах Бал нь агуулга -MissingPlotsListener.3 = Та бүх мÑдÑÑлÑл ирÑÑн дүүрÑн байÑан ÑÑÑхийг мÑдÑхийг Ñ…Ò¯ÑÑж байгаа нь хуйвалдаан мÑдÑÑлÑл (.csv ÑÑвÑл .ced файлууд) агуулÑан файлуудыг Ñонгоорой. -MissingPlotsListener.4 = хайж байна талбай - мÑдÑÑлÑл -MissingPlotsListener.5 Ñ„Ð°Ð¹Ð»Ð°Ð°Ñ \=\: -CED файлд MissingPlotsListener.6 \= ЭкÑпортын -мөр нь Ñ…Ñд Ñ…ÑдÑн ProcessMonitorDialog.1 \= магадлах алдаа -ProcessMonitorDialog.4 = багана -ProcessMonitorDialog.5 = \ - утгууд \ No newline at end of file +AboutDialog.19=Ocorreu um problema +AboutDialog.5=Para mais informações visite nosso site OpenForis.org +AboutDialog.6=Desculpe, um problema ocorreu ao tentar abrir esse link no seu navegador padrão. +AboutDialog.8=Ok +AspectCode.0=Norte +AspectCode.1=Nordeste +AspectCode.2=Leste +AspectCode.3=Sudeste +AspectCode.4=Sul +AspectCode.5=Sudoeste +AspectCode.6=Oeste +AspectCode.7=Noroeste +CollectEarthMenu.0=Importar Arquivo CEP +CollectEarthMenu.2=Utilidades +CollectEarthMenu.3=Separar arquivo CSV em partes +CollectEarthMenu.4=Exportar dados para XML (da data específica até o tempo presente) +CollectEarthMenu.5=Exportar para Collect Backup +CollectEarthMenu.6=Exportar dados como Collect Backup (todos os dados) +CollectEarthMenu.7=Exportar dados como Collect Backup (a partir de uma data) +CollectEarthMenu.8=Exportar dados para XML (filtrar por atributo) +CollectEarthWindow.0=Erro ao tentar exportar os dados para um arquivo CSV +CollectEarthWindow.10=Arquivo +CollectEarthWindow.11=Fechar +CollectEarthWindow.12=Ferramentas +CollectEarthWindow.13=Baixar dados para CSV (Excel) +CollectEarthWindow.14=Iniciar Análise SAIKU +CollectEarthWindow.15=Propiedades +CollectEarthWindow.16=Ajuda +CollectEarthWindow.17=Declaração +CollectEarthWindow.18=Encontrar parcelas ausentes em banco de dados +CollectEarthWindow.19=Collect Earth +CollectEarthWindow.1=Erro ao exportar +CollectEarthWindow.20=Número de registros duplicados\: +CollectEarthWindow.21=Não foi possível encontrar o ícone para a janela principal +CollectEarthWindow.22=Tem certeza de querer fechar Collect Earth?
Ao fechar a janela será fechada também o servidor de Collect Earth +CollectEarthWindow.23=Confirmação requerida +CollectEarthWindow.24=Exportar a XML +CollectEarthWindow.25=Quer importar estes registros de qualquer maneira e perder o seus dados atuais? +CollectEarthWindow.26=Operador +CollectEarthWindow.27=Atualizar +CollectEarthWindow.28=O servidor Open Foris Collect Earth deve estar em execução enquanto o operador interprete os dados. +CollectEarthWindow.29=O servidor Saiku não está configurado. +CollectEarthWindow.2=Idioma +CollectEarthWindow.30=Por favor mantenha esta janela aberta enquanto estiver usando o Google Earth. +CollectEarthWindow.31=Exportar os dados coletados para um arquivo CSV +CollectEarthWindow.32=Fechar +CollectEarthWindow.33=O nome do operador deve ser maior de que 5 caracteres e mais curto do que 50 +CollectEarthWindow.34= Erro de Validação +CollectEarthWindow.35=NOME DO OPERADOR VAZIO\!
Preencha o nome do operador e clique no botão "Atualizar". +CollectEarthWindow.36=Nome do operador não pode estar vazio +CollectEarthWindow.37=Permanecer Aberto +CollectEarthWindow.38=Arquivos de CSV +CollectEarthWindow.39=AVISO\:Se recomenda de fazer um back-up dos seus dados atuais(Exportar para XML) antes de importar os novos dados +CollectEarthWindow.3=\ Erro ao importar dados. +CollectEarthWindow.40=Configurar caminho para o arquivo onde o Servidor Saiku se encontra instalado em Ferramentas->Propiedades->Avançado. +CollectEarthWindow.41=Guardar dados exportados para o arquivo\: +CollectEarthWindow.42=Sair +CollectEarthWindow.43=Registros repetidos detectados +CollectEarthWindow.44=Importar/Exportar +CollectEarthWindow.45=Exportar dados para XML (comprimidos) +CollectEarthWindow.46=Importar novos dados do ZIP (XML comprimidos) +CollectEarthWindow.47=Servidor Saiku não configurado +CollectEarthWindow.48=Arquivos ZIP +CollectEarthWindow.49=Arquivos Fusion CSV +CollectEarthWindow.4=Isenção de responsabilidade da FAO +CollectEarthWindow.50=Abrir Manual de Usuário +CollectEarthWindow.51=Verificar atualizações de Collect Earth +CollectEarthWindow.52=Abrir Arquivo de Registro da aplicação +CollectEarthWindow.53=Arquivo de Registro de Collect Earth +CollectEarthWindow.54=Carregar pontos de KML +CollectEarthWindow.55=Atualizar registros atuais usando CSV +CollectEarthWindow.56=Sobre... +CollectEarthWindow.57=O processo de arranque de Saiku ainda está em execução, por favor aguarde. +CollectEarthWindow.58=Não é possível iniciar a análise com Saiku +CollectEarthWindow.59=Quer voltar a gerar o conjunto de dados para o análise de Saiku?
Este processo pode demorar vários minutos.
Se clicar em "SIM" um novo conjunto de dados com a mais recente informação será gerada. +CollectEarthWindow.5=Fechar +CollectEarthWindow.60=Geraço de dados para Saiku +CollectEarthWindow.61=Exportar dados para XML (apenas os registros adicionados/modificados) +CollectEarthWindow.62=Sobre... +CollectEarthWindow.63=Erro acessando pontos de KML +CollectEarthWindow.64=Suporte Técnico +CollectEarthWindow.65=O nome do operador foi alterado +CollectEarthWindow.66=Nome do operador +CollectEarthWindow.67=Abra a pasta de dados do CE +CollectEarthWindow.6=Exportar dados a Fusion Table +CollectEarthWindow.70=Abra o manuel desta pesquisa +CollectEarthWindow.71=Gerar ferramenta Saiku Independente +CollectEarthWindow.7=Erro ao importar os dados +CollectEarthWindow.8=Texto de isenção não foi possivel de ser encontrado +CollectEarthWindow.9=Os dados importados contém registros que já estão presentes no seu banco de dados. +DynamicsCode.0=Inicialmente Floresta +DynamicsCode.1=Inicialmente Ãrea de Pastagem +DynamicsCode.2=Inicialmente Ãrea Urbana +DynamicsCode.3=Inicialmente Outros +DynamicsCode.4=Inicialmente Ãrea Alagada +DynamicsCode.5=Inicialmente Ãrea Agrícola +EarthApp.11=Collect Earth já está em execução +EarthApp.21=O arquivo contendo o gride de pontos como CSV/CED não foi encontrado no caminho selecionado\:
+EarthApp.23=Nenhum arquivo CSV/CED foi configurado \:

+EarthApp.24=O arquivo contendo o modelo Freemarker com a definição KML não foi encontrado no caminho selecionado \:
+EarthApp.26=Nenhum arquivo de definição KML foi configurado \:

+EarthApp.27=O arquivo contendo o formato balão HTML não foi encontrado no caminho selecionado \:
+EarthApp.29=Nenhum arquivo balão HTML foi configurado \:

+EarthApp.30=Por favor corrija a localização do arquivo no menu Ferramentas->Propriedades. +EarthApp.3=Lembrar mais tarde +EarthApp.4=Atualizar Agora +EarthApp.57=Existe uma nova versão do Collect Earth disponível\!
Como gostaria de proceder? +EarthApp.58=Alerta de Atualização +EarthApp.59=Erro ao importar aquivo do projeto +EarthApp.5=Não me lembre novamente +EarthApp.61=O arquivo do Collect Earth não pôde ser aberto.
Por favor certifique-se que Google Earth esteja instalado. +EarthApp.6= - Versão +EarthApp.70=AVISO +EarthApp.71=No Mac OS X, os arquivos do projeto Collect Earth (* .cep) não serão abertos no Collect Earth quando forem clicados duas vezes.
+EarthApp.72=Use a barra de ferramentas Collect Earth para abrir os arquivos .cep \: +EarthApp.73=Collect Earth - problemas em computadores Mac OS X +EarthSurveyService.9=Campo obrigatório +ExportActionListener.1=Escolha data a partir da qual queira exportar os dados +ExportDialogProcessMonitor.0=Processando os dados... +ExportDialogProcessMonitor.1=Esperando de inicializar o processo \: +ExportDialogProcessMonitor.4=Registros importados \: +ImportActionListener.0=Deseja importar os dados das parcelas que não tenham sido completamente preenchidos? +ImportActionListener.2=Se clicar NÃO apenas os dados das parcelas em estado completo ("verde"), serão importados. +ImportActionListener.3=Importar registros incompletos +ImportDialogProcessMonitor.0=\ CALCULANDO +ImportDialogProcessMonitor.11=Cifra inicial de registros \: +ImportDialogProcessMonitor.2=Importando registros.... +ImportDialogProcessMonitor.5=Cifra final de registros importados \: +ImportDialogProcessMonitor.8=Processando dados... +ImportProcessMonitorDialog.0=Imported records \: +ImportXMLDialogProcessMonitor.1 = Substitua dados no banco de dados +ImportXMLDialogProcessMonitor.2 = Importe apenas registros não conflitantes +InfiniteProgressMonitor.0=Cancelar operação +JFileChooserExistsAware.0=Arquivo de projeto Collect Earth +KmlImportService.13=Selecione um arquivo CSV para salvar a localização dos pontos +MissingPlotsListener.0=Erro ao obter informação sobre parcelas ausentes na Base de Dados +MissingPlotsListener.10=Número total de ppontos no desenho de amostragem \: +MissingPlotsListener.12=Número de pontos perdidos \: +MissingPlotsListener.14=Todos os pontos foram preenchidos\! +MissingPlotsListener.1=Parcelas ausentes +MissingPlotsListener.2=Copiar conteúdos +MissingPlotsListener.3=Escolha os arquivos contendo informação sobre as parcelas ( .csv or .ced files ) para os quais deseja saber se todos os dados foram preenchidos. +MissingPlotsListener.4=Parcelas ausentes - informação +MissingPlotsListener.5=Do arquivo \: +MissingPlotsListener.6=Exportar para arquivo CED +NO=Não +NO_TO_ALL=Não para todos +OpenTextFileListener.0=O arquivo de texto não foi encontrado em \: +OptionWizard.0=Opções do Collect Earth +OptionWizard.100=Abrir Planet +OptionWizard.101=Llave da API do Planet +OptionWizard.1021=URL SecureWatch +OptionWizard.102=Abrir Maxar SecureWatch +OptionWizard.103=Configure o URL para o Mapa Extra (abre quando configurado) \: +OptionWizard.104=Navegadores +OptionWizard.105=Abrir Earth Map +OptionWizard.110=Use imagens mensais fornecidas pela NICFI +OptionWizard.10=Abrir arquivo de backup +OptionWizard.11=Desconhecido\: usar ifconfig +OptionWizard.12=Cliente Instância +OptionWizard.13=Collect Earth Server IP +OptionWizard.14=Collect Earth Porta de Servidor (p.ex. 8023) +OptionWizard.15=Guardar & Aplicar alteraçães +OptionWizard.16=ID +OptionWizard.17=X-coord +OptionWizard.18=Y-coord +OptionWizard.19=Elevação +OptionWizard.1=Escolher Navegador +OptionWizard.20= Os conteúdos de Google Earth foram alterados.
Por favor aceite a regarga do conteúdo uma vez que Google Earth lhe pergunte. +OptionWizard.21=Atualizado com sucesso +OptionWizard.22=Relevo +OptionWizard.23=Houve um erro ao reabrir os dados de Google Earth +OptionWizard.24=Cancelar +OptionWizard.25=Modo de Operação +OptionWizard.26=BBDD servidor +OptionWizard.27=Isto não é um Arquivo Saiku reconhecível (o arquivo start-saiku.bat não se encontra presente) +OptionWizard.28=Servidor Saiku não reconhecível +OptionWizard.29=BBDD porta +OptionWizard.2=Tipo de uso(servidor/cliente) +OptionWizard.30=Opçães SQLite +OptionWizard.31=Dados de amostra +OptionWizard.32=Disposição da Parcela +OptionWizard.33=Definiço de Questionários +OptionWizard.34=Serviços Integrados +OptionWizard.35=Número de pontos de control +OptionWizard.36=Distância entre os pontos de control (em metros) +OptionWizard.37=Margem com o perímetro da parcela (em metros) +OptionWizard.38=O arquivo CSV/CED não foi possivel ser lido corretamente.
O arquivo deve conter valores separados por vírgulas do seguinte modo\:
+OptionWizard.39=ID,Y-Coordenada,X-Coordenada,elevação,relevo,orientação +OptionWizard.3=Servidor Instance +OptionWizard.40=Projetos +OptionWizard.41=Carregar um novo arquivo de projeto +OptionWizard.42=Erro ao fechar o leitor CSV +OptionWizard.43=Nome do questionário +OptionWizard.44=Realizar automaticamente backup do banco de dados em +OptionWizard.45=Abrir Earth Engine Playground (descontinuado) +OptionWizard.46=Abrir Earth Engine Timelapse +OptionWizard.47=Abrir Bing Maps +OptionWizard.48=Abrir formulário em um navegador externo em vez de Google Earth (recomendado para LINUX) +OptionWizard.49=Caminho do arquivo CED/CSV com as coordenadas das parcelas +OptionWizard.4=IP do computador atual\: +OptionWizard.50=Navegar.. +OptionWizard.51=Erro ao importar os arquivos do projeto +OptionWizard.52= Arquivo CSV/CED com coordinadas +OptionWizard.53=Sem pontos +OptionWizard.54=Ponto Central +OptionWizard.55=Erro ao importar diretório do projeto +OptionWizard.56=Carregar projeto +OptionWizard.57=Projetos previamente carregados +OptionWizard.58=Abrir GEE Code Editor (requer acesso ao Trusted Tester) +OptionWizard.59=Abrir Here Maps focado no ponto +OptionWizard.5= Collect Earth Servidor porto\: +OptionWizard.65=Caminho para arquivo Saiku +OptionWizard.66=Navegar... +OptionWizard.67=Caminho para o executável do Firefox +OptionWizard.68=Navegar... +OptionWizard.6=Parâmetros BD PostgreSQL +OptionWizard.70=Arquivos executáveis +OptionWizard.72=Arquivos binários +OptionWizard.73=Caminho para o executável do Chrome +OptionWizard.74=Navegar... +OptionWizard.76=Arquivos executáveis +OptionWizard.78=Arquivos binarios +OptionWizard.79=Caminho para o padrão de KML Freemarker +OptionWizard.7=Nome de Usuário +OptionWizard.80=Navegar... +OptionWizard.82=Padrão Freemarker +OptionWizard.83=Caminho para formulário HTML Balloon +OptionWizard.84=Navegar... +OptionWizard.86=Pagina web HTML +OptionWizard.87=Caminho para XML com definição IDM +OptionWizard.88=Navegar... +OptionWizard.8=Senha +OptionWizard.90=Definiço XML IDM +OptionWizard.91=Servidor (versão para gerente ou uso autônomo) +OptionWizard.92=Cliente (operador/conectado ao servidor) +OptionWizard.93=SQLite (Embutido/com base em um único arquivo) +OptionWizard.94=PostgreSQL +OptionWizard.95=Side of the sampling dots (in meters) +OptionWizard.9= Nome da Base de Dados +ProcessMonitorDialog.1=Erro de análise na linha número +ProcessMonitorDialog.4=, colunas +ProcessMonitorDialog.5= -- valores +SaikuAnalysisListener.0=Sim - Atualizar dados Saiku (longo processo) +SaikuAnalysisListener.1=Não - Use a mesma versão dos dados da última vez que o Saiku foi usado +SaikuToolExportListener.1=Geração da ferramenta Saiku +SaikuToolExportListener.2=Gerando a Ferramenta Saiku com o banco de dados atual +SaikuStarter.1=Iniciando Saiku +SaikuStarter.2=Iniciando Saiku pode demorar uns minutos, por favor aguarde\! +SaveEarthDataServlet.0=Sem dados +SaveEarthDataServlet.1=Problema ocorreu ao guardar os dados na Base de Dados +SaveEarthDataServlet.2=Os dados foram guardados +SlopeCode.0=Plano (0-5) +YES=Sim +YES_TO_ALL=Sim a todas \ No newline at end of file From 0c09f463f728a804645981e941b886d2c061fa56 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:35:05 +0100 Subject: [PATCH 0769/1620] New translations Messages_tr.properties (French) --- .../earth/app/view/Messages_fr.properties | 487 +++++++++--------- 1 file changed, 237 insertions(+), 250 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index c2ce51b7bd..c9742c724a 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,255 +1,242 @@ -AboutDialog.19=Ocorreu um problema -AboutDialog.5=Para mais informações visite nosso site OpenForis.org -AboutDialog.6=Desculpe, um problema ocorreu ao tentar abrir esse link no seu navegador padrão. -AboutDialog.8=Ok -AspectCode.0=Norte -AspectCode.1=Nordeste -AspectCode.2=Leste -AspectCode.3=Sudeste -AspectCode.4=Sul -AspectCode.5=Sudoeste -AspectCode.6=Oeste -AspectCode.7=Noroeste -CollectEarthMenu.0=Importar Arquivo CEP -CollectEarthMenu.2=Utilidades -CollectEarthMenu.3=Separar arquivo CSV em partes -CollectEarthMenu.4=Exportar dados para XML (da data específica até o tempo presente) -CollectEarthMenu.5=Exportar para Collect Backup -CollectEarthMenu.6=Exportar dados como Collect Backup (todos os dados) -CollectEarthMenu.7=Exportar dados como Collect Backup (a partir de uma data) -CollectEarthMenu.8=Exportar dados para XML (filtrar por atributo) -CollectEarthWindow.0=Erro ao tentar exportar os dados para um arquivo CSV -CollectEarthWindow.10=Arquivo -CollectEarthWindow.11=Fechar -CollectEarthWindow.12=Ferramentas -CollectEarthWindow.13=Baixar dados para CSV (Excel) -CollectEarthWindow.14=Iniciar Análise SAIKU -CollectEarthWindow.15=Propiedades -CollectEarthWindow.16=Ajuda -CollectEarthWindow.17=Declaração -CollectEarthWindow.18=Encontrar parcelas ausentes em banco de dados +AboutDialog.19=Bir sorun oluştu +AboutDialog.5=Daha fazla bilgi için web sitemizi ziyaret edin OpenForis.org +AboutDialog.6=Üzgünüm, sisteminizin varsayılan tarayıcısı bu bağlantıyı açmak isterken bir sorun oluştu. +AboutDialog.8=Tamam +AspectCode.0=Kuzey +AspectCode.1=Kuzey-doğu +AspectCode.2=Doğu +AspectCode.3=Güney-doğu +AspectCode.4=Güney +AspectCode.5=Güney-batı +AspectCode.6=Batı +AspectCode.7=Kuzey-batı +CollectEarthWindow.0=Veri CSV dosyasına aktarılmaya çalışılırken hata oluştu +CollectEarthWindow.1=Dışa aktarma hatası +CollectEarthWindow.10=Dosya +CollectEarthWindow.11=Çıkış +CollectEarthWindow.12=Araçlar +CollectEarthWindow.13=Verileri CSV'ye aktar +CollectEarthWindow.14=SAIKU Analysis başlat +CollectEarthWindow.15=Özellikler +CollectEarthWindow.16=Yardım +CollectEarthWindow.17=Yasal uyarı +CollectEarthWindow.18=Veritabnında eksik plotları bulun CollectEarthWindow.19=Collect Earth -CollectEarthWindow.1=Erro ao exportar -CollectEarthWindow.20=Número de registros duplicados\: -CollectEarthWindow.21=Não foi possível encontrar o ícone para a janela principal -CollectEarthWindow.22=Tem certeza de querer fechar Collect Earth?
Ao fechar a janela será fechada também o servidor de Collect Earth -CollectEarthWindow.23=Confirmação requerida -CollectEarthWindow.24=Exportar a XML -CollectEarthWindow.25=Quer importar estes registros de qualquer maneira e perder o seus dados atuais? -CollectEarthWindow.26=Operador -CollectEarthWindow.27=Atualizar -CollectEarthWindow.28=O servidor Open Foris Collect Earth deve estar em execução enquanto o operador interprete os dados. -CollectEarthWindow.29=O servidor Saiku não está configurado. -CollectEarthWindow.2=Idioma -CollectEarthWindow.30=Por favor mantenha esta janela aberta enquanto estiver usando o Google Earth. -CollectEarthWindow.31=Exportar os dados coletados para um arquivo CSV -CollectEarthWindow.32=Fechar -CollectEarthWindow.33=O nome do operador deve ser maior de que 5 caracteres e mais curto do que 50 -CollectEarthWindow.34= Erro de Validação -CollectEarthWindow.35=NOME DO OPERADOR VAZIO\!
Preencha o nome do operador e clique no botão "Atualizar". -CollectEarthWindow.36=Nome do operador não pode estar vazio -CollectEarthWindow.37=Permanecer Aberto -CollectEarthWindow.38=Arquivos de CSV -CollectEarthWindow.39=AVISO\:Se recomenda de fazer um back-up dos seus dados atuais(Exportar para XML) antes de importar os novos dados -CollectEarthWindow.3=\ Erro ao importar dados. -CollectEarthWindow.40=Configurar caminho para o arquivo onde o Servidor Saiku se encontra instalado em Ferramentas->Propiedades->Avançado. -CollectEarthWindow.41=Guardar dados exportados para o arquivo\: -CollectEarthWindow.42=Sair -CollectEarthWindow.43=Registros repetidos detectados -CollectEarthWindow.44=Importar/Exportar -CollectEarthWindow.45=Exportar dados para XML (comprimidos) -CollectEarthWindow.46=Importar novos dados do ZIP (XML comprimidos) -CollectEarthWindow.47=Servidor Saiku não configurado -CollectEarthWindow.48=Arquivos ZIP -CollectEarthWindow.49=Arquivos Fusion CSV -CollectEarthWindow.4=Isenção de responsabilidade da FAO -CollectEarthWindow.50=Abrir Manual de Usuário -CollectEarthWindow.51=Verificar atualizações de Collect Earth -CollectEarthWindow.52=Abrir Arquivo de Registro da aplicação -CollectEarthWindow.53=Arquivo de Registro de Collect Earth -CollectEarthWindow.54=Carregar pontos de KML -CollectEarthWindow.55=Atualizar registros atuais usando CSV -CollectEarthWindow.56=Sobre... -CollectEarthWindow.57=O processo de arranque de Saiku ainda está em execução, por favor aguarde. -CollectEarthWindow.58=Não é possível iniciar a análise com Saiku -CollectEarthWindow.59=Quer voltar a gerar o conjunto de dados para o análise de Saiku?
Este processo pode demorar vários minutos.
Se clicar em "SIM" um novo conjunto de dados com a mais recente informação será gerada. -CollectEarthWindow.5=Fechar -CollectEarthWindow.60=Geraço de dados para Saiku -CollectEarthWindow.61=Exportar dados para XML (apenas os registros adicionados/modificados) -CollectEarthWindow.62=Sobre... -CollectEarthWindow.63=Erro acessando pontos de KML -CollectEarthWindow.64=Suporte Técnico -CollectEarthWindow.65=O nome do operador foi alterado -CollectEarthWindow.66=Nome do operador -CollectEarthWindow.67=Abra a pasta de dados do CE -CollectEarthWindow.6=Exportar dados a Fusion Table -CollectEarthWindow.70=Abra o manuel desta pesquisa -CollectEarthWindow.71=Gerar ferramenta Saiku Independente -CollectEarthWindow.7=Erro ao importar os dados -CollectEarthWindow.8=Texto de isenção não foi possivel de ser encontrado -CollectEarthWindow.9=Os dados importados contém registros que já estão presentes no seu banco de dados. -DynamicsCode.0=Inicialmente Floresta -DynamicsCode.1=Inicialmente Ãrea de Pastagem -DynamicsCode.2=Inicialmente Ãrea Urbana -DynamicsCode.3=Inicialmente Outros -DynamicsCode.4=Inicialmente Ãrea Alagada -DynamicsCode.5=Inicialmente Ãrea Agrícola -EarthApp.11=Collect Earth já está em execução -EarthApp.21=O arquivo contendo o gride de pontos como CSV/CED não foi encontrado no caminho selecionado\:
-EarthApp.23=Nenhum arquivo CSV/CED foi configurado \:

-EarthApp.24=O arquivo contendo o modelo Freemarker com a definição KML não foi encontrado no caminho selecionado \:
-EarthApp.26=Nenhum arquivo de definição KML foi configurado \:

-EarthApp.27=O arquivo contendo o formato balão HTML não foi encontrado no caminho selecionado \:
-EarthApp.29=Nenhum arquivo balão HTML foi configurado \:

-EarthApp.30=Por favor corrija a localização do arquivo no menu Ferramentas->Propriedades. -EarthApp.3=Lembrar mais tarde -EarthApp.4=Atualizar Agora -EarthApp.57=Existe uma nova versão do Collect Earth disponível\!
Como gostaria de proceder? -EarthApp.58=Alerta de Atualização -EarthApp.59=Erro ao importar aquivo do projeto -EarthApp.5=Não me lembre novamente -EarthApp.61=O arquivo do Collect Earth não pôde ser aberto.
Por favor certifique-se que Google Earth esteja instalado. -EarthApp.6= - Versão -EarthApp.70=AVISO -EarthApp.71=No Mac OS X, os arquivos do projeto Collect Earth (* .cep) não serão abertos no Collect Earth quando forem clicados duas vezes.
-EarthApp.72=Use a barra de ferramentas Collect Earth para abrir os arquivos .cep \: -EarthApp.73=Collect Earth - problemas em computadores Mac OS X -EarthSurveyService.9=Campo obrigatório -ExportActionListener.1=Escolha data a partir da qual queira exportar os dados -ExportDialogProcessMonitor.0=Processando os dados... -ExportDialogProcessMonitor.1=Esperando de inicializar o processo \: -ExportDialogProcessMonitor.4=Registros importados \: -ImportActionListener.0=Deseja importar os dados das parcelas que não tenham sido completamente preenchidos? -ImportActionListener.2=Se clicar NÃO apenas os dados das parcelas em estado completo ("verde"), serão importados. -ImportActionListener.3=Importar registros incompletos -ImportDialogProcessMonitor.0=\ CALCULANDO -ImportDialogProcessMonitor.11=Cifra inicial de registros \: -ImportDialogProcessMonitor.2=Importando registros.... -ImportDialogProcessMonitor.5=Cifra final de registros importados \: -ImportDialogProcessMonitor.8=Processando dados... -ImportProcessMonitorDialog.0=Imported records \: -ImportXMLDialogProcessMonitor.1 = Substitua dados no banco de dados -ImportXMLDialogProcessMonitor.2 = Importe apenas registros não conflitantes -InfiniteProgressMonitor.0=Cancelar operação -JFileChooserExistsAware.0=Arquivo de projeto Collect Earth -KmlImportService.13=Selecione um arquivo CSV para salvar a localização dos pontos -MissingPlotsListener.0=Erro ao obter informação sobre parcelas ausentes na Base de Dados -MissingPlotsListener.10=Número total de ppontos no desenho de amostragem \: -MissingPlotsListener.12=Número de pontos perdidos \: -MissingPlotsListener.14=Todos os pontos foram preenchidos\! -MissingPlotsListener.1=Parcelas ausentes -MissingPlotsListener.2=Copiar conteúdos -MissingPlotsListener.3=Escolha os arquivos contendo informação sobre as parcelas ( .csv or .ced files ) para os quais deseja saber se todos os dados foram preenchidos. -MissingPlotsListener.4=Parcelas ausentes - informação -MissingPlotsListener.5=Do arquivo \: -MissingPlotsListener.6=Exportar para arquivo CED -NO=Não -NO_TO_ALL=Não para todos -OpenTextFileListener.0=O arquivo de texto não foi encontrado em \: -OptionWizard.0=Opções do Collect Earth -OptionWizard.100=Abrir Planet -OptionWizard.101=Llave da API do Planet -OptionWizard.1021=URL SecureWatch -OptionWizard.102=Abrir Maxar SecureWatch -OptionWizard.103=Configure o URL para o Mapa Extra (abre quando configurado) \: -OptionWizard.104=Navegadores -OptionWizard.105=Abrir Earth Map -OptionWizard.110=Use imagens mensais fornecidas pela NICFI -OptionWizard.10=Abrir arquivo de backup -OptionWizard.11=Desconhecido\: usar ifconfig -OptionWizard.12=Cliente Instância -OptionWizard.13=Collect Earth Server IP -OptionWizard.14=Collect Earth Porta de Servidor (p.ex. 8023) -OptionWizard.15=Guardar & Aplicar alteraçães +CollectEarthWindow.2=Dil +CollectEarthWindow.20=Kopyalanan kayıt sayısı\: +CollectEarthWindow.21=Ana bilgisayar için simge bulunamadı +CollectEarthWindow.22=Collect Earth'ü kapatmak istediğinizden emin misiniz?
Pencereyi kapatmanız durumunda Collect Earth sunucusunu da kapatır. +CollectEarthWindow.23=Onay gerekiyor +CollectEarthWindow.24=XML Dışa aktar +CollectEarthWindow.25=Mevcut verileriniz kaybolacak yine de bu kayıtları eklemek istiyor musunuz? +CollectEarthWindow.26=Operatör +CollectEarthWindow.27=Güncelle +CollectEarthWindow.28=Operatör, verileri değerlendirirken Open Foris Collect Earth sunucusu çalışmalıdır. +CollectEarthWindow.29=Saiku Sunucusu yapılandırılmadı. +CollectEarthWindow.3=İçe aktarma hatası +CollectEarthWindow.30=Lütfen Google Earth'ü kullanırken bu pencereyi açık tutun. +CollectEarthWindow.31=Toplanan verileri CSV dosyasına aktar +CollectEarthWindow.32=Vazgeç +CollectEarthWindow.33=Operatör adı 5 karakterden uzun ve 50 karakterden kısa olmalıdır +CollectEarthWindow.34=Doğrulama hatası +CollectEarthWindow.35=OPERATÖR ADI BOŞ\!
Lütfen operatör adını girin ve "Güncelle" düğmesine basın. +CollectEarthWindow.36=Operatör adı boş olamaz +CollectEarthWindow.37=Açık Tut +CollectEarthWindow.38=CSV dosyaları +CollectEarthWindow.39=DİKKAT\: Yeni verileri almadan önce mevcut verilerinizi (XML'e Aktar) yedeklemeniz önerilir. +CollectEarthWindow.4=FAO Yasal uyarı bildirimleri +CollectEarthWindow.40=Araçlar-> Özellikler-> Gelişmiş sekmesinde Saiku Sunucusunun kurulu olduğu klasörün yolunu ayarlayın. +CollectEarthWindow.41=Dışa aktarılan verileri dosyaya kaydet +CollectEarthWindow.42=Vazgeç +CollectEarthWindow.43=Yinelenen kayıtlar bulundu +CollectEarthWindow.44=Verileri İçe/Dışa aktar +CollectEarthWindow.45=Verileri XML'e aktar (Sıkıştırılmış) +CollectEarthWindow.46=Verileri ZIP'ten içe aktar (sıkıştırılmış XML) +CollectEarthWindow.55=CSV kullanarak mevcut kayıtları güncelle +CollectEarthWindow.47=Saiku Sunucusu yapılandırılmadı +CollectEarthWindow.48=Zip/collect-data dosyası +CollectEarthWindow.49=Fusion table CSV dosyası +CollectEarthWindow.5=Kapat +CollectEarthWindow.50=Kullanım Kılavuzunu Aç +CollectEarthWindow.51=Collect Earth güncellemelerini kontrol et +CollectEarthWindow.52=Uygulama Günlüğünü Aç +CollectEarthWindow.53=Collect Earth Günlüğü +CollectEarthWindow.54=Noktaları KML'den yükle +CollectEarthWindow.56=Hakkında... +CollectEarthWindow.57=Saiku başlatıcısı işlemi hala devam ediyor, lütfen bekleyin. +CollectEarthWindow.58=Saiku analysis başlatılamıyor +CollectEarthWindow.59=Saiku analizi için veri setini yeniden oluşturmak ister misiniz?
Bu iÅŸlem zaman alabilir.
"EVET" üzerine tıklarsanız, en son bilgileri içeren yeni bir veri seti oluşturulur. +CollectEarthWindow.6=Fusion Table'a aktar +CollectEarthWindow.60=Saiku veri üretimi +CollectEarthWindow.61=Verileri XML'e aktar (Son dışa aktarımdan bu yana değiştirilmiş kayıtlar) +CollectEarthWindow.62=Hakkında... +CollectEarthWindow.63=Noktalar KML'den alırken hata oluştu +CollectEarthWindow.64=Teknik Destek +CollectEarthWindow.7=Veri içe aktarılırken hata oluştu +CollectEarthWindow.8=Yasal uyarı metni bulunamadı +CollectEarthWindow.9=Alınan veriler veritabanında zaten mevcut olan kayıtları içerir. +CollectEarthWindow.65=Operatör adı değiştirildi +CollectEarthWindow.66=Operatör adı +CollectEarthWindow.70=Anket rehberini aç +DynamicsCode.0=Başlangıçta Orman +DynamicsCode.1=Başlangıçta Mera +DynamicsCode.2=Başlangıçta Yerleşim +DynamicsCode.3=Başlangıçta Diğer +DynamicsCode.4=Başlangıçta Sulak +DynamicsCode.5=Başlangıçta Tarım +OpenTextFileListener.0=Metin dosyası bulunamadı \: +OptionWizard.0=Collect Earth seçenekler +OptionWizard.1=Tarayıcı Seç +OptionWizard.10=Yedekleme klasörünü aç +OptionWizard.11=Blinmeyen\: yapılandırma kullanımı +OptionWizard.12=İstemci durumu +OptionWizard.13=Collect Earth Sunucu IP +OptionWizard.14=Collect Earth sunucu girişi (örn. 8023) +OptionWizard.15=Kaydet & Değişiklikleri uygula OptionWizard.16=ID OptionWizard.17=X-coord OptionWizard.18=Y-coord -OptionWizard.19=Elevação -OptionWizard.1=Escolher Navegador -OptionWizard.20= Os conteúdos de Google Earth foram alterados.
Por favor aceite a regarga do conteúdo uma vez que Google Earth lhe pergunte. -OptionWizard.21=Atualizado com sucesso -OptionWizard.22=Relevo -OptionWizard.23=Houve um erro ao reabrir os dados de Google Earth -OptionWizard.24=Cancelar -OptionWizard.25=Modo de Operação -OptionWizard.26=BBDD servidor -OptionWizard.27=Isto não é um Arquivo Saiku reconhecível (o arquivo start-saiku.bat não se encontra presente) -OptionWizard.28=Servidor Saiku não reconhecível -OptionWizard.29=BBDD porta -OptionWizard.2=Tipo de uso(servidor/cliente) -OptionWizard.30=Opçães SQLite -OptionWizard.31=Dados de amostra -OptionWizard.32=Disposição da Parcela -OptionWizard.33=Definiço de Questionários -OptionWizard.34=Serviços Integrados -OptionWizard.35=Número de pontos de control -OptionWizard.36=Distância entre os pontos de control (em metros) -OptionWizard.37=Margem com o perímetro da parcela (em metros) -OptionWizard.38=O arquivo CSV/CED não foi possivel ser lido corretamente.
O arquivo deve conter valores separados por vírgulas do seguinte modo\:
-OptionWizard.39=ID,Y-Coordenada,X-Coordenada,elevação,relevo,orientação -OptionWizard.3=Servidor Instance -OptionWizard.40=Projetos -OptionWizard.41=Carregar um novo arquivo de projeto -OptionWizard.42=Erro ao fechar o leitor CSV -OptionWizard.43=Nome do questionário -OptionWizard.44=Realizar automaticamente backup do banco de dados em -OptionWizard.45=Abrir Earth Engine Playground (descontinuado) -OptionWizard.46=Abrir Earth Engine Timelapse -OptionWizard.47=Abrir Bing Maps -OptionWizard.48=Abrir formulário em um navegador externo em vez de Google Earth (recomendado para LINUX) -OptionWizard.49=Caminho do arquivo CED/CSV com as coordenadas das parcelas -OptionWizard.4=IP do computador atual\: -OptionWizard.50=Navegar.. -OptionWizard.51=Erro ao importar os arquivos do projeto -OptionWizard.52= Arquivo CSV/CED com coordinadas -OptionWizard.53=Sem pontos -OptionWizard.54=Ponto Central -OptionWizard.55=Erro ao importar diretório do projeto -OptionWizard.56=Carregar projeto -OptionWizard.57=Projetos previamente carregados -OptionWizard.58=Abrir GEE Code Editor (requer acesso ao Trusted Tester) -OptionWizard.59=Abrir Here Maps focado no ponto -OptionWizard.5= Collect Earth Servidor porto\: -OptionWizard.65=Caminho para arquivo Saiku -OptionWizard.66=Navegar... -OptionWizard.67=Caminho para o executável do Firefox -OptionWizard.68=Navegar... -OptionWizard.6=Parâmetros BD PostgreSQL -OptionWizard.70=Arquivos executáveis -OptionWizard.72=Arquivos binários -OptionWizard.73=Caminho para o executável do Chrome -OptionWizard.74=Navegar... -OptionWizard.76=Arquivos executáveis -OptionWizard.78=Arquivos binarios -OptionWizard.79=Caminho para o padrão de KML Freemarker -OptionWizard.7=Nome de Usuário -OptionWizard.80=Navegar... -OptionWizard.82=Padrão Freemarker -OptionWizard.83=Caminho para formulário HTML Balloon -OptionWizard.84=Navegar... -OptionWizard.86=Pagina web HTML -OptionWizard.87=Caminho para XML com definição IDM -OptionWizard.88=Navegar... -OptionWizard.8=Senha -OptionWizard.90=Definiço XML IDM -OptionWizard.91=Servidor (versão para gerente ou uso autônomo) -OptionWizard.92=Cliente (operador/conectado ao servidor) -OptionWizard.93=SQLite (Embutido/com base em um único arquivo) +OptionWizard.19=Yükseklik +OptionWizard.2=İş akışı (sunucu/istemci) +OptionWizard.20=Google Earth içerikleri değiştirildi.
Lütfen Google Earth tarafından istendiğinde içeriğin yeniden yüklenmesini kabul edin. +OptionWizard.21=Güncelleme başarılı +OptionWizard.22=Eğim +OptionWizard.23=Google Earth verilerini yeniden açarken bir hata oluştu +OptionWizard.24=İptal +OptionWizard.25=İşlem Modu +OptionWizard.26=DB host +OptionWizard.27=Bu tanınmış bir Saiku klasörü değil ( start-saiku.bat dosyası mevcut değil) +OptionWizard.28=Saiku Sunucusu tanınmadı +OptionWizard.29=DB port +OptionWizard.3=Sunucu örneği +OptionWizard.30=SQLite seçenekleri +OptionWizard.31=Örnek veri +OptionWizard.32=Plot düzeni +OptionWizard.33=Anket Tanımı +OptionWizard.34=Gelişmiş +OptionWizard.35=Kontrol noktası sayısı +OptionWizard.36=Kontrol noktaları arasındaki mesafe (metre cinsinden) +OptionWizard.37=Plot kenarı ile mesafesi (metre cinsinden) +OptionWizard.38=CSV / CED dosyası doğru okunamıyor.
Dosyanın böyle bir virgülle ayrılmış değerlere sahip olması beklenir \:
+OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect +OptionWizard.4=Geçerli bilgisayar IP'si \: +OptionWizard.40=Projeler +OptionWizard.41=Yeni bir proje dosyası yükle +OptionWizard.42=CSV okuyucuyu kapatırken hata oluştu +OptionWizard.43=Anketin adı +OptionWizard.44=veritabanını otomatik olarak yedekle +OptionWizard.45=Earth Engine plot alanına yakınlaştırarak aç +OptionWizard.46=Plot alanı için Earth Engine Timelapse'yi aç +OptionWizard.47=Plot alanı için Bing Maps'i aç +OptionWizard.48=Formu Google Earth yerine bir tarayıcıda aç (LINUX için önerilir) +OptionWizard.49=Plot verisini içeren ced / csv dosyasının yolu +OptionWizard.5=Collect Earth Sunucu girişi\: +OptionWizard.50=Tarayıcı... +OptionWizard.51=Proje dosyası içe aktarılırken hata oluştu +OptionWizard.52=Yalnızca koordinatlara sahip CSV / CED dosyası +OptionWizard.53=Puan yok +OptionWizard.54=Merkez noktası +OptionWizard.55=Proje dosyası içe aktarılırken hata oluştu +OptionWizard.56=Proje yükle +OptionWizard.57=Önceden yüklenmiş projeler +OptionWizard.58=GEE Kod Düzenleyicisini açın (Güvenilir Test Cihazı erişimi gerektirir) +OptionWizard.59=Plot üzerinde Here Maps'i aç +OptionWizard.6=PostgreSQL DB parametreleri +OptionWizard.65=Saiku klasör yolu +OptionWizard.66=Tarayıcı... +OptionWizard.67=Firefox kısayol yolu +OptionWizard.68=Tarayıcı... +OptionWizard.7=Kullanıcı adı +OptionWizard.70=Kısayol dosyaları +OptionWizard.72=İkili dosyalar +OptionWizard.73=Chrome kısayol yolu +OptionWizard.74=Tarayıcı... +OptionWizard.76=Kısayol dosyaları +OptionWizard.78=İkili dosyalar +OptionWizard.79=KML işaretçi şablonu yolu +OptionWizard.8=Parola +OptionWizard.80=Tarayıcı... +OptionWizard.82=İşaretçi şablonu +OptionWizard.83=Form tasarımının HTML balon yolu +OptionWizard.84=Tarayıcı... +OptionWizard.86=HTML web sayfası +OptionWizard.87=IDM tanımıyla XML yolu +OptionWizard.88=Tarayıcı... +OptionWizard.9=DB Adı +OptionWizard.90=XML IDM tanımlama +OptionWizard.91=Sunucu (yönetici sürümü veya tek başına kullanım) +OptionWizard.92=İstemci (operatör/sunucuya bağlı) +OptionWizard.93=SQLite (Gömülü / tek dosya tabanlı) OptionWizard.94=PostgreSQL -OptionWizard.95=Side of the sampling dots (in meters) -OptionWizard.9= Nome da Base de Dados -ProcessMonitorDialog.1=Erro de análise na linha número -ProcessMonitorDialog.4=, colunas -ProcessMonitorDialog.5= -- valores -SaikuAnalysisListener.0=Sim - Atualizar dados Saiku (longo processo) -SaikuAnalysisListener.1=Não - Use a mesma versão dos dados da última vez que o Saiku foi usado -SaikuToolExportListener.1=Geração da ferramenta Saiku -SaikuToolExportListener.2=Gerando a Ferramenta Saiku com o banco de dados atual -SaikuStarter.1=Iniciando Saiku -SaikuStarter.2=Iniciando Saiku pode demorar uns minutos, por favor aguarde\! -SaveEarthDataServlet.0=Sem dados -SaveEarthDataServlet.1=Problema ocorreu ao guardar os dados na Base de Dados -SaveEarthDataServlet.2=Os dados foram guardados -SlopeCode.0=Plano (0-5) -YES=Sim -YES_TO_ALL=Sim a todas \ No newline at end of file +OptionWizard.95=Örnekleme noktalarının kenarı (metre olarak) +SaikuAnalysisListener.0=Evet - Saiku verilerini yenile (uzun işlem) +SaikuAnalysisListener.1=Hayır - Sadece Saiku'yu başlat +SaikuStarter.1=Saiku başlatılıyor +SaikuStarter.2=Saiku başlatılıyor birkaç dakika sürebilir, lütfen bekleyin \! +SaveEarthDataServlet.0=Boş istek +SaveEarthDataServlet.1=Veriyi veritabanına kaydederken sorun oluştu +SaveEarthDataServlet.2=Veri kaydedildi +SlopeCode.0=Düz (0-5) +EarthApp.11=Collect Earth zaten çalışıyor +EarthApp.21=Plotlara ait seçili CSV/CED grid dosyası bulunamadı \:
+EarthApp.23=CSV/CED dosyası ayarlanmadı \:

+EarthApp.24=İşaretçi şablonunu KML tanımına sahip dosya seçili yolda bulunamadı \:
+EarthApp.26=KML tanım dosyası ayarlanmadı \:

+EarthApp.27=HTML balon formunu içeren dosya seçili yolda bulunamadı \:
+EarthApp.29=Hiçbir HTML balon dosyası oluşturulmadı \:

+EarthApp.3=Daha Sonra Hatırlat +EarthApp.30=Lütfen Araçlar-> Özellikler menüsünden dosya konumunu düzeltin.. +EarthApp.4=Şimdi Güncelle +EarthApp.5=Tekrar hatırlatma +EarthApp.57=Collect Earth'ün yeni bir sürümü var\!
Nasıl devam etmek istiyorsun? +EarthApp.58=Güncelleme uyarısı +EarthApp.59=Proje dosyasını içe aktarırken hata oluştu +EarthApp.6=\ - Versiyon +EarthApp.61=Collect Earth dosyası açılamadı.
Lütfen Google Earth’ün kurulu olduğundan emin olun. +EarthSurveyService.9=Alan gerekli +ExportActionListener.1=Kayıtların Gönderileceği Tarihi Seç +ExportDialogProcessMonitor.0=Veri işleniyor... +ExportDialogProcessMonitor.1=İşlemi başlatmak için bekleniyor \: +ExportDialogProcessMonitor.4=Dışa aktarılan kayıtlar \: +ImportProcessMonitorDialog.0=İçe aktarılan kayıtlar \: +ImportActionListener.0=Doldurulmamış plotlar içe aktarılsın mı? +ImportActionListener.2=Eğer tıklarsanız NO sadece tüm verileri içeren "yeşil" durumdaki plotlar içe aktarılacaktır. +ImportActionListener.3=Bitmemiş kayıtları içe aktar +ImportDialogProcessMonitor.0=\ HESAPLANIYOR +ImportDialogProcessMonitor.11=İlk kayıt sayısı \: +ImportDialogProcessMonitor.2=Kayıtlar içe aktarılıyor... +ImportDialogProcessMonitor.5=Güncel içe aktarılan kayıt sayısı \: +ImportDialogProcessMonitor.8=Veri işleniyor... +InfiniteProgressMonitor.0=İşlemi iptal et +JFileChooserExistsAware.0=Collect Earth Proje dosya +KmlImportService.13=Konumları kaydetmek için CSV dosyası seçin +MissingPlotsListener.0=Veritabanında bulunmayan plotlar hakkında bilgi alınırken hata oluştu +MissingPlotsListener.1=Eksik plotlar +MissingPlotsListener.10=Örnekleme tasarımındaki toplam plotların sayısı \: +MissingPlotsListener.12=Eksik plotların sayısı \: +MissingPlotsListener.14=Bütün plotlar dolu\! +MissingPlotsListener.2=İçeriği panoya kopyala +MissingPlotsListener.3=Tüm verilerin doldurulup doldurulmadığını öğrenmek istediğiniz plot bilgilerini (.csv veya .ced dosyaları) içeren dosyaları seçin. +MissingPlotsListener.4=Eksik plotlar - Bilgi +MissingPlotsListener.5=Dosyadan \: +MissingPlotsListener.6=CED dosyasına aktar +ProcessMonitorDialog.1=Satır numarasında ayrıştırma hatası +ProcessMonitorDialog.4=, sütunlar +ProcessMonitorDialog.5=\ -- değerler + +ImportXMLDialogProcessMonitor.1 = Verilerin üzerine yaz +ImportXMLDialogProcessMonitor.2 = Sadece yinelenmeyen plotları içe aktar + +YES=Evet +YES_TO_ALL=Tümüne evet +NO=Hayır +NO_TO_ALL=Tümüne hayır + +CollectEarthMenu.0=CEP dosyasını içe aktar +CollectEarthMenu.2=Hizmetler +CollectEarthMenu.3=Büyük CSV plot dosyalarını böl +CollectEarthMenu.4=Verileri XML'e aktar (belirli bir tarihten itibaren) +CollectEarthMenu.5=Collect yedeği için dışa aktar +CollectEarthMenu.6=Collect Backup verilerini dışa aktar (tüm veriler) +CollectEarthMenu.7=Collect Backup verilerini dışa aktar (belirli bir tarihten itibaren) +CollectEarthMenu.8=Verileri XML'e aktar (özet özniteliğine göre filtrele) \ No newline at end of file From ec59ef4dce591bfb932306dfaec1a05ac1b3c410 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:35:06 +0100 Subject: [PATCH 0770/1620] New translations Messages_lo.properties (French) --- .../earth/app/view/Messages_fr.properties | 462 +++++++++--------- 1 file changed, 220 insertions(+), 242 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index c9742c724a..e5b9bd9e45 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,242 +1,220 @@ -AboutDialog.19=Bir sorun oluştu -AboutDialog.5=Daha fazla bilgi için web sitemizi ziyaret edin OpenForis.org -AboutDialog.6=Üzgünüm, sisteminizin varsayılan tarayıcısı bu bağlantıyı açmak isterken bir sorun oluştu. -AboutDialog.8=Tamam -AspectCode.0=Kuzey -AspectCode.1=Kuzey-doğu -AspectCode.2=Doğu -AspectCode.3=Güney-doğu -AspectCode.4=Güney -AspectCode.5=Güney-batı -AspectCode.6=Batı -AspectCode.7=Kuzey-batı -CollectEarthWindow.0=Veri CSV dosyasına aktarılmaya çalışılırken hata oluştu -CollectEarthWindow.1=Dışa aktarma hatası -CollectEarthWindow.10=Dosya -CollectEarthWindow.11=Çıkış -CollectEarthWindow.12=Araçlar -CollectEarthWindow.13=Verileri CSV'ye aktar -CollectEarthWindow.14=SAIKU Analysis başlat -CollectEarthWindow.15=Özellikler -CollectEarthWindow.16=Yardım -CollectEarthWindow.17=Yasal uyarı -CollectEarthWindow.18=Veritabnında eksik plotları bulun -CollectEarthWindow.19=Collect Earth -CollectEarthWindow.2=Dil -CollectEarthWindow.20=Kopyalanan kayıt sayısı\: -CollectEarthWindow.21=Ana bilgisayar için simge bulunamadı -CollectEarthWindow.22=Collect Earth'ü kapatmak istediğinizden emin misiniz?
Pencereyi kapatmanız durumunda Collect Earth sunucusunu da kapatır. -CollectEarthWindow.23=Onay gerekiyor -CollectEarthWindow.24=XML Dışa aktar -CollectEarthWindow.25=Mevcut verileriniz kaybolacak yine de bu kayıtları eklemek istiyor musunuz? -CollectEarthWindow.26=Operatör -CollectEarthWindow.27=Güncelle -CollectEarthWindow.28=Operatör, verileri değerlendirirken Open Foris Collect Earth sunucusu çalışmalıdır. -CollectEarthWindow.29=Saiku Sunucusu yapılandırılmadı. -CollectEarthWindow.3=İçe aktarma hatası -CollectEarthWindow.30=Lütfen Google Earth'ü kullanırken bu pencereyi açık tutun. -CollectEarthWindow.31=Toplanan verileri CSV dosyasına aktar -CollectEarthWindow.32=Vazgeç -CollectEarthWindow.33=Operatör adı 5 karakterden uzun ve 50 karakterden kısa olmalıdır -CollectEarthWindow.34=Doğrulama hatası -CollectEarthWindow.35=OPERATÖR ADI BOŞ\!
Lütfen operatör adını girin ve "Güncelle" düğmesine basın. -CollectEarthWindow.36=Operatör adı boş olamaz -CollectEarthWindow.37=Açık Tut -CollectEarthWindow.38=CSV dosyaları -CollectEarthWindow.39=DİKKAT\: Yeni verileri almadan önce mevcut verilerinizi (XML'e Aktar) yedeklemeniz önerilir. -CollectEarthWindow.4=FAO Yasal uyarı bildirimleri -CollectEarthWindow.40=Araçlar-> Özellikler-> Gelişmiş sekmesinde Saiku Sunucusunun kurulu olduğu klasörün yolunu ayarlayın. -CollectEarthWindow.41=Dışa aktarılan verileri dosyaya kaydet -CollectEarthWindow.42=Vazgeç -CollectEarthWindow.43=Yinelenen kayıtlar bulundu -CollectEarthWindow.44=Verileri İçe/Dışa aktar -CollectEarthWindow.45=Verileri XML'e aktar (Sıkıştırılmış) -CollectEarthWindow.46=Verileri ZIP'ten içe aktar (sıkıştırılmış XML) -CollectEarthWindow.55=CSV kullanarak mevcut kayıtları güncelle -CollectEarthWindow.47=Saiku Sunucusu yapılandırılmadı -CollectEarthWindow.48=Zip/collect-data dosyası -CollectEarthWindow.49=Fusion table CSV dosyası -CollectEarthWindow.5=Kapat -CollectEarthWindow.50=Kullanım Kılavuzunu Aç -CollectEarthWindow.51=Collect Earth güncellemelerini kontrol et -CollectEarthWindow.52=Uygulama Günlüğünü Aç -CollectEarthWindow.53=Collect Earth Günlüğü -CollectEarthWindow.54=Noktaları KML'den yükle -CollectEarthWindow.56=Hakkında... -CollectEarthWindow.57=Saiku başlatıcısı işlemi hala devam ediyor, lütfen bekleyin. -CollectEarthWindow.58=Saiku analysis başlatılamıyor -CollectEarthWindow.59=Saiku analizi için veri setini yeniden oluşturmak ister misiniz?
Bu iÅŸlem zaman alabilir.
"EVET" üzerine tıklarsanız, en son bilgileri içeren yeni bir veri seti oluşturulur. -CollectEarthWindow.6=Fusion Table'a aktar -CollectEarthWindow.60=Saiku veri üretimi -CollectEarthWindow.61=Verileri XML'e aktar (Son dışa aktarımdan bu yana değiştirilmiş kayıtlar) -CollectEarthWindow.62=Hakkında... -CollectEarthWindow.63=Noktalar KML'den alırken hata oluştu -CollectEarthWindow.64=Teknik Destek -CollectEarthWindow.7=Veri içe aktarılırken hata oluştu -CollectEarthWindow.8=Yasal uyarı metni bulunamadı -CollectEarthWindow.9=Alınan veriler veritabanında zaten mevcut olan kayıtları içerir. -CollectEarthWindow.65=Operatör adı değiştirildi -CollectEarthWindow.66=Operatör adı -CollectEarthWindow.70=Anket rehberini aç -DynamicsCode.0=Başlangıçta Orman -DynamicsCode.1=Başlangıçta Mera -DynamicsCode.2=Başlangıçta Yerleşim -DynamicsCode.3=Başlangıçta Diğer -DynamicsCode.4=Başlangıçta Sulak -DynamicsCode.5=Başlangıçta Tarım -OpenTextFileListener.0=Metin dosyası bulunamadı \: -OptionWizard.0=Collect Earth seçenekler -OptionWizard.1=Tarayıcı Seç -OptionWizard.10=Yedekleme klasörünü aç -OptionWizard.11=Blinmeyen\: yapılandırma kullanımı -OptionWizard.12=İstemci durumu -OptionWizard.13=Collect Earth Sunucu IP -OptionWizard.14=Collect Earth sunucu girişi (örn. 8023) -OptionWizard.15=Kaydet & Değişiklikleri uygula -OptionWizard.16=ID -OptionWizard.17=X-coord -OptionWizard.18=Y-coord -OptionWizard.19=Yükseklik -OptionWizard.2=İş akışı (sunucu/istemci) -OptionWizard.20=Google Earth içerikleri değiştirildi.
Lütfen Google Earth tarafından istendiğinde içeriğin yeniden yüklenmesini kabul edin. -OptionWizard.21=Güncelleme başarılı -OptionWizard.22=Eğim -OptionWizard.23=Google Earth verilerini yeniden açarken bir hata oluştu -OptionWizard.24=İptal -OptionWizard.25=İşlem Modu -OptionWizard.26=DB host -OptionWizard.27=Bu tanınmış bir Saiku klasörü değil ( start-saiku.bat dosyası mevcut değil) -OptionWizard.28=Saiku Sunucusu tanınmadı -OptionWizard.29=DB port -OptionWizard.3=Sunucu örneği -OptionWizard.30=SQLite seçenekleri -OptionWizard.31=Örnek veri -OptionWizard.32=Plot düzeni -OptionWizard.33=Anket Tanımı -OptionWizard.34=Gelişmiş -OptionWizard.35=Kontrol noktası sayısı -OptionWizard.36=Kontrol noktaları arasındaki mesafe (metre cinsinden) -OptionWizard.37=Plot kenarı ile mesafesi (metre cinsinden) -OptionWizard.38=CSV / CED dosyası doğru okunamıyor.
Dosyanın böyle bir virgülle ayrılmış değerlere sahip olması beklenir \:
-OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect -OptionWizard.4=Geçerli bilgisayar IP'si \: -OptionWizard.40=Projeler -OptionWizard.41=Yeni bir proje dosyası yükle -OptionWizard.42=CSV okuyucuyu kapatırken hata oluştu -OptionWizard.43=Anketin adı -OptionWizard.44=veritabanını otomatik olarak yedekle -OptionWizard.45=Earth Engine plot alanına yakınlaştırarak aç -OptionWizard.46=Plot alanı için Earth Engine Timelapse'yi aç -OptionWizard.47=Plot alanı için Bing Maps'i aç -OptionWizard.48=Formu Google Earth yerine bir tarayıcıda aç (LINUX için önerilir) -OptionWizard.49=Plot verisini içeren ced / csv dosyasının yolu -OptionWizard.5=Collect Earth Sunucu girişi\: -OptionWizard.50=Tarayıcı... -OptionWizard.51=Proje dosyası içe aktarılırken hata oluştu -OptionWizard.52=Yalnızca koordinatlara sahip CSV / CED dosyası -OptionWizard.53=Puan yok -OptionWizard.54=Merkez noktası -OptionWizard.55=Proje dosyası içe aktarılırken hata oluştu -OptionWizard.56=Proje yükle -OptionWizard.57=Önceden yüklenmiş projeler -OptionWizard.58=GEE Kod Düzenleyicisini açın (Güvenilir Test Cihazı erişimi gerektirir) -OptionWizard.59=Plot üzerinde Here Maps'i aç -OptionWizard.6=PostgreSQL DB parametreleri -OptionWizard.65=Saiku klasör yolu -OptionWizard.66=Tarayıcı... -OptionWizard.67=Firefox kısayol yolu -OptionWizard.68=Tarayıcı... -OptionWizard.7=Kullanıcı adı -OptionWizard.70=Kısayol dosyaları -OptionWizard.72=İkili dosyalar -OptionWizard.73=Chrome kısayol yolu -OptionWizard.74=Tarayıcı... -OptionWizard.76=Kısayol dosyaları -OptionWizard.78=İkili dosyalar -OptionWizard.79=KML işaretçi şablonu yolu -OptionWizard.8=Parola -OptionWizard.80=Tarayıcı... -OptionWizard.82=İşaretçi şablonu -OptionWizard.83=Form tasarımının HTML balon yolu -OptionWizard.84=Tarayıcı... -OptionWizard.86=HTML web sayfası -OptionWizard.87=IDM tanımıyla XML yolu -OptionWizard.88=Tarayıcı... -OptionWizard.9=DB Adı -OptionWizard.90=XML IDM tanımlama -OptionWizard.91=Sunucu (yönetici sürümü veya tek başına kullanım) -OptionWizard.92=İstemci (operatör/sunucuya bağlı) -OptionWizard.93=SQLite (Gömülü / tek dosya tabanlı) -OptionWizard.94=PostgreSQL -OptionWizard.95=Örnekleme noktalarının kenarı (metre olarak) -SaikuAnalysisListener.0=Evet - Saiku verilerini yenile (uzun işlem) -SaikuAnalysisListener.1=Hayır - Sadece Saiku'yu başlat -SaikuStarter.1=Saiku başlatılıyor -SaikuStarter.2=Saiku başlatılıyor birkaç dakika sürebilir, lütfen bekleyin \! -SaveEarthDataServlet.0=Boş istek -SaveEarthDataServlet.1=Veriyi veritabanına kaydederken sorun oluştu -SaveEarthDataServlet.2=Veri kaydedildi -SlopeCode.0=Düz (0-5) -EarthApp.11=Collect Earth zaten çalışıyor -EarthApp.21=Plotlara ait seçili CSV/CED grid dosyası bulunamadı \:
-EarthApp.23=CSV/CED dosyası ayarlanmadı \:

-EarthApp.24=İşaretçi şablonunu KML tanımına sahip dosya seçili yolda bulunamadı \:
-EarthApp.26=KML tanım dosyası ayarlanmadı \:

-EarthApp.27=HTML balon formunu içeren dosya seçili yolda bulunamadı \:
-EarthApp.29=Hiçbir HTML balon dosyası oluşturulmadı \:

-EarthApp.3=Daha Sonra Hatırlat -EarthApp.30=Lütfen Araçlar-> Özellikler menüsünden dosya konumunu düzeltin.. -EarthApp.4=Şimdi Güncelle -EarthApp.5=Tekrar hatırlatma -EarthApp.57=Collect Earth'ün yeni bir sürümü var\!
Nasıl devam etmek istiyorsun? -EarthApp.58=Güncelleme uyarısı -EarthApp.59=Proje dosyasını içe aktarırken hata oluştu -EarthApp.6=\ - Versiyon -EarthApp.61=Collect Earth dosyası açılamadı.
Lütfen Google Earth’ün kurulu olduÄŸundan emin olun. -EarthSurveyService.9=Alan gerekli -ExportActionListener.1=Kayıtların GönderileceÄŸi Tarihi Seç -ExportDialogProcessMonitor.0=Veri iÅŸleniyor... -ExportDialogProcessMonitor.1=İşlemi baÅŸlatmak için bekleniyor \: -ExportDialogProcessMonitor.4=Dışa aktarılan kayıtlar \: -ImportProcessMonitorDialog.0=İçe aktarılan kayıtlar \: -ImportActionListener.0=Doldurulmamış plotlar içe aktarılsın mı? -ImportActionListener.2=EÄŸer tıklarsanız NO sadece tüm verileri içeren "yeÅŸil" durumdaki plotlar içe aktarılacaktır. -ImportActionListener.3=BitmemiÅŸ kayıtları içe aktar -ImportDialogProcessMonitor.0=\ HESAPLANIYOR -ImportDialogProcessMonitor.11=İlk kayıt sayısı \: -ImportDialogProcessMonitor.2=Kayıtlar içe aktarılıyor... -ImportDialogProcessMonitor.5=Güncel içe aktarılan kayıt sayısı \: -ImportDialogProcessMonitor.8=Veri iÅŸleniyor... -InfiniteProgressMonitor.0=İşlemi iptal et -JFileChooserExistsAware.0=Collect Earth Proje dosya -KmlImportService.13=Konumları kaydetmek için CSV dosyası seçin -MissingPlotsListener.0=Veritabanında bulunmayan plotlar hakkında bilgi alınırken hata oluÅŸtu -MissingPlotsListener.1=Eksik plotlar -MissingPlotsListener.10=Örnekleme tasarımındaki toplam plotların sayısı \: -MissingPlotsListener.12=Eksik plotların sayısı \: -MissingPlotsListener.14=Bütün plotlar dolu\! -MissingPlotsListener.2=İçeriÄŸi panoya kopyala -MissingPlotsListener.3=Tüm verilerin doldurulup doldurulmadığını öğrenmek istediÄŸiniz plot bilgilerini (.csv veya .ced dosyaları) içeren dosyaları seçin. -MissingPlotsListener.4=Eksik plotlar - Bilgi -MissingPlotsListener.5=Dosyadan \: -MissingPlotsListener.6=CED dosyasına aktar -ProcessMonitorDialog.1=Satır numarasında ayrıştırma hatası -ProcessMonitorDialog.4=, sütunlar -ProcessMonitorDialog.5=\ -- deÄŸerler - -ImportXMLDialogProcessMonitor.1 = Verilerin üzerine yaz -ImportXMLDialogProcessMonitor.2 = Sadece yinelenmeyen plotları içe aktar - -YES=Evet -YES_TO_ALL=Tümüne evet -NO=Hayır -NO_TO_ALL=Tümüne hayır - -CollectEarthMenu.0=CEP dosyasını içe aktar -CollectEarthMenu.2=Hizmetler -CollectEarthMenu.3=Büyük CSV plot dosyalarını böl -CollectEarthMenu.4=Verileri XML'e aktar (belirli bir tarihten itibaren) -CollectEarthMenu.5=Collect yedeÄŸi için dışa aktar -CollectEarthMenu.6=Collect Backup verilerini dışa aktar (tüm veriler) -CollectEarthMenu.7=Collect Backup verilerini dışa aktar (belirli bir tarihten itibaren) -CollectEarthMenu.8=Verileri XML'e aktar (özet özniteliÄŸine göre filtrele) \ No newline at end of file +AboutDialog.19 = ບັນ​ຫາ​ເàºàºµàº” A +AboutDialog.5 = ສà»àº²â€‹àº¥àº±àºšâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹à»€àºžàºµà»ˆàº¡â€‹à»€àº•ີມ​ໄດ້​ທີ່ OpenForis.org ເວັບ​ໄຊ​ທ​໌​ຂອງ​ພວàºâ€‹à»€àº®àº»àº² +AboutDialog.6 = ຂà»â€‹à»‚ທດ​ນà»àº²â€‹, ບັນ​ຫາ​ທີ່​ເàºàºµàº”​ຂຶ້ນ​ໃນ​ຂະ​ນະ​ທີ່​ຄວາມ​ພະ​àºàº²â€‹àºàº²àº¡â€‹àº—ີ່​ຈະ​ເປີດ​àºàº²àº™â€‹à»€àºŠàº·à»ˆàº­àº¡â€‹àº•à»à»ˆâ€‹àº™àºµà»‰â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹àº¥àº°â€‹àºšàº»àºšâ€‹àº‚ອງ​ທ່ານ​ຕົວ​ທ່ອງ​ເວັບ​ຂອງ​ມາດ​ຕະ​ຖານ​. +AboutDialog.8 = Ok +AspectCode.0 = ເຫນືອ +AspectCode.1 = ວັນ​ອອàºâ€‹àºªà»ˆàº½àº‡â€‹à»€àº«àº™àº·àº­ +AspectCode.2 = ຕາ​ເວັນ​ອອຠ+AspectCode.3 = ພາàºâ€‹à»ƒàº•້​, ຕາ​ເວັນ​ອອຠ+AspectCode.4 = ໃຕ້ +AspectCode.5 = ພາàºâ€‹à»ƒàº•້​, ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ+AspectCode.6 = ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ+AspectCode.7 = ພາàºâ€‹à»€àº«àº™àº·àº­â€‹, ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ+CollectEarthWindow.0 = ໃນ​ເວ​ລາ​ທີ່​ພະ​àºàº²â€‹àºàº²àº¡â€‹à»€àºžàº·à»ˆàº­â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌ CSVຄວາມ​ຜິດ​ພາດ +CollectEarthWindow.1 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àº +CollectEarthWindow.10 File \= +CollectEarthWindow.11 ອອàºâ€‹àºˆàº²àº \= +CollectEarthWindow.12 = ເຄື່ອງ​ມືຂà»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.13 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ CSV àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ +CollectEarthWindow.14 = Start SAIKU +CollectEarthWindow.15 = ຄຸນ​ສົມ​ບັດ +CollectEarthWindow.16 = ຊ່ວàºâ€‹à»€àº«àº¼àº·àº­ +CollectEarthWindow.17 = ປະ​ຕິ​ເສດ +CollectEarthWindow.18 = ຄົ້ນ​ຫາ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ຫາàºâ€‹à»„ປ​ໃນ​ຖານ​ຂà»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.19 = ເàºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ+CollectEarthWindow.2 = ພາ​ສາ +CollectEarthWindow.20 = ຈà»àº²â€‹àº™àº§àº™â€‹àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™ duplicated​\: +CollectEarthWindow.21 = ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ຊອàºâ€‹àº«àº² icon ສà»àº²â€‹àº¥àº±àºšâ€‹àºžàº²â€‹àº•ົ້ນ​ຕ໠+CollectEarthWindow.22 = ທ່ານ​ມີ​ຄວາມ​à»àº™à»ˆâ€‹à»ƒàºˆàº§à»ˆâ€‹àº²â€‹àº—່ານ​ຕ້ອງ​àºàº²àº™â€‹àº›àº´àº”​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹? ໃນ​àºàº²àº™â€‹àº›àº´àº”​ປ່ອງ​ຢ້ຽມ​àºàº±àº‡â€‹àºˆàº°â€‹àº›àº´àº”​ເຄື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹àº‚ອງ​ໂລàºâ€‹à»„ດ້​ເàºàº±àºšâ€‹àºà»àº² +CollectEarthWindow.23 = àºàº²àº™â€‹àº¢àº±à»‰àº‡â€‹àº¢àº·àº™â€‹àº—ີ່​ຈà»àº²â€‹à»€àº›àº±àº™ +CollectEarthWindow.24 = XML ສົ່ງ​ອອຠ+CollectEarthWindow.25 = ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ເພີ່ມ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹à»€àº«àº¼àº»à»ˆàº²â€‹àº™àºµà»‰â€‹à»àº¥à»‰àº§â€‹à»àº¥àº°â€‹àºàº²àº™â€‹àºªàº¹àº™â€‹à»€àºªàºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº‚ອງ​ທ່ານ​? +CollectEarthWindow.26 = ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™ +CollectEarthWindow.27 = ປັບ​ປຸງ +CollectEarthWindow.28 = ເຮັດ​ຢູ່​ຕ່າງ​ປະ​ເທດ​ເàºàº±àºšâ€‹àºà»àº²â€‹à»€àº„ື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹àº„ວນ​ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹à»àº¥à»ˆàº™â€‹à»ƒàº™â€‹àº‚ະ​ນະ​ທີ່​ຜູ້​ປະ​àºàº­àºšâ€‹àºàº²àº™â€‹àº•ີ​ຄວາມ​ຫມາàºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹. +CollectEarthWindow.29 = The Saiku Server ບà»à»ˆâ€‹à»„ດ້​ຖືàºâ€‹àº•ັ້ງ​. +CollectEarthWindow.3 = \ ຄວາມ​ຜິດ​ພາດ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ +CollectEarthWindow.30 = àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº®àº±àºâ€‹àºªàº²â€‹àºàº²àº™â€‹à»€àº›àºµàº”​ຫນ້າ​ຕ່າງ​ນີ້​ໃນ​ຂະ​ນະ​ທີ່​ທ່ານ​àºà»àº²â€‹àº¥àº±àº‡â€‹à»ƒàºŠà»‰â€‹àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹. +CollectEarthWindow.31 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌ CSV +CollectEarthWindow.32 = ອອຠ+CollectEarthWindow.33 = ຊື່​ຜູ້​ປະ​àºàº­àºšâ€‹àºàº²àº™â€‹àºˆàº°â€‹àº•້ອງ​ມີ​àºàº²àº™â€‹àº•à»à»ˆâ€‹à»„ປ​ອີàºâ€‹à»àº¥à»‰àº§â€‹àºâ€‹à»ˆâ€‹àº§àº² 5 ລັàºâ€‹àºªàº°â€‹àº™àº°â€‹à»àº¥àº°â€‹àºªàº±à»‰àº™â€‹àºâ€‹à»ˆâ€‹àº§àº² 50ຄວາມ​ຜິດ​ພາດ +CollectEarthWindow.34 = àºàº§àº”​ສອບ +CollectEarthWindow.35 = ຜູ້​ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹àº¥àº»àºšâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™ ​\! ຫລັàºâ€‹àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº•ື່ມ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàºªà»ˆâ€‹àºŠàº·à»ˆâ€‹àºœàº¹à»‰â€‹àº›àº°â€‹àºàº­àºšâ€‹àºàº²àº™â€‹à»àº¥àº°â€‹à»ƒàº«à»‰â€‹àºàº»àº”​ປຸ່ມ "ປັບ​ປຸງ​"​. ຊື່ +CollectEarthWindow.36 = ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹àºšà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ເປົ່າ +CollectEarthWindow.37 = ຮັàºâ€‹àºªàº²â€‹àºˆàº±àº™à»„ຟລ​໌ +CollectEarthWindow.38 = CSV +CollectEarthWindow.39 à»àºˆà»‰àº‡ \= ມັນ​ເປັນ​àºàº²àº™â€‹àºªàº»àº¡â€‹àº„ວນ​ທີ່​ທ່ານ​ໄປ​ເຖິງ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº‚ອງ​ທ່ານ (àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ XML​) àºà»ˆàº­àº™â€‹àº—ີ່​ຈະ​ໄດ້​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº«àº¡à»ˆâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ +CollectEarthWindow.4 = FAO à»àºˆà»‰àº‡â€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ເສດ +CollectEarthWindow.40 = ທີ່​àºà»àº²â€‹àº™àº»àº”​ໄວ້​ຕາມ​ເສັ້ນ​ທາງ​àºàº±àºšâ€‹à»‚ຟນ​ເດີ​ທີ່ Saiku Server ໄດ້​ຖືàºâ€‹àº•ິດ​ຕັ້ງ​ຢູ່​ໃນ Tools-> Properties-> à»àº–ບ​à»àºšàºšâ€‹àºžàº´â€‹à»€àºªàº”​ໄດ້​. +CollectEarthWindow.41 = àºàº²àº™â€‹àº›àº°â€‹àº«àºàº±àº”​àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌​\: +CollectEarthWindow.42 = ອອຠ+CollectEarthWindow.43 = àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº•à»àº²â€‹àºàº±àº™â€‹àº—ີ່​ພົບ​ເຫັນ +CollectEarthWindow.44 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ / ສົ່ງ​ອອàºàº‚à»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.45 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ XML (à»àº›â€‹)ຂà»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.46 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ໃຫມ່​ຈາàºâ€‹à»„ປ​ສະ​ນີ (XML à»àº›â€‹)àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™ +CollectEarthWindow.55 ປັບ​ປຸງ \= àºàº²àº™â€‹àº™à»àº²â€‹à»ƒàºŠà»‰ CSV +CollectEarthWindow.47 = Saiku Server ບà»à»ˆâ€‹à»„ດ້​àºà»àº²â€‹àº«àº™àº»àº” +CollectEarthWindow.48 = ໄຟລ​໌​ຫັດ​ໄປ​ສະໄຟລ​໌ +CollectEarthWindow.49 = Fusion CSV +CollectEarthWindow.5 = ປິດ +CollectEarthWindow.50 = ເປີດ​ຄູ່​ມື​àºàº²àº™â€‹à»ƒàºŠà»‰àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™â€‹àº›àº±àºšâ€‹àº›àº¸àº‡â€‹àº‚ອງ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ+CollectEarthWindow.51 CHECK \= àºàº§àº”​ສອບ +CollectEarthWindow.52 = File ເຂົ້າ​ສູ່​ລະ​ບົບ​ຄà»àº²â€‹àº®à»‰àº­àº‡â€‹àºªàº°â€‹àº«àº¡àº±àºâ€‹à»€àº›àºµàº” +CollectEarthWindow.53 = àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»€àº­â€‹àºàº°â€‹àºªàº²àº™â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹à»€àº‚ົ້າ​ສູ່​ລະ​ບົບຈຸດ +CollectEarthWindow.54 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຈາຠKMLàºà»ˆàº½àº§â€‹àºàº±àºš +CollectEarthWindow.56 = ... +CollectEarthWindow.57 = ຂະ​ບວນ​àºàº²àº™â€‹à»€àº¥àºµà»ˆàº¡â€‹àº•ົ້ນ Saiku à»àº¡à»ˆàº™â€‹àºàº±àº‡â€‹à»àº¥à»ˆàº™â€‹, àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº¥à»â€‹àº–້າ​. +CollectEarthWindow.58 = ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ເລີ່ມ​ຕົ້ນ​àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ Saiku +CollectEarthWindow.59 = ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ Re​\: àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ Saiku ໄດ້​?
ຂະ​ບວນ​àºàº²àº™â€‹àº™àºµà»‰â€‹àºªàº²â€‹àº¡àº²àº”​ໃຊ້​ເວ​ລາ​ຫຼາàº
ຖ້າ​ທ່ານ​ຄລິàºâ€‹à»ƒàºªà»ˆ "à»àº¡à»ˆàº™â€‹à»àº¥à»‰àº§â€‹" ເປັນ​ຊຸດ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໃຫມ່​ທີ່​ມີ​ຄວາມ​ຫຼ້າ​ສຸດ​ໄດ້​. ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº‚ຶ້ນ​. +CollectEarthWindow.6 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ Fusion ຕາ​ຕະ​ລາງàºàº²àº™â€‹àºœàº°â€‹àº¥àº´àº”​ຂà»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.60 = Saiku +CollectEarthWindow.61 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່ XML (àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº”ັດ​à»àºà»‰â€‹àº™àº±àºšâ€‹àº•ັ້ງ​à»àº•່​àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àºªàº¸àº”​ທ້າàºâ€‹) ສົ່ງ​ອອàºàºà»ˆàº½àº§â€‹àºàº±àºš +CollectEarthWindow.62 = ... +CollectEarthWindow.63 Error \= àºàº²àº™â€‹à»„ດ້​ຮັບ​ຈຸດ​ທີ່​ໄດ້​ຈາຠKML +CollectEarthWindow.64 = ສະ​ຫນັບ​ສະ​ຫນູນ​ທາງ​ເທàºâ€‹àº™àº´àº +CollectEarthWindow.7 Error \= ໃນ​ເວ​ລາ​ທີ່​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຂà»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.8 ຂà»à»‰â€‹àº„ວາມ​ປະ​ຕິ​ເສດ \= ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ພົບ​ເຫັນ +CollectEarthWindow.9 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໄດ້​ນà»àº²â€‹à»€àº‚ົ້າ​ມາ​ປະ​àºàº­àºšâ€‹àº”້ວàºâ€‹àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àº—ີ່​ມີ​ຢູ່​à»àº¥à»‰àº§â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚ອງ​ທ່ານ​. +DynamicsCode.0 = ປ່າ​ໄມ້​ໃນ​ເບື້ອງ​ຕົ້ນ +DynamicsCode.1 = ທົ່ງ​ຫàºà»‰àº²â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ +DynamicsCode.2 = àºàº²àº™â€‹àº•ັ້ງ​ຖິ່ນ​ຖານ​ໃນ​ເບື້ອງ​ຕົ້ນ +DynamicsCode.3 = ເບື້ອງ​ຕົ້ນ Otherland +DynamicsCode.4 = ຊຸ່ມ​ນ​້​à»àº²â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ +DynamicsCode.5 = ເບື້ອງ​ຕົ້ນ Cro​​pland +OpenTextFileListener.0 = ໄຟລ​໌​ຂà»à»‰â€‹àº„ວາມ​à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹à»„ດ້​ພົບ​ໄດ້​ທີ່​\:àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +OptionWizard.0 = ທາງ​ເລືອàºâ€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ+OptionWizard.1 = ເລືອàºâ€‹àº‚ອງ​ຕົວ​ທ່ອງ​ເວັບ +OptionWizard.10 = ໂຟ​ເດີ​ສà»àº²â€‹àº®àº­àº‡â€‹àºˆàº±àº™ +OptionWizard.11 = ບà»à»ˆâ€‹àº®àº¹à»‰â€‹àºˆàº±àºâ€‹\: àºàº²àº™â€‹àº™à»àº²â€‹à»ƒàºŠà»‰ ifconfig +OptionWizard.12 = ລູàºâ€‹àº„້າ​ຕົວ​ຢ່າງàºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +OptionWizard.13 = ໂລຠIP Serveràºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +OptionWizard.14 = port ໂລຠServer (ຕົວ​ຢ່າງ​\: 8023​) +OptionWizard.15 = ບັນ​ທຶàºâ€‹à»àº¥àº°â€‹à»ƒàºŠà»‰â€‹àºàº²àº™â€‹àº›à»ˆàº½àº™â€‹à»àº›àº‡ +OptionWizard.16 = ລະ​ຫັດ +OptionWizard.17 = X​-coord +OptionWizard.18 = Y coord​, +OptionWizard.19 = àºàº²àº™â€‹àºàº»àºâ€‹àº¥àº°â€‹àº”ັບ +OptionWizard.2 = ບວນ​àºàº²àº™â€‹à»€àº®àº±àº”​ວຽຠ(server / ລູàºâ€‹àº„້າ​) +OptionWizard.20 = ໄດ້​ເນື້ອ​ໃນ​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»„ດ້​ມີ​àºàº²àº™â€‹àº›à»ˆàº½àº™â€‹à»àº›àº‡â€‹.
àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº®àº±àºšâ€‹à»‚ຫລດ​ເນື້ອ​ຫາ​ໃນ​ເວ​ລາ​ທີ່​ທ່ານ​àºà»àº²â€‹àº¥àº±àº‡â€‹àº®àº±àºšâ€‹àºàº²àº™â€‹àºàº°â€‹àº•ຸ້ນ​ໂດàºâ€‹àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹. +OptionWizard.21 = ປັບ​ປຸງ​ສົບ​ຜົນ​ສà»àº²â€‹à»€àº¥àº±àº” +OptionWizard.22 = ຄ້ອຠ+OptionWizard.23 = ມີ​ຄວາມ​ຜິດ​ພາດ​ໃນ​ເວ​ລາ Re​\: ເປີດ​ໄດ້​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»€àº›àº±àº™â€‹à»„ດ້àºàº»àºâ€‹à»€àº¥àºµàºâ€‹àºàº²àº™ +OptionWizard.24 = àºàº»àºà»€àº¥àºµàºàºàº²àº™ +OptionWizard.25 = ຮູບ​à»àºšàºšâ€‹àºàº²àº™â€‹àº”à»àº²â€‹à»€àº™àºµàº™â€‹àº‡àº²àº™ +OptionWizard.26 = àºàº²àº™â€‹à»€àº›àº±àº™â€‹à»€àºˆàº»à»‰àº²â€‹àºžàº²àºš DB +OptionWizard.27 = ນີ້​ບà»à»ˆâ€‹à»„ດ້​ເປັນ​ທີ່​àºàº­àº¡â€‹àº®àº±àºš Saiku Folder (ເອ​àºàº°â€‹àºªàº²àº™â€‹à»€àº¥àºµà»ˆàº¡ saiku.bat ບà»à»ˆâ€‹à»àº¡à»ˆàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹) +OptionWizard.28 = Saiku Server ບà»à»ˆâ€‹àº®àº­àº‡â€‹àº®àº±àºš +OptionWizard.29 = ພ໠DB +OptionWizard.3 = Server ຕົວ​ຢ່າງ +OptionWizard.30 = ທາງ​ເລືອຠSQLite +OptionWizard.31 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº•ົວ​ຢ່າງ +OptionWizard.32 = ຮູບ​à»àºšàºšâ€‹àº”ິນ​ຕອນ +OptionWizard.33 = ສà»àº²â€‹àº«àº¼àº§àº”​ນຸ​àºàº»àº¡ +OptionWizard.34 = à»àºšàºšâ€‹àºžàº´â€‹à»€àºªàº” +OptionWizard.35 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ຈຸດ​ຕົວ​ຢ່າງ +OptionWizard.36 = ໄລ​àºàº°â€‹àº—າງ​ລະ​ຫວ່າງ​ຈຸດ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àº•ົວ​ຢ່າງ (ໃນ​ຕາ​) +OptionWizard.37 = ອັດ​ຕາ​ທີ່​ມີ​ຊາàºâ€‹à»àº”ນ​ດິນ​ຕອນ (à»àº¡àº±àº”​) +OptionWizard.38 = ໄຟລ​໌ CSV / CED ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ອ່ານ​ໄດ້​ຢ່າງ​ຖືàºâ€‹àº•້ອງ
ເອ​àºàº°â€‹àºªàº²àº™â€‹à»„ດ້​ຖືàºâ€‹àº„າດ​ວ່າ​ຈະ​ມີ​ມູນ​ຄ່າ​àºàº²àº™â€‹à»àºàºâ€‹àºˆàº¸â€‹àº¥àº°â€‹àºžàº²àºâ€‹à»€àºŠàº±à»ˆàº™â€‹àº™àºµà»‰â€‹\:​.
+OptionWizard.39 = ລະ​ຫັດ​, YCoordinate​, XCoordinate​, ພູ​, ລັàºâ€‹àºªàº°â€‹àº™àº° +OptionWizard.4 = IP ຄອມ​ພິວ​ເຕີ​ປັດ​ຈຸ​ບັນ​\: +OptionWizard.40 = ໂຄງ​àºàº²àº™ +OptionWizard.41 = ໂຫຼດ​ໄຟລ​໌​ໂຄງ​àºàº²àº™â€‹à»ƒàº«àº¡à»ˆ +OptionWizard.42 = ຜິດ​ພາດ​ໃນ​ເວ​ລາ​ປິດ​àºàº²àº™â€‹àº­à»ˆàº²àº™ CSV +OptionWizard.43 = ຊື່​ຂອງ​àºàº²àº™â€‹àºªà»àº²â€‹àº«àº¼àº§àº” +OptionWizard.44 = ຖານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ປ​ໃຫ້​ເຖິງ​ອັດ​ຕະ​ໂນ​ມັດ​ທີ່ +OptionWizard.45 = Open Earth Engine ຊູມ​ເຂົ້າ​ໄປ​ໃນ​ເຂດ​ຕອນ​ດິນ​ຂອງ​ຕົນ +OptionWizard.46 = timelapse ຈັàºâ€‹à»€àº›àºµàº”​ໂລàºâ€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºžàº·à»‰àº™â€‹àº—ີ່​ຕອນ​ດິນ​ຂອງ​ຕົນ +OptionWizard.47 = Open à»àºœàº™ Bing ສà»àº²â€‹àº¥àº±àºšâ€‹àºžàº·à»‰àº™â€‹àº—ີ່​ຕອນ​ດິນ​ຂອງ​ຕົນ +OptionWizard.48 = ຮູບ​à»àºšàºšâ€‹à»€àº›àºµàº”​ໃນ​ຕົວ​ທ່ອງ​ເວັບ​ຂອງ​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»„ດ້ (à»àº™àº°â€‹àº™à»àº²â€‹à»ƒàº«à»‰â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™ LINUX​) +OptionWizard.49 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™ Ced / csv ໄຟລ​໌​ທີ່​ມີ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº•ອນ​ດິນ​ຂອງ​ຕົນàºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +OptionWizard.5 = port ໂລຠServer​\: +OptionWizard.50 = Browse ... +OptionWizard.51 = ເອ​àºàº°â€‹àºªàº²àº™â€‹à»‚ຄງ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຜິດ​ພາດ +OptionWizard.52 = CSV / ເອ​àºàº°â€‹àºªàº²àº™ Ced ມີ​àºàº²àº™â€‹àº›àº°â€‹àºªàº²àº™â€‹àº‡àº²àº™â€‹à»€àº—ົ່າ​ນັ້ນ +OptionWizard.54 = ຈຸດ​ສູນ​àºàº²àº‡ +OptionWizard.55 = Error ໂຟນ​ເດີ​ໂຄງ​àºàº²àº™â€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ +OptionWizard.56 = ໂຄງ​àºàº²àº™ Load +OptionWizard.57 = ໂຄງ​àºàº²àº™ loaded àºà»ˆàº­àº™â€‹àº«àº™à»‰àº²â€‹àº™àºµà»‰ +OptionWizard.58 = Open GEE Code Editor (ຮຽàºâ€‹àº®à»‰àº­àº‡â€‹à»ƒàº«à»‰â€‹àº¡àºµâ€‹àºàº²àº™â€‹à»€àº‚ົ້າ​ເຖິງ Tester Trusted​) +OptionWizard.59 = Open ທີ່​ນີ້​à»àºœàº™â€‹àº—ີ່​ສຸມ​ໃສ່​ຕອນ​ດິນ​ຂອງ​ຕົນ +OptionWizard.6 = ຕົວ​àºà»àº²â€‹àº™àº»àº”​àºàº²àº™ PostgreSQL DB +OptionWizard.65 = ເສັ້ນ​ທາງ​àºàº±àºšâ€‹à»‚ຟນ​ເດີ​ທີ່ Saiku +OptionWizard.66 = Browse ... +OptionWizard.67 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ບັດ​àºàº²àº™ Firefox +OptionWizard.68 = Browse ... +OptionWizard.7 = ຊື່​ຜູ້​ໃຊ້ +OptionWizard.70 = àºàº²àº™â€‹àºšà»â€‹àº¥àº´â€‹àº«àº²àº™â€‹à»„ຟ +OptionWizard.72 = ໄຟລ​໌​ຖານ​ສອງ +OptionWizard.73 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ບັດ​àºàº²àº™ Chrome +OptionWizard.74 = Browse ... +OptionWizard.76 = àºàº²àº™â€‹àºšà»â€‹àº¥àº´â€‹àº«àº²àº™â€‹à»„ຟ +OptionWizard.78 = ໄຟລ​໌​ຖານ​ສອງ +OptionWizard.79 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹à»àºšàºš KML Freemarker +OptionWizard.8 = ລະ​ຫັດ​ຜ່ານ +OptionWizard.80 = Browse ... +OptionWizard.82 = à»àº¡à»ˆâ€‹à»àºšàºš Freemarker +OptionWizard.83 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº­àº­àºâ€‹à»àºšàºšâ€‹àº®àº¹àºšâ€‹à»àºšàºš HTML ປູມ​ເປົ້າ +OptionWizard.84 = Browse ... +OptionWizard.86 = HTML webpage +OptionWizard.87 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™ XML àºàº±àºšâ€‹àº„à»àº²â€‹àº™àº´â€‹àºàº²àº¡ IDM +OptionWizard.88 = Browse ... +OptionWizard.9 = ຊື່ DB +OptionWizard.90 = ຫມາຠIDM XML +OptionWizard.91 = Server (ສະ​ບັບ​ຜູ້​ຈັດ​àºàº²àº™â€‹àº«àº¼àº·â€‹àº¢àº·àº™â€‹àº¢àº¹à»ˆâ€‹àº„ົນ​ດຽວ​ໃຊ້​) +OptionWizard.92 = ລູàºâ€‹àº„້າ (ປະ​ຕິ​ບັດ​àºàº²àº™ / àºàº²àº™â€‹à»€àºŠàº·à»ˆàº­àº¡â€‹àº•à»à»ˆâ€‹àºàº±àºšâ€‹à»€àº„ື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹) +OptionWizard.93 = SQLite (à»àºšàºšâ€‹àºàº±àº‡ / ໄຟລ​໌​ດຽວ​ຕາມ​) +OptionWizard.94 = PostgreSQL +SaikuAnalysisListener.0 = à»àº¡à»ˆàº™ - ຂà»à»‰â€‹àº¡àº¹àº™ Refresh Saiku (ຂະ​ບວນ​àºàº²àº™â€‹àºàº²àº§â€‹) +SaikuAnalysisListener.1 = ບà»à»ˆ - ພຽງ​à»àº•່​ເລີ່ມ​ຕົ້ນ Saiku +SaikuStarter.1 = ເລີ່ມ Saiku +SaikuStarter.2 = u0EC0ລີ່ມ Saiku ສາ​ມາດ​ໃຊ້​ເວ​ລາ​ນາ​ທີ \= àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº¥à»â€‹àº–້າ ​\! +SaveEarthDataServlet.0 = àºàº²àº™â€‹àº®à»‰àº­àº‡â€‹àº‚à»â€‹à»€àº›àº»à»ˆàº² +SaveEarthDataServlet.1 = ບັນ​ຫາ​ທີ່​ເàºàºµàº”​ຂຶ້ນ​ໃນ​ຂະ​ນະ​ທີ່​ປະ​ຢັດ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ດ້ +SaveEarthDataServlet.2 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໄດ້​ບັນ​ທືຠ+SlopeCode.0 = ລຽບ (0-5​)àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +EarthApp.11 = ໃນ​ທົ່ວ​ໂລàºâ€‹à»àº¡à»ˆàº™â€‹à»àº¥à»‰àº§â€‹à»àº¥à»ˆàº™ +EarthApp.21 = ໄຟ​ທີ່​ມີ​ຕາ​ຂ່າàºâ€‹à»„ຟ​ຟ້າ​ຂອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ເປັນ CSV / CED à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹àºžàº»àºšâ€‹à»€àº«àº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹à»€àºªàº±à»‰àº™â€‹àº—າງ​ທີ່​ເລືອàºâ€‹\:
+EarthApp.23 = ບà»à»ˆâ€‹à»„ຟລ​໌ CSV / CED ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

+EarthApp.24 = ໄຟ​ທີ່​ມີ​à»àº¡à»ˆâ€‹à»àºšàºš Freemarker ທີ່​ມີ​ຄà»àº²â€‹àº™àº´â€‹àºàº²àº¡ KML ບà»à»ˆâ€‹à»„ດ້​ພົບ​ເຫັນ​ຢູ່​ໃນ​ເສັ້ນ​ທາງ​ທີ່​ເລືອàºâ€‹\:
+EarthApp.26 = ບà»à»ˆâ€‹à»„ຟລ​໌​ຄà»àº²â€‹àº™àº´â€‹àºàº²àº¡ KML ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

+EarthApp.27 = ໄຟ​ທີ່​ມີ​ຮູບ​à»àºšàºšâ€‹àº›àº¹àº¡â€‹à»€àº›àº»à»‰àº² HTML ໄດ້​à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹àºžàº»àºšâ€‹à»€àº«àº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹à»€àºªàº±à»‰àº™â€‹àº—າງ​ທີ່​ເລືອàºâ€‹\:
+EarthApp.29 = ບà»à»ˆâ€‹à»„ຟລ​໌​ປູມ​ເປົ້າ HTML ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

+EarthApp.3 = ເຕືອນ​ຂ້ອàºâ€‹àº•à»à»ˆâ€‹àº¡àº² +EarthApp.30 = àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹à»àºà»‰â€‹à»„ຂ​ສະ​ຖານ​ທີ່​ໄຟລ​໌​ຢູ່​ໃນ​ເມ​ນູ Tools-> Properties​. +EarthApp.4 = àºàº²àº™â€‹àº›àº±àºšâ€‹àº›àº¸àº‡â€‹à»ƒàº™â€‹àº›àº±àº”​ຈຸ​ບັນ +EarthApp.5 = ຢ່າ​ເຕືອນ​ຂ້າ​ພະ​ເຈົ້າ​ອີàºâ€‹à»€àº—ື່ອ​ຫນຶ່ງ +EarthApp.57 = ມີ​ສະ​ບັບ​ໃຫມ່​ຂອງ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹àº—ີ່​ມີ à»àº¡à»ˆàº™â€‹\!
ທ່ານ​ບà»à»ˆâ€‹àº•້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹? ເຕືອນ +EarthApp.58 = ປັບ​ປຸງ +EarthApp.59 Error \= ໃນ​ເວ​ລາ​ທີ່​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ເອ​àºàº°â€‹àºªàº²àº™â€‹à»‚ຄງ​àºàº²àº™ +EarthApp.6 = \ - ສະ​ບັບ +EarthApp.61 = ເອ​àºàº°â€‹àºªàº²àº™â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹à»„ດ້​ເàºàº±àºšâ€‹àºà»àº²â€‹àºšà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ຈະ​ເປີດ​ເຜີàºâ€‹.
àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹à»€àº®àº±àº”​ໃຫ້​à»àº™à»ˆâ€‹à»ƒàºˆàº§à»ˆâ€‹àº²â€‹àº—ີ່​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»àº¡à»ˆàº™â€‹àºàº²àº™â€‹àº•ິດ​ຕັ້ງ​. +EarthSurveyService.9 = ພາàºâ€‹àºªàº°â€‹àº«àº™àº²àº¡â€‹àº—ີ່​ຕ້ອງ​àºàº²àº™à»€àº­àº»àº² +ExportActionListener.1 = ວັນ​ທີ່​ຈະ​ບັນ​ທຶàºâ€‹àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àºˆàº²àºàº‚à»à»‰â€‹àº¡àº¹àº™ +ExportDialogProcessMonitor.0 àºàº²àº™â€‹àº›àº¸àº‡â€‹à»àº•່ງ \= ... +ExportDialogProcessMonitor.1 = ລà»â€‹àº–້າ​ທີ່​ຈະ​ເລີ່ມ​ຕົ້ນ​ຂະ​ບວນ​àºàº²àº™â€‹\:àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àº +ExportDialogProcessMonitor.4 =​\: +ImportProcessMonitorDialog.0 = àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​\: +ImportActionListener.0 = ຄວນ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àº—ີ່​ດິນ​ທີ່​ບà»à»ˆâ€‹à»„ດ້​ຮັບ​àºàº²àº™â€‹à»€àº•ີມ​ລົງ​ໄປ​ໃນ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ໄດ້ +ImportActionListener.2 = ຖ້າ​ທ່ານ​ຄລິàºâ€‹à»ƒàºªà»ˆ ບà»à»ˆ ພຽງ​à»àº•່​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºˆàº²àºâ€‹àºžàº²àºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ຢູ່​ໃນ​ສະ​ພາບ "ສີ​ຂຽວ​"​, ທີ່​ບັນ​ຈຸ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ັງ​ຫມົດ​ໄດ້​, ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​. +ImportActionListener.3 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ບັນ​ທຶàºâ€‹àº—າງ​àºàº²àº™â€‹àºªà»àº²â€‹à»€àº¥àº±àº”​ຮູບ +ImportDialogProcessMonitor.0 = \ ຄິດ​ໄລ່ +ImportDialogProcessMonitor.11 = ຈà»àº²â€‹àº™àº§àº™â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ​ຂອງ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹\: +ImportDialogProcessMonitor.2 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ບັນ​ທຶàºâ€‹àºàº²àº™ ... +ImportDialogProcessMonitor.5 = ຈ​à»â€‹àº²â€‹àº™àº§àº™â€‹àº•ົວ​ຈິງ​ຂອງ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​\:ຂà»à»‰â€‹àº¡àº¹àº™ +ImportDialogProcessMonitor.8 àºàº²àº™â€‹àº›àº¸àº‡â€‹à»àº•່ງ \= ... +InfiniteProgressMonitor.0 = àºàº»àºâ€‹à»€àº¥àºµàºâ€‹àºàº²àº™â€‹àº”à»àº²â€‹à»€àº™àºµàº™â€‹àº‡àº²àº™àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +JFileChooserExistsAware.0 = file ໂລàºâ€‹à»‚ຄງ​àºàº²àº™ +KmlImportService.13 = ເລືອàºâ€‹à»„ຟລ​໌ CSV ເພື່ອ​ຊ່ວàºâ€‹àº›àº°â€‹àº¢àº±àº”​ສະ​ຖານ​ຕອນ​ດິນ​ຂອງ​ຕົນ​ເພື່ອ +MissingPlotsListener.0 Error \= ໃນ​ຂະ​ນະ​ທີ່​àºàº²àº™â€‹à»„ດ້​ຮັບ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àº—ີ່​ດິນ​ບà»à»ˆâ€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ດ້ +MissingPlotsListener.1 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ໄປ +MissingPlotsListener.10 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ໃນ​àºàº²àº™â€‹àº­àº­àºâ€‹à»àºšàºšâ€‹àºªàº¸à»ˆàº¡â€‹àº•ົວ​ຢ່າງ​\: +MissingPlotsListener.12 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ຫາàºâ€‹à»„ປ​\: +MissingPlotsListener.14 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທັງ​ຫມົດ​à»àº¡à»ˆàº™â€‹à»„ດ້​ເຕີມ​ລົງ​ໄປ ​\!ເນື້ອ​ໃນ +MissingPlotsListener.2 = ຄັດ​ລອàºâ€‹à»„ປ​ທີ່ clipboardເອົາ +MissingPlotsListener.3 = ໄຟລ​໌​ທີ່​ບັນ​ຈຸ​ມີ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ສານ​ຕອນ​ດິນ​ຂອງ​ຕົນ (.csv ຫຼື​ໄຟລ​໌ .ced​) ສà»àº²â€‹àº¥àº±àºšâ€‹àº—ີ່​ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ຮູ້​ວ່າ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ັງ​ຫມົດ​ໄດ້​ຮັບ​àºàº²àº™â€‹à»€àº•ີມ​ລົງ​ໄປ​. +MissingPlotsListener.4 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຫາàºâ€‹à»„ປ - ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ສານ +MissingPlotsListener.5 = ຈາàºâ€‹à»„ຟ​\: +MissingPlotsListener.6 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ​ໄຟລ​໌ CED +ProcessMonitorDialog.1 = ຂà»à»‰â€‹àºœàº´àº”​ພາດ Parsing àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àºˆà»àº²â€‹àº™àº§àº™â€‹àºàº²àº™â€‹àº•ິດ​ຕà»à»ˆâ€‹àºàº±àº™ +ProcessMonitorDialog.4 = ຖັນ​, +ProcessMonitorDialog.5 = \ - ຄຸນ​ຄ່າ \ No newline at end of file From 47895bf58a1edafc2238eedca042c2af7172729e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:35:07 +0100 Subject: [PATCH 0771/1620] New translations Messages_tr.properties (Spanish) --- .../earth/app/view/Messages_es.properties | 487 +++++++++--------- 1 file changed, 237 insertions(+), 250 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index c2ce51b7bd..c9742c724a 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,255 +1,242 @@ -AboutDialog.19=Ocorreu um problema -AboutDialog.5=Para mais informações visite nosso site OpenForis.org -AboutDialog.6=Desculpe, um problema ocorreu ao tentar abrir esse link no seu navegador padrão. -AboutDialog.8=Ok -AspectCode.0=Norte -AspectCode.1=Nordeste -AspectCode.2=Leste -AspectCode.3=Sudeste -AspectCode.4=Sul -AspectCode.5=Sudoeste -AspectCode.6=Oeste -AspectCode.7=Noroeste -CollectEarthMenu.0=Importar Arquivo CEP -CollectEarthMenu.2=Utilidades -CollectEarthMenu.3=Separar arquivo CSV em partes -CollectEarthMenu.4=Exportar dados para XML (da data específica até o tempo presente) -CollectEarthMenu.5=Exportar para Collect Backup -CollectEarthMenu.6=Exportar dados como Collect Backup (todos os dados) -CollectEarthMenu.7=Exportar dados como Collect Backup (a partir de uma data) -CollectEarthMenu.8=Exportar dados para XML (filtrar por atributo) -CollectEarthWindow.0=Erro ao tentar exportar os dados para um arquivo CSV -CollectEarthWindow.10=Arquivo -CollectEarthWindow.11=Fechar -CollectEarthWindow.12=Ferramentas -CollectEarthWindow.13=Baixar dados para CSV (Excel) -CollectEarthWindow.14=Iniciar Análise SAIKU -CollectEarthWindow.15=Propiedades -CollectEarthWindow.16=Ajuda -CollectEarthWindow.17=Declaração -CollectEarthWindow.18=Encontrar parcelas ausentes em banco de dados +AboutDialog.19=Bir sorun oluÅŸtu +AboutDialog.5=Daha fazla bilgi için web sitemizi ziyaret edin OpenForis.org +AboutDialog.6=Üzgünüm, sisteminizin varsayılan tarayıcısı bu baÄŸlantıyı açmak isterken bir sorun oluÅŸtu. +AboutDialog.8=Tamam +AspectCode.0=Kuzey +AspectCode.1=Kuzey-doÄŸu +AspectCode.2=DoÄŸu +AspectCode.3=Güney-doÄŸu +AspectCode.4=Güney +AspectCode.5=Güney-batı +AspectCode.6=Batı +AspectCode.7=Kuzey-batı +CollectEarthWindow.0=Veri CSV dosyasına aktarılmaya çalışılırken hata oluÅŸtu +CollectEarthWindow.1=Dışa aktarma hatası +CollectEarthWindow.10=Dosya +CollectEarthWindow.11=Çıkış +CollectEarthWindow.12=Araçlar +CollectEarthWindow.13=Verileri CSV'ye aktar +CollectEarthWindow.14=SAIKU Analysis baÅŸlat +CollectEarthWindow.15=Özellikler +CollectEarthWindow.16=Yardım +CollectEarthWindow.17=Yasal uyarı +CollectEarthWindow.18=Veritabnında eksik plotları bulun CollectEarthWindow.19=Collect Earth -CollectEarthWindow.1=Erro ao exportar -CollectEarthWindow.20=Número de registros duplicados\: -CollectEarthWindow.21=Não foi possível encontrar o ícone para a janela principal -CollectEarthWindow.22=Tem certeza de querer fechar Collect Earth?
Ao fechar a janela será fechada também o servidor de Collect Earth -CollectEarthWindow.23=Confirmação requerida -CollectEarthWindow.24=Exportar a XML -CollectEarthWindow.25=Quer importar estes registros de qualquer maneira e perder o seus dados atuais? -CollectEarthWindow.26=Operador -CollectEarthWindow.27=Atualizar -CollectEarthWindow.28=O servidor Open Foris Collect Earth deve estar em execução enquanto o operador interprete os dados. -CollectEarthWindow.29=O servidor Saiku não está configurado. -CollectEarthWindow.2=Idioma -CollectEarthWindow.30=Por favor mantenha esta janela aberta enquanto estiver usando o Google Earth. -CollectEarthWindow.31=Exportar os dados coletados para um arquivo CSV -CollectEarthWindow.32=Fechar -CollectEarthWindow.33=O nome do operador deve ser maior de que 5 caracteres e mais curto do que 50 -CollectEarthWindow.34= Erro de Validação -CollectEarthWindow.35=NOME DO OPERADOR VAZIO\!
Preencha o nome do operador e clique no botão "Atualizar". -CollectEarthWindow.36=Nome do operador não pode estar vazio -CollectEarthWindow.37=Permanecer Aberto -CollectEarthWindow.38=Arquivos de CSV -CollectEarthWindow.39=AVISO\:Se recomenda de fazer um back-up dos seus dados atuais(Exportar para XML) antes de importar os novos dados -CollectEarthWindow.3=\ Erro ao importar dados. -CollectEarthWindow.40=Configurar caminho para o arquivo onde o Servidor Saiku se encontra instalado em Ferramentas->Propiedades->Avançado. -CollectEarthWindow.41=Guardar dados exportados para o arquivo\: -CollectEarthWindow.42=Sair -CollectEarthWindow.43=Registros repetidos detectados -CollectEarthWindow.44=Importar/Exportar -CollectEarthWindow.45=Exportar dados para XML (comprimidos) -CollectEarthWindow.46=Importar novos dados do ZIP (XML comprimidos) -CollectEarthWindow.47=Servidor Saiku não configurado -CollectEarthWindow.48=Arquivos ZIP -CollectEarthWindow.49=Arquivos Fusion CSV -CollectEarthWindow.4=Isenção de responsabilidade da FAO -CollectEarthWindow.50=Abrir Manual de Usuário -CollectEarthWindow.51=Verificar atualizações de Collect Earth -CollectEarthWindow.52=Abrir Arquivo de Registro da aplicação -CollectEarthWindow.53=Arquivo de Registro de Collect Earth -CollectEarthWindow.54=Carregar pontos de KML -CollectEarthWindow.55=Atualizar registros atuais usando CSV -CollectEarthWindow.56=Sobre... -CollectEarthWindow.57=O processo de arranque de Saiku ainda está em execução, por favor aguarde. -CollectEarthWindow.58=Não é possível iniciar a análise com Saiku -CollectEarthWindow.59=Quer voltar a gerar o conjunto de dados para o análise de Saiku?
Este processo pode demorar vários minutos.
Se clicar em "SIM" um novo conjunto de dados com a mais recente informação será gerada. -CollectEarthWindow.5=Fechar -CollectEarthWindow.60=Geraço de dados para Saiku -CollectEarthWindow.61=Exportar dados para XML (apenas os registros adicionados/modificados) -CollectEarthWindow.62=Sobre... -CollectEarthWindow.63=Erro acessando pontos de KML -CollectEarthWindow.64=Suporte Técnico -CollectEarthWindow.65=O nome do operador foi alterado -CollectEarthWindow.66=Nome do operador -CollectEarthWindow.67=Abra a pasta de dados do CE -CollectEarthWindow.6=Exportar dados a Fusion Table -CollectEarthWindow.70=Abra o manuel desta pesquisa -CollectEarthWindow.71=Gerar ferramenta Saiku Independente -CollectEarthWindow.7=Erro ao importar os dados -CollectEarthWindow.8=Texto de isenção não foi possivel de ser encontrado -CollectEarthWindow.9=Os dados importados contém registros que já estão presentes no seu banco de dados. -DynamicsCode.0=Inicialmente Floresta -DynamicsCode.1=Inicialmente Ãrea de Pastagem -DynamicsCode.2=Inicialmente Ãrea Urbana -DynamicsCode.3=Inicialmente Outros -DynamicsCode.4=Inicialmente Ãrea Alagada -DynamicsCode.5=Inicialmente Ãrea Agrícola -EarthApp.11=Collect Earth já está em execução -EarthApp.21=O arquivo contendo o gride de pontos como CSV/CED não foi encontrado no caminho selecionado\:
-EarthApp.23=Nenhum arquivo CSV/CED foi configurado \:

-EarthApp.24=O arquivo contendo o modelo Freemarker com a definição KML não foi encontrado no caminho selecionado \:
-EarthApp.26=Nenhum arquivo de definição KML foi configurado \:

-EarthApp.27=O arquivo contendo o formato balão HTML não foi encontrado no caminho selecionado \:
-EarthApp.29=Nenhum arquivo balão HTML foi configurado \:

-EarthApp.30=Por favor corrija a localização do arquivo no menu Ferramentas->Propriedades. -EarthApp.3=Lembrar mais tarde -EarthApp.4=Atualizar Agora -EarthApp.57=Existe uma nova versão do Collect Earth disponível\!
Como gostaria de proceder? -EarthApp.58=Alerta de Atualização -EarthApp.59=Erro ao importar aquivo do projeto -EarthApp.5=Não me lembre novamente -EarthApp.61=O arquivo do Collect Earth não pôde ser aberto.
Por favor certifique-se que Google Earth esteja instalado. -EarthApp.6= - Versão -EarthApp.70=AVISO -EarthApp.71=No Mac OS X, os arquivos do projeto Collect Earth (* .cep) não serão abertos no Collect Earth quando forem clicados duas vezes.
-EarthApp.72=Use a barra de ferramentas Collect Earth para abrir os arquivos .cep \: -EarthApp.73=Collect Earth - problemas em computadores Mac OS X -EarthSurveyService.9=Campo obrigatório -ExportActionListener.1=Escolha data a partir da qual queira exportar os dados -ExportDialogProcessMonitor.0=Processando os dados... -ExportDialogProcessMonitor.1=Esperando de inicializar o processo \: -ExportDialogProcessMonitor.4=Registros importados \: -ImportActionListener.0=Deseja importar os dados das parcelas que não tenham sido completamente preenchidos? -ImportActionListener.2=Se clicar NÃO apenas os dados das parcelas em estado completo ("verde"), serão importados. -ImportActionListener.3=Importar registros incompletos -ImportDialogProcessMonitor.0=\ CALCULANDO -ImportDialogProcessMonitor.11=Cifra inicial de registros \: -ImportDialogProcessMonitor.2=Importando registros.... -ImportDialogProcessMonitor.5=Cifra final de registros importados \: -ImportDialogProcessMonitor.8=Processando dados... -ImportProcessMonitorDialog.0=Imported records \: -ImportXMLDialogProcessMonitor.1 = Substitua dados no banco de dados -ImportXMLDialogProcessMonitor.2 = Importe apenas registros não conflitantes -InfiniteProgressMonitor.0=Cancelar operação -JFileChooserExistsAware.0=Arquivo de projeto Collect Earth -KmlImportService.13=Selecione um arquivo CSV para salvar a localização dos pontos -MissingPlotsListener.0=Erro ao obter informação sobre parcelas ausentes na Base de Dados -MissingPlotsListener.10=Número total de ppontos no desenho de amostragem \: -MissingPlotsListener.12=Número de pontos perdidos \: -MissingPlotsListener.14=Todos os pontos foram preenchidos\! -MissingPlotsListener.1=Parcelas ausentes -MissingPlotsListener.2=Copiar conteúdos -MissingPlotsListener.3=Escolha os arquivos contendo informação sobre as parcelas ( .csv or .ced files ) para os quais deseja saber se todos os dados foram preenchidos. -MissingPlotsListener.4=Parcelas ausentes - informação -MissingPlotsListener.5=Do arquivo \: -MissingPlotsListener.6=Exportar para arquivo CED -NO=Não -NO_TO_ALL=Não para todos -OpenTextFileListener.0=O arquivo de texto não foi encontrado em \: -OptionWizard.0=Opções do Collect Earth -OptionWizard.100=Abrir Planet -OptionWizard.101=Llave da API do Planet -OptionWizard.1021=URL SecureWatch -OptionWizard.102=Abrir Maxar SecureWatch -OptionWizard.103=Configure o URL para o Mapa Extra (abre quando configurado) \: -OptionWizard.104=Navegadores -OptionWizard.105=Abrir Earth Map -OptionWizard.110=Use imagens mensais fornecidas pela NICFI -OptionWizard.10=Abrir arquivo de backup -OptionWizard.11=Desconhecido\: usar ifconfig -OptionWizard.12=Cliente Instância -OptionWizard.13=Collect Earth Server IP -OptionWizard.14=Collect Earth Porta de Servidor (p.ex. 8023) -OptionWizard.15=Guardar & Aplicar alteraçães +CollectEarthWindow.2=Dil +CollectEarthWindow.20=Kopyalanan kayıt sayısı\: +CollectEarthWindow.21=Ana bilgisayar için simge bulunamadı +CollectEarthWindow.22=Collect Earth'ü kapatmak istediğinizden emin misiniz?
Pencereyi kapatmanız durumunda Collect Earth sunucusunu da kapatır. +CollectEarthWindow.23=Onay gerekiyor +CollectEarthWindow.24=XML Dışa aktar +CollectEarthWindow.25=Mevcut verileriniz kaybolacak yine de bu kayıtları eklemek istiyor musunuz? +CollectEarthWindow.26=Operatör +CollectEarthWindow.27=Güncelle +CollectEarthWindow.28=Operatör, verileri değerlendirirken Open Foris Collect Earth sunucusu çalışmalıdır. +CollectEarthWindow.29=Saiku Sunucusu yapılandırılmadı. +CollectEarthWindow.3=İçe aktarma hatası +CollectEarthWindow.30=Lütfen Google Earth'ü kullanırken bu pencereyi açık tutun. +CollectEarthWindow.31=Toplanan verileri CSV dosyasına aktar +CollectEarthWindow.32=Vazgeç +CollectEarthWindow.33=Operatör adı 5 karakterden uzun ve 50 karakterden kısa olmalıdır +CollectEarthWindow.34=Doğrulama hatası +CollectEarthWindow.35=OPERATÖR ADI BOŞ\!
Lütfen operatör adını girin ve "Güncelle" düğmesine basın. +CollectEarthWindow.36=Operatör adı boş olamaz +CollectEarthWindow.37=Açık Tut +CollectEarthWindow.38=CSV dosyaları +CollectEarthWindow.39=DİKKAT\: Yeni verileri almadan önce mevcut verilerinizi (XML'e Aktar) yedeklemeniz önerilir. +CollectEarthWindow.4=FAO Yasal uyarı bildirimleri +CollectEarthWindow.40=Araçlar-> Özellikler-> Gelişmiş sekmesinde Saiku Sunucusunun kurulu olduğu klasörün yolunu ayarlayın. +CollectEarthWindow.41=Dışa aktarılan verileri dosyaya kaydet +CollectEarthWindow.42=Vazgeç +CollectEarthWindow.43=Yinelenen kayıtlar bulundu +CollectEarthWindow.44=Verileri İçe/Dışa aktar +CollectEarthWindow.45=Verileri XML'e aktar (Sıkıştırılmış) +CollectEarthWindow.46=Verileri ZIP'ten içe aktar (sıkıştırılmış XML) +CollectEarthWindow.55=CSV kullanarak mevcut kayıtları güncelle +CollectEarthWindow.47=Saiku Sunucusu yapılandırılmadı +CollectEarthWindow.48=Zip/collect-data dosyası +CollectEarthWindow.49=Fusion table CSV dosyası +CollectEarthWindow.5=Kapat +CollectEarthWindow.50=Kullanım Kılavuzunu Aç +CollectEarthWindow.51=Collect Earth güncellemelerini kontrol et +CollectEarthWindow.52=Uygulama Günlüğünü Aç +CollectEarthWindow.53=Collect Earth Günlüğü +CollectEarthWindow.54=Noktaları KML'den yükle +CollectEarthWindow.56=Hakkında... +CollectEarthWindow.57=Saiku başlatıcısı işlemi hala devam ediyor, lütfen bekleyin. +CollectEarthWindow.58=Saiku analysis başlatılamıyor +CollectEarthWindow.59=Saiku analizi için veri setini yeniden oluşturmak ister misiniz?
Bu iÅŸlem zaman alabilir.
"EVET" üzerine tıklarsanız, en son bilgileri içeren yeni bir veri seti oluşturulur. +CollectEarthWindow.6=Fusion Table'a aktar +CollectEarthWindow.60=Saiku veri üretimi +CollectEarthWindow.61=Verileri XML'e aktar (Son dışa aktarımdan bu yana değiştirilmiş kayıtlar) +CollectEarthWindow.62=Hakkında... +CollectEarthWindow.63=Noktalar KML'den alırken hata oluştu +CollectEarthWindow.64=Teknik Destek +CollectEarthWindow.7=Veri içe aktarılırken hata oluştu +CollectEarthWindow.8=Yasal uyarı metni bulunamadı +CollectEarthWindow.9=Alınan veriler veritabanında zaten mevcut olan kayıtları içerir. +CollectEarthWindow.65=Operatör adı değiştirildi +CollectEarthWindow.66=Operatör adı +CollectEarthWindow.70=Anket rehberini aç +DynamicsCode.0=Başlangıçta Orman +DynamicsCode.1=Başlangıçta Mera +DynamicsCode.2=Başlangıçta Yerleşim +DynamicsCode.3=Başlangıçta Diğer +DynamicsCode.4=Başlangıçta Sulak +DynamicsCode.5=Başlangıçta Tarım +OpenTextFileListener.0=Metin dosyası bulunamadı \: +OptionWizard.0=Collect Earth seçenekler +OptionWizard.1=Tarayıcı Seç +OptionWizard.10=Yedekleme klasörünü aç +OptionWizard.11=Blinmeyen\: yapılandırma kullanımı +OptionWizard.12=İstemci durumu +OptionWizard.13=Collect Earth Sunucu IP +OptionWizard.14=Collect Earth sunucu girişi (örn. 8023) +OptionWizard.15=Kaydet & Değişiklikleri uygula OptionWizard.16=ID OptionWizard.17=X-coord OptionWizard.18=Y-coord -OptionWizard.19=Elevação -OptionWizard.1=Escolher Navegador -OptionWizard.20= Os conteúdos de Google Earth foram alterados.
Por favor aceite a regarga do conteúdo uma vez que Google Earth lhe pergunte. -OptionWizard.21=Atualizado com sucesso -OptionWizard.22=Relevo -OptionWizard.23=Houve um erro ao reabrir os dados de Google Earth -OptionWizard.24=Cancelar -OptionWizard.25=Modo de Operação -OptionWizard.26=BBDD servidor -OptionWizard.27=Isto não é um Arquivo Saiku reconhecível (o arquivo start-saiku.bat não se encontra presente) -OptionWizard.28=Servidor Saiku não reconhecível -OptionWizard.29=BBDD porta -OptionWizard.2=Tipo de uso(servidor/cliente) -OptionWizard.30=Opçães SQLite -OptionWizard.31=Dados de amostra -OptionWizard.32=Disposição da Parcela -OptionWizard.33=Definiço de Questionários -OptionWizard.34=Serviços Integrados -OptionWizard.35=Número de pontos de control -OptionWizard.36=Distância entre os pontos de control (em metros) -OptionWizard.37=Margem com o perímetro da parcela (em metros) -OptionWizard.38=O arquivo CSV/CED não foi possivel ser lido corretamente.
O arquivo deve conter valores separados por vírgulas do seguinte modo\:
-OptionWizard.39=ID,Y-Coordenada,X-Coordenada,elevação,relevo,orientação -OptionWizard.3=Servidor Instance -OptionWizard.40=Projetos -OptionWizard.41=Carregar um novo arquivo de projeto -OptionWizard.42=Erro ao fechar o leitor CSV -OptionWizard.43=Nome do questionário -OptionWizard.44=Realizar automaticamente backup do banco de dados em -OptionWizard.45=Abrir Earth Engine Playground (descontinuado) -OptionWizard.46=Abrir Earth Engine Timelapse -OptionWizard.47=Abrir Bing Maps -OptionWizard.48=Abrir formulário em um navegador externo em vez de Google Earth (recomendado para LINUX) -OptionWizard.49=Caminho do arquivo CED/CSV com as coordenadas das parcelas -OptionWizard.4=IP do computador atual\: -OptionWizard.50=Navegar.. -OptionWizard.51=Erro ao importar os arquivos do projeto -OptionWizard.52= Arquivo CSV/CED com coordinadas -OptionWizard.53=Sem pontos -OptionWizard.54=Ponto Central -OptionWizard.55=Erro ao importar diretório do projeto -OptionWizard.56=Carregar projeto -OptionWizard.57=Projetos previamente carregados -OptionWizard.58=Abrir GEE Code Editor (requer acesso ao Trusted Tester) -OptionWizard.59=Abrir Here Maps focado no ponto -OptionWizard.5= Collect Earth Servidor porto\: -OptionWizard.65=Caminho para arquivo Saiku -OptionWizard.66=Navegar... -OptionWizard.67=Caminho para o executável do Firefox -OptionWizard.68=Navegar... -OptionWizard.6=Parâmetros BD PostgreSQL -OptionWizard.70=Arquivos executáveis -OptionWizard.72=Arquivos binários -OptionWizard.73=Caminho para o executável do Chrome -OptionWizard.74=Navegar... -OptionWizard.76=Arquivos executáveis -OptionWizard.78=Arquivos binarios -OptionWizard.79=Caminho para o padrão de KML Freemarker -OptionWizard.7=Nome de Usuário -OptionWizard.80=Navegar... -OptionWizard.82=Padrão Freemarker -OptionWizard.83=Caminho para formulário HTML Balloon -OptionWizard.84=Navegar... -OptionWizard.86=Pagina web HTML -OptionWizard.87=Caminho para XML com definição IDM -OptionWizard.88=Navegar... -OptionWizard.8=Senha -OptionWizard.90=Definiço XML IDM -OptionWizard.91=Servidor (versão para gerente ou uso autônomo) -OptionWizard.92=Cliente (operador/conectado ao servidor) -OptionWizard.93=SQLite (Embutido/com base em um único arquivo) +OptionWizard.19=Yükseklik +OptionWizard.2=İş akışı (sunucu/istemci) +OptionWizard.20=Google Earth içerikleri değiştirildi.
Lütfen Google Earth tarafından istendiğinde içeriğin yeniden yüklenmesini kabul edin. +OptionWizard.21=Güncelleme başarılı +OptionWizard.22=Eğim +OptionWizard.23=Google Earth verilerini yeniden açarken bir hata oluştu +OptionWizard.24=İptal +OptionWizard.25=İşlem Modu +OptionWizard.26=DB host +OptionWizard.27=Bu tanınmış bir Saiku klasörü değil ( start-saiku.bat dosyası mevcut değil) +OptionWizard.28=Saiku Sunucusu tanınmadı +OptionWizard.29=DB port +OptionWizard.3=Sunucu örneği +OptionWizard.30=SQLite seçenekleri +OptionWizard.31=Örnek veri +OptionWizard.32=Plot düzeni +OptionWizard.33=Anket Tanımı +OptionWizard.34=Gelişmiş +OptionWizard.35=Kontrol noktası sayısı +OptionWizard.36=Kontrol noktaları arasındaki mesafe (metre cinsinden) +OptionWizard.37=Plot kenarı ile mesafesi (metre cinsinden) +OptionWizard.38=CSV / CED dosyası doğru okunamıyor.
Dosyanın böyle bir virgülle ayrılmış değerlere sahip olması beklenir \:
+OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect +OptionWizard.4=Geçerli bilgisayar IP'si \: +OptionWizard.40=Projeler +OptionWizard.41=Yeni bir proje dosyası yükle +OptionWizard.42=CSV okuyucuyu kapatırken hata oluştu +OptionWizard.43=Anketin adı +OptionWizard.44=veritabanını otomatik olarak yedekle +OptionWizard.45=Earth Engine plot alanına yakınlaştırarak aç +OptionWizard.46=Plot alanı için Earth Engine Timelapse'yi aç +OptionWizard.47=Plot alanı için Bing Maps'i aç +OptionWizard.48=Formu Google Earth yerine bir tarayıcıda aç (LINUX için önerilir) +OptionWizard.49=Plot verisini içeren ced / csv dosyasının yolu +OptionWizard.5=Collect Earth Sunucu girişi\: +OptionWizard.50=Tarayıcı... +OptionWizard.51=Proje dosyası içe aktarılırken hata oluştu +OptionWizard.52=Yalnızca koordinatlara sahip CSV / CED dosyası +OptionWizard.53=Puan yok +OptionWizard.54=Merkez noktası +OptionWizard.55=Proje dosyası içe aktarılırken hata oluştu +OptionWizard.56=Proje yükle +OptionWizard.57=Önceden yüklenmiş projeler +OptionWizard.58=GEE Kod Düzenleyicisini açın (Güvenilir Test Cihazı erişimi gerektirir) +OptionWizard.59=Plot üzerinde Here Maps'i aç +OptionWizard.6=PostgreSQL DB parametreleri +OptionWizard.65=Saiku klasör yolu +OptionWizard.66=Tarayıcı... +OptionWizard.67=Firefox kısayol yolu +OptionWizard.68=Tarayıcı... +OptionWizard.7=Kullanıcı adı +OptionWizard.70=Kısayol dosyaları +OptionWizard.72=İkili dosyalar +OptionWizard.73=Chrome kısayol yolu +OptionWizard.74=Tarayıcı... +OptionWizard.76=Kısayol dosyaları +OptionWizard.78=İkili dosyalar +OptionWizard.79=KML işaretçi şablonu yolu +OptionWizard.8=Parola +OptionWizard.80=Tarayıcı... +OptionWizard.82=İşaretçi şablonu +OptionWizard.83=Form tasarımının HTML balon yolu +OptionWizard.84=Tarayıcı... +OptionWizard.86=HTML web sayfası +OptionWizard.87=IDM tanımıyla XML yolu +OptionWizard.88=Tarayıcı... +OptionWizard.9=DB Adı +OptionWizard.90=XML IDM tanımlama +OptionWizard.91=Sunucu (yönetici sürümü veya tek başına kullanım) +OptionWizard.92=İstemci (operatör/sunucuya bağlı) +OptionWizard.93=SQLite (Gömülü / tek dosya tabanlı) OptionWizard.94=PostgreSQL -OptionWizard.95=Side of the sampling dots (in meters) -OptionWizard.9= Nome da Base de Dados -ProcessMonitorDialog.1=Erro de análise na linha número -ProcessMonitorDialog.4=, colunas -ProcessMonitorDialog.5= -- valores -SaikuAnalysisListener.0=Sim - Atualizar dados Saiku (longo processo) -SaikuAnalysisListener.1=Não - Use a mesma versão dos dados da última vez que o Saiku foi usado -SaikuToolExportListener.1=Geração da ferramenta Saiku -SaikuToolExportListener.2=Gerando a Ferramenta Saiku com o banco de dados atual -SaikuStarter.1=Iniciando Saiku -SaikuStarter.2=Iniciando Saiku pode demorar uns minutos, por favor aguarde\! -SaveEarthDataServlet.0=Sem dados -SaveEarthDataServlet.1=Problema ocorreu ao guardar os dados na Base de Dados -SaveEarthDataServlet.2=Os dados foram guardados -SlopeCode.0=Plano (0-5) -YES=Sim -YES_TO_ALL=Sim a todas \ No newline at end of file +OptionWizard.95=Örnekleme noktalarının kenarı (metre olarak) +SaikuAnalysisListener.0=Evet - Saiku verilerini yenile (uzun işlem) +SaikuAnalysisListener.1=Hayır - Sadece Saiku'yu başlat +SaikuStarter.1=Saiku başlatılıyor +SaikuStarter.2=Saiku başlatılıyor birkaç dakika sürebilir, lütfen bekleyin \! +SaveEarthDataServlet.0=Boş istek +SaveEarthDataServlet.1=Veriyi veritabanına kaydederken sorun oluştu +SaveEarthDataServlet.2=Veri kaydedildi +SlopeCode.0=Düz (0-5) +EarthApp.11=Collect Earth zaten çalışıyor +EarthApp.21=Plotlara ait seçili CSV/CED grid dosyası bulunamadı \:
+EarthApp.23=CSV/CED dosyası ayarlanmadı \:

+EarthApp.24=İşaretçi şablonunu KML tanımına sahip dosya seçili yolda bulunamadı \:
+EarthApp.26=KML tanım dosyası ayarlanmadı \:

+EarthApp.27=HTML balon formunu içeren dosya seçili yolda bulunamadı \:
+EarthApp.29=Hiçbir HTML balon dosyası oluşturulmadı \:

+EarthApp.3=Daha Sonra Hatırlat +EarthApp.30=Lütfen Araçlar-> Özellikler menüsünden dosya konumunu düzeltin.. +EarthApp.4=Şimdi Güncelle +EarthApp.5=Tekrar hatırlatma +EarthApp.57=Collect Earth'ün yeni bir sürümü var\!
Nasıl devam etmek istiyorsun? +EarthApp.58=Güncelleme uyarısı +EarthApp.59=Proje dosyasını içe aktarırken hata oluştu +EarthApp.6=\ - Versiyon +EarthApp.61=Collect Earth dosyası açılamadı.
Lütfen Google Earth’ün kurulu olduğundan emin olun. +EarthSurveyService.9=Alan gerekli +ExportActionListener.1=Kayıtların Gönderileceği Tarihi Seç +ExportDialogProcessMonitor.0=Veri işleniyor... +ExportDialogProcessMonitor.1=İşlemi başlatmak için bekleniyor \: +ExportDialogProcessMonitor.4=Dışa aktarılan kayıtlar \: +ImportProcessMonitorDialog.0=İçe aktarılan kayıtlar \: +ImportActionListener.0=Doldurulmamış plotlar içe aktarılsın mı? +ImportActionListener.2=Eğer tıklarsanız NO sadece tüm verileri içeren "yeşil" durumdaki plotlar içe aktarılacaktır. +ImportActionListener.3=Bitmemiş kayıtları içe aktar +ImportDialogProcessMonitor.0=\ HESAPLANIYOR +ImportDialogProcessMonitor.11=İlk kayıt sayısı \: +ImportDialogProcessMonitor.2=Kayıtlar içe aktarılıyor... +ImportDialogProcessMonitor.5=Güncel içe aktarılan kayıt sayısı \: +ImportDialogProcessMonitor.8=Veri işleniyor... +InfiniteProgressMonitor.0=İşlemi iptal et +JFileChooserExistsAware.0=Collect Earth Proje dosya +KmlImportService.13=Konumları kaydetmek için CSV dosyası seçin +MissingPlotsListener.0=Veritabanında bulunmayan plotlar hakkında bilgi alınırken hata oluştu +MissingPlotsListener.1=Eksik plotlar +MissingPlotsListener.10=Örnekleme tasarımındaki toplam plotların sayısı \: +MissingPlotsListener.12=Eksik plotların sayısı \: +MissingPlotsListener.14=Bütün plotlar dolu\! +MissingPlotsListener.2=İçeriği panoya kopyala +MissingPlotsListener.3=Tüm verilerin doldurulup doldurulmadığını öğrenmek istediğiniz plot bilgilerini (.csv veya .ced dosyaları) içeren dosyaları seçin. +MissingPlotsListener.4=Eksik plotlar - Bilgi +MissingPlotsListener.5=Dosyadan \: +MissingPlotsListener.6=CED dosyasına aktar +ProcessMonitorDialog.1=Satır numarasında ayrıştırma hatası +ProcessMonitorDialog.4=, sütunlar +ProcessMonitorDialog.5=\ -- değerler + +ImportXMLDialogProcessMonitor.1 = Verilerin üzerine yaz +ImportXMLDialogProcessMonitor.2 = Sadece yinelenmeyen plotları içe aktar + +YES=Evet +YES_TO_ALL=Tümüne evet +NO=Hayır +NO_TO_ALL=Tümüne hayır + +CollectEarthMenu.0=CEP dosyasını içe aktar +CollectEarthMenu.2=Hizmetler +CollectEarthMenu.3=Büyük CSV plot dosyalarını böl +CollectEarthMenu.4=Verileri XML'e aktar (belirli bir tarihten itibaren) +CollectEarthMenu.5=Collect yedeği için dışa aktar +CollectEarthMenu.6=Collect Backup verilerini dışa aktar (tüm veriler) +CollectEarthMenu.7=Collect Backup verilerini dışa aktar (belirli bir tarihten itibaren) +CollectEarthMenu.8=Verileri XML'e aktar (özet özniteliğine göre filtrele) \ No newline at end of file From 18b71be315102cd9ac322683a0db98a86b0159aa Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:35:08 +0100 Subject: [PATCH 0772/1620] New translations Messages_tr.properties (Portuguese) --- .../earth/app/view/Messages_pt.properties | 487 +++++++++--------- 1 file changed, 237 insertions(+), 250 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index c2ce51b7bd..c9742c724a 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,255 +1,242 @@ -AboutDialog.19=Ocorreu um problema -AboutDialog.5=Para mais informações visite nosso site OpenForis.org -AboutDialog.6=Desculpe, um problema ocorreu ao tentar abrir esse link no seu navegador padrão. -AboutDialog.8=Ok -AspectCode.0=Norte -AspectCode.1=Nordeste -AspectCode.2=Leste -AspectCode.3=Sudeste -AspectCode.4=Sul -AspectCode.5=Sudoeste -AspectCode.6=Oeste -AspectCode.7=Noroeste -CollectEarthMenu.0=Importar Arquivo CEP -CollectEarthMenu.2=Utilidades -CollectEarthMenu.3=Separar arquivo CSV em partes -CollectEarthMenu.4=Exportar dados para XML (da data específica até o tempo presente) -CollectEarthMenu.5=Exportar para Collect Backup -CollectEarthMenu.6=Exportar dados como Collect Backup (todos os dados) -CollectEarthMenu.7=Exportar dados como Collect Backup (a partir de uma data) -CollectEarthMenu.8=Exportar dados para XML (filtrar por atributo) -CollectEarthWindow.0=Erro ao tentar exportar os dados para um arquivo CSV -CollectEarthWindow.10=Arquivo -CollectEarthWindow.11=Fechar -CollectEarthWindow.12=Ferramentas -CollectEarthWindow.13=Baixar dados para CSV (Excel) -CollectEarthWindow.14=Iniciar Análise SAIKU -CollectEarthWindow.15=Propiedades -CollectEarthWindow.16=Ajuda -CollectEarthWindow.17=Declaração -CollectEarthWindow.18=Encontrar parcelas ausentes em banco de dados +AboutDialog.19=Bir sorun oluştu +AboutDialog.5=Daha fazla bilgi için web sitemizi ziyaret edin OpenForis.org +AboutDialog.6=Üzgünüm, sisteminizin varsayılan tarayıcısı bu bağlantıyı açmak isterken bir sorun oluştu. +AboutDialog.8=Tamam +AspectCode.0=Kuzey +AspectCode.1=Kuzey-doğu +AspectCode.2=Doğu +AspectCode.3=Güney-doğu +AspectCode.4=Güney +AspectCode.5=Güney-batı +AspectCode.6=Batı +AspectCode.7=Kuzey-batı +CollectEarthWindow.0=Veri CSV dosyasına aktarılmaya çalışılırken hata oluştu +CollectEarthWindow.1=Dışa aktarma hatası +CollectEarthWindow.10=Dosya +CollectEarthWindow.11=Çıkış +CollectEarthWindow.12=Araçlar +CollectEarthWindow.13=Verileri CSV'ye aktar +CollectEarthWindow.14=SAIKU Analysis başlat +CollectEarthWindow.15=Özellikler +CollectEarthWindow.16=Yardım +CollectEarthWindow.17=Yasal uyarı +CollectEarthWindow.18=Veritabnında eksik plotları bulun CollectEarthWindow.19=Collect Earth -CollectEarthWindow.1=Erro ao exportar -CollectEarthWindow.20=Número de registros duplicados\: -CollectEarthWindow.21=Não foi possível encontrar o ícone para a janela principal -CollectEarthWindow.22=Tem certeza de querer fechar Collect Earth?
Ao fechar a janela será fechada também o servidor de Collect Earth -CollectEarthWindow.23=Confirmação requerida -CollectEarthWindow.24=Exportar a XML -CollectEarthWindow.25=Quer importar estes registros de qualquer maneira e perder o seus dados atuais? -CollectEarthWindow.26=Operador -CollectEarthWindow.27=Atualizar -CollectEarthWindow.28=O servidor Open Foris Collect Earth deve estar em execução enquanto o operador interprete os dados. -CollectEarthWindow.29=O servidor Saiku não está configurado. -CollectEarthWindow.2=Idioma -CollectEarthWindow.30=Por favor mantenha esta janela aberta enquanto estiver usando o Google Earth. -CollectEarthWindow.31=Exportar os dados coletados para um arquivo CSV -CollectEarthWindow.32=Fechar -CollectEarthWindow.33=O nome do operador deve ser maior de que 5 caracteres e mais curto do que 50 -CollectEarthWindow.34= Erro de Validação -CollectEarthWindow.35=NOME DO OPERADOR VAZIO\!
Preencha o nome do operador e clique no botão "Atualizar". -CollectEarthWindow.36=Nome do operador não pode estar vazio -CollectEarthWindow.37=Permanecer Aberto -CollectEarthWindow.38=Arquivos de CSV -CollectEarthWindow.39=AVISO\:Se recomenda de fazer um back-up dos seus dados atuais(Exportar para XML) antes de importar os novos dados -CollectEarthWindow.3=\ Erro ao importar dados. -CollectEarthWindow.40=Configurar caminho para o arquivo onde o Servidor Saiku se encontra instalado em Ferramentas->Propiedades->Avançado. -CollectEarthWindow.41=Guardar dados exportados para o arquivo\: -CollectEarthWindow.42=Sair -CollectEarthWindow.43=Registros repetidos detectados -CollectEarthWindow.44=Importar/Exportar -CollectEarthWindow.45=Exportar dados para XML (comprimidos) -CollectEarthWindow.46=Importar novos dados do ZIP (XML comprimidos) -CollectEarthWindow.47=Servidor Saiku não configurado -CollectEarthWindow.48=Arquivos ZIP -CollectEarthWindow.49=Arquivos Fusion CSV -CollectEarthWindow.4=Isenção de responsabilidade da FAO -CollectEarthWindow.50=Abrir Manual de Usuário -CollectEarthWindow.51=Verificar atualizações de Collect Earth -CollectEarthWindow.52=Abrir Arquivo de Registro da aplicação -CollectEarthWindow.53=Arquivo de Registro de Collect Earth -CollectEarthWindow.54=Carregar pontos de KML -CollectEarthWindow.55=Atualizar registros atuais usando CSV -CollectEarthWindow.56=Sobre... -CollectEarthWindow.57=O processo de arranque de Saiku ainda está em execução, por favor aguarde. -CollectEarthWindow.58=Não é possível iniciar a análise com Saiku -CollectEarthWindow.59=Quer voltar a gerar o conjunto de dados para o análise de Saiku?
Este processo pode demorar vários minutos.
Se clicar em "SIM" um novo conjunto de dados com a mais recente informação será gerada. -CollectEarthWindow.5=Fechar -CollectEarthWindow.60=Geraço de dados para Saiku -CollectEarthWindow.61=Exportar dados para XML (apenas os registros adicionados/modificados) -CollectEarthWindow.62=Sobre... -CollectEarthWindow.63=Erro acessando pontos de KML -CollectEarthWindow.64=Suporte Técnico -CollectEarthWindow.65=O nome do operador foi alterado -CollectEarthWindow.66=Nome do operador -CollectEarthWindow.67=Abra a pasta de dados do CE -CollectEarthWindow.6=Exportar dados a Fusion Table -CollectEarthWindow.70=Abra o manuel desta pesquisa -CollectEarthWindow.71=Gerar ferramenta Saiku Independente -CollectEarthWindow.7=Erro ao importar os dados -CollectEarthWindow.8=Texto de isenção não foi possivel de ser encontrado -CollectEarthWindow.9=Os dados importados contém registros que já estão presentes no seu banco de dados. -DynamicsCode.0=Inicialmente Floresta -DynamicsCode.1=Inicialmente Ãrea de Pastagem -DynamicsCode.2=Inicialmente Ãrea Urbana -DynamicsCode.3=Inicialmente Outros -DynamicsCode.4=Inicialmente Ãrea Alagada -DynamicsCode.5=Inicialmente Ãrea Agrícola -EarthApp.11=Collect Earth já está em execução -EarthApp.21=O arquivo contendo o gride de pontos como CSV/CED não foi encontrado no caminho selecionado\:
-EarthApp.23=Nenhum arquivo CSV/CED foi configurado \:

-EarthApp.24=O arquivo contendo o modelo Freemarker com a definição KML não foi encontrado no caminho selecionado \:
-EarthApp.26=Nenhum arquivo de definição KML foi configurado \:

-EarthApp.27=O arquivo contendo o formato balão HTML não foi encontrado no caminho selecionado \:
-EarthApp.29=Nenhum arquivo balão HTML foi configurado \:

-EarthApp.30=Por favor corrija a localização do arquivo no menu Ferramentas->Propriedades. -EarthApp.3=Lembrar mais tarde -EarthApp.4=Atualizar Agora -EarthApp.57=Existe uma nova versão do Collect Earth disponível\!
Como gostaria de proceder? -EarthApp.58=Alerta de Atualização -EarthApp.59=Erro ao importar aquivo do projeto -EarthApp.5=Não me lembre novamente -EarthApp.61=O arquivo do Collect Earth não pôde ser aberto.
Por favor certifique-se que Google Earth esteja instalado. -EarthApp.6= - Versão -EarthApp.70=AVISO -EarthApp.71=No Mac OS X, os arquivos do projeto Collect Earth (* .cep) não serão abertos no Collect Earth quando forem clicados duas vezes.
-EarthApp.72=Use a barra de ferramentas Collect Earth para abrir os arquivos .cep \: -EarthApp.73=Collect Earth - problemas em computadores Mac OS X -EarthSurveyService.9=Campo obrigatório -ExportActionListener.1=Escolha data a partir da qual queira exportar os dados -ExportDialogProcessMonitor.0=Processando os dados... -ExportDialogProcessMonitor.1=Esperando de inicializar o processo \: -ExportDialogProcessMonitor.4=Registros importados \: -ImportActionListener.0=Deseja importar os dados das parcelas que não tenham sido completamente preenchidos? -ImportActionListener.2=Se clicar NÃO apenas os dados das parcelas em estado completo ("verde"), serão importados. -ImportActionListener.3=Importar registros incompletos -ImportDialogProcessMonitor.0=\ CALCULANDO -ImportDialogProcessMonitor.11=Cifra inicial de registros \: -ImportDialogProcessMonitor.2=Importando registros.... -ImportDialogProcessMonitor.5=Cifra final de registros importados \: -ImportDialogProcessMonitor.8=Processando dados... -ImportProcessMonitorDialog.0=Imported records \: -ImportXMLDialogProcessMonitor.1 = Substitua dados no banco de dados -ImportXMLDialogProcessMonitor.2 = Importe apenas registros não conflitantes -InfiniteProgressMonitor.0=Cancelar operação -JFileChooserExistsAware.0=Arquivo de projeto Collect Earth -KmlImportService.13=Selecione um arquivo CSV para salvar a localização dos pontos -MissingPlotsListener.0=Erro ao obter informação sobre parcelas ausentes na Base de Dados -MissingPlotsListener.10=Número total de ppontos no desenho de amostragem \: -MissingPlotsListener.12=Número de pontos perdidos \: -MissingPlotsListener.14=Todos os pontos foram preenchidos\! -MissingPlotsListener.1=Parcelas ausentes -MissingPlotsListener.2=Copiar conteúdos -MissingPlotsListener.3=Escolha os arquivos contendo informação sobre as parcelas ( .csv or .ced files ) para os quais deseja saber se todos os dados foram preenchidos. -MissingPlotsListener.4=Parcelas ausentes - informação -MissingPlotsListener.5=Do arquivo \: -MissingPlotsListener.6=Exportar para arquivo CED -NO=Não -NO_TO_ALL=Não para todos -OpenTextFileListener.0=O arquivo de texto não foi encontrado em \: -OptionWizard.0=Opções do Collect Earth -OptionWizard.100=Abrir Planet -OptionWizard.101=Llave da API do Planet -OptionWizard.1021=URL SecureWatch -OptionWizard.102=Abrir Maxar SecureWatch -OptionWizard.103=Configure o URL para o Mapa Extra (abre quando configurado) \: -OptionWizard.104=Navegadores -OptionWizard.105=Abrir Earth Map -OptionWizard.110=Use imagens mensais fornecidas pela NICFI -OptionWizard.10=Abrir arquivo de backup -OptionWizard.11=Desconhecido\: usar ifconfig -OptionWizard.12=Cliente Instância -OptionWizard.13=Collect Earth Server IP -OptionWizard.14=Collect Earth Porta de Servidor (p.ex. 8023) -OptionWizard.15=Guardar & Aplicar alteraçães +CollectEarthWindow.2=Dil +CollectEarthWindow.20=Kopyalanan kayıt sayısı\: +CollectEarthWindow.21=Ana bilgisayar için simge bulunamadı +CollectEarthWindow.22=Collect Earth'ü kapatmak istediğinizden emin misiniz?
Pencereyi kapatmanız durumunda Collect Earth sunucusunu da kapatır. +CollectEarthWindow.23=Onay gerekiyor +CollectEarthWindow.24=XML Dışa aktar +CollectEarthWindow.25=Mevcut verileriniz kaybolacak yine de bu kayıtları eklemek istiyor musunuz? +CollectEarthWindow.26=Operatör +CollectEarthWindow.27=Güncelle +CollectEarthWindow.28=Operatör, verileri değerlendirirken Open Foris Collect Earth sunucusu çalışmalıdır. +CollectEarthWindow.29=Saiku Sunucusu yapılandırılmadı. +CollectEarthWindow.3=İçe aktarma hatası +CollectEarthWindow.30=Lütfen Google Earth'ü kullanırken bu pencereyi açık tutun. +CollectEarthWindow.31=Toplanan verileri CSV dosyasına aktar +CollectEarthWindow.32=Vazgeç +CollectEarthWindow.33=Operatör adı 5 karakterden uzun ve 50 karakterden kısa olmalıdır +CollectEarthWindow.34=Doğrulama hatası +CollectEarthWindow.35=OPERATÖR ADI BOŞ\!
Lütfen operatör adını girin ve "Güncelle" düğmesine basın. +CollectEarthWindow.36=Operatör adı boş olamaz +CollectEarthWindow.37=Açık Tut +CollectEarthWindow.38=CSV dosyaları +CollectEarthWindow.39=DİKKAT\: Yeni verileri almadan önce mevcut verilerinizi (XML'e Aktar) yedeklemeniz önerilir. +CollectEarthWindow.4=FAO Yasal uyarı bildirimleri +CollectEarthWindow.40=Araçlar-> Özellikler-> Gelişmiş sekmesinde Saiku Sunucusunun kurulu olduğu klasörün yolunu ayarlayın. +CollectEarthWindow.41=Dışa aktarılan verileri dosyaya kaydet +CollectEarthWindow.42=Vazgeç +CollectEarthWindow.43=Yinelenen kayıtlar bulundu +CollectEarthWindow.44=Verileri İçe/Dışa aktar +CollectEarthWindow.45=Verileri XML'e aktar (Sıkıştırılmış) +CollectEarthWindow.46=Verileri ZIP'ten içe aktar (sıkıştırılmış XML) +CollectEarthWindow.55=CSV kullanarak mevcut kayıtları güncelle +CollectEarthWindow.47=Saiku Sunucusu yapılandırılmadı +CollectEarthWindow.48=Zip/collect-data dosyası +CollectEarthWindow.49=Fusion table CSV dosyası +CollectEarthWindow.5=Kapat +CollectEarthWindow.50=Kullanım Kılavuzunu Aç +CollectEarthWindow.51=Collect Earth güncellemelerini kontrol et +CollectEarthWindow.52=Uygulama Günlüğünü Aç +CollectEarthWindow.53=Collect Earth Günlüğü +CollectEarthWindow.54=Noktaları KML'den yükle +CollectEarthWindow.56=Hakkında... +CollectEarthWindow.57=Saiku başlatıcısı işlemi hala devam ediyor, lütfen bekleyin. +CollectEarthWindow.58=Saiku analysis başlatılamıyor +CollectEarthWindow.59=Saiku analizi için veri setini yeniden oluşturmak ister misiniz?
Bu iÅŸlem zaman alabilir.
"EVET" üzerine tıklarsanız, en son bilgileri içeren yeni bir veri seti oluşturulur. +CollectEarthWindow.6=Fusion Table'a aktar +CollectEarthWindow.60=Saiku veri üretimi +CollectEarthWindow.61=Verileri XML'e aktar (Son dışa aktarımdan bu yana değiştirilmiş kayıtlar) +CollectEarthWindow.62=Hakkında... +CollectEarthWindow.63=Noktalar KML'den alırken hata oluştu +CollectEarthWindow.64=Teknik Destek +CollectEarthWindow.7=Veri içe aktarılırken hata oluştu +CollectEarthWindow.8=Yasal uyarı metni bulunamadı +CollectEarthWindow.9=Alınan veriler veritabanında zaten mevcut olan kayıtları içerir. +CollectEarthWindow.65=Operatör adı değiştirildi +CollectEarthWindow.66=Operatör adı +CollectEarthWindow.70=Anket rehberini aç +DynamicsCode.0=Başlangıçta Orman +DynamicsCode.1=Başlangıçta Mera +DynamicsCode.2=Başlangıçta Yerleşim +DynamicsCode.3=Başlangıçta Diğer +DynamicsCode.4=Başlangıçta Sulak +DynamicsCode.5=Başlangıçta Tarım +OpenTextFileListener.0=Metin dosyası bulunamadı \: +OptionWizard.0=Collect Earth seçenekler +OptionWizard.1=Tarayıcı Seç +OptionWizard.10=Yedekleme klasörünü aç +OptionWizard.11=Blinmeyen\: yapılandırma kullanımı +OptionWizard.12=İstemci durumu +OptionWizard.13=Collect Earth Sunucu IP +OptionWizard.14=Collect Earth sunucu girişi (örn. 8023) +OptionWizard.15=Kaydet & Değişiklikleri uygula OptionWizard.16=ID OptionWizard.17=X-coord OptionWizard.18=Y-coord -OptionWizard.19=Elevação -OptionWizard.1=Escolher Navegador -OptionWizard.20= Os conteúdos de Google Earth foram alterados.
Por favor aceite a regarga do conteúdo uma vez que Google Earth lhe pergunte. -OptionWizard.21=Atualizado com sucesso -OptionWizard.22=Relevo -OptionWizard.23=Houve um erro ao reabrir os dados de Google Earth -OptionWizard.24=Cancelar -OptionWizard.25=Modo de Operação -OptionWizard.26=BBDD servidor -OptionWizard.27=Isto não é um Arquivo Saiku reconhecível (o arquivo start-saiku.bat não se encontra presente) -OptionWizard.28=Servidor Saiku não reconhecível -OptionWizard.29=BBDD porta -OptionWizard.2=Tipo de uso(servidor/cliente) -OptionWizard.30=Opçães SQLite -OptionWizard.31=Dados de amostra -OptionWizard.32=Disposição da Parcela -OptionWizard.33=Definiço de Questionários -OptionWizard.34=Serviços Integrados -OptionWizard.35=Número de pontos de control -OptionWizard.36=Distância entre os pontos de control (em metros) -OptionWizard.37=Margem com o perímetro da parcela (em metros) -OptionWizard.38=O arquivo CSV/CED não foi possivel ser lido corretamente.
O arquivo deve conter valores separados por vírgulas do seguinte modo\:
-OptionWizard.39=ID,Y-Coordenada,X-Coordenada,elevação,relevo,orientação -OptionWizard.3=Servidor Instance -OptionWizard.40=Projetos -OptionWizard.41=Carregar um novo arquivo de projeto -OptionWizard.42=Erro ao fechar o leitor CSV -OptionWizard.43=Nome do questionário -OptionWizard.44=Realizar automaticamente backup do banco de dados em -OptionWizard.45=Abrir Earth Engine Playground (descontinuado) -OptionWizard.46=Abrir Earth Engine Timelapse -OptionWizard.47=Abrir Bing Maps -OptionWizard.48=Abrir formulário em um navegador externo em vez de Google Earth (recomendado para LINUX) -OptionWizard.49=Caminho do arquivo CED/CSV com as coordenadas das parcelas -OptionWizard.4=IP do computador atual\: -OptionWizard.50=Navegar.. -OptionWizard.51=Erro ao importar os arquivos do projeto -OptionWizard.52= Arquivo CSV/CED com coordinadas -OptionWizard.53=Sem pontos -OptionWizard.54=Ponto Central -OptionWizard.55=Erro ao importar diretório do projeto -OptionWizard.56=Carregar projeto -OptionWizard.57=Projetos previamente carregados -OptionWizard.58=Abrir GEE Code Editor (requer acesso ao Trusted Tester) -OptionWizard.59=Abrir Here Maps focado no ponto -OptionWizard.5= Collect Earth Servidor porto\: -OptionWizard.65=Caminho para arquivo Saiku -OptionWizard.66=Navegar... -OptionWizard.67=Caminho para o executável do Firefox -OptionWizard.68=Navegar... -OptionWizard.6=Parâmetros BD PostgreSQL -OptionWizard.70=Arquivos executáveis -OptionWizard.72=Arquivos binários -OptionWizard.73=Caminho para o executável do Chrome -OptionWizard.74=Navegar... -OptionWizard.76=Arquivos executáveis -OptionWizard.78=Arquivos binarios -OptionWizard.79=Caminho para o padrão de KML Freemarker -OptionWizard.7=Nome de Usuário -OptionWizard.80=Navegar... -OptionWizard.82=Padrão Freemarker -OptionWizard.83=Caminho para formulário HTML Balloon -OptionWizard.84=Navegar... -OptionWizard.86=Pagina web HTML -OptionWizard.87=Caminho para XML com definição IDM -OptionWizard.88=Navegar... -OptionWizard.8=Senha -OptionWizard.90=Definiço XML IDM -OptionWizard.91=Servidor (versão para gerente ou uso autônomo) -OptionWizard.92=Cliente (operador/conectado ao servidor) -OptionWizard.93=SQLite (Embutido/com base em um único arquivo) +OptionWizard.19=Yükseklik +OptionWizard.2=İş akışı (sunucu/istemci) +OptionWizard.20=Google Earth içerikleri değiştirildi.
Lütfen Google Earth tarafından istendiğinde içeriğin yeniden yüklenmesini kabul edin. +OptionWizard.21=Güncelleme başarılı +OptionWizard.22=Eğim +OptionWizard.23=Google Earth verilerini yeniden açarken bir hata oluştu +OptionWizard.24=İptal +OptionWizard.25=İşlem Modu +OptionWizard.26=DB host +OptionWizard.27=Bu tanınmış bir Saiku klasörü değil ( start-saiku.bat dosyası mevcut değil) +OptionWizard.28=Saiku Sunucusu tanınmadı +OptionWizard.29=DB port +OptionWizard.3=Sunucu örneği +OptionWizard.30=SQLite seçenekleri +OptionWizard.31=Örnek veri +OptionWizard.32=Plot düzeni +OptionWizard.33=Anket Tanımı +OptionWizard.34=Gelişmiş +OptionWizard.35=Kontrol noktası sayısı +OptionWizard.36=Kontrol noktaları arasındaki mesafe (metre cinsinden) +OptionWizard.37=Plot kenarı ile mesafesi (metre cinsinden) +OptionWizard.38=CSV / CED dosyası doğru okunamıyor.
Dosyanın böyle bir virgülle ayrılmış değerlere sahip olması beklenir \:
+OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect +OptionWizard.4=Geçerli bilgisayar IP'si \: +OptionWizard.40=Projeler +OptionWizard.41=Yeni bir proje dosyası yükle +OptionWizard.42=CSV okuyucuyu kapatırken hata oluştu +OptionWizard.43=Anketin adı +OptionWizard.44=veritabanını otomatik olarak yedekle +OptionWizard.45=Earth Engine plot alanına yakınlaştırarak aç +OptionWizard.46=Plot alanı için Earth Engine Timelapse'yi aç +OptionWizard.47=Plot alanı için Bing Maps'i aç +OptionWizard.48=Formu Google Earth yerine bir tarayıcıda aç (LINUX için önerilir) +OptionWizard.49=Plot verisini içeren ced / csv dosyasının yolu +OptionWizard.5=Collect Earth Sunucu girişi\: +OptionWizard.50=Tarayıcı... +OptionWizard.51=Proje dosyası içe aktarılırken hata oluştu +OptionWizard.52=Yalnızca koordinatlara sahip CSV / CED dosyası +OptionWizard.53=Puan yok +OptionWizard.54=Merkez noktası +OptionWizard.55=Proje dosyası içe aktarılırken hata oluştu +OptionWizard.56=Proje yükle +OptionWizard.57=Önceden yüklenmiş projeler +OptionWizard.58=GEE Kod Düzenleyicisini açın (Güvenilir Test Cihazı erişimi gerektirir) +OptionWizard.59=Plot üzerinde Here Maps'i aç +OptionWizard.6=PostgreSQL DB parametreleri +OptionWizard.65=Saiku klasör yolu +OptionWizard.66=Tarayıcı... +OptionWizard.67=Firefox kısayol yolu +OptionWizard.68=Tarayıcı... +OptionWizard.7=Kullanıcı adı +OptionWizard.70=Kısayol dosyaları +OptionWizard.72=İkili dosyalar +OptionWizard.73=Chrome kısayol yolu +OptionWizard.74=Tarayıcı... +OptionWizard.76=Kısayol dosyaları +OptionWizard.78=İkili dosyalar +OptionWizard.79=KML işaretçi şablonu yolu +OptionWizard.8=Parola +OptionWizard.80=Tarayıcı... +OptionWizard.82=İşaretçi şablonu +OptionWizard.83=Form tasarımının HTML balon yolu +OptionWizard.84=Tarayıcı... +OptionWizard.86=HTML web sayfası +OptionWizard.87=IDM tanımıyla XML yolu +OptionWizard.88=Tarayıcı... +OptionWizard.9=DB Adı +OptionWizard.90=XML IDM tanımlama +OptionWizard.91=Sunucu (yönetici sürümü veya tek başına kullanım) +OptionWizard.92=İstemci (operatör/sunucuya bağlı) +OptionWizard.93=SQLite (Gömülü / tek dosya tabanlı) OptionWizard.94=PostgreSQL -OptionWizard.95=Side of the sampling dots (in meters) -OptionWizard.9= Nome da Base de Dados -ProcessMonitorDialog.1=Erro de análise na linha número -ProcessMonitorDialog.4=, colunas -ProcessMonitorDialog.5= -- valores -SaikuAnalysisListener.0=Sim - Atualizar dados Saiku (longo processo) -SaikuAnalysisListener.1=Não - Use a mesma versão dos dados da última vez que o Saiku foi usado -SaikuToolExportListener.1=Geração da ferramenta Saiku -SaikuToolExportListener.2=Gerando a Ferramenta Saiku com o banco de dados atual -SaikuStarter.1=Iniciando Saiku -SaikuStarter.2=Iniciando Saiku pode demorar uns minutos, por favor aguarde\! -SaveEarthDataServlet.0=Sem dados -SaveEarthDataServlet.1=Problema ocorreu ao guardar os dados na Base de Dados -SaveEarthDataServlet.2=Os dados foram guardados -SlopeCode.0=Plano (0-5) -YES=Sim -YES_TO_ALL=Sim a todas \ No newline at end of file +OptionWizard.95=Örnekleme noktalarının kenarı (metre olarak) +SaikuAnalysisListener.0=Evet - Saiku verilerini yenile (uzun işlem) +SaikuAnalysisListener.1=Hayır - Sadece Saiku'yu başlat +SaikuStarter.1=Saiku başlatılıyor +SaikuStarter.2=Saiku başlatılıyor birkaç dakika sürebilir, lütfen bekleyin \! +SaveEarthDataServlet.0=Boş istek +SaveEarthDataServlet.1=Veriyi veritabanına kaydederken sorun oluştu +SaveEarthDataServlet.2=Veri kaydedildi +SlopeCode.0=Düz (0-5) +EarthApp.11=Collect Earth zaten çalışıyor +EarthApp.21=Plotlara ait seçili CSV/CED grid dosyası bulunamadı \:
+EarthApp.23=CSV/CED dosyası ayarlanmadı \:

+EarthApp.24=İşaretçi şablonunu KML tanımına sahip dosya seçili yolda bulunamadı \:
+EarthApp.26=KML tanım dosyası ayarlanmadı \:

+EarthApp.27=HTML balon formunu içeren dosya seçili yolda bulunamadı \:
+EarthApp.29=Hiçbir HTML balon dosyası oluşturulmadı \:

+EarthApp.3=Daha Sonra Hatırlat +EarthApp.30=Lütfen Araçlar-> Özellikler menüsünden dosya konumunu düzeltin.. +EarthApp.4=Şimdi Güncelle +EarthApp.5=Tekrar hatırlatma +EarthApp.57=Collect Earth'ün yeni bir sürümü var\!
Nasıl devam etmek istiyorsun? +EarthApp.58=Güncelleme uyarısı +EarthApp.59=Proje dosyasını içe aktarırken hata oluştu +EarthApp.6=\ - Versiyon +EarthApp.61=Collect Earth dosyası açılamadı.
Lütfen Google Earth’ün kurulu olduÄŸundan emin olun. +EarthSurveyService.9=Alan gerekli +ExportActionListener.1=Kayıtların GönderileceÄŸi Tarihi Seç +ExportDialogProcessMonitor.0=Veri iÅŸleniyor... +ExportDialogProcessMonitor.1=İşlemi baÅŸlatmak için bekleniyor \: +ExportDialogProcessMonitor.4=Dışa aktarılan kayıtlar \: +ImportProcessMonitorDialog.0=İçe aktarılan kayıtlar \: +ImportActionListener.0=Doldurulmamış plotlar içe aktarılsın mı? +ImportActionListener.2=EÄŸer tıklarsanız NO sadece tüm verileri içeren "yeÅŸil" durumdaki plotlar içe aktarılacaktır. +ImportActionListener.3=BitmemiÅŸ kayıtları içe aktar +ImportDialogProcessMonitor.0=\ HESAPLANIYOR +ImportDialogProcessMonitor.11=İlk kayıt sayısı \: +ImportDialogProcessMonitor.2=Kayıtlar içe aktarılıyor... +ImportDialogProcessMonitor.5=Güncel içe aktarılan kayıt sayısı \: +ImportDialogProcessMonitor.8=Veri iÅŸleniyor... +InfiniteProgressMonitor.0=İşlemi iptal et +JFileChooserExistsAware.0=Collect Earth Proje dosya +KmlImportService.13=Konumları kaydetmek için CSV dosyası seçin +MissingPlotsListener.0=Veritabanında bulunmayan plotlar hakkında bilgi alınırken hata oluÅŸtu +MissingPlotsListener.1=Eksik plotlar +MissingPlotsListener.10=Örnekleme tasarımındaki toplam plotların sayısı \: +MissingPlotsListener.12=Eksik plotların sayısı \: +MissingPlotsListener.14=Bütün plotlar dolu\! +MissingPlotsListener.2=İçeriÄŸi panoya kopyala +MissingPlotsListener.3=Tüm verilerin doldurulup doldurulmadığını öğrenmek istediÄŸiniz plot bilgilerini (.csv veya .ced dosyaları) içeren dosyaları seçin. +MissingPlotsListener.4=Eksik plotlar - Bilgi +MissingPlotsListener.5=Dosyadan \: +MissingPlotsListener.6=CED dosyasına aktar +ProcessMonitorDialog.1=Satır numarasında ayrıştırma hatası +ProcessMonitorDialog.4=, sütunlar +ProcessMonitorDialog.5=\ -- deÄŸerler + +ImportXMLDialogProcessMonitor.1 = Verilerin üzerine yaz +ImportXMLDialogProcessMonitor.2 = Sadece yinelenmeyen plotları içe aktar + +YES=Evet +YES_TO_ALL=Tümüne evet +NO=Hayır +NO_TO_ALL=Tümüne hayır + +CollectEarthMenu.0=CEP dosyasını içe aktar +CollectEarthMenu.2=Hizmetler +CollectEarthMenu.3=Büyük CSV plot dosyalarını böl +CollectEarthMenu.4=Verileri XML'e aktar (belirli bir tarihten itibaren) +CollectEarthMenu.5=Collect yedeÄŸi için dışa aktar +CollectEarthMenu.6=Collect Backup verilerini dışa aktar (tüm veriler) +CollectEarthMenu.7=Collect Backup verilerini dışa aktar (belirli bir tarihten itibaren) +CollectEarthMenu.8=Verileri XML'e aktar (özet özniteliÄŸine göre filtrele) \ No newline at end of file From a9b2a3822a439c79e5e5a97d55abc527af6c86d8 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:35:10 +0100 Subject: [PATCH 0773/1620] New translations Messages_tr.properties (English) --- .../earth/app/view/Messages_en.properties | 460 +++++++++--------- 1 file changed, 242 insertions(+), 218 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 7531b1f880..c9742c724a 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,218 +1,242 @@ -AboutDialog.19 = гарÑан нь аÑуудлыг -AboutDialog.5 = ДÑлгÑÑ€Ñнгүй мÑдÑÑллийг манай вÑб OpenForis.org очиж -AboutDialog.6 = Уучлаарай, аÑуудал нь таны ÑиÑтемийн Ñтандарт браузер ÑÐ½Ñ Ñ…Ð¾Ð»Ð±Ð¾Ð¾Ñыг нÑÑÑ… гÑж оролдож гарлаа. -AboutDialog.8 = Ок -AspectCode.0 = Хойд -AspectCode.1 = Зүүн Хойд -AspectCode.2 = Зүүн -AspectCode.3 = Зүүн-Өмнөд -AspectCode.4 = Өмнөд -AspectCode.5 = Баруун-Өмнөд -AspectCode.6 = Баруун -AspectCode.7 = Баруун Хойд -CollectEarthWindow.0 = CSV файл уруу өгөгдөл ÑкÑпортлох оролдож алдаа -CollectEarthWindow.1 = ЭкÑпортын алдаа -CollectEarthWindow.10 = Файлын -CollectEarthWindow.11 = Exit -CollectEarthWindow.12 Ñ…ÑÑ€ÑгÑÑл \= -CollectEarthWindow.13 = ЭкÑпортын CSV өгөгдөл -CollectEarthWindow.14 = Start SAIKU дүн шинжилгÑÑ -CollectEarthWindow.15 = Үл хөдлөх хөрөнгө -CollectEarthWindow.16 = туÑламж -CollectEarthWindow.17 = Disclaimer -CollectEarthWindow.18 = мÑдÑÑллийн Ñанд Ñураггүй алга газраа хай -CollectEarthWindow.19 = дÑлхийг цуглуулах -CollectEarthWindow.2 = Ñ…Ñл -CollectEarthWindow.20 = давхардÑан тоогоор бүртгÑлийн тоо\: -CollectEarthWindow.21 = гол хүрÑÑ Ð´Ò¯Ñ€Ñийг олж чадахгүй байна -CollectEarthWindow.22 = Ð¥ÑÑ€Ñв та цуглуулж дÑлхийг хаах Ñ…Ò¯ÑÑж байгаа гÑдÑгт итгÑлтÑй байна уу? Цонхыг хаах нь цуглуулж ДÑлхий Ñервер хаах болно
-CollectEarthWindow.23 = батлах Ñ…ÑÑ€ÑгтÑй -CollectEarthWindow.24 = XML ЭкÑпортын -CollectEarthWindow.25 = Та Ñмар ч байÑан ÑдгÑÑÑ€ бүртгÑлийг нÑмÑÑ…, таны одоогийн мÑдÑÑллийг алдах Ñ…Ò¯ÑÑж байна уу? -CollectEarthWindow.26 = Оператор -CollectEarthWindow.27 = шинÑчлÑÑ… -CollectEarthWindow.28 = <б> ÐÑÑлттÑй Foris оператор мÑдÑÑллийг хөрвүүлÑн ойлгох бол ДÑлхий Ñервер ажиллаж байх Ñ‘Ñтой цуглуулна. -CollectEarthWindow.29 = Saiku Ñерверийг тохируулаагүй байна. -CollectEarthWindow.3 = \ Импорт алдаа -CollectEarthWindow.30 = Та Google Earth ашиглаж байгаа бол ÑÐ½Ñ Ñ†Ð¾Ð½Ñ… нÑÑлттÑй байлгах уу. -CollectEarthWindow.31 = ЭкÑпортын CSV файлд мÑдÑÑллийг цуглуулÑан -CollectEarthWindow.32 = Quit -CollectEarthWindow.33 = операторын нÑÑ€ 5 Ñ‚ÑмдÑгтүүд болон 50 богино бодвол илүү урт байх Ñ‘Ñтой -CollectEarthWindow.34 = Баталгаажуулалт алдаа -CollectEarthWindow.35 = OPERATOR нÑÑ€ хооÑон \! Зар операторын нÑÑ€ бөглөх болон "шинÑчлÑÑ…" товчийг дарна уу. -CollectEarthWindow.36 = Оператор нÑÑ€ хооÑон байж болохгүй -CollectEarthWindow.37 = нÑÑлттÑй байлга -CollectEarthWindow.38 = CSV файлууд -CollectEarthWindow.39 = Ðнхааруулга\: Ð­Ð½Ñ Ð½ÑŒ зүйтÑй та нөөцлөх-ап таны одоогийн өгөгдөл (XML нь ЭкÑпортын) ÑˆÐ¸Ð½Ñ Ð¼ÑдÑÑллийг импортлогч өмнө -CollectEarthWindow.4 = ÐҮБ-ын ХХÐÐБ Disclaimer зар -CollectEarthWindow.40 Тодорхой хүртÑл \= Saiku Server Ð¥ÑÑ€ÑгÑÑл цÑÑÑн дотрооÑ> баÑлагт> ÐарийвчилÑан таб-д ÑуулгаÑан байна Ñ…Ð°Ð²Ñ‚Ð°Ñ Ð·Ð°Ð¼Ñ‹Ð³. -CollectEarthWindow.41 = Хадгаламж файл уруу өгөгдөл ÑкÑпортолÑон\: -CollectEarthWindow.42 = Quit -CollectEarthWindow.43 = ЗөрчилтÑй бүртгÑл олдлоо -CollectEarthWindow.44 = МÑдÑÑллийн Импорт / ЭкÑпортын -XML гÑж CollectEarthWindow.45 \= ЭкÑпортын мÑдÑÑ (шахÑан) -Zip-Ð°Ð°Ñ CollectEarthWindow.46 \= Импортын ÑˆÐ¸Ð½Ñ Ð¼ÑдÑÑ (шахÑан XML) -CSV ашиглан CollectEarthWindow.55 \= шинÑчлÑÑ… одоогийн бүртгÑл -CollectEarthWindow.47 = Saiku Ñерверийг тохируулаагүй бол -CollectEarthWindow.48 = Zip / цуглуулах-өгөгдлийн файлууд -CollectEarthWindow.49 = Fusion CSV файлууд -CollectEarthWindow.5 = Хаах -CollectEarthWindow.50 = ÐÑÑлттÑй Ñ…ÑÑ€ÑглÑгчийн гарын авлага -Цуглуулж дÑлхийн шинÑчлÑлтүүдийн хувьд CollectEarthWindow.51 \= шалгах -CollectEarthWindow.52 = ÐÑÑлттÑй Application нÑвтрÑÑ… Файлын -CollectEarthWindow.53 = цуглуулах ДÑлхий нÑвтрÑÑ… файл -KML нь CollectEarthWindow.54 \= ачааллын оноо -CollectEarthWindow.56 = тухай ... -CollectEarthWindow.57 = Saiku гарааны үйл Ñвц одоо ч ажиллаж байгаа, түр хүлÑÑÐ½Ñ Ò¯Ò¯. -CollectEarthWindow.58 = Saiku шинжилгÑÑг Ñхлүүлж чадахгүй -CollectEarthWindow.59 = Ð¥ÑÑ€Ñв та Saiku дүн шинжилгÑÑ Ñ…Ð¸Ð¹Ñ… мÑдÑÑллийн Ñанг дахин бий болгох Ñ…Ò¯ÑÑж байна уу?
Ð­Ð½Ñ Ò¯Ð¹Ð» Ñвц нь цаг хугацаа шаардÑан ажил байж болох юм.
Та хамгийн Ñүүлийн үеийн нь "YES" ÑˆÐ¸Ð½Ñ Ð´Ð°Ñ‚Ð°Ñетийн дÑÑÑ€ товшино уу мÑдÑÑллийг бий болно. -Fusion Ð¥Ò¯ÑнÑгт нь CollectEarthWindow.6 \= ЭкÑпортын -CollectEarthWindow.60 = Saiku мÑдÑÑ Ò¯ÐµÐ¸Ð¹Ð½ -CollectEarthWindow.61 = ЭкÑпортын XML өгөгдөл (Ñүүлийн ÑкÑпортын хойш өөрчлөгдÑөн бүртгÑл) -CollectEarthWindow.62 = тухай ... -CollectEarthWindow.63 = Ðлдаа KML авÑан оноо авах -CollectEarthWindow.64 = техникийн дÑмжлÑг үзүүлÑÑ… -CollectEarthWindow.7 = алдаа мÑдÑÑлÑл импортлох -CollectEarthWindow.8 = Disclaimer текÑÑ‚ олж чадахгүй байна -CollectEarthWindow.9 = оруулÑан мÑдÑÑллийг өөрийн мÑдÑÑллийн Ñанд нь байгаа бичлÑгийг агуулж байдаг. -DynamicsCode.0 = ЭхлÑÑд ой -DynamicsCode.1 = ЭхлÑÑд БÑлчÑÑрийн -DynamicsCode.2 = ЭхлÑÑд шийдвÑрлÑÑ… -DynamicsCode.3 = ЭхлÑÑд Otherland -DynamicsCode.4 = ЭхлÑÑд Ð£Ñ Ð½Ð°Ð¼Ð³Ð°Ñ€Ñ…Ð°Ð³ газрын -DynamicsCode.5 = ЭхлÑÑд Тариалангийн -OpenTextFileListener.0 = текÑÑ‚ файл олж байÑан юм\: -OptionWizard.0 = ДÑлхий Ñонголт цуглуулах -OptionWizard.1 = Хөтөч Ñонгоно уу -OptionWizard.10 = ÐÑÑлттÑй нөөц Ñ…Ð°Ð²Ñ‚Ð°Ñ -OptionWizard.11 = Тодорхойгүй\: ашиглах ifconfig -OptionWizard.12 = Ð¥ÑÑ€ÑглÑгч шатны -OptionWizard.13 = ДÑлхий Server IP цуглуулах -OptionWizard.14 = ДÑлхий Server портыг (жишÑÑ Ð½ÑŒ\: 8023) цуглуулах -OptionWizard.15 = Save & өөрчлөлт хийх -OptionWizard.16 = ID -OptionWizard.17 = X-coord -OptionWizard.18 = Y-coord -OptionWizard.19 = Elevation -OptionWizard.2 = урÑгал даÑгалын (Ñервер / үйлчлүүлÑгч) - OptionWizard.20 \= Google Earth агуулга нь өөрчлөгдÑөн байна.
Ðгуулга нь ачаалах хүлÑÑн авна уу та Google Earth-ÑÑÑ Ð°Ñуух үед. -OptionWizard.21 = шинÑчлÑÑ… амжилттай -OptionWizard.22 = Ð¥Ñвгий -OptionWizard.23 = дахин нÑÑÑ… Google Earth мÑдÑÑллийг үед алдаа гарлаа -OptionWizard.24 = Болих -OptionWizard.25 = үйл ажиллагааны горим -OptionWizard.26 = DB хоÑÑ‚ -OptionWizard.27 = Ð­Ð½Ñ Ð½ÑŒ хүлÑÑн зөвшөөрөгдÑөн Saiku Folder (ÑхлÑÑ… saiku.bat файл байхгүй бол) ороогүй байна -OptionWizard.28 = Saiku Server хүлÑÑн зөвшөөрөөгүй -OptionWizard.29 = DB порт -OptionWizard.3 = Server шатны -OptionWizard.30 = SQLite Ñонголт -OptionWizard.31 = ЖишÑÑ Ð¼ÑдÑÑлÑл -OptionWizard.32 = Plot зохион байгуулалт -OptionWizard.33 = Ñудалгаа тодорхойлолт -OptionWizard.34 = ÐарийвчилÑан -OptionWizard.35 = түүвÑÑ€ цÑгийн тоо -OptionWizard.36 = (метр) дÑÑж авах цÑгийн хоорондох зай -(Метр) ДÑÑж авах цÑгүүд OptionWizard.95 \= Side -OptionWizard.38 = CSV / CED файлыг зөв уншиж чадахгүй байгаа файлыг
иймÑрхүү таÑлалаар туÑгаарлаж утгыг байх төлөвтÑй байна\:.
<Б> -OptionWizard.39 = ID, YCoordinate, XCoordinate, өндрийн, налуу, тал -OptionWizard.4 = Одоогийн компьютерийн IP\: -OptionWizard.40 = төÑлүүд -OptionWizard.41 = ÑˆÐ¸Ð½Ñ Ñ‚Ó©Ñөл файлыг ачаалж -OptionWizard.42 = Ðлдаа CSV уншигч хаах -Судалгааны OptionWizard.43 \= нÑÑ€ -OptionWizard.44 = автоматаар нөөцлөх хүртÑл өгөгдлийн Ñан дÑÑÑ€ -OptionWizard.45 = ÐÑÑлттÑй Earth Engine талбай талбай руу томруулÑан -талбай мÑдÑÑлÑл / CSV файлыг ced нь OptionWizard.49 \= зам -Харин Google Earth-ийн браузер дÑÑÑ€ OptionWizard.48 \= ÐÑÑлттÑй Ñ…ÑлбÑÑ€ (ЛинукÑд зориулÑан байлгахыг зөвлөдөг) -OptionWizard.5 = цуглуулах ДÑлхий Server портыг\: -OptionWizard.50 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... -OptionWizard.51 = Ðлдаа импортлох төÑөл файл -Зөвхөн координат нь OptionWizard.52 \= CSV / CED файл -OptionWizard.53 = талбай -OptionWizard.54 = Төв цÑг нь -OptionWizard.55 = Ðлдаа импортлох төÑөл Ñ…Ð°Ð²Ñ‚Ð°Ñ -OptionWizard.56 = ачааллын төÑөл -OptionWizard.57 = Өмнө нь дуудагддаг төÑөл -OptionWizard.58 = ÐÑÑлттÑй Gee тоглоомын талбай (Trusted Tester хандах шаардлагатай) -OptionWizard.59 = ÐÑÑлттÑй Энд Maps газар дÑÑÑ€ анхаарлаа хандуулж -OptionWizard.6 = PostgreSQL DB параметрүүд -OptionWizard.65 = Saiku хавтÑанд зам -OptionWizard.66 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... -OptionWizard.67 = Firefox гүйцÑтгÑгдÑÑ… нь зам -OptionWizard.68 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... -OptionWizard.7 = Ð¥ÑÑ€ÑглÑгчийн нÑÑ€ -OptionWizard.70 = гүйцÑтгÑгдÑÑ… файлууд -OptionWizard.72 = Хоёртын файлууд -OptionWizard.73 = Chrome гүйцÑтгÑгдÑÑ… нь зам -OptionWizard.74 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... -OptionWizard.76 = гүйцÑтгÑгдÑÑ… файлууд -OptionWizard.78 = Хоёртын файлууд -OptionWizard.79 = KML Freemarker загварт зам -OptionWizard.8 = Ðууц үг -OptionWizard.80 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... -OptionWizard.82 = Freemarker загвар -OptionWizard.83 = HTML бөмбөлөг Ñ…ÑлбÑÑ€ дизайн зам -OptionWizard.84 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... -OptionWizard.86 = HTML вÑб Ñ…ÑƒÑƒÐ´Ð°Ñ -OptionWizard.87 = IDM тодорхойлолт нь XML нь зам -OptionWizard.88 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... -OptionWizard.9 = DB нÑÑ€ -OptionWizard.90 = XML IDM тодорхойлолт -OptionWizard.91 = Server (менежер хувилбар, ÑÑвÑл дангаараа ашиглах нь) -OptionWizard.92 = Ð¥ÑÑ€ÑглÑгч (оператор / Ñервер уруу холбогдÑон) -OptionWizard.93 = SQLite (Embedded / нÑг файл дÑÑÑ€ тулгуурлаÑан) -OptionWizard.94 = PostgreSQL -SaikuAnalysisListener.0 = Тийм - СÑргÑÑÑ… Saiku мÑдÑÑлÑл (урт үйл Ñвц) -SaikuAnalysisListener.1 = Үгүй - ЗүгÑÑÑ€ л Saiku ÑхлÑÑ… -SaikuStarter.1 Saiku ÑхлÑн \= -SaikuStarter.2 Saiku ÑхлÑн зарим нÑг минут үргÑлжилж болох \= түр хүлÑÑÐ½Ñ Ò¯Ò¯ \! -SaveEarthDataServlet.0 = ХооÑон Ñ…Ò¯ÑÑлт -SaveEarthDataServlet.1 = ÐÑуудлын мÑдÑÑллийн Ñанд мÑдÑÑлÑл Ñ…ÑмнÑÑ… гарлаа -SaveEarthDataServlet.2 = өгөгдөл хадгалÑан байна -SlopeCode.0 = Хавтгай (0-5) -EarthApp.11 = дÑлхий аль Ñ…Ñдийн ажиллаж байгаа цуглуулах -EarthApp.21 хашааны ÑүлжÑÑ Ð°Ð³ÑƒÑƒÐ»Ñан файлыг \= а CSV / CED ÑонгоÑон зам олж чадаагүй байна гÑж\:
<би> -EarthApp.23 = Ямар ч CSV / CED файл тохируулга байна\:

-EarthApp.24 = KML тодорхойлолт нь Freemarker загварыг агуулÑан файлыг ÑонгоÑон замаар олж ороогүй байна\:
<би> -EarthApp.26 = Ямар ч KML тодорхойлолт файл тохируулга байна\:

-EarthApp.27 = HTML бөмбөлөг Ñ…ÑлбÑрийг агуулÑан файлыг ÑонгоÑон замаар олж ороогүй байна\:
<би> -EarthApp.29 = Ямар ч HTML бөмбөлөг файл тохируулга байна\:

-EarthApp.3 = дараа нь надад Ñануул -EarthApp.30 = Ð¥ÑÑ€ÑгÑÑл цÑÑÑн дотрооÑ> Properties цÑÑ Ñ„Ð°Ð¹Ð»Ñ‹Ð½ байршлыг зөв оруулна уу. -EarthApp.4 = шинÑчлÑÑ… Одоо -EarthApp.5 = намайг дахин Ñануулах байхгүй юу -EarthApp.57 = <б> цуглуулж ДÑлхий боломжтой -ийн ÑˆÐ¸Ð½Ñ Ñ…ÑƒÐ²Ð¸Ð»Ð±Ð°Ñ€ байна\! Ð¥ÑÑ€Ñв та Ñ…ÑрхÑн цааш Ñ…Ò¯ÑÑж байна вÑ?
-EarthApp.58 = шинÑчлÑÑ… бөгөөд дохио авах байрлуулах -EarthApp.59 = Ðлдаа төÑөл файлыг импортлох -EarthApp.6 = \ - Хувилбар -EarthApp.61 = цуглуулж ДÑлхий файл, нÑÑлттÑй байж чадÑангүй.
Google Earth ÑуулгаÑан ÑÑÑхийг шалгана уу. -EarthSurveyService.9 = талбар шаардлагатай -ExportActionListener.1 = ÑхлÑн ÑкÑпортын Records-руу огноо Ñонгох -ExportDialogProcessMonitor.0 = боловÑруулах мÑдÑÑ ... -ExportDialogProcessMonitor.1 = үйл Ñвцыг Ñхлүүлж хүлÑÑж байна\: -ExportDialogProcessMonitor.4 = ÑкÑпортлох бүртгÑл\: -ImportProcessMonitorDialog.0 = Импортын бүртгÑл\: -ImportActionListener.0 = бүрÑн дүүрÑн чадаагүй байна талбайд өгөгдлийн импортын Ñ‘Ñтой юу? -ImportActionListener.2 = Та дарна бол <и> <б> NO бүх өгөгдлийг агуулÑан "ногоон" төлөвт талбайд, зөвхөн өгөгдөл оруулÑан болно. -ImportActionListener.3 = Импорт Ð±ÑƒÑ Ð±Ð¾Ð»Ð¾Ð²ÑруулÑан бүртгÑл -ImportDialogProcessMonitor.0 = ТООЦОЖ бичлÑгүүдийн ImportDialogProcessMonitor.11 \= Эхний дугаар\: -ImportDialogProcessMonitor.2 = бүртгÑл импортлож байна ... -Импортын бүртгÑл ImportDialogProcessMonitor.5 \= бодит тоо\: -ImportDialogProcessMonitor.8 = боловÑруулах мÑдÑÑ ... -InfiniteProgressMonitor.0 = ажиллагааг Cancel -JFileChooserExistsAware.0 = ДÑлхий төÑөл файлыг цуглуулах -KmlImportService.13 = тулд талбай байршлыг хадгалахын тулд CSV файлыг Ñонгоно уу -Database дÑÑÑ€ нь байхгүй хашааны-ий тухай мÑдÑÑлÑл авах бол MissingPlotsListener.0 \= алдаа -MissingPlotsListener.1 = хайж байна газрууд -MissingPlotsListener.10 = дÑÑж дизайн талбайд нийт тоо\: -MissingPlotsListener.12 = алга хашааны тоо\: -MissingPlotsListener.14 = мÑдÑÑлÑл талбай дүүрÑн байдаг \! -MissingPlotsListener.2 = Хуулах Бал нь агуулга -MissingPlotsListener.3 = Та бүх мÑдÑÑлÑл ирÑÑн дүүрÑн байÑан ÑÑÑхийг мÑдÑхийг Ñ…Ò¯ÑÑж байгаа нь хуйвалдаан мÑдÑÑлÑл (.csv ÑÑвÑл .ced файлууд) агуулÑан файлуудыг Ñонгоорой. -MissingPlotsListener.4 = хайж байна талбай - мÑдÑÑлÑл -MissingPlotsListener.5 Ñ„Ð°Ð¹Ð»Ð°Ð°Ñ \=\: -CED файлд MissingPlotsListener.6 \= ЭкÑпортын -мөр нь Ñ…Ñд Ñ…ÑдÑн ProcessMonitorDialog.1 \= магадлах алдаа -ProcessMonitorDialog.4 = багана -ProcessMonitorDialog.5 = \ - утгууд \ No newline at end of file +AboutDialog.19=Bir sorun oluÅŸtu +AboutDialog.5=Daha fazla bilgi için web sitemizi ziyaret edin OpenForis.org +AboutDialog.6=Üzgünüm, sisteminizin varsayılan tarayıcısı bu baÄŸlantıyı açmak isterken bir sorun oluÅŸtu. +AboutDialog.8=Tamam +AspectCode.0=Kuzey +AspectCode.1=Kuzey-doÄŸu +AspectCode.2=DoÄŸu +AspectCode.3=Güney-doÄŸu +AspectCode.4=Güney +AspectCode.5=Güney-batı +AspectCode.6=Batı +AspectCode.7=Kuzey-batı +CollectEarthWindow.0=Veri CSV dosyasına aktarılmaya çalışılırken hata oluÅŸtu +CollectEarthWindow.1=Dışa aktarma hatası +CollectEarthWindow.10=Dosya +CollectEarthWindow.11=Çıkış +CollectEarthWindow.12=Araçlar +CollectEarthWindow.13=Verileri CSV'ye aktar +CollectEarthWindow.14=SAIKU Analysis baÅŸlat +CollectEarthWindow.15=Özellikler +CollectEarthWindow.16=Yardım +CollectEarthWindow.17=Yasal uyarı +CollectEarthWindow.18=Veritabnında eksik plotları bulun +CollectEarthWindow.19=Collect Earth +CollectEarthWindow.2=Dil +CollectEarthWindow.20=Kopyalanan kayıt sayısı\: +CollectEarthWindow.21=Ana bilgisayar için simge bulunamadı +CollectEarthWindow.22=Collect Earth'ü kapatmak istediÄŸinizden emin misiniz?
Pencereyi kapatmanız durumunda Collect Earth sunucusunu da kapatır. +CollectEarthWindow.23=Onay gerekiyor +CollectEarthWindow.24=XML Dışa aktar +CollectEarthWindow.25=Mevcut verileriniz kaybolacak yine de bu kayıtları eklemek istiyor musunuz? +CollectEarthWindow.26=Operatör +CollectEarthWindow.27=Güncelle +CollectEarthWindow.28=Operatör, verileri değerlendirirken Open Foris Collect Earth sunucusu çalışmalıdır. +CollectEarthWindow.29=Saiku Sunucusu yapılandırılmadı. +CollectEarthWindow.3=İçe aktarma hatası +CollectEarthWindow.30=Lütfen Google Earth'ü kullanırken bu pencereyi açık tutun. +CollectEarthWindow.31=Toplanan verileri CSV dosyasına aktar +CollectEarthWindow.32=Vazgeç +CollectEarthWindow.33=Operatör adı 5 karakterden uzun ve 50 karakterden kısa olmalıdır +CollectEarthWindow.34=Doğrulama hatası +CollectEarthWindow.35=OPERATÖR ADI BOŞ\!
Lütfen operatör adını girin ve "Güncelle" düğmesine basın. +CollectEarthWindow.36=Operatör adı boş olamaz +CollectEarthWindow.37=Açık Tut +CollectEarthWindow.38=CSV dosyaları +CollectEarthWindow.39=DİKKAT\: Yeni verileri almadan önce mevcut verilerinizi (XML'e Aktar) yedeklemeniz önerilir. +CollectEarthWindow.4=FAO Yasal uyarı bildirimleri +CollectEarthWindow.40=Araçlar-> Özellikler-> Gelişmiş sekmesinde Saiku Sunucusunun kurulu olduğu klasörün yolunu ayarlayın. +CollectEarthWindow.41=Dışa aktarılan verileri dosyaya kaydet +CollectEarthWindow.42=Vazgeç +CollectEarthWindow.43=Yinelenen kayıtlar bulundu +CollectEarthWindow.44=Verileri İçe/Dışa aktar +CollectEarthWindow.45=Verileri XML'e aktar (Sıkıştırılmış) +CollectEarthWindow.46=Verileri ZIP'ten içe aktar (sıkıştırılmış XML) +CollectEarthWindow.55=CSV kullanarak mevcut kayıtları güncelle +CollectEarthWindow.47=Saiku Sunucusu yapılandırılmadı +CollectEarthWindow.48=Zip/collect-data dosyası +CollectEarthWindow.49=Fusion table CSV dosyası +CollectEarthWindow.5=Kapat +CollectEarthWindow.50=Kullanım Kılavuzunu Aç +CollectEarthWindow.51=Collect Earth güncellemelerini kontrol et +CollectEarthWindow.52=Uygulama Günlüğünü Aç +CollectEarthWindow.53=Collect Earth Günlüğü +CollectEarthWindow.54=Noktaları KML'den yükle +CollectEarthWindow.56=Hakkında... +CollectEarthWindow.57=Saiku başlatıcısı işlemi hala devam ediyor, lütfen bekleyin. +CollectEarthWindow.58=Saiku analysis başlatılamıyor +CollectEarthWindow.59=Saiku analizi için veri setini yeniden oluşturmak ister misiniz?
Bu iÅŸlem zaman alabilir.
"EVET" üzerine tıklarsanız, en son bilgileri içeren yeni bir veri seti oluşturulur. +CollectEarthWindow.6=Fusion Table'a aktar +CollectEarthWindow.60=Saiku veri üretimi +CollectEarthWindow.61=Verileri XML'e aktar (Son dışa aktarımdan bu yana değiştirilmiş kayıtlar) +CollectEarthWindow.62=Hakkında... +CollectEarthWindow.63=Noktalar KML'den alırken hata oluştu +CollectEarthWindow.64=Teknik Destek +CollectEarthWindow.7=Veri içe aktarılırken hata oluştu +CollectEarthWindow.8=Yasal uyarı metni bulunamadı +CollectEarthWindow.9=Alınan veriler veritabanında zaten mevcut olan kayıtları içerir. +CollectEarthWindow.65=Operatör adı değiştirildi +CollectEarthWindow.66=Operatör adı +CollectEarthWindow.70=Anket rehberini aç +DynamicsCode.0=Başlangıçta Orman +DynamicsCode.1=Başlangıçta Mera +DynamicsCode.2=Başlangıçta Yerleşim +DynamicsCode.3=Başlangıçta Diğer +DynamicsCode.4=Başlangıçta Sulak +DynamicsCode.5=Başlangıçta Tarım +OpenTextFileListener.0=Metin dosyası bulunamadı \: +OptionWizard.0=Collect Earth seçenekler +OptionWizard.1=Tarayıcı Seç +OptionWizard.10=Yedekleme klasörünü aç +OptionWizard.11=Blinmeyen\: yapılandırma kullanımı +OptionWizard.12=İstemci durumu +OptionWizard.13=Collect Earth Sunucu IP +OptionWizard.14=Collect Earth sunucu girişi (örn. 8023) +OptionWizard.15=Kaydet & Değişiklikleri uygula +OptionWizard.16=ID +OptionWizard.17=X-coord +OptionWizard.18=Y-coord +OptionWizard.19=Yükseklik +OptionWizard.2=İş akışı (sunucu/istemci) +OptionWizard.20=Google Earth içerikleri değiştirildi.
Lütfen Google Earth tarafından istendiğinde içeriğin yeniden yüklenmesini kabul edin. +OptionWizard.21=Güncelleme başarılı +OptionWizard.22=Eğim +OptionWizard.23=Google Earth verilerini yeniden açarken bir hata oluştu +OptionWizard.24=İptal +OptionWizard.25=İşlem Modu +OptionWizard.26=DB host +OptionWizard.27=Bu tanınmış bir Saiku klasörü değil ( start-saiku.bat dosyası mevcut değil) +OptionWizard.28=Saiku Sunucusu tanınmadı +OptionWizard.29=DB port +OptionWizard.3=Sunucu örneği +OptionWizard.30=SQLite seçenekleri +OptionWizard.31=Örnek veri +OptionWizard.32=Plot düzeni +OptionWizard.33=Anket Tanımı +OptionWizard.34=Gelişmiş +OptionWizard.35=Kontrol noktası sayısı +OptionWizard.36=Kontrol noktaları arasındaki mesafe (metre cinsinden) +OptionWizard.37=Plot kenarı ile mesafesi (metre cinsinden) +OptionWizard.38=CSV / CED dosyası doğru okunamıyor.
Dosyanın böyle bir virgülle ayrılmış değerlere sahip olması beklenir \:
+OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect +OptionWizard.4=Geçerli bilgisayar IP'si \: +OptionWizard.40=Projeler +OptionWizard.41=Yeni bir proje dosyası yükle +OptionWizard.42=CSV okuyucuyu kapatırken hata oluştu +OptionWizard.43=Anketin adı +OptionWizard.44=veritabanını otomatik olarak yedekle +OptionWizard.45=Earth Engine plot alanına yakınlaştırarak aç +OptionWizard.46=Plot alanı için Earth Engine Timelapse'yi aç +OptionWizard.47=Plot alanı için Bing Maps'i aç +OptionWizard.48=Formu Google Earth yerine bir tarayıcıda aç (LINUX için önerilir) +OptionWizard.49=Plot verisini içeren ced / csv dosyasının yolu +OptionWizard.5=Collect Earth Sunucu girişi\: +OptionWizard.50=Tarayıcı... +OptionWizard.51=Proje dosyası içe aktarılırken hata oluştu +OptionWizard.52=Yalnızca koordinatlara sahip CSV / CED dosyası +OptionWizard.53=Puan yok +OptionWizard.54=Merkez noktası +OptionWizard.55=Proje dosyası içe aktarılırken hata oluştu +OptionWizard.56=Proje yükle +OptionWizard.57=Önceden yüklenmiş projeler +OptionWizard.58=GEE Kod Düzenleyicisini açın (Güvenilir Test Cihazı erişimi gerektirir) +OptionWizard.59=Plot üzerinde Here Maps'i aç +OptionWizard.6=PostgreSQL DB parametreleri +OptionWizard.65=Saiku klasör yolu +OptionWizard.66=Tarayıcı... +OptionWizard.67=Firefox kısayol yolu +OptionWizard.68=Tarayıcı... +OptionWizard.7=Kullanıcı adı +OptionWizard.70=Kısayol dosyaları +OptionWizard.72=İkili dosyalar +OptionWizard.73=Chrome kısayol yolu +OptionWizard.74=Tarayıcı... +OptionWizard.76=Kısayol dosyaları +OptionWizard.78=İkili dosyalar +OptionWizard.79=KML işaretçi şablonu yolu +OptionWizard.8=Parola +OptionWizard.80=Tarayıcı... +OptionWizard.82=İşaretçi şablonu +OptionWizard.83=Form tasarımının HTML balon yolu +OptionWizard.84=Tarayıcı... +OptionWizard.86=HTML web sayfası +OptionWizard.87=IDM tanımıyla XML yolu +OptionWizard.88=Tarayıcı... +OptionWizard.9=DB Adı +OptionWizard.90=XML IDM tanımlama +OptionWizard.91=Sunucu (yönetici sürümü veya tek başına kullanım) +OptionWizard.92=İstemci (operatör/sunucuya bağlı) +OptionWizard.93=SQLite (Gömülü / tek dosya tabanlı) +OptionWizard.94=PostgreSQL +OptionWizard.95=Örnekleme noktalarının kenarı (metre olarak) +SaikuAnalysisListener.0=Evet - Saiku verilerini yenile (uzun işlem) +SaikuAnalysisListener.1=Hayır - Sadece Saiku'yu başlat +SaikuStarter.1=Saiku başlatılıyor +SaikuStarter.2=Saiku başlatılıyor birkaç dakika sürebilir, lütfen bekleyin \! +SaveEarthDataServlet.0=Boş istek +SaveEarthDataServlet.1=Veriyi veritabanına kaydederken sorun oluştu +SaveEarthDataServlet.2=Veri kaydedildi +SlopeCode.0=Düz (0-5) +EarthApp.11=Collect Earth zaten çalışıyor +EarthApp.21=Plotlara ait seçili CSV/CED grid dosyası bulunamadı \:
+EarthApp.23=CSV/CED dosyası ayarlanmadı \:

+EarthApp.24=İşaretçi şablonunu KML tanımına sahip dosya seçili yolda bulunamadı \:
+EarthApp.26=KML tanım dosyası ayarlanmadı \:

+EarthApp.27=HTML balon formunu içeren dosya seçili yolda bulunamadı \:
+EarthApp.29=Hiçbir HTML balon dosyası oluşturulmadı \:

+EarthApp.3=Daha Sonra Hatırlat +EarthApp.30=Lütfen Araçlar-> Özellikler menüsünden dosya konumunu düzeltin.. +EarthApp.4=Şimdi Güncelle +EarthApp.5=Tekrar hatırlatma +EarthApp.57=Collect Earth'ün yeni bir sürümü var\!
Nasıl devam etmek istiyorsun? +EarthApp.58=Güncelleme uyarısı +EarthApp.59=Proje dosyasını içe aktarırken hata oluştu +EarthApp.6=\ - Versiyon +EarthApp.61=Collect Earth dosyası açılamadı.
Lütfen Google Earth’ün kurulu olduÄŸundan emin olun. +EarthSurveyService.9=Alan gerekli +ExportActionListener.1=Kayıtların GönderileceÄŸi Tarihi Seç +ExportDialogProcessMonitor.0=Veri iÅŸleniyor... +ExportDialogProcessMonitor.1=İşlemi baÅŸlatmak için bekleniyor \: +ExportDialogProcessMonitor.4=Dışa aktarılan kayıtlar \: +ImportProcessMonitorDialog.0=İçe aktarılan kayıtlar \: +ImportActionListener.0=Doldurulmamış plotlar içe aktarılsın mı? +ImportActionListener.2=EÄŸer tıklarsanız NO sadece tüm verileri içeren "yeÅŸil" durumdaki plotlar içe aktarılacaktır. +ImportActionListener.3=BitmemiÅŸ kayıtları içe aktar +ImportDialogProcessMonitor.0=\ HESAPLANIYOR +ImportDialogProcessMonitor.11=İlk kayıt sayısı \: +ImportDialogProcessMonitor.2=Kayıtlar içe aktarılıyor... +ImportDialogProcessMonitor.5=Güncel içe aktarılan kayıt sayısı \: +ImportDialogProcessMonitor.8=Veri iÅŸleniyor... +InfiniteProgressMonitor.0=İşlemi iptal et +JFileChooserExistsAware.0=Collect Earth Proje dosya +KmlImportService.13=Konumları kaydetmek için CSV dosyası seçin +MissingPlotsListener.0=Veritabanında bulunmayan plotlar hakkında bilgi alınırken hata oluÅŸtu +MissingPlotsListener.1=Eksik plotlar +MissingPlotsListener.10=Örnekleme tasarımındaki toplam plotların sayısı \: +MissingPlotsListener.12=Eksik plotların sayısı \: +MissingPlotsListener.14=Bütün plotlar dolu\! +MissingPlotsListener.2=İçeriÄŸi panoya kopyala +MissingPlotsListener.3=Tüm verilerin doldurulup doldurulmadığını öğrenmek istediÄŸiniz plot bilgilerini (.csv veya .ced dosyaları) içeren dosyaları seçin. +MissingPlotsListener.4=Eksik plotlar - Bilgi +MissingPlotsListener.5=Dosyadan \: +MissingPlotsListener.6=CED dosyasına aktar +ProcessMonitorDialog.1=Satır numarasında ayrıştırma hatası +ProcessMonitorDialog.4=, sütunlar +ProcessMonitorDialog.5=\ -- deÄŸerler + +ImportXMLDialogProcessMonitor.1 = Verilerin üzerine yaz +ImportXMLDialogProcessMonitor.2 = Sadece yinelenmeyen plotları içe aktar + +YES=Evet +YES_TO_ALL=Tümüne evet +NO=Hayır +NO_TO_ALL=Tümüne hayır + +CollectEarthMenu.0=CEP dosyasını içe aktar +CollectEarthMenu.2=Hizmetler +CollectEarthMenu.3=Büyük CSV plot dosyalarını böl +CollectEarthMenu.4=Verileri XML'e aktar (belirli bir tarihten itibaren) +CollectEarthMenu.5=Collect yedeÄŸi için dışa aktar +CollectEarthMenu.6=Collect Backup verilerini dışa aktar (tüm veriler) +CollectEarthMenu.7=Collect Backup verilerini dışa aktar (belirli bir tarihten itibaren) +CollectEarthMenu.8=Verileri XML'e aktar (özet özniteliÄŸine göre filtrele) \ No newline at end of file From 3248c628faaf5f3954936260d77b2b6ab1ec12d3 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:35:11 +0100 Subject: [PATCH 0774/1620] New translations Messages_vi.properties (French) --- .../earth/app/view/Messages_fr.properties | 441 +++++++++--------- 1 file changed, 221 insertions(+), 220 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index e5b9bd9e45..5110140e9c 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,220 +1,221 @@ -AboutDialog.19 = ບັນ​ຫາ​ເàºàºµàº” A -AboutDialog.5 = ສà»àº²â€‹àº¥àº±àºšâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹à»€àºžàºµà»ˆàº¡â€‹à»€àº•ີມ​ໄດ້​ທີ່ OpenForis.org ເວັບ​ໄຊ​ທ​໌​ຂອງ​ພວàºâ€‹à»€àº®àº»àº² -AboutDialog.6 = ຂà»â€‹à»‚ທດ​ນà»àº²â€‹, ບັນ​ຫາ​ທີ່​ເàºàºµàº”​ຂຶ້ນ​ໃນ​ຂະ​ນະ​ທີ່​ຄວາມ​ພະ​àºàº²â€‹àºàº²àº¡â€‹àº—ີ່​ຈະ​ເປີດ​àºàº²àº™â€‹à»€àºŠàº·à»ˆàº­àº¡â€‹àº•à»à»ˆâ€‹àº™àºµà»‰â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹àº¥àº°â€‹àºšàº»àºšâ€‹àº‚ອງ​ທ່ານ​ຕົວ​ທ່ອງ​ເວັບ​ຂອງ​ມາດ​ຕະ​ຖານ​. -AboutDialog.8 = Ok -AspectCode.0 = ເຫນືອ -AspectCode.1 = ວັນ​ອອàºâ€‹àºªà»ˆàº½àº‡â€‹à»€àº«àº™àº·àº­ -AspectCode.2 = ຕາ​ເວັນ​ອອຠ-AspectCode.3 = ພາàºâ€‹à»ƒàº•້​, ຕາ​ເວັນ​ອອຠ-AspectCode.4 = ໃຕ້ -AspectCode.5 = ພາàºâ€‹à»ƒàº•້​, ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ-AspectCode.6 = ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ-AspectCode.7 = ພາàºâ€‹à»€àº«àº™àº·àº­â€‹, ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ-CollectEarthWindow.0 = ໃນ​ເວ​ລາ​ທີ່​ພະ​àºàº²â€‹àºàº²àº¡â€‹à»€àºžàº·à»ˆàº­â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌ CSVຄວາມ​ຜິດ​ພາດ -CollectEarthWindow.1 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àº -CollectEarthWindow.10 File \= -CollectEarthWindow.11 ອອàºâ€‹àºˆàº²àº \= -CollectEarthWindow.12 = ເຄື່ອງ​ມືຂà»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.13 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ CSV àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ -CollectEarthWindow.14 = Start SAIKU -CollectEarthWindow.15 = ຄຸນ​ສົມ​ບັດ -CollectEarthWindow.16 = ຊ່ວàºâ€‹à»€àº«àº¼àº·àº­ -CollectEarthWindow.17 = ປະ​ຕິ​ເສດ -CollectEarthWindow.18 = ຄົ້ນ​ຫາ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ຫາàºâ€‹à»„ປ​ໃນ​ຖານ​ຂà»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.19 = ເàºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ-CollectEarthWindow.2 = ພາ​ສາ -CollectEarthWindow.20 = ຈà»àº²â€‹àº™àº§àº™â€‹àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™ duplicated​\: -CollectEarthWindow.21 = ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ຊອàºâ€‹àº«àº² icon ສà»àº²â€‹àº¥àº±àºšâ€‹àºžàº²â€‹àº•ົ້ນ​ຕ໠-CollectEarthWindow.22 = ທ່ານ​ມີ​ຄວາມ​à»àº™à»ˆâ€‹à»ƒàºˆàº§à»ˆâ€‹àº²â€‹àº—່ານ​ຕ້ອງ​àºàº²àº™â€‹àº›àº´àº”​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹? ໃນ​àºàº²àº™â€‹àº›àº´àº”​ປ່ອງ​ຢ້ຽມ​àºàº±àº‡â€‹àºˆàº°â€‹àº›àº´àº”​ເຄື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹àº‚ອງ​ໂລàºâ€‹à»„ດ້​ເàºàº±àºšâ€‹àºà»àº² -CollectEarthWindow.23 = àºàº²àº™â€‹àº¢àº±à»‰àº‡â€‹àº¢àº·àº™â€‹àº—ີ່​ຈà»àº²â€‹à»€àº›àº±àº™ -CollectEarthWindow.24 = XML ສົ່ງ​ອອຠ-CollectEarthWindow.25 = ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ເພີ່ມ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹à»€àº«àº¼àº»à»ˆàº²â€‹àº™àºµà»‰â€‹à»àº¥à»‰àº§â€‹à»àº¥àº°â€‹àºàº²àº™â€‹àºªàº¹àº™â€‹à»€àºªàºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº‚ອງ​ທ່ານ​? -CollectEarthWindow.26 = ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™ -CollectEarthWindow.27 = ປັບ​ປຸງ -CollectEarthWindow.28 = ເຮັດ​ຢູ່​ຕ່າງ​ປະ​ເທດ​ເàºàº±àºšâ€‹àºà»àº²â€‹à»€àº„ື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹àº„ວນ​ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹à»àº¥à»ˆàº™â€‹à»ƒàº™â€‹àº‚ະ​ນະ​ທີ່​ຜູ້​ປະ​àºàº­àºšâ€‹àºàº²àº™â€‹àº•ີ​ຄວາມ​ຫມາàºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹. -CollectEarthWindow.29 = The Saiku Server ບà»à»ˆâ€‹à»„ດ້​ຖືàºâ€‹àº•ັ້ງ​. -CollectEarthWindow.3 = \ ຄວາມ​ຜິດ​ພາດ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ -CollectEarthWindow.30 = àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº®àº±àºâ€‹àºªàº²â€‹àºàº²àº™â€‹à»€àº›àºµàº”​ຫນ້າ​ຕ່າງ​ນີ້​ໃນ​ຂະ​ນະ​ທີ່​ທ່ານ​àºà»àº²â€‹àº¥àº±àº‡â€‹à»ƒàºŠà»‰â€‹àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹. -CollectEarthWindow.31 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌ CSV -CollectEarthWindow.32 = ອອຠ-CollectEarthWindow.33 = ຊື່​ຜູ້​ປະ​àºàº­àºšâ€‹àºàº²àº™â€‹àºˆàº°â€‹àº•້ອງ​ມີ​àºàº²àº™â€‹àº•à»à»ˆâ€‹à»„ປ​ອີàºâ€‹à»àº¥à»‰àº§â€‹àºâ€‹à»ˆâ€‹àº§àº² 5 ລັàºâ€‹àºªàº°â€‹àº™àº°â€‹à»àº¥àº°â€‹àºªàº±à»‰àº™â€‹àºâ€‹à»ˆâ€‹àº§àº² 50ຄວາມ​ຜິດ​ພາດ -CollectEarthWindow.34 = àºàº§àº”​ສອບ -CollectEarthWindow.35 = ຜູ້​ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹àº¥àº»àºšâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™ ​\! ຫລັàºâ€‹àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº•ື່ມ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàºªà»ˆâ€‹àºŠàº·à»ˆâ€‹àºœàº¹à»‰â€‹àº›àº°â€‹àºàº­àºšâ€‹àºàº²àº™â€‹à»àº¥àº°â€‹à»ƒàº«à»‰â€‹àºàº»àº”​ປຸ່ມ "ປັບ​ປຸງ​"​. ຊື່ -CollectEarthWindow.36 = ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹àºšà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ເປົ່າ -CollectEarthWindow.37 = ຮັàºâ€‹àºªàº²â€‹àºˆàº±àº™à»„ຟລ​໌ -CollectEarthWindow.38 = CSV -CollectEarthWindow.39 à»àºˆà»‰àº‡ \= ມັນ​ເປັນ​àºàº²àº™â€‹àºªàº»àº¡â€‹àº„ວນ​ທີ່​ທ່ານ​ໄປ​ເຖິງ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº‚ອງ​ທ່ານ (àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ XML​) àºà»ˆàº­àº™â€‹àº—ີ່​ຈະ​ໄດ້​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº«àº¡à»ˆâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ -CollectEarthWindow.4 = FAO à»àºˆà»‰àº‡â€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ເສດ -CollectEarthWindow.40 = ທີ່​àºà»àº²â€‹àº™àº»àº”​ໄວ້​ຕາມ​ເສັ້ນ​ທາງ​àºàº±àºšâ€‹à»‚ຟນ​ເດີ​ທີ່ Saiku Server ໄດ້​ຖືàºâ€‹àº•ິດ​ຕັ້ງ​ຢູ່​ໃນ Tools-> Properties-> à»àº–ບ​à»àºšàºšâ€‹àºžàº´â€‹à»€àºªàº”​ໄດ້​. -CollectEarthWindow.41 = àºàº²àº™â€‹àº›àº°â€‹àº«àºàº±àº”​àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌​\: -CollectEarthWindow.42 = ອອຠ-CollectEarthWindow.43 = àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº•à»àº²â€‹àºàº±àº™â€‹àº—ີ່​ພົບ​ເຫັນ -CollectEarthWindow.44 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ / ສົ່ງ​ອອàºàº‚à»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.45 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ XML (à»àº›â€‹)ຂà»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.46 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ໃຫມ່​ຈາàºâ€‹à»„ປ​ສະ​ນີ (XML à»àº›â€‹)àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™ -CollectEarthWindow.55 ປັບ​ປຸງ \= àºàº²àº™â€‹àº™à»àº²â€‹à»ƒàºŠà»‰ CSV -CollectEarthWindow.47 = Saiku Server ບà»à»ˆâ€‹à»„ດ້​àºà»àº²â€‹àº«àº™àº»àº” -CollectEarthWindow.48 = ໄຟລ​໌​ຫັດ​ໄປ​ສະໄຟລ​໌ -CollectEarthWindow.49 = Fusion CSV -CollectEarthWindow.5 = ປິດ -CollectEarthWindow.50 = ເປີດ​ຄູ່​ມື​àºàº²àº™â€‹à»ƒàºŠà»‰àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™â€‹àº›àº±àºšâ€‹àº›àº¸àº‡â€‹àº‚ອງ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ-CollectEarthWindow.51 CHECK \= àºàº§àº”​ສອບ -CollectEarthWindow.52 = File ເຂົ້າ​ສູ່​ລະ​ບົບ​ຄà»àº²â€‹àº®à»‰àº­àº‡â€‹àºªàº°â€‹àº«àº¡àº±àºâ€‹à»€àº›àºµàº” -CollectEarthWindow.53 = àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»€àº­â€‹àºàº°â€‹àºªàº²àº™â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹à»€àº‚ົ້າ​ສູ່​ລະ​ບົບຈຸດ -CollectEarthWindow.54 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຈາຠKMLàºà»ˆàº½àº§â€‹àºàº±àºš -CollectEarthWindow.56 = ... -CollectEarthWindow.57 = ຂະ​ບວນ​àºàº²àº™â€‹à»€àº¥àºµà»ˆàº¡â€‹àº•ົ້ນ Saiku à»àº¡à»ˆàº™â€‹àºàº±àº‡â€‹à»àº¥à»ˆàº™â€‹, àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº¥à»â€‹àº–້າ​. -CollectEarthWindow.58 = ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ເລີ່ມ​ຕົ້ນ​àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ Saiku -CollectEarthWindow.59 = ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ Re​\: àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ Saiku ໄດ້​?
ຂະ​ບວນ​àºàº²àº™â€‹àº™àºµà»‰â€‹àºªàº²â€‹àº¡àº²àº”​ໃຊ້​ເວ​ລາ​ຫຼາàº
ຖ້າ​ທ່ານ​ຄລິàºâ€‹à»ƒàºªà»ˆ "à»àº¡à»ˆàº™â€‹à»àº¥à»‰àº§â€‹" ເປັນ​ຊຸດ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໃຫມ່​ທີ່​ມີ​ຄວາມ​ຫຼ້າ​ສຸດ​ໄດ້​. ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº‚ຶ້ນ​. -CollectEarthWindow.6 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ Fusion ຕາ​ຕະ​ລາງàºàº²àº™â€‹àºœàº°â€‹àº¥àº´àº”​ຂà»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.60 = Saiku -CollectEarthWindow.61 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່ XML (àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº”ັດ​à»àºà»‰â€‹àº™àº±àºšâ€‹àº•ັ້ງ​à»àº•່​àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àºªàº¸àº”​ທ້າàºâ€‹) ສົ່ງ​ອອàºàºà»ˆàº½àº§â€‹àºàº±àºš -CollectEarthWindow.62 = ... -CollectEarthWindow.63 Error \= àºàº²àº™â€‹à»„ດ້​ຮັບ​ຈຸດ​ທີ່​ໄດ້​ຈາຠKML -CollectEarthWindow.64 = ສະ​ຫນັບ​ສະ​ຫນູນ​ທາງ​ເທàºâ€‹àº™àº´àº -CollectEarthWindow.7 Error \= ໃນ​ເວ​ລາ​ທີ່​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຂà»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.8 ຂà»à»‰â€‹àº„ວາມ​ປະ​ຕິ​ເສດ \= ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ພົບ​ເຫັນ -CollectEarthWindow.9 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໄດ້​ນà»àº²â€‹à»€àº‚ົ້າ​ມາ​ປະ​àºàº­àºšâ€‹àº”້ວàºâ€‹àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àº—ີ່​ມີ​ຢູ່​à»àº¥à»‰àº§â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚ອງ​ທ່ານ​. -DynamicsCode.0 = ປ່າ​ໄມ້​ໃນ​ເບື້ອງ​ຕົ້ນ -DynamicsCode.1 = ທົ່ງ​ຫàºà»‰àº²â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ -DynamicsCode.2 = àºàº²àº™â€‹àº•ັ້ງ​ຖິ່ນ​ຖານ​ໃນ​ເບື້ອງ​ຕົ້ນ -DynamicsCode.3 = ເບື້ອງ​ຕົ້ນ Otherland -DynamicsCode.4 = ຊຸ່ມ​ນ​້​à»àº²â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ -DynamicsCode.5 = ເບື້ອງ​ຕົ້ນ Cro​​pland -OpenTextFileListener.0 = ໄຟລ​໌​ຂà»à»‰â€‹àº„ວາມ​à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹à»„ດ້​ພົບ​ໄດ້​ທີ່​\:àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -OptionWizard.0 = ທາງ​ເລືອàºâ€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ-OptionWizard.1 = ເລືອàºâ€‹àº‚ອງ​ຕົວ​ທ່ອງ​ເວັບ -OptionWizard.10 = ໂຟ​ເດີ​ສà»àº²â€‹àº®àº­àº‡â€‹àºˆàº±àº™ -OptionWizard.11 = ບà»à»ˆâ€‹àº®àº¹à»‰â€‹àºˆàº±àºâ€‹\: àºàº²àº™â€‹àº™à»àº²â€‹à»ƒàºŠà»‰ ifconfig -OptionWizard.12 = ລູàºâ€‹àº„້າ​ຕົວ​ຢ່າງàºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -OptionWizard.13 = ໂລຠIP Serveràºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -OptionWizard.14 = port ໂລຠServer (ຕົວ​ຢ່າງ​\: 8023​) -OptionWizard.15 = ບັນ​ທຶàºâ€‹à»àº¥àº°â€‹à»ƒàºŠà»‰â€‹àºàº²àº™â€‹àº›à»ˆàº½àº™â€‹à»àº›àº‡ -OptionWizard.16 = ລະ​ຫັດ -OptionWizard.17 = X​-coord -OptionWizard.18 = Y coord​, -OptionWizard.19 = àºàº²àº™â€‹àºàº»àºâ€‹àº¥àº°â€‹àº”ັບ -OptionWizard.2 = ບວນ​àºàº²àº™â€‹à»€àº®àº±àº”​ວຽຠ(server / ລູàºâ€‹àº„້າ​) -OptionWizard.20 = ໄດ້​ເນື້ອ​ໃນ​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»„ດ້​ມີ​àºàº²àº™â€‹àº›à»ˆàº½àº™â€‹à»àº›àº‡â€‹.
àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº®àº±àºšâ€‹à»‚ຫລດ​ເນື້ອ​ຫາ​ໃນ​ເວ​ລາ​ທີ່​ທ່ານ​àºà»àº²â€‹àº¥àº±àº‡â€‹àº®àº±àºšâ€‹àºàº²àº™â€‹àºàº°â€‹àº•ຸ້ນ​ໂດàºâ€‹àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹. -OptionWizard.21 = ປັບ​ປຸງ​ສົບ​ຜົນ​ສà»àº²â€‹à»€àº¥àº±àº” -OptionWizard.22 = ຄ້ອຠ-OptionWizard.23 = ມີ​ຄວາມ​ຜິດ​ພາດ​ໃນ​ເວ​ລາ Re​\: ເປີດ​ໄດ້​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»€àº›àº±àº™â€‹à»„ດ້àºàº»àºâ€‹à»€àº¥àºµàºâ€‹àºàº²àº™ -OptionWizard.24 = àºàº»àºà»€àº¥àºµàºàºàº²àº™ -OptionWizard.25 = ຮູບ​à»àºšàºšâ€‹àºàº²àº™â€‹àº”à»àº²â€‹à»€àº™àºµàº™â€‹àº‡àº²àº™ -OptionWizard.26 = àºàº²àº™â€‹à»€àº›àº±àº™â€‹à»€àºˆàº»à»‰àº²â€‹àºžàº²àºš DB -OptionWizard.27 = ນີ້​ບà»à»ˆâ€‹à»„ດ້​ເປັນ​ທີ່​àºàº­àº¡â€‹àº®àº±àºš Saiku Folder (ເອ​àºàº°â€‹àºªàº²àº™â€‹à»€àº¥àºµà»ˆàº¡ saiku.bat ບà»à»ˆâ€‹à»àº¡à»ˆàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹) -OptionWizard.28 = Saiku Server ບà»à»ˆâ€‹àº®àº­àº‡â€‹àº®àº±àºš -OptionWizard.29 = ພ໠DB -OptionWizard.3 = Server ຕົວ​ຢ່າງ -OptionWizard.30 = ທາງ​ເລືອຠSQLite -OptionWizard.31 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº•ົວ​ຢ່າງ -OptionWizard.32 = ຮູບ​à»àºšàºšâ€‹àº”ິນ​ຕອນ -OptionWizard.33 = ສà»àº²â€‹àº«àº¼àº§àº”​ນຸ​àºàº»àº¡ -OptionWizard.34 = à»àºšàºšâ€‹àºžàº´â€‹à»€àºªàº” -OptionWizard.35 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ຈຸດ​ຕົວ​ຢ່າງ -OptionWizard.36 = ໄລ​àºàº°â€‹àº—າງ​ລະ​ຫວ່າງ​ຈຸດ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àº•ົວ​ຢ່າງ (ໃນ​ຕາ​) -OptionWizard.37 = ອັດ​ຕາ​ທີ່​ມີ​ຊາàºâ€‹à»àº”ນ​ດິນ​ຕອນ (à»àº¡àº±àº”​) -OptionWizard.38 = ໄຟລ​໌ CSV / CED ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ອ່ານ​ໄດ້​ຢ່າງ​ຖືàºâ€‹àº•້ອງ
ເອ​àºàº°â€‹àºªàº²àº™â€‹à»„ດ້​ຖືàºâ€‹àº„າດ​ວ່າ​ຈະ​ມີ​ມູນ​ຄ່າ​àºàº²àº™â€‹à»àºàºâ€‹àºˆàº¸â€‹àº¥àº°â€‹àºžàº²àºâ€‹à»€àºŠàº±à»ˆàº™â€‹àº™àºµà»‰â€‹\:​.
-OptionWizard.39 = ລະ​ຫັດ​, YCoordinate​, XCoordinate​, ພູ​, ລັàºâ€‹àºªàº°â€‹àº™àº° -OptionWizard.4 = IP ຄອມ​ພິວ​ເຕີ​ປັດ​ຈຸ​ບັນ​\: -OptionWizard.40 = ໂຄງ​àºàº²àº™ -OptionWizard.41 = ໂຫຼດ​ໄຟລ​໌​ໂຄງ​àºàº²àº™â€‹à»ƒàº«àº¡à»ˆ -OptionWizard.42 = ຜິດ​ພາດ​ໃນ​ເວ​ລາ​ປິດ​àºàº²àº™â€‹àº­à»ˆàº²àº™ CSV -OptionWizard.43 = ຊື່​ຂອງ​àºàº²àº™â€‹àºªà»àº²â€‹àº«àº¼àº§àº” -OptionWizard.44 = ຖານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ປ​ໃຫ້​ເຖິງ​ອັດ​ຕະ​ໂນ​ມັດ​ທີ່ -OptionWizard.45 = Open Earth Engine ຊູມ​ເຂົ້າ​ໄປ​ໃນ​ເຂດ​ຕອນ​ດິນ​ຂອງ​ຕົນ -OptionWizard.46 = timelapse ຈັàºâ€‹à»€àº›àºµàº”​ໂລàºâ€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºžàº·à»‰àº™â€‹àº—ີ່​ຕອນ​ດິນ​ຂອງ​ຕົນ -OptionWizard.47 = Open à»àºœàº™ Bing ສà»àº²â€‹àº¥àº±àºšâ€‹àºžàº·à»‰àº™â€‹àº—ີ່​ຕອນ​ດິນ​ຂອງ​ຕົນ -OptionWizard.48 = ຮູບ​à»àºšàºšâ€‹à»€àº›àºµàº”​ໃນ​ຕົວ​ທ່ອງ​ເວັບ​ຂອງ​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»„ດ້ (à»àº™àº°â€‹àº™à»àº²â€‹à»ƒàº«à»‰â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™ LINUX​) -OptionWizard.49 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™ Ced / csv ໄຟລ​໌​ທີ່​ມີ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº•ອນ​ດິນ​ຂອງ​ຕົນàºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -OptionWizard.5 = port ໂລຠServer​\: -OptionWizard.50 = Browse ... -OptionWizard.51 = ເອ​àºàº°â€‹àºªàº²àº™â€‹à»‚ຄງ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຜິດ​ພາດ -OptionWizard.52 = CSV / ເອ​àºàº°â€‹àºªàº²àº™ Ced ມີ​àºàº²àº™â€‹àº›àº°â€‹àºªàº²àº™â€‹àº‡àº²àº™â€‹à»€àº—ົ່າ​ນັ້ນ -OptionWizard.54 = ຈຸດ​ສູນ​àºàº²àº‡ -OptionWizard.55 = Error ໂຟນ​ເດີ​ໂຄງ​àºàº²àº™â€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ -OptionWizard.56 = ໂຄງ​àºàº²àº™ Load -OptionWizard.57 = ໂຄງ​àºàº²àº™ loaded àºà»ˆàº­àº™â€‹àº«àº™à»‰àº²â€‹àº™àºµà»‰ -OptionWizard.58 = Open GEE Code Editor (ຮຽàºâ€‹àº®à»‰àº­àº‡â€‹à»ƒàº«à»‰â€‹àº¡àºµâ€‹àºàº²àº™â€‹à»€àº‚ົ້າ​ເຖິງ Tester Trusted​) -OptionWizard.59 = Open ທີ່​ນີ້​à»àºœàº™â€‹àº—ີ່​ສຸມ​ໃສ່​ຕອນ​ດິນ​ຂອງ​ຕົນ -OptionWizard.6 = ຕົວ​àºà»àº²â€‹àº™àº»àº”​àºàº²àº™ PostgreSQL DB -OptionWizard.65 = ເສັ້ນ​ທາງ​àºàº±àºšâ€‹à»‚ຟນ​ເດີ​ທີ່ Saiku -OptionWizard.66 = Browse ... -OptionWizard.67 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ບັດ​àºàº²àº™ Firefox -OptionWizard.68 = Browse ... -OptionWizard.7 = ຊື່​ຜູ້​ໃຊ້ -OptionWizard.70 = àºàº²àº™â€‹àºšà»â€‹àº¥àº´â€‹àº«àº²àº™â€‹à»„ຟ -OptionWizard.72 = ໄຟລ​໌​ຖານ​ສອງ -OptionWizard.73 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ບັດ​àºàº²àº™ Chrome -OptionWizard.74 = Browse ... -OptionWizard.76 = àºàº²àº™â€‹àºšà»â€‹àº¥àº´â€‹àº«àº²àº™â€‹à»„ຟ -OptionWizard.78 = ໄຟລ​໌​ຖານ​ສອງ -OptionWizard.79 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹à»àºšàºš KML Freemarker -OptionWizard.8 = ລະ​ຫັດ​ຜ່ານ -OptionWizard.80 = Browse ... -OptionWizard.82 = à»àº¡à»ˆâ€‹à»àºšàºš Freemarker -OptionWizard.83 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº­àº­àºâ€‹à»àºšàºšâ€‹àº®àº¹àºšâ€‹à»àºšàºš HTML ປູມ​ເປົ້າ -OptionWizard.84 = Browse ... -OptionWizard.86 = HTML webpage -OptionWizard.87 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™ XML àºàº±àºšâ€‹àº„à»àº²â€‹àº™àº´â€‹àºàº²àº¡ IDM -OptionWizard.88 = Browse ... -OptionWizard.9 = ຊື່ DB -OptionWizard.90 = ຫມາຠIDM XML -OptionWizard.91 = Server (ສະ​ບັບ​ຜູ້​ຈັດ​àºàº²àº™â€‹àº«àº¼àº·â€‹àº¢àº·àº™â€‹àº¢àº¹à»ˆâ€‹àº„ົນ​ດຽວ​ໃຊ້​) -OptionWizard.92 = ລູàºâ€‹àº„້າ (ປະ​ຕິ​ບັດ​àºàº²àº™ / àºàº²àº™â€‹à»€àºŠàº·à»ˆàº­àº¡â€‹àº•à»à»ˆâ€‹àºàº±àºšâ€‹à»€àº„ື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹) -OptionWizard.93 = SQLite (à»àºšàºšâ€‹àºàº±àº‡ / ໄຟລ​໌​ດຽວ​ຕາມ​) -OptionWizard.94 = PostgreSQL -SaikuAnalysisListener.0 = à»àº¡à»ˆàº™ - ຂà»à»‰â€‹àº¡àº¹àº™ Refresh Saiku (ຂະ​ບວນ​àºàº²àº™â€‹àºàº²àº§â€‹) -SaikuAnalysisListener.1 = ບà»à»ˆ - ພຽງ​à»àº•່​ເລີ່ມ​ຕົ້ນ Saiku -SaikuStarter.1 = ເລີ່ມ Saiku -SaikuStarter.2 = u0EC0ລີ່ມ Saiku ສາ​ມາດ​ໃຊ້​ເວ​ລາ​ນາ​ທີ \= àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº¥à»â€‹àº–້າ ​\! -SaveEarthDataServlet.0 = àºàº²àº™â€‹àº®à»‰àº­àº‡â€‹àº‚à»â€‹à»€àº›àº»à»ˆàº² -SaveEarthDataServlet.1 = ບັນ​ຫາ​ທີ່​ເàºàºµàº”​ຂຶ້ນ​ໃນ​ຂະ​ນະ​ທີ່​ປະ​ຢັດ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ດ້ -SaveEarthDataServlet.2 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໄດ້​ບັນ​ທືຠ-SlopeCode.0 = ລຽບ (0-5​)àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -EarthApp.11 = ໃນ​ທົ່ວ​ໂລàºâ€‹à»àº¡à»ˆàº™â€‹à»àº¥à»‰àº§â€‹à»àº¥à»ˆàº™ -EarthApp.21 = ໄຟ​ທີ່​ມີ​ຕາ​ຂ່າàºâ€‹à»„ຟ​ຟ້າ​ຂອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ເປັນ CSV / CED à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹àºžàº»àºšâ€‹à»€àº«àº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹à»€àºªàº±à»‰àº™â€‹àº—າງ​ທີ່​ເລືອàºâ€‹\:
-EarthApp.23 = ບà»à»ˆâ€‹à»„ຟລ​໌ CSV / CED ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

-EarthApp.24 = ໄຟ​ທີ່​ມີ​à»àº¡à»ˆâ€‹à»àºšàºš Freemarker ທີ່​ມີ​ຄà»àº²â€‹àº™àº´â€‹àºàº²àº¡ KML ບà»à»ˆâ€‹à»„ດ້​ພົບ​ເຫັນ​ຢູ່​ໃນ​ເສັ້ນ​ທາງ​ທີ່​ເລືອàºâ€‹\:
-EarthApp.26 = ບà»à»ˆâ€‹à»„ຟລ​໌​ຄà»àº²â€‹àº™àº´â€‹àºàº²àº¡ KML ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

-EarthApp.27 = ໄຟ​ທີ່​ມີ​ຮູບ​à»àºšàºšâ€‹àº›àº¹àº¡â€‹à»€àº›àº»à»‰àº² HTML ໄດ້​à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹àºžàº»àºšâ€‹à»€àº«àº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹à»€àºªàº±à»‰àº™â€‹àº—າງ​ທີ່​ເລືອàºâ€‹\:
-EarthApp.29 = ບà»à»ˆâ€‹à»„ຟລ​໌​ປູມ​ເປົ້າ HTML ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

-EarthApp.3 = ເຕືອນ​ຂ້ອàºâ€‹àº•à»à»ˆâ€‹àº¡àº² -EarthApp.30 = àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹à»àºà»‰â€‹à»„ຂ​ສະ​ຖານ​ທີ່​ໄຟລ​໌​ຢູ່​ໃນ​ເມ​ນູ Tools-> Properties​. -EarthApp.4 = àºàº²àº™â€‹àº›àº±àºšâ€‹àº›àº¸àº‡â€‹à»ƒàº™â€‹àº›àº±àº”​ຈຸ​ບັນ -EarthApp.5 = ຢ່າ​ເຕືອນ​ຂ້າ​ພະ​ເຈົ້າ​ອີàºâ€‹à»€àº—ື່ອ​ຫນຶ່ງ -EarthApp.57 = ມີ​ສະ​ບັບ​ໃຫມ່​ຂອງ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹àº—ີ່​ມີ à»àº¡à»ˆàº™â€‹\!
ທ່ານ​ບà»à»ˆâ€‹àº•້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹? ເຕືອນ -EarthApp.58 = ປັບ​ປຸງ -EarthApp.59 Error \= ໃນ​ເວ​ລາ​ທີ່​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ເອ​àºàº°â€‹àºªàº²àº™â€‹à»‚ຄງ​àºàº²àº™ -EarthApp.6 = \ - ສະ​ບັບ -EarthApp.61 = ເອ​àºàº°â€‹àºªàº²àº™â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹à»„ດ້​ເàºàº±àºšâ€‹àºà»àº²â€‹àºšà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ຈະ​ເປີດ​ເຜີàºâ€‹.
àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹à»€àº®àº±àº”​ໃຫ້​à»àº™à»ˆâ€‹à»ƒàºˆàº§à»ˆâ€‹àº²â€‹àº—ີ່​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»àº¡à»ˆàº™â€‹àºàº²àº™â€‹àº•ິດ​ຕັ້ງ​. -EarthSurveyService.9 = ພາàºâ€‹àºªàº°â€‹àº«àº™àº²àº¡â€‹àº—ີ່​ຕ້ອງ​àºàº²àº™à»€àº­àº»àº² -ExportActionListener.1 = ວັນ​ທີ່​ຈະ​ບັນ​ທຶàºâ€‹àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àºˆàº²àºàº‚à»à»‰â€‹àº¡àº¹àº™ -ExportDialogProcessMonitor.0 àºàº²àº™â€‹àº›àº¸àº‡â€‹à»àº•່ງ \= ... -ExportDialogProcessMonitor.1 = ລà»â€‹àº–້າ​ທີ່​ຈະ​ເລີ່ມ​ຕົ້ນ​ຂະ​ບວນ​àºàº²àº™â€‹\:àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àº -ExportDialogProcessMonitor.4 =​\: -ImportProcessMonitorDialog.0 = àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​\: -ImportActionListener.0 = ຄວນ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àº—ີ່​ດິນ​ທີ່​ບà»à»ˆâ€‹à»„ດ້​ຮັບ​àºàº²àº™â€‹à»€àº•ີມ​ລົງ​ໄປ​ໃນ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ໄດ້ -ImportActionListener.2 = ຖ້າ​ທ່ານ​ຄລິàºâ€‹à»ƒàºªà»ˆ ບà»à»ˆ ພຽງ​à»àº•່​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºˆàº²àºâ€‹àºžàº²àºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ຢູ່​ໃນ​ສະ​ພາບ "ສີ​ຂຽວ​"​, ທີ່​ບັນ​ຈຸ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ັງ​ຫມົດ​ໄດ້​, ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​. -ImportActionListener.3 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ບັນ​ທຶàºâ€‹àº—າງ​àºàº²àº™â€‹àºªà»àº²â€‹à»€àº¥àº±àº”​ຮູບ -ImportDialogProcessMonitor.0 = \ ຄິດ​ໄລ່ -ImportDialogProcessMonitor.11 = ຈà»àº²â€‹àº™àº§àº™â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ​ຂອງ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹\: -ImportDialogProcessMonitor.2 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ບັນ​ທຶàºâ€‹àºàº²àº™ ... -ImportDialogProcessMonitor.5 = ຈ​à»â€‹àº²â€‹àº™àº§àº™â€‹àº•ົວ​ຈິງ​ຂອງ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​\:ຂà»à»‰â€‹àº¡àº¹àº™ -ImportDialogProcessMonitor.8 àºàº²àº™â€‹àº›àº¸àº‡â€‹à»àº•່ງ \= ... -InfiniteProgressMonitor.0 = àºàº»àºâ€‹à»€àº¥àºµàºâ€‹àºàº²àº™â€‹àº”à»àº²â€‹à»€àº™àºµàº™â€‹àº‡àº²àº™àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -JFileChooserExistsAware.0 = file ໂລàºâ€‹à»‚ຄງ​àºàº²àº™ -KmlImportService.13 = ເລືອàºâ€‹à»„ຟລ​໌ CSV ເພື່ອ​ຊ່ວàºâ€‹àº›àº°â€‹àº¢àº±àº”​ສະ​ຖານ​ຕອນ​ດິນ​ຂອງ​ຕົນ​ເພື່ອ -MissingPlotsListener.0 Error \= ໃນ​ຂະ​ນະ​ທີ່​àºàº²àº™â€‹à»„ດ້​ຮັບ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àº—ີ່​ດິນ​ບà»à»ˆâ€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ດ້ -MissingPlotsListener.1 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ໄປ -MissingPlotsListener.10 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ໃນ​àºàº²àº™â€‹àº­àº­àºâ€‹à»àºšàºšâ€‹àºªàº¸à»ˆàº¡â€‹àº•ົວ​ຢ່າງ​\: -MissingPlotsListener.12 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ຫາàºâ€‹à»„ປ​\: -MissingPlotsListener.14 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທັງ​ຫມົດ​à»àº¡à»ˆàº™â€‹à»„ດ້​ເຕີມ​ລົງ​ໄປ ​\!ເນື້ອ​ໃນ -MissingPlotsListener.2 = ຄັດ​ລອàºâ€‹à»„ປ​ທີ່ clipboardເອົາ -MissingPlotsListener.3 = ໄຟລ​໌​ທີ່​ບັນ​ຈຸ​ມີ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ສານ​ຕອນ​ດິນ​ຂອງ​ຕົນ (.csv ຫຼື​ໄຟລ​໌ .ced​) ສà»àº²â€‹àº¥àº±àºšâ€‹àº—ີ່​ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ຮູ້​ວ່າ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ັງ​ຫມົດ​ໄດ້​ຮັບ​àºàº²àº™â€‹à»€àº•ີມ​ລົງ​ໄປ​. -MissingPlotsListener.4 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຫາàºâ€‹à»„ປ - ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ສານ -MissingPlotsListener.5 = ຈາàºâ€‹à»„ຟ​\: -MissingPlotsListener.6 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ​ໄຟລ​໌ CED -ProcessMonitorDialog.1 = ຂà»à»‰â€‹àºœàº´àº”​ພາດ Parsing àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àºˆà»àº²â€‹àº™àº§àº™â€‹àºàº²àº™â€‹àº•ິດ​ຕà»à»ˆâ€‹àºàº±àº™ -ProcessMonitorDialog.4 = ຖັນ​, -ProcessMonitorDialog.5 = \ - ຄຸນ​ຄ່າ \ No newline at end of file +AboutDialog.19=Äã có lá»—i +AboutDialog.5=Truy cập website cá»§a chúng tôi để biết thêm thông tin OpenForis.org +AboutDialog.6=Xin lá»—i, đã có sá»± cố khi mở link trong brower chuẩn trong hệ thống cá»§a bạn. +AboutDialog.8=Ok +AspectCode.0=Bắc +AspectCode.1=Äông-Bắc +AspectCode.2=Äông +AspectCode.3=Äông-Nam +AspectCode.4=Nam +AspectCode.5=Tây-Nam +AspectCode.6=Tây +AspectCode.7=Tây-Bắc +CollectEarthWindow.0=Lá»—i khi xuất dữ liệu sang file CSV +CollectEarthWindow.1=Lá»—i xuất dữ liệu +CollectEarthWindow.10=File +CollectEarthWindow.11=Thoát +CollectEarthWindow.12=Công cụ +CollectEarthWindow.13=Xuất dữ liệu ra CSV +CollectEarthWindow.14=Khởi động SAIKU Analysis +CollectEarthWindow.15=Thuá»™c tính +CollectEarthWindow.16=Trợ giúp +CollectEarthWindow.17=Thông tin công bố +CollectEarthWindow.18=Tìm ô thiếu trong cÆ¡ sở dữ liệu +CollectEarthWindow.19=Collect Earth +CollectEarthWindow.2=Ngôn ngữ +CollectEarthWindow.20=Số bản ghi trùng\: +CollectEarthWindow.21=Không tìm thấy biểu tượng cho khung chính +CollectEarthWindow.22=Bạn có chắc là muốn đóng Collect Earth?
Äóng cá»­a sổ cÅ©ng đóng luôn máy chá»§ Collect Earth +CollectEarthWindow.23=Cần khẳng định +CollectEarthWindow.24=Xuất ra XML +CollectEarthWindow.25=Bạn có muốn thêm các bản ghi này và bá» Ä‘i dữ liệu hiện thá»i không? +CollectEarthWindow.26=Ngưá»i sá»­ dụng +CollectEarthWindow.27=Cập nhật +CollectEarthWindow.28=Máy chá»§ Open Foris Collect Earth phải chạy khi ngưá»i sá»­ dụng giải Ä‘oán dữ liệu. +CollectEarthWindow.29=Chưa xác định cấu hình cho Máy chá»§ Saiku. +CollectEarthWindow.3=\ Lá»—i nhập +CollectEarthWindow.30=Äể mở cá»­a sổ này khi Ä‘ang sá»­ dụng Google Earth. +CollectEarthWindow.31=Xuất dữ liệu đã thu thập sang file CSV +CollectEarthWindow.32=Thoát +CollectEarthWindow.33=Tên ngưá»i sá»­ dụng phải dài hÆ¡n 5 chữ cái và ngắn hÆ¡n 50 chữ cái +CollectEarthWindow.34=Lá»—i kiểm chứng +CollectEarthWindow.35=TÊN NGƯỜI SỬ DỤNG CÃ’N TRá»NG\!
Hãy Ä‘iá»n tên ngưá»i sá»­ dụng và nhắp phím "Update". +CollectEarthWindow.36=Không được để trống phần tên ngưá»i sá»­ dụng +CollectEarthWindow.37=Äể mở +CollectEarthWindow.38=file CSV +CollectEarthWindow.39=THÔNG BÃO\: Nên lưu dá»± phòng dữ liệu hiện thá»i(Xuất ra XML) trước khi nhập dữ liệu má»›i +CollectEarthWindow.4=Thông tin công bố cá»§a FAO +CollectEarthWindow.40=Thiết lập đưá»ng dẫn tá»›i thư mục cài đặt Saiku Server trong Tools->Properties->Advanced tab. +CollectEarthWindow.41=Ghi dữ liệu xuất ra vào file\: +CollectEarthWindow.42=Thoát +CollectEarthWindow.43=Tìm thấy bản ghi có mâu thuẫn +CollectEarthWindow.44=Nhập/Xuất dữ liệu +CollectEarthWindow.45=Xuất dữ liệu ra XML (nén) +CollectEarthWindow.46=Nhập dữ liệu má»›i từ file ZIP (XML nén) +CollectEarthWindow.55=Cập nhật các bản ghi hiện thá»i bằng CSV +CollectEarthWindow.47=Chưa định cấu hình cho Saiku Server +CollectEarthWindow.48=Zip/collect-data files +CollectEarthWindow.49=Files CSV tổng hợp +CollectEarthWindow.5=Äóng +CollectEarthWindow.50=Mở hướng dẫn ngưá»i sá»­ dụng +CollectEarthWindow.51=Kiểm tra cập nhật cá»§a Collect Earth +CollectEarthWindow.52=Mở file nhật ký ứng dụng +CollectEarthWindow.53=File nhật ký cá»§a Collect Earth +CollectEarthWindow.54=Nạp các Ä‘iểm từ KML +CollectEarthWindow.56=Vá»... +CollectEarthWindow.57=Äang chạy quá trình khởi động Saiku, xin đợi. +CollectEarthWindow.58=Không thể khởi động Saiku analysis +CollectEarthWindow.59=Bạn có muốn tạo lại bá»™ dữ liệu cho Saiku analysis không?
Quá trình này sẽ mất một vài phút.
Nếu bạn chá»n "YES" sẽ tạo ra má»™t bá»™ dữ liệu má»›i vá»›i các thông tin cập nhật nhất. +CollectEarthWindow.6=Xuất ra bảng tổng hợp +CollectEarthWindow.60=Tạo dữ liệu Saiku +CollectEarthWindow.61=Xuất dữ liệu ra XML (các bản ghi chỉnh sá»­a từ lần xuất trước) +CollectEarthWindow.62=Vá»... +CollectEarthWindow.63=Lá»—i khi nạp Ä‘iểm từ KML +CollectEarthWindow.64=Há»— trợ kỹ thuật +CollectEarthWindow.7=Lá»—i khi nhập dữ liệu +CollectEarthWindow.8=Không tìm thấy văn bản thông báo +CollectEarthWindow.9=Dữ liệu nhập vào có chứa các bản ghi đã có trong cÆ¡ sở dữ liệu cá»§a bạn. +DynamicsCode.0=Ban đầu là rừng +DynamicsCode.1=Ban đầu là trảng cá» +DynamicsCode.2=Ban đầu là khu dân cư +DynamicsCode.3=Ban đầu là đất khác +DynamicsCode.4=Ban đầu là đất ngập nước +DynamicsCode.5=Ban đầu là đất trồng trá»t +OpenTextFileListener.0=không tìm thấy file văn bản tại\: +OptionWizard.0=Các lá»±a chá»n cá»§a Collect Earth +OptionWizard.1=Chá»n Browser +OptionWizard.10=Mở thư mục lưu dá»± phòng +OptionWizard.11=Không biết\: hãy sá»­ dụng ifconfig +OptionWizard.12=Vi dụ cá»§a khác +OptionWizard.13=Äịa chỉ IP cá»§a máy chá»§ Collect Earth +OptionWizard.14=Cổng máy chá»§ Collect Earth (vd\: 8023) +OptionWizard.15=Ghi và áo dụng thay đổi +OptionWizard.16=ID +OptionWizard.17=Tá»a độ X +OptionWizard.18=Tá»a độ Y +OptionWizard.19=Äá»™ cao +OptionWizard.2=Dòng công tác (máy chá»§/khách) +OptionWizard.20=Ná»™i dung cá»§a Google Earth đã thay đổi.
Äá» nghị chấp nhận tải lại ná»™i dung khi Google Earth gợi ý. +OptionWizard.21=Cập nhật thành công +OptionWizard.22=Dốc +OptionWizard.23=Có lá»—i khi mở lại dữ liệu Google Earth +OptionWizard.24=Há»§y +OptionWizard.25=Mode vận hành +OptionWizard.26=NÆ¡i lưu cÆ¡ sở dữ liệu +OptionWizard.27=Äây không phải là thư mục Saiku (hiện không có file start-saiku.bat) +OptionWizard.28=Không nhận được máy chá»§ Saiku +OptionWizard.29=Cổng cÆ¡ sở dữ liệu +OptionWizard.3=Ví dụ cá»§a máy chá»§ +OptionWizard.30=Các lá»±a chá»n cá»§a SQLite +OptionWizard.31=Dữ liệu mẫu +OptionWizard.32=SÆ¡ đồ mẫu +OptionWizard.33=Äịnh nghÄ©a khảo sát +OptionWizard.34=Nâng cao +OptionWizard.35=Số Ä‘iểm mẫu +OptionWizard.36=Khoảng cách giữa các Ä‘iểm mẫu (tính theo mét) +OptionWizard.37=Lá» vá»›i biên ô (tính theo mét) +OptionWizard.38=Không Ä‘á»c được đúng file CSV/CED.
Cần có dấu phảy để phân tách giá trị giống như sau \:
+OptionWizard.39=ID,Tá»a độ Y,tá»a độ X,độ cao,độ dốc,tá»· lệ +OptionWizard.4=Äịa chỉ IP hiện tại cá»§a máy tính\: +OptionWizard.40=Các project +OptionWizard.41=tải file project má»›i +OptionWizard.42=Lá»—i khi đóng CSV reader +OptionWizard.43=Tên khảo sát +OptionWizard.44=tá»± động lưu dá»± phòng dữ liệu tại +OptionWizard.45=Mở Earth Engine để phóng to vào khu vá»±c ô +OptionWizard.46=Mở Earth Engine timelapse cho khu vá»±c ô +OptionWizard.47=Mở Bing Maps cho khu vá»±c ô +OptionWizard.48=Mở form trên browser thay vì mở Google Earth (khuyến cáo cho LINUX) +OptionWizard.49=ÄÆ°á»ng dẫn tá»›i file ced/csv file vá»›i dữ liệu ô +OptionWizard.5=Cổng máy chá»§ Collect Earth\: +OptionWizard.50=Browse... +OptionWizard.51=Lá»—i nhập file project +OptionWizard.52=File CSV/CED chỉ có tá»a độ +OptionWizard.53=Ô vuông +OptionWizard.54=Äiểm trung tâm +OptionWizard.55=Lá»—i khi nhập thư mục project +OptionWizard.56=Tải project +OptionWizard.57=Các project đã tải +OptionWizard.58=Mở GEE Code Editor (cần phải có quyá»n truy cập Trusted Tester) +OptionWizard.59=Mở Here Maps tập trung vào ô +OptionWizard.6=Các thông số cá»§a CSDL PostgreSQL +OptionWizard.65=ÄÆ°á»ng dẫn tá»›i thư mục Saiku +OptionWizard.66=Browse... +OptionWizard.67=ÄÆ°á»ng dẫn tá»›i Firefox executable (file exe) +OptionWizard.68=Browse... +OptionWizard.7=Tên ngưá»i sá»­ dụng +OptionWizard.70=File chạy +OptionWizard.72=File nhị phân +OptionWizard.73=ÄÆ°á»ng dẫn tá»›i Chrome executable (file exe) +OptionWizard.74=Browse... +OptionWizard.76=File exe +OptionWizard.78=File nhị phân +OptionWizard.79=ÄÆ°á»ng dẫn tá»›i KML Freemarker template +OptionWizard.8=Mật khẩu +OptionWizard.80=Browse... +OptionWizard.82=Freemarker template +OptionWizard.83=ÄÆ°á»ng dẫn tá»›i mẫu thiết kế HTML Balloon +OptionWizard.84=Browse... +OptionWizard.86=HTML webpage +OptionWizard.87=ÄÆ°á»ng dẫn tá»›i XML vá»›i định nghÄ©a IDM +OptionWizard.88=Browse... +OptionWizard.9=Tên CSDL +OptionWizard.90=Äịnh nghÄ©a XML IDM +OptionWizard.91=Máy chá»§ (phiên bản quản lý hoặc sá»­ dụng độc lập) +OptionWizard.92=Khách (ngưá»i sá»­ dụng/kết nối vá»›i máy chá»§) +OptionWizard.93=SQLite (tích hợp/file đơn lẻ) +OptionWizard.94=PostgreSQL +SaikuAnalysisListener.0=Yes - Làm má»›i lại dữ liệu Saiku (quá trình dài) +SaikuAnalysisListener.1=No - chỉ khởi động Saiku +SaikuStarter.1=Khởi động Saiku +SaikuStarter.2=Cần vài phút để khởi động Saiku, xin đợi\! +SaveEarthDataServlet.0=Yêu cầu trống +SaveEarthDataServlet.1=Có trục trặc khi ghi dữ liệu vào CSDL +SaveEarthDataServlet.2=Dữ liệu đã được ghi +SlopeCode.0=Bằng phẳng (0-5) +EarthApp.11=Collect Earth Ä‘ang chạy +EarthApp.21=Không tìm thấy file chứa lưới ô trong đưá»ng dẫn đã chá»n \:
+EarthApp.23=Chưa thiết lập file CSV/CED \:

+EarthApp.24=Không tìm thấy file chứa Freemarker template vá»›i định nghÄ©a KML trong đưá»ng dẫn đã chá»n\:
+EarthApp.26=Chưa thiết lập file định nghĩa KML d\:

+EarthApp.27=Không tìm thấy file chứa mẫu HTML balloon trong đưá»ng dẫn đã chá»n\:
+EarthApp.29=Chưa thiết lập file HTML balloon \:

+EarthApp.3=Nhắc nhở sau +EarthApp.30=Xin hãy Ä‘iá»u chỉnh đúng địa chỉ file trong Tools->Properties menu. +EarthApp.4=Cập nhật luôn +EarthApp.5=Không nhắc nữa +EarthApp.57=Äã có phiên bản má»›i cá»§a Collect Earth\!
Bạn muốn làm tiếp như thế nào? +EarthApp.58=Thông báo cập nhật +EarthApp.59=Lỗi khi nhập file project +EarthApp.6=\ - Phiên bản +EarthApp.61=Không mở được file Collect Earth.
Äá» nghị đảm bảo đã cài đặt Google Earth. +EarthSurveyService.9=Trưá»ng bắt buá»™c +ExportActionListener.1=Chá»n ngày xuất bản ghi +ExportDialogProcessMonitor.0=Äang xá»­ lý dữ liệu... +ExportDialogProcessMonitor.1=Äang đợi khởi động quá trình\: +ExportDialogProcessMonitor.4=Các bản ghi đã xuất\: +ImportProcessMonitorDialog.0=Các bản ghi đã nhập\: +ImportActionListener.0=Có nhập dữ liệu các ô chưa được Ä‘iá»n đầy đủ không? +ImportActionListener.2=Nếu bạn chá»n NO sẽ chỉ nhập dữ liệu cá»§a các ô có trạng thái màu "xanh lá cây", các ô đã có đầy đủ dữ liệu. +ImportActionListener.3=Nhập các bản ghi chưa hoàn tất +ImportDialogProcessMonitor.0=\ ÄANG TÃNH TOÃN +ImportDialogProcessMonitor.11=Số lượng ban đầu các bản ghi\: +ImportDialogProcessMonitor.2=Äang nhập các bản ghi... +ImportDialogProcessMonitor.5=Số lượng thá»±c tế các bản ghi đã nhập\: +ImportDialogProcessMonitor.8=Äang xá»­ lý dữ liệu... +InfiniteProgressMonitor.0=Há»§y lệnh +JFileChooserExistsAware.0=File project cá»§a Collect Earth +KmlImportService.13=Chá»n file CSV file để ghi địa Ä‘iểm cá»§a ô vào +MissingPlotsListener.0=Lá»—i khi lấy thông tin vỠô không có trong CSDL +MissingPlotsListener.1=Các ô thiếu +MissingPlotsListener.10=Tổng số ô trong thiết kế chá»n mẫu \: +MissingPlotsListener.12=Số ô thiếu\: +MissingPlotsListener.14=Äã Ä‘iá»n tất cả các ô\! +MissingPlotsListener.2=Sao chép ná»™i dung vào bàn phím +MissingPlotsListener.3=Lá»±a chá»n file có chứa thông tin ô ( file .csv hoặc .ced ) mà bạn muốn biết đã Ä‘iá»n đủ dữ liệu chưa. +MissingPlotsListener.4=Các ô thiếu - thông tin +MissingPlotsListener.5=Từ file \: +MissingPlotsListener.6=Xuất ra file CED +ProcessMonitorDialog.1=Tìm lá»—i trên số dòng +ProcessMonitorDialog.4=, cá»™t +ProcessMonitorDialog.5=\ -- giá trị From 20505027c821dc9a2522da664133612942ff9de7 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:35:12 +0100 Subject: [PATCH 0775/1620] New translations Messages_vi.properties (Spanish) --- .../earth/app/view/Messages_es.properties | 457 +++++++++--------- 1 file changed, 218 insertions(+), 239 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index c9742c724a..5110140e9c 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,242 +1,221 @@ -AboutDialog.19=Bir sorun oluÅŸtu -AboutDialog.5=Daha fazla bilgi için web sitemizi ziyaret edin OpenForis.org -AboutDialog.6=Üzgünüm, sisteminizin varsayılan tarayıcısı bu baÄŸlantıyı açmak isterken bir sorun oluÅŸtu. -AboutDialog.8=Tamam -AspectCode.0=Kuzey -AspectCode.1=Kuzey-doÄŸu -AspectCode.2=DoÄŸu -AspectCode.3=Güney-doÄŸu -AspectCode.4=Güney -AspectCode.5=Güney-batı -AspectCode.6=Batı -AspectCode.7=Kuzey-batı -CollectEarthWindow.0=Veri CSV dosyasına aktarılmaya çalışılırken hata oluÅŸtu -CollectEarthWindow.1=Dışa aktarma hatası -CollectEarthWindow.10=Dosya -CollectEarthWindow.11=Çıkış -CollectEarthWindow.12=Araçlar -CollectEarthWindow.13=Verileri CSV'ye aktar -CollectEarthWindow.14=SAIKU Analysis baÅŸlat -CollectEarthWindow.15=Özellikler -CollectEarthWindow.16=Yardım -CollectEarthWindow.17=Yasal uyarı -CollectEarthWindow.18=Veritabnında eksik plotları bulun +AboutDialog.19=Äã có lá»—i +AboutDialog.5=Truy cập website cá»§a chúng tôi để biết thêm thông tin OpenForis.org +AboutDialog.6=Xin lá»—i, đã có sá»± cố khi mở link trong brower chuẩn trong hệ thống cá»§a bạn. +AboutDialog.8=Ok +AspectCode.0=Bắc +AspectCode.1=Äông-Bắc +AspectCode.2=Äông +AspectCode.3=Äông-Nam +AspectCode.4=Nam +AspectCode.5=Tây-Nam +AspectCode.6=Tây +AspectCode.7=Tây-Bắc +CollectEarthWindow.0=Lá»—i khi xuất dữ liệu sang file CSV +CollectEarthWindow.1=Lá»—i xuất dữ liệu +CollectEarthWindow.10=File +CollectEarthWindow.11=Thoát +CollectEarthWindow.12=Công cụ +CollectEarthWindow.13=Xuất dữ liệu ra CSV +CollectEarthWindow.14=Khởi động SAIKU Analysis +CollectEarthWindow.15=Thuá»™c tính +CollectEarthWindow.16=Trợ giúp +CollectEarthWindow.17=Thông tin công bố +CollectEarthWindow.18=Tìm ô thiếu trong cÆ¡ sở dữ liệu CollectEarthWindow.19=Collect Earth -CollectEarthWindow.2=Dil -CollectEarthWindow.20=Kopyalanan kayıt sayısı\: -CollectEarthWindow.21=Ana bilgisayar için simge bulunamadı -CollectEarthWindow.22=Collect Earth'ü kapatmak istediÄŸinizden emin misiniz?
Pencereyi kapatmanız durumunda Collect Earth sunucusunu da kapatır. -CollectEarthWindow.23=Onay gerekiyor -CollectEarthWindow.24=XML Dışa aktar -CollectEarthWindow.25=Mevcut verileriniz kaybolacak yine de bu kayıtları eklemek istiyor musunuz? -CollectEarthWindow.26=Operatör -CollectEarthWindow.27=Güncelle -CollectEarthWindow.28=Operatör, verileri değerlendirirken Open Foris Collect Earth sunucusu çalışmalıdır. -CollectEarthWindow.29=Saiku Sunucusu yapılandırılmadı. -CollectEarthWindow.3=İçe aktarma hatası -CollectEarthWindow.30=Lütfen Google Earth'ü kullanırken bu pencereyi açık tutun. -CollectEarthWindow.31=Toplanan verileri CSV dosyasına aktar -CollectEarthWindow.32=Vazgeç -CollectEarthWindow.33=Operatör adı 5 karakterden uzun ve 50 karakterden kısa olmalıdır -CollectEarthWindow.34=Doğrulama hatası -CollectEarthWindow.35=OPERATÖR ADI BOŞ\!
Lütfen operatör adını girin ve "Güncelle" düğmesine basın. -CollectEarthWindow.36=Operatör adı boş olamaz -CollectEarthWindow.37=Açık Tut -CollectEarthWindow.38=CSV dosyaları -CollectEarthWindow.39=DİKKAT\: Yeni verileri almadan önce mevcut verilerinizi (XML'e Aktar) yedeklemeniz önerilir. -CollectEarthWindow.4=FAO Yasal uyarı bildirimleri -CollectEarthWindow.40=Araçlar-> Özellikler-> Gelişmiş sekmesinde Saiku Sunucusunun kurulu olduğu klasörün yolunu ayarlayın. -CollectEarthWindow.41=Dışa aktarılan verileri dosyaya kaydet -CollectEarthWindow.42=Vazgeç -CollectEarthWindow.43=Yinelenen kayıtlar bulundu -CollectEarthWindow.44=Verileri İçe/Dışa aktar -CollectEarthWindow.45=Verileri XML'e aktar (Sıkıştırılmış) -CollectEarthWindow.46=Verileri ZIP'ten içe aktar (sıkıştırılmış XML) -CollectEarthWindow.55=CSV kullanarak mevcut kayıtları güncelle -CollectEarthWindow.47=Saiku Sunucusu yapılandırılmadı -CollectEarthWindow.48=Zip/collect-data dosyası -CollectEarthWindow.49=Fusion table CSV dosyası -CollectEarthWindow.5=Kapat -CollectEarthWindow.50=Kullanım Kılavuzunu Aç -CollectEarthWindow.51=Collect Earth güncellemelerini kontrol et -CollectEarthWindow.52=Uygulama Günlüğünü Aç -CollectEarthWindow.53=Collect Earth Günlüğü -CollectEarthWindow.54=Noktaları KML'den yükle -CollectEarthWindow.56=Hakkında... -CollectEarthWindow.57=Saiku başlatıcısı işlemi hala devam ediyor, lütfen bekleyin. -CollectEarthWindow.58=Saiku analysis başlatılamıyor -CollectEarthWindow.59=Saiku analizi için veri setini yeniden oluşturmak ister misiniz?
Bu iÅŸlem zaman alabilir.
"EVET" üzerine tıklarsanız, en son bilgileri içeren yeni bir veri seti oluşturulur. -CollectEarthWindow.6=Fusion Table'a aktar -CollectEarthWindow.60=Saiku veri üretimi -CollectEarthWindow.61=Verileri XML'e aktar (Son dışa aktarımdan bu yana değiştirilmiş kayıtlar) -CollectEarthWindow.62=Hakkında... -CollectEarthWindow.63=Noktalar KML'den alırken hata oluştu -CollectEarthWindow.64=Teknik Destek -CollectEarthWindow.7=Veri içe aktarılırken hata oluştu -CollectEarthWindow.8=Yasal uyarı metni bulunamadı -CollectEarthWindow.9=Alınan veriler veritabanında zaten mevcut olan kayıtları içerir. -CollectEarthWindow.65=Operatör adı değiştirildi -CollectEarthWindow.66=Operatör adı -CollectEarthWindow.70=Anket rehberini aç -DynamicsCode.0=Başlangıçta Orman -DynamicsCode.1=Başlangıçta Mera -DynamicsCode.2=Başlangıçta Yerleşim -DynamicsCode.3=Başlangıçta Diğer -DynamicsCode.4=Başlangıçta Sulak -DynamicsCode.5=Başlangıçta Tarım -OpenTextFileListener.0=Metin dosyası bulunamadı \: -OptionWizard.0=Collect Earth seçenekler -OptionWizard.1=Tarayıcı Seç -OptionWizard.10=Yedekleme klasörünü aç -OptionWizard.11=Blinmeyen\: yapılandırma kullanımı -OptionWizard.12=İstemci durumu -OptionWizard.13=Collect Earth Sunucu IP -OptionWizard.14=Collect Earth sunucu girişi (örn. 8023) -OptionWizard.15=Kaydet & Değişiklikleri uygula +CollectEarthWindow.2=Ngôn ngữ +CollectEarthWindow.20=Số bản ghi trùng\: +CollectEarthWindow.21=Không tìm thấy biểu tượng cho khung chính +CollectEarthWindow.22=Bạn có chắc là muốn đóng Collect Earth?
Äóng cá»­a sổ cÅ©ng đóng luôn máy chá»§ Collect Earth +CollectEarthWindow.23=Cần khẳng định +CollectEarthWindow.24=Xuất ra XML +CollectEarthWindow.25=Bạn có muốn thêm các bản ghi này và bá» Ä‘i dữ liệu hiện thá»i không? +CollectEarthWindow.26=Ngưá»i sá»­ dụng +CollectEarthWindow.27=Cập nhật +CollectEarthWindow.28=Máy chá»§ Open Foris Collect Earth phải chạy khi ngưá»i sá»­ dụng giải Ä‘oán dữ liệu. +CollectEarthWindow.29=Chưa xác định cấu hình cho Máy chá»§ Saiku. +CollectEarthWindow.3=\ Lá»—i nhập +CollectEarthWindow.30=Äể mở cá»­a sổ này khi Ä‘ang sá»­ dụng Google Earth. +CollectEarthWindow.31=Xuất dữ liệu đã thu thập sang file CSV +CollectEarthWindow.32=Thoát +CollectEarthWindow.33=Tên ngưá»i sá»­ dụng phải dài hÆ¡n 5 chữ cái và ngắn hÆ¡n 50 chữ cái +CollectEarthWindow.34=Lá»—i kiểm chứng +CollectEarthWindow.35=TÊN NGƯỜI SỬ DỤNG CÃ’N TRá»NG\!
Hãy Ä‘iá»n tên ngưá»i sá»­ dụng và nhắp phím "Update". +CollectEarthWindow.36=Không được để trống phần tên ngưá»i sá»­ dụng +CollectEarthWindow.37=Äể mở +CollectEarthWindow.38=file CSV +CollectEarthWindow.39=THÔNG BÃO\: Nên lưu dá»± phòng dữ liệu hiện thá»i(Xuất ra XML) trước khi nhập dữ liệu má»›i +CollectEarthWindow.4=Thông tin công bố cá»§a FAO +CollectEarthWindow.40=Thiết lập đưá»ng dẫn tá»›i thư mục cài đặt Saiku Server trong Tools->Properties->Advanced tab. +CollectEarthWindow.41=Ghi dữ liệu xuất ra vào file\: +CollectEarthWindow.42=Thoát +CollectEarthWindow.43=Tìm thấy bản ghi có mâu thuẫn +CollectEarthWindow.44=Nhập/Xuất dữ liệu +CollectEarthWindow.45=Xuất dữ liệu ra XML (nén) +CollectEarthWindow.46=Nhập dữ liệu má»›i từ file ZIP (XML nén) +CollectEarthWindow.55=Cập nhật các bản ghi hiện thá»i bằng CSV +CollectEarthWindow.47=Chưa định cấu hình cho Saiku Server +CollectEarthWindow.48=Zip/collect-data files +CollectEarthWindow.49=Files CSV tổng hợp +CollectEarthWindow.5=Äóng +CollectEarthWindow.50=Mở hướng dẫn ngưá»i sá»­ dụng +CollectEarthWindow.51=Kiểm tra cập nhật cá»§a Collect Earth +CollectEarthWindow.52=Mở file nhật ký ứng dụng +CollectEarthWindow.53=File nhật ký cá»§a Collect Earth +CollectEarthWindow.54=Nạp các Ä‘iểm từ KML +CollectEarthWindow.56=Vá»... +CollectEarthWindow.57=Äang chạy quá trình khởi động Saiku, xin đợi. +CollectEarthWindow.58=Không thể khởi động Saiku analysis +CollectEarthWindow.59=Bạn có muốn tạo lại bá»™ dữ liệu cho Saiku analysis không?
Quá trình này sẽ mất một vài phút.
Nếu bạn chá»n "YES" sẽ tạo ra má»™t bá»™ dữ liệu má»›i vá»›i các thông tin cập nhật nhất. +CollectEarthWindow.6=Xuất ra bảng tổng hợp +CollectEarthWindow.60=Tạo dữ liệu Saiku +CollectEarthWindow.61=Xuất dữ liệu ra XML (các bản ghi chỉnh sá»­a từ lần xuất trước) +CollectEarthWindow.62=Vá»... +CollectEarthWindow.63=Lá»—i khi nạp Ä‘iểm từ KML +CollectEarthWindow.64=Há»— trợ kỹ thuật +CollectEarthWindow.7=Lá»—i khi nhập dữ liệu +CollectEarthWindow.8=Không tìm thấy văn bản thông báo +CollectEarthWindow.9=Dữ liệu nhập vào có chứa các bản ghi đã có trong cÆ¡ sở dữ liệu cá»§a bạn. +DynamicsCode.0=Ban đầu là rừng +DynamicsCode.1=Ban đầu là trảng cá» +DynamicsCode.2=Ban đầu là khu dân cư +DynamicsCode.3=Ban đầu là đất khác +DynamicsCode.4=Ban đầu là đất ngập nước +DynamicsCode.5=Ban đầu là đất trồng trá»t +OpenTextFileListener.0=không tìm thấy file văn bản tại\: +OptionWizard.0=Các lá»±a chá»n cá»§a Collect Earth +OptionWizard.1=Chá»n Browser +OptionWizard.10=Mở thư mục lưu dá»± phòng +OptionWizard.11=Không biết\: hãy sá»­ dụng ifconfig +OptionWizard.12=Vi dụ cá»§a khác +OptionWizard.13=Äịa chỉ IP cá»§a máy chá»§ Collect Earth +OptionWizard.14=Cổng máy chá»§ Collect Earth (vd\: 8023) +OptionWizard.15=Ghi và áo dụng thay đổi OptionWizard.16=ID -OptionWizard.17=X-coord -OptionWizard.18=Y-coord -OptionWizard.19=Yükseklik -OptionWizard.2=İş akışı (sunucu/istemci) -OptionWizard.20=Google Earth içerikleri deÄŸiÅŸtirildi.
Lütfen Google Earth tarafından istendiğinde içeriğin yeniden yüklenmesini kabul edin. -OptionWizard.21=Güncelleme başarılı -OptionWizard.22=Eğim -OptionWizard.23=Google Earth verilerini yeniden açarken bir hata oluştu -OptionWizard.24=İptal -OptionWizard.25=İşlem Modu -OptionWizard.26=DB host -OptionWizard.27=Bu tanınmış bir Saiku klasörü değil ( start-saiku.bat dosyası mevcut değil) -OptionWizard.28=Saiku Sunucusu tanınmadı -OptionWizard.29=DB port -OptionWizard.3=Sunucu örneği -OptionWizard.30=SQLite seçenekleri -OptionWizard.31=Örnek veri -OptionWizard.32=Plot düzeni -OptionWizard.33=Anket Tanımı -OptionWizard.34=Gelişmiş -OptionWizard.35=Kontrol noktası sayısı -OptionWizard.36=Kontrol noktaları arasındaki mesafe (metre cinsinden) -OptionWizard.37=Plot kenarı ile mesafesi (metre cinsinden) -OptionWizard.38=CSV / CED dosyası doğru okunamıyor.
Dosyanın böyle bir virgülle ayrılmış değerlere sahip olması beklenir \:
-OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect -OptionWizard.4=Geçerli bilgisayar IP'si \: -OptionWizard.40=Projeler -OptionWizard.41=Yeni bir proje dosyası yükle -OptionWizard.42=CSV okuyucuyu kapatırken hata oluÅŸtu -OptionWizard.43=Anketin adı -OptionWizard.44=veritabanını otomatik olarak yedekle -OptionWizard.45=Earth Engine plot alanına yakınlaÅŸtırarak aç -OptionWizard.46=Plot alanı için Earth Engine Timelapse'yi aç -OptionWizard.47=Plot alanı için Bing Maps'i aç -OptionWizard.48=Formu Google Earth yerine bir tarayıcıda aç (LINUX için önerilir) -OptionWizard.49=Plot verisini içeren ced / csv dosyasının yolu -OptionWizard.5=Collect Earth Sunucu giriÅŸi\: -OptionWizard.50=Tarayıcı... -OptionWizard.51=Proje dosyası içe aktarılırken hata oluÅŸtu -OptionWizard.52=Yalnızca koordinatlara sahip CSV / CED dosyası -OptionWizard.53=Puan yok -OptionWizard.54=Merkez noktası -OptionWizard.55=Proje dosyası içe aktarılırken hata oluÅŸtu -OptionWizard.56=Proje yükle -OptionWizard.57=Önceden yüklenmiÅŸ projeler -OptionWizard.58=GEE Kod Düzenleyicisini açın (Güvenilir Test Cihazı eriÅŸimi gerektirir) -OptionWizard.59=Plot üzerinde Here Maps'i aç -OptionWizard.6=PostgreSQL DB parametreleri -OptionWizard.65=Saiku klasör yolu -OptionWizard.66=Tarayıcı... -OptionWizard.67=Firefox kısayol yolu -OptionWizard.68=Tarayıcı... -OptionWizard.7=Kullanıcı adı -OptionWizard.70=Kısayol dosyaları -OptionWizard.72=İkili dosyalar -OptionWizard.73=Chrome kısayol yolu -OptionWizard.74=Tarayıcı... -OptionWizard.76=Kısayol dosyaları -OptionWizard.78=İkili dosyalar -OptionWizard.79=KML iÅŸaretçi ÅŸablonu yolu -OptionWizard.8=Parola -OptionWizard.80=Tarayıcı... -OptionWizard.82=İşaretçi ÅŸablonu -OptionWizard.83=Form tasarımının HTML balon yolu -OptionWizard.84=Tarayıcı... -OptionWizard.86=HTML web sayfası -OptionWizard.87=IDM tanımıyla XML yolu -OptionWizard.88=Tarayıcı... -OptionWizard.9=DB Adı -OptionWizard.90=XML IDM tanımlama -OptionWizard.91=Sunucu (yönetici sürümü veya tek başına kullanım) -OptionWizard.92=İstemci (operatör/sunucuya baÄŸlı) -OptionWizard.93=SQLite (Gömülü / tek dosya tabanlı) +OptionWizard.17=Tá»a độ X +OptionWizard.18=Tá»a độ Y +OptionWizard.19=Äá»™ cao +OptionWizard.2=Dòng công tác (máy chá»§/khách) +OptionWizard.20=Ná»™i dung cá»§a Google Earth đã thay đổi.
Äá» nghị chấp nhận tải lại ná»™i dung khi Google Earth gợi ý. +OptionWizard.21=Cập nhật thành công +OptionWizard.22=Dốc +OptionWizard.23=Có lá»—i khi mở lại dữ liệu Google Earth +OptionWizard.24=Há»§y +OptionWizard.25=Mode vận hành +OptionWizard.26=NÆ¡i lưu cÆ¡ sở dữ liệu +OptionWizard.27=Äây không phải là thư mục Saiku (hiện không có file start-saiku.bat) +OptionWizard.28=Không nhận được máy chá»§ Saiku +OptionWizard.29=Cổng cÆ¡ sở dữ liệu +OptionWizard.3=Ví dụ cá»§a máy chá»§ +OptionWizard.30=Các lá»±a chá»n cá»§a SQLite +OptionWizard.31=Dữ liệu mẫu +OptionWizard.32=SÆ¡ đồ mẫu +OptionWizard.33=Äịnh nghÄ©a khảo sát +OptionWizard.34=Nâng cao +OptionWizard.35=Số Ä‘iểm mẫu +OptionWizard.36=Khoảng cách giữa các Ä‘iểm mẫu (tính theo mét) +OptionWizard.37=Lá» vá»›i biên ô (tính theo mét) +OptionWizard.38=Không Ä‘á»c được đúng file CSV/CED.
Cần có dấu phảy để phân tách giá trị giống như sau \:
+OptionWizard.39=ID,Tá»a độ Y,tá»a độ X,độ cao,độ dốc,tá»· lệ +OptionWizard.4=Äịa chỉ IP hiện tại cá»§a máy tính\: +OptionWizard.40=Các project +OptionWizard.41=tải file project má»›i +OptionWizard.42=Lá»—i khi đóng CSV reader +OptionWizard.43=Tên khảo sát +OptionWizard.44=tá»± động lưu dá»± phòng dữ liệu tại +OptionWizard.45=Mở Earth Engine để phóng to vào khu vá»±c ô +OptionWizard.46=Mở Earth Engine timelapse cho khu vá»±c ô +OptionWizard.47=Mở Bing Maps cho khu vá»±c ô +OptionWizard.48=Mở form trên browser thay vì mở Google Earth (khuyến cáo cho LINUX) +OptionWizard.49=ÄÆ°á»ng dẫn tá»›i file ced/csv file vá»›i dữ liệu ô +OptionWizard.5=Cổng máy chá»§ Collect Earth\: +OptionWizard.50=Browse... +OptionWizard.51=Lá»—i nhập file project +OptionWizard.52=File CSV/CED chỉ có tá»a độ +OptionWizard.53=Ô vuông +OptionWizard.54=Äiểm trung tâm +OptionWizard.55=Lá»—i khi nhập thư mục project +OptionWizard.56=Tải project +OptionWizard.57=Các project đã tải +OptionWizard.58=Mở GEE Code Editor (cần phải có quyá»n truy cập Trusted Tester) +OptionWizard.59=Mở Here Maps tập trung vào ô +OptionWizard.6=Các thông số cá»§a CSDL PostgreSQL +OptionWizard.65=ÄÆ°á»ng dẫn tá»›i thư mục Saiku +OptionWizard.66=Browse... +OptionWizard.67=ÄÆ°á»ng dẫn tá»›i Firefox executable (file exe) +OptionWizard.68=Browse... +OptionWizard.7=Tên ngưá»i sá»­ dụng +OptionWizard.70=File chạy +OptionWizard.72=File nhị phân +OptionWizard.73=ÄÆ°á»ng dẫn tá»›i Chrome executable (file exe) +OptionWizard.74=Browse... +OptionWizard.76=File exe +OptionWizard.78=File nhị phân +OptionWizard.79=ÄÆ°á»ng dẫn tá»›i KML Freemarker template +OptionWizard.8=Mật khẩu +OptionWizard.80=Browse... +OptionWizard.82=Freemarker template +OptionWizard.83=ÄÆ°á»ng dẫn tá»›i mẫu thiết kế HTML Balloon +OptionWizard.84=Browse... +OptionWizard.86=HTML webpage +OptionWizard.87=ÄÆ°á»ng dẫn tá»›i XML vá»›i định nghÄ©a IDM +OptionWizard.88=Browse... +OptionWizard.9=Tên CSDL +OptionWizard.90=Äịnh nghÄ©a XML IDM +OptionWizard.91=Máy chá»§ (phiên bản quản lý hoặc sá»­ dụng độc lập) +OptionWizard.92=Khách (ngưá»i sá»­ dụng/kết nối vá»›i máy chá»§) +OptionWizard.93=SQLite (tích hợp/file đơn lẻ) OptionWizard.94=PostgreSQL -OptionWizard.95=Örnekleme noktalarının kenarı (metre olarak) -SaikuAnalysisListener.0=Evet - Saiku verilerini yenile (uzun iÅŸlem) -SaikuAnalysisListener.1=Hayır - Sadece Saiku'yu baÅŸlat -SaikuStarter.1=Saiku baÅŸlatılıyor -SaikuStarter.2=Saiku baÅŸlatılıyor birkaç dakika sürebilir, lütfen bekleyin \! -SaveEarthDataServlet.0=BoÅŸ istek -SaveEarthDataServlet.1=Veriyi veritabanına kaydederken sorun oluÅŸtu -SaveEarthDataServlet.2=Veri kaydedildi -SlopeCode.0=Düz (0-5) -EarthApp.11=Collect Earth zaten çalışıyor -EarthApp.21=Plotlara ait seçili CSV/CED grid dosyası bulunamadı \:
-EarthApp.23=CSV/CED dosyası ayarlanmadı \:

-EarthApp.24=İşaretçi şablonunu KML tanımına sahip dosya seçili yolda bulunamadı \:
-EarthApp.26=KML tanım dosyası ayarlanmadı \:

-EarthApp.27=HTML balon formunu içeren dosya seçili yolda bulunamadı \:
-EarthApp.29=Hiçbir HTML balon dosyası oluşturulmadı \:

-EarthApp.3=Daha Sonra Hatırlat -EarthApp.30=Lütfen Araçlar-> Özellikler menüsünden dosya konumunu düzeltin.. -EarthApp.4=Şimdi Güncelle -EarthApp.5=Tekrar hatırlatma -EarthApp.57=Collect Earth'ün yeni bir sürümü var\!
Nasıl devam etmek istiyorsun? -EarthApp.58=Güncelleme uyarısı -EarthApp.59=Proje dosyasını içe aktarırken hata oluştu -EarthApp.6=\ - Versiyon -EarthApp.61=Collect Earth dosyası açılamadı.
Lütfen Google Earth’ün kurulu olduÄŸundan emin olun. -EarthSurveyService.9=Alan gerekli -ExportActionListener.1=Kayıtların GönderileceÄŸi Tarihi Seç -ExportDialogProcessMonitor.0=Veri iÅŸleniyor... -ExportDialogProcessMonitor.1=İşlemi baÅŸlatmak için bekleniyor \: -ExportDialogProcessMonitor.4=Dışa aktarılan kayıtlar \: -ImportProcessMonitorDialog.0=İçe aktarılan kayıtlar \: -ImportActionListener.0=Doldurulmamış plotlar içe aktarılsın mı? -ImportActionListener.2=EÄŸer tıklarsanız NO sadece tüm verileri içeren "yeÅŸil" durumdaki plotlar içe aktarılacaktır. -ImportActionListener.3=BitmemiÅŸ kayıtları içe aktar -ImportDialogProcessMonitor.0=\ HESAPLANIYOR -ImportDialogProcessMonitor.11=İlk kayıt sayısı \: -ImportDialogProcessMonitor.2=Kayıtlar içe aktarılıyor... -ImportDialogProcessMonitor.5=Güncel içe aktarılan kayıt sayısı \: -ImportDialogProcessMonitor.8=Veri iÅŸleniyor... -InfiniteProgressMonitor.0=İşlemi iptal et -JFileChooserExistsAware.0=Collect Earth Proje dosya -KmlImportService.13=Konumları kaydetmek için CSV dosyası seçin -MissingPlotsListener.0=Veritabanında bulunmayan plotlar hakkında bilgi alınırken hata oluÅŸtu -MissingPlotsListener.1=Eksik plotlar -MissingPlotsListener.10=Örnekleme tasarımındaki toplam plotların sayısı \: -MissingPlotsListener.12=Eksik plotların sayısı \: -MissingPlotsListener.14=Bütün plotlar dolu\! -MissingPlotsListener.2=İçeriÄŸi panoya kopyala -MissingPlotsListener.3=Tüm verilerin doldurulup doldurulmadığını öğrenmek istediÄŸiniz plot bilgilerini (.csv veya .ced dosyaları) içeren dosyaları seçin. -MissingPlotsListener.4=Eksik plotlar - Bilgi -MissingPlotsListener.5=Dosyadan \: -MissingPlotsListener.6=CED dosyasına aktar -ProcessMonitorDialog.1=Satır numarasında ayrıştırma hatası -ProcessMonitorDialog.4=, sütunlar -ProcessMonitorDialog.5=\ -- deÄŸerler - -ImportXMLDialogProcessMonitor.1 = Verilerin üzerine yaz -ImportXMLDialogProcessMonitor.2 = Sadece yinelenmeyen plotları içe aktar - -YES=Evet -YES_TO_ALL=Tümüne evet -NO=Hayır -NO_TO_ALL=Tümüne hayır - -CollectEarthMenu.0=CEP dosyasını içe aktar -CollectEarthMenu.2=Hizmetler -CollectEarthMenu.3=Büyük CSV plot dosyalarını böl -CollectEarthMenu.4=Verileri XML'e aktar (belirli bir tarihten itibaren) -CollectEarthMenu.5=Collect yedeÄŸi için dışa aktar -CollectEarthMenu.6=Collect Backup verilerini dışa aktar (tüm veriler) -CollectEarthMenu.7=Collect Backup verilerini dışa aktar (belirli bir tarihten itibaren) -CollectEarthMenu.8=Verileri XML'e aktar (özet özniteliÄŸine göre filtrele) \ No newline at end of file +SaikuAnalysisListener.0=Yes - Làm má»›i lại dữ liệu Saiku (quá trình dài) +SaikuAnalysisListener.1=No - chỉ khởi động Saiku +SaikuStarter.1=Khởi động Saiku +SaikuStarter.2=Cần vài phút để khởi động Saiku, xin đợi\! +SaveEarthDataServlet.0=Yêu cầu trống +SaveEarthDataServlet.1=Có trục trặc khi ghi dữ liệu vào CSDL +SaveEarthDataServlet.2=Dữ liệu đã được ghi +SlopeCode.0=Bằng phẳng (0-5) +EarthApp.11=Collect Earth Ä‘ang chạy +EarthApp.21=Không tìm thấy file chứa lưới ô trong đưá»ng dẫn đã chá»n \:
+EarthApp.23=Chưa thiết lập file CSV/CED \:

+EarthApp.24=Không tìm thấy file chứa Freemarker template vá»›i định nghÄ©a KML trong đưá»ng dẫn đã chá»n\:
+EarthApp.26=Chưa thiết lập file định nghĩa KML d\:

+EarthApp.27=Không tìm thấy file chứa mẫu HTML balloon trong đưá»ng dẫn đã chá»n\:
+EarthApp.29=Chưa thiết lập file HTML balloon \:

+EarthApp.3=Nhắc nhở sau +EarthApp.30=Xin hãy Ä‘iá»u chỉnh đúng địa chỉ file trong Tools->Properties menu. +EarthApp.4=Cập nhật luôn +EarthApp.5=Không nhắc nữa +EarthApp.57=Äã có phiên bản má»›i cá»§a Collect Earth\!
Bạn muốn làm tiếp như thế nào? +EarthApp.58=Thông báo cập nhật +EarthApp.59=Lỗi khi nhập file project +EarthApp.6=\ - Phiên bản +EarthApp.61=Không mở được file Collect Earth.
Äá» nghị đảm bảo đã cài đặt Google Earth. +EarthSurveyService.9=Trưá»ng bắt buá»™c +ExportActionListener.1=Chá»n ngày xuất bản ghi +ExportDialogProcessMonitor.0=Äang xá»­ lý dữ liệu... +ExportDialogProcessMonitor.1=Äang đợi khởi động quá trình\: +ExportDialogProcessMonitor.4=Các bản ghi đã xuất\: +ImportProcessMonitorDialog.0=Các bản ghi đã nhập\: +ImportActionListener.0=Có nhập dữ liệu các ô chưa được Ä‘iá»n đầy đủ không? +ImportActionListener.2=Nếu bạn chá»n NO sẽ chỉ nhập dữ liệu cá»§a các ô có trạng thái màu "xanh lá cây", các ô đã có đầy đủ dữ liệu. +ImportActionListener.3=Nhập các bản ghi chưa hoàn tất +ImportDialogProcessMonitor.0=\ ÄANG TÃNH TOÃN +ImportDialogProcessMonitor.11=Số lượng ban đầu các bản ghi\: +ImportDialogProcessMonitor.2=Äang nhập các bản ghi... +ImportDialogProcessMonitor.5=Số lượng thá»±c tế các bản ghi đã nhập\: +ImportDialogProcessMonitor.8=Äang xá»­ lý dữ liệu... +InfiniteProgressMonitor.0=Há»§y lệnh +JFileChooserExistsAware.0=File project cá»§a Collect Earth +KmlImportService.13=Chá»n file CSV file để ghi địa Ä‘iểm cá»§a ô vào +MissingPlotsListener.0=Lá»—i khi lấy thông tin vỠô không có trong CSDL +MissingPlotsListener.1=Các ô thiếu +MissingPlotsListener.10=Tổng số ô trong thiết kế chá»n mẫu \: +MissingPlotsListener.12=Số ô thiếu\: +MissingPlotsListener.14=Äã Ä‘iá»n tất cả các ô\! +MissingPlotsListener.2=Sao chép ná»™i dung vào bàn phím +MissingPlotsListener.3=Lá»±a chá»n file có chứa thông tin ô ( file .csv hoặc .ced ) mà bạn muốn biết đã Ä‘iá»n đủ dữ liệu chưa. +MissingPlotsListener.4=Các ô thiếu - thông tin +MissingPlotsListener.5=Từ file \: +MissingPlotsListener.6=Xuất ra file CED +ProcessMonitorDialog.1=Tìm lá»—i trên số dòng +ProcessMonitorDialog.4=, cá»™t +ProcessMonitorDialog.5=\ -- giá trị From ceebe74a6ed3f769ce86b45e47c0d88a39faf8be Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:35:13 +0100 Subject: [PATCH 0776/1620] New translations Messages_vi.properties (Portuguese) --- .../earth/app/view/Messages_pt.properties | 457 +++++++++--------- 1 file changed, 218 insertions(+), 239 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index c9742c724a..5110140e9c 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,242 +1,221 @@ -AboutDialog.19=Bir sorun oluÅŸtu -AboutDialog.5=Daha fazla bilgi için web sitemizi ziyaret edin OpenForis.org -AboutDialog.6=Üzgünüm, sisteminizin varsayılan tarayıcısı bu baÄŸlantıyı açmak isterken bir sorun oluÅŸtu. -AboutDialog.8=Tamam -AspectCode.0=Kuzey -AspectCode.1=Kuzey-doÄŸu -AspectCode.2=DoÄŸu -AspectCode.3=Güney-doÄŸu -AspectCode.4=Güney -AspectCode.5=Güney-batı -AspectCode.6=Batı -AspectCode.7=Kuzey-batı -CollectEarthWindow.0=Veri CSV dosyasına aktarılmaya çalışılırken hata oluÅŸtu -CollectEarthWindow.1=Dışa aktarma hatası -CollectEarthWindow.10=Dosya -CollectEarthWindow.11=Çıkış -CollectEarthWindow.12=Araçlar -CollectEarthWindow.13=Verileri CSV'ye aktar -CollectEarthWindow.14=SAIKU Analysis baÅŸlat -CollectEarthWindow.15=Özellikler -CollectEarthWindow.16=Yardım -CollectEarthWindow.17=Yasal uyarı -CollectEarthWindow.18=Veritabnında eksik plotları bulun +AboutDialog.19=Äã có lá»—i +AboutDialog.5=Truy cập website cá»§a chúng tôi để biết thêm thông tin OpenForis.org +AboutDialog.6=Xin lá»—i, đã có sá»± cố khi mở link trong brower chuẩn trong hệ thống cá»§a bạn. +AboutDialog.8=Ok +AspectCode.0=Bắc +AspectCode.1=Äông-Bắc +AspectCode.2=Äông +AspectCode.3=Äông-Nam +AspectCode.4=Nam +AspectCode.5=Tây-Nam +AspectCode.6=Tây +AspectCode.7=Tây-Bắc +CollectEarthWindow.0=Lá»—i khi xuất dữ liệu sang file CSV +CollectEarthWindow.1=Lá»—i xuất dữ liệu +CollectEarthWindow.10=File +CollectEarthWindow.11=Thoát +CollectEarthWindow.12=Công cụ +CollectEarthWindow.13=Xuất dữ liệu ra CSV +CollectEarthWindow.14=Khởi động SAIKU Analysis +CollectEarthWindow.15=Thuá»™c tính +CollectEarthWindow.16=Trợ giúp +CollectEarthWindow.17=Thông tin công bố +CollectEarthWindow.18=Tìm ô thiếu trong cÆ¡ sở dữ liệu CollectEarthWindow.19=Collect Earth -CollectEarthWindow.2=Dil -CollectEarthWindow.20=Kopyalanan kayıt sayısı\: -CollectEarthWindow.21=Ana bilgisayar için simge bulunamadı -CollectEarthWindow.22=Collect Earth'ü kapatmak istediÄŸinizden emin misiniz?
Pencereyi kapatmanız durumunda Collect Earth sunucusunu da kapatır. -CollectEarthWindow.23=Onay gerekiyor -CollectEarthWindow.24=XML Dışa aktar -CollectEarthWindow.25=Mevcut verileriniz kaybolacak yine de bu kayıtları eklemek istiyor musunuz? -CollectEarthWindow.26=Operatör -CollectEarthWindow.27=Güncelle -CollectEarthWindow.28=Operatör, verileri değerlendirirken Open Foris Collect Earth sunucusu çalışmalıdır. -CollectEarthWindow.29=Saiku Sunucusu yapılandırılmadı. -CollectEarthWindow.3=İçe aktarma hatası -CollectEarthWindow.30=Lütfen Google Earth'ü kullanırken bu pencereyi açık tutun. -CollectEarthWindow.31=Toplanan verileri CSV dosyasına aktar -CollectEarthWindow.32=Vazgeç -CollectEarthWindow.33=Operatör adı 5 karakterden uzun ve 50 karakterden kısa olmalıdır -CollectEarthWindow.34=Doğrulama hatası -CollectEarthWindow.35=OPERATÖR ADI BOŞ\!
Lütfen operatör adını girin ve "Güncelle" düğmesine basın. -CollectEarthWindow.36=Operatör adı boş olamaz -CollectEarthWindow.37=Açık Tut -CollectEarthWindow.38=CSV dosyaları -CollectEarthWindow.39=DİKKAT\: Yeni verileri almadan önce mevcut verilerinizi (XML'e Aktar) yedeklemeniz önerilir. -CollectEarthWindow.4=FAO Yasal uyarı bildirimleri -CollectEarthWindow.40=Araçlar-> Özellikler-> Gelişmiş sekmesinde Saiku Sunucusunun kurulu olduğu klasörün yolunu ayarlayın. -CollectEarthWindow.41=Dışa aktarılan verileri dosyaya kaydet -CollectEarthWindow.42=Vazgeç -CollectEarthWindow.43=Yinelenen kayıtlar bulundu -CollectEarthWindow.44=Verileri İçe/Dışa aktar -CollectEarthWindow.45=Verileri XML'e aktar (Sıkıştırılmış) -CollectEarthWindow.46=Verileri ZIP'ten içe aktar (sıkıştırılmış XML) -CollectEarthWindow.55=CSV kullanarak mevcut kayıtları güncelle -CollectEarthWindow.47=Saiku Sunucusu yapılandırılmadı -CollectEarthWindow.48=Zip/collect-data dosyası -CollectEarthWindow.49=Fusion table CSV dosyası -CollectEarthWindow.5=Kapat -CollectEarthWindow.50=Kullanım Kılavuzunu Aç -CollectEarthWindow.51=Collect Earth güncellemelerini kontrol et -CollectEarthWindow.52=Uygulama Günlüğünü Aç -CollectEarthWindow.53=Collect Earth Günlüğü -CollectEarthWindow.54=Noktaları KML'den yükle -CollectEarthWindow.56=Hakkında... -CollectEarthWindow.57=Saiku başlatıcısı işlemi hala devam ediyor, lütfen bekleyin. -CollectEarthWindow.58=Saiku analysis başlatılamıyor -CollectEarthWindow.59=Saiku analizi için veri setini yeniden oluşturmak ister misiniz?
Bu iÅŸlem zaman alabilir.
"EVET" üzerine tıklarsanız, en son bilgileri içeren yeni bir veri seti oluşturulur. -CollectEarthWindow.6=Fusion Table'a aktar -CollectEarthWindow.60=Saiku veri üretimi -CollectEarthWindow.61=Verileri XML'e aktar (Son dışa aktarımdan bu yana değiştirilmiş kayıtlar) -CollectEarthWindow.62=Hakkında... -CollectEarthWindow.63=Noktalar KML'den alırken hata oluştu -CollectEarthWindow.64=Teknik Destek -CollectEarthWindow.7=Veri içe aktarılırken hata oluştu -CollectEarthWindow.8=Yasal uyarı metni bulunamadı -CollectEarthWindow.9=Alınan veriler veritabanında zaten mevcut olan kayıtları içerir. -CollectEarthWindow.65=Operatör adı değiştirildi -CollectEarthWindow.66=Operatör adı -CollectEarthWindow.70=Anket rehberini aç -DynamicsCode.0=Başlangıçta Orman -DynamicsCode.1=Başlangıçta Mera -DynamicsCode.2=Başlangıçta Yerleşim -DynamicsCode.3=Başlangıçta Diğer -DynamicsCode.4=Başlangıçta Sulak -DynamicsCode.5=Başlangıçta Tarım -OpenTextFileListener.0=Metin dosyası bulunamadı \: -OptionWizard.0=Collect Earth seçenekler -OptionWizard.1=Tarayıcı Seç -OptionWizard.10=Yedekleme klasörünü aç -OptionWizard.11=Blinmeyen\: yapılandırma kullanımı -OptionWizard.12=İstemci durumu -OptionWizard.13=Collect Earth Sunucu IP -OptionWizard.14=Collect Earth sunucu girişi (örn. 8023) -OptionWizard.15=Kaydet & Değişiklikleri uygula +CollectEarthWindow.2=Ngôn ngữ +CollectEarthWindow.20=Số bản ghi trùng\: +CollectEarthWindow.21=Không tìm thấy biểu tượng cho khung chính +CollectEarthWindow.22=Bạn có chắc là muốn đóng Collect Earth?
Äóng cá»­a sổ cÅ©ng đóng luôn máy chá»§ Collect Earth +CollectEarthWindow.23=Cần khẳng định +CollectEarthWindow.24=Xuất ra XML +CollectEarthWindow.25=Bạn có muốn thêm các bản ghi này và bá» Ä‘i dữ liệu hiện thá»i không? +CollectEarthWindow.26=Ngưá»i sá»­ dụng +CollectEarthWindow.27=Cập nhật +CollectEarthWindow.28=Máy chá»§ Open Foris Collect Earth phải chạy khi ngưá»i sá»­ dụng giải Ä‘oán dữ liệu. +CollectEarthWindow.29=Chưa xác định cấu hình cho Máy chá»§ Saiku. +CollectEarthWindow.3=\ Lá»—i nhập +CollectEarthWindow.30=Äể mở cá»­a sổ này khi Ä‘ang sá»­ dụng Google Earth. +CollectEarthWindow.31=Xuất dữ liệu đã thu thập sang file CSV +CollectEarthWindow.32=Thoát +CollectEarthWindow.33=Tên ngưá»i sá»­ dụng phải dài hÆ¡n 5 chữ cái và ngắn hÆ¡n 50 chữ cái +CollectEarthWindow.34=Lá»—i kiểm chứng +CollectEarthWindow.35=TÊN NGƯỜI SỬ DỤNG CÃ’N TRá»NG\!
Hãy Ä‘iá»n tên ngưá»i sá»­ dụng và nhắp phím "Update". +CollectEarthWindow.36=Không được để trống phần tên ngưá»i sá»­ dụng +CollectEarthWindow.37=Äể mở +CollectEarthWindow.38=file CSV +CollectEarthWindow.39=THÔNG BÃO\: Nên lưu dá»± phòng dữ liệu hiện thá»i(Xuất ra XML) trước khi nhập dữ liệu má»›i +CollectEarthWindow.4=Thông tin công bố cá»§a FAO +CollectEarthWindow.40=Thiết lập đưá»ng dẫn tá»›i thư mục cài đặt Saiku Server trong Tools->Properties->Advanced tab. +CollectEarthWindow.41=Ghi dữ liệu xuất ra vào file\: +CollectEarthWindow.42=Thoát +CollectEarthWindow.43=Tìm thấy bản ghi có mâu thuẫn +CollectEarthWindow.44=Nhập/Xuất dữ liệu +CollectEarthWindow.45=Xuất dữ liệu ra XML (nén) +CollectEarthWindow.46=Nhập dữ liệu má»›i từ file ZIP (XML nén) +CollectEarthWindow.55=Cập nhật các bản ghi hiện thá»i bằng CSV +CollectEarthWindow.47=Chưa định cấu hình cho Saiku Server +CollectEarthWindow.48=Zip/collect-data files +CollectEarthWindow.49=Files CSV tổng hợp +CollectEarthWindow.5=Äóng +CollectEarthWindow.50=Mở hướng dẫn ngưá»i sá»­ dụng +CollectEarthWindow.51=Kiểm tra cập nhật cá»§a Collect Earth +CollectEarthWindow.52=Mở file nhật ký ứng dụng +CollectEarthWindow.53=File nhật ký cá»§a Collect Earth +CollectEarthWindow.54=Nạp các Ä‘iểm từ KML +CollectEarthWindow.56=Vá»... +CollectEarthWindow.57=Äang chạy quá trình khởi động Saiku, xin đợi. +CollectEarthWindow.58=Không thể khởi động Saiku analysis +CollectEarthWindow.59=Bạn có muốn tạo lại bá»™ dữ liệu cho Saiku analysis không?
Quá trình này sẽ mất một vài phút.
Nếu bạn chá»n "YES" sẽ tạo ra má»™t bá»™ dữ liệu má»›i vá»›i các thông tin cập nhật nhất. +CollectEarthWindow.6=Xuất ra bảng tổng hợp +CollectEarthWindow.60=Tạo dữ liệu Saiku +CollectEarthWindow.61=Xuất dữ liệu ra XML (các bản ghi chỉnh sá»­a từ lần xuất trước) +CollectEarthWindow.62=Vá»... +CollectEarthWindow.63=Lá»—i khi nạp Ä‘iểm từ KML +CollectEarthWindow.64=Há»— trợ kỹ thuật +CollectEarthWindow.7=Lá»—i khi nhập dữ liệu +CollectEarthWindow.8=Không tìm thấy văn bản thông báo +CollectEarthWindow.9=Dữ liệu nhập vào có chứa các bản ghi đã có trong cÆ¡ sở dữ liệu cá»§a bạn. +DynamicsCode.0=Ban đầu là rừng +DynamicsCode.1=Ban đầu là trảng cá» +DynamicsCode.2=Ban đầu là khu dân cư +DynamicsCode.3=Ban đầu là đất khác +DynamicsCode.4=Ban đầu là đất ngập nước +DynamicsCode.5=Ban đầu là đất trồng trá»t +OpenTextFileListener.0=không tìm thấy file văn bản tại\: +OptionWizard.0=Các lá»±a chá»n cá»§a Collect Earth +OptionWizard.1=Chá»n Browser +OptionWizard.10=Mở thư mục lưu dá»± phòng +OptionWizard.11=Không biết\: hãy sá»­ dụng ifconfig +OptionWizard.12=Vi dụ cá»§a khác +OptionWizard.13=Äịa chỉ IP cá»§a máy chá»§ Collect Earth +OptionWizard.14=Cổng máy chá»§ Collect Earth (vd\: 8023) +OptionWizard.15=Ghi và áo dụng thay đổi OptionWizard.16=ID -OptionWizard.17=X-coord -OptionWizard.18=Y-coord -OptionWizard.19=Yükseklik -OptionWizard.2=İş akışı (sunucu/istemci) -OptionWizard.20=Google Earth içerikleri deÄŸiÅŸtirildi.
Lütfen Google Earth tarafından istendiğinde içeriğin yeniden yüklenmesini kabul edin. -OptionWizard.21=Güncelleme başarılı -OptionWizard.22=Eğim -OptionWizard.23=Google Earth verilerini yeniden açarken bir hata oluştu -OptionWizard.24=İptal -OptionWizard.25=İşlem Modu -OptionWizard.26=DB host -OptionWizard.27=Bu tanınmış bir Saiku klasörü değil ( start-saiku.bat dosyası mevcut değil) -OptionWizard.28=Saiku Sunucusu tanınmadı -OptionWizard.29=DB port -OptionWizard.3=Sunucu örneği -OptionWizard.30=SQLite seçenekleri -OptionWizard.31=Örnek veri -OptionWizard.32=Plot düzeni -OptionWizard.33=Anket Tanımı -OptionWizard.34=Gelişmiş -OptionWizard.35=Kontrol noktası sayısı -OptionWizard.36=Kontrol noktaları arasındaki mesafe (metre cinsinden) -OptionWizard.37=Plot kenarı ile mesafesi (metre cinsinden) -OptionWizard.38=CSV / CED dosyası doğru okunamıyor.
Dosyanın böyle bir virgülle ayrılmış değerlere sahip olması beklenir \:
-OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect -OptionWizard.4=Geçerli bilgisayar IP'si \: -OptionWizard.40=Projeler -OptionWizard.41=Yeni bir proje dosyası yükle -OptionWizard.42=CSV okuyucuyu kapatırken hata oluÅŸtu -OptionWizard.43=Anketin adı -OptionWizard.44=veritabanını otomatik olarak yedekle -OptionWizard.45=Earth Engine plot alanına yakınlaÅŸtırarak aç -OptionWizard.46=Plot alanı için Earth Engine Timelapse'yi aç -OptionWizard.47=Plot alanı için Bing Maps'i aç -OptionWizard.48=Formu Google Earth yerine bir tarayıcıda aç (LINUX için önerilir) -OptionWizard.49=Plot verisini içeren ced / csv dosyasının yolu -OptionWizard.5=Collect Earth Sunucu giriÅŸi\: -OptionWizard.50=Tarayıcı... -OptionWizard.51=Proje dosyası içe aktarılırken hata oluÅŸtu -OptionWizard.52=Yalnızca koordinatlara sahip CSV / CED dosyası -OptionWizard.53=Puan yok -OptionWizard.54=Merkez noktası -OptionWizard.55=Proje dosyası içe aktarılırken hata oluÅŸtu -OptionWizard.56=Proje yükle -OptionWizard.57=Önceden yüklenmiÅŸ projeler -OptionWizard.58=GEE Kod Düzenleyicisini açın (Güvenilir Test Cihazı eriÅŸimi gerektirir) -OptionWizard.59=Plot üzerinde Here Maps'i aç -OptionWizard.6=PostgreSQL DB parametreleri -OptionWizard.65=Saiku klasör yolu -OptionWizard.66=Tarayıcı... -OptionWizard.67=Firefox kısayol yolu -OptionWizard.68=Tarayıcı... -OptionWizard.7=Kullanıcı adı -OptionWizard.70=Kısayol dosyaları -OptionWizard.72=İkili dosyalar -OptionWizard.73=Chrome kısayol yolu -OptionWizard.74=Tarayıcı... -OptionWizard.76=Kısayol dosyaları -OptionWizard.78=İkili dosyalar -OptionWizard.79=KML iÅŸaretçi ÅŸablonu yolu -OptionWizard.8=Parola -OptionWizard.80=Tarayıcı... -OptionWizard.82=İşaretçi ÅŸablonu -OptionWizard.83=Form tasarımının HTML balon yolu -OptionWizard.84=Tarayıcı... -OptionWizard.86=HTML web sayfası -OptionWizard.87=IDM tanımıyla XML yolu -OptionWizard.88=Tarayıcı... -OptionWizard.9=DB Adı -OptionWizard.90=XML IDM tanımlama -OptionWizard.91=Sunucu (yönetici sürümü veya tek başına kullanım) -OptionWizard.92=İstemci (operatör/sunucuya baÄŸlı) -OptionWizard.93=SQLite (Gömülü / tek dosya tabanlı) +OptionWizard.17=Tá»a độ X +OptionWizard.18=Tá»a độ Y +OptionWizard.19=Äá»™ cao +OptionWizard.2=Dòng công tác (máy chá»§/khách) +OptionWizard.20=Ná»™i dung cá»§a Google Earth đã thay đổi.
Äá» nghị chấp nhận tải lại ná»™i dung khi Google Earth gợi ý. +OptionWizard.21=Cập nhật thành công +OptionWizard.22=Dốc +OptionWizard.23=Có lá»—i khi mở lại dữ liệu Google Earth +OptionWizard.24=Há»§y +OptionWizard.25=Mode vận hành +OptionWizard.26=NÆ¡i lưu cÆ¡ sở dữ liệu +OptionWizard.27=Äây không phải là thư mục Saiku (hiện không có file start-saiku.bat) +OptionWizard.28=Không nhận được máy chá»§ Saiku +OptionWizard.29=Cổng cÆ¡ sở dữ liệu +OptionWizard.3=Ví dụ cá»§a máy chá»§ +OptionWizard.30=Các lá»±a chá»n cá»§a SQLite +OptionWizard.31=Dữ liệu mẫu +OptionWizard.32=SÆ¡ đồ mẫu +OptionWizard.33=Äịnh nghÄ©a khảo sát +OptionWizard.34=Nâng cao +OptionWizard.35=Số Ä‘iểm mẫu +OptionWizard.36=Khoảng cách giữa các Ä‘iểm mẫu (tính theo mét) +OptionWizard.37=Lá» vá»›i biên ô (tính theo mét) +OptionWizard.38=Không Ä‘á»c được đúng file CSV/CED.
Cần có dấu phảy để phân tách giá trị giống như sau \:
+OptionWizard.39=ID,Tá»a độ Y,tá»a độ X,độ cao,độ dốc,tá»· lệ +OptionWizard.4=Äịa chỉ IP hiện tại cá»§a máy tính\: +OptionWizard.40=Các project +OptionWizard.41=tải file project má»›i +OptionWizard.42=Lá»—i khi đóng CSV reader +OptionWizard.43=Tên khảo sát +OptionWizard.44=tá»± động lưu dá»± phòng dữ liệu tại +OptionWizard.45=Mở Earth Engine để phóng to vào khu vá»±c ô +OptionWizard.46=Mở Earth Engine timelapse cho khu vá»±c ô +OptionWizard.47=Mở Bing Maps cho khu vá»±c ô +OptionWizard.48=Mở form trên browser thay vì mở Google Earth (khuyến cáo cho LINUX) +OptionWizard.49=ÄÆ°á»ng dẫn tá»›i file ced/csv file vá»›i dữ liệu ô +OptionWizard.5=Cổng máy chá»§ Collect Earth\: +OptionWizard.50=Browse... +OptionWizard.51=Lá»—i nhập file project +OptionWizard.52=File CSV/CED chỉ có tá»a độ +OptionWizard.53=Ô vuông +OptionWizard.54=Äiểm trung tâm +OptionWizard.55=Lá»—i khi nhập thư mục project +OptionWizard.56=Tải project +OptionWizard.57=Các project đã tải +OptionWizard.58=Mở GEE Code Editor (cần phải có quyá»n truy cập Trusted Tester) +OptionWizard.59=Mở Here Maps tập trung vào ô +OptionWizard.6=Các thông số cá»§a CSDL PostgreSQL +OptionWizard.65=ÄÆ°á»ng dẫn tá»›i thư mục Saiku +OptionWizard.66=Browse... +OptionWizard.67=ÄÆ°á»ng dẫn tá»›i Firefox executable (file exe) +OptionWizard.68=Browse... +OptionWizard.7=Tên ngưá»i sá»­ dụng +OptionWizard.70=File chạy +OptionWizard.72=File nhị phân +OptionWizard.73=ÄÆ°á»ng dẫn tá»›i Chrome executable (file exe) +OptionWizard.74=Browse... +OptionWizard.76=File exe +OptionWizard.78=File nhị phân +OptionWizard.79=ÄÆ°á»ng dẫn tá»›i KML Freemarker template +OptionWizard.8=Mật khẩu +OptionWizard.80=Browse... +OptionWizard.82=Freemarker template +OptionWizard.83=ÄÆ°á»ng dẫn tá»›i mẫu thiết kế HTML Balloon +OptionWizard.84=Browse... +OptionWizard.86=HTML webpage +OptionWizard.87=ÄÆ°á»ng dẫn tá»›i XML vá»›i định nghÄ©a IDM +OptionWizard.88=Browse... +OptionWizard.9=Tên CSDL +OptionWizard.90=Äịnh nghÄ©a XML IDM +OptionWizard.91=Máy chá»§ (phiên bản quản lý hoặc sá»­ dụng độc lập) +OptionWizard.92=Khách (ngưá»i sá»­ dụng/kết nối vá»›i máy chá»§) +OptionWizard.93=SQLite (tích hợp/file đơn lẻ) OptionWizard.94=PostgreSQL -OptionWizard.95=Örnekleme noktalarının kenarı (metre olarak) -SaikuAnalysisListener.0=Evet - Saiku verilerini yenile (uzun iÅŸlem) -SaikuAnalysisListener.1=Hayır - Sadece Saiku'yu baÅŸlat -SaikuStarter.1=Saiku baÅŸlatılıyor -SaikuStarter.2=Saiku baÅŸlatılıyor birkaç dakika sürebilir, lütfen bekleyin \! -SaveEarthDataServlet.0=BoÅŸ istek -SaveEarthDataServlet.1=Veriyi veritabanına kaydederken sorun oluÅŸtu -SaveEarthDataServlet.2=Veri kaydedildi -SlopeCode.0=Düz (0-5) -EarthApp.11=Collect Earth zaten çalışıyor -EarthApp.21=Plotlara ait seçili CSV/CED grid dosyası bulunamadı \:
-EarthApp.23=CSV/CED dosyası ayarlanmadı \:

-EarthApp.24=İşaretçi şablonunu KML tanımına sahip dosya seçili yolda bulunamadı \:
-EarthApp.26=KML tanım dosyası ayarlanmadı \:

-EarthApp.27=HTML balon formunu içeren dosya seçili yolda bulunamadı \:
-EarthApp.29=Hiçbir HTML balon dosyası oluşturulmadı \:

-EarthApp.3=Daha Sonra Hatırlat -EarthApp.30=Lütfen Araçlar-> Özellikler menüsünden dosya konumunu düzeltin.. -EarthApp.4=Şimdi Güncelle -EarthApp.5=Tekrar hatırlatma -EarthApp.57=Collect Earth'ün yeni bir sürümü var\!
Nasıl devam etmek istiyorsun? -EarthApp.58=Güncelleme uyarısı -EarthApp.59=Proje dosyasını içe aktarırken hata oluştu -EarthApp.6=\ - Versiyon -EarthApp.61=Collect Earth dosyası açılamadı.
Lütfen Google Earth’ün kurulu olduÄŸundan emin olun. -EarthSurveyService.9=Alan gerekli -ExportActionListener.1=Kayıtların GönderileceÄŸi Tarihi Seç -ExportDialogProcessMonitor.0=Veri iÅŸleniyor... -ExportDialogProcessMonitor.1=İşlemi baÅŸlatmak için bekleniyor \: -ExportDialogProcessMonitor.4=Dışa aktarılan kayıtlar \: -ImportProcessMonitorDialog.0=İçe aktarılan kayıtlar \: -ImportActionListener.0=Doldurulmamış plotlar içe aktarılsın mı? -ImportActionListener.2=EÄŸer tıklarsanız NO sadece tüm verileri içeren "yeÅŸil" durumdaki plotlar içe aktarılacaktır. -ImportActionListener.3=BitmemiÅŸ kayıtları içe aktar -ImportDialogProcessMonitor.0=\ HESAPLANIYOR -ImportDialogProcessMonitor.11=İlk kayıt sayısı \: -ImportDialogProcessMonitor.2=Kayıtlar içe aktarılıyor... -ImportDialogProcessMonitor.5=Güncel içe aktarılan kayıt sayısı \: -ImportDialogProcessMonitor.8=Veri iÅŸleniyor... -InfiniteProgressMonitor.0=İşlemi iptal et -JFileChooserExistsAware.0=Collect Earth Proje dosya -KmlImportService.13=Konumları kaydetmek için CSV dosyası seçin -MissingPlotsListener.0=Veritabanında bulunmayan plotlar hakkında bilgi alınırken hata oluÅŸtu -MissingPlotsListener.1=Eksik plotlar -MissingPlotsListener.10=Örnekleme tasarımındaki toplam plotların sayısı \: -MissingPlotsListener.12=Eksik plotların sayısı \: -MissingPlotsListener.14=Bütün plotlar dolu\! -MissingPlotsListener.2=İçeriÄŸi panoya kopyala -MissingPlotsListener.3=Tüm verilerin doldurulup doldurulmadığını öğrenmek istediÄŸiniz plot bilgilerini (.csv veya .ced dosyaları) içeren dosyaları seçin. -MissingPlotsListener.4=Eksik plotlar - Bilgi -MissingPlotsListener.5=Dosyadan \: -MissingPlotsListener.6=CED dosyasına aktar -ProcessMonitorDialog.1=Satır numarasında ayrıştırma hatası -ProcessMonitorDialog.4=, sütunlar -ProcessMonitorDialog.5=\ -- deÄŸerler - -ImportXMLDialogProcessMonitor.1 = Verilerin üzerine yaz -ImportXMLDialogProcessMonitor.2 = Sadece yinelenmeyen plotları içe aktar - -YES=Evet -YES_TO_ALL=Tümüne evet -NO=Hayır -NO_TO_ALL=Tümüne hayır - -CollectEarthMenu.0=CEP dosyasını içe aktar -CollectEarthMenu.2=Hizmetler -CollectEarthMenu.3=Büyük CSV plot dosyalarını böl -CollectEarthMenu.4=Verileri XML'e aktar (belirli bir tarihten itibaren) -CollectEarthMenu.5=Collect yedeÄŸi için dışa aktar -CollectEarthMenu.6=Collect Backup verilerini dışa aktar (tüm veriler) -CollectEarthMenu.7=Collect Backup verilerini dışa aktar (belirli bir tarihten itibaren) -CollectEarthMenu.8=Verileri XML'e aktar (özet özniteliÄŸine göre filtrele) \ No newline at end of file +SaikuAnalysisListener.0=Yes - Làm má»›i lại dữ liệu Saiku (quá trình dài) +SaikuAnalysisListener.1=No - chỉ khởi động Saiku +SaikuStarter.1=Khởi động Saiku +SaikuStarter.2=Cần vài phút để khởi động Saiku, xin đợi\! +SaveEarthDataServlet.0=Yêu cầu trống +SaveEarthDataServlet.1=Có trục trặc khi ghi dữ liệu vào CSDL +SaveEarthDataServlet.2=Dữ liệu đã được ghi +SlopeCode.0=Bằng phẳng (0-5) +EarthApp.11=Collect Earth Ä‘ang chạy +EarthApp.21=Không tìm thấy file chứa lưới ô trong đưá»ng dẫn đã chá»n \:
+EarthApp.23=Chưa thiết lập file CSV/CED \:

+EarthApp.24=Không tìm thấy file chứa Freemarker template vá»›i định nghÄ©a KML trong đưá»ng dẫn đã chá»n\:
+EarthApp.26=Chưa thiết lập file định nghĩa KML d\:

+EarthApp.27=Không tìm thấy file chứa mẫu HTML balloon trong đưá»ng dẫn đã chá»n\:
+EarthApp.29=Chưa thiết lập file HTML balloon \:

+EarthApp.3=Nhắc nhở sau +EarthApp.30=Xin hãy Ä‘iá»u chỉnh đúng địa chỉ file trong Tools->Properties menu. +EarthApp.4=Cập nhật luôn +EarthApp.5=Không nhắc nữa +EarthApp.57=Äã có phiên bản má»›i cá»§a Collect Earth\!
Bạn muốn làm tiếp như thế nào? +EarthApp.58=Thông báo cập nhật +EarthApp.59=Lỗi khi nhập file project +EarthApp.6=\ - Phiên bản +EarthApp.61=Không mở được file Collect Earth.
Äá» nghị đảm bảo đã cài đặt Google Earth. +EarthSurveyService.9=Trưá»ng bắt buá»™c +ExportActionListener.1=Chá»n ngày xuất bản ghi +ExportDialogProcessMonitor.0=Äang xá»­ lý dữ liệu... +ExportDialogProcessMonitor.1=Äang đợi khởi động quá trình\: +ExportDialogProcessMonitor.4=Các bản ghi đã xuất\: +ImportProcessMonitorDialog.0=Các bản ghi đã nhập\: +ImportActionListener.0=Có nhập dữ liệu các ô chưa được Ä‘iá»n đầy đủ không? +ImportActionListener.2=Nếu bạn chá»n NO sẽ chỉ nhập dữ liệu cá»§a các ô có trạng thái màu "xanh lá cây", các ô đã có đầy đủ dữ liệu. +ImportActionListener.3=Nhập các bản ghi chưa hoàn tất +ImportDialogProcessMonitor.0=\ ÄANG TÃNH TOÃN +ImportDialogProcessMonitor.11=Số lượng ban đầu các bản ghi\: +ImportDialogProcessMonitor.2=Äang nhập các bản ghi... +ImportDialogProcessMonitor.5=Số lượng thá»±c tế các bản ghi đã nhập\: +ImportDialogProcessMonitor.8=Äang xá»­ lý dữ liệu... +InfiniteProgressMonitor.0=Há»§y lệnh +JFileChooserExistsAware.0=File project cá»§a Collect Earth +KmlImportService.13=Chá»n file CSV file để ghi địa Ä‘iểm cá»§a ô vào +MissingPlotsListener.0=Lá»—i khi lấy thông tin vỠô không có trong CSDL +MissingPlotsListener.1=Các ô thiếu +MissingPlotsListener.10=Tổng số ô trong thiết kế chá»n mẫu \: +MissingPlotsListener.12=Số ô thiếu\: +MissingPlotsListener.14=Äã Ä‘iá»n tất cả các ô\! +MissingPlotsListener.2=Sao chép ná»™i dung vào bàn phím +MissingPlotsListener.3=Lá»±a chá»n file có chứa thông tin ô ( file .csv hoặc .ced ) mà bạn muốn biết đã Ä‘iá»n đủ dữ liệu chưa. +MissingPlotsListener.4=Các ô thiếu - thông tin +MissingPlotsListener.5=Từ file \: +MissingPlotsListener.6=Xuất ra file CED +ProcessMonitorDialog.1=Tìm lá»—i trên số dòng +ProcessMonitorDialog.4=, cá»™t +ProcessMonitorDialog.5=\ -- giá trị From 8746c8ab51915d55d2d0563d8c7061f3618cb9ff Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:35:14 +0100 Subject: [PATCH 0777/1620] New translations Messages_vi.properties (English) --- .../earth/app/view/Messages_en.properties | 457 +++++++++--------- 1 file changed, 218 insertions(+), 239 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index c9742c724a..5110140e9c 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,242 +1,221 @@ -AboutDialog.19=Bir sorun oluÅŸtu -AboutDialog.5=Daha fazla bilgi için web sitemizi ziyaret edin OpenForis.org -AboutDialog.6=Üzgünüm, sisteminizin varsayılan tarayıcısı bu baÄŸlantıyı açmak isterken bir sorun oluÅŸtu. -AboutDialog.8=Tamam -AspectCode.0=Kuzey -AspectCode.1=Kuzey-doÄŸu -AspectCode.2=DoÄŸu -AspectCode.3=Güney-doÄŸu -AspectCode.4=Güney -AspectCode.5=Güney-batı -AspectCode.6=Batı -AspectCode.7=Kuzey-batı -CollectEarthWindow.0=Veri CSV dosyasına aktarılmaya çalışılırken hata oluÅŸtu -CollectEarthWindow.1=Dışa aktarma hatası -CollectEarthWindow.10=Dosya -CollectEarthWindow.11=Çıkış -CollectEarthWindow.12=Araçlar -CollectEarthWindow.13=Verileri CSV'ye aktar -CollectEarthWindow.14=SAIKU Analysis baÅŸlat -CollectEarthWindow.15=Özellikler -CollectEarthWindow.16=Yardım -CollectEarthWindow.17=Yasal uyarı -CollectEarthWindow.18=Veritabnında eksik plotları bulun +AboutDialog.19=Äã có lá»—i +AboutDialog.5=Truy cập website cá»§a chúng tôi để biết thêm thông tin OpenForis.org +AboutDialog.6=Xin lá»—i, đã có sá»± cố khi mở link trong brower chuẩn trong hệ thống cá»§a bạn. +AboutDialog.8=Ok +AspectCode.0=Bắc +AspectCode.1=Äông-Bắc +AspectCode.2=Äông +AspectCode.3=Äông-Nam +AspectCode.4=Nam +AspectCode.5=Tây-Nam +AspectCode.6=Tây +AspectCode.7=Tây-Bắc +CollectEarthWindow.0=Lá»—i khi xuất dữ liệu sang file CSV +CollectEarthWindow.1=Lá»—i xuất dữ liệu +CollectEarthWindow.10=File +CollectEarthWindow.11=Thoát +CollectEarthWindow.12=Công cụ +CollectEarthWindow.13=Xuất dữ liệu ra CSV +CollectEarthWindow.14=Khởi động SAIKU Analysis +CollectEarthWindow.15=Thuá»™c tính +CollectEarthWindow.16=Trợ giúp +CollectEarthWindow.17=Thông tin công bố +CollectEarthWindow.18=Tìm ô thiếu trong cÆ¡ sở dữ liệu CollectEarthWindow.19=Collect Earth -CollectEarthWindow.2=Dil -CollectEarthWindow.20=Kopyalanan kayıt sayısı\: -CollectEarthWindow.21=Ana bilgisayar için simge bulunamadı -CollectEarthWindow.22=Collect Earth'ü kapatmak istediÄŸinizden emin misiniz?
Pencereyi kapatmanız durumunda Collect Earth sunucusunu da kapatır. -CollectEarthWindow.23=Onay gerekiyor -CollectEarthWindow.24=XML Dışa aktar -CollectEarthWindow.25=Mevcut verileriniz kaybolacak yine de bu kayıtları eklemek istiyor musunuz? -CollectEarthWindow.26=Operatör -CollectEarthWindow.27=Güncelle -CollectEarthWindow.28=Operatör, verileri değerlendirirken Open Foris Collect Earth sunucusu çalışmalıdır. -CollectEarthWindow.29=Saiku Sunucusu yapılandırılmadı. -CollectEarthWindow.3=İçe aktarma hatası -CollectEarthWindow.30=Lütfen Google Earth'ü kullanırken bu pencereyi açık tutun. -CollectEarthWindow.31=Toplanan verileri CSV dosyasına aktar -CollectEarthWindow.32=Vazgeç -CollectEarthWindow.33=Operatör adı 5 karakterden uzun ve 50 karakterden kısa olmalıdır -CollectEarthWindow.34=Doğrulama hatası -CollectEarthWindow.35=OPERATÖR ADI BOŞ\!
Lütfen operatör adını girin ve "Güncelle" düğmesine basın. -CollectEarthWindow.36=Operatör adı boş olamaz -CollectEarthWindow.37=Açık Tut -CollectEarthWindow.38=CSV dosyaları -CollectEarthWindow.39=DİKKAT\: Yeni verileri almadan önce mevcut verilerinizi (XML'e Aktar) yedeklemeniz önerilir. -CollectEarthWindow.4=FAO Yasal uyarı bildirimleri -CollectEarthWindow.40=Araçlar-> Özellikler-> Gelişmiş sekmesinde Saiku Sunucusunun kurulu olduğu klasörün yolunu ayarlayın. -CollectEarthWindow.41=Dışa aktarılan verileri dosyaya kaydet -CollectEarthWindow.42=Vazgeç -CollectEarthWindow.43=Yinelenen kayıtlar bulundu -CollectEarthWindow.44=Verileri İçe/Dışa aktar -CollectEarthWindow.45=Verileri XML'e aktar (Sıkıştırılmış) -CollectEarthWindow.46=Verileri ZIP'ten içe aktar (sıkıştırılmış XML) -CollectEarthWindow.55=CSV kullanarak mevcut kayıtları güncelle -CollectEarthWindow.47=Saiku Sunucusu yapılandırılmadı -CollectEarthWindow.48=Zip/collect-data dosyası -CollectEarthWindow.49=Fusion table CSV dosyası -CollectEarthWindow.5=Kapat -CollectEarthWindow.50=Kullanım Kılavuzunu Aç -CollectEarthWindow.51=Collect Earth güncellemelerini kontrol et -CollectEarthWindow.52=Uygulama Günlüğünü Aç -CollectEarthWindow.53=Collect Earth Günlüğü -CollectEarthWindow.54=Noktaları KML'den yükle -CollectEarthWindow.56=Hakkında... -CollectEarthWindow.57=Saiku başlatıcısı işlemi hala devam ediyor, lütfen bekleyin. -CollectEarthWindow.58=Saiku analysis başlatılamıyor -CollectEarthWindow.59=Saiku analizi için veri setini yeniden oluşturmak ister misiniz?
Bu iÅŸlem zaman alabilir.
"EVET" üzerine tıklarsanız, en son bilgileri içeren yeni bir veri seti oluşturulur. -CollectEarthWindow.6=Fusion Table'a aktar -CollectEarthWindow.60=Saiku veri üretimi -CollectEarthWindow.61=Verileri XML'e aktar (Son dışa aktarımdan bu yana değiştirilmiş kayıtlar) -CollectEarthWindow.62=Hakkında... -CollectEarthWindow.63=Noktalar KML'den alırken hata oluştu -CollectEarthWindow.64=Teknik Destek -CollectEarthWindow.7=Veri içe aktarılırken hata oluştu -CollectEarthWindow.8=Yasal uyarı metni bulunamadı -CollectEarthWindow.9=Alınan veriler veritabanında zaten mevcut olan kayıtları içerir. -CollectEarthWindow.65=Operatör adı değiştirildi -CollectEarthWindow.66=Operatör adı -CollectEarthWindow.70=Anket rehberini aç -DynamicsCode.0=Başlangıçta Orman -DynamicsCode.1=Başlangıçta Mera -DynamicsCode.2=Başlangıçta Yerleşim -DynamicsCode.3=Başlangıçta Diğer -DynamicsCode.4=Başlangıçta Sulak -DynamicsCode.5=Başlangıçta Tarım -OpenTextFileListener.0=Metin dosyası bulunamadı \: -OptionWizard.0=Collect Earth seçenekler -OptionWizard.1=Tarayıcı Seç -OptionWizard.10=Yedekleme klasörünü aç -OptionWizard.11=Blinmeyen\: yapılandırma kullanımı -OptionWizard.12=İstemci durumu -OptionWizard.13=Collect Earth Sunucu IP -OptionWizard.14=Collect Earth sunucu girişi (örn. 8023) -OptionWizard.15=Kaydet & Değişiklikleri uygula +CollectEarthWindow.2=Ngôn ngữ +CollectEarthWindow.20=Số bản ghi trùng\: +CollectEarthWindow.21=Không tìm thấy biểu tượng cho khung chính +CollectEarthWindow.22=Bạn có chắc là muốn đóng Collect Earth?
Äóng cá»­a sổ cÅ©ng đóng luôn máy chá»§ Collect Earth +CollectEarthWindow.23=Cần khẳng định +CollectEarthWindow.24=Xuất ra XML +CollectEarthWindow.25=Bạn có muốn thêm các bản ghi này và bá» Ä‘i dữ liệu hiện thá»i không? +CollectEarthWindow.26=Ngưá»i sá»­ dụng +CollectEarthWindow.27=Cập nhật +CollectEarthWindow.28=Máy chá»§ Open Foris Collect Earth phải chạy khi ngưá»i sá»­ dụng giải Ä‘oán dữ liệu. +CollectEarthWindow.29=Chưa xác định cấu hình cho Máy chá»§ Saiku. +CollectEarthWindow.3=\ Lá»—i nhập +CollectEarthWindow.30=Äể mở cá»­a sổ này khi Ä‘ang sá»­ dụng Google Earth. +CollectEarthWindow.31=Xuất dữ liệu đã thu thập sang file CSV +CollectEarthWindow.32=Thoát +CollectEarthWindow.33=Tên ngưá»i sá»­ dụng phải dài hÆ¡n 5 chữ cái và ngắn hÆ¡n 50 chữ cái +CollectEarthWindow.34=Lá»—i kiểm chứng +CollectEarthWindow.35=TÊN NGƯỜI SỬ DỤNG CÃ’N TRá»NG\!
Hãy Ä‘iá»n tên ngưá»i sá»­ dụng và nhắp phím "Update". +CollectEarthWindow.36=Không được để trống phần tên ngưá»i sá»­ dụng +CollectEarthWindow.37=Äể mở +CollectEarthWindow.38=file CSV +CollectEarthWindow.39=THÔNG BÃO\: Nên lưu dá»± phòng dữ liệu hiện thá»i(Xuất ra XML) trước khi nhập dữ liệu má»›i +CollectEarthWindow.4=Thông tin công bố cá»§a FAO +CollectEarthWindow.40=Thiết lập đưá»ng dẫn tá»›i thư mục cài đặt Saiku Server trong Tools->Properties->Advanced tab. +CollectEarthWindow.41=Ghi dữ liệu xuất ra vào file\: +CollectEarthWindow.42=Thoát +CollectEarthWindow.43=Tìm thấy bản ghi có mâu thuẫn +CollectEarthWindow.44=Nhập/Xuất dữ liệu +CollectEarthWindow.45=Xuất dữ liệu ra XML (nén) +CollectEarthWindow.46=Nhập dữ liệu má»›i từ file ZIP (XML nén) +CollectEarthWindow.55=Cập nhật các bản ghi hiện thá»i bằng CSV +CollectEarthWindow.47=Chưa định cấu hình cho Saiku Server +CollectEarthWindow.48=Zip/collect-data files +CollectEarthWindow.49=Files CSV tổng hợp +CollectEarthWindow.5=Äóng +CollectEarthWindow.50=Mở hướng dẫn ngưá»i sá»­ dụng +CollectEarthWindow.51=Kiểm tra cập nhật cá»§a Collect Earth +CollectEarthWindow.52=Mở file nhật ký ứng dụng +CollectEarthWindow.53=File nhật ký cá»§a Collect Earth +CollectEarthWindow.54=Nạp các Ä‘iểm từ KML +CollectEarthWindow.56=Vá»... +CollectEarthWindow.57=Äang chạy quá trình khởi động Saiku, xin đợi. +CollectEarthWindow.58=Không thể khởi động Saiku analysis +CollectEarthWindow.59=Bạn có muốn tạo lại bá»™ dữ liệu cho Saiku analysis không?
Quá trình này sẽ mất một vài phút.
Nếu bạn chá»n "YES" sẽ tạo ra má»™t bá»™ dữ liệu má»›i vá»›i các thông tin cập nhật nhất. +CollectEarthWindow.6=Xuất ra bảng tổng hợp +CollectEarthWindow.60=Tạo dữ liệu Saiku +CollectEarthWindow.61=Xuất dữ liệu ra XML (các bản ghi chỉnh sá»­a từ lần xuất trước) +CollectEarthWindow.62=Vá»... +CollectEarthWindow.63=Lá»—i khi nạp Ä‘iểm từ KML +CollectEarthWindow.64=Há»— trợ kỹ thuật +CollectEarthWindow.7=Lá»—i khi nhập dữ liệu +CollectEarthWindow.8=Không tìm thấy văn bản thông báo +CollectEarthWindow.9=Dữ liệu nhập vào có chứa các bản ghi đã có trong cÆ¡ sở dữ liệu cá»§a bạn. +DynamicsCode.0=Ban đầu là rừng +DynamicsCode.1=Ban đầu là trảng cá» +DynamicsCode.2=Ban đầu là khu dân cư +DynamicsCode.3=Ban đầu là đất khác +DynamicsCode.4=Ban đầu là đất ngập nước +DynamicsCode.5=Ban đầu là đất trồng trá»t +OpenTextFileListener.0=không tìm thấy file văn bản tại\: +OptionWizard.0=Các lá»±a chá»n cá»§a Collect Earth +OptionWizard.1=Chá»n Browser +OptionWizard.10=Mở thư mục lưu dá»± phòng +OptionWizard.11=Không biết\: hãy sá»­ dụng ifconfig +OptionWizard.12=Vi dụ cá»§a khác +OptionWizard.13=Äịa chỉ IP cá»§a máy chá»§ Collect Earth +OptionWizard.14=Cổng máy chá»§ Collect Earth (vd\: 8023) +OptionWizard.15=Ghi và áo dụng thay đổi OptionWizard.16=ID -OptionWizard.17=X-coord -OptionWizard.18=Y-coord -OptionWizard.19=Yükseklik -OptionWizard.2=İş akışı (sunucu/istemci) -OptionWizard.20=Google Earth içerikleri deÄŸiÅŸtirildi.
Lütfen Google Earth tarafından istendiğinde içeriğin yeniden yüklenmesini kabul edin. -OptionWizard.21=Güncelleme başarılı -OptionWizard.22=Eğim -OptionWizard.23=Google Earth verilerini yeniden açarken bir hata oluştu -OptionWizard.24=İptal -OptionWizard.25=İşlem Modu -OptionWizard.26=DB host -OptionWizard.27=Bu tanınmış bir Saiku klasörü değil ( start-saiku.bat dosyası mevcut değil) -OptionWizard.28=Saiku Sunucusu tanınmadı -OptionWizard.29=DB port -OptionWizard.3=Sunucu örneği -OptionWizard.30=SQLite seçenekleri -OptionWizard.31=Örnek veri -OptionWizard.32=Plot düzeni -OptionWizard.33=Anket Tanımı -OptionWizard.34=Gelişmiş -OptionWizard.35=Kontrol noktası sayısı -OptionWizard.36=Kontrol noktaları arasındaki mesafe (metre cinsinden) -OptionWizard.37=Plot kenarı ile mesafesi (metre cinsinden) -OptionWizard.38=CSV / CED dosyası doğru okunamıyor.
Dosyanın böyle bir virgülle ayrılmış değerlere sahip olması beklenir \:
-OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect -OptionWizard.4=Geçerli bilgisayar IP'si \: -OptionWizard.40=Projeler -OptionWizard.41=Yeni bir proje dosyası yükle -OptionWizard.42=CSV okuyucuyu kapatırken hata oluÅŸtu -OptionWizard.43=Anketin adı -OptionWizard.44=veritabanını otomatik olarak yedekle -OptionWizard.45=Earth Engine plot alanına yakınlaÅŸtırarak aç -OptionWizard.46=Plot alanı için Earth Engine Timelapse'yi aç -OptionWizard.47=Plot alanı için Bing Maps'i aç -OptionWizard.48=Formu Google Earth yerine bir tarayıcıda aç (LINUX için önerilir) -OptionWizard.49=Plot verisini içeren ced / csv dosyasının yolu -OptionWizard.5=Collect Earth Sunucu giriÅŸi\: -OptionWizard.50=Tarayıcı... -OptionWizard.51=Proje dosyası içe aktarılırken hata oluÅŸtu -OptionWizard.52=Yalnızca koordinatlara sahip CSV / CED dosyası -OptionWizard.53=Puan yok -OptionWizard.54=Merkez noktası -OptionWizard.55=Proje dosyası içe aktarılırken hata oluÅŸtu -OptionWizard.56=Proje yükle -OptionWizard.57=Önceden yüklenmiÅŸ projeler -OptionWizard.58=GEE Kod Düzenleyicisini açın (Güvenilir Test Cihazı eriÅŸimi gerektirir) -OptionWizard.59=Plot üzerinde Here Maps'i aç -OptionWizard.6=PostgreSQL DB parametreleri -OptionWizard.65=Saiku klasör yolu -OptionWizard.66=Tarayıcı... -OptionWizard.67=Firefox kısayol yolu -OptionWizard.68=Tarayıcı... -OptionWizard.7=Kullanıcı adı -OptionWizard.70=Kısayol dosyaları -OptionWizard.72=İkili dosyalar -OptionWizard.73=Chrome kısayol yolu -OptionWizard.74=Tarayıcı... -OptionWizard.76=Kısayol dosyaları -OptionWizard.78=İkili dosyalar -OptionWizard.79=KML iÅŸaretçi ÅŸablonu yolu -OptionWizard.8=Parola -OptionWizard.80=Tarayıcı... -OptionWizard.82=İşaretçi ÅŸablonu -OptionWizard.83=Form tasarımının HTML balon yolu -OptionWizard.84=Tarayıcı... -OptionWizard.86=HTML web sayfası -OptionWizard.87=IDM tanımıyla XML yolu -OptionWizard.88=Tarayıcı... -OptionWizard.9=DB Adı -OptionWizard.90=XML IDM tanımlama -OptionWizard.91=Sunucu (yönetici sürümü veya tek başına kullanım) -OptionWizard.92=İstemci (operatör/sunucuya baÄŸlı) -OptionWizard.93=SQLite (Gömülü / tek dosya tabanlı) +OptionWizard.17=Tá»a độ X +OptionWizard.18=Tá»a độ Y +OptionWizard.19=Äá»™ cao +OptionWizard.2=Dòng công tác (máy chá»§/khách) +OptionWizard.20=Ná»™i dung cá»§a Google Earth đã thay đổi.
Äá» nghị chấp nhận tải lại ná»™i dung khi Google Earth gợi ý. +OptionWizard.21=Cập nhật thành công +OptionWizard.22=Dốc +OptionWizard.23=Có lá»—i khi mở lại dữ liệu Google Earth +OptionWizard.24=Há»§y +OptionWizard.25=Mode vận hành +OptionWizard.26=NÆ¡i lưu cÆ¡ sở dữ liệu +OptionWizard.27=Äây không phải là thư mục Saiku (hiện không có file start-saiku.bat) +OptionWizard.28=Không nhận được máy chá»§ Saiku +OptionWizard.29=Cổng cÆ¡ sở dữ liệu +OptionWizard.3=Ví dụ cá»§a máy chá»§ +OptionWizard.30=Các lá»±a chá»n cá»§a SQLite +OptionWizard.31=Dữ liệu mẫu +OptionWizard.32=SÆ¡ đồ mẫu +OptionWizard.33=Äịnh nghÄ©a khảo sát +OptionWizard.34=Nâng cao +OptionWizard.35=Số Ä‘iểm mẫu +OptionWizard.36=Khoảng cách giữa các Ä‘iểm mẫu (tính theo mét) +OptionWizard.37=Lá» vá»›i biên ô (tính theo mét) +OptionWizard.38=Không Ä‘á»c được đúng file CSV/CED.
Cần có dấu phảy để phân tách giá trị giống như sau \:
+OptionWizard.39=ID,Tá»a độ Y,tá»a độ X,độ cao,độ dốc,tá»· lệ +OptionWizard.4=Äịa chỉ IP hiện tại cá»§a máy tính\: +OptionWizard.40=Các project +OptionWizard.41=tải file project má»›i +OptionWizard.42=Lá»—i khi đóng CSV reader +OptionWizard.43=Tên khảo sát +OptionWizard.44=tá»± động lưu dá»± phòng dữ liệu tại +OptionWizard.45=Mở Earth Engine để phóng to vào khu vá»±c ô +OptionWizard.46=Mở Earth Engine timelapse cho khu vá»±c ô +OptionWizard.47=Mở Bing Maps cho khu vá»±c ô +OptionWizard.48=Mở form trên browser thay vì mở Google Earth (khuyến cáo cho LINUX) +OptionWizard.49=ÄÆ°á»ng dẫn tá»›i file ced/csv file vá»›i dữ liệu ô +OptionWizard.5=Cổng máy chá»§ Collect Earth\: +OptionWizard.50=Browse... +OptionWizard.51=Lá»—i nhập file project +OptionWizard.52=File CSV/CED chỉ có tá»a độ +OptionWizard.53=Ô vuông +OptionWizard.54=Äiểm trung tâm +OptionWizard.55=Lá»—i khi nhập thư mục project +OptionWizard.56=Tải project +OptionWizard.57=Các project đã tải +OptionWizard.58=Mở GEE Code Editor (cần phải có quyá»n truy cập Trusted Tester) +OptionWizard.59=Mở Here Maps tập trung vào ô +OptionWizard.6=Các thông số cá»§a CSDL PostgreSQL +OptionWizard.65=ÄÆ°á»ng dẫn tá»›i thư mục Saiku +OptionWizard.66=Browse... +OptionWizard.67=ÄÆ°á»ng dẫn tá»›i Firefox executable (file exe) +OptionWizard.68=Browse... +OptionWizard.7=Tên ngưá»i sá»­ dụng +OptionWizard.70=File chạy +OptionWizard.72=File nhị phân +OptionWizard.73=ÄÆ°á»ng dẫn tá»›i Chrome executable (file exe) +OptionWizard.74=Browse... +OptionWizard.76=File exe +OptionWizard.78=File nhị phân +OptionWizard.79=ÄÆ°á»ng dẫn tá»›i KML Freemarker template +OptionWizard.8=Mật khẩu +OptionWizard.80=Browse... +OptionWizard.82=Freemarker template +OptionWizard.83=ÄÆ°á»ng dẫn tá»›i mẫu thiết kế HTML Balloon +OptionWizard.84=Browse... +OptionWizard.86=HTML webpage +OptionWizard.87=ÄÆ°á»ng dẫn tá»›i XML vá»›i định nghÄ©a IDM +OptionWizard.88=Browse... +OptionWizard.9=Tên CSDL +OptionWizard.90=Äịnh nghÄ©a XML IDM +OptionWizard.91=Máy chá»§ (phiên bản quản lý hoặc sá»­ dụng độc lập) +OptionWizard.92=Khách (ngưá»i sá»­ dụng/kết nối vá»›i máy chá»§) +OptionWizard.93=SQLite (tích hợp/file đơn lẻ) OptionWizard.94=PostgreSQL -OptionWizard.95=Örnekleme noktalarının kenarı (metre olarak) -SaikuAnalysisListener.0=Evet - Saiku verilerini yenile (uzun iÅŸlem) -SaikuAnalysisListener.1=Hayır - Sadece Saiku'yu baÅŸlat -SaikuStarter.1=Saiku baÅŸlatılıyor -SaikuStarter.2=Saiku baÅŸlatılıyor birkaç dakika sürebilir, lütfen bekleyin \! -SaveEarthDataServlet.0=BoÅŸ istek -SaveEarthDataServlet.1=Veriyi veritabanına kaydederken sorun oluÅŸtu -SaveEarthDataServlet.2=Veri kaydedildi -SlopeCode.0=Düz (0-5) -EarthApp.11=Collect Earth zaten çalışıyor -EarthApp.21=Plotlara ait seçili CSV/CED grid dosyası bulunamadı \:
-EarthApp.23=CSV/CED dosyası ayarlanmadı \:

-EarthApp.24=İşaretçi şablonunu KML tanımına sahip dosya seçili yolda bulunamadı \:
-EarthApp.26=KML tanım dosyası ayarlanmadı \:

-EarthApp.27=HTML balon formunu içeren dosya seçili yolda bulunamadı \:
-EarthApp.29=Hiçbir HTML balon dosyası oluşturulmadı \:

-EarthApp.3=Daha Sonra Hatırlat -EarthApp.30=Lütfen Araçlar-> Özellikler menüsünden dosya konumunu düzeltin.. -EarthApp.4=Şimdi Güncelle -EarthApp.5=Tekrar hatırlatma -EarthApp.57=Collect Earth'ün yeni bir sürümü var\!
Nasıl devam etmek istiyorsun? -EarthApp.58=Güncelleme uyarısı -EarthApp.59=Proje dosyasını içe aktarırken hata oluştu -EarthApp.6=\ - Versiyon -EarthApp.61=Collect Earth dosyası açılamadı.
Lütfen Google Earth’ün kurulu olduÄŸundan emin olun. -EarthSurveyService.9=Alan gerekli -ExportActionListener.1=Kayıtların GönderileceÄŸi Tarihi Seç -ExportDialogProcessMonitor.0=Veri iÅŸleniyor... -ExportDialogProcessMonitor.1=İşlemi baÅŸlatmak için bekleniyor \: -ExportDialogProcessMonitor.4=Dışa aktarılan kayıtlar \: -ImportProcessMonitorDialog.0=İçe aktarılan kayıtlar \: -ImportActionListener.0=Doldurulmamış plotlar içe aktarılsın mı? -ImportActionListener.2=EÄŸer tıklarsanız NO sadece tüm verileri içeren "yeÅŸil" durumdaki plotlar içe aktarılacaktır. -ImportActionListener.3=BitmemiÅŸ kayıtları içe aktar -ImportDialogProcessMonitor.0=\ HESAPLANIYOR -ImportDialogProcessMonitor.11=İlk kayıt sayısı \: -ImportDialogProcessMonitor.2=Kayıtlar içe aktarılıyor... -ImportDialogProcessMonitor.5=Güncel içe aktarılan kayıt sayısı \: -ImportDialogProcessMonitor.8=Veri iÅŸleniyor... -InfiniteProgressMonitor.0=İşlemi iptal et -JFileChooserExistsAware.0=Collect Earth Proje dosya -KmlImportService.13=Konumları kaydetmek için CSV dosyası seçin -MissingPlotsListener.0=Veritabanında bulunmayan plotlar hakkında bilgi alınırken hata oluÅŸtu -MissingPlotsListener.1=Eksik plotlar -MissingPlotsListener.10=Örnekleme tasarımındaki toplam plotların sayısı \: -MissingPlotsListener.12=Eksik plotların sayısı \: -MissingPlotsListener.14=Bütün plotlar dolu\! -MissingPlotsListener.2=İçeriÄŸi panoya kopyala -MissingPlotsListener.3=Tüm verilerin doldurulup doldurulmadığını öğrenmek istediÄŸiniz plot bilgilerini (.csv veya .ced dosyaları) içeren dosyaları seçin. -MissingPlotsListener.4=Eksik plotlar - Bilgi -MissingPlotsListener.5=Dosyadan \: -MissingPlotsListener.6=CED dosyasına aktar -ProcessMonitorDialog.1=Satır numarasında ayrıştırma hatası -ProcessMonitorDialog.4=, sütunlar -ProcessMonitorDialog.5=\ -- deÄŸerler - -ImportXMLDialogProcessMonitor.1 = Verilerin üzerine yaz -ImportXMLDialogProcessMonitor.2 = Sadece yinelenmeyen plotları içe aktar - -YES=Evet -YES_TO_ALL=Tümüne evet -NO=Hayır -NO_TO_ALL=Tümüne hayır - -CollectEarthMenu.0=CEP dosyasını içe aktar -CollectEarthMenu.2=Hizmetler -CollectEarthMenu.3=Büyük CSV plot dosyalarını böl -CollectEarthMenu.4=Verileri XML'e aktar (belirli bir tarihten itibaren) -CollectEarthMenu.5=Collect yedeÄŸi için dışa aktar -CollectEarthMenu.6=Collect Backup verilerini dışa aktar (tüm veriler) -CollectEarthMenu.7=Collect Backup verilerini dışa aktar (belirli bir tarihten itibaren) -CollectEarthMenu.8=Verileri XML'e aktar (özet özniteliÄŸine göre filtrele) \ No newline at end of file +SaikuAnalysisListener.0=Yes - Làm má»›i lại dữ liệu Saiku (quá trình dài) +SaikuAnalysisListener.1=No - chỉ khởi động Saiku +SaikuStarter.1=Khởi động Saiku +SaikuStarter.2=Cần vài phút để khởi động Saiku, xin đợi\! +SaveEarthDataServlet.0=Yêu cầu trống +SaveEarthDataServlet.1=Có trục trặc khi ghi dữ liệu vào CSDL +SaveEarthDataServlet.2=Dữ liệu đã được ghi +SlopeCode.0=Bằng phẳng (0-5) +EarthApp.11=Collect Earth Ä‘ang chạy +EarthApp.21=Không tìm thấy file chứa lưới ô trong đưá»ng dẫn đã chá»n \:
+EarthApp.23=Chưa thiết lập file CSV/CED \:

+EarthApp.24=Không tìm thấy file chứa Freemarker template vá»›i định nghÄ©a KML trong đưá»ng dẫn đã chá»n\:
+EarthApp.26=Chưa thiết lập file định nghĩa KML d\:

+EarthApp.27=Không tìm thấy file chứa mẫu HTML balloon trong đưá»ng dẫn đã chá»n\:
+EarthApp.29=Chưa thiết lập file HTML balloon \:

+EarthApp.3=Nhắc nhở sau +EarthApp.30=Xin hãy Ä‘iá»u chỉnh đúng địa chỉ file trong Tools->Properties menu. +EarthApp.4=Cập nhật luôn +EarthApp.5=Không nhắc nữa +EarthApp.57=Äã có phiên bản má»›i cá»§a Collect Earth\!
Bạn muốn làm tiếp như thế nào? +EarthApp.58=Thông báo cập nhật +EarthApp.59=Lỗi khi nhập file project +EarthApp.6=\ - Phiên bản +EarthApp.61=Không mở được file Collect Earth.
Äá» nghị đảm bảo đã cài đặt Google Earth. +EarthSurveyService.9=Trưá»ng bắt buá»™c +ExportActionListener.1=Chá»n ngày xuất bản ghi +ExportDialogProcessMonitor.0=Äang xá»­ lý dữ liệu... +ExportDialogProcessMonitor.1=Äang đợi khởi động quá trình\: +ExportDialogProcessMonitor.4=Các bản ghi đã xuất\: +ImportProcessMonitorDialog.0=Các bản ghi đã nhập\: +ImportActionListener.0=Có nhập dữ liệu các ô chưa được Ä‘iá»n đầy đủ không? +ImportActionListener.2=Nếu bạn chá»n NO sẽ chỉ nhập dữ liệu cá»§a các ô có trạng thái màu "xanh lá cây", các ô đã có đầy đủ dữ liệu. +ImportActionListener.3=Nhập các bản ghi chưa hoàn tất +ImportDialogProcessMonitor.0=\ ÄANG TÃNH TOÃN +ImportDialogProcessMonitor.11=Số lượng ban đầu các bản ghi\: +ImportDialogProcessMonitor.2=Äang nhập các bản ghi... +ImportDialogProcessMonitor.5=Số lượng thá»±c tế các bản ghi đã nhập\: +ImportDialogProcessMonitor.8=Äang xá»­ lý dữ liệu... +InfiniteProgressMonitor.0=Há»§y lệnh +JFileChooserExistsAware.0=File project cá»§a Collect Earth +KmlImportService.13=Chá»n file CSV file để ghi địa Ä‘iểm cá»§a ô vào +MissingPlotsListener.0=Lá»—i khi lấy thông tin vỠô không có trong CSDL +MissingPlotsListener.1=Các ô thiếu +MissingPlotsListener.10=Tổng số ô trong thiết kế chá»n mẫu \: +MissingPlotsListener.12=Số ô thiếu\: +MissingPlotsListener.14=Äã Ä‘iá»n tất cả các ô\! +MissingPlotsListener.2=Sao chép ná»™i dung vào bàn phím +MissingPlotsListener.3=Lá»±a chá»n file có chứa thông tin ô ( file .csv hoặc .ced ) mà bạn muốn biết đã Ä‘iá»n đủ dữ liệu chưa. +MissingPlotsListener.4=Các ô thiếu - thông tin +MissingPlotsListener.5=Từ file \: +MissingPlotsListener.6=Xuất ra file CED +ProcessMonitorDialog.1=Tìm lá»—i trên số dòng +ProcessMonitorDialog.4=, cá»™t +ProcessMonitorDialog.5=\ -- giá trị From c0ea4b413c941908325e44ab8a82658c628a3d81 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:35:15 +0100 Subject: [PATCH 0778/1620] New translations utf8_orig_Messages_hi.properties (French) --- .../earth/app/view/Messages_fr.properties | 446 +++++++++--------- 1 file changed, 225 insertions(+), 221 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 5110140e9c..f0355142d0 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,221 +1,225 @@ -AboutDialog.19=Äã có lá»—i -AboutDialog.5=Truy cập website cá»§a chúng tôi để biết thêm thông tin OpenForis.org -AboutDialog.6=Xin lá»—i, đã có sá»± cố khi mở link trong brower chuẩn trong hệ thống cá»§a bạn. -AboutDialog.8=Ok -AspectCode.0=Bắc -AspectCode.1=Äông-Bắc -AspectCode.2=Äông -AspectCode.3=Äông-Nam -AspectCode.4=Nam -AspectCode.5=Tây-Nam -AspectCode.6=Tây -AspectCode.7=Tây-Bắc -CollectEarthWindow.0=Lá»—i khi xuất dữ liệu sang file CSV -CollectEarthWindow.1=Lá»—i xuất dữ liệu -CollectEarthWindow.10=File -CollectEarthWindow.11=Thoát -CollectEarthWindow.12=Công cụ -CollectEarthWindow.13=Xuất dữ liệu ra CSV -CollectEarthWindow.14=Khởi động SAIKU Analysis -CollectEarthWindow.15=Thuá»™c tính -CollectEarthWindow.16=Trợ giúp -CollectEarthWindow.17=Thông tin công bố -CollectEarthWindow.18=Tìm ô thiếu trong cÆ¡ sở dữ liệu -CollectEarthWindow.19=Collect Earth -CollectEarthWindow.2=Ngôn ngữ -CollectEarthWindow.20=Số bản ghi trùng\: -CollectEarthWindow.21=Không tìm thấy biểu tượng cho khung chính -CollectEarthWindow.22=Bạn có chắc là muốn đóng Collect Earth?
Äóng cá»­a sổ cÅ©ng đóng luôn máy chá»§ Collect Earth -CollectEarthWindow.23=Cần khẳng định -CollectEarthWindow.24=Xuất ra XML -CollectEarthWindow.25=Bạn có muốn thêm các bản ghi này và bá» Ä‘i dữ liệu hiện thá»i không? -CollectEarthWindow.26=Ngưá»i sá»­ dụng -CollectEarthWindow.27=Cập nhật -CollectEarthWindow.28=Máy chá»§ Open Foris Collect Earth phải chạy khi ngưá»i sá»­ dụng giải Ä‘oán dữ liệu. -CollectEarthWindow.29=Chưa xác định cấu hình cho Máy chá»§ Saiku. -CollectEarthWindow.3=\ Lá»—i nhập -CollectEarthWindow.30=Äể mở cá»­a sổ này khi Ä‘ang sá»­ dụng Google Earth. -CollectEarthWindow.31=Xuất dữ liệu đã thu thập sang file CSV -CollectEarthWindow.32=Thoát -CollectEarthWindow.33=Tên ngưá»i sá»­ dụng phải dài hÆ¡n 5 chữ cái và ngắn hÆ¡n 50 chữ cái -CollectEarthWindow.34=Lá»—i kiểm chứng -CollectEarthWindow.35=TÊN NGƯỜI SỬ DỤNG CÃ’N TRá»NG\!
Hãy Ä‘iá»n tên ngưá»i sá»­ dụng và nhắp phím "Update". -CollectEarthWindow.36=Không được để trống phần tên ngưá»i sá»­ dụng -CollectEarthWindow.37=Äể mở -CollectEarthWindow.38=file CSV -CollectEarthWindow.39=THÔNG BÃO\: Nên lưu dá»± phòng dữ liệu hiện thá»i(Xuất ra XML) trước khi nhập dữ liệu má»›i -CollectEarthWindow.4=Thông tin công bố cá»§a FAO -CollectEarthWindow.40=Thiết lập đưá»ng dẫn tá»›i thư mục cài đặt Saiku Server trong Tools->Properties->Advanced tab. -CollectEarthWindow.41=Ghi dữ liệu xuất ra vào file\: -CollectEarthWindow.42=Thoát -CollectEarthWindow.43=Tìm thấy bản ghi có mâu thuẫn -CollectEarthWindow.44=Nhập/Xuất dữ liệu -CollectEarthWindow.45=Xuất dữ liệu ra XML (nén) -CollectEarthWindow.46=Nhập dữ liệu má»›i từ file ZIP (XML nén) -CollectEarthWindow.55=Cập nhật các bản ghi hiện thá»i bằng CSV -CollectEarthWindow.47=Chưa định cấu hình cho Saiku Server -CollectEarthWindow.48=Zip/collect-data files -CollectEarthWindow.49=Files CSV tổng hợp -CollectEarthWindow.5=Äóng -CollectEarthWindow.50=Mở hướng dẫn ngưá»i sá»­ dụng -CollectEarthWindow.51=Kiểm tra cập nhật cá»§a Collect Earth -CollectEarthWindow.52=Mở file nhật ký ứng dụng -CollectEarthWindow.53=File nhật ký cá»§a Collect Earth -CollectEarthWindow.54=Nạp các Ä‘iểm từ KML -CollectEarthWindow.56=Vá»... -CollectEarthWindow.57=Äang chạy quá trình khởi động Saiku, xin đợi. -CollectEarthWindow.58=Không thể khởi động Saiku analysis -CollectEarthWindow.59=Bạn có muốn tạo lại bá»™ dữ liệu cho Saiku analysis không?
Quá trình này sẽ mất một vài phút.
Nếu bạn chá»n "YES" sẽ tạo ra má»™t bá»™ dữ liệu má»›i vá»›i các thông tin cập nhật nhất. -CollectEarthWindow.6=Xuất ra bảng tổng hợp -CollectEarthWindow.60=Tạo dữ liệu Saiku -CollectEarthWindow.61=Xuất dữ liệu ra XML (các bản ghi chỉnh sá»­a từ lần xuất trước) -CollectEarthWindow.62=Vá»... -CollectEarthWindow.63=Lá»—i khi nạp Ä‘iểm từ KML -CollectEarthWindow.64=Há»— trợ kỹ thuật -CollectEarthWindow.7=Lá»—i khi nhập dữ liệu -CollectEarthWindow.8=Không tìm thấy văn bản thông báo -CollectEarthWindow.9=Dữ liệu nhập vào có chứa các bản ghi đã có trong cÆ¡ sở dữ liệu cá»§a bạn. -DynamicsCode.0=Ban đầu là rừng -DynamicsCode.1=Ban đầu là trảng cá» -DynamicsCode.2=Ban đầu là khu dân cư -DynamicsCode.3=Ban đầu là đất khác -DynamicsCode.4=Ban đầu là đất ngập nước -DynamicsCode.5=Ban đầu là đất trồng trá»t -OpenTextFileListener.0=không tìm thấy file văn bản tại\: -OptionWizard.0=Các lá»±a chá»n cá»§a Collect Earth -OptionWizard.1=Chá»n Browser -OptionWizard.10=Mở thư mục lưu dá»± phòng -OptionWizard.11=Không biết\: hãy sá»­ dụng ifconfig -OptionWizard.12=Vi dụ cá»§a khác -OptionWizard.13=Äịa chỉ IP cá»§a máy chá»§ Collect Earth -OptionWizard.14=Cổng máy chá»§ Collect Earth (vd\: 8023) -OptionWizard.15=Ghi và áo dụng thay đổi -OptionWizard.16=ID -OptionWizard.17=Tá»a độ X -OptionWizard.18=Tá»a độ Y -OptionWizard.19=Äá»™ cao -OptionWizard.2=Dòng công tác (máy chá»§/khách) -OptionWizard.20=Ná»™i dung cá»§a Google Earth đã thay đổi.
Äá» nghị chấp nhận tải lại ná»™i dung khi Google Earth gợi ý. -OptionWizard.21=Cập nhật thành công -OptionWizard.22=Dốc -OptionWizard.23=Có lá»—i khi mở lại dữ liệu Google Earth -OptionWizard.24=Há»§y -OptionWizard.25=Mode vận hành -OptionWizard.26=NÆ¡i lưu cÆ¡ sở dữ liệu -OptionWizard.27=Äây không phải là thư mục Saiku (hiện không có file start-saiku.bat) -OptionWizard.28=Không nhận được máy chá»§ Saiku -OptionWizard.29=Cổng cÆ¡ sở dữ liệu -OptionWizard.3=Ví dụ cá»§a máy chá»§ -OptionWizard.30=Các lá»±a chá»n cá»§a SQLite -OptionWizard.31=Dữ liệu mẫu -OptionWizard.32=SÆ¡ đồ mẫu -OptionWizard.33=Äịnh nghÄ©a khảo sát -OptionWizard.34=Nâng cao -OptionWizard.35=Số Ä‘iểm mẫu -OptionWizard.36=Khoảng cách giữa các Ä‘iểm mẫu (tính theo mét) -OptionWizard.37=Lá» vá»›i biên ô (tính theo mét) -OptionWizard.38=Không Ä‘á»c được đúng file CSV/CED.
Cần có dấu phảy để phân tách giá trị giống như sau \:
-OptionWizard.39=ID,Tá»a độ Y,tá»a độ X,độ cao,độ dốc,tá»· lệ -OptionWizard.4=Äịa chỉ IP hiện tại cá»§a máy tính\: -OptionWizard.40=Các project -OptionWizard.41=tải file project má»›i -OptionWizard.42=Lá»—i khi đóng CSV reader -OptionWizard.43=Tên khảo sát -OptionWizard.44=tá»± động lưu dá»± phòng dữ liệu tại -OptionWizard.45=Mở Earth Engine để phóng to vào khu vá»±c ô -OptionWizard.46=Mở Earth Engine timelapse cho khu vá»±c ô -OptionWizard.47=Mở Bing Maps cho khu vá»±c ô -OptionWizard.48=Mở form trên browser thay vì mở Google Earth (khuyến cáo cho LINUX) -OptionWizard.49=ÄÆ°á»ng dẫn tá»›i file ced/csv file vá»›i dữ liệu ô -OptionWizard.5=Cổng máy chá»§ Collect Earth\: -OptionWizard.50=Browse... -OptionWizard.51=Lá»—i nhập file project -OptionWizard.52=File CSV/CED chỉ có tá»a độ -OptionWizard.53=Ô vuông -OptionWizard.54=Äiểm trung tâm -OptionWizard.55=Lá»—i khi nhập thư mục project -OptionWizard.56=Tải project -OptionWizard.57=Các project đã tải -OptionWizard.58=Mở GEE Code Editor (cần phải có quyá»n truy cập Trusted Tester) -OptionWizard.59=Mở Here Maps tập trung vào ô -OptionWizard.6=Các thông số cá»§a CSDL PostgreSQL -OptionWizard.65=ÄÆ°á»ng dẫn tá»›i thư mục Saiku -OptionWizard.66=Browse... -OptionWizard.67=ÄÆ°á»ng dẫn tá»›i Firefox executable (file exe) -OptionWizard.68=Browse... -OptionWizard.7=Tên ngưá»i sá»­ dụng -OptionWizard.70=File chạy -OptionWizard.72=File nhị phân -OptionWizard.73=ÄÆ°á»ng dẫn tá»›i Chrome executable (file exe) -OptionWizard.74=Browse... -OptionWizard.76=File exe -OptionWizard.78=File nhị phân -OptionWizard.79=ÄÆ°á»ng dẫn tá»›i KML Freemarker template -OptionWizard.8=Mật khẩu -OptionWizard.80=Browse... -OptionWizard.82=Freemarker template -OptionWizard.83=ÄÆ°á»ng dẫn tá»›i mẫu thiết kế HTML Balloon -OptionWizard.84=Browse... -OptionWizard.86=HTML webpage -OptionWizard.87=ÄÆ°á»ng dẫn tá»›i XML vá»›i định nghÄ©a IDM -OptionWizard.88=Browse... -OptionWizard.9=Tên CSDL -OptionWizard.90=Äịnh nghÄ©a XML IDM -OptionWizard.91=Máy chá»§ (phiên bản quản lý hoặc sá»­ dụng độc lập) -OptionWizard.92=Khách (ngưá»i sá»­ dụng/kết nối vá»›i máy chá»§) -OptionWizard.93=SQLite (tích hợp/file đơn lẻ) -OptionWizard.94=PostgreSQL -SaikuAnalysisListener.0=Yes - Làm má»›i lại dữ liệu Saiku (quá trình dài) -SaikuAnalysisListener.1=No - chỉ khởi động Saiku -SaikuStarter.1=Khởi động Saiku -SaikuStarter.2=Cần vài phút để khởi động Saiku, xin đợi\! -SaveEarthDataServlet.0=Yêu cầu trống -SaveEarthDataServlet.1=Có trục trặc khi ghi dữ liệu vào CSDL -SaveEarthDataServlet.2=Dữ liệu đã được ghi -SlopeCode.0=Bằng phẳng (0-5) -EarthApp.11=Collect Earth Ä‘ang chạy -EarthApp.21=Không tìm thấy file chứa lưới ô trong đưá»ng dẫn đã chá»n \:
-EarthApp.23=Chưa thiết lập file CSV/CED \:

-EarthApp.24=Không tìm thấy file chứa Freemarker template vá»›i định nghÄ©a KML trong đưá»ng dẫn đã chá»n\:
-EarthApp.26=Chưa thiết lập file định nghĩa KML d\:

-EarthApp.27=Không tìm thấy file chứa mẫu HTML balloon trong đưá»ng dẫn đã chá»n\:
-EarthApp.29=Chưa thiết lập file HTML balloon \:

-EarthApp.3=Nhắc nhở sau -EarthApp.30=Xin hãy Ä‘iá»u chỉnh đúng địa chỉ file trong Tools->Properties menu. -EarthApp.4=Cập nhật luôn -EarthApp.5=Không nhắc nữa -EarthApp.57=Äã có phiên bản má»›i cá»§a Collect Earth\!
Bạn muốn làm tiếp như thế nào? -EarthApp.58=Thông báo cập nhật -EarthApp.59=Lỗi khi nhập file project -EarthApp.6=\ - Phiên bản -EarthApp.61=Không mở được file Collect Earth.
Äá» nghị đảm bảo đã cài đặt Google Earth. -EarthSurveyService.9=Trưá»ng bắt buá»™c -ExportActionListener.1=Chá»n ngày xuất bản ghi -ExportDialogProcessMonitor.0=Äang xá»­ lý dữ liệu... -ExportDialogProcessMonitor.1=Äang đợi khởi động quá trình\: -ExportDialogProcessMonitor.4=Các bản ghi đã xuất\: -ImportProcessMonitorDialog.0=Các bản ghi đã nhập\: -ImportActionListener.0=Có nhập dữ liệu các ô chưa được Ä‘iá»n đầy đủ không? -ImportActionListener.2=Nếu bạn chá»n NO sẽ chỉ nhập dữ liệu cá»§a các ô có trạng thái màu "xanh lá cây", các ô đã có đầy đủ dữ liệu. -ImportActionListener.3=Nhập các bản ghi chưa hoàn tất -ImportDialogProcessMonitor.0=\ ÄANG TÃNH TOÃN -ImportDialogProcessMonitor.11=Số lượng ban đầu các bản ghi\: -ImportDialogProcessMonitor.2=Äang nhập các bản ghi... -ImportDialogProcessMonitor.5=Số lượng thá»±c tế các bản ghi đã nhập\: -ImportDialogProcessMonitor.8=Äang xá»­ lý dữ liệu... -InfiniteProgressMonitor.0=Há»§y lệnh -JFileChooserExistsAware.0=File project cá»§a Collect Earth -KmlImportService.13=Chá»n file CSV file để ghi địa Ä‘iểm cá»§a ô vào -MissingPlotsListener.0=Lá»—i khi lấy thông tin vỠô không có trong CSDL -MissingPlotsListener.1=Các ô thiếu -MissingPlotsListener.10=Tổng số ô trong thiết kế chá»n mẫu \: -MissingPlotsListener.12=Số ô thiếu\: -MissingPlotsListener.14=Äã Ä‘iá»n tất cả các ô\! -MissingPlotsListener.2=Sao chép ná»™i dung vào bàn phím -MissingPlotsListener.3=Lá»±a chá»n file có chứa thông tin ô ( file .csv hoặc .ced ) mà bạn muốn biết đã Ä‘iá»n đủ dữ liệu chưa. -MissingPlotsListener.4=Các ô thiếu - thông tin -MissingPlotsListener.5=Từ file \: -MissingPlotsListener.6=Xuất ra file CED -ProcessMonitorDialog.1=Tìm lá»—i trên số dòng -ProcessMonitorDialog.4=, cá»™t -ProcessMonitorDialog.5=\ -- giá trị +AboutDialog.19=कोई समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ +AboutDialog.5=अधिक जानकारी के लिठहमारी वेबसाइट पर जाà¤? OpenForis.org? +AboutDialog.6=कà¥à¤·à¤®à¤¾ करें, à¤à¤• समसà¥à¤¯à¤¾ आपके सिसà¥à¤Ÿà¤® के मानक बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में इस लिंक को खोलने की कोशिश कर रही है. +AboutDialog.8=ठीक +AspectCode.0=उतà¥à¤¤à¤° दिशा +AspectCode.1=उतà¥à¤¤à¤°-पूरà¥à¤µ दिशा +AspectCode.2=पूरà¥à¤µ दिशा +AspectCode.3=दकà¥à¤·à¤¿à¤£-पूरà¥à¤µ दिशा +AspectCode.4=दकà¥à¤·à¤¿à¤£ दिशा +AspectCode.5=दकà¥à¤·à¤¿à¤£-पशà¥à¤šà¤¿à¤® दिशा +AspectCode.6=पशà¥à¤šà¤¿à¤® दिशा +AspectCode.7=उतà¥à¤¤à¤°-पशà¥à¤šà¤¿à¤® दिशा +CollectEarthWindow.0=तà¥à¤°à¥à¤Ÿà¤¿ जब सीà¤à¤¸à¤µà¥€ फ़ाइल में डेटा निरà¥à¤¯à¤¾à¤¤ करने का पà¥à¤°à¤¯à¤¾à¤¸ +CollectEarthWindow.1=निरà¥à¤¯à¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.10=फ़ाइल +CollectEarthWindow.11=बाहर जाà¤à¤‚ +CollectEarthWindow.12=उपकरण +CollectEarthWindow.13=डेटा सीà¤à¤¸à¤µà¥€ निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.14=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ +CollectEarthWindow.15=गà¥à¤£ +CollectEarthWindow.16=मदद +CollectEarthWindow.17=असà¥à¤µà¥€à¤•रण +CollectEarthWindow.18=डेटाबेस में लापता भूखंडों खोजें +CollectEarthWindow.19=पृथà¥à¤µà¥€ इकटà¥à¤ à¤¾ +CollectEarthWindow.2=भाषा +CollectEarthWindow.20=डà¥à¤ªà¥à¤²à¤¿à¤•ेट रिकॉरà¥à¤¡ की संखà¥à¤¯à¤¾\: +CollectEarthWindow.21=मà¥à¤–à¥à¤¯ फà¥à¤°à¥‡à¤® के लिठआइकन नहीं मिल सकता है +CollectEarthWindow.22=आपको लगता है कि आप à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ बंद करना चाहते हैं? विंडोज बंद करने से, à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° बंद हो जाà¤à¤—ा +CollectEarthWindow.23=पà¥à¤·à¥à¤Ÿà¤¿ की जरूरत है +CollectEarthWindow.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.25=आप वैसे भी इन अभिलेखों को जोड़ना चाहते हैं और अपने वरà¥à¤¤à¤®à¤¾à¤¨ डेटा खोने के लिठकिलक करना चाहते हैं? +CollectEarthWindow.26=ऑपरेटर,पà¥à¤°à¤šà¤¾à¤²à¤• +CollectEarthWindow.27=अदà¥à¤¯à¤¤à¤¨ +CollectEarthWindow.28= औपन फौरिस à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° चल रहा होना चाहिठ, जबभी ऑपरेटर डेटा की वà¥à¤¯à¤¾à¤–à¥à¤¯à¤¾ करें . +CollectEarthWindow.29=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. +CollectEarthWindow.3= आयात संबंधी तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.30=जबभी आप गà¥à¤—ल अरà¥à¤¥ का उपयोग कर रहे हैं, कृपया इस विंडोज को खà¥à¤²à¥€ बनाठरखें. +CollectEarthWindow.31=à¤à¤•तà¥à¤° डेटा सीà¤à¤¸à¤µà¥€ फाइल में भेजें +CollectEarthWindow.32=छोड़ना +CollectEarthWindow.33=ऑपरेटर का नाम के 5 अकà¥à¤·à¤° से बड़ा और 50 अकà¥à¤·à¤° से कम होना चाहिठ+CollectEarthWindow.34=मानà¥à¤¯à¤¤à¤¾ तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.35=ऑपरेटर नाम खाली\!
कृपया ऑपरेटर का नाम भरें और "अदà¥à¤¯à¤¤à¤¨" बटन दबाà¤à¤. +CollectEarthWindow.36=ऑपरेटर नाम रिकà¥à¤¤ नहीं हो सकता +CollectEarthWindow.37=खà¥à¤²à¤¾ रखो +CollectEarthWindow.38=सीà¤à¤¸à¤µà¥€ फ़ाइल +CollectEarthWindow.39=सूचना\: यह सलाह दी जाती है कि आप नठडेटा डालने करने से पहले अपने मौजूदा आंकडों को बैकअप(à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤) कर लें +CollectEarthWindow.4=à¤à¤«à¤à¤“ असà¥à¤µà¥€à¤•रण नोटिस +CollectEarthWindow.40=उस फ़ोलà¥à¤¡à¤° पर जाà¤à¤‚ जहां साà¤à¤•ॠसरà¥à¤µà¤° में सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ किया गया है, फ़ोलà¥à¤¡à¤° का रासà¥à¤¤à¤¾ उपकरण> गà¥à¤£> उनà¥à¤¨à¤¤ टैब. +CollectEarthWindow.41=निरà¥à¤¯à¤¾à¤¤ डेटा को फ़ाइल में बचाया जा रहा है \: +CollectEarthWindow.42=छोड़ना +CollectEarthWindow.43=परसà¥à¤ªà¤° विरोधी रिकॉरà¥à¤¡ पाया +CollectEarthWindow.44=डेटा आयात / निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.45=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ डेटा (संकà¥à¤šà¤¿à¤¤) +CollectEarthWindow.46=ज़िप से नठडेटा आयात करें (संकà¥à¤šà¤¿à¤¤ à¤à¤•à¥à¤¸à¤à¤®à¤à¤²) +CollectEarthWindow.55=सीà¤à¤¸à¤µà¥€ का उपयोग कर मौजूदा रिकॉरà¥à¤¡ को अपडेट करें +CollectEarthWindow.47=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. +CollectEarthWindow.48=ज़िप / à¤à¤•तà¥à¤°-डेटा फ़ाइल +CollectEarthWindow.49=फà¥à¤¯à¥‚जन सीà¤à¤¸à¤µà¥€ फ़ाइल +CollectEarthWindow.5=बंद करे +CollectEarthWindow.50= उपयोगकरà¥à¤¤à¤¾ मैनà¥à¤…ल खोलें +CollectEarthWindow.51=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ के अदà¥à¤¯à¤¤à¤¨ के लिठजाà¤à¤š करें +CollectEarthWindow.52= अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— लॉग फ़ाइल खोलें +CollectEarthWindow.53=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ लॉग फ़ाइल +CollectEarthWindow.54=केà¤à¤®à¤à¤² से लोड अंक +CollectEarthWindow.56=के विषय में... +CollectEarthWindow.57=साà¤à¤•ॠसà¥à¤Ÿà¤¾à¤°à¥à¤Ÿà¤° पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ अभी भी चल रहा है, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें. +CollectEarthWindow.58=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ नहीं कर सकते +CollectEarthWindow.59=आप साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ के लिठडेटा सेट फिर से उतà¥à¤ªà¤¨à¥à¤¨ करने के लिठकरना चाहते हैं?
यह पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ समय लेने वाली हो सकती है.
आप यदि "हाà¤"पर कà¥à¤²à¤¿à¤• करें, तो नवीनतम जानकारी के साथ à¤à¤• नया डाटासेट उतà¥à¤ªà¤¨à¥à¤¨ हो जाà¤à¤—ा. +CollectEarthWindow.6=फà¥à¤¯à¥‚जन टेबल के लिठनिरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.60=साà¤à¤•ॠडेटा उतà¥à¤ªà¤¨à¥à¤¨ +CollectEarthWindow.61=डेटा à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ (पिछले निरà¥à¤¯à¤¾à¤¤ के बाद से संशोधित रिकॉरà¥à¤¡) +CollectEarthWindow.62=के विषय मे... +CollectEarthWindow.63=केà¤à¤®à¤à¤² से अंक पà¥à¤°à¤¾à¤ªà¥à¤¤ करने में तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.64=तकनीकी सहायता +CollectEarthWindow.7=डेटा आयात में तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.8=असà¥à¤µà¥€à¤•रण पाठ नहीं पाया जा सका +CollectEarthWindow.9=डेटा आयात रिकॉरà¥à¤¡ वह है जो कि पहले से ही अपने डेटाबेस पर मौजूद हैं शामिल. +DynamicsCode.0=पà¥à¤°à¤¾à¤°à¤‚भ में वन +DynamicsCode.1=पà¥à¤°à¤¾à¤°à¤‚भ में घास का मैदान, +DynamicsCode.2=पà¥à¤°à¤¾à¤°à¤‚भ में आबादी वाला इलाका +DynamicsCode.3=पà¥à¤°à¤¾à¤°à¤‚भ में बंजर +DynamicsCode.4=पà¥à¤°à¤¾à¤°à¤‚भ में आरà¥à¤¦à¥à¤° भूमि +DynamicsCode.5=पà¥à¤°à¤¾à¤°à¤‚भ में खेत +OpenTextFileListener.0=इस पाठ का फ़ाइल नहीं मिला \: +OptionWizard.0= विकलà¥à¤ª +OptionWizard.1=बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° चà¥à¤¨à¥‡à¤‚ +OptionWizard.10=बैकअप फ़ोलà¥à¤¡à¤° खोलें +OptionWizard.11=अजà¥à¤žà¤¾à¤¤\: उपयोग ifconfig +OptionWizard.12=गà¥à¤°à¤¾à¤¹à¤•ों का उलà¥à¤²à¥‡à¤– +OptionWizard.13=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° आईपी +OptionWizard.14=कतà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ (उदाहरण- 8023) +OptionWizard.15=बचाà¤à¤‚ और परिवरà¥à¤¤à¤¨ लागू करें +OptionWizard.16=आईडी +OptionWizard.17=X- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क +OptionWizard.18=Y- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क +OptionWizard.19=उठान +OptionWizard.2=कारà¥à¤¯à¤ªà¥à¤°à¤µà¤¾à¤¹ (सरà¥à¤µà¤° / गà¥à¤°à¤¾à¤¹à¤•) +OptionWizard.20=गूगल अरà¥à¤¥ अंतरà¥à¤µà¤¸à¥à¤¤à¥ बदल दिया गया है
यदि गà¥à¤—ल अरà¥à¤¥ आप से कहे,अंतरà¥à¤µà¤¸à¥à¤¤à¥ पà¥à¤¨à¤ƒ लोड सà¥à¤µà¥€à¤•ार करें . +OptionWizard.21=अदà¥à¤¯à¤¤à¤¨ सफल +OptionWizard.22=ढाल +OptionWizard.23=गूगल अरà¥à¤¥ डेटा को फिर से खोलने में कोई तà¥à¤°à¥à¤Ÿà¤¿ थी +OptionWizard.24=रदà¥à¤¦ करना +OptionWizard.25=ऑपरेशन मोड +OptionWizard.26=डीबी होसà¥à¤Ÿ +OptionWizard.27=यह à¤à¤• मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ साà¤à¤•ॠफ़ोलà¥à¤¡à¤° नहीं है ( सà¥à¤Ÿà¤¾à¤°à¥à¤Ÿ-साà¤à¤•à¥.batफ़ाइल मौजूद नहीं है) +OptionWizard.28=साà¤à¤•ॠसरà¥à¤µà¤° मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ नहीं +OptionWizard.29=डीबी पोरà¥à¤Ÿ +OptionWizard.3=सरà¥à¤µà¤° आवृतà¥à¤¤à¤¿ +OptionWizard.30=à¤à¤¸à¤•à¥à¤¯à¥ लाइट विकलà¥à¤ª +OptionWizard.31=सेमà¥à¤ªà¤² डेटा +OptionWizard.32=पà¥à¤²à¥‰à¤Ÿ लेआउट +OptionWizard.33=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ परिभाषा +OptionWizard.34=विकसित +OptionWizard.35=सेमà¥à¤ªà¤² अंक की संखà¥à¤¯à¤¾ +OptionWizard.36=सेमà¥à¤ªà¤² बिंदॠके बीच दूरी (मीटर में) +OptionWizard.37=भूखंड की सीमा के साथ मारà¥à¤œà¤¿à¤¨ (मीटर मे) +OptionWizard.38=सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सही ढंग से पढ़ा नहीं जा सकता.
इस फ़ाइल में à¤à¤• अलà¥à¤ªà¤µà¤¿à¤°à¤¾à¤® से अलग मूलà¥à¤¯à¥‹à¤‚ की उमà¥à¤®à¥€à¤¦ है \:
+OptionWizard.39=आईडी, वाई समनà¥à¤µà¤¯, à¤à¤•à¥à¤¸ समनà¥à¤µà¤¯, ऊंचाई, ढाल, पहलू +OptionWizard.4=वरà¥à¤¤à¤®à¤¾à¤¨ कंपà¥à¤¯à¥‚टर आईपी \: +OptionWizard.40=परियोजनाà¤à¤‚ +OptionWizard.41=à¤à¤• नई परियोजना फ़ाइल लोड करें +OptionWizard.42=सीà¤à¤¸à¤µà¥€ पाठक को बंद करते समय तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.43=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ का नाम +OptionWizard.44= सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ बैकअप डेटाबेस +OptionWizard.45=ओपन पृथà¥à¤µà¥€ इंजन ने पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° में जूम किया +OptionWizard.46=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठपृथà¥à¤µà¥€ इंजन टाइमलैपà¥à¤¸ खोलें +OptionWizard.47=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठबिंग मैपà¥à¤¸ खोलें +OptionWizard.48=बजाय गूगल अरà¥à¤¥ के फॉरà¥à¤® à¤à¤• बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° पर खोलें (लिनकà¥à¤¸ के लिठसिफारिश) +OptionWizard.49=भूखंड डेटा के साथ सीईडी / सीà¤à¤¸à¤µà¥€ फाइल भेजने के लिठपथ +OptionWizard.5=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ\: +OptionWizard.50=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.51=परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.52=केवल निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क के साथ सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल +OptionWizard.53=चौकोर +OptionWizard.54=केनà¥à¤¦à¥à¤°à¥€à¤¯ बिनà¥à¤¦à¥ +OptionWizard.55=परियोजना फ़ोलà¥à¤¡à¤° आयात तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.56=लोड परियोजना +OptionWizard.57=पहले से लोड परियोजना +OptionWizard.58= जी ई ई का मैदान खोलें (विशà¥à¤µà¤¸à¤¨à¥€à¤¯ जांचकरà¥à¤¤à¤¾ के उपयोग की आवशà¥à¤¯à¤•ता है) +OptionWizard.59=यहां भूखंड पर केंदà¥à¤°à¤¿à¤¤ मैपà¥à¤¸ खोलें +OptionWizard.6=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² डीबी मापदंड +OptionWizard.65=साà¤à¤•à¥à¤«à¤¼à¥‹à¤²à¥à¤¡à¤° का पथ +OptionWizard.66=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.67=फ़ायरफ़ॉकà¥à¤¸ निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ +OptionWizard.68=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.7=उपयोगकरà¥à¤¤à¤¾ नाम +OptionWizard.70=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों +OptionWizard.72=बाइनरी फ़ाइलें +OptionWizard.73=कà¥à¤°à¥‹à¤® निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ +OptionWizard.74=बà¥à¤°à¤¾à¤‰à¤œ +OptionWizard.76=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों +OptionWizard.78=बाइनरी फ़ाइलें +OptionWizard.79=केà¤à¤®à¤à¤² फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ के लिठपथ +OptionWizard.8=पासवरà¥à¤¡ +OptionWizard.80=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.82=फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ +OptionWizard.83=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ पà¥à¤°à¤ªà¤¤à¥à¤° डिज़ाइन करने के लिठपथ +OptionWizard.84=बà¥à¤°à¤¾à¤‰à¤œ..... +OptionWizard.86=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² वेब पेज +OptionWizard.87=पथ आइडीà¤à¤® परिभाषा के साथ à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठ+OptionWizard.88=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.9=डीबी नाम +OptionWizard.90=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² आइडीà¤à¤® परिभाषा +OptionWizard.91=सरà¥à¤µà¤° (पà¥à¤°à¤¬à¤‚धक संसà¥à¤•रण या खड़े अकेले का उपयोग करें) +OptionWizard.92=कà¥à¤²à¤¾à¤‡à¤‚ट (ऑपरेटर / सरà¥à¤µà¤° से जà¥à¤¡à¤¼à¥‡) +OptionWizard.93=सकà¥à¤¯à¥‚à¤à¤²à¤¾à¤‡à¤Ÿ (à¤à¤‚बेडेड / à¤à¤•ल फाइल आधारित) +OptionWizard.94=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² +OptionWizard.95=सेमà¥à¤ªà¤² डॉटà¥à¤¸ के साइड (मीटर में) +SaikuAnalysisListener.0=हाठ- ताज़ा साà¤à¤•ॠडेटा (लंबी पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾) +SaikuAnalysisListener.1=नहीं - बस साà¤à¤•ॠशà¥à¤°à¥‚ +SaikuStarter.1=साà¤à¤•ॠशà¥à¤°à¥‚ +SaikuStarter.2= साà¤à¤•ॠशà¥à¤°à¥‚ कà¥à¤› मिनट लग सकते हैं, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें\! +SaveEarthDataServlet.0=खाली अनà¥à¤°à¥‹à¤§ +SaveEarthDataServlet.1= डेटाबेस में डेटा बचाते समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ है +SaveEarthDataServlet.2=डेटा बचाया था +SlopeCode.0=समतल (0-5) +EarthApp.11=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ पहले से ही चल रहा है +EarthApp.21=à¤à¤• सीà¤à¤¸à¤µà¥€ / सीईडी के रूप में भूखंडों की गà¥à¤°à¤¿à¤¡ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
+EarthApp.23=कोई सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सेट-अप नहीं किया गया है \:

+EarthApp.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² परिभाषा के साथ फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है \:
+EarthApp.26=कोई à¤à¤•à¥à¤¸à¤à¤®à¤à¤² फ़ाइल परिभाषा सेट अप नहीं किया गया है \:

+EarthApp.27=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ रूप से यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
+EarthApp.29=कोई à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ फ़ाइल सेट-अप नहीं किया गया है \:

+EarthApp.3=मà¥à¤à¥‡ बाद में याद दिलाना +EarthApp.30=उपकरण> गà¥à¤£ मेनू में फ़ाइल सà¥à¤¥à¤¾à¤¨ को ठीक करें . +EarthApp.4=अभी अदà¥à¤¯à¤¤à¤¨ करें +EarthApp.5=मà¥à¤à¥‡ दà¥à¤¬à¤¾à¤°à¤¾ याद मत दिलाना +EarthApp.57=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ का à¤à¤• नया संसà¥à¤•रण उपलबà¥à¤§ है\!
आप कैसे आगे बढ़ना चाहते हैं? +EarthApp.58=अदà¥à¤¯à¤¤à¤¨ चेतावनी +EarthApp.59= परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ +EarthApp.6=\ - संसà¥à¤•रण +EarthApp.61=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ फाइल खà¥à¤² नहीं सकती .
कृपया सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करें कि गूगल अरà¥à¤¥ सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ है. +EarthSurveyService.9=आवशà¥à¤¯à¤• कà¥à¤·à¥‡à¤¤à¥à¤° +ExportActionListener.1= तारीख चूनें जबसे रिकॉरà¥à¤¡ निरà¥à¤¯à¤¾à¤¤ करने है +ExportDialogProcessMonitor.0=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... +ExportDialogProcessMonitor.1=पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ पà¥à¤°à¤¾à¤°à¤‚भ करने के लिठपà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ कर रहा है \: +ExportDialogProcessMonitor.4=निरà¥à¤¯à¤¾à¤¤ रिकॉरà¥à¤¡\: +ImportProcessMonitorDialog.0=आयातित रिकॉरà¥à¤¡ \: +ImportActionListener.0=कà¥à¤¯à¤¾ उन भूखंडों के लिठडेटा जो कि पूरी तरह से भरे नहीं गठ,आयातित किया जाना चाहिà¤? +ImportActionListener.2=आप कà¥à¤²à¤¿à¤• करें, नहींतो केवल डेटा "हरी" राजà¥à¤¯ में भूखंडों से ,जिसमें सभी डेटा यà¥à¤•à¥à¤¤ है , आयात किया जाà¤à¤—ा। +ImportDialogProcessMonitor.0=\ गणना +ImportDialogProcessMonitor.11=रिकॉरà¥à¤¡ की पà¥à¤°à¤¾à¤°à¤‚भिक संखà¥à¤¯à¤¾ \: +ImportDialogProcessMonitor.2=रिकॉरà¥à¤¡ आयात... +ImportDialogProcessMonitor.5=आयातित रिकॉरà¥à¤¡ की वासà¥à¤¤à¤µà¤¿à¤• संखà¥à¤¯à¤¾ \: +ImportDialogProcessMonitor.8=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... +InfiniteProgressMonitor.0=रदà¥à¤¦ ऑपरेशन +JFileChooserExistsAware.0=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ परियोजना फ़ाइल +KmlImportService.13=पà¥à¤²à¥‰à¤Ÿ सà¥à¤¥à¤¾à¤¨à¥‹à¤‚ को बचाने के लिठà¤à¤• सीà¤à¤¸à¤µà¥€ फ़ाइल का चयन करें +MissingPlotsListener.0=तà¥à¤°à¥à¤Ÿà¤¿ उन भूखंडों के बारे में जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ करने के लिठजो डेटाबेस पर मौजूद नहीं +MissingPlotsListener.1=गà¥à¤® भूखंड +MissingPlotsListener.10=सेमà¥à¤ªà¤² डिजाइन में भूखंडों की कà¥à¤² संखà¥à¤¯à¤¾ \: +MissingPlotsListener.12=गà¥à¤® भूखंडों की संखà¥à¤¯à¤¾ \: +MissingPlotsListener.14=सभी भूखंडों भर रहे हैं\! +MissingPlotsListener.2=कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ अंतरà¥à¤µà¤¸à¥à¤¤à¥ की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ +MissingPlotsListener.3=भूखंड की जानकारी वाले फ़ाइलें चà¥à¤¨à¥‡à¤‚ ( .सीà¤à¤¸à¤µà¥€ या .सीईडी फ़ाइलें ) जिसके लिठआप जानना चाहते हैं तो सभी डेटा भर दिया गया है चाहता हूà¤. +MissingPlotsListener.4=गà¥à¤® भूखंड- जानकारी +MissingPlotsListener.5=फ़ाइल से \: +MissingPlotsListener.6=सीà¤à¤¡à¥€ फ़ाइल में निरà¥à¤¯à¤¾à¤¤ करें +ProcessMonitorDialog.1=पंकà¥à¤¤à¤¿ संखà¥à¤¯à¤¾ पर तà¥à¤°à¥à¤Ÿà¤¿ +ProcessMonitorDialog.4=, कॉलम +ProcessMonitorDialog.5=\ --मूलà¥à¤¯ +YES= हां +YES_TO_ALL=सब को हां +NO=नहीं +NO_TO_ALL=सभी को नहीं From 1b92465cbb6d71c0615a5281237154f2b4e8691a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:35:16 +0100 Subject: [PATCH 0779/1620] New translations utf8_orig_Messages_hi.properties (Spanish) --- .../earth/app/view/Messages_es.properties | 446 +++++++++--------- 1 file changed, 225 insertions(+), 221 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 5110140e9c..f0355142d0 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,221 +1,225 @@ -AboutDialog.19=Äã có lá»—i -AboutDialog.5=Truy cập website cá»§a chúng tôi để biết thêm thông tin OpenForis.org -AboutDialog.6=Xin lá»—i, đã có sá»± cố khi mở link trong brower chuẩn trong hệ thống cá»§a bạn. -AboutDialog.8=Ok -AspectCode.0=Bắc -AspectCode.1=Äông-Bắc -AspectCode.2=Äông -AspectCode.3=Äông-Nam -AspectCode.4=Nam -AspectCode.5=Tây-Nam -AspectCode.6=Tây -AspectCode.7=Tây-Bắc -CollectEarthWindow.0=Lá»—i khi xuất dữ liệu sang file CSV -CollectEarthWindow.1=Lá»—i xuất dữ liệu -CollectEarthWindow.10=File -CollectEarthWindow.11=Thoát -CollectEarthWindow.12=Công cụ -CollectEarthWindow.13=Xuất dữ liệu ra CSV -CollectEarthWindow.14=Khởi động SAIKU Analysis -CollectEarthWindow.15=Thuá»™c tính -CollectEarthWindow.16=Trợ giúp -CollectEarthWindow.17=Thông tin công bố -CollectEarthWindow.18=Tìm ô thiếu trong cÆ¡ sở dữ liệu -CollectEarthWindow.19=Collect Earth -CollectEarthWindow.2=Ngôn ngữ -CollectEarthWindow.20=Số bản ghi trùng\: -CollectEarthWindow.21=Không tìm thấy biểu tượng cho khung chính -CollectEarthWindow.22=Bạn có chắc là muốn đóng Collect Earth?
Äóng cá»­a sổ cÅ©ng đóng luôn máy chá»§ Collect Earth -CollectEarthWindow.23=Cần khẳng định -CollectEarthWindow.24=Xuất ra XML -CollectEarthWindow.25=Bạn có muốn thêm các bản ghi này và bá» Ä‘i dữ liệu hiện thá»i không? -CollectEarthWindow.26=Ngưá»i sá»­ dụng -CollectEarthWindow.27=Cập nhật -CollectEarthWindow.28=Máy chá»§ Open Foris Collect Earth phải chạy khi ngưá»i sá»­ dụng giải Ä‘oán dữ liệu. -CollectEarthWindow.29=Chưa xác định cấu hình cho Máy chá»§ Saiku. -CollectEarthWindow.3=\ Lá»—i nhập -CollectEarthWindow.30=Äể mở cá»­a sổ này khi Ä‘ang sá»­ dụng Google Earth. -CollectEarthWindow.31=Xuất dữ liệu đã thu thập sang file CSV -CollectEarthWindow.32=Thoát -CollectEarthWindow.33=Tên ngưá»i sá»­ dụng phải dài hÆ¡n 5 chữ cái và ngắn hÆ¡n 50 chữ cái -CollectEarthWindow.34=Lá»—i kiểm chứng -CollectEarthWindow.35=TÊN NGƯỜI SỬ DỤNG CÃ’N TRá»NG\!
Hãy Ä‘iá»n tên ngưá»i sá»­ dụng và nhắp phím "Update". -CollectEarthWindow.36=Không được để trống phần tên ngưá»i sá»­ dụng -CollectEarthWindow.37=Äể mở -CollectEarthWindow.38=file CSV -CollectEarthWindow.39=THÔNG BÃO\: Nên lưu dá»± phòng dữ liệu hiện thá»i(Xuất ra XML) trước khi nhập dữ liệu má»›i -CollectEarthWindow.4=Thông tin công bố cá»§a FAO -CollectEarthWindow.40=Thiết lập đưá»ng dẫn tá»›i thư mục cài đặt Saiku Server trong Tools->Properties->Advanced tab. -CollectEarthWindow.41=Ghi dữ liệu xuất ra vào file\: -CollectEarthWindow.42=Thoát -CollectEarthWindow.43=Tìm thấy bản ghi có mâu thuẫn -CollectEarthWindow.44=Nhập/Xuất dữ liệu -CollectEarthWindow.45=Xuất dữ liệu ra XML (nén) -CollectEarthWindow.46=Nhập dữ liệu má»›i từ file ZIP (XML nén) -CollectEarthWindow.55=Cập nhật các bản ghi hiện thá»i bằng CSV -CollectEarthWindow.47=Chưa định cấu hình cho Saiku Server -CollectEarthWindow.48=Zip/collect-data files -CollectEarthWindow.49=Files CSV tổng hợp -CollectEarthWindow.5=Äóng -CollectEarthWindow.50=Mở hướng dẫn ngưá»i sá»­ dụng -CollectEarthWindow.51=Kiểm tra cập nhật cá»§a Collect Earth -CollectEarthWindow.52=Mở file nhật ký ứng dụng -CollectEarthWindow.53=File nhật ký cá»§a Collect Earth -CollectEarthWindow.54=Nạp các Ä‘iểm từ KML -CollectEarthWindow.56=Vá»... -CollectEarthWindow.57=Äang chạy quá trình khởi động Saiku, xin đợi. -CollectEarthWindow.58=Không thể khởi động Saiku analysis -CollectEarthWindow.59=Bạn có muốn tạo lại bá»™ dữ liệu cho Saiku analysis không?
Quá trình này sẽ mất một vài phút.
Nếu bạn chá»n "YES" sẽ tạo ra má»™t bá»™ dữ liệu má»›i vá»›i các thông tin cập nhật nhất. -CollectEarthWindow.6=Xuất ra bảng tổng hợp -CollectEarthWindow.60=Tạo dữ liệu Saiku -CollectEarthWindow.61=Xuất dữ liệu ra XML (các bản ghi chỉnh sá»­a từ lần xuất trước) -CollectEarthWindow.62=Vá»... -CollectEarthWindow.63=Lá»—i khi nạp Ä‘iểm từ KML -CollectEarthWindow.64=Há»— trợ kỹ thuật -CollectEarthWindow.7=Lá»—i khi nhập dữ liệu -CollectEarthWindow.8=Không tìm thấy văn bản thông báo -CollectEarthWindow.9=Dữ liệu nhập vào có chứa các bản ghi đã có trong cÆ¡ sở dữ liệu cá»§a bạn. -DynamicsCode.0=Ban đầu là rừng -DynamicsCode.1=Ban đầu là trảng cá» -DynamicsCode.2=Ban đầu là khu dân cư -DynamicsCode.3=Ban đầu là đất khác -DynamicsCode.4=Ban đầu là đất ngập nước -DynamicsCode.5=Ban đầu là đất trồng trá»t -OpenTextFileListener.0=không tìm thấy file văn bản tại\: -OptionWizard.0=Các lá»±a chá»n cá»§a Collect Earth -OptionWizard.1=Chá»n Browser -OptionWizard.10=Mở thư mục lưu dá»± phòng -OptionWizard.11=Không biết\: hãy sá»­ dụng ifconfig -OptionWizard.12=Vi dụ cá»§a khác -OptionWizard.13=Äịa chỉ IP cá»§a máy chá»§ Collect Earth -OptionWizard.14=Cổng máy chá»§ Collect Earth (vd\: 8023) -OptionWizard.15=Ghi và áo dụng thay đổi -OptionWizard.16=ID -OptionWizard.17=Tá»a độ X -OptionWizard.18=Tá»a độ Y -OptionWizard.19=Äá»™ cao -OptionWizard.2=Dòng công tác (máy chá»§/khách) -OptionWizard.20=Ná»™i dung cá»§a Google Earth đã thay đổi.
Äá» nghị chấp nhận tải lại ná»™i dung khi Google Earth gợi ý. -OptionWizard.21=Cập nhật thành công -OptionWizard.22=Dốc -OptionWizard.23=Có lá»—i khi mở lại dữ liệu Google Earth -OptionWizard.24=Há»§y -OptionWizard.25=Mode vận hành -OptionWizard.26=NÆ¡i lưu cÆ¡ sở dữ liệu -OptionWizard.27=Äây không phải là thư mục Saiku (hiện không có file start-saiku.bat) -OptionWizard.28=Không nhận được máy chá»§ Saiku -OptionWizard.29=Cổng cÆ¡ sở dữ liệu -OptionWizard.3=Ví dụ cá»§a máy chá»§ -OptionWizard.30=Các lá»±a chá»n cá»§a SQLite -OptionWizard.31=Dữ liệu mẫu -OptionWizard.32=SÆ¡ đồ mẫu -OptionWizard.33=Äịnh nghÄ©a khảo sát -OptionWizard.34=Nâng cao -OptionWizard.35=Số Ä‘iểm mẫu -OptionWizard.36=Khoảng cách giữa các Ä‘iểm mẫu (tính theo mét) -OptionWizard.37=Lá» vá»›i biên ô (tính theo mét) -OptionWizard.38=Không Ä‘á»c được đúng file CSV/CED.
Cần có dấu phảy để phân tách giá trị giống như sau \:
-OptionWizard.39=ID,Tá»a độ Y,tá»a độ X,độ cao,độ dốc,tá»· lệ -OptionWizard.4=Äịa chỉ IP hiện tại cá»§a máy tính\: -OptionWizard.40=Các project -OptionWizard.41=tải file project má»›i -OptionWizard.42=Lá»—i khi đóng CSV reader -OptionWizard.43=Tên khảo sát -OptionWizard.44=tá»± động lưu dá»± phòng dữ liệu tại -OptionWizard.45=Mở Earth Engine để phóng to vào khu vá»±c ô -OptionWizard.46=Mở Earth Engine timelapse cho khu vá»±c ô -OptionWizard.47=Mở Bing Maps cho khu vá»±c ô -OptionWizard.48=Mở form trên browser thay vì mở Google Earth (khuyến cáo cho LINUX) -OptionWizard.49=ÄÆ°á»ng dẫn tá»›i file ced/csv file vá»›i dữ liệu ô -OptionWizard.5=Cổng máy chá»§ Collect Earth\: -OptionWizard.50=Browse... -OptionWizard.51=Lá»—i nhập file project -OptionWizard.52=File CSV/CED chỉ có tá»a độ -OptionWizard.53=Ô vuông -OptionWizard.54=Äiểm trung tâm -OptionWizard.55=Lá»—i khi nhập thư mục project -OptionWizard.56=Tải project -OptionWizard.57=Các project đã tải -OptionWizard.58=Mở GEE Code Editor (cần phải có quyá»n truy cập Trusted Tester) -OptionWizard.59=Mở Here Maps tập trung vào ô -OptionWizard.6=Các thông số cá»§a CSDL PostgreSQL -OptionWizard.65=ÄÆ°á»ng dẫn tá»›i thư mục Saiku -OptionWizard.66=Browse... -OptionWizard.67=ÄÆ°á»ng dẫn tá»›i Firefox executable (file exe) -OptionWizard.68=Browse... -OptionWizard.7=Tên ngưá»i sá»­ dụng -OptionWizard.70=File chạy -OptionWizard.72=File nhị phân -OptionWizard.73=ÄÆ°á»ng dẫn tá»›i Chrome executable (file exe) -OptionWizard.74=Browse... -OptionWizard.76=File exe -OptionWizard.78=File nhị phân -OptionWizard.79=ÄÆ°á»ng dẫn tá»›i KML Freemarker template -OptionWizard.8=Mật khẩu -OptionWizard.80=Browse... -OptionWizard.82=Freemarker template -OptionWizard.83=ÄÆ°á»ng dẫn tá»›i mẫu thiết kế HTML Balloon -OptionWizard.84=Browse... -OptionWizard.86=HTML webpage -OptionWizard.87=ÄÆ°á»ng dẫn tá»›i XML vá»›i định nghÄ©a IDM -OptionWizard.88=Browse... -OptionWizard.9=Tên CSDL -OptionWizard.90=Äịnh nghÄ©a XML IDM -OptionWizard.91=Máy chá»§ (phiên bản quản lý hoặc sá»­ dụng độc lập) -OptionWizard.92=Khách (ngưá»i sá»­ dụng/kết nối vá»›i máy chá»§) -OptionWizard.93=SQLite (tích hợp/file đơn lẻ) -OptionWizard.94=PostgreSQL -SaikuAnalysisListener.0=Yes - Làm má»›i lại dữ liệu Saiku (quá trình dài) -SaikuAnalysisListener.1=No - chỉ khởi động Saiku -SaikuStarter.1=Khởi động Saiku -SaikuStarter.2=Cần vài phút để khởi động Saiku, xin đợi\! -SaveEarthDataServlet.0=Yêu cầu trống -SaveEarthDataServlet.1=Có trục trặc khi ghi dữ liệu vào CSDL -SaveEarthDataServlet.2=Dữ liệu đã được ghi -SlopeCode.0=Bằng phẳng (0-5) -EarthApp.11=Collect Earth Ä‘ang chạy -EarthApp.21=Không tìm thấy file chứa lưới ô trong đưá»ng dẫn đã chá»n \:
-EarthApp.23=Chưa thiết lập file CSV/CED \:

-EarthApp.24=Không tìm thấy file chứa Freemarker template vá»›i định nghÄ©a KML trong đưá»ng dẫn đã chá»n\:
-EarthApp.26=Chưa thiết lập file định nghĩa KML d\:

-EarthApp.27=Không tìm thấy file chứa mẫu HTML balloon trong đưá»ng dẫn đã chá»n\:
-EarthApp.29=Chưa thiết lập file HTML balloon \:

-EarthApp.3=Nhắc nhở sau -EarthApp.30=Xin hãy Ä‘iá»u chỉnh đúng địa chỉ file trong Tools->Properties menu. -EarthApp.4=Cập nhật luôn -EarthApp.5=Không nhắc nữa -EarthApp.57=Äã có phiên bản má»›i cá»§a Collect Earth\!
Bạn muốn làm tiếp như thế nào? -EarthApp.58=Thông báo cập nhật -EarthApp.59=Lỗi khi nhập file project -EarthApp.6=\ - Phiên bản -EarthApp.61=Không mở được file Collect Earth.
Äá» nghị đảm bảo đã cài đặt Google Earth. -EarthSurveyService.9=Trưá»ng bắt buá»™c -ExportActionListener.1=Chá»n ngày xuất bản ghi -ExportDialogProcessMonitor.0=Äang xá»­ lý dữ liệu... -ExportDialogProcessMonitor.1=Äang đợi khởi động quá trình\: -ExportDialogProcessMonitor.4=Các bản ghi đã xuất\: -ImportProcessMonitorDialog.0=Các bản ghi đã nhập\: -ImportActionListener.0=Có nhập dữ liệu các ô chưa được Ä‘iá»n đầy đủ không? -ImportActionListener.2=Nếu bạn chá»n NO sẽ chỉ nhập dữ liệu cá»§a các ô có trạng thái màu "xanh lá cây", các ô đã có đầy đủ dữ liệu. -ImportActionListener.3=Nhập các bản ghi chưa hoàn tất -ImportDialogProcessMonitor.0=\ ÄANG TÃNH TOÃN -ImportDialogProcessMonitor.11=Số lượng ban đầu các bản ghi\: -ImportDialogProcessMonitor.2=Äang nhập các bản ghi... -ImportDialogProcessMonitor.5=Số lượng thá»±c tế các bản ghi đã nhập\: -ImportDialogProcessMonitor.8=Äang xá»­ lý dữ liệu... -InfiniteProgressMonitor.0=Há»§y lệnh -JFileChooserExistsAware.0=File project cá»§a Collect Earth -KmlImportService.13=Chá»n file CSV file để ghi địa Ä‘iểm cá»§a ô vào -MissingPlotsListener.0=Lá»—i khi lấy thông tin vỠô không có trong CSDL -MissingPlotsListener.1=Các ô thiếu -MissingPlotsListener.10=Tổng số ô trong thiết kế chá»n mẫu \: -MissingPlotsListener.12=Số ô thiếu\: -MissingPlotsListener.14=Äã Ä‘iá»n tất cả các ô\! -MissingPlotsListener.2=Sao chép ná»™i dung vào bàn phím -MissingPlotsListener.3=Lá»±a chá»n file có chứa thông tin ô ( file .csv hoặc .ced ) mà bạn muốn biết đã Ä‘iá»n đủ dữ liệu chưa. -MissingPlotsListener.4=Các ô thiếu - thông tin -MissingPlotsListener.5=Từ file \: -MissingPlotsListener.6=Xuất ra file CED -ProcessMonitorDialog.1=Tìm lá»—i trên số dòng -ProcessMonitorDialog.4=, cá»™t -ProcessMonitorDialog.5=\ -- giá trị +AboutDialog.19=कोई समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ +AboutDialog.5=अधिक जानकारी के लिठहमारी वेबसाइट पर जाà¤? OpenForis.org? +AboutDialog.6=कà¥à¤·à¤®à¤¾ करें, à¤à¤• समसà¥à¤¯à¤¾ आपके सिसà¥à¤Ÿà¤® के मानक बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में इस लिंक को खोलने की कोशिश कर रही है. +AboutDialog.8=ठीक +AspectCode.0=उतà¥à¤¤à¤° दिशा +AspectCode.1=उतà¥à¤¤à¤°-पूरà¥à¤µ दिशा +AspectCode.2=पूरà¥à¤µ दिशा +AspectCode.3=दकà¥à¤·à¤¿à¤£-पूरà¥à¤µ दिशा +AspectCode.4=दकà¥à¤·à¤¿à¤£ दिशा +AspectCode.5=दकà¥à¤·à¤¿à¤£-पशà¥à¤šà¤¿à¤® दिशा +AspectCode.6=पशà¥à¤šà¤¿à¤® दिशा +AspectCode.7=उतà¥à¤¤à¤°-पशà¥à¤šà¤¿à¤® दिशा +CollectEarthWindow.0=तà¥à¤°à¥à¤Ÿà¤¿ जब सीà¤à¤¸à¤µà¥€ फ़ाइल में डेटा निरà¥à¤¯à¤¾à¤¤ करने का पà¥à¤°à¤¯à¤¾à¤¸ +CollectEarthWindow.1=निरà¥à¤¯à¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.10=फ़ाइल +CollectEarthWindow.11=बाहर जाà¤à¤‚ +CollectEarthWindow.12=उपकरण +CollectEarthWindow.13=डेटा सीà¤à¤¸à¤µà¥€ निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.14=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ +CollectEarthWindow.15=गà¥à¤£ +CollectEarthWindow.16=मदद +CollectEarthWindow.17=असà¥à¤µà¥€à¤•रण +CollectEarthWindow.18=डेटाबेस में लापता भूखंडों खोजें +CollectEarthWindow.19=पृथà¥à¤µà¥€ इकटà¥à¤ à¤¾ +CollectEarthWindow.2=भाषा +CollectEarthWindow.20=डà¥à¤ªà¥à¤²à¤¿à¤•ेट रिकॉरà¥à¤¡ की संखà¥à¤¯à¤¾\: +CollectEarthWindow.21=मà¥à¤–à¥à¤¯ फà¥à¤°à¥‡à¤® के लिठआइकन नहीं मिल सकता है +CollectEarthWindow.22=आपको लगता है कि आप à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ बंद करना चाहते हैं? विंडोज बंद करने से, à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° बंद हो जाà¤à¤—ा +CollectEarthWindow.23=पà¥à¤·à¥à¤Ÿà¤¿ की जरूरत है +CollectEarthWindow.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.25=आप वैसे भी इन अभिलेखों को जोड़ना चाहते हैं और अपने वरà¥à¤¤à¤®à¤¾à¤¨ डेटा खोने के लिठकिलक करना चाहते हैं? +CollectEarthWindow.26=ऑपरेटर,पà¥à¤°à¤šà¤¾à¤²à¤• +CollectEarthWindow.27=अदà¥à¤¯à¤¤à¤¨ +CollectEarthWindow.28= औपन फौरिस à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° चल रहा होना चाहिठ, जबभी ऑपरेटर डेटा की वà¥à¤¯à¤¾à¤–à¥à¤¯à¤¾ करें . +CollectEarthWindow.29=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. +CollectEarthWindow.3= आयात संबंधी तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.30=जबभी आप गà¥à¤—ल अरà¥à¤¥ का उपयोग कर रहे हैं, कृपया इस विंडोज को खà¥à¤²à¥€ बनाठरखें. +CollectEarthWindow.31=à¤à¤•तà¥à¤° डेटा सीà¤à¤¸à¤µà¥€ फाइल में भेजें +CollectEarthWindow.32=छोड़ना +CollectEarthWindow.33=ऑपरेटर का नाम के 5 अकà¥à¤·à¤° से बड़ा और 50 अकà¥à¤·à¤° से कम होना चाहिठ+CollectEarthWindow.34=मानà¥à¤¯à¤¤à¤¾ तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.35=ऑपरेटर नाम खाली\!
कृपया ऑपरेटर का नाम भरें और "अदà¥à¤¯à¤¤à¤¨" बटन दबाà¤à¤. +CollectEarthWindow.36=ऑपरेटर नाम रिकà¥à¤¤ नहीं हो सकता +CollectEarthWindow.37=खà¥à¤²à¤¾ रखो +CollectEarthWindow.38=सीà¤à¤¸à¤µà¥€ फ़ाइल +CollectEarthWindow.39=सूचना\: यह सलाह दी जाती है कि आप नठडेटा डालने करने से पहले अपने मौजूदा आंकडों को बैकअप(à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤) कर लें +CollectEarthWindow.4=à¤à¤«à¤à¤“ असà¥à¤µà¥€à¤•रण नोटिस +CollectEarthWindow.40=उस फ़ोलà¥à¤¡à¤° पर जाà¤à¤‚ जहां साà¤à¤•ॠसरà¥à¤µà¤° में सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ किया गया है, फ़ोलà¥à¤¡à¤° का रासà¥à¤¤à¤¾ उपकरण> गà¥à¤£> उनà¥à¤¨à¤¤ टैब. +CollectEarthWindow.41=निरà¥à¤¯à¤¾à¤¤ डेटा को फ़ाइल में बचाया जा रहा है \: +CollectEarthWindow.42=छोड़ना +CollectEarthWindow.43=परसà¥à¤ªà¤° विरोधी रिकॉरà¥à¤¡ पाया +CollectEarthWindow.44=डेटा आयात / निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.45=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ डेटा (संकà¥à¤šà¤¿à¤¤) +CollectEarthWindow.46=ज़िप से नठडेटा आयात करें (संकà¥à¤šà¤¿à¤¤ à¤à¤•à¥à¤¸à¤à¤®à¤à¤²) +CollectEarthWindow.55=सीà¤à¤¸à¤µà¥€ का उपयोग कर मौजूदा रिकॉरà¥à¤¡ को अपडेट करें +CollectEarthWindow.47=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. +CollectEarthWindow.48=ज़िप / à¤à¤•तà¥à¤°-डेटा फ़ाइल +CollectEarthWindow.49=फà¥à¤¯à¥‚जन सीà¤à¤¸à¤µà¥€ फ़ाइल +CollectEarthWindow.5=बंद करे +CollectEarthWindow.50= उपयोगकरà¥à¤¤à¤¾ मैनà¥à¤…ल खोलें +CollectEarthWindow.51=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ के अदà¥à¤¯à¤¤à¤¨ के लिठजाà¤à¤š करें +CollectEarthWindow.52= अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— लॉग फ़ाइल खोलें +CollectEarthWindow.53=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ लॉग फ़ाइल +CollectEarthWindow.54=केà¤à¤®à¤à¤² से लोड अंक +CollectEarthWindow.56=के विषय में... +CollectEarthWindow.57=साà¤à¤•ॠसà¥à¤Ÿà¤¾à¤°à¥à¤Ÿà¤° पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ अभी भी चल रहा है, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें. +CollectEarthWindow.58=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ नहीं कर सकते +CollectEarthWindow.59=आप साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ के लिठडेटा सेट फिर से उतà¥à¤ªà¤¨à¥à¤¨ करने के लिठकरना चाहते हैं?
यह पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ समय लेने वाली हो सकती है.
आप यदि "हाà¤"पर कà¥à¤²à¤¿à¤• करें, तो नवीनतम जानकारी के साथ à¤à¤• नया डाटासेट उतà¥à¤ªà¤¨à¥à¤¨ हो जाà¤à¤—ा. +CollectEarthWindow.6=फà¥à¤¯à¥‚जन टेबल के लिठनिरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.60=साà¤à¤•ॠडेटा उतà¥à¤ªà¤¨à¥à¤¨ +CollectEarthWindow.61=डेटा à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ (पिछले निरà¥à¤¯à¤¾à¤¤ के बाद से संशोधित रिकॉरà¥à¤¡) +CollectEarthWindow.62=के विषय मे... +CollectEarthWindow.63=केà¤à¤®à¤à¤² से अंक पà¥à¤°à¤¾à¤ªà¥à¤¤ करने में तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.64=तकनीकी सहायता +CollectEarthWindow.7=डेटा आयात में तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.8=असà¥à¤µà¥€à¤•रण पाठ नहीं पाया जा सका +CollectEarthWindow.9=डेटा आयात रिकॉरà¥à¤¡ वह है जो कि पहले से ही अपने डेटाबेस पर मौजूद हैं शामिल. +DynamicsCode.0=पà¥à¤°à¤¾à¤°à¤‚भ में वन +DynamicsCode.1=पà¥à¤°à¤¾à¤°à¤‚भ में घास का मैदान, +DynamicsCode.2=पà¥à¤°à¤¾à¤°à¤‚भ में आबादी वाला इलाका +DynamicsCode.3=पà¥à¤°à¤¾à¤°à¤‚भ में बंजर +DynamicsCode.4=पà¥à¤°à¤¾à¤°à¤‚भ में आरà¥à¤¦à¥à¤° भूमि +DynamicsCode.5=पà¥à¤°à¤¾à¤°à¤‚भ में खेत +OpenTextFileListener.0=इस पाठ का फ़ाइल नहीं मिला \: +OptionWizard.0= विकलà¥à¤ª +OptionWizard.1=बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° चà¥à¤¨à¥‡à¤‚ +OptionWizard.10=बैकअप फ़ोलà¥à¤¡à¤° खोलें +OptionWizard.11=अजà¥à¤žà¤¾à¤¤\: उपयोग ifconfig +OptionWizard.12=गà¥à¤°à¤¾à¤¹à¤•ों का उलà¥à¤²à¥‡à¤– +OptionWizard.13=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° आईपी +OptionWizard.14=कतà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ (उदाहरण- 8023) +OptionWizard.15=बचाà¤à¤‚ और परिवरà¥à¤¤à¤¨ लागू करें +OptionWizard.16=आईडी +OptionWizard.17=X- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क +OptionWizard.18=Y- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क +OptionWizard.19=उठान +OptionWizard.2=कारà¥à¤¯à¤ªà¥à¤°à¤µà¤¾à¤¹ (सरà¥à¤µà¤° / गà¥à¤°à¤¾à¤¹à¤•) +OptionWizard.20=गूगल अरà¥à¤¥ अंतरà¥à¤µà¤¸à¥à¤¤à¥ बदल दिया गया है
यदि गà¥à¤—ल अरà¥à¤¥ आप से कहे,अंतरà¥à¤µà¤¸à¥à¤¤à¥ पà¥à¤¨à¤ƒ लोड सà¥à¤µà¥€à¤•ार करें . +OptionWizard.21=अदà¥à¤¯à¤¤à¤¨ सफल +OptionWizard.22=ढाल +OptionWizard.23=गूगल अरà¥à¤¥ डेटा को फिर से खोलने में कोई तà¥à¤°à¥à¤Ÿà¤¿ थी +OptionWizard.24=रदà¥à¤¦ करना +OptionWizard.25=ऑपरेशन मोड +OptionWizard.26=डीबी होसà¥à¤Ÿ +OptionWizard.27=यह à¤à¤• मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ साà¤à¤•ॠफ़ोलà¥à¤¡à¤° नहीं है ( सà¥à¤Ÿà¤¾à¤°à¥à¤Ÿ-साà¤à¤•à¥.batफ़ाइल मौजूद नहीं है) +OptionWizard.28=साà¤à¤•ॠसरà¥à¤µà¤° मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ नहीं +OptionWizard.29=डीबी पोरà¥à¤Ÿ +OptionWizard.3=सरà¥à¤µà¤° आवृतà¥à¤¤à¤¿ +OptionWizard.30=à¤à¤¸à¤•à¥à¤¯à¥ लाइट विकलà¥à¤ª +OptionWizard.31=सेमà¥à¤ªà¤² डेटा +OptionWizard.32=पà¥à¤²à¥‰à¤Ÿ लेआउट +OptionWizard.33=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ परिभाषा +OptionWizard.34=विकसित +OptionWizard.35=सेमà¥à¤ªà¤² अंक की संखà¥à¤¯à¤¾ +OptionWizard.36=सेमà¥à¤ªà¤² बिंदॠके बीच दूरी (मीटर में) +OptionWizard.37=भूखंड की सीमा के साथ मारà¥à¤œà¤¿à¤¨ (मीटर मे) +OptionWizard.38=सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सही ढंग से पढ़ा नहीं जा सकता.
इस फ़ाइल में à¤à¤• अलà¥à¤ªà¤µà¤¿à¤°à¤¾à¤® से अलग मूलà¥à¤¯à¥‹à¤‚ की उमà¥à¤®à¥€à¤¦ है \:
+OptionWizard.39=आईडी, वाई समनà¥à¤µà¤¯, à¤à¤•à¥à¤¸ समनà¥à¤µà¤¯, ऊंचाई, ढाल, पहलू +OptionWizard.4=वरà¥à¤¤à¤®à¤¾à¤¨ कंपà¥à¤¯à¥‚टर आईपी \: +OptionWizard.40=परियोजनाà¤à¤‚ +OptionWizard.41=à¤à¤• नई परियोजना फ़ाइल लोड करें +OptionWizard.42=सीà¤à¤¸à¤µà¥€ पाठक को बंद करते समय तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.43=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ का नाम +OptionWizard.44= सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ बैकअप डेटाबेस +OptionWizard.45=ओपन पृथà¥à¤µà¥€ इंजन ने पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° में जूम किया +OptionWizard.46=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठपृथà¥à¤µà¥€ इंजन टाइमलैपà¥à¤¸ खोलें +OptionWizard.47=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठबिंग मैपà¥à¤¸ खोलें +OptionWizard.48=बजाय गूगल अरà¥à¤¥ के फॉरà¥à¤® à¤à¤• बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° पर खोलें (लिनकà¥à¤¸ के लिठसिफारिश) +OptionWizard.49=भूखंड डेटा के साथ सीईडी / सीà¤à¤¸à¤µà¥€ फाइल भेजने के लिठपथ +OptionWizard.5=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ\: +OptionWizard.50=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.51=परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.52=केवल निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क के साथ सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल +OptionWizard.53=चौकोर +OptionWizard.54=केनà¥à¤¦à¥à¤°à¥€à¤¯ बिनà¥à¤¦à¥ +OptionWizard.55=परियोजना फ़ोलà¥à¤¡à¤° आयात तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.56=लोड परियोजना +OptionWizard.57=पहले से लोड परियोजना +OptionWizard.58= जी ई ई का मैदान खोलें (विशà¥à¤µà¤¸à¤¨à¥€à¤¯ जांचकरà¥à¤¤à¤¾ के उपयोग की आवशà¥à¤¯à¤•ता है) +OptionWizard.59=यहां भूखंड पर केंदà¥à¤°à¤¿à¤¤ मैपà¥à¤¸ खोलें +OptionWizard.6=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² डीबी मापदंड +OptionWizard.65=साà¤à¤•à¥à¤«à¤¼à¥‹à¤²à¥à¤¡à¤° का पथ +OptionWizard.66=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.67=फ़ायरफ़ॉकà¥à¤¸ निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ +OptionWizard.68=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.7=उपयोगकरà¥à¤¤à¤¾ नाम +OptionWizard.70=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों +OptionWizard.72=बाइनरी फ़ाइलें +OptionWizard.73=कà¥à¤°à¥‹à¤® निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ +OptionWizard.74=बà¥à¤°à¤¾à¤‰à¤œ +OptionWizard.76=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों +OptionWizard.78=बाइनरी फ़ाइलें +OptionWizard.79=केà¤à¤®à¤à¤² फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ के लिठपथ +OptionWizard.8=पासवरà¥à¤¡ +OptionWizard.80=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.82=फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ +OptionWizard.83=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ पà¥à¤°à¤ªà¤¤à¥à¤° डिज़ाइन करने के लिठपथ +OptionWizard.84=बà¥à¤°à¤¾à¤‰à¤œ..... +OptionWizard.86=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² वेब पेज +OptionWizard.87=पथ आइडीà¤à¤® परिभाषा के साथ à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठ+OptionWizard.88=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.9=डीबी नाम +OptionWizard.90=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² आइडीà¤à¤® परिभाषा +OptionWizard.91=सरà¥à¤µà¤° (पà¥à¤°à¤¬à¤‚धक संसà¥à¤•रण या खड़े अकेले का उपयोग करें) +OptionWizard.92=कà¥à¤²à¤¾à¤‡à¤‚ट (ऑपरेटर / सरà¥à¤µà¤° से जà¥à¤¡à¤¼à¥‡) +OptionWizard.93=सकà¥à¤¯à¥‚à¤à¤²à¤¾à¤‡à¤Ÿ (à¤à¤‚बेडेड / à¤à¤•ल फाइल आधारित) +OptionWizard.94=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² +OptionWizard.95=सेमà¥à¤ªà¤² डॉटà¥à¤¸ के साइड (मीटर में) +SaikuAnalysisListener.0=हाठ- ताज़ा साà¤à¤•ॠडेटा (लंबी पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾) +SaikuAnalysisListener.1=नहीं - बस साà¤à¤•ॠशà¥à¤°à¥‚ +SaikuStarter.1=साà¤à¤•ॠशà¥à¤°à¥‚ +SaikuStarter.2= साà¤à¤•ॠशà¥à¤°à¥‚ कà¥à¤› मिनट लग सकते हैं, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें\! +SaveEarthDataServlet.0=खाली अनà¥à¤°à¥‹à¤§ +SaveEarthDataServlet.1= डेटाबेस में डेटा बचाते समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ है +SaveEarthDataServlet.2=डेटा बचाया था +SlopeCode.0=समतल (0-5) +EarthApp.11=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ पहले से ही चल रहा है +EarthApp.21=à¤à¤• सीà¤à¤¸à¤µà¥€ / सीईडी के रूप में भूखंडों की गà¥à¤°à¤¿à¤¡ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
+EarthApp.23=कोई सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सेट-अप नहीं किया गया है \:

+EarthApp.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² परिभाषा के साथ फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है \:
+EarthApp.26=कोई à¤à¤•à¥à¤¸à¤à¤®à¤à¤² फ़ाइल परिभाषा सेट अप नहीं किया गया है \:

+EarthApp.27=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ रूप से यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
+EarthApp.29=कोई à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ फ़ाइल सेट-अप नहीं किया गया है \:

+EarthApp.3=मà¥à¤à¥‡ बाद में याद दिलाना +EarthApp.30=उपकरण> गà¥à¤£ मेनू में फ़ाइल सà¥à¤¥à¤¾à¤¨ को ठीक करें . +EarthApp.4=अभी अदà¥à¤¯à¤¤à¤¨ करें +EarthApp.5=मà¥à¤à¥‡ दà¥à¤¬à¤¾à¤°à¤¾ याद मत दिलाना +EarthApp.57=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ का à¤à¤• नया संसà¥à¤•रण उपलबà¥à¤§ है\!
आप कैसे आगे बढ़ना चाहते हैं? +EarthApp.58=अदà¥à¤¯à¤¤à¤¨ चेतावनी +EarthApp.59= परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ +EarthApp.6=\ - संसà¥à¤•रण +EarthApp.61=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ फाइल खà¥à¤² नहीं सकती .
कृपया सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करें कि गूगल अरà¥à¤¥ सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ है. +EarthSurveyService.9=आवशà¥à¤¯à¤• कà¥à¤·à¥‡à¤¤à¥à¤° +ExportActionListener.1= तारीख चूनें जबसे रिकॉरà¥à¤¡ निरà¥à¤¯à¤¾à¤¤ करने है +ExportDialogProcessMonitor.0=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... +ExportDialogProcessMonitor.1=पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ पà¥à¤°à¤¾à¤°à¤‚भ करने के लिठपà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ कर रहा है \: +ExportDialogProcessMonitor.4=निरà¥à¤¯à¤¾à¤¤ रिकॉरà¥à¤¡\: +ImportProcessMonitorDialog.0=आयातित रिकॉरà¥à¤¡ \: +ImportActionListener.0=कà¥à¤¯à¤¾ उन भूखंडों के लिठडेटा जो कि पूरी तरह से भरे नहीं गठ,आयातित किया जाना चाहिà¤? +ImportActionListener.2=आप कà¥à¤²à¤¿à¤• करें, नहींतो केवल डेटा "हरी" राजà¥à¤¯ में भूखंडों से ,जिसमें सभी डेटा यà¥à¤•à¥à¤¤ है , आयात किया जाà¤à¤—ा। +ImportDialogProcessMonitor.0=\ गणना +ImportDialogProcessMonitor.11=रिकॉरà¥à¤¡ की पà¥à¤°à¤¾à¤°à¤‚भिक संखà¥à¤¯à¤¾ \: +ImportDialogProcessMonitor.2=रिकॉरà¥à¤¡ आयात... +ImportDialogProcessMonitor.5=आयातित रिकॉरà¥à¤¡ की वासà¥à¤¤à¤µà¤¿à¤• संखà¥à¤¯à¤¾ \: +ImportDialogProcessMonitor.8=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... +InfiniteProgressMonitor.0=रदà¥à¤¦ ऑपरेशन +JFileChooserExistsAware.0=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ परियोजना फ़ाइल +KmlImportService.13=पà¥à¤²à¥‰à¤Ÿ सà¥à¤¥à¤¾à¤¨à¥‹à¤‚ को बचाने के लिठà¤à¤• सीà¤à¤¸à¤µà¥€ फ़ाइल का चयन करें +MissingPlotsListener.0=तà¥à¤°à¥à¤Ÿà¤¿ उन भूखंडों के बारे में जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ करने के लिठजो डेटाबेस पर मौजूद नहीं +MissingPlotsListener.1=गà¥à¤® भूखंड +MissingPlotsListener.10=सेमà¥à¤ªà¤² डिजाइन में भूखंडों की कà¥à¤² संखà¥à¤¯à¤¾ \: +MissingPlotsListener.12=गà¥à¤® भूखंडों की संखà¥à¤¯à¤¾ \: +MissingPlotsListener.14=सभी भूखंडों भर रहे हैं\! +MissingPlotsListener.2=कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ अंतरà¥à¤µà¤¸à¥à¤¤à¥ की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ +MissingPlotsListener.3=भूखंड की जानकारी वाले फ़ाइलें चà¥à¤¨à¥‡à¤‚ ( .सीà¤à¤¸à¤µà¥€ या .सीईडी फ़ाइलें ) जिसके लिठआप जानना चाहते हैं तो सभी डेटा भर दिया गया है चाहता हूà¤. +MissingPlotsListener.4=गà¥à¤® भूखंड- जानकारी +MissingPlotsListener.5=फ़ाइल से \: +MissingPlotsListener.6=सीà¤à¤¡à¥€ फ़ाइल में निरà¥à¤¯à¤¾à¤¤ करें +ProcessMonitorDialog.1=पंकà¥à¤¤à¤¿ संखà¥à¤¯à¤¾ पर तà¥à¤°à¥à¤Ÿà¤¿ +ProcessMonitorDialog.4=, कॉलम +ProcessMonitorDialog.5=\ --मूलà¥à¤¯ +YES= हां +YES_TO_ALL=सब को हां +NO=नहीं +NO_TO_ALL=सभी को नहीं From aa52176a26f45cc55dd6bac5152586315f6401d8 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:35:18 +0100 Subject: [PATCH 0780/1620] New translations utf8_orig_Messages_hi.properties (Portuguese) --- .../earth/app/view/Messages_pt.properties | 446 +++++++++--------- 1 file changed, 225 insertions(+), 221 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 5110140e9c..f0355142d0 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,221 +1,225 @@ -AboutDialog.19=Äã có lá»—i -AboutDialog.5=Truy cập website cá»§a chúng tôi để biết thêm thông tin OpenForis.org -AboutDialog.6=Xin lá»—i, đã có sá»± cố khi mở link trong brower chuẩn trong hệ thống cá»§a bạn. -AboutDialog.8=Ok -AspectCode.0=Bắc -AspectCode.1=Äông-Bắc -AspectCode.2=Äông -AspectCode.3=Äông-Nam -AspectCode.4=Nam -AspectCode.5=Tây-Nam -AspectCode.6=Tây -AspectCode.7=Tây-Bắc -CollectEarthWindow.0=Lá»—i khi xuất dữ liệu sang file CSV -CollectEarthWindow.1=Lá»—i xuất dữ liệu -CollectEarthWindow.10=File -CollectEarthWindow.11=Thoát -CollectEarthWindow.12=Công cụ -CollectEarthWindow.13=Xuất dữ liệu ra CSV -CollectEarthWindow.14=Khởi động SAIKU Analysis -CollectEarthWindow.15=Thuá»™c tính -CollectEarthWindow.16=Trợ giúp -CollectEarthWindow.17=Thông tin công bố -CollectEarthWindow.18=Tìm ô thiếu trong cÆ¡ sở dữ liệu -CollectEarthWindow.19=Collect Earth -CollectEarthWindow.2=Ngôn ngữ -CollectEarthWindow.20=Số bản ghi trùng\: -CollectEarthWindow.21=Không tìm thấy biểu tượng cho khung chính -CollectEarthWindow.22=Bạn có chắc là muốn đóng Collect Earth?
Äóng cá»­a sổ cÅ©ng đóng luôn máy chá»§ Collect Earth -CollectEarthWindow.23=Cần khẳng định -CollectEarthWindow.24=Xuất ra XML -CollectEarthWindow.25=Bạn có muốn thêm các bản ghi này và bá» Ä‘i dữ liệu hiện thá»i không? -CollectEarthWindow.26=Ngưá»i sá»­ dụng -CollectEarthWindow.27=Cập nhật -CollectEarthWindow.28=Máy chá»§ Open Foris Collect Earth phải chạy khi ngưá»i sá»­ dụng giải Ä‘oán dữ liệu. -CollectEarthWindow.29=Chưa xác định cấu hình cho Máy chá»§ Saiku. -CollectEarthWindow.3=\ Lá»—i nhập -CollectEarthWindow.30=Äể mở cá»­a sổ này khi Ä‘ang sá»­ dụng Google Earth. -CollectEarthWindow.31=Xuất dữ liệu đã thu thập sang file CSV -CollectEarthWindow.32=Thoát -CollectEarthWindow.33=Tên ngưá»i sá»­ dụng phải dài hÆ¡n 5 chữ cái và ngắn hÆ¡n 50 chữ cái -CollectEarthWindow.34=Lá»—i kiểm chứng -CollectEarthWindow.35=TÊN NGƯỜI SỬ DỤNG CÃ’N TRá»NG\!
Hãy Ä‘iá»n tên ngưá»i sá»­ dụng và nhắp phím "Update". -CollectEarthWindow.36=Không được để trống phần tên ngưá»i sá»­ dụng -CollectEarthWindow.37=Äể mở -CollectEarthWindow.38=file CSV -CollectEarthWindow.39=THÔNG BÃO\: Nên lưu dá»± phòng dữ liệu hiện thá»i(Xuất ra XML) trước khi nhập dữ liệu má»›i -CollectEarthWindow.4=Thông tin công bố cá»§a FAO -CollectEarthWindow.40=Thiết lập đưá»ng dẫn tá»›i thư mục cài đặt Saiku Server trong Tools->Properties->Advanced tab. -CollectEarthWindow.41=Ghi dữ liệu xuất ra vào file\: -CollectEarthWindow.42=Thoát -CollectEarthWindow.43=Tìm thấy bản ghi có mâu thuẫn -CollectEarthWindow.44=Nhập/Xuất dữ liệu -CollectEarthWindow.45=Xuất dữ liệu ra XML (nén) -CollectEarthWindow.46=Nhập dữ liệu má»›i từ file ZIP (XML nén) -CollectEarthWindow.55=Cập nhật các bản ghi hiện thá»i bằng CSV -CollectEarthWindow.47=Chưa định cấu hình cho Saiku Server -CollectEarthWindow.48=Zip/collect-data files -CollectEarthWindow.49=Files CSV tổng hợp -CollectEarthWindow.5=Äóng -CollectEarthWindow.50=Mở hướng dẫn ngưá»i sá»­ dụng -CollectEarthWindow.51=Kiểm tra cập nhật cá»§a Collect Earth -CollectEarthWindow.52=Mở file nhật ký ứng dụng -CollectEarthWindow.53=File nhật ký cá»§a Collect Earth -CollectEarthWindow.54=Nạp các Ä‘iểm từ KML -CollectEarthWindow.56=Vá»... -CollectEarthWindow.57=Äang chạy quá trình khởi động Saiku, xin đợi. -CollectEarthWindow.58=Không thể khởi động Saiku analysis -CollectEarthWindow.59=Bạn có muốn tạo lại bá»™ dữ liệu cho Saiku analysis không?
Quá trình này sẽ mất một vài phút.
Nếu bạn chá»n "YES" sẽ tạo ra má»™t bá»™ dữ liệu má»›i vá»›i các thông tin cập nhật nhất. -CollectEarthWindow.6=Xuất ra bảng tổng hợp -CollectEarthWindow.60=Tạo dữ liệu Saiku -CollectEarthWindow.61=Xuất dữ liệu ra XML (các bản ghi chỉnh sá»­a từ lần xuất trước) -CollectEarthWindow.62=Vá»... -CollectEarthWindow.63=Lá»—i khi nạp Ä‘iểm từ KML -CollectEarthWindow.64=Há»— trợ kỹ thuật -CollectEarthWindow.7=Lá»—i khi nhập dữ liệu -CollectEarthWindow.8=Không tìm thấy văn bản thông báo -CollectEarthWindow.9=Dữ liệu nhập vào có chứa các bản ghi đã có trong cÆ¡ sở dữ liệu cá»§a bạn. -DynamicsCode.0=Ban đầu là rừng -DynamicsCode.1=Ban đầu là trảng cá» -DynamicsCode.2=Ban đầu là khu dân cư -DynamicsCode.3=Ban đầu là đất khác -DynamicsCode.4=Ban đầu là đất ngập nước -DynamicsCode.5=Ban đầu là đất trồng trá»t -OpenTextFileListener.0=không tìm thấy file văn bản tại\: -OptionWizard.0=Các lá»±a chá»n cá»§a Collect Earth -OptionWizard.1=Chá»n Browser -OptionWizard.10=Mở thư mục lưu dá»± phòng -OptionWizard.11=Không biết\: hãy sá»­ dụng ifconfig -OptionWizard.12=Vi dụ cá»§a khác -OptionWizard.13=Äịa chỉ IP cá»§a máy chá»§ Collect Earth -OptionWizard.14=Cổng máy chá»§ Collect Earth (vd\: 8023) -OptionWizard.15=Ghi và áo dụng thay đổi -OptionWizard.16=ID -OptionWizard.17=Tá»a độ X -OptionWizard.18=Tá»a độ Y -OptionWizard.19=Äá»™ cao -OptionWizard.2=Dòng công tác (máy chá»§/khách) -OptionWizard.20=Ná»™i dung cá»§a Google Earth đã thay đổi.
Äá» nghị chấp nhận tải lại ná»™i dung khi Google Earth gợi ý. -OptionWizard.21=Cập nhật thành công -OptionWizard.22=Dốc -OptionWizard.23=Có lá»—i khi mở lại dữ liệu Google Earth -OptionWizard.24=Há»§y -OptionWizard.25=Mode vận hành -OptionWizard.26=NÆ¡i lưu cÆ¡ sở dữ liệu -OptionWizard.27=Äây không phải là thư mục Saiku (hiện không có file start-saiku.bat) -OptionWizard.28=Không nhận được máy chá»§ Saiku -OptionWizard.29=Cổng cÆ¡ sở dữ liệu -OptionWizard.3=Ví dụ cá»§a máy chá»§ -OptionWizard.30=Các lá»±a chá»n cá»§a SQLite -OptionWizard.31=Dữ liệu mẫu -OptionWizard.32=SÆ¡ đồ mẫu -OptionWizard.33=Äịnh nghÄ©a khảo sát -OptionWizard.34=Nâng cao -OptionWizard.35=Số Ä‘iểm mẫu -OptionWizard.36=Khoảng cách giữa các Ä‘iểm mẫu (tính theo mét) -OptionWizard.37=Lá» vá»›i biên ô (tính theo mét) -OptionWizard.38=Không Ä‘á»c được đúng file CSV/CED.
Cần có dấu phảy để phân tách giá trị giống như sau \:
-OptionWizard.39=ID,Tá»a độ Y,tá»a độ X,độ cao,độ dốc,tá»· lệ -OptionWizard.4=Äịa chỉ IP hiện tại cá»§a máy tính\: -OptionWizard.40=Các project -OptionWizard.41=tải file project má»›i -OptionWizard.42=Lá»—i khi đóng CSV reader -OptionWizard.43=Tên khảo sát -OptionWizard.44=tá»± động lưu dá»± phòng dữ liệu tại -OptionWizard.45=Mở Earth Engine để phóng to vào khu vá»±c ô -OptionWizard.46=Mở Earth Engine timelapse cho khu vá»±c ô -OptionWizard.47=Mở Bing Maps cho khu vá»±c ô -OptionWizard.48=Mở form trên browser thay vì mở Google Earth (khuyến cáo cho LINUX) -OptionWizard.49=ÄÆ°á»ng dẫn tá»›i file ced/csv file vá»›i dữ liệu ô -OptionWizard.5=Cổng máy chá»§ Collect Earth\: -OptionWizard.50=Browse... -OptionWizard.51=Lá»—i nhập file project -OptionWizard.52=File CSV/CED chỉ có tá»a độ -OptionWizard.53=Ô vuông -OptionWizard.54=Äiểm trung tâm -OptionWizard.55=Lá»—i khi nhập thư mục project -OptionWizard.56=Tải project -OptionWizard.57=Các project đã tải -OptionWizard.58=Mở GEE Code Editor (cần phải có quyá»n truy cập Trusted Tester) -OptionWizard.59=Mở Here Maps tập trung vào ô -OptionWizard.6=Các thông số cá»§a CSDL PostgreSQL -OptionWizard.65=ÄÆ°á»ng dẫn tá»›i thư mục Saiku -OptionWizard.66=Browse... -OptionWizard.67=ÄÆ°á»ng dẫn tá»›i Firefox executable (file exe) -OptionWizard.68=Browse... -OptionWizard.7=Tên ngưá»i sá»­ dụng -OptionWizard.70=File chạy -OptionWizard.72=File nhị phân -OptionWizard.73=ÄÆ°á»ng dẫn tá»›i Chrome executable (file exe) -OptionWizard.74=Browse... -OptionWizard.76=File exe -OptionWizard.78=File nhị phân -OptionWizard.79=ÄÆ°á»ng dẫn tá»›i KML Freemarker template -OptionWizard.8=Mật khẩu -OptionWizard.80=Browse... -OptionWizard.82=Freemarker template -OptionWizard.83=ÄÆ°á»ng dẫn tá»›i mẫu thiết kế HTML Balloon -OptionWizard.84=Browse... -OptionWizard.86=HTML webpage -OptionWizard.87=ÄÆ°á»ng dẫn tá»›i XML vá»›i định nghÄ©a IDM -OptionWizard.88=Browse... -OptionWizard.9=Tên CSDL -OptionWizard.90=Äịnh nghÄ©a XML IDM -OptionWizard.91=Máy chá»§ (phiên bản quản lý hoặc sá»­ dụng độc lập) -OptionWizard.92=Khách (ngưá»i sá»­ dụng/kết nối vá»›i máy chá»§) -OptionWizard.93=SQLite (tích hợp/file đơn lẻ) -OptionWizard.94=PostgreSQL -SaikuAnalysisListener.0=Yes - Làm má»›i lại dữ liệu Saiku (quá trình dài) -SaikuAnalysisListener.1=No - chỉ khởi động Saiku -SaikuStarter.1=Khởi động Saiku -SaikuStarter.2=Cần vài phút để khởi động Saiku, xin đợi\! -SaveEarthDataServlet.0=Yêu cầu trống -SaveEarthDataServlet.1=Có trục trặc khi ghi dữ liệu vào CSDL -SaveEarthDataServlet.2=Dữ liệu đã được ghi -SlopeCode.0=Bằng phẳng (0-5) -EarthApp.11=Collect Earth Ä‘ang chạy -EarthApp.21=Không tìm thấy file chứa lưới ô trong đưá»ng dẫn đã chá»n \:
-EarthApp.23=Chưa thiết lập file CSV/CED \:

-EarthApp.24=Không tìm thấy file chứa Freemarker template vá»›i định nghÄ©a KML trong đưá»ng dẫn đã chá»n\:
-EarthApp.26=Chưa thiết lập file định nghĩa KML d\:

-EarthApp.27=Không tìm thấy file chứa mẫu HTML balloon trong đưá»ng dẫn đã chá»n\:
-EarthApp.29=Chưa thiết lập file HTML balloon \:

-EarthApp.3=Nhắc nhở sau -EarthApp.30=Xin hãy Ä‘iá»u chỉnh đúng địa chỉ file trong Tools->Properties menu. -EarthApp.4=Cập nhật luôn -EarthApp.5=Không nhắc nữa -EarthApp.57=Äã có phiên bản má»›i cá»§a Collect Earth\!
Bạn muốn làm tiếp như thế nào? -EarthApp.58=Thông báo cập nhật -EarthApp.59=Lỗi khi nhập file project -EarthApp.6=\ - Phiên bản -EarthApp.61=Không mở được file Collect Earth.
Äá» nghị đảm bảo đã cài đặt Google Earth. -EarthSurveyService.9=Trưá»ng bắt buá»™c -ExportActionListener.1=Chá»n ngày xuất bản ghi -ExportDialogProcessMonitor.0=Äang xá»­ lý dữ liệu... -ExportDialogProcessMonitor.1=Äang đợi khởi động quá trình\: -ExportDialogProcessMonitor.4=Các bản ghi đã xuất\: -ImportProcessMonitorDialog.0=Các bản ghi đã nhập\: -ImportActionListener.0=Có nhập dữ liệu các ô chưa được Ä‘iá»n đầy đủ không? -ImportActionListener.2=Nếu bạn chá»n NO sẽ chỉ nhập dữ liệu cá»§a các ô có trạng thái màu "xanh lá cây", các ô đã có đầy đủ dữ liệu. -ImportActionListener.3=Nhập các bản ghi chưa hoàn tất -ImportDialogProcessMonitor.0=\ ÄANG TÃNH TOÃN -ImportDialogProcessMonitor.11=Số lượng ban đầu các bản ghi\: -ImportDialogProcessMonitor.2=Äang nhập các bản ghi... -ImportDialogProcessMonitor.5=Số lượng thá»±c tế các bản ghi đã nhập\: -ImportDialogProcessMonitor.8=Äang xá»­ lý dữ liệu... -InfiniteProgressMonitor.0=Há»§y lệnh -JFileChooserExistsAware.0=File project cá»§a Collect Earth -KmlImportService.13=Chá»n file CSV file để ghi địa Ä‘iểm cá»§a ô vào -MissingPlotsListener.0=Lá»—i khi lấy thông tin vỠô không có trong CSDL -MissingPlotsListener.1=Các ô thiếu -MissingPlotsListener.10=Tổng số ô trong thiết kế chá»n mẫu \: -MissingPlotsListener.12=Số ô thiếu\: -MissingPlotsListener.14=Äã Ä‘iá»n tất cả các ô\! -MissingPlotsListener.2=Sao chép ná»™i dung vào bàn phím -MissingPlotsListener.3=Lá»±a chá»n file có chứa thông tin ô ( file .csv hoặc .ced ) mà bạn muốn biết đã Ä‘iá»n đủ dữ liệu chưa. -MissingPlotsListener.4=Các ô thiếu - thông tin -MissingPlotsListener.5=Từ file \: -MissingPlotsListener.6=Xuất ra file CED -ProcessMonitorDialog.1=Tìm lá»—i trên số dòng -ProcessMonitorDialog.4=, cá»™t -ProcessMonitorDialog.5=\ -- giá trị +AboutDialog.19=कोई समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ +AboutDialog.5=अधिक जानकारी के लिठहमारी वेबसाइट पर जाà¤? OpenForis.org? +AboutDialog.6=कà¥à¤·à¤®à¤¾ करें, à¤à¤• समसà¥à¤¯à¤¾ आपके सिसà¥à¤Ÿà¤® के मानक बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में इस लिंक को खोलने की कोशिश कर रही है. +AboutDialog.8=ठीक +AspectCode.0=उतà¥à¤¤à¤° दिशा +AspectCode.1=उतà¥à¤¤à¤°-पूरà¥à¤µ दिशा +AspectCode.2=पूरà¥à¤µ दिशा +AspectCode.3=दकà¥à¤·à¤¿à¤£-पूरà¥à¤µ दिशा +AspectCode.4=दकà¥à¤·à¤¿à¤£ दिशा +AspectCode.5=दकà¥à¤·à¤¿à¤£-पशà¥à¤šà¤¿à¤® दिशा +AspectCode.6=पशà¥à¤šà¤¿à¤® दिशा +AspectCode.7=उतà¥à¤¤à¤°-पशà¥à¤šà¤¿à¤® दिशा +CollectEarthWindow.0=तà¥à¤°à¥à¤Ÿà¤¿ जब सीà¤à¤¸à¤µà¥€ फ़ाइल में डेटा निरà¥à¤¯à¤¾à¤¤ करने का पà¥à¤°à¤¯à¤¾à¤¸ +CollectEarthWindow.1=निरà¥à¤¯à¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.10=फ़ाइल +CollectEarthWindow.11=बाहर जाà¤à¤‚ +CollectEarthWindow.12=उपकरण +CollectEarthWindow.13=डेटा सीà¤à¤¸à¤µà¥€ निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.14=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ +CollectEarthWindow.15=गà¥à¤£ +CollectEarthWindow.16=मदद +CollectEarthWindow.17=असà¥à¤µà¥€à¤•रण +CollectEarthWindow.18=डेटाबेस में लापता भूखंडों खोजें +CollectEarthWindow.19=पृथà¥à¤µà¥€ इकटà¥à¤ à¤¾ +CollectEarthWindow.2=भाषा +CollectEarthWindow.20=डà¥à¤ªà¥à¤²à¤¿à¤•ेट रिकॉरà¥à¤¡ की संखà¥à¤¯à¤¾\: +CollectEarthWindow.21=मà¥à¤–à¥à¤¯ फà¥à¤°à¥‡à¤® के लिठआइकन नहीं मिल सकता है +CollectEarthWindow.22=आपको लगता है कि आप à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ बंद करना चाहते हैं? विंडोज बंद करने से, à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° बंद हो जाà¤à¤—ा +CollectEarthWindow.23=पà¥à¤·à¥à¤Ÿà¤¿ की जरूरत है +CollectEarthWindow.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.25=आप वैसे भी इन अभिलेखों को जोड़ना चाहते हैं और अपने वरà¥à¤¤à¤®à¤¾à¤¨ डेटा खोने के लिठकिलक करना चाहते हैं? +CollectEarthWindow.26=ऑपरेटर,पà¥à¤°à¤šà¤¾à¤²à¤• +CollectEarthWindow.27=अदà¥à¤¯à¤¤à¤¨ +CollectEarthWindow.28= औपन फौरिस à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° चल रहा होना चाहिठ, जबभी ऑपरेटर डेटा की वà¥à¤¯à¤¾à¤–à¥à¤¯à¤¾ करें . +CollectEarthWindow.29=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. +CollectEarthWindow.3= आयात संबंधी तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.30=जबभी आप गà¥à¤—ल अरà¥à¤¥ का उपयोग कर रहे हैं, कृपया इस विंडोज को खà¥à¤²à¥€ बनाठरखें. +CollectEarthWindow.31=à¤à¤•तà¥à¤° डेटा सीà¤à¤¸à¤µà¥€ फाइल में भेजें +CollectEarthWindow.32=छोड़ना +CollectEarthWindow.33=ऑपरेटर का नाम के 5 अकà¥à¤·à¤° से बड़ा और 50 अकà¥à¤·à¤° से कम होना चाहिठ+CollectEarthWindow.34=मानà¥à¤¯à¤¤à¤¾ तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.35=ऑपरेटर नाम खाली\!
कृपया ऑपरेटर का नाम भरें और "अदà¥à¤¯à¤¤à¤¨" बटन दबाà¤à¤. +CollectEarthWindow.36=ऑपरेटर नाम रिकà¥à¤¤ नहीं हो सकता +CollectEarthWindow.37=खà¥à¤²à¤¾ रखो +CollectEarthWindow.38=सीà¤à¤¸à¤µà¥€ फ़ाइल +CollectEarthWindow.39=सूचना\: यह सलाह दी जाती है कि आप नठडेटा डालने करने से पहले अपने मौजूदा आंकडों को बैकअप(à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤) कर लें +CollectEarthWindow.4=à¤à¤«à¤à¤“ असà¥à¤µà¥€à¤•रण नोटिस +CollectEarthWindow.40=उस फ़ोलà¥à¤¡à¤° पर जाà¤à¤‚ जहां साà¤à¤•ॠसरà¥à¤µà¤° में सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ किया गया है, फ़ोलà¥à¤¡à¤° का रासà¥à¤¤à¤¾ उपकरण> गà¥à¤£> उनà¥à¤¨à¤¤ टैब. +CollectEarthWindow.41=निरà¥à¤¯à¤¾à¤¤ डेटा को फ़ाइल में बचाया जा रहा है \: +CollectEarthWindow.42=छोड़ना +CollectEarthWindow.43=परसà¥à¤ªà¤° विरोधी रिकॉरà¥à¤¡ पाया +CollectEarthWindow.44=डेटा आयात / निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.45=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ डेटा (संकà¥à¤šà¤¿à¤¤) +CollectEarthWindow.46=ज़िप से नठडेटा आयात करें (संकà¥à¤šà¤¿à¤¤ à¤à¤•à¥à¤¸à¤à¤®à¤à¤²) +CollectEarthWindow.55=सीà¤à¤¸à¤µà¥€ का उपयोग कर मौजूदा रिकॉरà¥à¤¡ को अपडेट करें +CollectEarthWindow.47=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. +CollectEarthWindow.48=ज़िप / à¤à¤•तà¥à¤°-डेटा फ़ाइल +CollectEarthWindow.49=फà¥à¤¯à¥‚जन सीà¤à¤¸à¤µà¥€ फ़ाइल +CollectEarthWindow.5=बंद करे +CollectEarthWindow.50= उपयोगकरà¥à¤¤à¤¾ मैनà¥à¤…ल खोलें +CollectEarthWindow.51=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ के अदà¥à¤¯à¤¤à¤¨ के लिठजाà¤à¤š करें +CollectEarthWindow.52= अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— लॉग फ़ाइल खोलें +CollectEarthWindow.53=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ लॉग फ़ाइल +CollectEarthWindow.54=केà¤à¤®à¤à¤² से लोड अंक +CollectEarthWindow.56=के विषय में... +CollectEarthWindow.57=साà¤à¤•ॠसà¥à¤Ÿà¤¾à¤°à¥à¤Ÿà¤° पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ अभी भी चल रहा है, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें. +CollectEarthWindow.58=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ नहीं कर सकते +CollectEarthWindow.59=आप साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ के लिठडेटा सेट फिर से उतà¥à¤ªà¤¨à¥à¤¨ करने के लिठकरना चाहते हैं?
यह पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ समय लेने वाली हो सकती है.
आप यदि "हाà¤"पर कà¥à¤²à¤¿à¤• करें, तो नवीनतम जानकारी के साथ à¤à¤• नया डाटासेट उतà¥à¤ªà¤¨à¥à¤¨ हो जाà¤à¤—ा. +CollectEarthWindow.6=फà¥à¤¯à¥‚जन टेबल के लिठनिरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.60=साà¤à¤•ॠडेटा उतà¥à¤ªà¤¨à¥à¤¨ +CollectEarthWindow.61=डेटा à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ (पिछले निरà¥à¤¯à¤¾à¤¤ के बाद से संशोधित रिकॉरà¥à¤¡) +CollectEarthWindow.62=के विषय मे... +CollectEarthWindow.63=केà¤à¤®à¤à¤² से अंक पà¥à¤°à¤¾à¤ªà¥à¤¤ करने में तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.64=तकनीकी सहायता +CollectEarthWindow.7=डेटा आयात में तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.8=असà¥à¤µà¥€à¤•रण पाठ नहीं पाया जा सका +CollectEarthWindow.9=डेटा आयात रिकॉरà¥à¤¡ वह है जो कि पहले से ही अपने डेटाबेस पर मौजूद हैं शामिल. +DynamicsCode.0=पà¥à¤°à¤¾à¤°à¤‚भ में वन +DynamicsCode.1=पà¥à¤°à¤¾à¤°à¤‚भ में घास का मैदान, +DynamicsCode.2=पà¥à¤°à¤¾à¤°à¤‚भ में आबादी वाला इलाका +DynamicsCode.3=पà¥à¤°à¤¾à¤°à¤‚भ में बंजर +DynamicsCode.4=पà¥à¤°à¤¾à¤°à¤‚भ में आरà¥à¤¦à¥à¤° भूमि +DynamicsCode.5=पà¥à¤°à¤¾à¤°à¤‚भ में खेत +OpenTextFileListener.0=इस पाठ का फ़ाइल नहीं मिला \: +OptionWizard.0= विकलà¥à¤ª +OptionWizard.1=बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° चà¥à¤¨à¥‡à¤‚ +OptionWizard.10=बैकअप फ़ोलà¥à¤¡à¤° खोलें +OptionWizard.11=अजà¥à¤žà¤¾à¤¤\: उपयोग ifconfig +OptionWizard.12=गà¥à¤°à¤¾à¤¹à¤•ों का उलà¥à¤²à¥‡à¤– +OptionWizard.13=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° आईपी +OptionWizard.14=कतà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ (उदाहरण- 8023) +OptionWizard.15=बचाà¤à¤‚ और परिवरà¥à¤¤à¤¨ लागू करें +OptionWizard.16=आईडी +OptionWizard.17=X- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क +OptionWizard.18=Y- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क +OptionWizard.19=उठान +OptionWizard.2=कारà¥à¤¯à¤ªà¥à¤°à¤µà¤¾à¤¹ (सरà¥à¤µà¤° / गà¥à¤°à¤¾à¤¹à¤•) +OptionWizard.20=गूगल अरà¥à¤¥ अंतरà¥à¤µà¤¸à¥à¤¤à¥ बदल दिया गया है
यदि गà¥à¤—ल अरà¥à¤¥ आप से कहे,अंतरà¥à¤µà¤¸à¥à¤¤à¥ पà¥à¤¨à¤ƒ लोड सà¥à¤µà¥€à¤•ार करें . +OptionWizard.21=अदà¥à¤¯à¤¤à¤¨ सफल +OptionWizard.22=ढाल +OptionWizard.23=गूगल अरà¥à¤¥ डेटा को फिर से खोलने में कोई तà¥à¤°à¥à¤Ÿà¤¿ थी +OptionWizard.24=रदà¥à¤¦ करना +OptionWizard.25=ऑपरेशन मोड +OptionWizard.26=डीबी होसà¥à¤Ÿ +OptionWizard.27=यह à¤à¤• मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ साà¤à¤•ॠफ़ोलà¥à¤¡à¤° नहीं है ( सà¥à¤Ÿà¤¾à¤°à¥à¤Ÿ-साà¤à¤•à¥.batफ़ाइल मौजूद नहीं है) +OptionWizard.28=साà¤à¤•ॠसरà¥à¤µà¤° मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ नहीं +OptionWizard.29=डीबी पोरà¥à¤Ÿ +OptionWizard.3=सरà¥à¤µà¤° आवृतà¥à¤¤à¤¿ +OptionWizard.30=à¤à¤¸à¤•à¥à¤¯à¥ लाइट विकलà¥à¤ª +OptionWizard.31=सेमà¥à¤ªà¤² डेटा +OptionWizard.32=पà¥à¤²à¥‰à¤Ÿ लेआउट +OptionWizard.33=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ परिभाषा +OptionWizard.34=विकसित +OptionWizard.35=सेमà¥à¤ªà¤² अंक की संखà¥à¤¯à¤¾ +OptionWizard.36=सेमà¥à¤ªà¤² बिंदॠके बीच दूरी (मीटर में) +OptionWizard.37=भूखंड की सीमा के साथ मारà¥à¤œà¤¿à¤¨ (मीटर मे) +OptionWizard.38=सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सही ढंग से पढ़ा नहीं जा सकता.
इस फ़ाइल में à¤à¤• अलà¥à¤ªà¤µà¤¿à¤°à¤¾à¤® से अलग मूलà¥à¤¯à¥‹à¤‚ की उमà¥à¤®à¥€à¤¦ है \:
+OptionWizard.39=आईडी, वाई समनà¥à¤µà¤¯, à¤à¤•à¥à¤¸ समनà¥à¤µà¤¯, ऊंचाई, ढाल, पहलू +OptionWizard.4=वरà¥à¤¤à¤®à¤¾à¤¨ कंपà¥à¤¯à¥‚टर आईपी \: +OptionWizard.40=परियोजनाà¤à¤‚ +OptionWizard.41=à¤à¤• नई परियोजना फ़ाइल लोड करें +OptionWizard.42=सीà¤à¤¸à¤µà¥€ पाठक को बंद करते समय तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.43=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ का नाम +OptionWizard.44= सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ बैकअप डेटाबेस +OptionWizard.45=ओपन पृथà¥à¤µà¥€ इंजन ने पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° में जूम किया +OptionWizard.46=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठपृथà¥à¤µà¥€ इंजन टाइमलैपà¥à¤¸ खोलें +OptionWizard.47=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठबिंग मैपà¥à¤¸ खोलें +OptionWizard.48=बजाय गूगल अरà¥à¤¥ के फॉरà¥à¤® à¤à¤• बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° पर खोलें (लिनकà¥à¤¸ के लिठसिफारिश) +OptionWizard.49=भूखंड डेटा के साथ सीईडी / सीà¤à¤¸à¤µà¥€ फाइल भेजने के लिठपथ +OptionWizard.5=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ\: +OptionWizard.50=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.51=परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.52=केवल निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क के साथ सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल +OptionWizard.53=चौकोर +OptionWizard.54=केनà¥à¤¦à¥à¤°à¥€à¤¯ बिनà¥à¤¦à¥ +OptionWizard.55=परियोजना फ़ोलà¥à¤¡à¤° आयात तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.56=लोड परियोजना +OptionWizard.57=पहले से लोड परियोजना +OptionWizard.58= जी ई ई का मैदान खोलें (विशà¥à¤µà¤¸à¤¨à¥€à¤¯ जांचकरà¥à¤¤à¤¾ के उपयोग की आवशà¥à¤¯à¤•ता है) +OptionWizard.59=यहां भूखंड पर केंदà¥à¤°à¤¿à¤¤ मैपà¥à¤¸ खोलें +OptionWizard.6=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² डीबी मापदंड +OptionWizard.65=साà¤à¤•à¥à¤«à¤¼à¥‹à¤²à¥à¤¡à¤° का पथ +OptionWizard.66=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.67=फ़ायरफ़ॉकà¥à¤¸ निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ +OptionWizard.68=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.7=उपयोगकरà¥à¤¤à¤¾ नाम +OptionWizard.70=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों +OptionWizard.72=बाइनरी फ़ाइलें +OptionWizard.73=कà¥à¤°à¥‹à¤® निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ +OptionWizard.74=बà¥à¤°à¤¾à¤‰à¤œ +OptionWizard.76=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों +OptionWizard.78=बाइनरी फ़ाइलें +OptionWizard.79=केà¤à¤®à¤à¤² फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ के लिठपथ +OptionWizard.8=पासवरà¥à¤¡ +OptionWizard.80=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.82=फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ +OptionWizard.83=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ पà¥à¤°à¤ªà¤¤à¥à¤° डिज़ाइन करने के लिठपथ +OptionWizard.84=बà¥à¤°à¤¾à¤‰à¤œ..... +OptionWizard.86=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² वेब पेज +OptionWizard.87=पथ आइडीà¤à¤® परिभाषा के साथ à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठ+OptionWizard.88=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.9=डीबी नाम +OptionWizard.90=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² आइडीà¤à¤® परिभाषा +OptionWizard.91=सरà¥à¤µà¤° (पà¥à¤°à¤¬à¤‚धक संसà¥à¤•रण या खड़े अकेले का उपयोग करें) +OptionWizard.92=कà¥à¤²à¤¾à¤‡à¤‚ट (ऑपरेटर / सरà¥à¤µà¤° से जà¥à¤¡à¤¼à¥‡) +OptionWizard.93=सकà¥à¤¯à¥‚à¤à¤²à¤¾à¤‡à¤Ÿ (à¤à¤‚बेडेड / à¤à¤•ल फाइल आधारित) +OptionWizard.94=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² +OptionWizard.95=सेमà¥à¤ªà¤² डॉटà¥à¤¸ के साइड (मीटर में) +SaikuAnalysisListener.0=हाठ- ताज़ा साà¤à¤•ॠडेटा (लंबी पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾) +SaikuAnalysisListener.1=नहीं - बस साà¤à¤•ॠशà¥à¤°à¥‚ +SaikuStarter.1=साà¤à¤•ॠशà¥à¤°à¥‚ +SaikuStarter.2= साà¤à¤•ॠशà¥à¤°à¥‚ कà¥à¤› मिनट लग सकते हैं, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें\! +SaveEarthDataServlet.0=खाली अनà¥à¤°à¥‹à¤§ +SaveEarthDataServlet.1= डेटाबेस में डेटा बचाते समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ है +SaveEarthDataServlet.2=डेटा बचाया था +SlopeCode.0=समतल (0-5) +EarthApp.11=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ पहले से ही चल रहा है +EarthApp.21=à¤à¤• सीà¤à¤¸à¤µà¥€ / सीईडी के रूप में भूखंडों की गà¥à¤°à¤¿à¤¡ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
+EarthApp.23=कोई सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सेट-अप नहीं किया गया है \:

+EarthApp.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² परिभाषा के साथ फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है \:
+EarthApp.26=कोई à¤à¤•à¥à¤¸à¤à¤®à¤à¤² फ़ाइल परिभाषा सेट अप नहीं किया गया है \:

+EarthApp.27=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ रूप से यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
+EarthApp.29=कोई à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ फ़ाइल सेट-अप नहीं किया गया है \:

+EarthApp.3=मà¥à¤à¥‡ बाद में याद दिलाना +EarthApp.30=उपकरण> गà¥à¤£ मेनू में फ़ाइल सà¥à¤¥à¤¾à¤¨ को ठीक करें . +EarthApp.4=अभी अदà¥à¤¯à¤¤à¤¨ करें +EarthApp.5=मà¥à¤à¥‡ दà¥à¤¬à¤¾à¤°à¤¾ याद मत दिलाना +EarthApp.57=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ का à¤à¤• नया संसà¥à¤•रण उपलबà¥à¤§ है\!
आप कैसे आगे बढ़ना चाहते हैं? +EarthApp.58=अदà¥à¤¯à¤¤à¤¨ चेतावनी +EarthApp.59= परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ +EarthApp.6=\ - संसà¥à¤•रण +EarthApp.61=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ फाइल खà¥à¤² नहीं सकती .
कृपया सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करें कि गूगल अरà¥à¤¥ सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ है. +EarthSurveyService.9=आवशà¥à¤¯à¤• कà¥à¤·à¥‡à¤¤à¥à¤° +ExportActionListener.1= तारीख चूनें जबसे रिकॉरà¥à¤¡ निरà¥à¤¯à¤¾à¤¤ करने है +ExportDialogProcessMonitor.0=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... +ExportDialogProcessMonitor.1=पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ पà¥à¤°à¤¾à¤°à¤‚भ करने के लिठपà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ कर रहा है \: +ExportDialogProcessMonitor.4=निरà¥à¤¯à¤¾à¤¤ रिकॉरà¥à¤¡\: +ImportProcessMonitorDialog.0=आयातित रिकॉरà¥à¤¡ \: +ImportActionListener.0=कà¥à¤¯à¤¾ उन भूखंडों के लिठडेटा जो कि पूरी तरह से भरे नहीं गठ,आयातित किया जाना चाहिà¤? +ImportActionListener.2=आप कà¥à¤²à¤¿à¤• करें, नहींतो केवल डेटा "हरी" राजà¥à¤¯ में भूखंडों से ,जिसमें सभी डेटा यà¥à¤•à¥à¤¤ है , आयात किया जाà¤à¤—ा। +ImportDialogProcessMonitor.0=\ गणना +ImportDialogProcessMonitor.11=रिकॉरà¥à¤¡ की पà¥à¤°à¤¾à¤°à¤‚भिक संखà¥à¤¯à¤¾ \: +ImportDialogProcessMonitor.2=रिकॉरà¥à¤¡ आयात... +ImportDialogProcessMonitor.5=आयातित रिकॉरà¥à¤¡ की वासà¥à¤¤à¤µà¤¿à¤• संखà¥à¤¯à¤¾ \: +ImportDialogProcessMonitor.8=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... +InfiniteProgressMonitor.0=रदà¥à¤¦ ऑपरेशन +JFileChooserExistsAware.0=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ परियोजना फ़ाइल +KmlImportService.13=पà¥à¤²à¥‰à¤Ÿ सà¥à¤¥à¤¾à¤¨à¥‹à¤‚ को बचाने के लिठà¤à¤• सीà¤à¤¸à¤µà¥€ फ़ाइल का चयन करें +MissingPlotsListener.0=तà¥à¤°à¥à¤Ÿà¤¿ उन भूखंडों के बारे में जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ करने के लिठजो डेटाबेस पर मौजूद नहीं +MissingPlotsListener.1=गà¥à¤® भूखंड +MissingPlotsListener.10=सेमà¥à¤ªà¤² डिजाइन में भूखंडों की कà¥à¤² संखà¥à¤¯à¤¾ \: +MissingPlotsListener.12=गà¥à¤® भूखंडों की संखà¥à¤¯à¤¾ \: +MissingPlotsListener.14=सभी भूखंडों भर रहे हैं\! +MissingPlotsListener.2=कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ अंतरà¥à¤µà¤¸à¥à¤¤à¥ की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ +MissingPlotsListener.3=भूखंड की जानकारी वाले फ़ाइलें चà¥à¤¨à¥‡à¤‚ ( .सीà¤à¤¸à¤µà¥€ या .सीईडी फ़ाइलें ) जिसके लिठआप जानना चाहते हैं तो सभी डेटा भर दिया गया है चाहता हूà¤. +MissingPlotsListener.4=गà¥à¤® भूखंड- जानकारी +MissingPlotsListener.5=फ़ाइल से \: +MissingPlotsListener.6=सीà¤à¤¡à¥€ फ़ाइल में निरà¥à¤¯à¤¾à¤¤ करें +ProcessMonitorDialog.1=पंकà¥à¤¤à¤¿ संखà¥à¤¯à¤¾ पर तà¥à¤°à¥à¤Ÿà¤¿ +ProcessMonitorDialog.4=, कॉलम +ProcessMonitorDialog.5=\ --मूलà¥à¤¯ +YES= हां +YES_TO_ALL=सब को हां +NO=नहीं +NO_TO_ALL=सभी को नहीं From 04d93c318ec24118fffcda853d9a900f9c25a89b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:35:19 +0100 Subject: [PATCH 0781/1620] New translations Messages_lo.properties (Spanish) --- .../earth/app/view/Messages_es.properties | 445 +++++++++--------- 1 file changed, 220 insertions(+), 225 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index f0355142d0..e5b9bd9e45 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,225 +1,220 @@ -AboutDialog.19=कोई समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ -AboutDialog.5=अधिक जानकारी के लिठहमारी वेबसाइट पर जाà¤? OpenForis.org? -AboutDialog.6=कà¥à¤·à¤®à¤¾ करें, à¤à¤• समसà¥à¤¯à¤¾ आपके सिसà¥à¤Ÿà¤® के मानक बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में इस लिंक को खोलने की कोशिश कर रही है. -AboutDialog.8=ठीक -AspectCode.0=उतà¥à¤¤à¤° दिशा -AspectCode.1=उतà¥à¤¤à¤°-पूरà¥à¤µ दिशा -AspectCode.2=पूरà¥à¤µ दिशा -AspectCode.3=दकà¥à¤·à¤¿à¤£-पूरà¥à¤µ दिशा -AspectCode.4=दकà¥à¤·à¤¿à¤£ दिशा -AspectCode.5=दकà¥à¤·à¤¿à¤£-पशà¥à¤šà¤¿à¤® दिशा -AspectCode.6=पशà¥à¤šà¤¿à¤® दिशा -AspectCode.7=उतà¥à¤¤à¤°-पशà¥à¤šà¤¿à¤® दिशा -CollectEarthWindow.0=तà¥à¤°à¥à¤Ÿà¤¿ जब सीà¤à¤¸à¤µà¥€ फ़ाइल में डेटा निरà¥à¤¯à¤¾à¤¤ करने का पà¥à¤°à¤¯à¤¾à¤¸ -CollectEarthWindow.1=निरà¥à¤¯à¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.10=फ़ाइल -CollectEarthWindow.11=बाहर जाà¤à¤‚ -CollectEarthWindow.12=उपकरण -CollectEarthWindow.13=डेटा सीà¤à¤¸à¤µà¥€ निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.14=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ -CollectEarthWindow.15=गà¥à¤£ -CollectEarthWindow.16=मदद -CollectEarthWindow.17=असà¥à¤µà¥€à¤•रण -CollectEarthWindow.18=डेटाबेस में लापता भूखंडों खोजें -CollectEarthWindow.19=पृथà¥à¤µà¥€ इकटà¥à¤ à¤¾ -CollectEarthWindow.2=भाषा -CollectEarthWindow.20=डà¥à¤ªà¥à¤²à¤¿à¤•ेट रिकॉरà¥à¤¡ की संखà¥à¤¯à¤¾\: -CollectEarthWindow.21=मà¥à¤–à¥à¤¯ फà¥à¤°à¥‡à¤® के लिठआइकन नहीं मिल सकता है -CollectEarthWindow.22=आपको लगता है कि आप à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ बंद करना चाहते हैं? विंडोज बंद करने से, à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° बंद हो जाà¤à¤—ा -CollectEarthWindow.23=पà¥à¤·à¥à¤Ÿà¤¿ की जरूरत है -CollectEarthWindow.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.25=आप वैसे भी इन अभिलेखों को जोड़ना चाहते हैं और अपने वरà¥à¤¤à¤®à¤¾à¤¨ डेटा खोने के लिठकिलक करना चाहते हैं? -CollectEarthWindow.26=ऑपरेटर,पà¥à¤°à¤šà¤¾à¤²à¤• -CollectEarthWindow.27=अदà¥à¤¯à¤¤à¤¨ -CollectEarthWindow.28= औपन फौरिस à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° चल रहा होना चाहिठ, जबभी ऑपरेटर डेटा की वà¥à¤¯à¤¾à¤–à¥à¤¯à¤¾ करें . -CollectEarthWindow.29=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. -CollectEarthWindow.3= आयात संबंधी तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.30=जबभी आप गà¥à¤—ल अरà¥à¤¥ का उपयोग कर रहे हैं, कृपया इस विंडोज को खà¥à¤²à¥€ बनाठरखें. -CollectEarthWindow.31=à¤à¤•तà¥à¤° डेटा सीà¤à¤¸à¤µà¥€ फाइल में भेजें -CollectEarthWindow.32=छोड़ना -CollectEarthWindow.33=ऑपरेटर का नाम के 5 अकà¥à¤·à¤° से बड़ा और 50 अकà¥à¤·à¤° से कम होना चाहिठ-CollectEarthWindow.34=मानà¥à¤¯à¤¤à¤¾ तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.35=ऑपरेटर नाम खाली\!
कृपया ऑपरेटर का नाम भरें और "अदà¥à¤¯à¤¤à¤¨" बटन दबाà¤à¤. -CollectEarthWindow.36=ऑपरेटर नाम रिकà¥à¤¤ नहीं हो सकता -CollectEarthWindow.37=खà¥à¤²à¤¾ रखो -CollectEarthWindow.38=सीà¤à¤¸à¤µà¥€ फ़ाइल -CollectEarthWindow.39=सूचना\: यह सलाह दी जाती है कि आप नठडेटा डालने करने से पहले अपने मौजूदा आंकडों को बैकअप(à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤) कर लें -CollectEarthWindow.4=à¤à¤«à¤à¤“ असà¥à¤µà¥€à¤•रण नोटिस -CollectEarthWindow.40=उस फ़ोलà¥à¤¡à¤° पर जाà¤à¤‚ जहां साà¤à¤•ॠसरà¥à¤µà¤° में सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ किया गया है, फ़ोलà¥à¤¡à¤° का रासà¥à¤¤à¤¾ उपकरण> गà¥à¤£> उनà¥à¤¨à¤¤ टैब. -CollectEarthWindow.41=निरà¥à¤¯à¤¾à¤¤ डेटा को फ़ाइल में बचाया जा रहा है \: -CollectEarthWindow.42=छोड़ना -CollectEarthWindow.43=परसà¥à¤ªà¤° विरोधी रिकॉरà¥à¤¡ पाया -CollectEarthWindow.44=डेटा आयात / निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.45=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ डेटा (संकà¥à¤šà¤¿à¤¤) -CollectEarthWindow.46=ज़िप से नठडेटा आयात करें (संकà¥à¤šà¤¿à¤¤ à¤à¤•à¥à¤¸à¤à¤®à¤à¤²) -CollectEarthWindow.55=सीà¤à¤¸à¤µà¥€ का उपयोग कर मौजूदा रिकॉरà¥à¤¡ को अपडेट करें -CollectEarthWindow.47=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. -CollectEarthWindow.48=ज़िप / à¤à¤•तà¥à¤°-डेटा फ़ाइल -CollectEarthWindow.49=फà¥à¤¯à¥‚जन सीà¤à¤¸à¤µà¥€ फ़ाइल -CollectEarthWindow.5=बंद करे -CollectEarthWindow.50= उपयोगकरà¥à¤¤à¤¾ मैनà¥à¤…ल खोलें -CollectEarthWindow.51=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ के अदà¥à¤¯à¤¤à¤¨ के लिठजाà¤à¤š करें -CollectEarthWindow.52= अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— लॉग फ़ाइल खोलें -CollectEarthWindow.53=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ लॉग फ़ाइल -CollectEarthWindow.54=केà¤à¤®à¤à¤² से लोड अंक -CollectEarthWindow.56=के विषय में... -CollectEarthWindow.57=साà¤à¤•ॠसà¥à¤Ÿà¤¾à¤°à¥à¤Ÿà¤° पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ अभी भी चल रहा है, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें. -CollectEarthWindow.58=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ नहीं कर सकते -CollectEarthWindow.59=आप साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ के लिठडेटा सेट फिर से उतà¥à¤ªà¤¨à¥à¤¨ करने के लिठकरना चाहते हैं?
यह पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ समय लेने वाली हो सकती है.
आप यदि "हाà¤"पर कà¥à¤²à¤¿à¤• करें, तो नवीनतम जानकारी के साथ à¤à¤• नया डाटासेट उतà¥à¤ªà¤¨à¥à¤¨ हो जाà¤à¤—ा. -CollectEarthWindow.6=फà¥à¤¯à¥‚जन टेबल के लिठनिरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.60=साà¤à¤•ॠडेटा उतà¥à¤ªà¤¨à¥à¤¨ -CollectEarthWindow.61=डेटा à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ (पिछले निरà¥à¤¯à¤¾à¤¤ के बाद से संशोधित रिकॉरà¥à¤¡) -CollectEarthWindow.62=के विषय मे... -CollectEarthWindow.63=केà¤à¤®à¤à¤² से अंक पà¥à¤°à¤¾à¤ªà¥à¤¤ करने में तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.64=तकनीकी सहायता -CollectEarthWindow.7=डेटा आयात में तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.8=असà¥à¤µà¥€à¤•रण पाठ नहीं पाया जा सका -CollectEarthWindow.9=डेटा आयात रिकॉरà¥à¤¡ वह है जो कि पहले से ही अपने डेटाबेस पर मौजूद हैं शामिल. -DynamicsCode.0=पà¥à¤°à¤¾à¤°à¤‚भ में वन -DynamicsCode.1=पà¥à¤°à¤¾à¤°à¤‚भ में घास का मैदान, -DynamicsCode.2=पà¥à¤°à¤¾à¤°à¤‚भ में आबादी वाला इलाका -DynamicsCode.3=पà¥à¤°à¤¾à¤°à¤‚भ में बंजर -DynamicsCode.4=पà¥à¤°à¤¾à¤°à¤‚भ में आरà¥à¤¦à¥à¤° भूमि -DynamicsCode.5=पà¥à¤°à¤¾à¤°à¤‚भ में खेत -OpenTextFileListener.0=इस पाठ का फ़ाइल नहीं मिला \: -OptionWizard.0= विकलà¥à¤ª -OptionWizard.1=बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° चà¥à¤¨à¥‡à¤‚ -OptionWizard.10=बैकअप फ़ोलà¥à¤¡à¤° खोलें -OptionWizard.11=अजà¥à¤žà¤¾à¤¤\: उपयोग ifconfig -OptionWizard.12=गà¥à¤°à¤¾à¤¹à¤•ों का उलà¥à¤²à¥‡à¤– -OptionWizard.13=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° आईपी -OptionWizard.14=कतà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ (उदाहरण- 8023) -OptionWizard.15=बचाà¤à¤‚ और परिवरà¥à¤¤à¤¨ लागू करें -OptionWizard.16=आईडी -OptionWizard.17=X- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क -OptionWizard.18=Y- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क -OptionWizard.19=उठान -OptionWizard.2=कारà¥à¤¯à¤ªà¥à¤°à¤µà¤¾à¤¹ (सरà¥à¤µà¤° / गà¥à¤°à¤¾à¤¹à¤•) -OptionWizard.20=गूगल अरà¥à¤¥ अंतरà¥à¤µà¤¸à¥à¤¤à¥ बदल दिया गया है
यदि गà¥à¤—ल अरà¥à¤¥ आप से कहे,अंतरà¥à¤µà¤¸à¥à¤¤à¥ पà¥à¤¨à¤ƒ लोड सà¥à¤µà¥€à¤•ार करें . -OptionWizard.21=अदà¥à¤¯à¤¤à¤¨ सफल -OptionWizard.22=ढाल -OptionWizard.23=गूगल अरà¥à¤¥ डेटा को फिर से खोलने में कोई तà¥à¤°à¥à¤Ÿà¤¿ थी -OptionWizard.24=रदà¥à¤¦ करना -OptionWizard.25=ऑपरेशन मोड -OptionWizard.26=डीबी होसà¥à¤Ÿ -OptionWizard.27=यह à¤à¤• मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ साà¤à¤•ॠफ़ोलà¥à¤¡à¤° नहीं है ( सà¥à¤Ÿà¤¾à¤°à¥à¤Ÿ-साà¤à¤•à¥.batफ़ाइल मौजूद नहीं है) -OptionWizard.28=साà¤à¤•ॠसरà¥à¤µà¤° मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ नहीं -OptionWizard.29=डीबी पोरà¥à¤Ÿ -OptionWizard.3=सरà¥à¤µà¤° आवृतà¥à¤¤à¤¿ -OptionWizard.30=à¤à¤¸à¤•à¥à¤¯à¥ लाइट विकलà¥à¤ª -OptionWizard.31=सेमà¥à¤ªà¤² डेटा -OptionWizard.32=पà¥à¤²à¥‰à¤Ÿ लेआउट -OptionWizard.33=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ परिभाषा -OptionWizard.34=विकसित -OptionWizard.35=सेमà¥à¤ªà¤² अंक की संखà¥à¤¯à¤¾ -OptionWizard.36=सेमà¥à¤ªà¤² बिंदॠके बीच दूरी (मीटर में) -OptionWizard.37=भूखंड की सीमा के साथ मारà¥à¤œà¤¿à¤¨ (मीटर मे) -OptionWizard.38=सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सही ढंग से पढ़ा नहीं जा सकता.
इस फ़ाइल में à¤à¤• अलà¥à¤ªà¤µà¤¿à¤°à¤¾à¤® से अलग मूलà¥à¤¯à¥‹à¤‚ की उमà¥à¤®à¥€à¤¦ है \:
-OptionWizard.39=आईडी, वाई समनà¥à¤µà¤¯, à¤à¤•à¥à¤¸ समनà¥à¤µà¤¯, ऊंचाई, ढाल, पहलू -OptionWizard.4=वरà¥à¤¤à¤®à¤¾à¤¨ कंपà¥à¤¯à¥‚टर आईपी \: -OptionWizard.40=परियोजनाà¤à¤‚ -OptionWizard.41=à¤à¤• नई परियोजना फ़ाइल लोड करें -OptionWizard.42=सीà¤à¤¸à¤µà¥€ पाठक को बंद करते समय तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.43=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ का नाम -OptionWizard.44= सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ बैकअप डेटाबेस -OptionWizard.45=ओपन पृथà¥à¤µà¥€ इंजन ने पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° में जूम किया -OptionWizard.46=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठपृथà¥à¤µà¥€ इंजन टाइमलैपà¥à¤¸ खोलें -OptionWizard.47=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठबिंग मैपà¥à¤¸ खोलें -OptionWizard.48=बजाय गूगल अरà¥à¤¥ के फॉरà¥à¤® à¤à¤• बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° पर खोलें (लिनकà¥à¤¸ के लिठसिफारिश) -OptionWizard.49=भूखंड डेटा के साथ सीईडी / सीà¤à¤¸à¤µà¥€ फाइल भेजने के लिठपथ -OptionWizard.5=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ\: -OptionWizard.50=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.51=परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.52=केवल निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क के साथ सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल -OptionWizard.53=चौकोर -OptionWizard.54=केनà¥à¤¦à¥à¤°à¥€à¤¯ बिनà¥à¤¦à¥ -OptionWizard.55=परियोजना फ़ोलà¥à¤¡à¤° आयात तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.56=लोड परियोजना -OptionWizard.57=पहले से लोड परियोजना -OptionWizard.58= जी ई ई का मैदान खोलें (विशà¥à¤µà¤¸à¤¨à¥€à¤¯ जांचकरà¥à¤¤à¤¾ के उपयोग की आवशà¥à¤¯à¤•ता है) -OptionWizard.59=यहां भूखंड पर केंदà¥à¤°à¤¿à¤¤ मैपà¥à¤¸ खोलें -OptionWizard.6=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² डीबी मापदंड -OptionWizard.65=साà¤à¤•à¥à¤«à¤¼à¥‹à¤²à¥à¤¡à¤° का पथ -OptionWizard.66=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.67=फ़ायरफ़ॉकà¥à¤¸ निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ -OptionWizard.68=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.7=उपयोगकरà¥à¤¤à¤¾ नाम -OptionWizard.70=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों -OptionWizard.72=बाइनरी फ़ाइलें -OptionWizard.73=कà¥à¤°à¥‹à¤® निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ -OptionWizard.74=बà¥à¤°à¤¾à¤‰à¤œ -OptionWizard.76=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों -OptionWizard.78=बाइनरी फ़ाइलें -OptionWizard.79=केà¤à¤®à¤à¤² फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ के लिठपथ -OptionWizard.8=पासवरà¥à¤¡ -OptionWizard.80=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.82=फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ -OptionWizard.83=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ पà¥à¤°à¤ªà¤¤à¥à¤° डिज़ाइन करने के लिठपथ -OptionWizard.84=बà¥à¤°à¤¾à¤‰à¤œ..... -OptionWizard.86=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² वेब पेज -OptionWizard.87=पथ आइडीà¤à¤® परिभाषा के साथ à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठ-OptionWizard.88=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.9=डीबी नाम -OptionWizard.90=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² आइडीà¤à¤® परिभाषा -OptionWizard.91=सरà¥à¤µà¤° (पà¥à¤°à¤¬à¤‚धक संसà¥à¤•रण या खड़े अकेले का उपयोग करें) -OptionWizard.92=कà¥à¤²à¤¾à¤‡à¤‚ट (ऑपरेटर / सरà¥à¤µà¤° से जà¥à¤¡à¤¼à¥‡) -OptionWizard.93=सकà¥à¤¯à¥‚à¤à¤²à¤¾à¤‡à¤Ÿ (à¤à¤‚बेडेड / à¤à¤•ल फाइल आधारित) -OptionWizard.94=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² -OptionWizard.95=सेमà¥à¤ªà¤² डॉटà¥à¤¸ के साइड (मीटर में) -SaikuAnalysisListener.0=हाठ- ताज़ा साà¤à¤•ॠडेटा (लंबी पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾) -SaikuAnalysisListener.1=नहीं - बस साà¤à¤•ॠशà¥à¤°à¥‚ -SaikuStarter.1=साà¤à¤•ॠशà¥à¤°à¥‚ -SaikuStarter.2= साà¤à¤•ॠशà¥à¤°à¥‚ कà¥à¤› मिनट लग सकते हैं, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें\! -SaveEarthDataServlet.0=खाली अनà¥à¤°à¥‹à¤§ -SaveEarthDataServlet.1= डेटाबेस में डेटा बचाते समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ है -SaveEarthDataServlet.2=डेटा बचाया था -SlopeCode.0=समतल (0-5) -EarthApp.11=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ पहले से ही चल रहा है -EarthApp.21=à¤à¤• सीà¤à¤¸à¤µà¥€ / सीईडी के रूप में भूखंडों की गà¥à¤°à¤¿à¤¡ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
-EarthApp.23=कोई सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सेट-अप नहीं किया गया है \:

-EarthApp.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² परिभाषा के साथ फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है \:
-EarthApp.26=कोई à¤à¤•à¥à¤¸à¤à¤®à¤à¤² फ़ाइल परिभाषा सेट अप नहीं किया गया है \:

-EarthApp.27=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ रूप से यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
-EarthApp.29=कोई à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ फ़ाइल सेट-अप नहीं किया गया है \:

-EarthApp.3=मà¥à¤à¥‡ बाद में याद दिलाना -EarthApp.30=उपकरण> गà¥à¤£ मेनू में फ़ाइल सà¥à¤¥à¤¾à¤¨ को ठीक करें . -EarthApp.4=अभी अदà¥à¤¯à¤¤à¤¨ करें -EarthApp.5=मà¥à¤à¥‡ दà¥à¤¬à¤¾à¤°à¤¾ याद मत दिलाना -EarthApp.57=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ का à¤à¤• नया संसà¥à¤•रण उपलबà¥à¤§ है\!
आप कैसे आगे बढ़ना चाहते हैं? -EarthApp.58=अदà¥à¤¯à¤¤à¤¨ चेतावनी -EarthApp.59= परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ -EarthApp.6=\ - संसà¥à¤•रण -EarthApp.61=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ फाइल खà¥à¤² नहीं सकती .
कृपया सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करें कि गूगल अरà¥à¤¥ सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ है. -EarthSurveyService.9=आवशà¥à¤¯à¤• कà¥à¤·à¥‡à¤¤à¥à¤° -ExportActionListener.1= तारीख चूनें जबसे रिकॉरà¥à¤¡ निरà¥à¤¯à¤¾à¤¤ करने है -ExportDialogProcessMonitor.0=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... -ExportDialogProcessMonitor.1=पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ पà¥à¤°à¤¾à¤°à¤‚भ करने के लिठपà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ कर रहा है \: -ExportDialogProcessMonitor.4=निरà¥à¤¯à¤¾à¤¤ रिकॉरà¥à¤¡\: -ImportProcessMonitorDialog.0=आयातित रिकॉरà¥à¤¡ \: -ImportActionListener.0=कà¥à¤¯à¤¾ उन भूखंडों के लिठडेटा जो कि पूरी तरह से भरे नहीं गठ,आयातित किया जाना चाहिà¤? -ImportActionListener.2=आप कà¥à¤²à¤¿à¤• करें, नहींतो केवल डेटा "हरी" राजà¥à¤¯ में भूखंडों से ,जिसमें सभी डेटा यà¥à¤•à¥à¤¤ है , आयात किया जाà¤à¤—ा। -ImportDialogProcessMonitor.0=\ गणना -ImportDialogProcessMonitor.11=रिकॉरà¥à¤¡ की पà¥à¤°à¤¾à¤°à¤‚भिक संखà¥à¤¯à¤¾ \: -ImportDialogProcessMonitor.2=रिकॉरà¥à¤¡ आयात... -ImportDialogProcessMonitor.5=आयातित रिकॉरà¥à¤¡ की वासà¥à¤¤à¤µà¤¿à¤• संखà¥à¤¯à¤¾ \: -ImportDialogProcessMonitor.8=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... -InfiniteProgressMonitor.0=रदà¥à¤¦ ऑपरेशन -JFileChooserExistsAware.0=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ परियोजना फ़ाइल -KmlImportService.13=पà¥à¤²à¥‰à¤Ÿ सà¥à¤¥à¤¾à¤¨à¥‹à¤‚ को बचाने के लिठà¤à¤• सीà¤à¤¸à¤µà¥€ फ़ाइल का चयन करें -MissingPlotsListener.0=तà¥à¤°à¥à¤Ÿà¤¿ उन भूखंडों के बारे में जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ करने के लिठजो डेटाबेस पर मौजूद नहीं -MissingPlotsListener.1=गà¥à¤® भूखंड -MissingPlotsListener.10=सेमà¥à¤ªà¤² डिजाइन में भूखंडों की कà¥à¤² संखà¥à¤¯à¤¾ \: -MissingPlotsListener.12=गà¥à¤® भूखंडों की संखà¥à¤¯à¤¾ \: -MissingPlotsListener.14=सभी भूखंडों भर रहे हैं\! -MissingPlotsListener.2=कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ अंतरà¥à¤µà¤¸à¥à¤¤à¥ की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ -MissingPlotsListener.3=भूखंड की जानकारी वाले फ़ाइलें चà¥à¤¨à¥‡à¤‚ ( .सीà¤à¤¸à¤µà¥€ या .सीईडी फ़ाइलें ) जिसके लिठआप जानना चाहते हैं तो सभी डेटा भर दिया गया है चाहता हूà¤. -MissingPlotsListener.4=गà¥à¤® भूखंड- जानकारी -MissingPlotsListener.5=फ़ाइल से \: -MissingPlotsListener.6=सीà¤à¤¡à¥€ फ़ाइल में निरà¥à¤¯à¤¾à¤¤ करें -ProcessMonitorDialog.1=पंकà¥à¤¤à¤¿ संखà¥à¤¯à¤¾ पर तà¥à¤°à¥à¤Ÿà¤¿ -ProcessMonitorDialog.4=, कॉलम -ProcessMonitorDialog.5=\ --मूलà¥à¤¯ -YES= हां -YES_TO_ALL=सब को हां -NO=नहीं -NO_TO_ALL=सभी को नहीं +AboutDialog.19 = ບັນ​ຫາ​ເàºàºµàº” A +AboutDialog.5 = ສà»àº²â€‹àº¥àº±àºšâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹à»€àºžàºµà»ˆàº¡â€‹à»€àº•ີມ​ໄດ້​ທີ່ OpenForis.org ເວັບ​ໄຊ​ທ​໌​ຂອງ​ພວàºâ€‹à»€àº®àº»àº² +AboutDialog.6 = ຂà»â€‹à»‚ທດ​ນà»àº²â€‹, ບັນ​ຫາ​ທີ່​ເàºàºµàº”​ຂຶ້ນ​ໃນ​ຂະ​ນະ​ທີ່​ຄວາມ​ພະ​àºàº²â€‹àºàº²àº¡â€‹àº—ີ່​ຈະ​ເປີດ​àºàº²àº™â€‹à»€àºŠàº·à»ˆàº­àº¡â€‹àº•à»à»ˆâ€‹àº™àºµà»‰â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹àº¥àº°â€‹àºšàº»àºšâ€‹àº‚ອງ​ທ່ານ​ຕົວ​ທ່ອງ​ເວັບ​ຂອງ​ມາດ​ຕະ​ຖານ​. +AboutDialog.8 = Ok +AspectCode.0 = ເຫນືອ +AspectCode.1 = ວັນ​ອອàºâ€‹àºªà»ˆàº½àº‡â€‹à»€àº«àº™àº·àº­ +AspectCode.2 = ຕາ​ເວັນ​ອອຠ+AspectCode.3 = ພາàºâ€‹à»ƒàº•້​, ຕາ​ເວັນ​ອອຠ+AspectCode.4 = ໃຕ້ +AspectCode.5 = ພາàºâ€‹à»ƒàº•້​, ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ+AspectCode.6 = ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ+AspectCode.7 = ພາàºâ€‹à»€àº«àº™àº·àº­â€‹, ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ+CollectEarthWindow.0 = ໃນ​ເວ​ລາ​ທີ່​ພະ​àºàº²â€‹àºàº²àº¡â€‹à»€àºžàº·à»ˆàº­â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌ CSVຄວາມ​ຜິດ​ພາດ +CollectEarthWindow.1 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àº +CollectEarthWindow.10 File \= +CollectEarthWindow.11 ອອàºâ€‹àºˆàº²àº \= +CollectEarthWindow.12 = ເຄື່ອງ​ມືຂà»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.13 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ CSV àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ +CollectEarthWindow.14 = Start SAIKU +CollectEarthWindow.15 = ຄຸນ​ສົມ​ບັດ +CollectEarthWindow.16 = ຊ່ວàºâ€‹à»€àº«àº¼àº·àº­ +CollectEarthWindow.17 = ປະ​ຕິ​ເສດ +CollectEarthWindow.18 = ຄົ້ນ​ຫາ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ຫາàºâ€‹à»„ປ​ໃນ​ຖານ​ຂà»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.19 = ເàºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ+CollectEarthWindow.2 = ພາ​ສາ +CollectEarthWindow.20 = ຈà»àº²â€‹àº™àº§àº™â€‹àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™ duplicated​\: +CollectEarthWindow.21 = ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ຊອàºâ€‹àº«àº² icon ສà»àº²â€‹àº¥àº±àºšâ€‹àºžàº²â€‹àº•ົ້ນ​ຕ໠+CollectEarthWindow.22 = ທ່ານ​ມີ​ຄວາມ​à»àº™à»ˆâ€‹à»ƒàºˆàº§à»ˆâ€‹àº²â€‹àº—່ານ​ຕ້ອງ​àºàº²àº™â€‹àº›àº´àº”​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹? ໃນ​àºàº²àº™â€‹àº›àº´àº”​ປ່ອງ​ຢ້ຽມ​àºàº±àº‡â€‹àºˆàº°â€‹àº›àº´àº”​ເຄື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹àº‚ອງ​ໂລàºâ€‹à»„ດ້​ເàºàº±àºšâ€‹àºà»àº² +CollectEarthWindow.23 = àºàº²àº™â€‹àº¢àº±à»‰àº‡â€‹àº¢àº·àº™â€‹àº—ີ່​ຈà»àº²â€‹à»€àº›àº±àº™ +CollectEarthWindow.24 = XML ສົ່ງ​ອອຠ+CollectEarthWindow.25 = ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ເພີ່ມ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹à»€àº«àº¼àº»à»ˆàº²â€‹àº™àºµà»‰â€‹à»àº¥à»‰àº§â€‹à»àº¥àº°â€‹àºàº²àº™â€‹àºªàº¹àº™â€‹à»€àºªàºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº‚ອງ​ທ່ານ​? +CollectEarthWindow.26 = ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™ +CollectEarthWindow.27 = ປັບ​ປຸງ +CollectEarthWindow.28 = ເຮັດ​ຢູ່​ຕ່າງ​ປະ​ເທດ​ເàºàº±àºšâ€‹àºà»àº²â€‹à»€àº„ື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹àº„ວນ​ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹à»àº¥à»ˆàº™â€‹à»ƒàº™â€‹àº‚ະ​ນະ​ທີ່​ຜູ້​ປະ​àºàº­àºšâ€‹àºàº²àº™â€‹àº•ີ​ຄວາມ​ຫມາàºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹. +CollectEarthWindow.29 = The Saiku Server ບà»à»ˆâ€‹à»„ດ້​ຖືàºâ€‹àº•ັ້ງ​. +CollectEarthWindow.3 = \ ຄວາມ​ຜິດ​ພາດ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ +CollectEarthWindow.30 = àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº®àº±àºâ€‹àºªàº²â€‹àºàº²àº™â€‹à»€àº›àºµàº”​ຫນ້າ​ຕ່າງ​ນີ້​ໃນ​ຂະ​ນະ​ທີ່​ທ່ານ​àºà»àº²â€‹àº¥àº±àº‡â€‹à»ƒàºŠà»‰â€‹àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹. +CollectEarthWindow.31 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌ CSV +CollectEarthWindow.32 = ອອຠ+CollectEarthWindow.33 = ຊື່​ຜູ້​ປະ​àºàº­àºšâ€‹àºàº²àº™â€‹àºˆàº°â€‹àº•້ອງ​ມີ​àºàº²àº™â€‹àº•à»à»ˆâ€‹à»„ປ​ອີàºâ€‹à»àº¥à»‰àº§â€‹àºâ€‹à»ˆâ€‹àº§àº² 5 ລັàºâ€‹àºªàº°â€‹àº™àº°â€‹à»àº¥àº°â€‹àºªàº±à»‰àº™â€‹àºâ€‹à»ˆâ€‹àº§àº² 50ຄວາມ​ຜິດ​ພາດ +CollectEarthWindow.34 = àºàº§àº”​ສອບ +CollectEarthWindow.35 = ຜູ້​ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹àº¥àº»àºšâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™ ​\! ຫລັàºâ€‹àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº•ື່ມ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàºªà»ˆâ€‹àºŠàº·à»ˆâ€‹àºœàº¹à»‰â€‹àº›àº°â€‹àºàº­àºšâ€‹àºàº²àº™â€‹à»àº¥àº°â€‹à»ƒàº«à»‰â€‹àºàº»àº”​ປຸ່ມ "ປັບ​ປຸງ​"​. ຊື່ +CollectEarthWindow.36 = ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹àºšà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ເປົ່າ +CollectEarthWindow.37 = ຮັàºâ€‹àºªàº²â€‹àºˆàº±àº™à»„ຟລ​໌ +CollectEarthWindow.38 = CSV +CollectEarthWindow.39 à»àºˆà»‰àº‡ \= ມັນ​ເປັນ​àºàº²àº™â€‹àºªàº»àº¡â€‹àº„ວນ​ທີ່​ທ່ານ​ໄປ​ເຖິງ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº‚ອງ​ທ່ານ (àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ XML​) àºà»ˆàº­àº™â€‹àº—ີ່​ຈະ​ໄດ້​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº«àº¡à»ˆâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ +CollectEarthWindow.4 = FAO à»àºˆà»‰àº‡â€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ເສດ +CollectEarthWindow.40 = ທີ່​àºà»àº²â€‹àº™àº»àº”​ໄວ້​ຕາມ​ເສັ້ນ​ທາງ​àºàº±àºšâ€‹à»‚ຟນ​ເດີ​ທີ່ Saiku Server ໄດ້​ຖືàºâ€‹àº•ິດ​ຕັ້ງ​ຢູ່​ໃນ Tools-> Properties-> à»àº–ບ​à»àºšàºšâ€‹àºžàº´â€‹à»€àºªàº”​ໄດ້​. +CollectEarthWindow.41 = àºàº²àº™â€‹àº›àº°â€‹àº«àºàº±àº”​àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌​\: +CollectEarthWindow.42 = ອອຠ+CollectEarthWindow.43 = àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº•à»àº²â€‹àºàº±àº™â€‹àº—ີ່​ພົບ​ເຫັນ +CollectEarthWindow.44 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ / ສົ່ງ​ອອàºàº‚à»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.45 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ XML (à»àº›â€‹)ຂà»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.46 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ໃຫມ່​ຈາàºâ€‹à»„ປ​ສະ​ນີ (XML à»àº›â€‹)àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™ +CollectEarthWindow.55 ປັບ​ປຸງ \= àºàº²àº™â€‹àº™à»àº²â€‹à»ƒàºŠà»‰ CSV +CollectEarthWindow.47 = Saiku Server ບà»à»ˆâ€‹à»„ດ້​àºà»àº²â€‹àº«àº™àº»àº” +CollectEarthWindow.48 = ໄຟລ​໌​ຫັດ​ໄປ​ສະໄຟລ​໌ +CollectEarthWindow.49 = Fusion CSV +CollectEarthWindow.5 = ປິດ +CollectEarthWindow.50 = ເປີດ​ຄູ່​ມື​àºàº²àº™â€‹à»ƒàºŠà»‰àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™â€‹àº›àº±àºšâ€‹àº›àº¸àº‡â€‹àº‚ອງ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ+CollectEarthWindow.51 CHECK \= àºàº§àº”​ສອບ +CollectEarthWindow.52 = File ເຂົ້າ​ສູ່​ລະ​ບົບ​ຄà»àº²â€‹àº®à»‰àº­àº‡â€‹àºªàº°â€‹àº«àº¡àº±àºâ€‹à»€àº›àºµàº” +CollectEarthWindow.53 = àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»€àº­â€‹àºàº°â€‹àºªàº²àº™â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹à»€àº‚ົ້າ​ສູ່​ລະ​ບົບຈຸດ +CollectEarthWindow.54 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຈາຠKMLàºà»ˆàº½àº§â€‹àºàº±àºš +CollectEarthWindow.56 = ... +CollectEarthWindow.57 = ຂະ​ບວນ​àºàº²àº™â€‹à»€àº¥àºµà»ˆàº¡â€‹àº•ົ້ນ Saiku à»àº¡à»ˆàº™â€‹àºàº±àº‡â€‹à»àº¥à»ˆàº™â€‹, àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº¥à»â€‹àº–້າ​. +CollectEarthWindow.58 = ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ເລີ່ມ​ຕົ້ນ​àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ Saiku +CollectEarthWindow.59 = ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ Re​\: àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ Saiku ໄດ້​?
ຂະ​ບວນ​àºàº²àº™â€‹àº™àºµà»‰â€‹àºªàº²â€‹àº¡àº²àº”​ໃຊ້​ເວ​ລາ​ຫຼາàº
ຖ້າ​ທ່ານ​ຄລິàºâ€‹à»ƒàºªà»ˆ "à»àº¡à»ˆàº™â€‹à»àº¥à»‰àº§â€‹" ເປັນ​ຊຸດ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໃຫມ່​ທີ່​ມີ​ຄວາມ​ຫຼ້າ​ສຸດ​ໄດ້​. ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº‚ຶ້ນ​. +CollectEarthWindow.6 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ Fusion ຕາ​ຕະ​ລາງàºàº²àº™â€‹àºœàº°â€‹àº¥àº´àº”​ຂà»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.60 = Saiku +CollectEarthWindow.61 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່ XML (àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº”ັດ​à»àºà»‰â€‹àº™àº±àºšâ€‹àº•ັ້ງ​à»àº•່​àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àºªàº¸àº”​ທ້າàºâ€‹) ສົ່ງ​ອອàºàºà»ˆàº½àº§â€‹àºàº±àºš +CollectEarthWindow.62 = ... +CollectEarthWindow.63 Error \= àºàº²àº™â€‹à»„ດ້​ຮັບ​ຈຸດ​ທີ່​ໄດ້​ຈາຠKML +CollectEarthWindow.64 = ສະ​ຫນັບ​ສະ​ຫນູນ​ທາງ​ເທàºâ€‹àº™àº´àº +CollectEarthWindow.7 Error \= ໃນ​ເວ​ລາ​ທີ່​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຂà»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.8 ຂà»à»‰â€‹àº„ວາມ​ປະ​ຕິ​ເສດ \= ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ພົບ​ເຫັນ +CollectEarthWindow.9 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໄດ້​ນà»àº²â€‹à»€àº‚ົ້າ​ມາ​ປະ​àºàº­àºšâ€‹àº”້ວàºâ€‹àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àº—ີ່​ມີ​ຢູ່​à»àº¥à»‰àº§â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚ອງ​ທ່ານ​. +DynamicsCode.0 = ປ່າ​ໄມ້​ໃນ​ເບື້ອງ​ຕົ້ນ +DynamicsCode.1 = ທົ່ງ​ຫàºà»‰àº²â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ +DynamicsCode.2 = àºàº²àº™â€‹àº•ັ້ງ​ຖິ່ນ​ຖານ​ໃນ​ເບື້ອງ​ຕົ້ນ +DynamicsCode.3 = ເບື້ອງ​ຕົ້ນ Otherland +DynamicsCode.4 = ຊຸ່ມ​ນ​້​à»àº²â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ +DynamicsCode.5 = ເບື້ອງ​ຕົ້ນ Cro​​pland +OpenTextFileListener.0 = ໄຟລ​໌​ຂà»à»‰â€‹àº„ວາມ​à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹à»„ດ້​ພົບ​ໄດ້​ທີ່​\:àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +OptionWizard.0 = ທາງ​ເລືອàºâ€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ+OptionWizard.1 = ເລືອàºâ€‹àº‚ອງ​ຕົວ​ທ່ອງ​ເວັບ +OptionWizard.10 = ໂຟ​ເດີ​ສà»àº²â€‹àº®àº­àº‡â€‹àºˆàº±àº™ +OptionWizard.11 = ບà»à»ˆâ€‹àº®àº¹à»‰â€‹àºˆàº±àºâ€‹\: àºàº²àº™â€‹àº™à»àº²â€‹à»ƒàºŠà»‰ ifconfig +OptionWizard.12 = ລູàºâ€‹àº„້າ​ຕົວ​ຢ່າງàºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +OptionWizard.13 = ໂລຠIP Serveràºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +OptionWizard.14 = port ໂລຠServer (ຕົວ​ຢ່າງ​\: 8023​) +OptionWizard.15 = ບັນ​ທຶàºâ€‹à»àº¥àº°â€‹à»ƒàºŠà»‰â€‹àºàº²àº™â€‹àº›à»ˆàº½àº™â€‹à»àº›àº‡ +OptionWizard.16 = ລະ​ຫັດ +OptionWizard.17 = X​-coord +OptionWizard.18 = Y coord​, +OptionWizard.19 = àºàº²àº™â€‹àºàº»àºâ€‹àº¥àº°â€‹àº”ັບ +OptionWizard.2 = ບວນ​àºàº²àº™â€‹à»€àº®àº±àº”​ວຽຠ(server / ລູàºâ€‹àº„້າ​) +OptionWizard.20 = ໄດ້​ເນື້ອ​ໃນ​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»„ດ້​ມີ​àºàº²àº™â€‹àº›à»ˆàº½àº™â€‹à»àº›àº‡â€‹.
àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº®àº±àºšâ€‹à»‚ຫລດ​ເນື້ອ​ຫາ​ໃນ​ເວ​ລາ​ທີ່​ທ່ານ​àºà»àº²â€‹àº¥àº±àº‡â€‹àº®àº±àºšâ€‹àºàº²àº™â€‹àºàº°â€‹àº•ຸ້ນ​ໂດàºâ€‹àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹. +OptionWizard.21 = ປັບ​ປຸງ​ສົບ​ຜົນ​ສà»àº²â€‹à»€àº¥àº±àº” +OptionWizard.22 = ຄ້ອຠ+OptionWizard.23 = ມີ​ຄວາມ​ຜິດ​ພາດ​ໃນ​ເວ​ລາ Re​\: ເປີດ​ໄດ້​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»€àº›àº±àº™â€‹à»„ດ້àºàº»àºâ€‹à»€àº¥àºµàºâ€‹àºàº²àº™ +OptionWizard.24 = àºàº»àºà»€àº¥àºµàºàºàº²àº™ +OptionWizard.25 = ຮູບ​à»àºšàºšâ€‹àºàº²àº™â€‹àº”à»àº²â€‹à»€àº™àºµàº™â€‹àº‡àº²àº™ +OptionWizard.26 = àºàº²àº™â€‹à»€àº›àº±àº™â€‹à»€àºˆàº»à»‰àº²â€‹àºžàº²àºš DB +OptionWizard.27 = ນີ້​ບà»à»ˆâ€‹à»„ດ້​ເປັນ​ທີ່​àºàº­àº¡â€‹àº®àº±àºš Saiku Folder (ເອ​àºàº°â€‹àºªàº²àº™â€‹à»€àº¥àºµà»ˆàº¡ saiku.bat ບà»à»ˆâ€‹à»àº¡à»ˆàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹) +OptionWizard.28 = Saiku Server ບà»à»ˆâ€‹àº®àº­àº‡â€‹àº®àº±àºš +OptionWizard.29 = ພ໠DB +OptionWizard.3 = Server ຕົວ​ຢ່າງ +OptionWizard.30 = ທາງ​ເລືອຠSQLite +OptionWizard.31 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº•ົວ​ຢ່າງ +OptionWizard.32 = ຮູບ​à»àºšàºšâ€‹àº”ິນ​ຕອນ +OptionWizard.33 = ສà»àº²â€‹àº«àº¼àº§àº”​ນຸ​àºàº»àº¡ +OptionWizard.34 = à»àºšàºšâ€‹àºžàº´â€‹à»€àºªàº” +OptionWizard.35 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ຈຸດ​ຕົວ​ຢ່າງ +OptionWizard.36 = ໄລ​àºàº°â€‹àº—າງ​ລະ​ຫວ່າງ​ຈຸດ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àº•ົວ​ຢ່າງ (ໃນ​ຕາ​) +OptionWizard.37 = ອັດ​ຕາ​ທີ່​ມີ​ຊາàºâ€‹à»àº”ນ​ດິນ​ຕອນ (à»àº¡àº±àº”​) +OptionWizard.38 = ໄຟລ​໌ CSV / CED ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ອ່ານ​ໄດ້​ຢ່າງ​ຖືàºâ€‹àº•້ອງ
ເອ​àºàº°â€‹àºªàº²àº™â€‹à»„ດ້​ຖືàºâ€‹àº„າດ​ວ່າ​ຈະ​ມີ​ມູນ​ຄ່າ​àºàº²àº™â€‹à»àºàºâ€‹àºˆàº¸â€‹àº¥àº°â€‹àºžàº²àºâ€‹à»€àºŠàº±à»ˆàº™â€‹àº™àºµà»‰â€‹\:​.
+OptionWizard.39 = ລະ​ຫັດ​, YCoordinate​, XCoordinate​, ພູ​, ລັàºâ€‹àºªàº°â€‹àº™àº° +OptionWizard.4 = IP ຄອມ​ພິວ​ເຕີ​ປັດ​ຈຸ​ບັນ​\: +OptionWizard.40 = ໂຄງ​àºàº²àº™ +OptionWizard.41 = ໂຫຼດ​ໄຟລ​໌​ໂຄງ​àºàº²àº™â€‹à»ƒàº«àº¡à»ˆ +OptionWizard.42 = ຜິດ​ພາດ​ໃນ​ເວ​ລາ​ປິດ​àºàº²àº™â€‹àº­à»ˆàº²àº™ CSV +OptionWizard.43 = ຊື່​ຂອງ​àºàº²àº™â€‹àºªà»àº²â€‹àº«àº¼àº§àº” +OptionWizard.44 = ຖານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ປ​ໃຫ້​ເຖິງ​ອັດ​ຕະ​ໂນ​ມັດ​ທີ່ +OptionWizard.45 = Open Earth Engine ຊູມ​ເຂົ້າ​ໄປ​ໃນ​ເຂດ​ຕອນ​ດິນ​ຂອງ​ຕົນ +OptionWizard.46 = timelapse ຈັàºâ€‹à»€àº›àºµàº”​ໂລàºâ€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºžàº·à»‰àº™â€‹àº—ີ່​ຕອນ​ດິນ​ຂອງ​ຕົນ +OptionWizard.47 = Open à»àºœàº™ Bing ສà»àº²â€‹àº¥àº±àºšâ€‹àºžàº·à»‰àº™â€‹àº—ີ່​ຕອນ​ດິນ​ຂອງ​ຕົນ +OptionWizard.48 = ຮູບ​à»àºšàºšâ€‹à»€àº›àºµàº”​ໃນ​ຕົວ​ທ່ອງ​ເວັບ​ຂອງ​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»„ດ້ (à»àº™àº°â€‹àº™à»àº²â€‹à»ƒàº«à»‰â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™ LINUX​) +OptionWizard.49 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™ Ced / csv ໄຟລ​໌​ທີ່​ມີ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº•ອນ​ດິນ​ຂອງ​ຕົນàºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +OptionWizard.5 = port ໂລຠServer​\: +OptionWizard.50 = Browse ... +OptionWizard.51 = ເອ​àºàº°â€‹àºªàº²àº™â€‹à»‚ຄງ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຜິດ​ພາດ +OptionWizard.52 = CSV / ເອ​àºàº°â€‹àºªàº²àº™ Ced ມີ​àºàº²àº™â€‹àº›àº°â€‹àºªàº²àº™â€‹àº‡àº²àº™â€‹à»€àº—ົ່າ​ນັ້ນ +OptionWizard.54 = ຈຸດ​ສູນ​àºàº²àº‡ +OptionWizard.55 = Error ໂຟນ​ເດີ​ໂຄງ​àºàº²àº™â€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ +OptionWizard.56 = ໂຄງ​àºàº²àº™ Load +OptionWizard.57 = ໂຄງ​àºàº²àº™ loaded àºà»ˆàº­àº™â€‹àº«àº™à»‰àº²â€‹àº™àºµà»‰ +OptionWizard.58 = Open GEE Code Editor (ຮຽàºâ€‹àº®à»‰àº­àº‡â€‹à»ƒàº«à»‰â€‹àº¡àºµâ€‹àºàº²àº™â€‹à»€àº‚ົ້າ​ເຖິງ Tester Trusted​) +OptionWizard.59 = Open ທີ່​ນີ້​à»àºœàº™â€‹àº—ີ່​ສຸມ​ໃສ່​ຕອນ​ດິນ​ຂອງ​ຕົນ +OptionWizard.6 = ຕົວ​àºà»àº²â€‹àº™àº»àº”​àºàº²àº™ PostgreSQL DB +OptionWizard.65 = ເສັ້ນ​ທາງ​àºàº±àºšâ€‹à»‚ຟນ​ເດີ​ທີ່ Saiku +OptionWizard.66 = Browse ... +OptionWizard.67 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ບັດ​àºàº²àº™ Firefox +OptionWizard.68 = Browse ... +OptionWizard.7 = ຊື່​ຜູ້​ໃຊ້ +OptionWizard.70 = àºàº²àº™â€‹àºšà»â€‹àº¥àº´â€‹àº«àº²àº™â€‹à»„ຟ +OptionWizard.72 = ໄຟລ​໌​ຖານ​ສອງ +OptionWizard.73 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ບັດ​àºàº²àº™ Chrome +OptionWizard.74 = Browse ... +OptionWizard.76 = àºàº²àº™â€‹àºšà»â€‹àº¥àº´â€‹àº«àº²àº™â€‹à»„ຟ +OptionWizard.78 = ໄຟລ​໌​ຖານ​ສອງ +OptionWizard.79 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹à»àºšàºš KML Freemarker +OptionWizard.8 = ລະ​ຫັດ​ຜ່ານ +OptionWizard.80 = Browse ... +OptionWizard.82 = à»àº¡à»ˆâ€‹à»àºšàºš Freemarker +OptionWizard.83 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº­àº­àºâ€‹à»àºšàºšâ€‹àº®àº¹àºšâ€‹à»àºšàºš HTML ປູມ​ເປົ້າ +OptionWizard.84 = Browse ... +OptionWizard.86 = HTML webpage +OptionWizard.87 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™ XML àºàº±àºšâ€‹àº„à»àº²â€‹àº™àº´â€‹àºàº²àº¡ IDM +OptionWizard.88 = Browse ... +OptionWizard.9 = ຊື່ DB +OptionWizard.90 = ຫມາຠIDM XML +OptionWizard.91 = Server (ສະ​ບັບ​ຜູ້​ຈັດ​àºàº²àº™â€‹àº«àº¼àº·â€‹àº¢àº·àº™â€‹àº¢àº¹à»ˆâ€‹àº„ົນ​ດຽວ​ໃຊ້​) +OptionWizard.92 = ລູàºâ€‹àº„້າ (ປະ​ຕິ​ບັດ​àºàº²àº™ / àºàº²àº™â€‹à»€àºŠàº·à»ˆàº­àº¡â€‹àº•à»à»ˆâ€‹àºàº±àºšâ€‹à»€àº„ື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹) +OptionWizard.93 = SQLite (à»àºšàºšâ€‹àºàº±àº‡ / ໄຟລ​໌​ດຽວ​ຕາມ​) +OptionWizard.94 = PostgreSQL +SaikuAnalysisListener.0 = à»àº¡à»ˆàº™ - ຂà»à»‰â€‹àº¡àº¹àº™ Refresh Saiku (ຂະ​ບວນ​àºàº²àº™â€‹àºàº²àº§â€‹) +SaikuAnalysisListener.1 = ບà»à»ˆ - ພຽງ​à»àº•່​ເລີ່ມ​ຕົ້ນ Saiku +SaikuStarter.1 = ເລີ່ມ Saiku +SaikuStarter.2 = u0EC0ລີ່ມ Saiku ສາ​ມາດ​ໃຊ້​ເວ​ລາ​ນາ​ທີ \= àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº¥à»â€‹àº–້າ ​\! +SaveEarthDataServlet.0 = àºàº²àº™â€‹àº®à»‰àº­àº‡â€‹àº‚à»â€‹à»€àº›àº»à»ˆàº² +SaveEarthDataServlet.1 = ບັນ​ຫາ​ທີ່​ເàºàºµàº”​ຂຶ້ນ​ໃນ​ຂະ​ນະ​ທີ່​ປະ​ຢັດ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ດ້ +SaveEarthDataServlet.2 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໄດ້​ບັນ​ທືຠ+SlopeCode.0 = ລຽບ (0-5​)àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +EarthApp.11 = ໃນ​ທົ່ວ​ໂລàºâ€‹à»àº¡à»ˆàº™â€‹à»àº¥à»‰àº§â€‹à»àº¥à»ˆàº™ +EarthApp.21 = ໄຟ​ທີ່​ມີ​ຕາ​ຂ່າàºâ€‹à»„ຟ​ຟ້າ​ຂອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ເປັນ CSV / CED à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹àºžàº»àºšâ€‹à»€àº«àº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹à»€àºªàº±à»‰àº™â€‹àº—າງ​ທີ່​ເລືອàºâ€‹\:
+EarthApp.23 = ບà»à»ˆâ€‹à»„ຟລ​໌ CSV / CED ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

+EarthApp.24 = ໄຟ​ທີ່​ມີ​à»àº¡à»ˆâ€‹à»àºšàºš Freemarker ທີ່​ມີ​ຄà»àº²â€‹àº™àº´â€‹àºàº²àº¡ KML ບà»à»ˆâ€‹à»„ດ້​ພົບ​ເຫັນ​ຢູ່​ໃນ​ເສັ້ນ​ທາງ​ທີ່​ເລືອàºâ€‹\:
+EarthApp.26 = ບà»à»ˆâ€‹à»„ຟລ​໌​ຄà»àº²â€‹àº™àº´â€‹àºàº²àº¡ KML ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

+EarthApp.27 = ໄຟ​ທີ່​ມີ​ຮູບ​à»àºšàºšâ€‹àº›àº¹àº¡â€‹à»€àº›àº»à»‰àº² HTML ໄດ້​à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹àºžàº»àºšâ€‹à»€àº«àº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹à»€àºªàº±à»‰àº™â€‹àº—າງ​ທີ່​ເລືອàºâ€‹\:
+EarthApp.29 = ບà»à»ˆâ€‹à»„ຟລ​໌​ປູມ​ເປົ້າ HTML ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

+EarthApp.3 = ເຕືອນ​ຂ້ອàºâ€‹àº•à»à»ˆâ€‹àº¡àº² +EarthApp.30 = àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹à»àºà»‰â€‹à»„ຂ​ສະ​ຖານ​ທີ່​ໄຟລ​໌​ຢູ່​ໃນ​ເມ​ນູ Tools-> Properties​. +EarthApp.4 = àºàº²àº™â€‹àº›àº±àºšâ€‹àº›àº¸àº‡â€‹à»ƒàº™â€‹àº›àº±àº”​ຈຸ​ບັນ +EarthApp.5 = ຢ່າ​ເຕືອນ​ຂ້າ​ພະ​ເຈົ້າ​ອີàºâ€‹à»€àº—ື່ອ​ຫນຶ່ງ +EarthApp.57 = ມີ​ສະ​ບັບ​ໃຫມ່​ຂອງ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹àº—ີ່​ມີ à»àº¡à»ˆàº™â€‹\!
ທ່ານ​ບà»à»ˆâ€‹àº•້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹? ເຕືອນ +EarthApp.58 = ປັບ​ປຸງ +EarthApp.59 Error \= ໃນ​ເວ​ລາ​ທີ່​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ເອ​àºàº°â€‹àºªàº²àº™â€‹à»‚ຄງ​àºàº²àº™ +EarthApp.6 = \ - ສະ​ບັບ +EarthApp.61 = ເອ​àºàº°â€‹àºªàº²àº™â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹à»„ດ້​ເàºàº±àºšâ€‹àºà»àº²â€‹àºšà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ຈະ​ເປີດ​ເຜີàºâ€‹.
àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹à»€àº®àº±àº”​ໃຫ້​à»àº™à»ˆâ€‹à»ƒàºˆàº§à»ˆâ€‹àº²â€‹àº—ີ່​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»àº¡à»ˆàº™â€‹àºàº²àº™â€‹àº•ິດ​ຕັ້ງ​. +EarthSurveyService.9 = ພາàºâ€‹àºªàº°â€‹àº«àº™àº²àº¡â€‹àº—ີ່​ຕ້ອງ​àºàº²àº™à»€àº­àº»àº² +ExportActionListener.1 = ວັນ​ທີ່​ຈະ​ບັນ​ທຶàºâ€‹àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àºˆàº²àºàº‚à»à»‰â€‹àº¡àº¹àº™ +ExportDialogProcessMonitor.0 àºàº²àº™â€‹àº›àº¸àº‡â€‹à»àº•່ງ \= ... +ExportDialogProcessMonitor.1 = ລà»â€‹àº–້າ​ທີ່​ຈະ​ເລີ່ມ​ຕົ້ນ​ຂະ​ບວນ​àºàº²àº™â€‹\:àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àº +ExportDialogProcessMonitor.4 =​\: +ImportProcessMonitorDialog.0 = àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​\: +ImportActionListener.0 = ຄວນ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àº—ີ່​ດິນ​ທີ່​ບà»à»ˆâ€‹à»„ດ້​ຮັບ​àºàº²àº™â€‹à»€àº•ີມ​ລົງ​ໄປ​ໃນ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ໄດ້ +ImportActionListener.2 = ຖ້າ​ທ່ານ​ຄລິàºâ€‹à»ƒàºªà»ˆ ບà»à»ˆ ພຽງ​à»àº•່​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºˆàº²àºâ€‹àºžàº²àºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ຢູ່​ໃນ​ສະ​ພາບ "ສີ​ຂຽວ​"​, ທີ່​ບັນ​ຈຸ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ັງ​ຫມົດ​ໄດ້​, ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​. +ImportActionListener.3 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ບັນ​ທຶàºâ€‹àº—າງ​àºàº²àº™â€‹àºªà»àº²â€‹à»€àº¥àº±àº”​ຮູບ +ImportDialogProcessMonitor.0 = \ ຄິດ​ໄລ່ +ImportDialogProcessMonitor.11 = ຈà»àº²â€‹àº™àº§àº™â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ​ຂອງ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹\: +ImportDialogProcessMonitor.2 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ບັນ​ທຶàºâ€‹àºàº²àº™ ... +ImportDialogProcessMonitor.5 = ຈ​à»â€‹àº²â€‹àº™àº§àº™â€‹àº•ົວ​ຈິງ​ຂອງ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​\:ຂà»à»‰â€‹àº¡àº¹àº™ +ImportDialogProcessMonitor.8 àºàº²àº™â€‹àº›àº¸àº‡â€‹à»àº•່ງ \= ... +InfiniteProgressMonitor.0 = àºàº»àºâ€‹à»€àº¥àºµàºâ€‹àºàº²àº™â€‹àº”à»àº²â€‹à»€àº™àºµàº™â€‹àº‡àº²àº™àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +JFileChooserExistsAware.0 = file ໂລàºâ€‹à»‚ຄງ​àºàº²àº™ +KmlImportService.13 = ເລືອàºâ€‹à»„ຟລ​໌ CSV ເພື່ອ​ຊ່ວàºâ€‹àº›àº°â€‹àº¢àº±àº”​ສະ​ຖານ​ຕອນ​ດິນ​ຂອງ​ຕົນ​ເພື່ອ +MissingPlotsListener.0 Error \= ໃນ​ຂະ​ນະ​ທີ່​àºàº²àº™â€‹à»„ດ້​ຮັບ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àº—ີ່​ດິນ​ບà»à»ˆâ€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ດ້ +MissingPlotsListener.1 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ໄປ +MissingPlotsListener.10 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ໃນ​àºàº²àº™â€‹àº­àº­àºâ€‹à»àºšàºšâ€‹àºªàº¸à»ˆàº¡â€‹àº•ົວ​ຢ່າງ​\: +MissingPlotsListener.12 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ຫາàºâ€‹à»„ປ​\: +MissingPlotsListener.14 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທັງ​ຫມົດ​à»àº¡à»ˆàº™â€‹à»„ດ້​ເຕີມ​ລົງ​ໄປ ​\!ເນື້ອ​ໃນ +MissingPlotsListener.2 = ຄັດ​ລອàºâ€‹à»„ປ​ທີ່ clipboardເອົາ +MissingPlotsListener.3 = ໄຟລ​໌​ທີ່​ບັນ​ຈຸ​ມີ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ສານ​ຕອນ​ດິນ​ຂອງ​ຕົນ (.csv ຫຼື​ໄຟລ​໌ .ced​) ສà»àº²â€‹àº¥àº±àºšâ€‹àº—ີ່​ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ຮູ້​ວ່າ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ັງ​ຫມົດ​ໄດ້​ຮັບ​àºàº²àº™â€‹à»€àº•ີມ​ລົງ​ໄປ​. +MissingPlotsListener.4 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຫາàºâ€‹à»„ປ - ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ສານ +MissingPlotsListener.5 = ຈາàºâ€‹à»„ຟ​\: +MissingPlotsListener.6 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ​ໄຟລ​໌ CED +ProcessMonitorDialog.1 = ຂà»à»‰â€‹àºœàº´àº”​ພາດ Parsing àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àºˆà»àº²â€‹àº™àº§àº™â€‹àºàº²àº™â€‹àº•ິດ​ຕà»à»ˆâ€‹àºàº±àº™ +ProcessMonitorDialog.4 = ຖັນ​, +ProcessMonitorDialog.5 = \ - ຄຸນ​ຄ່າ \ No newline at end of file From d77e2164a1db2f78515daa01960c4148b59f1d03 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:35:20 +0100 Subject: [PATCH 0782/1620] New translations Messages_hi.properties (English) --- .../earth/app/view/Messages_en.properties | 449 +++++++++--------- 1 file changed, 228 insertions(+), 221 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 5110140e9c..f759c433b0 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,221 +1,228 @@ -AboutDialog.19=Äã có lá»—i -AboutDialog.5=Truy cập website cá»§a chúng tôi để biết thêm thông tin OpenForis.org -AboutDialog.6=Xin lá»—i, đã có sá»± cố khi mở link trong brower chuẩn trong hệ thống cá»§a bạn. -AboutDialog.8=Ok -AspectCode.0=Bắc -AspectCode.1=Äông-Bắc -AspectCode.2=Äông -AspectCode.3=Äông-Nam -AspectCode.4=Nam -AspectCode.5=Tây-Nam -AspectCode.6=Tây -AspectCode.7=Tây-Bắc -CollectEarthWindow.0=Lá»—i khi xuất dữ liệu sang file CSV -CollectEarthWindow.1=Lá»—i xuất dữ liệu -CollectEarthWindow.10=File -CollectEarthWindow.11=Thoát -CollectEarthWindow.12=Công cụ -CollectEarthWindow.13=Xuất dữ liệu ra CSV -CollectEarthWindow.14=Khởi động SAIKU Analysis -CollectEarthWindow.15=Thuá»™c tính -CollectEarthWindow.16=Trợ giúp -CollectEarthWindow.17=Thông tin công bố -CollectEarthWindow.18=Tìm ô thiếu trong cÆ¡ sở dữ liệu -CollectEarthWindow.19=Collect Earth -CollectEarthWindow.2=Ngôn ngữ -CollectEarthWindow.20=Số bản ghi trùng\: -CollectEarthWindow.21=Không tìm thấy biểu tượng cho khung chính -CollectEarthWindow.22=Bạn có chắc là muốn đóng Collect Earth?
Äóng cá»­a sổ cÅ©ng đóng luôn máy chá»§ Collect Earth -CollectEarthWindow.23=Cần khẳng định -CollectEarthWindow.24=Xuất ra XML -CollectEarthWindow.25=Bạn có muốn thêm các bản ghi này và bá» Ä‘i dữ liệu hiện thá»i không? -CollectEarthWindow.26=Ngưá»i sá»­ dụng -CollectEarthWindow.27=Cập nhật -CollectEarthWindow.28=Máy chá»§ Open Foris Collect Earth phải chạy khi ngưá»i sá»­ dụng giải Ä‘oán dữ liệu. -CollectEarthWindow.29=Chưa xác định cấu hình cho Máy chá»§ Saiku. -CollectEarthWindow.3=\ Lá»—i nhập -CollectEarthWindow.30=Äể mở cá»­a sổ này khi Ä‘ang sá»­ dụng Google Earth. -CollectEarthWindow.31=Xuất dữ liệu đã thu thập sang file CSV -CollectEarthWindow.32=Thoát -CollectEarthWindow.33=Tên ngưá»i sá»­ dụng phải dài hÆ¡n 5 chữ cái và ngắn hÆ¡n 50 chữ cái -CollectEarthWindow.34=Lá»—i kiểm chứng -CollectEarthWindow.35=TÊN NGƯỜI SỬ DỤNG CÃ’N TRá»NG\!
Hãy Ä‘iá»n tên ngưá»i sá»­ dụng và nhắp phím "Update". -CollectEarthWindow.36=Không được để trống phần tên ngưá»i sá»­ dụng -CollectEarthWindow.37=Äể mở -CollectEarthWindow.38=file CSV -CollectEarthWindow.39=THÔNG BÃO\: Nên lưu dá»± phòng dữ liệu hiện thá»i(Xuất ra XML) trước khi nhập dữ liệu má»›i -CollectEarthWindow.4=Thông tin công bố cá»§a FAO -CollectEarthWindow.40=Thiết lập đưá»ng dẫn tá»›i thư mục cài đặt Saiku Server trong Tools->Properties->Advanced tab. -CollectEarthWindow.41=Ghi dữ liệu xuất ra vào file\: -CollectEarthWindow.42=Thoát -CollectEarthWindow.43=Tìm thấy bản ghi có mâu thuẫn -CollectEarthWindow.44=Nhập/Xuất dữ liệu -CollectEarthWindow.45=Xuất dữ liệu ra XML (nén) -CollectEarthWindow.46=Nhập dữ liệu má»›i từ file ZIP (XML nén) -CollectEarthWindow.55=Cập nhật các bản ghi hiện thá»i bằng CSV -CollectEarthWindow.47=Chưa định cấu hình cho Saiku Server -CollectEarthWindow.48=Zip/collect-data files -CollectEarthWindow.49=Files CSV tổng hợp -CollectEarthWindow.5=Äóng -CollectEarthWindow.50=Mở hướng dẫn ngưá»i sá»­ dụng -CollectEarthWindow.51=Kiểm tra cập nhật cá»§a Collect Earth -CollectEarthWindow.52=Mở file nhật ký ứng dụng -CollectEarthWindow.53=File nhật ký cá»§a Collect Earth -CollectEarthWindow.54=Nạp các Ä‘iểm từ KML -CollectEarthWindow.56=Vá»... -CollectEarthWindow.57=Äang chạy quá trình khởi động Saiku, xin đợi. -CollectEarthWindow.58=Không thể khởi động Saiku analysis -CollectEarthWindow.59=Bạn có muốn tạo lại bá»™ dữ liệu cho Saiku analysis không?
Quá trình này sẽ mất một vài phút.
Nếu bạn chá»n "YES" sẽ tạo ra má»™t bá»™ dữ liệu má»›i vá»›i các thông tin cập nhật nhất. -CollectEarthWindow.6=Xuất ra bảng tổng hợp -CollectEarthWindow.60=Tạo dữ liệu Saiku -CollectEarthWindow.61=Xuất dữ liệu ra XML (các bản ghi chỉnh sá»­a từ lần xuất trước) -CollectEarthWindow.62=Vá»... -CollectEarthWindow.63=Lá»—i khi nạp Ä‘iểm từ KML -CollectEarthWindow.64=Há»— trợ kỹ thuật -CollectEarthWindow.7=Lá»—i khi nhập dữ liệu -CollectEarthWindow.8=Không tìm thấy văn bản thông báo -CollectEarthWindow.9=Dữ liệu nhập vào có chứa các bản ghi đã có trong cÆ¡ sở dữ liệu cá»§a bạn. -DynamicsCode.0=Ban đầu là rừng -DynamicsCode.1=Ban đầu là trảng cá» -DynamicsCode.2=Ban đầu là khu dân cư -DynamicsCode.3=Ban đầu là đất khác -DynamicsCode.4=Ban đầu là đất ngập nước -DynamicsCode.5=Ban đầu là đất trồng trá»t -OpenTextFileListener.0=không tìm thấy file văn bản tại\: -OptionWizard.0=Các lá»±a chá»n cá»§a Collect Earth -OptionWizard.1=Chá»n Browser -OptionWizard.10=Mở thư mục lưu dá»± phòng -OptionWizard.11=Không biết\: hãy sá»­ dụng ifconfig -OptionWizard.12=Vi dụ cá»§a khác -OptionWizard.13=Äịa chỉ IP cá»§a máy chá»§ Collect Earth -OptionWizard.14=Cổng máy chá»§ Collect Earth (vd\: 8023) -OptionWizard.15=Ghi và áo dụng thay đổi -OptionWizard.16=ID -OptionWizard.17=Tá»a độ X -OptionWizard.18=Tá»a độ Y -OptionWizard.19=Äá»™ cao -OptionWizard.2=Dòng công tác (máy chá»§/khách) -OptionWizard.20=Ná»™i dung cá»§a Google Earth đã thay đổi.
Äá» nghị chấp nhận tải lại ná»™i dung khi Google Earth gợi ý. -OptionWizard.21=Cập nhật thành công -OptionWizard.22=Dốc -OptionWizard.23=Có lá»—i khi mở lại dữ liệu Google Earth -OptionWizard.24=Há»§y -OptionWizard.25=Mode vận hành -OptionWizard.26=NÆ¡i lưu cÆ¡ sở dữ liệu -OptionWizard.27=Äây không phải là thư mục Saiku (hiện không có file start-saiku.bat) -OptionWizard.28=Không nhận được máy chá»§ Saiku -OptionWizard.29=Cổng cÆ¡ sở dữ liệu -OptionWizard.3=Ví dụ cá»§a máy chá»§ -OptionWizard.30=Các lá»±a chá»n cá»§a SQLite -OptionWizard.31=Dữ liệu mẫu -OptionWizard.32=SÆ¡ đồ mẫu -OptionWizard.33=Äịnh nghÄ©a khảo sát -OptionWizard.34=Nâng cao -OptionWizard.35=Số Ä‘iểm mẫu -OptionWizard.36=Khoảng cách giữa các Ä‘iểm mẫu (tính theo mét) -OptionWizard.37=Lá» vá»›i biên ô (tính theo mét) -OptionWizard.38=Không Ä‘á»c được đúng file CSV/CED.
Cần có dấu phảy để phân tách giá trị giống như sau \:
-OptionWizard.39=ID,Tá»a độ Y,tá»a độ X,độ cao,độ dốc,tá»· lệ -OptionWizard.4=Äịa chỉ IP hiện tại cá»§a máy tính\: -OptionWizard.40=Các project -OptionWizard.41=tải file project má»›i -OptionWizard.42=Lá»—i khi đóng CSV reader -OptionWizard.43=Tên khảo sát -OptionWizard.44=tá»± động lưu dá»± phòng dữ liệu tại -OptionWizard.45=Mở Earth Engine để phóng to vào khu vá»±c ô -OptionWizard.46=Mở Earth Engine timelapse cho khu vá»±c ô -OptionWizard.47=Mở Bing Maps cho khu vá»±c ô -OptionWizard.48=Mở form trên browser thay vì mở Google Earth (khuyến cáo cho LINUX) -OptionWizard.49=ÄÆ°á»ng dẫn tá»›i file ced/csv file vá»›i dữ liệu ô -OptionWizard.5=Cổng máy chá»§ Collect Earth\: -OptionWizard.50=Browse... -OptionWizard.51=Lá»—i nhập file project -OptionWizard.52=File CSV/CED chỉ có tá»a độ -OptionWizard.53=Ô vuông -OptionWizard.54=Äiểm trung tâm -OptionWizard.55=Lá»—i khi nhập thư mục project -OptionWizard.56=Tải project -OptionWizard.57=Các project đã tải -OptionWizard.58=Mở GEE Code Editor (cần phải có quyá»n truy cập Trusted Tester) -OptionWizard.59=Mở Here Maps tập trung vào ô -OptionWizard.6=Các thông số cá»§a CSDL PostgreSQL -OptionWizard.65=ÄÆ°á»ng dẫn tá»›i thư mục Saiku -OptionWizard.66=Browse... -OptionWizard.67=ÄÆ°á»ng dẫn tá»›i Firefox executable (file exe) -OptionWizard.68=Browse... -OptionWizard.7=Tên ngưá»i sá»­ dụng -OptionWizard.70=File chạy -OptionWizard.72=File nhị phân -OptionWizard.73=ÄÆ°á»ng dẫn tá»›i Chrome executable (file exe) -OptionWizard.74=Browse... -OptionWizard.76=File exe -OptionWizard.78=File nhị phân -OptionWizard.79=ÄÆ°á»ng dẫn tá»›i KML Freemarker template -OptionWizard.8=Mật khẩu -OptionWizard.80=Browse... -OptionWizard.82=Freemarker template -OptionWizard.83=ÄÆ°á»ng dẫn tá»›i mẫu thiết kế HTML Balloon -OptionWizard.84=Browse... -OptionWizard.86=HTML webpage -OptionWizard.87=ÄÆ°á»ng dẫn tá»›i XML vá»›i định nghÄ©a IDM -OptionWizard.88=Browse... -OptionWizard.9=Tên CSDL -OptionWizard.90=Äịnh nghÄ©a XML IDM -OptionWizard.91=Máy chá»§ (phiên bản quản lý hoặc sá»­ dụng độc lập) -OptionWizard.92=Khách (ngưá»i sá»­ dụng/kết nối vá»›i máy chá»§) -OptionWizard.93=SQLite (tích hợp/file đơn lẻ) -OptionWizard.94=PostgreSQL -SaikuAnalysisListener.0=Yes - Làm má»›i lại dữ liệu Saiku (quá trình dài) -SaikuAnalysisListener.1=No - chỉ khởi động Saiku -SaikuStarter.1=Khởi động Saiku -SaikuStarter.2=Cần vài phút để khởi động Saiku, xin đợi\! -SaveEarthDataServlet.0=Yêu cầu trống -SaveEarthDataServlet.1=Có trục trặc khi ghi dữ liệu vào CSDL -SaveEarthDataServlet.2=Dữ liệu đã được ghi -SlopeCode.0=Bằng phẳng (0-5) -EarthApp.11=Collect Earth Ä‘ang chạy -EarthApp.21=Không tìm thấy file chứa lưới ô trong đưá»ng dẫn đã chá»n \:
-EarthApp.23=Chưa thiết lập file CSV/CED \:

-EarthApp.24=Không tìm thấy file chứa Freemarker template vá»›i định nghÄ©a KML trong đưá»ng dẫn đã chá»n\:
-EarthApp.26=Chưa thiết lập file định nghĩa KML d\:

-EarthApp.27=Không tìm thấy file chứa mẫu HTML balloon trong đưá»ng dẫn đã chá»n\:
-EarthApp.29=Chưa thiết lập file HTML balloon \:

-EarthApp.3=Nhắc nhở sau -EarthApp.30=Xin hãy Ä‘iá»u chỉnh đúng địa chỉ file trong Tools->Properties menu. -EarthApp.4=Cập nhật luôn -EarthApp.5=Không nhắc nữa -EarthApp.57=Äã có phiên bản má»›i cá»§a Collect Earth\!
Bạn muốn làm tiếp như thế nào? -EarthApp.58=Thông báo cập nhật -EarthApp.59=Lỗi khi nhập file project -EarthApp.6=\ - Phiên bản -EarthApp.61=Không mở được file Collect Earth.
Äá» nghị đảm bảo đã cài đặt Google Earth. -EarthSurveyService.9=Trưá»ng bắt buá»™c -ExportActionListener.1=Chá»n ngày xuất bản ghi -ExportDialogProcessMonitor.0=Äang xá»­ lý dữ liệu... -ExportDialogProcessMonitor.1=Äang đợi khởi động quá trình\: -ExportDialogProcessMonitor.4=Các bản ghi đã xuất\: -ImportProcessMonitorDialog.0=Các bản ghi đã nhập\: -ImportActionListener.0=Có nhập dữ liệu các ô chưa được Ä‘iá»n đầy đủ không? -ImportActionListener.2=Nếu bạn chá»n NO sẽ chỉ nhập dữ liệu cá»§a các ô có trạng thái màu "xanh lá cây", các ô đã có đầy đủ dữ liệu. -ImportActionListener.3=Nhập các bản ghi chưa hoàn tất -ImportDialogProcessMonitor.0=\ ÄANG TÃNH TOÃN -ImportDialogProcessMonitor.11=Số lượng ban đầu các bản ghi\: -ImportDialogProcessMonitor.2=Äang nhập các bản ghi... -ImportDialogProcessMonitor.5=Số lượng thá»±c tế các bản ghi đã nhập\: -ImportDialogProcessMonitor.8=Äang xá»­ lý dữ liệu... -InfiniteProgressMonitor.0=Há»§y lệnh -JFileChooserExistsAware.0=File project cá»§a Collect Earth -KmlImportService.13=Chá»n file CSV file để ghi địa Ä‘iểm cá»§a ô vào -MissingPlotsListener.0=Lá»—i khi lấy thông tin vỠô không có trong CSDL -MissingPlotsListener.1=Các ô thiếu -MissingPlotsListener.10=Tổng số ô trong thiết kế chá»n mẫu \: -MissingPlotsListener.12=Số ô thiếu\: -MissingPlotsListener.14=Äã Ä‘iá»n tất cả các ô\! -MissingPlotsListener.2=Sao chép ná»™i dung vào bàn phím -MissingPlotsListener.3=Lá»±a chá»n file có chứa thông tin ô ( file .csv hoặc .ced ) mà bạn muốn biết đã Ä‘iá»n đủ dữ liệu chưa. -MissingPlotsListener.4=Các ô thiếu - thông tin -MissingPlotsListener.5=Từ file \: -MissingPlotsListener.6=Xuất ra file CED -ProcessMonitorDialog.1=Tìm lá»—i trên số dòng -ProcessMonitorDialog.4=, cá»™t -ProcessMonitorDialog.5=\ -- giá trị +AboutDialog.19=कोई समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ +AboutDialog.5=अधिक जानकारी के लिठहमारी वेबसाइट पर जाà¤à¤‚ OpenForis.org +AboutDialog.6=कà¥à¤·à¤®à¤¾ करें, à¤à¤• समसà¥à¤¯à¤¾ आपके सिसà¥à¤Ÿà¤® के मानक बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में इस लिंक को खोलने की कोशिश कर रही है. +AboutDialog.8=ठीक +AspectCode.0=उतà¥à¤¤à¤° दिशा +AspectCode.1=उतà¥à¤¤à¤°-पूरà¥à¤µ दिशा +AspectCode.2=पूरà¥à¤µ दिशा +AspectCode.3=दकà¥à¤·à¤¿à¤£-पूरà¥à¤µ दिशा +AspectCode.4=दकà¥à¤·à¤¿à¤£ दिशा +AspectCode.5=दकà¥à¤·à¤¿à¤£-पशà¥à¤šà¤¿à¤® दिशा +AspectCode.6=पशà¥à¤šà¤¿à¤® दिशा +AspectCode.7=उतà¥à¤¤à¤°-पशà¥à¤šà¤¿à¤® दिशा +CollectEarthWindow.0=तà¥à¤°à¥à¤Ÿà¤¿ जब सीà¤à¤¸à¤µà¥€ फ़ाइल में डेटा निरà¥à¤¯à¤¾à¤¤ करने का पà¥à¤°à¤¯à¤¾à¤¸ +CollectEarthWindow.1=निरà¥à¤¯à¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.10=फ़ाइल +CollectEarthWindow.11=बाहर जाà¤à¤‚ +CollectEarthWindow.12=उपकरण +CollectEarthWindow.13=डेटा सीà¤à¤¸à¤µà¥€ निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.14=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ +CollectEarthWindow.15=गà¥à¤£ +CollectEarthWindow.16=मदद +CollectEarthWindow.17=असà¥à¤µà¥€à¤•रण +CollectEarthWindow.18=डेटाबेस में लापता भूखंडों खोजें +CollectEarthWindow.19=पृथà¥à¤µà¥€ इकटà¥à¤ à¤¾ +CollectEarthWindow.2=भाषा +CollectEarthWindow.20=डà¥à¤ªà¥à¤²à¤¿à¤•ेट रिकॉरà¥à¤¡ की संखà¥à¤¯à¤¾\: +CollectEarthWindow.21=मà¥à¤–à¥à¤¯ फà¥à¤°à¥‡à¤® के लिठआइकन नहीं मिल सकता है +CollectEarthWindow.22=आपको लगता है कि आप à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ बंद करना चाहते हैं? विंडोज बंद करने से, à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° बंद हो जाà¤à¤—ा +CollectEarthWindow.23=पà¥à¤·à¥à¤Ÿà¤¿ की जरूरत है +CollectEarthWindow.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.25=आप वैसे भी इन अभिलेखों को जोड़ना चाहते हैं और अपने वरà¥à¤¤à¤®à¤¾à¤¨ डेटा खोने के लिठकिलक करना चाहते हैं? +CollectEarthWindow.26=ऑपरेटर,पà¥à¤°à¤šà¤¾à¤²à¤• +CollectEarthWindow.27=अदà¥à¤¯à¤¤à¤¨ +CollectEarthWindow.28= औपन फौरिस à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° चल रहा होना चाहिठ, जबभी ऑपरेटर डेटा की वà¥à¤¯à¤¾à¤–à¥à¤¯à¤¾ करें . +CollectEarthWindow.29=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. +CollectEarthWindow.3= आयात संबंधी तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.30=जबभी आप गà¥à¤—ल अरà¥à¤¥ का उपयोग कर रहे हैं, कृपया इस विंडोज को खà¥à¤²à¥€ बनाठरखें. +CollectEarthWindow.31=à¤à¤•तà¥à¤° डेटा सीà¤à¤¸à¤µà¥€ फाइल में भेजें +CollectEarthWindow.32=छोड़ना +CollectEarthWindow.33=ऑपरेटर का नाम के 5 अकà¥à¤·à¤° से बड़ा और 50 अकà¥à¤·à¤° से कम होना चाहिठ+CollectEarthWindow.34=मानà¥à¤¯à¤¤à¤¾ तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.35=ऑपरेटर नाम खाली\!
कृपया ऑपरेटर का नाम भरें और "अदà¥à¤¯à¤¤à¤¨" बटन दबाà¤à¤. +CollectEarthWindow.36=ऑपरेटर नाम रिकà¥à¤¤ नहीं हो सकता +CollectEarthWindow.37=खà¥à¤²à¤¾ रखो +CollectEarthWindow.38=सीà¤à¤¸à¤µà¥€ फ़ाइल +CollectEarthWindow.39=सूचना\: यह सलाह दी जाती है कि आप नठडेटा डालने करने से पहले अपने मौजूदा आंकडों को बैकअप(à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤) कर लें +CollectEarthWindow.4=à¤à¤«à¤à¤“ असà¥à¤µà¥€à¤•रण नोटिस +CollectEarthWindow.40=उस फ़ोलà¥à¤¡à¤° पर जाà¤à¤‚ जहां साà¤à¤•ॠसरà¥à¤µà¤° में सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ किया गया है, फ़ोलà¥à¤¡à¤° का रासà¥à¤¤à¤¾ उपकरण> गà¥à¤£> उनà¥à¤¨à¤¤ टैब. +CollectEarthWindow.41=निरà¥à¤¯à¤¾à¤¤ डेटा को फ़ाइल में बचाया जा रहा है \: +CollectEarthWindow.42=छोड़ना +CollectEarthWindow.43=परसà¥à¤ªà¤° विरोधी रिकॉरà¥à¤¡ पाया +CollectEarthWindow.44=डेटा आयात / निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.45=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ डेटा (संकà¥à¤šà¤¿à¤¤) +CollectEarthWindow.46=ज़िप से नठडेटा आयात करें (संकà¥à¤šà¤¿à¤¤ à¤à¤•à¥à¤¸à¤à¤®à¤à¤²) +CollectEarthWindow.55=सीà¤à¤¸à¤µà¥€ का उपयोग कर मौजूदा रिकॉरà¥à¤¡ को अपडेट करें +CollectEarthWindow.47=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. +CollectEarthWindow.48=ज़िप / à¤à¤•तà¥à¤°-डेटा फ़ाइल +CollectEarthWindow.49=फà¥à¤¯à¥‚जन सीà¤à¤¸à¤µà¥€ फ़ाइल +CollectEarthWindow.5=बंद करे +CollectEarthWindow.50= उपयोगकरà¥à¤¤à¤¾ मैनà¥à¤…ल खोलें +CollectEarthWindow.51=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ के अदà¥à¤¯à¤¤à¤¨ के लिठजाà¤à¤š करें +CollectEarthWindow.52= अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— लॉग फ़ाइल खोलें +CollectEarthWindow.53=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ लॉग फ़ाइल +CollectEarthWindow.54=केà¤à¤®à¤à¤² से लोड अंक +CollectEarthWindow.56=के विषय में... +CollectEarthWindow.57=साà¤à¤•ॠसà¥à¤Ÿà¤¾à¤°à¥à¤Ÿà¤° पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ अभी भी चल रहा है, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें. +CollectEarthWindow.58=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ नहीं कर सकते +CollectEarthWindow.59=आप साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ के लिठडेटा सेट फिर से उतà¥à¤ªà¤¨à¥à¤¨ करने के लिठकरना चाहते हैं?
यह पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ समय लेने वाली हो सकती है.
आप यदि "हाà¤"पर कà¥à¤²à¤¿à¤• करें, तो नवीनतम जानकारी के साथ à¤à¤• नया डाटासेट उतà¥à¤ªà¤¨à¥à¤¨ हो जाà¤à¤—ा. +CollectEarthWindow.6=फà¥à¤¯à¥‚जन टेबल के लिठनिरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.60=साà¤à¤•ॠडेटा उतà¥à¤ªà¤¨à¥à¤¨ +CollectEarthWindow.61=डेटा à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ (पिछले निरà¥à¤¯à¤¾à¤¤ के बाद से संशोधित रिकॉरà¥à¤¡) +CollectEarthWindow.62=के विषय मे... +CollectEarthWindow.63=केà¤à¤®à¤à¤² से अंक पà¥à¤°à¤¾à¤ªà¥à¤¤ करने में तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.64=तकनीकी सहायता +CollectEarthWindow.7=डेटा आयात में तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.8=असà¥à¤µà¥€à¤•रण पाठ नहीं पाया जा सका +CollectEarthWindow.9=डेटा आयात रिकॉरà¥à¤¡ वह है जो कि पहले से ही अपने डेटाबेस पर मौजूद हैं शामिल. +DynamicsCode.0=पà¥à¤°à¤¾à¤°à¤‚भ में वन +DynamicsCode.1=पà¥à¤°à¤¾à¤°à¤‚भ में घास का मैदान, +DynamicsCode.2=पà¥à¤°à¤¾à¤°à¤‚भ में आबादी वाला इलाका +DynamicsCode.3=पà¥à¤°à¤¾à¤°à¤‚भ में बंजर +DynamicsCode.4=पà¥à¤°à¤¾à¤°à¤‚भ में आरà¥à¤¦à¥à¤° भूमि +DynamicsCode.5=पà¥à¤°à¤¾à¤°à¤‚भ में खेत +OpenTextFileListener.0=इस पाठ का फ़ाइल नहीं मिला \: +OptionWizard.0= विकलà¥à¤ª +OptionWizard.1=बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° चà¥à¤¨à¥‡à¤‚ +OptionWizard.10=बैकअप फ़ोलà¥à¤¡à¤° खोलें +OptionWizard.11=अजà¥à¤žà¤¾à¤¤\: उपयोग ifconfig +OptionWizard.12=गà¥à¤°à¤¾à¤¹à¤•ों का उलà¥à¤²à¥‡à¤– +OptionWizard.13=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° आईपी +OptionWizard.14=कतà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ (उदाहरण- 8023) +OptionWizard.15=बचाà¤à¤‚ और परिवरà¥à¤¤à¤¨ लागू करें +OptionWizard.16=आईडी +OptionWizard.17=X- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क +OptionWizard.18=Y- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क +OptionWizard.19=उठान +OptionWizard.2=कारà¥à¤¯à¤ªà¥à¤°à¤µà¤¾à¤¹ (सरà¥à¤µà¤° / गà¥à¤°à¤¾à¤¹à¤•) +OptionWizard.20=गूगल अरà¥à¤¥ अंतरà¥à¤µà¤¸à¥à¤¤à¥ बदल दिया गया है
यदि गà¥à¤—ल अरà¥à¤¥ आप से कहे,अंतरà¥à¤µà¤¸à¥à¤¤à¥ पà¥à¤¨à¤ƒ लोड सà¥à¤µà¥€à¤•ार करें . +OptionWizard.21=अदà¥à¤¯à¤¤à¤¨ सफल +OptionWizard.22=ढाल +OptionWizard.23=गूगल अरà¥à¤¥ डेटा को फिर से खोलने में कोई तà¥à¤°à¥à¤Ÿà¤¿ थी +OptionWizard.24=रदà¥à¤¦ करना +OptionWizard.25=ऑपरेशन मोड +OptionWizard.26=डीबी होसà¥à¤Ÿ +OptionWizard.27=यह à¤à¤• मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ साà¤à¤•ॠफ़ोलà¥à¤¡à¤° नहीं है ( सà¥à¤Ÿà¤¾à¤°à¥à¤Ÿ-साà¤à¤•à¥.batफ़ाइल मौजूद नहीं है) +OptionWizard.28=साà¤à¤•ॠसरà¥à¤µà¤° मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ नहीं +OptionWizard.29=डीबी पोरà¥à¤Ÿ +OptionWizard.3=सरà¥à¤µà¤° आवृतà¥à¤¤à¤¿ +OptionWizard.30=à¤à¤¸à¤•à¥à¤¯à¥ लाइट विकलà¥à¤ª +OptionWizard.31=सेमà¥à¤ªà¤² डेटा +OptionWizard.32=पà¥à¤²à¥‰à¤Ÿ लेआउट +OptionWizard.33=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ परिभाषा +OptionWizard.34=विकसित +OptionWizard.35=सेमà¥à¤ªà¤² अंक की संखà¥à¤¯à¤¾ +OptionWizard.36=सेमà¥à¤ªà¤² बिंदॠके बीच दूरी (मीटर में) +OptionWizard.37=भूखंड की सीमा के साथ मारà¥à¤œà¤¿à¤¨ (मीटर मे) +OptionWizard.38=सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सही ढंग से पढ़ा नहीं जा सकता.
इस फ़ाइल में à¤à¤• अलà¥à¤ªà¤µà¤¿à¤°à¤¾à¤® से अलग मूलà¥à¤¯à¥‹à¤‚ की उमà¥à¤®à¥€à¤¦ है \:
+OptionWizard.39=आईडी, वाई समनà¥à¤µà¤¯, à¤à¤•à¥à¤¸ समनà¥à¤µà¤¯, ऊंचाई, ढाल, पहलू +OptionWizard.4=वरà¥à¤¤à¤®à¤¾à¤¨ कंपà¥à¤¯à¥‚टर आईपी \: +OptionWizard.40=परियोजनाà¤à¤‚ +OptionWizard.41=à¤à¤• नई परियोजना फ़ाइल लोड करें +OptionWizard.42=सीà¤à¤¸à¤µà¥€ पाठक को बंद करते समय तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.43=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ का नाम +OptionWizard.44= सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ बैकअप डेटाबेस +OptionWizard.45=ओपन पृथà¥à¤µà¥€ इंजन ने पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° में जूम किया +OptionWizard.46=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठपृथà¥à¤µà¥€ इंजन टाइमलैपà¥à¤¸ खोलें +OptionWizard.47=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठबिंग मैपà¥à¤¸ खोलें +OptionWizard.48=बजाय गूगल अरà¥à¤¥ के फॉरà¥à¤® à¤à¤• बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° पर खोलें (लिनकà¥à¤¸ के लिठसिफारिश) +OptionWizard.49=भूखंड डेटा के साथ सीईडी / सीà¤à¤¸à¤µà¥€ फाइल भेजने के लिठपथ +OptionWizard.5=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ\: +OptionWizard.50=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.51=परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.52=केवल निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क के साथ सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल +OptionWizard.53=चौकोर +OptionWizard.54=केनà¥à¤¦à¥à¤°à¥€à¤¯ बिनà¥à¤¦à¥ +OptionWizard.55=परियोजना फ़ोलà¥à¤¡à¤° आयात तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.56=लोड परियोजना +OptionWizard.57=पहले से लोड परियोजना +OptionWizard.58= जी ई ई का मैदान खोलें (विशà¥à¤µà¤¸à¤¨à¥€à¤¯ जांचकरà¥à¤¤à¤¾ के उपयोग की आवशà¥à¤¯à¤•ता है) +OptionWizard.59=यहां भूखंड पर केंदà¥à¤°à¤¿à¤¤ मैपà¥à¤¸ खोलें +OptionWizard.6=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² डीबी मापदंड +OptionWizard.65=साà¤à¤•à¥à¤«à¤¼à¥‹à¤²à¥à¤¡à¤° का पथ +OptionWizard.66=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.67=फ़ायरफ़ॉकà¥à¤¸ निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ +OptionWizard.68=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.7=उपयोगकरà¥à¤¤à¤¾ नाम +OptionWizard.70=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों +OptionWizard.72=बाइनरी फ़ाइलें +OptionWizard.73=कà¥à¤°à¥‹à¤® निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ +OptionWizard.74=बà¥à¤°à¤¾à¤‰à¤œ +OptionWizard.76=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों +OptionWizard.78=बाइनरी फ़ाइलें +OptionWizard.79=केà¤à¤®à¤à¤² फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ के लिठपथ +OptionWizard.8=पासवरà¥à¤¡ +OptionWizard.80=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.82=फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ +OptionWizard.83=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ पà¥à¤°à¤ªà¤¤à¥à¤° डिज़ाइन करने के लिठपथ +OptionWizard.84=बà¥à¤°à¤¾à¤‰à¤œ..... +OptionWizard.86=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² वेब पेज +OptionWizard.87=पथ आइडीà¤à¤® परिभाषा के साथ à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठ+OptionWizard.88=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.9=डीबी नाम +OptionWizard.90=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² आइडीà¤à¤® परिभाषा +OptionWizard.91=सरà¥à¤µà¤° (पà¥à¤°à¤¬à¤‚धक संसà¥à¤•रण या खड़े अकेले का उपयोग करें) +OptionWizard.92=कà¥à¤²à¤¾à¤‡à¤‚ट (ऑपरेटर / सरà¥à¤µà¤° से जà¥à¤¡à¤¼à¥‡) +OptionWizard.93=सकà¥à¤¯à¥‚à¤à¤²à¤¾à¤‡à¤Ÿ (à¤à¤‚बेडेड / à¤à¤•ल फाइल आधारित) +OptionWizard.94=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² +OptionWizard.95=सेमà¥à¤ªà¤² डॉटà¥à¤¸ के साइड (मीटर में) +SaikuAnalysisListener.0=हाठ- ताज़ा साà¤à¤•ॠडेटा (लंबी पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾) +SaikuAnalysisListener.1=नहीं - बस साà¤à¤•ॠशà¥à¤°à¥‚ +SaikuStarter.1=साà¤à¤•ॠशà¥à¤°à¥‚ +SaikuStarter.2= साà¤à¤•ॠशà¥à¤°à¥‚ कà¥à¤› मिनट लग सकते हैं, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें\! +SaveEarthDataServlet.0=खाली अनà¥à¤°à¥‹à¤§ +SaveEarthDataServlet.1= डेटाबेस में डेटा बचाते समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ है +SaveEarthDataServlet.2=डेटा बचाया था +SlopeCode.0=समतल (0-5) +EarthApp.11=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ पहले से ही चल रहा है +EarthApp.21=à¤à¤• सीà¤à¤¸à¤µà¥€ / सीईडी के रूप में भूखंडों की गà¥à¤°à¤¿à¤¡ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
+EarthApp.23=कोई सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सेट-अप नहीं किया गया है \:

+EarthApp.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² परिभाषा के साथ फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है \:
+EarthApp.26=कोई à¤à¤•à¥à¤¸à¤à¤®à¤à¤² फ़ाइल परिभाषा सेट अप नहीं किया गया है \:

+EarthApp.27=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ रूप से यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
+EarthApp.29=कोई à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ फ़ाइल सेट-अप नहीं किया गया है \:

+EarthApp.3=मà¥à¤à¥‡ बाद में याद दिलाना +EarthApp.30=उपकरण> गà¥à¤£ मेनू में फ़ाइल सà¥à¤¥à¤¾à¤¨ को ठीक करें . +EarthApp.4=अभी अदà¥à¤¯à¤¤à¤¨ करें +EarthApp.5=मà¥à¤à¥‡ दà¥à¤¬à¤¾à¤°à¤¾ याद मत दिलाना +EarthApp.57=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ का à¤à¤• नया संसà¥à¤•रण उपलबà¥à¤§ है\!
आप कैसे आगे बढ़ना चाहते हैं? +EarthApp.58=अदà¥à¤¯à¤¤à¤¨ चेतावनी +EarthApp.59= परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ +EarthApp.6=\ - संसà¥à¤•रण +EarthApp.61=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ फाइल खà¥à¤² नहीं सकती .
कृपया सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करें कि गूगल अरà¥à¤¥ सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ है. +EarthSurveyService.9=आवशà¥à¤¯à¤• कà¥à¤·à¥‡à¤¤à¥à¤° +ExportActionListener.1= तारीख चूनें जबसे रिकॉरà¥à¤¡ निरà¥à¤¯à¤¾à¤¤ करने है +ExportDialogProcessMonitor.0=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... +ExportDialogProcessMonitor.1=पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ पà¥à¤°à¤¾à¤°à¤‚भ करने के लिठपà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ कर रहा है \: +ExportDialogProcessMonitor.4=निरà¥à¤¯à¤¾à¤¤ रिकॉरà¥à¤¡\: +ImportProcessMonitorDialog.0=आयातित रिकॉरà¥à¤¡ \: +ImportActionListener.0=कà¥à¤¯à¤¾ उन भूखंडों के लिठडेटा जो कि पूरी तरह से भरे नहीं गठ,आयातित किया जाना चाहिà¤? +ImportActionListener.2=आप कà¥à¤²à¤¿à¤• करें, नहींतो केवल डेटा "हरी" राजà¥à¤¯ में भूखंडों से ,जिसमें सभी डेटा यà¥à¤•à¥à¤¤ है , आयात किया जाà¤à¤—ा। +ImportDialogProcessMonitor.0=\ गणना +ImportDialogProcessMonitor.11=रिकॉरà¥à¤¡ की पà¥à¤°à¤¾à¤°à¤‚भिक संखà¥à¤¯à¤¾ \: +ImportDialogProcessMonitor.2=रिकॉरà¥à¤¡ आयात... +ImportDialogProcessMonitor.5=आयातित रिकॉरà¥à¤¡ की वासà¥à¤¤à¤µà¤¿à¤• संखà¥à¤¯à¤¾ \: +ImportDialogProcessMonitor.8=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... +InfiniteProgressMonitor.0=रदà¥à¤¦ ऑपरेशन +JFileChooserExistsAware.0=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ परियोजना फ़ाइल +KmlImportService.13=पà¥à¤²à¥‰à¤Ÿ सà¥à¤¥à¤¾à¤¨à¥‹à¤‚ को बचाने के लिठà¤à¤• सीà¤à¤¸à¤µà¥€ फ़ाइल का चयन करें +MissingPlotsListener.0=तà¥à¤°à¥à¤Ÿà¤¿ उन भूखंडों के बारे में जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ करने के लिठजो डेटाबेस पर मौजूद नहीं +MissingPlotsListener.1=गà¥à¤® भूखंड +MissingPlotsListener.10=सेमà¥à¤ªà¤² डिजाइन में भूखंडों की कà¥à¤² संखà¥à¤¯à¤¾ \: +MissingPlotsListener.12=गà¥à¤® भूखंडों की संखà¥à¤¯à¤¾ \: +MissingPlotsListener.14=सभी भूखंडों भर रहे हैं\! +MissingPlotsListener.2=कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ अंतरà¥à¤µà¤¸à¥à¤¤à¥ की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ +MissingPlotsListener.3=भूखंड की जानकारी वाले फ़ाइलें चà¥à¤¨à¥‡à¤‚ ( .सीà¤à¤¸à¤µà¥€ या .सीईडी फ़ाइलें ) जिसके लिठआप जानना चाहते हैं तो सभी डेटा भर दिया गया है चाहता हूà¤. +MissingPlotsListener.4=गà¥à¤® भूखंड- जानकारी +MissingPlotsListener.5=फ़ाइल से \: +MissingPlotsListener.6=सीà¤à¤¡à¥€ फ़ाइल में निरà¥à¤¯à¤¾à¤¤ करें +ProcessMonitorDialog.1=पंकà¥à¤¤à¤¿ संखà¥à¤¯à¤¾ पर तà¥à¤°à¥à¤Ÿà¤¿ +ProcessMonitorDialog.4=, कॉलम +ProcessMonitorDialog.5=\ --मूलà¥à¤¯ +YES= हां +YES_TO_ALL=सब को हां +NO=नहीं +NO_TO_ALL=सभी को नहीं + + + From 7a70c606f96a2e14c66a47f2098bb31415ad216b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:35:21 +0100 Subject: [PATCH 0783/1620] New translations smallOpenForisBanner.png (English) --- .../earth/app/view/Messages_en.properties | Bin 22428 -> 2784 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index f759c433b01b2ff61f62fa7862c75fbcd5bfc2dc..800ed67a3ee630d85c4bd4b6e56a4af593a6ba00 100644 GIT binary patch literal 2784 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 mmX=hUxZ`3$Pj%`0<$nS5#z+-I5UG}LWr_V2b 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 R*$z@f+>A|~brTa4{|9Y!1;79R From 8459314559751fb69291a98788db56c63d770c7f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:35:22 +0100 Subject: [PATCH 0784/1620] New translations arhangai.ttf (Portuguese) --- .../earth/app/view/Messages_pt.properties | Bin 22424 -> 70708 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index f0355142d067bbb31d41d34669c08a7cc0984ba5..aefdf309744a0187d10430151fd9f27cdefc40a9 100644 GIT binary patch literal 70708 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 P&t^MF5pgp%b=LhK5n}`z From a191f0f32952a132cc1e5a426d5d01b828d2043c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:35:23 +0100 Subject: [PATCH 0785/1620] New translations log4j2.xml (French) --- .../earth/app/view/Messages_fr.properties | 262 +++--------------- 1 file changed, 37 insertions(+), 225 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index f0355142d0..893729524c 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,225 +1,37 @@ -AboutDialog.19=कोई समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ -AboutDialog.5=अधिक जानकारी के लिठहमारी वेबसाइट पर जाà¤? OpenForis.org? -AboutDialog.6=कà¥à¤·à¤®à¤¾ करें, à¤à¤• समसà¥à¤¯à¤¾ आपके सिसà¥à¤Ÿà¤® के मानक बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में इस लिंक को खोलने की कोशिश कर रही है. -AboutDialog.8=ठीक -AspectCode.0=उतà¥à¤¤à¤° दिशा -AspectCode.1=उतà¥à¤¤à¤°-पूरà¥à¤µ दिशा -AspectCode.2=पूरà¥à¤µ दिशा -AspectCode.3=दकà¥à¤·à¤¿à¤£-पूरà¥à¤µ दिशा -AspectCode.4=दकà¥à¤·à¤¿à¤£ दिशा -AspectCode.5=दकà¥à¤·à¤¿à¤£-पशà¥à¤šà¤¿à¤® दिशा -AspectCode.6=पशà¥à¤šà¤¿à¤® दिशा -AspectCode.7=उतà¥à¤¤à¤°-पशà¥à¤šà¤¿à¤® दिशा -CollectEarthWindow.0=तà¥à¤°à¥à¤Ÿà¤¿ जब सीà¤à¤¸à¤µà¥€ फ़ाइल में डेटा निरà¥à¤¯à¤¾à¤¤ करने का पà¥à¤°à¤¯à¤¾à¤¸ -CollectEarthWindow.1=निरà¥à¤¯à¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.10=फ़ाइल -CollectEarthWindow.11=बाहर जाà¤à¤‚ -CollectEarthWindow.12=उपकरण -CollectEarthWindow.13=डेटा सीà¤à¤¸à¤µà¥€ निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.14=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ -CollectEarthWindow.15=गà¥à¤£ -CollectEarthWindow.16=मदद -CollectEarthWindow.17=असà¥à¤µà¥€à¤•रण -CollectEarthWindow.18=डेटाबेस में लापता भूखंडों खोजें -CollectEarthWindow.19=पृथà¥à¤µà¥€ इकटà¥à¤ à¤¾ -CollectEarthWindow.2=भाषा -CollectEarthWindow.20=डà¥à¤ªà¥à¤²à¤¿à¤•ेट रिकॉरà¥à¤¡ की संखà¥à¤¯à¤¾\: -CollectEarthWindow.21=मà¥à¤–à¥à¤¯ फà¥à¤°à¥‡à¤® के लिठआइकन नहीं मिल सकता है -CollectEarthWindow.22=आपको लगता है कि आप à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ बंद करना चाहते हैं? विंडोज बंद करने से, à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° बंद हो जाà¤à¤—ा -CollectEarthWindow.23=पà¥à¤·à¥à¤Ÿà¤¿ की जरूरत है -CollectEarthWindow.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.25=आप वैसे भी इन अभिलेखों को जोड़ना चाहते हैं और अपने वरà¥à¤¤à¤®à¤¾à¤¨ डेटा खोने के लिठकिलक करना चाहते हैं? -CollectEarthWindow.26=ऑपरेटर,पà¥à¤°à¤šà¤¾à¤²à¤• -CollectEarthWindow.27=अदà¥à¤¯à¤¤à¤¨ -CollectEarthWindow.28= औपन फौरिस à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° चल रहा होना चाहिठ, जबभी ऑपरेटर डेटा की वà¥à¤¯à¤¾à¤–à¥à¤¯à¤¾ करें . -CollectEarthWindow.29=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. -CollectEarthWindow.3= आयात संबंधी तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.30=जबभी आप गà¥à¤—ल अरà¥à¤¥ का उपयोग कर रहे हैं, कृपया इस विंडोज को खà¥à¤²à¥€ बनाठरखें. -CollectEarthWindow.31=à¤à¤•तà¥à¤° डेटा सीà¤à¤¸à¤µà¥€ फाइल में भेजें -CollectEarthWindow.32=छोड़ना -CollectEarthWindow.33=ऑपरेटर का नाम के 5 अकà¥à¤·à¤° से बड़ा और 50 अकà¥à¤·à¤° से कम होना चाहिठ-CollectEarthWindow.34=मानà¥à¤¯à¤¤à¤¾ तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.35=ऑपरेटर नाम खाली\!
कृपया ऑपरेटर का नाम भरें और "अदà¥à¤¯à¤¤à¤¨" बटन दबाà¤à¤. -CollectEarthWindow.36=ऑपरेटर नाम रिकà¥à¤¤ नहीं हो सकता -CollectEarthWindow.37=खà¥à¤²à¤¾ रखो -CollectEarthWindow.38=सीà¤à¤¸à¤µà¥€ फ़ाइल -CollectEarthWindow.39=सूचना\: यह सलाह दी जाती है कि आप नठडेटा डालने करने से पहले अपने मौजूदा आंकडों को बैकअप(à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤) कर लें -CollectEarthWindow.4=à¤à¤«à¤à¤“ असà¥à¤µà¥€à¤•रण नोटिस -CollectEarthWindow.40=उस फ़ोलà¥à¤¡à¤° पर जाà¤à¤‚ जहां साà¤à¤•ॠसरà¥à¤µà¤° में सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ किया गया है, फ़ोलà¥à¤¡à¤° का रासà¥à¤¤à¤¾ उपकरण> गà¥à¤£> उनà¥à¤¨à¤¤ टैब. -CollectEarthWindow.41=निरà¥à¤¯à¤¾à¤¤ डेटा को फ़ाइल में बचाया जा रहा है \: -CollectEarthWindow.42=छोड़ना -CollectEarthWindow.43=परसà¥à¤ªà¤° विरोधी रिकॉरà¥à¤¡ पाया -CollectEarthWindow.44=डेटा आयात / निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.45=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ डेटा (संकà¥à¤šà¤¿à¤¤) -CollectEarthWindow.46=ज़िप से नठडेटा आयात करें (संकà¥à¤šà¤¿à¤¤ à¤à¤•à¥à¤¸à¤à¤®à¤à¤²) -CollectEarthWindow.55=सीà¤à¤¸à¤µà¥€ का उपयोग कर मौजूदा रिकॉरà¥à¤¡ को अपडेट करें -CollectEarthWindow.47=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. -CollectEarthWindow.48=ज़िप / à¤à¤•तà¥à¤°-डेटा फ़ाइल -CollectEarthWindow.49=फà¥à¤¯à¥‚जन सीà¤à¤¸à¤µà¥€ फ़ाइल -CollectEarthWindow.5=बंद करे -CollectEarthWindow.50= उपयोगकरà¥à¤¤à¤¾ मैनà¥à¤…ल खोलें -CollectEarthWindow.51=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ के अदà¥à¤¯à¤¤à¤¨ के लिठजाà¤à¤š करें -CollectEarthWindow.52= अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— लॉग फ़ाइल खोलें -CollectEarthWindow.53=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ लॉग फ़ाइल -CollectEarthWindow.54=केà¤à¤®à¤à¤² से लोड अंक -CollectEarthWindow.56=के विषय में... -CollectEarthWindow.57=साà¤à¤•ॠसà¥à¤Ÿà¤¾à¤°à¥à¤Ÿà¤° पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ अभी भी चल रहा है, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें. -CollectEarthWindow.58=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ नहीं कर सकते -CollectEarthWindow.59=आप साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ के लिठडेटा सेट फिर से उतà¥à¤ªà¤¨à¥à¤¨ करने के लिठकरना चाहते हैं?
यह पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ समय लेने वाली हो सकती है.
आप यदि "हाà¤"पर कà¥à¤²à¤¿à¤• करें, तो नवीनतम जानकारी के साथ à¤à¤• नया डाटासेट उतà¥à¤ªà¤¨à¥à¤¨ हो जाà¤à¤—ा. -CollectEarthWindow.6=फà¥à¤¯à¥‚जन टेबल के लिठनिरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.60=साà¤à¤•ॠडेटा उतà¥à¤ªà¤¨à¥à¤¨ -CollectEarthWindow.61=डेटा à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ (पिछले निरà¥à¤¯à¤¾à¤¤ के बाद से संशोधित रिकॉरà¥à¤¡) -CollectEarthWindow.62=के विषय मे... -CollectEarthWindow.63=केà¤à¤®à¤à¤² से अंक पà¥à¤°à¤¾à¤ªà¥à¤¤ करने में तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.64=तकनीकी सहायता -CollectEarthWindow.7=डेटा आयात में तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.8=असà¥à¤µà¥€à¤•रण पाठ नहीं पाया जा सका -CollectEarthWindow.9=डेटा आयात रिकॉरà¥à¤¡ वह है जो कि पहले से ही अपने डेटाबेस पर मौजूद हैं शामिल. -DynamicsCode.0=पà¥à¤°à¤¾à¤°à¤‚भ में वन -DynamicsCode.1=पà¥à¤°à¤¾à¤°à¤‚भ में घास का मैदान, -DynamicsCode.2=पà¥à¤°à¤¾à¤°à¤‚भ में आबादी वाला इलाका -DynamicsCode.3=पà¥à¤°à¤¾à¤°à¤‚भ में बंजर -DynamicsCode.4=पà¥à¤°à¤¾à¤°à¤‚भ में आरà¥à¤¦à¥à¤° भूमि -DynamicsCode.5=पà¥à¤°à¤¾à¤°à¤‚भ में खेत -OpenTextFileListener.0=इस पाठ का फ़ाइल नहीं मिला \: -OptionWizard.0= विकलà¥à¤ª -OptionWizard.1=बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° चà¥à¤¨à¥‡à¤‚ -OptionWizard.10=बैकअप फ़ोलà¥à¤¡à¤° खोलें -OptionWizard.11=अजà¥à¤žà¤¾à¤¤\: उपयोग ifconfig -OptionWizard.12=गà¥à¤°à¤¾à¤¹à¤•ों का उलà¥à¤²à¥‡à¤– -OptionWizard.13=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° आईपी -OptionWizard.14=कतà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ (उदाहरण- 8023) -OptionWizard.15=बचाà¤à¤‚ और परिवरà¥à¤¤à¤¨ लागू करें -OptionWizard.16=आईडी -OptionWizard.17=X- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क -OptionWizard.18=Y- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क -OptionWizard.19=उठान -OptionWizard.2=कारà¥à¤¯à¤ªà¥à¤°à¤µà¤¾à¤¹ (सरà¥à¤µà¤° / गà¥à¤°à¤¾à¤¹à¤•) -OptionWizard.20=गूगल अरà¥à¤¥ अंतरà¥à¤µà¤¸à¥à¤¤à¥ बदल दिया गया है
यदि गà¥à¤—ल अरà¥à¤¥ आप से कहे,अंतरà¥à¤µà¤¸à¥à¤¤à¥ पà¥à¤¨à¤ƒ लोड सà¥à¤µà¥€à¤•ार करें . -OptionWizard.21=अदà¥à¤¯à¤¤à¤¨ सफल -OptionWizard.22=ढाल -OptionWizard.23=गूगल अरà¥à¤¥ डेटा को फिर से खोलने में कोई तà¥à¤°à¥à¤Ÿà¤¿ थी -OptionWizard.24=रदà¥à¤¦ करना -OptionWizard.25=ऑपरेशन मोड -OptionWizard.26=डीबी होसà¥à¤Ÿ -OptionWizard.27=यह à¤à¤• मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ साà¤à¤•ॠफ़ोलà¥à¤¡à¤° नहीं है ( सà¥à¤Ÿà¤¾à¤°à¥à¤Ÿ-साà¤à¤•à¥.batफ़ाइल मौजूद नहीं है) -OptionWizard.28=साà¤à¤•ॠसरà¥à¤µà¤° मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ नहीं -OptionWizard.29=डीबी पोरà¥à¤Ÿ -OptionWizard.3=सरà¥à¤µà¤° आवृतà¥à¤¤à¤¿ -OptionWizard.30=à¤à¤¸à¤•à¥à¤¯à¥ लाइट विकलà¥à¤ª -OptionWizard.31=सेमà¥à¤ªà¤² डेटा -OptionWizard.32=पà¥à¤²à¥‰à¤Ÿ लेआउट -OptionWizard.33=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ परिभाषा -OptionWizard.34=विकसित -OptionWizard.35=सेमà¥à¤ªà¤² अंक की संखà¥à¤¯à¤¾ -OptionWizard.36=सेमà¥à¤ªà¤² बिंदॠके बीच दूरी (मीटर में) -OptionWizard.37=भूखंड की सीमा के साथ मारà¥à¤œà¤¿à¤¨ (मीटर मे) -OptionWizard.38=सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सही ढंग से पढ़ा नहीं जा सकता.
इस फ़ाइल में à¤à¤• अलà¥à¤ªà¤µà¤¿à¤°à¤¾à¤® से अलग मूलà¥à¤¯à¥‹à¤‚ की उमà¥à¤®à¥€à¤¦ है \:
-OptionWizard.39=आईडी, वाई समनà¥à¤µà¤¯, à¤à¤•à¥à¤¸ समनà¥à¤µà¤¯, ऊंचाई, ढाल, पहलू -OptionWizard.4=वरà¥à¤¤à¤®à¤¾à¤¨ कंपà¥à¤¯à¥‚टर आईपी \: -OptionWizard.40=परियोजनाà¤à¤‚ -OptionWizard.41=à¤à¤• नई परियोजना फ़ाइल लोड करें -OptionWizard.42=सीà¤à¤¸à¤µà¥€ पाठक को बंद करते समय तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.43=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ का नाम -OptionWizard.44= सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ बैकअप डेटाबेस -OptionWizard.45=ओपन पृथà¥à¤µà¥€ इंजन ने पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° में जूम किया -OptionWizard.46=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठपृथà¥à¤µà¥€ इंजन टाइमलैपà¥à¤¸ खोलें -OptionWizard.47=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठबिंग मैपà¥à¤¸ खोलें -OptionWizard.48=बजाय गूगल अरà¥à¤¥ के फॉरà¥à¤® à¤à¤• बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° पर खोलें (लिनकà¥à¤¸ के लिठसिफारिश) -OptionWizard.49=भूखंड डेटा के साथ सीईडी / सीà¤à¤¸à¤µà¥€ फाइल भेजने के लिठपथ -OptionWizard.5=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ\: -OptionWizard.50=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.51=परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.52=केवल निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क के साथ सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल -OptionWizard.53=चौकोर -OptionWizard.54=केनà¥à¤¦à¥à¤°à¥€à¤¯ बिनà¥à¤¦à¥ -OptionWizard.55=परियोजना फ़ोलà¥à¤¡à¤° आयात तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.56=लोड परियोजना -OptionWizard.57=पहले से लोड परियोजना -OptionWizard.58= जी ई ई का मैदान खोलें (विशà¥à¤µà¤¸à¤¨à¥€à¤¯ जांचकरà¥à¤¤à¤¾ के उपयोग की आवशà¥à¤¯à¤•ता है) -OptionWizard.59=यहां भूखंड पर केंदà¥à¤°à¤¿à¤¤ मैपà¥à¤¸ खोलें -OptionWizard.6=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² डीबी मापदंड -OptionWizard.65=साà¤à¤•à¥à¤«à¤¼à¥‹à¤²à¥à¤¡à¤° का पथ -OptionWizard.66=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.67=फ़ायरफ़ॉकà¥à¤¸ निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ -OptionWizard.68=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.7=उपयोगकरà¥à¤¤à¤¾ नाम -OptionWizard.70=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों -OptionWizard.72=बाइनरी फ़ाइलें -OptionWizard.73=कà¥à¤°à¥‹à¤® निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ -OptionWizard.74=बà¥à¤°à¤¾à¤‰à¤œ -OptionWizard.76=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों -OptionWizard.78=बाइनरी फ़ाइलें -OptionWizard.79=केà¤à¤®à¤à¤² फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ के लिठपथ -OptionWizard.8=पासवरà¥à¤¡ -OptionWizard.80=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.82=फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ -OptionWizard.83=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ पà¥à¤°à¤ªà¤¤à¥à¤° डिज़ाइन करने के लिठपथ -OptionWizard.84=बà¥à¤°à¤¾à¤‰à¤œ..... -OptionWizard.86=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² वेब पेज -OptionWizard.87=पथ आइडीà¤à¤® परिभाषा के साथ à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठ-OptionWizard.88=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.9=डीबी नाम -OptionWizard.90=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² आइडीà¤à¤® परिभाषा -OptionWizard.91=सरà¥à¤µà¤° (पà¥à¤°à¤¬à¤‚धक संसà¥à¤•रण या खड़े अकेले का उपयोग करें) -OptionWizard.92=कà¥à¤²à¤¾à¤‡à¤‚ट (ऑपरेटर / सरà¥à¤µà¤° से जà¥à¤¡à¤¼à¥‡) -OptionWizard.93=सकà¥à¤¯à¥‚à¤à¤²à¤¾à¤‡à¤Ÿ (à¤à¤‚बेडेड / à¤à¤•ल फाइल आधारित) -OptionWizard.94=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² -OptionWizard.95=सेमà¥à¤ªà¤² डॉटà¥à¤¸ के साइड (मीटर में) -SaikuAnalysisListener.0=हाठ- ताज़ा साà¤à¤•ॠडेटा (लंबी पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾) -SaikuAnalysisListener.1=नहीं - बस साà¤à¤•ॠशà¥à¤°à¥‚ -SaikuStarter.1=साà¤à¤•ॠशà¥à¤°à¥‚ -SaikuStarter.2= साà¤à¤•ॠशà¥à¤°à¥‚ कà¥à¤› मिनट लग सकते हैं, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें\! -SaveEarthDataServlet.0=खाली अनà¥à¤°à¥‹à¤§ -SaveEarthDataServlet.1= डेटाबेस में डेटा बचाते समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ है -SaveEarthDataServlet.2=डेटा बचाया था -SlopeCode.0=समतल (0-5) -EarthApp.11=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ पहले से ही चल रहा है -EarthApp.21=à¤à¤• सीà¤à¤¸à¤µà¥€ / सीईडी के रूप में भूखंडों की गà¥à¤°à¤¿à¤¡ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
-EarthApp.23=कोई सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सेट-अप नहीं किया गया है \:

-EarthApp.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² परिभाषा के साथ फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है \:
-EarthApp.26=कोई à¤à¤•à¥à¤¸à¤à¤®à¤à¤² फ़ाइल परिभाषा सेट अप नहीं किया गया है \:

-EarthApp.27=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ रूप से यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
-EarthApp.29=कोई à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ फ़ाइल सेट-अप नहीं किया गया है \:

-EarthApp.3=मà¥à¤à¥‡ बाद में याद दिलाना -EarthApp.30=उपकरण> गà¥à¤£ मेनू में फ़ाइल सà¥à¤¥à¤¾à¤¨ को ठीक करें . -EarthApp.4=अभी अदà¥à¤¯à¤¤à¤¨ करें -EarthApp.5=मà¥à¤à¥‡ दà¥à¤¬à¤¾à¤°à¤¾ याद मत दिलाना -EarthApp.57=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ का à¤à¤• नया संसà¥à¤•रण उपलबà¥à¤§ है\!
आप कैसे आगे बढ़ना चाहते हैं? -EarthApp.58=अदà¥à¤¯à¤¤à¤¨ चेतावनी -EarthApp.59= परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ -EarthApp.6=\ - संसà¥à¤•रण -EarthApp.61=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ फाइल खà¥à¤² नहीं सकती .
कृपया सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करें कि गूगल अरà¥à¤¥ सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ है. -EarthSurveyService.9=आवशà¥à¤¯à¤• कà¥à¤·à¥‡à¤¤à¥à¤° -ExportActionListener.1= तारीख चूनें जबसे रिकॉरà¥à¤¡ निरà¥à¤¯à¤¾à¤¤ करने है -ExportDialogProcessMonitor.0=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... -ExportDialogProcessMonitor.1=पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ पà¥à¤°à¤¾à¤°à¤‚भ करने के लिठपà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ कर रहा है \: -ExportDialogProcessMonitor.4=निरà¥à¤¯à¤¾à¤¤ रिकॉरà¥à¤¡\: -ImportProcessMonitorDialog.0=आयातित रिकॉरà¥à¤¡ \: -ImportActionListener.0=कà¥à¤¯à¤¾ उन भूखंडों के लिठडेटा जो कि पूरी तरह से भरे नहीं गठ,आयातित किया जाना चाहिà¤? -ImportActionListener.2=आप कà¥à¤²à¤¿à¤• करें, नहींतो केवल डेटा "हरी" राजà¥à¤¯ में भूखंडों से ,जिसमें सभी डेटा यà¥à¤•à¥à¤¤ है , आयात किया जाà¤à¤—ा। -ImportDialogProcessMonitor.0=\ गणना -ImportDialogProcessMonitor.11=रिकॉरà¥à¤¡ की पà¥à¤°à¤¾à¤°à¤‚भिक संखà¥à¤¯à¤¾ \: -ImportDialogProcessMonitor.2=रिकॉरà¥à¤¡ आयात... -ImportDialogProcessMonitor.5=आयातित रिकॉरà¥à¤¡ की वासà¥à¤¤à¤µà¤¿à¤• संखà¥à¤¯à¤¾ \: -ImportDialogProcessMonitor.8=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... -InfiniteProgressMonitor.0=रदà¥à¤¦ ऑपरेशन -JFileChooserExistsAware.0=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ परियोजना फ़ाइल -KmlImportService.13=पà¥à¤²à¥‰à¤Ÿ सà¥à¤¥à¤¾à¤¨à¥‹à¤‚ को बचाने के लिठà¤à¤• सीà¤à¤¸à¤µà¥€ फ़ाइल का चयन करें -MissingPlotsListener.0=तà¥à¤°à¥à¤Ÿà¤¿ उन भूखंडों के बारे में जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ करने के लिठजो डेटाबेस पर मौजूद नहीं -MissingPlotsListener.1=गà¥à¤® भूखंड -MissingPlotsListener.10=सेमà¥à¤ªà¤² डिजाइन में भूखंडों की कà¥à¤² संखà¥à¤¯à¤¾ \: -MissingPlotsListener.12=गà¥à¤® भूखंडों की संखà¥à¤¯à¤¾ \: -MissingPlotsListener.14=सभी भूखंडों भर रहे हैं\! -MissingPlotsListener.2=कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ अंतरà¥à¤µà¤¸à¥à¤¤à¥ की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ -MissingPlotsListener.3=भूखंड की जानकारी वाले फ़ाइलें चà¥à¤¨à¥‡à¤‚ ( .सीà¤à¤¸à¤µà¥€ या .सीईडी फ़ाइलें ) जिसके लिठआप जानना चाहते हैं तो सभी डेटा भर दिया गया है चाहता हूà¤. -MissingPlotsListener.4=गà¥à¤® भूखंड- जानकारी -MissingPlotsListener.5=फ़ाइल से \: -MissingPlotsListener.6=सीà¤à¤¡à¥€ फ़ाइल में निरà¥à¤¯à¤¾à¤¤ करें -ProcessMonitorDialog.1=पंकà¥à¤¤à¤¿ संखà¥à¤¯à¤¾ पर तà¥à¤°à¥à¤Ÿà¤¿ -ProcessMonitorDialog.4=, कॉलम -ProcessMonitorDialog.5=\ --मूलà¥à¤¯ -YES= हां -YES_TO_ALL=सब को हां -NO=नहीं -NO_TO_ALL=सभी को नहीं + + + + + + + + + + + + %-5p %d [%t] %c: %m%n + + + + + + + + + + + + + + [%-5level] %d{yyyy-MM-dd HH:mm:ss} %msg%n + + + + + + + + + + + From 3cefc136328645aa2fb12135af824f26b8add857 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:35:24 +0100 Subject: [PATCH 0786/1620] New translations log4j2.xml (Spanish) --- .../earth/app/view/Messages_es.properties | 257 +++--------------- 1 file changed, 37 insertions(+), 220 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index e5b9bd9e45..893729524c 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,220 +1,37 @@ -AboutDialog.19 = ບັນ​ຫາ​ເàºàºµàº” A -AboutDialog.5 = ສà»àº²â€‹àº¥àº±àºšâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹à»€àºžàºµà»ˆàº¡â€‹à»€àº•ີມ​ໄດ້​ທີ່ OpenForis.org ເວັບ​ໄຊ​ທ​໌​ຂອງ​ພວàºâ€‹à»€àº®àº»àº² -AboutDialog.6 = ຂà»â€‹à»‚ທດ​ນà»àº²â€‹, ບັນ​ຫາ​ທີ່​ເàºàºµàº”​ຂຶ້ນ​ໃນ​ຂະ​ນະ​ທີ່​ຄວາມ​ພະ​àºàº²â€‹àºàº²àº¡â€‹àº—ີ່​ຈະ​ເປີດ​àºàº²àº™â€‹à»€àºŠàº·à»ˆàº­àº¡â€‹àº•à»à»ˆâ€‹àº™àºµà»‰â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹àº¥àº°â€‹àºšàº»àºšâ€‹àº‚ອງ​ທ່ານ​ຕົວ​ທ່ອງ​ເວັບ​ຂອງ​ມາດ​ຕະ​ຖານ​. -AboutDialog.8 = Ok -AspectCode.0 = ເຫນືອ -AspectCode.1 = ວັນ​ອອàºâ€‹àºªà»ˆàº½àº‡â€‹à»€àº«àº™àº·àº­ -AspectCode.2 = ຕາ​ເວັນ​ອອຠ-AspectCode.3 = ພາàºâ€‹à»ƒàº•້​, ຕາ​ເວັນ​ອອຠ-AspectCode.4 = ໃຕ້ -AspectCode.5 = ພາàºâ€‹à»ƒàº•້​, ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ-AspectCode.6 = ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ-AspectCode.7 = ພາàºâ€‹à»€àº«àº™àº·àº­â€‹, ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ-CollectEarthWindow.0 = ໃນ​ເວ​ລາ​ທີ່​ພະ​àºàº²â€‹àºàº²àº¡â€‹à»€àºžàº·à»ˆàº­â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌ CSVຄວາມ​ຜິດ​ພາດ -CollectEarthWindow.1 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àº -CollectEarthWindow.10 File \= -CollectEarthWindow.11 ອອàºâ€‹àºˆàº²àº \= -CollectEarthWindow.12 = ເຄື່ອງ​ມືຂà»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.13 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ CSV àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ -CollectEarthWindow.14 = Start SAIKU -CollectEarthWindow.15 = ຄຸນ​ສົມ​ບັດ -CollectEarthWindow.16 = ຊ່ວàºâ€‹à»€àº«àº¼àº·àº­ -CollectEarthWindow.17 = ປະ​ຕິ​ເສດ -CollectEarthWindow.18 = ຄົ້ນ​ຫາ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ຫາàºâ€‹à»„ປ​ໃນ​ຖານ​ຂà»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.19 = ເàºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ-CollectEarthWindow.2 = ພາ​ສາ -CollectEarthWindow.20 = ຈà»àº²â€‹àº™àº§àº™â€‹àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™ duplicated​\: -CollectEarthWindow.21 = ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ຊອàºâ€‹àº«àº² icon ສà»àº²â€‹àº¥àº±àºšâ€‹àºžàº²â€‹àº•ົ້ນ​ຕ໠-CollectEarthWindow.22 = ທ່ານ​ມີ​ຄວາມ​à»àº™à»ˆâ€‹à»ƒàºˆàº§à»ˆâ€‹àº²â€‹àº—່ານ​ຕ້ອງ​àºàº²àº™â€‹àº›àº´àº”​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹? ໃນ​àºàº²àº™â€‹àº›àº´àº”​ປ່ອງ​ຢ້ຽມ​àºàº±àº‡â€‹àºˆàº°â€‹àº›àº´àº”​ເຄື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹àº‚ອງ​ໂລàºâ€‹à»„ດ້​ເàºàº±àºšâ€‹àºà»àº² -CollectEarthWindow.23 = àºàº²àº™â€‹àº¢àº±à»‰àº‡â€‹àº¢àº·àº™â€‹àº—ີ່​ຈà»àº²â€‹à»€àº›àº±àº™ -CollectEarthWindow.24 = XML ສົ່ງ​ອອຠ-CollectEarthWindow.25 = ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ເພີ່ມ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹à»€àº«àº¼àº»à»ˆàº²â€‹àº™àºµà»‰â€‹à»àº¥à»‰àº§â€‹à»àº¥àº°â€‹àºàº²àº™â€‹àºªàº¹àº™â€‹à»€àºªàºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº‚ອງ​ທ່ານ​? -CollectEarthWindow.26 = ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™ -CollectEarthWindow.27 = ປັບ​ປຸງ -CollectEarthWindow.28 = ເຮັດ​ຢູ່​ຕ່າງ​ປະ​ເທດ​ເàºàº±àºšâ€‹àºà»àº²â€‹à»€àº„ື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹àº„ວນ​ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹à»àº¥à»ˆàº™â€‹à»ƒàº™â€‹àº‚ະ​ນະ​ທີ່​ຜູ້​ປະ​àºàº­àºšâ€‹àºàº²àº™â€‹àº•ີ​ຄວາມ​ຫມາàºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹. -CollectEarthWindow.29 = The Saiku Server ບà»à»ˆâ€‹à»„ດ້​ຖືàºâ€‹àº•ັ້ງ​. -CollectEarthWindow.3 = \ ຄວາມ​ຜິດ​ພາດ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ -CollectEarthWindow.30 = àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº®àº±àºâ€‹àºªàº²â€‹àºàº²àº™â€‹à»€àº›àºµàº”​ຫນ້າ​ຕ່າງ​ນີ້​ໃນ​ຂະ​ນະ​ທີ່​ທ່ານ​àºà»àº²â€‹àº¥àº±àº‡â€‹à»ƒàºŠà»‰â€‹àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹. -CollectEarthWindow.31 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌ CSV -CollectEarthWindow.32 = ອອຠ-CollectEarthWindow.33 = ຊື່​ຜູ້​ປະ​àºàº­àºšâ€‹àºàº²àº™â€‹àºˆàº°â€‹àº•້ອງ​ມີ​àºàº²àº™â€‹àº•à»à»ˆâ€‹à»„ປ​ອີàºâ€‹à»àº¥à»‰àº§â€‹àºâ€‹à»ˆâ€‹àº§àº² 5 ລັàºâ€‹àºªàº°â€‹àº™àº°â€‹à»àº¥àº°â€‹àºªàº±à»‰àº™â€‹àºâ€‹à»ˆâ€‹àº§àº² 50ຄວາມ​ຜິດ​ພາດ -CollectEarthWindow.34 = àºàº§àº”​ສອບ -CollectEarthWindow.35 = ຜູ້​ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹àº¥àº»àºšâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™ ​\! ຫລັàºâ€‹àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº•ື່ມ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàºªà»ˆâ€‹àºŠàº·à»ˆâ€‹àºœàº¹à»‰â€‹àº›àº°â€‹àºàº­àºšâ€‹àºàº²àº™â€‹à»àº¥àº°â€‹à»ƒàº«à»‰â€‹àºàº»àº”​ປຸ່ມ "ປັບ​ປຸງ​"​. ຊື່ -CollectEarthWindow.36 = ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹àºšà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ເປົ່າ -CollectEarthWindow.37 = ຮັàºâ€‹àºªàº²â€‹àºˆàº±àº™à»„ຟລ​໌ -CollectEarthWindow.38 = CSV -CollectEarthWindow.39 à»àºˆà»‰àº‡ \= ມັນ​ເປັນ​àºàº²àº™â€‹àºªàº»àº¡â€‹àº„ວນ​ທີ່​ທ່ານ​ໄປ​ເຖິງ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº‚ອງ​ທ່ານ (àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ XML​) àºà»ˆàº­àº™â€‹àº—ີ່​ຈະ​ໄດ້​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº«àº¡à»ˆâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ -CollectEarthWindow.4 = FAO à»àºˆà»‰àº‡â€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ເສດ -CollectEarthWindow.40 = ທີ່​àºà»àº²â€‹àº™àº»àº”​ໄວ້​ຕາມ​ເສັ້ນ​ທາງ​àºàº±àºšâ€‹à»‚ຟນ​ເດີ​ທີ່ Saiku Server ໄດ້​ຖືàºâ€‹àº•ິດ​ຕັ້ງ​ຢູ່​ໃນ Tools-> Properties-> à»àº–ບ​à»àºšàºšâ€‹àºžàº´â€‹à»€àºªàº”​ໄດ້​. -CollectEarthWindow.41 = àºàº²àº™â€‹àº›àº°â€‹àº«àºàº±àº”​àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌​\: -CollectEarthWindow.42 = ອອຠ-CollectEarthWindow.43 = àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº•à»àº²â€‹àºàº±àº™â€‹àº—ີ່​ພົບ​ເຫັນ -CollectEarthWindow.44 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ / ສົ່ງ​ອອàºàº‚à»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.45 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ XML (à»àº›â€‹)ຂà»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.46 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ໃຫມ່​ຈາàºâ€‹à»„ປ​ສະ​ນີ (XML à»àº›â€‹)àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™ -CollectEarthWindow.55 ປັບ​ປຸງ \= àºàº²àº™â€‹àº™à»àº²â€‹à»ƒàºŠà»‰ CSV -CollectEarthWindow.47 = Saiku Server ບà»à»ˆâ€‹à»„ດ້​àºà»àº²â€‹àº«àº™àº»àº” -CollectEarthWindow.48 = ໄຟລ​໌​ຫັດ​ໄປ​ສະໄຟລ​໌ -CollectEarthWindow.49 = Fusion CSV -CollectEarthWindow.5 = ປິດ -CollectEarthWindow.50 = ເປີດ​ຄູ່​ມື​àºàº²àº™â€‹à»ƒàºŠà»‰àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™â€‹àº›àº±àºšâ€‹àº›àº¸àº‡â€‹àº‚ອງ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ-CollectEarthWindow.51 CHECK \= àºàº§àº”​ສອບ -CollectEarthWindow.52 = File ເຂົ້າ​ສູ່​ລະ​ບົບ​ຄà»àº²â€‹àº®à»‰àº­àº‡â€‹àºªàº°â€‹àº«àº¡àº±àºâ€‹à»€àº›àºµàº” -CollectEarthWindow.53 = àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»€àº­â€‹àºàº°â€‹àºªàº²àº™â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹à»€àº‚ົ້າ​ສູ່​ລະ​ບົບຈຸດ -CollectEarthWindow.54 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຈາຠKMLàºà»ˆàº½àº§â€‹àºàº±àºš -CollectEarthWindow.56 = ... -CollectEarthWindow.57 = ຂະ​ບວນ​àºàº²àº™â€‹à»€àº¥àºµà»ˆàº¡â€‹àº•ົ້ນ Saiku à»àº¡à»ˆàº™â€‹àºàº±àº‡â€‹à»àº¥à»ˆàº™â€‹, àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº¥à»â€‹àº–້າ​. -CollectEarthWindow.58 = ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ເລີ່ມ​ຕົ້ນ​àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ Saiku -CollectEarthWindow.59 = ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ Re​\: àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ Saiku ໄດ້​?
ຂະ​ບວນ​àºàº²àº™â€‹àº™àºµà»‰â€‹àºªàº²â€‹àº¡àº²àº”​ໃຊ້​ເວ​ລາ​ຫຼາàº
ຖ້າ​ທ່ານ​ຄລິàºâ€‹à»ƒàºªà»ˆ "à»àº¡à»ˆàº™â€‹à»àº¥à»‰àº§â€‹" ເປັນ​ຊຸດ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໃຫມ່​ທີ່​ມີ​ຄວາມ​ຫຼ້າ​ສຸດ​ໄດ້​. ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº‚ຶ້ນ​. -CollectEarthWindow.6 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ Fusion ຕາ​ຕະ​ລາງàºàº²àº™â€‹àºœàº°â€‹àº¥àº´àº”​ຂà»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.60 = Saiku -CollectEarthWindow.61 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່ XML (àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº”ັດ​à»àºà»‰â€‹àº™àº±àºšâ€‹àº•ັ້ງ​à»àº•່​àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àºªàº¸àº”​ທ້າàºâ€‹) ສົ່ງ​ອອàºàºà»ˆàº½àº§â€‹àºàº±àºš -CollectEarthWindow.62 = ... -CollectEarthWindow.63 Error \= àºàº²àº™â€‹à»„ດ້​ຮັບ​ຈຸດ​ທີ່​ໄດ້​ຈາຠKML -CollectEarthWindow.64 = ສະ​ຫນັບ​ສະ​ຫນູນ​ທາງ​ເທàºâ€‹àº™àº´àº -CollectEarthWindow.7 Error \= ໃນ​ເວ​ລາ​ທີ່​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຂà»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.8 ຂà»à»‰â€‹àº„ວາມ​ປະ​ຕິ​ເສດ \= ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ພົບ​ເຫັນ -CollectEarthWindow.9 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໄດ້​ນà»àº²â€‹à»€àº‚ົ້າ​ມາ​ປະ​àºàº­àºšâ€‹àº”້ວàºâ€‹àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àº—ີ່​ມີ​ຢູ່​à»àº¥à»‰àº§â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚ອງ​ທ່ານ​. -DynamicsCode.0 = ປ່າ​ໄມ້​ໃນ​ເບື້ອງ​ຕົ້ນ -DynamicsCode.1 = ທົ່ງ​ຫàºà»‰àº²â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ -DynamicsCode.2 = àºàº²àº™â€‹àº•ັ້ງ​ຖິ່ນ​ຖານ​ໃນ​ເບື້ອງ​ຕົ້ນ -DynamicsCode.3 = ເບື້ອງ​ຕົ້ນ Otherland -DynamicsCode.4 = ຊຸ່ມ​ນ​້​à»àº²â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ -DynamicsCode.5 = ເບື້ອງ​ຕົ້ນ Cro​​pland -OpenTextFileListener.0 = ໄຟລ​໌​ຂà»à»‰â€‹àº„ວາມ​à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹à»„ດ້​ພົບ​ໄດ້​ທີ່​\:àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -OptionWizard.0 = ທາງ​ເລືອàºâ€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ-OptionWizard.1 = ເລືອàºâ€‹àº‚ອງ​ຕົວ​ທ່ອງ​ເວັບ -OptionWizard.10 = ໂຟ​ເດີ​ສà»àº²â€‹àº®àº­àº‡â€‹àºˆàº±àº™ -OptionWizard.11 = ບà»à»ˆâ€‹àº®àº¹à»‰â€‹àºˆàº±àºâ€‹\: àºàº²àº™â€‹àº™à»àº²â€‹à»ƒàºŠà»‰ ifconfig -OptionWizard.12 = ລູàºâ€‹àº„້າ​ຕົວ​ຢ່າງàºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -OptionWizard.13 = ໂລຠIP Serveràºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -OptionWizard.14 = port ໂລຠServer (ຕົວ​ຢ່າງ​\: 8023​) -OptionWizard.15 = ບັນ​ທຶàºâ€‹à»àº¥àº°â€‹à»ƒàºŠà»‰â€‹àºàº²àº™â€‹àº›à»ˆàº½àº™â€‹à»àº›àº‡ -OptionWizard.16 = ລະ​ຫັດ -OptionWizard.17 = X​-coord -OptionWizard.18 = Y coord​, -OptionWizard.19 = àºàº²àº™â€‹àºàº»àºâ€‹àº¥àº°â€‹àº”ັບ -OptionWizard.2 = ບວນ​àºàº²àº™â€‹à»€àº®àº±àº”​ວຽຠ(server / ລູàºâ€‹àº„້າ​) -OptionWizard.20 = ໄດ້​ເນື້ອ​ໃນ​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»„ດ້​ມີ​àºàº²àº™â€‹àº›à»ˆàº½àº™â€‹à»àº›àº‡â€‹.
àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº®àº±àºšâ€‹à»‚ຫລດ​ເນື້ອ​ຫາ​ໃນ​ເວ​ລາ​ທີ່​ທ່ານ​àºà»àº²â€‹àº¥àº±àº‡â€‹àº®àº±àºšâ€‹àºàº²àº™â€‹àºàº°â€‹àº•ຸ້ນ​ໂດàºâ€‹àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹. -OptionWizard.21 = ປັບ​ປຸງ​ສົບ​ຜົນ​ສà»àº²â€‹à»€àº¥àº±àº” -OptionWizard.22 = ຄ້ອຠ-OptionWizard.23 = ມີ​ຄວາມ​ຜິດ​ພາດ​ໃນ​ເວ​ລາ Re​\: ເປີດ​ໄດ້​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»€àº›àº±àº™â€‹à»„ດ້àºàº»àºâ€‹à»€àº¥àºµàºâ€‹àºàº²àº™ -OptionWizard.24 = àºàº»àºà»€àº¥àºµàºàºàº²àº™ -OptionWizard.25 = ຮູບ​à»àºšàºšâ€‹àºàº²àº™â€‹àº”à»àº²â€‹à»€àº™àºµàº™â€‹àº‡àº²àº™ -OptionWizard.26 = àºàº²àº™â€‹à»€àº›àº±àº™â€‹à»€àºˆàº»à»‰àº²â€‹àºžàº²àºš DB -OptionWizard.27 = ນີ້​ບà»à»ˆâ€‹à»„ດ້​ເປັນ​ທີ່​àºàº­àº¡â€‹àº®àº±àºš Saiku Folder (ເອ​àºàº°â€‹àºªàº²àº™â€‹à»€àº¥àºµà»ˆàº¡ saiku.bat ບà»à»ˆâ€‹à»àº¡à»ˆàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹) -OptionWizard.28 = Saiku Server ບà»à»ˆâ€‹àº®àº­àº‡â€‹àº®àº±àºš -OptionWizard.29 = ພ໠DB -OptionWizard.3 = Server ຕົວ​ຢ່າງ -OptionWizard.30 = ທາງ​ເລືອຠSQLite -OptionWizard.31 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº•ົວ​ຢ່າງ -OptionWizard.32 = ຮູບ​à»àºšàºšâ€‹àº”ິນ​ຕອນ -OptionWizard.33 = ສà»àº²â€‹àº«àº¼àº§àº”​ນຸ​àºàº»àº¡ -OptionWizard.34 = à»àºšàºšâ€‹àºžàº´â€‹à»€àºªàº” -OptionWizard.35 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ຈຸດ​ຕົວ​ຢ່າງ -OptionWizard.36 = ໄລ​àºàº°â€‹àº—າງ​ລະ​ຫວ່າງ​ຈຸດ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àº•ົວ​ຢ່າງ (ໃນ​ຕາ​) -OptionWizard.37 = ອັດ​ຕາ​ທີ່​ມີ​ຊາàºâ€‹à»àº”ນ​ດິນ​ຕອນ (à»àº¡àº±àº”​) -OptionWizard.38 = ໄຟລ​໌ CSV / CED ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ອ່ານ​ໄດ້​ຢ່າງ​ຖືàºâ€‹àº•້ອງ
ເອ​àºàº°â€‹àºªàº²àº™â€‹à»„ດ້​ຖືàºâ€‹àº„າດ​ວ່າ​ຈະ​ມີ​ມູນ​ຄ່າ​àºàº²àº™â€‹à»àºàºâ€‹àºˆàº¸â€‹àº¥àº°â€‹àºžàº²àºâ€‹à»€àºŠàº±à»ˆàº™â€‹àº™àºµà»‰â€‹\:​.
-OptionWizard.39 = ລະ​ຫັດ​, YCoordinate​, XCoordinate​, ພູ​, ລັàºâ€‹àºªàº°â€‹àº™àº° -OptionWizard.4 = IP ຄອມ​ພິວ​ເຕີ​ປັດ​ຈຸ​ບັນ​\: -OptionWizard.40 = ໂຄງ​àºàº²àº™ -OptionWizard.41 = ໂຫຼດ​ໄຟລ​໌​ໂຄງ​àºàº²àº™â€‹à»ƒàº«àº¡à»ˆ -OptionWizard.42 = ຜິດ​ພາດ​ໃນ​ເວ​ລາ​ປິດ​àºàº²àº™â€‹àº­à»ˆàº²àº™ CSV -OptionWizard.43 = ຊື່​ຂອງ​àºàº²àº™â€‹àºªà»àº²â€‹àº«àº¼àº§àº” -OptionWizard.44 = ຖານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ປ​ໃຫ້​ເຖິງ​ອັດ​ຕະ​ໂນ​ມັດ​ທີ່ -OptionWizard.45 = Open Earth Engine ຊູມ​ເຂົ້າ​ໄປ​ໃນ​ເຂດ​ຕອນ​ດິນ​ຂອງ​ຕົນ -OptionWizard.46 = timelapse ຈັàºâ€‹à»€àº›àºµàº”​ໂລàºâ€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºžàº·à»‰àº™â€‹àº—ີ່​ຕອນ​ດິນ​ຂອງ​ຕົນ -OptionWizard.47 = Open à»àºœàº™ Bing ສà»àº²â€‹àº¥àº±àºšâ€‹àºžàº·à»‰àº™â€‹àº—ີ່​ຕອນ​ດິນ​ຂອງ​ຕົນ -OptionWizard.48 = ຮູບ​à»àºšàºšâ€‹à»€àº›àºµàº”​ໃນ​ຕົວ​ທ່ອງ​ເວັບ​ຂອງ​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»„ດ້ (à»àº™àº°â€‹àº™à»àº²â€‹à»ƒàº«à»‰â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™ LINUX​) -OptionWizard.49 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™ Ced / csv ໄຟລ​໌​ທີ່​ມີ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº•ອນ​ດິນ​ຂອງ​ຕົນàºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -OptionWizard.5 = port ໂລຠServer​\: -OptionWizard.50 = Browse ... -OptionWizard.51 = ເອ​àºàº°â€‹àºªàº²àº™â€‹à»‚ຄງ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຜິດ​ພາດ -OptionWizard.52 = CSV / ເອ​àºàº°â€‹àºªàº²àº™ Ced ມີ​àºàº²àº™â€‹àº›àº°â€‹àºªàº²àº™â€‹àº‡àº²àº™â€‹à»€àº—ົ່າ​ນັ້ນ -OptionWizard.54 = ຈຸດ​ສູນ​àºàº²àº‡ -OptionWizard.55 = Error ໂຟນ​ເດີ​ໂຄງ​àºàº²àº™â€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ -OptionWizard.56 = ໂຄງ​àºàº²àº™ Load -OptionWizard.57 = ໂຄງ​àºàº²àº™ loaded àºà»ˆàº­àº™â€‹àº«àº™à»‰àº²â€‹àº™àºµà»‰ -OptionWizard.58 = Open GEE Code Editor (ຮຽàºâ€‹àº®à»‰àº­àº‡â€‹à»ƒàº«à»‰â€‹àº¡àºµâ€‹àºàº²àº™â€‹à»€àº‚ົ້າ​ເຖິງ Tester Trusted​) -OptionWizard.59 = Open ທີ່​ນີ້​à»àºœàº™â€‹àº—ີ່​ສຸມ​ໃສ່​ຕອນ​ດິນ​ຂອງ​ຕົນ -OptionWizard.6 = ຕົວ​àºà»àº²â€‹àº™àº»àº”​àºàº²àº™ PostgreSQL DB -OptionWizard.65 = ເສັ້ນ​ທາງ​àºàº±àºšâ€‹à»‚ຟນ​ເດີ​ທີ່ Saiku -OptionWizard.66 = Browse ... -OptionWizard.67 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ບັດ​àºàº²àº™ Firefox -OptionWizard.68 = Browse ... -OptionWizard.7 = ຊື່​ຜູ້​ໃຊ້ -OptionWizard.70 = àºàº²àº™â€‹àºšà»â€‹àº¥àº´â€‹àº«àº²àº™â€‹à»„ຟ -OptionWizard.72 = ໄຟລ​໌​ຖານ​ສອງ -OptionWizard.73 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ບັດ​àºàº²àº™ Chrome -OptionWizard.74 = Browse ... -OptionWizard.76 = àºàº²àº™â€‹àºšà»â€‹àº¥àº´â€‹àº«àº²àº™â€‹à»„ຟ -OptionWizard.78 = ໄຟລ​໌​ຖານ​ສອງ -OptionWizard.79 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹à»àºšàºš KML Freemarker -OptionWizard.8 = ລະ​ຫັດ​ຜ່ານ -OptionWizard.80 = Browse ... -OptionWizard.82 = à»àº¡à»ˆâ€‹à»àºšàºš Freemarker -OptionWizard.83 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº­àº­àºâ€‹à»àºšàºšâ€‹àº®àº¹àºšâ€‹à»àºšàºš HTML ປູມ​ເປົ້າ -OptionWizard.84 = Browse ... -OptionWizard.86 = HTML webpage -OptionWizard.87 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™ XML àºàº±àºšâ€‹àº„à»àº²â€‹àº™àº´â€‹àºàº²àº¡ IDM -OptionWizard.88 = Browse ... -OptionWizard.9 = ຊື່ DB -OptionWizard.90 = ຫມາຠIDM XML -OptionWizard.91 = Server (ສະ​ບັບ​ຜູ້​ຈັດ​àºàº²àº™â€‹àº«àº¼àº·â€‹àº¢àº·àº™â€‹àº¢àº¹à»ˆâ€‹àº„ົນ​ດຽວ​ໃຊ້​) -OptionWizard.92 = ລູàºâ€‹àº„້າ (ປະ​ຕິ​ບັດ​àºàº²àº™ / àºàº²àº™â€‹à»€àºŠàº·à»ˆàº­àº¡â€‹àº•à»à»ˆâ€‹àºàº±àºšâ€‹à»€àº„ື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹) -OptionWizard.93 = SQLite (à»àºšàºšâ€‹àºàº±àº‡ / ໄຟລ​໌​ດຽວ​ຕາມ​) -OptionWizard.94 = PostgreSQL -SaikuAnalysisListener.0 = à»àº¡à»ˆàº™ - ຂà»à»‰â€‹àº¡àº¹àº™ Refresh Saiku (ຂະ​ບວນ​àºàº²àº™â€‹àºàº²àº§â€‹) -SaikuAnalysisListener.1 = ບà»à»ˆ - ພຽງ​à»àº•່​ເລີ່ມ​ຕົ້ນ Saiku -SaikuStarter.1 = ເລີ່ມ Saiku -SaikuStarter.2 = u0EC0ລີ່ມ Saiku ສາ​ມາດ​ໃຊ້​ເວ​ລາ​ນາ​ທີ \= àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº¥à»â€‹àº–້າ ​\! -SaveEarthDataServlet.0 = àºàº²àº™â€‹àº®à»‰àº­àº‡â€‹àº‚à»â€‹à»€àº›àº»à»ˆàº² -SaveEarthDataServlet.1 = ບັນ​ຫາ​ທີ່​ເàºàºµàº”​ຂຶ້ນ​ໃນ​ຂະ​ນະ​ທີ່​ປະ​ຢັດ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ດ້ -SaveEarthDataServlet.2 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໄດ້​ບັນ​ທືຠ-SlopeCode.0 = ລຽບ (0-5​)àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -EarthApp.11 = ໃນ​ທົ່ວ​ໂລàºâ€‹à»àº¡à»ˆàº™â€‹à»àº¥à»‰àº§â€‹à»àº¥à»ˆàº™ -EarthApp.21 = ໄຟ​ທີ່​ມີ​ຕາ​ຂ່າàºâ€‹à»„ຟ​ຟ້າ​ຂອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ເປັນ CSV / CED à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹àºžàº»àºšâ€‹à»€àº«àº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹à»€àºªàº±à»‰àº™â€‹àº—າງ​ທີ່​ເລືອàºâ€‹\:
-EarthApp.23 = ບà»à»ˆâ€‹à»„ຟລ​໌ CSV / CED ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

-EarthApp.24 = ໄຟ​ທີ່​ມີ​à»àº¡à»ˆâ€‹à»àºšàºš Freemarker ທີ່​ມີ​ຄà»àº²â€‹àº™àº´â€‹àºàº²àº¡ KML ບà»à»ˆâ€‹à»„ດ້​ພົບ​ເຫັນ​ຢູ່​ໃນ​ເສັ້ນ​ທາງ​ທີ່​ເລືອàºâ€‹\:
-EarthApp.26 = ບà»à»ˆâ€‹à»„ຟລ​໌​ຄà»àº²â€‹àº™àº´â€‹àºàº²àº¡ KML ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

-EarthApp.27 = ໄຟ​ທີ່​ມີ​ຮູບ​à»àºšàºšâ€‹àº›àº¹àº¡â€‹à»€àº›àº»à»‰àº² HTML ໄດ້​à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹àºžàº»àºšâ€‹à»€àº«àº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹à»€àºªàº±à»‰àº™â€‹àº—າງ​ທີ່​ເລືອàºâ€‹\:
-EarthApp.29 = ບà»à»ˆâ€‹à»„ຟລ​໌​ປູມ​ເປົ້າ HTML ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

-EarthApp.3 = ເຕືອນ​ຂ້ອàºâ€‹àº•à»à»ˆâ€‹àº¡àº² -EarthApp.30 = àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹à»àºà»‰â€‹à»„ຂ​ສະ​ຖານ​ທີ່​ໄຟລ​໌​ຢູ່​ໃນ​ເມ​ນູ Tools-> Properties​. -EarthApp.4 = àºàº²àº™â€‹àº›àº±àºšâ€‹àº›àº¸àº‡â€‹à»ƒàº™â€‹àº›àº±àº”​ຈຸ​ບັນ -EarthApp.5 = ຢ່າ​ເຕືອນ​ຂ້າ​ພະ​ເຈົ້າ​ອີàºâ€‹à»€àº—ື່ອ​ຫນຶ່ງ -EarthApp.57 = ມີ​ສະ​ບັບ​ໃຫມ່​ຂອງ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹àº—ີ່​ມີ à»àº¡à»ˆàº™â€‹\!
ທ່ານ​ບà»à»ˆâ€‹àº•້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹? ເຕືອນ -EarthApp.58 = ປັບ​ປຸງ -EarthApp.59 Error \= ໃນ​ເວ​ລາ​ທີ່​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ເອ​àºàº°â€‹àºªàº²àº™â€‹à»‚ຄງ​àºàº²àº™ -EarthApp.6 = \ - ສະ​ບັບ -EarthApp.61 = ເອ​àºàº°â€‹àºªàº²àº™â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹à»„ດ້​ເàºàº±àºšâ€‹àºà»àº²â€‹àºšà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ຈະ​ເປີດ​ເຜີàºâ€‹.
àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹à»€àº®àº±àº”​ໃຫ້​à»àº™à»ˆâ€‹à»ƒàºˆàº§à»ˆâ€‹àº²â€‹àº—ີ່​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»àº¡à»ˆàº™â€‹àºàº²àº™â€‹àº•ິດ​ຕັ້ງ​. -EarthSurveyService.9 = ພາàºâ€‹àºªàº°â€‹àº«àº™àº²àº¡â€‹àº—ີ່​ຕ້ອງ​àºàº²àº™à»€àº­àº»àº² -ExportActionListener.1 = ວັນ​ທີ່​ຈະ​ບັນ​ທຶàºâ€‹àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àºˆàº²àºàº‚à»à»‰â€‹àº¡àº¹àº™ -ExportDialogProcessMonitor.0 àºàº²àº™â€‹àº›àº¸àº‡â€‹à»àº•່ງ \= ... -ExportDialogProcessMonitor.1 = ລà»â€‹àº–້າ​ທີ່​ຈະ​ເລີ່ມ​ຕົ້ນ​ຂະ​ບວນ​àºàº²àº™â€‹\:àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àº -ExportDialogProcessMonitor.4 =​\: -ImportProcessMonitorDialog.0 = àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​\: -ImportActionListener.0 = ຄວນ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àº—ີ່​ດິນ​ທີ່​ບà»à»ˆâ€‹à»„ດ້​ຮັບ​àºàº²àº™â€‹à»€àº•ີມ​ລົງ​ໄປ​ໃນ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ໄດ້ -ImportActionListener.2 = ຖ້າ​ທ່ານ​ຄລິàºâ€‹à»ƒàºªà»ˆ ບà»à»ˆ ພຽງ​à»àº•່​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºˆàº²àºâ€‹àºžàº²àºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ຢູ່​ໃນ​ສະ​ພາບ "ສີ​ຂຽວ​"​, ທີ່​ບັນ​ຈຸ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ັງ​ຫມົດ​ໄດ້​, ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​. -ImportActionListener.3 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ບັນ​ທຶàºâ€‹àº—າງ​àºàº²àº™â€‹àºªà»àº²â€‹à»€àº¥àº±àº”​ຮູບ -ImportDialogProcessMonitor.0 = \ ຄິດ​ໄລ່ -ImportDialogProcessMonitor.11 = ຈà»àº²â€‹àº™àº§àº™â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ​ຂອງ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹\: -ImportDialogProcessMonitor.2 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ບັນ​ທຶàºâ€‹àºàº²àº™ ... -ImportDialogProcessMonitor.5 = ຈ​à»â€‹àº²â€‹àº™àº§àº™â€‹àº•ົວ​ຈິງ​ຂອງ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​\:ຂà»à»‰â€‹àº¡àº¹àº™ -ImportDialogProcessMonitor.8 àºàº²àº™â€‹àº›àº¸àº‡â€‹à»àº•່ງ \= ... -InfiniteProgressMonitor.0 = àºàº»àºâ€‹à»€àº¥àºµàºâ€‹àºàº²àº™â€‹àº”à»àº²â€‹à»€àº™àºµàº™â€‹àº‡àº²àº™àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -JFileChooserExistsAware.0 = file ໂລàºâ€‹à»‚ຄງ​àºàº²àº™ -KmlImportService.13 = ເລືອàºâ€‹à»„ຟລ​໌ CSV ເພື່ອ​ຊ່ວàºâ€‹àº›àº°â€‹àº¢àº±àº”​ສະ​ຖານ​ຕອນ​ດິນ​ຂອງ​ຕົນ​ເພື່ອ -MissingPlotsListener.0 Error \= ໃນ​ຂະ​ນະ​ທີ່​àºàº²àº™â€‹à»„ດ້​ຮັບ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àº—ີ່​ດິນ​ບà»à»ˆâ€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ດ້ -MissingPlotsListener.1 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ໄປ -MissingPlotsListener.10 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ໃນ​àºàº²àº™â€‹àº­àº­àºâ€‹à»àºšàºšâ€‹àºªàº¸à»ˆàº¡â€‹àº•ົວ​ຢ່າງ​\: -MissingPlotsListener.12 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ຫາàºâ€‹à»„ປ​\: -MissingPlotsListener.14 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທັງ​ຫມົດ​à»àº¡à»ˆàº™â€‹à»„ດ້​ເຕີມ​ລົງ​ໄປ ​\!ເນື້ອ​ໃນ -MissingPlotsListener.2 = ຄັດ​ລອàºâ€‹à»„ປ​ທີ່ clipboardເອົາ -MissingPlotsListener.3 = ໄຟລ​໌​ທີ່​ບັນ​ຈຸ​ມີ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ສານ​ຕອນ​ດິນ​ຂອງ​ຕົນ (.csv ຫຼື​ໄຟລ​໌ .ced​) ສà»àº²â€‹àº¥àº±àºšâ€‹àº—ີ່​ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ຮູ້​ວ່າ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ັງ​ຫມົດ​ໄດ້​ຮັບ​àºàº²àº™â€‹à»€àº•ີມ​ລົງ​ໄປ​. -MissingPlotsListener.4 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຫາàºâ€‹à»„ປ - ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ສານ -MissingPlotsListener.5 = ຈາàºâ€‹à»„ຟ​\: -MissingPlotsListener.6 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ​ໄຟລ​໌ CED -ProcessMonitorDialog.1 = ຂà»à»‰â€‹àºœàº´àº”​ພາດ Parsing àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àºˆà»àº²â€‹àº™àº§àº™â€‹àºàº²àº™â€‹àº•ິດ​ຕà»à»ˆâ€‹àºàº±àº™ -ProcessMonitorDialog.4 = ຖັນ​, -ProcessMonitorDialog.5 = \ - ຄຸນ​ຄ່າ \ No newline at end of file + + + + + + + + + + + + %-5p %d [%t] %c: %m%n + + + + + + + + + + + + + + [%-5level] %d{yyyy-MM-dd HH:mm:ss} %msg%n + + + + + + + + + + + From dddced7e2090787d7338d09dd57c35a105112882 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:35:26 +0100 Subject: [PATCH 0787/1620] New translations log4j2.xml (Portuguese) --- .../earth/app/view/Messages_pt.properties | Bin 70708 -> 1305 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index aefdf309744a0187d10430151fd9f27cdefc40a9..893729524c46dadaed7c727da0ca3cc394ee36ba 100644 GIT binary patch literal 1305 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 Date: Tue, 29 Nov 2022 12:35:27 +0100 Subject: [PATCH 0788/1620] New translations log4j2.xml (English) --- .../earth/app/view/Messages_en.properties | Bin 2784 -> 1305 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 800ed67a3ee630d85c4bd4b6e56a4af593a6ba00..893729524c46dadaed7c727da0ca3cc394ee36ba 100644 GIT binary patch literal 1305 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 mmX=hUxZ`3$Pj%`0<$nS5#z Date: Tue, 29 Nov 2022 12:35:28 +0100 Subject: [PATCH 0789/1620] New translations Phetsarath_OT.ttf (French) --- .../earth/app/view/Messages_fr.properties | Bin 1305 -> 92828 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 893729524c46dadaed7c727da0ca3cc394ee36ba..2ec713dbece406fb6e9a2c32099d4dbb4ef54db8 100644 GIT binary patch literal 92828 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�mj&+KjGXtaI zM`?)wO7RD=!wcaKLnvh@!YPd(sYEH!+;51bBt@JOPc;8TC5dx0vy!5uDrr;fICN!f3t(b@TRO?!RtFRD@ zxYWG_OSy)5HLk(6xDMBAwl8m_qG~(gbylJiU08+HSc7h?#X9t0JvP8i@s67a{?U&C z>R)dp@W9R3OoW}6!06t zckno#z#$yQllVvc6Q05m9OdfT)A%lq6E^1=Jd5XW;tHho*XX5^`c+cATs`3&lvxPk zkD^56BO}l6((iXXROLP865Zoe#Z^grfeP0-5k_}7Qt7YLp5RG~BY^zTs-UOcZD#!P zo}$Gs?{a-+U02@*C31ax-#R63{krw*7~1=sd@DhlcqMp9{tO})CXmyJ%c_OR)?!21 zTHpVVwYfdYH~RiZ6j4&d7>p(Lr7x1pqWILO_hVwY-tPS=isu#YkJstm-(P3OKg-cy ze!cy<>uBPHN3PiMGx5twm-kvbf6nu*8CM^R^Us~5k0p^GDbi0iM-y@-^<(}_=V;<< zpS5)#b7B99(NEXWXZ_KiQiKz&f67xI?U~Q&=%ba_|3>Ifa~(~W=O;T-o#w3xZs2-9 z(|(gaAO3&3j$|y}m_FGYefYF~xRBF1nhyWT=4iS;{@iu+>FbX^tE1@>_{(yA#z%iy z^>L-tOxMw;uVwi3<>=Gb!+!ee=(8MMsh#;t@cXQ-`%9>W4^G3xi=0F7$McBy$MYw! zl0We%!O z>l(j7NOYIWJ|6S*{OPhA@4J}J(e#Z^gz7@Y4(}T$?!JO+>h5%^KCJ7r9DUf5`eWfH zrfT7{I{Kq!HMI{r9rEMiqbux?O~3Td=K3W0=#$RTC)~rX#SgvJ!XDP=Vh=m%H+A=; zSKXh#j;3p3+V#=X^`}2EoukiY6MuRse!Ndk*U|KQyloxFlHc?CO(ct^596ASVcIpZ zb~2V}zmM*kXcd0mrzTF||9tTC)9t}@IA4x_iMuBK@b-suO@^BOC*M!SGVS|OT@!Ck zrQqg2Jx6SLHu>J1G!@?myRMkfKU0pL^+kT|AI;Gp>|rMkW6T>1joI{k7?P}(^U7_Zp+76&i|9R zr|Zb`Gs-~n_sOgh|4-8V!Ozaf(Pt9uA6!)bYj;1ZqyM#{|Lnz|q7siZT1pq^@^I5snq5a)X;p12bBNhA(a2(q0*S<7`4uR!b7jT%)_9(!o#SX=i#Tk z%EMoIjYoj;QyziJ&v*nWKj#rln@O)zxAYAjCgn{Yp~_o4!jxa|2v;ufh@h#?i_~`e zC66fOS3IJXU-O8e)yuc3gZdjDvy^vu#3{e!5wH9=j|6Jyy-U4RsiT)f9liIcpL&Uh zSsCY%qIh_uDib`?BoGcQp7TRH=mIn^50!ebS=1%fDcRKN(48l#j@ z`!rUeIb+OH%BY1Jr<79@HD0NpHfjQGktQNhsianFl2S#@)MTX^W|);4YN)0tE^4W! zvK9nOMCMJWLd~|RFP{tV!4t?9n#0BBYK4T zpr>#a{}(^Tf8sn|rv=t`aEZWEej-FfiZ~iI%@h_vOe9e)>ecV7KV*)GS;f*P;1A1P zQXXlK^{Gf5UDhg;Ey~|&Z>^TPm?DcZ$EW{QY14eoWYD+I1HH$=`YYUgz&3 zQ#OV-@hki{JVGY|M5u@s2_jWw3!5ks6~ZMNM5|aRt`^Hhr&ud`#YS0K|&Pc(}Kj8|%&QuC3nKb&6ZC_};6}PF-^QY>84(s^pPLm*_*G4G8x93BVWF@%P>05vZwr4%y4^CqNUK6h8cHN zQugFiKDTz)n?g2=yzBFySytXSwX-kI89v?=PPA%y(NgR4(cG|j^C-_sf#x=7=dWq! zIIi45xkzakcpj8zZ~2hon34$t>EnuL?Wy0%^TgMF@4Q0#czz(`_xwP*4SQs4zO&qm wgF!pf6~MOC@_YKrvIekn<@#Q>_H=1K$-&ai_J!@c{1w5dQ4^3L)k%1>5bQFoK-Ymy~WaX>n3UDWhoi+4W{yMv~iPrT={=S$0#_ zLH)r<=X-hXp6AStHg!cFL8?+TF+B+PDS;*xS=kgZy;+|JU+B?n!cIk#mqjPJMn9r7 z*PV*#6PFDoEl+>*0`M+m5sDU?T*y*|si-PQbqHMQhmf~zSc#&*#B?^9c zJdY(%z@|44Y0fbX_ev2eXtdm7rl!G6SUN-??l|A1&|2FbC8Akyoj%0$Y`(m;*HYEJ z<@oe;e!ZrVEp*aJrCp&49-)fqJV~w+O0YG+0Z>x&jrEG@p$%fuh!jyDx7c4c;>H%S zA#?!J@EQ~3c%;O-?9=`1@*L!<{DaUA4?a`U8zB376;mxcKrTEaz?Hn@ThVE28f`N_ zIBbcZkvm`iAbvU}e(g6bav^>EaN9}1u0>U*C0K^BgaL8F6=Z8!76nM0oAuZdW#Jv{ zlf_9-lZV-NgV`D6ysLDA;}$5^l{Rb@Tf@~r6ULa&jtxsTYDI~WnbrF2>Sj%e=CS}C z)79;2Jzv}#+dDHrRXY;iZQsc$awUwQJ@#$&gyjc?I6?eU#uylK`!erp{cULYaYc_b z?M&Wd4*cv6!CRRlaoMwxMqpJ!E-t2ZJyq%j$y9}*a|p3=_?J!=y@iOquxM!2P|PlI zxnK7}XyW$k`*E^#tq=YQpeY;uz=eslW0Y$&%{Z9aeB8 Date: Tue, 29 Nov 2022 12:35:29 +0100 Subject: [PATCH 0790/1620] New translations Phetsarath_OT.ttf (Spanish) --- .../earth/app/view/Messages_es.properties | Bin 1305 -> 92828 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 893729524c46dadaed7c727da0ca3cc394ee36ba..2ec713dbece406fb6e9a2c32099d4dbb4ef54db8 100644 GIT binary patch literal 92828 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�mj&+KjGXtaI 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 Date: Tue, 29 Nov 2022 12:35:30 +0100 Subject: [PATCH 0791/1620] New translations Phetsarath_OT.ttf (Portuguese) --- .../earth/app/view/Messages_pt.properties | Bin 1305 -> 92828 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 893729524c46dadaed7c727da0ca3cc394ee36ba..2ec713dbece406fb6e9a2c32099d4dbb4ef54db8 100644 GIT binary patch literal 92828 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�mj&+KjGXtaI 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 Date: Tue, 29 Nov 2022 12:35:31 +0100 Subject: [PATCH 0792/1620] New translations Phetsarath_OT.ttf (English) --- .../earth/app/view/Messages_en.properties | Bin 1305 -> 92828 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 893729524c46dadaed7c727da0ca3cc394ee36ba..2ec713dbece406fb6e9a2c32099d4dbb4ef54db8 100644 GIT binary patch literal 92828 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�mj&+KjGXtaI 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 Date: Tue, 29 Nov 2022 12:35:32 +0100 Subject: [PATCH 0793/1620] New translations arhangai.ttf (French) --- .../earth/app/view/Messages_fr.properties | Bin 92828 -> 70708 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 2ec713dbece406fb6e9a2c32099d4dbb4ef54db8..aefdf309744a0187d10430151fd9f27cdefc40a9 100644 GIT binary patch literal 70708 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�mj&+KjGXtaI zM`?)wO7RD=!wcaKLnvh@!YPd(sYEH!+;51bBt@JOPc;8TC5dx0vy!5uDrr;fICN!f3t(b@TRO?!RtFRD@ zxYWG_OSy)5HLk(6xDMBAwl8m_qG~(gbylJiU08+HSc7h?#X9t0JvP8i@s67a{?U&C z>R)dp@W9R3OoW}6!06t zckno#z#$yQllVvc6Q05m9OdfT)A%lq6E^1=Jd5XW;tHho*XX5^`c+cATs`3&lvxPk zkD^56BO}l6((iXXROLP865Zoe#Z^grfeP0-5k_}7Qt7YLp5RG~BY^zTs-UOcZD#!P zo}$Gs?{a-+U02@*C31ax-#R63{krw*7~1=sd@DhlcqMp9{tO})CXmyJ%c_OR)?!21 zTHpVVwYfdYH~RiZ6j4&d7>p(Lr7x1pqWILO_hVwY-tPS=isu#YkJstm-(P3OKg-cy ze!cy<>uBPHN3PiMGx5twm-kvbf6nu*8CM^R^Us~5k0p^GDbi0iM-y@-^<(}_=V;<< zpS5)#b7B99(NEXWXZ_KiQiKz&f67xI?U~Q&=%ba_|3>Ifa~(~W=O;T-o#w3xZs2-9 z(|(gaAO3&3j$|y}m_FGYefYF~xRBF1nhyWT=4iS;{@iu+>FbX^tE1@>_{(yA#z%iy z^>L-tOxMw;uVwi3<>=Gb!+!ee=(8MMsh#;t@cXQ-`%9>W4^G3xi=0F7$McBy$MYw! zl0We%!O z>l(j7NOYIWJ|6S*{OPhA@4J}J(e#Z^gz7@Y4(}T$?!JO+>h5%^KCJ7r9DUf5`eWfH zrfT7{I{Kq!HMI{r9rEMiqbux?O~3Td=K3W0=#$RTC)~rX#SgvJ!XDP=Vh=m%H+A=; zSKXh#j;3p3+V#=X^`}2EoukiY6MuRse!Ndk*U|KQyloxFlHc?CO(ct^596ASVcIpZ zb~2V}zmM*kXcd0mrzTF||9tTC)9t}@IA4x_iMuBK@b-suO@^BOC*M!SGVS|OT@!Ck zrQqg2Jx6SLHu>J1G!@?myRMkfKU0pL^+kT|AI;Gp>|rMkW6T>1joI{k7?P}(^U7_Zp+76&i|9R zr|Zb`Gs-~n_sOgh|4-8V!Ozaf(Pt9uA6!)bYj;1ZqyM#{|Lnz|q7siZT1pq^@^I5snq5a)X;p12bBNhA(a2(q0*S<7`4uR!b7jT%)_9(!o#SX=i#Tk z%EMoIjYoj;QyziJ&v*nWKj#rln@O)zxAYAjCgn{Yp~_o4!jxa|2v;ufh@h#?i_~`e zC66fOS3IJXU-O8e)yuc3gZdjDvy^vu#3{e!5wH9=j|6Jyy-U4RsiT)f9liIcpL&Uh zSsCY%qIh_uDib`?BoGcQp7TRH=mIn^50!ebS=1%fDcRKN(48l#j@ z`!rUeIb+OH%BY1Jr<79@HD0NpHfjQGktQNhsianFl2S#@)MTX^W|);4YN)0tE^4W! zvK9nOMCMJWLd~|RFP{tV!4t?9n#0BBYK4T zpr>#a{}(^Tf8sn|rv=t`aEZWEej-FfiZ~iI%@h_vOe9e)>ecV7KV*)GS;f*P;1A1P zQXXlK^{Gf5UDhg;Ey~|&Z>^TPm?DcZ$EW{QY14eoWYD+I1HH$=`YYUgz&3 zQ#OV-@hki{JVGY|M5u@s2_jWw3!5ks6~ZMNM5|aRt`^Hhr&ud`#YS0K|&Pc(}Kj8|%&QuC3nKb&6ZC_};6}PF-^QY>84(s^pPLm*_*G4G8x93BVWF@%P>05vZwr4%y4^CqNUK6h8cHN zQugFiKDTz)n?g2=yzBFySytXSwX-kI89v?=PPA%y(NgR4(cG|j^C-_sf#x=7=dWq! zIIi45xkzakcpj8zZ~2hon34$t>EnuL?Wy0%^TgMF@4Q0#czz(`_xwP*4SQs4zO&qm wgF!pf6~MOC@_YKrvIekn<@#Q>_H=1K$-&ai_J!@c{1 Date: Tue, 29 Nov 2022 12:35:32 +0100 Subject: [PATCH 0794/1620] New translations arhangai.ttf (Spanish) --- .../earth/app/view/Messages_es.properties | Bin 92828 -> 70708 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 2ec713dbece406fb6e9a2c32099d4dbb4ef54db8..aefdf309744a0187d10430151fd9f27cdefc40a9 100644 GIT binary patch literal 70708 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�mj&+KjGXtaI zM`?)wO7RD=!wcaKLnvh@!YPd(sYEH!+;51bBt@JOPc;8TC5dx0vy!5uDrr;fICN!f3t(b@TRO?!RtFRD@ zxYWG_OSy)5HLk(6xDMBAwl8m_qG~(gbylJiU08+HSc7h?#X9t0JvP8i@s67a{?U&C z>R)dp@W9R3OoW}6!06t zckno#z#$yQllVvc6Q05m9OdfT)A%lq6E^1=Jd5XW;tHho*XX5^`c+cATs`3&lvxPk zkD^56BO}l6((iXXROLP865Zoe#Z^grfeP0-5k_}7Qt7YLp5RG~BY^zTs-UOcZD#!P zo}$Gs?{a-+U02@*C31ax-#R63{krw*7~1=sd@DhlcqMp9{tO})CXmyJ%c_OR)?!21 zTHpVVwYfdYH~RiZ6j4&d7>p(Lr7x1pqWILO_hVwY-tPS=isu#YkJstm-(P3OKg-cy ze!cy<>uBPHN3PiMGx5twm-kvbf6nu*8CM^R^Us~5k0p^GDbi0iM-y@-^<(}_=V;<< zpS5)#b7B99(NEXWXZ_KiQiKz&f67xI?U~Q&=%ba_|3>Ifa~(~W=O;T-o#w3xZs2-9 z(|(gaAO3&3j$|y}m_FGYefYF~xRBF1nhyWT=4iS;{@iu+>FbX^tE1@>_{(yA#z%iy z^>L-tOxMw;uVwi3<>=Gb!+!ee=(8MMsh#;t@cXQ-`%9>W4^G3xi=0F7$McBy$MYw! zl0We%!O z>l(j7NOYIWJ|6S*{OPhA@4J}J(e#Z^gz7@Y4(}T$?!JO+>h5%^KCJ7r9DUf5`eWfH zrfT7{I{Kq!HMI{r9rEMiqbux?O~3Td=K3W0=#$RTC)~rX#SgvJ!XDP=Vh=m%H+A=; zSKXh#j;3p3+V#=X^`}2EoukiY6MuRse!Ndk*U|KQyloxFlHc?CO(ct^596ASVcIpZ zb~2V}zmM*kXcd0mrzTF||9tTC)9t}@IA4x_iMuBK@b-suO@^BOC*M!SGVS|OT@!Ck zrQqg2Jx6SLHu>J1G!@?myRMkfKU0pL^+kT|AI;Gp>|rMkW6T>1joI{k7?P}(^U7_Zp+76&i|9R zr|Zb`Gs-~n_sOgh|4-8V!Ozaf(Pt9uA6!)bYj;1ZqyM#{|Lnz|q7siZT1pq^@^I5snq5a)X;p12bBNhA(a2(q0*S<7`4uR!b7jT%)_9(!o#SX=i#Tk z%EMoIjYoj;QyziJ&v*nWKj#rln@O)zxAYAjCgn{Yp~_o4!jxa|2v;ufh@h#?i_~`e zC66fOS3IJXU-O8e)yuc3gZdjDvy^vu#3{e!5wH9=j|6Jyy-U4RsiT)f9liIcpL&Uh zSsCY%qIh_uDib`?BoGcQp7TRH=mIn^50!ebS=1%fDcRKN(48l#j@ z`!rUeIb+OH%BY1Jr<79@HD0NpHfjQGktQNhsianFl2S#@)MTX^W|);4YN)0tE^4W! zvK9nOMCMJWLd~|RFP{tV!4t?9n#0BBYK4T zpr>#a{}(^Tf8sn|rv=t`aEZWEej-FfiZ~iI%@h_vOe9e)>ecV7KV*)GS;f*P;1A1P zQXXlK^{Gf5UDhg;Ey~|&Z>^TPm?DcZ$EW{QY14eoWYD+I1HH$=`YYUgz&3 zQ#OV-@hki{JVGY|M5u@s2_jWw3!5ks6~ZMNM5|aRt`^Hhr&ud`#YS0K|&Pc(}Kj8|%&QuC3nKb&6ZC_};6}PF-^QY>84(s^pPLm*_*G4G8x93BVWF@%P>05vZwr4%y4^CqNUK6h8cHN zQugFiKDTz)n?g2=yzBFySytXSwX-kI89v?=PPA%y(NgR4(cG|j^C-_sf#x=7=dWq! zIIi45xkzakcpj8zZ~2hon34$t>EnuL?Wy0%^TgMF@4Q0#czz(`_xwP*4SQs4zO&qm wgF!pf6~MOC@_YKrvIekn<@#Q>_H=1K$-&ai_J!@c{1 Date: Tue, 29 Nov 2022 12:35:34 +0100 Subject: [PATCH 0795/1620] New translations arhangai.ttf (English) --- .../earth/app/view/Messages_en.properties | Bin 92828 -> 70708 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 2ec713dbece406fb6e9a2c32099d4dbb4ef54db8..aefdf309744a0187d10430151fd9f27cdefc40a9 100644 GIT binary patch literal 70708 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�mj&+KjGXtaI zM`?)wO7RD=!wcaKLnvh@!YPd(sYEH!+;51bBt@JOPc;8TC5dx0vy!5uDrr;fICN!f3t(b@TRO?!RtFRD@ zxYWG_OSy)5HLk(6xDMBAwl8m_qG~(gbylJiU08+HSc7h?#X9t0JvP8i@s67a{?U&C z>R)dp@W9R3OoW}6!06t zckno#z#$yQllVvc6Q05m9OdfT)A%lq6E^1=Jd5XW;tHho*XX5^`c+cATs`3&lvxPk zkD^56BO}l6((iXXROLP865Zoe#Z^grfeP0-5k_}7Qt7YLp5RG~BY^zTs-UOcZD#!P zo}$Gs?{a-+U02@*C31ax-#R63{krw*7~1=sd@DhlcqMp9{tO})CXmyJ%c_OR)?!21 zTHpVVwYfdYH~RiZ6j4&d7>p(Lr7x1pqWILO_hVwY-tPS=isu#YkJstm-(P3OKg-cy ze!cy<>uBPHN3PiMGx5twm-kvbf6nu*8CM^R^Us~5k0p^GDbi0iM-y@-^<(}_=V;<< zpS5)#b7B99(NEXWXZ_KiQiKz&f67xI?U~Q&=%ba_|3>Ifa~(~W=O;T-o#w3xZs2-9 z(|(gaAO3&3j$|y}m_FGYefYF~xRBF1nhyWT=4iS;{@iu+>FbX^tE1@>_{(yA#z%iy z^>L-tOxMw;uVwi3<>=Gb!+!ee=(8MMsh#;t@cXQ-`%9>W4^G3xi=0F7$McBy$MYw! zl0We%!O z>l(j7NOYIWJ|6S*{OPhA@4J}J(e#Z^gz7@Y4(}T$?!JO+>h5%^KCJ7r9DUf5`eWfH zrfT7{I{Kq!HMI{r9rEMiqbux?O~3Td=K3W0=#$RTC)~rX#SgvJ!XDP=Vh=m%H+A=; zSKXh#j;3p3+V#=X^`}2EoukiY6MuRse!Ndk*U|KQyloxFlHc?CO(ct^596ASVcIpZ zb~2V}zmM*kXcd0mrzTF||9tTC)9t}@IA4x_iMuBK@b-suO@^BOC*M!SGVS|OT@!Ck zrQqg2Jx6SLHu>J1G!@?myRMkfKU0pL^+kT|AI;Gp>|rMkW6T>1joI{k7?P}(^U7_Zp+76&i|9R zr|Zb`Gs-~n_sOgh|4-8V!Ozaf(Pt9uA6!)bYj;1ZqyM#{|Lnz|q7siZT1pq^@^I5snq5a)X;p12bBNhA(a2(q0*S<7`4uR!b7jT%)_9(!o#SX=i#Tk z%EMoIjYoj;QyziJ&v*nWKj#rln@O)zxAYAjCgn{Yp~_o4!jxa|2v;ufh@h#?i_~`e zC66fOS3IJXU-O8e)yuc3gZdjDvy^vu#3{e!5wH9=j|6Jyy-U4RsiT)f9liIcpL&Uh zSsCY%qIh_uDib`?BoGcQp7TRH=mIn^50!ebS=1%fDcRKN(48l#j@ z`!rUeIb+OH%BY1Jr<79@HD0NpHfjQGktQNhsianFl2S#@)MTX^W|);4YN)0tE^4W! zvK9nOMCMJWLd~|RFP{tV!4t?9n#0BBYK4T zpr>#a{}(^Tf8sn|rv=t`aEZWEej-FfiZ~iI%@h_vOe9e)>ecV7KV*)GS;f*P;1A1P zQXXlK^{Gf5UDhg;Ey~|&Z>^TPm?DcZ$EW{QY14eoWYD+I1HH$=`YYUgz&3 zQ#OV-@hki{JVGY|M5u@s2_jWw3!5ks6~ZMNM5|aRt`^Hhr&ud`#YS0K|&Pc(}Kj8|%&QuC3nKb&6ZC_};6}PF-^QY>84(s^pPLm*_*G4G8x93BVWF@%P>05vZwr4%y4^CqNUK6h8cHN zQugFiKDTz)n?g2=yzBFySytXSwX-kI89v?=PPA%y(NgR4(cG|j^C-_sf#x=7=dWq! zIIi45xkzakcpj8zZ~2hon34$t>EnuL?Wy0%^TgMF@4Q0#czz(`_xwP*4SQs4zO&qm wgF!pf6~MOC@_YKrvIekn<@#Q>_H=1K$-&ai_J!@c{1 Date: Tue, 29 Nov 2022 12:35:35 +0100 Subject: [PATCH 0796/1620] New translations Messages_hi.properties (Portuguese) --- .../earth/app/view/Messages_pt.properties | Bin 92828 -> 22428 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 2ec713dbece406fb6e9a2c32099d4dbb4ef54db8..f759c433b01b2ff61f62fa7862c75fbcd5bfc2dc 100644 GIT binary patch literal 22428 zcmchfYj0FnmWIFkS5)(*jRfXqbBVYJC26T=(oIXW)YB4D%Mb^wF&NoSNaj=FRyUp* zMlkA0GU{Z;5XyiOh!K(@NC^H){gip$wbnWN?Co8qU|Rhpu5-@b>+-I5UG}LWr_V2b zy7IyN?84&3sRPGO3c1QRF&u0T2d}vGufxH>uD>4+9@>Y8 z+>FRiRxJ@?+eeb=sCn_9d&cjc4CrTOKl#iffs zKRF!yX*hT=9K1#`lDJQ;5Exr<3R`1913-7xUcNeaVdeeBkLRZLbGwcAz%9G)axuBP@<6$A zuh7`QUa$ksE!5U`9%ScuD-W>}8F=aO0pNRMtC_BB9%<7|WwB`jRVn|gVW6PaeG-kJ z-gt|Tus8$xjhfzHTv#APAI>hVT>9Pom5&#%S)@EI!JABkbFVQELOtRSJnS2Fq2-oy z;0L3cXUbESB*NV_>LEbnho`{oF;oE{`MGN;kyvLdi6O{9GGF%7M8!(6q%N_vy}Da; z%3g}05)*MW2^(n=sc zwFppw?(qN;5l)FR=MlN>szmLRnydpVAUUogALr|J%7~Xv_kHwe^#PEhJnC+-wIY3s#sGQJ@MGAmL%I)d5Vu)W_`!4 z%`#6IV)JB=g-gtA=mw#`tZt9ucHey2G|oS)E<75Ua{T;BheTNLiDbQLitt8Lm<4#} z#3&g_Mu-6zOFL4Eh?v{aK*6n^NUxUN2E6p0=UEhjq;Lg1aFE<>n&eo_;=~#av*K}bl~D%J73p(7JAQuYNB65ixy;IYfV%c|8bFaWr9=)|Y{b|F>`2iJ{DBdAoXo9s_6KzV5FaZ)bwB+FqD zn*79Q;aA04#T8l`=Pg5!sjg66thupH-nmv+?$;f#n41g2ZG&Qh3Z>v~N)V!<#f&ARvbIDeTeIBSD z6k930kx1E(<<#-XZuikptt0xE~ddui)YjVxfalm{vmR*%K) zaGxu+KwX)yeBu#K)*4Q#Wp3q$?L;nC#SxTG0s&!^{P?7Rt9sY$GAFehN73zatvqlq zI{}_FnHy01o<6pn5B#N@vj+iuRBdz9qtCb*;erchr>wCOj_l+&Y46i?xF#@JfbnUN zSnJhK9@FEN_i3MgCDrkW$Za)Dg9_1`SpwqN4IEBE9f(+u^)j)RzSE*z=67cT*vIw? zqpNZ>7~eAO@0cg(>ew-91hfQIl)+iF+FezxS_<|rZH>kZfKpmw`nEFC@y^)R6!^M6 zgw%bi8Zsjc(A~FP)CwgoBB(Lq#faIaQkv?43_^Nc3#eRrI8g;hO#oANOl7Cc|7Uib zR{QA0K+G}Zno)dj7TrkyCatQ5tFQP`oN*8$AYC1{f^U|hHCc)a$*S6)0IM$CuNgQC zRKpTj9fJx1TNAm&OM;=fPF>X-4_c~%YolZ3&`uIt*HoagShK6*+6Wa@dsUPKg$YjWHu4%t zpsm`5ODYjn8LA2ar`JlR-A(pH{hpetc88gIzNmGs8{l48`K; zy|t;(6M(^$`?%Qa?ed|4gyvJUcvtNh>ANWN!;)MB6!uF4VcRmA@PPuQBbiqQuGxS^ z@I@8{EZz%rCMMO%*afK&5jesPb$~nbYCq$mBz=G0E8LwGO6qF|D$0xq1CdhCf20fjc z_~45xvzO;DEVo}kcd3B!?0@X?P@w&o{xILAJbTlw|2C~MP%yec45D0O%)>poKr#JI z0^vj?m_vhENTS+EIHu~8E6Zj30ZeSbIabtML@;g>`6u~aae559yu|s)r&usCAWn$q z;xx#JBr`VeZKOG`GvWU=9gFIuFNgjx6moCI;b{D$h^yGunZTC99lTzuhxXWI%g$k{K%yS9Q0wNw(f~%pxU8FLV zE*?4YPkWIB3*nUuCqa9D!s3&P zw@sSd<(5|2b2VUAZPP~-IxkMXwCaCjPjkQ;X$OEHkP!V5=`bI9=~!0uPSs5AA~k5x z(|27yDrR|lF!HoK`-1Tg$S>lf0DWhHD4!_XMq``0pc%EHDH`!&ncJ=|+Ef#qv#y$E z2v2=A;c}|s7QcficzjT)N|Lxw?fVCT_Ns75iPrsI0-`IIP%T`G#mXIJjg`kf%LqBk z9QyTQvF0OapaJ3*fiR(BFwQx%HCS=CB{m(dUMGbGm@&QKDUC_U zgA~Yzclly5u{45QW2~fFJAZ)wb+JiJk2tXr#4SLEyBAgP(aD&S0AtB1Z#zZ5wXZ5Q z2^x@ypi&Ff#Qj2L8laFzNt6n2Wtgk$VtwJ56uGS&F=9~m&hXem&)tIUhm;qs6S#^u z8d^GY#UUj`#R)Htej>I2u$wwc${JSNG$~aoVkn~MWFx65T4TR5UqSVkYTV~3aqage z4M*<7WL1eM2L%TYDbIX%;~Pl!su&_xB*6f-Ge#-TLKSvHN1erWzo8IQBz8Tl>MRvD zKZ|JOJ8QP2Qmx39u36k=gk^3g$uK}k#gp&MUcCSmQv881+)4Nw$NeulGUCX9_bLX7Ze{^WQ#^M1Yl^ zbMIOA zhJG$v)lWOBEibabiw9sj5mfd`ZT$8s>~Fw>du~1t`r9UP`{EC+o_dZJ;UavPge%2# zZC`~&Ojsif>YI5`Qip(0^qk`g-68QV@a_k3)TM0<43BY_DrlV z2iBvh73oJ_{J&y^)BMq!keVumC&6RMT#Z5BVVFnrg!w#9ciHC(9DtzOK zMVat+r*Dm6G+ZQz_(6QInS63ZN|R=Gs&PUU@|{dVZd%3FF8TxByAKTJao-FS+Eo@`gW|>%CrYvcVMMc|iSzMu9fWC4!_F_Id6; zD=Pi83Rl@$5))A!Aw(2H)Kfh507+wFFSUa#8C@rF)O3J+K3Tyq11qc;Y~&mh)rC!) zpok&9IpNKiHa7z=l@G^vy?miC6Q}+RYQ3<`#)BDuixhxm#SVqo-sex|AC*&C;%S{S zY3I^1;|D<@LvavH#FA*a?aT-~NJmoF9JMP8Lqzmd?P1)8sScyC;%l+LO#7<6}Vzfab`X2^Sqq7ZB*vn z!4K85WW)$TMY%aFGs_~ptuh=Ie@wD;fgm;26%iHpL1ozUm=23isA4H*iwhAocQ)|l zPq#a6Gt7I8M5XSq%`n-O5o0@jFbYG83FU|i;@IZ4o~x7$l`+L+c0?tOqJSc+86vQ9 zq}V7<<%xMjmB;~P3xd@e$F?gnV<#AosFaoQEo=}4#@1Q5RKX&KgSW>**(sMSIbePy z1d~JGN&^4&eDLz1Issb#jVFoeq$55E&}n-NbY!X%m1;y8alu8F9UZHA9u)=N$<#a= zN5u#{rx4;9F7r8IK?NblJ)X`tB?r#>2*?HQq~Vt4Ldm7Lww+MfDBu+FaYvG)H4c%A z<@|6|L>g)OmIdaK+e(POE&Prar9q3D&H_zY?!N7j%{cSevP`c(xEmo(BO2Pd2NSrJ z0hg1ZP(4Fax7jo)vXxMvD~_2n#yp;xhazNCOh$l1vG{S_zfN`19o6FF!83tueHFK6F9`Y3a~r|)Sr__W#1wM)Kjk=FY-3_u*RUx`74&4KIls4X9k zwSyzxjM6Pqk^s#cWT}UVa;wzJXhwu#(W<*~c7=b$%QvS%Yb;I{j#_I!w;L@Ot=Ns0 zZ}>#9q)cF&zj3u!UTlTn)J0KFgCV}_eG)ykt2lZ_SG*qY9G-MW*L4fQz7a;BL zRKg?N!)qsOcmmVB4d9%gQ&jnJ9c$M7(^}meC3do=t1U!t;NryD1^%A~?GF~*0QmQ` zH@ScB%|GcPa;r45m%MDa8hLFlLDAD*mqpg z;2Zl^_%UcpF{m933A&_Q_*ZGqj$76PcS&As2_21}wX`_%PQ}!BH zg+*o)IfLzC)7R}M;m@1Wcp=QM{5m$NekvH%CJX{zSsq)Kw25W$AY=d_gx+b2V&C60 zAg%vdL^J^5dPHO-4rLVTxI}Dlj5<=phMVsY9F15Q^_HV$N|eaUzbDQO%`%wdppamG zOOHzY|JGTc#H6TD9sb8_jgRVj8=q>8(#pSJ;gC$4`4~n1y-Mk1|M1giGQv&n*gwwk zLx3hbmqvZJe{7XxR~)2Bsc@6w#+?m)Nf7`46T6{$sOFY_Nzm4CrGt?qs@#pbP^x0f-}kCo1F#0@{~Kk+ECmj>45L*4B#ql ze4@@!_X#>_Xc)gNf{S)N%;n-GN8s=<%21+Plgj{ zh75(i{Y8yoe)iL)&*r|+q&I(IZb}7+$Zs{;!8N{nL+ta2n*=|Z`0(?qi%Tn~FX(Id zc5-LrL$`+(Tl%~$<(hzFC2_Vqv~WVID7xM_0RpDF`I4hdH3&?Q)X14I!~d68 zzgb$mFt@z?tHmqxD~tXU#=8ap;TLn8DOi;9(g*`UMiA=I?=Dqk`8NpWxh0Aqu)Q*_ zBU-fN0TLf`w_~sEQaX`}sJzwP15^8r)OL0-rXi{`8|qu!9c)xNtK(L|7*W5xtO(|y z#s51@hkbYu$hY*V$dOGhsGx#G5LJLOi13#HtEi5gMRRnrQJvGY>UyxAI0CTv#XZO- zl=u{cdTftwh#^_}ktO_Z8LECsZd*rvMrCVO>=d(8bx(D$NF@}9J;a_kGE=nQ)9W3d zr{GfLlU4p@|2+4gfIFzgTb|Dy1a=t@b-3U0To9K9ND3<9ibI_;+d+roPW$E%&z+DWU%JTp)f zX!5#~eCDa2oRo}IQ<#;!6G|tDHlS zGfpL>LqZ8v4>qKPZL1Ri`|~mb9GrGy@OD{oJ8Ejmdz%p{KYBr<0nGK@v`Rw`i3O>2 zO;r6=oAfDO-}hwIXv7A!3Dqa_5%!~4vkW9A1Ke4j3G0MGCbt`IK|y#aU6Mf@x21mF zYGwThvrF;g3spN#<+X0}V~3ecqrxiCDzuo*o4Bf_G86~F$$JcFG1tR)c*0FhPE3J# zZCz2fC?!o<*|^?wd@{zc5~N#kuj`7Hb(srEQk{|Lg`WD-ij`R&S+F$^XaAa`H`$vq zQ~N~@l4-BfBfx>Ma-b%2H}~5nw=K`3N4NGu=B&k&sGSfXDw=W%V#*bsM(pkzerBb0 zwD@ElGdnDqGHw%{>r-`_Op4DknBeu-u@(;f~^M}(PePnP9^qn5Is);m9etm{V_)i@B+Vbl& R*$z@f+>A|~brTa4{|9Y!1;79R literal 92828 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�mj&+KjGXtaI zM`?)wO7RD=!wcaKLnvh@!YPd(sYEH!+;51bBt@JOPc;8TC5dx0vy!5uDrr;fICN!f3t(b@TRO?!RtFRD@ zxYWG_OSy)5HLk(6xDMBAwl8m_qG~(gbylJiU08+HSc7h?#X9t0JvP8i@s67a{?U&C z>R)dp@W9R3OoW}6!06t zckno#z#$yQllVvc6Q05m9OdfT)A%lq6E^1=Jd5XW;tHho*XX5^`c+cATs`3&lvxPk zkD^56BO}l6((iXXROLP865Zoe#Z^grfeP0-5k_}7Qt7YLp5RG~BY^zTs-UOcZD#!P zo}$Gs?{a-+U02@*C31ax-#R63{krw*7~1=sd@DhlcqMp9{tO})CXmyJ%c_OR)?!21 zTHpVVwYfdYH~RiZ6j4&d7>p(Lr7x1pqWILO_hVwY-tPS=isu#YkJstm-(P3OKg-cy ze!cy<>uBPHN3PiMGx5twm-kvbf6nu*8CM^R^Us~5k0p^GDbi0iM-y@-^<(}_=V;<< zpS5)#b7B99(NEXWXZ_KiQiKz&f67xI?U~Q&=%ba_|3>Ifa~(~W=O;T-o#w3xZs2-9 z(|(gaAO3&3j$|y}m_FGYefYF~xRBF1nhyWT=4iS;{@iu+>FbX^tE1@>_{(yA#z%iy z^>L-tOxMw;uVwi3<>=Gb!+!ee=(8MMsh#;t@cXQ-`%9>W4^G3xi=0F7$McBy$MYw! zl0We%!O z>l(j7NOYIWJ|6S*{OPhA@4J}J(e#Z^gz7@Y4(}T$?!JO+>h5%^KCJ7r9DUf5`eWfH zrfT7{I{Kq!HMI{r9rEMiqbux?O~3Td=K3W0=#$RTC)~rX#SgvJ!XDP=Vh=m%H+A=; zSKXh#j;3p3+V#=X^`}2EoukiY6MuRse!Ndk*U|KQyloxFlHc?CO(ct^596ASVcIpZ zb~2V}zmM*kXcd0mrzTF||9tTC)9t}@IA4x_iMuBK@b-suO@^BOC*M!SGVS|OT@!Ck zrQqg2Jx6SLHu>J1G!@?myRMkfKU0pL^+kT|AI;Gp>|rMkW6T>1joI{k7?P}(^U7_Zp+76&i|9R zr|Zb`Gs-~n_sOgh|4-8V!Ozaf(Pt9uA6!)bYj;1ZqyM#{|Lnz|q7siZT1pq^@^I5snq5a)X;p12bBNhA(a2(q0*S<7`4uR!b7jT%)_9(!o#SX=i#Tk z%EMoIjYoj;QyziJ&v*nWKj#rln@O)zxAYAjCgn{Yp~_o4!jxa|2v;ufh@h#?i_~`e zC66fOS3IJXU-O8e)yuc3gZdjDvy^vu#3{e!5wH9=j|6Jyy-U4RsiT)f9liIcpL&Uh zSsCY%qIh_uDib`?BoGcQp7TRH=mIn^50!ebS=1%fDcRKN(48l#j@ z`!rUeIb+OH%BY1Jr<79@HD0NpHfjQGktQNhsianFl2S#@)MTX^W|);4YN)0tE^4W! zvK9nOMCMJWLd~|RFP{tV!4t?9n#0BBYK4T zpr>#a{}(^Tf8sn|rv=t`aEZWEej-FfiZ~iI%@h_vOe9e)>ecV7KV*)GS;f*P;1A1P zQXXlK^{Gf5UDhg;Ey~|&Z>^TPm?DcZ$EW{QY14eoWYD+I1HH$=`YYUgz&3 zQ#OV-@hki{JVGY|M5u@s2_jWw3!5ks6~ZMNM5|aRt`^Hhr&ud`#YS0K|&Pc(}Kj8|%&QuC3nKb&6ZC_};6}PF-^QY>84(s^pPLm*_*G4G8x93BVWF@%P>05vZwr4%y4^CqNUK6h8cHN zQugFiKDTz)n?g2=yzBFySytXSwX-kI89v?=PPA%y(NgR4(cG|j^C-_sf#x=7=dWq! zIIi45xkzakcpj8zZ~2hon34$t>EnuL?Wy0%^TgMF@4Q0#czz(`_xwP*4SQs4zO&qm wgF!pf6~MOC@_YKrvIekn<@#Q>_H=1K$-&ai_J!@c{1 Date: Tue, 29 Nov 2022 12:35:36 +0100 Subject: [PATCH 0797/1620] New translations Messages_es.properties (French) --- .../earth/app/view/Messages_fr.properties | Bin 70708 -> 13997 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index aefdf309744a0187d10430151fd9f27cdefc40a9..efdb0acb96b49836918f285e6bf7d3dec5f1d71e 100644 GIT binary patch literal 13997 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 Date: Tue, 29 Nov 2022 12:35:37 +0100 Subject: [PATCH 0798/1620] New translations Messages_es.properties (Spanish) --- .../earth/app/view/Messages_es.properties | Bin 70708 -> 13997 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index aefdf309744a0187d10430151fd9f27cdefc40a9..efdb0acb96b49836918f285e6bf7d3dec5f1d71e 100644 GIT binary patch literal 13997 zcmb7L%TgoBlHKza(Y2ThV}$@A31}l}Q-P|BXgySZkUKbbF?b37uSgsSf>>VXsw4-fa_$K8YRG%514(2tUNZ|}&vNt0=$ z7k;MvNcqz=OgF}j5kv3TSC6TFxcC0_nCHv;Z+CV+fBxJ{mO6e&(lF~K>HJS8H-73X zE)w$7g&%}TtX5$b=32#t&T@SHSx?n9roAnv9q;%jt<6T>MWQkt=iwsBUaLoqe^jpH zaF(bdR!b`?B@JVIp8Kg0S?NecVf;zySY?HZ{gs~kvm{kn?#DAfo%LG#9D3KEHpbaf z2l;6-)4g5qDoJzQ{AiCKLGIRveQ(nFWZ%0jUJM)X!{%Z`evoum8+q5=j}Ex28F-pR z5#*crY5sVr;{rmSFP0FKXHJ91aFwXj$<4-#aeePY9!BBJpXu!7xBK2%xC&=swMeFB zS}n1nj&Oaaw?C?R3Z1#;4!p@1E5XdqaW%gBczK~VF&JwUv9BI<@aQW|&4v$Q0L$@l z1NZ=Dut*lTv1IF|Ov8FzU)l4hH-7M`SiT%Qss|e(f@A?r7;V{EYBNt}kT1d?8RXdX z;GbIOA&g+Uslu_9pQqup$P?9G?WZuFC7*FUlQiY1hHdInU6mkE84S6)zuO;M2eeD= z?RsN#!_IH_yi=V*DCd`b?;XEfg!GQ~{gon&%Z_R>`Vpl@moLqR5&FW5?Yp_erbrMAR}-5RLp$m>;niHL_n1weEvOl4mtED zF+?!;QyQ>e5I?k7b>zbyGED6mGf0omzumnSZizvBNHx2;r z2bM`7%G8ru>U5?N3kr({$`A6wk978(a}(e)W-xp>zdrEBGChPdI0qcsJ2;-U6wA=3 zB=&U_JkwK6h=gxp#6yAWO=9E0i4sRnaT=HdVy=iKgJD*F1Q`H640-T^ssBsTJKmX| zIHfxBnzt-&t6*G!>x|)5E(jKbWA~i%z4KX^ES%1|zw6z=avuCulD-BDU}&BT>epuL zPho>Fg!(*;2?ZmSIm7o!GLN)zLY(4pkw?yh?C;gUUBjvb0Sl`V#aw6D?|ZkU`n~#be0qL;{|z1Zy#|EEup)S<566%b zxDEqnfT*x989PmKxFe7EsNAz`T38u6xG*&W(yz+zR|4y9eKLFsygd4^Z zu?qLN!!ii2zt1CYd^fp*7Ow8URqr*7K!fd(G!pja1&E*FB>@7Fy++tLxslxI3qVkt z0Ql$M!3Akrfo+IOc-ghfbEk;B;Gz5uY3e@Af!|5!JhX$ z6(_(_I~bP4&ep@+fo#zC?rf}Z9+12v2c?CC42mUQSK-k)X;87=oi_P&j&3kX!)ze7 zP*j)(0_TEJ*hz2(qiUbl&B9E`ZU1t9qc*wFAFgxY-IkHG!q^73I;Cz{`mf<~Cop_u z8z*qW?Eq$P=wYVb7IbFPcIV1~N)QS%DB3$be+k!v(@A>3kKT^2T@#03piBkTr5__w za^!~$RuMW~bqGdE{U%embQU6}JlPNnY-cbtbgV@yoV)hzuC=8Zv1uwL5Av505(}>C zTw=e}O+C}_u|M7&9M_QIWq~|}43by>!{vo@qhW&vSQ`BVuQg^ZCT`}hxtig~yKJY+ zy`Iw_he%W+roLcOz*zDy!8uZKV_`&GrGL=@5Cd!gOp^R(75c9M#-I#@KpY1o4#|t# z>4%3+4jRT`5R#3+;bVlTKjiwuql$J~cD72Q6(Xju<_JqnplT$MBQ%$WlI0+zqB|!O z@`CEP5>j&TjugQX=2ss>2H(=y0<8krge3p3ZqHve_L8!OC3}QTKehrvO$>9S%Ff&U zN{Thw^}d%wReoilM$RP%ajiIN&=#9EXGxTZtTh%w-7{j;&LWvf0=*8eM*WxOulSkS>doWhOZahN2o zU6NbpKyYq>Bh)PrKu|xDDMs%wpVNtRR!tPmNWX;3J0B%4*OY@2_izaCSPOl|!Qy~* zEGHr#AZA)Se`JnjvTy62C=Vb3jAzWq-J90wWknMzcX3JCa@JPD2%=(uQhx>aT}vLJ z@>XU?RtT6Lvw|FQBZ}5GN@@k9!%ok?u_mW&!i_=5L#8(27L9M5Ju#69GFxRk7hs84 z2h!?Il3}U#kUg(8gmNPC5d7O736{|m?Om}z z*`l-Uus!Cqh;r26HYAH4FPFVNM!`lUp;A%{o9pp?AVS5c7{PZ=Cuc%jORdwDW?`nE z|ECOo3qJxOgvDDI2I~gg!vqTG0FeQAP*TTCqkJft#qC^>Jt<)iEH_G6IVZt?+MCje>Lf2>}9QDDg}`NYKGg z%)J0e%uVgl{{JT%eeGmm)wX=Pe)Ba)lu%sGZXFRqv)oW1Jrrz0#7>sm#ZsvF-6bKB z$APL#e>F7ypTDi6uboM~yMxMbRn*E}|H{KE0@-YULOE9y2o}6zKv*V0s|avf6M4O(HdZOj5u84&>(@$Rtb4%(qxh zNQLkc^jppbKLNK5f$R6*H0Fa^M^bl?=xpjfmXtO|p*B+0Zp%asH(DN_CJ9FJ#L&~2 z#S1|=Dvy@X0ayChdIVy=$=@gST0dO=rJ^8GRc;@{n2A&Zr5Do^zXilGErbE#+_bx9 zvBXq^s^stG1&ol0ZmS=S=4$B}>umPi_z<8JgY^gM`c{1uc4De>cnyJZml_m|ou5hxW(FEKEBz$7U7&j?8cUfaW_?rA zB9ok=iUPm8K)OOY&?CZI-!h#MlM=w`d5L8$x#p`IW);(%yAjHtUBartc+g)kA4py< z(Ul3qS0-R{vVR#b`V)k0JGd2rbziDR+7-^-2XNvtVXr1-oOCV@(>eIAqfT2<8eSoL zO}Hr2bfPj~_>W-cwidZqMyPlgqe-Q<#d^he?#)ou>!tw+bf~^wU9%c`yc3=fdrNLb z)>2XLibA#of+fJ^$@YNKO!*;AqBa3OGrjey=N1EOqr{GyEU`vtre}7RQ@y)z(bMt8 z>4%H))!FseMv`TO5AXwfn<{^7_8O`Sac%?VWJF{pPzgypGM_sq4ef@A(54blO)OPP zrug-Z51qzqHf`Iv5dqd-+goU4Zta3vj8oV><*8c&3OZaV8l6Zyo0f))ee>q*%pP~$ zB7H1k6@_{Rv$V=ovoMwzi+qy}rE?VQ;GP<1m;*B!&U)&{H15Z@eRcD!VgRj1!pmzt{r`CDzcc2?lr z5>3x5&~6lK@&si}i8dub7=P?gVf(58hUZ?dU#>@`mMalz9{dP}5?ZW#;=sF;{!!~d z6*$#!1ftAqbUe;lWfaY}`GN-3f^#a5a0?rpR5A?6~#v!o<|p0XFM- zy&zkuL?I&1)RrkJ5uB+T1Sk!H45ULL8gikU*J-628q0)`Ee8N(&n@ww)Uxzr?OUC%0z#{RiWEZ`{+Ob-Us6B9Rw=6B(AQjSi_uD=1B7)jY zY*gc$bN7 zoi9;W749ba19$2S08V@WzR2SQaI4bgGioNU8O-Pu8WI1ae%!`AugfKDB6; z5$rg0*VtIx)V+C69q#t`yEitpeVbJMi!w!Wz>1XDx;jR$TGGOos?Miyy;wc}*B21(j?{hcrYhmJ7ufgS6;pYh zhPsk@|AWrFO+R2>@=yu^tSMJ#aW)z>}!&&?88s;u{QtgnCQ=zB3art`4a z+E&_;k=odF=R5B%lm<534dz}RY{xoPXI~UBDgeIy^986_do{ckIFlQI4i|Z<4ft%4Ld$qjhLQ)am|D!7t8@Kc^yzW6Hc=%>qo6!&@!(oPxfgQE{N|wp$x(sRNdL1Ra^T= zg%>Eb-xqc`7*xT){qzAdTbvy0boMFZa1*!GB%X(OIs#tuG*6Qvo~g}biVO+qamVV= zP&aYhHUBPLAU9fO9cLYsZJswsNErIN8b&owfVDg{q~>$VD%7B)f~Pn{J5-emdEeLx zE1Se5umuEr+f2PUzxwd8EBul7p3g6M10^7WEbovv(}_r|C0ddI8xGOr+8s@Lcsu|L z5Hqd{OkGxlj=Ld6Dbw+mk)XX^8Hvq>O>ee*1VAy}_B8|(tP?|NFi`%6?47NUR3gJQ z=+gNLgr0qIJON}uz5`Q3yu2vGUsJ|b!)~pV>;uYk)HSC#sC|xI6^Z^YU==-VYjKka zl4odqGGpaT;m*wqNIXhFxeif9VC60?04y_g$BRij7J!bnSq$%Jw8Iop6j@Kwx_65f zshE?{XLw#C2%CO!>$*qiUI;yYX$hl)+AeLwAF-9j^%jlMhvZB9%0_4uu3L%O+4FBE zV5m1|>L$r@lrRuO+iS2&T-sT^Wydj5r>zD}`BoI+ud@ug0HsIO%TV&u#}p3P8C_-w zFI8{=T=`>p8ZTE#QXQfRO1PQzk|>ST({BX`EPvsP{x7oY@p&A&p8@;7mPB3 z&VrnyCiEHf>vXcfuHass8K>e{e4?ic~tpZ1rSIks7=7S zyk5d5d_Rl8iigIeUt4RIlqd1qcyq=?AKY*eW_;DzsMagC-xtzwlfo6$RAkS;n;p%n zw@hKA3v({beHOh9-pb$Q*X479@;Q}x#_D==RK2GnRh8GyJ=6eYvAZORO#7r#OZg_m zJQHg4teQeN=JoAc5_zqI-=INS*?v&MIvx57QSl@czQyAp%}Pt@1Qz2n7Xddzm5Nba zwC5hM#{i2^BJZW(ck%$#sNU$DgsS`76wa;sjfW(-6Q=QIH5A}(BY38L3W91Ec-rRf W_Hb+C=gBPuE${U_f%g7OiR?>dbWx*uwv!*A5jnoqBuyZ1Gj?q5QEuR;eVR@N5gmoIg_n{nft zP_pGH$+v@^3x6zI65i zV+FLA>eDjf4G+Hk+i&{#lgI4ae#C+rYBzf@^`_%=y!g={u+497%37c1HvBX)iO%AK z`=tMS^AIy?&*J(&YJGx|dQC0hqBGpZ7Fd&dLVTNWALIW`Ehx?NC+VtmNqQV-UZWoQ z->`P}V=C9A!C48dWD@1BefA%jnr1^xP9#MeVrbjf#YGJ>puB_e%}qvkg!sU zzn*t6gZ9()yp!p*pRMOzIRE=-Bi8~eY*G8i^*m>ernY)sVz#E?dS1htoA%Z7z;V+? zJ>SHVO^?>|I-LLYdS1^anm$#}o7g9tuGaHb{i}2zujd`iVe6^qoy=yNtmj=ge|U85 z?0xIYr%s=fvkN(Sx;!$!xIVv9l-qiGddl+f%8D$mZpiCP8%yhVFD;gb*H6!%IW@mL zwRGzI%KZBHzP&TMhes-{y)!f0XZP=$nrRd`w6wmlymm%zE4TFtdW{Q>qrAK!&&%i5 z=NFe&=ht5%ubsTsfNQnLr4q{QSvzxTZDo1>jC^wK%sHzmJDL*|OYN<#?Xo;Qe`aO* zl&rR0&TgC#oyf`C)XdPr>E$!0PAzYg7uHq>W=^A8A|sz&Upuuvze>$GxxTa{Z>*g> zchCI#QlEU^+Ie{awXH8LE^nM$Up{gE+>*R}PM$xr*s`{6HLb2KE}y)Q&YVB9xU?>x zJG~^ITUuY;pgz!#9eWSTJC@EYftT|B^Cwo87v$Z`3rlAm4JilT!E#14YBnlVhvuOG9hL9Cl0hXLOhnAgNlb6pdtejs& z*KTFm8F}7n+7Gj{v9P{;_8c{0|Jb;Ea(RV{qd5y}XEwk)!I61+ac$xJ>JoU~xOQ%S z`OF4*b}yufnocaq;Ply*`TI~aXq{bO7L7Q+0m)sjzX*w(nqOaBS=wl@+G;{gi_6q) zoLZN`YL(4r&#v4jZeGLvAm3=g^0|$rm6K(w$!hwkP`EDfMKD0zdwT6`y;qR@2qHSO6xH9CPChDRoMPtF{nPK-~^?A<;+EsyV;l85E}!&5VpqX%~nPs#fa zPVL_}y&ck=24Lz)vzmSe)J}rb>e@OwzXX1-Y=}-D0k${Ltd&Li^!(jR;ON5AG87x& zSb#D3IS8I#ff|ZVL1s5YqEB8vDW6$8SCsErUxv0osMNfl1#Iwb^2|cHD0lYAGfQC0 zlDvOqeqpI7PoJmTE0xxwJOX^JohizDhUM1wwzjrXTcx!sADkX;Sdh96YW!rQY>k~| z_px=h%ucb>FxxWAVra_YIL*pzgw3->T%Ct;FXCJq>k)rtQ+l_J~tioC`?9AYAJDX+uacv6u zn<*R;^fy3j4OFRBWu!ilQ`>j*9XJ1$aWA!Y9_bufLA_jJtD;3O!MQbd65ls-;MTs# ztb{+6&K}X4Q}|v1b?UDSD%8Sr%*ssQ>!{#sgNG#ywypSUM>(pC?w~tQ;n!BalSDSy z3DHJX5+t2%H=G%Q%ueH8;_)fbw=&MGp+^JYA6=o|Hd-S?=Igk6O7wgcR~pyX!G$IK z-oVw9X!kvWBTIs}_u<@mTwAF3jmj>HJBfqKXwP}vL3c0XNIW@%>n*rzUG#qyIVyh= zcx#k7FUk;FNDimP-9%#@EvFW%a%f!H0i+zn*&QfxMwB94%D~Ba)K0uxz^~onNF@k| z)Q$~N|JiG$HbhN}xOPIcr9poj^{V}!7Bye*zYLsG@2N-gXsL=kLfjJa>iyIQ!u&ew zYao+kyR{F5gB#mNT16ZpDHCNGEuxy}4C!X0E|NKMlz2y)qjKry8c8onGaK060EH!R zh48o{xUj_T#qXspl&J+&ig->qxZZjd6)H*y#UyW%(;B`BYYU)x9_NV5#DfNkRLuW0 zl#x!%i+1b>l?~jr0V;$Z>S==$``H-yO?X{K4GrolcL>!aS*nZfZt#~hc@ftZ(4tk` zL+w>twe`MpsGV9)_fdcD#W%@B?b8WSmx}4Lg3I^e4E0%+5NQqF-QdJ|(GJqNpVoik zE8&T(-a4pIPl&sX7OSYC+SNW$y$xxrr3eEms<)!~EO@m79H`n(HIqCV7`~MUM3ppQ z1^g_F-cp@2{~>u%JARsu6HloA>-C;SD+opE8I|X%9k>T2)saHwFL7-NZJ`mMDB7c1 z4w)ThlW5ljto}h93CDZc5gZRAH-$g?J%cl(cSM!?Ou9mnUJ|;uwMEOo0dZ;>*QmX! zEh7s`5+pq$%_Lsz!DurD>pW4ffkvW9=qa^^>Q|*dE`IMt*=hWdMWE4%T1gg&S~!Ce zqi8#gWprgf@>60Io5o$LZcd{$4KC49wQ1Cf|D07LTTb{Ot4b&%IW3`Igzpt__`0Nz zpaj`%vU-$T5!|2=nXHwHQL+fj^%0vil&rk!8Qh50MtlF?Y%p0H(o@omhNP&EB(a}w zB}le3M##8(4dqFT?m-Vp+A80+qWwQ>u~ocHg7yM9M6^5M&&ZG*jsAods$)Nn^C+<- zN=$=ijoK^1L!tXd&^od})JyukN8o@)^EUBU!Z&#{Ra`p=ybR;-=lMZ5UllWQgapLV zLo-lJ&_hVN#&jJ=iaInR527HxP)_rq4}atn&wTP}ZIe!KFq+I3tIh6ky4)VG&mRbe z!XJ-BV{t?Yl;%`Alg;G|#ZtMYwXMC<(b-k)?&%^?)*XXF%!lXUcxl1XJ1Cy5B}zFeBf8v zuQPTB{Q^iBTf67Xz31~(h|}#64UaX`0iygVjv-wVS|WzJj~wD zKEyu8F0jwCKV@HI|H{70uCPrl*P65kw1>5~X+Ng@EA6-Cpd6JyEPphSL@b1XLKgQ9 zvv;%KU>{|lV$ZVAvCHglaqsuoRorXTI<$whN3WQdQtB<(ijqb zs4r7UD@b=D{p^nhJ^V2H2>S$khJBJf%_w4V8)7iGgKu+a{ikvNOW1FL2hXyL>>=>v zrR)**GWK%z+w4*H7&!C__DXh%eFi-G9D9x!&Rv{7W8#~>s@3XlKDN95yK!t>?rUV~ z$0V=f7V)FNdGhAVbbA^}kg14bTe9Le@8i37qelF|-MA_WsF#qZt2dlNb?F#NiL=#e zGQB$;!Ogdjr8}wA7jE?GpZz%JuRC&qZ~oE+ zHWqyr(LT+wxzYv3i?Y0ZdF*L^96zKYPUI8FX^Qgr)0))y)U0wueq4Tha`AC_98<@| zr?n|@#D%5DkF>~7v+3Doe9z1#o*p_9zLs4&a-O~%@c?41>u5LHi(@Ch$h!IWknd)BDaTUM5!}4;+{4Y@F<;^Sno2cXa zOwa!u^?#48@vpJVI6fu#=wnk-kyVibND*m)`J_=cBrTzjY48R8;(x*hM4tLE23~xJ zWpVHGXjcLED0H3Z3m(1`JRm+|fRp|n{RSU3ufcuq0AId}bCfoaKFh3vhv2Q?-4}2q z-cz4e4b`+v+1YD2jGVHVKbhU3FXA3`FYEwElGjJ|#xJUEK_z&Gi$sIQ61 z(lpK?@o(eU0=h5Y*oQdGJYstI4mhl4b}zo^z7*{3+`EJM@WUiGFD;I6?;6v&^P>j_v=2c}p1m8T^${e}l)=ziT{hwCTm*HTCO1 z%kKssz;_{6;Ee;X?3Y{I{c#?icx8;hKe+yq$D*-M%=5@G-;Z&I<5F1 zD`@ETTHHajwOW-NNa=MtgAQL!pk^={@q@~0>5Izh@r~jJoY3p(mtK-I8V!CnNd}!! zr!^T2xJ7RwGA83KWL3I4qfw7qOt+9mP1kAbM1Q!!(4-Yr=}czg30R_|UJ?t`k46Iy zz)PgY>-8Emi^vPUph-H>ZEyocbQ+yb@B{^QU@dw<9Ri1Nfj+1VcMyMZj(Vsw5?MV6 z5_OZ#U^eTGxLFUL5T8(1d=tNPO<))Z8dRPjCmHo7eUsT}08xWU51yD!H@2^}E~)M`NIb&w2x;uo3( z(UaimH29z=RB6yeoYp~<#CLr3>Sdh~JORGYOq>&pB_Zn#^o=H%^hRnr36u)q07g^O zP~1ce6d*E665$f(H732;&}1(I4KJ8gfN7U4wQ%|)MyhF2a+S6n5mOilL@yN zEhHhUb3l;DoABuhpj4GeAjaAjy;D=%Y7iwcr4; z#E4pr8kDtwyonlUu%HBR00jaUzy|}N3Ou3H;824n265S7Fqw2_00LA2b`UTbEJo2( zBauS~O;(#xAca7PGhmB}dI=PRK>|d2v&s`RS!2QdI-42iaVL_&X1$p#HJ$iuMKKh@ zuNz64WJ@sn2k0fYX(80ZZlf!4ij-41yC9F zPhbeeiO(nlL|8N$5(D^vifksm-D1TpW;-Ngbl7huYf|Z&><)_sg>E5DP1!;lRcbX> zu+9Qb8jKDX@dU_%>Vh$i4@M(!z-Y3VEhcnIi?TM5w^+~@lg$KmAY;=+k|v&z6$ejn z8s`W{gc*|-7r{e7+iEfjj2SSkH(E?~Gd0y_wg{e>EDom`Y(iPV6BR?aS8o6S3}`F( zWQF2Da%i&FhWiZ;n-$HlI3OXD%W*SV!4vS=;Y2Bm;}+7WX)A5irPbJM1Yk(dkvzyRR8;#>l1URkT z?64S|HXHQ9>V$;M9_P(uAxWZZcDYf?>b!+CMy>0#O*ZO;#tt}HNe4`BpUK3aL`E~r zD4GoFBI$JCfXRZIE$CDemRr#Z{Ime_PV|T@i4mg~v;ZTX7GVts-3ogJ)d1h|F*gZH z7Q4-8Cwvho5d1OOERdefVx@2N%Vn{9JZQHS#0*3p<$xhlQ= zRR>ytg41DgLiuqM&ebNwRhU{AMSO z<9ak272$r9*XeRvt#+@~;fxvVCK1&p=^ z!WIhyBF#3KToVLW|LFA&o5PBLp3`n~Idv9?)$4NEU3Q1fY4h44dXv!%ZrH4Lo55~t z(phyL+-b+SXA?MrZrJozwAyBOyUcFz(q@CW>|m_R?z4lIlez`)dF`%1(BZK=Knx9l zT+sy=h@rU4VuP%4&gy}ag%J=C)p>0`hdJQ!cYKbClC}#?4##XZ26eYOU`EXVBnb}(gTduMyWMWL)9!KWZ7v&H;q#!XbD@HB+!S3sHHeG;jgKpZbz!7~M2B6I8aQZwJufP}}fS9S>;|#h%%N=lg+yGy| z;R#1vekb^C2PEBAl(mCJ4j3>mcxU=@6DD2xU(a=L&c;IfAOe!tV{4m<2#XDoCx zS*J?Z8IJh;D0B~;o3TAeVt7N?VBM_)#x8-!h6uh-@9 zdJO=2$m?_ayl$t*8FIM*H#58nhtq+gE~j2^*9YlF435B&iZ!PJOmaD0exEhqa@w5e ztIg&1I=rrs2V^}U==D0CL6@BOscr z54yr0TQm>|xLw|;)8Tg|A~%zDt8`t_SRm;3MsFc~18s*Nk~8Rn0hi71@S(|avje-h zV5!^~Vy%FM+l4>3%VhGp(QcpL?{NkE1^_)02zUbMi_aZ}d|@bT4ilAincObD-l-4c zHa7-GmmN^1KR1}=^0+;rfIS32fT-Ppz`8TwiF!fS7x4%DewRD!2_%xfh{xyhIBjm1 z57>0La31RA2-@9_aK!C*I78&TnXG8CKH`b`>~bg^@_2l4w=?Kzj@?Ywqtf*xk|7X| z-$I(2a-DV%Ff;1IA-5yw3b8(S-`!o^a3}_P8C;JG%pG4X%JE z<_iS8{-{3)S%bsDMA9Ge`dwa^&ExhvF<7{8UbNfc0se8$6&5_PL0=3JPt5N~gd<_E zHz2!RK~E}vGg+@n*PBR&BPetW=^JSWAx)z`681Pkt{|G6%DdeRTI%${Jtlq|(7S%%R_d28295$Rdn}c$}^% zP#KT=!fsCtuB^r40N{+WFBx>DXps$`FOs*>s2nK>dh%aEZMuHK4C=!c>0`ZvH7xAUya#)T;0?}YP z6bwT7-CnCd2w7W$0iep%Om{lGR=~jHrN5vB$`J~LlCnD)40wY9zuOy%MEvnkIuehE zqN$i1gTALj@nR|39FF=!epe_E^#y}oKUfs-d%Q_c(A%5}#(cgc+%}sPjrN*Sp>))f zQxqi}j^%^?M5r})Gug08H(V?wn^EW%(!s5?{RzO2x%jD2Id1k&e>MWTPtGXt^bwL7`hn z-$=VT7z$aN{3Qq5KXy_8DJ z>0~0R#7gm4%lhJQ~lY{n=PF7z0Ft z@q`ji#Y@RlDz228)6LD%XepkmbS4XO62yG5s1gErA}KT^>7HN*QW^+m|rNq;6Ya$^-`2%4m(4UAq z6LE_rVr{{_2~XG=4`xDPz$Yx*V=-J#6m!91A|96Gv0ymaoQh@>ZOxfXGToZaWzuoE zC6TRmr&^M!SR(3A#M2R34#l!)1&Zf^%2HX*M50AFye_9d9S&Q|iMCXzt5hl}$#kb2 z%P0CfZYHa!bd%NYVhal0LR#KR8@d&b+byM1BAk!q(B$5cXp})q!wQC>K(hWxBwenI zl98LS{@k1>hUqETzR(wU9)wzamUQu$s*E;WyI-%K{8(oOaCx3r_s zEu@vLwB-^kgu~X_szggN*5Z`W-N__N27>V{Ol~Ao|70^>Zz)?!<;$(DxpaH0ODQSa z+AD=hxtM9mZp-DeQ2toLo64rLX>T@dw=0g`bS9e(CcWu+s|<9=iL5)7O64-Su1dTs zmq}#Psdyq^DmS;~`b%wX`Ic?1mDbiwW?QapY`olCD5rAG(QLXUnaw6rZRtz~#XIF} zvb!hSnryDx?HCRtEy<*#H`ia5N4vYb3x(FvY^o!-d-!Iu1(j}LY`ofwLbs64Zl#^- zXilfy_MU1k(UGd4$-54w(+r4IN-(){u~5VZUj@Ivz0{s-sdRRg3*DWbOnY{;yQj6M z(pKmwjh0Krh#X0z{JB!DR0xy`PG`nBj13K?NIFnZx|&l;syS8i=5zUSp}eg}=`R&i zr9xgwwX|1q)$&+-wc64-+S$|DStyQ{yLaua47FBr<*ZyTbf!y?MYT{YkI?Hn$TRhoAW3=XumcI_GMd|JBFLsmy!7gB z9=-0(BZJW>kHrQ?cI-^0F5JJeavJ;E@89_IjdRP`M8VkzevAaT$%k(Rdjx zGN3gQTGLc-a1$;t6wu*lx=d0+brrATRXUaSuMT__|M<)48yitLyK{4e{V_H&Sy}ud zeqtvO>LA(-Nk{Z`b!k^CUWz+nzfV^`SMFTkfnb~0ZfjqCO)(a?R5cjZ<3w>E`#XM^ zcY!B%>?pZTvbC++negu8hQB*_P}GddsAdfd69d(nHIAF^p~m02u)0cju+1I(eL#-} z98sk}DD+|{245Piz2jNU`72Lgk(QM=zas^tFX9=b1pDd*mP7{>q@?JP+9B;_l|cp^ z6`Z%faDn+>5IFP$hkgKE;Lr~o`hi0~aOejP{lK9gIP?RDe&Em#9QuJnKXB*=4*dd$ z#QN9^Lf>N0w;1#-27QY`-(t|W81yX$eTzZgV$io3^eqN`i$ULF4SkD2-(sY17n!@x z95;Bv!k`GDM?yKe_fS!Km32aF4JD^>ICMMq)<$*tc{MoV(rY>=;+v)J?T^` zy=V9CblQ8{k&9SJ)I9si+m3$rbGO~LYv;~4y>ZvhH@xMo6L`K2yMGveDfnz+%0)b+ zh0QC#guzkAnhsdoDphx91(jASPR02$?@()tVPsCSwJFK&t7DQ4CHo)}KctakAGyHt zkV63}0e%xm8S;5>%ZI!Vc?m}eM<33SjI>l1d5bC=3uI$y$i@QMSU}bS*;pVO3uI$~ zY%GwC1+uX~HWtXn0@+v~8;g()QTC#CItDL;yM!$2AOm-!u$h#Pg1aei0-Qz9@Yf0Z zrX=;cC|8KxI7R#>b)Y}VTTAB)Z@VoV;_39zXeM*}z~IKp;2=*V-nAo;HKB%Ro{jd%Af>~60tmJ}t8R^)(NJ2=(BjTc!2jiIJQ(5y0~K>4z2 zDGlHPp3YMdY5*4u;DP~MFn|jNaKQjB7{CPsxL^Pm4B&zRTrhwO25{jb0BK-ln63*f z4Gz0h?z%wN)u8JFT^H!OK-UGjF3@#>t_yTspz8u%7wEb`*9E#R!QBYB8oEpjyujj@ zFS0y(q1IEznXVVW?q|P*)iKi-{bp%i56hOhk8@&l^0Hd<5e>Q_$%&&H=&1?kf_KADG))+?fSiadkTeIZlaLM z+GpGN{k1=g$eDE8e1HGY@cpOz2cGF4D&%MP6pJobkl(fMPa{?f9~xf08&5j6gX5*T z6_4R@nSZD8I3OBByR8F9)88*7A(HNwUkVPlQ3u}0WfBW$b@Hr5Cm zYlMw8Hf*dBHWm-!!gB~fEOAu}($Io*LkrT-f;6-s4J}AR3)0YnG_)WMEl5KP($Io5 zv>**FNJ9(KLJM4=)qsWkqzx4dz02GB_=D$O3;X}F zxzn{b@83O~%kp$)d`B)XCA<9okkg?|l8aiSOfw3Mj()R;}{Qy8e3iJbo{Xk(qP}mO? z_5+3eKw&>n*bfx;1BLw!6!rs!{b&p+VvO~Rc51#dD{7$0AV7k<}R>y5Ev%^Q26dDwn%&RTeMjC7FD6_ z0)!NjLzI`sdjU(~WK`OJt0f%n?VY=$uQwbi_bSP4{Tt`DZ5#VQPckvm+lLuuqIU?u zUNuy9VO1iX`>MVzpn+ z=SKR|>D~P!`P>$}AhQ;3zX-Xh1}ledhR|v1a!9ocIY=Z2iR2)W93+y1L~@Ww4id>h zA~{GT2Z`h$ksKtFYe*yqiJ&Ujg&df~!EJK+L&%#|8<7Bh5)J$$fS&})CxD*>@RI<3 z62MOa_(=di3E(FI{3L*%1n`p(n6%(X234ioMv~OmhkQM{;s<1@D}Lllb+4p^2I!G! z9HG1!M>Bw8!SxbIT^lWhL#DtrAxkX0L)c~U1Ik|)q!?AJ2lc7uR!N#F7PQ)Eq1b(A zU*E%bJ@Vjd9=g4=i?8rPVQe&$&A?zxy{#n_936cy<#LaVoZNWDZ~o5jf4W@aZ{A-n zmCMtkrSdF!-n19}kFi5igT7R^diCnSM$)EIUgx9~Yz+b<* zTDyz9f6%6xilFWMd9)jYtcm6>w_2=R@YaMmPRVB{HWT;|ez%^BmrQyYx&f8_(U zZ%`9z-#`mGLF8X0dMiSi9mco>B)1}I$OA`efjo$3O*p5;Z<;>R{F3D4#nDUWkuQgEH61l9o#vlyyqaA-ITUe5~)&m8XTKDW@<=k;x?IGvM{ z!5q0;*OXKS#+nnWtNhz~{Zh4;x3nItWHRlANH{J@UYj)<&O{%^LS;)Lk!~KxV=dC= z6@0B@gwkWo3}2HFnhz;mchaC4dIj@DC6lUX-aE3yjf>p4G*bKi5AXlfr=&|)$3C@> z9|4CjF_rECH77>v4Cmx&sD7RcAl23ltyUeE0X007V^_6wp)}G!@WPKvMxt1vC}VR6tV!O$9U+ z&{RNE0Zj!o70|rEtQeQ*MHpC#hHW8FBnl~7am0Lw=tT zdAEx0gc>?gookqogxh<~-_WR8nr$BBmF3fkWczR~_wa+YznuHbaC0+HDnrlxx0y^j zl|Ce0;&anI`GP@XE);jqpO9AnIuh>cj6`Z*`B6MJ*ei?30eO7CCcJ{xi|D&L?+mK8 zJP2DJge?!kmIqs@+%=CL-wPS~6&T#V3THm&z zq1EYX^;>ssALqx8eek2pr}@C(+Rm9hd!Kq}-~P5X(tkqKdx0nu+W%&lb7)fl$q#un z=D*~7Hjy^sXs&DEi!~!dudQ`PT7|^Tb&0Exu+#XTsK*Wp-0iHiH)dD|IseV614oZu z{My{3lJw}y`v*3pOLKGYes+3BTD|)Bk3I3&_U$kST=Z}nJv5V5)L)%H1I|DNG%wWs*IYZCuK?IrxFeLvVIUD{W#rGQ$D42rF-3$k7d zs>4ZreR4#j=grg+n-H`oYri$e|DyIP{_1_T&l6#kB-DKfs4KA#!Lx#F$U>4sUW6vW z%(J4 zG{L0?QuKznM`Jx%9Ru=uBrzV78%5D$4U!%*YpR>qCTO7>LaI0uNQ(2BxjB9u3G$LI z)n4GuSI0O-rl3vi8Pu#{{;h)%>^=pOBoUK#DhKE0$fl#bfAc&1Ih6OXsydQUjLC~u zHFS?!N|7K7jz*fdlgH3hw~^GUdi()QM8oQH+fM%+k46UuLm@ub)^^vOU0vTgkxpkb z$N86PT~7=Qbak!Px%8`oOQo$*G@%!SSg;0(I6`%bH%O^AmsgBj(dfNk$20u4m!kXC zhc?fG8}s~V?d!Ege#h!}L06T7AGs!q-6A$Gz|urEum5T1b{H2B8s!BX!u*dDM@p${pwd=J11$rA?*%d z{ZlmjIcW%C#kTO(PuBbYdi21^fI}0iG$WbNgRM9;<2PZjiKI)oqqY&(4GkWNHj$!h zkgMa66AYi3JI&9{ostSyzl^HCjN=%3LH6PcuorfWrC)*ugH!@ZMm-HwQN)t!B#Z7) zEse+R}d2gWZ4#xDoPF9*gi2gWZ4#xDoPF9*gi2gWZ4#xF->{BmIYa$x)dMNkW< z^N(NH_kh*$)T28dSQ;(-9m0y1^iV_=)bJ+FAFB01u;IRyZa@0gw;#QYA3pr6?>TgM zabV!g>EYqNZ5tbX+xXlk=8wi;D{%erj^(jva4#`GEub_cunuV~~~=7Vg(C zurPQQK?-l-8-+p|BcToaqX`cAqdv9QK6ppIhIiz{sP2PzZ)M9`rH0m`c*qwr-haVl`9q7IHQ z1ggUmJv%t?$hstbdT#E+lC&?K=9%mP_&Keur_Y_PeOp?s{d-awABx4O@1@O83(UCj z;5SwzO6WI@G!FDJsP-+0zLA?ERvoZO0)IKA9;8X6BS_0g_aVI+>Fr1#M0ytK3rOVo zHPBZ=^VL8S#o0w{B7yEFfW8FKmjL<_KwkprO8|Wdpf3URC4jyJ(3b%EXo`wJ$(ND& z2PAk;WL+=fxoLIwk^$!|@TUkfWcV{kDU3=fzdmE*@SYk=5*Ujze)#@^Y1cd|F(_rE z#eE&q%I)p%|G+2S`PSQy@?h|D`((QvKGf>j{{DgfRn8M~+_QJ!aN8Xo5C4<*edzh) z$DcX2ef;#1Y-h*L*X+jUHBau`i5jDb3+Ckc85B{(Xm8bZz;xOMxJ6kh^9jl7)cuwF$#=}Ke0-S z06>8UIed2^1r^L)8-2ZrL>IO!;Xxdob-~`Gv;k*k?t`gQsmsOmb!6$QrPiF9m zrjcgw$qYW3!6!5LWCowi;FB4AGJ{WM@W~85nFXJ^0Jg@=)C~@ig%9IM7KO(4w2JvO zFpu2<`0GL%M>>Rb66tQFS0KFw>HSEbM*2Kb9rI~mo&vzIk$TMEiPz*)2J2DspzsPr zAdEOjW|98Xbs-U;ZG>#a(s*48WJybNm9As^TFP;G@1K=R6Fcrdvt!&ar!N*KCyS*- zV)dQf)zPunJuxx)HLZ4}SWYGfTB1=`sgQ%`cD%Erqw_?+j6FV`E!b=sZ*4ug(A_=I z51w0r{B|H;&oWzGDqx1z>gbIS)CUQyp@m&7(BW3F6stIu?|oBBePa$G+I?^dP;LU! zI}1tyHVVrGeuj{OxT#@V8lD}+!pM4A8_1;fa6>&5M+23*^6ad$i6#{oQDF^4L~3HL zP(Y;b_|zQVvE!GX7~2jf@0dojQRzIh!QWGxe*5k*igyP{Dv6`uS2sUMyF(W!aqC_IEq=ndVic{#Ecpz-?HPksqeA)iF}NH>iC z)Qg5Ez=3DjnWI;&n! zW3Rwg|L!9Cf_H@qPlKc7ZpF+MH=5t}vGd>h(R~*#-1nnzo#!9q?%HqGewiz^zu_nO zp*kn#LEUiU{D-=rdS~@Isb}O_U-u_b3q~&|q8}~4d$x9Uu6E@tzn72IPLp5F--ecl z(DEv18xcX-I=LcSqb@krXK5Uhs7{_}#oX*p{+n07!QWAPK)ST+>eu!ilITHN#OQYL zeozufykSlM`tF3AW@lIeqh+u=zx2QZUy?2jT-6T{FK<}srzr)k^fyrm=Y3e|AH-5W zN_C=?p-~%osVdCThwIKT)uxVFq7U%uIw^hWOZVR|UApqbfb{Rw?r#3~oRFg8Or1-p zIMYIZn2?sc;#V?y<>}k*9Y1z#T)OnvANyFnrQh3p0BF2Y%aI11x73Y$0zn>Y%aI0~CM3Y$0z zn>Y%aI0~CM3Y$0zn>gCAiKDQIqpD5Zfj|>6dIxNxo^^=49yZZkkN=5if>+RfQxV~6kWwNHD0L3Tb`Kd=sI({y%o)IZbO(%1Xg zWGEKz+!2rcP{PB3cP#k*;c#&~=BXz&n(=aLsfcyl?`SkBgK*LDs>^pibk$UMcgRVk z8DnErfb#CkVpS=Mu`Svd+oCX8QH*U-h%<_@EsC)%im@$dzOoVmYeK+L2sjD>Mw=(`Vn_o44J@esbW z4}GWUi%L5N+A(M+4ar!ACksbxR)e0j;_j^b8&2?pCdHjwqdm0$#NX7InZf;_i~P4{ zr!@XTvG>fj{{H@#^k=i7+81-VT@%?X&*pY*$D%L7BI6~Wf7h;uUNttxy}rV4pYE#m z_AJiz_HbCL26t%bF~?qceZLNk^)gb!4{)H>4GqX6Ptzs}XV7^U@^tjz=)pO12WZC) z*(&nSvLyL%UGiZe`DTG_3-a_%aKbrFr)g>!yj(}awKZ>aoKTPuohJ`0m8kdM>*1fC zu~)l~-}88X|HEhc`t-bZU$L-LlG@W5jCOfVDm}O_lX>HwQt9zmymZ&j!J*gTdGMw~ zot@#xe?M5r^S0J8n0w(-@pkDsc-q)?p}~MnO`;VMEfV#Wjx;-^bF?x`#~7_R5nQfM zH^|nj-WS1%L`}gJ%Ik5o8ulB-Jo= zl=Jqr*||A6vEA&(!&!PmI)L32R|aY${IdhwC21gr7a&P|fII97ji#UUpk;FqYw!-N zGj_0Fzleo+bupj~LWtF2NbAlv-0tzc`Fu~a%f++Vz13cyfA{W(UpY4F4;030&Qq0+X61c7-OI;hNgZ}R=J})no7Hc2n)jI~-T4yDx_8pQny*un(!vD}y zRX5u?iq%q^bkrtwFKJ_KR*W`^6YG29v$M1ON=+*rzx{U5-2Cq5D0>fR+Oc+o$p6hW z$x9)cE}}^>H!=_82|MfkB)f)@tS-q6?JMo1dM0OiG`0;-YT5>DR@8X)%X?)Rn}_?35#4yFw1TYBb5tV9i1Gy&JWWA8Z0AiKl7~wN@*7cRj-T?(Z)@|H8>< z4xw+R@Bd!yc`hCN2nefnuy+fd{k&N7#4H#uV$DEh)sH%^c zj0SH~OE7*1GOurBKG(<`Yh>g`=DQ+8RunhL7$?P@#~PW}H!`1VWS(nezAG{m97r%c zO@`or2dznfQ)JC)Wsqbq7#Y-E$1S}h_ z2;fO}m^PjQo=%z;Q^1Fi%H5@6TQ!}wh05jL>1>A2@<5<%U}6>v?>*@ZguGpsM>IVe ztzb>Cqw`qp0w39_C{ud?;4kvw9jRu(db0M#hSvQEeD>2EmDbW|o=RqNE5B*ZN^5Bp zpQavq8`|a*n&zx)n&`=v4s307yj<#-hEq8kj&$rurP0V8CBMI=^%!Z_Q8~`r+K#H) zMV?X&EwaOKA|g!wI59B3rA;)P{r@&1Tx~>z>+2skMuc^R!NCXa9~v4RJ@>%i;2rt= z#7;aqQJ9#R*}Q-EuHC!udt`Fw?%fZp;7yTT%P;BZI1Npl*xVuI!7;qMiM@BL?I5J8 zJHaTbLy}VmMH+>=J`c#iQ29KLINsFjy3=T87Eiri9F?ifDc-%2~+%b6EF?ifD zc-%2~+%b6EF?igx)fy;49m4zQd&hSZd#>){JRb~B?0EF#U+L+6Yb6@R9A9y{Y^j9YGoDUoGP??a0MDls7asDI6TQ2N zMJ%Ear>)?0QF;@+aO?*`&`dOtJa4iKv`$2M8kXp2!jaaBX!b$Z$!DcwlyE?sn8?q% z^*I^B2A=j1L!%DGV`6lJ8$xlZYqQO2BZ>j<+o@QO&aSLjtPwNbhv7pkwh|5<Lb%s8tbR^`61**ZNyr&I#U)QYG;N2XjTfhwzf@S z$8{ipx2BGz)3XyTK0hxP5sBpoYG2T3_9&@R`2_c(#S}Z`e~lLZyvS=+jl6#6$zzvJ zUOG0*-&fP(4mE1~=g7S{ao5v#&b{yGgLfXf^TDI$eDRCi_yf?@Z;tZsgRT#*lj^Ax z?->%!(Y%m>6`n6GgJWjW32h()GRQ^5Sc63{=*3Y7-U$}L%QY-7EWh`avwslnE#rL* z7ltKF#hi|gGT3v2;0qZSaorqU_eIMKqy6cQH{s8@CR#u z#k*?9d28(-Xwvt{zyN;)#Ms*ADnBlLgKg)71Q|6#>Qh(2UWDiENZ<6Ak-!kj8<8iI zOL;;tO>ZdQKsCk60ys}z8|52zjq)^$ruAUTH)11{&)|Hfem;jhML6kv0r^5bUqYVN zROx&R@>FLxj@>v%`CjCE>-lZSZ>#4AkRPb$hmfbTBcx?CBkzEO70ivX-;j0%(EOwd z-D<4#2$KLE6Q)q?n-&kCkVVva#m+ImS5-ze;EC@{dada5;f=vkHnT@@x_|=C!;${} zNSID?ms8o3&EO=|Qa_??R<_~oUp_zHv9v#*Yw9%k16jP%0WSu!S+?g35nVK27_(aO zoB&?+l=TM;olW^HJZ6L06!2QiroLuu-{oKd;W5%z?j9-r#zaBGwJ!brR z%=q<~@#`_;*EeSTdd&FsV#ZGa5Zc7tzzXFXSfTtcf)yFG$@3;0WRcI-^J>gOJzvIo zT6?E5t;kb^obv6+(@0MF4&n+Pq8SaGqyaH3l?$JVEDG+sb~k@{$>#$$vf15u4qo7; zYhWO(B8PLAE4dqCJ}v=ZlOs(^b01#I<_(z4hW)ubuoLiS@$NLdk;iJ4q~V#UE>g&E z$GZ^mQbfFe2e8WG}7v|_xIBOB==hK0#zrSyd*mk zjj43xmsNOEUV}U>9a7j$ds#%TjKHxGI5q;u|DT>10x#5p@wN&Dua&?aUsm0G1^q(X|(xwn09O^&@_;z9UByNaR80jry-PB z-S;YsJUJKS>XSN>ROvT48g`WTQ!Gk&L{uV#Z3%c5fkg$LQ(|PpW6ab+tajr$W)Yp& zK=NHxjXMAL^Pia34~8OgMSlFTHIFA=i7#7^@xp0`t2`pjHQ7g|hTn1EP}7F(+`wmE z_Bzd7wzcfpN~rcKZCja_`QpMuEo8X@n?IDa(qG~~1o|6_NviQlS}F*@t0t>-ebz6e z`U^j6OS4ZGi;1q&@-R&`)L$tuLBZ7&u3f}KHjVSt0`crdi6&@hQc3vI>NC1t|1;2v;DCNmi5zmtt$x~P$qrhILSQJBySLH47Reg>Zz9^we4~CP1N!r%#)a#n} z&9!$Lj_nFQc;fcEb;nG1b#D*9{ndtStJ0i*Wu&{q(4BS2#WXpA(_7y%k1!tOIrBu)o+EY<;2L?o#2D<}peM9m zgs1Rqph_-V8dPakK>Hi1hDMm3TB1g_>$*a&3vFkm2pCy7nsU)b?F3{-2Bz===0=bW zJ;L9>K1@3HJVAgN=!7RGRoVxn&W^IAByG~c?#`}a*U0SjaA%>j+JmqDLx+bti+!<< zu}o&H9W$j-Jd9U~eR;=$+Xkvd1VB+{X!g)(SD_QzJ@S7-g-|%19;?J+mF>_8yt7)` zBmEIYzi3TT-Of#`hGg;RNW3-UNXkq{H;qdacf|s|K%&@sjtd?jk1O7)S1*#%sqd^J z4dM~!gtX^h&f|0JE`0buV{^b`A2>O+bl~Ll(zo6+f8YfD{dfWh8rnQ7X{0aX|D~8= z|9XKP1j7y?Il-`lsG<{X=tR|CY``El>H<5U;^_eTaR4$t06ZN4o(=#{2Y{yoz|#TX z=>YI_0C+k8JRJa@4m9v|0C+ke@TB^PcuD>>+B7?!RM9huIrt=siMY@tti>ee;FFkx zPl~@I_+Cc359!rNZ%6td(z8fkK%zPL0Z`jVD^)oFm^7OnFdMA9(1Wn|*PhI5%!aQ$ zJf}MUn1+dkD$>|3yM(%`v^!3nPkTKYjGdhwX>6KPeFXk{J0*{&oW{G;oEtLroP3Z$8!9GCDG4c6aCTJajIzUt3$UB;*RPX6?;O zQd?XGTEw2Z8O=0cMp6EIXj0PH-%rb2>flEYY`g10eK)v9vvJaP%6sXVldXF{to57d zX@sBtJOFeMH#$Io?4uJXZ9E%Ad-$s~HAhmP6L?RJ<5{UY4RiO;HJ%lC>ppy_?VZq+ z?}_yZ`cK=i8*Kr|Ttr#`*@iV*ME<`fE*nyj7y=S$!CN3P1SEz4s1T4C0?tB+28Dpc z5Re!G5<@^@2uKV8i6J17md(LGdiI(SNMS%NjpoP`lgU*jEv6m2A{1W_O{(!(6?QbP z=$ga>F2X6h9?-!(WW?Zo;g8nW=?~-0wdsqm0_f7H4wtm^RWo_2A({hYvmYz()@se!3Eln6-FdAzH=jCLMcAMY~4g zp->U;A=dgFb^|=&Vi_*3y&}tIiAUmaWJ&7RcV`DMZ$Eb9+dmpoSL#w1gYjj64X7aR zFa*1$&QHPhSe@(SaA@nR()5J9qwah-U;}R6D~-2x35M&NX!j*a;Ktq3QinB9JEaR& zez{iC_R!wx{u_2p|I_U~2ln^gKJ&8CojXQgVF%bEf0WbCB#JhugR+=nqsbQXzWv@z zXVn|$;;?+@o8LT+#2vRyJ&M2E)C1bz&;}>mm|?b?KXBu-ZNr$d5UhsL!3ygW`3mx; zdRUM~7UGbk`p+(4k{-f$!G617zg@83F4%7u?6(W{+XegWg8g>Ee!F15>E#f@J9WW+ zi&sq082<}L?}ew(2Mz0MXjmVF(+3UfgNF4%!}_3MebBHzXjmUKtPdL22Mz0khV?f!#0iQ8sAKA0vSNYyN^}5hxxO2ReB%+pt`yFXVT2$yj^So< z4SgU$$IxY}WRQ)a5<<=O0YKfq)6m#!I;*4I<}?Asgz@_R-7?-$LECq|PVwlS*y_`H z^3+pLojOV1Cr^z`Po0NW@$*yD@4x%*_rLQU)mY5#hy*Nn)4N8}jq0INPFJ>bR|5O2 zoz4`Ws4eF9m?fRdl^?{*^!1LOw9WbyFR$8d z;gHSxU%V^vAl5>f5e>^x%(U^|7}{$hfvH=cGNPauMWG5fQoJ;YWGAnOCViyZ94-jW zC+PVOdMAULgD*#04;z6}SULJZT04kIyFxBqy0OpTBeS!ySP#W%W=#esUZkBtxTfL{ zcw=!ziOU`TB7Lfc9cM>#g>vaO?yWtX!tM(`paGBNJl>fK$g?bVD}F$%S=-s5+As<; zkw@CFOB53!Eu)o7@@D9*L>5|;C5KD z$p&b$0h(-pCL5s1252(9K1OJ=0h&xNp@C*->z1Y^=O41`ccW&SQXz%LpVHw+-KY_wY7+-!ruBxK_?gOk@&To~nJ#5X+5>fv3--}pwZJ^qF_aO3pUtH++0J$(Ct*N?n@mh?}*xmQHg4Xn`E7)8z@LikWjpq$W6 zI!n9O#gl=;S~e-2YD}FE-Y&xE&wSz&YTz8<{}=fQaP=vYbHJnx0|}njr70jiS3nyd z2!9mOrWq?~ENxHIA&*@dG@5xa4tX2nkQcXmfnP7iAuq-uFUBD+#vw1pAuq-uFUBD+ z#vw1pAuq-uuj=VJ>p>uT`t$mmgJ^+V4ReV-%&`6H$e<+P5z~_#>ij}^<|}w^rnm20 z?GO0(YOBAuE0;^9r=-*~VeuC>3t8jB9~E6Ij$|9_r!H^LJ9uXxrS%Yu>{ zI1|rqUVmH}T0o=K^)Nm33!7;Y-e>0cXYt(i8|k5CY*E}iA>o-spu$h1s|k{|L*g@_T;|9?>Tk)FfdDfoJK4EOP>rE zPkB6vTAb_{Z7u_}(HR;&sUzeUP+q(#kt`SO3nL{Kp(q^bxfNPNq<3l1az`U)x|Va) zb68__a>a;85HR41XLPv}%aC7L=cBbhJj5fRWRzv=us_`2bRgxuuL9UCJ!u= z2bReL%jAJ&^1w2AV3|CyOdeP!4=j@hmdOLlR23I>fd0YGO zz8Q?BEiF6d>rY7$8eajN7}+!h#8ep2yoNABiyCCh$*xn>OhR6L)~W7CQY@X;%haca zu^CC=1%5{TS)M9w(FQ)~neFp)bG0Yt=3XsT@FY_8>K9NcbXL@l|2>bkgkWB}b!54@ z1vIkU&;n{MIg5?a(FU)LIBygBtEumBq}I@0NAUexYpQrV9?jt?0zk~Y);jwxsRQp| z((JNhuhwL~u%)%{O6BvZA$sdFjoQ?18YfJ&%k%n67Km5i4L!$B%p=~=o68!{9c_Ki z$z9hL!JNL0+B1CN0lbJ|jz7c)YnSjghSeJE8r5aR|I4?Gtef`sQ5cpsZqUxe28YPk zGeI`wA=9dxP2D-K3e<)Ajdfqth}n6iQ%u1-@lpY7ou;{zlEi=JGMvou--*L!uu6B;klGq1+Y zf0Oou`#$m9CfPD#KXI7$_%KLCwe^;I4v~NCdujwzX_=lJa9CWv{R0dC63b+_hp~7{ z{|inj7;x17?SHm+CGb&J*Z$s_B$I@!3|S_VWs*rUlWnriWU>xPfIt!;B!mzULf8q5 zxFI6$3ocZxOI<1|)@ohrf}+-)Rus45*1BNdYqf3_t!r(8nfL$S`wfYe{+{pYYx~+H z-1FVc4By=E-gD1A_bmT=v`mxNA9$=iC&z4x?1?g&Z8jf(aUrXVLvNdB;0$3qcB$3k z5r&*#e0NhtgLGxA_YwGh739SOagy zD|gM2KD}k8QG$D8nwC{B!Cr-6SybsLX)vk0bFB}^^Ihl8nLB;@wXOlzmEAL>?3;C- z$>bWySdILprq##UO{Sy#wKe|Z>={FoCZ4xp`t+46J33FdAZlO zc)(x7)dN5OcNw^17If}kfltQJ^Cqy+n6Zl;j!NW$r+p*rZIu^IZJR4MHSP!)OW4B^ zcvGOa{JAvTP{XFiuy|mRrRTsa16`cAdzq=BSEB3H_g$<9iq;{rCSx2Z4J60?`}m}h zM_^R$2)|OHD)>r#o`V>vKaUN!&O0zFcW?{NS1MEmk_VqZ*nYAiy@!!T`xzp2u>E`n z)qeYcv=8jRL$@E#zyxeOL1lPW6JD@EYEn-E> zJ$h@S`1w1~(Z=VEN=5jU@2d)W2lr17YX;PrIIHQxUq7d8&+@w%^Wr-r$JT%xBHfktAXB7e=!!EPZE zi*6N>SWKuBQj|TeYZwr;lu8gMe>|@Ai9ypub~?m8v(qD;$rj{><(f7$wcvL!&@dR> zIyhkf9I+NLfxA_ik9|pz7ep3&DSfEvL}GN}u!poW11!PtCR3@5f(k}u5PdAgJJ*((hlq1mIQ=1}_PQfKD37bx64yNjrvCjt{9`IPa@FX?8caip;;}zJRUe z9>J=2Rp0vgA%7`*5B<#KNtNzKtu_3tDllx@uEUY6+0eKu`0BvJ^+iQMRRuZ+p0c)f z;bNchl#ZO%rrcbJM7{5zKA412z8~TmPn3m1u}$$#0mTR@8bT8h<$@$B1KEU~PS)c> zKq~?x()k+DcxX9JRlkLxH7IQ;eJIONjz!soaw*CUDBDqXq8OIra2_n4pAwQ0M+w-t zbF9gFc1#=AnHdTLpRlVP4G^)M8mSg>M-ZM+=&^@XD~dE(ues%zhv!yRopiJ;8F+kJ zVPR=W*L^ZI_`Y;R`h9&!{#_xd3+3lGOmaBTC!?A6%F*Gk`G;lN*TeSjHN7Dm@Qb}j z!K@R_G`hE2F~E0+?oI10@+N4dbwg^o!&1u)spW>$azkplA+_9)T5d=!H>8#uQp*jg z<%ZO9Lu$DpwcJW-jm6y%^QC8R0r;BSO7C9+To#&(A)mu8_k+0IdjF~2HV|7rM}hFDX9i!Qg8pC7m6;i2dxEjwJ3kvc`^W z8COv;uQe~Xqhr&FZIkEBxqeGuU#3R}vlmx;7cE)U(13&sN_pm}eh4p`6+K-d?tzyC zQ;xCH^p;Sn(GXUKdIIJ?jb4Nu$E$cnWeVaGl=&{*d*2%62wn{*9Kh@)V*U%PeXMhV zOfkGObp6DluG1Bn+hEmU3Wh6`{RpT^D40t8)8Ankwt-Liqze!S8Fp7qR%UU@qL2EI zH<`*a?11>KI_XrT@MLAz%l%o|fr{*$SaW=iqYics`S7JFDf!6!ed$)K)m@&RhP8+N z_G9$hH?_}h?U(c9!$`N@&(i`#=mgVj{O?3?$Cs6I-#&1x135;o zVT5YLUb;OsatY$6zZ2gS88Jl^D&CCIh-cq{wYucsJ|Q8TOxFu`)Y)3kw?>^PRG`p|izo zs?5m9%C7Z09I`i})<3Y&>y>F~MO9guzM3^F>+84pvU6;z8C@$CzXD^1N*&@cmQahvYDg0grqQmC}Og$c+g1Z?rKJfjffhh_>ot9^=jb-oCt5 z#w_X&ez~}Rx%>eVt}X=>6Oy%%Q_Js#o)-fH04&^LobPgc)5veGIMg>&38b5ofFxzm z$GCFntocLRl-Zd^h=ht8t5(@&Y1tBceruc2xaddPp!dsnQ2kDA&^Y>vDl55A*`PhCnNkk+Z z$tf-7Qva4mFqRLW`fLlNt>&Ri(1s+jK^y+R9X2a?jQeaW55HJmg_fUa53VrA=To$MjOf%h3kI#kf#XJ6G9z~DZ7l5! z-v}94#py8W6MNjP{r&s;`}cwgo_{_VvDa9cMzim~dG@`YMSsR9eK+=IXg+uLYt@G= z3@-TBM2=E6XZg75H|D$LX&cjScgDY-$VjVRVoX}QCR z!iSV)8g+7Hc-O;pAG(OGcui$#qfSoXYh*uO?P^C!%aPhaa$wcU0we=xo-@kDuureA ztlws9fv!>$X^Bej@6XGKPq0KsM=t?L*#0fG@d+mRK``P4Ch%sYBj*-RO8x6g)!WzW zwJ!!=_%(YyxVmaAkM6a!AAdAohl8u3ZzZXnQ@T;qLG&2wuTwI5Z>1@o!r2 zF>>k`W4QID{+Id>%+Mo;(Th-H2mUcnM=eo2ukH7oWGW1m_eWPM55)iaiF9kx{)10+ z@EQN=(ex8>py{yUG*{Mr9nFOO0Jvj#pR75R9}4e_DdzZhB(8d&%*Yhu>BHR19_Wki zI572KCukOiTqnM+7yXa`Bh^(}Q4S-QhkJzFYr^d*R@nRB)mfsj09cKk4^L*Htl%0$ z>}Mj5vTnv#Qd}mHuMNkWwvi;K8AcMM9J%86oIF%jS?1~aqJN{wRGSI?vt~M0q+JDt zGrIB%5PJ$BY5BC7#kANOaFsf6~4W(tXjBdz+ zt*Be(5ZY`PEa@{kT&~aWO}CX7r=>~@0!-DuO8!ChMLI|SZ=oX7#z<{e_X6tp`#Xya z1yBFCJwQ8I%AuaT5D(3q)paz$^B0O5wEkm(Dm7NJa1_+_mBwql{{lB z8Frp0hLK8$OcIu6KM&hgTEjR{(?043)0{(NQ1v14gP{O_zTkDFW^zSFkZZj%I{GSX^ze{)`A4XhDd(_ zj@eSYKnDgF4mvZqqvqd~^#v9u*KNpj9WU=}0yc+s9aL8V2_^o_h38Jp&-Zw`4)mYg zl3~xzs>fj`Pd>RT%2n71Wd9;}FyhHCY#F6R>FMkv#zTDpP3j*XAuJ5ZKo4f?(;hC^NhX^Ln=6V zIYT&D95fZx!q`kR?}LM;d{sUqLSM_ zV&LwyvmzsetAyqix*3ME5_J=(Nm8$&1{sAbGZ4wXW5Gi__E$d{JoZLS=BtOiY~-UZ z(GQH4y5(M(i&NKPzHUbdD=+LnDkN-O5+xm&J{iUI2sRi(Vvc0^e@~Y$iBW&2U-R*VD zW)RbZkKzaIsuHoL&8F>GK61n=_1%0*uH@_i#-nIfV?0VcG(X;%3J2Ma-KUmWT=`l! zQBW!mI4DF1*5A z7+#BTorY^Au9ezO8-T|PJ_((H8o+`cfX6EUk5>R5uK+w=0eHLu@OTB_@e07>6@bSp z0FPGy9 z3_sEw)XR`8&d-#gOL9@T2e5&^vhbNX=sd#Sb{hfHbMSr`G>G+je6}7luRupJ=@lfL zW)pVixs*X~a_QX=?%>9UI#j&F{SOS8u()Ocr`@Y7ven`tlFpOu(UR@Qb-*K|2={wbU9 z7!xbgn_vUa%NyU2pP%cX?&k|#XY!a4Mvm0_772XSfH46B=+JVb)5}qJBB_*}>qKW! zaB?D+Bxt)LKEUcQp4s$MdD#tPr#KEt{7Lo&Iy-|YdxflIy3BG ziXL{EURh>ti!SHIN^)PKLy&hz=${(?A|J-!8gb3b~PSbUeVMD3}4>@UsWH@ zW2szITU+0-!nd}rPNtg8wR!n@dFz@SxjEUpI|>R-GS-HpSO?2JEiLBCim7I^$C)Sp zWUZ>6y`b6~)!iNG^S%-cx!kptxsGKYnsOZes?1Do!hE4G&2vq^z}PcosTRmjKWEap zP77hud7N;lPGIs`opE$^9qLs`C1&UF=wSwaSE(sQpk3CK+=#=C;xImO7@s(dPaMW4 z4&xJt@rlFu#9@5mFg|e@pE!(9TzJOEVSM7kaw8RY`IeaLOqO?R4lD)-7Kb^o7#vuP z$1YY+){g5Olp&N2DCeMDfpQbd{V2Oolt_9FkN!T2Ay->)mloWm1$SuyAGhExEx1by z?$Uz0wBRl+xJwJ}(t^9RC_ZK=Wd~&$&x~eA^7!j$BNdxxIA<8nV&cJj#3c0@kLv6i zbx<^SLir+EEdxv><<#Rwg!`asM5LMtG(px=Vv6yZ;Y{Po>2~=lwn7PX9+~pRr>v+;_jXvz6aSPGx1ht z7UPiR{yDXN#9__pt;bLAL>wyYp4jFpEG(R03huyr{#w3u4Bv6P)H_%b)p<0xU}bd+ zznCnJW+!NnY>!4s@_;Km;4TmP&jarAfV({4E)TfN1Mc#GyFB1754g(%?(&4W%LDH6 zVDK>OGcn_tc3qLU|_cgEwrnK>@ zDZ48+K0fuhp-I_wb?r+V8cT|2=O-n5Jd>vsxt;lqSB!~@YQL>H$DuYIRmH^{itHIF zDUSTq)Yw>ARiB@qcYcp2Gpnv{U}|->+g*@fI02b4#r6KOvaIdawA53c&v3hI8VU;l z0X{1s*HM~hb4gDYL0)*_yx2>XcB3Mbj_0Dqnf_L$bn zpJHOSVTpKLY4VKMD3HL$9>&KXRs*>u$${`>r}C)Tc+3yhsjyK!wCI`mtz+nvcl$dy zJB{r!PGQjcx6Tz~LRFq>IOBU_4ZCwJ>Zt}JYG__aQ6>7q`D4W6lnlOfj90ygvJ249)mCL8B|I(^Zi=`6)wZ*h^&_sihjIIy!4haNt2;3m`TnMd^Y z9>EfPpuM)Xo#nm>6uCGe+MEIe9{` zCt$KsgBZbk#Kzz@D3dEAjUL>4)6bEBZ{<*O?@jI3rfx~gFoOjdETnI%-=S_6u8lKl z6_qj4DXloO1baL`j26HiDscLufC2BTHa!2Oscw7V@y6;6#|EF7oY#4>58dEJ zIk~g5@twCeZ{G7!y16*%FzPGpfkM>-aZpKsb2;*K*fDH9eVut|H(SkE0=p5=N)r>? zE75M&Q(@6Y%ka;qHlWoq7ua?L<$@S=LPTN-N6<_)c0z1o@O0fWF9K{^Cix2{G{<&~ zJ9Wa;sx{e<=;j80_)&V(VFyb5WfktCjGBs-jTJ?KR-APl0m(jc+{&e$vMpaVkpljk zj9dP}anm)m-hOL|NdCze9>vbtMok9>FdmE?p<>^{+)x7P%YH3EqepT^o}q=azca8y z|07SmLxieKd|3&uZapS{#VwL>XjsmOP~-C=u@H24j7+~)Nt#m8GE~u0RpTvkFZ2}>eTBB3f6p^3 zrKrcVyRi1!#YQfY!%@R@1kov@^CPvPji!ot6z&1Ime^=fNW_Qu!FbHS;nRJzoS>~k znP%`G7=6MmE(46IgR^c$-AcO$_ELIP)c_sNVW@Fm{XlN+@|3*1@_~UGw|m?rl@+E3 zpEa2#q}fa|LN-C`sEClJ;vxVXL-H{5mRV44F_S#5cifb8RO2ZEcy$_A?x*=)F}1TC zNPF@x7qSFn14QX3jhm>fe02!T!HA=SIu|qmDqxIB0*aE?m;0IQh^VbwJ*V1>qyM_5 zZ@6h@kL;Vh<*d%B@dI)Gn*PO&jh5hcdEu%F6N-xi%bS|y(xqD;7#!^AIHs?%s-gZU zc%fj%0&l{ea5tVO6)NdN+^FbKO1cROAavPaE?PX)jdhx`xN+g=(PYjimfAvKhb9X= zKy4wgW2Lr3leI&WwL_D&LzA^bleI&WwL_D&LzA^blSME&$}SY{$O>>r_8q^alzj&4 zt@_$DGyyS`s?L}$X*7*W0OxrTbSx`l6NeR0bQwZruy!)K-_SwBOt5VzX71eY{b2t5 z!{%Ln&CFiQQe=^CTQfc&o0`_H4d_EdFaQ3m-ob@;A;EP1{2%iG=>sQqv|q^MLOahf zna=O*WbcihKyauN2qYupWe`z>g`$%@rG-2BrVxd;e_r!(fG_k0>l`ZgsiMy|IlA0~-TP_4OyNsH;opjV{Qa z&{3HGUZA(MBsZ_>u+q}WQ_ebNGGK3(wdUpds%K(~t5N;H^jow(6;t5Oug-}ygYn3a zF~)xOP;-JzY17)N1M|WWo)-?x3kT+f1M|XxdEvmkaA00IFfSaK7Y@t|2j+zX^TL67 z;ZXB}-vGUm7AHL)h`|~OJ%v5<)%jq|gJJL-&I87&g;4|*P+(rv))_Iatt;2JwzRe$ zvn~*bp3&cbTTxNR)F>Pz1>a*HX&S=r=}>=68T7$~!{3=~a!X z>0B1GvAT`?`Z30Q7=xw^8%}gn%)9mOg3Y2ODH1E3%2HSB0~64cok*qpFhH9-c5ERG zLFh_|jEah$g2NQ#_FaRmt@RCSgRkzBN36w)VCs3O0f*Hf7pTY7({rUPLqbrscjW@V zAF1s-??aqIw{q+>;(v3d%)sQl9Q(LrbmL>(+Juorxi(rh6*Gt>kr@!@=1q=SN;EbEQmLDg#?q0e|b_VY;JrjIMmL51~V{-#~ zM8$T~qhUd3*wGGZxZDNuM7L<@t^EFI$}$U&A$7V6s?FE6E|oD$WX#gm;3uCQf6qO% zbllS==Wun#Ek|*Lu+d3Z9T$*r~{4S2rn?`YjMsb9cZRLNP%W>ITCey%qufKlYfXV!(X{sHD<_8ZvYHCKB zbfx{k-Pos-&qi^Clva@rts)&-MLM*KbZ8Yg@D*hUWdq7NC|97|gmOR1E)<2^J9oNMX@iH% z1}~%yUPv3fkT!TBZSX?c;Dxlo3u%KF(gyZ`I{Y#!zej-=lJ)@|&7#j}(VMP#>^6*( z&<%$pc86(B&xrU%e~oG4Ktg-_*<1SO^v=BQ?8%ek2BMest!-#*ZeBCf?|=8mNo{h$ zf}4Iiv_b~PukGlaHvPgAyJl2Y(sRSO<|?)0`Jd*qeEgQF;7x!`b#)!Mn0Fe*P#VQh za$3#RvhwzI?|#1FzWX+O{_Z+?le7kJ4*pO&gKx-XvX5)Z-x)*cU(JVsHQ79h38ive zh=r%ZLH}7Wp{OtYd&Gs0Vn_XZU`LJmOku(r^_d>@nTB_Sqex<-NMdPzY+m^r4$c@w z5*tMl8$}WuMG_lD66mj zujF}!bHT!Xr>K(g<2N4P-2BgjBsLnQ+tG38DBV$nHO7yRBCJ6UmeEE9S*Wuv&?)$P z6k%-?VND0hhVyis;EGX%wNZq%L4+9?N2?eW4IZa;DCUKZBCM&n#8HH`QG~U>?g5pJ z7|zfbi7oey5!OcYt5nk8zifWhD1zQMLC_mLOMU&BQawTi5bI4OsLJs z_aX)i`zi_%m}yQQQp(IDP&^)5vc!|_bf(+#^LJh;PY#}Hs>n~bIh{5e@;XCrAx zMP%E#M)b@`tdp(t=ACTx($9>mDQZW!qfFrn#vZ5snu)K=6N>&SuQSic>(obp=$w6K zVdkM2d7a<-Od_2RUp6wYlLw^bfDcA~{a5ok^<0WGni6J3HY;*B^9FTZr_THL>i9*+mX$6HiEaIV-Rw=){ALs&})D-k14zx3;o1&1RrgA#R7);DWRI8Cd$yBun zqfcom2uHUNRgjQoOsGuKIi0D&=xF_Q3xkTZn0_4+<~hvd(`BOap!IM zUQ6ks%dQ@ndt$I5+E;PuDefk@Z0qt>&+J*$I&)ldSK+Ev%N~_O?Muu{Cb88{v>NBE zBj-7rt!9fIMyrV$Oh_O?eNaa8R8E3&rsHq&nT@R;hgRE-R`bNa7_47xHP7$Xt%jXi zH#MOQm^z$Mk9K z8yA(=XC)-o=U2F=w%>MdM8FH#%y|A?K+j0T_vP|D_B^!8iNYyNcBHtY)r5UbEF>bE zC^3lFG7dfo*4u1jnq{l0r9n6%6n|?`pM)o|hAr=Oc42A7>6Ac$g6k_X*8m6kYR-qr z8(-Xb^wA9^@p5;tETS%O_==V$IdIp)!G#O&ymj%CC5zvmSJyqGeqQgX6FMfh;(5a3 zpr6O3+NF7c?czD5>{SBzB^gT)+ZFENFq)a=Ywa?{G`1XzP6l1y+&CEFa7~%w%8if( z!QVt@7qzw)WlQsh_G#1Gk2|h?`t&J_r+WN;&(!v&f~qQlNrw)E-j(}IuLCJ%HriAG zj$u0pOp;{e$tR)iKq4+*Cx%44(VukeZ~*A!;Y@X)9)&tzCypm&uflf*WWU+zs`mP7 z(x8@%t*%K;vv?#rx7q?;2OejlOa(%l+*f-4&g?34zS-=m%6xKgMXEQgvv*C_^$C~7 zMnsrTO*|^&+_Q48xHC@1d9B%A3n1T<%*#EFvRM(4zxJBO<)>M_@-eIVbWHSAu>Le; z&!_P$;NjePt)DPIo{IowYNBzq5)X$bDx^^!;7JKH!AUW0H%7sk;!m-t0wgS-A7wl+ zsB%qHKUjyK1xMmXeqi#OHr>3eXKDAcnM>cjbYb@*{_Y1J+rgh{VvBf7rpobhrd%yg zF*!_=O?%8Yo8OLD99aXJ}tW9chp(Pc-KT~_vz=LF9!o;S-Umfu-nt+=$( zQh8xjPjyuFkE$Q@7JF~=?(;q3+gG!u=9-${`kVagYm;i5Yj3T6zAm=zmHLSKw)zJe z@*8e!%x(NhQ&!XMfr3DLU`=4h_{i~9Fn+O>*tird1B7nbGzog zaG2w;x8^zKT{Q0(^P}c3n!jbhH?VZz;|22@4Rj^ck|FVg_^DVU7Kznju{c~@jq|g&inVz6 zX>p`jiu2Y#7e|Sw#P`H6#X9jUwD9M|dhs4Kp=IJlaXe1i*dU%48^!J7M6q1_QCujl z6~7WMiIb4bb&6OaP8EL;ABeq>bVoyDzgOHX?orA|6uv<~P!Re&8f)CU;$zf5L-|5H zDV`C>KstN~HEI>cz>HV_p+7Q0948}Xl(MF#3Q!Vc;XnV~Pi=UJe6A{*2x zazOJz{{+r=fEJ2eP?yL9bz?356J|nw=nKq-0?-mgOGP2-Wx^Hu9J9j>S}uw}D?~A9 zCF}v8W44rpKEsSD1@%Hl`3y7116l*^@Kem73eZ|n30kLUy{JOHK~#r6!L0IvHUZ7| z6U?p}(DA|_`WUl}v_;f{wu(B?38FsqN6fkg&`H20|08B!6X;|`r-(r4Bh19{pdF$a zv{STzP8F@84>2<*fKFGmOH4$4hL{A}E!skRFs==sZQ|iy5d7i0;t)nBhI3gJLG=LeUGl2pMGWW9H5Zy@#3J z2f9?u23;olL6?g;p?5J0=YkH2!$4Omx=PGLeYKb$dIxiV0Q7LN0CcSw1U*75484un zPkNMC1bVbs40?=M0=iBt4gDT+U>WFou^jX`MK_2Q*y$fHhCnxpm7phxRiGz|)u1Pd zHK8{lcSuhWhl8Ff)`FfUjtKouoGy+8JwqG?dZsuUbQ9=rA+L@BJzJ~;Jx3f1dahUx zx>+0-`cKHD4WQ>KdcHUw^$Wzt(0@RJod9~FI1%(BaT4go;$+ZEKz}2CAWi|jRGbQW znK%vfa&da-4Q$uW0R5pj6ZA?&w}?%sUnR~8?SWi88}u4+4(L{KF6gylbLe%*RnqIk z_dtIv&I7$(oDX_~xFGbJ_=)&F=#An+(3`|Xpf`iQDsB-MgWf7G0liK90Q9HgQqbGQ zWuaHZ9pZA(I~Bc4T!H#F@x#!sAv>=Gy+>>T-7c;Iy;ocfdLQVou+6*%^k-r#=mX+f z&Uz z^ht3m=q_68C}rTHGJ{rFcdB4D?m;0O)JtLD1JhpA&n;L!fVnhe3ZM9s&Ii@hIqj zipN6Fir_%-N0@k;0kv0uCjdO*Ae8dNkSUJvd3FZ Date: Tue, 29 Nov 2022 12:35:38 +0100 Subject: [PATCH 0799/1620] New translations Messages_es.properties (Portuguese) --- .../earth/app/view/Messages_pt.properties | 482 +++++++++--------- 1 file changed, 254 insertions(+), 228 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index f759c433b0..efdb0acb96 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,228 +1,254 @@ -AboutDialog.19=कोई समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ -AboutDialog.5=अधिक जानकारी के लिठहमारी वेबसाइट पर जाà¤à¤‚ OpenForis.org -AboutDialog.6=कà¥à¤·à¤®à¤¾ करें, à¤à¤• समसà¥à¤¯à¤¾ आपके सिसà¥à¤Ÿà¤® के मानक बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में इस लिंक को खोलने की कोशिश कर रही है. -AboutDialog.8=ठीक -AspectCode.0=उतà¥à¤¤à¤° दिशा -AspectCode.1=उतà¥à¤¤à¤°-पूरà¥à¤µ दिशा -AspectCode.2=पूरà¥à¤µ दिशा -AspectCode.3=दकà¥à¤·à¤¿à¤£-पूरà¥à¤µ दिशा -AspectCode.4=दकà¥à¤·à¤¿à¤£ दिशा -AspectCode.5=दकà¥à¤·à¤¿à¤£-पशà¥à¤šà¤¿à¤® दिशा -AspectCode.6=पशà¥à¤šà¤¿à¤® दिशा -AspectCode.7=उतà¥à¤¤à¤°-पशà¥à¤šà¤¿à¤® दिशा -CollectEarthWindow.0=तà¥à¤°à¥à¤Ÿà¤¿ जब सीà¤à¤¸à¤µà¥€ फ़ाइल में डेटा निरà¥à¤¯à¤¾à¤¤ करने का पà¥à¤°à¤¯à¤¾à¤¸ -CollectEarthWindow.1=निरà¥à¤¯à¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.10=फ़ाइल -CollectEarthWindow.11=बाहर जाà¤à¤‚ -CollectEarthWindow.12=उपकरण -CollectEarthWindow.13=डेटा सीà¤à¤¸à¤µà¥€ निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.14=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ -CollectEarthWindow.15=गà¥à¤£ -CollectEarthWindow.16=मदद -CollectEarthWindow.17=असà¥à¤µà¥€à¤•रण -CollectEarthWindow.18=डेटाबेस में लापता भूखंडों खोजें -CollectEarthWindow.19=पृथà¥à¤µà¥€ इकटà¥à¤ à¤¾ -CollectEarthWindow.2=भाषा -CollectEarthWindow.20=डà¥à¤ªà¥à¤²à¤¿à¤•ेट रिकॉरà¥à¤¡ की संखà¥à¤¯à¤¾\: -CollectEarthWindow.21=मà¥à¤–à¥à¤¯ फà¥à¤°à¥‡à¤® के लिठआइकन नहीं मिल सकता है -CollectEarthWindow.22=आपको लगता है कि आप à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ बंद करना चाहते हैं? विंडोज बंद करने से, à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° बंद हो जाà¤à¤—ा -CollectEarthWindow.23=पà¥à¤·à¥à¤Ÿà¤¿ की जरूरत है -CollectEarthWindow.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.25=आप वैसे भी इन अभिलेखों को जोड़ना चाहते हैं और अपने वरà¥à¤¤à¤®à¤¾à¤¨ डेटा खोने के लिठकिलक करना चाहते हैं? -CollectEarthWindow.26=ऑपरेटर,पà¥à¤°à¤šà¤¾à¤²à¤• -CollectEarthWindow.27=अदà¥à¤¯à¤¤à¤¨ -CollectEarthWindow.28= औपन फौरिस à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° चल रहा होना चाहिठ, जबभी ऑपरेटर डेटा की वà¥à¤¯à¤¾à¤–à¥à¤¯à¤¾ करें . -CollectEarthWindow.29=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. -CollectEarthWindow.3= आयात संबंधी तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.30=जबभी आप गà¥à¤—ल अरà¥à¤¥ का उपयोग कर रहे हैं, कृपया इस विंडोज को खà¥à¤²à¥€ बनाठरखें. -CollectEarthWindow.31=à¤à¤•तà¥à¤° डेटा सीà¤à¤¸à¤µà¥€ फाइल में भेजें -CollectEarthWindow.32=छोड़ना -CollectEarthWindow.33=ऑपरेटर का नाम के 5 अकà¥à¤·à¤° से बड़ा और 50 अकà¥à¤·à¤° से कम होना चाहिठ-CollectEarthWindow.34=मानà¥à¤¯à¤¤à¤¾ तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.35=ऑपरेटर नाम खाली\!
कृपया ऑपरेटर का नाम भरें और "अदà¥à¤¯à¤¤à¤¨" बटन दबाà¤à¤. -CollectEarthWindow.36=ऑपरेटर नाम रिकà¥à¤¤ नहीं हो सकता -CollectEarthWindow.37=खà¥à¤²à¤¾ रखो -CollectEarthWindow.38=सीà¤à¤¸à¤µà¥€ फ़ाइल -CollectEarthWindow.39=सूचना\: यह सलाह दी जाती है कि आप नठडेटा डालने करने से पहले अपने मौजूदा आंकडों को बैकअप(à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤) कर लें -CollectEarthWindow.4=à¤à¤«à¤à¤“ असà¥à¤µà¥€à¤•रण नोटिस -CollectEarthWindow.40=उस फ़ोलà¥à¤¡à¤° पर जाà¤à¤‚ जहां साà¤à¤•ॠसरà¥à¤µà¤° में सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ किया गया है, फ़ोलà¥à¤¡à¤° का रासà¥à¤¤à¤¾ उपकरण> गà¥à¤£> उनà¥à¤¨à¤¤ टैब. -CollectEarthWindow.41=निरà¥à¤¯à¤¾à¤¤ डेटा को फ़ाइल में बचाया जा रहा है \: -CollectEarthWindow.42=छोड़ना -CollectEarthWindow.43=परसà¥à¤ªà¤° विरोधी रिकॉरà¥à¤¡ पाया -CollectEarthWindow.44=डेटा आयात / निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.45=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ डेटा (संकà¥à¤šà¤¿à¤¤) -CollectEarthWindow.46=ज़िप से नठडेटा आयात करें (संकà¥à¤šà¤¿à¤¤ à¤à¤•à¥à¤¸à¤à¤®à¤à¤²) -CollectEarthWindow.55=सीà¤à¤¸à¤µà¥€ का उपयोग कर मौजूदा रिकॉरà¥à¤¡ को अपडेट करें -CollectEarthWindow.47=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. -CollectEarthWindow.48=ज़िप / à¤à¤•तà¥à¤°-डेटा फ़ाइल -CollectEarthWindow.49=फà¥à¤¯à¥‚जन सीà¤à¤¸à¤µà¥€ फ़ाइल -CollectEarthWindow.5=बंद करे -CollectEarthWindow.50= उपयोगकरà¥à¤¤à¤¾ मैनà¥à¤…ल खोलें -CollectEarthWindow.51=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ के अदà¥à¤¯à¤¤à¤¨ के लिठजाà¤à¤š करें -CollectEarthWindow.52= अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— लॉग फ़ाइल खोलें -CollectEarthWindow.53=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ लॉग फ़ाइल -CollectEarthWindow.54=केà¤à¤®à¤à¤² से लोड अंक -CollectEarthWindow.56=के विषय में... -CollectEarthWindow.57=साà¤à¤•ॠसà¥à¤Ÿà¤¾à¤°à¥à¤Ÿà¤° पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ अभी भी चल रहा है, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें. -CollectEarthWindow.58=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ नहीं कर सकते -CollectEarthWindow.59=आप साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ के लिठडेटा सेट फिर से उतà¥à¤ªà¤¨à¥à¤¨ करने के लिठकरना चाहते हैं?
यह पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ समय लेने वाली हो सकती है.
आप यदि "हाà¤"पर कà¥à¤²à¤¿à¤• करें, तो नवीनतम जानकारी के साथ à¤à¤• नया डाटासेट उतà¥à¤ªà¤¨à¥à¤¨ हो जाà¤à¤—ा. -CollectEarthWindow.6=फà¥à¤¯à¥‚जन टेबल के लिठनिरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.60=साà¤à¤•ॠडेटा उतà¥à¤ªà¤¨à¥à¤¨ -CollectEarthWindow.61=डेटा à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ (पिछले निरà¥à¤¯à¤¾à¤¤ के बाद से संशोधित रिकॉरà¥à¤¡) -CollectEarthWindow.62=के विषय मे... -CollectEarthWindow.63=केà¤à¤®à¤à¤² से अंक पà¥à¤°à¤¾à¤ªà¥à¤¤ करने में तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.64=तकनीकी सहायता -CollectEarthWindow.7=डेटा आयात में तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.8=असà¥à¤µà¥€à¤•रण पाठ नहीं पाया जा सका -CollectEarthWindow.9=डेटा आयात रिकॉरà¥à¤¡ वह है जो कि पहले से ही अपने डेटाबेस पर मौजूद हैं शामिल. -DynamicsCode.0=पà¥à¤°à¤¾à¤°à¤‚भ में वन -DynamicsCode.1=पà¥à¤°à¤¾à¤°à¤‚भ में घास का मैदान, -DynamicsCode.2=पà¥à¤°à¤¾à¤°à¤‚भ में आबादी वाला इलाका -DynamicsCode.3=पà¥à¤°à¤¾à¤°à¤‚भ में बंजर -DynamicsCode.4=पà¥à¤°à¤¾à¤°à¤‚भ में आरà¥à¤¦à¥à¤° भूमि -DynamicsCode.5=पà¥à¤°à¤¾à¤°à¤‚भ में खेत -OpenTextFileListener.0=इस पाठ का फ़ाइल नहीं मिला \: -OptionWizard.0= विकलà¥à¤ª -OptionWizard.1=बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° चà¥à¤¨à¥‡à¤‚ -OptionWizard.10=बैकअप फ़ोलà¥à¤¡à¤° खोलें -OptionWizard.11=अजà¥à¤žà¤¾à¤¤\: उपयोग ifconfig -OptionWizard.12=गà¥à¤°à¤¾à¤¹à¤•ों का उलà¥à¤²à¥‡à¤– -OptionWizard.13=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° आईपी -OptionWizard.14=कतà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ (उदाहरण- 8023) -OptionWizard.15=बचाà¤à¤‚ और परिवरà¥à¤¤à¤¨ लागू करें -OptionWizard.16=आईडी -OptionWizard.17=X- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क -OptionWizard.18=Y- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क -OptionWizard.19=उठान -OptionWizard.2=कारà¥à¤¯à¤ªà¥à¤°à¤µà¤¾à¤¹ (सरà¥à¤µà¤° / गà¥à¤°à¤¾à¤¹à¤•) -OptionWizard.20=गूगल अरà¥à¤¥ अंतरà¥à¤µà¤¸à¥à¤¤à¥ बदल दिया गया है
यदि गà¥à¤—ल अरà¥à¤¥ आप से कहे,अंतरà¥à¤µà¤¸à¥à¤¤à¥ पà¥à¤¨à¤ƒ लोड सà¥à¤µà¥€à¤•ार करें . -OptionWizard.21=अदà¥à¤¯à¤¤à¤¨ सफल -OptionWizard.22=ढाल -OptionWizard.23=गूगल अरà¥à¤¥ डेटा को फिर से खोलने में कोई तà¥à¤°à¥à¤Ÿà¤¿ थी -OptionWizard.24=रदà¥à¤¦ करना -OptionWizard.25=ऑपरेशन मोड -OptionWizard.26=डीबी होसà¥à¤Ÿ -OptionWizard.27=यह à¤à¤• मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ साà¤à¤•ॠफ़ोलà¥à¤¡à¤° नहीं है ( सà¥à¤Ÿà¤¾à¤°à¥à¤Ÿ-साà¤à¤•à¥.batफ़ाइल मौजूद नहीं है) -OptionWizard.28=साà¤à¤•ॠसरà¥à¤µà¤° मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ नहीं -OptionWizard.29=डीबी पोरà¥à¤Ÿ -OptionWizard.3=सरà¥à¤µà¤° आवृतà¥à¤¤à¤¿ -OptionWizard.30=à¤à¤¸à¤•à¥à¤¯à¥ लाइट विकलà¥à¤ª -OptionWizard.31=सेमà¥à¤ªà¤² डेटा -OptionWizard.32=पà¥à¤²à¥‰à¤Ÿ लेआउट -OptionWizard.33=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ परिभाषा -OptionWizard.34=विकसित -OptionWizard.35=सेमà¥à¤ªà¤² अंक की संखà¥à¤¯à¤¾ -OptionWizard.36=सेमà¥à¤ªà¤² बिंदॠके बीच दूरी (मीटर में) -OptionWizard.37=भूखंड की सीमा के साथ मारà¥à¤œà¤¿à¤¨ (मीटर मे) -OptionWizard.38=सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सही ढंग से पढ़ा नहीं जा सकता.
इस फ़ाइल में à¤à¤• अलà¥à¤ªà¤µà¤¿à¤°à¤¾à¤® से अलग मूलà¥à¤¯à¥‹à¤‚ की उमà¥à¤®à¥€à¤¦ है \:
-OptionWizard.39=आईडी, वाई समनà¥à¤µà¤¯, à¤à¤•à¥à¤¸ समनà¥à¤µà¤¯, ऊंचाई, ढाल, पहलू -OptionWizard.4=वरà¥à¤¤à¤®à¤¾à¤¨ कंपà¥à¤¯à¥‚टर आईपी \: -OptionWizard.40=परियोजनाà¤à¤‚ -OptionWizard.41=à¤à¤• नई परियोजना फ़ाइल लोड करें -OptionWizard.42=सीà¤à¤¸à¤µà¥€ पाठक को बंद करते समय तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.43=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ का नाम -OptionWizard.44= सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ बैकअप डेटाबेस -OptionWizard.45=ओपन पृथà¥à¤µà¥€ इंजन ने पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° में जूम किया -OptionWizard.46=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठपृथà¥à¤µà¥€ इंजन टाइमलैपà¥à¤¸ खोलें -OptionWizard.47=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठबिंग मैपà¥à¤¸ खोलें -OptionWizard.48=बजाय गूगल अरà¥à¤¥ के फॉरà¥à¤® à¤à¤• बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° पर खोलें (लिनकà¥à¤¸ के लिठसिफारिश) -OptionWizard.49=भूखंड डेटा के साथ सीईडी / सीà¤à¤¸à¤µà¥€ फाइल भेजने के लिठपथ -OptionWizard.5=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ\: -OptionWizard.50=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.51=परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.52=केवल निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क के साथ सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल -OptionWizard.53=चौकोर -OptionWizard.54=केनà¥à¤¦à¥à¤°à¥€à¤¯ बिनà¥à¤¦à¥ -OptionWizard.55=परियोजना फ़ोलà¥à¤¡à¤° आयात तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.56=लोड परियोजना -OptionWizard.57=पहले से लोड परियोजना -OptionWizard.58= जी ई ई का मैदान खोलें (विशà¥à¤µà¤¸à¤¨à¥€à¤¯ जांचकरà¥à¤¤à¤¾ के उपयोग की आवशà¥à¤¯à¤•ता है) -OptionWizard.59=यहां भूखंड पर केंदà¥à¤°à¤¿à¤¤ मैपà¥à¤¸ खोलें -OptionWizard.6=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² डीबी मापदंड -OptionWizard.65=साà¤à¤•à¥à¤«à¤¼à¥‹à¤²à¥à¤¡à¤° का पथ -OptionWizard.66=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.67=फ़ायरफ़ॉकà¥à¤¸ निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ -OptionWizard.68=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.7=उपयोगकरà¥à¤¤à¤¾ नाम -OptionWizard.70=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों -OptionWizard.72=बाइनरी फ़ाइलें -OptionWizard.73=कà¥à¤°à¥‹à¤® निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ -OptionWizard.74=बà¥à¤°à¤¾à¤‰à¤œ -OptionWizard.76=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों -OptionWizard.78=बाइनरी फ़ाइलें -OptionWizard.79=केà¤à¤®à¤à¤² फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ के लिठपथ -OptionWizard.8=पासवरà¥à¤¡ -OptionWizard.80=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.82=फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ -OptionWizard.83=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ पà¥à¤°à¤ªà¤¤à¥à¤° डिज़ाइन करने के लिठपथ -OptionWizard.84=बà¥à¤°à¤¾à¤‰à¤œ..... -OptionWizard.86=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² वेब पेज -OptionWizard.87=पथ आइडीà¤à¤® परिभाषा के साथ à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठ-OptionWizard.88=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.9=डीबी नाम -OptionWizard.90=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² आइडीà¤à¤® परिभाषा -OptionWizard.91=सरà¥à¤µà¤° (पà¥à¤°à¤¬à¤‚धक संसà¥à¤•रण या खड़े अकेले का उपयोग करें) -OptionWizard.92=कà¥à¤²à¤¾à¤‡à¤‚ट (ऑपरेटर / सरà¥à¤µà¤° से जà¥à¤¡à¤¼à¥‡) -OptionWizard.93=सकà¥à¤¯à¥‚à¤à¤²à¤¾à¤‡à¤Ÿ (à¤à¤‚बेडेड / à¤à¤•ल फाइल आधारित) -OptionWizard.94=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² -OptionWizard.95=सेमà¥à¤ªà¤² डॉटà¥à¤¸ के साइड (मीटर में) -SaikuAnalysisListener.0=हाठ- ताज़ा साà¤à¤•ॠडेटा (लंबी पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾) -SaikuAnalysisListener.1=नहीं - बस साà¤à¤•ॠशà¥à¤°à¥‚ -SaikuStarter.1=साà¤à¤•ॠशà¥à¤°à¥‚ -SaikuStarter.2= साà¤à¤•ॠशà¥à¤°à¥‚ कà¥à¤› मिनट लग सकते हैं, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें\! -SaveEarthDataServlet.0=खाली अनà¥à¤°à¥‹à¤§ -SaveEarthDataServlet.1= डेटाबेस में डेटा बचाते समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ है -SaveEarthDataServlet.2=डेटा बचाया था -SlopeCode.0=समतल (0-5) -EarthApp.11=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ पहले से ही चल रहा है -EarthApp.21=à¤à¤• सीà¤à¤¸à¤µà¥€ / सीईडी के रूप में भूखंडों की गà¥à¤°à¤¿à¤¡ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
-EarthApp.23=कोई सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सेट-अप नहीं किया गया है \:

-EarthApp.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² परिभाषा के साथ फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है \:
-EarthApp.26=कोई à¤à¤•à¥à¤¸à¤à¤®à¤à¤² फ़ाइल परिभाषा सेट अप नहीं किया गया है \:

-EarthApp.27=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ रूप से यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
-EarthApp.29=कोई à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ फ़ाइल सेट-अप नहीं किया गया है \:

-EarthApp.3=मà¥à¤à¥‡ बाद में याद दिलाना -EarthApp.30=उपकरण> गà¥à¤£ मेनू में फ़ाइल सà¥à¤¥à¤¾à¤¨ को ठीक करें . -EarthApp.4=अभी अदà¥à¤¯à¤¤à¤¨ करें -EarthApp.5=मà¥à¤à¥‡ दà¥à¤¬à¤¾à¤°à¤¾ याद मत दिलाना -EarthApp.57=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ का à¤à¤• नया संसà¥à¤•रण उपलबà¥à¤§ है\!
आप कैसे आगे बढ़ना चाहते हैं? -EarthApp.58=अदà¥à¤¯à¤¤à¤¨ चेतावनी -EarthApp.59= परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ -EarthApp.6=\ - संसà¥à¤•रण -EarthApp.61=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ फाइल खà¥à¤² नहीं सकती .
कृपया सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करें कि गूगल अरà¥à¤¥ सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ है. -EarthSurveyService.9=आवशà¥à¤¯à¤• कà¥à¤·à¥‡à¤¤à¥à¤° -ExportActionListener.1= तारीख चूनें जबसे रिकॉरà¥à¤¡ निरà¥à¤¯à¤¾à¤¤ करने है -ExportDialogProcessMonitor.0=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... -ExportDialogProcessMonitor.1=पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ पà¥à¤°à¤¾à¤°à¤‚भ करने के लिठपà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ कर रहा है \: -ExportDialogProcessMonitor.4=निरà¥à¤¯à¤¾à¤¤ रिकॉरà¥à¤¡\: -ImportProcessMonitorDialog.0=आयातित रिकॉरà¥à¤¡ \: -ImportActionListener.0=कà¥à¤¯à¤¾ उन भूखंडों के लिठडेटा जो कि पूरी तरह से भरे नहीं गठ,आयातित किया जाना चाहिà¤? -ImportActionListener.2=आप कà¥à¤²à¤¿à¤• करें, नहींतो केवल डेटा "हरी" राजà¥à¤¯ में भूखंडों से ,जिसमें सभी डेटा यà¥à¤•à¥à¤¤ है , आयात किया जाà¤à¤—ा। -ImportDialogProcessMonitor.0=\ गणना -ImportDialogProcessMonitor.11=रिकॉरà¥à¤¡ की पà¥à¤°à¤¾à¤°à¤‚भिक संखà¥à¤¯à¤¾ \: -ImportDialogProcessMonitor.2=रिकॉरà¥à¤¡ आयात... -ImportDialogProcessMonitor.5=आयातित रिकॉरà¥à¤¡ की वासà¥à¤¤à¤µà¤¿à¤• संखà¥à¤¯à¤¾ \: -ImportDialogProcessMonitor.8=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... -InfiniteProgressMonitor.0=रदà¥à¤¦ ऑपरेशन -JFileChooserExistsAware.0=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ परियोजना फ़ाइल -KmlImportService.13=पà¥à¤²à¥‰à¤Ÿ सà¥à¤¥à¤¾à¤¨à¥‹à¤‚ को बचाने के लिठà¤à¤• सीà¤à¤¸à¤µà¥€ फ़ाइल का चयन करें -MissingPlotsListener.0=तà¥à¤°à¥à¤Ÿà¤¿ उन भूखंडों के बारे में जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ करने के लिठजो डेटाबेस पर मौजूद नहीं -MissingPlotsListener.1=गà¥à¤® भूखंड -MissingPlotsListener.10=सेमà¥à¤ªà¤² डिजाइन में भूखंडों की कà¥à¤² संखà¥à¤¯à¤¾ \: -MissingPlotsListener.12=गà¥à¤® भूखंडों की संखà¥à¤¯à¤¾ \: -MissingPlotsListener.14=सभी भूखंडों भर रहे हैं\! -MissingPlotsListener.2=कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ अंतरà¥à¤µà¤¸à¥à¤¤à¥ की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ -MissingPlotsListener.3=भूखंड की जानकारी वाले फ़ाइलें चà¥à¤¨à¥‡à¤‚ ( .सीà¤à¤¸à¤µà¥€ या .सीईडी फ़ाइलें ) जिसके लिठआप जानना चाहते हैं तो सभी डेटा भर दिया गया है चाहता हूà¤. -MissingPlotsListener.4=गà¥à¤® भूखंड- जानकारी -MissingPlotsListener.5=फ़ाइल से \: -MissingPlotsListener.6=सीà¤à¤¡à¥€ फ़ाइल में निरà¥à¤¯à¤¾à¤¤ करें -ProcessMonitorDialog.1=पंकà¥à¤¤à¤¿ संखà¥à¤¯à¤¾ पर तà¥à¤°à¥à¤Ÿà¤¿ -ProcessMonitorDialog.4=, कॉलम -ProcessMonitorDialog.5=\ --मूलà¥à¤¯ -YES= हां -YES_TO_ALL=सब को हां -NO=नहीं -NO_TO_ALL=सभी को नहीं - - - +AboutDialog.19=Problemas al abrir +AboutDialog.5=Para mas informacion visite nuestra web OpenForis.org +AboutDialog.6=Lo sentimos, hemos tenido un problema al intentar abrir el link en su navegador standard. +AboutDialog.8=Ok +AspectCode.0=Norte +AspectCode.1=Noreste +AspectCode.2=Este +AspectCode.3=Sureste +AspectCode.4=Sur +AspectCode.5=Suroeste +AspectCode.6=Oeste +AspectCode.7=Noroeste +CollectEarthMenu.0=Importar archivo CEP +CollectEarthMenu.2=Utilidades +CollectEarthMenu.3=Dividir archivos de parcelas CSV grandes +CollectEarthMenu.4=Exportar datos a XML (desde una fecha especifica hasta este momento) +CollectEarthMenu.5=Exportar a Collect Backup +CollectEarthMenu.6=Exportar datos como Collect Backup (todos los datos) +CollectEarthMenu.7=Exportar datos como Collect Backup (filtrar por atributo ) +CollectEarthWindow.0=Error al intentar exportar los datos a un archivo CSV +CollectEarthWindow.10=Archivo +CollectEarthWindow.11=Cerrar +CollectEarthWindow.12=Herramientas +CollectEarthWindow.13=Descargar datos a CSV (Excel) +CollectEarthWindow.14=Comenzar análisis con Saiku +CollectEarthWindow.15=Propiedades +CollectEarthWindow.16=Ayuda +CollectEarthWindow.17=Declaración +CollectEarthWindow.18=Encontrar parcelas ausentes de la Base de Datos +CollectEarthWindow.19=Collect Earth +CollectEarthWindow.1=Error al exportar +CollectEarthWindow.20=Número de registros repetidos\: +CollectEarthWindow.21=No se pudo encontrar el icono de la ventana principal +CollectEarthWindow.22=¿Seguro que quieres cerrar Collect Earth?
El servidor de Collect Earth terminara al cerrar la ventana +CollectEarthWindow.23=Necesita confirmación +CollectEarthWindow.24=Exportar a XML +CollectEarthWindow.25=¿Quiere importar estos registros de todas formas y perder sus datos actuales? +CollectEarthWindow.26=Operador +CollectEarthWindow.27=Actualizar +CollectEarthWindow.28=El servidor Open Foris Collect Earth debe estar en funcionamiento mientras el operador esta realizando su trabajo. +CollectEarthWindow.29=El servidor Saiku no ha sido configurado. +CollectEarthWindow.2=Idioma +CollectEarthWindow.30=Por favor, mantenga esta ventana abierta mientras este utilizando Google Earth. +CollectEarthWindow.31=Exportar los datos como archivos CSV +CollectEarthWindow.32=Salir +CollectEarthWindow.33=El nombre del operador ha de ser mas largo que cinco caracteres y mas corto que 50 +CollectEarthWindow.34=Error de validación +CollectEarthWindow.35=\!NOMBRE DEL OPERADOR VACIO\!
Rellene el campo del nombre del operador y presione el botón de "Actualizar". +CollectEarthWindow.36=El nombre del operador no puede estar vacío +CollectEarthWindow.37=Conservar abierto +CollectEarthWindow.38=Archivos CSV +CollectEarthWindow.39=ATENCION\: Recomendamos que guarde una copia de seguridad de sus datos actuales (expórtelos a XML) antes de importar los nuevos datos. +CollectEarthWindow.3=\ Error al importar datos +CollectEarthWindow.40=Configure la ruta a la carpeta donde el servidor Saiku ha sido instalado en Herramientas->Propiedades->Avanzadas. +CollectEarthWindow.41=Guardando los datos en el archivo\: +CollectEarthWindow.42=Terminar +CollectEarthWindow.43=Detectados registros repetidos +CollectEarthWindow.44=Importar/Exportar datos +CollectEarthWindow.45=Exportar datos en XML (comprimidos) +CollectEarthWindow.46=Importar nuevos datos desde ZIP (XML comprimidos) +CollectEarthWindow.47=Servidor Saiku no configurado +CollectEarthWindow.48=Archivos zip/collect-data +CollectEarthWindow.49=Archivos Fusion CSV +CollectEarthWindow.4=Exención de responsabilidad de FAO +CollectEarthWindow.50=Abrir Manual de Usuario +CollectEarthWindow.51=Comprobar si hay actualizaciones de Collect Earth +CollectEarthWindow.52=Abrir el archivo de registo de la aplicacion +CollectEarthWindow.53=Archivo de registro de Collect Earth +CollectEarthWindow.54=Cargar puntos desde KML +CollectEarthWindow.55=Actualizar datos ya registrados desde CSV +CollectEarthWindow.56=Mas informacion... +CollectEarthWindow.57=El proceso para comenzar Saiku esta ejecutandose todavia, espere unos minutos. +CollectEarthWindow.58=No se pudo iniciar el analisis con Saiku +CollectEarthWindow.59=¿Quiere volver a generar los datos para el analisis de Saiku?
Este proceso puede tomar varios minutos.
Si hace click en "SI" los datos mas actuales seran generados. +CollectEarthWindow.5=Cerrar +CollectEarthWindow.60=Generación de datos para Saiku +CollectEarthWindow.61=Exportar a XML (solo los registros anadidos/modificados) +CollectEarthWindow.62=Mas informacion.. +CollectEarthWindow.63=Error leyendo los puntos desde el KML +CollectEarthWindow.64=Soporte tecnico +CollectEarthWindow.65=Se ha cambido el nombre del operador +CollectEarthWindow.66=Cambio de operador +CollectEarthWindow.67=Abrir directorio de datos de CE +CollectEarthWindow.6=Exportar datos a Fusion Table +CollectEarthWindow.70=Abrir el manual de esta encuesta +CollectEarthWindow.71=Generar herramienta Saiku independiente +CollectEarthWindow.7=Error al importar los datos +CollectEarthWindow.8=No se pudo encontrar el testo de exención de responsabilidad +CollectEarthWindow.9=Los datos importados contienen registros que ya están presentes en su base de datos +DynamicsCode.0=Inicialmente Bosque +DynamicsCode.1=Inicialmente Pastizal +DynamicsCode.2=Inicialmente Asentamiento +DynamicsCode.3=Inicialmente Otras tierras +DynamicsCode.4=Inicialmente Humedal +DynamicsCode.5=Inicialmente Cultivo +EarthApp.11=Collect Earth ya está ejecutandose +EarthApp.21=El archivo CSV/CED que contiene el diseño de la malla de puntos no se encuentra en la ruta seleccionada \:
+EarthApp.23=No se ha configurado ningun archivo de puntos CSV/CED \:

+EarthApp.24=El archivo que contiene la plantilla de Freemarker con la definicion del KML no se encuntra en la ruta seleccionada \:
+EarthApp.26=No se ha configurado ninguna archivo con la definicion del KML \:

+EarthApp.27=El archivo que contiene el formulario del pop-up en HTMl no se ha encontrado en la ruta seleccionada \:
+EarthApp.29=No se ha configurado ningun HTML de configuracion del pop-up \:

+EarthApp.30=Corrija la localizacion del archivo a traves del menu Herramientas->Propiedades. +EarthApp.3=Recordarme mas tarde +EarthApp.4=Actualizar Ahora +EarthApp.57=Hay una nueva version de Collect Earth disponible\! +EarthApp.58=Alerta para actualizacion +EarthApp.59=Error al importar el archivo del proyecto +EarthApp.5=No recordarme otra vez +EarthApp.61=El archivo KMZ generado por Collect Earth no se pudo abrir.
Asegurese de que Google Earth esta instalado. +EarthApp.6=\ - Version +EarthApp.70=ATENCION +EarthApp.71=En Mac OS X los archivos de proyectos de Collect Earth (*.cep) no se abren automaticamente al hacer doble-click sobre ellos.
+EarthApp.72=Utiliza la barra de herramientas de Collect Earth para abrir lo archivos .cep \: +EarthApp.73=Collect Earth en ordenadores Mac OS X +EarthSurveyService.9=Campo necesario +ExportActionListener.1=Elija la fecha desde la que exportar los datos +ExportDialogProcessMonitor.0=Procesando datos... +ExportDialogProcessMonitor.1=Esperando a la inicializacion del exportador \: +ExportDialogProcessMonitor.4=Registros exportados \: +ImportActionListener.0=¿Quiere importar los datos de las parcelas que no han sido completamente rellenadas? +ImportActionListener.2=Si hace click en NO se importarán solo los datos de las parcelas en el estado completo (verde)". +ImportActionListener.3=Importar registros incompletos +ImportDialogProcessMonitor.0=\ CALCULANDO +ImportDialogProcessMonitor.11=Cifra inicial the registros \: +ImportDialogProcessMonitor.2=Importando registros... +ImportDialogProcessMonitor.5=Cifra final de registros importados \: +ImportDialogProcessMonitor.8=Procesando datos... +ImportProcessMonitorDialog.0=Registros importados \: +ImportXMLDialogProcessMonitor.1 = Sobreescrivir las parcelas en BBDD +ImportXMLDialogProcessMonitor.2 = Importar solo parcelas sin conflictos +InfiniteProgressMonitor.0=Cancelar operación +JFileChooserExistsAware.0=Archivo de proyecto Collect Earth +KmlImportService.13=Seleccionar archivo CSV donde guardar las posiciones de las parcelas +MissingPlotsListener.0=Error cuando se estaba obteniendo información de las parcelas ausentes de la base de datos +MissingPlotsListener.10=Numero total de parcelas en el diseño de la muestra \: +MissingPlotsListener.12=Numero de parcelas que faltan \: +MissingPlotsListener.14=Todas las parcelas han sido rellenadas\! +MissingPlotsListener.1=Parcelas que faltan +MissingPlotsListener.2=Copiar contenidos +MissingPlotsListener.3=Elija los archivos que contienen informacion sobre las parcelas ( archivos .csv o .ced ) para los que desea averiguar si todos los datos se han rellenado. +MissingPlotsListener.4=Parcelas ausentes – informacion +MissingPlotsListener.5=Del archivo \: +MissingPlotsListener.6=Exportar a archivo CED +NO=No +NO_TO_ALL=No a todo +OpenTextFileListener.0=El archivo de texto no ha sido encontrado en \: +OptionWizard.0=Opciones de Collect Earth +OptionWizard.100=Abrir Planet +OptionWizard.101=Llave de la API de Planet +OptionWizard.1021=URL SecureWatch +OptionWizard.102=Abrir Maxar SecureWatch (necesario tener licencia) +OptionWizard.103=Configurar la URL para el Mapa Extra (se abre cuando esta configurada) \: +OptionWizard.104=Navegadores +OptionWizard.105=Abrir Earth Map +OptionWizard.110=Usar las imagenes mensuales de NICFI +OptionWizard.10=Abrir carpeta de copias de seguridad +OptionWizard.11=Desconocido\: usar ipconfig +OptionWizard.12=Instancia cliente +OptionWizard.13=Collect Earth Server IP +OptionWizard.14=Collect Earth Server puerto (e.g. 8023) +OptionWizard.15=Guardar & aplicar cambios +OptionWizard.16=ID +OptionWizard.17=X-coord +OptionWizard.18=Y-coord +OptionWizard.19=Elevación +OptionWizard.1=Elija navegador +OptionWizard.20=Los contenidos de Google Earth han cambiado.
Acepte la recarga del contenido cuando Google Earth le pregunte. +OptionWizard.21=Actualizado con éxito +OptionWizard.22=Pendiente +OptionWizard.23=Hubo un error al reabrir los datos en Google Earth +OptionWizard.24=Cancelar +OptionWizard.25=Modo de operación +OptionWizard.26=BBDD servidor +OptionWizard.27=Esta no es una carpeta de un servido Saiku ( el archivo start-saiku.bat no esta presente) +OptionWizard.28=Servidor Saiku no reconocible +OptionWizard.29=BBDD puerto +OptionWizard.2=Tipo de uso (servidor/cliente) +OptionWizard.30=Opciones SQLite +OptionWizard.31=Datos de muestra +OptionWizard.32=Diseño de parcela +OptionWizard.33=Definición de la encuesta +OptionWizard.34=Servicios integrados +OptionWizard.35=Número de puntos de control +OptionWizard.36=Distancia entre los puntos de control (en metros) +OptionWizard.37=Margen con el borde de la parcela (en metros) +OptionWizard.38=El archivo CSV/CED no pudo leerse correctamente.
El formato del archivo de valores separados por comas ha de ser como este \:
+OptionWizard.39=ID,Y-Coordinada,X-Coordinada,Elevacion,pendiente,orientacion +OptionWizard.3=Servidor +OptionWizard.40=Proyectos +OptionWizard.41=Cargar un nuevo archivo de proyecto +OptionWizard.42=Error al cerrar el lector del CSV +OptionWizard.43=Nombre de la encuesta +OptionWizard.44=Guardar copia de seguridad de la base de datos en +OptionWizard.45=Abrir Google Earth Engine Playground (obsoleto) +OptionWizard.46=Abrir Google Earth Engine Timelapse +OptionWizard.47=Abrir Bing Maps +OptionWizard.48=Abrir encuesta en un navegador externo en lugar de Google Earth (recomendado para LINUX) +OptionWizard.49=Ruta del archivo ced/csv con las coordenadas de las parcelas +OptionWizard.4=IP de este ordenador\: +OptionWizard.50=Navegar... +OptionWizard.51=Error al importar el archivos del proyecto +OptionWizard.52=Archivo CSV/CED con coordenadas +OptionWizard.53=Sin puntos +OptionWizard.54=Punto central +OptionWizard.55=Error al importar el directorio del proyecto +OptionWizard.56=Cargar proyecto +OptionWizard.57=Proyectos ya cargados +OptionWizard.58=Abrir GEE Code Editor (requiere accesso como Trusted Tester) +OptionWizard.59=Abrir Here Maps +OptionWizard.5=Collect Earth Server puerto\: +OptionWizard.65=Ruta para la carpeta de Saiku +OptionWizard.66=Navegar... +OptionWizard.67=Ruta del ejecutable de Firefox +OptionWizard.68=Navegar... +OptionWizard.6=Parámetros BD PostgreSQL +OptionWizard.70=Archivos ejecutables +OptionWizard.72=Archivos binarios +OptionWizard.73=Ruta del ejecutable de Chrome +OptionWizard.74=Navegar... +OptionWizard.76=Archivos ejecutables +OptionWizard.78=Archivos binarios +OptionWizard.79=Ruta a la plantilla KML de Freemarker +OptionWizard.7=Nombre de usuario +OptionWizard.80=Navegar... +OptionWizard.82=Plantilla Freemarker +OptionWizard.83=Ruta al formulario HTML +OptionWizard.84=Navegar... +OptionWizard.86=Pagina web HTML +OptionWizard.87=Ruta al XML con la definición del IDM +OptionWizard.88=Navegar... +OptionWizard.8=Password +OptionWizard.90=Definición XML IDM +OptionWizard.91=Servidor (versión para el gerente o para uso autónomo) +OptionWizard.92=Cliente (operador/conectado al servidor) +OptionWizard.93=SQLite (Embebida/basada en un único archivo) +OptionWizard.94=PostgreSQL +OptionWizard.95=Lado del punto de sampleo (en metros) +OptionWizard.9=Nombre de la Base de Datos +ProcessMonitorDialog.1=Error de interpretacion en la fila +ProcessMonitorDialog.4=, columnas +ProcessMonitorDialog.5=\ -- valores +SaikuAnalysisListener.0=Si - Actualizar datos de Saiku (proceso de larga duracion) +SaikuAnalysisListener.1=No - Usar los mismos datos de la ultima vez que se usó Saiku +SaikuStarter.1=Iniciando Saiku +SaikuStarter.2=Iniciar Saiku puede tomar varios minutos, espere por favor.\! +SaikuToolExportListener.1=Generación herramienta Saiku +SaikuToolExportListener.2=Generando la herramienta Saiku que incluye la base de datos +SaveEarthDataServlet.0=Sin datos +SaveEarthDataServlet.1=Problemas al guardar los datos en la Base de Datos +SaveEarthDataServlet.2=Los datos se han guardado +SlopeCode.0=Llano (0-5) +YES=Si +YES_TO_ALL=Si a todo \ No newline at end of file From 9b00fad4caf9e3a88c8232281b4d5464bacdaa9a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:35:39 +0100 Subject: [PATCH 0800/1620] New translations Messages_es.properties (English) --- .../earth/app/view/Messages_en.properties | Bin 70708 -> 13997 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index aefdf309744a0187d10430151fd9f27cdefc40a9..efdb0acb96b49836918f285e6bf7d3dec5f1d71e 100644 GIT binary patch literal 13997 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 Date: Tue, 29 Nov 2022 12:35:40 +0100 Subject: [PATCH 0801/1620] New translations Messages_fr.properties (French) --- .../earth/app/view/Messages_fr.properties | 497 +++++++++--------- 1 file changed, 249 insertions(+), 248 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index efdb0acb96..5199a9b624 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,254 +1,255 @@ -AboutDialog.19=Problemas al abrir -AboutDialog.5=Para mas informacion visite nuestra web OpenForis.org -AboutDialog.6=Lo sentimos, hemos tenido un problema al intentar abrir el link en su navegador standard. +AboutDialog.19=UN problème est apparu +AboutDialog.5=Pour plus d’infos, visitez notre site web OpenForis.org +AboutDialog.6=Désolé, il y a eu un problème lors de l’ouverture du lien avec votre navigateur par défaut. AboutDialog.8=Ok -AspectCode.0=Norte -AspectCode.1=Noreste -AspectCode.2=Este -AspectCode.3=Sureste -AspectCode.4=Sur -AspectCode.5=Suroeste -AspectCode.6=Oeste -AspectCode.7=Noroeste -CollectEarthMenu.0=Importar archivo CEP -CollectEarthMenu.2=Utilidades -CollectEarthMenu.3=Dividir archivos de parcelas CSV grandes -CollectEarthMenu.4=Exportar datos a XML (desde una fecha especifica hasta este momento) -CollectEarthMenu.5=Exportar a Collect Backup -CollectEarthMenu.6=Exportar datos como Collect Backup (todos los datos) -CollectEarthMenu.7=Exportar datos como Collect Backup (filtrar por atributo ) -CollectEarthWindow.0=Error al intentar exportar los datos a un archivo CSV -CollectEarthWindow.10=Archivo -CollectEarthWindow.11=Cerrar -CollectEarthWindow.12=Herramientas -CollectEarthWindow.13=Descargar datos a CSV (Excel) -CollectEarthWindow.14=Comenzar análisis con Saiku -CollectEarthWindow.15=Propiedades -CollectEarthWindow.16=Ayuda -CollectEarthWindow.17=Declaración -CollectEarthWindow.18=Encontrar parcelas ausentes de la Base de Datos +AspectCode.0=Nord +AspectCode.1=Nord-Est +AspectCode.2=Est +AspectCode.3=Sud-Est +AspectCode.4=Sud +AspectCode.5=Sud-Ouest +AspectCode.6=Ouest +AspectCode.7=Nord-Ouest +CollectEarthMenu.0=Importe le fichier .CEP +CollectEarthMenu.2=Utilitaires +CollectEarthMenu.3=Divise un large tableau CSV en plusieurs parties +CollectEarthMenu.4=Exporte les données en XML (à partir d'une date précise jusqu'à aujourd'hui) +CollectEarthMenu.5=Exporte sur la sauvegarde Collect Backup +CollectEarthMenu.6=Exporte les données en tant que sauvegarde Collect Backup (toutes les données) +CollectEarthMenu.7=Exporte les données en tant que sauvegarde Collect Backup (à partir de) +CollectEarthMenu.8=Exporte les données en XML (filtrer par attribut) +CollectEarthWindow.0=Erreur pendant l'exportation des données en csv +CollectEarthWindow.10=Fichier +CollectEarthWindow.11=Quitter +CollectEarthWindow.12=Outils +CollectEarthWindow.13=Télécharger les données en CSV (Excel) +CollectEarthWindow.14=Démarrer l'analyse avec Saïku +CollectEarthWindow.15=Propriétés +CollectEarthWindow.16=Aide +CollectEarthWindow.17=Avertissement +CollectEarthWindow.18=Trouver les placettes manquantes dans la base de données CollectEarthWindow.19=Collect Earth -CollectEarthWindow.1=Error al exportar -CollectEarthWindow.20=Número de registros repetidos\: -CollectEarthWindow.21=No se pudo encontrar el icono de la ventana principal -CollectEarthWindow.22=¿Seguro que quieres cerrar Collect Earth?
El servidor de Collect Earth terminara al cerrar la ventana -CollectEarthWindow.23=Necesita confirmación -CollectEarthWindow.24=Exportar a XML -CollectEarthWindow.25=¿Quiere importar estos registros de todas formas y perder sus datos actuales? -CollectEarthWindow.26=Operador -CollectEarthWindow.27=Actualizar -CollectEarthWindow.28=El servidor Open Foris Collect Earth debe estar en funcionamiento mientras el operador esta realizando su trabajo. -CollectEarthWindow.29=El servidor Saiku no ha sido configurado. -CollectEarthWindow.2=Idioma -CollectEarthWindow.30=Por favor, mantenga esta ventana abierta mientras este utilizando Google Earth. -CollectEarthWindow.31=Exportar los datos como archivos CSV -CollectEarthWindow.32=Salir -CollectEarthWindow.33=El nombre del operador ha de ser mas largo que cinco caracteres y mas corto que 50 -CollectEarthWindow.34=Error de validación -CollectEarthWindow.35=\!NOMBRE DEL OPERADOR VACIO\!
Rellene el campo del nombre del operador y presione el botón de "Actualizar". -CollectEarthWindow.36=El nombre del operador no puede estar vacío -CollectEarthWindow.37=Conservar abierto -CollectEarthWindow.38=Archivos CSV -CollectEarthWindow.39=ATENCION\: Recomendamos que guarde una copia de seguridad de sus datos actuales (expórtelos a XML) antes de importar los nuevos datos. -CollectEarthWindow.3=\ Error al importar datos -CollectEarthWindow.40=Configure la ruta a la carpeta donde el servidor Saiku ha sido instalado en Herramientas->Propiedades->Avanzadas. -CollectEarthWindow.41=Guardando los datos en el archivo\: -CollectEarthWindow.42=Terminar -CollectEarthWindow.43=Detectados registros repetidos -CollectEarthWindow.44=Importar/Exportar datos -CollectEarthWindow.45=Exportar datos en XML (comprimidos) -CollectEarthWindow.46=Importar nuevos datos desde ZIP (XML comprimidos) -CollectEarthWindow.47=Servidor Saiku no configurado -CollectEarthWindow.48=Archivos zip/collect-data -CollectEarthWindow.49=Archivos Fusion CSV -CollectEarthWindow.4=Exención de responsabilidad de FAO -CollectEarthWindow.50=Abrir Manual de Usuario -CollectEarthWindow.51=Comprobar si hay actualizaciones de Collect Earth -CollectEarthWindow.52=Abrir el archivo de registo de la aplicacion -CollectEarthWindow.53=Archivo de registro de Collect Earth -CollectEarthWindow.54=Cargar puntos desde KML -CollectEarthWindow.55=Actualizar datos ya registrados desde CSV -CollectEarthWindow.56=Mas informacion... -CollectEarthWindow.57=El proceso para comenzar Saiku esta ejecutandose todavia, espere unos minutos. -CollectEarthWindow.58=No se pudo iniciar el analisis con Saiku -CollectEarthWindow.59=¿Quiere volver a generar los datos para el analisis de Saiku?
Este proceso puede tomar varios minutos.
Si hace click en "SI" los datos mas actuales seran generados. -CollectEarthWindow.5=Cerrar -CollectEarthWindow.60=Generación de datos para Saiku -CollectEarthWindow.61=Exportar a XML (solo los registros anadidos/modificados) -CollectEarthWindow.62=Mas informacion.. -CollectEarthWindow.63=Error leyendo los puntos desde el KML -CollectEarthWindow.64=Soporte tecnico -CollectEarthWindow.65=Se ha cambido el nombre del operador -CollectEarthWindow.66=Cambio de operador -CollectEarthWindow.67=Abrir directorio de datos de CE -CollectEarthWindow.6=Exportar datos a Fusion Table -CollectEarthWindow.70=Abrir el manual de esta encuesta -CollectEarthWindow.71=Generar herramienta Saiku independiente -CollectEarthWindow.7=Error al importar los datos -CollectEarthWindow.8=No se pudo encontrar el testo de exención de responsabilidad -CollectEarthWindow.9=Los datos importados contienen registros que ya están presentes en su base de datos -DynamicsCode.0=Inicialmente Bosque -DynamicsCode.1=Inicialmente Pastizal -DynamicsCode.2=Inicialmente Asentamiento -DynamicsCode.3=Inicialmente Otras tierras -DynamicsCode.4=Inicialmente Humedal -DynamicsCode.5=Inicialmente Cultivo -EarthApp.11=Collect Earth ya está ejecutandose -EarthApp.21=El archivo CSV/CED que contiene el diseño de la malla de puntos no se encuentra en la ruta seleccionada \:
-EarthApp.23=No se ha configurado ningun archivo de puntos CSV/CED \:

-EarthApp.24=El archivo que contiene la plantilla de Freemarker con la definicion del KML no se encuntra en la ruta seleccionada \:
-EarthApp.26=No se ha configurado ninguna archivo con la definicion del KML \:

-EarthApp.27=El archivo que contiene el formulario del pop-up en HTMl no se ha encontrado en la ruta seleccionada \:
-EarthApp.29=No se ha configurado ningun HTML de configuracion del pop-up \:

-EarthApp.30=Corrija la localizacion del archivo a traves del menu Herramientas->Propiedades. -EarthApp.3=Recordarme mas tarde -EarthApp.4=Actualizar Ahora -EarthApp.57=Hay una nueva version de Collect Earth disponible\! -EarthApp.58=Alerta para actualizacion -EarthApp.59=Error al importar el archivo del proyecto -EarthApp.5=No recordarme otra vez -EarthApp.61=El archivo KMZ generado por Collect Earth no se pudo abrir.
Asegurese de que Google Earth esta instalado. +CollectEarthWindow.1=Erreur d'exportation +CollectEarthWindow.20=Nombre d'enregistrements dupliqués +CollectEarthWindow.21=Icône non trouvée +CollectEarthWindow.22= Êtes-vous sûr de vouloir fermer CollectEarth
Fermer cette fenêtre fermera aussi le serveur +CollectEarthWindow.23=Confirmation requise +CollectEarthWindow.24=Exporter en XML +CollectEarthWindow.25=Voulez-vous ajouter tout de même ces données et perdre vos enregistrements? +CollectEarthWindow.26=Utilisateur +CollectEarthWindow.27=Appliquer +CollectEarthWindow.28=Le serveur devrait être démarré pour la saisie des données par les utilisateurs. +CollectEarthWindow.29=Le serveur Saiku n'est pas configuré. +CollectEarthWindow.2=Langue +CollectEarthWindow.30=Veuillez garder cette fenêtre active pendant que vous utilisez Google Earth +CollectEarthWindow.31=Exporter les données collectées en CSV +CollectEarthWindow.32=Fermer +CollectEarthWindow.33=Le nom de l'utilisateur doit comprendre entre 5 et 50 caractères +CollectEarthWindow.34=Erreur de validation +CollectEarthWindow.35= NOM DE L'UTILISATEUR VIDE\!
Veuillez renseigner le champs et Appuyer sur "Mise à jour" +CollectEarthWindow.36=Le nom de l'utilisateur ne peut pas être vide +CollectEarthWindow.37=Laisser ouvert +CollectEarthWindow.38=Fichiers CSV +CollectEarthWindow.39=NOTE \: Il est conseillé de sauvegarder vos données (export en XML) avant d'importer de nouvelles données +CollectEarthWindow.3=\ Erreur pendant l'importation +CollectEarthWindow.40=Renseigner le chemin jusqu'au serveur Saiku dans /Outils/Propriétés/Avancé. +CollectEarthWindow.41=Sauvegarde des données exportées dans le fichier\: +CollectEarthWindow.42=Quitter +CollectEarthWindow.43=Enregistrements conflictuels trouvés +CollectEarthWindow.44=Importer/Exporter les données +CollectEarthWindow.45=Exporter les données en XML (zippé) +CollectEarthWindow.46=Importer de nouvelles données depuis ZIP (XML zippé) +CollectEarthWindow.47=Le serveur Saiku n'est pas configuré +CollectEarthWindow.48=Fichier zip/collect-data +CollectEarthWindow.49=Fusion des fichiers CSV +CollectEarthWindow.4=Clause de non-responsabilité de la FAO +CollectEarthWindow.50=Ouvrir le manuel utilisateur +CollectEarthWindow.51=Vérifier les mises à jour des Collect Earth +CollectEarthWindow.52=Fichier de logs Open Application +CollectEarthWindow.53=Fichier de logs Collect Earth +CollectEarthWindow.54=Charger les points de KML +CollectEarthWindow.55=Mettre à jour les enregistrements en utilisant un fichier CSV +CollectEarthWindow.56=A propos... +CollectEarthWindow.57=Le processus de démarrage de Saïku est en cours, veuillez patienter +CollectEarthWindow.58=Impossible de démarrer l'analyse avec Saïku +CollectEarthWindow.59=Voulez-vous régénérer le jeu de données?
Cela peut prendre du temps.
Cliquer sur oui pour régénérer un nouveau jeu de données avec les dernières informations +CollectEarthWindow.5=Fermer +CollectEarthWindow.60=Génération des données Saïku +CollectEarthWindow.61=Exporter en XML (uniquement les enregistrements modifiés/ajoutés) +CollectEarthWindow.62=A propos… +CollectEarthWindow.63=Erreur en accédant aux points de KML +CollectEarthWindow.64=Assistance technique +CollectEarthWindow.65=Le nom de l'opérateur a été changé +CollectEarthWindow.66=Nom de l'opérateur +CollectEarthWindow.67=Ouvrir le dossier de données de CE +CollectEarthWindow.6=Exporter en Table de Fusion +CollectEarthWindow.70=Ouvrez le manuel de cette enquête +CollectEarthWindow.71=Générer un outil Saiku autonome +CollectEarthWindow.7=Erreur pendant l'importation des données +CollectEarthWindow.8=Le texte est introuvable +CollectEarthWindow.9=Les données importées contiennent des redondances avec celles présentes dans la base +DynamicsCode.0= Terre Forestière initialement +DynamicsCode.1= Prairie initialement +DynamicsCode.2= Etablissement initialement +DynamicsCode.3= Autre terre initialement +DynamicsCode.4= Terre humide initialement +DynamicsCode.5= Terre cultivée initialement +EarthApp.11=Collect Earth est déjà en cours d’exécution +EarthApp.21=Le fichier CSV/CED contenant les points est introuvable \:
+EarthApp.23=Aucun fichier CSV/CED spécifié \:

+EarthApp.24=Le fichier contenant le modèle de définition KML est introuvable \:
+EarthApp.26=Aucun modèle de définition spécifié\:

+EarthApp.27=Le fichier contenant le ballon HTML est introuvable \:
+EarthApp.29=Aucun ballon HTML spécifié \:

+EarthApp.30=Veuillez corriger le chemin d’accès dans le menu Outils -> Propriétés. +EarthApp.3=Rappelez le moi plus tard +EarthApp.4=Mettre a jour maintenant +EarthApp.57= Une nouvelle version de Collect Earth est disponible\! Utiliser le Menu +EarthApp.58=Alerte de mise à jour +EarthApp.59=Erreur pendant l’importation du fichier +EarthApp.5=Ne me le rappelez plus +EarthApp.61=Le fichier Collect Earth est introuvable br/>Veuillez-vous assurer que Google Earth est installé. EarthApp.6=\ - Version -EarthApp.70=ATENCION -EarthApp.71=En Mac OS X los archivos de proyectos de Collect Earth (*.cep) no se abren automaticamente al hacer doble-click sobre ellos.
-EarthApp.72=Utiliza la barra de herramientas de Collect Earth para abrir lo archivos .cep \: -EarthApp.73=Collect Earth en ordenadores Mac OS X -EarthSurveyService.9=Campo necesario -ExportActionListener.1=Elija la fecha desde la que exportar los datos -ExportDialogProcessMonitor.0=Procesando datos... -ExportDialogProcessMonitor.1=Esperando a la inicializacion del exportador \: -ExportDialogProcessMonitor.4=Registros exportados \: -ImportActionListener.0=¿Quiere importar los datos de las parcelas que no han sido completamente rellenadas? -ImportActionListener.2=Si hace click en NO se importarán solo los datos de las parcelas en el estado completo (verde)". -ImportActionListener.3=Importar registros incompletos -ImportDialogProcessMonitor.0=\ CALCULANDO -ImportDialogProcessMonitor.11=Cifra inicial the registros \: -ImportDialogProcessMonitor.2=Importando registros... -ImportDialogProcessMonitor.5=Cifra final de registros importados \: -ImportDialogProcessMonitor.8=Procesando datos... -ImportProcessMonitorDialog.0=Registros importados \: -ImportXMLDialogProcessMonitor.1 = Sobreescrivir las parcelas en BBDD -ImportXMLDialogProcessMonitor.2 = Importar solo parcelas sin conflictos -InfiniteProgressMonitor.0=Cancelar operación -JFileChooserExistsAware.0=Archivo de proyecto Collect Earth -KmlImportService.13=Seleccionar archivo CSV donde guardar las posiciones de las parcelas -MissingPlotsListener.0=Error cuando se estaba obteniendo información de las parcelas ausentes de la base de datos -MissingPlotsListener.10=Numero total de parcelas en el diseño de la muestra \: -MissingPlotsListener.12=Numero de parcelas que faltan \: -MissingPlotsListener.14=Todas las parcelas han sido rellenadas\! -MissingPlotsListener.1=Parcelas que faltan -MissingPlotsListener.2=Copiar contenidos -MissingPlotsListener.3=Elija los archivos que contienen informacion sobre las parcelas ( archivos .csv o .ced ) para los que desea averiguar si todos los datos se han rellenado. -MissingPlotsListener.4=Parcelas ausentes – informacion -MissingPlotsListener.5=Del archivo \: -MissingPlotsListener.6=Exportar a archivo CED -NO=No -NO_TO_ALL=No a todo -OpenTextFileListener.0=El archivo de texto no ha sido encontrado en \: -OptionWizard.0=Opciones de Collect Earth -OptionWizard.100=Abrir Planet -OptionWizard.101=Llave de la API de Planet +EarthApp.70=AVERTISSMENT +EarthApp.71=Sous Mac OS X, les fichiers de projet Collect Earth (* .cep) ne s'ouvriront pas dans Collect Earth lorsqu'ils sont double-cliqués.
+EarthApp.72=Utilisez la barre d'outils Collect Earth pour ouvrir les fichiers .cep \: +EarthApp.73=Collect Earth - problèmes sur les ordinateurs Mac OS X +EarthSurveyService.9=Champs requis +ExportActionListener.1=Choisir la date pour les données à exporter +ExportDialogProcessMonitor.0=Chargement des données... +ExportDialogProcessMonitor.1=Attente d'initialisation de l'export +ExportDialogProcessMonitor.4=Enregistrements exportés \: +ImportActionListener.0=Est-ce que les données pour les placettes qui ne sont pas complètes doivent être importées ? +ImportActionListener.2=Si vous cliquez sur NO, seulement les données provenant des placettes avec la marque « verte », qui contiennent toutes les données, seront importées +ImportActionListener.3=Importer les enregistrements incomplets +ImportDialogProcessMonitor.0=Calcul en cours +ImportDialogProcessMonitor.11=Nombre initial d' enregistrements \: +ImportDialogProcessMonitor.2=Chargement des enregistrements... +ImportDialogProcessMonitor.5=Nombre réel d'enregistrements importés\: +ImportDialogProcessMonitor.8=Chargement des données... +ImportProcessMonitorDialog.0=Enregistrements importés \: +ImportXMLDialogProcessMonitor.1 = Écraser les données dans la base de données +ImportXMLDialogProcessMonitor.2 = Importer uniquement des enregistrements non conflictuels +InfiniteProgressMonitor.0=Annuler l’opération +JFileChooserExistsAware.0=Fichier projet Collect Earth +KmlImportService.13=Sélectionnez un fichier CSV pour enregistrer les emplacements des parcelles +MissingPlotsListener.0=Erreur au cours de l’enregistrement des placettes absentes de la base de données +MissingPlotsListener.10=Nombre total de parcelles dans le plan d'échantillonnage \: +MissingPlotsListener.12=Nombre de parcelles manquantes \: +MissingPlotsListener.14=Toutes les parcelles sont remplis\! +MissingPlotsListener.1=Placettes manquantes +MissingPlotsListener.2=Copier le contenu sur le clipboard +MissingPlotsListener.3=Choisir les fichiers qui contiennent les informations des placettes (.csv ou .ced) pour lesquelles vous voulez savoir si toues les placettes ont été renseignées +MissingPlotsListener.4=Placettes manquantes – Information +MissingPlotsListener.5=Depuis le fichier \: +MissingPlotsListener.6=Exporter en CED +NO=Non +NO_TO_ALL=Non à tous +OpenTextFileListener.0=Le fichier texte n'a pas été trouvé dans \: +OptionWizard.0=Options Collect Earth +OptionWizard.100=Ouvrir Planet +OptionWizard.101=Clé API Planet OptionWizard.1021=URL SecureWatch -OptionWizard.102=Abrir Maxar SecureWatch (necesario tener licencia) -OptionWizard.103=Configurar la URL para el Mapa Extra (se abre cuando esta configurada) \: -OptionWizard.104=Navegadores -OptionWizard.105=Abrir Earth Map -OptionWizard.110=Usar las imagenes mensuales de NICFI -OptionWizard.10=Abrir carpeta de copias de seguridad -OptionWizard.11=Desconocido\: usar ipconfig -OptionWizard.12=Instancia cliente -OptionWizard.13=Collect Earth Server IP -OptionWizard.14=Collect Earth Server puerto (e.g. 8023) -OptionWizard.15=Guardar & aplicar cambios +OptionWizard.102=Ouvrir Maxar SecureWatch +OptionWizard.103=Définir le URL pour le Carte Extra (ouvre quand il est réglé) \: +OptionWizard.104=Navigateurs +OptionWizard.105=Ouvrir Earth Map +OptionWizard.110=Utiliser les images mensuelles fournies par NICFI +OptionWizard.10=Montrer les fichiers de sauvegarde +OptionWizard.11=Inconnu \: utiliser ifconfig +OptionWizard.12=Instance client +OptionWizard.13=IP Serveur de Collect Earth +OptionWizard.14=Port Serveur de Collect Earth (e.g. 8023) +OptionWizard.15=Appliquer et sauvegarder les changements OptionWizard.16=ID -OptionWizard.17=X-coord -OptionWizard.18=Y-coord -OptionWizard.19=Elevación -OptionWizard.1=Elija navegador -OptionWizard.20=Los contenidos de Google Earth han cambiado.
Acepte la recarga del contenido cuando Google Earth le pregunte. -OptionWizard.21=Actualizado con éxito -OptionWizard.22=Pendiente -OptionWizard.23=Hubo un error al reabrir los datos en Google Earth -OptionWizard.24=Cancelar -OptionWizard.25=Modo de operación -OptionWizard.26=BBDD servidor -OptionWizard.27=Esta no es una carpeta de un servido Saiku ( el archivo start-saiku.bat no esta presente) -OptionWizard.28=Servidor Saiku no reconocible -OptionWizard.29=BBDD puerto -OptionWizard.2=Tipo de uso (servidor/cliente) -OptionWizard.30=Opciones SQLite -OptionWizard.31=Datos de muestra -OptionWizard.32=Diseño de parcela -OptionWizard.33=Definición de la encuesta -OptionWizard.34=Servicios integrados -OptionWizard.35=Número de puntos de control -OptionWizard.36=Distancia entre los puntos de control (en metros) -OptionWizard.37=Margen con el borde de la parcela (en metros) -OptionWizard.38=El archivo CSV/CED no pudo leerse correctamente.
El formato del archivo de valores separados por comas ha de ser como este \:
-OptionWizard.39=ID,Y-Coordinada,X-Coordinada,Elevacion,pendiente,orientacion -OptionWizard.3=Servidor -OptionWizard.40=Proyectos -OptionWizard.41=Cargar un nuevo archivo de proyecto -OptionWizard.42=Error al cerrar el lector del CSV -OptionWizard.43=Nombre de la encuesta -OptionWizard.44=Guardar copia de seguridad de la base de datos en -OptionWizard.45=Abrir Google Earth Engine Playground (obsoleto) -OptionWizard.46=Abrir Google Earth Engine Timelapse -OptionWizard.47=Abrir Bing Maps -OptionWizard.48=Abrir encuesta en un navegador externo en lugar de Google Earth (recomendado para LINUX) -OptionWizard.49=Ruta del archivo ced/csv con las coordenadas de las parcelas -OptionWizard.4=IP de este ordenador\: -OptionWizard.50=Navegar... -OptionWizard.51=Error al importar el archivos del proyecto -OptionWizard.52=Archivo CSV/CED con coordenadas -OptionWizard.53=Sin puntos -OptionWizard.54=Punto central -OptionWizard.55=Error al importar el directorio del proyecto -OptionWizard.56=Cargar proyecto -OptionWizard.57=Proyectos ya cargados -OptionWizard.58=Abrir GEE Code Editor (requiere accesso como Trusted Tester) -OptionWizard.59=Abrir Here Maps -OptionWizard.5=Collect Earth Server puerto\: -OptionWizard.65=Ruta para la carpeta de Saiku -OptionWizard.66=Navegar... -OptionWizard.67=Ruta del ejecutable de Firefox -OptionWizard.68=Navegar... -OptionWizard.6=Parámetros BD PostgreSQL -OptionWizard.70=Archivos ejecutables -OptionWizard.72=Archivos binarios -OptionWizard.73=Ruta del ejecutable de Chrome -OptionWizard.74=Navegar... -OptionWizard.76=Archivos ejecutables -OptionWizard.78=Archivos binarios -OptionWizard.79=Ruta a la plantilla KML de Freemarker -OptionWizard.7=Nombre de usuario -OptionWizard.80=Navegar... -OptionWizard.82=Plantilla Freemarker -OptionWizard.83=Ruta al formulario HTML -OptionWizard.84=Navegar... -OptionWizard.86=Pagina web HTML -OptionWizard.87=Ruta al XML con la definición del IDM -OptionWizard.88=Navegar... -OptionWizard.8=Password -OptionWizard.90=Definición XML IDM -OptionWizard.91=Servidor (versión para el gerente o para uso autónomo) -OptionWizard.92=Cliente (operador/conectado al servidor) -OptionWizard.93=SQLite (Embebida/basada en un único archivo) +OptionWizard.17=Coord-X +OptionWizard.18=Coord-Y +OptionWizard.19=Altitude +OptionWizard.1=Choisir un navigateur +OptionWizard.20= Le contenu de Google Earth a changé
Veuillez accepter la mise à jour quand GE le demande +OptionWizard.21=Mise à jour réussie +OptionWizard.22=Pente +OptionWizard.23=Il y a eu une erreur pendant la réouverture de Google Earth +OptionWizard.24=Annuler +OptionWizard.25=Mode opération +OptionWizard.26=Hôte pour la BDD +OptionWizard.27=Le dossier n'est pas valide (il manque le fichier start-saiku.bat) +OptionWizard.28=Le dossier Saiku n'est pas reconnu +OptionWizard.29=Port pour la BDD +OptionWizard.2=Flux (serveur/client) +OptionWizard.30=Options SQLite +OptionWizard.31=Points d'échantillonnage +OptionWizard.32=Configuration de la parcelle +OptionWizard.33=Définition de l'enquête +OptionWizard.34=Services intégrés +OptionWizard.35=Nombre de points de contrôle +OptionWizard.36=Distance entre les points de contrôle (en mètres) +OptionWizard.37=Distance au bord de la parcelle (en mètres) +OptionWizard.38=Le Fichier CSV/CED ne peut pas être lu
Le fichier devrait avoir des valeurs séparées par des virgules comme ceci \:
+OptionWizard.39=ID,Coordonnée_Y, Coordonnée_X,altitude,pente,orientation +OptionWizard.3=Instance serveur +OptionWizard.40=Projets +OptionWizard.41=Charger un nouveau fichier projet +OptionWizard.42=Erreur pendant la fermeture du lecteur CSV +OptionWizard.43=Nom de l'enquête +OptionWizard.44=Sauvegarder automatiquement la base dans +OptionWizard.45=Ouvrir Earth Engine Playground (obsolète) +OptionWizard.46=Ouvrir le Timelapse de Google Earth Engine +OptionWizard.47=Ouvrir Bing Maps +OptionWizard.48=Ouvrir le formulaire dans un navigateur plutôt que dans GE (recommandé pour Linux) +OptionWizard.49=Chemin jusqu'au fichier ced/csv avec les données des parcelles +OptionWizard.4=IP actuelle de l'ordinateur +OptionWizard.50=Parcourir +OptionWizard.51=Erreur pendant l'importation du fichier +OptionWizard.52=Fichier CSV/CED uniquement avec des coordonnées +OptionWizard.53=Pas de points +OptionWizard.54=Point central +OptionWizard.55=Erreur pendant l'importation du dossier projet +OptionWizard.56=Charger le projet +OptionWizard.57=Projets chargés précedemment +OptionWizard.58=Ouvrir GEE Code Editor (nécessite un accès restreint Trusted Tester) +OptionWizard.59=Ouvrir Here Maps +OptionWizard.5=Port Serveur Collect Earth \: +OptionWizard.65=Chemin jusqu'au serveur Saiku +OptionWizard.66=Parcourir +OptionWizard.67=Chemin jusqu'à Firefox +OptionWizard.68=Parcourir +OptionWizard.6=Paramètres de la BD PostGreSQL +OptionWizard.70=Fichiers exécutables +OptionWizard.72=Fichiers binaires +OptionWizard.73=Chemin jusqu'à Chrome +OptionWizard.74=Parcourir +OptionWizard.76=Fichiers exécutables +OptionWizard.78=Fichiers binaires +OptionWizard.79=Chemin jusqu'au modèle Freemarker KML +OptionWizard.7=Nom d'utilisateur +OptionWizard.80=Parcourir +OptionWizard.82=Modèle Freemarker +OptionWizard.83=Chemin jusqu'au Ballon HTML +OptionWizard.84=Parcourir +OptionWizard.86=Page web HTML +OptionWizard.87=Chemin jusqu'au fichier XML contenant la définition IDM +OptionWizard.88=Parcourir +OptionWizard.8=Mot de passe +OptionWizard.90=Définition IDM XML +OptionWizard.91=Serveur (version gestionnaire ou autonome) +OptionWizard.92=Client (opérateur/connecté au serveur) +OptionWizard.93=SQLite (Fichier intégré / Unique) OptionWizard.94=PostgreSQL -OptionWizard.95=Lado del punto de sampleo (en metros) -OptionWizard.9=Nombre de la Base de Datos -ProcessMonitorDialog.1=Error de interpretacion en la fila -ProcessMonitorDialog.4=, columnas -ProcessMonitorDialog.5=\ -- valores -SaikuAnalysisListener.0=Si - Actualizar datos de Saiku (proceso de larga duracion) -SaikuAnalysisListener.1=No - Usar los mismos datos de la ultima vez que se usó Saiku -SaikuStarter.1=Iniciando Saiku -SaikuStarter.2=Iniciar Saiku puede tomar varios minutos, espere por favor.\! -SaikuToolExportListener.1=Generación herramienta Saiku -SaikuToolExportListener.2=Generando la herramienta Saiku que incluye la base de datos -SaveEarthDataServlet.0=Sin datos -SaveEarthDataServlet.1=Problemas al guardar los datos en la Base de Datos -SaveEarthDataServlet.2=Los datos se han guardado -SlopeCode.0=Llano (0-5) -YES=Si -YES_TO_ALL=Si a todo \ No newline at end of file +OptionWizard.95=Côté des points d'échantillonnage (en mètres) +OptionWizard.9=Nom de la base +ProcessMonitorDialog.1=Erreur d’interprétation sur numéro de rangée +ProcessMonitorDialog.4=, colonnes +ProcessMonitorDialog.5=\ -- valeures +SaikuAnalysisListener.0=Oui - Rafraichir les données Saiku (processus long) +SaikuAnalysisListener.1=Non - Utiliser la même version des données que la dernière fois que Saiku a été utilisé +SaikuToolExportListener.1=Génération de l'outil Saiku +SaikuToolExportListener.2=Génération de l'outil Saiku avec la base de données actuelle +SaikuStarter.1=Démarrer Saïku +SaikuStarter.2=Démarrer Saïku peut prendre plusieurs minutes, veuillez patienter\! +SaveEarthDataServlet.0=Requête vide +SaveEarthDataServlet.1=Problème lors de la sauvegarde de la base de données +SaveEarthDataServlet.2=Les données ont été sauvées +SlopeCode.0=Plan (0-5) +YES=Oui +YES_TO_ALL=Oui à tous \ No newline at end of file From da1d7c8627ad79b5d350ea4ba4d577126a152001 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:35:41 +0100 Subject: [PATCH 0802/1620] New translations Messages_fr.properties (Spanish) --- .../earth/app/view/Messages_es.properties | 497 +++++++++--------- 1 file changed, 249 insertions(+), 248 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index efdb0acb96..5199a9b624 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,254 +1,255 @@ -AboutDialog.19=Problemas al abrir -AboutDialog.5=Para mas informacion visite nuestra web OpenForis.org -AboutDialog.6=Lo sentimos, hemos tenido un problema al intentar abrir el link en su navegador standard. +AboutDialog.19=UN problème est apparu +AboutDialog.5=Pour plus d’infos, visitez notre site web OpenForis.org +AboutDialog.6=Désolé, il y a eu un problème lors de l’ouverture du lien avec votre navigateur par défaut. AboutDialog.8=Ok -AspectCode.0=Norte -AspectCode.1=Noreste -AspectCode.2=Este -AspectCode.3=Sureste -AspectCode.4=Sur -AspectCode.5=Suroeste -AspectCode.6=Oeste -AspectCode.7=Noroeste -CollectEarthMenu.0=Importar archivo CEP -CollectEarthMenu.2=Utilidades -CollectEarthMenu.3=Dividir archivos de parcelas CSV grandes -CollectEarthMenu.4=Exportar datos a XML (desde una fecha especifica hasta este momento) -CollectEarthMenu.5=Exportar a Collect Backup -CollectEarthMenu.6=Exportar datos como Collect Backup (todos los datos) -CollectEarthMenu.7=Exportar datos como Collect Backup (filtrar por atributo ) -CollectEarthWindow.0=Error al intentar exportar los datos a un archivo CSV -CollectEarthWindow.10=Archivo -CollectEarthWindow.11=Cerrar -CollectEarthWindow.12=Herramientas -CollectEarthWindow.13=Descargar datos a CSV (Excel) -CollectEarthWindow.14=Comenzar análisis con Saiku -CollectEarthWindow.15=Propiedades -CollectEarthWindow.16=Ayuda -CollectEarthWindow.17=Declaración -CollectEarthWindow.18=Encontrar parcelas ausentes de la Base de Datos +AspectCode.0=Nord +AspectCode.1=Nord-Est +AspectCode.2=Est +AspectCode.3=Sud-Est +AspectCode.4=Sud +AspectCode.5=Sud-Ouest +AspectCode.6=Ouest +AspectCode.7=Nord-Ouest +CollectEarthMenu.0=Importe le fichier .CEP +CollectEarthMenu.2=Utilitaires +CollectEarthMenu.3=Divise un large tableau CSV en plusieurs parties +CollectEarthMenu.4=Exporte les données en XML (à partir d'une date précise jusqu'à aujourd'hui) +CollectEarthMenu.5=Exporte sur la sauvegarde Collect Backup +CollectEarthMenu.6=Exporte les données en tant que sauvegarde Collect Backup (toutes les données) +CollectEarthMenu.7=Exporte les données en tant que sauvegarde Collect Backup (à partir de) +CollectEarthMenu.8=Exporte les données en XML (filtrer par attribut) +CollectEarthWindow.0=Erreur pendant l'exportation des données en csv +CollectEarthWindow.10=Fichier +CollectEarthWindow.11=Quitter +CollectEarthWindow.12=Outils +CollectEarthWindow.13=Télécharger les données en CSV (Excel) +CollectEarthWindow.14=Démarrer l'analyse avec Saïku +CollectEarthWindow.15=Propriétés +CollectEarthWindow.16=Aide +CollectEarthWindow.17=Avertissement +CollectEarthWindow.18=Trouver les placettes manquantes dans la base de données CollectEarthWindow.19=Collect Earth -CollectEarthWindow.1=Error al exportar -CollectEarthWindow.20=Número de registros repetidos\: -CollectEarthWindow.21=No se pudo encontrar el icono de la ventana principal -CollectEarthWindow.22=¿Seguro que quieres cerrar Collect Earth?
El servidor de Collect Earth terminara al cerrar la ventana -CollectEarthWindow.23=Necesita confirmación -CollectEarthWindow.24=Exportar a XML -CollectEarthWindow.25=¿Quiere importar estos registros de todas formas y perder sus datos actuales? -CollectEarthWindow.26=Operador -CollectEarthWindow.27=Actualizar -CollectEarthWindow.28=El servidor Open Foris Collect Earth debe estar en funcionamiento mientras el operador esta realizando su trabajo. -CollectEarthWindow.29=El servidor Saiku no ha sido configurado. -CollectEarthWindow.2=Idioma -CollectEarthWindow.30=Por favor, mantenga esta ventana abierta mientras este utilizando Google Earth. -CollectEarthWindow.31=Exportar los datos como archivos CSV -CollectEarthWindow.32=Salir -CollectEarthWindow.33=El nombre del operador ha de ser mas largo que cinco caracteres y mas corto que 50 -CollectEarthWindow.34=Error de validación -CollectEarthWindow.35=\!NOMBRE DEL OPERADOR VACIO\!
Rellene el campo del nombre del operador y presione el botón de "Actualizar". -CollectEarthWindow.36=El nombre del operador no puede estar vacío -CollectEarthWindow.37=Conservar abierto -CollectEarthWindow.38=Archivos CSV -CollectEarthWindow.39=ATENCION\: Recomendamos que guarde una copia de seguridad de sus datos actuales (expórtelos a XML) antes de importar los nuevos datos. -CollectEarthWindow.3=\ Error al importar datos -CollectEarthWindow.40=Configure la ruta a la carpeta donde el servidor Saiku ha sido instalado en Herramientas->Propiedades->Avanzadas. -CollectEarthWindow.41=Guardando los datos en el archivo\: -CollectEarthWindow.42=Terminar -CollectEarthWindow.43=Detectados registros repetidos -CollectEarthWindow.44=Importar/Exportar datos -CollectEarthWindow.45=Exportar datos en XML (comprimidos) -CollectEarthWindow.46=Importar nuevos datos desde ZIP (XML comprimidos) -CollectEarthWindow.47=Servidor Saiku no configurado -CollectEarthWindow.48=Archivos zip/collect-data -CollectEarthWindow.49=Archivos Fusion CSV -CollectEarthWindow.4=Exención de responsabilidad de FAO -CollectEarthWindow.50=Abrir Manual de Usuario -CollectEarthWindow.51=Comprobar si hay actualizaciones de Collect Earth -CollectEarthWindow.52=Abrir el archivo de registo de la aplicacion -CollectEarthWindow.53=Archivo de registro de Collect Earth -CollectEarthWindow.54=Cargar puntos desde KML -CollectEarthWindow.55=Actualizar datos ya registrados desde CSV -CollectEarthWindow.56=Mas informacion... -CollectEarthWindow.57=El proceso para comenzar Saiku esta ejecutandose todavia, espere unos minutos. -CollectEarthWindow.58=No se pudo iniciar el analisis con Saiku -CollectEarthWindow.59=¿Quiere volver a generar los datos para el analisis de Saiku?
Este proceso puede tomar varios minutos.
Si hace click en "SI" los datos mas actuales seran generados. -CollectEarthWindow.5=Cerrar -CollectEarthWindow.60=Generación de datos para Saiku -CollectEarthWindow.61=Exportar a XML (solo los registros anadidos/modificados) -CollectEarthWindow.62=Mas informacion.. -CollectEarthWindow.63=Error leyendo los puntos desde el KML -CollectEarthWindow.64=Soporte tecnico -CollectEarthWindow.65=Se ha cambido el nombre del operador -CollectEarthWindow.66=Cambio de operador -CollectEarthWindow.67=Abrir directorio de datos de CE -CollectEarthWindow.6=Exportar datos a Fusion Table -CollectEarthWindow.70=Abrir el manual de esta encuesta -CollectEarthWindow.71=Generar herramienta Saiku independiente -CollectEarthWindow.7=Error al importar los datos -CollectEarthWindow.8=No se pudo encontrar el testo de exención de responsabilidad -CollectEarthWindow.9=Los datos importados contienen registros que ya están presentes en su base de datos -DynamicsCode.0=Inicialmente Bosque -DynamicsCode.1=Inicialmente Pastizal -DynamicsCode.2=Inicialmente Asentamiento -DynamicsCode.3=Inicialmente Otras tierras -DynamicsCode.4=Inicialmente Humedal -DynamicsCode.5=Inicialmente Cultivo -EarthApp.11=Collect Earth ya está ejecutandose -EarthApp.21=El archivo CSV/CED que contiene el diseño de la malla de puntos no se encuentra en la ruta seleccionada \:
-EarthApp.23=No se ha configurado ningun archivo de puntos CSV/CED \:

-EarthApp.24=El archivo que contiene la plantilla de Freemarker con la definicion del KML no se encuntra en la ruta seleccionada \:
-EarthApp.26=No se ha configurado ninguna archivo con la definicion del KML \:

-EarthApp.27=El archivo que contiene el formulario del pop-up en HTMl no se ha encontrado en la ruta seleccionada \:
-EarthApp.29=No se ha configurado ningun HTML de configuracion del pop-up \:

-EarthApp.30=Corrija la localizacion del archivo a traves del menu Herramientas->Propiedades. -EarthApp.3=Recordarme mas tarde -EarthApp.4=Actualizar Ahora -EarthApp.57=Hay una nueva version de Collect Earth disponible\! -EarthApp.58=Alerta para actualizacion -EarthApp.59=Error al importar el archivo del proyecto -EarthApp.5=No recordarme otra vez -EarthApp.61=El archivo KMZ generado por Collect Earth no se pudo abrir.
Asegurese de que Google Earth esta instalado. +CollectEarthWindow.1=Erreur d'exportation +CollectEarthWindow.20=Nombre d'enregistrements dupliqués +CollectEarthWindow.21=Icône non trouvée +CollectEarthWindow.22= Êtes-vous sûr de vouloir fermer CollectEarth
Fermer cette fenêtre fermera aussi le serveur +CollectEarthWindow.23=Confirmation requise +CollectEarthWindow.24=Exporter en XML +CollectEarthWindow.25=Voulez-vous ajouter tout de même ces données et perdre vos enregistrements? +CollectEarthWindow.26=Utilisateur +CollectEarthWindow.27=Appliquer +CollectEarthWindow.28=Le serveur devrait être démarré pour la saisie des données par les utilisateurs. +CollectEarthWindow.29=Le serveur Saiku n'est pas configuré. +CollectEarthWindow.2=Langue +CollectEarthWindow.30=Veuillez garder cette fenêtre active pendant que vous utilisez Google Earth +CollectEarthWindow.31=Exporter les données collectées en CSV +CollectEarthWindow.32=Fermer +CollectEarthWindow.33=Le nom de l'utilisateur doit comprendre entre 5 et 50 caractères +CollectEarthWindow.34=Erreur de validation +CollectEarthWindow.35= NOM DE L'UTILISATEUR VIDE\!
Veuillez renseigner le champs et Appuyer sur "Mise à jour" +CollectEarthWindow.36=Le nom de l'utilisateur ne peut pas être vide +CollectEarthWindow.37=Laisser ouvert +CollectEarthWindow.38=Fichiers CSV +CollectEarthWindow.39=NOTE \: Il est conseillé de sauvegarder vos données (export en XML) avant d'importer de nouvelles données +CollectEarthWindow.3=\ Erreur pendant l'importation +CollectEarthWindow.40=Renseigner le chemin jusqu'au serveur Saiku dans /Outils/Propriétés/Avancé. +CollectEarthWindow.41=Sauvegarde des données exportées dans le fichier\: +CollectEarthWindow.42=Quitter +CollectEarthWindow.43=Enregistrements conflictuels trouvés +CollectEarthWindow.44=Importer/Exporter les données +CollectEarthWindow.45=Exporter les données en XML (zippé) +CollectEarthWindow.46=Importer de nouvelles données depuis ZIP (XML zippé) +CollectEarthWindow.47=Le serveur Saiku n'est pas configuré +CollectEarthWindow.48=Fichier zip/collect-data +CollectEarthWindow.49=Fusion des fichiers CSV +CollectEarthWindow.4=Clause de non-responsabilité de la FAO +CollectEarthWindow.50=Ouvrir le manuel utilisateur +CollectEarthWindow.51=Vérifier les mises à jour des Collect Earth +CollectEarthWindow.52=Fichier de logs Open Application +CollectEarthWindow.53=Fichier de logs Collect Earth +CollectEarthWindow.54=Charger les points de KML +CollectEarthWindow.55=Mettre à jour les enregistrements en utilisant un fichier CSV +CollectEarthWindow.56=A propos... +CollectEarthWindow.57=Le processus de démarrage de Saïku est en cours, veuillez patienter +CollectEarthWindow.58=Impossible de démarrer l'analyse avec Saïku +CollectEarthWindow.59=Voulez-vous régénérer le jeu de données?
Cela peut prendre du temps.
Cliquer sur oui pour régénérer un nouveau jeu de données avec les dernières informations +CollectEarthWindow.5=Fermer +CollectEarthWindow.60=Génération des données Saïku +CollectEarthWindow.61=Exporter en XML (uniquement les enregistrements modifiés/ajoutés) +CollectEarthWindow.62=A propos… +CollectEarthWindow.63=Erreur en accédant aux points de KML +CollectEarthWindow.64=Assistance technique +CollectEarthWindow.65=Le nom de l'opérateur a été changé +CollectEarthWindow.66=Nom de l'opérateur +CollectEarthWindow.67=Ouvrir le dossier de données de CE +CollectEarthWindow.6=Exporter en Table de Fusion +CollectEarthWindow.70=Ouvrez le manuel de cette enquête +CollectEarthWindow.71=Générer un outil Saiku autonome +CollectEarthWindow.7=Erreur pendant l'importation des données +CollectEarthWindow.8=Le texte est introuvable +CollectEarthWindow.9=Les données importées contiennent des redondances avec celles présentes dans la base +DynamicsCode.0= Terre Forestière initialement +DynamicsCode.1= Prairie initialement +DynamicsCode.2= Etablissement initialement +DynamicsCode.3= Autre terre initialement +DynamicsCode.4= Terre humide initialement +DynamicsCode.5= Terre cultivée initialement +EarthApp.11=Collect Earth est déjà en cours d’exécution +EarthApp.21=Le fichier CSV/CED contenant les points est introuvable \:
+EarthApp.23=Aucun fichier CSV/CED spécifié \:

+EarthApp.24=Le fichier contenant le modèle de définition KML est introuvable \:
+EarthApp.26=Aucun modèle de définition spécifié\:

+EarthApp.27=Le fichier contenant le ballon HTML est introuvable \:
+EarthApp.29=Aucun ballon HTML spécifié \:

+EarthApp.30=Veuillez corriger le chemin d’accès dans le menu Outils -> Propriétés. +EarthApp.3=Rappelez le moi plus tard +EarthApp.4=Mettre a jour maintenant +EarthApp.57= Une nouvelle version de Collect Earth est disponible\! Utiliser le Menu +EarthApp.58=Alerte de mise à jour +EarthApp.59=Erreur pendant l’importation du fichier +EarthApp.5=Ne me le rappelez plus +EarthApp.61=Le fichier Collect Earth est introuvable br/>Veuillez-vous assurer que Google Earth est installé. EarthApp.6=\ - Version -EarthApp.70=ATENCION -EarthApp.71=En Mac OS X los archivos de proyectos de Collect Earth (*.cep) no se abren automaticamente al hacer doble-click sobre ellos.
-EarthApp.72=Utiliza la barra de herramientas de Collect Earth para abrir lo archivos .cep \: -EarthApp.73=Collect Earth en ordenadores Mac OS X -EarthSurveyService.9=Campo necesario -ExportActionListener.1=Elija la fecha desde la que exportar los datos -ExportDialogProcessMonitor.0=Procesando datos... -ExportDialogProcessMonitor.1=Esperando a la inicializacion del exportador \: -ExportDialogProcessMonitor.4=Registros exportados \: -ImportActionListener.0=¿Quiere importar los datos de las parcelas que no han sido completamente rellenadas? -ImportActionListener.2=Si hace click en NO se importarán solo los datos de las parcelas en el estado completo (verde)". -ImportActionListener.3=Importar registros incompletos -ImportDialogProcessMonitor.0=\ CALCULANDO -ImportDialogProcessMonitor.11=Cifra inicial the registros \: -ImportDialogProcessMonitor.2=Importando registros... -ImportDialogProcessMonitor.5=Cifra final de registros importados \: -ImportDialogProcessMonitor.8=Procesando datos... -ImportProcessMonitorDialog.0=Registros importados \: -ImportXMLDialogProcessMonitor.1 = Sobreescrivir las parcelas en BBDD -ImportXMLDialogProcessMonitor.2 = Importar solo parcelas sin conflictos -InfiniteProgressMonitor.0=Cancelar operación -JFileChooserExistsAware.0=Archivo de proyecto Collect Earth -KmlImportService.13=Seleccionar archivo CSV donde guardar las posiciones de las parcelas -MissingPlotsListener.0=Error cuando se estaba obteniendo información de las parcelas ausentes de la base de datos -MissingPlotsListener.10=Numero total de parcelas en el diseño de la muestra \: -MissingPlotsListener.12=Numero de parcelas que faltan \: -MissingPlotsListener.14=Todas las parcelas han sido rellenadas\! -MissingPlotsListener.1=Parcelas que faltan -MissingPlotsListener.2=Copiar contenidos -MissingPlotsListener.3=Elija los archivos que contienen informacion sobre las parcelas ( archivos .csv o .ced ) para los que desea averiguar si todos los datos se han rellenado. -MissingPlotsListener.4=Parcelas ausentes – informacion -MissingPlotsListener.5=Del archivo \: -MissingPlotsListener.6=Exportar a archivo CED -NO=No -NO_TO_ALL=No a todo -OpenTextFileListener.0=El archivo de texto no ha sido encontrado en \: -OptionWizard.0=Opciones de Collect Earth -OptionWizard.100=Abrir Planet -OptionWizard.101=Llave de la API de Planet +EarthApp.70=AVERTISSMENT +EarthApp.71=Sous Mac OS X, les fichiers de projet Collect Earth (* .cep) ne s'ouvriront pas dans Collect Earth lorsqu'ils sont double-cliqués.
+EarthApp.72=Utilisez la barre d'outils Collect Earth pour ouvrir les fichiers .cep \: +EarthApp.73=Collect Earth - problèmes sur les ordinateurs Mac OS X +EarthSurveyService.9=Champs requis +ExportActionListener.1=Choisir la date pour les données à exporter +ExportDialogProcessMonitor.0=Chargement des données... +ExportDialogProcessMonitor.1=Attente d'initialisation de l'export +ExportDialogProcessMonitor.4=Enregistrements exportés \: +ImportActionListener.0=Est-ce que les données pour les placettes qui ne sont pas complètes doivent être importées ? +ImportActionListener.2=Si vous cliquez sur NO, seulement les données provenant des placettes avec la marque « verte », qui contiennent toutes les données, seront importées +ImportActionListener.3=Importer les enregistrements incomplets +ImportDialogProcessMonitor.0=Calcul en cours +ImportDialogProcessMonitor.11=Nombre initial d' enregistrements \: +ImportDialogProcessMonitor.2=Chargement des enregistrements... +ImportDialogProcessMonitor.5=Nombre réel d'enregistrements importés\: +ImportDialogProcessMonitor.8=Chargement des données... +ImportProcessMonitorDialog.0=Enregistrements importés \: +ImportXMLDialogProcessMonitor.1 = Écraser les données dans la base de données +ImportXMLDialogProcessMonitor.2 = Importer uniquement des enregistrements non conflictuels +InfiniteProgressMonitor.0=Annuler l’opération +JFileChooserExistsAware.0=Fichier projet Collect Earth +KmlImportService.13=Sélectionnez un fichier CSV pour enregistrer les emplacements des parcelles +MissingPlotsListener.0=Erreur au cours de l’enregistrement des placettes absentes de la base de données +MissingPlotsListener.10=Nombre total de parcelles dans le plan d'échantillonnage \: +MissingPlotsListener.12=Nombre de parcelles manquantes \: +MissingPlotsListener.14=Toutes les parcelles sont remplis\! +MissingPlotsListener.1=Placettes manquantes +MissingPlotsListener.2=Copier le contenu sur le clipboard +MissingPlotsListener.3=Choisir les fichiers qui contiennent les informations des placettes (.csv ou .ced) pour lesquelles vous voulez savoir si toues les placettes ont été renseignées +MissingPlotsListener.4=Placettes manquantes – Information +MissingPlotsListener.5=Depuis le fichier \: +MissingPlotsListener.6=Exporter en CED +NO=Non +NO_TO_ALL=Non à tous +OpenTextFileListener.0=Le fichier texte n'a pas été trouvé dans \: +OptionWizard.0=Options Collect Earth +OptionWizard.100=Ouvrir Planet +OptionWizard.101=Clé API Planet OptionWizard.1021=URL SecureWatch -OptionWizard.102=Abrir Maxar SecureWatch (necesario tener licencia) -OptionWizard.103=Configurar la URL para el Mapa Extra (se abre cuando esta configurada) \: -OptionWizard.104=Navegadores -OptionWizard.105=Abrir Earth Map -OptionWizard.110=Usar las imagenes mensuales de NICFI -OptionWizard.10=Abrir carpeta de copias de seguridad -OptionWizard.11=Desconocido\: usar ipconfig -OptionWizard.12=Instancia cliente -OptionWizard.13=Collect Earth Server IP -OptionWizard.14=Collect Earth Server puerto (e.g. 8023) -OptionWizard.15=Guardar & aplicar cambios +OptionWizard.102=Ouvrir Maxar SecureWatch +OptionWizard.103=Définir le URL pour le Carte Extra (ouvre quand il est réglé) \: +OptionWizard.104=Navigateurs +OptionWizard.105=Ouvrir Earth Map +OptionWizard.110=Utiliser les images mensuelles fournies par NICFI +OptionWizard.10=Montrer les fichiers de sauvegarde +OptionWizard.11=Inconnu \: utiliser ifconfig +OptionWizard.12=Instance client +OptionWizard.13=IP Serveur de Collect Earth +OptionWizard.14=Port Serveur de Collect Earth (e.g. 8023) +OptionWizard.15=Appliquer et sauvegarder les changements OptionWizard.16=ID -OptionWizard.17=X-coord -OptionWizard.18=Y-coord -OptionWizard.19=Elevación -OptionWizard.1=Elija navegador -OptionWizard.20=Los contenidos de Google Earth han cambiado.
Acepte la recarga del contenido cuando Google Earth le pregunte. -OptionWizard.21=Actualizado con éxito -OptionWizard.22=Pendiente -OptionWizard.23=Hubo un error al reabrir los datos en Google Earth -OptionWizard.24=Cancelar -OptionWizard.25=Modo de operación -OptionWizard.26=BBDD servidor -OptionWizard.27=Esta no es una carpeta de un servido Saiku ( el archivo start-saiku.bat no esta presente) -OptionWizard.28=Servidor Saiku no reconocible -OptionWizard.29=BBDD puerto -OptionWizard.2=Tipo de uso (servidor/cliente) -OptionWizard.30=Opciones SQLite -OptionWizard.31=Datos de muestra -OptionWizard.32=Diseño de parcela -OptionWizard.33=Definición de la encuesta -OptionWizard.34=Servicios integrados -OptionWizard.35=Número de puntos de control -OptionWizard.36=Distancia entre los puntos de control (en metros) -OptionWizard.37=Margen con el borde de la parcela (en metros) -OptionWizard.38=El archivo CSV/CED no pudo leerse correctamente.
El formato del archivo de valores separados por comas ha de ser como este \:
-OptionWizard.39=ID,Y-Coordinada,X-Coordinada,Elevacion,pendiente,orientacion -OptionWizard.3=Servidor -OptionWizard.40=Proyectos -OptionWizard.41=Cargar un nuevo archivo de proyecto -OptionWizard.42=Error al cerrar el lector del CSV -OptionWizard.43=Nombre de la encuesta -OptionWizard.44=Guardar copia de seguridad de la base de datos en -OptionWizard.45=Abrir Google Earth Engine Playground (obsoleto) -OptionWizard.46=Abrir Google Earth Engine Timelapse -OptionWizard.47=Abrir Bing Maps -OptionWizard.48=Abrir encuesta en un navegador externo en lugar de Google Earth (recomendado para LINUX) -OptionWizard.49=Ruta del archivo ced/csv con las coordenadas de las parcelas -OptionWizard.4=IP de este ordenador\: -OptionWizard.50=Navegar... -OptionWizard.51=Error al importar el archivos del proyecto -OptionWizard.52=Archivo CSV/CED con coordenadas -OptionWizard.53=Sin puntos -OptionWizard.54=Punto central -OptionWizard.55=Error al importar el directorio del proyecto -OptionWizard.56=Cargar proyecto -OptionWizard.57=Proyectos ya cargados -OptionWizard.58=Abrir GEE Code Editor (requiere accesso como Trusted Tester) -OptionWizard.59=Abrir Here Maps -OptionWizard.5=Collect Earth Server puerto\: -OptionWizard.65=Ruta para la carpeta de Saiku -OptionWizard.66=Navegar... -OptionWizard.67=Ruta del ejecutable de Firefox -OptionWizard.68=Navegar... -OptionWizard.6=Parámetros BD PostgreSQL -OptionWizard.70=Archivos ejecutables -OptionWizard.72=Archivos binarios -OptionWizard.73=Ruta del ejecutable de Chrome -OptionWizard.74=Navegar... -OptionWizard.76=Archivos ejecutables -OptionWizard.78=Archivos binarios -OptionWizard.79=Ruta a la plantilla KML de Freemarker -OptionWizard.7=Nombre de usuario -OptionWizard.80=Navegar... -OptionWizard.82=Plantilla Freemarker -OptionWizard.83=Ruta al formulario HTML -OptionWizard.84=Navegar... -OptionWizard.86=Pagina web HTML -OptionWizard.87=Ruta al XML con la definición del IDM -OptionWizard.88=Navegar... -OptionWizard.8=Password -OptionWizard.90=Definición XML IDM -OptionWizard.91=Servidor (versión para el gerente o para uso autónomo) -OptionWizard.92=Cliente (operador/conectado al servidor) -OptionWizard.93=SQLite (Embebida/basada en un único archivo) +OptionWizard.17=Coord-X +OptionWizard.18=Coord-Y +OptionWizard.19=Altitude +OptionWizard.1=Choisir un navigateur +OptionWizard.20= Le contenu de Google Earth a changé
Veuillez accepter la mise à jour quand GE le demande +OptionWizard.21=Mise à jour réussie +OptionWizard.22=Pente +OptionWizard.23=Il y a eu une erreur pendant la réouverture de Google Earth +OptionWizard.24=Annuler +OptionWizard.25=Mode opération +OptionWizard.26=Hôte pour la BDD +OptionWizard.27=Le dossier n'est pas valide (il manque le fichier start-saiku.bat) +OptionWizard.28=Le dossier Saiku n'est pas reconnu +OptionWizard.29=Port pour la BDD +OptionWizard.2=Flux (serveur/client) +OptionWizard.30=Options SQLite +OptionWizard.31=Points d'échantillonnage +OptionWizard.32=Configuration de la parcelle +OptionWizard.33=Définition de l'enquête +OptionWizard.34=Services intégrés +OptionWizard.35=Nombre de points de contrôle +OptionWizard.36=Distance entre les points de contrôle (en mètres) +OptionWizard.37=Distance au bord de la parcelle (en mètres) +OptionWizard.38=Le Fichier CSV/CED ne peut pas être lu
Le fichier devrait avoir des valeurs séparées par des virgules comme ceci \:
+OptionWizard.39=ID,Coordonnée_Y, Coordonnée_X,altitude,pente,orientation +OptionWizard.3=Instance serveur +OptionWizard.40=Projets +OptionWizard.41=Charger un nouveau fichier projet +OptionWizard.42=Erreur pendant la fermeture du lecteur CSV +OptionWizard.43=Nom de l'enquête +OptionWizard.44=Sauvegarder automatiquement la base dans +OptionWizard.45=Ouvrir Earth Engine Playground (obsolète) +OptionWizard.46=Ouvrir le Timelapse de Google Earth Engine +OptionWizard.47=Ouvrir Bing Maps +OptionWizard.48=Ouvrir le formulaire dans un navigateur plutôt que dans GE (recommandé pour Linux) +OptionWizard.49=Chemin jusqu'au fichier ced/csv avec les données des parcelles +OptionWizard.4=IP actuelle de l'ordinateur +OptionWizard.50=Parcourir +OptionWizard.51=Erreur pendant l'importation du fichier +OptionWizard.52=Fichier CSV/CED uniquement avec des coordonnées +OptionWizard.53=Pas de points +OptionWizard.54=Point central +OptionWizard.55=Erreur pendant l'importation du dossier projet +OptionWizard.56=Charger le projet +OptionWizard.57=Projets chargés précedemment +OptionWizard.58=Ouvrir GEE Code Editor (nécessite un accès restreint Trusted Tester) +OptionWizard.59=Ouvrir Here Maps +OptionWizard.5=Port Serveur Collect Earth \: +OptionWizard.65=Chemin jusqu'au serveur Saiku +OptionWizard.66=Parcourir +OptionWizard.67=Chemin jusqu'à Firefox +OptionWizard.68=Parcourir +OptionWizard.6=Paramètres de la BD PostGreSQL +OptionWizard.70=Fichiers exécutables +OptionWizard.72=Fichiers binaires +OptionWizard.73=Chemin jusqu'à Chrome +OptionWizard.74=Parcourir +OptionWizard.76=Fichiers exécutables +OptionWizard.78=Fichiers binaires +OptionWizard.79=Chemin jusqu'au modèle Freemarker KML +OptionWizard.7=Nom d'utilisateur +OptionWizard.80=Parcourir +OptionWizard.82=Modèle Freemarker +OptionWizard.83=Chemin jusqu'au Ballon HTML +OptionWizard.84=Parcourir +OptionWizard.86=Page web HTML +OptionWizard.87=Chemin jusqu'au fichier XML contenant la définition IDM +OptionWizard.88=Parcourir +OptionWizard.8=Mot de passe +OptionWizard.90=Définition IDM XML +OptionWizard.91=Serveur (version gestionnaire ou autonome) +OptionWizard.92=Client (opérateur/connecté au serveur) +OptionWizard.93=SQLite (Fichier intégré / Unique) OptionWizard.94=PostgreSQL -OptionWizard.95=Lado del punto de sampleo (en metros) -OptionWizard.9=Nombre de la Base de Datos -ProcessMonitorDialog.1=Error de interpretacion en la fila -ProcessMonitorDialog.4=, columnas -ProcessMonitorDialog.5=\ -- valores -SaikuAnalysisListener.0=Si - Actualizar datos de Saiku (proceso de larga duracion) -SaikuAnalysisListener.1=No - Usar los mismos datos de la ultima vez que se usó Saiku -SaikuStarter.1=Iniciando Saiku -SaikuStarter.2=Iniciar Saiku puede tomar varios minutos, espere por favor.\! -SaikuToolExportListener.1=Generación herramienta Saiku -SaikuToolExportListener.2=Generando la herramienta Saiku que incluye la base de datos -SaveEarthDataServlet.0=Sin datos -SaveEarthDataServlet.1=Problemas al guardar los datos en la Base de Datos -SaveEarthDataServlet.2=Los datos se han guardado -SlopeCode.0=Llano (0-5) -YES=Si -YES_TO_ALL=Si a todo \ No newline at end of file +OptionWizard.95=Côté des points d'échantillonnage (en mètres) +OptionWizard.9=Nom de la base +ProcessMonitorDialog.1=Erreur d’interprétation sur numéro de rangée +ProcessMonitorDialog.4=, colonnes +ProcessMonitorDialog.5=\ -- valeures +SaikuAnalysisListener.0=Oui - Rafraichir les données Saiku (processus long) +SaikuAnalysisListener.1=Non - Utiliser la même version des données que la dernière fois que Saiku a été utilisé +SaikuToolExportListener.1=Génération de l'outil Saiku +SaikuToolExportListener.2=Génération de l'outil Saiku avec la base de données actuelle +SaikuStarter.1=Démarrer Saïku +SaikuStarter.2=Démarrer Saïku peut prendre plusieurs minutes, veuillez patienter\! +SaveEarthDataServlet.0=Requête vide +SaveEarthDataServlet.1=Problème lors de la sauvegarde de la base de données +SaveEarthDataServlet.2=Les données ont été sauvées +SlopeCode.0=Plan (0-5) +YES=Oui +YES_TO_ALL=Oui à tous \ No newline at end of file From e97e592760dd929541c33dd050b3503e2e20637d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:35:42 +0100 Subject: [PATCH 0803/1620] New translations Messages_fr.properties (Portuguese) --- .../earth/app/view/Messages_pt.properties | 497 +++++++++--------- 1 file changed, 249 insertions(+), 248 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index efdb0acb96..5199a9b624 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,254 +1,255 @@ -AboutDialog.19=Problemas al abrir -AboutDialog.5=Para mas informacion visite nuestra web OpenForis.org -AboutDialog.6=Lo sentimos, hemos tenido un problema al intentar abrir el link en su navegador standard. +AboutDialog.19=UN problème est apparu +AboutDialog.5=Pour plus d’infos, visitez notre site web OpenForis.org +AboutDialog.6=Désolé, il y a eu un problème lors de l’ouverture du lien avec votre navigateur par défaut. AboutDialog.8=Ok -AspectCode.0=Norte -AspectCode.1=Noreste -AspectCode.2=Este -AspectCode.3=Sureste -AspectCode.4=Sur -AspectCode.5=Suroeste -AspectCode.6=Oeste -AspectCode.7=Noroeste -CollectEarthMenu.0=Importar archivo CEP -CollectEarthMenu.2=Utilidades -CollectEarthMenu.3=Dividir archivos de parcelas CSV grandes -CollectEarthMenu.4=Exportar datos a XML (desde una fecha especifica hasta este momento) -CollectEarthMenu.5=Exportar a Collect Backup -CollectEarthMenu.6=Exportar datos como Collect Backup (todos los datos) -CollectEarthMenu.7=Exportar datos como Collect Backup (filtrar por atributo ) -CollectEarthWindow.0=Error al intentar exportar los datos a un archivo CSV -CollectEarthWindow.10=Archivo -CollectEarthWindow.11=Cerrar -CollectEarthWindow.12=Herramientas -CollectEarthWindow.13=Descargar datos a CSV (Excel) -CollectEarthWindow.14=Comenzar análisis con Saiku -CollectEarthWindow.15=Propiedades -CollectEarthWindow.16=Ayuda -CollectEarthWindow.17=Declaración -CollectEarthWindow.18=Encontrar parcelas ausentes de la Base de Datos +AspectCode.0=Nord +AspectCode.1=Nord-Est +AspectCode.2=Est +AspectCode.3=Sud-Est +AspectCode.4=Sud +AspectCode.5=Sud-Ouest +AspectCode.6=Ouest +AspectCode.7=Nord-Ouest +CollectEarthMenu.0=Importe le fichier .CEP +CollectEarthMenu.2=Utilitaires +CollectEarthMenu.3=Divise un large tableau CSV en plusieurs parties +CollectEarthMenu.4=Exporte les données en XML (à partir d'une date précise jusqu'à aujourd'hui) +CollectEarthMenu.5=Exporte sur la sauvegarde Collect Backup +CollectEarthMenu.6=Exporte les données en tant que sauvegarde Collect Backup (toutes les données) +CollectEarthMenu.7=Exporte les données en tant que sauvegarde Collect Backup (à partir de) +CollectEarthMenu.8=Exporte les données en XML (filtrer par attribut) +CollectEarthWindow.0=Erreur pendant l'exportation des données en csv +CollectEarthWindow.10=Fichier +CollectEarthWindow.11=Quitter +CollectEarthWindow.12=Outils +CollectEarthWindow.13=Télécharger les données en CSV (Excel) +CollectEarthWindow.14=Démarrer l'analyse avec Saïku +CollectEarthWindow.15=Propriétés +CollectEarthWindow.16=Aide +CollectEarthWindow.17=Avertissement +CollectEarthWindow.18=Trouver les placettes manquantes dans la base de données CollectEarthWindow.19=Collect Earth -CollectEarthWindow.1=Error al exportar -CollectEarthWindow.20=Número de registros repetidos\: -CollectEarthWindow.21=No se pudo encontrar el icono de la ventana principal -CollectEarthWindow.22=¿Seguro que quieres cerrar Collect Earth?
El servidor de Collect Earth terminara al cerrar la ventana -CollectEarthWindow.23=Necesita confirmación -CollectEarthWindow.24=Exportar a XML -CollectEarthWindow.25=¿Quiere importar estos registros de todas formas y perder sus datos actuales? -CollectEarthWindow.26=Operador -CollectEarthWindow.27=Actualizar -CollectEarthWindow.28=El servidor Open Foris Collect Earth debe estar en funcionamiento mientras el operador esta realizando su trabajo. -CollectEarthWindow.29=El servidor Saiku no ha sido configurado. -CollectEarthWindow.2=Idioma -CollectEarthWindow.30=Por favor, mantenga esta ventana abierta mientras este utilizando Google Earth. -CollectEarthWindow.31=Exportar los datos como archivos CSV -CollectEarthWindow.32=Salir -CollectEarthWindow.33=El nombre del operador ha de ser mas largo que cinco caracteres y mas corto que 50 -CollectEarthWindow.34=Error de validación -CollectEarthWindow.35=\!NOMBRE DEL OPERADOR VACIO\!
Rellene el campo del nombre del operador y presione el botón de "Actualizar". -CollectEarthWindow.36=El nombre del operador no puede estar vacío -CollectEarthWindow.37=Conservar abierto -CollectEarthWindow.38=Archivos CSV -CollectEarthWindow.39=ATENCION\: Recomendamos que guarde una copia de seguridad de sus datos actuales (expórtelos a XML) antes de importar los nuevos datos. -CollectEarthWindow.3=\ Error al importar datos -CollectEarthWindow.40=Configure la ruta a la carpeta donde el servidor Saiku ha sido instalado en Herramientas->Propiedades->Avanzadas. -CollectEarthWindow.41=Guardando los datos en el archivo\: -CollectEarthWindow.42=Terminar -CollectEarthWindow.43=Detectados registros repetidos -CollectEarthWindow.44=Importar/Exportar datos -CollectEarthWindow.45=Exportar datos en XML (comprimidos) -CollectEarthWindow.46=Importar nuevos datos desde ZIP (XML comprimidos) -CollectEarthWindow.47=Servidor Saiku no configurado -CollectEarthWindow.48=Archivos zip/collect-data -CollectEarthWindow.49=Archivos Fusion CSV -CollectEarthWindow.4=Exención de responsabilidad de FAO -CollectEarthWindow.50=Abrir Manual de Usuario -CollectEarthWindow.51=Comprobar si hay actualizaciones de Collect Earth -CollectEarthWindow.52=Abrir el archivo de registo de la aplicacion -CollectEarthWindow.53=Archivo de registro de Collect Earth -CollectEarthWindow.54=Cargar puntos desde KML -CollectEarthWindow.55=Actualizar datos ya registrados desde CSV -CollectEarthWindow.56=Mas informacion... -CollectEarthWindow.57=El proceso para comenzar Saiku esta ejecutandose todavia, espere unos minutos. -CollectEarthWindow.58=No se pudo iniciar el analisis con Saiku -CollectEarthWindow.59=¿Quiere volver a generar los datos para el analisis de Saiku?
Este proceso puede tomar varios minutos.
Si hace click en "SI" los datos mas actuales seran generados. -CollectEarthWindow.5=Cerrar -CollectEarthWindow.60=Generación de datos para Saiku -CollectEarthWindow.61=Exportar a XML (solo los registros anadidos/modificados) -CollectEarthWindow.62=Mas informacion.. -CollectEarthWindow.63=Error leyendo los puntos desde el KML -CollectEarthWindow.64=Soporte tecnico -CollectEarthWindow.65=Se ha cambido el nombre del operador -CollectEarthWindow.66=Cambio de operador -CollectEarthWindow.67=Abrir directorio de datos de CE -CollectEarthWindow.6=Exportar datos a Fusion Table -CollectEarthWindow.70=Abrir el manual de esta encuesta -CollectEarthWindow.71=Generar herramienta Saiku independiente -CollectEarthWindow.7=Error al importar los datos -CollectEarthWindow.8=No se pudo encontrar el testo de exención de responsabilidad -CollectEarthWindow.9=Los datos importados contienen registros que ya están presentes en su base de datos -DynamicsCode.0=Inicialmente Bosque -DynamicsCode.1=Inicialmente Pastizal -DynamicsCode.2=Inicialmente Asentamiento -DynamicsCode.3=Inicialmente Otras tierras -DynamicsCode.4=Inicialmente Humedal -DynamicsCode.5=Inicialmente Cultivo -EarthApp.11=Collect Earth ya está ejecutandose -EarthApp.21=El archivo CSV/CED que contiene el diseño de la malla de puntos no se encuentra en la ruta seleccionada \:
-EarthApp.23=No se ha configurado ningun archivo de puntos CSV/CED \:

-EarthApp.24=El archivo que contiene la plantilla de Freemarker con la definicion del KML no se encuntra en la ruta seleccionada \:
-EarthApp.26=No se ha configurado ninguna archivo con la definicion del KML \:

-EarthApp.27=El archivo que contiene el formulario del pop-up en HTMl no se ha encontrado en la ruta seleccionada \:
-EarthApp.29=No se ha configurado ningun HTML de configuracion del pop-up \:

-EarthApp.30=Corrija la localizacion del archivo a traves del menu Herramientas->Propiedades. -EarthApp.3=Recordarme mas tarde -EarthApp.4=Actualizar Ahora -EarthApp.57=Hay una nueva version de Collect Earth disponible\! -EarthApp.58=Alerta para actualizacion -EarthApp.59=Error al importar el archivo del proyecto -EarthApp.5=No recordarme otra vez -EarthApp.61=El archivo KMZ generado por Collect Earth no se pudo abrir.
Asegurese de que Google Earth esta instalado. +CollectEarthWindow.1=Erreur d'exportation +CollectEarthWindow.20=Nombre d'enregistrements dupliqués +CollectEarthWindow.21=Icône non trouvée +CollectEarthWindow.22= Êtes-vous sûr de vouloir fermer CollectEarth
Fermer cette fenêtre fermera aussi le serveur +CollectEarthWindow.23=Confirmation requise +CollectEarthWindow.24=Exporter en XML +CollectEarthWindow.25=Voulez-vous ajouter tout de même ces données et perdre vos enregistrements? +CollectEarthWindow.26=Utilisateur +CollectEarthWindow.27=Appliquer +CollectEarthWindow.28=Le serveur devrait être démarré pour la saisie des données par les utilisateurs. +CollectEarthWindow.29=Le serveur Saiku n'est pas configuré. +CollectEarthWindow.2=Langue +CollectEarthWindow.30=Veuillez garder cette fenêtre active pendant que vous utilisez Google Earth +CollectEarthWindow.31=Exporter les données collectées en CSV +CollectEarthWindow.32=Fermer +CollectEarthWindow.33=Le nom de l'utilisateur doit comprendre entre 5 et 50 caractères +CollectEarthWindow.34=Erreur de validation +CollectEarthWindow.35= NOM DE L'UTILISATEUR VIDE\!
Veuillez renseigner le champs et Appuyer sur "Mise à jour" +CollectEarthWindow.36=Le nom de l'utilisateur ne peut pas être vide +CollectEarthWindow.37=Laisser ouvert +CollectEarthWindow.38=Fichiers CSV +CollectEarthWindow.39=NOTE \: Il est conseillé de sauvegarder vos données (export en XML) avant d'importer de nouvelles données +CollectEarthWindow.3=\ Erreur pendant l'importation +CollectEarthWindow.40=Renseigner le chemin jusqu'au serveur Saiku dans /Outils/Propriétés/Avancé. +CollectEarthWindow.41=Sauvegarde des données exportées dans le fichier\: +CollectEarthWindow.42=Quitter +CollectEarthWindow.43=Enregistrements conflictuels trouvés +CollectEarthWindow.44=Importer/Exporter les données +CollectEarthWindow.45=Exporter les données en XML (zippé) +CollectEarthWindow.46=Importer de nouvelles données depuis ZIP (XML zippé) +CollectEarthWindow.47=Le serveur Saiku n'est pas configuré +CollectEarthWindow.48=Fichier zip/collect-data +CollectEarthWindow.49=Fusion des fichiers CSV +CollectEarthWindow.4=Clause de non-responsabilité de la FAO +CollectEarthWindow.50=Ouvrir le manuel utilisateur +CollectEarthWindow.51=Vérifier les mises à jour des Collect Earth +CollectEarthWindow.52=Fichier de logs Open Application +CollectEarthWindow.53=Fichier de logs Collect Earth +CollectEarthWindow.54=Charger les points de KML +CollectEarthWindow.55=Mettre à jour les enregistrements en utilisant un fichier CSV +CollectEarthWindow.56=A propos... +CollectEarthWindow.57=Le processus de démarrage de Saïku est en cours, veuillez patienter +CollectEarthWindow.58=Impossible de démarrer l'analyse avec Saïku +CollectEarthWindow.59=Voulez-vous régénérer le jeu de données?
Cela peut prendre du temps.
Cliquer sur oui pour régénérer un nouveau jeu de données avec les dernières informations +CollectEarthWindow.5=Fermer +CollectEarthWindow.60=Génération des données Saïku +CollectEarthWindow.61=Exporter en XML (uniquement les enregistrements modifiés/ajoutés) +CollectEarthWindow.62=A propos… +CollectEarthWindow.63=Erreur en accédant aux points de KML +CollectEarthWindow.64=Assistance technique +CollectEarthWindow.65=Le nom de l'opérateur a été changé +CollectEarthWindow.66=Nom de l'opérateur +CollectEarthWindow.67=Ouvrir le dossier de données de CE +CollectEarthWindow.6=Exporter en Table de Fusion +CollectEarthWindow.70=Ouvrez le manuel de cette enquête +CollectEarthWindow.71=Générer un outil Saiku autonome +CollectEarthWindow.7=Erreur pendant l'importation des données +CollectEarthWindow.8=Le texte est introuvable +CollectEarthWindow.9=Les données importées contiennent des redondances avec celles présentes dans la base +DynamicsCode.0= Terre Forestière initialement +DynamicsCode.1= Prairie initialement +DynamicsCode.2= Etablissement initialement +DynamicsCode.3= Autre terre initialement +DynamicsCode.4= Terre humide initialement +DynamicsCode.5= Terre cultivée initialement +EarthApp.11=Collect Earth est déjà en cours d’exécution +EarthApp.21=Le fichier CSV/CED contenant les points est introuvable \:
+EarthApp.23=Aucun fichier CSV/CED spécifié \:

+EarthApp.24=Le fichier contenant le modèle de définition KML est introuvable \:
+EarthApp.26=Aucun modèle de définition spécifié\:

+EarthApp.27=Le fichier contenant le ballon HTML est introuvable \:
+EarthApp.29=Aucun ballon HTML spécifié \:

+EarthApp.30=Veuillez corriger le chemin d’accès dans le menu Outils -> Propriétés. +EarthApp.3=Rappelez le moi plus tard +EarthApp.4=Mettre a jour maintenant +EarthApp.57= Une nouvelle version de Collect Earth est disponible\! Utiliser le Menu +EarthApp.58=Alerte de mise à jour +EarthApp.59=Erreur pendant l’importation du fichier +EarthApp.5=Ne me le rappelez plus +EarthApp.61=Le fichier Collect Earth est introuvable br/>Veuillez-vous assurer que Google Earth est installé. EarthApp.6=\ - Version -EarthApp.70=ATENCION -EarthApp.71=En Mac OS X los archivos de proyectos de Collect Earth (*.cep) no se abren automaticamente al hacer doble-click sobre ellos.
-EarthApp.72=Utiliza la barra de herramientas de Collect Earth para abrir lo archivos .cep \: -EarthApp.73=Collect Earth en ordenadores Mac OS X -EarthSurveyService.9=Campo necesario -ExportActionListener.1=Elija la fecha desde la que exportar los datos -ExportDialogProcessMonitor.0=Procesando datos... -ExportDialogProcessMonitor.1=Esperando a la inicializacion del exportador \: -ExportDialogProcessMonitor.4=Registros exportados \: -ImportActionListener.0=¿Quiere importar los datos de las parcelas que no han sido completamente rellenadas? -ImportActionListener.2=Si hace click en NO se importarán solo los datos de las parcelas en el estado completo (verde)". -ImportActionListener.3=Importar registros incompletos -ImportDialogProcessMonitor.0=\ CALCULANDO -ImportDialogProcessMonitor.11=Cifra inicial the registros \: -ImportDialogProcessMonitor.2=Importando registros... -ImportDialogProcessMonitor.5=Cifra final de registros importados \: -ImportDialogProcessMonitor.8=Procesando datos... -ImportProcessMonitorDialog.0=Registros importados \: -ImportXMLDialogProcessMonitor.1 = Sobreescrivir las parcelas en BBDD -ImportXMLDialogProcessMonitor.2 = Importar solo parcelas sin conflictos -InfiniteProgressMonitor.0=Cancelar operación -JFileChooserExistsAware.0=Archivo de proyecto Collect Earth -KmlImportService.13=Seleccionar archivo CSV donde guardar las posiciones de las parcelas -MissingPlotsListener.0=Error cuando se estaba obteniendo información de las parcelas ausentes de la base de datos -MissingPlotsListener.10=Numero total de parcelas en el diseño de la muestra \: -MissingPlotsListener.12=Numero de parcelas que faltan \: -MissingPlotsListener.14=Todas las parcelas han sido rellenadas\! -MissingPlotsListener.1=Parcelas que faltan -MissingPlotsListener.2=Copiar contenidos -MissingPlotsListener.3=Elija los archivos que contienen informacion sobre las parcelas ( archivos .csv o .ced ) para los que desea averiguar si todos los datos se han rellenado. -MissingPlotsListener.4=Parcelas ausentes – informacion -MissingPlotsListener.5=Del archivo \: -MissingPlotsListener.6=Exportar a archivo CED -NO=No -NO_TO_ALL=No a todo -OpenTextFileListener.0=El archivo de texto no ha sido encontrado en \: -OptionWizard.0=Opciones de Collect Earth -OptionWizard.100=Abrir Planet -OptionWizard.101=Llave de la API de Planet +EarthApp.70=AVERTISSMENT +EarthApp.71=Sous Mac OS X, les fichiers de projet Collect Earth (* .cep) ne s'ouvriront pas dans Collect Earth lorsqu'ils sont double-cliqués.
+EarthApp.72=Utilisez la barre d'outils Collect Earth pour ouvrir les fichiers .cep \: +EarthApp.73=Collect Earth - problèmes sur les ordinateurs Mac OS X +EarthSurveyService.9=Champs requis +ExportActionListener.1=Choisir la date pour les données à exporter +ExportDialogProcessMonitor.0=Chargement des données... +ExportDialogProcessMonitor.1=Attente d'initialisation de l'export +ExportDialogProcessMonitor.4=Enregistrements exportés \: +ImportActionListener.0=Est-ce que les données pour les placettes qui ne sont pas complètes doivent être importées ? +ImportActionListener.2=Si vous cliquez sur NO, seulement les données provenant des placettes avec la marque « verte », qui contiennent toutes les données, seront importées +ImportActionListener.3=Importer les enregistrements incomplets +ImportDialogProcessMonitor.0=Calcul en cours +ImportDialogProcessMonitor.11=Nombre initial d' enregistrements \: +ImportDialogProcessMonitor.2=Chargement des enregistrements... +ImportDialogProcessMonitor.5=Nombre réel d'enregistrements importés\: +ImportDialogProcessMonitor.8=Chargement des données... +ImportProcessMonitorDialog.0=Enregistrements importés \: +ImportXMLDialogProcessMonitor.1 = Écraser les données dans la base de données +ImportXMLDialogProcessMonitor.2 = Importer uniquement des enregistrements non conflictuels +InfiniteProgressMonitor.0=Annuler l’opération +JFileChooserExistsAware.0=Fichier projet Collect Earth +KmlImportService.13=Sélectionnez un fichier CSV pour enregistrer les emplacements des parcelles +MissingPlotsListener.0=Erreur au cours de l’enregistrement des placettes absentes de la base de données +MissingPlotsListener.10=Nombre total de parcelles dans le plan d'échantillonnage \: +MissingPlotsListener.12=Nombre de parcelles manquantes \: +MissingPlotsListener.14=Toutes les parcelles sont remplis\! +MissingPlotsListener.1=Placettes manquantes +MissingPlotsListener.2=Copier le contenu sur le clipboard +MissingPlotsListener.3=Choisir les fichiers qui contiennent les informations des placettes (.csv ou .ced) pour lesquelles vous voulez savoir si toues les placettes ont été renseignées +MissingPlotsListener.4=Placettes manquantes – Information +MissingPlotsListener.5=Depuis le fichier \: +MissingPlotsListener.6=Exporter en CED +NO=Non +NO_TO_ALL=Non à tous +OpenTextFileListener.0=Le fichier texte n'a pas été trouvé dans \: +OptionWizard.0=Options Collect Earth +OptionWizard.100=Ouvrir Planet +OptionWizard.101=Clé API Planet OptionWizard.1021=URL SecureWatch -OptionWizard.102=Abrir Maxar SecureWatch (necesario tener licencia) -OptionWizard.103=Configurar la URL para el Mapa Extra (se abre cuando esta configurada) \: -OptionWizard.104=Navegadores -OptionWizard.105=Abrir Earth Map -OptionWizard.110=Usar las imagenes mensuales de NICFI -OptionWizard.10=Abrir carpeta de copias de seguridad -OptionWizard.11=Desconocido\: usar ipconfig -OptionWizard.12=Instancia cliente -OptionWizard.13=Collect Earth Server IP -OptionWizard.14=Collect Earth Server puerto (e.g. 8023) -OptionWizard.15=Guardar & aplicar cambios +OptionWizard.102=Ouvrir Maxar SecureWatch +OptionWizard.103=Définir le URL pour le Carte Extra (ouvre quand il est réglé) \: +OptionWizard.104=Navigateurs +OptionWizard.105=Ouvrir Earth Map +OptionWizard.110=Utiliser les images mensuelles fournies par NICFI +OptionWizard.10=Montrer les fichiers de sauvegarde +OptionWizard.11=Inconnu \: utiliser ifconfig +OptionWizard.12=Instance client +OptionWizard.13=IP Serveur de Collect Earth +OptionWizard.14=Port Serveur de Collect Earth (e.g. 8023) +OptionWizard.15=Appliquer et sauvegarder les changements OptionWizard.16=ID -OptionWizard.17=X-coord -OptionWizard.18=Y-coord -OptionWizard.19=Elevación -OptionWizard.1=Elija navegador -OptionWizard.20=Los contenidos de Google Earth han cambiado.
Acepte la recarga del contenido cuando Google Earth le pregunte. -OptionWizard.21=Actualizado con éxito -OptionWizard.22=Pendiente -OptionWizard.23=Hubo un error al reabrir los datos en Google Earth -OptionWizard.24=Cancelar -OptionWizard.25=Modo de operación -OptionWizard.26=BBDD servidor -OptionWizard.27=Esta no es una carpeta de un servido Saiku ( el archivo start-saiku.bat no esta presente) -OptionWizard.28=Servidor Saiku no reconocible -OptionWizard.29=BBDD puerto -OptionWizard.2=Tipo de uso (servidor/cliente) -OptionWizard.30=Opciones SQLite -OptionWizard.31=Datos de muestra -OptionWizard.32=Diseño de parcela -OptionWizard.33=Definición de la encuesta -OptionWizard.34=Servicios integrados -OptionWizard.35=Número de puntos de control -OptionWizard.36=Distancia entre los puntos de control (en metros) -OptionWizard.37=Margen con el borde de la parcela (en metros) -OptionWizard.38=El archivo CSV/CED no pudo leerse correctamente.
El formato del archivo de valores separados por comas ha de ser como este \:
-OptionWizard.39=ID,Y-Coordinada,X-Coordinada,Elevacion,pendiente,orientacion -OptionWizard.3=Servidor -OptionWizard.40=Proyectos -OptionWizard.41=Cargar un nuevo archivo de proyecto -OptionWizard.42=Error al cerrar el lector del CSV -OptionWizard.43=Nombre de la encuesta -OptionWizard.44=Guardar copia de seguridad de la base de datos en -OptionWizard.45=Abrir Google Earth Engine Playground (obsoleto) -OptionWizard.46=Abrir Google Earth Engine Timelapse -OptionWizard.47=Abrir Bing Maps -OptionWizard.48=Abrir encuesta en un navegador externo en lugar de Google Earth (recomendado para LINUX) -OptionWizard.49=Ruta del archivo ced/csv con las coordenadas de las parcelas -OptionWizard.4=IP de este ordenador\: -OptionWizard.50=Navegar... -OptionWizard.51=Error al importar el archivos del proyecto -OptionWizard.52=Archivo CSV/CED con coordenadas -OptionWizard.53=Sin puntos -OptionWizard.54=Punto central -OptionWizard.55=Error al importar el directorio del proyecto -OptionWizard.56=Cargar proyecto -OptionWizard.57=Proyectos ya cargados -OptionWizard.58=Abrir GEE Code Editor (requiere accesso como Trusted Tester) -OptionWizard.59=Abrir Here Maps -OptionWizard.5=Collect Earth Server puerto\: -OptionWizard.65=Ruta para la carpeta de Saiku -OptionWizard.66=Navegar... -OptionWizard.67=Ruta del ejecutable de Firefox -OptionWizard.68=Navegar... -OptionWizard.6=Parámetros BD PostgreSQL -OptionWizard.70=Archivos ejecutables -OptionWizard.72=Archivos binarios -OptionWizard.73=Ruta del ejecutable de Chrome -OptionWizard.74=Navegar... -OptionWizard.76=Archivos ejecutables -OptionWizard.78=Archivos binarios -OptionWizard.79=Ruta a la plantilla KML de Freemarker -OptionWizard.7=Nombre de usuario -OptionWizard.80=Navegar... -OptionWizard.82=Plantilla Freemarker -OptionWizard.83=Ruta al formulario HTML -OptionWizard.84=Navegar... -OptionWizard.86=Pagina web HTML -OptionWizard.87=Ruta al XML con la definición del IDM -OptionWizard.88=Navegar... -OptionWizard.8=Password -OptionWizard.90=Definición XML IDM -OptionWizard.91=Servidor (versión para el gerente o para uso autónomo) -OptionWizard.92=Cliente (operador/conectado al servidor) -OptionWizard.93=SQLite (Embebida/basada en un único archivo) +OptionWizard.17=Coord-X +OptionWizard.18=Coord-Y +OptionWizard.19=Altitude +OptionWizard.1=Choisir un navigateur +OptionWizard.20= Le contenu de Google Earth a changé
Veuillez accepter la mise à jour quand GE le demande +OptionWizard.21=Mise à jour réussie +OptionWizard.22=Pente +OptionWizard.23=Il y a eu une erreur pendant la réouverture de Google Earth +OptionWizard.24=Annuler +OptionWizard.25=Mode opération +OptionWizard.26=Hôte pour la BDD +OptionWizard.27=Le dossier n'est pas valide (il manque le fichier start-saiku.bat) +OptionWizard.28=Le dossier Saiku n'est pas reconnu +OptionWizard.29=Port pour la BDD +OptionWizard.2=Flux (serveur/client) +OptionWizard.30=Options SQLite +OptionWizard.31=Points d'échantillonnage +OptionWizard.32=Configuration de la parcelle +OptionWizard.33=Définition de l'enquête +OptionWizard.34=Services intégrés +OptionWizard.35=Nombre de points de contrôle +OptionWizard.36=Distance entre les points de contrôle (en mètres) +OptionWizard.37=Distance au bord de la parcelle (en mètres) +OptionWizard.38=Le Fichier CSV/CED ne peut pas être lu
Le fichier devrait avoir des valeurs séparées par des virgules comme ceci \:
+OptionWizard.39=ID,Coordonnée_Y, Coordonnée_X,altitude,pente,orientation +OptionWizard.3=Instance serveur +OptionWizard.40=Projets +OptionWizard.41=Charger un nouveau fichier projet +OptionWizard.42=Erreur pendant la fermeture du lecteur CSV +OptionWizard.43=Nom de l'enquête +OptionWizard.44=Sauvegarder automatiquement la base dans +OptionWizard.45=Ouvrir Earth Engine Playground (obsolète) +OptionWizard.46=Ouvrir le Timelapse de Google Earth Engine +OptionWizard.47=Ouvrir Bing Maps +OptionWizard.48=Ouvrir le formulaire dans un navigateur plutôt que dans GE (recommandé pour Linux) +OptionWizard.49=Chemin jusqu'au fichier ced/csv avec les données des parcelles +OptionWizard.4=IP actuelle de l'ordinateur +OptionWizard.50=Parcourir +OptionWizard.51=Erreur pendant l'importation du fichier +OptionWizard.52=Fichier CSV/CED uniquement avec des coordonnées +OptionWizard.53=Pas de points +OptionWizard.54=Point central +OptionWizard.55=Erreur pendant l'importation du dossier projet +OptionWizard.56=Charger le projet +OptionWizard.57=Projets chargés précedemment +OptionWizard.58=Ouvrir GEE Code Editor (nécessite un accès restreint Trusted Tester) +OptionWizard.59=Ouvrir Here Maps +OptionWizard.5=Port Serveur Collect Earth \: +OptionWizard.65=Chemin jusqu'au serveur Saiku +OptionWizard.66=Parcourir +OptionWizard.67=Chemin jusqu'à Firefox +OptionWizard.68=Parcourir +OptionWizard.6=Paramètres de la BD PostGreSQL +OptionWizard.70=Fichiers exécutables +OptionWizard.72=Fichiers binaires +OptionWizard.73=Chemin jusqu'à Chrome +OptionWizard.74=Parcourir +OptionWizard.76=Fichiers exécutables +OptionWizard.78=Fichiers binaires +OptionWizard.79=Chemin jusqu'au modèle Freemarker KML +OptionWizard.7=Nom d'utilisateur +OptionWizard.80=Parcourir +OptionWizard.82=Modèle Freemarker +OptionWizard.83=Chemin jusqu'au Ballon HTML +OptionWizard.84=Parcourir +OptionWizard.86=Page web HTML +OptionWizard.87=Chemin jusqu'au fichier XML contenant la définition IDM +OptionWizard.88=Parcourir +OptionWizard.8=Mot de passe +OptionWizard.90=Définition IDM XML +OptionWizard.91=Serveur (version gestionnaire ou autonome) +OptionWizard.92=Client (opérateur/connecté au serveur) +OptionWizard.93=SQLite (Fichier intégré / Unique) OptionWizard.94=PostgreSQL -OptionWizard.95=Lado del punto de sampleo (en metros) -OptionWizard.9=Nombre de la Base de Datos -ProcessMonitorDialog.1=Error de interpretacion en la fila -ProcessMonitorDialog.4=, columnas -ProcessMonitorDialog.5=\ -- valores -SaikuAnalysisListener.0=Si - Actualizar datos de Saiku (proceso de larga duracion) -SaikuAnalysisListener.1=No - Usar los mismos datos de la ultima vez que se usó Saiku -SaikuStarter.1=Iniciando Saiku -SaikuStarter.2=Iniciar Saiku puede tomar varios minutos, espere por favor.\! -SaikuToolExportListener.1=Generación herramienta Saiku -SaikuToolExportListener.2=Generando la herramienta Saiku que incluye la base de datos -SaveEarthDataServlet.0=Sin datos -SaveEarthDataServlet.1=Problemas al guardar los datos en la Base de Datos -SaveEarthDataServlet.2=Los datos se han guardado -SlopeCode.0=Llano (0-5) -YES=Si -YES_TO_ALL=Si a todo \ No newline at end of file +OptionWizard.95=Côté des points d'échantillonnage (en mètres) +OptionWizard.9=Nom de la base +ProcessMonitorDialog.1=Erreur d’interprétation sur numéro de rangée +ProcessMonitorDialog.4=, colonnes +ProcessMonitorDialog.5=\ -- valeures +SaikuAnalysisListener.0=Oui - Rafraichir les données Saiku (processus long) +SaikuAnalysisListener.1=Non - Utiliser la même version des données que la dernière fois que Saiku a été utilisé +SaikuToolExportListener.1=Génération de l'outil Saiku +SaikuToolExportListener.2=Génération de l'outil Saiku avec la base de données actuelle +SaikuStarter.1=Démarrer Saïku +SaikuStarter.2=Démarrer Saïku peut prendre plusieurs minutes, veuillez patienter\! +SaveEarthDataServlet.0=Requête vide +SaveEarthDataServlet.1=Problème lors de la sauvegarde de la base de données +SaveEarthDataServlet.2=Les données ont été sauvées +SlopeCode.0=Plan (0-5) +YES=Oui +YES_TO_ALL=Oui à tous \ No newline at end of file From 1ec39e885966d839bbfbe6dc632c7735bddee976 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:35:44 +0100 Subject: [PATCH 0804/1620] New translations Messages_fr.properties (English) --- .../earth/app/view/Messages_en.properties | 497 +++++++++--------- 1 file changed, 249 insertions(+), 248 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index efdb0acb96..5199a9b624 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,254 +1,255 @@ -AboutDialog.19=Problemas al abrir -AboutDialog.5=Para mas informacion visite nuestra web OpenForis.org -AboutDialog.6=Lo sentimos, hemos tenido un problema al intentar abrir el link en su navegador standard. +AboutDialog.19=UN problème est apparu +AboutDialog.5=Pour plus d’infos, visitez notre site web OpenForis.org +AboutDialog.6=Désolé, il y a eu un problème lors de l’ouverture du lien avec votre navigateur par défaut. AboutDialog.8=Ok -AspectCode.0=Norte -AspectCode.1=Noreste -AspectCode.2=Este -AspectCode.3=Sureste -AspectCode.4=Sur -AspectCode.5=Suroeste -AspectCode.6=Oeste -AspectCode.7=Noroeste -CollectEarthMenu.0=Importar archivo CEP -CollectEarthMenu.2=Utilidades -CollectEarthMenu.3=Dividir archivos de parcelas CSV grandes -CollectEarthMenu.4=Exportar datos a XML (desde una fecha especifica hasta este momento) -CollectEarthMenu.5=Exportar a Collect Backup -CollectEarthMenu.6=Exportar datos como Collect Backup (todos los datos) -CollectEarthMenu.7=Exportar datos como Collect Backup (filtrar por atributo ) -CollectEarthWindow.0=Error al intentar exportar los datos a un archivo CSV -CollectEarthWindow.10=Archivo -CollectEarthWindow.11=Cerrar -CollectEarthWindow.12=Herramientas -CollectEarthWindow.13=Descargar datos a CSV (Excel) -CollectEarthWindow.14=Comenzar análisis con Saiku -CollectEarthWindow.15=Propiedades -CollectEarthWindow.16=Ayuda -CollectEarthWindow.17=Declaración -CollectEarthWindow.18=Encontrar parcelas ausentes de la Base de Datos +AspectCode.0=Nord +AspectCode.1=Nord-Est +AspectCode.2=Est +AspectCode.3=Sud-Est +AspectCode.4=Sud +AspectCode.5=Sud-Ouest +AspectCode.6=Ouest +AspectCode.7=Nord-Ouest +CollectEarthMenu.0=Importe le fichier .CEP +CollectEarthMenu.2=Utilitaires +CollectEarthMenu.3=Divise un large tableau CSV en plusieurs parties +CollectEarthMenu.4=Exporte les données en XML (à partir d'une date précise jusqu'à aujourd'hui) +CollectEarthMenu.5=Exporte sur la sauvegarde Collect Backup +CollectEarthMenu.6=Exporte les données en tant que sauvegarde Collect Backup (toutes les données) +CollectEarthMenu.7=Exporte les données en tant que sauvegarde Collect Backup (à partir de) +CollectEarthMenu.8=Exporte les données en XML (filtrer par attribut) +CollectEarthWindow.0=Erreur pendant l'exportation des données en csv +CollectEarthWindow.10=Fichier +CollectEarthWindow.11=Quitter +CollectEarthWindow.12=Outils +CollectEarthWindow.13=Télécharger les données en CSV (Excel) +CollectEarthWindow.14=Démarrer l'analyse avec Saïku +CollectEarthWindow.15=Propriétés +CollectEarthWindow.16=Aide +CollectEarthWindow.17=Avertissement +CollectEarthWindow.18=Trouver les placettes manquantes dans la base de données CollectEarthWindow.19=Collect Earth -CollectEarthWindow.1=Error al exportar -CollectEarthWindow.20=Número de registros repetidos\: -CollectEarthWindow.21=No se pudo encontrar el icono de la ventana principal -CollectEarthWindow.22=¿Seguro que quieres cerrar Collect Earth?
El servidor de Collect Earth terminara al cerrar la ventana -CollectEarthWindow.23=Necesita confirmación -CollectEarthWindow.24=Exportar a XML -CollectEarthWindow.25=¿Quiere importar estos registros de todas formas y perder sus datos actuales? -CollectEarthWindow.26=Operador -CollectEarthWindow.27=Actualizar -CollectEarthWindow.28=El servidor Open Foris Collect Earth debe estar en funcionamiento mientras el operador esta realizando su trabajo. -CollectEarthWindow.29=El servidor Saiku no ha sido configurado. -CollectEarthWindow.2=Idioma -CollectEarthWindow.30=Por favor, mantenga esta ventana abierta mientras este utilizando Google Earth. -CollectEarthWindow.31=Exportar los datos como archivos CSV -CollectEarthWindow.32=Salir -CollectEarthWindow.33=El nombre del operador ha de ser mas largo que cinco caracteres y mas corto que 50 -CollectEarthWindow.34=Error de validación -CollectEarthWindow.35=\!NOMBRE DEL OPERADOR VACIO\!
Rellene el campo del nombre del operador y presione el botón de "Actualizar". -CollectEarthWindow.36=El nombre del operador no puede estar vacío -CollectEarthWindow.37=Conservar abierto -CollectEarthWindow.38=Archivos CSV -CollectEarthWindow.39=ATENCION\: Recomendamos que guarde una copia de seguridad de sus datos actuales (expórtelos a XML) antes de importar los nuevos datos. -CollectEarthWindow.3=\ Error al importar datos -CollectEarthWindow.40=Configure la ruta a la carpeta donde el servidor Saiku ha sido instalado en Herramientas->Propiedades->Avanzadas. -CollectEarthWindow.41=Guardando los datos en el archivo\: -CollectEarthWindow.42=Terminar -CollectEarthWindow.43=Detectados registros repetidos -CollectEarthWindow.44=Importar/Exportar datos -CollectEarthWindow.45=Exportar datos en XML (comprimidos) -CollectEarthWindow.46=Importar nuevos datos desde ZIP (XML comprimidos) -CollectEarthWindow.47=Servidor Saiku no configurado -CollectEarthWindow.48=Archivos zip/collect-data -CollectEarthWindow.49=Archivos Fusion CSV -CollectEarthWindow.4=Exención de responsabilidad de FAO -CollectEarthWindow.50=Abrir Manual de Usuario -CollectEarthWindow.51=Comprobar si hay actualizaciones de Collect Earth -CollectEarthWindow.52=Abrir el archivo de registo de la aplicacion -CollectEarthWindow.53=Archivo de registro de Collect Earth -CollectEarthWindow.54=Cargar puntos desde KML -CollectEarthWindow.55=Actualizar datos ya registrados desde CSV -CollectEarthWindow.56=Mas informacion... -CollectEarthWindow.57=El proceso para comenzar Saiku esta ejecutandose todavia, espere unos minutos. -CollectEarthWindow.58=No se pudo iniciar el analisis con Saiku -CollectEarthWindow.59=¿Quiere volver a generar los datos para el analisis de Saiku?
Este proceso puede tomar varios minutos.
Si hace click en "SI" los datos mas actuales seran generados. -CollectEarthWindow.5=Cerrar -CollectEarthWindow.60=Generación de datos para Saiku -CollectEarthWindow.61=Exportar a XML (solo los registros anadidos/modificados) -CollectEarthWindow.62=Mas informacion.. -CollectEarthWindow.63=Error leyendo los puntos desde el KML -CollectEarthWindow.64=Soporte tecnico -CollectEarthWindow.65=Se ha cambido el nombre del operador -CollectEarthWindow.66=Cambio de operador -CollectEarthWindow.67=Abrir directorio de datos de CE -CollectEarthWindow.6=Exportar datos a Fusion Table -CollectEarthWindow.70=Abrir el manual de esta encuesta -CollectEarthWindow.71=Generar herramienta Saiku independiente -CollectEarthWindow.7=Error al importar los datos -CollectEarthWindow.8=No se pudo encontrar el testo de exención de responsabilidad -CollectEarthWindow.9=Los datos importados contienen registros que ya están presentes en su base de datos -DynamicsCode.0=Inicialmente Bosque -DynamicsCode.1=Inicialmente Pastizal -DynamicsCode.2=Inicialmente Asentamiento -DynamicsCode.3=Inicialmente Otras tierras -DynamicsCode.4=Inicialmente Humedal -DynamicsCode.5=Inicialmente Cultivo -EarthApp.11=Collect Earth ya está ejecutandose -EarthApp.21=El archivo CSV/CED que contiene el diseño de la malla de puntos no se encuentra en la ruta seleccionada \:
-EarthApp.23=No se ha configurado ningun archivo de puntos CSV/CED \:

-EarthApp.24=El archivo que contiene la plantilla de Freemarker con la definicion del KML no se encuntra en la ruta seleccionada \:
-EarthApp.26=No se ha configurado ninguna archivo con la definicion del KML \:

-EarthApp.27=El archivo que contiene el formulario del pop-up en HTMl no se ha encontrado en la ruta seleccionada \:
-EarthApp.29=No se ha configurado ningun HTML de configuracion del pop-up \:

-EarthApp.30=Corrija la localizacion del archivo a traves del menu Herramientas->Propiedades. -EarthApp.3=Recordarme mas tarde -EarthApp.4=Actualizar Ahora -EarthApp.57=Hay una nueva version de Collect Earth disponible\! -EarthApp.58=Alerta para actualizacion -EarthApp.59=Error al importar el archivo del proyecto -EarthApp.5=No recordarme otra vez -EarthApp.61=El archivo KMZ generado por Collect Earth no se pudo abrir.
Asegurese de que Google Earth esta instalado. +CollectEarthWindow.1=Erreur d'exportation +CollectEarthWindow.20=Nombre d'enregistrements dupliqués +CollectEarthWindow.21=Icône non trouvée +CollectEarthWindow.22= Êtes-vous sûr de vouloir fermer CollectEarth
Fermer cette fenêtre fermera aussi le serveur +CollectEarthWindow.23=Confirmation requise +CollectEarthWindow.24=Exporter en XML +CollectEarthWindow.25=Voulez-vous ajouter tout de même ces données et perdre vos enregistrements? +CollectEarthWindow.26=Utilisateur +CollectEarthWindow.27=Appliquer +CollectEarthWindow.28=Le serveur devrait être démarré pour la saisie des données par les utilisateurs. +CollectEarthWindow.29=Le serveur Saiku n'est pas configuré. +CollectEarthWindow.2=Langue +CollectEarthWindow.30=Veuillez garder cette fenêtre active pendant que vous utilisez Google Earth +CollectEarthWindow.31=Exporter les données collectées en CSV +CollectEarthWindow.32=Fermer +CollectEarthWindow.33=Le nom de l'utilisateur doit comprendre entre 5 et 50 caractères +CollectEarthWindow.34=Erreur de validation +CollectEarthWindow.35= NOM DE L'UTILISATEUR VIDE\!
Veuillez renseigner le champs et Appuyer sur "Mise à jour" +CollectEarthWindow.36=Le nom de l'utilisateur ne peut pas être vide +CollectEarthWindow.37=Laisser ouvert +CollectEarthWindow.38=Fichiers CSV +CollectEarthWindow.39=NOTE \: Il est conseillé de sauvegarder vos données (export en XML) avant d'importer de nouvelles données +CollectEarthWindow.3=\ Erreur pendant l'importation +CollectEarthWindow.40=Renseigner le chemin jusqu'au serveur Saiku dans /Outils/Propriétés/Avancé. +CollectEarthWindow.41=Sauvegarde des données exportées dans le fichier\: +CollectEarthWindow.42=Quitter +CollectEarthWindow.43=Enregistrements conflictuels trouvés +CollectEarthWindow.44=Importer/Exporter les données +CollectEarthWindow.45=Exporter les données en XML (zippé) +CollectEarthWindow.46=Importer de nouvelles données depuis ZIP (XML zippé) +CollectEarthWindow.47=Le serveur Saiku n'est pas configuré +CollectEarthWindow.48=Fichier zip/collect-data +CollectEarthWindow.49=Fusion des fichiers CSV +CollectEarthWindow.4=Clause de non-responsabilité de la FAO +CollectEarthWindow.50=Ouvrir le manuel utilisateur +CollectEarthWindow.51=Vérifier les mises à jour des Collect Earth +CollectEarthWindow.52=Fichier de logs Open Application +CollectEarthWindow.53=Fichier de logs Collect Earth +CollectEarthWindow.54=Charger les points de KML +CollectEarthWindow.55=Mettre à jour les enregistrements en utilisant un fichier CSV +CollectEarthWindow.56=A propos... +CollectEarthWindow.57=Le processus de démarrage de Saïku est en cours, veuillez patienter +CollectEarthWindow.58=Impossible de démarrer l'analyse avec Saïku +CollectEarthWindow.59=Voulez-vous régénérer le jeu de données?
Cela peut prendre du temps.
Cliquer sur oui pour régénérer un nouveau jeu de données avec les dernières informations +CollectEarthWindow.5=Fermer +CollectEarthWindow.60=Génération des données Saïku +CollectEarthWindow.61=Exporter en XML (uniquement les enregistrements modifiés/ajoutés) +CollectEarthWindow.62=A propos… +CollectEarthWindow.63=Erreur en accédant aux points de KML +CollectEarthWindow.64=Assistance technique +CollectEarthWindow.65=Le nom de l'opérateur a été changé +CollectEarthWindow.66=Nom de l'opérateur +CollectEarthWindow.67=Ouvrir le dossier de données de CE +CollectEarthWindow.6=Exporter en Table de Fusion +CollectEarthWindow.70=Ouvrez le manuel de cette enquête +CollectEarthWindow.71=Générer un outil Saiku autonome +CollectEarthWindow.7=Erreur pendant l'importation des données +CollectEarthWindow.8=Le texte est introuvable +CollectEarthWindow.9=Les données importées contiennent des redondances avec celles présentes dans la base +DynamicsCode.0= Terre Forestière initialement +DynamicsCode.1= Prairie initialement +DynamicsCode.2= Etablissement initialement +DynamicsCode.3= Autre terre initialement +DynamicsCode.4= Terre humide initialement +DynamicsCode.5= Terre cultivée initialement +EarthApp.11=Collect Earth est déjà en cours d’exécution +EarthApp.21=Le fichier CSV/CED contenant les points est introuvable \:
+EarthApp.23=Aucun fichier CSV/CED spécifié \:

+EarthApp.24=Le fichier contenant le modèle de définition KML est introuvable \:
+EarthApp.26=Aucun modèle de définition spécifié\:

+EarthApp.27=Le fichier contenant le ballon HTML est introuvable \:
+EarthApp.29=Aucun ballon HTML spécifié \:

+EarthApp.30=Veuillez corriger le chemin d’accès dans le menu Outils -> Propriétés. +EarthApp.3=Rappelez le moi plus tard +EarthApp.4=Mettre a jour maintenant +EarthApp.57= Une nouvelle version de Collect Earth est disponible\! Utiliser le Menu +EarthApp.58=Alerte de mise à jour +EarthApp.59=Erreur pendant l’importation du fichier +EarthApp.5=Ne me le rappelez plus +EarthApp.61=Le fichier Collect Earth est introuvable br/>Veuillez-vous assurer que Google Earth est installé. EarthApp.6=\ - Version -EarthApp.70=ATENCION -EarthApp.71=En Mac OS X los archivos de proyectos de Collect Earth (*.cep) no se abren automaticamente al hacer doble-click sobre ellos.
-EarthApp.72=Utiliza la barra de herramientas de Collect Earth para abrir lo archivos .cep \: -EarthApp.73=Collect Earth en ordenadores Mac OS X -EarthSurveyService.9=Campo necesario -ExportActionListener.1=Elija la fecha desde la que exportar los datos -ExportDialogProcessMonitor.0=Procesando datos... -ExportDialogProcessMonitor.1=Esperando a la inicializacion del exportador \: -ExportDialogProcessMonitor.4=Registros exportados \: -ImportActionListener.0=¿Quiere importar los datos de las parcelas que no han sido completamente rellenadas? -ImportActionListener.2=Si hace click en NO se importarán solo los datos de las parcelas en el estado completo (verde)". -ImportActionListener.3=Importar registros incompletos -ImportDialogProcessMonitor.0=\ CALCULANDO -ImportDialogProcessMonitor.11=Cifra inicial the registros \: -ImportDialogProcessMonitor.2=Importando registros... -ImportDialogProcessMonitor.5=Cifra final de registros importados \: -ImportDialogProcessMonitor.8=Procesando datos... -ImportProcessMonitorDialog.0=Registros importados \: -ImportXMLDialogProcessMonitor.1 = Sobreescrivir las parcelas en BBDD -ImportXMLDialogProcessMonitor.2 = Importar solo parcelas sin conflictos -InfiniteProgressMonitor.0=Cancelar operación -JFileChooserExistsAware.0=Archivo de proyecto Collect Earth -KmlImportService.13=Seleccionar archivo CSV donde guardar las posiciones de las parcelas -MissingPlotsListener.0=Error cuando se estaba obteniendo información de las parcelas ausentes de la base de datos -MissingPlotsListener.10=Numero total de parcelas en el diseño de la muestra \: -MissingPlotsListener.12=Numero de parcelas que faltan \: -MissingPlotsListener.14=Todas las parcelas han sido rellenadas\! -MissingPlotsListener.1=Parcelas que faltan -MissingPlotsListener.2=Copiar contenidos -MissingPlotsListener.3=Elija los archivos que contienen informacion sobre las parcelas ( archivos .csv o .ced ) para los que desea averiguar si todos los datos se han rellenado. -MissingPlotsListener.4=Parcelas ausentes – informacion -MissingPlotsListener.5=Del archivo \: -MissingPlotsListener.6=Exportar a archivo CED -NO=No -NO_TO_ALL=No a todo -OpenTextFileListener.0=El archivo de texto no ha sido encontrado en \: -OptionWizard.0=Opciones de Collect Earth -OptionWizard.100=Abrir Planet -OptionWizard.101=Llave de la API de Planet +EarthApp.70=AVERTISSMENT +EarthApp.71=Sous Mac OS X, les fichiers de projet Collect Earth (* .cep) ne s'ouvriront pas dans Collect Earth lorsqu'ils sont double-cliqués.
+EarthApp.72=Utilisez la barre d'outils Collect Earth pour ouvrir les fichiers .cep \: +EarthApp.73=Collect Earth - problèmes sur les ordinateurs Mac OS X +EarthSurveyService.9=Champs requis +ExportActionListener.1=Choisir la date pour les données à exporter +ExportDialogProcessMonitor.0=Chargement des données... +ExportDialogProcessMonitor.1=Attente d'initialisation de l'export +ExportDialogProcessMonitor.4=Enregistrements exportés \: +ImportActionListener.0=Est-ce que les données pour les placettes qui ne sont pas complètes doivent être importées ? +ImportActionListener.2=Si vous cliquez sur NO, seulement les données provenant des placettes avec la marque « verte », qui contiennent toutes les données, seront importées +ImportActionListener.3=Importer les enregistrements incomplets +ImportDialogProcessMonitor.0=Calcul en cours +ImportDialogProcessMonitor.11=Nombre initial d' enregistrements \: +ImportDialogProcessMonitor.2=Chargement des enregistrements... +ImportDialogProcessMonitor.5=Nombre réel d'enregistrements importés\: +ImportDialogProcessMonitor.8=Chargement des données... +ImportProcessMonitorDialog.0=Enregistrements importés \: +ImportXMLDialogProcessMonitor.1 = Écraser les données dans la base de données +ImportXMLDialogProcessMonitor.2 = Importer uniquement des enregistrements non conflictuels +InfiniteProgressMonitor.0=Annuler l’opération +JFileChooserExistsAware.0=Fichier projet Collect Earth +KmlImportService.13=Sélectionnez un fichier CSV pour enregistrer les emplacements des parcelles +MissingPlotsListener.0=Erreur au cours de l’enregistrement des placettes absentes de la base de données +MissingPlotsListener.10=Nombre total de parcelles dans le plan d'échantillonnage \: +MissingPlotsListener.12=Nombre de parcelles manquantes \: +MissingPlotsListener.14=Toutes les parcelles sont remplis\! +MissingPlotsListener.1=Placettes manquantes +MissingPlotsListener.2=Copier le contenu sur le clipboard +MissingPlotsListener.3=Choisir les fichiers qui contiennent les informations des placettes (.csv ou .ced) pour lesquelles vous voulez savoir si toues les placettes ont été renseignées +MissingPlotsListener.4=Placettes manquantes – Information +MissingPlotsListener.5=Depuis le fichier \: +MissingPlotsListener.6=Exporter en CED +NO=Non +NO_TO_ALL=Non à tous +OpenTextFileListener.0=Le fichier texte n'a pas été trouvé dans \: +OptionWizard.0=Options Collect Earth +OptionWizard.100=Ouvrir Planet +OptionWizard.101=Clé API Planet OptionWizard.1021=URL SecureWatch -OptionWizard.102=Abrir Maxar SecureWatch (necesario tener licencia) -OptionWizard.103=Configurar la URL para el Mapa Extra (se abre cuando esta configurada) \: -OptionWizard.104=Navegadores -OptionWizard.105=Abrir Earth Map -OptionWizard.110=Usar las imagenes mensuales de NICFI -OptionWizard.10=Abrir carpeta de copias de seguridad -OptionWizard.11=Desconocido\: usar ipconfig -OptionWizard.12=Instancia cliente -OptionWizard.13=Collect Earth Server IP -OptionWizard.14=Collect Earth Server puerto (e.g. 8023) -OptionWizard.15=Guardar & aplicar cambios +OptionWizard.102=Ouvrir Maxar SecureWatch +OptionWizard.103=Définir le URL pour le Carte Extra (ouvre quand il est réglé) \: +OptionWizard.104=Navigateurs +OptionWizard.105=Ouvrir Earth Map +OptionWizard.110=Utiliser les images mensuelles fournies par NICFI +OptionWizard.10=Montrer les fichiers de sauvegarde +OptionWizard.11=Inconnu \: utiliser ifconfig +OptionWizard.12=Instance client +OptionWizard.13=IP Serveur de Collect Earth +OptionWizard.14=Port Serveur de Collect Earth (e.g. 8023) +OptionWizard.15=Appliquer et sauvegarder les changements OptionWizard.16=ID -OptionWizard.17=X-coord -OptionWizard.18=Y-coord -OptionWizard.19=Elevación -OptionWizard.1=Elija navegador -OptionWizard.20=Los contenidos de Google Earth han cambiado.
Acepte la recarga del contenido cuando Google Earth le pregunte. -OptionWizard.21=Actualizado con éxito -OptionWizard.22=Pendiente -OptionWizard.23=Hubo un error al reabrir los datos en Google Earth -OptionWizard.24=Cancelar -OptionWizard.25=Modo de operación -OptionWizard.26=BBDD servidor -OptionWizard.27=Esta no es una carpeta de un servido Saiku ( el archivo start-saiku.bat no esta presente) -OptionWizard.28=Servidor Saiku no reconocible -OptionWizard.29=BBDD puerto -OptionWizard.2=Tipo de uso (servidor/cliente) -OptionWizard.30=Opciones SQLite -OptionWizard.31=Datos de muestra -OptionWizard.32=Diseño de parcela -OptionWizard.33=Definición de la encuesta -OptionWizard.34=Servicios integrados -OptionWizard.35=Número de puntos de control -OptionWizard.36=Distancia entre los puntos de control (en metros) -OptionWizard.37=Margen con el borde de la parcela (en metros) -OptionWizard.38=El archivo CSV/CED no pudo leerse correctamente.
El formato del archivo de valores separados por comas ha de ser como este \:
-OptionWizard.39=ID,Y-Coordinada,X-Coordinada,Elevacion,pendiente,orientacion -OptionWizard.3=Servidor -OptionWizard.40=Proyectos -OptionWizard.41=Cargar un nuevo archivo de proyecto -OptionWizard.42=Error al cerrar el lector del CSV -OptionWizard.43=Nombre de la encuesta -OptionWizard.44=Guardar copia de seguridad de la base de datos en -OptionWizard.45=Abrir Google Earth Engine Playground (obsoleto) -OptionWizard.46=Abrir Google Earth Engine Timelapse -OptionWizard.47=Abrir Bing Maps -OptionWizard.48=Abrir encuesta en un navegador externo en lugar de Google Earth (recomendado para LINUX) -OptionWizard.49=Ruta del archivo ced/csv con las coordenadas de las parcelas -OptionWizard.4=IP de este ordenador\: -OptionWizard.50=Navegar... -OptionWizard.51=Error al importar el archivos del proyecto -OptionWizard.52=Archivo CSV/CED con coordenadas -OptionWizard.53=Sin puntos -OptionWizard.54=Punto central -OptionWizard.55=Error al importar el directorio del proyecto -OptionWizard.56=Cargar proyecto -OptionWizard.57=Proyectos ya cargados -OptionWizard.58=Abrir GEE Code Editor (requiere accesso como Trusted Tester) -OptionWizard.59=Abrir Here Maps -OptionWizard.5=Collect Earth Server puerto\: -OptionWizard.65=Ruta para la carpeta de Saiku -OptionWizard.66=Navegar... -OptionWizard.67=Ruta del ejecutable de Firefox -OptionWizard.68=Navegar... -OptionWizard.6=Parámetros BD PostgreSQL -OptionWizard.70=Archivos ejecutables -OptionWizard.72=Archivos binarios -OptionWizard.73=Ruta del ejecutable de Chrome -OptionWizard.74=Navegar... -OptionWizard.76=Archivos ejecutables -OptionWizard.78=Archivos binarios -OptionWizard.79=Ruta a la plantilla KML de Freemarker -OptionWizard.7=Nombre de usuario -OptionWizard.80=Navegar... -OptionWizard.82=Plantilla Freemarker -OptionWizard.83=Ruta al formulario HTML -OptionWizard.84=Navegar... -OptionWizard.86=Pagina web HTML -OptionWizard.87=Ruta al XML con la definición del IDM -OptionWizard.88=Navegar... -OptionWizard.8=Password -OptionWizard.90=Definición XML IDM -OptionWizard.91=Servidor (versión para el gerente o para uso autónomo) -OptionWizard.92=Cliente (operador/conectado al servidor) -OptionWizard.93=SQLite (Embebida/basada en un único archivo) +OptionWizard.17=Coord-X +OptionWizard.18=Coord-Y +OptionWizard.19=Altitude +OptionWizard.1=Choisir un navigateur +OptionWizard.20= Le contenu de Google Earth a changé
Veuillez accepter la mise à jour quand GE le demande +OptionWizard.21=Mise à jour réussie +OptionWizard.22=Pente +OptionWizard.23=Il y a eu une erreur pendant la réouverture de Google Earth +OptionWizard.24=Annuler +OptionWizard.25=Mode opération +OptionWizard.26=Hôte pour la BDD +OptionWizard.27=Le dossier n'est pas valide (il manque le fichier start-saiku.bat) +OptionWizard.28=Le dossier Saiku n'est pas reconnu +OptionWizard.29=Port pour la BDD +OptionWizard.2=Flux (serveur/client) +OptionWizard.30=Options SQLite +OptionWizard.31=Points d'échantillonnage +OptionWizard.32=Configuration de la parcelle +OptionWizard.33=Définition de l'enquête +OptionWizard.34=Services intégrés +OptionWizard.35=Nombre de points de contrôle +OptionWizard.36=Distance entre les points de contrôle (en mètres) +OptionWizard.37=Distance au bord de la parcelle (en mètres) +OptionWizard.38=Le Fichier CSV/CED ne peut pas être lu
Le fichier devrait avoir des valeurs séparées par des virgules comme ceci \:
+OptionWizard.39=ID,Coordonnée_Y, Coordonnée_X,altitude,pente,orientation +OptionWizard.3=Instance serveur +OptionWizard.40=Projets +OptionWizard.41=Charger un nouveau fichier projet +OptionWizard.42=Erreur pendant la fermeture du lecteur CSV +OptionWizard.43=Nom de l'enquête +OptionWizard.44=Sauvegarder automatiquement la base dans +OptionWizard.45=Ouvrir Earth Engine Playground (obsolète) +OptionWizard.46=Ouvrir le Timelapse de Google Earth Engine +OptionWizard.47=Ouvrir Bing Maps +OptionWizard.48=Ouvrir le formulaire dans un navigateur plutôt que dans GE (recommandé pour Linux) +OptionWizard.49=Chemin jusqu'au fichier ced/csv avec les données des parcelles +OptionWizard.4=IP actuelle de l'ordinateur +OptionWizard.50=Parcourir +OptionWizard.51=Erreur pendant l'importation du fichier +OptionWizard.52=Fichier CSV/CED uniquement avec des coordonnées +OptionWizard.53=Pas de points +OptionWizard.54=Point central +OptionWizard.55=Erreur pendant l'importation du dossier projet +OptionWizard.56=Charger le projet +OptionWizard.57=Projets chargés précedemment +OptionWizard.58=Ouvrir GEE Code Editor (nécessite un accès restreint Trusted Tester) +OptionWizard.59=Ouvrir Here Maps +OptionWizard.5=Port Serveur Collect Earth \: +OptionWizard.65=Chemin jusqu'au serveur Saiku +OptionWizard.66=Parcourir +OptionWizard.67=Chemin jusqu'à Firefox +OptionWizard.68=Parcourir +OptionWizard.6=Paramètres de la BD PostGreSQL +OptionWizard.70=Fichiers exécutables +OptionWizard.72=Fichiers binaires +OptionWizard.73=Chemin jusqu'à Chrome +OptionWizard.74=Parcourir +OptionWizard.76=Fichiers exécutables +OptionWizard.78=Fichiers binaires +OptionWizard.79=Chemin jusqu'au modèle Freemarker KML +OptionWizard.7=Nom d'utilisateur +OptionWizard.80=Parcourir +OptionWizard.82=Modèle Freemarker +OptionWizard.83=Chemin jusqu'au Ballon HTML +OptionWizard.84=Parcourir +OptionWizard.86=Page web HTML +OptionWizard.87=Chemin jusqu'au fichier XML contenant la définition IDM +OptionWizard.88=Parcourir +OptionWizard.8=Mot de passe +OptionWizard.90=Définition IDM XML +OptionWizard.91=Serveur (version gestionnaire ou autonome) +OptionWizard.92=Client (opérateur/connecté au serveur) +OptionWizard.93=SQLite (Fichier intégré / Unique) OptionWizard.94=PostgreSQL -OptionWizard.95=Lado del punto de sampleo (en metros) -OptionWizard.9=Nombre de la Base de Datos -ProcessMonitorDialog.1=Error de interpretacion en la fila -ProcessMonitorDialog.4=, columnas -ProcessMonitorDialog.5=\ -- valores -SaikuAnalysisListener.0=Si - Actualizar datos de Saiku (proceso de larga duracion) -SaikuAnalysisListener.1=No - Usar los mismos datos de la ultima vez que se usó Saiku -SaikuStarter.1=Iniciando Saiku -SaikuStarter.2=Iniciar Saiku puede tomar varios minutos, espere por favor.\! -SaikuToolExportListener.1=Generación herramienta Saiku -SaikuToolExportListener.2=Generando la herramienta Saiku que incluye la base de datos -SaveEarthDataServlet.0=Sin datos -SaveEarthDataServlet.1=Problemas al guardar los datos en la Base de Datos -SaveEarthDataServlet.2=Los datos se han guardado -SlopeCode.0=Llano (0-5) -YES=Si -YES_TO_ALL=Si a todo \ No newline at end of file +OptionWizard.95=Côté des points d'échantillonnage (en mètres) +OptionWizard.9=Nom de la base +ProcessMonitorDialog.1=Erreur d’interprétation sur numéro de rangée +ProcessMonitorDialog.4=, colonnes +ProcessMonitorDialog.5=\ -- valeures +SaikuAnalysisListener.0=Oui - Rafraichir les données Saiku (processus long) +SaikuAnalysisListener.1=Non - Utiliser la même version des données que la dernière fois que Saiku a été utilisé +SaikuToolExportListener.1=Génération de l'outil Saiku +SaikuToolExportListener.2=Génération de l'outil Saiku avec la base de données actuelle +SaikuStarter.1=Démarrer Saïku +SaikuStarter.2=Démarrer Saïku peut prendre plusieurs minutes, veuillez patienter\! +SaveEarthDataServlet.0=Requête vide +SaveEarthDataServlet.1=Problème lors de la sauvegarde de la base de données +SaveEarthDataServlet.2=Les données ont été sauvées +SlopeCode.0=Plan (0-5) +YES=Oui +YES_TO_ALL=Oui à tous \ No newline at end of file From c1d9be48b6f0af55aeacdf730266acd0171c945e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:35:45 +0100 Subject: [PATCH 0805/1620] New translations Messages_hi.properties (French) --- .../earth/app/view/Messages_fr.properties | 483 +++++++++--------- 1 file changed, 228 insertions(+), 255 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 5199a9b624..f759c433b0 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,255 +1,228 @@ -AboutDialog.19=UN problème est apparu -AboutDialog.5=Pour plus d’infos, visitez notre site web OpenForis.org -AboutDialog.6=Désolé, il y a eu un problème lors de l’ouverture du lien avec votre navigateur par défaut. -AboutDialog.8=Ok -AspectCode.0=Nord -AspectCode.1=Nord-Est -AspectCode.2=Est -AspectCode.3=Sud-Est -AspectCode.4=Sud -AspectCode.5=Sud-Ouest -AspectCode.6=Ouest -AspectCode.7=Nord-Ouest -CollectEarthMenu.0=Importe le fichier .CEP -CollectEarthMenu.2=Utilitaires -CollectEarthMenu.3=Divise un large tableau CSV en plusieurs parties -CollectEarthMenu.4=Exporte les données en XML (à partir d'une date précise jusqu'à aujourd'hui) -CollectEarthMenu.5=Exporte sur la sauvegarde Collect Backup -CollectEarthMenu.6=Exporte les données en tant que sauvegarde Collect Backup (toutes les données) -CollectEarthMenu.7=Exporte les données en tant que sauvegarde Collect Backup (à partir de) -CollectEarthMenu.8=Exporte les données en XML (filtrer par attribut) -CollectEarthWindow.0=Erreur pendant l'exportation des données en csv -CollectEarthWindow.10=Fichier -CollectEarthWindow.11=Quitter -CollectEarthWindow.12=Outils -CollectEarthWindow.13=Télécharger les données en CSV (Excel) -CollectEarthWindow.14=Démarrer l'analyse avec Saïku -CollectEarthWindow.15=Propriétés -CollectEarthWindow.16=Aide -CollectEarthWindow.17=Avertissement -CollectEarthWindow.18=Trouver les placettes manquantes dans la base de données -CollectEarthWindow.19=Collect Earth -CollectEarthWindow.1=Erreur d'exportation -CollectEarthWindow.20=Nombre d'enregistrements dupliqués -CollectEarthWindow.21=Icône non trouvée -CollectEarthWindow.22= Êtes-vous sûr de vouloir fermer CollectEarth
Fermer cette fenêtre fermera aussi le serveur -CollectEarthWindow.23=Confirmation requise -CollectEarthWindow.24=Exporter en XML -CollectEarthWindow.25=Voulez-vous ajouter tout de même ces données et perdre vos enregistrements? -CollectEarthWindow.26=Utilisateur -CollectEarthWindow.27=Appliquer -CollectEarthWindow.28=Le serveur devrait être démarré pour la saisie des données par les utilisateurs. -CollectEarthWindow.29=Le serveur Saiku n'est pas configuré. -CollectEarthWindow.2=Langue -CollectEarthWindow.30=Veuillez garder cette fenêtre active pendant que vous utilisez Google Earth -CollectEarthWindow.31=Exporter les données collectées en CSV -CollectEarthWindow.32=Fermer -CollectEarthWindow.33=Le nom de l'utilisateur doit comprendre entre 5 et 50 caractères -CollectEarthWindow.34=Erreur de validation -CollectEarthWindow.35= NOM DE L'UTILISATEUR VIDE\!
Veuillez renseigner le champs et Appuyer sur "Mise à jour" -CollectEarthWindow.36=Le nom de l'utilisateur ne peut pas être vide -CollectEarthWindow.37=Laisser ouvert -CollectEarthWindow.38=Fichiers CSV -CollectEarthWindow.39=NOTE \: Il est conseillé de sauvegarder vos données (export en XML) avant d'importer de nouvelles données -CollectEarthWindow.3=\ Erreur pendant l'importation -CollectEarthWindow.40=Renseigner le chemin jusqu'au serveur Saiku dans /Outils/Propriétés/Avancé. -CollectEarthWindow.41=Sauvegarde des données exportées dans le fichier\: -CollectEarthWindow.42=Quitter -CollectEarthWindow.43=Enregistrements conflictuels trouvés -CollectEarthWindow.44=Importer/Exporter les données -CollectEarthWindow.45=Exporter les données en XML (zippé) -CollectEarthWindow.46=Importer de nouvelles données depuis ZIP (XML zippé) -CollectEarthWindow.47=Le serveur Saiku n'est pas configuré -CollectEarthWindow.48=Fichier zip/collect-data -CollectEarthWindow.49=Fusion des fichiers CSV -CollectEarthWindow.4=Clause de non-responsabilité de la FAO -CollectEarthWindow.50=Ouvrir le manuel utilisateur -CollectEarthWindow.51=Vérifier les mises à jour des Collect Earth -CollectEarthWindow.52=Fichier de logs Open Application -CollectEarthWindow.53=Fichier de logs Collect Earth -CollectEarthWindow.54=Charger les points de KML -CollectEarthWindow.55=Mettre à jour les enregistrements en utilisant un fichier CSV -CollectEarthWindow.56=A propos... -CollectEarthWindow.57=Le processus de démarrage de Saïku est en cours, veuillez patienter -CollectEarthWindow.58=Impossible de démarrer l'analyse avec Saïku -CollectEarthWindow.59=Voulez-vous régénérer le jeu de données?
Cela peut prendre du temps.
Cliquer sur oui pour régénérer un nouveau jeu de données avec les dernières informations -CollectEarthWindow.5=Fermer -CollectEarthWindow.60=Génération des données Saïku -CollectEarthWindow.61=Exporter en XML (uniquement les enregistrements modifiés/ajoutés) -CollectEarthWindow.62=A propos… -CollectEarthWindow.63=Erreur en accédant aux points de KML -CollectEarthWindow.64=Assistance technique -CollectEarthWindow.65=Le nom de l'opérateur a été changé -CollectEarthWindow.66=Nom de l'opérateur -CollectEarthWindow.67=Ouvrir le dossier de données de CE -CollectEarthWindow.6=Exporter en Table de Fusion -CollectEarthWindow.70=Ouvrez le manuel de cette enquête -CollectEarthWindow.71=Générer un outil Saiku autonome -CollectEarthWindow.7=Erreur pendant l'importation des données -CollectEarthWindow.8=Le texte est introuvable -CollectEarthWindow.9=Les données importées contiennent des redondances avec celles présentes dans la base -DynamicsCode.0= Terre Forestière initialement -DynamicsCode.1= Prairie initialement -DynamicsCode.2= Etablissement initialement -DynamicsCode.3= Autre terre initialement -DynamicsCode.4= Terre humide initialement -DynamicsCode.5= Terre cultivée initialement -EarthApp.11=Collect Earth est déjà en cours d’exécution -EarthApp.21=Le fichier CSV/CED contenant les points est introuvable \:
-EarthApp.23=Aucun fichier CSV/CED spécifié \:

-EarthApp.24=Le fichier contenant le modèle de définition KML est introuvable \:
-EarthApp.26=Aucun modèle de définition spécifié\:

-EarthApp.27=Le fichier contenant le ballon HTML est introuvable \:
-EarthApp.29=Aucun ballon HTML spécifié \:

-EarthApp.30=Veuillez corriger le chemin d’accès dans le menu Outils -> Propriétés. -EarthApp.3=Rappelez le moi plus tard -EarthApp.4=Mettre a jour maintenant -EarthApp.57= Une nouvelle version de Collect Earth est disponible\! Utiliser le Menu -EarthApp.58=Alerte de mise à jour -EarthApp.59=Erreur pendant l’importation du fichier -EarthApp.5=Ne me le rappelez plus -EarthApp.61=Le fichier Collect Earth est introuvable br/>Veuillez-vous assurer que Google Earth est installé. -EarthApp.6=\ - Version -EarthApp.70=AVERTISSMENT -EarthApp.71=Sous Mac OS X, les fichiers de projet Collect Earth (* .cep) ne s'ouvriront pas dans Collect Earth lorsqu'ils sont double-cliqués.
-EarthApp.72=Utilisez la barre d'outils Collect Earth pour ouvrir les fichiers .cep \: -EarthApp.73=Collect Earth - problèmes sur les ordinateurs Mac OS X -EarthSurveyService.9=Champs requis -ExportActionListener.1=Choisir la date pour les données à exporter -ExportDialogProcessMonitor.0=Chargement des données... -ExportDialogProcessMonitor.1=Attente d'initialisation de l'export -ExportDialogProcessMonitor.4=Enregistrements exportés \: -ImportActionListener.0=Est-ce que les données pour les placettes qui ne sont pas complètes doivent être importées ? -ImportActionListener.2=Si vous cliquez sur NO, seulement les données provenant des placettes avec la marque « verte », qui contiennent toutes les données, seront importées -ImportActionListener.3=Importer les enregistrements incomplets -ImportDialogProcessMonitor.0=Calcul en cours -ImportDialogProcessMonitor.11=Nombre initial d' enregistrements \: -ImportDialogProcessMonitor.2=Chargement des enregistrements... -ImportDialogProcessMonitor.5=Nombre réel d'enregistrements importés\: -ImportDialogProcessMonitor.8=Chargement des données... -ImportProcessMonitorDialog.0=Enregistrements importés \: -ImportXMLDialogProcessMonitor.1 = Écraser les données dans la base de données -ImportXMLDialogProcessMonitor.2 = Importer uniquement des enregistrements non conflictuels -InfiniteProgressMonitor.0=Annuler l’opération -JFileChooserExistsAware.0=Fichier projet Collect Earth -KmlImportService.13=Sélectionnez un fichier CSV pour enregistrer les emplacements des parcelles -MissingPlotsListener.0=Erreur au cours de l’enregistrement des placettes absentes de la base de données -MissingPlotsListener.10=Nombre total de parcelles dans le plan d'échantillonnage \: -MissingPlotsListener.12=Nombre de parcelles manquantes \: -MissingPlotsListener.14=Toutes les parcelles sont remplis\! -MissingPlotsListener.1=Placettes manquantes -MissingPlotsListener.2=Copier le contenu sur le clipboard -MissingPlotsListener.3=Choisir les fichiers qui contiennent les informations des placettes (.csv ou .ced) pour lesquelles vous voulez savoir si toues les placettes ont été renseignées -MissingPlotsListener.4=Placettes manquantes – Information -MissingPlotsListener.5=Depuis le fichier \: -MissingPlotsListener.6=Exporter en CED -NO=Non -NO_TO_ALL=Non à tous -OpenTextFileListener.0=Le fichier texte n'a pas été trouvé dans \: -OptionWizard.0=Options Collect Earth -OptionWizard.100=Ouvrir Planet -OptionWizard.101=Clé API Planet -OptionWizard.1021=URL SecureWatch -OptionWizard.102=Ouvrir Maxar SecureWatch -OptionWizard.103=Définir le URL pour le Carte Extra (ouvre quand il est réglé) \: -OptionWizard.104=Navigateurs -OptionWizard.105=Ouvrir Earth Map -OptionWizard.110=Utiliser les images mensuelles fournies par NICFI -OptionWizard.10=Montrer les fichiers de sauvegarde -OptionWizard.11=Inconnu \: utiliser ifconfig -OptionWizard.12=Instance client -OptionWizard.13=IP Serveur de Collect Earth -OptionWizard.14=Port Serveur de Collect Earth (e.g. 8023) -OptionWizard.15=Appliquer et sauvegarder les changements -OptionWizard.16=ID -OptionWizard.17=Coord-X -OptionWizard.18=Coord-Y -OptionWizard.19=Altitude -OptionWizard.1=Choisir un navigateur -OptionWizard.20= Le contenu de Google Earth a changé
Veuillez accepter la mise à jour quand GE le demande -OptionWizard.21=Mise à jour réussie -OptionWizard.22=Pente -OptionWizard.23=Il y a eu une erreur pendant la réouverture de Google Earth -OptionWizard.24=Annuler -OptionWizard.25=Mode opération -OptionWizard.26=Hôte pour la BDD -OptionWizard.27=Le dossier n'est pas valide (il manque le fichier start-saiku.bat) -OptionWizard.28=Le dossier Saiku n'est pas reconnu -OptionWizard.29=Port pour la BDD -OptionWizard.2=Flux (serveur/client) -OptionWizard.30=Options SQLite -OptionWizard.31=Points d'échantillonnage -OptionWizard.32=Configuration de la parcelle -OptionWizard.33=Définition de l'enquête -OptionWizard.34=Services intégrés -OptionWizard.35=Nombre de points de contrôle -OptionWizard.36=Distance entre les points de contrôle (en mètres) -OptionWizard.37=Distance au bord de la parcelle (en mètres) -OptionWizard.38=Le Fichier CSV/CED ne peut pas être lu
Le fichier devrait avoir des valeurs séparées par des virgules comme ceci \:
-OptionWizard.39=ID,Coordonnée_Y, Coordonnée_X,altitude,pente,orientation -OptionWizard.3=Instance serveur -OptionWizard.40=Projets -OptionWizard.41=Charger un nouveau fichier projet -OptionWizard.42=Erreur pendant la fermeture du lecteur CSV -OptionWizard.43=Nom de l'enquête -OptionWizard.44=Sauvegarder automatiquement la base dans -OptionWizard.45=Ouvrir Earth Engine Playground (obsolète) -OptionWizard.46=Ouvrir le Timelapse de Google Earth Engine -OptionWizard.47=Ouvrir Bing Maps -OptionWizard.48=Ouvrir le formulaire dans un navigateur plutôt que dans GE (recommandé pour Linux) -OptionWizard.49=Chemin jusqu'au fichier ced/csv avec les données des parcelles -OptionWizard.4=IP actuelle de l'ordinateur -OptionWizard.50=Parcourir -OptionWizard.51=Erreur pendant l'importation du fichier -OptionWizard.52=Fichier CSV/CED uniquement avec des coordonnées -OptionWizard.53=Pas de points -OptionWizard.54=Point central -OptionWizard.55=Erreur pendant l'importation du dossier projet -OptionWizard.56=Charger le projet -OptionWizard.57=Projets chargés précedemment -OptionWizard.58=Ouvrir GEE Code Editor (nécessite un accès restreint Trusted Tester) -OptionWizard.59=Ouvrir Here Maps -OptionWizard.5=Port Serveur Collect Earth \: -OptionWizard.65=Chemin jusqu'au serveur Saiku -OptionWizard.66=Parcourir -OptionWizard.67=Chemin jusqu'à Firefox -OptionWizard.68=Parcourir -OptionWizard.6=Paramètres de la BD PostGreSQL -OptionWizard.70=Fichiers exécutables -OptionWizard.72=Fichiers binaires -OptionWizard.73=Chemin jusqu'à Chrome -OptionWizard.74=Parcourir -OptionWizard.76=Fichiers exécutables -OptionWizard.78=Fichiers binaires -OptionWizard.79=Chemin jusqu'au modèle Freemarker KML -OptionWizard.7=Nom d'utilisateur -OptionWizard.80=Parcourir -OptionWizard.82=Modèle Freemarker -OptionWizard.83=Chemin jusqu'au Ballon HTML -OptionWizard.84=Parcourir -OptionWizard.86=Page web HTML -OptionWizard.87=Chemin jusqu'au fichier XML contenant la définition IDM -OptionWizard.88=Parcourir -OptionWizard.8=Mot de passe -OptionWizard.90=Définition IDM XML -OptionWizard.91=Serveur (version gestionnaire ou autonome) -OptionWizard.92=Client (opérateur/connecté au serveur) -OptionWizard.93=SQLite (Fichier intégré / Unique) -OptionWizard.94=PostgreSQL -OptionWizard.95=Côté des points d'échantillonnage (en mètres) -OptionWizard.9=Nom de la base -ProcessMonitorDialog.1=Erreur d’interprétation sur numéro de rangée -ProcessMonitorDialog.4=, colonnes -ProcessMonitorDialog.5=\ -- valeures -SaikuAnalysisListener.0=Oui - Rafraichir les données Saiku (processus long) -SaikuAnalysisListener.1=Non - Utiliser la même version des données que la dernière fois que Saiku a été utilisé -SaikuToolExportListener.1=Génération de l'outil Saiku -SaikuToolExportListener.2=Génération de l'outil Saiku avec la base de données actuelle -SaikuStarter.1=Démarrer Saïku -SaikuStarter.2=Démarrer Saïku peut prendre plusieurs minutes, veuillez patienter\! -SaveEarthDataServlet.0=Requête vide -SaveEarthDataServlet.1=Problème lors de la sauvegarde de la base de données -SaveEarthDataServlet.2=Les données ont été sauvées -SlopeCode.0=Plan (0-5) -YES=Oui -YES_TO_ALL=Oui à tous \ No newline at end of file +AboutDialog.19=कोई समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ +AboutDialog.5=अधिक जानकारी के लिठहमारी वेबसाइट पर जाà¤à¤‚ OpenForis.org +AboutDialog.6=कà¥à¤·à¤®à¤¾ करें, à¤à¤• समसà¥à¤¯à¤¾ आपके सिसà¥à¤Ÿà¤® के मानक बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में इस लिंक को खोलने की कोशिश कर रही है. +AboutDialog.8=ठीक +AspectCode.0=उतà¥à¤¤à¤° दिशा +AspectCode.1=उतà¥à¤¤à¤°-पूरà¥à¤µ दिशा +AspectCode.2=पूरà¥à¤µ दिशा +AspectCode.3=दकà¥à¤·à¤¿à¤£-पूरà¥à¤µ दिशा +AspectCode.4=दकà¥à¤·à¤¿à¤£ दिशा +AspectCode.5=दकà¥à¤·à¤¿à¤£-पशà¥à¤šà¤¿à¤® दिशा +AspectCode.6=पशà¥à¤šà¤¿à¤® दिशा +AspectCode.7=उतà¥à¤¤à¤°-पशà¥à¤šà¤¿à¤® दिशा +CollectEarthWindow.0=तà¥à¤°à¥à¤Ÿà¤¿ जब सीà¤à¤¸à¤µà¥€ फ़ाइल में डेटा निरà¥à¤¯à¤¾à¤¤ करने का पà¥à¤°à¤¯à¤¾à¤¸ +CollectEarthWindow.1=निरà¥à¤¯à¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.10=फ़ाइल +CollectEarthWindow.11=बाहर जाà¤à¤‚ +CollectEarthWindow.12=उपकरण +CollectEarthWindow.13=डेटा सीà¤à¤¸à¤µà¥€ निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.14=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ +CollectEarthWindow.15=गà¥à¤£ +CollectEarthWindow.16=मदद +CollectEarthWindow.17=असà¥à¤µà¥€à¤•रण +CollectEarthWindow.18=डेटाबेस में लापता भूखंडों खोजें +CollectEarthWindow.19=पृथà¥à¤µà¥€ इकटà¥à¤ à¤¾ +CollectEarthWindow.2=भाषा +CollectEarthWindow.20=डà¥à¤ªà¥à¤²à¤¿à¤•ेट रिकॉरà¥à¤¡ की संखà¥à¤¯à¤¾\: +CollectEarthWindow.21=मà¥à¤–à¥à¤¯ फà¥à¤°à¥‡à¤® के लिठआइकन नहीं मिल सकता है +CollectEarthWindow.22=आपको लगता है कि आप à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ बंद करना चाहते हैं? विंडोज बंद करने से, à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° बंद हो जाà¤à¤—ा +CollectEarthWindow.23=पà¥à¤·à¥à¤Ÿà¤¿ की जरूरत है +CollectEarthWindow.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.25=आप वैसे भी इन अभिलेखों को जोड़ना चाहते हैं और अपने वरà¥à¤¤à¤®à¤¾à¤¨ डेटा खोने के लिठकिलक करना चाहते हैं? +CollectEarthWindow.26=ऑपरेटर,पà¥à¤°à¤šà¤¾à¤²à¤• +CollectEarthWindow.27=अदà¥à¤¯à¤¤à¤¨ +CollectEarthWindow.28= औपन फौरिस à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° चल रहा होना चाहिठ, जबभी ऑपरेटर डेटा की वà¥à¤¯à¤¾à¤–à¥à¤¯à¤¾ करें . +CollectEarthWindow.29=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. +CollectEarthWindow.3= आयात संबंधी तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.30=जबभी आप गà¥à¤—ल अरà¥à¤¥ का उपयोग कर रहे हैं, कृपया इस विंडोज को खà¥à¤²à¥€ बनाठरखें. +CollectEarthWindow.31=à¤à¤•तà¥à¤° डेटा सीà¤à¤¸à¤µà¥€ फाइल में भेजें +CollectEarthWindow.32=छोड़ना +CollectEarthWindow.33=ऑपरेटर का नाम के 5 अकà¥à¤·à¤° से बड़ा और 50 अकà¥à¤·à¤° से कम होना चाहिठ+CollectEarthWindow.34=मानà¥à¤¯à¤¤à¤¾ तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.35=ऑपरेटर नाम खाली\!
कृपया ऑपरेटर का नाम भरें और "अदà¥à¤¯à¤¤à¤¨" बटन दबाà¤à¤. +CollectEarthWindow.36=ऑपरेटर नाम रिकà¥à¤¤ नहीं हो सकता +CollectEarthWindow.37=खà¥à¤²à¤¾ रखो +CollectEarthWindow.38=सीà¤à¤¸à¤µà¥€ फ़ाइल +CollectEarthWindow.39=सूचना\: यह सलाह दी जाती है कि आप नठडेटा डालने करने से पहले अपने मौजूदा आंकडों को बैकअप(à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤) कर लें +CollectEarthWindow.4=à¤à¤«à¤à¤“ असà¥à¤µà¥€à¤•रण नोटिस +CollectEarthWindow.40=उस फ़ोलà¥à¤¡à¤° पर जाà¤à¤‚ जहां साà¤à¤•ॠसरà¥à¤µà¤° में सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ किया गया है, फ़ोलà¥à¤¡à¤° का रासà¥à¤¤à¤¾ उपकरण> गà¥à¤£> उनà¥à¤¨à¤¤ टैब. +CollectEarthWindow.41=निरà¥à¤¯à¤¾à¤¤ डेटा को फ़ाइल में बचाया जा रहा है \: +CollectEarthWindow.42=छोड़ना +CollectEarthWindow.43=परसà¥à¤ªà¤° विरोधी रिकॉरà¥à¤¡ पाया +CollectEarthWindow.44=डेटा आयात / निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.45=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ डेटा (संकà¥à¤šà¤¿à¤¤) +CollectEarthWindow.46=ज़िप से नठडेटा आयात करें (संकà¥à¤šà¤¿à¤¤ à¤à¤•à¥à¤¸à¤à¤®à¤à¤²) +CollectEarthWindow.55=सीà¤à¤¸à¤µà¥€ का उपयोग कर मौजूदा रिकॉरà¥à¤¡ को अपडेट करें +CollectEarthWindow.47=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. +CollectEarthWindow.48=ज़िप / à¤à¤•तà¥à¤°-डेटा फ़ाइल +CollectEarthWindow.49=फà¥à¤¯à¥‚जन सीà¤à¤¸à¤µà¥€ फ़ाइल +CollectEarthWindow.5=बंद करे +CollectEarthWindow.50= उपयोगकरà¥à¤¤à¤¾ मैनà¥à¤…ल खोलें +CollectEarthWindow.51=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ के अदà¥à¤¯à¤¤à¤¨ के लिठजाà¤à¤š करें +CollectEarthWindow.52= अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— लॉग फ़ाइल खोलें +CollectEarthWindow.53=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ लॉग फ़ाइल +CollectEarthWindow.54=केà¤à¤®à¤à¤² से लोड अंक +CollectEarthWindow.56=के विषय में... +CollectEarthWindow.57=साà¤à¤•ॠसà¥à¤Ÿà¤¾à¤°à¥à¤Ÿà¤° पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ अभी भी चल रहा है, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें. +CollectEarthWindow.58=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ नहीं कर सकते +CollectEarthWindow.59=आप साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ के लिठडेटा सेट फिर से उतà¥à¤ªà¤¨à¥à¤¨ करने के लिठकरना चाहते हैं?
यह पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ समय लेने वाली हो सकती है.
आप यदि "हाà¤"पर कà¥à¤²à¤¿à¤• करें, तो नवीनतम जानकारी के साथ à¤à¤• नया डाटासेट उतà¥à¤ªà¤¨à¥à¤¨ हो जाà¤à¤—ा. +CollectEarthWindow.6=फà¥à¤¯à¥‚जन टेबल के लिठनिरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.60=साà¤à¤•ॠडेटा उतà¥à¤ªà¤¨à¥à¤¨ +CollectEarthWindow.61=डेटा à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ (पिछले निरà¥à¤¯à¤¾à¤¤ के बाद से संशोधित रिकॉरà¥à¤¡) +CollectEarthWindow.62=के विषय मे... +CollectEarthWindow.63=केà¤à¤®à¤à¤² से अंक पà¥à¤°à¤¾à¤ªà¥à¤¤ करने में तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.64=तकनीकी सहायता +CollectEarthWindow.7=डेटा आयात में तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.8=असà¥à¤µà¥€à¤•रण पाठ नहीं पाया जा सका +CollectEarthWindow.9=डेटा आयात रिकॉरà¥à¤¡ वह है जो कि पहले से ही अपने डेटाबेस पर मौजूद हैं शामिल. +DynamicsCode.0=पà¥à¤°à¤¾à¤°à¤‚भ में वन +DynamicsCode.1=पà¥à¤°à¤¾à¤°à¤‚भ में घास का मैदान, +DynamicsCode.2=पà¥à¤°à¤¾à¤°à¤‚भ में आबादी वाला इलाका +DynamicsCode.3=पà¥à¤°à¤¾à¤°à¤‚भ में बंजर +DynamicsCode.4=पà¥à¤°à¤¾à¤°à¤‚भ में आरà¥à¤¦à¥à¤° भूमि +DynamicsCode.5=पà¥à¤°à¤¾à¤°à¤‚भ में खेत +OpenTextFileListener.0=इस पाठ का फ़ाइल नहीं मिला \: +OptionWizard.0= विकलà¥à¤ª +OptionWizard.1=बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° चà¥à¤¨à¥‡à¤‚ +OptionWizard.10=बैकअप फ़ोलà¥à¤¡à¤° खोलें +OptionWizard.11=अजà¥à¤žà¤¾à¤¤\: उपयोग ifconfig +OptionWizard.12=गà¥à¤°à¤¾à¤¹à¤•ों का उलà¥à¤²à¥‡à¤– +OptionWizard.13=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° आईपी +OptionWizard.14=कतà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ (उदाहरण- 8023) +OptionWizard.15=बचाà¤à¤‚ और परिवरà¥à¤¤à¤¨ लागू करें +OptionWizard.16=आईडी +OptionWizard.17=X- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क +OptionWizard.18=Y- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क +OptionWizard.19=उठान +OptionWizard.2=कारà¥à¤¯à¤ªà¥à¤°à¤µà¤¾à¤¹ (सरà¥à¤µà¤° / गà¥à¤°à¤¾à¤¹à¤•) +OptionWizard.20=गूगल अरà¥à¤¥ अंतरà¥à¤µà¤¸à¥à¤¤à¥ बदल दिया गया है
यदि गà¥à¤—ल अरà¥à¤¥ आप से कहे,अंतरà¥à¤µà¤¸à¥à¤¤à¥ पà¥à¤¨à¤ƒ लोड सà¥à¤µà¥€à¤•ार करें . +OptionWizard.21=अदà¥à¤¯à¤¤à¤¨ सफल +OptionWizard.22=ढाल +OptionWizard.23=गूगल अरà¥à¤¥ डेटा को फिर से खोलने में कोई तà¥à¤°à¥à¤Ÿà¤¿ थी +OptionWizard.24=रदà¥à¤¦ करना +OptionWizard.25=ऑपरेशन मोड +OptionWizard.26=डीबी होसà¥à¤Ÿ +OptionWizard.27=यह à¤à¤• मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ साà¤à¤•ॠफ़ोलà¥à¤¡à¤° नहीं है ( सà¥à¤Ÿà¤¾à¤°à¥à¤Ÿ-साà¤à¤•à¥.batफ़ाइल मौजूद नहीं है) +OptionWizard.28=साà¤à¤•ॠसरà¥à¤µà¤° मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ नहीं +OptionWizard.29=डीबी पोरà¥à¤Ÿ +OptionWizard.3=सरà¥à¤µà¤° आवृतà¥à¤¤à¤¿ +OptionWizard.30=à¤à¤¸à¤•à¥à¤¯à¥ लाइट विकलà¥à¤ª +OptionWizard.31=सेमà¥à¤ªà¤² डेटा +OptionWizard.32=पà¥à¤²à¥‰à¤Ÿ लेआउट +OptionWizard.33=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ परिभाषा +OptionWizard.34=विकसित +OptionWizard.35=सेमà¥à¤ªà¤² अंक की संखà¥à¤¯à¤¾ +OptionWizard.36=सेमà¥à¤ªà¤² बिंदॠके बीच दूरी (मीटर में) +OptionWizard.37=भूखंड की सीमा के साथ मारà¥à¤œà¤¿à¤¨ (मीटर मे) +OptionWizard.38=सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सही ढंग से पढ़ा नहीं जा सकता.
इस फ़ाइल में à¤à¤• अलà¥à¤ªà¤µà¤¿à¤°à¤¾à¤® से अलग मूलà¥à¤¯à¥‹à¤‚ की उमà¥à¤®à¥€à¤¦ है \:
+OptionWizard.39=आईडी, वाई समनà¥à¤µà¤¯, à¤à¤•à¥à¤¸ समनà¥à¤µà¤¯, ऊंचाई, ढाल, पहलू +OptionWizard.4=वरà¥à¤¤à¤®à¤¾à¤¨ कंपà¥à¤¯à¥‚टर आईपी \: +OptionWizard.40=परियोजनाà¤à¤‚ +OptionWizard.41=à¤à¤• नई परियोजना फ़ाइल लोड करें +OptionWizard.42=सीà¤à¤¸à¤µà¥€ पाठक को बंद करते समय तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.43=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ का नाम +OptionWizard.44= सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ बैकअप डेटाबेस +OptionWizard.45=ओपन पृथà¥à¤µà¥€ इंजन ने पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° में जूम किया +OptionWizard.46=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठपृथà¥à¤µà¥€ इंजन टाइमलैपà¥à¤¸ खोलें +OptionWizard.47=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठबिंग मैपà¥à¤¸ खोलें +OptionWizard.48=बजाय गूगल अरà¥à¤¥ के फॉरà¥à¤® à¤à¤• बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° पर खोलें (लिनकà¥à¤¸ के लिठसिफारिश) +OptionWizard.49=भूखंड डेटा के साथ सीईडी / सीà¤à¤¸à¤µà¥€ फाइल भेजने के लिठपथ +OptionWizard.5=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ\: +OptionWizard.50=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.51=परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.52=केवल निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क के साथ सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल +OptionWizard.53=चौकोर +OptionWizard.54=केनà¥à¤¦à¥à¤°à¥€à¤¯ बिनà¥à¤¦à¥ +OptionWizard.55=परियोजना फ़ोलà¥à¤¡à¤° आयात तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.56=लोड परियोजना +OptionWizard.57=पहले से लोड परियोजना +OptionWizard.58= जी ई ई का मैदान खोलें (विशà¥à¤µà¤¸à¤¨à¥€à¤¯ जांचकरà¥à¤¤à¤¾ के उपयोग की आवशà¥à¤¯à¤•ता है) +OptionWizard.59=यहां भूखंड पर केंदà¥à¤°à¤¿à¤¤ मैपà¥à¤¸ खोलें +OptionWizard.6=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² डीबी मापदंड +OptionWizard.65=साà¤à¤•à¥à¤«à¤¼à¥‹à¤²à¥à¤¡à¤° का पथ +OptionWizard.66=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.67=फ़ायरफ़ॉकà¥à¤¸ निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ +OptionWizard.68=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.7=उपयोगकरà¥à¤¤à¤¾ नाम +OptionWizard.70=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों +OptionWizard.72=बाइनरी फ़ाइलें +OptionWizard.73=कà¥à¤°à¥‹à¤® निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ +OptionWizard.74=बà¥à¤°à¤¾à¤‰à¤œ +OptionWizard.76=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों +OptionWizard.78=बाइनरी फ़ाइलें +OptionWizard.79=केà¤à¤®à¤à¤² फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ के लिठपथ +OptionWizard.8=पासवरà¥à¤¡ +OptionWizard.80=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.82=फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ +OptionWizard.83=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ पà¥à¤°à¤ªà¤¤à¥à¤° डिज़ाइन करने के लिठपथ +OptionWizard.84=बà¥à¤°à¤¾à¤‰à¤œ..... +OptionWizard.86=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² वेब पेज +OptionWizard.87=पथ आइडीà¤à¤® परिभाषा के साथ à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठ+OptionWizard.88=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.9=डीबी नाम +OptionWizard.90=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² आइडीà¤à¤® परिभाषा +OptionWizard.91=सरà¥à¤µà¤° (पà¥à¤°à¤¬à¤‚धक संसà¥à¤•रण या खड़े अकेले का उपयोग करें) +OptionWizard.92=कà¥à¤²à¤¾à¤‡à¤‚ट (ऑपरेटर / सरà¥à¤µà¤° से जà¥à¤¡à¤¼à¥‡) +OptionWizard.93=सकà¥à¤¯à¥‚à¤à¤²à¤¾à¤‡à¤Ÿ (à¤à¤‚बेडेड / à¤à¤•ल फाइल आधारित) +OptionWizard.94=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² +OptionWizard.95=सेमà¥à¤ªà¤² डॉटà¥à¤¸ के साइड (मीटर में) +SaikuAnalysisListener.0=हाठ- ताज़ा साà¤à¤•ॠडेटा (लंबी पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾) +SaikuAnalysisListener.1=नहीं - बस साà¤à¤•ॠशà¥à¤°à¥‚ +SaikuStarter.1=साà¤à¤•ॠशà¥à¤°à¥‚ +SaikuStarter.2= साà¤à¤•ॠशà¥à¤°à¥‚ कà¥à¤› मिनट लग सकते हैं, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें\! +SaveEarthDataServlet.0=खाली अनà¥à¤°à¥‹à¤§ +SaveEarthDataServlet.1= डेटाबेस में डेटा बचाते समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ है +SaveEarthDataServlet.2=डेटा बचाया था +SlopeCode.0=समतल (0-5) +EarthApp.11=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ पहले से ही चल रहा है +EarthApp.21=à¤à¤• सीà¤à¤¸à¤µà¥€ / सीईडी के रूप में भूखंडों की गà¥à¤°à¤¿à¤¡ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
+EarthApp.23=कोई सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सेट-अप नहीं किया गया है \:

+EarthApp.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² परिभाषा के साथ फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है \:
+EarthApp.26=कोई à¤à¤•à¥à¤¸à¤à¤®à¤à¤² फ़ाइल परिभाषा सेट अप नहीं किया गया है \:

+EarthApp.27=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ रूप से यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
+EarthApp.29=कोई à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ फ़ाइल सेट-अप नहीं किया गया है \:

+EarthApp.3=मà¥à¤à¥‡ बाद में याद दिलाना +EarthApp.30=उपकरण> गà¥à¤£ मेनू में फ़ाइल सà¥à¤¥à¤¾à¤¨ को ठीक करें . +EarthApp.4=अभी अदà¥à¤¯à¤¤à¤¨ करें +EarthApp.5=मà¥à¤à¥‡ दà¥à¤¬à¤¾à¤°à¤¾ याद मत दिलाना +EarthApp.57=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ का à¤à¤• नया संसà¥à¤•रण उपलबà¥à¤§ है\!
आप कैसे आगे बढ़ना चाहते हैं? +EarthApp.58=अदà¥à¤¯à¤¤à¤¨ चेतावनी +EarthApp.59= परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ +EarthApp.6=\ - संसà¥à¤•रण +EarthApp.61=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ फाइल खà¥à¤² नहीं सकती .
कृपया सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करें कि गूगल अरà¥à¤¥ सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ है. +EarthSurveyService.9=आवशà¥à¤¯à¤• कà¥à¤·à¥‡à¤¤à¥à¤° +ExportActionListener.1= तारीख चूनें जबसे रिकॉरà¥à¤¡ निरà¥à¤¯à¤¾à¤¤ करने है +ExportDialogProcessMonitor.0=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... +ExportDialogProcessMonitor.1=पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ पà¥à¤°à¤¾à¤°à¤‚भ करने के लिठपà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ कर रहा है \: +ExportDialogProcessMonitor.4=निरà¥à¤¯à¤¾à¤¤ रिकॉरà¥à¤¡\: +ImportProcessMonitorDialog.0=आयातित रिकॉरà¥à¤¡ \: +ImportActionListener.0=कà¥à¤¯à¤¾ उन भूखंडों के लिठडेटा जो कि पूरी तरह से भरे नहीं गठ,आयातित किया जाना चाहिà¤? +ImportActionListener.2=आप कà¥à¤²à¤¿à¤• करें, नहींतो केवल डेटा "हरी" राजà¥à¤¯ में भूखंडों से ,जिसमें सभी डेटा यà¥à¤•à¥à¤¤ है , आयात किया जाà¤à¤—ा। +ImportDialogProcessMonitor.0=\ गणना +ImportDialogProcessMonitor.11=रिकॉरà¥à¤¡ की पà¥à¤°à¤¾à¤°à¤‚भिक संखà¥à¤¯à¤¾ \: +ImportDialogProcessMonitor.2=रिकॉरà¥à¤¡ आयात... +ImportDialogProcessMonitor.5=आयातित रिकॉरà¥à¤¡ की वासà¥à¤¤à¤µà¤¿à¤• संखà¥à¤¯à¤¾ \: +ImportDialogProcessMonitor.8=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... +InfiniteProgressMonitor.0=रदà¥à¤¦ ऑपरेशन +JFileChooserExistsAware.0=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ परियोजना फ़ाइल +KmlImportService.13=पà¥à¤²à¥‰à¤Ÿ सà¥à¤¥à¤¾à¤¨à¥‹à¤‚ को बचाने के लिठà¤à¤• सीà¤à¤¸à¤µà¥€ फ़ाइल का चयन करें +MissingPlotsListener.0=तà¥à¤°à¥à¤Ÿà¤¿ उन भूखंडों के बारे में जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ करने के लिठजो डेटाबेस पर मौजूद नहीं +MissingPlotsListener.1=गà¥à¤® भूखंड +MissingPlotsListener.10=सेमà¥à¤ªà¤² डिजाइन में भूखंडों की कà¥à¤² संखà¥à¤¯à¤¾ \: +MissingPlotsListener.12=गà¥à¤® भूखंडों की संखà¥à¤¯à¤¾ \: +MissingPlotsListener.14=सभी भूखंडों भर रहे हैं\! +MissingPlotsListener.2=कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ अंतरà¥à¤µà¤¸à¥à¤¤à¥ की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ +MissingPlotsListener.3=भूखंड की जानकारी वाले फ़ाइलें चà¥à¤¨à¥‡à¤‚ ( .सीà¤à¤¸à¤µà¥€ या .सीईडी फ़ाइलें ) जिसके लिठआप जानना चाहते हैं तो सभी डेटा भर दिया गया है चाहता हूà¤. +MissingPlotsListener.4=गà¥à¤® भूखंड- जानकारी +MissingPlotsListener.5=फ़ाइल से \: +MissingPlotsListener.6=सीà¤à¤¡à¥€ फ़ाइल में निरà¥à¤¯à¤¾à¤¤ करें +ProcessMonitorDialog.1=पंकà¥à¤¤à¤¿ संखà¥à¤¯à¤¾ पर तà¥à¤°à¥à¤Ÿà¤¿ +ProcessMonitorDialog.4=, कॉलम +ProcessMonitorDialog.5=\ --मूलà¥à¤¯ +YES= हां +YES_TO_ALL=सब को हां +NO=नहीं +NO_TO_ALL=सभी को नहीं + + + From 7da2e70da33d5b6782e32270863826907a504ef9 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:35:46 +0100 Subject: [PATCH 0806/1620] New translations Messages_hi.properties (Spanish) --- .../earth/app/view/Messages_es.properties | 483 +++++++++--------- 1 file changed, 228 insertions(+), 255 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 5199a9b624..f759c433b0 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,255 +1,228 @@ -AboutDialog.19=UN problème est apparu -AboutDialog.5=Pour plus d’infos, visitez notre site web OpenForis.org -AboutDialog.6=Désolé, il y a eu un problème lors de l’ouverture du lien avec votre navigateur par défaut. -AboutDialog.8=Ok -AspectCode.0=Nord -AspectCode.1=Nord-Est -AspectCode.2=Est -AspectCode.3=Sud-Est -AspectCode.4=Sud -AspectCode.5=Sud-Ouest -AspectCode.6=Ouest -AspectCode.7=Nord-Ouest -CollectEarthMenu.0=Importe le fichier .CEP -CollectEarthMenu.2=Utilitaires -CollectEarthMenu.3=Divise un large tableau CSV en plusieurs parties -CollectEarthMenu.4=Exporte les données en XML (à partir d'une date précise jusqu'à aujourd'hui) -CollectEarthMenu.5=Exporte sur la sauvegarde Collect Backup -CollectEarthMenu.6=Exporte les données en tant que sauvegarde Collect Backup (toutes les données) -CollectEarthMenu.7=Exporte les données en tant que sauvegarde Collect Backup (à partir de) -CollectEarthMenu.8=Exporte les données en XML (filtrer par attribut) -CollectEarthWindow.0=Erreur pendant l'exportation des données en csv -CollectEarthWindow.10=Fichier -CollectEarthWindow.11=Quitter -CollectEarthWindow.12=Outils -CollectEarthWindow.13=Télécharger les données en CSV (Excel) -CollectEarthWindow.14=Démarrer l'analyse avec Saïku -CollectEarthWindow.15=Propriétés -CollectEarthWindow.16=Aide -CollectEarthWindow.17=Avertissement -CollectEarthWindow.18=Trouver les placettes manquantes dans la base de données -CollectEarthWindow.19=Collect Earth -CollectEarthWindow.1=Erreur d'exportation -CollectEarthWindow.20=Nombre d'enregistrements dupliqués -CollectEarthWindow.21=Icône non trouvée -CollectEarthWindow.22= Êtes-vous sûr de vouloir fermer CollectEarth
Fermer cette fenêtre fermera aussi le serveur -CollectEarthWindow.23=Confirmation requise -CollectEarthWindow.24=Exporter en XML -CollectEarthWindow.25=Voulez-vous ajouter tout de même ces données et perdre vos enregistrements? -CollectEarthWindow.26=Utilisateur -CollectEarthWindow.27=Appliquer -CollectEarthWindow.28=Le serveur devrait être démarré pour la saisie des données par les utilisateurs. -CollectEarthWindow.29=Le serveur Saiku n'est pas configuré. -CollectEarthWindow.2=Langue -CollectEarthWindow.30=Veuillez garder cette fenêtre active pendant que vous utilisez Google Earth -CollectEarthWindow.31=Exporter les données collectées en CSV -CollectEarthWindow.32=Fermer -CollectEarthWindow.33=Le nom de l'utilisateur doit comprendre entre 5 et 50 caractères -CollectEarthWindow.34=Erreur de validation -CollectEarthWindow.35= NOM DE L'UTILISATEUR VIDE\!
Veuillez renseigner le champs et Appuyer sur "Mise à jour" -CollectEarthWindow.36=Le nom de l'utilisateur ne peut pas être vide -CollectEarthWindow.37=Laisser ouvert -CollectEarthWindow.38=Fichiers CSV -CollectEarthWindow.39=NOTE \: Il est conseillé de sauvegarder vos données (export en XML) avant d'importer de nouvelles données -CollectEarthWindow.3=\ Erreur pendant l'importation -CollectEarthWindow.40=Renseigner le chemin jusqu'au serveur Saiku dans /Outils/Propriétés/Avancé. -CollectEarthWindow.41=Sauvegarde des données exportées dans le fichier\: -CollectEarthWindow.42=Quitter -CollectEarthWindow.43=Enregistrements conflictuels trouvés -CollectEarthWindow.44=Importer/Exporter les données -CollectEarthWindow.45=Exporter les données en XML (zippé) -CollectEarthWindow.46=Importer de nouvelles données depuis ZIP (XML zippé) -CollectEarthWindow.47=Le serveur Saiku n'est pas configuré -CollectEarthWindow.48=Fichier zip/collect-data -CollectEarthWindow.49=Fusion des fichiers CSV -CollectEarthWindow.4=Clause de non-responsabilité de la FAO -CollectEarthWindow.50=Ouvrir le manuel utilisateur -CollectEarthWindow.51=Vérifier les mises à jour des Collect Earth -CollectEarthWindow.52=Fichier de logs Open Application -CollectEarthWindow.53=Fichier de logs Collect Earth -CollectEarthWindow.54=Charger les points de KML -CollectEarthWindow.55=Mettre à jour les enregistrements en utilisant un fichier CSV -CollectEarthWindow.56=A propos... -CollectEarthWindow.57=Le processus de démarrage de Saïku est en cours, veuillez patienter -CollectEarthWindow.58=Impossible de démarrer l'analyse avec Saïku -CollectEarthWindow.59=Voulez-vous régénérer le jeu de données?
Cela peut prendre du temps.
Cliquer sur oui pour régénérer un nouveau jeu de données avec les dernières informations -CollectEarthWindow.5=Fermer -CollectEarthWindow.60=Génération des données Saïku -CollectEarthWindow.61=Exporter en XML (uniquement les enregistrements modifiés/ajoutés) -CollectEarthWindow.62=A propos… -CollectEarthWindow.63=Erreur en accédant aux points de KML -CollectEarthWindow.64=Assistance technique -CollectEarthWindow.65=Le nom de l'opérateur a été changé -CollectEarthWindow.66=Nom de l'opérateur -CollectEarthWindow.67=Ouvrir le dossier de données de CE -CollectEarthWindow.6=Exporter en Table de Fusion -CollectEarthWindow.70=Ouvrez le manuel de cette enquête -CollectEarthWindow.71=Générer un outil Saiku autonome -CollectEarthWindow.7=Erreur pendant l'importation des données -CollectEarthWindow.8=Le texte est introuvable -CollectEarthWindow.9=Les données importées contiennent des redondances avec celles présentes dans la base -DynamicsCode.0= Terre Forestière initialement -DynamicsCode.1= Prairie initialement -DynamicsCode.2= Etablissement initialement -DynamicsCode.3= Autre terre initialement -DynamicsCode.4= Terre humide initialement -DynamicsCode.5= Terre cultivée initialement -EarthApp.11=Collect Earth est déjà en cours d’exécution -EarthApp.21=Le fichier CSV/CED contenant les points est introuvable \:
-EarthApp.23=Aucun fichier CSV/CED spécifié \:

-EarthApp.24=Le fichier contenant le modèle de définition KML est introuvable \:
-EarthApp.26=Aucun modèle de définition spécifié\:

-EarthApp.27=Le fichier contenant le ballon HTML est introuvable \:
-EarthApp.29=Aucun ballon HTML spécifié \:

-EarthApp.30=Veuillez corriger le chemin d’accès dans le menu Outils -> Propriétés. -EarthApp.3=Rappelez le moi plus tard -EarthApp.4=Mettre a jour maintenant -EarthApp.57= Une nouvelle version de Collect Earth est disponible\! Utiliser le Menu -EarthApp.58=Alerte de mise à jour -EarthApp.59=Erreur pendant l’importation du fichier -EarthApp.5=Ne me le rappelez plus -EarthApp.61=Le fichier Collect Earth est introuvable br/>Veuillez-vous assurer que Google Earth est installé. -EarthApp.6=\ - Version -EarthApp.70=AVERTISSMENT -EarthApp.71=Sous Mac OS X, les fichiers de projet Collect Earth (* .cep) ne s'ouvriront pas dans Collect Earth lorsqu'ils sont double-cliqués.
-EarthApp.72=Utilisez la barre d'outils Collect Earth pour ouvrir les fichiers .cep \: -EarthApp.73=Collect Earth - problèmes sur les ordinateurs Mac OS X -EarthSurveyService.9=Champs requis -ExportActionListener.1=Choisir la date pour les données à exporter -ExportDialogProcessMonitor.0=Chargement des données... -ExportDialogProcessMonitor.1=Attente d'initialisation de l'export -ExportDialogProcessMonitor.4=Enregistrements exportés \: -ImportActionListener.0=Est-ce que les données pour les placettes qui ne sont pas complètes doivent être importées ? -ImportActionListener.2=Si vous cliquez sur NO, seulement les données provenant des placettes avec la marque « verte », qui contiennent toutes les données, seront importées -ImportActionListener.3=Importer les enregistrements incomplets -ImportDialogProcessMonitor.0=Calcul en cours -ImportDialogProcessMonitor.11=Nombre initial d' enregistrements \: -ImportDialogProcessMonitor.2=Chargement des enregistrements... -ImportDialogProcessMonitor.5=Nombre réel d'enregistrements importés\: -ImportDialogProcessMonitor.8=Chargement des données... -ImportProcessMonitorDialog.0=Enregistrements importés \: -ImportXMLDialogProcessMonitor.1 = Écraser les données dans la base de données -ImportXMLDialogProcessMonitor.2 = Importer uniquement des enregistrements non conflictuels -InfiniteProgressMonitor.0=Annuler l’opération -JFileChooserExistsAware.0=Fichier projet Collect Earth -KmlImportService.13=Sélectionnez un fichier CSV pour enregistrer les emplacements des parcelles -MissingPlotsListener.0=Erreur au cours de l’enregistrement des placettes absentes de la base de données -MissingPlotsListener.10=Nombre total de parcelles dans le plan d'échantillonnage \: -MissingPlotsListener.12=Nombre de parcelles manquantes \: -MissingPlotsListener.14=Toutes les parcelles sont remplis\! -MissingPlotsListener.1=Placettes manquantes -MissingPlotsListener.2=Copier le contenu sur le clipboard -MissingPlotsListener.3=Choisir les fichiers qui contiennent les informations des placettes (.csv ou .ced) pour lesquelles vous voulez savoir si toues les placettes ont été renseignées -MissingPlotsListener.4=Placettes manquantes – Information -MissingPlotsListener.5=Depuis le fichier \: -MissingPlotsListener.6=Exporter en CED -NO=Non -NO_TO_ALL=Non à tous -OpenTextFileListener.0=Le fichier texte n'a pas été trouvé dans \: -OptionWizard.0=Options Collect Earth -OptionWizard.100=Ouvrir Planet -OptionWizard.101=Clé API Planet -OptionWizard.1021=URL SecureWatch -OptionWizard.102=Ouvrir Maxar SecureWatch -OptionWizard.103=Définir le URL pour le Carte Extra (ouvre quand il est réglé) \: -OptionWizard.104=Navigateurs -OptionWizard.105=Ouvrir Earth Map -OptionWizard.110=Utiliser les images mensuelles fournies par NICFI -OptionWizard.10=Montrer les fichiers de sauvegarde -OptionWizard.11=Inconnu \: utiliser ifconfig -OptionWizard.12=Instance client -OptionWizard.13=IP Serveur de Collect Earth -OptionWizard.14=Port Serveur de Collect Earth (e.g. 8023) -OptionWizard.15=Appliquer et sauvegarder les changements -OptionWizard.16=ID -OptionWizard.17=Coord-X -OptionWizard.18=Coord-Y -OptionWizard.19=Altitude -OptionWizard.1=Choisir un navigateur -OptionWizard.20= Le contenu de Google Earth a changé
Veuillez accepter la mise à jour quand GE le demande -OptionWizard.21=Mise à jour réussie -OptionWizard.22=Pente -OptionWizard.23=Il y a eu une erreur pendant la réouverture de Google Earth -OptionWizard.24=Annuler -OptionWizard.25=Mode opération -OptionWizard.26=Hôte pour la BDD -OptionWizard.27=Le dossier n'est pas valide (il manque le fichier start-saiku.bat) -OptionWizard.28=Le dossier Saiku n'est pas reconnu -OptionWizard.29=Port pour la BDD -OptionWizard.2=Flux (serveur/client) -OptionWizard.30=Options SQLite -OptionWizard.31=Points d'échantillonnage -OptionWizard.32=Configuration de la parcelle -OptionWizard.33=Définition de l'enquête -OptionWizard.34=Services intégrés -OptionWizard.35=Nombre de points de contrôle -OptionWizard.36=Distance entre les points de contrôle (en mètres) -OptionWizard.37=Distance au bord de la parcelle (en mètres) -OptionWizard.38=Le Fichier CSV/CED ne peut pas être lu
Le fichier devrait avoir des valeurs séparées par des virgules comme ceci \:
-OptionWizard.39=ID,Coordonnée_Y, Coordonnée_X,altitude,pente,orientation -OptionWizard.3=Instance serveur -OptionWizard.40=Projets -OptionWizard.41=Charger un nouveau fichier projet -OptionWizard.42=Erreur pendant la fermeture du lecteur CSV -OptionWizard.43=Nom de l'enquête -OptionWizard.44=Sauvegarder automatiquement la base dans -OptionWizard.45=Ouvrir Earth Engine Playground (obsolète) -OptionWizard.46=Ouvrir le Timelapse de Google Earth Engine -OptionWizard.47=Ouvrir Bing Maps -OptionWizard.48=Ouvrir le formulaire dans un navigateur plutôt que dans GE (recommandé pour Linux) -OptionWizard.49=Chemin jusqu'au fichier ced/csv avec les données des parcelles -OptionWizard.4=IP actuelle de l'ordinateur -OptionWizard.50=Parcourir -OptionWizard.51=Erreur pendant l'importation du fichier -OptionWizard.52=Fichier CSV/CED uniquement avec des coordonnées -OptionWizard.53=Pas de points -OptionWizard.54=Point central -OptionWizard.55=Erreur pendant l'importation du dossier projet -OptionWizard.56=Charger le projet -OptionWizard.57=Projets chargés précedemment -OptionWizard.58=Ouvrir GEE Code Editor (nécessite un accès restreint Trusted Tester) -OptionWizard.59=Ouvrir Here Maps -OptionWizard.5=Port Serveur Collect Earth \: -OptionWizard.65=Chemin jusqu'au serveur Saiku -OptionWizard.66=Parcourir -OptionWizard.67=Chemin jusqu'à Firefox -OptionWizard.68=Parcourir -OptionWizard.6=Paramètres de la BD PostGreSQL -OptionWizard.70=Fichiers exécutables -OptionWizard.72=Fichiers binaires -OptionWizard.73=Chemin jusqu'à Chrome -OptionWizard.74=Parcourir -OptionWizard.76=Fichiers exécutables -OptionWizard.78=Fichiers binaires -OptionWizard.79=Chemin jusqu'au modèle Freemarker KML -OptionWizard.7=Nom d'utilisateur -OptionWizard.80=Parcourir -OptionWizard.82=Modèle Freemarker -OptionWizard.83=Chemin jusqu'au Ballon HTML -OptionWizard.84=Parcourir -OptionWizard.86=Page web HTML -OptionWizard.87=Chemin jusqu'au fichier XML contenant la définition IDM -OptionWizard.88=Parcourir -OptionWizard.8=Mot de passe -OptionWizard.90=Définition IDM XML -OptionWizard.91=Serveur (version gestionnaire ou autonome) -OptionWizard.92=Client (opérateur/connecté au serveur) -OptionWizard.93=SQLite (Fichier intégré / Unique) -OptionWizard.94=PostgreSQL -OptionWizard.95=Côté des points d'échantillonnage (en mètres) -OptionWizard.9=Nom de la base -ProcessMonitorDialog.1=Erreur d’interprétation sur numéro de rangée -ProcessMonitorDialog.4=, colonnes -ProcessMonitorDialog.5=\ -- valeures -SaikuAnalysisListener.0=Oui - Rafraichir les données Saiku (processus long) -SaikuAnalysisListener.1=Non - Utiliser la même version des données que la dernière fois que Saiku a été utilisé -SaikuToolExportListener.1=Génération de l'outil Saiku -SaikuToolExportListener.2=Génération de l'outil Saiku avec la base de données actuelle -SaikuStarter.1=Démarrer Saïku -SaikuStarter.2=Démarrer Saïku peut prendre plusieurs minutes, veuillez patienter\! -SaveEarthDataServlet.0=Requête vide -SaveEarthDataServlet.1=Problème lors de la sauvegarde de la base de données -SaveEarthDataServlet.2=Les données ont été sauvées -SlopeCode.0=Plan (0-5) -YES=Oui -YES_TO_ALL=Oui à tous \ No newline at end of file +AboutDialog.19=कोई समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ +AboutDialog.5=अधिक जानकारी के लिठहमारी वेबसाइट पर जाà¤à¤‚ OpenForis.org +AboutDialog.6=कà¥à¤·à¤®à¤¾ करें, à¤à¤• समसà¥à¤¯à¤¾ आपके सिसà¥à¤Ÿà¤® के मानक बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में इस लिंक को खोलने की कोशिश कर रही है. +AboutDialog.8=ठीक +AspectCode.0=उतà¥à¤¤à¤° दिशा +AspectCode.1=उतà¥à¤¤à¤°-पूरà¥à¤µ दिशा +AspectCode.2=पूरà¥à¤µ दिशा +AspectCode.3=दकà¥à¤·à¤¿à¤£-पूरà¥à¤µ दिशा +AspectCode.4=दकà¥à¤·à¤¿à¤£ दिशा +AspectCode.5=दकà¥à¤·à¤¿à¤£-पशà¥à¤šà¤¿à¤® दिशा +AspectCode.6=पशà¥à¤šà¤¿à¤® दिशा +AspectCode.7=उतà¥à¤¤à¤°-पशà¥à¤šà¤¿à¤® दिशा +CollectEarthWindow.0=तà¥à¤°à¥à¤Ÿà¤¿ जब सीà¤à¤¸à¤µà¥€ फ़ाइल में डेटा निरà¥à¤¯à¤¾à¤¤ करने का पà¥à¤°à¤¯à¤¾à¤¸ +CollectEarthWindow.1=निरà¥à¤¯à¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.10=फ़ाइल +CollectEarthWindow.11=बाहर जाà¤à¤‚ +CollectEarthWindow.12=उपकरण +CollectEarthWindow.13=डेटा सीà¤à¤¸à¤µà¥€ निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.14=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ +CollectEarthWindow.15=गà¥à¤£ +CollectEarthWindow.16=मदद +CollectEarthWindow.17=असà¥à¤µà¥€à¤•रण +CollectEarthWindow.18=डेटाबेस में लापता भूखंडों खोजें +CollectEarthWindow.19=पृथà¥à¤µà¥€ इकटà¥à¤ à¤¾ +CollectEarthWindow.2=भाषा +CollectEarthWindow.20=डà¥à¤ªà¥à¤²à¤¿à¤•ेट रिकॉरà¥à¤¡ की संखà¥à¤¯à¤¾\: +CollectEarthWindow.21=मà¥à¤–à¥à¤¯ फà¥à¤°à¥‡à¤® के लिठआइकन नहीं मिल सकता है +CollectEarthWindow.22=आपको लगता है कि आप à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ बंद करना चाहते हैं? विंडोज बंद करने से, à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° बंद हो जाà¤à¤—ा +CollectEarthWindow.23=पà¥à¤·à¥à¤Ÿà¤¿ की जरूरत है +CollectEarthWindow.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.25=आप वैसे भी इन अभिलेखों को जोड़ना चाहते हैं और अपने वरà¥à¤¤à¤®à¤¾à¤¨ डेटा खोने के लिठकिलक करना चाहते हैं? +CollectEarthWindow.26=ऑपरेटर,पà¥à¤°à¤šà¤¾à¤²à¤• +CollectEarthWindow.27=अदà¥à¤¯à¤¤à¤¨ +CollectEarthWindow.28= औपन फौरिस à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° चल रहा होना चाहिठ, जबभी ऑपरेटर डेटा की वà¥à¤¯à¤¾à¤–à¥à¤¯à¤¾ करें . +CollectEarthWindow.29=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. +CollectEarthWindow.3= आयात संबंधी तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.30=जबभी आप गà¥à¤—ल अरà¥à¤¥ का उपयोग कर रहे हैं, कृपया इस विंडोज को खà¥à¤²à¥€ बनाठरखें. +CollectEarthWindow.31=à¤à¤•तà¥à¤° डेटा सीà¤à¤¸à¤µà¥€ फाइल में भेजें +CollectEarthWindow.32=छोड़ना +CollectEarthWindow.33=ऑपरेटर का नाम के 5 अकà¥à¤·à¤° से बड़ा और 50 अकà¥à¤·à¤° से कम होना चाहिठ+CollectEarthWindow.34=मानà¥à¤¯à¤¤à¤¾ तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.35=ऑपरेटर नाम खाली\!
कृपया ऑपरेटर का नाम भरें और "अदà¥à¤¯à¤¤à¤¨" बटन दबाà¤à¤. +CollectEarthWindow.36=ऑपरेटर नाम रिकà¥à¤¤ नहीं हो सकता +CollectEarthWindow.37=खà¥à¤²à¤¾ रखो +CollectEarthWindow.38=सीà¤à¤¸à¤µà¥€ फ़ाइल +CollectEarthWindow.39=सूचना\: यह सलाह दी जाती है कि आप नठडेटा डालने करने से पहले अपने मौजूदा आंकडों को बैकअप(à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤) कर लें +CollectEarthWindow.4=à¤à¤«à¤à¤“ असà¥à¤µà¥€à¤•रण नोटिस +CollectEarthWindow.40=उस फ़ोलà¥à¤¡à¤° पर जाà¤à¤‚ जहां साà¤à¤•ॠसरà¥à¤µà¤° में सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ किया गया है, फ़ोलà¥à¤¡à¤° का रासà¥à¤¤à¤¾ उपकरण> गà¥à¤£> उनà¥à¤¨à¤¤ टैब. +CollectEarthWindow.41=निरà¥à¤¯à¤¾à¤¤ डेटा को फ़ाइल में बचाया जा रहा है \: +CollectEarthWindow.42=छोड़ना +CollectEarthWindow.43=परसà¥à¤ªà¤° विरोधी रिकॉरà¥à¤¡ पाया +CollectEarthWindow.44=डेटा आयात / निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.45=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ डेटा (संकà¥à¤šà¤¿à¤¤) +CollectEarthWindow.46=ज़िप से नठडेटा आयात करें (संकà¥à¤šà¤¿à¤¤ à¤à¤•à¥à¤¸à¤à¤®à¤à¤²) +CollectEarthWindow.55=सीà¤à¤¸à¤µà¥€ का उपयोग कर मौजूदा रिकॉरà¥à¤¡ को अपडेट करें +CollectEarthWindow.47=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. +CollectEarthWindow.48=ज़िप / à¤à¤•तà¥à¤°-डेटा फ़ाइल +CollectEarthWindow.49=फà¥à¤¯à¥‚जन सीà¤à¤¸à¤µà¥€ फ़ाइल +CollectEarthWindow.5=बंद करे +CollectEarthWindow.50= उपयोगकरà¥à¤¤à¤¾ मैनà¥à¤…ल खोलें +CollectEarthWindow.51=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ के अदà¥à¤¯à¤¤à¤¨ के लिठजाà¤à¤š करें +CollectEarthWindow.52= अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— लॉग फ़ाइल खोलें +CollectEarthWindow.53=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ लॉग फ़ाइल +CollectEarthWindow.54=केà¤à¤®à¤à¤² से लोड अंक +CollectEarthWindow.56=के विषय में... +CollectEarthWindow.57=साà¤à¤•ॠसà¥à¤Ÿà¤¾à¤°à¥à¤Ÿà¤° पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ अभी भी चल रहा है, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें. +CollectEarthWindow.58=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ नहीं कर सकते +CollectEarthWindow.59=आप साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ के लिठडेटा सेट फिर से उतà¥à¤ªà¤¨à¥à¤¨ करने के लिठकरना चाहते हैं?
यह पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ समय लेने वाली हो सकती है.
आप यदि "हाà¤"पर कà¥à¤²à¤¿à¤• करें, तो नवीनतम जानकारी के साथ à¤à¤• नया डाटासेट उतà¥à¤ªà¤¨à¥à¤¨ हो जाà¤à¤—ा. +CollectEarthWindow.6=फà¥à¤¯à¥‚जन टेबल के लिठनिरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.60=साà¤à¤•ॠडेटा उतà¥à¤ªà¤¨à¥à¤¨ +CollectEarthWindow.61=डेटा à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ (पिछले निरà¥à¤¯à¤¾à¤¤ के बाद से संशोधित रिकॉरà¥à¤¡) +CollectEarthWindow.62=के विषय मे... +CollectEarthWindow.63=केà¤à¤®à¤à¤² से अंक पà¥à¤°à¤¾à¤ªà¥à¤¤ करने में तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.64=तकनीकी सहायता +CollectEarthWindow.7=डेटा आयात में तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.8=असà¥à¤µà¥€à¤•रण पाठ नहीं पाया जा सका +CollectEarthWindow.9=डेटा आयात रिकॉरà¥à¤¡ वह है जो कि पहले से ही अपने डेटाबेस पर मौजूद हैं शामिल. +DynamicsCode.0=पà¥à¤°à¤¾à¤°à¤‚भ में वन +DynamicsCode.1=पà¥à¤°à¤¾à¤°à¤‚भ में घास का मैदान, +DynamicsCode.2=पà¥à¤°à¤¾à¤°à¤‚भ में आबादी वाला इलाका +DynamicsCode.3=पà¥à¤°à¤¾à¤°à¤‚भ में बंजर +DynamicsCode.4=पà¥à¤°à¤¾à¤°à¤‚भ में आरà¥à¤¦à¥à¤° भूमि +DynamicsCode.5=पà¥à¤°à¤¾à¤°à¤‚भ में खेत +OpenTextFileListener.0=इस पाठ का फ़ाइल नहीं मिला \: +OptionWizard.0= विकलà¥à¤ª +OptionWizard.1=बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° चà¥à¤¨à¥‡à¤‚ +OptionWizard.10=बैकअप फ़ोलà¥à¤¡à¤° खोलें +OptionWizard.11=अजà¥à¤žà¤¾à¤¤\: उपयोग ifconfig +OptionWizard.12=गà¥à¤°à¤¾à¤¹à¤•ों का उलà¥à¤²à¥‡à¤– +OptionWizard.13=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° आईपी +OptionWizard.14=कतà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ (उदाहरण- 8023) +OptionWizard.15=बचाà¤à¤‚ और परिवरà¥à¤¤à¤¨ लागू करें +OptionWizard.16=आईडी +OptionWizard.17=X- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क +OptionWizard.18=Y- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क +OptionWizard.19=उठान +OptionWizard.2=कारà¥à¤¯à¤ªà¥à¤°à¤µà¤¾à¤¹ (सरà¥à¤µà¤° / गà¥à¤°à¤¾à¤¹à¤•) +OptionWizard.20=गूगल अरà¥à¤¥ अंतरà¥à¤µà¤¸à¥à¤¤à¥ बदल दिया गया है
यदि गà¥à¤—ल अरà¥à¤¥ आप से कहे,अंतरà¥à¤µà¤¸à¥à¤¤à¥ पà¥à¤¨à¤ƒ लोड सà¥à¤µà¥€à¤•ार करें . +OptionWizard.21=अदà¥à¤¯à¤¤à¤¨ सफल +OptionWizard.22=ढाल +OptionWizard.23=गूगल अरà¥à¤¥ डेटा को फिर से खोलने में कोई तà¥à¤°à¥à¤Ÿà¤¿ थी +OptionWizard.24=रदà¥à¤¦ करना +OptionWizard.25=ऑपरेशन मोड +OptionWizard.26=डीबी होसà¥à¤Ÿ +OptionWizard.27=यह à¤à¤• मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ साà¤à¤•ॠफ़ोलà¥à¤¡à¤° नहीं है ( सà¥à¤Ÿà¤¾à¤°à¥à¤Ÿ-साà¤à¤•à¥.batफ़ाइल मौजूद नहीं है) +OptionWizard.28=साà¤à¤•ॠसरà¥à¤µà¤° मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ नहीं +OptionWizard.29=डीबी पोरà¥à¤Ÿ +OptionWizard.3=सरà¥à¤µà¤° आवृतà¥à¤¤à¤¿ +OptionWizard.30=à¤à¤¸à¤•à¥à¤¯à¥ लाइट विकलà¥à¤ª +OptionWizard.31=सेमà¥à¤ªà¤² डेटा +OptionWizard.32=पà¥à¤²à¥‰à¤Ÿ लेआउट +OptionWizard.33=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ परिभाषा +OptionWizard.34=विकसित +OptionWizard.35=सेमà¥à¤ªà¤² अंक की संखà¥à¤¯à¤¾ +OptionWizard.36=सेमà¥à¤ªà¤² बिंदॠके बीच दूरी (मीटर में) +OptionWizard.37=भूखंड की सीमा के साथ मारà¥à¤œà¤¿à¤¨ (मीटर मे) +OptionWizard.38=सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सही ढंग से पढ़ा नहीं जा सकता.
इस फ़ाइल में à¤à¤• अलà¥à¤ªà¤µà¤¿à¤°à¤¾à¤® से अलग मूलà¥à¤¯à¥‹à¤‚ की उमà¥à¤®à¥€à¤¦ है \:
+OptionWizard.39=आईडी, वाई समनà¥à¤µà¤¯, à¤à¤•à¥à¤¸ समनà¥à¤µà¤¯, ऊंचाई, ढाल, पहलू +OptionWizard.4=वरà¥à¤¤à¤®à¤¾à¤¨ कंपà¥à¤¯à¥‚टर आईपी \: +OptionWizard.40=परियोजनाà¤à¤‚ +OptionWizard.41=à¤à¤• नई परियोजना फ़ाइल लोड करें +OptionWizard.42=सीà¤à¤¸à¤µà¥€ पाठक को बंद करते समय तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.43=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ का नाम +OptionWizard.44= सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ बैकअप डेटाबेस +OptionWizard.45=ओपन पृथà¥à¤µà¥€ इंजन ने पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° में जूम किया +OptionWizard.46=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठपृथà¥à¤µà¥€ इंजन टाइमलैपà¥à¤¸ खोलें +OptionWizard.47=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठबिंग मैपà¥à¤¸ खोलें +OptionWizard.48=बजाय गूगल अरà¥à¤¥ के फॉरà¥à¤® à¤à¤• बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° पर खोलें (लिनकà¥à¤¸ के लिठसिफारिश) +OptionWizard.49=भूखंड डेटा के साथ सीईडी / सीà¤à¤¸à¤µà¥€ फाइल भेजने के लिठपथ +OptionWizard.5=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ\: +OptionWizard.50=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.51=परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.52=केवल निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क के साथ सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल +OptionWizard.53=चौकोर +OptionWizard.54=केनà¥à¤¦à¥à¤°à¥€à¤¯ बिनà¥à¤¦à¥ +OptionWizard.55=परियोजना फ़ोलà¥à¤¡à¤° आयात तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.56=लोड परियोजना +OptionWizard.57=पहले से लोड परियोजना +OptionWizard.58= जी ई ई का मैदान खोलें (विशà¥à¤µà¤¸à¤¨à¥€à¤¯ जांचकरà¥à¤¤à¤¾ के उपयोग की आवशà¥à¤¯à¤•ता है) +OptionWizard.59=यहां भूखंड पर केंदà¥à¤°à¤¿à¤¤ मैपà¥à¤¸ खोलें +OptionWizard.6=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² डीबी मापदंड +OptionWizard.65=साà¤à¤•à¥à¤«à¤¼à¥‹à¤²à¥à¤¡à¤° का पथ +OptionWizard.66=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.67=फ़ायरफ़ॉकà¥à¤¸ निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ +OptionWizard.68=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.7=उपयोगकरà¥à¤¤à¤¾ नाम +OptionWizard.70=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों +OptionWizard.72=बाइनरी फ़ाइलें +OptionWizard.73=कà¥à¤°à¥‹à¤® निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ +OptionWizard.74=बà¥à¤°à¤¾à¤‰à¤œ +OptionWizard.76=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों +OptionWizard.78=बाइनरी फ़ाइलें +OptionWizard.79=केà¤à¤®à¤à¤² फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ के लिठपथ +OptionWizard.8=पासवरà¥à¤¡ +OptionWizard.80=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.82=फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ +OptionWizard.83=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ पà¥à¤°à¤ªà¤¤à¥à¤° डिज़ाइन करने के लिठपथ +OptionWizard.84=बà¥à¤°à¤¾à¤‰à¤œ..... +OptionWizard.86=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² वेब पेज +OptionWizard.87=पथ आइडीà¤à¤® परिभाषा के साथ à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठ+OptionWizard.88=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.9=डीबी नाम +OptionWizard.90=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² आइडीà¤à¤® परिभाषा +OptionWizard.91=सरà¥à¤µà¤° (पà¥à¤°à¤¬à¤‚धक संसà¥à¤•रण या खड़े अकेले का उपयोग करें) +OptionWizard.92=कà¥à¤²à¤¾à¤‡à¤‚ट (ऑपरेटर / सरà¥à¤µà¤° से जà¥à¤¡à¤¼à¥‡) +OptionWizard.93=सकà¥à¤¯à¥‚à¤à¤²à¤¾à¤‡à¤Ÿ (à¤à¤‚बेडेड / à¤à¤•ल फाइल आधारित) +OptionWizard.94=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² +OptionWizard.95=सेमà¥à¤ªà¤² डॉटà¥à¤¸ के साइड (मीटर में) +SaikuAnalysisListener.0=हाठ- ताज़ा साà¤à¤•ॠडेटा (लंबी पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾) +SaikuAnalysisListener.1=नहीं - बस साà¤à¤•ॠशà¥à¤°à¥‚ +SaikuStarter.1=साà¤à¤•ॠशà¥à¤°à¥‚ +SaikuStarter.2= साà¤à¤•ॠशà¥à¤°à¥‚ कà¥à¤› मिनट लग सकते हैं, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें\! +SaveEarthDataServlet.0=खाली अनà¥à¤°à¥‹à¤§ +SaveEarthDataServlet.1= डेटाबेस में डेटा बचाते समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ है +SaveEarthDataServlet.2=डेटा बचाया था +SlopeCode.0=समतल (0-5) +EarthApp.11=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ पहले से ही चल रहा है +EarthApp.21=à¤à¤• सीà¤à¤¸à¤µà¥€ / सीईडी के रूप में भूखंडों की गà¥à¤°à¤¿à¤¡ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
+EarthApp.23=कोई सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सेट-अप नहीं किया गया है \:

+EarthApp.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² परिभाषा के साथ फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है \:
+EarthApp.26=कोई à¤à¤•à¥à¤¸à¤à¤®à¤à¤² फ़ाइल परिभाषा सेट अप नहीं किया गया है \:

+EarthApp.27=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ रूप से यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
+EarthApp.29=कोई à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ फ़ाइल सेट-अप नहीं किया गया है \:

+EarthApp.3=मà¥à¤à¥‡ बाद में याद दिलाना +EarthApp.30=उपकरण> गà¥à¤£ मेनू में फ़ाइल सà¥à¤¥à¤¾à¤¨ को ठीक करें . +EarthApp.4=अभी अदà¥à¤¯à¤¤à¤¨ करें +EarthApp.5=मà¥à¤à¥‡ दà¥à¤¬à¤¾à¤°à¤¾ याद मत दिलाना +EarthApp.57=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ का à¤à¤• नया संसà¥à¤•रण उपलबà¥à¤§ है\!
आप कैसे आगे बढ़ना चाहते हैं? +EarthApp.58=अदà¥à¤¯à¤¤à¤¨ चेतावनी +EarthApp.59= परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ +EarthApp.6=\ - संसà¥à¤•रण +EarthApp.61=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ फाइल खà¥à¤² नहीं सकती .
कृपया सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करें कि गूगल अरà¥à¤¥ सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ है. +EarthSurveyService.9=आवशà¥à¤¯à¤• कà¥à¤·à¥‡à¤¤à¥à¤° +ExportActionListener.1= तारीख चूनें जबसे रिकॉरà¥à¤¡ निरà¥à¤¯à¤¾à¤¤ करने है +ExportDialogProcessMonitor.0=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... +ExportDialogProcessMonitor.1=पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ पà¥à¤°à¤¾à¤°à¤‚भ करने के लिठपà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ कर रहा है \: +ExportDialogProcessMonitor.4=निरà¥à¤¯à¤¾à¤¤ रिकॉरà¥à¤¡\: +ImportProcessMonitorDialog.0=आयातित रिकॉरà¥à¤¡ \: +ImportActionListener.0=कà¥à¤¯à¤¾ उन भूखंडों के लिठडेटा जो कि पूरी तरह से भरे नहीं गठ,आयातित किया जाना चाहिà¤? +ImportActionListener.2=आप कà¥à¤²à¤¿à¤• करें, नहींतो केवल डेटा "हरी" राजà¥à¤¯ में भूखंडों से ,जिसमें सभी डेटा यà¥à¤•à¥à¤¤ है , आयात किया जाà¤à¤—ा। +ImportDialogProcessMonitor.0=\ गणना +ImportDialogProcessMonitor.11=रिकॉरà¥à¤¡ की पà¥à¤°à¤¾à¤°à¤‚भिक संखà¥à¤¯à¤¾ \: +ImportDialogProcessMonitor.2=रिकॉरà¥à¤¡ आयात... +ImportDialogProcessMonitor.5=आयातित रिकॉरà¥à¤¡ की वासà¥à¤¤à¤µà¤¿à¤• संखà¥à¤¯à¤¾ \: +ImportDialogProcessMonitor.8=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... +InfiniteProgressMonitor.0=रदà¥à¤¦ ऑपरेशन +JFileChooserExistsAware.0=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ परियोजना फ़ाइल +KmlImportService.13=पà¥à¤²à¥‰à¤Ÿ सà¥à¤¥à¤¾à¤¨à¥‹à¤‚ को बचाने के लिठà¤à¤• सीà¤à¤¸à¤µà¥€ फ़ाइल का चयन करें +MissingPlotsListener.0=तà¥à¤°à¥à¤Ÿà¤¿ उन भूखंडों के बारे में जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ करने के लिठजो डेटाबेस पर मौजूद नहीं +MissingPlotsListener.1=गà¥à¤® भूखंड +MissingPlotsListener.10=सेमà¥à¤ªà¤² डिजाइन में भूखंडों की कà¥à¤² संखà¥à¤¯à¤¾ \: +MissingPlotsListener.12=गà¥à¤® भूखंडों की संखà¥à¤¯à¤¾ \: +MissingPlotsListener.14=सभी भूखंडों भर रहे हैं\! +MissingPlotsListener.2=कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ अंतरà¥à¤µà¤¸à¥à¤¤à¥ की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ +MissingPlotsListener.3=भूखंड की जानकारी वाले फ़ाइलें चà¥à¤¨à¥‡à¤‚ ( .सीà¤à¤¸à¤µà¥€ या .सीईडी फ़ाइलें ) जिसके लिठआप जानना चाहते हैं तो सभी डेटा भर दिया गया है चाहता हूà¤. +MissingPlotsListener.4=गà¥à¤® भूखंड- जानकारी +MissingPlotsListener.5=फ़ाइल से \: +MissingPlotsListener.6=सीà¤à¤¡à¥€ फ़ाइल में निरà¥à¤¯à¤¾à¤¤ करें +ProcessMonitorDialog.1=पंकà¥à¤¤à¤¿ संखà¥à¤¯à¤¾ पर तà¥à¤°à¥à¤Ÿà¤¿ +ProcessMonitorDialog.4=, कॉलम +ProcessMonitorDialog.5=\ --मूलà¥à¤¯ +YES= हां +YES_TO_ALL=सब को हां +NO=नहीं +NO_TO_ALL=सभी को नहीं + + + From 8d6a057ef8e2c1e1d089130e8705db2e9bb00a61 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:35:47 +0100 Subject: [PATCH 0807/1620] New translations utf8_orig_Messages_hi.properties (English) --- .../earth/app/view/Messages_en.properties | 480 ++++++++---------- 1 file changed, 225 insertions(+), 255 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 5199a9b624..f0355142d0 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,255 +1,225 @@ -AboutDialog.19=UN problème est apparu -AboutDialog.5=Pour plus d’infos, visitez notre site web OpenForis.org -AboutDialog.6=Désolé, il y a eu un problème lors de l’ouverture du lien avec votre navigateur par défaut. -AboutDialog.8=Ok -AspectCode.0=Nord -AspectCode.1=Nord-Est -AspectCode.2=Est -AspectCode.3=Sud-Est -AspectCode.4=Sud -AspectCode.5=Sud-Ouest -AspectCode.6=Ouest -AspectCode.7=Nord-Ouest -CollectEarthMenu.0=Importe le fichier .CEP -CollectEarthMenu.2=Utilitaires -CollectEarthMenu.3=Divise un large tableau CSV en plusieurs parties -CollectEarthMenu.4=Exporte les données en XML (à partir d'une date précise jusqu'à aujourd'hui) -CollectEarthMenu.5=Exporte sur la sauvegarde Collect Backup -CollectEarthMenu.6=Exporte les données en tant que sauvegarde Collect Backup (toutes les données) -CollectEarthMenu.7=Exporte les données en tant que sauvegarde Collect Backup (à partir de) -CollectEarthMenu.8=Exporte les données en XML (filtrer par attribut) -CollectEarthWindow.0=Erreur pendant l'exportation des données en csv -CollectEarthWindow.10=Fichier -CollectEarthWindow.11=Quitter -CollectEarthWindow.12=Outils -CollectEarthWindow.13=Télécharger les données en CSV (Excel) -CollectEarthWindow.14=Démarrer l'analyse avec Saïku -CollectEarthWindow.15=Propriétés -CollectEarthWindow.16=Aide -CollectEarthWindow.17=Avertissement -CollectEarthWindow.18=Trouver les placettes manquantes dans la base de données -CollectEarthWindow.19=Collect Earth -CollectEarthWindow.1=Erreur d'exportation -CollectEarthWindow.20=Nombre d'enregistrements dupliqués -CollectEarthWindow.21=Icône non trouvée -CollectEarthWindow.22= Êtes-vous sûr de vouloir fermer CollectEarth
Fermer cette fenêtre fermera aussi le serveur -CollectEarthWindow.23=Confirmation requise -CollectEarthWindow.24=Exporter en XML -CollectEarthWindow.25=Voulez-vous ajouter tout de même ces données et perdre vos enregistrements? -CollectEarthWindow.26=Utilisateur -CollectEarthWindow.27=Appliquer -CollectEarthWindow.28=Le serveur devrait être démarré pour la saisie des données par les utilisateurs. -CollectEarthWindow.29=Le serveur Saiku n'est pas configuré. -CollectEarthWindow.2=Langue -CollectEarthWindow.30=Veuillez garder cette fenêtre active pendant que vous utilisez Google Earth -CollectEarthWindow.31=Exporter les données collectées en CSV -CollectEarthWindow.32=Fermer -CollectEarthWindow.33=Le nom de l'utilisateur doit comprendre entre 5 et 50 caractères -CollectEarthWindow.34=Erreur de validation -CollectEarthWindow.35= NOM DE L'UTILISATEUR VIDE\!
Veuillez renseigner le champs et Appuyer sur "Mise à jour" -CollectEarthWindow.36=Le nom de l'utilisateur ne peut pas être vide -CollectEarthWindow.37=Laisser ouvert -CollectEarthWindow.38=Fichiers CSV -CollectEarthWindow.39=NOTE \: Il est conseillé de sauvegarder vos données (export en XML) avant d'importer de nouvelles données -CollectEarthWindow.3=\ Erreur pendant l'importation -CollectEarthWindow.40=Renseigner le chemin jusqu'au serveur Saiku dans /Outils/Propriétés/Avancé. -CollectEarthWindow.41=Sauvegarde des données exportées dans le fichier\: -CollectEarthWindow.42=Quitter -CollectEarthWindow.43=Enregistrements conflictuels trouvés -CollectEarthWindow.44=Importer/Exporter les données -CollectEarthWindow.45=Exporter les données en XML (zippé) -CollectEarthWindow.46=Importer de nouvelles données depuis ZIP (XML zippé) -CollectEarthWindow.47=Le serveur Saiku n'est pas configuré -CollectEarthWindow.48=Fichier zip/collect-data -CollectEarthWindow.49=Fusion des fichiers CSV -CollectEarthWindow.4=Clause de non-responsabilité de la FAO -CollectEarthWindow.50=Ouvrir le manuel utilisateur -CollectEarthWindow.51=Vérifier les mises à jour des Collect Earth -CollectEarthWindow.52=Fichier de logs Open Application -CollectEarthWindow.53=Fichier de logs Collect Earth -CollectEarthWindow.54=Charger les points de KML -CollectEarthWindow.55=Mettre à jour les enregistrements en utilisant un fichier CSV -CollectEarthWindow.56=A propos... -CollectEarthWindow.57=Le processus de démarrage de Saïku est en cours, veuillez patienter -CollectEarthWindow.58=Impossible de démarrer l'analyse avec Saïku -CollectEarthWindow.59=Voulez-vous régénérer le jeu de données?
Cela peut prendre du temps.
Cliquer sur oui pour régénérer un nouveau jeu de données avec les dernières informations -CollectEarthWindow.5=Fermer -CollectEarthWindow.60=Génération des données Saïku -CollectEarthWindow.61=Exporter en XML (uniquement les enregistrements modifiés/ajoutés) -CollectEarthWindow.62=A propos… -CollectEarthWindow.63=Erreur en accédant aux points de KML -CollectEarthWindow.64=Assistance technique -CollectEarthWindow.65=Le nom de l'opérateur a été changé -CollectEarthWindow.66=Nom de l'opérateur -CollectEarthWindow.67=Ouvrir le dossier de données de CE -CollectEarthWindow.6=Exporter en Table de Fusion -CollectEarthWindow.70=Ouvrez le manuel de cette enquête -CollectEarthWindow.71=Générer un outil Saiku autonome -CollectEarthWindow.7=Erreur pendant l'importation des données -CollectEarthWindow.8=Le texte est introuvable -CollectEarthWindow.9=Les données importées contiennent des redondances avec celles présentes dans la base -DynamicsCode.0= Terre Forestière initialement -DynamicsCode.1= Prairie initialement -DynamicsCode.2= Etablissement initialement -DynamicsCode.3= Autre terre initialement -DynamicsCode.4= Terre humide initialement -DynamicsCode.5= Terre cultivée initialement -EarthApp.11=Collect Earth est déjà en cours d’exécution -EarthApp.21=Le fichier CSV/CED contenant les points est introuvable \:
-EarthApp.23=Aucun fichier CSV/CED spécifié \:

-EarthApp.24=Le fichier contenant le modèle de définition KML est introuvable \:
-EarthApp.26=Aucun modèle de définition spécifié\:

-EarthApp.27=Le fichier contenant le ballon HTML est introuvable \:
-EarthApp.29=Aucun ballon HTML spécifié \:

-EarthApp.30=Veuillez corriger le chemin d’accès dans le menu Outils -> Propriétés. -EarthApp.3=Rappelez le moi plus tard -EarthApp.4=Mettre a jour maintenant -EarthApp.57= Une nouvelle version de Collect Earth est disponible\! Utiliser le Menu -EarthApp.58=Alerte de mise à jour -EarthApp.59=Erreur pendant l’importation du fichier -EarthApp.5=Ne me le rappelez plus -EarthApp.61=Le fichier Collect Earth est introuvable br/>Veuillez-vous assurer que Google Earth est installé. -EarthApp.6=\ - Version -EarthApp.70=AVERTISSMENT -EarthApp.71=Sous Mac OS X, les fichiers de projet Collect Earth (* .cep) ne s'ouvriront pas dans Collect Earth lorsqu'ils sont double-cliqués.
-EarthApp.72=Utilisez la barre d'outils Collect Earth pour ouvrir les fichiers .cep \: -EarthApp.73=Collect Earth - problèmes sur les ordinateurs Mac OS X -EarthSurveyService.9=Champs requis -ExportActionListener.1=Choisir la date pour les données à exporter -ExportDialogProcessMonitor.0=Chargement des données... -ExportDialogProcessMonitor.1=Attente d'initialisation de l'export -ExportDialogProcessMonitor.4=Enregistrements exportés \: -ImportActionListener.0=Est-ce que les données pour les placettes qui ne sont pas complètes doivent être importées ? -ImportActionListener.2=Si vous cliquez sur NO, seulement les données provenant des placettes avec la marque « verte », qui contiennent toutes les données, seront importées -ImportActionListener.3=Importer les enregistrements incomplets -ImportDialogProcessMonitor.0=Calcul en cours -ImportDialogProcessMonitor.11=Nombre initial d' enregistrements \: -ImportDialogProcessMonitor.2=Chargement des enregistrements... -ImportDialogProcessMonitor.5=Nombre réel d'enregistrements importés\: -ImportDialogProcessMonitor.8=Chargement des données... -ImportProcessMonitorDialog.0=Enregistrements importés \: -ImportXMLDialogProcessMonitor.1 = Écraser les données dans la base de données -ImportXMLDialogProcessMonitor.2 = Importer uniquement des enregistrements non conflictuels -InfiniteProgressMonitor.0=Annuler l’opération -JFileChooserExistsAware.0=Fichier projet Collect Earth -KmlImportService.13=Sélectionnez un fichier CSV pour enregistrer les emplacements des parcelles -MissingPlotsListener.0=Erreur au cours de l’enregistrement des placettes absentes de la base de données -MissingPlotsListener.10=Nombre total de parcelles dans le plan d'échantillonnage \: -MissingPlotsListener.12=Nombre de parcelles manquantes \: -MissingPlotsListener.14=Toutes les parcelles sont remplis\! -MissingPlotsListener.1=Placettes manquantes -MissingPlotsListener.2=Copier le contenu sur le clipboard -MissingPlotsListener.3=Choisir les fichiers qui contiennent les informations des placettes (.csv ou .ced) pour lesquelles vous voulez savoir si toues les placettes ont été renseignées -MissingPlotsListener.4=Placettes manquantes – Information -MissingPlotsListener.5=Depuis le fichier \: -MissingPlotsListener.6=Exporter en CED -NO=Non -NO_TO_ALL=Non à tous -OpenTextFileListener.0=Le fichier texte n'a pas été trouvé dans \: -OptionWizard.0=Options Collect Earth -OptionWizard.100=Ouvrir Planet -OptionWizard.101=Clé API Planet -OptionWizard.1021=URL SecureWatch -OptionWizard.102=Ouvrir Maxar SecureWatch -OptionWizard.103=Définir le URL pour le Carte Extra (ouvre quand il est réglé) \: -OptionWizard.104=Navigateurs -OptionWizard.105=Ouvrir Earth Map -OptionWizard.110=Utiliser les images mensuelles fournies par NICFI -OptionWizard.10=Montrer les fichiers de sauvegarde -OptionWizard.11=Inconnu \: utiliser ifconfig -OptionWizard.12=Instance client -OptionWizard.13=IP Serveur de Collect Earth -OptionWizard.14=Port Serveur de Collect Earth (e.g. 8023) -OptionWizard.15=Appliquer et sauvegarder les changements -OptionWizard.16=ID -OptionWizard.17=Coord-X -OptionWizard.18=Coord-Y -OptionWizard.19=Altitude -OptionWizard.1=Choisir un navigateur -OptionWizard.20= Le contenu de Google Earth a changé
Veuillez accepter la mise à jour quand GE le demande -OptionWizard.21=Mise à jour réussie -OptionWizard.22=Pente -OptionWizard.23=Il y a eu une erreur pendant la réouverture de Google Earth -OptionWizard.24=Annuler -OptionWizard.25=Mode opération -OptionWizard.26=Hôte pour la BDD -OptionWizard.27=Le dossier n'est pas valide (il manque le fichier start-saiku.bat) -OptionWizard.28=Le dossier Saiku n'est pas reconnu -OptionWizard.29=Port pour la BDD -OptionWizard.2=Flux (serveur/client) -OptionWizard.30=Options SQLite -OptionWizard.31=Points d'échantillonnage -OptionWizard.32=Configuration de la parcelle -OptionWizard.33=Définition de l'enquête -OptionWizard.34=Services intégrés -OptionWizard.35=Nombre de points de contrôle -OptionWizard.36=Distance entre les points de contrôle (en mètres) -OptionWizard.37=Distance au bord de la parcelle (en mètres) -OptionWizard.38=Le Fichier CSV/CED ne peut pas être lu
Le fichier devrait avoir des valeurs séparées par des virgules comme ceci \:
-OptionWizard.39=ID,Coordonnée_Y, Coordonnée_X,altitude,pente,orientation -OptionWizard.3=Instance serveur -OptionWizard.40=Projets -OptionWizard.41=Charger un nouveau fichier projet -OptionWizard.42=Erreur pendant la fermeture du lecteur CSV -OptionWizard.43=Nom de l'enquête -OptionWizard.44=Sauvegarder automatiquement la base dans -OptionWizard.45=Ouvrir Earth Engine Playground (obsolète) -OptionWizard.46=Ouvrir le Timelapse de Google Earth Engine -OptionWizard.47=Ouvrir Bing Maps -OptionWizard.48=Ouvrir le formulaire dans un navigateur plutôt que dans GE (recommandé pour Linux) -OptionWizard.49=Chemin jusqu'au fichier ced/csv avec les données des parcelles -OptionWizard.4=IP actuelle de l'ordinateur -OptionWizard.50=Parcourir -OptionWizard.51=Erreur pendant l'importation du fichier -OptionWizard.52=Fichier CSV/CED uniquement avec des coordonnées -OptionWizard.53=Pas de points -OptionWizard.54=Point central -OptionWizard.55=Erreur pendant l'importation du dossier projet -OptionWizard.56=Charger le projet -OptionWizard.57=Projets chargés précedemment -OptionWizard.58=Ouvrir GEE Code Editor (nécessite un accès restreint Trusted Tester) -OptionWizard.59=Ouvrir Here Maps -OptionWizard.5=Port Serveur Collect Earth \: -OptionWizard.65=Chemin jusqu'au serveur Saiku -OptionWizard.66=Parcourir -OptionWizard.67=Chemin jusqu'à Firefox -OptionWizard.68=Parcourir -OptionWizard.6=Paramètres de la BD PostGreSQL -OptionWizard.70=Fichiers exécutables -OptionWizard.72=Fichiers binaires -OptionWizard.73=Chemin jusqu'à Chrome -OptionWizard.74=Parcourir -OptionWizard.76=Fichiers exécutables -OptionWizard.78=Fichiers binaires -OptionWizard.79=Chemin jusqu'au modèle Freemarker KML -OptionWizard.7=Nom d'utilisateur -OptionWizard.80=Parcourir -OptionWizard.82=Modèle Freemarker -OptionWizard.83=Chemin jusqu'au Ballon HTML -OptionWizard.84=Parcourir -OptionWizard.86=Page web HTML -OptionWizard.87=Chemin jusqu'au fichier XML contenant la définition IDM -OptionWizard.88=Parcourir -OptionWizard.8=Mot de passe -OptionWizard.90=Définition IDM XML -OptionWizard.91=Serveur (version gestionnaire ou autonome) -OptionWizard.92=Client (opérateur/connecté au serveur) -OptionWizard.93=SQLite (Fichier intégré / Unique) -OptionWizard.94=PostgreSQL -OptionWizard.95=Côté des points d'échantillonnage (en mètres) -OptionWizard.9=Nom de la base -ProcessMonitorDialog.1=Erreur d’interprétation sur numéro de rangée -ProcessMonitorDialog.4=, colonnes -ProcessMonitorDialog.5=\ -- valeures -SaikuAnalysisListener.0=Oui - Rafraichir les données Saiku (processus long) -SaikuAnalysisListener.1=Non - Utiliser la même version des données que la dernière fois que Saiku a été utilisé -SaikuToolExportListener.1=Génération de l'outil Saiku -SaikuToolExportListener.2=Génération de l'outil Saiku avec la base de données actuelle -SaikuStarter.1=Démarrer Saïku -SaikuStarter.2=Démarrer Saïku peut prendre plusieurs minutes, veuillez patienter\! -SaveEarthDataServlet.0=Requête vide -SaveEarthDataServlet.1=Problème lors de la sauvegarde de la base de données -SaveEarthDataServlet.2=Les données ont été sauvées -SlopeCode.0=Plan (0-5) -YES=Oui -YES_TO_ALL=Oui à tous \ No newline at end of file +AboutDialog.19=कोई समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ +AboutDialog.5=अधिक जानकारी के लिठहमारी वेबसाइट पर जाà¤? OpenForis.org? +AboutDialog.6=कà¥à¤·à¤®à¤¾ करें, à¤à¤• समसà¥à¤¯à¤¾ आपके सिसà¥à¤Ÿà¤® के मानक बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में इस लिंक को खोलने की कोशिश कर रही है. +AboutDialog.8=ठीक +AspectCode.0=उतà¥à¤¤à¤° दिशा +AspectCode.1=उतà¥à¤¤à¤°-पूरà¥à¤µ दिशा +AspectCode.2=पूरà¥à¤µ दिशा +AspectCode.3=दकà¥à¤·à¤¿à¤£-पूरà¥à¤µ दिशा +AspectCode.4=दकà¥à¤·à¤¿à¤£ दिशा +AspectCode.5=दकà¥à¤·à¤¿à¤£-पशà¥à¤šà¤¿à¤® दिशा +AspectCode.6=पशà¥à¤šà¤¿à¤® दिशा +AspectCode.7=उतà¥à¤¤à¤°-पशà¥à¤šà¤¿à¤® दिशा +CollectEarthWindow.0=तà¥à¤°à¥à¤Ÿà¤¿ जब सीà¤à¤¸à¤µà¥€ फ़ाइल में डेटा निरà¥à¤¯à¤¾à¤¤ करने का पà¥à¤°à¤¯à¤¾à¤¸ +CollectEarthWindow.1=निरà¥à¤¯à¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.10=फ़ाइल +CollectEarthWindow.11=बाहर जाà¤à¤‚ +CollectEarthWindow.12=उपकरण +CollectEarthWindow.13=डेटा सीà¤à¤¸à¤µà¥€ निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.14=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ +CollectEarthWindow.15=गà¥à¤£ +CollectEarthWindow.16=मदद +CollectEarthWindow.17=असà¥à¤µà¥€à¤•रण +CollectEarthWindow.18=डेटाबेस में लापता भूखंडों खोजें +CollectEarthWindow.19=पृथà¥à¤µà¥€ इकटà¥à¤ à¤¾ +CollectEarthWindow.2=भाषा +CollectEarthWindow.20=डà¥à¤ªà¥à¤²à¤¿à¤•ेट रिकॉरà¥à¤¡ की संखà¥à¤¯à¤¾\: +CollectEarthWindow.21=मà¥à¤–à¥à¤¯ फà¥à¤°à¥‡à¤® के लिठआइकन नहीं मिल सकता है +CollectEarthWindow.22=आपको लगता है कि आप à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ बंद करना चाहते हैं? विंडोज बंद करने से, à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° बंद हो जाà¤à¤—ा +CollectEarthWindow.23=पà¥à¤·à¥à¤Ÿà¤¿ की जरूरत है +CollectEarthWindow.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.25=आप वैसे भी इन अभिलेखों को जोड़ना चाहते हैं और अपने वरà¥à¤¤à¤®à¤¾à¤¨ डेटा खोने के लिठकिलक करना चाहते हैं? +CollectEarthWindow.26=ऑपरेटर,पà¥à¤°à¤šà¤¾à¤²à¤• +CollectEarthWindow.27=अदà¥à¤¯à¤¤à¤¨ +CollectEarthWindow.28= औपन फौरिस à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° चल रहा होना चाहिठ, जबभी ऑपरेटर डेटा की वà¥à¤¯à¤¾à¤–à¥à¤¯à¤¾ करें . +CollectEarthWindow.29=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. +CollectEarthWindow.3= आयात संबंधी तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.30=जबभी आप गà¥à¤—ल अरà¥à¤¥ का उपयोग कर रहे हैं, कृपया इस विंडोज को खà¥à¤²à¥€ बनाठरखें. +CollectEarthWindow.31=à¤à¤•तà¥à¤° डेटा सीà¤à¤¸à¤µà¥€ फाइल में भेजें +CollectEarthWindow.32=छोड़ना +CollectEarthWindow.33=ऑपरेटर का नाम के 5 अकà¥à¤·à¤° से बड़ा और 50 अकà¥à¤·à¤° से कम होना चाहिठ+CollectEarthWindow.34=मानà¥à¤¯à¤¤à¤¾ तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.35=ऑपरेटर नाम खाली\!
कृपया ऑपरेटर का नाम भरें और "अदà¥à¤¯à¤¤à¤¨" बटन दबाà¤à¤. +CollectEarthWindow.36=ऑपरेटर नाम रिकà¥à¤¤ नहीं हो सकता +CollectEarthWindow.37=खà¥à¤²à¤¾ रखो +CollectEarthWindow.38=सीà¤à¤¸à¤µà¥€ फ़ाइल +CollectEarthWindow.39=सूचना\: यह सलाह दी जाती है कि आप नठडेटा डालने करने से पहले अपने मौजूदा आंकडों को बैकअप(à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤) कर लें +CollectEarthWindow.4=à¤à¤«à¤à¤“ असà¥à¤µà¥€à¤•रण नोटिस +CollectEarthWindow.40=उस फ़ोलà¥à¤¡à¤° पर जाà¤à¤‚ जहां साà¤à¤•ॠसरà¥à¤µà¤° में सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ किया गया है, फ़ोलà¥à¤¡à¤° का रासà¥à¤¤à¤¾ उपकरण> गà¥à¤£> उनà¥à¤¨à¤¤ टैब. +CollectEarthWindow.41=निरà¥à¤¯à¤¾à¤¤ डेटा को फ़ाइल में बचाया जा रहा है \: +CollectEarthWindow.42=छोड़ना +CollectEarthWindow.43=परसà¥à¤ªà¤° विरोधी रिकॉरà¥à¤¡ पाया +CollectEarthWindow.44=डेटा आयात / निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.45=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ डेटा (संकà¥à¤šà¤¿à¤¤) +CollectEarthWindow.46=ज़िप से नठडेटा आयात करें (संकà¥à¤šà¤¿à¤¤ à¤à¤•à¥à¤¸à¤à¤®à¤à¤²) +CollectEarthWindow.55=सीà¤à¤¸à¤µà¥€ का उपयोग कर मौजूदा रिकॉरà¥à¤¡ को अपडेट करें +CollectEarthWindow.47=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. +CollectEarthWindow.48=ज़िप / à¤à¤•तà¥à¤°-डेटा फ़ाइल +CollectEarthWindow.49=फà¥à¤¯à¥‚जन सीà¤à¤¸à¤µà¥€ फ़ाइल +CollectEarthWindow.5=बंद करे +CollectEarthWindow.50= उपयोगकरà¥à¤¤à¤¾ मैनà¥à¤…ल खोलें +CollectEarthWindow.51=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ के अदà¥à¤¯à¤¤à¤¨ के लिठजाà¤à¤š करें +CollectEarthWindow.52= अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— लॉग फ़ाइल खोलें +CollectEarthWindow.53=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ लॉग फ़ाइल +CollectEarthWindow.54=केà¤à¤®à¤à¤² से लोड अंक +CollectEarthWindow.56=के विषय में... +CollectEarthWindow.57=साà¤à¤•ॠसà¥à¤Ÿà¤¾à¤°à¥à¤Ÿà¤° पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ अभी भी चल रहा है, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें. +CollectEarthWindow.58=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ नहीं कर सकते +CollectEarthWindow.59=आप साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ के लिठडेटा सेट फिर से उतà¥à¤ªà¤¨à¥à¤¨ करने के लिठकरना चाहते हैं?
यह पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ समय लेने वाली हो सकती है.
आप यदि "हाà¤"पर कà¥à¤²à¤¿à¤• करें, तो नवीनतम जानकारी के साथ à¤à¤• नया डाटासेट उतà¥à¤ªà¤¨à¥à¤¨ हो जाà¤à¤—ा. +CollectEarthWindow.6=फà¥à¤¯à¥‚जन टेबल के लिठनिरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.60=साà¤à¤•ॠडेटा उतà¥à¤ªà¤¨à¥à¤¨ +CollectEarthWindow.61=डेटा à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ (पिछले निरà¥à¤¯à¤¾à¤¤ के बाद से संशोधित रिकॉरà¥à¤¡) +CollectEarthWindow.62=के विषय मे... +CollectEarthWindow.63=केà¤à¤®à¤à¤² से अंक पà¥à¤°à¤¾à¤ªà¥à¤¤ करने में तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.64=तकनीकी सहायता +CollectEarthWindow.7=डेटा आयात में तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.8=असà¥à¤µà¥€à¤•रण पाठ नहीं पाया जा सका +CollectEarthWindow.9=डेटा आयात रिकॉरà¥à¤¡ वह है जो कि पहले से ही अपने डेटाबेस पर मौजूद हैं शामिल. +DynamicsCode.0=पà¥à¤°à¤¾à¤°à¤‚भ में वन +DynamicsCode.1=पà¥à¤°à¤¾à¤°à¤‚भ में घास का मैदान, +DynamicsCode.2=पà¥à¤°à¤¾à¤°à¤‚भ में आबादी वाला इलाका +DynamicsCode.3=पà¥à¤°à¤¾à¤°à¤‚भ में बंजर +DynamicsCode.4=पà¥à¤°à¤¾à¤°à¤‚भ में आरà¥à¤¦à¥à¤° भूमि +DynamicsCode.5=पà¥à¤°à¤¾à¤°à¤‚भ में खेत +OpenTextFileListener.0=इस पाठ का फ़ाइल नहीं मिला \: +OptionWizard.0= विकलà¥à¤ª +OptionWizard.1=बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° चà¥à¤¨à¥‡à¤‚ +OptionWizard.10=बैकअप फ़ोलà¥à¤¡à¤° खोलें +OptionWizard.11=अजà¥à¤žà¤¾à¤¤\: उपयोग ifconfig +OptionWizard.12=गà¥à¤°à¤¾à¤¹à¤•ों का उलà¥à¤²à¥‡à¤– +OptionWizard.13=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° आईपी +OptionWizard.14=कतà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ (उदाहरण- 8023) +OptionWizard.15=बचाà¤à¤‚ और परिवरà¥à¤¤à¤¨ लागू करें +OptionWizard.16=आईडी +OptionWizard.17=X- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क +OptionWizard.18=Y- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क +OptionWizard.19=उठान +OptionWizard.2=कारà¥à¤¯à¤ªà¥à¤°à¤µà¤¾à¤¹ (सरà¥à¤µà¤° / गà¥à¤°à¤¾à¤¹à¤•) +OptionWizard.20=गूगल अरà¥à¤¥ अंतरà¥à¤µà¤¸à¥à¤¤à¥ बदल दिया गया है
यदि गà¥à¤—ल अरà¥à¤¥ आप से कहे,अंतरà¥à¤µà¤¸à¥à¤¤à¥ पà¥à¤¨à¤ƒ लोड सà¥à¤µà¥€à¤•ार करें . +OptionWizard.21=अदà¥à¤¯à¤¤à¤¨ सफल +OptionWizard.22=ढाल +OptionWizard.23=गूगल अरà¥à¤¥ डेटा को फिर से खोलने में कोई तà¥à¤°à¥à¤Ÿà¤¿ थी +OptionWizard.24=रदà¥à¤¦ करना +OptionWizard.25=ऑपरेशन मोड +OptionWizard.26=डीबी होसà¥à¤Ÿ +OptionWizard.27=यह à¤à¤• मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ साà¤à¤•ॠफ़ोलà¥à¤¡à¤° नहीं है ( सà¥à¤Ÿà¤¾à¤°à¥à¤Ÿ-साà¤à¤•à¥.batफ़ाइल मौजूद नहीं है) +OptionWizard.28=साà¤à¤•ॠसरà¥à¤µà¤° मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ नहीं +OptionWizard.29=डीबी पोरà¥à¤Ÿ +OptionWizard.3=सरà¥à¤µà¤° आवृतà¥à¤¤à¤¿ +OptionWizard.30=à¤à¤¸à¤•à¥à¤¯à¥ लाइट विकलà¥à¤ª +OptionWizard.31=सेमà¥à¤ªà¤² डेटा +OptionWizard.32=पà¥à¤²à¥‰à¤Ÿ लेआउट +OptionWizard.33=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ परिभाषा +OptionWizard.34=विकसित +OptionWizard.35=सेमà¥à¤ªà¤² अंक की संखà¥à¤¯à¤¾ +OptionWizard.36=सेमà¥à¤ªà¤² बिंदॠके बीच दूरी (मीटर में) +OptionWizard.37=भूखंड की सीमा के साथ मारà¥à¤œà¤¿à¤¨ (मीटर मे) +OptionWizard.38=सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सही ढंग से पढ़ा नहीं जा सकता.
इस फ़ाइल में à¤à¤• अलà¥à¤ªà¤µà¤¿à¤°à¤¾à¤® से अलग मूलà¥à¤¯à¥‹à¤‚ की उमà¥à¤®à¥€à¤¦ है \:
+OptionWizard.39=आईडी, वाई समनà¥à¤µà¤¯, à¤à¤•à¥à¤¸ समनà¥à¤µà¤¯, ऊंचाई, ढाल, पहलू +OptionWizard.4=वरà¥à¤¤à¤®à¤¾à¤¨ कंपà¥à¤¯à¥‚टर आईपी \: +OptionWizard.40=परियोजनाà¤à¤‚ +OptionWizard.41=à¤à¤• नई परियोजना फ़ाइल लोड करें +OptionWizard.42=सीà¤à¤¸à¤µà¥€ पाठक को बंद करते समय तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.43=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ का नाम +OptionWizard.44= सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ बैकअप डेटाबेस +OptionWizard.45=ओपन पृथà¥à¤µà¥€ इंजन ने पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° में जूम किया +OptionWizard.46=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठपृथà¥à¤µà¥€ इंजन टाइमलैपà¥à¤¸ खोलें +OptionWizard.47=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठबिंग मैपà¥à¤¸ खोलें +OptionWizard.48=बजाय गूगल अरà¥à¤¥ के फॉरà¥à¤® à¤à¤• बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° पर खोलें (लिनकà¥à¤¸ के लिठसिफारिश) +OptionWizard.49=भूखंड डेटा के साथ सीईडी / सीà¤à¤¸à¤µà¥€ फाइल भेजने के लिठपथ +OptionWizard.5=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ\: +OptionWizard.50=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.51=परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.52=केवल निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क के साथ सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल +OptionWizard.53=चौकोर +OptionWizard.54=केनà¥à¤¦à¥à¤°à¥€à¤¯ बिनà¥à¤¦à¥ +OptionWizard.55=परियोजना फ़ोलà¥à¤¡à¤° आयात तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.56=लोड परियोजना +OptionWizard.57=पहले से लोड परियोजना +OptionWizard.58= जी ई ई का मैदान खोलें (विशà¥à¤µà¤¸à¤¨à¥€à¤¯ जांचकरà¥à¤¤à¤¾ के उपयोग की आवशà¥à¤¯à¤•ता है) +OptionWizard.59=यहां भूखंड पर केंदà¥à¤°à¤¿à¤¤ मैपà¥à¤¸ खोलें +OptionWizard.6=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² डीबी मापदंड +OptionWizard.65=साà¤à¤•à¥à¤«à¤¼à¥‹à¤²à¥à¤¡à¤° का पथ +OptionWizard.66=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.67=फ़ायरफ़ॉकà¥à¤¸ निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ +OptionWizard.68=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.7=उपयोगकरà¥à¤¤à¤¾ नाम +OptionWizard.70=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों +OptionWizard.72=बाइनरी फ़ाइलें +OptionWizard.73=कà¥à¤°à¥‹à¤® निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ +OptionWizard.74=बà¥à¤°à¤¾à¤‰à¤œ +OptionWizard.76=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों +OptionWizard.78=बाइनरी फ़ाइलें +OptionWizard.79=केà¤à¤®à¤à¤² फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ के लिठपथ +OptionWizard.8=पासवरà¥à¤¡ +OptionWizard.80=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.82=फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ +OptionWizard.83=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ पà¥à¤°à¤ªà¤¤à¥à¤° डिज़ाइन करने के लिठपथ +OptionWizard.84=बà¥à¤°à¤¾à¤‰à¤œ..... +OptionWizard.86=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² वेब पेज +OptionWizard.87=पथ आइडीà¤à¤® परिभाषा के साथ à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठ+OptionWizard.88=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.9=डीबी नाम +OptionWizard.90=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² आइडीà¤à¤® परिभाषा +OptionWizard.91=सरà¥à¤µà¤° (पà¥à¤°à¤¬à¤‚धक संसà¥à¤•रण या खड़े अकेले का उपयोग करें) +OptionWizard.92=कà¥à¤²à¤¾à¤‡à¤‚ट (ऑपरेटर / सरà¥à¤µà¤° से जà¥à¤¡à¤¼à¥‡) +OptionWizard.93=सकà¥à¤¯à¥‚à¤à¤²à¤¾à¤‡à¤Ÿ (à¤à¤‚बेडेड / à¤à¤•ल फाइल आधारित) +OptionWizard.94=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² +OptionWizard.95=सेमà¥à¤ªà¤² डॉटà¥à¤¸ के साइड (मीटर में) +SaikuAnalysisListener.0=हाठ- ताज़ा साà¤à¤•ॠडेटा (लंबी पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾) +SaikuAnalysisListener.1=नहीं - बस साà¤à¤•ॠशà¥à¤°à¥‚ +SaikuStarter.1=साà¤à¤•ॠशà¥à¤°à¥‚ +SaikuStarter.2= साà¤à¤•ॠशà¥à¤°à¥‚ कà¥à¤› मिनट लग सकते हैं, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें\! +SaveEarthDataServlet.0=खाली अनà¥à¤°à¥‹à¤§ +SaveEarthDataServlet.1= डेटाबेस में डेटा बचाते समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ है +SaveEarthDataServlet.2=डेटा बचाया था +SlopeCode.0=समतल (0-5) +EarthApp.11=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ पहले से ही चल रहा है +EarthApp.21=à¤à¤• सीà¤à¤¸à¤µà¥€ / सीईडी के रूप में भूखंडों की गà¥à¤°à¤¿à¤¡ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
+EarthApp.23=कोई सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सेट-अप नहीं किया गया है \:

+EarthApp.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² परिभाषा के साथ फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है \:
+EarthApp.26=कोई à¤à¤•à¥à¤¸à¤à¤®à¤à¤² फ़ाइल परिभाषा सेट अप नहीं किया गया है \:

+EarthApp.27=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ रूप से यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
+EarthApp.29=कोई à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ फ़ाइल सेट-अप नहीं किया गया है \:

+EarthApp.3=मà¥à¤à¥‡ बाद में याद दिलाना +EarthApp.30=उपकरण> गà¥à¤£ मेनू में फ़ाइल सà¥à¤¥à¤¾à¤¨ को ठीक करें . +EarthApp.4=अभी अदà¥à¤¯à¤¤à¤¨ करें +EarthApp.5=मà¥à¤à¥‡ दà¥à¤¬à¤¾à¤°à¤¾ याद मत दिलाना +EarthApp.57=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ का à¤à¤• नया संसà¥à¤•रण उपलबà¥à¤§ है\!
आप कैसे आगे बढ़ना चाहते हैं? +EarthApp.58=अदà¥à¤¯à¤¤à¤¨ चेतावनी +EarthApp.59= परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ +EarthApp.6=\ - संसà¥à¤•रण +EarthApp.61=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ फाइल खà¥à¤² नहीं सकती .
कृपया सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करें कि गूगल अरà¥à¤¥ सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ है. +EarthSurveyService.9=आवशà¥à¤¯à¤• कà¥à¤·à¥‡à¤¤à¥à¤° +ExportActionListener.1= तारीख चूनें जबसे रिकॉरà¥à¤¡ निरà¥à¤¯à¤¾à¤¤ करने है +ExportDialogProcessMonitor.0=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... +ExportDialogProcessMonitor.1=पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ पà¥à¤°à¤¾à¤°à¤‚भ करने के लिठपà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ कर रहा है \: +ExportDialogProcessMonitor.4=निरà¥à¤¯à¤¾à¤¤ रिकॉरà¥à¤¡\: +ImportProcessMonitorDialog.0=आयातित रिकॉरà¥à¤¡ \: +ImportActionListener.0=कà¥à¤¯à¤¾ उन भूखंडों के लिठडेटा जो कि पूरी तरह से भरे नहीं गठ,आयातित किया जाना चाहिà¤? +ImportActionListener.2=आप कà¥à¤²à¤¿à¤• करें, नहींतो केवल डेटा "हरी" राजà¥à¤¯ में भूखंडों से ,जिसमें सभी डेटा यà¥à¤•à¥à¤¤ है , आयात किया जाà¤à¤—ा। +ImportDialogProcessMonitor.0=\ गणना +ImportDialogProcessMonitor.11=रिकॉरà¥à¤¡ की पà¥à¤°à¤¾à¤°à¤‚भिक संखà¥à¤¯à¤¾ \: +ImportDialogProcessMonitor.2=रिकॉरà¥à¤¡ आयात... +ImportDialogProcessMonitor.5=आयातित रिकॉरà¥à¤¡ की वासà¥à¤¤à¤µà¤¿à¤• संखà¥à¤¯à¤¾ \: +ImportDialogProcessMonitor.8=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... +InfiniteProgressMonitor.0=रदà¥à¤¦ ऑपरेशन +JFileChooserExistsAware.0=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ परियोजना फ़ाइल +KmlImportService.13=पà¥à¤²à¥‰à¤Ÿ सà¥à¤¥à¤¾à¤¨à¥‹à¤‚ को बचाने के लिठà¤à¤• सीà¤à¤¸à¤µà¥€ फ़ाइल का चयन करें +MissingPlotsListener.0=तà¥à¤°à¥à¤Ÿà¤¿ उन भूखंडों के बारे में जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ करने के लिठजो डेटाबेस पर मौजूद नहीं +MissingPlotsListener.1=गà¥à¤® भूखंड +MissingPlotsListener.10=सेमà¥à¤ªà¤² डिजाइन में भूखंडों की कà¥à¤² संखà¥à¤¯à¤¾ \: +MissingPlotsListener.12=गà¥à¤® भूखंडों की संखà¥à¤¯à¤¾ \: +MissingPlotsListener.14=सभी भूखंडों भर रहे हैं\! +MissingPlotsListener.2=कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ अंतरà¥à¤µà¤¸à¥à¤¤à¥ की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ +MissingPlotsListener.3=भूखंड की जानकारी वाले फ़ाइलें चà¥à¤¨à¥‡à¤‚ ( .सीà¤à¤¸à¤µà¥€ या .सीईडी फ़ाइलें ) जिसके लिठआप जानना चाहते हैं तो सभी डेटा भर दिया गया है चाहता हूà¤. +MissingPlotsListener.4=गà¥à¤® भूखंड- जानकारी +MissingPlotsListener.5=फ़ाइल से \: +MissingPlotsListener.6=सीà¤à¤¡à¥€ फ़ाइल में निरà¥à¤¯à¤¾à¤¤ करें +ProcessMonitorDialog.1=पंकà¥à¤¤à¤¿ संखà¥à¤¯à¤¾ पर तà¥à¤°à¥à¤Ÿà¤¿ +ProcessMonitorDialog.4=, कॉलम +ProcessMonitorDialog.5=\ --मूलà¥à¤¯ +YES= हां +YES_TO_ALL=सब को हां +NO=नहीं +NO_TO_ALL=सभी को नहीं From ef3cf642219f9aee025e82b4e88cbfea82e94f6f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:35:48 +0100 Subject: [PATCH 0808/1620] New translations utf8_orig_Messages_vi.properties (French) --- .../earth/app/view/Messages_fr.properties | 449 +++++++++--------- 1 file changed, 221 insertions(+), 228 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index f759c433b0..353fe0d367 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,228 +1,221 @@ -AboutDialog.19=कोई समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ -AboutDialog.5=अधिक जानकारी के लिठहमारी वेबसाइट पर जाà¤à¤‚ OpenForis.org -AboutDialog.6=कà¥à¤·à¤®à¤¾ करें, à¤à¤• समसà¥à¤¯à¤¾ आपके सिसà¥à¤Ÿà¤® के मानक बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में इस लिंक को खोलने की कोशिश कर रही है. -AboutDialog.8=ठीक -AspectCode.0=उतà¥à¤¤à¤° दिशा -AspectCode.1=उतà¥à¤¤à¤°-पूरà¥à¤µ दिशा -AspectCode.2=पूरà¥à¤µ दिशा -AspectCode.3=दकà¥à¤·à¤¿à¤£-पूरà¥à¤µ दिशा -AspectCode.4=दकà¥à¤·à¤¿à¤£ दिशा -AspectCode.5=दकà¥à¤·à¤¿à¤£-पशà¥à¤šà¤¿à¤® दिशा -AspectCode.6=पशà¥à¤šà¤¿à¤® दिशा -AspectCode.7=उतà¥à¤¤à¤°-पशà¥à¤šà¤¿à¤® दिशा -CollectEarthWindow.0=तà¥à¤°à¥à¤Ÿà¤¿ जब सीà¤à¤¸à¤µà¥€ फ़ाइल में डेटा निरà¥à¤¯à¤¾à¤¤ करने का पà¥à¤°à¤¯à¤¾à¤¸ -CollectEarthWindow.1=निरà¥à¤¯à¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.10=फ़ाइल -CollectEarthWindow.11=बाहर जाà¤à¤‚ -CollectEarthWindow.12=उपकरण -CollectEarthWindow.13=डेटा सीà¤à¤¸à¤µà¥€ निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.14=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ -CollectEarthWindow.15=गà¥à¤£ -CollectEarthWindow.16=मदद -CollectEarthWindow.17=असà¥à¤µà¥€à¤•रण -CollectEarthWindow.18=डेटाबेस में लापता भूखंडों खोजें -CollectEarthWindow.19=पृथà¥à¤µà¥€ इकटà¥à¤ à¤¾ -CollectEarthWindow.2=भाषा -CollectEarthWindow.20=डà¥à¤ªà¥à¤²à¤¿à¤•ेट रिकॉरà¥à¤¡ की संखà¥à¤¯à¤¾\: -CollectEarthWindow.21=मà¥à¤–à¥à¤¯ फà¥à¤°à¥‡à¤® के लिठआइकन नहीं मिल सकता है -CollectEarthWindow.22=आपको लगता है कि आप à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ बंद करना चाहते हैं? विंडोज बंद करने से, à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° बंद हो जाà¤à¤—ा -CollectEarthWindow.23=पà¥à¤·à¥à¤Ÿà¤¿ की जरूरत है -CollectEarthWindow.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.25=आप वैसे भी इन अभिलेखों को जोड़ना चाहते हैं और अपने वरà¥à¤¤à¤®à¤¾à¤¨ डेटा खोने के लिठकिलक करना चाहते हैं? -CollectEarthWindow.26=ऑपरेटर,पà¥à¤°à¤šà¤¾à¤²à¤• -CollectEarthWindow.27=अदà¥à¤¯à¤¤à¤¨ -CollectEarthWindow.28= औपन फौरिस à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° चल रहा होना चाहिठ, जबभी ऑपरेटर डेटा की वà¥à¤¯à¤¾à¤–à¥à¤¯à¤¾ करें . -CollectEarthWindow.29=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. -CollectEarthWindow.3= आयात संबंधी तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.30=जबभी आप गà¥à¤—ल अरà¥à¤¥ का उपयोग कर रहे हैं, कृपया इस विंडोज को खà¥à¤²à¥€ बनाठरखें. -CollectEarthWindow.31=à¤à¤•तà¥à¤° डेटा सीà¤à¤¸à¤µà¥€ फाइल में भेजें -CollectEarthWindow.32=छोड़ना -CollectEarthWindow.33=ऑपरेटर का नाम के 5 अकà¥à¤·à¤° से बड़ा और 50 अकà¥à¤·à¤° से कम होना चाहिठ-CollectEarthWindow.34=मानà¥à¤¯à¤¤à¤¾ तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.35=ऑपरेटर नाम खाली\!
कृपया ऑपरेटर का नाम भरें और "अदà¥à¤¯à¤¤à¤¨" बटन दबाà¤à¤. -CollectEarthWindow.36=ऑपरेटर नाम रिकà¥à¤¤ नहीं हो सकता -CollectEarthWindow.37=खà¥à¤²à¤¾ रखो -CollectEarthWindow.38=सीà¤à¤¸à¤µà¥€ फ़ाइल -CollectEarthWindow.39=सूचना\: यह सलाह दी जाती है कि आप नठडेटा डालने करने से पहले अपने मौजूदा आंकडों को बैकअप(à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤) कर लें -CollectEarthWindow.4=à¤à¤«à¤à¤“ असà¥à¤µà¥€à¤•रण नोटिस -CollectEarthWindow.40=उस फ़ोलà¥à¤¡à¤° पर जाà¤à¤‚ जहां साà¤à¤•ॠसरà¥à¤µà¤° में सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ किया गया है, फ़ोलà¥à¤¡à¤° का रासà¥à¤¤à¤¾ उपकरण> गà¥à¤£> उनà¥à¤¨à¤¤ टैब. -CollectEarthWindow.41=निरà¥à¤¯à¤¾à¤¤ डेटा को फ़ाइल में बचाया जा रहा है \: -CollectEarthWindow.42=छोड़ना -CollectEarthWindow.43=परसà¥à¤ªà¤° विरोधी रिकॉरà¥à¤¡ पाया -CollectEarthWindow.44=डेटा आयात / निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.45=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ डेटा (संकà¥à¤šà¤¿à¤¤) -CollectEarthWindow.46=ज़िप से नठडेटा आयात करें (संकà¥à¤šà¤¿à¤¤ à¤à¤•à¥à¤¸à¤à¤®à¤à¤²) -CollectEarthWindow.55=सीà¤à¤¸à¤µà¥€ का उपयोग कर मौजूदा रिकॉरà¥à¤¡ को अपडेट करें -CollectEarthWindow.47=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. -CollectEarthWindow.48=ज़िप / à¤à¤•तà¥à¤°-डेटा फ़ाइल -CollectEarthWindow.49=फà¥à¤¯à¥‚जन सीà¤à¤¸à¤µà¥€ फ़ाइल -CollectEarthWindow.5=बंद करे -CollectEarthWindow.50= उपयोगकरà¥à¤¤à¤¾ मैनà¥à¤…ल खोलें -CollectEarthWindow.51=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ के अदà¥à¤¯à¤¤à¤¨ के लिठजाà¤à¤š करें -CollectEarthWindow.52= अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— लॉग फ़ाइल खोलें -CollectEarthWindow.53=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ लॉग फ़ाइल -CollectEarthWindow.54=केà¤à¤®à¤à¤² से लोड अंक -CollectEarthWindow.56=के विषय में... -CollectEarthWindow.57=साà¤à¤•ॠसà¥à¤Ÿà¤¾à¤°à¥à¤Ÿà¤° पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ अभी भी चल रहा है, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें. -CollectEarthWindow.58=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ नहीं कर सकते -CollectEarthWindow.59=आप साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ के लिठडेटा सेट फिर से उतà¥à¤ªà¤¨à¥à¤¨ करने के लिठकरना चाहते हैं?
यह पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ समय लेने वाली हो सकती है.
आप यदि "हाà¤"पर कà¥à¤²à¤¿à¤• करें, तो नवीनतम जानकारी के साथ à¤à¤• नया डाटासेट उतà¥à¤ªà¤¨à¥à¤¨ हो जाà¤à¤—ा. -CollectEarthWindow.6=फà¥à¤¯à¥‚जन टेबल के लिठनिरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.60=साà¤à¤•ॠडेटा उतà¥à¤ªà¤¨à¥à¤¨ -CollectEarthWindow.61=डेटा à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ (पिछले निरà¥à¤¯à¤¾à¤¤ के बाद से संशोधित रिकॉरà¥à¤¡) -CollectEarthWindow.62=के विषय मे... -CollectEarthWindow.63=केà¤à¤®à¤à¤² से अंक पà¥à¤°à¤¾à¤ªà¥à¤¤ करने में तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.64=तकनीकी सहायता -CollectEarthWindow.7=डेटा आयात में तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.8=असà¥à¤µà¥€à¤•रण पाठ नहीं पाया जा सका -CollectEarthWindow.9=डेटा आयात रिकॉरà¥à¤¡ वह है जो कि पहले से ही अपने डेटाबेस पर मौजूद हैं शामिल. -DynamicsCode.0=पà¥à¤°à¤¾à¤°à¤‚भ में वन -DynamicsCode.1=पà¥à¤°à¤¾à¤°à¤‚भ में घास का मैदान, -DynamicsCode.2=पà¥à¤°à¤¾à¤°à¤‚भ में आबादी वाला इलाका -DynamicsCode.3=पà¥à¤°à¤¾à¤°à¤‚भ में बंजर -DynamicsCode.4=पà¥à¤°à¤¾à¤°à¤‚भ में आरà¥à¤¦à¥à¤° भूमि -DynamicsCode.5=पà¥à¤°à¤¾à¤°à¤‚भ में खेत -OpenTextFileListener.0=इस पाठ का फ़ाइल नहीं मिला \: -OptionWizard.0= विकलà¥à¤ª -OptionWizard.1=बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° चà¥à¤¨à¥‡à¤‚ -OptionWizard.10=बैकअप फ़ोलà¥à¤¡à¤° खोलें -OptionWizard.11=अजà¥à¤žà¤¾à¤¤\: उपयोग ifconfig -OptionWizard.12=गà¥à¤°à¤¾à¤¹à¤•ों का उलà¥à¤²à¥‡à¤– -OptionWizard.13=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° आईपी -OptionWizard.14=कतà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ (उदाहरण- 8023) -OptionWizard.15=बचाà¤à¤‚ और परिवरà¥à¤¤à¤¨ लागू करें -OptionWizard.16=आईडी -OptionWizard.17=X- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क -OptionWizard.18=Y- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क -OptionWizard.19=उठान -OptionWizard.2=कारà¥à¤¯à¤ªà¥à¤°à¤µà¤¾à¤¹ (सरà¥à¤µà¤° / गà¥à¤°à¤¾à¤¹à¤•) -OptionWizard.20=गूगल अरà¥à¤¥ अंतरà¥à¤µà¤¸à¥à¤¤à¥ बदल दिया गया है
यदि गà¥à¤—ल अरà¥à¤¥ आप से कहे,अंतरà¥à¤µà¤¸à¥à¤¤à¥ पà¥à¤¨à¤ƒ लोड सà¥à¤µà¥€à¤•ार करें . -OptionWizard.21=अदà¥à¤¯à¤¤à¤¨ सफल -OptionWizard.22=ढाल -OptionWizard.23=गूगल अरà¥à¤¥ डेटा को फिर से खोलने में कोई तà¥à¤°à¥à¤Ÿà¤¿ थी -OptionWizard.24=रदà¥à¤¦ करना -OptionWizard.25=ऑपरेशन मोड -OptionWizard.26=डीबी होसà¥à¤Ÿ -OptionWizard.27=यह à¤à¤• मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ साà¤à¤•ॠफ़ोलà¥à¤¡à¤° नहीं है ( सà¥à¤Ÿà¤¾à¤°à¥à¤Ÿ-साà¤à¤•à¥.batफ़ाइल मौजूद नहीं है) -OptionWizard.28=साà¤à¤•ॠसरà¥à¤µà¤° मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ नहीं -OptionWizard.29=डीबी पोरà¥à¤Ÿ -OptionWizard.3=सरà¥à¤µà¤° आवृतà¥à¤¤à¤¿ -OptionWizard.30=à¤à¤¸à¤•à¥à¤¯à¥ लाइट विकलà¥à¤ª -OptionWizard.31=सेमà¥à¤ªà¤² डेटा -OptionWizard.32=पà¥à¤²à¥‰à¤Ÿ लेआउट -OptionWizard.33=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ परिभाषा -OptionWizard.34=विकसित -OptionWizard.35=सेमà¥à¤ªà¤² अंक की संखà¥à¤¯à¤¾ -OptionWizard.36=सेमà¥à¤ªà¤² बिंदॠके बीच दूरी (मीटर में) -OptionWizard.37=भूखंड की सीमा के साथ मारà¥à¤œà¤¿à¤¨ (मीटर मे) -OptionWizard.38=सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सही ढंग से पढ़ा नहीं जा सकता.
इस फ़ाइल में à¤à¤• अलà¥à¤ªà¤µà¤¿à¤°à¤¾à¤® से अलग मूलà¥à¤¯à¥‹à¤‚ की उमà¥à¤®à¥€à¤¦ है \:
-OptionWizard.39=आईडी, वाई समनà¥à¤µà¤¯, à¤à¤•à¥à¤¸ समनà¥à¤µà¤¯, ऊंचाई, ढाल, पहलू -OptionWizard.4=वरà¥à¤¤à¤®à¤¾à¤¨ कंपà¥à¤¯à¥‚टर आईपी \: -OptionWizard.40=परियोजनाà¤à¤‚ -OptionWizard.41=à¤à¤• नई परियोजना फ़ाइल लोड करें -OptionWizard.42=सीà¤à¤¸à¤µà¥€ पाठक को बंद करते समय तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.43=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ का नाम -OptionWizard.44= सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ बैकअप डेटाबेस -OptionWizard.45=ओपन पृथà¥à¤µà¥€ इंजन ने पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° में जूम किया -OptionWizard.46=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठपृथà¥à¤µà¥€ इंजन टाइमलैपà¥à¤¸ खोलें -OptionWizard.47=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठबिंग मैपà¥à¤¸ खोलें -OptionWizard.48=बजाय गूगल अरà¥à¤¥ के फॉरà¥à¤® à¤à¤• बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° पर खोलें (लिनकà¥à¤¸ के लिठसिफारिश) -OptionWizard.49=भूखंड डेटा के साथ सीईडी / सीà¤à¤¸à¤µà¥€ फाइल भेजने के लिठपथ -OptionWizard.5=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ\: -OptionWizard.50=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.51=परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.52=केवल निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क के साथ सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल -OptionWizard.53=चौकोर -OptionWizard.54=केनà¥à¤¦à¥à¤°à¥€à¤¯ बिनà¥à¤¦à¥ -OptionWizard.55=परियोजना फ़ोलà¥à¤¡à¤° आयात तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.56=लोड परियोजना -OptionWizard.57=पहले से लोड परियोजना -OptionWizard.58= जी ई ई का मैदान खोलें (विशà¥à¤µà¤¸à¤¨à¥€à¤¯ जांचकरà¥à¤¤à¤¾ के उपयोग की आवशà¥à¤¯à¤•ता है) -OptionWizard.59=यहां भूखंड पर केंदà¥à¤°à¤¿à¤¤ मैपà¥à¤¸ खोलें -OptionWizard.6=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² डीबी मापदंड -OptionWizard.65=साà¤à¤•à¥à¤«à¤¼à¥‹à¤²à¥à¤¡à¤° का पथ -OptionWizard.66=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.67=फ़ायरफ़ॉकà¥à¤¸ निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ -OptionWizard.68=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.7=उपयोगकरà¥à¤¤à¤¾ नाम -OptionWizard.70=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों -OptionWizard.72=बाइनरी फ़ाइलें -OptionWizard.73=कà¥à¤°à¥‹à¤® निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ -OptionWizard.74=बà¥à¤°à¤¾à¤‰à¤œ -OptionWizard.76=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों -OptionWizard.78=बाइनरी फ़ाइलें -OptionWizard.79=केà¤à¤®à¤à¤² फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ के लिठपथ -OptionWizard.8=पासवरà¥à¤¡ -OptionWizard.80=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.82=फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ -OptionWizard.83=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ पà¥à¤°à¤ªà¤¤à¥à¤° डिज़ाइन करने के लिठपथ -OptionWizard.84=बà¥à¤°à¤¾à¤‰à¤œ..... -OptionWizard.86=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² वेब पेज -OptionWizard.87=पथ आइडीà¤à¤® परिभाषा के साथ à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठ-OptionWizard.88=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.9=डीबी नाम -OptionWizard.90=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² आइडीà¤à¤® परिभाषा -OptionWizard.91=सरà¥à¤µà¤° (पà¥à¤°à¤¬à¤‚धक संसà¥à¤•रण या खड़े अकेले का उपयोग करें) -OptionWizard.92=कà¥à¤²à¤¾à¤‡à¤‚ट (ऑपरेटर / सरà¥à¤µà¤° से जà¥à¤¡à¤¼à¥‡) -OptionWizard.93=सकà¥à¤¯à¥‚à¤à¤²à¤¾à¤‡à¤Ÿ (à¤à¤‚बेडेड / à¤à¤•ल फाइल आधारित) -OptionWizard.94=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² -OptionWizard.95=सेमà¥à¤ªà¤² डॉटà¥à¤¸ के साइड (मीटर में) -SaikuAnalysisListener.0=हाठ- ताज़ा साà¤à¤•ॠडेटा (लंबी पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾) -SaikuAnalysisListener.1=नहीं - बस साà¤à¤•ॠशà¥à¤°à¥‚ -SaikuStarter.1=साà¤à¤•ॠशà¥à¤°à¥‚ -SaikuStarter.2= साà¤à¤•ॠशà¥à¤°à¥‚ कà¥à¤› मिनट लग सकते हैं, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें\! -SaveEarthDataServlet.0=खाली अनà¥à¤°à¥‹à¤§ -SaveEarthDataServlet.1= डेटाबेस में डेटा बचाते समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ है -SaveEarthDataServlet.2=डेटा बचाया था -SlopeCode.0=समतल (0-5) -EarthApp.11=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ पहले से ही चल रहा है -EarthApp.21=à¤à¤• सीà¤à¤¸à¤µà¥€ / सीईडी के रूप में भूखंडों की गà¥à¤°à¤¿à¤¡ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
-EarthApp.23=कोई सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सेट-अप नहीं किया गया है \:

-EarthApp.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² परिभाषा के साथ फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है \:
-EarthApp.26=कोई à¤à¤•à¥à¤¸à¤à¤®à¤à¤² फ़ाइल परिभाषा सेट अप नहीं किया गया है \:

-EarthApp.27=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ रूप से यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
-EarthApp.29=कोई à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ फ़ाइल सेट-अप नहीं किया गया है \:

-EarthApp.3=मà¥à¤à¥‡ बाद में याद दिलाना -EarthApp.30=उपकरण> गà¥à¤£ मेनू में फ़ाइल सà¥à¤¥à¤¾à¤¨ को ठीक करें . -EarthApp.4=अभी अदà¥à¤¯à¤¤à¤¨ करें -EarthApp.5=मà¥à¤à¥‡ दà¥à¤¬à¤¾à¤°à¤¾ याद मत दिलाना -EarthApp.57=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ का à¤à¤• नया संसà¥à¤•रण उपलबà¥à¤§ है\!
आप कैसे आगे बढ़ना चाहते हैं? -EarthApp.58=अदà¥à¤¯à¤¤à¤¨ चेतावनी -EarthApp.59= परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ -EarthApp.6=\ - संसà¥à¤•रण -EarthApp.61=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ फाइल खà¥à¤² नहीं सकती .
कृपया सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करें कि गूगल अरà¥à¤¥ सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ है. -EarthSurveyService.9=आवशà¥à¤¯à¤• कà¥à¤·à¥‡à¤¤à¥à¤° -ExportActionListener.1= तारीख चूनें जबसे रिकॉरà¥à¤¡ निरà¥à¤¯à¤¾à¤¤ करने है -ExportDialogProcessMonitor.0=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... -ExportDialogProcessMonitor.1=पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ पà¥à¤°à¤¾à¤°à¤‚भ करने के लिठपà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ कर रहा है \: -ExportDialogProcessMonitor.4=निरà¥à¤¯à¤¾à¤¤ रिकॉरà¥à¤¡\: -ImportProcessMonitorDialog.0=आयातित रिकॉरà¥à¤¡ \: -ImportActionListener.0=कà¥à¤¯à¤¾ उन भूखंडों के लिठडेटा जो कि पूरी तरह से भरे नहीं गठ,आयातित किया जाना चाहिà¤? -ImportActionListener.2=आप कà¥à¤²à¤¿à¤• करें, नहींतो केवल डेटा "हरी" राजà¥à¤¯ में भूखंडों से ,जिसमें सभी डेटा यà¥à¤•à¥à¤¤ है , आयात किया जाà¤à¤—ा। -ImportDialogProcessMonitor.0=\ गणना -ImportDialogProcessMonitor.11=रिकॉरà¥à¤¡ की पà¥à¤°à¤¾à¤°à¤‚भिक संखà¥à¤¯à¤¾ \: -ImportDialogProcessMonitor.2=रिकॉरà¥à¤¡ आयात... -ImportDialogProcessMonitor.5=आयातित रिकॉरà¥à¤¡ की वासà¥à¤¤à¤µà¤¿à¤• संखà¥à¤¯à¤¾ \: -ImportDialogProcessMonitor.8=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... -InfiniteProgressMonitor.0=रदà¥à¤¦ ऑपरेशन -JFileChooserExistsAware.0=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ परियोजना फ़ाइल -KmlImportService.13=पà¥à¤²à¥‰à¤Ÿ सà¥à¤¥à¤¾à¤¨à¥‹à¤‚ को बचाने के लिठà¤à¤• सीà¤à¤¸à¤µà¥€ फ़ाइल का चयन करें -MissingPlotsListener.0=तà¥à¤°à¥à¤Ÿà¤¿ उन भूखंडों के बारे में जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ करने के लिठजो डेटाबेस पर मौजूद नहीं -MissingPlotsListener.1=गà¥à¤® भूखंड -MissingPlotsListener.10=सेमà¥à¤ªà¤² डिजाइन में भूखंडों की कà¥à¤² संखà¥à¤¯à¤¾ \: -MissingPlotsListener.12=गà¥à¤® भूखंडों की संखà¥à¤¯à¤¾ \: -MissingPlotsListener.14=सभी भूखंडों भर रहे हैं\! -MissingPlotsListener.2=कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ अंतरà¥à¤µà¤¸à¥à¤¤à¥ की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ -MissingPlotsListener.3=भूखंड की जानकारी वाले फ़ाइलें चà¥à¤¨à¥‡à¤‚ ( .सीà¤à¤¸à¤µà¥€ या .सीईडी फ़ाइलें ) जिसके लिठआप जानना चाहते हैं तो सभी डेटा भर दिया गया है चाहता हूà¤. -MissingPlotsListener.4=गà¥à¤® भूखंड- जानकारी -MissingPlotsListener.5=फ़ाइल से \: -MissingPlotsListener.6=सीà¤à¤¡à¥€ फ़ाइल में निरà¥à¤¯à¤¾à¤¤ करें -ProcessMonitorDialog.1=पंकà¥à¤¤à¤¿ संखà¥à¤¯à¤¾ पर तà¥à¤°à¥à¤Ÿà¤¿ -ProcessMonitorDialog.4=, कॉलम -ProcessMonitorDialog.5=\ --मूलà¥à¤¯ -YES= हां -YES_TO_ALL=सब को हां -NO=नहीं -NO_TO_ALL=सभी को नहीं - - - +AboutDialog.19=Äã có lá»—i +AboutDialog.5=Truy cập website cá»§a chúng tôi để biết thêm thông tin OpenForis.org +AboutDialog.6=Xin lá»—i, đã có sá»± cố khi mở link trong brower chuẩn trong hệ thống cá»§a bạn. +AboutDialog.8=Ok +AspectCode.0=Bắc +AspectCode.1=Äông-Bắc +AspectCode.2=Äông +AspectCode.3=Äông-Nam +AspectCode.4=Nam +AspectCode.5=Tây-Nam +AspectCode.6=Tây +AspectCode.7=Tây-Bắc +CollectEarthWindow.0=Lá»—i khi xuất dữ liệu sang file CSV +CollectEarthWindow.1=Lá»—i xuất dữ liệu +CollectEarthWindow.10=File +CollectEarthWindow.11=Thoát +CollectEarthWindow.12=Công cụ +CollectEarthWindow.13=Xuất dữ liệu ra CSV +CollectEarthWindow.14=Khởi động SAIKU Analysis +CollectEarthWindow.15=Thuá»™c tính +CollectEarthWindow.16=Trợ giúp +CollectEarthWindow.17=Thông tin công bố +CollectEarthWindow.18=Tìm ô thiếu trong cÆ¡ sở dữ liệu +CollectEarthWindow.19=Collect Earth +CollectEarthWindow.2=Ngôn ngữ +CollectEarthWindow.20=Số bản ghi trùng\: +CollectEarthWindow.21=Không tìm thấy biểu tượng cho khung chính +CollectEarthWindow.22=Bạn có chắc là muốn đóng Collect Earth?
Äóng cá»­a sổ cÅ©ng đóng luôn máy chá»§ Collect Earth +CollectEarthWindow.23=Cần khẳng định +CollectEarthWindow.24=Xuất ra XML +CollectEarthWindow.25=Bạn có muốn thêm các bản ghi này và bá» Ä‘i dữ liệu hiện thá»i không? +CollectEarthWindow.26=Ngưá»i sá»­ dụng +CollectEarthWindow.27=Cập nhật +CollectEarthWindow.28=Máy chá»§ Open Foris Collect Earth phải chạy khi ngưá»i sá»­ dụng giải Ä‘oán dữ liệu. +CollectEarthWindow.29=Chưa xác định cấu hình cho Máy chá»§ Saiku. +CollectEarthWindow.3=\ Lá»—i nhập +CollectEarthWindow.30=Äể mở cá»­a sổ này khi Ä‘ang sá»­ dụng Google Earth. +CollectEarthWindow.31=Xuất dữ liệu đã thu thập sang file CSV +CollectEarthWindow.32=Thoát +CollectEarthWindow.33=Tên ngưá»i sá»­ dụng phải dài hÆ¡n 5 chữ cái và ngắn hÆ¡n 50 chữ cái +CollectEarthWindow.34=Lá»—i kiểm chứng +CollectEarthWindow.35=TÊN NGƯỜI SỬ DỤNG CÃ’N TRá»NG\!
Hãy Ä‘iá»n tên ngưá»i sá»­ dụng và nhắp phím "Update". +CollectEarthWindow.36=Không được để trống phần tên ngưá»i sá»­ dụng +CollectEarthWindow.37=Äể mở +CollectEarthWindow.38=file CSV +CollectEarthWindow.39=THÔNG BÃO\: Nên lưu dá»± phòng dữ liệu hiện thá»i(Xuất ra XML) trước khi nhập dữ liệu má»›i +CollectEarthWindow.4=Thông tin công bố cá»§a FAO +CollectEarthWindow.40=Thiết lập đưá»ng dẫn tá»›i thư mục cài đặt Saiku Server trong Tools->Properties->Advanced tab. +CollectEarthWindow.41=Ghi dữ liệu xuất ra vào file\: +CollectEarthWindow.42=Thoát +CollectEarthWindow.43=Tìm thấy bản ghi có mâu thuẫn +CollectEarthWindow.44=Nhập/Xuất dữ liệu +CollectEarthWindow.45=Xuất dữ liệu ra XML (nén) +CollectEarthWindow.46=Nhập dữ liệu má»›i từ file ZIP (XML nén) +CollectEarthWindow.55=Cập nhật các bản ghi hiện thá»i bằng CSV +CollectEarthWindow.47=Chưa định cấu hình cho Saiku Server +CollectEarthWindow.48=ZIP files +CollectEarthWindow.49=Files CSV tổng hợp +CollectEarthWindow.5=Äóng +CollectEarthWindow.50=Mở hướng dẫn ngưá»i sá»­ dụng +CollectEarthWindow.51=Kiểm tra cập nhật cá»§a Collect Earth +CollectEarthWindow.52=Mở file nhật ký ứng dụng +CollectEarthWindow.53=File nhật ký cá»§a Collect Earth +CollectEarthWindow.54=Nạp các Ä‘iểm từ KML +CollectEarthWindow.56=Vá»... +CollectEarthWindow.57=Äang chạy quá trình khởi động Saiku, xin đợi. +CollectEarthWindow.58=Không thể khởi động Saiku analysis +CollectEarthWindow.59=Bạn có muốn tạo lại bá»™ dữ liệu cho Saiku analysis không?
Quá trình này sẽ mất một vài phút.
Nếu bạn chá»n "YES" sẽ tạo ra má»™t bá»™ dữ liệu má»›i vá»›i các thông tin cập nhật nhất. +CollectEarthWindow.6=Xuất ra bảng tổng hợp +CollectEarthWindow.60=Tạo dữ liệu Saiku +CollectEarthWindow.61=Xuất dữ liệu ra XML (các bản ghi chỉnh sá»­a từ lần xuất trước) +CollectEarthWindow.62=Vá»... +CollectEarthWindow.63=Lá»—i khi nạp Ä‘iểm từ KML +CollectEarthWindow.64=Há»— trợ kỹ thuật +CollectEarthWindow.7=Lá»—i khi nhập dữ liệu +CollectEarthWindow.8=Không tìm thấy văn bản thông báo +CollectEarthWindow.9=Dữ liệu nhập vào có chứa các bản ghi đã có trong cÆ¡ sở dữ liệu cá»§a bạn. +DynamicsCode.0=Ban đầu là rừng +DynamicsCode.1=Ban đầu là trảng cá» +DynamicsCode.2=Ban đầu là khu dân cư +DynamicsCode.3=Ban đầu là đất khác +DynamicsCode.4=Ban đầu là đất ngập nước +DynamicsCode.5=Ban đầu là đất trồng trá»t +OpenTextFileListener.0=không tìm thấy file văn bản tại\: +OptionWizard.0=Các lá»±a chá»n cá»§a Collect Earth +OptionWizard.1=Chá»n Browser +OptionWizard.10=Mở thư mục lưu dá»± phòng +OptionWizard.11=Không biết\: hãy sá»­ dụng ifconfig +OptionWizard.12=Vi dụ cá»§a khác +OptionWizard.13=Äịa chỉ IP cá»§a máy chá»§ Collect Earth +OptionWizard.14=Cổng máy chá»§ Collect Earth (vd\: 8023) +OptionWizard.15=Ghi và áo dụng thay đổi +OptionWizard.16=ID +OptionWizard.17=Tá»a độ X +OptionWizard.18=Tá»a độ Y +OptionWizard.19=Äá»™ cao +OptionWizard.2=Dòng công tác (máy chá»§/khách) +OptionWizard.20=Ná»™i dung cá»§a Google Earth đã thay đổi.
Äá» nghị chấp nhận tải lại ná»™i dung khi Google Earth gợi ý. +OptionWizard.21=Cập nhật thành công +OptionWizard.22=Dốc +OptionWizard.23=Có lá»—i khi mở lại dữ liệu Google Earth +OptionWizard.24=Há»§y +OptionWizard.25=Mode vận hành +OptionWizard.26=NÆ¡i lưu cÆ¡ sở dữ liệu +OptionWizard.27=Äây không phải là thư mục Saiku (hiện không có file start-saiku.bat) +OptionWizard.28=Không nhận được máy chá»§ Saiku +OptionWizard.29=Cổng cÆ¡ sở dữ liệu +OptionWizard.3=Ví dụ cá»§a máy chá»§ +OptionWizard.30=Các lá»±a chá»n cá»§a SQLite +OptionWizard.31=Dữ liệu mẫu +OptionWizard.32=SÆ¡ đồ mẫu +OptionWizard.33=Äịnh nghÄ©a khảo sát +OptionWizard.34=Nâng cao +OptionWizard.35=Số Ä‘iểm mẫu +OptionWizard.36=Khoảng cách giữa các Ä‘iểm mẫu (tính theo mét) +OptionWizard.37=Lá» vá»›i biên ô (tính theo mét) +OptionWizard.38=Không Ä‘á»c được đúng file CSV/CED.
Cần có dấu phảy để phân tách giá trị giống như sau \:
+OptionWizard.39=ID,Tá»a độ Y,tá»a độ X,độ cao,độ dốc,tá»· lệ +OptionWizard.4=Äịa chỉ IP hiện tại cá»§a máy tính\: +OptionWizard.40=Các project +OptionWizard.41=tải file project má»›i +OptionWizard.42=Lá»—i khi đóng CSV reader +OptionWizard.43=Tên khảo sát +OptionWizard.44=tá»± động lưu dá»± phòng dữ liệu tại +OptionWizard.45=Mở Earth Engine để phóng to vào khu vá»±c ô +OptionWizard.46=Mở Earth Engine timelapse cho khu vá»±c ô +OptionWizard.47=Mở Bing Maps cho khu vá»±c ô +OptionWizard.48=Mở form trên browser thay vì mở Google Earth (khuyến cáo cho LINUX) +OptionWizard.49=ÄÆ°á»ng dẫn tá»›i file ced/csv file vá»›i dữ liệu ô +OptionWizard.5=Cổng máy chá»§ Collect Earth\: +OptionWizard.50=Browse... +OptionWizard.51=Lá»—i nhập file project +OptionWizard.52=File CSV/CED chỉ có tá»a độ +OptionWizard.53=Ô vuông +OptionWizard.54=Äiểm trung tâm +OptionWizard.55=Lá»—i khi nhập thư mục project +OptionWizard.56=Tải project +OptionWizard.57=Các project đã tải +OptionWizard.58=Mở GEE Code Editor (cần phải có quyá»n truy cập Trusted Tester) +OptionWizard.59=Mở Here Maps tập trung vào ô +OptionWizard.6=Các thông số cá»§a CSDL PostgreSQL +OptionWizard.65=ÄÆ°á»ng dẫn tá»›i thư mục Saiku +OptionWizard.66=Browse... +OptionWizard.67=ÄÆ°á»ng dẫn tá»›i Firefox executable (file exe) +OptionWizard.68=Browse... +OptionWizard.7=Tên ngưá»i sá»­ dụng +OptionWizard.70=File chạy +OptionWizard.72=File nhị phân +OptionWizard.73=ÄÆ°á»ng dẫn tá»›i Chrome executable (file exe) +OptionWizard.74=Browse... +OptionWizard.76=File exe +OptionWizard.78=File nhị phân +OptionWizard.79=ÄÆ°á»ng dẫn tá»›i KML Freemarker template +OptionWizard.8=Mật khẩu +OptionWizard.80=Browse... +OptionWizard.82=Freemarker template +OptionWizard.83=ÄÆ°á»ng dẫn tá»›i mẫu thiết kế HTML Balloon +OptionWizard.84=Browse... +OptionWizard.86=HTML webpage +OptionWizard.87=ÄÆ°á»ng dẫn tá»›i XML vá»›i định nghÄ©a IDM +OptionWizard.88=Browse... +OptionWizard.9=Tên CSDL +OptionWizard.90=Äịnh nghÄ©a XML IDM +OptionWizard.91=Máy chá»§ (phiên bản quản lý hoặc sá»­ dụng độc lập) +OptionWizard.92=Khách (ngưá»i sá»­ dụng/kết nối vá»›i máy chá»§) +OptionWizard.93=SQLite (tích hợp/file đơn lẻ) +OptionWizard.94=PostgreSQL +SaikuAnalysisListener.0=Yes - Làm má»›i lại dữ liệu Saiku (quá trình dài) +SaikuAnalysisListener.1=No - chỉ khởi động Saiku +SaikuStarter.1=Khởi động Saiku +SaikuStarter.2=Cần vài phút để khởi động Saiku, xin đợi\! +SaveEarthDataServlet.0=Yêu cầu trống +SaveEarthDataServlet.1=Có trục trặc khi ghi dữ liệu vào CSDL +SaveEarthDataServlet.2=Dữ liệu đã được ghi +SlopeCode.0=Bằng phẳng (0-5) +EarthApp.11=Collect Earth Ä‘ang chạy +EarthApp.21=Không tìm thấy file chứa lưới ô trong đưá»ng dẫn đã chá»n \:
+EarthApp.23=Chưa thiết lập file CSV/CED \:

+EarthApp.24=Không tìm thấy file chứa Freemarker template vá»›i định nghÄ©a KML trong đưá»ng dẫn đã chá»n\:
+EarthApp.26=Chưa thiết lập file định nghĩa KML d\:

+EarthApp.27=Không tìm thấy file chứa mẫu HTML balloon trong đưá»ng dẫn đã chá»n\:
+EarthApp.29=Chưa thiết lập file HTML balloon \:

+EarthApp.3=Nhắc nhở sau +EarthApp.30=Xin hãy Ä‘iá»u chỉnh đúng địa chỉ file trong Tools->Properties menu. +EarthApp.4=Cập nhật luôn +EarthApp.5=Không nhắc nữa +EarthApp.57=Äã có phiên bản má»›i cá»§a Collect Earth\!
Bạn muốn làm tiếp như thế nào? +EarthApp.58=Thông báo cập nhật +EarthApp.59=Lỗi khi nhập file project +EarthApp.6=\ - Phiên bản +EarthApp.61=Không mở được file Collect Earth.
Äá» nghị đảm bảo đã cài đặt Google Earth. +EarthSurveyService.9=Trưá»ng bắt buá»™c +ExportActionListener.1=Chá»n ngày xuất bản ghi +ExportDialogProcessMonitor.0=Äang xá»­ lý dữ liệu... +ExportDialogProcessMonitor.1=Äang đợi khởi động quá trình\: +ExportDialogProcessMonitor.4=Các bản ghi đã xuất\: +ImportProcessMonitorDialog.0=Các bản ghi đã nhập\: +ImportActionListener.0=Có nhập dữ liệu các ô chưa được Ä‘iá»n đầy đủ không? +ImportActionListener.2=Nếu bạn chá»n NO sẽ chỉ nhập dữ liệu cá»§a các ô có trạng thái màu "xanh lá cây", các ô đã có đầy đủ dữ liệu. +ImportActionListener.3=Nhập các bản ghi chưa hoàn tất +ImportDialogProcessMonitor.0=\ ÄANG TÃNH TOÃN +ImportDialogProcessMonitor.11=Số lượng ban đầu các bản ghi\: +ImportDialogProcessMonitor.2=Äang nhập các bản ghi... +ImportDialogProcessMonitor.5=Số lượng thá»±c tế các bản ghi đã nhập\: +ImportDialogProcessMonitor.8=Äang xá»­ lý dữ liệu... +InfiniteProgressMonitor.0=Há»§y lệnh +JFileChooserExistsAware.0=File project cá»§a Collect Earth +KmlImportService.13=Chá»n file CSV file để ghi địa Ä‘iểm cá»§a ô vào +MissingPlotsListener.0=Lá»—i khi lấy thông tin vỠô không có trong CSDL +MissingPlotsListener.1=Các ô thiếu +MissingPlotsListener.10=Tổng số ô trong thiết kế chá»n mẫu \: +MissingPlotsListener.12=Số ô thiếu\: +MissingPlotsListener.14=Äã Ä‘iá»n tất cả các ô\! +MissingPlotsListener.2=Sao chép ná»™i dung vào bàn phím +MissingPlotsListener.3=Lá»±a chá»n file có chứa thông tin ô ( file .csv hoặc .ced ) mà bạn muốn biết đã Ä‘iá»n đủ dữ liệu chưa. +MissingPlotsListener.4=Các ô thiếu - thông tin +MissingPlotsListener.5=Từ file \: +MissingPlotsListener.6=Xuất ra file CED +ProcessMonitorDialog.1=Tìm lá»—i trên số dòng +ProcessMonitorDialog.4=, cá»™t +ProcessMonitorDialog.5=\ -- giá trị From f4fb6fbe79d95091a4ad3315a8e18210c66c1ee4 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:35:49 +0100 Subject: [PATCH 0809/1620] New translations utf8_orig_Messages_vi.properties (Spanish) --- .../earth/app/view/Messages_es.properties | 449 +++++++++--------- 1 file changed, 221 insertions(+), 228 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index f759c433b0..353fe0d367 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,228 +1,221 @@ -AboutDialog.19=कोई समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ -AboutDialog.5=अधिक जानकारी के लिठहमारी वेबसाइट पर जाà¤à¤‚ OpenForis.org -AboutDialog.6=कà¥à¤·à¤®à¤¾ करें, à¤à¤• समसà¥à¤¯à¤¾ आपके सिसà¥à¤Ÿà¤® के मानक बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में इस लिंक को खोलने की कोशिश कर रही है. -AboutDialog.8=ठीक -AspectCode.0=उतà¥à¤¤à¤° दिशा -AspectCode.1=उतà¥à¤¤à¤°-पूरà¥à¤µ दिशा -AspectCode.2=पूरà¥à¤µ दिशा -AspectCode.3=दकà¥à¤·à¤¿à¤£-पूरà¥à¤µ दिशा -AspectCode.4=दकà¥à¤·à¤¿à¤£ दिशा -AspectCode.5=दकà¥à¤·à¤¿à¤£-पशà¥à¤šà¤¿à¤® दिशा -AspectCode.6=पशà¥à¤šà¤¿à¤® दिशा -AspectCode.7=उतà¥à¤¤à¤°-पशà¥à¤šà¤¿à¤® दिशा -CollectEarthWindow.0=तà¥à¤°à¥à¤Ÿà¤¿ जब सीà¤à¤¸à¤µà¥€ फ़ाइल में डेटा निरà¥à¤¯à¤¾à¤¤ करने का पà¥à¤°à¤¯à¤¾à¤¸ -CollectEarthWindow.1=निरà¥à¤¯à¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.10=फ़ाइल -CollectEarthWindow.11=बाहर जाà¤à¤‚ -CollectEarthWindow.12=उपकरण -CollectEarthWindow.13=डेटा सीà¤à¤¸à¤µà¥€ निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.14=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ -CollectEarthWindow.15=गà¥à¤£ -CollectEarthWindow.16=मदद -CollectEarthWindow.17=असà¥à¤µà¥€à¤•रण -CollectEarthWindow.18=डेटाबेस में लापता भूखंडों खोजें -CollectEarthWindow.19=पृथà¥à¤µà¥€ इकटà¥à¤ à¤¾ -CollectEarthWindow.2=भाषा -CollectEarthWindow.20=डà¥à¤ªà¥à¤²à¤¿à¤•ेट रिकॉरà¥à¤¡ की संखà¥à¤¯à¤¾\: -CollectEarthWindow.21=मà¥à¤–à¥à¤¯ फà¥à¤°à¥‡à¤® के लिठआइकन नहीं मिल सकता है -CollectEarthWindow.22=आपको लगता है कि आप à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ बंद करना चाहते हैं? विंडोज बंद करने से, à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° बंद हो जाà¤à¤—ा -CollectEarthWindow.23=पà¥à¤·à¥à¤Ÿà¤¿ की जरूरत है -CollectEarthWindow.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.25=आप वैसे भी इन अभिलेखों को जोड़ना चाहते हैं और अपने वरà¥à¤¤à¤®à¤¾à¤¨ डेटा खोने के लिठकिलक करना चाहते हैं? -CollectEarthWindow.26=ऑपरेटर,पà¥à¤°à¤šà¤¾à¤²à¤• -CollectEarthWindow.27=अदà¥à¤¯à¤¤à¤¨ -CollectEarthWindow.28= औपन फौरिस à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° चल रहा होना चाहिठ, जबभी ऑपरेटर डेटा की वà¥à¤¯à¤¾à¤–à¥à¤¯à¤¾ करें . -CollectEarthWindow.29=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. -CollectEarthWindow.3= आयात संबंधी तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.30=जबभी आप गà¥à¤—ल अरà¥à¤¥ का उपयोग कर रहे हैं, कृपया इस विंडोज को खà¥à¤²à¥€ बनाठरखें. -CollectEarthWindow.31=à¤à¤•तà¥à¤° डेटा सीà¤à¤¸à¤µà¥€ फाइल में भेजें -CollectEarthWindow.32=छोड़ना -CollectEarthWindow.33=ऑपरेटर का नाम के 5 अकà¥à¤·à¤° से बड़ा और 50 अकà¥à¤·à¤° से कम होना चाहिठ-CollectEarthWindow.34=मानà¥à¤¯à¤¤à¤¾ तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.35=ऑपरेटर नाम खाली\!
कृपया ऑपरेटर का नाम भरें और "अदà¥à¤¯à¤¤à¤¨" बटन दबाà¤à¤. -CollectEarthWindow.36=ऑपरेटर नाम रिकà¥à¤¤ नहीं हो सकता -CollectEarthWindow.37=खà¥à¤²à¤¾ रखो -CollectEarthWindow.38=सीà¤à¤¸à¤µà¥€ फ़ाइल -CollectEarthWindow.39=सूचना\: यह सलाह दी जाती है कि आप नठडेटा डालने करने से पहले अपने मौजूदा आंकडों को बैकअप(à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤) कर लें -CollectEarthWindow.4=à¤à¤«à¤à¤“ असà¥à¤µà¥€à¤•रण नोटिस -CollectEarthWindow.40=उस फ़ोलà¥à¤¡à¤° पर जाà¤à¤‚ जहां साà¤à¤•ॠसरà¥à¤µà¤° में सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ किया गया है, फ़ोलà¥à¤¡à¤° का रासà¥à¤¤à¤¾ उपकरण> गà¥à¤£> उनà¥à¤¨à¤¤ टैब. -CollectEarthWindow.41=निरà¥à¤¯à¤¾à¤¤ डेटा को फ़ाइल में बचाया जा रहा है \: -CollectEarthWindow.42=छोड़ना -CollectEarthWindow.43=परसà¥à¤ªà¤° विरोधी रिकॉरà¥à¤¡ पाया -CollectEarthWindow.44=डेटा आयात / निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.45=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ डेटा (संकà¥à¤šà¤¿à¤¤) -CollectEarthWindow.46=ज़िप से नठडेटा आयात करें (संकà¥à¤šà¤¿à¤¤ à¤à¤•à¥à¤¸à¤à¤®à¤à¤²) -CollectEarthWindow.55=सीà¤à¤¸à¤µà¥€ का उपयोग कर मौजूदा रिकॉरà¥à¤¡ को अपडेट करें -CollectEarthWindow.47=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. -CollectEarthWindow.48=ज़िप / à¤à¤•तà¥à¤°-डेटा फ़ाइल -CollectEarthWindow.49=फà¥à¤¯à¥‚जन सीà¤à¤¸à¤µà¥€ फ़ाइल -CollectEarthWindow.5=बंद करे -CollectEarthWindow.50= उपयोगकरà¥à¤¤à¤¾ मैनà¥à¤…ल खोलें -CollectEarthWindow.51=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ के अदà¥à¤¯à¤¤à¤¨ के लिठजाà¤à¤š करें -CollectEarthWindow.52= अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— लॉग फ़ाइल खोलें -CollectEarthWindow.53=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ लॉग फ़ाइल -CollectEarthWindow.54=केà¤à¤®à¤à¤² से लोड अंक -CollectEarthWindow.56=के विषय में... -CollectEarthWindow.57=साà¤à¤•ॠसà¥à¤Ÿà¤¾à¤°à¥à¤Ÿà¤° पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ अभी भी चल रहा है, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें. -CollectEarthWindow.58=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ नहीं कर सकते -CollectEarthWindow.59=आप साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ के लिठडेटा सेट फिर से उतà¥à¤ªà¤¨à¥à¤¨ करने के लिठकरना चाहते हैं?
यह पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ समय लेने वाली हो सकती है.
आप यदि "हाà¤"पर कà¥à¤²à¤¿à¤• करें, तो नवीनतम जानकारी के साथ à¤à¤• नया डाटासेट उतà¥à¤ªà¤¨à¥à¤¨ हो जाà¤à¤—ा. -CollectEarthWindow.6=फà¥à¤¯à¥‚जन टेबल के लिठनिरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.60=साà¤à¤•ॠडेटा उतà¥à¤ªà¤¨à¥à¤¨ -CollectEarthWindow.61=डेटा à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ (पिछले निरà¥à¤¯à¤¾à¤¤ के बाद से संशोधित रिकॉरà¥à¤¡) -CollectEarthWindow.62=के विषय मे... -CollectEarthWindow.63=केà¤à¤®à¤à¤² से अंक पà¥à¤°à¤¾à¤ªà¥à¤¤ करने में तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.64=तकनीकी सहायता -CollectEarthWindow.7=डेटा आयात में तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.8=असà¥à¤µà¥€à¤•रण पाठ नहीं पाया जा सका -CollectEarthWindow.9=डेटा आयात रिकॉरà¥à¤¡ वह है जो कि पहले से ही अपने डेटाबेस पर मौजूद हैं शामिल. -DynamicsCode.0=पà¥à¤°à¤¾à¤°à¤‚भ में वन -DynamicsCode.1=पà¥à¤°à¤¾à¤°à¤‚भ में घास का मैदान, -DynamicsCode.2=पà¥à¤°à¤¾à¤°à¤‚भ में आबादी वाला इलाका -DynamicsCode.3=पà¥à¤°à¤¾à¤°à¤‚भ में बंजर -DynamicsCode.4=पà¥à¤°à¤¾à¤°à¤‚भ में आरà¥à¤¦à¥à¤° भूमि -DynamicsCode.5=पà¥à¤°à¤¾à¤°à¤‚भ में खेत -OpenTextFileListener.0=इस पाठ का फ़ाइल नहीं मिला \: -OptionWizard.0= विकलà¥à¤ª -OptionWizard.1=बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° चà¥à¤¨à¥‡à¤‚ -OptionWizard.10=बैकअप फ़ोलà¥à¤¡à¤° खोलें -OptionWizard.11=अजà¥à¤žà¤¾à¤¤\: उपयोग ifconfig -OptionWizard.12=गà¥à¤°à¤¾à¤¹à¤•ों का उलà¥à¤²à¥‡à¤– -OptionWizard.13=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° आईपी -OptionWizard.14=कतà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ (उदाहरण- 8023) -OptionWizard.15=बचाà¤à¤‚ और परिवरà¥à¤¤à¤¨ लागू करें -OptionWizard.16=आईडी -OptionWizard.17=X- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क -OptionWizard.18=Y- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क -OptionWizard.19=उठान -OptionWizard.2=कारà¥à¤¯à¤ªà¥à¤°à¤µà¤¾à¤¹ (सरà¥à¤µà¤° / गà¥à¤°à¤¾à¤¹à¤•) -OptionWizard.20=गूगल अरà¥à¤¥ अंतरà¥à¤µà¤¸à¥à¤¤à¥ बदल दिया गया है
यदि गà¥à¤—ल अरà¥à¤¥ आप से कहे,अंतरà¥à¤µà¤¸à¥à¤¤à¥ पà¥à¤¨à¤ƒ लोड सà¥à¤µà¥€à¤•ार करें . -OptionWizard.21=अदà¥à¤¯à¤¤à¤¨ सफल -OptionWizard.22=ढाल -OptionWizard.23=गूगल अरà¥à¤¥ डेटा को फिर से खोलने में कोई तà¥à¤°à¥à¤Ÿà¤¿ थी -OptionWizard.24=रदà¥à¤¦ करना -OptionWizard.25=ऑपरेशन मोड -OptionWizard.26=डीबी होसà¥à¤Ÿ -OptionWizard.27=यह à¤à¤• मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ साà¤à¤•ॠफ़ोलà¥à¤¡à¤° नहीं है ( सà¥à¤Ÿà¤¾à¤°à¥à¤Ÿ-साà¤à¤•à¥.batफ़ाइल मौजूद नहीं है) -OptionWizard.28=साà¤à¤•ॠसरà¥à¤µà¤° मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ नहीं -OptionWizard.29=डीबी पोरà¥à¤Ÿ -OptionWizard.3=सरà¥à¤µà¤° आवृतà¥à¤¤à¤¿ -OptionWizard.30=à¤à¤¸à¤•à¥à¤¯à¥ लाइट विकलà¥à¤ª -OptionWizard.31=सेमà¥à¤ªà¤² डेटा -OptionWizard.32=पà¥à¤²à¥‰à¤Ÿ लेआउट -OptionWizard.33=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ परिभाषा -OptionWizard.34=विकसित -OptionWizard.35=सेमà¥à¤ªà¤² अंक की संखà¥à¤¯à¤¾ -OptionWizard.36=सेमà¥à¤ªà¤² बिंदॠके बीच दूरी (मीटर में) -OptionWizard.37=भूखंड की सीमा के साथ मारà¥à¤œà¤¿à¤¨ (मीटर मे) -OptionWizard.38=सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सही ढंग से पढ़ा नहीं जा सकता.
इस फ़ाइल में à¤à¤• अलà¥à¤ªà¤µà¤¿à¤°à¤¾à¤® से अलग मूलà¥à¤¯à¥‹à¤‚ की उमà¥à¤®à¥€à¤¦ है \:
-OptionWizard.39=आईडी, वाई समनà¥à¤µà¤¯, à¤à¤•à¥à¤¸ समनà¥à¤µà¤¯, ऊंचाई, ढाल, पहलू -OptionWizard.4=वरà¥à¤¤à¤®à¤¾à¤¨ कंपà¥à¤¯à¥‚टर आईपी \: -OptionWizard.40=परियोजनाà¤à¤‚ -OptionWizard.41=à¤à¤• नई परियोजना फ़ाइल लोड करें -OptionWizard.42=सीà¤à¤¸à¤µà¥€ पाठक को बंद करते समय तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.43=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ का नाम -OptionWizard.44= सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ बैकअप डेटाबेस -OptionWizard.45=ओपन पृथà¥à¤µà¥€ इंजन ने पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° में जूम किया -OptionWizard.46=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठपृथà¥à¤µà¥€ इंजन टाइमलैपà¥à¤¸ खोलें -OptionWizard.47=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठबिंग मैपà¥à¤¸ खोलें -OptionWizard.48=बजाय गूगल अरà¥à¤¥ के फॉरà¥à¤® à¤à¤• बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° पर खोलें (लिनकà¥à¤¸ के लिठसिफारिश) -OptionWizard.49=भूखंड डेटा के साथ सीईडी / सीà¤à¤¸à¤µà¥€ फाइल भेजने के लिठपथ -OptionWizard.5=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ\: -OptionWizard.50=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.51=परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.52=केवल निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क के साथ सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल -OptionWizard.53=चौकोर -OptionWizard.54=केनà¥à¤¦à¥à¤°à¥€à¤¯ बिनà¥à¤¦à¥ -OptionWizard.55=परियोजना फ़ोलà¥à¤¡à¤° आयात तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.56=लोड परियोजना -OptionWizard.57=पहले से लोड परियोजना -OptionWizard.58= जी ई ई का मैदान खोलें (विशà¥à¤µà¤¸à¤¨à¥€à¤¯ जांचकरà¥à¤¤à¤¾ के उपयोग की आवशà¥à¤¯à¤•ता है) -OptionWizard.59=यहां भूखंड पर केंदà¥à¤°à¤¿à¤¤ मैपà¥à¤¸ खोलें -OptionWizard.6=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² डीबी मापदंड -OptionWizard.65=साà¤à¤•à¥à¤«à¤¼à¥‹à¤²à¥à¤¡à¤° का पथ -OptionWizard.66=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.67=फ़ायरफ़ॉकà¥à¤¸ निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ -OptionWizard.68=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.7=उपयोगकरà¥à¤¤à¤¾ नाम -OptionWizard.70=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों -OptionWizard.72=बाइनरी फ़ाइलें -OptionWizard.73=कà¥à¤°à¥‹à¤® निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ -OptionWizard.74=बà¥à¤°à¤¾à¤‰à¤œ -OptionWizard.76=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों -OptionWizard.78=बाइनरी फ़ाइलें -OptionWizard.79=केà¤à¤®à¤à¤² फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ के लिठपथ -OptionWizard.8=पासवरà¥à¤¡ -OptionWizard.80=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.82=फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ -OptionWizard.83=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ पà¥à¤°à¤ªà¤¤à¥à¤° डिज़ाइन करने के लिठपथ -OptionWizard.84=बà¥à¤°à¤¾à¤‰à¤œ..... -OptionWizard.86=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² वेब पेज -OptionWizard.87=पथ आइडीà¤à¤® परिभाषा के साथ à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठ-OptionWizard.88=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.9=डीबी नाम -OptionWizard.90=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² आइडीà¤à¤® परिभाषा -OptionWizard.91=सरà¥à¤µà¤° (पà¥à¤°à¤¬à¤‚धक संसà¥à¤•रण या खड़े अकेले का उपयोग करें) -OptionWizard.92=कà¥à¤²à¤¾à¤‡à¤‚ट (ऑपरेटर / सरà¥à¤µà¤° से जà¥à¤¡à¤¼à¥‡) -OptionWizard.93=सकà¥à¤¯à¥‚à¤à¤²à¤¾à¤‡à¤Ÿ (à¤à¤‚बेडेड / à¤à¤•ल फाइल आधारित) -OptionWizard.94=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² -OptionWizard.95=सेमà¥à¤ªà¤² डॉटà¥à¤¸ के साइड (मीटर में) -SaikuAnalysisListener.0=हाठ- ताज़ा साà¤à¤•ॠडेटा (लंबी पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾) -SaikuAnalysisListener.1=नहीं - बस साà¤à¤•ॠशà¥à¤°à¥‚ -SaikuStarter.1=साà¤à¤•ॠशà¥à¤°à¥‚ -SaikuStarter.2= साà¤à¤•ॠशà¥à¤°à¥‚ कà¥à¤› मिनट लग सकते हैं, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें\! -SaveEarthDataServlet.0=खाली अनà¥à¤°à¥‹à¤§ -SaveEarthDataServlet.1= डेटाबेस में डेटा बचाते समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ है -SaveEarthDataServlet.2=डेटा बचाया था -SlopeCode.0=समतल (0-5) -EarthApp.11=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ पहले से ही चल रहा है -EarthApp.21=à¤à¤• सीà¤à¤¸à¤µà¥€ / सीईडी के रूप में भूखंडों की गà¥à¤°à¤¿à¤¡ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
-EarthApp.23=कोई सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सेट-अप नहीं किया गया है \:

-EarthApp.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² परिभाषा के साथ फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है \:
-EarthApp.26=कोई à¤à¤•à¥à¤¸à¤à¤®à¤à¤² फ़ाइल परिभाषा सेट अप नहीं किया गया है \:

-EarthApp.27=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ रूप से यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
-EarthApp.29=कोई à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ फ़ाइल सेट-अप नहीं किया गया है \:

-EarthApp.3=मà¥à¤à¥‡ बाद में याद दिलाना -EarthApp.30=उपकरण> गà¥à¤£ मेनू में फ़ाइल सà¥à¤¥à¤¾à¤¨ को ठीक करें . -EarthApp.4=अभी अदà¥à¤¯à¤¤à¤¨ करें -EarthApp.5=मà¥à¤à¥‡ दà¥à¤¬à¤¾à¤°à¤¾ याद मत दिलाना -EarthApp.57=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ का à¤à¤• नया संसà¥à¤•रण उपलबà¥à¤§ है\!
आप कैसे आगे बढ़ना चाहते हैं? -EarthApp.58=अदà¥à¤¯à¤¤à¤¨ चेतावनी -EarthApp.59= परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ -EarthApp.6=\ - संसà¥à¤•रण -EarthApp.61=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ फाइल खà¥à¤² नहीं सकती .
कृपया सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करें कि गूगल अरà¥à¤¥ सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ है. -EarthSurveyService.9=आवशà¥à¤¯à¤• कà¥à¤·à¥‡à¤¤à¥à¤° -ExportActionListener.1= तारीख चूनें जबसे रिकॉरà¥à¤¡ निरà¥à¤¯à¤¾à¤¤ करने है -ExportDialogProcessMonitor.0=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... -ExportDialogProcessMonitor.1=पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ पà¥à¤°à¤¾à¤°à¤‚भ करने के लिठपà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ कर रहा है \: -ExportDialogProcessMonitor.4=निरà¥à¤¯à¤¾à¤¤ रिकॉरà¥à¤¡\: -ImportProcessMonitorDialog.0=आयातित रिकॉरà¥à¤¡ \: -ImportActionListener.0=कà¥à¤¯à¤¾ उन भूखंडों के लिठडेटा जो कि पूरी तरह से भरे नहीं गठ,आयातित किया जाना चाहिà¤? -ImportActionListener.2=आप कà¥à¤²à¤¿à¤• करें, नहींतो केवल डेटा "हरी" राजà¥à¤¯ में भूखंडों से ,जिसमें सभी डेटा यà¥à¤•à¥à¤¤ है , आयात किया जाà¤à¤—ा। -ImportDialogProcessMonitor.0=\ गणना -ImportDialogProcessMonitor.11=रिकॉरà¥à¤¡ की पà¥à¤°à¤¾à¤°à¤‚भिक संखà¥à¤¯à¤¾ \: -ImportDialogProcessMonitor.2=रिकॉरà¥à¤¡ आयात... -ImportDialogProcessMonitor.5=आयातित रिकॉरà¥à¤¡ की वासà¥à¤¤à¤µà¤¿à¤• संखà¥à¤¯à¤¾ \: -ImportDialogProcessMonitor.8=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... -InfiniteProgressMonitor.0=रदà¥à¤¦ ऑपरेशन -JFileChooserExistsAware.0=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ परियोजना फ़ाइल -KmlImportService.13=पà¥à¤²à¥‰à¤Ÿ सà¥à¤¥à¤¾à¤¨à¥‹à¤‚ को बचाने के लिठà¤à¤• सीà¤à¤¸à¤µà¥€ फ़ाइल का चयन करें -MissingPlotsListener.0=तà¥à¤°à¥à¤Ÿà¤¿ उन भूखंडों के बारे में जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ करने के लिठजो डेटाबेस पर मौजूद नहीं -MissingPlotsListener.1=गà¥à¤® भूखंड -MissingPlotsListener.10=सेमà¥à¤ªà¤² डिजाइन में भूखंडों की कà¥à¤² संखà¥à¤¯à¤¾ \: -MissingPlotsListener.12=गà¥à¤® भूखंडों की संखà¥à¤¯à¤¾ \: -MissingPlotsListener.14=सभी भूखंडों भर रहे हैं\! -MissingPlotsListener.2=कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ अंतरà¥à¤µà¤¸à¥à¤¤à¥ की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ -MissingPlotsListener.3=भूखंड की जानकारी वाले फ़ाइलें चà¥à¤¨à¥‡à¤‚ ( .सीà¤à¤¸à¤µà¥€ या .सीईडी फ़ाइलें ) जिसके लिठआप जानना चाहते हैं तो सभी डेटा भर दिया गया है चाहता हूà¤. -MissingPlotsListener.4=गà¥à¤® भूखंड- जानकारी -MissingPlotsListener.5=फ़ाइल से \: -MissingPlotsListener.6=सीà¤à¤¡à¥€ फ़ाइल में निरà¥à¤¯à¤¾à¤¤ करें -ProcessMonitorDialog.1=पंकà¥à¤¤à¤¿ संखà¥à¤¯à¤¾ पर तà¥à¤°à¥à¤Ÿà¤¿ -ProcessMonitorDialog.4=, कॉलम -ProcessMonitorDialog.5=\ --मूलà¥à¤¯ -YES= हां -YES_TO_ALL=सब को हां -NO=नहीं -NO_TO_ALL=सभी को नहीं - - - +AboutDialog.19=Äã có lá»—i +AboutDialog.5=Truy cập website cá»§a chúng tôi để biết thêm thông tin OpenForis.org +AboutDialog.6=Xin lá»—i, đã có sá»± cố khi mở link trong brower chuẩn trong hệ thống cá»§a bạn. +AboutDialog.8=Ok +AspectCode.0=Bắc +AspectCode.1=Äông-Bắc +AspectCode.2=Äông +AspectCode.3=Äông-Nam +AspectCode.4=Nam +AspectCode.5=Tây-Nam +AspectCode.6=Tây +AspectCode.7=Tây-Bắc +CollectEarthWindow.0=Lá»—i khi xuất dữ liệu sang file CSV +CollectEarthWindow.1=Lá»—i xuất dữ liệu +CollectEarthWindow.10=File +CollectEarthWindow.11=Thoát +CollectEarthWindow.12=Công cụ +CollectEarthWindow.13=Xuất dữ liệu ra CSV +CollectEarthWindow.14=Khởi động SAIKU Analysis +CollectEarthWindow.15=Thuá»™c tính +CollectEarthWindow.16=Trợ giúp +CollectEarthWindow.17=Thông tin công bố +CollectEarthWindow.18=Tìm ô thiếu trong cÆ¡ sở dữ liệu +CollectEarthWindow.19=Collect Earth +CollectEarthWindow.2=Ngôn ngữ +CollectEarthWindow.20=Số bản ghi trùng\: +CollectEarthWindow.21=Không tìm thấy biểu tượng cho khung chính +CollectEarthWindow.22=Bạn có chắc là muốn đóng Collect Earth?
Äóng cá»­a sổ cÅ©ng đóng luôn máy chá»§ Collect Earth +CollectEarthWindow.23=Cần khẳng định +CollectEarthWindow.24=Xuất ra XML +CollectEarthWindow.25=Bạn có muốn thêm các bản ghi này và bá» Ä‘i dữ liệu hiện thá»i không? +CollectEarthWindow.26=Ngưá»i sá»­ dụng +CollectEarthWindow.27=Cập nhật +CollectEarthWindow.28=Máy chá»§ Open Foris Collect Earth phải chạy khi ngưá»i sá»­ dụng giải Ä‘oán dữ liệu. +CollectEarthWindow.29=Chưa xác định cấu hình cho Máy chá»§ Saiku. +CollectEarthWindow.3=\ Lá»—i nhập +CollectEarthWindow.30=Äể mở cá»­a sổ này khi Ä‘ang sá»­ dụng Google Earth. +CollectEarthWindow.31=Xuất dữ liệu đã thu thập sang file CSV +CollectEarthWindow.32=Thoát +CollectEarthWindow.33=Tên ngưá»i sá»­ dụng phải dài hÆ¡n 5 chữ cái và ngắn hÆ¡n 50 chữ cái +CollectEarthWindow.34=Lá»—i kiểm chứng +CollectEarthWindow.35=TÊN NGƯỜI SỬ DỤNG CÃ’N TRá»NG\!
Hãy Ä‘iá»n tên ngưá»i sá»­ dụng và nhắp phím "Update". +CollectEarthWindow.36=Không được để trống phần tên ngưá»i sá»­ dụng +CollectEarthWindow.37=Äể mở +CollectEarthWindow.38=file CSV +CollectEarthWindow.39=THÔNG BÃO\: Nên lưu dá»± phòng dữ liệu hiện thá»i(Xuất ra XML) trước khi nhập dữ liệu má»›i +CollectEarthWindow.4=Thông tin công bố cá»§a FAO +CollectEarthWindow.40=Thiết lập đưá»ng dẫn tá»›i thư mục cài đặt Saiku Server trong Tools->Properties->Advanced tab. +CollectEarthWindow.41=Ghi dữ liệu xuất ra vào file\: +CollectEarthWindow.42=Thoát +CollectEarthWindow.43=Tìm thấy bản ghi có mâu thuẫn +CollectEarthWindow.44=Nhập/Xuất dữ liệu +CollectEarthWindow.45=Xuất dữ liệu ra XML (nén) +CollectEarthWindow.46=Nhập dữ liệu má»›i từ file ZIP (XML nén) +CollectEarthWindow.55=Cập nhật các bản ghi hiện thá»i bằng CSV +CollectEarthWindow.47=Chưa định cấu hình cho Saiku Server +CollectEarthWindow.48=ZIP files +CollectEarthWindow.49=Files CSV tổng hợp +CollectEarthWindow.5=Äóng +CollectEarthWindow.50=Mở hướng dẫn ngưá»i sá»­ dụng +CollectEarthWindow.51=Kiểm tra cập nhật cá»§a Collect Earth +CollectEarthWindow.52=Mở file nhật ký ứng dụng +CollectEarthWindow.53=File nhật ký cá»§a Collect Earth +CollectEarthWindow.54=Nạp các Ä‘iểm từ KML +CollectEarthWindow.56=Vá»... +CollectEarthWindow.57=Äang chạy quá trình khởi động Saiku, xin đợi. +CollectEarthWindow.58=Không thể khởi động Saiku analysis +CollectEarthWindow.59=Bạn có muốn tạo lại bá»™ dữ liệu cho Saiku analysis không?
Quá trình này sẽ mất một vài phút.
Nếu bạn chá»n "YES" sẽ tạo ra má»™t bá»™ dữ liệu má»›i vá»›i các thông tin cập nhật nhất. +CollectEarthWindow.6=Xuất ra bảng tổng hợp +CollectEarthWindow.60=Tạo dữ liệu Saiku +CollectEarthWindow.61=Xuất dữ liệu ra XML (các bản ghi chỉnh sá»­a từ lần xuất trước) +CollectEarthWindow.62=Vá»... +CollectEarthWindow.63=Lá»—i khi nạp Ä‘iểm từ KML +CollectEarthWindow.64=Há»— trợ kỹ thuật +CollectEarthWindow.7=Lá»—i khi nhập dữ liệu +CollectEarthWindow.8=Không tìm thấy văn bản thông báo +CollectEarthWindow.9=Dữ liệu nhập vào có chứa các bản ghi đã có trong cÆ¡ sở dữ liệu cá»§a bạn. +DynamicsCode.0=Ban đầu là rừng +DynamicsCode.1=Ban đầu là trảng cá» +DynamicsCode.2=Ban đầu là khu dân cư +DynamicsCode.3=Ban đầu là đất khác +DynamicsCode.4=Ban đầu là đất ngập nước +DynamicsCode.5=Ban đầu là đất trồng trá»t +OpenTextFileListener.0=không tìm thấy file văn bản tại\: +OptionWizard.0=Các lá»±a chá»n cá»§a Collect Earth +OptionWizard.1=Chá»n Browser +OptionWizard.10=Mở thư mục lưu dá»± phòng +OptionWizard.11=Không biết\: hãy sá»­ dụng ifconfig +OptionWizard.12=Vi dụ cá»§a khác +OptionWizard.13=Äịa chỉ IP cá»§a máy chá»§ Collect Earth +OptionWizard.14=Cổng máy chá»§ Collect Earth (vd\: 8023) +OptionWizard.15=Ghi và áo dụng thay đổi +OptionWizard.16=ID +OptionWizard.17=Tá»a độ X +OptionWizard.18=Tá»a độ Y +OptionWizard.19=Äá»™ cao +OptionWizard.2=Dòng công tác (máy chá»§/khách) +OptionWizard.20=Ná»™i dung cá»§a Google Earth đã thay đổi.
Äá» nghị chấp nhận tải lại ná»™i dung khi Google Earth gợi ý. +OptionWizard.21=Cập nhật thành công +OptionWizard.22=Dốc +OptionWizard.23=Có lá»—i khi mở lại dữ liệu Google Earth +OptionWizard.24=Há»§y +OptionWizard.25=Mode vận hành +OptionWizard.26=NÆ¡i lưu cÆ¡ sở dữ liệu +OptionWizard.27=Äây không phải là thư mục Saiku (hiện không có file start-saiku.bat) +OptionWizard.28=Không nhận được máy chá»§ Saiku +OptionWizard.29=Cổng cÆ¡ sở dữ liệu +OptionWizard.3=Ví dụ cá»§a máy chá»§ +OptionWizard.30=Các lá»±a chá»n cá»§a SQLite +OptionWizard.31=Dữ liệu mẫu +OptionWizard.32=SÆ¡ đồ mẫu +OptionWizard.33=Äịnh nghÄ©a khảo sát +OptionWizard.34=Nâng cao +OptionWizard.35=Số Ä‘iểm mẫu +OptionWizard.36=Khoảng cách giữa các Ä‘iểm mẫu (tính theo mét) +OptionWizard.37=Lá» vá»›i biên ô (tính theo mét) +OptionWizard.38=Không Ä‘á»c được đúng file CSV/CED.
Cần có dấu phảy để phân tách giá trị giống như sau \:
+OptionWizard.39=ID,Tá»a độ Y,tá»a độ X,độ cao,độ dốc,tá»· lệ +OptionWizard.4=Äịa chỉ IP hiện tại cá»§a máy tính\: +OptionWizard.40=Các project +OptionWizard.41=tải file project má»›i +OptionWizard.42=Lá»—i khi đóng CSV reader +OptionWizard.43=Tên khảo sát +OptionWizard.44=tá»± động lưu dá»± phòng dữ liệu tại +OptionWizard.45=Mở Earth Engine để phóng to vào khu vá»±c ô +OptionWizard.46=Mở Earth Engine timelapse cho khu vá»±c ô +OptionWizard.47=Mở Bing Maps cho khu vá»±c ô +OptionWizard.48=Mở form trên browser thay vì mở Google Earth (khuyến cáo cho LINUX) +OptionWizard.49=ÄÆ°á»ng dẫn tá»›i file ced/csv file vá»›i dữ liệu ô +OptionWizard.5=Cổng máy chá»§ Collect Earth\: +OptionWizard.50=Browse... +OptionWizard.51=Lá»—i nhập file project +OptionWizard.52=File CSV/CED chỉ có tá»a độ +OptionWizard.53=Ô vuông +OptionWizard.54=Äiểm trung tâm +OptionWizard.55=Lá»—i khi nhập thư mục project +OptionWizard.56=Tải project +OptionWizard.57=Các project đã tải +OptionWizard.58=Mở GEE Code Editor (cần phải có quyá»n truy cập Trusted Tester) +OptionWizard.59=Mở Here Maps tập trung vào ô +OptionWizard.6=Các thông số cá»§a CSDL PostgreSQL +OptionWizard.65=ÄÆ°á»ng dẫn tá»›i thư mục Saiku +OptionWizard.66=Browse... +OptionWizard.67=ÄÆ°á»ng dẫn tá»›i Firefox executable (file exe) +OptionWizard.68=Browse... +OptionWizard.7=Tên ngưá»i sá»­ dụng +OptionWizard.70=File chạy +OptionWizard.72=File nhị phân +OptionWizard.73=ÄÆ°á»ng dẫn tá»›i Chrome executable (file exe) +OptionWizard.74=Browse... +OptionWizard.76=File exe +OptionWizard.78=File nhị phân +OptionWizard.79=ÄÆ°á»ng dẫn tá»›i KML Freemarker template +OptionWizard.8=Mật khẩu +OptionWizard.80=Browse... +OptionWizard.82=Freemarker template +OptionWizard.83=ÄÆ°á»ng dẫn tá»›i mẫu thiết kế HTML Balloon +OptionWizard.84=Browse... +OptionWizard.86=HTML webpage +OptionWizard.87=ÄÆ°á»ng dẫn tá»›i XML vá»›i định nghÄ©a IDM +OptionWizard.88=Browse... +OptionWizard.9=Tên CSDL +OptionWizard.90=Äịnh nghÄ©a XML IDM +OptionWizard.91=Máy chá»§ (phiên bản quản lý hoặc sá»­ dụng độc lập) +OptionWizard.92=Khách (ngưá»i sá»­ dụng/kết nối vá»›i máy chá»§) +OptionWizard.93=SQLite (tích hợp/file đơn lẻ) +OptionWizard.94=PostgreSQL +SaikuAnalysisListener.0=Yes - Làm má»›i lại dữ liệu Saiku (quá trình dài) +SaikuAnalysisListener.1=No - chỉ khởi động Saiku +SaikuStarter.1=Khởi động Saiku +SaikuStarter.2=Cần vài phút để khởi động Saiku, xin đợi\! +SaveEarthDataServlet.0=Yêu cầu trống +SaveEarthDataServlet.1=Có trục trặc khi ghi dữ liệu vào CSDL +SaveEarthDataServlet.2=Dữ liệu đã được ghi +SlopeCode.0=Bằng phẳng (0-5) +EarthApp.11=Collect Earth Ä‘ang chạy +EarthApp.21=Không tìm thấy file chứa lưới ô trong đưá»ng dẫn đã chá»n \:
+EarthApp.23=Chưa thiết lập file CSV/CED \:

+EarthApp.24=Không tìm thấy file chứa Freemarker template vá»›i định nghÄ©a KML trong đưá»ng dẫn đã chá»n\:
+EarthApp.26=Chưa thiết lập file định nghĩa KML d\:

+EarthApp.27=Không tìm thấy file chứa mẫu HTML balloon trong đưá»ng dẫn đã chá»n\:
+EarthApp.29=Chưa thiết lập file HTML balloon \:

+EarthApp.3=Nhắc nhở sau +EarthApp.30=Xin hãy Ä‘iá»u chỉnh đúng địa chỉ file trong Tools->Properties menu. +EarthApp.4=Cập nhật luôn +EarthApp.5=Không nhắc nữa +EarthApp.57=Äã có phiên bản má»›i cá»§a Collect Earth\!
Bạn muốn làm tiếp như thế nào? +EarthApp.58=Thông báo cập nhật +EarthApp.59=Lỗi khi nhập file project +EarthApp.6=\ - Phiên bản +EarthApp.61=Không mở được file Collect Earth.
Äá» nghị đảm bảo đã cài đặt Google Earth. +EarthSurveyService.9=Trưá»ng bắt buá»™c +ExportActionListener.1=Chá»n ngày xuất bản ghi +ExportDialogProcessMonitor.0=Äang xá»­ lý dữ liệu... +ExportDialogProcessMonitor.1=Äang đợi khởi động quá trình\: +ExportDialogProcessMonitor.4=Các bản ghi đã xuất\: +ImportProcessMonitorDialog.0=Các bản ghi đã nhập\: +ImportActionListener.0=Có nhập dữ liệu các ô chưa được Ä‘iá»n đầy đủ không? +ImportActionListener.2=Nếu bạn chá»n NO sẽ chỉ nhập dữ liệu cá»§a các ô có trạng thái màu "xanh lá cây", các ô đã có đầy đủ dữ liệu. +ImportActionListener.3=Nhập các bản ghi chưa hoàn tất +ImportDialogProcessMonitor.0=\ ÄANG TÃNH TOÃN +ImportDialogProcessMonitor.11=Số lượng ban đầu các bản ghi\: +ImportDialogProcessMonitor.2=Äang nhập các bản ghi... +ImportDialogProcessMonitor.5=Số lượng thá»±c tế các bản ghi đã nhập\: +ImportDialogProcessMonitor.8=Äang xá»­ lý dữ liệu... +InfiniteProgressMonitor.0=Há»§y lệnh +JFileChooserExistsAware.0=File project cá»§a Collect Earth +KmlImportService.13=Chá»n file CSV file để ghi địa Ä‘iểm cá»§a ô vào +MissingPlotsListener.0=Lá»—i khi lấy thông tin vỠô không có trong CSDL +MissingPlotsListener.1=Các ô thiếu +MissingPlotsListener.10=Tổng số ô trong thiết kế chá»n mẫu \: +MissingPlotsListener.12=Số ô thiếu\: +MissingPlotsListener.14=Äã Ä‘iá»n tất cả các ô\! +MissingPlotsListener.2=Sao chép ná»™i dung vào bàn phím +MissingPlotsListener.3=Lá»±a chá»n file có chứa thông tin ô ( file .csv hoặc .ced ) mà bạn muốn biết đã Ä‘iá»n đủ dữ liệu chưa. +MissingPlotsListener.4=Các ô thiếu - thông tin +MissingPlotsListener.5=Từ file \: +MissingPlotsListener.6=Xuất ra file CED +ProcessMonitorDialog.1=Tìm lá»—i trên số dòng +ProcessMonitorDialog.4=, cá»™t +ProcessMonitorDialog.5=\ -- giá trị From 614d2a0f38d059ab0992715c5f69f79646fd9514 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:35:50 +0100 Subject: [PATCH 0810/1620] New translations utf8_orig_Messages_vi.properties (Portuguese) --- .../earth/app/view/Messages_pt.properties | 468 ++++++++---------- 1 file changed, 217 insertions(+), 251 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 5199a9b624..353fe0d367 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,255 +1,221 @@ -AboutDialog.19=UN problème est apparu -AboutDialog.5=Pour plus d’infos, visitez notre site web OpenForis.org -AboutDialog.6=Désolé, il y a eu un problème lors de l’ouverture du lien avec votre navigateur par défaut. +AboutDialog.19=Äã có lá»—i +AboutDialog.5=Truy cập website cá»§a chúng tôi để biết thêm thông tin OpenForis.org +AboutDialog.6=Xin lá»—i, đã có sá»± cố khi mở link trong brower chuẩn trong hệ thống cá»§a bạn. AboutDialog.8=Ok -AspectCode.0=Nord -AspectCode.1=Nord-Est -AspectCode.2=Est -AspectCode.3=Sud-Est -AspectCode.4=Sud -AspectCode.5=Sud-Ouest -AspectCode.6=Ouest -AspectCode.7=Nord-Ouest -CollectEarthMenu.0=Importe le fichier .CEP -CollectEarthMenu.2=Utilitaires -CollectEarthMenu.3=Divise un large tableau CSV en plusieurs parties -CollectEarthMenu.4=Exporte les données en XML (à partir d'une date précise jusqu'à aujourd'hui) -CollectEarthMenu.5=Exporte sur la sauvegarde Collect Backup -CollectEarthMenu.6=Exporte les données en tant que sauvegarde Collect Backup (toutes les données) -CollectEarthMenu.7=Exporte les données en tant que sauvegarde Collect Backup (à partir de) -CollectEarthMenu.8=Exporte les données en XML (filtrer par attribut) -CollectEarthWindow.0=Erreur pendant l'exportation des données en csv -CollectEarthWindow.10=Fichier -CollectEarthWindow.11=Quitter -CollectEarthWindow.12=Outils -CollectEarthWindow.13=Télécharger les données en CSV (Excel) -CollectEarthWindow.14=Démarrer l'analyse avec Saïku -CollectEarthWindow.15=Propriétés -CollectEarthWindow.16=Aide -CollectEarthWindow.17=Avertissement -CollectEarthWindow.18=Trouver les placettes manquantes dans la base de données +AspectCode.0=Bắc +AspectCode.1=Äông-Bắc +AspectCode.2=Äông +AspectCode.3=Äông-Nam +AspectCode.4=Nam +AspectCode.5=Tây-Nam +AspectCode.6=Tây +AspectCode.7=Tây-Bắc +CollectEarthWindow.0=Lá»—i khi xuất dữ liệu sang file CSV +CollectEarthWindow.1=Lá»—i xuất dữ liệu +CollectEarthWindow.10=File +CollectEarthWindow.11=Thoát +CollectEarthWindow.12=Công cụ +CollectEarthWindow.13=Xuất dữ liệu ra CSV +CollectEarthWindow.14=Khởi động SAIKU Analysis +CollectEarthWindow.15=Thuá»™c tính +CollectEarthWindow.16=Trợ giúp +CollectEarthWindow.17=Thông tin công bố +CollectEarthWindow.18=Tìm ô thiếu trong cÆ¡ sở dữ liệu CollectEarthWindow.19=Collect Earth -CollectEarthWindow.1=Erreur d'exportation -CollectEarthWindow.20=Nombre d'enregistrements dupliqués -CollectEarthWindow.21=Icône non trouvée -CollectEarthWindow.22= Êtes-vous sûr de vouloir fermer CollectEarth
Fermer cette fenêtre fermera aussi le serveur -CollectEarthWindow.23=Confirmation requise -CollectEarthWindow.24=Exporter en XML -CollectEarthWindow.25=Voulez-vous ajouter tout de même ces données et perdre vos enregistrements? -CollectEarthWindow.26=Utilisateur -CollectEarthWindow.27=Appliquer -CollectEarthWindow.28=Le serveur devrait être démarré pour la saisie des données par les utilisateurs. -CollectEarthWindow.29=Le serveur Saiku n'est pas configuré. -CollectEarthWindow.2=Langue -CollectEarthWindow.30=Veuillez garder cette fenêtre active pendant que vous utilisez Google Earth -CollectEarthWindow.31=Exporter les données collectées en CSV -CollectEarthWindow.32=Fermer -CollectEarthWindow.33=Le nom de l'utilisateur doit comprendre entre 5 et 50 caractères -CollectEarthWindow.34=Erreur de validation -CollectEarthWindow.35= NOM DE L'UTILISATEUR VIDE\!
Veuillez renseigner le champs et Appuyer sur "Mise à jour" -CollectEarthWindow.36=Le nom de l'utilisateur ne peut pas être vide -CollectEarthWindow.37=Laisser ouvert -CollectEarthWindow.38=Fichiers CSV -CollectEarthWindow.39=NOTE \: Il est conseillé de sauvegarder vos données (export en XML) avant d'importer de nouvelles données -CollectEarthWindow.3=\ Erreur pendant l'importation -CollectEarthWindow.40=Renseigner le chemin jusqu'au serveur Saiku dans /Outils/Propriétés/Avancé. -CollectEarthWindow.41=Sauvegarde des données exportées dans le fichier\: -CollectEarthWindow.42=Quitter -CollectEarthWindow.43=Enregistrements conflictuels trouvés -CollectEarthWindow.44=Importer/Exporter les données -CollectEarthWindow.45=Exporter les données en XML (zippé) -CollectEarthWindow.46=Importer de nouvelles données depuis ZIP (XML zippé) -CollectEarthWindow.47=Le serveur Saiku n'est pas configuré -CollectEarthWindow.48=Fichier zip/collect-data -CollectEarthWindow.49=Fusion des fichiers CSV -CollectEarthWindow.4=Clause de non-responsabilité de la FAO -CollectEarthWindow.50=Ouvrir le manuel utilisateur -CollectEarthWindow.51=Vérifier les mises à jour des Collect Earth -CollectEarthWindow.52=Fichier de logs Open Application -CollectEarthWindow.53=Fichier de logs Collect Earth -CollectEarthWindow.54=Charger les points de KML -CollectEarthWindow.55=Mettre à jour les enregistrements en utilisant un fichier CSV -CollectEarthWindow.56=A propos... -CollectEarthWindow.57=Le processus de démarrage de Saïku est en cours, veuillez patienter -CollectEarthWindow.58=Impossible de démarrer l'analyse avec Saïku -CollectEarthWindow.59=Voulez-vous régénérer le jeu de données?
Cela peut prendre du temps.
Cliquer sur oui pour régénérer un nouveau jeu de données avec les dernières informations -CollectEarthWindow.5=Fermer -CollectEarthWindow.60=Génération des données Saïku -CollectEarthWindow.61=Exporter en XML (uniquement les enregistrements modifiés/ajoutés) -CollectEarthWindow.62=A propos… -CollectEarthWindow.63=Erreur en accédant aux points de KML -CollectEarthWindow.64=Assistance technique -CollectEarthWindow.65=Le nom de l'opérateur a été changé -CollectEarthWindow.66=Nom de l'opérateur -CollectEarthWindow.67=Ouvrir le dossier de données de CE -CollectEarthWindow.6=Exporter en Table de Fusion -CollectEarthWindow.70=Ouvrez le manuel de cette enquête -CollectEarthWindow.71=Générer un outil Saiku autonome -CollectEarthWindow.7=Erreur pendant l'importation des données -CollectEarthWindow.8=Le texte est introuvable -CollectEarthWindow.9=Les données importées contiennent des redondances avec celles présentes dans la base -DynamicsCode.0= Terre Forestière initialement -DynamicsCode.1= Prairie initialement -DynamicsCode.2= Etablissement initialement -DynamicsCode.3= Autre terre initialement -DynamicsCode.4= Terre humide initialement -DynamicsCode.5= Terre cultivée initialement -EarthApp.11=Collect Earth est déjà en cours d’exécution -EarthApp.21=Le fichier CSV/CED contenant les points est introuvable \:
-EarthApp.23=Aucun fichier CSV/CED spécifié \:

-EarthApp.24=Le fichier contenant le modèle de définition KML est introuvable \:
-EarthApp.26=Aucun modèle de définition spécifié\:

-EarthApp.27=Le fichier contenant le ballon HTML est introuvable \:
-EarthApp.29=Aucun ballon HTML spécifié \:

-EarthApp.30=Veuillez corriger le chemin d’accès dans le menu Outils -> Propriétés. -EarthApp.3=Rappelez le moi plus tard -EarthApp.4=Mettre a jour maintenant -EarthApp.57= Une nouvelle version de Collect Earth est disponible\! Utiliser le Menu -EarthApp.58=Alerte de mise à jour -EarthApp.59=Erreur pendant l’importation du fichier -EarthApp.5=Ne me le rappelez plus -EarthApp.61=Le fichier Collect Earth est introuvable br/>Veuillez-vous assurer que Google Earth est installé. -EarthApp.6=\ - Version -EarthApp.70=AVERTISSMENT -EarthApp.71=Sous Mac OS X, les fichiers de projet Collect Earth (* .cep) ne s'ouvriront pas dans Collect Earth lorsqu'ils sont double-cliqués.
-EarthApp.72=Utilisez la barre d'outils Collect Earth pour ouvrir les fichiers .cep \: -EarthApp.73=Collect Earth - problèmes sur les ordinateurs Mac OS X -EarthSurveyService.9=Champs requis -ExportActionListener.1=Choisir la date pour les données à exporter -ExportDialogProcessMonitor.0=Chargement des données... -ExportDialogProcessMonitor.1=Attente d'initialisation de l'export -ExportDialogProcessMonitor.4=Enregistrements exportés \: -ImportActionListener.0=Est-ce que les données pour les placettes qui ne sont pas complètes doivent être importées ? -ImportActionListener.2=Si vous cliquez sur NO, seulement les données provenant des placettes avec la marque « verte », qui contiennent toutes les données, seront importées -ImportActionListener.3=Importer les enregistrements incomplets -ImportDialogProcessMonitor.0=Calcul en cours -ImportDialogProcessMonitor.11=Nombre initial d' enregistrements \: -ImportDialogProcessMonitor.2=Chargement des enregistrements... -ImportDialogProcessMonitor.5=Nombre réel d'enregistrements importés\: -ImportDialogProcessMonitor.8=Chargement des données... -ImportProcessMonitorDialog.0=Enregistrements importés \: -ImportXMLDialogProcessMonitor.1 = Écraser les données dans la base de données -ImportXMLDialogProcessMonitor.2 = Importer uniquement des enregistrements non conflictuels -InfiniteProgressMonitor.0=Annuler l’opération -JFileChooserExistsAware.0=Fichier projet Collect Earth -KmlImportService.13=Sélectionnez un fichier CSV pour enregistrer les emplacements des parcelles -MissingPlotsListener.0=Erreur au cours de l’enregistrement des placettes absentes de la base de données -MissingPlotsListener.10=Nombre total de parcelles dans le plan d'échantillonnage \: -MissingPlotsListener.12=Nombre de parcelles manquantes \: -MissingPlotsListener.14=Toutes les parcelles sont remplis\! -MissingPlotsListener.1=Placettes manquantes -MissingPlotsListener.2=Copier le contenu sur le clipboard -MissingPlotsListener.3=Choisir les fichiers qui contiennent les informations des placettes (.csv ou .ced) pour lesquelles vous voulez savoir si toues les placettes ont été renseignées -MissingPlotsListener.4=Placettes manquantes – Information -MissingPlotsListener.5=Depuis le fichier \: -MissingPlotsListener.6=Exporter en CED -NO=Non -NO_TO_ALL=Non à tous -OpenTextFileListener.0=Le fichier texte n'a pas été trouvé dans \: -OptionWizard.0=Options Collect Earth -OptionWizard.100=Ouvrir Planet -OptionWizard.101=Clé API Planet -OptionWizard.1021=URL SecureWatch -OptionWizard.102=Ouvrir Maxar SecureWatch -OptionWizard.103=Définir le URL pour le Carte Extra (ouvre quand il est réglé) \: -OptionWizard.104=Navigateurs -OptionWizard.105=Ouvrir Earth Map -OptionWizard.110=Utiliser les images mensuelles fournies par NICFI -OptionWizard.10=Montrer les fichiers de sauvegarde -OptionWizard.11=Inconnu \: utiliser ifconfig -OptionWizard.12=Instance client -OptionWizard.13=IP Serveur de Collect Earth -OptionWizard.14=Port Serveur de Collect Earth (e.g. 8023) -OptionWizard.15=Appliquer et sauvegarder les changements +CollectEarthWindow.2=Ngôn ngữ +CollectEarthWindow.20=Số bản ghi trùng\: +CollectEarthWindow.21=Không tìm thấy biểu tượng cho khung chính +CollectEarthWindow.22=Bạn có chắc là muốn đóng Collect Earth?
Äóng cá»­a sổ cÅ©ng đóng luôn máy chá»§ Collect Earth +CollectEarthWindow.23=Cần khẳng định +CollectEarthWindow.24=Xuất ra XML +CollectEarthWindow.25=Bạn có muốn thêm các bản ghi này và bá» Ä‘i dữ liệu hiện thá»i không? +CollectEarthWindow.26=Ngưá»i sá»­ dụng +CollectEarthWindow.27=Cập nhật +CollectEarthWindow.28=Máy chá»§ Open Foris Collect Earth phải chạy khi ngưá»i sá»­ dụng giải Ä‘oán dữ liệu. +CollectEarthWindow.29=Chưa xác định cấu hình cho Máy chá»§ Saiku. +CollectEarthWindow.3=\ Lá»—i nhập +CollectEarthWindow.30=Äể mở cá»­a sổ này khi Ä‘ang sá»­ dụng Google Earth. +CollectEarthWindow.31=Xuất dữ liệu đã thu thập sang file CSV +CollectEarthWindow.32=Thoát +CollectEarthWindow.33=Tên ngưá»i sá»­ dụng phải dài hÆ¡n 5 chữ cái và ngắn hÆ¡n 50 chữ cái +CollectEarthWindow.34=Lá»—i kiểm chứng +CollectEarthWindow.35=TÊN NGƯỜI SỬ DỤNG CÃ’N TRá»NG\!
Hãy Ä‘iá»n tên ngưá»i sá»­ dụng và nhắp phím "Update". +CollectEarthWindow.36=Không được để trống phần tên ngưá»i sá»­ dụng +CollectEarthWindow.37=Äể mở +CollectEarthWindow.38=file CSV +CollectEarthWindow.39=THÔNG BÃO\: Nên lưu dá»± phòng dữ liệu hiện thá»i(Xuất ra XML) trước khi nhập dữ liệu má»›i +CollectEarthWindow.4=Thông tin công bố cá»§a FAO +CollectEarthWindow.40=Thiết lập đưá»ng dẫn tá»›i thư mục cài đặt Saiku Server trong Tools->Properties->Advanced tab. +CollectEarthWindow.41=Ghi dữ liệu xuất ra vào file\: +CollectEarthWindow.42=Thoát +CollectEarthWindow.43=Tìm thấy bản ghi có mâu thuẫn +CollectEarthWindow.44=Nhập/Xuất dữ liệu +CollectEarthWindow.45=Xuất dữ liệu ra XML (nén) +CollectEarthWindow.46=Nhập dữ liệu má»›i từ file ZIP (XML nén) +CollectEarthWindow.55=Cập nhật các bản ghi hiện thá»i bằng CSV +CollectEarthWindow.47=Chưa định cấu hình cho Saiku Server +CollectEarthWindow.48=ZIP files +CollectEarthWindow.49=Files CSV tổng hợp +CollectEarthWindow.5=Äóng +CollectEarthWindow.50=Mở hướng dẫn ngưá»i sá»­ dụng +CollectEarthWindow.51=Kiểm tra cập nhật cá»§a Collect Earth +CollectEarthWindow.52=Mở file nhật ký ứng dụng +CollectEarthWindow.53=File nhật ký cá»§a Collect Earth +CollectEarthWindow.54=Nạp các Ä‘iểm từ KML +CollectEarthWindow.56=Vá»... +CollectEarthWindow.57=Äang chạy quá trình khởi động Saiku, xin đợi. +CollectEarthWindow.58=Không thể khởi động Saiku analysis +CollectEarthWindow.59=Bạn có muốn tạo lại bá»™ dữ liệu cho Saiku analysis không?
Quá trình này sẽ mất một vài phút.
Nếu bạn chá»n "YES" sẽ tạo ra má»™t bá»™ dữ liệu má»›i vá»›i các thông tin cập nhật nhất. +CollectEarthWindow.6=Xuất ra bảng tổng hợp +CollectEarthWindow.60=Tạo dữ liệu Saiku +CollectEarthWindow.61=Xuất dữ liệu ra XML (các bản ghi chỉnh sá»­a từ lần xuất trước) +CollectEarthWindow.62=Vá»... +CollectEarthWindow.63=Lá»—i khi nạp Ä‘iểm từ KML +CollectEarthWindow.64=Há»— trợ kỹ thuật +CollectEarthWindow.7=Lá»—i khi nhập dữ liệu +CollectEarthWindow.8=Không tìm thấy văn bản thông báo +CollectEarthWindow.9=Dữ liệu nhập vào có chứa các bản ghi đã có trong cÆ¡ sở dữ liệu cá»§a bạn. +DynamicsCode.0=Ban đầu là rừng +DynamicsCode.1=Ban đầu là trảng cá» +DynamicsCode.2=Ban đầu là khu dân cư +DynamicsCode.3=Ban đầu là đất khác +DynamicsCode.4=Ban đầu là đất ngập nước +DynamicsCode.5=Ban đầu là đất trồng trá»t +OpenTextFileListener.0=không tìm thấy file văn bản tại\: +OptionWizard.0=Các lá»±a chá»n cá»§a Collect Earth +OptionWizard.1=Chá»n Browser +OptionWizard.10=Mở thư mục lưu dá»± phòng +OptionWizard.11=Không biết\: hãy sá»­ dụng ifconfig +OptionWizard.12=Vi dụ cá»§a khác +OptionWizard.13=Äịa chỉ IP cá»§a máy chá»§ Collect Earth +OptionWizard.14=Cổng máy chá»§ Collect Earth (vd\: 8023) +OptionWizard.15=Ghi và áo dụng thay đổi OptionWizard.16=ID -OptionWizard.17=Coord-X -OptionWizard.18=Coord-Y -OptionWizard.19=Altitude -OptionWizard.1=Choisir un navigateur -OptionWizard.20= Le contenu de Google Earth a changé
Veuillez accepter la mise à jour quand GE le demande -OptionWizard.21=Mise à jour réussie -OptionWizard.22=Pente -OptionWizard.23=Il y a eu une erreur pendant la réouverture de Google Earth -OptionWizard.24=Annuler -OptionWizard.25=Mode opération -OptionWizard.26=Hôte pour la BDD -OptionWizard.27=Le dossier n'est pas valide (il manque le fichier start-saiku.bat) -OptionWizard.28=Le dossier Saiku n'est pas reconnu -OptionWizard.29=Port pour la BDD -OptionWizard.2=Flux (serveur/client) -OptionWizard.30=Options SQLite -OptionWizard.31=Points d'échantillonnage -OptionWizard.32=Configuration de la parcelle -OptionWizard.33=Définition de l'enquête -OptionWizard.34=Services intégrés -OptionWizard.35=Nombre de points de contrôle -OptionWizard.36=Distance entre les points de contrôle (en mètres) -OptionWizard.37=Distance au bord de la parcelle (en mètres) -OptionWizard.38=Le Fichier CSV/CED ne peut pas être lu
Le fichier devrait avoir des valeurs séparées par des virgules comme ceci \:
-OptionWizard.39=ID,Coordonnée_Y, Coordonnée_X,altitude,pente,orientation -OptionWizard.3=Instance serveur -OptionWizard.40=Projets -OptionWizard.41=Charger un nouveau fichier projet -OptionWizard.42=Erreur pendant la fermeture du lecteur CSV -OptionWizard.43=Nom de l'enquête -OptionWizard.44=Sauvegarder automatiquement la base dans -OptionWizard.45=Ouvrir Earth Engine Playground (obsolète) -OptionWizard.46=Ouvrir le Timelapse de Google Earth Engine -OptionWizard.47=Ouvrir Bing Maps -OptionWizard.48=Ouvrir le formulaire dans un navigateur plutôt que dans GE (recommandé pour Linux) -OptionWizard.49=Chemin jusqu'au fichier ced/csv avec les données des parcelles -OptionWizard.4=IP actuelle de l'ordinateur -OptionWizard.50=Parcourir -OptionWizard.51=Erreur pendant l'importation du fichier -OptionWizard.52=Fichier CSV/CED uniquement avec des coordonnées -OptionWizard.53=Pas de points -OptionWizard.54=Point central -OptionWizard.55=Erreur pendant l'importation du dossier projet -OptionWizard.56=Charger le projet -OptionWizard.57=Projets chargés précedemment -OptionWizard.58=Ouvrir GEE Code Editor (nécessite un accès restreint Trusted Tester) -OptionWizard.59=Ouvrir Here Maps -OptionWizard.5=Port Serveur Collect Earth \: -OptionWizard.65=Chemin jusqu'au serveur Saiku -OptionWizard.66=Parcourir -OptionWizard.67=Chemin jusqu'à Firefox -OptionWizard.68=Parcourir -OptionWizard.6=Paramètres de la BD PostGreSQL -OptionWizard.70=Fichiers exécutables -OptionWizard.72=Fichiers binaires -OptionWizard.73=Chemin jusqu'à Chrome -OptionWizard.74=Parcourir -OptionWizard.76=Fichiers exécutables -OptionWizard.78=Fichiers binaires -OptionWizard.79=Chemin jusqu'au modèle Freemarker KML -OptionWizard.7=Nom d'utilisateur -OptionWizard.80=Parcourir -OptionWizard.82=Modèle Freemarker -OptionWizard.83=Chemin jusqu'au Ballon HTML -OptionWizard.84=Parcourir -OptionWizard.86=Page web HTML -OptionWizard.87=Chemin jusqu'au fichier XML contenant la définition IDM -OptionWizard.88=Parcourir -OptionWizard.8=Mot de passe -OptionWizard.90=Définition IDM XML -OptionWizard.91=Serveur (version gestionnaire ou autonome) -OptionWizard.92=Client (opérateur/connecté au serveur) -OptionWizard.93=SQLite (Fichier intégré / Unique) +OptionWizard.17=Tá»a độ X +OptionWizard.18=Tá»a độ Y +OptionWizard.19=Äá»™ cao +OptionWizard.2=Dòng công tác (máy chá»§/khách) +OptionWizard.20=Ná»™i dung cá»§a Google Earth đã thay đổi.
Äá» nghị chấp nhận tải lại ná»™i dung khi Google Earth gợi ý. +OptionWizard.21=Cập nhật thành công +OptionWizard.22=Dốc +OptionWizard.23=Có lá»—i khi mở lại dữ liệu Google Earth +OptionWizard.24=Há»§y +OptionWizard.25=Mode vận hành +OptionWizard.26=NÆ¡i lưu cÆ¡ sở dữ liệu +OptionWizard.27=Äây không phải là thư mục Saiku (hiện không có file start-saiku.bat) +OptionWizard.28=Không nhận được máy chá»§ Saiku +OptionWizard.29=Cổng cÆ¡ sở dữ liệu +OptionWizard.3=Ví dụ cá»§a máy chá»§ +OptionWizard.30=Các lá»±a chá»n cá»§a SQLite +OptionWizard.31=Dữ liệu mẫu +OptionWizard.32=SÆ¡ đồ mẫu +OptionWizard.33=Äịnh nghÄ©a khảo sát +OptionWizard.34=Nâng cao +OptionWizard.35=Số Ä‘iểm mẫu +OptionWizard.36=Khoảng cách giữa các Ä‘iểm mẫu (tính theo mét) +OptionWizard.37=Lá» vá»›i biên ô (tính theo mét) +OptionWizard.38=Không Ä‘á»c được đúng file CSV/CED.
Cần có dấu phảy để phân tách giá trị giống như sau \:
+OptionWizard.39=ID,Tá»a độ Y,tá»a độ X,độ cao,độ dốc,tá»· lệ +OptionWizard.4=Äịa chỉ IP hiện tại cá»§a máy tính\: +OptionWizard.40=Các project +OptionWizard.41=tải file project má»›i +OptionWizard.42=Lá»—i khi đóng CSV reader +OptionWizard.43=Tên khảo sát +OptionWizard.44=tá»± động lưu dá»± phòng dữ liệu tại +OptionWizard.45=Mở Earth Engine để phóng to vào khu vá»±c ô +OptionWizard.46=Mở Earth Engine timelapse cho khu vá»±c ô +OptionWizard.47=Mở Bing Maps cho khu vá»±c ô +OptionWizard.48=Mở form trên browser thay vì mở Google Earth (khuyến cáo cho LINUX) +OptionWizard.49=ÄÆ°á»ng dẫn tá»›i file ced/csv file vá»›i dữ liệu ô +OptionWizard.5=Cổng máy chá»§ Collect Earth\: +OptionWizard.50=Browse... +OptionWizard.51=Lá»—i nhập file project +OptionWizard.52=File CSV/CED chỉ có tá»a độ +OptionWizard.53=Ô vuông +OptionWizard.54=Äiểm trung tâm +OptionWizard.55=Lá»—i khi nhập thư mục project +OptionWizard.56=Tải project +OptionWizard.57=Các project đã tải +OptionWizard.58=Mở GEE Code Editor (cần phải có quyá»n truy cập Trusted Tester) +OptionWizard.59=Mở Here Maps tập trung vào ô +OptionWizard.6=Các thông số cá»§a CSDL PostgreSQL +OptionWizard.65=ÄÆ°á»ng dẫn tá»›i thư mục Saiku +OptionWizard.66=Browse... +OptionWizard.67=ÄÆ°á»ng dẫn tá»›i Firefox executable (file exe) +OptionWizard.68=Browse... +OptionWizard.7=Tên ngưá»i sá»­ dụng +OptionWizard.70=File chạy +OptionWizard.72=File nhị phân +OptionWizard.73=ÄÆ°á»ng dẫn tá»›i Chrome executable (file exe) +OptionWizard.74=Browse... +OptionWizard.76=File exe +OptionWizard.78=File nhị phân +OptionWizard.79=ÄÆ°á»ng dẫn tá»›i KML Freemarker template +OptionWizard.8=Mật khẩu +OptionWizard.80=Browse... +OptionWizard.82=Freemarker template +OptionWizard.83=ÄÆ°á»ng dẫn tá»›i mẫu thiết kế HTML Balloon +OptionWizard.84=Browse... +OptionWizard.86=HTML webpage +OptionWizard.87=ÄÆ°á»ng dẫn tá»›i XML vá»›i định nghÄ©a IDM +OptionWizard.88=Browse... +OptionWizard.9=Tên CSDL +OptionWizard.90=Äịnh nghÄ©a XML IDM +OptionWizard.91=Máy chá»§ (phiên bản quản lý hoặc sá»­ dụng độc lập) +OptionWizard.92=Khách (ngưá»i sá»­ dụng/kết nối vá»›i máy chá»§) +OptionWizard.93=SQLite (tích hợp/file đơn lẻ) OptionWizard.94=PostgreSQL -OptionWizard.95=Côté des points d'échantillonnage (en mètres) -OptionWizard.9=Nom de la base -ProcessMonitorDialog.1=Erreur d’interprétation sur numéro de rangée -ProcessMonitorDialog.4=, colonnes -ProcessMonitorDialog.5=\ -- valeures -SaikuAnalysisListener.0=Oui - Rafraichir les données Saiku (processus long) -SaikuAnalysisListener.1=Non - Utiliser la même version des données que la dernière fois que Saiku a été utilisé -SaikuToolExportListener.1=Génération de l'outil Saiku -SaikuToolExportListener.2=Génération de l'outil Saiku avec la base de données actuelle -SaikuStarter.1=Démarrer Saïku -SaikuStarter.2=Démarrer Saïku peut prendre plusieurs minutes, veuillez patienter\! -SaveEarthDataServlet.0=Requête vide -SaveEarthDataServlet.1=Problème lors de la sauvegarde de la base de données -SaveEarthDataServlet.2=Les données ont été sauvées -SlopeCode.0=Plan (0-5) -YES=Oui -YES_TO_ALL=Oui à tous \ No newline at end of file +SaikuAnalysisListener.0=Yes - Làm má»›i lại dữ liệu Saiku (quá trình dài) +SaikuAnalysisListener.1=No - chỉ khởi động Saiku +SaikuStarter.1=Khởi động Saiku +SaikuStarter.2=Cần vài phút để khởi động Saiku, xin đợi\! +SaveEarthDataServlet.0=Yêu cầu trống +SaveEarthDataServlet.1=Có trục trặc khi ghi dữ liệu vào CSDL +SaveEarthDataServlet.2=Dữ liệu đã được ghi +SlopeCode.0=Bằng phẳng (0-5) +EarthApp.11=Collect Earth Ä‘ang chạy +EarthApp.21=Không tìm thấy file chứa lưới ô trong đưá»ng dẫn đã chá»n \:
+EarthApp.23=Chưa thiết lập file CSV/CED \:

+EarthApp.24=Không tìm thấy file chứa Freemarker template vá»›i định nghÄ©a KML trong đưá»ng dẫn đã chá»n\:
+EarthApp.26=Chưa thiết lập file định nghĩa KML d\:

+EarthApp.27=Không tìm thấy file chứa mẫu HTML balloon trong đưá»ng dẫn đã chá»n\:
+EarthApp.29=Chưa thiết lập file HTML balloon \:

+EarthApp.3=Nhắc nhở sau +EarthApp.30=Xin hãy Ä‘iá»u chỉnh đúng địa chỉ file trong Tools->Properties menu. +EarthApp.4=Cập nhật luôn +EarthApp.5=Không nhắc nữa +EarthApp.57=Äã có phiên bản má»›i cá»§a Collect Earth\!
Bạn muốn làm tiếp như thế nào? +EarthApp.58=Thông báo cập nhật +EarthApp.59=Lỗi khi nhập file project +EarthApp.6=\ - Phiên bản +EarthApp.61=Không mở được file Collect Earth.
Äá» nghị đảm bảo đã cài đặt Google Earth. +EarthSurveyService.9=Trưá»ng bắt buá»™c +ExportActionListener.1=Chá»n ngày xuất bản ghi +ExportDialogProcessMonitor.0=Äang xá»­ lý dữ liệu... +ExportDialogProcessMonitor.1=Äang đợi khởi động quá trình\: +ExportDialogProcessMonitor.4=Các bản ghi đã xuất\: +ImportProcessMonitorDialog.0=Các bản ghi đã nhập\: +ImportActionListener.0=Có nhập dữ liệu các ô chưa được Ä‘iá»n đầy đủ không? +ImportActionListener.2=Nếu bạn chá»n NO sẽ chỉ nhập dữ liệu cá»§a các ô có trạng thái màu "xanh lá cây", các ô đã có đầy đủ dữ liệu. +ImportActionListener.3=Nhập các bản ghi chưa hoàn tất +ImportDialogProcessMonitor.0=\ ÄANG TÃNH TOÃN +ImportDialogProcessMonitor.11=Số lượng ban đầu các bản ghi\: +ImportDialogProcessMonitor.2=Äang nhập các bản ghi... +ImportDialogProcessMonitor.5=Số lượng thá»±c tế các bản ghi đã nhập\: +ImportDialogProcessMonitor.8=Äang xá»­ lý dữ liệu... +InfiniteProgressMonitor.0=Há»§y lệnh +JFileChooserExistsAware.0=File project cá»§a Collect Earth +KmlImportService.13=Chá»n file CSV file để ghi địa Ä‘iểm cá»§a ô vào +MissingPlotsListener.0=Lá»—i khi lấy thông tin vỠô không có trong CSDL +MissingPlotsListener.1=Các ô thiếu +MissingPlotsListener.10=Tổng số ô trong thiết kế chá»n mẫu \: +MissingPlotsListener.12=Số ô thiếu\: +MissingPlotsListener.14=Äã Ä‘iá»n tất cả các ô\! +MissingPlotsListener.2=Sao chép ná»™i dung vào bàn phím +MissingPlotsListener.3=Lá»±a chá»n file có chứa thông tin ô ( file .csv hoặc .ced ) mà bạn muốn biết đã Ä‘iá»n đủ dữ liệu chưa. +MissingPlotsListener.4=Các ô thiếu - thông tin +MissingPlotsListener.5=Từ file \: +MissingPlotsListener.6=Xuất ra file CED +ProcessMonitorDialog.1=Tìm lá»—i trên số dòng +ProcessMonitorDialog.4=, cá»™t +ProcessMonitorDialog.5=\ -- giá trị From 7db61db2dc211646fdaf809383e4df3a5901bdc6 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 12:35:51 +0100 Subject: [PATCH 0811/1620] New translations utf8_orig_Messages_vi.properties (English) --- .../earth/app/view/Messages_en.properties | 446 +++++++++--------- 1 file changed, 221 insertions(+), 225 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index f0355142d0..353fe0d367 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,225 +1,221 @@ -AboutDialog.19=कोई समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ -AboutDialog.5=अधिक जानकारी के लिठहमारी वेबसाइट पर जाà¤? OpenForis.org? -AboutDialog.6=कà¥à¤·à¤®à¤¾ करें, à¤à¤• समसà¥à¤¯à¤¾ आपके सिसà¥à¤Ÿà¤® के मानक बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में इस लिंक को खोलने की कोशिश कर रही है. -AboutDialog.8=ठीक -AspectCode.0=उतà¥à¤¤à¤° दिशा -AspectCode.1=उतà¥à¤¤à¤°-पूरà¥à¤µ दिशा -AspectCode.2=पूरà¥à¤µ दिशा -AspectCode.3=दकà¥à¤·à¤¿à¤£-पूरà¥à¤µ दिशा -AspectCode.4=दकà¥à¤·à¤¿à¤£ दिशा -AspectCode.5=दकà¥à¤·à¤¿à¤£-पशà¥à¤šà¤¿à¤® दिशा -AspectCode.6=पशà¥à¤šà¤¿à¤® दिशा -AspectCode.7=उतà¥à¤¤à¤°-पशà¥à¤šà¤¿à¤® दिशा -CollectEarthWindow.0=तà¥à¤°à¥à¤Ÿà¤¿ जब सीà¤à¤¸à¤µà¥€ फ़ाइल में डेटा निरà¥à¤¯à¤¾à¤¤ करने का पà¥à¤°à¤¯à¤¾à¤¸ -CollectEarthWindow.1=निरà¥à¤¯à¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.10=फ़ाइल -CollectEarthWindow.11=बाहर जाà¤à¤‚ -CollectEarthWindow.12=उपकरण -CollectEarthWindow.13=डेटा सीà¤à¤¸à¤µà¥€ निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.14=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ -CollectEarthWindow.15=गà¥à¤£ -CollectEarthWindow.16=मदद -CollectEarthWindow.17=असà¥à¤µà¥€à¤•रण -CollectEarthWindow.18=डेटाबेस में लापता भूखंडों खोजें -CollectEarthWindow.19=पृथà¥à¤µà¥€ इकटà¥à¤ à¤¾ -CollectEarthWindow.2=भाषा -CollectEarthWindow.20=डà¥à¤ªà¥à¤²à¤¿à¤•ेट रिकॉरà¥à¤¡ की संखà¥à¤¯à¤¾\: -CollectEarthWindow.21=मà¥à¤–à¥à¤¯ फà¥à¤°à¥‡à¤® के लिठआइकन नहीं मिल सकता है -CollectEarthWindow.22=आपको लगता है कि आप à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ बंद करना चाहते हैं? विंडोज बंद करने से, à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° बंद हो जाà¤à¤—ा -CollectEarthWindow.23=पà¥à¤·à¥à¤Ÿà¤¿ की जरूरत है -CollectEarthWindow.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.25=आप वैसे भी इन अभिलेखों को जोड़ना चाहते हैं और अपने वरà¥à¤¤à¤®à¤¾à¤¨ डेटा खोने के लिठकिलक करना चाहते हैं? -CollectEarthWindow.26=ऑपरेटर,पà¥à¤°à¤šà¤¾à¤²à¤• -CollectEarthWindow.27=अदà¥à¤¯à¤¤à¤¨ -CollectEarthWindow.28= औपन फौरिस à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° चल रहा होना चाहिठ, जबभी ऑपरेटर डेटा की वà¥à¤¯à¤¾à¤–à¥à¤¯à¤¾ करें . -CollectEarthWindow.29=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. -CollectEarthWindow.3= आयात संबंधी तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.30=जबभी आप गà¥à¤—ल अरà¥à¤¥ का उपयोग कर रहे हैं, कृपया इस विंडोज को खà¥à¤²à¥€ बनाठरखें. -CollectEarthWindow.31=à¤à¤•तà¥à¤° डेटा सीà¤à¤¸à¤µà¥€ फाइल में भेजें -CollectEarthWindow.32=छोड़ना -CollectEarthWindow.33=ऑपरेटर का नाम के 5 अकà¥à¤·à¤° से बड़ा और 50 अकà¥à¤·à¤° से कम होना चाहिठ-CollectEarthWindow.34=मानà¥à¤¯à¤¤à¤¾ तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.35=ऑपरेटर नाम खाली\!
कृपया ऑपरेटर का नाम भरें और "अदà¥à¤¯à¤¤à¤¨" बटन दबाà¤à¤. -CollectEarthWindow.36=ऑपरेटर नाम रिकà¥à¤¤ नहीं हो सकता -CollectEarthWindow.37=खà¥à¤²à¤¾ रखो -CollectEarthWindow.38=सीà¤à¤¸à¤µà¥€ फ़ाइल -CollectEarthWindow.39=सूचना\: यह सलाह दी जाती है कि आप नठडेटा डालने करने से पहले अपने मौजूदा आंकडों को बैकअप(à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤) कर लें -CollectEarthWindow.4=à¤à¤«à¤à¤“ असà¥à¤µà¥€à¤•रण नोटिस -CollectEarthWindow.40=उस फ़ोलà¥à¤¡à¤° पर जाà¤à¤‚ जहां साà¤à¤•ॠसरà¥à¤µà¤° में सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ किया गया है, फ़ोलà¥à¤¡à¤° का रासà¥à¤¤à¤¾ उपकरण> गà¥à¤£> उनà¥à¤¨à¤¤ टैब. -CollectEarthWindow.41=निरà¥à¤¯à¤¾à¤¤ डेटा को फ़ाइल में बचाया जा रहा है \: -CollectEarthWindow.42=छोड़ना -CollectEarthWindow.43=परसà¥à¤ªà¤° विरोधी रिकॉरà¥à¤¡ पाया -CollectEarthWindow.44=डेटा आयात / निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.45=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ डेटा (संकà¥à¤šà¤¿à¤¤) -CollectEarthWindow.46=ज़िप से नठडेटा आयात करें (संकà¥à¤šà¤¿à¤¤ à¤à¤•à¥à¤¸à¤à¤®à¤à¤²) -CollectEarthWindow.55=सीà¤à¤¸à¤µà¥€ का उपयोग कर मौजूदा रिकॉरà¥à¤¡ को अपडेट करें -CollectEarthWindow.47=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. -CollectEarthWindow.48=ज़िप / à¤à¤•तà¥à¤°-डेटा फ़ाइल -CollectEarthWindow.49=फà¥à¤¯à¥‚जन सीà¤à¤¸à¤µà¥€ फ़ाइल -CollectEarthWindow.5=बंद करे -CollectEarthWindow.50= उपयोगकरà¥à¤¤à¤¾ मैनà¥à¤…ल खोलें -CollectEarthWindow.51=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ के अदà¥à¤¯à¤¤à¤¨ के लिठजाà¤à¤š करें -CollectEarthWindow.52= अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— लॉग फ़ाइल खोलें -CollectEarthWindow.53=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ लॉग फ़ाइल -CollectEarthWindow.54=केà¤à¤®à¤à¤² से लोड अंक -CollectEarthWindow.56=के विषय में... -CollectEarthWindow.57=साà¤à¤•ॠसà¥à¤Ÿà¤¾à¤°à¥à¤Ÿà¤° पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ अभी भी चल रहा है, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें. -CollectEarthWindow.58=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ नहीं कर सकते -CollectEarthWindow.59=आप साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ के लिठडेटा सेट फिर से उतà¥à¤ªà¤¨à¥à¤¨ करने के लिठकरना चाहते हैं?
यह पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ समय लेने वाली हो सकती है.
आप यदि "हाà¤"पर कà¥à¤²à¤¿à¤• करें, तो नवीनतम जानकारी के साथ à¤à¤• नया डाटासेट उतà¥à¤ªà¤¨à¥à¤¨ हो जाà¤à¤—ा. -CollectEarthWindow.6=फà¥à¤¯à¥‚जन टेबल के लिठनिरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.60=साà¤à¤•ॠडेटा उतà¥à¤ªà¤¨à¥à¤¨ -CollectEarthWindow.61=डेटा à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ (पिछले निरà¥à¤¯à¤¾à¤¤ के बाद से संशोधित रिकॉरà¥à¤¡) -CollectEarthWindow.62=के विषय मे... -CollectEarthWindow.63=केà¤à¤®à¤à¤² से अंक पà¥à¤°à¤¾à¤ªà¥à¤¤ करने में तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.64=तकनीकी सहायता -CollectEarthWindow.7=डेटा आयात में तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.8=असà¥à¤µà¥€à¤•रण पाठ नहीं पाया जा सका -CollectEarthWindow.9=डेटा आयात रिकॉरà¥à¤¡ वह है जो कि पहले से ही अपने डेटाबेस पर मौजूद हैं शामिल. -DynamicsCode.0=पà¥à¤°à¤¾à¤°à¤‚भ में वन -DynamicsCode.1=पà¥à¤°à¤¾à¤°à¤‚भ में घास का मैदान, -DynamicsCode.2=पà¥à¤°à¤¾à¤°à¤‚भ में आबादी वाला इलाका -DynamicsCode.3=पà¥à¤°à¤¾à¤°à¤‚भ में बंजर -DynamicsCode.4=पà¥à¤°à¤¾à¤°à¤‚भ में आरà¥à¤¦à¥à¤° भूमि -DynamicsCode.5=पà¥à¤°à¤¾à¤°à¤‚भ में खेत -OpenTextFileListener.0=इस पाठ का फ़ाइल नहीं मिला \: -OptionWizard.0= विकलà¥à¤ª -OptionWizard.1=बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° चà¥à¤¨à¥‡à¤‚ -OptionWizard.10=बैकअप फ़ोलà¥à¤¡à¤° खोलें -OptionWizard.11=अजà¥à¤žà¤¾à¤¤\: उपयोग ifconfig -OptionWizard.12=गà¥à¤°à¤¾à¤¹à¤•ों का उलà¥à¤²à¥‡à¤– -OptionWizard.13=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° आईपी -OptionWizard.14=कतà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ (उदाहरण- 8023) -OptionWizard.15=बचाà¤à¤‚ और परिवरà¥à¤¤à¤¨ लागू करें -OptionWizard.16=आईडी -OptionWizard.17=X- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क -OptionWizard.18=Y- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क -OptionWizard.19=उठान -OptionWizard.2=कारà¥à¤¯à¤ªà¥à¤°à¤µà¤¾à¤¹ (सरà¥à¤µà¤° / गà¥à¤°à¤¾à¤¹à¤•) -OptionWizard.20=गूगल अरà¥à¤¥ अंतरà¥à¤µà¤¸à¥à¤¤à¥ बदल दिया गया है
यदि गà¥à¤—ल अरà¥à¤¥ आप से कहे,अंतरà¥à¤µà¤¸à¥à¤¤à¥ पà¥à¤¨à¤ƒ लोड सà¥à¤µà¥€à¤•ार करें . -OptionWizard.21=अदà¥à¤¯à¤¤à¤¨ सफल -OptionWizard.22=ढाल -OptionWizard.23=गूगल अरà¥à¤¥ डेटा को फिर से खोलने में कोई तà¥à¤°à¥à¤Ÿà¤¿ थी -OptionWizard.24=रदà¥à¤¦ करना -OptionWizard.25=ऑपरेशन मोड -OptionWizard.26=डीबी होसà¥à¤Ÿ -OptionWizard.27=यह à¤à¤• मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ साà¤à¤•ॠफ़ोलà¥à¤¡à¤° नहीं है ( सà¥à¤Ÿà¤¾à¤°à¥à¤Ÿ-साà¤à¤•à¥.batफ़ाइल मौजूद नहीं है) -OptionWizard.28=साà¤à¤•ॠसरà¥à¤µà¤° मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ नहीं -OptionWizard.29=डीबी पोरà¥à¤Ÿ -OptionWizard.3=सरà¥à¤µà¤° आवृतà¥à¤¤à¤¿ -OptionWizard.30=à¤à¤¸à¤•à¥à¤¯à¥ लाइट विकलà¥à¤ª -OptionWizard.31=सेमà¥à¤ªà¤² डेटा -OptionWizard.32=पà¥à¤²à¥‰à¤Ÿ लेआउट -OptionWizard.33=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ परिभाषा -OptionWizard.34=विकसित -OptionWizard.35=सेमà¥à¤ªà¤² अंक की संखà¥à¤¯à¤¾ -OptionWizard.36=सेमà¥à¤ªà¤² बिंदॠके बीच दूरी (मीटर में) -OptionWizard.37=भूखंड की सीमा के साथ मारà¥à¤œà¤¿à¤¨ (मीटर मे) -OptionWizard.38=सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सही ढंग से पढ़ा नहीं जा सकता.
इस फ़ाइल में à¤à¤• अलà¥à¤ªà¤µà¤¿à¤°à¤¾à¤® से अलग मूलà¥à¤¯à¥‹à¤‚ की उमà¥à¤®à¥€à¤¦ है \:
-OptionWizard.39=आईडी, वाई समनà¥à¤µà¤¯, à¤à¤•à¥à¤¸ समनà¥à¤µà¤¯, ऊंचाई, ढाल, पहलू -OptionWizard.4=वरà¥à¤¤à¤®à¤¾à¤¨ कंपà¥à¤¯à¥‚टर आईपी \: -OptionWizard.40=परियोजनाà¤à¤‚ -OptionWizard.41=à¤à¤• नई परियोजना फ़ाइल लोड करें -OptionWizard.42=सीà¤à¤¸à¤µà¥€ पाठक को बंद करते समय तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.43=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ का नाम -OptionWizard.44= सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ बैकअप डेटाबेस -OptionWizard.45=ओपन पृथà¥à¤µà¥€ इंजन ने पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° में जूम किया -OptionWizard.46=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठपृथà¥à¤µà¥€ इंजन टाइमलैपà¥à¤¸ खोलें -OptionWizard.47=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठबिंग मैपà¥à¤¸ खोलें -OptionWizard.48=बजाय गूगल अरà¥à¤¥ के फॉरà¥à¤® à¤à¤• बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° पर खोलें (लिनकà¥à¤¸ के लिठसिफारिश) -OptionWizard.49=भूखंड डेटा के साथ सीईडी / सीà¤à¤¸à¤µà¥€ फाइल भेजने के लिठपथ -OptionWizard.5=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ\: -OptionWizard.50=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.51=परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.52=केवल निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क के साथ सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल -OptionWizard.53=चौकोर -OptionWizard.54=केनà¥à¤¦à¥à¤°à¥€à¤¯ बिनà¥à¤¦à¥ -OptionWizard.55=परियोजना फ़ोलà¥à¤¡à¤° आयात तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.56=लोड परियोजना -OptionWizard.57=पहले से लोड परियोजना -OptionWizard.58= जी ई ई का मैदान खोलें (विशà¥à¤µà¤¸à¤¨à¥€à¤¯ जांचकरà¥à¤¤à¤¾ के उपयोग की आवशà¥à¤¯à¤•ता है) -OptionWizard.59=यहां भूखंड पर केंदà¥à¤°à¤¿à¤¤ मैपà¥à¤¸ खोलें -OptionWizard.6=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² डीबी मापदंड -OptionWizard.65=साà¤à¤•à¥à¤«à¤¼à¥‹à¤²à¥à¤¡à¤° का पथ -OptionWizard.66=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.67=फ़ायरफ़ॉकà¥à¤¸ निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ -OptionWizard.68=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.7=उपयोगकरà¥à¤¤à¤¾ नाम -OptionWizard.70=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों -OptionWizard.72=बाइनरी फ़ाइलें -OptionWizard.73=कà¥à¤°à¥‹à¤® निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ -OptionWizard.74=बà¥à¤°à¤¾à¤‰à¤œ -OptionWizard.76=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों -OptionWizard.78=बाइनरी फ़ाइलें -OptionWizard.79=केà¤à¤®à¤à¤² फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ के लिठपथ -OptionWizard.8=पासवरà¥à¤¡ -OptionWizard.80=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.82=फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ -OptionWizard.83=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ पà¥à¤°à¤ªà¤¤à¥à¤° डिज़ाइन करने के लिठपथ -OptionWizard.84=बà¥à¤°à¤¾à¤‰à¤œ..... -OptionWizard.86=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² वेब पेज -OptionWizard.87=पथ आइडीà¤à¤® परिभाषा के साथ à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठ-OptionWizard.88=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.9=डीबी नाम -OptionWizard.90=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² आइडीà¤à¤® परिभाषा -OptionWizard.91=सरà¥à¤µà¤° (पà¥à¤°à¤¬à¤‚धक संसà¥à¤•रण या खड़े अकेले का उपयोग करें) -OptionWizard.92=कà¥à¤²à¤¾à¤‡à¤‚ट (ऑपरेटर / सरà¥à¤µà¤° से जà¥à¤¡à¤¼à¥‡) -OptionWizard.93=सकà¥à¤¯à¥‚à¤à¤²à¤¾à¤‡à¤Ÿ (à¤à¤‚बेडेड / à¤à¤•ल फाइल आधारित) -OptionWizard.94=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² -OptionWizard.95=सेमà¥à¤ªà¤² डॉटà¥à¤¸ के साइड (मीटर में) -SaikuAnalysisListener.0=हाठ- ताज़ा साà¤à¤•ॠडेटा (लंबी पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾) -SaikuAnalysisListener.1=नहीं - बस साà¤à¤•ॠशà¥à¤°à¥‚ -SaikuStarter.1=साà¤à¤•ॠशà¥à¤°à¥‚ -SaikuStarter.2= साà¤à¤•ॠशà¥à¤°à¥‚ कà¥à¤› मिनट लग सकते हैं, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें\! -SaveEarthDataServlet.0=खाली अनà¥à¤°à¥‹à¤§ -SaveEarthDataServlet.1= डेटाबेस में डेटा बचाते समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ है -SaveEarthDataServlet.2=डेटा बचाया था -SlopeCode.0=समतल (0-5) -EarthApp.11=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ पहले से ही चल रहा है -EarthApp.21=à¤à¤• सीà¤à¤¸à¤µà¥€ / सीईडी के रूप में भूखंडों की गà¥à¤°à¤¿à¤¡ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
-EarthApp.23=कोई सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सेट-अप नहीं किया गया है \:

-EarthApp.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² परिभाषा के साथ फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है \:
-EarthApp.26=कोई à¤à¤•à¥à¤¸à¤à¤®à¤à¤² फ़ाइल परिभाषा सेट अप नहीं किया गया है \:

-EarthApp.27=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ रूप से यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
-EarthApp.29=कोई à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ फ़ाइल सेट-अप नहीं किया गया है \:

-EarthApp.3=मà¥à¤à¥‡ बाद में याद दिलाना -EarthApp.30=उपकरण> गà¥à¤£ मेनू में फ़ाइल सà¥à¤¥à¤¾à¤¨ को ठीक करें . -EarthApp.4=अभी अदà¥à¤¯à¤¤à¤¨ करें -EarthApp.5=मà¥à¤à¥‡ दà¥à¤¬à¤¾à¤°à¤¾ याद मत दिलाना -EarthApp.57=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ का à¤à¤• नया संसà¥à¤•रण उपलबà¥à¤§ है\!
आप कैसे आगे बढ़ना चाहते हैं? -EarthApp.58=अदà¥à¤¯à¤¤à¤¨ चेतावनी -EarthApp.59= परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ -EarthApp.6=\ - संसà¥à¤•रण -EarthApp.61=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ फाइल खà¥à¤² नहीं सकती .
कृपया सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करें कि गूगल अरà¥à¤¥ सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ है. -EarthSurveyService.9=आवशà¥à¤¯à¤• कà¥à¤·à¥‡à¤¤à¥à¤° -ExportActionListener.1= तारीख चूनें जबसे रिकॉरà¥à¤¡ निरà¥à¤¯à¤¾à¤¤ करने है -ExportDialogProcessMonitor.0=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... -ExportDialogProcessMonitor.1=पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ पà¥à¤°à¤¾à¤°à¤‚भ करने के लिठपà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ कर रहा है \: -ExportDialogProcessMonitor.4=निरà¥à¤¯à¤¾à¤¤ रिकॉरà¥à¤¡\: -ImportProcessMonitorDialog.0=आयातित रिकॉरà¥à¤¡ \: -ImportActionListener.0=कà¥à¤¯à¤¾ उन भूखंडों के लिठडेटा जो कि पूरी तरह से भरे नहीं गठ,आयातित किया जाना चाहिà¤? -ImportActionListener.2=आप कà¥à¤²à¤¿à¤• करें, नहींतो केवल डेटा "हरी" राजà¥à¤¯ में भूखंडों से ,जिसमें सभी डेटा यà¥à¤•à¥à¤¤ है , आयात किया जाà¤à¤—ा। -ImportDialogProcessMonitor.0=\ गणना -ImportDialogProcessMonitor.11=रिकॉरà¥à¤¡ की पà¥à¤°à¤¾à¤°à¤‚भिक संखà¥à¤¯à¤¾ \: -ImportDialogProcessMonitor.2=रिकॉरà¥à¤¡ आयात... -ImportDialogProcessMonitor.5=आयातित रिकॉरà¥à¤¡ की वासà¥à¤¤à¤µà¤¿à¤• संखà¥à¤¯à¤¾ \: -ImportDialogProcessMonitor.8=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... -InfiniteProgressMonitor.0=रदà¥à¤¦ ऑपरेशन -JFileChooserExistsAware.0=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ परियोजना फ़ाइल -KmlImportService.13=पà¥à¤²à¥‰à¤Ÿ सà¥à¤¥à¤¾à¤¨à¥‹à¤‚ को बचाने के लिठà¤à¤• सीà¤à¤¸à¤µà¥€ फ़ाइल का चयन करें -MissingPlotsListener.0=तà¥à¤°à¥à¤Ÿà¤¿ उन भूखंडों के बारे में जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ करने के लिठजो डेटाबेस पर मौजूद नहीं -MissingPlotsListener.1=गà¥à¤® भूखंड -MissingPlotsListener.10=सेमà¥à¤ªà¤² डिजाइन में भूखंडों की कà¥à¤² संखà¥à¤¯à¤¾ \: -MissingPlotsListener.12=गà¥à¤® भूखंडों की संखà¥à¤¯à¤¾ \: -MissingPlotsListener.14=सभी भूखंडों भर रहे हैं\! -MissingPlotsListener.2=कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ अंतरà¥à¤µà¤¸à¥à¤¤à¥ की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ -MissingPlotsListener.3=भूखंड की जानकारी वाले फ़ाइलें चà¥à¤¨à¥‡à¤‚ ( .सीà¤à¤¸à¤µà¥€ या .सीईडी फ़ाइलें ) जिसके लिठआप जानना चाहते हैं तो सभी डेटा भर दिया गया है चाहता हूà¤. -MissingPlotsListener.4=गà¥à¤® भूखंड- जानकारी -MissingPlotsListener.5=फ़ाइल से \: -MissingPlotsListener.6=सीà¤à¤¡à¥€ फ़ाइल में निरà¥à¤¯à¤¾à¤¤ करें -ProcessMonitorDialog.1=पंकà¥à¤¤à¤¿ संखà¥à¤¯à¤¾ पर तà¥à¤°à¥à¤Ÿà¤¿ -ProcessMonitorDialog.4=, कॉलम -ProcessMonitorDialog.5=\ --मूलà¥à¤¯ -YES= हां -YES_TO_ALL=सब को हां -NO=नहीं -NO_TO_ALL=सभी को नहीं +AboutDialog.19=Äã có lá»—i +AboutDialog.5=Truy cập website cá»§a chúng tôi để biết thêm thông tin OpenForis.org +AboutDialog.6=Xin lá»—i, đã có sá»± cố khi mở link trong brower chuẩn trong hệ thống cá»§a bạn. +AboutDialog.8=Ok +AspectCode.0=Bắc +AspectCode.1=Äông-Bắc +AspectCode.2=Äông +AspectCode.3=Äông-Nam +AspectCode.4=Nam +AspectCode.5=Tây-Nam +AspectCode.6=Tây +AspectCode.7=Tây-Bắc +CollectEarthWindow.0=Lá»—i khi xuất dữ liệu sang file CSV +CollectEarthWindow.1=Lá»—i xuất dữ liệu +CollectEarthWindow.10=File +CollectEarthWindow.11=Thoát +CollectEarthWindow.12=Công cụ +CollectEarthWindow.13=Xuất dữ liệu ra CSV +CollectEarthWindow.14=Khởi động SAIKU Analysis +CollectEarthWindow.15=Thuá»™c tính +CollectEarthWindow.16=Trợ giúp +CollectEarthWindow.17=Thông tin công bố +CollectEarthWindow.18=Tìm ô thiếu trong cÆ¡ sở dữ liệu +CollectEarthWindow.19=Collect Earth +CollectEarthWindow.2=Ngôn ngữ +CollectEarthWindow.20=Số bản ghi trùng\: +CollectEarthWindow.21=Không tìm thấy biểu tượng cho khung chính +CollectEarthWindow.22=Bạn có chắc là muốn đóng Collect Earth?
Äóng cá»­a sổ cÅ©ng đóng luôn máy chá»§ Collect Earth +CollectEarthWindow.23=Cần khẳng định +CollectEarthWindow.24=Xuất ra XML +CollectEarthWindow.25=Bạn có muốn thêm các bản ghi này và bá» Ä‘i dữ liệu hiện thá»i không? +CollectEarthWindow.26=Ngưá»i sá»­ dụng +CollectEarthWindow.27=Cập nhật +CollectEarthWindow.28=Máy chá»§ Open Foris Collect Earth phải chạy khi ngưá»i sá»­ dụng giải Ä‘oán dữ liệu. +CollectEarthWindow.29=Chưa xác định cấu hình cho Máy chá»§ Saiku. +CollectEarthWindow.3=\ Lá»—i nhập +CollectEarthWindow.30=Äể mở cá»­a sổ này khi Ä‘ang sá»­ dụng Google Earth. +CollectEarthWindow.31=Xuất dữ liệu đã thu thập sang file CSV +CollectEarthWindow.32=Thoát +CollectEarthWindow.33=Tên ngưá»i sá»­ dụng phải dài hÆ¡n 5 chữ cái và ngắn hÆ¡n 50 chữ cái +CollectEarthWindow.34=Lá»—i kiểm chứng +CollectEarthWindow.35=TÊN NGƯỜI SỬ DỤNG CÃ’N TRá»NG\!
Hãy Ä‘iá»n tên ngưá»i sá»­ dụng và nhắp phím "Update". +CollectEarthWindow.36=Không được để trống phần tên ngưá»i sá»­ dụng +CollectEarthWindow.37=Äể mở +CollectEarthWindow.38=file CSV +CollectEarthWindow.39=THÔNG BÃO\: Nên lưu dá»± phòng dữ liệu hiện thá»i(Xuất ra XML) trước khi nhập dữ liệu má»›i +CollectEarthWindow.4=Thông tin công bố cá»§a FAO +CollectEarthWindow.40=Thiết lập đưá»ng dẫn tá»›i thư mục cài đặt Saiku Server trong Tools->Properties->Advanced tab. +CollectEarthWindow.41=Ghi dữ liệu xuất ra vào file\: +CollectEarthWindow.42=Thoát +CollectEarthWindow.43=Tìm thấy bản ghi có mâu thuẫn +CollectEarthWindow.44=Nhập/Xuất dữ liệu +CollectEarthWindow.45=Xuất dữ liệu ra XML (nén) +CollectEarthWindow.46=Nhập dữ liệu má»›i từ file ZIP (XML nén) +CollectEarthWindow.55=Cập nhật các bản ghi hiện thá»i bằng CSV +CollectEarthWindow.47=Chưa định cấu hình cho Saiku Server +CollectEarthWindow.48=ZIP files +CollectEarthWindow.49=Files CSV tổng hợp +CollectEarthWindow.5=Äóng +CollectEarthWindow.50=Mở hướng dẫn ngưá»i sá»­ dụng +CollectEarthWindow.51=Kiểm tra cập nhật cá»§a Collect Earth +CollectEarthWindow.52=Mở file nhật ký ứng dụng +CollectEarthWindow.53=File nhật ký cá»§a Collect Earth +CollectEarthWindow.54=Nạp các Ä‘iểm từ KML +CollectEarthWindow.56=Vá»... +CollectEarthWindow.57=Äang chạy quá trình khởi động Saiku, xin đợi. +CollectEarthWindow.58=Không thể khởi động Saiku analysis +CollectEarthWindow.59=Bạn có muốn tạo lại bá»™ dữ liệu cho Saiku analysis không?
Quá trình này sẽ mất một vài phút.
Nếu bạn chá»n "YES" sẽ tạo ra má»™t bá»™ dữ liệu má»›i vá»›i các thông tin cập nhật nhất. +CollectEarthWindow.6=Xuất ra bảng tổng hợp +CollectEarthWindow.60=Tạo dữ liệu Saiku +CollectEarthWindow.61=Xuất dữ liệu ra XML (các bản ghi chỉnh sá»­a từ lần xuất trước) +CollectEarthWindow.62=Vá»... +CollectEarthWindow.63=Lá»—i khi nạp Ä‘iểm từ KML +CollectEarthWindow.64=Há»— trợ kỹ thuật +CollectEarthWindow.7=Lá»—i khi nhập dữ liệu +CollectEarthWindow.8=Không tìm thấy văn bản thông báo +CollectEarthWindow.9=Dữ liệu nhập vào có chứa các bản ghi đã có trong cÆ¡ sở dữ liệu cá»§a bạn. +DynamicsCode.0=Ban đầu là rừng +DynamicsCode.1=Ban đầu là trảng cá» +DynamicsCode.2=Ban đầu là khu dân cư +DynamicsCode.3=Ban đầu là đất khác +DynamicsCode.4=Ban đầu là đất ngập nước +DynamicsCode.5=Ban đầu là đất trồng trá»t +OpenTextFileListener.0=không tìm thấy file văn bản tại\: +OptionWizard.0=Các lá»±a chá»n cá»§a Collect Earth +OptionWizard.1=Chá»n Browser +OptionWizard.10=Mở thư mục lưu dá»± phòng +OptionWizard.11=Không biết\: hãy sá»­ dụng ifconfig +OptionWizard.12=Vi dụ cá»§a khác +OptionWizard.13=Äịa chỉ IP cá»§a máy chá»§ Collect Earth +OptionWizard.14=Cổng máy chá»§ Collect Earth (vd\: 8023) +OptionWizard.15=Ghi và áo dụng thay đổi +OptionWizard.16=ID +OptionWizard.17=Tá»a độ X +OptionWizard.18=Tá»a độ Y +OptionWizard.19=Äá»™ cao +OptionWizard.2=Dòng công tác (máy chá»§/khách) +OptionWizard.20=Ná»™i dung cá»§a Google Earth đã thay đổi.
Äá» nghị chấp nhận tải lại ná»™i dung khi Google Earth gợi ý. +OptionWizard.21=Cập nhật thành công +OptionWizard.22=Dốc +OptionWizard.23=Có lá»—i khi mở lại dữ liệu Google Earth +OptionWizard.24=Há»§y +OptionWizard.25=Mode vận hành +OptionWizard.26=NÆ¡i lưu cÆ¡ sở dữ liệu +OptionWizard.27=Äây không phải là thư mục Saiku (hiện không có file start-saiku.bat) +OptionWizard.28=Không nhận được máy chá»§ Saiku +OptionWizard.29=Cổng cÆ¡ sở dữ liệu +OptionWizard.3=Ví dụ cá»§a máy chá»§ +OptionWizard.30=Các lá»±a chá»n cá»§a SQLite +OptionWizard.31=Dữ liệu mẫu +OptionWizard.32=SÆ¡ đồ mẫu +OptionWizard.33=Äịnh nghÄ©a khảo sát +OptionWizard.34=Nâng cao +OptionWizard.35=Số Ä‘iểm mẫu +OptionWizard.36=Khoảng cách giữa các Ä‘iểm mẫu (tính theo mét) +OptionWizard.37=Lá» vá»›i biên ô (tính theo mét) +OptionWizard.38=Không Ä‘á»c được đúng file CSV/CED.
Cần có dấu phảy để phân tách giá trị giống như sau \:
+OptionWizard.39=ID,Tá»a độ Y,tá»a độ X,độ cao,độ dốc,tá»· lệ +OptionWizard.4=Äịa chỉ IP hiện tại cá»§a máy tính\: +OptionWizard.40=Các project +OptionWizard.41=tải file project má»›i +OptionWizard.42=Lá»—i khi đóng CSV reader +OptionWizard.43=Tên khảo sát +OptionWizard.44=tá»± động lưu dá»± phòng dữ liệu tại +OptionWizard.45=Mở Earth Engine để phóng to vào khu vá»±c ô +OptionWizard.46=Mở Earth Engine timelapse cho khu vá»±c ô +OptionWizard.47=Mở Bing Maps cho khu vá»±c ô +OptionWizard.48=Mở form trên browser thay vì mở Google Earth (khuyến cáo cho LINUX) +OptionWizard.49=ÄÆ°á»ng dẫn tá»›i file ced/csv file vá»›i dữ liệu ô +OptionWizard.5=Cổng máy chá»§ Collect Earth\: +OptionWizard.50=Browse... +OptionWizard.51=Lá»—i nhập file project +OptionWizard.52=File CSV/CED chỉ có tá»a độ +OptionWizard.53=Ô vuông +OptionWizard.54=Äiểm trung tâm +OptionWizard.55=Lá»—i khi nhập thư mục project +OptionWizard.56=Tải project +OptionWizard.57=Các project đã tải +OptionWizard.58=Mở GEE Code Editor (cần phải có quyá»n truy cập Trusted Tester) +OptionWizard.59=Mở Here Maps tập trung vào ô +OptionWizard.6=Các thông số cá»§a CSDL PostgreSQL +OptionWizard.65=ÄÆ°á»ng dẫn tá»›i thư mục Saiku +OptionWizard.66=Browse... +OptionWizard.67=ÄÆ°á»ng dẫn tá»›i Firefox executable (file exe) +OptionWizard.68=Browse... +OptionWizard.7=Tên ngưá»i sá»­ dụng +OptionWizard.70=File chạy +OptionWizard.72=File nhị phân +OptionWizard.73=ÄÆ°á»ng dẫn tá»›i Chrome executable (file exe) +OptionWizard.74=Browse... +OptionWizard.76=File exe +OptionWizard.78=File nhị phân +OptionWizard.79=ÄÆ°á»ng dẫn tá»›i KML Freemarker template +OptionWizard.8=Mật khẩu +OptionWizard.80=Browse... +OptionWizard.82=Freemarker template +OptionWizard.83=ÄÆ°á»ng dẫn tá»›i mẫu thiết kế HTML Balloon +OptionWizard.84=Browse... +OptionWizard.86=HTML webpage +OptionWizard.87=ÄÆ°á»ng dẫn tá»›i XML vá»›i định nghÄ©a IDM +OptionWizard.88=Browse... +OptionWizard.9=Tên CSDL +OptionWizard.90=Äịnh nghÄ©a XML IDM +OptionWizard.91=Máy chá»§ (phiên bản quản lý hoặc sá»­ dụng độc lập) +OptionWizard.92=Khách (ngưá»i sá»­ dụng/kết nối vá»›i máy chá»§) +OptionWizard.93=SQLite (tích hợp/file đơn lẻ) +OptionWizard.94=PostgreSQL +SaikuAnalysisListener.0=Yes - Làm má»›i lại dữ liệu Saiku (quá trình dài) +SaikuAnalysisListener.1=No - chỉ khởi động Saiku +SaikuStarter.1=Khởi động Saiku +SaikuStarter.2=Cần vài phút để khởi động Saiku, xin đợi\! +SaveEarthDataServlet.0=Yêu cầu trống +SaveEarthDataServlet.1=Có trục trặc khi ghi dữ liệu vào CSDL +SaveEarthDataServlet.2=Dữ liệu đã được ghi +SlopeCode.0=Bằng phẳng (0-5) +EarthApp.11=Collect Earth Ä‘ang chạy +EarthApp.21=Không tìm thấy file chứa lưới ô trong đưá»ng dẫn đã chá»n \:
+EarthApp.23=Chưa thiết lập file CSV/CED \:

+EarthApp.24=Không tìm thấy file chứa Freemarker template vá»›i định nghÄ©a KML trong đưá»ng dẫn đã chá»n\:
+EarthApp.26=Chưa thiết lập file định nghĩa KML d\:

+EarthApp.27=Không tìm thấy file chứa mẫu HTML balloon trong đưá»ng dẫn đã chá»n\:
+EarthApp.29=Chưa thiết lập file HTML balloon \:

+EarthApp.3=Nhắc nhở sau +EarthApp.30=Xin hãy Ä‘iá»u chỉnh đúng địa chỉ file trong Tools->Properties menu. +EarthApp.4=Cập nhật luôn +EarthApp.5=Không nhắc nữa +EarthApp.57=Äã có phiên bản má»›i cá»§a Collect Earth\!
Bạn muốn làm tiếp như thế nào? +EarthApp.58=Thông báo cập nhật +EarthApp.59=Lỗi khi nhập file project +EarthApp.6=\ - Phiên bản +EarthApp.61=Không mở được file Collect Earth.
Äá» nghị đảm bảo đã cài đặt Google Earth. +EarthSurveyService.9=Trưá»ng bắt buá»™c +ExportActionListener.1=Chá»n ngày xuất bản ghi +ExportDialogProcessMonitor.0=Äang xá»­ lý dữ liệu... +ExportDialogProcessMonitor.1=Äang đợi khởi động quá trình\: +ExportDialogProcessMonitor.4=Các bản ghi đã xuất\: +ImportProcessMonitorDialog.0=Các bản ghi đã nhập\: +ImportActionListener.0=Có nhập dữ liệu các ô chưa được Ä‘iá»n đầy đủ không? +ImportActionListener.2=Nếu bạn chá»n NO sẽ chỉ nhập dữ liệu cá»§a các ô có trạng thái màu "xanh lá cây", các ô đã có đầy đủ dữ liệu. +ImportActionListener.3=Nhập các bản ghi chưa hoàn tất +ImportDialogProcessMonitor.0=\ ÄANG TÃNH TOÃN +ImportDialogProcessMonitor.11=Số lượng ban đầu các bản ghi\: +ImportDialogProcessMonitor.2=Äang nhập các bản ghi... +ImportDialogProcessMonitor.5=Số lượng thá»±c tế các bản ghi đã nhập\: +ImportDialogProcessMonitor.8=Äang xá»­ lý dữ liệu... +InfiniteProgressMonitor.0=Há»§y lệnh +JFileChooserExistsAware.0=File project cá»§a Collect Earth +KmlImportService.13=Chá»n file CSV file để ghi địa Ä‘iểm cá»§a ô vào +MissingPlotsListener.0=Lá»—i khi lấy thông tin vỠô không có trong CSDL +MissingPlotsListener.1=Các ô thiếu +MissingPlotsListener.10=Tổng số ô trong thiết kế chá»n mẫu \: +MissingPlotsListener.12=Số ô thiếu\: +MissingPlotsListener.14=Äã Ä‘iá»n tất cả các ô\! +MissingPlotsListener.2=Sao chép ná»™i dung vào bàn phím +MissingPlotsListener.3=Lá»±a chá»n file có chứa thông tin ô ( file .csv hoặc .ced ) mà bạn muốn biết đã Ä‘iá»n đủ dữ liệu chưa. +MissingPlotsListener.4=Các ô thiếu - thông tin +MissingPlotsListener.5=Từ file \: +MissingPlotsListener.6=Xuất ra file CED +ProcessMonitorDialog.1=Tìm lá»—i trên số dòng +ProcessMonitorDialog.4=, cá»™t +ProcessMonitorDialog.5=\ -- giá trị From a5098f153ede592b5f724e20dd2a6096dfe2abe7 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:36:35 +0100 Subject: [PATCH 0812/1620] New translations Messages.properties (French) --- .../earth/app/view/Messages_fr.properties | 458 ++++++++++-------- 1 file changed, 251 insertions(+), 207 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 353fe0d367..3ce9622fe0 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,221 +1,265 @@ -AboutDialog.19=Äã có lá»—i -AboutDialog.5=Truy cập website cá»§a chúng tôi để biết thêm thông tin OpenForis.org -AboutDialog.6=Xin lá»—i, đã có sá»± cố khi mở link trong brower chuẩn trong hệ thống cá»§a bạn. +AboutDialog.19=A problem occurred +AboutDialog.5=For more information visit our website OpenForis.org +AboutDialog.6=Sorry, a problem occurred while trying to open this link in your system's standard browser. AboutDialog.8=Ok -AspectCode.0=Bắc -AspectCode.1=Äông-Bắc -AspectCode.2=Äông -AspectCode.3=Äông-Nam -AspectCode.4=Nam -AspectCode.5=Tây-Nam -AspectCode.6=Tây -AspectCode.7=Tây-Bắc -CollectEarthWindow.0=Lá»—i khi xuất dữ liệu sang file CSV -CollectEarthWindow.1=Lá»—i xuất dữ liệu +AspectCode.0=North +AspectCode.1=North-East +AspectCode.2=East +AspectCode.3=South-East +AspectCode.4=South +AspectCode.5=South-West +AspectCode.6=West +AspectCode.7=North-West +CollectEarthMenu.0=Import CEP file +CollectEarthMenu.2=Utilities +CollectEarthMenu.3=Divide large CSV plot files +CollectEarthMenu.4=Export data to XML (from specific date until present) +CollectEarthMenu.5=Export to Collect Backup +CollectEarthMenu.6=Export data as Collect Backup (all data) +CollectEarthMenu.7=Export data as Collect Backup (from date) +CollectEarthMenu.8=Export data to XML (using summary attribute) +CollectEarthWindow.0=Error when attempting to export data to CSV file CollectEarthWindow.10=File -CollectEarthWindow.11=Thoát -CollectEarthWindow.12=Công cụ -CollectEarthWindow.13=Xuất dữ liệu ra CSV -CollectEarthWindow.14=Khởi động SAIKU Analysis -CollectEarthWindow.15=Thuá»™c tính -CollectEarthWindow.16=Trợ giúp -CollectEarthWindow.17=Thông tin công bố -CollectEarthWindow.18=Tìm ô thiếu trong cÆ¡ sở dữ liệu +CollectEarthWindow.11=Exit +CollectEarthWindow.12=Tools +CollectEarthWindow.13=Download data to CSV (Excel) +CollectEarthWindow.14=Start SAIKU Analysis +CollectEarthWindow.15=Properties +CollectEarthWindow.16=Help +CollectEarthWindow.17=Disclaimer +CollectEarthWindow.18=Find missing plots in database CollectEarthWindow.19=Collect Earth -CollectEarthWindow.2=Ngôn ngữ -CollectEarthWindow.20=Số bản ghi trùng\: -CollectEarthWindow.21=Không tìm thấy biểu tượng cho khung chính -CollectEarthWindow.22=Bạn có chắc là muốn đóng Collect Earth?
Äóng cá»­a sổ cÅ©ng đóng luôn máy chá»§ Collect Earth -CollectEarthWindow.23=Cần khẳng định -CollectEarthWindow.24=Xuất ra XML -CollectEarthWindow.25=Bạn có muốn thêm các bản ghi này và bá» Ä‘i dữ liệu hiện thá»i không? -CollectEarthWindow.26=Ngưá»i sá»­ dụng -CollectEarthWindow.27=Cập nhật -CollectEarthWindow.28=Máy chá»§ Open Foris Collect Earth phải chạy khi ngưá»i sá»­ dụng giải Ä‘oán dữ liệu. -CollectEarthWindow.29=Chưa xác định cấu hình cho Máy chá»§ Saiku. -CollectEarthWindow.3=\ Lá»—i nhập -CollectEarthWindow.30=Äể mở cá»­a sổ này khi Ä‘ang sá»­ dụng Google Earth. -CollectEarthWindow.31=Xuất dữ liệu đã thu thập sang file CSV -CollectEarthWindow.32=Thoát -CollectEarthWindow.33=Tên ngưá»i sá»­ dụng phải dài hÆ¡n 5 chữ cái và ngắn hÆ¡n 50 chữ cái -CollectEarthWindow.34=Lá»—i kiểm chứng -CollectEarthWindow.35=TÊN NGƯỜI SỬ DỤNG CÃ’N TRá»NG\!
Hãy Ä‘iá»n tên ngưá»i sá»­ dụng và nhắp phím "Update". -CollectEarthWindow.36=Không được để trống phần tên ngưá»i sá»­ dụng -CollectEarthWindow.37=Äể mở -CollectEarthWindow.38=file CSV -CollectEarthWindow.39=THÔNG BÃO\: Nên lưu dá»± phòng dữ liệu hiện thá»i(Xuất ra XML) trước khi nhập dữ liệu má»›i -CollectEarthWindow.4=Thông tin công bố cá»§a FAO -CollectEarthWindow.40=Thiết lập đưá»ng dẫn tá»›i thư mục cài đặt Saiku Server trong Tools->Properties->Advanced tab. -CollectEarthWindow.41=Ghi dữ liệu xuất ra vào file\: -CollectEarthWindow.42=Thoát -CollectEarthWindow.43=Tìm thấy bản ghi có mâu thuẫn -CollectEarthWindow.44=Nhập/Xuất dữ liệu -CollectEarthWindow.45=Xuất dữ liệu ra XML (nén) -CollectEarthWindow.46=Nhập dữ liệu má»›i từ file ZIP (XML nén) -CollectEarthWindow.55=Cập nhật các bản ghi hiện thá»i bằng CSV -CollectEarthWindow.47=Chưa định cấu hình cho Saiku Server -CollectEarthWindow.48=ZIP files -CollectEarthWindow.49=Files CSV tổng hợp -CollectEarthWindow.5=Äóng -CollectEarthWindow.50=Mở hướng dẫn ngưá»i sá»­ dụng -CollectEarthWindow.51=Kiểm tra cập nhật cá»§a Collect Earth -CollectEarthWindow.52=Mở file nhật ký ứng dụng -CollectEarthWindow.53=File nhật ký cá»§a Collect Earth -CollectEarthWindow.54=Nạp các Ä‘iểm từ KML -CollectEarthWindow.56=Vá»... -CollectEarthWindow.57=Äang chạy quá trình khởi động Saiku, xin đợi. -CollectEarthWindow.58=Không thể khởi động Saiku analysis -CollectEarthWindow.59=Bạn có muốn tạo lại bá»™ dữ liệu cho Saiku analysis không?
Quá trình này sẽ mất một vài phút.
Nếu bạn chá»n "YES" sẽ tạo ra má»™t bá»™ dữ liệu má»›i vá»›i các thông tin cập nhật nhất. -CollectEarthWindow.6=Xuất ra bảng tổng hợp -CollectEarthWindow.60=Tạo dữ liệu Saiku -CollectEarthWindow.61=Xuất dữ liệu ra XML (các bản ghi chỉnh sá»­a từ lần xuất trước) -CollectEarthWindow.62=Vá»... -CollectEarthWindow.63=Lá»—i khi nạp Ä‘iểm từ KML -CollectEarthWindow.64=Há»— trợ kỹ thuật -CollectEarthWindow.7=Lá»—i khi nhập dữ liệu -CollectEarthWindow.8=Không tìm thấy văn bản thông báo -CollectEarthWindow.9=Dữ liệu nhập vào có chứa các bản ghi đã có trong cÆ¡ sở dữ liệu cá»§a bạn. -DynamicsCode.0=Ban đầu là rừng -DynamicsCode.1=Ban đầu là trảng cá» -DynamicsCode.2=Ban đầu là khu dân cư -DynamicsCode.3=Ban đầu là đất khác -DynamicsCode.4=Ban đầu là đất ngập nước -DynamicsCode.5=Ban đầu là đất trồng trá»t -OpenTextFileListener.0=không tìm thấy file văn bản tại\: -OptionWizard.0=Các lá»±a chá»n cá»§a Collect Earth -OptionWizard.1=Chá»n Browser -OptionWizard.10=Mở thư mục lưu dá»± phòng -OptionWizard.11=Không biết\: hãy sá»­ dụng ifconfig -OptionWizard.12=Vi dụ cá»§a khác -OptionWizard.13=Äịa chỉ IP cá»§a máy chá»§ Collect Earth -OptionWizard.14=Cổng máy chá»§ Collect Earth (vd\: 8023) -OptionWizard.15=Ghi và áo dụng thay đổi +CollectEarthWindow.1=Export error +CollectEarthWindow.20=Number of duplicated records\: +CollectEarthWindow.21=Could not find icon for main frame +CollectEarthWindow.22=Are you sure that you want to close Collect Earth?
Closing the window will also close the Collect Earth server +CollectEarthWindow.23=Confirmation needed +CollectEarthWindow.24=XML Export +CollectEarthWindow.25=Do you want to add these records anyway and lose your current data? +CollectEarthWindow.26=Operator +CollectEarthWindow.27=Update +CollectEarthWindow.28=Open Foris Collect Earth server should be running while the operator interprets data. +CollectEarthWindow.29=The Saiku Server is not configured. +CollectEarthWindow.2=Language +CollectEarthWindow.30=Please maintain this window open while you are using Google Earth. +CollectEarthWindow.31=Export collected data to CSV file +CollectEarthWindow.32=Quit +CollectEarthWindow.33=The operator name has to be longer than 5 characters and shorter than 50 +CollectEarthWindow.34=Validation error +CollectEarthWindow.35=OPERATOR NAME EMPTY\!
Please fill the operator name and press the "Update" button. +CollectEarthWindow.36=Operator name cannot be empty +CollectEarthWindow.37=Keep Open +CollectEarthWindow.38=CSV files +CollectEarthWindow.39=NOTICE\: It is advisable that you back-up your current data (Export to XML) before importing the new data +CollectEarthWindow.3=\ Import error +CollectEarthWindow.40=Set-up the path to the folder where Saiku Server is installed in the Tools->Properties->Advanced tab. +CollectEarthWindow.41=Saving exported data to file\: +CollectEarthWindow.42=Quit +CollectEarthWindow.43=Conflicting records found +CollectEarthWindow.44=Data Import/Export +CollectEarthWindow.45=Export data to XML (compressed) +CollectEarthWindow.46=Import new data from ZIP (compressed XML) +CollectEarthWindow.47=Saiku Server not configured +CollectEarthWindow.48=Zip/collect-data files +CollectEarthWindow.49=Fusion CSV files +CollectEarthWindow.4=FAO Disclaimer notices +CollectEarthWindow.50=Open User Manual +CollectEarthWindow.51=Check for updates of Collect Earth +CollectEarthWindow.52=Open Application Log File +CollectEarthWindow.53=Collect Earth Log file +CollectEarthWindow.54=Load points from KML +CollectEarthWindow.55=Update current records using CSV +CollectEarthWindow.56=About... +CollectEarthWindow.57=The Saiku starter process is still running, please wait. +CollectEarthWindow.58=Cannot start Saiku analysis +CollectEarthWindow.59=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming.
If you click on "YES" a new dataset with the latest information will be generated. +CollectEarthWindow.5=Close +CollectEarthWindow.60=Saiku data generation +CollectEarthWindow.61=Export data to XML (modified records since last export) +CollectEarthWindow.62=About... +CollectEarthWindow.63=Error getting the points from KML +CollectEarthWindow.64=Technical Support +CollectEarthWindow.65=The operator name has been changed +CollectEarthWindow.66=Operator name +CollectEarthWindow.67=Open data folder +CollectEarthWindow.6=Export to Fusion Table +CollectEarthWindow.70=Open the Survey Guide +CollectEarthWindow.71=Generate Stand-Alone Saiku tool +CollectEarthWindow.7=Error when importing data +CollectEarthWindow.8=Disclaimer text could not be found +CollectEarthWindow.9=The data imported contains records that are already present on your database. +DynamicsCode.0=Initially Forest +DynamicsCode.1=Initially Grassland +DynamicsCode.2=Initially Settlement +DynamicsCode.3=Initially Otherland +DynamicsCode.4=Initially Wetland +DynamicsCode.5=Initially Cropland +EarthApp.11=Collect Earth is already running +EarthApp.21=The file containing the grid of plots as a CSV/CED is not found in the selected path \:
+EarthApp.23=No CSV/CED file has been set-up \:

+EarthApp.24=The file containing the Freemarker template with the KML definition is not found in the selected path \:
+EarthApp.26=No KML definition file has been set-up \:

+EarthApp.27=The file containing the HTML balloon form is not found in the selected path \:
+EarthApp.29=No HTML balloon file has been set-up \:

+EarthApp.30=Please correct the file location in the Tools->Properties menu. +EarthApp.3=Remind me later +EarthApp.4=Update Now +EarthApp.57=There is a new version of Collect Earth available\!
How do you want to proceed? +EarthApp.58=Update alert +EarthApp.59=Error when importing project file +EarthApp.5=Do not remind me again +EarthApp.61=The Collect Earth file could not be open.
Please make sure that Google Earth is installed. +EarthApp.6=\ - Version +EarthApp.70=WARNING +EarthApp.71=In Mac OS X the Collect Earth project files (*.cep) will not open in Collect Earth when they are double-clicked.
+EarthApp.72=Use the Collect Earth toolbar to open the .cep files \: +EarthApp.73=Collect Earth issues in Mac OS X computers +EarthSurveyService.9=Field required +ExportActionListener.1=Pick Date to Export Records From +ExportDialogProcessMonitor.0=Processing data... +ExportDialogProcessMonitor.1=Waiting to initialize process \: +ExportDialogProcessMonitor.4=Exported records \: +ImportActionListener.0=Should the data for plots that have not been completely filled be imported? +ImportActionListener.2=If you click NO only the data from plots in the "green" state, containing all data, will be imported. +ImportActionListener.3=Import non-finished records +ImportDialogProcessMonitor.0=\ CALCULATING +ImportDialogProcessMonitor.11=Initial number of records \: +ImportDialogProcessMonitor.2=Importing records... +ImportDialogProcessMonitor.5=Actual number of imported records \: +ImportDialogProcessMonitor.8=Processing data... +ImportProcessMonitorDialog.0=Imported records \: +ImportXMLDialogProcessMonitor.1 = Overwrite data +ImportXMLDialogProcessMonitor.2 = Import only non-conflicting plots +InfiniteProgressMonitor.0=Cancel operation +JFileChooserExistsAware.0=Collect Earth Project file +KmlImportService.13=Select a CSV file to save the plot locations to +MissingPlotsListener.0=Error while getting information about plots not present on the Database +MissingPlotsListener.10=Total number of plots in the sampling design \: +MissingPlotsListener.12=Number of missing plots \: +MissingPlotsListener.14=All the plots are filled\! +MissingPlotsListener.1=Missing plots +MissingPlotsListener.2=Copy contents to clipboard +MissingPlotsListener.3=Pick the files that contain plot information ( .csv or .ced files ) for which you want to know if all data has been filled. +MissingPlotsListener.4=Missing plots - information +MissingPlotsListener.5=From file \: +MissingPlotsListener.6=Export to CED file +NO=No +NO_TO_ALL=No to all +OpenTextFileListener.0=The text file was not found at \: +OptionWizard.0=Collect Earth options +OptionWizard.100=Open Planet imagery +OptionWizard.101=Planet API key +OptionWizard.1021=URL SecureWatch +OptionWizard.102=Open Maxar SecureWatch +OptionWizard.103=Set URL for Extra Map (opens when set) \: +OptionWizard.104=Browsers +OptionWizard.105=Open Earth Map +OptionWizard.110=Use NICFI provided Monthly imagery +OptionWizard.10=Open backup folder +OptionWizard.11=Unknown\: use ifconfig +OptionWizard.12=Client Instance +OptionWizard.13=Collect Earth Server IP +OptionWizard.14=Collect Earth Server port (e.g. 8023) +OptionWizard.15=Save & Apply changes OptionWizard.16=ID -OptionWizard.17=Tá»a độ X -OptionWizard.18=Tá»a độ Y -OptionWizard.19=Äá»™ cao -OptionWizard.2=Dòng công tác (máy chá»§/khách) -OptionWizard.20=Ná»™i dung cá»§a Google Earth đã thay đổi.
Äá» nghị chấp nhận tải lại ná»™i dung khi Google Earth gợi ý. -OptionWizard.21=Cập nhật thành công -OptionWizard.22=Dốc -OptionWizard.23=Có lá»—i khi mở lại dữ liệu Google Earth -OptionWizard.24=Há»§y -OptionWizard.25=Mode vận hành -OptionWizard.26=NÆ¡i lưu cÆ¡ sở dữ liệu -OptionWizard.27=Äây không phải là thư mục Saiku (hiện không có file start-saiku.bat) -OptionWizard.28=Không nhận được máy chá»§ Saiku -OptionWizard.29=Cổng cÆ¡ sở dữ liệu -OptionWizard.3=Ví dụ cá»§a máy chá»§ -OptionWizard.30=Các lá»±a chá»n cá»§a SQLite -OptionWizard.31=Dữ liệu mẫu -OptionWizard.32=SÆ¡ đồ mẫu -OptionWizard.33=Äịnh nghÄ©a khảo sát -OptionWizard.34=Nâng cao -OptionWizard.35=Số Ä‘iểm mẫu -OptionWizard.36=Khoảng cách giữa các Ä‘iểm mẫu (tính theo mét) -OptionWizard.37=Lá» vá»›i biên ô (tính theo mét) -OptionWizard.38=Không Ä‘á»c được đúng file CSV/CED.
Cần có dấu phảy để phân tách giá trị giống như sau \:
-OptionWizard.39=ID,Tá»a độ Y,tá»a độ X,độ cao,độ dốc,tá»· lệ -OptionWizard.4=Äịa chỉ IP hiện tại cá»§a máy tính\: -OptionWizard.40=Các project -OptionWizard.41=tải file project má»›i -OptionWizard.42=Lá»—i khi đóng CSV reader -OptionWizard.43=Tên khảo sát -OptionWizard.44=tá»± động lưu dá»± phòng dữ liệu tại -OptionWizard.45=Mở Earth Engine để phóng to vào khu vá»±c ô -OptionWizard.46=Mở Earth Engine timelapse cho khu vá»±c ô -OptionWizard.47=Mở Bing Maps cho khu vá»±c ô -OptionWizard.48=Mở form trên browser thay vì mở Google Earth (khuyến cáo cho LINUX) -OptionWizard.49=ÄÆ°á»ng dẫn tá»›i file ced/csv file vá»›i dữ liệu ô -OptionWizard.5=Cổng máy chá»§ Collect Earth\: +OptionWizard.17=X-coord +OptionWizard.18=Y-coord +OptionWizard.19=Elevation +OptionWizard.1=Choose Browser +OptionWizard.20=The Google Earth contents have been changed.
Please accept the content reload when you are prompted by Google Earth. +OptionWizard.21=Update successful +OptionWizard.22=Slope +OptionWizard.23=There was an error when re-opening the Google Earth data +OptionWizard.24=Cancel +OptionWizard.25=Operation Mode +OptionWizard.26=DB host +OptionWizard.27=This is not a recognized Saiku Folder ( the start-saiku.bat file is not present) +OptionWizard.28=Saiku Server not recognized +OptionWizard.29=DB port +OptionWizard.2=Workflow (server/client) +OptionWizard.30=SQLite options +OptionWizard.31=Sample data +OptionWizard.32=Plot layout +OptionWizard.33=Survey Definition +OptionWizard.34=Integrated Services +OptionWizard.35=Number of control points +OptionWizard.36=Distance between control points (in meters) +OptionWizard.37=Margin with plot border (in meters) +OptionWizard.38=The CSV/CED file cannot be read correctly.
The file is expected to have a comma separated values like this \:
+OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect +OptionWizard.3=Server Instance +OptionWizard.40=Projects +OptionWizard.41=Load a new project file +OptionWizard.42=Error when closing the CSV reader +OptionWizard.43=Name of survey +OptionWizard.44=automatically back-up database at +OptionWizard.45=Open Earth Engine Playground ( deprecated ) +OptionWizard.46=Open Earth Engine Timelapse +OptionWizard.47=Open Bing Maps +OptionWizard.48=Open form on a browser instead of Google Earth (recommended for LINUX) +OptionWizard.49=Path to ced/csv file with plot data +OptionWizard.4=Current computer IP \: OptionWizard.50=Browse... -OptionWizard.51=Lá»—i nhập file project -OptionWizard.52=File CSV/CED chỉ có tá»a độ -OptionWizard.53=Ô vuông -OptionWizard.54=Äiểm trung tâm -OptionWizard.55=Lá»—i khi nhập thư mục project -OptionWizard.56=Tải project -OptionWizard.57=Các project đã tải -OptionWizard.58=Mở GEE Code Editor (cần phải có quyá»n truy cập Trusted Tester) -OptionWizard.59=Mở Here Maps tập trung vào ô -OptionWizard.6=Các thông số cá»§a CSDL PostgreSQL -OptionWizard.65=ÄÆ°á»ng dẫn tá»›i thư mục Saiku +OptionWizard.51=Error importing project file +OptionWizard.52=CSV/CED file with only coordinates +OptionWizard.53=No points +OptionWizard.54=Central point +OptionWizard.55=Error importing project folder +OptionWizard.56=Load project +OptionWizard.57=Previously loaded projects +OptionWizard.58=Open GEE Code Editor (requires Trusted Tester access) +OptionWizard.59=Open Here Maps focused on the plot +OptionWizard.5=Collect Earth Server port\: +OptionWizard.65=Path to Saiku folder OptionWizard.66=Browse... -OptionWizard.67=ÄÆ°á»ng dẫn tá»›i Firefox executable (file exe) +OptionWizard.67=Path to Firefox executable OptionWizard.68=Browse... -OptionWizard.7=Tên ngưá»i sá»­ dụng -OptionWizard.70=File chạy -OptionWizard.72=File nhị phân -OptionWizard.73=ÄÆ°á»ng dẫn tá»›i Chrome executable (file exe) +OptionWizard.6=PostgreSQL DB parameters +OptionWizard.70=Executable files +OptionWizard.72=Binary files +OptionWizard.73=Path to Chrome executable OptionWizard.74=Browse... -OptionWizard.76=File exe -OptionWizard.78=File nhị phân -OptionWizard.79=ÄÆ°á»ng dẫn tá»›i KML Freemarker template -OptionWizard.8=Mật khẩu +OptionWizard.76=Executable files +OptionWizard.78=Binary files +OptionWizard.79=Path to KML Freemarker template +OptionWizard.7=User Name OptionWizard.80=Browse... OptionWizard.82=Freemarker template -OptionWizard.83=ÄÆ°á»ng dẫn tá»›i mẫu thiết kế HTML Balloon +OptionWizard.83=Path to HTML Balloon form design OptionWizard.84=Browse... OptionWizard.86=HTML webpage -OptionWizard.87=ÄÆ°á»ng dẫn tá»›i XML vá»›i định nghÄ©a IDM +OptionWizard.87=Path to XML with IDM definition OptionWizard.88=Browse... -OptionWizard.9=Tên CSDL -OptionWizard.90=Äịnh nghÄ©a XML IDM -OptionWizard.91=Máy chá»§ (phiên bản quản lý hoặc sá»­ dụng độc lập) -OptionWizard.92=Khách (ngưá»i sá»­ dụng/kết nối vá»›i máy chá»§) -OptionWizard.93=SQLite (tích hợp/file đơn lẻ) +OptionWizard.8=Password +OptionWizard.90=XML IDM definition +OptionWizard.91=Server (manager version or stand-alone use) +OptionWizard.92=Client (operator/connected to server) +OptionWizard.93=SQLite (Embedded/single file based) OptionWizard.94=PostgreSQL -SaikuAnalysisListener.0=Yes - Làm má»›i lại dữ liệu Saiku (quá trình dài) -SaikuAnalysisListener.1=No - chỉ khởi động Saiku -SaikuStarter.1=Khởi động Saiku -SaikuStarter.2=Cần vài phút để khởi động Saiku, xin đợi\! -SaveEarthDataServlet.0=Yêu cầu trống -SaveEarthDataServlet.1=Có trục trặc khi ghi dữ liệu vào CSDL -SaveEarthDataServlet.2=Dữ liệu đã được ghi -SlopeCode.0=Bằng phẳng (0-5) -EarthApp.11=Collect Earth Ä‘ang chạy -EarthApp.21=Không tìm thấy file chứa lưới ô trong đưá»ng dẫn đã chá»n \:
-EarthApp.23=Chưa thiết lập file CSV/CED \:

-EarthApp.24=Không tìm thấy file chứa Freemarker template vá»›i định nghÄ©a KML trong đưá»ng dẫn đã chá»n\:
-EarthApp.26=Chưa thiết lập file định nghĩa KML d\:

-EarthApp.27=Không tìm thấy file chứa mẫu HTML balloon trong đưá»ng dẫn đã chá»n\:
-EarthApp.29=Chưa thiết lập file HTML balloon \:

-EarthApp.3=Nhắc nhở sau -EarthApp.30=Xin hãy Ä‘iá»u chỉnh đúng địa chỉ file trong Tools->Properties menu. -EarthApp.4=Cập nhật luôn -EarthApp.5=Không nhắc nữa -EarthApp.57=Äã có phiên bản má»›i cá»§a Collect Earth\!
Bạn muốn làm tiếp như thế nào? -EarthApp.58=Thông báo cập nhật -EarthApp.59=Lỗi khi nhập file project -EarthApp.6=\ - Phiên bản -EarthApp.61=Không mở được file Collect Earth.
Äá» nghị đảm bảo đã cài đặt Google Earth. -EarthSurveyService.9=Trưá»ng bắt buá»™c -ExportActionListener.1=Chá»n ngày xuất bản ghi -ExportDialogProcessMonitor.0=Äang xá»­ lý dữ liệu... -ExportDialogProcessMonitor.1=Äang đợi khởi động quá trình\: -ExportDialogProcessMonitor.4=Các bản ghi đã xuất\: -ImportProcessMonitorDialog.0=Các bản ghi đã nhập\: -ImportActionListener.0=Có nhập dữ liệu các ô chưa được Ä‘iá»n đầy đủ không? -ImportActionListener.2=Nếu bạn chá»n NO sẽ chỉ nhập dữ liệu cá»§a các ô có trạng thái màu "xanh lá cây", các ô đã có đầy đủ dữ liệu. -ImportActionListener.3=Nhập các bản ghi chưa hoàn tất -ImportDialogProcessMonitor.0=\ ÄANG TÃNH TOÃN -ImportDialogProcessMonitor.11=Số lượng ban đầu các bản ghi\: -ImportDialogProcessMonitor.2=Äang nhập các bản ghi... -ImportDialogProcessMonitor.5=Số lượng thá»±c tế các bản ghi đã nhập\: -ImportDialogProcessMonitor.8=Äang xá»­ lý dữ liệu... -InfiniteProgressMonitor.0=Há»§y lệnh -JFileChooserExistsAware.0=File project cá»§a Collect Earth -KmlImportService.13=Chá»n file CSV file để ghi địa Ä‘iểm cá»§a ô vào -MissingPlotsListener.0=Lá»—i khi lấy thông tin vỠô không có trong CSDL -MissingPlotsListener.1=Các ô thiếu -MissingPlotsListener.10=Tổng số ô trong thiết kế chá»n mẫu \: -MissingPlotsListener.12=Số ô thiếu\: -MissingPlotsListener.14=Äã Ä‘iá»n tất cả các ô\! -MissingPlotsListener.2=Sao chép ná»™i dung vào bàn phím -MissingPlotsListener.3=Lá»±a chá»n file có chứa thông tin ô ( file .csv hoặc .ced ) mà bạn muốn biết đã Ä‘iá»n đủ dữ liệu chưa. -MissingPlotsListener.4=Các ô thiếu - thông tin -MissingPlotsListener.5=Từ file \: -MissingPlotsListener.6=Xuất ra file CED -ProcessMonitorDialog.1=Tìm lá»—i trên số dòng -ProcessMonitorDialog.4=, cá»™t -ProcessMonitorDialog.5=\ -- giá trị +OptionWizard.95=Side of the sampling dots (in meters) +OptionWizard.9=DB Name +ProcessMonitorDialog.1=Parsing error on row number +ProcessMonitorDialog.4=, columns +ProcessMonitorDialog.5=\ -- values +SaikuAnalysisListener.0=Yes - Refresh Saiku data (long process) +SaikuAnalysisListener.1=No - Use same version of the data as last time Saiku was used +SaikuStarter.1=Starting Saiku +SaikuStarter.2=Starting Saiku can take some minutes, please wait\! +SaikuToolExportListener.1=Saiku Tool generation +SaikuToolExportListener.2=Generating Saiku Tool with current database +SaveEarthDataServlet.0=Empty request +SaveEarthDataServlet.1=Problem occurred while saving data to the database +SaveEarthDataServlet.2=The data was saved +SlopeCode.0=Flat (0-5) +YES=Yes +YES_TO_ALL=Yes to all + +GenerateDatabaseStarter.1=Preparing for analysis +GenerateDatabaseStarter.2=Generating Relational Database + +IPCCGeneratorListener.1=Waiting for process to complete\! +IPCCGeneratorListener.2=The IPCC GHGi compatible data is being generated +IPCCGeneratorListener.3=Refresh the data (update with latest from Collect Earth) +IPCCGeneratorListener.4=Use the latest generated database (fastest process - no update) +IPCCGeneratorListener.5=GHGi Database generation +IPCCGeneratorListener.6=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming but it is necessary if the Collect Earth data has been updated since the last time.
\ No newline at end of file From 35da2492e5816915b5456b488d34adad2ceef52c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:36:37 +0100 Subject: [PATCH 0813/1620] New translations utf8_orig_Messages_hi.properties (Spanish) --- .../earth/app/view/Messages_es.properties | 446 +++++++++--------- 1 file changed, 225 insertions(+), 221 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 353fe0d367..f0355142d0 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,221 +1,225 @@ -AboutDialog.19=Äã có lá»—i -AboutDialog.5=Truy cập website cá»§a chúng tôi để biết thêm thông tin OpenForis.org -AboutDialog.6=Xin lá»—i, đã có sá»± cố khi mở link trong brower chuẩn trong hệ thống cá»§a bạn. -AboutDialog.8=Ok -AspectCode.0=Bắc -AspectCode.1=Äông-Bắc -AspectCode.2=Äông -AspectCode.3=Äông-Nam -AspectCode.4=Nam -AspectCode.5=Tây-Nam -AspectCode.6=Tây -AspectCode.7=Tây-Bắc -CollectEarthWindow.0=Lá»—i khi xuất dữ liệu sang file CSV -CollectEarthWindow.1=Lá»—i xuất dữ liệu -CollectEarthWindow.10=File -CollectEarthWindow.11=Thoát -CollectEarthWindow.12=Công cụ -CollectEarthWindow.13=Xuất dữ liệu ra CSV -CollectEarthWindow.14=Khởi động SAIKU Analysis -CollectEarthWindow.15=Thuá»™c tính -CollectEarthWindow.16=Trợ giúp -CollectEarthWindow.17=Thông tin công bố -CollectEarthWindow.18=Tìm ô thiếu trong cÆ¡ sở dữ liệu -CollectEarthWindow.19=Collect Earth -CollectEarthWindow.2=Ngôn ngữ -CollectEarthWindow.20=Số bản ghi trùng\: -CollectEarthWindow.21=Không tìm thấy biểu tượng cho khung chính -CollectEarthWindow.22=Bạn có chắc là muốn đóng Collect Earth?
Äóng cá»­a sổ cÅ©ng đóng luôn máy chá»§ Collect Earth -CollectEarthWindow.23=Cần khẳng định -CollectEarthWindow.24=Xuất ra XML -CollectEarthWindow.25=Bạn có muốn thêm các bản ghi này và bá» Ä‘i dữ liệu hiện thá»i không? -CollectEarthWindow.26=Ngưá»i sá»­ dụng -CollectEarthWindow.27=Cập nhật -CollectEarthWindow.28=Máy chá»§ Open Foris Collect Earth phải chạy khi ngưá»i sá»­ dụng giải Ä‘oán dữ liệu. -CollectEarthWindow.29=Chưa xác định cấu hình cho Máy chá»§ Saiku. -CollectEarthWindow.3=\ Lá»—i nhập -CollectEarthWindow.30=Äể mở cá»­a sổ này khi Ä‘ang sá»­ dụng Google Earth. -CollectEarthWindow.31=Xuất dữ liệu đã thu thập sang file CSV -CollectEarthWindow.32=Thoát -CollectEarthWindow.33=Tên ngưá»i sá»­ dụng phải dài hÆ¡n 5 chữ cái và ngắn hÆ¡n 50 chữ cái -CollectEarthWindow.34=Lá»—i kiểm chứng -CollectEarthWindow.35=TÊN NGƯỜI SỬ DỤNG CÃ’N TRá»NG\!
Hãy Ä‘iá»n tên ngưá»i sá»­ dụng và nhắp phím "Update". -CollectEarthWindow.36=Không được để trống phần tên ngưá»i sá»­ dụng -CollectEarthWindow.37=Äể mở -CollectEarthWindow.38=file CSV -CollectEarthWindow.39=THÔNG BÃO\: Nên lưu dá»± phòng dữ liệu hiện thá»i(Xuất ra XML) trước khi nhập dữ liệu má»›i -CollectEarthWindow.4=Thông tin công bố cá»§a FAO -CollectEarthWindow.40=Thiết lập đưá»ng dẫn tá»›i thư mục cài đặt Saiku Server trong Tools->Properties->Advanced tab. -CollectEarthWindow.41=Ghi dữ liệu xuất ra vào file\: -CollectEarthWindow.42=Thoát -CollectEarthWindow.43=Tìm thấy bản ghi có mâu thuẫn -CollectEarthWindow.44=Nhập/Xuất dữ liệu -CollectEarthWindow.45=Xuất dữ liệu ra XML (nén) -CollectEarthWindow.46=Nhập dữ liệu má»›i từ file ZIP (XML nén) -CollectEarthWindow.55=Cập nhật các bản ghi hiện thá»i bằng CSV -CollectEarthWindow.47=Chưa định cấu hình cho Saiku Server -CollectEarthWindow.48=ZIP files -CollectEarthWindow.49=Files CSV tổng hợp -CollectEarthWindow.5=Äóng -CollectEarthWindow.50=Mở hướng dẫn ngưá»i sá»­ dụng -CollectEarthWindow.51=Kiểm tra cập nhật cá»§a Collect Earth -CollectEarthWindow.52=Mở file nhật ký ứng dụng -CollectEarthWindow.53=File nhật ký cá»§a Collect Earth -CollectEarthWindow.54=Nạp các Ä‘iểm từ KML -CollectEarthWindow.56=Vá»... -CollectEarthWindow.57=Äang chạy quá trình khởi động Saiku, xin đợi. -CollectEarthWindow.58=Không thể khởi động Saiku analysis -CollectEarthWindow.59=Bạn có muốn tạo lại bá»™ dữ liệu cho Saiku analysis không?
Quá trình này sẽ mất một vài phút.
Nếu bạn chá»n "YES" sẽ tạo ra má»™t bá»™ dữ liệu má»›i vá»›i các thông tin cập nhật nhất. -CollectEarthWindow.6=Xuất ra bảng tổng hợp -CollectEarthWindow.60=Tạo dữ liệu Saiku -CollectEarthWindow.61=Xuất dữ liệu ra XML (các bản ghi chỉnh sá»­a từ lần xuất trước) -CollectEarthWindow.62=Vá»... -CollectEarthWindow.63=Lá»—i khi nạp Ä‘iểm từ KML -CollectEarthWindow.64=Há»— trợ kỹ thuật -CollectEarthWindow.7=Lá»—i khi nhập dữ liệu -CollectEarthWindow.8=Không tìm thấy văn bản thông báo -CollectEarthWindow.9=Dữ liệu nhập vào có chứa các bản ghi đã có trong cÆ¡ sở dữ liệu cá»§a bạn. -DynamicsCode.0=Ban đầu là rừng -DynamicsCode.1=Ban đầu là trảng cá» -DynamicsCode.2=Ban đầu là khu dân cư -DynamicsCode.3=Ban đầu là đất khác -DynamicsCode.4=Ban đầu là đất ngập nước -DynamicsCode.5=Ban đầu là đất trồng trá»t -OpenTextFileListener.0=không tìm thấy file văn bản tại\: -OptionWizard.0=Các lá»±a chá»n cá»§a Collect Earth -OptionWizard.1=Chá»n Browser -OptionWizard.10=Mở thư mục lưu dá»± phòng -OptionWizard.11=Không biết\: hãy sá»­ dụng ifconfig -OptionWizard.12=Vi dụ cá»§a khác -OptionWizard.13=Äịa chỉ IP cá»§a máy chá»§ Collect Earth -OptionWizard.14=Cổng máy chá»§ Collect Earth (vd\: 8023) -OptionWizard.15=Ghi và áo dụng thay đổi -OptionWizard.16=ID -OptionWizard.17=Tá»a độ X -OptionWizard.18=Tá»a độ Y -OptionWizard.19=Äá»™ cao -OptionWizard.2=Dòng công tác (máy chá»§/khách) -OptionWizard.20=Ná»™i dung cá»§a Google Earth đã thay đổi.
Äá» nghị chấp nhận tải lại ná»™i dung khi Google Earth gợi ý. -OptionWizard.21=Cập nhật thành công -OptionWizard.22=Dốc -OptionWizard.23=Có lá»—i khi mở lại dữ liệu Google Earth -OptionWizard.24=Há»§y -OptionWizard.25=Mode vận hành -OptionWizard.26=NÆ¡i lưu cÆ¡ sở dữ liệu -OptionWizard.27=Äây không phải là thư mục Saiku (hiện không có file start-saiku.bat) -OptionWizard.28=Không nhận được máy chá»§ Saiku -OptionWizard.29=Cổng cÆ¡ sở dữ liệu -OptionWizard.3=Ví dụ cá»§a máy chá»§ -OptionWizard.30=Các lá»±a chá»n cá»§a SQLite -OptionWizard.31=Dữ liệu mẫu -OptionWizard.32=SÆ¡ đồ mẫu -OptionWizard.33=Äịnh nghÄ©a khảo sát -OptionWizard.34=Nâng cao -OptionWizard.35=Số Ä‘iểm mẫu -OptionWizard.36=Khoảng cách giữa các Ä‘iểm mẫu (tính theo mét) -OptionWizard.37=Lá» vá»›i biên ô (tính theo mét) -OptionWizard.38=Không Ä‘á»c được đúng file CSV/CED.
Cần có dấu phảy để phân tách giá trị giống như sau \:
-OptionWizard.39=ID,Tá»a độ Y,tá»a độ X,độ cao,độ dốc,tá»· lệ -OptionWizard.4=Äịa chỉ IP hiện tại cá»§a máy tính\: -OptionWizard.40=Các project -OptionWizard.41=tải file project má»›i -OptionWizard.42=Lá»—i khi đóng CSV reader -OptionWizard.43=Tên khảo sát -OptionWizard.44=tá»± động lưu dá»± phòng dữ liệu tại -OptionWizard.45=Mở Earth Engine để phóng to vào khu vá»±c ô -OptionWizard.46=Mở Earth Engine timelapse cho khu vá»±c ô -OptionWizard.47=Mở Bing Maps cho khu vá»±c ô -OptionWizard.48=Mở form trên browser thay vì mở Google Earth (khuyến cáo cho LINUX) -OptionWizard.49=ÄÆ°á»ng dẫn tá»›i file ced/csv file vá»›i dữ liệu ô -OptionWizard.5=Cổng máy chá»§ Collect Earth\: -OptionWizard.50=Browse... -OptionWizard.51=Lá»—i nhập file project -OptionWizard.52=File CSV/CED chỉ có tá»a độ -OptionWizard.53=Ô vuông -OptionWizard.54=Äiểm trung tâm -OptionWizard.55=Lá»—i khi nhập thư mục project -OptionWizard.56=Tải project -OptionWizard.57=Các project đã tải -OptionWizard.58=Mở GEE Code Editor (cần phải có quyá»n truy cập Trusted Tester) -OptionWizard.59=Mở Here Maps tập trung vào ô -OptionWizard.6=Các thông số cá»§a CSDL PostgreSQL -OptionWizard.65=ÄÆ°á»ng dẫn tá»›i thư mục Saiku -OptionWizard.66=Browse... -OptionWizard.67=ÄÆ°á»ng dẫn tá»›i Firefox executable (file exe) -OptionWizard.68=Browse... -OptionWizard.7=Tên ngưá»i sá»­ dụng -OptionWizard.70=File chạy -OptionWizard.72=File nhị phân -OptionWizard.73=ÄÆ°á»ng dẫn tá»›i Chrome executable (file exe) -OptionWizard.74=Browse... -OptionWizard.76=File exe -OptionWizard.78=File nhị phân -OptionWizard.79=ÄÆ°á»ng dẫn tá»›i KML Freemarker template -OptionWizard.8=Mật khẩu -OptionWizard.80=Browse... -OptionWizard.82=Freemarker template -OptionWizard.83=ÄÆ°á»ng dẫn tá»›i mẫu thiết kế HTML Balloon -OptionWizard.84=Browse... -OptionWizard.86=HTML webpage -OptionWizard.87=ÄÆ°á»ng dẫn tá»›i XML vá»›i định nghÄ©a IDM -OptionWizard.88=Browse... -OptionWizard.9=Tên CSDL -OptionWizard.90=Äịnh nghÄ©a XML IDM -OptionWizard.91=Máy chá»§ (phiên bản quản lý hoặc sá»­ dụng độc lập) -OptionWizard.92=Khách (ngưá»i sá»­ dụng/kết nối vá»›i máy chá»§) -OptionWizard.93=SQLite (tích hợp/file đơn lẻ) -OptionWizard.94=PostgreSQL -SaikuAnalysisListener.0=Yes - Làm má»›i lại dữ liệu Saiku (quá trình dài) -SaikuAnalysisListener.1=No - chỉ khởi động Saiku -SaikuStarter.1=Khởi động Saiku -SaikuStarter.2=Cần vài phút để khởi động Saiku, xin đợi\! -SaveEarthDataServlet.0=Yêu cầu trống -SaveEarthDataServlet.1=Có trục trặc khi ghi dữ liệu vào CSDL -SaveEarthDataServlet.2=Dữ liệu đã được ghi -SlopeCode.0=Bằng phẳng (0-5) -EarthApp.11=Collect Earth Ä‘ang chạy -EarthApp.21=Không tìm thấy file chứa lưới ô trong đưá»ng dẫn đã chá»n \:
-EarthApp.23=Chưa thiết lập file CSV/CED \:

-EarthApp.24=Không tìm thấy file chứa Freemarker template vá»›i định nghÄ©a KML trong đưá»ng dẫn đã chá»n\:
-EarthApp.26=Chưa thiết lập file định nghĩa KML d\:

-EarthApp.27=Không tìm thấy file chứa mẫu HTML balloon trong đưá»ng dẫn đã chá»n\:
-EarthApp.29=Chưa thiết lập file HTML balloon \:

-EarthApp.3=Nhắc nhở sau -EarthApp.30=Xin hãy Ä‘iá»u chỉnh đúng địa chỉ file trong Tools->Properties menu. -EarthApp.4=Cập nhật luôn -EarthApp.5=Không nhắc nữa -EarthApp.57=Äã có phiên bản má»›i cá»§a Collect Earth\!
Bạn muốn làm tiếp như thế nào? -EarthApp.58=Thông báo cập nhật -EarthApp.59=Lỗi khi nhập file project -EarthApp.6=\ - Phiên bản -EarthApp.61=Không mở được file Collect Earth.
Äá» nghị đảm bảo đã cài đặt Google Earth. -EarthSurveyService.9=Trưá»ng bắt buá»™c -ExportActionListener.1=Chá»n ngày xuất bản ghi -ExportDialogProcessMonitor.0=Äang xá»­ lý dữ liệu... -ExportDialogProcessMonitor.1=Äang đợi khởi động quá trình\: -ExportDialogProcessMonitor.4=Các bản ghi đã xuất\: -ImportProcessMonitorDialog.0=Các bản ghi đã nhập\: -ImportActionListener.0=Có nhập dữ liệu các ô chưa được Ä‘iá»n đầy đủ không? -ImportActionListener.2=Nếu bạn chá»n NO sẽ chỉ nhập dữ liệu cá»§a các ô có trạng thái màu "xanh lá cây", các ô đã có đầy đủ dữ liệu. -ImportActionListener.3=Nhập các bản ghi chưa hoàn tất -ImportDialogProcessMonitor.0=\ ÄANG TÃNH TOÃN -ImportDialogProcessMonitor.11=Số lượng ban đầu các bản ghi\: -ImportDialogProcessMonitor.2=Äang nhập các bản ghi... -ImportDialogProcessMonitor.5=Số lượng thá»±c tế các bản ghi đã nhập\: -ImportDialogProcessMonitor.8=Äang xá»­ lý dữ liệu... -InfiniteProgressMonitor.0=Há»§y lệnh -JFileChooserExistsAware.0=File project cá»§a Collect Earth -KmlImportService.13=Chá»n file CSV file để ghi địa Ä‘iểm cá»§a ô vào -MissingPlotsListener.0=Lá»—i khi lấy thông tin vỠô không có trong CSDL -MissingPlotsListener.1=Các ô thiếu -MissingPlotsListener.10=Tổng số ô trong thiết kế chá»n mẫu \: -MissingPlotsListener.12=Số ô thiếu\: -MissingPlotsListener.14=Äã Ä‘iá»n tất cả các ô\! -MissingPlotsListener.2=Sao chép ná»™i dung vào bàn phím -MissingPlotsListener.3=Lá»±a chá»n file có chứa thông tin ô ( file .csv hoặc .ced ) mà bạn muốn biết đã Ä‘iá»n đủ dữ liệu chưa. -MissingPlotsListener.4=Các ô thiếu - thông tin -MissingPlotsListener.5=Từ file \: -MissingPlotsListener.6=Xuất ra file CED -ProcessMonitorDialog.1=Tìm lá»—i trên số dòng -ProcessMonitorDialog.4=, cá»™t -ProcessMonitorDialog.5=\ -- giá trị +AboutDialog.19=कोई समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ +AboutDialog.5=अधिक जानकारी के लिठहमारी वेबसाइट पर जाà¤? OpenForis.org? +AboutDialog.6=कà¥à¤·à¤®à¤¾ करें, à¤à¤• समसà¥à¤¯à¤¾ आपके सिसà¥à¤Ÿà¤® के मानक बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में इस लिंक को खोलने की कोशिश कर रही है. +AboutDialog.8=ठीक +AspectCode.0=उतà¥à¤¤à¤° दिशा +AspectCode.1=उतà¥à¤¤à¤°-पूरà¥à¤µ दिशा +AspectCode.2=पूरà¥à¤µ दिशा +AspectCode.3=दकà¥à¤·à¤¿à¤£-पूरà¥à¤µ दिशा +AspectCode.4=दकà¥à¤·à¤¿à¤£ दिशा +AspectCode.5=दकà¥à¤·à¤¿à¤£-पशà¥à¤šà¤¿à¤® दिशा +AspectCode.6=पशà¥à¤šà¤¿à¤® दिशा +AspectCode.7=उतà¥à¤¤à¤°-पशà¥à¤šà¤¿à¤® दिशा +CollectEarthWindow.0=तà¥à¤°à¥à¤Ÿà¤¿ जब सीà¤à¤¸à¤µà¥€ फ़ाइल में डेटा निरà¥à¤¯à¤¾à¤¤ करने का पà¥à¤°à¤¯à¤¾à¤¸ +CollectEarthWindow.1=निरà¥à¤¯à¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.10=फ़ाइल +CollectEarthWindow.11=बाहर जाà¤à¤‚ +CollectEarthWindow.12=उपकरण +CollectEarthWindow.13=डेटा सीà¤à¤¸à¤µà¥€ निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.14=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ +CollectEarthWindow.15=गà¥à¤£ +CollectEarthWindow.16=मदद +CollectEarthWindow.17=असà¥à¤µà¥€à¤•रण +CollectEarthWindow.18=डेटाबेस में लापता भूखंडों खोजें +CollectEarthWindow.19=पृथà¥à¤µà¥€ इकटà¥à¤ à¤¾ +CollectEarthWindow.2=भाषा +CollectEarthWindow.20=डà¥à¤ªà¥à¤²à¤¿à¤•ेट रिकॉरà¥à¤¡ की संखà¥à¤¯à¤¾\: +CollectEarthWindow.21=मà¥à¤–à¥à¤¯ फà¥à¤°à¥‡à¤® के लिठआइकन नहीं मिल सकता है +CollectEarthWindow.22=आपको लगता है कि आप à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ बंद करना चाहते हैं? विंडोज बंद करने से, à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° बंद हो जाà¤à¤—ा +CollectEarthWindow.23=पà¥à¤·à¥à¤Ÿà¤¿ की जरूरत है +CollectEarthWindow.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.25=आप वैसे भी इन अभिलेखों को जोड़ना चाहते हैं और अपने वरà¥à¤¤à¤®à¤¾à¤¨ डेटा खोने के लिठकिलक करना चाहते हैं? +CollectEarthWindow.26=ऑपरेटर,पà¥à¤°à¤šà¤¾à¤²à¤• +CollectEarthWindow.27=अदà¥à¤¯à¤¤à¤¨ +CollectEarthWindow.28= औपन फौरिस à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° चल रहा होना चाहिठ, जबभी ऑपरेटर डेटा की वà¥à¤¯à¤¾à¤–à¥à¤¯à¤¾ करें . +CollectEarthWindow.29=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. +CollectEarthWindow.3= आयात संबंधी तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.30=जबभी आप गà¥à¤—ल अरà¥à¤¥ का उपयोग कर रहे हैं, कृपया इस विंडोज को खà¥à¤²à¥€ बनाठरखें. +CollectEarthWindow.31=à¤à¤•तà¥à¤° डेटा सीà¤à¤¸à¤µà¥€ फाइल में भेजें +CollectEarthWindow.32=छोड़ना +CollectEarthWindow.33=ऑपरेटर का नाम के 5 अकà¥à¤·à¤° से बड़ा और 50 अकà¥à¤·à¤° से कम होना चाहिठ+CollectEarthWindow.34=मानà¥à¤¯à¤¤à¤¾ तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.35=ऑपरेटर नाम खाली\!
कृपया ऑपरेटर का नाम भरें और "अदà¥à¤¯à¤¤à¤¨" बटन दबाà¤à¤. +CollectEarthWindow.36=ऑपरेटर नाम रिकà¥à¤¤ नहीं हो सकता +CollectEarthWindow.37=खà¥à¤²à¤¾ रखो +CollectEarthWindow.38=सीà¤à¤¸à¤µà¥€ फ़ाइल +CollectEarthWindow.39=सूचना\: यह सलाह दी जाती है कि आप नठडेटा डालने करने से पहले अपने मौजूदा आंकडों को बैकअप(à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤) कर लें +CollectEarthWindow.4=à¤à¤«à¤à¤“ असà¥à¤µà¥€à¤•रण नोटिस +CollectEarthWindow.40=उस फ़ोलà¥à¤¡à¤° पर जाà¤à¤‚ जहां साà¤à¤•ॠसरà¥à¤µà¤° में सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ किया गया है, फ़ोलà¥à¤¡à¤° का रासà¥à¤¤à¤¾ उपकरण> गà¥à¤£> उनà¥à¤¨à¤¤ टैब. +CollectEarthWindow.41=निरà¥à¤¯à¤¾à¤¤ डेटा को फ़ाइल में बचाया जा रहा है \: +CollectEarthWindow.42=छोड़ना +CollectEarthWindow.43=परसà¥à¤ªà¤° विरोधी रिकॉरà¥à¤¡ पाया +CollectEarthWindow.44=डेटा आयात / निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.45=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ डेटा (संकà¥à¤šà¤¿à¤¤) +CollectEarthWindow.46=ज़िप से नठडेटा आयात करें (संकà¥à¤šà¤¿à¤¤ à¤à¤•à¥à¤¸à¤à¤®à¤à¤²) +CollectEarthWindow.55=सीà¤à¤¸à¤µà¥€ का उपयोग कर मौजूदा रिकॉरà¥à¤¡ को अपडेट करें +CollectEarthWindow.47=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. +CollectEarthWindow.48=ज़िप / à¤à¤•तà¥à¤°-डेटा फ़ाइल +CollectEarthWindow.49=फà¥à¤¯à¥‚जन सीà¤à¤¸à¤µà¥€ फ़ाइल +CollectEarthWindow.5=बंद करे +CollectEarthWindow.50= उपयोगकरà¥à¤¤à¤¾ मैनà¥à¤…ल खोलें +CollectEarthWindow.51=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ के अदà¥à¤¯à¤¤à¤¨ के लिठजाà¤à¤š करें +CollectEarthWindow.52= अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— लॉग फ़ाइल खोलें +CollectEarthWindow.53=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ लॉग फ़ाइल +CollectEarthWindow.54=केà¤à¤®à¤à¤² से लोड अंक +CollectEarthWindow.56=के विषय में... +CollectEarthWindow.57=साà¤à¤•ॠसà¥à¤Ÿà¤¾à¤°à¥à¤Ÿà¤° पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ अभी भी चल रहा है, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें. +CollectEarthWindow.58=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ नहीं कर सकते +CollectEarthWindow.59=आप साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ के लिठडेटा सेट फिर से उतà¥à¤ªà¤¨à¥à¤¨ करने के लिठकरना चाहते हैं?
यह पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ समय लेने वाली हो सकती है.
आप यदि "हाà¤"पर कà¥à¤²à¤¿à¤• करें, तो नवीनतम जानकारी के साथ à¤à¤• नया डाटासेट उतà¥à¤ªà¤¨à¥à¤¨ हो जाà¤à¤—ा. +CollectEarthWindow.6=फà¥à¤¯à¥‚जन टेबल के लिठनिरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.60=साà¤à¤•ॠडेटा उतà¥à¤ªà¤¨à¥à¤¨ +CollectEarthWindow.61=डेटा à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ (पिछले निरà¥à¤¯à¤¾à¤¤ के बाद से संशोधित रिकॉरà¥à¤¡) +CollectEarthWindow.62=के विषय मे... +CollectEarthWindow.63=केà¤à¤®à¤à¤² से अंक पà¥à¤°à¤¾à¤ªà¥à¤¤ करने में तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.64=तकनीकी सहायता +CollectEarthWindow.7=डेटा आयात में तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.8=असà¥à¤µà¥€à¤•रण पाठ नहीं पाया जा सका +CollectEarthWindow.9=डेटा आयात रिकॉरà¥à¤¡ वह है जो कि पहले से ही अपने डेटाबेस पर मौजूद हैं शामिल. +DynamicsCode.0=पà¥à¤°à¤¾à¤°à¤‚भ में वन +DynamicsCode.1=पà¥à¤°à¤¾à¤°à¤‚भ में घास का मैदान, +DynamicsCode.2=पà¥à¤°à¤¾à¤°à¤‚भ में आबादी वाला इलाका +DynamicsCode.3=पà¥à¤°à¤¾à¤°à¤‚भ में बंजर +DynamicsCode.4=पà¥à¤°à¤¾à¤°à¤‚भ में आरà¥à¤¦à¥à¤° भूमि +DynamicsCode.5=पà¥à¤°à¤¾à¤°à¤‚भ में खेत +OpenTextFileListener.0=इस पाठ का फ़ाइल नहीं मिला \: +OptionWizard.0= विकलà¥à¤ª +OptionWizard.1=बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° चà¥à¤¨à¥‡à¤‚ +OptionWizard.10=बैकअप फ़ोलà¥à¤¡à¤° खोलें +OptionWizard.11=अजà¥à¤žà¤¾à¤¤\: उपयोग ifconfig +OptionWizard.12=गà¥à¤°à¤¾à¤¹à¤•ों का उलà¥à¤²à¥‡à¤– +OptionWizard.13=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° आईपी +OptionWizard.14=कतà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ (उदाहरण- 8023) +OptionWizard.15=बचाà¤à¤‚ और परिवरà¥à¤¤à¤¨ लागू करें +OptionWizard.16=आईडी +OptionWizard.17=X- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क +OptionWizard.18=Y- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क +OptionWizard.19=उठान +OptionWizard.2=कारà¥à¤¯à¤ªà¥à¤°à¤µà¤¾à¤¹ (सरà¥à¤µà¤° / गà¥à¤°à¤¾à¤¹à¤•) +OptionWizard.20=गूगल अरà¥à¤¥ अंतरà¥à¤µà¤¸à¥à¤¤à¥ बदल दिया गया है
यदि गà¥à¤—ल अरà¥à¤¥ आप से कहे,अंतरà¥à¤µà¤¸à¥à¤¤à¥ पà¥à¤¨à¤ƒ लोड सà¥à¤µà¥€à¤•ार करें . +OptionWizard.21=अदà¥à¤¯à¤¤à¤¨ सफल +OptionWizard.22=ढाल +OptionWizard.23=गूगल अरà¥à¤¥ डेटा को फिर से खोलने में कोई तà¥à¤°à¥à¤Ÿà¤¿ थी +OptionWizard.24=रदà¥à¤¦ करना +OptionWizard.25=ऑपरेशन मोड +OptionWizard.26=डीबी होसà¥à¤Ÿ +OptionWizard.27=यह à¤à¤• मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ साà¤à¤•ॠफ़ोलà¥à¤¡à¤° नहीं है ( सà¥à¤Ÿà¤¾à¤°à¥à¤Ÿ-साà¤à¤•à¥.batफ़ाइल मौजूद नहीं है) +OptionWizard.28=साà¤à¤•ॠसरà¥à¤µà¤° मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ नहीं +OptionWizard.29=डीबी पोरà¥à¤Ÿ +OptionWizard.3=सरà¥à¤µà¤° आवृतà¥à¤¤à¤¿ +OptionWizard.30=à¤à¤¸à¤•à¥à¤¯à¥ लाइट विकलà¥à¤ª +OptionWizard.31=सेमà¥à¤ªà¤² डेटा +OptionWizard.32=पà¥à¤²à¥‰à¤Ÿ लेआउट +OptionWizard.33=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ परिभाषा +OptionWizard.34=विकसित +OptionWizard.35=सेमà¥à¤ªà¤² अंक की संखà¥à¤¯à¤¾ +OptionWizard.36=सेमà¥à¤ªà¤² बिंदॠके बीच दूरी (मीटर में) +OptionWizard.37=भूखंड की सीमा के साथ मारà¥à¤œà¤¿à¤¨ (मीटर मे) +OptionWizard.38=सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सही ढंग से पढ़ा नहीं जा सकता.
इस फ़ाइल में à¤à¤• अलà¥à¤ªà¤µà¤¿à¤°à¤¾à¤® से अलग मूलà¥à¤¯à¥‹à¤‚ की उमà¥à¤®à¥€à¤¦ है \:
+OptionWizard.39=आईडी, वाई समनà¥à¤µà¤¯, à¤à¤•à¥à¤¸ समनà¥à¤µà¤¯, ऊंचाई, ढाल, पहलू +OptionWizard.4=वरà¥à¤¤à¤®à¤¾à¤¨ कंपà¥à¤¯à¥‚टर आईपी \: +OptionWizard.40=परियोजनाà¤à¤‚ +OptionWizard.41=à¤à¤• नई परियोजना फ़ाइल लोड करें +OptionWizard.42=सीà¤à¤¸à¤µà¥€ पाठक को बंद करते समय तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.43=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ का नाम +OptionWizard.44= सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ बैकअप डेटाबेस +OptionWizard.45=ओपन पृथà¥à¤µà¥€ इंजन ने पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° में जूम किया +OptionWizard.46=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठपृथà¥à¤µà¥€ इंजन टाइमलैपà¥à¤¸ खोलें +OptionWizard.47=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठबिंग मैपà¥à¤¸ खोलें +OptionWizard.48=बजाय गूगल अरà¥à¤¥ के फॉरà¥à¤® à¤à¤• बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° पर खोलें (लिनकà¥à¤¸ के लिठसिफारिश) +OptionWizard.49=भूखंड डेटा के साथ सीईडी / सीà¤à¤¸à¤µà¥€ फाइल भेजने के लिठपथ +OptionWizard.5=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ\: +OptionWizard.50=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.51=परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.52=केवल निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क के साथ सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल +OptionWizard.53=चौकोर +OptionWizard.54=केनà¥à¤¦à¥à¤°à¥€à¤¯ बिनà¥à¤¦à¥ +OptionWizard.55=परियोजना फ़ोलà¥à¤¡à¤° आयात तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.56=लोड परियोजना +OptionWizard.57=पहले से लोड परियोजना +OptionWizard.58= जी ई ई का मैदान खोलें (विशà¥à¤µà¤¸à¤¨à¥€à¤¯ जांचकरà¥à¤¤à¤¾ के उपयोग की आवशà¥à¤¯à¤•ता है) +OptionWizard.59=यहां भूखंड पर केंदà¥à¤°à¤¿à¤¤ मैपà¥à¤¸ खोलें +OptionWizard.6=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² डीबी मापदंड +OptionWizard.65=साà¤à¤•à¥à¤«à¤¼à¥‹à¤²à¥à¤¡à¤° का पथ +OptionWizard.66=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.67=फ़ायरफ़ॉकà¥à¤¸ निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ +OptionWizard.68=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.7=उपयोगकरà¥à¤¤à¤¾ नाम +OptionWizard.70=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों +OptionWizard.72=बाइनरी फ़ाइलें +OptionWizard.73=कà¥à¤°à¥‹à¤® निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ +OptionWizard.74=बà¥à¤°à¤¾à¤‰à¤œ +OptionWizard.76=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों +OptionWizard.78=बाइनरी फ़ाइलें +OptionWizard.79=केà¤à¤®à¤à¤² फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ के लिठपथ +OptionWizard.8=पासवरà¥à¤¡ +OptionWizard.80=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.82=फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ +OptionWizard.83=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ पà¥à¤°à¤ªà¤¤à¥à¤° डिज़ाइन करने के लिठपथ +OptionWizard.84=बà¥à¤°à¤¾à¤‰à¤œ..... +OptionWizard.86=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² वेब पेज +OptionWizard.87=पथ आइडीà¤à¤® परिभाषा के साथ à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठ+OptionWizard.88=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.9=डीबी नाम +OptionWizard.90=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² आइडीà¤à¤® परिभाषा +OptionWizard.91=सरà¥à¤µà¤° (पà¥à¤°à¤¬à¤‚धक संसà¥à¤•रण या खड़े अकेले का उपयोग करें) +OptionWizard.92=कà¥à¤²à¤¾à¤‡à¤‚ट (ऑपरेटर / सरà¥à¤µà¤° से जà¥à¤¡à¤¼à¥‡) +OptionWizard.93=सकà¥à¤¯à¥‚à¤à¤²à¤¾à¤‡à¤Ÿ (à¤à¤‚बेडेड / à¤à¤•ल फाइल आधारित) +OptionWizard.94=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² +OptionWizard.95=सेमà¥à¤ªà¤² डॉटà¥à¤¸ के साइड (मीटर में) +SaikuAnalysisListener.0=हाठ- ताज़ा साà¤à¤•ॠडेटा (लंबी पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾) +SaikuAnalysisListener.1=नहीं - बस साà¤à¤•ॠशà¥à¤°à¥‚ +SaikuStarter.1=साà¤à¤•ॠशà¥à¤°à¥‚ +SaikuStarter.2= साà¤à¤•ॠशà¥à¤°à¥‚ कà¥à¤› मिनट लग सकते हैं, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें\! +SaveEarthDataServlet.0=खाली अनà¥à¤°à¥‹à¤§ +SaveEarthDataServlet.1= डेटाबेस में डेटा बचाते समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ है +SaveEarthDataServlet.2=डेटा बचाया था +SlopeCode.0=समतल (0-5) +EarthApp.11=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ पहले से ही चल रहा है +EarthApp.21=à¤à¤• सीà¤à¤¸à¤µà¥€ / सीईडी के रूप में भूखंडों की गà¥à¤°à¤¿à¤¡ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
+EarthApp.23=कोई सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सेट-अप नहीं किया गया है \:

+EarthApp.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² परिभाषा के साथ फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है \:
+EarthApp.26=कोई à¤à¤•à¥à¤¸à¤à¤®à¤à¤² फ़ाइल परिभाषा सेट अप नहीं किया गया है \:

+EarthApp.27=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ रूप से यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
+EarthApp.29=कोई à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ फ़ाइल सेट-अप नहीं किया गया है \:

+EarthApp.3=मà¥à¤à¥‡ बाद में याद दिलाना +EarthApp.30=उपकरण> गà¥à¤£ मेनू में फ़ाइल सà¥à¤¥à¤¾à¤¨ को ठीक करें . +EarthApp.4=अभी अदà¥à¤¯à¤¤à¤¨ करें +EarthApp.5=मà¥à¤à¥‡ दà¥à¤¬à¤¾à¤°à¤¾ याद मत दिलाना +EarthApp.57=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ का à¤à¤• नया संसà¥à¤•रण उपलबà¥à¤§ है\!
आप कैसे आगे बढ़ना चाहते हैं? +EarthApp.58=अदà¥à¤¯à¤¤à¤¨ चेतावनी +EarthApp.59= परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ +EarthApp.6=\ - संसà¥à¤•रण +EarthApp.61=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ फाइल खà¥à¤² नहीं सकती .
कृपया सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करें कि गूगल अरà¥à¤¥ सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ है. +EarthSurveyService.9=आवशà¥à¤¯à¤• कà¥à¤·à¥‡à¤¤à¥à¤° +ExportActionListener.1= तारीख चूनें जबसे रिकॉरà¥à¤¡ निरà¥à¤¯à¤¾à¤¤ करने है +ExportDialogProcessMonitor.0=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... +ExportDialogProcessMonitor.1=पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ पà¥à¤°à¤¾à¤°à¤‚भ करने के लिठपà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ कर रहा है \: +ExportDialogProcessMonitor.4=निरà¥à¤¯à¤¾à¤¤ रिकॉरà¥à¤¡\: +ImportProcessMonitorDialog.0=आयातित रिकॉरà¥à¤¡ \: +ImportActionListener.0=कà¥à¤¯à¤¾ उन भूखंडों के लिठडेटा जो कि पूरी तरह से भरे नहीं गठ,आयातित किया जाना चाहिà¤? +ImportActionListener.2=आप कà¥à¤²à¤¿à¤• करें, नहींतो केवल डेटा "हरी" राजà¥à¤¯ में भूखंडों से ,जिसमें सभी डेटा यà¥à¤•à¥à¤¤ है , आयात किया जाà¤à¤—ा। +ImportDialogProcessMonitor.0=\ गणना +ImportDialogProcessMonitor.11=रिकॉरà¥à¤¡ की पà¥à¤°à¤¾à¤°à¤‚भिक संखà¥à¤¯à¤¾ \: +ImportDialogProcessMonitor.2=रिकॉरà¥à¤¡ आयात... +ImportDialogProcessMonitor.5=आयातित रिकॉरà¥à¤¡ की वासà¥à¤¤à¤µà¤¿à¤• संखà¥à¤¯à¤¾ \: +ImportDialogProcessMonitor.8=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... +InfiniteProgressMonitor.0=रदà¥à¤¦ ऑपरेशन +JFileChooserExistsAware.0=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ परियोजना फ़ाइल +KmlImportService.13=पà¥à¤²à¥‰à¤Ÿ सà¥à¤¥à¤¾à¤¨à¥‹à¤‚ को बचाने के लिठà¤à¤• सीà¤à¤¸à¤µà¥€ फ़ाइल का चयन करें +MissingPlotsListener.0=तà¥à¤°à¥à¤Ÿà¤¿ उन भूखंडों के बारे में जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ करने के लिठजो डेटाबेस पर मौजूद नहीं +MissingPlotsListener.1=गà¥à¤® भूखंड +MissingPlotsListener.10=सेमà¥à¤ªà¤² डिजाइन में भूखंडों की कà¥à¤² संखà¥à¤¯à¤¾ \: +MissingPlotsListener.12=गà¥à¤® भूखंडों की संखà¥à¤¯à¤¾ \: +MissingPlotsListener.14=सभी भूखंडों भर रहे हैं\! +MissingPlotsListener.2=कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ अंतरà¥à¤µà¤¸à¥à¤¤à¥ की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ +MissingPlotsListener.3=भूखंड की जानकारी वाले फ़ाइलें चà¥à¤¨à¥‡à¤‚ ( .सीà¤à¤¸à¤µà¥€ या .सीईडी फ़ाइलें ) जिसके लिठआप जानना चाहते हैं तो सभी डेटा भर दिया गया है चाहता हूà¤. +MissingPlotsListener.4=गà¥à¤® भूखंड- जानकारी +MissingPlotsListener.5=फ़ाइल से \: +MissingPlotsListener.6=सीà¤à¤¡à¥€ फ़ाइल में निरà¥à¤¯à¤¾à¤¤ करें +ProcessMonitorDialog.1=पंकà¥à¤¤à¤¿ संखà¥à¤¯à¤¾ पर तà¥à¤°à¥à¤Ÿà¤¿ +ProcessMonitorDialog.4=, कॉलम +ProcessMonitorDialog.5=\ --मूलà¥à¤¯ +YES= हां +YES_TO_ALL=सब को हां +NO=नहीं +NO_TO_ALL=सभी को नहीं From 37edbcbedde96b07541d63bfc51e216b1ea2f59e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:36:38 +0100 Subject: [PATCH 0814/1620] New translations Messages_tr.properties (French) --- .../earth/app/view/Messages_fr.properties | 487 +++++++++--------- 1 file changed, 232 insertions(+), 255 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 3ce9622fe0..c9742c724a 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,265 +1,242 @@ -AboutDialog.19=A problem occurred -AboutDialog.5=For more information visit our website OpenForis.org -AboutDialog.6=Sorry, a problem occurred while trying to open this link in your system's standard browser. -AboutDialog.8=Ok -AspectCode.0=North -AspectCode.1=North-East -AspectCode.2=East -AspectCode.3=South-East -AspectCode.4=South -AspectCode.5=South-West -AspectCode.6=West -AspectCode.7=North-West -CollectEarthMenu.0=Import CEP file -CollectEarthMenu.2=Utilities -CollectEarthMenu.3=Divide large CSV plot files -CollectEarthMenu.4=Export data to XML (from specific date until present) -CollectEarthMenu.5=Export to Collect Backup -CollectEarthMenu.6=Export data as Collect Backup (all data) -CollectEarthMenu.7=Export data as Collect Backup (from date) -CollectEarthMenu.8=Export data to XML (using summary attribute) -CollectEarthWindow.0=Error when attempting to export data to CSV file -CollectEarthWindow.10=File -CollectEarthWindow.11=Exit -CollectEarthWindow.12=Tools -CollectEarthWindow.13=Download data to CSV (Excel) -CollectEarthWindow.14=Start SAIKU Analysis -CollectEarthWindow.15=Properties -CollectEarthWindow.16=Help -CollectEarthWindow.17=Disclaimer -CollectEarthWindow.18=Find missing plots in database +AboutDialog.19=Bir sorun oluÅŸtu +AboutDialog.5=Daha fazla bilgi için web sitemizi ziyaret edin OpenForis.org +AboutDialog.6=Üzgünüm, sisteminizin varsayılan tarayıcısı bu baÄŸlantıyı açmak isterken bir sorun oluÅŸtu. +AboutDialog.8=Tamam +AspectCode.0=Kuzey +AspectCode.1=Kuzey-doÄŸu +AspectCode.2=DoÄŸu +AspectCode.3=Güney-doÄŸu +AspectCode.4=Güney +AspectCode.5=Güney-batı +AspectCode.6=Batı +AspectCode.7=Kuzey-batı +CollectEarthWindow.0=Veri CSV dosyasına aktarılmaya çalışılırken hata oluÅŸtu +CollectEarthWindow.1=Dışa aktarma hatası +CollectEarthWindow.10=Dosya +CollectEarthWindow.11=Çıkış +CollectEarthWindow.12=Araçlar +CollectEarthWindow.13=Verileri CSV'ye aktar +CollectEarthWindow.14=SAIKU Analysis baÅŸlat +CollectEarthWindow.15=Özellikler +CollectEarthWindow.16=Yardım +CollectEarthWindow.17=Yasal uyarı +CollectEarthWindow.18=Veritabnında eksik plotları bulun CollectEarthWindow.19=Collect Earth -CollectEarthWindow.1=Export error -CollectEarthWindow.20=Number of duplicated records\: -CollectEarthWindow.21=Could not find icon for main frame -CollectEarthWindow.22=Are you sure that you want to close Collect Earth?
Closing the window will also close the Collect Earth server -CollectEarthWindow.23=Confirmation needed -CollectEarthWindow.24=XML Export -CollectEarthWindow.25=Do you want to add these records anyway and lose your current data? -CollectEarthWindow.26=Operator -CollectEarthWindow.27=Update -CollectEarthWindow.28=Open Foris Collect Earth server should be running while the operator interprets data. -CollectEarthWindow.29=The Saiku Server is not configured. -CollectEarthWindow.2=Language -CollectEarthWindow.30=Please maintain this window open while you are using Google Earth. -CollectEarthWindow.31=Export collected data to CSV file -CollectEarthWindow.32=Quit -CollectEarthWindow.33=The operator name has to be longer than 5 characters and shorter than 50 -CollectEarthWindow.34=Validation error -CollectEarthWindow.35=OPERATOR NAME EMPTY\!
Please fill the operator name and press the "Update" button. -CollectEarthWindow.36=Operator name cannot be empty -CollectEarthWindow.37=Keep Open -CollectEarthWindow.38=CSV files -CollectEarthWindow.39=NOTICE\: It is advisable that you back-up your current data (Export to XML) before importing the new data -CollectEarthWindow.3=\ Import error -CollectEarthWindow.40=Set-up the path to the folder where Saiku Server is installed in the Tools->Properties->Advanced tab. -CollectEarthWindow.41=Saving exported data to file\: -CollectEarthWindow.42=Quit -CollectEarthWindow.43=Conflicting records found -CollectEarthWindow.44=Data Import/Export -CollectEarthWindow.45=Export data to XML (compressed) -CollectEarthWindow.46=Import new data from ZIP (compressed XML) -CollectEarthWindow.47=Saiku Server not configured -CollectEarthWindow.48=Zip/collect-data files -CollectEarthWindow.49=Fusion CSV files -CollectEarthWindow.4=FAO Disclaimer notices -CollectEarthWindow.50=Open User Manual -CollectEarthWindow.51=Check for updates of Collect Earth -CollectEarthWindow.52=Open Application Log File -CollectEarthWindow.53=Collect Earth Log file -CollectEarthWindow.54=Load points from KML -CollectEarthWindow.55=Update current records using CSV -CollectEarthWindow.56=About... -CollectEarthWindow.57=The Saiku starter process is still running, please wait. -CollectEarthWindow.58=Cannot start Saiku analysis -CollectEarthWindow.59=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming.
If you click on "YES" a new dataset with the latest information will be generated. -CollectEarthWindow.5=Close -CollectEarthWindow.60=Saiku data generation -CollectEarthWindow.61=Export data to XML (modified records since last export) -CollectEarthWindow.62=About... -CollectEarthWindow.63=Error getting the points from KML -CollectEarthWindow.64=Technical Support -CollectEarthWindow.65=The operator name has been changed -CollectEarthWindow.66=Operator name -CollectEarthWindow.67=Open data folder -CollectEarthWindow.6=Export to Fusion Table -CollectEarthWindow.70=Open the Survey Guide -CollectEarthWindow.71=Generate Stand-Alone Saiku tool -CollectEarthWindow.7=Error when importing data -CollectEarthWindow.8=Disclaimer text could not be found -CollectEarthWindow.9=The data imported contains records that are already present on your database. -DynamicsCode.0=Initially Forest -DynamicsCode.1=Initially Grassland -DynamicsCode.2=Initially Settlement -DynamicsCode.3=Initially Otherland -DynamicsCode.4=Initially Wetland -DynamicsCode.5=Initially Cropland -EarthApp.11=Collect Earth is already running -EarthApp.21=The file containing the grid of plots as a CSV/CED is not found in the selected path \:
-EarthApp.23=No CSV/CED file has been set-up \:

-EarthApp.24=The file containing the Freemarker template with the KML definition is not found in the selected path \:
-EarthApp.26=No KML definition file has been set-up \:

-EarthApp.27=The file containing the HTML balloon form is not found in the selected path \:
-EarthApp.29=No HTML balloon file has been set-up \:

-EarthApp.30=Please correct the file location in the Tools->Properties menu. -EarthApp.3=Remind me later -EarthApp.4=Update Now -EarthApp.57=There is a new version of Collect Earth available\!
How do you want to proceed? -EarthApp.58=Update alert -EarthApp.59=Error when importing project file -EarthApp.5=Do not remind me again -EarthApp.61=The Collect Earth file could not be open.
Please make sure that Google Earth is installed. -EarthApp.6=\ - Version -EarthApp.70=WARNING -EarthApp.71=In Mac OS X the Collect Earth project files (*.cep) will not open in Collect Earth when they are double-clicked.
-EarthApp.72=Use the Collect Earth toolbar to open the .cep files \: -EarthApp.73=Collect Earth issues in Mac OS X computers -EarthSurveyService.9=Field required -ExportActionListener.1=Pick Date to Export Records From -ExportDialogProcessMonitor.0=Processing data... -ExportDialogProcessMonitor.1=Waiting to initialize process \: -ExportDialogProcessMonitor.4=Exported records \: -ImportActionListener.0=Should the data for plots that have not been completely filled be imported? -ImportActionListener.2=If you click NO only the data from plots in the "green" state, containing all data, will be imported. -ImportActionListener.3=Import non-finished records -ImportDialogProcessMonitor.0=\ CALCULATING -ImportDialogProcessMonitor.11=Initial number of records \: -ImportDialogProcessMonitor.2=Importing records... -ImportDialogProcessMonitor.5=Actual number of imported records \: -ImportDialogProcessMonitor.8=Processing data... -ImportProcessMonitorDialog.0=Imported records \: -ImportXMLDialogProcessMonitor.1 = Overwrite data -ImportXMLDialogProcessMonitor.2 = Import only non-conflicting plots -InfiniteProgressMonitor.0=Cancel operation -JFileChooserExistsAware.0=Collect Earth Project file -KmlImportService.13=Select a CSV file to save the plot locations to -MissingPlotsListener.0=Error while getting information about plots not present on the Database -MissingPlotsListener.10=Total number of plots in the sampling design \: -MissingPlotsListener.12=Number of missing plots \: -MissingPlotsListener.14=All the plots are filled\! -MissingPlotsListener.1=Missing plots -MissingPlotsListener.2=Copy contents to clipboard -MissingPlotsListener.3=Pick the files that contain plot information ( .csv or .ced files ) for which you want to know if all data has been filled. -MissingPlotsListener.4=Missing plots - information -MissingPlotsListener.5=From file \: -MissingPlotsListener.6=Export to CED file -NO=No -NO_TO_ALL=No to all -OpenTextFileListener.0=The text file was not found at \: -OptionWizard.0=Collect Earth options -OptionWizard.100=Open Planet imagery -OptionWizard.101=Planet API key -OptionWizard.1021=URL SecureWatch -OptionWizard.102=Open Maxar SecureWatch -OptionWizard.103=Set URL for Extra Map (opens when set) \: -OptionWizard.104=Browsers -OptionWizard.105=Open Earth Map -OptionWizard.110=Use NICFI provided Monthly imagery -OptionWizard.10=Open backup folder -OptionWizard.11=Unknown\: use ifconfig -OptionWizard.12=Client Instance -OptionWizard.13=Collect Earth Server IP -OptionWizard.14=Collect Earth Server port (e.g. 8023) -OptionWizard.15=Save & Apply changes +CollectEarthWindow.2=Dil +CollectEarthWindow.20=Kopyalanan kayıt sayısı\: +CollectEarthWindow.21=Ana bilgisayar için simge bulunamadı +CollectEarthWindow.22=Collect Earth'ü kapatmak istediğinizden emin misiniz?
Pencereyi kapatmanız durumunda Collect Earth sunucusunu da kapatır. +CollectEarthWindow.23=Onay gerekiyor +CollectEarthWindow.24=XML Dışa aktar +CollectEarthWindow.25=Mevcut verileriniz kaybolacak yine de bu kayıtları eklemek istiyor musunuz? +CollectEarthWindow.26=Operatör +CollectEarthWindow.27=Güncelle +CollectEarthWindow.28=Operatör, verileri değerlendirirken Open Foris Collect Earth sunucusu çalışmalıdır. +CollectEarthWindow.29=Saiku Sunucusu yapılandırılmadı. +CollectEarthWindow.3=İçe aktarma hatası +CollectEarthWindow.30=Lütfen Google Earth'ü kullanırken bu pencereyi açık tutun. +CollectEarthWindow.31=Toplanan verileri CSV dosyasına aktar +CollectEarthWindow.32=Vazgeç +CollectEarthWindow.33=Operatör adı 5 karakterden uzun ve 50 karakterden kısa olmalıdır +CollectEarthWindow.34=Doğrulama hatası +CollectEarthWindow.35=OPERATÖR ADI BOŞ\!
Lütfen operatör adını girin ve "Güncelle" düğmesine basın. +CollectEarthWindow.36=Operatör adı boş olamaz +CollectEarthWindow.37=Açık Tut +CollectEarthWindow.38=CSV dosyaları +CollectEarthWindow.39=DİKKAT\: Yeni verileri almadan önce mevcut verilerinizi (XML'e Aktar) yedeklemeniz önerilir. +CollectEarthWindow.4=FAO Yasal uyarı bildirimleri +CollectEarthWindow.40=Araçlar-> Özellikler-> Gelişmiş sekmesinde Saiku Sunucusunun kurulu olduğu klasörün yolunu ayarlayın. +CollectEarthWindow.41=Dışa aktarılan verileri dosyaya kaydet +CollectEarthWindow.42=Vazgeç +CollectEarthWindow.43=Yinelenen kayıtlar bulundu +CollectEarthWindow.44=Verileri İçe/Dışa aktar +CollectEarthWindow.45=Verileri XML'e aktar (Sıkıştırılmış) +CollectEarthWindow.46=Verileri ZIP'ten içe aktar (sıkıştırılmış XML) +CollectEarthWindow.55=CSV kullanarak mevcut kayıtları güncelle +CollectEarthWindow.47=Saiku Sunucusu yapılandırılmadı +CollectEarthWindow.48=Zip/collect-data dosyası +CollectEarthWindow.49=Fusion table CSV dosyası +CollectEarthWindow.5=Kapat +CollectEarthWindow.50=Kullanım Kılavuzunu Aç +CollectEarthWindow.51=Collect Earth güncellemelerini kontrol et +CollectEarthWindow.52=Uygulama Günlüğünü Aç +CollectEarthWindow.53=Collect Earth Günlüğü +CollectEarthWindow.54=Noktaları KML'den yükle +CollectEarthWindow.56=Hakkında... +CollectEarthWindow.57=Saiku başlatıcısı işlemi hala devam ediyor, lütfen bekleyin. +CollectEarthWindow.58=Saiku analysis başlatılamıyor +CollectEarthWindow.59=Saiku analizi için veri setini yeniden oluşturmak ister misiniz?
Bu iÅŸlem zaman alabilir.
"EVET" üzerine tıklarsanız, en son bilgileri içeren yeni bir veri seti oluşturulur. +CollectEarthWindow.6=Fusion Table'a aktar +CollectEarthWindow.60=Saiku veri üretimi +CollectEarthWindow.61=Verileri XML'e aktar (Son dışa aktarımdan bu yana değiştirilmiş kayıtlar) +CollectEarthWindow.62=Hakkında... +CollectEarthWindow.63=Noktalar KML'den alırken hata oluştu +CollectEarthWindow.64=Teknik Destek +CollectEarthWindow.7=Veri içe aktarılırken hata oluştu +CollectEarthWindow.8=Yasal uyarı metni bulunamadı +CollectEarthWindow.9=Alınan veriler veritabanında zaten mevcut olan kayıtları içerir. +CollectEarthWindow.65=Operatör adı değiştirildi +CollectEarthWindow.66=Operatör adı +CollectEarthWindow.70=Anket rehberini aç +DynamicsCode.0=Başlangıçta Orman +DynamicsCode.1=Başlangıçta Mera +DynamicsCode.2=Başlangıçta Yerleşim +DynamicsCode.3=Başlangıçta Diğer +DynamicsCode.4=Başlangıçta Sulak +DynamicsCode.5=Başlangıçta Tarım +OpenTextFileListener.0=Metin dosyası bulunamadı \: +OptionWizard.0=Collect Earth seçenekler +OptionWizard.1=Tarayıcı Seç +OptionWizard.10=Yedekleme klasörünü aç +OptionWizard.11=Blinmeyen\: yapılandırma kullanımı +OptionWizard.12=İstemci durumu +OptionWizard.13=Collect Earth Sunucu IP +OptionWizard.14=Collect Earth sunucu girişi (örn. 8023) +OptionWizard.15=Kaydet & Değişiklikleri uygula OptionWizard.16=ID OptionWizard.17=X-coord OptionWizard.18=Y-coord -OptionWizard.19=Elevation -OptionWizard.1=Choose Browser -OptionWizard.20=The Google Earth contents have been changed.
Please accept the content reload when you are prompted by Google Earth. -OptionWizard.21=Update successful -OptionWizard.22=Slope -OptionWizard.23=There was an error when re-opening the Google Earth data -OptionWizard.24=Cancel -OptionWizard.25=Operation Mode +OptionWizard.19=Yükseklik +OptionWizard.2=İş akışı (sunucu/istemci) +OptionWizard.20=Google Earth içerikleri değiştirildi.
Lütfen Google Earth tarafından istendiğinde içeriğin yeniden yüklenmesini kabul edin. +OptionWizard.21=Güncelleme başarılı +OptionWizard.22=Eğim +OptionWizard.23=Google Earth verilerini yeniden açarken bir hata oluştu +OptionWizard.24=İptal +OptionWizard.25=İşlem Modu OptionWizard.26=DB host -OptionWizard.27=This is not a recognized Saiku Folder ( the start-saiku.bat file is not present) -OptionWizard.28=Saiku Server not recognized +OptionWizard.27=Bu tanınmış bir Saiku klasörü değil ( start-saiku.bat dosyası mevcut değil) +OptionWizard.28=Saiku Sunucusu tanınmadı OptionWizard.29=DB port -OptionWizard.2=Workflow (server/client) -OptionWizard.30=SQLite options -OptionWizard.31=Sample data -OptionWizard.32=Plot layout -OptionWizard.33=Survey Definition -OptionWizard.34=Integrated Services -OptionWizard.35=Number of control points -OptionWizard.36=Distance between control points (in meters) -OptionWizard.37=Margin with plot border (in meters) -OptionWizard.38=The CSV/CED file cannot be read correctly.
The file is expected to have a comma separated values like this \:
+OptionWizard.3=Sunucu örneği +OptionWizard.30=SQLite seçenekleri +OptionWizard.31=Örnek veri +OptionWizard.32=Plot düzeni +OptionWizard.33=Anket Tanımı +OptionWizard.34=Gelişmiş +OptionWizard.35=Kontrol noktası sayısı +OptionWizard.36=Kontrol noktaları arasındaki mesafe (metre cinsinden) +OptionWizard.37=Plot kenarı ile mesafesi (metre cinsinden) +OptionWizard.38=CSV / CED dosyası doğru okunamıyor.
Dosyanın böyle bir virgülle ayrılmış değerlere sahip olması beklenir \:
OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect -OptionWizard.3=Server Instance -OptionWizard.40=Projects -OptionWizard.41=Load a new project file -OptionWizard.42=Error when closing the CSV reader -OptionWizard.43=Name of survey -OptionWizard.44=automatically back-up database at -OptionWizard.45=Open Earth Engine Playground ( deprecated ) -OptionWizard.46=Open Earth Engine Timelapse -OptionWizard.47=Open Bing Maps -OptionWizard.48=Open form on a browser instead of Google Earth (recommended for LINUX) -OptionWizard.49=Path to ced/csv file with plot data -OptionWizard.4=Current computer IP \: -OptionWizard.50=Browse... -OptionWizard.51=Error importing project file -OptionWizard.52=CSV/CED file with only coordinates -OptionWizard.53=No points -OptionWizard.54=Central point -OptionWizard.55=Error importing project folder -OptionWizard.56=Load project -OptionWizard.57=Previously loaded projects -OptionWizard.58=Open GEE Code Editor (requires Trusted Tester access) -OptionWizard.59=Open Here Maps focused on the plot -OptionWizard.5=Collect Earth Server port\: -OptionWizard.65=Path to Saiku folder -OptionWizard.66=Browse... -OptionWizard.67=Path to Firefox executable -OptionWizard.68=Browse... -OptionWizard.6=PostgreSQL DB parameters -OptionWizard.70=Executable files -OptionWizard.72=Binary files -OptionWizard.73=Path to Chrome executable -OptionWizard.74=Browse... -OptionWizard.76=Executable files -OptionWizard.78=Binary files -OptionWizard.79=Path to KML Freemarker template -OptionWizard.7=User Name -OptionWizard.80=Browse... -OptionWizard.82=Freemarker template -OptionWizard.83=Path to HTML Balloon form design -OptionWizard.84=Browse... -OptionWizard.86=HTML webpage -OptionWizard.87=Path to XML with IDM definition -OptionWizard.88=Browse... -OptionWizard.8=Password -OptionWizard.90=XML IDM definition -OptionWizard.91=Server (manager version or stand-alone use) -OptionWizard.92=Client (operator/connected to server) -OptionWizard.93=SQLite (Embedded/single file based) +OptionWizard.4=Geçerli bilgisayar IP'si \: +OptionWizard.40=Projeler +OptionWizard.41=Yeni bir proje dosyası yükle +OptionWizard.42=CSV okuyucuyu kapatırken hata oluştu +OptionWizard.43=Anketin adı +OptionWizard.44=veritabanını otomatik olarak yedekle +OptionWizard.45=Earth Engine plot alanına yakınlaştırarak aç +OptionWizard.46=Plot alanı için Earth Engine Timelapse'yi aç +OptionWizard.47=Plot alanı için Bing Maps'i aç +OptionWizard.48=Formu Google Earth yerine bir tarayıcıda aç (LINUX için önerilir) +OptionWizard.49=Plot verisini içeren ced / csv dosyasının yolu +OptionWizard.5=Collect Earth Sunucu girişi\: +OptionWizard.50=Tarayıcı... +OptionWizard.51=Proje dosyası içe aktarılırken hata oluştu +OptionWizard.52=Yalnızca koordinatlara sahip CSV / CED dosyası +OptionWizard.53=Puan yok +OptionWizard.54=Merkez noktası +OptionWizard.55=Proje dosyası içe aktarılırken hata oluştu +OptionWizard.56=Proje yükle +OptionWizard.57=Önceden yüklenmiş projeler +OptionWizard.58=GEE Kod Düzenleyicisini açın (Güvenilir Test Cihazı erişimi gerektirir) +OptionWizard.59=Plot üzerinde Here Maps'i aç +OptionWizard.6=PostgreSQL DB parametreleri +OptionWizard.65=Saiku klasör yolu +OptionWizard.66=Tarayıcı... +OptionWizard.67=Firefox kısayol yolu +OptionWizard.68=Tarayıcı... +OptionWizard.7=Kullanıcı adı +OptionWizard.70=Kısayol dosyaları +OptionWizard.72=İkili dosyalar +OptionWizard.73=Chrome kısayol yolu +OptionWizard.74=Tarayıcı... +OptionWizard.76=Kısayol dosyaları +OptionWizard.78=İkili dosyalar +OptionWizard.79=KML işaretçi şablonu yolu +OptionWizard.8=Parola +OptionWizard.80=Tarayıcı... +OptionWizard.82=İşaretçi şablonu +OptionWizard.83=Form tasarımının HTML balon yolu +OptionWizard.84=Tarayıcı... +OptionWizard.86=HTML web sayfası +OptionWizard.87=IDM tanımıyla XML yolu +OptionWizard.88=Tarayıcı... +OptionWizard.9=DB Adı +OptionWizard.90=XML IDM tanımlama +OptionWizard.91=Sunucu (yönetici sürümü veya tek başına kullanım) +OptionWizard.92=İstemci (operatör/sunucuya bağlı) +OptionWizard.93=SQLite (Gömülü / tek dosya tabanlı) OptionWizard.94=PostgreSQL -OptionWizard.95=Side of the sampling dots (in meters) -OptionWizard.9=DB Name -ProcessMonitorDialog.1=Parsing error on row number -ProcessMonitorDialog.4=, columns -ProcessMonitorDialog.5=\ -- values -SaikuAnalysisListener.0=Yes - Refresh Saiku data (long process) -SaikuAnalysisListener.1=No - Use same version of the data as last time Saiku was used -SaikuStarter.1=Starting Saiku -SaikuStarter.2=Starting Saiku can take some minutes, please wait\! -SaikuToolExportListener.1=Saiku Tool generation -SaikuToolExportListener.2=Generating Saiku Tool with current database -SaveEarthDataServlet.0=Empty request -SaveEarthDataServlet.1=Problem occurred while saving data to the database -SaveEarthDataServlet.2=The data was saved -SlopeCode.0=Flat (0-5) -YES=Yes -YES_TO_ALL=Yes to all +OptionWizard.95=Örnekleme noktalarının kenarı (metre olarak) +SaikuAnalysisListener.0=Evet - Saiku verilerini yenile (uzun işlem) +SaikuAnalysisListener.1=Hayır - Sadece Saiku'yu başlat +SaikuStarter.1=Saiku başlatılıyor +SaikuStarter.2=Saiku başlatılıyor birkaç dakika sürebilir, lütfen bekleyin \! +SaveEarthDataServlet.0=Boş istek +SaveEarthDataServlet.1=Veriyi veritabanına kaydederken sorun oluştu +SaveEarthDataServlet.2=Veri kaydedildi +SlopeCode.0=Düz (0-5) +EarthApp.11=Collect Earth zaten çalışıyor +EarthApp.21=Plotlara ait seçili CSV/CED grid dosyası bulunamadı \:
+EarthApp.23=CSV/CED dosyası ayarlanmadı \:

+EarthApp.24=İşaretçi şablonunu KML tanımına sahip dosya seçili yolda bulunamadı \:
+EarthApp.26=KML tanım dosyası ayarlanmadı \:

+EarthApp.27=HTML balon formunu içeren dosya seçili yolda bulunamadı \:
+EarthApp.29=Hiçbir HTML balon dosyası oluşturulmadı \:

+EarthApp.3=Daha Sonra Hatırlat +EarthApp.30=Lütfen Araçlar-> Özellikler menüsünden dosya konumunu düzeltin.. +EarthApp.4=Şimdi Güncelle +EarthApp.5=Tekrar hatırlatma +EarthApp.57=Collect Earth'ün yeni bir sürümü var\!
Nasıl devam etmek istiyorsun? +EarthApp.58=Güncelleme uyarısı +EarthApp.59=Proje dosyasını içe aktarırken hata oluştu +EarthApp.6=\ - Versiyon +EarthApp.61=Collect Earth dosyası açılamadı.
Lütfen Google Earth’ün kurulu olduğundan emin olun. +EarthSurveyService.9=Alan gerekli +ExportActionListener.1=Kayıtların Gönderileceği Tarihi Seç +ExportDialogProcessMonitor.0=Veri işleniyor... +ExportDialogProcessMonitor.1=İşlemi başlatmak için bekleniyor \: +ExportDialogProcessMonitor.4=Dışa aktarılan kayıtlar \: +ImportProcessMonitorDialog.0=İçe aktarılan kayıtlar \: +ImportActionListener.0=Doldurulmamış plotlar içe aktarılsın mı? +ImportActionListener.2=Eğer tıklarsanız NO sadece tüm verileri içeren "yeşil" durumdaki plotlar içe aktarılacaktır. +ImportActionListener.3=Bitmemiş kayıtları içe aktar +ImportDialogProcessMonitor.0=\ HESAPLANIYOR +ImportDialogProcessMonitor.11=İlk kayıt sayısı \: +ImportDialogProcessMonitor.2=Kayıtlar içe aktarılıyor... +ImportDialogProcessMonitor.5=Güncel içe aktarılan kayıt sayısı \: +ImportDialogProcessMonitor.8=Veri işleniyor... +InfiniteProgressMonitor.0=İşlemi iptal et +JFileChooserExistsAware.0=Collect Earth Proje dosya +KmlImportService.13=Konumları kaydetmek için CSV dosyası seçin +MissingPlotsListener.0=Veritabanında bulunmayan plotlar hakkında bilgi alınırken hata oluştu +MissingPlotsListener.1=Eksik plotlar +MissingPlotsListener.10=Örnekleme tasarımındaki toplam plotların sayısı \: +MissingPlotsListener.12=Eksik plotların sayısı \: +MissingPlotsListener.14=Bütün plotlar dolu\! +MissingPlotsListener.2=İçeriği panoya kopyala +MissingPlotsListener.3=Tüm verilerin doldurulup doldurulmadığını öğrenmek istediğiniz plot bilgilerini (.csv veya .ced dosyaları) içeren dosyaları seçin. +MissingPlotsListener.4=Eksik plotlar - Bilgi +MissingPlotsListener.5=Dosyadan \: +MissingPlotsListener.6=CED dosyasına aktar +ProcessMonitorDialog.1=Satır numarasında ayrıştırma hatası +ProcessMonitorDialog.4=, sütunlar +ProcessMonitorDialog.5=\ -- değerler -GenerateDatabaseStarter.1=Preparing for analysis -GenerateDatabaseStarter.2=Generating Relational Database +ImportXMLDialogProcessMonitor.1 = Verilerin üzerine yaz +ImportXMLDialogProcessMonitor.2 = Sadece yinelenmeyen plotları içe aktar -IPCCGeneratorListener.1=Waiting for process to complete\! -IPCCGeneratorListener.2=The IPCC GHGi compatible data is being generated -IPCCGeneratorListener.3=Refresh the data (update with latest from Collect Earth) -IPCCGeneratorListener.4=Use the latest generated database (fastest process - no update) -IPCCGeneratorListener.5=GHGi Database generation -IPCCGeneratorListener.6=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming but it is necessary if the Collect Earth data has been updated since the last time.
\ No newline at end of file +YES=Evet +YES_TO_ALL=Tümüne evet +NO=Hayır +NO_TO_ALL=Tümüne hayır + +CollectEarthMenu.0=CEP dosyasını içe aktar +CollectEarthMenu.2=Hizmetler +CollectEarthMenu.3=Büyük CSV plot dosyalarını böl +CollectEarthMenu.4=Verileri XML'e aktar (belirli bir tarihten itibaren) +CollectEarthMenu.5=Collect yedeÄŸi için dışa aktar +CollectEarthMenu.6=Collect Backup verilerini dışa aktar (tüm veriler) +CollectEarthMenu.7=Collect Backup verilerini dışa aktar (belirli bir tarihten itibaren) +CollectEarthMenu.8=Verileri XML'e aktar (özet özniteliÄŸine göre filtrele) \ No newline at end of file From 690c082c844137d2ccb2ae02728524b99a97cab7 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:36:39 +0100 Subject: [PATCH 0815/1620] New translations Messages_tr.properties (Spanish) --- .../earth/app/view/Messages_es.properties | 467 +++++++++--------- 1 file changed, 242 insertions(+), 225 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index f0355142d0..c9742c724a 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,225 +1,242 @@ -AboutDialog.19=कोई समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ -AboutDialog.5=अधिक जानकारी के लिठहमारी वेबसाइट पर जाà¤? OpenForis.org? -AboutDialog.6=कà¥à¤·à¤®à¤¾ करें, à¤à¤• समसà¥à¤¯à¤¾ आपके सिसà¥à¤Ÿà¤® के मानक बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में इस लिंक को खोलने की कोशिश कर रही है. -AboutDialog.8=ठीक -AspectCode.0=उतà¥à¤¤à¤° दिशा -AspectCode.1=उतà¥à¤¤à¤°-पूरà¥à¤µ दिशा -AspectCode.2=पूरà¥à¤µ दिशा -AspectCode.3=दकà¥à¤·à¤¿à¤£-पूरà¥à¤µ दिशा -AspectCode.4=दकà¥à¤·à¤¿à¤£ दिशा -AspectCode.5=दकà¥à¤·à¤¿à¤£-पशà¥à¤šà¤¿à¤® दिशा -AspectCode.6=पशà¥à¤šà¤¿à¤® दिशा -AspectCode.7=उतà¥à¤¤à¤°-पशà¥à¤šà¤¿à¤® दिशा -CollectEarthWindow.0=तà¥à¤°à¥à¤Ÿà¤¿ जब सीà¤à¤¸à¤µà¥€ फ़ाइल में डेटा निरà¥à¤¯à¤¾à¤¤ करने का पà¥à¤°à¤¯à¤¾à¤¸ -CollectEarthWindow.1=निरà¥à¤¯à¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.10=फ़ाइल -CollectEarthWindow.11=बाहर जाà¤à¤‚ -CollectEarthWindow.12=उपकरण -CollectEarthWindow.13=डेटा सीà¤à¤¸à¤µà¥€ निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.14=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ -CollectEarthWindow.15=गà¥à¤£ -CollectEarthWindow.16=मदद -CollectEarthWindow.17=असà¥à¤µà¥€à¤•रण -CollectEarthWindow.18=डेटाबेस में लापता भूखंडों खोजें -CollectEarthWindow.19=पृथà¥à¤µà¥€ इकटà¥à¤ à¤¾ -CollectEarthWindow.2=भाषा -CollectEarthWindow.20=डà¥à¤ªà¥à¤²à¤¿à¤•ेट रिकॉरà¥à¤¡ की संखà¥à¤¯à¤¾\: -CollectEarthWindow.21=मà¥à¤–à¥à¤¯ फà¥à¤°à¥‡à¤® के लिठआइकन नहीं मिल सकता है -CollectEarthWindow.22=आपको लगता है कि आप à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ बंद करना चाहते हैं? विंडोज बंद करने से, à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° बंद हो जाà¤à¤—ा -CollectEarthWindow.23=पà¥à¤·à¥à¤Ÿà¤¿ की जरूरत है -CollectEarthWindow.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.25=आप वैसे भी इन अभिलेखों को जोड़ना चाहते हैं और अपने वरà¥à¤¤à¤®à¤¾à¤¨ डेटा खोने के लिठकिलक करना चाहते हैं? -CollectEarthWindow.26=ऑपरेटर,पà¥à¤°à¤šà¤¾à¤²à¤• -CollectEarthWindow.27=अदà¥à¤¯à¤¤à¤¨ -CollectEarthWindow.28= औपन फौरिस à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° चल रहा होना चाहिठ, जबभी ऑपरेटर डेटा की वà¥à¤¯à¤¾à¤–à¥à¤¯à¤¾ करें . -CollectEarthWindow.29=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. -CollectEarthWindow.3= आयात संबंधी तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.30=जबभी आप गà¥à¤—ल अरà¥à¤¥ का उपयोग कर रहे हैं, कृपया इस विंडोज को खà¥à¤²à¥€ बनाठरखें. -CollectEarthWindow.31=à¤à¤•तà¥à¤° डेटा सीà¤à¤¸à¤µà¥€ फाइल में भेजें -CollectEarthWindow.32=छोड़ना -CollectEarthWindow.33=ऑपरेटर का नाम के 5 अकà¥à¤·à¤° से बड़ा और 50 अकà¥à¤·à¤° से कम होना चाहिठ-CollectEarthWindow.34=मानà¥à¤¯à¤¤à¤¾ तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.35=ऑपरेटर नाम खाली\!
कृपया ऑपरेटर का नाम भरें और "अदà¥à¤¯à¤¤à¤¨" बटन दबाà¤à¤. -CollectEarthWindow.36=ऑपरेटर नाम रिकà¥à¤¤ नहीं हो सकता -CollectEarthWindow.37=खà¥à¤²à¤¾ रखो -CollectEarthWindow.38=सीà¤à¤¸à¤µà¥€ फ़ाइल -CollectEarthWindow.39=सूचना\: यह सलाह दी जाती है कि आप नठडेटा डालने करने से पहले अपने मौजूदा आंकडों को बैकअप(à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤) कर लें -CollectEarthWindow.4=à¤à¤«à¤à¤“ असà¥à¤µà¥€à¤•रण नोटिस -CollectEarthWindow.40=उस फ़ोलà¥à¤¡à¤° पर जाà¤à¤‚ जहां साà¤à¤•ॠसरà¥à¤µà¤° में सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ किया गया है, फ़ोलà¥à¤¡à¤° का रासà¥à¤¤à¤¾ उपकरण> गà¥à¤£> उनà¥à¤¨à¤¤ टैब. -CollectEarthWindow.41=निरà¥à¤¯à¤¾à¤¤ डेटा को फ़ाइल में बचाया जा रहा है \: -CollectEarthWindow.42=छोड़ना -CollectEarthWindow.43=परसà¥à¤ªà¤° विरोधी रिकॉरà¥à¤¡ पाया -CollectEarthWindow.44=डेटा आयात / निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.45=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ डेटा (संकà¥à¤šà¤¿à¤¤) -CollectEarthWindow.46=ज़िप से नठडेटा आयात करें (संकà¥à¤šà¤¿à¤¤ à¤à¤•à¥à¤¸à¤à¤®à¤à¤²) -CollectEarthWindow.55=सीà¤à¤¸à¤µà¥€ का उपयोग कर मौजूदा रिकॉरà¥à¤¡ को अपडेट करें -CollectEarthWindow.47=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. -CollectEarthWindow.48=ज़िप / à¤à¤•तà¥à¤°-डेटा फ़ाइल -CollectEarthWindow.49=फà¥à¤¯à¥‚जन सीà¤à¤¸à¤µà¥€ फ़ाइल -CollectEarthWindow.5=बंद करे -CollectEarthWindow.50= उपयोगकरà¥à¤¤à¤¾ मैनà¥à¤…ल खोलें -CollectEarthWindow.51=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ के अदà¥à¤¯à¤¤à¤¨ के लिठजाà¤à¤š करें -CollectEarthWindow.52= अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— लॉग फ़ाइल खोलें -CollectEarthWindow.53=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ लॉग फ़ाइल -CollectEarthWindow.54=केà¤à¤®à¤à¤² से लोड अंक -CollectEarthWindow.56=के विषय में... -CollectEarthWindow.57=साà¤à¤•ॠसà¥à¤Ÿà¤¾à¤°à¥à¤Ÿà¤° पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ अभी भी चल रहा है, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें. -CollectEarthWindow.58=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ नहीं कर सकते -CollectEarthWindow.59=आप साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ के लिठडेटा सेट फिर से उतà¥à¤ªà¤¨à¥à¤¨ करने के लिठकरना चाहते हैं?
यह पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ समय लेने वाली हो सकती है.
आप यदि "हाà¤"पर कà¥à¤²à¤¿à¤• करें, तो नवीनतम जानकारी के साथ à¤à¤• नया डाटासेट उतà¥à¤ªà¤¨à¥à¤¨ हो जाà¤à¤—ा. -CollectEarthWindow.6=फà¥à¤¯à¥‚जन टेबल के लिठनिरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.60=साà¤à¤•ॠडेटा उतà¥à¤ªà¤¨à¥à¤¨ -CollectEarthWindow.61=डेटा à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ (पिछले निरà¥à¤¯à¤¾à¤¤ के बाद से संशोधित रिकॉरà¥à¤¡) -CollectEarthWindow.62=के विषय मे... -CollectEarthWindow.63=केà¤à¤®à¤à¤² से अंक पà¥à¤°à¤¾à¤ªà¥à¤¤ करने में तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.64=तकनीकी सहायता -CollectEarthWindow.7=डेटा आयात में तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.8=असà¥à¤µà¥€à¤•रण पाठ नहीं पाया जा सका -CollectEarthWindow.9=डेटा आयात रिकॉरà¥à¤¡ वह है जो कि पहले से ही अपने डेटाबेस पर मौजूद हैं शामिल. -DynamicsCode.0=पà¥à¤°à¤¾à¤°à¤‚भ में वन -DynamicsCode.1=पà¥à¤°à¤¾à¤°à¤‚भ में घास का मैदान, -DynamicsCode.2=पà¥à¤°à¤¾à¤°à¤‚भ में आबादी वाला इलाका -DynamicsCode.3=पà¥à¤°à¤¾à¤°à¤‚भ में बंजर -DynamicsCode.4=पà¥à¤°à¤¾à¤°à¤‚भ में आरà¥à¤¦à¥à¤° भूमि -DynamicsCode.5=पà¥à¤°à¤¾à¤°à¤‚भ में खेत -OpenTextFileListener.0=इस पाठ का फ़ाइल नहीं मिला \: -OptionWizard.0= विकलà¥à¤ª -OptionWizard.1=बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° चà¥à¤¨à¥‡à¤‚ -OptionWizard.10=बैकअप फ़ोलà¥à¤¡à¤° खोलें -OptionWizard.11=अजà¥à¤žà¤¾à¤¤\: उपयोग ifconfig -OptionWizard.12=गà¥à¤°à¤¾à¤¹à¤•ों का उलà¥à¤²à¥‡à¤– -OptionWizard.13=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° आईपी -OptionWizard.14=कतà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ (उदाहरण- 8023) -OptionWizard.15=बचाà¤à¤‚ और परिवरà¥à¤¤à¤¨ लागू करें -OptionWizard.16=आईडी -OptionWizard.17=X- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क -OptionWizard.18=Y- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क -OptionWizard.19=उठान -OptionWizard.2=कारà¥à¤¯à¤ªà¥à¤°à¤µà¤¾à¤¹ (सरà¥à¤µà¤° / गà¥à¤°à¤¾à¤¹à¤•) -OptionWizard.20=गूगल अरà¥à¤¥ अंतरà¥à¤µà¤¸à¥à¤¤à¥ बदल दिया गया है
यदि गà¥à¤—ल अरà¥à¤¥ आप से कहे,अंतरà¥à¤µà¤¸à¥à¤¤à¥ पà¥à¤¨à¤ƒ लोड सà¥à¤µà¥€à¤•ार करें . -OptionWizard.21=अदà¥à¤¯à¤¤à¤¨ सफल -OptionWizard.22=ढाल -OptionWizard.23=गूगल अरà¥à¤¥ डेटा को फिर से खोलने में कोई तà¥à¤°à¥à¤Ÿà¤¿ थी -OptionWizard.24=रदà¥à¤¦ करना -OptionWizard.25=ऑपरेशन मोड -OptionWizard.26=डीबी होसà¥à¤Ÿ -OptionWizard.27=यह à¤à¤• मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ साà¤à¤•ॠफ़ोलà¥à¤¡à¤° नहीं है ( सà¥à¤Ÿà¤¾à¤°à¥à¤Ÿ-साà¤à¤•à¥.batफ़ाइल मौजूद नहीं है) -OptionWizard.28=साà¤à¤•ॠसरà¥à¤µà¤° मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ नहीं -OptionWizard.29=डीबी पोरà¥à¤Ÿ -OptionWizard.3=सरà¥à¤µà¤° आवृतà¥à¤¤à¤¿ -OptionWizard.30=à¤à¤¸à¤•à¥à¤¯à¥ लाइट विकलà¥à¤ª -OptionWizard.31=सेमà¥à¤ªà¤² डेटा -OptionWizard.32=पà¥à¤²à¥‰à¤Ÿ लेआउट -OptionWizard.33=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ परिभाषा -OptionWizard.34=विकसित -OptionWizard.35=सेमà¥à¤ªà¤² अंक की संखà¥à¤¯à¤¾ -OptionWizard.36=सेमà¥à¤ªà¤² बिंदॠके बीच दूरी (मीटर में) -OptionWizard.37=भूखंड की सीमा के साथ मारà¥à¤œà¤¿à¤¨ (मीटर मे) -OptionWizard.38=सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सही ढंग से पढ़ा नहीं जा सकता.
इस फ़ाइल में à¤à¤• अलà¥à¤ªà¤µà¤¿à¤°à¤¾à¤® से अलग मूलà¥à¤¯à¥‹à¤‚ की उमà¥à¤®à¥€à¤¦ है \:
-OptionWizard.39=आईडी, वाई समनà¥à¤µà¤¯, à¤à¤•à¥à¤¸ समनà¥à¤µà¤¯, ऊंचाई, ढाल, पहलू -OptionWizard.4=वरà¥à¤¤à¤®à¤¾à¤¨ कंपà¥à¤¯à¥‚टर आईपी \: -OptionWizard.40=परियोजनाà¤à¤‚ -OptionWizard.41=à¤à¤• नई परियोजना फ़ाइल लोड करें -OptionWizard.42=सीà¤à¤¸à¤µà¥€ पाठक को बंद करते समय तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.43=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ का नाम -OptionWizard.44= सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ बैकअप डेटाबेस -OptionWizard.45=ओपन पृथà¥à¤µà¥€ इंजन ने पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° में जूम किया -OptionWizard.46=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठपृथà¥à¤µà¥€ इंजन टाइमलैपà¥à¤¸ खोलें -OptionWizard.47=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठबिंग मैपà¥à¤¸ खोलें -OptionWizard.48=बजाय गूगल अरà¥à¤¥ के फॉरà¥à¤® à¤à¤• बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° पर खोलें (लिनकà¥à¤¸ के लिठसिफारिश) -OptionWizard.49=भूखंड डेटा के साथ सीईडी / सीà¤à¤¸à¤µà¥€ फाइल भेजने के लिठपथ -OptionWizard.5=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ\: -OptionWizard.50=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.51=परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.52=केवल निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क के साथ सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल -OptionWizard.53=चौकोर -OptionWizard.54=केनà¥à¤¦à¥à¤°à¥€à¤¯ बिनà¥à¤¦à¥ -OptionWizard.55=परियोजना फ़ोलà¥à¤¡à¤° आयात तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.56=लोड परियोजना -OptionWizard.57=पहले से लोड परियोजना -OptionWizard.58= जी ई ई का मैदान खोलें (विशà¥à¤µà¤¸à¤¨à¥€à¤¯ जांचकरà¥à¤¤à¤¾ के उपयोग की आवशà¥à¤¯à¤•ता है) -OptionWizard.59=यहां भूखंड पर केंदà¥à¤°à¤¿à¤¤ मैपà¥à¤¸ खोलें -OptionWizard.6=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² डीबी मापदंड -OptionWizard.65=साà¤à¤•à¥à¤«à¤¼à¥‹à¤²à¥à¤¡à¤° का पथ -OptionWizard.66=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.67=फ़ायरफ़ॉकà¥à¤¸ निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ -OptionWizard.68=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.7=उपयोगकरà¥à¤¤à¤¾ नाम -OptionWizard.70=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों -OptionWizard.72=बाइनरी फ़ाइलें -OptionWizard.73=कà¥à¤°à¥‹à¤® निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ -OptionWizard.74=बà¥à¤°à¤¾à¤‰à¤œ -OptionWizard.76=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों -OptionWizard.78=बाइनरी फ़ाइलें -OptionWizard.79=केà¤à¤®à¤à¤² फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ के लिठपथ -OptionWizard.8=पासवरà¥à¤¡ -OptionWizard.80=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.82=फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ -OptionWizard.83=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ पà¥à¤°à¤ªà¤¤à¥à¤° डिज़ाइन करने के लिठपथ -OptionWizard.84=बà¥à¤°à¤¾à¤‰à¤œ..... -OptionWizard.86=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² वेब पेज -OptionWizard.87=पथ आइडीà¤à¤® परिभाषा के साथ à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठ-OptionWizard.88=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.9=डीबी नाम -OptionWizard.90=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² आइडीà¤à¤® परिभाषा -OptionWizard.91=सरà¥à¤µà¤° (पà¥à¤°à¤¬à¤‚धक संसà¥à¤•रण या खड़े अकेले का उपयोग करें) -OptionWizard.92=कà¥à¤²à¤¾à¤‡à¤‚ट (ऑपरेटर / सरà¥à¤µà¤° से जà¥à¤¡à¤¼à¥‡) -OptionWizard.93=सकà¥à¤¯à¥‚à¤à¤²à¤¾à¤‡à¤Ÿ (à¤à¤‚बेडेड / à¤à¤•ल फाइल आधारित) -OptionWizard.94=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² -OptionWizard.95=सेमà¥à¤ªà¤² डॉटà¥à¤¸ के साइड (मीटर में) -SaikuAnalysisListener.0=हाठ- ताज़ा साà¤à¤•ॠडेटा (लंबी पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾) -SaikuAnalysisListener.1=नहीं - बस साà¤à¤•ॠशà¥à¤°à¥‚ -SaikuStarter.1=साà¤à¤•ॠशà¥à¤°à¥‚ -SaikuStarter.2= साà¤à¤•ॠशà¥à¤°à¥‚ कà¥à¤› मिनट लग सकते हैं, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें\! -SaveEarthDataServlet.0=खाली अनà¥à¤°à¥‹à¤§ -SaveEarthDataServlet.1= डेटाबेस में डेटा बचाते समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ है -SaveEarthDataServlet.2=डेटा बचाया था -SlopeCode.0=समतल (0-5) -EarthApp.11=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ पहले से ही चल रहा है -EarthApp.21=à¤à¤• सीà¤à¤¸à¤µà¥€ / सीईडी के रूप में भूखंडों की गà¥à¤°à¤¿à¤¡ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
-EarthApp.23=कोई सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सेट-अप नहीं किया गया है \:

-EarthApp.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² परिभाषा के साथ फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है \:
-EarthApp.26=कोई à¤à¤•à¥à¤¸à¤à¤®à¤à¤² फ़ाइल परिभाषा सेट अप नहीं किया गया है \:

-EarthApp.27=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ रूप से यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
-EarthApp.29=कोई à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ फ़ाइल सेट-अप नहीं किया गया है \:

-EarthApp.3=मà¥à¤à¥‡ बाद में याद दिलाना -EarthApp.30=उपकरण> गà¥à¤£ मेनू में फ़ाइल सà¥à¤¥à¤¾à¤¨ को ठीक करें . -EarthApp.4=अभी अदà¥à¤¯à¤¤à¤¨ करें -EarthApp.5=मà¥à¤à¥‡ दà¥à¤¬à¤¾à¤°à¤¾ याद मत दिलाना -EarthApp.57=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ का à¤à¤• नया संसà¥à¤•रण उपलबà¥à¤§ है\!
आप कैसे आगे बढ़ना चाहते हैं? -EarthApp.58=अदà¥à¤¯à¤¤à¤¨ चेतावनी -EarthApp.59= परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ -EarthApp.6=\ - संसà¥à¤•रण -EarthApp.61=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ फाइल खà¥à¤² नहीं सकती .
कृपया सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करें कि गूगल अरà¥à¤¥ सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ है. -EarthSurveyService.9=आवशà¥à¤¯à¤• कà¥à¤·à¥‡à¤¤à¥à¤° -ExportActionListener.1= तारीख चूनें जबसे रिकॉरà¥à¤¡ निरà¥à¤¯à¤¾à¤¤ करने है -ExportDialogProcessMonitor.0=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... -ExportDialogProcessMonitor.1=पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ पà¥à¤°à¤¾à¤°à¤‚भ करने के लिठपà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ कर रहा है \: -ExportDialogProcessMonitor.4=निरà¥à¤¯à¤¾à¤¤ रिकॉरà¥à¤¡\: -ImportProcessMonitorDialog.0=आयातित रिकॉरà¥à¤¡ \: -ImportActionListener.0=कà¥à¤¯à¤¾ उन भूखंडों के लिठडेटा जो कि पूरी तरह से भरे नहीं गठ,आयातित किया जाना चाहिà¤? -ImportActionListener.2=आप कà¥à¤²à¤¿à¤• करें, नहींतो केवल डेटा "हरी" राजà¥à¤¯ में भूखंडों से ,जिसमें सभी डेटा यà¥à¤•à¥à¤¤ है , आयात किया जाà¤à¤—ा। -ImportDialogProcessMonitor.0=\ गणना -ImportDialogProcessMonitor.11=रिकॉरà¥à¤¡ की पà¥à¤°à¤¾à¤°à¤‚भिक संखà¥à¤¯à¤¾ \: -ImportDialogProcessMonitor.2=रिकॉरà¥à¤¡ आयात... -ImportDialogProcessMonitor.5=आयातित रिकॉरà¥à¤¡ की वासà¥à¤¤à¤µà¤¿à¤• संखà¥à¤¯à¤¾ \: -ImportDialogProcessMonitor.8=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... -InfiniteProgressMonitor.0=रदà¥à¤¦ ऑपरेशन -JFileChooserExistsAware.0=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ परियोजना फ़ाइल -KmlImportService.13=पà¥à¤²à¥‰à¤Ÿ सà¥à¤¥à¤¾à¤¨à¥‹à¤‚ को बचाने के लिठà¤à¤• सीà¤à¤¸à¤µà¥€ फ़ाइल का चयन करें -MissingPlotsListener.0=तà¥à¤°à¥à¤Ÿà¤¿ उन भूखंडों के बारे में जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ करने के लिठजो डेटाबेस पर मौजूद नहीं -MissingPlotsListener.1=गà¥à¤® भूखंड -MissingPlotsListener.10=सेमà¥à¤ªà¤² डिजाइन में भूखंडों की कà¥à¤² संखà¥à¤¯à¤¾ \: -MissingPlotsListener.12=गà¥à¤® भूखंडों की संखà¥à¤¯à¤¾ \: -MissingPlotsListener.14=सभी भूखंडों भर रहे हैं\! -MissingPlotsListener.2=कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ अंतरà¥à¤µà¤¸à¥à¤¤à¥ की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ -MissingPlotsListener.3=भूखंड की जानकारी वाले फ़ाइलें चà¥à¤¨à¥‡à¤‚ ( .सीà¤à¤¸à¤µà¥€ या .सीईडी फ़ाइलें ) जिसके लिठआप जानना चाहते हैं तो सभी डेटा भर दिया गया है चाहता हूà¤. -MissingPlotsListener.4=गà¥à¤® भूखंड- जानकारी -MissingPlotsListener.5=फ़ाइल से \: -MissingPlotsListener.6=सीà¤à¤¡à¥€ फ़ाइल में निरà¥à¤¯à¤¾à¤¤ करें -ProcessMonitorDialog.1=पंकà¥à¤¤à¤¿ संखà¥à¤¯à¤¾ पर तà¥à¤°à¥à¤Ÿà¤¿ -ProcessMonitorDialog.4=, कॉलम -ProcessMonitorDialog.5=\ --मूलà¥à¤¯ -YES= हां -YES_TO_ALL=सब को हां -NO=नहीं -NO_TO_ALL=सभी को नहीं +AboutDialog.19=Bir sorun oluÅŸtu +AboutDialog.5=Daha fazla bilgi için web sitemizi ziyaret edin OpenForis.org +AboutDialog.6=Üzgünüm, sisteminizin varsayılan tarayıcısı bu baÄŸlantıyı açmak isterken bir sorun oluÅŸtu. +AboutDialog.8=Tamam +AspectCode.0=Kuzey +AspectCode.1=Kuzey-doÄŸu +AspectCode.2=DoÄŸu +AspectCode.3=Güney-doÄŸu +AspectCode.4=Güney +AspectCode.5=Güney-batı +AspectCode.6=Batı +AspectCode.7=Kuzey-batı +CollectEarthWindow.0=Veri CSV dosyasına aktarılmaya çalışılırken hata oluÅŸtu +CollectEarthWindow.1=Dışa aktarma hatası +CollectEarthWindow.10=Dosya +CollectEarthWindow.11=Çıkış +CollectEarthWindow.12=Araçlar +CollectEarthWindow.13=Verileri CSV'ye aktar +CollectEarthWindow.14=SAIKU Analysis baÅŸlat +CollectEarthWindow.15=Özellikler +CollectEarthWindow.16=Yardım +CollectEarthWindow.17=Yasal uyarı +CollectEarthWindow.18=Veritabnında eksik plotları bulun +CollectEarthWindow.19=Collect Earth +CollectEarthWindow.2=Dil +CollectEarthWindow.20=Kopyalanan kayıt sayısı\: +CollectEarthWindow.21=Ana bilgisayar için simge bulunamadı +CollectEarthWindow.22=Collect Earth'ü kapatmak istediÄŸinizden emin misiniz?
Pencereyi kapatmanız durumunda Collect Earth sunucusunu da kapatır. +CollectEarthWindow.23=Onay gerekiyor +CollectEarthWindow.24=XML Dışa aktar +CollectEarthWindow.25=Mevcut verileriniz kaybolacak yine de bu kayıtları eklemek istiyor musunuz? +CollectEarthWindow.26=Operatör +CollectEarthWindow.27=Güncelle +CollectEarthWindow.28=Operatör, verileri değerlendirirken Open Foris Collect Earth sunucusu çalışmalıdır. +CollectEarthWindow.29=Saiku Sunucusu yapılandırılmadı. +CollectEarthWindow.3=İçe aktarma hatası +CollectEarthWindow.30=Lütfen Google Earth'ü kullanırken bu pencereyi açık tutun. +CollectEarthWindow.31=Toplanan verileri CSV dosyasına aktar +CollectEarthWindow.32=Vazgeç +CollectEarthWindow.33=Operatör adı 5 karakterden uzun ve 50 karakterden kısa olmalıdır +CollectEarthWindow.34=Doğrulama hatası +CollectEarthWindow.35=OPERATÖR ADI BOŞ\!
Lütfen operatör adını girin ve "Güncelle" düğmesine basın. +CollectEarthWindow.36=Operatör adı boş olamaz +CollectEarthWindow.37=Açık Tut +CollectEarthWindow.38=CSV dosyaları +CollectEarthWindow.39=DİKKAT\: Yeni verileri almadan önce mevcut verilerinizi (XML'e Aktar) yedeklemeniz önerilir. +CollectEarthWindow.4=FAO Yasal uyarı bildirimleri +CollectEarthWindow.40=Araçlar-> Özellikler-> Gelişmiş sekmesinde Saiku Sunucusunun kurulu olduğu klasörün yolunu ayarlayın. +CollectEarthWindow.41=Dışa aktarılan verileri dosyaya kaydet +CollectEarthWindow.42=Vazgeç +CollectEarthWindow.43=Yinelenen kayıtlar bulundu +CollectEarthWindow.44=Verileri İçe/Dışa aktar +CollectEarthWindow.45=Verileri XML'e aktar (Sıkıştırılmış) +CollectEarthWindow.46=Verileri ZIP'ten içe aktar (sıkıştırılmış XML) +CollectEarthWindow.55=CSV kullanarak mevcut kayıtları güncelle +CollectEarthWindow.47=Saiku Sunucusu yapılandırılmadı +CollectEarthWindow.48=Zip/collect-data dosyası +CollectEarthWindow.49=Fusion table CSV dosyası +CollectEarthWindow.5=Kapat +CollectEarthWindow.50=Kullanım Kılavuzunu Aç +CollectEarthWindow.51=Collect Earth güncellemelerini kontrol et +CollectEarthWindow.52=Uygulama Günlüğünü Aç +CollectEarthWindow.53=Collect Earth Günlüğü +CollectEarthWindow.54=Noktaları KML'den yükle +CollectEarthWindow.56=Hakkında... +CollectEarthWindow.57=Saiku başlatıcısı işlemi hala devam ediyor, lütfen bekleyin. +CollectEarthWindow.58=Saiku analysis başlatılamıyor +CollectEarthWindow.59=Saiku analizi için veri setini yeniden oluşturmak ister misiniz?
Bu iÅŸlem zaman alabilir.
"EVET" üzerine tıklarsanız, en son bilgileri içeren yeni bir veri seti oluşturulur. +CollectEarthWindow.6=Fusion Table'a aktar +CollectEarthWindow.60=Saiku veri üretimi +CollectEarthWindow.61=Verileri XML'e aktar (Son dışa aktarımdan bu yana değiştirilmiş kayıtlar) +CollectEarthWindow.62=Hakkında... +CollectEarthWindow.63=Noktalar KML'den alırken hata oluştu +CollectEarthWindow.64=Teknik Destek +CollectEarthWindow.7=Veri içe aktarılırken hata oluştu +CollectEarthWindow.8=Yasal uyarı metni bulunamadı +CollectEarthWindow.9=Alınan veriler veritabanında zaten mevcut olan kayıtları içerir. +CollectEarthWindow.65=Operatör adı değiştirildi +CollectEarthWindow.66=Operatör adı +CollectEarthWindow.70=Anket rehberini aç +DynamicsCode.0=Başlangıçta Orman +DynamicsCode.1=Başlangıçta Mera +DynamicsCode.2=Başlangıçta Yerleşim +DynamicsCode.3=Başlangıçta Diğer +DynamicsCode.4=Başlangıçta Sulak +DynamicsCode.5=Başlangıçta Tarım +OpenTextFileListener.0=Metin dosyası bulunamadı \: +OptionWizard.0=Collect Earth seçenekler +OptionWizard.1=Tarayıcı Seç +OptionWizard.10=Yedekleme klasörünü aç +OptionWizard.11=Blinmeyen\: yapılandırma kullanımı +OptionWizard.12=İstemci durumu +OptionWizard.13=Collect Earth Sunucu IP +OptionWizard.14=Collect Earth sunucu girişi (örn. 8023) +OptionWizard.15=Kaydet & Değişiklikleri uygula +OptionWizard.16=ID +OptionWizard.17=X-coord +OptionWizard.18=Y-coord +OptionWizard.19=Yükseklik +OptionWizard.2=İş akışı (sunucu/istemci) +OptionWizard.20=Google Earth içerikleri değiştirildi.
Lütfen Google Earth tarafından istendiğinde içeriğin yeniden yüklenmesini kabul edin. +OptionWizard.21=Güncelleme başarılı +OptionWizard.22=Eğim +OptionWizard.23=Google Earth verilerini yeniden açarken bir hata oluştu +OptionWizard.24=İptal +OptionWizard.25=İşlem Modu +OptionWizard.26=DB host +OptionWizard.27=Bu tanınmış bir Saiku klasörü değil ( start-saiku.bat dosyası mevcut değil) +OptionWizard.28=Saiku Sunucusu tanınmadı +OptionWizard.29=DB port +OptionWizard.3=Sunucu örneği +OptionWizard.30=SQLite seçenekleri +OptionWizard.31=Örnek veri +OptionWizard.32=Plot düzeni +OptionWizard.33=Anket Tanımı +OptionWizard.34=Gelişmiş +OptionWizard.35=Kontrol noktası sayısı +OptionWizard.36=Kontrol noktaları arasındaki mesafe (metre cinsinden) +OptionWizard.37=Plot kenarı ile mesafesi (metre cinsinden) +OptionWizard.38=CSV / CED dosyası doğru okunamıyor.
Dosyanın böyle bir virgülle ayrılmış değerlere sahip olması beklenir \:
+OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect +OptionWizard.4=Geçerli bilgisayar IP'si \: +OptionWizard.40=Projeler +OptionWizard.41=Yeni bir proje dosyası yükle +OptionWizard.42=CSV okuyucuyu kapatırken hata oluştu +OptionWizard.43=Anketin adı +OptionWizard.44=veritabanını otomatik olarak yedekle +OptionWizard.45=Earth Engine plot alanına yakınlaştırarak aç +OptionWizard.46=Plot alanı için Earth Engine Timelapse'yi aç +OptionWizard.47=Plot alanı için Bing Maps'i aç +OptionWizard.48=Formu Google Earth yerine bir tarayıcıda aç (LINUX için önerilir) +OptionWizard.49=Plot verisini içeren ced / csv dosyasının yolu +OptionWizard.5=Collect Earth Sunucu girişi\: +OptionWizard.50=Tarayıcı... +OptionWizard.51=Proje dosyası içe aktarılırken hata oluştu +OptionWizard.52=Yalnızca koordinatlara sahip CSV / CED dosyası +OptionWizard.53=Puan yok +OptionWizard.54=Merkez noktası +OptionWizard.55=Proje dosyası içe aktarılırken hata oluştu +OptionWizard.56=Proje yükle +OptionWizard.57=Önceden yüklenmiş projeler +OptionWizard.58=GEE Kod Düzenleyicisini açın (Güvenilir Test Cihazı erişimi gerektirir) +OptionWizard.59=Plot üzerinde Here Maps'i aç +OptionWizard.6=PostgreSQL DB parametreleri +OptionWizard.65=Saiku klasör yolu +OptionWizard.66=Tarayıcı... +OptionWizard.67=Firefox kısayol yolu +OptionWizard.68=Tarayıcı... +OptionWizard.7=Kullanıcı adı +OptionWizard.70=Kısayol dosyaları +OptionWizard.72=İkili dosyalar +OptionWizard.73=Chrome kısayol yolu +OptionWizard.74=Tarayıcı... +OptionWizard.76=Kısayol dosyaları +OptionWizard.78=İkili dosyalar +OptionWizard.79=KML işaretçi şablonu yolu +OptionWizard.8=Parola +OptionWizard.80=Tarayıcı... +OptionWizard.82=İşaretçi şablonu +OptionWizard.83=Form tasarımının HTML balon yolu +OptionWizard.84=Tarayıcı... +OptionWizard.86=HTML web sayfası +OptionWizard.87=IDM tanımıyla XML yolu +OptionWizard.88=Tarayıcı... +OptionWizard.9=DB Adı +OptionWizard.90=XML IDM tanımlama +OptionWizard.91=Sunucu (yönetici sürümü veya tek başına kullanım) +OptionWizard.92=İstemci (operatör/sunucuya bağlı) +OptionWizard.93=SQLite (Gömülü / tek dosya tabanlı) +OptionWizard.94=PostgreSQL +OptionWizard.95=Örnekleme noktalarının kenarı (metre olarak) +SaikuAnalysisListener.0=Evet - Saiku verilerini yenile (uzun işlem) +SaikuAnalysisListener.1=Hayır - Sadece Saiku'yu başlat +SaikuStarter.1=Saiku başlatılıyor +SaikuStarter.2=Saiku başlatılıyor birkaç dakika sürebilir, lütfen bekleyin \! +SaveEarthDataServlet.0=Boş istek +SaveEarthDataServlet.1=Veriyi veritabanına kaydederken sorun oluştu +SaveEarthDataServlet.2=Veri kaydedildi +SlopeCode.0=Düz (0-5) +EarthApp.11=Collect Earth zaten çalışıyor +EarthApp.21=Plotlara ait seçili CSV/CED grid dosyası bulunamadı \:
+EarthApp.23=CSV/CED dosyası ayarlanmadı \:

+EarthApp.24=İşaretçi şablonunu KML tanımına sahip dosya seçili yolda bulunamadı \:
+EarthApp.26=KML tanım dosyası ayarlanmadı \:

+EarthApp.27=HTML balon formunu içeren dosya seçili yolda bulunamadı \:
+EarthApp.29=Hiçbir HTML balon dosyası oluşturulmadı \:

+EarthApp.3=Daha Sonra Hatırlat +EarthApp.30=Lütfen Araçlar-> Özellikler menüsünden dosya konumunu düzeltin.. +EarthApp.4=Şimdi Güncelle +EarthApp.5=Tekrar hatırlatma +EarthApp.57=Collect Earth'ün yeni bir sürümü var\!
Nasıl devam etmek istiyorsun? +EarthApp.58=Güncelleme uyarısı +EarthApp.59=Proje dosyasını içe aktarırken hata oluştu +EarthApp.6=\ - Versiyon +EarthApp.61=Collect Earth dosyası açılamadı.
Lütfen Google Earth’ün kurulu olduÄŸundan emin olun. +EarthSurveyService.9=Alan gerekli +ExportActionListener.1=Kayıtların GönderileceÄŸi Tarihi Seç +ExportDialogProcessMonitor.0=Veri iÅŸleniyor... +ExportDialogProcessMonitor.1=İşlemi baÅŸlatmak için bekleniyor \: +ExportDialogProcessMonitor.4=Dışa aktarılan kayıtlar \: +ImportProcessMonitorDialog.0=İçe aktarılan kayıtlar \: +ImportActionListener.0=Doldurulmamış plotlar içe aktarılsın mı? +ImportActionListener.2=EÄŸer tıklarsanız NO sadece tüm verileri içeren "yeÅŸil" durumdaki plotlar içe aktarılacaktır. +ImportActionListener.3=BitmemiÅŸ kayıtları içe aktar +ImportDialogProcessMonitor.0=\ HESAPLANIYOR +ImportDialogProcessMonitor.11=İlk kayıt sayısı \: +ImportDialogProcessMonitor.2=Kayıtlar içe aktarılıyor... +ImportDialogProcessMonitor.5=Güncel içe aktarılan kayıt sayısı \: +ImportDialogProcessMonitor.8=Veri iÅŸleniyor... +InfiniteProgressMonitor.0=İşlemi iptal et +JFileChooserExistsAware.0=Collect Earth Proje dosya +KmlImportService.13=Konumları kaydetmek için CSV dosyası seçin +MissingPlotsListener.0=Veritabanında bulunmayan plotlar hakkında bilgi alınırken hata oluÅŸtu +MissingPlotsListener.1=Eksik plotlar +MissingPlotsListener.10=Örnekleme tasarımındaki toplam plotların sayısı \: +MissingPlotsListener.12=Eksik plotların sayısı \: +MissingPlotsListener.14=Bütün plotlar dolu\! +MissingPlotsListener.2=İçeriÄŸi panoya kopyala +MissingPlotsListener.3=Tüm verilerin doldurulup doldurulmadığını öğrenmek istediÄŸiniz plot bilgilerini (.csv veya .ced dosyaları) içeren dosyaları seçin. +MissingPlotsListener.4=Eksik plotlar - Bilgi +MissingPlotsListener.5=Dosyadan \: +MissingPlotsListener.6=CED dosyasına aktar +ProcessMonitorDialog.1=Satır numarasında ayrıştırma hatası +ProcessMonitorDialog.4=, sütunlar +ProcessMonitorDialog.5=\ -- deÄŸerler + +ImportXMLDialogProcessMonitor.1 = Verilerin üzerine yaz +ImportXMLDialogProcessMonitor.2 = Sadece yinelenmeyen plotları içe aktar + +YES=Evet +YES_TO_ALL=Tümüne evet +NO=Hayır +NO_TO_ALL=Tümüne hayır + +CollectEarthMenu.0=CEP dosyasını içe aktar +CollectEarthMenu.2=Hizmetler +CollectEarthMenu.3=Büyük CSV plot dosyalarını böl +CollectEarthMenu.4=Verileri XML'e aktar (belirli bir tarihten itibaren) +CollectEarthMenu.5=Collect yedeÄŸi için dışa aktar +CollectEarthMenu.6=Collect Backup verilerini dışa aktar (tüm veriler) +CollectEarthMenu.7=Collect Backup verilerini dışa aktar (belirli bir tarihten itibaren) +CollectEarthMenu.8=Verileri XML'e aktar (özet özniteliÄŸine göre filtrele) \ No newline at end of file From 65e4895785e4b2ac35639d303faccd56af61c89a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:36:41 +0100 Subject: [PATCH 0816/1620] New translations Messages_tr.properties (Portuguese) --- .../earth/app/view/Messages_pt.properties | 457 +++++++++--------- 1 file changed, 239 insertions(+), 218 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 353fe0d367..c9742c724a 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,221 +1,242 @@ -AboutDialog.19=Äã có lá»—i -AboutDialog.5=Truy cập website cá»§a chúng tôi để biết thêm thông tin OpenForis.org -AboutDialog.6=Xin lá»—i, đã có sá»± cố khi mở link trong brower chuẩn trong hệ thống cá»§a bạn. -AboutDialog.8=Ok -AspectCode.0=Bắc -AspectCode.1=Äông-Bắc -AspectCode.2=Äông -AspectCode.3=Äông-Nam -AspectCode.4=Nam -AspectCode.5=Tây-Nam -AspectCode.6=Tây -AspectCode.7=Tây-Bắc -CollectEarthWindow.0=Lá»—i khi xuất dữ liệu sang file CSV -CollectEarthWindow.1=Lá»—i xuất dữ liệu -CollectEarthWindow.10=File -CollectEarthWindow.11=Thoát -CollectEarthWindow.12=Công cụ -CollectEarthWindow.13=Xuất dữ liệu ra CSV -CollectEarthWindow.14=Khởi động SAIKU Analysis -CollectEarthWindow.15=Thuá»™c tính -CollectEarthWindow.16=Trợ giúp -CollectEarthWindow.17=Thông tin công bố -CollectEarthWindow.18=Tìm ô thiếu trong cÆ¡ sở dữ liệu +AboutDialog.19=Bir sorun oluÅŸtu +AboutDialog.5=Daha fazla bilgi için web sitemizi ziyaret edin OpenForis.org +AboutDialog.6=Üzgünüm, sisteminizin varsayılan tarayıcısı bu baÄŸlantıyı açmak isterken bir sorun oluÅŸtu. +AboutDialog.8=Tamam +AspectCode.0=Kuzey +AspectCode.1=Kuzey-doÄŸu +AspectCode.2=DoÄŸu +AspectCode.3=Güney-doÄŸu +AspectCode.4=Güney +AspectCode.5=Güney-batı +AspectCode.6=Batı +AspectCode.7=Kuzey-batı +CollectEarthWindow.0=Veri CSV dosyasına aktarılmaya çalışılırken hata oluÅŸtu +CollectEarthWindow.1=Dışa aktarma hatası +CollectEarthWindow.10=Dosya +CollectEarthWindow.11=Çıkış +CollectEarthWindow.12=Araçlar +CollectEarthWindow.13=Verileri CSV'ye aktar +CollectEarthWindow.14=SAIKU Analysis baÅŸlat +CollectEarthWindow.15=Özellikler +CollectEarthWindow.16=Yardım +CollectEarthWindow.17=Yasal uyarı +CollectEarthWindow.18=Veritabnında eksik plotları bulun CollectEarthWindow.19=Collect Earth -CollectEarthWindow.2=Ngôn ngữ -CollectEarthWindow.20=Số bản ghi trùng\: -CollectEarthWindow.21=Không tìm thấy biểu tượng cho khung chính -CollectEarthWindow.22=Bạn có chắc là muốn đóng Collect Earth?
Äóng cá»­a sổ cÅ©ng đóng luôn máy chá»§ Collect Earth -CollectEarthWindow.23=Cần khẳng định -CollectEarthWindow.24=Xuất ra XML -CollectEarthWindow.25=Bạn có muốn thêm các bản ghi này và bá» Ä‘i dữ liệu hiện thá»i không? -CollectEarthWindow.26=Ngưá»i sá»­ dụng -CollectEarthWindow.27=Cập nhật -CollectEarthWindow.28=Máy chá»§ Open Foris Collect Earth phải chạy khi ngưá»i sá»­ dụng giải Ä‘oán dữ liệu. -CollectEarthWindow.29=Chưa xác định cấu hình cho Máy chá»§ Saiku. -CollectEarthWindow.3=\ Lá»—i nhập -CollectEarthWindow.30=Äể mở cá»­a sổ này khi Ä‘ang sá»­ dụng Google Earth. -CollectEarthWindow.31=Xuất dữ liệu đã thu thập sang file CSV -CollectEarthWindow.32=Thoát -CollectEarthWindow.33=Tên ngưá»i sá»­ dụng phải dài hÆ¡n 5 chữ cái và ngắn hÆ¡n 50 chữ cái -CollectEarthWindow.34=Lá»—i kiểm chứng -CollectEarthWindow.35=TÊN NGƯỜI SỬ DỤNG CÃ’N TRá»NG\!
Hãy Ä‘iá»n tên ngưá»i sá»­ dụng và nhắp phím "Update". -CollectEarthWindow.36=Không được để trống phần tên ngưá»i sá»­ dụng -CollectEarthWindow.37=Äể mở -CollectEarthWindow.38=file CSV -CollectEarthWindow.39=THÔNG BÃO\: Nên lưu dá»± phòng dữ liệu hiện thá»i(Xuất ra XML) trước khi nhập dữ liệu má»›i -CollectEarthWindow.4=Thông tin công bố cá»§a FAO -CollectEarthWindow.40=Thiết lập đưá»ng dẫn tá»›i thư mục cài đặt Saiku Server trong Tools->Properties->Advanced tab. -CollectEarthWindow.41=Ghi dữ liệu xuất ra vào file\: -CollectEarthWindow.42=Thoát -CollectEarthWindow.43=Tìm thấy bản ghi có mâu thuẫn -CollectEarthWindow.44=Nhập/Xuất dữ liệu -CollectEarthWindow.45=Xuất dữ liệu ra XML (nén) -CollectEarthWindow.46=Nhập dữ liệu má»›i từ file ZIP (XML nén) -CollectEarthWindow.55=Cập nhật các bản ghi hiện thá»i bằng CSV -CollectEarthWindow.47=Chưa định cấu hình cho Saiku Server -CollectEarthWindow.48=ZIP files -CollectEarthWindow.49=Files CSV tổng hợp -CollectEarthWindow.5=Äóng -CollectEarthWindow.50=Mở hướng dẫn ngưá»i sá»­ dụng -CollectEarthWindow.51=Kiểm tra cập nhật cá»§a Collect Earth -CollectEarthWindow.52=Mở file nhật ký ứng dụng -CollectEarthWindow.53=File nhật ký cá»§a Collect Earth -CollectEarthWindow.54=Nạp các Ä‘iểm từ KML -CollectEarthWindow.56=Vá»... -CollectEarthWindow.57=Äang chạy quá trình khởi động Saiku, xin đợi. -CollectEarthWindow.58=Không thể khởi động Saiku analysis -CollectEarthWindow.59=Bạn có muốn tạo lại bá»™ dữ liệu cho Saiku analysis không?
Quá trình này sẽ mất một vài phút.
Nếu bạn chá»n "YES" sẽ tạo ra má»™t bá»™ dữ liệu má»›i vá»›i các thông tin cập nhật nhất. -CollectEarthWindow.6=Xuất ra bảng tổng hợp -CollectEarthWindow.60=Tạo dữ liệu Saiku -CollectEarthWindow.61=Xuất dữ liệu ra XML (các bản ghi chỉnh sá»­a từ lần xuất trước) -CollectEarthWindow.62=Vá»... -CollectEarthWindow.63=Lá»—i khi nạp Ä‘iểm từ KML -CollectEarthWindow.64=Há»— trợ kỹ thuật -CollectEarthWindow.7=Lá»—i khi nhập dữ liệu -CollectEarthWindow.8=Không tìm thấy văn bản thông báo -CollectEarthWindow.9=Dữ liệu nhập vào có chứa các bản ghi đã có trong cÆ¡ sở dữ liệu cá»§a bạn. -DynamicsCode.0=Ban đầu là rừng -DynamicsCode.1=Ban đầu là trảng cá» -DynamicsCode.2=Ban đầu là khu dân cư -DynamicsCode.3=Ban đầu là đất khác -DynamicsCode.4=Ban đầu là đất ngập nước -DynamicsCode.5=Ban đầu là đất trồng trá»t -OpenTextFileListener.0=không tìm thấy file văn bản tại\: -OptionWizard.0=Các lá»±a chá»n cá»§a Collect Earth -OptionWizard.1=Chá»n Browser -OptionWizard.10=Mở thư mục lưu dá»± phòng -OptionWizard.11=Không biết\: hãy sá»­ dụng ifconfig -OptionWizard.12=Vi dụ cá»§a khác -OptionWizard.13=Äịa chỉ IP cá»§a máy chá»§ Collect Earth -OptionWizard.14=Cổng máy chá»§ Collect Earth (vd\: 8023) -OptionWizard.15=Ghi và áo dụng thay đổi +CollectEarthWindow.2=Dil +CollectEarthWindow.20=Kopyalanan kayıt sayısı\: +CollectEarthWindow.21=Ana bilgisayar için simge bulunamadı +CollectEarthWindow.22=Collect Earth'ü kapatmak istediÄŸinizden emin misiniz?
Pencereyi kapatmanız durumunda Collect Earth sunucusunu da kapatır. +CollectEarthWindow.23=Onay gerekiyor +CollectEarthWindow.24=XML Dışa aktar +CollectEarthWindow.25=Mevcut verileriniz kaybolacak yine de bu kayıtları eklemek istiyor musunuz? +CollectEarthWindow.26=Operatör +CollectEarthWindow.27=Güncelle +CollectEarthWindow.28=Operatör, verileri değerlendirirken Open Foris Collect Earth sunucusu çalışmalıdır. +CollectEarthWindow.29=Saiku Sunucusu yapılandırılmadı. +CollectEarthWindow.3=İçe aktarma hatası +CollectEarthWindow.30=Lütfen Google Earth'ü kullanırken bu pencereyi açık tutun. +CollectEarthWindow.31=Toplanan verileri CSV dosyasına aktar +CollectEarthWindow.32=Vazgeç +CollectEarthWindow.33=Operatör adı 5 karakterden uzun ve 50 karakterden kısa olmalıdır +CollectEarthWindow.34=Doğrulama hatası +CollectEarthWindow.35=OPERATÖR ADI BOŞ\!
Lütfen operatör adını girin ve "Güncelle" düğmesine basın. +CollectEarthWindow.36=Operatör adı boş olamaz +CollectEarthWindow.37=Açık Tut +CollectEarthWindow.38=CSV dosyaları +CollectEarthWindow.39=DİKKAT\: Yeni verileri almadan önce mevcut verilerinizi (XML'e Aktar) yedeklemeniz önerilir. +CollectEarthWindow.4=FAO Yasal uyarı bildirimleri +CollectEarthWindow.40=Araçlar-> Özellikler-> Gelişmiş sekmesinde Saiku Sunucusunun kurulu olduğu klasörün yolunu ayarlayın. +CollectEarthWindow.41=Dışa aktarılan verileri dosyaya kaydet +CollectEarthWindow.42=Vazgeç +CollectEarthWindow.43=Yinelenen kayıtlar bulundu +CollectEarthWindow.44=Verileri İçe/Dışa aktar +CollectEarthWindow.45=Verileri XML'e aktar (Sıkıştırılmış) +CollectEarthWindow.46=Verileri ZIP'ten içe aktar (sıkıştırılmış XML) +CollectEarthWindow.55=CSV kullanarak mevcut kayıtları güncelle +CollectEarthWindow.47=Saiku Sunucusu yapılandırılmadı +CollectEarthWindow.48=Zip/collect-data dosyası +CollectEarthWindow.49=Fusion table CSV dosyası +CollectEarthWindow.5=Kapat +CollectEarthWindow.50=Kullanım Kılavuzunu Aç +CollectEarthWindow.51=Collect Earth güncellemelerini kontrol et +CollectEarthWindow.52=Uygulama Günlüğünü Aç +CollectEarthWindow.53=Collect Earth Günlüğü +CollectEarthWindow.54=Noktaları KML'den yükle +CollectEarthWindow.56=Hakkında... +CollectEarthWindow.57=Saiku başlatıcısı işlemi hala devam ediyor, lütfen bekleyin. +CollectEarthWindow.58=Saiku analysis başlatılamıyor +CollectEarthWindow.59=Saiku analizi için veri setini yeniden oluşturmak ister misiniz?
Bu iÅŸlem zaman alabilir.
"EVET" üzerine tıklarsanız, en son bilgileri içeren yeni bir veri seti oluÅŸturulur. +CollectEarthWindow.6=Fusion Table'a aktar +CollectEarthWindow.60=Saiku veri üretimi +CollectEarthWindow.61=Verileri XML'e aktar (Son dışa aktarımdan bu yana deÄŸiÅŸtirilmiÅŸ kayıtlar) +CollectEarthWindow.62=Hakkında... +CollectEarthWindow.63=Noktalar KML'den alırken hata oluÅŸtu +CollectEarthWindow.64=Teknik Destek +CollectEarthWindow.7=Veri içe aktarılırken hata oluÅŸtu +CollectEarthWindow.8=Yasal uyarı metni bulunamadı +CollectEarthWindow.9=Alınan veriler veritabanında zaten mevcut olan kayıtları içerir. +CollectEarthWindow.65=Operatör adı deÄŸiÅŸtirildi +CollectEarthWindow.66=Operatör adı +CollectEarthWindow.70=Anket rehberini aç +DynamicsCode.0=BaÅŸlangıçta Orman +DynamicsCode.1=BaÅŸlangıçta Mera +DynamicsCode.2=BaÅŸlangıçta YerleÅŸim +DynamicsCode.3=BaÅŸlangıçta DiÄŸer +DynamicsCode.4=BaÅŸlangıçta Sulak +DynamicsCode.5=BaÅŸlangıçta Tarım +OpenTextFileListener.0=Metin dosyası bulunamadı \: +OptionWizard.0=Collect Earth seçenekler +OptionWizard.1=Tarayıcı Seç +OptionWizard.10=Yedekleme klasörünü aç +OptionWizard.11=Blinmeyen\: yapılandırma kullanımı +OptionWizard.12=İstemci durumu +OptionWizard.13=Collect Earth Sunucu IP +OptionWizard.14=Collect Earth sunucu giriÅŸi (örn. 8023) +OptionWizard.15=Kaydet & DeÄŸiÅŸiklikleri uygula OptionWizard.16=ID -OptionWizard.17=Tá»a độ X -OptionWizard.18=Tá»a độ Y -OptionWizard.19=Äá»™ cao -OptionWizard.2=Dòng công tác (máy chá»§/khách) -OptionWizard.20=Ná»™i dung cá»§a Google Earth đã thay đổi.
Äá» nghị chấp nhận tải lại ná»™i dung khi Google Earth gợi ý. -OptionWizard.21=Cập nhật thành công -OptionWizard.22=Dốc -OptionWizard.23=Có lá»—i khi mở lại dữ liệu Google Earth -OptionWizard.24=Há»§y -OptionWizard.25=Mode vận hành -OptionWizard.26=NÆ¡i lưu cÆ¡ sở dữ liệu -OptionWizard.27=Äây không phải là thư mục Saiku (hiện không có file start-saiku.bat) -OptionWizard.28=Không nhận được máy chá»§ Saiku -OptionWizard.29=Cổng cÆ¡ sở dữ liệu -OptionWizard.3=Ví dụ cá»§a máy chá»§ -OptionWizard.30=Các lá»±a chá»n cá»§a SQLite -OptionWizard.31=Dữ liệu mẫu -OptionWizard.32=SÆ¡ đồ mẫu -OptionWizard.33=Äịnh nghÄ©a khảo sát -OptionWizard.34=Nâng cao -OptionWizard.35=Số Ä‘iểm mẫu -OptionWizard.36=Khoảng cách giữa các Ä‘iểm mẫu (tính theo mét) -OptionWizard.37=Lá» vá»›i biên ô (tính theo mét) -OptionWizard.38=Không Ä‘á»c được đúng file CSV/CED.
Cần có dấu phảy để phân tách giá trị giống như sau \:
-OptionWizard.39=ID,Tá»a độ Y,tá»a độ X,độ cao,độ dốc,tá»· lệ -OptionWizard.4=Äịa chỉ IP hiện tại cá»§a máy tính\: -OptionWizard.40=Các project -OptionWizard.41=tải file project má»›i -OptionWizard.42=Lá»—i khi đóng CSV reader -OptionWizard.43=Tên khảo sát -OptionWizard.44=tá»± động lưu dá»± phòng dữ liệu tại -OptionWizard.45=Mở Earth Engine để phóng to vào khu vá»±c ô -OptionWizard.46=Mở Earth Engine timelapse cho khu vá»±c ô -OptionWizard.47=Mở Bing Maps cho khu vá»±c ô -OptionWizard.48=Mở form trên browser thay vì mở Google Earth (khuyến cáo cho LINUX) -OptionWizard.49=ÄÆ°á»ng dẫn tá»›i file ced/csv file vá»›i dữ liệu ô -OptionWizard.5=Cổng máy chá»§ Collect Earth\: -OptionWizard.50=Browse... -OptionWizard.51=Lá»—i nhập file project -OptionWizard.52=File CSV/CED chỉ có tá»a độ -OptionWizard.53=Ô vuông -OptionWizard.54=Äiểm trung tâm -OptionWizard.55=Lá»—i khi nhập thư mục project -OptionWizard.56=Tải project -OptionWizard.57=Các project đã tải -OptionWizard.58=Mở GEE Code Editor (cần phải có quyá»n truy cập Trusted Tester) -OptionWizard.59=Mở Here Maps tập trung vào ô -OptionWizard.6=Các thông số cá»§a CSDL PostgreSQL -OptionWizard.65=ÄÆ°á»ng dẫn tá»›i thư mục Saiku -OptionWizard.66=Browse... -OptionWizard.67=ÄÆ°á»ng dẫn tá»›i Firefox executable (file exe) -OptionWizard.68=Browse... -OptionWizard.7=Tên ngưá»i sá»­ dụng -OptionWizard.70=File chạy -OptionWizard.72=File nhị phân -OptionWizard.73=ÄÆ°á»ng dẫn tá»›i Chrome executable (file exe) -OptionWizard.74=Browse... -OptionWizard.76=File exe -OptionWizard.78=File nhị phân -OptionWizard.79=ÄÆ°á»ng dẫn tá»›i KML Freemarker template -OptionWizard.8=Mật khẩu -OptionWizard.80=Browse... -OptionWizard.82=Freemarker template -OptionWizard.83=ÄÆ°á»ng dẫn tá»›i mẫu thiết kế HTML Balloon -OptionWizard.84=Browse... -OptionWizard.86=HTML webpage -OptionWizard.87=ÄÆ°á»ng dẫn tá»›i XML vá»›i định nghÄ©a IDM -OptionWizard.88=Browse... -OptionWizard.9=Tên CSDL -OptionWizard.90=Äịnh nghÄ©a XML IDM -OptionWizard.91=Máy chá»§ (phiên bản quản lý hoặc sá»­ dụng độc lập) -OptionWizard.92=Khách (ngưá»i sá»­ dụng/kết nối vá»›i máy chá»§) -OptionWizard.93=SQLite (tích hợp/file đơn lẻ) +OptionWizard.17=X-coord +OptionWizard.18=Y-coord +OptionWizard.19=Yükseklik +OptionWizard.2=İş akışı (sunucu/istemci) +OptionWizard.20=Google Earth içerikleri deÄŸiÅŸtirildi.
Lütfen Google Earth tarafından istendiğinde içeriğin yeniden yüklenmesini kabul edin. +OptionWizard.21=Güncelleme başarılı +OptionWizard.22=Eğim +OptionWizard.23=Google Earth verilerini yeniden açarken bir hata oluştu +OptionWizard.24=İptal +OptionWizard.25=İşlem Modu +OptionWizard.26=DB host +OptionWizard.27=Bu tanınmış bir Saiku klasörü değil ( start-saiku.bat dosyası mevcut değil) +OptionWizard.28=Saiku Sunucusu tanınmadı +OptionWizard.29=DB port +OptionWizard.3=Sunucu örneği +OptionWizard.30=SQLite seçenekleri +OptionWizard.31=Örnek veri +OptionWizard.32=Plot düzeni +OptionWizard.33=Anket Tanımı +OptionWizard.34=Gelişmiş +OptionWizard.35=Kontrol noktası sayısı +OptionWizard.36=Kontrol noktaları arasındaki mesafe (metre cinsinden) +OptionWizard.37=Plot kenarı ile mesafesi (metre cinsinden) +OptionWizard.38=CSV / CED dosyası doğru okunamıyor.
Dosyanın böyle bir virgülle ayrılmış değerlere sahip olması beklenir \:
+OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect +OptionWizard.4=Geçerli bilgisayar IP'si \: +OptionWizard.40=Projeler +OptionWizard.41=Yeni bir proje dosyası yükle +OptionWizard.42=CSV okuyucuyu kapatırken hata oluÅŸtu +OptionWizard.43=Anketin adı +OptionWizard.44=veritabanını otomatik olarak yedekle +OptionWizard.45=Earth Engine plot alanına yakınlaÅŸtırarak aç +OptionWizard.46=Plot alanı için Earth Engine Timelapse'yi aç +OptionWizard.47=Plot alanı için Bing Maps'i aç +OptionWizard.48=Formu Google Earth yerine bir tarayıcıda aç (LINUX için önerilir) +OptionWizard.49=Plot verisini içeren ced / csv dosyasının yolu +OptionWizard.5=Collect Earth Sunucu giriÅŸi\: +OptionWizard.50=Tarayıcı... +OptionWizard.51=Proje dosyası içe aktarılırken hata oluÅŸtu +OptionWizard.52=Yalnızca koordinatlara sahip CSV / CED dosyası +OptionWizard.53=Puan yok +OptionWizard.54=Merkez noktası +OptionWizard.55=Proje dosyası içe aktarılırken hata oluÅŸtu +OptionWizard.56=Proje yükle +OptionWizard.57=Önceden yüklenmiÅŸ projeler +OptionWizard.58=GEE Kod Düzenleyicisini açın (Güvenilir Test Cihazı eriÅŸimi gerektirir) +OptionWizard.59=Plot üzerinde Here Maps'i aç +OptionWizard.6=PostgreSQL DB parametreleri +OptionWizard.65=Saiku klasör yolu +OptionWizard.66=Tarayıcı... +OptionWizard.67=Firefox kısayol yolu +OptionWizard.68=Tarayıcı... +OptionWizard.7=Kullanıcı adı +OptionWizard.70=Kısayol dosyaları +OptionWizard.72=İkili dosyalar +OptionWizard.73=Chrome kısayol yolu +OptionWizard.74=Tarayıcı... +OptionWizard.76=Kısayol dosyaları +OptionWizard.78=İkili dosyalar +OptionWizard.79=KML iÅŸaretçi ÅŸablonu yolu +OptionWizard.8=Parola +OptionWizard.80=Tarayıcı... +OptionWizard.82=İşaretçi ÅŸablonu +OptionWizard.83=Form tasarımının HTML balon yolu +OptionWizard.84=Tarayıcı... +OptionWizard.86=HTML web sayfası +OptionWizard.87=IDM tanımıyla XML yolu +OptionWizard.88=Tarayıcı... +OptionWizard.9=DB Adı +OptionWizard.90=XML IDM tanımlama +OptionWizard.91=Sunucu (yönetici sürümü veya tek başına kullanım) +OptionWizard.92=İstemci (operatör/sunucuya baÄŸlı) +OptionWizard.93=SQLite (Gömülü / tek dosya tabanlı) OptionWizard.94=PostgreSQL -SaikuAnalysisListener.0=Yes - Làm má»›i lại dữ liệu Saiku (quá trình dài) -SaikuAnalysisListener.1=No - chỉ khởi động Saiku -SaikuStarter.1=Khởi động Saiku -SaikuStarter.2=Cần vài phút để khởi động Saiku, xin đợi\! -SaveEarthDataServlet.0=Yêu cầu trống -SaveEarthDataServlet.1=Có trục trặc khi ghi dữ liệu vào CSDL -SaveEarthDataServlet.2=Dữ liệu đã được ghi -SlopeCode.0=Bằng phẳng (0-5) -EarthApp.11=Collect Earth Ä‘ang chạy -EarthApp.21=Không tìm thấy file chứa lưới ô trong đưá»ng dẫn đã chá»n \:
-EarthApp.23=Chưa thiết lập file CSV/CED \:

-EarthApp.24=Không tìm thấy file chứa Freemarker template vá»›i định nghÄ©a KML trong đưá»ng dẫn đã chá»n\:
-EarthApp.26=Chưa thiết lập file định nghĩa KML d\:

-EarthApp.27=Không tìm thấy file chứa mẫu HTML balloon trong đưá»ng dẫn đã chá»n\:
-EarthApp.29=Chưa thiết lập file HTML balloon \:

-EarthApp.3=Nhắc nhở sau -EarthApp.30=Xin hãy Ä‘iá»u chỉnh đúng địa chỉ file trong Tools->Properties menu. -EarthApp.4=Cập nhật luôn -EarthApp.5=Không nhắc nữa -EarthApp.57=Äã có phiên bản má»›i cá»§a Collect Earth\!
Bạn muốn làm tiếp như thế nào? -EarthApp.58=Thông báo cập nhật -EarthApp.59=Lỗi khi nhập file project -EarthApp.6=\ - Phiên bản -EarthApp.61=Không mở được file Collect Earth.
Äá» nghị đảm bảo đã cài đặt Google Earth. -EarthSurveyService.9=Trưá»ng bắt buá»™c -ExportActionListener.1=Chá»n ngày xuất bản ghi -ExportDialogProcessMonitor.0=Äang xá»­ lý dữ liệu... -ExportDialogProcessMonitor.1=Äang đợi khởi động quá trình\: -ExportDialogProcessMonitor.4=Các bản ghi đã xuất\: -ImportProcessMonitorDialog.0=Các bản ghi đã nhập\: -ImportActionListener.0=Có nhập dữ liệu các ô chưa được Ä‘iá»n đầy đủ không? -ImportActionListener.2=Nếu bạn chá»n NO sẽ chỉ nhập dữ liệu cá»§a các ô có trạng thái màu "xanh lá cây", các ô đã có đầy đủ dữ liệu. -ImportActionListener.3=Nhập các bản ghi chưa hoàn tất -ImportDialogProcessMonitor.0=\ ÄANG TÃNH TOÃN -ImportDialogProcessMonitor.11=Số lượng ban đầu các bản ghi\: -ImportDialogProcessMonitor.2=Äang nhập các bản ghi... -ImportDialogProcessMonitor.5=Số lượng thá»±c tế các bản ghi đã nhập\: -ImportDialogProcessMonitor.8=Äang xá»­ lý dữ liệu... -InfiniteProgressMonitor.0=Há»§y lệnh -JFileChooserExistsAware.0=File project cá»§a Collect Earth -KmlImportService.13=Chá»n file CSV file để ghi địa Ä‘iểm cá»§a ô vào -MissingPlotsListener.0=Lá»—i khi lấy thông tin vỠô không có trong CSDL -MissingPlotsListener.1=Các ô thiếu -MissingPlotsListener.10=Tổng số ô trong thiết kế chá»n mẫu \: -MissingPlotsListener.12=Số ô thiếu\: -MissingPlotsListener.14=Äã Ä‘iá»n tất cả các ô\! -MissingPlotsListener.2=Sao chép ná»™i dung vào bàn phím -MissingPlotsListener.3=Lá»±a chá»n file có chứa thông tin ô ( file .csv hoặc .ced ) mà bạn muốn biết đã Ä‘iá»n đủ dữ liệu chưa. -MissingPlotsListener.4=Các ô thiếu - thông tin -MissingPlotsListener.5=Từ file \: -MissingPlotsListener.6=Xuất ra file CED -ProcessMonitorDialog.1=Tìm lá»—i trên số dòng -ProcessMonitorDialog.4=, cá»™t -ProcessMonitorDialog.5=\ -- giá trị +OptionWizard.95=Örnekleme noktalarının kenarı (metre olarak) +SaikuAnalysisListener.0=Evet - Saiku verilerini yenile (uzun iÅŸlem) +SaikuAnalysisListener.1=Hayır - Sadece Saiku'yu baÅŸlat +SaikuStarter.1=Saiku baÅŸlatılıyor +SaikuStarter.2=Saiku baÅŸlatılıyor birkaç dakika sürebilir, lütfen bekleyin \! +SaveEarthDataServlet.0=BoÅŸ istek +SaveEarthDataServlet.1=Veriyi veritabanına kaydederken sorun oluÅŸtu +SaveEarthDataServlet.2=Veri kaydedildi +SlopeCode.0=Düz (0-5) +EarthApp.11=Collect Earth zaten çalışıyor +EarthApp.21=Plotlara ait seçili CSV/CED grid dosyası bulunamadı \:
+EarthApp.23=CSV/CED dosyası ayarlanmadı \:

+EarthApp.24=İşaretçi şablonunu KML tanımına sahip dosya seçili yolda bulunamadı \:
+EarthApp.26=KML tanım dosyası ayarlanmadı \:

+EarthApp.27=HTML balon formunu içeren dosya seçili yolda bulunamadı \:
+EarthApp.29=Hiçbir HTML balon dosyası oluşturulmadı \:

+EarthApp.3=Daha Sonra Hatırlat +EarthApp.30=Lütfen Araçlar-> Özellikler menüsünden dosya konumunu düzeltin.. +EarthApp.4=Şimdi Güncelle +EarthApp.5=Tekrar hatırlatma +EarthApp.57=Collect Earth'ün yeni bir sürümü var\!
Nasıl devam etmek istiyorsun? +EarthApp.58=Güncelleme uyarısı +EarthApp.59=Proje dosyasını içe aktarırken hata oluştu +EarthApp.6=\ - Versiyon +EarthApp.61=Collect Earth dosyası açılamadı.
Lütfen Google Earth’ün kurulu olduÄŸundan emin olun. +EarthSurveyService.9=Alan gerekli +ExportActionListener.1=Kayıtların GönderileceÄŸi Tarihi Seç +ExportDialogProcessMonitor.0=Veri iÅŸleniyor... +ExportDialogProcessMonitor.1=İşlemi baÅŸlatmak için bekleniyor \: +ExportDialogProcessMonitor.4=Dışa aktarılan kayıtlar \: +ImportProcessMonitorDialog.0=İçe aktarılan kayıtlar \: +ImportActionListener.0=Doldurulmamış plotlar içe aktarılsın mı? +ImportActionListener.2=EÄŸer tıklarsanız NO sadece tüm verileri içeren "yeÅŸil" durumdaki plotlar içe aktarılacaktır. +ImportActionListener.3=BitmemiÅŸ kayıtları içe aktar +ImportDialogProcessMonitor.0=\ HESAPLANIYOR +ImportDialogProcessMonitor.11=İlk kayıt sayısı \: +ImportDialogProcessMonitor.2=Kayıtlar içe aktarılıyor... +ImportDialogProcessMonitor.5=Güncel içe aktarılan kayıt sayısı \: +ImportDialogProcessMonitor.8=Veri iÅŸleniyor... +InfiniteProgressMonitor.0=İşlemi iptal et +JFileChooserExistsAware.0=Collect Earth Proje dosya +KmlImportService.13=Konumları kaydetmek için CSV dosyası seçin +MissingPlotsListener.0=Veritabanında bulunmayan plotlar hakkında bilgi alınırken hata oluÅŸtu +MissingPlotsListener.1=Eksik plotlar +MissingPlotsListener.10=Örnekleme tasarımındaki toplam plotların sayısı \: +MissingPlotsListener.12=Eksik plotların sayısı \: +MissingPlotsListener.14=Bütün plotlar dolu\! +MissingPlotsListener.2=İçeriÄŸi panoya kopyala +MissingPlotsListener.3=Tüm verilerin doldurulup doldurulmadığını öğrenmek istediÄŸiniz plot bilgilerini (.csv veya .ced dosyaları) içeren dosyaları seçin. +MissingPlotsListener.4=Eksik plotlar - Bilgi +MissingPlotsListener.5=Dosyadan \: +MissingPlotsListener.6=CED dosyasına aktar +ProcessMonitorDialog.1=Satır numarasında ayrıştırma hatası +ProcessMonitorDialog.4=, sütunlar +ProcessMonitorDialog.5=\ -- deÄŸerler + +ImportXMLDialogProcessMonitor.1 = Verilerin üzerine yaz +ImportXMLDialogProcessMonitor.2 = Sadece yinelenmeyen plotları içe aktar + +YES=Evet +YES_TO_ALL=Tümüne evet +NO=Hayır +NO_TO_ALL=Tümüne hayır + +CollectEarthMenu.0=CEP dosyasını içe aktar +CollectEarthMenu.2=Hizmetler +CollectEarthMenu.3=Büyük CSV plot dosyalarını böl +CollectEarthMenu.4=Verileri XML'e aktar (belirli bir tarihten itibaren) +CollectEarthMenu.5=Collect yedeÄŸi için dışa aktar +CollectEarthMenu.6=Collect Backup verilerini dışa aktar (tüm veriler) +CollectEarthMenu.7=Collect Backup verilerini dışa aktar (belirli bir tarihten itibaren) +CollectEarthMenu.8=Verileri XML'e aktar (özet özniteliÄŸine göre filtrele) \ No newline at end of file From 3d5116989580aa6121a815c8792873c3f06fece9 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:36:43 +0100 Subject: [PATCH 0817/1620] New translations Messages_tr.properties (English) --- .../earth/app/view/Messages_en.properties | 457 +++++++++--------- 1 file changed, 239 insertions(+), 218 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 353fe0d367..c9742c724a 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,221 +1,242 @@ -AboutDialog.19=Äã có lá»—i -AboutDialog.5=Truy cập website cá»§a chúng tôi để biết thêm thông tin OpenForis.org -AboutDialog.6=Xin lá»—i, đã có sá»± cố khi mở link trong brower chuẩn trong hệ thống cá»§a bạn. -AboutDialog.8=Ok -AspectCode.0=Bắc -AspectCode.1=Äông-Bắc -AspectCode.2=Äông -AspectCode.3=Äông-Nam -AspectCode.4=Nam -AspectCode.5=Tây-Nam -AspectCode.6=Tây -AspectCode.7=Tây-Bắc -CollectEarthWindow.0=Lá»—i khi xuất dữ liệu sang file CSV -CollectEarthWindow.1=Lá»—i xuất dữ liệu -CollectEarthWindow.10=File -CollectEarthWindow.11=Thoát -CollectEarthWindow.12=Công cụ -CollectEarthWindow.13=Xuất dữ liệu ra CSV -CollectEarthWindow.14=Khởi động SAIKU Analysis -CollectEarthWindow.15=Thuá»™c tính -CollectEarthWindow.16=Trợ giúp -CollectEarthWindow.17=Thông tin công bố -CollectEarthWindow.18=Tìm ô thiếu trong cÆ¡ sở dữ liệu +AboutDialog.19=Bir sorun oluÅŸtu +AboutDialog.5=Daha fazla bilgi için web sitemizi ziyaret edin OpenForis.org +AboutDialog.6=Üzgünüm, sisteminizin varsayılan tarayıcısı bu baÄŸlantıyı açmak isterken bir sorun oluÅŸtu. +AboutDialog.8=Tamam +AspectCode.0=Kuzey +AspectCode.1=Kuzey-doÄŸu +AspectCode.2=DoÄŸu +AspectCode.3=Güney-doÄŸu +AspectCode.4=Güney +AspectCode.5=Güney-batı +AspectCode.6=Batı +AspectCode.7=Kuzey-batı +CollectEarthWindow.0=Veri CSV dosyasına aktarılmaya çalışılırken hata oluÅŸtu +CollectEarthWindow.1=Dışa aktarma hatası +CollectEarthWindow.10=Dosya +CollectEarthWindow.11=Çıkış +CollectEarthWindow.12=Araçlar +CollectEarthWindow.13=Verileri CSV'ye aktar +CollectEarthWindow.14=SAIKU Analysis baÅŸlat +CollectEarthWindow.15=Özellikler +CollectEarthWindow.16=Yardım +CollectEarthWindow.17=Yasal uyarı +CollectEarthWindow.18=Veritabnında eksik plotları bulun CollectEarthWindow.19=Collect Earth -CollectEarthWindow.2=Ngôn ngữ -CollectEarthWindow.20=Số bản ghi trùng\: -CollectEarthWindow.21=Không tìm thấy biểu tượng cho khung chính -CollectEarthWindow.22=Bạn có chắc là muốn đóng Collect Earth?
Äóng cá»­a sổ cÅ©ng đóng luôn máy chá»§ Collect Earth -CollectEarthWindow.23=Cần khẳng định -CollectEarthWindow.24=Xuất ra XML -CollectEarthWindow.25=Bạn có muốn thêm các bản ghi này và bá» Ä‘i dữ liệu hiện thá»i không? -CollectEarthWindow.26=Ngưá»i sá»­ dụng -CollectEarthWindow.27=Cập nhật -CollectEarthWindow.28=Máy chá»§ Open Foris Collect Earth phải chạy khi ngưá»i sá»­ dụng giải Ä‘oán dữ liệu. -CollectEarthWindow.29=Chưa xác định cấu hình cho Máy chá»§ Saiku. -CollectEarthWindow.3=\ Lá»—i nhập -CollectEarthWindow.30=Äể mở cá»­a sổ này khi Ä‘ang sá»­ dụng Google Earth. -CollectEarthWindow.31=Xuất dữ liệu đã thu thập sang file CSV -CollectEarthWindow.32=Thoát -CollectEarthWindow.33=Tên ngưá»i sá»­ dụng phải dài hÆ¡n 5 chữ cái và ngắn hÆ¡n 50 chữ cái -CollectEarthWindow.34=Lá»—i kiểm chứng -CollectEarthWindow.35=TÊN NGƯỜI SỬ DỤNG CÃ’N TRá»NG\!
Hãy Ä‘iá»n tên ngưá»i sá»­ dụng và nhắp phím "Update". -CollectEarthWindow.36=Không được để trống phần tên ngưá»i sá»­ dụng -CollectEarthWindow.37=Äể mở -CollectEarthWindow.38=file CSV -CollectEarthWindow.39=THÔNG BÃO\: Nên lưu dá»± phòng dữ liệu hiện thá»i(Xuất ra XML) trước khi nhập dữ liệu má»›i -CollectEarthWindow.4=Thông tin công bố cá»§a FAO -CollectEarthWindow.40=Thiết lập đưá»ng dẫn tá»›i thư mục cài đặt Saiku Server trong Tools->Properties->Advanced tab. -CollectEarthWindow.41=Ghi dữ liệu xuất ra vào file\: -CollectEarthWindow.42=Thoát -CollectEarthWindow.43=Tìm thấy bản ghi có mâu thuẫn -CollectEarthWindow.44=Nhập/Xuất dữ liệu -CollectEarthWindow.45=Xuất dữ liệu ra XML (nén) -CollectEarthWindow.46=Nhập dữ liệu má»›i từ file ZIP (XML nén) -CollectEarthWindow.55=Cập nhật các bản ghi hiện thá»i bằng CSV -CollectEarthWindow.47=Chưa định cấu hình cho Saiku Server -CollectEarthWindow.48=ZIP files -CollectEarthWindow.49=Files CSV tổng hợp -CollectEarthWindow.5=Äóng -CollectEarthWindow.50=Mở hướng dẫn ngưá»i sá»­ dụng -CollectEarthWindow.51=Kiểm tra cập nhật cá»§a Collect Earth -CollectEarthWindow.52=Mở file nhật ký ứng dụng -CollectEarthWindow.53=File nhật ký cá»§a Collect Earth -CollectEarthWindow.54=Nạp các Ä‘iểm từ KML -CollectEarthWindow.56=Vá»... -CollectEarthWindow.57=Äang chạy quá trình khởi động Saiku, xin đợi. -CollectEarthWindow.58=Không thể khởi động Saiku analysis -CollectEarthWindow.59=Bạn có muốn tạo lại bá»™ dữ liệu cho Saiku analysis không?
Quá trình này sẽ mất một vài phút.
Nếu bạn chá»n "YES" sẽ tạo ra má»™t bá»™ dữ liệu má»›i vá»›i các thông tin cập nhật nhất. -CollectEarthWindow.6=Xuất ra bảng tổng hợp -CollectEarthWindow.60=Tạo dữ liệu Saiku -CollectEarthWindow.61=Xuất dữ liệu ra XML (các bản ghi chỉnh sá»­a từ lần xuất trước) -CollectEarthWindow.62=Vá»... -CollectEarthWindow.63=Lá»—i khi nạp Ä‘iểm từ KML -CollectEarthWindow.64=Há»— trợ kỹ thuật -CollectEarthWindow.7=Lá»—i khi nhập dữ liệu -CollectEarthWindow.8=Không tìm thấy văn bản thông báo -CollectEarthWindow.9=Dữ liệu nhập vào có chứa các bản ghi đã có trong cÆ¡ sở dữ liệu cá»§a bạn. -DynamicsCode.0=Ban đầu là rừng -DynamicsCode.1=Ban đầu là trảng cá» -DynamicsCode.2=Ban đầu là khu dân cư -DynamicsCode.3=Ban đầu là đất khác -DynamicsCode.4=Ban đầu là đất ngập nước -DynamicsCode.5=Ban đầu là đất trồng trá»t -OpenTextFileListener.0=không tìm thấy file văn bản tại\: -OptionWizard.0=Các lá»±a chá»n cá»§a Collect Earth -OptionWizard.1=Chá»n Browser -OptionWizard.10=Mở thư mục lưu dá»± phòng -OptionWizard.11=Không biết\: hãy sá»­ dụng ifconfig -OptionWizard.12=Vi dụ cá»§a khác -OptionWizard.13=Äịa chỉ IP cá»§a máy chá»§ Collect Earth -OptionWizard.14=Cổng máy chá»§ Collect Earth (vd\: 8023) -OptionWizard.15=Ghi và áo dụng thay đổi +CollectEarthWindow.2=Dil +CollectEarthWindow.20=Kopyalanan kayıt sayısı\: +CollectEarthWindow.21=Ana bilgisayar için simge bulunamadı +CollectEarthWindow.22=Collect Earth'ü kapatmak istediÄŸinizden emin misiniz?
Pencereyi kapatmanız durumunda Collect Earth sunucusunu da kapatır. +CollectEarthWindow.23=Onay gerekiyor +CollectEarthWindow.24=XML Dışa aktar +CollectEarthWindow.25=Mevcut verileriniz kaybolacak yine de bu kayıtları eklemek istiyor musunuz? +CollectEarthWindow.26=Operatör +CollectEarthWindow.27=Güncelle +CollectEarthWindow.28=Operatör, verileri değerlendirirken Open Foris Collect Earth sunucusu çalışmalıdır. +CollectEarthWindow.29=Saiku Sunucusu yapılandırılmadı. +CollectEarthWindow.3=İçe aktarma hatası +CollectEarthWindow.30=Lütfen Google Earth'ü kullanırken bu pencereyi açık tutun. +CollectEarthWindow.31=Toplanan verileri CSV dosyasına aktar +CollectEarthWindow.32=Vazgeç +CollectEarthWindow.33=Operatör adı 5 karakterden uzun ve 50 karakterden kısa olmalıdır +CollectEarthWindow.34=Doğrulama hatası +CollectEarthWindow.35=OPERATÖR ADI BOŞ\!
Lütfen operatör adını girin ve "Güncelle" düğmesine basın. +CollectEarthWindow.36=Operatör adı boş olamaz +CollectEarthWindow.37=Açık Tut +CollectEarthWindow.38=CSV dosyaları +CollectEarthWindow.39=DİKKAT\: Yeni verileri almadan önce mevcut verilerinizi (XML'e Aktar) yedeklemeniz önerilir. +CollectEarthWindow.4=FAO Yasal uyarı bildirimleri +CollectEarthWindow.40=Araçlar-> Özellikler-> Gelişmiş sekmesinde Saiku Sunucusunun kurulu olduğu klasörün yolunu ayarlayın. +CollectEarthWindow.41=Dışa aktarılan verileri dosyaya kaydet +CollectEarthWindow.42=Vazgeç +CollectEarthWindow.43=Yinelenen kayıtlar bulundu +CollectEarthWindow.44=Verileri İçe/Dışa aktar +CollectEarthWindow.45=Verileri XML'e aktar (Sıkıştırılmış) +CollectEarthWindow.46=Verileri ZIP'ten içe aktar (sıkıştırılmış XML) +CollectEarthWindow.55=CSV kullanarak mevcut kayıtları güncelle +CollectEarthWindow.47=Saiku Sunucusu yapılandırılmadı +CollectEarthWindow.48=Zip/collect-data dosyası +CollectEarthWindow.49=Fusion table CSV dosyası +CollectEarthWindow.5=Kapat +CollectEarthWindow.50=Kullanım Kılavuzunu Aç +CollectEarthWindow.51=Collect Earth güncellemelerini kontrol et +CollectEarthWindow.52=Uygulama Günlüğünü Aç +CollectEarthWindow.53=Collect Earth Günlüğü +CollectEarthWindow.54=Noktaları KML'den yükle +CollectEarthWindow.56=Hakkında... +CollectEarthWindow.57=Saiku başlatıcısı işlemi hala devam ediyor, lütfen bekleyin. +CollectEarthWindow.58=Saiku analysis başlatılamıyor +CollectEarthWindow.59=Saiku analizi için veri setini yeniden oluşturmak ister misiniz?
Bu iÅŸlem zaman alabilir.
"EVET" üzerine tıklarsanız, en son bilgileri içeren yeni bir veri seti oluÅŸturulur. +CollectEarthWindow.6=Fusion Table'a aktar +CollectEarthWindow.60=Saiku veri üretimi +CollectEarthWindow.61=Verileri XML'e aktar (Son dışa aktarımdan bu yana deÄŸiÅŸtirilmiÅŸ kayıtlar) +CollectEarthWindow.62=Hakkında... +CollectEarthWindow.63=Noktalar KML'den alırken hata oluÅŸtu +CollectEarthWindow.64=Teknik Destek +CollectEarthWindow.7=Veri içe aktarılırken hata oluÅŸtu +CollectEarthWindow.8=Yasal uyarı metni bulunamadı +CollectEarthWindow.9=Alınan veriler veritabanında zaten mevcut olan kayıtları içerir. +CollectEarthWindow.65=Operatör adı deÄŸiÅŸtirildi +CollectEarthWindow.66=Operatör adı +CollectEarthWindow.70=Anket rehberini aç +DynamicsCode.0=BaÅŸlangıçta Orman +DynamicsCode.1=BaÅŸlangıçta Mera +DynamicsCode.2=BaÅŸlangıçta YerleÅŸim +DynamicsCode.3=BaÅŸlangıçta DiÄŸer +DynamicsCode.4=BaÅŸlangıçta Sulak +DynamicsCode.5=BaÅŸlangıçta Tarım +OpenTextFileListener.0=Metin dosyası bulunamadı \: +OptionWizard.0=Collect Earth seçenekler +OptionWizard.1=Tarayıcı Seç +OptionWizard.10=Yedekleme klasörünü aç +OptionWizard.11=Blinmeyen\: yapılandırma kullanımı +OptionWizard.12=İstemci durumu +OptionWizard.13=Collect Earth Sunucu IP +OptionWizard.14=Collect Earth sunucu giriÅŸi (örn. 8023) +OptionWizard.15=Kaydet & DeÄŸiÅŸiklikleri uygula OptionWizard.16=ID -OptionWizard.17=Tá»a độ X -OptionWizard.18=Tá»a độ Y -OptionWizard.19=Äá»™ cao -OptionWizard.2=Dòng công tác (máy chá»§/khách) -OptionWizard.20=Ná»™i dung cá»§a Google Earth đã thay đổi.
Äá» nghị chấp nhận tải lại ná»™i dung khi Google Earth gợi ý. -OptionWizard.21=Cập nhật thành công -OptionWizard.22=Dốc -OptionWizard.23=Có lá»—i khi mở lại dữ liệu Google Earth -OptionWizard.24=Há»§y -OptionWizard.25=Mode vận hành -OptionWizard.26=NÆ¡i lưu cÆ¡ sở dữ liệu -OptionWizard.27=Äây không phải là thư mục Saiku (hiện không có file start-saiku.bat) -OptionWizard.28=Không nhận được máy chá»§ Saiku -OptionWizard.29=Cổng cÆ¡ sở dữ liệu -OptionWizard.3=Ví dụ cá»§a máy chá»§ -OptionWizard.30=Các lá»±a chá»n cá»§a SQLite -OptionWizard.31=Dữ liệu mẫu -OptionWizard.32=SÆ¡ đồ mẫu -OptionWizard.33=Äịnh nghÄ©a khảo sát -OptionWizard.34=Nâng cao -OptionWizard.35=Số Ä‘iểm mẫu -OptionWizard.36=Khoảng cách giữa các Ä‘iểm mẫu (tính theo mét) -OptionWizard.37=Lá» vá»›i biên ô (tính theo mét) -OptionWizard.38=Không Ä‘á»c được đúng file CSV/CED.
Cần có dấu phảy để phân tách giá trị giống như sau \:
-OptionWizard.39=ID,Tá»a độ Y,tá»a độ X,độ cao,độ dốc,tá»· lệ -OptionWizard.4=Äịa chỉ IP hiện tại cá»§a máy tính\: -OptionWizard.40=Các project -OptionWizard.41=tải file project má»›i -OptionWizard.42=Lá»—i khi đóng CSV reader -OptionWizard.43=Tên khảo sát -OptionWizard.44=tá»± động lưu dá»± phòng dữ liệu tại -OptionWizard.45=Mở Earth Engine để phóng to vào khu vá»±c ô -OptionWizard.46=Mở Earth Engine timelapse cho khu vá»±c ô -OptionWizard.47=Mở Bing Maps cho khu vá»±c ô -OptionWizard.48=Mở form trên browser thay vì mở Google Earth (khuyến cáo cho LINUX) -OptionWizard.49=ÄÆ°á»ng dẫn tá»›i file ced/csv file vá»›i dữ liệu ô -OptionWizard.5=Cổng máy chá»§ Collect Earth\: -OptionWizard.50=Browse... -OptionWizard.51=Lá»—i nhập file project -OptionWizard.52=File CSV/CED chỉ có tá»a độ -OptionWizard.53=Ô vuông -OptionWizard.54=Äiểm trung tâm -OptionWizard.55=Lá»—i khi nhập thư mục project -OptionWizard.56=Tải project -OptionWizard.57=Các project đã tải -OptionWizard.58=Mở GEE Code Editor (cần phải có quyá»n truy cập Trusted Tester) -OptionWizard.59=Mở Here Maps tập trung vào ô -OptionWizard.6=Các thông số cá»§a CSDL PostgreSQL -OptionWizard.65=ÄÆ°á»ng dẫn tá»›i thư mục Saiku -OptionWizard.66=Browse... -OptionWizard.67=ÄÆ°á»ng dẫn tá»›i Firefox executable (file exe) -OptionWizard.68=Browse... -OptionWizard.7=Tên ngưá»i sá»­ dụng -OptionWizard.70=File chạy -OptionWizard.72=File nhị phân -OptionWizard.73=ÄÆ°á»ng dẫn tá»›i Chrome executable (file exe) -OptionWizard.74=Browse... -OptionWizard.76=File exe -OptionWizard.78=File nhị phân -OptionWizard.79=ÄÆ°á»ng dẫn tá»›i KML Freemarker template -OptionWizard.8=Mật khẩu -OptionWizard.80=Browse... -OptionWizard.82=Freemarker template -OptionWizard.83=ÄÆ°á»ng dẫn tá»›i mẫu thiết kế HTML Balloon -OptionWizard.84=Browse... -OptionWizard.86=HTML webpage -OptionWizard.87=ÄÆ°á»ng dẫn tá»›i XML vá»›i định nghÄ©a IDM -OptionWizard.88=Browse... -OptionWizard.9=Tên CSDL -OptionWizard.90=Äịnh nghÄ©a XML IDM -OptionWizard.91=Máy chá»§ (phiên bản quản lý hoặc sá»­ dụng độc lập) -OptionWizard.92=Khách (ngưá»i sá»­ dụng/kết nối vá»›i máy chá»§) -OptionWizard.93=SQLite (tích hợp/file đơn lẻ) +OptionWizard.17=X-coord +OptionWizard.18=Y-coord +OptionWizard.19=Yükseklik +OptionWizard.2=İş akışı (sunucu/istemci) +OptionWizard.20=Google Earth içerikleri deÄŸiÅŸtirildi.
Lütfen Google Earth tarafından istendiğinde içeriğin yeniden yüklenmesini kabul edin. +OptionWizard.21=Güncelleme başarılı +OptionWizard.22=Eğim +OptionWizard.23=Google Earth verilerini yeniden açarken bir hata oluştu +OptionWizard.24=İptal +OptionWizard.25=İşlem Modu +OptionWizard.26=DB host +OptionWizard.27=Bu tanınmış bir Saiku klasörü değil ( start-saiku.bat dosyası mevcut değil) +OptionWizard.28=Saiku Sunucusu tanınmadı +OptionWizard.29=DB port +OptionWizard.3=Sunucu örneği +OptionWizard.30=SQLite seçenekleri +OptionWizard.31=Örnek veri +OptionWizard.32=Plot düzeni +OptionWizard.33=Anket Tanımı +OptionWizard.34=Gelişmiş +OptionWizard.35=Kontrol noktası sayısı +OptionWizard.36=Kontrol noktaları arasındaki mesafe (metre cinsinden) +OptionWizard.37=Plot kenarı ile mesafesi (metre cinsinden) +OptionWizard.38=CSV / CED dosyası doğru okunamıyor.
Dosyanın böyle bir virgülle ayrılmış değerlere sahip olması beklenir \:
+OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect +OptionWizard.4=Geçerli bilgisayar IP'si \: +OptionWizard.40=Projeler +OptionWizard.41=Yeni bir proje dosyası yükle +OptionWizard.42=CSV okuyucuyu kapatırken hata oluÅŸtu +OptionWizard.43=Anketin adı +OptionWizard.44=veritabanını otomatik olarak yedekle +OptionWizard.45=Earth Engine plot alanına yakınlaÅŸtırarak aç +OptionWizard.46=Plot alanı için Earth Engine Timelapse'yi aç +OptionWizard.47=Plot alanı için Bing Maps'i aç +OptionWizard.48=Formu Google Earth yerine bir tarayıcıda aç (LINUX için önerilir) +OptionWizard.49=Plot verisini içeren ced / csv dosyasının yolu +OptionWizard.5=Collect Earth Sunucu giriÅŸi\: +OptionWizard.50=Tarayıcı... +OptionWizard.51=Proje dosyası içe aktarılırken hata oluÅŸtu +OptionWizard.52=Yalnızca koordinatlara sahip CSV / CED dosyası +OptionWizard.53=Puan yok +OptionWizard.54=Merkez noktası +OptionWizard.55=Proje dosyası içe aktarılırken hata oluÅŸtu +OptionWizard.56=Proje yükle +OptionWizard.57=Önceden yüklenmiÅŸ projeler +OptionWizard.58=GEE Kod Düzenleyicisini açın (Güvenilir Test Cihazı eriÅŸimi gerektirir) +OptionWizard.59=Plot üzerinde Here Maps'i aç +OptionWizard.6=PostgreSQL DB parametreleri +OptionWizard.65=Saiku klasör yolu +OptionWizard.66=Tarayıcı... +OptionWizard.67=Firefox kısayol yolu +OptionWizard.68=Tarayıcı... +OptionWizard.7=Kullanıcı adı +OptionWizard.70=Kısayol dosyaları +OptionWizard.72=İkili dosyalar +OptionWizard.73=Chrome kısayol yolu +OptionWizard.74=Tarayıcı... +OptionWizard.76=Kısayol dosyaları +OptionWizard.78=İkili dosyalar +OptionWizard.79=KML iÅŸaretçi ÅŸablonu yolu +OptionWizard.8=Parola +OptionWizard.80=Tarayıcı... +OptionWizard.82=İşaretçi ÅŸablonu +OptionWizard.83=Form tasarımının HTML balon yolu +OptionWizard.84=Tarayıcı... +OptionWizard.86=HTML web sayfası +OptionWizard.87=IDM tanımıyla XML yolu +OptionWizard.88=Tarayıcı... +OptionWizard.9=DB Adı +OptionWizard.90=XML IDM tanımlama +OptionWizard.91=Sunucu (yönetici sürümü veya tek başına kullanım) +OptionWizard.92=İstemci (operatör/sunucuya baÄŸlı) +OptionWizard.93=SQLite (Gömülü / tek dosya tabanlı) OptionWizard.94=PostgreSQL -SaikuAnalysisListener.0=Yes - Làm má»›i lại dữ liệu Saiku (quá trình dài) -SaikuAnalysisListener.1=No - chỉ khởi động Saiku -SaikuStarter.1=Khởi động Saiku -SaikuStarter.2=Cần vài phút để khởi động Saiku, xin đợi\! -SaveEarthDataServlet.0=Yêu cầu trống -SaveEarthDataServlet.1=Có trục trặc khi ghi dữ liệu vào CSDL -SaveEarthDataServlet.2=Dữ liệu đã được ghi -SlopeCode.0=Bằng phẳng (0-5) -EarthApp.11=Collect Earth Ä‘ang chạy -EarthApp.21=Không tìm thấy file chứa lưới ô trong đưá»ng dẫn đã chá»n \:
-EarthApp.23=Chưa thiết lập file CSV/CED \:

-EarthApp.24=Không tìm thấy file chứa Freemarker template vá»›i định nghÄ©a KML trong đưá»ng dẫn đã chá»n\:
-EarthApp.26=Chưa thiết lập file định nghĩa KML d\:

-EarthApp.27=Không tìm thấy file chứa mẫu HTML balloon trong đưá»ng dẫn đã chá»n\:
-EarthApp.29=Chưa thiết lập file HTML balloon \:

-EarthApp.3=Nhắc nhở sau -EarthApp.30=Xin hãy Ä‘iá»u chỉnh đúng địa chỉ file trong Tools->Properties menu. -EarthApp.4=Cập nhật luôn -EarthApp.5=Không nhắc nữa -EarthApp.57=Äã có phiên bản má»›i cá»§a Collect Earth\!
Bạn muốn làm tiếp như thế nào? -EarthApp.58=Thông báo cập nhật -EarthApp.59=Lỗi khi nhập file project -EarthApp.6=\ - Phiên bản -EarthApp.61=Không mở được file Collect Earth.
Äá» nghị đảm bảo đã cài đặt Google Earth. -EarthSurveyService.9=Trưá»ng bắt buá»™c -ExportActionListener.1=Chá»n ngày xuất bản ghi -ExportDialogProcessMonitor.0=Äang xá»­ lý dữ liệu... -ExportDialogProcessMonitor.1=Äang đợi khởi động quá trình\: -ExportDialogProcessMonitor.4=Các bản ghi đã xuất\: -ImportProcessMonitorDialog.0=Các bản ghi đã nhập\: -ImportActionListener.0=Có nhập dữ liệu các ô chưa được Ä‘iá»n đầy đủ không? -ImportActionListener.2=Nếu bạn chá»n NO sẽ chỉ nhập dữ liệu cá»§a các ô có trạng thái màu "xanh lá cây", các ô đã có đầy đủ dữ liệu. -ImportActionListener.3=Nhập các bản ghi chưa hoàn tất -ImportDialogProcessMonitor.0=\ ÄANG TÃNH TOÃN -ImportDialogProcessMonitor.11=Số lượng ban đầu các bản ghi\: -ImportDialogProcessMonitor.2=Äang nhập các bản ghi... -ImportDialogProcessMonitor.5=Số lượng thá»±c tế các bản ghi đã nhập\: -ImportDialogProcessMonitor.8=Äang xá»­ lý dữ liệu... -InfiniteProgressMonitor.0=Há»§y lệnh -JFileChooserExistsAware.0=File project cá»§a Collect Earth -KmlImportService.13=Chá»n file CSV file để ghi địa Ä‘iểm cá»§a ô vào -MissingPlotsListener.0=Lá»—i khi lấy thông tin vỠô không có trong CSDL -MissingPlotsListener.1=Các ô thiếu -MissingPlotsListener.10=Tổng số ô trong thiết kế chá»n mẫu \: -MissingPlotsListener.12=Số ô thiếu\: -MissingPlotsListener.14=Äã Ä‘iá»n tất cả các ô\! -MissingPlotsListener.2=Sao chép ná»™i dung vào bàn phím -MissingPlotsListener.3=Lá»±a chá»n file có chứa thông tin ô ( file .csv hoặc .ced ) mà bạn muốn biết đã Ä‘iá»n đủ dữ liệu chưa. -MissingPlotsListener.4=Các ô thiếu - thông tin -MissingPlotsListener.5=Từ file \: -MissingPlotsListener.6=Xuất ra file CED -ProcessMonitorDialog.1=Tìm lá»—i trên số dòng -ProcessMonitorDialog.4=, cá»™t -ProcessMonitorDialog.5=\ -- giá trị +OptionWizard.95=Örnekleme noktalarının kenarı (metre olarak) +SaikuAnalysisListener.0=Evet - Saiku verilerini yenile (uzun iÅŸlem) +SaikuAnalysisListener.1=Hayır - Sadece Saiku'yu baÅŸlat +SaikuStarter.1=Saiku baÅŸlatılıyor +SaikuStarter.2=Saiku baÅŸlatılıyor birkaç dakika sürebilir, lütfen bekleyin \! +SaveEarthDataServlet.0=BoÅŸ istek +SaveEarthDataServlet.1=Veriyi veritabanına kaydederken sorun oluÅŸtu +SaveEarthDataServlet.2=Veri kaydedildi +SlopeCode.0=Düz (0-5) +EarthApp.11=Collect Earth zaten çalışıyor +EarthApp.21=Plotlara ait seçili CSV/CED grid dosyası bulunamadı \:
+EarthApp.23=CSV/CED dosyası ayarlanmadı \:

+EarthApp.24=İşaretçi şablonunu KML tanımına sahip dosya seçili yolda bulunamadı \:
+EarthApp.26=KML tanım dosyası ayarlanmadı \:

+EarthApp.27=HTML balon formunu içeren dosya seçili yolda bulunamadı \:
+EarthApp.29=Hiçbir HTML balon dosyası oluşturulmadı \:

+EarthApp.3=Daha Sonra Hatırlat +EarthApp.30=Lütfen Araçlar-> Özellikler menüsünden dosya konumunu düzeltin.. +EarthApp.4=Şimdi Güncelle +EarthApp.5=Tekrar hatırlatma +EarthApp.57=Collect Earth'ün yeni bir sürümü var\!
Nasıl devam etmek istiyorsun? +EarthApp.58=Güncelleme uyarısı +EarthApp.59=Proje dosyasını içe aktarırken hata oluştu +EarthApp.6=\ - Versiyon +EarthApp.61=Collect Earth dosyası açılamadı.
Lütfen Google Earth’ün kurulu olduÄŸundan emin olun. +EarthSurveyService.9=Alan gerekli +ExportActionListener.1=Kayıtların GönderileceÄŸi Tarihi Seç +ExportDialogProcessMonitor.0=Veri iÅŸleniyor... +ExportDialogProcessMonitor.1=İşlemi baÅŸlatmak için bekleniyor \: +ExportDialogProcessMonitor.4=Dışa aktarılan kayıtlar \: +ImportProcessMonitorDialog.0=İçe aktarılan kayıtlar \: +ImportActionListener.0=Doldurulmamış plotlar içe aktarılsın mı? +ImportActionListener.2=EÄŸer tıklarsanız NO sadece tüm verileri içeren "yeÅŸil" durumdaki plotlar içe aktarılacaktır. +ImportActionListener.3=BitmemiÅŸ kayıtları içe aktar +ImportDialogProcessMonitor.0=\ HESAPLANIYOR +ImportDialogProcessMonitor.11=İlk kayıt sayısı \: +ImportDialogProcessMonitor.2=Kayıtlar içe aktarılıyor... +ImportDialogProcessMonitor.5=Güncel içe aktarılan kayıt sayısı \: +ImportDialogProcessMonitor.8=Veri iÅŸleniyor... +InfiniteProgressMonitor.0=İşlemi iptal et +JFileChooserExistsAware.0=Collect Earth Proje dosya +KmlImportService.13=Konumları kaydetmek için CSV dosyası seçin +MissingPlotsListener.0=Veritabanında bulunmayan plotlar hakkında bilgi alınırken hata oluÅŸtu +MissingPlotsListener.1=Eksik plotlar +MissingPlotsListener.10=Örnekleme tasarımındaki toplam plotların sayısı \: +MissingPlotsListener.12=Eksik plotların sayısı \: +MissingPlotsListener.14=Bütün plotlar dolu\! +MissingPlotsListener.2=İçeriÄŸi panoya kopyala +MissingPlotsListener.3=Tüm verilerin doldurulup doldurulmadığını öğrenmek istediÄŸiniz plot bilgilerini (.csv veya .ced dosyaları) içeren dosyaları seçin. +MissingPlotsListener.4=Eksik plotlar - Bilgi +MissingPlotsListener.5=Dosyadan \: +MissingPlotsListener.6=CED dosyasına aktar +ProcessMonitorDialog.1=Satır numarasında ayrıştırma hatası +ProcessMonitorDialog.4=, sütunlar +ProcessMonitorDialog.5=\ -- deÄŸerler + +ImportXMLDialogProcessMonitor.1 = Verilerin üzerine yaz +ImportXMLDialogProcessMonitor.2 = Sadece yinelenmeyen plotları içe aktar + +YES=Evet +YES_TO_ALL=Tümüne evet +NO=Hayır +NO_TO_ALL=Tümüne hayır + +CollectEarthMenu.0=CEP dosyasını içe aktar +CollectEarthMenu.2=Hizmetler +CollectEarthMenu.3=Büyük CSV plot dosyalarını böl +CollectEarthMenu.4=Verileri XML'e aktar (belirli bir tarihten itibaren) +CollectEarthMenu.5=Collect yedeÄŸi için dışa aktar +CollectEarthMenu.6=Collect Backup verilerini dışa aktar (tüm veriler) +CollectEarthMenu.7=Collect Backup verilerini dışa aktar (belirli bir tarihten itibaren) +CollectEarthMenu.8=Verileri XML'e aktar (özet özniteliÄŸine göre filtrele) \ No newline at end of file From 79a91ce8c3667f6cddcd51c35503d8f74b61b4a0 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:36:44 +0100 Subject: [PATCH 0818/1620] New translations Messages_vi.properties (French) --- .../earth/app/view/Messages_fr.properties | 457 +++++++++--------- 1 file changed, 218 insertions(+), 239 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index c9742c724a..5110140e9c 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,242 +1,221 @@ -AboutDialog.19=Bir sorun oluÅŸtu -AboutDialog.5=Daha fazla bilgi için web sitemizi ziyaret edin OpenForis.org -AboutDialog.6=Üzgünüm, sisteminizin varsayılan tarayıcısı bu baÄŸlantıyı açmak isterken bir sorun oluÅŸtu. -AboutDialog.8=Tamam -AspectCode.0=Kuzey -AspectCode.1=Kuzey-doÄŸu -AspectCode.2=DoÄŸu -AspectCode.3=Güney-doÄŸu -AspectCode.4=Güney -AspectCode.5=Güney-batı -AspectCode.6=Batı -AspectCode.7=Kuzey-batı -CollectEarthWindow.0=Veri CSV dosyasına aktarılmaya çalışılırken hata oluÅŸtu -CollectEarthWindow.1=Dışa aktarma hatası -CollectEarthWindow.10=Dosya -CollectEarthWindow.11=Çıkış -CollectEarthWindow.12=Araçlar -CollectEarthWindow.13=Verileri CSV'ye aktar -CollectEarthWindow.14=SAIKU Analysis baÅŸlat -CollectEarthWindow.15=Özellikler -CollectEarthWindow.16=Yardım -CollectEarthWindow.17=Yasal uyarı -CollectEarthWindow.18=Veritabnında eksik plotları bulun +AboutDialog.19=Äã có lá»—i +AboutDialog.5=Truy cập website cá»§a chúng tôi để biết thêm thông tin OpenForis.org +AboutDialog.6=Xin lá»—i, đã có sá»± cố khi mở link trong brower chuẩn trong hệ thống cá»§a bạn. +AboutDialog.8=Ok +AspectCode.0=Bắc +AspectCode.1=Äông-Bắc +AspectCode.2=Äông +AspectCode.3=Äông-Nam +AspectCode.4=Nam +AspectCode.5=Tây-Nam +AspectCode.6=Tây +AspectCode.7=Tây-Bắc +CollectEarthWindow.0=Lá»—i khi xuất dữ liệu sang file CSV +CollectEarthWindow.1=Lá»—i xuất dữ liệu +CollectEarthWindow.10=File +CollectEarthWindow.11=Thoát +CollectEarthWindow.12=Công cụ +CollectEarthWindow.13=Xuất dữ liệu ra CSV +CollectEarthWindow.14=Khởi động SAIKU Analysis +CollectEarthWindow.15=Thuá»™c tính +CollectEarthWindow.16=Trợ giúp +CollectEarthWindow.17=Thông tin công bố +CollectEarthWindow.18=Tìm ô thiếu trong cÆ¡ sở dữ liệu CollectEarthWindow.19=Collect Earth -CollectEarthWindow.2=Dil -CollectEarthWindow.20=Kopyalanan kayıt sayısı\: -CollectEarthWindow.21=Ana bilgisayar için simge bulunamadı -CollectEarthWindow.22=Collect Earth'ü kapatmak istediÄŸinizden emin misiniz?
Pencereyi kapatmanız durumunda Collect Earth sunucusunu da kapatır. -CollectEarthWindow.23=Onay gerekiyor -CollectEarthWindow.24=XML Dışa aktar -CollectEarthWindow.25=Mevcut verileriniz kaybolacak yine de bu kayıtları eklemek istiyor musunuz? -CollectEarthWindow.26=Operatör -CollectEarthWindow.27=Güncelle -CollectEarthWindow.28=Operatör, verileri değerlendirirken Open Foris Collect Earth sunucusu çalışmalıdır. -CollectEarthWindow.29=Saiku Sunucusu yapılandırılmadı. -CollectEarthWindow.3=İçe aktarma hatası -CollectEarthWindow.30=Lütfen Google Earth'ü kullanırken bu pencereyi açık tutun. -CollectEarthWindow.31=Toplanan verileri CSV dosyasına aktar -CollectEarthWindow.32=Vazgeç -CollectEarthWindow.33=Operatör adı 5 karakterden uzun ve 50 karakterden kısa olmalıdır -CollectEarthWindow.34=Doğrulama hatası -CollectEarthWindow.35=OPERATÖR ADI BOŞ\!
Lütfen operatör adını girin ve "Güncelle" düğmesine basın. -CollectEarthWindow.36=Operatör adı boş olamaz -CollectEarthWindow.37=Açık Tut -CollectEarthWindow.38=CSV dosyaları -CollectEarthWindow.39=DİKKAT\: Yeni verileri almadan önce mevcut verilerinizi (XML'e Aktar) yedeklemeniz önerilir. -CollectEarthWindow.4=FAO Yasal uyarı bildirimleri -CollectEarthWindow.40=Araçlar-> Özellikler-> Gelişmiş sekmesinde Saiku Sunucusunun kurulu olduğu klasörün yolunu ayarlayın. -CollectEarthWindow.41=Dışa aktarılan verileri dosyaya kaydet -CollectEarthWindow.42=Vazgeç -CollectEarthWindow.43=Yinelenen kayıtlar bulundu -CollectEarthWindow.44=Verileri İçe/Dışa aktar -CollectEarthWindow.45=Verileri XML'e aktar (Sıkıştırılmış) -CollectEarthWindow.46=Verileri ZIP'ten içe aktar (sıkıştırılmış XML) -CollectEarthWindow.55=CSV kullanarak mevcut kayıtları güncelle -CollectEarthWindow.47=Saiku Sunucusu yapılandırılmadı -CollectEarthWindow.48=Zip/collect-data dosyası -CollectEarthWindow.49=Fusion table CSV dosyası -CollectEarthWindow.5=Kapat -CollectEarthWindow.50=Kullanım Kılavuzunu Aç -CollectEarthWindow.51=Collect Earth güncellemelerini kontrol et -CollectEarthWindow.52=Uygulama Günlüğünü Aç -CollectEarthWindow.53=Collect Earth Günlüğü -CollectEarthWindow.54=Noktaları KML'den yükle -CollectEarthWindow.56=Hakkında... -CollectEarthWindow.57=Saiku başlatıcısı işlemi hala devam ediyor, lütfen bekleyin. -CollectEarthWindow.58=Saiku analysis başlatılamıyor -CollectEarthWindow.59=Saiku analizi için veri setini yeniden oluşturmak ister misiniz?
Bu iÅŸlem zaman alabilir.
"EVET" üzerine tıklarsanız, en son bilgileri içeren yeni bir veri seti oluşturulur. -CollectEarthWindow.6=Fusion Table'a aktar -CollectEarthWindow.60=Saiku veri üretimi -CollectEarthWindow.61=Verileri XML'e aktar (Son dışa aktarımdan bu yana değiştirilmiş kayıtlar) -CollectEarthWindow.62=Hakkında... -CollectEarthWindow.63=Noktalar KML'den alırken hata oluştu -CollectEarthWindow.64=Teknik Destek -CollectEarthWindow.7=Veri içe aktarılırken hata oluştu -CollectEarthWindow.8=Yasal uyarı metni bulunamadı -CollectEarthWindow.9=Alınan veriler veritabanında zaten mevcut olan kayıtları içerir. -CollectEarthWindow.65=Operatör adı değiştirildi -CollectEarthWindow.66=Operatör adı -CollectEarthWindow.70=Anket rehberini aç -DynamicsCode.0=Başlangıçta Orman -DynamicsCode.1=Başlangıçta Mera -DynamicsCode.2=Başlangıçta Yerleşim -DynamicsCode.3=Başlangıçta Diğer -DynamicsCode.4=Başlangıçta Sulak -DynamicsCode.5=Başlangıçta Tarım -OpenTextFileListener.0=Metin dosyası bulunamadı \: -OptionWizard.0=Collect Earth seçenekler -OptionWizard.1=Tarayıcı Seç -OptionWizard.10=Yedekleme klasörünü aç -OptionWizard.11=Blinmeyen\: yapılandırma kullanımı -OptionWizard.12=İstemci durumu -OptionWizard.13=Collect Earth Sunucu IP -OptionWizard.14=Collect Earth sunucu girişi (örn. 8023) -OptionWizard.15=Kaydet & Değişiklikleri uygula +CollectEarthWindow.2=Ngôn ngữ +CollectEarthWindow.20=Số bản ghi trùng\: +CollectEarthWindow.21=Không tìm thấy biểu tượng cho khung chính +CollectEarthWindow.22=Bạn có chắc là muốn đóng Collect Earth?
Äóng cá»­a sổ cÅ©ng đóng luôn máy chá»§ Collect Earth +CollectEarthWindow.23=Cần khẳng định +CollectEarthWindow.24=Xuất ra XML +CollectEarthWindow.25=Bạn có muốn thêm các bản ghi này và bá» Ä‘i dữ liệu hiện thá»i không? +CollectEarthWindow.26=Ngưá»i sá»­ dụng +CollectEarthWindow.27=Cập nhật +CollectEarthWindow.28=Máy chá»§ Open Foris Collect Earth phải chạy khi ngưá»i sá»­ dụng giải Ä‘oán dữ liệu. +CollectEarthWindow.29=Chưa xác định cấu hình cho Máy chá»§ Saiku. +CollectEarthWindow.3=\ Lá»—i nhập +CollectEarthWindow.30=Äể mở cá»­a sổ này khi Ä‘ang sá»­ dụng Google Earth. +CollectEarthWindow.31=Xuất dữ liệu đã thu thập sang file CSV +CollectEarthWindow.32=Thoát +CollectEarthWindow.33=Tên ngưá»i sá»­ dụng phải dài hÆ¡n 5 chữ cái và ngắn hÆ¡n 50 chữ cái +CollectEarthWindow.34=Lá»—i kiểm chứng +CollectEarthWindow.35=TÊN NGƯỜI SỬ DỤNG CÃ’N TRá»NG\!
Hãy Ä‘iá»n tên ngưá»i sá»­ dụng và nhắp phím "Update". +CollectEarthWindow.36=Không được để trống phần tên ngưá»i sá»­ dụng +CollectEarthWindow.37=Äể mở +CollectEarthWindow.38=file CSV +CollectEarthWindow.39=THÔNG BÃO\: Nên lưu dá»± phòng dữ liệu hiện thá»i(Xuất ra XML) trước khi nhập dữ liệu má»›i +CollectEarthWindow.4=Thông tin công bố cá»§a FAO +CollectEarthWindow.40=Thiết lập đưá»ng dẫn tá»›i thư mục cài đặt Saiku Server trong Tools->Properties->Advanced tab. +CollectEarthWindow.41=Ghi dữ liệu xuất ra vào file\: +CollectEarthWindow.42=Thoát +CollectEarthWindow.43=Tìm thấy bản ghi có mâu thuẫn +CollectEarthWindow.44=Nhập/Xuất dữ liệu +CollectEarthWindow.45=Xuất dữ liệu ra XML (nén) +CollectEarthWindow.46=Nhập dữ liệu má»›i từ file ZIP (XML nén) +CollectEarthWindow.55=Cập nhật các bản ghi hiện thá»i bằng CSV +CollectEarthWindow.47=Chưa định cấu hình cho Saiku Server +CollectEarthWindow.48=Zip/collect-data files +CollectEarthWindow.49=Files CSV tổng hợp +CollectEarthWindow.5=Äóng +CollectEarthWindow.50=Mở hướng dẫn ngưá»i sá»­ dụng +CollectEarthWindow.51=Kiểm tra cập nhật cá»§a Collect Earth +CollectEarthWindow.52=Mở file nhật ký ứng dụng +CollectEarthWindow.53=File nhật ký cá»§a Collect Earth +CollectEarthWindow.54=Nạp các Ä‘iểm từ KML +CollectEarthWindow.56=Vá»... +CollectEarthWindow.57=Äang chạy quá trình khởi động Saiku, xin đợi. +CollectEarthWindow.58=Không thể khởi động Saiku analysis +CollectEarthWindow.59=Bạn có muốn tạo lại bá»™ dữ liệu cho Saiku analysis không?
Quá trình này sẽ mất một vài phút.
Nếu bạn chá»n "YES" sẽ tạo ra má»™t bá»™ dữ liệu má»›i vá»›i các thông tin cập nhật nhất. +CollectEarthWindow.6=Xuất ra bảng tổng hợp +CollectEarthWindow.60=Tạo dữ liệu Saiku +CollectEarthWindow.61=Xuất dữ liệu ra XML (các bản ghi chỉnh sá»­a từ lần xuất trước) +CollectEarthWindow.62=Vá»... +CollectEarthWindow.63=Lá»—i khi nạp Ä‘iểm từ KML +CollectEarthWindow.64=Há»— trợ kỹ thuật +CollectEarthWindow.7=Lá»—i khi nhập dữ liệu +CollectEarthWindow.8=Không tìm thấy văn bản thông báo +CollectEarthWindow.9=Dữ liệu nhập vào có chứa các bản ghi đã có trong cÆ¡ sở dữ liệu cá»§a bạn. +DynamicsCode.0=Ban đầu là rừng +DynamicsCode.1=Ban đầu là trảng cá» +DynamicsCode.2=Ban đầu là khu dân cư +DynamicsCode.3=Ban đầu là đất khác +DynamicsCode.4=Ban đầu là đất ngập nước +DynamicsCode.5=Ban đầu là đất trồng trá»t +OpenTextFileListener.0=không tìm thấy file văn bản tại\: +OptionWizard.0=Các lá»±a chá»n cá»§a Collect Earth +OptionWizard.1=Chá»n Browser +OptionWizard.10=Mở thư mục lưu dá»± phòng +OptionWizard.11=Không biết\: hãy sá»­ dụng ifconfig +OptionWizard.12=Vi dụ cá»§a khác +OptionWizard.13=Äịa chỉ IP cá»§a máy chá»§ Collect Earth +OptionWizard.14=Cổng máy chá»§ Collect Earth (vd\: 8023) +OptionWizard.15=Ghi và áo dụng thay đổi OptionWizard.16=ID -OptionWizard.17=X-coord -OptionWizard.18=Y-coord -OptionWizard.19=Yükseklik -OptionWizard.2=İş akışı (sunucu/istemci) -OptionWizard.20=Google Earth içerikleri deÄŸiÅŸtirildi.
Lütfen Google Earth tarafından istendiğinde içeriğin yeniden yüklenmesini kabul edin. -OptionWizard.21=Güncelleme başarılı -OptionWizard.22=Eğim -OptionWizard.23=Google Earth verilerini yeniden açarken bir hata oluştu -OptionWizard.24=İptal -OptionWizard.25=İşlem Modu -OptionWizard.26=DB host -OptionWizard.27=Bu tanınmış bir Saiku klasörü değil ( start-saiku.bat dosyası mevcut değil) -OptionWizard.28=Saiku Sunucusu tanınmadı -OptionWizard.29=DB port -OptionWizard.3=Sunucu örneği -OptionWizard.30=SQLite seçenekleri -OptionWizard.31=Örnek veri -OptionWizard.32=Plot düzeni -OptionWizard.33=Anket Tanımı -OptionWizard.34=Gelişmiş -OptionWizard.35=Kontrol noktası sayısı -OptionWizard.36=Kontrol noktaları arasındaki mesafe (metre cinsinden) -OptionWizard.37=Plot kenarı ile mesafesi (metre cinsinden) -OptionWizard.38=CSV / CED dosyası doğru okunamıyor.
Dosyanın böyle bir virgülle ayrılmış değerlere sahip olması beklenir \:
-OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect -OptionWizard.4=Geçerli bilgisayar IP'si \: -OptionWizard.40=Projeler -OptionWizard.41=Yeni bir proje dosyası yükle -OptionWizard.42=CSV okuyucuyu kapatırken hata oluÅŸtu -OptionWizard.43=Anketin adı -OptionWizard.44=veritabanını otomatik olarak yedekle -OptionWizard.45=Earth Engine plot alanına yakınlaÅŸtırarak aç -OptionWizard.46=Plot alanı için Earth Engine Timelapse'yi aç -OptionWizard.47=Plot alanı için Bing Maps'i aç -OptionWizard.48=Formu Google Earth yerine bir tarayıcıda aç (LINUX için önerilir) -OptionWizard.49=Plot verisini içeren ced / csv dosyasının yolu -OptionWizard.5=Collect Earth Sunucu giriÅŸi\: -OptionWizard.50=Tarayıcı... -OptionWizard.51=Proje dosyası içe aktarılırken hata oluÅŸtu -OptionWizard.52=Yalnızca koordinatlara sahip CSV / CED dosyası -OptionWizard.53=Puan yok -OptionWizard.54=Merkez noktası -OptionWizard.55=Proje dosyası içe aktarılırken hata oluÅŸtu -OptionWizard.56=Proje yükle -OptionWizard.57=Önceden yüklenmiÅŸ projeler -OptionWizard.58=GEE Kod Düzenleyicisini açın (Güvenilir Test Cihazı eriÅŸimi gerektirir) -OptionWizard.59=Plot üzerinde Here Maps'i aç -OptionWizard.6=PostgreSQL DB parametreleri -OptionWizard.65=Saiku klasör yolu -OptionWizard.66=Tarayıcı... -OptionWizard.67=Firefox kısayol yolu -OptionWizard.68=Tarayıcı... -OptionWizard.7=Kullanıcı adı -OptionWizard.70=Kısayol dosyaları -OptionWizard.72=İkili dosyalar -OptionWizard.73=Chrome kısayol yolu -OptionWizard.74=Tarayıcı... -OptionWizard.76=Kısayol dosyaları -OptionWizard.78=İkili dosyalar -OptionWizard.79=KML iÅŸaretçi ÅŸablonu yolu -OptionWizard.8=Parola -OptionWizard.80=Tarayıcı... -OptionWizard.82=İşaretçi ÅŸablonu -OptionWizard.83=Form tasarımının HTML balon yolu -OptionWizard.84=Tarayıcı... -OptionWizard.86=HTML web sayfası -OptionWizard.87=IDM tanımıyla XML yolu -OptionWizard.88=Tarayıcı... -OptionWizard.9=DB Adı -OptionWizard.90=XML IDM tanımlama -OptionWizard.91=Sunucu (yönetici sürümü veya tek başına kullanım) -OptionWizard.92=İstemci (operatör/sunucuya baÄŸlı) -OptionWizard.93=SQLite (Gömülü / tek dosya tabanlı) +OptionWizard.17=Tá»a độ X +OptionWizard.18=Tá»a độ Y +OptionWizard.19=Äá»™ cao +OptionWizard.2=Dòng công tác (máy chá»§/khách) +OptionWizard.20=Ná»™i dung cá»§a Google Earth đã thay đổi.
Äá» nghị chấp nhận tải lại ná»™i dung khi Google Earth gợi ý. +OptionWizard.21=Cập nhật thành công +OptionWizard.22=Dốc +OptionWizard.23=Có lá»—i khi mở lại dữ liệu Google Earth +OptionWizard.24=Há»§y +OptionWizard.25=Mode vận hành +OptionWizard.26=NÆ¡i lưu cÆ¡ sở dữ liệu +OptionWizard.27=Äây không phải là thư mục Saiku (hiện không có file start-saiku.bat) +OptionWizard.28=Không nhận được máy chá»§ Saiku +OptionWizard.29=Cổng cÆ¡ sở dữ liệu +OptionWizard.3=Ví dụ cá»§a máy chá»§ +OptionWizard.30=Các lá»±a chá»n cá»§a SQLite +OptionWizard.31=Dữ liệu mẫu +OptionWizard.32=SÆ¡ đồ mẫu +OptionWizard.33=Äịnh nghÄ©a khảo sát +OptionWizard.34=Nâng cao +OptionWizard.35=Số Ä‘iểm mẫu +OptionWizard.36=Khoảng cách giữa các Ä‘iểm mẫu (tính theo mét) +OptionWizard.37=Lá» vá»›i biên ô (tính theo mét) +OptionWizard.38=Không Ä‘á»c được đúng file CSV/CED.
Cần có dấu phảy để phân tách giá trị giống như sau \:
+OptionWizard.39=ID,Tá»a độ Y,tá»a độ X,độ cao,độ dốc,tá»· lệ +OptionWizard.4=Äịa chỉ IP hiện tại cá»§a máy tính\: +OptionWizard.40=Các project +OptionWizard.41=tải file project má»›i +OptionWizard.42=Lá»—i khi đóng CSV reader +OptionWizard.43=Tên khảo sát +OptionWizard.44=tá»± động lưu dá»± phòng dữ liệu tại +OptionWizard.45=Mở Earth Engine để phóng to vào khu vá»±c ô +OptionWizard.46=Mở Earth Engine timelapse cho khu vá»±c ô +OptionWizard.47=Mở Bing Maps cho khu vá»±c ô +OptionWizard.48=Mở form trên browser thay vì mở Google Earth (khuyến cáo cho LINUX) +OptionWizard.49=ÄÆ°á»ng dẫn tá»›i file ced/csv file vá»›i dữ liệu ô +OptionWizard.5=Cổng máy chá»§ Collect Earth\: +OptionWizard.50=Browse... +OptionWizard.51=Lá»—i nhập file project +OptionWizard.52=File CSV/CED chỉ có tá»a độ +OptionWizard.53=Ô vuông +OptionWizard.54=Äiểm trung tâm +OptionWizard.55=Lá»—i khi nhập thư mục project +OptionWizard.56=Tải project +OptionWizard.57=Các project đã tải +OptionWizard.58=Mở GEE Code Editor (cần phải có quyá»n truy cập Trusted Tester) +OptionWizard.59=Mở Here Maps tập trung vào ô +OptionWizard.6=Các thông số cá»§a CSDL PostgreSQL +OptionWizard.65=ÄÆ°á»ng dẫn tá»›i thư mục Saiku +OptionWizard.66=Browse... +OptionWizard.67=ÄÆ°á»ng dẫn tá»›i Firefox executable (file exe) +OptionWizard.68=Browse... +OptionWizard.7=Tên ngưá»i sá»­ dụng +OptionWizard.70=File chạy +OptionWizard.72=File nhị phân +OptionWizard.73=ÄÆ°á»ng dẫn tá»›i Chrome executable (file exe) +OptionWizard.74=Browse... +OptionWizard.76=File exe +OptionWizard.78=File nhị phân +OptionWizard.79=ÄÆ°á»ng dẫn tá»›i KML Freemarker template +OptionWizard.8=Mật khẩu +OptionWizard.80=Browse... +OptionWizard.82=Freemarker template +OptionWizard.83=ÄÆ°á»ng dẫn tá»›i mẫu thiết kế HTML Balloon +OptionWizard.84=Browse... +OptionWizard.86=HTML webpage +OptionWizard.87=ÄÆ°á»ng dẫn tá»›i XML vá»›i định nghÄ©a IDM +OptionWizard.88=Browse... +OptionWizard.9=Tên CSDL +OptionWizard.90=Äịnh nghÄ©a XML IDM +OptionWizard.91=Máy chá»§ (phiên bản quản lý hoặc sá»­ dụng độc lập) +OptionWizard.92=Khách (ngưá»i sá»­ dụng/kết nối vá»›i máy chá»§) +OptionWizard.93=SQLite (tích hợp/file đơn lẻ) OptionWizard.94=PostgreSQL -OptionWizard.95=Örnekleme noktalarının kenarı (metre olarak) -SaikuAnalysisListener.0=Evet - Saiku verilerini yenile (uzun iÅŸlem) -SaikuAnalysisListener.1=Hayır - Sadece Saiku'yu baÅŸlat -SaikuStarter.1=Saiku baÅŸlatılıyor -SaikuStarter.2=Saiku baÅŸlatılıyor birkaç dakika sürebilir, lütfen bekleyin \! -SaveEarthDataServlet.0=BoÅŸ istek -SaveEarthDataServlet.1=Veriyi veritabanına kaydederken sorun oluÅŸtu -SaveEarthDataServlet.2=Veri kaydedildi -SlopeCode.0=Düz (0-5) -EarthApp.11=Collect Earth zaten çalışıyor -EarthApp.21=Plotlara ait seçili CSV/CED grid dosyası bulunamadı \:
-EarthApp.23=CSV/CED dosyası ayarlanmadı \:

-EarthApp.24=İşaretçi şablonunu KML tanımına sahip dosya seçili yolda bulunamadı \:
-EarthApp.26=KML tanım dosyası ayarlanmadı \:

-EarthApp.27=HTML balon formunu içeren dosya seçili yolda bulunamadı \:
-EarthApp.29=Hiçbir HTML balon dosyası oluşturulmadı \:

-EarthApp.3=Daha Sonra Hatırlat -EarthApp.30=Lütfen Araçlar-> Özellikler menüsünden dosya konumunu düzeltin.. -EarthApp.4=Şimdi Güncelle -EarthApp.5=Tekrar hatırlatma -EarthApp.57=Collect Earth'ün yeni bir sürümü var\!
Nasıl devam etmek istiyorsun? -EarthApp.58=Güncelleme uyarısı -EarthApp.59=Proje dosyasını içe aktarırken hata oluştu -EarthApp.6=\ - Versiyon -EarthApp.61=Collect Earth dosyası açılamadı.
Lütfen Google Earth’ün kurulu olduÄŸundan emin olun. -EarthSurveyService.9=Alan gerekli -ExportActionListener.1=Kayıtların GönderileceÄŸi Tarihi Seç -ExportDialogProcessMonitor.0=Veri iÅŸleniyor... -ExportDialogProcessMonitor.1=İşlemi baÅŸlatmak için bekleniyor \: -ExportDialogProcessMonitor.4=Dışa aktarılan kayıtlar \: -ImportProcessMonitorDialog.0=İçe aktarılan kayıtlar \: -ImportActionListener.0=Doldurulmamış plotlar içe aktarılsın mı? -ImportActionListener.2=EÄŸer tıklarsanız NO sadece tüm verileri içeren "yeÅŸil" durumdaki plotlar içe aktarılacaktır. -ImportActionListener.3=BitmemiÅŸ kayıtları içe aktar -ImportDialogProcessMonitor.0=\ HESAPLANIYOR -ImportDialogProcessMonitor.11=İlk kayıt sayısı \: -ImportDialogProcessMonitor.2=Kayıtlar içe aktarılıyor... -ImportDialogProcessMonitor.5=Güncel içe aktarılan kayıt sayısı \: -ImportDialogProcessMonitor.8=Veri iÅŸleniyor... -InfiniteProgressMonitor.0=İşlemi iptal et -JFileChooserExistsAware.0=Collect Earth Proje dosya -KmlImportService.13=Konumları kaydetmek için CSV dosyası seçin -MissingPlotsListener.0=Veritabanında bulunmayan plotlar hakkında bilgi alınırken hata oluÅŸtu -MissingPlotsListener.1=Eksik plotlar -MissingPlotsListener.10=Örnekleme tasarımındaki toplam plotların sayısı \: -MissingPlotsListener.12=Eksik plotların sayısı \: -MissingPlotsListener.14=Bütün plotlar dolu\! -MissingPlotsListener.2=İçeriÄŸi panoya kopyala -MissingPlotsListener.3=Tüm verilerin doldurulup doldurulmadığını öğrenmek istediÄŸiniz plot bilgilerini (.csv veya .ced dosyaları) içeren dosyaları seçin. -MissingPlotsListener.4=Eksik plotlar - Bilgi -MissingPlotsListener.5=Dosyadan \: -MissingPlotsListener.6=CED dosyasına aktar -ProcessMonitorDialog.1=Satır numarasında ayrıştırma hatası -ProcessMonitorDialog.4=, sütunlar -ProcessMonitorDialog.5=\ -- deÄŸerler - -ImportXMLDialogProcessMonitor.1 = Verilerin üzerine yaz -ImportXMLDialogProcessMonitor.2 = Sadece yinelenmeyen plotları içe aktar - -YES=Evet -YES_TO_ALL=Tümüne evet -NO=Hayır -NO_TO_ALL=Tümüne hayır - -CollectEarthMenu.0=CEP dosyasını içe aktar -CollectEarthMenu.2=Hizmetler -CollectEarthMenu.3=Büyük CSV plot dosyalarını böl -CollectEarthMenu.4=Verileri XML'e aktar (belirli bir tarihten itibaren) -CollectEarthMenu.5=Collect yedeÄŸi için dışa aktar -CollectEarthMenu.6=Collect Backup verilerini dışa aktar (tüm veriler) -CollectEarthMenu.7=Collect Backup verilerini dışa aktar (belirli bir tarihten itibaren) -CollectEarthMenu.8=Verileri XML'e aktar (özet özniteliÄŸine göre filtrele) \ No newline at end of file +SaikuAnalysisListener.0=Yes - Làm má»›i lại dữ liệu Saiku (quá trình dài) +SaikuAnalysisListener.1=No - chỉ khởi động Saiku +SaikuStarter.1=Khởi động Saiku +SaikuStarter.2=Cần vài phút để khởi động Saiku, xin đợi\! +SaveEarthDataServlet.0=Yêu cầu trống +SaveEarthDataServlet.1=Có trục trặc khi ghi dữ liệu vào CSDL +SaveEarthDataServlet.2=Dữ liệu đã được ghi +SlopeCode.0=Bằng phẳng (0-5) +EarthApp.11=Collect Earth Ä‘ang chạy +EarthApp.21=Không tìm thấy file chứa lưới ô trong đưá»ng dẫn đã chá»n \:
+EarthApp.23=Chưa thiết lập file CSV/CED \:

+EarthApp.24=Không tìm thấy file chứa Freemarker template vá»›i định nghÄ©a KML trong đưá»ng dẫn đã chá»n\:
+EarthApp.26=Chưa thiết lập file định nghĩa KML d\:

+EarthApp.27=Không tìm thấy file chứa mẫu HTML balloon trong đưá»ng dẫn đã chá»n\:
+EarthApp.29=Chưa thiết lập file HTML balloon \:

+EarthApp.3=Nhắc nhở sau +EarthApp.30=Xin hãy Ä‘iá»u chỉnh đúng địa chỉ file trong Tools->Properties menu. +EarthApp.4=Cập nhật luôn +EarthApp.5=Không nhắc nữa +EarthApp.57=Äã có phiên bản má»›i cá»§a Collect Earth\!
Bạn muốn làm tiếp như thế nào? +EarthApp.58=Thông báo cập nhật +EarthApp.59=Lỗi khi nhập file project +EarthApp.6=\ - Phiên bản +EarthApp.61=Không mở được file Collect Earth.
Äá» nghị đảm bảo đã cài đặt Google Earth. +EarthSurveyService.9=Trưá»ng bắt buá»™c +ExportActionListener.1=Chá»n ngày xuất bản ghi +ExportDialogProcessMonitor.0=Äang xá»­ lý dữ liệu... +ExportDialogProcessMonitor.1=Äang đợi khởi động quá trình\: +ExportDialogProcessMonitor.4=Các bản ghi đã xuất\: +ImportProcessMonitorDialog.0=Các bản ghi đã nhập\: +ImportActionListener.0=Có nhập dữ liệu các ô chưa được Ä‘iá»n đầy đủ không? +ImportActionListener.2=Nếu bạn chá»n NO sẽ chỉ nhập dữ liệu cá»§a các ô có trạng thái màu "xanh lá cây", các ô đã có đầy đủ dữ liệu. +ImportActionListener.3=Nhập các bản ghi chưa hoàn tất +ImportDialogProcessMonitor.0=\ ÄANG TÃNH TOÃN +ImportDialogProcessMonitor.11=Số lượng ban đầu các bản ghi\: +ImportDialogProcessMonitor.2=Äang nhập các bản ghi... +ImportDialogProcessMonitor.5=Số lượng thá»±c tế các bản ghi đã nhập\: +ImportDialogProcessMonitor.8=Äang xá»­ lý dữ liệu... +InfiniteProgressMonitor.0=Há»§y lệnh +JFileChooserExistsAware.0=File project cá»§a Collect Earth +KmlImportService.13=Chá»n file CSV file để ghi địa Ä‘iểm cá»§a ô vào +MissingPlotsListener.0=Lá»—i khi lấy thông tin vỠô không có trong CSDL +MissingPlotsListener.1=Các ô thiếu +MissingPlotsListener.10=Tổng số ô trong thiết kế chá»n mẫu \: +MissingPlotsListener.12=Số ô thiếu\: +MissingPlotsListener.14=Äã Ä‘iá»n tất cả các ô\! +MissingPlotsListener.2=Sao chép ná»™i dung vào bàn phím +MissingPlotsListener.3=Lá»±a chá»n file có chứa thông tin ô ( file .csv hoặc .ced ) mà bạn muốn biết đã Ä‘iá»n đủ dữ liệu chưa. +MissingPlotsListener.4=Các ô thiếu - thông tin +MissingPlotsListener.5=Từ file \: +MissingPlotsListener.6=Xuất ra file CED +ProcessMonitorDialog.1=Tìm lá»—i trên số dòng +ProcessMonitorDialog.4=, cá»™t +ProcessMonitorDialog.5=\ -- giá trị From 0492d21e3c673bc599228091f6fc7f6a897f4476 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:36:45 +0100 Subject: [PATCH 0819/1620] New translations Messages_vi.properties (Spanish) --- .../earth/app/view/Messages_es.properties | 457 +++++++++--------- 1 file changed, 218 insertions(+), 239 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index c9742c724a..5110140e9c 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,242 +1,221 @@ -AboutDialog.19=Bir sorun oluÅŸtu -AboutDialog.5=Daha fazla bilgi için web sitemizi ziyaret edin OpenForis.org -AboutDialog.6=Üzgünüm, sisteminizin varsayılan tarayıcısı bu baÄŸlantıyı açmak isterken bir sorun oluÅŸtu. -AboutDialog.8=Tamam -AspectCode.0=Kuzey -AspectCode.1=Kuzey-doÄŸu -AspectCode.2=DoÄŸu -AspectCode.3=Güney-doÄŸu -AspectCode.4=Güney -AspectCode.5=Güney-batı -AspectCode.6=Batı -AspectCode.7=Kuzey-batı -CollectEarthWindow.0=Veri CSV dosyasına aktarılmaya çalışılırken hata oluÅŸtu -CollectEarthWindow.1=Dışa aktarma hatası -CollectEarthWindow.10=Dosya -CollectEarthWindow.11=Çıkış -CollectEarthWindow.12=Araçlar -CollectEarthWindow.13=Verileri CSV'ye aktar -CollectEarthWindow.14=SAIKU Analysis baÅŸlat -CollectEarthWindow.15=Özellikler -CollectEarthWindow.16=Yardım -CollectEarthWindow.17=Yasal uyarı -CollectEarthWindow.18=Veritabnında eksik plotları bulun +AboutDialog.19=Äã có lá»—i +AboutDialog.5=Truy cập website cá»§a chúng tôi để biết thêm thông tin OpenForis.org +AboutDialog.6=Xin lá»—i, đã có sá»± cố khi mở link trong brower chuẩn trong hệ thống cá»§a bạn. +AboutDialog.8=Ok +AspectCode.0=Bắc +AspectCode.1=Äông-Bắc +AspectCode.2=Äông +AspectCode.3=Äông-Nam +AspectCode.4=Nam +AspectCode.5=Tây-Nam +AspectCode.6=Tây +AspectCode.7=Tây-Bắc +CollectEarthWindow.0=Lá»—i khi xuất dữ liệu sang file CSV +CollectEarthWindow.1=Lá»—i xuất dữ liệu +CollectEarthWindow.10=File +CollectEarthWindow.11=Thoát +CollectEarthWindow.12=Công cụ +CollectEarthWindow.13=Xuất dữ liệu ra CSV +CollectEarthWindow.14=Khởi động SAIKU Analysis +CollectEarthWindow.15=Thuá»™c tính +CollectEarthWindow.16=Trợ giúp +CollectEarthWindow.17=Thông tin công bố +CollectEarthWindow.18=Tìm ô thiếu trong cÆ¡ sở dữ liệu CollectEarthWindow.19=Collect Earth -CollectEarthWindow.2=Dil -CollectEarthWindow.20=Kopyalanan kayıt sayısı\: -CollectEarthWindow.21=Ana bilgisayar için simge bulunamadı -CollectEarthWindow.22=Collect Earth'ü kapatmak istediÄŸinizden emin misiniz?
Pencereyi kapatmanız durumunda Collect Earth sunucusunu da kapatır. -CollectEarthWindow.23=Onay gerekiyor -CollectEarthWindow.24=XML Dışa aktar -CollectEarthWindow.25=Mevcut verileriniz kaybolacak yine de bu kayıtları eklemek istiyor musunuz? -CollectEarthWindow.26=Operatör -CollectEarthWindow.27=Güncelle -CollectEarthWindow.28=Operatör, verileri değerlendirirken Open Foris Collect Earth sunucusu çalışmalıdır. -CollectEarthWindow.29=Saiku Sunucusu yapılandırılmadı. -CollectEarthWindow.3=İçe aktarma hatası -CollectEarthWindow.30=Lütfen Google Earth'ü kullanırken bu pencereyi açık tutun. -CollectEarthWindow.31=Toplanan verileri CSV dosyasına aktar -CollectEarthWindow.32=Vazgeç -CollectEarthWindow.33=Operatör adı 5 karakterden uzun ve 50 karakterden kısa olmalıdır -CollectEarthWindow.34=Doğrulama hatası -CollectEarthWindow.35=OPERATÖR ADI BOŞ\!
Lütfen operatör adını girin ve "Güncelle" düğmesine basın. -CollectEarthWindow.36=Operatör adı boş olamaz -CollectEarthWindow.37=Açık Tut -CollectEarthWindow.38=CSV dosyaları -CollectEarthWindow.39=DİKKAT\: Yeni verileri almadan önce mevcut verilerinizi (XML'e Aktar) yedeklemeniz önerilir. -CollectEarthWindow.4=FAO Yasal uyarı bildirimleri -CollectEarthWindow.40=Araçlar-> Özellikler-> Gelişmiş sekmesinde Saiku Sunucusunun kurulu olduğu klasörün yolunu ayarlayın. -CollectEarthWindow.41=Dışa aktarılan verileri dosyaya kaydet -CollectEarthWindow.42=Vazgeç -CollectEarthWindow.43=Yinelenen kayıtlar bulundu -CollectEarthWindow.44=Verileri İçe/Dışa aktar -CollectEarthWindow.45=Verileri XML'e aktar (Sıkıştırılmış) -CollectEarthWindow.46=Verileri ZIP'ten içe aktar (sıkıştırılmış XML) -CollectEarthWindow.55=CSV kullanarak mevcut kayıtları güncelle -CollectEarthWindow.47=Saiku Sunucusu yapılandırılmadı -CollectEarthWindow.48=Zip/collect-data dosyası -CollectEarthWindow.49=Fusion table CSV dosyası -CollectEarthWindow.5=Kapat -CollectEarthWindow.50=Kullanım Kılavuzunu Aç -CollectEarthWindow.51=Collect Earth güncellemelerini kontrol et -CollectEarthWindow.52=Uygulama Günlüğünü Aç -CollectEarthWindow.53=Collect Earth Günlüğü -CollectEarthWindow.54=Noktaları KML'den yükle -CollectEarthWindow.56=Hakkında... -CollectEarthWindow.57=Saiku başlatıcısı işlemi hala devam ediyor, lütfen bekleyin. -CollectEarthWindow.58=Saiku analysis başlatılamıyor -CollectEarthWindow.59=Saiku analizi için veri setini yeniden oluşturmak ister misiniz?
Bu iÅŸlem zaman alabilir.
"EVET" üzerine tıklarsanız, en son bilgileri içeren yeni bir veri seti oluşturulur. -CollectEarthWindow.6=Fusion Table'a aktar -CollectEarthWindow.60=Saiku veri üretimi -CollectEarthWindow.61=Verileri XML'e aktar (Son dışa aktarımdan bu yana değiştirilmiş kayıtlar) -CollectEarthWindow.62=Hakkında... -CollectEarthWindow.63=Noktalar KML'den alırken hata oluştu -CollectEarthWindow.64=Teknik Destek -CollectEarthWindow.7=Veri içe aktarılırken hata oluştu -CollectEarthWindow.8=Yasal uyarı metni bulunamadı -CollectEarthWindow.9=Alınan veriler veritabanında zaten mevcut olan kayıtları içerir. -CollectEarthWindow.65=Operatör adı değiştirildi -CollectEarthWindow.66=Operatör adı -CollectEarthWindow.70=Anket rehberini aç -DynamicsCode.0=Başlangıçta Orman -DynamicsCode.1=Başlangıçta Mera -DynamicsCode.2=Başlangıçta Yerleşim -DynamicsCode.3=Başlangıçta Diğer -DynamicsCode.4=Başlangıçta Sulak -DynamicsCode.5=Başlangıçta Tarım -OpenTextFileListener.0=Metin dosyası bulunamadı \: -OptionWizard.0=Collect Earth seçenekler -OptionWizard.1=Tarayıcı Seç -OptionWizard.10=Yedekleme klasörünü aç -OptionWizard.11=Blinmeyen\: yapılandırma kullanımı -OptionWizard.12=İstemci durumu -OptionWizard.13=Collect Earth Sunucu IP -OptionWizard.14=Collect Earth sunucu girişi (örn. 8023) -OptionWizard.15=Kaydet & Değişiklikleri uygula +CollectEarthWindow.2=Ngôn ngữ +CollectEarthWindow.20=Số bản ghi trùng\: +CollectEarthWindow.21=Không tìm thấy biểu tượng cho khung chính +CollectEarthWindow.22=Bạn có chắc là muốn đóng Collect Earth?
Äóng cá»­a sổ cÅ©ng đóng luôn máy chá»§ Collect Earth +CollectEarthWindow.23=Cần khẳng định +CollectEarthWindow.24=Xuất ra XML +CollectEarthWindow.25=Bạn có muốn thêm các bản ghi này và bá» Ä‘i dữ liệu hiện thá»i không? +CollectEarthWindow.26=Ngưá»i sá»­ dụng +CollectEarthWindow.27=Cập nhật +CollectEarthWindow.28=Máy chá»§ Open Foris Collect Earth phải chạy khi ngưá»i sá»­ dụng giải Ä‘oán dữ liệu. +CollectEarthWindow.29=Chưa xác định cấu hình cho Máy chá»§ Saiku. +CollectEarthWindow.3=\ Lá»—i nhập +CollectEarthWindow.30=Äể mở cá»­a sổ này khi Ä‘ang sá»­ dụng Google Earth. +CollectEarthWindow.31=Xuất dữ liệu đã thu thập sang file CSV +CollectEarthWindow.32=Thoát +CollectEarthWindow.33=Tên ngưá»i sá»­ dụng phải dài hÆ¡n 5 chữ cái và ngắn hÆ¡n 50 chữ cái +CollectEarthWindow.34=Lá»—i kiểm chứng +CollectEarthWindow.35=TÊN NGƯỜI SỬ DỤNG CÃ’N TRá»NG\!
Hãy Ä‘iá»n tên ngưá»i sá»­ dụng và nhắp phím "Update". +CollectEarthWindow.36=Không được để trống phần tên ngưá»i sá»­ dụng +CollectEarthWindow.37=Äể mở +CollectEarthWindow.38=file CSV +CollectEarthWindow.39=THÔNG BÃO\: Nên lưu dá»± phòng dữ liệu hiện thá»i(Xuất ra XML) trước khi nhập dữ liệu má»›i +CollectEarthWindow.4=Thông tin công bố cá»§a FAO +CollectEarthWindow.40=Thiết lập đưá»ng dẫn tá»›i thư mục cài đặt Saiku Server trong Tools->Properties->Advanced tab. +CollectEarthWindow.41=Ghi dữ liệu xuất ra vào file\: +CollectEarthWindow.42=Thoát +CollectEarthWindow.43=Tìm thấy bản ghi có mâu thuẫn +CollectEarthWindow.44=Nhập/Xuất dữ liệu +CollectEarthWindow.45=Xuất dữ liệu ra XML (nén) +CollectEarthWindow.46=Nhập dữ liệu má»›i từ file ZIP (XML nén) +CollectEarthWindow.55=Cập nhật các bản ghi hiện thá»i bằng CSV +CollectEarthWindow.47=Chưa định cấu hình cho Saiku Server +CollectEarthWindow.48=Zip/collect-data files +CollectEarthWindow.49=Files CSV tổng hợp +CollectEarthWindow.5=Äóng +CollectEarthWindow.50=Mở hướng dẫn ngưá»i sá»­ dụng +CollectEarthWindow.51=Kiểm tra cập nhật cá»§a Collect Earth +CollectEarthWindow.52=Mở file nhật ký ứng dụng +CollectEarthWindow.53=File nhật ký cá»§a Collect Earth +CollectEarthWindow.54=Nạp các Ä‘iểm từ KML +CollectEarthWindow.56=Vá»... +CollectEarthWindow.57=Äang chạy quá trình khởi động Saiku, xin đợi. +CollectEarthWindow.58=Không thể khởi động Saiku analysis +CollectEarthWindow.59=Bạn có muốn tạo lại bá»™ dữ liệu cho Saiku analysis không?
Quá trình này sẽ mất một vài phút.
Nếu bạn chá»n "YES" sẽ tạo ra má»™t bá»™ dữ liệu má»›i vá»›i các thông tin cập nhật nhất. +CollectEarthWindow.6=Xuất ra bảng tổng hợp +CollectEarthWindow.60=Tạo dữ liệu Saiku +CollectEarthWindow.61=Xuất dữ liệu ra XML (các bản ghi chỉnh sá»­a từ lần xuất trước) +CollectEarthWindow.62=Vá»... +CollectEarthWindow.63=Lá»—i khi nạp Ä‘iểm từ KML +CollectEarthWindow.64=Há»— trợ kỹ thuật +CollectEarthWindow.7=Lá»—i khi nhập dữ liệu +CollectEarthWindow.8=Không tìm thấy văn bản thông báo +CollectEarthWindow.9=Dữ liệu nhập vào có chứa các bản ghi đã có trong cÆ¡ sở dữ liệu cá»§a bạn. +DynamicsCode.0=Ban đầu là rừng +DynamicsCode.1=Ban đầu là trảng cá» +DynamicsCode.2=Ban đầu là khu dân cư +DynamicsCode.3=Ban đầu là đất khác +DynamicsCode.4=Ban đầu là đất ngập nước +DynamicsCode.5=Ban đầu là đất trồng trá»t +OpenTextFileListener.0=không tìm thấy file văn bản tại\: +OptionWizard.0=Các lá»±a chá»n cá»§a Collect Earth +OptionWizard.1=Chá»n Browser +OptionWizard.10=Mở thư mục lưu dá»± phòng +OptionWizard.11=Không biết\: hãy sá»­ dụng ifconfig +OptionWizard.12=Vi dụ cá»§a khác +OptionWizard.13=Äịa chỉ IP cá»§a máy chá»§ Collect Earth +OptionWizard.14=Cổng máy chá»§ Collect Earth (vd\: 8023) +OptionWizard.15=Ghi và áo dụng thay đổi OptionWizard.16=ID -OptionWizard.17=X-coord -OptionWizard.18=Y-coord -OptionWizard.19=Yükseklik -OptionWizard.2=İş akışı (sunucu/istemci) -OptionWizard.20=Google Earth içerikleri deÄŸiÅŸtirildi.
Lütfen Google Earth tarafından istendiğinde içeriğin yeniden yüklenmesini kabul edin. -OptionWizard.21=Güncelleme başarılı -OptionWizard.22=Eğim -OptionWizard.23=Google Earth verilerini yeniden açarken bir hata oluştu -OptionWizard.24=İptal -OptionWizard.25=İşlem Modu -OptionWizard.26=DB host -OptionWizard.27=Bu tanınmış bir Saiku klasörü değil ( start-saiku.bat dosyası mevcut değil) -OptionWizard.28=Saiku Sunucusu tanınmadı -OptionWizard.29=DB port -OptionWizard.3=Sunucu örneği -OptionWizard.30=SQLite seçenekleri -OptionWizard.31=Örnek veri -OptionWizard.32=Plot düzeni -OptionWizard.33=Anket Tanımı -OptionWizard.34=Gelişmiş -OptionWizard.35=Kontrol noktası sayısı -OptionWizard.36=Kontrol noktaları arasındaki mesafe (metre cinsinden) -OptionWizard.37=Plot kenarı ile mesafesi (metre cinsinden) -OptionWizard.38=CSV / CED dosyası doğru okunamıyor.
Dosyanın böyle bir virgülle ayrılmış değerlere sahip olması beklenir \:
-OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect -OptionWizard.4=Geçerli bilgisayar IP'si \: -OptionWizard.40=Projeler -OptionWizard.41=Yeni bir proje dosyası yükle -OptionWizard.42=CSV okuyucuyu kapatırken hata oluÅŸtu -OptionWizard.43=Anketin adı -OptionWizard.44=veritabanını otomatik olarak yedekle -OptionWizard.45=Earth Engine plot alanına yakınlaÅŸtırarak aç -OptionWizard.46=Plot alanı için Earth Engine Timelapse'yi aç -OptionWizard.47=Plot alanı için Bing Maps'i aç -OptionWizard.48=Formu Google Earth yerine bir tarayıcıda aç (LINUX için önerilir) -OptionWizard.49=Plot verisini içeren ced / csv dosyasının yolu -OptionWizard.5=Collect Earth Sunucu giriÅŸi\: -OptionWizard.50=Tarayıcı... -OptionWizard.51=Proje dosyası içe aktarılırken hata oluÅŸtu -OptionWizard.52=Yalnızca koordinatlara sahip CSV / CED dosyası -OptionWizard.53=Puan yok -OptionWizard.54=Merkez noktası -OptionWizard.55=Proje dosyası içe aktarılırken hata oluÅŸtu -OptionWizard.56=Proje yükle -OptionWizard.57=Önceden yüklenmiÅŸ projeler -OptionWizard.58=GEE Kod Düzenleyicisini açın (Güvenilir Test Cihazı eriÅŸimi gerektirir) -OptionWizard.59=Plot üzerinde Here Maps'i aç -OptionWizard.6=PostgreSQL DB parametreleri -OptionWizard.65=Saiku klasör yolu -OptionWizard.66=Tarayıcı... -OptionWizard.67=Firefox kısayol yolu -OptionWizard.68=Tarayıcı... -OptionWizard.7=Kullanıcı adı -OptionWizard.70=Kısayol dosyaları -OptionWizard.72=İkili dosyalar -OptionWizard.73=Chrome kısayol yolu -OptionWizard.74=Tarayıcı... -OptionWizard.76=Kısayol dosyaları -OptionWizard.78=İkili dosyalar -OptionWizard.79=KML iÅŸaretçi ÅŸablonu yolu -OptionWizard.8=Parola -OptionWizard.80=Tarayıcı... -OptionWizard.82=İşaretçi ÅŸablonu -OptionWizard.83=Form tasarımının HTML balon yolu -OptionWizard.84=Tarayıcı... -OptionWizard.86=HTML web sayfası -OptionWizard.87=IDM tanımıyla XML yolu -OptionWizard.88=Tarayıcı... -OptionWizard.9=DB Adı -OptionWizard.90=XML IDM tanımlama -OptionWizard.91=Sunucu (yönetici sürümü veya tek başına kullanım) -OptionWizard.92=İstemci (operatör/sunucuya baÄŸlı) -OptionWizard.93=SQLite (Gömülü / tek dosya tabanlı) +OptionWizard.17=Tá»a độ X +OptionWizard.18=Tá»a độ Y +OptionWizard.19=Äá»™ cao +OptionWizard.2=Dòng công tác (máy chá»§/khách) +OptionWizard.20=Ná»™i dung cá»§a Google Earth đã thay đổi.
Äá» nghị chấp nhận tải lại ná»™i dung khi Google Earth gợi ý. +OptionWizard.21=Cập nhật thành công +OptionWizard.22=Dốc +OptionWizard.23=Có lá»—i khi mở lại dữ liệu Google Earth +OptionWizard.24=Há»§y +OptionWizard.25=Mode vận hành +OptionWizard.26=NÆ¡i lưu cÆ¡ sở dữ liệu +OptionWizard.27=Äây không phải là thư mục Saiku (hiện không có file start-saiku.bat) +OptionWizard.28=Không nhận được máy chá»§ Saiku +OptionWizard.29=Cổng cÆ¡ sở dữ liệu +OptionWizard.3=Ví dụ cá»§a máy chá»§ +OptionWizard.30=Các lá»±a chá»n cá»§a SQLite +OptionWizard.31=Dữ liệu mẫu +OptionWizard.32=SÆ¡ đồ mẫu +OptionWizard.33=Äịnh nghÄ©a khảo sát +OptionWizard.34=Nâng cao +OptionWizard.35=Số Ä‘iểm mẫu +OptionWizard.36=Khoảng cách giữa các Ä‘iểm mẫu (tính theo mét) +OptionWizard.37=Lá» vá»›i biên ô (tính theo mét) +OptionWizard.38=Không Ä‘á»c được đúng file CSV/CED.
Cần có dấu phảy để phân tách giá trị giống như sau \:
+OptionWizard.39=ID,Tá»a độ Y,tá»a độ X,độ cao,độ dốc,tá»· lệ +OptionWizard.4=Äịa chỉ IP hiện tại cá»§a máy tính\: +OptionWizard.40=Các project +OptionWizard.41=tải file project má»›i +OptionWizard.42=Lá»—i khi đóng CSV reader +OptionWizard.43=Tên khảo sát +OptionWizard.44=tá»± động lưu dá»± phòng dữ liệu tại +OptionWizard.45=Mở Earth Engine để phóng to vào khu vá»±c ô +OptionWizard.46=Mở Earth Engine timelapse cho khu vá»±c ô +OptionWizard.47=Mở Bing Maps cho khu vá»±c ô +OptionWizard.48=Mở form trên browser thay vì mở Google Earth (khuyến cáo cho LINUX) +OptionWizard.49=ÄÆ°á»ng dẫn tá»›i file ced/csv file vá»›i dữ liệu ô +OptionWizard.5=Cổng máy chá»§ Collect Earth\: +OptionWizard.50=Browse... +OptionWizard.51=Lá»—i nhập file project +OptionWizard.52=File CSV/CED chỉ có tá»a độ +OptionWizard.53=Ô vuông +OptionWizard.54=Äiểm trung tâm +OptionWizard.55=Lá»—i khi nhập thư mục project +OptionWizard.56=Tải project +OptionWizard.57=Các project đã tải +OptionWizard.58=Mở GEE Code Editor (cần phải có quyá»n truy cập Trusted Tester) +OptionWizard.59=Mở Here Maps tập trung vào ô +OptionWizard.6=Các thông số cá»§a CSDL PostgreSQL +OptionWizard.65=ÄÆ°á»ng dẫn tá»›i thư mục Saiku +OptionWizard.66=Browse... +OptionWizard.67=ÄÆ°á»ng dẫn tá»›i Firefox executable (file exe) +OptionWizard.68=Browse... +OptionWizard.7=Tên ngưá»i sá»­ dụng +OptionWizard.70=File chạy +OptionWizard.72=File nhị phân +OptionWizard.73=ÄÆ°á»ng dẫn tá»›i Chrome executable (file exe) +OptionWizard.74=Browse... +OptionWizard.76=File exe +OptionWizard.78=File nhị phân +OptionWizard.79=ÄÆ°á»ng dẫn tá»›i KML Freemarker template +OptionWizard.8=Mật khẩu +OptionWizard.80=Browse... +OptionWizard.82=Freemarker template +OptionWizard.83=ÄÆ°á»ng dẫn tá»›i mẫu thiết kế HTML Balloon +OptionWizard.84=Browse... +OptionWizard.86=HTML webpage +OptionWizard.87=ÄÆ°á»ng dẫn tá»›i XML vá»›i định nghÄ©a IDM +OptionWizard.88=Browse... +OptionWizard.9=Tên CSDL +OptionWizard.90=Äịnh nghÄ©a XML IDM +OptionWizard.91=Máy chá»§ (phiên bản quản lý hoặc sá»­ dụng độc lập) +OptionWizard.92=Khách (ngưá»i sá»­ dụng/kết nối vá»›i máy chá»§) +OptionWizard.93=SQLite (tích hợp/file đơn lẻ) OptionWizard.94=PostgreSQL -OptionWizard.95=Örnekleme noktalarının kenarı (metre olarak) -SaikuAnalysisListener.0=Evet - Saiku verilerini yenile (uzun iÅŸlem) -SaikuAnalysisListener.1=Hayır - Sadece Saiku'yu baÅŸlat -SaikuStarter.1=Saiku baÅŸlatılıyor -SaikuStarter.2=Saiku baÅŸlatılıyor birkaç dakika sürebilir, lütfen bekleyin \! -SaveEarthDataServlet.0=BoÅŸ istek -SaveEarthDataServlet.1=Veriyi veritabanına kaydederken sorun oluÅŸtu -SaveEarthDataServlet.2=Veri kaydedildi -SlopeCode.0=Düz (0-5) -EarthApp.11=Collect Earth zaten çalışıyor -EarthApp.21=Plotlara ait seçili CSV/CED grid dosyası bulunamadı \:
-EarthApp.23=CSV/CED dosyası ayarlanmadı \:

-EarthApp.24=İşaretçi şablonunu KML tanımına sahip dosya seçili yolda bulunamadı \:
-EarthApp.26=KML tanım dosyası ayarlanmadı \:

-EarthApp.27=HTML balon formunu içeren dosya seçili yolda bulunamadı \:
-EarthApp.29=Hiçbir HTML balon dosyası oluşturulmadı \:

-EarthApp.3=Daha Sonra Hatırlat -EarthApp.30=Lütfen Araçlar-> Özellikler menüsünden dosya konumunu düzeltin.. -EarthApp.4=Şimdi Güncelle -EarthApp.5=Tekrar hatırlatma -EarthApp.57=Collect Earth'ün yeni bir sürümü var\!
Nasıl devam etmek istiyorsun? -EarthApp.58=Güncelleme uyarısı -EarthApp.59=Proje dosyasını içe aktarırken hata oluştu -EarthApp.6=\ - Versiyon -EarthApp.61=Collect Earth dosyası açılamadı.
Lütfen Google Earth’ün kurulu olduÄŸundan emin olun. -EarthSurveyService.9=Alan gerekli -ExportActionListener.1=Kayıtların GönderileceÄŸi Tarihi Seç -ExportDialogProcessMonitor.0=Veri iÅŸleniyor... -ExportDialogProcessMonitor.1=İşlemi baÅŸlatmak için bekleniyor \: -ExportDialogProcessMonitor.4=Dışa aktarılan kayıtlar \: -ImportProcessMonitorDialog.0=İçe aktarılan kayıtlar \: -ImportActionListener.0=Doldurulmamış plotlar içe aktarılsın mı? -ImportActionListener.2=EÄŸer tıklarsanız NO sadece tüm verileri içeren "yeÅŸil" durumdaki plotlar içe aktarılacaktır. -ImportActionListener.3=BitmemiÅŸ kayıtları içe aktar -ImportDialogProcessMonitor.0=\ HESAPLANIYOR -ImportDialogProcessMonitor.11=İlk kayıt sayısı \: -ImportDialogProcessMonitor.2=Kayıtlar içe aktarılıyor... -ImportDialogProcessMonitor.5=Güncel içe aktarılan kayıt sayısı \: -ImportDialogProcessMonitor.8=Veri iÅŸleniyor... -InfiniteProgressMonitor.0=İşlemi iptal et -JFileChooserExistsAware.0=Collect Earth Proje dosya -KmlImportService.13=Konumları kaydetmek için CSV dosyası seçin -MissingPlotsListener.0=Veritabanında bulunmayan plotlar hakkında bilgi alınırken hata oluÅŸtu -MissingPlotsListener.1=Eksik plotlar -MissingPlotsListener.10=Örnekleme tasarımındaki toplam plotların sayısı \: -MissingPlotsListener.12=Eksik plotların sayısı \: -MissingPlotsListener.14=Bütün plotlar dolu\! -MissingPlotsListener.2=İçeriÄŸi panoya kopyala -MissingPlotsListener.3=Tüm verilerin doldurulup doldurulmadığını öğrenmek istediÄŸiniz plot bilgilerini (.csv veya .ced dosyaları) içeren dosyaları seçin. -MissingPlotsListener.4=Eksik plotlar - Bilgi -MissingPlotsListener.5=Dosyadan \: -MissingPlotsListener.6=CED dosyasına aktar -ProcessMonitorDialog.1=Satır numarasında ayrıştırma hatası -ProcessMonitorDialog.4=, sütunlar -ProcessMonitorDialog.5=\ -- deÄŸerler - -ImportXMLDialogProcessMonitor.1 = Verilerin üzerine yaz -ImportXMLDialogProcessMonitor.2 = Sadece yinelenmeyen plotları içe aktar - -YES=Evet -YES_TO_ALL=Tümüne evet -NO=Hayır -NO_TO_ALL=Tümüne hayır - -CollectEarthMenu.0=CEP dosyasını içe aktar -CollectEarthMenu.2=Hizmetler -CollectEarthMenu.3=Büyük CSV plot dosyalarını böl -CollectEarthMenu.4=Verileri XML'e aktar (belirli bir tarihten itibaren) -CollectEarthMenu.5=Collect yedeÄŸi için dışa aktar -CollectEarthMenu.6=Collect Backup verilerini dışa aktar (tüm veriler) -CollectEarthMenu.7=Collect Backup verilerini dışa aktar (belirli bir tarihten itibaren) -CollectEarthMenu.8=Verileri XML'e aktar (özet özniteliÄŸine göre filtrele) \ No newline at end of file +SaikuAnalysisListener.0=Yes - Làm má»›i lại dữ liệu Saiku (quá trình dài) +SaikuAnalysisListener.1=No - chỉ khởi động Saiku +SaikuStarter.1=Khởi động Saiku +SaikuStarter.2=Cần vài phút để khởi động Saiku, xin đợi\! +SaveEarthDataServlet.0=Yêu cầu trống +SaveEarthDataServlet.1=Có trục trặc khi ghi dữ liệu vào CSDL +SaveEarthDataServlet.2=Dữ liệu đã được ghi +SlopeCode.0=Bằng phẳng (0-5) +EarthApp.11=Collect Earth Ä‘ang chạy +EarthApp.21=Không tìm thấy file chứa lưới ô trong đưá»ng dẫn đã chá»n \:
+EarthApp.23=Chưa thiết lập file CSV/CED \:

+EarthApp.24=Không tìm thấy file chứa Freemarker template vá»›i định nghÄ©a KML trong đưá»ng dẫn đã chá»n\:
+EarthApp.26=Chưa thiết lập file định nghĩa KML d\:

+EarthApp.27=Không tìm thấy file chứa mẫu HTML balloon trong đưá»ng dẫn đã chá»n\:
+EarthApp.29=Chưa thiết lập file HTML balloon \:

+EarthApp.3=Nhắc nhở sau +EarthApp.30=Xin hãy Ä‘iá»u chỉnh đúng địa chỉ file trong Tools->Properties menu. +EarthApp.4=Cập nhật luôn +EarthApp.5=Không nhắc nữa +EarthApp.57=Äã có phiên bản má»›i cá»§a Collect Earth\!
Bạn muốn làm tiếp như thế nào? +EarthApp.58=Thông báo cập nhật +EarthApp.59=Lỗi khi nhập file project +EarthApp.6=\ - Phiên bản +EarthApp.61=Không mở được file Collect Earth.
Äá» nghị đảm bảo đã cài đặt Google Earth. +EarthSurveyService.9=Trưá»ng bắt buá»™c +ExportActionListener.1=Chá»n ngày xuất bản ghi +ExportDialogProcessMonitor.0=Äang xá»­ lý dữ liệu... +ExportDialogProcessMonitor.1=Äang đợi khởi động quá trình\: +ExportDialogProcessMonitor.4=Các bản ghi đã xuất\: +ImportProcessMonitorDialog.0=Các bản ghi đã nhập\: +ImportActionListener.0=Có nhập dữ liệu các ô chưa được Ä‘iá»n đầy đủ không? +ImportActionListener.2=Nếu bạn chá»n NO sẽ chỉ nhập dữ liệu cá»§a các ô có trạng thái màu "xanh lá cây", các ô đã có đầy đủ dữ liệu. +ImportActionListener.3=Nhập các bản ghi chưa hoàn tất +ImportDialogProcessMonitor.0=\ ÄANG TÃNH TOÃN +ImportDialogProcessMonitor.11=Số lượng ban đầu các bản ghi\: +ImportDialogProcessMonitor.2=Äang nhập các bản ghi... +ImportDialogProcessMonitor.5=Số lượng thá»±c tế các bản ghi đã nhập\: +ImportDialogProcessMonitor.8=Äang xá»­ lý dữ liệu... +InfiniteProgressMonitor.0=Há»§y lệnh +JFileChooserExistsAware.0=File project cá»§a Collect Earth +KmlImportService.13=Chá»n file CSV file để ghi địa Ä‘iểm cá»§a ô vào +MissingPlotsListener.0=Lá»—i khi lấy thông tin vỠô không có trong CSDL +MissingPlotsListener.1=Các ô thiếu +MissingPlotsListener.10=Tổng số ô trong thiết kế chá»n mẫu \: +MissingPlotsListener.12=Số ô thiếu\: +MissingPlotsListener.14=Äã Ä‘iá»n tất cả các ô\! +MissingPlotsListener.2=Sao chép ná»™i dung vào bàn phím +MissingPlotsListener.3=Lá»±a chá»n file có chứa thông tin ô ( file .csv hoặc .ced ) mà bạn muốn biết đã Ä‘iá»n đủ dữ liệu chưa. +MissingPlotsListener.4=Các ô thiếu - thông tin +MissingPlotsListener.5=Từ file \: +MissingPlotsListener.6=Xuất ra file CED +ProcessMonitorDialog.1=Tìm lá»—i trên số dòng +ProcessMonitorDialog.4=, cá»™t +ProcessMonitorDialog.5=\ -- giá trị From e348981615847bc5286fea5b5b89d0c8ec05c3d4 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:36:47 +0100 Subject: [PATCH 0820/1620] New translations Messages_vi.properties (Portuguese) --- .../earth/app/view/Messages_pt.properties | 457 +++++++++--------- 1 file changed, 218 insertions(+), 239 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index c9742c724a..5110140e9c 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,242 +1,221 @@ -AboutDialog.19=Bir sorun oluÅŸtu -AboutDialog.5=Daha fazla bilgi için web sitemizi ziyaret edin OpenForis.org -AboutDialog.6=Üzgünüm, sisteminizin varsayılan tarayıcısı bu baÄŸlantıyı açmak isterken bir sorun oluÅŸtu. -AboutDialog.8=Tamam -AspectCode.0=Kuzey -AspectCode.1=Kuzey-doÄŸu -AspectCode.2=DoÄŸu -AspectCode.3=Güney-doÄŸu -AspectCode.4=Güney -AspectCode.5=Güney-batı -AspectCode.6=Batı -AspectCode.7=Kuzey-batı -CollectEarthWindow.0=Veri CSV dosyasına aktarılmaya çalışılırken hata oluÅŸtu -CollectEarthWindow.1=Dışa aktarma hatası -CollectEarthWindow.10=Dosya -CollectEarthWindow.11=Çıkış -CollectEarthWindow.12=Araçlar -CollectEarthWindow.13=Verileri CSV'ye aktar -CollectEarthWindow.14=SAIKU Analysis baÅŸlat -CollectEarthWindow.15=Özellikler -CollectEarthWindow.16=Yardım -CollectEarthWindow.17=Yasal uyarı -CollectEarthWindow.18=Veritabnında eksik plotları bulun +AboutDialog.19=Äã có lá»—i +AboutDialog.5=Truy cập website cá»§a chúng tôi để biết thêm thông tin OpenForis.org +AboutDialog.6=Xin lá»—i, đã có sá»± cố khi mở link trong brower chuẩn trong hệ thống cá»§a bạn. +AboutDialog.8=Ok +AspectCode.0=Bắc +AspectCode.1=Äông-Bắc +AspectCode.2=Äông +AspectCode.3=Äông-Nam +AspectCode.4=Nam +AspectCode.5=Tây-Nam +AspectCode.6=Tây +AspectCode.7=Tây-Bắc +CollectEarthWindow.0=Lá»—i khi xuất dữ liệu sang file CSV +CollectEarthWindow.1=Lá»—i xuất dữ liệu +CollectEarthWindow.10=File +CollectEarthWindow.11=Thoát +CollectEarthWindow.12=Công cụ +CollectEarthWindow.13=Xuất dữ liệu ra CSV +CollectEarthWindow.14=Khởi động SAIKU Analysis +CollectEarthWindow.15=Thuá»™c tính +CollectEarthWindow.16=Trợ giúp +CollectEarthWindow.17=Thông tin công bố +CollectEarthWindow.18=Tìm ô thiếu trong cÆ¡ sở dữ liệu CollectEarthWindow.19=Collect Earth -CollectEarthWindow.2=Dil -CollectEarthWindow.20=Kopyalanan kayıt sayısı\: -CollectEarthWindow.21=Ana bilgisayar için simge bulunamadı -CollectEarthWindow.22=Collect Earth'ü kapatmak istediÄŸinizden emin misiniz?
Pencereyi kapatmanız durumunda Collect Earth sunucusunu da kapatır. -CollectEarthWindow.23=Onay gerekiyor -CollectEarthWindow.24=XML Dışa aktar -CollectEarthWindow.25=Mevcut verileriniz kaybolacak yine de bu kayıtları eklemek istiyor musunuz? -CollectEarthWindow.26=Operatör -CollectEarthWindow.27=Güncelle -CollectEarthWindow.28=Operatör, verileri değerlendirirken Open Foris Collect Earth sunucusu çalışmalıdır. -CollectEarthWindow.29=Saiku Sunucusu yapılandırılmadı. -CollectEarthWindow.3=İçe aktarma hatası -CollectEarthWindow.30=Lütfen Google Earth'ü kullanırken bu pencereyi açık tutun. -CollectEarthWindow.31=Toplanan verileri CSV dosyasına aktar -CollectEarthWindow.32=Vazgeç -CollectEarthWindow.33=Operatör adı 5 karakterden uzun ve 50 karakterden kısa olmalıdır -CollectEarthWindow.34=Doğrulama hatası -CollectEarthWindow.35=OPERATÖR ADI BOŞ\!
Lütfen operatör adını girin ve "Güncelle" düğmesine basın. -CollectEarthWindow.36=Operatör adı boş olamaz -CollectEarthWindow.37=Açık Tut -CollectEarthWindow.38=CSV dosyaları -CollectEarthWindow.39=DİKKAT\: Yeni verileri almadan önce mevcut verilerinizi (XML'e Aktar) yedeklemeniz önerilir. -CollectEarthWindow.4=FAO Yasal uyarı bildirimleri -CollectEarthWindow.40=Araçlar-> Özellikler-> Gelişmiş sekmesinde Saiku Sunucusunun kurulu olduğu klasörün yolunu ayarlayın. -CollectEarthWindow.41=Dışa aktarılan verileri dosyaya kaydet -CollectEarthWindow.42=Vazgeç -CollectEarthWindow.43=Yinelenen kayıtlar bulundu -CollectEarthWindow.44=Verileri İçe/Dışa aktar -CollectEarthWindow.45=Verileri XML'e aktar (Sıkıştırılmış) -CollectEarthWindow.46=Verileri ZIP'ten içe aktar (sıkıştırılmış XML) -CollectEarthWindow.55=CSV kullanarak mevcut kayıtları güncelle -CollectEarthWindow.47=Saiku Sunucusu yapılandırılmadı -CollectEarthWindow.48=Zip/collect-data dosyası -CollectEarthWindow.49=Fusion table CSV dosyası -CollectEarthWindow.5=Kapat -CollectEarthWindow.50=Kullanım Kılavuzunu Aç -CollectEarthWindow.51=Collect Earth güncellemelerini kontrol et -CollectEarthWindow.52=Uygulama Günlüğünü Aç -CollectEarthWindow.53=Collect Earth Günlüğü -CollectEarthWindow.54=Noktaları KML'den yükle -CollectEarthWindow.56=Hakkında... -CollectEarthWindow.57=Saiku başlatıcısı işlemi hala devam ediyor, lütfen bekleyin. -CollectEarthWindow.58=Saiku analysis başlatılamıyor -CollectEarthWindow.59=Saiku analizi için veri setini yeniden oluşturmak ister misiniz?
Bu iÅŸlem zaman alabilir.
"EVET" üzerine tıklarsanız, en son bilgileri içeren yeni bir veri seti oluşturulur. -CollectEarthWindow.6=Fusion Table'a aktar -CollectEarthWindow.60=Saiku veri üretimi -CollectEarthWindow.61=Verileri XML'e aktar (Son dışa aktarımdan bu yana değiştirilmiş kayıtlar) -CollectEarthWindow.62=Hakkında... -CollectEarthWindow.63=Noktalar KML'den alırken hata oluştu -CollectEarthWindow.64=Teknik Destek -CollectEarthWindow.7=Veri içe aktarılırken hata oluştu -CollectEarthWindow.8=Yasal uyarı metni bulunamadı -CollectEarthWindow.9=Alınan veriler veritabanında zaten mevcut olan kayıtları içerir. -CollectEarthWindow.65=Operatör adı değiştirildi -CollectEarthWindow.66=Operatör adı -CollectEarthWindow.70=Anket rehberini aç -DynamicsCode.0=Başlangıçta Orman -DynamicsCode.1=Başlangıçta Mera -DynamicsCode.2=Başlangıçta Yerleşim -DynamicsCode.3=Başlangıçta Diğer -DynamicsCode.4=Başlangıçta Sulak -DynamicsCode.5=Başlangıçta Tarım -OpenTextFileListener.0=Metin dosyası bulunamadı \: -OptionWizard.0=Collect Earth seçenekler -OptionWizard.1=Tarayıcı Seç -OptionWizard.10=Yedekleme klasörünü aç -OptionWizard.11=Blinmeyen\: yapılandırma kullanımı -OptionWizard.12=İstemci durumu -OptionWizard.13=Collect Earth Sunucu IP -OptionWizard.14=Collect Earth sunucu girişi (örn. 8023) -OptionWizard.15=Kaydet & Değişiklikleri uygula +CollectEarthWindow.2=Ngôn ngữ +CollectEarthWindow.20=Số bản ghi trùng\: +CollectEarthWindow.21=Không tìm thấy biểu tượng cho khung chính +CollectEarthWindow.22=Bạn có chắc là muốn đóng Collect Earth?
Äóng cá»­a sổ cÅ©ng đóng luôn máy chá»§ Collect Earth +CollectEarthWindow.23=Cần khẳng định +CollectEarthWindow.24=Xuất ra XML +CollectEarthWindow.25=Bạn có muốn thêm các bản ghi này và bá» Ä‘i dữ liệu hiện thá»i không? +CollectEarthWindow.26=Ngưá»i sá»­ dụng +CollectEarthWindow.27=Cập nhật +CollectEarthWindow.28=Máy chá»§ Open Foris Collect Earth phải chạy khi ngưá»i sá»­ dụng giải Ä‘oán dữ liệu. +CollectEarthWindow.29=Chưa xác định cấu hình cho Máy chá»§ Saiku. +CollectEarthWindow.3=\ Lá»—i nhập +CollectEarthWindow.30=Äể mở cá»­a sổ này khi Ä‘ang sá»­ dụng Google Earth. +CollectEarthWindow.31=Xuất dữ liệu đã thu thập sang file CSV +CollectEarthWindow.32=Thoát +CollectEarthWindow.33=Tên ngưá»i sá»­ dụng phải dài hÆ¡n 5 chữ cái và ngắn hÆ¡n 50 chữ cái +CollectEarthWindow.34=Lá»—i kiểm chứng +CollectEarthWindow.35=TÊN NGƯỜI SỬ DỤNG CÃ’N TRá»NG\!
Hãy Ä‘iá»n tên ngưá»i sá»­ dụng và nhắp phím "Update". +CollectEarthWindow.36=Không được để trống phần tên ngưá»i sá»­ dụng +CollectEarthWindow.37=Äể mở +CollectEarthWindow.38=file CSV +CollectEarthWindow.39=THÔNG BÃO\: Nên lưu dá»± phòng dữ liệu hiện thá»i(Xuất ra XML) trước khi nhập dữ liệu má»›i +CollectEarthWindow.4=Thông tin công bố cá»§a FAO +CollectEarthWindow.40=Thiết lập đưá»ng dẫn tá»›i thư mục cài đặt Saiku Server trong Tools->Properties->Advanced tab. +CollectEarthWindow.41=Ghi dữ liệu xuất ra vào file\: +CollectEarthWindow.42=Thoát +CollectEarthWindow.43=Tìm thấy bản ghi có mâu thuẫn +CollectEarthWindow.44=Nhập/Xuất dữ liệu +CollectEarthWindow.45=Xuất dữ liệu ra XML (nén) +CollectEarthWindow.46=Nhập dữ liệu má»›i từ file ZIP (XML nén) +CollectEarthWindow.55=Cập nhật các bản ghi hiện thá»i bằng CSV +CollectEarthWindow.47=Chưa định cấu hình cho Saiku Server +CollectEarthWindow.48=Zip/collect-data files +CollectEarthWindow.49=Files CSV tổng hợp +CollectEarthWindow.5=Äóng +CollectEarthWindow.50=Mở hướng dẫn ngưá»i sá»­ dụng +CollectEarthWindow.51=Kiểm tra cập nhật cá»§a Collect Earth +CollectEarthWindow.52=Mở file nhật ký ứng dụng +CollectEarthWindow.53=File nhật ký cá»§a Collect Earth +CollectEarthWindow.54=Nạp các Ä‘iểm từ KML +CollectEarthWindow.56=Vá»... +CollectEarthWindow.57=Äang chạy quá trình khởi động Saiku, xin đợi. +CollectEarthWindow.58=Không thể khởi động Saiku analysis +CollectEarthWindow.59=Bạn có muốn tạo lại bá»™ dữ liệu cho Saiku analysis không?
Quá trình này sẽ mất một vài phút.
Nếu bạn chá»n "YES" sẽ tạo ra má»™t bá»™ dữ liệu má»›i vá»›i các thông tin cập nhật nhất. +CollectEarthWindow.6=Xuất ra bảng tổng hợp +CollectEarthWindow.60=Tạo dữ liệu Saiku +CollectEarthWindow.61=Xuất dữ liệu ra XML (các bản ghi chỉnh sá»­a từ lần xuất trước) +CollectEarthWindow.62=Vá»... +CollectEarthWindow.63=Lá»—i khi nạp Ä‘iểm từ KML +CollectEarthWindow.64=Há»— trợ kỹ thuật +CollectEarthWindow.7=Lá»—i khi nhập dữ liệu +CollectEarthWindow.8=Không tìm thấy văn bản thông báo +CollectEarthWindow.9=Dữ liệu nhập vào có chứa các bản ghi đã có trong cÆ¡ sở dữ liệu cá»§a bạn. +DynamicsCode.0=Ban đầu là rừng +DynamicsCode.1=Ban đầu là trảng cá» +DynamicsCode.2=Ban đầu là khu dân cư +DynamicsCode.3=Ban đầu là đất khác +DynamicsCode.4=Ban đầu là đất ngập nước +DynamicsCode.5=Ban đầu là đất trồng trá»t +OpenTextFileListener.0=không tìm thấy file văn bản tại\: +OptionWizard.0=Các lá»±a chá»n cá»§a Collect Earth +OptionWizard.1=Chá»n Browser +OptionWizard.10=Mở thư mục lưu dá»± phòng +OptionWizard.11=Không biết\: hãy sá»­ dụng ifconfig +OptionWizard.12=Vi dụ cá»§a khác +OptionWizard.13=Äịa chỉ IP cá»§a máy chá»§ Collect Earth +OptionWizard.14=Cổng máy chá»§ Collect Earth (vd\: 8023) +OptionWizard.15=Ghi và áo dụng thay đổi OptionWizard.16=ID -OptionWizard.17=X-coord -OptionWizard.18=Y-coord -OptionWizard.19=Yükseklik -OptionWizard.2=İş akışı (sunucu/istemci) -OptionWizard.20=Google Earth içerikleri deÄŸiÅŸtirildi.
Lütfen Google Earth tarafından istendiğinde içeriğin yeniden yüklenmesini kabul edin. -OptionWizard.21=Güncelleme başarılı -OptionWizard.22=Eğim -OptionWizard.23=Google Earth verilerini yeniden açarken bir hata oluştu -OptionWizard.24=İptal -OptionWizard.25=İşlem Modu -OptionWizard.26=DB host -OptionWizard.27=Bu tanınmış bir Saiku klasörü değil ( start-saiku.bat dosyası mevcut değil) -OptionWizard.28=Saiku Sunucusu tanınmadı -OptionWizard.29=DB port -OptionWizard.3=Sunucu örneği -OptionWizard.30=SQLite seçenekleri -OptionWizard.31=Örnek veri -OptionWizard.32=Plot düzeni -OptionWizard.33=Anket Tanımı -OptionWizard.34=Gelişmiş -OptionWizard.35=Kontrol noktası sayısı -OptionWizard.36=Kontrol noktaları arasındaki mesafe (metre cinsinden) -OptionWizard.37=Plot kenarı ile mesafesi (metre cinsinden) -OptionWizard.38=CSV / CED dosyası doğru okunamıyor.
Dosyanın böyle bir virgülle ayrılmış değerlere sahip olması beklenir \:
-OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect -OptionWizard.4=Geçerli bilgisayar IP'si \: -OptionWizard.40=Projeler -OptionWizard.41=Yeni bir proje dosyası yükle -OptionWizard.42=CSV okuyucuyu kapatırken hata oluÅŸtu -OptionWizard.43=Anketin adı -OptionWizard.44=veritabanını otomatik olarak yedekle -OptionWizard.45=Earth Engine plot alanına yakınlaÅŸtırarak aç -OptionWizard.46=Plot alanı için Earth Engine Timelapse'yi aç -OptionWizard.47=Plot alanı için Bing Maps'i aç -OptionWizard.48=Formu Google Earth yerine bir tarayıcıda aç (LINUX için önerilir) -OptionWizard.49=Plot verisini içeren ced / csv dosyasının yolu -OptionWizard.5=Collect Earth Sunucu giriÅŸi\: -OptionWizard.50=Tarayıcı... -OptionWizard.51=Proje dosyası içe aktarılırken hata oluÅŸtu -OptionWizard.52=Yalnızca koordinatlara sahip CSV / CED dosyası -OptionWizard.53=Puan yok -OptionWizard.54=Merkez noktası -OptionWizard.55=Proje dosyası içe aktarılırken hata oluÅŸtu -OptionWizard.56=Proje yükle -OptionWizard.57=Önceden yüklenmiÅŸ projeler -OptionWizard.58=GEE Kod Düzenleyicisini açın (Güvenilir Test Cihazı eriÅŸimi gerektirir) -OptionWizard.59=Plot üzerinde Here Maps'i aç -OptionWizard.6=PostgreSQL DB parametreleri -OptionWizard.65=Saiku klasör yolu -OptionWizard.66=Tarayıcı... -OptionWizard.67=Firefox kısayol yolu -OptionWizard.68=Tarayıcı... -OptionWizard.7=Kullanıcı adı -OptionWizard.70=Kısayol dosyaları -OptionWizard.72=İkili dosyalar -OptionWizard.73=Chrome kısayol yolu -OptionWizard.74=Tarayıcı... -OptionWizard.76=Kısayol dosyaları -OptionWizard.78=İkili dosyalar -OptionWizard.79=KML iÅŸaretçi ÅŸablonu yolu -OptionWizard.8=Parola -OptionWizard.80=Tarayıcı... -OptionWizard.82=İşaretçi ÅŸablonu -OptionWizard.83=Form tasarımının HTML balon yolu -OptionWizard.84=Tarayıcı... -OptionWizard.86=HTML web sayfası -OptionWizard.87=IDM tanımıyla XML yolu -OptionWizard.88=Tarayıcı... -OptionWizard.9=DB Adı -OptionWizard.90=XML IDM tanımlama -OptionWizard.91=Sunucu (yönetici sürümü veya tek başına kullanım) -OptionWizard.92=İstemci (operatör/sunucuya baÄŸlı) -OptionWizard.93=SQLite (Gömülü / tek dosya tabanlı) +OptionWizard.17=Tá»a độ X +OptionWizard.18=Tá»a độ Y +OptionWizard.19=Äá»™ cao +OptionWizard.2=Dòng công tác (máy chá»§/khách) +OptionWizard.20=Ná»™i dung cá»§a Google Earth đã thay đổi.
Äá» nghị chấp nhận tải lại ná»™i dung khi Google Earth gợi ý. +OptionWizard.21=Cập nhật thành công +OptionWizard.22=Dốc +OptionWizard.23=Có lá»—i khi mở lại dữ liệu Google Earth +OptionWizard.24=Há»§y +OptionWizard.25=Mode vận hành +OptionWizard.26=NÆ¡i lưu cÆ¡ sở dữ liệu +OptionWizard.27=Äây không phải là thư mục Saiku (hiện không có file start-saiku.bat) +OptionWizard.28=Không nhận được máy chá»§ Saiku +OptionWizard.29=Cổng cÆ¡ sở dữ liệu +OptionWizard.3=Ví dụ cá»§a máy chá»§ +OptionWizard.30=Các lá»±a chá»n cá»§a SQLite +OptionWizard.31=Dữ liệu mẫu +OptionWizard.32=SÆ¡ đồ mẫu +OptionWizard.33=Äịnh nghÄ©a khảo sát +OptionWizard.34=Nâng cao +OptionWizard.35=Số Ä‘iểm mẫu +OptionWizard.36=Khoảng cách giữa các Ä‘iểm mẫu (tính theo mét) +OptionWizard.37=Lá» vá»›i biên ô (tính theo mét) +OptionWizard.38=Không Ä‘á»c được đúng file CSV/CED.
Cần có dấu phảy để phân tách giá trị giống như sau \:
+OptionWizard.39=ID,Tá»a độ Y,tá»a độ X,độ cao,độ dốc,tá»· lệ +OptionWizard.4=Äịa chỉ IP hiện tại cá»§a máy tính\: +OptionWizard.40=Các project +OptionWizard.41=tải file project má»›i +OptionWizard.42=Lá»—i khi đóng CSV reader +OptionWizard.43=Tên khảo sát +OptionWizard.44=tá»± động lưu dá»± phòng dữ liệu tại +OptionWizard.45=Mở Earth Engine để phóng to vào khu vá»±c ô +OptionWizard.46=Mở Earth Engine timelapse cho khu vá»±c ô +OptionWizard.47=Mở Bing Maps cho khu vá»±c ô +OptionWizard.48=Mở form trên browser thay vì mở Google Earth (khuyến cáo cho LINUX) +OptionWizard.49=ÄÆ°á»ng dẫn tá»›i file ced/csv file vá»›i dữ liệu ô +OptionWizard.5=Cổng máy chá»§ Collect Earth\: +OptionWizard.50=Browse... +OptionWizard.51=Lá»—i nhập file project +OptionWizard.52=File CSV/CED chỉ có tá»a độ +OptionWizard.53=Ô vuông +OptionWizard.54=Äiểm trung tâm +OptionWizard.55=Lá»—i khi nhập thư mục project +OptionWizard.56=Tải project +OptionWizard.57=Các project đã tải +OptionWizard.58=Mở GEE Code Editor (cần phải có quyá»n truy cập Trusted Tester) +OptionWizard.59=Mở Here Maps tập trung vào ô +OptionWizard.6=Các thông số cá»§a CSDL PostgreSQL +OptionWizard.65=ÄÆ°á»ng dẫn tá»›i thư mục Saiku +OptionWizard.66=Browse... +OptionWizard.67=ÄÆ°á»ng dẫn tá»›i Firefox executable (file exe) +OptionWizard.68=Browse... +OptionWizard.7=Tên ngưá»i sá»­ dụng +OptionWizard.70=File chạy +OptionWizard.72=File nhị phân +OptionWizard.73=ÄÆ°á»ng dẫn tá»›i Chrome executable (file exe) +OptionWizard.74=Browse... +OptionWizard.76=File exe +OptionWizard.78=File nhị phân +OptionWizard.79=ÄÆ°á»ng dẫn tá»›i KML Freemarker template +OptionWizard.8=Mật khẩu +OptionWizard.80=Browse... +OptionWizard.82=Freemarker template +OptionWizard.83=ÄÆ°á»ng dẫn tá»›i mẫu thiết kế HTML Balloon +OptionWizard.84=Browse... +OptionWizard.86=HTML webpage +OptionWizard.87=ÄÆ°á»ng dẫn tá»›i XML vá»›i định nghÄ©a IDM +OptionWizard.88=Browse... +OptionWizard.9=Tên CSDL +OptionWizard.90=Äịnh nghÄ©a XML IDM +OptionWizard.91=Máy chá»§ (phiên bản quản lý hoặc sá»­ dụng độc lập) +OptionWizard.92=Khách (ngưá»i sá»­ dụng/kết nối vá»›i máy chá»§) +OptionWizard.93=SQLite (tích hợp/file đơn lẻ) OptionWizard.94=PostgreSQL -OptionWizard.95=Örnekleme noktalarının kenarı (metre olarak) -SaikuAnalysisListener.0=Evet - Saiku verilerini yenile (uzun iÅŸlem) -SaikuAnalysisListener.1=Hayır - Sadece Saiku'yu baÅŸlat -SaikuStarter.1=Saiku baÅŸlatılıyor -SaikuStarter.2=Saiku baÅŸlatılıyor birkaç dakika sürebilir, lütfen bekleyin \! -SaveEarthDataServlet.0=BoÅŸ istek -SaveEarthDataServlet.1=Veriyi veritabanına kaydederken sorun oluÅŸtu -SaveEarthDataServlet.2=Veri kaydedildi -SlopeCode.0=Düz (0-5) -EarthApp.11=Collect Earth zaten çalışıyor -EarthApp.21=Plotlara ait seçili CSV/CED grid dosyası bulunamadı \:
-EarthApp.23=CSV/CED dosyası ayarlanmadı \:

-EarthApp.24=İşaretçi şablonunu KML tanımına sahip dosya seçili yolda bulunamadı \:
-EarthApp.26=KML tanım dosyası ayarlanmadı \:

-EarthApp.27=HTML balon formunu içeren dosya seçili yolda bulunamadı \:
-EarthApp.29=Hiçbir HTML balon dosyası oluşturulmadı \:

-EarthApp.3=Daha Sonra Hatırlat -EarthApp.30=Lütfen Araçlar-> Özellikler menüsünden dosya konumunu düzeltin.. -EarthApp.4=Şimdi Güncelle -EarthApp.5=Tekrar hatırlatma -EarthApp.57=Collect Earth'ün yeni bir sürümü var\!
Nasıl devam etmek istiyorsun? -EarthApp.58=Güncelleme uyarısı -EarthApp.59=Proje dosyasını içe aktarırken hata oluştu -EarthApp.6=\ - Versiyon -EarthApp.61=Collect Earth dosyası açılamadı.
Lütfen Google Earth’ün kurulu olduÄŸundan emin olun. -EarthSurveyService.9=Alan gerekli -ExportActionListener.1=Kayıtların GönderileceÄŸi Tarihi Seç -ExportDialogProcessMonitor.0=Veri iÅŸleniyor... -ExportDialogProcessMonitor.1=İşlemi baÅŸlatmak için bekleniyor \: -ExportDialogProcessMonitor.4=Dışa aktarılan kayıtlar \: -ImportProcessMonitorDialog.0=İçe aktarılan kayıtlar \: -ImportActionListener.0=Doldurulmamış plotlar içe aktarılsın mı? -ImportActionListener.2=EÄŸer tıklarsanız NO sadece tüm verileri içeren "yeÅŸil" durumdaki plotlar içe aktarılacaktır. -ImportActionListener.3=BitmemiÅŸ kayıtları içe aktar -ImportDialogProcessMonitor.0=\ HESAPLANIYOR -ImportDialogProcessMonitor.11=İlk kayıt sayısı \: -ImportDialogProcessMonitor.2=Kayıtlar içe aktarılıyor... -ImportDialogProcessMonitor.5=Güncel içe aktarılan kayıt sayısı \: -ImportDialogProcessMonitor.8=Veri iÅŸleniyor... -InfiniteProgressMonitor.0=İşlemi iptal et -JFileChooserExistsAware.0=Collect Earth Proje dosya -KmlImportService.13=Konumları kaydetmek için CSV dosyası seçin -MissingPlotsListener.0=Veritabanında bulunmayan plotlar hakkında bilgi alınırken hata oluÅŸtu -MissingPlotsListener.1=Eksik plotlar -MissingPlotsListener.10=Örnekleme tasarımındaki toplam plotların sayısı \: -MissingPlotsListener.12=Eksik plotların sayısı \: -MissingPlotsListener.14=Bütün plotlar dolu\! -MissingPlotsListener.2=İçeriÄŸi panoya kopyala -MissingPlotsListener.3=Tüm verilerin doldurulup doldurulmadığını öğrenmek istediÄŸiniz plot bilgilerini (.csv veya .ced dosyaları) içeren dosyaları seçin. -MissingPlotsListener.4=Eksik plotlar - Bilgi -MissingPlotsListener.5=Dosyadan \: -MissingPlotsListener.6=CED dosyasına aktar -ProcessMonitorDialog.1=Satır numarasında ayrıştırma hatası -ProcessMonitorDialog.4=, sütunlar -ProcessMonitorDialog.5=\ -- deÄŸerler - -ImportXMLDialogProcessMonitor.1 = Verilerin üzerine yaz -ImportXMLDialogProcessMonitor.2 = Sadece yinelenmeyen plotları içe aktar - -YES=Evet -YES_TO_ALL=Tümüne evet -NO=Hayır -NO_TO_ALL=Tümüne hayır - -CollectEarthMenu.0=CEP dosyasını içe aktar -CollectEarthMenu.2=Hizmetler -CollectEarthMenu.3=Büyük CSV plot dosyalarını böl -CollectEarthMenu.4=Verileri XML'e aktar (belirli bir tarihten itibaren) -CollectEarthMenu.5=Collect yedeÄŸi için dışa aktar -CollectEarthMenu.6=Collect Backup verilerini dışa aktar (tüm veriler) -CollectEarthMenu.7=Collect Backup verilerini dışa aktar (belirli bir tarihten itibaren) -CollectEarthMenu.8=Verileri XML'e aktar (özet özniteliÄŸine göre filtrele) \ No newline at end of file +SaikuAnalysisListener.0=Yes - Làm má»›i lại dữ liệu Saiku (quá trình dài) +SaikuAnalysisListener.1=No - chỉ khởi động Saiku +SaikuStarter.1=Khởi động Saiku +SaikuStarter.2=Cần vài phút để khởi động Saiku, xin đợi\! +SaveEarthDataServlet.0=Yêu cầu trống +SaveEarthDataServlet.1=Có trục trặc khi ghi dữ liệu vào CSDL +SaveEarthDataServlet.2=Dữ liệu đã được ghi +SlopeCode.0=Bằng phẳng (0-5) +EarthApp.11=Collect Earth Ä‘ang chạy +EarthApp.21=Không tìm thấy file chứa lưới ô trong đưá»ng dẫn đã chá»n \:
+EarthApp.23=Chưa thiết lập file CSV/CED \:

+EarthApp.24=Không tìm thấy file chứa Freemarker template vá»›i định nghÄ©a KML trong đưá»ng dẫn đã chá»n\:
+EarthApp.26=Chưa thiết lập file định nghĩa KML d\:

+EarthApp.27=Không tìm thấy file chứa mẫu HTML balloon trong đưá»ng dẫn đã chá»n\:
+EarthApp.29=Chưa thiết lập file HTML balloon \:

+EarthApp.3=Nhắc nhở sau +EarthApp.30=Xin hãy Ä‘iá»u chỉnh đúng địa chỉ file trong Tools->Properties menu. +EarthApp.4=Cập nhật luôn +EarthApp.5=Không nhắc nữa +EarthApp.57=Äã có phiên bản má»›i cá»§a Collect Earth\!
Bạn muốn làm tiếp như thế nào? +EarthApp.58=Thông báo cập nhật +EarthApp.59=Lỗi khi nhập file project +EarthApp.6=\ - Phiên bản +EarthApp.61=Không mở được file Collect Earth.
Äá» nghị đảm bảo đã cài đặt Google Earth. +EarthSurveyService.9=Trưá»ng bắt buá»™c +ExportActionListener.1=Chá»n ngày xuất bản ghi +ExportDialogProcessMonitor.0=Äang xá»­ lý dữ liệu... +ExportDialogProcessMonitor.1=Äang đợi khởi động quá trình\: +ExportDialogProcessMonitor.4=Các bản ghi đã xuất\: +ImportProcessMonitorDialog.0=Các bản ghi đã nhập\: +ImportActionListener.0=Có nhập dữ liệu các ô chưa được Ä‘iá»n đầy đủ không? +ImportActionListener.2=Nếu bạn chá»n NO sẽ chỉ nhập dữ liệu cá»§a các ô có trạng thái màu "xanh lá cây", các ô đã có đầy đủ dữ liệu. +ImportActionListener.3=Nhập các bản ghi chưa hoàn tất +ImportDialogProcessMonitor.0=\ ÄANG TÃNH TOÃN +ImportDialogProcessMonitor.11=Số lượng ban đầu các bản ghi\: +ImportDialogProcessMonitor.2=Äang nhập các bản ghi... +ImportDialogProcessMonitor.5=Số lượng thá»±c tế các bản ghi đã nhập\: +ImportDialogProcessMonitor.8=Äang xá»­ lý dữ liệu... +InfiniteProgressMonitor.0=Há»§y lệnh +JFileChooserExistsAware.0=File project cá»§a Collect Earth +KmlImportService.13=Chá»n file CSV file để ghi địa Ä‘iểm cá»§a ô vào +MissingPlotsListener.0=Lá»—i khi lấy thông tin vỠô không có trong CSDL +MissingPlotsListener.1=Các ô thiếu +MissingPlotsListener.10=Tổng số ô trong thiết kế chá»n mẫu \: +MissingPlotsListener.12=Số ô thiếu\: +MissingPlotsListener.14=Äã Ä‘iá»n tất cả các ô\! +MissingPlotsListener.2=Sao chép ná»™i dung vào bàn phím +MissingPlotsListener.3=Lá»±a chá»n file có chứa thông tin ô ( file .csv hoặc .ced ) mà bạn muốn biết đã Ä‘iá»n đủ dữ liệu chưa. +MissingPlotsListener.4=Các ô thiếu - thông tin +MissingPlotsListener.5=Từ file \: +MissingPlotsListener.6=Xuất ra file CED +ProcessMonitorDialog.1=Tìm lá»—i trên số dòng +ProcessMonitorDialog.4=, cá»™t +ProcessMonitorDialog.5=\ -- giá trị From 76b2ce7816218508e50f84e4b9648b0b2a995d9e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:36:48 +0100 Subject: [PATCH 0821/1620] New translations Messages_vi.properties (English) --- .../earth/app/view/Messages_en.properties | 457 +++++++++--------- 1 file changed, 218 insertions(+), 239 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index c9742c724a..5110140e9c 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,242 +1,221 @@ -AboutDialog.19=Bir sorun oluÅŸtu -AboutDialog.5=Daha fazla bilgi için web sitemizi ziyaret edin OpenForis.org -AboutDialog.6=Üzgünüm, sisteminizin varsayılan tarayıcısı bu baÄŸlantıyı açmak isterken bir sorun oluÅŸtu. -AboutDialog.8=Tamam -AspectCode.0=Kuzey -AspectCode.1=Kuzey-doÄŸu -AspectCode.2=DoÄŸu -AspectCode.3=Güney-doÄŸu -AspectCode.4=Güney -AspectCode.5=Güney-batı -AspectCode.6=Batı -AspectCode.7=Kuzey-batı -CollectEarthWindow.0=Veri CSV dosyasına aktarılmaya çalışılırken hata oluÅŸtu -CollectEarthWindow.1=Dışa aktarma hatası -CollectEarthWindow.10=Dosya -CollectEarthWindow.11=Çıkış -CollectEarthWindow.12=Araçlar -CollectEarthWindow.13=Verileri CSV'ye aktar -CollectEarthWindow.14=SAIKU Analysis baÅŸlat -CollectEarthWindow.15=Özellikler -CollectEarthWindow.16=Yardım -CollectEarthWindow.17=Yasal uyarı -CollectEarthWindow.18=Veritabnında eksik plotları bulun +AboutDialog.19=Äã có lá»—i +AboutDialog.5=Truy cập website cá»§a chúng tôi để biết thêm thông tin OpenForis.org +AboutDialog.6=Xin lá»—i, đã có sá»± cố khi mở link trong brower chuẩn trong hệ thống cá»§a bạn. +AboutDialog.8=Ok +AspectCode.0=Bắc +AspectCode.1=Äông-Bắc +AspectCode.2=Äông +AspectCode.3=Äông-Nam +AspectCode.4=Nam +AspectCode.5=Tây-Nam +AspectCode.6=Tây +AspectCode.7=Tây-Bắc +CollectEarthWindow.0=Lá»—i khi xuất dữ liệu sang file CSV +CollectEarthWindow.1=Lá»—i xuất dữ liệu +CollectEarthWindow.10=File +CollectEarthWindow.11=Thoát +CollectEarthWindow.12=Công cụ +CollectEarthWindow.13=Xuất dữ liệu ra CSV +CollectEarthWindow.14=Khởi động SAIKU Analysis +CollectEarthWindow.15=Thuá»™c tính +CollectEarthWindow.16=Trợ giúp +CollectEarthWindow.17=Thông tin công bố +CollectEarthWindow.18=Tìm ô thiếu trong cÆ¡ sở dữ liệu CollectEarthWindow.19=Collect Earth -CollectEarthWindow.2=Dil -CollectEarthWindow.20=Kopyalanan kayıt sayısı\: -CollectEarthWindow.21=Ana bilgisayar için simge bulunamadı -CollectEarthWindow.22=Collect Earth'ü kapatmak istediÄŸinizden emin misiniz?
Pencereyi kapatmanız durumunda Collect Earth sunucusunu da kapatır. -CollectEarthWindow.23=Onay gerekiyor -CollectEarthWindow.24=XML Dışa aktar -CollectEarthWindow.25=Mevcut verileriniz kaybolacak yine de bu kayıtları eklemek istiyor musunuz? -CollectEarthWindow.26=Operatör -CollectEarthWindow.27=Güncelle -CollectEarthWindow.28=Operatör, verileri değerlendirirken Open Foris Collect Earth sunucusu çalışmalıdır. -CollectEarthWindow.29=Saiku Sunucusu yapılandırılmadı. -CollectEarthWindow.3=İçe aktarma hatası -CollectEarthWindow.30=Lütfen Google Earth'ü kullanırken bu pencereyi açık tutun. -CollectEarthWindow.31=Toplanan verileri CSV dosyasına aktar -CollectEarthWindow.32=Vazgeç -CollectEarthWindow.33=Operatör adı 5 karakterden uzun ve 50 karakterden kısa olmalıdır -CollectEarthWindow.34=Doğrulama hatası -CollectEarthWindow.35=OPERATÖR ADI BOŞ\!
Lütfen operatör adını girin ve "Güncelle" düğmesine basın. -CollectEarthWindow.36=Operatör adı boş olamaz -CollectEarthWindow.37=Açık Tut -CollectEarthWindow.38=CSV dosyaları -CollectEarthWindow.39=DİKKAT\: Yeni verileri almadan önce mevcut verilerinizi (XML'e Aktar) yedeklemeniz önerilir. -CollectEarthWindow.4=FAO Yasal uyarı bildirimleri -CollectEarthWindow.40=Araçlar-> Özellikler-> Gelişmiş sekmesinde Saiku Sunucusunun kurulu olduğu klasörün yolunu ayarlayın. -CollectEarthWindow.41=Dışa aktarılan verileri dosyaya kaydet -CollectEarthWindow.42=Vazgeç -CollectEarthWindow.43=Yinelenen kayıtlar bulundu -CollectEarthWindow.44=Verileri İçe/Dışa aktar -CollectEarthWindow.45=Verileri XML'e aktar (Sıkıştırılmış) -CollectEarthWindow.46=Verileri ZIP'ten içe aktar (sıkıştırılmış XML) -CollectEarthWindow.55=CSV kullanarak mevcut kayıtları güncelle -CollectEarthWindow.47=Saiku Sunucusu yapılandırılmadı -CollectEarthWindow.48=Zip/collect-data dosyası -CollectEarthWindow.49=Fusion table CSV dosyası -CollectEarthWindow.5=Kapat -CollectEarthWindow.50=Kullanım Kılavuzunu Aç -CollectEarthWindow.51=Collect Earth güncellemelerini kontrol et -CollectEarthWindow.52=Uygulama Günlüğünü Aç -CollectEarthWindow.53=Collect Earth Günlüğü -CollectEarthWindow.54=Noktaları KML'den yükle -CollectEarthWindow.56=Hakkında... -CollectEarthWindow.57=Saiku başlatıcısı işlemi hala devam ediyor, lütfen bekleyin. -CollectEarthWindow.58=Saiku analysis başlatılamıyor -CollectEarthWindow.59=Saiku analizi için veri setini yeniden oluşturmak ister misiniz?
Bu iÅŸlem zaman alabilir.
"EVET" üzerine tıklarsanız, en son bilgileri içeren yeni bir veri seti oluşturulur. -CollectEarthWindow.6=Fusion Table'a aktar -CollectEarthWindow.60=Saiku veri üretimi -CollectEarthWindow.61=Verileri XML'e aktar (Son dışa aktarımdan bu yana değiştirilmiş kayıtlar) -CollectEarthWindow.62=Hakkında... -CollectEarthWindow.63=Noktalar KML'den alırken hata oluştu -CollectEarthWindow.64=Teknik Destek -CollectEarthWindow.7=Veri içe aktarılırken hata oluştu -CollectEarthWindow.8=Yasal uyarı metni bulunamadı -CollectEarthWindow.9=Alınan veriler veritabanında zaten mevcut olan kayıtları içerir. -CollectEarthWindow.65=Operatör adı değiştirildi -CollectEarthWindow.66=Operatör adı -CollectEarthWindow.70=Anket rehberini aç -DynamicsCode.0=Başlangıçta Orman -DynamicsCode.1=Başlangıçta Mera -DynamicsCode.2=Başlangıçta Yerleşim -DynamicsCode.3=Başlangıçta Diğer -DynamicsCode.4=Başlangıçta Sulak -DynamicsCode.5=Başlangıçta Tarım -OpenTextFileListener.0=Metin dosyası bulunamadı \: -OptionWizard.0=Collect Earth seçenekler -OptionWizard.1=Tarayıcı Seç -OptionWizard.10=Yedekleme klasörünü aç -OptionWizard.11=Blinmeyen\: yapılandırma kullanımı -OptionWizard.12=İstemci durumu -OptionWizard.13=Collect Earth Sunucu IP -OptionWizard.14=Collect Earth sunucu girişi (örn. 8023) -OptionWizard.15=Kaydet & Değişiklikleri uygula +CollectEarthWindow.2=Ngôn ngữ +CollectEarthWindow.20=Số bản ghi trùng\: +CollectEarthWindow.21=Không tìm thấy biểu tượng cho khung chính +CollectEarthWindow.22=Bạn có chắc là muốn đóng Collect Earth?
Äóng cá»­a sổ cÅ©ng đóng luôn máy chá»§ Collect Earth +CollectEarthWindow.23=Cần khẳng định +CollectEarthWindow.24=Xuất ra XML +CollectEarthWindow.25=Bạn có muốn thêm các bản ghi này và bá» Ä‘i dữ liệu hiện thá»i không? +CollectEarthWindow.26=Ngưá»i sá»­ dụng +CollectEarthWindow.27=Cập nhật +CollectEarthWindow.28=Máy chá»§ Open Foris Collect Earth phải chạy khi ngưá»i sá»­ dụng giải Ä‘oán dữ liệu. +CollectEarthWindow.29=Chưa xác định cấu hình cho Máy chá»§ Saiku. +CollectEarthWindow.3=\ Lá»—i nhập +CollectEarthWindow.30=Äể mở cá»­a sổ này khi Ä‘ang sá»­ dụng Google Earth. +CollectEarthWindow.31=Xuất dữ liệu đã thu thập sang file CSV +CollectEarthWindow.32=Thoát +CollectEarthWindow.33=Tên ngưá»i sá»­ dụng phải dài hÆ¡n 5 chữ cái và ngắn hÆ¡n 50 chữ cái +CollectEarthWindow.34=Lá»—i kiểm chứng +CollectEarthWindow.35=TÊN NGƯỜI SỬ DỤNG CÃ’N TRá»NG\!
Hãy Ä‘iá»n tên ngưá»i sá»­ dụng và nhắp phím "Update". +CollectEarthWindow.36=Không được để trống phần tên ngưá»i sá»­ dụng +CollectEarthWindow.37=Äể mở +CollectEarthWindow.38=file CSV +CollectEarthWindow.39=THÔNG BÃO\: Nên lưu dá»± phòng dữ liệu hiện thá»i(Xuất ra XML) trước khi nhập dữ liệu má»›i +CollectEarthWindow.4=Thông tin công bố cá»§a FAO +CollectEarthWindow.40=Thiết lập đưá»ng dẫn tá»›i thư mục cài đặt Saiku Server trong Tools->Properties->Advanced tab. +CollectEarthWindow.41=Ghi dữ liệu xuất ra vào file\: +CollectEarthWindow.42=Thoát +CollectEarthWindow.43=Tìm thấy bản ghi có mâu thuẫn +CollectEarthWindow.44=Nhập/Xuất dữ liệu +CollectEarthWindow.45=Xuất dữ liệu ra XML (nén) +CollectEarthWindow.46=Nhập dữ liệu má»›i từ file ZIP (XML nén) +CollectEarthWindow.55=Cập nhật các bản ghi hiện thá»i bằng CSV +CollectEarthWindow.47=Chưa định cấu hình cho Saiku Server +CollectEarthWindow.48=Zip/collect-data files +CollectEarthWindow.49=Files CSV tổng hợp +CollectEarthWindow.5=Äóng +CollectEarthWindow.50=Mở hướng dẫn ngưá»i sá»­ dụng +CollectEarthWindow.51=Kiểm tra cập nhật cá»§a Collect Earth +CollectEarthWindow.52=Mở file nhật ký ứng dụng +CollectEarthWindow.53=File nhật ký cá»§a Collect Earth +CollectEarthWindow.54=Nạp các Ä‘iểm từ KML +CollectEarthWindow.56=Vá»... +CollectEarthWindow.57=Äang chạy quá trình khởi động Saiku, xin đợi. +CollectEarthWindow.58=Không thể khởi động Saiku analysis +CollectEarthWindow.59=Bạn có muốn tạo lại bá»™ dữ liệu cho Saiku analysis không?
Quá trình này sẽ mất một vài phút.
Nếu bạn chá»n "YES" sẽ tạo ra má»™t bá»™ dữ liệu má»›i vá»›i các thông tin cập nhật nhất. +CollectEarthWindow.6=Xuất ra bảng tổng hợp +CollectEarthWindow.60=Tạo dữ liệu Saiku +CollectEarthWindow.61=Xuất dữ liệu ra XML (các bản ghi chỉnh sá»­a từ lần xuất trước) +CollectEarthWindow.62=Vá»... +CollectEarthWindow.63=Lá»—i khi nạp Ä‘iểm từ KML +CollectEarthWindow.64=Há»— trợ kỹ thuật +CollectEarthWindow.7=Lá»—i khi nhập dữ liệu +CollectEarthWindow.8=Không tìm thấy văn bản thông báo +CollectEarthWindow.9=Dữ liệu nhập vào có chứa các bản ghi đã có trong cÆ¡ sở dữ liệu cá»§a bạn. +DynamicsCode.0=Ban đầu là rừng +DynamicsCode.1=Ban đầu là trảng cá» +DynamicsCode.2=Ban đầu là khu dân cư +DynamicsCode.3=Ban đầu là đất khác +DynamicsCode.4=Ban đầu là đất ngập nước +DynamicsCode.5=Ban đầu là đất trồng trá»t +OpenTextFileListener.0=không tìm thấy file văn bản tại\: +OptionWizard.0=Các lá»±a chá»n cá»§a Collect Earth +OptionWizard.1=Chá»n Browser +OptionWizard.10=Mở thư mục lưu dá»± phòng +OptionWizard.11=Không biết\: hãy sá»­ dụng ifconfig +OptionWizard.12=Vi dụ cá»§a khác +OptionWizard.13=Äịa chỉ IP cá»§a máy chá»§ Collect Earth +OptionWizard.14=Cổng máy chá»§ Collect Earth (vd\: 8023) +OptionWizard.15=Ghi và áo dụng thay đổi OptionWizard.16=ID -OptionWizard.17=X-coord -OptionWizard.18=Y-coord -OptionWizard.19=Yükseklik -OptionWizard.2=İş akışı (sunucu/istemci) -OptionWizard.20=Google Earth içerikleri deÄŸiÅŸtirildi.
Lütfen Google Earth tarafından istendiğinde içeriğin yeniden yüklenmesini kabul edin. -OptionWizard.21=Güncelleme başarılı -OptionWizard.22=Eğim -OptionWizard.23=Google Earth verilerini yeniden açarken bir hata oluştu -OptionWizard.24=İptal -OptionWizard.25=İşlem Modu -OptionWizard.26=DB host -OptionWizard.27=Bu tanınmış bir Saiku klasörü değil ( start-saiku.bat dosyası mevcut değil) -OptionWizard.28=Saiku Sunucusu tanınmadı -OptionWizard.29=DB port -OptionWizard.3=Sunucu örneği -OptionWizard.30=SQLite seçenekleri -OptionWizard.31=Örnek veri -OptionWizard.32=Plot düzeni -OptionWizard.33=Anket Tanımı -OptionWizard.34=Gelişmiş -OptionWizard.35=Kontrol noktası sayısı -OptionWizard.36=Kontrol noktaları arasındaki mesafe (metre cinsinden) -OptionWizard.37=Plot kenarı ile mesafesi (metre cinsinden) -OptionWizard.38=CSV / CED dosyası doğru okunamıyor.
Dosyanın böyle bir virgülle ayrılmış değerlere sahip olması beklenir \:
-OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect -OptionWizard.4=Geçerli bilgisayar IP'si \: -OptionWizard.40=Projeler -OptionWizard.41=Yeni bir proje dosyası yükle -OptionWizard.42=CSV okuyucuyu kapatırken hata oluÅŸtu -OptionWizard.43=Anketin adı -OptionWizard.44=veritabanını otomatik olarak yedekle -OptionWizard.45=Earth Engine plot alanına yakınlaÅŸtırarak aç -OptionWizard.46=Plot alanı için Earth Engine Timelapse'yi aç -OptionWizard.47=Plot alanı için Bing Maps'i aç -OptionWizard.48=Formu Google Earth yerine bir tarayıcıda aç (LINUX için önerilir) -OptionWizard.49=Plot verisini içeren ced / csv dosyasının yolu -OptionWizard.5=Collect Earth Sunucu giriÅŸi\: -OptionWizard.50=Tarayıcı... -OptionWizard.51=Proje dosyası içe aktarılırken hata oluÅŸtu -OptionWizard.52=Yalnızca koordinatlara sahip CSV / CED dosyası -OptionWizard.53=Puan yok -OptionWizard.54=Merkez noktası -OptionWizard.55=Proje dosyası içe aktarılırken hata oluÅŸtu -OptionWizard.56=Proje yükle -OptionWizard.57=Önceden yüklenmiÅŸ projeler -OptionWizard.58=GEE Kod Düzenleyicisini açın (Güvenilir Test Cihazı eriÅŸimi gerektirir) -OptionWizard.59=Plot üzerinde Here Maps'i aç -OptionWizard.6=PostgreSQL DB parametreleri -OptionWizard.65=Saiku klasör yolu -OptionWizard.66=Tarayıcı... -OptionWizard.67=Firefox kısayol yolu -OptionWizard.68=Tarayıcı... -OptionWizard.7=Kullanıcı adı -OptionWizard.70=Kısayol dosyaları -OptionWizard.72=İkili dosyalar -OptionWizard.73=Chrome kısayol yolu -OptionWizard.74=Tarayıcı... -OptionWizard.76=Kısayol dosyaları -OptionWizard.78=İkili dosyalar -OptionWizard.79=KML iÅŸaretçi ÅŸablonu yolu -OptionWizard.8=Parola -OptionWizard.80=Tarayıcı... -OptionWizard.82=İşaretçi ÅŸablonu -OptionWizard.83=Form tasarımının HTML balon yolu -OptionWizard.84=Tarayıcı... -OptionWizard.86=HTML web sayfası -OptionWizard.87=IDM tanımıyla XML yolu -OptionWizard.88=Tarayıcı... -OptionWizard.9=DB Adı -OptionWizard.90=XML IDM tanımlama -OptionWizard.91=Sunucu (yönetici sürümü veya tek başına kullanım) -OptionWizard.92=İstemci (operatör/sunucuya baÄŸlı) -OptionWizard.93=SQLite (Gömülü / tek dosya tabanlı) +OptionWizard.17=Tá»a độ X +OptionWizard.18=Tá»a độ Y +OptionWizard.19=Äá»™ cao +OptionWizard.2=Dòng công tác (máy chá»§/khách) +OptionWizard.20=Ná»™i dung cá»§a Google Earth đã thay đổi.
Äá» nghị chấp nhận tải lại ná»™i dung khi Google Earth gợi ý. +OptionWizard.21=Cập nhật thành công +OptionWizard.22=Dốc +OptionWizard.23=Có lá»—i khi mở lại dữ liệu Google Earth +OptionWizard.24=Há»§y +OptionWizard.25=Mode vận hành +OptionWizard.26=NÆ¡i lưu cÆ¡ sở dữ liệu +OptionWizard.27=Äây không phải là thư mục Saiku (hiện không có file start-saiku.bat) +OptionWizard.28=Không nhận được máy chá»§ Saiku +OptionWizard.29=Cổng cÆ¡ sở dữ liệu +OptionWizard.3=Ví dụ cá»§a máy chá»§ +OptionWizard.30=Các lá»±a chá»n cá»§a SQLite +OptionWizard.31=Dữ liệu mẫu +OptionWizard.32=SÆ¡ đồ mẫu +OptionWizard.33=Äịnh nghÄ©a khảo sát +OptionWizard.34=Nâng cao +OptionWizard.35=Số Ä‘iểm mẫu +OptionWizard.36=Khoảng cách giữa các Ä‘iểm mẫu (tính theo mét) +OptionWizard.37=Lá» vá»›i biên ô (tính theo mét) +OptionWizard.38=Không Ä‘á»c được đúng file CSV/CED.
Cần có dấu phảy để phân tách giá trị giống như sau \:
+OptionWizard.39=ID,Tá»a độ Y,tá»a độ X,độ cao,độ dốc,tá»· lệ +OptionWizard.4=Äịa chỉ IP hiện tại cá»§a máy tính\: +OptionWizard.40=Các project +OptionWizard.41=tải file project má»›i +OptionWizard.42=Lá»—i khi đóng CSV reader +OptionWizard.43=Tên khảo sát +OptionWizard.44=tá»± động lưu dá»± phòng dữ liệu tại +OptionWizard.45=Mở Earth Engine để phóng to vào khu vá»±c ô +OptionWizard.46=Mở Earth Engine timelapse cho khu vá»±c ô +OptionWizard.47=Mở Bing Maps cho khu vá»±c ô +OptionWizard.48=Mở form trên browser thay vì mở Google Earth (khuyến cáo cho LINUX) +OptionWizard.49=ÄÆ°á»ng dẫn tá»›i file ced/csv file vá»›i dữ liệu ô +OptionWizard.5=Cổng máy chá»§ Collect Earth\: +OptionWizard.50=Browse... +OptionWizard.51=Lá»—i nhập file project +OptionWizard.52=File CSV/CED chỉ có tá»a độ +OptionWizard.53=Ô vuông +OptionWizard.54=Äiểm trung tâm +OptionWizard.55=Lá»—i khi nhập thư mục project +OptionWizard.56=Tải project +OptionWizard.57=Các project đã tải +OptionWizard.58=Mở GEE Code Editor (cần phải có quyá»n truy cập Trusted Tester) +OptionWizard.59=Mở Here Maps tập trung vào ô +OptionWizard.6=Các thông số cá»§a CSDL PostgreSQL +OptionWizard.65=ÄÆ°á»ng dẫn tá»›i thư mục Saiku +OptionWizard.66=Browse... +OptionWizard.67=ÄÆ°á»ng dẫn tá»›i Firefox executable (file exe) +OptionWizard.68=Browse... +OptionWizard.7=Tên ngưá»i sá»­ dụng +OptionWizard.70=File chạy +OptionWizard.72=File nhị phân +OptionWizard.73=ÄÆ°á»ng dẫn tá»›i Chrome executable (file exe) +OptionWizard.74=Browse... +OptionWizard.76=File exe +OptionWizard.78=File nhị phân +OptionWizard.79=ÄÆ°á»ng dẫn tá»›i KML Freemarker template +OptionWizard.8=Mật khẩu +OptionWizard.80=Browse... +OptionWizard.82=Freemarker template +OptionWizard.83=ÄÆ°á»ng dẫn tá»›i mẫu thiết kế HTML Balloon +OptionWizard.84=Browse... +OptionWizard.86=HTML webpage +OptionWizard.87=ÄÆ°á»ng dẫn tá»›i XML vá»›i định nghÄ©a IDM +OptionWizard.88=Browse... +OptionWizard.9=Tên CSDL +OptionWizard.90=Äịnh nghÄ©a XML IDM +OptionWizard.91=Máy chá»§ (phiên bản quản lý hoặc sá»­ dụng độc lập) +OptionWizard.92=Khách (ngưá»i sá»­ dụng/kết nối vá»›i máy chá»§) +OptionWizard.93=SQLite (tích hợp/file đơn lẻ) OptionWizard.94=PostgreSQL -OptionWizard.95=Örnekleme noktalarının kenarı (metre olarak) -SaikuAnalysisListener.0=Evet - Saiku verilerini yenile (uzun iÅŸlem) -SaikuAnalysisListener.1=Hayır - Sadece Saiku'yu baÅŸlat -SaikuStarter.1=Saiku baÅŸlatılıyor -SaikuStarter.2=Saiku baÅŸlatılıyor birkaç dakika sürebilir, lütfen bekleyin \! -SaveEarthDataServlet.0=BoÅŸ istek -SaveEarthDataServlet.1=Veriyi veritabanına kaydederken sorun oluÅŸtu -SaveEarthDataServlet.2=Veri kaydedildi -SlopeCode.0=Düz (0-5) -EarthApp.11=Collect Earth zaten çalışıyor -EarthApp.21=Plotlara ait seçili CSV/CED grid dosyası bulunamadı \:
-EarthApp.23=CSV/CED dosyası ayarlanmadı \:

-EarthApp.24=İşaretçi şablonunu KML tanımına sahip dosya seçili yolda bulunamadı \:
-EarthApp.26=KML tanım dosyası ayarlanmadı \:

-EarthApp.27=HTML balon formunu içeren dosya seçili yolda bulunamadı \:
-EarthApp.29=Hiçbir HTML balon dosyası oluşturulmadı \:

-EarthApp.3=Daha Sonra Hatırlat -EarthApp.30=Lütfen Araçlar-> Özellikler menüsünden dosya konumunu düzeltin.. -EarthApp.4=Şimdi Güncelle -EarthApp.5=Tekrar hatırlatma -EarthApp.57=Collect Earth'ün yeni bir sürümü var\!
Nasıl devam etmek istiyorsun? -EarthApp.58=Güncelleme uyarısı -EarthApp.59=Proje dosyasını içe aktarırken hata oluştu -EarthApp.6=\ - Versiyon -EarthApp.61=Collect Earth dosyası açılamadı.
Lütfen Google Earth’ün kurulu olduÄŸundan emin olun. -EarthSurveyService.9=Alan gerekli -ExportActionListener.1=Kayıtların GönderileceÄŸi Tarihi Seç -ExportDialogProcessMonitor.0=Veri iÅŸleniyor... -ExportDialogProcessMonitor.1=İşlemi baÅŸlatmak için bekleniyor \: -ExportDialogProcessMonitor.4=Dışa aktarılan kayıtlar \: -ImportProcessMonitorDialog.0=İçe aktarılan kayıtlar \: -ImportActionListener.0=Doldurulmamış plotlar içe aktarılsın mı? -ImportActionListener.2=EÄŸer tıklarsanız NO sadece tüm verileri içeren "yeÅŸil" durumdaki plotlar içe aktarılacaktır. -ImportActionListener.3=BitmemiÅŸ kayıtları içe aktar -ImportDialogProcessMonitor.0=\ HESAPLANIYOR -ImportDialogProcessMonitor.11=İlk kayıt sayısı \: -ImportDialogProcessMonitor.2=Kayıtlar içe aktarılıyor... -ImportDialogProcessMonitor.5=Güncel içe aktarılan kayıt sayısı \: -ImportDialogProcessMonitor.8=Veri iÅŸleniyor... -InfiniteProgressMonitor.0=İşlemi iptal et -JFileChooserExistsAware.0=Collect Earth Proje dosya -KmlImportService.13=Konumları kaydetmek için CSV dosyası seçin -MissingPlotsListener.0=Veritabanında bulunmayan plotlar hakkında bilgi alınırken hata oluÅŸtu -MissingPlotsListener.1=Eksik plotlar -MissingPlotsListener.10=Örnekleme tasarımındaki toplam plotların sayısı \: -MissingPlotsListener.12=Eksik plotların sayısı \: -MissingPlotsListener.14=Bütün plotlar dolu\! -MissingPlotsListener.2=İçeriÄŸi panoya kopyala -MissingPlotsListener.3=Tüm verilerin doldurulup doldurulmadığını öğrenmek istediÄŸiniz plot bilgilerini (.csv veya .ced dosyaları) içeren dosyaları seçin. -MissingPlotsListener.4=Eksik plotlar - Bilgi -MissingPlotsListener.5=Dosyadan \: -MissingPlotsListener.6=CED dosyasına aktar -ProcessMonitorDialog.1=Satır numarasında ayrıştırma hatası -ProcessMonitorDialog.4=, sütunlar -ProcessMonitorDialog.5=\ -- deÄŸerler - -ImportXMLDialogProcessMonitor.1 = Verilerin üzerine yaz -ImportXMLDialogProcessMonitor.2 = Sadece yinelenmeyen plotları içe aktar - -YES=Evet -YES_TO_ALL=Tümüne evet -NO=Hayır -NO_TO_ALL=Tümüne hayır - -CollectEarthMenu.0=CEP dosyasını içe aktar -CollectEarthMenu.2=Hizmetler -CollectEarthMenu.3=Büyük CSV plot dosyalarını böl -CollectEarthMenu.4=Verileri XML'e aktar (belirli bir tarihten itibaren) -CollectEarthMenu.5=Collect yedeÄŸi için dışa aktar -CollectEarthMenu.6=Collect Backup verilerini dışa aktar (tüm veriler) -CollectEarthMenu.7=Collect Backup verilerini dışa aktar (belirli bir tarihten itibaren) -CollectEarthMenu.8=Verileri XML'e aktar (özet özniteliÄŸine göre filtrele) \ No newline at end of file +SaikuAnalysisListener.0=Yes - Làm má»›i lại dữ liệu Saiku (quá trình dài) +SaikuAnalysisListener.1=No - chỉ khởi động Saiku +SaikuStarter.1=Khởi động Saiku +SaikuStarter.2=Cần vài phút để khởi động Saiku, xin đợi\! +SaveEarthDataServlet.0=Yêu cầu trống +SaveEarthDataServlet.1=Có trục trặc khi ghi dữ liệu vào CSDL +SaveEarthDataServlet.2=Dữ liệu đã được ghi +SlopeCode.0=Bằng phẳng (0-5) +EarthApp.11=Collect Earth Ä‘ang chạy +EarthApp.21=Không tìm thấy file chứa lưới ô trong đưá»ng dẫn đã chá»n \:
+EarthApp.23=Chưa thiết lập file CSV/CED \:

+EarthApp.24=Không tìm thấy file chứa Freemarker template vá»›i định nghÄ©a KML trong đưá»ng dẫn đã chá»n\:
+EarthApp.26=Chưa thiết lập file định nghĩa KML d\:

+EarthApp.27=Không tìm thấy file chứa mẫu HTML balloon trong đưá»ng dẫn đã chá»n\:
+EarthApp.29=Chưa thiết lập file HTML balloon \:

+EarthApp.3=Nhắc nhở sau +EarthApp.30=Xin hãy Ä‘iá»u chỉnh đúng địa chỉ file trong Tools->Properties menu. +EarthApp.4=Cập nhật luôn +EarthApp.5=Không nhắc nữa +EarthApp.57=Äã có phiên bản má»›i cá»§a Collect Earth\!
Bạn muốn làm tiếp như thế nào? +EarthApp.58=Thông báo cập nhật +EarthApp.59=Lỗi khi nhập file project +EarthApp.6=\ - Phiên bản +EarthApp.61=Không mở được file Collect Earth.
Äá» nghị đảm bảo đã cài đặt Google Earth. +EarthSurveyService.9=Trưá»ng bắt buá»™c +ExportActionListener.1=Chá»n ngày xuất bản ghi +ExportDialogProcessMonitor.0=Äang xá»­ lý dữ liệu... +ExportDialogProcessMonitor.1=Äang đợi khởi động quá trình\: +ExportDialogProcessMonitor.4=Các bản ghi đã xuất\: +ImportProcessMonitorDialog.0=Các bản ghi đã nhập\: +ImportActionListener.0=Có nhập dữ liệu các ô chưa được Ä‘iá»n đầy đủ không? +ImportActionListener.2=Nếu bạn chá»n NO sẽ chỉ nhập dữ liệu cá»§a các ô có trạng thái màu "xanh lá cây", các ô đã có đầy đủ dữ liệu. +ImportActionListener.3=Nhập các bản ghi chưa hoàn tất +ImportDialogProcessMonitor.0=\ ÄANG TÃNH TOÃN +ImportDialogProcessMonitor.11=Số lượng ban đầu các bản ghi\: +ImportDialogProcessMonitor.2=Äang nhập các bản ghi... +ImportDialogProcessMonitor.5=Số lượng thá»±c tế các bản ghi đã nhập\: +ImportDialogProcessMonitor.8=Äang xá»­ lý dữ liệu... +InfiniteProgressMonitor.0=Há»§y lệnh +JFileChooserExistsAware.0=File project cá»§a Collect Earth +KmlImportService.13=Chá»n file CSV file để ghi địa Ä‘iểm cá»§a ô vào +MissingPlotsListener.0=Lá»—i khi lấy thông tin vỠô không có trong CSDL +MissingPlotsListener.1=Các ô thiếu +MissingPlotsListener.10=Tổng số ô trong thiết kế chá»n mẫu \: +MissingPlotsListener.12=Số ô thiếu\: +MissingPlotsListener.14=Äã Ä‘iá»n tất cả các ô\! +MissingPlotsListener.2=Sao chép ná»™i dung vào bàn phím +MissingPlotsListener.3=Lá»±a chá»n file có chứa thông tin ô ( file .csv hoặc .ced ) mà bạn muốn biết đã Ä‘iá»n đủ dữ liệu chưa. +MissingPlotsListener.4=Các ô thiếu - thông tin +MissingPlotsListener.5=Từ file \: +MissingPlotsListener.6=Xuất ra file CED +ProcessMonitorDialog.1=Tìm lá»—i trên số dòng +ProcessMonitorDialog.4=, cá»™t +ProcessMonitorDialog.5=\ -- giá trị From 893c7944213a114a8a678ead36aedfd8daa933f0 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:36:49 +0100 Subject: [PATCH 0822/1620] New translations utf8_orig_Messages_hi.properties (French) --- .../earth/app/view/Messages_fr.properties | 446 +++++++++--------- 1 file changed, 225 insertions(+), 221 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 5110140e9c..f0355142d0 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,221 +1,225 @@ -AboutDialog.19=Äã có lá»—i -AboutDialog.5=Truy cập website cá»§a chúng tôi để biết thêm thông tin OpenForis.org -AboutDialog.6=Xin lá»—i, đã có sá»± cố khi mở link trong brower chuẩn trong hệ thống cá»§a bạn. -AboutDialog.8=Ok -AspectCode.0=Bắc -AspectCode.1=Äông-Bắc -AspectCode.2=Äông -AspectCode.3=Äông-Nam -AspectCode.4=Nam -AspectCode.5=Tây-Nam -AspectCode.6=Tây -AspectCode.7=Tây-Bắc -CollectEarthWindow.0=Lá»—i khi xuất dữ liệu sang file CSV -CollectEarthWindow.1=Lá»—i xuất dữ liệu -CollectEarthWindow.10=File -CollectEarthWindow.11=Thoát -CollectEarthWindow.12=Công cụ -CollectEarthWindow.13=Xuất dữ liệu ra CSV -CollectEarthWindow.14=Khởi động SAIKU Analysis -CollectEarthWindow.15=Thuá»™c tính -CollectEarthWindow.16=Trợ giúp -CollectEarthWindow.17=Thông tin công bố -CollectEarthWindow.18=Tìm ô thiếu trong cÆ¡ sở dữ liệu -CollectEarthWindow.19=Collect Earth -CollectEarthWindow.2=Ngôn ngữ -CollectEarthWindow.20=Số bản ghi trùng\: -CollectEarthWindow.21=Không tìm thấy biểu tượng cho khung chính -CollectEarthWindow.22=Bạn có chắc là muốn đóng Collect Earth?
Äóng cá»­a sổ cÅ©ng đóng luôn máy chá»§ Collect Earth -CollectEarthWindow.23=Cần khẳng định -CollectEarthWindow.24=Xuất ra XML -CollectEarthWindow.25=Bạn có muốn thêm các bản ghi này và bá» Ä‘i dữ liệu hiện thá»i không? -CollectEarthWindow.26=Ngưá»i sá»­ dụng -CollectEarthWindow.27=Cập nhật -CollectEarthWindow.28=Máy chá»§ Open Foris Collect Earth phải chạy khi ngưá»i sá»­ dụng giải Ä‘oán dữ liệu. -CollectEarthWindow.29=Chưa xác định cấu hình cho Máy chá»§ Saiku. -CollectEarthWindow.3=\ Lá»—i nhập -CollectEarthWindow.30=Äể mở cá»­a sổ này khi Ä‘ang sá»­ dụng Google Earth. -CollectEarthWindow.31=Xuất dữ liệu đã thu thập sang file CSV -CollectEarthWindow.32=Thoát -CollectEarthWindow.33=Tên ngưá»i sá»­ dụng phải dài hÆ¡n 5 chữ cái và ngắn hÆ¡n 50 chữ cái -CollectEarthWindow.34=Lá»—i kiểm chứng -CollectEarthWindow.35=TÊN NGƯỜI SỬ DỤNG CÃ’N TRá»NG\!
Hãy Ä‘iá»n tên ngưá»i sá»­ dụng và nhắp phím "Update". -CollectEarthWindow.36=Không được để trống phần tên ngưá»i sá»­ dụng -CollectEarthWindow.37=Äể mở -CollectEarthWindow.38=file CSV -CollectEarthWindow.39=THÔNG BÃO\: Nên lưu dá»± phòng dữ liệu hiện thá»i(Xuất ra XML) trước khi nhập dữ liệu má»›i -CollectEarthWindow.4=Thông tin công bố cá»§a FAO -CollectEarthWindow.40=Thiết lập đưá»ng dẫn tá»›i thư mục cài đặt Saiku Server trong Tools->Properties->Advanced tab. -CollectEarthWindow.41=Ghi dữ liệu xuất ra vào file\: -CollectEarthWindow.42=Thoát -CollectEarthWindow.43=Tìm thấy bản ghi có mâu thuẫn -CollectEarthWindow.44=Nhập/Xuất dữ liệu -CollectEarthWindow.45=Xuất dữ liệu ra XML (nén) -CollectEarthWindow.46=Nhập dữ liệu má»›i từ file ZIP (XML nén) -CollectEarthWindow.55=Cập nhật các bản ghi hiện thá»i bằng CSV -CollectEarthWindow.47=Chưa định cấu hình cho Saiku Server -CollectEarthWindow.48=Zip/collect-data files -CollectEarthWindow.49=Files CSV tổng hợp -CollectEarthWindow.5=Äóng -CollectEarthWindow.50=Mở hướng dẫn ngưá»i sá»­ dụng -CollectEarthWindow.51=Kiểm tra cập nhật cá»§a Collect Earth -CollectEarthWindow.52=Mở file nhật ký ứng dụng -CollectEarthWindow.53=File nhật ký cá»§a Collect Earth -CollectEarthWindow.54=Nạp các Ä‘iểm từ KML -CollectEarthWindow.56=Vá»... -CollectEarthWindow.57=Äang chạy quá trình khởi động Saiku, xin đợi. -CollectEarthWindow.58=Không thể khởi động Saiku analysis -CollectEarthWindow.59=Bạn có muốn tạo lại bá»™ dữ liệu cho Saiku analysis không?
Quá trình này sẽ mất một vài phút.
Nếu bạn chá»n "YES" sẽ tạo ra má»™t bá»™ dữ liệu má»›i vá»›i các thông tin cập nhật nhất. -CollectEarthWindow.6=Xuất ra bảng tổng hợp -CollectEarthWindow.60=Tạo dữ liệu Saiku -CollectEarthWindow.61=Xuất dữ liệu ra XML (các bản ghi chỉnh sá»­a từ lần xuất trước) -CollectEarthWindow.62=Vá»... -CollectEarthWindow.63=Lá»—i khi nạp Ä‘iểm từ KML -CollectEarthWindow.64=Há»— trợ kỹ thuật -CollectEarthWindow.7=Lá»—i khi nhập dữ liệu -CollectEarthWindow.8=Không tìm thấy văn bản thông báo -CollectEarthWindow.9=Dữ liệu nhập vào có chứa các bản ghi đã có trong cÆ¡ sở dữ liệu cá»§a bạn. -DynamicsCode.0=Ban đầu là rừng -DynamicsCode.1=Ban đầu là trảng cá» -DynamicsCode.2=Ban đầu là khu dân cư -DynamicsCode.3=Ban đầu là đất khác -DynamicsCode.4=Ban đầu là đất ngập nước -DynamicsCode.5=Ban đầu là đất trồng trá»t -OpenTextFileListener.0=không tìm thấy file văn bản tại\: -OptionWizard.0=Các lá»±a chá»n cá»§a Collect Earth -OptionWizard.1=Chá»n Browser -OptionWizard.10=Mở thư mục lưu dá»± phòng -OptionWizard.11=Không biết\: hãy sá»­ dụng ifconfig -OptionWizard.12=Vi dụ cá»§a khác -OptionWizard.13=Äịa chỉ IP cá»§a máy chá»§ Collect Earth -OptionWizard.14=Cổng máy chá»§ Collect Earth (vd\: 8023) -OptionWizard.15=Ghi và áo dụng thay đổi -OptionWizard.16=ID -OptionWizard.17=Tá»a độ X -OptionWizard.18=Tá»a độ Y -OptionWizard.19=Äá»™ cao -OptionWizard.2=Dòng công tác (máy chá»§/khách) -OptionWizard.20=Ná»™i dung cá»§a Google Earth đã thay đổi.
Äá» nghị chấp nhận tải lại ná»™i dung khi Google Earth gợi ý. -OptionWizard.21=Cập nhật thành công -OptionWizard.22=Dốc -OptionWizard.23=Có lá»—i khi mở lại dữ liệu Google Earth -OptionWizard.24=Há»§y -OptionWizard.25=Mode vận hành -OptionWizard.26=NÆ¡i lưu cÆ¡ sở dữ liệu -OptionWizard.27=Äây không phải là thư mục Saiku (hiện không có file start-saiku.bat) -OptionWizard.28=Không nhận được máy chá»§ Saiku -OptionWizard.29=Cổng cÆ¡ sở dữ liệu -OptionWizard.3=Ví dụ cá»§a máy chá»§ -OptionWizard.30=Các lá»±a chá»n cá»§a SQLite -OptionWizard.31=Dữ liệu mẫu -OptionWizard.32=SÆ¡ đồ mẫu -OptionWizard.33=Äịnh nghÄ©a khảo sát -OptionWizard.34=Nâng cao -OptionWizard.35=Số Ä‘iểm mẫu -OptionWizard.36=Khoảng cách giữa các Ä‘iểm mẫu (tính theo mét) -OptionWizard.37=Lá» vá»›i biên ô (tính theo mét) -OptionWizard.38=Không Ä‘á»c được đúng file CSV/CED.
Cần có dấu phảy để phân tách giá trị giống như sau \:
-OptionWizard.39=ID,Tá»a độ Y,tá»a độ X,độ cao,độ dốc,tá»· lệ -OptionWizard.4=Äịa chỉ IP hiện tại cá»§a máy tính\: -OptionWizard.40=Các project -OptionWizard.41=tải file project má»›i -OptionWizard.42=Lá»—i khi đóng CSV reader -OptionWizard.43=Tên khảo sát -OptionWizard.44=tá»± động lưu dá»± phòng dữ liệu tại -OptionWizard.45=Mở Earth Engine để phóng to vào khu vá»±c ô -OptionWizard.46=Mở Earth Engine timelapse cho khu vá»±c ô -OptionWizard.47=Mở Bing Maps cho khu vá»±c ô -OptionWizard.48=Mở form trên browser thay vì mở Google Earth (khuyến cáo cho LINUX) -OptionWizard.49=ÄÆ°á»ng dẫn tá»›i file ced/csv file vá»›i dữ liệu ô -OptionWizard.5=Cổng máy chá»§ Collect Earth\: -OptionWizard.50=Browse... -OptionWizard.51=Lá»—i nhập file project -OptionWizard.52=File CSV/CED chỉ có tá»a độ -OptionWizard.53=Ô vuông -OptionWizard.54=Äiểm trung tâm -OptionWizard.55=Lá»—i khi nhập thư mục project -OptionWizard.56=Tải project -OptionWizard.57=Các project đã tải -OptionWizard.58=Mở GEE Code Editor (cần phải có quyá»n truy cập Trusted Tester) -OptionWizard.59=Mở Here Maps tập trung vào ô -OptionWizard.6=Các thông số cá»§a CSDL PostgreSQL -OptionWizard.65=ÄÆ°á»ng dẫn tá»›i thư mục Saiku -OptionWizard.66=Browse... -OptionWizard.67=ÄÆ°á»ng dẫn tá»›i Firefox executable (file exe) -OptionWizard.68=Browse... -OptionWizard.7=Tên ngưá»i sá»­ dụng -OptionWizard.70=File chạy -OptionWizard.72=File nhị phân -OptionWizard.73=ÄÆ°á»ng dẫn tá»›i Chrome executable (file exe) -OptionWizard.74=Browse... -OptionWizard.76=File exe -OptionWizard.78=File nhị phân -OptionWizard.79=ÄÆ°á»ng dẫn tá»›i KML Freemarker template -OptionWizard.8=Mật khẩu -OptionWizard.80=Browse... -OptionWizard.82=Freemarker template -OptionWizard.83=ÄÆ°á»ng dẫn tá»›i mẫu thiết kế HTML Balloon -OptionWizard.84=Browse... -OptionWizard.86=HTML webpage -OptionWizard.87=ÄÆ°á»ng dẫn tá»›i XML vá»›i định nghÄ©a IDM -OptionWizard.88=Browse... -OptionWizard.9=Tên CSDL -OptionWizard.90=Äịnh nghÄ©a XML IDM -OptionWizard.91=Máy chá»§ (phiên bản quản lý hoặc sá»­ dụng độc lập) -OptionWizard.92=Khách (ngưá»i sá»­ dụng/kết nối vá»›i máy chá»§) -OptionWizard.93=SQLite (tích hợp/file đơn lẻ) -OptionWizard.94=PostgreSQL -SaikuAnalysisListener.0=Yes - Làm má»›i lại dữ liệu Saiku (quá trình dài) -SaikuAnalysisListener.1=No - chỉ khởi động Saiku -SaikuStarter.1=Khởi động Saiku -SaikuStarter.2=Cần vài phút để khởi động Saiku, xin đợi\! -SaveEarthDataServlet.0=Yêu cầu trống -SaveEarthDataServlet.1=Có trục trặc khi ghi dữ liệu vào CSDL -SaveEarthDataServlet.2=Dữ liệu đã được ghi -SlopeCode.0=Bằng phẳng (0-5) -EarthApp.11=Collect Earth Ä‘ang chạy -EarthApp.21=Không tìm thấy file chứa lưới ô trong đưá»ng dẫn đã chá»n \:
-EarthApp.23=Chưa thiết lập file CSV/CED \:

-EarthApp.24=Không tìm thấy file chứa Freemarker template vá»›i định nghÄ©a KML trong đưá»ng dẫn đã chá»n\:
-EarthApp.26=Chưa thiết lập file định nghĩa KML d\:

-EarthApp.27=Không tìm thấy file chứa mẫu HTML balloon trong đưá»ng dẫn đã chá»n\:
-EarthApp.29=Chưa thiết lập file HTML balloon \:

-EarthApp.3=Nhắc nhở sau -EarthApp.30=Xin hãy Ä‘iá»u chỉnh đúng địa chỉ file trong Tools->Properties menu. -EarthApp.4=Cập nhật luôn -EarthApp.5=Không nhắc nữa -EarthApp.57=Äã có phiên bản má»›i cá»§a Collect Earth\!
Bạn muốn làm tiếp như thế nào? -EarthApp.58=Thông báo cập nhật -EarthApp.59=Lỗi khi nhập file project -EarthApp.6=\ - Phiên bản -EarthApp.61=Không mở được file Collect Earth.
Äá» nghị đảm bảo đã cài đặt Google Earth. -EarthSurveyService.9=Trưá»ng bắt buá»™c -ExportActionListener.1=Chá»n ngày xuất bản ghi -ExportDialogProcessMonitor.0=Äang xá»­ lý dữ liệu... -ExportDialogProcessMonitor.1=Äang đợi khởi động quá trình\: -ExportDialogProcessMonitor.4=Các bản ghi đã xuất\: -ImportProcessMonitorDialog.0=Các bản ghi đã nhập\: -ImportActionListener.0=Có nhập dữ liệu các ô chưa được Ä‘iá»n đầy đủ không? -ImportActionListener.2=Nếu bạn chá»n NO sẽ chỉ nhập dữ liệu cá»§a các ô có trạng thái màu "xanh lá cây", các ô đã có đầy đủ dữ liệu. -ImportActionListener.3=Nhập các bản ghi chưa hoàn tất -ImportDialogProcessMonitor.0=\ ÄANG TÃNH TOÃN -ImportDialogProcessMonitor.11=Số lượng ban đầu các bản ghi\: -ImportDialogProcessMonitor.2=Äang nhập các bản ghi... -ImportDialogProcessMonitor.5=Số lượng thá»±c tế các bản ghi đã nhập\: -ImportDialogProcessMonitor.8=Äang xá»­ lý dữ liệu... -InfiniteProgressMonitor.0=Há»§y lệnh -JFileChooserExistsAware.0=File project cá»§a Collect Earth -KmlImportService.13=Chá»n file CSV file để ghi địa Ä‘iểm cá»§a ô vào -MissingPlotsListener.0=Lá»—i khi lấy thông tin vỠô không có trong CSDL -MissingPlotsListener.1=Các ô thiếu -MissingPlotsListener.10=Tổng số ô trong thiết kế chá»n mẫu \: -MissingPlotsListener.12=Số ô thiếu\: -MissingPlotsListener.14=Äã Ä‘iá»n tất cả các ô\! -MissingPlotsListener.2=Sao chép ná»™i dung vào bàn phím -MissingPlotsListener.3=Lá»±a chá»n file có chứa thông tin ô ( file .csv hoặc .ced ) mà bạn muốn biết đã Ä‘iá»n đủ dữ liệu chưa. -MissingPlotsListener.4=Các ô thiếu - thông tin -MissingPlotsListener.5=Từ file \: -MissingPlotsListener.6=Xuất ra file CED -ProcessMonitorDialog.1=Tìm lá»—i trên số dòng -ProcessMonitorDialog.4=, cá»™t -ProcessMonitorDialog.5=\ -- giá trị +AboutDialog.19=कोई समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ +AboutDialog.5=अधिक जानकारी के लिठहमारी वेबसाइट पर जाà¤? OpenForis.org? +AboutDialog.6=कà¥à¤·à¤®à¤¾ करें, à¤à¤• समसà¥à¤¯à¤¾ आपके सिसà¥à¤Ÿà¤® के मानक बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में इस लिंक को खोलने की कोशिश कर रही है. +AboutDialog.8=ठीक +AspectCode.0=उतà¥à¤¤à¤° दिशा +AspectCode.1=उतà¥à¤¤à¤°-पूरà¥à¤µ दिशा +AspectCode.2=पूरà¥à¤µ दिशा +AspectCode.3=दकà¥à¤·à¤¿à¤£-पूरà¥à¤µ दिशा +AspectCode.4=दकà¥à¤·à¤¿à¤£ दिशा +AspectCode.5=दकà¥à¤·à¤¿à¤£-पशà¥à¤šà¤¿à¤® दिशा +AspectCode.6=पशà¥à¤šà¤¿à¤® दिशा +AspectCode.7=उतà¥à¤¤à¤°-पशà¥à¤šà¤¿à¤® दिशा +CollectEarthWindow.0=तà¥à¤°à¥à¤Ÿà¤¿ जब सीà¤à¤¸à¤µà¥€ फ़ाइल में डेटा निरà¥à¤¯à¤¾à¤¤ करने का पà¥à¤°à¤¯à¤¾à¤¸ +CollectEarthWindow.1=निरà¥à¤¯à¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.10=फ़ाइल +CollectEarthWindow.11=बाहर जाà¤à¤‚ +CollectEarthWindow.12=उपकरण +CollectEarthWindow.13=डेटा सीà¤à¤¸à¤µà¥€ निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.14=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ +CollectEarthWindow.15=गà¥à¤£ +CollectEarthWindow.16=मदद +CollectEarthWindow.17=असà¥à¤µà¥€à¤•रण +CollectEarthWindow.18=डेटाबेस में लापता भूखंडों खोजें +CollectEarthWindow.19=पृथà¥à¤µà¥€ इकटà¥à¤ à¤¾ +CollectEarthWindow.2=भाषा +CollectEarthWindow.20=डà¥à¤ªà¥à¤²à¤¿à¤•ेट रिकॉरà¥à¤¡ की संखà¥à¤¯à¤¾\: +CollectEarthWindow.21=मà¥à¤–à¥à¤¯ फà¥à¤°à¥‡à¤® के लिठआइकन नहीं मिल सकता है +CollectEarthWindow.22=आपको लगता है कि आप à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ बंद करना चाहते हैं? विंडोज बंद करने से, à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° बंद हो जाà¤à¤—ा +CollectEarthWindow.23=पà¥à¤·à¥à¤Ÿà¤¿ की जरूरत है +CollectEarthWindow.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.25=आप वैसे भी इन अभिलेखों को जोड़ना चाहते हैं और अपने वरà¥à¤¤à¤®à¤¾à¤¨ डेटा खोने के लिठकिलक करना चाहते हैं? +CollectEarthWindow.26=ऑपरेटर,पà¥à¤°à¤šà¤¾à¤²à¤• +CollectEarthWindow.27=अदà¥à¤¯à¤¤à¤¨ +CollectEarthWindow.28= औपन फौरिस à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° चल रहा होना चाहिठ, जबभी ऑपरेटर डेटा की वà¥à¤¯à¤¾à¤–à¥à¤¯à¤¾ करें . +CollectEarthWindow.29=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. +CollectEarthWindow.3= आयात संबंधी तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.30=जबभी आप गà¥à¤—ल अरà¥à¤¥ का उपयोग कर रहे हैं, कृपया इस विंडोज को खà¥à¤²à¥€ बनाठरखें. +CollectEarthWindow.31=à¤à¤•तà¥à¤° डेटा सीà¤à¤¸à¤µà¥€ फाइल में भेजें +CollectEarthWindow.32=छोड़ना +CollectEarthWindow.33=ऑपरेटर का नाम के 5 अकà¥à¤·à¤° से बड़ा और 50 अकà¥à¤·à¤° से कम होना चाहिठ+CollectEarthWindow.34=मानà¥à¤¯à¤¤à¤¾ तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.35=ऑपरेटर नाम खाली\!
कृपया ऑपरेटर का नाम भरें और "अदà¥à¤¯à¤¤à¤¨" बटन दबाà¤à¤. +CollectEarthWindow.36=ऑपरेटर नाम रिकà¥à¤¤ नहीं हो सकता +CollectEarthWindow.37=खà¥à¤²à¤¾ रखो +CollectEarthWindow.38=सीà¤à¤¸à¤µà¥€ फ़ाइल +CollectEarthWindow.39=सूचना\: यह सलाह दी जाती है कि आप नठडेटा डालने करने से पहले अपने मौजूदा आंकडों को बैकअप(à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤) कर लें +CollectEarthWindow.4=à¤à¤«à¤à¤“ असà¥à¤µà¥€à¤•रण नोटिस +CollectEarthWindow.40=उस फ़ोलà¥à¤¡à¤° पर जाà¤à¤‚ जहां साà¤à¤•ॠसरà¥à¤µà¤° में सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ किया गया है, फ़ोलà¥à¤¡à¤° का रासà¥à¤¤à¤¾ उपकरण> गà¥à¤£> उनà¥à¤¨à¤¤ टैब. +CollectEarthWindow.41=निरà¥à¤¯à¤¾à¤¤ डेटा को फ़ाइल में बचाया जा रहा है \: +CollectEarthWindow.42=छोड़ना +CollectEarthWindow.43=परसà¥à¤ªà¤° विरोधी रिकॉरà¥à¤¡ पाया +CollectEarthWindow.44=डेटा आयात / निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.45=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ डेटा (संकà¥à¤šà¤¿à¤¤) +CollectEarthWindow.46=ज़िप से नठडेटा आयात करें (संकà¥à¤šà¤¿à¤¤ à¤à¤•à¥à¤¸à¤à¤®à¤à¤²) +CollectEarthWindow.55=सीà¤à¤¸à¤µà¥€ का उपयोग कर मौजूदा रिकॉरà¥à¤¡ को अपडेट करें +CollectEarthWindow.47=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. +CollectEarthWindow.48=ज़िप / à¤à¤•तà¥à¤°-डेटा फ़ाइल +CollectEarthWindow.49=फà¥à¤¯à¥‚जन सीà¤à¤¸à¤µà¥€ फ़ाइल +CollectEarthWindow.5=बंद करे +CollectEarthWindow.50= उपयोगकरà¥à¤¤à¤¾ मैनà¥à¤…ल खोलें +CollectEarthWindow.51=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ के अदà¥à¤¯à¤¤à¤¨ के लिठजाà¤à¤š करें +CollectEarthWindow.52= अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— लॉग फ़ाइल खोलें +CollectEarthWindow.53=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ लॉग फ़ाइल +CollectEarthWindow.54=केà¤à¤®à¤à¤² से लोड अंक +CollectEarthWindow.56=के विषय में... +CollectEarthWindow.57=साà¤à¤•ॠसà¥à¤Ÿà¤¾à¤°à¥à¤Ÿà¤° पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ अभी भी चल रहा है, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें. +CollectEarthWindow.58=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ नहीं कर सकते +CollectEarthWindow.59=आप साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ के लिठडेटा सेट फिर से उतà¥à¤ªà¤¨à¥à¤¨ करने के लिठकरना चाहते हैं?
यह पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ समय लेने वाली हो सकती है.
आप यदि "हाà¤"पर कà¥à¤²à¤¿à¤• करें, तो नवीनतम जानकारी के साथ à¤à¤• नया डाटासेट उतà¥à¤ªà¤¨à¥à¤¨ हो जाà¤à¤—ा. +CollectEarthWindow.6=फà¥à¤¯à¥‚जन टेबल के लिठनिरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.60=साà¤à¤•ॠडेटा उतà¥à¤ªà¤¨à¥à¤¨ +CollectEarthWindow.61=डेटा à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ (पिछले निरà¥à¤¯à¤¾à¤¤ के बाद से संशोधित रिकॉरà¥à¤¡) +CollectEarthWindow.62=के विषय मे... +CollectEarthWindow.63=केà¤à¤®à¤à¤² से अंक पà¥à¤°à¤¾à¤ªà¥à¤¤ करने में तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.64=तकनीकी सहायता +CollectEarthWindow.7=डेटा आयात में तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.8=असà¥à¤µà¥€à¤•रण पाठ नहीं पाया जा सका +CollectEarthWindow.9=डेटा आयात रिकॉरà¥à¤¡ वह है जो कि पहले से ही अपने डेटाबेस पर मौजूद हैं शामिल. +DynamicsCode.0=पà¥à¤°à¤¾à¤°à¤‚भ में वन +DynamicsCode.1=पà¥à¤°à¤¾à¤°à¤‚भ में घास का मैदान, +DynamicsCode.2=पà¥à¤°à¤¾à¤°à¤‚भ में आबादी वाला इलाका +DynamicsCode.3=पà¥à¤°à¤¾à¤°à¤‚भ में बंजर +DynamicsCode.4=पà¥à¤°à¤¾à¤°à¤‚भ में आरà¥à¤¦à¥à¤° भूमि +DynamicsCode.5=पà¥à¤°à¤¾à¤°à¤‚भ में खेत +OpenTextFileListener.0=इस पाठ का फ़ाइल नहीं मिला \: +OptionWizard.0= विकलà¥à¤ª +OptionWizard.1=बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° चà¥à¤¨à¥‡à¤‚ +OptionWizard.10=बैकअप फ़ोलà¥à¤¡à¤° खोलें +OptionWizard.11=अजà¥à¤žà¤¾à¤¤\: उपयोग ifconfig +OptionWizard.12=गà¥à¤°à¤¾à¤¹à¤•ों का उलà¥à¤²à¥‡à¤– +OptionWizard.13=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° आईपी +OptionWizard.14=कतà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ (उदाहरण- 8023) +OptionWizard.15=बचाà¤à¤‚ और परिवरà¥à¤¤à¤¨ लागू करें +OptionWizard.16=आईडी +OptionWizard.17=X- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क +OptionWizard.18=Y- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क +OptionWizard.19=उठान +OptionWizard.2=कारà¥à¤¯à¤ªà¥à¤°à¤µà¤¾à¤¹ (सरà¥à¤µà¤° / गà¥à¤°à¤¾à¤¹à¤•) +OptionWizard.20=गूगल अरà¥à¤¥ अंतरà¥à¤µà¤¸à¥à¤¤à¥ बदल दिया गया है
यदि गà¥à¤—ल अरà¥à¤¥ आप से कहे,अंतरà¥à¤µà¤¸à¥à¤¤à¥ पà¥à¤¨à¤ƒ लोड सà¥à¤µà¥€à¤•ार करें . +OptionWizard.21=अदà¥à¤¯à¤¤à¤¨ सफल +OptionWizard.22=ढाल +OptionWizard.23=गूगल अरà¥à¤¥ डेटा को फिर से खोलने में कोई तà¥à¤°à¥à¤Ÿà¤¿ थी +OptionWizard.24=रदà¥à¤¦ करना +OptionWizard.25=ऑपरेशन मोड +OptionWizard.26=डीबी होसà¥à¤Ÿ +OptionWizard.27=यह à¤à¤• मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ साà¤à¤•ॠफ़ोलà¥à¤¡à¤° नहीं है ( सà¥à¤Ÿà¤¾à¤°à¥à¤Ÿ-साà¤à¤•à¥.batफ़ाइल मौजूद नहीं है) +OptionWizard.28=साà¤à¤•ॠसरà¥à¤µà¤° मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ नहीं +OptionWizard.29=डीबी पोरà¥à¤Ÿ +OptionWizard.3=सरà¥à¤µà¤° आवृतà¥à¤¤à¤¿ +OptionWizard.30=à¤à¤¸à¤•à¥à¤¯à¥ लाइट विकलà¥à¤ª +OptionWizard.31=सेमà¥à¤ªà¤² डेटा +OptionWizard.32=पà¥à¤²à¥‰à¤Ÿ लेआउट +OptionWizard.33=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ परिभाषा +OptionWizard.34=विकसित +OptionWizard.35=सेमà¥à¤ªà¤² अंक की संखà¥à¤¯à¤¾ +OptionWizard.36=सेमà¥à¤ªà¤² बिंदॠके बीच दूरी (मीटर में) +OptionWizard.37=भूखंड की सीमा के साथ मारà¥à¤œà¤¿à¤¨ (मीटर मे) +OptionWizard.38=सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सही ढंग से पढ़ा नहीं जा सकता.
इस फ़ाइल में à¤à¤• अलà¥à¤ªà¤µà¤¿à¤°à¤¾à¤® से अलग मूलà¥à¤¯à¥‹à¤‚ की उमà¥à¤®à¥€à¤¦ है \:
+OptionWizard.39=आईडी, वाई समनà¥à¤µà¤¯, à¤à¤•à¥à¤¸ समनà¥à¤µà¤¯, ऊंचाई, ढाल, पहलू +OptionWizard.4=वरà¥à¤¤à¤®à¤¾à¤¨ कंपà¥à¤¯à¥‚टर आईपी \: +OptionWizard.40=परियोजनाà¤à¤‚ +OptionWizard.41=à¤à¤• नई परियोजना फ़ाइल लोड करें +OptionWizard.42=सीà¤à¤¸à¤µà¥€ पाठक को बंद करते समय तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.43=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ का नाम +OptionWizard.44= सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ बैकअप डेटाबेस +OptionWizard.45=ओपन पृथà¥à¤µà¥€ इंजन ने पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° में जूम किया +OptionWizard.46=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठपृथà¥à¤µà¥€ इंजन टाइमलैपà¥à¤¸ खोलें +OptionWizard.47=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठबिंग मैपà¥à¤¸ खोलें +OptionWizard.48=बजाय गूगल अरà¥à¤¥ के फॉरà¥à¤® à¤à¤• बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° पर खोलें (लिनकà¥à¤¸ के लिठसिफारिश) +OptionWizard.49=भूखंड डेटा के साथ सीईडी / सीà¤à¤¸à¤µà¥€ फाइल भेजने के लिठपथ +OptionWizard.5=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ\: +OptionWizard.50=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.51=परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.52=केवल निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क के साथ सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल +OptionWizard.53=चौकोर +OptionWizard.54=केनà¥à¤¦à¥à¤°à¥€à¤¯ बिनà¥à¤¦à¥ +OptionWizard.55=परियोजना फ़ोलà¥à¤¡à¤° आयात तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.56=लोड परियोजना +OptionWizard.57=पहले से लोड परियोजना +OptionWizard.58= जी ई ई का मैदान खोलें (विशà¥à¤µà¤¸à¤¨à¥€à¤¯ जांचकरà¥à¤¤à¤¾ के उपयोग की आवशà¥à¤¯à¤•ता है) +OptionWizard.59=यहां भूखंड पर केंदà¥à¤°à¤¿à¤¤ मैपà¥à¤¸ खोलें +OptionWizard.6=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² डीबी मापदंड +OptionWizard.65=साà¤à¤•à¥à¤«à¤¼à¥‹à¤²à¥à¤¡à¤° का पथ +OptionWizard.66=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.67=फ़ायरफ़ॉकà¥à¤¸ निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ +OptionWizard.68=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.7=उपयोगकरà¥à¤¤à¤¾ नाम +OptionWizard.70=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों +OptionWizard.72=बाइनरी फ़ाइलें +OptionWizard.73=कà¥à¤°à¥‹à¤® निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ +OptionWizard.74=बà¥à¤°à¤¾à¤‰à¤œ +OptionWizard.76=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों +OptionWizard.78=बाइनरी फ़ाइलें +OptionWizard.79=केà¤à¤®à¤à¤² फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ के लिठपथ +OptionWizard.8=पासवरà¥à¤¡ +OptionWizard.80=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.82=फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ +OptionWizard.83=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ पà¥à¤°à¤ªà¤¤à¥à¤° डिज़ाइन करने के लिठपथ +OptionWizard.84=बà¥à¤°à¤¾à¤‰à¤œ..... +OptionWizard.86=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² वेब पेज +OptionWizard.87=पथ आइडीà¤à¤® परिभाषा के साथ à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठ+OptionWizard.88=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.9=डीबी नाम +OptionWizard.90=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² आइडीà¤à¤® परिभाषा +OptionWizard.91=सरà¥à¤µà¤° (पà¥à¤°à¤¬à¤‚धक संसà¥à¤•रण या खड़े अकेले का उपयोग करें) +OptionWizard.92=कà¥à¤²à¤¾à¤‡à¤‚ट (ऑपरेटर / सरà¥à¤µà¤° से जà¥à¤¡à¤¼à¥‡) +OptionWizard.93=सकà¥à¤¯à¥‚à¤à¤²à¤¾à¤‡à¤Ÿ (à¤à¤‚बेडेड / à¤à¤•ल फाइल आधारित) +OptionWizard.94=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² +OptionWizard.95=सेमà¥à¤ªà¤² डॉटà¥à¤¸ के साइड (मीटर में) +SaikuAnalysisListener.0=हाठ- ताज़ा साà¤à¤•ॠडेटा (लंबी पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾) +SaikuAnalysisListener.1=नहीं - बस साà¤à¤•ॠशà¥à¤°à¥‚ +SaikuStarter.1=साà¤à¤•ॠशà¥à¤°à¥‚ +SaikuStarter.2= साà¤à¤•ॠशà¥à¤°à¥‚ कà¥à¤› मिनट लग सकते हैं, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें\! +SaveEarthDataServlet.0=खाली अनà¥à¤°à¥‹à¤§ +SaveEarthDataServlet.1= डेटाबेस में डेटा बचाते समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ है +SaveEarthDataServlet.2=डेटा बचाया था +SlopeCode.0=समतल (0-5) +EarthApp.11=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ पहले से ही चल रहा है +EarthApp.21=à¤à¤• सीà¤à¤¸à¤µà¥€ / सीईडी के रूप में भूखंडों की गà¥à¤°à¤¿à¤¡ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
+EarthApp.23=कोई सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सेट-अप नहीं किया गया है \:

+EarthApp.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² परिभाषा के साथ फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है \:
+EarthApp.26=कोई à¤à¤•à¥à¤¸à¤à¤®à¤à¤² फ़ाइल परिभाषा सेट अप नहीं किया गया है \:

+EarthApp.27=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ रूप से यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
+EarthApp.29=कोई à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ फ़ाइल सेट-अप नहीं किया गया है \:

+EarthApp.3=मà¥à¤à¥‡ बाद में याद दिलाना +EarthApp.30=उपकरण> गà¥à¤£ मेनू में फ़ाइल सà¥à¤¥à¤¾à¤¨ को ठीक करें . +EarthApp.4=अभी अदà¥à¤¯à¤¤à¤¨ करें +EarthApp.5=मà¥à¤à¥‡ दà¥à¤¬à¤¾à¤°à¤¾ याद मत दिलाना +EarthApp.57=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ का à¤à¤• नया संसà¥à¤•रण उपलबà¥à¤§ है\!
आप कैसे आगे बढ़ना चाहते हैं? +EarthApp.58=अदà¥à¤¯à¤¤à¤¨ चेतावनी +EarthApp.59= परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ +EarthApp.6=\ - संसà¥à¤•रण +EarthApp.61=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ फाइल खà¥à¤² नहीं सकती .
कृपया सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करें कि गूगल अरà¥à¤¥ सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ है. +EarthSurveyService.9=आवशà¥à¤¯à¤• कà¥à¤·à¥‡à¤¤à¥à¤° +ExportActionListener.1= तारीख चूनें जबसे रिकॉरà¥à¤¡ निरà¥à¤¯à¤¾à¤¤ करने है +ExportDialogProcessMonitor.0=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... +ExportDialogProcessMonitor.1=पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ पà¥à¤°à¤¾à¤°à¤‚भ करने के लिठपà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ कर रहा है \: +ExportDialogProcessMonitor.4=निरà¥à¤¯à¤¾à¤¤ रिकॉरà¥à¤¡\: +ImportProcessMonitorDialog.0=आयातित रिकॉरà¥à¤¡ \: +ImportActionListener.0=कà¥à¤¯à¤¾ उन भूखंडों के लिठडेटा जो कि पूरी तरह से भरे नहीं गठ,आयातित किया जाना चाहिà¤? +ImportActionListener.2=आप कà¥à¤²à¤¿à¤• करें, नहींतो केवल डेटा "हरी" राजà¥à¤¯ में भूखंडों से ,जिसमें सभी डेटा यà¥à¤•à¥à¤¤ है , आयात किया जाà¤à¤—ा। +ImportDialogProcessMonitor.0=\ गणना +ImportDialogProcessMonitor.11=रिकॉरà¥à¤¡ की पà¥à¤°à¤¾à¤°à¤‚भिक संखà¥à¤¯à¤¾ \: +ImportDialogProcessMonitor.2=रिकॉरà¥à¤¡ आयात... +ImportDialogProcessMonitor.5=आयातित रिकॉरà¥à¤¡ की वासà¥à¤¤à¤µà¤¿à¤• संखà¥à¤¯à¤¾ \: +ImportDialogProcessMonitor.8=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... +InfiniteProgressMonitor.0=रदà¥à¤¦ ऑपरेशन +JFileChooserExistsAware.0=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ परियोजना फ़ाइल +KmlImportService.13=पà¥à¤²à¥‰à¤Ÿ सà¥à¤¥à¤¾à¤¨à¥‹à¤‚ को बचाने के लिठà¤à¤• सीà¤à¤¸à¤µà¥€ फ़ाइल का चयन करें +MissingPlotsListener.0=तà¥à¤°à¥à¤Ÿà¤¿ उन भूखंडों के बारे में जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ करने के लिठजो डेटाबेस पर मौजूद नहीं +MissingPlotsListener.1=गà¥à¤® भूखंड +MissingPlotsListener.10=सेमà¥à¤ªà¤² डिजाइन में भूखंडों की कà¥à¤² संखà¥à¤¯à¤¾ \: +MissingPlotsListener.12=गà¥à¤® भूखंडों की संखà¥à¤¯à¤¾ \: +MissingPlotsListener.14=सभी भूखंडों भर रहे हैं\! +MissingPlotsListener.2=कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ अंतरà¥à¤µà¤¸à¥à¤¤à¥ की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ +MissingPlotsListener.3=भूखंड की जानकारी वाले फ़ाइलें चà¥à¤¨à¥‡à¤‚ ( .सीà¤à¤¸à¤µà¥€ या .सीईडी फ़ाइलें ) जिसके लिठआप जानना चाहते हैं तो सभी डेटा भर दिया गया है चाहता हूà¤. +MissingPlotsListener.4=गà¥à¤® भूखंड- जानकारी +MissingPlotsListener.5=फ़ाइल से \: +MissingPlotsListener.6=सीà¤à¤¡à¥€ फ़ाइल में निरà¥à¤¯à¤¾à¤¤ करें +ProcessMonitorDialog.1=पंकà¥à¤¤à¤¿ संखà¥à¤¯à¤¾ पर तà¥à¤°à¥à¤Ÿà¤¿ +ProcessMonitorDialog.4=, कॉलम +ProcessMonitorDialog.5=\ --मूलà¥à¤¯ +YES= हां +YES_TO_ALL=सब को हां +NO=नहीं +NO_TO_ALL=सभी को नहीं From e8f07abcfcb25d3394bb2e6ba55a2594b3bd387d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:36:50 +0100 Subject: [PATCH 0823/1620] New translations utf8_orig_Messages_hi.properties (Portuguese) --- .../earth/app/view/Messages_pt.properties | 446 +++++++++--------- 1 file changed, 225 insertions(+), 221 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 5110140e9c..f0355142d0 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,221 +1,225 @@ -AboutDialog.19=Äã có lá»—i -AboutDialog.5=Truy cập website cá»§a chúng tôi để biết thêm thông tin OpenForis.org -AboutDialog.6=Xin lá»—i, đã có sá»± cố khi mở link trong brower chuẩn trong hệ thống cá»§a bạn. -AboutDialog.8=Ok -AspectCode.0=Bắc -AspectCode.1=Äông-Bắc -AspectCode.2=Äông -AspectCode.3=Äông-Nam -AspectCode.4=Nam -AspectCode.5=Tây-Nam -AspectCode.6=Tây -AspectCode.7=Tây-Bắc -CollectEarthWindow.0=Lá»—i khi xuất dữ liệu sang file CSV -CollectEarthWindow.1=Lá»—i xuất dữ liệu -CollectEarthWindow.10=File -CollectEarthWindow.11=Thoát -CollectEarthWindow.12=Công cụ -CollectEarthWindow.13=Xuất dữ liệu ra CSV -CollectEarthWindow.14=Khởi động SAIKU Analysis -CollectEarthWindow.15=Thuá»™c tính -CollectEarthWindow.16=Trợ giúp -CollectEarthWindow.17=Thông tin công bố -CollectEarthWindow.18=Tìm ô thiếu trong cÆ¡ sở dữ liệu -CollectEarthWindow.19=Collect Earth -CollectEarthWindow.2=Ngôn ngữ -CollectEarthWindow.20=Số bản ghi trùng\: -CollectEarthWindow.21=Không tìm thấy biểu tượng cho khung chính -CollectEarthWindow.22=Bạn có chắc là muốn đóng Collect Earth?
Äóng cá»­a sổ cÅ©ng đóng luôn máy chá»§ Collect Earth -CollectEarthWindow.23=Cần khẳng định -CollectEarthWindow.24=Xuất ra XML -CollectEarthWindow.25=Bạn có muốn thêm các bản ghi này và bá» Ä‘i dữ liệu hiện thá»i không? -CollectEarthWindow.26=Ngưá»i sá»­ dụng -CollectEarthWindow.27=Cập nhật -CollectEarthWindow.28=Máy chá»§ Open Foris Collect Earth phải chạy khi ngưá»i sá»­ dụng giải Ä‘oán dữ liệu. -CollectEarthWindow.29=Chưa xác định cấu hình cho Máy chá»§ Saiku. -CollectEarthWindow.3=\ Lá»—i nhập -CollectEarthWindow.30=Äể mở cá»­a sổ này khi Ä‘ang sá»­ dụng Google Earth. -CollectEarthWindow.31=Xuất dữ liệu đã thu thập sang file CSV -CollectEarthWindow.32=Thoát -CollectEarthWindow.33=Tên ngưá»i sá»­ dụng phải dài hÆ¡n 5 chữ cái và ngắn hÆ¡n 50 chữ cái -CollectEarthWindow.34=Lá»—i kiểm chứng -CollectEarthWindow.35=TÊN NGƯỜI SỬ DỤNG CÃ’N TRá»NG\!
Hãy Ä‘iá»n tên ngưá»i sá»­ dụng và nhắp phím "Update". -CollectEarthWindow.36=Không được để trống phần tên ngưá»i sá»­ dụng -CollectEarthWindow.37=Äể mở -CollectEarthWindow.38=file CSV -CollectEarthWindow.39=THÔNG BÃO\: Nên lưu dá»± phòng dữ liệu hiện thá»i(Xuất ra XML) trước khi nhập dữ liệu má»›i -CollectEarthWindow.4=Thông tin công bố cá»§a FAO -CollectEarthWindow.40=Thiết lập đưá»ng dẫn tá»›i thư mục cài đặt Saiku Server trong Tools->Properties->Advanced tab. -CollectEarthWindow.41=Ghi dữ liệu xuất ra vào file\: -CollectEarthWindow.42=Thoát -CollectEarthWindow.43=Tìm thấy bản ghi có mâu thuẫn -CollectEarthWindow.44=Nhập/Xuất dữ liệu -CollectEarthWindow.45=Xuất dữ liệu ra XML (nén) -CollectEarthWindow.46=Nhập dữ liệu má»›i từ file ZIP (XML nén) -CollectEarthWindow.55=Cập nhật các bản ghi hiện thá»i bằng CSV -CollectEarthWindow.47=Chưa định cấu hình cho Saiku Server -CollectEarthWindow.48=Zip/collect-data files -CollectEarthWindow.49=Files CSV tổng hợp -CollectEarthWindow.5=Äóng -CollectEarthWindow.50=Mở hướng dẫn ngưá»i sá»­ dụng -CollectEarthWindow.51=Kiểm tra cập nhật cá»§a Collect Earth -CollectEarthWindow.52=Mở file nhật ký ứng dụng -CollectEarthWindow.53=File nhật ký cá»§a Collect Earth -CollectEarthWindow.54=Nạp các Ä‘iểm từ KML -CollectEarthWindow.56=Vá»... -CollectEarthWindow.57=Äang chạy quá trình khởi động Saiku, xin đợi. -CollectEarthWindow.58=Không thể khởi động Saiku analysis -CollectEarthWindow.59=Bạn có muốn tạo lại bá»™ dữ liệu cho Saiku analysis không?
Quá trình này sẽ mất một vài phút.
Nếu bạn chá»n "YES" sẽ tạo ra má»™t bá»™ dữ liệu má»›i vá»›i các thông tin cập nhật nhất. -CollectEarthWindow.6=Xuất ra bảng tổng hợp -CollectEarthWindow.60=Tạo dữ liệu Saiku -CollectEarthWindow.61=Xuất dữ liệu ra XML (các bản ghi chỉnh sá»­a từ lần xuất trước) -CollectEarthWindow.62=Vá»... -CollectEarthWindow.63=Lá»—i khi nạp Ä‘iểm từ KML -CollectEarthWindow.64=Há»— trợ kỹ thuật -CollectEarthWindow.7=Lá»—i khi nhập dữ liệu -CollectEarthWindow.8=Không tìm thấy văn bản thông báo -CollectEarthWindow.9=Dữ liệu nhập vào có chứa các bản ghi đã có trong cÆ¡ sở dữ liệu cá»§a bạn. -DynamicsCode.0=Ban đầu là rừng -DynamicsCode.1=Ban đầu là trảng cá» -DynamicsCode.2=Ban đầu là khu dân cư -DynamicsCode.3=Ban đầu là đất khác -DynamicsCode.4=Ban đầu là đất ngập nước -DynamicsCode.5=Ban đầu là đất trồng trá»t -OpenTextFileListener.0=không tìm thấy file văn bản tại\: -OptionWizard.0=Các lá»±a chá»n cá»§a Collect Earth -OptionWizard.1=Chá»n Browser -OptionWizard.10=Mở thư mục lưu dá»± phòng -OptionWizard.11=Không biết\: hãy sá»­ dụng ifconfig -OptionWizard.12=Vi dụ cá»§a khác -OptionWizard.13=Äịa chỉ IP cá»§a máy chá»§ Collect Earth -OptionWizard.14=Cổng máy chá»§ Collect Earth (vd\: 8023) -OptionWizard.15=Ghi và áo dụng thay đổi -OptionWizard.16=ID -OptionWizard.17=Tá»a độ X -OptionWizard.18=Tá»a độ Y -OptionWizard.19=Äá»™ cao -OptionWizard.2=Dòng công tác (máy chá»§/khách) -OptionWizard.20=Ná»™i dung cá»§a Google Earth đã thay đổi.
Äá» nghị chấp nhận tải lại ná»™i dung khi Google Earth gợi ý. -OptionWizard.21=Cập nhật thành công -OptionWizard.22=Dốc -OptionWizard.23=Có lá»—i khi mở lại dữ liệu Google Earth -OptionWizard.24=Há»§y -OptionWizard.25=Mode vận hành -OptionWizard.26=NÆ¡i lưu cÆ¡ sở dữ liệu -OptionWizard.27=Äây không phải là thư mục Saiku (hiện không có file start-saiku.bat) -OptionWizard.28=Không nhận được máy chá»§ Saiku -OptionWizard.29=Cổng cÆ¡ sở dữ liệu -OptionWizard.3=Ví dụ cá»§a máy chá»§ -OptionWizard.30=Các lá»±a chá»n cá»§a SQLite -OptionWizard.31=Dữ liệu mẫu -OptionWizard.32=SÆ¡ đồ mẫu -OptionWizard.33=Äịnh nghÄ©a khảo sát -OptionWizard.34=Nâng cao -OptionWizard.35=Số Ä‘iểm mẫu -OptionWizard.36=Khoảng cách giữa các Ä‘iểm mẫu (tính theo mét) -OptionWizard.37=Lá» vá»›i biên ô (tính theo mét) -OptionWizard.38=Không Ä‘á»c được đúng file CSV/CED.
Cần có dấu phảy để phân tách giá trị giống như sau \:
-OptionWizard.39=ID,Tá»a độ Y,tá»a độ X,độ cao,độ dốc,tá»· lệ -OptionWizard.4=Äịa chỉ IP hiện tại cá»§a máy tính\: -OptionWizard.40=Các project -OptionWizard.41=tải file project má»›i -OptionWizard.42=Lá»—i khi đóng CSV reader -OptionWizard.43=Tên khảo sát -OptionWizard.44=tá»± động lưu dá»± phòng dữ liệu tại -OptionWizard.45=Mở Earth Engine để phóng to vào khu vá»±c ô -OptionWizard.46=Mở Earth Engine timelapse cho khu vá»±c ô -OptionWizard.47=Mở Bing Maps cho khu vá»±c ô -OptionWizard.48=Mở form trên browser thay vì mở Google Earth (khuyến cáo cho LINUX) -OptionWizard.49=ÄÆ°á»ng dẫn tá»›i file ced/csv file vá»›i dữ liệu ô -OptionWizard.5=Cổng máy chá»§ Collect Earth\: -OptionWizard.50=Browse... -OptionWizard.51=Lá»—i nhập file project -OptionWizard.52=File CSV/CED chỉ có tá»a độ -OptionWizard.53=Ô vuông -OptionWizard.54=Äiểm trung tâm -OptionWizard.55=Lá»—i khi nhập thư mục project -OptionWizard.56=Tải project -OptionWizard.57=Các project đã tải -OptionWizard.58=Mở GEE Code Editor (cần phải có quyá»n truy cập Trusted Tester) -OptionWizard.59=Mở Here Maps tập trung vào ô -OptionWizard.6=Các thông số cá»§a CSDL PostgreSQL -OptionWizard.65=ÄÆ°á»ng dẫn tá»›i thư mục Saiku -OptionWizard.66=Browse... -OptionWizard.67=ÄÆ°á»ng dẫn tá»›i Firefox executable (file exe) -OptionWizard.68=Browse... -OptionWizard.7=Tên ngưá»i sá»­ dụng -OptionWizard.70=File chạy -OptionWizard.72=File nhị phân -OptionWizard.73=ÄÆ°á»ng dẫn tá»›i Chrome executable (file exe) -OptionWizard.74=Browse... -OptionWizard.76=File exe -OptionWizard.78=File nhị phân -OptionWizard.79=ÄÆ°á»ng dẫn tá»›i KML Freemarker template -OptionWizard.8=Mật khẩu -OptionWizard.80=Browse... -OptionWizard.82=Freemarker template -OptionWizard.83=ÄÆ°á»ng dẫn tá»›i mẫu thiết kế HTML Balloon -OptionWizard.84=Browse... -OptionWizard.86=HTML webpage -OptionWizard.87=ÄÆ°á»ng dẫn tá»›i XML vá»›i định nghÄ©a IDM -OptionWizard.88=Browse... -OptionWizard.9=Tên CSDL -OptionWizard.90=Äịnh nghÄ©a XML IDM -OptionWizard.91=Máy chá»§ (phiên bản quản lý hoặc sá»­ dụng độc lập) -OptionWizard.92=Khách (ngưá»i sá»­ dụng/kết nối vá»›i máy chá»§) -OptionWizard.93=SQLite (tích hợp/file đơn lẻ) -OptionWizard.94=PostgreSQL -SaikuAnalysisListener.0=Yes - Làm má»›i lại dữ liệu Saiku (quá trình dài) -SaikuAnalysisListener.1=No - chỉ khởi động Saiku -SaikuStarter.1=Khởi động Saiku -SaikuStarter.2=Cần vài phút để khởi động Saiku, xin đợi\! -SaveEarthDataServlet.0=Yêu cầu trống -SaveEarthDataServlet.1=Có trục trặc khi ghi dữ liệu vào CSDL -SaveEarthDataServlet.2=Dữ liệu đã được ghi -SlopeCode.0=Bằng phẳng (0-5) -EarthApp.11=Collect Earth Ä‘ang chạy -EarthApp.21=Không tìm thấy file chứa lưới ô trong đưá»ng dẫn đã chá»n \:
-EarthApp.23=Chưa thiết lập file CSV/CED \:

-EarthApp.24=Không tìm thấy file chứa Freemarker template vá»›i định nghÄ©a KML trong đưá»ng dẫn đã chá»n\:
-EarthApp.26=Chưa thiết lập file định nghĩa KML d\:

-EarthApp.27=Không tìm thấy file chứa mẫu HTML balloon trong đưá»ng dẫn đã chá»n\:
-EarthApp.29=Chưa thiết lập file HTML balloon \:

-EarthApp.3=Nhắc nhở sau -EarthApp.30=Xin hãy Ä‘iá»u chỉnh đúng địa chỉ file trong Tools->Properties menu. -EarthApp.4=Cập nhật luôn -EarthApp.5=Không nhắc nữa -EarthApp.57=Äã có phiên bản má»›i cá»§a Collect Earth\!
Bạn muốn làm tiếp như thế nào? -EarthApp.58=Thông báo cập nhật -EarthApp.59=Lỗi khi nhập file project -EarthApp.6=\ - Phiên bản -EarthApp.61=Không mở được file Collect Earth.
Äá» nghị đảm bảo đã cài đặt Google Earth. -EarthSurveyService.9=Trưá»ng bắt buá»™c -ExportActionListener.1=Chá»n ngày xuất bản ghi -ExportDialogProcessMonitor.0=Äang xá»­ lý dữ liệu... -ExportDialogProcessMonitor.1=Äang đợi khởi động quá trình\: -ExportDialogProcessMonitor.4=Các bản ghi đã xuất\: -ImportProcessMonitorDialog.0=Các bản ghi đã nhập\: -ImportActionListener.0=Có nhập dữ liệu các ô chưa được Ä‘iá»n đầy đủ không? -ImportActionListener.2=Nếu bạn chá»n NO sẽ chỉ nhập dữ liệu cá»§a các ô có trạng thái màu "xanh lá cây", các ô đã có đầy đủ dữ liệu. -ImportActionListener.3=Nhập các bản ghi chưa hoàn tất -ImportDialogProcessMonitor.0=\ ÄANG TÃNH TOÃN -ImportDialogProcessMonitor.11=Số lượng ban đầu các bản ghi\: -ImportDialogProcessMonitor.2=Äang nhập các bản ghi... -ImportDialogProcessMonitor.5=Số lượng thá»±c tế các bản ghi đã nhập\: -ImportDialogProcessMonitor.8=Äang xá»­ lý dữ liệu... -InfiniteProgressMonitor.0=Há»§y lệnh -JFileChooserExistsAware.0=File project cá»§a Collect Earth -KmlImportService.13=Chá»n file CSV file để ghi địa Ä‘iểm cá»§a ô vào -MissingPlotsListener.0=Lá»—i khi lấy thông tin vỠô không có trong CSDL -MissingPlotsListener.1=Các ô thiếu -MissingPlotsListener.10=Tổng số ô trong thiết kế chá»n mẫu \: -MissingPlotsListener.12=Số ô thiếu\: -MissingPlotsListener.14=Äã Ä‘iá»n tất cả các ô\! -MissingPlotsListener.2=Sao chép ná»™i dung vào bàn phím -MissingPlotsListener.3=Lá»±a chá»n file có chứa thông tin ô ( file .csv hoặc .ced ) mà bạn muốn biết đã Ä‘iá»n đủ dữ liệu chưa. -MissingPlotsListener.4=Các ô thiếu - thông tin -MissingPlotsListener.5=Từ file \: -MissingPlotsListener.6=Xuất ra file CED -ProcessMonitorDialog.1=Tìm lá»—i trên số dòng -ProcessMonitorDialog.4=, cá»™t -ProcessMonitorDialog.5=\ -- giá trị +AboutDialog.19=कोई समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ +AboutDialog.5=अधिक जानकारी के लिठहमारी वेबसाइट पर जाà¤? OpenForis.org? +AboutDialog.6=कà¥à¤·à¤®à¤¾ करें, à¤à¤• समसà¥à¤¯à¤¾ आपके सिसà¥à¤Ÿà¤® के मानक बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में इस लिंक को खोलने की कोशिश कर रही है. +AboutDialog.8=ठीक +AspectCode.0=उतà¥à¤¤à¤° दिशा +AspectCode.1=उतà¥à¤¤à¤°-पूरà¥à¤µ दिशा +AspectCode.2=पूरà¥à¤µ दिशा +AspectCode.3=दकà¥à¤·à¤¿à¤£-पूरà¥à¤µ दिशा +AspectCode.4=दकà¥à¤·à¤¿à¤£ दिशा +AspectCode.5=दकà¥à¤·à¤¿à¤£-पशà¥à¤šà¤¿à¤® दिशा +AspectCode.6=पशà¥à¤šà¤¿à¤® दिशा +AspectCode.7=उतà¥à¤¤à¤°-पशà¥à¤šà¤¿à¤® दिशा +CollectEarthWindow.0=तà¥à¤°à¥à¤Ÿà¤¿ जब सीà¤à¤¸à¤µà¥€ फ़ाइल में डेटा निरà¥à¤¯à¤¾à¤¤ करने का पà¥à¤°à¤¯à¤¾à¤¸ +CollectEarthWindow.1=निरà¥à¤¯à¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.10=फ़ाइल +CollectEarthWindow.11=बाहर जाà¤à¤‚ +CollectEarthWindow.12=उपकरण +CollectEarthWindow.13=डेटा सीà¤à¤¸à¤µà¥€ निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.14=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ +CollectEarthWindow.15=गà¥à¤£ +CollectEarthWindow.16=मदद +CollectEarthWindow.17=असà¥à¤µà¥€à¤•रण +CollectEarthWindow.18=डेटाबेस में लापता भूखंडों खोजें +CollectEarthWindow.19=पृथà¥à¤µà¥€ इकटà¥à¤ à¤¾ +CollectEarthWindow.2=भाषा +CollectEarthWindow.20=डà¥à¤ªà¥à¤²à¤¿à¤•ेट रिकॉरà¥à¤¡ की संखà¥à¤¯à¤¾\: +CollectEarthWindow.21=मà¥à¤–à¥à¤¯ फà¥à¤°à¥‡à¤® के लिठआइकन नहीं मिल सकता है +CollectEarthWindow.22=आपको लगता है कि आप à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ बंद करना चाहते हैं? विंडोज बंद करने से, à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° बंद हो जाà¤à¤—ा +CollectEarthWindow.23=पà¥à¤·à¥à¤Ÿà¤¿ की जरूरत है +CollectEarthWindow.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.25=आप वैसे भी इन अभिलेखों को जोड़ना चाहते हैं और अपने वरà¥à¤¤à¤®à¤¾à¤¨ डेटा खोने के लिठकिलक करना चाहते हैं? +CollectEarthWindow.26=ऑपरेटर,पà¥à¤°à¤šà¤¾à¤²à¤• +CollectEarthWindow.27=अदà¥à¤¯à¤¤à¤¨ +CollectEarthWindow.28= औपन फौरिस à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° चल रहा होना चाहिठ, जबभी ऑपरेटर डेटा की वà¥à¤¯à¤¾à¤–à¥à¤¯à¤¾ करें . +CollectEarthWindow.29=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. +CollectEarthWindow.3= आयात संबंधी तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.30=जबभी आप गà¥à¤—ल अरà¥à¤¥ का उपयोग कर रहे हैं, कृपया इस विंडोज को खà¥à¤²à¥€ बनाठरखें. +CollectEarthWindow.31=à¤à¤•तà¥à¤° डेटा सीà¤à¤¸à¤µà¥€ फाइल में भेजें +CollectEarthWindow.32=छोड़ना +CollectEarthWindow.33=ऑपरेटर का नाम के 5 अकà¥à¤·à¤° से बड़ा और 50 अकà¥à¤·à¤° से कम होना चाहिठ+CollectEarthWindow.34=मानà¥à¤¯à¤¤à¤¾ तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.35=ऑपरेटर नाम खाली\!
कृपया ऑपरेटर का नाम भरें और "अदà¥à¤¯à¤¤à¤¨" बटन दबाà¤à¤. +CollectEarthWindow.36=ऑपरेटर नाम रिकà¥à¤¤ नहीं हो सकता +CollectEarthWindow.37=खà¥à¤²à¤¾ रखो +CollectEarthWindow.38=सीà¤à¤¸à¤µà¥€ फ़ाइल +CollectEarthWindow.39=सूचना\: यह सलाह दी जाती है कि आप नठडेटा डालने करने से पहले अपने मौजूदा आंकडों को बैकअप(à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤) कर लें +CollectEarthWindow.4=à¤à¤«à¤à¤“ असà¥à¤µà¥€à¤•रण नोटिस +CollectEarthWindow.40=उस फ़ोलà¥à¤¡à¤° पर जाà¤à¤‚ जहां साà¤à¤•ॠसरà¥à¤µà¤° में सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ किया गया है, फ़ोलà¥à¤¡à¤° का रासà¥à¤¤à¤¾ उपकरण> गà¥à¤£> उनà¥à¤¨à¤¤ टैब. +CollectEarthWindow.41=निरà¥à¤¯à¤¾à¤¤ डेटा को फ़ाइल में बचाया जा रहा है \: +CollectEarthWindow.42=छोड़ना +CollectEarthWindow.43=परसà¥à¤ªà¤° विरोधी रिकॉरà¥à¤¡ पाया +CollectEarthWindow.44=डेटा आयात / निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.45=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ डेटा (संकà¥à¤šà¤¿à¤¤) +CollectEarthWindow.46=ज़िप से नठडेटा आयात करें (संकà¥à¤šà¤¿à¤¤ à¤à¤•à¥à¤¸à¤à¤®à¤à¤²) +CollectEarthWindow.55=सीà¤à¤¸à¤µà¥€ का उपयोग कर मौजूदा रिकॉरà¥à¤¡ को अपडेट करें +CollectEarthWindow.47=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. +CollectEarthWindow.48=ज़िप / à¤à¤•तà¥à¤°-डेटा फ़ाइल +CollectEarthWindow.49=फà¥à¤¯à¥‚जन सीà¤à¤¸à¤µà¥€ फ़ाइल +CollectEarthWindow.5=बंद करे +CollectEarthWindow.50= उपयोगकरà¥à¤¤à¤¾ मैनà¥à¤…ल खोलें +CollectEarthWindow.51=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ के अदà¥à¤¯à¤¤à¤¨ के लिठजाà¤à¤š करें +CollectEarthWindow.52= अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— लॉग फ़ाइल खोलें +CollectEarthWindow.53=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ लॉग फ़ाइल +CollectEarthWindow.54=केà¤à¤®à¤à¤² से लोड अंक +CollectEarthWindow.56=के विषय में... +CollectEarthWindow.57=साà¤à¤•ॠसà¥à¤Ÿà¤¾à¤°à¥à¤Ÿà¤° पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ अभी भी चल रहा है, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें. +CollectEarthWindow.58=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ नहीं कर सकते +CollectEarthWindow.59=आप साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ के लिठडेटा सेट फिर से उतà¥à¤ªà¤¨à¥à¤¨ करने के लिठकरना चाहते हैं?
यह पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ समय लेने वाली हो सकती है.
आप यदि "हाà¤"पर कà¥à¤²à¤¿à¤• करें, तो नवीनतम जानकारी के साथ à¤à¤• नया डाटासेट उतà¥à¤ªà¤¨à¥à¤¨ हो जाà¤à¤—ा. +CollectEarthWindow.6=फà¥à¤¯à¥‚जन टेबल के लिठनिरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.60=साà¤à¤•ॠडेटा उतà¥à¤ªà¤¨à¥à¤¨ +CollectEarthWindow.61=डेटा à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ (पिछले निरà¥à¤¯à¤¾à¤¤ के बाद से संशोधित रिकॉरà¥à¤¡) +CollectEarthWindow.62=के विषय मे... +CollectEarthWindow.63=केà¤à¤®à¤à¤² से अंक पà¥à¤°à¤¾à¤ªà¥à¤¤ करने में तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.64=तकनीकी सहायता +CollectEarthWindow.7=डेटा आयात में तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.8=असà¥à¤µà¥€à¤•रण पाठ नहीं पाया जा सका +CollectEarthWindow.9=डेटा आयात रिकॉरà¥à¤¡ वह है जो कि पहले से ही अपने डेटाबेस पर मौजूद हैं शामिल. +DynamicsCode.0=पà¥à¤°à¤¾à¤°à¤‚भ में वन +DynamicsCode.1=पà¥à¤°à¤¾à¤°à¤‚भ में घास का मैदान, +DynamicsCode.2=पà¥à¤°à¤¾à¤°à¤‚भ में आबादी वाला इलाका +DynamicsCode.3=पà¥à¤°à¤¾à¤°à¤‚भ में बंजर +DynamicsCode.4=पà¥à¤°à¤¾à¤°à¤‚भ में आरà¥à¤¦à¥à¤° भूमि +DynamicsCode.5=पà¥à¤°à¤¾à¤°à¤‚भ में खेत +OpenTextFileListener.0=इस पाठ का फ़ाइल नहीं मिला \: +OptionWizard.0= विकलà¥à¤ª +OptionWizard.1=बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° चà¥à¤¨à¥‡à¤‚ +OptionWizard.10=बैकअप फ़ोलà¥à¤¡à¤° खोलें +OptionWizard.11=अजà¥à¤žà¤¾à¤¤\: उपयोग ifconfig +OptionWizard.12=गà¥à¤°à¤¾à¤¹à¤•ों का उलà¥à¤²à¥‡à¤– +OptionWizard.13=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° आईपी +OptionWizard.14=कतà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ (उदाहरण- 8023) +OptionWizard.15=बचाà¤à¤‚ और परिवरà¥à¤¤à¤¨ लागू करें +OptionWizard.16=आईडी +OptionWizard.17=X- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क +OptionWizard.18=Y- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क +OptionWizard.19=उठान +OptionWizard.2=कारà¥à¤¯à¤ªà¥à¤°à¤µà¤¾à¤¹ (सरà¥à¤µà¤° / गà¥à¤°à¤¾à¤¹à¤•) +OptionWizard.20=गूगल अरà¥à¤¥ अंतरà¥à¤µà¤¸à¥à¤¤à¥ बदल दिया गया है
यदि गà¥à¤—ल अरà¥à¤¥ आप से कहे,अंतरà¥à¤µà¤¸à¥à¤¤à¥ पà¥à¤¨à¤ƒ लोड सà¥à¤µà¥€à¤•ार करें . +OptionWizard.21=अदà¥à¤¯à¤¤à¤¨ सफल +OptionWizard.22=ढाल +OptionWizard.23=गूगल अरà¥à¤¥ डेटा को फिर से खोलने में कोई तà¥à¤°à¥à¤Ÿà¤¿ थी +OptionWizard.24=रदà¥à¤¦ करना +OptionWizard.25=ऑपरेशन मोड +OptionWizard.26=डीबी होसà¥à¤Ÿ +OptionWizard.27=यह à¤à¤• मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ साà¤à¤•ॠफ़ोलà¥à¤¡à¤° नहीं है ( सà¥à¤Ÿà¤¾à¤°à¥à¤Ÿ-साà¤à¤•à¥.batफ़ाइल मौजूद नहीं है) +OptionWizard.28=साà¤à¤•ॠसरà¥à¤µà¤° मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ नहीं +OptionWizard.29=डीबी पोरà¥à¤Ÿ +OptionWizard.3=सरà¥à¤µà¤° आवृतà¥à¤¤à¤¿ +OptionWizard.30=à¤à¤¸à¤•à¥à¤¯à¥ लाइट विकलà¥à¤ª +OptionWizard.31=सेमà¥à¤ªà¤² डेटा +OptionWizard.32=पà¥à¤²à¥‰à¤Ÿ लेआउट +OptionWizard.33=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ परिभाषा +OptionWizard.34=विकसित +OptionWizard.35=सेमà¥à¤ªà¤² अंक की संखà¥à¤¯à¤¾ +OptionWizard.36=सेमà¥à¤ªà¤² बिंदॠके बीच दूरी (मीटर में) +OptionWizard.37=भूखंड की सीमा के साथ मारà¥à¤œà¤¿à¤¨ (मीटर मे) +OptionWizard.38=सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सही ढंग से पढ़ा नहीं जा सकता.
इस फ़ाइल में à¤à¤• अलà¥à¤ªà¤µà¤¿à¤°à¤¾à¤® से अलग मूलà¥à¤¯à¥‹à¤‚ की उमà¥à¤®à¥€à¤¦ है \:
+OptionWizard.39=आईडी, वाई समनà¥à¤µà¤¯, à¤à¤•à¥à¤¸ समनà¥à¤µà¤¯, ऊंचाई, ढाल, पहलू +OptionWizard.4=वरà¥à¤¤à¤®à¤¾à¤¨ कंपà¥à¤¯à¥‚टर आईपी \: +OptionWizard.40=परियोजनाà¤à¤‚ +OptionWizard.41=à¤à¤• नई परियोजना फ़ाइल लोड करें +OptionWizard.42=सीà¤à¤¸à¤µà¥€ पाठक को बंद करते समय तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.43=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ का नाम +OptionWizard.44= सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ बैकअप डेटाबेस +OptionWizard.45=ओपन पृथà¥à¤µà¥€ इंजन ने पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° में जूम किया +OptionWizard.46=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठपृथà¥à¤µà¥€ इंजन टाइमलैपà¥à¤¸ खोलें +OptionWizard.47=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठबिंग मैपà¥à¤¸ खोलें +OptionWizard.48=बजाय गूगल अरà¥à¤¥ के फॉरà¥à¤® à¤à¤• बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° पर खोलें (लिनकà¥à¤¸ के लिठसिफारिश) +OptionWizard.49=भूखंड डेटा के साथ सीईडी / सीà¤à¤¸à¤µà¥€ फाइल भेजने के लिठपथ +OptionWizard.5=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ\: +OptionWizard.50=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.51=परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.52=केवल निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क के साथ सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल +OptionWizard.53=चौकोर +OptionWizard.54=केनà¥à¤¦à¥à¤°à¥€à¤¯ बिनà¥à¤¦à¥ +OptionWizard.55=परियोजना फ़ोलà¥à¤¡à¤° आयात तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.56=लोड परियोजना +OptionWizard.57=पहले से लोड परियोजना +OptionWizard.58= जी ई ई का मैदान खोलें (विशà¥à¤µà¤¸à¤¨à¥€à¤¯ जांचकरà¥à¤¤à¤¾ के उपयोग की आवशà¥à¤¯à¤•ता है) +OptionWizard.59=यहां भूखंड पर केंदà¥à¤°à¤¿à¤¤ मैपà¥à¤¸ खोलें +OptionWizard.6=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² डीबी मापदंड +OptionWizard.65=साà¤à¤•à¥à¤«à¤¼à¥‹à¤²à¥à¤¡à¤° का पथ +OptionWizard.66=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.67=फ़ायरफ़ॉकà¥à¤¸ निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ +OptionWizard.68=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.7=उपयोगकरà¥à¤¤à¤¾ नाम +OptionWizard.70=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों +OptionWizard.72=बाइनरी फ़ाइलें +OptionWizard.73=कà¥à¤°à¥‹à¤® निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ +OptionWizard.74=बà¥à¤°à¤¾à¤‰à¤œ +OptionWizard.76=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों +OptionWizard.78=बाइनरी फ़ाइलें +OptionWizard.79=केà¤à¤®à¤à¤² फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ के लिठपथ +OptionWizard.8=पासवरà¥à¤¡ +OptionWizard.80=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.82=फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ +OptionWizard.83=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ पà¥à¤°à¤ªà¤¤à¥à¤° डिज़ाइन करने के लिठपथ +OptionWizard.84=बà¥à¤°à¤¾à¤‰à¤œ..... +OptionWizard.86=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² वेब पेज +OptionWizard.87=पथ आइडीà¤à¤® परिभाषा के साथ à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठ+OptionWizard.88=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.9=डीबी नाम +OptionWizard.90=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² आइडीà¤à¤® परिभाषा +OptionWizard.91=सरà¥à¤µà¤° (पà¥à¤°à¤¬à¤‚धक संसà¥à¤•रण या खड़े अकेले का उपयोग करें) +OptionWizard.92=कà¥à¤²à¤¾à¤‡à¤‚ट (ऑपरेटर / सरà¥à¤µà¤° से जà¥à¤¡à¤¼à¥‡) +OptionWizard.93=सकà¥à¤¯à¥‚à¤à¤²à¤¾à¤‡à¤Ÿ (à¤à¤‚बेडेड / à¤à¤•ल फाइल आधारित) +OptionWizard.94=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² +OptionWizard.95=सेमà¥à¤ªà¤² डॉटà¥à¤¸ के साइड (मीटर में) +SaikuAnalysisListener.0=हाठ- ताज़ा साà¤à¤•ॠडेटा (लंबी पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾) +SaikuAnalysisListener.1=नहीं - बस साà¤à¤•ॠशà¥à¤°à¥‚ +SaikuStarter.1=साà¤à¤•ॠशà¥à¤°à¥‚ +SaikuStarter.2= साà¤à¤•ॠशà¥à¤°à¥‚ कà¥à¤› मिनट लग सकते हैं, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें\! +SaveEarthDataServlet.0=खाली अनà¥à¤°à¥‹à¤§ +SaveEarthDataServlet.1= डेटाबेस में डेटा बचाते समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ है +SaveEarthDataServlet.2=डेटा बचाया था +SlopeCode.0=समतल (0-5) +EarthApp.11=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ पहले से ही चल रहा है +EarthApp.21=à¤à¤• सीà¤à¤¸à¤µà¥€ / सीईडी के रूप में भूखंडों की गà¥à¤°à¤¿à¤¡ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
+EarthApp.23=कोई सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सेट-अप नहीं किया गया है \:

+EarthApp.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² परिभाषा के साथ फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है \:
+EarthApp.26=कोई à¤à¤•à¥à¤¸à¤à¤®à¤à¤² फ़ाइल परिभाषा सेट अप नहीं किया गया है \:

+EarthApp.27=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ रूप से यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
+EarthApp.29=कोई à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ फ़ाइल सेट-अप नहीं किया गया है \:

+EarthApp.3=मà¥à¤à¥‡ बाद में याद दिलाना +EarthApp.30=उपकरण> गà¥à¤£ मेनू में फ़ाइल सà¥à¤¥à¤¾à¤¨ को ठीक करें . +EarthApp.4=अभी अदà¥à¤¯à¤¤à¤¨ करें +EarthApp.5=मà¥à¤à¥‡ दà¥à¤¬à¤¾à¤°à¤¾ याद मत दिलाना +EarthApp.57=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ का à¤à¤• नया संसà¥à¤•रण उपलबà¥à¤§ है\!
आप कैसे आगे बढ़ना चाहते हैं? +EarthApp.58=अदà¥à¤¯à¤¤à¤¨ चेतावनी +EarthApp.59= परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ +EarthApp.6=\ - संसà¥à¤•रण +EarthApp.61=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ फाइल खà¥à¤² नहीं सकती .
कृपया सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करें कि गूगल अरà¥à¤¥ सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ है. +EarthSurveyService.9=आवशà¥à¤¯à¤• कà¥à¤·à¥‡à¤¤à¥à¤° +ExportActionListener.1= तारीख चूनें जबसे रिकॉरà¥à¤¡ निरà¥à¤¯à¤¾à¤¤ करने है +ExportDialogProcessMonitor.0=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... +ExportDialogProcessMonitor.1=पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ पà¥à¤°à¤¾à¤°à¤‚भ करने के लिठपà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ कर रहा है \: +ExportDialogProcessMonitor.4=निरà¥à¤¯à¤¾à¤¤ रिकॉरà¥à¤¡\: +ImportProcessMonitorDialog.0=आयातित रिकॉरà¥à¤¡ \: +ImportActionListener.0=कà¥à¤¯à¤¾ उन भूखंडों के लिठडेटा जो कि पूरी तरह से भरे नहीं गठ,आयातित किया जाना चाहिà¤? +ImportActionListener.2=आप कà¥à¤²à¤¿à¤• करें, नहींतो केवल डेटा "हरी" राजà¥à¤¯ में भूखंडों से ,जिसमें सभी डेटा यà¥à¤•à¥à¤¤ है , आयात किया जाà¤à¤—ा। +ImportDialogProcessMonitor.0=\ गणना +ImportDialogProcessMonitor.11=रिकॉरà¥à¤¡ की पà¥à¤°à¤¾à¤°à¤‚भिक संखà¥à¤¯à¤¾ \: +ImportDialogProcessMonitor.2=रिकॉरà¥à¤¡ आयात... +ImportDialogProcessMonitor.5=आयातित रिकॉरà¥à¤¡ की वासà¥à¤¤à¤µà¤¿à¤• संखà¥à¤¯à¤¾ \: +ImportDialogProcessMonitor.8=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... +InfiniteProgressMonitor.0=रदà¥à¤¦ ऑपरेशन +JFileChooserExistsAware.0=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ परियोजना फ़ाइल +KmlImportService.13=पà¥à¤²à¥‰à¤Ÿ सà¥à¤¥à¤¾à¤¨à¥‹à¤‚ को बचाने के लिठà¤à¤• सीà¤à¤¸à¤µà¥€ फ़ाइल का चयन करें +MissingPlotsListener.0=तà¥à¤°à¥à¤Ÿà¤¿ उन भूखंडों के बारे में जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ करने के लिठजो डेटाबेस पर मौजूद नहीं +MissingPlotsListener.1=गà¥à¤® भूखंड +MissingPlotsListener.10=सेमà¥à¤ªà¤² डिजाइन में भूखंडों की कà¥à¤² संखà¥à¤¯à¤¾ \: +MissingPlotsListener.12=गà¥à¤® भूखंडों की संखà¥à¤¯à¤¾ \: +MissingPlotsListener.14=सभी भूखंडों भर रहे हैं\! +MissingPlotsListener.2=कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ अंतरà¥à¤µà¤¸à¥à¤¤à¥ की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ +MissingPlotsListener.3=भूखंड की जानकारी वाले फ़ाइलें चà¥à¤¨à¥‡à¤‚ ( .सीà¤à¤¸à¤µà¥€ या .सीईडी फ़ाइलें ) जिसके लिठआप जानना चाहते हैं तो सभी डेटा भर दिया गया है चाहता हूà¤. +MissingPlotsListener.4=गà¥à¤® भूखंड- जानकारी +MissingPlotsListener.5=फ़ाइल से \: +MissingPlotsListener.6=सीà¤à¤¡à¥€ फ़ाइल में निरà¥à¤¯à¤¾à¤¤ करें +ProcessMonitorDialog.1=पंकà¥à¤¤à¤¿ संखà¥à¤¯à¤¾ पर तà¥à¤°à¥à¤Ÿà¤¿ +ProcessMonitorDialog.4=, कॉलम +ProcessMonitorDialog.5=\ --मूलà¥à¤¯ +YES= हां +YES_TO_ALL=सब को हां +NO=नहीं +NO_TO_ALL=सभी को नहीं From 1f8c3336f74086941817d2ab0b6f5362d5973565 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:36:52 +0100 Subject: [PATCH 0824/1620] New translations Messages_pt.properties (Portuguese) --- .../earth/app/view/Messages_pt.properties | 480 ++++++++++-------- 1 file changed, 255 insertions(+), 225 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index f0355142d0..c2ce51b7bd 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,225 +1,255 @@ -AboutDialog.19=कोई समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ -AboutDialog.5=अधिक जानकारी के लिठहमारी वेबसाइट पर जाà¤? OpenForis.org? -AboutDialog.6=कà¥à¤·à¤®à¤¾ करें, à¤à¤• समसà¥à¤¯à¤¾ आपके सिसà¥à¤Ÿà¤® के मानक बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में इस लिंक को खोलने की कोशिश कर रही है. -AboutDialog.8=ठीक -AspectCode.0=उतà¥à¤¤à¤° दिशा -AspectCode.1=उतà¥à¤¤à¤°-पूरà¥à¤µ दिशा -AspectCode.2=पूरà¥à¤µ दिशा -AspectCode.3=दकà¥à¤·à¤¿à¤£-पूरà¥à¤µ दिशा -AspectCode.4=दकà¥à¤·à¤¿à¤£ दिशा -AspectCode.5=दकà¥à¤·à¤¿à¤£-पशà¥à¤šà¤¿à¤® दिशा -AspectCode.6=पशà¥à¤šà¤¿à¤® दिशा -AspectCode.7=उतà¥à¤¤à¤°-पशà¥à¤šà¤¿à¤® दिशा -CollectEarthWindow.0=तà¥à¤°à¥à¤Ÿà¤¿ जब सीà¤à¤¸à¤µà¥€ फ़ाइल में डेटा निरà¥à¤¯à¤¾à¤¤ करने का पà¥à¤°à¤¯à¤¾à¤¸ -CollectEarthWindow.1=निरà¥à¤¯à¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.10=फ़ाइल -CollectEarthWindow.11=बाहर जाà¤à¤‚ -CollectEarthWindow.12=उपकरण -CollectEarthWindow.13=डेटा सीà¤à¤¸à¤µà¥€ निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.14=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ -CollectEarthWindow.15=गà¥à¤£ -CollectEarthWindow.16=मदद -CollectEarthWindow.17=असà¥à¤µà¥€à¤•रण -CollectEarthWindow.18=डेटाबेस में लापता भूखंडों खोजें -CollectEarthWindow.19=पृथà¥à¤µà¥€ इकटà¥à¤ à¤¾ -CollectEarthWindow.2=भाषा -CollectEarthWindow.20=डà¥à¤ªà¥à¤²à¤¿à¤•ेट रिकॉरà¥à¤¡ की संखà¥à¤¯à¤¾\: -CollectEarthWindow.21=मà¥à¤–à¥à¤¯ फà¥à¤°à¥‡à¤® के लिठआइकन नहीं मिल सकता है -CollectEarthWindow.22=आपको लगता है कि आप à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ बंद करना चाहते हैं? विंडोज बंद करने से, à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° बंद हो जाà¤à¤—ा -CollectEarthWindow.23=पà¥à¤·à¥à¤Ÿà¤¿ की जरूरत है -CollectEarthWindow.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.25=आप वैसे भी इन अभिलेखों को जोड़ना चाहते हैं और अपने वरà¥à¤¤à¤®à¤¾à¤¨ डेटा खोने के लिठकिलक करना चाहते हैं? -CollectEarthWindow.26=ऑपरेटर,पà¥à¤°à¤šà¤¾à¤²à¤• -CollectEarthWindow.27=अदà¥à¤¯à¤¤à¤¨ -CollectEarthWindow.28= औपन फौरिस à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° चल रहा होना चाहिठ, जबभी ऑपरेटर डेटा की वà¥à¤¯à¤¾à¤–à¥à¤¯à¤¾ करें . -CollectEarthWindow.29=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. -CollectEarthWindow.3= आयात संबंधी तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.30=जबभी आप गà¥à¤—ल अरà¥à¤¥ का उपयोग कर रहे हैं, कृपया इस विंडोज को खà¥à¤²à¥€ बनाठरखें. -CollectEarthWindow.31=à¤à¤•तà¥à¤° डेटा सीà¤à¤¸à¤µà¥€ फाइल में भेजें -CollectEarthWindow.32=छोड़ना -CollectEarthWindow.33=ऑपरेटर का नाम के 5 अकà¥à¤·à¤° से बड़ा और 50 अकà¥à¤·à¤° से कम होना चाहिठ-CollectEarthWindow.34=मानà¥à¤¯à¤¤à¤¾ तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.35=ऑपरेटर नाम खाली\!
कृपया ऑपरेटर का नाम भरें और "अदà¥à¤¯à¤¤à¤¨" बटन दबाà¤à¤. -CollectEarthWindow.36=ऑपरेटर नाम रिकà¥à¤¤ नहीं हो सकता -CollectEarthWindow.37=खà¥à¤²à¤¾ रखो -CollectEarthWindow.38=सीà¤à¤¸à¤µà¥€ फ़ाइल -CollectEarthWindow.39=सूचना\: यह सलाह दी जाती है कि आप नठडेटा डालने करने से पहले अपने मौजूदा आंकडों को बैकअप(à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤) कर लें -CollectEarthWindow.4=à¤à¤«à¤à¤“ असà¥à¤µà¥€à¤•रण नोटिस -CollectEarthWindow.40=उस फ़ोलà¥à¤¡à¤° पर जाà¤à¤‚ जहां साà¤à¤•ॠसरà¥à¤µà¤° में सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ किया गया है, फ़ोलà¥à¤¡à¤° का रासà¥à¤¤à¤¾ उपकरण> गà¥à¤£> उनà¥à¤¨à¤¤ टैब. -CollectEarthWindow.41=निरà¥à¤¯à¤¾à¤¤ डेटा को फ़ाइल में बचाया जा रहा है \: -CollectEarthWindow.42=छोड़ना -CollectEarthWindow.43=परसà¥à¤ªà¤° विरोधी रिकॉरà¥à¤¡ पाया -CollectEarthWindow.44=डेटा आयात / निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.45=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ डेटा (संकà¥à¤šà¤¿à¤¤) -CollectEarthWindow.46=ज़िप से नठडेटा आयात करें (संकà¥à¤šà¤¿à¤¤ à¤à¤•à¥à¤¸à¤à¤®à¤à¤²) -CollectEarthWindow.55=सीà¤à¤¸à¤µà¥€ का उपयोग कर मौजूदा रिकॉरà¥à¤¡ को अपडेट करें -CollectEarthWindow.47=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. -CollectEarthWindow.48=ज़िप / à¤à¤•तà¥à¤°-डेटा फ़ाइल -CollectEarthWindow.49=फà¥à¤¯à¥‚जन सीà¤à¤¸à¤µà¥€ फ़ाइल -CollectEarthWindow.5=बंद करे -CollectEarthWindow.50= उपयोगकरà¥à¤¤à¤¾ मैनà¥à¤…ल खोलें -CollectEarthWindow.51=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ के अदà¥à¤¯à¤¤à¤¨ के लिठजाà¤à¤š करें -CollectEarthWindow.52= अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— लॉग फ़ाइल खोलें -CollectEarthWindow.53=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ लॉग फ़ाइल -CollectEarthWindow.54=केà¤à¤®à¤à¤² से लोड अंक -CollectEarthWindow.56=के विषय में... -CollectEarthWindow.57=साà¤à¤•ॠसà¥à¤Ÿà¤¾à¤°à¥à¤Ÿà¤° पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ अभी भी चल रहा है, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें. -CollectEarthWindow.58=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ नहीं कर सकते -CollectEarthWindow.59=आप साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ के लिठडेटा सेट फिर से उतà¥à¤ªà¤¨à¥à¤¨ करने के लिठकरना चाहते हैं?
यह पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ समय लेने वाली हो सकती है.
आप यदि "हाà¤"पर कà¥à¤²à¤¿à¤• करें, तो नवीनतम जानकारी के साथ à¤à¤• नया डाटासेट उतà¥à¤ªà¤¨à¥à¤¨ हो जाà¤à¤—ा. -CollectEarthWindow.6=फà¥à¤¯à¥‚जन टेबल के लिठनिरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.60=साà¤à¤•ॠडेटा उतà¥à¤ªà¤¨à¥à¤¨ -CollectEarthWindow.61=डेटा à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ (पिछले निरà¥à¤¯à¤¾à¤¤ के बाद से संशोधित रिकॉरà¥à¤¡) -CollectEarthWindow.62=के विषय मे... -CollectEarthWindow.63=केà¤à¤®à¤à¤² से अंक पà¥à¤°à¤¾à¤ªà¥à¤¤ करने में तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.64=तकनीकी सहायता -CollectEarthWindow.7=डेटा आयात में तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.8=असà¥à¤µà¥€à¤•रण पाठ नहीं पाया जा सका -CollectEarthWindow.9=डेटा आयात रिकॉरà¥à¤¡ वह है जो कि पहले से ही अपने डेटाबेस पर मौजूद हैं शामिल. -DynamicsCode.0=पà¥à¤°à¤¾à¤°à¤‚भ में वन -DynamicsCode.1=पà¥à¤°à¤¾à¤°à¤‚भ में घास का मैदान, -DynamicsCode.2=पà¥à¤°à¤¾à¤°à¤‚भ में आबादी वाला इलाका -DynamicsCode.3=पà¥à¤°à¤¾à¤°à¤‚भ में बंजर -DynamicsCode.4=पà¥à¤°à¤¾à¤°à¤‚भ में आरà¥à¤¦à¥à¤° भूमि -DynamicsCode.5=पà¥à¤°à¤¾à¤°à¤‚भ में खेत -OpenTextFileListener.0=इस पाठ का फ़ाइल नहीं मिला \: -OptionWizard.0= विकलà¥à¤ª -OptionWizard.1=बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° चà¥à¤¨à¥‡à¤‚ -OptionWizard.10=बैकअप फ़ोलà¥à¤¡à¤° खोलें -OptionWizard.11=अजà¥à¤žà¤¾à¤¤\: उपयोग ifconfig -OptionWizard.12=गà¥à¤°à¤¾à¤¹à¤•ों का उलà¥à¤²à¥‡à¤– -OptionWizard.13=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° आईपी -OptionWizard.14=कतà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ (उदाहरण- 8023) -OptionWizard.15=बचाà¤à¤‚ और परिवरà¥à¤¤à¤¨ लागू करें -OptionWizard.16=आईडी -OptionWizard.17=X- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क -OptionWizard.18=Y- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क -OptionWizard.19=उठान -OptionWizard.2=कारà¥à¤¯à¤ªà¥à¤°à¤µà¤¾à¤¹ (सरà¥à¤µà¤° / गà¥à¤°à¤¾à¤¹à¤•) -OptionWizard.20=गूगल अरà¥à¤¥ अंतरà¥à¤µà¤¸à¥à¤¤à¥ बदल दिया गया है
यदि गà¥à¤—ल अरà¥à¤¥ आप से कहे,अंतरà¥à¤µà¤¸à¥à¤¤à¥ पà¥à¤¨à¤ƒ लोड सà¥à¤µà¥€à¤•ार करें . -OptionWizard.21=अदà¥à¤¯à¤¤à¤¨ सफल -OptionWizard.22=ढाल -OptionWizard.23=गूगल अरà¥à¤¥ डेटा को फिर से खोलने में कोई तà¥à¤°à¥à¤Ÿà¤¿ थी -OptionWizard.24=रदà¥à¤¦ करना -OptionWizard.25=ऑपरेशन मोड -OptionWizard.26=डीबी होसà¥à¤Ÿ -OptionWizard.27=यह à¤à¤• मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ साà¤à¤•ॠफ़ोलà¥à¤¡à¤° नहीं है ( सà¥à¤Ÿà¤¾à¤°à¥à¤Ÿ-साà¤à¤•à¥.batफ़ाइल मौजूद नहीं है) -OptionWizard.28=साà¤à¤•ॠसरà¥à¤µà¤° मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ नहीं -OptionWizard.29=डीबी पोरà¥à¤Ÿ -OptionWizard.3=सरà¥à¤µà¤° आवृतà¥à¤¤à¤¿ -OptionWizard.30=à¤à¤¸à¤•à¥à¤¯à¥ लाइट विकलà¥à¤ª -OptionWizard.31=सेमà¥à¤ªà¤² डेटा -OptionWizard.32=पà¥à¤²à¥‰à¤Ÿ लेआउट -OptionWizard.33=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ परिभाषा -OptionWizard.34=विकसित -OptionWizard.35=सेमà¥à¤ªà¤² अंक की संखà¥à¤¯à¤¾ -OptionWizard.36=सेमà¥à¤ªà¤² बिंदॠके बीच दूरी (मीटर में) -OptionWizard.37=भूखंड की सीमा के साथ मारà¥à¤œà¤¿à¤¨ (मीटर मे) -OptionWizard.38=सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सही ढंग से पढ़ा नहीं जा सकता.
इस फ़ाइल में à¤à¤• अलà¥à¤ªà¤µà¤¿à¤°à¤¾à¤® से अलग मूलà¥à¤¯à¥‹à¤‚ की उमà¥à¤®à¥€à¤¦ है \:
-OptionWizard.39=आईडी, वाई समनà¥à¤µà¤¯, à¤à¤•à¥à¤¸ समनà¥à¤µà¤¯, ऊंचाई, ढाल, पहलू -OptionWizard.4=वरà¥à¤¤à¤®à¤¾à¤¨ कंपà¥à¤¯à¥‚टर आईपी \: -OptionWizard.40=परियोजनाà¤à¤‚ -OptionWizard.41=à¤à¤• नई परियोजना फ़ाइल लोड करें -OptionWizard.42=सीà¤à¤¸à¤µà¥€ पाठक को बंद करते समय तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.43=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ का नाम -OptionWizard.44= सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ बैकअप डेटाबेस -OptionWizard.45=ओपन पृथà¥à¤µà¥€ इंजन ने पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° में जूम किया -OptionWizard.46=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठपृथà¥à¤µà¥€ इंजन टाइमलैपà¥à¤¸ खोलें -OptionWizard.47=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठबिंग मैपà¥à¤¸ खोलें -OptionWizard.48=बजाय गूगल अरà¥à¤¥ के फॉरà¥à¤® à¤à¤• बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° पर खोलें (लिनकà¥à¤¸ के लिठसिफारिश) -OptionWizard.49=भूखंड डेटा के साथ सीईडी / सीà¤à¤¸à¤µà¥€ फाइल भेजने के लिठपथ -OptionWizard.5=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ\: -OptionWizard.50=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.51=परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.52=केवल निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क के साथ सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल -OptionWizard.53=चौकोर -OptionWizard.54=केनà¥à¤¦à¥à¤°à¥€à¤¯ बिनà¥à¤¦à¥ -OptionWizard.55=परियोजना फ़ोलà¥à¤¡à¤° आयात तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.56=लोड परियोजना -OptionWizard.57=पहले से लोड परियोजना -OptionWizard.58= जी ई ई का मैदान खोलें (विशà¥à¤µà¤¸à¤¨à¥€à¤¯ जांचकरà¥à¤¤à¤¾ के उपयोग की आवशà¥à¤¯à¤•ता है) -OptionWizard.59=यहां भूखंड पर केंदà¥à¤°à¤¿à¤¤ मैपà¥à¤¸ खोलें -OptionWizard.6=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² डीबी मापदंड -OptionWizard.65=साà¤à¤•à¥à¤«à¤¼à¥‹à¤²à¥à¤¡à¤° का पथ -OptionWizard.66=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.67=फ़ायरफ़ॉकà¥à¤¸ निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ -OptionWizard.68=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.7=उपयोगकरà¥à¤¤à¤¾ नाम -OptionWizard.70=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों -OptionWizard.72=बाइनरी फ़ाइलें -OptionWizard.73=कà¥à¤°à¥‹à¤® निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ -OptionWizard.74=बà¥à¤°à¤¾à¤‰à¤œ -OptionWizard.76=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों -OptionWizard.78=बाइनरी फ़ाइलें -OptionWizard.79=केà¤à¤®à¤à¤² फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ के लिठपथ -OptionWizard.8=पासवरà¥à¤¡ -OptionWizard.80=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.82=फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ -OptionWizard.83=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ पà¥à¤°à¤ªà¤¤à¥à¤° डिज़ाइन करने के लिठपथ -OptionWizard.84=बà¥à¤°à¤¾à¤‰à¤œ..... -OptionWizard.86=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² वेब पेज -OptionWizard.87=पथ आइडीà¤à¤® परिभाषा के साथ à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठ-OptionWizard.88=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.9=डीबी नाम -OptionWizard.90=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² आइडीà¤à¤® परिभाषा -OptionWizard.91=सरà¥à¤µà¤° (पà¥à¤°à¤¬à¤‚धक संसà¥à¤•रण या खड़े अकेले का उपयोग करें) -OptionWizard.92=कà¥à¤²à¤¾à¤‡à¤‚ट (ऑपरेटर / सरà¥à¤µà¤° से जà¥à¤¡à¤¼à¥‡) -OptionWizard.93=सकà¥à¤¯à¥‚à¤à¤²à¤¾à¤‡à¤Ÿ (à¤à¤‚बेडेड / à¤à¤•ल फाइल आधारित) -OptionWizard.94=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² -OptionWizard.95=सेमà¥à¤ªà¤² डॉटà¥à¤¸ के साइड (मीटर में) -SaikuAnalysisListener.0=हाठ- ताज़ा साà¤à¤•ॠडेटा (लंबी पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾) -SaikuAnalysisListener.1=नहीं - बस साà¤à¤•ॠशà¥à¤°à¥‚ -SaikuStarter.1=साà¤à¤•ॠशà¥à¤°à¥‚ -SaikuStarter.2= साà¤à¤•ॠशà¥à¤°à¥‚ कà¥à¤› मिनट लग सकते हैं, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें\! -SaveEarthDataServlet.0=खाली अनà¥à¤°à¥‹à¤§ -SaveEarthDataServlet.1= डेटाबेस में डेटा बचाते समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ है -SaveEarthDataServlet.2=डेटा बचाया था -SlopeCode.0=समतल (0-5) -EarthApp.11=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ पहले से ही चल रहा है -EarthApp.21=à¤à¤• सीà¤à¤¸à¤µà¥€ / सीईडी के रूप में भूखंडों की गà¥à¤°à¤¿à¤¡ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
-EarthApp.23=कोई सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सेट-अप नहीं किया गया है \:

-EarthApp.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² परिभाषा के साथ फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है \:
-EarthApp.26=कोई à¤à¤•à¥à¤¸à¤à¤®à¤à¤² फ़ाइल परिभाषा सेट अप नहीं किया गया है \:

-EarthApp.27=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ रूप से यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
-EarthApp.29=कोई à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ फ़ाइल सेट-अप नहीं किया गया है \:

-EarthApp.3=मà¥à¤à¥‡ बाद में याद दिलाना -EarthApp.30=उपकरण> गà¥à¤£ मेनू में फ़ाइल सà¥à¤¥à¤¾à¤¨ को ठीक करें . -EarthApp.4=अभी अदà¥à¤¯à¤¤à¤¨ करें -EarthApp.5=मà¥à¤à¥‡ दà¥à¤¬à¤¾à¤°à¤¾ याद मत दिलाना -EarthApp.57=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ का à¤à¤• नया संसà¥à¤•रण उपलबà¥à¤§ है\!
आप कैसे आगे बढ़ना चाहते हैं? -EarthApp.58=अदà¥à¤¯à¤¤à¤¨ चेतावनी -EarthApp.59= परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ -EarthApp.6=\ - संसà¥à¤•रण -EarthApp.61=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ फाइल खà¥à¤² नहीं सकती .
कृपया सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करें कि गूगल अरà¥à¤¥ सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ है. -EarthSurveyService.9=आवशà¥à¤¯à¤• कà¥à¤·à¥‡à¤¤à¥à¤° -ExportActionListener.1= तारीख चूनें जबसे रिकॉरà¥à¤¡ निरà¥à¤¯à¤¾à¤¤ करने है -ExportDialogProcessMonitor.0=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... -ExportDialogProcessMonitor.1=पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ पà¥à¤°à¤¾à¤°à¤‚भ करने के लिठपà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ कर रहा है \: -ExportDialogProcessMonitor.4=निरà¥à¤¯à¤¾à¤¤ रिकॉरà¥à¤¡\: -ImportProcessMonitorDialog.0=आयातित रिकॉरà¥à¤¡ \: -ImportActionListener.0=कà¥à¤¯à¤¾ उन भूखंडों के लिठडेटा जो कि पूरी तरह से भरे नहीं गठ,आयातित किया जाना चाहिà¤? -ImportActionListener.2=आप कà¥à¤²à¤¿à¤• करें, नहींतो केवल डेटा "हरी" राजà¥à¤¯ में भूखंडों से ,जिसमें सभी डेटा यà¥à¤•à¥à¤¤ है , आयात किया जाà¤à¤—ा। -ImportDialogProcessMonitor.0=\ गणना -ImportDialogProcessMonitor.11=रिकॉरà¥à¤¡ की पà¥à¤°à¤¾à¤°à¤‚भिक संखà¥à¤¯à¤¾ \: -ImportDialogProcessMonitor.2=रिकॉरà¥à¤¡ आयात... -ImportDialogProcessMonitor.5=आयातित रिकॉरà¥à¤¡ की वासà¥à¤¤à¤µà¤¿à¤• संखà¥à¤¯à¤¾ \: -ImportDialogProcessMonitor.8=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... -InfiniteProgressMonitor.0=रदà¥à¤¦ ऑपरेशन -JFileChooserExistsAware.0=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ परियोजना फ़ाइल -KmlImportService.13=पà¥à¤²à¥‰à¤Ÿ सà¥à¤¥à¤¾à¤¨à¥‹à¤‚ को बचाने के लिठà¤à¤• सीà¤à¤¸à¤µà¥€ फ़ाइल का चयन करें -MissingPlotsListener.0=तà¥à¤°à¥à¤Ÿà¤¿ उन भूखंडों के बारे में जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ करने के लिठजो डेटाबेस पर मौजूद नहीं -MissingPlotsListener.1=गà¥à¤® भूखंड -MissingPlotsListener.10=सेमà¥à¤ªà¤² डिजाइन में भूखंडों की कà¥à¤² संखà¥à¤¯à¤¾ \: -MissingPlotsListener.12=गà¥à¤® भूखंडों की संखà¥à¤¯à¤¾ \: -MissingPlotsListener.14=सभी भूखंडों भर रहे हैं\! -MissingPlotsListener.2=कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ अंतरà¥à¤µà¤¸à¥à¤¤à¥ की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ -MissingPlotsListener.3=भूखंड की जानकारी वाले फ़ाइलें चà¥à¤¨à¥‡à¤‚ ( .सीà¤à¤¸à¤µà¥€ या .सीईडी फ़ाइलें ) जिसके लिठआप जानना चाहते हैं तो सभी डेटा भर दिया गया है चाहता हूà¤. -MissingPlotsListener.4=गà¥à¤® भूखंड- जानकारी -MissingPlotsListener.5=फ़ाइल से \: -MissingPlotsListener.6=सीà¤à¤¡à¥€ फ़ाइल में निरà¥à¤¯à¤¾à¤¤ करें -ProcessMonitorDialog.1=पंकà¥à¤¤à¤¿ संखà¥à¤¯à¤¾ पर तà¥à¤°à¥à¤Ÿà¤¿ -ProcessMonitorDialog.4=, कॉलम -ProcessMonitorDialog.5=\ --मूलà¥à¤¯ -YES= हां -YES_TO_ALL=सब को हां -NO=नहीं -NO_TO_ALL=सभी को नहीं +AboutDialog.19=Ocorreu um problema +AboutDialog.5=Para mais informações visite nosso site OpenForis.org +AboutDialog.6=Desculpe, um problema ocorreu ao tentar abrir esse link no seu navegador padrão. +AboutDialog.8=Ok +AspectCode.0=Norte +AspectCode.1=Nordeste +AspectCode.2=Leste +AspectCode.3=Sudeste +AspectCode.4=Sul +AspectCode.5=Sudoeste +AspectCode.6=Oeste +AspectCode.7=Noroeste +CollectEarthMenu.0=Importar Arquivo CEP +CollectEarthMenu.2=Utilidades +CollectEarthMenu.3=Separar arquivo CSV em partes +CollectEarthMenu.4=Exportar dados para XML (da data específica até o tempo presente) +CollectEarthMenu.5=Exportar para Collect Backup +CollectEarthMenu.6=Exportar dados como Collect Backup (todos os dados) +CollectEarthMenu.7=Exportar dados como Collect Backup (a partir de uma data) +CollectEarthMenu.8=Exportar dados para XML (filtrar por atributo) +CollectEarthWindow.0=Erro ao tentar exportar os dados para um arquivo CSV +CollectEarthWindow.10=Arquivo +CollectEarthWindow.11=Fechar +CollectEarthWindow.12=Ferramentas +CollectEarthWindow.13=Baixar dados para CSV (Excel) +CollectEarthWindow.14=Iniciar Análise SAIKU +CollectEarthWindow.15=Propiedades +CollectEarthWindow.16=Ajuda +CollectEarthWindow.17=Declaração +CollectEarthWindow.18=Encontrar parcelas ausentes em banco de dados +CollectEarthWindow.19=Collect Earth +CollectEarthWindow.1=Erro ao exportar +CollectEarthWindow.20=Número de registros duplicados\: +CollectEarthWindow.21=Não foi possível encontrar o ícone para a janela principal +CollectEarthWindow.22=Tem certeza de querer fechar Collect Earth?
Ao fechar a janela será fechada também o servidor de Collect Earth +CollectEarthWindow.23=Confirmação requerida +CollectEarthWindow.24=Exportar a XML +CollectEarthWindow.25=Quer importar estes registros de qualquer maneira e perder o seus dados atuais? +CollectEarthWindow.26=Operador +CollectEarthWindow.27=Atualizar +CollectEarthWindow.28=O servidor Open Foris Collect Earth deve estar em execução enquanto o operador interprete os dados. +CollectEarthWindow.29=O servidor Saiku não está configurado. +CollectEarthWindow.2=Idioma +CollectEarthWindow.30=Por favor mantenha esta janela aberta enquanto estiver usando o Google Earth. +CollectEarthWindow.31=Exportar os dados coletados para um arquivo CSV +CollectEarthWindow.32=Fechar +CollectEarthWindow.33=O nome do operador deve ser maior de que 5 caracteres e mais curto do que 50 +CollectEarthWindow.34= Erro de Validação +CollectEarthWindow.35=NOME DO OPERADOR VAZIO\!
Preencha o nome do operador e clique no botão "Atualizar". +CollectEarthWindow.36=Nome do operador não pode estar vazio +CollectEarthWindow.37=Permanecer Aberto +CollectEarthWindow.38=Arquivos de CSV +CollectEarthWindow.39=AVISO\:Se recomenda de fazer um back-up dos seus dados atuais(Exportar para XML) antes de importar os novos dados +CollectEarthWindow.3=\ Erro ao importar dados. +CollectEarthWindow.40=Configurar caminho para o arquivo onde o Servidor Saiku se encontra instalado em Ferramentas->Propiedades->Avançado. +CollectEarthWindow.41=Guardar dados exportados para o arquivo\: +CollectEarthWindow.42=Sair +CollectEarthWindow.43=Registros repetidos detectados +CollectEarthWindow.44=Importar/Exportar +CollectEarthWindow.45=Exportar dados para XML (comprimidos) +CollectEarthWindow.46=Importar novos dados do ZIP (XML comprimidos) +CollectEarthWindow.47=Servidor Saiku não configurado +CollectEarthWindow.48=Arquivos ZIP +CollectEarthWindow.49=Arquivos Fusion CSV +CollectEarthWindow.4=Isenção de responsabilidade da FAO +CollectEarthWindow.50=Abrir Manual de Usuário +CollectEarthWindow.51=Verificar atualizações de Collect Earth +CollectEarthWindow.52=Abrir Arquivo de Registro da aplicação +CollectEarthWindow.53=Arquivo de Registro de Collect Earth +CollectEarthWindow.54=Carregar pontos de KML +CollectEarthWindow.55=Atualizar registros atuais usando CSV +CollectEarthWindow.56=Sobre... +CollectEarthWindow.57=O processo de arranque de Saiku ainda está em execução, por favor aguarde. +CollectEarthWindow.58=Não é possível iniciar a análise com Saiku +CollectEarthWindow.59=Quer voltar a gerar o conjunto de dados para o análise de Saiku?
Este processo pode demorar vários minutos.
Se clicar em "SIM" um novo conjunto de dados com a mais recente informação será gerada. +CollectEarthWindow.5=Fechar +CollectEarthWindow.60=Geraço de dados para Saiku +CollectEarthWindow.61=Exportar dados para XML (apenas os registros adicionados/modificados) +CollectEarthWindow.62=Sobre... +CollectEarthWindow.63=Erro acessando pontos de KML +CollectEarthWindow.64=Suporte Técnico +CollectEarthWindow.65=O nome do operador foi alterado +CollectEarthWindow.66=Nome do operador +CollectEarthWindow.67=Abra a pasta de dados do CE +CollectEarthWindow.6=Exportar dados a Fusion Table +CollectEarthWindow.70=Abra o manuel desta pesquisa +CollectEarthWindow.71=Gerar ferramenta Saiku Independente +CollectEarthWindow.7=Erro ao importar os dados +CollectEarthWindow.8=Texto de isenção não foi possivel de ser encontrado +CollectEarthWindow.9=Os dados importados contém registros que já estão presentes no seu banco de dados. +DynamicsCode.0=Inicialmente Floresta +DynamicsCode.1=Inicialmente Ãrea de Pastagem +DynamicsCode.2=Inicialmente Ãrea Urbana +DynamicsCode.3=Inicialmente Outros +DynamicsCode.4=Inicialmente Ãrea Alagada +DynamicsCode.5=Inicialmente Ãrea Agrícola +EarthApp.11=Collect Earth já está em execução +EarthApp.21=O arquivo contendo o gride de pontos como CSV/CED não foi encontrado no caminho selecionado\:
+EarthApp.23=Nenhum arquivo CSV/CED foi configurado \:

+EarthApp.24=O arquivo contendo o modelo Freemarker com a definição KML não foi encontrado no caminho selecionado \:
+EarthApp.26=Nenhum arquivo de definição KML foi configurado \:

+EarthApp.27=O arquivo contendo o formato balão HTML não foi encontrado no caminho selecionado \:
+EarthApp.29=Nenhum arquivo balão HTML foi configurado \:

+EarthApp.30=Por favor corrija a localização do arquivo no menu Ferramentas->Propriedades. +EarthApp.3=Lembrar mais tarde +EarthApp.4=Atualizar Agora +EarthApp.57=Existe uma nova versão do Collect Earth disponível\!
Como gostaria de proceder? +EarthApp.58=Alerta de Atualização +EarthApp.59=Erro ao importar aquivo do projeto +EarthApp.5=Não me lembre novamente +EarthApp.61=O arquivo do Collect Earth não pôde ser aberto.
Por favor certifique-se que Google Earth esteja instalado. +EarthApp.6= - Versão +EarthApp.70=AVISO +EarthApp.71=No Mac OS X, os arquivos do projeto Collect Earth (* .cep) não serão abertos no Collect Earth quando forem clicados duas vezes.
+EarthApp.72=Use a barra de ferramentas Collect Earth para abrir os arquivos .cep \: +EarthApp.73=Collect Earth - problemas em computadores Mac OS X +EarthSurveyService.9=Campo obrigatório +ExportActionListener.1=Escolha data a partir da qual queira exportar os dados +ExportDialogProcessMonitor.0=Processando os dados... +ExportDialogProcessMonitor.1=Esperando de inicializar o processo \: +ExportDialogProcessMonitor.4=Registros importados \: +ImportActionListener.0=Deseja importar os dados das parcelas que não tenham sido completamente preenchidos? +ImportActionListener.2=Se clicar NÃO apenas os dados das parcelas em estado completo ("verde"), serão importados. +ImportActionListener.3=Importar registros incompletos +ImportDialogProcessMonitor.0=\ CALCULANDO +ImportDialogProcessMonitor.11=Cifra inicial de registros \: +ImportDialogProcessMonitor.2=Importando registros.... +ImportDialogProcessMonitor.5=Cifra final de registros importados \: +ImportDialogProcessMonitor.8=Processando dados... +ImportProcessMonitorDialog.0=Imported records \: +ImportXMLDialogProcessMonitor.1 = Substitua dados no banco de dados +ImportXMLDialogProcessMonitor.2 = Importe apenas registros não conflitantes +InfiniteProgressMonitor.0=Cancelar operação +JFileChooserExistsAware.0=Arquivo de projeto Collect Earth +KmlImportService.13=Selecione um arquivo CSV para salvar a localização dos pontos +MissingPlotsListener.0=Erro ao obter informação sobre parcelas ausentes na Base de Dados +MissingPlotsListener.10=Número total de ppontos no desenho de amostragem \: +MissingPlotsListener.12=Número de pontos perdidos \: +MissingPlotsListener.14=Todos os pontos foram preenchidos\! +MissingPlotsListener.1=Parcelas ausentes +MissingPlotsListener.2=Copiar conteúdos +MissingPlotsListener.3=Escolha os arquivos contendo informação sobre as parcelas ( .csv or .ced files ) para os quais deseja saber se todos os dados foram preenchidos. +MissingPlotsListener.4=Parcelas ausentes - informação +MissingPlotsListener.5=Do arquivo \: +MissingPlotsListener.6=Exportar para arquivo CED +NO=Não +NO_TO_ALL=Não para todos +OpenTextFileListener.0=O arquivo de texto não foi encontrado em \: +OptionWizard.0=Opções do Collect Earth +OptionWizard.100=Abrir Planet +OptionWizard.101=Llave da API do Planet +OptionWizard.1021=URL SecureWatch +OptionWizard.102=Abrir Maxar SecureWatch +OptionWizard.103=Configure o URL para o Mapa Extra (abre quando configurado) \: +OptionWizard.104=Navegadores +OptionWizard.105=Abrir Earth Map +OptionWizard.110=Use imagens mensais fornecidas pela NICFI +OptionWizard.10=Abrir arquivo de backup +OptionWizard.11=Desconhecido\: usar ifconfig +OptionWizard.12=Cliente Instância +OptionWizard.13=Collect Earth Server IP +OptionWizard.14=Collect Earth Porta de Servidor (p.ex. 8023) +OptionWizard.15=Guardar & Aplicar alteraçães +OptionWizard.16=ID +OptionWizard.17=X-coord +OptionWizard.18=Y-coord +OptionWizard.19=Elevação +OptionWizard.1=Escolher Navegador +OptionWizard.20= Os conteúdos de Google Earth foram alterados.
Por favor aceite a regarga do conteúdo uma vez que Google Earth lhe pergunte. +OptionWizard.21=Atualizado com sucesso +OptionWizard.22=Relevo +OptionWizard.23=Houve um erro ao reabrir os dados de Google Earth +OptionWizard.24=Cancelar +OptionWizard.25=Modo de Operação +OptionWizard.26=BBDD servidor +OptionWizard.27=Isto não é um Arquivo Saiku reconhecível (o arquivo start-saiku.bat não se encontra presente) +OptionWizard.28=Servidor Saiku não reconhecível +OptionWizard.29=BBDD porta +OptionWizard.2=Tipo de uso(servidor/cliente) +OptionWizard.30=Opçães SQLite +OptionWizard.31=Dados de amostra +OptionWizard.32=Disposição da Parcela +OptionWizard.33=Definiço de Questionários +OptionWizard.34=Serviços Integrados +OptionWizard.35=Número de pontos de control +OptionWizard.36=Distância entre os pontos de control (em metros) +OptionWizard.37=Margem com o perímetro da parcela (em metros) +OptionWizard.38=O arquivo CSV/CED não foi possivel ser lido corretamente.
O arquivo deve conter valores separados por vírgulas do seguinte modo\:
+OptionWizard.39=ID,Y-Coordenada,X-Coordenada,elevação,relevo,orientação +OptionWizard.3=Servidor Instance +OptionWizard.40=Projetos +OptionWizard.41=Carregar um novo arquivo de projeto +OptionWizard.42=Erro ao fechar o leitor CSV +OptionWizard.43=Nome do questionário +OptionWizard.44=Realizar automaticamente backup do banco de dados em +OptionWizard.45=Abrir Earth Engine Playground (descontinuado) +OptionWizard.46=Abrir Earth Engine Timelapse +OptionWizard.47=Abrir Bing Maps +OptionWizard.48=Abrir formulário em um navegador externo em vez de Google Earth (recomendado para LINUX) +OptionWizard.49=Caminho do arquivo CED/CSV com as coordenadas das parcelas +OptionWizard.4=IP do computador atual\: +OptionWizard.50=Navegar.. +OptionWizard.51=Erro ao importar os arquivos do projeto +OptionWizard.52= Arquivo CSV/CED com coordinadas +OptionWizard.53=Sem pontos +OptionWizard.54=Ponto Central +OptionWizard.55=Erro ao importar diretório do projeto +OptionWizard.56=Carregar projeto +OptionWizard.57=Projetos previamente carregados +OptionWizard.58=Abrir GEE Code Editor (requer acesso ao Trusted Tester) +OptionWizard.59=Abrir Here Maps focado no ponto +OptionWizard.5= Collect Earth Servidor porto\: +OptionWizard.65=Caminho para arquivo Saiku +OptionWizard.66=Navegar... +OptionWizard.67=Caminho para o executável do Firefox +OptionWizard.68=Navegar... +OptionWizard.6=Parâmetros BD PostgreSQL +OptionWizard.70=Arquivos executáveis +OptionWizard.72=Arquivos binários +OptionWizard.73=Caminho para o executável do Chrome +OptionWizard.74=Navegar... +OptionWizard.76=Arquivos executáveis +OptionWizard.78=Arquivos binarios +OptionWizard.79=Caminho para o padrão de KML Freemarker +OptionWizard.7=Nome de Usuário +OptionWizard.80=Navegar... +OptionWizard.82=Padrão Freemarker +OptionWizard.83=Caminho para formulário HTML Balloon +OptionWizard.84=Navegar... +OptionWizard.86=Pagina web HTML +OptionWizard.87=Caminho para XML com definição IDM +OptionWizard.88=Navegar... +OptionWizard.8=Senha +OptionWizard.90=Definiço XML IDM +OptionWizard.91=Servidor (versão para gerente ou uso autônomo) +OptionWizard.92=Cliente (operador/conectado ao servidor) +OptionWizard.93=SQLite (Embutido/com base em um único arquivo) +OptionWizard.94=PostgreSQL +OptionWizard.95=Side of the sampling dots (in meters) +OptionWizard.9= Nome da Base de Dados +ProcessMonitorDialog.1=Erro de análise na linha número +ProcessMonitorDialog.4=, colunas +ProcessMonitorDialog.5= -- valores +SaikuAnalysisListener.0=Sim - Atualizar dados Saiku (longo processo) +SaikuAnalysisListener.1=Não - Use a mesma versão dos dados da última vez que o Saiku foi usado +SaikuToolExportListener.1=Geração da ferramenta Saiku +SaikuToolExportListener.2=Gerando a Ferramenta Saiku com o banco de dados atual +SaikuStarter.1=Iniciando Saiku +SaikuStarter.2=Iniciando Saiku pode demorar uns minutos, por favor aguarde\! +SaveEarthDataServlet.0=Sem dados +SaveEarthDataServlet.1=Problema ocorreu ao guardar os dados na Base de Dados +SaveEarthDataServlet.2=Os dados foram guardados +SlopeCode.0=Plano (0-5) +YES=Sim +YES_TO_ALL=Sim a todas \ No newline at end of file From 616789fcbaa6d234b5047fce05277f5433b9c7cc Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:36:53 +0100 Subject: [PATCH 0825/1620] New translations utf8_orig_Messages_hi.properties (English) --- .../earth/app/view/Messages_en.properties | 446 +++++++++--------- 1 file changed, 225 insertions(+), 221 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 5110140e9c..f0355142d0 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,221 +1,225 @@ -AboutDialog.19=Äã có lá»—i -AboutDialog.5=Truy cập website cá»§a chúng tôi để biết thêm thông tin OpenForis.org -AboutDialog.6=Xin lá»—i, đã có sá»± cố khi mở link trong brower chuẩn trong hệ thống cá»§a bạn. -AboutDialog.8=Ok -AspectCode.0=Bắc -AspectCode.1=Äông-Bắc -AspectCode.2=Äông -AspectCode.3=Äông-Nam -AspectCode.4=Nam -AspectCode.5=Tây-Nam -AspectCode.6=Tây -AspectCode.7=Tây-Bắc -CollectEarthWindow.0=Lá»—i khi xuất dữ liệu sang file CSV -CollectEarthWindow.1=Lá»—i xuất dữ liệu -CollectEarthWindow.10=File -CollectEarthWindow.11=Thoát -CollectEarthWindow.12=Công cụ -CollectEarthWindow.13=Xuất dữ liệu ra CSV -CollectEarthWindow.14=Khởi động SAIKU Analysis -CollectEarthWindow.15=Thuá»™c tính -CollectEarthWindow.16=Trợ giúp -CollectEarthWindow.17=Thông tin công bố -CollectEarthWindow.18=Tìm ô thiếu trong cÆ¡ sở dữ liệu -CollectEarthWindow.19=Collect Earth -CollectEarthWindow.2=Ngôn ngữ -CollectEarthWindow.20=Số bản ghi trùng\: -CollectEarthWindow.21=Không tìm thấy biểu tượng cho khung chính -CollectEarthWindow.22=Bạn có chắc là muốn đóng Collect Earth?
Äóng cá»­a sổ cÅ©ng đóng luôn máy chá»§ Collect Earth -CollectEarthWindow.23=Cần khẳng định -CollectEarthWindow.24=Xuất ra XML -CollectEarthWindow.25=Bạn có muốn thêm các bản ghi này và bá» Ä‘i dữ liệu hiện thá»i không? -CollectEarthWindow.26=Ngưá»i sá»­ dụng -CollectEarthWindow.27=Cập nhật -CollectEarthWindow.28=Máy chá»§ Open Foris Collect Earth phải chạy khi ngưá»i sá»­ dụng giải Ä‘oán dữ liệu. -CollectEarthWindow.29=Chưa xác định cấu hình cho Máy chá»§ Saiku. -CollectEarthWindow.3=\ Lá»—i nhập -CollectEarthWindow.30=Äể mở cá»­a sổ này khi Ä‘ang sá»­ dụng Google Earth. -CollectEarthWindow.31=Xuất dữ liệu đã thu thập sang file CSV -CollectEarthWindow.32=Thoát -CollectEarthWindow.33=Tên ngưá»i sá»­ dụng phải dài hÆ¡n 5 chữ cái và ngắn hÆ¡n 50 chữ cái -CollectEarthWindow.34=Lá»—i kiểm chứng -CollectEarthWindow.35=TÊN NGƯỜI SỬ DỤNG CÃ’N TRá»NG\!
Hãy Ä‘iá»n tên ngưá»i sá»­ dụng và nhắp phím "Update". -CollectEarthWindow.36=Không được để trống phần tên ngưá»i sá»­ dụng -CollectEarthWindow.37=Äể mở -CollectEarthWindow.38=file CSV -CollectEarthWindow.39=THÔNG BÃO\: Nên lưu dá»± phòng dữ liệu hiện thá»i(Xuất ra XML) trước khi nhập dữ liệu má»›i -CollectEarthWindow.4=Thông tin công bố cá»§a FAO -CollectEarthWindow.40=Thiết lập đưá»ng dẫn tá»›i thư mục cài đặt Saiku Server trong Tools->Properties->Advanced tab. -CollectEarthWindow.41=Ghi dữ liệu xuất ra vào file\: -CollectEarthWindow.42=Thoát -CollectEarthWindow.43=Tìm thấy bản ghi có mâu thuẫn -CollectEarthWindow.44=Nhập/Xuất dữ liệu -CollectEarthWindow.45=Xuất dữ liệu ra XML (nén) -CollectEarthWindow.46=Nhập dữ liệu má»›i từ file ZIP (XML nén) -CollectEarthWindow.55=Cập nhật các bản ghi hiện thá»i bằng CSV -CollectEarthWindow.47=Chưa định cấu hình cho Saiku Server -CollectEarthWindow.48=Zip/collect-data files -CollectEarthWindow.49=Files CSV tổng hợp -CollectEarthWindow.5=Äóng -CollectEarthWindow.50=Mở hướng dẫn ngưá»i sá»­ dụng -CollectEarthWindow.51=Kiểm tra cập nhật cá»§a Collect Earth -CollectEarthWindow.52=Mở file nhật ký ứng dụng -CollectEarthWindow.53=File nhật ký cá»§a Collect Earth -CollectEarthWindow.54=Nạp các Ä‘iểm từ KML -CollectEarthWindow.56=Vá»... -CollectEarthWindow.57=Äang chạy quá trình khởi động Saiku, xin đợi. -CollectEarthWindow.58=Không thể khởi động Saiku analysis -CollectEarthWindow.59=Bạn có muốn tạo lại bá»™ dữ liệu cho Saiku analysis không?
Quá trình này sẽ mất một vài phút.
Nếu bạn chá»n "YES" sẽ tạo ra má»™t bá»™ dữ liệu má»›i vá»›i các thông tin cập nhật nhất. -CollectEarthWindow.6=Xuất ra bảng tổng hợp -CollectEarthWindow.60=Tạo dữ liệu Saiku -CollectEarthWindow.61=Xuất dữ liệu ra XML (các bản ghi chỉnh sá»­a từ lần xuất trước) -CollectEarthWindow.62=Vá»... -CollectEarthWindow.63=Lá»—i khi nạp Ä‘iểm từ KML -CollectEarthWindow.64=Há»— trợ kỹ thuật -CollectEarthWindow.7=Lá»—i khi nhập dữ liệu -CollectEarthWindow.8=Không tìm thấy văn bản thông báo -CollectEarthWindow.9=Dữ liệu nhập vào có chứa các bản ghi đã có trong cÆ¡ sở dữ liệu cá»§a bạn. -DynamicsCode.0=Ban đầu là rừng -DynamicsCode.1=Ban đầu là trảng cá» -DynamicsCode.2=Ban đầu là khu dân cư -DynamicsCode.3=Ban đầu là đất khác -DynamicsCode.4=Ban đầu là đất ngập nước -DynamicsCode.5=Ban đầu là đất trồng trá»t -OpenTextFileListener.0=không tìm thấy file văn bản tại\: -OptionWizard.0=Các lá»±a chá»n cá»§a Collect Earth -OptionWizard.1=Chá»n Browser -OptionWizard.10=Mở thư mục lưu dá»± phòng -OptionWizard.11=Không biết\: hãy sá»­ dụng ifconfig -OptionWizard.12=Vi dụ cá»§a khác -OptionWizard.13=Äịa chỉ IP cá»§a máy chá»§ Collect Earth -OptionWizard.14=Cổng máy chá»§ Collect Earth (vd\: 8023) -OptionWizard.15=Ghi và áo dụng thay đổi -OptionWizard.16=ID -OptionWizard.17=Tá»a độ X -OptionWizard.18=Tá»a độ Y -OptionWizard.19=Äá»™ cao -OptionWizard.2=Dòng công tác (máy chá»§/khách) -OptionWizard.20=Ná»™i dung cá»§a Google Earth đã thay đổi.
Äá» nghị chấp nhận tải lại ná»™i dung khi Google Earth gợi ý. -OptionWizard.21=Cập nhật thành công -OptionWizard.22=Dốc -OptionWizard.23=Có lá»—i khi mở lại dữ liệu Google Earth -OptionWizard.24=Há»§y -OptionWizard.25=Mode vận hành -OptionWizard.26=NÆ¡i lưu cÆ¡ sở dữ liệu -OptionWizard.27=Äây không phải là thư mục Saiku (hiện không có file start-saiku.bat) -OptionWizard.28=Không nhận được máy chá»§ Saiku -OptionWizard.29=Cổng cÆ¡ sở dữ liệu -OptionWizard.3=Ví dụ cá»§a máy chá»§ -OptionWizard.30=Các lá»±a chá»n cá»§a SQLite -OptionWizard.31=Dữ liệu mẫu -OptionWizard.32=SÆ¡ đồ mẫu -OptionWizard.33=Äịnh nghÄ©a khảo sát -OptionWizard.34=Nâng cao -OptionWizard.35=Số Ä‘iểm mẫu -OptionWizard.36=Khoảng cách giữa các Ä‘iểm mẫu (tính theo mét) -OptionWizard.37=Lá» vá»›i biên ô (tính theo mét) -OptionWizard.38=Không Ä‘á»c được đúng file CSV/CED.
Cần có dấu phảy để phân tách giá trị giống như sau \:
-OptionWizard.39=ID,Tá»a độ Y,tá»a độ X,độ cao,độ dốc,tá»· lệ -OptionWizard.4=Äịa chỉ IP hiện tại cá»§a máy tính\: -OptionWizard.40=Các project -OptionWizard.41=tải file project má»›i -OptionWizard.42=Lá»—i khi đóng CSV reader -OptionWizard.43=Tên khảo sát -OptionWizard.44=tá»± động lưu dá»± phòng dữ liệu tại -OptionWizard.45=Mở Earth Engine để phóng to vào khu vá»±c ô -OptionWizard.46=Mở Earth Engine timelapse cho khu vá»±c ô -OptionWizard.47=Mở Bing Maps cho khu vá»±c ô -OptionWizard.48=Mở form trên browser thay vì mở Google Earth (khuyến cáo cho LINUX) -OptionWizard.49=ÄÆ°á»ng dẫn tá»›i file ced/csv file vá»›i dữ liệu ô -OptionWizard.5=Cổng máy chá»§ Collect Earth\: -OptionWizard.50=Browse... -OptionWizard.51=Lá»—i nhập file project -OptionWizard.52=File CSV/CED chỉ có tá»a độ -OptionWizard.53=Ô vuông -OptionWizard.54=Äiểm trung tâm -OptionWizard.55=Lá»—i khi nhập thư mục project -OptionWizard.56=Tải project -OptionWizard.57=Các project đã tải -OptionWizard.58=Mở GEE Code Editor (cần phải có quyá»n truy cập Trusted Tester) -OptionWizard.59=Mở Here Maps tập trung vào ô -OptionWizard.6=Các thông số cá»§a CSDL PostgreSQL -OptionWizard.65=ÄÆ°á»ng dẫn tá»›i thư mục Saiku -OptionWizard.66=Browse... -OptionWizard.67=ÄÆ°á»ng dẫn tá»›i Firefox executable (file exe) -OptionWizard.68=Browse... -OptionWizard.7=Tên ngưá»i sá»­ dụng -OptionWizard.70=File chạy -OptionWizard.72=File nhị phân -OptionWizard.73=ÄÆ°á»ng dẫn tá»›i Chrome executable (file exe) -OptionWizard.74=Browse... -OptionWizard.76=File exe -OptionWizard.78=File nhị phân -OptionWizard.79=ÄÆ°á»ng dẫn tá»›i KML Freemarker template -OptionWizard.8=Mật khẩu -OptionWizard.80=Browse... -OptionWizard.82=Freemarker template -OptionWizard.83=ÄÆ°á»ng dẫn tá»›i mẫu thiết kế HTML Balloon -OptionWizard.84=Browse... -OptionWizard.86=HTML webpage -OptionWizard.87=ÄÆ°á»ng dẫn tá»›i XML vá»›i định nghÄ©a IDM -OptionWizard.88=Browse... -OptionWizard.9=Tên CSDL -OptionWizard.90=Äịnh nghÄ©a XML IDM -OptionWizard.91=Máy chá»§ (phiên bản quản lý hoặc sá»­ dụng độc lập) -OptionWizard.92=Khách (ngưá»i sá»­ dụng/kết nối vá»›i máy chá»§) -OptionWizard.93=SQLite (tích hợp/file đơn lẻ) -OptionWizard.94=PostgreSQL -SaikuAnalysisListener.0=Yes - Làm má»›i lại dữ liệu Saiku (quá trình dài) -SaikuAnalysisListener.1=No - chỉ khởi động Saiku -SaikuStarter.1=Khởi động Saiku -SaikuStarter.2=Cần vài phút để khởi động Saiku, xin đợi\! -SaveEarthDataServlet.0=Yêu cầu trống -SaveEarthDataServlet.1=Có trục trặc khi ghi dữ liệu vào CSDL -SaveEarthDataServlet.2=Dữ liệu đã được ghi -SlopeCode.0=Bằng phẳng (0-5) -EarthApp.11=Collect Earth Ä‘ang chạy -EarthApp.21=Không tìm thấy file chứa lưới ô trong đưá»ng dẫn đã chá»n \:
-EarthApp.23=Chưa thiết lập file CSV/CED \:

-EarthApp.24=Không tìm thấy file chứa Freemarker template vá»›i định nghÄ©a KML trong đưá»ng dẫn đã chá»n\:
-EarthApp.26=Chưa thiết lập file định nghĩa KML d\:

-EarthApp.27=Không tìm thấy file chứa mẫu HTML balloon trong đưá»ng dẫn đã chá»n\:
-EarthApp.29=Chưa thiết lập file HTML balloon \:

-EarthApp.3=Nhắc nhở sau -EarthApp.30=Xin hãy Ä‘iá»u chỉnh đúng địa chỉ file trong Tools->Properties menu. -EarthApp.4=Cập nhật luôn -EarthApp.5=Không nhắc nữa -EarthApp.57=Äã có phiên bản má»›i cá»§a Collect Earth\!
Bạn muốn làm tiếp như thế nào? -EarthApp.58=Thông báo cập nhật -EarthApp.59=Lỗi khi nhập file project -EarthApp.6=\ - Phiên bản -EarthApp.61=Không mở được file Collect Earth.
Äá» nghị đảm bảo đã cài đặt Google Earth. -EarthSurveyService.9=Trưá»ng bắt buá»™c -ExportActionListener.1=Chá»n ngày xuất bản ghi -ExportDialogProcessMonitor.0=Äang xá»­ lý dữ liệu... -ExportDialogProcessMonitor.1=Äang đợi khởi động quá trình\: -ExportDialogProcessMonitor.4=Các bản ghi đã xuất\: -ImportProcessMonitorDialog.0=Các bản ghi đã nhập\: -ImportActionListener.0=Có nhập dữ liệu các ô chưa được Ä‘iá»n đầy đủ không? -ImportActionListener.2=Nếu bạn chá»n NO sẽ chỉ nhập dữ liệu cá»§a các ô có trạng thái màu "xanh lá cây", các ô đã có đầy đủ dữ liệu. -ImportActionListener.3=Nhập các bản ghi chưa hoàn tất -ImportDialogProcessMonitor.0=\ ÄANG TÃNH TOÃN -ImportDialogProcessMonitor.11=Số lượng ban đầu các bản ghi\: -ImportDialogProcessMonitor.2=Äang nhập các bản ghi... -ImportDialogProcessMonitor.5=Số lượng thá»±c tế các bản ghi đã nhập\: -ImportDialogProcessMonitor.8=Äang xá»­ lý dữ liệu... -InfiniteProgressMonitor.0=Há»§y lệnh -JFileChooserExistsAware.0=File project cá»§a Collect Earth -KmlImportService.13=Chá»n file CSV file để ghi địa Ä‘iểm cá»§a ô vào -MissingPlotsListener.0=Lá»—i khi lấy thông tin vỠô không có trong CSDL -MissingPlotsListener.1=Các ô thiếu -MissingPlotsListener.10=Tổng số ô trong thiết kế chá»n mẫu \: -MissingPlotsListener.12=Số ô thiếu\: -MissingPlotsListener.14=Äã Ä‘iá»n tất cả các ô\! -MissingPlotsListener.2=Sao chép ná»™i dung vào bàn phím -MissingPlotsListener.3=Lá»±a chá»n file có chứa thông tin ô ( file .csv hoặc .ced ) mà bạn muốn biết đã Ä‘iá»n đủ dữ liệu chưa. -MissingPlotsListener.4=Các ô thiếu - thông tin -MissingPlotsListener.5=Từ file \: -MissingPlotsListener.6=Xuất ra file CED -ProcessMonitorDialog.1=Tìm lá»—i trên số dòng -ProcessMonitorDialog.4=, cá»™t -ProcessMonitorDialog.5=\ -- giá trị +AboutDialog.19=कोई समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ +AboutDialog.5=अधिक जानकारी के लिठहमारी वेबसाइट पर जाà¤? OpenForis.org? +AboutDialog.6=कà¥à¤·à¤®à¤¾ करें, à¤à¤• समसà¥à¤¯à¤¾ आपके सिसà¥à¤Ÿà¤® के मानक बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में इस लिंक को खोलने की कोशिश कर रही है. +AboutDialog.8=ठीक +AspectCode.0=उतà¥à¤¤à¤° दिशा +AspectCode.1=उतà¥à¤¤à¤°-पूरà¥à¤µ दिशा +AspectCode.2=पूरà¥à¤µ दिशा +AspectCode.3=दकà¥à¤·à¤¿à¤£-पूरà¥à¤µ दिशा +AspectCode.4=दकà¥à¤·à¤¿à¤£ दिशा +AspectCode.5=दकà¥à¤·à¤¿à¤£-पशà¥à¤šà¤¿à¤® दिशा +AspectCode.6=पशà¥à¤šà¤¿à¤® दिशा +AspectCode.7=उतà¥à¤¤à¤°-पशà¥à¤šà¤¿à¤® दिशा +CollectEarthWindow.0=तà¥à¤°à¥à¤Ÿà¤¿ जब सीà¤à¤¸à¤µà¥€ फ़ाइल में डेटा निरà¥à¤¯à¤¾à¤¤ करने का पà¥à¤°à¤¯à¤¾à¤¸ +CollectEarthWindow.1=निरà¥à¤¯à¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.10=फ़ाइल +CollectEarthWindow.11=बाहर जाà¤à¤‚ +CollectEarthWindow.12=उपकरण +CollectEarthWindow.13=डेटा सीà¤à¤¸à¤µà¥€ निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.14=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ +CollectEarthWindow.15=गà¥à¤£ +CollectEarthWindow.16=मदद +CollectEarthWindow.17=असà¥à¤µà¥€à¤•रण +CollectEarthWindow.18=डेटाबेस में लापता भूखंडों खोजें +CollectEarthWindow.19=पृथà¥à¤µà¥€ इकटà¥à¤ à¤¾ +CollectEarthWindow.2=भाषा +CollectEarthWindow.20=डà¥à¤ªà¥à¤²à¤¿à¤•ेट रिकॉरà¥à¤¡ की संखà¥à¤¯à¤¾\: +CollectEarthWindow.21=मà¥à¤–à¥à¤¯ फà¥à¤°à¥‡à¤® के लिठआइकन नहीं मिल सकता है +CollectEarthWindow.22=आपको लगता है कि आप à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ बंद करना चाहते हैं? विंडोज बंद करने से, à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° बंद हो जाà¤à¤—ा +CollectEarthWindow.23=पà¥à¤·à¥à¤Ÿà¤¿ की जरूरत है +CollectEarthWindow.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.25=आप वैसे भी इन अभिलेखों को जोड़ना चाहते हैं और अपने वरà¥à¤¤à¤®à¤¾à¤¨ डेटा खोने के लिठकिलक करना चाहते हैं? +CollectEarthWindow.26=ऑपरेटर,पà¥à¤°à¤šà¤¾à¤²à¤• +CollectEarthWindow.27=अदà¥à¤¯à¤¤à¤¨ +CollectEarthWindow.28= औपन फौरिस à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° चल रहा होना चाहिठ, जबभी ऑपरेटर डेटा की वà¥à¤¯à¤¾à¤–à¥à¤¯à¤¾ करें . +CollectEarthWindow.29=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. +CollectEarthWindow.3= आयात संबंधी तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.30=जबभी आप गà¥à¤—ल अरà¥à¤¥ का उपयोग कर रहे हैं, कृपया इस विंडोज को खà¥à¤²à¥€ बनाठरखें. +CollectEarthWindow.31=à¤à¤•तà¥à¤° डेटा सीà¤à¤¸à¤µà¥€ फाइल में भेजें +CollectEarthWindow.32=छोड़ना +CollectEarthWindow.33=ऑपरेटर का नाम के 5 अकà¥à¤·à¤° से बड़ा और 50 अकà¥à¤·à¤° से कम होना चाहिठ+CollectEarthWindow.34=मानà¥à¤¯à¤¤à¤¾ तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.35=ऑपरेटर नाम खाली\!
कृपया ऑपरेटर का नाम भरें और "अदà¥à¤¯à¤¤à¤¨" बटन दबाà¤à¤. +CollectEarthWindow.36=ऑपरेटर नाम रिकà¥à¤¤ नहीं हो सकता +CollectEarthWindow.37=खà¥à¤²à¤¾ रखो +CollectEarthWindow.38=सीà¤à¤¸à¤µà¥€ फ़ाइल +CollectEarthWindow.39=सूचना\: यह सलाह दी जाती है कि आप नठडेटा डालने करने से पहले अपने मौजूदा आंकडों को बैकअप(à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤) कर लें +CollectEarthWindow.4=à¤à¤«à¤à¤“ असà¥à¤µà¥€à¤•रण नोटिस +CollectEarthWindow.40=उस फ़ोलà¥à¤¡à¤° पर जाà¤à¤‚ जहां साà¤à¤•ॠसरà¥à¤µà¤° में सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ किया गया है, फ़ोलà¥à¤¡à¤° का रासà¥à¤¤à¤¾ उपकरण> गà¥à¤£> उनà¥à¤¨à¤¤ टैब. +CollectEarthWindow.41=निरà¥à¤¯à¤¾à¤¤ डेटा को फ़ाइल में बचाया जा रहा है \: +CollectEarthWindow.42=छोड़ना +CollectEarthWindow.43=परसà¥à¤ªà¤° विरोधी रिकॉरà¥à¤¡ पाया +CollectEarthWindow.44=डेटा आयात / निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.45=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ डेटा (संकà¥à¤šà¤¿à¤¤) +CollectEarthWindow.46=ज़िप से नठडेटा आयात करें (संकà¥à¤šà¤¿à¤¤ à¤à¤•à¥à¤¸à¤à¤®à¤à¤²) +CollectEarthWindow.55=सीà¤à¤¸à¤µà¥€ का उपयोग कर मौजूदा रिकॉरà¥à¤¡ को अपडेट करें +CollectEarthWindow.47=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. +CollectEarthWindow.48=ज़िप / à¤à¤•तà¥à¤°-डेटा फ़ाइल +CollectEarthWindow.49=फà¥à¤¯à¥‚जन सीà¤à¤¸à¤µà¥€ फ़ाइल +CollectEarthWindow.5=बंद करे +CollectEarthWindow.50= उपयोगकरà¥à¤¤à¤¾ मैनà¥à¤…ल खोलें +CollectEarthWindow.51=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ के अदà¥à¤¯à¤¤à¤¨ के लिठजाà¤à¤š करें +CollectEarthWindow.52= अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— लॉग फ़ाइल खोलें +CollectEarthWindow.53=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ लॉग फ़ाइल +CollectEarthWindow.54=केà¤à¤®à¤à¤² से लोड अंक +CollectEarthWindow.56=के विषय में... +CollectEarthWindow.57=साà¤à¤•ॠसà¥à¤Ÿà¤¾à¤°à¥à¤Ÿà¤° पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ अभी भी चल रहा है, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें. +CollectEarthWindow.58=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ नहीं कर सकते +CollectEarthWindow.59=आप साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ के लिठडेटा सेट फिर से उतà¥à¤ªà¤¨à¥à¤¨ करने के लिठकरना चाहते हैं?
यह पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ समय लेने वाली हो सकती है.
आप यदि "हाà¤"पर कà¥à¤²à¤¿à¤• करें, तो नवीनतम जानकारी के साथ à¤à¤• नया डाटासेट उतà¥à¤ªà¤¨à¥à¤¨ हो जाà¤à¤—ा. +CollectEarthWindow.6=फà¥à¤¯à¥‚जन टेबल के लिठनिरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.60=साà¤à¤•ॠडेटा उतà¥à¤ªà¤¨à¥à¤¨ +CollectEarthWindow.61=डेटा à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ (पिछले निरà¥à¤¯à¤¾à¤¤ के बाद से संशोधित रिकॉरà¥à¤¡) +CollectEarthWindow.62=के विषय मे... +CollectEarthWindow.63=केà¤à¤®à¤à¤² से अंक पà¥à¤°à¤¾à¤ªà¥à¤¤ करने में तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.64=तकनीकी सहायता +CollectEarthWindow.7=डेटा आयात में तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.8=असà¥à¤µà¥€à¤•रण पाठ नहीं पाया जा सका +CollectEarthWindow.9=डेटा आयात रिकॉरà¥à¤¡ वह है जो कि पहले से ही अपने डेटाबेस पर मौजूद हैं शामिल. +DynamicsCode.0=पà¥à¤°à¤¾à¤°à¤‚भ में वन +DynamicsCode.1=पà¥à¤°à¤¾à¤°à¤‚भ में घास का मैदान, +DynamicsCode.2=पà¥à¤°à¤¾à¤°à¤‚भ में आबादी वाला इलाका +DynamicsCode.3=पà¥à¤°à¤¾à¤°à¤‚भ में बंजर +DynamicsCode.4=पà¥à¤°à¤¾à¤°à¤‚भ में आरà¥à¤¦à¥à¤° भूमि +DynamicsCode.5=पà¥à¤°à¤¾à¤°à¤‚भ में खेत +OpenTextFileListener.0=इस पाठ का फ़ाइल नहीं मिला \: +OptionWizard.0= विकलà¥à¤ª +OptionWizard.1=बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° चà¥à¤¨à¥‡à¤‚ +OptionWizard.10=बैकअप फ़ोलà¥à¤¡à¤° खोलें +OptionWizard.11=अजà¥à¤žà¤¾à¤¤\: उपयोग ifconfig +OptionWizard.12=गà¥à¤°à¤¾à¤¹à¤•ों का उलà¥à¤²à¥‡à¤– +OptionWizard.13=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° आईपी +OptionWizard.14=कतà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ (उदाहरण- 8023) +OptionWizard.15=बचाà¤à¤‚ और परिवरà¥à¤¤à¤¨ लागू करें +OptionWizard.16=आईडी +OptionWizard.17=X- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क +OptionWizard.18=Y- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क +OptionWizard.19=उठान +OptionWizard.2=कारà¥à¤¯à¤ªà¥à¤°à¤µà¤¾à¤¹ (सरà¥à¤µà¤° / गà¥à¤°à¤¾à¤¹à¤•) +OptionWizard.20=गूगल अरà¥à¤¥ अंतरà¥à¤µà¤¸à¥à¤¤à¥ बदल दिया गया है
यदि गà¥à¤—ल अरà¥à¤¥ आप से कहे,अंतरà¥à¤µà¤¸à¥à¤¤à¥ पà¥à¤¨à¤ƒ लोड सà¥à¤µà¥€à¤•ार करें . +OptionWizard.21=अदà¥à¤¯à¤¤à¤¨ सफल +OptionWizard.22=ढाल +OptionWizard.23=गूगल अरà¥à¤¥ डेटा को फिर से खोलने में कोई तà¥à¤°à¥à¤Ÿà¤¿ थी +OptionWizard.24=रदà¥à¤¦ करना +OptionWizard.25=ऑपरेशन मोड +OptionWizard.26=डीबी होसà¥à¤Ÿ +OptionWizard.27=यह à¤à¤• मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ साà¤à¤•ॠफ़ोलà¥à¤¡à¤° नहीं है ( सà¥à¤Ÿà¤¾à¤°à¥à¤Ÿ-साà¤à¤•à¥.batफ़ाइल मौजूद नहीं है) +OptionWizard.28=साà¤à¤•ॠसरà¥à¤µà¤° मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ नहीं +OptionWizard.29=डीबी पोरà¥à¤Ÿ +OptionWizard.3=सरà¥à¤µà¤° आवृतà¥à¤¤à¤¿ +OptionWizard.30=à¤à¤¸à¤•à¥à¤¯à¥ लाइट विकलà¥à¤ª +OptionWizard.31=सेमà¥à¤ªà¤² डेटा +OptionWizard.32=पà¥à¤²à¥‰à¤Ÿ लेआउट +OptionWizard.33=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ परिभाषा +OptionWizard.34=विकसित +OptionWizard.35=सेमà¥à¤ªà¤² अंक की संखà¥à¤¯à¤¾ +OptionWizard.36=सेमà¥à¤ªà¤² बिंदॠके बीच दूरी (मीटर में) +OptionWizard.37=भूखंड की सीमा के साथ मारà¥à¤œà¤¿à¤¨ (मीटर मे) +OptionWizard.38=सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सही ढंग से पढ़ा नहीं जा सकता.
इस फ़ाइल में à¤à¤• अलà¥à¤ªà¤µà¤¿à¤°à¤¾à¤® से अलग मूलà¥à¤¯à¥‹à¤‚ की उमà¥à¤®à¥€à¤¦ है \:
+OptionWizard.39=आईडी, वाई समनà¥à¤µà¤¯, à¤à¤•à¥à¤¸ समनà¥à¤µà¤¯, ऊंचाई, ढाल, पहलू +OptionWizard.4=वरà¥à¤¤à¤®à¤¾à¤¨ कंपà¥à¤¯à¥‚टर आईपी \: +OptionWizard.40=परियोजनाà¤à¤‚ +OptionWizard.41=à¤à¤• नई परियोजना फ़ाइल लोड करें +OptionWizard.42=सीà¤à¤¸à¤µà¥€ पाठक को बंद करते समय तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.43=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ का नाम +OptionWizard.44= सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ बैकअप डेटाबेस +OptionWizard.45=ओपन पृथà¥à¤µà¥€ इंजन ने पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° में जूम किया +OptionWizard.46=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठपृथà¥à¤µà¥€ इंजन टाइमलैपà¥à¤¸ खोलें +OptionWizard.47=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठबिंग मैपà¥à¤¸ खोलें +OptionWizard.48=बजाय गूगल अरà¥à¤¥ के फॉरà¥à¤® à¤à¤• बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° पर खोलें (लिनकà¥à¤¸ के लिठसिफारिश) +OptionWizard.49=भूखंड डेटा के साथ सीईडी / सीà¤à¤¸à¤µà¥€ फाइल भेजने के लिठपथ +OptionWizard.5=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ\: +OptionWizard.50=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.51=परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.52=केवल निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क के साथ सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल +OptionWizard.53=चौकोर +OptionWizard.54=केनà¥à¤¦à¥à¤°à¥€à¤¯ बिनà¥à¤¦à¥ +OptionWizard.55=परियोजना फ़ोलà¥à¤¡à¤° आयात तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.56=लोड परियोजना +OptionWizard.57=पहले से लोड परियोजना +OptionWizard.58= जी ई ई का मैदान खोलें (विशà¥à¤µà¤¸à¤¨à¥€à¤¯ जांचकरà¥à¤¤à¤¾ के उपयोग की आवशà¥à¤¯à¤•ता है) +OptionWizard.59=यहां भूखंड पर केंदà¥à¤°à¤¿à¤¤ मैपà¥à¤¸ खोलें +OptionWizard.6=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² डीबी मापदंड +OptionWizard.65=साà¤à¤•à¥à¤«à¤¼à¥‹à¤²à¥à¤¡à¤° का पथ +OptionWizard.66=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.67=फ़ायरफ़ॉकà¥à¤¸ निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ +OptionWizard.68=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.7=उपयोगकरà¥à¤¤à¤¾ नाम +OptionWizard.70=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों +OptionWizard.72=बाइनरी फ़ाइलें +OptionWizard.73=कà¥à¤°à¥‹à¤® निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ +OptionWizard.74=बà¥à¤°à¤¾à¤‰à¤œ +OptionWizard.76=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों +OptionWizard.78=बाइनरी फ़ाइलें +OptionWizard.79=केà¤à¤®à¤à¤² फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ के लिठपथ +OptionWizard.8=पासवरà¥à¤¡ +OptionWizard.80=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.82=फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ +OptionWizard.83=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ पà¥à¤°à¤ªà¤¤à¥à¤° डिज़ाइन करने के लिठपथ +OptionWizard.84=बà¥à¤°à¤¾à¤‰à¤œ..... +OptionWizard.86=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² वेब पेज +OptionWizard.87=पथ आइडीà¤à¤® परिभाषा के साथ à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठ+OptionWizard.88=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.9=डीबी नाम +OptionWizard.90=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² आइडीà¤à¤® परिभाषा +OptionWizard.91=सरà¥à¤µà¤° (पà¥à¤°à¤¬à¤‚धक संसà¥à¤•रण या खड़े अकेले का उपयोग करें) +OptionWizard.92=कà¥à¤²à¤¾à¤‡à¤‚ट (ऑपरेटर / सरà¥à¤µà¤° से जà¥à¤¡à¤¼à¥‡) +OptionWizard.93=सकà¥à¤¯à¥‚à¤à¤²à¤¾à¤‡à¤Ÿ (à¤à¤‚बेडेड / à¤à¤•ल फाइल आधारित) +OptionWizard.94=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² +OptionWizard.95=सेमà¥à¤ªà¤² डॉटà¥à¤¸ के साइड (मीटर में) +SaikuAnalysisListener.0=हाठ- ताज़ा साà¤à¤•ॠडेटा (लंबी पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾) +SaikuAnalysisListener.1=नहीं - बस साà¤à¤•ॠशà¥à¤°à¥‚ +SaikuStarter.1=साà¤à¤•ॠशà¥à¤°à¥‚ +SaikuStarter.2= साà¤à¤•ॠशà¥à¤°à¥‚ कà¥à¤› मिनट लग सकते हैं, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें\! +SaveEarthDataServlet.0=खाली अनà¥à¤°à¥‹à¤§ +SaveEarthDataServlet.1= डेटाबेस में डेटा बचाते समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ है +SaveEarthDataServlet.2=डेटा बचाया था +SlopeCode.0=समतल (0-5) +EarthApp.11=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ पहले से ही चल रहा है +EarthApp.21=à¤à¤• सीà¤à¤¸à¤µà¥€ / सीईडी के रूप में भूखंडों की गà¥à¤°à¤¿à¤¡ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
+EarthApp.23=कोई सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सेट-अप नहीं किया गया है \:

+EarthApp.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² परिभाषा के साथ फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है \:
+EarthApp.26=कोई à¤à¤•à¥à¤¸à¤à¤®à¤à¤² फ़ाइल परिभाषा सेट अप नहीं किया गया है \:

+EarthApp.27=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ रूप से यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
+EarthApp.29=कोई à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ फ़ाइल सेट-अप नहीं किया गया है \:

+EarthApp.3=मà¥à¤à¥‡ बाद में याद दिलाना +EarthApp.30=उपकरण> गà¥à¤£ मेनू में फ़ाइल सà¥à¤¥à¤¾à¤¨ को ठीक करें . +EarthApp.4=अभी अदà¥à¤¯à¤¤à¤¨ करें +EarthApp.5=मà¥à¤à¥‡ दà¥à¤¬à¤¾à¤°à¤¾ याद मत दिलाना +EarthApp.57=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ का à¤à¤• नया संसà¥à¤•रण उपलबà¥à¤§ है\!
आप कैसे आगे बढ़ना चाहते हैं? +EarthApp.58=अदà¥à¤¯à¤¤à¤¨ चेतावनी +EarthApp.59= परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ +EarthApp.6=\ - संसà¥à¤•रण +EarthApp.61=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ फाइल खà¥à¤² नहीं सकती .
कृपया सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करें कि गूगल अरà¥à¤¥ सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ है. +EarthSurveyService.9=आवशà¥à¤¯à¤• कà¥à¤·à¥‡à¤¤à¥à¤° +ExportActionListener.1= तारीख चूनें जबसे रिकॉरà¥à¤¡ निरà¥à¤¯à¤¾à¤¤ करने है +ExportDialogProcessMonitor.0=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... +ExportDialogProcessMonitor.1=पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ पà¥à¤°à¤¾à¤°à¤‚भ करने के लिठपà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ कर रहा है \: +ExportDialogProcessMonitor.4=निरà¥à¤¯à¤¾à¤¤ रिकॉरà¥à¤¡\: +ImportProcessMonitorDialog.0=आयातित रिकॉरà¥à¤¡ \: +ImportActionListener.0=कà¥à¤¯à¤¾ उन भूखंडों के लिठडेटा जो कि पूरी तरह से भरे नहीं गठ,आयातित किया जाना चाहिà¤? +ImportActionListener.2=आप कà¥à¤²à¤¿à¤• करें, नहींतो केवल डेटा "हरी" राजà¥à¤¯ में भूखंडों से ,जिसमें सभी डेटा यà¥à¤•à¥à¤¤ है , आयात किया जाà¤à¤—ा। +ImportDialogProcessMonitor.0=\ गणना +ImportDialogProcessMonitor.11=रिकॉरà¥à¤¡ की पà¥à¤°à¤¾à¤°à¤‚भिक संखà¥à¤¯à¤¾ \: +ImportDialogProcessMonitor.2=रिकॉरà¥à¤¡ आयात... +ImportDialogProcessMonitor.5=आयातित रिकॉरà¥à¤¡ की वासà¥à¤¤à¤µà¤¿à¤• संखà¥à¤¯à¤¾ \: +ImportDialogProcessMonitor.8=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... +InfiniteProgressMonitor.0=रदà¥à¤¦ ऑपरेशन +JFileChooserExistsAware.0=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ परियोजना फ़ाइल +KmlImportService.13=पà¥à¤²à¥‰à¤Ÿ सà¥à¤¥à¤¾à¤¨à¥‹à¤‚ को बचाने के लिठà¤à¤• सीà¤à¤¸à¤µà¥€ फ़ाइल का चयन करें +MissingPlotsListener.0=तà¥à¤°à¥à¤Ÿà¤¿ उन भूखंडों के बारे में जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ करने के लिठजो डेटाबेस पर मौजूद नहीं +MissingPlotsListener.1=गà¥à¤® भूखंड +MissingPlotsListener.10=सेमà¥à¤ªà¤² डिजाइन में भूखंडों की कà¥à¤² संखà¥à¤¯à¤¾ \: +MissingPlotsListener.12=गà¥à¤® भूखंडों की संखà¥à¤¯à¤¾ \: +MissingPlotsListener.14=सभी भूखंडों भर रहे हैं\! +MissingPlotsListener.2=कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ अंतरà¥à¤µà¤¸à¥à¤¤à¥ की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ +MissingPlotsListener.3=भूखंड की जानकारी वाले फ़ाइलें चà¥à¤¨à¥‡à¤‚ ( .सीà¤à¤¸à¤µà¥€ या .सीईडी फ़ाइलें ) जिसके लिठआप जानना चाहते हैं तो सभी डेटा भर दिया गया है चाहता हूà¤. +MissingPlotsListener.4=गà¥à¤® भूखंड- जानकारी +MissingPlotsListener.5=फ़ाइल से \: +MissingPlotsListener.6=सीà¤à¤¡à¥€ फ़ाइल में निरà¥à¤¯à¤¾à¤¤ करें +ProcessMonitorDialog.1=पंकà¥à¤¤à¤¿ संखà¥à¤¯à¤¾ पर तà¥à¤°à¥à¤Ÿà¤¿ +ProcessMonitorDialog.4=, कॉलम +ProcessMonitorDialog.5=\ --मूलà¥à¤¯ +YES= हां +YES_TO_ALL=सब को हां +NO=नहीं +NO_TO_ALL=सभी को नहीं From 454280815f9f2ba7296fff0cc30f2f393ac4f8c9 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:36:54 +0100 Subject: [PATCH 0826/1620] New translations utf8_orig_Messages_vi.properties (French) --- .../earth/app/view/Messages_fr.properties | 446 +++++++++--------- 1 file changed, 221 insertions(+), 225 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index f0355142d0..353fe0d367 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,225 +1,221 @@ -AboutDialog.19=कोई समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ -AboutDialog.5=अधिक जानकारी के लिठहमारी वेबसाइट पर जाà¤? OpenForis.org? -AboutDialog.6=कà¥à¤·à¤®à¤¾ करें, à¤à¤• समसà¥à¤¯à¤¾ आपके सिसà¥à¤Ÿà¤® के मानक बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में इस लिंक को खोलने की कोशिश कर रही है. -AboutDialog.8=ठीक -AspectCode.0=उतà¥à¤¤à¤° दिशा -AspectCode.1=उतà¥à¤¤à¤°-पूरà¥à¤µ दिशा -AspectCode.2=पूरà¥à¤µ दिशा -AspectCode.3=दकà¥à¤·à¤¿à¤£-पूरà¥à¤µ दिशा -AspectCode.4=दकà¥à¤·à¤¿à¤£ दिशा -AspectCode.5=दकà¥à¤·à¤¿à¤£-पशà¥à¤šà¤¿à¤® दिशा -AspectCode.6=पशà¥à¤šà¤¿à¤® दिशा -AspectCode.7=उतà¥à¤¤à¤°-पशà¥à¤šà¤¿à¤® दिशा -CollectEarthWindow.0=तà¥à¤°à¥à¤Ÿà¤¿ जब सीà¤à¤¸à¤µà¥€ फ़ाइल में डेटा निरà¥à¤¯à¤¾à¤¤ करने का पà¥à¤°à¤¯à¤¾à¤¸ -CollectEarthWindow.1=निरà¥à¤¯à¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.10=फ़ाइल -CollectEarthWindow.11=बाहर जाà¤à¤‚ -CollectEarthWindow.12=उपकरण -CollectEarthWindow.13=डेटा सीà¤à¤¸à¤µà¥€ निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.14=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ -CollectEarthWindow.15=गà¥à¤£ -CollectEarthWindow.16=मदद -CollectEarthWindow.17=असà¥à¤µà¥€à¤•रण -CollectEarthWindow.18=डेटाबेस में लापता भूखंडों खोजें -CollectEarthWindow.19=पृथà¥à¤µà¥€ इकटà¥à¤ à¤¾ -CollectEarthWindow.2=भाषा -CollectEarthWindow.20=डà¥à¤ªà¥à¤²à¤¿à¤•ेट रिकॉरà¥à¤¡ की संखà¥à¤¯à¤¾\: -CollectEarthWindow.21=मà¥à¤–à¥à¤¯ फà¥à¤°à¥‡à¤® के लिठआइकन नहीं मिल सकता है -CollectEarthWindow.22=आपको लगता है कि आप à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ बंद करना चाहते हैं? विंडोज बंद करने से, à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° बंद हो जाà¤à¤—ा -CollectEarthWindow.23=पà¥à¤·à¥à¤Ÿà¤¿ की जरूरत है -CollectEarthWindow.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.25=आप वैसे भी इन अभिलेखों को जोड़ना चाहते हैं और अपने वरà¥à¤¤à¤®à¤¾à¤¨ डेटा खोने के लिठकिलक करना चाहते हैं? -CollectEarthWindow.26=ऑपरेटर,पà¥à¤°à¤šà¤¾à¤²à¤• -CollectEarthWindow.27=अदà¥à¤¯à¤¤à¤¨ -CollectEarthWindow.28= औपन फौरिस à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° चल रहा होना चाहिठ, जबभी ऑपरेटर डेटा की वà¥à¤¯à¤¾à¤–à¥à¤¯à¤¾ करें . -CollectEarthWindow.29=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. -CollectEarthWindow.3= आयात संबंधी तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.30=जबभी आप गà¥à¤—ल अरà¥à¤¥ का उपयोग कर रहे हैं, कृपया इस विंडोज को खà¥à¤²à¥€ बनाठरखें. -CollectEarthWindow.31=à¤à¤•तà¥à¤° डेटा सीà¤à¤¸à¤µà¥€ फाइल में भेजें -CollectEarthWindow.32=छोड़ना -CollectEarthWindow.33=ऑपरेटर का नाम के 5 अकà¥à¤·à¤° से बड़ा और 50 अकà¥à¤·à¤° से कम होना चाहिठ-CollectEarthWindow.34=मानà¥à¤¯à¤¤à¤¾ तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.35=ऑपरेटर नाम खाली\!
कृपया ऑपरेटर का नाम भरें और "अदà¥à¤¯à¤¤à¤¨" बटन दबाà¤à¤. -CollectEarthWindow.36=ऑपरेटर नाम रिकà¥à¤¤ नहीं हो सकता -CollectEarthWindow.37=खà¥à¤²à¤¾ रखो -CollectEarthWindow.38=सीà¤à¤¸à¤µà¥€ फ़ाइल -CollectEarthWindow.39=सूचना\: यह सलाह दी जाती है कि आप नठडेटा डालने करने से पहले अपने मौजूदा आंकडों को बैकअप(à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤) कर लें -CollectEarthWindow.4=à¤à¤«à¤à¤“ असà¥à¤µà¥€à¤•रण नोटिस -CollectEarthWindow.40=उस फ़ोलà¥à¤¡à¤° पर जाà¤à¤‚ जहां साà¤à¤•ॠसरà¥à¤µà¤° में सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ किया गया है, फ़ोलà¥à¤¡à¤° का रासà¥à¤¤à¤¾ उपकरण> गà¥à¤£> उनà¥à¤¨à¤¤ टैब. -CollectEarthWindow.41=निरà¥à¤¯à¤¾à¤¤ डेटा को फ़ाइल में बचाया जा रहा है \: -CollectEarthWindow.42=छोड़ना -CollectEarthWindow.43=परसà¥à¤ªà¤° विरोधी रिकॉरà¥à¤¡ पाया -CollectEarthWindow.44=डेटा आयात / निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.45=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ डेटा (संकà¥à¤šà¤¿à¤¤) -CollectEarthWindow.46=ज़िप से नठडेटा आयात करें (संकà¥à¤šà¤¿à¤¤ à¤à¤•à¥à¤¸à¤à¤®à¤à¤²) -CollectEarthWindow.55=सीà¤à¤¸à¤µà¥€ का उपयोग कर मौजूदा रिकॉरà¥à¤¡ को अपडेट करें -CollectEarthWindow.47=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. -CollectEarthWindow.48=ज़िप / à¤à¤•तà¥à¤°-डेटा फ़ाइल -CollectEarthWindow.49=फà¥à¤¯à¥‚जन सीà¤à¤¸à¤µà¥€ फ़ाइल -CollectEarthWindow.5=बंद करे -CollectEarthWindow.50= उपयोगकरà¥à¤¤à¤¾ मैनà¥à¤…ल खोलें -CollectEarthWindow.51=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ के अदà¥à¤¯à¤¤à¤¨ के लिठजाà¤à¤š करें -CollectEarthWindow.52= अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— लॉग फ़ाइल खोलें -CollectEarthWindow.53=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ लॉग फ़ाइल -CollectEarthWindow.54=केà¤à¤®à¤à¤² से लोड अंक -CollectEarthWindow.56=के विषय में... -CollectEarthWindow.57=साà¤à¤•ॠसà¥à¤Ÿà¤¾à¤°à¥à¤Ÿà¤° पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ अभी भी चल रहा है, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें. -CollectEarthWindow.58=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ नहीं कर सकते -CollectEarthWindow.59=आप साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ के लिठडेटा सेट फिर से उतà¥à¤ªà¤¨à¥à¤¨ करने के लिठकरना चाहते हैं?
यह पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ समय लेने वाली हो सकती है.
आप यदि "हाà¤"पर कà¥à¤²à¤¿à¤• करें, तो नवीनतम जानकारी के साथ à¤à¤• नया डाटासेट उतà¥à¤ªà¤¨à¥à¤¨ हो जाà¤à¤—ा. -CollectEarthWindow.6=फà¥à¤¯à¥‚जन टेबल के लिठनिरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.60=साà¤à¤•ॠडेटा उतà¥à¤ªà¤¨à¥à¤¨ -CollectEarthWindow.61=डेटा à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ (पिछले निरà¥à¤¯à¤¾à¤¤ के बाद से संशोधित रिकॉरà¥à¤¡) -CollectEarthWindow.62=के विषय मे... -CollectEarthWindow.63=केà¤à¤®à¤à¤² से अंक पà¥à¤°à¤¾à¤ªà¥à¤¤ करने में तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.64=तकनीकी सहायता -CollectEarthWindow.7=डेटा आयात में तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.8=असà¥à¤µà¥€à¤•रण पाठ नहीं पाया जा सका -CollectEarthWindow.9=डेटा आयात रिकॉरà¥à¤¡ वह है जो कि पहले से ही अपने डेटाबेस पर मौजूद हैं शामिल. -DynamicsCode.0=पà¥à¤°à¤¾à¤°à¤‚भ में वन -DynamicsCode.1=पà¥à¤°à¤¾à¤°à¤‚भ में घास का मैदान, -DynamicsCode.2=पà¥à¤°à¤¾à¤°à¤‚भ में आबादी वाला इलाका -DynamicsCode.3=पà¥à¤°à¤¾à¤°à¤‚भ में बंजर -DynamicsCode.4=पà¥à¤°à¤¾à¤°à¤‚भ में आरà¥à¤¦à¥à¤° भूमि -DynamicsCode.5=पà¥à¤°à¤¾à¤°à¤‚भ में खेत -OpenTextFileListener.0=इस पाठ का फ़ाइल नहीं मिला \: -OptionWizard.0= विकलà¥à¤ª -OptionWizard.1=बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° चà¥à¤¨à¥‡à¤‚ -OptionWizard.10=बैकअप फ़ोलà¥à¤¡à¤° खोलें -OptionWizard.11=अजà¥à¤žà¤¾à¤¤\: उपयोग ifconfig -OptionWizard.12=गà¥à¤°à¤¾à¤¹à¤•ों का उलà¥à¤²à¥‡à¤– -OptionWizard.13=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° आईपी -OptionWizard.14=कतà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ (उदाहरण- 8023) -OptionWizard.15=बचाà¤à¤‚ और परिवरà¥à¤¤à¤¨ लागू करें -OptionWizard.16=आईडी -OptionWizard.17=X- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क -OptionWizard.18=Y- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क -OptionWizard.19=उठान -OptionWizard.2=कारà¥à¤¯à¤ªà¥à¤°à¤µà¤¾à¤¹ (सरà¥à¤µà¤° / गà¥à¤°à¤¾à¤¹à¤•) -OptionWizard.20=गूगल अरà¥à¤¥ अंतरà¥à¤µà¤¸à¥à¤¤à¥ बदल दिया गया है
यदि गà¥à¤—ल अरà¥à¤¥ आप से कहे,अंतरà¥à¤µà¤¸à¥à¤¤à¥ पà¥à¤¨à¤ƒ लोड सà¥à¤µà¥€à¤•ार करें . -OptionWizard.21=अदà¥à¤¯à¤¤à¤¨ सफल -OptionWizard.22=ढाल -OptionWizard.23=गूगल अरà¥à¤¥ डेटा को फिर से खोलने में कोई तà¥à¤°à¥à¤Ÿà¤¿ थी -OptionWizard.24=रदà¥à¤¦ करना -OptionWizard.25=ऑपरेशन मोड -OptionWizard.26=डीबी होसà¥à¤Ÿ -OptionWizard.27=यह à¤à¤• मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ साà¤à¤•ॠफ़ोलà¥à¤¡à¤° नहीं है ( सà¥à¤Ÿà¤¾à¤°à¥à¤Ÿ-साà¤à¤•à¥.batफ़ाइल मौजूद नहीं है) -OptionWizard.28=साà¤à¤•ॠसरà¥à¤µà¤° मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ नहीं -OptionWizard.29=डीबी पोरà¥à¤Ÿ -OptionWizard.3=सरà¥à¤µà¤° आवृतà¥à¤¤à¤¿ -OptionWizard.30=à¤à¤¸à¤•à¥à¤¯à¥ लाइट विकलà¥à¤ª -OptionWizard.31=सेमà¥à¤ªà¤² डेटा -OptionWizard.32=पà¥à¤²à¥‰à¤Ÿ लेआउट -OptionWizard.33=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ परिभाषा -OptionWizard.34=विकसित -OptionWizard.35=सेमà¥à¤ªà¤² अंक की संखà¥à¤¯à¤¾ -OptionWizard.36=सेमà¥à¤ªà¤² बिंदॠके बीच दूरी (मीटर में) -OptionWizard.37=भूखंड की सीमा के साथ मारà¥à¤œà¤¿à¤¨ (मीटर मे) -OptionWizard.38=सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सही ढंग से पढ़ा नहीं जा सकता.
इस फ़ाइल में à¤à¤• अलà¥à¤ªà¤µà¤¿à¤°à¤¾à¤® से अलग मूलà¥à¤¯à¥‹à¤‚ की उमà¥à¤®à¥€à¤¦ है \:
-OptionWizard.39=आईडी, वाई समनà¥à¤µà¤¯, à¤à¤•à¥à¤¸ समनà¥à¤µà¤¯, ऊंचाई, ढाल, पहलू -OptionWizard.4=वरà¥à¤¤à¤®à¤¾à¤¨ कंपà¥à¤¯à¥‚टर आईपी \: -OptionWizard.40=परियोजनाà¤à¤‚ -OptionWizard.41=à¤à¤• नई परियोजना फ़ाइल लोड करें -OptionWizard.42=सीà¤à¤¸à¤µà¥€ पाठक को बंद करते समय तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.43=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ का नाम -OptionWizard.44= सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ बैकअप डेटाबेस -OptionWizard.45=ओपन पृथà¥à¤µà¥€ इंजन ने पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° में जूम किया -OptionWizard.46=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठपृथà¥à¤µà¥€ इंजन टाइमलैपà¥à¤¸ खोलें -OptionWizard.47=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठबिंग मैपà¥à¤¸ खोलें -OptionWizard.48=बजाय गूगल अरà¥à¤¥ के फॉरà¥à¤® à¤à¤• बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° पर खोलें (लिनकà¥à¤¸ के लिठसिफारिश) -OptionWizard.49=भूखंड डेटा के साथ सीईडी / सीà¤à¤¸à¤µà¥€ फाइल भेजने के लिठपथ -OptionWizard.5=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ\: -OptionWizard.50=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.51=परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.52=केवल निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क के साथ सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल -OptionWizard.53=चौकोर -OptionWizard.54=केनà¥à¤¦à¥à¤°à¥€à¤¯ बिनà¥à¤¦à¥ -OptionWizard.55=परियोजना फ़ोलà¥à¤¡à¤° आयात तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.56=लोड परियोजना -OptionWizard.57=पहले से लोड परियोजना -OptionWizard.58= जी ई ई का मैदान खोलें (विशà¥à¤µà¤¸à¤¨à¥€à¤¯ जांचकरà¥à¤¤à¤¾ के उपयोग की आवशà¥à¤¯à¤•ता है) -OptionWizard.59=यहां भूखंड पर केंदà¥à¤°à¤¿à¤¤ मैपà¥à¤¸ खोलें -OptionWizard.6=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² डीबी मापदंड -OptionWizard.65=साà¤à¤•à¥à¤«à¤¼à¥‹à¤²à¥à¤¡à¤° का पथ -OptionWizard.66=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.67=फ़ायरफ़ॉकà¥à¤¸ निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ -OptionWizard.68=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.7=उपयोगकरà¥à¤¤à¤¾ नाम -OptionWizard.70=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों -OptionWizard.72=बाइनरी फ़ाइलें -OptionWizard.73=कà¥à¤°à¥‹à¤® निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ -OptionWizard.74=बà¥à¤°à¤¾à¤‰à¤œ -OptionWizard.76=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों -OptionWizard.78=बाइनरी फ़ाइलें -OptionWizard.79=केà¤à¤®à¤à¤² फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ के लिठपथ -OptionWizard.8=पासवरà¥à¤¡ -OptionWizard.80=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.82=फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ -OptionWizard.83=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ पà¥à¤°à¤ªà¤¤à¥à¤° डिज़ाइन करने के लिठपथ -OptionWizard.84=बà¥à¤°à¤¾à¤‰à¤œ..... -OptionWizard.86=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² वेब पेज -OptionWizard.87=पथ आइडीà¤à¤® परिभाषा के साथ à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठ-OptionWizard.88=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.9=डीबी नाम -OptionWizard.90=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² आइडीà¤à¤® परिभाषा -OptionWizard.91=सरà¥à¤µà¤° (पà¥à¤°à¤¬à¤‚धक संसà¥à¤•रण या खड़े अकेले का उपयोग करें) -OptionWizard.92=कà¥à¤²à¤¾à¤‡à¤‚ट (ऑपरेटर / सरà¥à¤µà¤° से जà¥à¤¡à¤¼à¥‡) -OptionWizard.93=सकà¥à¤¯à¥‚à¤à¤²à¤¾à¤‡à¤Ÿ (à¤à¤‚बेडेड / à¤à¤•ल फाइल आधारित) -OptionWizard.94=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² -OptionWizard.95=सेमà¥à¤ªà¤² डॉटà¥à¤¸ के साइड (मीटर में) -SaikuAnalysisListener.0=हाठ- ताज़ा साà¤à¤•ॠडेटा (लंबी पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾) -SaikuAnalysisListener.1=नहीं - बस साà¤à¤•ॠशà¥à¤°à¥‚ -SaikuStarter.1=साà¤à¤•ॠशà¥à¤°à¥‚ -SaikuStarter.2= साà¤à¤•ॠशà¥à¤°à¥‚ कà¥à¤› मिनट लग सकते हैं, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें\! -SaveEarthDataServlet.0=खाली अनà¥à¤°à¥‹à¤§ -SaveEarthDataServlet.1= डेटाबेस में डेटा बचाते समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ है -SaveEarthDataServlet.2=डेटा बचाया था -SlopeCode.0=समतल (0-5) -EarthApp.11=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ पहले से ही चल रहा है -EarthApp.21=à¤à¤• सीà¤à¤¸à¤µà¥€ / सीईडी के रूप में भूखंडों की गà¥à¤°à¤¿à¤¡ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
-EarthApp.23=कोई सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सेट-अप नहीं किया गया है \:

-EarthApp.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² परिभाषा के साथ फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है \:
-EarthApp.26=कोई à¤à¤•à¥à¤¸à¤à¤®à¤à¤² फ़ाइल परिभाषा सेट अप नहीं किया गया है \:

-EarthApp.27=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ रूप से यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
-EarthApp.29=कोई à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ फ़ाइल सेट-अप नहीं किया गया है \:

-EarthApp.3=मà¥à¤à¥‡ बाद में याद दिलाना -EarthApp.30=उपकरण> गà¥à¤£ मेनू में फ़ाइल सà¥à¤¥à¤¾à¤¨ को ठीक करें . -EarthApp.4=अभी अदà¥à¤¯à¤¤à¤¨ करें -EarthApp.5=मà¥à¤à¥‡ दà¥à¤¬à¤¾à¤°à¤¾ याद मत दिलाना -EarthApp.57=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ का à¤à¤• नया संसà¥à¤•रण उपलबà¥à¤§ है\!
आप कैसे आगे बढ़ना चाहते हैं? -EarthApp.58=अदà¥à¤¯à¤¤à¤¨ चेतावनी -EarthApp.59= परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ -EarthApp.6=\ - संसà¥à¤•रण -EarthApp.61=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ फाइल खà¥à¤² नहीं सकती .
कृपया सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करें कि गूगल अरà¥à¤¥ सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ है. -EarthSurveyService.9=आवशà¥à¤¯à¤• कà¥à¤·à¥‡à¤¤à¥à¤° -ExportActionListener.1= तारीख चूनें जबसे रिकॉरà¥à¤¡ निरà¥à¤¯à¤¾à¤¤ करने है -ExportDialogProcessMonitor.0=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... -ExportDialogProcessMonitor.1=पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ पà¥à¤°à¤¾à¤°à¤‚भ करने के लिठपà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ कर रहा है \: -ExportDialogProcessMonitor.4=निरà¥à¤¯à¤¾à¤¤ रिकॉरà¥à¤¡\: -ImportProcessMonitorDialog.0=आयातित रिकॉरà¥à¤¡ \: -ImportActionListener.0=कà¥à¤¯à¤¾ उन भूखंडों के लिठडेटा जो कि पूरी तरह से भरे नहीं गठ,आयातित किया जाना चाहिà¤? -ImportActionListener.2=आप कà¥à¤²à¤¿à¤• करें, नहींतो केवल डेटा "हरी" राजà¥à¤¯ में भूखंडों से ,जिसमें सभी डेटा यà¥à¤•à¥à¤¤ है , आयात किया जाà¤à¤—ा। -ImportDialogProcessMonitor.0=\ गणना -ImportDialogProcessMonitor.11=रिकॉरà¥à¤¡ की पà¥à¤°à¤¾à¤°à¤‚भिक संखà¥à¤¯à¤¾ \: -ImportDialogProcessMonitor.2=रिकॉरà¥à¤¡ आयात... -ImportDialogProcessMonitor.5=आयातित रिकॉरà¥à¤¡ की वासà¥à¤¤à¤µà¤¿à¤• संखà¥à¤¯à¤¾ \: -ImportDialogProcessMonitor.8=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... -InfiniteProgressMonitor.0=रदà¥à¤¦ ऑपरेशन -JFileChooserExistsAware.0=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ परियोजना फ़ाइल -KmlImportService.13=पà¥à¤²à¥‰à¤Ÿ सà¥à¤¥à¤¾à¤¨à¥‹à¤‚ को बचाने के लिठà¤à¤• सीà¤à¤¸à¤µà¥€ फ़ाइल का चयन करें -MissingPlotsListener.0=तà¥à¤°à¥à¤Ÿà¤¿ उन भूखंडों के बारे में जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ करने के लिठजो डेटाबेस पर मौजूद नहीं -MissingPlotsListener.1=गà¥à¤® भूखंड -MissingPlotsListener.10=सेमà¥à¤ªà¤² डिजाइन में भूखंडों की कà¥à¤² संखà¥à¤¯à¤¾ \: -MissingPlotsListener.12=गà¥à¤® भूखंडों की संखà¥à¤¯à¤¾ \: -MissingPlotsListener.14=सभी भूखंडों भर रहे हैं\! -MissingPlotsListener.2=कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ अंतरà¥à¤µà¤¸à¥à¤¤à¥ की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ -MissingPlotsListener.3=भूखंड की जानकारी वाले फ़ाइलें चà¥à¤¨à¥‡à¤‚ ( .सीà¤à¤¸à¤µà¥€ या .सीईडी फ़ाइलें ) जिसके लिठआप जानना चाहते हैं तो सभी डेटा भर दिया गया है चाहता हूà¤. -MissingPlotsListener.4=गà¥à¤® भूखंड- जानकारी -MissingPlotsListener.5=फ़ाइल से \: -MissingPlotsListener.6=सीà¤à¤¡à¥€ फ़ाइल में निरà¥à¤¯à¤¾à¤¤ करें -ProcessMonitorDialog.1=पंकà¥à¤¤à¤¿ संखà¥à¤¯à¤¾ पर तà¥à¤°à¥à¤Ÿà¤¿ -ProcessMonitorDialog.4=, कॉलम -ProcessMonitorDialog.5=\ --मूलà¥à¤¯ -YES= हां -YES_TO_ALL=सब को हां -NO=नहीं -NO_TO_ALL=सभी को नहीं +AboutDialog.19=Äã có lá»—i +AboutDialog.5=Truy cập website cá»§a chúng tôi để biết thêm thông tin OpenForis.org +AboutDialog.6=Xin lá»—i, đã có sá»± cố khi mở link trong brower chuẩn trong hệ thống cá»§a bạn. +AboutDialog.8=Ok +AspectCode.0=Bắc +AspectCode.1=Äông-Bắc +AspectCode.2=Äông +AspectCode.3=Äông-Nam +AspectCode.4=Nam +AspectCode.5=Tây-Nam +AspectCode.6=Tây +AspectCode.7=Tây-Bắc +CollectEarthWindow.0=Lá»—i khi xuất dữ liệu sang file CSV +CollectEarthWindow.1=Lá»—i xuất dữ liệu +CollectEarthWindow.10=File +CollectEarthWindow.11=Thoát +CollectEarthWindow.12=Công cụ +CollectEarthWindow.13=Xuất dữ liệu ra CSV +CollectEarthWindow.14=Khởi động SAIKU Analysis +CollectEarthWindow.15=Thuá»™c tính +CollectEarthWindow.16=Trợ giúp +CollectEarthWindow.17=Thông tin công bố +CollectEarthWindow.18=Tìm ô thiếu trong cÆ¡ sở dữ liệu +CollectEarthWindow.19=Collect Earth +CollectEarthWindow.2=Ngôn ngữ +CollectEarthWindow.20=Số bản ghi trùng\: +CollectEarthWindow.21=Không tìm thấy biểu tượng cho khung chính +CollectEarthWindow.22=Bạn có chắc là muốn đóng Collect Earth?
Äóng cá»­a sổ cÅ©ng đóng luôn máy chá»§ Collect Earth +CollectEarthWindow.23=Cần khẳng định +CollectEarthWindow.24=Xuất ra XML +CollectEarthWindow.25=Bạn có muốn thêm các bản ghi này và bá» Ä‘i dữ liệu hiện thá»i không? +CollectEarthWindow.26=Ngưá»i sá»­ dụng +CollectEarthWindow.27=Cập nhật +CollectEarthWindow.28=Máy chá»§ Open Foris Collect Earth phải chạy khi ngưá»i sá»­ dụng giải Ä‘oán dữ liệu. +CollectEarthWindow.29=Chưa xác định cấu hình cho Máy chá»§ Saiku. +CollectEarthWindow.3=\ Lá»—i nhập +CollectEarthWindow.30=Äể mở cá»­a sổ này khi Ä‘ang sá»­ dụng Google Earth. +CollectEarthWindow.31=Xuất dữ liệu đã thu thập sang file CSV +CollectEarthWindow.32=Thoát +CollectEarthWindow.33=Tên ngưá»i sá»­ dụng phải dài hÆ¡n 5 chữ cái và ngắn hÆ¡n 50 chữ cái +CollectEarthWindow.34=Lá»—i kiểm chứng +CollectEarthWindow.35=TÊN NGƯỜI SỬ DỤNG CÃ’N TRá»NG\!
Hãy Ä‘iá»n tên ngưá»i sá»­ dụng và nhắp phím "Update". +CollectEarthWindow.36=Không được để trống phần tên ngưá»i sá»­ dụng +CollectEarthWindow.37=Äể mở +CollectEarthWindow.38=file CSV +CollectEarthWindow.39=THÔNG BÃO\: Nên lưu dá»± phòng dữ liệu hiện thá»i(Xuất ra XML) trước khi nhập dữ liệu má»›i +CollectEarthWindow.4=Thông tin công bố cá»§a FAO +CollectEarthWindow.40=Thiết lập đưá»ng dẫn tá»›i thư mục cài đặt Saiku Server trong Tools->Properties->Advanced tab. +CollectEarthWindow.41=Ghi dữ liệu xuất ra vào file\: +CollectEarthWindow.42=Thoát +CollectEarthWindow.43=Tìm thấy bản ghi có mâu thuẫn +CollectEarthWindow.44=Nhập/Xuất dữ liệu +CollectEarthWindow.45=Xuất dữ liệu ra XML (nén) +CollectEarthWindow.46=Nhập dữ liệu má»›i từ file ZIP (XML nén) +CollectEarthWindow.55=Cập nhật các bản ghi hiện thá»i bằng CSV +CollectEarthWindow.47=Chưa định cấu hình cho Saiku Server +CollectEarthWindow.48=ZIP files +CollectEarthWindow.49=Files CSV tổng hợp +CollectEarthWindow.5=Äóng +CollectEarthWindow.50=Mở hướng dẫn ngưá»i sá»­ dụng +CollectEarthWindow.51=Kiểm tra cập nhật cá»§a Collect Earth +CollectEarthWindow.52=Mở file nhật ký ứng dụng +CollectEarthWindow.53=File nhật ký cá»§a Collect Earth +CollectEarthWindow.54=Nạp các Ä‘iểm từ KML +CollectEarthWindow.56=Vá»... +CollectEarthWindow.57=Äang chạy quá trình khởi động Saiku, xin đợi. +CollectEarthWindow.58=Không thể khởi động Saiku analysis +CollectEarthWindow.59=Bạn có muốn tạo lại bá»™ dữ liệu cho Saiku analysis không?
Quá trình này sẽ mất một vài phút.
Nếu bạn chá»n "YES" sẽ tạo ra má»™t bá»™ dữ liệu má»›i vá»›i các thông tin cập nhật nhất. +CollectEarthWindow.6=Xuất ra bảng tổng hợp +CollectEarthWindow.60=Tạo dữ liệu Saiku +CollectEarthWindow.61=Xuất dữ liệu ra XML (các bản ghi chỉnh sá»­a từ lần xuất trước) +CollectEarthWindow.62=Vá»... +CollectEarthWindow.63=Lá»—i khi nạp Ä‘iểm từ KML +CollectEarthWindow.64=Há»— trợ kỹ thuật +CollectEarthWindow.7=Lá»—i khi nhập dữ liệu +CollectEarthWindow.8=Không tìm thấy văn bản thông báo +CollectEarthWindow.9=Dữ liệu nhập vào có chứa các bản ghi đã có trong cÆ¡ sở dữ liệu cá»§a bạn. +DynamicsCode.0=Ban đầu là rừng +DynamicsCode.1=Ban đầu là trảng cá» +DynamicsCode.2=Ban đầu là khu dân cư +DynamicsCode.3=Ban đầu là đất khác +DynamicsCode.4=Ban đầu là đất ngập nước +DynamicsCode.5=Ban đầu là đất trồng trá»t +OpenTextFileListener.0=không tìm thấy file văn bản tại\: +OptionWizard.0=Các lá»±a chá»n cá»§a Collect Earth +OptionWizard.1=Chá»n Browser +OptionWizard.10=Mở thư mục lưu dá»± phòng +OptionWizard.11=Không biết\: hãy sá»­ dụng ifconfig +OptionWizard.12=Vi dụ cá»§a khác +OptionWizard.13=Äịa chỉ IP cá»§a máy chá»§ Collect Earth +OptionWizard.14=Cổng máy chá»§ Collect Earth (vd\: 8023) +OptionWizard.15=Ghi và áo dụng thay đổi +OptionWizard.16=ID +OptionWizard.17=Tá»a độ X +OptionWizard.18=Tá»a độ Y +OptionWizard.19=Äá»™ cao +OptionWizard.2=Dòng công tác (máy chá»§/khách) +OptionWizard.20=Ná»™i dung cá»§a Google Earth đã thay đổi.
Äá» nghị chấp nhận tải lại ná»™i dung khi Google Earth gợi ý. +OptionWizard.21=Cập nhật thành công +OptionWizard.22=Dốc +OptionWizard.23=Có lá»—i khi mở lại dữ liệu Google Earth +OptionWizard.24=Há»§y +OptionWizard.25=Mode vận hành +OptionWizard.26=NÆ¡i lưu cÆ¡ sở dữ liệu +OptionWizard.27=Äây không phải là thư mục Saiku (hiện không có file start-saiku.bat) +OptionWizard.28=Không nhận được máy chá»§ Saiku +OptionWizard.29=Cổng cÆ¡ sở dữ liệu +OptionWizard.3=Ví dụ cá»§a máy chá»§ +OptionWizard.30=Các lá»±a chá»n cá»§a SQLite +OptionWizard.31=Dữ liệu mẫu +OptionWizard.32=SÆ¡ đồ mẫu +OptionWizard.33=Äịnh nghÄ©a khảo sát +OptionWizard.34=Nâng cao +OptionWizard.35=Số Ä‘iểm mẫu +OptionWizard.36=Khoảng cách giữa các Ä‘iểm mẫu (tính theo mét) +OptionWizard.37=Lá» vá»›i biên ô (tính theo mét) +OptionWizard.38=Không Ä‘á»c được đúng file CSV/CED.
Cần có dấu phảy để phân tách giá trị giống như sau \:
+OptionWizard.39=ID,Tá»a độ Y,tá»a độ X,độ cao,độ dốc,tá»· lệ +OptionWizard.4=Äịa chỉ IP hiện tại cá»§a máy tính\: +OptionWizard.40=Các project +OptionWizard.41=tải file project má»›i +OptionWizard.42=Lá»—i khi đóng CSV reader +OptionWizard.43=Tên khảo sát +OptionWizard.44=tá»± động lưu dá»± phòng dữ liệu tại +OptionWizard.45=Mở Earth Engine để phóng to vào khu vá»±c ô +OptionWizard.46=Mở Earth Engine timelapse cho khu vá»±c ô +OptionWizard.47=Mở Bing Maps cho khu vá»±c ô +OptionWizard.48=Mở form trên browser thay vì mở Google Earth (khuyến cáo cho LINUX) +OptionWizard.49=ÄÆ°á»ng dẫn tá»›i file ced/csv file vá»›i dữ liệu ô +OptionWizard.5=Cổng máy chá»§ Collect Earth\: +OptionWizard.50=Browse... +OptionWizard.51=Lá»—i nhập file project +OptionWizard.52=File CSV/CED chỉ có tá»a độ +OptionWizard.53=Ô vuông +OptionWizard.54=Äiểm trung tâm +OptionWizard.55=Lá»—i khi nhập thư mục project +OptionWizard.56=Tải project +OptionWizard.57=Các project đã tải +OptionWizard.58=Mở GEE Code Editor (cần phải có quyá»n truy cập Trusted Tester) +OptionWizard.59=Mở Here Maps tập trung vào ô +OptionWizard.6=Các thông số cá»§a CSDL PostgreSQL +OptionWizard.65=ÄÆ°á»ng dẫn tá»›i thư mục Saiku +OptionWizard.66=Browse... +OptionWizard.67=ÄÆ°á»ng dẫn tá»›i Firefox executable (file exe) +OptionWizard.68=Browse... +OptionWizard.7=Tên ngưá»i sá»­ dụng +OptionWizard.70=File chạy +OptionWizard.72=File nhị phân +OptionWizard.73=ÄÆ°á»ng dẫn tá»›i Chrome executable (file exe) +OptionWizard.74=Browse... +OptionWizard.76=File exe +OptionWizard.78=File nhị phân +OptionWizard.79=ÄÆ°á»ng dẫn tá»›i KML Freemarker template +OptionWizard.8=Mật khẩu +OptionWizard.80=Browse... +OptionWizard.82=Freemarker template +OptionWizard.83=ÄÆ°á»ng dẫn tá»›i mẫu thiết kế HTML Balloon +OptionWizard.84=Browse... +OptionWizard.86=HTML webpage +OptionWizard.87=ÄÆ°á»ng dẫn tá»›i XML vá»›i định nghÄ©a IDM +OptionWizard.88=Browse... +OptionWizard.9=Tên CSDL +OptionWizard.90=Äịnh nghÄ©a XML IDM +OptionWizard.91=Máy chá»§ (phiên bản quản lý hoặc sá»­ dụng độc lập) +OptionWizard.92=Khách (ngưá»i sá»­ dụng/kết nối vá»›i máy chá»§) +OptionWizard.93=SQLite (tích hợp/file đơn lẻ) +OptionWizard.94=PostgreSQL +SaikuAnalysisListener.0=Yes - Làm má»›i lại dữ liệu Saiku (quá trình dài) +SaikuAnalysisListener.1=No - chỉ khởi động Saiku +SaikuStarter.1=Khởi động Saiku +SaikuStarter.2=Cần vài phút để khởi động Saiku, xin đợi\! +SaveEarthDataServlet.0=Yêu cầu trống +SaveEarthDataServlet.1=Có trục trặc khi ghi dữ liệu vào CSDL +SaveEarthDataServlet.2=Dữ liệu đã được ghi +SlopeCode.0=Bằng phẳng (0-5) +EarthApp.11=Collect Earth Ä‘ang chạy +EarthApp.21=Không tìm thấy file chứa lưới ô trong đưá»ng dẫn đã chá»n \:
+EarthApp.23=Chưa thiết lập file CSV/CED \:

+EarthApp.24=Không tìm thấy file chứa Freemarker template vá»›i định nghÄ©a KML trong đưá»ng dẫn đã chá»n\:
+EarthApp.26=Chưa thiết lập file định nghĩa KML d\:

+EarthApp.27=Không tìm thấy file chứa mẫu HTML balloon trong đưá»ng dẫn đã chá»n\:
+EarthApp.29=Chưa thiết lập file HTML balloon \:

+EarthApp.3=Nhắc nhở sau +EarthApp.30=Xin hãy Ä‘iá»u chỉnh đúng địa chỉ file trong Tools->Properties menu. +EarthApp.4=Cập nhật luôn +EarthApp.5=Không nhắc nữa +EarthApp.57=Äã có phiên bản má»›i cá»§a Collect Earth\!
Bạn muốn làm tiếp như thế nào? +EarthApp.58=Thông báo cập nhật +EarthApp.59=Lỗi khi nhập file project +EarthApp.6=\ - Phiên bản +EarthApp.61=Không mở được file Collect Earth.
Äá» nghị đảm bảo đã cài đặt Google Earth. +EarthSurveyService.9=Trưá»ng bắt buá»™c +ExportActionListener.1=Chá»n ngày xuất bản ghi +ExportDialogProcessMonitor.0=Äang xá»­ lý dữ liệu... +ExportDialogProcessMonitor.1=Äang đợi khởi động quá trình\: +ExportDialogProcessMonitor.4=Các bản ghi đã xuất\: +ImportProcessMonitorDialog.0=Các bản ghi đã nhập\: +ImportActionListener.0=Có nhập dữ liệu các ô chưa được Ä‘iá»n đầy đủ không? +ImportActionListener.2=Nếu bạn chá»n NO sẽ chỉ nhập dữ liệu cá»§a các ô có trạng thái màu "xanh lá cây", các ô đã có đầy đủ dữ liệu. +ImportActionListener.3=Nhập các bản ghi chưa hoàn tất +ImportDialogProcessMonitor.0=\ ÄANG TÃNH TOÃN +ImportDialogProcessMonitor.11=Số lượng ban đầu các bản ghi\: +ImportDialogProcessMonitor.2=Äang nhập các bản ghi... +ImportDialogProcessMonitor.5=Số lượng thá»±c tế các bản ghi đã nhập\: +ImportDialogProcessMonitor.8=Äang xá»­ lý dữ liệu... +InfiniteProgressMonitor.0=Há»§y lệnh +JFileChooserExistsAware.0=File project cá»§a Collect Earth +KmlImportService.13=Chá»n file CSV file để ghi địa Ä‘iểm cá»§a ô vào +MissingPlotsListener.0=Lá»—i khi lấy thông tin vỠô không có trong CSDL +MissingPlotsListener.1=Các ô thiếu +MissingPlotsListener.10=Tổng số ô trong thiết kế chá»n mẫu \: +MissingPlotsListener.12=Số ô thiếu\: +MissingPlotsListener.14=Äã Ä‘iá»n tất cả các ô\! +MissingPlotsListener.2=Sao chép ná»™i dung vào bàn phím +MissingPlotsListener.3=Lá»±a chá»n file có chứa thông tin ô ( file .csv hoặc .ced ) mà bạn muốn biết đã Ä‘iá»n đủ dữ liệu chưa. +MissingPlotsListener.4=Các ô thiếu - thông tin +MissingPlotsListener.5=Từ file \: +MissingPlotsListener.6=Xuất ra file CED +ProcessMonitorDialog.1=Tìm lá»—i trên số dòng +ProcessMonitorDialog.4=, cá»™t +ProcessMonitorDialog.5=\ -- giá trị From 41cf8089ff14297a8b028235137b679b2c51c208 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:36:55 +0100 Subject: [PATCH 0827/1620] New translations utf8_orig_Messages_vi.properties (Spanish) --- .../org/openforis/collect/earth/app/view/Messages_es.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 5110140e9c..353fe0d367 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -54,7 +54,7 @@ CollectEarthWindow.45=Xuất dữ liệu ra XML (nén) CollectEarthWindow.46=Nhập dữ liệu má»›i từ file ZIP (XML nén) CollectEarthWindow.55=Cập nhật các bản ghi hiện thá»i bằng CSV CollectEarthWindow.47=Chưa định cấu hình cho Saiku Server -CollectEarthWindow.48=Zip/collect-data files +CollectEarthWindow.48=ZIP files CollectEarthWindow.49=Files CSV tổng hợp CollectEarthWindow.5=Äóng CollectEarthWindow.50=Mở hướng dẫn ngưá»i sá»­ dụng From add169538672cfb4f11f0ca18e1bbbc074cf9739 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:36:56 +0100 Subject: [PATCH 0828/1620] New translations utf8_orig_Messages_vi.properties (Portuguese) --- .../earth/app/view/Messages_pt.properties | 468 ++++++++---------- 1 file changed, 217 insertions(+), 251 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index c2ce51b7bd..353fe0d367 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,255 +1,221 @@ -AboutDialog.19=Ocorreu um problema -AboutDialog.5=Para mais informações visite nosso site OpenForis.org -AboutDialog.6=Desculpe, um problema ocorreu ao tentar abrir esse link no seu navegador padrão. +AboutDialog.19=Äã có lá»—i +AboutDialog.5=Truy cập website cá»§a chúng tôi để biết thêm thông tin OpenForis.org +AboutDialog.6=Xin lá»—i, đã có sá»± cố khi mở link trong brower chuẩn trong hệ thống cá»§a bạn. AboutDialog.8=Ok -AspectCode.0=Norte -AspectCode.1=Nordeste -AspectCode.2=Leste -AspectCode.3=Sudeste -AspectCode.4=Sul -AspectCode.5=Sudoeste -AspectCode.6=Oeste -AspectCode.7=Noroeste -CollectEarthMenu.0=Importar Arquivo CEP -CollectEarthMenu.2=Utilidades -CollectEarthMenu.3=Separar arquivo CSV em partes -CollectEarthMenu.4=Exportar dados para XML (da data específica até o tempo presente) -CollectEarthMenu.5=Exportar para Collect Backup -CollectEarthMenu.6=Exportar dados como Collect Backup (todos os dados) -CollectEarthMenu.7=Exportar dados como Collect Backup (a partir de uma data) -CollectEarthMenu.8=Exportar dados para XML (filtrar por atributo) -CollectEarthWindow.0=Erro ao tentar exportar os dados para um arquivo CSV -CollectEarthWindow.10=Arquivo -CollectEarthWindow.11=Fechar -CollectEarthWindow.12=Ferramentas -CollectEarthWindow.13=Baixar dados para CSV (Excel) -CollectEarthWindow.14=Iniciar Análise SAIKU -CollectEarthWindow.15=Propiedades -CollectEarthWindow.16=Ajuda -CollectEarthWindow.17=Declaração -CollectEarthWindow.18=Encontrar parcelas ausentes em banco de dados +AspectCode.0=Bắc +AspectCode.1=Äông-Bắc +AspectCode.2=Äông +AspectCode.3=Äông-Nam +AspectCode.4=Nam +AspectCode.5=Tây-Nam +AspectCode.6=Tây +AspectCode.7=Tây-Bắc +CollectEarthWindow.0=Lá»—i khi xuất dữ liệu sang file CSV +CollectEarthWindow.1=Lá»—i xuất dữ liệu +CollectEarthWindow.10=File +CollectEarthWindow.11=Thoát +CollectEarthWindow.12=Công cụ +CollectEarthWindow.13=Xuất dữ liệu ra CSV +CollectEarthWindow.14=Khởi động SAIKU Analysis +CollectEarthWindow.15=Thuá»™c tính +CollectEarthWindow.16=Trợ giúp +CollectEarthWindow.17=Thông tin công bố +CollectEarthWindow.18=Tìm ô thiếu trong cÆ¡ sở dữ liệu CollectEarthWindow.19=Collect Earth -CollectEarthWindow.1=Erro ao exportar -CollectEarthWindow.20=Número de registros duplicados\: -CollectEarthWindow.21=Não foi possível encontrar o ícone para a janela principal -CollectEarthWindow.22=Tem certeza de querer fechar Collect Earth?
Ao fechar a janela será fechada também o servidor de Collect Earth -CollectEarthWindow.23=Confirmação requerida -CollectEarthWindow.24=Exportar a XML -CollectEarthWindow.25=Quer importar estes registros de qualquer maneira e perder o seus dados atuais? -CollectEarthWindow.26=Operador -CollectEarthWindow.27=Atualizar -CollectEarthWindow.28=O servidor Open Foris Collect Earth deve estar em execução enquanto o operador interprete os dados. -CollectEarthWindow.29=O servidor Saiku não está configurado. -CollectEarthWindow.2=Idioma -CollectEarthWindow.30=Por favor mantenha esta janela aberta enquanto estiver usando o Google Earth. -CollectEarthWindow.31=Exportar os dados coletados para um arquivo CSV -CollectEarthWindow.32=Fechar -CollectEarthWindow.33=O nome do operador deve ser maior de que 5 caracteres e mais curto do que 50 -CollectEarthWindow.34= Erro de Validação -CollectEarthWindow.35=NOME DO OPERADOR VAZIO\!
Preencha o nome do operador e clique no botão "Atualizar". -CollectEarthWindow.36=Nome do operador não pode estar vazio -CollectEarthWindow.37=Permanecer Aberto -CollectEarthWindow.38=Arquivos de CSV -CollectEarthWindow.39=AVISO\:Se recomenda de fazer um back-up dos seus dados atuais(Exportar para XML) antes de importar os novos dados -CollectEarthWindow.3=\ Erro ao importar dados. -CollectEarthWindow.40=Configurar caminho para o arquivo onde o Servidor Saiku se encontra instalado em Ferramentas->Propiedades->Avançado. -CollectEarthWindow.41=Guardar dados exportados para o arquivo\: -CollectEarthWindow.42=Sair -CollectEarthWindow.43=Registros repetidos detectados -CollectEarthWindow.44=Importar/Exportar -CollectEarthWindow.45=Exportar dados para XML (comprimidos) -CollectEarthWindow.46=Importar novos dados do ZIP (XML comprimidos) -CollectEarthWindow.47=Servidor Saiku não configurado -CollectEarthWindow.48=Arquivos ZIP -CollectEarthWindow.49=Arquivos Fusion CSV -CollectEarthWindow.4=Isenção de responsabilidade da FAO -CollectEarthWindow.50=Abrir Manual de Usuário -CollectEarthWindow.51=Verificar atualizações de Collect Earth -CollectEarthWindow.52=Abrir Arquivo de Registro da aplicação -CollectEarthWindow.53=Arquivo de Registro de Collect Earth -CollectEarthWindow.54=Carregar pontos de KML -CollectEarthWindow.55=Atualizar registros atuais usando CSV -CollectEarthWindow.56=Sobre... -CollectEarthWindow.57=O processo de arranque de Saiku ainda está em execução, por favor aguarde. -CollectEarthWindow.58=Não é possível iniciar a análise com Saiku -CollectEarthWindow.59=Quer voltar a gerar o conjunto de dados para o análise de Saiku?
Este processo pode demorar vários minutos.
Se clicar em "SIM" um novo conjunto de dados com a mais recente informação será gerada. -CollectEarthWindow.5=Fechar -CollectEarthWindow.60=Geraço de dados para Saiku -CollectEarthWindow.61=Exportar dados para XML (apenas os registros adicionados/modificados) -CollectEarthWindow.62=Sobre... -CollectEarthWindow.63=Erro acessando pontos de KML -CollectEarthWindow.64=Suporte Técnico -CollectEarthWindow.65=O nome do operador foi alterado -CollectEarthWindow.66=Nome do operador -CollectEarthWindow.67=Abra a pasta de dados do CE -CollectEarthWindow.6=Exportar dados a Fusion Table -CollectEarthWindow.70=Abra o manuel desta pesquisa -CollectEarthWindow.71=Gerar ferramenta Saiku Independente -CollectEarthWindow.7=Erro ao importar os dados -CollectEarthWindow.8=Texto de isenção não foi possivel de ser encontrado -CollectEarthWindow.9=Os dados importados contém registros que já estão presentes no seu banco de dados. -DynamicsCode.0=Inicialmente Floresta -DynamicsCode.1=Inicialmente Ãrea de Pastagem -DynamicsCode.2=Inicialmente Ãrea Urbana -DynamicsCode.3=Inicialmente Outros -DynamicsCode.4=Inicialmente Ãrea Alagada -DynamicsCode.5=Inicialmente Ãrea Agrícola -EarthApp.11=Collect Earth já está em execução -EarthApp.21=O arquivo contendo o gride de pontos como CSV/CED não foi encontrado no caminho selecionado\:
-EarthApp.23=Nenhum arquivo CSV/CED foi configurado \:

-EarthApp.24=O arquivo contendo o modelo Freemarker com a definição KML não foi encontrado no caminho selecionado \:
-EarthApp.26=Nenhum arquivo de definição KML foi configurado \:

-EarthApp.27=O arquivo contendo o formato balão HTML não foi encontrado no caminho selecionado \:
-EarthApp.29=Nenhum arquivo balão HTML foi configurado \:

-EarthApp.30=Por favor corrija a localização do arquivo no menu Ferramentas->Propriedades. -EarthApp.3=Lembrar mais tarde -EarthApp.4=Atualizar Agora -EarthApp.57=Existe uma nova versão do Collect Earth disponível\!
Como gostaria de proceder? -EarthApp.58=Alerta de Atualização -EarthApp.59=Erro ao importar aquivo do projeto -EarthApp.5=Não me lembre novamente -EarthApp.61=O arquivo do Collect Earth não pôde ser aberto.
Por favor certifique-se que Google Earth esteja instalado. -EarthApp.6= - Versão -EarthApp.70=AVISO -EarthApp.71=No Mac OS X, os arquivos do projeto Collect Earth (* .cep) não serão abertos no Collect Earth quando forem clicados duas vezes.
-EarthApp.72=Use a barra de ferramentas Collect Earth para abrir os arquivos .cep \: -EarthApp.73=Collect Earth - problemas em computadores Mac OS X -EarthSurveyService.9=Campo obrigatório -ExportActionListener.1=Escolha data a partir da qual queira exportar os dados -ExportDialogProcessMonitor.0=Processando os dados... -ExportDialogProcessMonitor.1=Esperando de inicializar o processo \: -ExportDialogProcessMonitor.4=Registros importados \: -ImportActionListener.0=Deseja importar os dados das parcelas que não tenham sido completamente preenchidos? -ImportActionListener.2=Se clicar NÃO apenas os dados das parcelas em estado completo ("verde"), serão importados. -ImportActionListener.3=Importar registros incompletos -ImportDialogProcessMonitor.0=\ CALCULANDO -ImportDialogProcessMonitor.11=Cifra inicial de registros \: -ImportDialogProcessMonitor.2=Importando registros.... -ImportDialogProcessMonitor.5=Cifra final de registros importados \: -ImportDialogProcessMonitor.8=Processando dados... -ImportProcessMonitorDialog.0=Imported records \: -ImportXMLDialogProcessMonitor.1 = Substitua dados no banco de dados -ImportXMLDialogProcessMonitor.2 = Importe apenas registros não conflitantes -InfiniteProgressMonitor.0=Cancelar operação -JFileChooserExistsAware.0=Arquivo de projeto Collect Earth -KmlImportService.13=Selecione um arquivo CSV para salvar a localização dos pontos -MissingPlotsListener.0=Erro ao obter informação sobre parcelas ausentes na Base de Dados -MissingPlotsListener.10=Número total de ppontos no desenho de amostragem \: -MissingPlotsListener.12=Número de pontos perdidos \: -MissingPlotsListener.14=Todos os pontos foram preenchidos\! -MissingPlotsListener.1=Parcelas ausentes -MissingPlotsListener.2=Copiar conteúdos -MissingPlotsListener.3=Escolha os arquivos contendo informação sobre as parcelas ( .csv or .ced files ) para os quais deseja saber se todos os dados foram preenchidos. -MissingPlotsListener.4=Parcelas ausentes - informação -MissingPlotsListener.5=Do arquivo \: -MissingPlotsListener.6=Exportar para arquivo CED -NO=Não -NO_TO_ALL=Não para todos -OpenTextFileListener.0=O arquivo de texto não foi encontrado em \: -OptionWizard.0=Opções do Collect Earth -OptionWizard.100=Abrir Planet -OptionWizard.101=Llave da API do Planet -OptionWizard.1021=URL SecureWatch -OptionWizard.102=Abrir Maxar SecureWatch -OptionWizard.103=Configure o URL para o Mapa Extra (abre quando configurado) \: -OptionWizard.104=Navegadores -OptionWizard.105=Abrir Earth Map -OptionWizard.110=Use imagens mensais fornecidas pela NICFI -OptionWizard.10=Abrir arquivo de backup -OptionWizard.11=Desconhecido\: usar ifconfig -OptionWizard.12=Cliente Instância -OptionWizard.13=Collect Earth Server IP -OptionWizard.14=Collect Earth Porta de Servidor (p.ex. 8023) -OptionWizard.15=Guardar & Aplicar alteraçães +CollectEarthWindow.2=Ngôn ngữ +CollectEarthWindow.20=Số bản ghi trùng\: +CollectEarthWindow.21=Không tìm thấy biểu tượng cho khung chính +CollectEarthWindow.22=Bạn có chắc là muốn đóng Collect Earth?
Äóng cá»­a sổ cÅ©ng đóng luôn máy chá»§ Collect Earth +CollectEarthWindow.23=Cần khẳng định +CollectEarthWindow.24=Xuất ra XML +CollectEarthWindow.25=Bạn có muốn thêm các bản ghi này và bá» Ä‘i dữ liệu hiện thá»i không? +CollectEarthWindow.26=Ngưá»i sá»­ dụng +CollectEarthWindow.27=Cập nhật +CollectEarthWindow.28=Máy chá»§ Open Foris Collect Earth phải chạy khi ngưá»i sá»­ dụng giải Ä‘oán dữ liệu. +CollectEarthWindow.29=Chưa xác định cấu hình cho Máy chá»§ Saiku. +CollectEarthWindow.3=\ Lá»—i nhập +CollectEarthWindow.30=Äể mở cá»­a sổ này khi Ä‘ang sá»­ dụng Google Earth. +CollectEarthWindow.31=Xuất dữ liệu đã thu thập sang file CSV +CollectEarthWindow.32=Thoát +CollectEarthWindow.33=Tên ngưá»i sá»­ dụng phải dài hÆ¡n 5 chữ cái và ngắn hÆ¡n 50 chữ cái +CollectEarthWindow.34=Lá»—i kiểm chứng +CollectEarthWindow.35=TÊN NGƯỜI SỬ DỤNG CÃ’N TRá»NG\!
Hãy Ä‘iá»n tên ngưá»i sá»­ dụng và nhắp phím "Update". +CollectEarthWindow.36=Không được để trống phần tên ngưá»i sá»­ dụng +CollectEarthWindow.37=Äể mở +CollectEarthWindow.38=file CSV +CollectEarthWindow.39=THÔNG BÃO\: Nên lưu dá»± phòng dữ liệu hiện thá»i(Xuất ra XML) trước khi nhập dữ liệu má»›i +CollectEarthWindow.4=Thông tin công bố cá»§a FAO +CollectEarthWindow.40=Thiết lập đưá»ng dẫn tá»›i thư mục cài đặt Saiku Server trong Tools->Properties->Advanced tab. +CollectEarthWindow.41=Ghi dữ liệu xuất ra vào file\: +CollectEarthWindow.42=Thoát +CollectEarthWindow.43=Tìm thấy bản ghi có mâu thuẫn +CollectEarthWindow.44=Nhập/Xuất dữ liệu +CollectEarthWindow.45=Xuất dữ liệu ra XML (nén) +CollectEarthWindow.46=Nhập dữ liệu má»›i từ file ZIP (XML nén) +CollectEarthWindow.55=Cập nhật các bản ghi hiện thá»i bằng CSV +CollectEarthWindow.47=Chưa định cấu hình cho Saiku Server +CollectEarthWindow.48=ZIP files +CollectEarthWindow.49=Files CSV tổng hợp +CollectEarthWindow.5=Äóng +CollectEarthWindow.50=Mở hướng dẫn ngưá»i sá»­ dụng +CollectEarthWindow.51=Kiểm tra cập nhật cá»§a Collect Earth +CollectEarthWindow.52=Mở file nhật ký ứng dụng +CollectEarthWindow.53=File nhật ký cá»§a Collect Earth +CollectEarthWindow.54=Nạp các Ä‘iểm từ KML +CollectEarthWindow.56=Vá»... +CollectEarthWindow.57=Äang chạy quá trình khởi động Saiku, xin đợi. +CollectEarthWindow.58=Không thể khởi động Saiku analysis +CollectEarthWindow.59=Bạn có muốn tạo lại bá»™ dữ liệu cho Saiku analysis không?
Quá trình này sẽ mất một vài phút.
Nếu bạn chá»n "YES" sẽ tạo ra má»™t bá»™ dữ liệu má»›i vá»›i các thông tin cập nhật nhất. +CollectEarthWindow.6=Xuất ra bảng tổng hợp +CollectEarthWindow.60=Tạo dữ liệu Saiku +CollectEarthWindow.61=Xuất dữ liệu ra XML (các bản ghi chỉnh sá»­a từ lần xuất trước) +CollectEarthWindow.62=Vá»... +CollectEarthWindow.63=Lá»—i khi nạp Ä‘iểm từ KML +CollectEarthWindow.64=Há»— trợ kỹ thuật +CollectEarthWindow.7=Lá»—i khi nhập dữ liệu +CollectEarthWindow.8=Không tìm thấy văn bản thông báo +CollectEarthWindow.9=Dữ liệu nhập vào có chứa các bản ghi đã có trong cÆ¡ sở dữ liệu cá»§a bạn. +DynamicsCode.0=Ban đầu là rừng +DynamicsCode.1=Ban đầu là trảng cá» +DynamicsCode.2=Ban đầu là khu dân cư +DynamicsCode.3=Ban đầu là đất khác +DynamicsCode.4=Ban đầu là đất ngập nước +DynamicsCode.5=Ban đầu là đất trồng trá»t +OpenTextFileListener.0=không tìm thấy file văn bản tại\: +OptionWizard.0=Các lá»±a chá»n cá»§a Collect Earth +OptionWizard.1=Chá»n Browser +OptionWizard.10=Mở thư mục lưu dá»± phòng +OptionWizard.11=Không biết\: hãy sá»­ dụng ifconfig +OptionWizard.12=Vi dụ cá»§a khác +OptionWizard.13=Äịa chỉ IP cá»§a máy chá»§ Collect Earth +OptionWizard.14=Cổng máy chá»§ Collect Earth (vd\: 8023) +OptionWizard.15=Ghi và áo dụng thay đổi OptionWizard.16=ID -OptionWizard.17=X-coord -OptionWizard.18=Y-coord -OptionWizard.19=Elevação -OptionWizard.1=Escolher Navegador -OptionWizard.20= Os conteúdos de Google Earth foram alterados.
Por favor aceite a regarga do conteúdo uma vez que Google Earth lhe pergunte. -OptionWizard.21=Atualizado com sucesso -OptionWizard.22=Relevo -OptionWizard.23=Houve um erro ao reabrir os dados de Google Earth -OptionWizard.24=Cancelar -OptionWizard.25=Modo de Operação -OptionWizard.26=BBDD servidor -OptionWizard.27=Isto não é um Arquivo Saiku reconhecível (o arquivo start-saiku.bat não se encontra presente) -OptionWizard.28=Servidor Saiku não reconhecível -OptionWizard.29=BBDD porta -OptionWizard.2=Tipo de uso(servidor/cliente) -OptionWizard.30=Opçães SQLite -OptionWizard.31=Dados de amostra -OptionWizard.32=Disposição da Parcela -OptionWizard.33=Definiço de Questionários -OptionWizard.34=Serviços Integrados -OptionWizard.35=Número de pontos de control -OptionWizard.36=Distância entre os pontos de control (em metros) -OptionWizard.37=Margem com o perímetro da parcela (em metros) -OptionWizard.38=O arquivo CSV/CED não foi possivel ser lido corretamente.
O arquivo deve conter valores separados por vírgulas do seguinte modo\:
-OptionWizard.39=ID,Y-Coordenada,X-Coordenada,elevação,relevo,orientação -OptionWizard.3=Servidor Instance -OptionWizard.40=Projetos -OptionWizard.41=Carregar um novo arquivo de projeto -OptionWizard.42=Erro ao fechar o leitor CSV -OptionWizard.43=Nome do questionário -OptionWizard.44=Realizar automaticamente backup do banco de dados em -OptionWizard.45=Abrir Earth Engine Playground (descontinuado) -OptionWizard.46=Abrir Earth Engine Timelapse -OptionWizard.47=Abrir Bing Maps -OptionWizard.48=Abrir formulário em um navegador externo em vez de Google Earth (recomendado para LINUX) -OptionWizard.49=Caminho do arquivo CED/CSV com as coordenadas das parcelas -OptionWizard.4=IP do computador atual\: -OptionWizard.50=Navegar.. -OptionWizard.51=Erro ao importar os arquivos do projeto -OptionWizard.52= Arquivo CSV/CED com coordinadas -OptionWizard.53=Sem pontos -OptionWizard.54=Ponto Central -OptionWizard.55=Erro ao importar diretório do projeto -OptionWizard.56=Carregar projeto -OptionWizard.57=Projetos previamente carregados -OptionWizard.58=Abrir GEE Code Editor (requer acesso ao Trusted Tester) -OptionWizard.59=Abrir Here Maps focado no ponto -OptionWizard.5= Collect Earth Servidor porto\: -OptionWizard.65=Caminho para arquivo Saiku -OptionWizard.66=Navegar... -OptionWizard.67=Caminho para o executável do Firefox -OptionWizard.68=Navegar... -OptionWizard.6=Parâmetros BD PostgreSQL -OptionWizard.70=Arquivos executáveis -OptionWizard.72=Arquivos binários -OptionWizard.73=Caminho para o executável do Chrome -OptionWizard.74=Navegar... -OptionWizard.76=Arquivos executáveis -OptionWizard.78=Arquivos binarios -OptionWizard.79=Caminho para o padrão de KML Freemarker -OptionWizard.7=Nome de Usuário -OptionWizard.80=Navegar... -OptionWizard.82=Padrão Freemarker -OptionWizard.83=Caminho para formulário HTML Balloon -OptionWizard.84=Navegar... -OptionWizard.86=Pagina web HTML -OptionWizard.87=Caminho para XML com definição IDM -OptionWizard.88=Navegar... -OptionWizard.8=Senha -OptionWizard.90=Definiço XML IDM -OptionWizard.91=Servidor (versão para gerente ou uso autônomo) -OptionWizard.92=Cliente (operador/conectado ao servidor) -OptionWizard.93=SQLite (Embutido/com base em um único arquivo) +OptionWizard.17=Tá»a độ X +OptionWizard.18=Tá»a độ Y +OptionWizard.19=Äá»™ cao +OptionWizard.2=Dòng công tác (máy chá»§/khách) +OptionWizard.20=Ná»™i dung cá»§a Google Earth đã thay đổi.
Äá» nghị chấp nhận tải lại ná»™i dung khi Google Earth gợi ý. +OptionWizard.21=Cập nhật thành công +OptionWizard.22=Dốc +OptionWizard.23=Có lá»—i khi mở lại dữ liệu Google Earth +OptionWizard.24=Há»§y +OptionWizard.25=Mode vận hành +OptionWizard.26=NÆ¡i lưu cÆ¡ sở dữ liệu +OptionWizard.27=Äây không phải là thư mục Saiku (hiện không có file start-saiku.bat) +OptionWizard.28=Không nhận được máy chá»§ Saiku +OptionWizard.29=Cổng cÆ¡ sở dữ liệu +OptionWizard.3=Ví dụ cá»§a máy chá»§ +OptionWizard.30=Các lá»±a chá»n cá»§a SQLite +OptionWizard.31=Dữ liệu mẫu +OptionWizard.32=SÆ¡ đồ mẫu +OptionWizard.33=Äịnh nghÄ©a khảo sát +OptionWizard.34=Nâng cao +OptionWizard.35=Số Ä‘iểm mẫu +OptionWizard.36=Khoảng cách giữa các Ä‘iểm mẫu (tính theo mét) +OptionWizard.37=Lá» vá»›i biên ô (tính theo mét) +OptionWizard.38=Không Ä‘á»c được đúng file CSV/CED.
Cần có dấu phảy để phân tách giá trị giống như sau \:
+OptionWizard.39=ID,Tá»a độ Y,tá»a độ X,độ cao,độ dốc,tá»· lệ +OptionWizard.4=Äịa chỉ IP hiện tại cá»§a máy tính\: +OptionWizard.40=Các project +OptionWizard.41=tải file project má»›i +OptionWizard.42=Lá»—i khi đóng CSV reader +OptionWizard.43=Tên khảo sát +OptionWizard.44=tá»± động lưu dá»± phòng dữ liệu tại +OptionWizard.45=Mở Earth Engine để phóng to vào khu vá»±c ô +OptionWizard.46=Mở Earth Engine timelapse cho khu vá»±c ô +OptionWizard.47=Mở Bing Maps cho khu vá»±c ô +OptionWizard.48=Mở form trên browser thay vì mở Google Earth (khuyến cáo cho LINUX) +OptionWizard.49=ÄÆ°á»ng dẫn tá»›i file ced/csv file vá»›i dữ liệu ô +OptionWizard.5=Cổng máy chá»§ Collect Earth\: +OptionWizard.50=Browse... +OptionWizard.51=Lá»—i nhập file project +OptionWizard.52=File CSV/CED chỉ có tá»a độ +OptionWizard.53=Ô vuông +OptionWizard.54=Äiểm trung tâm +OptionWizard.55=Lá»—i khi nhập thư mục project +OptionWizard.56=Tải project +OptionWizard.57=Các project đã tải +OptionWizard.58=Mở GEE Code Editor (cần phải có quyá»n truy cập Trusted Tester) +OptionWizard.59=Mở Here Maps tập trung vào ô +OptionWizard.6=Các thông số cá»§a CSDL PostgreSQL +OptionWizard.65=ÄÆ°á»ng dẫn tá»›i thư mục Saiku +OptionWizard.66=Browse... +OptionWizard.67=ÄÆ°á»ng dẫn tá»›i Firefox executable (file exe) +OptionWizard.68=Browse... +OptionWizard.7=Tên ngưá»i sá»­ dụng +OptionWizard.70=File chạy +OptionWizard.72=File nhị phân +OptionWizard.73=ÄÆ°á»ng dẫn tá»›i Chrome executable (file exe) +OptionWizard.74=Browse... +OptionWizard.76=File exe +OptionWizard.78=File nhị phân +OptionWizard.79=ÄÆ°á»ng dẫn tá»›i KML Freemarker template +OptionWizard.8=Mật khẩu +OptionWizard.80=Browse... +OptionWizard.82=Freemarker template +OptionWizard.83=ÄÆ°á»ng dẫn tá»›i mẫu thiết kế HTML Balloon +OptionWizard.84=Browse... +OptionWizard.86=HTML webpage +OptionWizard.87=ÄÆ°á»ng dẫn tá»›i XML vá»›i định nghÄ©a IDM +OptionWizard.88=Browse... +OptionWizard.9=Tên CSDL +OptionWizard.90=Äịnh nghÄ©a XML IDM +OptionWizard.91=Máy chá»§ (phiên bản quản lý hoặc sá»­ dụng độc lập) +OptionWizard.92=Khách (ngưá»i sá»­ dụng/kết nối vá»›i máy chá»§) +OptionWizard.93=SQLite (tích hợp/file đơn lẻ) OptionWizard.94=PostgreSQL -OptionWizard.95=Side of the sampling dots (in meters) -OptionWizard.9= Nome da Base de Dados -ProcessMonitorDialog.1=Erro de análise na linha número -ProcessMonitorDialog.4=, colunas -ProcessMonitorDialog.5= -- valores -SaikuAnalysisListener.0=Sim - Atualizar dados Saiku (longo processo) -SaikuAnalysisListener.1=Não - Use a mesma versão dos dados da última vez que o Saiku foi usado -SaikuToolExportListener.1=Geração da ferramenta Saiku -SaikuToolExportListener.2=Gerando a Ferramenta Saiku com o banco de dados atual -SaikuStarter.1=Iniciando Saiku -SaikuStarter.2=Iniciando Saiku pode demorar uns minutos, por favor aguarde\! -SaveEarthDataServlet.0=Sem dados -SaveEarthDataServlet.1=Problema ocorreu ao guardar os dados na Base de Dados -SaveEarthDataServlet.2=Os dados foram guardados -SlopeCode.0=Plano (0-5) -YES=Sim -YES_TO_ALL=Sim a todas \ No newline at end of file +SaikuAnalysisListener.0=Yes - Làm má»›i lại dữ liệu Saiku (quá trình dài) +SaikuAnalysisListener.1=No - chỉ khởi động Saiku +SaikuStarter.1=Khởi động Saiku +SaikuStarter.2=Cần vài phút để khởi động Saiku, xin đợi\! +SaveEarthDataServlet.0=Yêu cầu trống +SaveEarthDataServlet.1=Có trục trặc khi ghi dữ liệu vào CSDL +SaveEarthDataServlet.2=Dữ liệu đã được ghi +SlopeCode.0=Bằng phẳng (0-5) +EarthApp.11=Collect Earth Ä‘ang chạy +EarthApp.21=Không tìm thấy file chứa lưới ô trong đưá»ng dẫn đã chá»n \:
+EarthApp.23=Chưa thiết lập file CSV/CED \:

+EarthApp.24=Không tìm thấy file chứa Freemarker template vá»›i định nghÄ©a KML trong đưá»ng dẫn đã chá»n\:
+EarthApp.26=Chưa thiết lập file định nghĩa KML d\:

+EarthApp.27=Không tìm thấy file chứa mẫu HTML balloon trong đưá»ng dẫn đã chá»n\:
+EarthApp.29=Chưa thiết lập file HTML balloon \:

+EarthApp.3=Nhắc nhở sau +EarthApp.30=Xin hãy Ä‘iá»u chỉnh đúng địa chỉ file trong Tools->Properties menu. +EarthApp.4=Cập nhật luôn +EarthApp.5=Không nhắc nữa +EarthApp.57=Äã có phiên bản má»›i cá»§a Collect Earth\!
Bạn muốn làm tiếp như thế nào? +EarthApp.58=Thông báo cập nhật +EarthApp.59=Lỗi khi nhập file project +EarthApp.6=\ - Phiên bản +EarthApp.61=Không mở được file Collect Earth.
Äá» nghị đảm bảo đã cài đặt Google Earth. +EarthSurveyService.9=Trưá»ng bắt buá»™c +ExportActionListener.1=Chá»n ngày xuất bản ghi +ExportDialogProcessMonitor.0=Äang xá»­ lý dữ liệu... +ExportDialogProcessMonitor.1=Äang đợi khởi động quá trình\: +ExportDialogProcessMonitor.4=Các bản ghi đã xuất\: +ImportProcessMonitorDialog.0=Các bản ghi đã nhập\: +ImportActionListener.0=Có nhập dữ liệu các ô chưa được Ä‘iá»n đầy đủ không? +ImportActionListener.2=Nếu bạn chá»n NO sẽ chỉ nhập dữ liệu cá»§a các ô có trạng thái màu "xanh lá cây", các ô đã có đầy đủ dữ liệu. +ImportActionListener.3=Nhập các bản ghi chưa hoàn tất +ImportDialogProcessMonitor.0=\ ÄANG TÃNH TOÃN +ImportDialogProcessMonitor.11=Số lượng ban đầu các bản ghi\: +ImportDialogProcessMonitor.2=Äang nhập các bản ghi... +ImportDialogProcessMonitor.5=Số lượng thá»±c tế các bản ghi đã nhập\: +ImportDialogProcessMonitor.8=Äang xá»­ lý dữ liệu... +InfiniteProgressMonitor.0=Há»§y lệnh +JFileChooserExistsAware.0=File project cá»§a Collect Earth +KmlImportService.13=Chá»n file CSV file để ghi địa Ä‘iểm cá»§a ô vào +MissingPlotsListener.0=Lá»—i khi lấy thông tin vỠô không có trong CSDL +MissingPlotsListener.1=Các ô thiếu +MissingPlotsListener.10=Tổng số ô trong thiết kế chá»n mẫu \: +MissingPlotsListener.12=Số ô thiếu\: +MissingPlotsListener.14=Äã Ä‘iá»n tất cả các ô\! +MissingPlotsListener.2=Sao chép ná»™i dung vào bàn phím +MissingPlotsListener.3=Lá»±a chá»n file có chứa thông tin ô ( file .csv hoặc .ced ) mà bạn muốn biết đã Ä‘iá»n đủ dữ liệu chưa. +MissingPlotsListener.4=Các ô thiếu - thông tin +MissingPlotsListener.5=Từ file \: +MissingPlotsListener.6=Xuất ra file CED +ProcessMonitorDialog.1=Tìm lá»—i trên số dòng +ProcessMonitorDialog.4=, cá»™t +ProcessMonitorDialog.5=\ -- giá trị From ef1c1a3fffc14c50093f071c95985acb25f90675 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:36:58 +0100 Subject: [PATCH 0829/1620] New translations utf8_orig_Messages_vi.properties (English) --- .../earth/app/view/Messages_en.properties | 446 +++++++++--------- 1 file changed, 221 insertions(+), 225 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index f0355142d0..353fe0d367 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,225 +1,221 @@ -AboutDialog.19=कोई समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ -AboutDialog.5=अधिक जानकारी के लिठहमारी वेबसाइट पर जाà¤? OpenForis.org? -AboutDialog.6=कà¥à¤·à¤®à¤¾ करें, à¤à¤• समसà¥à¤¯à¤¾ आपके सिसà¥à¤Ÿà¤® के मानक बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में इस लिंक को खोलने की कोशिश कर रही है. -AboutDialog.8=ठीक -AspectCode.0=उतà¥à¤¤à¤° दिशा -AspectCode.1=उतà¥à¤¤à¤°-पूरà¥à¤µ दिशा -AspectCode.2=पूरà¥à¤µ दिशा -AspectCode.3=दकà¥à¤·à¤¿à¤£-पूरà¥à¤µ दिशा -AspectCode.4=दकà¥à¤·à¤¿à¤£ दिशा -AspectCode.5=दकà¥à¤·à¤¿à¤£-पशà¥à¤šà¤¿à¤® दिशा -AspectCode.6=पशà¥à¤šà¤¿à¤® दिशा -AspectCode.7=उतà¥à¤¤à¤°-पशà¥à¤šà¤¿à¤® दिशा -CollectEarthWindow.0=तà¥à¤°à¥à¤Ÿà¤¿ जब सीà¤à¤¸à¤µà¥€ फ़ाइल में डेटा निरà¥à¤¯à¤¾à¤¤ करने का पà¥à¤°à¤¯à¤¾à¤¸ -CollectEarthWindow.1=निरà¥à¤¯à¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.10=फ़ाइल -CollectEarthWindow.11=बाहर जाà¤à¤‚ -CollectEarthWindow.12=उपकरण -CollectEarthWindow.13=डेटा सीà¤à¤¸à¤µà¥€ निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.14=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ -CollectEarthWindow.15=गà¥à¤£ -CollectEarthWindow.16=मदद -CollectEarthWindow.17=असà¥à¤µà¥€à¤•रण -CollectEarthWindow.18=डेटाबेस में लापता भूखंडों खोजें -CollectEarthWindow.19=पृथà¥à¤µà¥€ इकटà¥à¤ à¤¾ -CollectEarthWindow.2=भाषा -CollectEarthWindow.20=डà¥à¤ªà¥à¤²à¤¿à¤•ेट रिकॉरà¥à¤¡ की संखà¥à¤¯à¤¾\: -CollectEarthWindow.21=मà¥à¤–à¥à¤¯ फà¥à¤°à¥‡à¤® के लिठआइकन नहीं मिल सकता है -CollectEarthWindow.22=आपको लगता है कि आप à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ बंद करना चाहते हैं? विंडोज बंद करने से, à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° बंद हो जाà¤à¤—ा -CollectEarthWindow.23=पà¥à¤·à¥à¤Ÿà¤¿ की जरूरत है -CollectEarthWindow.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.25=आप वैसे भी इन अभिलेखों को जोड़ना चाहते हैं और अपने वरà¥à¤¤à¤®à¤¾à¤¨ डेटा खोने के लिठकिलक करना चाहते हैं? -CollectEarthWindow.26=ऑपरेटर,पà¥à¤°à¤šà¤¾à¤²à¤• -CollectEarthWindow.27=अदà¥à¤¯à¤¤à¤¨ -CollectEarthWindow.28= औपन फौरिस à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° चल रहा होना चाहिठ, जबभी ऑपरेटर डेटा की वà¥à¤¯à¤¾à¤–à¥à¤¯à¤¾ करें . -CollectEarthWindow.29=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. -CollectEarthWindow.3= आयात संबंधी तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.30=जबभी आप गà¥à¤—ल अरà¥à¤¥ का उपयोग कर रहे हैं, कृपया इस विंडोज को खà¥à¤²à¥€ बनाठरखें. -CollectEarthWindow.31=à¤à¤•तà¥à¤° डेटा सीà¤à¤¸à¤µà¥€ फाइल में भेजें -CollectEarthWindow.32=छोड़ना -CollectEarthWindow.33=ऑपरेटर का नाम के 5 अकà¥à¤·à¤° से बड़ा और 50 अकà¥à¤·à¤° से कम होना चाहिठ-CollectEarthWindow.34=मानà¥à¤¯à¤¤à¤¾ तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.35=ऑपरेटर नाम खाली\!
कृपया ऑपरेटर का नाम भरें और "अदà¥à¤¯à¤¤à¤¨" बटन दबाà¤à¤. -CollectEarthWindow.36=ऑपरेटर नाम रिकà¥à¤¤ नहीं हो सकता -CollectEarthWindow.37=खà¥à¤²à¤¾ रखो -CollectEarthWindow.38=सीà¤à¤¸à¤µà¥€ फ़ाइल -CollectEarthWindow.39=सूचना\: यह सलाह दी जाती है कि आप नठडेटा डालने करने से पहले अपने मौजूदा आंकडों को बैकअप(à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤) कर लें -CollectEarthWindow.4=à¤à¤«à¤à¤“ असà¥à¤µà¥€à¤•रण नोटिस -CollectEarthWindow.40=उस फ़ोलà¥à¤¡à¤° पर जाà¤à¤‚ जहां साà¤à¤•ॠसरà¥à¤µà¤° में सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ किया गया है, फ़ोलà¥à¤¡à¤° का रासà¥à¤¤à¤¾ उपकरण> गà¥à¤£> उनà¥à¤¨à¤¤ टैब. -CollectEarthWindow.41=निरà¥à¤¯à¤¾à¤¤ डेटा को फ़ाइल में बचाया जा रहा है \: -CollectEarthWindow.42=छोड़ना -CollectEarthWindow.43=परसà¥à¤ªà¤° विरोधी रिकॉरà¥à¤¡ पाया -CollectEarthWindow.44=डेटा आयात / निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.45=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ डेटा (संकà¥à¤šà¤¿à¤¤) -CollectEarthWindow.46=ज़िप से नठडेटा आयात करें (संकà¥à¤šà¤¿à¤¤ à¤à¤•à¥à¤¸à¤à¤®à¤à¤²) -CollectEarthWindow.55=सीà¤à¤¸à¤µà¥€ का उपयोग कर मौजूदा रिकॉरà¥à¤¡ को अपडेट करें -CollectEarthWindow.47=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. -CollectEarthWindow.48=ज़िप / à¤à¤•तà¥à¤°-डेटा फ़ाइल -CollectEarthWindow.49=फà¥à¤¯à¥‚जन सीà¤à¤¸à¤µà¥€ फ़ाइल -CollectEarthWindow.5=बंद करे -CollectEarthWindow.50= उपयोगकरà¥à¤¤à¤¾ मैनà¥à¤…ल खोलें -CollectEarthWindow.51=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ के अदà¥à¤¯à¤¤à¤¨ के लिठजाà¤à¤š करें -CollectEarthWindow.52= अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— लॉग फ़ाइल खोलें -CollectEarthWindow.53=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ लॉग फ़ाइल -CollectEarthWindow.54=केà¤à¤®à¤à¤² से लोड अंक -CollectEarthWindow.56=के विषय में... -CollectEarthWindow.57=साà¤à¤•ॠसà¥à¤Ÿà¤¾à¤°à¥à¤Ÿà¤° पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ अभी भी चल रहा है, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें. -CollectEarthWindow.58=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ नहीं कर सकते -CollectEarthWindow.59=आप साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ के लिठडेटा सेट फिर से उतà¥à¤ªà¤¨à¥à¤¨ करने के लिठकरना चाहते हैं?
यह पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ समय लेने वाली हो सकती है.
आप यदि "हाà¤"पर कà¥à¤²à¤¿à¤• करें, तो नवीनतम जानकारी के साथ à¤à¤• नया डाटासेट उतà¥à¤ªà¤¨à¥à¤¨ हो जाà¤à¤—ा. -CollectEarthWindow.6=फà¥à¤¯à¥‚जन टेबल के लिठनिरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.60=साà¤à¤•ॠडेटा उतà¥à¤ªà¤¨à¥à¤¨ -CollectEarthWindow.61=डेटा à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ (पिछले निरà¥à¤¯à¤¾à¤¤ के बाद से संशोधित रिकॉरà¥à¤¡) -CollectEarthWindow.62=के विषय मे... -CollectEarthWindow.63=केà¤à¤®à¤à¤² से अंक पà¥à¤°à¤¾à¤ªà¥à¤¤ करने में तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.64=तकनीकी सहायता -CollectEarthWindow.7=डेटा आयात में तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.8=असà¥à¤µà¥€à¤•रण पाठ नहीं पाया जा सका -CollectEarthWindow.9=डेटा आयात रिकॉरà¥à¤¡ वह है जो कि पहले से ही अपने डेटाबेस पर मौजूद हैं शामिल. -DynamicsCode.0=पà¥à¤°à¤¾à¤°à¤‚भ में वन -DynamicsCode.1=पà¥à¤°à¤¾à¤°à¤‚भ में घास का मैदान, -DynamicsCode.2=पà¥à¤°à¤¾à¤°à¤‚भ में आबादी वाला इलाका -DynamicsCode.3=पà¥à¤°à¤¾à¤°à¤‚भ में बंजर -DynamicsCode.4=पà¥à¤°à¤¾à¤°à¤‚भ में आरà¥à¤¦à¥à¤° भूमि -DynamicsCode.5=पà¥à¤°à¤¾à¤°à¤‚भ में खेत -OpenTextFileListener.0=इस पाठ का फ़ाइल नहीं मिला \: -OptionWizard.0= विकलà¥à¤ª -OptionWizard.1=बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° चà¥à¤¨à¥‡à¤‚ -OptionWizard.10=बैकअप फ़ोलà¥à¤¡à¤° खोलें -OptionWizard.11=अजà¥à¤žà¤¾à¤¤\: उपयोग ifconfig -OptionWizard.12=गà¥à¤°à¤¾à¤¹à¤•ों का उलà¥à¤²à¥‡à¤– -OptionWizard.13=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° आईपी -OptionWizard.14=कतà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ (उदाहरण- 8023) -OptionWizard.15=बचाà¤à¤‚ और परिवरà¥à¤¤à¤¨ लागू करें -OptionWizard.16=आईडी -OptionWizard.17=X- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क -OptionWizard.18=Y- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क -OptionWizard.19=उठान -OptionWizard.2=कारà¥à¤¯à¤ªà¥à¤°à¤µà¤¾à¤¹ (सरà¥à¤µà¤° / गà¥à¤°à¤¾à¤¹à¤•) -OptionWizard.20=गूगल अरà¥à¤¥ अंतरà¥à¤µà¤¸à¥à¤¤à¥ बदल दिया गया है
यदि गà¥à¤—ल अरà¥à¤¥ आप से कहे,अंतरà¥à¤µà¤¸à¥à¤¤à¥ पà¥à¤¨à¤ƒ लोड सà¥à¤µà¥€à¤•ार करें . -OptionWizard.21=अदà¥à¤¯à¤¤à¤¨ सफल -OptionWizard.22=ढाल -OptionWizard.23=गूगल अरà¥à¤¥ डेटा को फिर से खोलने में कोई तà¥à¤°à¥à¤Ÿà¤¿ थी -OptionWizard.24=रदà¥à¤¦ करना -OptionWizard.25=ऑपरेशन मोड -OptionWizard.26=डीबी होसà¥à¤Ÿ -OptionWizard.27=यह à¤à¤• मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ साà¤à¤•ॠफ़ोलà¥à¤¡à¤° नहीं है ( सà¥à¤Ÿà¤¾à¤°à¥à¤Ÿ-साà¤à¤•à¥.batफ़ाइल मौजूद नहीं है) -OptionWizard.28=साà¤à¤•ॠसरà¥à¤µà¤° मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ नहीं -OptionWizard.29=डीबी पोरà¥à¤Ÿ -OptionWizard.3=सरà¥à¤µà¤° आवृतà¥à¤¤à¤¿ -OptionWizard.30=à¤à¤¸à¤•à¥à¤¯à¥ लाइट विकलà¥à¤ª -OptionWizard.31=सेमà¥à¤ªà¤² डेटा -OptionWizard.32=पà¥à¤²à¥‰à¤Ÿ लेआउट -OptionWizard.33=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ परिभाषा -OptionWizard.34=विकसित -OptionWizard.35=सेमà¥à¤ªà¤² अंक की संखà¥à¤¯à¤¾ -OptionWizard.36=सेमà¥à¤ªà¤² बिंदॠके बीच दूरी (मीटर में) -OptionWizard.37=भूखंड की सीमा के साथ मारà¥à¤œà¤¿à¤¨ (मीटर मे) -OptionWizard.38=सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सही ढंग से पढ़ा नहीं जा सकता.
इस फ़ाइल में à¤à¤• अलà¥à¤ªà¤µà¤¿à¤°à¤¾à¤® से अलग मूलà¥à¤¯à¥‹à¤‚ की उमà¥à¤®à¥€à¤¦ है \:
-OptionWizard.39=आईडी, वाई समनà¥à¤µà¤¯, à¤à¤•à¥à¤¸ समनà¥à¤µà¤¯, ऊंचाई, ढाल, पहलू -OptionWizard.4=वरà¥à¤¤à¤®à¤¾à¤¨ कंपà¥à¤¯à¥‚टर आईपी \: -OptionWizard.40=परियोजनाà¤à¤‚ -OptionWizard.41=à¤à¤• नई परियोजना फ़ाइल लोड करें -OptionWizard.42=सीà¤à¤¸à¤µà¥€ पाठक को बंद करते समय तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.43=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ का नाम -OptionWizard.44= सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ बैकअप डेटाबेस -OptionWizard.45=ओपन पृथà¥à¤µà¥€ इंजन ने पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° में जूम किया -OptionWizard.46=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठपृथà¥à¤µà¥€ इंजन टाइमलैपà¥à¤¸ खोलें -OptionWizard.47=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठबिंग मैपà¥à¤¸ खोलें -OptionWizard.48=बजाय गूगल अरà¥à¤¥ के फॉरà¥à¤® à¤à¤• बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° पर खोलें (लिनकà¥à¤¸ के लिठसिफारिश) -OptionWizard.49=भूखंड डेटा के साथ सीईडी / सीà¤à¤¸à¤µà¥€ फाइल भेजने के लिठपथ -OptionWizard.5=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ\: -OptionWizard.50=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.51=परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.52=केवल निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क के साथ सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल -OptionWizard.53=चौकोर -OptionWizard.54=केनà¥à¤¦à¥à¤°à¥€à¤¯ बिनà¥à¤¦à¥ -OptionWizard.55=परियोजना फ़ोलà¥à¤¡à¤° आयात तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.56=लोड परियोजना -OptionWizard.57=पहले से लोड परियोजना -OptionWizard.58= जी ई ई का मैदान खोलें (विशà¥à¤µà¤¸à¤¨à¥€à¤¯ जांचकरà¥à¤¤à¤¾ के उपयोग की आवशà¥à¤¯à¤•ता है) -OptionWizard.59=यहां भूखंड पर केंदà¥à¤°à¤¿à¤¤ मैपà¥à¤¸ खोलें -OptionWizard.6=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² डीबी मापदंड -OptionWizard.65=साà¤à¤•à¥à¤«à¤¼à¥‹à¤²à¥à¤¡à¤° का पथ -OptionWizard.66=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.67=फ़ायरफ़ॉकà¥à¤¸ निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ -OptionWizard.68=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.7=उपयोगकरà¥à¤¤à¤¾ नाम -OptionWizard.70=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों -OptionWizard.72=बाइनरी फ़ाइलें -OptionWizard.73=कà¥à¤°à¥‹à¤® निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ -OptionWizard.74=बà¥à¤°à¤¾à¤‰à¤œ -OptionWizard.76=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों -OptionWizard.78=बाइनरी फ़ाइलें -OptionWizard.79=केà¤à¤®à¤à¤² फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ के लिठपथ -OptionWizard.8=पासवरà¥à¤¡ -OptionWizard.80=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.82=फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ -OptionWizard.83=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ पà¥à¤°à¤ªà¤¤à¥à¤° डिज़ाइन करने के लिठपथ -OptionWizard.84=बà¥à¤°à¤¾à¤‰à¤œ..... -OptionWizard.86=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² वेब पेज -OptionWizard.87=पथ आइडीà¤à¤® परिभाषा के साथ à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठ-OptionWizard.88=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.9=डीबी नाम -OptionWizard.90=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² आइडीà¤à¤® परिभाषा -OptionWizard.91=सरà¥à¤µà¤° (पà¥à¤°à¤¬à¤‚धक संसà¥à¤•रण या खड़े अकेले का उपयोग करें) -OptionWizard.92=कà¥à¤²à¤¾à¤‡à¤‚ट (ऑपरेटर / सरà¥à¤µà¤° से जà¥à¤¡à¤¼à¥‡) -OptionWizard.93=सकà¥à¤¯à¥‚à¤à¤²à¤¾à¤‡à¤Ÿ (à¤à¤‚बेडेड / à¤à¤•ल फाइल आधारित) -OptionWizard.94=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² -OptionWizard.95=सेमà¥à¤ªà¤² डॉटà¥à¤¸ के साइड (मीटर में) -SaikuAnalysisListener.0=हाठ- ताज़ा साà¤à¤•ॠडेटा (लंबी पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾) -SaikuAnalysisListener.1=नहीं - बस साà¤à¤•ॠशà¥à¤°à¥‚ -SaikuStarter.1=साà¤à¤•ॠशà¥à¤°à¥‚ -SaikuStarter.2= साà¤à¤•ॠशà¥à¤°à¥‚ कà¥à¤› मिनट लग सकते हैं, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें\! -SaveEarthDataServlet.0=खाली अनà¥à¤°à¥‹à¤§ -SaveEarthDataServlet.1= डेटाबेस में डेटा बचाते समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ है -SaveEarthDataServlet.2=डेटा बचाया था -SlopeCode.0=समतल (0-5) -EarthApp.11=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ पहले से ही चल रहा है -EarthApp.21=à¤à¤• सीà¤à¤¸à¤µà¥€ / सीईडी के रूप में भूखंडों की गà¥à¤°à¤¿à¤¡ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
-EarthApp.23=कोई सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सेट-अप नहीं किया गया है \:

-EarthApp.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² परिभाषा के साथ फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है \:
-EarthApp.26=कोई à¤à¤•à¥à¤¸à¤à¤®à¤à¤² फ़ाइल परिभाषा सेट अप नहीं किया गया है \:

-EarthApp.27=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ रूप से यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
-EarthApp.29=कोई à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ फ़ाइल सेट-अप नहीं किया गया है \:

-EarthApp.3=मà¥à¤à¥‡ बाद में याद दिलाना -EarthApp.30=उपकरण> गà¥à¤£ मेनू में फ़ाइल सà¥à¤¥à¤¾à¤¨ को ठीक करें . -EarthApp.4=अभी अदà¥à¤¯à¤¤à¤¨ करें -EarthApp.5=मà¥à¤à¥‡ दà¥à¤¬à¤¾à¤°à¤¾ याद मत दिलाना -EarthApp.57=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ का à¤à¤• नया संसà¥à¤•रण उपलबà¥à¤§ है\!
आप कैसे आगे बढ़ना चाहते हैं? -EarthApp.58=अदà¥à¤¯à¤¤à¤¨ चेतावनी -EarthApp.59= परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ -EarthApp.6=\ - संसà¥à¤•रण -EarthApp.61=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ फाइल खà¥à¤² नहीं सकती .
कृपया सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करें कि गूगल अरà¥à¤¥ सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ है. -EarthSurveyService.9=आवशà¥à¤¯à¤• कà¥à¤·à¥‡à¤¤à¥à¤° -ExportActionListener.1= तारीख चूनें जबसे रिकॉरà¥à¤¡ निरà¥à¤¯à¤¾à¤¤ करने है -ExportDialogProcessMonitor.0=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... -ExportDialogProcessMonitor.1=पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ पà¥à¤°à¤¾à¤°à¤‚भ करने के लिठपà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ कर रहा है \: -ExportDialogProcessMonitor.4=निरà¥à¤¯à¤¾à¤¤ रिकॉरà¥à¤¡\: -ImportProcessMonitorDialog.0=आयातित रिकॉरà¥à¤¡ \: -ImportActionListener.0=कà¥à¤¯à¤¾ उन भूखंडों के लिठडेटा जो कि पूरी तरह से भरे नहीं गठ,आयातित किया जाना चाहिà¤? -ImportActionListener.2=आप कà¥à¤²à¤¿à¤• करें, नहींतो केवल डेटा "हरी" राजà¥à¤¯ में भूखंडों से ,जिसमें सभी डेटा यà¥à¤•à¥à¤¤ है , आयात किया जाà¤à¤—ा। -ImportDialogProcessMonitor.0=\ गणना -ImportDialogProcessMonitor.11=रिकॉरà¥à¤¡ की पà¥à¤°à¤¾à¤°à¤‚भिक संखà¥à¤¯à¤¾ \: -ImportDialogProcessMonitor.2=रिकॉरà¥à¤¡ आयात... -ImportDialogProcessMonitor.5=आयातित रिकॉरà¥à¤¡ की वासà¥à¤¤à¤µà¤¿à¤• संखà¥à¤¯à¤¾ \: -ImportDialogProcessMonitor.8=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... -InfiniteProgressMonitor.0=रदà¥à¤¦ ऑपरेशन -JFileChooserExistsAware.0=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ परियोजना फ़ाइल -KmlImportService.13=पà¥à¤²à¥‰à¤Ÿ सà¥à¤¥à¤¾à¤¨à¥‹à¤‚ को बचाने के लिठà¤à¤• सीà¤à¤¸à¤µà¥€ फ़ाइल का चयन करें -MissingPlotsListener.0=तà¥à¤°à¥à¤Ÿà¤¿ उन भूखंडों के बारे में जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ करने के लिठजो डेटाबेस पर मौजूद नहीं -MissingPlotsListener.1=गà¥à¤® भूखंड -MissingPlotsListener.10=सेमà¥à¤ªà¤² डिजाइन में भूखंडों की कà¥à¤² संखà¥à¤¯à¤¾ \: -MissingPlotsListener.12=गà¥à¤® भूखंडों की संखà¥à¤¯à¤¾ \: -MissingPlotsListener.14=सभी भूखंडों भर रहे हैं\! -MissingPlotsListener.2=कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ अंतरà¥à¤µà¤¸à¥à¤¤à¥ की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ -MissingPlotsListener.3=भूखंड की जानकारी वाले फ़ाइलें चà¥à¤¨à¥‡à¤‚ ( .सीà¤à¤¸à¤µà¥€ या .सीईडी फ़ाइलें ) जिसके लिठआप जानना चाहते हैं तो सभी डेटा भर दिया गया है चाहता हूà¤. -MissingPlotsListener.4=गà¥à¤® भूखंड- जानकारी -MissingPlotsListener.5=फ़ाइल से \: -MissingPlotsListener.6=सीà¤à¤¡à¥€ फ़ाइल में निरà¥à¤¯à¤¾à¤¤ करें -ProcessMonitorDialog.1=पंकà¥à¤¤à¤¿ संखà¥à¤¯à¤¾ पर तà¥à¤°à¥à¤Ÿà¤¿ -ProcessMonitorDialog.4=, कॉलम -ProcessMonitorDialog.5=\ --मूलà¥à¤¯ -YES= हां -YES_TO_ALL=सब को हां -NO=नहीं -NO_TO_ALL=सभी को नहीं +AboutDialog.19=Äã có lá»—i +AboutDialog.5=Truy cập website cá»§a chúng tôi để biết thêm thông tin OpenForis.org +AboutDialog.6=Xin lá»—i, đã có sá»± cố khi mở link trong brower chuẩn trong hệ thống cá»§a bạn. +AboutDialog.8=Ok +AspectCode.0=Bắc +AspectCode.1=Äông-Bắc +AspectCode.2=Äông +AspectCode.3=Äông-Nam +AspectCode.4=Nam +AspectCode.5=Tây-Nam +AspectCode.6=Tây +AspectCode.7=Tây-Bắc +CollectEarthWindow.0=Lá»—i khi xuất dữ liệu sang file CSV +CollectEarthWindow.1=Lá»—i xuất dữ liệu +CollectEarthWindow.10=File +CollectEarthWindow.11=Thoát +CollectEarthWindow.12=Công cụ +CollectEarthWindow.13=Xuất dữ liệu ra CSV +CollectEarthWindow.14=Khởi động SAIKU Analysis +CollectEarthWindow.15=Thuá»™c tính +CollectEarthWindow.16=Trợ giúp +CollectEarthWindow.17=Thông tin công bố +CollectEarthWindow.18=Tìm ô thiếu trong cÆ¡ sở dữ liệu +CollectEarthWindow.19=Collect Earth +CollectEarthWindow.2=Ngôn ngữ +CollectEarthWindow.20=Số bản ghi trùng\: +CollectEarthWindow.21=Không tìm thấy biểu tượng cho khung chính +CollectEarthWindow.22=Bạn có chắc là muốn đóng Collect Earth?
Äóng cá»­a sổ cÅ©ng đóng luôn máy chá»§ Collect Earth +CollectEarthWindow.23=Cần khẳng định +CollectEarthWindow.24=Xuất ra XML +CollectEarthWindow.25=Bạn có muốn thêm các bản ghi này và bá» Ä‘i dữ liệu hiện thá»i không? +CollectEarthWindow.26=Ngưá»i sá»­ dụng +CollectEarthWindow.27=Cập nhật +CollectEarthWindow.28=Máy chá»§ Open Foris Collect Earth phải chạy khi ngưá»i sá»­ dụng giải Ä‘oán dữ liệu. +CollectEarthWindow.29=Chưa xác định cấu hình cho Máy chá»§ Saiku. +CollectEarthWindow.3=\ Lá»—i nhập +CollectEarthWindow.30=Äể mở cá»­a sổ này khi Ä‘ang sá»­ dụng Google Earth. +CollectEarthWindow.31=Xuất dữ liệu đã thu thập sang file CSV +CollectEarthWindow.32=Thoát +CollectEarthWindow.33=Tên ngưá»i sá»­ dụng phải dài hÆ¡n 5 chữ cái và ngắn hÆ¡n 50 chữ cái +CollectEarthWindow.34=Lá»—i kiểm chứng +CollectEarthWindow.35=TÊN NGƯỜI SỬ DỤNG CÃ’N TRá»NG\!
Hãy Ä‘iá»n tên ngưá»i sá»­ dụng và nhắp phím "Update". +CollectEarthWindow.36=Không được để trống phần tên ngưá»i sá»­ dụng +CollectEarthWindow.37=Äể mở +CollectEarthWindow.38=file CSV +CollectEarthWindow.39=THÔNG BÃO\: Nên lưu dá»± phòng dữ liệu hiện thá»i(Xuất ra XML) trước khi nhập dữ liệu má»›i +CollectEarthWindow.4=Thông tin công bố cá»§a FAO +CollectEarthWindow.40=Thiết lập đưá»ng dẫn tá»›i thư mục cài đặt Saiku Server trong Tools->Properties->Advanced tab. +CollectEarthWindow.41=Ghi dữ liệu xuất ra vào file\: +CollectEarthWindow.42=Thoát +CollectEarthWindow.43=Tìm thấy bản ghi có mâu thuẫn +CollectEarthWindow.44=Nhập/Xuất dữ liệu +CollectEarthWindow.45=Xuất dữ liệu ra XML (nén) +CollectEarthWindow.46=Nhập dữ liệu má»›i từ file ZIP (XML nén) +CollectEarthWindow.55=Cập nhật các bản ghi hiện thá»i bằng CSV +CollectEarthWindow.47=Chưa định cấu hình cho Saiku Server +CollectEarthWindow.48=ZIP files +CollectEarthWindow.49=Files CSV tổng hợp +CollectEarthWindow.5=Äóng +CollectEarthWindow.50=Mở hướng dẫn ngưá»i sá»­ dụng +CollectEarthWindow.51=Kiểm tra cập nhật cá»§a Collect Earth +CollectEarthWindow.52=Mở file nhật ký ứng dụng +CollectEarthWindow.53=File nhật ký cá»§a Collect Earth +CollectEarthWindow.54=Nạp các Ä‘iểm từ KML +CollectEarthWindow.56=Vá»... +CollectEarthWindow.57=Äang chạy quá trình khởi động Saiku, xin đợi. +CollectEarthWindow.58=Không thể khởi động Saiku analysis +CollectEarthWindow.59=Bạn có muốn tạo lại bá»™ dữ liệu cho Saiku analysis không?
Quá trình này sẽ mất một vài phút.
Nếu bạn chá»n "YES" sẽ tạo ra má»™t bá»™ dữ liệu má»›i vá»›i các thông tin cập nhật nhất. +CollectEarthWindow.6=Xuất ra bảng tổng hợp +CollectEarthWindow.60=Tạo dữ liệu Saiku +CollectEarthWindow.61=Xuất dữ liệu ra XML (các bản ghi chỉnh sá»­a từ lần xuất trước) +CollectEarthWindow.62=Vá»... +CollectEarthWindow.63=Lá»—i khi nạp Ä‘iểm từ KML +CollectEarthWindow.64=Há»— trợ kỹ thuật +CollectEarthWindow.7=Lá»—i khi nhập dữ liệu +CollectEarthWindow.8=Không tìm thấy văn bản thông báo +CollectEarthWindow.9=Dữ liệu nhập vào có chứa các bản ghi đã có trong cÆ¡ sở dữ liệu cá»§a bạn. +DynamicsCode.0=Ban đầu là rừng +DynamicsCode.1=Ban đầu là trảng cá» +DynamicsCode.2=Ban đầu là khu dân cư +DynamicsCode.3=Ban đầu là đất khác +DynamicsCode.4=Ban đầu là đất ngập nước +DynamicsCode.5=Ban đầu là đất trồng trá»t +OpenTextFileListener.0=không tìm thấy file văn bản tại\: +OptionWizard.0=Các lá»±a chá»n cá»§a Collect Earth +OptionWizard.1=Chá»n Browser +OptionWizard.10=Mở thư mục lưu dá»± phòng +OptionWizard.11=Không biết\: hãy sá»­ dụng ifconfig +OptionWizard.12=Vi dụ cá»§a khác +OptionWizard.13=Äịa chỉ IP cá»§a máy chá»§ Collect Earth +OptionWizard.14=Cổng máy chá»§ Collect Earth (vd\: 8023) +OptionWizard.15=Ghi và áo dụng thay đổi +OptionWizard.16=ID +OptionWizard.17=Tá»a độ X +OptionWizard.18=Tá»a độ Y +OptionWizard.19=Äá»™ cao +OptionWizard.2=Dòng công tác (máy chá»§/khách) +OptionWizard.20=Ná»™i dung cá»§a Google Earth đã thay đổi.
Äá» nghị chấp nhận tải lại ná»™i dung khi Google Earth gợi ý. +OptionWizard.21=Cập nhật thành công +OptionWizard.22=Dốc +OptionWizard.23=Có lá»—i khi mở lại dữ liệu Google Earth +OptionWizard.24=Há»§y +OptionWizard.25=Mode vận hành +OptionWizard.26=NÆ¡i lưu cÆ¡ sở dữ liệu +OptionWizard.27=Äây không phải là thư mục Saiku (hiện không có file start-saiku.bat) +OptionWizard.28=Không nhận được máy chá»§ Saiku +OptionWizard.29=Cổng cÆ¡ sở dữ liệu +OptionWizard.3=Ví dụ cá»§a máy chá»§ +OptionWizard.30=Các lá»±a chá»n cá»§a SQLite +OptionWizard.31=Dữ liệu mẫu +OptionWizard.32=SÆ¡ đồ mẫu +OptionWizard.33=Äịnh nghÄ©a khảo sát +OptionWizard.34=Nâng cao +OptionWizard.35=Số Ä‘iểm mẫu +OptionWizard.36=Khoảng cách giữa các Ä‘iểm mẫu (tính theo mét) +OptionWizard.37=Lá» vá»›i biên ô (tính theo mét) +OptionWizard.38=Không Ä‘á»c được đúng file CSV/CED.
Cần có dấu phảy để phân tách giá trị giống như sau \:
+OptionWizard.39=ID,Tá»a độ Y,tá»a độ X,độ cao,độ dốc,tá»· lệ +OptionWizard.4=Äịa chỉ IP hiện tại cá»§a máy tính\: +OptionWizard.40=Các project +OptionWizard.41=tải file project má»›i +OptionWizard.42=Lá»—i khi đóng CSV reader +OptionWizard.43=Tên khảo sát +OptionWizard.44=tá»± động lưu dá»± phòng dữ liệu tại +OptionWizard.45=Mở Earth Engine để phóng to vào khu vá»±c ô +OptionWizard.46=Mở Earth Engine timelapse cho khu vá»±c ô +OptionWizard.47=Mở Bing Maps cho khu vá»±c ô +OptionWizard.48=Mở form trên browser thay vì mở Google Earth (khuyến cáo cho LINUX) +OptionWizard.49=ÄÆ°á»ng dẫn tá»›i file ced/csv file vá»›i dữ liệu ô +OptionWizard.5=Cổng máy chá»§ Collect Earth\: +OptionWizard.50=Browse... +OptionWizard.51=Lá»—i nhập file project +OptionWizard.52=File CSV/CED chỉ có tá»a độ +OptionWizard.53=Ô vuông +OptionWizard.54=Äiểm trung tâm +OptionWizard.55=Lá»—i khi nhập thư mục project +OptionWizard.56=Tải project +OptionWizard.57=Các project đã tải +OptionWizard.58=Mở GEE Code Editor (cần phải có quyá»n truy cập Trusted Tester) +OptionWizard.59=Mở Here Maps tập trung vào ô +OptionWizard.6=Các thông số cá»§a CSDL PostgreSQL +OptionWizard.65=ÄÆ°á»ng dẫn tá»›i thư mục Saiku +OptionWizard.66=Browse... +OptionWizard.67=ÄÆ°á»ng dẫn tá»›i Firefox executable (file exe) +OptionWizard.68=Browse... +OptionWizard.7=Tên ngưá»i sá»­ dụng +OptionWizard.70=File chạy +OptionWizard.72=File nhị phân +OptionWizard.73=ÄÆ°á»ng dẫn tá»›i Chrome executable (file exe) +OptionWizard.74=Browse... +OptionWizard.76=File exe +OptionWizard.78=File nhị phân +OptionWizard.79=ÄÆ°á»ng dẫn tá»›i KML Freemarker template +OptionWizard.8=Mật khẩu +OptionWizard.80=Browse... +OptionWizard.82=Freemarker template +OptionWizard.83=ÄÆ°á»ng dẫn tá»›i mẫu thiết kế HTML Balloon +OptionWizard.84=Browse... +OptionWizard.86=HTML webpage +OptionWizard.87=ÄÆ°á»ng dẫn tá»›i XML vá»›i định nghÄ©a IDM +OptionWizard.88=Browse... +OptionWizard.9=Tên CSDL +OptionWizard.90=Äịnh nghÄ©a XML IDM +OptionWizard.91=Máy chá»§ (phiên bản quản lý hoặc sá»­ dụng độc lập) +OptionWizard.92=Khách (ngưá»i sá»­ dụng/kết nối vá»›i máy chá»§) +OptionWizard.93=SQLite (tích hợp/file đơn lẻ) +OptionWizard.94=PostgreSQL +SaikuAnalysisListener.0=Yes - Làm má»›i lại dữ liệu Saiku (quá trình dài) +SaikuAnalysisListener.1=No - chỉ khởi động Saiku +SaikuStarter.1=Khởi động Saiku +SaikuStarter.2=Cần vài phút để khởi động Saiku, xin đợi\! +SaveEarthDataServlet.0=Yêu cầu trống +SaveEarthDataServlet.1=Có trục trặc khi ghi dữ liệu vào CSDL +SaveEarthDataServlet.2=Dữ liệu đã được ghi +SlopeCode.0=Bằng phẳng (0-5) +EarthApp.11=Collect Earth Ä‘ang chạy +EarthApp.21=Không tìm thấy file chứa lưới ô trong đưá»ng dẫn đã chá»n \:
+EarthApp.23=Chưa thiết lập file CSV/CED \:

+EarthApp.24=Không tìm thấy file chứa Freemarker template vá»›i định nghÄ©a KML trong đưá»ng dẫn đã chá»n\:
+EarthApp.26=Chưa thiết lập file định nghĩa KML d\:

+EarthApp.27=Không tìm thấy file chứa mẫu HTML balloon trong đưá»ng dẫn đã chá»n\:
+EarthApp.29=Chưa thiết lập file HTML balloon \:

+EarthApp.3=Nhắc nhở sau +EarthApp.30=Xin hãy Ä‘iá»u chỉnh đúng địa chỉ file trong Tools->Properties menu. +EarthApp.4=Cập nhật luôn +EarthApp.5=Không nhắc nữa +EarthApp.57=Äã có phiên bản má»›i cá»§a Collect Earth\!
Bạn muốn làm tiếp như thế nào? +EarthApp.58=Thông báo cập nhật +EarthApp.59=Lỗi khi nhập file project +EarthApp.6=\ - Phiên bản +EarthApp.61=Không mở được file Collect Earth.
Äá» nghị đảm bảo đã cài đặt Google Earth. +EarthSurveyService.9=Trưá»ng bắt buá»™c +ExportActionListener.1=Chá»n ngày xuất bản ghi +ExportDialogProcessMonitor.0=Äang xá»­ lý dữ liệu... +ExportDialogProcessMonitor.1=Äang đợi khởi động quá trình\: +ExportDialogProcessMonitor.4=Các bản ghi đã xuất\: +ImportProcessMonitorDialog.0=Các bản ghi đã nhập\: +ImportActionListener.0=Có nhập dữ liệu các ô chưa được Ä‘iá»n đầy đủ không? +ImportActionListener.2=Nếu bạn chá»n NO sẽ chỉ nhập dữ liệu cá»§a các ô có trạng thái màu "xanh lá cây", các ô đã có đầy đủ dữ liệu. +ImportActionListener.3=Nhập các bản ghi chưa hoàn tất +ImportDialogProcessMonitor.0=\ ÄANG TÃNH TOÃN +ImportDialogProcessMonitor.11=Số lượng ban đầu các bản ghi\: +ImportDialogProcessMonitor.2=Äang nhập các bản ghi... +ImportDialogProcessMonitor.5=Số lượng thá»±c tế các bản ghi đã nhập\: +ImportDialogProcessMonitor.8=Äang xá»­ lý dữ liệu... +InfiniteProgressMonitor.0=Há»§y lệnh +JFileChooserExistsAware.0=File project cá»§a Collect Earth +KmlImportService.13=Chá»n file CSV file để ghi địa Ä‘iểm cá»§a ô vào +MissingPlotsListener.0=Lá»—i khi lấy thông tin vỠô không có trong CSDL +MissingPlotsListener.1=Các ô thiếu +MissingPlotsListener.10=Tổng số ô trong thiết kế chá»n mẫu \: +MissingPlotsListener.12=Số ô thiếu\: +MissingPlotsListener.14=Äã Ä‘iá»n tất cả các ô\! +MissingPlotsListener.2=Sao chép ná»™i dung vào bàn phím +MissingPlotsListener.3=Lá»±a chá»n file có chứa thông tin ô ( file .csv hoặc .ced ) mà bạn muốn biết đã Ä‘iá»n đủ dữ liệu chưa. +MissingPlotsListener.4=Các ô thiếu - thông tin +MissingPlotsListener.5=Từ file \: +MissingPlotsListener.6=Xuất ra file CED +ProcessMonitorDialog.1=Tìm lá»—i trên số dòng +ProcessMonitorDialog.4=, cá»™t +ProcessMonitorDialog.5=\ -- giá trị From ece28178cc0a37abe8074c19d3ad2c70d3f7cba4 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:36:59 +0100 Subject: [PATCH 0830/1620] New translations Phetsarath_OT.ttf (French) --- .../earth/app/view/Messages_fr.properties | Bin 12527 -> 92828 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 353fe0d367757f5de056f611de0fb9ff72304600..2ec713dbece406fb6e9a2c32099d4dbb4ef54db8 100644 GIT binary patch literal 92828 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�mj&+KjGXtaI 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 c-C><>%*<1Y7Jw2*5Sl-ih#ib*{qUjx0R From e9d0835c718284552ae161cf688a7adeb7fd2725 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:00 +0100 Subject: [PATCH 0831/1620] New translations Phetsarath_OT.ttf (Spanish) --- .../earth/app/view/Messages_es.properties | Bin 12527 -> 92828 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 353fe0d367757f5de056f611de0fb9ff72304600..2ec713dbece406fb6e9a2c32099d4dbb4ef54db8 100644 GIT binary patch literal 92828 zcmce<30M?Ywm5#zt*YMXy=iv3X_}^Kpn;~@mli=0afvzxjT%%?1Qiriw zZrywCIp?13o?8+igc$LQC$_PrWn*MZ<@p3s%JFK+*vXTolE%J!@b@l43eJq3`m>VX zsXzP+f%;0kk9WNpHO<>+5CUEJd;0t(bDJE=pM(%1!}^?Y{>l}$$Zm@ZJ4nO(>lQRE zT=JKbtLg|*K7@7tws3B96R{E%wx5Id^$QoTS+G0g&?|(Pzb2rx)z!|e`N;j}By2w! z?`PHF1-%6kY5sFQ%O(ZS9zt)Mgqjlr+1{km<4%HBD!B(-* zDlECApT0}#`Q;=E%P4si$rq-Rde}$%v@CWTRf_38Yn2)6sy2(~}a^M5JzY?A#J7vwJlOHFQad>|z z7C-$1*^T$h@HvLVEqHE5I5c>S!;*-lnERX@gcr#{Jl62X$wBP914_`fSir1gN5%R8Q5p@_Z69nq~qAXa}Ul9 zyaVUR-FSQk%g5jMEW5^KkXSq}`p$hqs_^+oa5i=zou>%DAoH$6zF^G|3V`7KvXBDr}aoSQ|q z$a+Y_V6o%alaYrXMjX%Q?`U|`Wp84O#dQweq-r>n2`Rm;I%#( zcLD3&hHcc48g3<)zhPl>`XScNfNike`}oW&Sk4mCca6tBhWq^ei1Uv|ocEI&xj9&{ zodGN#U~x*%T_PxbP<{m^pP6uyM2tX+$%f?A4<9*RkjWKFm0A;`)#(jJli3n#4GWKm zjEatlwb|nw@y-NSqC3fxoRaEIOV99S`m?fga`W;F3X6&Zqe@1j<{Mi+u3~)Ugo%?T z-!f(Dw4Y7CwQ9!9+h)z4b9?n%vVKGR#_f9!9K7r9dk)=u{{ugN@S(#GKXT;J$BuS& zKYr{NzdZh8PTBBX(D97atYr0mE^vj)$!!7vJMP%JZOhJGWXHb!d!PFC(@P0C)xw(L z;amK!Mma7J8`(fklefr+v>UaXwcE5iw7a!; zYai4;qJ32RnDzqqp^fjw-Mdbm@2kM?1yhi>gJw9jhKU=OcqFK9ooscj}( zm@Ud?lX}Rt^#pqu_!Q~>G?xFsaso@oz}$h=1BC;#2jctx(f?up<-Uim%(`;hl^Iv6 zu1vo&`O2g#6R%9TQhBA~%D5}#SH@f^yHa|k86bDVcdN4!zHV}{puoJ_4+gx}Mu?8gH$ zB8N|FXUxdMc6infK7!SE%)l1v2V20SbjjO~m4xK+w&PsFb$j<=Ua9uJhxh_u^n zWyjArK$!Im!^ZzR44ZDiu=!tO*fI<^ z0vU?XS|kix|4kSU`zaU>|4A5*7>4u)3`Zi&5e&mo|92RUz5&BA{~E)w!*C;zHiR}- z!m$0{gyFcKf?>x`!f^aBq&HyLi7>}A3@7~GVc2y8h7+}+D-M-Z>pa`a!1rB&yXza%Ii5ryg_wzio^uFcMuzP z7eCxw1WCZ(&f(^QzY|CT0un}yL@nL7-&8;DruvQ>>SOmV?B0pp4^rV2F?;Z87+#IU ztJWc)RP3q_uNv^GcIYZ$R{^bL8ibkR$!V-Kgt7>tz~90M7}#&P={~*bJ~skJ1?xeE zP0F!f66_bPpCodS)L=XYznLv0qNR&IEC^<793wS9;mYvyQdH;W7FfHlO08oQ zQYI@WDmNik%*X#`m3n>k$4tYjv)@EoQ(0;62s(VhKsXuF2XL!i) zfl+HbX40Cbnf9BGm`<3^n*Lz=-1M#aMN5>WD>N$f&d`soE3F@dX~L?)o(p>?{EqM| z5p@wSN0vmkM+KsKqNAdB#FWJRA$CvfhiC^U+ZNak*^b-3vRB&o+nQ^+oA2YyxXgmggPCVDzxF5itNc6s2mSA4yux@nHZ+3T{qvwxpMaw2kya^~c$zz|AkZc^@)+`8O1^XBBO&O4sZ=hx>S z&VM=oPX+4={#F=PM2e;tbr)SI`nI?tkUFZqB(>y^qfeK9Q+9ex<(RL>epUY5xWyHU ziq|WrPdGmD>g3W}(x#B9dDC)!W}CjJ>fnqsGvBdzw&XR7bl34Ly29w3%hsRSUr*!uSz5SJ9HoQhpTqC``j29`X=T6clp$DH;ldynNE(4;G zsemKi^B2xzOP5(oCZ7eHa!TLzr?V$#Lpl2vdOj8Z3rwF%-`G~v!0-8=2?t0dik4l0 zIhE0{HWFIGp&-06oVJERUKp&mLY@^SghD|mw3?vO1oL&!5(4uyFkcNNYRFQ<7!{N$ zTabhN z`*w=Az%NnxeWi1U*cT}**?62e+Ink*E_Sa!vSwv%wWjM&hlrv65xN<0IhcM z57QQRdWiOX@v)tuku~?O5nrjY%MNR!dA@w#>C$}=lU4k(Lk0`h7f-Lwm$@5_&rg`E zQaw;+RZx)@JLbRFyWXtN54m*7^7lEb4yDT!^Gq})FTL(1@J!b$`ZvKBk@rR0PlY;$Wu@*4d!e2GubzKMFR5!HO_gV1jvas1{&82XiU31hxcdQUSR0 zV0#X%&4Hv0NJ)c+7}yjAE25x23YmDPiPi~_mr;@w8WJNErDi3>I~{QmN&`Xa;2*Lk zJ0g98e>YR*2f23kY{-ZOi7bvdq(WwPmNiZXNCa!BFC$0=rw`-q89~}zufzy7RL2Vm zaCgrlXM9I>>(Tm&_`S3!Og$^BxUtYNFP&3u?R$4C_r|fha(2IA;^yi#c%#}^w6w@E z-y18mZp|A%{qUm69rM}Kows}Kwk5@mS-zqbMX_hDCevrP&S^bdH>rJI>(NCMI`Mi_ zk$tu=zopQ^V)z`XAGj!lA)Q=ku#6_QKnQ`dWV<=EK%0i5OTrMt%qw2Tw>X7;X1U4X zLRK3ZO*Ugd9J-I;VvtE83kJE+5hsmR8D!4jn7Mx(S#|ZJwwk==`@URWT3>N!uaVy} zr}fnBF(#fa%Wnk3C~?}+SnVvAx7Drj!4mP*3vPYm*y%fV>S@oJUyE-%G(WDQt7hlX zB^6aC=0!$5P+ht;*OOs1?XK|`iBB~{d0l0!yWVSAXmgjA_vgSptqa`gTPFIp=yA+I z=5Z&%A<0zT2`b1WVakN^kRYA+Le7*S;mPXXB~GMMQJx!^1QxVLP%2dzNo1S@-ZO)E zp`6U3H-%aql*0*W%7Rau`orl}t-k5=@sXzkLa(?$^myE&L!1y94qn*4vjZBTaXq#_ z0ozw!Z{MT@l@c$HY~SQCnzHDe)3)$B2}g zWCd(CAx#JfoQ+T813XtqCs3M7K}kWtwGBay=tfnCR628+wU2@m=Vi9fqIY1hHLDOD zPrdtYl||dy`#<7;Pvirx$?-^P>|+jmLCa_xa=PvWP+Yt~mJZSyEOtLFLnO8xI1sFh z(L7v<>iwR&PNt-{_ToRRGVs;F@97xCCx>vyV;i)Vw$Lq9D2Hu8w-d-C6&SBuOL)ow zVP%k%C}7gln8XJr6?&J6k;{bMs~mQYF?$TdM(`_;$0A8iz&73r6_GH;3S|};XM#ma zs6!bIVAe$NMnkA#cwz=|A*m6V4K~Ibg3MuKJeZx8onf^Z^!5zKItczNpiRmm&6wN5!w`AFw&ZnGLZpdEq8V+uNvKD;9~lkUVw<{01?Gu+f~| zqMwp$@o2yw>Rw7L*2 z2JQz%_B$w+t}D`!qIys^3zE*XTkHs7F-V%x!GyHjffwlXf3zi}ioNIlBh9FwpY=`C z)=Yi%*UzsWGvnYSZJgqlvN5ap6&-0~Zhd?6tv{P=OW5_>h8eS_&e*o1*m0XVbIHTE z-YN0e5be^*{=l4eFSMsZdkVBCL%Rpslc3!V?TOItg7yU1T#+6+d4S4!hPgJZ{nlkFYp@PTfQ&zG_?_K#ArLD5p(6B; zrCGbuitih%j-|)Z;ERcautjO-o=MdGW;Mjx5`G)buT9Q+owjgkuBn@ov{Upcb6{)~ z-CsK6@dDq<#H=%O@<;HviiD6rz;Q@HZMJPuS>M8x-Rw7K&q_I2sm3L2(o;iG<=vxFZZ|!(g)oYAvwS2s?DJRSUIh z*rtLz6tGneMRF*XL9qbEJUqj}Y7UAypz(1Ivnc|U%t&DpL$XG|`!XJp%tPZIr0@?M zZXo<@6mT4>U==s%ggV(;JEX8fY<*B@@wYyGxg7X9(H@wU55 zXSB^UTOMA-uh=TSF?!qW+h1KarA`-;x%SkC?27JDF{AZnirE<>=o&*(NmpRiqBQ7C zW@d9|5_Gy@ixZliup%Cs9PJL;6xSX{o9yj&x&kFYG;EDRIRGmo?uejU!eM1NL*KG6 zXtK0hXp_0!OpltN$<%J5*(TUzgiJ)Jwp&Y&s$eldh{h9XanM++L4kQ7Lnyn9#tNGg zKY*mc%XXBEOl&a(S(%kBnJUBh;(~_DFuG`|XzN)1y4~^DrC$A$&O5_nKQ4=CdHdt_ zGmozCe&Uvt)^T(0y(ObFpGJc1{*7VW-r`%fhw~p#Yi#Y9)$w%wEp*1h?20?aCe16F z^kAM9(Kdo7HKa0-)~SL{CA16B&OWR@nN0GUNrV&&bK=7lH32KcXV>%^h zv<_**q49!+a7bD-7_#ktK0<8R9IpFK?K4ZC=?8wrD)AO^Lggfw1LnhTW8w+30f*#Q z6iFrpWOLxwAmKU_q0q?_KMqYm;E53tHk} zO)RuTz{(KVu7n*5*u{ZepRRI;<C29CrF~3{hwh5zQL>>wlEnhqwMD5 zbadE$b|u_QDlXycCpJ9w?Up%L_QmQSZoKESm6bCC2Jyi{lWa}amQ_7H8F8> z>8z6z6StPpMYlbDta@zw%yp-38&eUVe(#jLRTZ`M0k;yi&2T3#Nj6nEQ&)KOVn&Ux zq&+XT);Fp>KjuchPa}r|%i6r1UfSS=w$#p4+LqFpLfeu%lWCi$(?eIF^mjsgJT4eP zdmOBkkh;nawRTuxgY8kUGn^@gHcO|4)>)v<+-at5rcM(@<=<(9%~~ikL75Spks%sO z3UwpL$9|XNgI3WHAKZKd>J>^I&!Oq(MPngoL!Q6E ziez{K>ZL)0l27mL?K?8Ussu7?;7iF4mXXPUj3ypd3y{f|@^lmjX&j8E zkVat@fFH_$t|m}QAPZxdoC2erGC_)r1Z_|>W(U>TAgN%s$qyDKSY~m5?fV0l00(zN z*J1Ibc>H08w*}-=zKmXy@P^JA@JcyV5J1!o*~U_f%&=vJFYB{&ANASkrOr?4pM*BN3^lN;jfXT@Kt@LikTy6531}a>f|LgZht|^wfP=2i;G9JbYyrO#{QRUo zE9dHak2-dXRS!c2Og@aT{v7RDqwppAl^(QbqnAa&cn!>phIvsiKNRIyqDK{LGLuBN zNf&|OpJj2epm-S4@hA(x!8}XpFBAP_NkTiMD?Zzx=gk<}VnFKAM^5EB%C(NW>H1=a ztE17cWbJH%iLH59RkE{9`b4Bq?B=N;R1?#|NwlGsc!0QzsQf+9aG0;vKnaFcJqo zbOT4oCTE<(h7!x5w}#p?vaM*DI}?KbVRlx~?m~+l<2pDerFkihH^b^2p?%o!T?xW1 z-KW9}%+^hd7oB@U{8*OZHN3`DO4|R>HJvUpi&S z@BieLsIB*RRgXFRz;AmdidVNTm_0W=ch$^No07_AX7IHCrSjP9NX4D|p8DqGZ!{Oj zd?sENKRSE9Wc&2@--Hye7YaZ%x%f3-$XhRnUwAy00oE#R) zU>rI%0*n)&k#FPaL>}5WSjxd9{Ln^9TLC7alT2F)EFnADpv|T`rpVcEW9Xj z4Vy;8y5l=?&(1lR$EBv+>-}eb{suLFLqmGs`pf^o3t}-kU>;gcyZWnwx)3KCe+|cA zB+(=hB}@_qp=$InR|WGGP{YF-8?;71tpaL!2$RKVk{r?CHpe-QQ9++bn%S4xOc^%I zgMj%A_Mj=oqIPD9=71~_^hoT$>~T9*$k9E#I<7~82w z9*!k{3mmoC19lp)!Ppq^M1cpbEHjKTL$Mi>%rLiDBWywp29A-cXPFdW9y)$lNakh}L89&t(wfN( zG#6YplnOZKn9qZMK5DnQ5}3Vbw+Z84jGegjY4Pg%DKD+*{%Da#kz##$bU*Ta*LxSc zFc;}FUUu);+xRc;`HOhuaLogH zPCP}I-H9x568-jxhf_+wyz4`;4fC*SDve^7FI#*N14>t_j$Rh0zPP>%nrAJCZ%Z)O znWgmbpGmOA2lQznKoo*TC8uf?n>xb=*gI!YUZL`t4F+_L2Mes^mR-BZtNKoGskBQZ zT|#e{=;&heBG~T3*shYrewd3U<5UWqh!jbNhUhTcpJnSB82OP}g_WmKk@eEo*!&u5 z4aiL7%O2!QH%f^rn+I%3&=3zQ8Ec*Oin&gbT4A$M{|?js*Y)jpI0&J3 z$%fd3G0KozFvv>y6Pc+H-A(hrSTS9<%8Hf26g?{TSl*apb22 ziDroblPx5GUa-Jx2&NoTl|qn9cHS8#>2NIp>Gm?C8w;-?%V2Tv3;VejPIKh>=YweO zZ>3wVda&I$k#M`QU5-Qrv;hH{0GjYJ#{+9J7zIP-WAuXEFEB}nm9awHz(uYOPc39| zVC-5GG?<`S2TMX=QV29?V3G#f)UZ?ylklTzRJEzNbqZLjfJq9-(11e&aq0{;9j`z& zZ`G(nH3nR?Vq6kj`a)t1&gz?Jfb2d`V-|31`3c5@V z^W{(?hfF#6Wq?)XYG_fwJOz{~Kqmn3oJOIN$(1tHG77bTpkKZ$EfawEoy%`CP5(n| z#4zbIfKSPMwcAghrk{V){~%rXN&i2ns{b2Y-qX;p`ycAtNks|fM{uq(m<479Q(PaE zVfL;xNzX_EP?}3@CgEDgAN#72K$mb%2Iu2FxW^$Be`v@9fd-ov8bhF11I216Rza~6 ziWQBDHU-xpheSCv$zYKTEj@6`ppofXXyl-g!a9H@fGQpm0h$TavB)L(G=NX}<=~aW zA_@rDR=n6QF=+;VDp@ z;6J?bqB$H`QE7*KI}}7ie&qN_DlL|JF@kR`wobBgl@=(pfY-v7 zNzo4efU&x&7& z-LF0M=}X`izqzydrS0cHap%fcw+UbNO?*ZCTDy)X{ey#H+1#Uoe5-*m4z z|L|8Zr5lsWDQ0aD{_hgsg^@9V#8r}@UTlUY1uT=n8Z*@4xgO^0!KjFUFfLrHv3^HM z+$aDf{s=}Ond*~lB4+K|VfATR2Nl(hj#b^F2liYnv>YB29V0HMYx=hey;r6+oolJ@ zx;wq-RGyxf=(cT;Zcfq^sI(=dB?J<mBATGi2;+=U ztA$c@uvN7xnn%GyVG-ck=^_H5dRL4hAwm;}Om*EV8Dc1j2E%j_VUTNzeH5U^$$ z5c!TFVq|2ygb%9UJ^rplfmgr{(_TAqNqp|t51-k2PW+ltRvR6DM zKJ*zV4*nXVprm^ZqsX(}t8&|Lyr*%lEJa!{OZ9MINt**&?a&~t-RD^#&kQRt@Ti4m z4b*C&2`yL^pdhS~0h%Ujov_{kO?Fru3WcE)LTLk9fo3Q$!+0a)VW2_VqNObwNWdpC z;wyu2y+eUvYt9{w+~$%Hf_k6LvKx%u5sW#En!#%$=`3efF#E#=Zhtm2eg_H9%wSk| znjVK))2w&8(%W1P$~%nq&ph;qGetDR`EQ+yiK7mRKDw!Yz0mv3=;^O5iU`l1QhEI4 zoCvFT-u^8gITT&T9VuH&a#5b34UE}3Uy^KcI?$1p3oEl=VHT8R!P*RH$bd;1FfI-9 z)1WxDF_o@QhT3EplK`Wog_l|bWE#MU;#UVNG*G}n3I`2oke3EaQXxJrGmhG003Coy zk&qJ!6^L^K_;s~9ngWoDokNl-EjmU8LZ&t~CO$k_$Jhvc-Jn_WHuHLiy@X-J-Hf&& z>;+?#gX_yy0g)F>2w-#G<&!aN2F+bR`pV9D16z~DS;fD6f__vorFUAGW~px)tokNb zx5^rNP`n}@y?;7AK^?}(y01>oo~fmuq>H=7_j@-z1B*Ix`PfhM4Q=TTcXMuJXzl28 zzTBP;tFgJa<;<)xarX7af#o{w{bP0WDnTzckNFdZ5CJ`X!n1WoIkORY4!6Eh1&fQLdw-kLQ2=5t$7UPuN&L3kmNvUi4I0fjzl^d zvyweQ(4b(53@XVXYXajDJ|+a&9Q30W9DW$ zu41bk&Ty8k1$?n5LyMkm4_whXrSwy z%Y&DPRUFiEFp&d4Q;@KlLIY|U3Y?oVWlt-BCF`IWSWBQm1%4I8p_?v;QaRM~uz+KA zizzrMI%aB(mg8kYh*F`Z3YnafoNh_EGOru$IHq7Fa*lA)B=$w0X3(vXxK}zKc|p2r zcQ8ANp$b33*B8Yu@u`bqM=ylK`13FgOuhUY*ZhdPQvNwshVUn(BmUH6W8l`g>SbzL zuBubfg@a**Rv9G80BN^WfHf5AC~hoi0=kkwIRPhuWlET@gmmR7CB;y~A`ZrLY+h4P zsY7@{A=juR3nFOZp#O>E8)7g9^G$OT;g>!Vx$RW{pJJW3;4`Wh4WB_9bo_~m{ggKL z@54-*cl%G$3S=5wx)jDC{0cHFkcW~L1DA~w_Df|eWVBjn5*RImmih{|7RW*(2w^^Q z9Z%&7TyvKXO(+ciOOdA`bvgn(Hot;g81{Vs3tu1?c7IAM7!2IbemCyHWb-u_=W92@ zq9hXoY3*`YFNdXam>>s_9M;L8lfrTewG>JvGjJK8^{198&?r`-Ifzyjze(0J{6c;QA@*MvhyeE7i-7}$OZ+@j!d`tL3yZ~uHp z764l@6niImX>sbLRGOPSE}6z9LvhliBwFmAf8DYAkN zv9yxR))Lub8Z+YzW?zQWk8xQkHajSX`SS9VeUX$t_3S5AuIDOVu%#Td%8oi*mmECp zk(D-m4U1g-ETi~&Nte<3o?Wrs?!L3Wq^8}}q1D|_?kabj#3FE{2J!csPe@%NaF z2P)Tp84=yTecF{XF;>dQE)9>}5~G}(k0e2wEJd22uZa0)HWtOJh=qb!7#9hCOst57 zvPj5`gmG3FuZ3tu9MxI$_HdoXAbG}U)?n;_>8iKU$GLHGnS6%eAep9#b6Fg~BDI5& zCT3|b?QVG&WNRv)ZF%H_)%QYg_vG~5r89e`XCJ6U|L=|Cmv_A`o_wI@)OPN8&w@Pz zq~8DVqE6tK_>fnN(eJ*1d}JftftHQ2urL<3M8ooEm>Ug6;gB-Y=}5H{S?ERsG#jAC zfXV|szDWw2s$gp$DY8Ntt>j=uEL3BHfdSkKNXB3*2gd+s5ljI1CEMi=nA8JAtBX@u z?R=!h1lk`7zkMHbV7$$H9SJ5M9aO;>Y?GE&L%ElGB73sWl-m#IPk!Ii6WUwVEPmTI z?YT8w@2yfO3g~NRWBK!QI>gUs#{m^To8x}B^DQWUpk}99CB7Mkk-e`HxConV1{3rvv2sDaucAzbYw zMw2dDjyjyJL=IUJmtX!K#~vjq<7LUL2#(3XhKp1mvM`u`_06GG$3w%#Z(1jwY&m>+ ziTJx?)7&b$cii0WNf~#RGADEQ;|BWY{g)vB-s+>&)Bk?g#5%kEpN-jF3wA?DotN?K zEy%MGNdIsg=gPqNv;;_VLbd~v9grIfsS#}DB-aQjM)2w(RSS6=PdJJyk{l9{gpu<<~sxhd(e#Z-8f{tDA)&+XXG+I zqVKOXr>grxc~463%trBV9g|;J`{aLaaff^Q{)^6}t0&IK;loDfK0dn(u*1so-zdf|Pv^QHv6$$A!S_F~*Y#`0iBt06;;F?;3~Cn!M= zR*M3)PN-goW~GcrX(m~e!7$cYmQ{Nb?U+`k*-zkrb{IIlahR~g!?Pf!G&H!d*D`EZdz_2w>q~ew>?*8%Sp=# z3bG(GwKSEEv#?m?m{h1pg8U?wv*kk#r~{14?80amMpR^A&7`?HZL&Q_ zWlD?8NyMaB6f*j^(Y!!OgNp^sk@`N*GHBH@hGQ%^ylz_vG99pmTq&%LGfi4D8X<_d z@efSX>gIi94Hf^qz@a#%@mH)lT3)#3uAJ`mGTGK+Ek|E%6W=&d>3%4G^2u^%S2myC z*CxKQ$!u!X&=Y~llRbI0(=KE`X5lx`AH~zUf9pIZ0g*5EM z1cFa-Zd%E@!1Q%Uz+lK@Fy7(S6l*4FIIp@`JxR@ZRmG}FDsH0`DJ+nTTQqUHbudl` zIXV_yEDV9<5a>WF2X|PH3>^j+dTzwgNakg7IVf-}NcBOLgr}X|jaxn0pG>xQj~O++ zr_zJwPXBA2k%~iwlQAy+*|PNXpHE-ae>|u&wjxvda4c+H8guZ{lo*x6bmRHRkOIu( zVFSn3ECdXF->_VLb_C(j3&H-Sb!%UDcMqR_?JYhXj=YNo7ajNjlhyOEeI4#8ni9wy zWq~yOm;+{7s)W%BH00OwyLqmXhZMe$#|%iwr;tQ3z-%N+vsz{{VqAzN1A+c5u3%qh zmmnq(2WBA-wUR%WwZfp-+bv$z8X{sHvU;nkyPHqH`qd?kY(E_p?Ugk#sMtJQiFP1| zaH(-u!0e5379rRuKr@b6%0^kvGuNkt2Oke{Jj~-@H-&f#ixsd!zFAI#;Z*caI`AgH zoTmXE;`vOTZUK<<3Q%cq=>gp)B`5iT=h1lxMi0*f-KJq1VsnY zu_OP=!f>u9k&grSZcc`VWJpT}YD`S7#)QS*bmNe)pky5CYBP>YhpVgYfvSR- z${3mw1LHy=CluVFP-LEHrd~5t8ll(-sYa;KLW;IfO9w^bL=`Y`NHGpsPGLNO(Gidt z0gec^CLYDx%^F*nLjT=3@b^+1q`cqjMvC<&qm(8?&WeJI&4=R}nv1{C3N;V)wquUvGaAYC9_*cy9hC@$-4E6V+S6J;yHD(qakk#j&z@IL3S{ z?2v08XQ!j1Au}5C!ohEW0t}UL5UY$ga8}}oH0n%)D{yBeL;4jKBfPHNFwX@&zF|We z0grP@R@Dub^aE=y1K&FF*OTi#-gBG4Gh|Bp_mzt!!ru?S@ag_u@s)c=o0SjsUlf)O zn$t(op5mAI8Qgx<&Tm}`qmiwneYHhUT_g>z^wc1Oa7aCp?pc0FOlugwCO zY`ES8Z3bw=H7*sjDWFXT8+aDo%d)Z%Ke8`|iv3#VA7iXoOQT7gMPWDSHQ|6RG1^#? z=OAhGe?3LPVHjyt`h5Z;+6^`(x)S2mHI>h_9C^R>km&iv^lUUJADfb~f3#RabGt9^ zd;=;Ts5#czakOqfT9Rz!A$93NS-2Y!un)&>z*v@Jv2vY~E>^5lP+tfngg_=Or4(0o zlqQPrGtnEAfC=T-XAXMvQa}gg%J59FpaFvL863MGSh*@PI@EI@Ad{`Z3G(9UXqoI7 z2Bi3^Px>!ObG{7i^(V0JH1cKOF$yn;tT?%t}H( zHy*%7z%EsEyJ43LR=6PF)!?E@E?DV=1}7vt3!L;02W*ao&5_U?3AK^1EF7xw6V?<) z=Y=j0rTLP5jKX(|WO&s};k6Y~_K8QCucVs+Hlx>LC;E(Vd6+vLxRmf{b39teQe;+I zqLggpm#?oJjgX@^o!%sQ(HD|(l#q(Un_;9}{OkGGUOJS`h^{i%enNJ!%d6QM9e3o4 zS9_}dkk}kePlUvm?(4}jFU@)I>wvANW+%AI&77>KCfYtLMWJxz?)7B9GSd&0dSkVF zY_;7r$EA1WFUqZYe!B0iY}9E{0~e`6sFGyv>||4=iB2>^vJrOTJ6h;s?K&+j)K1XS zWG%jm3{tI-AKDPw8p@@FqMy`YX|-@E7DzEeiiydsR0H5Xj8rM04a#tn*~;m|3}7Om z7Nvx>3(OReBD*Xcc-<%oqG}jJ%pMPNcQBCPXSO-UX{qAL6jQ7(c5=Z-uu?dn* z5D0;Q1_ElpB)NcOXQB#8rsyOU1ND+(Lf2VgT_}tSfejkipoTpP$XCD)8KBLD$|O8Q z6^6^!BlHQI&?D#b_vu`F&{1URlq2HL1|RqSy~_`|eeX|0wUUy3Y@)mS;Nb`*Ditoj zU(uOvdT4qJt!B1}nc31fJ{dU?Sci53Tls8~bL}#~R4Jbf5>XZjuuw{v$`rsYKo<{N zc&Ots3lEZb=-^n)Iu+L`C~OC|zS{tpY{RIxg}@3a=!>a4D7)5TbenJI>3E*y_pFn` z+6s(r%SVQ`(aJo}%CO)bCgx4kAo$ZB4Cd0Y&xl)JfEe(;fG)+oTrh^F!MG>V7USMo zfe)LsNTQ|?it+D-8gOfJHMCQW5v;XpI$zbSqA99E6~$zl8YPTTLZK3pl(1I8a>ptZ zfQ|!(IU3}xa+)LuL=NtZ!F+m5_^ij2dI3@e*oG_I7)0gTIf~h2*&MVmBcg#)sTmBC zV~CvPRA7)?P=Op>Q%qpR#epGP4SDA}3U9#NzsBbcRcG7L7e)j}N*{jdi|=7d-fPc& z@aDx!y)SSTeV9+%_Zx0BE0PSxTs-bo#J8GU3G_6Dz%Ow=Xqq%MM~#ZDQ$-i45UF{} zdL@V67RI5MFsv3S=n`pvg5-u5%Nk|eF@f#x#jJrM0lb4u)4)Rk^HCs=!}p(cQd)qo zCc=3I>(#J91xJ*y5$UCb5+!()ut5Ra}SxR`J~xGKQFciMo+-dHOSG#>G|ftCyfvyyqnh_0tzH{?ZHgi#60i zwPGuq8zd2Jh2J5*Ob``#%VtTlP@9>#X52OttYqs?rKTDa=QP0zG6+B+gQs*jli**YwFyd0&}w86yfOpq(8Cit*r7Sxnk2&a%EP_x=Dg{s>Nk+=wxB7Ks@0F)<;~ z2VBG{(UDR-TyVL0VvN=!pz zs}aHVdA4GM(V!uTbpw}NUzNZ$kWKWSzC*O5A7#?reSHV-<>+0~yg4`^W8gI9z)SHR;s1me;cl^4yoA?!#kUUz_1eLK`ym4CNS8m53{+>Fl%E~VGPd)jt#`f*DT|A<-8DWTp=SQw|I6Jq!Rf4>fAH%1;-Z>^ zcmH#JQE|<|ga1T3{eQ*T@Cfn*dtU-E8B9Ktf%E$;|HPLf^z?|c>9625F}r^PKQNe^ zT{FCkLQo*l_QZMoalE`I!MD*a3UKK+xwne31qxXbXw+&licB453IoAzi%;YNqN{~)c8 z7eD)58Tw<4JT(LVI5)2BAwdF!JF%cxQHjn!|&tJ41P@NH`T!A-yZxYeY~ zf@2Et+EZg~$w~5XI(^!xq-k|Yxdqnn)S90q2{J>@{5z_nV{;3qHD?&3?y8=&%wQg~ z`ES+9S$TncSv=x-JLoa4S%*7JlM!;ci-C%Jf7$kJ-2cl)fct^jaDeTQ9QH*pn#O&y zYVnlTCDZDf=a-Z;HaE>&vTDkj6;1vE@%fhGa7}e~>9SF-c{#9U>Ec4)qL!K&t6OF* zTioQ&UA(GkTEl{BxUV|h;b;mtXXO;H3dAuSV$5ke?kNqGaA;v!ZkQ$Jm;NLj4BY>U z&%-G3`Nza(p$tomxb9)xwlw8oaWl=mW!+TqGYFr$?iQNge~k+Gu1HF%#7Z6$x=0C` zjIAOkVlv6lNQM$7kN|`E_KYaLA%82=h3{~b_OVOokf><^fzi*&{2r{wo$P6Hc^lJB ze3ecMo-UXEqj?H$|AMXO8)6Kh$DH}gHhGOr;v+p;dN?e4=FWxN-n`zR zo0cz(~W`$UecI8v)budF!ArJj+%@; zbq4LCy2CY^Al^+cIsP(fW z4~Ni0clSm{esbht6U^SZ2hWIEcr5EX^!oB1}(BY`i8J7=z97(`F zaS5(eaAo@OFDttUvhyH2!cA2O zmMD&W$H^Sh#o%@Jor&1Qrh=dA?Fai0b~^O!LvZo{zu6}=!xsbA7_bMBRlynxokF2kYC=Oa z;hM0l2)RbaV?|t`QQ?8dj@_9Gm1>hhFH`Cj3WGwSRqE|}LySQasn^>L5&rP-D4wb` zD!WB`kXl{lAYk|``}8hQsCXWe*HQCo^g6xI$$&};m@Re&I0H+@$utTy9i?+B3qcTg zOgJ*c==9+#m5xEd{wbnOMrSCV;NXH+q|4G5Ctc$eJg=7EmSNwRWkGQmyb5=j$Z(u8 ztwI-yz7eG%?wHt;IB^rET(gSo!&5=QBjWCUOQGQr1WmYB>o5&Qlb z8TJqP_f_&9_XyX4eje^kHu;?vxz&;#JiH3o@4dH#eZj?(SG)1wx4{E4I++Qd(gSoN z&TL{rfjN`r_Mf8@8&D_lIM=V?TyMm+Lp$bmjKk_oo@TK9l1%5YzhJ7Jm-@1@(QzKUgS+#^YcH{#!V}w+nBuv13|^oo~O^%A&UMizgiE-p;zG=1 z7ExbD47HfG)Df3Tv&}L1yNLQTQ}MT!wkKECgcNy{s1NvyZri9(*4&zE^^fY@`OR(+w-J zKK}T%$<)4_M)!ZZy#FI=zaL*qEq37tsxXTdhk)KF%RN@%hKwgl_RG z{5fz+T*(Kx?F1v}PA$iz8IuB>JPu_{5oPiVKPI16K#5_Ih9`-(EThTCX}RGmoDa#b zr6{|#C=yc<1N45QZ}fEkqD7{VNI56BBqustAtsB`l57xE!jc0~3E?4f%zxK8@{&uc zqN5WvG%Ne=<(yJ3C@qeNEZpe46n|uDARbq`g73s|qm2+j9EcWaITx8aj)~}04!N*k_mS2%2T#2=Hr_YKKjun7KamtP1TC?~#h`7*sE zeQ&=>`ZCApioG7qvY={2?6JNvd%{av1!QceYwnf zQ~ULhmph}VA>Uz(lW*jfOeE zP$UiaOouG)o4Q&RG{A3enVI85?aAY$_G0jDp(ES-5v_GoKglt^(FqBqzUXLQX+pwi zU(7gTtUD|;DaMG$&@gw5=|&KEC04@9qZ3?MIVPjj73PjLnqu%7w~al6c&50%M`U|Z zC$anl;=^?sbjpTHw%s7_eTn{_+tPnO{8Ng9^!1QFc_p}nn`6GKWFgAKAm;*4 zaK7EpgfBSTMz#_^G}VH0mp_a=&&GpXa6@Z@UgpT=`cDKoenfNJCW+kmoJ@q&3Y|3C(-m+Im> z?3kUKJvh!iFU${)F8IX%ju;o_|I%#PTT=V#;8QFz!@OqL^FrL9<1BUbvmyA|{HJmQ zMy2f16RayA7@R*Kb_6=Or>x)h0}_XUb$zqh&u$VpL$Xe0!T;fht+gj$uRp%G3lOPX z3H-?ZF7ZDZ(q+*679!f*@`s%DUiS`jN&)Kfs*Pc;Die@ z#E*k=Cde;837T7j>@)A{X-b1LQ_gjm2QF1@j)6Tgxmi+$e}%9ShJ|Awf7d=gGbY@7myYW_`7Hs@GTjtN#0IXa1}_ z@L%`jxsy_U?TGO7H$=wFUa{iojxzD`tQE_j**G>X%ti0C(hE`VF%W5Qpe zth1m8jvn3j?L=Y|mG|DX8%eZF!m$5)_9O|1hGe7EcK*L?n^|bzY5R62JioW;TL)z+ zX_nf~!?vS-5bi;%?K{nH7!-nGY4DZf#OKd8NPaShD-kg?npx@SKI1Wl#^Sm(TIIoOGUgS#&~lFjWF*|l zfWOdoM=u-wX-;zEm?Ot|067eODHfy4ct{>o;ExZ9V#8LNCbT5YJ$m#Q-wK}gIWpQw&6 z%S%xkwFgR~xbdYsHmynzPmI(ime&^Q9L4$mFhhJ|N;ow;Y*8VKlu5p@+`#BKbxy;r z`Eo8aWo&wsBi9{)FWSl)?cigI^0TbI+k81=tSOe*+?>LA+;M_2JVoMIe@v)5CoZcg zw@(#SGAL7dH|}X+dsgtm|IghWOtJIs(xh$wkG1yzkgB}e$LD$Pw4I&aXLfoo+bi2= z3w42|SwW==(gZ}McN=ZhXksi;q(mtJDdr1ZS`-ix(@aN26VZsDN}_Rh_J7_xy9?NV ze*a~dxpU{voqON+yr(|r94BKx-SOLD;TL+p=t-=x%AfRyPxz(mS$XQVcQ8CGz1EQa ztnMcU>uIlYsW-Z6eBFOI`9Hkav_z|YoITce+y&BIV_u;necOCK{CA8uLjzQf(o zHvHm2H&64JX7{e}C`VUG4`#$vMn2HJZ2tf2Uieb_UiY$rmfQEbl?6R=j_%_n@jiP0 z-{+)j*?zBE*_Bz^-|KF|SI9}apH<@hT>F2%AAF74_5J3mZOAU7QM z7Lr%9PR5- zWA09ke5S_dNX7=V3@v!>$r*P!{Vq>_b6KKHBMnR#I`K#TY@^lZkVUHpUNbVc=%yj{ zCPmq!H;jCIdfmL_;3=u9Nds+a**v+vuJyXsl>YjYg{^&3_)YIvsPUGvnG;nibK{Jm zc_aEo@`vQsMhpv=uUMBu>8Ns*UZcup#>FEB&7DC=f4MXS+aF> z@A)IkD{rp#`D@azEXgZ?OlKf)dsgYx72YBWqm%uYPD#11*C!c7qxNk%W&bY@1F3tL zdspSl1A@=j4nLo_%l5aCbJ8E&bKS8;KYMe5GOI3K_8q+i?0=7WrKfLNoW3wB07?47 zP4VBYrNpME#;wfGy1sq-cX1c=$g20n9IqIs4^fTHgk*W^h~ts` zj^okg){uU;ODWEXvTwYa>${ZIZXQ?AH9s6D@m*%9#~t{cF6m%~8Gq9i;RhnqWu3pL zD_ADx9+MBnPyPqdhca%-l1+T7r5>E=QiEs>{fLh36k|%<-$H7PiTf*TG!?6tEaAbW z&u^7_$bYhz7F>z!5K$xfPsDR(R0RZ=EJU;~+*NF5xzLT+U<|;9Ta)0cKDvbiH$YSi-SKq z{rQStq_;iT`Vrw>$EO?{DrmlU4NTq?i+qvPV*`KmY>FJ z8T+n#eH|oko;Tx9;uYcv!PmuWzL+V}|ikZ-$!Iakl;@ijm z>zpOua8c=5Uq>L{a+$yX5~*bT^mM&N;`Ii3O!?cWrQ4JE4Oh4$vrxWm;>ev!p#oZI zUg|L*r-JWYYYx1eLRUpxCQm!Cno8pG&IRfGuF|-46u#qe z@TllY;juy<9k*4O2=5Y!3Kd8^6lO5V?o~RDzbf|^Yv-ULI@X+XXmcZ`z&T zzt5=p(q6%vB2sB%`l0`UZEP2H-|$7quW*<68<4CgdL$18QK=|#xTxW>NV2r^ABsbS z-LUa&@Gw!i+)u2@Ky8D3HmVPl2|ytrXBNG&q}XWCGsU6yXYWh@C;giz?x&JirBL24 z)OXy)uIqTdWAB8+WB>8Yy0`zaZQF1E_0LzSczPpt{{6(ZbZTo_Eq!2F`agfB)+len zP36ssK?EmAhIRf^(IBlO-dHL6LC7aWKcA^F%w3Kd&!d50p4{D7USZ>|$w)Vpj-%ly zV_X_m5xe+nv0y`@YxO z|J!%uBg;mP8hPW2>-vX!Ma)7TYf%pwa_8LPBewsttqqdREADA(tg5{J=4n5AH2u0_ z)0olIXE-m6u3Dm}v8GUk z2&3#K3}H-99hmkvGP8AMJ(%Gcz5_{qdZ@Hk_FFD1Oay2UD@vJy6(v;dLmUc)c$Yeq zD1uaEo<=K@AEXd=h0Cpf;T8KUcB{=h>*m1^1Sb{ua^;v!ryZvcIcw`~FPxs9@Hn^_0y?|zhR5P68?>ogX{*U6uwUlK6rY{yCI?QA4p z3j)!&l-kIjeCQz>0vZDePRTbj9@Uo^=rj3doNA-&0KzzZjG?qnXr#Ct;Qmb_MIF%a zk~v91s%nxWGs-Q_1(~mfOSDSq zr@!9Va%-OgOJ8km39nH!E&UN{sgE?dwo3>DllhKNkA;VgvAVpZ(e1Eg$$!16@3_9j z*4|2!EAAaYKgJ}(g^$^d;x*FJy6P(ZS6#CC@+ISu%iC99{#CcaBz=W<*&g^ArK&_3Xc%5k&qUj9Je;0R2kd_a zKTJ=4=JV#vJn`=YWShETuJoPD-{V{me@;*5U&O<^@dH9E(f{-&%v#5Ow+?rwA6VCs zT$iQ>+r1YlVG1^O1 zcaiFo8L6Lmm)^lgz~A-%;;Z=EtN81gSH(ZF1;U-D6o01q7Ra+7q#kcgl50dh#2HVI zYlm1wHwcfw!^A!0-}IU6o4%J~H!SaXEHF&eN;brVDb@5q|DbR)w_59CZ@gotuK63CRcv;sdUMN2S+9IZdxM7Z8+Aj#!&mZN_ znS03*)GQ|Jl#oxFTv!UCM;;v^hET?5l*>I4X~to2JZ@4(|ASmuaP_k*`a<0hthrQ7 z6AL>!m^EDD)tLypd+QjTE}rs~+RS>vWiIqkg?2$E%Ql&oLa-}j`$qaUrF3W84xUzFXc@+K0 zjfAa6zQ{%3kJl~^h3g7b+tN#D^CBAef+ z2*TvI$kPeRXjBM2Cx(`6QIB9_?qICn?EL29kcJ9(nEhInL#Ln%G|6brdgaG+6V*z+ z(lad2Vev-e8n1y6&I-9!CpSlJ+FX}oa8dCKi+?M2!29Wru@dDV68Wlou#x`{Z#r-ug&XiH#ra)RB}C5>HMQ?*OgS7jueZbdR9MF4-m0B1m5|&`nWuFU|?EYfj$yaB+WM zp5YoIhkRFV_Aq^wqtZwA(v;4ZGnX)>FN-0UoA{c~r z>EI_n-_~#9Tu;A#4c4i`-t&;IO^U}1@2-uYS4l4^H{p+olL`S?@X zHucAlL6QE9)1x5%-u+#_M~VJl_%%K=g2-t^Sx2zE3>cWtkl%7%I_Rm-w-HUJb^4o4GsHB9uue_|@k6c^Xl<-;$YgNu%zpmG? zGN-R%Kq8jvdt+m;Ks$%7Q!4TIj7ury3Q?4et~3jxR>hHmk)S+SQQXB8N#1l_shsF2 zW3)xSIC6C9yVCbRY;7$IR>f`oMieWpLtCnAdez(7EJaN>)byLwGBhDYX4n)J}ynS1!7uA#sZDs&as2-7R`!lk)YwzB?tCU-gRU!&Bkg z+n@XLm@^Ug+Lv@7Qq1}4;SqYjn8EEY_Q0s%ZffF3oF{SDbl;(m{dr}_3yT)9TkiSY zBSU^(I{t@ar~_bq`Xwx$v|(m7`|We-Pxehhy_u)Iy+gPWok3%}bvkmil8eHe_=JsTgV0Qg zyidf=QmP2$j?klkN0}){Ba@fWofX1Cw^tx;IYKzX(@VM@lu$z3^h{A^e^~|O$5_?D z*9u4H=MRh6BU-hVYH%ve`oN9l<+E$_K0W1D5D!smomzU--I|Cc2<~dPno|jL#HzBY z)KG4{}&STPaV8DRDEGY$sa|8COfUi#|1H<)Hxm=~zs$q7!T|~|f zP*Tc5BodiEK*ZcqItC>?@SKOlh)Ar;s8owbvG&5yfB`(ethw_Y;h%CX)qUXEMwD0< ztsu;XP2`JRSZN;jpon@Gj-B&Q3b+fR{K(*pGh@cZ3MH-24qYf8P&a1yYrexY2nA(o zPf^(2f7o@&#${FYH&!~$`2)&p@9*Dhda17}F}nT^PrzGI>YG|wHOULcx$EyinZ5=zf$L>p}vGkFQkB)VI zl3padDOX8WOP-@~6KCHLEz1y(C}%ha?s?FDdJyIHAhmloXs4m)xXgwK*uDZ4-b1@x z`{CwffxL{3Ro<|6yZeqgtg3aD|Ccf2e;*-%~_r9gw$^tZ1HpLY_C$ltMJF zMEg9p2b+QzKtN0_l+p+j%cr-Y2+3L^q>@oT*WB{*!rM0wA2O;sJ$2}96Bm8-$okLj zmF?ASdw$2d%3k>6^-Jd6`}tG9On>}iRxtha8;4&%gFon}ueq-Aj^^GIgSIiriuDt2 ze`)+}rgt_PerPo74XU&m*kw{HO2&+1%aNN|(m9A0hyf zP#K&5s!Ju8h$v1uopfDl{Z8Ej^B2r13;*E6k6RmhB_0~S@W73R9qK!7TQJ#bEy!7M z=ttMyc4Fb#KjJ4{*IDbDGHXI}ZO~2%#nQoj=f=Fre)A{Vhm9Im5p=mts!&P8f>Ad< zece{+itg(q+@Ev@jj5VjHYH`$UziLe0=Uxu%z(w&#UcIL&rof`S8foV>o}G9solbs z@dLJPYgbI%CSTBfE{b;vzomQDlHJ13B@brKRbJ9_wiw%R$Mxw}VSL9+x6hr7_tGty z^F1sm`!haQS~vl&BrE(hwZzjbwB?bO&}yV?ouHgT zyyQwNQ}`=US|^hTs+_QClp^*kX2uZ{M7FXi!nPNCqh^s!U{ji{kX@6|9bGQ2Mau_ zJ?uT#=Pve{1uHEVENqnt)CXj_ftNYl9ir;u{P?gRpZHMhd)CJ&Ty)ff-5xya!3qyG z2*qg^_PMatg*#oybzzxUuO}}D%bl3zM6MId#e$|mJE#;((1t};1g+R$!8{AX7Hl=` zH=Q;K)PjDi0SP^p@tOx%rsl=$?^E*f5s8S(Ei-HF&?}5Fr8h6A&LMk+mjUQ1zd^;3 zsZ|9p#nDp^;OdGRUwSvQtH!~XJ_wbS1_Kmz7wE}mt%#W9iU`l{wvmoYVSH+{TV5eG z8O*^z8TDf)W{Q?nDkZCl#|o8gieGHZ($DPe_j#Uwa#i0A8!*Y$)Qt8m514PRt*NOM zUQFi672Z_)Q$NuNKUwBf*;tNLs(o;+Z0bZ=R{GQS!@-15ey_nggou^(v|QQCovERj4aMT_K)NU~~LroNbPs zjIjq|U8SDxqS^s&oXtT^&Vn2k%fVSE&N{HgfvJuK4o259M!c4Q4fCzoNG)3}*pQ<3 zRn+HTzMeXR&(>m-2FJ6pKAV?`p?W^KO1vV&DJk#kN<}fsbrHFpxss}i{Q8YER3MFA>65?YOGO#8(|4?xO;HR~A4AC#Pb{$RqLzSA;nJ!>6De z2#b{nO3$6m{GY|l(H`6+4e|Es)N6nzzXbzQBCzJ>re)6|{9DYH?fFCckBL~xbEac| z#b4I+yQXj7!u)jk#XT5GY-iB0@gpKGU1g=9yso4+y>+0_+?)Q|_dj&YuSV33UvTYh z^Ac-zGx-}RU}{}BTvtEl^(D<^(<8m-j>t_8cbZ%7<~ggJfAD;Lg(MG>)NUbx^NCLq z?4<;jC7w;N*$I@ynqn*z1B>C47~YQI+1Qa7TOPxmF}&;NwRv+Lc;10esaCZHdo@UE zwrJSNZ2UAEx!E|S!UgJ`mB%YEE=a6S>`w?QV!LB(ehiDFSQx>c9ISF;o)fFBoC0DR zgw^;w8!u+#zbd?~!hf@HK8qJXp>}azMchJO5v5bDMAYY&B~5l-Lorjdf~sp!!PvhZ ze=7^agksB13g-fYgfZk8;332I{`h8r9EjCjezzv?8 z#HZ7Mr~1-g`j?wF;ZuCdnwrxOrq?b^wGLTWpOqN!r1{uKZ!|SG|Ly7e`sYxRe!9aN zkF)pR`uT0W*>qp*mb)~GRXdm*WOj+`KYb(np*RmA$)~C9$2}+P6jUuI`JY@q(`aT|76QDnt23wF@rq4tdyoHb*M84pmtz7F$r*rUJ; za=akJZYlN%IN--tKMwh@&4(t>Q4b4wFy1xW#R4uIaAJWIbxs_xBW%N23pRJ1Zl9T* zQsATkt4IIvNR!uTX1wOH&BHi8vCzh%-uu(b*sskSv*0$dMHFAlo`sSv{-`j zDAg2n5Z)Jxe-Mq|Iedioris^j*fgSWtMd(n);#~9aJmou{rADF<|Yj##|;`gNr*k6 ziI;6NpE{p@xxH}c+5+B7<}$sj~+i}i@x2!m?!kbw*r^GQS4huL!Sq9~pU51HeXevW-8G>avT7o0RSdfcXk~o#X z-UPNJ@IZp(G0sx`!uZzs{F-qYmavU-<`^SsI&Y;t0y9d}xfTNy3gJyfRBg2@&fF=MwG8_hUI zs+kGnO`sB~R3&PPe!iaN>1*|a^r=GOq810VRQeAWsT!4LuZCSz>WIkva5ofkauE3di??`^306&hse<>|Mgk)mgf2Y!c_ z5)+ab zpTOuiM#nHZiqR2l4DSga4-4bNU7RBsz;dw-bgduDsnsZ@j`@)9L$){RZSe~2UcBeU zR_}iAX|J%z%j>{bdO(F{Wp2FfzT{>{-FVi$)6JH+G1HClZYp_?qjtpY7;igfW5g6@ zSaFvHTZ~wqjoH~4D_V zTA5aE+Vs&e^OFM-Sqt0R77D*7ZKwU+KeM#g(}DE!82@x#{nPpI%h`@q2~F!Q&3886 z(j^~z^b{XeQCuW-<1P2cZuXKJ%iMgR1nN02%?ag{<_MqU;H@0&%sG<7*5_~wg&4}M z7GzVyLoXJ&G0lxWR3X-hsZL%ec8UYH+ZWr}A{(Yr$ym!83%kvNHB`*lgvll>0`Ew# za2eHtRSBoeqce*o!}x%bDIzYaFY#4AikR7@Ux-86qg#NOCW$g`Qixk$QYY{^{*%!q zuFxV_10GFJ>1g!(*+Dqc|42uB)Q1eMju3T+T*=8)+ms-l_3!jEqQBXGjP+xg_gU{w zuTYxXoXdi_I7T{MqA9_S#c@1_(pYnhl}4H)EEqwyAMJj;N1eL-r~PcQAAP8vtGCQc z`58FoJ@5U*D=Z{Q<>?y6MJ`OEN6x|=rlLlYl7$k+oME|7t2D>;NjoRRKz29nWd@AP zqD%$WZc4kUTl?yvvo5w0?$V`^(Zci@R>H$ljvgh#o0?~h8k8T8 z=MTJT1`Xd6=3^HjSvYUrLNKn3H6h(ShLh^+CtW#?_#Zs_)Kf%kR9`7QL#FGpsVm9k zySO2_JINwRoQPvW93P2V@VeMbF?MSVWigO){BacLNghP8T&!<<(jn7_-95 z!fZ?!9YO35o({5YLHs*_nSrGNHZFimer~1TCC<|&A5MGT_ppN=Z1rHR2h%(YJ#4UO zbRTeGiwlEX(_9N(Yh2Rf&bOUxmlGSDxWl>J$)-CnkREm%vtqp!M=V$;+S|Vr1xbk+ zA!^^JUZQ4Ws5GbYJ|!cXrgkBfd8&|L(|Q#-Wu?l9F`*6+|LNA|M6*dOc6p3i0@1{M ziOhRu?7MDsE7;sj;s&=Y5|-;2wO*l$CP8@xRZb3&*=^-!H?0wFDbXJCSh4wi`u6RU zezdN4ESSYQRq21)_kQcJX|fIkS$SPaQd) zi{nY`rkZ(4TFAjK-^j3RWkWlGI-9ku@YF-!| zZDjT2Vp=Y?C9yh*g-J|F;@@%Xj$?fsW8<^p%i_Y@(MwUbK8mr?S{cnp@|qz^A4{lRHiODzmc|^q zP^QW_tvf0b$(J2(G4LHk{#Q$N(vC#VZ{pIL+O2dkF@ct&g>y0yTSa<1pGqpAO@0!O z^7wHj)pf;2*+`apnv^w+4*w?3Tay}_=O#d(s~Q;)wB#y>)MGl;hWc-xP+^*E>dP{+<`Kh&}h zHTYPKH>G%6prT6Hl{lJU8xpu9u{^vvNf_laylYiP69iG(_*!L zQpV=n(Qd&9796siwXkYSi-qM{@QUU$4ckYjR$-3{&0>4CWq?}|%@qP#GqFgQ+A511 zGOUibp5fztm|nkH$Yz$y)#FSkIB|eYMD?^OidGs|UUZN&YmN)*ULDkk>9^JN_i>-{ z>t~!!)u;D7c0*;aKD%?A)5BSA%kJH~goOk8_wQ&l77W}bBz=MQ*V2C(Qfm5<6q6L1 z8Dnuu*t&(WEgh=}0(L zoZPONsa~pPLIl?qqvAh4Bz}B54w5~ui!&H^lIj$ zdWE7=E>;30HIu3$*VfhsuhdRvL>$|9?)}emV`9U(tC&NNbpGawynMh-U7P`>6&!?2`a9)qU&#_|E>;}#!a|Im`|L$1^UW((KUSxg4BNf^!^>z^bFj5@{zI#+qRuL zTs@jT`P3hf#XhGwAX!a%;Z!Nd&*&sgY)Go}WE1u^p{)t48uvA_U~Ne)lh)$nT1>1( zqy~{{{I>|77vN9~3u724dZ7kJQ5(gA2wEbTA4dN$mV|bM*b>nva4sla64((q95@${ zzUjvj{|^6Qzi`y|mXGc9VTBJLJMl3IUQ*7<1!Kf6BUTu(+i=XlmKe~WLj$jhO;>cN z>1>m*pb3MTP~C)q4XA2BvH^p7p`cfNFE*$g1IsYD6uXP?Y!Q|g;f^8{7mY1qTMPCV zu!RL!mXGoID9Xo}yrp@pI1k0SI2*&-7;0nOLtGKX@zj9`nj^C#yCcGq@Q(1|u+R{m z8D{)`4u^z>(995<9b6II9XuA4HU)84;KcyzO%lwHgMPI6LH6o$7nbH=Y!3EuPtaB; z8|x&G(=Iz3W1neXY8S>?yE-ONMfNtsA;VdNu)u&p2Hq^9O@By#Rxb?D&(pJNJ@@bz zDaR<6DtWQNc+fW z*gaa~6)XIEZ=y@%{KgYxT!P)!j-R*&>7Q1CGAu~vBtwVy%i|sKqGhGURFRjnY&jv^ z#h^hn!Xw~vs=3NJI98?_8dA7atFaf?DinX|^H};X?`)Tw?rF?_`f2&Sg7Em`&OvSZ zor7Z8QdU@~Va#hv|Kl;?uc=hMzPMNKvi4UdqLpbt!PiZzMPDwsLdc`=OBVQLP%l2p+UE`+c+)D~j>LwF^K zenI@phktqTFLDC9anX$#?j>&4$BlPgSRqDw-p#=WPJH0NMLSZWuhD0P)QXR+*kwgC zJuGOlAZ13e8GbXQW_%=iF?ySEM2ma1yk+rA8qClv(d^I&b9hnqw(LXMXS1beR9L0L zJQYqU-czuPGW<)5ivr#UUIyNi;Iss{hHxf?Lm{jcIp^{qb_b3H*zy3H1G58chCj0= zr44?hd^3DYd^>!HeX5rXBpL?{q z`3LC_ez#4gy?@+;k1OwkAbW26fxaZOvVr zE9B?mToOl;*pNhhvNgFlDdZ)wHI9W*v_?@ErLH8{7daJSizB42pANId)ES$oh&sOe zQRPL8XTE2ZXP-w}fYxS#2? z8)tHm=vkQiGP#V+gDg3NAjZ-4D?>{Gj=Lz#YR+&EnKr~A0skx}q| z^|N1pk&jm4pTtM2aIq2}^uomoBD2L&)*4wHVXdUuvBe<_4xu%;ILOWg&>C1AVCVd3 z^)L3bb3P0vhcNrV!@2847tWD0F9$nvKn|+KIjEv-=Q$^9buM#on@1L`^r;)_yha5)7k#?)Gsp09=qdBkxxc(ORAGRO)rGGBY2Ae+w|D2!+Now z#5mm@I!0~QOR1rx4iX(c(qV`0u$7k;3(qQXM2S60Y!F-AJ)_v6U=-ZiPF+)k?E)jr#vz7njCxUH9YF&mT$lbC z@9M-=;q@BK(k#=k)!Dp@NKN*@Y_=t9Ulw~c3kS2XJqxR;`$HD;=&cgl`QwoCtWubw zT%}}HVyJ(kg2&Nz5c!FGYJ&uxkkc&a6>6wl5x?yPnHT{k4^_s^A+jh=D&ilX{qFd0 z58aS&HX|A7Sv;VJY4P{sXI-D%M6Rg{?)Q+9BPv>MBL}yln+eJNJkCYzh`b?zLy0)z z3Dov|YKM%id_b8qT+LnH(07=dn~dqXZ#`I4RCL?*FWpP+d-Ck-gc6sl{q$4Wn}uRm zPW!3!U%Kt^j6Io>{4Mq5aywS!jD1cT^SPp~Z54IoRvOXz2{;5~;9TdQ8gJNikaBJ(7eS!eN1}qux=}afOXx*uZu(wjqV} z^;lnrQd1%aCmdmPh5zEEt1hywom*9wx zxmGf2sx5mhCoKZub=Dhq8IKx;4F+!Y3NvL(WsKSiQ3tDfDek7=Nr9_YNcJ-NWkqFi zL(CxX&yplZ7^MISi zJvMUX@NCsVLJKd?`>A0T1?c)1AgwaJRT~yPvyKAGz5zs?XSCSE7vqX=qj3N-x z2%)&FB8sbA#(}>CO_BL{w3CA%C{_V?%YXqbY-IKPAq)CGV@&q?AM5KMk^6Jb?y0?Q zK>GglLuhKkXZY+IGK(H>Ju*g?H8EkHO8~9TcDZ))zpL4GzgPau>qS|5OULssUp4n? zNh7SOQzykW`)V)j?}fd2C-c~rJiHRaJ31T}NAai@JG6LKi=!GmLuNL+qi%T}n^1?g zN-V6z6u#aERI*him{)>1vHN3eWfb$N38VjBKfB9)uls~sxW`5D<=M6sHem%PpgYa1 zzu4GyfRT47Pg1*6YD#ZF(tz9abM+7CpVv#Pd21}{^1V&Ru}0H$3w5kcH<-79ML#WS zwK%RJXJ>JN!XYt~CmOset5g)&qMZI(zwQ^Os(Z%1upc%vNeL1jw6;Cq*;~BWA1|Lz zcxJ-aQ9h0#Q)-DEkQ|vyAZG)mm<9vX94}5qyAytIR1q3f$Bf0pQp0b#zM*Q*jkg?n zzugL$%EHB zY=>>Enq$BYTiF~lo;P7LtvvN|H4CZnQWi#MJ(I<#XPYmpFpIsd#4mZv;(L^PltLfn ztx8ra!Nn9#rEswx7wh=d9IeHMT7+vMyiWt@k}Z1DdkdPLMfU`QCdn(r{F6= zX%T`&NETEVutRy+oQFfX*qVz)xtN#4OtM2mSQ5m9AeIHV#G2wks|RFqpK{?~ikwSr zE=+ad9Vd=CvD1kXXOoi$G^LFW-l+K>c8s+XWc8?xO`xck^`e#Sx8kA&{Vcd>#(UJZ z%|w)ll|*}5OjDy(jXE{*)Cj3?OnF|(?o!^XWD}L>twckiS7syFT1`CL;?HlYFBTjM zcT{tkk&uZ&^vEOnf92eSc*z&2?f>cRmB`SqjZ$2F#%??^X*oRR%>h+n^?@GN6Bax9 zaPCtYrGg4&rLuC0m2$aeCB$-&Kv|?xZ5hzg!geJ<(bZ`BX!0M^=l=cAQN)~j3k!zM@7VuxanTqm4l*vG zT24&r(tmVSRZEssvu1C2&%6Ii$gR<4wOm*7La)hGFD^sdU9nT0q)r%->MW?cSjP%# zFV?b)HOQ~Qo@$g8VQW5C=3{<7q4S=0RT%>OF{gaLJ7~-B?dyT1Ih}xo-3oVRvyiR=IF02WxV+<*==e(+;-Afoca% z+R?-2SHasuxJSbsjaKKz~us zh%Y{%!)7hkYB5iX=QUWP!F&y#Cj(rKg=##X4eF9f-AcEpc$e_`D*P-9ZCRL`MUBC* zQi(ZAys7v|!P*qaRp3qeM{?FCN3Og^&fb)LBx7wdYBN_OV;@OzUWzu}GPFv{-V#0* zSet+&~RQ+N# zTUL#x>T%U~R0~DbXciZGQvr&o$4mi!nvZ+)(K~-a{+;6 zNG;wO#XZrkFxV;|j*=tRi`{NQ=3t)#^^V03wm?i1pd5h%ChRj{oet}?Sf{}f4R)xp zL5(G94kMmL4;5x*;pa+hRN`(9V3?=iZ6& zR_JEBm{?>oz;PU$4}3yZvF*xXfHpOxX%oMBOtU zFv2KDGf`sV2<0W2)P<;lM=s=wPbx^C{aI3|Fzcl&(@&+J8}GM1@sp>2j@SMUqxt^D zcSRq#9R}7&R_oe@H!6|wl|3en<$+z>F^~fDSA{?iKK>g1f`79I+a^q4>G#^t<`xJ= zYX_;RI6`+^j_a*zs<_r4ccnUGO~`FPa|*E(8tc(mhlX1GvjT6Hqp}?5%5bg}=Spy{ z80U&GJC1V>oU`MC85d3Xz=(?myrsoC4K_CJX*}L2jBmu)21*pzojR5h#-%X1c606C z+6%SP_iNf~7#U#uYp|^bb89fI2AisJUp4Nm#%2t%d0TE3X^DG zCC>H2o{HlYY()j`tibpREGfsVa*QwMit*fhB=Sk^0x4Z<@-ROS^Kw__vbzZy8pi`6 z%pqs17%G`>Uu9>nQ23iN8O*E9jC3ke{# zUy<{*6iI4Ok9K6Grsnyqj(HfkWz($|2_7j=VX|t4NYq+KEuqOY;wVfTD%}>l*K4=9 z*&6T4Gw;pNHBLRUe%bK!AD6Bj750s|=h)57o1PwJ%t}pPvir>aMe>>vcR%qrtF1_F z$h&r2d6sm@@G)mlOU-6nHmlo(y?v@(_F=b9EOVH1N49U*)D9p%gNLX7@Y*6z?>VEU zOzsnx8w>NFo;bZCst$WteRFl0)j6oX|C~r=7N@BzaUeAqm+B`m-f|Or-uQ}B=ram4xpS%^LS47|;|sI`1= z-u7iG>UM*gipd*OPM$8JCZ49kn+AT1@myMtmZqlWNw@vJ_U`G84M%@E=R{q}P<)%s z{2XG<^fh7N4JpTi(S!}Zlk{qrezW5PU^5v2dTDH%ih-FBuDV?)3S0c$~AZ= z8z-}IARGTs;j9Y#RMc2`yNYegLXnhOWZ)SAGX)ee9CLBp&_U-JC)@8p(t&;UQ+8Hh z$8PH}D+`*rxkMl^g-ysY$sE~~!^@3UN=On{JZ)Spga|L%M7|^xn{WcW>dnMyzba`wiIAu&?1% zgRr^*7gBg7g|#WP)nhg!tT+UkV1S`4a1T`i8+U_;IB8n(6u^)*;kjkaE>?lq;? z{9ZzRMQcS{g-~DKTHaPJ)R(oEwUr5Bs$j$9CAd_Aw@MHxhO`*xi$5u5;UdV3aH$CA zi+Hk9OAMQ%C!_4G05$}8*jQLjDIPqoy}`w*?bu?++agx!IUC-vqJ{h?lPLVxDneXF-!eUsajgud1$G@ER=K@+jb7F?vG5iC>+_cr?1CKo>Q9!I#yoM|4vK zClHE$bRFFN=~up9vA#{*TqaK{7Y=-BSCBK7{zdB;N8OXQKvXNXM*WV*o%Q?NVZYZK z`oqxOe+)0TP8cwLXwqY2#)4!ZqRK8FAuH{L?{JLpv?~yFxdNfrPab`?e}ztf0&ga8Gyz!zulR71Kvtqp z{EP#q?07keljK#6?1`}1krfd(A%Y2E%=TfUcaN8i_pb0VQrtIduu6k@8c5=Dcd@#d z5-jxMdOjgKF}}E*xwBII6Q@edgrLM>KH6a#U9ORlfyW(7ME<-&h)mS#NHn)^irI34 zLANc!M%j-ZV&=G3@A4E*8t!tkKv^$~Jg>aUrV+A@D?Q$k zV9c7Ah!m+3Wl=rTMx&l&(k2ts!I9LisY`~k38FvI0ekAzi#eS+?4qO7!7kc6?d+nh z)5gY8oKZ}}oN7Up1sx`wCZLZAQ%zL-1#cNXHn3v`yg)XNVTpk))Z>y4Z}OniF5OX` zut>kfOD%S5u~CZ)8c>Mob0v>1Qh)Dh)Y{e7+r|!=@G~B&yI0G$i)`UvE7lY3?8ZhA$K{qbt(5K*Gz{PtGIDC`cUS5*I?LF_WM`6HOmrq#XB_W}nDRE!6E~GY z`eC$%w}%gfg+*b6s90?f=YyXF*}C8hLAF{<9b50;KK9})r8bz> zn%FcGW>dyr7Us(^TY}zkl#(VAMt%79FeA+2nIP(eIP1e+AGY`iU3|!U)+?O#ppO>g zwdk!yDLtzus932A{iLXtwn(Q)g#jQO??B3g5IhN6#1zOg6e%1bODv~AUBbjwAab&< zq3<64t1=+E2m4Foe>IC^v@Up!0uCkgFoh(8IxhM0RCIrGZvLp`u)1)tuC*{Sq%O=@ z4xgdXSIkg*eQRs0tlxZJ&9Hdhu-c%%azs(blQe5IZ6U$lGi@i@FUU%U(4Pb%4~fao zP?gwosb}h=7o&{uB!uKlMsO^Q4?;LfFsdMq1UWvIn8`^ecMY7h641WX%y>II7BrR^ zS)l>s>|UXVPhY5KD|9H-!B5ZBfmn<8H7M2Klp616LwKK}!|!Ebul$0Xy(h(cjFj;@ z#>goLmIqvvV5J0eB`BbpL+ms)vG!*>lx`tnqPFcc;N1Hy4nNl_t{mfAu1Zkuo`ox3 zK?VS6{!m1;;9gU))j8EOpn4WmT?~@~f)yN@tYI<)!oTiW&+j7p-f2 zhtT-OP?-A5_Sm5qyA;J+QAi{BB!aghI1=H&0)Gg;U}2Dp?-0j)y-%J)4^&S4*U8m; z3Tu8wpfuv*4!mne#9nS^AzP`9l~@t5qQpXp2Jo2+&1}8sD)gBOO^o6a1km&u3#mGY z0UHb`GQej*haRW&DAl7=)DJtgcuxzJ25AjXvHM(&3u>N?OhBH!S$IPUxg1-h)Ke5I zDa%uW?X=hec-4;o>Yxm1T`@_vFG_{IXl^o7Bl4z<%9oj*9-h;)aar5DVtTIH$qyC$ zfwFIzGP$B;NBTFzgg{swMuiaE*t_>a#Uv{cG*AoA>^b!}em%nF5~e152;AlW5T?c#bUA;)beakCF;qXbh5@o52e z6ktjLk6G@ZEb=%$jN@P&G`Anda4^OVAxfJdNLGQkgvdcx8OCuhUJ;j#%!;tJ%*tTF zzbyz_N~pW68JElmnoG>=k_jaygiI(leq^L21&IM48gRsbT?TC86IW)&rwtqv7otps zPgIb}@ozcameYC!li_0-&Wj}nMAzD@ss2=wL#Pqh-mX=82G|d50Sc&CB}+(fMuPnk ztdeYzumuv-OOP+YCsth2;1f0SW&T*UBUz+$M`-OH=8;hH0i2-6mGsf0`isQCXTA&6 z*F_N`*<@(v%4hM@ZqD09NA!8-5Pp*HvfiVjrXp5blYh(Fe`zFqrL^{cR}qQy>J^Dp z^e_SH>wTFCR9EIF<`NSqUm7ZGBqngwpO@$N@|BD`nvlH0L86 z<~2!342A*-`XTY*2pRW2{M3h1FC<h!s}pwumvW1KL-$Y>O5vwaC{}Ed&ZiY*RBy zc40Q_%*KRl)G6Ro;6nu_D^M$kPmT}em?j5B%>6QaC`&zz=`!3d#jOky5Okmu7!9gM zQ%EKLxiMxNfTJHc!OY%g2gxUp$t!__6eyd7;;?UHoXivzvTp-b86(Vksjs zQ{=L5<%AR#Dd}Kk;c!JoI9$dCe?3!lNI6sdMT|$ zW8Yi-yNhf=sDlRx*b+Ro^taW0cn4Y@XfmIG3-G7B*3|4HhVxQ%dg>ALq zelz-;kuX=8*+vsqn=sdeTvLr{ph=iuK&}B3^yshW6dTuLxej;gK>=+wE1wsi#1-X z^iVX1s|%ky2_|#WdBG{H<{1ryf|}w)+(}-WYDbGhP&sfxR3gZcv(T}|!Sg9s+tFg5 zPYxX$M6+l&&%0i4!(g#01MSsW3#_c(+G@Ssy4c!AvB^%WBHs#~rNF}KEv=T@EsHH} zmW!57i-J&^1?GBltNC{GVso2We!Gc7G=;$?6qxEwj6j+-#(~DEMqw2N)(vwFte+TW z531m&Dzi$?Fe(I8F!Tk=LB1c%^A?QpQbIxyxWzhs~E$s{ZRhfC;^^#eWw5$6)|5Qr$ zEzLI-h~Q2_F^#R3R4_4+S-}h3bXQ2Tm^+@#&NliD*+!M>28ALNoc_>6x7C#6$nkp1 zUG6f^t0q;pF`L;;DpU5O5%V3-Y&_FYlBd-c=eSCo&Jq{(V!Xo6SCe&hbEaRn87oTsKpbwu^O9<;8a`9|I#rp~p^-+dgyr~? z@ad1uI$b#C%E@8O(>tWG>a#r)=2Wl16r=2CjXJYU;q^2By`Koag4#M8WlLH^R;uJ; z?w?(hP^TZG+mx_&dD_(ZVCU_`Tau8c_K~~dK$4ma;^P=zieYCA!Pxp3+e-<@1Plw{ zlpjeCCjWo!eF=P3<(c>SzvnL5Z}x<&H~V&%-0aECa!EqS20>O=Bq0F;fg7`c;1Wcz zilAMlGquxpQUzN9n11#+g*nwl0OX){d3jeE;{{n*~d)cB<3* z^PYRpeb0N|^PYEko_Bqo|C0!-wxdZ6?K81&#EN6uVpmV>u2?b0giI4{HQ})7r0G@D zZ%jH4kkUi2hFDL2xX+07MywOq39Nyfb*xe3KJ0c)ef7Rv+>(m}*(l4#t!a2J6?bd1 z(u&mPR53vH3U29z%GEM1nVbqnW|k6X4ADiT=LGpDbJOGdFL0hB*Sr4k9DRE7BI$0r zxtXdEdZW-FyMe5dtPqq&Pt}Ex%@3snleoiCS|~_!m)1hfi;E?OW`0igKNbaLnNy-- zO<~63@@OOSDof{vEZBZW)9P6_&-$->9`NjmPtQz9w)>?OmaWW<_0z+YP0RJy#Koxd zwi^xK^XwJkIjv5pBYv&g!*vvYWj-EvP0T5g03w}*SZk9@e=jR&osX7zsBb|*3({Ng za5L^~#y~SVno-w`^yZ>wk=9h$RM(`|HsZDVck0E-dOTT=z4f@K4qNKbR43O^H`k)M z7Prj4ceZGr&DIV#yU^ys4s8+jg=*}mMr$?REXP}A_(dsNim{PG8APQn#110C6(F^s zpg`PZ!=MfN9OUIVbHqE@s7N`IaymuLOTk%fDImvOZWh~P@o)@w#GoVw-;2h!Xo5Qv zk?UlX*cOEy>~JDLIiR_r2r%Jw)9*}zBcCH$zv8M|7mTuC2>|t05MB(z(?Pg5Xn&B< z1kKk4iJu4JO(TQ>zc#?XD7;p0nK!>Gc7E7gk#8)^P<&cmlKJFhNiK@YW@%>YB5VKs z*BV7!(Q}Gc-tX`cmrf2JxXV?NB~gWJsv${7k&75jxYTH%VNfp3k*i5XB}syksuGK+ zD2og^2$Y5jM@(m8rvusIM(&DnpXoQAmL|*IN zAH#38wY?-^qpm{IM3T6WI6*Oo1Z+;gdkJ_m0ohULi9}8$)`cO+BxkGJOlUXZm0;}9 z!1z)*MG3~8!LLw4JWv90UGSUm6T?Of8*oaGVG4HY(WxKM3q|LZI~~@I=tgx$s-Y{Y z98zvohc($#;~grx)In7!LXI%EieWJ#MuqVvfewK~H~}#X+yrz0!wNbTm=dTRF_9oT z6Hu1`Q#`cwNfY<+;wIumI!ESVEny-z3`fH7hKV9)Pn%xQmK=W)jQZftV4(&V28-_m zKNBn-bUi6^fu5jSDF_vaR|D~2;NyYM2CBCPVtpV?0l1yBdE-T+ILX$|NOKVUnhp5| zmto9s(V(5gYI^GVHS6>BF8!GPqTV1+Vii4^U7cB%uXE|fbQg67c@kslMOEn36RH>! z7ui@an*ujW+4WIs^<0E*Ew(_6DKzi?tb*?-z6DV=DPoo}BtBXniXe`)^Rp-r_C4;bzUcWh zJH$6f)UH8MLcMM%d*uXC{Zu+B)S82svadIow$%SktGxW9hXdib&*oo7MNcl=vJ5enaWO-TWuPYmt{0VbjHO>p7h~yImkuQjV`&$u zEtQ6~Y1o{K)f`BqpgTqC!LKu8C>iUMr<#QKHwJ+wyl29jChQ17M=%P5>w-l_FwSej zLqkDQ7*Gww`M|dW#gGPJ*~4u(10-vUF^#J=Mjq1`*~_~+bgP?Hu}<6~#Ci}i#;pt~ zqAb&zT2(;yoTd7O>qFD+6~*z<6f=;FDmyFhPm|&J;R~VKklMG5qp=wIO=Hk$F7+}f znRL2ulJ3c$x0lm6RC2RqX0o#6b1$oUT~lsvB)sSI(U@I}!`nPe-_gcW+NC!x?~@Gb zZAN(cM_K`{!D|40AFYuPXFq(~F}~@_Es7@lp@tj&n|u5Ysn2}Ofus32MxA&L`g5?I zXe!y*o(+PiQ09!lJNIT_m!>UDj%`UtYZ~rN#&?rnOcn={u_bwDvLKq@(Igy5qF61e z6Y;EsRiu*pwpjGXqCFP1v2ak^IR*|5I?ff{8@)ApIC_L)wgwK-cSho@rg(QC61ym+ z6ow0-xIl^wk(>Sx2IHGS5}B(h5F>sVkP9%wh7p6>s~^^n==sN07};;C1G10AL2+D& zl>*0s1CTlsD~WWV99P6~%1k=&q65eBu`eHIwM_4K?X=^J9Y<`~PelML&RDQF8+)@j zZb3>WQZta2j(`-L;(TA~XLm-+6>$-r8ZCYqjhmyeJ_?)(aC%wB5azbhMlE0Vm zraK@>pI(ymQmS)c`uIIOzfz=IT|Um+vXKkRCOPS?v2bD<_;3)ZL$wk@6u@2 zF0wfuvrpK?1>1y8P_21P(_bFTB}5G#lz?1F&&7poJeqwho4pY(WWuYn-<)wIL!3*O zU_-=@JW6feR0%mmaca)NYc6W^7LWd9v{B>}^j5HQ)~>9Zx!! zq~4i?bFmUU=v*}ZNvW@ucxpqfRG>Pb&<))Oa5@jB@B?RP-zKz51=B_E8R-jC8v8 z^Fo~-GmdiDWb9PWtKwS#)#3($T~?grHa$f)DD|F-y(zfYj6KPcb)QSZh+NvmUINgV z&YDDLFy;iq5sb88i7fDVFrEl}E>I}OQRA3VVi48r8pWOA8A60kwVZ8<5Yx`bUd?>CE*rJ>29v6l*SmOodt@1Mo@VvN_CKizcfj?V(XB4$@5O= zRkismx;KI4o`@%jffXkagO7Mu;swS3kDIXDbigFmQF$@s zSctfvx&R??Ygi4cTZ3s(CESGQ3B>UL^aS8(szVr87<-MXHUl_nK)M0v4R0I7alOQE z9n|5tiVhV=2t+^~$Uz~}1YY%W_@xu;EAUV`wwB}ZatxP^u*HywFUT#$=|a3vfYT1ytUqtZVLSHNaoUExw!=2@ z9V^Rf*eZrCBNp*|-p}*IcPQJKhu4WiszH$w`sGv>Ml*4V;*FYQ`cpA@J^FXi;&3z` z<~Qm|Zl&qcb>h74ZJkh5vzo7x0XRcht3nZGkuOwjn$jb88qC~l@Mek4y-rD2#Chdy zg<~K#2}+48+@`A()rN}X*c`U_vYD4t6uB$lo1>7#ecu_a@@4!nMekZeueJW(If|D% zruu^`JoEux@~x9^yeWeU5K>}5m4I2Cv`YX|PG&T_7o|xm4Oem1NQyp%=!jc8)j^0Q za*Xn`j70c2B0s~D!;bGAotGaTWO_fz*lHUT3ldZ%C zM|ECiynk$Rd}wH3$-<6r_RR0d>+OioO`nsIP|{d$uPL%-7n#Su=i@&wk9ijBDs>wr zkI6Oc3KyK!uvVk40_2?yC3v$0KQBfLh1jS!YR9V@7zXh##`3^kV~hgQ*%;%Nc_xae zo8^bcsS%Tx)T`{&{g2q6*ymk zXGxwFPgIDl73izLiVDw_o0YG_eZWv;8t zuGXk+s#_gW?^g|WQA6ADZZRb87Y4Z{-3B*?a6b%EdZbN}6Px=L8VX|{sPVCH6F{ZW zxv?!<3@x5#we|H7&!FJ}(x@5RTobKkv?XIq)8Kj~5i1g5PpnB4V+m+YK#gV&qBR~h z5?BN+aj1!tkd!t2#!tU%w$g(PkVniZ;WLLAdhT^h0{lrW?|UHWo7rcu0sg7OQBJ^F%{*Sg4v5ppOfS z3?S&~4^L`hos{sWT<2wbELWh^X|La-%Ne(b16a-dG>U3QNy{^(T>CawbA_F4oKd1~ zUwR-WDqgJ!@hdI4`-i)p?5(;v=No^sOlPSI46vtL{L+*3@3B9q3Q7)JU6a^UyY}{~ z!QFw&Zd+o+Ec5zg%}(5*Y))%uQ-oCZ}aaqHP6PELqw=L=u7DB7lT3l;c>2Oe~AO|7`cWEXM(lYQ$#;-Hv zDCIRx7U5{ZnFR6VEIb*DquPdRp6RIRj7ilrVULEK2@yRZw}yy$A+(KfTB2+qEeN_G zl=|5tlL`WJ!_s2n^%AO6Duev+1@8uwq!_kXvTxG{n%>q)4mmGt)TW7J+T~Sh)`Gt8 zq(yhx^NgI$7){ibQv54~yLPk@C3o=z!OOJ$I;|ayA+1SSJpOt2bBVy<`EqokE+9T6 z0>-%H)cWwS+3`tnQL#yZiCOi|)Xc(+h@7Ip_|n`IXG(;a6%v$~62zVRn(Ot!`lP6U z@TiEGS+R(#ZZO3sM#m6RInO_Fz9XYFC(7gqigp;|vvL#CsY4qTsnc6Ba>^WR@5WE+ zO%qnbI_`rdxq?&?5a_2@0*!uLh^9%H7haMwH1f}pPZ)P;jHi&YL}{Kwn{K{&)8@^3 z(?<8EO>T~F$4}{_C%$6%IxP+*D{s0UTOWXy0N6M#lsF_+{`36RJ9YSN9DXwk7h`cT z2EU2MDbs5vLD6r{?SnM&))OHx1=j?(1*@hYiTk8-L78wSxA|k8KTQ5O<1g`2XoT@~ zKb-O7%o+i@T%GtGCHrW&M29@xe%(=>8mQuR6-U)GsyHBJiYWB=80BWT3LpZchTcBq zwDP*5iwukNH^c-4C(8EPeo79#NG-Bi@ztmHCr^@UydUqVN+S$ktD;29b|WjgL^d6n zl=!BQcWEYP7o1q|Ds%kB)`|*OsJ?bZVt(AMUum2bfva`g+)vTzxQ(BpUszdmU4mLw z)it}y6rY)#8yKucrRsFCk&*H&$2FJU(+7IC8SYk0EZZfnitQoj3K zU}u2tDGJURu*I;`Al4bsY`|fG0kK_(IigF5h@f~~j2}&+PxbciYdpc8*=tnGyQ3T} zwY{~TnH$XPlgE!cmKPP?P*`|FQSl8)SuxRBQQoiNZpZZnj_V2vu5%Pz@92rjjGFq& z{?t2Pe}rq+Cfd6Eyldra2~rm5&2YRHCY9{p2*FQ-aE3daT0=*i(=!?x)7lt}Mvg^_ z!;#oSkYx=zZY%<0;phu{HcYGxlcGT9gD@I|K~A0hu!Ev*fuTx7aGd@RW^x8Q`vO^IFE-b#;GJ*C1#s z{pL-xlI}eB?eV97fhC?d9>I5ad}Br4)e9%{tl3p?DXsVq*F_(=q^V_!N~$~N>d6wnU5+vwWH8w9klMSs`XaPr5>*Z zP26bAMswEMtSwnPvvh zM&mIWht+X}IzAqAE=DClyIZQ=9*;g3trF{^IU3GrxTA0|N&@z(?noSrJRW&2Qguh* zV8ro=a}g@H`wxa64?h>Ka@YT$7q8MCii2LHO1B9IO~*~=Oe!J%+^$t2I2dv~ugRfs?Q0Q16m$0`4-Kj`wBw@jf=^-EIs@T;}(n)x@*j5vnXL>k!GYtlN}ST{06mBQB?)DkEmLz_K$l@@eM4RhRovvT%L z1(9XjceOUGw1&5QbyxF-)(rm?S6N|{UwKn=tgf=YY|d46H}6|l_|8jPzW4e0o(#J= z)n-dI+l6cHm+!vSnid)mkyKZgTRpI`)N$Xo8?$Pc*mGN}vi(vPgw-@<1cc|$uWr7v zG%}!M_1#TRoNd1E+>W|rt5pIuO!260ss0J2LTSLuu8FZ)jLnuH3L~W$E*U8qEm4Py zM~X*_)#0L%qR}FCxNxL!v``%`7%3PnP=_5Oj!}m?oIjF3ny(JqN9?0^b=Wpy8?~v! z))Bd9B&XY>7IippByTiN9nKxe9nDpTb4GGTbJXE%X^%@C&Kk)Y%~FRmN4Qs{aumeT zPiHtfCFJX>P^>aZN&2%vI2t51$&ON=%m}V9oYBhx%^4kzPz0|Avuoh0?yVNRRj92( zcj-N);@%RtOK^WNHWXtwH@u3ln-T?uTMEU_0&FfoMFDm>uqA(AzBpi)OTVtZ{hIPT zSAMr=p)LzWT>sA8nCYWZa-xBp~Hv_Bks{-rw&{xSSv6)$ypYe6Hq^^I-P`hN&9+;XC_x_|Ti9iDeQZ^h)*&vRs@)Rm+O5uDRh8J?G8HPvpodx2waHSHs$ z71l(BE#9=dSr_`=mlE^x5|i^Zxj=0nbb#Y&qf#brcTHR@1HaTXzE~>1W2LxIj0;7$ zP>7##r9U5!+3}1Ok6Ljjv7IfLW9hPpA`4P2fVPdvb>n;Uqy!Fk*z$4_l#AWDZ{?2X zsz|HBu(;(Lb ze@&=>8*}?P4i>vLwK=B=cDXj^`hQ%V+pSH(IFPc3;G)0$Ql|c*pZt#b;bA?#rNbjC z_6ZyWmjiY~Jf>i886GOa-h3R?%7{1;)aL5V9nKXSb57-m7m4GXeK1>`BiJW9m&}^X zwoLVS#<>hZoc^a%Uq}_s)Rt6XNyYhOs&(OT(yK}0JZ-Jetb(+K2m+^2&+l-!#L_90 zzVkb=w&@bKn5@Bh zpFE~U@_&TZ*`7~L{--~PIVA9Y1`-{!R?jdP3tq4O(+NdaMLAx~BejTd@; zaP74x@43U47PwcOA5S=NfLkOQk1W+cM;kTgkvXGt#7O;U zy%?z*trH`)qqSmW_ULRe;u>{{k($vOF-Q=L>d|U3QZ-s7PF3RZN}MUe5w6J;;`u@x zEyN>4Ju1NQf^!ApkpgUS;JD+QLu}5+>3kf|$E|jpB__BXLpB_@owEt*`=7I-S=(CE z;A1H#r6%DgNjQ;&$CJQSkLMDwBMJji_)ZjtqcA55uS8%^#G!~25o$*S-U!3lFk&(u z4HMkRCrsQ^HP}~!{nglCg^J33m11up9xA{d2lnJ+ubr#D*keU*#y;1Y43V9J)0&1B zaeu64ShStW653KsKuH3!5|9yJ950Fq=of<_Z4_jQmh)@c2^)%nGYYv;(sMj?%W$kkevKcmFfE|O$Nt;i^i{^*e76+yWx4g4>IZ9H$t zwOe7-vrEth{UxR9f$Hk&Ic0S*k;Vs(9Xm#luIPupvO8z+%X5xwLqudpCw>^0n-XI% zXJ==m6g6aestV>>qJkZ(YX7dCO3VC=|EJXkaW#H)@ZdqUTYTw@UzlHq7=-HToo$Q0 z?f6k}W?oicY0j*;=H{BP??yCV-;uX?-!JPbCgog~>W@+mP-^*giWRPjkYk^hF;li;tLf}aIPy(@NM+pWTHyS5;{n6)# zjobrKIW6Nphtvr;(vG7muxkZ&-iW3fu_Uxz~rari21Wb)_XR6Y7<#p|6Bi-QVFOG5ITX<=n^t1ClqzBVRnR^q|#oRq?-th#lRea0>N=hPJArhm5#|6GQyQW#2U z?y$6>RClWMol@}*#nejhvjUtfz|S3cJ0F}D@3kMci_;c7Wx+lR-c7~+)HA8VKLt;v zJfHGzib^Yo&zr$*d1_@muYpg|#LuaA9O8EcnwBGPxpTQ_T7ZfL$XkGp7OZJTPZOTh zL_1C;NxP9JrKS^H_B_h4(6V3x@-*EbOFW+BNG;(;QQsDoW@z?zh7?(EsJ%+psx$_c z#hATQP>rUiaC5l=$+7*Z4;s`@(eKQboMb6S9q;qfd^JCL;=-%ezK3&gE*o*9rX(U~ zn#o+r=DLk<;ZZ`L8KqP`R~xx~mug6)ecTu#_GK1_X_j$HvJAAqpeLo5)JUKjQhoX? zWMUzAU!Dp~3#3_@|B6Zo4~@w>J*Ta3PhE9OkaK9zvOOoi(Vm!MaJrp_ltg=De$ICP zoTdjNpZNtMi*JdK2np~HiHN_Y7?FwUUT(?E@#N>&D=O?cMdI`S7?Kti5E*wzXKB{8 zR~5zP)vj5So<080FUIA~Z%pqmjc8rAtTm#vKfQ5&Ufhc!Dn#3*@%)=7*t0kE+Voj* zVPSEz(ytB0b)smU9PfAre6}o2oD~R4hLlZ|iQg1Sl}dYITcNmE0DD1Ofw<^^-O=U{ z7xQ7yZ_5`K?dZ0n&5jB?>~_3uLz@j28|GVoVHI{O?8L^uU{T-9gPoB0!cM5P3%RPD zxM&xMipc}YsklU?`!Gy|;uoR#m3MYhg1seJrO97D zT#OyXXfH-BH~(yS(k7+;p0wcQJRHu$U3n5*fpRQ6a`CpN#QU2}oX?GAexs{F5!-K zG$nGg$O_!!<~|T&Ej@Bqpz|nDZ}RT<#y# zS;~+4xHitY^uWQrU!YQu_|pBWR(XDQ$<;K&jjUwm${cwv!*g*noMqIzW1 zqp%LCP7a6(4~&Px@T7w54&=1s#0uI+sTR4;(@v4YP4=>)vidT$t^|8%`?Uyj3Xonpb0_Jk6f9SV!8=c`irXmxEh# zur3EDvT>MS8j4H75q{05&EolF9HGK9k)UD^#h!>&2V-%2=zXDLeJIXqSVX5oaFj?y z!8poq(3v1{CJ_F$v&yeonCXbNT;HZ|NGMG&jI@R3`WkMpo`g2hB&DAC!3Q%$5^*is|Ga!ne}z~mx+6}b1Hfw)>RZ4b5vC2C`I zc2rbWG?(wAvd7<{1whIh_g+i;j@h=>>w5ijn!g(P>_yslym|9&P_9l046+v&E|&}c z@$p+X-Fg!iQvOExKl2qs5NG{`GQ%! zAkAx{CfS`VXq)4Avv895rWCTHJa+&t_~UJ^ju>e(#BCImXR9%|4dS96HF~#RT+~Tj z;c6Pq5xAhiL`S;(-VPdt0bNERZK!gwUtt z5{f?}9ezm}*@r?bv1ux)RBJ#d#}<JAuN;Qm&KR1zaCY z;}W*lKayr?<*K2PBV^qJp4U9D9v_V}`DIVBA)dxgE9Vv#RwM-&UTVi_bb7w#nfq`5rY2sRSD@3C@EPx#g<(X~ zZ!jr~5a)X4c^4`q{JW(F0i1T#;8Ch*RUxm+StSCh@M0Ant-`)CWE5ggA&62%h^jq~ z6ArQ8e#S0>o|8XT*_Q-yfKfhX)ZYL(`1xb&6BrGbc+2tjrBxTJ=FYEfXY6=w&Rr?-at zx$1TK=K8CGDilj;W;69dwUq$&ff{b6x8h{A$(Dx4Bsjt4wIQ#h_^$UO9om%N+f&N! zatgK5*SF~lRc<`6g3^kkxxyqB_>5e5nzA3MAz8-w>}h#>!IDyTeR6VB9F`U#2a&&J zXGRQtc6$b0CNY5iebeUT>MgVC#NW>A5&@nkJr8xI#E^xLh@hXGi-@>)+szrbE`cF9 zbN!+YA!_S<(3Td7YdVX}1|CT|l=n%<&D?*wB$A9#Gu*;{1&;6H%b-8+_&NDXt zWz+Hl#CvGB*}Q$FqD;|3jB=w~!3u25YjifYG_GsZztM;TjZZhe(5SXHz}bMH21|o@ zvjN|2c(Fk|+CYdjiM+hGMuIQDRRwb;p09+N-MuEG^>zhbuD}V2ScwNK5Lk-emEuh4 z8>Qk{DfX8ls2J}Rx`Xo98mu z({^I-N~n&X=HMrq6xmoNUe3U)RLe*MEg}*m=+U%eX`(O{Eh(S{YfB0aq&%JSLW=63 zHcK+Pl6NGF?MX-vDhd*2iEUsG$PW-2!gRV{k)Nww6dJK_3Fa*5S|AD*AZ-D{vg6P%FCuaorZUCNpy&FR^RG$No4YJE^V;2MH*dQ)JmUVV)&zR~(eqGe zO6=Faq5H-Y{{G*W6n|S#U)tSG1|U!uaNUA0K-AZbga}=Bwoa(=G!EK)znW?FYx?Q< zZ#-|TUVZ=P$rbl69)HHOcM{}v-@Y$-p8CoQ294}@b#{7wF@A4g(6R>vC>mptdvTbU zkZ10jtBOK#izo;|iE8@)hvzLNUGFdbBbbx)M!o;L=M4$ky$s&_cl{0}g!j_Ij9H~w zr7@*3#u#H(dgEP={resJ_Q~^Ip11Vt?{+-$ZF%wSM;v#{H&LEmn>R%$ia(7nq(r44 z4OwY?1z#Ulh_B;EFL6`jIS(x~o%Upg>i6Gw-+u8D{?5~N+xQ+L+4FS$ZTNeIYX(;{ zu3K~|+M06=Wfig%yHZNoxVe;$Tc+Hotfq|ICW>__nyGF!I$6Fkd4%sj!}mXV|9|>F z8Q*05lkd|7l{qTxUo0!Ew7*%A@3ec`E39R994dD>?c-l|T1yH^m|6O@Og##ny)-s!?v%+4U|E4p)!turOg7N}&OYU#hfLjQ^J5u!~;fT@_X*eq5GQHSTayF!e{3R_AzkrL7!08D#w3Dr@Dt4B`0~ zK2^>D8Z9VFBPr+LcPi7*3Af` zSNzrOK7WG}r0({)0~9~?0iQc`M)4p-g?)ABa5)!c4 z=T>L<>t?w1N@T$2d|?bqY{1|9+yP2xz!N@q=#21TGvcI4+o^X&O80^_T?75?eeDBl z%x#O!R`V+Nh5?@X%mZt>%&qP2f$sJV=AQNqs|VXxcbVO*q+h?Srl!u_yScA>^_l^5 zL4JO*xv6fkxwp@~wri#L>CUc=T|MsJ^<9jO4=q|eXSRLG{Q3pH7|aXm7c!EXn#F6n z`@Qd!|9xFu=6?68flcjwT~706_n>(t-`>~N+1)?T*WEEV&}Hr(Ft=~$v@?P0-JRX5 zHcOAe4V_)y1P^ret?!rbkg1TB;YFBt6T>0W7W?Oxfnp}))A z-f!-eKK*ODI?WxMwWk_nA{O})VQz3U^7esl_XelAtDCX*nKyRz_4C?XU~^2q$rqo+ z%w%P^56G1Fnccneu^c9MGYgO@n|yLQ<2~ISeeHeBL%(@Ci=F1~4O&XpxO=w9~;nL(CnU;BoE%`(;V<}9phWcb;&O|4CfuaOCFXj(jf&Z0%;hPH*~+2#ea7cOq9 zThcmvp?SfQg$vpi&9T*(7qMtQT**obTJP@bGIw?jw0HMNim9o&h85b+wDokF*R*f! zV#TiP>fXqdwVPLxoF+^2L)2T3d&6oiqfCyEfSl&;Rpt%u0gHK4UpEP5z^x_q4^^kd z+_Yh(&0;Qgm>XCs>v~w|iw0QtjG&==71^Po$L;R3m}}kr1MUqL^Ss&S`~rs~-|8sL zcbLsf7R{E0wz0dPm9u7Gptr(q-?V9yZS{sho4aqdon$6Stl!?Vy0^!+W?+5K!mibW zJ?(v$FUujqR_#5E0nVrO9o~`_? zVn?xozFt=!|7D0S{SvUhjVXCr?-S}g17@}|xErbT>qjxw8F-4bQK zQqR1Z8E!faX8P1C3wsJ>QbEa+f2Vf{;%}q zUHW%wF%4)r>)_o1?dfhU{j!8QnJzc)nw9nZm!VfN9y9-C=?-cky0rU~B`jm;V`!N^ zZ$2jP%w_(T(6^N#`gwSto6G+Vn!BAPBy&5cbkNn!bjq;uUxtw3%}lwBw|6Q`zgDlE z^y|>lHTkXvromehi?mcsmxNhqppQ4@l5)CvwLvSNE-hD*PGo*%jrH+u-uq_4*4h*Y z{V&hc<>|9%_vO>sOsOm(Z<$LUNkNlu%i*;wU0ITn0=;GS{&#w5@A4X#<kfkU~$(ufJJ#J#i9r*hM^KEw}M0GoO((CDXTGD#|Bpv-ZXjZmHk^&?LNvf3fC0nm{t<)#m7+KHPFofh# zN!8NTqm_%SD@l!J?P6J9#r8qZzCR6rNxl_j0#F$sImZZB_<3t&Yq?L6V4N1yc#5Z{P z-kX93Elu*Rk{)DEWDUp|YU%1{XqkF>Jx`;Pd~&&iM?QNIhf>IY$?;~=$s+B(w;ne# zR@p8{s+N7h0877u?WCPKmWPd{wSl!~)84k4{*uP0Td{u4XSGKAHZ6wr46%^qB>N%R z9`y0OHm!e=X`Ae6uGH(vK5sFf^m3B7CE*BO&iVM6xSo+*;e#{|@�mj&+KjGXtaI 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 c-C><>%*<1Y7Jw2*5Sl-ih#ib*{qUjx0R From 18b3fa19c01e843f33293cb8fbd99cc7709c589b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:01 +0100 Subject: [PATCH 0832/1620] New translations Phetsarath_OT.ttf (Portuguese) --- .../earth/app/view/Messages_pt.properties | Bin 12527 -> 92828 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 353fe0d367757f5de056f611de0fb9ff72304600..2ec713dbece406fb6e9a2c32099d4dbb4ef54db8 100644 GIT binary patch literal 92828 zcmce<30M?Ywm5#zt*YMXy=iv3X_}^Kpn;~@mli=0afvzxjT%%?1Qiriw zZrywCIp?13o?8+igc$LQC$_PrWn*MZ<@p3s%JFK+*vXTolE%J!@b@l43eJq3`m>VX zsXzP+f%;0kk9WNpHO<>+5CUEJd;0t(bDJE=pM(%1!}^?Y{>l}$$Zm@ZJ4nO(>lQRE zT=JKbtLg|*K7@7tws3B96R{E%wx5Id^$QoTS+G0g&?|(Pzb2rx)z!|e`N;j}By2w! z?`PHF1-%6kY5sFQ%O(ZS9zt)Mgqjlr+1{km<4%HBD!B(-* zDlECApT0}#`Q;=E%P4si$rq-Rde}$%v@CWTRf_38Yn2)6sy2(~}a^M5JzY?A#J7vwJlOHFQad>|z z7C-$1*^T$h@HvLVEqHE5I5c>S!;*-lnERX@gcr#{Jl62X$wBP914_`fSir1gN5%R8Q5p@_Z69nq~qAXa}Ul9 zyaVUR-FSQk%g5jMEW5^KkXSq}`p$hqs_^+oa5i=zou>%DAoH$6zF^G|3V`7KvXBDr}aoSQ|q z$a+Y_V6o%alaYrXMjX%Q?`U|`Wp84O#dQweq-r>n2`Rm;I%#( zcLD3&hHcc48g3<)zhPl>`XScNfNike`}oW&Sk4mCca6tBhWq^ei1Uv|ocEI&xj9&{ zodGN#U~x*%T_PxbP<{m^pP6uyM2tX+$%f?A4<9*RkjWKFm0A;`)#(jJli3n#4GWKm zjEatlwb|nw@y-NSqC3fxoRaEIOV99S`m?fga`W;F3X6&Zqe@1j<{Mi+u3~)Ugo%?T z-!f(Dw4Y7CwQ9!9+h)z4b9?n%vVKGR#_f9!9K7r9dk)=u{{ugN@S(#GKXT;J$BuS& zKYr{NzdZh8PTBBX(D97atYr0mE^vj)$!!7vJMP%JZOhJGWXHb!d!PFC(@P0C)xw(L z;amK!Mma7J8`(fklefr+v>UaXwcE5iw7a!; zYai4;qJ32RnDzqqp^fjw-Mdbm@2kM?1yhi>gJw9jhKU=OcqFK9ooscj}( zm@Ud?lX}Rt^#pqu_!Q~>G?xFsaso@oz}$h=1BC;#2jctx(f?up<-Uim%(`;hl^Iv6 zu1vo&`O2g#6R%9TQhBA~%D5}#SH@f^yHa|k86bDVcdN4!zHV}{puoJ_4+gx}Mu?8gH$ zB8N|FXUxdMc6infK7!SE%)l1v2V20SbjjO~m4xK+w&PsFb$j<=Ua9uJhxh_u^n zWyjArK$!Im!^ZzR44ZDiu=!tO*fI<^ z0vU?XS|kix|4kSU`zaU>|4A5*7>4u)3`Zi&5e&mo|92RUz5&BA{~E)w!*C;zHiR}- z!m$0{gyFcKf?>x`!f^aBq&HyLi7>}A3@7~GVc2y8h7+}+D-M-Z>pa`a!1rB&yXza%Ii5ryg_wzio^uFcMuzP z7eCxw1WCZ(&f(^QzY|CT0un}yL@nL7-&8;DruvQ>>SOmV?B0pp4^rV2F?;Z87+#IU ztJWc)RP3q_uNv^GcIYZ$R{^bL8ibkR$!V-Kgt7>tz~90M7}#&P={~*bJ~skJ1?xeE zP0F!f66_bPpCodS)L=XYznLv0qNR&IEC^<793wS9;mYvyQdH;W7FfHlO08oQ zQYI@WDmNik%*X#`m3n>k$4tYjv)@EoQ(0;62s(VhKsXuF2XL!i) zfl+HbX40Cbnf9BGm`<3^n*Lz=-1M#aMN5>WD>N$f&d`soE3F@dX~L?)o(p>?{EqM| z5p@wSN0vmkM+KsKqNAdB#FWJRA$CvfhiC^U+ZNak*^b-3vRB&o+nQ^+oA2YyxXgmggPCVDzxF5itNc6s2mSA4yux@nHZ+3T{qvwxpMaw2kya^~c$zz|AkZc^@)+`8O1^XBBO&O4sZ=hx>S z&VM=oPX+4={#F=PM2e;tbr)SI`nI?tkUFZqB(>y^qfeK9Q+9ex<(RL>epUY5xWyHU ziq|WrPdGmD>g3W}(x#B9dDC)!W}CjJ>fnqsGvBdzw&XR7bl34Ly29w3%hsRSUr*!uSz5SJ9HoQhpTqC``j29`X=T6clp$DH;ldynNE(4;G zsemKi^B2xzOP5(oCZ7eHa!TLzr?V$#Lpl2vdOj8Z3rwF%-`G~v!0-8=2?t0dik4l0 zIhE0{HWFIGp&-06oVJERUKp&mLY@^SghD|mw3?vO1oL&!5(4uyFkcNNYRFQ<7!{N$ zTabhN z`*w=Az%NnxeWi1U*cT}**?62e+Ink*E_Sa!vSwv%wWjM&hlrv65xN<0IhcM z57QQRdWiOX@v)tuku~?O5nrjY%MNR!dA@w#>C$}=lU4k(Lk0`h7f-Lwm$@5_&rg`E zQaw;+RZx)@JLbRFyWXtN54m*7^7lEb4yDT!^Gq})FTL(1@J!b$`ZvKBk@rR0PlY;$Wu@*4d!e2GubzKMFR5!HO_gV1jvas1{&82XiU31hxcdQUSR0 zV0#X%&4Hv0NJ)c+7}yjAE25x23YmDPiPi~_mr;@w8WJNErDi3>I~{QmN&`Xa;2*Lk zJ0g98e>YR*2f23kY{-ZOi7bvdq(WwPmNiZXNCa!BFC$0=rw`-q89~}zufzy7RL2Vm zaCgrlXM9I>>(Tm&_`S3!Og$^BxUtYNFP&3u?R$4C_r|fha(2IA;^yi#c%#}^w6w@E z-y18mZp|A%{qUm69rM}Kows}Kwk5@mS-zqbMX_hDCevrP&S^bdH>rJI>(NCMI`Mi_ zk$tu=zopQ^V)z`XAGj!lA)Q=ku#6_QKnQ`dWV<=EK%0i5OTrMt%qw2Tw>X7;X1U4X zLRK3ZO*Ugd9J-I;VvtE83kJE+5hsmR8D!4jn7Mx(S#|ZJwwk==`@URWT3>N!uaVy} zr}fnBF(#fa%Wnk3C~?}+SnVvAx7Drj!4mP*3vPYm*y%fV>S@oJUyE-%G(WDQt7hlX zB^6aC=0!$5P+ht;*OOs1?XK|`iBB~{d0l0!yWVSAXmgjA_vgSptqa`gTPFIp=yA+I z=5Z&%A<0zT2`b1WVakN^kRYA+Le7*S;mPXXB~GMMQJx!^1QxVLP%2dzNo1S@-ZO)E zp`6U3H-%aql*0*W%7Rau`orl}t-k5=@sXzkLa(?$^myE&L!1y94qn*4vjZBTaXq#_ z0ozw!Z{MT@l@c$HY~SQCnzHDe)3)$B2}g zWCd(CAx#JfoQ+T813XtqCs3M7K}kWtwGBay=tfnCR628+wU2@m=Vi9fqIY1hHLDOD zPrdtYl||dy`#<7;Pvirx$?-^P>|+jmLCa_xa=PvWP+Yt~mJZSyEOtLFLnO8xI1sFh z(L7v<>iwR&PNt-{_ToRRGVs;F@97xCCx>vyV;i)Vw$Lq9D2Hu8w-d-C6&SBuOL)ow zVP%k%C}7gln8XJr6?&J6k;{bMs~mQYF?$TdM(`_;$0A8iz&73r6_GH;3S|};XM#ma zs6!bIVAe$NMnkA#cwz=|A*m6V4K~Ibg3MuKJeZx8onf^Z^!5zKItczNpiRmm&6wN5!w`AFw&ZnGLZpdEq8V+uNvKD;9~lkUVw<{01?Gu+f~| zqMwp$@o2yw>Rw7L*2 z2JQz%_B$w+t}D`!qIys^3zE*XTkHs7F-V%x!GyHjffwlXf3zi}ioNIlBh9FwpY=`C z)=Yi%*UzsWGvnYSZJgqlvN5ap6&-0~Zhd?6tv{P=OW5_>h8eS_&e*o1*m0XVbIHTE z-YN0e5be^*{=l4eFSMsZdkVBCL%Rpslc3!V?TOItg7yU1T#+6+d4S4!hPgJZ{nlkFYp@PTfQ&zG_?_K#ArLD5p(6B; zrCGbuitih%j-|)Z;ERcautjO-o=MdGW;Mjx5`G)buT9Q+owjgkuBn@ov{Upcb6{)~ z-CsK6@dDq<#H=%O@<;HviiD6rz;Q@HZMJPuS>M8x-Rw7K&q_I2sm3L2(o;iG<=vxFZZ|!(g)oYAvwS2s?DJRSUIh z*rtLz6tGneMRF*XL9qbEJUqj}Y7UAypz(1Ivnc|U%t&DpL$XG|`!XJp%tPZIr0@?M zZXo<@6mT4>U==s%ggV(;JEX8fY<*B@@wYyGxg7X9(H@wU55 zXSB^UTOMA-uh=TSF?!qW+h1KarA`-;x%SkC?27JDF{AZnirE<>=o&*(NmpRiqBQ7C zW@d9|5_Gy@ixZliup%Cs9PJL;6xSX{o9yj&x&kFYG;EDRIRGmo?uejU!eM1NL*KG6 zXtK0hXp_0!OpltN$<%J5*(TUzgiJ)Jwp&Y&s$eldh{h9XanM++L4kQ7Lnyn9#tNGg zKY*mc%XXBEOl&a(S(%kBnJUBh;(~_DFuG`|XzN)1y4~^DrC$A$&O5_nKQ4=CdHdt_ zGmozCe&Uvt)^T(0y(ObFpGJc1{*7VW-r`%fhw~p#Yi#Y9)$w%wEp*1h?20?aCe16F z^kAM9(Kdo7HKa0-)~SL{CA16B&OWR@nN0GUNrV&&bK=7lH32KcXV>%^h zv<_**q49!+a7bD-7_#ktK0<8R9IpFK?K4ZC=?8wrD)AO^Lggfw1LnhTW8w+30f*#Q z6iFrpWOLxwAmKU_q0q?_KMqYm;E53tHk} zO)RuTz{(KVu7n*5*u{ZepRRI;<C29CrF~3{hwh5zQL>>wlEnhqwMD5 zbadE$b|u_QDlXycCpJ9w?Up%L_QmQSZoKESm6bCC2Jyi{lWa}amQ_7H8F8> z>8z6z6StPpMYlbDta@zw%yp-38&eUVe(#jLRTZ`M0k;yi&2T3#Nj6nEQ&)KOVn&Ux zq&+XT);Fp>KjuchPa}r|%i6r1UfSS=w$#p4+LqFpLfeu%lWCi$(?eIF^mjsgJT4eP zdmOBkkh;nawRTuxgY8kUGn^@gHcO|4)>)v<+-at5rcM(@<=<(9%~~ikL75Spks%sO z3UwpL$9|XNgI3WHAKZKd>J>^I&!Oq(MPngoL!Q6E ziez{K>ZL)0l27mL?K?8Ussu7?;7iF4mXXPUj3ypd3y{f|@^lmjX&j8E zkVat@fFH_$t|m}QAPZxdoC2erGC_)r1Z_|>W(U>TAgN%s$qyDKSY~m5?fV0l00(zN z*J1Ibc>H08w*}-=zKmXy@P^JA@JcyV5J1!o*~U_f%&=vJFYB{&ANASkrOr?4pM*BN3^lN;jfXT@Kt@LikTy6531}a>f|LgZht|^wfP=2i;G9JbYyrO#{QRUo zE9dHak2-dXRS!c2Og@aT{v7RDqwppAl^(QbqnAa&cn!>phIvsiKNRIyqDK{LGLuBN zNf&|OpJj2epm-S4@hA(x!8}XpFBAP_NkTiMD?Zzx=gk<}VnFKAM^5EB%C(NW>H1=a ztE17cWbJH%iLH59RkE{9`b4Bq?B=N;R1?#|NwlGsc!0QzsQf+9aG0;vKnaFcJqo zbOT4oCTE<(h7!x5w}#p?vaM*DI}?KbVRlx~?m~+l<2pDerFkihH^b^2p?%o!T?xW1 z-KW9}%+^hd7oB@U{8*OZHN3`DO4|R>HJvUpi&S z@BieLsIB*RRgXFRz;AmdidVNTm_0W=ch$^No07_AX7IHCrSjP9NX4D|p8DqGZ!{Oj zd?sENKRSE9Wc&2@--Hye7YaZ%x%f3-$XhRnUwAy00oE#R) zU>rI%0*n)&k#FPaL>}5WSjxd9{Ln^9TLC7alT2F)EFnADpv|T`rpVcEW9Xj z4Vy;8y5l=?&(1lR$EBv+>-}eb{suLFLqmGs`pf^o3t}-kU>;gcyZWnwx)3KCe+|cA zB+(=hB}@_qp=$InR|WGGP{YF-8?;71tpaL!2$RKVk{r?CHpe-QQ9++bn%S4xOc^%I zgMj%A_Mj=oqIPD9=71~_^hoT$>~T9*$k9E#I<7~82w z9*!k{3mmoC19lp)!Ppq^M1cpbEHjKTL$Mi>%rLiDBWywp29A-cXPFdW9y)$lNakh}L89&t(wfN( zG#6YplnOZKn9qZMK5DnQ5}3Vbw+Z84jGegjY4Pg%DKD+*{%Da#kz##$bU*Ta*LxSc zFc;}FUUu);+xRc;`HOhuaLogH zPCP}I-H9x568-jxhf_+wyz4`;4fC*SDve^7FI#*N14>t_j$Rh0zPP>%nrAJCZ%Z)O znWgmbpGmOA2lQznKoo*TC8uf?n>xb=*gI!YUZL`t4F+_L2Mes^mR-BZtNKoGskBQZ zT|#e{=;&heBG~T3*shYrewd3U<5UWqh!jbNhUhTcpJnSB82OP}g_WmKk@eEo*!&u5 z4aiL7%O2!QH%f^rn+I%3&=3zQ8Ec*Oin&gbT4A$M{|?js*Y)jpI0&J3 z$%fd3G0KozFvv>y6Pc+H-A(hrSTS9<%8Hf26g?{TSl*apb22 ziDroblPx5GUa-Jx2&NoTl|qn9cHS8#>2NIp>Gm?C8w;-?%V2Tv3;VejPIKh>=YweO zZ>3wVda&I$k#M`QU5-Qrv;hH{0GjYJ#{+9J7zIP-WAuXEFEB}nm9awHz(uYOPc39| zVC-5GG?<`S2TMX=QV29?V3G#f)UZ?ylklTzRJEzNbqZLjfJq9-(11e&aq0{;9j`z& zZ`G(nH3nR?Vq6kj`a)t1&gz?Jfb2d`V-|31`3c5@V z^W{(?hfF#6Wq?)XYG_fwJOz{~Kqmn3oJOIN$(1tHG77bTpkKZ$EfawEoy%`CP5(n| z#4zbIfKSPMwcAghrk{V){~%rXN&i2ns{b2Y-qX;p`ycAtNks|fM{uq(m<479Q(PaE zVfL;xNzX_EP?}3@CgEDgAN#72K$mb%2Iu2FxW^$Be`v@9fd-ov8bhF11I216Rza~6 ziWQBDHU-xpheSCv$zYKTEj@6`ppofXXyl-g!a9H@fGQpm0h$TavB)L(G=NX}<=~aW zA_@rDR=n6QF=+;VDp@ z;6J?bqB$H`QE7*KI}}7ie&qN_DlL|JF@kR`wobBgl@=(pfY-v7 zNzo4efU&x&7& z-LF0M=}X`izqzydrS0cHap%fcw+UbNO?*ZCTDy)X{ey#H+1#Uoe5-*m4z z|L|8Zr5lsWDQ0aD{_hgsg^@9V#8r}@UTlUY1uT=n8Z*@4xgO^0!KjFUFfLrHv3^HM z+$aDf{s=}Ond*~lB4+K|VfATR2Nl(hj#b^F2liYnv>YB29V0HMYx=hey;r6+oolJ@ zx;wq-RGyxf=(cT;Zcfq^sI(=dB?J<mBATGi2;+=U ztA$c@uvN7xnn%GyVG-ck=^_H5dRL4hAwm;}Om*EV8Dc1j2E%j_VUTNzeH5U^$$ z5c!TFVq|2ygb%9UJ^rplfmgr{(_TAqNqp|t51-k2PW+ltRvR6DM zKJ*zV4*nXVprm^ZqsX(}t8&|Lyr*%lEJa!{OZ9MINt**&?a&~t-RD^#&kQRt@Ti4m z4b*C&2`yL^pdhS~0h%Ujov_{kO?Fru3WcE)LTLk9fo3Q$!+0a)VW2_VqNObwNWdpC z;wyu2y+eUvYt9{w+~$%Hf_k6LvKx%u5sW#En!#%$=`3efF#E#=Zhtm2eg_H9%wSk| znjVK))2w&8(%W1P$~%nq&ph;qGetDR`EQ+yiK7mRKDw!Yz0mv3=;^O5iU`l1QhEI4 zoCvFT-u^8gITT&T9VuH&a#5b34UE}3Uy^KcI?$1p3oEl=VHT8R!P*RH$bd;1FfI-9 z)1WxDF_o@QhT3EplK`Wog_l|bWE#MU;#UVNG*G}n3I`2oke3EaQXxJrGmhG003Coy zk&qJ!6^L^K_;s~9ngWoDokNl-EjmU8LZ&t~CO$k_$Jhvc-Jn_WHuHLiy@X-J-Hf&& z>;+?#gX_yy0g)F>2w-#G<&!aN2F+bR`pV9D16z~DS;fD6f__vorFUAGW~px)tokNb zx5^rNP`n}@y?;7AK^?}(y01>oo~fmuq>H=7_j@-z1B*Ix`PfhM4Q=TTcXMuJXzl28 zzTBP;tFgJa<;<)xarX7af#o{w{bP0WDnTzckNFdZ5CJ`X!n1WoIkORY4!6Eh1&fQLdw-kLQ2=5t$7UPuN&L3kmNvUi4I0fjzl^d zvyweQ(4b(53@XVXYXajDJ|+a&9Q30W9DW$ zu41bk&Ty8k1$?n5LyMkm4_whXrSwy z%Y&DPRUFiEFp&d4Q;@KlLIY|U3Y?oVWlt-BCF`IWSWBQm1%4I8p_?v;QaRM~uz+KA zizzrMI%aB(mg8kYh*F`Z3YnafoNh_EGOru$IHq7Fa*lA)B=$w0X3(vXxK}zKc|p2r zcQ8ANp$b33*B8Yu@u`bqM=ylK`13FgOuhUY*ZhdPQvNwshVUn(BmUH6W8l`g>SbzL zuBubfg@a**Rv9G80BN^WfHf5AC~hoi0=kkwIRPhuWlET@gmmR7CB;y~A`ZrLY+h4P zsY7@{A=juR3nFOZp#O>E8)7g9^G$OT;g>!Vx$RW{pJJW3;4`Wh4WB_9bo_~m{ggKL z@54-*cl%G$3S=5wx)jDC{0cHFkcW~L1DA~w_Df|eWVBjn5*RImmih{|7RW*(2w^^Q z9Z%&7TyvKXO(+ciOOdA`bvgn(Hot;g81{Vs3tu1?c7IAM7!2IbemCyHWb-u_=W92@ zq9hXoY3*`YFNdXam>>s_9M;L8lfrTewG>JvGjJK8^{198&?r`-Ifzyjze(0J{6c;QA@*MvhyeE7i-7}$OZ+@j!d`tL3yZ~uHp z764l@6niImX>sbLRGOPSE}6z9LvhliBwFmAf8DYAkN zv9yxR))Lub8Z+YzW?zQWk8xQkHajSX`SS9VeUX$t_3S5AuIDOVu%#Td%8oi*mmECp zk(D-m4U1g-ETi~&Nte<3o?Wrs?!L3Wq^8}}q1D|_?kabj#3FE{2J!csPe@%NaF z2P)Tp84=yTecF{XF;>dQE)9>}5~G}(k0e2wEJd22uZa0)HWtOJh=qb!7#9hCOst57 zvPj5`gmG3FuZ3tu9MxI$_HdoXAbG}U)?n;_>8iKU$GLHGnS6%eAep9#b6Fg~BDI5& zCT3|b?QVG&WNRv)ZF%H_)%QYg_vG~5r89e`XCJ6U|L=|Cmv_A`o_wI@)OPN8&w@Pz zq~8DVqE6tK_>fnN(eJ*1d}JftftHQ2urL<3M8ooEm>Ug6;gB-Y=}5H{S?ERsG#jAC zfXV|szDWw2s$gp$DY8Ntt>j=uEL3BHfdSkKNXB3*2gd+s5ljI1CEMi=nA8JAtBX@u z?R=!h1lk`7zkMHbV7$$H9SJ5M9aO;>Y?GE&L%ElGB73sWl-m#IPk!Ii6WUwVEPmTI z?YT8w@2yfO3g~NRWBK!QI>gUs#{m^To8x}B^DQWUpk}99CB7Mkk-e`HxConV1{3rvv2sDaucAzbYw zMw2dDjyjyJL=IUJmtX!K#~vjq<7LUL2#(3XhKp1mvM`u`_06GG$3w%#Z(1jwY&m>+ ziTJx?)7&b$cii0WNf~#RGADEQ;|BWY{g)vB-s+>&)Bk?g#5%kEpN-jF3wA?DotN?K zEy%MGNdIsg=gPqNv;;_VLbd~v9grIfsS#}DB-aQjM)2w(RSS6=PdJJyk{l9{gpu<<~sxhd(e#Z-8f{tDA)&+XXG+I zqVKOXr>grxc~463%trBV9g|;J`{aLaaff^Q{)^6}t0&IK;loDfK0dn(u*1so-zdf|Pv^QHv6$$A!S_F~*Y#`0iBt06;;F?;3~Cn!M= zR*M3)PN-goW~GcrX(m~e!7$cYmQ{Nb?U+`k*-zkrb{IIlahR~g!?Pf!G&H!d*D`EZdz_2w>q~ew>?*8%Sp=# z3bG(GwKSEEv#?m?m{h1pg8U?wv*kk#r~{14?80amMpR^A&7`?HZL&Q_ zWlD?8NyMaB6f*j^(Y!!OgNp^sk@`N*GHBH@hGQ%^ylz_vG99pmTq&%LGfi4D8X<_d z@efSX>gIi94Hf^qz@a#%@mH)lT3)#3uAJ`mGTGK+Ek|E%6W=&d>3%4G^2u^%S2myC z*CxKQ$!u!X&=Y~llRbI0(=KE`X5lx`AH~zUf9pIZ0g*5EM z1cFa-Zd%E@!1Q%Uz+lK@Fy7(S6l*4FIIp@`JxR@ZRmG}FDsH0`DJ+nTTQqUHbudl` zIXV_yEDV9<5a>WF2X|PH3>^j+dTzwgNakg7IVf-}NcBOLgr}X|jaxn0pG>xQj~O++ zr_zJwPXBA2k%~iwlQAy+*|PNXpHE-ae>|u&wjxvda4c+H8guZ{lo*x6bmRHRkOIu( zVFSn3ECdXF->_VLb_C(j3&H-Sb!%UDcMqR_?JYhXj=YNo7ajNjlhyOEeI4#8ni9wy zWq~yOm;+{7s)W%BH00OwyLqmXhZMe$#|%iwr;tQ3z-%N+vsz{{VqAzN1A+c5u3%qh zmmnq(2WBA-wUR%WwZfp-+bv$z8X{sHvU;nkyPHqH`qd?kY(E_p?Ugk#sMtJQiFP1| zaH(-u!0e5379rRuKr@b6%0^kvGuNkt2Oke{Jj~-@H-&f#ixsd!zFAI#;Z*caI`AgH zoTmXE;`vOTZUK<<3Q%cq=>gp)B`5iT=h1lxMi0*f-KJq1VsnY zu_OP=!f>u9k&grSZcc`VWJpT}YD`S7#)QS*bmNe)pky5CYBP>YhpVgYfvSR- z${3mw1LHy=CluVFP-LEHrd~5t8ll(-sYa;KLW;IfO9w^bL=`Y`NHGpsPGLNO(Gidt z0gec^CLYDx%^F*nLjT=3@b^+1q`cqjMvC<&qm(8?&WeJI&4=R}nv1{C3N;V)wquUvGaAYC9_*cy9hC@$-4E6V+S6J;yHD(qakk#j&z@IL3S{ z?2v08XQ!j1Au}5C!ohEW0t}UL5UY$ga8}}oH0n%)D{yBeL;4jKBfPHNFwX@&zF|We z0grP@R@Dub^aE=y1K&FF*OTi#-gBG4Gh|Bp_mzt!!ru?S@ag_u@s)c=o0SjsUlf)O zn$t(op5mAI8Qgx<&Tm}`qmiwneYHhUT_g>z^wc1Oa7aCp?pc0FOlugwCO zY`ES8Z3bw=H7*sjDWFXT8+aDo%d)Z%Ke8`|iv3#VA7iXoOQT7gMPWDSHQ|6RG1^#? z=OAhGe?3LPVHjyt`h5Z;+6^`(x)S2mHI>h_9C^R>km&iv^lUUJADfb~f3#RabGt9^ zd;=;Ts5#czakOqfT9Rz!A$93NS-2Y!un)&>z*v@Jv2vY~E>^5lP+tfngg_=Or4(0o zlqQPrGtnEAfC=T-XAXMvQa}gg%J59FpaFvL863MGSh*@PI@EI@Ad{`Z3G(9UXqoI7 z2Bi3^Px>!ObG{7i^(V0JH1cKOF$yn;tT?%t}H( zHy*%7z%EsEyJ43LR=6PF)!?E@E?DV=1}7vt3!L;02W*ao&5_U?3AK^1EF7xw6V?<) z=Y=j0rTLP5jKX(|WO&s};k6Y~_K8QCucVs+Hlx>LC;E(Vd6+vLxRmf{b39teQe;+I zqLggpm#?oJjgX@^o!%sQ(HD|(l#q(Un_;9}{OkGGUOJS`h^{i%enNJ!%d6QM9e3o4 zS9_}dkk}kePlUvm?(4}jFU@)I>wvANW+%AI&77>KCfYtLMWJxz?)7B9GSd&0dSkVF zY_;7r$EA1WFUqZYe!B0iY}9E{0~e`6sFGyv>||4=iB2>^vJrOTJ6h;s?K&+j)K1XS zWG%jm3{tI-AKDPw8p@@FqMy`YX|-@E7DzEeiiydsR0H5Xj8rM04a#tn*~;m|3}7Om z7Nvx>3(OReBD*Xcc-<%oqG}jJ%pMPNcQBCPXSO-UX{qAL6jQ7(c5=Z-uu?dn* z5D0;Q1_ElpB)NcOXQB#8rsyOU1ND+(Lf2VgT_}tSfejkipoTpP$XCD)8KBLD$|O8Q z6^6^!BlHQI&?D#b_vu`F&{1URlq2HL1|RqSy~_`|eeX|0wUUy3Y@)mS;Nb`*Ditoj zU(uOvdT4qJt!B1}nc31fJ{dU?Sci53Tls8~bL}#~R4Jbf5>XZjuuw{v$`rsYKo<{N zc&Ots3lEZb=-^n)Iu+L`C~OC|zS{tpY{RIxg}@3a=!>a4D7)5TbenJI>3E*y_pFn` z+6s(r%SVQ`(aJo}%CO)bCgx4kAo$ZB4Cd0Y&xl)JfEe(;fG)+oTrh^F!MG>V7USMo zfe)LsNTQ|?it+D-8gOfJHMCQW5v;XpI$zbSqA99E6~$zl8YPTTLZK3pl(1I8a>ptZ zfQ|!(IU3}xa+)LuL=NtZ!F+m5_^ij2dI3@e*oG_I7)0gTIf~h2*&MVmBcg#)sTmBC zV~CvPRA7)?P=Op>Q%qpR#epGP4SDA}3U9#NzsBbcRcG7L7e)j}N*{jdi|=7d-fPc& z@aDx!y)SSTeV9+%_Zx0BE0PSxTs-bo#J8GU3G_6Dz%Ow=Xqq%MM~#ZDQ$-i45UF{} zdL@V67RI5MFsv3S=n`pvg5-u5%Nk|eF@f#x#jJrM0lb4u)4)Rk^HCs=!}p(cQd)qo zCc=3I>(#J91xJ*y5$UCb5+!()ut5Ra}SxR`J~xGKQFciMo+-dHOSG#>G|ftCyfvyyqnh_0tzH{?ZHgi#60i zwPGuq8zd2Jh2J5*Ob``#%VtTlP@9>#X52OttYqs?rKTDa=QP0zG6+B+gQs*jli**YwFyd0&}w86yfOpq(8Cit*r7Sxnk2&a%EP_x=Dg{s>Nk+=wxB7Ks@0F)<;~ z2VBG{(UDR-TyVL0VvN=!pz zs}aHVdA4GM(V!uTbpw}NUzNZ$kWKWSzC*O5A7#?reSHV-<>+0~yg4`^W8gI9z)SHR;s1me;cl^4yoA?!#kUUz_1eLK`ym4CNS8m53{+>Fl%E~VGPd)jt#`f*DT|A<-8DWTp=SQw|I6Jq!Rf4>fAH%1;-Z>^ zcmH#JQE|<|ga1T3{eQ*T@Cfn*dtU-E8B9Ktf%E$;|HPLf^z?|c>9625F}r^PKQNe^ zT{FCkLQo*l_QZMoalE`I!MD*a3UKK+xwne31qxXbXw+&licB453IoAzi%;YNqN{~)c8 z7eD)58Tw<4JT(LVI5)2BAwdF!JF%cxQHjn!|&tJ41P@NH`T!A-yZxYeY~ zf@2Et+EZg~$w~5XI(^!xq-k|Yxdqnn)S90q2{J>@{5z_nV{;3qHD?&3?y8=&%wQg~ z`ES+9S$TncSv=x-JLoa4S%*7JlM!;ci-C%Jf7$kJ-2cl)fct^jaDeTQ9QH*pn#O&y zYVnlTCDZDf=a-Z;HaE>&vTDkj6;1vE@%fhGa7}e~>9SF-c{#9U>Ec4)qL!K&t6OF* zTioQ&UA(GkTEl{BxUV|h;b;mtXXO;H3dAuSV$5ke?kNqGaA;v!ZkQ$Jm;NLj4BY>U z&%-G3`Nza(p$tomxb9)xwlw8oaWl=mW!+TqGYFr$?iQNge~k+Gu1HF%#7Z6$x=0C` zjIAOkVlv6lNQM$7kN|`E_KYaLA%82=h3{~b_OVOokf><^fzi*&{2r{wo$P6Hc^lJB ze3ecMo-UXEqj?H$|AMXO8)6Kh$DH}gHhGOr;v+p;dN?e4=FWxN-n`zR zo0cz(~W`$UecI8v)budF!ArJj+%@; zbq4LCy2CY^Al^+cIsP(fW z4~Ni0clSm{esbht6U^SZ2hWIEcr5EX^!oB1}(BY`i8J7=z97(`F zaS5(eaAo@OFDttUvhyH2!cA2O zmMD&W$H^Sh#o%@Jor&1Qrh=dA?Fai0b~^O!LvZo{zu6}=!xsbA7_bMBRlynxokF2kYC=Oa z;hM0l2)RbaV?|t`QQ?8dj@_9Gm1>hhFH`Cj3WGwSRqE|}LySQasn^>L5&rP-D4wb` zD!WB`kXl{lAYk|``}8hQsCXWe*HQCo^g6xI$$&};m@Re&I0H+@$utTy9i?+B3qcTg zOgJ*c==9+#m5xEd{wbnOMrSCV;NXH+q|4G5Ctc$eJg=7EmSNwRWkGQmyb5=j$Z(u8 ztwI-yz7eG%?wHt;IB^rET(gSo!&5=QBjWCUOQGQr1WmYB>o5&Qlb z8TJqP_f_&9_XyX4eje^kHu;?vxz&;#JiH3o@4dH#eZj?(SG)1wx4{E4I++Qd(gSoN z&TL{rfjN`r_Mf8@8&D_lIM=V?TyMm+Lp$bmjKk_oo@TK9l1%5YzhJ7Jm-@1@(QzKUgS+#^YcH{#!V}w+nBuv13|^oo~O^%A&UMizgiE-p;zG=1 z7ExbD47HfG)Df3Tv&}L1yNLQTQ}MT!wkKECgcNy{s1NvyZri9(*4&zE^^fY@`OR(+w-J zKK}T%$<)4_M)!ZZy#FI=zaL*qEq37tsxXTdhk)KF%RN@%hKwgl_RG z{5fz+T*(Kx?F1v}PA$iz8IuB>JPu_{5oPiVKPI16K#5_Ih9`-(EThTCX}RGmoDa#b zr6{|#C=yc<1N45QZ}fEkqD7{VNI56BBqustAtsB`l57xE!jc0~3E?4f%zxK8@{&uc zqN5WvG%Ne=<(yJ3C@qeNEZpe46n|uDARbq`g73s|qm2+j9EcWaITx8aj)~}04!N*k_mS2%2T#2=Hr_YKKjun7KamtP1TC?~#h`7*sE zeQ&=>`ZCApioG7qvY={2?6JNvd%{av1!QceYwnf zQ~ULhmph}VA>Uz(lW*jfOeE zP$UiaOouG)o4Q&RG{A3enVI85?aAY$_G0jDp(ES-5v_GoKglt^(FqBqzUXLQX+pwi zU(7gTtUD|;DaMG$&@gw5=|&KEC04@9qZ3?MIVPjj73PjLnqu%7w~al6c&50%M`U|Z zC$anl;=^?sbjpTHw%s7_eTn{_+tPnO{8Ng9^!1QFc_p}nn`6GKWFgAKAm;*4 zaK7EpgfBSTMz#_^G}VH0mp_a=&&GpXa6@Z@UgpT=`cDKoenfNJCW+kmoJ@q&3Y|3C(-m+Im> z?3kUKJvh!iFU${)F8IX%ju;o_|I%#PTT=V#;8QFz!@OqL^FrL9<1BUbvmyA|{HJmQ zMy2f16RayA7@R*Kb_6=Or>x)h0}_XUb$zqh&u$VpL$Xe0!T;fht+gj$uRp%G3lOPX z3H-?ZF7ZDZ(q+*679!f*@`s%DUiS`jN&)Kfs*Pc;Die@ z#E*k=Cde;837T7j>@)A{X-b1LQ_gjm2QF1@j)6Tgxmi+$e}%9ShJ|Awf7d=gGbY@7myYW_`7Hs@GTjtN#0IXa1}_ z@L%`jxsy_U?TGO7H$=wFUa{iojxzD`tQE_j**G>X%ti0C(hE`VF%W5Qpe zth1m8jvn3j?L=Y|mG|DX8%eZF!m$5)_9O|1hGe7EcK*L?n^|bzY5R62JioW;TL)z+ zX_nf~!?vS-5bi;%?K{nH7!-nGY4DZf#OKd8NPaShD-kg?npx@SKI1Wl#^Sm(TIIoOGUgS#&~lFjWF*|l zfWOdoM=u-wX-;zEm?Ot|067eODHfy4ct{>o;ExZ9V#8LNCbT5YJ$m#Q-wK}gIWpQw&6 z%S%xkwFgR~xbdYsHmynzPmI(ime&^Q9L4$mFhhJ|N;ow;Y*8VKlu5p@+`#BKbxy;r z`Eo8aWo&wsBi9{)FWSl)?cigI^0TbI+k81=tSOe*+?>LA+;M_2JVoMIe@v)5CoZcg zw@(#SGAL7dH|}X+dsgtm|IghWOtJIs(xh$wkG1yzkgB}e$LD$Pw4I&aXLfoo+bi2= z3w42|SwW==(gZ}McN=ZhXksi;q(mtJDdr1ZS`-ix(@aN26VZsDN}_Rh_J7_xy9?NV ze*a~dxpU{voqON+yr(|r94BKx-SOLD;TL+p=t-=x%AfRyPxz(mS$XQVcQ8CGz1EQa ztnMcU>uIlYsW-Z6eBFOI`9Hkav_z|YoITce+y&BIV_u;necOCK{CA8uLjzQf(o zHvHm2H&64JX7{e}C`VUG4`#$vMn2HJZ2tf2Uieb_UiY$rmfQEbl?6R=j_%_n@jiP0 z-{+)j*?zBE*_Bz^-|KF|SI9}apH<@hT>F2%AAF74_5J3mZOAU7QM z7Lr%9PR5- zWA09ke5S_dNX7=V3@v!>$r*P!{Vq>_b6KKHBMnR#I`K#TY@^lZkVUHpUNbVc=%yj{ zCPmq!H;jCIdfmL_;3=u9Nds+a**v+vuJyXsl>YjYg{^&3_)YIvsPUGvnG;nibK{Jm zc_aEo@`vQsMhpv=uUMBu>8Ns*UZcup#>FEB&7DC=f4MXS+aF> z@A)IkD{rp#`D@azEXgZ?OlKf)dsgYx72YBWqm%uYPD#11*C!c7qxNk%W&bY@1F3tL zdspSl1A@=j4nLo_%l5aCbJ8E&bKS8;KYMe5GOI3K_8q+i?0=7WrKfLNoW3wB07?47 zP4VBYrNpME#;wfGy1sq-cX1c=$g20n9IqIs4^fTHgk*W^h~ts` zj^okg){uU;ODWEXvTwYa>${ZIZXQ?AH9s6D@m*%9#~t{cF6m%~8Gq9i;RhnqWu3pL zD_ADx9+MBnPyPqdhca%-l1+T7r5>E=QiEs>{fLh36k|%<-$H7PiTf*TG!?6tEaAbW z&u^7_$bYhz7F>z!5K$xfPsDR(R0RZ=EJU;~+*NF5xzLT+U<|;9Ta)0cKDvbiH$YSi-SKq z{rQStq_;iT`Vrw>$EO?{DrmlU4NTq?i+qvPV*`KmY>FJ z8T+n#eH|oko;Tx9;uYcv!PmuWzL+V}|ikZ-$!Iakl;@ijm z>zpOua8c=5Uq>L{a+$yX5~*bT^mM&N;`Ii3O!?cWrQ4JE4Oh4$vrxWm;>ev!p#oZI zUg|L*r-JWYYYx1eLRUpxCQm!Cno8pG&IRfGuF|-46u#qe z@TllY;juy<9k*4O2=5Y!3Kd8^6lO5V?o~RDzbf|^Yv-ULI@X+XXmcZ`z&T zzt5=p(q6%vB2sB%`l0`UZEP2H-|$7quW*<68<4CgdL$18QK=|#xTxW>NV2r^ABsbS z-LUa&@Gw!i+)u2@Ky8D3HmVPl2|ytrXBNG&q}XWCGsU6yXYWh@C;giz?x&JirBL24 z)OXy)uIqTdWAB8+WB>8Yy0`zaZQF1E_0LzSczPpt{{6(ZbZTo_Eq!2F`agfB)+len zP36ssK?EmAhIRf^(IBlO-dHL6LC7aWKcA^F%w3Kd&!d50p4{D7USZ>|$w)Vpj-%ly zV_X_m5xe+nv0y`@YxO z|J!%uBg;mP8hPW2>-vX!Ma)7TYf%pwa_8LPBewsttqqdREADA(tg5{J=4n5AH2u0_ z)0olIXE-m6u3Dm}v8GUk z2&3#K3}H-99hmkvGP8AMJ(%Gcz5_{qdZ@Hk_FFD1Oay2UD@vJy6(v;dLmUc)c$Yeq zD1uaEo<=K@AEXd=h0Cpf;T8KUcB{=h>*m1^1Sb{ua^;v!ryZvcIcw`~FPxs9@Hn^_0y?|zhR5P68?>ogX{*U6uwUlK6rY{yCI?QA4p z3j)!&l-kIjeCQz>0vZDePRTbj9@Uo^=rj3doNA-&0KzzZjG?qnXr#Ct;Qmb_MIF%a zk~v91s%nxWGs-Q_1(~mfOSDSq zr@!9Va%-OgOJ8km39nH!E&UN{sgE?dwo3>DllhKNkA;VgvAVpZ(e1Eg$$!16@3_9j z*4|2!EAAaYKgJ}(g^$^d;x*FJy6P(ZS6#CC@+ISu%iC99{#CcaBz=W<*&g^ArK&_3Xc%5k&qUj9Je;0R2kd_a zKTJ=4=JV#vJn`=YWShETuJoPD-{V{me@;*5U&O<^@dH9E(f{-&%v#5Ow+?rwA6VCs zT$iQ>+r1YlVG1^O1 zcaiFo8L6Lmm)^lgz~A-%;;Z=EtN81gSH(ZF1;U-D6o01q7Ra+7q#kcgl50dh#2HVI zYlm1wHwcfw!^A!0-}IU6o4%J~H!SaXEHF&eN;brVDb@5q|DbR)w_59CZ@gotuK63CRcv;sdUMN2S+9IZdxM7Z8+Aj#!&mZN_ znS03*)GQ|Jl#oxFTv!UCM;;v^hET?5l*>I4X~to2JZ@4(|ASmuaP_k*`a<0hthrQ7 z6AL>!m^EDD)tLypd+QjTE}rs~+RS>vWiIqkg?2$E%Ql&oLa-}j`$qaUrF3W84xUzFXc@+K0 zjfAa6zQ{%3kJl~^h3g7b+tN#D^CBAef+ z2*TvI$kPeRXjBM2Cx(`6QIB9_?qICn?EL29kcJ9(nEhInL#Ln%G|6brdgaG+6V*z+ z(lad2Vev-e8n1y6&I-9!CpSlJ+FX}oa8dCKi+?M2!29Wru@dDV68Wlou#x`{Z#r-ug&XiH#ra)RB}C5>HMQ?*OgS7jueZbdR9MF4-m0B1m5|&`nWuFU|?EYfj$yaB+WM zp5YoIhkRFV_Aq^wqtZwA(v;4ZGnX)>FN-0UoA{c~r z>EI_n-_~#9Tu;A#4c4i`-t&;IO^U}1@2-uYS4l4^H{p+olL`S?@X zHucAlL6QE9)1x5%-u+#_M~VJl_%%K=g2-t^Sx2zE3>cWtkl%7%I_Rm-w-HUJb^4o4GsHB9uue_|@k6c^Xl<-;$YgNu%zpmG? zGN-R%Kq8jvdt+m;Ks$%7Q!4TIj7ury3Q?4et~3jxR>hHmk)S+SQQXB8N#1l_shsF2 zW3)xSIC6C9yVCbRY;7$IR>f`oMieWpLtCnAdez(7EJaN>)byLwGBhDYX4n)J}ynS1!7uA#sZDs&as2-7R`!lk)YwzB?tCU-gRU!&Bkg z+n@XLm@^Ug+Lv@7Qq1}4;SqYjn8EEY_Q0s%ZffF3oF{SDbl;(m{dr}_3yT)9TkiSY zBSU^(I{t@ar~_bq`Xwx$v|(m7`|We-Pxehhy_u)Iy+gPWok3%}bvkmil8eHe_=JsTgV0Qg zyidf=QmP2$j?klkN0}){Ba@fWofX1Cw^tx;IYKzX(@VM@lu$z3^h{A^e^~|O$5_?D z*9u4H=MRh6BU-hVYH%ve`oN9l<+E$_K0W1D5D!smomzU--I|Cc2<~dPno|jL#HzBY z)KG4{}&STPaV8DRDEGY$sa|8COfUi#|1H<)Hxm=~zs$q7!T|~|f zP*Tc5BodiEK*ZcqItC>?@SKOlh)Ar;s8owbvG&5yfB`(ethw_Y;h%CX)qUXEMwD0< ztsu;XP2`JRSZN;jpon@Gj-B&Q3b+fR{K(*pGh@cZ3MH-24qYf8P&a1yYrexY2nA(o zPf^(2f7o@&#${FYH&!~$`2)&p@9*Dhda17}F}nT^PrzGI>YG|wHOULcx$EyinZ5=zf$L>p}vGkFQkB)VI zl3padDOX8WOP-@~6KCHLEz1y(C}%ha?s?FDdJyIHAhmloXs4m)xXgwK*uDZ4-b1@x z`{CwffxL{3Ro<|6yZeqgtg3aD|Ccf2e;*-%~_r9gw$^tZ1HpLY_C$ltMJF zMEg9p2b+QzKtN0_l+p+j%cr-Y2+3L^q>@oT*WB{*!rM0wA2O;sJ$2}96Bm8-$okLj zmF?ASdw$2d%3k>6^-Jd6`}tG9On>}iRxtha8;4&%gFon}ueq-Aj^^GIgSIiriuDt2 ze`)+}rgt_PerPo74XU&m*kw{HO2&+1%aNN|(m9A0hyf zP#K&5s!Ju8h$v1uopfDl{Z8Ej^B2r13;*E6k6RmhB_0~S@W73R9qK!7TQJ#bEy!7M z=ttMyc4Fb#KjJ4{*IDbDGHXI}ZO~2%#nQoj=f=Fre)A{Vhm9Im5p=mts!&P8f>Ad< zece{+itg(q+@Ev@jj5VjHYH`$UziLe0=Uxu%z(w&#UcIL&rof`S8foV>o}G9solbs z@dLJPYgbI%CSTBfE{b;vzomQDlHJ13B@brKRbJ9_wiw%R$Mxw}VSL9+x6hr7_tGty z^F1sm`!haQS~vl&BrE(hwZzjbwB?bO&}yV?ouHgT zyyQwNQ}`=US|^hTs+_QClp^*kX2uZ{M7FXi!nPNCqh^s!U{ji{kX@6|9bGQ2Mau_ zJ?uT#=Pve{1uHEVENqnt)CXj_ftNYl9ir;u{P?gRpZHMhd)CJ&Ty)ff-5xya!3qyG z2*qg^_PMatg*#oybzzxUuO}}D%bl3zM6MId#e$|mJE#;((1t};1g+R$!8{AX7Hl=` zH=Q;K)PjDi0SP^p@tOx%rsl=$?^E*f5s8S(Ei-HF&?}5Fr8h6A&LMk+mjUQ1zd^;3 zsZ|9p#nDp^;OdGRUwSvQtH!~XJ_wbS1_Kmz7wE}mt%#W9iU`l{wvmoYVSH+{TV5eG z8O*^z8TDf)W{Q?nDkZCl#|o8gieGHZ($DPe_j#Uwa#i0A8!*Y$)Qt8m514PRt*NOM zUQFi672Z_)Q$NuNKUwBf*;tNLs(o;+Z0bZ=R{GQS!@-15ey_nggou^(v|QQCovERj4aMT_K)NU~~LroNbPs zjIjq|U8SDxqS^s&oXtT^&Vn2k%fVSE&N{HgfvJuK4o259M!c4Q4fCzoNG)3}*pQ<3 zRn+HTzMeXR&(>m-2FJ6pKAV?`p?W^KO1vV&DJk#kN<}fsbrHFpxss}i{Q8YER3MFA>65?YOGO#8(|4?xO;HR~A4AC#Pb{$RqLzSA;nJ!>6De z2#b{nO3$6m{GY|l(H`6+4e|Es)N6nzzXbzQBCzJ>re)6|{9DYH?fFCckBL~xbEac| z#b4I+yQXj7!u)jk#XT5GY-iB0@gpKGU1g=9yso4+y>+0_+?)Q|_dj&YuSV33UvTYh z^Ac-zGx-}RU}{}BTvtEl^(D<^(<8m-j>t_8cbZ%7<~ggJfAD;Lg(MG>)NUbx^NCLq z?4<;jC7w;N*$I@ynqn*z1B>C47~YQI+1Qa7TOPxmF}&;NwRv+Lc;10esaCZHdo@UE zwrJSNZ2UAEx!E|S!UgJ`mB%YEE=a6S>`w?QV!LB(ehiDFSQx>c9ISF;o)fFBoC0DR zgw^;w8!u+#zbd?~!hf@HK8qJXp>}azMchJO5v5bDMAYY&B~5l-Lorjdf~sp!!PvhZ ze=7^agksB13g-fYgfZk8;332I{`h8r9EjCjezzv?8 z#HZ7Mr~1-g`j?wF;ZuCdnwrxOrq?b^wGLTWpOqN!r1{uKZ!|SG|Ly7e`sYxRe!9aN zkF)pR`uT0W*>qp*mb)~GRXdm*WOj+`KYb(np*RmA$)~C9$2}+P6jUuI`JY@q(`aT|76QDnt23wF@rq4tdyoHb*M84pmtz7F$r*rUJ; za=akJZYlN%IN--tKMwh@&4(t>Q4b4wFy1xW#R4uIaAJWIbxs_xBW%N23pRJ1Zl9T* zQsATkt4IIvNR!uTX1wOH&BHi8vCzh%-uu(b*sskSv*0$dMHFAlo`sSv{-`j zDAg2n5Z)Jxe-Mq|Iedioris^j*fgSWtMd(n);#~9aJmou{rADF<|Yj##|;`gNr*k6 ziI;6NpE{p@xxH}c+5+B7<}$sj~+i}i@x2!m?!kbw*r^GQS4huL!Sq9~pU51HeXevW-8G>avT7o0RSdfcXk~o#X z-UPNJ@IZp(G0sx`!uZzs{F-qYmavU-<`^SsI&Y;t0y9d}xfTNy3gJyfRBg2@&fF=MwG8_hUI zs+kGnO`sB~R3&PPe!iaN>1*|a^r=GOq810VRQeAWsT!4LuZCSz>WIkva5ofkauE3di??`^306&hse<>|Mgk)mgf2Y!c_ z5)+ab zpTOuiM#nHZiqR2l4DSga4-4bNU7RBsz;dw-bgduDsnsZ@j`@)9L$){RZSe~2UcBeU zR_}iAX|J%z%j>{bdO(F{Wp2FfzT{>{-FVi$)6JH+G1HClZYp_?qjtpY7;igfW5g6@ zSaFvHTZ~wqjoH~4D_V zTA5aE+Vs&e^OFM-Sqt0R77D*7ZKwU+KeM#g(}DE!82@x#{nPpI%h`@q2~F!Q&3886 z(j^~z^b{XeQCuW-<1P2cZuXKJ%iMgR1nN02%?ag{<_MqU;H@0&%sG<7*5_~wg&4}M z7GzVyLoXJ&G0lxWR3X-hsZL%ec8UYH+ZWr}A{(Yr$ym!83%kvNHB`*lgvll>0`Ew# za2eHtRSBoeqce*o!}x%bDIzYaFY#4AikR7@Ux-86qg#NOCW$g`Qixk$QYY{^{*%!q zuFxV_10GFJ>1g!(*+Dqc|42uB)Q1eMju3T+T*=8)+ms-l_3!jEqQBXGjP+xg_gU{w zuTYxXoXdi_I7T{MqA9_S#c@1_(pYnhl}4H)EEqwyAMJj;N1eL-r~PcQAAP8vtGCQc z`58FoJ@5U*D=Z{Q<>?y6MJ`OEN6x|=rlLlYl7$k+oME|7t2D>;NjoRRKz29nWd@AP zqD%$WZc4kUTl?yvvo5w0?$V`^(Zci@R>H$ljvgh#o0?~h8k8T8 z=MTJT1`Xd6=3^HjSvYUrLNKn3H6h(ShLh^+CtW#?_#Zs_)Kf%kR9`7QL#FGpsVm9k zySO2_JINwRoQPvW93P2V@VeMbF?MSVWigO){BacLNghP8T&!<<(jn7_-95 z!fZ?!9YO35o({5YLHs*_nSrGNHZFimer~1TCC<|&A5MGT_ppN=Z1rHR2h%(YJ#4UO zbRTeGiwlEX(_9N(Yh2Rf&bOUxmlGSDxWl>J$)-CnkREm%vtqp!M=V$;+S|Vr1xbk+ zA!^^JUZQ4Ws5GbYJ|!cXrgkBfd8&|L(|Q#-Wu?l9F`*6+|LNA|M6*dOc6p3i0@1{M ziOhRu?7MDsE7;sj;s&=Y5|-;2wO*l$CP8@xRZb3&*=^-!H?0wFDbXJCSh4wi`u6RU zezdN4ESSYQRq21)_kQcJX|fIkS$SPaQd) zi{nY`rkZ(4TFAjK-^j3RWkWlGI-9ku@YF-!| zZDjT2Vp=Y?C9yh*g-J|F;@@%Xj$?fsW8<^p%i_Y@(MwUbK8mr?S{cnp@|qz^A4{lRHiODzmc|^q zP^QW_tvf0b$(J2(G4LHk{#Q$N(vC#VZ{pIL+O2dkF@ct&g>y0yTSa<1pGqpAO@0!O z^7wHj)pf;2*+`apnv^w+4*w?3Tay}_=O#d(s~Q;)wB#y>)MGl;hWc-xP+^*E>dP{+<`Kh&}h zHTYPKH>G%6prT6Hl{lJU8xpu9u{^vvNf_laylYiP69iG(_*!L zQpV=n(Qd&9796siwXkYSi-qM{@QUU$4ckYjR$-3{&0>4CWq?}|%@qP#GqFgQ+A511 zGOUibp5fztm|nkH$Yz$y)#FSkIB|eYMD?^OidGs|UUZN&YmN)*ULDkk>9^JN_i>-{ z>t~!!)u;D7c0*;aKD%?A)5BSA%kJH~goOk8_wQ&l77W}bBz=MQ*V2C(Qfm5<6q6L1 z8Dnuu*t&(WEgh=}0(L zoZPONsa~pPLIl?qqvAh4Bz}B54w5~ui!&H^lIj$ zdWE7=E>;30HIu3$*VfhsuhdRvL>$|9?)}emV`9U(tC&NNbpGawynMh-U7P`>6&!?2`a9)qU&#_|E>;}#!a|Im`|L$1^UW((KUSxg4BNf^!^>z^bFj5@{zI#+qRuL zTs@jT`P3hf#XhGwAX!a%;Z!Nd&*&sgY)Go}WE1u^p{)t48uvA_U~Ne)lh)$nT1>1( zqy~{{{I>|77vN9~3u724dZ7kJQ5(gA2wEbTA4dN$mV|bM*b>nva4sla64((q95@${ zzUjvj{|^6Qzi`y|mXGc9VTBJLJMl3IUQ*7<1!Kf6BUTu(+i=XlmKe~WLj$jhO;>cN z>1>m*pb3MTP~C)q4XA2BvH^p7p`cfNFE*$g1IsYD6uXP?Y!Q|g;f^8{7mY1qTMPCV zu!RL!mXGoID9Xo}yrp@pI1k0SI2*&-7;0nOLtGKX@zj9`nj^C#yCcGq@Q(1|u+R{m z8D{)`4u^z>(995<9b6II9XuA4HU)84;KcyzO%lwHgMPI6LH6o$7nbH=Y!3EuPtaB; z8|x&G(=Iz3W1neXY8S>?yE-ONMfNtsA;VdNu)u&p2Hq^9O@By#Rxb?D&(pJNJ@@bz zDaR<6DtWQNc+fW z*gaa~6)XIEZ=y@%{KgYxT!P)!j-R*&>7Q1CGAu~vBtwVy%i|sKqGhGURFRjnY&jv^ z#h^hn!Xw~vs=3NJI98?_8dA7atFaf?DinX|^H};X?`)Tw?rF?_`f2&Sg7Em`&OvSZ zor7Z8QdU@~Va#hv|Kl;?uc=hMzPMNKvi4UdqLpbt!PiZzMPDwsLdc`=OBVQLP%l2p+UE`+c+)D~j>LwF^K zenI@phktqTFLDC9anX$#?j>&4$BlPgSRqDw-p#=WPJH0NMLSZWuhD0P)QXR+*kwgC zJuGOlAZ13e8GbXQW_%=iF?ySEM2ma1yk+rA8qClv(d^I&b9hnqw(LXMXS1beR9L0L zJQYqU-czuPGW<)5ivr#UUIyNi;Iss{hHxf?Lm{jcIp^{qb_b3H*zy3H1G58chCj0= zr44?hd^3DYd^>!HeX5rXBpL?{q z`3LC_ez#4gy?@+;k1OwkAbW26fxaZOvVr zE9B?mToOl;*pNhhvNgFlDdZ)wHI9W*v_?@ErLH8{7daJSizB42pANId)ES$oh&sOe zQRPL8XTE2ZXP-w}fYxS#2? z8)tHm=vkQiGP#V+gDg3NAjZ-4D?>{Gj=Lz#YR+&EnKr~A0skx}q| z^|N1pk&jm4pTtM2aIq2}^uomoBD2L&)*4wHVXdUuvBe<_4xu%;ILOWg&>C1AVCVd3 z^)L3bb3P0vhcNrV!@2847tWD0F9$nvKn|+KIjEv-=Q$^9buM#on@1L`^r;)_yha5)7k#?)Gsp09=qdBkxxc(ORAGRO)rGGBY2Ae+w|D2!+Now z#5mm@I!0~QOR1rx4iX(c(qV`0u$7k;3(qQXM2S60Y!F-AJ)_v6U=-ZiPF+)k?E)jr#vz7njCxUH9YF&mT$lbC z@9M-=;q@BK(k#=k)!Dp@NKN*@Y_=t9Ulw~c3kS2XJqxR;`$HD;=&cgl`QwoCtWubw zT%}}HVyJ(kg2&Nz5c!FGYJ&uxkkc&a6>6wl5x?yPnHT{k4^_s^A+jh=D&ilX{qFd0 z58aS&HX|A7Sv;VJY4P{sXI-D%M6Rg{?)Q+9BPv>MBL}yln+eJNJkCYzh`b?zLy0)z z3Dov|YKM%id_b8qT+LnH(07=dn~dqXZ#`I4RCL?*FWpP+d-Ck-gc6sl{q$4Wn}uRm zPW!3!U%Kt^j6Io>{4Mq5aywS!jD1cT^SPp~Z54IoRvOXz2{;5~;9TdQ8gJNikaBJ(7eS!eN1}qux=}afOXx*uZu(wjqV} z^;lnrQd1%aCmdmPh5zEEt1hywom*9wx zxmGf2sx5mhCoKZub=Dhq8IKx;4F+!Y3NvL(WsKSiQ3tDfDek7=Nr9_YNcJ-NWkqFi zL(CxX&yplZ7^MISi zJvMUX@NCsVLJKd?`>A0T1?c)1AgwaJRT~yPvyKAGz5zs?XSCSE7vqX=qj3N-x z2%)&FB8sbA#(}>CO_BL{w3CA%C{_V?%YXqbY-IKPAq)CGV@&q?AM5KMk^6Jb?y0?Q zK>GglLuhKkXZY+IGK(H>Ju*g?H8EkHO8~9TcDZ))zpL4GzgPau>qS|5OULssUp4n? zNh7SOQzykW`)V)j?}fd2C-c~rJiHRaJ31T}NAai@JG6LKi=!GmLuNL+qi%T}n^1?g zN-V6z6u#aERI*him{)>1vHN3eWfb$N38VjBKfB9)uls~sxW`5D<=M6sHem%PpgYa1 zzu4GyfRT47Pg1*6YD#ZF(tz9abM+7CpVv#Pd21}{^1V&Ru}0H$3w5kcH<-79ML#WS zwK%RJXJ>JN!XYt~CmOset5g)&qMZI(zwQ^Os(Z%1upc%vNeL1jw6;Cq*;~BWA1|Lz zcxJ-aQ9h0#Q)-DEkQ|vyAZG)mm<9vX94}5qyAytIR1q3f$Bf0pQp0b#zM*Q*jkg?n zzugL$%EHB zY=>>Enq$BYTiF~lo;P7LtvvN|H4CZnQWi#MJ(I<#XPYmpFpIsd#4mZv;(L^PltLfn ztx8ra!Nn9#rEswx7wh=d9IeHMT7+vMyiWt@k}Z1DdkdPLMfU`QCdn(r{F6= zX%T`&NETEVutRy+oQFfX*qVz)xtN#4OtM2mSQ5m9AeIHV#G2wks|RFqpK{?~ikwSr zE=+ad9Vd=CvD1kXXOoi$G^LFW-l+K>c8s+XWc8?xO`xck^`e#Sx8kA&{Vcd>#(UJZ z%|w)ll|*}5OjDy(jXE{*)Cj3?OnF|(?o!^XWD}L>twckiS7syFT1`CL;?HlYFBTjM zcT{tkk&uZ&^vEOnf92eSc*z&2?f>cRmB`SqjZ$2F#%??^X*oRR%>h+n^?@GN6Bax9 zaPCtYrGg4&rLuC0m2$aeCB$-&Kv|?xZ5hzg!geJ<(bZ`BX!0M^=l=cAQN)~j3k!zM@7VuxanTqm4l*vG zT24&r(tmVSRZEssvu1C2&%6Ii$gR<4wOm*7La)hGFD^sdU9nT0q)r%->MW?cSjP%# zFV?b)HOQ~Qo@$g8VQW5C=3{<7q4S=0RT%>OF{gaLJ7~-B?dyT1Ih}xo-3oVRvyiR=IF02WxV+<*==e(+;-Afoca% z+R?-2SHasuxJSbsjaKKz~us zh%Y{%!)7hkYB5iX=QUWP!F&y#Cj(rKg=##X4eF9f-AcEpc$e_`D*P-9ZCRL`MUBC* zQi(ZAys7v|!P*qaRp3qeM{?FCN3Og^&fb)LBx7wdYBN_OV;@OzUWzu}GPFv{-V#0* zSet+&~RQ+N# zTUL#x>T%U~R0~DbXciZGQvr&o$4mi!nvZ+)(K~-a{+;6 zNG;wO#XZrkFxV;|j*=tRi`{NQ=3t)#^^V03wm?i1pd5h%ChRj{oet}?Sf{}f4R)xp zL5(G94kMmL4;5x*;pa+hRN`(9V3?=iZ6& zR_JEBm{?>oz;PU$4}3yZvF*xXfHpOxX%oMBOtU zFv2KDGf`sV2<0W2)P<;lM=s=wPbx^C{aI3|Fzcl&(@&+J8}GM1@sp>2j@SMUqxt^D zcSRq#9R}7&R_oe@H!6|wl|3en<$+z>F^~fDSA{?iKK>g1f`79I+a^q4>G#^t<`xJ= zYX_;RI6`+^j_a*zs<_r4ccnUGO~`FPa|*E(8tc(mhlX1GvjT6Hqp}?5%5bg}=Spy{ z80U&GJC1V>oU`MC85d3Xz=(?myrsoC4K_CJX*}L2jBmu)21*pzojR5h#-%X1c606C z+6%SP_iNf~7#U#uYp|^bb89fI2AisJUp4Nm#%2t%d0TE3X^DG zCC>H2o{HlYY()j`tibpREGfsVa*QwMit*fhB=Sk^0x4Z<@-ROS^Kw__vbzZy8pi`6 z%pqs17%G`>Uu9>nQ23iN8O*E9jC3ke{# zUy<{*6iI4Ok9K6Grsnyqj(HfkWz($|2_7j=VX|t4NYq+KEuqOY;wVfTD%}>l*K4=9 z*&6T4Gw;pNHBLRUe%bK!AD6Bj750s|=h)57o1PwJ%t}pPvir>aMe>>vcR%qrtF1_F z$h&r2d6sm@@G)mlOU-6nHmlo(y?v@(_F=b9EOVH1N49U*)D9p%gNLX7@Y*6z?>VEU zOzsnx8w>NFo;bZCst$WteRFl0)j6oX|C~r=7N@BzaUeAqm+B`m-f|Or-uQ}B=ram4xpS%^LS47|;|sI`1= z-u7iG>UM*gipd*OPM$8JCZ49kn+AT1@myMtmZqlWNw@vJ_U`G84M%@E=R{q}P<)%s z{2XG<^fh7N4JpTi(S!}Zlk{qrezW5PU^5v2dTDH%ih-FBuDV?)3S0c$~AZ= z8z-}IARGTs;j9Y#RMc2`yNYegLXnhOWZ)SAGX)ee9CLBp&_U-JC)@8p(t&;UQ+8Hh z$8PH}D+`*rxkMl^g-ysY$sE~~!^@3UN=On{JZ)Spga|L%M7|^xn{WcW>dnMyzba`wiIAu&?1% zgRr^*7gBg7g|#WP)nhg!tT+UkV1S`4a1T`i8+U_;IB8n(6u^)*;kjkaE>?lq;? z{9ZzRMQcS{g-~DKTHaPJ)R(oEwUr5Bs$j$9CAd_Aw@MHxhO`*xi$5u5;UdV3aH$CA zi+Hk9OAMQ%C!_4G05$}8*jQLjDIPqoy}`w*?bu?++agx!IUC-vqJ{h?lPLVxDneXF-!eUsajgud1$G@ER=K@+jb7F?vG5iC>+_cr?1CKo>Q9!I#yoM|4vK zClHE$bRFFN=~up9vA#{*TqaK{7Y=-BSCBK7{zdB;N8OXQKvXNXM*WV*o%Q?NVZYZK z`oqxOe+)0TP8cwLXwqY2#)4!ZqRK8FAuH{L?{JLpv?~yFxdNfrPab`?e}ztf0&ga8Gyz!zulR71Kvtqp z{EP#q?07keljK#6?1`}1krfd(A%Y2E%=TfUcaN8i_pb0VQrtIduu6k@8c5=Dcd@#d z5-jxMdOjgKF}}E*xwBII6Q@edgrLM>KH6a#U9ORlfyW(7ME<-&h)mS#NHn)^irI34 zLANc!M%j-ZV&=G3@A4E*8t!tkKv^$~Jg>aUrV+A@D?Q$k zV9c7Ah!m+3Wl=rTMx&l&(k2ts!I9LisY`~k38FvI0ekAzi#eS+?4qO7!7kc6?d+nh z)5gY8oKZ}}oN7Up1sx`wCZLZAQ%zL-1#cNXHn3v`yg)XNVTpk))Z>y4Z}OniF5OX` zut>kfOD%S5u~CZ)8c>Mob0v>1Qh)Dh)Y{e7+r|!=@G~B&yI0G$i)`UvE7lY3?8ZhA$K{qbt(5K*Gz{PtGIDC`cUS5*I?LF_WM`6HOmrq#XB_W}nDRE!6E~GY z`eC$%w}%gfg+*b6s90?f=YyXF*}C8hLAF{<9b50;KK9})r8bz> zn%FcGW>dyr7Us(^TY}zkl#(VAMt%79FeA+2nIP(eIP1e+AGY`iU3|!U)+?O#ppO>g zwdk!yDLtzus932A{iLXtwn(Q)g#jQO??B3g5IhN6#1zOg6e%1bODv~AUBbjwAab&< zq3<64t1=+E2m4Foe>IC^v@Up!0uCkgFoh(8IxhM0RCIrGZvLp`u)1)tuC*{Sq%O=@ z4xgdXSIkg*eQRs0tlxZJ&9Hdhu-c%%azs(blQe5IZ6U$lGi@i@FUU%U(4Pb%4~fao zP?gwosb}h=7o&{uB!uKlMsO^Q4?;LfFsdMq1UWvIn8`^ecMY7h641WX%y>II7BrR^ zS)l>s>|UXVPhY5KD|9H-!B5ZBfmn<8H7M2Klp616LwKK}!|!Ebul$0Xy(h(cjFj;@ z#>goLmIqvvV5J0eB`BbpL+ms)vG!*>lx`tnqPFcc;N1Hy4nNl_t{mfAu1Zkuo`ox3 zK?VS6{!m1;;9gU))j8EOpn4WmT?~@~f)yN@tYI<)!oTiW&+j7p-f2 zhtT-OP?-A5_Sm5qyA;J+QAi{BB!aghI1=H&0)Gg;U}2Dp?-0j)y-%J)4^&S4*U8m; z3Tu8wpfuv*4!mne#9nS^AzP`9l~@t5qQpXp2Jo2+&1}8sD)gBOO^o6a1km&u3#mGY z0UHb`GQej*haRW&DAl7=)DJtgcuxzJ25AjXvHM(&3u>N?OhBH!S$IPUxg1-h)Ke5I zDa%uW?X=hec-4;o>Yxm1T`@_vFG_{IXl^o7Bl4z<%9oj*9-h;)aar5DVtTIH$qyC$ zfwFIzGP$B;NBTFzgg{swMuiaE*t_>a#Uv{cG*AoA>^b!}em%nF5~e152;AlW5T?c#bUA;)beakCF;qXbh5@o52e z6ktjLk6G@ZEb=%$jN@P&G`Anda4^OVAxfJdNLGQkgvdcx8OCuhUJ;j#%!;tJ%*tTF zzbyz_N~pW68JElmnoG>=k_jaygiI(leq^L21&IM48gRsbT?TC86IW)&rwtqv7otps zPgIb}@ozcameYC!li_0-&Wj}nMAzD@ss2=wL#Pqh-mX=82G|d50Sc&CB}+(fMuPnk ztdeYzumuv-OOP+YCsth2;1f0SW&T*UBUz+$M`-OH=8;hH0i2-6mGsf0`isQCXTA&6 z*F_N`*<@(v%4hM@ZqD09NA!8-5Pp*HvfiVjrXp5blYh(Fe`zFqrL^{cR}qQy>J^Dp z^e_SH>wTFCR9EIF<`NSqUm7ZGBqngwpO@$N@|BD`nvlH0L86 z<~2!342A*-`XTY*2pRW2{M3h1FC<h!s}pwumvW1KL-$Y>O5vwaC{}Ed&ZiY*RBy zc40Q_%*KRl)G6Ro;6nu_D^M$kPmT}em?j5B%>6QaC`&zz=`!3d#jOky5Okmu7!9gM zQ%EKLxiMxNfTJHc!OY%g2gxUp$t!__6eyd7;;?UHoXivzvTp-b86(Vksjs zQ{=L5<%AR#Dd}Kk;c!JoI9$dCe?3!lNI6sdMT|$ zW8Yi-yNhf=sDlRx*b+Ro^taW0cn4Y@XfmIG3-G7B*3|4HhVxQ%dg>ALq zelz-;kuX=8*+vsqn=sdeTvLr{ph=iuK&}B3^yshW6dTuLxej;gK>=+wE1wsi#1-X z^iVX1s|%ky2_|#WdBG{H<{1ryf|}w)+(}-WYDbGhP&sfxR3gZcv(T}|!Sg9s+tFg5 zPYxX$M6+l&&%0i4!(g#01MSsW3#_c(+G@Ssy4c!AvB^%WBHs#~rNF}KEv=T@EsHH} zmW!57i-J&^1?GBltNC{GVso2We!Gc7G=;$?6qxEwj6j+-#(~DEMqw2N)(vwFte+TW z531m&Dzi$?Fe(I8F!Tk=LB1c%^A?QpQbIxyxWzhs~E$s{ZRhfC;^^#eWw5$6)|5Qr$ zEzLI-h~Q2_F^#R3R4_4+S-}h3bXQ2Tm^+@#&NliD*+!M>28ALNoc_>6x7C#6$nkp1 zUG6f^t0q;pF`L;;DpU5O5%V3-Y&_FYlBd-c=eSCo&Jq{(V!Xo6SCe&hbEaRn87oTsKpbwu^O9<;8a`9|I#rp~p^-+dgyr~? z@ad1uI$b#C%E@8O(>tWG>a#r)=2Wl16r=2CjXJYU;q^2By`Koag4#M8WlLH^R;uJ; z?w?(hP^TZG+mx_&dD_(ZVCU_`Tau8c_K~~dK$4ma;^P=zieYCA!Pxp3+e-<@1Plw{ zlpjeCCjWo!eF=P3<(c>SzvnL5Z}x<&H~V&%-0aECa!EqS20>O=Bq0F;fg7`c;1Wcz zilAMlGquxpQUzN9n11#+g*nwl0OX){d3jeE;{{n*~d)cB<3* z^PYRpeb0N|^PYEko_Bqo|C0!-wxdZ6?K81&#EN6uVpmV>u2?b0giI4{HQ})7r0G@D zZ%jH4kkUi2hFDL2xX+07MywOq39Nyfb*xe3KJ0c)ef7Rv+>(m}*(l4#t!a2J6?bd1 z(u&mPR53vH3U29z%GEM1nVbqnW|k6X4ADiT=LGpDbJOGdFL0hB*Sr4k9DRE7BI$0r zxtXdEdZW-FyMe5dtPqq&Pt}Ex%@3snleoiCS|~_!m)1hfi;E?OW`0igKNbaLnNy-- zO<~63@@OOSDof{vEZBZW)9P6_&-$->9`NjmPtQz9w)>?OmaWW<_0z+YP0RJy#Koxd zwi^xK^XwJkIjv5pBYv&g!*vvYWj-EvP0T5g03w}*SZk9@e=jR&osX7zsBb|*3({Ng za5L^~#y~SVno-w`^yZ>wk=9h$RM(`|HsZDVck0E-dOTT=z4f@K4qNKbR43O^H`k)M z7Prj4ceZGr&DIV#yU^ys4s8+jg=*}mMr$?REXP}A_(dsNim{PG8APQn#110C6(F^s zpg`PZ!=MfN9OUIVbHqE@s7N`IaymuLOTk%fDImvOZWh~P@o)@w#GoVw-;2h!Xo5Qv zk?UlX*cOEy>~JDLIiR_r2r%Jw)9*}zBcCH$zv8M|7mTuC2>|t05MB(z(?Pg5Xn&B< z1kKk4iJu4JO(TQ>zc#?XD7;p0nK!>Gc7E7gk#8)^P<&cmlKJFhNiK@YW@%>YB5VKs z*BV7!(Q}Gc-tX`cmrf2JxXV?NB~gWJsv${7k&75jxYTH%VNfp3k*i5XB}syksuGK+ zD2og^2$Y5jM@(m8rvusIM(&DnpXoQAmL|*IN zAH#38wY?-^qpm{IM3T6WI6*Oo1Z+;gdkJ_m0ohULi9}8$)`cO+BxkGJOlUXZm0;}9 z!1z)*MG3~8!LLw4JWv90UGSUm6T?Of8*oaGVG4HY(WxKM3q|LZI~~@I=tgx$s-Y{Y z98zvohc($#;~grx)In7!LXI%EieWJ#MuqVvfewK~H~}#X+yrz0!wNbTm=dTRF_9oT z6Hu1`Q#`cwNfY<+;wIumI!ESVEny-z3`fH7hKV9)Pn%xQmK=W)jQZftV4(&V28-_m zKNBn-bUi6^fu5jSDF_vaR|D~2;NyYM2CBCPVtpV?0l1yBdE-T+ILX$|NOKVUnhp5| zmto9s(V(5gYI^GVHS6>BF8!GPqTV1+Vii4^U7cB%uXE|fbQg67c@kslMOEn36RH>! z7ui@an*ujW+4WIs^<0E*Ew(_6DKzi?tb*?-z6DV=DPoo}BtBXniXe`)^Rp-r_C4;bzUcWh zJH$6f)UH8MLcMM%d*uXC{Zu+B)S82svadIow$%SktGxW9hXdib&*oo7MNcl=vJ5enaWO-TWuPYmt{0VbjHO>p7h~yImkuQjV`&$u zEtQ6~Y1o{K)f`BqpgTqC!LKu8C>iUMr<#QKHwJ+wyl29jChQ17M=%P5>w-l_FwSej zLqkDQ7*Gww`M|dW#gGPJ*~4u(10-vUF^#J=Mjq1`*~_~+bgP?Hu}<6~#Ci}i#;pt~ zqAb&zT2(;yoTd7O>qFD+6~*z<6f=;FDmyFhPm|&J;R~VKklMG5qp=wIO=Hk$F7+}f znRL2ulJ3c$x0lm6RC2RqX0o#6b1$oUT~lsvB)sSI(U@I}!`nPe-_gcW+NC!x?~@Gb zZAN(cM_K`{!D|40AFYuPXFq(~F}~@_Es7@lp@tj&n|u5Ysn2}Ofus32MxA&L`g5?I zXe!y*o(+PiQ09!lJNIT_m!>UDj%`UtYZ~rN#&?rnOcn={u_bwDvLKq@(Igy5qF61e z6Y;EsRiu*pwpjGXqCFP1v2ak^IR*|5I?ff{8@)ApIC_L)wgwK-cSho@rg(QC61ym+ z6ow0-xIl^wk(>Sx2IHGS5}B(h5F>sVkP9%wh7p6>s~^^n==sN07};;C1G10AL2+D& zl>*0s1CTlsD~WWV99P6~%1k=&q65eBu`eHIwM_4K?X=^J9Y<`~PelML&RDQF8+)@j zZb3>WQZta2j(`-L;(TA~XLm-+6>$-r8ZCYqjhmyeJ_?)(aC%wB5azbhMlE0Vm zraK@>pI(ymQmS)c`uIIOzfz=IT|Um+vXKkRCOPS?v2bD<_;3)ZL$wk@6u@2 zF0wfuvrpK?1>1y8P_21P(_bFTB}5G#lz?1F&&7poJeqwho4pY(WWuYn-<)wIL!3*O zU_-=@JW6feR0%mmaca)NYc6W^7LWd9v{B>}^j5HQ)~>9Zx!! zq~4i?bFmUU=v*}ZNvW@ucxpqfRG>Pb&<))Oa5@jB@B?RP-zKz51=B_E8R-jC8v8 z^Fo~-GmdiDWb9PWtKwS#)#3($T~?grHa$f)DD|F-y(zfYj6KPcb)QSZh+NvmUINgV z&YDDLFy;iq5sb88i7fDVFrEl}E>I}OQRA3VVi48r8pWOA8A60kwVZ8<5Yx`bUd?>CE*rJ>29v6l*SmOodt@1Mo@VvN_CKizcfj?V(XB4$@5O= zRkismx;KI4o`@%jffXkagO7Mu;swS3kDIXDbigFmQF$@s zSctfvx&R??Ygi4cTZ3s(CESGQ3B>UL^aS8(szVr87<-MXHUl_nK)M0v4R0I7alOQE z9n|5tiVhV=2t+^~$Uz~}1YY%W_@xu;EAUV`wwB}ZatxP^u*HywFUT#$=|a3vfYT1ytUqtZVLSHNaoUExw!=2@ z9V^Rf*eZrCBNp*|-p}*IcPQJKhu4WiszH$w`sGv>Ml*4V;*FYQ`cpA@J^FXi;&3z` z<~Qm|Zl&qcb>h74ZJkh5vzo7x0XRcht3nZGkuOwjn$jb88qC~l@Mek4y-rD2#Chdy zg<~K#2}+48+@`A()rN}X*c`U_vYD4t6uB$lo1>7#ecu_a@@4!nMekZeueJW(If|D% zruu^`JoEux@~x9^yeWeU5K>}5m4I2Cv`YX|PG&T_7o|xm4Oem1NQyp%=!jc8)j^0Q za*Xn`j70c2B0s~D!;bGAotGaTWO_fz*lHUT3ldZ%C zM|ECiynk$Rd}wH3$-<6r_RR0d>+OioO`nsIP|{d$uPL%-7n#Su=i@&wk9ijBDs>wr zkI6Oc3KyK!uvVk40_2?yC3v$0KQBfLh1jS!YR9V@7zXh##`3^kV~hgQ*%;%Nc_xae zo8^bcsS%Tx)T`{&{g2q6*ymk zXGxwFPgIDl73izLiVDw_o0YG_eZWv;8t zuGXk+s#_gW?^g|WQA6ADZZRb87Y4Z{-3B*?a6b%EdZbN}6Px=L8VX|{sPVCH6F{ZW zxv?!<3@x5#we|H7&!FJ}(x@5RTobKkv?XIq)8Kj~5i1g5PpnB4V+m+YK#gV&qBR~h z5?BN+aj1!tkd!t2#!tU%w$g(PkVniZ;WLLAdhT^h0{lrW?|UHWo7rcu0sg7OQBJ^F%{*Sg4v5ppOfS z3?S&~4^L`hos{sWT<2wbELWh^X|La-%Ne(b16a-dG>U3QNy{^(T>CawbA_F4oKd1~ zUwR-WDqgJ!@hdI4`-i)p?5(;v=No^sOlPSI46vtL{L+*3@3B9q3Q7)JU6a^UyY}{~ z!QFw&Zd+o+Ec5zg%}(5*Y))%uQ-oCZ}aaqHP6PELqw=L=u7DB7lT3l;c>2Oe~AO|7`cWEXM(lYQ$#;-Hv zDCIRx7U5{ZnFR6VEIb*DquPdRp6RIRj7ilrVULEK2@yRZw}yy$A+(KfTB2+qEeN_G zl=|5tlL`WJ!_s2n^%AO6Duev+1@8uwq!_kXvTxG{n%>q)4mmGt)TW7J+T~Sh)`Gt8 zq(yhx^NgI$7){ibQv54~yLPk@C3o=z!OOJ$I;|ayA+1SSJpOt2bBVy<`EqokE+9T6 z0>-%H)cWwS+3`tnQL#yZiCOi|)Xc(+h@7Ip_|n`IXG(;a6%v$~62zVRn(Ot!`lP6U z@TiEGS+R(#ZZO3sM#m6RInO_Fz9XYFC(7gqigp;|vvL#CsY4qTsnc6Ba>^WR@5WE+ zO%qnbI_`rdxq?&?5a_2@0*!uLh^9%H7haMwH1f}pPZ)P;jHi&YL}{Kwn{K{&)8@^3 z(?<8EO>T~F$4}{_C%$6%IxP+*D{s0UTOWXy0N6M#lsF_+{`36RJ9YSN9DXwk7h`cT z2EU2MDbs5vLD6r{?SnM&))OHx1=j?(1*@hYiTk8-L78wSxA|k8KTQ5O<1g`2XoT@~ zKb-O7%o+i@T%GtGCHrW&M29@xe%(=>8mQuR6-U)GsyHBJiYWB=80BWT3LpZchTcBq zwDP*5iwukNH^c-4C(8EPeo79#NG-Bi@ztmHCr^@UydUqVN+S$ktD;29b|WjgL^d6n zl=!BQcWEYP7o1q|Ds%kB)`|*OsJ?bZVt(AMUum2bfva`g+)vTzxQ(BpUszdmU4mLw z)it}y6rY)#8yKucrRsFCk&*H&$2FJU(+7IC8SYk0EZZfnitQoj3K zU}u2tDGJURu*I;`Al4bsY`|fG0kK_(IigF5h@f~~j2}&+PxbciYdpc8*=tnGyQ3T} zwY{~TnH$XPlgE!cmKPP?P*`|FQSl8)SuxRBQQoiNZpZZnj_V2vu5%Pz@92rjjGFq& z{?t2Pe}rq+Cfd6Eyldra2~rm5&2YRHCY9{p2*FQ-aE3daT0=*i(=!?x)7lt}Mvg^_ z!;#oSkYx=zZY%<0;phu{HcYGxlcGT9gD@I|K~A0hu!Ev*fuTx7aGd@RW^x8Q`vO^IFE-b#;GJ*C1#s z{pL-xlI}eB?eV97fhC?d9>I5ad}Br4)e9%{tl3p?DXsVq*F_(=q^V_!N~$~N>d6wnU5+vwWH8w9klMSs`XaPr5>*Z zP26bAMswEMtSwnPvvh zM&mIWht+X}IzAqAE=DClyIZQ=9*;g3trF{^IU3GrxTA0|N&@z(?noSrJRW&2Qguh* zV8ro=a}g@H`wxa64?h>Ka@YT$7q8MCii2LHO1B9IO~*~=Oe!J%+^$t2I2dv~ugRfs?Q0Q16m$0`4-Kj`wBw@jf=^-EIs@T;}(n)x@*j5vnXL>k!GYtlN}ST{06mBQB?)DkEmLz_K$l@@eM4RhRovvT%L z1(9XjceOUGw1&5QbyxF-)(rm?S6N|{UwKn=tgf=YY|d46H}6|l_|8jPzW4e0o(#J= z)n-dI+l6cHm+!vSnid)mkyKZgTRpI`)N$Xo8?$Pc*mGN}vi(vPgw-@<1cc|$uWr7v zG%}!M_1#TRoNd1E+>W|rt5pIuO!260ss0J2LTSLuu8FZ)jLnuH3L~W$E*U8qEm4Py zM~X*_)#0L%qR}FCxNxL!v``%`7%3PnP=_5Oj!}m?oIjF3ny(JqN9?0^b=Wpy8?~v! z))Bd9B&XY>7IippByTiN9nKxe9nDpTb4GGTbJXE%X^%@C&Kk)Y%~FRmN4Qs{aumeT zPiHtfCFJX>P^>aZN&2%vI2t51$&ON=%m}V9oYBhx%^4kzPz0|Avuoh0?yVNRRj92( zcj-N);@%RtOK^WNHWXtwH@u3ln-T?uTMEU_0&FfoMFDm>uqA(AzBpi)OTVtZ{hIPT zSAMr=p)LzWT>sA8nCYWZa-xBp~Hv_Bks{-rw&{xSSv6)$ypYe6Hq^^I-P`hN&9+;XC_x_|Ti9iDeQZ^h)*&vRs@)Rm+O5uDRh8J?G8HPvpodx2waHSHs$ z71l(BE#9=dSr_`=mlE^x5|i^Zxj=0nbb#Y&qf#brcTHR@1HaTXzE~>1W2LxIj0;7$ zP>7##r9U5!+3}1Ok6Ljjv7IfLW9hPpA`4P2fVPdvb>n;Uqy!Fk*z$4_l#AWDZ{?2X zsz|HBu(;(Lb ze@&=>8*}?P4i>vLwK=B=cDXj^`hQ%V+pSH(IFPc3;G)0$Ql|c*pZt#b;bA?#rNbjC z_6ZyWmjiY~Jf>i886GOa-h3R?%7{1;)aL5V9nKXSb57-m7m4GXeK1>`BiJW9m&}^X zwoLVS#<>hZoc^a%Uq}_s)Rt6XNyYhOs&(OT(yK}0JZ-Jetb(+K2m+^2&+l-!#L_90 zzVkb=w&@bKn5@Bh zpFE~U@_&TZ*`7~L{--~PIVA9Y1`-{!R?jdP3tq4O(+NdaMLAx~BejTd@; zaP74x@43U47PwcOA5S=NfLkOQk1W+cM;kTgkvXGt#7O;U zy%?z*trH`)qqSmW_ULRe;u>{{k($vOF-Q=L>d|U3QZ-s7PF3RZN}MUe5w6J;;`u@x zEyN>4Ju1NQf^!ApkpgUS;JD+QLu}5+>3kf|$E|jpB__BXLpB_@owEt*`=7I-S=(CE z;A1H#r6%DgNjQ;&$CJQSkLMDwBMJji_)ZjtqcA55uS8%^#G!~25o$*S-U!3lFk&(u z4HMkRCrsQ^HP}~!{nglCg^J33m11up9xA{d2lnJ+ubr#D*keU*#y;1Y43V9J)0&1B zaeu64ShStW653KsKuH3!5|9yJ950Fq=of<_Z4_jQmh)@c2^)%nGYYv;(sMj?%W$kkevKcmFfE|O$Nt;i^i{^*e76+yWx4g4>IZ9H$t zwOe7-vrEth{UxR9f$Hk&Ic0S*k;Vs(9Xm#luIPupvO8z+%X5xwLqudpCw>^0n-XI% zXJ==m6g6aestV>>qJkZ(YX7dCO3VC=|EJXkaW#H)@ZdqUTYTw@UzlHq7=-HToo$Q0 z?f6k}W?oicY0j*;=H{BP??yCV-;uX?-!JPbCgog~>W@+mP-^*giWRPjkYk^hF;li;tLf}aIPy(@NM+pWTHyS5;{n6)# zjobrKIW6Nphtvr;(vG7muxkZ&-iW3fu_Uxz~rari21Wb)_XR6Y7<#p|6Bi-QVFOG5ITX<=n^t1ClqzBVRnR^q|#oRq?-th#lRea0>N=hPJArhm5#|6GQyQW#2U z?y$6>RClWMol@}*#nejhvjUtfz|S3cJ0F}D@3kMci_;c7Wx+lR-c7~+)HA8VKLt;v zJfHGzib^Yo&zr$*d1_@muYpg|#LuaA9O8EcnwBGPxpTQ_T7ZfL$XkGp7OZJTPZOTh zL_1C;NxP9JrKS^H_B_h4(6V3x@-*EbOFW+BNG;(;QQsDoW@z?zh7?(EsJ%+psx$_c z#hATQP>rUiaC5l=$+7*Z4;s`@(eKQboMb6S9q;qfd^JCL;=-%ezK3&gE*o*9rX(U~ zn#o+r=DLk<;ZZ`L8KqP`R~xx~mug6)ecTu#_GK1_X_j$HvJAAqpeLo5)JUKjQhoX? zWMUzAU!Dp~3#3_@|B6Zo4~@w>J*Ta3PhE9OkaK9zvOOoi(Vm!MaJrp_ltg=De$ICP zoTdjNpZNtMi*JdK2np~HiHN_Y7?FwUUT(?E@#N>&D=O?cMdI`S7?Kti5E*wzXKB{8 zR~5zP)vj5So<080FUIA~Z%pqmjc8rAtTm#vKfQ5&Ufhc!Dn#3*@%)=7*t0kE+Voj* zVPSEz(ytB0b)smU9PfAre6}o2oD~R4hLlZ|iQg1Sl}dYITcNmE0DD1Ofw<^^-O=U{ z7xQ7yZ_5`K?dZ0n&5jB?>~_3uLz@j28|GVoVHI{O?8L^uU{T-9gPoB0!cM5P3%RPD zxM&xMipc}YsklU?`!Gy|;uoR#m3MYhg1seJrO97D zT#OyXXfH-BH~(yS(k7+;p0wcQJRHu$U3n5*fpRQ6a`CpN#QU2}oX?GAexs{F5!-K zG$nGg$O_!!<~|T&Ej@Bqpz|nDZ}RT<#y# zS;~+4xHitY^uWQrU!YQu_|pBWR(XDQ$<;K&jjUwm${cwv!*g*noMqIzW1 zqp%LCP7a6(4~&Px@T7w54&=1s#0uI+sTR4;(@v4YP4=>)vidT$t^|8%`?Uyj3Xonpb0_Jk6f9SV!8=c`irXmxEh# zur3EDvT>MS8j4H75q{05&EolF9HGK9k)UD^#h!>&2V-%2=zXDLeJIXqSVX5oaFj?y z!8poq(3v1{CJ_F$v&yeonCXbNT;HZ|NGMG&jI@R3`WkMpo`g2hB&DAC!3Q%$5^*is|Ga!ne}z~mx+6}b1Hfw)>RZ4b5vC2C`I zc2rbWG?(wAvd7<{1whIh_g+i;j@h=>>w5ijn!g(P>_yslym|9&P_9l046+v&E|&}c z@$p+X-Fg!iQvOExKl2qs5NG{`GQ%! zAkAx{CfS`VXq)4Avv895rWCTHJa+&t_~UJ^ju>e(#BCImXR9%|4dS96HF~#RT+~Tj z;c6Pq5xAhiL`S;(-VPdt0bNERZK!gwUtt z5{f?}9ezm}*@r?bv1ux)RBJ#d#}<JAuN;Qm&KR1zaCY z;}W*lKayr?<*K2PBV^qJp4U9D9v_V}`DIVBA)dxgE9Vv#RwM-&UTVi_bb7w#nfq`5rY2sRSD@3C@EPx#g<(X~ zZ!jr~5a)X4c^4`q{JW(F0i1T#;8Ch*RUxm+StSCh@M0Ant-`)CWE5ggA&62%h^jq~ z6ArQ8e#S0>o|8XT*_Q-yfKfhX)ZYL(`1xb&6BrGbc+2tjrBxTJ=FYEfXY6=w&Rr?-at zx$1TK=K8CGDilj;W;69dwUq$&ff{b6x8h{A$(Dx4Bsjt4wIQ#h_^$UO9om%N+f&N! zatgK5*SF~lRc<`6g3^kkxxyqB_>5e5nzA3MAz8-w>}h#>!IDyTeR6VB9F`U#2a&&J zXGRQtc6$b0CNY5iebeUT>MgVC#NW>A5&@nkJr8xI#E^xLh@hXGi-@>)+szrbE`cF9 zbN!+YA!_S<(3Td7YdVX}1|CT|l=n%<&D?*wB$A9#Gu*;{1&;6H%b-8+_&NDXt zWz+Hl#CvGB*}Q$FqD;|3jB=w~!3u25YjifYG_GsZztM;TjZZhe(5SXHz}bMH21|o@ zvjN|2c(Fk|+CYdjiM+hGMuIQDRRwb;p09+N-MuEG^>zhbuD}V2ScwNK5Lk-emEuh4 z8>Qk{DfX8ls2J}Rx`Xo98mu z({^I-N~n&X=HMrq6xmoNUe3U)RLe*MEg}*m=+U%eX`(O{Eh(S{YfB0aq&%JSLW=63 zHcK+Pl6NGF?MX-vDhd*2iEUsG$PW-2!gRV{k)Nww6dJK_3Fa*5S|AD*AZ-D{vg6P%FCuaorZUCNpy&FR^RG$No4YJE^V;2MH*dQ)JmUVV)&zR~(eqGe zO6=Faq5H-Y{{G*W6n|S#U)tSG1|U!uaNUA0K-AZbga}=Bwoa(=G!EK)znW?FYx?Q< zZ#-|TUVZ=P$rbl69)HHOcM{}v-@Y$-p8CoQ294}@b#{7wF@A4g(6R>vC>mptdvTbU zkZ10jtBOK#izo;|iE8@)hvzLNUGFdbBbbx)M!o;L=M4$ky$s&_cl{0}g!j_Ij9H~w zr7@*3#u#H(dgEP={resJ_Q~^Ip11Vt?{+-$ZF%wSM;v#{H&LEmn>R%$ia(7nq(r44 z4OwY?1z#Ulh_B;EFL6`jIS(x~o%Upg>i6Gw-+u8D{?5~N+xQ+L+4FS$ZTNeIYX(;{ zu3K~|+M06=Wfig%yHZNoxVe;$Tc+Hotfq|ICW>__nyGF!I$6Fkd4%sj!}mXV|9|>F z8Q*05lkd|7l{qTxUo0!Ew7*%A@3ec`E39R994dD>?c-l|T1yH^m|6O@Og##ny)-s!?v%+4U|E4p)!turOg7N}&OYU#hfLjQ^J5u!~;fT@_X*eq5GQHSTayF!e{3R_AzkrL7!08D#w3Dr@Dt4B`0~ zK2^>D8Z9VFBPr+LcPi7*3Af` zSNzrOK7WG}r0({)0~9~?0iQc`M)4p-g?)ABa5)!c4 z=T>L<>t?w1N@T$2d|?bqY{1|9+yP2xz!N@q=#21TGvcI4+o^X&O80^_T?75?eeDBl z%x#O!R`V+Nh5?@X%mZt>%&qP2f$sJV=AQNqs|VXxcbVO*q+h?Srl!u_yScA>^_l^5 zL4JO*xv6fkxwp@~wri#L>CUc=T|MsJ^<9jO4=q|eXSRLG{Q3pH7|aXm7c!EXn#F6n z`@Qd!|9xFu=6?68flcjwT~706_n>(t-`>~N+1)?T*WEEV&}Hr(Ft=~$v@?P0-JRX5 zHcOAe4V_)y1P^ret?!rbkg1TB;YFBt6T>0W7W?Oxfnp}))A z-f!-eKK*ODI?WxMwWk_nA{O})VQz3U^7esl_XelAtDCX*nKyRz_4C?XU~^2q$rqo+ z%w%P^56G1Fnccneu^c9MGYgO@n|yLQ<2~ISeeHeBL%(@Ci=F1~4O&XpxO=w9~;nL(CnU;BoE%`(;V<}9phWcb;&O|4CfuaOCFXj(jf&Z0%;hPH*~+2#ea7cOq9 zThcmvp?SfQg$vpi&9T*(7qMtQT**obTJP@bGIw?jw0HMNim9o&h85b+wDokF*R*f! zV#TiP>fXqdwVPLxoF+^2L)2T3d&6oiqfCyEfSl&;Rpt%u0gHK4UpEP5z^x_q4^^kd z+_Yh(&0;Qgm>XCs>v~w|iw0QtjG&==71^Po$L;R3m}}kr1MUqL^Ss&S`~rs~-|8sL zcbLsf7R{E0wz0dPm9u7Gptr(q-?V9yZS{sho4aqdon$6Stl!?Vy0^!+W?+5K!mibW zJ?(v$FUujqR_#5E0nVrO9o~`_? zVn?xozFt=!|7D0S{SvUhjVXCr?-S}g17@}|xErbT>qjxw8F-4bQK zQqR1Z8E!faX8P1C3wsJ>QbEa+f2Vf{;%}q zUHW%wF%4)r>)_o1?dfhU{j!8QnJzc)nw9nZm!VfN9y9-C=?-cky0rU~B`jm;V`!N^ zZ$2jP%w_(T(6^N#`gwSto6G+Vn!BAPBy&5cbkNn!bjq;uUxtw3%}lwBw|6Q`zgDlE z^y|>lHTkXvromehi?mcsmxNhqppQ4@l5)CvwLvSNE-hD*PGo*%jrH+u-uq_4*4h*Y z{V&hc<>|9%_vO>sOsOm(Z<$LUNkNlu%i*;wU0ITn0=;GS{&#w5@A4X#<kfkU~$(ufJJ#J#i9r*hM^KEw}M0GoO((CDXTGD#|Bpv-ZXjZmHk^&?LNvf3fC0nm{t<)#m7+KHPFofh# zN!8NTqm_%SD@l!J?P6J9#r8qZzCR6rNxl_j0#F$sImZZB_<3t&Yq?L6V4N1yc#5Z{P z-kX93Elu*Rk{)DEWDUp|YU%1{XqkF>Jx`;Pd~&&iM?QNIhf>IY$?;~=$s+B(w;ne# zR@p8{s+N7h0877u?WCPKmWPd{wSl!~)84k4{*uP0Td{u4XSGKAHZ6wr46%^qB>N%R z9`y0OHm!e=X`Ae6uGH(vK5sFf^m3B7CE*BO&iVM6xSo+*;e#{|@�mj&+KjGXtaI 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 c-C><>%*<1Y7Jw2*5Sl-ih#ib*{qUjx0R From 82e834b83c51ba38162670fb9a471697dc1e72fa Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:02 +0100 Subject: [PATCH 0833/1620] New translations Phetsarath_OT.ttf (English) --- .../earth/app/view/Messages_en.properties | Bin 12527 -> 92828 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 353fe0d367757f5de056f611de0fb9ff72304600..2ec713dbece406fb6e9a2c32099d4dbb4ef54db8 100644 GIT binary patch literal 92828 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�mj&+KjGXtaI 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 c-C><>%*<1Y7Jw2*5Sl-ih#ib*{qUjx0R From a966cc6d5b7d3d6e1b5a9b843cd43e40d907ab1c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:04 +0100 Subject: [PATCH 0834/1620] New translations arhangai.ttf (French) --- .../earth/app/view/Messages_fr.properties | Bin 92828 -> 70708 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 2ec713dbece406fb6e9a2c32099d4dbb4ef54db8..aefdf309744a0187d10430151fd9f27cdefc40a9 100644 GIT binary patch literal 70708 zcmeFa34B~hbuV0XyVd)??|r+kdSA4(q}F2XvMhPGB-`?MMz$=;wg$=aNcQYA49tXO zhGmAGKnMgvAZ!Bz#N!y4E${U_f%g7OiR?>dbWx*uwv!*A5jnoqBuyZ1Gj?q5QEuR;eVR@N5gmoIg_n{nft zP_pGH$+v@^3x6zI65i zV+FLA>eDjf4G+Hk+i&{#lgI4ae#C+rYBzf@^`_%=y!g={u+497%37c1HvBX)iO%AK z`=tMS^AIy?&*J(&YJGx|dQC0hqBGpZ7Fd&dLVTNWALIW`Ehx?NC+VtmNqQV-UZWoQ z->`P}V=C9A!C48dWD@1BefA%jnr1^xP9#MeVrbjf#YGJ>puB_e%}qvkg!sU zzn*t6gZ9()yp!p*pRMOzIRE=-Bi8~eY*G8i^*m>ernY)sVz#E?dS1htoA%Z7z;V+? zJ>SHVO^?>|I-LLYdS1^anm$#}o7g9tuGaHb{i}2zujd`iVe6^qoy=yNtmj=ge|U85 z?0xIYr%s=fvkN(Sx;!$!xIVv9l-qiGddl+f%8D$mZpiCP8%yhVFD;gb*H6!%IW@mL zwRGzI%KZBHzP&TMhes-{y)!f0XZP=$nrRd`w6wmlymm%zE4TFtdW{Q>qrAK!&&%i5 z=NFe&=ht5%ubsTsfNQnLr4q{QSvzxTZDo1>jC^wK%sHzmJDL*|OYN<#?Xo;Qe`aO* zl&rR0&TgC#oyf`C)XdPr>E$!0PAzYg7uHq>W=^A8A|sz&Upuuvze>$GxxTa{Z>*g> zchCI#QlEU^+Ie{awXH8LE^nM$Up{gE+>*R}PM$xr*s`{6HLb2KE}y)Q&YVB9xU?>x zJG~^ITUuY;pgz!#9eWSTJC@EYftT|B^Cwo87v$Z`3rlAm4JilT!E#14YBnlVhvuOG9hL9Cl0hXLOhnAgNlb6pdtejs& z*KTFm8F}7n+7Gj{v9P{;_8c{0|Jb;Ea(RV{qd5y}XEwk)!I61+ac$xJ>JoU~xOQ%S z`OF4*b}yufnocaq;Ply*`TI~aXq{bO7L7Q+0m)sjzX*w(nqOaBS=wl@+G;{gi_6q) zoLZN`YL(4r&#v4jZeGLvAm3=g^0|$rm6K(w$!hwkP`EDfMKD0zdwT6`y;qR@2qHSO6xH9CPChDRoMPtF{nPK-~^?A<;+EsyV;l85E}!&5VpqX%~nPs#fa zPVL_}y&ck=24Lz)vzmSe)J}rb>e@OwzXX1-Y=}-D0k${Ltd&Li^!(jR;ON5AG87x& zSb#D3IS8I#ff|ZVL1s5YqEB8vDW6$8SCsErUxv0osMNfl1#Iwb^2|cHD0lYAGfQC0 zlDvOqeqpI7PoJmTE0xxwJOX^JohizDhUM1wwzjrXTcx!sADkX;Sdh96YW!rQY>k~| z_px=h%ucb>FxxWAVra_YIL*pzgw3->T%Ct;FXCJq>k)rtQ+l_J~tioC`?9AYAJDX+uacv6u zn<*R;^fy3j4OFRBWu!ilQ`>j*9XJ1$aWA!Y9_bufLA_jJtD;3O!MQbd65ls-;MTs# ztb{+6&K}X4Q}|v1b?UDSD%8Sr%*ssQ>!{#sgNG#ywypSUM>(pC?w~tQ;n!BalSDSy z3DHJX5+t2%H=G%Q%ueH8;_)fbw=&MGp+^JYA6=o|Hd-S?=Igk6O7wgcR~pyX!G$IK z-oVw9X!kvWBTIs}_u<@mTwAF3jmj>HJBfqKXwP}vL3c0XNIW@%>n*rzUG#qyIVyh= zcx#k7FUk;FNDimP-9%#@EvFW%a%f!H0i+zn*&QfxMwB94%D~Ba)K0uxz^~onNF@k| z)Q$~N|JiG$HbhN}xOPIcr9poj^{V}!7Bye*zYLsG@2N-gXsL=kLfjJa>iyIQ!u&ew zYao+kyR{F5gB#mNT16ZpDHCNGEuxy}4C!X0E|NKMlz2y)qjKry8c8onGaK060EH!R zh48o{xUj_T#qXspl&J+&ig->qxZZjd6)H*y#UyW%(;B`BYYU)x9_NV5#DfNkRLuW0 zl#x!%i+1b>l?~jr0V;$Z>S==$``H-yO?X{K4GrolcL>!aS*nZfZt#~hc@ftZ(4tk` zL+w>twe`MpsGV9)_fdcD#W%@B?b8WSmx}4Lg3I^e4E0%+5NQqF-QdJ|(GJqNpVoik zE8&T(-a4pIPl&sX7OSYC+SNW$y$xxrr3eEms<)!~EO@m79H`n(HIqCV7`~MUM3ppQ z1^g_F-cp@2{~>u%JARsu6HloA>-C;SD+opE8I|X%9k>T2)saHwFL7-NZJ`mMDB7c1 z4w)ThlW5ljto}h93CDZc5gZRAH-$g?J%cl(cSM!?Ou9mnUJ|;uwMEOo0dZ;>*QmX! zEh7s`5+pq$%_Lsz!DurD>pW4ffkvW9=qa^^>Q|*dE`IMt*=hWdMWE4%T1gg&S~!Ce zqi8#gWprgf@>60Io5o$LZcd{$4KC49wQ1Cf|D07LTTb{Ot4b&%IW3`Igzpt__`0Nz zpaj`%vU-$T5!|2=nXHwHQL+fj^%0vil&rk!8Qh50MtlF?Y%p0H(o@omhNP&EB(a}w zB}le3M##8(4dqFT?m-Vp+A80+qWwQ>u~ocHg7yM9M6^5M&&ZG*jsAods$)Nn^C+<- zN=$=ijoK^1L!tXd&^od})JyukN8o@)^EUBU!Z&#{Ra`p=ybR;-=lMZ5UllWQgapLV zLo-lJ&_hVN#&jJ=iaInR527HxP)_rq4}atn&wTP}ZIe!KFq+I3tIh6ky4)VG&mRbe z!XJ-BV{t?Yl;%`Alg;G|#ZtMYwXMC<(b-k)?&%^?)*XXF%!lXUcxl1XJ1Cy5B}zFeBf8v zuQPTB{Q^iBTf67Xz31~(h|}#64UaX`0iygVjv-wVS|WzJj~wD zKEyu8F0jwCKV@HI|H{70uCPrl*P65kw1>5~X+Ng@EA6-Cpd6JyEPphSL@b1XLKgQ9 zvv;%KU>{|lV$ZVAvCHglaqsuoRorXTI<$whN3WQdQtB<(ijqb zs4r7UD@b=D{p^nhJ^V2H2>S$khJBJf%_w4V8)7iGgKu+a{ikvNOW1FL2hXyL>>=>v zrR)**GWK%z+w4*H7&!C__DXh%eFi-G9D9x!&Rv{7W8#~>s@3XlKDN95yK!t>?rUV~ z$0V=f7V)FNdGhAVbbA^}kg14bTe9Le@8i37qelF|-MA_WsF#qZt2dlNb?F#NiL=#e zGQB$;!Ogdjr8}wA7jE?GpZz%JuRC&qZ~oE+ zHWqyr(LT+wxzYv3i?Y0ZdF*L^96zKYPUI8FX^Qgr)0))y)U0wueq4Tha`AC_98<@| zr?n|@#D%5DkF>~7v+3Doe9z1#o*p_9zLs4&a-O~%@c?41>u5LHi(@Ch$h!IWknd)BDaTUM5!}4;+{4Y@F<;^Sno2cXa zOwa!u^?#48@vpJVI6fu#=wnk-kyVibND*m)`J_=cBrTzjY48R8;(x*hM4tLE23~xJ zWpVHGXjcLED0H3Z3m(1`JRm+|fRp|n{RSU3ufcuq0AId}bCfoaKFh3vhv2Q?-4}2q z-cz4e4b`+v+1YD2jGVHVKbhU3FXA3`FYEwElGjJ|#xJUEK_z&Gi$sIQ61 z(lpK?@o(eU0=h5Y*oQdGJYstI4mhl4b}zo^z7*{3+`EJM@WUiGFD;I6?;6v&^P>j_v=2c}p1m8T^${e}l)=ziT{hwCTm*HTCO1 z%kKssz;_{6;Ee;X?3Y{I{c#?icx8;hKe+yq$D*-M%=5@G-;Z&I<5F1 zD`@ETTHHajwOW-NNa=MtgAQL!pk^={@q@~0>5Izh@r~jJoY3p(mtK-I8V!CnNd}!! zr!^T2xJ7RwGA83KWL3I4qfw7qOt+9mP1kAbM1Q!!(4-Yr=}czg30R_|UJ?t`k46Iy zz)PgY>-8Emi^vPUph-H>ZEyocbQ+yb@B{^QU@dw<9Ri1Nfj+1VcMyMZj(Vsw5?MV6 z5_OZ#U^eTGxLFUL5T8(1d=tNPO<))Z8dRPjCmHo7eUsT}08xWU51yD!H@2^}E~)M`NIb&w2x;uo3( z(UaimH29z=RB6yeoYp~<#CLr3>Sdh~JORGYOq>&pB_Zn#^o=H%^hRnr36u)q07g^O zP~1ce6d*E665$f(H732;&}1(I4KJ8gfN7U4wQ%|)MyhF2a+S6n5mOilL@yN zEhHhUb3l;DoABuhpj4GeAjaAjy;D=%Y7iwcr4; z#E4pr8kDtwyonlUu%HBR00jaUzy|}N3Ou3H;824n265S7Fqw2_00LA2b`UTbEJo2( zBauS~O;(#xAca7PGhmB}dI=PRK>|d2v&s`RS!2QdI-42iaVL_&X1$p#HJ$iuMKKh@ zuNz64WJ@sn2k0fYX(80ZZlf!4ij-41yC9F zPhbeeiO(nlL|8N$5(D^vifksm-D1TpW;-Ngbl7huYf|Z&><)_sg>E5DP1!;lRcbX> zu+9Qb8jKDX@dU_%>Vh$i4@M(!z-Y3VEhcnIi?TM5w^+~@lg$KmAY;=+k|v&z6$ejn z8s`W{gc*|-7r{e7+iEfjj2SSkH(E?~Gd0y_wg{e>EDom`Y(iPV6BR?aS8o6S3}`F( zWQF2Da%i&FhWiZ;n-$HlI3OXD%W*SV!4vS=;Y2Bm;}+7WX)A5irPbJM1Yk(dkvzyRR8;#>l1URkT z?64S|HXHQ9>V$;M9_P(uAxWZZcDYf?>b!+CMy>0#O*ZO;#tt}HNe4`BpUK3aL`E~r zD4GoFBI$JCfXRZIE$CDemRr#Z{Ime_PV|T@i4mg~v;ZTX7GVts-3ogJ)d1h|F*gZH z7Q4-8Cwvho5d1OOERdefVx@2N%Vn{9JZQHS#0*3p<$xhlQ= zRR>ytg41DgLiuqM&ebNwRhU{AMSO z<9ak272$r9*XeRvt#+@~;fxvVCK1&p=^ z!WIhyBF#3KToVLW|LFA&o5PBLp3`n~Idv9?)$4NEU3Q1fY4h44dXv!%ZrH4Lo55~t z(phyL+-b+SXA?MrZrJozwAyBOyUcFz(q@CW>|m_R?z4lIlez`)dF`%1(BZK=Knx9l zT+sy=h@rU4VuP%4&gy}ag%J=C)p>0`hdJQ!cYKbClC}#?4##XZ26eYOU`EXVBnb}(gTduMyWMWL)9!KWZ7v&H;q#!XbD@HB+!S3sHHeG;jgKpZbz!7~M2B6I8aQZwJufP}}fS9S>;|#h%%N=lg+yGy| z;R#1vekb^C2PEBAl(mCJ4j3>mcxU=@6DD2xU(a=L&c;IfAOe!tV{4m<2#XDoCx zS*J?Z8IJh;D0B~;o3TAeVt7N?VBM_)#x8-!h6uh-@9 zdJO=2$m?_ayl$t*8FIM*H#58nhtq+gE~j2^*9YlF435B&iZ!PJOmaD0exEhqa@w5e ztIg&1I=rrs2V^}U==D0CL6@BOscr z54yr0TQm>|xLw|;)8Tg|A~%zDt8`t_SRm;3MsFc~18s*Nk~8Rn0hi71@S(|avje-h zV5!^~Vy%FM+l4>3%VhGp(QcpL?{NkE1^_)02zUbMi_aZ}d|@bT4ilAincObD-l-4c zHa7-GmmN^1KR1}=^0+;rfIS32fT-Ppz`8TwiF!fS7x4%DewRD!2_%xfh{xyhIBjm1 z57>0La31RA2-@9_aK!C*I78&TnXG8CKH`b`>~bg^@_2l4w=?Kzj@?Ywqtf*xk|7X| z-$I(2a-DV%Ff;1IA-5yw3b8(S-`!o^a3}_P8C;JG%pG4X%JE z<_iS8{-{3)S%bsDMA9Ge`dwa^&ExhvF<7{8UbNfc0se8$6&5_PL0=3JPt5N~gd<_E zHz2!RK~E}vGg+@n*PBR&BPetW=^JSWAx)z`681Pkt{|G6%DdeRTI%${Jtlq|(7S%%R_d28295$Rdn}c$}^% zP#KT=!fsCtuB^r40N{+WFBx>DXps$`FOs*>s2nK>dh%aEZMuHK4C=!c>0`ZvH7xAUya#)T;0?}YP z6bwT7-CnCd2w7W$0iep%Om{lGR=~jHrN5vB$`J~LlCnD)40wY9zuOy%MEvnkIuehE zqN$i1gTALj@nR|39FF=!epe_E^#y}oKUfs-d%Q_c(A%5}#(cgc+%}sPjrN*Sp>))f zQxqi}j^%^?M5r})Gug08H(V?wn^EW%(!s5?{RzO2x%jD2Id1k&e>MWTPtGXt^bwL7`hn z-$=VT7z$aN{3Qq5KXy_8DJ z>0~0R#7gm4%lhJQ~lY{n=PF7z0Ft z@q`ji#Y@RlDz228)6LD%XepkmbS4XO62yG5s1gErA}KT^>7HN*QW^+m|rNq;6Ya$^-`2%4m(4UAq z6LE_rVr{{_2~XG=4`xDPz$Yx*V=-J#6m!91A|96Gv0ymaoQh@>ZOxfXGToZaWzuoE zC6TRmr&^M!SR(3A#M2R34#l!)1&Zf^%2HX*M50AFye_9d9S&Q|iMCXzt5hl}$#kb2 z%P0CfZYHa!bd%NYVhal0LR#KR8@d&b+byM1BAk!q(B$5cXp})q!wQC>K(hWxBwenI zl98LS{@k1>hUqETzR(wU9)wzamUQu$s*E;WyI-%K{8(oOaCx3r_s zEu@vLwB-^kgu~X_szggN*5Z`W-N__N27>V{Ol~Ao|70^>Zz)?!<;$(DxpaH0ODQSa z+AD=hxtM9mZp-DeQ2toLo64rLX>T@dw=0g`bS9e(CcWu+s|<9=iL5)7O64-Su1dTs zmq}#Psdyq^DmS;~`b%wX`Ic?1mDbiwW?QapY`olCD5rAG(QLXUnaw6rZRtz~#XIF} zvb!hSnryDx?HCRtEy<*#H`ia5N4vYb3x(FvY^o!-d-!Iu1(j}LY`ofwLbs64Zl#^- zXilfy_MU1k(UGd4$-54w(+r4IN-(){u~5VZUj@Ivz0{s-sdRRg3*DWbOnY{;yQj6M z(pKmwjh0Krh#X0z{JB!DR0xy`PG`nBj13K?NIFnZx|&l;syS8i=5zUSp}eg}=`R&i zr9xgwwX|1q)$&+-wc64-+S$|DStyQ{yLaua47FBr<*ZyTbf!y?MYT{YkI?Hn$TRhoAW3=XumcI_GMd|JBFLsmy!7gB z9=-0(BZJW>kHrQ?cI-^0F5JJeavJ;E@89_IjdRP`M8VkzevAaT$%k(Rdjx zGN3gQTGLc-a1$;t6wu*lx=d0+brrATRXUaSuMT__|M<)48yitLyK{4e{V_H&Sy}ud zeqtvO>LA(-Nk{Z`b!k^CUWz+nzfV^`SMFTkfnb~0ZfjqCO)(a?R5cjZ<3w>E`#XM^ zcY!B%>?pZTvbC++negu8hQB*_P}GddsAdfd69d(nHIAF^p~m02u)0cju+1I(eL#-} z98sk}DD+|{245Piz2jNU`72Lgk(QM=zas^tFX9=b1pDd*mP7{>q@?JP+9B;_l|cp^ z6`Z%faDn+>5IFP$hkgKE;Lr~o`hi0~aOejP{lK9gIP?RDe&Em#9QuJnKXB*=4*dd$ z#QN9^Lf>N0w;1#-27QY`-(t|W81yX$eTzZgV$io3^eqN`i$ULF4SkD2-(sY17n!@x z95;Bv!k`GDM?yKe_fS!Km32aF4JD^>ICMMq)<$*tc{MoV(rY>=;+v)J?T^` zy=V9CblQ8{k&9SJ)I9si+m3$rbGO~LYv;~4y>ZvhH@xMo6L`K2yMGveDfnz+%0)b+ zh0QC#guzkAnhsdoDphx91(jASPR02$?@()tVPsCSwJFK&t7DQ4CHo)}KctakAGyHt zkV63}0e%xm8S;5>%ZI!Vc?m}eM<33SjI>l1d5bC=3uI$y$i@QMSU}bS*;pVO3uI$~ zY%GwC1+uX~HWtXn0@+v~8;g()QTC#CItDL;yM!$2AOm-!u$h#Pg1aei0-Qz9@Yf0Z zrX=;cC|8KxI7R#>b)Y}VTTAB)Z@VoV;_39zXeM*}z~IKp;2=*V-nAo;HKB%Ro{jd%Af>~60tmJ}t8R^)(NJ2=(BjTc!2jiIJQ(5y0~K>4z2 zDGlHPp3YMdY5*4u;DP~MFn|jNaKQjB7{CPsxL^Pm4B&zRTrhwO25{jb0BK-ln63*f z4Gz0h?z%wN)u8JFT^H!OK-UGjF3@#>t_yTspz8u%7wEb`*9E#R!QBYB8oEpjyujj@ zFS0y(q1IEznXVVW?q|P*)iKi-{bp%i56hOhk8@&l^0Hd<5e>Q_$%&&H=&1?kf_KADG))+?fSiadkTeIZlaLM z+GpGN{k1=g$eDE8e1HGY@cpOz2cGF4D&%MP6pJobkl(fMPa{?f9~xf08&5j6gX5*T z6_4R@nSZD8I3OBByR8F9)88*7A(HNwUkVPlQ3u}0WfBW$b@Hr5Cm zYlMw8Hf*dBHWm-!!gB~fEOAu}($Io*LkrT-f;6-s4J}AR3)0YnG_)WMEl5KP($Io5 zv>**FNJ9(KLJM4=)qsWkqzx4dz02GB_=D$O3;X}F zxzn{b@83O~%kp$)d`B)XCA<9okkg?|l8aiSOfw3Mj()R;}{Qy8e3iJbo{Xk(qP}mO? z_5+3eKw&>n*bfx;1BLw!6!rs!{b&p+VvO~Rc51#dD{7$0AV7k<}R>y5Ev%^Q26dDwn%&RTeMjC7FD6_ z0)!NjLzI`sdjU(~WK`OJt0f%n?VY=$uQwbi_bSP4{Tt`DZ5#VQPckvm+lLuuqIU?u zUNuy9VO1iX`>MVzpn+ z=SKR|>D~P!`P>$}AhQ;3zX-Xh1}ledhR|v1a!9ocIY=Z2iR2)W93+y1L~@Ww4id>h zA~{GT2Z`h$ksKtFYe*yqiJ&Ujg&df~!EJK+L&%#|8<7Bh5)J$$fS&})CxD*>@RI<3 z62MOa_(=di3E(FI{3L*%1n`p(n6%(X234ioMv~OmhkQM{;s<1@D}Lllb+4p^2I!G! z9HG1!M>Bw8!SxbIT^lWhL#DtrAxkX0L)c~U1Ik|)q!?AJ2lc7uR!N#F7PQ)Eq1b(A zU*E%bJ@Vjd9=g4=i?8rPVQe&$&A?zxy{#n_936cy<#LaVoZNWDZ~o5jf4W@aZ{A-n zmCMtkrSdF!-n19}kFi5igT7R^diCnSM$)EIUgx9~Yz+b<* zTDyz9f6%6xilFWMd9)jYtcm6>w_2=R@YaMmPRVB{HWT;|ez%^BmrQyYx&f8_(U zZ%`9z-#`mGLF8X0dMiSi9mco>B)1}I$OA`efjo$3O*p5;Z<;>R{F3D4#nDUWkuQgEH61l9o#vlyyqaA-ITUe5~)&m8XTKDW@<=k;x?IGvM{ z!5q0;*OXKS#+nnWtNhz~{Zh4;x3nItWHRlANH{J@UYj)<&O{%^LS;)Lk!~KxV=dC= z6@0B@gwkWo3}2HFnhz;mchaC4dIj@DC6lUX-aE3yjf>p4G*bKi5AXlfr=&|)$3C@> z9|4CjF_rECH77>v4Cmx&sD7RcAl23ltyUeE0X007V^_6wp)}G!@WPKvMxt1vC}VR6tV!O$9U+ z&{RNE0Zj!o70|rEtQeQ*MHpC#hHW8FBnl~7am0Lw=tT zdAEx0gc>?gookqogxh<~-_WR8nr$BBmF3fkWczR~_wa+YznuHbaC0+HDnrlxx0y^j zl|Ce0;&anI`GP@XE);jqpO9AnIuh>cj6`Z*`B6MJ*ei?30eO7CCcJ{xi|D&L?+mK8 zJP2DJge?!kmIqs@+%=CL-wPS~6&T#V3THm&z zq1EYX^;>ssALqx8eek2pr}@C(+Rm9hd!Kq}-~P5X(tkqKdx0nu+W%&lb7)fl$q#un z=D*~7Hjy^sXs&DEi!~!dudQ`PT7|^Tb&0Exu+#XTsK*Wp-0iHiH)dD|IseV614oZu z{My{3lJw}y`v*3pOLKGYes+3BTD|)Bk3I3&_U$kST=Z}nJv5V5)L)%H1I|DNG%wWs*IYZCuK?IrxFeLvVIUD{W#rGQ$D42rF-3$k7d zs>4ZreR4#j=grg+n-H`oYri$e|DyIP{_1_T&l6#kB-DKfs4KA#!Lx#F$U>4sUW6vW z%(J4 zG{L0?QuKznM`Jx%9Ru=uBrzV78%5D$4U!%*YpR>qCTO7>LaI0uNQ(2BxjB9u3G$LI z)n4GuSI0O-rl3vi8Pu#{{;h)%>^=pOBoUK#DhKE0$fl#bfAc&1Ih6OXsydQUjLC~u zHFS?!N|7K7jz*fdlgH3hw~^GUdi()QM8oQH+fM%+k46UuLm@ub)^^vOU0vTgkxpkb z$N86PT~7=Qbak!Px%8`oOQo$*G@%!SSg;0(I6`%bH%O^AmsgBj(dfNk$20u4m!kXC zhc?fG8}s~V?d!Ege#h!}L06T7AGs!q-6A$Gz|urEum5T1b{H2B8s!BX!u*dDM@p${pwd=J11$rA?*%d z{ZlmjIcW%C#kTO(PuBbYdi21^fI}0iG$WbNgRM9;<2PZjiKI)oqqY&(4GkWNHj$!h zkgMa66AYi3JI&9{ostSyzl^HCjN=%3LH6PcuorfWrC)*ugH!@ZMm-HwQN)t!B#Z7) zEse+R}d2gWZ4#xDoPF9*gi2gWZ4#xDoPF9*gi2gWZ4#xF->{BmIYa$x)dMNkW< z^N(NH_kh*$)T28dSQ;(-9m0y1^iV_=)bJ+FAFB01u;IRyZa@0gw;#QYA3pr6?>TgM zabV!g>EYqNZ5tbX+xXlk=8wi;D{%erj^(jva4#`GEub_cunuV~~~=7Vg(C zurPQQK?-l-8-+p|BcToaqX`cAqdv9QK6ppIhIiz{sP2PzZ)M9`rH0m`c*qwr-haVl`9q7IHQ z1ggUmJv%t?$hstbdT#E+lC&?K=9%mP_&Keur_Y_PeOp?s{d-awABx4O@1@O83(UCj z;5SwzO6WI@G!FDJsP-+0zLA?ERvoZO0)IKA9;8X6BS_0g_aVI+>Fr1#M0ytK3rOVo zHPBZ=^VL8S#o0w{B7yEFfW8FKmjL<_KwkprO8|Wdpf3URC4jyJ(3b%EXo`wJ$(ND& z2PAk;WL+=fxoLIwk^$!|@TUkfWcV{kDU3=fzdmE*@SYk=5*Ujze)#@^Y1cd|F(_rE z#eE&q%I)p%|G+2S`PSQy@?h|D`((QvKGf>j{{DgfRn8M~+_QJ!aN8Xo5C4<*edzh) z$DcX2ef;#1Y-h*L*X+jUHBau`i5jDb3+Ckc85B{(Xm8bZz;xOMxJ6kh^9jl7)cuwF$#=}Ke0-S z06>8UIed2^1r^L)8-2ZrL>IO!;Xxdob-~`Gv;k*k?t`gQsmsOmb!6$QrPiF9m zrjcgw$qYW3!6!5LWCowi;FB4AGJ{WM@W~85nFXJ^0Jg@=)C~@ig%9IM7KO(4w2JvO zFpu2<`0GL%M>>Rb66tQFS0KFw>HSEbM*2Kb9rI~mo&vzIk$TMEiPz*)2J2DspzsPr zAdEOjW|98Xbs-U;ZG>#a(s*48WJybNm9As^TFP;G@1K=R6Fcrdvt!&ar!N*KCyS*- zV)dQf)zPunJuxx)HLZ4}SWYGfTB1=`sgQ%`cD%Erqw_?+j6FV`E!b=sZ*4ug(A_=I z51w0r{B|H;&oWzGDqx1z>gbIS)CUQyp@m&7(BW3F6stIu?|oBBePa$G+I?^dP;LU! zI}1tyHVVrGeuj{OxT#@V8lD}+!pM4A8_1;fa6>&5M+23*^6ad$i6#{oQDF^4L~3HL zP(Y;b_|zQVvE!GX7~2jf@0dojQRzIh!QWGxe*5k*igyP{Dv6`uS2sUMyF(W!aqC_IEq=ndVic{#Ecpz-?HPksqeA)iF}NH>iC z)Qg5Ez=3DjnWI;&n! zW3Rwg|L!9Cf_H@qPlKc7ZpF+MH=5t}vGd>h(R~*#-1nnzo#!9q?%HqGewiz^zu_nO zp*kn#LEUiU{D-=rdS~@Isb}O_U-u_b3q~&|q8}~4d$x9Uu6E@tzn72IPLp5F--ecl z(DEv18xcX-I=LcSqb@krXK5Uhs7{_}#oX*p{+n07!QWAPK)ST+>eu!ilITHN#OQYL zeozufykSlM`tF3AW@lIeqh+u=zx2QZUy?2jT-6T{FK<}srzr)k^fyrm=Y3e|AH-5W zN_C=?p-~%osVdCThwIKT)uxVFq7U%uIw^hWOZVR|UApqbfb{Rw?r#3~oRFg8Or1-p zIMYIZn2?sc;#V?y<>}k*9Y1z#T)OnvANyFnrQh3p0BF2Y%aI11x73Y$0zn>Y%aI0~CM3Y$0z zn>Y%aI0~CM3Y$0zn>gCAiKDQIqpD5Zfj|>6dIxNxo^^=49yZZkkN=5if>+RfQxV~6kWwNHD0L3Tb`Kd=sI({y%o)IZbO(%1Xg zWGEKz+!2rcP{PB3cP#k*;c#&~=BXz&n(=aLsfcyl?`SkBgK*LDs>^pibk$UMcgRVk z8DnErfb#CkVpS=Mu`Svd+oCX8QH*U-h%<_@EsC)%im@$dzOoVmYeK+L2sjD>Mw=(`Vn_o44J@esbW z4}GWUi%L5N+A(M+4ar!ACksbxR)e0j;_j^b8&2?pCdHjwqdm0$#NX7InZf;_i~P4{ zr!@XTvG>fj{{H@#^k=i7+81-VT@%?X&*pY*$D%L7BI6~Wf7h;uUNttxy}rV4pYE#m z_AJiz_HbCL26t%bF~?qceZLNk^)gb!4{)H>4GqX6Ptzs}XV7^U@^tjz=)pO12WZC) z*(&nSvLyL%UGiZe`DTG_3-a_%aKbrFr)g>!yj(}awKZ>aoKTPuohJ`0m8kdM>*1fC zu~)l~-}88X|HEhc`t-bZU$L-LlG@W5jCOfVDm}O_lX>HwQt9zmymZ&j!J*gTdGMw~ zot@#xe?M5r^S0J8n0w(-@pkDsc-q)?p}~MnO`;VMEfV#Wjx;-^bF?x`#~7_R5nQfM zH^|nj-WS1%L`}gJ%Ik5o8ulB-Jo= zl=Jqr*||A6vEA&(!&!PmI)L32R|aY${IdhwC21gr7a&P|fII97ji#UUpk;FqYw!-N zGj_0Fzleo+bupj~LWtF2NbAlv-0tzc`Fu~a%f++Vz13cyfA{W(UpY4F4;030&Qq0+X61c7-OI;hNgZ}R=J})no7Hc2n)jI~-T4yDx_8pQny*un(!vD}y zRX5u?iq%q^bkrtwFKJ_KR*W`^6YG29v$M1ON=+*rzx{U5-2Cq5D0>fR+Oc+o$p6hW z$x9)cE}}^>H!=_82|MfkB)f)@tS-q6?JMo1dM0OiG`0;-YT5>DR@8X)%X?)Rn}_?35#4yFw1TYBb5tV9i1Gy&JWWA8Z0AiKl7~wN@*7cRj-T?(Z)@|H8>< z4xw+R@Bd!yc`hCN2nefnuy+fd{k&N7#4H#uV$DEh)sH%^c zj0SH~OE7*1GOurBKG(<`Yh>g`=DQ+8RunhL7$?P@#~PW}H!`1VWS(nezAG{m97r%c zO@`or2dznfQ)JC)Wsqbq7#Y-E$1S}h_ z2;fO}m^PjQo=%z;Q^1Fi%H5@6TQ!}wh05jL>1>A2@<5<%U}6>v?>*@ZguGpsM>IVe ztzb>Cqw`qp0w39_C{ud?;4kvw9jRu(db0M#hSvQEeD>2EmDbW|o=RqNE5B*ZN^5Bp zpQavq8`|a*n&zx)n&`=v4s307yj<#-hEq8kj&$rurP0V8CBMI=^%!Z_Q8~`r+K#H) zMV?X&EwaOKA|g!wI59B3rA;)P{r@&1Tx~>z>+2skMuc^R!NCXa9~v4RJ@>%i;2rt= z#7;aqQJ9#R*}Q-EuHC!udt`Fw?%fZp;7yTT%P;BZI1Npl*xVuI!7;qMiM@BL?I5J8 zJHaTbLy}VmMH+>=J`c#iQ29KLINsFjy3=T87Eiri9F?ifDc-%2~+%b6EF?ifD zc-%2~+%b6EF?igx)fy;49m4zQd&hSZd#>){JRb~B?0EF#U+L+6Yb6@R9A9y{Y^j9YGoDUoGP??a0MDls7asDI6TQ2N zMJ%Ear>)?0QF;@+aO?*`&`dOtJa4iKv`$2M8kXp2!jaaBX!b$Z$!DcwlyE?sn8?q% z^*I^B2A=j1L!%DGV`6lJ8$xlZYqQO2BZ>j<+o@QO&aSLjtPwNbhv7pkwh|5<Lb%s8tbR^`61**ZNyr&I#U)QYG;N2XjTfhwzf@S z$8{ipx2BGz)3XyTK0hxP5sBpoYG2T3_9&@R`2_c(#S}Z`e~lLZyvS=+jl6#6$zzvJ zUOG0*-&fP(4mE1~=g7S{ao5v#&b{yGgLfXf^TDI$eDRCi_yf?@Z;tZsgRT#*lj^Ax z?->%!(Y%m>6`n6GgJWjW32h()GRQ^5Sc63{=*3Y7-U$}L%QY-7EWh`avwslnE#rL* z7ltKF#hi|gGT3v2;0qZSaorqU_eIMKqy6cQH{s8@CR#u z#k*?9d28(-Xwvt{zyN;)#Ms*ADnBlLgKg)71Q|6#>Qh(2UWDiENZ<6Ak-!kj8<8iI zOL;;tO>ZdQKsCk60ys}z8|52zjq)^$ruAUTH)11{&)|Hfem;jhML6kv0r^5bUqYVN zROx&R@>FLxj@>v%`CjCE>-lZSZ>#4AkRPb$hmfbTBcx?CBkzEO70ivX-;j0%(EOwd z-D<4#2$KLE6Q)q?n-&kCkVVva#m+ImS5-ze;EC@{dada5;f=vkHnT@@x_|=C!;${} zNSID?ms8o3&EO=|Qa_??R<_~oUp_zHv9v#*Yw9%k16jP%0WSu!S+?g35nVK27_(aO zoB&?+l=TM;olW^HJZ6L06!2QiroLuu-{oKd;W5%z?j9-r#zaBGwJ!brR z%=q<~@#`_;*EeSTdd&FsV#ZGa5Zc7tzzXFXSfTtcf)yFG$@3;0WRcI-^J>gOJzvIo zT6?E5t;kb^obv6+(@0MF4&n+Pq8SaGqyaH3l?$JVEDG+sb~k@{$>#$$vf15u4qo7; zYhWO(B8PLAE4dqCJ}v=ZlOs(^b01#I<_(z4hW)ubuoLiS@$NLdk;iJ4q~V#UE>g&E z$GZ^mQbfFe2e8WG}7v|_xIBOB==hK0#zrSyd*mk zjj43xmsNOEUV}U>9a7j$ds#%TjKHxGI5q;u|DT>10x#5p@wN&Dua&?aUsm0G1^q(X|(xwn09O^&@_;z9UByNaR80jry-PB z-S;YsJUJKS>XSN>ROvT48g`WTQ!Gk&L{uV#Z3%c5fkg$LQ(|PpW6ab+tajr$W)Yp& zK=NHxjXMAL^Pia34~8OgMSlFTHIFA=i7#7^@xp0`t2`pjHQ7g|hTn1EP}7F(+`wmE z_Bzd7wzcfpN~rcKZCja_`QpMuEo8X@n?IDa(qG~~1o|6_NviQlS}F*@t0t>-ebz6e z`U^j6OS4ZGi;1q&@-R&`)L$tuLBZ7&u3f}KHjVSt0`crdi6&@hQc3vI>NC1t|1;2v;DCNmi5zmtt$x~P$qrhILSQJBySLH47Reg>Zz9^we4~CP1N!r%#)a#n} z&9!$Lj_nFQc;fcEb;nG1b#D*9{ndtStJ0i*Wu&{q(4BS2#WXpA(_7y%k1!tOIrBu)o+EY<;2L?o#2D<}peM9m zgs1Rqph_-V8dPakK>Hi1hDMm3TB1g_>$*a&3vFkm2pCy7nsU)b?F3{-2Bz===0=bW zJ;L9>K1@3HJVAgN=!7RGRoVxn&W^IAByG~c?#`}a*U0SjaA%>j+JmqDLx+bti+!<< zu}o&H9W$j-Jd9U~eR;=$+Xkvd1VB+{X!g)(SD_QzJ@S7-g-|%19;?J+mF>_8yt7)` zBmEIYzi3TT-Of#`hGg;RNW3-UNXkq{H;qdacf|s|K%&@sjtd?jk1O7)S1*#%sqd^J z4dM~!gtX^h&f|0JE`0buV{^b`A2>O+bl~Ll(zo6+f8YfD{dfWh8rnQ7X{0aX|D~8= z|9XKP1j7y?Il-`lsG<{X=tR|CY``El>H<5U;^_eTaR4$t06ZN4o(=#{2Y{yoz|#TX z=>YI_0C+k8JRJa@4m9v|0C+ke@TB^PcuD>>+B7?!RM9huIrt=siMY@tti>ee;FFkx zPl~@I_+Cc359!rNZ%6td(z8fkK%zPL0Z`jVD^)oFm^7OnFdMA9(1Wn|*PhI5%!aQ$ zJf}MUn1+dkD$>|3yM(%`v^!3nPkTKYjGdhwX>6KPeFXk{J0*{&oW{G;oEtLroP3Z$8!9GCDG4c6aCTJajIzUt3$UB;*RPX6?;O zQd?XGTEw2Z8O=0cMp6EIXj0PH-%rb2>flEYY`g10eK)v9vvJaP%6sXVldXF{to57d zX@sBtJOFeMH#$Io?4uJXZ9E%Ad-$s~HAhmP6L?RJ<5{UY4RiO;HJ%lC>ppy_?VZq+ z?}_yZ`cK=i8*Kr|Ttr#`*@iV*ME<`fE*nyj7y=S$!CN3P1SEz4s1T4C0?tB+28Dpc z5Re!G5<@^@2uKV8i6J17md(LGdiI(SNMS%NjpoP`lgU*jEv6m2A{1W_O{(!(6?QbP z=$ga>F2X6h9?-!(WW?Zo;g8nW=?~-0wdsqm0_f7H4wtm^RWo_2A({hYvmYz()@se!3Eln6-FdAzH=jCLMcAMY~4g zp->U;A=dgFb^|=&Vi_*3y&}tIiAUmaWJ&7RcV`DMZ$Eb9+dmpoSL#w1gYjj64X7aR zFa*1$&QHPhSe@(SaA@nR()5J9qwah-U;}R6D~-2x35M&NX!j*a;Ktq3QinB9JEaR& zez{iC_R!wx{u_2p|I_U~2ln^gKJ&8CojXQgVF%bEf0WbCB#JhugR+=nqsbQXzWv@z zXVn|$;;?+@o8LT+#2vRyJ&M2E)C1bz&;}>mm|?b?KXBu-ZNr$d5UhsL!3ygW`3mx; zdRUM~7UGbk`p+(4k{-f$!G617zg@83F4%7u?6(W{+XegWg8g>Ee!F15>E#f@J9WW+ zi&sq082<}L?}ew(2Mz0MXjmVF(+3UfgNF4%!}_3MebBHzXjmUKtPdL22Mz0khV?f!#0iQ8sAKA0vSNYyN^}5hxxO2ReB%+pt`yFXVT2$yj^So< z4SgU$$IxY}WRQ)a5<<=O0YKfq)6m#!I;*4I<}?Asgz@_R-7?-$LECq|PVwlS*y_`H z^3+pLojOV1Cr^z`Po0NW@$*yD@4x%*_rLQU)mY5#hy*Nn)4N8}jq0INPFJ>bR|5O2 zoz4`Ws4eF9m?fRdl^?{*^!1LOw9WbyFR$8d z;gHSxU%V^vAl5>f5e>^x%(U^|7}{$hfvH=cGNPauMWG5fQoJ;YWGAnOCViyZ94-jW zC+PVOdMAULgD*#04;z6}SULJZT04kIyFxBqy0OpTBeS!ySP#W%W=#esUZkBtxTfL{ zcw=!ziOU`TB7Lfc9cM>#g>vaO?yWtX!tM(`paGBNJl>fK$g?bVD}F$%S=-s5+As<; zkw@CFOB53!Eu)o7@@D9*L>5|;C5KD z$p&b$0h(-pCL5s1252(9K1OJ=0h&xNp@C*->z1Y^=O41`ccW&SQXz%LpVHw+-KY_wY7+-!ruBxK_?gOk@&To~nJ#5X+5>fv3--}pwZJ^qF_aO3pUtH++0J$(Ct*N?n@mh?}*xmQHg4Xn`E7)8z@LikWjpq$W6 zI!n9O#gl=;S~e-2YD}FE-Y&xE&wSz&YTz8<{}=fQaP=vYbHJnx0|}njr70jiS3nyd z2!9mOrWq?~ENxHIA&*@dG@5xa4tX2nkQcXmfnP7iAuq-uFUBD+#vw1pAuq-uFUBD+ z#vw1pAuq-uuj=VJ>p>uT`t$mmgJ^+V4ReV-%&`6H$e<+P5z~_#>ij}^<|}w^rnm20 z?GO0(YOBAuE0;^9r=-*~VeuC>3t8jB9~E6Ij$|9_r!H^LJ9uXxrS%Yu>{ zI1|rqUVmH}T0o=K^)Nm33!7;Y-e>0cXYt(i8|k5CY*E}iA>o-spu$h1s|k{|L*g@_T;|9?>Tk)FfdDfoJK4EOP>rE zPkB6vTAb_{Z7u_}(HR;&sUzeUP+q(#kt`SO3nL{Kp(q^bxfNPNq<3l1az`U)x|Va) zb68__a>a;85HR41XLPv}%aC7L=cBbhJj5fRWRzv=us_`2bRgxuuL9UCJ!u= z2bReL%jAJ&^1w2AV3|CyOdeP!4=j@hmdOLlR23I>fd0YGO zz8Q?BEiF6d>rY7$8eajN7}+!h#8ep2yoNABiyCCh$*xn>OhR6L)~W7CQY@X;%haca zu^CC=1%5{TS)M9w(FQ)~neFp)bG0Yt=3XsT@FY_8>K9NcbXL@l|2>bkgkWB}b!54@ z1vIkU&;n{MIg5?a(FU)LIBygBtEumBq}I@0NAUexYpQrV9?jt?0zk~Y);jwxsRQp| z((JNhuhwL~u%)%{O6BvZA$sdFjoQ?18YfJ&%k%n67Km5i4L!$B%p=~=o68!{9c_Ki z$z9hL!JNL0+B1CN0lbJ|jz7c)YnSjghSeJE8r5aR|I4?Gtef`sQ5cpsZqUxe28YPk zGeI`wA=9dxP2D-K3e<)Ajdfqth}n6iQ%u1-@lpY7ou;{zlEi=JGMvou--*L!uu6B;klGq1+Y zf0Oou`#$m9CfPD#KXI7$_%KLCwe^;I4v~NCdujwzX_=lJa9CWv{R0dC63b+_hp~7{ z{|inj7;x17?SHm+CGb&J*Z$s_B$I@!3|S_VWs*rUlWnriWU>xPfIt!;B!mzULf8q5 zxFI6$3ocZxOI<1|)@ohrf}+-)Rus45*1BNdYqf3_t!r(8nfL$S`wfYe{+{pYYx~+H z-1FVc4By=E-gD1A_bmT=v`mxNA9$=iC&z4x?1?g&Z8jf(aUrXVLvNdB;0$3qcB$3k z5r&*#e0NhtgLGxA_YwGh739SOagy zD|gM2KD}k8QG$D8nwC{B!Cr-6SybsLX)vk0bFB}^^Ihl8nLB;@wXOlzmEAL>?3;C- z$>bWySdILprq##UO{Sy#wKe|Z>={FoCZ4xp`t+46J33FdAZlO zc)(x7)dN5OcNw^17If}kfltQJ^Cqy+n6Zl;j!NW$r+p*rZIu^IZJR4MHSP!)OW4B^ zcvGOa{JAvTP{XFiuy|mRrRTsa16`cAdzq=BSEB3H_g$<9iq;{rCSx2Z4J60?`}m}h zM_^R$2)|OHD)>r#o`V>vKaUN!&O0zFcW?{NS1MEmk_VqZ*nYAiy@!!T`xzp2u>E`n z)qeYcv=8jRL$@E#zyxeOL1lPW6JD@EYEn-E> zJ$h@S`1w1~(Z=VEN=5jU@2d)W2lr17YX;PrIIHQxUq7d8&+@w%^Wr-r$JT%xBHfktAXB7e=!!EPZE zi*6N>SWKuBQj|TeYZwr;lu8gMe>|@Ai9ypub~?m8v(qD;$rj{><(f7$wcvL!&@dR> zIyhkf9I+NLfxA_ik9|pz7ep3&DSfEvL}GN}u!poW11!PtCR3@5f(k}u5PdAgJJ*((hlq1mIQ=1}_PQfKD37bx64yNjrvCjt{9`IPa@FX?8caip;;}zJRUe z9>J=2Rp0vgA%7`*5B<#KNtNzKtu_3tDllx@uEUY6+0eKu`0BvJ^+iQMRRuZ+p0c)f z;bNchl#ZO%rrcbJM7{5zKA412z8~TmPn3m1u}$$#0mTR@8bT8h<$@$B1KEU~PS)c> zKq~?x()k+DcxX9JRlkLxH7IQ;eJIONjz!soaw*CUDBDqXq8OIra2_n4pAwQ0M+w-t zbF9gFc1#=AnHdTLpRlVP4G^)M8mSg>M-ZM+=&^@XD~dE(ues%zhv!yRopiJ;8F+kJ zVPR=W*L^ZI_`Y;R`h9&!{#_xd3+3lGOmaBTC!?A6%F*Gk`G;lN*TeSjHN7Dm@Qb}j z!K@R_G`hE2F~E0+?oI10@+N4dbwg^o!&1u)spW>$azkplA+_9)T5d=!H>8#uQp*jg z<%ZO9Lu$DpwcJW-jm6y%^QC8R0r;BSO7C9+To#&(A)mu8_k+0IdjF~2HV|7rM}hFDX9i!Qg8pC7m6;i2dxEjwJ3kvc`^W z8COv;uQe~Xqhr&FZIkEBxqeGuU#3R}vlmx;7cE)U(13&sN_pm}eh4p`6+K-d?tzyC zQ;xCH^p;Sn(GXUKdIIJ?jb4Nu$E$cnWeVaGl=&{*d*2%62wn{*9Kh@)V*U%PeXMhV zOfkGObp6DluG1Bn+hEmU3Wh6`{RpT^D40t8)8Ankwt-Liqze!S8Fp7qR%UU@qL2EI zH<`*a?11>KI_XrT@MLAz%l%o|fr{*$SaW=iqYics`S7JFDf!6!ed$)K)m@&RhP8+N z_G9$hH?_}h?U(c9!$`N@&(i`#=mgVj{O?3?$Cs6I-#&1x135;o zVT5YLUb;OsatY$6zZ2gS88Jl^D&CCIh-cq{wYucsJ|Q8TOxFu`)Y)3kw?>^PRG`p|izo zs?5m9%C7Z09I`i})<3Y&>y>F~MO9guzM3^F>+84pvU6;z8C@$CzXD^1N*&@cmQahvYDg0grqQmC}Og$c+g1Z?rKJfjffhh_>ot9^=jb-oCt5 z#w_X&ez~}Rx%>eVt}X=>6Oy%%Q_Js#o)-fH04&^LobPgc)5veGIMg>&38b5ofFxzm z$GCFntocLRl-Zd^h=ht8t5(@&Y1tBceruc2xaddPp!dsnQ2kDA&^Y>vDl55A*`PhCnNkk+Z z$tf-7Qva4mFqRLW`fLlNt>&Ri(1s+jK^y+R9X2a?jQeaW55HJmg_fUa53VrA=To$MjOf%h3kI#kf#XJ6G9z~DZ7l5! z-v}94#py8W6MNjP{r&s;`}cwgo_{_VvDa9cMzim~dG@`YMSsR9eK+=IXg+uLYt@G= z3@-TBM2=E6XZg75H|D$LX&cjScgDY-$VjVRVoX}QCR z!iSV)8g+7Hc-O;pAG(OGcui$#qfSoXYh*uO?P^C!%aPhaa$wcU0we=xo-@kDuureA ztlws9fv!>$X^Bej@6XGKPq0KsM=t?L*#0fG@d+mRK``P4Ch%sYBj*-RO8x6g)!WzW zwJ!!=_%(YyxVmaAkM6a!AAdAohl8u3ZzZXnQ@T;qLG&2wuTwI5Z>1@o!r2 zF>>k`W4QID{+Id>%+Mo;(Th-H2mUcnM=eo2ukH7oWGW1m_eWPM55)iaiF9kx{)10+ z@EQN=(ex8>py{yUG*{Mr9nFOO0Jvj#pR75R9}4e_DdzZhB(8d&%*Yhu>BHR19_Wki zI572KCukOiTqnM+7yXa`Bh^(}Q4S-QhkJzFYr^d*R@nRB)mfsj09cKk4^L*Htl%0$ z>}Mj5vTnv#Qd}mHuMNkWwvi;K8AcMM9J%86oIF%jS?1~aqJN{wRGSI?vt~M0q+JDt zGrIB%5PJ$BY5BC7#kANOaFsf6~4W(tXjBdz+ zt*Be(5ZY`PEa@{kT&~aWO}CX7r=>~@0!-DuO8!ChMLI|SZ=oX7#z<{e_X6tp`#Xya z1yBFCJwQ8I%AuaT5D(3q)paz$^B0O5wEkm(Dm7NJa1_+_mBwql{{lB z8Frp0hLK8$OcIu6KM&hgTEjR{(?043)0{(NQ1v14gP{O_zTkDFW^zSFkZZj%I{GSX^ze{)`A4XhDd(_ zj@eSYKnDgF4mvZqqvqd~^#v9u*KNpj9WU=}0yc+s9aL8V2_^o_h38Jp&-Zw`4)mYg zl3~xzs>fj`Pd>RT%2n71Wd9;}FyhHCY#F6R>FMkv#zTDpP3j*XAuJ5ZKo4f?(;hC^NhX^Ln=6V zIYT&D95fZx!q`kR?}LM;d{sUqLSM_ zV&LwyvmzsetAyqix*3ME5_J=(Nm8$&1{sAbGZ4wXW5Gi__E$d{JoZLS=BtOiY~-UZ z(GQH4y5(M(i&NKPzHUbdD=+LnDkN-O5+xm&J{iUI2sRi(Vvc0^e@~Y$iBW&2U-R*VD zW)RbZkKzaIsuHoL&8F>GK61n=_1%0*uH@_i#-nIfV?0VcG(X;%3J2Ma-KUmWT=`l! zQBW!mI4DF1*5A z7+#BTorY^Au9ezO8-T|PJ_((H8o+`cfX6EUk5>R5uK+w=0eHLu@OTB_@e07>6@bSp z0FPGy9 z3_sEw)XR`8&d-#gOL9@T2e5&^vhbNX=sd#Sb{hfHbMSr`G>G+je6}7luRupJ=@lfL zW)pVixs*X~a_QX=?%>9UI#j&F{SOS8u()Ocr`@Y7ven`tlFpOu(UR@Qb-*K|2={wbU9 z7!xbgn_vUa%NyU2pP%cX?&k|#XY!a4Mvm0_772XSfH46B=+JVb)5}qJBB_*}>qKW! zaB?D+Bxt)LKEUcQp4s$MdD#tPr#KEt{7Lo&Iy-|YdxflIy3BG ziXL{EURh>ti!SHIN^)PKLy&hz=${(?A|J-!8gb3b~PSbUeVMD3}4>@UsWH@ zW2szITU+0-!nd}rPNtg8wR!n@dFz@SxjEUpI|>R-GS-HpSO?2JEiLBCim7I^$C)Sp zWUZ>6y`b6~)!iNG^S%-cx!kptxsGKYnsOZes?1Do!hE4G&2vq^z}PcosTRmjKWEap zP77hud7N;lPGIs`opE$^9qLs`C1&UF=wSwaSE(sQpk3CK+=#=C;xImO7@s(dPaMW4 z4&xJt@rlFu#9@5mFg|e@pE!(9TzJOEVSM7kaw8RY`IeaLOqO?R4lD)-7Kb^o7#vuP z$1YY+){g5Olp&N2DCeMDfpQbd{V2Oolt_9FkN!T2Ay->)mloWm1$SuyAGhExEx1by z?$Uz0wBRl+xJwJ}(t^9RC_ZK=Wd~&$&x~eA^7!j$BNdxxIA<8nV&cJj#3c0@kLv6i zbx<^SLir+EEdxv><<#Rwg!`asM5LMtG(px=Vv6yZ;Y{Po>2~=lwn7PX9+~pRr>v+;_jXvz6aSPGx1ht z7UPiR{yDXN#9__pt;bLAL>wyYp4jFpEG(R03huyr{#w3u4Bv6P)H_%b)p<0xU}bd+ zznCnJW+!NnY>!4s@_;Km;4TmP&jarAfV({4E)TfN1Mc#GyFB1754g(%?(&4W%LDH6 zVDK>OGcn_tc3qLU|_cgEwrnK>@ zDZ48+K0fuhp-I_wb?r+V8cT|2=O-n5Jd>vsxt;lqSB!~@YQL>H$DuYIRmH^{itHIF zDUSTq)Yw>ARiB@qcYcp2Gpnv{U}|->+g*@fI02b4#r6KOvaIdawA53c&v3hI8VU;l z0X{1s*HM~hb4gDYL0)*_yx2>XcB3Mbj_0Dqnf_L$bn zpJHOSVTpKLY4VKMD3HL$9>&KXRs*>u$${`>r}C)Tc+3yhsjyK!wCI`mtz+nvcl$dy zJB{r!PGQjcx6Tz~LRFq>IOBU_4ZCwJ>Zt}JYG__aQ6>7q`D4W6lnlOfj90ygvJ249)mCL8B|I(^Zi=`6)wZ*h^&_sihjIIy!4haNt2;3m`TnMd^Y z9>EfPpuM)Xo#nm>6uCGe+MEIe9{` zCt$KsgBZbk#Kzz@D3dEAjUL>4)6bEBZ{<*O?@jI3rfx~gFoOjdETnI%-=S_6u8lKl z6_qj4DXloO1baL`j26HiDscLufC2BTHa!2Oscw7V@y6;6#|EF7oY#4>58dEJ zIk~g5@twCeZ{G7!y16*%FzPGpfkM>-aZpKsb2;*K*fDH9eVut|H(SkE0=p5=N)r>? zE75M&Q(@6Y%ka;qHlWoq7ua?L<$@S=LPTN-N6<_)c0z1o@O0fWF9K{^Cix2{G{<&~ zJ9Wa;sx{e<=;j80_)&V(VFyb5WfktCjGBs-jTJ?KR-APl0m(jc+{&e$vMpaVkpljk zj9dP}anm)m-hOL|NdCze9>vbtMok9>FdmE?p<>^{+)x7P%YH3EqepT^o}q=azca8y z|07SmLxieKd|3&uZapS{#VwL>XjsmOP~-C=u@H24j7+~)Nt#m8GE~u0RpTvkFZ2}>eTBB3f6p^3 zrKrcVyRi1!#YQfY!%@R@1kov@^CPvPji!ot6z&1Ime^=fNW_Qu!FbHS;nRJzoS>~k znP%`G7=6MmE(46IgR^c$-AcO$_ELIP)c_sNVW@Fm{XlN+@|3*1@_~UGw|m?rl@+E3 zpEa2#q}fa|LN-C`sEClJ;vxVXL-H{5mRV44F_S#5cifb8RO2ZEcy$_A?x*=)F}1TC zNPF@x7qSFn14QX3jhm>fe02!T!HA=SIu|qmDqxIB0*aE?m;0IQh^VbwJ*V1>qyM_5 zZ@6h@kL;Vh<*d%B@dI)Gn*PO&jh5hcdEu%F6N-xi%bS|y(xqD;7#!^AIHs?%s-gZU zc%fj%0&l{ea5tVO6)NdN+^FbKO1cROAavPaE?PX)jdhx`xN+g=(PYjimfAvKhb9X= zKy4wgW2Lr3leI&WwL_D&LzA^bleI&WwL_D&LzA^blSME&$}SY{$O>>r_8q^alzj&4 zt@_$DGyyS`s?L}$X*7*W0OxrTbSx`l6NeR0bQwZruy!)K-_SwBOt5VzX71eY{b2t5 z!{%Ln&CFiQQe=^CTQfc&o0`_H4d_EdFaQ3m-ob@;A;EP1{2%iG=>sQqv|q^MLOahf zna=O*WbcihKyauN2qYupWe`z>g`$%@rG-2BrVxd;e_r!(fG_k0>l`ZgsiMy|IlA0~-TP_4OyNsH;opjV{Qa z&{3HGUZA(MBsZ_>u+q}WQ_ebNGGK3(wdUpds%K(~t5N;H^jow(6;t5Oug-}ygYn3a zF~)xOP;-JzY17)N1M|WWo)-?x3kT+f1M|XxdEvmkaA00IFfSaK7Y@t|2j+zX^TL67 z;ZXB}-vGUm7AHL)h`|~OJ%v5<)%jq|gJJL-&I87&g;4|*P+(rv))_Iatt;2JwzRe$ zvn~*bp3&cbTTxNR)F>Pz1>a*HX&S=r=}>=68T7$~!{3=~a!X z>0B1GvAT`?`Z30Q7=xw^8%}gn%)9mOg3Y2ODH1E3%2HSB0~64cok*qpFhH9-c5ERG zLFh_|jEah$g2NQ#_FaRmt@RCSgRkzBN36w)VCs3O0f*Hf7pTY7({rUPLqbrscjW@V zAF1s-??aqIw{q+>;(v3d%)sQl9Q(LrbmL>(+Juorxi(rh6*Gt>kr@!@=1q=SN;EbEQmLDg#?q0e|b_VY;JrjIMmL51~V{-#~ zM8$T~qhUd3*wGGZxZDNuM7L<@t^EFI$}$U&A$7V6s?FE6E|oD$WX#gm;3uCQf6qO% zbllS==Wun#Ek|*Lu+d3Z9T$*r~{4S2rn?`YjMsb9cZRLNP%W>ITCey%qufKlYfXV!(X{sHD<_8ZvYHCKB zbfx{k-Pos-&qi^Clva@rts)&-MLM*KbZ8Yg@D*hUWdq7NC|97|gmOR1E)<2^J9oNMX@iH% z1}~%yUPv3fkT!TBZSX?c;Dxlo3u%KF(gyZ`I{Y#!zej-=lJ)@|&7#j}(VMP#>^6*( z&<%$pc86(B&xrU%e~oG4Ktg-_*<1SO^v=BQ?8%ek2BMest!-#*ZeBCf?|=8mNo{h$ zf}4Iiv_b~PukGlaHvPgAyJl2Y(sRSO<|?)0`Jd*qeEgQF;7x!`b#)!Mn0Fe*P#VQh za$3#RvhwzI?|#1FzWX+O{_Z+?le7kJ4*pO&gKx-XvX5)Z-x)*cU(JVsHQ79h38ive zh=r%ZLH}7Wp{OtYd&Gs0Vn_XZU`LJmOku(r^_d>@nTB_Sqex<-NMdPzY+m^r4$c@w z5*tMl8$}WuMG_lD66mj zujF}!bHT!Xr>K(g<2N4P-2BgjBsLnQ+tG38DBV$nHO7yRBCJ6UmeEE9S*Wuv&?)$P z6k%-?VND0hhVyis;EGX%wNZq%L4+9?N2?eW4IZa;DCUKZBCM&n#8HH`QG~U>?g5pJ z7|zfbi7oey5!OcYt5nk8zifWhD1zQMLC_mLOMU&BQawTi5bI4OsLJs z_aX)i`zi_%m}yQQQp(IDP&^)5vc!|_bf(+#^LJh;PY#}Hs>n~bIh{5e@;XCrAx zMP%E#M)b@`tdp(t=ACTx($9>mDQZW!qfFrn#vZ5snu)K=6N>&SuQSic>(obp=$w6K zVdkM2d7a<-Od_2RUp6wYlLw^bfDcA~{a5ok^<0WGni6J3HY;*B^9FTZr_THL>i9*+mX$6HiEaIV-Rw=){ALs&})D-k14zx3;o1&1RrgA#R7);DWRI8Cd$yBun zqfcom2uHUNRgjQoOsGuKIi0D&=xF_Q3xkTZn0_4+<~hvd(`BOap!IM zUQ6ks%dQ@ndt$I5+E;PuDefk@Z0qt>&+J*$I&)ldSK+Ev%N~_O?Muu{Cb88{v>NBE zBj-7rt!9fIMyrV$Oh_O?eNaa8R8E3&rsHq&nT@R;hgRE-R`bNa7_47xHP7$Xt%jXi zH#MOQm^z$Mk9K z8yA(=XC)-o=U2F=w%>MdM8FH#%y|A?K+j0T_vP|D_B^!8iNYyNcBHtY)r5UbEF>bE zC^3lFG7dfo*4u1jnq{l0r9n6%6n|?`pM)o|hAr=Oc42A7>6Ac$g6k_X*8m6kYR-qr z8(-Xb^wA9^@p5;tETS%O_==V$IdIp)!G#O&ymj%CC5zvmSJyqGeqQgX6FMfh;(5a3 zpr6O3+NF7c?czD5>{SBzB^gT)+ZFENFq)a=Ywa?{G`1XzP6l1y+&CEFa7~%w%8if( z!QVt@7qzw)WlQsh_G#1Gk2|h?`t&J_r+WN;&(!v&f~qQlNrw)E-j(}IuLCJ%HriAG zj$u0pOp;{e$tR)iKq4+*Cx%44(VukeZ~*A!;Y@X)9)&tzCypm&uflf*WWU+zs`mP7 z(x8@%t*%K;vv?#rx7q?;2OejlOa(%l+*f-4&g?34zS-=m%6xKgMXEQgvv*C_^$C~7 zMnsrTO*|^&+_Q48xHC@1d9B%A3n1T<%*#EFvRM(4zxJBO<)>M_@-eIVbWHSAu>Le; z&!_P$;NjePt)DPIo{IowYNBzq5)X$bDx^^!;7JKH!AUW0H%7sk;!m-t0wgS-A7wl+ zsB%qHKUjyK1xMmXeqi#OHr>3eXKDAcnM>cjbYb@*{_Y1J+rgh{VvBf7rpobhrd%yg zF*!_=O?%8Yo8OLD99aXJ}tW9chp(Pc-KT~_vz=LF9!o;S-Umfu-nt+=$( zQh8xjPjyuFkE$Q@7JF~=?(;q3+gG!u=9-${`kVagYm;i5Yj3T6zAm=zmHLSKw)zJe z@*8e!%x(NhQ&!XMfr3DLU`=4h_{i~9Fn+O>*tird1B7nbGzog zaG2w;x8^zKT{Q0(^P}c3n!jbhH?VZz;|22@4Rj^ck|FVg_^DVU7Kznju{c~@jq|g&inVz6 zX>p`jiu2Y#7e|Sw#P`H6#X9jUwD9M|dhs4Kp=IJlaXe1i*dU%48^!J7M6q1_QCujl z6~7WMiIb4bb&6OaP8EL;ABeq>bVoyDzgOHX?orA|6uv<~P!Re&8f)CU;$zf5L-|5H zDV`C>KstN~HEI>cz>HV_p+7Q0948}Xl(MF#3Q!Vc;XnV~Pi=UJe6A{*2x zazOJz{{+r=fEJ2eP?yL9bz?356J|nw=nKq-0?-mgOGP2-Wx^Hu9J9j>S}uw}D?~A9 zCF}v8W44rpKEsSD1@%Hl`3y7116l*^@Kem73eZ|n30kLUy{JOHK~#r6!L0IvHUZ7| z6U?p}(DA|_`WUl}v_;f{wu(B?38FsqN6fkg&`H20|08B!6X;|`r-(r4Bh19{pdF$a zv{STzP8F@84>2<*fKFGmOH4$4hL{A}E!skRFs==sZQ|iy5d7i0;t)nBhI3gJLG=LeUGl2pMGWW9H5Zy@#3J z2f9?u23;olL6?g;p?5J0=YkH2!$4Omx=PGLeYKb$dIxiV0Q7LN0CcSw1U*75484un zPkNMC1bVbs40?=M0=iBt4gDT+U>WFou^jX`MK_2Q*y$fHhCnxpm7phxRiGz|)u1Pd zHK8{lcSuhWhl8Ff)`FfUjtKouoGy+8JwqG?dZsuUbQ9=rA+L@BJzJ~;Jx3f1dahUx zx>+0-`cKHD4WQ>KdcHUw^$Wzt(0@RJod9~FI1%(BaT4go;$+ZEKz}2CAWi|jRGbQW znK%vfa&da-4Q$uW0R5pj6ZA?&w}?%sUnR~8?SWi88}u4+4(L{KF6gylbLe%*RnqIk z_dtIv&I7$(oDX_~xFGbJ_=)&F=#An+(3`|Xpf`iQDsB-MgWf7G0liK90Q9HgQqbGQ zWuaHZ9pZA(I~Bc4T!H#F@x#!sAv>=Gy+>>T-7c;Iy;ocfdLQVou+6*%^k-r#=mX+f z&Uz z^ht3m=q_68C}rTHGJ{rFcdB4D?m;0O)JtLD1JhpA&n;L!fVnhe3ZM9s&Ii@hIqj zipN6Fir_%-N0@k;0kv0uCjdO*Ae8dNkSUJvd3FZiw zZrywCIp?13o?8+igc$LQC$_PrWn*MZ<@p3s%JFK+*vXTolE%J!@b@l43eJq3`m>VX zsXzP+f%;0kk9WNpHO<>+5CUEJd;0t(bDJE=pM(%1!}^?Y{>l}$$Zm@ZJ4nO(>lQRE zT=JKbtLg|*K7@7tws3B96R{E%wx5Id^$QoTS+G0g&?|(Pzb2rx)z!|e`N;j}By2w! z?`PHF1-%6kY5sFQ%O(ZS9zt)Mgqjlr+1{km<4%HBD!B(-* zDlECApT0}#`Q;=E%P4si$rq-Rde}$%v@CWTRf_38Yn2)6sy2(~}a^M5JzY?A#J7vwJlOHFQad>|z z7C-$1*^T$h@HvLVEqHE5I5c>S!;*-lnERX@gcr#{Jl62X$wBP914_`fSir1gN5%R8Q5p@_Z69nq~qAXa}Ul9 zyaVUR-FSQk%g5jMEW5^KkXSq}`p$hqs_^+oa5i=zou>%DAoH$6zF^G|3V`7KvXBDr}aoSQ|q z$a+Y_V6o%alaYrXMjX%Q?`U|`Wp84O#dQweq-r>n2`Rm;I%#( zcLD3&hHcc48g3<)zhPl>`XScNfNike`}oW&Sk4mCca6tBhWq^ei1Uv|ocEI&xj9&{ zodGN#U~x*%T_PxbP<{m^pP6uyM2tX+$%f?A4<9*RkjWKFm0A;`)#(jJli3n#4GWKm zjEatlwb|nw@y-NSqC3fxoRaEIOV99S`m?fga`W;F3X6&Zqe@1j<{Mi+u3~)Ugo%?T z-!f(Dw4Y7CwQ9!9+h)z4b9?n%vVKGR#_f9!9K7r9dk)=u{{ugN@S(#GKXT;J$BuS& zKYr{NzdZh8PTBBX(D97atYr0mE^vj)$!!7vJMP%JZOhJGWXHb!d!PFC(@P0C)xw(L z;amK!Mma7J8`(fklefr+v>UaXwcE5iw7a!; zYai4;qJ32RnDzqqp^fjw-Mdbm@2kM?1yhi>gJw9jhKU=OcqFK9ooscj}( zm@Ud?lX}Rt^#pqu_!Q~>G?xFsaso@oz}$h=1BC;#2jctx(f?up<-Uim%(`;hl^Iv6 zu1vo&`O2g#6R%9TQhBA~%D5}#SH@f^yHa|k86bDVcdN4!zHV}{puoJ_4+gx}Mu?8gH$ zB8N|FXUxdMc6infK7!SE%)l1v2V20SbjjO~m4xK+w&PsFb$j<=Ua9uJhxh_u^n zWyjArK$!Im!^ZzR44ZDiu=!tO*fI<^ z0vU?XS|kix|4kSU`zaU>|4A5*7>4u)3`Zi&5e&mo|92RUz5&BA{~E)w!*C;zHiR}- z!m$0{gyFcKf?>x`!f^aBq&HyLi7>}A3@7~GVc2y8h7+}+D-M-Z>pa`a!1rB&yXza%Ii5ryg_wzio^uFcMuzP z7eCxw1WCZ(&f(^QzY|CT0un}yL@nL7-&8;DruvQ>>SOmV?B0pp4^rV2F?;Z87+#IU ztJWc)RP3q_uNv^GcIYZ$R{^bL8ibkR$!V-Kgt7>tz~90M7}#&P={~*bJ~skJ1?xeE zP0F!f66_bPpCodS)L=XYznLv0qNR&IEC^<793wS9;mYvyQdH;W7FfHlO08oQ zQYI@WDmNik%*X#`m3n>k$4tYjv)@EoQ(0;62s(VhKsXuF2XL!i) zfl+HbX40Cbnf9BGm`<3^n*Lz=-1M#aMN5>WD>N$f&d`soE3F@dX~L?)o(p>?{EqM| z5p@wSN0vmkM+KsKqNAdB#FWJRA$CvfhiC^U+ZNak*^b-3vRB&o+nQ^+oA2YyxXgmggPCVDzxF5itNc6s2mSA4yux@nHZ+3T{qvwxpMaw2kya^~c$zz|AkZc^@)+`8O1^XBBO&O4sZ=hx>S z&VM=oPX+4={#F=PM2e;tbr)SI`nI?tkUFZqB(>y^qfeK9Q+9ex<(RL>epUY5xWyHU ziq|WrPdGmD>g3W}(x#B9dDC)!W}CjJ>fnqsGvBdzw&XR7bl34Ly29w3%hsRSUr*!uSz5SJ9HoQhpTqC``j29`X=T6clp$DH;ldynNE(4;G zsemKi^B2xzOP5(oCZ7eHa!TLzr?V$#Lpl2vdOj8Z3rwF%-`G~v!0-8=2?t0dik4l0 zIhE0{HWFIGp&-06oVJERUKp&mLY@^SghD|mw3?vO1oL&!5(4uyFkcNNYRFQ<7!{N$ zTabhN z`*w=Az%NnxeWi1U*cT}**?62e+Ink*E_Sa!vSwv%wWjM&hlrv65xN<0IhcM z57QQRdWiOX@v)tuku~?O5nrjY%MNR!dA@w#>C$}=lU4k(Lk0`h7f-Lwm$@5_&rg`E zQaw;+RZx)@JLbRFyWXtN54m*7^7lEb4yDT!^Gq})FTL(1@J!b$`ZvKBk@rR0PlY;$Wu@*4d!e2GubzKMFR5!HO_gV1jvas1{&82XiU31hxcdQUSR0 zV0#X%&4Hv0NJ)c+7}yjAE25x23YmDPiPi~_mr;@w8WJNErDi3>I~{QmN&`Xa;2*Lk zJ0g98e>YR*2f23kY{-ZOi7bvdq(WwPmNiZXNCa!BFC$0=rw`-q89~}zufzy7RL2Vm zaCgrlXM9I>>(Tm&_`S3!Og$^BxUtYNFP&3u?R$4C_r|fha(2IA;^yi#c%#}^w6w@E z-y18mZp|A%{qUm69rM}Kows}Kwk5@mS-zqbMX_hDCevrP&S^bdH>rJI>(NCMI`Mi_ zk$tu=zopQ^V)z`XAGj!lA)Q=ku#6_QKnQ`dWV<=EK%0i5OTrMt%qw2Tw>X7;X1U4X zLRK3ZO*Ugd9J-I;VvtE83kJE+5hsmR8D!4jn7Mx(S#|ZJwwk==`@URWT3>N!uaVy} zr}fnBF(#fa%Wnk3C~?}+SnVvAx7Drj!4mP*3vPYm*y%fV>S@oJUyE-%G(WDQt7hlX zB^6aC=0!$5P+ht;*OOs1?XK|`iBB~{d0l0!yWVSAXmgjA_vgSptqa`gTPFIp=yA+I z=5Z&%A<0zT2`b1WVakN^kRYA+Le7*S;mPXXB~GMMQJx!^1QxVLP%2dzNo1S@-ZO)E zp`6U3H-%aql*0*W%7Rau`orl}t-k5=@sXzkLa(?$^myE&L!1y94qn*4vjZBTaXq#_ z0ozw!Z{MT@l@c$HY~SQCnzHDe)3)$B2}g zWCd(CAx#JfoQ+T813XtqCs3M7K}kWtwGBay=tfnCR628+wU2@m=Vi9fqIY1hHLDOD zPrdtYl||dy`#<7;Pvirx$?-^P>|+jmLCa_xa=PvWP+Yt~mJZSyEOtLFLnO8xI1sFh z(L7v<>iwR&PNt-{_ToRRGVs;F@97xCCx>vyV;i)Vw$Lq9D2Hu8w-d-C6&SBuOL)ow zVP%k%C}7gln8XJr6?&J6k;{bMs~mQYF?$TdM(`_;$0A8iz&73r6_GH;3S|};XM#ma zs6!bIVAe$NMnkA#cwz=|A*m6V4K~Ibg3MuKJeZx8onf^Z^!5zKItczNpiRmm&6wN5!w`AFw&ZnGLZpdEq8V+uNvKD;9~lkUVw<{01?Gu+f~| zqMwp$@o2yw>Rw7L*2 z2JQz%_B$w+t}D`!qIys^3zE*XTkHs7F-V%x!GyHjffwlXf3zi}ioNIlBh9FwpY=`C z)=Yi%*UzsWGvnYSZJgqlvN5ap6&-0~Zhd?6tv{P=OW5_>h8eS_&e*o1*m0XVbIHTE z-YN0e5be^*{=l4eFSMsZdkVBCL%Rpslc3!V?TOItg7yU1T#+6+d4S4!hPgJZ{nlkFYp@PTfQ&zG_?_K#ArLD5p(6B; zrCGbuitih%j-|)Z;ERcautjO-o=MdGW;Mjx5`G)buT9Q+owjgkuBn@ov{Upcb6{)~ z-CsK6@dDq<#H=%O@<;HviiD6rz;Q@HZMJPuS>M8x-Rw7K&q_I2sm3L2(o;iG<=vxFZZ|!(g)oYAvwS2s?DJRSUIh z*rtLz6tGneMRF*XL9qbEJUqj}Y7UAypz(1Ivnc|U%t&DpL$XG|`!XJp%tPZIr0@?M zZXo<@6mT4>U==s%ggV(;JEX8fY<*B@@wYyGxg7X9(H@wU55 zXSB^UTOMA-uh=TSF?!qW+h1KarA`-;x%SkC?27JDF{AZnirE<>=o&*(NmpRiqBQ7C zW@d9|5_Gy@ixZliup%Cs9PJL;6xSX{o9yj&x&kFYG;EDRIRGmo?uejU!eM1NL*KG6 zXtK0hXp_0!OpltN$<%J5*(TUzgiJ)Jwp&Y&s$eldh{h9XanM++L4kQ7Lnyn9#tNGg zKY*mc%XXBEOl&a(S(%kBnJUBh;(~_DFuG`|XzN)1y4~^DrC$A$&O5_nKQ4=CdHdt_ zGmozCe&Uvt)^T(0y(ObFpGJc1{*7VW-r`%fhw~p#Yi#Y9)$w%wEp*1h?20?aCe16F z^kAM9(Kdo7HKa0-)~SL{CA16B&OWR@nN0GUNrV&&bK=7lH32KcXV>%^h zv<_**q49!+a7bD-7_#ktK0<8R9IpFK?K4ZC=?8wrD)AO^Lggfw1LnhTW8w+30f*#Q z6iFrpWOLxwAmKU_q0q?_KMqYm;E53tHk} zO)RuTz{(KVu7n*5*u{ZepRRI;<C29CrF~3{hwh5zQL>>wlEnhqwMD5 zbadE$b|u_QDlXycCpJ9w?Up%L_QmQSZoKESm6bCC2Jyi{lWa}amQ_7H8F8> z>8z6z6StPpMYlbDta@zw%yp-38&eUVe(#jLRTZ`M0k;yi&2T3#Nj6nEQ&)KOVn&Ux zq&+XT);Fp>KjuchPa}r|%i6r1UfSS=w$#p4+LqFpLfeu%lWCi$(?eIF^mjsgJT4eP zdmOBkkh;nawRTuxgY8kUGn^@gHcO|4)>)v<+-at5rcM(@<=<(9%~~ikL75Spks%sO z3UwpL$9|XNgI3WHAKZKd>J>^I&!Oq(MPngoL!Q6E ziez{K>ZL)0l27mL?K?8Ussu7?;7iF4mXXPUj3ypd3y{f|@^lmjX&j8E zkVat@fFH_$t|m}QAPZxdoC2erGC_)r1Z_|>W(U>TAgN%s$qyDKSY~m5?fV0l00(zN z*J1Ibc>H08w*}-=zKmXy@P^JA@JcyV5J1!o*~U_f%&=vJFYB{&ANASkrOr?4pM*BN3^lN;jfXT@Kt@LikTy6531}a>f|LgZht|^wfP=2i;G9JbYyrO#{QRUo zE9dHak2-dXRS!c2Og@aT{v7RDqwppAl^(QbqnAa&cn!>phIvsiKNRIyqDK{LGLuBN zNf&|OpJj2epm-S4@hA(x!8}XpFBAP_NkTiMD?Zzx=gk<}VnFKAM^5EB%C(NW>H1=a ztE17cWbJH%iLH59RkE{9`b4Bq?B=N;R1?#|NwlGsc!0QzsQf+9aG0;vKnaFcJqo zbOT4oCTE<(h7!x5w}#p?vaM*DI}?KbVRlx~?m~+l<2pDerFkihH^b^2p?%o!T?xW1 z-KW9}%+^hd7oB@U{8*OZHN3`DO4|R>HJvUpi&S z@BieLsIB*RRgXFRz;AmdidVNTm_0W=ch$^No07_AX7IHCrSjP9NX4D|p8DqGZ!{Oj zd?sENKRSE9Wc&2@--Hye7YaZ%x%f3-$XhRnUwAy00oE#R) zU>rI%0*n)&k#FPaL>}5WSjxd9{Ln^9TLC7alT2F)EFnADpv|T`rpVcEW9Xj z4Vy;8y5l=?&(1lR$EBv+>-}eb{suLFLqmGs`pf^o3t}-kU>;gcyZWnwx)3KCe+|cA zB+(=hB}@_qp=$InR|WGGP{YF-8?;71tpaL!2$RKVk{r?CHpe-QQ9++bn%S4xOc^%I zgMj%A_Mj=oqIPD9=71~_^hoT$>~T9*$k9E#I<7~82w z9*!k{3mmoC19lp)!Ppq^M1cpbEHjKTL$Mi>%rLiDBWywp29A-cXPFdW9y)$lNakh}L89&t(wfN( zG#6YplnOZKn9qZMK5DnQ5}3Vbw+Z84jGegjY4Pg%DKD+*{%Da#kz##$bU*Ta*LxSc zFc;}FUUu);+xRc;`HOhuaLogH zPCP}I-H9x568-jxhf_+wyz4`;4fC*SDve^7FI#*N14>t_j$Rh0zPP>%nrAJCZ%Z)O znWgmbpGmOA2lQznKoo*TC8uf?n>xb=*gI!YUZL`t4F+_L2Mes^mR-BZtNKoGskBQZ zT|#e{=;&heBG~T3*shYrewd3U<5UWqh!jbNhUhTcpJnSB82OP}g_WmKk@eEo*!&u5 z4aiL7%O2!QH%f^rn+I%3&=3zQ8Ec*Oin&gbT4A$M{|?js*Y)jpI0&J3 z$%fd3G0KozFvv>y6Pc+H-A(hrSTS9<%8Hf26g?{TSl*apb22 ziDroblPx5GUa-Jx2&NoTl|qn9cHS8#>2NIp>Gm?C8w;-?%V2Tv3;VejPIKh>=YweO zZ>3wVda&I$k#M`QU5-Qrv;hH{0GjYJ#{+9J7zIP-WAuXEFEB}nm9awHz(uYOPc39| zVC-5GG?<`S2TMX=QV29?V3G#f)UZ?ylklTzRJEzNbqZLjfJq9-(11e&aq0{;9j`z& zZ`G(nH3nR?Vq6kj`a)t1&gz?Jfb2d`V-|31`3c5@V z^W{(?hfF#6Wq?)XYG_fwJOz{~Kqmn3oJOIN$(1tHG77bTpkKZ$EfawEoy%`CP5(n| z#4zbIfKSPMwcAghrk{V){~%rXN&i2ns{b2Y-qX;p`ycAtNks|fM{uq(m<479Q(PaE zVfL;xNzX_EP?}3@CgEDgAN#72K$mb%2Iu2FxW^$Be`v@9fd-ov8bhF11I216Rza~6 ziWQBDHU-xpheSCv$zYKTEj@6`ppofXXyl-g!a9H@fGQpm0h$TavB)L(G=NX}<=~aW zA_@rDR=n6QF=+;VDp@ z;6J?bqB$H`QE7*KI}}7ie&qN_DlL|JF@kR`wobBgl@=(pfY-v7 zNzo4efU&x&7& z-LF0M=}X`izqzydrS0cHap%fcw+UbNO?*ZCTDy)X{ey#H+1#Uoe5-*m4z z|L|8Zr5lsWDQ0aD{_hgsg^@9V#8r}@UTlUY1uT=n8Z*@4xgO^0!KjFUFfLrHv3^HM z+$aDf{s=}Ond*~lB4+K|VfATR2Nl(hj#b^F2liYnv>YB29V0HMYx=hey;r6+oolJ@ zx;wq-RGyxf=(cT;Zcfq^sI(=dB?J<mBATGi2;+=U ztA$c@uvN7xnn%GyVG-ck=^_H5dRL4hAwm;}Om*EV8Dc1j2E%j_VUTNzeH5U^$$ z5c!TFVq|2ygb%9UJ^rplfmgr{(_TAqNqp|t51-k2PW+ltRvR6DM zKJ*zV4*nXVprm^ZqsX(}t8&|Lyr*%lEJa!{OZ9MINt**&?a&~t-RD^#&kQRt@Ti4m z4b*C&2`yL^pdhS~0h%Ujov_{kO?Fru3WcE)LTLk9fo3Q$!+0a)VW2_VqNObwNWdpC z;wyu2y+eUvYt9{w+~$%Hf_k6LvKx%u5sW#En!#%$=`3efF#E#=Zhtm2eg_H9%wSk| znjVK))2w&8(%W1P$~%nq&ph;qGetDR`EQ+yiK7mRKDw!Yz0mv3=;^O5iU`l1QhEI4 zoCvFT-u^8gITT&T9VuH&a#5b34UE}3Uy^KcI?$1p3oEl=VHT8R!P*RH$bd;1FfI-9 z)1WxDF_o@QhT3EplK`Wog_l|bWE#MU;#UVNG*G}n3I`2oke3EaQXxJrGmhG003Coy zk&qJ!6^L^K_;s~9ngWoDokNl-EjmU8LZ&t~CO$k_$Jhvc-Jn_WHuHLiy@X-J-Hf&& z>;+?#gX_yy0g)F>2w-#G<&!aN2F+bR`pV9D16z~DS;fD6f__vorFUAGW~px)tokNb zx5^rNP`n}@y?;7AK^?}(y01>oo~fmuq>H=7_j@-z1B*Ix`PfhM4Q=TTcXMuJXzl28 zzTBP;tFgJa<;<)xarX7af#o{w{bP0WDnTzckNFdZ5CJ`X!n1WoIkORY4!6Eh1&fQLdw-kLQ2=5t$7UPuN&L3kmNvUi4I0fjzl^d zvyweQ(4b(53@XVXYXajDJ|+a&9Q30W9DW$ zu41bk&Ty8k1$?n5LyMkm4_whXrSwy z%Y&DPRUFiEFp&d4Q;@KlLIY|U3Y?oVWlt-BCF`IWSWBQm1%4I8p_?v;QaRM~uz+KA zizzrMI%aB(mg8kYh*F`Z3YnafoNh_EGOru$IHq7Fa*lA)B=$w0X3(vXxK}zKc|p2r zcQ8ANp$b33*B8Yu@u`bqM=ylK`13FgOuhUY*ZhdPQvNwshVUn(BmUH6W8l`g>SbzL zuBubfg@a**Rv9G80BN^WfHf5AC~hoi0=kkwIRPhuWlET@gmmR7CB;y~A`ZrLY+h4P zsY7@{A=juR3nFOZp#O>E8)7g9^G$OT;g>!Vx$RW{pJJW3;4`Wh4WB_9bo_~m{ggKL z@54-*cl%G$3S=5wx)jDC{0cHFkcW~L1DA~w_Df|eWVBjn5*RImmih{|7RW*(2w^^Q z9Z%&7TyvKXO(+ciOOdA`bvgn(Hot;g81{Vs3tu1?c7IAM7!2IbemCyHWb-u_=W92@ zq9hXoY3*`YFNdXam>>s_9M;L8lfrTewG>JvGjJK8^{198&?r`-Ifzyjze(0J{6c;QA@*MvhyeE7i-7}$OZ+@j!d`tL3yZ~uHp z764l@6niImX>sbLRGOPSE}6z9LvhliBwFmAf8DYAkN zv9yxR))Lub8Z+YzW?zQWk8xQkHajSX`SS9VeUX$t_3S5AuIDOVu%#Td%8oi*mmECp zk(D-m4U1g-ETi~&Nte<3o?Wrs?!L3Wq^8}}q1D|_?kabj#3FE{2J!csPe@%NaF z2P)Tp84=yTecF{XF;>dQE)9>}5~G}(k0e2wEJd22uZa0)HWtOJh=qb!7#9hCOst57 zvPj5`gmG3FuZ3tu9MxI$_HdoXAbG}U)?n;_>8iKU$GLHGnS6%eAep9#b6Fg~BDI5& zCT3|b?QVG&WNRv)ZF%H_)%QYg_vG~5r89e`XCJ6U|L=|Cmv_A`o_wI@)OPN8&w@Pz zq~8DVqE6tK_>fnN(eJ*1d}JftftHQ2urL<3M8ooEm>Ug6;gB-Y=}5H{S?ERsG#jAC zfXV|szDWw2s$gp$DY8Ntt>j=uEL3BHfdSkKNXB3*2gd+s5ljI1CEMi=nA8JAtBX@u z?R=!h1lk`7zkMHbV7$$H9SJ5M9aO;>Y?GE&L%ElGB73sWl-m#IPk!Ii6WUwVEPmTI z?YT8w@2yfO3g~NRWBK!QI>gUs#{m^To8x}B^DQWUpk}99CB7Mkk-e`HxConV1{3rvv2sDaucAzbYw zMw2dDjyjyJL=IUJmtX!K#~vjq<7LUL2#(3XhKp1mvM`u`_06GG$3w%#Z(1jwY&m>+ ziTJx?)7&b$cii0WNf~#RGADEQ;|BWY{g)vB-s+>&)Bk?g#5%kEpN-jF3wA?DotN?K zEy%MGNdIsg=gPqNv;;_VLbd~v9grIfsS#}DB-aQjM)2w(RSS6=PdJJyk{l9{gpu<<~sxhd(e#Z-8f{tDA)&+XXG+I zqVKOXr>grxc~463%trBV9g|;J`{aLaaff^Q{)^6}t0&IK;loDfK0dn(u*1so-zdf|Pv^QHv6$$A!S_F~*Y#`0iBt06;;F?;3~Cn!M= zR*M3)PN-goW~GcrX(m~e!7$cYmQ{Nb?U+`k*-zkrb{IIlahR~g!?Pf!G&H!d*D`EZdz_2w>q~ew>?*8%Sp=# z3bG(GwKSEEv#?m?m{h1pg8U?wv*kk#r~{14?80amMpR^A&7`?HZL&Q_ zWlD?8NyMaB6f*j^(Y!!OgNp^sk@`N*GHBH@hGQ%^ylz_vG99pmTq&%LGfi4D8X<_d z@efSX>gIi94Hf^qz@a#%@mH)lT3)#3uAJ`mGTGK+Ek|E%6W=&d>3%4G^2u^%S2myC z*CxKQ$!u!X&=Y~llRbI0(=KE`X5lx`AH~zUf9pIZ0g*5EM z1cFa-Zd%E@!1Q%Uz+lK@Fy7(S6l*4FIIp@`JxR@ZRmG}FDsH0`DJ+nTTQqUHbudl` zIXV_yEDV9<5a>WF2X|PH3>^j+dTzwgNakg7IVf-}NcBOLgr}X|jaxn0pG>xQj~O++ zr_zJwPXBA2k%~iwlQAy+*|PNXpHE-ae>|u&wjxvda4c+H8guZ{lo*x6bmRHRkOIu( zVFSn3ECdXF->_VLb_C(j3&H-Sb!%UDcMqR_?JYhXj=YNo7ajNjlhyOEeI4#8ni9wy zWq~yOm;+{7s)W%BH00OwyLqmXhZMe$#|%iwr;tQ3z-%N+vsz{{VqAzN1A+c5u3%qh zmmnq(2WBA-wUR%WwZfp-+bv$z8X{sHvU;nkyPHqH`qd?kY(E_p?Ugk#sMtJQiFP1| zaH(-u!0e5379rRuKr@b6%0^kvGuNkt2Oke{Jj~-@H-&f#ixsd!zFAI#;Z*caI`AgH zoTmXE;`vOTZUK<<3Q%cq=>gp)B`5iT=h1lxMi0*f-KJq1VsnY zu_OP=!f>u9k&grSZcc`VWJpT}YD`S7#)QS*bmNe)pky5CYBP>YhpVgYfvSR- z${3mw1LHy=CluVFP-LEHrd~5t8ll(-sYa;KLW;IfO9w^bL=`Y`NHGpsPGLNO(Gidt z0gec^CLYDx%^F*nLjT=3@b^+1q`cqjMvC<&qm(8?&WeJI&4=R}nv1{C3N;V)wquUvGaAYC9_*cy9hC@$-4E6V+S6J;yHD(qakk#j&z@IL3S{ z?2v08XQ!j1Au}5C!ohEW0t}UL5UY$ga8}}oH0n%)D{yBeL;4jKBfPHNFwX@&zF|We z0grP@R@Dub^aE=y1K&FF*OTi#-gBG4Gh|Bp_mzt!!ru?S@ag_u@s)c=o0SjsUlf)O zn$t(op5mAI8Qgx<&Tm}`qmiwneYHhUT_g>z^wc1Oa7aCp?pc0FOlugwCO zY`ES8Z3bw=H7*sjDWFXT8+aDo%d)Z%Ke8`|iv3#VA7iXoOQT7gMPWDSHQ|6RG1^#? z=OAhGe?3LPVHjyt`h5Z;+6^`(x)S2mHI>h_9C^R>km&iv^lUUJADfb~f3#RabGt9^ zd;=;Ts5#czakOqfT9Rz!A$93NS-2Y!un)&>z*v@Jv2vY~E>^5lP+tfngg_=Or4(0o zlqQPrGtnEAfC=T-XAXMvQa}gg%J59FpaFvL863MGSh*@PI@EI@Ad{`Z3G(9UXqoI7 z2Bi3^Px>!ObG{7i^(V0JH1cKOF$yn;tT?%t}H( zHy*%7z%EsEyJ43LR=6PF)!?E@E?DV=1}7vt3!L;02W*ao&5_U?3AK^1EF7xw6V?<) z=Y=j0rTLP5jKX(|WO&s};k6Y~_K8QCucVs+Hlx>LC;E(Vd6+vLxRmf{b39teQe;+I zqLggpm#?oJjgX@^o!%sQ(HD|(l#q(Un_;9}{OkGGUOJS`h^{i%enNJ!%d6QM9e3o4 zS9_}dkk}kePlUvm?(4}jFU@)I>wvANW+%AI&77>KCfYtLMWJxz?)7B9GSd&0dSkVF zY_;7r$EA1WFUqZYe!B0iY}9E{0~e`6sFGyv>||4=iB2>^vJrOTJ6h;s?K&+j)K1XS zWG%jm3{tI-AKDPw8p@@FqMy`YX|-@E7DzEeiiydsR0H5Xj8rM04a#tn*~;m|3}7Om z7Nvx>3(OReBD*Xcc-<%oqG}jJ%pMPNcQBCPXSO-UX{qAL6jQ7(c5=Z-uu?dn* z5D0;Q1_ElpB)NcOXQB#8rsyOU1ND+(Lf2VgT_}tSfejkipoTpP$XCD)8KBLD$|O8Q z6^6^!BlHQI&?D#b_vu`F&{1URlq2HL1|RqSy~_`|eeX|0wUUy3Y@)mS;Nb`*Ditoj zU(uOvdT4qJt!B1}nc31fJ{dU?Sci53Tls8~bL}#~R4Jbf5>XZjuuw{v$`rsYKo<{N zc&Ots3lEZb=-^n)Iu+L`C~OC|zS{tpY{RIxg}@3a=!>a4D7)5TbenJI>3E*y_pFn` z+6s(r%SVQ`(aJo}%CO)bCgx4kAo$ZB4Cd0Y&xl)JfEe(;fG)+oTrh^F!MG>V7USMo zfe)LsNTQ|?it+D-8gOfJHMCQW5v;XpI$zbSqA99E6~$zl8YPTTLZK3pl(1I8a>ptZ zfQ|!(IU3}xa+)LuL=NtZ!F+m5_^ij2dI3@e*oG_I7)0gTIf~h2*&MVmBcg#)sTmBC zV~CvPRA7)?P=Op>Q%qpR#epGP4SDA}3U9#NzsBbcRcG7L7e)j}N*{jdi|=7d-fPc& z@aDx!y)SSTeV9+%_Zx0BE0PSxTs-bo#J8GU3G_6Dz%Ow=Xqq%MM~#ZDQ$-i45UF{} zdL@V67RI5MFsv3S=n`pvg5-u5%Nk|eF@f#x#jJrM0lb4u)4)Rk^HCs=!}p(cQd)qo zCc=3I>(#J91xJ*y5$UCb5+!()ut5Ra}SxR`J~xGKQFciMo+-dHOSG#>G|ftCyfvyyqnh_0tzH{?ZHgi#60i zwPGuq8zd2Jh2J5*Ob``#%VtTlP@9>#X52OttYqs?rKTDa=QP0zG6+B+gQs*jli**YwFyd0&}w86yfOpq(8Cit*r7Sxnk2&a%EP_x=Dg{s>Nk+=wxB7Ks@0F)<;~ z2VBG{(UDR-TyVL0VvN=!pz zs}aHVdA4GM(V!uTbpw}NUzNZ$kWKWSzC*O5A7#?reSHV-<>+0~yg4`^W8gI9z)SHR;s1me;cl^4yoA?!#kUUz_1eLK`ym4CNS8m53{+>Fl%E~VGPd)jt#`f*DT|A<-8DWTp=SQw|I6Jq!Rf4>fAH%1;-Z>^ zcmH#JQE|<|ga1T3{eQ*T@Cfn*dtU-E8B9Ktf%E$;|HPLf^z?|c>9625F}r^PKQNe^ zT{FCkLQo*l_QZMoalE`I!MD*a3UKK+xwne31qxXbXw+&licB453IoAzi%;YNqN{~)c8 z7eD)58Tw<4JT(LVI5)2BAwdF!JF%cxQHjn!|&tJ41P@NH`T!A-yZxYeY~ zf@2Et+EZg~$w~5XI(^!xq-k|Yxdqnn)S90q2{J>@{5z_nV{;3qHD?&3?y8=&%wQg~ z`ES+9S$TncSv=x-JLoa4S%*7JlM!;ci-C%Jf7$kJ-2cl)fct^jaDeTQ9QH*pn#O&y zYVnlTCDZDf=a-Z;HaE>&vTDkj6;1vE@%fhGa7}e~>9SF-c{#9U>Ec4)qL!K&t6OF* zTioQ&UA(GkTEl{BxUV|h;b;mtXXO;H3dAuSV$5ke?kNqGaA;v!ZkQ$Jm;NLj4BY>U z&%-G3`Nza(p$tomxb9)xwlw8oaWl=mW!+TqGYFr$?iQNge~k+Gu1HF%#7Z6$x=0C` zjIAOkVlv6lNQM$7kN|`E_KYaLA%82=h3{~b_OVOokf><^fzi*&{2r{wo$P6Hc^lJB ze3ecMo-UXEqj?H$|AMXO8)6Kh$DH}gHhGOr;v+p;dN?e4=FWxN-n`zR zo0cz(~W`$UecI8v)budF!ArJj+%@; zbq4LCy2CY^Al^+cIsP(fW z4~Ni0clSm{esbht6U^SZ2hWIEcr5EX^!oB1}(BY`i8J7=z97(`F zaS5(eaAo@OFDttUvhyH2!cA2O zmMD&W$H^Sh#o%@Jor&1Qrh=dA?Fai0b~^O!LvZo{zu6}=!xsbA7_bMBRlynxokF2kYC=Oa z;hM0l2)RbaV?|t`QQ?8dj@_9Gm1>hhFH`Cj3WGwSRqE|}LySQasn^>L5&rP-D4wb` zD!WB`kXl{lAYk|``}8hQsCXWe*HQCo^g6xI$$&};m@Re&I0H+@$utTy9i?+B3qcTg zOgJ*c==9+#m5xEd{wbnOMrSCV;NXH+q|4G5Ctc$eJg=7EmSNwRWkGQmyb5=j$Z(u8 ztwI-yz7eG%?wHt;IB^rET(gSo!&5=QBjWCUOQGQr1WmYB>o5&Qlb z8TJqP_f_&9_XyX4eje^kHu;?vxz&;#JiH3o@4dH#eZj?(SG)1wx4{E4I++Qd(gSoN z&TL{rfjN`r_Mf8@8&D_lIM=V?TyMm+Lp$bmjKk_oo@TK9l1%5YzhJ7Jm-@1@(QzKUgS+#^YcH{#!V}w+nBuv13|^oo~O^%A&UMizgiE-p;zG=1 z7ExbD47HfG)Df3Tv&}L1yNLQTQ}MT!wkKECgcNy{s1NvyZri9(*4&zE^^fY@`OR(+w-J zKK}T%$<)4_M)!ZZy#FI=zaL*qEq37tsxXTdhk)KF%RN@%hKwgl_RG z{5fz+T*(Kx?F1v}PA$iz8IuB>JPu_{5oPiVKPI16K#5_Ih9`-(EThTCX}RGmoDa#b zr6{|#C=yc<1N45QZ}fEkqD7{VNI56BBqustAtsB`l57xE!jc0~3E?4f%zxK8@{&uc zqN5WvG%Ne=<(yJ3C@qeNEZpe46n|uDARbq`g73s|qm2+j9EcWaITx8aj)~}04!N*k_mS2%2T#2=Hr_YKKjun7KamtP1TC?~#h`7*sE zeQ&=>`ZCApioG7qvY={2?6JNvd%{av1!QceYwnf zQ~ULhmph}VA>Uz(lW*jfOeE zP$UiaOouG)o4Q&RG{A3enVI85?aAY$_G0jDp(ES-5v_GoKglt^(FqBqzUXLQX+pwi zU(7gTtUD|;DaMG$&@gw5=|&KEC04@9qZ3?MIVPjj73PjLnqu%7w~al6c&50%M`U|Z zC$anl;=^?sbjpTHw%s7_eTn{_+tPnO{8Ng9^!1QFc_p}nn`6GKWFgAKAm;*4 zaK7EpgfBSTMz#_^G}VH0mp_a=&&GpXa6@Z@UgpT=`cDKoenfNJCW+kmoJ@q&3Y|3C(-m+Im> z?3kUKJvh!iFU${)F8IX%ju;o_|I%#PTT=V#;8QFz!@OqL^FrL9<1BUbvmyA|{HJmQ zMy2f16RayA7@R*Kb_6=Or>x)h0}_XUb$zqh&u$VpL$Xe0!T;fht+gj$uRp%G3lOPX z3H-?ZF7ZDZ(q+*679!f*@`s%DUiS`jN&)Kfs*Pc;Die@ z#E*k=Cde;837T7j>@)A{X-b1LQ_gjm2QF1@j)6Tgxmi+$e}%9ShJ|Awf7d=gGbY@7myYW_`7Hs@GTjtN#0IXa1}_ z@L%`jxsy_U?TGO7H$=wFUa{iojxzD`tQE_j**G>X%ti0C(hE`VF%W5Qpe zth1m8jvn3j?L=Y|mG|DX8%eZF!m$5)_9O|1hGe7EcK*L?n^|bzY5R62JioW;TL)z+ zX_nf~!?vS-5bi;%?K{nH7!-nGY4DZf#OKd8NPaShD-kg?npx@SKI1Wl#^Sm(TIIoOGUgS#&~lFjWF*|l zfWOdoM=u-wX-;zEm?Ot|067eODHfy4ct{>o;ExZ9V#8LNCbT5YJ$m#Q-wK}gIWpQw&6 z%S%xkwFgR~xbdYsHmynzPmI(ime&^Q9L4$mFhhJ|N;ow;Y*8VKlu5p@+`#BKbxy;r z`Eo8aWo&wsBi9{)FWSl)?cigI^0TbI+k81=tSOe*+?>LA+;M_2JVoMIe@v)5CoZcg zw@(#SGAL7dH|}X+dsgtm|IghWOtJIs(xh$wkG1yzkgB}e$LD$Pw4I&aXLfoo+bi2= z3w42|SwW==(gZ}McN=ZhXksi;q(mtJDdr1ZS`-ix(@aN26VZsDN}_Rh_J7_xy9?NV ze*a~dxpU{voqON+yr(|r94BKx-SOLD;TL+p=t-=x%AfRyPxz(mS$XQVcQ8CGz1EQa ztnMcU>uIlYsW-Z6eBFOI`9Hkav_z|YoITce+y&BIV_u;necOCK{CA8uLjzQf(o zHvHm2H&64JX7{e}C`VUG4`#$vMn2HJZ2tf2Uieb_UiY$rmfQEbl?6R=j_%_n@jiP0 z-{+)j*?zBE*_Bz^-|KF|SI9}apH<@hT>F2%AAF74_5J3mZOAU7QM z7Lr%9PR5- zWA09ke5S_dNX7=V3@v!>$r*P!{Vq>_b6KKHBMnR#I`K#TY@^lZkVUHpUNbVc=%yj{ zCPmq!H;jCIdfmL_;3=u9Nds+a**v+vuJyXsl>YjYg{^&3_)YIvsPUGvnG;nibK{Jm zc_aEo@`vQsMhpv=uUMBu>8Ns*UZcup#>FEB&7DC=f4MXS+aF> z@A)IkD{rp#`D@azEXgZ?OlKf)dsgYx72YBWqm%uYPD#11*C!c7qxNk%W&bY@1F3tL zdspSl1A@=j4nLo_%l5aCbJ8E&bKS8;KYMe5GOI3K_8q+i?0=7WrKfLNoW3wB07?47 zP4VBYrNpME#;wfGy1sq-cX1c=$g20n9IqIs4^fTHgk*W^h~ts` zj^okg){uU;ODWEXvTwYa>${ZIZXQ?AH9s6D@m*%9#~t{cF6m%~8Gq9i;RhnqWu3pL zD_ADx9+MBnPyPqdhca%-l1+T7r5>E=QiEs>{fLh36k|%<-$H7PiTf*TG!?6tEaAbW z&u^7_$bYhz7F>z!5K$xfPsDR(R0RZ=EJU;~+*NF5xzLT+U<|;9Ta)0cKDvbiH$YSi-SKq z{rQStq_;iT`Vrw>$EO?{DrmlU4NTq?i+qvPV*`KmY>FJ z8T+n#eH|oko;Tx9;uYcv!PmuWzL+V}|ikZ-$!Iakl;@ijm z>zpOua8c=5Uq>L{a+$yX5~*bT^mM&N;`Ii3O!?cWrQ4JE4Oh4$vrxWm;>ev!p#oZI zUg|L*r-JWYYYx1eLRUpxCQm!Cno8pG&IRfGuF|-46u#qe z@TllY;juy<9k*4O2=5Y!3Kd8^6lO5V?o~RDzbf|^Yv-ULI@X+XXmcZ`z&T zzt5=p(q6%vB2sB%`l0`UZEP2H-|$7quW*<68<4CgdL$18QK=|#xTxW>NV2r^ABsbS z-LUa&@Gw!i+)u2@Ky8D3HmVPl2|ytrXBNG&q}XWCGsU6yXYWh@C;giz?x&JirBL24 z)OXy)uIqTdWAB8+WB>8Yy0`zaZQF1E_0LzSczPpt{{6(ZbZTo_Eq!2F`agfB)+len zP36ssK?EmAhIRf^(IBlO-dHL6LC7aWKcA^F%w3Kd&!d50p4{D7USZ>|$w)Vpj-%ly zV_X_m5xe+nv0y`@YxO z|J!%uBg;mP8hPW2>-vX!Ma)7TYf%pwa_8LPBewsttqqdREADA(tg5{J=4n5AH2u0_ z)0olIXE-m6u3Dm}v8GUk z2&3#K3}H-99hmkvGP8AMJ(%Gcz5_{qdZ@Hk_FFD1Oay2UD@vJy6(v;dLmUc)c$Yeq zD1uaEo<=K@AEXd=h0Cpf;T8KUcB{=h>*m1^1Sb{ua^;v!ryZvcIcw`~FPxs9@Hn^_0y?|zhR5P68?>ogX{*U6uwUlK6rY{yCI?QA4p z3j)!&l-kIjeCQz>0vZDePRTbj9@Uo^=rj3doNA-&0KzzZjG?qnXr#Ct;Qmb_MIF%a zk~v91s%nxWGs-Q_1(~mfOSDSq zr@!9Va%-OgOJ8km39nH!E&UN{sgE?dwo3>DllhKNkA;VgvAVpZ(e1Eg$$!16@3_9j z*4|2!EAAaYKgJ}(g^$^d;x*FJy6P(ZS6#CC@+ISu%iC99{#CcaBz=W<*&g^ArK&_3Xc%5k&qUj9Je;0R2kd_a zKTJ=4=JV#vJn`=YWShETuJoPD-{V{me@;*5U&O<^@dH9E(f{-&%v#5Ow+?rwA6VCs zT$iQ>+r1YlVG1^O1 zcaiFo8L6Lmm)^lgz~A-%;;Z=EtN81gSH(ZF1;U-D6o01q7Ra+7q#kcgl50dh#2HVI zYlm1wHwcfw!^A!0-}IU6o4%J~H!SaXEHF&eN;brVDb@5q|DbR)w_59CZ@gotuK63CRcv;sdUMN2S+9IZdxM7Z8+Aj#!&mZN_ znS03*)GQ|Jl#oxFTv!UCM;;v^hET?5l*>I4X~to2JZ@4(|ASmuaP_k*`a<0hthrQ7 z6AL>!m^EDD)tLypd+QjTE}rs~+RS>vWiIqkg?2$E%Ql&oLa-}j`$qaUrF3W84xUzFXc@+K0 zjfAa6zQ{%3kJl~^h3g7b+tN#D^CBAef+ z2*TvI$kPeRXjBM2Cx(`6QIB9_?qICn?EL29kcJ9(nEhInL#Ln%G|6brdgaG+6V*z+ z(lad2Vev-e8n1y6&I-9!CpSlJ+FX}oa8dCKi+?M2!29Wru@dDV68Wlou#x`{Z#r-ug&XiH#ra)RB}C5>HMQ?*OgS7jueZbdR9MF4-m0B1m5|&`nWuFU|?EYfj$yaB+WM zp5YoIhkRFV_Aq^wqtZwA(v;4ZGnX)>FN-0UoA{c~r z>EI_n-_~#9Tu;A#4c4i`-t&;IO^U}1@2-uYS4l4^H{p+olL`S?@X zHucAlL6QE9)1x5%-u+#_M~VJl_%%K=g2-t^Sx2zE3>cWtkl%7%I_Rm-w-HUJb^4o4GsHB9uue_|@k6c^Xl<-;$YgNu%zpmG? zGN-R%Kq8jvdt+m;Ks$%7Q!4TIj7ury3Q?4et~3jxR>hHmk)S+SQQXB8N#1l_shsF2 zW3)xSIC6C9yVCbRY;7$IR>f`oMieWpLtCnAdez(7EJaN>)byLwGBhDYX4n)J}ynS1!7uA#sZDs&as2-7R`!lk)YwzB?tCU-gRU!&Bkg z+n@XLm@^Ug+Lv@7Qq1}4;SqYjn8EEY_Q0s%ZffF3oF{SDbl;(m{dr}_3yT)9TkiSY zBSU^(I{t@ar~_bq`Xwx$v|(m7`|We-Pxehhy_u)Iy+gPWok3%}bvkmil8eHe_=JsTgV0Qg zyidf=QmP2$j?klkN0}){Ba@fWofX1Cw^tx;IYKzX(@VM@lu$z3^h{A^e^~|O$5_?D z*9u4H=MRh6BU-hVYH%ve`oN9l<+E$_K0W1D5D!smomzU--I|Cc2<~dPno|jL#HzBY z)KG4{}&STPaV8DRDEGY$sa|8COfUi#|1H<)Hxm=~zs$q7!T|~|f zP*Tc5BodiEK*ZcqItC>?@SKOlh)Ar;s8owbvG&5yfB`(ethw_Y;h%CX)qUXEMwD0< ztsu;XP2`JRSZN;jpon@Gj-B&Q3b+fR{K(*pGh@cZ3MH-24qYf8P&a1yYrexY2nA(o zPf^(2f7o@&#${FYH&!~$`2)&p@9*Dhda17}F}nT^PrzGI>YG|wHOULcx$EyinZ5=zf$L>p}vGkFQkB)VI zl3padDOX8WOP-@~6KCHLEz1y(C}%ha?s?FDdJyIHAhmloXs4m)xXgwK*uDZ4-b1@x z`{CwffxL{3Ro<|6yZeqgtg3aD|Ccf2e;*-%~_r9gw$^tZ1HpLY_C$ltMJF zMEg9p2b+QzKtN0_l+p+j%cr-Y2+3L^q>@oT*WB{*!rM0wA2O;sJ$2}96Bm8-$okLj zmF?ASdw$2d%3k>6^-Jd6`}tG9On>}iRxtha8;4&%gFon}ueq-Aj^^GIgSIiriuDt2 ze`)+}rgt_PerPo74XU&m*kw{HO2&+1%aNN|(m9A0hyf zP#K&5s!Ju8h$v1uopfDl{Z8Ej^B2r13;*E6k6RmhB_0~S@W73R9qK!7TQJ#bEy!7M z=ttMyc4Fb#KjJ4{*IDbDGHXI}ZO~2%#nQoj=f=Fre)A{Vhm9Im5p=mts!&P8f>Ad< zece{+itg(q+@Ev@jj5VjHYH`$UziLe0=Uxu%z(w&#UcIL&rof`S8foV>o}G9solbs z@dLJPYgbI%CSTBfE{b;vzomQDlHJ13B@brKRbJ9_wiw%R$Mxw}VSL9+x6hr7_tGty z^F1sm`!haQS~vl&BrE(hwZzjbwB?bO&}yV?ouHgT zyyQwNQ}`=US|^hTs+_QClp^*kX2uZ{M7FXi!nPNCqh^s!U{ji{kX@6|9bGQ2Mau_ zJ?uT#=Pve{1uHEVENqnt)CXj_ftNYl9ir;u{P?gRpZHMhd)CJ&Ty)ff-5xya!3qyG z2*qg^_PMatg*#oybzzxUuO}}D%bl3zM6MId#e$|mJE#;((1t};1g+R$!8{AX7Hl=` zH=Q;K)PjDi0SP^p@tOx%rsl=$?^E*f5s8S(Ei-HF&?}5Fr8h6A&LMk+mjUQ1zd^;3 zsZ|9p#nDp^;OdGRUwSvQtH!~XJ_wbS1_Kmz7wE}mt%#W9iU`l{wvmoYVSH+{TV5eG z8O*^z8TDf)W{Q?nDkZCl#|o8gieGHZ($DPe_j#Uwa#i0A8!*Y$)Qt8m514PRt*NOM zUQFi672Z_)Q$NuNKUwBf*;tNLs(o;+Z0bZ=R{GQS!@-15ey_nggou^(v|QQCovERj4aMT_K)NU~~LroNbPs zjIjq|U8SDxqS^s&oXtT^&Vn2k%fVSE&N{HgfvJuK4o259M!c4Q4fCzoNG)3}*pQ<3 zRn+HTzMeXR&(>m-2FJ6pKAV?`p?W^KO1vV&DJk#kN<}fsbrHFpxss}i{Q8YER3MFA>65?YOGO#8(|4?xO;HR~A4AC#Pb{$RqLzSA;nJ!>6De z2#b{nO3$6m{GY|l(H`6+4e|Es)N6nzzXbzQBCzJ>re)6|{9DYH?fFCckBL~xbEac| z#b4I+yQXj7!u)jk#XT5GY-iB0@gpKGU1g=9yso4+y>+0_+?)Q|_dj&YuSV33UvTYh z^Ac-zGx-}RU}{}BTvtEl^(D<^(<8m-j>t_8cbZ%7<~ggJfAD;Lg(MG>)NUbx^NCLq z?4<;jC7w;N*$I@ynqn*z1B>C47~YQI+1Qa7TOPxmF}&;NwRv+Lc;10esaCZHdo@UE zwrJSNZ2UAEx!E|S!UgJ`mB%YEE=a6S>`w?QV!LB(ehiDFSQx>c9ISF;o)fFBoC0DR zgw^;w8!u+#zbd?~!hf@HK8qJXp>}azMchJO5v5bDMAYY&B~5l-Lorjdf~sp!!PvhZ ze=7^agksB13g-fYgfZk8;332I{`h8r9EjCjezzv?8 z#HZ7Mr~1-g`j?wF;ZuCdnwrxOrq?b^wGLTWpOqN!r1{uKZ!|SG|Ly7e`sYxRe!9aN zkF)pR`uT0W*>qp*mb)~GRXdm*WOj+`KYb(np*RmA$)~C9$2}+P6jUuI`JY@q(`aT|76QDnt23wF@rq4tdyoHb*M84pmtz7F$r*rUJ; za=akJZYlN%IN--tKMwh@&4(t>Q4b4wFy1xW#R4uIaAJWIbxs_xBW%N23pRJ1Zl9T* zQsATkt4IIvNR!uTX1wOH&BHi8vCzh%-uu(b*sskSv*0$dMHFAlo`sSv{-`j zDAg2n5Z)Jxe-Mq|Iedioris^j*fgSWtMd(n);#~9aJmou{rADF<|Yj##|;`gNr*k6 ziI;6NpE{p@xxH}c+5+B7<}$sj~+i}i@x2!m?!kbw*r^GQS4huL!Sq9~pU51HeXevW-8G>avT7o0RSdfcXk~o#X z-UPNJ@IZp(G0sx`!uZzs{F-qYmavU-<`^SsI&Y;t0y9d}xfTNy3gJyfRBg2@&fF=MwG8_hUI zs+kGnO`sB~R3&PPe!iaN>1*|a^r=GOq810VRQeAWsT!4LuZCSz>WIkva5ofkauE3di??`^306&hse<>|Mgk)mgf2Y!c_ z5)+ab zpTOuiM#nHZiqR2l4DSga4-4bNU7RBsz;dw-bgduDsnsZ@j`@)9L$){RZSe~2UcBeU zR_}iAX|J%z%j>{bdO(F{Wp2FfzT{>{-FVi$)6JH+G1HClZYp_?qjtpY7;igfW5g6@ zSaFvHTZ~wqjoH~4D_V zTA5aE+Vs&e^OFM-Sqt0R77D*7ZKwU+KeM#g(}DE!82@x#{nPpI%h`@q2~F!Q&3886 z(j^~z^b{XeQCuW-<1P2cZuXKJ%iMgR1nN02%?ag{<_MqU;H@0&%sG<7*5_~wg&4}M z7GzVyLoXJ&G0lxWR3X-hsZL%ec8UYH+ZWr}A{(Yr$ym!83%kvNHB`*lgvll>0`Ew# za2eHtRSBoeqce*o!}x%bDIzYaFY#4AikR7@Ux-86qg#NOCW$g`Qixk$QYY{^{*%!q zuFxV_10GFJ>1g!(*+Dqc|42uB)Q1eMju3T+T*=8)+ms-l_3!jEqQBXGjP+xg_gU{w zuTYxXoXdi_I7T{MqA9_S#c@1_(pYnhl}4H)EEqwyAMJj;N1eL-r~PcQAAP8vtGCQc z`58FoJ@5U*D=Z{Q<>?y6MJ`OEN6x|=rlLlYl7$k+oME|7t2D>;NjoRRKz29nWd@AP zqD%$WZc4kUTl?yvvo5w0?$V`^(Zci@R>H$ljvgh#o0?~h8k8T8 z=MTJT1`Xd6=3^HjSvYUrLNKn3H6h(ShLh^+CtW#?_#Zs_)Kf%kR9`7QL#FGpsVm9k zySO2_JINwRoQPvW93P2V@VeMbF?MSVWigO){BacLNghP8T&!<<(jn7_-95 z!fZ?!9YO35o({5YLHs*_nSrGNHZFimer~1TCC<|&A5MGT_ppN=Z1rHR2h%(YJ#4UO zbRTeGiwlEX(_9N(Yh2Rf&bOUxmlGSDxWl>J$)-CnkREm%vtqp!M=V$;+S|Vr1xbk+ zA!^^JUZQ4Ws5GbYJ|!cXrgkBfd8&|L(|Q#-Wu?l9F`*6+|LNA|M6*dOc6p3i0@1{M ziOhRu?7MDsE7;sj;s&=Y5|-;2wO*l$CP8@xRZb3&*=^-!H?0wFDbXJCSh4wi`u6RU zezdN4ESSYQRq21)_kQcJX|fIkS$SPaQd) zi{nY`rkZ(4TFAjK-^j3RWkWlGI-9ku@YF-!| zZDjT2Vp=Y?C9yh*g-J|F;@@%Xj$?fsW8<^p%i_Y@(MwUbK8mr?S{cnp@|qz^A4{lRHiODzmc|^q zP^QW_tvf0b$(J2(G4LHk{#Q$N(vC#VZ{pIL+O2dkF@ct&g>y0yTSa<1pGqpAO@0!O z^7wHj)pf;2*+`apnv^w+4*w?3Tay}_=O#d(s~Q;)wB#y>)MGl;hWc-xP+^*E>dP{+<`Kh&}h zHTYPKH>G%6prT6Hl{lJU8xpu9u{^vvNf_laylYiP69iG(_*!L zQpV=n(Qd&9796siwXkYSi-qM{@QUU$4ckYjR$-3{&0>4CWq?}|%@qP#GqFgQ+A511 zGOUibp5fztm|nkH$Yz$y)#FSkIB|eYMD?^OidGs|UUZN&YmN)*ULDkk>9^JN_i>-{ z>t~!!)u;D7c0*;aKD%?A)5BSA%kJH~goOk8_wQ&l77W}bBz=MQ*V2C(Qfm5<6q6L1 z8Dnuu*t&(WEgh=}0(L zoZPONsa~pPLIl?qqvAh4Bz}B54w5~ui!&H^lIj$ zdWE7=E>;30HIu3$*VfhsuhdRvL>$|9?)}emV`9U(tC&NNbpGawynMh-U7P`>6&!?2`a9)qU&#_|E>;}#!a|Im`|L$1^UW((KUSxg4BNf^!^>z^bFj5@{zI#+qRuL zTs@jT`P3hf#XhGwAX!a%;Z!Nd&*&sgY)Go}WE1u^p{)t48uvA_U~Ne)lh)$nT1>1( zqy~{{{I>|77vN9~3u724dZ7kJQ5(gA2wEbTA4dN$mV|bM*b>nva4sla64((q95@${ zzUjvj{|^6Qzi`y|mXGc9VTBJLJMl3IUQ*7<1!Kf6BUTu(+i=XlmKe~WLj$jhO;>cN z>1>m*pb3MTP~C)q4XA2BvH^p7p`cfNFE*$g1IsYD6uXP?Y!Q|g;f^8{7mY1qTMPCV zu!RL!mXGoID9Xo}yrp@pI1k0SI2*&-7;0nOLtGKX@zj9`nj^C#yCcGq@Q(1|u+R{m z8D{)`4u^z>(995<9b6II9XuA4HU)84;KcyzO%lwHgMPI6LH6o$7nbH=Y!3EuPtaB; z8|x&G(=Iz3W1neXY8S>?yE-ONMfNtsA;VdNu)u&p2Hq^9O@By#Rxb?D&(pJNJ@@bz zDaR<6DtWQNc+fW z*gaa~6)XIEZ=y@%{KgYxT!P)!j-R*&>7Q1CGAu~vBtwVy%i|sKqGhGURFRjnY&jv^ z#h^hn!Xw~vs=3NJI98?_8dA7atFaf?DinX|^H};X?`)Tw?rF?_`f2&Sg7Em`&OvSZ zor7Z8QdU@~Va#hv|Kl;?uc=hMzPMNKvi4UdqLpbt!PiZzMPDwsLdc`=OBVQLP%l2p+UE`+c+)D~j>LwF^K zenI@phktqTFLDC9anX$#?j>&4$BlPgSRqDw-p#=WPJH0NMLSZWuhD0P)QXR+*kwgC zJuGOlAZ13e8GbXQW_%=iF?ySEM2ma1yk+rA8qClv(d^I&b9hnqw(LXMXS1beR9L0L zJQYqU-czuPGW<)5ivr#UUIyNi;Iss{hHxf?Lm{jcIp^{qb_b3H*zy3H1G58chCj0= zr44?hd^3DYd^>!HeX5rXBpL?{q z`3LC_ez#4gy?@+;k1OwkAbW26fxaZOvVr zE9B?mToOl;*pNhhvNgFlDdZ)wHI9W*v_?@ErLH8{7daJSizB42pANId)ES$oh&sOe zQRPL8XTE2ZXP-w}fYxS#2? z8)tHm=vkQiGP#V+gDg3NAjZ-4D?>{Gj=Lz#YR+&EnKr~A0skx}q| z^|N1pk&jm4pTtM2aIq2}^uomoBD2L&)*4wHVXdUuvBe<_4xu%;ILOWg&>C1AVCVd3 z^)L3bb3P0vhcNrV!@2847tWD0F9$nvKn|+KIjEv-=Q$^9buM#on@1L`^r;)_yha5)7k#?)Gsp09=qdBkxxc(ORAGRO)rGGBY2Ae+w|D2!+Now z#5mm@I!0~QOR1rx4iX(c(qV`0u$7k;3(qQXM2S60Y!F-AJ)_v6U=-ZiPF+)k?E)jr#vz7njCxUH9YF&mT$lbC z@9M-=;q@BK(k#=k)!Dp@NKN*@Y_=t9Ulw~c3kS2XJqxR;`$HD;=&cgl`QwoCtWubw zT%}}HVyJ(kg2&Nz5c!FGYJ&uxkkc&a6>6wl5x?yPnHT{k4^_s^A+jh=D&ilX{qFd0 z58aS&HX|A7Sv;VJY4P{sXI-D%M6Rg{?)Q+9BPv>MBL}yln+eJNJkCYzh`b?zLy0)z z3Dov|YKM%id_b8qT+LnH(07=dn~dqXZ#`I4RCL?*FWpP+d-Ck-gc6sl{q$4Wn}uRm zPW!3!U%Kt^j6Io>{4Mq5aywS!jD1cT^SPp~Z54IoRvOXz2{;5~;9TdQ8gJNikaBJ(7eS!eN1}qux=}afOXx*uZu(wjqV} z^;lnrQd1%aCmdmPh5zEEt1hywom*9wx zxmGf2sx5mhCoKZub=Dhq8IKx;4F+!Y3NvL(WsKSiQ3tDfDek7=Nr9_YNcJ-NWkqFi zL(CxX&yplZ7^MISi zJvMUX@NCsVLJKd?`>A0T1?c)1AgwaJRT~yPvyKAGz5zs?XSCSE7vqX=qj3N-x z2%)&FB8sbA#(}>CO_BL{w3CA%C{_V?%YXqbY-IKPAq)CGV@&q?AM5KMk^6Jb?y0?Q zK>GglLuhKkXZY+IGK(H>Ju*g?H8EkHO8~9TcDZ))zpL4GzgPau>qS|5OULssUp4n? zNh7SOQzykW`)V)j?}fd2C-c~rJiHRaJ31T}NAai@JG6LKi=!GmLuNL+qi%T}n^1?g zN-V6z6u#aERI*him{)>1vHN3eWfb$N38VjBKfB9)uls~sxW`5D<=M6sHem%PpgYa1 zzu4GyfRT47Pg1*6YD#ZF(tz9abM+7CpVv#Pd21}{^1V&Ru}0H$3w5kcH<-79ML#WS zwK%RJXJ>JN!XYt~CmOset5g)&qMZI(zwQ^Os(Z%1upc%vNeL1jw6;Cq*;~BWA1|Lz zcxJ-aQ9h0#Q)-DEkQ|vyAZG)mm<9vX94}5qyAytIR1q3f$Bf0pQp0b#zM*Q*jkg?n zzugL$%EHB zY=>>Enq$BYTiF~lo;P7LtvvN|H4CZnQWi#MJ(I<#XPYmpFpIsd#4mZv;(L^PltLfn ztx8ra!Nn9#rEswx7wh=d9IeHMT7+vMyiWt@k}Z1DdkdPLMfU`QCdn(r{F6= zX%T`&NETEVutRy+oQFfX*qVz)xtN#4OtM2mSQ5m9AeIHV#G2wks|RFqpK{?~ikwSr zE=+ad9Vd=CvD1kXXOoi$G^LFW-l+K>c8s+XWc8?xO`xck^`e#Sx8kA&{Vcd>#(UJZ z%|w)ll|*}5OjDy(jXE{*)Cj3?OnF|(?o!^XWD}L>twckiS7syFT1`CL;?HlYFBTjM zcT{tkk&uZ&^vEOnf92eSc*z&2?f>cRmB`SqjZ$2F#%??^X*oRR%>h+n^?@GN6Bax9 zaPCtYrGg4&rLuC0m2$aeCB$-&Kv|?xZ5hzg!geJ<(bZ`BX!0M^=l=cAQN)~j3k!zM@7VuxanTqm4l*vG zT24&r(tmVSRZEssvu1C2&%6Ii$gR<4wOm*7La)hGFD^sdU9nT0q)r%->MW?cSjP%# zFV?b)HOQ~Qo@$g8VQW5C=3{<7q4S=0RT%>OF{gaLJ7~-B?dyT1Ih}xo-3oVRvyiR=IF02WxV+<*==e(+;-Afoca% z+R?-2SHasuxJSbsjaKKz~us zh%Y{%!)7hkYB5iX=QUWP!F&y#Cj(rKg=##X4eF9f-AcEpc$e_`D*P-9ZCRL`MUBC* zQi(ZAys7v|!P*qaRp3qeM{?FCN3Og^&fb)LBx7wdYBN_OV;@OzUWzu}GPFv{-V#0* zSet+&~RQ+N# zTUL#x>T%U~R0~DbXciZGQvr&o$4mi!nvZ+)(K~-a{+;6 zNG;wO#XZrkFxV;|j*=tRi`{NQ=3t)#^^V03wm?i1pd5h%ChRj{oet}?Sf{}f4R)xp zL5(G94kMmL4;5x*;pa+hRN`(9V3?=iZ6& zR_JEBm{?>oz;PU$4}3yZvF*xXfHpOxX%oMBOtU zFv2KDGf`sV2<0W2)P<;lM=s=wPbx^C{aI3|Fzcl&(@&+J8}GM1@sp>2j@SMUqxt^D zcSRq#9R}7&R_oe@H!6|wl|3en<$+z>F^~fDSA{?iKK>g1f`79I+a^q4>G#^t<`xJ= zYX_;RI6`+^j_a*zs<_r4ccnUGO~`FPa|*E(8tc(mhlX1GvjT6Hqp}?5%5bg}=Spy{ z80U&GJC1V>oU`MC85d3Xz=(?myrsoC4K_CJX*}L2jBmu)21*pzojR5h#-%X1c606C z+6%SP_iNf~7#U#uYp|^bb89fI2AisJUp4Nm#%2t%d0TE3X^DG zCC>H2o{HlYY()j`tibpREGfsVa*QwMit*fhB=Sk^0x4Z<@-ROS^Kw__vbzZy8pi`6 z%pqs17%G`>Uu9>nQ23iN8O*E9jC3ke{# zUy<{*6iI4Ok9K6Grsnyqj(HfkWz($|2_7j=VX|t4NYq+KEuqOY;wVfTD%}>l*K4=9 z*&6T4Gw;pNHBLRUe%bK!AD6Bj750s|=h)57o1PwJ%t}pPvir>aMe>>vcR%qrtF1_F z$h&r2d6sm@@G)mlOU-6nHmlo(y?v@(_F=b9EOVH1N49U*)D9p%gNLX7@Y*6z?>VEU zOzsnx8w>NFo;bZCst$WteRFl0)j6oX|C~r=7N@BzaUeAqm+B`m-f|Or-uQ}B=ram4xpS%^LS47|;|sI`1= z-u7iG>UM*gipd*OPM$8JCZ49kn+AT1@myMtmZqlWNw@vJ_U`G84M%@E=R{q}P<)%s z{2XG<^fh7N4JpTi(S!}Zlk{qrezW5PU^5v2dTDH%ih-FBuDV?)3S0c$~AZ= z8z-}IARGTs;j9Y#RMc2`yNYegLXnhOWZ)SAGX)ee9CLBp&_U-JC)@8p(t&;UQ+8Hh z$8PH}D+`*rxkMl^g-ysY$sE~~!^@3UN=On{JZ)Spga|L%M7|^xn{WcW>dnMyzba`wiIAu&?1% zgRr^*7gBg7g|#WP)nhg!tT+UkV1S`4a1T`i8+U_;IB8n(6u^)*;kjkaE>?lq;? z{9ZzRMQcS{g-~DKTHaPJ)R(oEwUr5Bs$j$9CAd_Aw@MHxhO`*xi$5u5;UdV3aH$CA zi+Hk9OAMQ%C!_4G05$}8*jQLjDIPqoy}`w*?bu?++agx!IUC-vqJ{h?lPLVxDneXF-!eUsajgud1$G@ER=K@+jb7F?vG5iC>+_cr?1CKo>Q9!I#yoM|4vK zClHE$bRFFN=~up9vA#{*TqaK{7Y=-BSCBK7{zdB;N8OXQKvXNXM*WV*o%Q?NVZYZK z`oqxOe+)0TP8cwLXwqY2#)4!ZqRK8FAuH{L?{JLpv?~yFxdNfrPab`?e}ztf0&ga8Gyz!zulR71Kvtqp z{EP#q?07keljK#6?1`}1krfd(A%Y2E%=TfUcaN8i_pb0VQrtIduu6k@8c5=Dcd@#d z5-jxMdOjgKF}}E*xwBII6Q@edgrLM>KH6a#U9ORlfyW(7ME<-&h)mS#NHn)^irI34 zLANc!M%j-ZV&=G3@A4E*8t!tkKv^$~Jg>aUrV+A@D?Q$k zV9c7Ah!m+3Wl=rTMx&l&(k2ts!I9LisY`~k38FvI0ekAzi#eS+?4qO7!7kc6?d+nh z)5gY8oKZ}}oN7Up1sx`wCZLZAQ%zL-1#cNXHn3v`yg)XNVTpk))Z>y4Z}OniF5OX` zut>kfOD%S5u~CZ)8c>Mob0v>1Qh)Dh)Y{e7+r|!=@G~B&yI0G$i)`UvE7lY3?8ZhA$K{qbt(5K*Gz{PtGIDC`cUS5*I?LF_WM`6HOmrq#XB_W}nDRE!6E~GY z`eC$%w}%gfg+*b6s90?f=YyXF*}C8hLAF{<9b50;KK9})r8bz> zn%FcGW>dyr7Us(^TY}zkl#(VAMt%79FeA+2nIP(eIP1e+AGY`iU3|!U)+?O#ppO>g zwdk!yDLtzus932A{iLXtwn(Q)g#jQO??B3g5IhN6#1zOg6e%1bODv~AUBbjwAab&< zq3<64t1=+E2m4Foe>IC^v@Up!0uCkgFoh(8IxhM0RCIrGZvLp`u)1)tuC*{Sq%O=@ z4xgdXSIkg*eQRs0tlxZJ&9Hdhu-c%%azs(blQe5IZ6U$lGi@i@FUU%U(4Pb%4~fao zP?gwosb}h=7o&{uB!uKlMsO^Q4?;LfFsdMq1UWvIn8`^ecMY7h641WX%y>II7BrR^ zS)l>s>|UXVPhY5KD|9H-!B5ZBfmn<8H7M2Klp616LwKK}!|!Ebul$0Xy(h(cjFj;@ z#>goLmIqvvV5J0eB`BbpL+ms)vG!*>lx`tnqPFcc;N1Hy4nNl_t{mfAu1Zkuo`ox3 zK?VS6{!m1;;9gU))j8EOpn4WmT?~@~f)yN@tYI<)!oTiW&+j7p-f2 zhtT-OP?-A5_Sm5qyA;J+QAi{BB!aghI1=H&0)Gg;U}2Dp?-0j)y-%J)4^&S4*U8m; z3Tu8wpfuv*4!mne#9nS^AzP`9l~@t5qQpXp2Jo2+&1}8sD)gBOO^o6a1km&u3#mGY z0UHb`GQej*haRW&DAl7=)DJtgcuxzJ25AjXvHM(&3u>N?OhBH!S$IPUxg1-h)Ke5I zDa%uW?X=hec-4;o>Yxm1T`@_vFG_{IXl^o7Bl4z<%9oj*9-h;)aar5DVtTIH$qyC$ zfwFIzGP$B;NBTFzgg{swMuiaE*t_>a#Uv{cG*AoA>^b!}em%nF5~e152;AlW5T?c#bUA;)beakCF;qXbh5@o52e z6ktjLk6G@ZEb=%$jN@P&G`Anda4^OVAxfJdNLGQkgvdcx8OCuhUJ;j#%!;tJ%*tTF zzbyz_N~pW68JElmnoG>=k_jaygiI(leq^L21&IM48gRsbT?TC86IW)&rwtqv7otps zPgIb}@ozcameYC!li_0-&Wj}nMAzD@ss2=wL#Pqh-mX=82G|d50Sc&CB}+(fMuPnk ztdeYzumuv-OOP+YCsth2;1f0SW&T*UBUz+$M`-OH=8;hH0i2-6mGsf0`isQCXTA&6 z*F_N`*<@(v%4hM@ZqD09NA!8-5Pp*HvfiVjrXp5blYh(Fe`zFqrL^{cR}qQy>J^Dp z^e_SH>wTFCR9EIF<`NSqUm7ZGBqngwpO@$N@|BD`nvlH0L86 z<~2!342A*-`XTY*2pRW2{M3h1FC<h!s}pwumvW1KL-$Y>O5vwaC{}Ed&ZiY*RBy zc40Q_%*KRl)G6Ro;6nu_D^M$kPmT}em?j5B%>6QaC`&zz=`!3d#jOky5Okmu7!9gM zQ%EKLxiMxNfTJHc!OY%g2gxUp$t!__6eyd7;;?UHoXivzvTp-b86(Vksjs zQ{=L5<%AR#Dd}Kk;c!JoI9$dCe?3!lNI6sdMT|$ zW8Yi-yNhf=sDlRx*b+Ro^taW0cn4Y@XfmIG3-G7B*3|4HhVxQ%dg>ALq zelz-;kuX=8*+vsqn=sdeTvLr{ph=iuK&}B3^yshW6dTuLxej;gK>=+wE1wsi#1-X z^iVX1s|%ky2_|#WdBG{H<{1ryf|}w)+(}-WYDbGhP&sfxR3gZcv(T}|!Sg9s+tFg5 zPYxX$M6+l&&%0i4!(g#01MSsW3#_c(+G@Ssy4c!AvB^%WBHs#~rNF}KEv=T@EsHH} zmW!57i-J&^1?GBltNC{GVso2We!Gc7G=;$?6qxEwj6j+-#(~DEMqw2N)(vwFte+TW z531m&Dzi$?Fe(I8F!Tk=LB1c%^A?QpQbIxyxWzhs~E$s{ZRhfC;^^#eWw5$6)|5Qr$ zEzLI-h~Q2_F^#R3R4_4+S-}h3bXQ2Tm^+@#&NliD*+!M>28ALNoc_>6x7C#6$nkp1 zUG6f^t0q;pF`L;;DpU5O5%V3-Y&_FYlBd-c=eSCo&Jq{(V!Xo6SCe&hbEaRn87oTsKpbwu^O9<;8a`9|I#rp~p^-+dgyr~? z@ad1uI$b#C%E@8O(>tWG>a#r)=2Wl16r=2CjXJYU;q^2By`Koag4#M8WlLH^R;uJ; z?w?(hP^TZG+mx_&dD_(ZVCU_`Tau8c_K~~dK$4ma;^P=zieYCA!Pxp3+e-<@1Plw{ zlpjeCCjWo!eF=P3<(c>SzvnL5Z}x<&H~V&%-0aECa!EqS20>O=Bq0F;fg7`c;1Wcz zilAMlGquxpQUzN9n11#+g*nwl0OX){d3jeE;{{n*~d)cB<3* z^PYRpeb0N|^PYEko_Bqo|C0!-wxdZ6?K81&#EN6uVpmV>u2?b0giI4{HQ})7r0G@D zZ%jH4kkUi2hFDL2xX+07MywOq39Nyfb*xe3KJ0c)ef7Rv+>(m}*(l4#t!a2J6?bd1 z(u&mPR53vH3U29z%GEM1nVbqnW|k6X4ADiT=LGpDbJOGdFL0hB*Sr4k9DRE7BI$0r zxtXdEdZW-FyMe5dtPqq&Pt}Ex%@3snleoiCS|~_!m)1hfi;E?OW`0igKNbaLnNy-- zO<~63@@OOSDof{vEZBZW)9P6_&-$->9`NjmPtQz9w)>?OmaWW<_0z+YP0RJy#Koxd zwi^xK^XwJkIjv5pBYv&g!*vvYWj-EvP0T5g03w}*SZk9@e=jR&osX7zsBb|*3({Ng za5L^~#y~SVno-w`^yZ>wk=9h$RM(`|HsZDVck0E-dOTT=z4f@K4qNKbR43O^H`k)M z7Prj4ceZGr&DIV#yU^ys4s8+jg=*}mMr$?REXP}A_(dsNim{PG8APQn#110C6(F^s zpg`PZ!=MfN9OUIVbHqE@s7N`IaymuLOTk%fDImvOZWh~P@o)@w#GoVw-;2h!Xo5Qv zk?UlX*cOEy>~JDLIiR_r2r%Jw)9*}zBcCH$zv8M|7mTuC2>|t05MB(z(?Pg5Xn&B< z1kKk4iJu4JO(TQ>zc#?XD7;p0nK!>Gc7E7gk#8)^P<&cmlKJFhNiK@YW@%>YB5VKs z*BV7!(Q}Gc-tX`cmrf2JxXV?NB~gWJsv${7k&75jxYTH%VNfp3k*i5XB}syksuGK+ zD2og^2$Y5jM@(m8rvusIM(&DnpXoQAmL|*IN zAH#38wY?-^qpm{IM3T6WI6*Oo1Z+;gdkJ_m0ohULi9}8$)`cO+BxkGJOlUXZm0;}9 z!1z)*MG3~8!LLw4JWv90UGSUm6T?Of8*oaGVG4HY(WxKM3q|LZI~~@I=tgx$s-Y{Y z98zvohc($#;~grx)In7!LXI%EieWJ#MuqVvfewK~H~}#X+yrz0!wNbTm=dTRF_9oT z6Hu1`Q#`cwNfY<+;wIumI!ESVEny-z3`fH7hKV9)Pn%xQmK=W)jQZftV4(&V28-_m zKNBn-bUi6^fu5jSDF_vaR|D~2;NyYM2CBCPVtpV?0l1yBdE-T+ILX$|NOKVUnhp5| zmto9s(V(5gYI^GVHS6>BF8!GPqTV1+Vii4^U7cB%uXE|fbQg67c@kslMOEn36RH>! z7ui@an*ujW+4WIs^<0E*Ew(_6DKzi?tb*?-z6DV=DPoo}BtBXniXe`)^Rp-r_C4;bzUcWh zJH$6f)UH8MLcMM%d*uXC{Zu+B)S82svadIow$%SktGxW9hXdib&*oo7MNcl=vJ5enaWO-TWuPYmt{0VbjHO>p7h~yImkuQjV`&$u zEtQ6~Y1o{K)f`BqpgTqC!LKu8C>iUMr<#QKHwJ+wyl29jChQ17M=%P5>w-l_FwSej zLqkDQ7*Gww`M|dW#gGPJ*~4u(10-vUF^#J=Mjq1`*~_~+bgP?Hu}<6~#Ci}i#;pt~ zqAb&zT2(;yoTd7O>qFD+6~*z<6f=;FDmyFhPm|&J;R~VKklMG5qp=wIO=Hk$F7+}f znRL2ulJ3c$x0lm6RC2RqX0o#6b1$oUT~lsvB)sSI(U@I}!`nPe-_gcW+NC!x?~@Gb zZAN(cM_K`{!D|40AFYuPXFq(~F}~@_Es7@lp@tj&n|u5Ysn2}Ofus32MxA&L`g5?I zXe!y*o(+PiQ09!lJNIT_m!>UDj%`UtYZ~rN#&?rnOcn={u_bwDvLKq@(Igy5qF61e z6Y;EsRiu*pwpjGXqCFP1v2ak^IR*|5I?ff{8@)ApIC_L)wgwK-cSho@rg(QC61ym+ z6ow0-xIl^wk(>Sx2IHGS5}B(h5F>sVkP9%wh7p6>s~^^n==sN07};;C1G10AL2+D& zl>*0s1CTlsD~WWV99P6~%1k=&q65eBu`eHIwM_4K?X=^J9Y<`~PelML&RDQF8+)@j zZb3>WQZta2j(`-L;(TA~XLm-+6>$-r8ZCYqjhmyeJ_?)(aC%wB5azbhMlE0Vm zraK@>pI(ymQmS)c`uIIOzfz=IT|Um+vXKkRCOPS?v2bD<_;3)ZL$wk@6u@2 zF0wfuvrpK?1>1y8P_21P(_bFTB}5G#lz?1F&&7poJeqwho4pY(WWuYn-<)wIL!3*O zU_-=@JW6feR0%mmaca)NYc6W^7LWd9v{B>}^j5HQ)~>9Zx!! zq~4i?bFmUU=v*}ZNvW@ucxpqfRG>Pb&<))Oa5@jB@B?RP-zKz51=B_E8R-jC8v8 z^Fo~-GmdiDWb9PWtKwS#)#3($T~?grHa$f)DD|F-y(zfYj6KPcb)QSZh+NvmUINgV z&YDDLFy;iq5sb88i7fDVFrEl}E>I}OQRA3VVi48r8pWOA8A60kwVZ8<5Yx`bUd?>CE*rJ>29v6l*SmOodt@1Mo@VvN_CKizcfj?V(XB4$@5O= zRkismx;KI4o`@%jffXkagO7Mu;swS3kDIXDbigFmQF$@s zSctfvx&R??Ygi4cTZ3s(CESGQ3B>UL^aS8(szVr87<-MXHUl_nK)M0v4R0I7alOQE z9n|5tiVhV=2t+^~$Uz~}1YY%W_@xu;EAUV`wwB}ZatxP^u*HywFUT#$=|a3vfYT1ytUqtZVLSHNaoUExw!=2@ z9V^Rf*eZrCBNp*|-p}*IcPQJKhu4WiszH$w`sGv>Ml*4V;*FYQ`cpA@J^FXi;&3z` z<~Qm|Zl&qcb>h74ZJkh5vzo7x0XRcht3nZGkuOwjn$jb88qC~l@Mek4y-rD2#Chdy zg<~K#2}+48+@`A()rN}X*c`U_vYD4t6uB$lo1>7#ecu_a@@4!nMekZeueJW(If|D% zruu^`JoEux@~x9^yeWeU5K>}5m4I2Cv`YX|PG&T_7o|xm4Oem1NQyp%=!jc8)j^0Q za*Xn`j70c2B0s~D!;bGAotGaTWO_fz*lHUT3ldZ%C zM|ECiynk$Rd}wH3$-<6r_RR0d>+OioO`nsIP|{d$uPL%-7n#Su=i@&wk9ijBDs>wr zkI6Oc3KyK!uvVk40_2?yC3v$0KQBfLh1jS!YR9V@7zXh##`3^kV~hgQ*%;%Nc_xae zo8^bcsS%Tx)T`{&{g2q6*ymk zXGxwFPgIDl73izLiVDw_o0YG_eZWv;8t zuGXk+s#_gW?^g|WQA6ADZZRb87Y4Z{-3B*?a6b%EdZbN}6Px=L8VX|{sPVCH6F{ZW zxv?!<3@x5#we|H7&!FJ}(x@5RTobKkv?XIq)8Kj~5i1g5PpnB4V+m+YK#gV&qBR~h z5?BN+aj1!tkd!t2#!tU%w$g(PkVniZ;WLLAdhT^h0{lrW?|UHWo7rcu0sg7OQBJ^F%{*Sg4v5ppOfS z3?S&~4^L`hos{sWT<2wbELWh^X|La-%Ne(b16a-dG>U3QNy{^(T>CawbA_F4oKd1~ zUwR-WDqgJ!@hdI4`-i)p?5(;v=No^sOlPSI46vtL{L+*3@3B9q3Q7)JU6a^UyY}{~ z!QFw&Zd+o+Ec5zg%}(5*Y))%uQ-oCZ}aaqHP6PELqw=L=u7DB7lT3l;c>2Oe~AO|7`cWEXM(lYQ$#;-Hv zDCIRx7U5{ZnFR6VEIb*DquPdRp6RIRj7ilrVULEK2@yRZw}yy$A+(KfTB2+qEeN_G zl=|5tlL`WJ!_s2n^%AO6Duev+1@8uwq!_kXvTxG{n%>q)4mmGt)TW7J+T~Sh)`Gt8 zq(yhx^NgI$7){ibQv54~yLPk@C3o=z!OOJ$I;|ayA+1SSJpOt2bBVy<`EqokE+9T6 z0>-%H)cWwS+3`tnQL#yZiCOi|)Xc(+h@7Ip_|n`IXG(;a6%v$~62zVRn(Ot!`lP6U z@TiEGS+R(#ZZO3sM#m6RInO_Fz9XYFC(7gqigp;|vvL#CsY4qTsnc6Ba>^WR@5WE+ zO%qnbI_`rdxq?&?5a_2@0*!uLh^9%H7haMwH1f}pPZ)P;jHi&YL}{Kwn{K{&)8@^3 z(?<8EO>T~F$4}{_C%$6%IxP+*D{s0UTOWXy0N6M#lsF_+{`36RJ9YSN9DXwk7h`cT z2EU2MDbs5vLD6r{?SnM&))OHx1=j?(1*@hYiTk8-L78wSxA|k8KTQ5O<1g`2XoT@~ zKb-O7%o+i@T%GtGCHrW&M29@xe%(=>8mQuR6-U)GsyHBJiYWB=80BWT3LpZchTcBq zwDP*5iwukNH^c-4C(8EPeo79#NG-Bi@ztmHCr^@UydUqVN+S$ktD;29b|WjgL^d6n zl=!BQcWEYP7o1q|Ds%kB)`|*OsJ?bZVt(AMUum2bfva`g+)vTzxQ(BpUszdmU4mLw z)it}y6rY)#8yKucrRsFCk&*H&$2FJU(+7IC8SYk0EZZfnitQoj3K zU}u2tDGJURu*I;`Al4bsY`|fG0kK_(IigF5h@f~~j2}&+PxbciYdpc8*=tnGyQ3T} zwY{~TnH$XPlgE!cmKPP?P*`|FQSl8)SuxRBQQoiNZpZZnj_V2vu5%Pz@92rjjGFq& z{?t2Pe}rq+Cfd6Eyldra2~rm5&2YRHCY9{p2*FQ-aE3daT0=*i(=!?x)7lt}Mvg^_ z!;#oSkYx=zZY%<0;phu{HcYGxlcGT9gD@I|K~A0hu!Ev*fuTx7aGd@RW^x8Q`vO^IFE-b#;GJ*C1#s z{pL-xlI}eB?eV97fhC?d9>I5ad}Br4)e9%{tl3p?DXsVq*F_(=q^V_!N~$~N>d6wnU5+vwWH8w9klMSs`XaPr5>*Z zP26bAMswEMtSwnPvvh zM&mIWht+X}IzAqAE=DClyIZQ=9*;g3trF{^IU3GrxTA0|N&@z(?noSrJRW&2Qguh* zV8ro=a}g@H`wxa64?h>Ka@YT$7q8MCii2LHO1B9IO~*~=Oe!J%+^$t2I2dv~ugRfs?Q0Q16m$0`4-Kj`wBw@jf=^-EIs@T;}(n)x@*j5vnXL>k!GYtlN}ST{06mBQB?)DkEmLz_K$l@@eM4RhRovvT%L z1(9XjceOUGw1&5QbyxF-)(rm?S6N|{UwKn=tgf=YY|d46H}6|l_|8jPzW4e0o(#J= z)n-dI+l6cHm+!vSnid)mkyKZgTRpI`)N$Xo8?$Pc*mGN}vi(vPgw-@<1cc|$uWr7v zG%}!M_1#TRoNd1E+>W|rt5pIuO!260ss0J2LTSLuu8FZ)jLnuH3L~W$E*U8qEm4Py zM~X*_)#0L%qR}FCxNxL!v``%`7%3PnP=_5Oj!}m?oIjF3ny(JqN9?0^b=Wpy8?~v! z))Bd9B&XY>7IippByTiN9nKxe9nDpTb4GGTbJXE%X^%@C&Kk)Y%~FRmN4Qs{aumeT zPiHtfCFJX>P^>aZN&2%vI2t51$&ON=%m}V9oYBhx%^4kzPz0|Avuoh0?yVNRRj92( zcj-N);@%RtOK^WNHWXtwH@u3ln-T?uTMEU_0&FfoMFDm>uqA(AzBpi)OTVtZ{hIPT zSAMr=p)LzWT>sA8nCYWZa-xBp~Hv_Bks{-rw&{xSSv6)$ypYe6Hq^^I-P`hN&9+;XC_x_|Ti9iDeQZ^h)*&vRs@)Rm+O5uDRh8J?G8HPvpodx2waHSHs$ z71l(BE#9=dSr_`=mlE^x5|i^Zxj=0nbb#Y&qf#brcTHR@1HaTXzE~>1W2LxIj0;7$ zP>7##r9U5!+3}1Ok6Ljjv7IfLW9hPpA`4P2fVPdvb>n;Uqy!Fk*z$4_l#AWDZ{?2X zsz|HBu(;(Lb ze@&=>8*}?P4i>vLwK=B=cDXj^`hQ%V+pSH(IFPc3;G)0$Ql|c*pZt#b;bA?#rNbjC z_6ZyWmjiY~Jf>i886GOa-h3R?%7{1;)aL5V9nKXSb57-m7m4GXeK1>`BiJW9m&}^X zwoLVS#<>hZoc^a%Uq}_s)Rt6XNyYhOs&(OT(yK}0JZ-Jetb(+K2m+^2&+l-!#L_90 zzVkb=w&@bKn5@Bh zpFE~U@_&TZ*`7~L{--~PIVA9Y1`-{!R?jdP3tq4O(+NdaMLAx~BejTd@; zaP74x@43U47PwcOA5S=NfLkOQk1W+cM;kTgkvXGt#7O;U zy%?z*trH`)qqSmW_ULRe;u>{{k($vOF-Q=L>d|U3QZ-s7PF3RZN}MUe5w6J;;`u@x zEyN>4Ju1NQf^!ApkpgUS;JD+QLu}5+>3kf|$E|jpB__BXLpB_@owEt*`=7I-S=(CE z;A1H#r6%DgNjQ;&$CJQSkLMDwBMJji_)ZjtqcA55uS8%^#G!~25o$*S-U!3lFk&(u z4HMkRCrsQ^HP}~!{nglCg^J33m11up9xA{d2lnJ+ubr#D*keU*#y;1Y43V9J)0&1B zaeu64ShStW653KsKuH3!5|9yJ950Fq=of<_Z4_jQmh)@c2^)%nGYYv;(sMj?%W$kkevKcmFfE|O$Nt;i^i{^*e76+yWx4g4>IZ9H$t zwOe7-vrEth{UxR9f$Hk&Ic0S*k;Vs(9Xm#luIPupvO8z+%X5xwLqudpCw>^0n-XI% zXJ==m6g6aestV>>qJkZ(YX7dCO3VC=|EJXkaW#H)@ZdqUTYTw@UzlHq7=-HToo$Q0 z?f6k}W?oicY0j*;=H{BP??yCV-;uX?-!JPbCgog~>W@+mP-^*giWRPjkYk^hF;li;tLf}aIPy(@NM+pWTHyS5;{n6)# zjobrKIW6Nphtvr;(vG7muxkZ&-iW3fu_Uxz~rari21Wb)_XR6Y7<#p|6Bi-QVFOG5ITX<=n^t1ClqzBVRnR^q|#oRq?-th#lRea0>N=hPJArhm5#|6GQyQW#2U z?y$6>RClWMol@}*#nejhvjUtfz|S3cJ0F}D@3kMci_;c7Wx+lR-c7~+)HA8VKLt;v zJfHGzib^Yo&zr$*d1_@muYpg|#LuaA9O8EcnwBGPxpTQ_T7ZfL$XkGp7OZJTPZOTh zL_1C;NxP9JrKS^H_B_h4(6V3x@-*EbOFW+BNG;(;QQsDoW@z?zh7?(EsJ%+psx$_c z#hATQP>rUiaC5l=$+7*Z4;s`@(eKQboMb6S9q;qfd^JCL;=-%ezK3&gE*o*9rX(U~ zn#o+r=DLk<;ZZ`L8KqP`R~xx~mug6)ecTu#_GK1_X_j$HvJAAqpeLo5)JUKjQhoX? zWMUzAU!Dp~3#3_@|B6Zo4~@w>J*Ta3PhE9OkaK9zvOOoi(Vm!MaJrp_ltg=De$ICP zoTdjNpZNtMi*JdK2np~HiHN_Y7?FwUUT(?E@#N>&D=O?cMdI`S7?Kti5E*wzXKB{8 zR~5zP)vj5So<080FUIA~Z%pqmjc8rAtTm#vKfQ5&Ufhc!Dn#3*@%)=7*t0kE+Voj* zVPSEz(ytB0b)smU9PfAre6}o2oD~R4hLlZ|iQg1Sl}dYITcNmE0DD1Ofw<^^-O=U{ z7xQ7yZ_5`K?dZ0n&5jB?>~_3uLz@j28|GVoVHI{O?8L^uU{T-9gPoB0!cM5P3%RPD zxM&xMipc}YsklU?`!Gy|;uoR#m3MYhg1seJrO97D zT#OyXXfH-BH~(yS(k7+;p0wcQJRHu$U3n5*fpRQ6a`CpN#QU2}oX?GAexs{F5!-K zG$nGg$O_!!<~|T&Ej@Bqpz|nDZ}RT<#y# zS;~+4xHitY^uWQrU!YQu_|pBWR(XDQ$<;K&jjUwm${cwv!*g*noMqIzW1 zqp%LCP7a6(4~&Px@T7w54&=1s#0uI+sTR4;(@v4YP4=>)vidT$t^|8%`?Uyj3Xonpb0_Jk6f9SV!8=c`irXmxEh# zur3EDvT>MS8j4H75q{05&EolF9HGK9k)UD^#h!>&2V-%2=zXDLeJIXqSVX5oaFj?y z!8poq(3v1{CJ_F$v&yeonCXbNT;HZ|NGMG&jI@R3`WkMpo`g2hB&DAC!3Q%$5^*is|Ga!ne}z~mx+6}b1Hfw)>RZ4b5vC2C`I zc2rbWG?(wAvd7<{1whIh_g+i;j@h=>>w5ijn!g(P>_yslym|9&P_9l046+v&E|&}c z@$p+X-Fg!iQvOExKl2qs5NG{`GQ%! zAkAx{CfS`VXq)4Avv895rWCTHJa+&t_~UJ^ju>e(#BCImXR9%|4dS96HF~#RT+~Tj z;c6Pq5xAhiL`S;(-VPdt0bNERZK!gwUtt z5{f?}9ezm}*@r?bv1ux)RBJ#d#}<JAuN;Qm&KR1zaCY z;}W*lKayr?<*K2PBV^qJp4U9D9v_V}`DIVBA)dxgE9Vv#RwM-&UTVi_bb7w#nfq`5rY2sRSD@3C@EPx#g<(X~ zZ!jr~5a)X4c^4`q{JW(F0i1T#;8Ch*RUxm+StSCh@M0Ant-`)CWE5ggA&62%h^jq~ z6ArQ8e#S0>o|8XT*_Q-yfKfhX)ZYL(`1xb&6BrGbc+2tjrBxTJ=FYEfXY6=w&Rr?-at zx$1TK=K8CGDilj;W;69dwUq$&ff{b6x8h{A$(Dx4Bsjt4wIQ#h_^$UO9om%N+f&N! zatgK5*SF~lRc<`6g3^kkxxyqB_>5e5nzA3MAz8-w>}h#>!IDyTeR6VB9F`U#2a&&J zXGRQtc6$b0CNY5iebeUT>MgVC#NW>A5&@nkJr8xI#E^xLh@hXGi-@>)+szrbE`cF9 zbN!+YA!_S<(3Td7YdVX}1|CT|l=n%<&D?*wB$A9#Gu*;{1&;6H%b-8+_&NDXt zWz+Hl#CvGB*}Q$FqD;|3jB=w~!3u25YjifYG_GsZztM;TjZZhe(5SXHz}bMH21|o@ zvjN|2c(Fk|+CYdjiM+hGMuIQDRRwb;p09+N-MuEG^>zhbuD}V2ScwNK5Lk-emEuh4 z8>Qk{DfX8ls2J}Rx`Xo98mu z({^I-N~n&X=HMrq6xmoNUe3U)RLe*MEg}*m=+U%eX`(O{Eh(S{YfB0aq&%JSLW=63 zHcK+Pl6NGF?MX-vDhd*2iEUsG$PW-2!gRV{k)Nww6dJK_3Fa*5S|AD*AZ-D{vg6P%FCuaorZUCNpy&FR^RG$No4YJE^V;2MH*dQ)JmUVV)&zR~(eqGe zO6=Faq5H-Y{{G*W6n|S#U)tSG1|U!uaNUA0K-AZbga}=Bwoa(=G!EK)znW?FYx?Q< zZ#-|TUVZ=P$rbl69)HHOcM{}v-@Y$-p8CoQ294}@b#{7wF@A4g(6R>vC>mptdvTbU zkZ10jtBOK#izo;|iE8@)hvzLNUGFdbBbbx)M!o;L=M4$ky$s&_cl{0}g!j_Ij9H~w zr7@*3#u#H(dgEP={resJ_Q~^Ip11Vt?{+-$ZF%wSM;v#{H&LEmn>R%$ia(7nq(r44 z4OwY?1z#Ulh_B;EFL6`jIS(x~o%Upg>i6Gw-+u8D{?5~N+xQ+L+4FS$ZTNeIYX(;{ zu3K~|+M06=Wfig%yHZNoxVe;$Tc+Hotfq|ICW>__nyGF!I$6Fkd4%sj!}mXV|9|>F z8Q*05lkd|7l{qTxUo0!Ew7*%A@3ec`E39R994dD>?c-l|T1yH^m|6O@Og##ny)-s!?v%+4U|E4p)!turOg7N}&OYU#hfLjQ^J5u!~;fT@_X*eq5GQHSTayF!e{3R_AzkrL7!08D#w3Dr@Dt4B`0~ zK2^>D8Z9VFBPr+LcPi7*3Af` zSNzrOK7WG}r0({)0~9~?0iQc`M)4p-g?)ABa5)!c4 z=T>L<>t?w1N@T$2d|?bqY{1|9+yP2xz!N@q=#21TGvcI4+o^X&O80^_T?75?eeDBl z%x#O!R`V+Nh5?@X%mZt>%&qP2f$sJV=AQNqs|VXxcbVO*q+h?Srl!u_yScA>^_l^5 zL4JO*xv6fkxwp@~wri#L>CUc=T|MsJ^<9jO4=q|eXSRLG{Q3pH7|aXm7c!EXn#F6n z`@Qd!|9xFu=6?68flcjwT~706_n>(t-`>~N+1)?T*WEEV&}Hr(Ft=~$v@?P0-JRX5 zHcOAe4V_)y1P^ret?!rbkg1TB;YFBt6T>0W7W?Oxfnp}))A z-f!-eKK*ODI?WxMwWk_nA{O})VQz3U^7esl_XelAtDCX*nKyRz_4C?XU~^2q$rqo+ z%w%P^56G1Fnccneu^c9MGYgO@n|yLQ<2~ISeeHeBL%(@Ci=F1~4O&XpxO=w9~;nL(CnU;BoE%`(;V<}9phWcb;&O|4CfuaOCFXj(jf&Z0%;hPH*~+2#ea7cOq9 zThcmvp?SfQg$vpi&9T*(7qMtQT**obTJP@bGIw?jw0HMNim9o&h85b+wDokF*R*f! zV#TiP>fXqdwVPLxoF+^2L)2T3d&6oiqfCyEfSl&;Rpt%u0gHK4UpEP5z^x_q4^^kd z+_Yh(&0;Qgm>XCs>v~w|iw0QtjG&==71^Po$L;R3m}}kr1MUqL^Ss&S`~rs~-|8sL zcbLsf7R{E0wz0dPm9u7Gptr(q-?V9yZS{sho4aqdon$6Stl!?Vy0^!+W?+5K!mibW zJ?(v$FUujqR_#5E0nVrO9o~`_? zVn?xozFt=!|7D0S{SvUhjVXCr?-S}g17@}|xErbT>qjxw8F-4bQK zQqR1Z8E!faX8P1C3wsJ>QbEa+f2Vf{;%}q zUHW%wF%4)r>)_o1?dfhU{j!8QnJzc)nw9nZm!VfN9y9-C=?-cky0rU~B`jm;V`!N^ zZ$2jP%w_(T(6^N#`gwSto6G+Vn!BAPBy&5cbkNn!bjq;uUxtw3%}lwBw|6Q`zgDlE z^y|>lHTkXvromehi?mcsmxNhqppQ4@l5)CvwLvSNE-hD*PGo*%jrH+u-uq_4*4h*Y z{V&hc<>|9%_vO>sOsOm(Z<$LUNkNlu%i*;wU0ITn0=;GS{&#w5@A4X#<kfkU~$(ufJJ#J#i9r*hM^KEw}M0GoO((CDXTGD#|Bpv-ZXjZmHk^&?LNvf3fC0nm{t<)#m7+KHPFofh# zN!8NTqm_%SD@l!J?P6J9#r8qZzCR6rNxl_j0#F$sImZZB_<3t&Yq?L6V4N1yc#5Z{P z-kX93Elu*Rk{)DEWDUp|YU%1{XqkF>Jx`;Pd~&&iM?QNIhf>IY$?;~=$s+B(w;ne# zR@p8{s+N7h0877u?WCPKmWPd{wSl!~)84k4{*uP0Td{u4XSGKAHZ6wr46%^qB>N%R z9`y0OHm!e=X`Ae6uGH(vK5sFf^m3B7CE*BO&iVM6xSo+*;e#{|@�mj&+KjGXtaI zM`?)wO7RD=!wcaKLnvh@!YPd(sYEH!+;51bBt@JOPc;8TC5dx0vy!5uDrr;fICN!f3t(b@TRO?!RtFRD@ zxYWG_OSy)5HLk(6xDMBAwl8m_qG~(gbylJiU08+HSc7h?#X9t0JvP8i@s67a{?U&C z>R)dp@W9R3OoW}6!06t zckno#z#$yQllVvc6Q05m9OdfT)A%lq6E^1=Jd5XW;tHho*XX5^`c+cATs`3&lvxPk zkD^56BO}l6((iXXROLP865Zoe#Z^grfeP0-5k_}7Qt7YLp5RG~BY^zTs-UOcZD#!P zo}$Gs?{a-+U02@*C31ax-#R63{krw*7~1=sd@DhlcqMp9{tO})CXmyJ%c_OR)?!21 zTHpVVwYfdYH~RiZ6j4&d7>p(Lr7x1pqWILO_hVwY-tPS=isu#YkJstm-(P3OKg-cy ze!cy<>uBPHN3PiMGx5twm-kvbf6nu*8CM^R^Us~5k0p^GDbi0iM-y@-^<(}_=V;<< zpS5)#b7B99(NEXWXZ_KiQiKz&f67xI?U~Q&=%ba_|3>Ifa~(~W=O;T-o#w3xZs2-9 z(|(gaAO3&3j$|y}m_FGYefYF~xRBF1nhyWT=4iS;{@iu+>FbX^tE1@>_{(yA#z%iy z^>L-tOxMw;uVwi3<>=Gb!+!ee=(8MMsh#;t@cXQ-`%9>W4^G3xi=0F7$McBy$MYw! zl0We%!O z>l(j7NOYIWJ|6S*{OPhA@4J}J(e#Z^gz7@Y4(}T$?!JO+>h5%^KCJ7r9DUf5`eWfH zrfT7{I{Kq!HMI{r9rEMiqbux?O~3Td=K3W0=#$RTC)~rX#SgvJ!XDP=Vh=m%H+A=; zSKXh#j;3p3+V#=X^`}2EoukiY6MuRse!Ndk*U|KQyloxFlHc?CO(ct^596ASVcIpZ zb~2V}zmM*kXcd0mrzTF||9tTC)9t}@IA4x_iMuBK@b-suO@^BOC*M!SGVS|OT@!Ck zrQqg2Jx6SLHu>J1G!@?myRMkfKU0pL^+kT|AI;Gp>|rMkW6T>1joI{k7?P}(^U7_Zp+76&i|9R zr|Zb`Gs-~n_sOgh|4-8V!Ozaf(Pt9uA6!)bYj;1ZqyM#{|Lnz|q7siZT1pq^@^I5snq5a)X;p12bBNhA(a2(q0*S<7`4uR!b7jT%)_9(!o#SX=i#Tk z%EMoIjYoj;QyziJ&v*nWKj#rln@O)zxAYAjCgn{Yp~_o4!jxa|2v;ufh@h#?i_~`e zC66fOS3IJXU-O8e)yuc3gZdjDvy^vu#3{e!5wH9=j|6Jyy-U4RsiT)f9liIcpL&Uh zSsCY%qIh_uDib`?BoGcQp7TRH=mIn^50!ebS=1%fDcRKN(48l#j@ z`!rUeIb+OH%BY1Jr<79@HD0NpHfjQGktQNhsianFl2S#@)MTX^W|);4YN)0tE^4W! zvK9nOMCMJWLd~|RFP{tV!4t?9n#0BBYK4T zpr>#a{}(^Tf8sn|rv=t`aEZWEej-FfiZ~iI%@h_vOe9e)>ecV7KV*)GS;f*P;1A1P zQXXlK^{Gf5UDhg;Ey~|&Z>^TPm?DcZ$EW{QY14eoWYD+I1HH$=`YYUgz&3 zQ#OV-@hki{JVGY|M5u@s2_jWw3!5ks6~ZMNM5|aRt`^Hhr&ud`#YS0K|&Pc(}Kj8|%&QuC3nKb&6ZC_};6}PF-^QY>84(s^pPLm*_*G4G8x93BVWF@%P>05vZwr4%y4^CqNUK6h8cHN zQugFiKDTz)n?g2=yzBFySytXSwX-kI89v?=PPA%y(NgR4(cG|j^C-_sf#x=7=dWq! zIIi45xkzakcpj8zZ~2hon34$t>EnuL?Wy0%^TgMF@4Q0#czz(`_xwP*4SQs4zO&qm wgF!pf6~MOC@_YKrvIekn<@#Q>_H=1K$-&ai_J!@c{1 Date: Tue, 29 Nov 2022 15:37:05 +0100 Subject: [PATCH 0835/1620] New translations Messages_pt.properties (English) --- .../earth/app/view/Messages_en.properties | Bin 92828 -> 13932 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 2ec713dbece406fb6e9a2c32099d4dbb4ef54db8..c2ce51b7bde65b8728f35c203bc8e7743d28a01b 100644 GIT binary patch literal 13932 zcmb_jOK%%Tw%+SkRJ^z&4=hR~MLi6+0$P$2O(atZWycu^7!=78)poOs(+}G5ZZQAg z{)5acf-Jncb2r%%nBO(uIaSq&-c^m!rIKd=8+igypQzn1Yzi_`P#t&MfP=v5IX@l1lQ&0j&VT0&4@o;zgxS|~^!7lk(L zN9P~xwK!7ev`~sSSC?XYCdEt^5&{4(*PrgP8#1PP0R|W**h48WFM_{z zqZev=FSFo}J^YwuazSR*RvLGBKYA|X4|q{S2~MFo+vgvqDhWQVyB}So@iZodP1ipq zG0b#4y!hr-kc2^Wo#|z)aK5L8j)a3~__mzM;O;~CjA;VRgwOe>4laST(y303SY!sO zWiDjN3YwDzOeB6Mk@FLSXB{NrqPS;B?l%E)+zM3o|v3^CBaOm&*iZ z1TDUO8r%oZga?W{9YeSBeEn&q5}~SxX|euTYt8iXTOGd+mSh05TV5s{sT={(z= zoCFC4HmL6(%lI9FE2$qYgP5Ucck#TWb34K9(Zwv*025Z?tUA`3`+Lzf)ZtF9@J}!r z5&fPb3BrlhSvi3!;*)y=ev4NSLYYf=PCV%=t>=jnd@7!BzbKO6EBf8qPrE0B_CytR zJo|0;+9x0RkOS@a!KhR(;5!8Fdi3JVU_?|Rz+9xV;uC*{ln;5!PZj+CnSa> z{_wgZ7wBM$a3|x}L4F-a!`Bz%(e2YQIat62l@ef4(7BJKM&$6P?{>;1_?{DPY#TNL zn}t0tsy`N_rhI4RKCm;@E2mXKI-*-6H-z|V8%LO+&Ft?PpGRhuK~olSdJiB)mMNv3d?e`*37IcC8{ph?;1|C;Vy$zH`E$e1(!gljSA%A zMVZGseMtMkDF7Q21)wW%HA|i5a$*w$KpgR6I11e{0F30c>Pn`FQDiW$@^bxC7B<>J zH+qebOxT~0u8C?k@x#_utPft-v)9>&(S1%ch)T(L=s{FB=sS+IH~yZR_oGvZymt=5 z!JLBCPkeKA86V;h%7VVS=cfldY=o9Y+Q>A~&m1V{E}WnC##=G}~Mm0b-^WnhsmBy5$1S4|!AG z;q`Fih)SepV8NsD#nmJ7;pBY-SJOjmF#^7ya?nOm0^tl%8N4LYXOiL>!QbGUKNIv1 z_M)$F!1`zZ$t<+cX$K7?(qIugCJA(hgalexX9IGE^hu}W4|f-O##Z)_<2rz|{fw3! z^le^3YQ_NSH+BAi>KGIQmAF~|GKIDT!|}l&gncMMkqJN!h!3)26Db6j0V+=r`zRwP zY*^_Q{PF2|a7PXH42$9EjH|qnC~bwd9J0%!01NO@BA=p)4sKLA$}D*hz8)epvfkfS zd9$_E3&duKaz;8AysXL(D>U#q_;3{6s1L@dkUv|G&XCHbfB?npr3q-d_#fsu(7eMq z_HHN>84qeUi-y{f?|DnE1}Go4;;J|VbqFVUiE?M_?8g*1Wt!V+no0T-DkdoLBGCvw zg={bC+RA`kwEkPBShm+Bh@W#CegZim`KzMy~76W z!wikXc}59#BDXm07%rEcZns?&s95Lu>Uu}73yX1Bj@S=%p@e3R)Rw)zHBC4%X!-c{ z?&&uc#Agq%&7Jqzw;#&ZUfBciZu*v zA`?>juW$Yzs6O_oZXW*o$Zh4xQ~;0Pk~d8Bli}axr-(>J;Z6P{A_QQiNnFkg4ayNAlCQNXr+B zSxiur>sGg4p!zd8VQoDnU7u^1e-^VVU_^wX%a<-XSM&}5loPHEKnYx0Y7k<*=6KW1 zN>elkML7GdLULIzH}D9VE1DmGY6L5|8ron4g132Xtv(x%Gr8{iUm%R!F_$p3fiHEn zgGy`&WpJAUJBY-N0O}?N*KeRGMhS1@3$-!Cm7I#vSiE^c z*upA4!a&6ZPd?j!6rHJBJ~k#xI0;fT58(jNmL}Dga1@LOpp4-eg_KzdB(qW9$ei>FCBQ3of{IFrhR+$=G*ATS34<~A1Bb>WegB_)+q zaBspnAd$ zkh)(Wxq3)K<-(yWArMbEt2L*Y*4wqg{8u`S3!R}8U_Y4hmfb-~!)G=TAynBTA%K|% z(sN-E@dR8jNd<9>NeN!O-$=z9xB#0>w(Y%rkJ@vrp{|DNUWYewd&rd5NwL`;xU{!G z=MOZJEU55izyXj2)u1RD|1x|TKy3y45zydhUatTC@BbdL-`I^$kRLkOY|vhd1j?1* zQR;iO*nR}hG*gcrKj9nzx?MlH6Q%*E!o9SH=BTHervPA>pM$*JL-pr$czOEja`^IW z^tqJ;BjP*Qgq0zQv%anpM(`E@Bts#oLA430<6acpHLw>VikdvX+S%XyKq&&+EU&LXA{3;wDN z($w!|JtY*B#03}mwk}ZGhFvPWVGh5M*H(IpHW7L%NO{TdOx*d?i#SoI_gceWawN=$ z?6EHUU9X2h3%%!u6XV0LI64jIFCU z&*OA{o#-O3d{*6Q)Dz@oUOr5zBOULx#ZrmhDjYV*KVt_LJQ}S>*Uc(4>W=(c3t}NB zq*DNI?4aZVAwDCBPf`yb)~gO9rkTnNSUuwk;e)&OqZ`-!wR;ehBuz9_KIZm|2X2h6 z{fCDa_7G^6)X!wlzWx<{E4&cNwv7+X$W=l8dOiaFCui0-J?AzeaJ~{~86eip1bWE` zT#s!LIHw4M84F@6U;=7-kR>G4ZhcckZa=;grgVSv?TDXE0>k?T(OC^T9}-HVX>WqL z8#y>X+j==-%!PmdDKjg}O* zzo$;y4AwYW!d_`61%9%H8E{!+VRz3JL9Y|EBMSf5ZgiPo#sr>746iTfu<$x0dau5_ zM4cY}9re8|ruY6yuKIZ;ski=_g|-!nwg6TB=~U(v!Mmjt=O18HVjEzI+m{pu8adr# zvNi94`_W4`C4+Xm_alm(Tmm+T9XEIjVDE(D;sp#jMVSu&AeDs9p?8DM6dVzConKy@ zzPRwVI>x#T3?@!(7>sML56Aq&{J5!CQ=zTwmeh7X?nv)RW#ov33KZ8_YGtWux;oVg>N6lDOIZo>d zFdvuR@sYrgB?DUT9X$Y8a6x;Y`_b3Bgq0$OqDTjCMcAmyCoEiSztuZ|Is_)zdp``K zD+C+j6r7X;0d3k3qUX=g&In}k;DdL-A^J0b0_?a@ln04J>l;nQpP&)xzM1dXu3ar9 z$i)uK?OoZK$iii5RaJ=M9gnnlx`~;BN`uW6e0S>}kH%y30;&Le*3^q`V&qA9ewpiS z_rzV~e`JK-&8T3o+lBs%@wb;ymG(Vo&oi{3<19Sz7WASsDjMXro&>LJOJL^oEiFfB?6bk5_0l;uM)(5d+Z3#LgboRzD2N#i8~ zRYACHQ-#E2Ny{+$$MAYje%LuBFNfT1CZD`%{s&pI@n=smw(2Js6a_oYH&ZaO{hIc< zwSH3&AiHf}jLtg1JRxvT%xH60jX)S8ca$38$-;K;uwGSPvLjF$r6bDYxg*=6483kQ z6oH($R!Q$fO2f@e5T?=!jLj5ic9}fcL`Y(BJLN$q%sZqVxzE#ij9D;%lON}qF4Gxi zHZfWYfugYnefJa)z3*n+x4UoR1@vy2`|RY-3}z&sBhw%h;&T;MItCF4AB!?!Bc#q9 zao8ab%ql^(kRjkZ#RynQEAniUdjbo{R~x)@dGYeq8=q{h+whzOmO06xX1+@)6WJ2f zlY=U&8x>ZdycY3${EN`z$03y4o05^~Y5VvIO>z@dGo;upVWS_;Q##FQ57>&Oip?ab zP=j7ng#c%^L^{)r1RXSc7g3ss^oH{z?ELzH}f%;RQta2zjC`Ed!C8}v81!giw5 zIR^&z$&Vj6#15zLU}B8&!G+54#}iHm2r}BFON#ZcNrCbKM}2A(V3?67ov0~_OdsBgE$s+E|LroiA9s*__ld#<^h;m>L)KS8SmRV#|~%(?J_ zF2!ALcQyY+il@O)GO4(}QOXV8)~jbkOx|zKq3AtMV2*aigX&#qrtIwu9&i0{K8AHH Q=-;lCN4kXZe+|^~A5C-NEdT%j literal 92828 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�mj&+KjGXtaI zM`?)wO7RD=!wcaKLnvh@!YPd(sYEH!+;51bBt@JOPc;8TC5dx0vy!5uDrr;fICN!f3t(b@TRO?!RtFRD@ zxYWG_OSy)5HLk(6xDMBAwl8m_qG~(gbylJiU08+HSc7h?#X9t0JvP8i@s67a{?U&C z>R)dp@W9R3OoW}6!06t zckno#z#$yQllVvc6Q05m9OdfT)A%lq6E^1=Jd5XW;tHho*XX5^`c+cATs`3&lvxPk zkD^56BO}l6((iXXROLP865Zoe#Z^grfeP0-5k_}7Qt7YLp5RG~BY^zTs-UOcZD#!P zo}$Gs?{a-+U02@*C31ax-#R63{krw*7~1=sd@DhlcqMp9{tO})CXmyJ%c_OR)?!21 zTHpVVwYfdYH~RiZ6j4&d7>p(Lr7x1pqWILO_hVwY-tPS=isu#YkJstm-(P3OKg-cy ze!cy<>uBPHN3PiMGx5twm-kvbf6nu*8CM^R^Us~5k0p^GDbi0iM-y@-^<(}_=V;<< zpS5)#b7B99(NEXWXZ_KiQiKz&f67xI?U~Q&=%ba_|3>Ifa~(~W=O;T-o#w3xZs2-9 z(|(gaAO3&3j$|y}m_FGYefYF~xRBF1nhyWT=4iS;{@iu+>FbX^tE1@>_{(yA#z%iy z^>L-tOxMw;uVwi3<>=Gb!+!ee=(8MMsh#;t@cXQ-`%9>W4^G3xi=0F7$McBy$MYw! zl0We%!O z>l(j7NOYIWJ|6S*{OPhA@4J}J(e#Z^gz7@Y4(}T$?!JO+>h5%^KCJ7r9DUf5`eWfH zrfT7{I{Kq!HMI{r9rEMiqbux?O~3Td=K3W0=#$RTC)~rX#SgvJ!XDP=Vh=m%H+A=; zSKXh#j;3p3+V#=X^`}2EoukiY6MuRse!Ndk*U|KQyloxFlHc?CO(ct^596ASVcIpZ zb~2V}zmM*kXcd0mrzTF||9tTC)9t}@IA4x_iMuBK@b-suO@^BOC*M!SGVS|OT@!Ck zrQqg2Jx6SLHu>J1G!@?myRMkfKU0pL^+kT|AI;Gp>|rMkW6T>1joI{k7?P}(^U7_Zp+76&i|9R zr|Zb`Gs-~n_sOgh|4-8V!Ozaf(Pt9uA6!)bYj;1ZqyM#{|Lnz|q7siZT1pq^@^I5snq5a)X;p12bBNhA(a2(q0*S<7`4uR!b7jT%)_9(!o#SX=i#Tk z%EMoIjYoj;QyziJ&v*nWKj#rln@O)zxAYAjCgn{Yp~_o4!jxa|2v;ufh@h#?i_~`e zC66fOS3IJXU-O8e)yuc3gZdjDvy^vu#3{e!5wH9=j|6Jyy-U4RsiT)f9liIcpL&Uh zSsCY%qIh_uDib`?BoGcQp7TRH=mIn^50!ebS=1%fDcRKN(48l#j@ z`!rUeIb+OH%BY1Jr<79@HD0NpHfjQGktQNhsianFl2S#@)MTX^W|);4YN)0tE^4W! zvK9nOMCMJWLd~|RFP{tV!4t?9n#0BBYK4T zpr>#a{}(^Tf8sn|rv=t`aEZWEej-FfiZ~iI%@h_vOe9e)>ecV7KV*)GS;f*P;1A1P zQXXlK^{Gf5UDhg;Ey~|&Z>^TPm?DcZ$EW{QY14eoWYD+I1HH$=`YYUgz&3 zQ#OV-@hki{JVGY|M5u@s2_jWw3!5ks6~ZMNM5|aRt`^Hhr&ud`#YS0K|&Pc(}Kj8|%&QuC3nKb&6ZC_};6}PF-^QY>84(s^pPLm*_*G4G8x93BVWF@%P>05vZwr4%y4^CqNUK6h8cHN zQugFiKDTz)n?g2=yzBFySytXSwX-kI89v?=PPA%y(NgR4(cG|j^C-_sf#x=7=dWq! zIIi45xkzakcpj8zZ~2hon34$t>EnuL?Wy0%^TgMF@4Q0#czz(`_xwP*4SQs4zO&qm wgF!pf6~MOC@_YKrvIekn<@#Q>_H=1K$-&ai_J!@c{1 Date: Tue, 29 Nov 2022 15:37:06 +0100 Subject: [PATCH 0836/1620] New translations Messages_pt.properties (Spanish) --- .../earth/app/view/Messages_es.properties | Bin 92828 -> 13932 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 2ec713dbece406fb6e9a2c32099d4dbb4ef54db8..c2ce51b7bde65b8728f35c203bc8e7743d28a01b 100644 GIT binary patch literal 13932 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 Q=-;lCN4kXZe+|^~A5C-NEdT%j literal 92828 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�mj&+KjGXtaI zM`?)wO7RD=!wcaKLnvh@!YPd(sYEH!+;51bBt@JOPc;8TC5dx0vy!5uDrr;fICN!f3t(b@TRO?!RtFRD@ zxYWG_OSy)5HLk(6xDMBAwl8m_qG~(gbylJiU08+HSc7h?#X9t0JvP8i@s67a{?U&C z>R)dp@W9R3OoW}6!06t zckno#z#$yQllVvc6Q05m9OdfT)A%lq6E^1=Jd5XW;tHho*XX5^`c+cATs`3&lvxPk zkD^56BO}l6((iXXROLP865Zoe#Z^grfeP0-5k_}7Qt7YLp5RG~BY^zTs-UOcZD#!P zo}$Gs?{a-+U02@*C31ax-#R63{krw*7~1=sd@DhlcqMp9{tO})CXmyJ%c_OR)?!21 zTHpVVwYfdYH~RiZ6j4&d7>p(Lr7x1pqWILO_hVwY-tPS=isu#YkJstm-(P3OKg-cy ze!cy<>uBPHN3PiMGx5twm-kvbf6nu*8CM^R^Us~5k0p^GDbi0iM-y@-^<(}_=V;<< zpS5)#b7B99(NEXWXZ_KiQiKz&f67xI?U~Q&=%ba_|3>Ifa~(~W=O;T-o#w3xZs2-9 z(|(gaAO3&3j$|y}m_FGYefYF~xRBF1nhyWT=4iS;{@iu+>FbX^tE1@>_{(yA#z%iy z^>L-tOxMw;uVwi3<>=Gb!+!ee=(8MMsh#;t@cXQ-`%9>W4^G3xi=0F7$McBy$MYw! zl0We%!O z>l(j7NOYIWJ|6S*{OPhA@4J}J(e#Z^gz7@Y4(}T$?!JO+>h5%^KCJ7r9DUf5`eWfH zrfT7{I{Kq!HMI{r9rEMiqbux?O~3Td=K3W0=#$RTC)~rX#SgvJ!XDP=Vh=m%H+A=; zSKXh#j;3p3+V#=X^`}2EoukiY6MuRse!Ndk*U|KQyloxFlHc?CO(ct^596ASVcIpZ zb~2V}zmM*kXcd0mrzTF||9tTC)9t}@IA4x_iMuBK@b-suO@^BOC*M!SGVS|OT@!Ck zrQqg2Jx6SLHu>J1G!@?myRMkfKU0pL^+kT|AI;Gp>|rMkW6T>1joI{k7?P}(^U7_Zp+76&i|9R zr|Zb`Gs-~n_sOgh|4-8V!Ozaf(Pt9uA6!)bYj;1ZqyM#{|Lnz|q7siZT1pq^@^I5snq5a)X;p12bBNhA(a2(q0*S<7`4uR!b7jT%)_9(!o#SX=i#Tk z%EMoIjYoj;QyziJ&v*nWKj#rln@O)zxAYAjCgn{Yp~_o4!jxa|2v;ufh@h#?i_~`e zC66fOS3IJXU-O8e)yuc3gZdjDvy^vu#3{e!5wH9=j|6Jyy-U4RsiT)f9liIcpL&Uh zSsCY%qIh_uDib`?BoGcQp7TRH=mIn^50!ebS=1%fDcRKN(48l#j@ z`!rUeIb+OH%BY1Jr<79@HD0NpHfjQGktQNhsianFl2S#@)MTX^W|);4YN)0tE^4W! zvK9nOMCMJWLd~|RFP{tV!4t?9n#0BBYK4T zpr>#a{}(^Tf8sn|rv=t`aEZWEej-FfiZ~iI%@h_vOe9e)>ecV7KV*)GS;f*P;1A1P zQXXlK^{Gf5UDhg;Ey~|&Z>^TPm?DcZ$EW{QY14eoWYD+I1HH$=`YYUgz&3 zQ#OV-@hki{JVGY|M5u@s2_jWw3!5ks6~ZMNM5|aRt`^Hhr&ud`#YS0K|&Pc(}Kj8|%&QuC3nKb&6ZC_};6}PF-^QY>84(s^pPLm*_*G4G8x93BVWF@%P>05vZwr4%y4^CqNUK6h8cHN zQugFiKDTz)n?g2=yzBFySytXSwX-kI89v?=PPA%y(NgR4(cG|j^C-_sf#x=7=dWq! zIIi45xkzakcpj8zZ~2hon34$t>EnuL?Wy0%^TgMF@4Q0#czz(`_xwP*4SQs4zO&qm wgF!pf6~MOC@_YKrvIekn<@#Q>_H=1K$-&ai_J!@c{1 Date: Tue, 29 Nov 2022 15:37:08 +0100 Subject: [PATCH 0837/1620] New translations Messages.properties (Spanish) --- .../earth/app/view/Messages_es.properties | 500 +++++++++--------- 1 file changed, 255 insertions(+), 245 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index c2ce51b7bd..3ce9622fe0 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,255 +1,265 @@ -AboutDialog.19=Ocorreu um problema -AboutDialog.5=Para mais informações visite nosso site OpenForis.org -AboutDialog.6=Desculpe, um problema ocorreu ao tentar abrir esse link no seu navegador padrão. +AboutDialog.19=A problem occurred +AboutDialog.5=For more information visit our website OpenForis.org +AboutDialog.6=Sorry, a problem occurred while trying to open this link in your system's standard browser. AboutDialog.8=Ok -AspectCode.0=Norte -AspectCode.1=Nordeste -AspectCode.2=Leste -AspectCode.3=Sudeste -AspectCode.4=Sul -AspectCode.5=Sudoeste -AspectCode.6=Oeste -AspectCode.7=Noroeste -CollectEarthMenu.0=Importar Arquivo CEP -CollectEarthMenu.2=Utilidades -CollectEarthMenu.3=Separar arquivo CSV em partes -CollectEarthMenu.4=Exportar dados para XML (da data específica até o tempo presente) -CollectEarthMenu.5=Exportar para Collect Backup -CollectEarthMenu.6=Exportar dados como Collect Backup (todos os dados) -CollectEarthMenu.7=Exportar dados como Collect Backup (a partir de uma data) -CollectEarthMenu.8=Exportar dados para XML (filtrar por atributo) -CollectEarthWindow.0=Erro ao tentar exportar os dados para um arquivo CSV -CollectEarthWindow.10=Arquivo -CollectEarthWindow.11=Fechar -CollectEarthWindow.12=Ferramentas -CollectEarthWindow.13=Baixar dados para CSV (Excel) -CollectEarthWindow.14=Iniciar Análise SAIKU -CollectEarthWindow.15=Propiedades -CollectEarthWindow.16=Ajuda -CollectEarthWindow.17=Declaração -CollectEarthWindow.18=Encontrar parcelas ausentes em banco de dados +AspectCode.0=North +AspectCode.1=North-East +AspectCode.2=East +AspectCode.3=South-East +AspectCode.4=South +AspectCode.5=South-West +AspectCode.6=West +AspectCode.7=North-West +CollectEarthMenu.0=Import CEP file +CollectEarthMenu.2=Utilities +CollectEarthMenu.3=Divide large CSV plot files +CollectEarthMenu.4=Export data to XML (from specific date until present) +CollectEarthMenu.5=Export to Collect Backup +CollectEarthMenu.6=Export data as Collect Backup (all data) +CollectEarthMenu.7=Export data as Collect Backup (from date) +CollectEarthMenu.8=Export data to XML (using summary attribute) +CollectEarthWindow.0=Error when attempting to export data to CSV file +CollectEarthWindow.10=File +CollectEarthWindow.11=Exit +CollectEarthWindow.12=Tools +CollectEarthWindow.13=Download data to CSV (Excel) +CollectEarthWindow.14=Start SAIKU Analysis +CollectEarthWindow.15=Properties +CollectEarthWindow.16=Help +CollectEarthWindow.17=Disclaimer +CollectEarthWindow.18=Find missing plots in database CollectEarthWindow.19=Collect Earth -CollectEarthWindow.1=Erro ao exportar -CollectEarthWindow.20=Número de registros duplicados\: -CollectEarthWindow.21=Não foi possível encontrar o ícone para a janela principal -CollectEarthWindow.22=Tem certeza de querer fechar Collect Earth?
Ao fechar a janela será fechada também o servidor de Collect Earth -CollectEarthWindow.23=Confirmação requerida -CollectEarthWindow.24=Exportar a XML -CollectEarthWindow.25=Quer importar estes registros de qualquer maneira e perder o seus dados atuais? -CollectEarthWindow.26=Operador -CollectEarthWindow.27=Atualizar -CollectEarthWindow.28=O servidor Open Foris Collect Earth deve estar em execução enquanto o operador interprete os dados. -CollectEarthWindow.29=O servidor Saiku não está configurado. -CollectEarthWindow.2=Idioma -CollectEarthWindow.30=Por favor mantenha esta janela aberta enquanto estiver usando o Google Earth. -CollectEarthWindow.31=Exportar os dados coletados para um arquivo CSV -CollectEarthWindow.32=Fechar -CollectEarthWindow.33=O nome do operador deve ser maior de que 5 caracteres e mais curto do que 50 -CollectEarthWindow.34= Erro de Validação -CollectEarthWindow.35=NOME DO OPERADOR VAZIO\!
Preencha o nome do operador e clique no botão "Atualizar". -CollectEarthWindow.36=Nome do operador não pode estar vazio -CollectEarthWindow.37=Permanecer Aberto -CollectEarthWindow.38=Arquivos de CSV -CollectEarthWindow.39=AVISO\:Se recomenda de fazer um back-up dos seus dados atuais(Exportar para XML) antes de importar os novos dados -CollectEarthWindow.3=\ Erro ao importar dados. -CollectEarthWindow.40=Configurar caminho para o arquivo onde o Servidor Saiku se encontra instalado em Ferramentas->Propiedades->Avançado. -CollectEarthWindow.41=Guardar dados exportados para o arquivo\: -CollectEarthWindow.42=Sair -CollectEarthWindow.43=Registros repetidos detectados -CollectEarthWindow.44=Importar/Exportar -CollectEarthWindow.45=Exportar dados para XML (comprimidos) -CollectEarthWindow.46=Importar novos dados do ZIP (XML comprimidos) -CollectEarthWindow.47=Servidor Saiku não configurado -CollectEarthWindow.48=Arquivos ZIP -CollectEarthWindow.49=Arquivos Fusion CSV -CollectEarthWindow.4=Isenção de responsabilidade da FAO -CollectEarthWindow.50=Abrir Manual de Usuário -CollectEarthWindow.51=Verificar atualizações de Collect Earth -CollectEarthWindow.52=Abrir Arquivo de Registro da aplicação -CollectEarthWindow.53=Arquivo de Registro de Collect Earth -CollectEarthWindow.54=Carregar pontos de KML -CollectEarthWindow.55=Atualizar registros atuais usando CSV -CollectEarthWindow.56=Sobre... -CollectEarthWindow.57=O processo de arranque de Saiku ainda está em execução, por favor aguarde. -CollectEarthWindow.58=Não é possível iniciar a análise com Saiku -CollectEarthWindow.59=Quer voltar a gerar o conjunto de dados para o análise de Saiku?
Este processo pode demorar vários minutos.
Se clicar em "SIM" um novo conjunto de dados com a mais recente informação será gerada. -CollectEarthWindow.5=Fechar -CollectEarthWindow.60=Geraço de dados para Saiku -CollectEarthWindow.61=Exportar dados para XML (apenas os registros adicionados/modificados) -CollectEarthWindow.62=Sobre... -CollectEarthWindow.63=Erro acessando pontos de KML -CollectEarthWindow.64=Suporte Técnico -CollectEarthWindow.65=O nome do operador foi alterado -CollectEarthWindow.66=Nome do operador -CollectEarthWindow.67=Abra a pasta de dados do CE -CollectEarthWindow.6=Exportar dados a Fusion Table -CollectEarthWindow.70=Abra o manuel desta pesquisa -CollectEarthWindow.71=Gerar ferramenta Saiku Independente -CollectEarthWindow.7=Erro ao importar os dados -CollectEarthWindow.8=Texto de isenção não foi possivel de ser encontrado -CollectEarthWindow.9=Os dados importados contém registros que já estão presentes no seu banco de dados. -DynamicsCode.0=Inicialmente Floresta -DynamicsCode.1=Inicialmente Ãrea de Pastagem -DynamicsCode.2=Inicialmente Ãrea Urbana -DynamicsCode.3=Inicialmente Outros -DynamicsCode.4=Inicialmente Ãrea Alagada -DynamicsCode.5=Inicialmente Ãrea Agrícola -EarthApp.11=Collect Earth já está em execução -EarthApp.21=O arquivo contendo o gride de pontos como CSV/CED não foi encontrado no caminho selecionado\:
-EarthApp.23=Nenhum arquivo CSV/CED foi configurado \:

-EarthApp.24=O arquivo contendo o modelo Freemarker com a definição KML não foi encontrado no caminho selecionado \:
-EarthApp.26=Nenhum arquivo de definição KML foi configurado \:

-EarthApp.27=O arquivo contendo o formato balão HTML não foi encontrado no caminho selecionado \:
-EarthApp.29=Nenhum arquivo balão HTML foi configurado \:

-EarthApp.30=Por favor corrija a localização do arquivo no menu Ferramentas->Propriedades. -EarthApp.3=Lembrar mais tarde -EarthApp.4=Atualizar Agora -EarthApp.57=Existe uma nova versão do Collect Earth disponível\!
Como gostaria de proceder? -EarthApp.58=Alerta de Atualização -EarthApp.59=Erro ao importar aquivo do projeto -EarthApp.5=Não me lembre novamente -EarthApp.61=O arquivo do Collect Earth não pôde ser aberto.
Por favor certifique-se que Google Earth esteja instalado. -EarthApp.6= - Versão -EarthApp.70=AVISO -EarthApp.71=No Mac OS X, os arquivos do projeto Collect Earth (* .cep) não serão abertos no Collect Earth quando forem clicados duas vezes.
-EarthApp.72=Use a barra de ferramentas Collect Earth para abrir os arquivos .cep \: -EarthApp.73=Collect Earth - problemas em computadores Mac OS X -EarthSurveyService.9=Campo obrigatório -ExportActionListener.1=Escolha data a partir da qual queira exportar os dados -ExportDialogProcessMonitor.0=Processando os dados... -ExportDialogProcessMonitor.1=Esperando de inicializar o processo \: -ExportDialogProcessMonitor.4=Registros importados \: -ImportActionListener.0=Deseja importar os dados das parcelas que não tenham sido completamente preenchidos? -ImportActionListener.2=Se clicar NÃO apenas os dados das parcelas em estado completo ("verde"), serão importados. -ImportActionListener.3=Importar registros incompletos -ImportDialogProcessMonitor.0=\ CALCULANDO -ImportDialogProcessMonitor.11=Cifra inicial de registros \: -ImportDialogProcessMonitor.2=Importando registros.... -ImportDialogProcessMonitor.5=Cifra final de registros importados \: -ImportDialogProcessMonitor.8=Processando dados... +CollectEarthWindow.1=Export error +CollectEarthWindow.20=Number of duplicated records\: +CollectEarthWindow.21=Could not find icon for main frame +CollectEarthWindow.22=Are you sure that you want to close Collect Earth?
Closing the window will also close the Collect Earth server +CollectEarthWindow.23=Confirmation needed +CollectEarthWindow.24=XML Export +CollectEarthWindow.25=Do you want to add these records anyway and lose your current data? +CollectEarthWindow.26=Operator +CollectEarthWindow.27=Update +CollectEarthWindow.28=Open Foris Collect Earth server should be running while the operator interprets data. +CollectEarthWindow.29=The Saiku Server is not configured. +CollectEarthWindow.2=Language +CollectEarthWindow.30=Please maintain this window open while you are using Google Earth. +CollectEarthWindow.31=Export collected data to CSV file +CollectEarthWindow.32=Quit +CollectEarthWindow.33=The operator name has to be longer than 5 characters and shorter than 50 +CollectEarthWindow.34=Validation error +CollectEarthWindow.35=OPERATOR NAME EMPTY\!
Please fill the operator name and press the "Update" button. +CollectEarthWindow.36=Operator name cannot be empty +CollectEarthWindow.37=Keep Open +CollectEarthWindow.38=CSV files +CollectEarthWindow.39=NOTICE\: It is advisable that you back-up your current data (Export to XML) before importing the new data +CollectEarthWindow.3=\ Import error +CollectEarthWindow.40=Set-up the path to the folder where Saiku Server is installed in the Tools->Properties->Advanced tab. +CollectEarthWindow.41=Saving exported data to file\: +CollectEarthWindow.42=Quit +CollectEarthWindow.43=Conflicting records found +CollectEarthWindow.44=Data Import/Export +CollectEarthWindow.45=Export data to XML (compressed) +CollectEarthWindow.46=Import new data from ZIP (compressed XML) +CollectEarthWindow.47=Saiku Server not configured +CollectEarthWindow.48=Zip/collect-data files +CollectEarthWindow.49=Fusion CSV files +CollectEarthWindow.4=FAO Disclaimer notices +CollectEarthWindow.50=Open User Manual +CollectEarthWindow.51=Check for updates of Collect Earth +CollectEarthWindow.52=Open Application Log File +CollectEarthWindow.53=Collect Earth Log file +CollectEarthWindow.54=Load points from KML +CollectEarthWindow.55=Update current records using CSV +CollectEarthWindow.56=About... +CollectEarthWindow.57=The Saiku starter process is still running, please wait. +CollectEarthWindow.58=Cannot start Saiku analysis +CollectEarthWindow.59=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming.
If you click on "YES" a new dataset with the latest information will be generated. +CollectEarthWindow.5=Close +CollectEarthWindow.60=Saiku data generation +CollectEarthWindow.61=Export data to XML (modified records since last export) +CollectEarthWindow.62=About... +CollectEarthWindow.63=Error getting the points from KML +CollectEarthWindow.64=Technical Support +CollectEarthWindow.65=The operator name has been changed +CollectEarthWindow.66=Operator name +CollectEarthWindow.67=Open data folder +CollectEarthWindow.6=Export to Fusion Table +CollectEarthWindow.70=Open the Survey Guide +CollectEarthWindow.71=Generate Stand-Alone Saiku tool +CollectEarthWindow.7=Error when importing data +CollectEarthWindow.8=Disclaimer text could not be found +CollectEarthWindow.9=The data imported contains records that are already present on your database. +DynamicsCode.0=Initially Forest +DynamicsCode.1=Initially Grassland +DynamicsCode.2=Initially Settlement +DynamicsCode.3=Initially Otherland +DynamicsCode.4=Initially Wetland +DynamicsCode.5=Initially Cropland +EarthApp.11=Collect Earth is already running +EarthApp.21=The file containing the grid of plots as a CSV/CED is not found in the selected path \:
+EarthApp.23=No CSV/CED file has been set-up \:

+EarthApp.24=The file containing the Freemarker template with the KML definition is not found in the selected path \:
+EarthApp.26=No KML definition file has been set-up \:

+EarthApp.27=The file containing the HTML balloon form is not found in the selected path \:
+EarthApp.29=No HTML balloon file has been set-up \:

+EarthApp.30=Please correct the file location in the Tools->Properties menu. +EarthApp.3=Remind me later +EarthApp.4=Update Now +EarthApp.57=There is a new version of Collect Earth available\!
How do you want to proceed? +EarthApp.58=Update alert +EarthApp.59=Error when importing project file +EarthApp.5=Do not remind me again +EarthApp.61=The Collect Earth file could not be open.
Please make sure that Google Earth is installed. +EarthApp.6=\ - Version +EarthApp.70=WARNING +EarthApp.71=In Mac OS X the Collect Earth project files (*.cep) will not open in Collect Earth when they are double-clicked.
+EarthApp.72=Use the Collect Earth toolbar to open the .cep files \: +EarthApp.73=Collect Earth issues in Mac OS X computers +EarthSurveyService.9=Field required +ExportActionListener.1=Pick Date to Export Records From +ExportDialogProcessMonitor.0=Processing data... +ExportDialogProcessMonitor.1=Waiting to initialize process \: +ExportDialogProcessMonitor.4=Exported records \: +ImportActionListener.0=Should the data for plots that have not been completely filled be imported? +ImportActionListener.2=If you click NO only the data from plots in the "green" state, containing all data, will be imported. +ImportActionListener.3=Import non-finished records +ImportDialogProcessMonitor.0=\ CALCULATING +ImportDialogProcessMonitor.11=Initial number of records \: +ImportDialogProcessMonitor.2=Importing records... +ImportDialogProcessMonitor.5=Actual number of imported records \: +ImportDialogProcessMonitor.8=Processing data... ImportProcessMonitorDialog.0=Imported records \: -ImportXMLDialogProcessMonitor.1 = Substitua dados no banco de dados -ImportXMLDialogProcessMonitor.2 = Importe apenas registros não conflitantes -InfiniteProgressMonitor.0=Cancelar operação -JFileChooserExistsAware.0=Arquivo de projeto Collect Earth -KmlImportService.13=Selecione um arquivo CSV para salvar a localização dos pontos -MissingPlotsListener.0=Erro ao obter informação sobre parcelas ausentes na Base de Dados -MissingPlotsListener.10=Número total de ppontos no desenho de amostragem \: -MissingPlotsListener.12=Número de pontos perdidos \: -MissingPlotsListener.14=Todos os pontos foram preenchidos\! -MissingPlotsListener.1=Parcelas ausentes -MissingPlotsListener.2=Copiar conteúdos -MissingPlotsListener.3=Escolha os arquivos contendo informação sobre as parcelas ( .csv or .ced files ) para os quais deseja saber se todos os dados foram preenchidos. -MissingPlotsListener.4=Parcelas ausentes - informação -MissingPlotsListener.5=Do arquivo \: -MissingPlotsListener.6=Exportar para arquivo CED -NO=Não -NO_TO_ALL=Não para todos -OpenTextFileListener.0=O arquivo de texto não foi encontrado em \: -OptionWizard.0=Opções do Collect Earth -OptionWizard.100=Abrir Planet -OptionWizard.101=Llave da API do Planet +ImportXMLDialogProcessMonitor.1 = Overwrite data +ImportXMLDialogProcessMonitor.2 = Import only non-conflicting plots +InfiniteProgressMonitor.0=Cancel operation +JFileChooserExistsAware.0=Collect Earth Project file +KmlImportService.13=Select a CSV file to save the plot locations to +MissingPlotsListener.0=Error while getting information about plots not present on the Database +MissingPlotsListener.10=Total number of plots in the sampling design \: +MissingPlotsListener.12=Number of missing plots \: +MissingPlotsListener.14=All the plots are filled\! +MissingPlotsListener.1=Missing plots +MissingPlotsListener.2=Copy contents to clipboard +MissingPlotsListener.3=Pick the files that contain plot information ( .csv or .ced files ) for which you want to know if all data has been filled. +MissingPlotsListener.4=Missing plots - information +MissingPlotsListener.5=From file \: +MissingPlotsListener.6=Export to CED file +NO=No +NO_TO_ALL=No to all +OpenTextFileListener.0=The text file was not found at \: +OptionWizard.0=Collect Earth options +OptionWizard.100=Open Planet imagery +OptionWizard.101=Planet API key OptionWizard.1021=URL SecureWatch -OptionWizard.102=Abrir Maxar SecureWatch -OptionWizard.103=Configure o URL para o Mapa Extra (abre quando configurado) \: -OptionWizard.104=Navegadores -OptionWizard.105=Abrir Earth Map -OptionWizard.110=Use imagens mensais fornecidas pela NICFI -OptionWizard.10=Abrir arquivo de backup -OptionWizard.11=Desconhecido\: usar ifconfig -OptionWizard.12=Cliente Instância +OptionWizard.102=Open Maxar SecureWatch +OptionWizard.103=Set URL for Extra Map (opens when set) \: +OptionWizard.104=Browsers +OptionWizard.105=Open Earth Map +OptionWizard.110=Use NICFI provided Monthly imagery +OptionWizard.10=Open backup folder +OptionWizard.11=Unknown\: use ifconfig +OptionWizard.12=Client Instance OptionWizard.13=Collect Earth Server IP -OptionWizard.14=Collect Earth Porta de Servidor (p.ex. 8023) -OptionWizard.15=Guardar & Aplicar alteraçães +OptionWizard.14=Collect Earth Server port (e.g. 8023) +OptionWizard.15=Save & Apply changes OptionWizard.16=ID OptionWizard.17=X-coord OptionWizard.18=Y-coord -OptionWizard.19=Elevação -OptionWizard.1=Escolher Navegador -OptionWizard.20= Os conteúdos de Google Earth foram alterados.
Por favor aceite a regarga do conteúdo uma vez que Google Earth lhe pergunte. -OptionWizard.21=Atualizado com sucesso -OptionWizard.22=Relevo -OptionWizard.23=Houve um erro ao reabrir os dados de Google Earth -OptionWizard.24=Cancelar -OptionWizard.25=Modo de Operação -OptionWizard.26=BBDD servidor -OptionWizard.27=Isto não é um Arquivo Saiku reconhecível (o arquivo start-saiku.bat não se encontra presente) -OptionWizard.28=Servidor Saiku não reconhecível -OptionWizard.29=BBDD porta -OptionWizard.2=Tipo de uso(servidor/cliente) -OptionWizard.30=Opçães SQLite -OptionWizard.31=Dados de amostra -OptionWizard.32=Disposição da Parcela -OptionWizard.33=Definiço de Questionários -OptionWizard.34=Serviços Integrados -OptionWizard.35=Número de pontos de control -OptionWizard.36=Distância entre os pontos de control (em metros) -OptionWizard.37=Margem com o perímetro da parcela (em metros) -OptionWizard.38=O arquivo CSV/CED não foi possivel ser lido corretamente.
O arquivo deve conter valores separados por vírgulas do seguinte modo\:
-OptionWizard.39=ID,Y-Coordenada,X-Coordenada,elevação,relevo,orientação -OptionWizard.3=Servidor Instance -OptionWizard.40=Projetos -OptionWizard.41=Carregar um novo arquivo de projeto -OptionWizard.42=Erro ao fechar o leitor CSV -OptionWizard.43=Nome do questionário -OptionWizard.44=Realizar automaticamente backup do banco de dados em -OptionWizard.45=Abrir Earth Engine Playground (descontinuado) -OptionWizard.46=Abrir Earth Engine Timelapse -OptionWizard.47=Abrir Bing Maps -OptionWizard.48=Abrir formulário em um navegador externo em vez de Google Earth (recomendado para LINUX) -OptionWizard.49=Caminho do arquivo CED/CSV com as coordenadas das parcelas -OptionWizard.4=IP do computador atual\: -OptionWizard.50=Navegar.. -OptionWizard.51=Erro ao importar os arquivos do projeto -OptionWizard.52= Arquivo CSV/CED com coordinadas -OptionWizard.53=Sem pontos -OptionWizard.54=Ponto Central -OptionWizard.55=Erro ao importar diretório do projeto -OptionWizard.56=Carregar projeto -OptionWizard.57=Projetos previamente carregados -OptionWizard.58=Abrir GEE Code Editor (requer acesso ao Trusted Tester) -OptionWizard.59=Abrir Here Maps focado no ponto -OptionWizard.5= Collect Earth Servidor porto\: -OptionWizard.65=Caminho para arquivo Saiku -OptionWizard.66=Navegar... -OptionWizard.67=Caminho para o executável do Firefox -OptionWizard.68=Navegar... -OptionWizard.6=Parâmetros BD PostgreSQL -OptionWizard.70=Arquivos executáveis -OptionWizard.72=Arquivos binários -OptionWizard.73=Caminho para o executável do Chrome -OptionWizard.74=Navegar... -OptionWizard.76=Arquivos executáveis -OptionWizard.78=Arquivos binarios -OptionWizard.79=Caminho para o padrão de KML Freemarker -OptionWizard.7=Nome de Usuário -OptionWizard.80=Navegar... -OptionWizard.82=Padrão Freemarker -OptionWizard.83=Caminho para formulário HTML Balloon -OptionWizard.84=Navegar... -OptionWizard.86=Pagina web HTML -OptionWizard.87=Caminho para XML com definição IDM -OptionWizard.88=Navegar... -OptionWizard.8=Senha -OptionWizard.90=Definiço XML IDM -OptionWizard.91=Servidor (versão para gerente ou uso autônomo) -OptionWizard.92=Cliente (operador/conectado ao servidor) -OptionWizard.93=SQLite (Embutido/com base em um único arquivo) +OptionWizard.19=Elevation +OptionWizard.1=Choose Browser +OptionWizard.20=The Google Earth contents have been changed.
Please accept the content reload when you are prompted by Google Earth. +OptionWizard.21=Update successful +OptionWizard.22=Slope +OptionWizard.23=There was an error when re-opening the Google Earth data +OptionWizard.24=Cancel +OptionWizard.25=Operation Mode +OptionWizard.26=DB host +OptionWizard.27=This is not a recognized Saiku Folder ( the start-saiku.bat file is not present) +OptionWizard.28=Saiku Server not recognized +OptionWizard.29=DB port +OptionWizard.2=Workflow (server/client) +OptionWizard.30=SQLite options +OptionWizard.31=Sample data +OptionWizard.32=Plot layout +OptionWizard.33=Survey Definition +OptionWizard.34=Integrated Services +OptionWizard.35=Number of control points +OptionWizard.36=Distance between control points (in meters) +OptionWizard.37=Margin with plot border (in meters) +OptionWizard.38=The CSV/CED file cannot be read correctly.
The file is expected to have a comma separated values like this \:
+OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect +OptionWizard.3=Server Instance +OptionWizard.40=Projects +OptionWizard.41=Load a new project file +OptionWizard.42=Error when closing the CSV reader +OptionWizard.43=Name of survey +OptionWizard.44=automatically back-up database at +OptionWizard.45=Open Earth Engine Playground ( deprecated ) +OptionWizard.46=Open Earth Engine Timelapse +OptionWizard.47=Open Bing Maps +OptionWizard.48=Open form on a browser instead of Google Earth (recommended for LINUX) +OptionWizard.49=Path to ced/csv file with plot data +OptionWizard.4=Current computer IP \: +OptionWizard.50=Browse... +OptionWizard.51=Error importing project file +OptionWizard.52=CSV/CED file with only coordinates +OptionWizard.53=No points +OptionWizard.54=Central point +OptionWizard.55=Error importing project folder +OptionWizard.56=Load project +OptionWizard.57=Previously loaded projects +OptionWizard.58=Open GEE Code Editor (requires Trusted Tester access) +OptionWizard.59=Open Here Maps focused on the plot +OptionWizard.5=Collect Earth Server port\: +OptionWizard.65=Path to Saiku folder +OptionWizard.66=Browse... +OptionWizard.67=Path to Firefox executable +OptionWizard.68=Browse... +OptionWizard.6=PostgreSQL DB parameters +OptionWizard.70=Executable files +OptionWizard.72=Binary files +OptionWizard.73=Path to Chrome executable +OptionWizard.74=Browse... +OptionWizard.76=Executable files +OptionWizard.78=Binary files +OptionWizard.79=Path to KML Freemarker template +OptionWizard.7=User Name +OptionWizard.80=Browse... +OptionWizard.82=Freemarker template +OptionWizard.83=Path to HTML Balloon form design +OptionWizard.84=Browse... +OptionWizard.86=HTML webpage +OptionWizard.87=Path to XML with IDM definition +OptionWizard.88=Browse... +OptionWizard.8=Password +OptionWizard.90=XML IDM definition +OptionWizard.91=Server (manager version or stand-alone use) +OptionWizard.92=Client (operator/connected to server) +OptionWizard.93=SQLite (Embedded/single file based) OptionWizard.94=PostgreSQL OptionWizard.95=Side of the sampling dots (in meters) -OptionWizard.9= Nome da Base de Dados -ProcessMonitorDialog.1=Erro de análise na linha número -ProcessMonitorDialog.4=, colunas -ProcessMonitorDialog.5= -- valores -SaikuAnalysisListener.0=Sim - Atualizar dados Saiku (longo processo) -SaikuAnalysisListener.1=Não - Use a mesma versão dos dados da última vez que o Saiku foi usado -SaikuToolExportListener.1=Geração da ferramenta Saiku -SaikuToolExportListener.2=Gerando a Ferramenta Saiku com o banco de dados atual -SaikuStarter.1=Iniciando Saiku -SaikuStarter.2=Iniciando Saiku pode demorar uns minutos, por favor aguarde\! -SaveEarthDataServlet.0=Sem dados -SaveEarthDataServlet.1=Problema ocorreu ao guardar os dados na Base de Dados -SaveEarthDataServlet.2=Os dados foram guardados -SlopeCode.0=Plano (0-5) -YES=Sim -YES_TO_ALL=Sim a todas \ No newline at end of file +OptionWizard.9=DB Name +ProcessMonitorDialog.1=Parsing error on row number +ProcessMonitorDialog.4=, columns +ProcessMonitorDialog.5=\ -- values +SaikuAnalysisListener.0=Yes - Refresh Saiku data (long process) +SaikuAnalysisListener.1=No - Use same version of the data as last time Saiku was used +SaikuStarter.1=Starting Saiku +SaikuStarter.2=Starting Saiku can take some minutes, please wait\! +SaikuToolExportListener.1=Saiku Tool generation +SaikuToolExportListener.2=Generating Saiku Tool with current database +SaveEarthDataServlet.0=Empty request +SaveEarthDataServlet.1=Problem occurred while saving data to the database +SaveEarthDataServlet.2=The data was saved +SlopeCode.0=Flat (0-5) +YES=Yes +YES_TO_ALL=Yes to all + +GenerateDatabaseStarter.1=Preparing for analysis +GenerateDatabaseStarter.2=Generating Relational Database + +IPCCGeneratorListener.1=Waiting for process to complete\! +IPCCGeneratorListener.2=The IPCC GHGi compatible data is being generated +IPCCGeneratorListener.3=Refresh the data (update with latest from Collect Earth) +IPCCGeneratorListener.4=Use the latest generated database (fastest process - no update) +IPCCGeneratorListener.5=GHGi Database generation +IPCCGeneratorListener.6=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming but it is necessary if the Collect Earth data has been updated since the last time.
\ No newline at end of file From 5baecfede84172057da5063ab8eb84c1f0f1a035 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:09 +0100 Subject: [PATCH 0838/1620] New translations Messages_hi.properties (French) --- .../earth/app/view/Messages_fr.properties | Bin 70708 -> 22428 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index aefdf309744a0187d10430151fd9f27cdefc40a9..f759c433b01b2ff61f62fa7862c75fbcd5bfc2dc 100644 GIT binary patch literal 22428 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 R*$z@f+>A|~brTa4{|9Y!1;79R literal 70708 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 Date: Tue, 29 Nov 2022 15:37:11 +0100 Subject: [PATCH 0839/1620] New translations Messages.properties (Portuguese) --- .../earth/app/view/Messages_pt.properties | Bin 92828 -> 13296 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 2ec713dbece406fb6e9a2c32099d4dbb4ef54db8..3ce9622fe0c9991acbdea8db731a02f3cf41ff16 100644 GIT binary patch literal 13296 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�mj&+KjGXtaI zM`?)wO7RD=!wcaKLnvh@!YPd(sYEH!+;51bBt@JOPc;8TC5dx0vy!5uDrr;fICN!f3t(b@TRO?!RtFRD@ zxYWG_OSy)5HLk(6xDMBAwl8m_qG~(gbylJiU08+HSc7h?#X9t0JvP8i@s67a{?U&C z>R)dp@W9R3OoW}6!06t zckno#z#$yQllVvc6Q05m9OdfT)A%lq6E^1=Jd5XW;tHho*XX5^`c+cATs`3&lvxPk zkD^56BO}l6((iXXROLP865Zoe#Z^grfeP0-5k_}7Qt7YLp5RG~BY^zTs-UOcZD#!P zo}$Gs?{a-+U02@*C31ax-#R63{krw*7~1=sd@DhlcqMp9{tO})CXmyJ%c_OR)?!21 zTHpVVwYfdYH~RiZ6j4&d7>p(Lr7x1pqWILO_hVwY-tPS=isu#YkJstm-(P3OKg-cy ze!cy<>uBPHN3PiMGx5twm-kvbf6nu*8CM^R^Us~5k0p^GDbi0iM-y@-^<(}_=V;<< zpS5)#b7B99(NEXWXZ_KiQiKz&f67xI?U~Q&=%ba_|3>Ifa~(~W=O;T-o#w3xZs2-9 z(|(gaAO3&3j$|y}m_FGYefYF~xRBF1nhyWT=4iS;{@iu+>FbX^tE1@>_{(yA#z%iy z^>L-tOxMw;uVwi3<>=Gb!+!ee=(8MMsh#;t@cXQ-`%9>W4^G3xi=0F7$McBy$MYw! zl0We%!O z>l(j7NOYIWJ|6S*{OPhA@4J}J(e#Z^gz7@Y4(}T$?!JO+>h5%^KCJ7r9DUf5`eWfH zrfT7{I{Kq!HMI{r9rEMiqbux?O~3Td=K3W0=#$RTC)~rX#SgvJ!XDP=Vh=m%H+A=; zSKXh#j;3p3+V#=X^`}2EoukiY6MuRse!Ndk*U|KQyloxFlHc?CO(ct^596ASVcIpZ zb~2V}zmM*kXcd0mrzTF||9tTC)9t}@IA4x_iMuBK@b-suO@^BOC*M!SGVS|OT@!Ck zrQqg2Jx6SLHu>J1G!@?myRMkfKU0pL^+kT|AI;Gp>|rMkW6T>1joI{k7?P}(^U7_Zp+76&i|9R zr|Zb`Gs-~n_sOgh|4-8V!Ozaf(Pt9uA6!)bYj;1ZqyM#{|Lnz|q7siZT1pq^@^I5snq5a)X;p12bBNhA(a2(q0*S<7`4uR!b7jT%)_9(!o#SX=i#Tk z%EMoIjYoj;QyziJ&v*nWKj#rln@O)zxAYAjCgn{Yp~_o4!jxa|2v;ufh@h#?i_~`e zC66fOS3IJXU-O8e)yuc3gZdjDvy^vu#3{e!5wH9=j|6Jyy-U4RsiT)f9liIcpL&Uh zSsCY%qIh_uDib`?BoGcQp7TRH=mIn^50!ebS=1%fDcRKN(48l#j@ z`!rUeIb+OH%BY1Jr<79@HD0NpHfjQGktQNhsianFl2S#@)MTX^W|);4YN)0tE^4W! zvK9nOMCMJWLd~|RFP{tV!4t?9n#0BBYK4T zpr>#a{}(^Tf8sn|rv=t`aEZWEej-FfiZ~iI%@h_vOe9e)>ecV7KV*)GS;f*P;1A1P zQXXlK^{Gf5UDhg;Ey~|&Z>^TPm?DcZ$EW{QY14eoWYD+I1HH$=`YYUgz&3 zQ#OV-@hki{JVGY|M5u@s2_jWw3!5ks6~ZMNM5|aRt`^Hhr&ud`#YS0K|&Pc(}Kj8|%&QuC3nKb&6ZC_};6}PF-^QY>84(s^pPLm*_*G4G8x93BVWF@%P>05vZwr4%y4^CqNUK6h8cHN zQugFiKDTz)n?g2=yzBFySytXSwX-kI89v?=PPA%y(NgR4(cG|j^C-_sf#x=7=dWq! zIIi45xkzakcpj8zZ~2hon34$t>EnuL?Wy0%^TgMF@4Q0#czz(`_xwP*4SQs4zO&qm wgF!pf6~MOC@_YKrvIekn<@#Q>_H=1K$-&ai_J!@c{1 Date: Tue, 29 Nov 2022 15:37:12 +0100 Subject: [PATCH 0840/1620] New translations Messages.properties (English) --- .../earth/app/view/Messages_en.properties | 500 +++++++++--------- 1 file changed, 255 insertions(+), 245 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index c2ce51b7bd..3ce9622fe0 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,255 +1,265 @@ -AboutDialog.19=Ocorreu um problema -AboutDialog.5=Para mais informações visite nosso site OpenForis.org -AboutDialog.6=Desculpe, um problema ocorreu ao tentar abrir esse link no seu navegador padrão. +AboutDialog.19=A problem occurred +AboutDialog.5=For more information visit our website OpenForis.org +AboutDialog.6=Sorry, a problem occurred while trying to open this link in your system's standard browser. AboutDialog.8=Ok -AspectCode.0=Norte -AspectCode.1=Nordeste -AspectCode.2=Leste -AspectCode.3=Sudeste -AspectCode.4=Sul -AspectCode.5=Sudoeste -AspectCode.6=Oeste -AspectCode.7=Noroeste -CollectEarthMenu.0=Importar Arquivo CEP -CollectEarthMenu.2=Utilidades -CollectEarthMenu.3=Separar arquivo CSV em partes -CollectEarthMenu.4=Exportar dados para XML (da data específica até o tempo presente) -CollectEarthMenu.5=Exportar para Collect Backup -CollectEarthMenu.6=Exportar dados como Collect Backup (todos os dados) -CollectEarthMenu.7=Exportar dados como Collect Backup (a partir de uma data) -CollectEarthMenu.8=Exportar dados para XML (filtrar por atributo) -CollectEarthWindow.0=Erro ao tentar exportar os dados para um arquivo CSV -CollectEarthWindow.10=Arquivo -CollectEarthWindow.11=Fechar -CollectEarthWindow.12=Ferramentas -CollectEarthWindow.13=Baixar dados para CSV (Excel) -CollectEarthWindow.14=Iniciar Análise SAIKU -CollectEarthWindow.15=Propiedades -CollectEarthWindow.16=Ajuda -CollectEarthWindow.17=Declaração -CollectEarthWindow.18=Encontrar parcelas ausentes em banco de dados +AspectCode.0=North +AspectCode.1=North-East +AspectCode.2=East +AspectCode.3=South-East +AspectCode.4=South +AspectCode.5=South-West +AspectCode.6=West +AspectCode.7=North-West +CollectEarthMenu.0=Import CEP file +CollectEarthMenu.2=Utilities +CollectEarthMenu.3=Divide large CSV plot files +CollectEarthMenu.4=Export data to XML (from specific date until present) +CollectEarthMenu.5=Export to Collect Backup +CollectEarthMenu.6=Export data as Collect Backup (all data) +CollectEarthMenu.7=Export data as Collect Backup (from date) +CollectEarthMenu.8=Export data to XML (using summary attribute) +CollectEarthWindow.0=Error when attempting to export data to CSV file +CollectEarthWindow.10=File +CollectEarthWindow.11=Exit +CollectEarthWindow.12=Tools +CollectEarthWindow.13=Download data to CSV (Excel) +CollectEarthWindow.14=Start SAIKU Analysis +CollectEarthWindow.15=Properties +CollectEarthWindow.16=Help +CollectEarthWindow.17=Disclaimer +CollectEarthWindow.18=Find missing plots in database CollectEarthWindow.19=Collect Earth -CollectEarthWindow.1=Erro ao exportar -CollectEarthWindow.20=Número de registros duplicados\: -CollectEarthWindow.21=Não foi possível encontrar o ícone para a janela principal -CollectEarthWindow.22=Tem certeza de querer fechar Collect Earth?
Ao fechar a janela será fechada também o servidor de Collect Earth -CollectEarthWindow.23=Confirmação requerida -CollectEarthWindow.24=Exportar a XML -CollectEarthWindow.25=Quer importar estes registros de qualquer maneira e perder o seus dados atuais? -CollectEarthWindow.26=Operador -CollectEarthWindow.27=Atualizar -CollectEarthWindow.28=O servidor Open Foris Collect Earth deve estar em execução enquanto o operador interprete os dados. -CollectEarthWindow.29=O servidor Saiku não está configurado. -CollectEarthWindow.2=Idioma -CollectEarthWindow.30=Por favor mantenha esta janela aberta enquanto estiver usando o Google Earth. -CollectEarthWindow.31=Exportar os dados coletados para um arquivo CSV -CollectEarthWindow.32=Fechar -CollectEarthWindow.33=O nome do operador deve ser maior de que 5 caracteres e mais curto do que 50 -CollectEarthWindow.34= Erro de Validação -CollectEarthWindow.35=NOME DO OPERADOR VAZIO\!
Preencha o nome do operador e clique no botão "Atualizar". -CollectEarthWindow.36=Nome do operador não pode estar vazio -CollectEarthWindow.37=Permanecer Aberto -CollectEarthWindow.38=Arquivos de CSV -CollectEarthWindow.39=AVISO\:Se recomenda de fazer um back-up dos seus dados atuais(Exportar para XML) antes de importar os novos dados -CollectEarthWindow.3=\ Erro ao importar dados. -CollectEarthWindow.40=Configurar caminho para o arquivo onde o Servidor Saiku se encontra instalado em Ferramentas->Propiedades->Avançado. -CollectEarthWindow.41=Guardar dados exportados para o arquivo\: -CollectEarthWindow.42=Sair -CollectEarthWindow.43=Registros repetidos detectados -CollectEarthWindow.44=Importar/Exportar -CollectEarthWindow.45=Exportar dados para XML (comprimidos) -CollectEarthWindow.46=Importar novos dados do ZIP (XML comprimidos) -CollectEarthWindow.47=Servidor Saiku não configurado -CollectEarthWindow.48=Arquivos ZIP -CollectEarthWindow.49=Arquivos Fusion CSV -CollectEarthWindow.4=Isenção de responsabilidade da FAO -CollectEarthWindow.50=Abrir Manual de Usuário -CollectEarthWindow.51=Verificar atualizações de Collect Earth -CollectEarthWindow.52=Abrir Arquivo de Registro da aplicação -CollectEarthWindow.53=Arquivo de Registro de Collect Earth -CollectEarthWindow.54=Carregar pontos de KML -CollectEarthWindow.55=Atualizar registros atuais usando CSV -CollectEarthWindow.56=Sobre... -CollectEarthWindow.57=O processo de arranque de Saiku ainda está em execução, por favor aguarde. -CollectEarthWindow.58=Não é possível iniciar a análise com Saiku -CollectEarthWindow.59=Quer voltar a gerar o conjunto de dados para o análise de Saiku?
Este processo pode demorar vários minutos.
Se clicar em "SIM" um novo conjunto de dados com a mais recente informação será gerada. -CollectEarthWindow.5=Fechar -CollectEarthWindow.60=Geraço de dados para Saiku -CollectEarthWindow.61=Exportar dados para XML (apenas os registros adicionados/modificados) -CollectEarthWindow.62=Sobre... -CollectEarthWindow.63=Erro acessando pontos de KML -CollectEarthWindow.64=Suporte Técnico -CollectEarthWindow.65=O nome do operador foi alterado -CollectEarthWindow.66=Nome do operador -CollectEarthWindow.67=Abra a pasta de dados do CE -CollectEarthWindow.6=Exportar dados a Fusion Table -CollectEarthWindow.70=Abra o manuel desta pesquisa -CollectEarthWindow.71=Gerar ferramenta Saiku Independente -CollectEarthWindow.7=Erro ao importar os dados -CollectEarthWindow.8=Texto de isenção não foi possivel de ser encontrado -CollectEarthWindow.9=Os dados importados contém registros que já estão presentes no seu banco de dados. -DynamicsCode.0=Inicialmente Floresta -DynamicsCode.1=Inicialmente Ãrea de Pastagem -DynamicsCode.2=Inicialmente Ãrea Urbana -DynamicsCode.3=Inicialmente Outros -DynamicsCode.4=Inicialmente Ãrea Alagada -DynamicsCode.5=Inicialmente Ãrea Agrícola -EarthApp.11=Collect Earth já está em execução -EarthApp.21=O arquivo contendo o gride de pontos como CSV/CED não foi encontrado no caminho selecionado\:
-EarthApp.23=Nenhum arquivo CSV/CED foi configurado \:

-EarthApp.24=O arquivo contendo o modelo Freemarker com a definição KML não foi encontrado no caminho selecionado \:
-EarthApp.26=Nenhum arquivo de definição KML foi configurado \:

-EarthApp.27=O arquivo contendo o formato balão HTML não foi encontrado no caminho selecionado \:
-EarthApp.29=Nenhum arquivo balão HTML foi configurado \:

-EarthApp.30=Por favor corrija a localização do arquivo no menu Ferramentas->Propriedades. -EarthApp.3=Lembrar mais tarde -EarthApp.4=Atualizar Agora -EarthApp.57=Existe uma nova versão do Collect Earth disponível\!
Como gostaria de proceder? -EarthApp.58=Alerta de Atualização -EarthApp.59=Erro ao importar aquivo do projeto -EarthApp.5=Não me lembre novamente -EarthApp.61=O arquivo do Collect Earth não pôde ser aberto.
Por favor certifique-se que Google Earth esteja instalado. -EarthApp.6= - Versão -EarthApp.70=AVISO -EarthApp.71=No Mac OS X, os arquivos do projeto Collect Earth (* .cep) não serão abertos no Collect Earth quando forem clicados duas vezes.
-EarthApp.72=Use a barra de ferramentas Collect Earth para abrir os arquivos .cep \: -EarthApp.73=Collect Earth - problemas em computadores Mac OS X -EarthSurveyService.9=Campo obrigatório -ExportActionListener.1=Escolha data a partir da qual queira exportar os dados -ExportDialogProcessMonitor.0=Processando os dados... -ExportDialogProcessMonitor.1=Esperando de inicializar o processo \: -ExportDialogProcessMonitor.4=Registros importados \: -ImportActionListener.0=Deseja importar os dados das parcelas que não tenham sido completamente preenchidos? -ImportActionListener.2=Se clicar NÃO apenas os dados das parcelas em estado completo ("verde"), serão importados. -ImportActionListener.3=Importar registros incompletos -ImportDialogProcessMonitor.0=\ CALCULANDO -ImportDialogProcessMonitor.11=Cifra inicial de registros \: -ImportDialogProcessMonitor.2=Importando registros.... -ImportDialogProcessMonitor.5=Cifra final de registros importados \: -ImportDialogProcessMonitor.8=Processando dados... +CollectEarthWindow.1=Export error +CollectEarthWindow.20=Number of duplicated records\: +CollectEarthWindow.21=Could not find icon for main frame +CollectEarthWindow.22=Are you sure that you want to close Collect Earth?
Closing the window will also close the Collect Earth server +CollectEarthWindow.23=Confirmation needed +CollectEarthWindow.24=XML Export +CollectEarthWindow.25=Do you want to add these records anyway and lose your current data? +CollectEarthWindow.26=Operator +CollectEarthWindow.27=Update +CollectEarthWindow.28=Open Foris Collect Earth server should be running while the operator interprets data. +CollectEarthWindow.29=The Saiku Server is not configured. +CollectEarthWindow.2=Language +CollectEarthWindow.30=Please maintain this window open while you are using Google Earth. +CollectEarthWindow.31=Export collected data to CSV file +CollectEarthWindow.32=Quit +CollectEarthWindow.33=The operator name has to be longer than 5 characters and shorter than 50 +CollectEarthWindow.34=Validation error +CollectEarthWindow.35=OPERATOR NAME EMPTY\!
Please fill the operator name and press the "Update" button. +CollectEarthWindow.36=Operator name cannot be empty +CollectEarthWindow.37=Keep Open +CollectEarthWindow.38=CSV files +CollectEarthWindow.39=NOTICE\: It is advisable that you back-up your current data (Export to XML) before importing the new data +CollectEarthWindow.3=\ Import error +CollectEarthWindow.40=Set-up the path to the folder where Saiku Server is installed in the Tools->Properties->Advanced tab. +CollectEarthWindow.41=Saving exported data to file\: +CollectEarthWindow.42=Quit +CollectEarthWindow.43=Conflicting records found +CollectEarthWindow.44=Data Import/Export +CollectEarthWindow.45=Export data to XML (compressed) +CollectEarthWindow.46=Import new data from ZIP (compressed XML) +CollectEarthWindow.47=Saiku Server not configured +CollectEarthWindow.48=Zip/collect-data files +CollectEarthWindow.49=Fusion CSV files +CollectEarthWindow.4=FAO Disclaimer notices +CollectEarthWindow.50=Open User Manual +CollectEarthWindow.51=Check for updates of Collect Earth +CollectEarthWindow.52=Open Application Log File +CollectEarthWindow.53=Collect Earth Log file +CollectEarthWindow.54=Load points from KML +CollectEarthWindow.55=Update current records using CSV +CollectEarthWindow.56=About... +CollectEarthWindow.57=The Saiku starter process is still running, please wait. +CollectEarthWindow.58=Cannot start Saiku analysis +CollectEarthWindow.59=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming.
If you click on "YES" a new dataset with the latest information will be generated. +CollectEarthWindow.5=Close +CollectEarthWindow.60=Saiku data generation +CollectEarthWindow.61=Export data to XML (modified records since last export) +CollectEarthWindow.62=About... +CollectEarthWindow.63=Error getting the points from KML +CollectEarthWindow.64=Technical Support +CollectEarthWindow.65=The operator name has been changed +CollectEarthWindow.66=Operator name +CollectEarthWindow.67=Open data folder +CollectEarthWindow.6=Export to Fusion Table +CollectEarthWindow.70=Open the Survey Guide +CollectEarthWindow.71=Generate Stand-Alone Saiku tool +CollectEarthWindow.7=Error when importing data +CollectEarthWindow.8=Disclaimer text could not be found +CollectEarthWindow.9=The data imported contains records that are already present on your database. +DynamicsCode.0=Initially Forest +DynamicsCode.1=Initially Grassland +DynamicsCode.2=Initially Settlement +DynamicsCode.3=Initially Otherland +DynamicsCode.4=Initially Wetland +DynamicsCode.5=Initially Cropland +EarthApp.11=Collect Earth is already running +EarthApp.21=The file containing the grid of plots as a CSV/CED is not found in the selected path \:
+EarthApp.23=No CSV/CED file has been set-up \:

+EarthApp.24=The file containing the Freemarker template with the KML definition is not found in the selected path \:
+EarthApp.26=No KML definition file has been set-up \:

+EarthApp.27=The file containing the HTML balloon form is not found in the selected path \:
+EarthApp.29=No HTML balloon file has been set-up \:

+EarthApp.30=Please correct the file location in the Tools->Properties menu. +EarthApp.3=Remind me later +EarthApp.4=Update Now +EarthApp.57=There is a new version of Collect Earth available\!
How do you want to proceed? +EarthApp.58=Update alert +EarthApp.59=Error when importing project file +EarthApp.5=Do not remind me again +EarthApp.61=The Collect Earth file could not be open.
Please make sure that Google Earth is installed. +EarthApp.6=\ - Version +EarthApp.70=WARNING +EarthApp.71=In Mac OS X the Collect Earth project files (*.cep) will not open in Collect Earth when they are double-clicked.
+EarthApp.72=Use the Collect Earth toolbar to open the .cep files \: +EarthApp.73=Collect Earth issues in Mac OS X computers +EarthSurveyService.9=Field required +ExportActionListener.1=Pick Date to Export Records From +ExportDialogProcessMonitor.0=Processing data... +ExportDialogProcessMonitor.1=Waiting to initialize process \: +ExportDialogProcessMonitor.4=Exported records \: +ImportActionListener.0=Should the data for plots that have not been completely filled be imported? +ImportActionListener.2=If you click NO only the data from plots in the "green" state, containing all data, will be imported. +ImportActionListener.3=Import non-finished records +ImportDialogProcessMonitor.0=\ CALCULATING +ImportDialogProcessMonitor.11=Initial number of records \: +ImportDialogProcessMonitor.2=Importing records... +ImportDialogProcessMonitor.5=Actual number of imported records \: +ImportDialogProcessMonitor.8=Processing data... ImportProcessMonitorDialog.0=Imported records \: -ImportXMLDialogProcessMonitor.1 = Substitua dados no banco de dados -ImportXMLDialogProcessMonitor.2 = Importe apenas registros não conflitantes -InfiniteProgressMonitor.0=Cancelar operação -JFileChooserExistsAware.0=Arquivo de projeto Collect Earth -KmlImportService.13=Selecione um arquivo CSV para salvar a localização dos pontos -MissingPlotsListener.0=Erro ao obter informação sobre parcelas ausentes na Base de Dados -MissingPlotsListener.10=Número total de ppontos no desenho de amostragem \: -MissingPlotsListener.12=Número de pontos perdidos \: -MissingPlotsListener.14=Todos os pontos foram preenchidos\! -MissingPlotsListener.1=Parcelas ausentes -MissingPlotsListener.2=Copiar conteúdos -MissingPlotsListener.3=Escolha os arquivos contendo informação sobre as parcelas ( .csv or .ced files ) para os quais deseja saber se todos os dados foram preenchidos. -MissingPlotsListener.4=Parcelas ausentes - informação -MissingPlotsListener.5=Do arquivo \: -MissingPlotsListener.6=Exportar para arquivo CED -NO=Não -NO_TO_ALL=Não para todos -OpenTextFileListener.0=O arquivo de texto não foi encontrado em \: -OptionWizard.0=Opções do Collect Earth -OptionWizard.100=Abrir Planet -OptionWizard.101=Llave da API do Planet +ImportXMLDialogProcessMonitor.1 = Overwrite data +ImportXMLDialogProcessMonitor.2 = Import only non-conflicting plots +InfiniteProgressMonitor.0=Cancel operation +JFileChooserExistsAware.0=Collect Earth Project file +KmlImportService.13=Select a CSV file to save the plot locations to +MissingPlotsListener.0=Error while getting information about plots not present on the Database +MissingPlotsListener.10=Total number of plots in the sampling design \: +MissingPlotsListener.12=Number of missing plots \: +MissingPlotsListener.14=All the plots are filled\! +MissingPlotsListener.1=Missing plots +MissingPlotsListener.2=Copy contents to clipboard +MissingPlotsListener.3=Pick the files that contain plot information ( .csv or .ced files ) for which you want to know if all data has been filled. +MissingPlotsListener.4=Missing plots - information +MissingPlotsListener.5=From file \: +MissingPlotsListener.6=Export to CED file +NO=No +NO_TO_ALL=No to all +OpenTextFileListener.0=The text file was not found at \: +OptionWizard.0=Collect Earth options +OptionWizard.100=Open Planet imagery +OptionWizard.101=Planet API key OptionWizard.1021=URL SecureWatch -OptionWizard.102=Abrir Maxar SecureWatch -OptionWizard.103=Configure o URL para o Mapa Extra (abre quando configurado) \: -OptionWizard.104=Navegadores -OptionWizard.105=Abrir Earth Map -OptionWizard.110=Use imagens mensais fornecidas pela NICFI -OptionWizard.10=Abrir arquivo de backup -OptionWizard.11=Desconhecido\: usar ifconfig -OptionWizard.12=Cliente Instância +OptionWizard.102=Open Maxar SecureWatch +OptionWizard.103=Set URL for Extra Map (opens when set) \: +OptionWizard.104=Browsers +OptionWizard.105=Open Earth Map +OptionWizard.110=Use NICFI provided Monthly imagery +OptionWizard.10=Open backup folder +OptionWizard.11=Unknown\: use ifconfig +OptionWizard.12=Client Instance OptionWizard.13=Collect Earth Server IP -OptionWizard.14=Collect Earth Porta de Servidor (p.ex. 8023) -OptionWizard.15=Guardar & Aplicar alteraçães +OptionWizard.14=Collect Earth Server port (e.g. 8023) +OptionWizard.15=Save & Apply changes OptionWizard.16=ID OptionWizard.17=X-coord OptionWizard.18=Y-coord -OptionWizard.19=Elevação -OptionWizard.1=Escolher Navegador -OptionWizard.20= Os conteúdos de Google Earth foram alterados.
Por favor aceite a regarga do conteúdo uma vez que Google Earth lhe pergunte. -OptionWizard.21=Atualizado com sucesso -OptionWizard.22=Relevo -OptionWizard.23=Houve um erro ao reabrir os dados de Google Earth -OptionWizard.24=Cancelar -OptionWizard.25=Modo de Operação -OptionWizard.26=BBDD servidor -OptionWizard.27=Isto não é um Arquivo Saiku reconhecível (o arquivo start-saiku.bat não se encontra presente) -OptionWizard.28=Servidor Saiku não reconhecível -OptionWizard.29=BBDD porta -OptionWizard.2=Tipo de uso(servidor/cliente) -OptionWizard.30=Opçães SQLite -OptionWizard.31=Dados de amostra -OptionWizard.32=Disposição da Parcela -OptionWizard.33=Definiço de Questionários -OptionWizard.34=Serviços Integrados -OptionWizard.35=Número de pontos de control -OptionWizard.36=Distância entre os pontos de control (em metros) -OptionWizard.37=Margem com o perímetro da parcela (em metros) -OptionWizard.38=O arquivo CSV/CED não foi possivel ser lido corretamente.
O arquivo deve conter valores separados por vírgulas do seguinte modo\:
-OptionWizard.39=ID,Y-Coordenada,X-Coordenada,elevação,relevo,orientação -OptionWizard.3=Servidor Instance -OptionWizard.40=Projetos -OptionWizard.41=Carregar um novo arquivo de projeto -OptionWizard.42=Erro ao fechar o leitor CSV -OptionWizard.43=Nome do questionário -OptionWizard.44=Realizar automaticamente backup do banco de dados em -OptionWizard.45=Abrir Earth Engine Playground (descontinuado) -OptionWizard.46=Abrir Earth Engine Timelapse -OptionWizard.47=Abrir Bing Maps -OptionWizard.48=Abrir formulário em um navegador externo em vez de Google Earth (recomendado para LINUX) -OptionWizard.49=Caminho do arquivo CED/CSV com as coordenadas das parcelas -OptionWizard.4=IP do computador atual\: -OptionWizard.50=Navegar.. -OptionWizard.51=Erro ao importar os arquivos do projeto -OptionWizard.52= Arquivo CSV/CED com coordinadas -OptionWizard.53=Sem pontos -OptionWizard.54=Ponto Central -OptionWizard.55=Erro ao importar diretório do projeto -OptionWizard.56=Carregar projeto -OptionWizard.57=Projetos previamente carregados -OptionWizard.58=Abrir GEE Code Editor (requer acesso ao Trusted Tester) -OptionWizard.59=Abrir Here Maps focado no ponto -OptionWizard.5= Collect Earth Servidor porto\: -OptionWizard.65=Caminho para arquivo Saiku -OptionWizard.66=Navegar... -OptionWizard.67=Caminho para o executável do Firefox -OptionWizard.68=Navegar... -OptionWizard.6=Parâmetros BD PostgreSQL -OptionWizard.70=Arquivos executáveis -OptionWizard.72=Arquivos binários -OptionWizard.73=Caminho para o executável do Chrome -OptionWizard.74=Navegar... -OptionWizard.76=Arquivos executáveis -OptionWizard.78=Arquivos binarios -OptionWizard.79=Caminho para o padrão de KML Freemarker -OptionWizard.7=Nome de Usuário -OptionWizard.80=Navegar... -OptionWizard.82=Padrão Freemarker -OptionWizard.83=Caminho para formulário HTML Balloon -OptionWizard.84=Navegar... -OptionWizard.86=Pagina web HTML -OptionWizard.87=Caminho para XML com definição IDM -OptionWizard.88=Navegar... -OptionWizard.8=Senha -OptionWizard.90=Definiço XML IDM -OptionWizard.91=Servidor (versão para gerente ou uso autônomo) -OptionWizard.92=Cliente (operador/conectado ao servidor) -OptionWizard.93=SQLite (Embutido/com base em um único arquivo) +OptionWizard.19=Elevation +OptionWizard.1=Choose Browser +OptionWizard.20=The Google Earth contents have been changed.
Please accept the content reload when you are prompted by Google Earth. +OptionWizard.21=Update successful +OptionWizard.22=Slope +OptionWizard.23=There was an error when re-opening the Google Earth data +OptionWizard.24=Cancel +OptionWizard.25=Operation Mode +OptionWizard.26=DB host +OptionWizard.27=This is not a recognized Saiku Folder ( the start-saiku.bat file is not present) +OptionWizard.28=Saiku Server not recognized +OptionWizard.29=DB port +OptionWizard.2=Workflow (server/client) +OptionWizard.30=SQLite options +OptionWizard.31=Sample data +OptionWizard.32=Plot layout +OptionWizard.33=Survey Definition +OptionWizard.34=Integrated Services +OptionWizard.35=Number of control points +OptionWizard.36=Distance between control points (in meters) +OptionWizard.37=Margin with plot border (in meters) +OptionWizard.38=The CSV/CED file cannot be read correctly.
The file is expected to have a comma separated values like this \:
+OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect +OptionWizard.3=Server Instance +OptionWizard.40=Projects +OptionWizard.41=Load a new project file +OptionWizard.42=Error when closing the CSV reader +OptionWizard.43=Name of survey +OptionWizard.44=automatically back-up database at +OptionWizard.45=Open Earth Engine Playground ( deprecated ) +OptionWizard.46=Open Earth Engine Timelapse +OptionWizard.47=Open Bing Maps +OptionWizard.48=Open form on a browser instead of Google Earth (recommended for LINUX) +OptionWizard.49=Path to ced/csv file with plot data +OptionWizard.4=Current computer IP \: +OptionWizard.50=Browse... +OptionWizard.51=Error importing project file +OptionWizard.52=CSV/CED file with only coordinates +OptionWizard.53=No points +OptionWizard.54=Central point +OptionWizard.55=Error importing project folder +OptionWizard.56=Load project +OptionWizard.57=Previously loaded projects +OptionWizard.58=Open GEE Code Editor (requires Trusted Tester access) +OptionWizard.59=Open Here Maps focused on the plot +OptionWizard.5=Collect Earth Server port\: +OptionWizard.65=Path to Saiku folder +OptionWizard.66=Browse... +OptionWizard.67=Path to Firefox executable +OptionWizard.68=Browse... +OptionWizard.6=PostgreSQL DB parameters +OptionWizard.70=Executable files +OptionWizard.72=Binary files +OptionWizard.73=Path to Chrome executable +OptionWizard.74=Browse... +OptionWizard.76=Executable files +OptionWizard.78=Binary files +OptionWizard.79=Path to KML Freemarker template +OptionWizard.7=User Name +OptionWizard.80=Browse... +OptionWizard.82=Freemarker template +OptionWizard.83=Path to HTML Balloon form design +OptionWizard.84=Browse... +OptionWizard.86=HTML webpage +OptionWizard.87=Path to XML with IDM definition +OptionWizard.88=Browse... +OptionWizard.8=Password +OptionWizard.90=XML IDM definition +OptionWizard.91=Server (manager version or stand-alone use) +OptionWizard.92=Client (operator/connected to server) +OptionWizard.93=SQLite (Embedded/single file based) OptionWizard.94=PostgreSQL OptionWizard.95=Side of the sampling dots (in meters) -OptionWizard.9= Nome da Base de Dados -ProcessMonitorDialog.1=Erro de análise na linha número -ProcessMonitorDialog.4=, colunas -ProcessMonitorDialog.5= -- valores -SaikuAnalysisListener.0=Sim - Atualizar dados Saiku (longo processo) -SaikuAnalysisListener.1=Não - Use a mesma versão dos dados da última vez que o Saiku foi usado -SaikuToolExportListener.1=Geração da ferramenta Saiku -SaikuToolExportListener.2=Gerando a Ferramenta Saiku com o banco de dados atual -SaikuStarter.1=Iniciando Saiku -SaikuStarter.2=Iniciando Saiku pode demorar uns minutos, por favor aguarde\! -SaveEarthDataServlet.0=Sem dados -SaveEarthDataServlet.1=Problema ocorreu ao guardar os dados na Base de Dados -SaveEarthDataServlet.2=Os dados foram guardados -SlopeCode.0=Plano (0-5) -YES=Sim -YES_TO_ALL=Sim a todas \ No newline at end of file +OptionWizard.9=DB Name +ProcessMonitorDialog.1=Parsing error on row number +ProcessMonitorDialog.4=, columns +ProcessMonitorDialog.5=\ -- values +SaikuAnalysisListener.0=Yes - Refresh Saiku data (long process) +SaikuAnalysisListener.1=No - Use same version of the data as last time Saiku was used +SaikuStarter.1=Starting Saiku +SaikuStarter.2=Starting Saiku can take some minutes, please wait\! +SaikuToolExportListener.1=Saiku Tool generation +SaikuToolExportListener.2=Generating Saiku Tool with current database +SaveEarthDataServlet.0=Empty request +SaveEarthDataServlet.1=Problem occurred while saving data to the database +SaveEarthDataServlet.2=The data was saved +SlopeCode.0=Flat (0-5) +YES=Yes +YES_TO_ALL=Yes to all + +GenerateDatabaseStarter.1=Preparing for analysis +GenerateDatabaseStarter.2=Generating Relational Database + +IPCCGeneratorListener.1=Waiting for process to complete\! +IPCCGeneratorListener.2=The IPCC GHGi compatible data is being generated +IPCCGeneratorListener.3=Refresh the data (update with latest from Collect Earth) +IPCCGeneratorListener.4=Use the latest generated database (fastest process - no update) +IPCCGeneratorListener.5=GHGi Database generation +IPCCGeneratorListener.6=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming but it is necessary if the Collect Earth data has been updated since the last time.
\ No newline at end of file From 9fd8c40e8f414828343251594159e1d5ee0a9cb6 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:14 +0100 Subject: [PATCH 0841/1620] New translations Messages_es.properties (French) --- .../earth/app/view/Messages_fr.properties | 482 +++++++++--------- 1 file changed, 254 insertions(+), 228 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index f759c433b0..efdb0acb96 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,228 +1,254 @@ -AboutDialog.19=कोई समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ -AboutDialog.5=अधिक जानकारी के लिठहमारी वेबसाइट पर जाà¤à¤‚ OpenForis.org -AboutDialog.6=कà¥à¤·à¤®à¤¾ करें, à¤à¤• समसà¥à¤¯à¤¾ आपके सिसà¥à¤Ÿà¤® के मानक बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में इस लिंक को खोलने की कोशिश कर रही है. -AboutDialog.8=ठीक -AspectCode.0=उतà¥à¤¤à¤° दिशा -AspectCode.1=उतà¥à¤¤à¤°-पूरà¥à¤µ दिशा -AspectCode.2=पूरà¥à¤µ दिशा -AspectCode.3=दकà¥à¤·à¤¿à¤£-पूरà¥à¤µ दिशा -AspectCode.4=दकà¥à¤·à¤¿à¤£ दिशा -AspectCode.5=दकà¥à¤·à¤¿à¤£-पशà¥à¤šà¤¿à¤® दिशा -AspectCode.6=पशà¥à¤šà¤¿à¤® दिशा -AspectCode.7=उतà¥à¤¤à¤°-पशà¥à¤šà¤¿à¤® दिशा -CollectEarthWindow.0=तà¥à¤°à¥à¤Ÿà¤¿ जब सीà¤à¤¸à¤µà¥€ फ़ाइल में डेटा निरà¥à¤¯à¤¾à¤¤ करने का पà¥à¤°à¤¯à¤¾à¤¸ -CollectEarthWindow.1=निरà¥à¤¯à¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.10=फ़ाइल -CollectEarthWindow.11=बाहर जाà¤à¤‚ -CollectEarthWindow.12=उपकरण -CollectEarthWindow.13=डेटा सीà¤à¤¸à¤µà¥€ निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.14=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ -CollectEarthWindow.15=गà¥à¤£ -CollectEarthWindow.16=मदद -CollectEarthWindow.17=असà¥à¤µà¥€à¤•रण -CollectEarthWindow.18=डेटाबेस में लापता भूखंडों खोजें -CollectEarthWindow.19=पृथà¥à¤µà¥€ इकटà¥à¤ à¤¾ -CollectEarthWindow.2=भाषा -CollectEarthWindow.20=डà¥à¤ªà¥à¤²à¤¿à¤•ेट रिकॉरà¥à¤¡ की संखà¥à¤¯à¤¾\: -CollectEarthWindow.21=मà¥à¤–à¥à¤¯ फà¥à¤°à¥‡à¤® के लिठआइकन नहीं मिल सकता है -CollectEarthWindow.22=आपको लगता है कि आप à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ बंद करना चाहते हैं? विंडोज बंद करने से, à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° बंद हो जाà¤à¤—ा -CollectEarthWindow.23=पà¥à¤·à¥à¤Ÿà¤¿ की जरूरत है -CollectEarthWindow.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.25=आप वैसे भी इन अभिलेखों को जोड़ना चाहते हैं और अपने वरà¥à¤¤à¤®à¤¾à¤¨ डेटा खोने के लिठकिलक करना चाहते हैं? -CollectEarthWindow.26=ऑपरेटर,पà¥à¤°à¤šà¤¾à¤²à¤• -CollectEarthWindow.27=अदà¥à¤¯à¤¤à¤¨ -CollectEarthWindow.28= औपन फौरिस à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° चल रहा होना चाहिठ, जबभी ऑपरेटर डेटा की वà¥à¤¯à¤¾à¤–à¥à¤¯à¤¾ करें . -CollectEarthWindow.29=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. -CollectEarthWindow.3= आयात संबंधी तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.30=जबभी आप गà¥à¤—ल अरà¥à¤¥ का उपयोग कर रहे हैं, कृपया इस विंडोज को खà¥à¤²à¥€ बनाठरखें. -CollectEarthWindow.31=à¤à¤•तà¥à¤° डेटा सीà¤à¤¸à¤µà¥€ फाइल में भेजें -CollectEarthWindow.32=छोड़ना -CollectEarthWindow.33=ऑपरेटर का नाम के 5 अकà¥à¤·à¤° से बड़ा और 50 अकà¥à¤·à¤° से कम होना चाहिठ-CollectEarthWindow.34=मानà¥à¤¯à¤¤à¤¾ तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.35=ऑपरेटर नाम खाली\!
कृपया ऑपरेटर का नाम भरें और "अदà¥à¤¯à¤¤à¤¨" बटन दबाà¤à¤. -CollectEarthWindow.36=ऑपरेटर नाम रिकà¥à¤¤ नहीं हो सकता -CollectEarthWindow.37=खà¥à¤²à¤¾ रखो -CollectEarthWindow.38=सीà¤à¤¸à¤µà¥€ फ़ाइल -CollectEarthWindow.39=सूचना\: यह सलाह दी जाती है कि आप नठडेटा डालने करने से पहले अपने मौजूदा आंकडों को बैकअप(à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤) कर लें -CollectEarthWindow.4=à¤à¤«à¤à¤“ असà¥à¤µà¥€à¤•रण नोटिस -CollectEarthWindow.40=उस फ़ोलà¥à¤¡à¤° पर जाà¤à¤‚ जहां साà¤à¤•ॠसरà¥à¤µà¤° में सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ किया गया है, फ़ोलà¥à¤¡à¤° का रासà¥à¤¤à¤¾ उपकरण> गà¥à¤£> उनà¥à¤¨à¤¤ टैब. -CollectEarthWindow.41=निरà¥à¤¯à¤¾à¤¤ डेटा को फ़ाइल में बचाया जा रहा है \: -CollectEarthWindow.42=छोड़ना -CollectEarthWindow.43=परसà¥à¤ªà¤° विरोधी रिकॉरà¥à¤¡ पाया -CollectEarthWindow.44=डेटा आयात / निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.45=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ डेटा (संकà¥à¤šà¤¿à¤¤) -CollectEarthWindow.46=ज़िप से नठडेटा आयात करें (संकà¥à¤šà¤¿à¤¤ à¤à¤•à¥à¤¸à¤à¤®à¤à¤²) -CollectEarthWindow.55=सीà¤à¤¸à¤µà¥€ का उपयोग कर मौजूदा रिकॉरà¥à¤¡ को अपडेट करें -CollectEarthWindow.47=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. -CollectEarthWindow.48=ज़िप / à¤à¤•तà¥à¤°-डेटा फ़ाइल -CollectEarthWindow.49=फà¥à¤¯à¥‚जन सीà¤à¤¸à¤µà¥€ फ़ाइल -CollectEarthWindow.5=बंद करे -CollectEarthWindow.50= उपयोगकरà¥à¤¤à¤¾ मैनà¥à¤…ल खोलें -CollectEarthWindow.51=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ के अदà¥à¤¯à¤¤à¤¨ के लिठजाà¤à¤š करें -CollectEarthWindow.52= अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— लॉग फ़ाइल खोलें -CollectEarthWindow.53=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ लॉग फ़ाइल -CollectEarthWindow.54=केà¤à¤®à¤à¤² से लोड अंक -CollectEarthWindow.56=के विषय में... -CollectEarthWindow.57=साà¤à¤•ॠसà¥à¤Ÿà¤¾à¤°à¥à¤Ÿà¤° पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ अभी भी चल रहा है, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें. -CollectEarthWindow.58=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ नहीं कर सकते -CollectEarthWindow.59=आप साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ के लिठडेटा सेट फिर से उतà¥à¤ªà¤¨à¥à¤¨ करने के लिठकरना चाहते हैं?
यह पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ समय लेने वाली हो सकती है.
आप यदि "हाà¤"पर कà¥à¤²à¤¿à¤• करें, तो नवीनतम जानकारी के साथ à¤à¤• नया डाटासेट उतà¥à¤ªà¤¨à¥à¤¨ हो जाà¤à¤—ा. -CollectEarthWindow.6=फà¥à¤¯à¥‚जन टेबल के लिठनिरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.60=साà¤à¤•ॠडेटा उतà¥à¤ªà¤¨à¥à¤¨ -CollectEarthWindow.61=डेटा à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ (पिछले निरà¥à¤¯à¤¾à¤¤ के बाद से संशोधित रिकॉरà¥à¤¡) -CollectEarthWindow.62=के विषय मे... -CollectEarthWindow.63=केà¤à¤®à¤à¤² से अंक पà¥à¤°à¤¾à¤ªà¥à¤¤ करने में तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.64=तकनीकी सहायता -CollectEarthWindow.7=डेटा आयात में तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.8=असà¥à¤µà¥€à¤•रण पाठ नहीं पाया जा सका -CollectEarthWindow.9=डेटा आयात रिकॉरà¥à¤¡ वह है जो कि पहले से ही अपने डेटाबेस पर मौजूद हैं शामिल. -DynamicsCode.0=पà¥à¤°à¤¾à¤°à¤‚भ में वन -DynamicsCode.1=पà¥à¤°à¤¾à¤°à¤‚भ में घास का मैदान, -DynamicsCode.2=पà¥à¤°à¤¾à¤°à¤‚भ में आबादी वाला इलाका -DynamicsCode.3=पà¥à¤°à¤¾à¤°à¤‚भ में बंजर -DynamicsCode.4=पà¥à¤°à¤¾à¤°à¤‚भ में आरà¥à¤¦à¥à¤° भूमि -DynamicsCode.5=पà¥à¤°à¤¾à¤°à¤‚भ में खेत -OpenTextFileListener.0=इस पाठ का फ़ाइल नहीं मिला \: -OptionWizard.0= विकलà¥à¤ª -OptionWizard.1=बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° चà¥à¤¨à¥‡à¤‚ -OptionWizard.10=बैकअप फ़ोलà¥à¤¡à¤° खोलें -OptionWizard.11=अजà¥à¤žà¤¾à¤¤\: उपयोग ifconfig -OptionWizard.12=गà¥à¤°à¤¾à¤¹à¤•ों का उलà¥à¤²à¥‡à¤– -OptionWizard.13=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° आईपी -OptionWizard.14=कतà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ (उदाहरण- 8023) -OptionWizard.15=बचाà¤à¤‚ और परिवरà¥à¤¤à¤¨ लागू करें -OptionWizard.16=आईडी -OptionWizard.17=X- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क -OptionWizard.18=Y- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क -OptionWizard.19=उठान -OptionWizard.2=कारà¥à¤¯à¤ªà¥à¤°à¤µà¤¾à¤¹ (सरà¥à¤µà¤° / गà¥à¤°à¤¾à¤¹à¤•) -OptionWizard.20=गूगल अरà¥à¤¥ अंतरà¥à¤µà¤¸à¥à¤¤à¥ बदल दिया गया है
यदि गà¥à¤—ल अरà¥à¤¥ आप से कहे,अंतरà¥à¤µà¤¸à¥à¤¤à¥ पà¥à¤¨à¤ƒ लोड सà¥à¤µà¥€à¤•ार करें . -OptionWizard.21=अदà¥à¤¯à¤¤à¤¨ सफल -OptionWizard.22=ढाल -OptionWizard.23=गूगल अरà¥à¤¥ डेटा को फिर से खोलने में कोई तà¥à¤°à¥à¤Ÿà¤¿ थी -OptionWizard.24=रदà¥à¤¦ करना -OptionWizard.25=ऑपरेशन मोड -OptionWizard.26=डीबी होसà¥à¤Ÿ -OptionWizard.27=यह à¤à¤• मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ साà¤à¤•ॠफ़ोलà¥à¤¡à¤° नहीं है ( सà¥à¤Ÿà¤¾à¤°à¥à¤Ÿ-साà¤à¤•à¥.batफ़ाइल मौजूद नहीं है) -OptionWizard.28=साà¤à¤•ॠसरà¥à¤µà¤° मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ नहीं -OptionWizard.29=डीबी पोरà¥à¤Ÿ -OptionWizard.3=सरà¥à¤µà¤° आवृतà¥à¤¤à¤¿ -OptionWizard.30=à¤à¤¸à¤•à¥à¤¯à¥ लाइट विकलà¥à¤ª -OptionWizard.31=सेमà¥à¤ªà¤² डेटा -OptionWizard.32=पà¥à¤²à¥‰à¤Ÿ लेआउट -OptionWizard.33=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ परिभाषा -OptionWizard.34=विकसित -OptionWizard.35=सेमà¥à¤ªà¤² अंक की संखà¥à¤¯à¤¾ -OptionWizard.36=सेमà¥à¤ªà¤² बिंदॠके बीच दूरी (मीटर में) -OptionWizard.37=भूखंड की सीमा के साथ मारà¥à¤œà¤¿à¤¨ (मीटर मे) -OptionWizard.38=सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सही ढंग से पढ़ा नहीं जा सकता.
इस फ़ाइल में à¤à¤• अलà¥à¤ªà¤µà¤¿à¤°à¤¾à¤® से अलग मूलà¥à¤¯à¥‹à¤‚ की उमà¥à¤®à¥€à¤¦ है \:
-OptionWizard.39=आईडी, वाई समनà¥à¤µà¤¯, à¤à¤•à¥à¤¸ समनà¥à¤µà¤¯, ऊंचाई, ढाल, पहलू -OptionWizard.4=वरà¥à¤¤à¤®à¤¾à¤¨ कंपà¥à¤¯à¥‚टर आईपी \: -OptionWizard.40=परियोजनाà¤à¤‚ -OptionWizard.41=à¤à¤• नई परियोजना फ़ाइल लोड करें -OptionWizard.42=सीà¤à¤¸à¤µà¥€ पाठक को बंद करते समय तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.43=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ का नाम -OptionWizard.44= सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ बैकअप डेटाबेस -OptionWizard.45=ओपन पृथà¥à¤µà¥€ इंजन ने पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° में जूम किया -OptionWizard.46=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठपृथà¥à¤µà¥€ इंजन टाइमलैपà¥à¤¸ खोलें -OptionWizard.47=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठबिंग मैपà¥à¤¸ खोलें -OptionWizard.48=बजाय गूगल अरà¥à¤¥ के फॉरà¥à¤® à¤à¤• बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° पर खोलें (लिनकà¥à¤¸ के लिठसिफारिश) -OptionWizard.49=भूखंड डेटा के साथ सीईडी / सीà¤à¤¸à¤µà¥€ फाइल भेजने के लिठपथ -OptionWizard.5=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ\: -OptionWizard.50=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.51=परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.52=केवल निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क के साथ सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल -OptionWizard.53=चौकोर -OptionWizard.54=केनà¥à¤¦à¥à¤°à¥€à¤¯ बिनà¥à¤¦à¥ -OptionWizard.55=परियोजना फ़ोलà¥à¤¡à¤° आयात तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.56=लोड परियोजना -OptionWizard.57=पहले से लोड परियोजना -OptionWizard.58= जी ई ई का मैदान खोलें (विशà¥à¤µà¤¸à¤¨à¥€à¤¯ जांचकरà¥à¤¤à¤¾ के उपयोग की आवशà¥à¤¯à¤•ता है) -OptionWizard.59=यहां भूखंड पर केंदà¥à¤°à¤¿à¤¤ मैपà¥à¤¸ खोलें -OptionWizard.6=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² डीबी मापदंड -OptionWizard.65=साà¤à¤•à¥à¤«à¤¼à¥‹à¤²à¥à¤¡à¤° का पथ -OptionWizard.66=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.67=फ़ायरफ़ॉकà¥à¤¸ निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ -OptionWizard.68=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.7=उपयोगकरà¥à¤¤à¤¾ नाम -OptionWizard.70=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों -OptionWizard.72=बाइनरी फ़ाइलें -OptionWizard.73=कà¥à¤°à¥‹à¤® निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ -OptionWizard.74=बà¥à¤°à¤¾à¤‰à¤œ -OptionWizard.76=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों -OptionWizard.78=बाइनरी फ़ाइलें -OptionWizard.79=केà¤à¤®à¤à¤² फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ के लिठपथ -OptionWizard.8=पासवरà¥à¤¡ -OptionWizard.80=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.82=फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ -OptionWizard.83=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ पà¥à¤°à¤ªà¤¤à¥à¤° डिज़ाइन करने के लिठपथ -OptionWizard.84=बà¥à¤°à¤¾à¤‰à¤œ..... -OptionWizard.86=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² वेब पेज -OptionWizard.87=पथ आइडीà¤à¤® परिभाषा के साथ à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठ-OptionWizard.88=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.9=डीबी नाम -OptionWizard.90=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² आइडीà¤à¤® परिभाषा -OptionWizard.91=सरà¥à¤µà¤° (पà¥à¤°à¤¬à¤‚धक संसà¥à¤•रण या खड़े अकेले का उपयोग करें) -OptionWizard.92=कà¥à¤²à¤¾à¤‡à¤‚ट (ऑपरेटर / सरà¥à¤µà¤° से जà¥à¤¡à¤¼à¥‡) -OptionWizard.93=सकà¥à¤¯à¥‚à¤à¤²à¤¾à¤‡à¤Ÿ (à¤à¤‚बेडेड / à¤à¤•ल फाइल आधारित) -OptionWizard.94=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² -OptionWizard.95=सेमà¥à¤ªà¤² डॉटà¥à¤¸ के साइड (मीटर में) -SaikuAnalysisListener.0=हाठ- ताज़ा साà¤à¤•ॠडेटा (लंबी पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾) -SaikuAnalysisListener.1=नहीं - बस साà¤à¤•ॠशà¥à¤°à¥‚ -SaikuStarter.1=साà¤à¤•ॠशà¥à¤°à¥‚ -SaikuStarter.2= साà¤à¤•ॠशà¥à¤°à¥‚ कà¥à¤› मिनट लग सकते हैं, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें\! -SaveEarthDataServlet.0=खाली अनà¥à¤°à¥‹à¤§ -SaveEarthDataServlet.1= डेटाबेस में डेटा बचाते समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ है -SaveEarthDataServlet.2=डेटा बचाया था -SlopeCode.0=समतल (0-5) -EarthApp.11=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ पहले से ही चल रहा है -EarthApp.21=à¤à¤• सीà¤à¤¸à¤µà¥€ / सीईडी के रूप में भूखंडों की गà¥à¤°à¤¿à¤¡ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
-EarthApp.23=कोई सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सेट-अप नहीं किया गया है \:

-EarthApp.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² परिभाषा के साथ फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है \:
-EarthApp.26=कोई à¤à¤•à¥à¤¸à¤à¤®à¤à¤² फ़ाइल परिभाषा सेट अप नहीं किया गया है \:

-EarthApp.27=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ रूप से यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
-EarthApp.29=कोई à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ फ़ाइल सेट-अप नहीं किया गया है \:

-EarthApp.3=मà¥à¤à¥‡ बाद में याद दिलाना -EarthApp.30=उपकरण> गà¥à¤£ मेनू में फ़ाइल सà¥à¤¥à¤¾à¤¨ को ठीक करें . -EarthApp.4=अभी अदà¥à¤¯à¤¤à¤¨ करें -EarthApp.5=मà¥à¤à¥‡ दà¥à¤¬à¤¾à¤°à¤¾ याद मत दिलाना -EarthApp.57=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ का à¤à¤• नया संसà¥à¤•रण उपलबà¥à¤§ है\!
आप कैसे आगे बढ़ना चाहते हैं? -EarthApp.58=अदà¥à¤¯à¤¤à¤¨ चेतावनी -EarthApp.59= परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ -EarthApp.6=\ - संसà¥à¤•रण -EarthApp.61=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ फाइल खà¥à¤² नहीं सकती .
कृपया सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करें कि गूगल अरà¥à¤¥ सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ है. -EarthSurveyService.9=आवशà¥à¤¯à¤• कà¥à¤·à¥‡à¤¤à¥à¤° -ExportActionListener.1= तारीख चूनें जबसे रिकॉरà¥à¤¡ निरà¥à¤¯à¤¾à¤¤ करने है -ExportDialogProcessMonitor.0=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... -ExportDialogProcessMonitor.1=पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ पà¥à¤°à¤¾à¤°à¤‚भ करने के लिठपà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ कर रहा है \: -ExportDialogProcessMonitor.4=निरà¥à¤¯à¤¾à¤¤ रिकॉरà¥à¤¡\: -ImportProcessMonitorDialog.0=आयातित रिकॉरà¥à¤¡ \: -ImportActionListener.0=कà¥à¤¯à¤¾ उन भूखंडों के लिठडेटा जो कि पूरी तरह से भरे नहीं गठ,आयातित किया जाना चाहिà¤? -ImportActionListener.2=आप कà¥à¤²à¤¿à¤• करें, नहींतो केवल डेटा "हरी" राजà¥à¤¯ में भूखंडों से ,जिसमें सभी डेटा यà¥à¤•à¥à¤¤ है , आयात किया जाà¤à¤—ा। -ImportDialogProcessMonitor.0=\ गणना -ImportDialogProcessMonitor.11=रिकॉरà¥à¤¡ की पà¥à¤°à¤¾à¤°à¤‚भिक संखà¥à¤¯à¤¾ \: -ImportDialogProcessMonitor.2=रिकॉरà¥à¤¡ आयात... -ImportDialogProcessMonitor.5=आयातित रिकॉरà¥à¤¡ की वासà¥à¤¤à¤µà¤¿à¤• संखà¥à¤¯à¤¾ \: -ImportDialogProcessMonitor.8=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... -InfiniteProgressMonitor.0=रदà¥à¤¦ ऑपरेशन -JFileChooserExistsAware.0=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ परियोजना फ़ाइल -KmlImportService.13=पà¥à¤²à¥‰à¤Ÿ सà¥à¤¥à¤¾à¤¨à¥‹à¤‚ को बचाने के लिठà¤à¤• सीà¤à¤¸à¤µà¥€ फ़ाइल का चयन करें -MissingPlotsListener.0=तà¥à¤°à¥à¤Ÿà¤¿ उन भूखंडों के बारे में जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ करने के लिठजो डेटाबेस पर मौजूद नहीं -MissingPlotsListener.1=गà¥à¤® भूखंड -MissingPlotsListener.10=सेमà¥à¤ªà¤² डिजाइन में भूखंडों की कà¥à¤² संखà¥à¤¯à¤¾ \: -MissingPlotsListener.12=गà¥à¤® भूखंडों की संखà¥à¤¯à¤¾ \: -MissingPlotsListener.14=सभी भूखंडों भर रहे हैं\! -MissingPlotsListener.2=कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ अंतरà¥à¤µà¤¸à¥à¤¤à¥ की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ -MissingPlotsListener.3=भूखंड की जानकारी वाले फ़ाइलें चà¥à¤¨à¥‡à¤‚ ( .सीà¤à¤¸à¤µà¥€ या .सीईडी फ़ाइलें ) जिसके लिठआप जानना चाहते हैं तो सभी डेटा भर दिया गया है चाहता हूà¤. -MissingPlotsListener.4=गà¥à¤® भूखंड- जानकारी -MissingPlotsListener.5=फ़ाइल से \: -MissingPlotsListener.6=सीà¤à¤¡à¥€ फ़ाइल में निरà¥à¤¯à¤¾à¤¤ करें -ProcessMonitorDialog.1=पंकà¥à¤¤à¤¿ संखà¥à¤¯à¤¾ पर तà¥à¤°à¥à¤Ÿà¤¿ -ProcessMonitorDialog.4=, कॉलम -ProcessMonitorDialog.5=\ --मूलà¥à¤¯ -YES= हां -YES_TO_ALL=सब को हां -NO=नहीं -NO_TO_ALL=सभी को नहीं - - - +AboutDialog.19=Problemas al abrir +AboutDialog.5=Para mas informacion visite nuestra web OpenForis.org +AboutDialog.6=Lo sentimos, hemos tenido un problema al intentar abrir el link en su navegador standard. +AboutDialog.8=Ok +AspectCode.0=Norte +AspectCode.1=Noreste +AspectCode.2=Este +AspectCode.3=Sureste +AspectCode.4=Sur +AspectCode.5=Suroeste +AspectCode.6=Oeste +AspectCode.7=Noroeste +CollectEarthMenu.0=Importar archivo CEP +CollectEarthMenu.2=Utilidades +CollectEarthMenu.3=Dividir archivos de parcelas CSV grandes +CollectEarthMenu.4=Exportar datos a XML (desde una fecha especifica hasta este momento) +CollectEarthMenu.5=Exportar a Collect Backup +CollectEarthMenu.6=Exportar datos como Collect Backup (todos los datos) +CollectEarthMenu.7=Exportar datos como Collect Backup (filtrar por atributo ) +CollectEarthWindow.0=Error al intentar exportar los datos a un archivo CSV +CollectEarthWindow.10=Archivo +CollectEarthWindow.11=Cerrar +CollectEarthWindow.12=Herramientas +CollectEarthWindow.13=Descargar datos a CSV (Excel) +CollectEarthWindow.14=Comenzar análisis con Saiku +CollectEarthWindow.15=Propiedades +CollectEarthWindow.16=Ayuda +CollectEarthWindow.17=Declaración +CollectEarthWindow.18=Encontrar parcelas ausentes de la Base de Datos +CollectEarthWindow.19=Collect Earth +CollectEarthWindow.1=Error al exportar +CollectEarthWindow.20=Número de registros repetidos\: +CollectEarthWindow.21=No se pudo encontrar el icono de la ventana principal +CollectEarthWindow.22=¿Seguro que quieres cerrar Collect Earth?
El servidor de Collect Earth terminara al cerrar la ventana +CollectEarthWindow.23=Necesita confirmación +CollectEarthWindow.24=Exportar a XML +CollectEarthWindow.25=¿Quiere importar estos registros de todas formas y perder sus datos actuales? +CollectEarthWindow.26=Operador +CollectEarthWindow.27=Actualizar +CollectEarthWindow.28=El servidor Open Foris Collect Earth debe estar en funcionamiento mientras el operador esta realizando su trabajo. +CollectEarthWindow.29=El servidor Saiku no ha sido configurado. +CollectEarthWindow.2=Idioma +CollectEarthWindow.30=Por favor, mantenga esta ventana abierta mientras este utilizando Google Earth. +CollectEarthWindow.31=Exportar los datos como archivos CSV +CollectEarthWindow.32=Salir +CollectEarthWindow.33=El nombre del operador ha de ser mas largo que cinco caracteres y mas corto que 50 +CollectEarthWindow.34=Error de validación +CollectEarthWindow.35=\!NOMBRE DEL OPERADOR VACIO\!
Rellene el campo del nombre del operador y presione el botón de "Actualizar". +CollectEarthWindow.36=El nombre del operador no puede estar vacío +CollectEarthWindow.37=Conservar abierto +CollectEarthWindow.38=Archivos CSV +CollectEarthWindow.39=ATENCION\: Recomendamos que guarde una copia de seguridad de sus datos actuales (expórtelos a XML) antes de importar los nuevos datos. +CollectEarthWindow.3=\ Error al importar datos +CollectEarthWindow.40=Configure la ruta a la carpeta donde el servidor Saiku ha sido instalado en Herramientas->Propiedades->Avanzadas. +CollectEarthWindow.41=Guardando los datos en el archivo\: +CollectEarthWindow.42=Terminar +CollectEarthWindow.43=Detectados registros repetidos +CollectEarthWindow.44=Importar/Exportar datos +CollectEarthWindow.45=Exportar datos en XML (comprimidos) +CollectEarthWindow.46=Importar nuevos datos desde ZIP (XML comprimidos) +CollectEarthWindow.47=Servidor Saiku no configurado +CollectEarthWindow.48=Archivos zip/collect-data +CollectEarthWindow.49=Archivos Fusion CSV +CollectEarthWindow.4=Exención de responsabilidad de FAO +CollectEarthWindow.50=Abrir Manual de Usuario +CollectEarthWindow.51=Comprobar si hay actualizaciones de Collect Earth +CollectEarthWindow.52=Abrir el archivo de registo de la aplicacion +CollectEarthWindow.53=Archivo de registro de Collect Earth +CollectEarthWindow.54=Cargar puntos desde KML +CollectEarthWindow.55=Actualizar datos ya registrados desde CSV +CollectEarthWindow.56=Mas informacion... +CollectEarthWindow.57=El proceso para comenzar Saiku esta ejecutandose todavia, espere unos minutos. +CollectEarthWindow.58=No se pudo iniciar el analisis con Saiku +CollectEarthWindow.59=¿Quiere volver a generar los datos para el analisis de Saiku?
Este proceso puede tomar varios minutos.
Si hace click en "SI" los datos mas actuales seran generados. +CollectEarthWindow.5=Cerrar +CollectEarthWindow.60=Generación de datos para Saiku +CollectEarthWindow.61=Exportar a XML (solo los registros anadidos/modificados) +CollectEarthWindow.62=Mas informacion.. +CollectEarthWindow.63=Error leyendo los puntos desde el KML +CollectEarthWindow.64=Soporte tecnico +CollectEarthWindow.65=Se ha cambido el nombre del operador +CollectEarthWindow.66=Cambio de operador +CollectEarthWindow.67=Abrir directorio de datos de CE +CollectEarthWindow.6=Exportar datos a Fusion Table +CollectEarthWindow.70=Abrir el manual de esta encuesta +CollectEarthWindow.71=Generar herramienta Saiku independiente +CollectEarthWindow.7=Error al importar los datos +CollectEarthWindow.8=No se pudo encontrar el testo de exención de responsabilidad +CollectEarthWindow.9=Los datos importados contienen registros que ya están presentes en su base de datos +DynamicsCode.0=Inicialmente Bosque +DynamicsCode.1=Inicialmente Pastizal +DynamicsCode.2=Inicialmente Asentamiento +DynamicsCode.3=Inicialmente Otras tierras +DynamicsCode.4=Inicialmente Humedal +DynamicsCode.5=Inicialmente Cultivo +EarthApp.11=Collect Earth ya está ejecutandose +EarthApp.21=El archivo CSV/CED que contiene el diseño de la malla de puntos no se encuentra en la ruta seleccionada \:
+EarthApp.23=No se ha configurado ningun archivo de puntos CSV/CED \:

+EarthApp.24=El archivo que contiene la plantilla de Freemarker con la definicion del KML no se encuntra en la ruta seleccionada \:
+EarthApp.26=No se ha configurado ninguna archivo con la definicion del KML \:

+EarthApp.27=El archivo que contiene el formulario del pop-up en HTMl no se ha encontrado en la ruta seleccionada \:
+EarthApp.29=No se ha configurado ningun HTML de configuracion del pop-up \:

+EarthApp.30=Corrija la localizacion del archivo a traves del menu Herramientas->Propiedades. +EarthApp.3=Recordarme mas tarde +EarthApp.4=Actualizar Ahora +EarthApp.57=Hay una nueva version de Collect Earth disponible\! +EarthApp.58=Alerta para actualizacion +EarthApp.59=Error al importar el archivo del proyecto +EarthApp.5=No recordarme otra vez +EarthApp.61=El archivo KMZ generado por Collect Earth no se pudo abrir.
Asegurese de que Google Earth esta instalado. +EarthApp.6=\ - Version +EarthApp.70=ATENCION +EarthApp.71=En Mac OS X los archivos de proyectos de Collect Earth (*.cep) no se abren automaticamente al hacer doble-click sobre ellos.
+EarthApp.72=Utiliza la barra de herramientas de Collect Earth para abrir lo archivos .cep \: +EarthApp.73=Collect Earth en ordenadores Mac OS X +EarthSurveyService.9=Campo necesario +ExportActionListener.1=Elija la fecha desde la que exportar los datos +ExportDialogProcessMonitor.0=Procesando datos... +ExportDialogProcessMonitor.1=Esperando a la inicializacion del exportador \: +ExportDialogProcessMonitor.4=Registros exportados \: +ImportActionListener.0=¿Quiere importar los datos de las parcelas que no han sido completamente rellenadas? +ImportActionListener.2=Si hace click en NO se importarán solo los datos de las parcelas en el estado completo (verde)". +ImportActionListener.3=Importar registros incompletos +ImportDialogProcessMonitor.0=\ CALCULANDO +ImportDialogProcessMonitor.11=Cifra inicial the registros \: +ImportDialogProcessMonitor.2=Importando registros... +ImportDialogProcessMonitor.5=Cifra final de registros importados \: +ImportDialogProcessMonitor.8=Procesando datos... +ImportProcessMonitorDialog.0=Registros importados \: +ImportXMLDialogProcessMonitor.1 = Sobreescrivir las parcelas en BBDD +ImportXMLDialogProcessMonitor.2 = Importar solo parcelas sin conflictos +InfiniteProgressMonitor.0=Cancelar operación +JFileChooserExistsAware.0=Archivo de proyecto Collect Earth +KmlImportService.13=Seleccionar archivo CSV donde guardar las posiciones de las parcelas +MissingPlotsListener.0=Error cuando se estaba obteniendo información de las parcelas ausentes de la base de datos +MissingPlotsListener.10=Numero total de parcelas en el diseño de la muestra \: +MissingPlotsListener.12=Numero de parcelas que faltan \: +MissingPlotsListener.14=Todas las parcelas han sido rellenadas\! +MissingPlotsListener.1=Parcelas que faltan +MissingPlotsListener.2=Copiar contenidos +MissingPlotsListener.3=Elija los archivos que contienen informacion sobre las parcelas ( archivos .csv o .ced ) para los que desea averiguar si todos los datos se han rellenado. +MissingPlotsListener.4=Parcelas ausentes – informacion +MissingPlotsListener.5=Del archivo \: +MissingPlotsListener.6=Exportar a archivo CED +NO=No +NO_TO_ALL=No a todo +OpenTextFileListener.0=El archivo de texto no ha sido encontrado en \: +OptionWizard.0=Opciones de Collect Earth +OptionWizard.100=Abrir Planet +OptionWizard.101=Llave de la API de Planet +OptionWizard.1021=URL SecureWatch +OptionWizard.102=Abrir Maxar SecureWatch (necesario tener licencia) +OptionWizard.103=Configurar la URL para el Mapa Extra (se abre cuando esta configurada) \: +OptionWizard.104=Navegadores +OptionWizard.105=Abrir Earth Map +OptionWizard.110=Usar las imagenes mensuales de NICFI +OptionWizard.10=Abrir carpeta de copias de seguridad +OptionWizard.11=Desconocido\: usar ipconfig +OptionWizard.12=Instancia cliente +OptionWizard.13=Collect Earth Server IP +OptionWizard.14=Collect Earth Server puerto (e.g. 8023) +OptionWizard.15=Guardar & aplicar cambios +OptionWizard.16=ID +OptionWizard.17=X-coord +OptionWizard.18=Y-coord +OptionWizard.19=Elevación +OptionWizard.1=Elija navegador +OptionWizard.20=Los contenidos de Google Earth han cambiado.
Acepte la recarga del contenido cuando Google Earth le pregunte. +OptionWizard.21=Actualizado con éxito +OptionWizard.22=Pendiente +OptionWizard.23=Hubo un error al reabrir los datos en Google Earth +OptionWizard.24=Cancelar +OptionWizard.25=Modo de operación +OptionWizard.26=BBDD servidor +OptionWizard.27=Esta no es una carpeta de un servido Saiku ( el archivo start-saiku.bat no esta presente) +OptionWizard.28=Servidor Saiku no reconocible +OptionWizard.29=BBDD puerto +OptionWizard.2=Tipo de uso (servidor/cliente) +OptionWizard.30=Opciones SQLite +OptionWizard.31=Datos de muestra +OptionWizard.32=Diseño de parcela +OptionWizard.33=Definición de la encuesta +OptionWizard.34=Servicios integrados +OptionWizard.35=Número de puntos de control +OptionWizard.36=Distancia entre los puntos de control (en metros) +OptionWizard.37=Margen con el borde de la parcela (en metros) +OptionWizard.38=El archivo CSV/CED no pudo leerse correctamente.
El formato del archivo de valores separados por comas ha de ser como este \:
+OptionWizard.39=ID,Y-Coordinada,X-Coordinada,Elevacion,pendiente,orientacion +OptionWizard.3=Servidor +OptionWizard.40=Proyectos +OptionWizard.41=Cargar un nuevo archivo de proyecto +OptionWizard.42=Error al cerrar el lector del CSV +OptionWizard.43=Nombre de la encuesta +OptionWizard.44=Guardar copia de seguridad de la base de datos en +OptionWizard.45=Abrir Google Earth Engine Playground (obsoleto) +OptionWizard.46=Abrir Google Earth Engine Timelapse +OptionWizard.47=Abrir Bing Maps +OptionWizard.48=Abrir encuesta en un navegador externo en lugar de Google Earth (recomendado para LINUX) +OptionWizard.49=Ruta del archivo ced/csv con las coordenadas de las parcelas +OptionWizard.4=IP de este ordenador\: +OptionWizard.50=Navegar... +OptionWizard.51=Error al importar el archivos del proyecto +OptionWizard.52=Archivo CSV/CED con coordenadas +OptionWizard.53=Sin puntos +OptionWizard.54=Punto central +OptionWizard.55=Error al importar el directorio del proyecto +OptionWizard.56=Cargar proyecto +OptionWizard.57=Proyectos ya cargados +OptionWizard.58=Abrir GEE Code Editor (requiere accesso como Trusted Tester) +OptionWizard.59=Abrir Here Maps +OptionWizard.5=Collect Earth Server puerto\: +OptionWizard.65=Ruta para la carpeta de Saiku +OptionWizard.66=Navegar... +OptionWizard.67=Ruta del ejecutable de Firefox +OptionWizard.68=Navegar... +OptionWizard.6=Parámetros BD PostgreSQL +OptionWizard.70=Archivos ejecutables +OptionWizard.72=Archivos binarios +OptionWizard.73=Ruta del ejecutable de Chrome +OptionWizard.74=Navegar... +OptionWizard.76=Archivos ejecutables +OptionWizard.78=Archivos binarios +OptionWizard.79=Ruta a la plantilla KML de Freemarker +OptionWizard.7=Nombre de usuario +OptionWizard.80=Navegar... +OptionWizard.82=Plantilla Freemarker +OptionWizard.83=Ruta al formulario HTML +OptionWizard.84=Navegar... +OptionWizard.86=Pagina web HTML +OptionWizard.87=Ruta al XML con la definición del IDM +OptionWizard.88=Navegar... +OptionWizard.8=Password +OptionWizard.90=Definición XML IDM +OptionWizard.91=Servidor (versión para el gerente o para uso autónomo) +OptionWizard.92=Cliente (operador/conectado al servidor) +OptionWizard.93=SQLite (Embebida/basada en un único archivo) +OptionWizard.94=PostgreSQL +OptionWizard.95=Lado del punto de sampleo (en metros) +OptionWizard.9=Nombre de la Base de Datos +ProcessMonitorDialog.1=Error de interpretacion en la fila +ProcessMonitorDialog.4=, columnas +ProcessMonitorDialog.5=\ -- valores +SaikuAnalysisListener.0=Si - Actualizar datos de Saiku (proceso de larga duracion) +SaikuAnalysisListener.1=No - Usar los mismos datos de la ultima vez que se usó Saiku +SaikuStarter.1=Iniciando Saiku +SaikuStarter.2=Iniciar Saiku puede tomar varios minutos, espere por favor.\! +SaikuToolExportListener.1=Generación herramienta Saiku +SaikuToolExportListener.2=Generando la herramienta Saiku que incluye la base de datos +SaveEarthDataServlet.0=Sin datos +SaveEarthDataServlet.1=Problemas al guardar los datos en la Base de Datos +SaveEarthDataServlet.2=Los datos se han guardado +SlopeCode.0=Llano (0-5) +YES=Si +YES_TO_ALL=Si a todo \ No newline at end of file From 508cc733258d9286cd3e96ffdb365975a19da7be Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:15 +0100 Subject: [PATCH 0842/1620] New translations Messages_es.properties (Spanish) --- .../earth/app/view/Messages_es.properties | 497 +++++++++--------- 1 file changed, 243 insertions(+), 254 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 3ce9622fe0..efdb0acb96 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,265 +1,254 @@ -AboutDialog.19=A problem occurred -AboutDialog.5=For more information visit our website OpenForis.org -AboutDialog.6=Sorry, a problem occurred while trying to open this link in your system's standard browser. +AboutDialog.19=Problemas al abrir +AboutDialog.5=Para mas informacion visite nuestra web OpenForis.org +AboutDialog.6=Lo sentimos, hemos tenido un problema al intentar abrir el link en su navegador standard. AboutDialog.8=Ok -AspectCode.0=North -AspectCode.1=North-East -AspectCode.2=East -AspectCode.3=South-East -AspectCode.4=South -AspectCode.5=South-West -AspectCode.6=West -AspectCode.7=North-West -CollectEarthMenu.0=Import CEP file -CollectEarthMenu.2=Utilities -CollectEarthMenu.3=Divide large CSV plot files -CollectEarthMenu.4=Export data to XML (from specific date until present) -CollectEarthMenu.5=Export to Collect Backup -CollectEarthMenu.6=Export data as Collect Backup (all data) -CollectEarthMenu.7=Export data as Collect Backup (from date) -CollectEarthMenu.8=Export data to XML (using summary attribute) -CollectEarthWindow.0=Error when attempting to export data to CSV file -CollectEarthWindow.10=File -CollectEarthWindow.11=Exit -CollectEarthWindow.12=Tools -CollectEarthWindow.13=Download data to CSV (Excel) -CollectEarthWindow.14=Start SAIKU Analysis -CollectEarthWindow.15=Properties -CollectEarthWindow.16=Help -CollectEarthWindow.17=Disclaimer -CollectEarthWindow.18=Find missing plots in database +AspectCode.0=Norte +AspectCode.1=Noreste +AspectCode.2=Este +AspectCode.3=Sureste +AspectCode.4=Sur +AspectCode.5=Suroeste +AspectCode.6=Oeste +AspectCode.7=Noroeste +CollectEarthMenu.0=Importar archivo CEP +CollectEarthMenu.2=Utilidades +CollectEarthMenu.3=Dividir archivos de parcelas CSV grandes +CollectEarthMenu.4=Exportar datos a XML (desde una fecha especifica hasta este momento) +CollectEarthMenu.5=Exportar a Collect Backup +CollectEarthMenu.6=Exportar datos como Collect Backup (todos los datos) +CollectEarthMenu.7=Exportar datos como Collect Backup (filtrar por atributo ) +CollectEarthWindow.0=Error al intentar exportar los datos a un archivo CSV +CollectEarthWindow.10=Archivo +CollectEarthWindow.11=Cerrar +CollectEarthWindow.12=Herramientas +CollectEarthWindow.13=Descargar datos a CSV (Excel) +CollectEarthWindow.14=Comenzar análisis con Saiku +CollectEarthWindow.15=Propiedades +CollectEarthWindow.16=Ayuda +CollectEarthWindow.17=Declaración +CollectEarthWindow.18=Encontrar parcelas ausentes de la Base de Datos CollectEarthWindow.19=Collect Earth -CollectEarthWindow.1=Export error -CollectEarthWindow.20=Number of duplicated records\: -CollectEarthWindow.21=Could not find icon for main frame -CollectEarthWindow.22=Are you sure that you want to close Collect Earth?
Closing the window will also close the Collect Earth server -CollectEarthWindow.23=Confirmation needed -CollectEarthWindow.24=XML Export -CollectEarthWindow.25=Do you want to add these records anyway and lose your current data? -CollectEarthWindow.26=Operator -CollectEarthWindow.27=Update -CollectEarthWindow.28=Open Foris Collect Earth server should be running while the operator interprets data. -CollectEarthWindow.29=The Saiku Server is not configured. -CollectEarthWindow.2=Language -CollectEarthWindow.30=Please maintain this window open while you are using Google Earth. -CollectEarthWindow.31=Export collected data to CSV file -CollectEarthWindow.32=Quit -CollectEarthWindow.33=The operator name has to be longer than 5 characters and shorter than 50 -CollectEarthWindow.34=Validation error -CollectEarthWindow.35=OPERATOR NAME EMPTY\!
Please fill the operator name and press the "Update" button. -CollectEarthWindow.36=Operator name cannot be empty -CollectEarthWindow.37=Keep Open -CollectEarthWindow.38=CSV files -CollectEarthWindow.39=NOTICE\: It is advisable that you back-up your current data (Export to XML) before importing the new data -CollectEarthWindow.3=\ Import error -CollectEarthWindow.40=Set-up the path to the folder where Saiku Server is installed in the Tools->Properties->Advanced tab. -CollectEarthWindow.41=Saving exported data to file\: -CollectEarthWindow.42=Quit -CollectEarthWindow.43=Conflicting records found -CollectEarthWindow.44=Data Import/Export -CollectEarthWindow.45=Export data to XML (compressed) -CollectEarthWindow.46=Import new data from ZIP (compressed XML) -CollectEarthWindow.47=Saiku Server not configured -CollectEarthWindow.48=Zip/collect-data files -CollectEarthWindow.49=Fusion CSV files -CollectEarthWindow.4=FAO Disclaimer notices -CollectEarthWindow.50=Open User Manual -CollectEarthWindow.51=Check for updates of Collect Earth -CollectEarthWindow.52=Open Application Log File -CollectEarthWindow.53=Collect Earth Log file -CollectEarthWindow.54=Load points from KML -CollectEarthWindow.55=Update current records using CSV -CollectEarthWindow.56=About... -CollectEarthWindow.57=The Saiku starter process is still running, please wait. -CollectEarthWindow.58=Cannot start Saiku analysis -CollectEarthWindow.59=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming.
If you click on "YES" a new dataset with the latest information will be generated. -CollectEarthWindow.5=Close -CollectEarthWindow.60=Saiku data generation -CollectEarthWindow.61=Export data to XML (modified records since last export) -CollectEarthWindow.62=About... -CollectEarthWindow.63=Error getting the points from KML -CollectEarthWindow.64=Technical Support -CollectEarthWindow.65=The operator name has been changed -CollectEarthWindow.66=Operator name -CollectEarthWindow.67=Open data folder -CollectEarthWindow.6=Export to Fusion Table -CollectEarthWindow.70=Open the Survey Guide -CollectEarthWindow.71=Generate Stand-Alone Saiku tool -CollectEarthWindow.7=Error when importing data -CollectEarthWindow.8=Disclaimer text could not be found -CollectEarthWindow.9=The data imported contains records that are already present on your database. -DynamicsCode.0=Initially Forest -DynamicsCode.1=Initially Grassland -DynamicsCode.2=Initially Settlement -DynamicsCode.3=Initially Otherland -DynamicsCode.4=Initially Wetland -DynamicsCode.5=Initially Cropland -EarthApp.11=Collect Earth is already running -EarthApp.21=The file containing the grid of plots as a CSV/CED is not found in the selected path \:
-EarthApp.23=No CSV/CED file has been set-up \:

-EarthApp.24=The file containing the Freemarker template with the KML definition is not found in the selected path \:
-EarthApp.26=No KML definition file has been set-up \:

-EarthApp.27=The file containing the HTML balloon form is not found in the selected path \:
-EarthApp.29=No HTML balloon file has been set-up \:

-EarthApp.30=Please correct the file location in the Tools->Properties menu. -EarthApp.3=Remind me later -EarthApp.4=Update Now -EarthApp.57=There is a new version of Collect Earth available\!
How do you want to proceed? -EarthApp.58=Update alert -EarthApp.59=Error when importing project file -EarthApp.5=Do not remind me again -EarthApp.61=The Collect Earth file could not be open.
Please make sure that Google Earth is installed. +CollectEarthWindow.1=Error al exportar +CollectEarthWindow.20=Número de registros repetidos\: +CollectEarthWindow.21=No se pudo encontrar el icono de la ventana principal +CollectEarthWindow.22=¿Seguro que quieres cerrar Collect Earth?
El servidor de Collect Earth terminara al cerrar la ventana +CollectEarthWindow.23=Necesita confirmación +CollectEarthWindow.24=Exportar a XML +CollectEarthWindow.25=¿Quiere importar estos registros de todas formas y perder sus datos actuales? +CollectEarthWindow.26=Operador +CollectEarthWindow.27=Actualizar +CollectEarthWindow.28=El servidor Open Foris Collect Earth debe estar en funcionamiento mientras el operador esta realizando su trabajo. +CollectEarthWindow.29=El servidor Saiku no ha sido configurado. +CollectEarthWindow.2=Idioma +CollectEarthWindow.30=Por favor, mantenga esta ventana abierta mientras este utilizando Google Earth. +CollectEarthWindow.31=Exportar los datos como archivos CSV +CollectEarthWindow.32=Salir +CollectEarthWindow.33=El nombre del operador ha de ser mas largo que cinco caracteres y mas corto que 50 +CollectEarthWindow.34=Error de validación +CollectEarthWindow.35=\!NOMBRE DEL OPERADOR VACIO\!
Rellene el campo del nombre del operador y presione el botón de "Actualizar". +CollectEarthWindow.36=El nombre del operador no puede estar vacío +CollectEarthWindow.37=Conservar abierto +CollectEarthWindow.38=Archivos CSV +CollectEarthWindow.39=ATENCION\: Recomendamos que guarde una copia de seguridad de sus datos actuales (expórtelos a XML) antes de importar los nuevos datos. +CollectEarthWindow.3=\ Error al importar datos +CollectEarthWindow.40=Configure la ruta a la carpeta donde el servidor Saiku ha sido instalado en Herramientas->Propiedades->Avanzadas. +CollectEarthWindow.41=Guardando los datos en el archivo\: +CollectEarthWindow.42=Terminar +CollectEarthWindow.43=Detectados registros repetidos +CollectEarthWindow.44=Importar/Exportar datos +CollectEarthWindow.45=Exportar datos en XML (comprimidos) +CollectEarthWindow.46=Importar nuevos datos desde ZIP (XML comprimidos) +CollectEarthWindow.47=Servidor Saiku no configurado +CollectEarthWindow.48=Archivos zip/collect-data +CollectEarthWindow.49=Archivos Fusion CSV +CollectEarthWindow.4=Exención de responsabilidad de FAO +CollectEarthWindow.50=Abrir Manual de Usuario +CollectEarthWindow.51=Comprobar si hay actualizaciones de Collect Earth +CollectEarthWindow.52=Abrir el archivo de registo de la aplicacion +CollectEarthWindow.53=Archivo de registro de Collect Earth +CollectEarthWindow.54=Cargar puntos desde KML +CollectEarthWindow.55=Actualizar datos ya registrados desde CSV +CollectEarthWindow.56=Mas informacion... +CollectEarthWindow.57=El proceso para comenzar Saiku esta ejecutandose todavia, espere unos minutos. +CollectEarthWindow.58=No se pudo iniciar el analisis con Saiku +CollectEarthWindow.59=¿Quiere volver a generar los datos para el analisis de Saiku?
Este proceso puede tomar varios minutos.
Si hace click en "SI" los datos mas actuales seran generados. +CollectEarthWindow.5=Cerrar +CollectEarthWindow.60=Generación de datos para Saiku +CollectEarthWindow.61=Exportar a XML (solo los registros anadidos/modificados) +CollectEarthWindow.62=Mas informacion.. +CollectEarthWindow.63=Error leyendo los puntos desde el KML +CollectEarthWindow.64=Soporte tecnico +CollectEarthWindow.65=Se ha cambido el nombre del operador +CollectEarthWindow.66=Cambio de operador +CollectEarthWindow.67=Abrir directorio de datos de CE +CollectEarthWindow.6=Exportar datos a Fusion Table +CollectEarthWindow.70=Abrir el manual de esta encuesta +CollectEarthWindow.71=Generar herramienta Saiku independiente +CollectEarthWindow.7=Error al importar los datos +CollectEarthWindow.8=No se pudo encontrar el testo de exención de responsabilidad +CollectEarthWindow.9=Los datos importados contienen registros que ya están presentes en su base de datos +DynamicsCode.0=Inicialmente Bosque +DynamicsCode.1=Inicialmente Pastizal +DynamicsCode.2=Inicialmente Asentamiento +DynamicsCode.3=Inicialmente Otras tierras +DynamicsCode.4=Inicialmente Humedal +DynamicsCode.5=Inicialmente Cultivo +EarthApp.11=Collect Earth ya está ejecutandose +EarthApp.21=El archivo CSV/CED que contiene el diseño de la malla de puntos no se encuentra en la ruta seleccionada \:
+EarthApp.23=No se ha configurado ningun archivo de puntos CSV/CED \:

+EarthApp.24=El archivo que contiene la plantilla de Freemarker con la definicion del KML no se encuntra en la ruta seleccionada \:
+EarthApp.26=No se ha configurado ninguna archivo con la definicion del KML \:

+EarthApp.27=El archivo que contiene el formulario del pop-up en HTMl no se ha encontrado en la ruta seleccionada \:
+EarthApp.29=No se ha configurado ningun HTML de configuracion del pop-up \:

+EarthApp.30=Corrija la localizacion del archivo a traves del menu Herramientas->Propiedades. +EarthApp.3=Recordarme mas tarde +EarthApp.4=Actualizar Ahora +EarthApp.57=Hay una nueva version de Collect Earth disponible\! +EarthApp.58=Alerta para actualizacion +EarthApp.59=Error al importar el archivo del proyecto +EarthApp.5=No recordarme otra vez +EarthApp.61=El archivo KMZ generado por Collect Earth no se pudo abrir.
Asegurese de que Google Earth esta instalado. EarthApp.6=\ - Version -EarthApp.70=WARNING -EarthApp.71=In Mac OS X the Collect Earth project files (*.cep) will not open in Collect Earth when they are double-clicked.
-EarthApp.72=Use the Collect Earth toolbar to open the .cep files \: -EarthApp.73=Collect Earth issues in Mac OS X computers -EarthSurveyService.9=Field required -ExportActionListener.1=Pick Date to Export Records From -ExportDialogProcessMonitor.0=Processing data... -ExportDialogProcessMonitor.1=Waiting to initialize process \: -ExportDialogProcessMonitor.4=Exported records \: -ImportActionListener.0=Should the data for plots that have not been completely filled be imported? -ImportActionListener.2=If you click NO only the data from plots in the "green" state, containing all data, will be imported. -ImportActionListener.3=Import non-finished records -ImportDialogProcessMonitor.0=\ CALCULATING -ImportDialogProcessMonitor.11=Initial number of records \: -ImportDialogProcessMonitor.2=Importing records... -ImportDialogProcessMonitor.5=Actual number of imported records \: -ImportDialogProcessMonitor.8=Processing data... -ImportProcessMonitorDialog.0=Imported records \: -ImportXMLDialogProcessMonitor.1 = Overwrite data -ImportXMLDialogProcessMonitor.2 = Import only non-conflicting plots -InfiniteProgressMonitor.0=Cancel operation -JFileChooserExistsAware.0=Collect Earth Project file -KmlImportService.13=Select a CSV file to save the plot locations to -MissingPlotsListener.0=Error while getting information about plots not present on the Database -MissingPlotsListener.10=Total number of plots in the sampling design \: -MissingPlotsListener.12=Number of missing plots \: -MissingPlotsListener.14=All the plots are filled\! -MissingPlotsListener.1=Missing plots -MissingPlotsListener.2=Copy contents to clipboard -MissingPlotsListener.3=Pick the files that contain plot information ( .csv or .ced files ) for which you want to know if all data has been filled. -MissingPlotsListener.4=Missing plots - information -MissingPlotsListener.5=From file \: -MissingPlotsListener.6=Export to CED file +EarthApp.70=ATENCION +EarthApp.71=En Mac OS X los archivos de proyectos de Collect Earth (*.cep) no se abren automaticamente al hacer doble-click sobre ellos.
+EarthApp.72=Utiliza la barra de herramientas de Collect Earth para abrir lo archivos .cep \: +EarthApp.73=Collect Earth en ordenadores Mac OS X +EarthSurveyService.9=Campo necesario +ExportActionListener.1=Elija la fecha desde la que exportar los datos +ExportDialogProcessMonitor.0=Procesando datos... +ExportDialogProcessMonitor.1=Esperando a la inicializacion del exportador \: +ExportDialogProcessMonitor.4=Registros exportados \: +ImportActionListener.0=¿Quiere importar los datos de las parcelas que no han sido completamente rellenadas? +ImportActionListener.2=Si hace click en NO se importarán solo los datos de las parcelas en el estado completo (verde)". +ImportActionListener.3=Importar registros incompletos +ImportDialogProcessMonitor.0=\ CALCULANDO +ImportDialogProcessMonitor.11=Cifra inicial the registros \: +ImportDialogProcessMonitor.2=Importando registros... +ImportDialogProcessMonitor.5=Cifra final de registros importados \: +ImportDialogProcessMonitor.8=Procesando datos... +ImportProcessMonitorDialog.0=Registros importados \: +ImportXMLDialogProcessMonitor.1 = Sobreescrivir las parcelas en BBDD +ImportXMLDialogProcessMonitor.2 = Importar solo parcelas sin conflictos +InfiniteProgressMonitor.0=Cancelar operación +JFileChooserExistsAware.0=Archivo de proyecto Collect Earth +KmlImportService.13=Seleccionar archivo CSV donde guardar las posiciones de las parcelas +MissingPlotsListener.0=Error cuando se estaba obteniendo información de las parcelas ausentes de la base de datos +MissingPlotsListener.10=Numero total de parcelas en el diseño de la muestra \: +MissingPlotsListener.12=Numero de parcelas que faltan \: +MissingPlotsListener.14=Todas las parcelas han sido rellenadas\! +MissingPlotsListener.1=Parcelas que faltan +MissingPlotsListener.2=Copiar contenidos +MissingPlotsListener.3=Elija los archivos que contienen informacion sobre las parcelas ( archivos .csv o .ced ) para los que desea averiguar si todos los datos se han rellenado. +MissingPlotsListener.4=Parcelas ausentes – informacion +MissingPlotsListener.5=Del archivo \: +MissingPlotsListener.6=Exportar a archivo CED NO=No -NO_TO_ALL=No to all -OpenTextFileListener.0=The text file was not found at \: -OptionWizard.0=Collect Earth options -OptionWizard.100=Open Planet imagery -OptionWizard.101=Planet API key +NO_TO_ALL=No a todo +OpenTextFileListener.0=El archivo de texto no ha sido encontrado en \: +OptionWizard.0=Opciones de Collect Earth +OptionWizard.100=Abrir Planet +OptionWizard.101=Llave de la API de Planet OptionWizard.1021=URL SecureWatch -OptionWizard.102=Open Maxar SecureWatch -OptionWizard.103=Set URL for Extra Map (opens when set) \: -OptionWizard.104=Browsers -OptionWizard.105=Open Earth Map -OptionWizard.110=Use NICFI provided Monthly imagery -OptionWizard.10=Open backup folder -OptionWizard.11=Unknown\: use ifconfig -OptionWizard.12=Client Instance +OptionWizard.102=Abrir Maxar SecureWatch (necesario tener licencia) +OptionWizard.103=Configurar la URL para el Mapa Extra (se abre cuando esta configurada) \: +OptionWizard.104=Navegadores +OptionWizard.105=Abrir Earth Map +OptionWizard.110=Usar las imagenes mensuales de NICFI +OptionWizard.10=Abrir carpeta de copias de seguridad +OptionWizard.11=Desconocido\: usar ipconfig +OptionWizard.12=Instancia cliente OptionWizard.13=Collect Earth Server IP -OptionWizard.14=Collect Earth Server port (e.g. 8023) -OptionWizard.15=Save & Apply changes +OptionWizard.14=Collect Earth Server puerto (e.g. 8023) +OptionWizard.15=Guardar & aplicar cambios OptionWizard.16=ID OptionWizard.17=X-coord OptionWizard.18=Y-coord -OptionWizard.19=Elevation -OptionWizard.1=Choose Browser -OptionWizard.20=The Google Earth contents have been changed.
Please accept the content reload when you are prompted by Google Earth. -OptionWizard.21=Update successful -OptionWizard.22=Slope -OptionWizard.23=There was an error when re-opening the Google Earth data -OptionWizard.24=Cancel -OptionWizard.25=Operation Mode -OptionWizard.26=DB host -OptionWizard.27=This is not a recognized Saiku Folder ( the start-saiku.bat file is not present) -OptionWizard.28=Saiku Server not recognized -OptionWizard.29=DB port -OptionWizard.2=Workflow (server/client) -OptionWizard.30=SQLite options -OptionWizard.31=Sample data -OptionWizard.32=Plot layout -OptionWizard.33=Survey Definition -OptionWizard.34=Integrated Services -OptionWizard.35=Number of control points -OptionWizard.36=Distance between control points (in meters) -OptionWizard.37=Margin with plot border (in meters) -OptionWizard.38=The CSV/CED file cannot be read correctly.
The file is expected to have a comma separated values like this \:
-OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect -OptionWizard.3=Server Instance -OptionWizard.40=Projects -OptionWizard.41=Load a new project file -OptionWizard.42=Error when closing the CSV reader -OptionWizard.43=Name of survey -OptionWizard.44=automatically back-up database at -OptionWizard.45=Open Earth Engine Playground ( deprecated ) -OptionWizard.46=Open Earth Engine Timelapse -OptionWizard.47=Open Bing Maps -OptionWizard.48=Open form on a browser instead of Google Earth (recommended for LINUX) -OptionWizard.49=Path to ced/csv file with plot data -OptionWizard.4=Current computer IP \: -OptionWizard.50=Browse... -OptionWizard.51=Error importing project file -OptionWizard.52=CSV/CED file with only coordinates -OptionWizard.53=No points -OptionWizard.54=Central point -OptionWizard.55=Error importing project folder -OptionWizard.56=Load project -OptionWizard.57=Previously loaded projects -OptionWizard.58=Open GEE Code Editor (requires Trusted Tester access) -OptionWizard.59=Open Here Maps focused on the plot -OptionWizard.5=Collect Earth Server port\: -OptionWizard.65=Path to Saiku folder -OptionWizard.66=Browse... -OptionWizard.67=Path to Firefox executable -OptionWizard.68=Browse... -OptionWizard.6=PostgreSQL DB parameters -OptionWizard.70=Executable files -OptionWizard.72=Binary files -OptionWizard.73=Path to Chrome executable -OptionWizard.74=Browse... -OptionWizard.76=Executable files -OptionWizard.78=Binary files -OptionWizard.79=Path to KML Freemarker template -OptionWizard.7=User Name -OptionWizard.80=Browse... -OptionWizard.82=Freemarker template -OptionWizard.83=Path to HTML Balloon form design -OptionWizard.84=Browse... -OptionWizard.86=HTML webpage -OptionWizard.87=Path to XML with IDM definition -OptionWizard.88=Browse... +OptionWizard.19=Elevación +OptionWizard.1=Elija navegador +OptionWizard.20=Los contenidos de Google Earth han cambiado.
Acepte la recarga del contenido cuando Google Earth le pregunte. +OptionWizard.21=Actualizado con éxito +OptionWizard.22=Pendiente +OptionWizard.23=Hubo un error al reabrir los datos en Google Earth +OptionWizard.24=Cancelar +OptionWizard.25=Modo de operación +OptionWizard.26=BBDD servidor +OptionWizard.27=Esta no es una carpeta de un servido Saiku ( el archivo start-saiku.bat no esta presente) +OptionWizard.28=Servidor Saiku no reconocible +OptionWizard.29=BBDD puerto +OptionWizard.2=Tipo de uso (servidor/cliente) +OptionWizard.30=Opciones SQLite +OptionWizard.31=Datos de muestra +OptionWizard.32=Diseño de parcela +OptionWizard.33=Definición de la encuesta +OptionWizard.34=Servicios integrados +OptionWizard.35=Número de puntos de control +OptionWizard.36=Distancia entre los puntos de control (en metros) +OptionWizard.37=Margen con el borde de la parcela (en metros) +OptionWizard.38=El archivo CSV/CED no pudo leerse correctamente.
El formato del archivo de valores separados por comas ha de ser como este \:
+OptionWizard.39=ID,Y-Coordinada,X-Coordinada,Elevacion,pendiente,orientacion +OptionWizard.3=Servidor +OptionWizard.40=Proyectos +OptionWizard.41=Cargar un nuevo archivo de proyecto +OptionWizard.42=Error al cerrar el lector del CSV +OptionWizard.43=Nombre de la encuesta +OptionWizard.44=Guardar copia de seguridad de la base de datos en +OptionWizard.45=Abrir Google Earth Engine Playground (obsoleto) +OptionWizard.46=Abrir Google Earth Engine Timelapse +OptionWizard.47=Abrir Bing Maps +OptionWizard.48=Abrir encuesta en un navegador externo en lugar de Google Earth (recomendado para LINUX) +OptionWizard.49=Ruta del archivo ced/csv con las coordenadas de las parcelas +OptionWizard.4=IP de este ordenador\: +OptionWizard.50=Navegar... +OptionWizard.51=Error al importar el archivos del proyecto +OptionWizard.52=Archivo CSV/CED con coordenadas +OptionWizard.53=Sin puntos +OptionWizard.54=Punto central +OptionWizard.55=Error al importar el directorio del proyecto +OptionWizard.56=Cargar proyecto +OptionWizard.57=Proyectos ya cargados +OptionWizard.58=Abrir GEE Code Editor (requiere accesso como Trusted Tester) +OptionWizard.59=Abrir Here Maps +OptionWizard.5=Collect Earth Server puerto\: +OptionWizard.65=Ruta para la carpeta de Saiku +OptionWizard.66=Navegar... +OptionWizard.67=Ruta del ejecutable de Firefox +OptionWizard.68=Navegar... +OptionWizard.6=Parámetros BD PostgreSQL +OptionWizard.70=Archivos ejecutables +OptionWizard.72=Archivos binarios +OptionWizard.73=Ruta del ejecutable de Chrome +OptionWizard.74=Navegar... +OptionWizard.76=Archivos ejecutables +OptionWizard.78=Archivos binarios +OptionWizard.79=Ruta a la plantilla KML de Freemarker +OptionWizard.7=Nombre de usuario +OptionWizard.80=Navegar... +OptionWizard.82=Plantilla Freemarker +OptionWizard.83=Ruta al formulario HTML +OptionWizard.84=Navegar... +OptionWizard.86=Pagina web HTML +OptionWizard.87=Ruta al XML con la definición del IDM +OptionWizard.88=Navegar... OptionWizard.8=Password -OptionWizard.90=XML IDM definition -OptionWizard.91=Server (manager version or stand-alone use) -OptionWizard.92=Client (operator/connected to server) -OptionWizard.93=SQLite (Embedded/single file based) +OptionWizard.90=Definición XML IDM +OptionWizard.91=Servidor (versión para el gerente o para uso autónomo) +OptionWizard.92=Cliente (operador/conectado al servidor) +OptionWizard.93=SQLite (Embebida/basada en un único archivo) OptionWizard.94=PostgreSQL -OptionWizard.95=Side of the sampling dots (in meters) -OptionWizard.9=DB Name -ProcessMonitorDialog.1=Parsing error on row number -ProcessMonitorDialog.4=, columns -ProcessMonitorDialog.5=\ -- values -SaikuAnalysisListener.0=Yes - Refresh Saiku data (long process) -SaikuAnalysisListener.1=No - Use same version of the data as last time Saiku was used -SaikuStarter.1=Starting Saiku -SaikuStarter.2=Starting Saiku can take some minutes, please wait\! -SaikuToolExportListener.1=Saiku Tool generation -SaikuToolExportListener.2=Generating Saiku Tool with current database -SaveEarthDataServlet.0=Empty request -SaveEarthDataServlet.1=Problem occurred while saving data to the database -SaveEarthDataServlet.2=The data was saved -SlopeCode.0=Flat (0-5) -YES=Yes -YES_TO_ALL=Yes to all - -GenerateDatabaseStarter.1=Preparing for analysis -GenerateDatabaseStarter.2=Generating Relational Database - -IPCCGeneratorListener.1=Waiting for process to complete\! -IPCCGeneratorListener.2=The IPCC GHGi compatible data is being generated -IPCCGeneratorListener.3=Refresh the data (update with latest from Collect Earth) -IPCCGeneratorListener.4=Use the latest generated database (fastest process - no update) -IPCCGeneratorListener.5=GHGi Database generation -IPCCGeneratorListener.6=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming but it is necessary if the Collect Earth data has been updated since the last time.
\ No newline at end of file +OptionWizard.95=Lado del punto de sampleo (en metros) +OptionWizard.9=Nombre de la Base de Datos +ProcessMonitorDialog.1=Error de interpretacion en la fila +ProcessMonitorDialog.4=, columnas +ProcessMonitorDialog.5=\ -- valores +SaikuAnalysisListener.0=Si - Actualizar datos de Saiku (proceso de larga duracion) +SaikuAnalysisListener.1=No - Usar los mismos datos de la ultima vez que se usó Saiku +SaikuStarter.1=Iniciando Saiku +SaikuStarter.2=Iniciar Saiku puede tomar varios minutos, espere por favor.\! +SaikuToolExportListener.1=Generación herramienta Saiku +SaikuToolExportListener.2=Generando la herramienta Saiku que incluye la base de datos +SaveEarthDataServlet.0=Sin datos +SaveEarthDataServlet.1=Problemas al guardar los datos en la Base de Datos +SaveEarthDataServlet.2=Los datos se han guardado +SlopeCode.0=Llano (0-5) +YES=Si +YES_TO_ALL=Si a todo \ No newline at end of file From b4c8a4b3cd99114aaeb8c5906523658db53d8480 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:16 +0100 Subject: [PATCH 0843/1620] New translations Messages_es.properties (Portuguese) --- .../earth/app/view/Messages_pt.properties | 497 +++++++++--------- 1 file changed, 243 insertions(+), 254 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 3ce9622fe0..efdb0acb96 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,265 +1,254 @@ -AboutDialog.19=A problem occurred -AboutDialog.5=For more information visit our website OpenForis.org -AboutDialog.6=Sorry, a problem occurred while trying to open this link in your system's standard browser. +AboutDialog.19=Problemas al abrir +AboutDialog.5=Para mas informacion visite nuestra web OpenForis.org +AboutDialog.6=Lo sentimos, hemos tenido un problema al intentar abrir el link en su navegador standard. AboutDialog.8=Ok -AspectCode.0=North -AspectCode.1=North-East -AspectCode.2=East -AspectCode.3=South-East -AspectCode.4=South -AspectCode.5=South-West -AspectCode.6=West -AspectCode.7=North-West -CollectEarthMenu.0=Import CEP file -CollectEarthMenu.2=Utilities -CollectEarthMenu.3=Divide large CSV plot files -CollectEarthMenu.4=Export data to XML (from specific date until present) -CollectEarthMenu.5=Export to Collect Backup -CollectEarthMenu.6=Export data as Collect Backup (all data) -CollectEarthMenu.7=Export data as Collect Backup (from date) -CollectEarthMenu.8=Export data to XML (using summary attribute) -CollectEarthWindow.0=Error when attempting to export data to CSV file -CollectEarthWindow.10=File -CollectEarthWindow.11=Exit -CollectEarthWindow.12=Tools -CollectEarthWindow.13=Download data to CSV (Excel) -CollectEarthWindow.14=Start SAIKU Analysis -CollectEarthWindow.15=Properties -CollectEarthWindow.16=Help -CollectEarthWindow.17=Disclaimer -CollectEarthWindow.18=Find missing plots in database +AspectCode.0=Norte +AspectCode.1=Noreste +AspectCode.2=Este +AspectCode.3=Sureste +AspectCode.4=Sur +AspectCode.5=Suroeste +AspectCode.6=Oeste +AspectCode.7=Noroeste +CollectEarthMenu.0=Importar archivo CEP +CollectEarthMenu.2=Utilidades +CollectEarthMenu.3=Dividir archivos de parcelas CSV grandes +CollectEarthMenu.4=Exportar datos a XML (desde una fecha especifica hasta este momento) +CollectEarthMenu.5=Exportar a Collect Backup +CollectEarthMenu.6=Exportar datos como Collect Backup (todos los datos) +CollectEarthMenu.7=Exportar datos como Collect Backup (filtrar por atributo ) +CollectEarthWindow.0=Error al intentar exportar los datos a un archivo CSV +CollectEarthWindow.10=Archivo +CollectEarthWindow.11=Cerrar +CollectEarthWindow.12=Herramientas +CollectEarthWindow.13=Descargar datos a CSV (Excel) +CollectEarthWindow.14=Comenzar análisis con Saiku +CollectEarthWindow.15=Propiedades +CollectEarthWindow.16=Ayuda +CollectEarthWindow.17=Declaración +CollectEarthWindow.18=Encontrar parcelas ausentes de la Base de Datos CollectEarthWindow.19=Collect Earth -CollectEarthWindow.1=Export error -CollectEarthWindow.20=Number of duplicated records\: -CollectEarthWindow.21=Could not find icon for main frame -CollectEarthWindow.22=Are you sure that you want to close Collect Earth?
Closing the window will also close the Collect Earth server -CollectEarthWindow.23=Confirmation needed -CollectEarthWindow.24=XML Export -CollectEarthWindow.25=Do you want to add these records anyway and lose your current data? -CollectEarthWindow.26=Operator -CollectEarthWindow.27=Update -CollectEarthWindow.28=Open Foris Collect Earth server should be running while the operator interprets data. -CollectEarthWindow.29=The Saiku Server is not configured. -CollectEarthWindow.2=Language -CollectEarthWindow.30=Please maintain this window open while you are using Google Earth. -CollectEarthWindow.31=Export collected data to CSV file -CollectEarthWindow.32=Quit -CollectEarthWindow.33=The operator name has to be longer than 5 characters and shorter than 50 -CollectEarthWindow.34=Validation error -CollectEarthWindow.35=OPERATOR NAME EMPTY\!
Please fill the operator name and press the "Update" button. -CollectEarthWindow.36=Operator name cannot be empty -CollectEarthWindow.37=Keep Open -CollectEarthWindow.38=CSV files -CollectEarthWindow.39=NOTICE\: It is advisable that you back-up your current data (Export to XML) before importing the new data -CollectEarthWindow.3=\ Import error -CollectEarthWindow.40=Set-up the path to the folder where Saiku Server is installed in the Tools->Properties->Advanced tab. -CollectEarthWindow.41=Saving exported data to file\: -CollectEarthWindow.42=Quit -CollectEarthWindow.43=Conflicting records found -CollectEarthWindow.44=Data Import/Export -CollectEarthWindow.45=Export data to XML (compressed) -CollectEarthWindow.46=Import new data from ZIP (compressed XML) -CollectEarthWindow.47=Saiku Server not configured -CollectEarthWindow.48=Zip/collect-data files -CollectEarthWindow.49=Fusion CSV files -CollectEarthWindow.4=FAO Disclaimer notices -CollectEarthWindow.50=Open User Manual -CollectEarthWindow.51=Check for updates of Collect Earth -CollectEarthWindow.52=Open Application Log File -CollectEarthWindow.53=Collect Earth Log file -CollectEarthWindow.54=Load points from KML -CollectEarthWindow.55=Update current records using CSV -CollectEarthWindow.56=About... -CollectEarthWindow.57=The Saiku starter process is still running, please wait. -CollectEarthWindow.58=Cannot start Saiku analysis -CollectEarthWindow.59=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming.
If you click on "YES" a new dataset with the latest information will be generated. -CollectEarthWindow.5=Close -CollectEarthWindow.60=Saiku data generation -CollectEarthWindow.61=Export data to XML (modified records since last export) -CollectEarthWindow.62=About... -CollectEarthWindow.63=Error getting the points from KML -CollectEarthWindow.64=Technical Support -CollectEarthWindow.65=The operator name has been changed -CollectEarthWindow.66=Operator name -CollectEarthWindow.67=Open data folder -CollectEarthWindow.6=Export to Fusion Table -CollectEarthWindow.70=Open the Survey Guide -CollectEarthWindow.71=Generate Stand-Alone Saiku tool -CollectEarthWindow.7=Error when importing data -CollectEarthWindow.8=Disclaimer text could not be found -CollectEarthWindow.9=The data imported contains records that are already present on your database. -DynamicsCode.0=Initially Forest -DynamicsCode.1=Initially Grassland -DynamicsCode.2=Initially Settlement -DynamicsCode.3=Initially Otherland -DynamicsCode.4=Initially Wetland -DynamicsCode.5=Initially Cropland -EarthApp.11=Collect Earth is already running -EarthApp.21=The file containing the grid of plots as a CSV/CED is not found in the selected path \:
-EarthApp.23=No CSV/CED file has been set-up \:

-EarthApp.24=The file containing the Freemarker template with the KML definition is not found in the selected path \:
-EarthApp.26=No KML definition file has been set-up \:

-EarthApp.27=The file containing the HTML balloon form is not found in the selected path \:
-EarthApp.29=No HTML balloon file has been set-up \:

-EarthApp.30=Please correct the file location in the Tools->Properties menu. -EarthApp.3=Remind me later -EarthApp.4=Update Now -EarthApp.57=There is a new version of Collect Earth available\!
How do you want to proceed? -EarthApp.58=Update alert -EarthApp.59=Error when importing project file -EarthApp.5=Do not remind me again -EarthApp.61=The Collect Earth file could not be open.
Please make sure that Google Earth is installed. +CollectEarthWindow.1=Error al exportar +CollectEarthWindow.20=Número de registros repetidos\: +CollectEarthWindow.21=No se pudo encontrar el icono de la ventana principal +CollectEarthWindow.22=¿Seguro que quieres cerrar Collect Earth?
El servidor de Collect Earth terminara al cerrar la ventana +CollectEarthWindow.23=Necesita confirmación +CollectEarthWindow.24=Exportar a XML +CollectEarthWindow.25=¿Quiere importar estos registros de todas formas y perder sus datos actuales? +CollectEarthWindow.26=Operador +CollectEarthWindow.27=Actualizar +CollectEarthWindow.28=El servidor Open Foris Collect Earth debe estar en funcionamiento mientras el operador esta realizando su trabajo. +CollectEarthWindow.29=El servidor Saiku no ha sido configurado. +CollectEarthWindow.2=Idioma +CollectEarthWindow.30=Por favor, mantenga esta ventana abierta mientras este utilizando Google Earth. +CollectEarthWindow.31=Exportar los datos como archivos CSV +CollectEarthWindow.32=Salir +CollectEarthWindow.33=El nombre del operador ha de ser mas largo que cinco caracteres y mas corto que 50 +CollectEarthWindow.34=Error de validación +CollectEarthWindow.35=\!NOMBRE DEL OPERADOR VACIO\!
Rellene el campo del nombre del operador y presione el botón de "Actualizar". +CollectEarthWindow.36=El nombre del operador no puede estar vacío +CollectEarthWindow.37=Conservar abierto +CollectEarthWindow.38=Archivos CSV +CollectEarthWindow.39=ATENCION\: Recomendamos que guarde una copia de seguridad de sus datos actuales (expórtelos a XML) antes de importar los nuevos datos. +CollectEarthWindow.3=\ Error al importar datos +CollectEarthWindow.40=Configure la ruta a la carpeta donde el servidor Saiku ha sido instalado en Herramientas->Propiedades->Avanzadas. +CollectEarthWindow.41=Guardando los datos en el archivo\: +CollectEarthWindow.42=Terminar +CollectEarthWindow.43=Detectados registros repetidos +CollectEarthWindow.44=Importar/Exportar datos +CollectEarthWindow.45=Exportar datos en XML (comprimidos) +CollectEarthWindow.46=Importar nuevos datos desde ZIP (XML comprimidos) +CollectEarthWindow.47=Servidor Saiku no configurado +CollectEarthWindow.48=Archivos zip/collect-data +CollectEarthWindow.49=Archivos Fusion CSV +CollectEarthWindow.4=Exención de responsabilidad de FAO +CollectEarthWindow.50=Abrir Manual de Usuario +CollectEarthWindow.51=Comprobar si hay actualizaciones de Collect Earth +CollectEarthWindow.52=Abrir el archivo de registo de la aplicacion +CollectEarthWindow.53=Archivo de registro de Collect Earth +CollectEarthWindow.54=Cargar puntos desde KML +CollectEarthWindow.55=Actualizar datos ya registrados desde CSV +CollectEarthWindow.56=Mas informacion... +CollectEarthWindow.57=El proceso para comenzar Saiku esta ejecutandose todavia, espere unos minutos. +CollectEarthWindow.58=No se pudo iniciar el analisis con Saiku +CollectEarthWindow.59=¿Quiere volver a generar los datos para el analisis de Saiku?
Este proceso puede tomar varios minutos.
Si hace click en "SI" los datos mas actuales seran generados. +CollectEarthWindow.5=Cerrar +CollectEarthWindow.60=Generación de datos para Saiku +CollectEarthWindow.61=Exportar a XML (solo los registros anadidos/modificados) +CollectEarthWindow.62=Mas informacion.. +CollectEarthWindow.63=Error leyendo los puntos desde el KML +CollectEarthWindow.64=Soporte tecnico +CollectEarthWindow.65=Se ha cambido el nombre del operador +CollectEarthWindow.66=Cambio de operador +CollectEarthWindow.67=Abrir directorio de datos de CE +CollectEarthWindow.6=Exportar datos a Fusion Table +CollectEarthWindow.70=Abrir el manual de esta encuesta +CollectEarthWindow.71=Generar herramienta Saiku independiente +CollectEarthWindow.7=Error al importar los datos +CollectEarthWindow.8=No se pudo encontrar el testo de exención de responsabilidad +CollectEarthWindow.9=Los datos importados contienen registros que ya están presentes en su base de datos +DynamicsCode.0=Inicialmente Bosque +DynamicsCode.1=Inicialmente Pastizal +DynamicsCode.2=Inicialmente Asentamiento +DynamicsCode.3=Inicialmente Otras tierras +DynamicsCode.4=Inicialmente Humedal +DynamicsCode.5=Inicialmente Cultivo +EarthApp.11=Collect Earth ya está ejecutandose +EarthApp.21=El archivo CSV/CED que contiene el diseño de la malla de puntos no se encuentra en la ruta seleccionada \:
+EarthApp.23=No se ha configurado ningun archivo de puntos CSV/CED \:

+EarthApp.24=El archivo que contiene la plantilla de Freemarker con la definicion del KML no se encuntra en la ruta seleccionada \:
+EarthApp.26=No se ha configurado ninguna archivo con la definicion del KML \:

+EarthApp.27=El archivo que contiene el formulario del pop-up en HTMl no se ha encontrado en la ruta seleccionada \:
+EarthApp.29=No se ha configurado ningun HTML de configuracion del pop-up \:

+EarthApp.30=Corrija la localizacion del archivo a traves del menu Herramientas->Propiedades. +EarthApp.3=Recordarme mas tarde +EarthApp.4=Actualizar Ahora +EarthApp.57=Hay una nueva version de Collect Earth disponible\! +EarthApp.58=Alerta para actualizacion +EarthApp.59=Error al importar el archivo del proyecto +EarthApp.5=No recordarme otra vez +EarthApp.61=El archivo KMZ generado por Collect Earth no se pudo abrir.
Asegurese de que Google Earth esta instalado. EarthApp.6=\ - Version -EarthApp.70=WARNING -EarthApp.71=In Mac OS X the Collect Earth project files (*.cep) will not open in Collect Earth when they are double-clicked.
-EarthApp.72=Use the Collect Earth toolbar to open the .cep files \: -EarthApp.73=Collect Earth issues in Mac OS X computers -EarthSurveyService.9=Field required -ExportActionListener.1=Pick Date to Export Records From -ExportDialogProcessMonitor.0=Processing data... -ExportDialogProcessMonitor.1=Waiting to initialize process \: -ExportDialogProcessMonitor.4=Exported records \: -ImportActionListener.0=Should the data for plots that have not been completely filled be imported? -ImportActionListener.2=If you click NO only the data from plots in the "green" state, containing all data, will be imported. -ImportActionListener.3=Import non-finished records -ImportDialogProcessMonitor.0=\ CALCULATING -ImportDialogProcessMonitor.11=Initial number of records \: -ImportDialogProcessMonitor.2=Importing records... -ImportDialogProcessMonitor.5=Actual number of imported records \: -ImportDialogProcessMonitor.8=Processing data... -ImportProcessMonitorDialog.0=Imported records \: -ImportXMLDialogProcessMonitor.1 = Overwrite data -ImportXMLDialogProcessMonitor.2 = Import only non-conflicting plots -InfiniteProgressMonitor.0=Cancel operation -JFileChooserExistsAware.0=Collect Earth Project file -KmlImportService.13=Select a CSV file to save the plot locations to -MissingPlotsListener.0=Error while getting information about plots not present on the Database -MissingPlotsListener.10=Total number of plots in the sampling design \: -MissingPlotsListener.12=Number of missing plots \: -MissingPlotsListener.14=All the plots are filled\! -MissingPlotsListener.1=Missing plots -MissingPlotsListener.2=Copy contents to clipboard -MissingPlotsListener.3=Pick the files that contain plot information ( .csv or .ced files ) for which you want to know if all data has been filled. -MissingPlotsListener.4=Missing plots - information -MissingPlotsListener.5=From file \: -MissingPlotsListener.6=Export to CED file +EarthApp.70=ATENCION +EarthApp.71=En Mac OS X los archivos de proyectos de Collect Earth (*.cep) no se abren automaticamente al hacer doble-click sobre ellos.
+EarthApp.72=Utiliza la barra de herramientas de Collect Earth para abrir lo archivos .cep \: +EarthApp.73=Collect Earth en ordenadores Mac OS X +EarthSurveyService.9=Campo necesario +ExportActionListener.1=Elija la fecha desde la que exportar los datos +ExportDialogProcessMonitor.0=Procesando datos... +ExportDialogProcessMonitor.1=Esperando a la inicializacion del exportador \: +ExportDialogProcessMonitor.4=Registros exportados \: +ImportActionListener.0=¿Quiere importar los datos de las parcelas que no han sido completamente rellenadas? +ImportActionListener.2=Si hace click en NO se importarán solo los datos de las parcelas en el estado completo (verde)". +ImportActionListener.3=Importar registros incompletos +ImportDialogProcessMonitor.0=\ CALCULANDO +ImportDialogProcessMonitor.11=Cifra inicial the registros \: +ImportDialogProcessMonitor.2=Importando registros... +ImportDialogProcessMonitor.5=Cifra final de registros importados \: +ImportDialogProcessMonitor.8=Procesando datos... +ImportProcessMonitorDialog.0=Registros importados \: +ImportXMLDialogProcessMonitor.1 = Sobreescrivir las parcelas en BBDD +ImportXMLDialogProcessMonitor.2 = Importar solo parcelas sin conflictos +InfiniteProgressMonitor.0=Cancelar operación +JFileChooserExistsAware.0=Archivo de proyecto Collect Earth +KmlImportService.13=Seleccionar archivo CSV donde guardar las posiciones de las parcelas +MissingPlotsListener.0=Error cuando se estaba obteniendo información de las parcelas ausentes de la base de datos +MissingPlotsListener.10=Numero total de parcelas en el diseño de la muestra \: +MissingPlotsListener.12=Numero de parcelas que faltan \: +MissingPlotsListener.14=Todas las parcelas han sido rellenadas\! +MissingPlotsListener.1=Parcelas que faltan +MissingPlotsListener.2=Copiar contenidos +MissingPlotsListener.3=Elija los archivos que contienen informacion sobre las parcelas ( archivos .csv o .ced ) para los que desea averiguar si todos los datos se han rellenado. +MissingPlotsListener.4=Parcelas ausentes – informacion +MissingPlotsListener.5=Del archivo \: +MissingPlotsListener.6=Exportar a archivo CED NO=No -NO_TO_ALL=No to all -OpenTextFileListener.0=The text file was not found at \: -OptionWizard.0=Collect Earth options -OptionWizard.100=Open Planet imagery -OptionWizard.101=Planet API key +NO_TO_ALL=No a todo +OpenTextFileListener.0=El archivo de texto no ha sido encontrado en \: +OptionWizard.0=Opciones de Collect Earth +OptionWizard.100=Abrir Planet +OptionWizard.101=Llave de la API de Planet OptionWizard.1021=URL SecureWatch -OptionWizard.102=Open Maxar SecureWatch -OptionWizard.103=Set URL for Extra Map (opens when set) \: -OptionWizard.104=Browsers -OptionWizard.105=Open Earth Map -OptionWizard.110=Use NICFI provided Monthly imagery -OptionWizard.10=Open backup folder -OptionWizard.11=Unknown\: use ifconfig -OptionWizard.12=Client Instance +OptionWizard.102=Abrir Maxar SecureWatch (necesario tener licencia) +OptionWizard.103=Configurar la URL para el Mapa Extra (se abre cuando esta configurada) \: +OptionWizard.104=Navegadores +OptionWizard.105=Abrir Earth Map +OptionWizard.110=Usar las imagenes mensuales de NICFI +OptionWizard.10=Abrir carpeta de copias de seguridad +OptionWizard.11=Desconocido\: usar ipconfig +OptionWizard.12=Instancia cliente OptionWizard.13=Collect Earth Server IP -OptionWizard.14=Collect Earth Server port (e.g. 8023) -OptionWizard.15=Save & Apply changes +OptionWizard.14=Collect Earth Server puerto (e.g. 8023) +OptionWizard.15=Guardar & aplicar cambios OptionWizard.16=ID OptionWizard.17=X-coord OptionWizard.18=Y-coord -OptionWizard.19=Elevation -OptionWizard.1=Choose Browser -OptionWizard.20=The Google Earth contents have been changed.
Please accept the content reload when you are prompted by Google Earth. -OptionWizard.21=Update successful -OptionWizard.22=Slope -OptionWizard.23=There was an error when re-opening the Google Earth data -OptionWizard.24=Cancel -OptionWizard.25=Operation Mode -OptionWizard.26=DB host -OptionWizard.27=This is not a recognized Saiku Folder ( the start-saiku.bat file is not present) -OptionWizard.28=Saiku Server not recognized -OptionWizard.29=DB port -OptionWizard.2=Workflow (server/client) -OptionWizard.30=SQLite options -OptionWizard.31=Sample data -OptionWizard.32=Plot layout -OptionWizard.33=Survey Definition -OptionWizard.34=Integrated Services -OptionWizard.35=Number of control points -OptionWizard.36=Distance between control points (in meters) -OptionWizard.37=Margin with plot border (in meters) -OptionWizard.38=The CSV/CED file cannot be read correctly.
The file is expected to have a comma separated values like this \:
-OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect -OptionWizard.3=Server Instance -OptionWizard.40=Projects -OptionWizard.41=Load a new project file -OptionWizard.42=Error when closing the CSV reader -OptionWizard.43=Name of survey -OptionWizard.44=automatically back-up database at -OptionWizard.45=Open Earth Engine Playground ( deprecated ) -OptionWizard.46=Open Earth Engine Timelapse -OptionWizard.47=Open Bing Maps -OptionWizard.48=Open form on a browser instead of Google Earth (recommended for LINUX) -OptionWizard.49=Path to ced/csv file with plot data -OptionWizard.4=Current computer IP \: -OptionWizard.50=Browse... -OptionWizard.51=Error importing project file -OptionWizard.52=CSV/CED file with only coordinates -OptionWizard.53=No points -OptionWizard.54=Central point -OptionWizard.55=Error importing project folder -OptionWizard.56=Load project -OptionWizard.57=Previously loaded projects -OptionWizard.58=Open GEE Code Editor (requires Trusted Tester access) -OptionWizard.59=Open Here Maps focused on the plot -OptionWizard.5=Collect Earth Server port\: -OptionWizard.65=Path to Saiku folder -OptionWizard.66=Browse... -OptionWizard.67=Path to Firefox executable -OptionWizard.68=Browse... -OptionWizard.6=PostgreSQL DB parameters -OptionWizard.70=Executable files -OptionWizard.72=Binary files -OptionWizard.73=Path to Chrome executable -OptionWizard.74=Browse... -OptionWizard.76=Executable files -OptionWizard.78=Binary files -OptionWizard.79=Path to KML Freemarker template -OptionWizard.7=User Name -OptionWizard.80=Browse... -OptionWizard.82=Freemarker template -OptionWizard.83=Path to HTML Balloon form design -OptionWizard.84=Browse... -OptionWizard.86=HTML webpage -OptionWizard.87=Path to XML with IDM definition -OptionWizard.88=Browse... +OptionWizard.19=Elevación +OptionWizard.1=Elija navegador +OptionWizard.20=Los contenidos de Google Earth han cambiado.
Acepte la recarga del contenido cuando Google Earth le pregunte. +OptionWizard.21=Actualizado con éxito +OptionWizard.22=Pendiente +OptionWizard.23=Hubo un error al reabrir los datos en Google Earth +OptionWizard.24=Cancelar +OptionWizard.25=Modo de operación +OptionWizard.26=BBDD servidor +OptionWizard.27=Esta no es una carpeta de un servido Saiku ( el archivo start-saiku.bat no esta presente) +OptionWizard.28=Servidor Saiku no reconocible +OptionWizard.29=BBDD puerto +OptionWizard.2=Tipo de uso (servidor/cliente) +OptionWizard.30=Opciones SQLite +OptionWizard.31=Datos de muestra +OptionWizard.32=Diseño de parcela +OptionWizard.33=Definición de la encuesta +OptionWizard.34=Servicios integrados +OptionWizard.35=Número de puntos de control +OptionWizard.36=Distancia entre los puntos de control (en metros) +OptionWizard.37=Margen con el borde de la parcela (en metros) +OptionWizard.38=El archivo CSV/CED no pudo leerse correctamente.
El formato del archivo de valores separados por comas ha de ser como este \:
+OptionWizard.39=ID,Y-Coordinada,X-Coordinada,Elevacion,pendiente,orientacion +OptionWizard.3=Servidor +OptionWizard.40=Proyectos +OptionWizard.41=Cargar un nuevo archivo de proyecto +OptionWizard.42=Error al cerrar el lector del CSV +OptionWizard.43=Nombre de la encuesta +OptionWizard.44=Guardar copia de seguridad de la base de datos en +OptionWizard.45=Abrir Google Earth Engine Playground (obsoleto) +OptionWizard.46=Abrir Google Earth Engine Timelapse +OptionWizard.47=Abrir Bing Maps +OptionWizard.48=Abrir encuesta en un navegador externo en lugar de Google Earth (recomendado para LINUX) +OptionWizard.49=Ruta del archivo ced/csv con las coordenadas de las parcelas +OptionWizard.4=IP de este ordenador\: +OptionWizard.50=Navegar... +OptionWizard.51=Error al importar el archivos del proyecto +OptionWizard.52=Archivo CSV/CED con coordenadas +OptionWizard.53=Sin puntos +OptionWizard.54=Punto central +OptionWizard.55=Error al importar el directorio del proyecto +OptionWizard.56=Cargar proyecto +OptionWizard.57=Proyectos ya cargados +OptionWizard.58=Abrir GEE Code Editor (requiere accesso como Trusted Tester) +OptionWizard.59=Abrir Here Maps +OptionWizard.5=Collect Earth Server puerto\: +OptionWizard.65=Ruta para la carpeta de Saiku +OptionWizard.66=Navegar... +OptionWizard.67=Ruta del ejecutable de Firefox +OptionWizard.68=Navegar... +OptionWizard.6=Parámetros BD PostgreSQL +OptionWizard.70=Archivos ejecutables +OptionWizard.72=Archivos binarios +OptionWizard.73=Ruta del ejecutable de Chrome +OptionWizard.74=Navegar... +OptionWizard.76=Archivos ejecutables +OptionWizard.78=Archivos binarios +OptionWizard.79=Ruta a la plantilla KML de Freemarker +OptionWizard.7=Nombre de usuario +OptionWizard.80=Navegar... +OptionWizard.82=Plantilla Freemarker +OptionWizard.83=Ruta al formulario HTML +OptionWizard.84=Navegar... +OptionWizard.86=Pagina web HTML +OptionWizard.87=Ruta al XML con la definición del IDM +OptionWizard.88=Navegar... OptionWizard.8=Password -OptionWizard.90=XML IDM definition -OptionWizard.91=Server (manager version or stand-alone use) -OptionWizard.92=Client (operator/connected to server) -OptionWizard.93=SQLite (Embedded/single file based) +OptionWizard.90=Definición XML IDM +OptionWizard.91=Servidor (versión para el gerente o para uso autónomo) +OptionWizard.92=Cliente (operador/conectado al servidor) +OptionWizard.93=SQLite (Embebida/basada en un único archivo) OptionWizard.94=PostgreSQL -OptionWizard.95=Side of the sampling dots (in meters) -OptionWizard.9=DB Name -ProcessMonitorDialog.1=Parsing error on row number -ProcessMonitorDialog.4=, columns -ProcessMonitorDialog.5=\ -- values -SaikuAnalysisListener.0=Yes - Refresh Saiku data (long process) -SaikuAnalysisListener.1=No - Use same version of the data as last time Saiku was used -SaikuStarter.1=Starting Saiku -SaikuStarter.2=Starting Saiku can take some minutes, please wait\! -SaikuToolExportListener.1=Saiku Tool generation -SaikuToolExportListener.2=Generating Saiku Tool with current database -SaveEarthDataServlet.0=Empty request -SaveEarthDataServlet.1=Problem occurred while saving data to the database -SaveEarthDataServlet.2=The data was saved -SlopeCode.0=Flat (0-5) -YES=Yes -YES_TO_ALL=Yes to all - -GenerateDatabaseStarter.1=Preparing for analysis -GenerateDatabaseStarter.2=Generating Relational Database - -IPCCGeneratorListener.1=Waiting for process to complete\! -IPCCGeneratorListener.2=The IPCC GHGi compatible data is being generated -IPCCGeneratorListener.3=Refresh the data (update with latest from Collect Earth) -IPCCGeneratorListener.4=Use the latest generated database (fastest process - no update) -IPCCGeneratorListener.5=GHGi Database generation -IPCCGeneratorListener.6=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming but it is necessary if the Collect Earth data has been updated since the last time.
\ No newline at end of file +OptionWizard.95=Lado del punto de sampleo (en metros) +OptionWizard.9=Nombre de la Base de Datos +ProcessMonitorDialog.1=Error de interpretacion en la fila +ProcessMonitorDialog.4=, columnas +ProcessMonitorDialog.5=\ -- valores +SaikuAnalysisListener.0=Si - Actualizar datos de Saiku (proceso de larga duracion) +SaikuAnalysisListener.1=No - Usar los mismos datos de la ultima vez que se usó Saiku +SaikuStarter.1=Iniciando Saiku +SaikuStarter.2=Iniciar Saiku puede tomar varios minutos, espere por favor.\! +SaikuToolExportListener.1=Generación herramienta Saiku +SaikuToolExportListener.2=Generando la herramienta Saiku que incluye la base de datos +SaveEarthDataServlet.0=Sin datos +SaveEarthDataServlet.1=Problemas al guardar los datos en la Base de Datos +SaveEarthDataServlet.2=Los datos se han guardado +SlopeCode.0=Llano (0-5) +YES=Si +YES_TO_ALL=Si a todo \ No newline at end of file From 0a31f14446ece9b402f0d67b5312664d88b1ec91 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:18 +0100 Subject: [PATCH 0844/1620] New translations Messages_es.properties (English) --- .../earth/app/view/Messages_en.properties | 497 +++++++++--------- 1 file changed, 243 insertions(+), 254 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 3ce9622fe0..efdb0acb96 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,265 +1,254 @@ -AboutDialog.19=A problem occurred -AboutDialog.5=For more information visit our website OpenForis.org -AboutDialog.6=Sorry, a problem occurred while trying to open this link in your system's standard browser. +AboutDialog.19=Problemas al abrir +AboutDialog.5=Para mas informacion visite nuestra web OpenForis.org +AboutDialog.6=Lo sentimos, hemos tenido un problema al intentar abrir el link en su navegador standard. AboutDialog.8=Ok -AspectCode.0=North -AspectCode.1=North-East -AspectCode.2=East -AspectCode.3=South-East -AspectCode.4=South -AspectCode.5=South-West -AspectCode.6=West -AspectCode.7=North-West -CollectEarthMenu.0=Import CEP file -CollectEarthMenu.2=Utilities -CollectEarthMenu.3=Divide large CSV plot files -CollectEarthMenu.4=Export data to XML (from specific date until present) -CollectEarthMenu.5=Export to Collect Backup -CollectEarthMenu.6=Export data as Collect Backup (all data) -CollectEarthMenu.7=Export data as Collect Backup (from date) -CollectEarthMenu.8=Export data to XML (using summary attribute) -CollectEarthWindow.0=Error when attempting to export data to CSV file -CollectEarthWindow.10=File -CollectEarthWindow.11=Exit -CollectEarthWindow.12=Tools -CollectEarthWindow.13=Download data to CSV (Excel) -CollectEarthWindow.14=Start SAIKU Analysis -CollectEarthWindow.15=Properties -CollectEarthWindow.16=Help -CollectEarthWindow.17=Disclaimer -CollectEarthWindow.18=Find missing plots in database +AspectCode.0=Norte +AspectCode.1=Noreste +AspectCode.2=Este +AspectCode.3=Sureste +AspectCode.4=Sur +AspectCode.5=Suroeste +AspectCode.6=Oeste +AspectCode.7=Noroeste +CollectEarthMenu.0=Importar archivo CEP +CollectEarthMenu.2=Utilidades +CollectEarthMenu.3=Dividir archivos de parcelas CSV grandes +CollectEarthMenu.4=Exportar datos a XML (desde una fecha especifica hasta este momento) +CollectEarthMenu.5=Exportar a Collect Backup +CollectEarthMenu.6=Exportar datos como Collect Backup (todos los datos) +CollectEarthMenu.7=Exportar datos como Collect Backup (filtrar por atributo ) +CollectEarthWindow.0=Error al intentar exportar los datos a un archivo CSV +CollectEarthWindow.10=Archivo +CollectEarthWindow.11=Cerrar +CollectEarthWindow.12=Herramientas +CollectEarthWindow.13=Descargar datos a CSV (Excel) +CollectEarthWindow.14=Comenzar análisis con Saiku +CollectEarthWindow.15=Propiedades +CollectEarthWindow.16=Ayuda +CollectEarthWindow.17=Declaración +CollectEarthWindow.18=Encontrar parcelas ausentes de la Base de Datos CollectEarthWindow.19=Collect Earth -CollectEarthWindow.1=Export error -CollectEarthWindow.20=Number of duplicated records\: -CollectEarthWindow.21=Could not find icon for main frame -CollectEarthWindow.22=Are you sure that you want to close Collect Earth?
Closing the window will also close the Collect Earth server -CollectEarthWindow.23=Confirmation needed -CollectEarthWindow.24=XML Export -CollectEarthWindow.25=Do you want to add these records anyway and lose your current data? -CollectEarthWindow.26=Operator -CollectEarthWindow.27=Update -CollectEarthWindow.28=Open Foris Collect Earth server should be running while the operator interprets data. -CollectEarthWindow.29=The Saiku Server is not configured. -CollectEarthWindow.2=Language -CollectEarthWindow.30=Please maintain this window open while you are using Google Earth. -CollectEarthWindow.31=Export collected data to CSV file -CollectEarthWindow.32=Quit -CollectEarthWindow.33=The operator name has to be longer than 5 characters and shorter than 50 -CollectEarthWindow.34=Validation error -CollectEarthWindow.35=OPERATOR NAME EMPTY\!
Please fill the operator name and press the "Update" button. -CollectEarthWindow.36=Operator name cannot be empty -CollectEarthWindow.37=Keep Open -CollectEarthWindow.38=CSV files -CollectEarthWindow.39=NOTICE\: It is advisable that you back-up your current data (Export to XML) before importing the new data -CollectEarthWindow.3=\ Import error -CollectEarthWindow.40=Set-up the path to the folder where Saiku Server is installed in the Tools->Properties->Advanced tab. -CollectEarthWindow.41=Saving exported data to file\: -CollectEarthWindow.42=Quit -CollectEarthWindow.43=Conflicting records found -CollectEarthWindow.44=Data Import/Export -CollectEarthWindow.45=Export data to XML (compressed) -CollectEarthWindow.46=Import new data from ZIP (compressed XML) -CollectEarthWindow.47=Saiku Server not configured -CollectEarthWindow.48=Zip/collect-data files -CollectEarthWindow.49=Fusion CSV files -CollectEarthWindow.4=FAO Disclaimer notices -CollectEarthWindow.50=Open User Manual -CollectEarthWindow.51=Check for updates of Collect Earth -CollectEarthWindow.52=Open Application Log File -CollectEarthWindow.53=Collect Earth Log file -CollectEarthWindow.54=Load points from KML -CollectEarthWindow.55=Update current records using CSV -CollectEarthWindow.56=About... -CollectEarthWindow.57=The Saiku starter process is still running, please wait. -CollectEarthWindow.58=Cannot start Saiku analysis -CollectEarthWindow.59=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming.
If you click on "YES" a new dataset with the latest information will be generated. -CollectEarthWindow.5=Close -CollectEarthWindow.60=Saiku data generation -CollectEarthWindow.61=Export data to XML (modified records since last export) -CollectEarthWindow.62=About... -CollectEarthWindow.63=Error getting the points from KML -CollectEarthWindow.64=Technical Support -CollectEarthWindow.65=The operator name has been changed -CollectEarthWindow.66=Operator name -CollectEarthWindow.67=Open data folder -CollectEarthWindow.6=Export to Fusion Table -CollectEarthWindow.70=Open the Survey Guide -CollectEarthWindow.71=Generate Stand-Alone Saiku tool -CollectEarthWindow.7=Error when importing data -CollectEarthWindow.8=Disclaimer text could not be found -CollectEarthWindow.9=The data imported contains records that are already present on your database. -DynamicsCode.0=Initially Forest -DynamicsCode.1=Initially Grassland -DynamicsCode.2=Initially Settlement -DynamicsCode.3=Initially Otherland -DynamicsCode.4=Initially Wetland -DynamicsCode.5=Initially Cropland -EarthApp.11=Collect Earth is already running -EarthApp.21=The file containing the grid of plots as a CSV/CED is not found in the selected path \:
-EarthApp.23=No CSV/CED file has been set-up \:

-EarthApp.24=The file containing the Freemarker template with the KML definition is not found in the selected path \:
-EarthApp.26=No KML definition file has been set-up \:

-EarthApp.27=The file containing the HTML balloon form is not found in the selected path \:
-EarthApp.29=No HTML balloon file has been set-up \:

-EarthApp.30=Please correct the file location in the Tools->Properties menu. -EarthApp.3=Remind me later -EarthApp.4=Update Now -EarthApp.57=There is a new version of Collect Earth available\!
How do you want to proceed? -EarthApp.58=Update alert -EarthApp.59=Error when importing project file -EarthApp.5=Do not remind me again -EarthApp.61=The Collect Earth file could not be open.
Please make sure that Google Earth is installed. +CollectEarthWindow.1=Error al exportar +CollectEarthWindow.20=Número de registros repetidos\: +CollectEarthWindow.21=No se pudo encontrar el icono de la ventana principal +CollectEarthWindow.22=¿Seguro que quieres cerrar Collect Earth?
El servidor de Collect Earth terminara al cerrar la ventana +CollectEarthWindow.23=Necesita confirmación +CollectEarthWindow.24=Exportar a XML +CollectEarthWindow.25=¿Quiere importar estos registros de todas formas y perder sus datos actuales? +CollectEarthWindow.26=Operador +CollectEarthWindow.27=Actualizar +CollectEarthWindow.28=El servidor Open Foris Collect Earth debe estar en funcionamiento mientras el operador esta realizando su trabajo. +CollectEarthWindow.29=El servidor Saiku no ha sido configurado. +CollectEarthWindow.2=Idioma +CollectEarthWindow.30=Por favor, mantenga esta ventana abierta mientras este utilizando Google Earth. +CollectEarthWindow.31=Exportar los datos como archivos CSV +CollectEarthWindow.32=Salir +CollectEarthWindow.33=El nombre del operador ha de ser mas largo que cinco caracteres y mas corto que 50 +CollectEarthWindow.34=Error de validación +CollectEarthWindow.35=\!NOMBRE DEL OPERADOR VACIO\!
Rellene el campo del nombre del operador y presione el botón de "Actualizar". +CollectEarthWindow.36=El nombre del operador no puede estar vacío +CollectEarthWindow.37=Conservar abierto +CollectEarthWindow.38=Archivos CSV +CollectEarthWindow.39=ATENCION\: Recomendamos que guarde una copia de seguridad de sus datos actuales (expórtelos a XML) antes de importar los nuevos datos. +CollectEarthWindow.3=\ Error al importar datos +CollectEarthWindow.40=Configure la ruta a la carpeta donde el servidor Saiku ha sido instalado en Herramientas->Propiedades->Avanzadas. +CollectEarthWindow.41=Guardando los datos en el archivo\: +CollectEarthWindow.42=Terminar +CollectEarthWindow.43=Detectados registros repetidos +CollectEarthWindow.44=Importar/Exportar datos +CollectEarthWindow.45=Exportar datos en XML (comprimidos) +CollectEarthWindow.46=Importar nuevos datos desde ZIP (XML comprimidos) +CollectEarthWindow.47=Servidor Saiku no configurado +CollectEarthWindow.48=Archivos zip/collect-data +CollectEarthWindow.49=Archivos Fusion CSV +CollectEarthWindow.4=Exención de responsabilidad de FAO +CollectEarthWindow.50=Abrir Manual de Usuario +CollectEarthWindow.51=Comprobar si hay actualizaciones de Collect Earth +CollectEarthWindow.52=Abrir el archivo de registo de la aplicacion +CollectEarthWindow.53=Archivo de registro de Collect Earth +CollectEarthWindow.54=Cargar puntos desde KML +CollectEarthWindow.55=Actualizar datos ya registrados desde CSV +CollectEarthWindow.56=Mas informacion... +CollectEarthWindow.57=El proceso para comenzar Saiku esta ejecutandose todavia, espere unos minutos. +CollectEarthWindow.58=No se pudo iniciar el analisis con Saiku +CollectEarthWindow.59=¿Quiere volver a generar los datos para el analisis de Saiku?
Este proceso puede tomar varios minutos.
Si hace click en "SI" los datos mas actuales seran generados. +CollectEarthWindow.5=Cerrar +CollectEarthWindow.60=Generación de datos para Saiku +CollectEarthWindow.61=Exportar a XML (solo los registros anadidos/modificados) +CollectEarthWindow.62=Mas informacion.. +CollectEarthWindow.63=Error leyendo los puntos desde el KML +CollectEarthWindow.64=Soporte tecnico +CollectEarthWindow.65=Se ha cambido el nombre del operador +CollectEarthWindow.66=Cambio de operador +CollectEarthWindow.67=Abrir directorio de datos de CE +CollectEarthWindow.6=Exportar datos a Fusion Table +CollectEarthWindow.70=Abrir el manual de esta encuesta +CollectEarthWindow.71=Generar herramienta Saiku independiente +CollectEarthWindow.7=Error al importar los datos +CollectEarthWindow.8=No se pudo encontrar el testo de exención de responsabilidad +CollectEarthWindow.9=Los datos importados contienen registros que ya están presentes en su base de datos +DynamicsCode.0=Inicialmente Bosque +DynamicsCode.1=Inicialmente Pastizal +DynamicsCode.2=Inicialmente Asentamiento +DynamicsCode.3=Inicialmente Otras tierras +DynamicsCode.4=Inicialmente Humedal +DynamicsCode.5=Inicialmente Cultivo +EarthApp.11=Collect Earth ya está ejecutandose +EarthApp.21=El archivo CSV/CED que contiene el diseño de la malla de puntos no se encuentra en la ruta seleccionada \:
+EarthApp.23=No se ha configurado ningun archivo de puntos CSV/CED \:

+EarthApp.24=El archivo que contiene la plantilla de Freemarker con la definicion del KML no se encuntra en la ruta seleccionada \:
+EarthApp.26=No se ha configurado ninguna archivo con la definicion del KML \:

+EarthApp.27=El archivo que contiene el formulario del pop-up en HTMl no se ha encontrado en la ruta seleccionada \:
+EarthApp.29=No se ha configurado ningun HTML de configuracion del pop-up \:

+EarthApp.30=Corrija la localizacion del archivo a traves del menu Herramientas->Propiedades. +EarthApp.3=Recordarme mas tarde +EarthApp.4=Actualizar Ahora +EarthApp.57=Hay una nueva version de Collect Earth disponible\! +EarthApp.58=Alerta para actualizacion +EarthApp.59=Error al importar el archivo del proyecto +EarthApp.5=No recordarme otra vez +EarthApp.61=El archivo KMZ generado por Collect Earth no se pudo abrir.
Asegurese de que Google Earth esta instalado. EarthApp.6=\ - Version -EarthApp.70=WARNING -EarthApp.71=In Mac OS X the Collect Earth project files (*.cep) will not open in Collect Earth when they are double-clicked.
-EarthApp.72=Use the Collect Earth toolbar to open the .cep files \: -EarthApp.73=Collect Earth issues in Mac OS X computers -EarthSurveyService.9=Field required -ExportActionListener.1=Pick Date to Export Records From -ExportDialogProcessMonitor.0=Processing data... -ExportDialogProcessMonitor.1=Waiting to initialize process \: -ExportDialogProcessMonitor.4=Exported records \: -ImportActionListener.0=Should the data for plots that have not been completely filled be imported? -ImportActionListener.2=If you click NO only the data from plots in the "green" state, containing all data, will be imported. -ImportActionListener.3=Import non-finished records -ImportDialogProcessMonitor.0=\ CALCULATING -ImportDialogProcessMonitor.11=Initial number of records \: -ImportDialogProcessMonitor.2=Importing records... -ImportDialogProcessMonitor.5=Actual number of imported records \: -ImportDialogProcessMonitor.8=Processing data... -ImportProcessMonitorDialog.0=Imported records \: -ImportXMLDialogProcessMonitor.1 = Overwrite data -ImportXMLDialogProcessMonitor.2 = Import only non-conflicting plots -InfiniteProgressMonitor.0=Cancel operation -JFileChooserExistsAware.0=Collect Earth Project file -KmlImportService.13=Select a CSV file to save the plot locations to -MissingPlotsListener.0=Error while getting information about plots not present on the Database -MissingPlotsListener.10=Total number of plots in the sampling design \: -MissingPlotsListener.12=Number of missing plots \: -MissingPlotsListener.14=All the plots are filled\! -MissingPlotsListener.1=Missing plots -MissingPlotsListener.2=Copy contents to clipboard -MissingPlotsListener.3=Pick the files that contain plot information ( .csv or .ced files ) for which you want to know if all data has been filled. -MissingPlotsListener.4=Missing plots - information -MissingPlotsListener.5=From file \: -MissingPlotsListener.6=Export to CED file +EarthApp.70=ATENCION +EarthApp.71=En Mac OS X los archivos de proyectos de Collect Earth (*.cep) no se abren automaticamente al hacer doble-click sobre ellos.
+EarthApp.72=Utiliza la barra de herramientas de Collect Earth para abrir lo archivos .cep \: +EarthApp.73=Collect Earth en ordenadores Mac OS X +EarthSurveyService.9=Campo necesario +ExportActionListener.1=Elija la fecha desde la que exportar los datos +ExportDialogProcessMonitor.0=Procesando datos... +ExportDialogProcessMonitor.1=Esperando a la inicializacion del exportador \: +ExportDialogProcessMonitor.4=Registros exportados \: +ImportActionListener.0=¿Quiere importar los datos de las parcelas que no han sido completamente rellenadas? +ImportActionListener.2=Si hace click en NO se importarán solo los datos de las parcelas en el estado completo (verde)". +ImportActionListener.3=Importar registros incompletos +ImportDialogProcessMonitor.0=\ CALCULANDO +ImportDialogProcessMonitor.11=Cifra inicial the registros \: +ImportDialogProcessMonitor.2=Importando registros... +ImportDialogProcessMonitor.5=Cifra final de registros importados \: +ImportDialogProcessMonitor.8=Procesando datos... +ImportProcessMonitorDialog.0=Registros importados \: +ImportXMLDialogProcessMonitor.1 = Sobreescrivir las parcelas en BBDD +ImportXMLDialogProcessMonitor.2 = Importar solo parcelas sin conflictos +InfiniteProgressMonitor.0=Cancelar operación +JFileChooserExistsAware.0=Archivo de proyecto Collect Earth +KmlImportService.13=Seleccionar archivo CSV donde guardar las posiciones de las parcelas +MissingPlotsListener.0=Error cuando se estaba obteniendo información de las parcelas ausentes de la base de datos +MissingPlotsListener.10=Numero total de parcelas en el diseño de la muestra \: +MissingPlotsListener.12=Numero de parcelas que faltan \: +MissingPlotsListener.14=Todas las parcelas han sido rellenadas\! +MissingPlotsListener.1=Parcelas que faltan +MissingPlotsListener.2=Copiar contenidos +MissingPlotsListener.3=Elija los archivos que contienen informacion sobre las parcelas ( archivos .csv o .ced ) para los que desea averiguar si todos los datos se han rellenado. +MissingPlotsListener.4=Parcelas ausentes – informacion +MissingPlotsListener.5=Del archivo \: +MissingPlotsListener.6=Exportar a archivo CED NO=No -NO_TO_ALL=No to all -OpenTextFileListener.0=The text file was not found at \: -OptionWizard.0=Collect Earth options -OptionWizard.100=Open Planet imagery -OptionWizard.101=Planet API key +NO_TO_ALL=No a todo +OpenTextFileListener.0=El archivo de texto no ha sido encontrado en \: +OptionWizard.0=Opciones de Collect Earth +OptionWizard.100=Abrir Planet +OptionWizard.101=Llave de la API de Planet OptionWizard.1021=URL SecureWatch -OptionWizard.102=Open Maxar SecureWatch -OptionWizard.103=Set URL for Extra Map (opens when set) \: -OptionWizard.104=Browsers -OptionWizard.105=Open Earth Map -OptionWizard.110=Use NICFI provided Monthly imagery -OptionWizard.10=Open backup folder -OptionWizard.11=Unknown\: use ifconfig -OptionWizard.12=Client Instance +OptionWizard.102=Abrir Maxar SecureWatch (necesario tener licencia) +OptionWizard.103=Configurar la URL para el Mapa Extra (se abre cuando esta configurada) \: +OptionWizard.104=Navegadores +OptionWizard.105=Abrir Earth Map +OptionWizard.110=Usar las imagenes mensuales de NICFI +OptionWizard.10=Abrir carpeta de copias de seguridad +OptionWizard.11=Desconocido\: usar ipconfig +OptionWizard.12=Instancia cliente OptionWizard.13=Collect Earth Server IP -OptionWizard.14=Collect Earth Server port (e.g. 8023) -OptionWizard.15=Save & Apply changes +OptionWizard.14=Collect Earth Server puerto (e.g. 8023) +OptionWizard.15=Guardar & aplicar cambios OptionWizard.16=ID OptionWizard.17=X-coord OptionWizard.18=Y-coord -OptionWizard.19=Elevation -OptionWizard.1=Choose Browser -OptionWizard.20=The Google Earth contents have been changed.
Please accept the content reload when you are prompted by Google Earth. -OptionWizard.21=Update successful -OptionWizard.22=Slope -OptionWizard.23=There was an error when re-opening the Google Earth data -OptionWizard.24=Cancel -OptionWizard.25=Operation Mode -OptionWizard.26=DB host -OptionWizard.27=This is not a recognized Saiku Folder ( the start-saiku.bat file is not present) -OptionWizard.28=Saiku Server not recognized -OptionWizard.29=DB port -OptionWizard.2=Workflow (server/client) -OptionWizard.30=SQLite options -OptionWizard.31=Sample data -OptionWizard.32=Plot layout -OptionWizard.33=Survey Definition -OptionWizard.34=Integrated Services -OptionWizard.35=Number of control points -OptionWizard.36=Distance between control points (in meters) -OptionWizard.37=Margin with plot border (in meters) -OptionWizard.38=The CSV/CED file cannot be read correctly.
The file is expected to have a comma separated values like this \:
-OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect -OptionWizard.3=Server Instance -OptionWizard.40=Projects -OptionWizard.41=Load a new project file -OptionWizard.42=Error when closing the CSV reader -OptionWizard.43=Name of survey -OptionWizard.44=automatically back-up database at -OptionWizard.45=Open Earth Engine Playground ( deprecated ) -OptionWizard.46=Open Earth Engine Timelapse -OptionWizard.47=Open Bing Maps -OptionWizard.48=Open form on a browser instead of Google Earth (recommended for LINUX) -OptionWizard.49=Path to ced/csv file with plot data -OptionWizard.4=Current computer IP \: -OptionWizard.50=Browse... -OptionWizard.51=Error importing project file -OptionWizard.52=CSV/CED file with only coordinates -OptionWizard.53=No points -OptionWizard.54=Central point -OptionWizard.55=Error importing project folder -OptionWizard.56=Load project -OptionWizard.57=Previously loaded projects -OptionWizard.58=Open GEE Code Editor (requires Trusted Tester access) -OptionWizard.59=Open Here Maps focused on the plot -OptionWizard.5=Collect Earth Server port\: -OptionWizard.65=Path to Saiku folder -OptionWizard.66=Browse... -OptionWizard.67=Path to Firefox executable -OptionWizard.68=Browse... -OptionWizard.6=PostgreSQL DB parameters -OptionWizard.70=Executable files -OptionWizard.72=Binary files -OptionWizard.73=Path to Chrome executable -OptionWizard.74=Browse... -OptionWizard.76=Executable files -OptionWizard.78=Binary files -OptionWizard.79=Path to KML Freemarker template -OptionWizard.7=User Name -OptionWizard.80=Browse... -OptionWizard.82=Freemarker template -OptionWizard.83=Path to HTML Balloon form design -OptionWizard.84=Browse... -OptionWizard.86=HTML webpage -OptionWizard.87=Path to XML with IDM definition -OptionWizard.88=Browse... +OptionWizard.19=Elevación +OptionWizard.1=Elija navegador +OptionWizard.20=Los contenidos de Google Earth han cambiado.
Acepte la recarga del contenido cuando Google Earth le pregunte. +OptionWizard.21=Actualizado con éxito +OptionWizard.22=Pendiente +OptionWizard.23=Hubo un error al reabrir los datos en Google Earth +OptionWizard.24=Cancelar +OptionWizard.25=Modo de operación +OptionWizard.26=BBDD servidor +OptionWizard.27=Esta no es una carpeta de un servido Saiku ( el archivo start-saiku.bat no esta presente) +OptionWizard.28=Servidor Saiku no reconocible +OptionWizard.29=BBDD puerto +OptionWizard.2=Tipo de uso (servidor/cliente) +OptionWizard.30=Opciones SQLite +OptionWizard.31=Datos de muestra +OptionWizard.32=Diseño de parcela +OptionWizard.33=Definición de la encuesta +OptionWizard.34=Servicios integrados +OptionWizard.35=Número de puntos de control +OptionWizard.36=Distancia entre los puntos de control (en metros) +OptionWizard.37=Margen con el borde de la parcela (en metros) +OptionWizard.38=El archivo CSV/CED no pudo leerse correctamente.
El formato del archivo de valores separados por comas ha de ser como este \:
+OptionWizard.39=ID,Y-Coordinada,X-Coordinada,Elevacion,pendiente,orientacion +OptionWizard.3=Servidor +OptionWizard.40=Proyectos +OptionWizard.41=Cargar un nuevo archivo de proyecto +OptionWizard.42=Error al cerrar el lector del CSV +OptionWizard.43=Nombre de la encuesta +OptionWizard.44=Guardar copia de seguridad de la base de datos en +OptionWizard.45=Abrir Google Earth Engine Playground (obsoleto) +OptionWizard.46=Abrir Google Earth Engine Timelapse +OptionWizard.47=Abrir Bing Maps +OptionWizard.48=Abrir encuesta en un navegador externo en lugar de Google Earth (recomendado para LINUX) +OptionWizard.49=Ruta del archivo ced/csv con las coordenadas de las parcelas +OptionWizard.4=IP de este ordenador\: +OptionWizard.50=Navegar... +OptionWizard.51=Error al importar el archivos del proyecto +OptionWizard.52=Archivo CSV/CED con coordenadas +OptionWizard.53=Sin puntos +OptionWizard.54=Punto central +OptionWizard.55=Error al importar el directorio del proyecto +OptionWizard.56=Cargar proyecto +OptionWizard.57=Proyectos ya cargados +OptionWizard.58=Abrir GEE Code Editor (requiere accesso como Trusted Tester) +OptionWizard.59=Abrir Here Maps +OptionWizard.5=Collect Earth Server puerto\: +OptionWizard.65=Ruta para la carpeta de Saiku +OptionWizard.66=Navegar... +OptionWizard.67=Ruta del ejecutable de Firefox +OptionWizard.68=Navegar... +OptionWizard.6=Parámetros BD PostgreSQL +OptionWizard.70=Archivos ejecutables +OptionWizard.72=Archivos binarios +OptionWizard.73=Ruta del ejecutable de Chrome +OptionWizard.74=Navegar... +OptionWizard.76=Archivos ejecutables +OptionWizard.78=Archivos binarios +OptionWizard.79=Ruta a la plantilla KML de Freemarker +OptionWizard.7=Nombre de usuario +OptionWizard.80=Navegar... +OptionWizard.82=Plantilla Freemarker +OptionWizard.83=Ruta al formulario HTML +OptionWizard.84=Navegar... +OptionWizard.86=Pagina web HTML +OptionWizard.87=Ruta al XML con la definición del IDM +OptionWizard.88=Navegar... OptionWizard.8=Password -OptionWizard.90=XML IDM definition -OptionWizard.91=Server (manager version or stand-alone use) -OptionWizard.92=Client (operator/connected to server) -OptionWizard.93=SQLite (Embedded/single file based) +OptionWizard.90=Definición XML IDM +OptionWizard.91=Servidor (versión para el gerente o para uso autónomo) +OptionWizard.92=Cliente (operador/conectado al servidor) +OptionWizard.93=SQLite (Embebida/basada en un único archivo) OptionWizard.94=PostgreSQL -OptionWizard.95=Side of the sampling dots (in meters) -OptionWizard.9=DB Name -ProcessMonitorDialog.1=Parsing error on row number -ProcessMonitorDialog.4=, columns -ProcessMonitorDialog.5=\ -- values -SaikuAnalysisListener.0=Yes - Refresh Saiku data (long process) -SaikuAnalysisListener.1=No - Use same version of the data as last time Saiku was used -SaikuStarter.1=Starting Saiku -SaikuStarter.2=Starting Saiku can take some minutes, please wait\! -SaikuToolExportListener.1=Saiku Tool generation -SaikuToolExportListener.2=Generating Saiku Tool with current database -SaveEarthDataServlet.0=Empty request -SaveEarthDataServlet.1=Problem occurred while saving data to the database -SaveEarthDataServlet.2=The data was saved -SlopeCode.0=Flat (0-5) -YES=Yes -YES_TO_ALL=Yes to all - -GenerateDatabaseStarter.1=Preparing for analysis -GenerateDatabaseStarter.2=Generating Relational Database - -IPCCGeneratorListener.1=Waiting for process to complete\! -IPCCGeneratorListener.2=The IPCC GHGi compatible data is being generated -IPCCGeneratorListener.3=Refresh the data (update with latest from Collect Earth) -IPCCGeneratorListener.4=Use the latest generated database (fastest process - no update) -IPCCGeneratorListener.5=GHGi Database generation -IPCCGeneratorListener.6=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming but it is necessary if the Collect Earth data has been updated since the last time.
\ No newline at end of file +OptionWizard.95=Lado del punto de sampleo (en metros) +OptionWizard.9=Nombre de la Base de Datos +ProcessMonitorDialog.1=Error de interpretacion en la fila +ProcessMonitorDialog.4=, columnas +ProcessMonitorDialog.5=\ -- valores +SaikuAnalysisListener.0=Si - Actualizar datos de Saiku (proceso de larga duracion) +SaikuAnalysisListener.1=No - Usar los mismos datos de la ultima vez que se usó Saiku +SaikuStarter.1=Iniciando Saiku +SaikuStarter.2=Iniciar Saiku puede tomar varios minutos, espere por favor.\! +SaikuToolExportListener.1=Generación herramienta Saiku +SaikuToolExportListener.2=Generando la herramienta Saiku que incluye la base de datos +SaveEarthDataServlet.0=Sin datos +SaveEarthDataServlet.1=Problemas al guardar los datos en la Base de Datos +SaveEarthDataServlet.2=Los datos se han guardado +SlopeCode.0=Llano (0-5) +YES=Si +YES_TO_ALL=Si a todo \ No newline at end of file From 416990d3ea2e2d406b6d517b33221593cddc31e4 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:19 +0100 Subject: [PATCH 0845/1620] New translations Messages_fr.properties (French) --- .../earth/app/view/Messages_fr.properties | 497 +++++++++--------- 1 file changed, 249 insertions(+), 248 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index efdb0acb96..5199a9b624 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,254 +1,255 @@ -AboutDialog.19=Problemas al abrir -AboutDialog.5=Para mas informacion visite nuestra web OpenForis.org -AboutDialog.6=Lo sentimos, hemos tenido un problema al intentar abrir el link en su navegador standard. +AboutDialog.19=UN problème est apparu +AboutDialog.5=Pour plus d’infos, visitez notre site web OpenForis.org +AboutDialog.6=Désolé, il y a eu un problème lors de l’ouverture du lien avec votre navigateur par défaut. AboutDialog.8=Ok -AspectCode.0=Norte -AspectCode.1=Noreste -AspectCode.2=Este -AspectCode.3=Sureste -AspectCode.4=Sur -AspectCode.5=Suroeste -AspectCode.6=Oeste -AspectCode.7=Noroeste -CollectEarthMenu.0=Importar archivo CEP -CollectEarthMenu.2=Utilidades -CollectEarthMenu.3=Dividir archivos de parcelas CSV grandes -CollectEarthMenu.4=Exportar datos a XML (desde una fecha especifica hasta este momento) -CollectEarthMenu.5=Exportar a Collect Backup -CollectEarthMenu.6=Exportar datos como Collect Backup (todos los datos) -CollectEarthMenu.7=Exportar datos como Collect Backup (filtrar por atributo ) -CollectEarthWindow.0=Error al intentar exportar los datos a un archivo CSV -CollectEarthWindow.10=Archivo -CollectEarthWindow.11=Cerrar -CollectEarthWindow.12=Herramientas -CollectEarthWindow.13=Descargar datos a CSV (Excel) -CollectEarthWindow.14=Comenzar análisis con Saiku -CollectEarthWindow.15=Propiedades -CollectEarthWindow.16=Ayuda -CollectEarthWindow.17=Declaración -CollectEarthWindow.18=Encontrar parcelas ausentes de la Base de Datos +AspectCode.0=Nord +AspectCode.1=Nord-Est +AspectCode.2=Est +AspectCode.3=Sud-Est +AspectCode.4=Sud +AspectCode.5=Sud-Ouest +AspectCode.6=Ouest +AspectCode.7=Nord-Ouest +CollectEarthMenu.0=Importe le fichier .CEP +CollectEarthMenu.2=Utilitaires +CollectEarthMenu.3=Divise un large tableau CSV en plusieurs parties +CollectEarthMenu.4=Exporte les données en XML (à partir d'une date précise jusqu'à aujourd'hui) +CollectEarthMenu.5=Exporte sur la sauvegarde Collect Backup +CollectEarthMenu.6=Exporte les données en tant que sauvegarde Collect Backup (toutes les données) +CollectEarthMenu.7=Exporte les données en tant que sauvegarde Collect Backup (à partir de) +CollectEarthMenu.8=Exporte les données en XML (filtrer par attribut) +CollectEarthWindow.0=Erreur pendant l'exportation des données en csv +CollectEarthWindow.10=Fichier +CollectEarthWindow.11=Quitter +CollectEarthWindow.12=Outils +CollectEarthWindow.13=Télécharger les données en CSV (Excel) +CollectEarthWindow.14=Démarrer l'analyse avec Saïku +CollectEarthWindow.15=Propriétés +CollectEarthWindow.16=Aide +CollectEarthWindow.17=Avertissement +CollectEarthWindow.18=Trouver les placettes manquantes dans la base de données CollectEarthWindow.19=Collect Earth -CollectEarthWindow.1=Error al exportar -CollectEarthWindow.20=Número de registros repetidos\: -CollectEarthWindow.21=No se pudo encontrar el icono de la ventana principal -CollectEarthWindow.22=¿Seguro que quieres cerrar Collect Earth?
El servidor de Collect Earth terminara al cerrar la ventana -CollectEarthWindow.23=Necesita confirmación -CollectEarthWindow.24=Exportar a XML -CollectEarthWindow.25=¿Quiere importar estos registros de todas formas y perder sus datos actuales? -CollectEarthWindow.26=Operador -CollectEarthWindow.27=Actualizar -CollectEarthWindow.28=El servidor Open Foris Collect Earth debe estar en funcionamiento mientras el operador esta realizando su trabajo. -CollectEarthWindow.29=El servidor Saiku no ha sido configurado. -CollectEarthWindow.2=Idioma -CollectEarthWindow.30=Por favor, mantenga esta ventana abierta mientras este utilizando Google Earth. -CollectEarthWindow.31=Exportar los datos como archivos CSV -CollectEarthWindow.32=Salir -CollectEarthWindow.33=El nombre del operador ha de ser mas largo que cinco caracteres y mas corto que 50 -CollectEarthWindow.34=Error de validación -CollectEarthWindow.35=\!NOMBRE DEL OPERADOR VACIO\!
Rellene el campo del nombre del operador y presione el botón de "Actualizar". -CollectEarthWindow.36=El nombre del operador no puede estar vacío -CollectEarthWindow.37=Conservar abierto -CollectEarthWindow.38=Archivos CSV -CollectEarthWindow.39=ATENCION\: Recomendamos que guarde una copia de seguridad de sus datos actuales (expórtelos a XML) antes de importar los nuevos datos. -CollectEarthWindow.3=\ Error al importar datos -CollectEarthWindow.40=Configure la ruta a la carpeta donde el servidor Saiku ha sido instalado en Herramientas->Propiedades->Avanzadas. -CollectEarthWindow.41=Guardando los datos en el archivo\: -CollectEarthWindow.42=Terminar -CollectEarthWindow.43=Detectados registros repetidos -CollectEarthWindow.44=Importar/Exportar datos -CollectEarthWindow.45=Exportar datos en XML (comprimidos) -CollectEarthWindow.46=Importar nuevos datos desde ZIP (XML comprimidos) -CollectEarthWindow.47=Servidor Saiku no configurado -CollectEarthWindow.48=Archivos zip/collect-data -CollectEarthWindow.49=Archivos Fusion CSV -CollectEarthWindow.4=Exención de responsabilidad de FAO -CollectEarthWindow.50=Abrir Manual de Usuario -CollectEarthWindow.51=Comprobar si hay actualizaciones de Collect Earth -CollectEarthWindow.52=Abrir el archivo de registo de la aplicacion -CollectEarthWindow.53=Archivo de registro de Collect Earth -CollectEarthWindow.54=Cargar puntos desde KML -CollectEarthWindow.55=Actualizar datos ya registrados desde CSV -CollectEarthWindow.56=Mas informacion... -CollectEarthWindow.57=El proceso para comenzar Saiku esta ejecutandose todavia, espere unos minutos. -CollectEarthWindow.58=No se pudo iniciar el analisis con Saiku -CollectEarthWindow.59=¿Quiere volver a generar los datos para el analisis de Saiku?
Este proceso puede tomar varios minutos.
Si hace click en "SI" los datos mas actuales seran generados. -CollectEarthWindow.5=Cerrar -CollectEarthWindow.60=Generación de datos para Saiku -CollectEarthWindow.61=Exportar a XML (solo los registros anadidos/modificados) -CollectEarthWindow.62=Mas informacion.. -CollectEarthWindow.63=Error leyendo los puntos desde el KML -CollectEarthWindow.64=Soporte tecnico -CollectEarthWindow.65=Se ha cambido el nombre del operador -CollectEarthWindow.66=Cambio de operador -CollectEarthWindow.67=Abrir directorio de datos de CE -CollectEarthWindow.6=Exportar datos a Fusion Table -CollectEarthWindow.70=Abrir el manual de esta encuesta -CollectEarthWindow.71=Generar herramienta Saiku independiente -CollectEarthWindow.7=Error al importar los datos -CollectEarthWindow.8=No se pudo encontrar el testo de exención de responsabilidad -CollectEarthWindow.9=Los datos importados contienen registros que ya están presentes en su base de datos -DynamicsCode.0=Inicialmente Bosque -DynamicsCode.1=Inicialmente Pastizal -DynamicsCode.2=Inicialmente Asentamiento -DynamicsCode.3=Inicialmente Otras tierras -DynamicsCode.4=Inicialmente Humedal -DynamicsCode.5=Inicialmente Cultivo -EarthApp.11=Collect Earth ya está ejecutandose -EarthApp.21=El archivo CSV/CED que contiene el diseño de la malla de puntos no se encuentra en la ruta seleccionada \:
-EarthApp.23=No se ha configurado ningun archivo de puntos CSV/CED \:

-EarthApp.24=El archivo que contiene la plantilla de Freemarker con la definicion del KML no se encuntra en la ruta seleccionada \:
-EarthApp.26=No se ha configurado ninguna archivo con la definicion del KML \:

-EarthApp.27=El archivo que contiene el formulario del pop-up en HTMl no se ha encontrado en la ruta seleccionada \:
-EarthApp.29=No se ha configurado ningun HTML de configuracion del pop-up \:

-EarthApp.30=Corrija la localizacion del archivo a traves del menu Herramientas->Propiedades. -EarthApp.3=Recordarme mas tarde -EarthApp.4=Actualizar Ahora -EarthApp.57=Hay una nueva version de Collect Earth disponible\! -EarthApp.58=Alerta para actualizacion -EarthApp.59=Error al importar el archivo del proyecto -EarthApp.5=No recordarme otra vez -EarthApp.61=El archivo KMZ generado por Collect Earth no se pudo abrir.
Asegurese de que Google Earth esta instalado. +CollectEarthWindow.1=Erreur d'exportation +CollectEarthWindow.20=Nombre d'enregistrements dupliqués +CollectEarthWindow.21=Icône non trouvée +CollectEarthWindow.22= Êtes-vous sûr de vouloir fermer CollectEarth
Fermer cette fenêtre fermera aussi le serveur +CollectEarthWindow.23=Confirmation requise +CollectEarthWindow.24=Exporter en XML +CollectEarthWindow.25=Voulez-vous ajouter tout de même ces données et perdre vos enregistrements? +CollectEarthWindow.26=Utilisateur +CollectEarthWindow.27=Appliquer +CollectEarthWindow.28=Le serveur devrait être démarré pour la saisie des données par les utilisateurs. +CollectEarthWindow.29=Le serveur Saiku n'est pas configuré. +CollectEarthWindow.2=Langue +CollectEarthWindow.30=Veuillez garder cette fenêtre active pendant que vous utilisez Google Earth +CollectEarthWindow.31=Exporter les données collectées en CSV +CollectEarthWindow.32=Fermer +CollectEarthWindow.33=Le nom de l'utilisateur doit comprendre entre 5 et 50 caractères +CollectEarthWindow.34=Erreur de validation +CollectEarthWindow.35= NOM DE L'UTILISATEUR VIDE\!
Veuillez renseigner le champs et Appuyer sur "Mise à jour" +CollectEarthWindow.36=Le nom de l'utilisateur ne peut pas être vide +CollectEarthWindow.37=Laisser ouvert +CollectEarthWindow.38=Fichiers CSV +CollectEarthWindow.39=NOTE \: Il est conseillé de sauvegarder vos données (export en XML) avant d'importer de nouvelles données +CollectEarthWindow.3=\ Erreur pendant l'importation +CollectEarthWindow.40=Renseigner le chemin jusqu'au serveur Saiku dans /Outils/Propriétés/Avancé. +CollectEarthWindow.41=Sauvegarde des données exportées dans le fichier\: +CollectEarthWindow.42=Quitter +CollectEarthWindow.43=Enregistrements conflictuels trouvés +CollectEarthWindow.44=Importer/Exporter les données +CollectEarthWindow.45=Exporter les données en XML (zippé) +CollectEarthWindow.46=Importer de nouvelles données depuis ZIP (XML zippé) +CollectEarthWindow.47=Le serveur Saiku n'est pas configuré +CollectEarthWindow.48=Fichier zip/collect-data +CollectEarthWindow.49=Fusion des fichiers CSV +CollectEarthWindow.4=Clause de non-responsabilité de la FAO +CollectEarthWindow.50=Ouvrir le manuel utilisateur +CollectEarthWindow.51=Vérifier les mises à jour des Collect Earth +CollectEarthWindow.52=Fichier de logs Open Application +CollectEarthWindow.53=Fichier de logs Collect Earth +CollectEarthWindow.54=Charger les points de KML +CollectEarthWindow.55=Mettre à jour les enregistrements en utilisant un fichier CSV +CollectEarthWindow.56=A propos... +CollectEarthWindow.57=Le processus de démarrage de Saïku est en cours, veuillez patienter +CollectEarthWindow.58=Impossible de démarrer l'analyse avec Saïku +CollectEarthWindow.59=Voulez-vous régénérer le jeu de données?
Cela peut prendre du temps.
Cliquer sur oui pour régénérer un nouveau jeu de données avec les dernières informations +CollectEarthWindow.5=Fermer +CollectEarthWindow.60=Génération des données Saïku +CollectEarthWindow.61=Exporter en XML (uniquement les enregistrements modifiés/ajoutés) +CollectEarthWindow.62=A propos… +CollectEarthWindow.63=Erreur en accédant aux points de KML +CollectEarthWindow.64=Assistance technique +CollectEarthWindow.65=Le nom de l'opérateur a été changé +CollectEarthWindow.66=Nom de l'opérateur +CollectEarthWindow.67=Ouvrir le dossier de données de CE +CollectEarthWindow.6=Exporter en Table de Fusion +CollectEarthWindow.70=Ouvrez le manuel de cette enquête +CollectEarthWindow.71=Générer un outil Saiku autonome +CollectEarthWindow.7=Erreur pendant l'importation des données +CollectEarthWindow.8=Le texte est introuvable +CollectEarthWindow.9=Les données importées contiennent des redondances avec celles présentes dans la base +DynamicsCode.0= Terre Forestière initialement +DynamicsCode.1= Prairie initialement +DynamicsCode.2= Etablissement initialement +DynamicsCode.3= Autre terre initialement +DynamicsCode.4= Terre humide initialement +DynamicsCode.5= Terre cultivée initialement +EarthApp.11=Collect Earth est déjà en cours d’exécution +EarthApp.21=Le fichier CSV/CED contenant les points est introuvable \:
+EarthApp.23=Aucun fichier CSV/CED spécifié \:

+EarthApp.24=Le fichier contenant le modèle de définition KML est introuvable \:
+EarthApp.26=Aucun modèle de définition spécifié\:

+EarthApp.27=Le fichier contenant le ballon HTML est introuvable \:
+EarthApp.29=Aucun ballon HTML spécifié \:

+EarthApp.30=Veuillez corriger le chemin d’accès dans le menu Outils -> Propriétés. +EarthApp.3=Rappelez le moi plus tard +EarthApp.4=Mettre a jour maintenant +EarthApp.57= Une nouvelle version de Collect Earth est disponible\! Utiliser le Menu +EarthApp.58=Alerte de mise à jour +EarthApp.59=Erreur pendant l’importation du fichier +EarthApp.5=Ne me le rappelez plus +EarthApp.61=Le fichier Collect Earth est introuvable br/>Veuillez-vous assurer que Google Earth est installé. EarthApp.6=\ - Version -EarthApp.70=ATENCION -EarthApp.71=En Mac OS X los archivos de proyectos de Collect Earth (*.cep) no se abren automaticamente al hacer doble-click sobre ellos.
-EarthApp.72=Utiliza la barra de herramientas de Collect Earth para abrir lo archivos .cep \: -EarthApp.73=Collect Earth en ordenadores Mac OS X -EarthSurveyService.9=Campo necesario -ExportActionListener.1=Elija la fecha desde la que exportar los datos -ExportDialogProcessMonitor.0=Procesando datos... -ExportDialogProcessMonitor.1=Esperando a la inicializacion del exportador \: -ExportDialogProcessMonitor.4=Registros exportados \: -ImportActionListener.0=¿Quiere importar los datos de las parcelas que no han sido completamente rellenadas? -ImportActionListener.2=Si hace click en NO se importarán solo los datos de las parcelas en el estado completo (verde)". -ImportActionListener.3=Importar registros incompletos -ImportDialogProcessMonitor.0=\ CALCULANDO -ImportDialogProcessMonitor.11=Cifra inicial the registros \: -ImportDialogProcessMonitor.2=Importando registros... -ImportDialogProcessMonitor.5=Cifra final de registros importados \: -ImportDialogProcessMonitor.8=Procesando datos... -ImportProcessMonitorDialog.0=Registros importados \: -ImportXMLDialogProcessMonitor.1 = Sobreescrivir las parcelas en BBDD -ImportXMLDialogProcessMonitor.2 = Importar solo parcelas sin conflictos -InfiniteProgressMonitor.0=Cancelar operación -JFileChooserExistsAware.0=Archivo de proyecto Collect Earth -KmlImportService.13=Seleccionar archivo CSV donde guardar las posiciones de las parcelas -MissingPlotsListener.0=Error cuando se estaba obteniendo información de las parcelas ausentes de la base de datos -MissingPlotsListener.10=Numero total de parcelas en el diseño de la muestra \: -MissingPlotsListener.12=Numero de parcelas que faltan \: -MissingPlotsListener.14=Todas las parcelas han sido rellenadas\! -MissingPlotsListener.1=Parcelas que faltan -MissingPlotsListener.2=Copiar contenidos -MissingPlotsListener.3=Elija los archivos que contienen informacion sobre las parcelas ( archivos .csv o .ced ) para los que desea averiguar si todos los datos se han rellenado. -MissingPlotsListener.4=Parcelas ausentes – informacion -MissingPlotsListener.5=Del archivo \: -MissingPlotsListener.6=Exportar a archivo CED -NO=No -NO_TO_ALL=No a todo -OpenTextFileListener.0=El archivo de texto no ha sido encontrado en \: -OptionWizard.0=Opciones de Collect Earth -OptionWizard.100=Abrir Planet -OptionWizard.101=Llave de la API de Planet +EarthApp.70=AVERTISSMENT +EarthApp.71=Sous Mac OS X, les fichiers de projet Collect Earth (* .cep) ne s'ouvriront pas dans Collect Earth lorsqu'ils sont double-cliqués.
+EarthApp.72=Utilisez la barre d'outils Collect Earth pour ouvrir les fichiers .cep \: +EarthApp.73=Collect Earth - problèmes sur les ordinateurs Mac OS X +EarthSurveyService.9=Champs requis +ExportActionListener.1=Choisir la date pour les données à exporter +ExportDialogProcessMonitor.0=Chargement des données... +ExportDialogProcessMonitor.1=Attente d'initialisation de l'export +ExportDialogProcessMonitor.4=Enregistrements exportés \: +ImportActionListener.0=Est-ce que les données pour les placettes qui ne sont pas complètes doivent être importées ? +ImportActionListener.2=Si vous cliquez sur NO, seulement les données provenant des placettes avec la marque « verte », qui contiennent toutes les données, seront importées +ImportActionListener.3=Importer les enregistrements incomplets +ImportDialogProcessMonitor.0=Calcul en cours +ImportDialogProcessMonitor.11=Nombre initial d' enregistrements \: +ImportDialogProcessMonitor.2=Chargement des enregistrements... +ImportDialogProcessMonitor.5=Nombre réel d'enregistrements importés\: +ImportDialogProcessMonitor.8=Chargement des données... +ImportProcessMonitorDialog.0=Enregistrements importés \: +ImportXMLDialogProcessMonitor.1 = Écraser les données dans la base de données +ImportXMLDialogProcessMonitor.2 = Importer uniquement des enregistrements non conflictuels +InfiniteProgressMonitor.0=Annuler l’opération +JFileChooserExistsAware.0=Fichier projet Collect Earth +KmlImportService.13=Sélectionnez un fichier CSV pour enregistrer les emplacements des parcelles +MissingPlotsListener.0=Erreur au cours de l’enregistrement des placettes absentes de la base de données +MissingPlotsListener.10=Nombre total de parcelles dans le plan d'échantillonnage \: +MissingPlotsListener.12=Nombre de parcelles manquantes \: +MissingPlotsListener.14=Toutes les parcelles sont remplis\! +MissingPlotsListener.1=Placettes manquantes +MissingPlotsListener.2=Copier le contenu sur le clipboard +MissingPlotsListener.3=Choisir les fichiers qui contiennent les informations des placettes (.csv ou .ced) pour lesquelles vous voulez savoir si toues les placettes ont été renseignées +MissingPlotsListener.4=Placettes manquantes – Information +MissingPlotsListener.5=Depuis le fichier \: +MissingPlotsListener.6=Exporter en CED +NO=Non +NO_TO_ALL=Non à tous +OpenTextFileListener.0=Le fichier texte n'a pas été trouvé dans \: +OptionWizard.0=Options Collect Earth +OptionWizard.100=Ouvrir Planet +OptionWizard.101=Clé API Planet OptionWizard.1021=URL SecureWatch -OptionWizard.102=Abrir Maxar SecureWatch (necesario tener licencia) -OptionWizard.103=Configurar la URL para el Mapa Extra (se abre cuando esta configurada) \: -OptionWizard.104=Navegadores -OptionWizard.105=Abrir Earth Map -OptionWizard.110=Usar las imagenes mensuales de NICFI -OptionWizard.10=Abrir carpeta de copias de seguridad -OptionWizard.11=Desconocido\: usar ipconfig -OptionWizard.12=Instancia cliente -OptionWizard.13=Collect Earth Server IP -OptionWizard.14=Collect Earth Server puerto (e.g. 8023) -OptionWizard.15=Guardar & aplicar cambios +OptionWizard.102=Ouvrir Maxar SecureWatch +OptionWizard.103=Définir le URL pour le Carte Extra (ouvre quand il est réglé) \: +OptionWizard.104=Navigateurs +OptionWizard.105=Ouvrir Earth Map +OptionWizard.110=Utiliser les images mensuelles fournies par NICFI +OptionWizard.10=Montrer les fichiers de sauvegarde +OptionWizard.11=Inconnu \: utiliser ifconfig +OptionWizard.12=Instance client +OptionWizard.13=IP Serveur de Collect Earth +OptionWizard.14=Port Serveur de Collect Earth (e.g. 8023) +OptionWizard.15=Appliquer et sauvegarder les changements OptionWizard.16=ID -OptionWizard.17=X-coord -OptionWizard.18=Y-coord -OptionWizard.19=Elevación -OptionWizard.1=Elija navegador -OptionWizard.20=Los contenidos de Google Earth han cambiado.
Acepte la recarga del contenido cuando Google Earth le pregunte. -OptionWizard.21=Actualizado con éxito -OptionWizard.22=Pendiente -OptionWizard.23=Hubo un error al reabrir los datos en Google Earth -OptionWizard.24=Cancelar -OptionWizard.25=Modo de operación -OptionWizard.26=BBDD servidor -OptionWizard.27=Esta no es una carpeta de un servido Saiku ( el archivo start-saiku.bat no esta presente) -OptionWizard.28=Servidor Saiku no reconocible -OptionWizard.29=BBDD puerto -OptionWizard.2=Tipo de uso (servidor/cliente) -OptionWizard.30=Opciones SQLite -OptionWizard.31=Datos de muestra -OptionWizard.32=Diseño de parcela -OptionWizard.33=Definición de la encuesta -OptionWizard.34=Servicios integrados -OptionWizard.35=Número de puntos de control -OptionWizard.36=Distancia entre los puntos de control (en metros) -OptionWizard.37=Margen con el borde de la parcela (en metros) -OptionWizard.38=El archivo CSV/CED no pudo leerse correctamente.
El formato del archivo de valores separados por comas ha de ser como este \:
-OptionWizard.39=ID,Y-Coordinada,X-Coordinada,Elevacion,pendiente,orientacion -OptionWizard.3=Servidor -OptionWizard.40=Proyectos -OptionWizard.41=Cargar un nuevo archivo de proyecto -OptionWizard.42=Error al cerrar el lector del CSV -OptionWizard.43=Nombre de la encuesta -OptionWizard.44=Guardar copia de seguridad de la base de datos en -OptionWizard.45=Abrir Google Earth Engine Playground (obsoleto) -OptionWizard.46=Abrir Google Earth Engine Timelapse -OptionWizard.47=Abrir Bing Maps -OptionWizard.48=Abrir encuesta en un navegador externo en lugar de Google Earth (recomendado para LINUX) -OptionWizard.49=Ruta del archivo ced/csv con las coordenadas de las parcelas -OptionWizard.4=IP de este ordenador\: -OptionWizard.50=Navegar... -OptionWizard.51=Error al importar el archivos del proyecto -OptionWizard.52=Archivo CSV/CED con coordenadas -OptionWizard.53=Sin puntos -OptionWizard.54=Punto central -OptionWizard.55=Error al importar el directorio del proyecto -OptionWizard.56=Cargar proyecto -OptionWizard.57=Proyectos ya cargados -OptionWizard.58=Abrir GEE Code Editor (requiere accesso como Trusted Tester) -OptionWizard.59=Abrir Here Maps -OptionWizard.5=Collect Earth Server puerto\: -OptionWizard.65=Ruta para la carpeta de Saiku -OptionWizard.66=Navegar... -OptionWizard.67=Ruta del ejecutable de Firefox -OptionWizard.68=Navegar... -OptionWizard.6=Parámetros BD PostgreSQL -OptionWizard.70=Archivos ejecutables -OptionWizard.72=Archivos binarios -OptionWizard.73=Ruta del ejecutable de Chrome -OptionWizard.74=Navegar... -OptionWizard.76=Archivos ejecutables -OptionWizard.78=Archivos binarios -OptionWizard.79=Ruta a la plantilla KML de Freemarker -OptionWizard.7=Nombre de usuario -OptionWizard.80=Navegar... -OptionWizard.82=Plantilla Freemarker -OptionWizard.83=Ruta al formulario HTML -OptionWizard.84=Navegar... -OptionWizard.86=Pagina web HTML -OptionWizard.87=Ruta al XML con la definición del IDM -OptionWizard.88=Navegar... -OptionWizard.8=Password -OptionWizard.90=Definición XML IDM -OptionWizard.91=Servidor (versión para el gerente o para uso autónomo) -OptionWizard.92=Cliente (operador/conectado al servidor) -OptionWizard.93=SQLite (Embebida/basada en un único archivo) +OptionWizard.17=Coord-X +OptionWizard.18=Coord-Y +OptionWizard.19=Altitude +OptionWizard.1=Choisir un navigateur +OptionWizard.20= Le contenu de Google Earth a changé
Veuillez accepter la mise à jour quand GE le demande +OptionWizard.21=Mise à jour réussie +OptionWizard.22=Pente +OptionWizard.23=Il y a eu une erreur pendant la réouverture de Google Earth +OptionWizard.24=Annuler +OptionWizard.25=Mode opération +OptionWizard.26=Hôte pour la BDD +OptionWizard.27=Le dossier n'est pas valide (il manque le fichier start-saiku.bat) +OptionWizard.28=Le dossier Saiku n'est pas reconnu +OptionWizard.29=Port pour la BDD +OptionWizard.2=Flux (serveur/client) +OptionWizard.30=Options SQLite +OptionWizard.31=Points d'échantillonnage +OptionWizard.32=Configuration de la parcelle +OptionWizard.33=Définition de l'enquête +OptionWizard.34=Services intégrés +OptionWizard.35=Nombre de points de contrôle +OptionWizard.36=Distance entre les points de contrôle (en mètres) +OptionWizard.37=Distance au bord de la parcelle (en mètres) +OptionWizard.38=Le Fichier CSV/CED ne peut pas être lu
Le fichier devrait avoir des valeurs séparées par des virgules comme ceci \:
+OptionWizard.39=ID,Coordonnée_Y, Coordonnée_X,altitude,pente,orientation +OptionWizard.3=Instance serveur +OptionWizard.40=Projets +OptionWizard.41=Charger un nouveau fichier projet +OptionWizard.42=Erreur pendant la fermeture du lecteur CSV +OptionWizard.43=Nom de l'enquête +OptionWizard.44=Sauvegarder automatiquement la base dans +OptionWizard.45=Ouvrir Earth Engine Playground (obsolète) +OptionWizard.46=Ouvrir le Timelapse de Google Earth Engine +OptionWizard.47=Ouvrir Bing Maps +OptionWizard.48=Ouvrir le formulaire dans un navigateur plutôt que dans GE (recommandé pour Linux) +OptionWizard.49=Chemin jusqu'au fichier ced/csv avec les données des parcelles +OptionWizard.4=IP actuelle de l'ordinateur +OptionWizard.50=Parcourir +OptionWizard.51=Erreur pendant l'importation du fichier +OptionWizard.52=Fichier CSV/CED uniquement avec des coordonnées +OptionWizard.53=Pas de points +OptionWizard.54=Point central +OptionWizard.55=Erreur pendant l'importation du dossier projet +OptionWizard.56=Charger le projet +OptionWizard.57=Projets chargés précedemment +OptionWizard.58=Ouvrir GEE Code Editor (nécessite un accès restreint Trusted Tester) +OptionWizard.59=Ouvrir Here Maps +OptionWizard.5=Port Serveur Collect Earth \: +OptionWizard.65=Chemin jusqu'au serveur Saiku +OptionWizard.66=Parcourir +OptionWizard.67=Chemin jusqu'à Firefox +OptionWizard.68=Parcourir +OptionWizard.6=Paramètres de la BD PostGreSQL +OptionWizard.70=Fichiers exécutables +OptionWizard.72=Fichiers binaires +OptionWizard.73=Chemin jusqu'à Chrome +OptionWizard.74=Parcourir +OptionWizard.76=Fichiers exécutables +OptionWizard.78=Fichiers binaires +OptionWizard.79=Chemin jusqu'au modèle Freemarker KML +OptionWizard.7=Nom d'utilisateur +OptionWizard.80=Parcourir +OptionWizard.82=Modèle Freemarker +OptionWizard.83=Chemin jusqu'au Ballon HTML +OptionWizard.84=Parcourir +OptionWizard.86=Page web HTML +OptionWizard.87=Chemin jusqu'au fichier XML contenant la définition IDM +OptionWizard.88=Parcourir +OptionWizard.8=Mot de passe +OptionWizard.90=Définition IDM XML +OptionWizard.91=Serveur (version gestionnaire ou autonome) +OptionWizard.92=Client (opérateur/connecté au serveur) +OptionWizard.93=SQLite (Fichier intégré / Unique) OptionWizard.94=PostgreSQL -OptionWizard.95=Lado del punto de sampleo (en metros) -OptionWizard.9=Nombre de la Base de Datos -ProcessMonitorDialog.1=Error de interpretacion en la fila -ProcessMonitorDialog.4=, columnas -ProcessMonitorDialog.5=\ -- valores -SaikuAnalysisListener.0=Si - Actualizar datos de Saiku (proceso de larga duracion) -SaikuAnalysisListener.1=No - Usar los mismos datos de la ultima vez que se usó Saiku -SaikuStarter.1=Iniciando Saiku -SaikuStarter.2=Iniciar Saiku puede tomar varios minutos, espere por favor.\! -SaikuToolExportListener.1=Generación herramienta Saiku -SaikuToolExportListener.2=Generando la herramienta Saiku que incluye la base de datos -SaveEarthDataServlet.0=Sin datos -SaveEarthDataServlet.1=Problemas al guardar los datos en la Base de Datos -SaveEarthDataServlet.2=Los datos se han guardado -SlopeCode.0=Llano (0-5) -YES=Si -YES_TO_ALL=Si a todo \ No newline at end of file +OptionWizard.95=Côté des points d'échantillonnage (en mètres) +OptionWizard.9=Nom de la base +ProcessMonitorDialog.1=Erreur d’interprétation sur numéro de rangée +ProcessMonitorDialog.4=, colonnes +ProcessMonitorDialog.5=\ -- valeures +SaikuAnalysisListener.0=Oui - Rafraichir les données Saiku (processus long) +SaikuAnalysisListener.1=Non - Utiliser la même version des données que la dernière fois que Saiku a été utilisé +SaikuToolExportListener.1=Génération de l'outil Saiku +SaikuToolExportListener.2=Génération de l'outil Saiku avec la base de données actuelle +SaikuStarter.1=Démarrer Saïku +SaikuStarter.2=Démarrer Saïku peut prendre plusieurs minutes, veuillez patienter\! +SaveEarthDataServlet.0=Requête vide +SaveEarthDataServlet.1=Problème lors de la sauvegarde de la base de données +SaveEarthDataServlet.2=Les données ont été sauvées +SlopeCode.0=Plan (0-5) +YES=Oui +YES_TO_ALL=Oui à tous \ No newline at end of file From 953f668672659badb3f11e2d7833d90418d25f9a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:20 +0100 Subject: [PATCH 0846/1620] New translations Messages_fr.properties (Spanish) --- .../earth/app/view/Messages_es.properties | 497 +++++++++--------- 1 file changed, 249 insertions(+), 248 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index efdb0acb96..5199a9b624 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,254 +1,255 @@ -AboutDialog.19=Problemas al abrir -AboutDialog.5=Para mas informacion visite nuestra web OpenForis.org -AboutDialog.6=Lo sentimos, hemos tenido un problema al intentar abrir el link en su navegador standard. +AboutDialog.19=UN problème est apparu +AboutDialog.5=Pour plus d’infos, visitez notre site web OpenForis.org +AboutDialog.6=Désolé, il y a eu un problème lors de l’ouverture du lien avec votre navigateur par défaut. AboutDialog.8=Ok -AspectCode.0=Norte -AspectCode.1=Noreste -AspectCode.2=Este -AspectCode.3=Sureste -AspectCode.4=Sur -AspectCode.5=Suroeste -AspectCode.6=Oeste -AspectCode.7=Noroeste -CollectEarthMenu.0=Importar archivo CEP -CollectEarthMenu.2=Utilidades -CollectEarthMenu.3=Dividir archivos de parcelas CSV grandes -CollectEarthMenu.4=Exportar datos a XML (desde una fecha especifica hasta este momento) -CollectEarthMenu.5=Exportar a Collect Backup -CollectEarthMenu.6=Exportar datos como Collect Backup (todos los datos) -CollectEarthMenu.7=Exportar datos como Collect Backup (filtrar por atributo ) -CollectEarthWindow.0=Error al intentar exportar los datos a un archivo CSV -CollectEarthWindow.10=Archivo -CollectEarthWindow.11=Cerrar -CollectEarthWindow.12=Herramientas -CollectEarthWindow.13=Descargar datos a CSV (Excel) -CollectEarthWindow.14=Comenzar análisis con Saiku -CollectEarthWindow.15=Propiedades -CollectEarthWindow.16=Ayuda -CollectEarthWindow.17=Declaración -CollectEarthWindow.18=Encontrar parcelas ausentes de la Base de Datos +AspectCode.0=Nord +AspectCode.1=Nord-Est +AspectCode.2=Est +AspectCode.3=Sud-Est +AspectCode.4=Sud +AspectCode.5=Sud-Ouest +AspectCode.6=Ouest +AspectCode.7=Nord-Ouest +CollectEarthMenu.0=Importe le fichier .CEP +CollectEarthMenu.2=Utilitaires +CollectEarthMenu.3=Divise un large tableau CSV en plusieurs parties +CollectEarthMenu.4=Exporte les données en XML (à partir d'une date précise jusqu'à aujourd'hui) +CollectEarthMenu.5=Exporte sur la sauvegarde Collect Backup +CollectEarthMenu.6=Exporte les données en tant que sauvegarde Collect Backup (toutes les données) +CollectEarthMenu.7=Exporte les données en tant que sauvegarde Collect Backup (à partir de) +CollectEarthMenu.8=Exporte les données en XML (filtrer par attribut) +CollectEarthWindow.0=Erreur pendant l'exportation des données en csv +CollectEarthWindow.10=Fichier +CollectEarthWindow.11=Quitter +CollectEarthWindow.12=Outils +CollectEarthWindow.13=Télécharger les données en CSV (Excel) +CollectEarthWindow.14=Démarrer l'analyse avec Saïku +CollectEarthWindow.15=Propriétés +CollectEarthWindow.16=Aide +CollectEarthWindow.17=Avertissement +CollectEarthWindow.18=Trouver les placettes manquantes dans la base de données CollectEarthWindow.19=Collect Earth -CollectEarthWindow.1=Error al exportar -CollectEarthWindow.20=Número de registros repetidos\: -CollectEarthWindow.21=No se pudo encontrar el icono de la ventana principal -CollectEarthWindow.22=¿Seguro que quieres cerrar Collect Earth?
El servidor de Collect Earth terminara al cerrar la ventana -CollectEarthWindow.23=Necesita confirmación -CollectEarthWindow.24=Exportar a XML -CollectEarthWindow.25=¿Quiere importar estos registros de todas formas y perder sus datos actuales? -CollectEarthWindow.26=Operador -CollectEarthWindow.27=Actualizar -CollectEarthWindow.28=El servidor Open Foris Collect Earth debe estar en funcionamiento mientras el operador esta realizando su trabajo. -CollectEarthWindow.29=El servidor Saiku no ha sido configurado. -CollectEarthWindow.2=Idioma -CollectEarthWindow.30=Por favor, mantenga esta ventana abierta mientras este utilizando Google Earth. -CollectEarthWindow.31=Exportar los datos como archivos CSV -CollectEarthWindow.32=Salir -CollectEarthWindow.33=El nombre del operador ha de ser mas largo que cinco caracteres y mas corto que 50 -CollectEarthWindow.34=Error de validación -CollectEarthWindow.35=\!NOMBRE DEL OPERADOR VACIO\!
Rellene el campo del nombre del operador y presione el botón de "Actualizar". -CollectEarthWindow.36=El nombre del operador no puede estar vacío -CollectEarthWindow.37=Conservar abierto -CollectEarthWindow.38=Archivos CSV -CollectEarthWindow.39=ATENCION\: Recomendamos que guarde una copia de seguridad de sus datos actuales (expórtelos a XML) antes de importar los nuevos datos. -CollectEarthWindow.3=\ Error al importar datos -CollectEarthWindow.40=Configure la ruta a la carpeta donde el servidor Saiku ha sido instalado en Herramientas->Propiedades->Avanzadas. -CollectEarthWindow.41=Guardando los datos en el archivo\: -CollectEarthWindow.42=Terminar -CollectEarthWindow.43=Detectados registros repetidos -CollectEarthWindow.44=Importar/Exportar datos -CollectEarthWindow.45=Exportar datos en XML (comprimidos) -CollectEarthWindow.46=Importar nuevos datos desde ZIP (XML comprimidos) -CollectEarthWindow.47=Servidor Saiku no configurado -CollectEarthWindow.48=Archivos zip/collect-data -CollectEarthWindow.49=Archivos Fusion CSV -CollectEarthWindow.4=Exención de responsabilidad de FAO -CollectEarthWindow.50=Abrir Manual de Usuario -CollectEarthWindow.51=Comprobar si hay actualizaciones de Collect Earth -CollectEarthWindow.52=Abrir el archivo de registo de la aplicacion -CollectEarthWindow.53=Archivo de registro de Collect Earth -CollectEarthWindow.54=Cargar puntos desde KML -CollectEarthWindow.55=Actualizar datos ya registrados desde CSV -CollectEarthWindow.56=Mas informacion... -CollectEarthWindow.57=El proceso para comenzar Saiku esta ejecutandose todavia, espere unos minutos. -CollectEarthWindow.58=No se pudo iniciar el analisis con Saiku -CollectEarthWindow.59=¿Quiere volver a generar los datos para el analisis de Saiku?
Este proceso puede tomar varios minutos.
Si hace click en "SI" los datos mas actuales seran generados. -CollectEarthWindow.5=Cerrar -CollectEarthWindow.60=Generación de datos para Saiku -CollectEarthWindow.61=Exportar a XML (solo los registros anadidos/modificados) -CollectEarthWindow.62=Mas informacion.. -CollectEarthWindow.63=Error leyendo los puntos desde el KML -CollectEarthWindow.64=Soporte tecnico -CollectEarthWindow.65=Se ha cambido el nombre del operador -CollectEarthWindow.66=Cambio de operador -CollectEarthWindow.67=Abrir directorio de datos de CE -CollectEarthWindow.6=Exportar datos a Fusion Table -CollectEarthWindow.70=Abrir el manual de esta encuesta -CollectEarthWindow.71=Generar herramienta Saiku independiente -CollectEarthWindow.7=Error al importar los datos -CollectEarthWindow.8=No se pudo encontrar el testo de exención de responsabilidad -CollectEarthWindow.9=Los datos importados contienen registros que ya están presentes en su base de datos -DynamicsCode.0=Inicialmente Bosque -DynamicsCode.1=Inicialmente Pastizal -DynamicsCode.2=Inicialmente Asentamiento -DynamicsCode.3=Inicialmente Otras tierras -DynamicsCode.4=Inicialmente Humedal -DynamicsCode.5=Inicialmente Cultivo -EarthApp.11=Collect Earth ya está ejecutandose -EarthApp.21=El archivo CSV/CED que contiene el diseño de la malla de puntos no se encuentra en la ruta seleccionada \:
-EarthApp.23=No se ha configurado ningun archivo de puntos CSV/CED \:

-EarthApp.24=El archivo que contiene la plantilla de Freemarker con la definicion del KML no se encuntra en la ruta seleccionada \:
-EarthApp.26=No se ha configurado ninguna archivo con la definicion del KML \:

-EarthApp.27=El archivo que contiene el formulario del pop-up en HTMl no se ha encontrado en la ruta seleccionada \:
-EarthApp.29=No se ha configurado ningun HTML de configuracion del pop-up \:

-EarthApp.30=Corrija la localizacion del archivo a traves del menu Herramientas->Propiedades. -EarthApp.3=Recordarme mas tarde -EarthApp.4=Actualizar Ahora -EarthApp.57=Hay una nueva version de Collect Earth disponible\! -EarthApp.58=Alerta para actualizacion -EarthApp.59=Error al importar el archivo del proyecto -EarthApp.5=No recordarme otra vez -EarthApp.61=El archivo KMZ generado por Collect Earth no se pudo abrir.
Asegurese de que Google Earth esta instalado. +CollectEarthWindow.1=Erreur d'exportation +CollectEarthWindow.20=Nombre d'enregistrements dupliqués +CollectEarthWindow.21=Icône non trouvée +CollectEarthWindow.22= Êtes-vous sûr de vouloir fermer CollectEarth
Fermer cette fenêtre fermera aussi le serveur +CollectEarthWindow.23=Confirmation requise +CollectEarthWindow.24=Exporter en XML +CollectEarthWindow.25=Voulez-vous ajouter tout de même ces données et perdre vos enregistrements? +CollectEarthWindow.26=Utilisateur +CollectEarthWindow.27=Appliquer +CollectEarthWindow.28=Le serveur devrait être démarré pour la saisie des données par les utilisateurs. +CollectEarthWindow.29=Le serveur Saiku n'est pas configuré. +CollectEarthWindow.2=Langue +CollectEarthWindow.30=Veuillez garder cette fenêtre active pendant que vous utilisez Google Earth +CollectEarthWindow.31=Exporter les données collectées en CSV +CollectEarthWindow.32=Fermer +CollectEarthWindow.33=Le nom de l'utilisateur doit comprendre entre 5 et 50 caractères +CollectEarthWindow.34=Erreur de validation +CollectEarthWindow.35= NOM DE L'UTILISATEUR VIDE\!
Veuillez renseigner le champs et Appuyer sur "Mise à jour" +CollectEarthWindow.36=Le nom de l'utilisateur ne peut pas être vide +CollectEarthWindow.37=Laisser ouvert +CollectEarthWindow.38=Fichiers CSV +CollectEarthWindow.39=NOTE \: Il est conseillé de sauvegarder vos données (export en XML) avant d'importer de nouvelles données +CollectEarthWindow.3=\ Erreur pendant l'importation +CollectEarthWindow.40=Renseigner le chemin jusqu'au serveur Saiku dans /Outils/Propriétés/Avancé. +CollectEarthWindow.41=Sauvegarde des données exportées dans le fichier\: +CollectEarthWindow.42=Quitter +CollectEarthWindow.43=Enregistrements conflictuels trouvés +CollectEarthWindow.44=Importer/Exporter les données +CollectEarthWindow.45=Exporter les données en XML (zippé) +CollectEarthWindow.46=Importer de nouvelles données depuis ZIP (XML zippé) +CollectEarthWindow.47=Le serveur Saiku n'est pas configuré +CollectEarthWindow.48=Fichier zip/collect-data +CollectEarthWindow.49=Fusion des fichiers CSV +CollectEarthWindow.4=Clause de non-responsabilité de la FAO +CollectEarthWindow.50=Ouvrir le manuel utilisateur +CollectEarthWindow.51=Vérifier les mises à jour des Collect Earth +CollectEarthWindow.52=Fichier de logs Open Application +CollectEarthWindow.53=Fichier de logs Collect Earth +CollectEarthWindow.54=Charger les points de KML +CollectEarthWindow.55=Mettre à jour les enregistrements en utilisant un fichier CSV +CollectEarthWindow.56=A propos... +CollectEarthWindow.57=Le processus de démarrage de Saïku est en cours, veuillez patienter +CollectEarthWindow.58=Impossible de démarrer l'analyse avec Saïku +CollectEarthWindow.59=Voulez-vous régénérer le jeu de données?
Cela peut prendre du temps.
Cliquer sur oui pour régénérer un nouveau jeu de données avec les dernières informations +CollectEarthWindow.5=Fermer +CollectEarthWindow.60=Génération des données Saïku +CollectEarthWindow.61=Exporter en XML (uniquement les enregistrements modifiés/ajoutés) +CollectEarthWindow.62=A propos… +CollectEarthWindow.63=Erreur en accédant aux points de KML +CollectEarthWindow.64=Assistance technique +CollectEarthWindow.65=Le nom de l'opérateur a été changé +CollectEarthWindow.66=Nom de l'opérateur +CollectEarthWindow.67=Ouvrir le dossier de données de CE +CollectEarthWindow.6=Exporter en Table de Fusion +CollectEarthWindow.70=Ouvrez le manuel de cette enquête +CollectEarthWindow.71=Générer un outil Saiku autonome +CollectEarthWindow.7=Erreur pendant l'importation des données +CollectEarthWindow.8=Le texte est introuvable +CollectEarthWindow.9=Les données importées contiennent des redondances avec celles présentes dans la base +DynamicsCode.0= Terre Forestière initialement +DynamicsCode.1= Prairie initialement +DynamicsCode.2= Etablissement initialement +DynamicsCode.3= Autre terre initialement +DynamicsCode.4= Terre humide initialement +DynamicsCode.5= Terre cultivée initialement +EarthApp.11=Collect Earth est déjà en cours d’exécution +EarthApp.21=Le fichier CSV/CED contenant les points est introuvable \:
+EarthApp.23=Aucun fichier CSV/CED spécifié \:

+EarthApp.24=Le fichier contenant le modèle de définition KML est introuvable \:
+EarthApp.26=Aucun modèle de définition spécifié\:

+EarthApp.27=Le fichier contenant le ballon HTML est introuvable \:
+EarthApp.29=Aucun ballon HTML spécifié \:

+EarthApp.30=Veuillez corriger le chemin d’accès dans le menu Outils -> Propriétés. +EarthApp.3=Rappelez le moi plus tard +EarthApp.4=Mettre a jour maintenant +EarthApp.57= Une nouvelle version de Collect Earth est disponible\! Utiliser le Menu +EarthApp.58=Alerte de mise à jour +EarthApp.59=Erreur pendant l’importation du fichier +EarthApp.5=Ne me le rappelez plus +EarthApp.61=Le fichier Collect Earth est introuvable br/>Veuillez-vous assurer que Google Earth est installé. EarthApp.6=\ - Version -EarthApp.70=ATENCION -EarthApp.71=En Mac OS X los archivos de proyectos de Collect Earth (*.cep) no se abren automaticamente al hacer doble-click sobre ellos.
-EarthApp.72=Utiliza la barra de herramientas de Collect Earth para abrir lo archivos .cep \: -EarthApp.73=Collect Earth en ordenadores Mac OS X -EarthSurveyService.9=Campo necesario -ExportActionListener.1=Elija la fecha desde la que exportar los datos -ExportDialogProcessMonitor.0=Procesando datos... -ExportDialogProcessMonitor.1=Esperando a la inicializacion del exportador \: -ExportDialogProcessMonitor.4=Registros exportados \: -ImportActionListener.0=¿Quiere importar los datos de las parcelas que no han sido completamente rellenadas? -ImportActionListener.2=Si hace click en NO se importarán solo los datos de las parcelas en el estado completo (verde)". -ImportActionListener.3=Importar registros incompletos -ImportDialogProcessMonitor.0=\ CALCULANDO -ImportDialogProcessMonitor.11=Cifra inicial the registros \: -ImportDialogProcessMonitor.2=Importando registros... -ImportDialogProcessMonitor.5=Cifra final de registros importados \: -ImportDialogProcessMonitor.8=Procesando datos... -ImportProcessMonitorDialog.0=Registros importados \: -ImportXMLDialogProcessMonitor.1 = Sobreescrivir las parcelas en BBDD -ImportXMLDialogProcessMonitor.2 = Importar solo parcelas sin conflictos -InfiniteProgressMonitor.0=Cancelar operación -JFileChooserExistsAware.0=Archivo de proyecto Collect Earth -KmlImportService.13=Seleccionar archivo CSV donde guardar las posiciones de las parcelas -MissingPlotsListener.0=Error cuando se estaba obteniendo información de las parcelas ausentes de la base de datos -MissingPlotsListener.10=Numero total de parcelas en el diseño de la muestra \: -MissingPlotsListener.12=Numero de parcelas que faltan \: -MissingPlotsListener.14=Todas las parcelas han sido rellenadas\! -MissingPlotsListener.1=Parcelas que faltan -MissingPlotsListener.2=Copiar contenidos -MissingPlotsListener.3=Elija los archivos que contienen informacion sobre las parcelas ( archivos .csv o .ced ) para los que desea averiguar si todos los datos se han rellenado. -MissingPlotsListener.4=Parcelas ausentes – informacion -MissingPlotsListener.5=Del archivo \: -MissingPlotsListener.6=Exportar a archivo CED -NO=No -NO_TO_ALL=No a todo -OpenTextFileListener.0=El archivo de texto no ha sido encontrado en \: -OptionWizard.0=Opciones de Collect Earth -OptionWizard.100=Abrir Planet -OptionWizard.101=Llave de la API de Planet +EarthApp.70=AVERTISSMENT +EarthApp.71=Sous Mac OS X, les fichiers de projet Collect Earth (* .cep) ne s'ouvriront pas dans Collect Earth lorsqu'ils sont double-cliqués.
+EarthApp.72=Utilisez la barre d'outils Collect Earth pour ouvrir les fichiers .cep \: +EarthApp.73=Collect Earth - problèmes sur les ordinateurs Mac OS X +EarthSurveyService.9=Champs requis +ExportActionListener.1=Choisir la date pour les données à exporter +ExportDialogProcessMonitor.0=Chargement des données... +ExportDialogProcessMonitor.1=Attente d'initialisation de l'export +ExportDialogProcessMonitor.4=Enregistrements exportés \: +ImportActionListener.0=Est-ce que les données pour les placettes qui ne sont pas complètes doivent être importées ? +ImportActionListener.2=Si vous cliquez sur NO, seulement les données provenant des placettes avec la marque « verte », qui contiennent toutes les données, seront importées +ImportActionListener.3=Importer les enregistrements incomplets +ImportDialogProcessMonitor.0=Calcul en cours +ImportDialogProcessMonitor.11=Nombre initial d' enregistrements \: +ImportDialogProcessMonitor.2=Chargement des enregistrements... +ImportDialogProcessMonitor.5=Nombre réel d'enregistrements importés\: +ImportDialogProcessMonitor.8=Chargement des données... +ImportProcessMonitorDialog.0=Enregistrements importés \: +ImportXMLDialogProcessMonitor.1 = Écraser les données dans la base de données +ImportXMLDialogProcessMonitor.2 = Importer uniquement des enregistrements non conflictuels +InfiniteProgressMonitor.0=Annuler l’opération +JFileChooserExistsAware.0=Fichier projet Collect Earth +KmlImportService.13=Sélectionnez un fichier CSV pour enregistrer les emplacements des parcelles +MissingPlotsListener.0=Erreur au cours de l’enregistrement des placettes absentes de la base de données +MissingPlotsListener.10=Nombre total de parcelles dans le plan d'échantillonnage \: +MissingPlotsListener.12=Nombre de parcelles manquantes \: +MissingPlotsListener.14=Toutes les parcelles sont remplis\! +MissingPlotsListener.1=Placettes manquantes +MissingPlotsListener.2=Copier le contenu sur le clipboard +MissingPlotsListener.3=Choisir les fichiers qui contiennent les informations des placettes (.csv ou .ced) pour lesquelles vous voulez savoir si toues les placettes ont été renseignées +MissingPlotsListener.4=Placettes manquantes – Information +MissingPlotsListener.5=Depuis le fichier \: +MissingPlotsListener.6=Exporter en CED +NO=Non +NO_TO_ALL=Non à tous +OpenTextFileListener.0=Le fichier texte n'a pas été trouvé dans \: +OptionWizard.0=Options Collect Earth +OptionWizard.100=Ouvrir Planet +OptionWizard.101=Clé API Planet OptionWizard.1021=URL SecureWatch -OptionWizard.102=Abrir Maxar SecureWatch (necesario tener licencia) -OptionWizard.103=Configurar la URL para el Mapa Extra (se abre cuando esta configurada) \: -OptionWizard.104=Navegadores -OptionWizard.105=Abrir Earth Map -OptionWizard.110=Usar las imagenes mensuales de NICFI -OptionWizard.10=Abrir carpeta de copias de seguridad -OptionWizard.11=Desconocido\: usar ipconfig -OptionWizard.12=Instancia cliente -OptionWizard.13=Collect Earth Server IP -OptionWizard.14=Collect Earth Server puerto (e.g. 8023) -OptionWizard.15=Guardar & aplicar cambios +OptionWizard.102=Ouvrir Maxar SecureWatch +OptionWizard.103=Définir le URL pour le Carte Extra (ouvre quand il est réglé) \: +OptionWizard.104=Navigateurs +OptionWizard.105=Ouvrir Earth Map +OptionWizard.110=Utiliser les images mensuelles fournies par NICFI +OptionWizard.10=Montrer les fichiers de sauvegarde +OptionWizard.11=Inconnu \: utiliser ifconfig +OptionWizard.12=Instance client +OptionWizard.13=IP Serveur de Collect Earth +OptionWizard.14=Port Serveur de Collect Earth (e.g. 8023) +OptionWizard.15=Appliquer et sauvegarder les changements OptionWizard.16=ID -OptionWizard.17=X-coord -OptionWizard.18=Y-coord -OptionWizard.19=Elevación -OptionWizard.1=Elija navegador -OptionWizard.20=Los contenidos de Google Earth han cambiado.
Acepte la recarga del contenido cuando Google Earth le pregunte. -OptionWizard.21=Actualizado con éxito -OptionWizard.22=Pendiente -OptionWizard.23=Hubo un error al reabrir los datos en Google Earth -OptionWizard.24=Cancelar -OptionWizard.25=Modo de operación -OptionWizard.26=BBDD servidor -OptionWizard.27=Esta no es una carpeta de un servido Saiku ( el archivo start-saiku.bat no esta presente) -OptionWizard.28=Servidor Saiku no reconocible -OptionWizard.29=BBDD puerto -OptionWizard.2=Tipo de uso (servidor/cliente) -OptionWizard.30=Opciones SQLite -OptionWizard.31=Datos de muestra -OptionWizard.32=Diseño de parcela -OptionWizard.33=Definición de la encuesta -OptionWizard.34=Servicios integrados -OptionWizard.35=Número de puntos de control -OptionWizard.36=Distancia entre los puntos de control (en metros) -OptionWizard.37=Margen con el borde de la parcela (en metros) -OptionWizard.38=El archivo CSV/CED no pudo leerse correctamente.
El formato del archivo de valores separados por comas ha de ser como este \:
-OptionWizard.39=ID,Y-Coordinada,X-Coordinada,Elevacion,pendiente,orientacion -OptionWizard.3=Servidor -OptionWizard.40=Proyectos -OptionWizard.41=Cargar un nuevo archivo de proyecto -OptionWizard.42=Error al cerrar el lector del CSV -OptionWizard.43=Nombre de la encuesta -OptionWizard.44=Guardar copia de seguridad de la base de datos en -OptionWizard.45=Abrir Google Earth Engine Playground (obsoleto) -OptionWizard.46=Abrir Google Earth Engine Timelapse -OptionWizard.47=Abrir Bing Maps -OptionWizard.48=Abrir encuesta en un navegador externo en lugar de Google Earth (recomendado para LINUX) -OptionWizard.49=Ruta del archivo ced/csv con las coordenadas de las parcelas -OptionWizard.4=IP de este ordenador\: -OptionWizard.50=Navegar... -OptionWizard.51=Error al importar el archivos del proyecto -OptionWizard.52=Archivo CSV/CED con coordenadas -OptionWizard.53=Sin puntos -OptionWizard.54=Punto central -OptionWizard.55=Error al importar el directorio del proyecto -OptionWizard.56=Cargar proyecto -OptionWizard.57=Proyectos ya cargados -OptionWizard.58=Abrir GEE Code Editor (requiere accesso como Trusted Tester) -OptionWizard.59=Abrir Here Maps -OptionWizard.5=Collect Earth Server puerto\: -OptionWizard.65=Ruta para la carpeta de Saiku -OptionWizard.66=Navegar... -OptionWizard.67=Ruta del ejecutable de Firefox -OptionWizard.68=Navegar... -OptionWizard.6=Parámetros BD PostgreSQL -OptionWizard.70=Archivos ejecutables -OptionWizard.72=Archivos binarios -OptionWizard.73=Ruta del ejecutable de Chrome -OptionWizard.74=Navegar... -OptionWizard.76=Archivos ejecutables -OptionWizard.78=Archivos binarios -OptionWizard.79=Ruta a la plantilla KML de Freemarker -OptionWizard.7=Nombre de usuario -OptionWizard.80=Navegar... -OptionWizard.82=Plantilla Freemarker -OptionWizard.83=Ruta al formulario HTML -OptionWizard.84=Navegar... -OptionWizard.86=Pagina web HTML -OptionWizard.87=Ruta al XML con la definición del IDM -OptionWizard.88=Navegar... -OptionWizard.8=Password -OptionWizard.90=Definición XML IDM -OptionWizard.91=Servidor (versión para el gerente o para uso autónomo) -OptionWizard.92=Cliente (operador/conectado al servidor) -OptionWizard.93=SQLite (Embebida/basada en un único archivo) +OptionWizard.17=Coord-X +OptionWizard.18=Coord-Y +OptionWizard.19=Altitude +OptionWizard.1=Choisir un navigateur +OptionWizard.20= Le contenu de Google Earth a changé
Veuillez accepter la mise à jour quand GE le demande +OptionWizard.21=Mise à jour réussie +OptionWizard.22=Pente +OptionWizard.23=Il y a eu une erreur pendant la réouverture de Google Earth +OptionWizard.24=Annuler +OptionWizard.25=Mode opération +OptionWizard.26=Hôte pour la BDD +OptionWizard.27=Le dossier n'est pas valide (il manque le fichier start-saiku.bat) +OptionWizard.28=Le dossier Saiku n'est pas reconnu +OptionWizard.29=Port pour la BDD +OptionWizard.2=Flux (serveur/client) +OptionWizard.30=Options SQLite +OptionWizard.31=Points d'échantillonnage +OptionWizard.32=Configuration de la parcelle +OptionWizard.33=Définition de l'enquête +OptionWizard.34=Services intégrés +OptionWizard.35=Nombre de points de contrôle +OptionWizard.36=Distance entre les points de contrôle (en mètres) +OptionWizard.37=Distance au bord de la parcelle (en mètres) +OptionWizard.38=Le Fichier CSV/CED ne peut pas être lu
Le fichier devrait avoir des valeurs séparées par des virgules comme ceci \:
+OptionWizard.39=ID,Coordonnée_Y, Coordonnée_X,altitude,pente,orientation +OptionWizard.3=Instance serveur +OptionWizard.40=Projets +OptionWizard.41=Charger un nouveau fichier projet +OptionWizard.42=Erreur pendant la fermeture du lecteur CSV +OptionWizard.43=Nom de l'enquête +OptionWizard.44=Sauvegarder automatiquement la base dans +OptionWizard.45=Ouvrir Earth Engine Playground (obsolète) +OptionWizard.46=Ouvrir le Timelapse de Google Earth Engine +OptionWizard.47=Ouvrir Bing Maps +OptionWizard.48=Ouvrir le formulaire dans un navigateur plutôt que dans GE (recommandé pour Linux) +OptionWizard.49=Chemin jusqu'au fichier ced/csv avec les données des parcelles +OptionWizard.4=IP actuelle de l'ordinateur +OptionWizard.50=Parcourir +OptionWizard.51=Erreur pendant l'importation du fichier +OptionWizard.52=Fichier CSV/CED uniquement avec des coordonnées +OptionWizard.53=Pas de points +OptionWizard.54=Point central +OptionWizard.55=Erreur pendant l'importation du dossier projet +OptionWizard.56=Charger le projet +OptionWizard.57=Projets chargés précedemment +OptionWizard.58=Ouvrir GEE Code Editor (nécessite un accès restreint Trusted Tester) +OptionWizard.59=Ouvrir Here Maps +OptionWizard.5=Port Serveur Collect Earth \: +OptionWizard.65=Chemin jusqu'au serveur Saiku +OptionWizard.66=Parcourir +OptionWizard.67=Chemin jusqu'à Firefox +OptionWizard.68=Parcourir +OptionWizard.6=Paramètres de la BD PostGreSQL +OptionWizard.70=Fichiers exécutables +OptionWizard.72=Fichiers binaires +OptionWizard.73=Chemin jusqu'à Chrome +OptionWizard.74=Parcourir +OptionWizard.76=Fichiers exécutables +OptionWizard.78=Fichiers binaires +OptionWizard.79=Chemin jusqu'au modèle Freemarker KML +OptionWizard.7=Nom d'utilisateur +OptionWizard.80=Parcourir +OptionWizard.82=Modèle Freemarker +OptionWizard.83=Chemin jusqu'au Ballon HTML +OptionWizard.84=Parcourir +OptionWizard.86=Page web HTML +OptionWizard.87=Chemin jusqu'au fichier XML contenant la définition IDM +OptionWizard.88=Parcourir +OptionWizard.8=Mot de passe +OptionWizard.90=Définition IDM XML +OptionWizard.91=Serveur (version gestionnaire ou autonome) +OptionWizard.92=Client (opérateur/connecté au serveur) +OptionWizard.93=SQLite (Fichier intégré / Unique) OptionWizard.94=PostgreSQL -OptionWizard.95=Lado del punto de sampleo (en metros) -OptionWizard.9=Nombre de la Base de Datos -ProcessMonitorDialog.1=Error de interpretacion en la fila -ProcessMonitorDialog.4=, columnas -ProcessMonitorDialog.5=\ -- valores -SaikuAnalysisListener.0=Si - Actualizar datos de Saiku (proceso de larga duracion) -SaikuAnalysisListener.1=No - Usar los mismos datos de la ultima vez que se usó Saiku -SaikuStarter.1=Iniciando Saiku -SaikuStarter.2=Iniciar Saiku puede tomar varios minutos, espere por favor.\! -SaikuToolExportListener.1=Generación herramienta Saiku -SaikuToolExportListener.2=Generando la herramienta Saiku que incluye la base de datos -SaveEarthDataServlet.0=Sin datos -SaveEarthDataServlet.1=Problemas al guardar los datos en la Base de Datos -SaveEarthDataServlet.2=Los datos se han guardado -SlopeCode.0=Llano (0-5) -YES=Si -YES_TO_ALL=Si a todo \ No newline at end of file +OptionWizard.95=Côté des points d'échantillonnage (en mètres) +OptionWizard.9=Nom de la base +ProcessMonitorDialog.1=Erreur d’interprétation sur numéro de rangée +ProcessMonitorDialog.4=, colonnes +ProcessMonitorDialog.5=\ -- valeures +SaikuAnalysisListener.0=Oui - Rafraichir les données Saiku (processus long) +SaikuAnalysisListener.1=Non - Utiliser la même version des données que la dernière fois que Saiku a été utilisé +SaikuToolExportListener.1=Génération de l'outil Saiku +SaikuToolExportListener.2=Génération de l'outil Saiku avec la base de données actuelle +SaikuStarter.1=Démarrer Saïku +SaikuStarter.2=Démarrer Saïku peut prendre plusieurs minutes, veuillez patienter\! +SaveEarthDataServlet.0=Requête vide +SaveEarthDataServlet.1=Problème lors de la sauvegarde de la base de données +SaveEarthDataServlet.2=Les données ont été sauvées +SlopeCode.0=Plan (0-5) +YES=Oui +YES_TO_ALL=Oui à tous \ No newline at end of file From 00be859f151349e857e9703fdd1d1e1ca7420101 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:21 +0100 Subject: [PATCH 0847/1620] New translations Messages_fr.properties (Portuguese) --- .../earth/app/view/Messages_pt.properties | 497 +++++++++--------- 1 file changed, 249 insertions(+), 248 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index efdb0acb96..5199a9b624 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,254 +1,255 @@ -AboutDialog.19=Problemas al abrir -AboutDialog.5=Para mas informacion visite nuestra web OpenForis.org -AboutDialog.6=Lo sentimos, hemos tenido un problema al intentar abrir el link en su navegador standard. +AboutDialog.19=UN problème est apparu +AboutDialog.5=Pour plus d’infos, visitez notre site web OpenForis.org +AboutDialog.6=Désolé, il y a eu un problème lors de l’ouverture du lien avec votre navigateur par défaut. AboutDialog.8=Ok -AspectCode.0=Norte -AspectCode.1=Noreste -AspectCode.2=Este -AspectCode.3=Sureste -AspectCode.4=Sur -AspectCode.5=Suroeste -AspectCode.6=Oeste -AspectCode.7=Noroeste -CollectEarthMenu.0=Importar archivo CEP -CollectEarthMenu.2=Utilidades -CollectEarthMenu.3=Dividir archivos de parcelas CSV grandes -CollectEarthMenu.4=Exportar datos a XML (desde una fecha especifica hasta este momento) -CollectEarthMenu.5=Exportar a Collect Backup -CollectEarthMenu.6=Exportar datos como Collect Backup (todos los datos) -CollectEarthMenu.7=Exportar datos como Collect Backup (filtrar por atributo ) -CollectEarthWindow.0=Error al intentar exportar los datos a un archivo CSV -CollectEarthWindow.10=Archivo -CollectEarthWindow.11=Cerrar -CollectEarthWindow.12=Herramientas -CollectEarthWindow.13=Descargar datos a CSV (Excel) -CollectEarthWindow.14=Comenzar análisis con Saiku -CollectEarthWindow.15=Propiedades -CollectEarthWindow.16=Ayuda -CollectEarthWindow.17=Declaración -CollectEarthWindow.18=Encontrar parcelas ausentes de la Base de Datos +AspectCode.0=Nord +AspectCode.1=Nord-Est +AspectCode.2=Est +AspectCode.3=Sud-Est +AspectCode.4=Sud +AspectCode.5=Sud-Ouest +AspectCode.6=Ouest +AspectCode.7=Nord-Ouest +CollectEarthMenu.0=Importe le fichier .CEP +CollectEarthMenu.2=Utilitaires +CollectEarthMenu.3=Divise un large tableau CSV en plusieurs parties +CollectEarthMenu.4=Exporte les données en XML (à partir d'une date précise jusqu'à aujourd'hui) +CollectEarthMenu.5=Exporte sur la sauvegarde Collect Backup +CollectEarthMenu.6=Exporte les données en tant que sauvegarde Collect Backup (toutes les données) +CollectEarthMenu.7=Exporte les données en tant que sauvegarde Collect Backup (à partir de) +CollectEarthMenu.8=Exporte les données en XML (filtrer par attribut) +CollectEarthWindow.0=Erreur pendant l'exportation des données en csv +CollectEarthWindow.10=Fichier +CollectEarthWindow.11=Quitter +CollectEarthWindow.12=Outils +CollectEarthWindow.13=Télécharger les données en CSV (Excel) +CollectEarthWindow.14=Démarrer l'analyse avec Saïku +CollectEarthWindow.15=Propriétés +CollectEarthWindow.16=Aide +CollectEarthWindow.17=Avertissement +CollectEarthWindow.18=Trouver les placettes manquantes dans la base de données CollectEarthWindow.19=Collect Earth -CollectEarthWindow.1=Error al exportar -CollectEarthWindow.20=Número de registros repetidos\: -CollectEarthWindow.21=No se pudo encontrar el icono de la ventana principal -CollectEarthWindow.22=¿Seguro que quieres cerrar Collect Earth?
El servidor de Collect Earth terminara al cerrar la ventana -CollectEarthWindow.23=Necesita confirmación -CollectEarthWindow.24=Exportar a XML -CollectEarthWindow.25=¿Quiere importar estos registros de todas formas y perder sus datos actuales? -CollectEarthWindow.26=Operador -CollectEarthWindow.27=Actualizar -CollectEarthWindow.28=El servidor Open Foris Collect Earth debe estar en funcionamiento mientras el operador esta realizando su trabajo. -CollectEarthWindow.29=El servidor Saiku no ha sido configurado. -CollectEarthWindow.2=Idioma -CollectEarthWindow.30=Por favor, mantenga esta ventana abierta mientras este utilizando Google Earth. -CollectEarthWindow.31=Exportar los datos como archivos CSV -CollectEarthWindow.32=Salir -CollectEarthWindow.33=El nombre del operador ha de ser mas largo que cinco caracteres y mas corto que 50 -CollectEarthWindow.34=Error de validación -CollectEarthWindow.35=\!NOMBRE DEL OPERADOR VACIO\!
Rellene el campo del nombre del operador y presione el botón de "Actualizar". -CollectEarthWindow.36=El nombre del operador no puede estar vacío -CollectEarthWindow.37=Conservar abierto -CollectEarthWindow.38=Archivos CSV -CollectEarthWindow.39=ATENCION\: Recomendamos que guarde una copia de seguridad de sus datos actuales (expórtelos a XML) antes de importar los nuevos datos. -CollectEarthWindow.3=\ Error al importar datos -CollectEarthWindow.40=Configure la ruta a la carpeta donde el servidor Saiku ha sido instalado en Herramientas->Propiedades->Avanzadas. -CollectEarthWindow.41=Guardando los datos en el archivo\: -CollectEarthWindow.42=Terminar -CollectEarthWindow.43=Detectados registros repetidos -CollectEarthWindow.44=Importar/Exportar datos -CollectEarthWindow.45=Exportar datos en XML (comprimidos) -CollectEarthWindow.46=Importar nuevos datos desde ZIP (XML comprimidos) -CollectEarthWindow.47=Servidor Saiku no configurado -CollectEarthWindow.48=Archivos zip/collect-data -CollectEarthWindow.49=Archivos Fusion CSV -CollectEarthWindow.4=Exención de responsabilidad de FAO -CollectEarthWindow.50=Abrir Manual de Usuario -CollectEarthWindow.51=Comprobar si hay actualizaciones de Collect Earth -CollectEarthWindow.52=Abrir el archivo de registo de la aplicacion -CollectEarthWindow.53=Archivo de registro de Collect Earth -CollectEarthWindow.54=Cargar puntos desde KML -CollectEarthWindow.55=Actualizar datos ya registrados desde CSV -CollectEarthWindow.56=Mas informacion... -CollectEarthWindow.57=El proceso para comenzar Saiku esta ejecutandose todavia, espere unos minutos. -CollectEarthWindow.58=No se pudo iniciar el analisis con Saiku -CollectEarthWindow.59=¿Quiere volver a generar los datos para el analisis de Saiku?
Este proceso puede tomar varios minutos.
Si hace click en "SI" los datos mas actuales seran generados. -CollectEarthWindow.5=Cerrar -CollectEarthWindow.60=Generación de datos para Saiku -CollectEarthWindow.61=Exportar a XML (solo los registros anadidos/modificados) -CollectEarthWindow.62=Mas informacion.. -CollectEarthWindow.63=Error leyendo los puntos desde el KML -CollectEarthWindow.64=Soporte tecnico -CollectEarthWindow.65=Se ha cambido el nombre del operador -CollectEarthWindow.66=Cambio de operador -CollectEarthWindow.67=Abrir directorio de datos de CE -CollectEarthWindow.6=Exportar datos a Fusion Table -CollectEarthWindow.70=Abrir el manual de esta encuesta -CollectEarthWindow.71=Generar herramienta Saiku independiente -CollectEarthWindow.7=Error al importar los datos -CollectEarthWindow.8=No se pudo encontrar el testo de exención de responsabilidad -CollectEarthWindow.9=Los datos importados contienen registros que ya están presentes en su base de datos -DynamicsCode.0=Inicialmente Bosque -DynamicsCode.1=Inicialmente Pastizal -DynamicsCode.2=Inicialmente Asentamiento -DynamicsCode.3=Inicialmente Otras tierras -DynamicsCode.4=Inicialmente Humedal -DynamicsCode.5=Inicialmente Cultivo -EarthApp.11=Collect Earth ya está ejecutandose -EarthApp.21=El archivo CSV/CED que contiene el diseño de la malla de puntos no se encuentra en la ruta seleccionada \:
-EarthApp.23=No se ha configurado ningun archivo de puntos CSV/CED \:

-EarthApp.24=El archivo que contiene la plantilla de Freemarker con la definicion del KML no se encuntra en la ruta seleccionada \:
-EarthApp.26=No se ha configurado ninguna archivo con la definicion del KML \:

-EarthApp.27=El archivo que contiene el formulario del pop-up en HTMl no se ha encontrado en la ruta seleccionada \:
-EarthApp.29=No se ha configurado ningun HTML de configuracion del pop-up \:

-EarthApp.30=Corrija la localizacion del archivo a traves del menu Herramientas->Propiedades. -EarthApp.3=Recordarme mas tarde -EarthApp.4=Actualizar Ahora -EarthApp.57=Hay una nueva version de Collect Earth disponible\! -EarthApp.58=Alerta para actualizacion -EarthApp.59=Error al importar el archivo del proyecto -EarthApp.5=No recordarme otra vez -EarthApp.61=El archivo KMZ generado por Collect Earth no se pudo abrir.
Asegurese de que Google Earth esta instalado. +CollectEarthWindow.1=Erreur d'exportation +CollectEarthWindow.20=Nombre d'enregistrements dupliqués +CollectEarthWindow.21=Icône non trouvée +CollectEarthWindow.22= Êtes-vous sûr de vouloir fermer CollectEarth
Fermer cette fenêtre fermera aussi le serveur +CollectEarthWindow.23=Confirmation requise +CollectEarthWindow.24=Exporter en XML +CollectEarthWindow.25=Voulez-vous ajouter tout de même ces données et perdre vos enregistrements? +CollectEarthWindow.26=Utilisateur +CollectEarthWindow.27=Appliquer +CollectEarthWindow.28=Le serveur devrait être démarré pour la saisie des données par les utilisateurs. +CollectEarthWindow.29=Le serveur Saiku n'est pas configuré. +CollectEarthWindow.2=Langue +CollectEarthWindow.30=Veuillez garder cette fenêtre active pendant que vous utilisez Google Earth +CollectEarthWindow.31=Exporter les données collectées en CSV +CollectEarthWindow.32=Fermer +CollectEarthWindow.33=Le nom de l'utilisateur doit comprendre entre 5 et 50 caractères +CollectEarthWindow.34=Erreur de validation +CollectEarthWindow.35= NOM DE L'UTILISATEUR VIDE\!
Veuillez renseigner le champs et Appuyer sur "Mise à jour" +CollectEarthWindow.36=Le nom de l'utilisateur ne peut pas être vide +CollectEarthWindow.37=Laisser ouvert +CollectEarthWindow.38=Fichiers CSV +CollectEarthWindow.39=NOTE \: Il est conseillé de sauvegarder vos données (export en XML) avant d'importer de nouvelles données +CollectEarthWindow.3=\ Erreur pendant l'importation +CollectEarthWindow.40=Renseigner le chemin jusqu'au serveur Saiku dans /Outils/Propriétés/Avancé. +CollectEarthWindow.41=Sauvegarde des données exportées dans le fichier\: +CollectEarthWindow.42=Quitter +CollectEarthWindow.43=Enregistrements conflictuels trouvés +CollectEarthWindow.44=Importer/Exporter les données +CollectEarthWindow.45=Exporter les données en XML (zippé) +CollectEarthWindow.46=Importer de nouvelles données depuis ZIP (XML zippé) +CollectEarthWindow.47=Le serveur Saiku n'est pas configuré +CollectEarthWindow.48=Fichier zip/collect-data +CollectEarthWindow.49=Fusion des fichiers CSV +CollectEarthWindow.4=Clause de non-responsabilité de la FAO +CollectEarthWindow.50=Ouvrir le manuel utilisateur +CollectEarthWindow.51=Vérifier les mises à jour des Collect Earth +CollectEarthWindow.52=Fichier de logs Open Application +CollectEarthWindow.53=Fichier de logs Collect Earth +CollectEarthWindow.54=Charger les points de KML +CollectEarthWindow.55=Mettre à jour les enregistrements en utilisant un fichier CSV +CollectEarthWindow.56=A propos... +CollectEarthWindow.57=Le processus de démarrage de Saïku est en cours, veuillez patienter +CollectEarthWindow.58=Impossible de démarrer l'analyse avec Saïku +CollectEarthWindow.59=Voulez-vous régénérer le jeu de données?
Cela peut prendre du temps.
Cliquer sur oui pour régénérer un nouveau jeu de données avec les dernières informations +CollectEarthWindow.5=Fermer +CollectEarthWindow.60=Génération des données Saïku +CollectEarthWindow.61=Exporter en XML (uniquement les enregistrements modifiés/ajoutés) +CollectEarthWindow.62=A propos… +CollectEarthWindow.63=Erreur en accédant aux points de KML +CollectEarthWindow.64=Assistance technique +CollectEarthWindow.65=Le nom de l'opérateur a été changé +CollectEarthWindow.66=Nom de l'opérateur +CollectEarthWindow.67=Ouvrir le dossier de données de CE +CollectEarthWindow.6=Exporter en Table de Fusion +CollectEarthWindow.70=Ouvrez le manuel de cette enquête +CollectEarthWindow.71=Générer un outil Saiku autonome +CollectEarthWindow.7=Erreur pendant l'importation des données +CollectEarthWindow.8=Le texte est introuvable +CollectEarthWindow.9=Les données importées contiennent des redondances avec celles présentes dans la base +DynamicsCode.0= Terre Forestière initialement +DynamicsCode.1= Prairie initialement +DynamicsCode.2= Etablissement initialement +DynamicsCode.3= Autre terre initialement +DynamicsCode.4= Terre humide initialement +DynamicsCode.5= Terre cultivée initialement +EarthApp.11=Collect Earth est déjà en cours d’exécution +EarthApp.21=Le fichier CSV/CED contenant les points est introuvable \:
+EarthApp.23=Aucun fichier CSV/CED spécifié \:

+EarthApp.24=Le fichier contenant le modèle de définition KML est introuvable \:
+EarthApp.26=Aucun modèle de définition spécifié\:

+EarthApp.27=Le fichier contenant le ballon HTML est introuvable \:
+EarthApp.29=Aucun ballon HTML spécifié \:

+EarthApp.30=Veuillez corriger le chemin d’accès dans le menu Outils -> Propriétés. +EarthApp.3=Rappelez le moi plus tard +EarthApp.4=Mettre a jour maintenant +EarthApp.57= Une nouvelle version de Collect Earth est disponible\! Utiliser le Menu +EarthApp.58=Alerte de mise à jour +EarthApp.59=Erreur pendant l’importation du fichier +EarthApp.5=Ne me le rappelez plus +EarthApp.61=Le fichier Collect Earth est introuvable br/>Veuillez-vous assurer que Google Earth est installé. EarthApp.6=\ - Version -EarthApp.70=ATENCION -EarthApp.71=En Mac OS X los archivos de proyectos de Collect Earth (*.cep) no se abren automaticamente al hacer doble-click sobre ellos.
-EarthApp.72=Utiliza la barra de herramientas de Collect Earth para abrir lo archivos .cep \: -EarthApp.73=Collect Earth en ordenadores Mac OS X -EarthSurveyService.9=Campo necesario -ExportActionListener.1=Elija la fecha desde la que exportar los datos -ExportDialogProcessMonitor.0=Procesando datos... -ExportDialogProcessMonitor.1=Esperando a la inicializacion del exportador \: -ExportDialogProcessMonitor.4=Registros exportados \: -ImportActionListener.0=¿Quiere importar los datos de las parcelas que no han sido completamente rellenadas? -ImportActionListener.2=Si hace click en NO se importarán solo los datos de las parcelas en el estado completo (verde)". -ImportActionListener.3=Importar registros incompletos -ImportDialogProcessMonitor.0=\ CALCULANDO -ImportDialogProcessMonitor.11=Cifra inicial the registros \: -ImportDialogProcessMonitor.2=Importando registros... -ImportDialogProcessMonitor.5=Cifra final de registros importados \: -ImportDialogProcessMonitor.8=Procesando datos... -ImportProcessMonitorDialog.0=Registros importados \: -ImportXMLDialogProcessMonitor.1 = Sobreescrivir las parcelas en BBDD -ImportXMLDialogProcessMonitor.2 = Importar solo parcelas sin conflictos -InfiniteProgressMonitor.0=Cancelar operación -JFileChooserExistsAware.0=Archivo de proyecto Collect Earth -KmlImportService.13=Seleccionar archivo CSV donde guardar las posiciones de las parcelas -MissingPlotsListener.0=Error cuando se estaba obteniendo información de las parcelas ausentes de la base de datos -MissingPlotsListener.10=Numero total de parcelas en el diseño de la muestra \: -MissingPlotsListener.12=Numero de parcelas que faltan \: -MissingPlotsListener.14=Todas las parcelas han sido rellenadas\! -MissingPlotsListener.1=Parcelas que faltan -MissingPlotsListener.2=Copiar contenidos -MissingPlotsListener.3=Elija los archivos que contienen informacion sobre las parcelas ( archivos .csv o .ced ) para los que desea averiguar si todos los datos se han rellenado. -MissingPlotsListener.4=Parcelas ausentes – informacion -MissingPlotsListener.5=Del archivo \: -MissingPlotsListener.6=Exportar a archivo CED -NO=No -NO_TO_ALL=No a todo -OpenTextFileListener.0=El archivo de texto no ha sido encontrado en \: -OptionWizard.0=Opciones de Collect Earth -OptionWizard.100=Abrir Planet -OptionWizard.101=Llave de la API de Planet +EarthApp.70=AVERTISSMENT +EarthApp.71=Sous Mac OS X, les fichiers de projet Collect Earth (* .cep) ne s'ouvriront pas dans Collect Earth lorsqu'ils sont double-cliqués.
+EarthApp.72=Utilisez la barre d'outils Collect Earth pour ouvrir les fichiers .cep \: +EarthApp.73=Collect Earth - problèmes sur les ordinateurs Mac OS X +EarthSurveyService.9=Champs requis +ExportActionListener.1=Choisir la date pour les données à exporter +ExportDialogProcessMonitor.0=Chargement des données... +ExportDialogProcessMonitor.1=Attente d'initialisation de l'export +ExportDialogProcessMonitor.4=Enregistrements exportés \: +ImportActionListener.0=Est-ce que les données pour les placettes qui ne sont pas complètes doivent être importées ? +ImportActionListener.2=Si vous cliquez sur NO, seulement les données provenant des placettes avec la marque « verte », qui contiennent toutes les données, seront importées +ImportActionListener.3=Importer les enregistrements incomplets +ImportDialogProcessMonitor.0=Calcul en cours +ImportDialogProcessMonitor.11=Nombre initial d' enregistrements \: +ImportDialogProcessMonitor.2=Chargement des enregistrements... +ImportDialogProcessMonitor.5=Nombre réel d'enregistrements importés\: +ImportDialogProcessMonitor.8=Chargement des données... +ImportProcessMonitorDialog.0=Enregistrements importés \: +ImportXMLDialogProcessMonitor.1 = Écraser les données dans la base de données +ImportXMLDialogProcessMonitor.2 = Importer uniquement des enregistrements non conflictuels +InfiniteProgressMonitor.0=Annuler l’opération +JFileChooserExistsAware.0=Fichier projet Collect Earth +KmlImportService.13=Sélectionnez un fichier CSV pour enregistrer les emplacements des parcelles +MissingPlotsListener.0=Erreur au cours de l’enregistrement des placettes absentes de la base de données +MissingPlotsListener.10=Nombre total de parcelles dans le plan d'échantillonnage \: +MissingPlotsListener.12=Nombre de parcelles manquantes \: +MissingPlotsListener.14=Toutes les parcelles sont remplis\! +MissingPlotsListener.1=Placettes manquantes +MissingPlotsListener.2=Copier le contenu sur le clipboard +MissingPlotsListener.3=Choisir les fichiers qui contiennent les informations des placettes (.csv ou .ced) pour lesquelles vous voulez savoir si toues les placettes ont été renseignées +MissingPlotsListener.4=Placettes manquantes – Information +MissingPlotsListener.5=Depuis le fichier \: +MissingPlotsListener.6=Exporter en CED +NO=Non +NO_TO_ALL=Non à tous +OpenTextFileListener.0=Le fichier texte n'a pas été trouvé dans \: +OptionWizard.0=Options Collect Earth +OptionWizard.100=Ouvrir Planet +OptionWizard.101=Clé API Planet OptionWizard.1021=URL SecureWatch -OptionWizard.102=Abrir Maxar SecureWatch (necesario tener licencia) -OptionWizard.103=Configurar la URL para el Mapa Extra (se abre cuando esta configurada) \: -OptionWizard.104=Navegadores -OptionWizard.105=Abrir Earth Map -OptionWizard.110=Usar las imagenes mensuales de NICFI -OptionWizard.10=Abrir carpeta de copias de seguridad -OptionWizard.11=Desconocido\: usar ipconfig -OptionWizard.12=Instancia cliente -OptionWizard.13=Collect Earth Server IP -OptionWizard.14=Collect Earth Server puerto (e.g. 8023) -OptionWizard.15=Guardar & aplicar cambios +OptionWizard.102=Ouvrir Maxar SecureWatch +OptionWizard.103=Définir le URL pour le Carte Extra (ouvre quand il est réglé) \: +OptionWizard.104=Navigateurs +OptionWizard.105=Ouvrir Earth Map +OptionWizard.110=Utiliser les images mensuelles fournies par NICFI +OptionWizard.10=Montrer les fichiers de sauvegarde +OptionWizard.11=Inconnu \: utiliser ifconfig +OptionWizard.12=Instance client +OptionWizard.13=IP Serveur de Collect Earth +OptionWizard.14=Port Serveur de Collect Earth (e.g. 8023) +OptionWizard.15=Appliquer et sauvegarder les changements OptionWizard.16=ID -OptionWizard.17=X-coord -OptionWizard.18=Y-coord -OptionWizard.19=Elevación -OptionWizard.1=Elija navegador -OptionWizard.20=Los contenidos de Google Earth han cambiado.
Acepte la recarga del contenido cuando Google Earth le pregunte. -OptionWizard.21=Actualizado con éxito -OptionWizard.22=Pendiente -OptionWizard.23=Hubo un error al reabrir los datos en Google Earth -OptionWizard.24=Cancelar -OptionWizard.25=Modo de operación -OptionWizard.26=BBDD servidor -OptionWizard.27=Esta no es una carpeta de un servido Saiku ( el archivo start-saiku.bat no esta presente) -OptionWizard.28=Servidor Saiku no reconocible -OptionWizard.29=BBDD puerto -OptionWizard.2=Tipo de uso (servidor/cliente) -OptionWizard.30=Opciones SQLite -OptionWizard.31=Datos de muestra -OptionWizard.32=Diseño de parcela -OptionWizard.33=Definición de la encuesta -OptionWizard.34=Servicios integrados -OptionWizard.35=Número de puntos de control -OptionWizard.36=Distancia entre los puntos de control (en metros) -OptionWizard.37=Margen con el borde de la parcela (en metros) -OptionWizard.38=El archivo CSV/CED no pudo leerse correctamente.
El formato del archivo de valores separados por comas ha de ser como este \:
-OptionWizard.39=ID,Y-Coordinada,X-Coordinada,Elevacion,pendiente,orientacion -OptionWizard.3=Servidor -OptionWizard.40=Proyectos -OptionWizard.41=Cargar un nuevo archivo de proyecto -OptionWizard.42=Error al cerrar el lector del CSV -OptionWizard.43=Nombre de la encuesta -OptionWizard.44=Guardar copia de seguridad de la base de datos en -OptionWizard.45=Abrir Google Earth Engine Playground (obsoleto) -OptionWizard.46=Abrir Google Earth Engine Timelapse -OptionWizard.47=Abrir Bing Maps -OptionWizard.48=Abrir encuesta en un navegador externo en lugar de Google Earth (recomendado para LINUX) -OptionWizard.49=Ruta del archivo ced/csv con las coordenadas de las parcelas -OptionWizard.4=IP de este ordenador\: -OptionWizard.50=Navegar... -OptionWizard.51=Error al importar el archivos del proyecto -OptionWizard.52=Archivo CSV/CED con coordenadas -OptionWizard.53=Sin puntos -OptionWizard.54=Punto central -OptionWizard.55=Error al importar el directorio del proyecto -OptionWizard.56=Cargar proyecto -OptionWizard.57=Proyectos ya cargados -OptionWizard.58=Abrir GEE Code Editor (requiere accesso como Trusted Tester) -OptionWizard.59=Abrir Here Maps -OptionWizard.5=Collect Earth Server puerto\: -OptionWizard.65=Ruta para la carpeta de Saiku -OptionWizard.66=Navegar... -OptionWizard.67=Ruta del ejecutable de Firefox -OptionWizard.68=Navegar... -OptionWizard.6=Parámetros BD PostgreSQL -OptionWizard.70=Archivos ejecutables -OptionWizard.72=Archivos binarios -OptionWizard.73=Ruta del ejecutable de Chrome -OptionWizard.74=Navegar... -OptionWizard.76=Archivos ejecutables -OptionWizard.78=Archivos binarios -OptionWizard.79=Ruta a la plantilla KML de Freemarker -OptionWizard.7=Nombre de usuario -OptionWizard.80=Navegar... -OptionWizard.82=Plantilla Freemarker -OptionWizard.83=Ruta al formulario HTML -OptionWizard.84=Navegar... -OptionWizard.86=Pagina web HTML -OptionWizard.87=Ruta al XML con la definición del IDM -OptionWizard.88=Navegar... -OptionWizard.8=Password -OptionWizard.90=Definición XML IDM -OptionWizard.91=Servidor (versión para el gerente o para uso autónomo) -OptionWizard.92=Cliente (operador/conectado al servidor) -OptionWizard.93=SQLite (Embebida/basada en un único archivo) +OptionWizard.17=Coord-X +OptionWizard.18=Coord-Y +OptionWizard.19=Altitude +OptionWizard.1=Choisir un navigateur +OptionWizard.20= Le contenu de Google Earth a changé
Veuillez accepter la mise à jour quand GE le demande +OptionWizard.21=Mise à jour réussie +OptionWizard.22=Pente +OptionWizard.23=Il y a eu une erreur pendant la réouverture de Google Earth +OptionWizard.24=Annuler +OptionWizard.25=Mode opération +OptionWizard.26=Hôte pour la BDD +OptionWizard.27=Le dossier n'est pas valide (il manque le fichier start-saiku.bat) +OptionWizard.28=Le dossier Saiku n'est pas reconnu +OptionWizard.29=Port pour la BDD +OptionWizard.2=Flux (serveur/client) +OptionWizard.30=Options SQLite +OptionWizard.31=Points d'échantillonnage +OptionWizard.32=Configuration de la parcelle +OptionWizard.33=Définition de l'enquête +OptionWizard.34=Services intégrés +OptionWizard.35=Nombre de points de contrôle +OptionWizard.36=Distance entre les points de contrôle (en mètres) +OptionWizard.37=Distance au bord de la parcelle (en mètres) +OptionWizard.38=Le Fichier CSV/CED ne peut pas être lu
Le fichier devrait avoir des valeurs séparées par des virgules comme ceci \:
+OptionWizard.39=ID,Coordonnée_Y, Coordonnée_X,altitude,pente,orientation +OptionWizard.3=Instance serveur +OptionWizard.40=Projets +OptionWizard.41=Charger un nouveau fichier projet +OptionWizard.42=Erreur pendant la fermeture du lecteur CSV +OptionWizard.43=Nom de l'enquête +OptionWizard.44=Sauvegarder automatiquement la base dans +OptionWizard.45=Ouvrir Earth Engine Playground (obsolète) +OptionWizard.46=Ouvrir le Timelapse de Google Earth Engine +OptionWizard.47=Ouvrir Bing Maps +OptionWizard.48=Ouvrir le formulaire dans un navigateur plutôt que dans GE (recommandé pour Linux) +OptionWizard.49=Chemin jusqu'au fichier ced/csv avec les données des parcelles +OptionWizard.4=IP actuelle de l'ordinateur +OptionWizard.50=Parcourir +OptionWizard.51=Erreur pendant l'importation du fichier +OptionWizard.52=Fichier CSV/CED uniquement avec des coordonnées +OptionWizard.53=Pas de points +OptionWizard.54=Point central +OptionWizard.55=Erreur pendant l'importation du dossier projet +OptionWizard.56=Charger le projet +OptionWizard.57=Projets chargés précedemment +OptionWizard.58=Ouvrir GEE Code Editor (nécessite un accès restreint Trusted Tester) +OptionWizard.59=Ouvrir Here Maps +OptionWizard.5=Port Serveur Collect Earth \: +OptionWizard.65=Chemin jusqu'au serveur Saiku +OptionWizard.66=Parcourir +OptionWizard.67=Chemin jusqu'à Firefox +OptionWizard.68=Parcourir +OptionWizard.6=Paramètres de la BD PostGreSQL +OptionWizard.70=Fichiers exécutables +OptionWizard.72=Fichiers binaires +OptionWizard.73=Chemin jusqu'à Chrome +OptionWizard.74=Parcourir +OptionWizard.76=Fichiers exécutables +OptionWizard.78=Fichiers binaires +OptionWizard.79=Chemin jusqu'au modèle Freemarker KML +OptionWizard.7=Nom d'utilisateur +OptionWizard.80=Parcourir +OptionWizard.82=Modèle Freemarker +OptionWizard.83=Chemin jusqu'au Ballon HTML +OptionWizard.84=Parcourir +OptionWizard.86=Page web HTML +OptionWizard.87=Chemin jusqu'au fichier XML contenant la définition IDM +OptionWizard.88=Parcourir +OptionWizard.8=Mot de passe +OptionWizard.90=Définition IDM XML +OptionWizard.91=Serveur (version gestionnaire ou autonome) +OptionWizard.92=Client (opérateur/connecté au serveur) +OptionWizard.93=SQLite (Fichier intégré / Unique) OptionWizard.94=PostgreSQL -OptionWizard.95=Lado del punto de sampleo (en metros) -OptionWizard.9=Nombre de la Base de Datos -ProcessMonitorDialog.1=Error de interpretacion en la fila -ProcessMonitorDialog.4=, columnas -ProcessMonitorDialog.5=\ -- valores -SaikuAnalysisListener.0=Si - Actualizar datos de Saiku (proceso de larga duracion) -SaikuAnalysisListener.1=No - Usar los mismos datos de la ultima vez que se usó Saiku -SaikuStarter.1=Iniciando Saiku -SaikuStarter.2=Iniciar Saiku puede tomar varios minutos, espere por favor.\! -SaikuToolExportListener.1=Generación herramienta Saiku -SaikuToolExportListener.2=Generando la herramienta Saiku que incluye la base de datos -SaveEarthDataServlet.0=Sin datos -SaveEarthDataServlet.1=Problemas al guardar los datos en la Base de Datos -SaveEarthDataServlet.2=Los datos se han guardado -SlopeCode.0=Llano (0-5) -YES=Si -YES_TO_ALL=Si a todo \ No newline at end of file +OptionWizard.95=Côté des points d'échantillonnage (en mètres) +OptionWizard.9=Nom de la base +ProcessMonitorDialog.1=Erreur d’interprétation sur numéro de rangée +ProcessMonitorDialog.4=, colonnes +ProcessMonitorDialog.5=\ -- valeures +SaikuAnalysisListener.0=Oui - Rafraichir les données Saiku (processus long) +SaikuAnalysisListener.1=Non - Utiliser la même version des données que la dernière fois que Saiku a été utilisé +SaikuToolExportListener.1=Génération de l'outil Saiku +SaikuToolExportListener.2=Génération de l'outil Saiku avec la base de données actuelle +SaikuStarter.1=Démarrer Saïku +SaikuStarter.2=Démarrer Saïku peut prendre plusieurs minutes, veuillez patienter\! +SaveEarthDataServlet.0=Requête vide +SaveEarthDataServlet.1=Problème lors de la sauvegarde de la base de données +SaveEarthDataServlet.2=Les données ont été sauvées +SlopeCode.0=Plan (0-5) +YES=Oui +YES_TO_ALL=Oui à tous \ No newline at end of file From 07aec0a0096947fb884aff01f668e318651ee77a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:22 +0100 Subject: [PATCH 0848/1620] New translations Messages_fr.properties (English) --- .../earth/app/view/Messages_en.properties | 497 +++++++++--------- 1 file changed, 249 insertions(+), 248 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index efdb0acb96..5199a9b624 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,254 +1,255 @@ -AboutDialog.19=Problemas al abrir -AboutDialog.5=Para mas informacion visite nuestra web OpenForis.org -AboutDialog.6=Lo sentimos, hemos tenido un problema al intentar abrir el link en su navegador standard. +AboutDialog.19=UN problème est apparu +AboutDialog.5=Pour plus d’infos, visitez notre site web OpenForis.org +AboutDialog.6=Désolé, il y a eu un problème lors de l’ouverture du lien avec votre navigateur par défaut. AboutDialog.8=Ok -AspectCode.0=Norte -AspectCode.1=Noreste -AspectCode.2=Este -AspectCode.3=Sureste -AspectCode.4=Sur -AspectCode.5=Suroeste -AspectCode.6=Oeste -AspectCode.7=Noroeste -CollectEarthMenu.0=Importar archivo CEP -CollectEarthMenu.2=Utilidades -CollectEarthMenu.3=Dividir archivos de parcelas CSV grandes -CollectEarthMenu.4=Exportar datos a XML (desde una fecha especifica hasta este momento) -CollectEarthMenu.5=Exportar a Collect Backup -CollectEarthMenu.6=Exportar datos como Collect Backup (todos los datos) -CollectEarthMenu.7=Exportar datos como Collect Backup (filtrar por atributo ) -CollectEarthWindow.0=Error al intentar exportar los datos a un archivo CSV -CollectEarthWindow.10=Archivo -CollectEarthWindow.11=Cerrar -CollectEarthWindow.12=Herramientas -CollectEarthWindow.13=Descargar datos a CSV (Excel) -CollectEarthWindow.14=Comenzar análisis con Saiku -CollectEarthWindow.15=Propiedades -CollectEarthWindow.16=Ayuda -CollectEarthWindow.17=Declaración -CollectEarthWindow.18=Encontrar parcelas ausentes de la Base de Datos +AspectCode.0=Nord +AspectCode.1=Nord-Est +AspectCode.2=Est +AspectCode.3=Sud-Est +AspectCode.4=Sud +AspectCode.5=Sud-Ouest +AspectCode.6=Ouest +AspectCode.7=Nord-Ouest +CollectEarthMenu.0=Importe le fichier .CEP +CollectEarthMenu.2=Utilitaires +CollectEarthMenu.3=Divise un large tableau CSV en plusieurs parties +CollectEarthMenu.4=Exporte les données en XML (à partir d'une date précise jusqu'à aujourd'hui) +CollectEarthMenu.5=Exporte sur la sauvegarde Collect Backup +CollectEarthMenu.6=Exporte les données en tant que sauvegarde Collect Backup (toutes les données) +CollectEarthMenu.7=Exporte les données en tant que sauvegarde Collect Backup (à partir de) +CollectEarthMenu.8=Exporte les données en XML (filtrer par attribut) +CollectEarthWindow.0=Erreur pendant l'exportation des données en csv +CollectEarthWindow.10=Fichier +CollectEarthWindow.11=Quitter +CollectEarthWindow.12=Outils +CollectEarthWindow.13=Télécharger les données en CSV (Excel) +CollectEarthWindow.14=Démarrer l'analyse avec Saïku +CollectEarthWindow.15=Propriétés +CollectEarthWindow.16=Aide +CollectEarthWindow.17=Avertissement +CollectEarthWindow.18=Trouver les placettes manquantes dans la base de données CollectEarthWindow.19=Collect Earth -CollectEarthWindow.1=Error al exportar -CollectEarthWindow.20=Número de registros repetidos\: -CollectEarthWindow.21=No se pudo encontrar el icono de la ventana principal -CollectEarthWindow.22=¿Seguro que quieres cerrar Collect Earth?
El servidor de Collect Earth terminara al cerrar la ventana -CollectEarthWindow.23=Necesita confirmación -CollectEarthWindow.24=Exportar a XML -CollectEarthWindow.25=¿Quiere importar estos registros de todas formas y perder sus datos actuales? -CollectEarthWindow.26=Operador -CollectEarthWindow.27=Actualizar -CollectEarthWindow.28=El servidor Open Foris Collect Earth debe estar en funcionamiento mientras el operador esta realizando su trabajo. -CollectEarthWindow.29=El servidor Saiku no ha sido configurado. -CollectEarthWindow.2=Idioma -CollectEarthWindow.30=Por favor, mantenga esta ventana abierta mientras este utilizando Google Earth. -CollectEarthWindow.31=Exportar los datos como archivos CSV -CollectEarthWindow.32=Salir -CollectEarthWindow.33=El nombre del operador ha de ser mas largo que cinco caracteres y mas corto que 50 -CollectEarthWindow.34=Error de validación -CollectEarthWindow.35=\!NOMBRE DEL OPERADOR VACIO\!
Rellene el campo del nombre del operador y presione el botón de "Actualizar". -CollectEarthWindow.36=El nombre del operador no puede estar vacío -CollectEarthWindow.37=Conservar abierto -CollectEarthWindow.38=Archivos CSV -CollectEarthWindow.39=ATENCION\: Recomendamos que guarde una copia de seguridad de sus datos actuales (expórtelos a XML) antes de importar los nuevos datos. -CollectEarthWindow.3=\ Error al importar datos -CollectEarthWindow.40=Configure la ruta a la carpeta donde el servidor Saiku ha sido instalado en Herramientas->Propiedades->Avanzadas. -CollectEarthWindow.41=Guardando los datos en el archivo\: -CollectEarthWindow.42=Terminar -CollectEarthWindow.43=Detectados registros repetidos -CollectEarthWindow.44=Importar/Exportar datos -CollectEarthWindow.45=Exportar datos en XML (comprimidos) -CollectEarthWindow.46=Importar nuevos datos desde ZIP (XML comprimidos) -CollectEarthWindow.47=Servidor Saiku no configurado -CollectEarthWindow.48=Archivos zip/collect-data -CollectEarthWindow.49=Archivos Fusion CSV -CollectEarthWindow.4=Exención de responsabilidad de FAO -CollectEarthWindow.50=Abrir Manual de Usuario -CollectEarthWindow.51=Comprobar si hay actualizaciones de Collect Earth -CollectEarthWindow.52=Abrir el archivo de registo de la aplicacion -CollectEarthWindow.53=Archivo de registro de Collect Earth -CollectEarthWindow.54=Cargar puntos desde KML -CollectEarthWindow.55=Actualizar datos ya registrados desde CSV -CollectEarthWindow.56=Mas informacion... -CollectEarthWindow.57=El proceso para comenzar Saiku esta ejecutandose todavia, espere unos minutos. -CollectEarthWindow.58=No se pudo iniciar el analisis con Saiku -CollectEarthWindow.59=¿Quiere volver a generar los datos para el analisis de Saiku?
Este proceso puede tomar varios minutos.
Si hace click en "SI" los datos mas actuales seran generados. -CollectEarthWindow.5=Cerrar -CollectEarthWindow.60=Generación de datos para Saiku -CollectEarthWindow.61=Exportar a XML (solo los registros anadidos/modificados) -CollectEarthWindow.62=Mas informacion.. -CollectEarthWindow.63=Error leyendo los puntos desde el KML -CollectEarthWindow.64=Soporte tecnico -CollectEarthWindow.65=Se ha cambido el nombre del operador -CollectEarthWindow.66=Cambio de operador -CollectEarthWindow.67=Abrir directorio de datos de CE -CollectEarthWindow.6=Exportar datos a Fusion Table -CollectEarthWindow.70=Abrir el manual de esta encuesta -CollectEarthWindow.71=Generar herramienta Saiku independiente -CollectEarthWindow.7=Error al importar los datos -CollectEarthWindow.8=No se pudo encontrar el testo de exención de responsabilidad -CollectEarthWindow.9=Los datos importados contienen registros que ya están presentes en su base de datos -DynamicsCode.0=Inicialmente Bosque -DynamicsCode.1=Inicialmente Pastizal -DynamicsCode.2=Inicialmente Asentamiento -DynamicsCode.3=Inicialmente Otras tierras -DynamicsCode.4=Inicialmente Humedal -DynamicsCode.5=Inicialmente Cultivo -EarthApp.11=Collect Earth ya está ejecutandose -EarthApp.21=El archivo CSV/CED que contiene el diseño de la malla de puntos no se encuentra en la ruta seleccionada \:
-EarthApp.23=No se ha configurado ningun archivo de puntos CSV/CED \:

-EarthApp.24=El archivo que contiene la plantilla de Freemarker con la definicion del KML no se encuntra en la ruta seleccionada \:
-EarthApp.26=No se ha configurado ninguna archivo con la definicion del KML \:

-EarthApp.27=El archivo que contiene el formulario del pop-up en HTMl no se ha encontrado en la ruta seleccionada \:
-EarthApp.29=No se ha configurado ningun HTML de configuracion del pop-up \:

-EarthApp.30=Corrija la localizacion del archivo a traves del menu Herramientas->Propiedades. -EarthApp.3=Recordarme mas tarde -EarthApp.4=Actualizar Ahora -EarthApp.57=Hay una nueva version de Collect Earth disponible\! -EarthApp.58=Alerta para actualizacion -EarthApp.59=Error al importar el archivo del proyecto -EarthApp.5=No recordarme otra vez -EarthApp.61=El archivo KMZ generado por Collect Earth no se pudo abrir.
Asegurese de que Google Earth esta instalado. +CollectEarthWindow.1=Erreur d'exportation +CollectEarthWindow.20=Nombre d'enregistrements dupliqués +CollectEarthWindow.21=Icône non trouvée +CollectEarthWindow.22= Êtes-vous sûr de vouloir fermer CollectEarth
Fermer cette fenêtre fermera aussi le serveur +CollectEarthWindow.23=Confirmation requise +CollectEarthWindow.24=Exporter en XML +CollectEarthWindow.25=Voulez-vous ajouter tout de même ces données et perdre vos enregistrements? +CollectEarthWindow.26=Utilisateur +CollectEarthWindow.27=Appliquer +CollectEarthWindow.28=Le serveur devrait être démarré pour la saisie des données par les utilisateurs. +CollectEarthWindow.29=Le serveur Saiku n'est pas configuré. +CollectEarthWindow.2=Langue +CollectEarthWindow.30=Veuillez garder cette fenêtre active pendant que vous utilisez Google Earth +CollectEarthWindow.31=Exporter les données collectées en CSV +CollectEarthWindow.32=Fermer +CollectEarthWindow.33=Le nom de l'utilisateur doit comprendre entre 5 et 50 caractères +CollectEarthWindow.34=Erreur de validation +CollectEarthWindow.35= NOM DE L'UTILISATEUR VIDE\!
Veuillez renseigner le champs et Appuyer sur "Mise à jour" +CollectEarthWindow.36=Le nom de l'utilisateur ne peut pas être vide +CollectEarthWindow.37=Laisser ouvert +CollectEarthWindow.38=Fichiers CSV +CollectEarthWindow.39=NOTE \: Il est conseillé de sauvegarder vos données (export en XML) avant d'importer de nouvelles données +CollectEarthWindow.3=\ Erreur pendant l'importation +CollectEarthWindow.40=Renseigner le chemin jusqu'au serveur Saiku dans /Outils/Propriétés/Avancé. +CollectEarthWindow.41=Sauvegarde des données exportées dans le fichier\: +CollectEarthWindow.42=Quitter +CollectEarthWindow.43=Enregistrements conflictuels trouvés +CollectEarthWindow.44=Importer/Exporter les données +CollectEarthWindow.45=Exporter les données en XML (zippé) +CollectEarthWindow.46=Importer de nouvelles données depuis ZIP (XML zippé) +CollectEarthWindow.47=Le serveur Saiku n'est pas configuré +CollectEarthWindow.48=Fichier zip/collect-data +CollectEarthWindow.49=Fusion des fichiers CSV +CollectEarthWindow.4=Clause de non-responsabilité de la FAO +CollectEarthWindow.50=Ouvrir le manuel utilisateur +CollectEarthWindow.51=Vérifier les mises à jour des Collect Earth +CollectEarthWindow.52=Fichier de logs Open Application +CollectEarthWindow.53=Fichier de logs Collect Earth +CollectEarthWindow.54=Charger les points de KML +CollectEarthWindow.55=Mettre à jour les enregistrements en utilisant un fichier CSV +CollectEarthWindow.56=A propos... +CollectEarthWindow.57=Le processus de démarrage de Saïku est en cours, veuillez patienter +CollectEarthWindow.58=Impossible de démarrer l'analyse avec Saïku +CollectEarthWindow.59=Voulez-vous régénérer le jeu de données?
Cela peut prendre du temps.
Cliquer sur oui pour régénérer un nouveau jeu de données avec les dernières informations +CollectEarthWindow.5=Fermer +CollectEarthWindow.60=Génération des données Saïku +CollectEarthWindow.61=Exporter en XML (uniquement les enregistrements modifiés/ajoutés) +CollectEarthWindow.62=A propos… +CollectEarthWindow.63=Erreur en accédant aux points de KML +CollectEarthWindow.64=Assistance technique +CollectEarthWindow.65=Le nom de l'opérateur a été changé +CollectEarthWindow.66=Nom de l'opérateur +CollectEarthWindow.67=Ouvrir le dossier de données de CE +CollectEarthWindow.6=Exporter en Table de Fusion +CollectEarthWindow.70=Ouvrez le manuel de cette enquête +CollectEarthWindow.71=Générer un outil Saiku autonome +CollectEarthWindow.7=Erreur pendant l'importation des données +CollectEarthWindow.8=Le texte est introuvable +CollectEarthWindow.9=Les données importées contiennent des redondances avec celles présentes dans la base +DynamicsCode.0= Terre Forestière initialement +DynamicsCode.1= Prairie initialement +DynamicsCode.2= Etablissement initialement +DynamicsCode.3= Autre terre initialement +DynamicsCode.4= Terre humide initialement +DynamicsCode.5= Terre cultivée initialement +EarthApp.11=Collect Earth est déjà en cours d’exécution +EarthApp.21=Le fichier CSV/CED contenant les points est introuvable \:
+EarthApp.23=Aucun fichier CSV/CED spécifié \:

+EarthApp.24=Le fichier contenant le modèle de définition KML est introuvable \:
+EarthApp.26=Aucun modèle de définition spécifié\:

+EarthApp.27=Le fichier contenant le ballon HTML est introuvable \:
+EarthApp.29=Aucun ballon HTML spécifié \:

+EarthApp.30=Veuillez corriger le chemin d’accès dans le menu Outils -> Propriétés. +EarthApp.3=Rappelez le moi plus tard +EarthApp.4=Mettre a jour maintenant +EarthApp.57= Une nouvelle version de Collect Earth est disponible\! Utiliser le Menu +EarthApp.58=Alerte de mise à jour +EarthApp.59=Erreur pendant l’importation du fichier +EarthApp.5=Ne me le rappelez plus +EarthApp.61=Le fichier Collect Earth est introuvable br/>Veuillez-vous assurer que Google Earth est installé. EarthApp.6=\ - Version -EarthApp.70=ATENCION -EarthApp.71=En Mac OS X los archivos de proyectos de Collect Earth (*.cep) no se abren automaticamente al hacer doble-click sobre ellos.
-EarthApp.72=Utiliza la barra de herramientas de Collect Earth para abrir lo archivos .cep \: -EarthApp.73=Collect Earth en ordenadores Mac OS X -EarthSurveyService.9=Campo necesario -ExportActionListener.1=Elija la fecha desde la que exportar los datos -ExportDialogProcessMonitor.0=Procesando datos... -ExportDialogProcessMonitor.1=Esperando a la inicializacion del exportador \: -ExportDialogProcessMonitor.4=Registros exportados \: -ImportActionListener.0=¿Quiere importar los datos de las parcelas que no han sido completamente rellenadas? -ImportActionListener.2=Si hace click en NO se importarán solo los datos de las parcelas en el estado completo (verde)". -ImportActionListener.3=Importar registros incompletos -ImportDialogProcessMonitor.0=\ CALCULANDO -ImportDialogProcessMonitor.11=Cifra inicial the registros \: -ImportDialogProcessMonitor.2=Importando registros... -ImportDialogProcessMonitor.5=Cifra final de registros importados \: -ImportDialogProcessMonitor.8=Procesando datos... -ImportProcessMonitorDialog.0=Registros importados \: -ImportXMLDialogProcessMonitor.1 = Sobreescrivir las parcelas en BBDD -ImportXMLDialogProcessMonitor.2 = Importar solo parcelas sin conflictos -InfiniteProgressMonitor.0=Cancelar operación -JFileChooserExistsAware.0=Archivo de proyecto Collect Earth -KmlImportService.13=Seleccionar archivo CSV donde guardar las posiciones de las parcelas -MissingPlotsListener.0=Error cuando se estaba obteniendo información de las parcelas ausentes de la base de datos -MissingPlotsListener.10=Numero total de parcelas en el diseño de la muestra \: -MissingPlotsListener.12=Numero de parcelas que faltan \: -MissingPlotsListener.14=Todas las parcelas han sido rellenadas\! -MissingPlotsListener.1=Parcelas que faltan -MissingPlotsListener.2=Copiar contenidos -MissingPlotsListener.3=Elija los archivos que contienen informacion sobre las parcelas ( archivos .csv o .ced ) para los que desea averiguar si todos los datos se han rellenado. -MissingPlotsListener.4=Parcelas ausentes – informacion -MissingPlotsListener.5=Del archivo \: -MissingPlotsListener.6=Exportar a archivo CED -NO=No -NO_TO_ALL=No a todo -OpenTextFileListener.0=El archivo de texto no ha sido encontrado en \: -OptionWizard.0=Opciones de Collect Earth -OptionWizard.100=Abrir Planet -OptionWizard.101=Llave de la API de Planet +EarthApp.70=AVERTISSMENT +EarthApp.71=Sous Mac OS X, les fichiers de projet Collect Earth (* .cep) ne s'ouvriront pas dans Collect Earth lorsqu'ils sont double-cliqués.
+EarthApp.72=Utilisez la barre d'outils Collect Earth pour ouvrir les fichiers .cep \: +EarthApp.73=Collect Earth - problèmes sur les ordinateurs Mac OS X +EarthSurveyService.9=Champs requis +ExportActionListener.1=Choisir la date pour les données à exporter +ExportDialogProcessMonitor.0=Chargement des données... +ExportDialogProcessMonitor.1=Attente d'initialisation de l'export +ExportDialogProcessMonitor.4=Enregistrements exportés \: +ImportActionListener.0=Est-ce que les données pour les placettes qui ne sont pas complètes doivent être importées ? +ImportActionListener.2=Si vous cliquez sur NO, seulement les données provenant des placettes avec la marque « verte », qui contiennent toutes les données, seront importées +ImportActionListener.3=Importer les enregistrements incomplets +ImportDialogProcessMonitor.0=Calcul en cours +ImportDialogProcessMonitor.11=Nombre initial d' enregistrements \: +ImportDialogProcessMonitor.2=Chargement des enregistrements... +ImportDialogProcessMonitor.5=Nombre réel d'enregistrements importés\: +ImportDialogProcessMonitor.8=Chargement des données... +ImportProcessMonitorDialog.0=Enregistrements importés \: +ImportXMLDialogProcessMonitor.1 = Écraser les données dans la base de données +ImportXMLDialogProcessMonitor.2 = Importer uniquement des enregistrements non conflictuels +InfiniteProgressMonitor.0=Annuler l’opération +JFileChooserExistsAware.0=Fichier projet Collect Earth +KmlImportService.13=Sélectionnez un fichier CSV pour enregistrer les emplacements des parcelles +MissingPlotsListener.0=Erreur au cours de l’enregistrement des placettes absentes de la base de données +MissingPlotsListener.10=Nombre total de parcelles dans le plan d'échantillonnage \: +MissingPlotsListener.12=Nombre de parcelles manquantes \: +MissingPlotsListener.14=Toutes les parcelles sont remplis\! +MissingPlotsListener.1=Placettes manquantes +MissingPlotsListener.2=Copier le contenu sur le clipboard +MissingPlotsListener.3=Choisir les fichiers qui contiennent les informations des placettes (.csv ou .ced) pour lesquelles vous voulez savoir si toues les placettes ont été renseignées +MissingPlotsListener.4=Placettes manquantes – Information +MissingPlotsListener.5=Depuis le fichier \: +MissingPlotsListener.6=Exporter en CED +NO=Non +NO_TO_ALL=Non à tous +OpenTextFileListener.0=Le fichier texte n'a pas été trouvé dans \: +OptionWizard.0=Options Collect Earth +OptionWizard.100=Ouvrir Planet +OptionWizard.101=Clé API Planet OptionWizard.1021=URL SecureWatch -OptionWizard.102=Abrir Maxar SecureWatch (necesario tener licencia) -OptionWizard.103=Configurar la URL para el Mapa Extra (se abre cuando esta configurada) \: -OptionWizard.104=Navegadores -OptionWizard.105=Abrir Earth Map -OptionWizard.110=Usar las imagenes mensuales de NICFI -OptionWizard.10=Abrir carpeta de copias de seguridad -OptionWizard.11=Desconocido\: usar ipconfig -OptionWizard.12=Instancia cliente -OptionWizard.13=Collect Earth Server IP -OptionWizard.14=Collect Earth Server puerto (e.g. 8023) -OptionWizard.15=Guardar & aplicar cambios +OptionWizard.102=Ouvrir Maxar SecureWatch +OptionWizard.103=Définir le URL pour le Carte Extra (ouvre quand il est réglé) \: +OptionWizard.104=Navigateurs +OptionWizard.105=Ouvrir Earth Map +OptionWizard.110=Utiliser les images mensuelles fournies par NICFI +OptionWizard.10=Montrer les fichiers de sauvegarde +OptionWizard.11=Inconnu \: utiliser ifconfig +OptionWizard.12=Instance client +OptionWizard.13=IP Serveur de Collect Earth +OptionWizard.14=Port Serveur de Collect Earth (e.g. 8023) +OptionWizard.15=Appliquer et sauvegarder les changements OptionWizard.16=ID -OptionWizard.17=X-coord -OptionWizard.18=Y-coord -OptionWizard.19=Elevación -OptionWizard.1=Elija navegador -OptionWizard.20=Los contenidos de Google Earth han cambiado.
Acepte la recarga del contenido cuando Google Earth le pregunte. -OptionWizard.21=Actualizado con éxito -OptionWizard.22=Pendiente -OptionWizard.23=Hubo un error al reabrir los datos en Google Earth -OptionWizard.24=Cancelar -OptionWizard.25=Modo de operación -OptionWizard.26=BBDD servidor -OptionWizard.27=Esta no es una carpeta de un servido Saiku ( el archivo start-saiku.bat no esta presente) -OptionWizard.28=Servidor Saiku no reconocible -OptionWizard.29=BBDD puerto -OptionWizard.2=Tipo de uso (servidor/cliente) -OptionWizard.30=Opciones SQLite -OptionWizard.31=Datos de muestra -OptionWizard.32=Diseño de parcela -OptionWizard.33=Definición de la encuesta -OptionWizard.34=Servicios integrados -OptionWizard.35=Número de puntos de control -OptionWizard.36=Distancia entre los puntos de control (en metros) -OptionWizard.37=Margen con el borde de la parcela (en metros) -OptionWizard.38=El archivo CSV/CED no pudo leerse correctamente.
El formato del archivo de valores separados por comas ha de ser como este \:
-OptionWizard.39=ID,Y-Coordinada,X-Coordinada,Elevacion,pendiente,orientacion -OptionWizard.3=Servidor -OptionWizard.40=Proyectos -OptionWizard.41=Cargar un nuevo archivo de proyecto -OptionWizard.42=Error al cerrar el lector del CSV -OptionWizard.43=Nombre de la encuesta -OptionWizard.44=Guardar copia de seguridad de la base de datos en -OptionWizard.45=Abrir Google Earth Engine Playground (obsoleto) -OptionWizard.46=Abrir Google Earth Engine Timelapse -OptionWizard.47=Abrir Bing Maps -OptionWizard.48=Abrir encuesta en un navegador externo en lugar de Google Earth (recomendado para LINUX) -OptionWizard.49=Ruta del archivo ced/csv con las coordenadas de las parcelas -OptionWizard.4=IP de este ordenador\: -OptionWizard.50=Navegar... -OptionWizard.51=Error al importar el archivos del proyecto -OptionWizard.52=Archivo CSV/CED con coordenadas -OptionWizard.53=Sin puntos -OptionWizard.54=Punto central -OptionWizard.55=Error al importar el directorio del proyecto -OptionWizard.56=Cargar proyecto -OptionWizard.57=Proyectos ya cargados -OptionWizard.58=Abrir GEE Code Editor (requiere accesso como Trusted Tester) -OptionWizard.59=Abrir Here Maps -OptionWizard.5=Collect Earth Server puerto\: -OptionWizard.65=Ruta para la carpeta de Saiku -OptionWizard.66=Navegar... -OptionWizard.67=Ruta del ejecutable de Firefox -OptionWizard.68=Navegar... -OptionWizard.6=Parámetros BD PostgreSQL -OptionWizard.70=Archivos ejecutables -OptionWizard.72=Archivos binarios -OptionWizard.73=Ruta del ejecutable de Chrome -OptionWizard.74=Navegar... -OptionWizard.76=Archivos ejecutables -OptionWizard.78=Archivos binarios -OptionWizard.79=Ruta a la plantilla KML de Freemarker -OptionWizard.7=Nombre de usuario -OptionWizard.80=Navegar... -OptionWizard.82=Plantilla Freemarker -OptionWizard.83=Ruta al formulario HTML -OptionWizard.84=Navegar... -OptionWizard.86=Pagina web HTML -OptionWizard.87=Ruta al XML con la definición del IDM -OptionWizard.88=Navegar... -OptionWizard.8=Password -OptionWizard.90=Definición XML IDM -OptionWizard.91=Servidor (versión para el gerente o para uso autónomo) -OptionWizard.92=Cliente (operador/conectado al servidor) -OptionWizard.93=SQLite (Embebida/basada en un único archivo) +OptionWizard.17=Coord-X +OptionWizard.18=Coord-Y +OptionWizard.19=Altitude +OptionWizard.1=Choisir un navigateur +OptionWizard.20= Le contenu de Google Earth a changé
Veuillez accepter la mise à jour quand GE le demande +OptionWizard.21=Mise à jour réussie +OptionWizard.22=Pente +OptionWizard.23=Il y a eu une erreur pendant la réouverture de Google Earth +OptionWizard.24=Annuler +OptionWizard.25=Mode opération +OptionWizard.26=Hôte pour la BDD +OptionWizard.27=Le dossier n'est pas valide (il manque le fichier start-saiku.bat) +OptionWizard.28=Le dossier Saiku n'est pas reconnu +OptionWizard.29=Port pour la BDD +OptionWizard.2=Flux (serveur/client) +OptionWizard.30=Options SQLite +OptionWizard.31=Points d'échantillonnage +OptionWizard.32=Configuration de la parcelle +OptionWizard.33=Définition de l'enquête +OptionWizard.34=Services intégrés +OptionWizard.35=Nombre de points de contrôle +OptionWizard.36=Distance entre les points de contrôle (en mètres) +OptionWizard.37=Distance au bord de la parcelle (en mètres) +OptionWizard.38=Le Fichier CSV/CED ne peut pas être lu
Le fichier devrait avoir des valeurs séparées par des virgules comme ceci \:
+OptionWizard.39=ID,Coordonnée_Y, Coordonnée_X,altitude,pente,orientation +OptionWizard.3=Instance serveur +OptionWizard.40=Projets +OptionWizard.41=Charger un nouveau fichier projet +OptionWizard.42=Erreur pendant la fermeture du lecteur CSV +OptionWizard.43=Nom de l'enquête +OptionWizard.44=Sauvegarder automatiquement la base dans +OptionWizard.45=Ouvrir Earth Engine Playground (obsolète) +OptionWizard.46=Ouvrir le Timelapse de Google Earth Engine +OptionWizard.47=Ouvrir Bing Maps +OptionWizard.48=Ouvrir le formulaire dans un navigateur plutôt que dans GE (recommandé pour Linux) +OptionWizard.49=Chemin jusqu'au fichier ced/csv avec les données des parcelles +OptionWizard.4=IP actuelle de l'ordinateur +OptionWizard.50=Parcourir +OptionWizard.51=Erreur pendant l'importation du fichier +OptionWizard.52=Fichier CSV/CED uniquement avec des coordonnées +OptionWizard.53=Pas de points +OptionWizard.54=Point central +OptionWizard.55=Erreur pendant l'importation du dossier projet +OptionWizard.56=Charger le projet +OptionWizard.57=Projets chargés précedemment +OptionWizard.58=Ouvrir GEE Code Editor (nécessite un accès restreint Trusted Tester) +OptionWizard.59=Ouvrir Here Maps +OptionWizard.5=Port Serveur Collect Earth \: +OptionWizard.65=Chemin jusqu'au serveur Saiku +OptionWizard.66=Parcourir +OptionWizard.67=Chemin jusqu'à Firefox +OptionWizard.68=Parcourir +OptionWizard.6=Paramètres de la BD PostGreSQL +OptionWizard.70=Fichiers exécutables +OptionWizard.72=Fichiers binaires +OptionWizard.73=Chemin jusqu'à Chrome +OptionWizard.74=Parcourir +OptionWizard.76=Fichiers exécutables +OptionWizard.78=Fichiers binaires +OptionWizard.79=Chemin jusqu'au modèle Freemarker KML +OptionWizard.7=Nom d'utilisateur +OptionWizard.80=Parcourir +OptionWizard.82=Modèle Freemarker +OptionWizard.83=Chemin jusqu'au Ballon HTML +OptionWizard.84=Parcourir +OptionWizard.86=Page web HTML +OptionWizard.87=Chemin jusqu'au fichier XML contenant la définition IDM +OptionWizard.88=Parcourir +OptionWizard.8=Mot de passe +OptionWizard.90=Définition IDM XML +OptionWizard.91=Serveur (version gestionnaire ou autonome) +OptionWizard.92=Client (opérateur/connecté au serveur) +OptionWizard.93=SQLite (Fichier intégré / Unique) OptionWizard.94=PostgreSQL -OptionWizard.95=Lado del punto de sampleo (en metros) -OptionWizard.9=Nombre de la Base de Datos -ProcessMonitorDialog.1=Error de interpretacion en la fila -ProcessMonitorDialog.4=, columnas -ProcessMonitorDialog.5=\ -- valores -SaikuAnalysisListener.0=Si - Actualizar datos de Saiku (proceso de larga duracion) -SaikuAnalysisListener.1=No - Usar los mismos datos de la ultima vez que se usó Saiku -SaikuStarter.1=Iniciando Saiku -SaikuStarter.2=Iniciar Saiku puede tomar varios minutos, espere por favor.\! -SaikuToolExportListener.1=Generación herramienta Saiku -SaikuToolExportListener.2=Generando la herramienta Saiku que incluye la base de datos -SaveEarthDataServlet.0=Sin datos -SaveEarthDataServlet.1=Problemas al guardar los datos en la Base de Datos -SaveEarthDataServlet.2=Los datos se han guardado -SlopeCode.0=Llano (0-5) -YES=Si -YES_TO_ALL=Si a todo \ No newline at end of file +OptionWizard.95=Côté des points d'échantillonnage (en mètres) +OptionWizard.9=Nom de la base +ProcessMonitorDialog.1=Erreur d’interprétation sur numéro de rangée +ProcessMonitorDialog.4=, colonnes +ProcessMonitorDialog.5=\ -- valeures +SaikuAnalysisListener.0=Oui - Rafraichir les données Saiku (processus long) +SaikuAnalysisListener.1=Non - Utiliser la même version des données que la dernière fois que Saiku a été utilisé +SaikuToolExportListener.1=Génération de l'outil Saiku +SaikuToolExportListener.2=Génération de l'outil Saiku avec la base de données actuelle +SaikuStarter.1=Démarrer Saïku +SaikuStarter.2=Démarrer Saïku peut prendre plusieurs minutes, veuillez patienter\! +SaveEarthDataServlet.0=Requête vide +SaveEarthDataServlet.1=Problème lors de la sauvegarde de la base de données +SaveEarthDataServlet.2=Les données ont été sauvées +SlopeCode.0=Plan (0-5) +YES=Oui +YES_TO_ALL=Oui à tous \ No newline at end of file From a4290bf0321e8bfbbab7ce7a4b1cfcd9d18a59c0 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:23 +0100 Subject: [PATCH 0849/1620] New translations Messages_hi.properties (Spanish) --- .../earth/app/view/Messages_es.properties | 483 +++++++++--------- 1 file changed, 228 insertions(+), 255 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 5199a9b624..f759c433b0 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,255 +1,228 @@ -AboutDialog.19=UN problème est apparu -AboutDialog.5=Pour plus d’infos, visitez notre site web OpenForis.org -AboutDialog.6=Désolé, il y a eu un problème lors de l’ouverture du lien avec votre navigateur par défaut. -AboutDialog.8=Ok -AspectCode.0=Nord -AspectCode.1=Nord-Est -AspectCode.2=Est -AspectCode.3=Sud-Est -AspectCode.4=Sud -AspectCode.5=Sud-Ouest -AspectCode.6=Ouest -AspectCode.7=Nord-Ouest -CollectEarthMenu.0=Importe le fichier .CEP -CollectEarthMenu.2=Utilitaires -CollectEarthMenu.3=Divise un large tableau CSV en plusieurs parties -CollectEarthMenu.4=Exporte les données en XML (à partir d'une date précise jusqu'à aujourd'hui) -CollectEarthMenu.5=Exporte sur la sauvegarde Collect Backup -CollectEarthMenu.6=Exporte les données en tant que sauvegarde Collect Backup (toutes les données) -CollectEarthMenu.7=Exporte les données en tant que sauvegarde Collect Backup (à partir de) -CollectEarthMenu.8=Exporte les données en XML (filtrer par attribut) -CollectEarthWindow.0=Erreur pendant l'exportation des données en csv -CollectEarthWindow.10=Fichier -CollectEarthWindow.11=Quitter -CollectEarthWindow.12=Outils -CollectEarthWindow.13=Télécharger les données en CSV (Excel) -CollectEarthWindow.14=Démarrer l'analyse avec Saïku -CollectEarthWindow.15=Propriétés -CollectEarthWindow.16=Aide -CollectEarthWindow.17=Avertissement -CollectEarthWindow.18=Trouver les placettes manquantes dans la base de données -CollectEarthWindow.19=Collect Earth -CollectEarthWindow.1=Erreur d'exportation -CollectEarthWindow.20=Nombre d'enregistrements dupliqués -CollectEarthWindow.21=Icône non trouvée -CollectEarthWindow.22= Êtes-vous sûr de vouloir fermer CollectEarth
Fermer cette fenêtre fermera aussi le serveur -CollectEarthWindow.23=Confirmation requise -CollectEarthWindow.24=Exporter en XML -CollectEarthWindow.25=Voulez-vous ajouter tout de même ces données et perdre vos enregistrements? -CollectEarthWindow.26=Utilisateur -CollectEarthWindow.27=Appliquer -CollectEarthWindow.28=Le serveur devrait être démarré pour la saisie des données par les utilisateurs. -CollectEarthWindow.29=Le serveur Saiku n'est pas configuré. -CollectEarthWindow.2=Langue -CollectEarthWindow.30=Veuillez garder cette fenêtre active pendant que vous utilisez Google Earth -CollectEarthWindow.31=Exporter les données collectées en CSV -CollectEarthWindow.32=Fermer -CollectEarthWindow.33=Le nom de l'utilisateur doit comprendre entre 5 et 50 caractères -CollectEarthWindow.34=Erreur de validation -CollectEarthWindow.35= NOM DE L'UTILISATEUR VIDE\!
Veuillez renseigner le champs et Appuyer sur "Mise à jour" -CollectEarthWindow.36=Le nom de l'utilisateur ne peut pas être vide -CollectEarthWindow.37=Laisser ouvert -CollectEarthWindow.38=Fichiers CSV -CollectEarthWindow.39=NOTE \: Il est conseillé de sauvegarder vos données (export en XML) avant d'importer de nouvelles données -CollectEarthWindow.3=\ Erreur pendant l'importation -CollectEarthWindow.40=Renseigner le chemin jusqu'au serveur Saiku dans /Outils/Propriétés/Avancé. -CollectEarthWindow.41=Sauvegarde des données exportées dans le fichier\: -CollectEarthWindow.42=Quitter -CollectEarthWindow.43=Enregistrements conflictuels trouvés -CollectEarthWindow.44=Importer/Exporter les données -CollectEarthWindow.45=Exporter les données en XML (zippé) -CollectEarthWindow.46=Importer de nouvelles données depuis ZIP (XML zippé) -CollectEarthWindow.47=Le serveur Saiku n'est pas configuré -CollectEarthWindow.48=Fichier zip/collect-data -CollectEarthWindow.49=Fusion des fichiers CSV -CollectEarthWindow.4=Clause de non-responsabilité de la FAO -CollectEarthWindow.50=Ouvrir le manuel utilisateur -CollectEarthWindow.51=Vérifier les mises à jour des Collect Earth -CollectEarthWindow.52=Fichier de logs Open Application -CollectEarthWindow.53=Fichier de logs Collect Earth -CollectEarthWindow.54=Charger les points de KML -CollectEarthWindow.55=Mettre à jour les enregistrements en utilisant un fichier CSV -CollectEarthWindow.56=A propos... -CollectEarthWindow.57=Le processus de démarrage de Saïku est en cours, veuillez patienter -CollectEarthWindow.58=Impossible de démarrer l'analyse avec Saïku -CollectEarthWindow.59=Voulez-vous régénérer le jeu de données?
Cela peut prendre du temps.
Cliquer sur oui pour régénérer un nouveau jeu de données avec les dernières informations -CollectEarthWindow.5=Fermer -CollectEarthWindow.60=Génération des données Saïku -CollectEarthWindow.61=Exporter en XML (uniquement les enregistrements modifiés/ajoutés) -CollectEarthWindow.62=A propos… -CollectEarthWindow.63=Erreur en accédant aux points de KML -CollectEarthWindow.64=Assistance technique -CollectEarthWindow.65=Le nom de l'opérateur a été changé -CollectEarthWindow.66=Nom de l'opérateur -CollectEarthWindow.67=Ouvrir le dossier de données de CE -CollectEarthWindow.6=Exporter en Table de Fusion -CollectEarthWindow.70=Ouvrez le manuel de cette enquête -CollectEarthWindow.71=Générer un outil Saiku autonome -CollectEarthWindow.7=Erreur pendant l'importation des données -CollectEarthWindow.8=Le texte est introuvable -CollectEarthWindow.9=Les données importées contiennent des redondances avec celles présentes dans la base -DynamicsCode.0= Terre Forestière initialement -DynamicsCode.1= Prairie initialement -DynamicsCode.2= Etablissement initialement -DynamicsCode.3= Autre terre initialement -DynamicsCode.4= Terre humide initialement -DynamicsCode.5= Terre cultivée initialement -EarthApp.11=Collect Earth est déjà en cours d’exécution -EarthApp.21=Le fichier CSV/CED contenant les points est introuvable \:
-EarthApp.23=Aucun fichier CSV/CED spécifié \:

-EarthApp.24=Le fichier contenant le modèle de définition KML est introuvable \:
-EarthApp.26=Aucun modèle de définition spécifié\:

-EarthApp.27=Le fichier contenant le ballon HTML est introuvable \:
-EarthApp.29=Aucun ballon HTML spécifié \:

-EarthApp.30=Veuillez corriger le chemin d’accès dans le menu Outils -> Propriétés. -EarthApp.3=Rappelez le moi plus tard -EarthApp.4=Mettre a jour maintenant -EarthApp.57= Une nouvelle version de Collect Earth est disponible\! Utiliser le Menu -EarthApp.58=Alerte de mise à jour -EarthApp.59=Erreur pendant l’importation du fichier -EarthApp.5=Ne me le rappelez plus -EarthApp.61=Le fichier Collect Earth est introuvable br/>Veuillez-vous assurer que Google Earth est installé. -EarthApp.6=\ - Version -EarthApp.70=AVERTISSMENT -EarthApp.71=Sous Mac OS X, les fichiers de projet Collect Earth (* .cep) ne s'ouvriront pas dans Collect Earth lorsqu'ils sont double-cliqués.
-EarthApp.72=Utilisez la barre d'outils Collect Earth pour ouvrir les fichiers .cep \: -EarthApp.73=Collect Earth - problèmes sur les ordinateurs Mac OS X -EarthSurveyService.9=Champs requis -ExportActionListener.1=Choisir la date pour les données à exporter -ExportDialogProcessMonitor.0=Chargement des données... -ExportDialogProcessMonitor.1=Attente d'initialisation de l'export -ExportDialogProcessMonitor.4=Enregistrements exportés \: -ImportActionListener.0=Est-ce que les données pour les placettes qui ne sont pas complètes doivent être importées ? -ImportActionListener.2=Si vous cliquez sur NO, seulement les données provenant des placettes avec la marque « verte », qui contiennent toutes les données, seront importées -ImportActionListener.3=Importer les enregistrements incomplets -ImportDialogProcessMonitor.0=Calcul en cours -ImportDialogProcessMonitor.11=Nombre initial d' enregistrements \: -ImportDialogProcessMonitor.2=Chargement des enregistrements... -ImportDialogProcessMonitor.5=Nombre réel d'enregistrements importés\: -ImportDialogProcessMonitor.8=Chargement des données... -ImportProcessMonitorDialog.0=Enregistrements importés \: -ImportXMLDialogProcessMonitor.1 = Écraser les données dans la base de données -ImportXMLDialogProcessMonitor.2 = Importer uniquement des enregistrements non conflictuels -InfiniteProgressMonitor.0=Annuler l’opération -JFileChooserExistsAware.0=Fichier projet Collect Earth -KmlImportService.13=Sélectionnez un fichier CSV pour enregistrer les emplacements des parcelles -MissingPlotsListener.0=Erreur au cours de l’enregistrement des placettes absentes de la base de données -MissingPlotsListener.10=Nombre total de parcelles dans le plan d'échantillonnage \: -MissingPlotsListener.12=Nombre de parcelles manquantes \: -MissingPlotsListener.14=Toutes les parcelles sont remplis\! -MissingPlotsListener.1=Placettes manquantes -MissingPlotsListener.2=Copier le contenu sur le clipboard -MissingPlotsListener.3=Choisir les fichiers qui contiennent les informations des placettes (.csv ou .ced) pour lesquelles vous voulez savoir si toues les placettes ont été renseignées -MissingPlotsListener.4=Placettes manquantes – Information -MissingPlotsListener.5=Depuis le fichier \: -MissingPlotsListener.6=Exporter en CED -NO=Non -NO_TO_ALL=Non à tous -OpenTextFileListener.0=Le fichier texte n'a pas été trouvé dans \: -OptionWizard.0=Options Collect Earth -OptionWizard.100=Ouvrir Planet -OptionWizard.101=Clé API Planet -OptionWizard.1021=URL SecureWatch -OptionWizard.102=Ouvrir Maxar SecureWatch -OptionWizard.103=Définir le URL pour le Carte Extra (ouvre quand il est réglé) \: -OptionWizard.104=Navigateurs -OptionWizard.105=Ouvrir Earth Map -OptionWizard.110=Utiliser les images mensuelles fournies par NICFI -OptionWizard.10=Montrer les fichiers de sauvegarde -OptionWizard.11=Inconnu \: utiliser ifconfig -OptionWizard.12=Instance client -OptionWizard.13=IP Serveur de Collect Earth -OptionWizard.14=Port Serveur de Collect Earth (e.g. 8023) -OptionWizard.15=Appliquer et sauvegarder les changements -OptionWizard.16=ID -OptionWizard.17=Coord-X -OptionWizard.18=Coord-Y -OptionWizard.19=Altitude -OptionWizard.1=Choisir un navigateur -OptionWizard.20= Le contenu de Google Earth a changé
Veuillez accepter la mise à jour quand GE le demande -OptionWizard.21=Mise à jour réussie -OptionWizard.22=Pente -OptionWizard.23=Il y a eu une erreur pendant la réouverture de Google Earth -OptionWizard.24=Annuler -OptionWizard.25=Mode opération -OptionWizard.26=Hôte pour la BDD -OptionWizard.27=Le dossier n'est pas valide (il manque le fichier start-saiku.bat) -OptionWizard.28=Le dossier Saiku n'est pas reconnu -OptionWizard.29=Port pour la BDD -OptionWizard.2=Flux (serveur/client) -OptionWizard.30=Options SQLite -OptionWizard.31=Points d'échantillonnage -OptionWizard.32=Configuration de la parcelle -OptionWizard.33=Définition de l'enquête -OptionWizard.34=Services intégrés -OptionWizard.35=Nombre de points de contrôle -OptionWizard.36=Distance entre les points de contrôle (en mètres) -OptionWizard.37=Distance au bord de la parcelle (en mètres) -OptionWizard.38=Le Fichier CSV/CED ne peut pas être lu
Le fichier devrait avoir des valeurs séparées par des virgules comme ceci \:
-OptionWizard.39=ID,Coordonnée_Y, Coordonnée_X,altitude,pente,orientation -OptionWizard.3=Instance serveur -OptionWizard.40=Projets -OptionWizard.41=Charger un nouveau fichier projet -OptionWizard.42=Erreur pendant la fermeture du lecteur CSV -OptionWizard.43=Nom de l'enquête -OptionWizard.44=Sauvegarder automatiquement la base dans -OptionWizard.45=Ouvrir Earth Engine Playground (obsolète) -OptionWizard.46=Ouvrir le Timelapse de Google Earth Engine -OptionWizard.47=Ouvrir Bing Maps -OptionWizard.48=Ouvrir le formulaire dans un navigateur plutôt que dans GE (recommandé pour Linux) -OptionWizard.49=Chemin jusqu'au fichier ced/csv avec les données des parcelles -OptionWizard.4=IP actuelle de l'ordinateur -OptionWizard.50=Parcourir -OptionWizard.51=Erreur pendant l'importation du fichier -OptionWizard.52=Fichier CSV/CED uniquement avec des coordonnées -OptionWizard.53=Pas de points -OptionWizard.54=Point central -OptionWizard.55=Erreur pendant l'importation du dossier projet -OptionWizard.56=Charger le projet -OptionWizard.57=Projets chargés précedemment -OptionWizard.58=Ouvrir GEE Code Editor (nécessite un accès restreint Trusted Tester) -OptionWizard.59=Ouvrir Here Maps -OptionWizard.5=Port Serveur Collect Earth \: -OptionWizard.65=Chemin jusqu'au serveur Saiku -OptionWizard.66=Parcourir -OptionWizard.67=Chemin jusqu'à Firefox -OptionWizard.68=Parcourir -OptionWizard.6=Paramètres de la BD PostGreSQL -OptionWizard.70=Fichiers exécutables -OptionWizard.72=Fichiers binaires -OptionWizard.73=Chemin jusqu'à Chrome -OptionWizard.74=Parcourir -OptionWizard.76=Fichiers exécutables -OptionWizard.78=Fichiers binaires -OptionWizard.79=Chemin jusqu'au modèle Freemarker KML -OptionWizard.7=Nom d'utilisateur -OptionWizard.80=Parcourir -OptionWizard.82=Modèle Freemarker -OptionWizard.83=Chemin jusqu'au Ballon HTML -OptionWizard.84=Parcourir -OptionWizard.86=Page web HTML -OptionWizard.87=Chemin jusqu'au fichier XML contenant la définition IDM -OptionWizard.88=Parcourir -OptionWizard.8=Mot de passe -OptionWizard.90=Définition IDM XML -OptionWizard.91=Serveur (version gestionnaire ou autonome) -OptionWizard.92=Client (opérateur/connecté au serveur) -OptionWizard.93=SQLite (Fichier intégré / Unique) -OptionWizard.94=PostgreSQL -OptionWizard.95=Côté des points d'échantillonnage (en mètres) -OptionWizard.9=Nom de la base -ProcessMonitorDialog.1=Erreur d’interprétation sur numéro de rangée -ProcessMonitorDialog.4=, colonnes -ProcessMonitorDialog.5=\ -- valeures -SaikuAnalysisListener.0=Oui - Rafraichir les données Saiku (processus long) -SaikuAnalysisListener.1=Non - Utiliser la même version des données que la dernière fois que Saiku a été utilisé -SaikuToolExportListener.1=Génération de l'outil Saiku -SaikuToolExportListener.2=Génération de l'outil Saiku avec la base de données actuelle -SaikuStarter.1=Démarrer Saïku -SaikuStarter.2=Démarrer Saïku peut prendre plusieurs minutes, veuillez patienter\! -SaveEarthDataServlet.0=Requête vide -SaveEarthDataServlet.1=Problème lors de la sauvegarde de la base de données -SaveEarthDataServlet.2=Les données ont été sauvées -SlopeCode.0=Plan (0-5) -YES=Oui -YES_TO_ALL=Oui à tous \ No newline at end of file +AboutDialog.19=कोई समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ +AboutDialog.5=अधिक जानकारी के लिठहमारी वेबसाइट पर जाà¤à¤‚ OpenForis.org +AboutDialog.6=कà¥à¤·à¤®à¤¾ करें, à¤à¤• समसà¥à¤¯à¤¾ आपके सिसà¥à¤Ÿà¤® के मानक बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में इस लिंक को खोलने की कोशिश कर रही है. +AboutDialog.8=ठीक +AspectCode.0=उतà¥à¤¤à¤° दिशा +AspectCode.1=उतà¥à¤¤à¤°-पूरà¥à¤µ दिशा +AspectCode.2=पूरà¥à¤µ दिशा +AspectCode.3=दकà¥à¤·à¤¿à¤£-पूरà¥à¤µ दिशा +AspectCode.4=दकà¥à¤·à¤¿à¤£ दिशा +AspectCode.5=दकà¥à¤·à¤¿à¤£-पशà¥à¤šà¤¿à¤® दिशा +AspectCode.6=पशà¥à¤šà¤¿à¤® दिशा +AspectCode.7=उतà¥à¤¤à¤°-पशà¥à¤šà¤¿à¤® दिशा +CollectEarthWindow.0=तà¥à¤°à¥à¤Ÿà¤¿ जब सीà¤à¤¸à¤µà¥€ फ़ाइल में डेटा निरà¥à¤¯à¤¾à¤¤ करने का पà¥à¤°à¤¯à¤¾à¤¸ +CollectEarthWindow.1=निरà¥à¤¯à¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.10=फ़ाइल +CollectEarthWindow.11=बाहर जाà¤à¤‚ +CollectEarthWindow.12=उपकरण +CollectEarthWindow.13=डेटा सीà¤à¤¸à¤µà¥€ निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.14=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ +CollectEarthWindow.15=गà¥à¤£ +CollectEarthWindow.16=मदद +CollectEarthWindow.17=असà¥à¤µà¥€à¤•रण +CollectEarthWindow.18=डेटाबेस में लापता भूखंडों खोजें +CollectEarthWindow.19=पृथà¥à¤µà¥€ इकटà¥à¤ à¤¾ +CollectEarthWindow.2=भाषा +CollectEarthWindow.20=डà¥à¤ªà¥à¤²à¤¿à¤•ेट रिकॉरà¥à¤¡ की संखà¥à¤¯à¤¾\: +CollectEarthWindow.21=मà¥à¤–à¥à¤¯ फà¥à¤°à¥‡à¤® के लिठआइकन नहीं मिल सकता है +CollectEarthWindow.22=आपको लगता है कि आप à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ बंद करना चाहते हैं? विंडोज बंद करने से, à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° बंद हो जाà¤à¤—ा +CollectEarthWindow.23=पà¥à¤·à¥à¤Ÿà¤¿ की जरूरत है +CollectEarthWindow.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.25=आप वैसे भी इन अभिलेखों को जोड़ना चाहते हैं और अपने वरà¥à¤¤à¤®à¤¾à¤¨ डेटा खोने के लिठकिलक करना चाहते हैं? +CollectEarthWindow.26=ऑपरेटर,पà¥à¤°à¤šà¤¾à¤²à¤• +CollectEarthWindow.27=अदà¥à¤¯à¤¤à¤¨ +CollectEarthWindow.28= औपन फौरिस à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° चल रहा होना चाहिठ, जबभी ऑपरेटर डेटा की वà¥à¤¯à¤¾à¤–à¥à¤¯à¤¾ करें . +CollectEarthWindow.29=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. +CollectEarthWindow.3= आयात संबंधी तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.30=जबभी आप गà¥à¤—ल अरà¥à¤¥ का उपयोग कर रहे हैं, कृपया इस विंडोज को खà¥à¤²à¥€ बनाठरखें. +CollectEarthWindow.31=à¤à¤•तà¥à¤° डेटा सीà¤à¤¸à¤µà¥€ फाइल में भेजें +CollectEarthWindow.32=छोड़ना +CollectEarthWindow.33=ऑपरेटर का नाम के 5 अकà¥à¤·à¤° से बड़ा और 50 अकà¥à¤·à¤° से कम होना चाहिठ+CollectEarthWindow.34=मानà¥à¤¯à¤¤à¤¾ तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.35=ऑपरेटर नाम खाली\!
कृपया ऑपरेटर का नाम भरें और "अदà¥à¤¯à¤¤à¤¨" बटन दबाà¤à¤. +CollectEarthWindow.36=ऑपरेटर नाम रिकà¥à¤¤ नहीं हो सकता +CollectEarthWindow.37=खà¥à¤²à¤¾ रखो +CollectEarthWindow.38=सीà¤à¤¸à¤µà¥€ फ़ाइल +CollectEarthWindow.39=सूचना\: यह सलाह दी जाती है कि आप नठडेटा डालने करने से पहले अपने मौजूदा आंकडों को बैकअप(à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤) कर लें +CollectEarthWindow.4=à¤à¤«à¤à¤“ असà¥à¤µà¥€à¤•रण नोटिस +CollectEarthWindow.40=उस फ़ोलà¥à¤¡à¤° पर जाà¤à¤‚ जहां साà¤à¤•ॠसरà¥à¤µà¤° में सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ किया गया है, फ़ोलà¥à¤¡à¤° का रासà¥à¤¤à¤¾ उपकरण> गà¥à¤£> उनà¥à¤¨à¤¤ टैब. +CollectEarthWindow.41=निरà¥à¤¯à¤¾à¤¤ डेटा को फ़ाइल में बचाया जा रहा है \: +CollectEarthWindow.42=छोड़ना +CollectEarthWindow.43=परसà¥à¤ªà¤° विरोधी रिकॉरà¥à¤¡ पाया +CollectEarthWindow.44=डेटा आयात / निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.45=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ डेटा (संकà¥à¤šà¤¿à¤¤) +CollectEarthWindow.46=ज़िप से नठडेटा आयात करें (संकà¥à¤šà¤¿à¤¤ à¤à¤•à¥à¤¸à¤à¤®à¤à¤²) +CollectEarthWindow.55=सीà¤à¤¸à¤µà¥€ का उपयोग कर मौजूदा रिकॉरà¥à¤¡ को अपडेट करें +CollectEarthWindow.47=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. +CollectEarthWindow.48=ज़िप / à¤à¤•तà¥à¤°-डेटा फ़ाइल +CollectEarthWindow.49=फà¥à¤¯à¥‚जन सीà¤à¤¸à¤µà¥€ फ़ाइल +CollectEarthWindow.5=बंद करे +CollectEarthWindow.50= उपयोगकरà¥à¤¤à¤¾ मैनà¥à¤…ल खोलें +CollectEarthWindow.51=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ के अदà¥à¤¯à¤¤à¤¨ के लिठजाà¤à¤š करें +CollectEarthWindow.52= अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— लॉग फ़ाइल खोलें +CollectEarthWindow.53=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ लॉग फ़ाइल +CollectEarthWindow.54=केà¤à¤®à¤à¤² से लोड अंक +CollectEarthWindow.56=के विषय में... +CollectEarthWindow.57=साà¤à¤•ॠसà¥à¤Ÿà¤¾à¤°à¥à¤Ÿà¤° पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ अभी भी चल रहा है, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें. +CollectEarthWindow.58=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ नहीं कर सकते +CollectEarthWindow.59=आप साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ के लिठडेटा सेट फिर से उतà¥à¤ªà¤¨à¥à¤¨ करने के लिठकरना चाहते हैं?
यह पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ समय लेने वाली हो सकती है.
आप यदि "हाà¤"पर कà¥à¤²à¤¿à¤• करें, तो नवीनतम जानकारी के साथ à¤à¤• नया डाटासेट उतà¥à¤ªà¤¨à¥à¤¨ हो जाà¤à¤—ा. +CollectEarthWindow.6=फà¥à¤¯à¥‚जन टेबल के लिठनिरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.60=साà¤à¤•ॠडेटा उतà¥à¤ªà¤¨à¥à¤¨ +CollectEarthWindow.61=डेटा à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ (पिछले निरà¥à¤¯à¤¾à¤¤ के बाद से संशोधित रिकॉरà¥à¤¡) +CollectEarthWindow.62=के विषय मे... +CollectEarthWindow.63=केà¤à¤®à¤à¤² से अंक पà¥à¤°à¤¾à¤ªà¥à¤¤ करने में तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.64=तकनीकी सहायता +CollectEarthWindow.7=डेटा आयात में तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.8=असà¥à¤µà¥€à¤•रण पाठ नहीं पाया जा सका +CollectEarthWindow.9=डेटा आयात रिकॉरà¥à¤¡ वह है जो कि पहले से ही अपने डेटाबेस पर मौजूद हैं शामिल. +DynamicsCode.0=पà¥à¤°à¤¾à¤°à¤‚भ में वन +DynamicsCode.1=पà¥à¤°à¤¾à¤°à¤‚भ में घास का मैदान, +DynamicsCode.2=पà¥à¤°à¤¾à¤°à¤‚भ में आबादी वाला इलाका +DynamicsCode.3=पà¥à¤°à¤¾à¤°à¤‚भ में बंजर +DynamicsCode.4=पà¥à¤°à¤¾à¤°à¤‚भ में आरà¥à¤¦à¥à¤° भूमि +DynamicsCode.5=पà¥à¤°à¤¾à¤°à¤‚भ में खेत +OpenTextFileListener.0=इस पाठ का फ़ाइल नहीं मिला \: +OptionWizard.0= विकलà¥à¤ª +OptionWizard.1=बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° चà¥à¤¨à¥‡à¤‚ +OptionWizard.10=बैकअप फ़ोलà¥à¤¡à¤° खोलें +OptionWizard.11=अजà¥à¤žà¤¾à¤¤\: उपयोग ifconfig +OptionWizard.12=गà¥à¤°à¤¾à¤¹à¤•ों का उलà¥à¤²à¥‡à¤– +OptionWizard.13=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° आईपी +OptionWizard.14=कतà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ (उदाहरण- 8023) +OptionWizard.15=बचाà¤à¤‚ और परिवरà¥à¤¤à¤¨ लागू करें +OptionWizard.16=आईडी +OptionWizard.17=X- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क +OptionWizard.18=Y- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क +OptionWizard.19=उठान +OptionWizard.2=कारà¥à¤¯à¤ªà¥à¤°à¤µà¤¾à¤¹ (सरà¥à¤µà¤° / गà¥à¤°à¤¾à¤¹à¤•) +OptionWizard.20=गूगल अरà¥à¤¥ अंतरà¥à¤µà¤¸à¥à¤¤à¥ बदल दिया गया है
यदि गà¥à¤—ल अरà¥à¤¥ आप से कहे,अंतरà¥à¤µà¤¸à¥à¤¤à¥ पà¥à¤¨à¤ƒ लोड सà¥à¤µà¥€à¤•ार करें . +OptionWizard.21=अदà¥à¤¯à¤¤à¤¨ सफल +OptionWizard.22=ढाल +OptionWizard.23=गूगल अरà¥à¤¥ डेटा को फिर से खोलने में कोई तà¥à¤°à¥à¤Ÿà¤¿ थी +OptionWizard.24=रदà¥à¤¦ करना +OptionWizard.25=ऑपरेशन मोड +OptionWizard.26=डीबी होसà¥à¤Ÿ +OptionWizard.27=यह à¤à¤• मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ साà¤à¤•ॠफ़ोलà¥à¤¡à¤° नहीं है ( सà¥à¤Ÿà¤¾à¤°à¥à¤Ÿ-साà¤à¤•à¥.batफ़ाइल मौजूद नहीं है) +OptionWizard.28=साà¤à¤•ॠसरà¥à¤µà¤° मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ नहीं +OptionWizard.29=डीबी पोरà¥à¤Ÿ +OptionWizard.3=सरà¥à¤µà¤° आवृतà¥à¤¤à¤¿ +OptionWizard.30=à¤à¤¸à¤•à¥à¤¯à¥ लाइट विकलà¥à¤ª +OptionWizard.31=सेमà¥à¤ªà¤² डेटा +OptionWizard.32=पà¥à¤²à¥‰à¤Ÿ लेआउट +OptionWizard.33=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ परिभाषा +OptionWizard.34=विकसित +OptionWizard.35=सेमà¥à¤ªà¤² अंक की संखà¥à¤¯à¤¾ +OptionWizard.36=सेमà¥à¤ªà¤² बिंदॠके बीच दूरी (मीटर में) +OptionWizard.37=भूखंड की सीमा के साथ मारà¥à¤œà¤¿à¤¨ (मीटर मे) +OptionWizard.38=सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सही ढंग से पढ़ा नहीं जा सकता.
इस फ़ाइल में à¤à¤• अलà¥à¤ªà¤µà¤¿à¤°à¤¾à¤® से अलग मूलà¥à¤¯à¥‹à¤‚ की उमà¥à¤®à¥€à¤¦ है \:
+OptionWizard.39=आईडी, वाई समनà¥à¤µà¤¯, à¤à¤•à¥à¤¸ समनà¥à¤µà¤¯, ऊंचाई, ढाल, पहलू +OptionWizard.4=वरà¥à¤¤à¤®à¤¾à¤¨ कंपà¥à¤¯à¥‚टर आईपी \: +OptionWizard.40=परियोजनाà¤à¤‚ +OptionWizard.41=à¤à¤• नई परियोजना फ़ाइल लोड करें +OptionWizard.42=सीà¤à¤¸à¤µà¥€ पाठक को बंद करते समय तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.43=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ का नाम +OptionWizard.44= सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ बैकअप डेटाबेस +OptionWizard.45=ओपन पृथà¥à¤µà¥€ इंजन ने पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° में जूम किया +OptionWizard.46=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठपृथà¥à¤µà¥€ इंजन टाइमलैपà¥à¤¸ खोलें +OptionWizard.47=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठबिंग मैपà¥à¤¸ खोलें +OptionWizard.48=बजाय गूगल अरà¥à¤¥ के फॉरà¥à¤® à¤à¤• बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° पर खोलें (लिनकà¥à¤¸ के लिठसिफारिश) +OptionWizard.49=भूखंड डेटा के साथ सीईडी / सीà¤à¤¸à¤µà¥€ फाइल भेजने के लिठपथ +OptionWizard.5=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ\: +OptionWizard.50=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.51=परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.52=केवल निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क के साथ सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल +OptionWizard.53=चौकोर +OptionWizard.54=केनà¥à¤¦à¥à¤°à¥€à¤¯ बिनà¥à¤¦à¥ +OptionWizard.55=परियोजना फ़ोलà¥à¤¡à¤° आयात तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.56=लोड परियोजना +OptionWizard.57=पहले से लोड परियोजना +OptionWizard.58= जी ई ई का मैदान खोलें (विशà¥à¤µà¤¸à¤¨à¥€à¤¯ जांचकरà¥à¤¤à¤¾ के उपयोग की आवशà¥à¤¯à¤•ता है) +OptionWizard.59=यहां भूखंड पर केंदà¥à¤°à¤¿à¤¤ मैपà¥à¤¸ खोलें +OptionWizard.6=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² डीबी मापदंड +OptionWizard.65=साà¤à¤•à¥à¤«à¤¼à¥‹à¤²à¥à¤¡à¤° का पथ +OptionWizard.66=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.67=फ़ायरफ़ॉकà¥à¤¸ निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ +OptionWizard.68=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.7=उपयोगकरà¥à¤¤à¤¾ नाम +OptionWizard.70=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों +OptionWizard.72=बाइनरी फ़ाइलें +OptionWizard.73=कà¥à¤°à¥‹à¤® निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ +OptionWizard.74=बà¥à¤°à¤¾à¤‰à¤œ +OptionWizard.76=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों +OptionWizard.78=बाइनरी फ़ाइलें +OptionWizard.79=केà¤à¤®à¤à¤² फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ के लिठपथ +OptionWizard.8=पासवरà¥à¤¡ +OptionWizard.80=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.82=फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ +OptionWizard.83=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ पà¥à¤°à¤ªà¤¤à¥à¤° डिज़ाइन करने के लिठपथ +OptionWizard.84=बà¥à¤°à¤¾à¤‰à¤œ..... +OptionWizard.86=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² वेब पेज +OptionWizard.87=पथ आइडीà¤à¤® परिभाषा के साथ à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठ+OptionWizard.88=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.9=डीबी नाम +OptionWizard.90=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² आइडीà¤à¤® परिभाषा +OptionWizard.91=सरà¥à¤µà¤° (पà¥à¤°à¤¬à¤‚धक संसà¥à¤•रण या खड़े अकेले का उपयोग करें) +OptionWizard.92=कà¥à¤²à¤¾à¤‡à¤‚ट (ऑपरेटर / सरà¥à¤µà¤° से जà¥à¤¡à¤¼à¥‡) +OptionWizard.93=सकà¥à¤¯à¥‚à¤à¤²à¤¾à¤‡à¤Ÿ (à¤à¤‚बेडेड / à¤à¤•ल फाइल आधारित) +OptionWizard.94=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² +OptionWizard.95=सेमà¥à¤ªà¤² डॉटà¥à¤¸ के साइड (मीटर में) +SaikuAnalysisListener.0=हाठ- ताज़ा साà¤à¤•ॠडेटा (लंबी पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾) +SaikuAnalysisListener.1=नहीं - बस साà¤à¤•ॠशà¥à¤°à¥‚ +SaikuStarter.1=साà¤à¤•ॠशà¥à¤°à¥‚ +SaikuStarter.2= साà¤à¤•ॠशà¥à¤°à¥‚ कà¥à¤› मिनट लग सकते हैं, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें\! +SaveEarthDataServlet.0=खाली अनà¥à¤°à¥‹à¤§ +SaveEarthDataServlet.1= डेटाबेस में डेटा बचाते समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ है +SaveEarthDataServlet.2=डेटा बचाया था +SlopeCode.0=समतल (0-5) +EarthApp.11=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ पहले से ही चल रहा है +EarthApp.21=à¤à¤• सीà¤à¤¸à¤µà¥€ / सीईडी के रूप में भूखंडों की गà¥à¤°à¤¿à¤¡ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
+EarthApp.23=कोई सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सेट-अप नहीं किया गया है \:

+EarthApp.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² परिभाषा के साथ फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है \:
+EarthApp.26=कोई à¤à¤•à¥à¤¸à¤à¤®à¤à¤² फ़ाइल परिभाषा सेट अप नहीं किया गया है \:

+EarthApp.27=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ रूप से यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
+EarthApp.29=कोई à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ फ़ाइल सेट-अप नहीं किया गया है \:

+EarthApp.3=मà¥à¤à¥‡ बाद में याद दिलाना +EarthApp.30=उपकरण> गà¥à¤£ मेनू में फ़ाइल सà¥à¤¥à¤¾à¤¨ को ठीक करें . +EarthApp.4=अभी अदà¥à¤¯à¤¤à¤¨ करें +EarthApp.5=मà¥à¤à¥‡ दà¥à¤¬à¤¾à¤°à¤¾ याद मत दिलाना +EarthApp.57=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ का à¤à¤• नया संसà¥à¤•रण उपलबà¥à¤§ है\!
आप कैसे आगे बढ़ना चाहते हैं? +EarthApp.58=अदà¥à¤¯à¤¤à¤¨ चेतावनी +EarthApp.59= परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ +EarthApp.6=\ - संसà¥à¤•रण +EarthApp.61=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ फाइल खà¥à¤² नहीं सकती .
कृपया सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करें कि गूगल अरà¥à¤¥ सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ है. +EarthSurveyService.9=आवशà¥à¤¯à¤• कà¥à¤·à¥‡à¤¤à¥à¤° +ExportActionListener.1= तारीख चूनें जबसे रिकॉरà¥à¤¡ निरà¥à¤¯à¤¾à¤¤ करने है +ExportDialogProcessMonitor.0=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... +ExportDialogProcessMonitor.1=पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ पà¥à¤°à¤¾à¤°à¤‚भ करने के लिठपà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ कर रहा है \: +ExportDialogProcessMonitor.4=निरà¥à¤¯à¤¾à¤¤ रिकॉरà¥à¤¡\: +ImportProcessMonitorDialog.0=आयातित रिकॉरà¥à¤¡ \: +ImportActionListener.0=कà¥à¤¯à¤¾ उन भूखंडों के लिठडेटा जो कि पूरी तरह से भरे नहीं गठ,आयातित किया जाना चाहिà¤? +ImportActionListener.2=आप कà¥à¤²à¤¿à¤• करें, नहींतो केवल डेटा "हरी" राजà¥à¤¯ में भूखंडों से ,जिसमें सभी डेटा यà¥à¤•à¥à¤¤ है , आयात किया जाà¤à¤—ा। +ImportDialogProcessMonitor.0=\ गणना +ImportDialogProcessMonitor.11=रिकॉरà¥à¤¡ की पà¥à¤°à¤¾à¤°à¤‚भिक संखà¥à¤¯à¤¾ \: +ImportDialogProcessMonitor.2=रिकॉरà¥à¤¡ आयात... +ImportDialogProcessMonitor.5=आयातित रिकॉरà¥à¤¡ की वासà¥à¤¤à¤µà¤¿à¤• संखà¥à¤¯à¤¾ \: +ImportDialogProcessMonitor.8=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... +InfiniteProgressMonitor.0=रदà¥à¤¦ ऑपरेशन +JFileChooserExistsAware.0=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ परियोजना फ़ाइल +KmlImportService.13=पà¥à¤²à¥‰à¤Ÿ सà¥à¤¥à¤¾à¤¨à¥‹à¤‚ को बचाने के लिठà¤à¤• सीà¤à¤¸à¤µà¥€ फ़ाइल का चयन करें +MissingPlotsListener.0=तà¥à¤°à¥à¤Ÿà¤¿ उन भूखंडों के बारे में जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ करने के लिठजो डेटाबेस पर मौजूद नहीं +MissingPlotsListener.1=गà¥à¤® भूखंड +MissingPlotsListener.10=सेमà¥à¤ªà¤² डिजाइन में भूखंडों की कà¥à¤² संखà¥à¤¯à¤¾ \: +MissingPlotsListener.12=गà¥à¤® भूखंडों की संखà¥à¤¯à¤¾ \: +MissingPlotsListener.14=सभी भूखंडों भर रहे हैं\! +MissingPlotsListener.2=कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ अंतरà¥à¤µà¤¸à¥à¤¤à¥ की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ +MissingPlotsListener.3=भूखंड की जानकारी वाले फ़ाइलें चà¥à¤¨à¥‡à¤‚ ( .सीà¤à¤¸à¤µà¥€ या .सीईडी फ़ाइलें ) जिसके लिठआप जानना चाहते हैं तो सभी डेटा भर दिया गया है चाहता हूà¤. +MissingPlotsListener.4=गà¥à¤® भूखंड- जानकारी +MissingPlotsListener.5=फ़ाइल से \: +MissingPlotsListener.6=सीà¤à¤¡à¥€ फ़ाइल में निरà¥à¤¯à¤¾à¤¤ करें +ProcessMonitorDialog.1=पंकà¥à¤¤à¤¿ संखà¥à¤¯à¤¾ पर तà¥à¤°à¥à¤Ÿà¤¿ +ProcessMonitorDialog.4=, कॉलम +ProcessMonitorDialog.5=\ --मूलà¥à¤¯ +YES= हां +YES_TO_ALL=सब को हां +NO=नहीं +NO_TO_ALL=सभी को नहीं + + + From d5933712dcf780f0365c38b7830eea75e592afd2 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:24 +0100 Subject: [PATCH 0850/1620] New translations Messages_pt.properties (French) --- .../earth/app/view/Messages_fr.properties | 500 +++++++++--------- 1 file changed, 250 insertions(+), 250 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 5199a9b624..c2ce51b7bd 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,255 +1,255 @@ -AboutDialog.19=UN problème est apparu -AboutDialog.5=Pour plus d’infos, visitez notre site web OpenForis.org -AboutDialog.6=Désolé, il y a eu un problème lors de l’ouverture du lien avec votre navigateur par défaut. +AboutDialog.19=Ocorreu um problema +AboutDialog.5=Para mais informações visite nosso site OpenForis.org +AboutDialog.6=Desculpe, um problema ocorreu ao tentar abrir esse link no seu navegador padrão. AboutDialog.8=Ok -AspectCode.0=Nord -AspectCode.1=Nord-Est -AspectCode.2=Est -AspectCode.3=Sud-Est -AspectCode.4=Sud -AspectCode.5=Sud-Ouest -AspectCode.6=Ouest -AspectCode.7=Nord-Ouest -CollectEarthMenu.0=Importe le fichier .CEP -CollectEarthMenu.2=Utilitaires -CollectEarthMenu.3=Divise un large tableau CSV en plusieurs parties -CollectEarthMenu.4=Exporte les données en XML (à partir d'une date précise jusqu'à aujourd'hui) -CollectEarthMenu.5=Exporte sur la sauvegarde Collect Backup -CollectEarthMenu.6=Exporte les données en tant que sauvegarde Collect Backup (toutes les données) -CollectEarthMenu.7=Exporte les données en tant que sauvegarde Collect Backup (à partir de) -CollectEarthMenu.8=Exporte les données en XML (filtrer par attribut) -CollectEarthWindow.0=Erreur pendant l'exportation des données en csv -CollectEarthWindow.10=Fichier -CollectEarthWindow.11=Quitter -CollectEarthWindow.12=Outils -CollectEarthWindow.13=Télécharger les données en CSV (Excel) -CollectEarthWindow.14=Démarrer l'analyse avec Saïku -CollectEarthWindow.15=Propriétés -CollectEarthWindow.16=Aide -CollectEarthWindow.17=Avertissement -CollectEarthWindow.18=Trouver les placettes manquantes dans la base de données +AspectCode.0=Norte +AspectCode.1=Nordeste +AspectCode.2=Leste +AspectCode.3=Sudeste +AspectCode.4=Sul +AspectCode.5=Sudoeste +AspectCode.6=Oeste +AspectCode.7=Noroeste +CollectEarthMenu.0=Importar Arquivo CEP +CollectEarthMenu.2=Utilidades +CollectEarthMenu.3=Separar arquivo CSV em partes +CollectEarthMenu.4=Exportar dados para XML (da data específica até o tempo presente) +CollectEarthMenu.5=Exportar para Collect Backup +CollectEarthMenu.6=Exportar dados como Collect Backup (todos os dados) +CollectEarthMenu.7=Exportar dados como Collect Backup (a partir de uma data) +CollectEarthMenu.8=Exportar dados para XML (filtrar por atributo) +CollectEarthWindow.0=Erro ao tentar exportar os dados para um arquivo CSV +CollectEarthWindow.10=Arquivo +CollectEarthWindow.11=Fechar +CollectEarthWindow.12=Ferramentas +CollectEarthWindow.13=Baixar dados para CSV (Excel) +CollectEarthWindow.14=Iniciar Análise SAIKU +CollectEarthWindow.15=Propiedades +CollectEarthWindow.16=Ajuda +CollectEarthWindow.17=Declaração +CollectEarthWindow.18=Encontrar parcelas ausentes em banco de dados CollectEarthWindow.19=Collect Earth -CollectEarthWindow.1=Erreur d'exportation -CollectEarthWindow.20=Nombre d'enregistrements dupliqués -CollectEarthWindow.21=Icône non trouvée -CollectEarthWindow.22= Êtes-vous sûr de vouloir fermer CollectEarth
Fermer cette fenêtre fermera aussi le serveur -CollectEarthWindow.23=Confirmation requise -CollectEarthWindow.24=Exporter en XML -CollectEarthWindow.25=Voulez-vous ajouter tout de même ces données et perdre vos enregistrements? -CollectEarthWindow.26=Utilisateur -CollectEarthWindow.27=Appliquer -CollectEarthWindow.28=Le serveur devrait être démarré pour la saisie des données par les utilisateurs. -CollectEarthWindow.29=Le serveur Saiku n'est pas configuré. -CollectEarthWindow.2=Langue -CollectEarthWindow.30=Veuillez garder cette fenêtre active pendant que vous utilisez Google Earth -CollectEarthWindow.31=Exporter les données collectées en CSV -CollectEarthWindow.32=Fermer -CollectEarthWindow.33=Le nom de l'utilisateur doit comprendre entre 5 et 50 caractères -CollectEarthWindow.34=Erreur de validation -CollectEarthWindow.35= NOM DE L'UTILISATEUR VIDE\!
Veuillez renseigner le champs et Appuyer sur "Mise à jour" -CollectEarthWindow.36=Le nom de l'utilisateur ne peut pas être vide -CollectEarthWindow.37=Laisser ouvert -CollectEarthWindow.38=Fichiers CSV -CollectEarthWindow.39=NOTE \: Il est conseillé de sauvegarder vos données (export en XML) avant d'importer de nouvelles données -CollectEarthWindow.3=\ Erreur pendant l'importation -CollectEarthWindow.40=Renseigner le chemin jusqu'au serveur Saiku dans /Outils/Propriétés/Avancé. -CollectEarthWindow.41=Sauvegarde des données exportées dans le fichier\: -CollectEarthWindow.42=Quitter -CollectEarthWindow.43=Enregistrements conflictuels trouvés -CollectEarthWindow.44=Importer/Exporter les données -CollectEarthWindow.45=Exporter les données en XML (zippé) -CollectEarthWindow.46=Importer de nouvelles données depuis ZIP (XML zippé) -CollectEarthWindow.47=Le serveur Saiku n'est pas configuré -CollectEarthWindow.48=Fichier zip/collect-data -CollectEarthWindow.49=Fusion des fichiers CSV -CollectEarthWindow.4=Clause de non-responsabilité de la FAO -CollectEarthWindow.50=Ouvrir le manuel utilisateur -CollectEarthWindow.51=Vérifier les mises à jour des Collect Earth -CollectEarthWindow.52=Fichier de logs Open Application -CollectEarthWindow.53=Fichier de logs Collect Earth -CollectEarthWindow.54=Charger les points de KML -CollectEarthWindow.55=Mettre à jour les enregistrements en utilisant un fichier CSV -CollectEarthWindow.56=A propos... -CollectEarthWindow.57=Le processus de démarrage de Saïku est en cours, veuillez patienter -CollectEarthWindow.58=Impossible de démarrer l'analyse avec Saïku -CollectEarthWindow.59=Voulez-vous régénérer le jeu de données?
Cela peut prendre du temps.
Cliquer sur oui pour régénérer un nouveau jeu de données avec les dernières informations -CollectEarthWindow.5=Fermer -CollectEarthWindow.60=Génération des données Saïku -CollectEarthWindow.61=Exporter en XML (uniquement les enregistrements modifiés/ajoutés) -CollectEarthWindow.62=A propos… -CollectEarthWindow.63=Erreur en accédant aux points de KML -CollectEarthWindow.64=Assistance technique -CollectEarthWindow.65=Le nom de l'opérateur a été changé -CollectEarthWindow.66=Nom de l'opérateur -CollectEarthWindow.67=Ouvrir le dossier de données de CE -CollectEarthWindow.6=Exporter en Table de Fusion -CollectEarthWindow.70=Ouvrez le manuel de cette enquête -CollectEarthWindow.71=Générer un outil Saiku autonome -CollectEarthWindow.7=Erreur pendant l'importation des données -CollectEarthWindow.8=Le texte est introuvable -CollectEarthWindow.9=Les données importées contiennent des redondances avec celles présentes dans la base -DynamicsCode.0= Terre Forestière initialement -DynamicsCode.1= Prairie initialement -DynamicsCode.2= Etablissement initialement -DynamicsCode.3= Autre terre initialement -DynamicsCode.4= Terre humide initialement -DynamicsCode.5= Terre cultivée initialement -EarthApp.11=Collect Earth est déjà en cours d’exécution -EarthApp.21=Le fichier CSV/CED contenant les points est introuvable \:
-EarthApp.23=Aucun fichier CSV/CED spécifié \:

-EarthApp.24=Le fichier contenant le modèle de définition KML est introuvable \:
-EarthApp.26=Aucun modèle de définition spécifié\:

-EarthApp.27=Le fichier contenant le ballon HTML est introuvable \:
-EarthApp.29=Aucun ballon HTML spécifié \:

-EarthApp.30=Veuillez corriger le chemin d’accès dans le menu Outils -> Propriétés. -EarthApp.3=Rappelez le moi plus tard -EarthApp.4=Mettre a jour maintenant -EarthApp.57= Une nouvelle version de Collect Earth est disponible\! Utiliser le Menu -EarthApp.58=Alerte de mise à jour -EarthApp.59=Erreur pendant l’importation du fichier -EarthApp.5=Ne me le rappelez plus -EarthApp.61=Le fichier Collect Earth est introuvable br/>Veuillez-vous assurer que Google Earth est installé. -EarthApp.6=\ - Version -EarthApp.70=AVERTISSMENT -EarthApp.71=Sous Mac OS X, les fichiers de projet Collect Earth (* .cep) ne s'ouvriront pas dans Collect Earth lorsqu'ils sont double-cliqués.
-EarthApp.72=Utilisez la barre d'outils Collect Earth pour ouvrir les fichiers .cep \: -EarthApp.73=Collect Earth - problèmes sur les ordinateurs Mac OS X -EarthSurveyService.9=Champs requis -ExportActionListener.1=Choisir la date pour les données à exporter -ExportDialogProcessMonitor.0=Chargement des données... -ExportDialogProcessMonitor.1=Attente d'initialisation de l'export -ExportDialogProcessMonitor.4=Enregistrements exportés \: -ImportActionListener.0=Est-ce que les données pour les placettes qui ne sont pas complètes doivent être importées ? -ImportActionListener.2=Si vous cliquez sur NO, seulement les données provenant des placettes avec la marque « verte », qui contiennent toutes les données, seront importées -ImportActionListener.3=Importer les enregistrements incomplets -ImportDialogProcessMonitor.0=Calcul en cours -ImportDialogProcessMonitor.11=Nombre initial d' enregistrements \: -ImportDialogProcessMonitor.2=Chargement des enregistrements... -ImportDialogProcessMonitor.5=Nombre réel d'enregistrements importés\: -ImportDialogProcessMonitor.8=Chargement des données... -ImportProcessMonitorDialog.0=Enregistrements importés \: -ImportXMLDialogProcessMonitor.1 = Écraser les données dans la base de données -ImportXMLDialogProcessMonitor.2 = Importer uniquement des enregistrements non conflictuels -InfiniteProgressMonitor.0=Annuler l’opération -JFileChooserExistsAware.0=Fichier projet Collect Earth -KmlImportService.13=Sélectionnez un fichier CSV pour enregistrer les emplacements des parcelles -MissingPlotsListener.0=Erreur au cours de l’enregistrement des placettes absentes de la base de données -MissingPlotsListener.10=Nombre total de parcelles dans le plan d'échantillonnage \: -MissingPlotsListener.12=Nombre de parcelles manquantes \: -MissingPlotsListener.14=Toutes les parcelles sont remplis\! -MissingPlotsListener.1=Placettes manquantes -MissingPlotsListener.2=Copier le contenu sur le clipboard -MissingPlotsListener.3=Choisir les fichiers qui contiennent les informations des placettes (.csv ou .ced) pour lesquelles vous voulez savoir si toues les placettes ont été renseignées -MissingPlotsListener.4=Placettes manquantes – Information -MissingPlotsListener.5=Depuis le fichier \: -MissingPlotsListener.6=Exporter en CED -NO=Non -NO_TO_ALL=Non à tous -OpenTextFileListener.0=Le fichier texte n'a pas été trouvé dans \: -OptionWizard.0=Options Collect Earth -OptionWizard.100=Ouvrir Planet -OptionWizard.101=Clé API Planet +CollectEarthWindow.1=Erro ao exportar +CollectEarthWindow.20=Número de registros duplicados\: +CollectEarthWindow.21=Não foi possível encontrar o ícone para a janela principal +CollectEarthWindow.22=Tem certeza de querer fechar Collect Earth?
Ao fechar a janela será fechada também o servidor de Collect Earth +CollectEarthWindow.23=Confirmação requerida +CollectEarthWindow.24=Exportar a XML +CollectEarthWindow.25=Quer importar estes registros de qualquer maneira e perder o seus dados atuais? +CollectEarthWindow.26=Operador +CollectEarthWindow.27=Atualizar +CollectEarthWindow.28=O servidor Open Foris Collect Earth deve estar em execução enquanto o operador interprete os dados. +CollectEarthWindow.29=O servidor Saiku não está configurado. +CollectEarthWindow.2=Idioma +CollectEarthWindow.30=Por favor mantenha esta janela aberta enquanto estiver usando o Google Earth. +CollectEarthWindow.31=Exportar os dados coletados para um arquivo CSV +CollectEarthWindow.32=Fechar +CollectEarthWindow.33=O nome do operador deve ser maior de que 5 caracteres e mais curto do que 50 +CollectEarthWindow.34= Erro de Validação +CollectEarthWindow.35=NOME DO OPERADOR VAZIO\!
Preencha o nome do operador e clique no botão "Atualizar". +CollectEarthWindow.36=Nome do operador não pode estar vazio +CollectEarthWindow.37=Permanecer Aberto +CollectEarthWindow.38=Arquivos de CSV +CollectEarthWindow.39=AVISO\:Se recomenda de fazer um back-up dos seus dados atuais(Exportar para XML) antes de importar os novos dados +CollectEarthWindow.3=\ Erro ao importar dados. +CollectEarthWindow.40=Configurar caminho para o arquivo onde o Servidor Saiku se encontra instalado em Ferramentas->Propiedades->Avançado. +CollectEarthWindow.41=Guardar dados exportados para o arquivo\: +CollectEarthWindow.42=Sair +CollectEarthWindow.43=Registros repetidos detectados +CollectEarthWindow.44=Importar/Exportar +CollectEarthWindow.45=Exportar dados para XML (comprimidos) +CollectEarthWindow.46=Importar novos dados do ZIP (XML comprimidos) +CollectEarthWindow.47=Servidor Saiku não configurado +CollectEarthWindow.48=Arquivos ZIP +CollectEarthWindow.49=Arquivos Fusion CSV +CollectEarthWindow.4=Isenção de responsabilidade da FAO +CollectEarthWindow.50=Abrir Manual de Usuário +CollectEarthWindow.51=Verificar atualizações de Collect Earth +CollectEarthWindow.52=Abrir Arquivo de Registro da aplicação +CollectEarthWindow.53=Arquivo de Registro de Collect Earth +CollectEarthWindow.54=Carregar pontos de KML +CollectEarthWindow.55=Atualizar registros atuais usando CSV +CollectEarthWindow.56=Sobre... +CollectEarthWindow.57=O processo de arranque de Saiku ainda está em execução, por favor aguarde. +CollectEarthWindow.58=Não é possível iniciar a análise com Saiku +CollectEarthWindow.59=Quer voltar a gerar o conjunto de dados para o análise de Saiku?
Este processo pode demorar vários minutos.
Se clicar em "SIM" um novo conjunto de dados com a mais recente informação será gerada. +CollectEarthWindow.5=Fechar +CollectEarthWindow.60=Geraço de dados para Saiku +CollectEarthWindow.61=Exportar dados para XML (apenas os registros adicionados/modificados) +CollectEarthWindow.62=Sobre... +CollectEarthWindow.63=Erro acessando pontos de KML +CollectEarthWindow.64=Suporte Técnico +CollectEarthWindow.65=O nome do operador foi alterado +CollectEarthWindow.66=Nome do operador +CollectEarthWindow.67=Abra a pasta de dados do CE +CollectEarthWindow.6=Exportar dados a Fusion Table +CollectEarthWindow.70=Abra o manuel desta pesquisa +CollectEarthWindow.71=Gerar ferramenta Saiku Independente +CollectEarthWindow.7=Erro ao importar os dados +CollectEarthWindow.8=Texto de isenção não foi possivel de ser encontrado +CollectEarthWindow.9=Os dados importados contém registros que já estão presentes no seu banco de dados. +DynamicsCode.0=Inicialmente Floresta +DynamicsCode.1=Inicialmente Ãrea de Pastagem +DynamicsCode.2=Inicialmente Ãrea Urbana +DynamicsCode.3=Inicialmente Outros +DynamicsCode.4=Inicialmente Ãrea Alagada +DynamicsCode.5=Inicialmente Ãrea Agrícola +EarthApp.11=Collect Earth já está em execução +EarthApp.21=O arquivo contendo o gride de pontos como CSV/CED não foi encontrado no caminho selecionado\:
+EarthApp.23=Nenhum arquivo CSV/CED foi configurado \:

+EarthApp.24=O arquivo contendo o modelo Freemarker com a definição KML não foi encontrado no caminho selecionado \:
+EarthApp.26=Nenhum arquivo de definição KML foi configurado \:

+EarthApp.27=O arquivo contendo o formato balão HTML não foi encontrado no caminho selecionado \:
+EarthApp.29=Nenhum arquivo balão HTML foi configurado \:

+EarthApp.30=Por favor corrija a localização do arquivo no menu Ferramentas->Propriedades. +EarthApp.3=Lembrar mais tarde +EarthApp.4=Atualizar Agora +EarthApp.57=Existe uma nova versão do Collect Earth disponível\!
Como gostaria de proceder? +EarthApp.58=Alerta de Atualização +EarthApp.59=Erro ao importar aquivo do projeto +EarthApp.5=Não me lembre novamente +EarthApp.61=O arquivo do Collect Earth não pôde ser aberto.
Por favor certifique-se que Google Earth esteja instalado. +EarthApp.6= - Versão +EarthApp.70=AVISO +EarthApp.71=No Mac OS X, os arquivos do projeto Collect Earth (* .cep) não serão abertos no Collect Earth quando forem clicados duas vezes.
+EarthApp.72=Use a barra de ferramentas Collect Earth para abrir os arquivos .cep \: +EarthApp.73=Collect Earth - problemas em computadores Mac OS X +EarthSurveyService.9=Campo obrigatório +ExportActionListener.1=Escolha data a partir da qual queira exportar os dados +ExportDialogProcessMonitor.0=Processando os dados... +ExportDialogProcessMonitor.1=Esperando de inicializar o processo \: +ExportDialogProcessMonitor.4=Registros importados \: +ImportActionListener.0=Deseja importar os dados das parcelas que não tenham sido completamente preenchidos? +ImportActionListener.2=Se clicar NÃO apenas os dados das parcelas em estado completo ("verde"), serão importados. +ImportActionListener.3=Importar registros incompletos +ImportDialogProcessMonitor.0=\ CALCULANDO +ImportDialogProcessMonitor.11=Cifra inicial de registros \: +ImportDialogProcessMonitor.2=Importando registros.... +ImportDialogProcessMonitor.5=Cifra final de registros importados \: +ImportDialogProcessMonitor.8=Processando dados... +ImportProcessMonitorDialog.0=Imported records \: +ImportXMLDialogProcessMonitor.1 = Substitua dados no banco de dados +ImportXMLDialogProcessMonitor.2 = Importe apenas registros não conflitantes +InfiniteProgressMonitor.0=Cancelar operação +JFileChooserExistsAware.0=Arquivo de projeto Collect Earth +KmlImportService.13=Selecione um arquivo CSV para salvar a localização dos pontos +MissingPlotsListener.0=Erro ao obter informação sobre parcelas ausentes na Base de Dados +MissingPlotsListener.10=Número total de ppontos no desenho de amostragem \: +MissingPlotsListener.12=Número de pontos perdidos \: +MissingPlotsListener.14=Todos os pontos foram preenchidos\! +MissingPlotsListener.1=Parcelas ausentes +MissingPlotsListener.2=Copiar conteúdos +MissingPlotsListener.3=Escolha os arquivos contendo informação sobre as parcelas ( .csv or .ced files ) para os quais deseja saber se todos os dados foram preenchidos. +MissingPlotsListener.4=Parcelas ausentes - informação +MissingPlotsListener.5=Do arquivo \: +MissingPlotsListener.6=Exportar para arquivo CED +NO=Não +NO_TO_ALL=Não para todos +OpenTextFileListener.0=O arquivo de texto não foi encontrado em \: +OptionWizard.0=Opções do Collect Earth +OptionWizard.100=Abrir Planet +OptionWizard.101=Llave da API do Planet OptionWizard.1021=URL SecureWatch -OptionWizard.102=Ouvrir Maxar SecureWatch -OptionWizard.103=Définir le URL pour le Carte Extra (ouvre quand il est réglé) \: -OptionWizard.104=Navigateurs -OptionWizard.105=Ouvrir Earth Map -OptionWizard.110=Utiliser les images mensuelles fournies par NICFI -OptionWizard.10=Montrer les fichiers de sauvegarde -OptionWizard.11=Inconnu \: utiliser ifconfig -OptionWizard.12=Instance client -OptionWizard.13=IP Serveur de Collect Earth -OptionWizard.14=Port Serveur de Collect Earth (e.g. 8023) -OptionWizard.15=Appliquer et sauvegarder les changements +OptionWizard.102=Abrir Maxar SecureWatch +OptionWizard.103=Configure o URL para o Mapa Extra (abre quando configurado) \: +OptionWizard.104=Navegadores +OptionWizard.105=Abrir Earth Map +OptionWizard.110=Use imagens mensais fornecidas pela NICFI +OptionWizard.10=Abrir arquivo de backup +OptionWizard.11=Desconhecido\: usar ifconfig +OptionWizard.12=Cliente Instância +OptionWizard.13=Collect Earth Server IP +OptionWizard.14=Collect Earth Porta de Servidor (p.ex. 8023) +OptionWizard.15=Guardar & Aplicar alteraçães OptionWizard.16=ID -OptionWizard.17=Coord-X -OptionWizard.18=Coord-Y -OptionWizard.19=Altitude -OptionWizard.1=Choisir un navigateur -OptionWizard.20= Le contenu de Google Earth a changé
Veuillez accepter la mise à jour quand GE le demande -OptionWizard.21=Mise à jour réussie -OptionWizard.22=Pente -OptionWizard.23=Il y a eu une erreur pendant la réouverture de Google Earth -OptionWizard.24=Annuler -OptionWizard.25=Mode opération -OptionWizard.26=Hôte pour la BDD -OptionWizard.27=Le dossier n'est pas valide (il manque le fichier start-saiku.bat) -OptionWizard.28=Le dossier Saiku n'est pas reconnu -OptionWizard.29=Port pour la BDD -OptionWizard.2=Flux (serveur/client) -OptionWizard.30=Options SQLite -OptionWizard.31=Points d'échantillonnage -OptionWizard.32=Configuration de la parcelle -OptionWizard.33=Définition de l'enquête -OptionWizard.34=Services intégrés -OptionWizard.35=Nombre de points de contrôle -OptionWizard.36=Distance entre les points de contrôle (en mètres) -OptionWizard.37=Distance au bord de la parcelle (en mètres) -OptionWizard.38=Le Fichier CSV/CED ne peut pas être lu
Le fichier devrait avoir des valeurs séparées par des virgules comme ceci \:
-OptionWizard.39=ID,Coordonnée_Y, Coordonnée_X,altitude,pente,orientation -OptionWizard.3=Instance serveur -OptionWizard.40=Projets -OptionWizard.41=Charger un nouveau fichier projet -OptionWizard.42=Erreur pendant la fermeture du lecteur CSV -OptionWizard.43=Nom de l'enquête -OptionWizard.44=Sauvegarder automatiquement la base dans -OptionWizard.45=Ouvrir Earth Engine Playground (obsolète) -OptionWizard.46=Ouvrir le Timelapse de Google Earth Engine -OptionWizard.47=Ouvrir Bing Maps -OptionWizard.48=Ouvrir le formulaire dans un navigateur plutôt que dans GE (recommandé pour Linux) -OptionWizard.49=Chemin jusqu'au fichier ced/csv avec les données des parcelles -OptionWizard.4=IP actuelle de l'ordinateur -OptionWizard.50=Parcourir -OptionWizard.51=Erreur pendant l'importation du fichier -OptionWizard.52=Fichier CSV/CED uniquement avec des coordonnées -OptionWizard.53=Pas de points -OptionWizard.54=Point central -OptionWizard.55=Erreur pendant l'importation du dossier projet -OptionWizard.56=Charger le projet -OptionWizard.57=Projets chargés précedemment -OptionWizard.58=Ouvrir GEE Code Editor (nécessite un accès restreint Trusted Tester) -OptionWizard.59=Ouvrir Here Maps -OptionWizard.5=Port Serveur Collect Earth \: -OptionWizard.65=Chemin jusqu'au serveur Saiku -OptionWizard.66=Parcourir -OptionWizard.67=Chemin jusqu'à Firefox -OptionWizard.68=Parcourir -OptionWizard.6=Paramètres de la BD PostGreSQL -OptionWizard.70=Fichiers exécutables -OptionWizard.72=Fichiers binaires -OptionWizard.73=Chemin jusqu'à Chrome -OptionWizard.74=Parcourir -OptionWizard.76=Fichiers exécutables -OptionWizard.78=Fichiers binaires -OptionWizard.79=Chemin jusqu'au modèle Freemarker KML -OptionWizard.7=Nom d'utilisateur -OptionWizard.80=Parcourir -OptionWizard.82=Modèle Freemarker -OptionWizard.83=Chemin jusqu'au Ballon HTML -OptionWizard.84=Parcourir -OptionWizard.86=Page web HTML -OptionWizard.87=Chemin jusqu'au fichier XML contenant la définition IDM -OptionWizard.88=Parcourir -OptionWizard.8=Mot de passe -OptionWizard.90=Définition IDM XML -OptionWizard.91=Serveur (version gestionnaire ou autonome) -OptionWizard.92=Client (opérateur/connecté au serveur) -OptionWizard.93=SQLite (Fichier intégré / Unique) +OptionWizard.17=X-coord +OptionWizard.18=Y-coord +OptionWizard.19=Elevação +OptionWizard.1=Escolher Navegador +OptionWizard.20= Os conteúdos de Google Earth foram alterados.
Por favor aceite a regarga do conteúdo uma vez que Google Earth lhe pergunte. +OptionWizard.21=Atualizado com sucesso +OptionWizard.22=Relevo +OptionWizard.23=Houve um erro ao reabrir os dados de Google Earth +OptionWizard.24=Cancelar +OptionWizard.25=Modo de Operação +OptionWizard.26=BBDD servidor +OptionWizard.27=Isto não é um Arquivo Saiku reconhecível (o arquivo start-saiku.bat não se encontra presente) +OptionWizard.28=Servidor Saiku não reconhecível +OptionWizard.29=BBDD porta +OptionWizard.2=Tipo de uso(servidor/cliente) +OptionWizard.30=Opçães SQLite +OptionWizard.31=Dados de amostra +OptionWizard.32=Disposição da Parcela +OptionWizard.33=Definiço de Questionários +OptionWizard.34=Serviços Integrados +OptionWizard.35=Número de pontos de control +OptionWizard.36=Distância entre os pontos de control (em metros) +OptionWizard.37=Margem com o perímetro da parcela (em metros) +OptionWizard.38=O arquivo CSV/CED não foi possivel ser lido corretamente.
O arquivo deve conter valores separados por vírgulas do seguinte modo\:
+OptionWizard.39=ID,Y-Coordenada,X-Coordenada,elevação,relevo,orientação +OptionWizard.3=Servidor Instance +OptionWizard.40=Projetos +OptionWizard.41=Carregar um novo arquivo de projeto +OptionWizard.42=Erro ao fechar o leitor CSV +OptionWizard.43=Nome do questionário +OptionWizard.44=Realizar automaticamente backup do banco de dados em +OptionWizard.45=Abrir Earth Engine Playground (descontinuado) +OptionWizard.46=Abrir Earth Engine Timelapse +OptionWizard.47=Abrir Bing Maps +OptionWizard.48=Abrir formulário em um navegador externo em vez de Google Earth (recomendado para LINUX) +OptionWizard.49=Caminho do arquivo CED/CSV com as coordenadas das parcelas +OptionWizard.4=IP do computador atual\: +OptionWizard.50=Navegar.. +OptionWizard.51=Erro ao importar os arquivos do projeto +OptionWizard.52= Arquivo CSV/CED com coordinadas +OptionWizard.53=Sem pontos +OptionWizard.54=Ponto Central +OptionWizard.55=Erro ao importar diretório do projeto +OptionWizard.56=Carregar projeto +OptionWizard.57=Projetos previamente carregados +OptionWizard.58=Abrir GEE Code Editor (requer acesso ao Trusted Tester) +OptionWizard.59=Abrir Here Maps focado no ponto +OptionWizard.5= Collect Earth Servidor porto\: +OptionWizard.65=Caminho para arquivo Saiku +OptionWizard.66=Navegar... +OptionWizard.67=Caminho para o executável do Firefox +OptionWizard.68=Navegar... +OptionWizard.6=Parâmetros BD PostgreSQL +OptionWizard.70=Arquivos executáveis +OptionWizard.72=Arquivos binários +OptionWizard.73=Caminho para o executável do Chrome +OptionWizard.74=Navegar... +OptionWizard.76=Arquivos executáveis +OptionWizard.78=Arquivos binarios +OptionWizard.79=Caminho para o padrão de KML Freemarker +OptionWizard.7=Nome de Usuário +OptionWizard.80=Navegar... +OptionWizard.82=Padrão Freemarker +OptionWizard.83=Caminho para formulário HTML Balloon +OptionWizard.84=Navegar... +OptionWizard.86=Pagina web HTML +OptionWizard.87=Caminho para XML com definição IDM +OptionWizard.88=Navegar... +OptionWizard.8=Senha +OptionWizard.90=Definiço XML IDM +OptionWizard.91=Servidor (versão para gerente ou uso autônomo) +OptionWizard.92=Cliente (operador/conectado ao servidor) +OptionWizard.93=SQLite (Embutido/com base em um único arquivo) OptionWizard.94=PostgreSQL -OptionWizard.95=Côté des points d'échantillonnage (en mètres) -OptionWizard.9=Nom de la base -ProcessMonitorDialog.1=Erreur d’interprétation sur numéro de rangée -ProcessMonitorDialog.4=, colonnes -ProcessMonitorDialog.5=\ -- valeures -SaikuAnalysisListener.0=Oui - Rafraichir les données Saiku (processus long) -SaikuAnalysisListener.1=Non - Utiliser la même version des données que la dernière fois que Saiku a été utilisé -SaikuToolExportListener.1=Génération de l'outil Saiku -SaikuToolExportListener.2=Génération de l'outil Saiku avec la base de données actuelle -SaikuStarter.1=Démarrer Saïku -SaikuStarter.2=Démarrer Saïku peut prendre plusieurs minutes, veuillez patienter\! -SaveEarthDataServlet.0=Requête vide -SaveEarthDataServlet.1=Problème lors de la sauvegarde de la base de données -SaveEarthDataServlet.2=Les données ont été sauvées -SlopeCode.0=Plan (0-5) -YES=Oui -YES_TO_ALL=Oui à tous \ No newline at end of file +OptionWizard.95=Side of the sampling dots (in meters) +OptionWizard.9= Nome da Base de Dados +ProcessMonitorDialog.1=Erro de análise na linha número +ProcessMonitorDialog.4=, colunas +ProcessMonitorDialog.5= -- valores +SaikuAnalysisListener.0=Sim - Atualizar dados Saiku (longo processo) +SaikuAnalysisListener.1=Não - Use a mesma versão dos dados da última vez que o Saiku foi usado +SaikuToolExportListener.1=Geração da ferramenta Saiku +SaikuToolExportListener.2=Gerando a Ferramenta Saiku com o banco de dados atual +SaikuStarter.1=Iniciando Saiku +SaikuStarter.2=Iniciando Saiku pode demorar uns minutos, por favor aguarde\! +SaveEarthDataServlet.0=Sem dados +SaveEarthDataServlet.1=Problema ocorreu ao guardar os dados na Base de Dados +SaveEarthDataServlet.2=Os dados foram guardados +SlopeCode.0=Plano (0-5) +YES=Sim +YES_TO_ALL=Sim a todas \ No newline at end of file From b1d64a0bbcceeea58139a5bcb5b1264314b2c440 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:26 +0100 Subject: [PATCH 0851/1620] New translations Messages_hi.properties (Portuguese) --- .../earth/app/view/Messages_pt.properties | 483 +++++++++--------- 1 file changed, 228 insertions(+), 255 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 5199a9b624..f759c433b0 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,255 +1,228 @@ -AboutDialog.19=UN problème est apparu -AboutDialog.5=Pour plus d’infos, visitez notre site web OpenForis.org -AboutDialog.6=Désolé, il y a eu un problème lors de l’ouverture du lien avec votre navigateur par défaut. -AboutDialog.8=Ok -AspectCode.0=Nord -AspectCode.1=Nord-Est -AspectCode.2=Est -AspectCode.3=Sud-Est -AspectCode.4=Sud -AspectCode.5=Sud-Ouest -AspectCode.6=Ouest -AspectCode.7=Nord-Ouest -CollectEarthMenu.0=Importe le fichier .CEP -CollectEarthMenu.2=Utilitaires -CollectEarthMenu.3=Divise un large tableau CSV en plusieurs parties -CollectEarthMenu.4=Exporte les données en XML (à partir d'une date précise jusqu'à aujourd'hui) -CollectEarthMenu.5=Exporte sur la sauvegarde Collect Backup -CollectEarthMenu.6=Exporte les données en tant que sauvegarde Collect Backup (toutes les données) -CollectEarthMenu.7=Exporte les données en tant que sauvegarde Collect Backup (à partir de) -CollectEarthMenu.8=Exporte les données en XML (filtrer par attribut) -CollectEarthWindow.0=Erreur pendant l'exportation des données en csv -CollectEarthWindow.10=Fichier -CollectEarthWindow.11=Quitter -CollectEarthWindow.12=Outils -CollectEarthWindow.13=Télécharger les données en CSV (Excel) -CollectEarthWindow.14=Démarrer l'analyse avec Saïku -CollectEarthWindow.15=Propriétés -CollectEarthWindow.16=Aide -CollectEarthWindow.17=Avertissement -CollectEarthWindow.18=Trouver les placettes manquantes dans la base de données -CollectEarthWindow.19=Collect Earth -CollectEarthWindow.1=Erreur d'exportation -CollectEarthWindow.20=Nombre d'enregistrements dupliqués -CollectEarthWindow.21=Icône non trouvée -CollectEarthWindow.22= Êtes-vous sûr de vouloir fermer CollectEarth
Fermer cette fenêtre fermera aussi le serveur -CollectEarthWindow.23=Confirmation requise -CollectEarthWindow.24=Exporter en XML -CollectEarthWindow.25=Voulez-vous ajouter tout de même ces données et perdre vos enregistrements? -CollectEarthWindow.26=Utilisateur -CollectEarthWindow.27=Appliquer -CollectEarthWindow.28=Le serveur devrait être démarré pour la saisie des données par les utilisateurs. -CollectEarthWindow.29=Le serveur Saiku n'est pas configuré. -CollectEarthWindow.2=Langue -CollectEarthWindow.30=Veuillez garder cette fenêtre active pendant que vous utilisez Google Earth -CollectEarthWindow.31=Exporter les données collectées en CSV -CollectEarthWindow.32=Fermer -CollectEarthWindow.33=Le nom de l'utilisateur doit comprendre entre 5 et 50 caractères -CollectEarthWindow.34=Erreur de validation -CollectEarthWindow.35= NOM DE L'UTILISATEUR VIDE\!
Veuillez renseigner le champs et Appuyer sur "Mise à jour" -CollectEarthWindow.36=Le nom de l'utilisateur ne peut pas être vide -CollectEarthWindow.37=Laisser ouvert -CollectEarthWindow.38=Fichiers CSV -CollectEarthWindow.39=NOTE \: Il est conseillé de sauvegarder vos données (export en XML) avant d'importer de nouvelles données -CollectEarthWindow.3=\ Erreur pendant l'importation -CollectEarthWindow.40=Renseigner le chemin jusqu'au serveur Saiku dans /Outils/Propriétés/Avancé. -CollectEarthWindow.41=Sauvegarde des données exportées dans le fichier\: -CollectEarthWindow.42=Quitter -CollectEarthWindow.43=Enregistrements conflictuels trouvés -CollectEarthWindow.44=Importer/Exporter les données -CollectEarthWindow.45=Exporter les données en XML (zippé) -CollectEarthWindow.46=Importer de nouvelles données depuis ZIP (XML zippé) -CollectEarthWindow.47=Le serveur Saiku n'est pas configuré -CollectEarthWindow.48=Fichier zip/collect-data -CollectEarthWindow.49=Fusion des fichiers CSV -CollectEarthWindow.4=Clause de non-responsabilité de la FAO -CollectEarthWindow.50=Ouvrir le manuel utilisateur -CollectEarthWindow.51=Vérifier les mises à jour des Collect Earth -CollectEarthWindow.52=Fichier de logs Open Application -CollectEarthWindow.53=Fichier de logs Collect Earth -CollectEarthWindow.54=Charger les points de KML -CollectEarthWindow.55=Mettre à jour les enregistrements en utilisant un fichier CSV -CollectEarthWindow.56=A propos... -CollectEarthWindow.57=Le processus de démarrage de Saïku est en cours, veuillez patienter -CollectEarthWindow.58=Impossible de démarrer l'analyse avec Saïku -CollectEarthWindow.59=Voulez-vous régénérer le jeu de données?
Cela peut prendre du temps.
Cliquer sur oui pour régénérer un nouveau jeu de données avec les dernières informations -CollectEarthWindow.5=Fermer -CollectEarthWindow.60=Génération des données Saïku -CollectEarthWindow.61=Exporter en XML (uniquement les enregistrements modifiés/ajoutés) -CollectEarthWindow.62=A propos… -CollectEarthWindow.63=Erreur en accédant aux points de KML -CollectEarthWindow.64=Assistance technique -CollectEarthWindow.65=Le nom de l'opérateur a été changé -CollectEarthWindow.66=Nom de l'opérateur -CollectEarthWindow.67=Ouvrir le dossier de données de CE -CollectEarthWindow.6=Exporter en Table de Fusion -CollectEarthWindow.70=Ouvrez le manuel de cette enquête -CollectEarthWindow.71=Générer un outil Saiku autonome -CollectEarthWindow.7=Erreur pendant l'importation des données -CollectEarthWindow.8=Le texte est introuvable -CollectEarthWindow.9=Les données importées contiennent des redondances avec celles présentes dans la base -DynamicsCode.0= Terre Forestière initialement -DynamicsCode.1= Prairie initialement -DynamicsCode.2= Etablissement initialement -DynamicsCode.3= Autre terre initialement -DynamicsCode.4= Terre humide initialement -DynamicsCode.5= Terre cultivée initialement -EarthApp.11=Collect Earth est déjà en cours d’exécution -EarthApp.21=Le fichier CSV/CED contenant les points est introuvable \:
-EarthApp.23=Aucun fichier CSV/CED spécifié \:

-EarthApp.24=Le fichier contenant le modèle de définition KML est introuvable \:
-EarthApp.26=Aucun modèle de définition spécifié\:

-EarthApp.27=Le fichier contenant le ballon HTML est introuvable \:
-EarthApp.29=Aucun ballon HTML spécifié \:

-EarthApp.30=Veuillez corriger le chemin d’accès dans le menu Outils -> Propriétés. -EarthApp.3=Rappelez le moi plus tard -EarthApp.4=Mettre a jour maintenant -EarthApp.57= Une nouvelle version de Collect Earth est disponible\! Utiliser le Menu -EarthApp.58=Alerte de mise à jour -EarthApp.59=Erreur pendant l’importation du fichier -EarthApp.5=Ne me le rappelez plus -EarthApp.61=Le fichier Collect Earth est introuvable br/>Veuillez-vous assurer que Google Earth est installé. -EarthApp.6=\ - Version -EarthApp.70=AVERTISSMENT -EarthApp.71=Sous Mac OS X, les fichiers de projet Collect Earth (* .cep) ne s'ouvriront pas dans Collect Earth lorsqu'ils sont double-cliqués.
-EarthApp.72=Utilisez la barre d'outils Collect Earth pour ouvrir les fichiers .cep \: -EarthApp.73=Collect Earth - problèmes sur les ordinateurs Mac OS X -EarthSurveyService.9=Champs requis -ExportActionListener.1=Choisir la date pour les données à exporter -ExportDialogProcessMonitor.0=Chargement des données... -ExportDialogProcessMonitor.1=Attente d'initialisation de l'export -ExportDialogProcessMonitor.4=Enregistrements exportés \: -ImportActionListener.0=Est-ce que les données pour les placettes qui ne sont pas complètes doivent être importées ? -ImportActionListener.2=Si vous cliquez sur NO, seulement les données provenant des placettes avec la marque « verte », qui contiennent toutes les données, seront importées -ImportActionListener.3=Importer les enregistrements incomplets -ImportDialogProcessMonitor.0=Calcul en cours -ImportDialogProcessMonitor.11=Nombre initial d' enregistrements \: -ImportDialogProcessMonitor.2=Chargement des enregistrements... -ImportDialogProcessMonitor.5=Nombre réel d'enregistrements importés\: -ImportDialogProcessMonitor.8=Chargement des données... -ImportProcessMonitorDialog.0=Enregistrements importés \: -ImportXMLDialogProcessMonitor.1 = Écraser les données dans la base de données -ImportXMLDialogProcessMonitor.2 = Importer uniquement des enregistrements non conflictuels -InfiniteProgressMonitor.0=Annuler l’opération -JFileChooserExistsAware.0=Fichier projet Collect Earth -KmlImportService.13=Sélectionnez un fichier CSV pour enregistrer les emplacements des parcelles -MissingPlotsListener.0=Erreur au cours de l’enregistrement des placettes absentes de la base de données -MissingPlotsListener.10=Nombre total de parcelles dans le plan d'échantillonnage \: -MissingPlotsListener.12=Nombre de parcelles manquantes \: -MissingPlotsListener.14=Toutes les parcelles sont remplis\! -MissingPlotsListener.1=Placettes manquantes -MissingPlotsListener.2=Copier le contenu sur le clipboard -MissingPlotsListener.3=Choisir les fichiers qui contiennent les informations des placettes (.csv ou .ced) pour lesquelles vous voulez savoir si toues les placettes ont été renseignées -MissingPlotsListener.4=Placettes manquantes – Information -MissingPlotsListener.5=Depuis le fichier \: -MissingPlotsListener.6=Exporter en CED -NO=Non -NO_TO_ALL=Non à tous -OpenTextFileListener.0=Le fichier texte n'a pas été trouvé dans \: -OptionWizard.0=Options Collect Earth -OptionWizard.100=Ouvrir Planet -OptionWizard.101=Clé API Planet -OptionWizard.1021=URL SecureWatch -OptionWizard.102=Ouvrir Maxar SecureWatch -OptionWizard.103=Définir le URL pour le Carte Extra (ouvre quand il est réglé) \: -OptionWizard.104=Navigateurs -OptionWizard.105=Ouvrir Earth Map -OptionWizard.110=Utiliser les images mensuelles fournies par NICFI -OptionWizard.10=Montrer les fichiers de sauvegarde -OptionWizard.11=Inconnu \: utiliser ifconfig -OptionWizard.12=Instance client -OptionWizard.13=IP Serveur de Collect Earth -OptionWizard.14=Port Serveur de Collect Earth (e.g. 8023) -OptionWizard.15=Appliquer et sauvegarder les changements -OptionWizard.16=ID -OptionWizard.17=Coord-X -OptionWizard.18=Coord-Y -OptionWizard.19=Altitude -OptionWizard.1=Choisir un navigateur -OptionWizard.20= Le contenu de Google Earth a changé
Veuillez accepter la mise à jour quand GE le demande -OptionWizard.21=Mise à jour réussie -OptionWizard.22=Pente -OptionWizard.23=Il y a eu une erreur pendant la réouverture de Google Earth -OptionWizard.24=Annuler -OptionWizard.25=Mode opération -OptionWizard.26=Hôte pour la BDD -OptionWizard.27=Le dossier n'est pas valide (il manque le fichier start-saiku.bat) -OptionWizard.28=Le dossier Saiku n'est pas reconnu -OptionWizard.29=Port pour la BDD -OptionWizard.2=Flux (serveur/client) -OptionWizard.30=Options SQLite -OptionWizard.31=Points d'échantillonnage -OptionWizard.32=Configuration de la parcelle -OptionWizard.33=Définition de l'enquête -OptionWizard.34=Services intégrés -OptionWizard.35=Nombre de points de contrôle -OptionWizard.36=Distance entre les points de contrôle (en mètres) -OptionWizard.37=Distance au bord de la parcelle (en mètres) -OptionWizard.38=Le Fichier CSV/CED ne peut pas être lu
Le fichier devrait avoir des valeurs séparées par des virgules comme ceci \:
-OptionWizard.39=ID,Coordonnée_Y, Coordonnée_X,altitude,pente,orientation -OptionWizard.3=Instance serveur -OptionWizard.40=Projets -OptionWizard.41=Charger un nouveau fichier projet -OptionWizard.42=Erreur pendant la fermeture du lecteur CSV -OptionWizard.43=Nom de l'enquête -OptionWizard.44=Sauvegarder automatiquement la base dans -OptionWizard.45=Ouvrir Earth Engine Playground (obsolète) -OptionWizard.46=Ouvrir le Timelapse de Google Earth Engine -OptionWizard.47=Ouvrir Bing Maps -OptionWizard.48=Ouvrir le formulaire dans un navigateur plutôt que dans GE (recommandé pour Linux) -OptionWizard.49=Chemin jusqu'au fichier ced/csv avec les données des parcelles -OptionWizard.4=IP actuelle de l'ordinateur -OptionWizard.50=Parcourir -OptionWizard.51=Erreur pendant l'importation du fichier -OptionWizard.52=Fichier CSV/CED uniquement avec des coordonnées -OptionWizard.53=Pas de points -OptionWizard.54=Point central -OptionWizard.55=Erreur pendant l'importation du dossier projet -OptionWizard.56=Charger le projet -OptionWizard.57=Projets chargés précedemment -OptionWizard.58=Ouvrir GEE Code Editor (nécessite un accès restreint Trusted Tester) -OptionWizard.59=Ouvrir Here Maps -OptionWizard.5=Port Serveur Collect Earth \: -OptionWizard.65=Chemin jusqu'au serveur Saiku -OptionWizard.66=Parcourir -OptionWizard.67=Chemin jusqu'à Firefox -OptionWizard.68=Parcourir -OptionWizard.6=Paramètres de la BD PostGreSQL -OptionWizard.70=Fichiers exécutables -OptionWizard.72=Fichiers binaires -OptionWizard.73=Chemin jusqu'à Chrome -OptionWizard.74=Parcourir -OptionWizard.76=Fichiers exécutables -OptionWizard.78=Fichiers binaires -OptionWizard.79=Chemin jusqu'au modèle Freemarker KML -OptionWizard.7=Nom d'utilisateur -OptionWizard.80=Parcourir -OptionWizard.82=Modèle Freemarker -OptionWizard.83=Chemin jusqu'au Ballon HTML -OptionWizard.84=Parcourir -OptionWizard.86=Page web HTML -OptionWizard.87=Chemin jusqu'au fichier XML contenant la définition IDM -OptionWizard.88=Parcourir -OptionWizard.8=Mot de passe -OptionWizard.90=Définition IDM XML -OptionWizard.91=Serveur (version gestionnaire ou autonome) -OptionWizard.92=Client (opérateur/connecté au serveur) -OptionWizard.93=SQLite (Fichier intégré / Unique) -OptionWizard.94=PostgreSQL -OptionWizard.95=Côté des points d'échantillonnage (en mètres) -OptionWizard.9=Nom de la base -ProcessMonitorDialog.1=Erreur d’interprétation sur numéro de rangée -ProcessMonitorDialog.4=, colonnes -ProcessMonitorDialog.5=\ -- valeures -SaikuAnalysisListener.0=Oui - Rafraichir les données Saiku (processus long) -SaikuAnalysisListener.1=Non - Utiliser la même version des données que la dernière fois que Saiku a été utilisé -SaikuToolExportListener.1=Génération de l'outil Saiku -SaikuToolExportListener.2=Génération de l'outil Saiku avec la base de données actuelle -SaikuStarter.1=Démarrer Saïku -SaikuStarter.2=Démarrer Saïku peut prendre plusieurs minutes, veuillez patienter\! -SaveEarthDataServlet.0=Requête vide -SaveEarthDataServlet.1=Problème lors de la sauvegarde de la base de données -SaveEarthDataServlet.2=Les données ont été sauvées -SlopeCode.0=Plan (0-5) -YES=Oui -YES_TO_ALL=Oui à tous \ No newline at end of file +AboutDialog.19=कोई समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ +AboutDialog.5=अधिक जानकारी के लिठहमारी वेबसाइट पर जाà¤à¤‚ OpenForis.org +AboutDialog.6=कà¥à¤·à¤®à¤¾ करें, à¤à¤• समसà¥à¤¯à¤¾ आपके सिसà¥à¤Ÿà¤® के मानक बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में इस लिंक को खोलने की कोशिश कर रही है. +AboutDialog.8=ठीक +AspectCode.0=उतà¥à¤¤à¤° दिशा +AspectCode.1=उतà¥à¤¤à¤°-पूरà¥à¤µ दिशा +AspectCode.2=पूरà¥à¤µ दिशा +AspectCode.3=दकà¥à¤·à¤¿à¤£-पूरà¥à¤µ दिशा +AspectCode.4=दकà¥à¤·à¤¿à¤£ दिशा +AspectCode.5=दकà¥à¤·à¤¿à¤£-पशà¥à¤šà¤¿à¤® दिशा +AspectCode.6=पशà¥à¤šà¤¿à¤® दिशा +AspectCode.7=उतà¥à¤¤à¤°-पशà¥à¤šà¤¿à¤® दिशा +CollectEarthWindow.0=तà¥à¤°à¥à¤Ÿà¤¿ जब सीà¤à¤¸à¤µà¥€ फ़ाइल में डेटा निरà¥à¤¯à¤¾à¤¤ करने का पà¥à¤°à¤¯à¤¾à¤¸ +CollectEarthWindow.1=निरà¥à¤¯à¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.10=फ़ाइल +CollectEarthWindow.11=बाहर जाà¤à¤‚ +CollectEarthWindow.12=उपकरण +CollectEarthWindow.13=डेटा सीà¤à¤¸à¤µà¥€ निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.14=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ +CollectEarthWindow.15=गà¥à¤£ +CollectEarthWindow.16=मदद +CollectEarthWindow.17=असà¥à¤µà¥€à¤•रण +CollectEarthWindow.18=डेटाबेस में लापता भूखंडों खोजें +CollectEarthWindow.19=पृथà¥à¤µà¥€ इकटà¥à¤ à¤¾ +CollectEarthWindow.2=भाषा +CollectEarthWindow.20=डà¥à¤ªà¥à¤²à¤¿à¤•ेट रिकॉरà¥à¤¡ की संखà¥à¤¯à¤¾\: +CollectEarthWindow.21=मà¥à¤–à¥à¤¯ फà¥à¤°à¥‡à¤® के लिठआइकन नहीं मिल सकता है +CollectEarthWindow.22=आपको लगता है कि आप à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ बंद करना चाहते हैं? विंडोज बंद करने से, à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° बंद हो जाà¤à¤—ा +CollectEarthWindow.23=पà¥à¤·à¥à¤Ÿà¤¿ की जरूरत है +CollectEarthWindow.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.25=आप वैसे भी इन अभिलेखों को जोड़ना चाहते हैं और अपने वरà¥à¤¤à¤®à¤¾à¤¨ डेटा खोने के लिठकिलक करना चाहते हैं? +CollectEarthWindow.26=ऑपरेटर,पà¥à¤°à¤šà¤¾à¤²à¤• +CollectEarthWindow.27=अदà¥à¤¯à¤¤à¤¨ +CollectEarthWindow.28= औपन फौरिस à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° चल रहा होना चाहिठ, जबभी ऑपरेटर डेटा की वà¥à¤¯à¤¾à¤–à¥à¤¯à¤¾ करें . +CollectEarthWindow.29=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. +CollectEarthWindow.3= आयात संबंधी तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.30=जबभी आप गà¥à¤—ल अरà¥à¤¥ का उपयोग कर रहे हैं, कृपया इस विंडोज को खà¥à¤²à¥€ बनाठरखें. +CollectEarthWindow.31=à¤à¤•तà¥à¤° डेटा सीà¤à¤¸à¤µà¥€ फाइल में भेजें +CollectEarthWindow.32=छोड़ना +CollectEarthWindow.33=ऑपरेटर का नाम के 5 अकà¥à¤·à¤° से बड़ा और 50 अकà¥à¤·à¤° से कम होना चाहिठ+CollectEarthWindow.34=मानà¥à¤¯à¤¤à¤¾ तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.35=ऑपरेटर नाम खाली\!
कृपया ऑपरेटर का नाम भरें और "अदà¥à¤¯à¤¤à¤¨" बटन दबाà¤à¤. +CollectEarthWindow.36=ऑपरेटर नाम रिकà¥à¤¤ नहीं हो सकता +CollectEarthWindow.37=खà¥à¤²à¤¾ रखो +CollectEarthWindow.38=सीà¤à¤¸à¤µà¥€ फ़ाइल +CollectEarthWindow.39=सूचना\: यह सलाह दी जाती है कि आप नठडेटा डालने करने से पहले अपने मौजूदा आंकडों को बैकअप(à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤) कर लें +CollectEarthWindow.4=à¤à¤«à¤à¤“ असà¥à¤µà¥€à¤•रण नोटिस +CollectEarthWindow.40=उस फ़ोलà¥à¤¡à¤° पर जाà¤à¤‚ जहां साà¤à¤•ॠसरà¥à¤µà¤° में सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ किया गया है, फ़ोलà¥à¤¡à¤° का रासà¥à¤¤à¤¾ उपकरण> गà¥à¤£> उनà¥à¤¨à¤¤ टैब. +CollectEarthWindow.41=निरà¥à¤¯à¤¾à¤¤ डेटा को फ़ाइल में बचाया जा रहा है \: +CollectEarthWindow.42=छोड़ना +CollectEarthWindow.43=परसà¥à¤ªà¤° विरोधी रिकॉरà¥à¤¡ पाया +CollectEarthWindow.44=डेटा आयात / निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.45=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ डेटा (संकà¥à¤šà¤¿à¤¤) +CollectEarthWindow.46=ज़िप से नठडेटा आयात करें (संकà¥à¤šà¤¿à¤¤ à¤à¤•à¥à¤¸à¤à¤®à¤à¤²) +CollectEarthWindow.55=सीà¤à¤¸à¤µà¥€ का उपयोग कर मौजूदा रिकॉरà¥à¤¡ को अपडेट करें +CollectEarthWindow.47=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. +CollectEarthWindow.48=ज़िप / à¤à¤•तà¥à¤°-डेटा फ़ाइल +CollectEarthWindow.49=फà¥à¤¯à¥‚जन सीà¤à¤¸à¤µà¥€ फ़ाइल +CollectEarthWindow.5=बंद करे +CollectEarthWindow.50= उपयोगकरà¥à¤¤à¤¾ मैनà¥à¤…ल खोलें +CollectEarthWindow.51=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ के अदà¥à¤¯à¤¤à¤¨ के लिठजाà¤à¤š करें +CollectEarthWindow.52= अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— लॉग फ़ाइल खोलें +CollectEarthWindow.53=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ लॉग फ़ाइल +CollectEarthWindow.54=केà¤à¤®à¤à¤² से लोड अंक +CollectEarthWindow.56=के विषय में... +CollectEarthWindow.57=साà¤à¤•ॠसà¥à¤Ÿà¤¾à¤°à¥à¤Ÿà¤° पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ अभी भी चल रहा है, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें. +CollectEarthWindow.58=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ नहीं कर सकते +CollectEarthWindow.59=आप साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ के लिठडेटा सेट फिर से उतà¥à¤ªà¤¨à¥à¤¨ करने के लिठकरना चाहते हैं?
यह पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ समय लेने वाली हो सकती है.
आप यदि "हाà¤"पर कà¥à¤²à¤¿à¤• करें, तो नवीनतम जानकारी के साथ à¤à¤• नया डाटासेट उतà¥à¤ªà¤¨à¥à¤¨ हो जाà¤à¤—ा. +CollectEarthWindow.6=फà¥à¤¯à¥‚जन टेबल के लिठनिरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.60=साà¤à¤•ॠडेटा उतà¥à¤ªà¤¨à¥à¤¨ +CollectEarthWindow.61=डेटा à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ (पिछले निरà¥à¤¯à¤¾à¤¤ के बाद से संशोधित रिकॉरà¥à¤¡) +CollectEarthWindow.62=के विषय मे... +CollectEarthWindow.63=केà¤à¤®à¤à¤² से अंक पà¥à¤°à¤¾à¤ªà¥à¤¤ करने में तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.64=तकनीकी सहायता +CollectEarthWindow.7=डेटा आयात में तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.8=असà¥à¤µà¥€à¤•रण पाठ नहीं पाया जा सका +CollectEarthWindow.9=डेटा आयात रिकॉरà¥à¤¡ वह है जो कि पहले से ही अपने डेटाबेस पर मौजूद हैं शामिल. +DynamicsCode.0=पà¥à¤°à¤¾à¤°à¤‚भ में वन +DynamicsCode.1=पà¥à¤°à¤¾à¤°à¤‚भ में घास का मैदान, +DynamicsCode.2=पà¥à¤°à¤¾à¤°à¤‚भ में आबादी वाला इलाका +DynamicsCode.3=पà¥à¤°à¤¾à¤°à¤‚भ में बंजर +DynamicsCode.4=पà¥à¤°à¤¾à¤°à¤‚भ में आरà¥à¤¦à¥à¤° भूमि +DynamicsCode.5=पà¥à¤°à¤¾à¤°à¤‚भ में खेत +OpenTextFileListener.0=इस पाठ का फ़ाइल नहीं मिला \: +OptionWizard.0= विकलà¥à¤ª +OptionWizard.1=बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° चà¥à¤¨à¥‡à¤‚ +OptionWizard.10=बैकअप फ़ोलà¥à¤¡à¤° खोलें +OptionWizard.11=अजà¥à¤žà¤¾à¤¤\: उपयोग ifconfig +OptionWizard.12=गà¥à¤°à¤¾à¤¹à¤•ों का उलà¥à¤²à¥‡à¤– +OptionWizard.13=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° आईपी +OptionWizard.14=कतà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ (उदाहरण- 8023) +OptionWizard.15=बचाà¤à¤‚ और परिवरà¥à¤¤à¤¨ लागू करें +OptionWizard.16=आईडी +OptionWizard.17=X- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क +OptionWizard.18=Y- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क +OptionWizard.19=उठान +OptionWizard.2=कारà¥à¤¯à¤ªà¥à¤°à¤µà¤¾à¤¹ (सरà¥à¤µà¤° / गà¥à¤°à¤¾à¤¹à¤•) +OptionWizard.20=गूगल अरà¥à¤¥ अंतरà¥à¤µà¤¸à¥à¤¤à¥ बदल दिया गया है
यदि गà¥à¤—ल अरà¥à¤¥ आप से कहे,अंतरà¥à¤µà¤¸à¥à¤¤à¥ पà¥à¤¨à¤ƒ लोड सà¥à¤µà¥€à¤•ार करें . +OptionWizard.21=अदà¥à¤¯à¤¤à¤¨ सफल +OptionWizard.22=ढाल +OptionWizard.23=गूगल अरà¥à¤¥ डेटा को फिर से खोलने में कोई तà¥à¤°à¥à¤Ÿà¤¿ थी +OptionWizard.24=रदà¥à¤¦ करना +OptionWizard.25=ऑपरेशन मोड +OptionWizard.26=डीबी होसà¥à¤Ÿ +OptionWizard.27=यह à¤à¤• मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ साà¤à¤•ॠफ़ोलà¥à¤¡à¤° नहीं है ( सà¥à¤Ÿà¤¾à¤°à¥à¤Ÿ-साà¤à¤•à¥.batफ़ाइल मौजूद नहीं है) +OptionWizard.28=साà¤à¤•ॠसरà¥à¤µà¤° मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ नहीं +OptionWizard.29=डीबी पोरà¥à¤Ÿ +OptionWizard.3=सरà¥à¤µà¤° आवृतà¥à¤¤à¤¿ +OptionWizard.30=à¤à¤¸à¤•à¥à¤¯à¥ लाइट विकलà¥à¤ª +OptionWizard.31=सेमà¥à¤ªà¤² डेटा +OptionWizard.32=पà¥à¤²à¥‰à¤Ÿ लेआउट +OptionWizard.33=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ परिभाषा +OptionWizard.34=विकसित +OptionWizard.35=सेमà¥à¤ªà¤² अंक की संखà¥à¤¯à¤¾ +OptionWizard.36=सेमà¥à¤ªà¤² बिंदॠके बीच दूरी (मीटर में) +OptionWizard.37=भूखंड की सीमा के साथ मारà¥à¤œà¤¿à¤¨ (मीटर मे) +OptionWizard.38=सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सही ढंग से पढ़ा नहीं जा सकता.
इस फ़ाइल में à¤à¤• अलà¥à¤ªà¤µà¤¿à¤°à¤¾à¤® से अलग मूलà¥à¤¯à¥‹à¤‚ की उमà¥à¤®à¥€à¤¦ है \:
+OptionWizard.39=आईडी, वाई समनà¥à¤µà¤¯, à¤à¤•à¥à¤¸ समनà¥à¤µà¤¯, ऊंचाई, ढाल, पहलू +OptionWizard.4=वरà¥à¤¤à¤®à¤¾à¤¨ कंपà¥à¤¯à¥‚टर आईपी \: +OptionWizard.40=परियोजनाà¤à¤‚ +OptionWizard.41=à¤à¤• नई परियोजना फ़ाइल लोड करें +OptionWizard.42=सीà¤à¤¸à¤µà¥€ पाठक को बंद करते समय तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.43=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ का नाम +OptionWizard.44= सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ बैकअप डेटाबेस +OptionWizard.45=ओपन पृथà¥à¤µà¥€ इंजन ने पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° में जूम किया +OptionWizard.46=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठपृथà¥à¤µà¥€ इंजन टाइमलैपà¥à¤¸ खोलें +OptionWizard.47=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठबिंग मैपà¥à¤¸ खोलें +OptionWizard.48=बजाय गूगल अरà¥à¤¥ के फॉरà¥à¤® à¤à¤• बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° पर खोलें (लिनकà¥à¤¸ के लिठसिफारिश) +OptionWizard.49=भूखंड डेटा के साथ सीईडी / सीà¤à¤¸à¤µà¥€ फाइल भेजने के लिठपथ +OptionWizard.5=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ\: +OptionWizard.50=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.51=परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.52=केवल निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क के साथ सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल +OptionWizard.53=चौकोर +OptionWizard.54=केनà¥à¤¦à¥à¤°à¥€à¤¯ बिनà¥à¤¦à¥ +OptionWizard.55=परियोजना फ़ोलà¥à¤¡à¤° आयात तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.56=लोड परियोजना +OptionWizard.57=पहले से लोड परियोजना +OptionWizard.58= जी ई ई का मैदान खोलें (विशà¥à¤µà¤¸à¤¨à¥€à¤¯ जांचकरà¥à¤¤à¤¾ के उपयोग की आवशà¥à¤¯à¤•ता है) +OptionWizard.59=यहां भूखंड पर केंदà¥à¤°à¤¿à¤¤ मैपà¥à¤¸ खोलें +OptionWizard.6=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² डीबी मापदंड +OptionWizard.65=साà¤à¤•à¥à¤«à¤¼à¥‹à¤²à¥à¤¡à¤° का पथ +OptionWizard.66=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.67=फ़ायरफ़ॉकà¥à¤¸ निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ +OptionWizard.68=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.7=उपयोगकरà¥à¤¤à¤¾ नाम +OptionWizard.70=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों +OptionWizard.72=बाइनरी फ़ाइलें +OptionWizard.73=कà¥à¤°à¥‹à¤® निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ +OptionWizard.74=बà¥à¤°à¤¾à¤‰à¤œ +OptionWizard.76=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों +OptionWizard.78=बाइनरी फ़ाइलें +OptionWizard.79=केà¤à¤®à¤à¤² फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ के लिठपथ +OptionWizard.8=पासवरà¥à¤¡ +OptionWizard.80=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.82=फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ +OptionWizard.83=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ पà¥à¤°à¤ªà¤¤à¥à¤° डिज़ाइन करने के लिठपथ +OptionWizard.84=बà¥à¤°à¤¾à¤‰à¤œ..... +OptionWizard.86=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² वेब पेज +OptionWizard.87=पथ आइडीà¤à¤® परिभाषा के साथ à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठ+OptionWizard.88=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.9=डीबी नाम +OptionWizard.90=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² आइडीà¤à¤® परिभाषा +OptionWizard.91=सरà¥à¤µà¤° (पà¥à¤°à¤¬à¤‚धक संसà¥à¤•रण या खड़े अकेले का उपयोग करें) +OptionWizard.92=कà¥à¤²à¤¾à¤‡à¤‚ट (ऑपरेटर / सरà¥à¤µà¤° से जà¥à¤¡à¤¼à¥‡) +OptionWizard.93=सकà¥à¤¯à¥‚à¤à¤²à¤¾à¤‡à¤Ÿ (à¤à¤‚बेडेड / à¤à¤•ल फाइल आधारित) +OptionWizard.94=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² +OptionWizard.95=सेमà¥à¤ªà¤² डॉटà¥à¤¸ के साइड (मीटर में) +SaikuAnalysisListener.0=हाठ- ताज़ा साà¤à¤•ॠडेटा (लंबी पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾) +SaikuAnalysisListener.1=नहीं - बस साà¤à¤•ॠशà¥à¤°à¥‚ +SaikuStarter.1=साà¤à¤•ॠशà¥à¤°à¥‚ +SaikuStarter.2= साà¤à¤•ॠशà¥à¤°à¥‚ कà¥à¤› मिनट लग सकते हैं, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें\! +SaveEarthDataServlet.0=खाली अनà¥à¤°à¥‹à¤§ +SaveEarthDataServlet.1= डेटाबेस में डेटा बचाते समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ है +SaveEarthDataServlet.2=डेटा बचाया था +SlopeCode.0=समतल (0-5) +EarthApp.11=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ पहले से ही चल रहा है +EarthApp.21=à¤à¤• सीà¤à¤¸à¤µà¥€ / सीईडी के रूप में भूखंडों की गà¥à¤°à¤¿à¤¡ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
+EarthApp.23=कोई सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सेट-अप नहीं किया गया है \:

+EarthApp.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² परिभाषा के साथ फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है \:
+EarthApp.26=कोई à¤à¤•à¥à¤¸à¤à¤®à¤à¤² फ़ाइल परिभाषा सेट अप नहीं किया गया है \:

+EarthApp.27=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ रूप से यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
+EarthApp.29=कोई à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ फ़ाइल सेट-अप नहीं किया गया है \:

+EarthApp.3=मà¥à¤à¥‡ बाद में याद दिलाना +EarthApp.30=उपकरण> गà¥à¤£ मेनू में फ़ाइल सà¥à¤¥à¤¾à¤¨ को ठीक करें . +EarthApp.4=अभी अदà¥à¤¯à¤¤à¤¨ करें +EarthApp.5=मà¥à¤à¥‡ दà¥à¤¬à¤¾à¤°à¤¾ याद मत दिलाना +EarthApp.57=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ का à¤à¤• नया संसà¥à¤•रण उपलबà¥à¤§ है\!
आप कैसे आगे बढ़ना चाहते हैं? +EarthApp.58=अदà¥à¤¯à¤¤à¤¨ चेतावनी +EarthApp.59= परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ +EarthApp.6=\ - संसà¥à¤•रण +EarthApp.61=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ फाइल खà¥à¤² नहीं सकती .
कृपया सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करें कि गूगल अरà¥à¤¥ सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ है. +EarthSurveyService.9=आवशà¥à¤¯à¤• कà¥à¤·à¥‡à¤¤à¥à¤° +ExportActionListener.1= तारीख चूनें जबसे रिकॉरà¥à¤¡ निरà¥à¤¯à¤¾à¤¤ करने है +ExportDialogProcessMonitor.0=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... +ExportDialogProcessMonitor.1=पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ पà¥à¤°à¤¾à¤°à¤‚भ करने के लिठपà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ कर रहा है \: +ExportDialogProcessMonitor.4=निरà¥à¤¯à¤¾à¤¤ रिकॉरà¥à¤¡\: +ImportProcessMonitorDialog.0=आयातित रिकॉरà¥à¤¡ \: +ImportActionListener.0=कà¥à¤¯à¤¾ उन भूखंडों के लिठडेटा जो कि पूरी तरह से भरे नहीं गठ,आयातित किया जाना चाहिà¤? +ImportActionListener.2=आप कà¥à¤²à¤¿à¤• करें, नहींतो केवल डेटा "हरी" राजà¥à¤¯ में भूखंडों से ,जिसमें सभी डेटा यà¥à¤•à¥à¤¤ है , आयात किया जाà¤à¤—ा। +ImportDialogProcessMonitor.0=\ गणना +ImportDialogProcessMonitor.11=रिकॉरà¥à¤¡ की पà¥à¤°à¤¾à¤°à¤‚भिक संखà¥à¤¯à¤¾ \: +ImportDialogProcessMonitor.2=रिकॉरà¥à¤¡ आयात... +ImportDialogProcessMonitor.5=आयातित रिकॉरà¥à¤¡ की वासà¥à¤¤à¤µà¤¿à¤• संखà¥à¤¯à¤¾ \: +ImportDialogProcessMonitor.8=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... +InfiniteProgressMonitor.0=रदà¥à¤¦ ऑपरेशन +JFileChooserExistsAware.0=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ परियोजना फ़ाइल +KmlImportService.13=पà¥à¤²à¥‰à¤Ÿ सà¥à¤¥à¤¾à¤¨à¥‹à¤‚ को बचाने के लिठà¤à¤• सीà¤à¤¸à¤µà¥€ फ़ाइल का चयन करें +MissingPlotsListener.0=तà¥à¤°à¥à¤Ÿà¤¿ उन भूखंडों के बारे में जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ करने के लिठजो डेटाबेस पर मौजूद नहीं +MissingPlotsListener.1=गà¥à¤® भूखंड +MissingPlotsListener.10=सेमà¥à¤ªà¤² डिजाइन में भूखंडों की कà¥à¤² संखà¥à¤¯à¤¾ \: +MissingPlotsListener.12=गà¥à¤® भूखंडों की संखà¥à¤¯à¤¾ \: +MissingPlotsListener.14=सभी भूखंडों भर रहे हैं\! +MissingPlotsListener.2=कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ अंतरà¥à¤µà¤¸à¥à¤¤à¥ की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ +MissingPlotsListener.3=भूखंड की जानकारी वाले फ़ाइलें चà¥à¤¨à¥‡à¤‚ ( .सीà¤à¤¸à¤µà¥€ या .सीईडी फ़ाइलें ) जिसके लिठआप जानना चाहते हैं तो सभी डेटा भर दिया गया है चाहता हूà¤. +MissingPlotsListener.4=गà¥à¤® भूखंड- जानकारी +MissingPlotsListener.5=फ़ाइल से \: +MissingPlotsListener.6=सीà¤à¤¡à¥€ फ़ाइल में निरà¥à¤¯à¤¾à¤¤ करें +ProcessMonitorDialog.1=पंकà¥à¤¤à¤¿ संखà¥à¤¯à¤¾ पर तà¥à¤°à¥à¤Ÿà¤¿ +ProcessMonitorDialog.4=, कॉलम +ProcessMonitorDialog.5=\ --मूलà¥à¤¯ +YES= हां +YES_TO_ALL=सब को हां +NO=नहीं +NO_TO_ALL=सभी को नहीं + + + From a4a5c085a495819ead5a9e683ac5105b1a76a361 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:27 +0100 Subject: [PATCH 0852/1620] New translations Messages_hi.properties (English) --- .../earth/app/view/Messages_en.properties | 483 +++++++++--------- 1 file changed, 228 insertions(+), 255 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 5199a9b624..f759c433b0 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,255 +1,228 @@ -AboutDialog.19=UN problème est apparu -AboutDialog.5=Pour plus d’infos, visitez notre site web OpenForis.org -AboutDialog.6=Désolé, il y a eu un problème lors de l’ouverture du lien avec votre navigateur par défaut. -AboutDialog.8=Ok -AspectCode.0=Nord -AspectCode.1=Nord-Est -AspectCode.2=Est -AspectCode.3=Sud-Est -AspectCode.4=Sud -AspectCode.5=Sud-Ouest -AspectCode.6=Ouest -AspectCode.7=Nord-Ouest -CollectEarthMenu.0=Importe le fichier .CEP -CollectEarthMenu.2=Utilitaires -CollectEarthMenu.3=Divise un large tableau CSV en plusieurs parties -CollectEarthMenu.4=Exporte les données en XML (à partir d'une date précise jusqu'à aujourd'hui) -CollectEarthMenu.5=Exporte sur la sauvegarde Collect Backup -CollectEarthMenu.6=Exporte les données en tant que sauvegarde Collect Backup (toutes les données) -CollectEarthMenu.7=Exporte les données en tant que sauvegarde Collect Backup (à partir de) -CollectEarthMenu.8=Exporte les données en XML (filtrer par attribut) -CollectEarthWindow.0=Erreur pendant l'exportation des données en csv -CollectEarthWindow.10=Fichier -CollectEarthWindow.11=Quitter -CollectEarthWindow.12=Outils -CollectEarthWindow.13=Télécharger les données en CSV (Excel) -CollectEarthWindow.14=Démarrer l'analyse avec Saïku -CollectEarthWindow.15=Propriétés -CollectEarthWindow.16=Aide -CollectEarthWindow.17=Avertissement -CollectEarthWindow.18=Trouver les placettes manquantes dans la base de données -CollectEarthWindow.19=Collect Earth -CollectEarthWindow.1=Erreur d'exportation -CollectEarthWindow.20=Nombre d'enregistrements dupliqués -CollectEarthWindow.21=Icône non trouvée -CollectEarthWindow.22= Êtes-vous sûr de vouloir fermer CollectEarth
Fermer cette fenêtre fermera aussi le serveur -CollectEarthWindow.23=Confirmation requise -CollectEarthWindow.24=Exporter en XML -CollectEarthWindow.25=Voulez-vous ajouter tout de même ces données et perdre vos enregistrements? -CollectEarthWindow.26=Utilisateur -CollectEarthWindow.27=Appliquer -CollectEarthWindow.28=Le serveur devrait être démarré pour la saisie des données par les utilisateurs. -CollectEarthWindow.29=Le serveur Saiku n'est pas configuré. -CollectEarthWindow.2=Langue -CollectEarthWindow.30=Veuillez garder cette fenêtre active pendant que vous utilisez Google Earth -CollectEarthWindow.31=Exporter les données collectées en CSV -CollectEarthWindow.32=Fermer -CollectEarthWindow.33=Le nom de l'utilisateur doit comprendre entre 5 et 50 caractères -CollectEarthWindow.34=Erreur de validation -CollectEarthWindow.35= NOM DE L'UTILISATEUR VIDE\!
Veuillez renseigner le champs et Appuyer sur "Mise à jour" -CollectEarthWindow.36=Le nom de l'utilisateur ne peut pas être vide -CollectEarthWindow.37=Laisser ouvert -CollectEarthWindow.38=Fichiers CSV -CollectEarthWindow.39=NOTE \: Il est conseillé de sauvegarder vos données (export en XML) avant d'importer de nouvelles données -CollectEarthWindow.3=\ Erreur pendant l'importation -CollectEarthWindow.40=Renseigner le chemin jusqu'au serveur Saiku dans /Outils/Propriétés/Avancé. -CollectEarthWindow.41=Sauvegarde des données exportées dans le fichier\: -CollectEarthWindow.42=Quitter -CollectEarthWindow.43=Enregistrements conflictuels trouvés -CollectEarthWindow.44=Importer/Exporter les données -CollectEarthWindow.45=Exporter les données en XML (zippé) -CollectEarthWindow.46=Importer de nouvelles données depuis ZIP (XML zippé) -CollectEarthWindow.47=Le serveur Saiku n'est pas configuré -CollectEarthWindow.48=Fichier zip/collect-data -CollectEarthWindow.49=Fusion des fichiers CSV -CollectEarthWindow.4=Clause de non-responsabilité de la FAO -CollectEarthWindow.50=Ouvrir le manuel utilisateur -CollectEarthWindow.51=Vérifier les mises à jour des Collect Earth -CollectEarthWindow.52=Fichier de logs Open Application -CollectEarthWindow.53=Fichier de logs Collect Earth -CollectEarthWindow.54=Charger les points de KML -CollectEarthWindow.55=Mettre à jour les enregistrements en utilisant un fichier CSV -CollectEarthWindow.56=A propos... -CollectEarthWindow.57=Le processus de démarrage de Saïku est en cours, veuillez patienter -CollectEarthWindow.58=Impossible de démarrer l'analyse avec Saïku -CollectEarthWindow.59=Voulez-vous régénérer le jeu de données?
Cela peut prendre du temps.
Cliquer sur oui pour régénérer un nouveau jeu de données avec les dernières informations -CollectEarthWindow.5=Fermer -CollectEarthWindow.60=Génération des données Saïku -CollectEarthWindow.61=Exporter en XML (uniquement les enregistrements modifiés/ajoutés) -CollectEarthWindow.62=A propos… -CollectEarthWindow.63=Erreur en accédant aux points de KML -CollectEarthWindow.64=Assistance technique -CollectEarthWindow.65=Le nom de l'opérateur a été changé -CollectEarthWindow.66=Nom de l'opérateur -CollectEarthWindow.67=Ouvrir le dossier de données de CE -CollectEarthWindow.6=Exporter en Table de Fusion -CollectEarthWindow.70=Ouvrez le manuel de cette enquête -CollectEarthWindow.71=Générer un outil Saiku autonome -CollectEarthWindow.7=Erreur pendant l'importation des données -CollectEarthWindow.8=Le texte est introuvable -CollectEarthWindow.9=Les données importées contiennent des redondances avec celles présentes dans la base -DynamicsCode.0= Terre Forestière initialement -DynamicsCode.1= Prairie initialement -DynamicsCode.2= Etablissement initialement -DynamicsCode.3= Autre terre initialement -DynamicsCode.4= Terre humide initialement -DynamicsCode.5= Terre cultivée initialement -EarthApp.11=Collect Earth est déjà en cours d’exécution -EarthApp.21=Le fichier CSV/CED contenant les points est introuvable \:
-EarthApp.23=Aucun fichier CSV/CED spécifié \:

-EarthApp.24=Le fichier contenant le modèle de définition KML est introuvable \:
-EarthApp.26=Aucun modèle de définition spécifié\:

-EarthApp.27=Le fichier contenant le ballon HTML est introuvable \:
-EarthApp.29=Aucun ballon HTML spécifié \:

-EarthApp.30=Veuillez corriger le chemin d’accès dans le menu Outils -> Propriétés. -EarthApp.3=Rappelez le moi plus tard -EarthApp.4=Mettre a jour maintenant -EarthApp.57= Une nouvelle version de Collect Earth est disponible\! Utiliser le Menu -EarthApp.58=Alerte de mise à jour -EarthApp.59=Erreur pendant l’importation du fichier -EarthApp.5=Ne me le rappelez plus -EarthApp.61=Le fichier Collect Earth est introuvable br/>Veuillez-vous assurer que Google Earth est installé. -EarthApp.6=\ - Version -EarthApp.70=AVERTISSMENT -EarthApp.71=Sous Mac OS X, les fichiers de projet Collect Earth (* .cep) ne s'ouvriront pas dans Collect Earth lorsqu'ils sont double-cliqués.
-EarthApp.72=Utilisez la barre d'outils Collect Earth pour ouvrir les fichiers .cep \: -EarthApp.73=Collect Earth - problèmes sur les ordinateurs Mac OS X -EarthSurveyService.9=Champs requis -ExportActionListener.1=Choisir la date pour les données à exporter -ExportDialogProcessMonitor.0=Chargement des données... -ExportDialogProcessMonitor.1=Attente d'initialisation de l'export -ExportDialogProcessMonitor.4=Enregistrements exportés \: -ImportActionListener.0=Est-ce que les données pour les placettes qui ne sont pas complètes doivent être importées ? -ImportActionListener.2=Si vous cliquez sur NO, seulement les données provenant des placettes avec la marque « verte », qui contiennent toutes les données, seront importées -ImportActionListener.3=Importer les enregistrements incomplets -ImportDialogProcessMonitor.0=Calcul en cours -ImportDialogProcessMonitor.11=Nombre initial d' enregistrements \: -ImportDialogProcessMonitor.2=Chargement des enregistrements... -ImportDialogProcessMonitor.5=Nombre réel d'enregistrements importés\: -ImportDialogProcessMonitor.8=Chargement des données... -ImportProcessMonitorDialog.0=Enregistrements importés \: -ImportXMLDialogProcessMonitor.1 = Écraser les données dans la base de données -ImportXMLDialogProcessMonitor.2 = Importer uniquement des enregistrements non conflictuels -InfiniteProgressMonitor.0=Annuler l’opération -JFileChooserExistsAware.0=Fichier projet Collect Earth -KmlImportService.13=Sélectionnez un fichier CSV pour enregistrer les emplacements des parcelles -MissingPlotsListener.0=Erreur au cours de l’enregistrement des placettes absentes de la base de données -MissingPlotsListener.10=Nombre total de parcelles dans le plan d'échantillonnage \: -MissingPlotsListener.12=Nombre de parcelles manquantes \: -MissingPlotsListener.14=Toutes les parcelles sont remplis\! -MissingPlotsListener.1=Placettes manquantes -MissingPlotsListener.2=Copier le contenu sur le clipboard -MissingPlotsListener.3=Choisir les fichiers qui contiennent les informations des placettes (.csv ou .ced) pour lesquelles vous voulez savoir si toues les placettes ont été renseignées -MissingPlotsListener.4=Placettes manquantes – Information -MissingPlotsListener.5=Depuis le fichier \: -MissingPlotsListener.6=Exporter en CED -NO=Non -NO_TO_ALL=Non à tous -OpenTextFileListener.0=Le fichier texte n'a pas été trouvé dans \: -OptionWizard.0=Options Collect Earth -OptionWizard.100=Ouvrir Planet -OptionWizard.101=Clé API Planet -OptionWizard.1021=URL SecureWatch -OptionWizard.102=Ouvrir Maxar SecureWatch -OptionWizard.103=Définir le URL pour le Carte Extra (ouvre quand il est réglé) \: -OptionWizard.104=Navigateurs -OptionWizard.105=Ouvrir Earth Map -OptionWizard.110=Utiliser les images mensuelles fournies par NICFI -OptionWizard.10=Montrer les fichiers de sauvegarde -OptionWizard.11=Inconnu \: utiliser ifconfig -OptionWizard.12=Instance client -OptionWizard.13=IP Serveur de Collect Earth -OptionWizard.14=Port Serveur de Collect Earth (e.g. 8023) -OptionWizard.15=Appliquer et sauvegarder les changements -OptionWizard.16=ID -OptionWizard.17=Coord-X -OptionWizard.18=Coord-Y -OptionWizard.19=Altitude -OptionWizard.1=Choisir un navigateur -OptionWizard.20= Le contenu de Google Earth a changé
Veuillez accepter la mise à jour quand GE le demande -OptionWizard.21=Mise à jour réussie -OptionWizard.22=Pente -OptionWizard.23=Il y a eu une erreur pendant la réouverture de Google Earth -OptionWizard.24=Annuler -OptionWizard.25=Mode opération -OptionWizard.26=Hôte pour la BDD -OptionWizard.27=Le dossier n'est pas valide (il manque le fichier start-saiku.bat) -OptionWizard.28=Le dossier Saiku n'est pas reconnu -OptionWizard.29=Port pour la BDD -OptionWizard.2=Flux (serveur/client) -OptionWizard.30=Options SQLite -OptionWizard.31=Points d'échantillonnage -OptionWizard.32=Configuration de la parcelle -OptionWizard.33=Définition de l'enquête -OptionWizard.34=Services intégrés -OptionWizard.35=Nombre de points de contrôle -OptionWizard.36=Distance entre les points de contrôle (en mètres) -OptionWizard.37=Distance au bord de la parcelle (en mètres) -OptionWizard.38=Le Fichier CSV/CED ne peut pas être lu
Le fichier devrait avoir des valeurs séparées par des virgules comme ceci \:
-OptionWizard.39=ID,Coordonnée_Y, Coordonnée_X,altitude,pente,orientation -OptionWizard.3=Instance serveur -OptionWizard.40=Projets -OptionWizard.41=Charger un nouveau fichier projet -OptionWizard.42=Erreur pendant la fermeture du lecteur CSV -OptionWizard.43=Nom de l'enquête -OptionWizard.44=Sauvegarder automatiquement la base dans -OptionWizard.45=Ouvrir Earth Engine Playground (obsolète) -OptionWizard.46=Ouvrir le Timelapse de Google Earth Engine -OptionWizard.47=Ouvrir Bing Maps -OptionWizard.48=Ouvrir le formulaire dans un navigateur plutôt que dans GE (recommandé pour Linux) -OptionWizard.49=Chemin jusqu'au fichier ced/csv avec les données des parcelles -OptionWizard.4=IP actuelle de l'ordinateur -OptionWizard.50=Parcourir -OptionWizard.51=Erreur pendant l'importation du fichier -OptionWizard.52=Fichier CSV/CED uniquement avec des coordonnées -OptionWizard.53=Pas de points -OptionWizard.54=Point central -OptionWizard.55=Erreur pendant l'importation du dossier projet -OptionWizard.56=Charger le projet -OptionWizard.57=Projets chargés précedemment -OptionWizard.58=Ouvrir GEE Code Editor (nécessite un accès restreint Trusted Tester) -OptionWizard.59=Ouvrir Here Maps -OptionWizard.5=Port Serveur Collect Earth \: -OptionWizard.65=Chemin jusqu'au serveur Saiku -OptionWizard.66=Parcourir -OptionWizard.67=Chemin jusqu'à Firefox -OptionWizard.68=Parcourir -OptionWizard.6=Paramètres de la BD PostGreSQL -OptionWizard.70=Fichiers exécutables -OptionWizard.72=Fichiers binaires -OptionWizard.73=Chemin jusqu'à Chrome -OptionWizard.74=Parcourir -OptionWizard.76=Fichiers exécutables -OptionWizard.78=Fichiers binaires -OptionWizard.79=Chemin jusqu'au modèle Freemarker KML -OptionWizard.7=Nom d'utilisateur -OptionWizard.80=Parcourir -OptionWizard.82=Modèle Freemarker -OptionWizard.83=Chemin jusqu'au Ballon HTML -OptionWizard.84=Parcourir -OptionWizard.86=Page web HTML -OptionWizard.87=Chemin jusqu'au fichier XML contenant la définition IDM -OptionWizard.88=Parcourir -OptionWizard.8=Mot de passe -OptionWizard.90=Définition IDM XML -OptionWizard.91=Serveur (version gestionnaire ou autonome) -OptionWizard.92=Client (opérateur/connecté au serveur) -OptionWizard.93=SQLite (Fichier intégré / Unique) -OptionWizard.94=PostgreSQL -OptionWizard.95=Côté des points d'échantillonnage (en mètres) -OptionWizard.9=Nom de la base -ProcessMonitorDialog.1=Erreur d’interprétation sur numéro de rangée -ProcessMonitorDialog.4=, colonnes -ProcessMonitorDialog.5=\ -- valeures -SaikuAnalysisListener.0=Oui - Rafraichir les données Saiku (processus long) -SaikuAnalysisListener.1=Non - Utiliser la même version des données que la dernière fois que Saiku a été utilisé -SaikuToolExportListener.1=Génération de l'outil Saiku -SaikuToolExportListener.2=Génération de l'outil Saiku avec la base de données actuelle -SaikuStarter.1=Démarrer Saïku -SaikuStarter.2=Démarrer Saïku peut prendre plusieurs minutes, veuillez patienter\! -SaveEarthDataServlet.0=Requête vide -SaveEarthDataServlet.1=Problème lors de la sauvegarde de la base de données -SaveEarthDataServlet.2=Les données ont été sauvées -SlopeCode.0=Plan (0-5) -YES=Oui -YES_TO_ALL=Oui à tous \ No newline at end of file +AboutDialog.19=कोई समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ +AboutDialog.5=अधिक जानकारी के लिठहमारी वेबसाइट पर जाà¤à¤‚ OpenForis.org +AboutDialog.6=कà¥à¤·à¤®à¤¾ करें, à¤à¤• समसà¥à¤¯à¤¾ आपके सिसà¥à¤Ÿà¤® के मानक बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में इस लिंक को खोलने की कोशिश कर रही है. +AboutDialog.8=ठीक +AspectCode.0=उतà¥à¤¤à¤° दिशा +AspectCode.1=उतà¥à¤¤à¤°-पूरà¥à¤µ दिशा +AspectCode.2=पूरà¥à¤µ दिशा +AspectCode.3=दकà¥à¤·à¤¿à¤£-पूरà¥à¤µ दिशा +AspectCode.4=दकà¥à¤·à¤¿à¤£ दिशा +AspectCode.5=दकà¥à¤·à¤¿à¤£-पशà¥à¤šà¤¿à¤® दिशा +AspectCode.6=पशà¥à¤šà¤¿à¤® दिशा +AspectCode.7=उतà¥à¤¤à¤°-पशà¥à¤šà¤¿à¤® दिशा +CollectEarthWindow.0=तà¥à¤°à¥à¤Ÿà¤¿ जब सीà¤à¤¸à¤µà¥€ फ़ाइल में डेटा निरà¥à¤¯à¤¾à¤¤ करने का पà¥à¤°à¤¯à¤¾à¤¸ +CollectEarthWindow.1=निरà¥à¤¯à¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.10=फ़ाइल +CollectEarthWindow.11=बाहर जाà¤à¤‚ +CollectEarthWindow.12=उपकरण +CollectEarthWindow.13=डेटा सीà¤à¤¸à¤µà¥€ निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.14=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ +CollectEarthWindow.15=गà¥à¤£ +CollectEarthWindow.16=मदद +CollectEarthWindow.17=असà¥à¤µà¥€à¤•रण +CollectEarthWindow.18=डेटाबेस में लापता भूखंडों खोजें +CollectEarthWindow.19=पृथà¥à¤µà¥€ इकटà¥à¤ à¤¾ +CollectEarthWindow.2=भाषा +CollectEarthWindow.20=डà¥à¤ªà¥à¤²à¤¿à¤•ेट रिकॉरà¥à¤¡ की संखà¥à¤¯à¤¾\: +CollectEarthWindow.21=मà¥à¤–à¥à¤¯ फà¥à¤°à¥‡à¤® के लिठआइकन नहीं मिल सकता है +CollectEarthWindow.22=आपको लगता है कि आप à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ बंद करना चाहते हैं? विंडोज बंद करने से, à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° बंद हो जाà¤à¤—ा +CollectEarthWindow.23=पà¥à¤·à¥à¤Ÿà¤¿ की जरूरत है +CollectEarthWindow.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.25=आप वैसे भी इन अभिलेखों को जोड़ना चाहते हैं और अपने वरà¥à¤¤à¤®à¤¾à¤¨ डेटा खोने के लिठकिलक करना चाहते हैं? +CollectEarthWindow.26=ऑपरेटर,पà¥à¤°à¤šà¤¾à¤²à¤• +CollectEarthWindow.27=अदà¥à¤¯à¤¤à¤¨ +CollectEarthWindow.28= औपन फौरिस à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° चल रहा होना चाहिठ, जबभी ऑपरेटर डेटा की वà¥à¤¯à¤¾à¤–à¥à¤¯à¤¾ करें . +CollectEarthWindow.29=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. +CollectEarthWindow.3= आयात संबंधी तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.30=जबभी आप गà¥à¤—ल अरà¥à¤¥ का उपयोग कर रहे हैं, कृपया इस विंडोज को खà¥à¤²à¥€ बनाठरखें. +CollectEarthWindow.31=à¤à¤•तà¥à¤° डेटा सीà¤à¤¸à¤µà¥€ फाइल में भेजें +CollectEarthWindow.32=छोड़ना +CollectEarthWindow.33=ऑपरेटर का नाम के 5 अकà¥à¤·à¤° से बड़ा और 50 अकà¥à¤·à¤° से कम होना चाहिठ+CollectEarthWindow.34=मानà¥à¤¯à¤¤à¤¾ तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.35=ऑपरेटर नाम खाली\!
कृपया ऑपरेटर का नाम भरें और "अदà¥à¤¯à¤¤à¤¨" बटन दबाà¤à¤. +CollectEarthWindow.36=ऑपरेटर नाम रिकà¥à¤¤ नहीं हो सकता +CollectEarthWindow.37=खà¥à¤²à¤¾ रखो +CollectEarthWindow.38=सीà¤à¤¸à¤µà¥€ फ़ाइल +CollectEarthWindow.39=सूचना\: यह सलाह दी जाती है कि आप नठडेटा डालने करने से पहले अपने मौजूदा आंकडों को बैकअप(à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤) कर लें +CollectEarthWindow.4=à¤à¤«à¤à¤“ असà¥à¤µà¥€à¤•रण नोटिस +CollectEarthWindow.40=उस फ़ोलà¥à¤¡à¤° पर जाà¤à¤‚ जहां साà¤à¤•ॠसरà¥à¤µà¤° में सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ किया गया है, फ़ोलà¥à¤¡à¤° का रासà¥à¤¤à¤¾ उपकरण> गà¥à¤£> उनà¥à¤¨à¤¤ टैब. +CollectEarthWindow.41=निरà¥à¤¯à¤¾à¤¤ डेटा को फ़ाइल में बचाया जा रहा है \: +CollectEarthWindow.42=छोड़ना +CollectEarthWindow.43=परसà¥à¤ªà¤° विरोधी रिकॉरà¥à¤¡ पाया +CollectEarthWindow.44=डेटा आयात / निरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.45=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ डेटा (संकà¥à¤šà¤¿à¤¤) +CollectEarthWindow.46=ज़िप से नठडेटा आयात करें (संकà¥à¤šà¤¿à¤¤ à¤à¤•à¥à¤¸à¤à¤®à¤à¤²) +CollectEarthWindow.55=सीà¤à¤¸à¤µà¥€ का उपयोग कर मौजूदा रिकॉरà¥à¤¡ को अपडेट करें +CollectEarthWindow.47=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. +CollectEarthWindow.48=ज़िप / à¤à¤•तà¥à¤°-डेटा फ़ाइल +CollectEarthWindow.49=फà¥à¤¯à¥‚जन सीà¤à¤¸à¤µà¥€ फ़ाइल +CollectEarthWindow.5=बंद करे +CollectEarthWindow.50= उपयोगकरà¥à¤¤à¤¾ मैनà¥à¤…ल खोलें +CollectEarthWindow.51=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ के अदà¥à¤¯à¤¤à¤¨ के लिठजाà¤à¤š करें +CollectEarthWindow.52= अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— लॉग फ़ाइल खोलें +CollectEarthWindow.53=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ लॉग फ़ाइल +CollectEarthWindow.54=केà¤à¤®à¤à¤² से लोड अंक +CollectEarthWindow.56=के विषय में... +CollectEarthWindow.57=साà¤à¤•ॠसà¥à¤Ÿà¤¾à¤°à¥à¤Ÿà¤° पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ अभी भी चल रहा है, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें. +CollectEarthWindow.58=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ नहीं कर सकते +CollectEarthWindow.59=आप साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ के लिठडेटा सेट फिर से उतà¥à¤ªà¤¨à¥à¤¨ करने के लिठकरना चाहते हैं?
यह पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ समय लेने वाली हो सकती है.
आप यदि "हाà¤"पर कà¥à¤²à¤¿à¤• करें, तो नवीनतम जानकारी के साथ à¤à¤• नया डाटासेट उतà¥à¤ªà¤¨à¥à¤¨ हो जाà¤à¤—ा. +CollectEarthWindow.6=फà¥à¤¯à¥‚जन टेबल के लिठनिरà¥à¤¯à¤¾à¤¤ +CollectEarthWindow.60=साà¤à¤•ॠडेटा उतà¥à¤ªà¤¨à¥à¤¨ +CollectEarthWindow.61=डेटा à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ (पिछले निरà¥à¤¯à¤¾à¤¤ के बाद से संशोधित रिकॉरà¥à¤¡) +CollectEarthWindow.62=के विषय मे... +CollectEarthWindow.63=केà¤à¤®à¤à¤² से अंक पà¥à¤°à¤¾à¤ªà¥à¤¤ करने में तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.64=तकनीकी सहायता +CollectEarthWindow.7=डेटा आयात में तà¥à¤°à¥à¤Ÿà¤¿ +CollectEarthWindow.8=असà¥à¤µà¥€à¤•रण पाठ नहीं पाया जा सका +CollectEarthWindow.9=डेटा आयात रिकॉरà¥à¤¡ वह है जो कि पहले से ही अपने डेटाबेस पर मौजूद हैं शामिल. +DynamicsCode.0=पà¥à¤°à¤¾à¤°à¤‚भ में वन +DynamicsCode.1=पà¥à¤°à¤¾à¤°à¤‚भ में घास का मैदान, +DynamicsCode.2=पà¥à¤°à¤¾à¤°à¤‚भ में आबादी वाला इलाका +DynamicsCode.3=पà¥à¤°à¤¾à¤°à¤‚भ में बंजर +DynamicsCode.4=पà¥à¤°à¤¾à¤°à¤‚भ में आरà¥à¤¦à¥à¤° भूमि +DynamicsCode.5=पà¥à¤°à¤¾à¤°à¤‚भ में खेत +OpenTextFileListener.0=इस पाठ का फ़ाइल नहीं मिला \: +OptionWizard.0= विकलà¥à¤ª +OptionWizard.1=बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° चà¥à¤¨à¥‡à¤‚ +OptionWizard.10=बैकअप फ़ोलà¥à¤¡à¤° खोलें +OptionWizard.11=अजà¥à¤žà¤¾à¤¤\: उपयोग ifconfig +OptionWizard.12=गà¥à¤°à¤¾à¤¹à¤•ों का उलà¥à¤²à¥‡à¤– +OptionWizard.13=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° आईपी +OptionWizard.14=कतà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ (उदाहरण- 8023) +OptionWizard.15=बचाà¤à¤‚ और परिवरà¥à¤¤à¤¨ लागू करें +OptionWizard.16=आईडी +OptionWizard.17=X- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क +OptionWizard.18=Y- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क +OptionWizard.19=उठान +OptionWizard.2=कारà¥à¤¯à¤ªà¥à¤°à¤µà¤¾à¤¹ (सरà¥à¤µà¤° / गà¥à¤°à¤¾à¤¹à¤•) +OptionWizard.20=गूगल अरà¥à¤¥ अंतरà¥à¤µà¤¸à¥à¤¤à¥ बदल दिया गया है
यदि गà¥à¤—ल अरà¥à¤¥ आप से कहे,अंतरà¥à¤µà¤¸à¥à¤¤à¥ पà¥à¤¨à¤ƒ लोड सà¥à¤µà¥€à¤•ार करें . +OptionWizard.21=अदà¥à¤¯à¤¤à¤¨ सफल +OptionWizard.22=ढाल +OptionWizard.23=गूगल अरà¥à¤¥ डेटा को फिर से खोलने में कोई तà¥à¤°à¥à¤Ÿà¤¿ थी +OptionWizard.24=रदà¥à¤¦ करना +OptionWizard.25=ऑपरेशन मोड +OptionWizard.26=डीबी होसà¥à¤Ÿ +OptionWizard.27=यह à¤à¤• मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ साà¤à¤•ॠफ़ोलà¥à¤¡à¤° नहीं है ( सà¥à¤Ÿà¤¾à¤°à¥à¤Ÿ-साà¤à¤•à¥.batफ़ाइल मौजूद नहीं है) +OptionWizard.28=साà¤à¤•ॠसरà¥à¤µà¤° मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ नहीं +OptionWizard.29=डीबी पोरà¥à¤Ÿ +OptionWizard.3=सरà¥à¤µà¤° आवृतà¥à¤¤à¤¿ +OptionWizard.30=à¤à¤¸à¤•à¥à¤¯à¥ लाइट विकलà¥à¤ª +OptionWizard.31=सेमà¥à¤ªà¤² डेटा +OptionWizard.32=पà¥à¤²à¥‰à¤Ÿ लेआउट +OptionWizard.33=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ परिभाषा +OptionWizard.34=विकसित +OptionWizard.35=सेमà¥à¤ªà¤² अंक की संखà¥à¤¯à¤¾ +OptionWizard.36=सेमà¥à¤ªà¤² बिंदॠके बीच दूरी (मीटर में) +OptionWizard.37=भूखंड की सीमा के साथ मारà¥à¤œà¤¿à¤¨ (मीटर मे) +OptionWizard.38=सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सही ढंग से पढ़ा नहीं जा सकता.
इस फ़ाइल में à¤à¤• अलà¥à¤ªà¤µà¤¿à¤°à¤¾à¤® से अलग मूलà¥à¤¯à¥‹à¤‚ की उमà¥à¤®à¥€à¤¦ है \:
+OptionWizard.39=आईडी, वाई समनà¥à¤µà¤¯, à¤à¤•à¥à¤¸ समनà¥à¤µà¤¯, ऊंचाई, ढाल, पहलू +OptionWizard.4=वरà¥à¤¤à¤®à¤¾à¤¨ कंपà¥à¤¯à¥‚टर आईपी \: +OptionWizard.40=परियोजनाà¤à¤‚ +OptionWizard.41=à¤à¤• नई परियोजना फ़ाइल लोड करें +OptionWizard.42=सीà¤à¤¸à¤µà¥€ पाठक को बंद करते समय तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.43=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ का नाम +OptionWizard.44= सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ बैकअप डेटाबेस +OptionWizard.45=ओपन पृथà¥à¤µà¥€ इंजन ने पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° में जूम किया +OptionWizard.46=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठपृथà¥à¤µà¥€ इंजन टाइमलैपà¥à¤¸ खोलें +OptionWizard.47=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठबिंग मैपà¥à¤¸ खोलें +OptionWizard.48=बजाय गूगल अरà¥à¤¥ के फॉरà¥à¤® à¤à¤• बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° पर खोलें (लिनकà¥à¤¸ के लिठसिफारिश) +OptionWizard.49=भूखंड डेटा के साथ सीईडी / सीà¤à¤¸à¤µà¥€ फाइल भेजने के लिठपथ +OptionWizard.5=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ\: +OptionWizard.50=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.51=परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.52=केवल निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क के साथ सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल +OptionWizard.53=चौकोर +OptionWizard.54=केनà¥à¤¦à¥à¤°à¥€à¤¯ बिनà¥à¤¦à¥ +OptionWizard.55=परियोजना फ़ोलà¥à¤¡à¤° आयात तà¥à¤°à¥à¤Ÿà¤¿ +OptionWizard.56=लोड परियोजना +OptionWizard.57=पहले से लोड परियोजना +OptionWizard.58= जी ई ई का मैदान खोलें (विशà¥à¤µà¤¸à¤¨à¥€à¤¯ जांचकरà¥à¤¤à¤¾ के उपयोग की आवशà¥à¤¯à¤•ता है) +OptionWizard.59=यहां भूखंड पर केंदà¥à¤°à¤¿à¤¤ मैपà¥à¤¸ खोलें +OptionWizard.6=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² डीबी मापदंड +OptionWizard.65=साà¤à¤•à¥à¤«à¤¼à¥‹à¤²à¥à¤¡à¤° का पथ +OptionWizard.66=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.67=फ़ायरफ़ॉकà¥à¤¸ निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ +OptionWizard.68=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.7=उपयोगकरà¥à¤¤à¤¾ नाम +OptionWizard.70=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों +OptionWizard.72=बाइनरी फ़ाइलें +OptionWizard.73=कà¥à¤°à¥‹à¤® निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ +OptionWizard.74=बà¥à¤°à¤¾à¤‰à¤œ +OptionWizard.76=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों +OptionWizard.78=बाइनरी फ़ाइलें +OptionWizard.79=केà¤à¤®à¤à¤² फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ के लिठपथ +OptionWizard.8=पासवरà¥à¤¡ +OptionWizard.80=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.82=फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ +OptionWizard.83=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ पà¥à¤°à¤ªà¤¤à¥à¤° डिज़ाइन करने के लिठपथ +OptionWizard.84=बà¥à¤°à¤¾à¤‰à¤œ..... +OptionWizard.86=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² वेब पेज +OptionWizard.87=पथ आइडीà¤à¤® परिभाषा के साथ à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठ+OptionWizard.88=बà¥à¤°à¤¾à¤‰à¤œ... +OptionWizard.9=डीबी नाम +OptionWizard.90=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² आइडीà¤à¤® परिभाषा +OptionWizard.91=सरà¥à¤µà¤° (पà¥à¤°à¤¬à¤‚धक संसà¥à¤•रण या खड़े अकेले का उपयोग करें) +OptionWizard.92=कà¥à¤²à¤¾à¤‡à¤‚ट (ऑपरेटर / सरà¥à¤µà¤° से जà¥à¤¡à¤¼à¥‡) +OptionWizard.93=सकà¥à¤¯à¥‚à¤à¤²à¤¾à¤‡à¤Ÿ (à¤à¤‚बेडेड / à¤à¤•ल फाइल आधारित) +OptionWizard.94=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² +OptionWizard.95=सेमà¥à¤ªà¤² डॉटà¥à¤¸ के साइड (मीटर में) +SaikuAnalysisListener.0=हाठ- ताज़ा साà¤à¤•ॠडेटा (लंबी पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾) +SaikuAnalysisListener.1=नहीं - बस साà¤à¤•ॠशà¥à¤°à¥‚ +SaikuStarter.1=साà¤à¤•ॠशà¥à¤°à¥‚ +SaikuStarter.2= साà¤à¤•ॠशà¥à¤°à¥‚ कà¥à¤› मिनट लग सकते हैं, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें\! +SaveEarthDataServlet.0=खाली अनà¥à¤°à¥‹à¤§ +SaveEarthDataServlet.1= डेटाबेस में डेटा बचाते समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ है +SaveEarthDataServlet.2=डेटा बचाया था +SlopeCode.0=समतल (0-5) +EarthApp.11=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ पहले से ही चल रहा है +EarthApp.21=à¤à¤• सीà¤à¤¸à¤µà¥€ / सीईडी के रूप में भूखंडों की गà¥à¤°à¤¿à¤¡ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
+EarthApp.23=कोई सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सेट-अप नहीं किया गया है \:

+EarthApp.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² परिभाषा के साथ फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है \:
+EarthApp.26=कोई à¤à¤•à¥à¤¸à¤à¤®à¤à¤² फ़ाइल परिभाषा सेट अप नहीं किया गया है \:

+EarthApp.27=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ रूप से यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
+EarthApp.29=कोई à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ फ़ाइल सेट-अप नहीं किया गया है \:

+EarthApp.3=मà¥à¤à¥‡ बाद में याद दिलाना +EarthApp.30=उपकरण> गà¥à¤£ मेनू में फ़ाइल सà¥à¤¥à¤¾à¤¨ को ठीक करें . +EarthApp.4=अभी अदà¥à¤¯à¤¤à¤¨ करें +EarthApp.5=मà¥à¤à¥‡ दà¥à¤¬à¤¾à¤°à¤¾ याद मत दिलाना +EarthApp.57=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ का à¤à¤• नया संसà¥à¤•रण उपलबà¥à¤§ है\!
आप कैसे आगे बढ़ना चाहते हैं? +EarthApp.58=अदà¥à¤¯à¤¤à¤¨ चेतावनी +EarthApp.59= परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ +EarthApp.6=\ - संसà¥à¤•रण +EarthApp.61=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ फाइल खà¥à¤² नहीं सकती .
कृपया सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करें कि गूगल अरà¥à¤¥ सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ है. +EarthSurveyService.9=आवशà¥à¤¯à¤• कà¥à¤·à¥‡à¤¤à¥à¤° +ExportActionListener.1= तारीख चूनें जबसे रिकॉरà¥à¤¡ निरà¥à¤¯à¤¾à¤¤ करने है +ExportDialogProcessMonitor.0=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... +ExportDialogProcessMonitor.1=पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ पà¥à¤°à¤¾à¤°à¤‚भ करने के लिठपà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ कर रहा है \: +ExportDialogProcessMonitor.4=निरà¥à¤¯à¤¾à¤¤ रिकॉरà¥à¤¡\: +ImportProcessMonitorDialog.0=आयातित रिकॉरà¥à¤¡ \: +ImportActionListener.0=कà¥à¤¯à¤¾ उन भूखंडों के लिठडेटा जो कि पूरी तरह से भरे नहीं गठ,आयातित किया जाना चाहिà¤? +ImportActionListener.2=आप कà¥à¤²à¤¿à¤• करें, नहींतो केवल डेटा "हरी" राजà¥à¤¯ में भूखंडों से ,जिसमें सभी डेटा यà¥à¤•à¥à¤¤ है , आयात किया जाà¤à¤—ा। +ImportDialogProcessMonitor.0=\ गणना +ImportDialogProcessMonitor.11=रिकॉरà¥à¤¡ की पà¥à¤°à¤¾à¤°à¤‚भिक संखà¥à¤¯à¤¾ \: +ImportDialogProcessMonitor.2=रिकॉरà¥à¤¡ आयात... +ImportDialogProcessMonitor.5=आयातित रिकॉरà¥à¤¡ की वासà¥à¤¤à¤µà¤¿à¤• संखà¥à¤¯à¤¾ \: +ImportDialogProcessMonitor.8=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... +InfiniteProgressMonitor.0=रदà¥à¤¦ ऑपरेशन +JFileChooserExistsAware.0=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ परियोजना फ़ाइल +KmlImportService.13=पà¥à¤²à¥‰à¤Ÿ सà¥à¤¥à¤¾à¤¨à¥‹à¤‚ को बचाने के लिठà¤à¤• सीà¤à¤¸à¤µà¥€ फ़ाइल का चयन करें +MissingPlotsListener.0=तà¥à¤°à¥à¤Ÿà¤¿ उन भूखंडों के बारे में जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ करने के लिठजो डेटाबेस पर मौजूद नहीं +MissingPlotsListener.1=गà¥à¤® भूखंड +MissingPlotsListener.10=सेमà¥à¤ªà¤² डिजाइन में भूखंडों की कà¥à¤² संखà¥à¤¯à¤¾ \: +MissingPlotsListener.12=गà¥à¤® भूखंडों की संखà¥à¤¯à¤¾ \: +MissingPlotsListener.14=सभी भूखंडों भर रहे हैं\! +MissingPlotsListener.2=कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ अंतरà¥à¤µà¤¸à¥à¤¤à¥ की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ +MissingPlotsListener.3=भूखंड की जानकारी वाले फ़ाइलें चà¥à¤¨à¥‡à¤‚ ( .सीà¤à¤¸à¤µà¥€ या .सीईडी फ़ाइलें ) जिसके लिठआप जानना चाहते हैं तो सभी डेटा भर दिया गया है चाहता हूà¤. +MissingPlotsListener.4=गà¥à¤® भूखंड- जानकारी +MissingPlotsListener.5=फ़ाइल से \: +MissingPlotsListener.6=सीà¤à¤¡à¥€ फ़ाइल में निरà¥à¤¯à¤¾à¤¤ करें +ProcessMonitorDialog.1=पंकà¥à¤¤à¤¿ संखà¥à¤¯à¤¾ पर तà¥à¤°à¥à¤Ÿà¤¿ +ProcessMonitorDialog.4=, कॉलम +ProcessMonitorDialog.5=\ --मूलà¥à¤¯ +YES= हां +YES_TO_ALL=सब को हां +NO=नहीं +NO_TO_ALL=सभी को नहीं + + + From 4fa8bd434f97dea1dbe5495467e62c8709f6ec08 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:28 +0100 Subject: [PATCH 0853/1620] New translations Messages_lo.properties (French) --- .../earth/app/view/Messages_fr.properties | 475 ++++++++---------- 1 file changed, 220 insertions(+), 255 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index c2ce51b7bd..e5b9bd9e45 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,255 +1,220 @@ -AboutDialog.19=Ocorreu um problema -AboutDialog.5=Para mais informações visite nosso site OpenForis.org -AboutDialog.6=Desculpe, um problema ocorreu ao tentar abrir esse link no seu navegador padrão. -AboutDialog.8=Ok -AspectCode.0=Norte -AspectCode.1=Nordeste -AspectCode.2=Leste -AspectCode.3=Sudeste -AspectCode.4=Sul -AspectCode.5=Sudoeste -AspectCode.6=Oeste -AspectCode.7=Noroeste -CollectEarthMenu.0=Importar Arquivo CEP -CollectEarthMenu.2=Utilidades -CollectEarthMenu.3=Separar arquivo CSV em partes -CollectEarthMenu.4=Exportar dados para XML (da data específica até o tempo presente) -CollectEarthMenu.5=Exportar para Collect Backup -CollectEarthMenu.6=Exportar dados como Collect Backup (todos os dados) -CollectEarthMenu.7=Exportar dados como Collect Backup (a partir de uma data) -CollectEarthMenu.8=Exportar dados para XML (filtrar por atributo) -CollectEarthWindow.0=Erro ao tentar exportar os dados para um arquivo CSV -CollectEarthWindow.10=Arquivo -CollectEarthWindow.11=Fechar -CollectEarthWindow.12=Ferramentas -CollectEarthWindow.13=Baixar dados para CSV (Excel) -CollectEarthWindow.14=Iniciar Análise SAIKU -CollectEarthWindow.15=Propiedades -CollectEarthWindow.16=Ajuda -CollectEarthWindow.17=Declaração -CollectEarthWindow.18=Encontrar parcelas ausentes em banco de dados -CollectEarthWindow.19=Collect Earth -CollectEarthWindow.1=Erro ao exportar -CollectEarthWindow.20=Número de registros duplicados\: -CollectEarthWindow.21=Não foi possível encontrar o ícone para a janela principal -CollectEarthWindow.22=Tem certeza de querer fechar Collect Earth?
Ao fechar a janela será fechada também o servidor de Collect Earth -CollectEarthWindow.23=Confirmação requerida -CollectEarthWindow.24=Exportar a XML -CollectEarthWindow.25=Quer importar estes registros de qualquer maneira e perder o seus dados atuais? -CollectEarthWindow.26=Operador -CollectEarthWindow.27=Atualizar -CollectEarthWindow.28=O servidor Open Foris Collect Earth deve estar em execução enquanto o operador interprete os dados. -CollectEarthWindow.29=O servidor Saiku não está configurado. -CollectEarthWindow.2=Idioma -CollectEarthWindow.30=Por favor mantenha esta janela aberta enquanto estiver usando o Google Earth. -CollectEarthWindow.31=Exportar os dados coletados para um arquivo CSV -CollectEarthWindow.32=Fechar -CollectEarthWindow.33=O nome do operador deve ser maior de que 5 caracteres e mais curto do que 50 -CollectEarthWindow.34= Erro de Validação -CollectEarthWindow.35=NOME DO OPERADOR VAZIO\!
Preencha o nome do operador e clique no botão "Atualizar". -CollectEarthWindow.36=Nome do operador não pode estar vazio -CollectEarthWindow.37=Permanecer Aberto -CollectEarthWindow.38=Arquivos de CSV -CollectEarthWindow.39=AVISO\:Se recomenda de fazer um back-up dos seus dados atuais(Exportar para XML) antes de importar os novos dados -CollectEarthWindow.3=\ Erro ao importar dados. -CollectEarthWindow.40=Configurar caminho para o arquivo onde o Servidor Saiku se encontra instalado em Ferramentas->Propiedades->Avançado. -CollectEarthWindow.41=Guardar dados exportados para o arquivo\: -CollectEarthWindow.42=Sair -CollectEarthWindow.43=Registros repetidos detectados -CollectEarthWindow.44=Importar/Exportar -CollectEarthWindow.45=Exportar dados para XML (comprimidos) -CollectEarthWindow.46=Importar novos dados do ZIP (XML comprimidos) -CollectEarthWindow.47=Servidor Saiku não configurado -CollectEarthWindow.48=Arquivos ZIP -CollectEarthWindow.49=Arquivos Fusion CSV -CollectEarthWindow.4=Isenção de responsabilidade da FAO -CollectEarthWindow.50=Abrir Manual de Usuário -CollectEarthWindow.51=Verificar atualizações de Collect Earth -CollectEarthWindow.52=Abrir Arquivo de Registro da aplicação -CollectEarthWindow.53=Arquivo de Registro de Collect Earth -CollectEarthWindow.54=Carregar pontos de KML -CollectEarthWindow.55=Atualizar registros atuais usando CSV -CollectEarthWindow.56=Sobre... -CollectEarthWindow.57=O processo de arranque de Saiku ainda está em execução, por favor aguarde. -CollectEarthWindow.58=Não é possível iniciar a análise com Saiku -CollectEarthWindow.59=Quer voltar a gerar o conjunto de dados para o análise de Saiku?
Este processo pode demorar vários minutos.
Se clicar em "SIM" um novo conjunto de dados com a mais recente informação será gerada. -CollectEarthWindow.5=Fechar -CollectEarthWindow.60=Geraço de dados para Saiku -CollectEarthWindow.61=Exportar dados para XML (apenas os registros adicionados/modificados) -CollectEarthWindow.62=Sobre... -CollectEarthWindow.63=Erro acessando pontos de KML -CollectEarthWindow.64=Suporte Técnico -CollectEarthWindow.65=O nome do operador foi alterado -CollectEarthWindow.66=Nome do operador -CollectEarthWindow.67=Abra a pasta de dados do CE -CollectEarthWindow.6=Exportar dados a Fusion Table -CollectEarthWindow.70=Abra o manuel desta pesquisa -CollectEarthWindow.71=Gerar ferramenta Saiku Independente -CollectEarthWindow.7=Erro ao importar os dados -CollectEarthWindow.8=Texto de isenção não foi possivel de ser encontrado -CollectEarthWindow.9=Os dados importados contém registros que já estão presentes no seu banco de dados. -DynamicsCode.0=Inicialmente Floresta -DynamicsCode.1=Inicialmente Ãrea de Pastagem -DynamicsCode.2=Inicialmente Ãrea Urbana -DynamicsCode.3=Inicialmente Outros -DynamicsCode.4=Inicialmente Ãrea Alagada -DynamicsCode.5=Inicialmente Ãrea Agrícola -EarthApp.11=Collect Earth já está em execução -EarthApp.21=O arquivo contendo o gride de pontos como CSV/CED não foi encontrado no caminho selecionado\:
-EarthApp.23=Nenhum arquivo CSV/CED foi configurado \:

-EarthApp.24=O arquivo contendo o modelo Freemarker com a definição KML não foi encontrado no caminho selecionado \:
-EarthApp.26=Nenhum arquivo de definição KML foi configurado \:

-EarthApp.27=O arquivo contendo o formato balão HTML não foi encontrado no caminho selecionado \:
-EarthApp.29=Nenhum arquivo balão HTML foi configurado \:

-EarthApp.30=Por favor corrija a localização do arquivo no menu Ferramentas->Propriedades. -EarthApp.3=Lembrar mais tarde -EarthApp.4=Atualizar Agora -EarthApp.57=Existe uma nova versão do Collect Earth disponível\!
Como gostaria de proceder? -EarthApp.58=Alerta de Atualização -EarthApp.59=Erro ao importar aquivo do projeto -EarthApp.5=Não me lembre novamente -EarthApp.61=O arquivo do Collect Earth não pôde ser aberto.
Por favor certifique-se que Google Earth esteja instalado. -EarthApp.6= - Versão -EarthApp.70=AVISO -EarthApp.71=No Mac OS X, os arquivos do projeto Collect Earth (* .cep) não serão abertos no Collect Earth quando forem clicados duas vezes.
-EarthApp.72=Use a barra de ferramentas Collect Earth para abrir os arquivos .cep \: -EarthApp.73=Collect Earth - problemas em computadores Mac OS X -EarthSurveyService.9=Campo obrigatório -ExportActionListener.1=Escolha data a partir da qual queira exportar os dados -ExportDialogProcessMonitor.0=Processando os dados... -ExportDialogProcessMonitor.1=Esperando de inicializar o processo \: -ExportDialogProcessMonitor.4=Registros importados \: -ImportActionListener.0=Deseja importar os dados das parcelas que não tenham sido completamente preenchidos? -ImportActionListener.2=Se clicar NÃO apenas os dados das parcelas em estado completo ("verde"), serão importados. -ImportActionListener.3=Importar registros incompletos -ImportDialogProcessMonitor.0=\ CALCULANDO -ImportDialogProcessMonitor.11=Cifra inicial de registros \: -ImportDialogProcessMonitor.2=Importando registros.... -ImportDialogProcessMonitor.5=Cifra final de registros importados \: -ImportDialogProcessMonitor.8=Processando dados... -ImportProcessMonitorDialog.0=Imported records \: -ImportXMLDialogProcessMonitor.1 = Substitua dados no banco de dados -ImportXMLDialogProcessMonitor.2 = Importe apenas registros não conflitantes -InfiniteProgressMonitor.0=Cancelar operação -JFileChooserExistsAware.0=Arquivo de projeto Collect Earth -KmlImportService.13=Selecione um arquivo CSV para salvar a localização dos pontos -MissingPlotsListener.0=Erro ao obter informação sobre parcelas ausentes na Base de Dados -MissingPlotsListener.10=Número total de ppontos no desenho de amostragem \: -MissingPlotsListener.12=Número de pontos perdidos \: -MissingPlotsListener.14=Todos os pontos foram preenchidos\! -MissingPlotsListener.1=Parcelas ausentes -MissingPlotsListener.2=Copiar conteúdos -MissingPlotsListener.3=Escolha os arquivos contendo informação sobre as parcelas ( .csv or .ced files ) para os quais deseja saber se todos os dados foram preenchidos. -MissingPlotsListener.4=Parcelas ausentes - informação -MissingPlotsListener.5=Do arquivo \: -MissingPlotsListener.6=Exportar para arquivo CED -NO=Não -NO_TO_ALL=Não para todos -OpenTextFileListener.0=O arquivo de texto não foi encontrado em \: -OptionWizard.0=Opções do Collect Earth -OptionWizard.100=Abrir Planet -OptionWizard.101=Llave da API do Planet -OptionWizard.1021=URL SecureWatch -OptionWizard.102=Abrir Maxar SecureWatch -OptionWizard.103=Configure o URL para o Mapa Extra (abre quando configurado) \: -OptionWizard.104=Navegadores -OptionWizard.105=Abrir Earth Map -OptionWizard.110=Use imagens mensais fornecidas pela NICFI -OptionWizard.10=Abrir arquivo de backup -OptionWizard.11=Desconhecido\: usar ifconfig -OptionWizard.12=Cliente Instância -OptionWizard.13=Collect Earth Server IP -OptionWizard.14=Collect Earth Porta de Servidor (p.ex. 8023) -OptionWizard.15=Guardar & Aplicar alteraçães -OptionWizard.16=ID -OptionWizard.17=X-coord -OptionWizard.18=Y-coord -OptionWizard.19=Elevação -OptionWizard.1=Escolher Navegador -OptionWizard.20= Os conteúdos de Google Earth foram alterados.
Por favor aceite a regarga do conteúdo uma vez que Google Earth lhe pergunte. -OptionWizard.21=Atualizado com sucesso -OptionWizard.22=Relevo -OptionWizard.23=Houve um erro ao reabrir os dados de Google Earth -OptionWizard.24=Cancelar -OptionWizard.25=Modo de Operação -OptionWizard.26=BBDD servidor -OptionWizard.27=Isto não é um Arquivo Saiku reconhecível (o arquivo start-saiku.bat não se encontra presente) -OptionWizard.28=Servidor Saiku não reconhecível -OptionWizard.29=BBDD porta -OptionWizard.2=Tipo de uso(servidor/cliente) -OptionWizard.30=Opçães SQLite -OptionWizard.31=Dados de amostra -OptionWizard.32=Disposição da Parcela -OptionWizard.33=Definiço de Questionários -OptionWizard.34=Serviços Integrados -OptionWizard.35=Número de pontos de control -OptionWizard.36=Distância entre os pontos de control (em metros) -OptionWizard.37=Margem com o perímetro da parcela (em metros) -OptionWizard.38=O arquivo CSV/CED não foi possivel ser lido corretamente.
O arquivo deve conter valores separados por vírgulas do seguinte modo\:
-OptionWizard.39=ID,Y-Coordenada,X-Coordenada,elevação,relevo,orientação -OptionWizard.3=Servidor Instance -OptionWizard.40=Projetos -OptionWizard.41=Carregar um novo arquivo de projeto -OptionWizard.42=Erro ao fechar o leitor CSV -OptionWizard.43=Nome do questionário -OptionWizard.44=Realizar automaticamente backup do banco de dados em -OptionWizard.45=Abrir Earth Engine Playground (descontinuado) -OptionWizard.46=Abrir Earth Engine Timelapse -OptionWizard.47=Abrir Bing Maps -OptionWizard.48=Abrir formulário em um navegador externo em vez de Google Earth (recomendado para LINUX) -OptionWizard.49=Caminho do arquivo CED/CSV com as coordenadas das parcelas -OptionWizard.4=IP do computador atual\: -OptionWizard.50=Navegar.. -OptionWizard.51=Erro ao importar os arquivos do projeto -OptionWizard.52= Arquivo CSV/CED com coordinadas -OptionWizard.53=Sem pontos -OptionWizard.54=Ponto Central -OptionWizard.55=Erro ao importar diretório do projeto -OptionWizard.56=Carregar projeto -OptionWizard.57=Projetos previamente carregados -OptionWizard.58=Abrir GEE Code Editor (requer acesso ao Trusted Tester) -OptionWizard.59=Abrir Here Maps focado no ponto -OptionWizard.5= Collect Earth Servidor porto\: -OptionWizard.65=Caminho para arquivo Saiku -OptionWizard.66=Navegar... -OptionWizard.67=Caminho para o executável do Firefox -OptionWizard.68=Navegar... -OptionWizard.6=Parâmetros BD PostgreSQL -OptionWizard.70=Arquivos executáveis -OptionWizard.72=Arquivos binários -OptionWizard.73=Caminho para o executável do Chrome -OptionWizard.74=Navegar... -OptionWizard.76=Arquivos executáveis -OptionWizard.78=Arquivos binarios -OptionWizard.79=Caminho para o padrão de KML Freemarker -OptionWizard.7=Nome de Usuário -OptionWizard.80=Navegar... -OptionWizard.82=Padrão Freemarker -OptionWizard.83=Caminho para formulário HTML Balloon -OptionWizard.84=Navegar... -OptionWizard.86=Pagina web HTML -OptionWizard.87=Caminho para XML com definição IDM -OptionWizard.88=Navegar... -OptionWizard.8=Senha -OptionWizard.90=Definiço XML IDM -OptionWizard.91=Servidor (versão para gerente ou uso autônomo) -OptionWizard.92=Cliente (operador/conectado ao servidor) -OptionWizard.93=SQLite (Embutido/com base em um único arquivo) -OptionWizard.94=PostgreSQL -OptionWizard.95=Side of the sampling dots (in meters) -OptionWizard.9= Nome da Base de Dados -ProcessMonitorDialog.1=Erro de análise na linha número -ProcessMonitorDialog.4=, colunas -ProcessMonitorDialog.5= -- valores -SaikuAnalysisListener.0=Sim - Atualizar dados Saiku (longo processo) -SaikuAnalysisListener.1=Não - Use a mesma versão dos dados da última vez que o Saiku foi usado -SaikuToolExportListener.1=Geração da ferramenta Saiku -SaikuToolExportListener.2=Gerando a Ferramenta Saiku com o banco de dados atual -SaikuStarter.1=Iniciando Saiku -SaikuStarter.2=Iniciando Saiku pode demorar uns minutos, por favor aguarde\! -SaveEarthDataServlet.0=Sem dados -SaveEarthDataServlet.1=Problema ocorreu ao guardar os dados na Base de Dados -SaveEarthDataServlet.2=Os dados foram guardados -SlopeCode.0=Plano (0-5) -YES=Sim -YES_TO_ALL=Sim a todas \ No newline at end of file +AboutDialog.19 = ບັນ​ຫາ​ເàºàºµàº” A +AboutDialog.5 = ສà»àº²â€‹àº¥àº±àºšâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹à»€àºžàºµà»ˆàº¡â€‹à»€àº•ີມ​ໄດ້​ທີ່ OpenForis.org ເວັບ​ໄຊ​ທ​໌​ຂອງ​ພວàºâ€‹à»€àº®àº»àº² +AboutDialog.6 = ຂà»â€‹à»‚ທດ​ນà»àº²â€‹, ບັນ​ຫາ​ທີ່​ເàºàºµàº”​ຂຶ້ນ​ໃນ​ຂະ​ນະ​ທີ່​ຄວາມ​ພະ​àºàº²â€‹àºàº²àº¡â€‹àº—ີ່​ຈະ​ເປີດ​àºàº²àº™â€‹à»€àºŠàº·à»ˆàº­àº¡â€‹àº•à»à»ˆâ€‹àº™àºµà»‰â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹àº¥àº°â€‹àºšàº»àºšâ€‹àº‚ອງ​ທ່ານ​ຕົວ​ທ່ອງ​ເວັບ​ຂອງ​ມາດ​ຕະ​ຖານ​. +AboutDialog.8 = Ok +AspectCode.0 = ເຫນືອ +AspectCode.1 = ວັນ​ອອàºâ€‹àºªà»ˆàº½àº‡â€‹à»€àº«àº™àº·àº­ +AspectCode.2 = ຕາ​ເວັນ​ອອຠ+AspectCode.3 = ພາàºâ€‹à»ƒàº•້​, ຕາ​ເວັນ​ອອຠ+AspectCode.4 = ໃຕ້ +AspectCode.5 = ພາàºâ€‹à»ƒàº•້​, ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ+AspectCode.6 = ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ+AspectCode.7 = ພາàºâ€‹à»€àº«àº™àº·àº­â€‹, ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ+CollectEarthWindow.0 = ໃນ​ເວ​ລາ​ທີ່​ພະ​àºàº²â€‹àºàº²àº¡â€‹à»€àºžàº·à»ˆàº­â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌ CSVຄວາມ​ຜິດ​ພາດ +CollectEarthWindow.1 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àº +CollectEarthWindow.10 File \= +CollectEarthWindow.11 ອອàºâ€‹àºˆàº²àº \= +CollectEarthWindow.12 = ເຄື່ອງ​ມືຂà»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.13 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ CSV àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ +CollectEarthWindow.14 = Start SAIKU +CollectEarthWindow.15 = ຄຸນ​ສົມ​ບັດ +CollectEarthWindow.16 = ຊ່ວàºâ€‹à»€àº«àº¼àº·àº­ +CollectEarthWindow.17 = ປະ​ຕິ​ເສດ +CollectEarthWindow.18 = ຄົ້ນ​ຫາ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ຫາàºâ€‹à»„ປ​ໃນ​ຖານ​ຂà»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.19 = ເàºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ+CollectEarthWindow.2 = ພາ​ສາ +CollectEarthWindow.20 = ຈà»àº²â€‹àº™àº§àº™â€‹àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™ duplicated​\: +CollectEarthWindow.21 = ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ຊອàºâ€‹àº«àº² icon ສà»àº²â€‹àº¥àº±àºšâ€‹àºžàº²â€‹àº•ົ້ນ​ຕ໠+CollectEarthWindow.22 = ທ່ານ​ມີ​ຄວາມ​à»àº™à»ˆâ€‹à»ƒàºˆàº§à»ˆâ€‹àº²â€‹àº—່ານ​ຕ້ອງ​àºàº²àº™â€‹àº›àº´àº”​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹? ໃນ​àºàº²àº™â€‹àº›àº´àº”​ປ່ອງ​ຢ້ຽມ​àºàº±àº‡â€‹àºˆàº°â€‹àº›àº´àº”​ເຄື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹àº‚ອງ​ໂລàºâ€‹à»„ດ້​ເàºàº±àºšâ€‹àºà»àº² +CollectEarthWindow.23 = àºàº²àº™â€‹àº¢àº±à»‰àº‡â€‹àº¢àº·àº™â€‹àº—ີ່​ຈà»àº²â€‹à»€àº›àº±àº™ +CollectEarthWindow.24 = XML ສົ່ງ​ອອຠ+CollectEarthWindow.25 = ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ເພີ່ມ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹à»€àº«àº¼àº»à»ˆàº²â€‹àº™àºµà»‰â€‹à»àº¥à»‰àº§â€‹à»àº¥àº°â€‹àºàº²àº™â€‹àºªàº¹àº™â€‹à»€àºªàºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº‚ອງ​ທ່ານ​? +CollectEarthWindow.26 = ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™ +CollectEarthWindow.27 = ປັບ​ປຸງ +CollectEarthWindow.28 = ເຮັດ​ຢູ່​ຕ່າງ​ປະ​ເທດ​ເàºàº±àºšâ€‹àºà»àº²â€‹à»€àº„ື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹àº„ວນ​ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹à»àº¥à»ˆàº™â€‹à»ƒàº™â€‹àº‚ະ​ນະ​ທີ່​ຜູ້​ປະ​àºàº­àºšâ€‹àºàº²àº™â€‹àº•ີ​ຄວາມ​ຫມາàºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹. +CollectEarthWindow.29 = The Saiku Server ບà»à»ˆâ€‹à»„ດ້​ຖືàºâ€‹àº•ັ້ງ​. +CollectEarthWindow.3 = \ ຄວາມ​ຜິດ​ພາດ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ +CollectEarthWindow.30 = àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº®àº±àºâ€‹àºªàº²â€‹àºàº²àº™â€‹à»€àº›àºµàº”​ຫນ້າ​ຕ່າງ​ນີ້​ໃນ​ຂະ​ນະ​ທີ່​ທ່ານ​àºà»àº²â€‹àº¥àº±àº‡â€‹à»ƒàºŠà»‰â€‹àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹. +CollectEarthWindow.31 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌ CSV +CollectEarthWindow.32 = ອອຠ+CollectEarthWindow.33 = ຊື່​ຜູ້​ປະ​àºàº­àºšâ€‹àºàº²àº™â€‹àºˆàº°â€‹àº•້ອງ​ມີ​àºàº²àº™â€‹àº•à»à»ˆâ€‹à»„ປ​ອີàºâ€‹à»àº¥à»‰àº§â€‹àºâ€‹à»ˆâ€‹àº§àº² 5 ລັàºâ€‹àºªàº°â€‹àº™àº°â€‹à»àº¥àº°â€‹àºªàº±à»‰àº™â€‹àºâ€‹à»ˆâ€‹àº§àº² 50ຄວາມ​ຜິດ​ພາດ +CollectEarthWindow.34 = àºàº§àº”​ສອບ +CollectEarthWindow.35 = ຜູ້​ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹àº¥àº»àºšâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™ ​\! ຫລັàºâ€‹àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº•ື່ມ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàºªà»ˆâ€‹àºŠàº·à»ˆâ€‹àºœàº¹à»‰â€‹àº›àº°â€‹àºàº­àºšâ€‹àºàº²àº™â€‹à»àº¥àº°â€‹à»ƒàº«à»‰â€‹àºàº»àº”​ປຸ່ມ "ປັບ​ປຸງ​"​. ຊື່ +CollectEarthWindow.36 = ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹àºšà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ເປົ່າ +CollectEarthWindow.37 = ຮັàºâ€‹àºªàº²â€‹àºˆàº±àº™à»„ຟລ​໌ +CollectEarthWindow.38 = CSV +CollectEarthWindow.39 à»àºˆà»‰àº‡ \= ມັນ​ເປັນ​àºàº²àº™â€‹àºªàº»àº¡â€‹àº„ວນ​ທີ່​ທ່ານ​ໄປ​ເຖິງ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº‚ອງ​ທ່ານ (àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ XML​) àºà»ˆàº­àº™â€‹àº—ີ່​ຈະ​ໄດ້​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº«àº¡à»ˆâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ +CollectEarthWindow.4 = FAO à»àºˆà»‰àº‡â€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ເສດ +CollectEarthWindow.40 = ທີ່​àºà»àº²â€‹àº™àº»àº”​ໄວ້​ຕາມ​ເສັ້ນ​ທາງ​àºàº±àºšâ€‹à»‚ຟນ​ເດີ​ທີ່ Saiku Server ໄດ້​ຖືàºâ€‹àº•ິດ​ຕັ້ງ​ຢູ່​ໃນ Tools-> Properties-> à»àº–ບ​à»àºšàºšâ€‹àºžàº´â€‹à»€àºªàº”​ໄດ້​. +CollectEarthWindow.41 = àºàº²àº™â€‹àº›àº°â€‹àº«àºàº±àº”​àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌​\: +CollectEarthWindow.42 = ອອຠ+CollectEarthWindow.43 = àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº•à»àº²â€‹àºàº±àº™â€‹àº—ີ່​ພົບ​ເຫັນ +CollectEarthWindow.44 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ / ສົ່ງ​ອອàºàº‚à»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.45 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ XML (à»àº›â€‹)ຂà»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.46 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ໃຫມ່​ຈາàºâ€‹à»„ປ​ສະ​ນີ (XML à»àº›â€‹)àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™ +CollectEarthWindow.55 ປັບ​ປຸງ \= àºàº²àº™â€‹àº™à»àº²â€‹à»ƒàºŠà»‰ CSV +CollectEarthWindow.47 = Saiku Server ບà»à»ˆâ€‹à»„ດ້​àºà»àº²â€‹àº«àº™àº»àº” +CollectEarthWindow.48 = ໄຟລ​໌​ຫັດ​ໄປ​ສະໄຟລ​໌ +CollectEarthWindow.49 = Fusion CSV +CollectEarthWindow.5 = ປິດ +CollectEarthWindow.50 = ເປີດ​ຄູ່​ມື​àºàº²àº™â€‹à»ƒàºŠà»‰àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™â€‹àº›àº±àºšâ€‹àº›àº¸àº‡â€‹àº‚ອງ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ+CollectEarthWindow.51 CHECK \= àºàº§àº”​ສອບ +CollectEarthWindow.52 = File ເຂົ້າ​ສູ່​ລະ​ບົບ​ຄà»àº²â€‹àº®à»‰àº­àº‡â€‹àºªàº°â€‹àº«àº¡àº±àºâ€‹à»€àº›àºµàº” +CollectEarthWindow.53 = àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»€àº­â€‹àºàº°â€‹àºªàº²àº™â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹à»€àº‚ົ້າ​ສູ່​ລະ​ບົບຈຸດ +CollectEarthWindow.54 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຈາຠKMLàºà»ˆàº½àº§â€‹àºàº±àºš +CollectEarthWindow.56 = ... +CollectEarthWindow.57 = ຂະ​ບວນ​àºàº²àº™â€‹à»€àº¥àºµà»ˆàº¡â€‹àº•ົ້ນ Saiku à»àº¡à»ˆàº™â€‹àºàº±àº‡â€‹à»àº¥à»ˆàº™â€‹, àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº¥à»â€‹àº–້າ​. +CollectEarthWindow.58 = ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ເລີ່ມ​ຕົ້ນ​àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ Saiku +CollectEarthWindow.59 = ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ Re​\: àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ Saiku ໄດ້​?
ຂະ​ບວນ​àºàº²àº™â€‹àº™àºµà»‰â€‹àºªàº²â€‹àº¡àº²àº”​ໃຊ້​ເວ​ລາ​ຫຼາàº
ຖ້າ​ທ່ານ​ຄລິàºâ€‹à»ƒàºªà»ˆ "à»àº¡à»ˆàº™â€‹à»àº¥à»‰àº§â€‹" ເປັນ​ຊຸດ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໃຫມ່​ທີ່​ມີ​ຄວາມ​ຫຼ້າ​ສຸດ​ໄດ້​. ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº‚ຶ້ນ​. +CollectEarthWindow.6 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ Fusion ຕາ​ຕະ​ລາງàºàº²àº™â€‹àºœàº°â€‹àº¥àº´àº”​ຂà»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.60 = Saiku +CollectEarthWindow.61 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່ XML (àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº”ັດ​à»àºà»‰â€‹àº™àº±àºšâ€‹àº•ັ້ງ​à»àº•່​àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àºªàº¸àº”​ທ້າàºâ€‹) ສົ່ງ​ອອàºàºà»ˆàº½àº§â€‹àºàº±àºš +CollectEarthWindow.62 = ... +CollectEarthWindow.63 Error \= àºàº²àº™â€‹à»„ດ້​ຮັບ​ຈຸດ​ທີ່​ໄດ້​ຈາຠKML +CollectEarthWindow.64 = ສະ​ຫນັບ​ສະ​ຫນູນ​ທາງ​ເທàºâ€‹àº™àº´àº +CollectEarthWindow.7 Error \= ໃນ​ເວ​ລາ​ທີ່​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຂà»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.8 ຂà»à»‰â€‹àº„ວາມ​ປະ​ຕິ​ເສດ \= ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ພົບ​ເຫັນ +CollectEarthWindow.9 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໄດ້​ນà»àº²â€‹à»€àº‚ົ້າ​ມາ​ປະ​àºàº­àºšâ€‹àº”້ວàºâ€‹àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àº—ີ່​ມີ​ຢູ່​à»àº¥à»‰àº§â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚ອງ​ທ່ານ​. +DynamicsCode.0 = ປ່າ​ໄມ້​ໃນ​ເບື້ອງ​ຕົ້ນ +DynamicsCode.1 = ທົ່ງ​ຫàºà»‰àº²â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ +DynamicsCode.2 = àºàº²àº™â€‹àº•ັ້ງ​ຖິ່ນ​ຖານ​ໃນ​ເບື້ອງ​ຕົ້ນ +DynamicsCode.3 = ເບື້ອງ​ຕົ້ນ Otherland +DynamicsCode.4 = ຊຸ່ມ​ນ​້​à»àº²â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ +DynamicsCode.5 = ເບື້ອງ​ຕົ້ນ Cro​​pland +OpenTextFileListener.0 = ໄຟລ​໌​ຂà»à»‰â€‹àº„ວາມ​à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹à»„ດ້​ພົບ​ໄດ້​ທີ່​\:àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +OptionWizard.0 = ທາງ​ເລືອàºâ€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ+OptionWizard.1 = ເລືອàºâ€‹àº‚ອງ​ຕົວ​ທ່ອງ​ເວັບ +OptionWizard.10 = ໂຟ​ເດີ​ສà»àº²â€‹àº®àº­àº‡â€‹àºˆàº±àº™ +OptionWizard.11 = ບà»à»ˆâ€‹àº®àº¹à»‰â€‹àºˆàº±àºâ€‹\: àºàº²àº™â€‹àº™à»àº²â€‹à»ƒàºŠà»‰ ifconfig +OptionWizard.12 = ລູàºâ€‹àº„້າ​ຕົວ​ຢ່າງàºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +OptionWizard.13 = ໂລຠIP Serveràºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +OptionWizard.14 = port ໂລຠServer (ຕົວ​ຢ່າງ​\: 8023​) +OptionWizard.15 = ບັນ​ທຶàºâ€‹à»àº¥àº°â€‹à»ƒàºŠà»‰â€‹àºàº²àº™â€‹àº›à»ˆàº½àº™â€‹à»àº›àº‡ +OptionWizard.16 = ລະ​ຫັດ +OptionWizard.17 = X​-coord +OptionWizard.18 = Y coord​, +OptionWizard.19 = àºàº²àº™â€‹àºàº»àºâ€‹àº¥àº°â€‹àº”ັບ +OptionWizard.2 = ບວນ​àºàº²àº™â€‹à»€àº®àº±àº”​ວຽຠ(server / ລູàºâ€‹àº„້າ​) +OptionWizard.20 = ໄດ້​ເນື້ອ​ໃນ​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»„ດ້​ມີ​àºàº²àº™â€‹àº›à»ˆàº½àº™â€‹à»àº›àº‡â€‹.
àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº®àº±àºšâ€‹à»‚ຫລດ​ເນື້ອ​ຫາ​ໃນ​ເວ​ລາ​ທີ່​ທ່ານ​àºà»àº²â€‹àº¥àº±àº‡â€‹àº®àº±àºšâ€‹àºàº²àº™â€‹àºàº°â€‹àº•ຸ້ນ​ໂດàºâ€‹àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹. +OptionWizard.21 = ປັບ​ປຸງ​ສົບ​ຜົນ​ສà»àº²â€‹à»€àº¥àº±àº” +OptionWizard.22 = ຄ້ອຠ+OptionWizard.23 = ມີ​ຄວາມ​ຜິດ​ພາດ​ໃນ​ເວ​ລາ Re​\: ເປີດ​ໄດ້​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»€àº›àº±àº™â€‹à»„ດ້àºàº»àºâ€‹à»€àº¥àºµàºâ€‹àºàº²àº™ +OptionWizard.24 = àºàº»àºà»€àº¥àºµàºàºàº²àº™ +OptionWizard.25 = ຮູບ​à»àºšàºšâ€‹àºàº²àº™â€‹àº”à»àº²â€‹à»€àº™àºµàº™â€‹àº‡àº²àº™ +OptionWizard.26 = àºàº²àº™â€‹à»€àº›àº±àº™â€‹à»€àºˆàº»à»‰àº²â€‹àºžàº²àºš DB +OptionWizard.27 = ນີ້​ບà»à»ˆâ€‹à»„ດ້​ເປັນ​ທີ່​àºàº­àº¡â€‹àº®àº±àºš Saiku Folder (ເອ​àºàº°â€‹àºªàº²àº™â€‹à»€àº¥àºµà»ˆàº¡ saiku.bat ບà»à»ˆâ€‹à»àº¡à»ˆàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹) +OptionWizard.28 = Saiku Server ບà»à»ˆâ€‹àº®àº­àº‡â€‹àº®àº±àºš +OptionWizard.29 = ພ໠DB +OptionWizard.3 = Server ຕົວ​ຢ່າງ +OptionWizard.30 = ທາງ​ເລືອຠSQLite +OptionWizard.31 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº•ົວ​ຢ່າງ +OptionWizard.32 = ຮູບ​à»àºšàºšâ€‹àº”ິນ​ຕອນ +OptionWizard.33 = ສà»àº²â€‹àº«àº¼àº§àº”​ນຸ​àºàº»àº¡ +OptionWizard.34 = à»àºšàºšâ€‹àºžàº´â€‹à»€àºªàº” +OptionWizard.35 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ຈຸດ​ຕົວ​ຢ່າງ +OptionWizard.36 = ໄລ​àºàº°â€‹àº—າງ​ລະ​ຫວ່າງ​ຈຸດ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àº•ົວ​ຢ່າງ (ໃນ​ຕາ​) +OptionWizard.37 = ອັດ​ຕາ​ທີ່​ມີ​ຊາàºâ€‹à»àº”ນ​ດິນ​ຕອນ (à»àº¡àº±àº”​) +OptionWizard.38 = ໄຟລ​໌ CSV / CED ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ອ່ານ​ໄດ້​ຢ່າງ​ຖືàºâ€‹àº•້ອງ
ເອ​àºàº°â€‹àºªàº²àº™â€‹à»„ດ້​ຖືàºâ€‹àº„າດ​ວ່າ​ຈະ​ມີ​ມູນ​ຄ່າ​àºàº²àº™â€‹à»àºàºâ€‹àºˆàº¸â€‹àº¥àº°â€‹àºžàº²àºâ€‹à»€àºŠàº±à»ˆàº™â€‹àº™àºµà»‰â€‹\:​.
+OptionWizard.39 = ລະ​ຫັດ​, YCoordinate​, XCoordinate​, ພູ​, ລັàºâ€‹àºªàº°â€‹àº™àº° +OptionWizard.4 = IP ຄອມ​ພິວ​ເຕີ​ປັດ​ຈຸ​ບັນ​\: +OptionWizard.40 = ໂຄງ​àºàº²àº™ +OptionWizard.41 = ໂຫຼດ​ໄຟລ​໌​ໂຄງ​àºàº²àº™â€‹à»ƒàº«àº¡à»ˆ +OptionWizard.42 = ຜິດ​ພາດ​ໃນ​ເວ​ລາ​ປິດ​àºàº²àº™â€‹àº­à»ˆàº²àº™ CSV +OptionWizard.43 = ຊື່​ຂອງ​àºàº²àº™â€‹àºªà»àº²â€‹àº«àº¼àº§àº” +OptionWizard.44 = ຖານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ປ​ໃຫ້​ເຖິງ​ອັດ​ຕະ​ໂນ​ມັດ​ທີ່ +OptionWizard.45 = Open Earth Engine ຊູມ​ເຂົ້າ​ໄປ​ໃນ​ເຂດ​ຕອນ​ດິນ​ຂອງ​ຕົນ +OptionWizard.46 = timelapse ຈັàºâ€‹à»€àº›àºµàº”​ໂລàºâ€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºžàº·à»‰àº™â€‹àº—ີ່​ຕອນ​ດິນ​ຂອງ​ຕົນ +OptionWizard.47 = Open à»àºœàº™ Bing ສà»àº²â€‹àº¥àº±àºšâ€‹àºžàº·à»‰àº™â€‹àº—ີ່​ຕອນ​ດິນ​ຂອງ​ຕົນ +OptionWizard.48 = ຮູບ​à»àºšàºšâ€‹à»€àº›àºµàº”​ໃນ​ຕົວ​ທ່ອງ​ເວັບ​ຂອງ​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»„ດ້ (à»àº™àº°â€‹àº™à»àº²â€‹à»ƒàº«à»‰â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™ LINUX​) +OptionWizard.49 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™ Ced / csv ໄຟລ​໌​ທີ່​ມີ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº•ອນ​ດິນ​ຂອງ​ຕົນàºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +OptionWizard.5 = port ໂລຠServer​\: +OptionWizard.50 = Browse ... +OptionWizard.51 = ເອ​àºàº°â€‹àºªàº²àº™â€‹à»‚ຄງ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຜິດ​ພາດ +OptionWizard.52 = CSV / ເອ​àºàº°â€‹àºªàº²àº™ Ced ມີ​àºàº²àº™â€‹àº›àº°â€‹àºªàº²àº™â€‹àº‡àº²àº™â€‹à»€àº—ົ່າ​ນັ້ນ +OptionWizard.54 = ຈຸດ​ສູນ​àºàº²àº‡ +OptionWizard.55 = Error ໂຟນ​ເດີ​ໂຄງ​àºàº²àº™â€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ +OptionWizard.56 = ໂຄງ​àºàº²àº™ Load +OptionWizard.57 = ໂຄງ​àºàº²àº™ loaded àºà»ˆàº­àº™â€‹àº«àº™à»‰àº²â€‹àº™àºµà»‰ +OptionWizard.58 = Open GEE Code Editor (ຮຽàºâ€‹àº®à»‰àº­àº‡â€‹à»ƒàº«à»‰â€‹àº¡àºµâ€‹àºàº²àº™â€‹à»€àº‚ົ້າ​ເຖິງ Tester Trusted​) +OptionWizard.59 = Open ທີ່​ນີ້​à»àºœàº™â€‹àº—ີ່​ສຸມ​ໃສ່​ຕອນ​ດິນ​ຂອງ​ຕົນ +OptionWizard.6 = ຕົວ​àºà»àº²â€‹àº™àº»àº”​àºàº²àº™ PostgreSQL DB +OptionWizard.65 = ເສັ້ນ​ທາງ​àºàº±àºšâ€‹à»‚ຟນ​ເດີ​ທີ່ Saiku +OptionWizard.66 = Browse ... +OptionWizard.67 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ບັດ​àºàº²àº™ Firefox +OptionWizard.68 = Browse ... +OptionWizard.7 = ຊື່​ຜູ້​ໃຊ້ +OptionWizard.70 = àºàº²àº™â€‹àºšà»â€‹àº¥àº´â€‹àº«àº²àº™â€‹à»„ຟ +OptionWizard.72 = ໄຟລ​໌​ຖານ​ສອງ +OptionWizard.73 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ບັດ​àºàº²àº™ Chrome +OptionWizard.74 = Browse ... +OptionWizard.76 = àºàº²àº™â€‹àºšà»â€‹àº¥àº´â€‹àº«àº²àº™â€‹à»„ຟ +OptionWizard.78 = ໄຟລ​໌​ຖານ​ສອງ +OptionWizard.79 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹à»àºšàºš KML Freemarker +OptionWizard.8 = ລະ​ຫັດ​ຜ່ານ +OptionWizard.80 = Browse ... +OptionWizard.82 = à»àº¡à»ˆâ€‹à»àºšàºš Freemarker +OptionWizard.83 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº­àº­àºâ€‹à»àºšàºšâ€‹àº®àº¹àºšâ€‹à»àºšàºš HTML ປູມ​ເປົ້າ +OptionWizard.84 = Browse ... +OptionWizard.86 = HTML webpage +OptionWizard.87 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™ XML àºàº±àºšâ€‹àº„à»àº²â€‹àº™àº´â€‹àºàº²àº¡ IDM +OptionWizard.88 = Browse ... +OptionWizard.9 = ຊື່ DB +OptionWizard.90 = ຫມາຠIDM XML +OptionWizard.91 = Server (ສະ​ບັບ​ຜູ້​ຈັດ​àºàº²àº™â€‹àº«àº¼àº·â€‹àº¢àº·àº™â€‹àº¢àº¹à»ˆâ€‹àº„ົນ​ດຽວ​ໃຊ້​) +OptionWizard.92 = ລູàºâ€‹àº„້າ (ປະ​ຕິ​ບັດ​àºàº²àº™ / àºàº²àº™â€‹à»€àºŠàº·à»ˆàº­àº¡â€‹àº•à»à»ˆâ€‹àºàº±àºšâ€‹à»€àº„ື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹) +OptionWizard.93 = SQLite (à»àºšàºšâ€‹àºàº±àº‡ / ໄຟລ​໌​ດຽວ​ຕາມ​) +OptionWizard.94 = PostgreSQL +SaikuAnalysisListener.0 = à»àº¡à»ˆàº™ - ຂà»à»‰â€‹àº¡àº¹àº™ Refresh Saiku (ຂະ​ບວນ​àºàº²àº™â€‹àºàº²àº§â€‹) +SaikuAnalysisListener.1 = ບà»à»ˆ - ພຽງ​à»àº•່​ເລີ່ມ​ຕົ້ນ Saiku +SaikuStarter.1 = ເລີ່ມ Saiku +SaikuStarter.2 = u0EC0ລີ່ມ Saiku ສາ​ມາດ​ໃຊ້​ເວ​ລາ​ນາ​ທີ \= àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº¥à»â€‹àº–້າ ​\! +SaveEarthDataServlet.0 = àºàº²àº™â€‹àº®à»‰àº­àº‡â€‹àº‚à»â€‹à»€àº›àº»à»ˆàº² +SaveEarthDataServlet.1 = ບັນ​ຫາ​ທີ່​ເàºàºµàº”​ຂຶ້ນ​ໃນ​ຂະ​ນະ​ທີ່​ປະ​ຢັດ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ດ້ +SaveEarthDataServlet.2 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໄດ້​ບັນ​ທືຠ+SlopeCode.0 = ລຽບ (0-5​)àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +EarthApp.11 = ໃນ​ທົ່ວ​ໂລàºâ€‹à»àº¡à»ˆàº™â€‹à»àº¥à»‰àº§â€‹à»àº¥à»ˆàº™ +EarthApp.21 = ໄຟ​ທີ່​ມີ​ຕາ​ຂ່າàºâ€‹à»„ຟ​ຟ້າ​ຂອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ເປັນ CSV / CED à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹àºžàº»àºšâ€‹à»€àº«àº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹à»€àºªàº±à»‰àº™â€‹àº—າງ​ທີ່​ເລືອàºâ€‹\:
+EarthApp.23 = ບà»à»ˆâ€‹à»„ຟລ​໌ CSV / CED ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

+EarthApp.24 = ໄຟ​ທີ່​ມີ​à»àº¡à»ˆâ€‹à»àºšàºš Freemarker ທີ່​ມີ​ຄà»àº²â€‹àº™àº´â€‹àºàº²àº¡ KML ບà»à»ˆâ€‹à»„ດ້​ພົບ​ເຫັນ​ຢູ່​ໃນ​ເສັ້ນ​ທາງ​ທີ່​ເລືອàºâ€‹\:
+EarthApp.26 = ບà»à»ˆâ€‹à»„ຟລ​໌​ຄà»àº²â€‹àº™àº´â€‹àºàº²àº¡ KML ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

+EarthApp.27 = ໄຟ​ທີ່​ມີ​ຮູບ​à»àºšàºšâ€‹àº›àº¹àº¡â€‹à»€àº›àº»à»‰àº² HTML ໄດ້​à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹àºžàº»àºšâ€‹à»€àº«àº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹à»€àºªàº±à»‰àº™â€‹àº—າງ​ທີ່​ເລືອàºâ€‹\:
+EarthApp.29 = ບà»à»ˆâ€‹à»„ຟລ​໌​ປູມ​ເປົ້າ HTML ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

+EarthApp.3 = ເຕືອນ​ຂ້ອàºâ€‹àº•à»à»ˆâ€‹àº¡àº² +EarthApp.30 = àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹à»àºà»‰â€‹à»„ຂ​ສະ​ຖານ​ທີ່​ໄຟລ​໌​ຢູ່​ໃນ​ເມ​ນູ Tools-> Properties​. +EarthApp.4 = àºàº²àº™â€‹àº›àº±àºšâ€‹àº›àº¸àº‡â€‹à»ƒàº™â€‹àº›àº±àº”​ຈຸ​ບັນ +EarthApp.5 = ຢ່າ​ເຕືອນ​ຂ້າ​ພະ​ເຈົ້າ​ອີàºâ€‹à»€àº—ື່ອ​ຫນຶ່ງ +EarthApp.57 = ມີ​ສະ​ບັບ​ໃຫມ່​ຂອງ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹àº—ີ່​ມີ à»àº¡à»ˆàº™â€‹\!
ທ່ານ​ບà»à»ˆâ€‹àº•້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹? ເຕືອນ +EarthApp.58 = ປັບ​ປຸງ +EarthApp.59 Error \= ໃນ​ເວ​ລາ​ທີ່​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ເອ​àºàº°â€‹àºªàº²àº™â€‹à»‚ຄງ​àºàº²àº™ +EarthApp.6 = \ - ສະ​ບັບ +EarthApp.61 = ເອ​àºàº°â€‹àºªàº²àº™â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹à»„ດ້​ເàºàº±àºšâ€‹àºà»àº²â€‹àºšà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ຈະ​ເປີດ​ເຜີàºâ€‹.
àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹à»€àº®àº±àº”​ໃຫ້​à»àº™à»ˆâ€‹à»ƒàºˆàº§à»ˆâ€‹àº²â€‹àº—ີ່​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»àº¡à»ˆàº™â€‹àºàº²àº™â€‹àº•ິດ​ຕັ້ງ​. +EarthSurveyService.9 = ພາàºâ€‹àºªàº°â€‹àº«àº™àº²àº¡â€‹àº—ີ່​ຕ້ອງ​àºàº²àº™à»€àº­àº»àº² +ExportActionListener.1 = ວັນ​ທີ່​ຈະ​ບັນ​ທຶàºâ€‹àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àºˆàº²àºàº‚à»à»‰â€‹àº¡àº¹àº™ +ExportDialogProcessMonitor.0 àºàº²àº™â€‹àº›àº¸àº‡â€‹à»àº•່ງ \= ... +ExportDialogProcessMonitor.1 = ລà»â€‹àº–້າ​ທີ່​ຈະ​ເລີ່ມ​ຕົ້ນ​ຂະ​ບວນ​àºàº²àº™â€‹\:àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àº +ExportDialogProcessMonitor.4 =​\: +ImportProcessMonitorDialog.0 = àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​\: +ImportActionListener.0 = ຄວນ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àº—ີ່​ດິນ​ທີ່​ບà»à»ˆâ€‹à»„ດ້​ຮັບ​àºàº²àº™â€‹à»€àº•ີມ​ລົງ​ໄປ​ໃນ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ໄດ້ +ImportActionListener.2 = ຖ້າ​ທ່ານ​ຄລິàºâ€‹à»ƒàºªà»ˆ ບà»à»ˆ ພຽງ​à»àº•່​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºˆàº²àºâ€‹àºžàº²àºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ຢູ່​ໃນ​ສະ​ພາບ "ສີ​ຂຽວ​"​, ທີ່​ບັນ​ຈຸ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ັງ​ຫມົດ​ໄດ້​, ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​. +ImportActionListener.3 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ບັນ​ທຶàºâ€‹àº—າງ​àºàº²àº™â€‹àºªà»àº²â€‹à»€àº¥àº±àº”​ຮູບ +ImportDialogProcessMonitor.0 = \ ຄິດ​ໄລ່ +ImportDialogProcessMonitor.11 = ຈà»àº²â€‹àº™àº§àº™â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ​ຂອງ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹\: +ImportDialogProcessMonitor.2 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ບັນ​ທຶàºâ€‹àºàº²àº™ ... +ImportDialogProcessMonitor.5 = ຈ​à»â€‹àº²â€‹àº™àº§àº™â€‹àº•ົວ​ຈິງ​ຂອງ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​\:ຂà»à»‰â€‹àº¡àº¹àº™ +ImportDialogProcessMonitor.8 àºàº²àº™â€‹àº›àº¸àº‡â€‹à»àº•່ງ \= ... +InfiniteProgressMonitor.0 = àºàº»àºâ€‹à»€àº¥àºµàºâ€‹àºàº²àº™â€‹àº”à»àº²â€‹à»€àº™àºµàº™â€‹àº‡àº²àº™àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +JFileChooserExistsAware.0 = file ໂລàºâ€‹à»‚ຄງ​àºàº²àº™ +KmlImportService.13 = ເລືອàºâ€‹à»„ຟລ​໌ CSV ເພື່ອ​ຊ່ວàºâ€‹àº›àº°â€‹àº¢àº±àº”​ສະ​ຖານ​ຕອນ​ດິນ​ຂອງ​ຕົນ​ເພື່ອ +MissingPlotsListener.0 Error \= ໃນ​ຂະ​ນະ​ທີ່​àºàº²àº™â€‹à»„ດ້​ຮັບ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àº—ີ່​ດິນ​ບà»à»ˆâ€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ດ້ +MissingPlotsListener.1 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ໄປ +MissingPlotsListener.10 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ໃນ​àºàº²àº™â€‹àº­àº­àºâ€‹à»àºšàºšâ€‹àºªàº¸à»ˆàº¡â€‹àº•ົວ​ຢ່າງ​\: +MissingPlotsListener.12 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ຫາàºâ€‹à»„ປ​\: +MissingPlotsListener.14 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທັງ​ຫມົດ​à»àº¡à»ˆàº™â€‹à»„ດ້​ເຕີມ​ລົງ​ໄປ ​\!ເນື້ອ​ໃນ +MissingPlotsListener.2 = ຄັດ​ລອàºâ€‹à»„ປ​ທີ່ clipboardເອົາ +MissingPlotsListener.3 = ໄຟລ​໌​ທີ່​ບັນ​ຈຸ​ມີ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ສານ​ຕອນ​ດິນ​ຂອງ​ຕົນ (.csv ຫຼື​ໄຟລ​໌ .ced​) ສà»àº²â€‹àº¥àº±àºšâ€‹àº—ີ່​ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ຮູ້​ວ່າ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ັງ​ຫມົດ​ໄດ້​ຮັບ​àºàº²àº™â€‹à»€àº•ີມ​ລົງ​ໄປ​. +MissingPlotsListener.4 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຫາàºâ€‹à»„ປ - ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ສານ +MissingPlotsListener.5 = ຈາàºâ€‹à»„ຟ​\: +MissingPlotsListener.6 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ​ໄຟລ​໌ CED +ProcessMonitorDialog.1 = ຂà»à»‰â€‹àºœàº´àº”​ພາດ Parsing àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àºˆà»àº²â€‹àº™àº§àº™â€‹àºàº²àº™â€‹àº•ິດ​ຕà»à»ˆâ€‹àºàº±àº™ +ProcessMonitorDialog.4 = ຖັນ​, +ProcessMonitorDialog.5 = \ - ຄຸນ​ຄ່າ \ No newline at end of file From 55cd7652003898b4afd498917436ff38c6202ffc Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:30 +0100 Subject: [PATCH 0854/1620] New translations Messages_lo.properties (Spanish) --- .../earth/app/view/Messages_es.properties | 448 +++++++++--------- 1 file changed, 220 insertions(+), 228 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index f759c433b0..e5b9bd9e45 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,228 +1,220 @@ -AboutDialog.19=कोई समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ -AboutDialog.5=अधिक जानकारी के लिठहमारी वेबसाइट पर जाà¤à¤‚ OpenForis.org -AboutDialog.6=कà¥à¤·à¤®à¤¾ करें, à¤à¤• समसà¥à¤¯à¤¾ आपके सिसà¥à¤Ÿà¤® के मानक बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में इस लिंक को खोलने की कोशिश कर रही है. -AboutDialog.8=ठीक -AspectCode.0=उतà¥à¤¤à¤° दिशा -AspectCode.1=उतà¥à¤¤à¤°-पूरà¥à¤µ दिशा -AspectCode.2=पूरà¥à¤µ दिशा -AspectCode.3=दकà¥à¤·à¤¿à¤£-पूरà¥à¤µ दिशा -AspectCode.4=दकà¥à¤·à¤¿à¤£ दिशा -AspectCode.5=दकà¥à¤·à¤¿à¤£-पशà¥à¤šà¤¿à¤® दिशा -AspectCode.6=पशà¥à¤šà¤¿à¤® दिशा -AspectCode.7=उतà¥à¤¤à¤°-पशà¥à¤šà¤¿à¤® दिशा -CollectEarthWindow.0=तà¥à¤°à¥à¤Ÿà¤¿ जब सीà¤à¤¸à¤µà¥€ फ़ाइल में डेटा निरà¥à¤¯à¤¾à¤¤ करने का पà¥à¤°à¤¯à¤¾à¤¸ -CollectEarthWindow.1=निरà¥à¤¯à¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.10=फ़ाइल -CollectEarthWindow.11=बाहर जाà¤à¤‚ -CollectEarthWindow.12=उपकरण -CollectEarthWindow.13=डेटा सीà¤à¤¸à¤µà¥€ निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.14=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ -CollectEarthWindow.15=गà¥à¤£ -CollectEarthWindow.16=मदद -CollectEarthWindow.17=असà¥à¤µà¥€à¤•रण -CollectEarthWindow.18=डेटाबेस में लापता भूखंडों खोजें -CollectEarthWindow.19=पृथà¥à¤µà¥€ इकटà¥à¤ à¤¾ -CollectEarthWindow.2=भाषा -CollectEarthWindow.20=डà¥à¤ªà¥à¤²à¤¿à¤•ेट रिकॉरà¥à¤¡ की संखà¥à¤¯à¤¾\: -CollectEarthWindow.21=मà¥à¤–à¥à¤¯ फà¥à¤°à¥‡à¤® के लिठआइकन नहीं मिल सकता है -CollectEarthWindow.22=आपको लगता है कि आप à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ बंद करना चाहते हैं? विंडोज बंद करने से, à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° बंद हो जाà¤à¤—ा -CollectEarthWindow.23=पà¥à¤·à¥à¤Ÿà¤¿ की जरूरत है -CollectEarthWindow.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.25=आप वैसे भी इन अभिलेखों को जोड़ना चाहते हैं और अपने वरà¥à¤¤à¤®à¤¾à¤¨ डेटा खोने के लिठकिलक करना चाहते हैं? -CollectEarthWindow.26=ऑपरेटर,पà¥à¤°à¤šà¤¾à¤²à¤• -CollectEarthWindow.27=अदà¥à¤¯à¤¤à¤¨ -CollectEarthWindow.28= औपन फौरिस à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° चल रहा होना चाहिठ, जबभी ऑपरेटर डेटा की वà¥à¤¯à¤¾à¤–à¥à¤¯à¤¾ करें . -CollectEarthWindow.29=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. -CollectEarthWindow.3= आयात संबंधी तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.30=जबभी आप गà¥à¤—ल अरà¥à¤¥ का उपयोग कर रहे हैं, कृपया इस विंडोज को खà¥à¤²à¥€ बनाठरखें. -CollectEarthWindow.31=à¤à¤•तà¥à¤° डेटा सीà¤à¤¸à¤µà¥€ फाइल में भेजें -CollectEarthWindow.32=छोड़ना -CollectEarthWindow.33=ऑपरेटर का नाम के 5 अकà¥à¤·à¤° से बड़ा और 50 अकà¥à¤·à¤° से कम होना चाहिठ-CollectEarthWindow.34=मानà¥à¤¯à¤¤à¤¾ तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.35=ऑपरेटर नाम खाली\!
कृपया ऑपरेटर का नाम भरें और "अदà¥à¤¯à¤¤à¤¨" बटन दबाà¤à¤. -CollectEarthWindow.36=ऑपरेटर नाम रिकà¥à¤¤ नहीं हो सकता -CollectEarthWindow.37=खà¥à¤²à¤¾ रखो -CollectEarthWindow.38=सीà¤à¤¸à¤µà¥€ फ़ाइल -CollectEarthWindow.39=सूचना\: यह सलाह दी जाती है कि आप नठडेटा डालने करने से पहले अपने मौजूदा आंकडों को बैकअप(à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤) कर लें -CollectEarthWindow.4=à¤à¤«à¤à¤“ असà¥à¤µà¥€à¤•रण नोटिस -CollectEarthWindow.40=उस फ़ोलà¥à¤¡à¤° पर जाà¤à¤‚ जहां साà¤à¤•ॠसरà¥à¤µà¤° में सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ किया गया है, फ़ोलà¥à¤¡à¤° का रासà¥à¤¤à¤¾ उपकरण> गà¥à¤£> उनà¥à¤¨à¤¤ टैब. -CollectEarthWindow.41=निरà¥à¤¯à¤¾à¤¤ डेटा को फ़ाइल में बचाया जा रहा है \: -CollectEarthWindow.42=छोड़ना -CollectEarthWindow.43=परसà¥à¤ªà¤° विरोधी रिकॉरà¥à¤¡ पाया -CollectEarthWindow.44=डेटा आयात / निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.45=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ डेटा (संकà¥à¤šà¤¿à¤¤) -CollectEarthWindow.46=ज़िप से नठडेटा आयात करें (संकà¥à¤šà¤¿à¤¤ à¤à¤•à¥à¤¸à¤à¤®à¤à¤²) -CollectEarthWindow.55=सीà¤à¤¸à¤µà¥€ का उपयोग कर मौजूदा रिकॉरà¥à¤¡ को अपडेट करें -CollectEarthWindow.47=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. -CollectEarthWindow.48=ज़िप / à¤à¤•तà¥à¤°-डेटा फ़ाइल -CollectEarthWindow.49=फà¥à¤¯à¥‚जन सीà¤à¤¸à¤µà¥€ फ़ाइल -CollectEarthWindow.5=बंद करे -CollectEarthWindow.50= उपयोगकरà¥à¤¤à¤¾ मैनà¥à¤…ल खोलें -CollectEarthWindow.51=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ के अदà¥à¤¯à¤¤à¤¨ के लिठजाà¤à¤š करें -CollectEarthWindow.52= अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— लॉग फ़ाइल खोलें -CollectEarthWindow.53=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ लॉग फ़ाइल -CollectEarthWindow.54=केà¤à¤®à¤à¤² से लोड अंक -CollectEarthWindow.56=के विषय में... -CollectEarthWindow.57=साà¤à¤•ॠसà¥à¤Ÿà¤¾à¤°à¥à¤Ÿà¤° पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ अभी भी चल रहा है, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें. -CollectEarthWindow.58=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ नहीं कर सकते -CollectEarthWindow.59=आप साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ के लिठडेटा सेट फिर से उतà¥à¤ªà¤¨à¥à¤¨ करने के लिठकरना चाहते हैं?
यह पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ समय लेने वाली हो सकती है.
आप यदि "हाà¤"पर कà¥à¤²à¤¿à¤• करें, तो नवीनतम जानकारी के साथ à¤à¤• नया डाटासेट उतà¥à¤ªà¤¨à¥à¤¨ हो जाà¤à¤—ा. -CollectEarthWindow.6=फà¥à¤¯à¥‚जन टेबल के लिठनिरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.60=साà¤à¤•ॠडेटा उतà¥à¤ªà¤¨à¥à¤¨ -CollectEarthWindow.61=डेटा à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ (पिछले निरà¥à¤¯à¤¾à¤¤ के बाद से संशोधित रिकॉरà¥à¤¡) -CollectEarthWindow.62=के विषय मे... -CollectEarthWindow.63=केà¤à¤®à¤à¤² से अंक पà¥à¤°à¤¾à¤ªà¥à¤¤ करने में तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.64=तकनीकी सहायता -CollectEarthWindow.7=डेटा आयात में तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.8=असà¥à¤µà¥€à¤•रण पाठ नहीं पाया जा सका -CollectEarthWindow.9=डेटा आयात रिकॉरà¥à¤¡ वह है जो कि पहले से ही अपने डेटाबेस पर मौजूद हैं शामिल. -DynamicsCode.0=पà¥à¤°à¤¾à¤°à¤‚भ में वन -DynamicsCode.1=पà¥à¤°à¤¾à¤°à¤‚भ में घास का मैदान, -DynamicsCode.2=पà¥à¤°à¤¾à¤°à¤‚भ में आबादी वाला इलाका -DynamicsCode.3=पà¥à¤°à¤¾à¤°à¤‚भ में बंजर -DynamicsCode.4=पà¥à¤°à¤¾à¤°à¤‚भ में आरà¥à¤¦à¥à¤° भूमि -DynamicsCode.5=पà¥à¤°à¤¾à¤°à¤‚भ में खेत -OpenTextFileListener.0=इस पाठ का फ़ाइल नहीं मिला \: -OptionWizard.0= विकलà¥à¤ª -OptionWizard.1=बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° चà¥à¤¨à¥‡à¤‚ -OptionWizard.10=बैकअप फ़ोलà¥à¤¡à¤° खोलें -OptionWizard.11=अजà¥à¤žà¤¾à¤¤\: उपयोग ifconfig -OptionWizard.12=गà¥à¤°à¤¾à¤¹à¤•ों का उलà¥à¤²à¥‡à¤– -OptionWizard.13=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° आईपी -OptionWizard.14=कतà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ (उदाहरण- 8023) -OptionWizard.15=बचाà¤à¤‚ और परिवरà¥à¤¤à¤¨ लागू करें -OptionWizard.16=आईडी -OptionWizard.17=X- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क -OptionWizard.18=Y- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क -OptionWizard.19=उठान -OptionWizard.2=कारà¥à¤¯à¤ªà¥à¤°à¤µà¤¾à¤¹ (सरà¥à¤µà¤° / गà¥à¤°à¤¾à¤¹à¤•) -OptionWizard.20=गूगल अरà¥à¤¥ अंतरà¥à¤µà¤¸à¥à¤¤à¥ बदल दिया गया है
यदि गà¥à¤—ल अरà¥à¤¥ आप से कहे,अंतरà¥à¤µà¤¸à¥à¤¤à¥ पà¥à¤¨à¤ƒ लोड सà¥à¤µà¥€à¤•ार करें . -OptionWizard.21=अदà¥à¤¯à¤¤à¤¨ सफल -OptionWizard.22=ढाल -OptionWizard.23=गूगल अरà¥à¤¥ डेटा को फिर से खोलने में कोई तà¥à¤°à¥à¤Ÿà¤¿ थी -OptionWizard.24=रदà¥à¤¦ करना -OptionWizard.25=ऑपरेशन मोड -OptionWizard.26=डीबी होसà¥à¤Ÿ -OptionWizard.27=यह à¤à¤• मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ साà¤à¤•ॠफ़ोलà¥à¤¡à¤° नहीं है ( सà¥à¤Ÿà¤¾à¤°à¥à¤Ÿ-साà¤à¤•à¥.batफ़ाइल मौजूद नहीं है) -OptionWizard.28=साà¤à¤•ॠसरà¥à¤µà¤° मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ नहीं -OptionWizard.29=डीबी पोरà¥à¤Ÿ -OptionWizard.3=सरà¥à¤µà¤° आवृतà¥à¤¤à¤¿ -OptionWizard.30=à¤à¤¸à¤•à¥à¤¯à¥ लाइट विकलà¥à¤ª -OptionWizard.31=सेमà¥à¤ªà¤² डेटा -OptionWizard.32=पà¥à¤²à¥‰à¤Ÿ लेआउट -OptionWizard.33=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ परिभाषा -OptionWizard.34=विकसित -OptionWizard.35=सेमà¥à¤ªà¤² अंक की संखà¥à¤¯à¤¾ -OptionWizard.36=सेमà¥à¤ªà¤² बिंदॠके बीच दूरी (मीटर में) -OptionWizard.37=भूखंड की सीमा के साथ मारà¥à¤œà¤¿à¤¨ (मीटर मे) -OptionWizard.38=सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सही ढंग से पढ़ा नहीं जा सकता.
इस फ़ाइल में à¤à¤• अलà¥à¤ªà¤µà¤¿à¤°à¤¾à¤® से अलग मूलà¥à¤¯à¥‹à¤‚ की उमà¥à¤®à¥€à¤¦ है \:
-OptionWizard.39=आईडी, वाई समनà¥à¤µà¤¯, à¤à¤•à¥à¤¸ समनà¥à¤µà¤¯, ऊंचाई, ढाल, पहलू -OptionWizard.4=वरà¥à¤¤à¤®à¤¾à¤¨ कंपà¥à¤¯à¥‚टर आईपी \: -OptionWizard.40=परियोजनाà¤à¤‚ -OptionWizard.41=à¤à¤• नई परियोजना फ़ाइल लोड करें -OptionWizard.42=सीà¤à¤¸à¤µà¥€ पाठक को बंद करते समय तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.43=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ का नाम -OptionWizard.44= सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ बैकअप डेटाबेस -OptionWizard.45=ओपन पृथà¥à¤µà¥€ इंजन ने पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° में जूम किया -OptionWizard.46=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठपृथà¥à¤µà¥€ इंजन टाइमलैपà¥à¤¸ खोलें -OptionWizard.47=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठबिंग मैपà¥à¤¸ खोलें -OptionWizard.48=बजाय गूगल अरà¥à¤¥ के फॉरà¥à¤® à¤à¤• बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° पर खोलें (लिनकà¥à¤¸ के लिठसिफारिश) -OptionWizard.49=भूखंड डेटा के साथ सीईडी / सीà¤à¤¸à¤µà¥€ फाइल भेजने के लिठपथ -OptionWizard.5=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ\: -OptionWizard.50=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.51=परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.52=केवल निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क के साथ सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल -OptionWizard.53=चौकोर -OptionWizard.54=केनà¥à¤¦à¥à¤°à¥€à¤¯ बिनà¥à¤¦à¥ -OptionWizard.55=परियोजना फ़ोलà¥à¤¡à¤° आयात तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.56=लोड परियोजना -OptionWizard.57=पहले से लोड परियोजना -OptionWizard.58= जी ई ई का मैदान खोलें (विशà¥à¤µà¤¸à¤¨à¥€à¤¯ जांचकरà¥à¤¤à¤¾ के उपयोग की आवशà¥à¤¯à¤•ता है) -OptionWizard.59=यहां भूखंड पर केंदà¥à¤°à¤¿à¤¤ मैपà¥à¤¸ खोलें -OptionWizard.6=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² डीबी मापदंड -OptionWizard.65=साà¤à¤•à¥à¤«à¤¼à¥‹à¤²à¥à¤¡à¤° का पथ -OptionWizard.66=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.67=फ़ायरफ़ॉकà¥à¤¸ निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ -OptionWizard.68=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.7=उपयोगकरà¥à¤¤à¤¾ नाम -OptionWizard.70=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों -OptionWizard.72=बाइनरी फ़ाइलें -OptionWizard.73=कà¥à¤°à¥‹à¤® निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ -OptionWizard.74=बà¥à¤°à¤¾à¤‰à¤œ -OptionWizard.76=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों -OptionWizard.78=बाइनरी फ़ाइलें -OptionWizard.79=केà¤à¤®à¤à¤² फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ के लिठपथ -OptionWizard.8=पासवरà¥à¤¡ -OptionWizard.80=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.82=फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ -OptionWizard.83=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ पà¥à¤°à¤ªà¤¤à¥à¤° डिज़ाइन करने के लिठपथ -OptionWizard.84=बà¥à¤°à¤¾à¤‰à¤œ..... -OptionWizard.86=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² वेब पेज -OptionWizard.87=पथ आइडीà¤à¤® परिभाषा के साथ à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठ-OptionWizard.88=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.9=डीबी नाम -OptionWizard.90=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² आइडीà¤à¤® परिभाषा -OptionWizard.91=सरà¥à¤µà¤° (पà¥à¤°à¤¬à¤‚धक संसà¥à¤•रण या खड़े अकेले का उपयोग करें) -OptionWizard.92=कà¥à¤²à¤¾à¤‡à¤‚ट (ऑपरेटर / सरà¥à¤µà¤° से जà¥à¤¡à¤¼à¥‡) -OptionWizard.93=सकà¥à¤¯à¥‚à¤à¤²à¤¾à¤‡à¤Ÿ (à¤à¤‚बेडेड / à¤à¤•ल फाइल आधारित) -OptionWizard.94=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² -OptionWizard.95=सेमà¥à¤ªà¤² डॉटà¥à¤¸ के साइड (मीटर में) -SaikuAnalysisListener.0=हाठ- ताज़ा साà¤à¤•ॠडेटा (लंबी पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾) -SaikuAnalysisListener.1=नहीं - बस साà¤à¤•ॠशà¥à¤°à¥‚ -SaikuStarter.1=साà¤à¤•ॠशà¥à¤°à¥‚ -SaikuStarter.2= साà¤à¤•ॠशà¥à¤°à¥‚ कà¥à¤› मिनट लग सकते हैं, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें\! -SaveEarthDataServlet.0=खाली अनà¥à¤°à¥‹à¤§ -SaveEarthDataServlet.1= डेटाबेस में डेटा बचाते समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ है -SaveEarthDataServlet.2=डेटा बचाया था -SlopeCode.0=समतल (0-5) -EarthApp.11=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ पहले से ही चल रहा है -EarthApp.21=à¤à¤• सीà¤à¤¸à¤µà¥€ / सीईडी के रूप में भूखंडों की गà¥à¤°à¤¿à¤¡ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
-EarthApp.23=कोई सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सेट-अप नहीं किया गया है \:

-EarthApp.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² परिभाषा के साथ फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है \:
-EarthApp.26=कोई à¤à¤•à¥à¤¸à¤à¤®à¤à¤² फ़ाइल परिभाषा सेट अप नहीं किया गया है \:

-EarthApp.27=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ रूप से यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
-EarthApp.29=कोई à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ फ़ाइल सेट-अप नहीं किया गया है \:

-EarthApp.3=मà¥à¤à¥‡ बाद में याद दिलाना -EarthApp.30=उपकरण> गà¥à¤£ मेनू में फ़ाइल सà¥à¤¥à¤¾à¤¨ को ठीक करें . -EarthApp.4=अभी अदà¥à¤¯à¤¤à¤¨ करें -EarthApp.5=मà¥à¤à¥‡ दà¥à¤¬à¤¾à¤°à¤¾ याद मत दिलाना -EarthApp.57=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ का à¤à¤• नया संसà¥à¤•रण उपलबà¥à¤§ है\!
आप कैसे आगे बढ़ना चाहते हैं? -EarthApp.58=अदà¥à¤¯à¤¤à¤¨ चेतावनी -EarthApp.59= परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ -EarthApp.6=\ - संसà¥à¤•रण -EarthApp.61=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ फाइल खà¥à¤² नहीं सकती .
कृपया सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करें कि गूगल अरà¥à¤¥ सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ है. -EarthSurveyService.9=आवशà¥à¤¯à¤• कà¥à¤·à¥‡à¤¤à¥à¤° -ExportActionListener.1= तारीख चूनें जबसे रिकॉरà¥à¤¡ निरà¥à¤¯à¤¾à¤¤ करने है -ExportDialogProcessMonitor.0=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... -ExportDialogProcessMonitor.1=पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ पà¥à¤°à¤¾à¤°à¤‚भ करने के लिठपà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ कर रहा है \: -ExportDialogProcessMonitor.4=निरà¥à¤¯à¤¾à¤¤ रिकॉरà¥à¤¡\: -ImportProcessMonitorDialog.0=आयातित रिकॉरà¥à¤¡ \: -ImportActionListener.0=कà¥à¤¯à¤¾ उन भूखंडों के लिठडेटा जो कि पूरी तरह से भरे नहीं गठ,आयातित किया जाना चाहिà¤? -ImportActionListener.2=आप कà¥à¤²à¤¿à¤• करें, नहींतो केवल डेटा "हरी" राजà¥à¤¯ में भूखंडों से ,जिसमें सभी डेटा यà¥à¤•à¥à¤¤ है , आयात किया जाà¤à¤—ा। -ImportDialogProcessMonitor.0=\ गणना -ImportDialogProcessMonitor.11=रिकॉरà¥à¤¡ की पà¥à¤°à¤¾à¤°à¤‚भिक संखà¥à¤¯à¤¾ \: -ImportDialogProcessMonitor.2=रिकॉरà¥à¤¡ आयात... -ImportDialogProcessMonitor.5=आयातित रिकॉरà¥à¤¡ की वासà¥à¤¤à¤µà¤¿à¤• संखà¥à¤¯à¤¾ \: -ImportDialogProcessMonitor.8=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... -InfiniteProgressMonitor.0=रदà¥à¤¦ ऑपरेशन -JFileChooserExistsAware.0=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ परियोजना फ़ाइल -KmlImportService.13=पà¥à¤²à¥‰à¤Ÿ सà¥à¤¥à¤¾à¤¨à¥‹à¤‚ को बचाने के लिठà¤à¤• सीà¤à¤¸à¤µà¥€ फ़ाइल का चयन करें -MissingPlotsListener.0=तà¥à¤°à¥à¤Ÿà¤¿ उन भूखंडों के बारे में जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ करने के लिठजो डेटाबेस पर मौजूद नहीं -MissingPlotsListener.1=गà¥à¤® भूखंड -MissingPlotsListener.10=सेमà¥à¤ªà¤² डिजाइन में भूखंडों की कà¥à¤² संखà¥à¤¯à¤¾ \: -MissingPlotsListener.12=गà¥à¤® भूखंडों की संखà¥à¤¯à¤¾ \: -MissingPlotsListener.14=सभी भूखंडों भर रहे हैं\! -MissingPlotsListener.2=कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ अंतरà¥à¤µà¤¸à¥à¤¤à¥ की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ -MissingPlotsListener.3=भूखंड की जानकारी वाले फ़ाइलें चà¥à¤¨à¥‡à¤‚ ( .सीà¤à¤¸à¤µà¥€ या .सीईडी फ़ाइलें ) जिसके लिठआप जानना चाहते हैं तो सभी डेटा भर दिया गया है चाहता हूà¤. -MissingPlotsListener.4=गà¥à¤® भूखंड- जानकारी -MissingPlotsListener.5=फ़ाइल से \: -MissingPlotsListener.6=सीà¤à¤¡à¥€ फ़ाइल में निरà¥à¤¯à¤¾à¤¤ करें -ProcessMonitorDialog.1=पंकà¥à¤¤à¤¿ संखà¥à¤¯à¤¾ पर तà¥à¤°à¥à¤Ÿà¤¿ -ProcessMonitorDialog.4=, कॉलम -ProcessMonitorDialog.5=\ --मूलà¥à¤¯ -YES= हां -YES_TO_ALL=सब को हां -NO=नहीं -NO_TO_ALL=सभी को नहीं - - - +AboutDialog.19 = ບັນ​ຫາ​ເàºàºµàº” A +AboutDialog.5 = ສà»àº²â€‹àº¥àº±àºšâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹à»€àºžàºµà»ˆàº¡â€‹à»€àº•ີມ​ໄດ້​ທີ່ OpenForis.org ເວັບ​ໄຊ​ທ​໌​ຂອງ​ພວàºâ€‹à»€àº®àº»àº² +AboutDialog.6 = ຂà»â€‹à»‚ທດ​ນà»àº²â€‹, ບັນ​ຫາ​ທີ່​ເàºàºµàº”​ຂຶ້ນ​ໃນ​ຂະ​ນະ​ທີ່​ຄວາມ​ພະ​àºàº²â€‹àºàº²àº¡â€‹àº—ີ່​ຈະ​ເປີດ​àºàº²àº™â€‹à»€àºŠàº·à»ˆàº­àº¡â€‹àº•à»à»ˆâ€‹àº™àºµà»‰â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹àº¥àº°â€‹àºšàº»àºšâ€‹àº‚ອງ​ທ່ານ​ຕົວ​ທ່ອງ​ເວັບ​ຂອງ​ມາດ​ຕະ​ຖານ​. +AboutDialog.8 = Ok +AspectCode.0 = ເຫນືອ +AspectCode.1 = ວັນ​ອອàºâ€‹àºªà»ˆàº½àº‡â€‹à»€àº«àº™àº·àº­ +AspectCode.2 = ຕາ​ເວັນ​ອອຠ+AspectCode.3 = ພາàºâ€‹à»ƒàº•້​, ຕາ​ເວັນ​ອອຠ+AspectCode.4 = ໃຕ້ +AspectCode.5 = ພາàºâ€‹à»ƒàº•້​, ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ+AspectCode.6 = ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ+AspectCode.7 = ພາàºâ€‹à»€àº«àº™àº·àº­â€‹, ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ+CollectEarthWindow.0 = ໃນ​ເວ​ລາ​ທີ່​ພະ​àºàº²â€‹àºàº²àº¡â€‹à»€àºžàº·à»ˆàº­â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌ CSVຄວາມ​ຜິດ​ພາດ +CollectEarthWindow.1 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àº +CollectEarthWindow.10 File \= +CollectEarthWindow.11 ອອàºâ€‹àºˆàº²àº \= +CollectEarthWindow.12 = ເຄື່ອງ​ມືຂà»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.13 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ CSV àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ +CollectEarthWindow.14 = Start SAIKU +CollectEarthWindow.15 = ຄຸນ​ສົມ​ບັດ +CollectEarthWindow.16 = ຊ່ວàºâ€‹à»€àº«àº¼àº·àº­ +CollectEarthWindow.17 = ປະ​ຕິ​ເສດ +CollectEarthWindow.18 = ຄົ້ນ​ຫາ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ຫາàºâ€‹à»„ປ​ໃນ​ຖານ​ຂà»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.19 = ເàºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ+CollectEarthWindow.2 = ພາ​ສາ +CollectEarthWindow.20 = ຈà»àº²â€‹àº™àº§àº™â€‹àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™ duplicated​\: +CollectEarthWindow.21 = ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ຊອàºâ€‹àº«àº² icon ສà»àº²â€‹àº¥àº±àºšâ€‹àºžàº²â€‹àº•ົ້ນ​ຕ໠+CollectEarthWindow.22 = ທ່ານ​ມີ​ຄວາມ​à»àº™à»ˆâ€‹à»ƒàºˆàº§à»ˆâ€‹àº²â€‹àº—່ານ​ຕ້ອງ​àºàº²àº™â€‹àº›àº´àº”​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹? ໃນ​àºàº²àº™â€‹àº›àº´àº”​ປ່ອງ​ຢ້ຽມ​àºàº±àº‡â€‹àºˆàº°â€‹àº›àº´àº”​ເຄື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹àº‚ອງ​ໂລàºâ€‹à»„ດ້​ເàºàº±àºšâ€‹àºà»àº² +CollectEarthWindow.23 = àºàº²àº™â€‹àº¢àº±à»‰àº‡â€‹àº¢àº·àº™â€‹àº—ີ່​ຈà»àº²â€‹à»€àº›àº±àº™ +CollectEarthWindow.24 = XML ສົ່ງ​ອອຠ+CollectEarthWindow.25 = ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ເພີ່ມ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹à»€àº«àº¼àº»à»ˆàº²â€‹àº™àºµà»‰â€‹à»àº¥à»‰àº§â€‹à»àº¥àº°â€‹àºàº²àº™â€‹àºªàº¹àº™â€‹à»€àºªàºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº‚ອງ​ທ່ານ​? +CollectEarthWindow.26 = ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™ +CollectEarthWindow.27 = ປັບ​ປຸງ +CollectEarthWindow.28 = ເຮັດ​ຢູ່​ຕ່າງ​ປະ​ເທດ​ເàºàº±àºšâ€‹àºà»àº²â€‹à»€àº„ື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹àº„ວນ​ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹à»àº¥à»ˆàº™â€‹à»ƒàº™â€‹àº‚ະ​ນະ​ທີ່​ຜູ້​ປະ​àºàº­àºšâ€‹àºàº²àº™â€‹àº•ີ​ຄວາມ​ຫມາàºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹. +CollectEarthWindow.29 = The Saiku Server ບà»à»ˆâ€‹à»„ດ້​ຖືàºâ€‹àº•ັ້ງ​. +CollectEarthWindow.3 = \ ຄວາມ​ຜິດ​ພາດ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ +CollectEarthWindow.30 = àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº®àº±àºâ€‹àºªàº²â€‹àºàº²àº™â€‹à»€àº›àºµàº”​ຫນ້າ​ຕ່າງ​ນີ້​ໃນ​ຂະ​ນະ​ທີ່​ທ່ານ​àºà»àº²â€‹àº¥àº±àº‡â€‹à»ƒàºŠà»‰â€‹àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹. +CollectEarthWindow.31 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌ CSV +CollectEarthWindow.32 = ອອຠ+CollectEarthWindow.33 = ຊື່​ຜູ້​ປະ​àºàº­àºšâ€‹àºàº²àº™â€‹àºˆàº°â€‹àº•້ອງ​ມີ​àºàº²àº™â€‹àº•à»à»ˆâ€‹à»„ປ​ອີàºâ€‹à»àº¥à»‰àº§â€‹àºâ€‹à»ˆâ€‹àº§àº² 5 ລັàºâ€‹àºªàº°â€‹àº™àº°â€‹à»àº¥àº°â€‹àºªàº±à»‰àº™â€‹àºâ€‹à»ˆâ€‹àº§àº² 50ຄວາມ​ຜິດ​ພາດ +CollectEarthWindow.34 = àºàº§àº”​ສອບ +CollectEarthWindow.35 = ຜູ້​ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹àº¥àº»àºšâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™ ​\! ຫລັàºâ€‹àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº•ື່ມ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàºªà»ˆâ€‹àºŠàº·à»ˆâ€‹àºœàº¹à»‰â€‹àº›àº°â€‹àºàº­àºšâ€‹àºàº²àº™â€‹à»àº¥àº°â€‹à»ƒàº«à»‰â€‹àºàº»àº”​ປຸ່ມ "ປັບ​ປຸງ​"​. ຊື່ +CollectEarthWindow.36 = ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹àºšà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ເປົ່າ +CollectEarthWindow.37 = ຮັàºâ€‹àºªàº²â€‹àºˆàº±àº™à»„ຟລ​໌ +CollectEarthWindow.38 = CSV +CollectEarthWindow.39 à»àºˆà»‰àº‡ \= ມັນ​ເປັນ​àºàº²àº™â€‹àºªàº»àº¡â€‹àº„ວນ​ທີ່​ທ່ານ​ໄປ​ເຖິງ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº‚ອງ​ທ່ານ (àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ XML​) àºà»ˆàº­àº™â€‹àº—ີ່​ຈະ​ໄດ້​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº«àº¡à»ˆâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ +CollectEarthWindow.4 = FAO à»àºˆà»‰àº‡â€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ເສດ +CollectEarthWindow.40 = ທີ່​àºà»àº²â€‹àº™àº»àº”​ໄວ້​ຕາມ​ເສັ້ນ​ທາງ​àºàº±àºšâ€‹à»‚ຟນ​ເດີ​ທີ່ Saiku Server ໄດ້​ຖືàºâ€‹àº•ິດ​ຕັ້ງ​ຢູ່​ໃນ Tools-> Properties-> à»àº–ບ​à»àºšàºšâ€‹àºžàº´â€‹à»€àºªàº”​ໄດ້​. +CollectEarthWindow.41 = àºàº²àº™â€‹àº›àº°â€‹àº«àºàº±àº”​àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌​\: +CollectEarthWindow.42 = ອອຠ+CollectEarthWindow.43 = àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº•à»àº²â€‹àºàº±àº™â€‹àº—ີ່​ພົບ​ເຫັນ +CollectEarthWindow.44 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ / ສົ່ງ​ອອàºàº‚à»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.45 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ XML (à»àº›â€‹)ຂà»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.46 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ໃຫມ່​ຈາàºâ€‹à»„ປ​ສະ​ນີ (XML à»àº›â€‹)àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™ +CollectEarthWindow.55 ປັບ​ປຸງ \= àºàº²àº™â€‹àº™à»àº²â€‹à»ƒàºŠà»‰ CSV +CollectEarthWindow.47 = Saiku Server ບà»à»ˆâ€‹à»„ດ້​àºà»àº²â€‹àº«àº™àº»àº” +CollectEarthWindow.48 = ໄຟລ​໌​ຫັດ​ໄປ​ສະໄຟລ​໌ +CollectEarthWindow.49 = Fusion CSV +CollectEarthWindow.5 = ປິດ +CollectEarthWindow.50 = ເປີດ​ຄູ່​ມື​àºàº²àº™â€‹à»ƒàºŠà»‰àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™â€‹àº›àº±àºšâ€‹àº›àº¸àº‡â€‹àº‚ອງ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ+CollectEarthWindow.51 CHECK \= àºàº§àº”​ສອບ +CollectEarthWindow.52 = File ເຂົ້າ​ສູ່​ລະ​ບົບ​ຄà»àº²â€‹àº®à»‰àº­àº‡â€‹àºªàº°â€‹àº«àº¡àº±àºâ€‹à»€àº›àºµàº” +CollectEarthWindow.53 = àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»€àº­â€‹àºàº°â€‹àºªàº²àº™â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹à»€àº‚ົ້າ​ສູ່​ລະ​ບົບຈຸດ +CollectEarthWindow.54 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຈາຠKMLàºà»ˆàº½àº§â€‹àºàº±àºš +CollectEarthWindow.56 = ... +CollectEarthWindow.57 = ຂະ​ບວນ​àºàº²àº™â€‹à»€àº¥àºµà»ˆàº¡â€‹àº•ົ້ນ Saiku à»àº¡à»ˆàº™â€‹àºàº±àº‡â€‹à»àº¥à»ˆàº™â€‹, àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº¥à»â€‹àº–້າ​. +CollectEarthWindow.58 = ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ເລີ່ມ​ຕົ້ນ​àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ Saiku +CollectEarthWindow.59 = ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ Re​\: àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ Saiku ໄດ້​?
ຂະ​ບວນ​àºàº²àº™â€‹àº™àºµà»‰â€‹àºªàº²â€‹àº¡àº²àº”​ໃຊ້​ເວ​ລາ​ຫຼາàº
ຖ້າ​ທ່ານ​ຄລິàºâ€‹à»ƒàºªà»ˆ "à»àº¡à»ˆàº™â€‹à»àº¥à»‰àº§â€‹" ເປັນ​ຊຸດ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໃຫມ່​ທີ່​ມີ​ຄວາມ​ຫຼ້າ​ສຸດ​ໄດ້​. ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº‚ຶ້ນ​. +CollectEarthWindow.6 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ Fusion ຕາ​ຕະ​ລາງàºàº²àº™â€‹àºœàº°â€‹àº¥àº´àº”​ຂà»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.60 = Saiku +CollectEarthWindow.61 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່ XML (àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº”ັດ​à»àºà»‰â€‹àº™àº±àºšâ€‹àº•ັ້ງ​à»àº•່​àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àºªàº¸àº”​ທ້າàºâ€‹) ສົ່ງ​ອອàºàºà»ˆàº½àº§â€‹àºàº±àºš +CollectEarthWindow.62 = ... +CollectEarthWindow.63 Error \= àºàº²àº™â€‹à»„ດ້​ຮັບ​ຈຸດ​ທີ່​ໄດ້​ຈາຠKML +CollectEarthWindow.64 = ສະ​ຫນັບ​ສະ​ຫນູນ​ທາງ​ເທàºâ€‹àº™àº´àº +CollectEarthWindow.7 Error \= ໃນ​ເວ​ລາ​ທີ່​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຂà»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.8 ຂà»à»‰â€‹àº„ວາມ​ປະ​ຕິ​ເສດ \= ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ພົບ​ເຫັນ +CollectEarthWindow.9 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໄດ້​ນà»àº²â€‹à»€àº‚ົ້າ​ມາ​ປະ​àºàº­àºšâ€‹àº”້ວàºâ€‹àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àº—ີ່​ມີ​ຢູ່​à»àº¥à»‰àº§â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚ອງ​ທ່ານ​. +DynamicsCode.0 = ປ່າ​ໄມ້​ໃນ​ເບື້ອງ​ຕົ້ນ +DynamicsCode.1 = ທົ່ງ​ຫàºà»‰àº²â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ +DynamicsCode.2 = àºàº²àº™â€‹àº•ັ້ງ​ຖິ່ນ​ຖານ​ໃນ​ເບື້ອງ​ຕົ້ນ +DynamicsCode.3 = ເບື້ອງ​ຕົ້ນ Otherland +DynamicsCode.4 = ຊຸ່ມ​ນ​້​à»àº²â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ +DynamicsCode.5 = ເບື້ອງ​ຕົ້ນ Cro​​pland +OpenTextFileListener.0 = ໄຟລ​໌​ຂà»à»‰â€‹àº„ວາມ​à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹à»„ດ້​ພົບ​ໄດ້​ທີ່​\:àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +OptionWizard.0 = ທາງ​ເລືອàºâ€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ+OptionWizard.1 = ເລືອàºâ€‹àº‚ອງ​ຕົວ​ທ່ອງ​ເວັບ +OptionWizard.10 = ໂຟ​ເດີ​ສà»àº²â€‹àº®àº­àº‡â€‹àºˆàº±àº™ +OptionWizard.11 = ບà»à»ˆâ€‹àº®àº¹à»‰â€‹àºˆàº±àºâ€‹\: àºàº²àº™â€‹àº™à»àº²â€‹à»ƒàºŠà»‰ ifconfig +OptionWizard.12 = ລູàºâ€‹àº„້າ​ຕົວ​ຢ່າງàºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +OptionWizard.13 = ໂລຠIP Serveràºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +OptionWizard.14 = port ໂລຠServer (ຕົວ​ຢ່າງ​\: 8023​) +OptionWizard.15 = ບັນ​ທຶàºâ€‹à»àº¥àº°â€‹à»ƒàºŠà»‰â€‹àºàº²àº™â€‹àº›à»ˆàº½àº™â€‹à»àº›àº‡ +OptionWizard.16 = ລະ​ຫັດ +OptionWizard.17 = X​-coord +OptionWizard.18 = Y coord​, +OptionWizard.19 = àºàº²àº™â€‹àºàº»àºâ€‹àº¥àº°â€‹àº”ັບ +OptionWizard.2 = ບວນ​àºàº²àº™â€‹à»€àº®àº±àº”​ວຽຠ(server / ລູàºâ€‹àº„້າ​) +OptionWizard.20 = ໄດ້​ເນື້ອ​ໃນ​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»„ດ້​ມີ​àºàº²àº™â€‹àº›à»ˆàº½àº™â€‹à»àº›àº‡â€‹.
àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº®àº±àºšâ€‹à»‚ຫລດ​ເນື້ອ​ຫາ​ໃນ​ເວ​ລາ​ທີ່​ທ່ານ​àºà»àº²â€‹àº¥àº±àº‡â€‹àº®àº±àºšâ€‹àºàº²àº™â€‹àºàº°â€‹àº•ຸ້ນ​ໂດàºâ€‹àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹. +OptionWizard.21 = ປັບ​ປຸງ​ສົບ​ຜົນ​ສà»àº²â€‹à»€àº¥àº±àº” +OptionWizard.22 = ຄ້ອຠ+OptionWizard.23 = ມີ​ຄວາມ​ຜິດ​ພາດ​ໃນ​ເວ​ລາ Re​\: ເປີດ​ໄດ້​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»€àº›àº±àº™â€‹à»„ດ້àºàº»àºâ€‹à»€àº¥àºµàºâ€‹àºàº²àº™ +OptionWizard.24 = àºàº»àºà»€àº¥àºµàºàºàº²àº™ +OptionWizard.25 = ຮູບ​à»àºšàºšâ€‹àºàº²àº™â€‹àº”à»àº²â€‹à»€àº™àºµàº™â€‹àº‡àº²àº™ +OptionWizard.26 = àºàº²àº™â€‹à»€àº›àº±àº™â€‹à»€àºˆàº»à»‰àº²â€‹àºžàº²àºš DB +OptionWizard.27 = ນີ້​ບà»à»ˆâ€‹à»„ດ້​ເປັນ​ທີ່​àºàº­àº¡â€‹àº®àº±àºš Saiku Folder (ເອ​àºàº°â€‹àºªàº²àº™â€‹à»€àº¥àºµà»ˆàº¡ saiku.bat ບà»à»ˆâ€‹à»àº¡à»ˆàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹) +OptionWizard.28 = Saiku Server ບà»à»ˆâ€‹àº®àº­àº‡â€‹àº®àº±àºš +OptionWizard.29 = ພ໠DB +OptionWizard.3 = Server ຕົວ​ຢ່າງ +OptionWizard.30 = ທາງ​ເລືອຠSQLite +OptionWizard.31 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº•ົວ​ຢ່າງ +OptionWizard.32 = ຮູບ​à»àºšàºšâ€‹àº”ິນ​ຕອນ +OptionWizard.33 = ສà»àº²â€‹àº«àº¼àº§àº”​ນຸ​àºàº»àº¡ +OptionWizard.34 = à»àºšàºšâ€‹àºžàº´â€‹à»€àºªàº” +OptionWizard.35 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ຈຸດ​ຕົວ​ຢ່າງ +OptionWizard.36 = ໄລ​àºàº°â€‹àº—າງ​ລະ​ຫວ່າງ​ຈຸດ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àº•ົວ​ຢ່າງ (ໃນ​ຕາ​) +OptionWizard.37 = ອັດ​ຕາ​ທີ່​ມີ​ຊາàºâ€‹à»àº”ນ​ດິນ​ຕອນ (à»àº¡àº±àº”​) +OptionWizard.38 = ໄຟລ​໌ CSV / CED ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ອ່ານ​ໄດ້​ຢ່າງ​ຖືàºâ€‹àº•້ອງ
ເອ​àºàº°â€‹àºªàº²àº™â€‹à»„ດ້​ຖືàºâ€‹àº„າດ​ວ່າ​ຈະ​ມີ​ມູນ​ຄ່າ​àºàº²àº™â€‹à»àºàºâ€‹àºˆàº¸â€‹àº¥àº°â€‹àºžàº²àºâ€‹à»€àºŠàº±à»ˆàº™â€‹àº™àºµà»‰â€‹\:​.
+OptionWizard.39 = ລະ​ຫັດ​, YCoordinate​, XCoordinate​, ພູ​, ລັàºâ€‹àºªàº°â€‹àº™àº° +OptionWizard.4 = IP ຄອມ​ພິວ​ເຕີ​ປັດ​ຈຸ​ບັນ​\: +OptionWizard.40 = ໂຄງ​àºàº²àº™ +OptionWizard.41 = ໂຫຼດ​ໄຟລ​໌​ໂຄງ​àºàº²àº™â€‹à»ƒàº«àº¡à»ˆ +OptionWizard.42 = ຜິດ​ພາດ​ໃນ​ເວ​ລາ​ປິດ​àºàº²àº™â€‹àº­à»ˆàº²àº™ CSV +OptionWizard.43 = ຊື່​ຂອງ​àºàº²àº™â€‹àºªà»àº²â€‹àº«àº¼àº§àº” +OptionWizard.44 = ຖານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ປ​ໃຫ້​ເຖິງ​ອັດ​ຕະ​ໂນ​ມັດ​ທີ່ +OptionWizard.45 = Open Earth Engine ຊູມ​ເຂົ້າ​ໄປ​ໃນ​ເຂດ​ຕອນ​ດິນ​ຂອງ​ຕົນ +OptionWizard.46 = timelapse ຈັàºâ€‹à»€àº›àºµàº”​ໂລàºâ€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºžàº·à»‰àº™â€‹àº—ີ່​ຕອນ​ດິນ​ຂອງ​ຕົນ +OptionWizard.47 = Open à»àºœàº™ Bing ສà»àº²â€‹àº¥àº±àºšâ€‹àºžàº·à»‰àº™â€‹àº—ີ່​ຕອນ​ດິນ​ຂອງ​ຕົນ +OptionWizard.48 = ຮູບ​à»àºšàºšâ€‹à»€àº›àºµàº”​ໃນ​ຕົວ​ທ່ອງ​ເວັບ​ຂອງ​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»„ດ້ (à»àº™àº°â€‹àº™à»àº²â€‹à»ƒàº«à»‰â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™ LINUX​) +OptionWizard.49 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™ Ced / csv ໄຟລ​໌​ທີ່​ມີ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº•ອນ​ດິນ​ຂອງ​ຕົນàºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +OptionWizard.5 = port ໂລຠServer​\: +OptionWizard.50 = Browse ... +OptionWizard.51 = ເອ​àºàº°â€‹àºªàº²àº™â€‹à»‚ຄງ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຜິດ​ພາດ +OptionWizard.52 = CSV / ເອ​àºàº°â€‹àºªàº²àº™ Ced ມີ​àºàº²àº™â€‹àº›àº°â€‹àºªàº²àº™â€‹àº‡àº²àº™â€‹à»€àº—ົ່າ​ນັ້ນ +OptionWizard.54 = ຈຸດ​ສູນ​àºàº²àº‡ +OptionWizard.55 = Error ໂຟນ​ເດີ​ໂຄງ​àºàº²àº™â€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ +OptionWizard.56 = ໂຄງ​àºàº²àº™ Load +OptionWizard.57 = ໂຄງ​àºàº²àº™ loaded àºà»ˆàº­àº™â€‹àº«àº™à»‰àº²â€‹àº™àºµà»‰ +OptionWizard.58 = Open GEE Code Editor (ຮຽàºâ€‹àº®à»‰àº­àº‡â€‹à»ƒàº«à»‰â€‹àº¡àºµâ€‹àºàº²àº™â€‹à»€àº‚ົ້າ​ເຖິງ Tester Trusted​) +OptionWizard.59 = Open ທີ່​ນີ້​à»àºœàº™â€‹àº—ີ່​ສຸມ​ໃສ່​ຕອນ​ດິນ​ຂອງ​ຕົນ +OptionWizard.6 = ຕົວ​àºà»àº²â€‹àº™àº»àº”​àºàº²àº™ PostgreSQL DB +OptionWizard.65 = ເສັ້ນ​ທາງ​àºàº±àºšâ€‹à»‚ຟນ​ເດີ​ທີ່ Saiku +OptionWizard.66 = Browse ... +OptionWizard.67 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ບັດ​àºàº²àº™ Firefox +OptionWizard.68 = Browse ... +OptionWizard.7 = ຊື່​ຜູ້​ໃຊ້ +OptionWizard.70 = àºàº²àº™â€‹àºšà»â€‹àº¥àº´â€‹àº«àº²àº™â€‹à»„ຟ +OptionWizard.72 = ໄຟລ​໌​ຖານ​ສອງ +OptionWizard.73 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ບັດ​àºàº²àº™ Chrome +OptionWizard.74 = Browse ... +OptionWizard.76 = àºàº²àº™â€‹àºšà»â€‹àº¥àº´â€‹àº«àº²àº™â€‹à»„ຟ +OptionWizard.78 = ໄຟລ​໌​ຖານ​ສອງ +OptionWizard.79 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹à»àºšàºš KML Freemarker +OptionWizard.8 = ລະ​ຫັດ​ຜ່ານ +OptionWizard.80 = Browse ... +OptionWizard.82 = à»àº¡à»ˆâ€‹à»àºšàºš Freemarker +OptionWizard.83 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº­àº­àºâ€‹à»àºšàºšâ€‹àº®àº¹àºšâ€‹à»àºšàºš HTML ປູມ​ເປົ້າ +OptionWizard.84 = Browse ... +OptionWizard.86 = HTML webpage +OptionWizard.87 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™ XML àºàº±àºšâ€‹àº„à»àº²â€‹àº™àº´â€‹àºàº²àº¡ IDM +OptionWizard.88 = Browse ... +OptionWizard.9 = ຊື່ DB +OptionWizard.90 = ຫມາຠIDM XML +OptionWizard.91 = Server (ສະ​ບັບ​ຜູ້​ຈັດ​àºàº²àº™â€‹àº«àº¼àº·â€‹àº¢àº·àº™â€‹àº¢àº¹à»ˆâ€‹àº„ົນ​ດຽວ​ໃຊ້​) +OptionWizard.92 = ລູàºâ€‹àº„້າ (ປະ​ຕິ​ບັດ​àºàº²àº™ / àºàº²àº™â€‹à»€àºŠàº·à»ˆàº­àº¡â€‹àº•à»à»ˆâ€‹àºàº±àºšâ€‹à»€àº„ື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹) +OptionWizard.93 = SQLite (à»àºšàºšâ€‹àºàº±àº‡ / ໄຟລ​໌​ດຽວ​ຕາມ​) +OptionWizard.94 = PostgreSQL +SaikuAnalysisListener.0 = à»àº¡à»ˆàº™ - ຂà»à»‰â€‹àº¡àº¹àº™ Refresh Saiku (ຂະ​ບວນ​àºàº²àº™â€‹àºàº²àº§â€‹) +SaikuAnalysisListener.1 = ບà»à»ˆ - ພຽງ​à»àº•່​ເລີ່ມ​ຕົ້ນ Saiku +SaikuStarter.1 = ເລີ່ມ Saiku +SaikuStarter.2 = u0EC0ລີ່ມ Saiku ສາ​ມາດ​ໃຊ້​ເວ​ລາ​ນາ​ທີ \= àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº¥à»â€‹àº–້າ ​\! +SaveEarthDataServlet.0 = àºàº²àº™â€‹àº®à»‰àº­àº‡â€‹àº‚à»â€‹à»€àº›àº»à»ˆàº² +SaveEarthDataServlet.1 = ບັນ​ຫາ​ທີ່​ເàºàºµàº”​ຂຶ້ນ​ໃນ​ຂະ​ນະ​ທີ່​ປະ​ຢັດ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ດ້ +SaveEarthDataServlet.2 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໄດ້​ບັນ​ທືຠ+SlopeCode.0 = ລຽບ (0-5​)àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +EarthApp.11 = ໃນ​ທົ່ວ​ໂລàºâ€‹à»àº¡à»ˆàº™â€‹à»àº¥à»‰àº§â€‹à»àº¥à»ˆàº™ +EarthApp.21 = ໄຟ​ທີ່​ມີ​ຕາ​ຂ່າàºâ€‹à»„ຟ​ຟ້າ​ຂອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ເປັນ CSV / CED à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹àºžàº»àºšâ€‹à»€àº«àº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹à»€àºªàº±à»‰àº™â€‹àº—າງ​ທີ່​ເລືອàºâ€‹\:
+EarthApp.23 = ບà»à»ˆâ€‹à»„ຟລ​໌ CSV / CED ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

+EarthApp.24 = ໄຟ​ທີ່​ມີ​à»àº¡à»ˆâ€‹à»àºšàºš Freemarker ທີ່​ມີ​ຄà»àº²â€‹àº™àº´â€‹àºàº²àº¡ KML ບà»à»ˆâ€‹à»„ດ້​ພົບ​ເຫັນ​ຢູ່​ໃນ​ເສັ້ນ​ທາງ​ທີ່​ເລືອàºâ€‹\:
+EarthApp.26 = ບà»à»ˆâ€‹à»„ຟລ​໌​ຄà»àº²â€‹àº™àº´â€‹àºàº²àº¡ KML ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

+EarthApp.27 = ໄຟ​ທີ່​ມີ​ຮູບ​à»àºšàºšâ€‹àº›àº¹àº¡â€‹à»€àº›àº»à»‰àº² HTML ໄດ້​à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹àºžàº»àºšâ€‹à»€àº«àº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹à»€àºªàº±à»‰àº™â€‹àº—າງ​ທີ່​ເລືອàºâ€‹\:
+EarthApp.29 = ບà»à»ˆâ€‹à»„ຟລ​໌​ປູມ​ເປົ້າ HTML ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

+EarthApp.3 = ເຕືອນ​ຂ້ອàºâ€‹àº•à»à»ˆâ€‹àº¡àº² +EarthApp.30 = àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹à»àºà»‰â€‹à»„ຂ​ສະ​ຖານ​ທີ່​ໄຟລ​໌​ຢູ່​ໃນ​ເມ​ນູ Tools-> Properties​. +EarthApp.4 = àºàº²àº™â€‹àº›àº±àºšâ€‹àº›àº¸àº‡â€‹à»ƒàº™â€‹àº›àº±àº”​ຈຸ​ບັນ +EarthApp.5 = ຢ່າ​ເຕືອນ​ຂ້າ​ພະ​ເຈົ້າ​ອີàºâ€‹à»€àº—ື່ອ​ຫນຶ່ງ +EarthApp.57 = ມີ​ສະ​ບັບ​ໃຫມ່​ຂອງ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹àº—ີ່​ມີ à»àº¡à»ˆàº™â€‹\!
ທ່ານ​ບà»à»ˆâ€‹àº•້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹? ເຕືອນ +EarthApp.58 = ປັບ​ປຸງ +EarthApp.59 Error \= ໃນ​ເວ​ລາ​ທີ່​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ເອ​àºàº°â€‹àºªàº²àº™â€‹à»‚ຄງ​àºàº²àº™ +EarthApp.6 = \ - ສະ​ບັບ +EarthApp.61 = ເອ​àºàº°â€‹àºªàº²àº™â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹à»„ດ້​ເàºàº±àºšâ€‹àºà»àº²â€‹àºšà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ຈະ​ເປີດ​ເຜີàºâ€‹.
àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹à»€àº®àº±àº”​ໃຫ້​à»àº™à»ˆâ€‹à»ƒàºˆàº§à»ˆâ€‹àº²â€‹àº—ີ່​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»àº¡à»ˆàº™â€‹àºàº²àº™â€‹àº•ິດ​ຕັ້ງ​. +EarthSurveyService.9 = ພາàºâ€‹àºªàº°â€‹àº«àº™àº²àº¡â€‹àº—ີ່​ຕ້ອງ​àºàº²àº™à»€àº­àº»àº² +ExportActionListener.1 = ວັນ​ທີ່​ຈະ​ບັນ​ທຶàºâ€‹àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àºˆàº²àºàº‚à»à»‰â€‹àº¡àº¹àº™ +ExportDialogProcessMonitor.0 àºàº²àº™â€‹àº›àº¸àº‡â€‹à»àº•່ງ \= ... +ExportDialogProcessMonitor.1 = ລà»â€‹àº–້າ​ທີ່​ຈະ​ເລີ່ມ​ຕົ້ນ​ຂະ​ບວນ​àºàº²àº™â€‹\:àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àº +ExportDialogProcessMonitor.4 =​\: +ImportProcessMonitorDialog.0 = àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​\: +ImportActionListener.0 = ຄວນ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àº—ີ່​ດິນ​ທີ່​ບà»à»ˆâ€‹à»„ດ້​ຮັບ​àºàº²àº™â€‹à»€àº•ີມ​ລົງ​ໄປ​ໃນ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ໄດ້ +ImportActionListener.2 = ຖ້າ​ທ່ານ​ຄລິàºâ€‹à»ƒàºªà»ˆ ບà»à»ˆ ພຽງ​à»àº•່​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºˆàº²àºâ€‹àºžàº²àºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ຢູ່​ໃນ​ສະ​ພາບ "ສີ​ຂຽວ​"​, ທີ່​ບັນ​ຈຸ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ັງ​ຫມົດ​ໄດ້​, ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​. +ImportActionListener.3 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ບັນ​ທຶàºâ€‹àº—າງ​àºàº²àº™â€‹àºªà»àº²â€‹à»€àº¥àº±àº”​ຮູບ +ImportDialogProcessMonitor.0 = \ ຄິດ​ໄລ່ +ImportDialogProcessMonitor.11 = ຈà»àº²â€‹àº™àº§àº™â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ​ຂອງ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹\: +ImportDialogProcessMonitor.2 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ບັນ​ທຶàºâ€‹àºàº²àº™ ... +ImportDialogProcessMonitor.5 = ຈ​à»â€‹àº²â€‹àº™àº§àº™â€‹àº•ົວ​ຈິງ​ຂອງ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​\:ຂà»à»‰â€‹àº¡àº¹àº™ +ImportDialogProcessMonitor.8 àºàº²àº™â€‹àº›àº¸àº‡â€‹à»àº•່ງ \= ... +InfiniteProgressMonitor.0 = àºàº»àºâ€‹à»€àº¥àºµàºâ€‹àºàº²àº™â€‹àº”à»àº²â€‹à»€àº™àºµàº™â€‹àº‡àº²àº™àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +JFileChooserExistsAware.0 = file ໂລàºâ€‹à»‚ຄງ​àºàº²àº™ +KmlImportService.13 = ເລືອàºâ€‹à»„ຟລ​໌ CSV ເພື່ອ​ຊ່ວàºâ€‹àº›àº°â€‹àº¢àº±àº”​ສະ​ຖານ​ຕອນ​ດິນ​ຂອງ​ຕົນ​ເພື່ອ +MissingPlotsListener.0 Error \= ໃນ​ຂະ​ນະ​ທີ່​àºàº²àº™â€‹à»„ດ້​ຮັບ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àº—ີ່​ດິນ​ບà»à»ˆâ€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ດ້ +MissingPlotsListener.1 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ໄປ +MissingPlotsListener.10 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ໃນ​àºàº²àº™â€‹àº­àº­àºâ€‹à»àºšàºšâ€‹àºªàº¸à»ˆàº¡â€‹àº•ົວ​ຢ່າງ​\: +MissingPlotsListener.12 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ຫາàºâ€‹à»„ປ​\: +MissingPlotsListener.14 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທັງ​ຫມົດ​à»àº¡à»ˆàº™â€‹à»„ດ້​ເຕີມ​ລົງ​ໄປ ​\!ເນື້ອ​ໃນ +MissingPlotsListener.2 = ຄັດ​ລອàºâ€‹à»„ປ​ທີ່ clipboardເອົາ +MissingPlotsListener.3 = ໄຟລ​໌​ທີ່​ບັນ​ຈຸ​ມີ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ສານ​ຕອນ​ດິນ​ຂອງ​ຕົນ (.csv ຫຼື​ໄຟລ​໌ .ced​) ສà»àº²â€‹àº¥àº±àºšâ€‹àº—ີ່​ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ຮູ້​ວ່າ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ັງ​ຫມົດ​ໄດ້​ຮັບ​àºàº²àº™â€‹à»€àº•ີມ​ລົງ​ໄປ​. +MissingPlotsListener.4 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຫາàºâ€‹à»„ປ - ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ສານ +MissingPlotsListener.5 = ຈາàºâ€‹à»„ຟ​\: +MissingPlotsListener.6 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ​ໄຟລ​໌ CED +ProcessMonitorDialog.1 = ຂà»à»‰â€‹àºœàº´àº”​ພາດ Parsing àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àºˆà»àº²â€‹àº™àº§àº™â€‹àºàº²àº™â€‹àº•ິດ​ຕà»à»ˆâ€‹àºàº±àº™ +ProcessMonitorDialog.4 = ຖັນ​, +ProcessMonitorDialog.5 = \ - ຄຸນ​ຄ່າ \ No newline at end of file From 5739623c16682147d18c33bc024427d5417391a2 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:31 +0100 Subject: [PATCH 0855/1620] New translations Messages_lo.properties (Portuguese) --- .../earth/app/view/Messages_pt.properties | 448 +++++++++--------- 1 file changed, 220 insertions(+), 228 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index f759c433b0..e5b9bd9e45 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,228 +1,220 @@ -AboutDialog.19=कोई समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ -AboutDialog.5=अधिक जानकारी के लिठहमारी वेबसाइट पर जाà¤à¤‚ OpenForis.org -AboutDialog.6=कà¥à¤·à¤®à¤¾ करें, à¤à¤• समसà¥à¤¯à¤¾ आपके सिसà¥à¤Ÿà¤® के मानक बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में इस लिंक को खोलने की कोशिश कर रही है. -AboutDialog.8=ठीक -AspectCode.0=उतà¥à¤¤à¤° दिशा -AspectCode.1=उतà¥à¤¤à¤°-पूरà¥à¤µ दिशा -AspectCode.2=पूरà¥à¤µ दिशा -AspectCode.3=दकà¥à¤·à¤¿à¤£-पूरà¥à¤µ दिशा -AspectCode.4=दकà¥à¤·à¤¿à¤£ दिशा -AspectCode.5=दकà¥à¤·à¤¿à¤£-पशà¥à¤šà¤¿à¤® दिशा -AspectCode.6=पशà¥à¤šà¤¿à¤® दिशा -AspectCode.7=उतà¥à¤¤à¤°-पशà¥à¤šà¤¿à¤® दिशा -CollectEarthWindow.0=तà¥à¤°à¥à¤Ÿà¤¿ जब सीà¤à¤¸à¤µà¥€ फ़ाइल में डेटा निरà¥à¤¯à¤¾à¤¤ करने का पà¥à¤°à¤¯à¤¾à¤¸ -CollectEarthWindow.1=निरà¥à¤¯à¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.10=फ़ाइल -CollectEarthWindow.11=बाहर जाà¤à¤‚ -CollectEarthWindow.12=उपकरण -CollectEarthWindow.13=डेटा सीà¤à¤¸à¤µà¥€ निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.14=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ -CollectEarthWindow.15=गà¥à¤£ -CollectEarthWindow.16=मदद -CollectEarthWindow.17=असà¥à¤µà¥€à¤•रण -CollectEarthWindow.18=डेटाबेस में लापता भूखंडों खोजें -CollectEarthWindow.19=पृथà¥à¤µà¥€ इकटà¥à¤ à¤¾ -CollectEarthWindow.2=भाषा -CollectEarthWindow.20=डà¥à¤ªà¥à¤²à¤¿à¤•ेट रिकॉरà¥à¤¡ की संखà¥à¤¯à¤¾\: -CollectEarthWindow.21=मà¥à¤–à¥à¤¯ फà¥à¤°à¥‡à¤® के लिठआइकन नहीं मिल सकता है -CollectEarthWindow.22=आपको लगता है कि आप à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ बंद करना चाहते हैं? विंडोज बंद करने से, à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° बंद हो जाà¤à¤—ा -CollectEarthWindow.23=पà¥à¤·à¥à¤Ÿà¤¿ की जरूरत है -CollectEarthWindow.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.25=आप वैसे भी इन अभिलेखों को जोड़ना चाहते हैं और अपने वरà¥à¤¤à¤®à¤¾à¤¨ डेटा खोने के लिठकिलक करना चाहते हैं? -CollectEarthWindow.26=ऑपरेटर,पà¥à¤°à¤šà¤¾à¤²à¤• -CollectEarthWindow.27=अदà¥à¤¯à¤¤à¤¨ -CollectEarthWindow.28= औपन फौरिस à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° चल रहा होना चाहिठ, जबभी ऑपरेटर डेटा की वà¥à¤¯à¤¾à¤–à¥à¤¯à¤¾ करें . -CollectEarthWindow.29=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. -CollectEarthWindow.3= आयात संबंधी तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.30=जबभी आप गà¥à¤—ल अरà¥à¤¥ का उपयोग कर रहे हैं, कृपया इस विंडोज को खà¥à¤²à¥€ बनाठरखें. -CollectEarthWindow.31=à¤à¤•तà¥à¤° डेटा सीà¤à¤¸à¤µà¥€ फाइल में भेजें -CollectEarthWindow.32=छोड़ना -CollectEarthWindow.33=ऑपरेटर का नाम के 5 अकà¥à¤·à¤° से बड़ा और 50 अकà¥à¤·à¤° से कम होना चाहिठ-CollectEarthWindow.34=मानà¥à¤¯à¤¤à¤¾ तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.35=ऑपरेटर नाम खाली\!
कृपया ऑपरेटर का नाम भरें और "अदà¥à¤¯à¤¤à¤¨" बटन दबाà¤à¤. -CollectEarthWindow.36=ऑपरेटर नाम रिकà¥à¤¤ नहीं हो सकता -CollectEarthWindow.37=खà¥à¤²à¤¾ रखो -CollectEarthWindow.38=सीà¤à¤¸à¤µà¥€ फ़ाइल -CollectEarthWindow.39=सूचना\: यह सलाह दी जाती है कि आप नठडेटा डालने करने से पहले अपने मौजूदा आंकडों को बैकअप(à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤) कर लें -CollectEarthWindow.4=à¤à¤«à¤à¤“ असà¥à¤µà¥€à¤•रण नोटिस -CollectEarthWindow.40=उस फ़ोलà¥à¤¡à¤° पर जाà¤à¤‚ जहां साà¤à¤•ॠसरà¥à¤µà¤° में सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ किया गया है, फ़ोलà¥à¤¡à¤° का रासà¥à¤¤à¤¾ उपकरण> गà¥à¤£> उनà¥à¤¨à¤¤ टैब. -CollectEarthWindow.41=निरà¥à¤¯à¤¾à¤¤ डेटा को फ़ाइल में बचाया जा रहा है \: -CollectEarthWindow.42=छोड़ना -CollectEarthWindow.43=परसà¥à¤ªà¤° विरोधी रिकॉरà¥à¤¡ पाया -CollectEarthWindow.44=डेटा आयात / निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.45=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ डेटा (संकà¥à¤šà¤¿à¤¤) -CollectEarthWindow.46=ज़िप से नठडेटा आयात करें (संकà¥à¤šà¤¿à¤¤ à¤à¤•à¥à¤¸à¤à¤®à¤à¤²) -CollectEarthWindow.55=सीà¤à¤¸à¤µà¥€ का उपयोग कर मौजूदा रिकॉरà¥à¤¡ को अपडेट करें -CollectEarthWindow.47=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. -CollectEarthWindow.48=ज़िप / à¤à¤•तà¥à¤°-डेटा फ़ाइल -CollectEarthWindow.49=फà¥à¤¯à¥‚जन सीà¤à¤¸à¤µà¥€ फ़ाइल -CollectEarthWindow.5=बंद करे -CollectEarthWindow.50= उपयोगकरà¥à¤¤à¤¾ मैनà¥à¤…ल खोलें -CollectEarthWindow.51=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ के अदà¥à¤¯à¤¤à¤¨ के लिठजाà¤à¤š करें -CollectEarthWindow.52= अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— लॉग फ़ाइल खोलें -CollectEarthWindow.53=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ लॉग फ़ाइल -CollectEarthWindow.54=केà¤à¤®à¤à¤² से लोड अंक -CollectEarthWindow.56=के विषय में... -CollectEarthWindow.57=साà¤à¤•ॠसà¥à¤Ÿà¤¾à¤°à¥à¤Ÿà¤° पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ अभी भी चल रहा है, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें. -CollectEarthWindow.58=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ नहीं कर सकते -CollectEarthWindow.59=आप साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ के लिठडेटा सेट फिर से उतà¥à¤ªà¤¨à¥à¤¨ करने के लिठकरना चाहते हैं?
यह पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ समय लेने वाली हो सकती है.
आप यदि "हाà¤"पर कà¥à¤²à¤¿à¤• करें, तो नवीनतम जानकारी के साथ à¤à¤• नया डाटासेट उतà¥à¤ªà¤¨à¥à¤¨ हो जाà¤à¤—ा. -CollectEarthWindow.6=फà¥à¤¯à¥‚जन टेबल के लिठनिरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.60=साà¤à¤•ॠडेटा उतà¥à¤ªà¤¨à¥à¤¨ -CollectEarthWindow.61=डेटा à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ (पिछले निरà¥à¤¯à¤¾à¤¤ के बाद से संशोधित रिकॉरà¥à¤¡) -CollectEarthWindow.62=के विषय मे... -CollectEarthWindow.63=केà¤à¤®à¤à¤² से अंक पà¥à¤°à¤¾à¤ªà¥à¤¤ करने में तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.64=तकनीकी सहायता -CollectEarthWindow.7=डेटा आयात में तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.8=असà¥à¤µà¥€à¤•रण पाठ नहीं पाया जा सका -CollectEarthWindow.9=डेटा आयात रिकॉरà¥à¤¡ वह है जो कि पहले से ही अपने डेटाबेस पर मौजूद हैं शामिल. -DynamicsCode.0=पà¥à¤°à¤¾à¤°à¤‚भ में वन -DynamicsCode.1=पà¥à¤°à¤¾à¤°à¤‚भ में घास का मैदान, -DynamicsCode.2=पà¥à¤°à¤¾à¤°à¤‚भ में आबादी वाला इलाका -DynamicsCode.3=पà¥à¤°à¤¾à¤°à¤‚भ में बंजर -DynamicsCode.4=पà¥à¤°à¤¾à¤°à¤‚भ में आरà¥à¤¦à¥à¤° भूमि -DynamicsCode.5=पà¥à¤°à¤¾à¤°à¤‚भ में खेत -OpenTextFileListener.0=इस पाठ का फ़ाइल नहीं मिला \: -OptionWizard.0= विकलà¥à¤ª -OptionWizard.1=बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° चà¥à¤¨à¥‡à¤‚ -OptionWizard.10=बैकअप फ़ोलà¥à¤¡à¤° खोलें -OptionWizard.11=अजà¥à¤žà¤¾à¤¤\: उपयोग ifconfig -OptionWizard.12=गà¥à¤°à¤¾à¤¹à¤•ों का उलà¥à¤²à¥‡à¤– -OptionWizard.13=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° आईपी -OptionWizard.14=कतà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ (उदाहरण- 8023) -OptionWizard.15=बचाà¤à¤‚ और परिवरà¥à¤¤à¤¨ लागू करें -OptionWizard.16=आईडी -OptionWizard.17=X- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क -OptionWizard.18=Y- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क -OptionWizard.19=उठान -OptionWizard.2=कारà¥à¤¯à¤ªà¥à¤°à¤µà¤¾à¤¹ (सरà¥à¤µà¤° / गà¥à¤°à¤¾à¤¹à¤•) -OptionWizard.20=गूगल अरà¥à¤¥ अंतरà¥à¤µà¤¸à¥à¤¤à¥ बदल दिया गया है
यदि गà¥à¤—ल अरà¥à¤¥ आप से कहे,अंतरà¥à¤µà¤¸à¥à¤¤à¥ पà¥à¤¨à¤ƒ लोड सà¥à¤µà¥€à¤•ार करें . -OptionWizard.21=अदà¥à¤¯à¤¤à¤¨ सफल -OptionWizard.22=ढाल -OptionWizard.23=गूगल अरà¥à¤¥ डेटा को फिर से खोलने में कोई तà¥à¤°à¥à¤Ÿà¤¿ थी -OptionWizard.24=रदà¥à¤¦ करना -OptionWizard.25=ऑपरेशन मोड -OptionWizard.26=डीबी होसà¥à¤Ÿ -OptionWizard.27=यह à¤à¤• मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ साà¤à¤•ॠफ़ोलà¥à¤¡à¤° नहीं है ( सà¥à¤Ÿà¤¾à¤°à¥à¤Ÿ-साà¤à¤•à¥.batफ़ाइल मौजूद नहीं है) -OptionWizard.28=साà¤à¤•ॠसरà¥à¤µà¤° मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ नहीं -OptionWizard.29=डीबी पोरà¥à¤Ÿ -OptionWizard.3=सरà¥à¤µà¤° आवृतà¥à¤¤à¤¿ -OptionWizard.30=à¤à¤¸à¤•à¥à¤¯à¥ लाइट विकलà¥à¤ª -OptionWizard.31=सेमà¥à¤ªà¤² डेटा -OptionWizard.32=पà¥à¤²à¥‰à¤Ÿ लेआउट -OptionWizard.33=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ परिभाषा -OptionWizard.34=विकसित -OptionWizard.35=सेमà¥à¤ªà¤² अंक की संखà¥à¤¯à¤¾ -OptionWizard.36=सेमà¥à¤ªà¤² बिंदॠके बीच दूरी (मीटर में) -OptionWizard.37=भूखंड की सीमा के साथ मारà¥à¤œà¤¿à¤¨ (मीटर मे) -OptionWizard.38=सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सही ढंग से पढ़ा नहीं जा सकता.
इस फ़ाइल में à¤à¤• अलà¥à¤ªà¤µà¤¿à¤°à¤¾à¤® से अलग मूलà¥à¤¯à¥‹à¤‚ की उमà¥à¤®à¥€à¤¦ है \:
-OptionWizard.39=आईडी, वाई समनà¥à¤µà¤¯, à¤à¤•à¥à¤¸ समनà¥à¤µà¤¯, ऊंचाई, ढाल, पहलू -OptionWizard.4=वरà¥à¤¤à¤®à¤¾à¤¨ कंपà¥à¤¯à¥‚टर आईपी \: -OptionWizard.40=परियोजनाà¤à¤‚ -OptionWizard.41=à¤à¤• नई परियोजना फ़ाइल लोड करें -OptionWizard.42=सीà¤à¤¸à¤µà¥€ पाठक को बंद करते समय तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.43=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ का नाम -OptionWizard.44= सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ बैकअप डेटाबेस -OptionWizard.45=ओपन पृथà¥à¤µà¥€ इंजन ने पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° में जूम किया -OptionWizard.46=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठपृथà¥à¤µà¥€ इंजन टाइमलैपà¥à¤¸ खोलें -OptionWizard.47=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठबिंग मैपà¥à¤¸ खोलें -OptionWizard.48=बजाय गूगल अरà¥à¤¥ के फॉरà¥à¤® à¤à¤• बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° पर खोलें (लिनकà¥à¤¸ के लिठसिफारिश) -OptionWizard.49=भूखंड डेटा के साथ सीईडी / सीà¤à¤¸à¤µà¥€ फाइल भेजने के लिठपथ -OptionWizard.5=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ\: -OptionWizard.50=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.51=परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.52=केवल निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क के साथ सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल -OptionWizard.53=चौकोर -OptionWizard.54=केनà¥à¤¦à¥à¤°à¥€à¤¯ बिनà¥à¤¦à¥ -OptionWizard.55=परियोजना फ़ोलà¥à¤¡à¤° आयात तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.56=लोड परियोजना -OptionWizard.57=पहले से लोड परियोजना -OptionWizard.58= जी ई ई का मैदान खोलें (विशà¥à¤µà¤¸à¤¨à¥€à¤¯ जांचकरà¥à¤¤à¤¾ के उपयोग की आवशà¥à¤¯à¤•ता है) -OptionWizard.59=यहां भूखंड पर केंदà¥à¤°à¤¿à¤¤ मैपà¥à¤¸ खोलें -OptionWizard.6=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² डीबी मापदंड -OptionWizard.65=साà¤à¤•à¥à¤«à¤¼à¥‹à¤²à¥à¤¡à¤° का पथ -OptionWizard.66=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.67=फ़ायरफ़ॉकà¥à¤¸ निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ -OptionWizard.68=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.7=उपयोगकरà¥à¤¤à¤¾ नाम -OptionWizard.70=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों -OptionWizard.72=बाइनरी फ़ाइलें -OptionWizard.73=कà¥à¤°à¥‹à¤® निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ -OptionWizard.74=बà¥à¤°à¤¾à¤‰à¤œ -OptionWizard.76=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों -OptionWizard.78=बाइनरी फ़ाइलें -OptionWizard.79=केà¤à¤®à¤à¤² फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ के लिठपथ -OptionWizard.8=पासवरà¥à¤¡ -OptionWizard.80=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.82=फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ -OptionWizard.83=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ पà¥à¤°à¤ªà¤¤à¥à¤° डिज़ाइन करने के लिठपथ -OptionWizard.84=बà¥à¤°à¤¾à¤‰à¤œ..... -OptionWizard.86=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² वेब पेज -OptionWizard.87=पथ आइडीà¤à¤® परिभाषा के साथ à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठ-OptionWizard.88=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.9=डीबी नाम -OptionWizard.90=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² आइडीà¤à¤® परिभाषा -OptionWizard.91=सरà¥à¤µà¤° (पà¥à¤°à¤¬à¤‚धक संसà¥à¤•रण या खड़े अकेले का उपयोग करें) -OptionWizard.92=कà¥à¤²à¤¾à¤‡à¤‚ट (ऑपरेटर / सरà¥à¤µà¤° से जà¥à¤¡à¤¼à¥‡) -OptionWizard.93=सकà¥à¤¯à¥‚à¤à¤²à¤¾à¤‡à¤Ÿ (à¤à¤‚बेडेड / à¤à¤•ल फाइल आधारित) -OptionWizard.94=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² -OptionWizard.95=सेमà¥à¤ªà¤² डॉटà¥à¤¸ के साइड (मीटर में) -SaikuAnalysisListener.0=हाठ- ताज़ा साà¤à¤•ॠडेटा (लंबी पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾) -SaikuAnalysisListener.1=नहीं - बस साà¤à¤•ॠशà¥à¤°à¥‚ -SaikuStarter.1=साà¤à¤•ॠशà¥à¤°à¥‚ -SaikuStarter.2= साà¤à¤•ॠशà¥à¤°à¥‚ कà¥à¤› मिनट लग सकते हैं, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें\! -SaveEarthDataServlet.0=खाली अनà¥à¤°à¥‹à¤§ -SaveEarthDataServlet.1= डेटाबेस में डेटा बचाते समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ है -SaveEarthDataServlet.2=डेटा बचाया था -SlopeCode.0=समतल (0-5) -EarthApp.11=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ पहले से ही चल रहा है -EarthApp.21=à¤à¤• सीà¤à¤¸à¤µà¥€ / सीईडी के रूप में भूखंडों की गà¥à¤°à¤¿à¤¡ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
-EarthApp.23=कोई सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सेट-अप नहीं किया गया है \:

-EarthApp.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² परिभाषा के साथ फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है \:
-EarthApp.26=कोई à¤à¤•à¥à¤¸à¤à¤®à¤à¤² फ़ाइल परिभाषा सेट अप नहीं किया गया है \:

-EarthApp.27=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ रूप से यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
-EarthApp.29=कोई à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ फ़ाइल सेट-अप नहीं किया गया है \:

-EarthApp.3=मà¥à¤à¥‡ बाद में याद दिलाना -EarthApp.30=उपकरण> गà¥à¤£ मेनू में फ़ाइल सà¥à¤¥à¤¾à¤¨ को ठीक करें . -EarthApp.4=अभी अदà¥à¤¯à¤¤à¤¨ करें -EarthApp.5=मà¥à¤à¥‡ दà¥à¤¬à¤¾à¤°à¤¾ याद मत दिलाना -EarthApp.57=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ का à¤à¤• नया संसà¥à¤•रण उपलबà¥à¤§ है\!
आप कैसे आगे बढ़ना चाहते हैं? -EarthApp.58=अदà¥à¤¯à¤¤à¤¨ चेतावनी -EarthApp.59= परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ -EarthApp.6=\ - संसà¥à¤•रण -EarthApp.61=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ फाइल खà¥à¤² नहीं सकती .
कृपया सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करें कि गूगल अरà¥à¤¥ सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ है. -EarthSurveyService.9=आवशà¥à¤¯à¤• कà¥à¤·à¥‡à¤¤à¥à¤° -ExportActionListener.1= तारीख चूनें जबसे रिकॉरà¥à¤¡ निरà¥à¤¯à¤¾à¤¤ करने है -ExportDialogProcessMonitor.0=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... -ExportDialogProcessMonitor.1=पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ पà¥à¤°à¤¾à¤°à¤‚भ करने के लिठपà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ कर रहा है \: -ExportDialogProcessMonitor.4=निरà¥à¤¯à¤¾à¤¤ रिकॉरà¥à¤¡\: -ImportProcessMonitorDialog.0=आयातित रिकॉरà¥à¤¡ \: -ImportActionListener.0=कà¥à¤¯à¤¾ उन भूखंडों के लिठडेटा जो कि पूरी तरह से भरे नहीं गठ,आयातित किया जाना चाहिà¤? -ImportActionListener.2=आप कà¥à¤²à¤¿à¤• करें, नहींतो केवल डेटा "हरी" राजà¥à¤¯ में भूखंडों से ,जिसमें सभी डेटा यà¥à¤•à¥à¤¤ है , आयात किया जाà¤à¤—ा। -ImportDialogProcessMonitor.0=\ गणना -ImportDialogProcessMonitor.11=रिकॉरà¥à¤¡ की पà¥à¤°à¤¾à¤°à¤‚भिक संखà¥à¤¯à¤¾ \: -ImportDialogProcessMonitor.2=रिकॉरà¥à¤¡ आयात... -ImportDialogProcessMonitor.5=आयातित रिकॉरà¥à¤¡ की वासà¥à¤¤à¤µà¤¿à¤• संखà¥à¤¯à¤¾ \: -ImportDialogProcessMonitor.8=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... -InfiniteProgressMonitor.0=रदà¥à¤¦ ऑपरेशन -JFileChooserExistsAware.0=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ परियोजना फ़ाइल -KmlImportService.13=पà¥à¤²à¥‰à¤Ÿ सà¥à¤¥à¤¾à¤¨à¥‹à¤‚ को बचाने के लिठà¤à¤• सीà¤à¤¸à¤µà¥€ फ़ाइल का चयन करें -MissingPlotsListener.0=तà¥à¤°à¥à¤Ÿà¤¿ उन भूखंडों के बारे में जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ करने के लिठजो डेटाबेस पर मौजूद नहीं -MissingPlotsListener.1=गà¥à¤® भूखंड -MissingPlotsListener.10=सेमà¥à¤ªà¤² डिजाइन में भूखंडों की कà¥à¤² संखà¥à¤¯à¤¾ \: -MissingPlotsListener.12=गà¥à¤® भूखंडों की संखà¥à¤¯à¤¾ \: -MissingPlotsListener.14=सभी भूखंडों भर रहे हैं\! -MissingPlotsListener.2=कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ अंतरà¥à¤µà¤¸à¥à¤¤à¥ की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ -MissingPlotsListener.3=भूखंड की जानकारी वाले फ़ाइलें चà¥à¤¨à¥‡à¤‚ ( .सीà¤à¤¸à¤µà¥€ या .सीईडी फ़ाइलें ) जिसके लिठआप जानना चाहते हैं तो सभी डेटा भर दिया गया है चाहता हूà¤. -MissingPlotsListener.4=गà¥à¤® भूखंड- जानकारी -MissingPlotsListener.5=फ़ाइल से \: -MissingPlotsListener.6=सीà¤à¤¡à¥€ फ़ाइल में निरà¥à¤¯à¤¾à¤¤ करें -ProcessMonitorDialog.1=पंकà¥à¤¤à¤¿ संखà¥à¤¯à¤¾ पर तà¥à¤°à¥à¤Ÿà¤¿ -ProcessMonitorDialog.4=, कॉलम -ProcessMonitorDialog.5=\ --मूलà¥à¤¯ -YES= हां -YES_TO_ALL=सब को हां -NO=नहीं -NO_TO_ALL=सभी को नहीं - - - +AboutDialog.19 = ບັນ​ຫາ​ເàºàºµàº” A +AboutDialog.5 = ສà»àº²â€‹àº¥àº±àºšâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹à»€àºžàºµà»ˆàº¡â€‹à»€àº•ີມ​ໄດ້​ທີ່ OpenForis.org ເວັບ​ໄຊ​ທ​໌​ຂອງ​ພວàºâ€‹à»€àº®àº»àº² +AboutDialog.6 = ຂà»â€‹à»‚ທດ​ນà»àº²â€‹, ບັນ​ຫາ​ທີ່​ເàºàºµàº”​ຂຶ້ນ​ໃນ​ຂະ​ນະ​ທີ່​ຄວາມ​ພະ​àºàº²â€‹àºàº²àº¡â€‹àº—ີ່​ຈະ​ເປີດ​àºàº²àº™â€‹à»€àºŠàº·à»ˆàº­àº¡â€‹àº•à»à»ˆâ€‹àº™àºµà»‰â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹àº¥àº°â€‹àºšàº»àºšâ€‹àº‚ອງ​ທ່ານ​ຕົວ​ທ່ອງ​ເວັບ​ຂອງ​ມາດ​ຕະ​ຖານ​. +AboutDialog.8 = Ok +AspectCode.0 = ເຫນືອ +AspectCode.1 = ວັນ​ອອàºâ€‹àºªà»ˆàº½àº‡â€‹à»€àº«àº™àº·àº­ +AspectCode.2 = ຕາ​ເວັນ​ອອຠ+AspectCode.3 = ພາàºâ€‹à»ƒàº•້​, ຕາ​ເວັນ​ອອຠ+AspectCode.4 = ໃຕ້ +AspectCode.5 = ພາàºâ€‹à»ƒàº•້​, ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ+AspectCode.6 = ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ+AspectCode.7 = ພາàºâ€‹à»€àº«àº™àº·àº­â€‹, ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ+CollectEarthWindow.0 = ໃນ​ເວ​ລາ​ທີ່​ພະ​àºàº²â€‹àºàº²àº¡â€‹à»€àºžàº·à»ˆàº­â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌ CSVຄວາມ​ຜິດ​ພາດ +CollectEarthWindow.1 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àº +CollectEarthWindow.10 File \= +CollectEarthWindow.11 ອອàºâ€‹àºˆàº²àº \= +CollectEarthWindow.12 = ເຄື່ອງ​ມືຂà»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.13 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ CSV àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ +CollectEarthWindow.14 = Start SAIKU +CollectEarthWindow.15 = ຄຸນ​ສົມ​ບັດ +CollectEarthWindow.16 = ຊ່ວàºâ€‹à»€àº«àº¼àº·àº­ +CollectEarthWindow.17 = ປະ​ຕິ​ເສດ +CollectEarthWindow.18 = ຄົ້ນ​ຫາ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ຫາàºâ€‹à»„ປ​ໃນ​ຖານ​ຂà»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.19 = ເàºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ+CollectEarthWindow.2 = ພາ​ສາ +CollectEarthWindow.20 = ຈà»àº²â€‹àº™àº§àº™â€‹àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™ duplicated​\: +CollectEarthWindow.21 = ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ຊອàºâ€‹àº«àº² icon ສà»àº²â€‹àº¥àº±àºšâ€‹àºžàº²â€‹àº•ົ້ນ​ຕ໠+CollectEarthWindow.22 = ທ່ານ​ມີ​ຄວາມ​à»àº™à»ˆâ€‹à»ƒàºˆàº§à»ˆâ€‹àº²â€‹àº—່ານ​ຕ້ອງ​àºàº²àº™â€‹àº›àº´àº”​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹? ໃນ​àºàº²àº™â€‹àº›àº´àº”​ປ່ອງ​ຢ້ຽມ​àºàº±àº‡â€‹àºˆàº°â€‹àº›àº´àº”​ເຄື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹àº‚ອງ​ໂລàºâ€‹à»„ດ້​ເàºàº±àºšâ€‹àºà»àº² +CollectEarthWindow.23 = àºàº²àº™â€‹àº¢àº±à»‰àº‡â€‹àº¢àº·àº™â€‹àº—ີ່​ຈà»àº²â€‹à»€àº›àº±àº™ +CollectEarthWindow.24 = XML ສົ່ງ​ອອຠ+CollectEarthWindow.25 = ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ເພີ່ມ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹à»€àº«àº¼àº»à»ˆàº²â€‹àº™àºµà»‰â€‹à»àº¥à»‰àº§â€‹à»àº¥àº°â€‹àºàº²àº™â€‹àºªàº¹àº™â€‹à»€àºªàºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº‚ອງ​ທ່ານ​? +CollectEarthWindow.26 = ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™ +CollectEarthWindow.27 = ປັບ​ປຸງ +CollectEarthWindow.28 = ເຮັດ​ຢູ່​ຕ່າງ​ປະ​ເທດ​ເàºàº±àºšâ€‹àºà»àº²â€‹à»€àº„ື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹àº„ວນ​ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹à»àº¥à»ˆàº™â€‹à»ƒàº™â€‹àº‚ະ​ນະ​ທີ່​ຜູ້​ປະ​àºàº­àºšâ€‹àºàº²àº™â€‹àº•ີ​ຄວາມ​ຫມາàºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹. +CollectEarthWindow.29 = The Saiku Server ບà»à»ˆâ€‹à»„ດ້​ຖືàºâ€‹àº•ັ້ງ​. +CollectEarthWindow.3 = \ ຄວາມ​ຜິດ​ພາດ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ +CollectEarthWindow.30 = àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº®àº±àºâ€‹àºªàº²â€‹àºàº²àº™â€‹à»€àº›àºµàº”​ຫນ້າ​ຕ່າງ​ນີ້​ໃນ​ຂະ​ນະ​ທີ່​ທ່ານ​àºà»àº²â€‹àº¥àº±àº‡â€‹à»ƒàºŠà»‰â€‹àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹. +CollectEarthWindow.31 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌ CSV +CollectEarthWindow.32 = ອອຠ+CollectEarthWindow.33 = ຊື່​ຜູ້​ປະ​àºàº­àºšâ€‹àºàº²àº™â€‹àºˆàº°â€‹àº•້ອງ​ມີ​àºàº²àº™â€‹àº•à»à»ˆâ€‹à»„ປ​ອີàºâ€‹à»àº¥à»‰àº§â€‹àºâ€‹à»ˆâ€‹àº§àº² 5 ລັàºâ€‹àºªàº°â€‹àº™àº°â€‹à»àº¥àº°â€‹àºªàº±à»‰àº™â€‹àºâ€‹à»ˆâ€‹àº§àº² 50ຄວາມ​ຜິດ​ພາດ +CollectEarthWindow.34 = àºàº§àº”​ສອບ +CollectEarthWindow.35 = ຜູ້​ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹àº¥àº»àºšâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™ ​\! ຫລັàºâ€‹àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº•ື່ມ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàºªà»ˆâ€‹àºŠàº·à»ˆâ€‹àºœàº¹à»‰â€‹àº›àº°â€‹àºàº­àºšâ€‹àºàº²àº™â€‹à»àº¥àº°â€‹à»ƒàº«à»‰â€‹àºàº»àº”​ປຸ່ມ "ປັບ​ປຸງ​"​. ຊື່ +CollectEarthWindow.36 = ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹àºšà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ເປົ່າ +CollectEarthWindow.37 = ຮັàºâ€‹àºªàº²â€‹àºˆàº±àº™à»„ຟລ​໌ +CollectEarthWindow.38 = CSV +CollectEarthWindow.39 à»àºˆà»‰àº‡ \= ມັນ​ເປັນ​àºàº²àº™â€‹àºªàº»àº¡â€‹àº„ວນ​ທີ່​ທ່ານ​ໄປ​ເຖິງ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº‚ອງ​ທ່ານ (àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ XML​) àºà»ˆàº­àº™â€‹àº—ີ່​ຈະ​ໄດ້​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº«àº¡à»ˆâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ +CollectEarthWindow.4 = FAO à»àºˆà»‰àº‡â€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ເສດ +CollectEarthWindow.40 = ທີ່​àºà»àº²â€‹àº™àº»àº”​ໄວ້​ຕາມ​ເສັ້ນ​ທາງ​àºàº±àºšâ€‹à»‚ຟນ​ເດີ​ທີ່ Saiku Server ໄດ້​ຖືàºâ€‹àº•ິດ​ຕັ້ງ​ຢູ່​ໃນ Tools-> Properties-> à»àº–ບ​à»àºšàºšâ€‹àºžàº´â€‹à»€àºªàº”​ໄດ້​. +CollectEarthWindow.41 = àºàº²àº™â€‹àº›àº°â€‹àº«àºàº±àº”​àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌​\: +CollectEarthWindow.42 = ອອຠ+CollectEarthWindow.43 = àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº•à»àº²â€‹àºàº±àº™â€‹àº—ີ່​ພົບ​ເຫັນ +CollectEarthWindow.44 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ / ສົ່ງ​ອອàºàº‚à»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.45 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ XML (à»àº›â€‹)ຂà»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.46 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ໃຫມ່​ຈາàºâ€‹à»„ປ​ສະ​ນີ (XML à»àº›â€‹)àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™ +CollectEarthWindow.55 ປັບ​ປຸງ \= àºàº²àº™â€‹àº™à»àº²â€‹à»ƒàºŠà»‰ CSV +CollectEarthWindow.47 = Saiku Server ບà»à»ˆâ€‹à»„ດ້​àºà»àº²â€‹àº«àº™àº»àº” +CollectEarthWindow.48 = ໄຟລ​໌​ຫັດ​ໄປ​ສະໄຟລ​໌ +CollectEarthWindow.49 = Fusion CSV +CollectEarthWindow.5 = ປິດ +CollectEarthWindow.50 = ເປີດ​ຄູ່​ມື​àºàº²àº™â€‹à»ƒàºŠà»‰àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™â€‹àº›àº±àºšâ€‹àº›àº¸àº‡â€‹àº‚ອງ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ+CollectEarthWindow.51 CHECK \= àºàº§àº”​ສອບ +CollectEarthWindow.52 = File ເຂົ້າ​ສູ່​ລະ​ບົບ​ຄà»àº²â€‹àº®à»‰àº­àº‡â€‹àºªàº°â€‹àº«àº¡àº±àºâ€‹à»€àº›àºµàº” +CollectEarthWindow.53 = àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»€àº­â€‹àºàº°â€‹àºªàº²àº™â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹à»€àº‚ົ້າ​ສູ່​ລະ​ບົບຈຸດ +CollectEarthWindow.54 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຈາຠKMLàºà»ˆàº½àº§â€‹àºàº±àºš +CollectEarthWindow.56 = ... +CollectEarthWindow.57 = ຂະ​ບວນ​àºàº²àº™â€‹à»€àº¥àºµà»ˆàº¡â€‹àº•ົ້ນ Saiku à»àº¡à»ˆàº™â€‹àºàº±àº‡â€‹à»àº¥à»ˆàº™â€‹, àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº¥à»â€‹àº–້າ​. +CollectEarthWindow.58 = ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ເລີ່ມ​ຕົ້ນ​àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ Saiku +CollectEarthWindow.59 = ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ Re​\: àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ Saiku ໄດ້​?
ຂະ​ບວນ​àºàº²àº™â€‹àº™àºµà»‰â€‹àºªàº²â€‹àº¡àº²àº”​ໃຊ້​ເວ​ລາ​ຫຼາàº
ຖ້າ​ທ່ານ​ຄລິàºâ€‹à»ƒàºªà»ˆ "à»àº¡à»ˆàº™â€‹à»àº¥à»‰àº§â€‹" ເປັນ​ຊຸດ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໃຫມ່​ທີ່​ມີ​ຄວາມ​ຫຼ້າ​ສຸດ​ໄດ້​. ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº‚ຶ້ນ​. +CollectEarthWindow.6 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ Fusion ຕາ​ຕະ​ລາງàºàº²àº™â€‹àºœàº°â€‹àº¥àº´àº”​ຂà»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.60 = Saiku +CollectEarthWindow.61 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່ XML (àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº”ັດ​à»àºà»‰â€‹àº™àº±àºšâ€‹àº•ັ້ງ​à»àº•່​àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àºªàº¸àº”​ທ້າàºâ€‹) ສົ່ງ​ອອàºàºà»ˆàº½àº§â€‹àºàº±àºš +CollectEarthWindow.62 = ... +CollectEarthWindow.63 Error \= àºàº²àº™â€‹à»„ດ້​ຮັບ​ຈຸດ​ທີ່​ໄດ້​ຈາຠKML +CollectEarthWindow.64 = ສະ​ຫນັບ​ສະ​ຫນູນ​ທາງ​ເທàºâ€‹àº™àº´àº +CollectEarthWindow.7 Error \= ໃນ​ເວ​ລາ​ທີ່​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຂà»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.8 ຂà»à»‰â€‹àº„ວາມ​ປະ​ຕິ​ເສດ \= ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ພົບ​ເຫັນ +CollectEarthWindow.9 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໄດ້​ນà»àº²â€‹à»€àº‚ົ້າ​ມາ​ປະ​àºàº­àºšâ€‹àº”້ວàºâ€‹àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àº—ີ່​ມີ​ຢູ່​à»àº¥à»‰àº§â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚ອງ​ທ່ານ​. +DynamicsCode.0 = ປ່າ​ໄມ້​ໃນ​ເບື້ອງ​ຕົ້ນ +DynamicsCode.1 = ທົ່ງ​ຫàºà»‰àº²â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ +DynamicsCode.2 = àºàº²àº™â€‹àº•ັ້ງ​ຖິ່ນ​ຖານ​ໃນ​ເບື້ອງ​ຕົ້ນ +DynamicsCode.3 = ເບື້ອງ​ຕົ້ນ Otherland +DynamicsCode.4 = ຊຸ່ມ​ນ​້​à»àº²â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ +DynamicsCode.5 = ເບື້ອງ​ຕົ້ນ Cro​​pland +OpenTextFileListener.0 = ໄຟລ​໌​ຂà»à»‰â€‹àº„ວາມ​à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹à»„ດ້​ພົບ​ໄດ້​ທີ່​\:àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +OptionWizard.0 = ທາງ​ເລືອàºâ€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ+OptionWizard.1 = ເລືອàºâ€‹àº‚ອງ​ຕົວ​ທ່ອງ​ເວັບ +OptionWizard.10 = ໂຟ​ເດີ​ສà»àº²â€‹àº®àº­àº‡â€‹àºˆàº±àº™ +OptionWizard.11 = ບà»à»ˆâ€‹àº®àº¹à»‰â€‹àºˆàº±àºâ€‹\: àºàº²àº™â€‹àº™à»àº²â€‹à»ƒàºŠà»‰ ifconfig +OptionWizard.12 = ລູàºâ€‹àº„້າ​ຕົວ​ຢ່າງàºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +OptionWizard.13 = ໂລຠIP Serveràºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +OptionWizard.14 = port ໂລຠServer (ຕົວ​ຢ່າງ​\: 8023​) +OptionWizard.15 = ບັນ​ທຶàºâ€‹à»àº¥àº°â€‹à»ƒàºŠà»‰â€‹àºàº²àº™â€‹àº›à»ˆàº½àº™â€‹à»àº›àº‡ +OptionWizard.16 = ລະ​ຫັດ +OptionWizard.17 = X​-coord +OptionWizard.18 = Y coord​, +OptionWizard.19 = àºàº²àº™â€‹àºàº»àºâ€‹àº¥àº°â€‹àº”ັບ +OptionWizard.2 = ບວນ​àºàº²àº™â€‹à»€àº®àº±àº”​ວຽຠ(server / ລູàºâ€‹àº„້າ​) +OptionWizard.20 = ໄດ້​ເນື້ອ​ໃນ​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»„ດ້​ມີ​àºàº²àº™â€‹àº›à»ˆàº½àº™â€‹à»àº›àº‡â€‹.
àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº®àº±àºšâ€‹à»‚ຫລດ​ເນື້ອ​ຫາ​ໃນ​ເວ​ລາ​ທີ່​ທ່ານ​àºà»àº²â€‹àº¥àº±àº‡â€‹àº®àº±àºšâ€‹àºàº²àº™â€‹àºàº°â€‹àº•ຸ້ນ​ໂດàºâ€‹àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹. +OptionWizard.21 = ປັບ​ປຸງ​ສົບ​ຜົນ​ສà»àº²â€‹à»€àº¥àº±àº” +OptionWizard.22 = ຄ້ອຠ+OptionWizard.23 = ມີ​ຄວາມ​ຜິດ​ພາດ​ໃນ​ເວ​ລາ Re​\: ເປີດ​ໄດ້​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»€àº›àº±àº™â€‹à»„ດ້àºàº»àºâ€‹à»€àº¥àºµàºâ€‹àºàº²àº™ +OptionWizard.24 = àºàº»àºà»€àº¥àºµàºàºàº²àº™ +OptionWizard.25 = ຮູບ​à»àºšàºšâ€‹àºàº²àº™â€‹àº”à»àº²â€‹à»€àº™àºµàº™â€‹àº‡àº²àº™ +OptionWizard.26 = àºàº²àº™â€‹à»€àº›àº±àº™â€‹à»€àºˆàº»à»‰àº²â€‹àºžàº²àºš DB +OptionWizard.27 = ນີ້​ບà»à»ˆâ€‹à»„ດ້​ເປັນ​ທີ່​àºàº­àº¡â€‹àº®àº±àºš Saiku Folder (ເອ​àºàº°â€‹àºªàº²àº™â€‹à»€àº¥àºµà»ˆàº¡ saiku.bat ບà»à»ˆâ€‹à»àº¡à»ˆàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹) +OptionWizard.28 = Saiku Server ບà»à»ˆâ€‹àº®àº­àº‡â€‹àº®àº±àºš +OptionWizard.29 = ພ໠DB +OptionWizard.3 = Server ຕົວ​ຢ່າງ +OptionWizard.30 = ທາງ​ເລືອຠSQLite +OptionWizard.31 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº•ົວ​ຢ່າງ +OptionWizard.32 = ຮູບ​à»àºšàºšâ€‹àº”ິນ​ຕອນ +OptionWizard.33 = ສà»àº²â€‹àº«àº¼àº§àº”​ນຸ​àºàº»àº¡ +OptionWizard.34 = à»àºšàºšâ€‹àºžàº´â€‹à»€àºªàº” +OptionWizard.35 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ຈຸດ​ຕົວ​ຢ່າງ +OptionWizard.36 = ໄລ​àºàº°â€‹àº—າງ​ລະ​ຫວ່າງ​ຈຸດ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àº•ົວ​ຢ່າງ (ໃນ​ຕາ​) +OptionWizard.37 = ອັດ​ຕາ​ທີ່​ມີ​ຊາàºâ€‹à»àº”ນ​ດິນ​ຕອນ (à»àº¡àº±àº”​) +OptionWizard.38 = ໄຟລ​໌ CSV / CED ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ອ່ານ​ໄດ້​ຢ່າງ​ຖືàºâ€‹àº•້ອງ
ເອ​àºàº°â€‹àºªàº²àº™â€‹à»„ດ້​ຖືàºâ€‹àº„າດ​ວ່າ​ຈະ​ມີ​ມູນ​ຄ່າ​àºàº²àº™â€‹à»àºàºâ€‹àºˆàº¸â€‹àº¥àº°â€‹àºžàº²àºâ€‹à»€àºŠàº±à»ˆàº™â€‹àº™àºµà»‰â€‹\:​.
+OptionWizard.39 = ລະ​ຫັດ​, YCoordinate​, XCoordinate​, ພູ​, ລັàºâ€‹àºªàº°â€‹àº™àº° +OptionWizard.4 = IP ຄອມ​ພິວ​ເຕີ​ປັດ​ຈຸ​ບັນ​\: +OptionWizard.40 = ໂຄງ​àºàº²àº™ +OptionWizard.41 = ໂຫຼດ​ໄຟລ​໌​ໂຄງ​àºàº²àº™â€‹à»ƒàº«àº¡à»ˆ +OptionWizard.42 = ຜິດ​ພາດ​ໃນ​ເວ​ລາ​ປິດ​àºàº²àº™â€‹àº­à»ˆàº²àº™ CSV +OptionWizard.43 = ຊື່​ຂອງ​àºàº²àº™â€‹àºªà»àº²â€‹àº«àº¼àº§àº” +OptionWizard.44 = ຖານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ປ​ໃຫ້​ເຖິງ​ອັດ​ຕະ​ໂນ​ມັດ​ທີ່ +OptionWizard.45 = Open Earth Engine ຊູມ​ເຂົ້າ​ໄປ​ໃນ​ເຂດ​ຕອນ​ດິນ​ຂອງ​ຕົນ +OptionWizard.46 = timelapse ຈັàºâ€‹à»€àº›àºµàº”​ໂລàºâ€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºžàº·à»‰àº™â€‹àº—ີ່​ຕອນ​ດິນ​ຂອງ​ຕົນ +OptionWizard.47 = Open à»àºœàº™ Bing ສà»àº²â€‹àº¥àº±àºšâ€‹àºžàº·à»‰àº™â€‹àº—ີ່​ຕອນ​ດິນ​ຂອງ​ຕົນ +OptionWizard.48 = ຮູບ​à»àºšàºšâ€‹à»€àº›àºµàº”​ໃນ​ຕົວ​ທ່ອງ​ເວັບ​ຂອງ​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»„ດ້ (à»àº™àº°â€‹àº™à»àº²â€‹à»ƒàº«à»‰â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™ LINUX​) +OptionWizard.49 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™ Ced / csv ໄຟລ​໌​ທີ່​ມີ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº•ອນ​ດິນ​ຂອງ​ຕົນàºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +OptionWizard.5 = port ໂລຠServer​\: +OptionWizard.50 = Browse ... +OptionWizard.51 = ເອ​àºàº°â€‹àºªàº²àº™â€‹à»‚ຄງ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຜິດ​ພາດ +OptionWizard.52 = CSV / ເອ​àºàº°â€‹àºªàº²àº™ Ced ມີ​àºàº²àº™â€‹àº›àº°â€‹àºªàº²àº™â€‹àº‡àº²àº™â€‹à»€àº—ົ່າ​ນັ້ນ +OptionWizard.54 = ຈຸດ​ສູນ​àºàº²àº‡ +OptionWizard.55 = Error ໂຟນ​ເດີ​ໂຄງ​àºàº²àº™â€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ +OptionWizard.56 = ໂຄງ​àºàº²àº™ Load +OptionWizard.57 = ໂຄງ​àºàº²àº™ loaded àºà»ˆàº­àº™â€‹àº«àº™à»‰àº²â€‹àº™àºµà»‰ +OptionWizard.58 = Open GEE Code Editor (ຮຽàºâ€‹àº®à»‰àº­àº‡â€‹à»ƒàº«à»‰â€‹àº¡àºµâ€‹àºàº²àº™â€‹à»€àº‚ົ້າ​ເຖິງ Tester Trusted​) +OptionWizard.59 = Open ທີ່​ນີ້​à»àºœàº™â€‹àº—ີ່​ສຸມ​ໃສ່​ຕອນ​ດິນ​ຂອງ​ຕົນ +OptionWizard.6 = ຕົວ​àºà»àº²â€‹àº™àº»àº”​àºàº²àº™ PostgreSQL DB +OptionWizard.65 = ເສັ້ນ​ທາງ​àºàº±àºšâ€‹à»‚ຟນ​ເດີ​ທີ່ Saiku +OptionWizard.66 = Browse ... +OptionWizard.67 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ບັດ​àºàº²àº™ Firefox +OptionWizard.68 = Browse ... +OptionWizard.7 = ຊື່​ຜູ້​ໃຊ້ +OptionWizard.70 = àºàº²àº™â€‹àºšà»â€‹àº¥àº´â€‹àº«àº²àº™â€‹à»„ຟ +OptionWizard.72 = ໄຟລ​໌​ຖານ​ສອງ +OptionWizard.73 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ບັດ​àºàº²àº™ Chrome +OptionWizard.74 = Browse ... +OptionWizard.76 = àºàº²àº™â€‹àºšà»â€‹àº¥àº´â€‹àº«àº²àº™â€‹à»„ຟ +OptionWizard.78 = ໄຟລ​໌​ຖານ​ສອງ +OptionWizard.79 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹à»àºšàºš KML Freemarker +OptionWizard.8 = ລະ​ຫັດ​ຜ່ານ +OptionWizard.80 = Browse ... +OptionWizard.82 = à»àº¡à»ˆâ€‹à»àºšàºš Freemarker +OptionWizard.83 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº­àº­àºâ€‹à»àºšàºšâ€‹àº®àº¹àºšâ€‹à»àºšàºš HTML ປູມ​ເປົ້າ +OptionWizard.84 = Browse ... +OptionWizard.86 = HTML webpage +OptionWizard.87 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™ XML àºàº±àºšâ€‹àº„à»àº²â€‹àº™àº´â€‹àºàº²àº¡ IDM +OptionWizard.88 = Browse ... +OptionWizard.9 = ຊື່ DB +OptionWizard.90 = ຫມາຠIDM XML +OptionWizard.91 = Server (ສະ​ບັບ​ຜູ້​ຈັດ​àºàº²àº™â€‹àº«àº¼àº·â€‹àº¢àº·àº™â€‹àº¢àº¹à»ˆâ€‹àº„ົນ​ດຽວ​ໃຊ້​) +OptionWizard.92 = ລູàºâ€‹àº„້າ (ປະ​ຕິ​ບັດ​àºàº²àº™ / àºàº²àº™â€‹à»€àºŠàº·à»ˆàº­àº¡â€‹àº•à»à»ˆâ€‹àºàº±àºšâ€‹à»€àº„ື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹) +OptionWizard.93 = SQLite (à»àºšàºšâ€‹àºàº±àº‡ / ໄຟລ​໌​ດຽວ​ຕາມ​) +OptionWizard.94 = PostgreSQL +SaikuAnalysisListener.0 = à»àº¡à»ˆàº™ - ຂà»à»‰â€‹àº¡àº¹àº™ Refresh Saiku (ຂະ​ບວນ​àºàº²àº™â€‹àºàº²àº§â€‹) +SaikuAnalysisListener.1 = ບà»à»ˆ - ພຽງ​à»àº•່​ເລີ່ມ​ຕົ້ນ Saiku +SaikuStarter.1 = ເລີ່ມ Saiku +SaikuStarter.2 = u0EC0ລີ່ມ Saiku ສາ​ມາດ​ໃຊ້​ເວ​ລາ​ນາ​ທີ \= àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº¥à»â€‹àº–້າ ​\! +SaveEarthDataServlet.0 = àºàº²àº™â€‹àº®à»‰àº­àº‡â€‹àº‚à»â€‹à»€àº›àº»à»ˆàº² +SaveEarthDataServlet.1 = ບັນ​ຫາ​ທີ່​ເàºàºµàº”​ຂຶ້ນ​ໃນ​ຂະ​ນະ​ທີ່​ປະ​ຢັດ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ດ້ +SaveEarthDataServlet.2 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໄດ້​ບັນ​ທືຠ+SlopeCode.0 = ລຽບ (0-5​)àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +EarthApp.11 = ໃນ​ທົ່ວ​ໂລàºâ€‹à»àº¡à»ˆàº™â€‹à»àº¥à»‰àº§â€‹à»àº¥à»ˆàº™ +EarthApp.21 = ໄຟ​ທີ່​ມີ​ຕາ​ຂ່າàºâ€‹à»„ຟ​ຟ້າ​ຂອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ເປັນ CSV / CED à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹àºžàº»àºšâ€‹à»€àº«àº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹à»€àºªàº±à»‰àº™â€‹àº—າງ​ທີ່​ເລືອàºâ€‹\:
+EarthApp.23 = ບà»à»ˆâ€‹à»„ຟລ​໌ CSV / CED ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

+EarthApp.24 = ໄຟ​ທີ່​ມີ​à»àº¡à»ˆâ€‹à»àºšàºš Freemarker ທີ່​ມີ​ຄà»àº²â€‹àº™àº´â€‹àºàº²àº¡ KML ບà»à»ˆâ€‹à»„ດ້​ພົບ​ເຫັນ​ຢູ່​ໃນ​ເສັ້ນ​ທາງ​ທີ່​ເລືອàºâ€‹\:
+EarthApp.26 = ບà»à»ˆâ€‹à»„ຟລ​໌​ຄà»àº²â€‹àº™àº´â€‹àºàº²àº¡ KML ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

+EarthApp.27 = ໄຟ​ທີ່​ມີ​ຮູບ​à»àºšàºšâ€‹àº›àº¹àº¡â€‹à»€àº›àº»à»‰àº² HTML ໄດ້​à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹àºžàº»àºšâ€‹à»€àº«àº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹à»€àºªàº±à»‰àº™â€‹àº—າງ​ທີ່​ເລືອàºâ€‹\:
+EarthApp.29 = ບà»à»ˆâ€‹à»„ຟລ​໌​ປູມ​ເປົ້າ HTML ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

+EarthApp.3 = ເຕືອນ​ຂ້ອàºâ€‹àº•à»à»ˆâ€‹àº¡àº² +EarthApp.30 = àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹à»àºà»‰â€‹à»„ຂ​ສະ​ຖານ​ທີ່​ໄຟລ​໌​ຢູ່​ໃນ​ເມ​ນູ Tools-> Properties​. +EarthApp.4 = àºàº²àº™â€‹àº›àº±àºšâ€‹àº›àº¸àº‡â€‹à»ƒàº™â€‹àº›àº±àº”​ຈຸ​ບັນ +EarthApp.5 = ຢ່າ​ເຕືອນ​ຂ້າ​ພະ​ເຈົ້າ​ອີàºâ€‹à»€àº—ື່ອ​ຫນຶ່ງ +EarthApp.57 = ມີ​ສະ​ບັບ​ໃຫມ່​ຂອງ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹àº—ີ່​ມີ à»àº¡à»ˆàº™â€‹\!
ທ່ານ​ບà»à»ˆâ€‹àº•້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹? ເຕືອນ +EarthApp.58 = ປັບ​ປຸງ +EarthApp.59 Error \= ໃນ​ເວ​ລາ​ທີ່​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ເອ​àºàº°â€‹àºªàº²àº™â€‹à»‚ຄງ​àºàº²àº™ +EarthApp.6 = \ - ສະ​ບັບ +EarthApp.61 = ເອ​àºàº°â€‹àºªàº²àº™â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹à»„ດ້​ເàºàº±àºšâ€‹àºà»àº²â€‹àºšà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ຈະ​ເປີດ​ເຜີàºâ€‹.
àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹à»€àº®àº±àº”​ໃຫ້​à»àº™à»ˆâ€‹à»ƒàºˆàº§à»ˆâ€‹àº²â€‹àº—ີ່​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»àº¡à»ˆàº™â€‹àºàº²àº™â€‹àº•ິດ​ຕັ້ງ​. +EarthSurveyService.9 = ພາàºâ€‹àºªàº°â€‹àº«àº™àº²àº¡â€‹àº—ີ່​ຕ້ອງ​àºàº²àº™à»€àº­àº»àº² +ExportActionListener.1 = ວັນ​ທີ່​ຈະ​ບັນ​ທຶàºâ€‹àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àºˆàº²àºàº‚à»à»‰â€‹àº¡àº¹àº™ +ExportDialogProcessMonitor.0 àºàº²àº™â€‹àº›àº¸àº‡â€‹à»àº•່ງ \= ... +ExportDialogProcessMonitor.1 = ລà»â€‹àº–້າ​ທີ່​ຈະ​ເລີ່ມ​ຕົ້ນ​ຂະ​ບວນ​àºàº²àº™â€‹\:àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àº +ExportDialogProcessMonitor.4 =​\: +ImportProcessMonitorDialog.0 = àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​\: +ImportActionListener.0 = ຄວນ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àº—ີ່​ດິນ​ທີ່​ບà»à»ˆâ€‹à»„ດ້​ຮັບ​àºàº²àº™â€‹à»€àº•ີມ​ລົງ​ໄປ​ໃນ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ໄດ້ +ImportActionListener.2 = ຖ້າ​ທ່ານ​ຄລິàºâ€‹à»ƒàºªà»ˆ ບà»à»ˆ ພຽງ​à»àº•່​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºˆàº²àºâ€‹àºžàº²àºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ຢູ່​ໃນ​ສະ​ພາບ "ສີ​ຂຽວ​"​, ທີ່​ບັນ​ຈຸ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ັງ​ຫມົດ​ໄດ້​, ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​. +ImportActionListener.3 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ບັນ​ທຶàºâ€‹àº—າງ​àºàº²àº™â€‹àºªà»àº²â€‹à»€àº¥àº±àº”​ຮູບ +ImportDialogProcessMonitor.0 = \ ຄິດ​ໄລ່ +ImportDialogProcessMonitor.11 = ຈà»àº²â€‹àº™àº§àº™â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ​ຂອງ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹\: +ImportDialogProcessMonitor.2 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ບັນ​ທຶàºâ€‹àºàº²àº™ ... +ImportDialogProcessMonitor.5 = ຈ​à»â€‹àº²â€‹àº™àº§àº™â€‹àº•ົວ​ຈິງ​ຂອງ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​\:ຂà»à»‰â€‹àº¡àº¹àº™ +ImportDialogProcessMonitor.8 àºàº²àº™â€‹àº›àº¸àº‡â€‹à»àº•່ງ \= ... +InfiniteProgressMonitor.0 = àºàº»àºâ€‹à»€àº¥àºµàºâ€‹àºàº²àº™â€‹àº”à»àº²â€‹à»€àº™àºµàº™â€‹àº‡àº²àº™àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +JFileChooserExistsAware.0 = file ໂລàºâ€‹à»‚ຄງ​àºàº²àº™ +KmlImportService.13 = ເລືອàºâ€‹à»„ຟລ​໌ CSV ເພື່ອ​ຊ່ວàºâ€‹àº›àº°â€‹àº¢àº±àº”​ສະ​ຖານ​ຕອນ​ດິນ​ຂອງ​ຕົນ​ເພື່ອ +MissingPlotsListener.0 Error \= ໃນ​ຂະ​ນະ​ທີ່​àºàº²àº™â€‹à»„ດ້​ຮັບ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àº—ີ່​ດິນ​ບà»à»ˆâ€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ດ້ +MissingPlotsListener.1 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ໄປ +MissingPlotsListener.10 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ໃນ​àºàº²àº™â€‹àº­àº­àºâ€‹à»àºšàºšâ€‹àºªàº¸à»ˆàº¡â€‹àº•ົວ​ຢ່າງ​\: +MissingPlotsListener.12 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ຫາàºâ€‹à»„ປ​\: +MissingPlotsListener.14 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທັງ​ຫມົດ​à»àº¡à»ˆàº™â€‹à»„ດ້​ເຕີມ​ລົງ​ໄປ ​\!ເນື້ອ​ໃນ +MissingPlotsListener.2 = ຄັດ​ລອàºâ€‹à»„ປ​ທີ່ clipboardເອົາ +MissingPlotsListener.3 = ໄຟລ​໌​ທີ່​ບັນ​ຈຸ​ມີ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ສານ​ຕອນ​ດິນ​ຂອງ​ຕົນ (.csv ຫຼື​ໄຟລ​໌ .ced​) ສà»àº²â€‹àº¥àº±àºšâ€‹àº—ີ່​ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ຮູ້​ວ່າ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ັງ​ຫມົດ​ໄດ້​ຮັບ​àºàº²àº™â€‹à»€àº•ີມ​ລົງ​ໄປ​. +MissingPlotsListener.4 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຫາàºâ€‹à»„ປ - ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ສານ +MissingPlotsListener.5 = ຈາàºâ€‹à»„ຟ​\: +MissingPlotsListener.6 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ​ໄຟລ​໌ CED +ProcessMonitorDialog.1 = ຂà»à»‰â€‹àºœàº´àº”​ພາດ Parsing àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àºˆà»àº²â€‹àº™àº§àº™â€‹àºàº²àº™â€‹àº•ິດ​ຕà»à»ˆâ€‹àºàº±àº™ +ProcessMonitorDialog.4 = ຖັນ​, +ProcessMonitorDialog.5 = \ - ຄຸນ​ຄ່າ \ No newline at end of file From a4935807124004e4a396d6c59a086576dc6424bc Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:32 +0100 Subject: [PATCH 0856/1620] New translations Messages_lo.properties (English) --- .../earth/app/view/Messages_en.properties | 448 +++++++++--------- 1 file changed, 220 insertions(+), 228 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index f759c433b0..e5b9bd9e45 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,228 +1,220 @@ -AboutDialog.19=कोई समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ -AboutDialog.5=अधिक जानकारी के लिठहमारी वेबसाइट पर जाà¤à¤‚ OpenForis.org -AboutDialog.6=कà¥à¤·à¤®à¤¾ करें, à¤à¤• समसà¥à¤¯à¤¾ आपके सिसà¥à¤Ÿà¤® के मानक बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में इस लिंक को खोलने की कोशिश कर रही है. -AboutDialog.8=ठीक -AspectCode.0=उतà¥à¤¤à¤° दिशा -AspectCode.1=उतà¥à¤¤à¤°-पूरà¥à¤µ दिशा -AspectCode.2=पूरà¥à¤µ दिशा -AspectCode.3=दकà¥à¤·à¤¿à¤£-पूरà¥à¤µ दिशा -AspectCode.4=दकà¥à¤·à¤¿à¤£ दिशा -AspectCode.5=दकà¥à¤·à¤¿à¤£-पशà¥à¤šà¤¿à¤® दिशा -AspectCode.6=पशà¥à¤šà¤¿à¤® दिशा -AspectCode.7=उतà¥à¤¤à¤°-पशà¥à¤šà¤¿à¤® दिशा -CollectEarthWindow.0=तà¥à¤°à¥à¤Ÿà¤¿ जब सीà¤à¤¸à¤µà¥€ फ़ाइल में डेटा निरà¥à¤¯à¤¾à¤¤ करने का पà¥à¤°à¤¯à¤¾à¤¸ -CollectEarthWindow.1=निरà¥à¤¯à¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.10=फ़ाइल -CollectEarthWindow.11=बाहर जाà¤à¤‚ -CollectEarthWindow.12=उपकरण -CollectEarthWindow.13=डेटा सीà¤à¤¸à¤µà¥€ निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.14=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ -CollectEarthWindow.15=गà¥à¤£ -CollectEarthWindow.16=मदद -CollectEarthWindow.17=असà¥à¤µà¥€à¤•रण -CollectEarthWindow.18=डेटाबेस में लापता भूखंडों खोजें -CollectEarthWindow.19=पृथà¥à¤µà¥€ इकटà¥à¤ à¤¾ -CollectEarthWindow.2=भाषा -CollectEarthWindow.20=डà¥à¤ªà¥à¤²à¤¿à¤•ेट रिकॉरà¥à¤¡ की संखà¥à¤¯à¤¾\: -CollectEarthWindow.21=मà¥à¤–à¥à¤¯ फà¥à¤°à¥‡à¤® के लिठआइकन नहीं मिल सकता है -CollectEarthWindow.22=आपको लगता है कि आप à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ बंद करना चाहते हैं? विंडोज बंद करने से, à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° बंद हो जाà¤à¤—ा -CollectEarthWindow.23=पà¥à¤·à¥à¤Ÿà¤¿ की जरूरत है -CollectEarthWindow.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.25=आप वैसे भी इन अभिलेखों को जोड़ना चाहते हैं और अपने वरà¥à¤¤à¤®à¤¾à¤¨ डेटा खोने के लिठकिलक करना चाहते हैं? -CollectEarthWindow.26=ऑपरेटर,पà¥à¤°à¤šà¤¾à¤²à¤• -CollectEarthWindow.27=अदà¥à¤¯à¤¤à¤¨ -CollectEarthWindow.28= औपन फौरिस à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° चल रहा होना चाहिठ, जबभी ऑपरेटर डेटा की वà¥à¤¯à¤¾à¤–à¥à¤¯à¤¾ करें . -CollectEarthWindow.29=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. -CollectEarthWindow.3= आयात संबंधी तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.30=जबभी आप गà¥à¤—ल अरà¥à¤¥ का उपयोग कर रहे हैं, कृपया इस विंडोज को खà¥à¤²à¥€ बनाठरखें. -CollectEarthWindow.31=à¤à¤•तà¥à¤° डेटा सीà¤à¤¸à¤µà¥€ फाइल में भेजें -CollectEarthWindow.32=छोड़ना -CollectEarthWindow.33=ऑपरेटर का नाम के 5 अकà¥à¤·à¤° से बड़ा और 50 अकà¥à¤·à¤° से कम होना चाहिठ-CollectEarthWindow.34=मानà¥à¤¯à¤¤à¤¾ तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.35=ऑपरेटर नाम खाली\!
कृपया ऑपरेटर का नाम भरें और "अदà¥à¤¯à¤¤à¤¨" बटन दबाà¤à¤. -CollectEarthWindow.36=ऑपरेटर नाम रिकà¥à¤¤ नहीं हो सकता -CollectEarthWindow.37=खà¥à¤²à¤¾ रखो -CollectEarthWindow.38=सीà¤à¤¸à¤µà¥€ फ़ाइल -CollectEarthWindow.39=सूचना\: यह सलाह दी जाती है कि आप नठडेटा डालने करने से पहले अपने मौजूदा आंकडों को बैकअप(à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤) कर लें -CollectEarthWindow.4=à¤à¤«à¤à¤“ असà¥à¤µà¥€à¤•रण नोटिस -CollectEarthWindow.40=उस फ़ोलà¥à¤¡à¤° पर जाà¤à¤‚ जहां साà¤à¤•ॠसरà¥à¤µà¤° में सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ किया गया है, फ़ोलà¥à¤¡à¤° का रासà¥à¤¤à¤¾ उपकरण> गà¥à¤£> उनà¥à¤¨à¤¤ टैब. -CollectEarthWindow.41=निरà¥à¤¯à¤¾à¤¤ डेटा को फ़ाइल में बचाया जा रहा है \: -CollectEarthWindow.42=छोड़ना -CollectEarthWindow.43=परसà¥à¤ªà¤° विरोधी रिकॉरà¥à¤¡ पाया -CollectEarthWindow.44=डेटा आयात / निरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.45=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ डेटा (संकà¥à¤šà¤¿à¤¤) -CollectEarthWindow.46=ज़िप से नठडेटा आयात करें (संकà¥à¤šà¤¿à¤¤ à¤à¤•à¥à¤¸à¤à¤®à¤à¤²) -CollectEarthWindow.55=सीà¤à¤¸à¤µà¥€ का उपयोग कर मौजूदा रिकॉरà¥à¤¡ को अपडेट करें -CollectEarthWindow.47=साà¤à¤•ॠसरà¥à¤µà¤° कॉनà¥à¤«à¤¼à¤¿à¤—र नहीं है. -CollectEarthWindow.48=ज़िप / à¤à¤•तà¥à¤°-डेटा फ़ाइल -CollectEarthWindow.49=फà¥à¤¯à¥‚जन सीà¤à¤¸à¤µà¥€ फ़ाइल -CollectEarthWindow.5=बंद करे -CollectEarthWindow.50= उपयोगकरà¥à¤¤à¤¾ मैनà¥à¤…ल खोलें -CollectEarthWindow.51=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ के अदà¥à¤¯à¤¤à¤¨ के लिठजाà¤à¤š करें -CollectEarthWindow.52= अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— लॉग फ़ाइल खोलें -CollectEarthWindow.53=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ लॉग फ़ाइल -CollectEarthWindow.54=केà¤à¤®à¤à¤² से लोड अंक -CollectEarthWindow.56=के विषय में... -CollectEarthWindow.57=साà¤à¤•ॠसà¥à¤Ÿà¤¾à¤°à¥à¤Ÿà¤° पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ अभी भी चल रहा है, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें. -CollectEarthWindow.58=साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ शà¥à¤°à¥‚ नहीं कर सकते -CollectEarthWindow.59=आप साà¤à¤•ॠविशà¥à¤²à¥‡à¤·à¤£ के लिठडेटा सेट फिर से उतà¥à¤ªà¤¨à¥à¤¨ करने के लिठकरना चाहते हैं?
यह पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ समय लेने वाली हो सकती है.
आप यदि "हाà¤"पर कà¥à¤²à¤¿à¤• करें, तो नवीनतम जानकारी के साथ à¤à¤• नया डाटासेट उतà¥à¤ªà¤¨à¥à¤¨ हो जाà¤à¤—ा. -CollectEarthWindow.6=फà¥à¤¯à¥‚जन टेबल के लिठनिरà¥à¤¯à¤¾à¤¤ -CollectEarthWindow.60=साà¤à¤•ॠडेटा उतà¥à¤ªà¤¨à¥à¤¨ -CollectEarthWindow.61=डेटा à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठनिरà¥à¤¯à¤¾à¤¤ (पिछले निरà¥à¤¯à¤¾à¤¤ के बाद से संशोधित रिकॉरà¥à¤¡) -CollectEarthWindow.62=के विषय मे... -CollectEarthWindow.63=केà¤à¤®à¤à¤² से अंक पà¥à¤°à¤¾à¤ªà¥à¤¤ करने में तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.64=तकनीकी सहायता -CollectEarthWindow.7=डेटा आयात में तà¥à¤°à¥à¤Ÿà¤¿ -CollectEarthWindow.8=असà¥à¤µà¥€à¤•रण पाठ नहीं पाया जा सका -CollectEarthWindow.9=डेटा आयात रिकॉरà¥à¤¡ वह है जो कि पहले से ही अपने डेटाबेस पर मौजूद हैं शामिल. -DynamicsCode.0=पà¥à¤°à¤¾à¤°à¤‚भ में वन -DynamicsCode.1=पà¥à¤°à¤¾à¤°à¤‚भ में घास का मैदान, -DynamicsCode.2=पà¥à¤°à¤¾à¤°à¤‚भ में आबादी वाला इलाका -DynamicsCode.3=पà¥à¤°à¤¾à¤°à¤‚भ में बंजर -DynamicsCode.4=पà¥à¤°à¤¾à¤°à¤‚भ में आरà¥à¤¦à¥à¤° भूमि -DynamicsCode.5=पà¥à¤°à¤¾à¤°à¤‚भ में खेत -OpenTextFileListener.0=इस पाठ का फ़ाइल नहीं मिला \: -OptionWizard.0= विकलà¥à¤ª -OptionWizard.1=बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° चà¥à¤¨à¥‡à¤‚ -OptionWizard.10=बैकअप फ़ोलà¥à¤¡à¤° खोलें -OptionWizard.11=अजà¥à¤žà¤¾à¤¤\: उपयोग ifconfig -OptionWizard.12=गà¥à¤°à¤¾à¤¹à¤•ों का उलà¥à¤²à¥‡à¤– -OptionWizard.13=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° आईपी -OptionWizard.14=कतà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ (उदाहरण- 8023) -OptionWizard.15=बचाà¤à¤‚ और परिवरà¥à¤¤à¤¨ लागू करें -OptionWizard.16=आईडी -OptionWizard.17=X- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क -OptionWizard.18=Y- निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क -OptionWizard.19=उठान -OptionWizard.2=कारà¥à¤¯à¤ªà¥à¤°à¤µà¤¾à¤¹ (सरà¥à¤µà¤° / गà¥à¤°à¤¾à¤¹à¤•) -OptionWizard.20=गूगल अरà¥à¤¥ अंतरà¥à¤µà¤¸à¥à¤¤à¥ बदल दिया गया है
यदि गà¥à¤—ल अरà¥à¤¥ आप से कहे,अंतरà¥à¤µà¤¸à¥à¤¤à¥ पà¥à¤¨à¤ƒ लोड सà¥à¤µà¥€à¤•ार करें . -OptionWizard.21=अदà¥à¤¯à¤¤à¤¨ सफल -OptionWizard.22=ढाल -OptionWizard.23=गूगल अरà¥à¤¥ डेटा को फिर से खोलने में कोई तà¥à¤°à¥à¤Ÿà¤¿ थी -OptionWizard.24=रदà¥à¤¦ करना -OptionWizard.25=ऑपरेशन मोड -OptionWizard.26=डीबी होसà¥à¤Ÿ -OptionWizard.27=यह à¤à¤• मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ साà¤à¤•ॠफ़ोलà¥à¤¡à¤° नहीं है ( सà¥à¤Ÿà¤¾à¤°à¥à¤Ÿ-साà¤à¤•à¥.batफ़ाइल मौजूद नहीं है) -OptionWizard.28=साà¤à¤•ॠसरà¥à¤µà¤° मानà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ नहीं -OptionWizard.29=डीबी पोरà¥à¤Ÿ -OptionWizard.3=सरà¥à¤µà¤° आवृतà¥à¤¤à¤¿ -OptionWizard.30=à¤à¤¸à¤•à¥à¤¯à¥ लाइट विकलà¥à¤ª -OptionWizard.31=सेमà¥à¤ªà¤² डेटा -OptionWizard.32=पà¥à¤²à¥‰à¤Ÿ लेआउट -OptionWizard.33=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ परिभाषा -OptionWizard.34=विकसित -OptionWizard.35=सेमà¥à¤ªà¤² अंक की संखà¥à¤¯à¤¾ -OptionWizard.36=सेमà¥à¤ªà¤² बिंदॠके बीच दूरी (मीटर में) -OptionWizard.37=भूखंड की सीमा के साथ मारà¥à¤œà¤¿à¤¨ (मीटर मे) -OptionWizard.38=सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सही ढंग से पढ़ा नहीं जा सकता.
इस फ़ाइल में à¤à¤• अलà¥à¤ªà¤µà¤¿à¤°à¤¾à¤® से अलग मूलà¥à¤¯à¥‹à¤‚ की उमà¥à¤®à¥€à¤¦ है \:
-OptionWizard.39=आईडी, वाई समनà¥à¤µà¤¯, à¤à¤•à¥à¤¸ समनà¥à¤µà¤¯, ऊंचाई, ढाल, पहलू -OptionWizard.4=वरà¥à¤¤à¤®à¤¾à¤¨ कंपà¥à¤¯à¥‚टर आईपी \: -OptionWizard.40=परियोजनाà¤à¤‚ -OptionWizard.41=à¤à¤• नई परियोजना फ़ाइल लोड करें -OptionWizard.42=सीà¤à¤¸à¤µà¥€ पाठक को बंद करते समय तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.43=सरà¥à¤µà¥‡à¤•à¥à¤·à¤£ का नाम -OptionWizard.44= सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ बैकअप डेटाबेस -OptionWizard.45=ओपन पृथà¥à¤µà¥€ इंजन ने पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° में जूम किया -OptionWizard.46=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठपृथà¥à¤µà¥€ इंजन टाइमलैपà¥à¤¸ खोलें -OptionWizard.47=पà¥à¤²à¥‰à¤Ÿ कà¥à¤·à¥‡à¤¤à¥à¤° के लिठबिंग मैपà¥à¤¸ खोलें -OptionWizard.48=बजाय गूगल अरà¥à¤¥ के फॉरà¥à¤® à¤à¤• बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° पर खोलें (लिनकà¥à¤¸ के लिठसिफारिश) -OptionWizard.49=भूखंड डेटा के साथ सीईडी / सीà¤à¤¸à¤µà¥€ फाइल भेजने के लिठपथ -OptionWizard.5=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ सरà¥à¤µà¤° पोरà¥à¤Ÿ\: -OptionWizard.50=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.51=परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.52=केवल निरà¥à¤¦à¥‡à¤¶à¤¾à¤‚क के साथ सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल -OptionWizard.53=चौकोर -OptionWizard.54=केनà¥à¤¦à¥à¤°à¥€à¤¯ बिनà¥à¤¦à¥ -OptionWizard.55=परियोजना फ़ोलà¥à¤¡à¤° आयात तà¥à¤°à¥à¤Ÿà¤¿ -OptionWizard.56=लोड परियोजना -OptionWizard.57=पहले से लोड परियोजना -OptionWizard.58= जी ई ई का मैदान खोलें (विशà¥à¤µà¤¸à¤¨à¥€à¤¯ जांचकरà¥à¤¤à¤¾ के उपयोग की आवशà¥à¤¯à¤•ता है) -OptionWizard.59=यहां भूखंड पर केंदà¥à¤°à¤¿à¤¤ मैपà¥à¤¸ खोलें -OptionWizard.6=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² डीबी मापदंड -OptionWizard.65=साà¤à¤•à¥à¤«à¤¼à¥‹à¤²à¥à¤¡à¤° का पथ -OptionWizard.66=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.67=फ़ायरफ़ॉकà¥à¤¸ निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ -OptionWizard.68=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.7=उपयोगकरà¥à¤¤à¤¾ नाम -OptionWizard.70=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों -OptionWizard.72=बाइनरी फ़ाइलें -OptionWizard.73=कà¥à¤°à¥‹à¤® निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ के लिठपथ -OptionWizard.74=बà¥à¤°à¤¾à¤‰à¤œ -OptionWizard.76=निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯ फ़ाइलों -OptionWizard.78=बाइनरी फ़ाइलें -OptionWizard.79=केà¤à¤®à¤à¤² फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ के लिठपथ -OptionWizard.8=पासवरà¥à¤¡ -OptionWizard.80=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.82=फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ -OptionWizard.83=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ पà¥à¤°à¤ªà¤¤à¥à¤° डिज़ाइन करने के लिठपथ -OptionWizard.84=बà¥à¤°à¤¾à¤‰à¤œ..... -OptionWizard.86=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² वेब पेज -OptionWizard.87=पथ आइडीà¤à¤® परिभाषा के साथ à¤à¤•à¥à¤¸à¤à¤®à¤à¤² के लिठ-OptionWizard.88=बà¥à¤°à¤¾à¤‰à¤œ... -OptionWizard.9=डीबी नाम -OptionWizard.90=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² आइडीà¤à¤® परिभाषा -OptionWizard.91=सरà¥à¤µà¤° (पà¥à¤°à¤¬à¤‚धक संसà¥à¤•रण या खड़े अकेले का उपयोग करें) -OptionWizard.92=कà¥à¤²à¤¾à¤‡à¤‚ट (ऑपरेटर / सरà¥à¤µà¤° से जà¥à¤¡à¤¼à¥‡) -OptionWizard.93=सकà¥à¤¯à¥‚à¤à¤²à¤¾à¤‡à¤Ÿ (à¤à¤‚बेडेड / à¤à¤•ल फाइल आधारित) -OptionWizard.94=पोसà¥à¤Ÿà¤—à¥à¤°à¥‡à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² -OptionWizard.95=सेमà¥à¤ªà¤² डॉटà¥à¤¸ के साइड (मीटर में) -SaikuAnalysisListener.0=हाठ- ताज़ा साà¤à¤•ॠडेटा (लंबी पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾) -SaikuAnalysisListener.1=नहीं - बस साà¤à¤•ॠशà¥à¤°à¥‚ -SaikuStarter.1=साà¤à¤•ॠशà¥à¤°à¥‚ -SaikuStarter.2= साà¤à¤•ॠशà¥à¤°à¥‚ कà¥à¤› मिनट लग सकते हैं, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें\! -SaveEarthDataServlet.0=खाली अनà¥à¤°à¥‹à¤§ -SaveEarthDataServlet.1= डेटाबेस में डेटा बचाते समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ है -SaveEarthDataServlet.2=डेटा बचाया था -SlopeCode.0=समतल (0-5) -EarthApp.11=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ पहले से ही चल रहा है -EarthApp.21=à¤à¤• सीà¤à¤¸à¤µà¥€ / सीईडी के रूप में भूखंडों की गà¥à¤°à¤¿à¤¡ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
-EarthApp.23=कोई सीà¤à¤¸à¤µà¥€ / सीईडी फ़ाइल सेट-अप नहीं किया गया है \:

-EarthApp.24=à¤à¤•à¥à¤¸à¤à¤®à¤à¤² परिभाषा के साथ फीरीमारà¥à¤•र टेमà¥à¤ªà¤²à¥‡à¤Ÿ यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है \:
-EarthApp.26=कोई à¤à¤•à¥à¤¸à¤à¤®à¤à¤² फ़ाइल परिभाषा सेट अप नहीं किया गया है \:

-EarthApp.27=à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ रूप से यà¥à¤•à¥à¤¤ फ़ाइल चयनित पथ में नहीं पाया जाता है\:
-EarthApp.29=कोई à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² गà¥à¤¬à¥à¤¬à¤¾à¤°à¤¾ फ़ाइल सेट-अप नहीं किया गया है \:

-EarthApp.3=मà¥à¤à¥‡ बाद में याद दिलाना -EarthApp.30=उपकरण> गà¥à¤£ मेनू में फ़ाइल सà¥à¤¥à¤¾à¤¨ को ठीक करें . -EarthApp.4=अभी अदà¥à¤¯à¤¤à¤¨ करें -EarthApp.5=मà¥à¤à¥‡ दà¥à¤¬à¤¾à¤°à¤¾ याद मत दिलाना -EarthApp.57=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ का à¤à¤• नया संसà¥à¤•रण उपलबà¥à¤§ है\!
आप कैसे आगे बढ़ना चाहते हैं? -EarthApp.58=अदà¥à¤¯à¤¤à¤¨ चेतावनी -EarthApp.59= परियोजना की फाइल आयात में तà¥à¤°à¥à¤Ÿà¤¿ -EarthApp.6=\ - संसà¥à¤•रण -EarthApp.61=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ फाइल खà¥à¤² नहीं सकती .
कृपया सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करें कि गूगल अरà¥à¤¥ सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ है. -EarthSurveyService.9=आवशà¥à¤¯à¤• कà¥à¤·à¥‡à¤¤à¥à¤° -ExportActionListener.1= तारीख चूनें जबसे रिकॉरà¥à¤¡ निरà¥à¤¯à¤¾à¤¤ करने है -ExportDialogProcessMonitor.0=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... -ExportDialogProcessMonitor.1=पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ पà¥à¤°à¤¾à¤°à¤‚भ करने के लिठपà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ कर रहा है \: -ExportDialogProcessMonitor.4=निरà¥à¤¯à¤¾à¤¤ रिकॉरà¥à¤¡\: -ImportProcessMonitorDialog.0=आयातित रिकॉरà¥à¤¡ \: -ImportActionListener.0=कà¥à¤¯à¤¾ उन भूखंडों के लिठडेटा जो कि पूरी तरह से भरे नहीं गठ,आयातित किया जाना चाहिà¤? -ImportActionListener.2=आप कà¥à¤²à¤¿à¤• करें, नहींतो केवल डेटा "हरी" राजà¥à¤¯ में भूखंडों से ,जिसमें सभी डेटा यà¥à¤•à¥à¤¤ है , आयात किया जाà¤à¤—ा। -ImportDialogProcessMonitor.0=\ गणना -ImportDialogProcessMonitor.11=रिकॉरà¥à¤¡ की पà¥à¤°à¤¾à¤°à¤‚भिक संखà¥à¤¯à¤¾ \: -ImportDialogProcessMonitor.2=रिकॉरà¥à¤¡ आयात... -ImportDialogProcessMonitor.5=आयातित रिकॉरà¥à¤¡ की वासà¥à¤¤à¤µà¤¿à¤• संखà¥à¤¯à¤¾ \: -ImportDialogProcessMonitor.8=डाटा पà¥à¤°à¥‹à¤¸à¥‡à¤¸à¤¿à¤‚ग... -InfiniteProgressMonitor.0=रदà¥à¤¦ ऑपरेशन -JFileChooserExistsAware.0=à¤à¤•तà¥à¤° पृथà¥à¤µà¥€ परियोजना फ़ाइल -KmlImportService.13=पà¥à¤²à¥‰à¤Ÿ सà¥à¤¥à¤¾à¤¨à¥‹à¤‚ को बचाने के लिठà¤à¤• सीà¤à¤¸à¤µà¥€ फ़ाइल का चयन करें -MissingPlotsListener.0=तà¥à¤°à¥à¤Ÿà¤¿ उन भूखंडों के बारे में जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ करने के लिठजो डेटाबेस पर मौजूद नहीं -MissingPlotsListener.1=गà¥à¤® भूखंड -MissingPlotsListener.10=सेमà¥à¤ªà¤² डिजाइन में भूखंडों की कà¥à¤² संखà¥à¤¯à¤¾ \: -MissingPlotsListener.12=गà¥à¤® भूखंडों की संखà¥à¤¯à¤¾ \: -MissingPlotsListener.14=सभी भूखंडों भर रहे हैं\! -MissingPlotsListener.2=कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ अंतरà¥à¤µà¤¸à¥à¤¤à¥ की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ -MissingPlotsListener.3=भूखंड की जानकारी वाले फ़ाइलें चà¥à¤¨à¥‡à¤‚ ( .सीà¤à¤¸à¤µà¥€ या .सीईडी फ़ाइलें ) जिसके लिठआप जानना चाहते हैं तो सभी डेटा भर दिया गया है चाहता हूà¤. -MissingPlotsListener.4=गà¥à¤® भूखंड- जानकारी -MissingPlotsListener.5=फ़ाइल से \: -MissingPlotsListener.6=सीà¤à¤¡à¥€ फ़ाइल में निरà¥à¤¯à¤¾à¤¤ करें -ProcessMonitorDialog.1=पंकà¥à¤¤à¤¿ संखà¥à¤¯à¤¾ पर तà¥à¤°à¥à¤Ÿà¤¿ -ProcessMonitorDialog.4=, कॉलम -ProcessMonitorDialog.5=\ --मूलà¥à¤¯ -YES= हां -YES_TO_ALL=सब को हां -NO=नहीं -NO_TO_ALL=सभी को नहीं - - - +AboutDialog.19 = ບັນ​ຫາ​ເàºàºµàº” A +AboutDialog.5 = ສà»àº²â€‹àº¥àº±àºšâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹à»€àºžàºµà»ˆàº¡â€‹à»€àº•ີມ​ໄດ້​ທີ່ OpenForis.org ເວັບ​ໄຊ​ທ​໌​ຂອງ​ພວàºâ€‹à»€àº®àº»àº² +AboutDialog.6 = ຂà»â€‹à»‚ທດ​ນà»àº²â€‹, ບັນ​ຫາ​ທີ່​ເàºàºµàº”​ຂຶ້ນ​ໃນ​ຂະ​ນະ​ທີ່​ຄວາມ​ພະ​àºàº²â€‹àºàº²àº¡â€‹àº—ີ່​ຈະ​ເປີດ​àºàº²àº™â€‹à»€àºŠàº·à»ˆàº­àº¡â€‹àº•à»à»ˆâ€‹àº™àºµà»‰â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹àº¥àº°â€‹àºšàº»àºšâ€‹àº‚ອງ​ທ່ານ​ຕົວ​ທ່ອງ​ເວັບ​ຂອງ​ມາດ​ຕະ​ຖານ​. +AboutDialog.8 = Ok +AspectCode.0 = ເຫນືອ +AspectCode.1 = ວັນ​ອອàºâ€‹àºªà»ˆàº½àº‡â€‹à»€àº«àº™àº·àº­ +AspectCode.2 = ຕາ​ເວັນ​ອອຠ+AspectCode.3 = ພາàºâ€‹à»ƒàº•້​, ຕາ​ເວັນ​ອອຠ+AspectCode.4 = ໃຕ້ +AspectCode.5 = ພາàºâ€‹à»ƒàº•້​, ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ+AspectCode.6 = ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ+AspectCode.7 = ພາàºâ€‹à»€àº«àº™àº·àº­â€‹, ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ+CollectEarthWindow.0 = ໃນ​ເວ​ລາ​ທີ່​ພະ​àºàº²â€‹àºàº²àº¡â€‹à»€àºžàº·à»ˆàº­â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌ CSVຄວາມ​ຜິດ​ພາດ +CollectEarthWindow.1 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àº +CollectEarthWindow.10 File \= +CollectEarthWindow.11 ອອàºâ€‹àºˆàº²àº \= +CollectEarthWindow.12 = ເຄື່ອງ​ມືຂà»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.13 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ CSV àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ +CollectEarthWindow.14 = Start SAIKU +CollectEarthWindow.15 = ຄຸນ​ສົມ​ບັດ +CollectEarthWindow.16 = ຊ່ວàºâ€‹à»€àº«àº¼àº·àº­ +CollectEarthWindow.17 = ປະ​ຕິ​ເສດ +CollectEarthWindow.18 = ຄົ້ນ​ຫາ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ຫາàºâ€‹à»„ປ​ໃນ​ຖານ​ຂà»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.19 = ເàºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ+CollectEarthWindow.2 = ພາ​ສາ +CollectEarthWindow.20 = ຈà»àº²â€‹àº™àº§àº™â€‹àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™ duplicated​\: +CollectEarthWindow.21 = ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ຊອàºâ€‹àº«àº² icon ສà»àº²â€‹àº¥àº±àºšâ€‹àºžàº²â€‹àº•ົ້ນ​ຕ໠+CollectEarthWindow.22 = ທ່ານ​ມີ​ຄວາມ​à»àº™à»ˆâ€‹à»ƒàºˆàº§à»ˆâ€‹àº²â€‹àº—່ານ​ຕ້ອງ​àºàº²àº™â€‹àº›àº´àº”​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹? ໃນ​àºàº²àº™â€‹àº›àº´àº”​ປ່ອງ​ຢ້ຽມ​àºàº±àº‡â€‹àºˆàº°â€‹àº›àº´àº”​ເຄື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹àº‚ອງ​ໂລàºâ€‹à»„ດ້​ເàºàº±àºšâ€‹àºà»àº² +CollectEarthWindow.23 = àºàº²àº™â€‹àº¢àº±à»‰àº‡â€‹àº¢àº·àº™â€‹àº—ີ່​ຈà»àº²â€‹à»€àº›àº±àº™ +CollectEarthWindow.24 = XML ສົ່ງ​ອອຠ+CollectEarthWindow.25 = ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ເພີ່ມ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹à»€àº«àº¼àº»à»ˆàº²â€‹àº™àºµà»‰â€‹à»àº¥à»‰àº§â€‹à»àº¥àº°â€‹àºàº²àº™â€‹àºªàº¹àº™â€‹à»€àºªàºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº‚ອງ​ທ່ານ​? +CollectEarthWindow.26 = ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™ +CollectEarthWindow.27 = ປັບ​ປຸງ +CollectEarthWindow.28 = ເຮັດ​ຢູ່​ຕ່າງ​ປະ​ເທດ​ເàºàº±àºšâ€‹àºà»àº²â€‹à»€àº„ື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹àº„ວນ​ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹à»àº¥à»ˆàº™â€‹à»ƒàº™â€‹àº‚ະ​ນະ​ທີ່​ຜູ້​ປະ​àºàº­àºšâ€‹àºàº²àº™â€‹àº•ີ​ຄວາມ​ຫມາàºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹. +CollectEarthWindow.29 = The Saiku Server ບà»à»ˆâ€‹à»„ດ້​ຖືàºâ€‹àº•ັ້ງ​. +CollectEarthWindow.3 = \ ຄວາມ​ຜິດ​ພາດ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ +CollectEarthWindow.30 = àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº®àº±àºâ€‹àºªàº²â€‹àºàº²àº™â€‹à»€àº›àºµàº”​ຫນ້າ​ຕ່າງ​ນີ້​ໃນ​ຂະ​ນະ​ທີ່​ທ່ານ​àºà»àº²â€‹àº¥àº±àº‡â€‹à»ƒàºŠà»‰â€‹àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹. +CollectEarthWindow.31 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌ CSV +CollectEarthWindow.32 = ອອຠ+CollectEarthWindow.33 = ຊື່​ຜູ້​ປະ​àºàº­àºšâ€‹àºàº²àº™â€‹àºˆàº°â€‹àº•້ອງ​ມີ​àºàº²àº™â€‹àº•à»à»ˆâ€‹à»„ປ​ອີàºâ€‹à»àº¥à»‰àº§â€‹àºâ€‹à»ˆâ€‹àº§àº² 5 ລັàºâ€‹àºªàº°â€‹àº™àº°â€‹à»àº¥àº°â€‹àºªàº±à»‰àº™â€‹àºâ€‹à»ˆâ€‹àº§àº² 50ຄວາມ​ຜິດ​ພາດ +CollectEarthWindow.34 = àºàº§àº”​ສອບ +CollectEarthWindow.35 = ຜູ້​ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹àº¥àº»àºšâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™ ​\! ຫລັàºâ€‹àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº•ື່ມ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàºªà»ˆâ€‹àºŠàº·à»ˆâ€‹àºœàº¹à»‰â€‹àº›àº°â€‹àºàº­àºšâ€‹àºàº²àº™â€‹à»àº¥àº°â€‹à»ƒàº«à»‰â€‹àºàº»àº”​ປຸ່ມ "ປັບ​ປຸງ​"​. ຊື່ +CollectEarthWindow.36 = ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹àºšà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ເປົ່າ +CollectEarthWindow.37 = ຮັàºâ€‹àºªàº²â€‹àºˆàº±àº™à»„ຟລ​໌ +CollectEarthWindow.38 = CSV +CollectEarthWindow.39 à»àºˆà»‰àº‡ \= ມັນ​ເປັນ​àºàº²àº™â€‹àºªàº»àº¡â€‹àº„ວນ​ທີ່​ທ່ານ​ໄປ​ເຖິງ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº‚ອງ​ທ່ານ (àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ XML​) àºà»ˆàº­àº™â€‹àº—ີ່​ຈະ​ໄດ້​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº«àº¡à»ˆâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ +CollectEarthWindow.4 = FAO à»àºˆà»‰àº‡â€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ເສດ +CollectEarthWindow.40 = ທີ່​àºà»àº²â€‹àº™àº»àº”​ໄວ້​ຕາມ​ເສັ້ນ​ທາງ​àºàº±àºšâ€‹à»‚ຟນ​ເດີ​ທີ່ Saiku Server ໄດ້​ຖືàºâ€‹àº•ິດ​ຕັ້ງ​ຢູ່​ໃນ Tools-> Properties-> à»àº–ບ​à»àºšàºšâ€‹àºžàº´â€‹à»€àºªàº”​ໄດ້​. +CollectEarthWindow.41 = àºàº²àº™â€‹àº›àº°â€‹àº«àºàº±àº”​àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌​\: +CollectEarthWindow.42 = ອອຠ+CollectEarthWindow.43 = àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº•à»àº²â€‹àºàº±àº™â€‹àº—ີ່​ພົບ​ເຫັນ +CollectEarthWindow.44 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ / ສົ່ງ​ອອàºàº‚à»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.45 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ XML (à»àº›â€‹)ຂà»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.46 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ໃຫມ່​ຈາàºâ€‹à»„ປ​ສະ​ນີ (XML à»àº›â€‹)àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™ +CollectEarthWindow.55 ປັບ​ປຸງ \= àºàº²àº™â€‹àº™à»àº²â€‹à»ƒàºŠà»‰ CSV +CollectEarthWindow.47 = Saiku Server ບà»à»ˆâ€‹à»„ດ້​àºà»àº²â€‹àº«àº™àº»àº” +CollectEarthWindow.48 = ໄຟລ​໌​ຫັດ​ໄປ​ສະໄຟລ​໌ +CollectEarthWindow.49 = Fusion CSV +CollectEarthWindow.5 = ປິດ +CollectEarthWindow.50 = ເປີດ​ຄູ່​ມື​àºàº²àº™â€‹à»ƒàºŠà»‰àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™â€‹àº›àº±àºšâ€‹àº›àº¸àº‡â€‹àº‚ອງ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ+CollectEarthWindow.51 CHECK \= àºàº§àº”​ສອບ +CollectEarthWindow.52 = File ເຂົ້າ​ສູ່​ລະ​ບົບ​ຄà»àº²â€‹àº®à»‰àº­àº‡â€‹àºªàº°â€‹àº«àº¡àº±àºâ€‹à»€àº›àºµàº” +CollectEarthWindow.53 = àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»€àº­â€‹àºàº°â€‹àºªàº²àº™â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹à»€àº‚ົ້າ​ສູ່​ລະ​ບົບຈຸດ +CollectEarthWindow.54 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຈາຠKMLàºà»ˆàº½àº§â€‹àºàº±àºš +CollectEarthWindow.56 = ... +CollectEarthWindow.57 = ຂະ​ບວນ​àºàº²àº™â€‹à»€àº¥àºµà»ˆàº¡â€‹àº•ົ້ນ Saiku à»àº¡à»ˆàº™â€‹àºàº±àº‡â€‹à»àº¥à»ˆàº™â€‹, àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº¥à»â€‹àº–້າ​. +CollectEarthWindow.58 = ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ເລີ່ມ​ຕົ້ນ​àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ Saiku +CollectEarthWindow.59 = ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ Re​\: àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ Saiku ໄດ້​?
ຂະ​ບວນ​àºàº²àº™â€‹àº™àºµà»‰â€‹àºªàº²â€‹àº¡àº²àº”​ໃຊ້​ເວ​ລາ​ຫຼາàº
ຖ້າ​ທ່ານ​ຄລິàºâ€‹à»ƒàºªà»ˆ "à»àº¡à»ˆàº™â€‹à»àº¥à»‰àº§â€‹" ເປັນ​ຊຸດ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໃຫມ່​ທີ່​ມີ​ຄວາມ​ຫຼ້າ​ສຸດ​ໄດ້​. ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº‚ຶ້ນ​. +CollectEarthWindow.6 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ Fusion ຕາ​ຕະ​ລາງàºàº²àº™â€‹àºœàº°â€‹àº¥àº´àº”​ຂà»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.60 = Saiku +CollectEarthWindow.61 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່ XML (àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº”ັດ​à»àºà»‰â€‹àº™àº±àºšâ€‹àº•ັ້ງ​à»àº•່​àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àºªàº¸àº”​ທ້າàºâ€‹) ສົ່ງ​ອອàºàºà»ˆàº½àº§â€‹àºàº±àºš +CollectEarthWindow.62 = ... +CollectEarthWindow.63 Error \= àºàº²àº™â€‹à»„ດ້​ຮັບ​ຈຸດ​ທີ່​ໄດ້​ຈາຠKML +CollectEarthWindow.64 = ສະ​ຫນັບ​ສະ​ຫນູນ​ທາງ​ເທàºâ€‹àº™àº´àº +CollectEarthWindow.7 Error \= ໃນ​ເວ​ລາ​ທີ່​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຂà»à»‰â€‹àº¡àº¹àº™ +CollectEarthWindow.8 ຂà»à»‰â€‹àº„ວາມ​ປະ​ຕິ​ເສດ \= ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ພົບ​ເຫັນ +CollectEarthWindow.9 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໄດ້​ນà»àº²â€‹à»€àº‚ົ້າ​ມາ​ປະ​àºàº­àºšâ€‹àº”້ວàºâ€‹àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àº—ີ່​ມີ​ຢູ່​à»àº¥à»‰àº§â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚ອງ​ທ່ານ​. +DynamicsCode.0 = ປ່າ​ໄມ້​ໃນ​ເບື້ອງ​ຕົ້ນ +DynamicsCode.1 = ທົ່ງ​ຫàºà»‰àº²â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ +DynamicsCode.2 = àºàº²àº™â€‹àº•ັ້ງ​ຖິ່ນ​ຖານ​ໃນ​ເບື້ອງ​ຕົ້ນ +DynamicsCode.3 = ເບື້ອງ​ຕົ້ນ Otherland +DynamicsCode.4 = ຊຸ່ມ​ນ​້​à»àº²â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ +DynamicsCode.5 = ເບື້ອງ​ຕົ້ນ Cro​​pland +OpenTextFileListener.0 = ໄຟລ​໌​ຂà»à»‰â€‹àº„ວາມ​à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹à»„ດ້​ພົບ​ໄດ້​ທີ່​\:àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +OptionWizard.0 = ທາງ​ເລືອàºâ€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ+OptionWizard.1 = ເລືອàºâ€‹àº‚ອງ​ຕົວ​ທ່ອງ​ເວັບ +OptionWizard.10 = ໂຟ​ເດີ​ສà»àº²â€‹àº®àº­àº‡â€‹àºˆàº±àº™ +OptionWizard.11 = ບà»à»ˆâ€‹àº®àº¹à»‰â€‹àºˆàº±àºâ€‹\: àºàº²àº™â€‹àº™à»àº²â€‹à»ƒàºŠà»‰ ifconfig +OptionWizard.12 = ລູàºâ€‹àº„້າ​ຕົວ​ຢ່າງàºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +OptionWizard.13 = ໂລຠIP Serveràºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +OptionWizard.14 = port ໂລຠServer (ຕົວ​ຢ່າງ​\: 8023​) +OptionWizard.15 = ບັນ​ທຶàºâ€‹à»àº¥àº°â€‹à»ƒàºŠà»‰â€‹àºàº²àº™â€‹àº›à»ˆàº½àº™â€‹à»àº›àº‡ +OptionWizard.16 = ລະ​ຫັດ +OptionWizard.17 = X​-coord +OptionWizard.18 = Y coord​, +OptionWizard.19 = àºàº²àº™â€‹àºàº»àºâ€‹àº¥àº°â€‹àº”ັບ +OptionWizard.2 = ບວນ​àºàº²àº™â€‹à»€àº®àº±àº”​ວຽຠ(server / ລູàºâ€‹àº„້າ​) +OptionWizard.20 = ໄດ້​ເນື້ອ​ໃນ​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»„ດ້​ມີ​àºàº²àº™â€‹àº›à»ˆàº½àº™â€‹à»àº›àº‡â€‹.
àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº®àº±àºšâ€‹à»‚ຫລດ​ເນື້ອ​ຫາ​ໃນ​ເວ​ລາ​ທີ່​ທ່ານ​àºà»àº²â€‹àº¥àº±àº‡â€‹àº®àº±àºšâ€‹àºàº²àº™â€‹àºàº°â€‹àº•ຸ້ນ​ໂດàºâ€‹àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹. +OptionWizard.21 = ປັບ​ປຸງ​ສົບ​ຜົນ​ສà»àº²â€‹à»€àº¥àº±àº” +OptionWizard.22 = ຄ້ອຠ+OptionWizard.23 = ມີ​ຄວາມ​ຜິດ​ພາດ​ໃນ​ເວ​ລາ Re​\: ເປີດ​ໄດ້​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»€àº›àº±àº™â€‹à»„ດ້àºàº»àºâ€‹à»€àº¥àºµàºâ€‹àºàº²àº™ +OptionWizard.24 = àºàº»àºà»€àº¥àºµàºàºàº²àº™ +OptionWizard.25 = ຮູບ​à»àºšàºšâ€‹àºàº²àº™â€‹àº”à»àº²â€‹à»€àº™àºµàº™â€‹àº‡àº²àº™ +OptionWizard.26 = àºàº²àº™â€‹à»€àº›àº±àº™â€‹à»€àºˆàº»à»‰àº²â€‹àºžàº²àºš DB +OptionWizard.27 = ນີ້​ບà»à»ˆâ€‹à»„ດ້​ເປັນ​ທີ່​àºàº­àº¡â€‹àº®àº±àºš Saiku Folder (ເອ​àºàº°â€‹àºªàº²àº™â€‹à»€àº¥àºµà»ˆàº¡ saiku.bat ບà»à»ˆâ€‹à»àº¡à»ˆàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹) +OptionWizard.28 = Saiku Server ບà»à»ˆâ€‹àº®àº­àº‡â€‹àº®àº±àºš +OptionWizard.29 = ພ໠DB +OptionWizard.3 = Server ຕົວ​ຢ່າງ +OptionWizard.30 = ທາງ​ເລືອຠSQLite +OptionWizard.31 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº•ົວ​ຢ່າງ +OptionWizard.32 = ຮູບ​à»àºšàºšâ€‹àº”ິນ​ຕອນ +OptionWizard.33 = ສà»àº²â€‹àº«àº¼àº§àº”​ນຸ​àºàº»àº¡ +OptionWizard.34 = à»àºšàºšâ€‹àºžàº´â€‹à»€àºªàº” +OptionWizard.35 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ຈຸດ​ຕົວ​ຢ່າງ +OptionWizard.36 = ໄລ​àºàº°â€‹àº—າງ​ລະ​ຫວ່າງ​ຈຸດ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àº•ົວ​ຢ່າງ (ໃນ​ຕາ​) +OptionWizard.37 = ອັດ​ຕາ​ທີ່​ມີ​ຊາàºâ€‹à»àº”ນ​ດິນ​ຕອນ (à»àº¡àº±àº”​) +OptionWizard.38 = ໄຟລ​໌ CSV / CED ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ອ່ານ​ໄດ້​ຢ່າງ​ຖືàºâ€‹àº•້ອງ
ເອ​àºàº°â€‹àºªàº²àº™â€‹à»„ດ້​ຖືàºâ€‹àº„າດ​ວ່າ​ຈະ​ມີ​ມູນ​ຄ່າ​àºàº²àº™â€‹à»àºàºâ€‹àºˆàº¸â€‹àº¥àº°â€‹àºžàº²àºâ€‹à»€àºŠàº±à»ˆàº™â€‹àº™àºµà»‰â€‹\:​.
+OptionWizard.39 = ລະ​ຫັດ​, YCoordinate​, XCoordinate​, ພູ​, ລັàºâ€‹àºªàº°â€‹àº™àº° +OptionWizard.4 = IP ຄອມ​ພິວ​ເຕີ​ປັດ​ຈຸ​ບັນ​\: +OptionWizard.40 = ໂຄງ​àºàº²àº™ +OptionWizard.41 = ໂຫຼດ​ໄຟລ​໌​ໂຄງ​àºàº²àº™â€‹à»ƒàº«àº¡à»ˆ +OptionWizard.42 = ຜິດ​ພາດ​ໃນ​ເວ​ລາ​ປິດ​àºàº²àº™â€‹àº­à»ˆàº²àº™ CSV +OptionWizard.43 = ຊື່​ຂອງ​àºàº²àº™â€‹àºªà»àº²â€‹àº«àº¼àº§àº” +OptionWizard.44 = ຖານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ປ​ໃຫ້​ເຖິງ​ອັດ​ຕະ​ໂນ​ມັດ​ທີ່ +OptionWizard.45 = Open Earth Engine ຊູມ​ເຂົ້າ​ໄປ​ໃນ​ເຂດ​ຕອນ​ດິນ​ຂອງ​ຕົນ +OptionWizard.46 = timelapse ຈັàºâ€‹à»€àº›àºµàº”​ໂລàºâ€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºžàº·à»‰àº™â€‹àº—ີ່​ຕອນ​ດິນ​ຂອງ​ຕົນ +OptionWizard.47 = Open à»àºœàº™ Bing ສà»àº²â€‹àº¥àº±àºšâ€‹àºžàº·à»‰àº™â€‹àº—ີ່​ຕອນ​ດິນ​ຂອງ​ຕົນ +OptionWizard.48 = ຮູບ​à»àºšàºšâ€‹à»€àº›àºµàº”​ໃນ​ຕົວ​ທ່ອງ​ເວັບ​ຂອງ​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»„ດ້ (à»àº™àº°â€‹àº™à»àº²â€‹à»ƒàº«à»‰â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™ LINUX​) +OptionWizard.49 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™ Ced / csv ໄຟລ​໌​ທີ່​ມີ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº•ອນ​ດິນ​ຂອງ​ຕົນàºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +OptionWizard.5 = port ໂລຠServer​\: +OptionWizard.50 = Browse ... +OptionWizard.51 = ເອ​àºàº°â€‹àºªàº²àº™â€‹à»‚ຄງ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຜິດ​ພາດ +OptionWizard.52 = CSV / ເອ​àºàº°â€‹àºªàº²àº™ Ced ມີ​àºàº²àº™â€‹àº›àº°â€‹àºªàº²àº™â€‹àº‡àº²àº™â€‹à»€àº—ົ່າ​ນັ້ນ +OptionWizard.54 = ຈຸດ​ສູນ​àºàº²àº‡ +OptionWizard.55 = Error ໂຟນ​ເດີ​ໂຄງ​àºàº²àº™â€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ +OptionWizard.56 = ໂຄງ​àºàº²àº™ Load +OptionWizard.57 = ໂຄງ​àºàº²àº™ loaded àºà»ˆàº­àº™â€‹àº«àº™à»‰àº²â€‹àº™àºµà»‰ +OptionWizard.58 = Open GEE Code Editor (ຮຽàºâ€‹àº®à»‰àº­àº‡â€‹à»ƒàº«à»‰â€‹àº¡àºµâ€‹àºàº²àº™â€‹à»€àº‚ົ້າ​ເຖິງ Tester Trusted​) +OptionWizard.59 = Open ທີ່​ນີ້​à»àºœàº™â€‹àº—ີ່​ສຸມ​ໃສ່​ຕອນ​ດິນ​ຂອງ​ຕົນ +OptionWizard.6 = ຕົວ​àºà»àº²â€‹àº™àº»àº”​àºàº²àº™ PostgreSQL DB +OptionWizard.65 = ເສັ້ນ​ທາງ​àºàº±àºšâ€‹à»‚ຟນ​ເດີ​ທີ່ Saiku +OptionWizard.66 = Browse ... +OptionWizard.67 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ບັດ​àºàº²àº™ Firefox +OptionWizard.68 = Browse ... +OptionWizard.7 = ຊື່​ຜູ້​ໃຊ້ +OptionWizard.70 = àºàº²àº™â€‹àºšà»â€‹àº¥àº´â€‹àº«àº²àº™â€‹à»„ຟ +OptionWizard.72 = ໄຟລ​໌​ຖານ​ສອງ +OptionWizard.73 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ບັດ​àºàº²àº™ Chrome +OptionWizard.74 = Browse ... +OptionWizard.76 = àºàº²àº™â€‹àºšà»â€‹àº¥àº´â€‹àº«àº²àº™â€‹à»„ຟ +OptionWizard.78 = ໄຟລ​໌​ຖານ​ສອງ +OptionWizard.79 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹à»àºšàºš KML Freemarker +OptionWizard.8 = ລະ​ຫັດ​ຜ່ານ +OptionWizard.80 = Browse ... +OptionWizard.82 = à»àº¡à»ˆâ€‹à»àºšàºš Freemarker +OptionWizard.83 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº­àº­àºâ€‹à»àºšàºšâ€‹àº®àº¹àºšâ€‹à»àºšàºš HTML ປູມ​ເປົ້າ +OptionWizard.84 = Browse ... +OptionWizard.86 = HTML webpage +OptionWizard.87 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™ XML àºàº±àºšâ€‹àº„à»àº²â€‹àº™àº´â€‹àºàº²àº¡ IDM +OptionWizard.88 = Browse ... +OptionWizard.9 = ຊື່ DB +OptionWizard.90 = ຫມາຠIDM XML +OptionWizard.91 = Server (ສະ​ບັບ​ຜູ້​ຈັດ​àºàº²àº™â€‹àº«àº¼àº·â€‹àº¢àº·àº™â€‹àº¢àº¹à»ˆâ€‹àº„ົນ​ດຽວ​ໃຊ້​) +OptionWizard.92 = ລູàºâ€‹àº„້າ (ປະ​ຕິ​ບັດ​àºàº²àº™ / àºàº²àº™â€‹à»€àºŠàº·à»ˆàº­àº¡â€‹àº•à»à»ˆâ€‹àºàº±àºšâ€‹à»€àº„ື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹) +OptionWizard.93 = SQLite (à»àºšàºšâ€‹àºàº±àº‡ / ໄຟລ​໌​ດຽວ​ຕາມ​) +OptionWizard.94 = PostgreSQL +SaikuAnalysisListener.0 = à»àº¡à»ˆàº™ - ຂà»à»‰â€‹àº¡àº¹àº™ Refresh Saiku (ຂະ​ບວນ​àºàº²àº™â€‹àºàº²àº§â€‹) +SaikuAnalysisListener.1 = ບà»à»ˆ - ພຽງ​à»àº•່​ເລີ່ມ​ຕົ້ນ Saiku +SaikuStarter.1 = ເລີ່ມ Saiku +SaikuStarter.2 = u0EC0ລີ່ມ Saiku ສາ​ມາດ​ໃຊ້​ເວ​ລາ​ນາ​ທີ \= àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº¥à»â€‹àº–້າ ​\! +SaveEarthDataServlet.0 = àºàº²àº™â€‹àº®à»‰àº­àº‡â€‹àº‚à»â€‹à»€àº›àº»à»ˆàº² +SaveEarthDataServlet.1 = ບັນ​ຫາ​ທີ່​ເàºàºµàº”​ຂຶ້ນ​ໃນ​ຂະ​ນະ​ທີ່​ປະ​ຢັດ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ດ້ +SaveEarthDataServlet.2 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໄດ້​ບັນ​ທືຠ+SlopeCode.0 = ລຽບ (0-5​)àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +EarthApp.11 = ໃນ​ທົ່ວ​ໂລàºâ€‹à»àº¡à»ˆàº™â€‹à»àº¥à»‰àº§â€‹à»àº¥à»ˆàº™ +EarthApp.21 = ໄຟ​ທີ່​ມີ​ຕາ​ຂ່າàºâ€‹à»„ຟ​ຟ້າ​ຂອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ເປັນ CSV / CED à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹àºžàº»àºšâ€‹à»€àº«àº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹à»€àºªàº±à»‰àº™â€‹àº—າງ​ທີ່​ເລືອàºâ€‹\:
+EarthApp.23 = ບà»à»ˆâ€‹à»„ຟລ​໌ CSV / CED ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

+EarthApp.24 = ໄຟ​ທີ່​ມີ​à»àº¡à»ˆâ€‹à»àºšàºš Freemarker ທີ່​ມີ​ຄà»àº²â€‹àº™àº´â€‹àºàº²àº¡ KML ບà»à»ˆâ€‹à»„ດ້​ພົບ​ເຫັນ​ຢູ່​ໃນ​ເສັ້ນ​ທາງ​ທີ່​ເລືອàºâ€‹\:
+EarthApp.26 = ບà»à»ˆâ€‹à»„ຟລ​໌​ຄà»àº²â€‹àº™àº´â€‹àºàº²àº¡ KML ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

+EarthApp.27 = ໄຟ​ທີ່​ມີ​ຮູບ​à»àºšàºšâ€‹àº›àº¹àº¡â€‹à»€àº›àº»à»‰àº² HTML ໄດ້​à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹àºžàº»àºšâ€‹à»€àº«àº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹à»€àºªàº±à»‰àº™â€‹àº—າງ​ທີ່​ເລືອàºâ€‹\:
+EarthApp.29 = ບà»à»ˆâ€‹à»„ຟລ​໌​ປູມ​ເປົ້າ HTML ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

+EarthApp.3 = ເຕືອນ​ຂ້ອàºâ€‹àº•à»à»ˆâ€‹àº¡àº² +EarthApp.30 = àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹à»àºà»‰â€‹à»„ຂ​ສະ​ຖານ​ທີ່​ໄຟລ​໌​ຢູ່​ໃນ​ເມ​ນູ Tools-> Properties​. +EarthApp.4 = àºàº²àº™â€‹àº›àº±àºšâ€‹àº›àº¸àº‡â€‹à»ƒàº™â€‹àº›àº±àº”​ຈຸ​ບັນ +EarthApp.5 = ຢ່າ​ເຕືອນ​ຂ້າ​ພະ​ເຈົ້າ​ອີàºâ€‹à»€àº—ື່ອ​ຫນຶ່ງ +EarthApp.57 = ມີ​ສະ​ບັບ​ໃຫມ່​ຂອງ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹àº—ີ່​ມີ à»àº¡à»ˆàº™â€‹\!
ທ່ານ​ບà»à»ˆâ€‹àº•້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹? ເຕືອນ +EarthApp.58 = ປັບ​ປຸງ +EarthApp.59 Error \= ໃນ​ເວ​ລາ​ທີ່​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ເອ​àºàº°â€‹àºªàº²àº™â€‹à»‚ຄງ​àºàº²àº™ +EarthApp.6 = \ - ສະ​ບັບ +EarthApp.61 = ເອ​àºàº°â€‹àºªàº²àº™â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹à»„ດ້​ເàºàº±àºšâ€‹àºà»àº²â€‹àºšà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ຈະ​ເປີດ​ເຜີàºâ€‹.
àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹à»€àº®àº±àº”​ໃຫ້​à»àº™à»ˆâ€‹à»ƒàºˆàº§à»ˆâ€‹àº²â€‹àº—ີ່​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»àº¡à»ˆàº™â€‹àºàº²àº™â€‹àº•ິດ​ຕັ້ງ​. +EarthSurveyService.9 = ພາàºâ€‹àºªàº°â€‹àº«àº™àº²àº¡â€‹àº—ີ່​ຕ້ອງ​àºàº²àº™à»€àº­àº»àº² +ExportActionListener.1 = ວັນ​ທີ່​ຈະ​ບັນ​ທຶàºâ€‹àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àºˆàº²àºàº‚à»à»‰â€‹àº¡àº¹àº™ +ExportDialogProcessMonitor.0 àºàº²àº™â€‹àº›àº¸àº‡â€‹à»àº•່ງ \= ... +ExportDialogProcessMonitor.1 = ລà»â€‹àº–້າ​ທີ່​ຈະ​ເລີ່ມ​ຕົ້ນ​ຂະ​ບວນ​àºàº²àº™â€‹\:àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àº +ExportDialogProcessMonitor.4 =​\: +ImportProcessMonitorDialog.0 = àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​\: +ImportActionListener.0 = ຄວນ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àº—ີ່​ດິນ​ທີ່​ບà»à»ˆâ€‹à»„ດ້​ຮັບ​àºàº²àº™â€‹à»€àº•ີມ​ລົງ​ໄປ​ໃນ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ໄດ້ +ImportActionListener.2 = ຖ້າ​ທ່ານ​ຄລິàºâ€‹à»ƒàºªà»ˆ ບà»à»ˆ ພຽງ​à»àº•່​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºˆàº²àºâ€‹àºžàº²àºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ຢູ່​ໃນ​ສະ​ພາບ "ສີ​ຂຽວ​"​, ທີ່​ບັນ​ຈຸ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ັງ​ຫມົດ​ໄດ້​, ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​. +ImportActionListener.3 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ບັນ​ທຶàºâ€‹àº—າງ​àºàº²àº™â€‹àºªà»àº²â€‹à»€àº¥àº±àº”​ຮູບ +ImportDialogProcessMonitor.0 = \ ຄິດ​ໄລ່ +ImportDialogProcessMonitor.11 = ຈà»àº²â€‹àº™àº§àº™â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ​ຂອງ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹\: +ImportDialogProcessMonitor.2 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ບັນ​ທຶàºâ€‹àºàº²àº™ ... +ImportDialogProcessMonitor.5 = ຈ​à»â€‹àº²â€‹àº™àº§àº™â€‹àº•ົວ​ຈິງ​ຂອງ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​\:ຂà»à»‰â€‹àº¡àº¹àº™ +ImportDialogProcessMonitor.8 àºàº²àº™â€‹àº›àº¸àº‡â€‹à»àº•່ງ \= ... +InfiniteProgressMonitor.0 = àºàº»àºâ€‹à»€àº¥àºµàºâ€‹àºàº²àº™â€‹àº”à»àº²â€‹à»€àº™àºµàº™â€‹àº‡àº²àº™àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² +JFileChooserExistsAware.0 = file ໂລàºâ€‹à»‚ຄງ​àºàº²àº™ +KmlImportService.13 = ເລືອàºâ€‹à»„ຟລ​໌ CSV ເພື່ອ​ຊ່ວàºâ€‹àº›àº°â€‹àº¢àº±àº”​ສະ​ຖານ​ຕອນ​ດິນ​ຂອງ​ຕົນ​ເພື່ອ +MissingPlotsListener.0 Error \= ໃນ​ຂະ​ນະ​ທີ່​àºàº²àº™â€‹à»„ດ້​ຮັບ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àº—ີ່​ດິນ​ບà»à»ˆâ€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ດ້ +MissingPlotsListener.1 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ໄປ +MissingPlotsListener.10 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ໃນ​àºàº²àº™â€‹àº­àº­àºâ€‹à»àºšàºšâ€‹àºªàº¸à»ˆàº¡â€‹àº•ົວ​ຢ່າງ​\: +MissingPlotsListener.12 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ຫາàºâ€‹à»„ປ​\: +MissingPlotsListener.14 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທັງ​ຫມົດ​à»àº¡à»ˆàº™â€‹à»„ດ້​ເຕີມ​ລົງ​ໄປ ​\!ເນື້ອ​ໃນ +MissingPlotsListener.2 = ຄັດ​ລອàºâ€‹à»„ປ​ທີ່ clipboardເອົາ +MissingPlotsListener.3 = ໄຟລ​໌​ທີ່​ບັນ​ຈຸ​ມີ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ສານ​ຕອນ​ດິນ​ຂອງ​ຕົນ (.csv ຫຼື​ໄຟລ​໌ .ced​) ສà»àº²â€‹àº¥àº±àºšâ€‹àº—ີ່​ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ຮູ້​ວ່າ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ັງ​ຫມົດ​ໄດ້​ຮັບ​àºàº²àº™â€‹à»€àº•ີມ​ລົງ​ໄປ​. +MissingPlotsListener.4 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຫາàºâ€‹à»„ປ - ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ສານ +MissingPlotsListener.5 = ຈາàºâ€‹à»„ຟ​\: +MissingPlotsListener.6 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ​ໄຟລ​໌ CED +ProcessMonitorDialog.1 = ຂà»à»‰â€‹àºœàº´àº”​ພາດ Parsing àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àºˆà»àº²â€‹àº™àº§àº™â€‹àºàº²àº™â€‹àº•ິດ​ຕà»à»ˆâ€‹àºàº±àº™ +ProcessMonitorDialog.4 = ຖັນ​, +ProcessMonitorDialog.5 = \ - ຄຸນ​ຄ່າ \ No newline at end of file From 3b3e2f3d42f243858935855108d04f0a68dfa8c6 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:33 +0100 Subject: [PATCH 0857/1620] New translations Messages_mn.properties (French) --- .../earth/app/view/Messages_fr.properties | 436 +++++++++--------- 1 file changed, 217 insertions(+), 219 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index e5b9bd9e45..7531b1f880 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,220 +1,218 @@ -AboutDialog.19 = ບັນ​ຫາ​ເàºàºµàº” A -AboutDialog.5 = ສà»àº²â€‹àº¥àº±àºšâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹à»€àºžàºµà»ˆàº¡â€‹à»€àº•ີມ​ໄດ້​ທີ່ OpenForis.org ເວັບ​ໄຊ​ທ​໌​ຂອງ​ພວàºâ€‹à»€àº®àº»àº² -AboutDialog.6 = ຂà»â€‹à»‚ທດ​ນà»àº²â€‹, ບັນ​ຫາ​ທີ່​ເàºàºµàº”​ຂຶ້ນ​ໃນ​ຂະ​ນະ​ທີ່​ຄວາມ​ພະ​àºàº²â€‹àºàº²àº¡â€‹àº—ີ່​ຈະ​ເປີດ​àºàº²àº™â€‹à»€àºŠàº·à»ˆàº­àº¡â€‹àº•à»à»ˆâ€‹àº™àºµà»‰â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹àº¥àº°â€‹àºšàº»àºšâ€‹àº‚ອງ​ທ່ານ​ຕົວ​ທ່ອງ​ເວັບ​ຂອງ​ມາດ​ຕະ​ຖານ​. -AboutDialog.8 = Ok -AspectCode.0 = ເຫນືອ -AspectCode.1 = ວັນ​ອອàºâ€‹àºªà»ˆàº½àº‡â€‹à»€àº«àº™àº·àº­ -AspectCode.2 = ຕາ​ເວັນ​ອອຠ-AspectCode.3 = ພາàºâ€‹à»ƒàº•້​, ຕາ​ເວັນ​ອອຠ-AspectCode.4 = ໃຕ້ -AspectCode.5 = ພາàºâ€‹à»ƒàº•້​, ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ-AspectCode.6 = ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ-AspectCode.7 = ພາàºâ€‹à»€àº«àº™àº·àº­â€‹, ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ-CollectEarthWindow.0 = ໃນ​ເວ​ລາ​ທີ່​ພະ​àºàº²â€‹àºàº²àº¡â€‹à»€àºžàº·à»ˆàº­â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌ CSVຄວາມ​ຜິດ​ພາດ -CollectEarthWindow.1 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àº -CollectEarthWindow.10 File \= -CollectEarthWindow.11 ອອàºâ€‹àºˆàº²àº \= -CollectEarthWindow.12 = ເຄື່ອງ​ມືຂà»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.13 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ CSV àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ -CollectEarthWindow.14 = Start SAIKU -CollectEarthWindow.15 = ຄຸນ​ສົມ​ບັດ -CollectEarthWindow.16 = ຊ່ວàºâ€‹à»€àº«àº¼àº·àº­ -CollectEarthWindow.17 = ປະ​ຕິ​ເສດ -CollectEarthWindow.18 = ຄົ້ນ​ຫາ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ຫາàºâ€‹à»„ປ​ໃນ​ຖານ​ຂà»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.19 = ເàºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ-CollectEarthWindow.2 = ພາ​ສາ -CollectEarthWindow.20 = ຈà»àº²â€‹àº™àº§àº™â€‹àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™ duplicated​\: -CollectEarthWindow.21 = ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ຊອàºâ€‹àº«àº² icon ສà»àº²â€‹àº¥àº±àºšâ€‹àºžàº²â€‹àº•ົ້ນ​ຕ໠-CollectEarthWindow.22 = ທ່ານ​ມີ​ຄວາມ​à»àº™à»ˆâ€‹à»ƒàºˆàº§à»ˆâ€‹àº²â€‹àº—່ານ​ຕ້ອງ​àºàº²àº™â€‹àº›àº´àº”​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹? ໃນ​àºàº²àº™â€‹àº›àº´àº”​ປ່ອງ​ຢ້ຽມ​àºàº±àº‡â€‹àºˆàº°â€‹àº›àº´àº”​ເຄື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹àº‚ອງ​ໂລàºâ€‹à»„ດ້​ເàºàº±àºšâ€‹àºà»àº² -CollectEarthWindow.23 = àºàº²àº™â€‹àº¢àº±à»‰àº‡â€‹àº¢àº·àº™â€‹àº—ີ່​ຈà»àº²â€‹à»€àº›àº±àº™ -CollectEarthWindow.24 = XML ສົ່ງ​ອອຠ-CollectEarthWindow.25 = ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ເພີ່ມ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹à»€àº«àº¼àº»à»ˆàº²â€‹àº™àºµà»‰â€‹à»àº¥à»‰àº§â€‹à»àº¥àº°â€‹àºàº²àº™â€‹àºªàº¹àº™â€‹à»€àºªàºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº‚ອງ​ທ່ານ​? -CollectEarthWindow.26 = ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™ -CollectEarthWindow.27 = ປັບ​ປຸງ -CollectEarthWindow.28 = ເຮັດ​ຢູ່​ຕ່າງ​ປະ​ເທດ​ເàºàº±àºšâ€‹àºà»àº²â€‹à»€àº„ື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹àº„ວນ​ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹à»àº¥à»ˆàº™â€‹à»ƒàº™â€‹àº‚ະ​ນະ​ທີ່​ຜູ້​ປະ​àºàº­àºšâ€‹àºàº²àº™â€‹àº•ີ​ຄວາມ​ຫມາàºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹. -CollectEarthWindow.29 = The Saiku Server ບà»à»ˆâ€‹à»„ດ້​ຖືàºâ€‹àº•ັ້ງ​. -CollectEarthWindow.3 = \ ຄວາມ​ຜິດ​ພາດ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ -CollectEarthWindow.30 = àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº®àº±àºâ€‹àºªàº²â€‹àºàº²àº™â€‹à»€àº›àºµàº”​ຫນ້າ​ຕ່າງ​ນີ້​ໃນ​ຂະ​ນະ​ທີ່​ທ່ານ​àºà»àº²â€‹àº¥àº±àº‡â€‹à»ƒàºŠà»‰â€‹àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹. -CollectEarthWindow.31 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌ CSV -CollectEarthWindow.32 = ອອຠ-CollectEarthWindow.33 = ຊື່​ຜູ້​ປະ​àºàº­àºšâ€‹àºàº²àº™â€‹àºˆàº°â€‹àº•້ອງ​ມີ​àºàº²àº™â€‹àº•à»à»ˆâ€‹à»„ປ​ອີàºâ€‹à»àº¥à»‰àº§â€‹àºâ€‹à»ˆâ€‹àº§àº² 5 ລັàºâ€‹àºªàº°â€‹àº™àº°â€‹à»àº¥àº°â€‹àºªàº±à»‰àº™â€‹àºâ€‹à»ˆâ€‹àº§àº² 50ຄວາມ​ຜິດ​ພາດ -CollectEarthWindow.34 = àºàº§àº”​ສອບ -CollectEarthWindow.35 = ຜູ້​ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹àº¥àº»àºšâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™ ​\! ຫລັàºâ€‹àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº•ື່ມ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàºªà»ˆâ€‹àºŠàº·à»ˆâ€‹àºœàº¹à»‰â€‹àº›àº°â€‹àºàº­àºšâ€‹àºàº²àº™â€‹à»àº¥àº°â€‹à»ƒàº«à»‰â€‹àºàº»àº”​ປຸ່ມ "ປັບ​ປຸງ​"​. ຊື່ -CollectEarthWindow.36 = ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹àºšà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ເປົ່າ -CollectEarthWindow.37 = ຮັàºâ€‹àºªàº²â€‹àºˆàº±àº™à»„ຟລ​໌ -CollectEarthWindow.38 = CSV -CollectEarthWindow.39 à»àºˆà»‰àº‡ \= ມັນ​ເປັນ​àºàº²àº™â€‹àºªàº»àº¡â€‹àº„ວນ​ທີ່​ທ່ານ​ໄປ​ເຖິງ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº‚ອງ​ທ່ານ (àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ XML​) àºà»ˆàº­àº™â€‹àº—ີ່​ຈະ​ໄດ້​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº«àº¡à»ˆâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ -CollectEarthWindow.4 = FAO à»àºˆà»‰àº‡â€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ເສດ -CollectEarthWindow.40 = ທີ່​àºà»àº²â€‹àº™àº»àº”​ໄວ້​ຕາມ​ເສັ້ນ​ທາງ​àºàº±àºšâ€‹à»‚ຟນ​ເດີ​ທີ່ Saiku Server ໄດ້​ຖືàºâ€‹àº•ິດ​ຕັ້ງ​ຢູ່​ໃນ Tools-> Properties-> à»àº–ບ​à»àºšàºšâ€‹àºžàº´â€‹à»€àºªàº”​ໄດ້​. -CollectEarthWindow.41 = àºàº²àº™â€‹àº›àº°â€‹àº«àºàº±àº”​àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌​\: -CollectEarthWindow.42 = ອອຠ-CollectEarthWindow.43 = àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº•à»àº²â€‹àºàº±àº™â€‹àº—ີ່​ພົບ​ເຫັນ -CollectEarthWindow.44 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ / ສົ່ງ​ອອàºàº‚à»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.45 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ XML (à»àº›â€‹)ຂà»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.46 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ໃຫມ່​ຈາàºâ€‹à»„ປ​ສະ​ນີ (XML à»àº›â€‹)àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™ -CollectEarthWindow.55 ປັບ​ປຸງ \= àºàº²àº™â€‹àº™à»àº²â€‹à»ƒàºŠà»‰ CSV -CollectEarthWindow.47 = Saiku Server ບà»à»ˆâ€‹à»„ດ້​àºà»àº²â€‹àº«àº™àº»àº” -CollectEarthWindow.48 = ໄຟລ​໌​ຫັດ​ໄປ​ສະໄຟລ​໌ -CollectEarthWindow.49 = Fusion CSV -CollectEarthWindow.5 = ປິດ -CollectEarthWindow.50 = ເປີດ​ຄູ່​ມື​àºàº²àº™â€‹à»ƒàºŠà»‰àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™â€‹àº›àº±àºšâ€‹àº›àº¸àº‡â€‹àº‚ອງ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ-CollectEarthWindow.51 CHECK \= àºàº§àº”​ສອບ -CollectEarthWindow.52 = File ເຂົ້າ​ສູ່​ລະ​ບົບ​ຄà»àº²â€‹àº®à»‰àº­àº‡â€‹àºªàº°â€‹àº«àº¡àº±àºâ€‹à»€àº›àºµàº” -CollectEarthWindow.53 = àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»€àº­â€‹àºàº°â€‹àºªàº²àº™â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹à»€àº‚ົ້າ​ສູ່​ລະ​ບົບຈຸດ -CollectEarthWindow.54 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຈາຠKMLàºà»ˆàº½àº§â€‹àºàº±àºš -CollectEarthWindow.56 = ... -CollectEarthWindow.57 = ຂະ​ບວນ​àºàº²àº™â€‹à»€àº¥àºµà»ˆàº¡â€‹àº•ົ້ນ Saiku à»àº¡à»ˆàº™â€‹àºàº±àº‡â€‹à»àº¥à»ˆàº™â€‹, àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº¥à»â€‹àº–້າ​. -CollectEarthWindow.58 = ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ເລີ່ມ​ຕົ້ນ​àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ Saiku -CollectEarthWindow.59 = ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ Re​\: àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ Saiku ໄດ້​?
ຂະ​ບວນ​àºàº²àº™â€‹àº™àºµà»‰â€‹àºªàº²â€‹àº¡àº²àº”​ໃຊ້​ເວ​ລາ​ຫຼາàº
ຖ້າ​ທ່ານ​ຄລິàºâ€‹à»ƒàºªà»ˆ "à»àº¡à»ˆàº™â€‹à»àº¥à»‰àº§â€‹" ເປັນ​ຊຸດ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໃຫມ່​ທີ່​ມີ​ຄວາມ​ຫຼ້າ​ສຸດ​ໄດ້​. ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº‚ຶ້ນ​. -CollectEarthWindow.6 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ Fusion ຕາ​ຕະ​ລາງàºàº²àº™â€‹àºœàº°â€‹àº¥àº´àº”​ຂà»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.60 = Saiku -CollectEarthWindow.61 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່ XML (àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº”ັດ​à»àºà»‰â€‹àº™àº±àºšâ€‹àº•ັ້ງ​à»àº•່​àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àºªàº¸àº”​ທ້າàºâ€‹) ສົ່ງ​ອອàºàºà»ˆàº½àº§â€‹àºàº±àºš -CollectEarthWindow.62 = ... -CollectEarthWindow.63 Error \= àºàº²àº™â€‹à»„ດ້​ຮັບ​ຈຸດ​ທີ່​ໄດ້​ຈາຠKML -CollectEarthWindow.64 = ສະ​ຫນັບ​ສະ​ຫນູນ​ທາງ​ເທàºâ€‹àº™àº´àº -CollectEarthWindow.7 Error \= ໃນ​ເວ​ລາ​ທີ່​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຂà»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.8 ຂà»à»‰â€‹àº„ວາມ​ປະ​ຕິ​ເສດ \= ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ພົບ​ເຫັນ -CollectEarthWindow.9 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໄດ້​ນà»àº²â€‹à»€àº‚ົ້າ​ມາ​ປະ​àºàº­àºšâ€‹àº”້ວàºâ€‹àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àº—ີ່​ມີ​ຢູ່​à»àº¥à»‰àº§â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚ອງ​ທ່ານ​. -DynamicsCode.0 = ປ່າ​ໄມ້​ໃນ​ເບື້ອງ​ຕົ້ນ -DynamicsCode.1 = ທົ່ງ​ຫàºà»‰àº²â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ -DynamicsCode.2 = àºàº²àº™â€‹àº•ັ້ງ​ຖິ່ນ​ຖານ​ໃນ​ເບື້ອງ​ຕົ້ນ -DynamicsCode.3 = ເບື້ອງ​ຕົ້ນ Otherland -DynamicsCode.4 = ຊຸ່ມ​ນ​້​à»àº²â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ -DynamicsCode.5 = ເບື້ອງ​ຕົ້ນ Cro​​pland -OpenTextFileListener.0 = ໄຟລ​໌​ຂà»à»‰â€‹àº„ວາມ​à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹à»„ດ້​ພົບ​ໄດ້​ທີ່​\:àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -OptionWizard.0 = ທາງ​ເລືອàºâ€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ-OptionWizard.1 = ເລືອàºâ€‹àº‚ອງ​ຕົວ​ທ່ອງ​ເວັບ -OptionWizard.10 = ໂຟ​ເດີ​ສà»àº²â€‹àº®àº­àº‡â€‹àºˆàº±àº™ -OptionWizard.11 = ບà»à»ˆâ€‹àº®àº¹à»‰â€‹àºˆàº±àºâ€‹\: àºàº²àº™â€‹àº™à»àº²â€‹à»ƒàºŠà»‰ ifconfig -OptionWizard.12 = ລູàºâ€‹àº„້າ​ຕົວ​ຢ່າງàºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -OptionWizard.13 = ໂລຠIP Serveràºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -OptionWizard.14 = port ໂລຠServer (ຕົວ​ຢ່າງ​\: 8023​) -OptionWizard.15 = ບັນ​ທຶàºâ€‹à»àº¥àº°â€‹à»ƒàºŠà»‰â€‹àºàº²àº™â€‹àº›à»ˆàº½àº™â€‹à»àº›àº‡ -OptionWizard.16 = ລະ​ຫັດ -OptionWizard.17 = X​-coord -OptionWizard.18 = Y coord​, -OptionWizard.19 = àºàº²àº™â€‹àºàº»àºâ€‹àº¥àº°â€‹àº”ັບ -OptionWizard.2 = ບວນ​àºàº²àº™â€‹à»€àº®àº±àº”​ວຽຠ(server / ລູàºâ€‹àº„້າ​) -OptionWizard.20 = ໄດ້​ເນື້ອ​ໃນ​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»„ດ້​ມີ​àºàº²àº™â€‹àº›à»ˆàº½àº™â€‹à»àº›àº‡â€‹.
àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº®àº±àºšâ€‹à»‚ຫລດ​ເນື້ອ​ຫາ​ໃນ​ເວ​ລາ​ທີ່​ທ່ານ​àºà»àº²â€‹àº¥àº±àº‡â€‹àº®àº±àºšâ€‹àºàº²àº™â€‹àºàº°â€‹àº•ຸ້ນ​ໂດàºâ€‹àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹. -OptionWizard.21 = ປັບ​ປຸງ​ສົບ​ຜົນ​ສà»àº²â€‹à»€àº¥àº±àº” -OptionWizard.22 = ຄ້ອຠ-OptionWizard.23 = ມີ​ຄວາມ​ຜິດ​ພາດ​ໃນ​ເວ​ລາ Re​\: ເປີດ​ໄດ້​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»€àº›àº±àº™â€‹à»„ດ້àºàº»àºâ€‹à»€àº¥àºµàºâ€‹àºàº²àº™ -OptionWizard.24 = àºàº»àºà»€àº¥àºµàºàºàº²àº™ -OptionWizard.25 = ຮູບ​à»àºšàºšâ€‹àºàº²àº™â€‹àº”à»àº²â€‹à»€àº™àºµàº™â€‹àº‡àº²àº™ -OptionWizard.26 = àºàº²àº™â€‹à»€àº›àº±àº™â€‹à»€àºˆàº»à»‰àº²â€‹àºžàº²àºš DB -OptionWizard.27 = ນີ້​ບà»à»ˆâ€‹à»„ດ້​ເປັນ​ທີ່​àºàº­àº¡â€‹àº®àº±àºš Saiku Folder (ເອ​àºàº°â€‹àºªàº²àº™â€‹à»€àº¥àºµà»ˆàº¡ saiku.bat ບà»à»ˆâ€‹à»àº¡à»ˆàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹) -OptionWizard.28 = Saiku Server ບà»à»ˆâ€‹àº®àº­àº‡â€‹àº®àº±àºš -OptionWizard.29 = ພ໠DB -OptionWizard.3 = Server ຕົວ​ຢ່າງ -OptionWizard.30 = ທາງ​ເລືອຠSQLite -OptionWizard.31 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº•ົວ​ຢ່າງ -OptionWizard.32 = ຮູບ​à»àºšàºšâ€‹àº”ິນ​ຕອນ -OptionWizard.33 = ສà»àº²â€‹àº«àº¼àº§àº”​ນຸ​àºàº»àº¡ -OptionWizard.34 = à»àºšàºšâ€‹àºžàº´â€‹à»€àºªàº” -OptionWizard.35 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ຈຸດ​ຕົວ​ຢ່າງ -OptionWizard.36 = ໄລ​àºàº°â€‹àº—າງ​ລະ​ຫວ່າງ​ຈຸດ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àº•ົວ​ຢ່າງ (ໃນ​ຕາ​) -OptionWizard.37 = ອັດ​ຕາ​ທີ່​ມີ​ຊາàºâ€‹à»àº”ນ​ດິນ​ຕອນ (à»àº¡àº±àº”​) -OptionWizard.38 = ໄຟລ​໌ CSV / CED ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ອ່ານ​ໄດ້​ຢ່າງ​ຖືàºâ€‹àº•້ອງ
ເອ​àºàº°â€‹àºªàº²àº™â€‹à»„ດ້​ຖືàºâ€‹àº„າດ​ວ່າ​ຈະ​ມີ​ມູນ​ຄ່າ​àºàº²àº™â€‹à»àºàºâ€‹àºˆàº¸â€‹àº¥àº°â€‹àºžàº²àºâ€‹à»€àºŠàº±à»ˆàº™â€‹àº™àºµà»‰â€‹\:​.
-OptionWizard.39 = ລະ​ຫັດ​, YCoordinate​, XCoordinate​, ພູ​, ລັàºâ€‹àºªàº°â€‹àº™àº° -OptionWizard.4 = IP ຄອມ​ພິວ​ເຕີ​ປັດ​ຈຸ​ບັນ​\: -OptionWizard.40 = ໂຄງ​àºàº²àº™ -OptionWizard.41 = ໂຫຼດ​ໄຟລ​໌​ໂຄງ​àºàº²àº™â€‹à»ƒàº«àº¡à»ˆ -OptionWizard.42 = ຜິດ​ພາດ​ໃນ​ເວ​ລາ​ປິດ​àºàº²àº™â€‹àº­à»ˆàº²àº™ CSV -OptionWizard.43 = ຊື່​ຂອງ​àºàº²àº™â€‹àºªà»àº²â€‹àº«àº¼àº§àº” -OptionWizard.44 = ຖານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ປ​ໃຫ້​ເຖິງ​ອັດ​ຕະ​ໂນ​ມັດ​ທີ່ -OptionWizard.45 = Open Earth Engine ຊູມ​ເຂົ້າ​ໄປ​ໃນ​ເຂດ​ຕອນ​ດິນ​ຂອງ​ຕົນ -OptionWizard.46 = timelapse ຈັàºâ€‹à»€àº›àºµàº”​ໂລàºâ€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºžàº·à»‰àº™â€‹àº—ີ່​ຕອນ​ດິນ​ຂອງ​ຕົນ -OptionWizard.47 = Open à»àºœàº™ Bing ສà»àº²â€‹àº¥àº±àºšâ€‹àºžàº·à»‰àº™â€‹àº—ີ່​ຕອນ​ດິນ​ຂອງ​ຕົນ -OptionWizard.48 = ຮູບ​à»àºšàºšâ€‹à»€àº›àºµàº”​ໃນ​ຕົວ​ທ່ອງ​ເວັບ​ຂອງ​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»„ດ້ (à»àº™àº°â€‹àº™à»àº²â€‹à»ƒàº«à»‰â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™ LINUX​) -OptionWizard.49 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™ Ced / csv ໄຟລ​໌​ທີ່​ມີ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº•ອນ​ດິນ​ຂອງ​ຕົນàºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -OptionWizard.5 = port ໂລຠServer​\: -OptionWizard.50 = Browse ... -OptionWizard.51 = ເອ​àºàº°â€‹àºªàº²àº™â€‹à»‚ຄງ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຜິດ​ພາດ -OptionWizard.52 = CSV / ເອ​àºàº°â€‹àºªàº²àº™ Ced ມີ​àºàº²àº™â€‹àº›àº°â€‹àºªàº²àº™â€‹àº‡àº²àº™â€‹à»€àº—ົ່າ​ນັ້ນ -OptionWizard.54 = ຈຸດ​ສູນ​àºàº²àº‡ -OptionWizard.55 = Error ໂຟນ​ເດີ​ໂຄງ​àºàº²àº™â€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ -OptionWizard.56 = ໂຄງ​àºàº²àº™ Load -OptionWizard.57 = ໂຄງ​àºàº²àº™ loaded àºà»ˆàº­àº™â€‹àº«àº™à»‰àº²â€‹àº™àºµà»‰ -OptionWizard.58 = Open GEE Code Editor (ຮຽàºâ€‹àº®à»‰àº­àº‡â€‹à»ƒàº«à»‰â€‹àº¡àºµâ€‹àºàº²àº™â€‹à»€àº‚ົ້າ​ເຖິງ Tester Trusted​) -OptionWizard.59 = Open ທີ່​ນີ້​à»àºœàº™â€‹àº—ີ່​ສຸມ​ໃສ່​ຕອນ​ດິນ​ຂອງ​ຕົນ -OptionWizard.6 = ຕົວ​àºà»àº²â€‹àº™àº»àº”​àºàº²àº™ PostgreSQL DB -OptionWizard.65 = ເສັ້ນ​ທາງ​àºàº±àºšâ€‹à»‚ຟນ​ເດີ​ທີ່ Saiku -OptionWizard.66 = Browse ... -OptionWizard.67 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ບັດ​àºàº²àº™ Firefox -OptionWizard.68 = Browse ... -OptionWizard.7 = ຊື່​ຜູ້​ໃຊ້ -OptionWizard.70 = àºàº²àº™â€‹àºšà»â€‹àº¥àº´â€‹àº«àº²àº™â€‹à»„ຟ -OptionWizard.72 = ໄຟລ​໌​ຖານ​ສອງ -OptionWizard.73 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ບັດ​àºàº²àº™ Chrome -OptionWizard.74 = Browse ... -OptionWizard.76 = àºàº²àº™â€‹àºšà»â€‹àº¥àº´â€‹àº«àº²àº™â€‹à»„ຟ -OptionWizard.78 = ໄຟລ​໌​ຖານ​ສອງ -OptionWizard.79 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹à»àºšàºš KML Freemarker -OptionWizard.8 = ລະ​ຫັດ​ຜ່ານ -OptionWizard.80 = Browse ... -OptionWizard.82 = à»àº¡à»ˆâ€‹à»àºšàºš Freemarker -OptionWizard.83 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº­àº­àºâ€‹à»àºšàºšâ€‹àº®àº¹àºšâ€‹à»àºšàºš HTML ປູມ​ເປົ້າ -OptionWizard.84 = Browse ... -OptionWizard.86 = HTML webpage -OptionWizard.87 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™ XML àºàº±àºšâ€‹àº„à»àº²â€‹àº™àº´â€‹àºàº²àº¡ IDM -OptionWizard.88 = Browse ... -OptionWizard.9 = ຊື່ DB -OptionWizard.90 = ຫມາຠIDM XML -OptionWizard.91 = Server (ສະ​ບັບ​ຜູ້​ຈັດ​àºàº²àº™â€‹àº«àº¼àº·â€‹àº¢àº·àº™â€‹àº¢àº¹à»ˆâ€‹àº„ົນ​ດຽວ​ໃຊ້​) -OptionWizard.92 = ລູàºâ€‹àº„້າ (ປະ​ຕິ​ບັດ​àºàº²àº™ / àºàº²àº™â€‹à»€àºŠàº·à»ˆàº­àº¡â€‹àº•à»à»ˆâ€‹àºàº±àºšâ€‹à»€àº„ື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹) -OptionWizard.93 = SQLite (à»àºšàºšâ€‹àºàº±àº‡ / ໄຟລ​໌​ດຽວ​ຕາມ​) +AboutDialog.19 = гарÑан нь аÑуудлыг +AboutDialog.5 = ДÑлгÑÑ€Ñнгүй мÑдÑÑллийг манай вÑб OpenForis.org очиж +AboutDialog.6 = Уучлаарай, аÑуудал нь таны ÑиÑтемийн Ñтандарт браузер ÑÐ½Ñ Ñ…Ð¾Ð»Ð±Ð¾Ð¾Ñыг нÑÑÑ… гÑж оролдож гарлаа. +AboutDialog.8 = Ок +AspectCode.0 = Хойд +AspectCode.1 = Зүүн Хойд +AspectCode.2 = Зүүн +AspectCode.3 = Зүүн-Өмнөд +AspectCode.4 = Өмнөд +AspectCode.5 = Баруун-Өмнөд +AspectCode.6 = Баруун +AspectCode.7 = Баруун Хойд +CollectEarthWindow.0 = CSV файл уруу өгөгдөл ÑкÑпортлох оролдож алдаа +CollectEarthWindow.1 = ЭкÑпортын алдаа +CollectEarthWindow.10 = Файлын +CollectEarthWindow.11 = Exit +CollectEarthWindow.12 Ñ…ÑÑ€ÑгÑÑл \= +CollectEarthWindow.13 = ЭкÑпортын CSV өгөгдөл +CollectEarthWindow.14 = Start SAIKU дүн шинжилгÑÑ +CollectEarthWindow.15 = Үл хөдлөх хөрөнгө +CollectEarthWindow.16 = туÑламж +CollectEarthWindow.17 = Disclaimer +CollectEarthWindow.18 = мÑдÑÑллийн Ñанд Ñураггүй алга газраа хай +CollectEarthWindow.19 = дÑлхийг цуглуулах +CollectEarthWindow.2 = Ñ…Ñл +CollectEarthWindow.20 = давхардÑан тоогоор бүртгÑлийн тоо\: +CollectEarthWindow.21 = гол хүрÑÑ Ð´Ò¯Ñ€Ñийг олж чадахгүй байна +CollectEarthWindow.22 = Ð¥ÑÑ€Ñв та цуглуулж дÑлхийг хаах Ñ…Ò¯ÑÑж байгаа гÑдÑгт итгÑлтÑй байна уу? Цонхыг хаах нь цуглуулж ДÑлхий Ñервер хаах болно
+CollectEarthWindow.23 = батлах Ñ…ÑÑ€ÑгтÑй +CollectEarthWindow.24 = XML ЭкÑпортын +CollectEarthWindow.25 = Та Ñмар ч байÑан ÑдгÑÑÑ€ бүртгÑлийг нÑмÑÑ…, таны одоогийн мÑдÑÑллийг алдах Ñ…Ò¯ÑÑж байна уу? +CollectEarthWindow.26 = Оператор +CollectEarthWindow.27 = шинÑчлÑÑ… +CollectEarthWindow.28 = <б> ÐÑÑлттÑй Foris оператор мÑдÑÑллийг хөрвүүлÑн ойлгох бол ДÑлхий Ñервер ажиллаж байх Ñ‘Ñтой цуглуулна. +CollectEarthWindow.29 = Saiku Ñерверийг тохируулаагүй байна. +CollectEarthWindow.3 = \ Импорт алдаа +CollectEarthWindow.30 = Та Google Earth ашиглаж байгаа бол ÑÐ½Ñ Ñ†Ð¾Ð½Ñ… нÑÑлттÑй байлгах уу. +CollectEarthWindow.31 = ЭкÑпортын CSV файлд мÑдÑÑллийг цуглуулÑан +CollectEarthWindow.32 = Quit +CollectEarthWindow.33 = операторын нÑÑ€ 5 Ñ‚ÑмдÑгтүүд болон 50 богино бодвол илүү урт байх Ñ‘Ñтой +CollectEarthWindow.34 = Баталгаажуулалт алдаа +CollectEarthWindow.35 = OPERATOR нÑÑ€ хооÑон \! Зар операторын нÑÑ€ бөглөх болон "шинÑчлÑÑ…" товчийг дарна уу. +CollectEarthWindow.36 = Оператор нÑÑ€ хооÑон байж болохгүй +CollectEarthWindow.37 = нÑÑлттÑй байлга +CollectEarthWindow.38 = CSV файлууд +CollectEarthWindow.39 = Ðнхааруулга\: Ð­Ð½Ñ Ð½ÑŒ зүйтÑй та нөөцлөх-ап таны одоогийн өгөгдөл (XML нь ЭкÑпортын) ÑˆÐ¸Ð½Ñ Ð¼ÑдÑÑллийг импортлогч өмнө +CollectEarthWindow.4 = ÐҮБ-ын ХХÐÐБ Disclaimer зар +CollectEarthWindow.40 Тодорхой хүртÑл \= Saiku Server Ð¥ÑÑ€ÑгÑÑл цÑÑÑн дотрооÑ> баÑлагт> ÐарийвчилÑан таб-д ÑуулгаÑан байна Ñ…Ð°Ð²Ñ‚Ð°Ñ Ð·Ð°Ð¼Ñ‹Ð³. +CollectEarthWindow.41 = Хадгаламж файл уруу өгөгдөл ÑкÑпортолÑон\: +CollectEarthWindow.42 = Quit +CollectEarthWindow.43 = ЗөрчилтÑй бүртгÑл олдлоо +CollectEarthWindow.44 = МÑдÑÑллийн Импорт / ЭкÑпортын +XML гÑж CollectEarthWindow.45 \= ЭкÑпортын мÑдÑÑ (шахÑан) +Zip-Ð°Ð°Ñ CollectEarthWindow.46 \= Импортын ÑˆÐ¸Ð½Ñ Ð¼ÑдÑÑ (шахÑан XML) +CSV ашиглан CollectEarthWindow.55 \= шинÑчлÑÑ… одоогийн бүртгÑл +CollectEarthWindow.47 = Saiku Ñерверийг тохируулаагүй бол +CollectEarthWindow.48 = Zip / цуглуулах-өгөгдлийн файлууд +CollectEarthWindow.49 = Fusion CSV файлууд +CollectEarthWindow.5 = Хаах +CollectEarthWindow.50 = ÐÑÑлттÑй Ñ…ÑÑ€ÑглÑгчийн гарын авлага +Цуглуулж дÑлхийн шинÑчлÑлтүүдийн хувьд CollectEarthWindow.51 \= шалгах +CollectEarthWindow.52 = ÐÑÑлттÑй Application нÑвтрÑÑ… Файлын +CollectEarthWindow.53 = цуглуулах ДÑлхий нÑвтрÑÑ… файл +KML нь CollectEarthWindow.54 \= ачааллын оноо +CollectEarthWindow.56 = тухай ... +CollectEarthWindow.57 = Saiku гарааны үйл Ñвц одоо ч ажиллаж байгаа, түр хүлÑÑÐ½Ñ Ò¯Ò¯. +CollectEarthWindow.58 = Saiku шинжилгÑÑг Ñхлүүлж чадахгүй +CollectEarthWindow.59 = Ð¥ÑÑ€Ñв та Saiku дүн шинжилгÑÑ Ñ…Ð¸Ð¹Ñ… мÑдÑÑллийн Ñанг дахин бий болгох Ñ…Ò¯ÑÑж байна уу?
Ð­Ð½Ñ Ò¯Ð¹Ð» Ñвц нь цаг хугацаа шаардÑан ажил байж болох юм.
Та хамгийн Ñүүлийн үеийн нь "YES" ÑˆÐ¸Ð½Ñ Ð´Ð°Ñ‚Ð°Ñетийн дÑÑÑ€ товшино уу мÑдÑÑллийг бий болно. +Fusion Ð¥Ò¯ÑнÑгт нь CollectEarthWindow.6 \= ЭкÑпортын +CollectEarthWindow.60 = Saiku мÑдÑÑ Ò¯ÐµÐ¸Ð¹Ð½ +CollectEarthWindow.61 = ЭкÑпортын XML өгөгдөл (Ñүүлийн ÑкÑпортын хойш өөрчлөгдÑөн бүртгÑл) +CollectEarthWindow.62 = тухай ... +CollectEarthWindow.63 = Ðлдаа KML авÑан оноо авах +CollectEarthWindow.64 = техникийн дÑмжлÑг үзүүлÑÑ… +CollectEarthWindow.7 = алдаа мÑдÑÑлÑл импортлох +CollectEarthWindow.8 = Disclaimer текÑÑ‚ олж чадахгүй байна +CollectEarthWindow.9 = оруулÑан мÑдÑÑллийг өөрийн мÑдÑÑллийн Ñанд нь байгаа бичлÑгийг агуулж байдаг. +DynamicsCode.0 = ЭхлÑÑд ой +DynamicsCode.1 = ЭхлÑÑд БÑлчÑÑрийн +DynamicsCode.2 = ЭхлÑÑд шийдвÑрлÑÑ… +DynamicsCode.3 = ЭхлÑÑд Otherland +DynamicsCode.4 = ЭхлÑÑд Ð£Ñ Ð½Ð°Ð¼Ð³Ð°Ñ€Ñ…Ð°Ð³ газрын +DynamicsCode.5 = ЭхлÑÑд Тариалангийн +OpenTextFileListener.0 = текÑÑ‚ файл олж байÑан юм\: +OptionWizard.0 = ДÑлхий Ñонголт цуглуулах +OptionWizard.1 = Хөтөч Ñонгоно уу +OptionWizard.10 = ÐÑÑлттÑй нөөц Ñ…Ð°Ð²Ñ‚Ð°Ñ +OptionWizard.11 = Тодорхойгүй\: ашиглах ifconfig +OptionWizard.12 = Ð¥ÑÑ€ÑглÑгч шатны +OptionWizard.13 = ДÑлхий Server IP цуглуулах +OptionWizard.14 = ДÑлхий Server портыг (жишÑÑ Ð½ÑŒ\: 8023) цуглуулах +OptionWizard.15 = Save & өөрчлөлт хийх +OptionWizard.16 = ID +OptionWizard.17 = X-coord +OptionWizard.18 = Y-coord +OptionWizard.19 = Elevation +OptionWizard.2 = урÑгал даÑгалын (Ñервер / үйлчлүүлÑгч) + OptionWizard.20 \= Google Earth агуулга нь өөрчлөгдÑөн байна.
Ðгуулга нь ачаалах хүлÑÑн авна уу та Google Earth-ÑÑÑ Ð°Ñуух үед. +OptionWizard.21 = шинÑчлÑÑ… амжилттай +OptionWizard.22 = Ð¥Ñвгий +OptionWizard.23 = дахин нÑÑÑ… Google Earth мÑдÑÑллийг үед алдаа гарлаа +OptionWizard.24 = Болих +OptionWizard.25 = үйл ажиллагааны горим +OptionWizard.26 = DB хоÑÑ‚ +OptionWizard.27 = Ð­Ð½Ñ Ð½ÑŒ хүлÑÑн зөвшөөрөгдÑөн Saiku Folder (ÑхлÑÑ… saiku.bat файл байхгүй бол) ороогүй байна +OptionWizard.28 = Saiku Server хүлÑÑн зөвшөөрөөгүй +OptionWizard.29 = DB порт +OptionWizard.3 = Server шатны +OptionWizard.30 = SQLite Ñонголт +OptionWizard.31 = ЖишÑÑ Ð¼ÑдÑÑлÑл +OptionWizard.32 = Plot зохион байгуулалт +OptionWizard.33 = Ñудалгаа тодорхойлолт +OptionWizard.34 = ÐарийвчилÑан +OptionWizard.35 = түүвÑÑ€ цÑгийн тоо +OptionWizard.36 = (метр) дÑÑж авах цÑгийн хоорондох зай +(Метр) ДÑÑж авах цÑгүүд OptionWizard.95 \= Side +OptionWizard.38 = CSV / CED файлыг зөв уншиж чадахгүй байгаа файлыг
иймÑрхүү таÑлалаар туÑгаарлаж утгыг байх төлөвтÑй байна\:.
<Б> +OptionWizard.39 = ID, YCoordinate, XCoordinate, өндрийн, налуу, тал +OptionWizard.4 = Одоогийн компьютерийн IP\: +OptionWizard.40 = төÑлүүд +OptionWizard.41 = ÑˆÐ¸Ð½Ñ Ñ‚Ó©Ñөл файлыг ачаалж +OptionWizard.42 = Ðлдаа CSV уншигч хаах +Судалгааны OptionWizard.43 \= нÑÑ€ +OptionWizard.44 = автоматаар нөөцлөх хүртÑл өгөгдлийн Ñан дÑÑÑ€ +OptionWizard.45 = ÐÑÑлттÑй Earth Engine талбай талбай руу томруулÑан +талбай мÑдÑÑлÑл / CSV файлыг ced нь OptionWizard.49 \= зам +Харин Google Earth-ийн браузер дÑÑÑ€ OptionWizard.48 \= ÐÑÑлттÑй Ñ…ÑлбÑÑ€ (ЛинукÑд зориулÑан байлгахыг зөвлөдөг) +OptionWizard.5 = цуглуулах ДÑлхий Server портыг\: +OptionWizard.50 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.51 = Ðлдаа импортлох төÑөл файл +Зөвхөн координат нь OptionWizard.52 \= CSV / CED файл +OptionWizard.53 = талбай +OptionWizard.54 = Төв цÑг нь +OptionWizard.55 = Ðлдаа импортлох төÑөл Ñ…Ð°Ð²Ñ‚Ð°Ñ +OptionWizard.56 = ачааллын төÑөл +OptionWizard.57 = Өмнө нь дуудагддаг төÑөл +OptionWizard.58 = ÐÑÑлттÑй Gee тоглоомын талбай (Trusted Tester хандах шаардлагатай) +OptionWizard.59 = ÐÑÑлттÑй Энд Maps газар дÑÑÑ€ анхаарлаа хандуулж +OptionWizard.6 = PostgreSQL DB параметрүүд +OptionWizard.65 = Saiku хавтÑанд зам +OptionWizard.66 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.67 = Firefox гүйцÑтгÑгдÑÑ… нь зам +OptionWizard.68 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.7 = Ð¥ÑÑ€ÑглÑгчийн нÑÑ€ +OptionWizard.70 = гүйцÑтгÑгдÑÑ… файлууд +OptionWizard.72 = Хоёртын файлууд +OptionWizard.73 = Chrome гүйцÑтгÑгдÑÑ… нь зам +OptionWizard.74 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.76 = гүйцÑтгÑгдÑÑ… файлууд +OptionWizard.78 = Хоёртын файлууд +OptionWizard.79 = KML Freemarker загварт зам +OptionWizard.8 = Ðууц үг +OptionWizard.80 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.82 = Freemarker загвар +OptionWizard.83 = HTML бөмбөлөг Ñ…ÑлбÑÑ€ дизайн зам +OptionWizard.84 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.86 = HTML вÑб Ñ…ÑƒÑƒÐ´Ð°Ñ +OptionWizard.87 = IDM тодорхойлолт нь XML нь зам +OptionWizard.88 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.9 = DB нÑÑ€ +OptionWizard.90 = XML IDM тодорхойлолт +OptionWizard.91 = Server (менежер хувилбар, ÑÑвÑл дангаараа ашиглах нь) +OptionWizard.92 = Ð¥ÑÑ€ÑглÑгч (оператор / Ñервер уруу холбогдÑон) +OptionWizard.93 = SQLite (Embedded / нÑг файл дÑÑÑ€ тулгуурлаÑан) OptionWizard.94 = PostgreSQL -SaikuAnalysisListener.0 = à»àº¡à»ˆàº™ - ຂà»à»‰â€‹àº¡àº¹àº™ Refresh Saiku (ຂະ​ບວນ​àºàº²àº™â€‹àºàº²àº§â€‹) -SaikuAnalysisListener.1 = ບà»à»ˆ - ພຽງ​à»àº•່​ເລີ່ມ​ຕົ້ນ Saiku -SaikuStarter.1 = ເລີ່ມ Saiku -SaikuStarter.2 = u0EC0ລີ່ມ Saiku ສາ​ມາດ​ໃຊ້​ເວ​ລາ​ນາ​ທີ \= àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº¥à»â€‹àº–້າ ​\! -SaveEarthDataServlet.0 = àºàº²àº™â€‹àº®à»‰àº­àº‡â€‹àº‚à»â€‹à»€àº›àº»à»ˆàº² -SaveEarthDataServlet.1 = ບັນ​ຫາ​ທີ່​ເàºàºµàº”​ຂຶ້ນ​ໃນ​ຂະ​ນະ​ທີ່​ປະ​ຢັດ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ດ້ -SaveEarthDataServlet.2 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໄດ້​ບັນ​ທືຠ-SlopeCode.0 = ລຽບ (0-5​)àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -EarthApp.11 = ໃນ​ທົ່ວ​ໂລàºâ€‹à»àº¡à»ˆàº™â€‹à»àº¥à»‰àº§â€‹à»àº¥à»ˆàº™ -EarthApp.21 = ໄຟ​ທີ່​ມີ​ຕາ​ຂ່າàºâ€‹à»„ຟ​ຟ້າ​ຂອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ເປັນ CSV / CED à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹àºžàº»àºšâ€‹à»€àº«àº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹à»€àºªàº±à»‰àº™â€‹àº—າງ​ທີ່​ເລືອàºâ€‹\:
-EarthApp.23 = ບà»à»ˆâ€‹à»„ຟລ​໌ CSV / CED ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

-EarthApp.24 = ໄຟ​ທີ່​ມີ​à»àº¡à»ˆâ€‹à»àºšàºš Freemarker ທີ່​ມີ​ຄà»àº²â€‹àº™àº´â€‹àºàº²àº¡ KML ບà»à»ˆâ€‹à»„ດ້​ພົບ​ເຫັນ​ຢູ່​ໃນ​ເສັ້ນ​ທາງ​ທີ່​ເລືອàºâ€‹\:
-EarthApp.26 = ບà»à»ˆâ€‹à»„ຟລ​໌​ຄà»àº²â€‹àº™àº´â€‹àºàº²àº¡ KML ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

-EarthApp.27 = ໄຟ​ທີ່​ມີ​ຮູບ​à»àºšàºšâ€‹àº›àº¹àº¡â€‹à»€àº›àº»à»‰àº² HTML ໄດ້​à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹àºžàº»àºšâ€‹à»€àº«àº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹à»€àºªàº±à»‰àº™â€‹àº—າງ​ທີ່​ເລືອàºâ€‹\:
-EarthApp.29 = ບà»à»ˆâ€‹à»„ຟລ​໌​ປູມ​ເປົ້າ HTML ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

-EarthApp.3 = ເຕືອນ​ຂ້ອàºâ€‹àº•à»à»ˆâ€‹àº¡àº² -EarthApp.30 = àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹à»àºà»‰â€‹à»„ຂ​ສະ​ຖານ​ທີ່​ໄຟລ​໌​ຢູ່​ໃນ​ເມ​ນູ Tools-> Properties​. -EarthApp.4 = àºàº²àº™â€‹àº›àº±àºšâ€‹àº›àº¸àº‡â€‹à»ƒàº™â€‹àº›àº±àº”​ຈຸ​ບັນ -EarthApp.5 = ຢ່າ​ເຕືອນ​ຂ້າ​ພະ​ເຈົ້າ​ອີàºâ€‹à»€àº—ື່ອ​ຫນຶ່ງ -EarthApp.57 = ມີ​ສະ​ບັບ​ໃຫມ່​ຂອງ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹àº—ີ່​ມີ à»àº¡à»ˆàº™â€‹\!
ທ່ານ​ບà»à»ˆâ€‹àº•້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹? ເຕືອນ -EarthApp.58 = ປັບ​ປຸງ -EarthApp.59 Error \= ໃນ​ເວ​ລາ​ທີ່​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ເອ​àºàº°â€‹àºªàº²àº™â€‹à»‚ຄງ​àºàº²àº™ -EarthApp.6 = \ - ສະ​ບັບ -EarthApp.61 = ເອ​àºàº°â€‹àºªàº²àº™â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹à»„ດ້​ເàºàº±àºšâ€‹àºà»àº²â€‹àºšà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ຈະ​ເປີດ​ເຜີàºâ€‹.
àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹à»€àº®àº±àº”​ໃຫ້​à»àº™à»ˆâ€‹à»ƒàºˆàº§à»ˆâ€‹àº²â€‹àº—ີ່​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»àº¡à»ˆàº™â€‹àºàº²àº™â€‹àº•ິດ​ຕັ້ງ​. -EarthSurveyService.9 = ພາàºâ€‹àºªàº°â€‹àº«àº™àº²àº¡â€‹àº—ີ່​ຕ້ອງ​àºàº²àº™à»€àº­àº»àº² -ExportActionListener.1 = ວັນ​ທີ່​ຈະ​ບັນ​ທຶàºâ€‹àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àºˆàº²àºàº‚à»à»‰â€‹àº¡àº¹àº™ -ExportDialogProcessMonitor.0 àºàº²àº™â€‹àº›àº¸àº‡â€‹à»àº•່ງ \= ... -ExportDialogProcessMonitor.1 = ລà»â€‹àº–້າ​ທີ່​ຈະ​ເລີ່ມ​ຕົ້ນ​ຂະ​ບວນ​àºàº²àº™â€‹\:àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àº -ExportDialogProcessMonitor.4 =​\: -ImportProcessMonitorDialog.0 = àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​\: -ImportActionListener.0 = ຄວນ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àº—ີ່​ດິນ​ທີ່​ບà»à»ˆâ€‹à»„ດ້​ຮັບ​àºàº²àº™â€‹à»€àº•ີມ​ລົງ​ໄປ​ໃນ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ໄດ້ -ImportActionListener.2 = ຖ້າ​ທ່ານ​ຄລິàºâ€‹à»ƒàºªà»ˆ ບà»à»ˆ ພຽງ​à»àº•່​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºˆàº²àºâ€‹àºžàº²àºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ຢູ່​ໃນ​ສະ​ພາບ "ສີ​ຂຽວ​"​, ທີ່​ບັນ​ຈຸ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ັງ​ຫມົດ​ໄດ້​, ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​. -ImportActionListener.3 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ບັນ​ທຶàºâ€‹àº—າງ​àºàº²àº™â€‹àºªà»àº²â€‹à»€àº¥àº±àº”​ຮູບ -ImportDialogProcessMonitor.0 = \ ຄິດ​ໄລ່ -ImportDialogProcessMonitor.11 = ຈà»àº²â€‹àº™àº§àº™â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ​ຂອງ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹\: -ImportDialogProcessMonitor.2 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ບັນ​ທຶàºâ€‹àºàº²àº™ ... -ImportDialogProcessMonitor.5 = ຈ​à»â€‹àº²â€‹àº™àº§àº™â€‹àº•ົວ​ຈິງ​ຂອງ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​\:ຂà»à»‰â€‹àº¡àº¹àº™ -ImportDialogProcessMonitor.8 àºàº²àº™â€‹àº›àº¸àº‡â€‹à»àº•່ງ \= ... -InfiniteProgressMonitor.0 = àºàº»àºâ€‹à»€àº¥àºµàºâ€‹àºàº²àº™â€‹àº”à»àº²â€‹à»€àº™àºµàº™â€‹àº‡àº²àº™àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -JFileChooserExistsAware.0 = file ໂລàºâ€‹à»‚ຄງ​àºàº²àº™ -KmlImportService.13 = ເລືອàºâ€‹à»„ຟລ​໌ CSV ເພື່ອ​ຊ່ວàºâ€‹àº›àº°â€‹àº¢àº±àº”​ສະ​ຖານ​ຕອນ​ດິນ​ຂອງ​ຕົນ​ເພື່ອ -MissingPlotsListener.0 Error \= ໃນ​ຂະ​ນະ​ທີ່​àºàº²àº™â€‹à»„ດ້​ຮັບ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àº—ີ່​ດິນ​ບà»à»ˆâ€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ດ້ -MissingPlotsListener.1 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ໄປ -MissingPlotsListener.10 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ໃນ​àºàº²àº™â€‹àº­àº­àºâ€‹à»àºšàºšâ€‹àºªàº¸à»ˆàº¡â€‹àº•ົວ​ຢ່າງ​\: -MissingPlotsListener.12 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ຫາàºâ€‹à»„ປ​\: -MissingPlotsListener.14 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທັງ​ຫມົດ​à»àº¡à»ˆàº™â€‹à»„ດ້​ເຕີມ​ລົງ​ໄປ ​\!ເນື້ອ​ໃນ -MissingPlotsListener.2 = ຄັດ​ລອàºâ€‹à»„ປ​ທີ່ clipboardເອົາ -MissingPlotsListener.3 = ໄຟລ​໌​ທີ່​ບັນ​ຈຸ​ມີ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ສານ​ຕອນ​ດິນ​ຂອງ​ຕົນ (.csv ຫຼື​ໄຟລ​໌ .ced​) ສà»àº²â€‹àº¥àº±àºšâ€‹àº—ີ່​ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ຮູ້​ວ່າ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ັງ​ຫມົດ​ໄດ້​ຮັບ​àºàº²àº™â€‹à»€àº•ີມ​ລົງ​ໄປ​. -MissingPlotsListener.4 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຫາàºâ€‹à»„ປ - ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ສານ -MissingPlotsListener.5 = ຈາàºâ€‹à»„ຟ​\: -MissingPlotsListener.6 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ​ໄຟລ​໌ CED -ProcessMonitorDialog.1 = ຂà»à»‰â€‹àºœàº´àº”​ພາດ Parsing àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àºˆà»àº²â€‹àº™àº§àº™â€‹àºàº²àº™â€‹àº•ິດ​ຕà»à»ˆâ€‹àºàº±àº™ -ProcessMonitorDialog.4 = ຖັນ​, -ProcessMonitorDialog.5 = \ - ຄຸນ​ຄ່າ \ No newline at end of file +SaikuAnalysisListener.0 = Тийм - СÑргÑÑÑ… Saiku мÑдÑÑлÑл (урт үйл Ñвц) +SaikuAnalysisListener.1 = Үгүй - ЗүгÑÑÑ€ л Saiku ÑхлÑÑ… +SaikuStarter.1 Saiku ÑхлÑн \= +SaikuStarter.2 Saiku ÑхлÑн зарим нÑг минут үргÑлжилж болох \= түр хүлÑÑÐ½Ñ Ò¯Ò¯ \! +SaveEarthDataServlet.0 = ХооÑон Ñ…Ò¯ÑÑлт +SaveEarthDataServlet.1 = ÐÑуудлын мÑдÑÑллийн Ñанд мÑдÑÑлÑл Ñ…ÑмнÑÑ… гарлаа +SaveEarthDataServlet.2 = өгөгдөл хадгалÑан байна +SlopeCode.0 = Хавтгай (0-5) +EarthApp.11 = дÑлхий аль Ñ…Ñдийн ажиллаж байгаа цуглуулах +EarthApp.21 хашааны ÑүлжÑÑ Ð°Ð³ÑƒÑƒÐ»Ñан файлыг \= а CSV / CED ÑонгоÑон зам олж чадаагүй байна гÑж\:
<би> +EarthApp.23 = Ямар ч CSV / CED файл тохируулга байна\:

+EarthApp.24 = KML тодорхойлолт нь Freemarker загварыг агуулÑан файлыг ÑонгоÑон замаар олж ороогүй байна\:
<би> +EarthApp.26 = Ямар ч KML тодорхойлолт файл тохируулга байна\:

+EarthApp.27 = HTML бөмбөлөг Ñ…ÑлбÑрийг агуулÑан файлыг ÑонгоÑон замаар олж ороогүй байна\:
<би> +EarthApp.29 = Ямар ч HTML бөмбөлөг файл тохируулга байна\:

+EarthApp.3 = дараа нь надад Ñануул +EarthApp.30 = Ð¥ÑÑ€ÑгÑÑл цÑÑÑн дотрооÑ> Properties цÑÑ Ñ„Ð°Ð¹Ð»Ñ‹Ð½ байршлыг зөв оруулна уу. +EarthApp.4 = шинÑчлÑÑ… Одоо +EarthApp.5 = намайг дахин Ñануулах байхгүй юу +EarthApp.57 = <б> цуглуулж ДÑлхий боломжтой -ийн ÑˆÐ¸Ð½Ñ Ñ…ÑƒÐ²Ð¸Ð»Ð±Ð°Ñ€ байна\! Ð¥ÑÑ€Ñв та Ñ…ÑрхÑн цааш Ñ…Ò¯ÑÑж байна вÑ?
+EarthApp.58 = шинÑчлÑÑ… бөгөөд дохио авах байрлуулах +EarthApp.59 = Ðлдаа төÑөл файлыг импортлох +EarthApp.6 = \ - Хувилбар +EarthApp.61 = цуглуулж ДÑлхий файл, нÑÑлттÑй байж чадÑангүй.
Google Earth ÑуулгаÑан ÑÑÑхийг шалгана уу. +EarthSurveyService.9 = талбар шаардлагатай +ExportActionListener.1 = ÑхлÑн ÑкÑпортын Records-руу огноо Ñонгох +ExportDialogProcessMonitor.0 = боловÑруулах мÑдÑÑ ... +ExportDialogProcessMonitor.1 = үйл Ñвцыг Ñхлүүлж хүлÑÑж байна\: +ExportDialogProcessMonitor.4 = ÑкÑпортлох бүртгÑл\: +ImportProcessMonitorDialog.0 = Импортын бүртгÑл\: +ImportActionListener.0 = бүрÑн дүүрÑн чадаагүй байна талбайд өгөгдлийн импортын Ñ‘Ñтой юу? +ImportActionListener.2 = Та дарна бол <и> <б> NO бүх өгөгдлийг агуулÑан "ногоон" төлөвт талбайд, зөвхөн өгөгдөл оруулÑан болно. +ImportActionListener.3 = Импорт Ð±ÑƒÑ Ð±Ð¾Ð»Ð¾Ð²ÑруулÑан бүртгÑл +ImportDialogProcessMonitor.0 = ТООЦОЖ бичлÑгүүдийн ImportDialogProcessMonitor.11 \= Эхний дугаар\: +ImportDialogProcessMonitor.2 = бүртгÑл импортлож байна ... +Импортын бүртгÑл ImportDialogProcessMonitor.5 \= бодит тоо\: +ImportDialogProcessMonitor.8 = боловÑруулах мÑдÑÑ ... +InfiniteProgressMonitor.0 = ажиллагааг Cancel +JFileChooserExistsAware.0 = ДÑлхий төÑөл файлыг цуглуулах +KmlImportService.13 = тулд талбай байршлыг хадгалахын тулд CSV файлыг Ñонгоно уу +Database дÑÑÑ€ нь байхгүй хашааны-ий тухай мÑдÑÑлÑл авах бол MissingPlotsListener.0 \= алдаа +MissingPlotsListener.1 = хайж байна газрууд +MissingPlotsListener.10 = дÑÑж дизайн талбайд нийт тоо\: +MissingPlotsListener.12 = алга хашааны тоо\: +MissingPlotsListener.14 = мÑдÑÑлÑл талбай дүүрÑн байдаг \! +MissingPlotsListener.2 = Хуулах Бал нь агуулга +MissingPlotsListener.3 = Та бүх мÑдÑÑлÑл ирÑÑн дүүрÑн байÑан ÑÑÑхийг мÑдÑхийг Ñ…Ò¯ÑÑж байгаа нь хуйвалдаан мÑдÑÑлÑл (.csv ÑÑвÑл .ced файлууд) агуулÑан файлуудыг Ñонгоорой. +MissingPlotsListener.4 = хайж байна талбай - мÑдÑÑлÑл +MissingPlotsListener.5 Ñ„Ð°Ð¹Ð»Ð°Ð°Ñ \=\: +CED файлд MissingPlotsListener.6 \= ЭкÑпортын +мөр нь Ñ…Ñд Ñ…ÑдÑн ProcessMonitorDialog.1 \= магадлах алдаа +ProcessMonitorDialog.4 = багана +ProcessMonitorDialog.5 = \ - утгууд \ No newline at end of file From 64dc14705045a102e1e645800c7e21e94917aceb Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:34 +0100 Subject: [PATCH 0858/1620] New translations Messages_mn.properties (Spanish) --- .../earth/app/view/Messages_es.properties | 436 +++++++++--------- 1 file changed, 217 insertions(+), 219 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index e5b9bd9e45..7531b1f880 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,220 +1,218 @@ -AboutDialog.19 = ບັນ​ຫາ​ເàºàºµàº” A -AboutDialog.5 = ສà»àº²â€‹àº¥àº±àºšâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹à»€àºžàºµà»ˆàº¡â€‹à»€àº•ີມ​ໄດ້​ທີ່ OpenForis.org ເວັບ​ໄຊ​ທ​໌​ຂອງ​ພວàºâ€‹à»€àº®àº»àº² -AboutDialog.6 = ຂà»â€‹à»‚ທດ​ນà»àº²â€‹, ບັນ​ຫາ​ທີ່​ເàºàºµàº”​ຂຶ້ນ​ໃນ​ຂະ​ນະ​ທີ່​ຄວາມ​ພະ​àºàº²â€‹àºàº²àº¡â€‹àº—ີ່​ຈະ​ເປີດ​àºàº²àº™â€‹à»€àºŠàº·à»ˆàº­àº¡â€‹àº•à»à»ˆâ€‹àº™àºµà»‰â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹àº¥àº°â€‹àºšàº»àºšâ€‹àº‚ອງ​ທ່ານ​ຕົວ​ທ່ອງ​ເວັບ​ຂອງ​ມາດ​ຕະ​ຖານ​. -AboutDialog.8 = Ok -AspectCode.0 = ເຫນືອ -AspectCode.1 = ວັນ​ອອàºâ€‹àºªà»ˆàº½àº‡â€‹à»€àº«àº™àº·àº­ -AspectCode.2 = ຕາ​ເວັນ​ອອຠ-AspectCode.3 = ພາàºâ€‹à»ƒàº•້​, ຕາ​ເວັນ​ອອຠ-AspectCode.4 = ໃຕ້ -AspectCode.5 = ພາàºâ€‹à»ƒàº•້​, ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ-AspectCode.6 = ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ-AspectCode.7 = ພາàºâ€‹à»€àº«àº™àº·àº­â€‹, ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ-CollectEarthWindow.0 = ໃນ​ເວ​ລາ​ທີ່​ພະ​àºàº²â€‹àºàº²àº¡â€‹à»€àºžàº·à»ˆàº­â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌ CSVຄວາມ​ຜິດ​ພາດ -CollectEarthWindow.1 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àº -CollectEarthWindow.10 File \= -CollectEarthWindow.11 ອອàºâ€‹àºˆàº²àº \= -CollectEarthWindow.12 = ເຄື່ອງ​ມືຂà»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.13 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ CSV àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ -CollectEarthWindow.14 = Start SAIKU -CollectEarthWindow.15 = ຄຸນ​ສົມ​ບັດ -CollectEarthWindow.16 = ຊ່ວàºâ€‹à»€àº«àº¼àº·àº­ -CollectEarthWindow.17 = ປະ​ຕິ​ເສດ -CollectEarthWindow.18 = ຄົ້ນ​ຫາ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ຫາàºâ€‹à»„ປ​ໃນ​ຖານ​ຂà»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.19 = ເàºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ-CollectEarthWindow.2 = ພາ​ສາ -CollectEarthWindow.20 = ຈà»àº²â€‹àº™àº§àº™â€‹àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™ duplicated​\: -CollectEarthWindow.21 = ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ຊອàºâ€‹àº«àº² icon ສà»àº²â€‹àº¥àº±àºšâ€‹àºžàº²â€‹àº•ົ້ນ​ຕ໠-CollectEarthWindow.22 = ທ່ານ​ມີ​ຄວາມ​à»àº™à»ˆâ€‹à»ƒàºˆàº§à»ˆâ€‹àº²â€‹àº—່ານ​ຕ້ອງ​àºàº²àº™â€‹àº›àº´àº”​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹? ໃນ​àºàº²àº™â€‹àº›àº´àº”​ປ່ອງ​ຢ້ຽມ​àºàº±àº‡â€‹àºˆàº°â€‹àº›àº´àº”​ເຄື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹àº‚ອງ​ໂລàºâ€‹à»„ດ້​ເàºàº±àºšâ€‹àºà»àº² -CollectEarthWindow.23 = àºàº²àº™â€‹àº¢àº±à»‰àº‡â€‹àº¢àº·àº™â€‹àº—ີ່​ຈà»àº²â€‹à»€àº›àº±àº™ -CollectEarthWindow.24 = XML ສົ່ງ​ອອຠ-CollectEarthWindow.25 = ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ເພີ່ມ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹à»€àº«àº¼àº»à»ˆàº²â€‹àº™àºµà»‰â€‹à»àº¥à»‰àº§â€‹à»àº¥àº°â€‹àºàº²àº™â€‹àºªàº¹àº™â€‹à»€àºªàºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº‚ອງ​ທ່ານ​? -CollectEarthWindow.26 = ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™ -CollectEarthWindow.27 = ປັບ​ປຸງ -CollectEarthWindow.28 = ເຮັດ​ຢູ່​ຕ່າງ​ປະ​ເທດ​ເàºàº±àºšâ€‹àºà»àº²â€‹à»€àº„ື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹àº„ວນ​ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹à»àº¥à»ˆàº™â€‹à»ƒàº™â€‹àº‚ະ​ນະ​ທີ່​ຜູ້​ປະ​àºàº­àºšâ€‹àºàº²àº™â€‹àº•ີ​ຄວາມ​ຫມາàºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹. -CollectEarthWindow.29 = The Saiku Server ບà»à»ˆâ€‹à»„ດ້​ຖືàºâ€‹àº•ັ້ງ​. -CollectEarthWindow.3 = \ ຄວາມ​ຜິດ​ພາດ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ -CollectEarthWindow.30 = àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº®àº±àºâ€‹àºªàº²â€‹àºàº²àº™â€‹à»€àº›àºµàº”​ຫນ້າ​ຕ່າງ​ນີ້​ໃນ​ຂະ​ນະ​ທີ່​ທ່ານ​àºà»àº²â€‹àº¥àº±àº‡â€‹à»ƒàºŠà»‰â€‹àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹. -CollectEarthWindow.31 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌ CSV -CollectEarthWindow.32 = ອອຠ-CollectEarthWindow.33 = ຊື່​ຜູ້​ປະ​àºàº­àºšâ€‹àºàº²àº™â€‹àºˆàº°â€‹àº•້ອງ​ມີ​àºàº²àº™â€‹àº•à»à»ˆâ€‹à»„ປ​ອີàºâ€‹à»àº¥à»‰àº§â€‹àºâ€‹à»ˆâ€‹àº§àº² 5 ລັàºâ€‹àºªàº°â€‹àº™àº°â€‹à»àº¥àº°â€‹àºªàº±à»‰àº™â€‹àºâ€‹à»ˆâ€‹àº§àº² 50ຄວາມ​ຜິດ​ພາດ -CollectEarthWindow.34 = àºàº§àº”​ສອບ -CollectEarthWindow.35 = ຜູ້​ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹àº¥àº»àºšâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™ ​\! ຫລັàºâ€‹àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº•ື່ມ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàºªà»ˆâ€‹àºŠàº·à»ˆâ€‹àºœàº¹à»‰â€‹àº›àº°â€‹àºàº­àºšâ€‹àºàº²àº™â€‹à»àº¥àº°â€‹à»ƒàº«à»‰â€‹àºàº»àº”​ປຸ່ມ "ປັບ​ປຸງ​"​. ຊື່ -CollectEarthWindow.36 = ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹àºšà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ເປົ່າ -CollectEarthWindow.37 = ຮັàºâ€‹àºªàº²â€‹àºˆàº±àº™à»„ຟລ​໌ -CollectEarthWindow.38 = CSV -CollectEarthWindow.39 à»àºˆà»‰àº‡ \= ມັນ​ເປັນ​àºàº²àº™â€‹àºªàº»àº¡â€‹àº„ວນ​ທີ່​ທ່ານ​ໄປ​ເຖິງ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº‚ອງ​ທ່ານ (àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ XML​) àºà»ˆàº­àº™â€‹àº—ີ່​ຈະ​ໄດ້​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº«àº¡à»ˆâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ -CollectEarthWindow.4 = FAO à»àºˆà»‰àº‡â€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ເສດ -CollectEarthWindow.40 = ທີ່​àºà»àº²â€‹àº™àº»àº”​ໄວ້​ຕາມ​ເສັ້ນ​ທາງ​àºàº±àºšâ€‹à»‚ຟນ​ເດີ​ທີ່ Saiku Server ໄດ້​ຖືàºâ€‹àº•ິດ​ຕັ້ງ​ຢູ່​ໃນ Tools-> Properties-> à»àº–ບ​à»àºšàºšâ€‹àºžàº´â€‹à»€àºªàº”​ໄດ້​. -CollectEarthWindow.41 = àºàº²àº™â€‹àº›àº°â€‹àº«àºàº±àº”​àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌​\: -CollectEarthWindow.42 = ອອຠ-CollectEarthWindow.43 = àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº•à»àº²â€‹àºàº±àº™â€‹àº—ີ່​ພົບ​ເຫັນ -CollectEarthWindow.44 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ / ສົ່ງ​ອອàºàº‚à»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.45 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ XML (à»àº›â€‹)ຂà»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.46 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ໃຫມ່​ຈາàºâ€‹à»„ປ​ສະ​ນີ (XML à»àº›â€‹)àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™ -CollectEarthWindow.55 ປັບ​ປຸງ \= àºàº²àº™â€‹àº™à»àº²â€‹à»ƒàºŠà»‰ CSV -CollectEarthWindow.47 = Saiku Server ບà»à»ˆâ€‹à»„ດ້​àºà»àº²â€‹àº«àº™àº»àº” -CollectEarthWindow.48 = ໄຟລ​໌​ຫັດ​ໄປ​ສະໄຟລ​໌ -CollectEarthWindow.49 = Fusion CSV -CollectEarthWindow.5 = ປິດ -CollectEarthWindow.50 = ເປີດ​ຄູ່​ມື​àºàº²àº™â€‹à»ƒàºŠà»‰àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™â€‹àº›àº±àºšâ€‹àº›àº¸àº‡â€‹àº‚ອງ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ-CollectEarthWindow.51 CHECK \= àºàº§àº”​ສອບ -CollectEarthWindow.52 = File ເຂົ້າ​ສູ່​ລະ​ບົບ​ຄà»àº²â€‹àº®à»‰àº­àº‡â€‹àºªàº°â€‹àº«àº¡àº±àºâ€‹à»€àº›àºµàº” -CollectEarthWindow.53 = àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»€àº­â€‹àºàº°â€‹àºªàº²àº™â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹à»€àº‚ົ້າ​ສູ່​ລະ​ບົບຈຸດ -CollectEarthWindow.54 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຈາຠKMLàºà»ˆàº½àº§â€‹àºàº±àºš -CollectEarthWindow.56 = ... -CollectEarthWindow.57 = ຂະ​ບວນ​àºàº²àº™â€‹à»€àº¥àºµà»ˆàº¡â€‹àº•ົ້ນ Saiku à»àº¡à»ˆàº™â€‹àºàº±àº‡â€‹à»àº¥à»ˆàº™â€‹, àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº¥à»â€‹àº–້າ​. -CollectEarthWindow.58 = ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ເລີ່ມ​ຕົ້ນ​àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ Saiku -CollectEarthWindow.59 = ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ Re​\: àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ Saiku ໄດ້​?
ຂະ​ບວນ​àºàº²àº™â€‹àº™àºµà»‰â€‹àºªàº²â€‹àº¡àº²àº”​ໃຊ້​ເວ​ລາ​ຫຼາàº
ຖ້າ​ທ່ານ​ຄລິàºâ€‹à»ƒàºªà»ˆ "à»àº¡à»ˆàº™â€‹à»àº¥à»‰àº§â€‹" ເປັນ​ຊຸດ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໃຫມ່​ທີ່​ມີ​ຄວາມ​ຫຼ້າ​ສຸດ​ໄດ້​. ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº‚ຶ້ນ​. -CollectEarthWindow.6 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ Fusion ຕາ​ຕະ​ລາງàºàº²àº™â€‹àºœàº°â€‹àº¥àº´àº”​ຂà»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.60 = Saiku -CollectEarthWindow.61 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່ XML (àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº”ັດ​à»àºà»‰â€‹àº™àº±àºšâ€‹àº•ັ້ງ​à»àº•່​àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àºªàº¸àº”​ທ້າàºâ€‹) ສົ່ງ​ອອàºàºà»ˆàº½àº§â€‹àºàº±àºš -CollectEarthWindow.62 = ... -CollectEarthWindow.63 Error \= àºàº²àº™â€‹à»„ດ້​ຮັບ​ຈຸດ​ທີ່​ໄດ້​ຈາຠKML -CollectEarthWindow.64 = ສະ​ຫນັບ​ສະ​ຫນູນ​ທາງ​ເທàºâ€‹àº™àº´àº -CollectEarthWindow.7 Error \= ໃນ​ເວ​ລາ​ທີ່​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຂà»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.8 ຂà»à»‰â€‹àº„ວາມ​ປະ​ຕິ​ເສດ \= ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ພົບ​ເຫັນ -CollectEarthWindow.9 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໄດ້​ນà»àº²â€‹à»€àº‚ົ້າ​ມາ​ປະ​àºàº­àºšâ€‹àº”້ວàºâ€‹àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àº—ີ່​ມີ​ຢູ່​à»àº¥à»‰àº§â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚ອງ​ທ່ານ​. -DynamicsCode.0 = ປ່າ​ໄມ້​ໃນ​ເບື້ອງ​ຕົ້ນ -DynamicsCode.1 = ທົ່ງ​ຫàºà»‰àº²â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ -DynamicsCode.2 = àºàº²àº™â€‹àº•ັ້ງ​ຖິ່ນ​ຖານ​ໃນ​ເບື້ອງ​ຕົ້ນ -DynamicsCode.3 = ເບື້ອງ​ຕົ້ນ Otherland -DynamicsCode.4 = ຊຸ່ມ​ນ​້​à»àº²â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ -DynamicsCode.5 = ເບື້ອງ​ຕົ້ນ Cro​​pland -OpenTextFileListener.0 = ໄຟລ​໌​ຂà»à»‰â€‹àº„ວາມ​à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹à»„ດ້​ພົບ​ໄດ້​ທີ່​\:àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -OptionWizard.0 = ທາງ​ເລືອàºâ€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ-OptionWizard.1 = ເລືອàºâ€‹àº‚ອງ​ຕົວ​ທ່ອງ​ເວັບ -OptionWizard.10 = ໂຟ​ເດີ​ສà»àº²â€‹àº®àº­àº‡â€‹àºˆàº±àº™ -OptionWizard.11 = ບà»à»ˆâ€‹àº®àº¹à»‰â€‹àºˆàº±àºâ€‹\: àºàº²àº™â€‹àº™à»àº²â€‹à»ƒàºŠà»‰ ifconfig -OptionWizard.12 = ລູàºâ€‹àº„້າ​ຕົວ​ຢ່າງàºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -OptionWizard.13 = ໂລຠIP Serveràºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -OptionWizard.14 = port ໂລຠServer (ຕົວ​ຢ່າງ​\: 8023​) -OptionWizard.15 = ບັນ​ທຶàºâ€‹à»àº¥àº°â€‹à»ƒàºŠà»‰â€‹àºàº²àº™â€‹àº›à»ˆàº½àº™â€‹à»àº›àº‡ -OptionWizard.16 = ລະ​ຫັດ -OptionWizard.17 = X​-coord -OptionWizard.18 = Y coord​, -OptionWizard.19 = àºàº²àº™â€‹àºàº»àºâ€‹àº¥àº°â€‹àº”ັບ -OptionWizard.2 = ບວນ​àºàº²àº™â€‹à»€àº®àº±àº”​ວຽຠ(server / ລູàºâ€‹àº„້າ​) -OptionWizard.20 = ໄດ້​ເນື້ອ​ໃນ​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»„ດ້​ມີ​àºàº²àº™â€‹àº›à»ˆàº½àº™â€‹à»àº›àº‡â€‹.
àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº®àº±àºšâ€‹à»‚ຫລດ​ເນື້ອ​ຫາ​ໃນ​ເວ​ລາ​ທີ່​ທ່ານ​àºà»àº²â€‹àº¥àº±àº‡â€‹àº®àº±àºšâ€‹àºàº²àº™â€‹àºàº°â€‹àº•ຸ້ນ​ໂດàºâ€‹àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹. -OptionWizard.21 = ປັບ​ປຸງ​ສົບ​ຜົນ​ສà»àº²â€‹à»€àº¥àº±àº” -OptionWizard.22 = ຄ້ອຠ-OptionWizard.23 = ມີ​ຄວາມ​ຜິດ​ພາດ​ໃນ​ເວ​ລາ Re​\: ເປີດ​ໄດ້​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»€àº›àº±àº™â€‹à»„ດ້àºàº»àºâ€‹à»€àº¥àºµàºâ€‹àºàº²àº™ -OptionWizard.24 = àºàº»àºà»€àº¥àºµàºàºàº²àº™ -OptionWizard.25 = ຮູບ​à»àºšàºšâ€‹àºàº²àº™â€‹àº”à»àº²â€‹à»€àº™àºµàº™â€‹àº‡àº²àº™ -OptionWizard.26 = àºàº²àº™â€‹à»€àº›àº±àº™â€‹à»€àºˆàº»à»‰àº²â€‹àºžàº²àºš DB -OptionWizard.27 = ນີ້​ບà»à»ˆâ€‹à»„ດ້​ເປັນ​ທີ່​àºàº­àº¡â€‹àº®àº±àºš Saiku Folder (ເອ​àºàº°â€‹àºªàº²àº™â€‹à»€àº¥àºµà»ˆàº¡ saiku.bat ບà»à»ˆâ€‹à»àº¡à»ˆàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹) -OptionWizard.28 = Saiku Server ບà»à»ˆâ€‹àº®àº­àº‡â€‹àº®àº±àºš -OptionWizard.29 = ພ໠DB -OptionWizard.3 = Server ຕົວ​ຢ່າງ -OptionWizard.30 = ທາງ​ເລືອຠSQLite -OptionWizard.31 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº•ົວ​ຢ່າງ -OptionWizard.32 = ຮູບ​à»àºšàºšâ€‹àº”ິນ​ຕອນ -OptionWizard.33 = ສà»àº²â€‹àº«àº¼àº§àº”​ນຸ​àºàº»àº¡ -OptionWizard.34 = à»àºšàºšâ€‹àºžàº´â€‹à»€àºªàº” -OptionWizard.35 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ຈຸດ​ຕົວ​ຢ່າງ -OptionWizard.36 = ໄລ​àºàº°â€‹àº—າງ​ລະ​ຫວ່າງ​ຈຸດ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àº•ົວ​ຢ່າງ (ໃນ​ຕາ​) -OptionWizard.37 = ອັດ​ຕາ​ທີ່​ມີ​ຊາàºâ€‹à»àº”ນ​ດິນ​ຕອນ (à»àº¡àº±àº”​) -OptionWizard.38 = ໄຟລ​໌ CSV / CED ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ອ່ານ​ໄດ້​ຢ່າງ​ຖືàºâ€‹àº•້ອງ
ເອ​àºàº°â€‹àºªàº²àº™â€‹à»„ດ້​ຖືàºâ€‹àº„າດ​ວ່າ​ຈະ​ມີ​ມູນ​ຄ່າ​àºàº²àº™â€‹à»àºàºâ€‹àºˆàº¸â€‹àº¥àº°â€‹àºžàº²àºâ€‹à»€àºŠàº±à»ˆàº™â€‹àº™àºµà»‰â€‹\:​.
-OptionWizard.39 = ລະ​ຫັດ​, YCoordinate​, XCoordinate​, ພູ​, ລັàºâ€‹àºªàº°â€‹àº™àº° -OptionWizard.4 = IP ຄອມ​ພິວ​ເຕີ​ປັດ​ຈຸ​ບັນ​\: -OptionWizard.40 = ໂຄງ​àºàº²àº™ -OptionWizard.41 = ໂຫຼດ​ໄຟລ​໌​ໂຄງ​àºàº²àº™â€‹à»ƒàº«àº¡à»ˆ -OptionWizard.42 = ຜິດ​ພາດ​ໃນ​ເວ​ລາ​ປິດ​àºàº²àº™â€‹àº­à»ˆàº²àº™ CSV -OptionWizard.43 = ຊື່​ຂອງ​àºàº²àº™â€‹àºªà»àº²â€‹àº«àº¼àº§àº” -OptionWizard.44 = ຖານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ປ​ໃຫ້​ເຖິງ​ອັດ​ຕະ​ໂນ​ມັດ​ທີ່ -OptionWizard.45 = Open Earth Engine ຊູມ​ເຂົ້າ​ໄປ​ໃນ​ເຂດ​ຕອນ​ດິນ​ຂອງ​ຕົນ -OptionWizard.46 = timelapse ຈັàºâ€‹à»€àº›àºµàº”​ໂລàºâ€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºžàº·à»‰àº™â€‹àº—ີ່​ຕອນ​ດິນ​ຂອງ​ຕົນ -OptionWizard.47 = Open à»àºœàº™ Bing ສà»àº²â€‹àº¥àº±àºšâ€‹àºžàº·à»‰àº™â€‹àº—ີ່​ຕອນ​ດິນ​ຂອງ​ຕົນ -OptionWizard.48 = ຮູບ​à»àºšàºšâ€‹à»€àº›àºµàº”​ໃນ​ຕົວ​ທ່ອງ​ເວັບ​ຂອງ​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»„ດ້ (à»àº™àº°â€‹àº™à»àº²â€‹à»ƒàº«à»‰â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™ LINUX​) -OptionWizard.49 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™ Ced / csv ໄຟລ​໌​ທີ່​ມີ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº•ອນ​ດິນ​ຂອງ​ຕົນàºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -OptionWizard.5 = port ໂລຠServer​\: -OptionWizard.50 = Browse ... -OptionWizard.51 = ເອ​àºàº°â€‹àºªàº²àº™â€‹à»‚ຄງ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຜິດ​ພາດ -OptionWizard.52 = CSV / ເອ​àºàº°â€‹àºªàº²àº™ Ced ມີ​àºàº²àº™â€‹àº›àº°â€‹àºªàº²àº™â€‹àº‡àº²àº™â€‹à»€àº—ົ່າ​ນັ້ນ -OptionWizard.54 = ຈຸດ​ສູນ​àºàº²àº‡ -OptionWizard.55 = Error ໂຟນ​ເດີ​ໂຄງ​àºàº²àº™â€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ -OptionWizard.56 = ໂຄງ​àºàº²àº™ Load -OptionWizard.57 = ໂຄງ​àºàº²àº™ loaded àºà»ˆàº­àº™â€‹àº«àº™à»‰àº²â€‹àº™àºµà»‰ -OptionWizard.58 = Open GEE Code Editor (ຮຽàºâ€‹àº®à»‰àº­àº‡â€‹à»ƒàº«à»‰â€‹àº¡àºµâ€‹àºàº²àº™â€‹à»€àº‚ົ້າ​ເຖິງ Tester Trusted​) -OptionWizard.59 = Open ທີ່​ນີ້​à»àºœàº™â€‹àº—ີ່​ສຸມ​ໃສ່​ຕອນ​ດິນ​ຂອງ​ຕົນ -OptionWizard.6 = ຕົວ​àºà»àº²â€‹àº™àº»àº”​àºàº²àº™ PostgreSQL DB -OptionWizard.65 = ເສັ້ນ​ທາງ​àºàº±àºšâ€‹à»‚ຟນ​ເດີ​ທີ່ Saiku -OptionWizard.66 = Browse ... -OptionWizard.67 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ບັດ​àºàº²àº™ Firefox -OptionWizard.68 = Browse ... -OptionWizard.7 = ຊື່​ຜູ້​ໃຊ້ -OptionWizard.70 = àºàº²àº™â€‹àºšà»â€‹àº¥àº´â€‹àº«àº²àº™â€‹à»„ຟ -OptionWizard.72 = ໄຟລ​໌​ຖານ​ສອງ -OptionWizard.73 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ບັດ​àºàº²àº™ Chrome -OptionWizard.74 = Browse ... -OptionWizard.76 = àºàº²àº™â€‹àºšà»â€‹àº¥àº´â€‹àº«àº²àº™â€‹à»„ຟ -OptionWizard.78 = ໄຟລ​໌​ຖານ​ສອງ -OptionWizard.79 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹à»àºšàºš KML Freemarker -OptionWizard.8 = ລະ​ຫັດ​ຜ່ານ -OptionWizard.80 = Browse ... -OptionWizard.82 = à»àº¡à»ˆâ€‹à»àºšàºš Freemarker -OptionWizard.83 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº­àº­àºâ€‹à»àºšàºšâ€‹àº®àº¹àºšâ€‹à»àºšàºš HTML ປູມ​ເປົ້າ -OptionWizard.84 = Browse ... -OptionWizard.86 = HTML webpage -OptionWizard.87 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™ XML àºàº±àºšâ€‹àº„à»àº²â€‹àº™àº´â€‹àºàº²àº¡ IDM -OptionWizard.88 = Browse ... -OptionWizard.9 = ຊື່ DB -OptionWizard.90 = ຫມາຠIDM XML -OptionWizard.91 = Server (ສະ​ບັບ​ຜູ້​ຈັດ​àºàº²àº™â€‹àº«àº¼àº·â€‹àº¢àº·àº™â€‹àº¢àº¹à»ˆâ€‹àº„ົນ​ດຽວ​ໃຊ້​) -OptionWizard.92 = ລູàºâ€‹àº„້າ (ປະ​ຕິ​ບັດ​àºàº²àº™ / àºàº²àº™â€‹à»€àºŠàº·à»ˆàº­àº¡â€‹àº•à»à»ˆâ€‹àºàº±àºšâ€‹à»€àº„ື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹) -OptionWizard.93 = SQLite (à»àºšàºšâ€‹àºàº±àº‡ / ໄຟລ​໌​ດຽວ​ຕາມ​) +AboutDialog.19 = гарÑан нь аÑуудлыг +AboutDialog.5 = ДÑлгÑÑ€Ñнгүй мÑдÑÑллийг манай вÑб OpenForis.org очиж +AboutDialog.6 = Уучлаарай, аÑуудал нь таны ÑиÑтемийн Ñтандарт браузер ÑÐ½Ñ Ñ…Ð¾Ð»Ð±Ð¾Ð¾Ñыг нÑÑÑ… гÑж оролдож гарлаа. +AboutDialog.8 = Ок +AspectCode.0 = Хойд +AspectCode.1 = Зүүн Хойд +AspectCode.2 = Зүүн +AspectCode.3 = Зүүн-Өмнөд +AspectCode.4 = Өмнөд +AspectCode.5 = Баруун-Өмнөд +AspectCode.6 = Баруун +AspectCode.7 = Баруун Хойд +CollectEarthWindow.0 = CSV файл уруу өгөгдөл ÑкÑпортлох оролдож алдаа +CollectEarthWindow.1 = ЭкÑпортын алдаа +CollectEarthWindow.10 = Файлын +CollectEarthWindow.11 = Exit +CollectEarthWindow.12 Ñ…ÑÑ€ÑгÑÑл \= +CollectEarthWindow.13 = ЭкÑпортын CSV өгөгдөл +CollectEarthWindow.14 = Start SAIKU дүн шинжилгÑÑ +CollectEarthWindow.15 = Үл хөдлөх хөрөнгө +CollectEarthWindow.16 = туÑламж +CollectEarthWindow.17 = Disclaimer +CollectEarthWindow.18 = мÑдÑÑллийн Ñанд Ñураггүй алга газраа хай +CollectEarthWindow.19 = дÑлхийг цуглуулах +CollectEarthWindow.2 = Ñ…Ñл +CollectEarthWindow.20 = давхардÑан тоогоор бүртгÑлийн тоо\: +CollectEarthWindow.21 = гол хүрÑÑ Ð´Ò¯Ñ€Ñийг олж чадахгүй байна +CollectEarthWindow.22 = Ð¥ÑÑ€Ñв та цуглуулж дÑлхийг хаах Ñ…Ò¯ÑÑж байгаа гÑдÑгт итгÑлтÑй байна уу? Цонхыг хаах нь цуглуулж ДÑлхий Ñервер хаах болно
+CollectEarthWindow.23 = батлах Ñ…ÑÑ€ÑгтÑй +CollectEarthWindow.24 = XML ЭкÑпортын +CollectEarthWindow.25 = Та Ñмар ч байÑан ÑдгÑÑÑ€ бүртгÑлийг нÑмÑÑ…, таны одоогийн мÑдÑÑллийг алдах Ñ…Ò¯ÑÑж байна уу? +CollectEarthWindow.26 = Оператор +CollectEarthWindow.27 = шинÑчлÑÑ… +CollectEarthWindow.28 = <б> ÐÑÑлттÑй Foris оператор мÑдÑÑллийг хөрвүүлÑн ойлгох бол ДÑлхий Ñервер ажиллаж байх Ñ‘Ñтой цуглуулна. +CollectEarthWindow.29 = Saiku Ñерверийг тохируулаагүй байна. +CollectEarthWindow.3 = \ Импорт алдаа +CollectEarthWindow.30 = Та Google Earth ашиглаж байгаа бол ÑÐ½Ñ Ñ†Ð¾Ð½Ñ… нÑÑлттÑй байлгах уу. +CollectEarthWindow.31 = ЭкÑпортын CSV файлд мÑдÑÑллийг цуглуулÑан +CollectEarthWindow.32 = Quit +CollectEarthWindow.33 = операторын нÑÑ€ 5 Ñ‚ÑмдÑгтүүд болон 50 богино бодвол илүү урт байх Ñ‘Ñтой +CollectEarthWindow.34 = Баталгаажуулалт алдаа +CollectEarthWindow.35 = OPERATOR нÑÑ€ хооÑон \! Зар операторын нÑÑ€ бөглөх болон "шинÑчлÑÑ…" товчийг дарна уу. +CollectEarthWindow.36 = Оператор нÑÑ€ хооÑон байж болохгүй +CollectEarthWindow.37 = нÑÑлттÑй байлга +CollectEarthWindow.38 = CSV файлууд +CollectEarthWindow.39 = Ðнхааруулга\: Ð­Ð½Ñ Ð½ÑŒ зүйтÑй та нөөцлөх-ап таны одоогийн өгөгдөл (XML нь ЭкÑпортын) ÑˆÐ¸Ð½Ñ Ð¼ÑдÑÑллийг импортлогч өмнө +CollectEarthWindow.4 = ÐҮБ-ын ХХÐÐБ Disclaimer зар +CollectEarthWindow.40 Тодорхой хүртÑл \= Saiku Server Ð¥ÑÑ€ÑгÑÑл цÑÑÑн дотрооÑ> баÑлагт> ÐарийвчилÑан таб-д ÑуулгаÑан байна Ñ…Ð°Ð²Ñ‚Ð°Ñ Ð·Ð°Ð¼Ñ‹Ð³. +CollectEarthWindow.41 = Хадгаламж файл уруу өгөгдөл ÑкÑпортолÑон\: +CollectEarthWindow.42 = Quit +CollectEarthWindow.43 = ЗөрчилтÑй бүртгÑл олдлоо +CollectEarthWindow.44 = МÑдÑÑллийн Импорт / ЭкÑпортын +XML гÑж CollectEarthWindow.45 \= ЭкÑпортын мÑдÑÑ (шахÑан) +Zip-Ð°Ð°Ñ CollectEarthWindow.46 \= Импортын ÑˆÐ¸Ð½Ñ Ð¼ÑдÑÑ (шахÑан XML) +CSV ашиглан CollectEarthWindow.55 \= шинÑчлÑÑ… одоогийн бүртгÑл +CollectEarthWindow.47 = Saiku Ñерверийг тохируулаагүй бол +CollectEarthWindow.48 = Zip / цуглуулах-өгөгдлийн файлууд +CollectEarthWindow.49 = Fusion CSV файлууд +CollectEarthWindow.5 = Хаах +CollectEarthWindow.50 = ÐÑÑлттÑй Ñ…ÑÑ€ÑглÑгчийн гарын авлага +Цуглуулж дÑлхийн шинÑчлÑлтүүдийн хувьд CollectEarthWindow.51 \= шалгах +CollectEarthWindow.52 = ÐÑÑлттÑй Application нÑвтрÑÑ… Файлын +CollectEarthWindow.53 = цуглуулах ДÑлхий нÑвтрÑÑ… файл +KML нь CollectEarthWindow.54 \= ачааллын оноо +CollectEarthWindow.56 = тухай ... +CollectEarthWindow.57 = Saiku гарааны үйл Ñвц одоо ч ажиллаж байгаа, түр хүлÑÑÐ½Ñ Ò¯Ò¯. +CollectEarthWindow.58 = Saiku шинжилгÑÑг Ñхлүүлж чадахгүй +CollectEarthWindow.59 = Ð¥ÑÑ€Ñв та Saiku дүн шинжилгÑÑ Ñ…Ð¸Ð¹Ñ… мÑдÑÑллийн Ñанг дахин бий болгох Ñ…Ò¯ÑÑж байна уу?
Ð­Ð½Ñ Ò¯Ð¹Ð» Ñвц нь цаг хугацаа шаардÑан ажил байж болох юм.
Та хамгийн Ñүүлийн үеийн нь "YES" ÑˆÐ¸Ð½Ñ Ð´Ð°Ñ‚Ð°Ñетийн дÑÑÑ€ товшино уу мÑдÑÑллийг бий болно. +Fusion Ð¥Ò¯ÑнÑгт нь CollectEarthWindow.6 \= ЭкÑпортын +CollectEarthWindow.60 = Saiku мÑдÑÑ Ò¯ÐµÐ¸Ð¹Ð½ +CollectEarthWindow.61 = ЭкÑпортын XML өгөгдөл (Ñүүлийн ÑкÑпортын хойш өөрчлөгдÑөн бүртгÑл) +CollectEarthWindow.62 = тухай ... +CollectEarthWindow.63 = Ðлдаа KML авÑан оноо авах +CollectEarthWindow.64 = техникийн дÑмжлÑг үзүүлÑÑ… +CollectEarthWindow.7 = алдаа мÑдÑÑлÑл импортлох +CollectEarthWindow.8 = Disclaimer текÑÑ‚ олж чадахгүй байна +CollectEarthWindow.9 = оруулÑан мÑдÑÑллийг өөрийн мÑдÑÑллийн Ñанд нь байгаа бичлÑгийг агуулж байдаг. +DynamicsCode.0 = ЭхлÑÑд ой +DynamicsCode.1 = ЭхлÑÑд БÑлчÑÑрийн +DynamicsCode.2 = ЭхлÑÑд шийдвÑрлÑÑ… +DynamicsCode.3 = ЭхлÑÑд Otherland +DynamicsCode.4 = ЭхлÑÑд Ð£Ñ Ð½Ð°Ð¼Ð³Ð°Ñ€Ñ…Ð°Ð³ газрын +DynamicsCode.5 = ЭхлÑÑд Тариалангийн +OpenTextFileListener.0 = текÑÑ‚ файл олж байÑан юм\: +OptionWizard.0 = ДÑлхий Ñонголт цуглуулах +OptionWizard.1 = Хөтөч Ñонгоно уу +OptionWizard.10 = ÐÑÑлттÑй нөөц Ñ…Ð°Ð²Ñ‚Ð°Ñ +OptionWizard.11 = Тодорхойгүй\: ашиглах ifconfig +OptionWizard.12 = Ð¥ÑÑ€ÑглÑгч шатны +OptionWizard.13 = ДÑлхий Server IP цуглуулах +OptionWizard.14 = ДÑлхий Server портыг (жишÑÑ Ð½ÑŒ\: 8023) цуглуулах +OptionWizard.15 = Save & өөрчлөлт хийх +OptionWizard.16 = ID +OptionWizard.17 = X-coord +OptionWizard.18 = Y-coord +OptionWizard.19 = Elevation +OptionWizard.2 = урÑгал даÑгалын (Ñервер / үйлчлүүлÑгч) + OptionWizard.20 \= Google Earth агуулга нь өөрчлөгдÑөн байна.
Ðгуулга нь ачаалах хүлÑÑн авна уу та Google Earth-ÑÑÑ Ð°Ñуух үед. +OptionWizard.21 = шинÑчлÑÑ… амжилттай +OptionWizard.22 = Ð¥Ñвгий +OptionWizard.23 = дахин нÑÑÑ… Google Earth мÑдÑÑллийг үед алдаа гарлаа +OptionWizard.24 = Болих +OptionWizard.25 = үйл ажиллагааны горим +OptionWizard.26 = DB хоÑÑ‚ +OptionWizard.27 = Ð­Ð½Ñ Ð½ÑŒ хүлÑÑн зөвшөөрөгдÑөн Saiku Folder (ÑхлÑÑ… saiku.bat файл байхгүй бол) ороогүй байна +OptionWizard.28 = Saiku Server хүлÑÑн зөвшөөрөөгүй +OptionWizard.29 = DB порт +OptionWizard.3 = Server шатны +OptionWizard.30 = SQLite Ñонголт +OptionWizard.31 = ЖишÑÑ Ð¼ÑдÑÑлÑл +OptionWizard.32 = Plot зохион байгуулалт +OptionWizard.33 = Ñудалгаа тодорхойлолт +OptionWizard.34 = ÐарийвчилÑан +OptionWizard.35 = түүвÑÑ€ цÑгийн тоо +OptionWizard.36 = (метр) дÑÑж авах цÑгийн хоорондох зай +(Метр) ДÑÑж авах цÑгүүд OptionWizard.95 \= Side +OptionWizard.38 = CSV / CED файлыг зөв уншиж чадахгүй байгаа файлыг
иймÑрхүү таÑлалаар туÑгаарлаж утгыг байх төлөвтÑй байна\:.
<Б> +OptionWizard.39 = ID, YCoordinate, XCoordinate, өндрийн, налуу, тал +OptionWizard.4 = Одоогийн компьютерийн IP\: +OptionWizard.40 = төÑлүүд +OptionWizard.41 = ÑˆÐ¸Ð½Ñ Ñ‚Ó©Ñөл файлыг ачаалж +OptionWizard.42 = Ðлдаа CSV уншигч хаах +Судалгааны OptionWizard.43 \= нÑÑ€ +OptionWizard.44 = автоматаар нөөцлөх хүртÑл өгөгдлийн Ñан дÑÑÑ€ +OptionWizard.45 = ÐÑÑлттÑй Earth Engine талбай талбай руу томруулÑан +талбай мÑдÑÑлÑл / CSV файлыг ced нь OptionWizard.49 \= зам +Харин Google Earth-ийн браузер дÑÑÑ€ OptionWizard.48 \= ÐÑÑлттÑй Ñ…ÑлбÑÑ€ (ЛинукÑд зориулÑан байлгахыг зөвлөдөг) +OptionWizard.5 = цуглуулах ДÑлхий Server портыг\: +OptionWizard.50 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.51 = Ðлдаа импортлох төÑөл файл +Зөвхөн координат нь OptionWizard.52 \= CSV / CED файл +OptionWizard.53 = талбай +OptionWizard.54 = Төв цÑг нь +OptionWizard.55 = Ðлдаа импортлох төÑөл Ñ…Ð°Ð²Ñ‚Ð°Ñ +OptionWizard.56 = ачааллын төÑөл +OptionWizard.57 = Өмнө нь дуудагддаг төÑөл +OptionWizard.58 = ÐÑÑлттÑй Gee тоглоомын талбай (Trusted Tester хандах шаардлагатай) +OptionWizard.59 = ÐÑÑлттÑй Энд Maps газар дÑÑÑ€ анхаарлаа хандуулж +OptionWizard.6 = PostgreSQL DB параметрүүд +OptionWizard.65 = Saiku хавтÑанд зам +OptionWizard.66 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.67 = Firefox гүйцÑтгÑгдÑÑ… нь зам +OptionWizard.68 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.7 = Ð¥ÑÑ€ÑглÑгчийн нÑÑ€ +OptionWizard.70 = гүйцÑтгÑгдÑÑ… файлууд +OptionWizard.72 = Хоёртын файлууд +OptionWizard.73 = Chrome гүйцÑтгÑгдÑÑ… нь зам +OptionWizard.74 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.76 = гүйцÑтгÑгдÑÑ… файлууд +OptionWizard.78 = Хоёртын файлууд +OptionWizard.79 = KML Freemarker загварт зам +OptionWizard.8 = Ðууц үг +OptionWizard.80 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.82 = Freemarker загвар +OptionWizard.83 = HTML бөмбөлөг Ñ…ÑлбÑÑ€ дизайн зам +OptionWizard.84 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.86 = HTML вÑб Ñ…ÑƒÑƒÐ´Ð°Ñ +OptionWizard.87 = IDM тодорхойлолт нь XML нь зам +OptionWizard.88 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.9 = DB нÑÑ€ +OptionWizard.90 = XML IDM тодорхойлолт +OptionWizard.91 = Server (менежер хувилбар, ÑÑвÑл дангаараа ашиглах нь) +OptionWizard.92 = Ð¥ÑÑ€ÑглÑгч (оператор / Ñервер уруу холбогдÑон) +OptionWizard.93 = SQLite (Embedded / нÑг файл дÑÑÑ€ тулгуурлаÑан) OptionWizard.94 = PostgreSQL -SaikuAnalysisListener.0 = à»àº¡à»ˆàº™ - ຂà»à»‰â€‹àº¡àº¹àº™ Refresh Saiku (ຂະ​ບວນ​àºàº²àº™â€‹àºàº²àº§â€‹) -SaikuAnalysisListener.1 = ບà»à»ˆ - ພຽງ​à»àº•່​ເລີ່ມ​ຕົ້ນ Saiku -SaikuStarter.1 = ເລີ່ມ Saiku -SaikuStarter.2 = u0EC0ລີ່ມ Saiku ສາ​ມາດ​ໃຊ້​ເວ​ລາ​ນາ​ທີ \= àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº¥à»â€‹àº–້າ ​\! -SaveEarthDataServlet.0 = àºàº²àº™â€‹àº®à»‰àº­àº‡â€‹àº‚à»â€‹à»€àº›àº»à»ˆàº² -SaveEarthDataServlet.1 = ບັນ​ຫາ​ທີ່​ເàºàºµàº”​ຂຶ້ນ​ໃນ​ຂະ​ນະ​ທີ່​ປະ​ຢັດ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ດ້ -SaveEarthDataServlet.2 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໄດ້​ບັນ​ທືຠ-SlopeCode.0 = ລຽບ (0-5​)àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -EarthApp.11 = ໃນ​ທົ່ວ​ໂລàºâ€‹à»àº¡à»ˆàº™â€‹à»àº¥à»‰àº§â€‹à»àº¥à»ˆàº™ -EarthApp.21 = ໄຟ​ທີ່​ມີ​ຕາ​ຂ່າàºâ€‹à»„ຟ​ຟ້າ​ຂອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ເປັນ CSV / CED à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹àºžàº»àºšâ€‹à»€àº«àº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹à»€àºªàº±à»‰àº™â€‹àº—າງ​ທີ່​ເລືອàºâ€‹\:
-EarthApp.23 = ບà»à»ˆâ€‹à»„ຟລ​໌ CSV / CED ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

-EarthApp.24 = ໄຟ​ທີ່​ມີ​à»àº¡à»ˆâ€‹à»àºšàºš Freemarker ທີ່​ມີ​ຄà»àº²â€‹àº™àº´â€‹àºàº²àº¡ KML ບà»à»ˆâ€‹à»„ດ້​ພົບ​ເຫັນ​ຢູ່​ໃນ​ເສັ້ນ​ທາງ​ທີ່​ເລືອàºâ€‹\:
-EarthApp.26 = ບà»à»ˆâ€‹à»„ຟລ​໌​ຄà»àº²â€‹àº™àº´â€‹àºàº²àº¡ KML ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

-EarthApp.27 = ໄຟ​ທີ່​ມີ​ຮູບ​à»àºšàºšâ€‹àº›àº¹àº¡â€‹à»€àº›àº»à»‰àº² HTML ໄດ້​à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹àºžàº»àºšâ€‹à»€àº«àº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹à»€àºªàº±à»‰àº™â€‹àº—າງ​ທີ່​ເລືອàºâ€‹\:
-EarthApp.29 = ບà»à»ˆâ€‹à»„ຟລ​໌​ປູມ​ເປົ້າ HTML ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

-EarthApp.3 = ເຕືອນ​ຂ້ອàºâ€‹àº•à»à»ˆâ€‹àº¡àº² -EarthApp.30 = àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹à»àºà»‰â€‹à»„ຂ​ສະ​ຖານ​ທີ່​ໄຟລ​໌​ຢູ່​ໃນ​ເມ​ນູ Tools-> Properties​. -EarthApp.4 = àºàº²àº™â€‹àº›àº±àºšâ€‹àº›àº¸àº‡â€‹à»ƒàº™â€‹àº›àº±àº”​ຈຸ​ບັນ -EarthApp.5 = ຢ່າ​ເຕືອນ​ຂ້າ​ພະ​ເຈົ້າ​ອີàºâ€‹à»€àº—ື່ອ​ຫນຶ່ງ -EarthApp.57 = ມີ​ສະ​ບັບ​ໃຫມ່​ຂອງ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹àº—ີ່​ມີ à»àº¡à»ˆàº™â€‹\!
ທ່ານ​ບà»à»ˆâ€‹àº•້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹? ເຕືອນ -EarthApp.58 = ປັບ​ປຸງ -EarthApp.59 Error \= ໃນ​ເວ​ລາ​ທີ່​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ເອ​àºàº°â€‹àºªàº²àº™â€‹à»‚ຄງ​àºàº²àº™ -EarthApp.6 = \ - ສະ​ບັບ -EarthApp.61 = ເອ​àºàº°â€‹àºªàº²àº™â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹à»„ດ້​ເàºàº±àºšâ€‹àºà»àº²â€‹àºšà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ຈະ​ເປີດ​ເຜີàºâ€‹.
àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹à»€àº®àº±àº”​ໃຫ້​à»àº™à»ˆâ€‹à»ƒàºˆàº§à»ˆâ€‹àº²â€‹àº—ີ່​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»àº¡à»ˆàº™â€‹àºàº²àº™â€‹àº•ິດ​ຕັ້ງ​. -EarthSurveyService.9 = ພາàºâ€‹àºªàº°â€‹àº«àº™àº²àº¡â€‹àº—ີ່​ຕ້ອງ​àºàº²àº™à»€àº­àº»àº² -ExportActionListener.1 = ວັນ​ທີ່​ຈະ​ບັນ​ທຶàºâ€‹àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àºˆàº²àºàº‚à»à»‰â€‹àº¡àº¹àº™ -ExportDialogProcessMonitor.0 àºàº²àº™â€‹àº›àº¸àº‡â€‹à»àº•່ງ \= ... -ExportDialogProcessMonitor.1 = ລà»â€‹àº–້າ​ທີ່​ຈະ​ເລີ່ມ​ຕົ້ນ​ຂະ​ບວນ​àºàº²àº™â€‹\:àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àº -ExportDialogProcessMonitor.4 =​\: -ImportProcessMonitorDialog.0 = àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​\: -ImportActionListener.0 = ຄວນ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àº—ີ່​ດິນ​ທີ່​ບà»à»ˆâ€‹à»„ດ້​ຮັບ​àºàº²àº™â€‹à»€àº•ີມ​ລົງ​ໄປ​ໃນ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ໄດ້ -ImportActionListener.2 = ຖ້າ​ທ່ານ​ຄລິàºâ€‹à»ƒàºªà»ˆ ບà»à»ˆ ພຽງ​à»àº•່​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºˆàº²àºâ€‹àºžàº²àºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ຢູ່​ໃນ​ສະ​ພາບ "ສີ​ຂຽວ​"​, ທີ່​ບັນ​ຈຸ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ັງ​ຫມົດ​ໄດ້​, ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​. -ImportActionListener.3 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ບັນ​ທຶàºâ€‹àº—າງ​àºàº²àº™â€‹àºªà»àº²â€‹à»€àº¥àº±àº”​ຮູບ -ImportDialogProcessMonitor.0 = \ ຄິດ​ໄລ່ -ImportDialogProcessMonitor.11 = ຈà»àº²â€‹àº™àº§àº™â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ​ຂອງ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹\: -ImportDialogProcessMonitor.2 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ບັນ​ທຶàºâ€‹àºàº²àº™ ... -ImportDialogProcessMonitor.5 = ຈ​à»â€‹àº²â€‹àº™àº§àº™â€‹àº•ົວ​ຈິງ​ຂອງ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​\:ຂà»à»‰â€‹àº¡àº¹àº™ -ImportDialogProcessMonitor.8 àºàº²àº™â€‹àº›àº¸àº‡â€‹à»àº•່ງ \= ... -InfiniteProgressMonitor.0 = àºàº»àºâ€‹à»€àº¥àºµàºâ€‹àºàº²àº™â€‹àº”à»àº²â€‹à»€àº™àºµàº™â€‹àº‡àº²àº™àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -JFileChooserExistsAware.0 = file ໂລàºâ€‹à»‚ຄງ​àºàº²àº™ -KmlImportService.13 = ເລືອàºâ€‹à»„ຟລ​໌ CSV ເພື່ອ​ຊ່ວàºâ€‹àº›àº°â€‹àº¢àº±àº”​ສະ​ຖານ​ຕອນ​ດິນ​ຂອງ​ຕົນ​ເພື່ອ -MissingPlotsListener.0 Error \= ໃນ​ຂະ​ນະ​ທີ່​àºàº²àº™â€‹à»„ດ້​ຮັບ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àº—ີ່​ດິນ​ບà»à»ˆâ€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ດ້ -MissingPlotsListener.1 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ໄປ -MissingPlotsListener.10 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ໃນ​àºàº²àº™â€‹àº­àº­àºâ€‹à»àºšàºšâ€‹àºªàº¸à»ˆàº¡â€‹àº•ົວ​ຢ່າງ​\: -MissingPlotsListener.12 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ຫາàºâ€‹à»„ປ​\: -MissingPlotsListener.14 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທັງ​ຫມົດ​à»àº¡à»ˆàº™â€‹à»„ດ້​ເຕີມ​ລົງ​ໄປ ​\!ເນື້ອ​ໃນ -MissingPlotsListener.2 = ຄັດ​ລອàºâ€‹à»„ປ​ທີ່ clipboardເອົາ -MissingPlotsListener.3 = ໄຟລ​໌​ທີ່​ບັນ​ຈຸ​ມີ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ສານ​ຕອນ​ດິນ​ຂອງ​ຕົນ (.csv ຫຼື​ໄຟລ​໌ .ced​) ສà»àº²â€‹àº¥àº±àºšâ€‹àº—ີ່​ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ຮູ້​ວ່າ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ັງ​ຫມົດ​ໄດ້​ຮັບ​àºàº²àº™â€‹à»€àº•ີມ​ລົງ​ໄປ​. -MissingPlotsListener.4 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຫາàºâ€‹à»„ປ - ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ສານ -MissingPlotsListener.5 = ຈາàºâ€‹à»„ຟ​\: -MissingPlotsListener.6 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ​ໄຟລ​໌ CED -ProcessMonitorDialog.1 = ຂà»à»‰â€‹àºœàº´àº”​ພາດ Parsing àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àºˆà»àº²â€‹àº™àº§àº™â€‹àºàº²àº™â€‹àº•ິດ​ຕà»à»ˆâ€‹àºàº±àº™ -ProcessMonitorDialog.4 = ຖັນ​, -ProcessMonitorDialog.5 = \ - ຄຸນ​ຄ່າ \ No newline at end of file +SaikuAnalysisListener.0 = Тийм - СÑргÑÑÑ… Saiku мÑдÑÑлÑл (урт үйл Ñвц) +SaikuAnalysisListener.1 = Үгүй - ЗүгÑÑÑ€ л Saiku ÑхлÑÑ… +SaikuStarter.1 Saiku ÑхлÑн \= +SaikuStarter.2 Saiku ÑхлÑн зарим нÑг минут үргÑлжилж болох \= түр хүлÑÑÐ½Ñ Ò¯Ò¯ \! +SaveEarthDataServlet.0 = ХооÑон Ñ…Ò¯ÑÑлт +SaveEarthDataServlet.1 = ÐÑуудлын мÑдÑÑллийн Ñанд мÑдÑÑлÑл Ñ…ÑмнÑÑ… гарлаа +SaveEarthDataServlet.2 = өгөгдөл хадгалÑан байна +SlopeCode.0 = Хавтгай (0-5) +EarthApp.11 = дÑлхий аль Ñ…Ñдийн ажиллаж байгаа цуглуулах +EarthApp.21 хашааны ÑүлжÑÑ Ð°Ð³ÑƒÑƒÐ»Ñан файлыг \= а CSV / CED ÑонгоÑон зам олж чадаагүй байна гÑж\:
<би> +EarthApp.23 = Ямар ч CSV / CED файл тохируулга байна\:

+EarthApp.24 = KML тодорхойлолт нь Freemarker загварыг агуулÑан файлыг ÑонгоÑон замаар олж ороогүй байна\:
<би> +EarthApp.26 = Ямар ч KML тодорхойлолт файл тохируулга байна\:

+EarthApp.27 = HTML бөмбөлөг Ñ…ÑлбÑрийг агуулÑан файлыг ÑонгоÑон замаар олж ороогүй байна\:
<би> +EarthApp.29 = Ямар ч HTML бөмбөлөг файл тохируулга байна\:

+EarthApp.3 = дараа нь надад Ñануул +EarthApp.30 = Ð¥ÑÑ€ÑгÑÑл цÑÑÑн дотрооÑ> Properties цÑÑ Ñ„Ð°Ð¹Ð»Ñ‹Ð½ байршлыг зөв оруулна уу. +EarthApp.4 = шинÑчлÑÑ… Одоо +EarthApp.5 = намайг дахин Ñануулах байхгүй юу +EarthApp.57 = <б> цуглуулж ДÑлхий боломжтой -ийн ÑˆÐ¸Ð½Ñ Ñ…ÑƒÐ²Ð¸Ð»Ð±Ð°Ñ€ байна\! Ð¥ÑÑ€Ñв та Ñ…ÑрхÑн цааш Ñ…Ò¯ÑÑж байна вÑ?
+EarthApp.58 = шинÑчлÑÑ… бөгөөд дохио авах байрлуулах +EarthApp.59 = Ðлдаа төÑөл файлыг импортлох +EarthApp.6 = \ - Хувилбар +EarthApp.61 = цуглуулж ДÑлхий файл, нÑÑлттÑй байж чадÑангүй.
Google Earth ÑуулгаÑан ÑÑÑхийг шалгана уу. +EarthSurveyService.9 = талбар шаардлагатай +ExportActionListener.1 = ÑхлÑн ÑкÑпортын Records-руу огноо Ñонгох +ExportDialogProcessMonitor.0 = боловÑруулах мÑдÑÑ ... +ExportDialogProcessMonitor.1 = үйл Ñвцыг Ñхлүүлж хүлÑÑж байна\: +ExportDialogProcessMonitor.4 = ÑкÑпортлох бүртгÑл\: +ImportProcessMonitorDialog.0 = Импортын бүртгÑл\: +ImportActionListener.0 = бүрÑн дүүрÑн чадаагүй байна талбайд өгөгдлийн импортын Ñ‘Ñтой юу? +ImportActionListener.2 = Та дарна бол <и> <б> NO бүх өгөгдлийг агуулÑан "ногоон" төлөвт талбайд, зөвхөн өгөгдөл оруулÑан болно. +ImportActionListener.3 = Импорт Ð±ÑƒÑ Ð±Ð¾Ð»Ð¾Ð²ÑруулÑан бүртгÑл +ImportDialogProcessMonitor.0 = ТООЦОЖ бичлÑгүүдийн ImportDialogProcessMonitor.11 \= Эхний дугаар\: +ImportDialogProcessMonitor.2 = бүртгÑл импортлож байна ... +Импортын бүртгÑл ImportDialogProcessMonitor.5 \= бодит тоо\: +ImportDialogProcessMonitor.8 = боловÑруулах мÑдÑÑ ... +InfiniteProgressMonitor.0 = ажиллагааг Cancel +JFileChooserExistsAware.0 = ДÑлхий төÑөл файлыг цуглуулах +KmlImportService.13 = тулд талбай байршлыг хадгалахын тулд CSV файлыг Ñонгоно уу +Database дÑÑÑ€ нь байхгүй хашааны-ий тухай мÑдÑÑлÑл авах бол MissingPlotsListener.0 \= алдаа +MissingPlotsListener.1 = хайж байна газрууд +MissingPlotsListener.10 = дÑÑж дизайн талбайд нийт тоо\: +MissingPlotsListener.12 = алга хашааны тоо\: +MissingPlotsListener.14 = мÑдÑÑлÑл талбай дүүрÑн байдаг \! +MissingPlotsListener.2 = Хуулах Бал нь агуулга +MissingPlotsListener.3 = Та бүх мÑдÑÑлÑл ирÑÑн дүүрÑн байÑан ÑÑÑхийг мÑдÑхийг Ñ…Ò¯ÑÑж байгаа нь хуйвалдаан мÑдÑÑлÑл (.csv ÑÑвÑл .ced файлууд) агуулÑан файлуудыг Ñонгоорой. +MissingPlotsListener.4 = хайж байна талбай - мÑдÑÑлÑл +MissingPlotsListener.5 Ñ„Ð°Ð¹Ð»Ð°Ð°Ñ \=\: +CED файлд MissingPlotsListener.6 \= ЭкÑпортын +мөр нь Ñ…Ñд Ñ…ÑдÑн ProcessMonitorDialog.1 \= магадлах алдаа +ProcessMonitorDialog.4 = багана +ProcessMonitorDialog.5 = \ - утгууд \ No newline at end of file From 3efc437d4cc9d4bc47d1666c57b79341f1665bd5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:35 +0100 Subject: [PATCH 0859/1620] New translations Messages_mn.properties (Portuguese) --- .../earth/app/view/Messages_pt.properties | 436 +++++++++--------- 1 file changed, 217 insertions(+), 219 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index e5b9bd9e45..7531b1f880 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,220 +1,218 @@ -AboutDialog.19 = ບັນ​ຫາ​ເàºàºµàº” A -AboutDialog.5 = ສà»àº²â€‹àº¥àº±àºšâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹à»€àºžàºµà»ˆàº¡â€‹à»€àº•ີມ​ໄດ້​ທີ່ OpenForis.org ເວັບ​ໄຊ​ທ​໌​ຂອງ​ພວàºâ€‹à»€àº®àº»àº² -AboutDialog.6 = ຂà»â€‹à»‚ທດ​ນà»àº²â€‹, ບັນ​ຫາ​ທີ່​ເàºàºµàº”​ຂຶ້ນ​ໃນ​ຂະ​ນະ​ທີ່​ຄວາມ​ພະ​àºàº²â€‹àºàº²àº¡â€‹àº—ີ່​ຈະ​ເປີດ​àºàº²àº™â€‹à»€àºŠàº·à»ˆàº­àº¡â€‹àº•à»à»ˆâ€‹àº™àºµà»‰â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹àº¥àº°â€‹àºšàº»àºšâ€‹àº‚ອງ​ທ່ານ​ຕົວ​ທ່ອງ​ເວັບ​ຂອງ​ມາດ​ຕະ​ຖານ​. -AboutDialog.8 = Ok -AspectCode.0 = ເຫນືອ -AspectCode.1 = ວັນ​ອອàºâ€‹àºªà»ˆàº½àº‡â€‹à»€àº«àº™àº·àº­ -AspectCode.2 = ຕາ​ເວັນ​ອອຠ-AspectCode.3 = ພາàºâ€‹à»ƒàº•້​, ຕາ​ເວັນ​ອອຠ-AspectCode.4 = ໃຕ້ -AspectCode.5 = ພາàºâ€‹à»ƒàº•້​, ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ-AspectCode.6 = ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ-AspectCode.7 = ພາàºâ€‹à»€àº«àº™àº·àº­â€‹, ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ-CollectEarthWindow.0 = ໃນ​ເວ​ລາ​ທີ່​ພະ​àºàº²â€‹àºàº²àº¡â€‹à»€àºžàº·à»ˆàº­â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌ CSVຄວາມ​ຜິດ​ພາດ -CollectEarthWindow.1 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àº -CollectEarthWindow.10 File \= -CollectEarthWindow.11 ອອàºâ€‹àºˆàº²àº \= -CollectEarthWindow.12 = ເຄື່ອງ​ມືຂà»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.13 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ CSV àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ -CollectEarthWindow.14 = Start SAIKU -CollectEarthWindow.15 = ຄຸນ​ສົມ​ບັດ -CollectEarthWindow.16 = ຊ່ວàºâ€‹à»€àº«àº¼àº·àº­ -CollectEarthWindow.17 = ປະ​ຕິ​ເສດ -CollectEarthWindow.18 = ຄົ້ນ​ຫາ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ຫາàºâ€‹à»„ປ​ໃນ​ຖານ​ຂà»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.19 = ເàºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ-CollectEarthWindow.2 = ພາ​ສາ -CollectEarthWindow.20 = ຈà»àº²â€‹àº™àº§àº™â€‹àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™ duplicated​\: -CollectEarthWindow.21 = ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ຊອàºâ€‹àº«àº² icon ສà»àº²â€‹àº¥àº±àºšâ€‹àºžàº²â€‹àº•ົ້ນ​ຕ໠-CollectEarthWindow.22 = ທ່ານ​ມີ​ຄວາມ​à»àº™à»ˆâ€‹à»ƒàºˆàº§à»ˆâ€‹àº²â€‹àº—່ານ​ຕ້ອງ​àºàº²àº™â€‹àº›àº´àº”​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹? ໃນ​àºàº²àº™â€‹àº›àº´àº”​ປ່ອງ​ຢ້ຽມ​àºàº±àº‡â€‹àºˆàº°â€‹àº›àº´àº”​ເຄື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹àº‚ອງ​ໂລàºâ€‹à»„ດ້​ເàºàº±àºšâ€‹àºà»àº² -CollectEarthWindow.23 = àºàº²àº™â€‹àº¢àº±à»‰àº‡â€‹àº¢àº·àº™â€‹àº—ີ່​ຈà»àº²â€‹à»€àº›àº±àº™ -CollectEarthWindow.24 = XML ສົ່ງ​ອອຠ-CollectEarthWindow.25 = ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ເພີ່ມ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹à»€àº«àº¼àº»à»ˆàº²â€‹àº™àºµà»‰â€‹à»àº¥à»‰àº§â€‹à»àº¥àº°â€‹àºàº²àº™â€‹àºªàº¹àº™â€‹à»€àºªàºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº‚ອງ​ທ່ານ​? -CollectEarthWindow.26 = ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™ -CollectEarthWindow.27 = ປັບ​ປຸງ -CollectEarthWindow.28 = ເຮັດ​ຢູ່​ຕ່າງ​ປະ​ເທດ​ເàºàº±àºšâ€‹àºà»àº²â€‹à»€àº„ື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹àº„ວນ​ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹à»àº¥à»ˆàº™â€‹à»ƒàº™â€‹àº‚ະ​ນະ​ທີ່​ຜູ້​ປະ​àºàº­àºšâ€‹àºàº²àº™â€‹àº•ີ​ຄວາມ​ຫມາàºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹. -CollectEarthWindow.29 = The Saiku Server ບà»à»ˆâ€‹à»„ດ້​ຖືàºâ€‹àº•ັ້ງ​. -CollectEarthWindow.3 = \ ຄວາມ​ຜິດ​ພາດ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ -CollectEarthWindow.30 = àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº®àº±àºâ€‹àºªàº²â€‹àºàº²àº™â€‹à»€àº›àºµàº”​ຫນ້າ​ຕ່າງ​ນີ້​ໃນ​ຂະ​ນະ​ທີ່​ທ່ານ​àºà»àº²â€‹àº¥àº±àº‡â€‹à»ƒàºŠà»‰â€‹àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹. -CollectEarthWindow.31 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌ CSV -CollectEarthWindow.32 = ອອຠ-CollectEarthWindow.33 = ຊື່​ຜູ້​ປະ​àºàº­àºšâ€‹àºàº²àº™â€‹àºˆàº°â€‹àº•້ອງ​ມີ​àºàº²àº™â€‹àº•à»à»ˆâ€‹à»„ປ​ອີàºâ€‹à»àº¥à»‰àº§â€‹àºâ€‹à»ˆâ€‹àº§àº² 5 ລັàºâ€‹àºªàº°â€‹àº™àº°â€‹à»àº¥àº°â€‹àºªàº±à»‰àº™â€‹àºâ€‹à»ˆâ€‹àº§àº² 50ຄວາມ​ຜິດ​ພາດ -CollectEarthWindow.34 = àºàº§àº”​ສອບ -CollectEarthWindow.35 = ຜູ້​ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹àº¥àº»àºšâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™ ​\! ຫລັàºâ€‹àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº•ື່ມ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàºªà»ˆâ€‹àºŠàº·à»ˆâ€‹àºœàº¹à»‰â€‹àº›àº°â€‹àºàº­àºšâ€‹àºàº²àº™â€‹à»àº¥àº°â€‹à»ƒàº«à»‰â€‹àºàº»àº”​ປຸ່ມ "ປັບ​ປຸງ​"​. ຊື່ -CollectEarthWindow.36 = ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹àºšà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ເປົ່າ -CollectEarthWindow.37 = ຮັàºâ€‹àºªàº²â€‹àºˆàº±àº™à»„ຟລ​໌ -CollectEarthWindow.38 = CSV -CollectEarthWindow.39 à»àºˆà»‰àº‡ \= ມັນ​ເປັນ​àºàº²àº™â€‹àºªàº»àº¡â€‹àº„ວນ​ທີ່​ທ່ານ​ໄປ​ເຖິງ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº‚ອງ​ທ່ານ (àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ XML​) àºà»ˆàº­àº™â€‹àº—ີ່​ຈະ​ໄດ້​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº«àº¡à»ˆâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ -CollectEarthWindow.4 = FAO à»àºˆà»‰àº‡â€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ເສດ -CollectEarthWindow.40 = ທີ່​àºà»àº²â€‹àº™àº»àº”​ໄວ້​ຕາມ​ເສັ້ນ​ທາງ​àºàº±àºšâ€‹à»‚ຟນ​ເດີ​ທີ່ Saiku Server ໄດ້​ຖືàºâ€‹àº•ິດ​ຕັ້ງ​ຢູ່​ໃນ Tools-> Properties-> à»àº–ບ​à»àºšàºšâ€‹àºžàº´â€‹à»€àºªàº”​ໄດ້​. -CollectEarthWindow.41 = àºàº²àº™â€‹àº›àº°â€‹àº«àºàº±àº”​àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌​\: -CollectEarthWindow.42 = ອອຠ-CollectEarthWindow.43 = àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº•à»àº²â€‹àºàº±àº™â€‹àº—ີ່​ພົບ​ເຫັນ -CollectEarthWindow.44 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ / ສົ່ງ​ອອàºàº‚à»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.45 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ XML (à»àº›â€‹)ຂà»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.46 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ໃຫມ່​ຈາàºâ€‹à»„ປ​ສະ​ນີ (XML à»àº›â€‹)àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™ -CollectEarthWindow.55 ປັບ​ປຸງ \= àºàº²àº™â€‹àº™à»àº²â€‹à»ƒàºŠà»‰ CSV -CollectEarthWindow.47 = Saiku Server ບà»à»ˆâ€‹à»„ດ້​àºà»àº²â€‹àº«àº™àº»àº” -CollectEarthWindow.48 = ໄຟລ​໌​ຫັດ​ໄປ​ສະໄຟລ​໌ -CollectEarthWindow.49 = Fusion CSV -CollectEarthWindow.5 = ປິດ -CollectEarthWindow.50 = ເປີດ​ຄູ່​ມື​àºàº²àº™â€‹à»ƒàºŠà»‰àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™â€‹àº›àº±àºšâ€‹àº›àº¸àº‡â€‹àº‚ອງ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ-CollectEarthWindow.51 CHECK \= àºàº§àº”​ສອບ -CollectEarthWindow.52 = File ເຂົ້າ​ສູ່​ລະ​ບົບ​ຄà»àº²â€‹àº®à»‰àº­àº‡â€‹àºªàº°â€‹àº«àº¡àº±àºâ€‹à»€àº›àºµàº” -CollectEarthWindow.53 = àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»€àº­â€‹àºàº°â€‹àºªàº²àº™â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹à»€àº‚ົ້າ​ສູ່​ລະ​ບົບຈຸດ -CollectEarthWindow.54 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຈາຠKMLàºà»ˆàº½àº§â€‹àºàº±àºš -CollectEarthWindow.56 = ... -CollectEarthWindow.57 = ຂະ​ບວນ​àºàº²àº™â€‹à»€àº¥àºµà»ˆàº¡â€‹àº•ົ້ນ Saiku à»àº¡à»ˆàº™â€‹àºàº±àº‡â€‹à»àº¥à»ˆàº™â€‹, àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº¥à»â€‹àº–້າ​. -CollectEarthWindow.58 = ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ເລີ່ມ​ຕົ້ນ​àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ Saiku -CollectEarthWindow.59 = ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ Re​\: àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ Saiku ໄດ້​?
ຂະ​ບວນ​àºàº²àº™â€‹àº™àºµà»‰â€‹àºªàº²â€‹àº¡àº²àº”​ໃຊ້​ເວ​ລາ​ຫຼາàº
ຖ້າ​ທ່ານ​ຄລິàºâ€‹à»ƒàºªà»ˆ "à»àº¡à»ˆàº™â€‹à»àº¥à»‰àº§â€‹" ເປັນ​ຊຸດ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໃຫມ່​ທີ່​ມີ​ຄວາມ​ຫຼ້າ​ສຸດ​ໄດ້​. ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº‚ຶ້ນ​. -CollectEarthWindow.6 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ Fusion ຕາ​ຕະ​ລາງàºàº²àº™â€‹àºœàº°â€‹àº¥àº´àº”​ຂà»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.60 = Saiku -CollectEarthWindow.61 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່ XML (àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº”ັດ​à»àºà»‰â€‹àº™àº±àºšâ€‹àº•ັ້ງ​à»àº•່​àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àºªàº¸àº”​ທ້າàºâ€‹) ສົ່ງ​ອອàºàºà»ˆàº½àº§â€‹àºàº±àºš -CollectEarthWindow.62 = ... -CollectEarthWindow.63 Error \= àºàº²àº™â€‹à»„ດ້​ຮັບ​ຈຸດ​ທີ່​ໄດ້​ຈາຠKML -CollectEarthWindow.64 = ສະ​ຫນັບ​ສະ​ຫນູນ​ທາງ​ເທàºâ€‹àº™àº´àº -CollectEarthWindow.7 Error \= ໃນ​ເວ​ລາ​ທີ່​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຂà»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.8 ຂà»à»‰â€‹àº„ວາມ​ປະ​ຕິ​ເສດ \= ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ພົບ​ເຫັນ -CollectEarthWindow.9 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໄດ້​ນà»àº²â€‹à»€àº‚ົ້າ​ມາ​ປະ​àºàº­àºšâ€‹àº”້ວàºâ€‹àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àº—ີ່​ມີ​ຢູ່​à»àº¥à»‰àº§â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚ອງ​ທ່ານ​. -DynamicsCode.0 = ປ່າ​ໄມ້​ໃນ​ເບື້ອງ​ຕົ້ນ -DynamicsCode.1 = ທົ່ງ​ຫàºà»‰àº²â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ -DynamicsCode.2 = àºàº²àº™â€‹àº•ັ້ງ​ຖິ່ນ​ຖານ​ໃນ​ເບື້ອງ​ຕົ້ນ -DynamicsCode.3 = ເບື້ອງ​ຕົ້ນ Otherland -DynamicsCode.4 = ຊຸ່ມ​ນ​້​à»àº²â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ -DynamicsCode.5 = ເບື້ອງ​ຕົ້ນ Cro​​pland -OpenTextFileListener.0 = ໄຟລ​໌​ຂà»à»‰â€‹àº„ວາມ​à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹à»„ດ້​ພົບ​ໄດ້​ທີ່​\:àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -OptionWizard.0 = ທາງ​ເລືອàºâ€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ-OptionWizard.1 = ເລືອàºâ€‹àº‚ອງ​ຕົວ​ທ່ອງ​ເວັບ -OptionWizard.10 = ໂຟ​ເດີ​ສà»àº²â€‹àº®àº­àº‡â€‹àºˆàº±àº™ -OptionWizard.11 = ບà»à»ˆâ€‹àº®àº¹à»‰â€‹àºˆàº±àºâ€‹\: àºàº²àº™â€‹àº™à»àº²â€‹à»ƒàºŠà»‰ ifconfig -OptionWizard.12 = ລູàºâ€‹àº„້າ​ຕົວ​ຢ່າງàºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -OptionWizard.13 = ໂລຠIP Serveràºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -OptionWizard.14 = port ໂລຠServer (ຕົວ​ຢ່າງ​\: 8023​) -OptionWizard.15 = ບັນ​ທຶàºâ€‹à»àº¥àº°â€‹à»ƒàºŠà»‰â€‹àºàº²àº™â€‹àº›à»ˆàº½àº™â€‹à»àº›àº‡ -OptionWizard.16 = ລະ​ຫັດ -OptionWizard.17 = X​-coord -OptionWizard.18 = Y coord​, -OptionWizard.19 = àºàº²àº™â€‹àºàº»àºâ€‹àº¥àº°â€‹àº”ັບ -OptionWizard.2 = ບວນ​àºàº²àº™â€‹à»€àº®àº±àº”​ວຽຠ(server / ລູàºâ€‹àº„້າ​) -OptionWizard.20 = ໄດ້​ເນື້ອ​ໃນ​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»„ດ້​ມີ​àºàº²àº™â€‹àº›à»ˆàº½àº™â€‹à»àº›àº‡â€‹.
àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº®àº±àºšâ€‹à»‚ຫລດ​ເນື້ອ​ຫາ​ໃນ​ເວ​ລາ​ທີ່​ທ່ານ​àºà»àº²â€‹àº¥àº±àº‡â€‹àº®àº±àºšâ€‹àºàº²àº™â€‹àºàº°â€‹àº•ຸ້ນ​ໂດàºâ€‹àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹. -OptionWizard.21 = ປັບ​ປຸງ​ສົບ​ຜົນ​ສà»àº²â€‹à»€àº¥àº±àº” -OptionWizard.22 = ຄ້ອຠ-OptionWizard.23 = ມີ​ຄວາມ​ຜິດ​ພາດ​ໃນ​ເວ​ລາ Re​\: ເປີດ​ໄດ້​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»€àº›àº±àº™â€‹à»„ດ້àºàº»àºâ€‹à»€àº¥àºµàºâ€‹àºàº²àº™ -OptionWizard.24 = àºàº»àºà»€àº¥àºµàºàºàº²àº™ -OptionWizard.25 = ຮູບ​à»àºšàºšâ€‹àºàº²àº™â€‹àº”à»àº²â€‹à»€àº™àºµàº™â€‹àº‡àº²àº™ -OptionWizard.26 = àºàº²àº™â€‹à»€àº›àº±àº™â€‹à»€àºˆàº»à»‰àº²â€‹àºžàº²àºš DB -OptionWizard.27 = ນີ້​ບà»à»ˆâ€‹à»„ດ້​ເປັນ​ທີ່​àºàº­àº¡â€‹àº®àº±àºš Saiku Folder (ເອ​àºàº°â€‹àºªàº²àº™â€‹à»€àº¥àºµà»ˆàº¡ saiku.bat ບà»à»ˆâ€‹à»àº¡à»ˆàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹) -OptionWizard.28 = Saiku Server ບà»à»ˆâ€‹àº®àº­àº‡â€‹àº®àº±àºš -OptionWizard.29 = ພ໠DB -OptionWizard.3 = Server ຕົວ​ຢ່າງ -OptionWizard.30 = ທາງ​ເລືອຠSQLite -OptionWizard.31 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº•ົວ​ຢ່າງ -OptionWizard.32 = ຮູບ​à»àºšàºšâ€‹àº”ິນ​ຕອນ -OptionWizard.33 = ສà»àº²â€‹àº«àº¼àº§àº”​ນຸ​àºàº»àº¡ -OptionWizard.34 = à»àºšàºšâ€‹àºžàº´â€‹à»€àºªàº” -OptionWizard.35 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ຈຸດ​ຕົວ​ຢ່າງ -OptionWizard.36 = ໄລ​àºàº°â€‹àº—າງ​ລະ​ຫວ່າງ​ຈຸດ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àº•ົວ​ຢ່າງ (ໃນ​ຕາ​) -OptionWizard.37 = ອັດ​ຕາ​ທີ່​ມີ​ຊາàºâ€‹à»àº”ນ​ດິນ​ຕອນ (à»àº¡àº±àº”​) -OptionWizard.38 = ໄຟລ​໌ CSV / CED ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ອ່ານ​ໄດ້​ຢ່າງ​ຖືàºâ€‹àº•້ອງ
ເອ​àºàº°â€‹àºªàº²àº™â€‹à»„ດ້​ຖືàºâ€‹àº„າດ​ວ່າ​ຈະ​ມີ​ມູນ​ຄ່າ​àºàº²àº™â€‹à»àºàºâ€‹àºˆàº¸â€‹àº¥àº°â€‹àºžàº²àºâ€‹à»€àºŠàº±à»ˆàº™â€‹àº™àºµà»‰â€‹\:​.
-OptionWizard.39 = ລະ​ຫັດ​, YCoordinate​, XCoordinate​, ພູ​, ລັàºâ€‹àºªàº°â€‹àº™àº° -OptionWizard.4 = IP ຄອມ​ພິວ​ເຕີ​ປັດ​ຈຸ​ບັນ​\: -OptionWizard.40 = ໂຄງ​àºàº²àº™ -OptionWizard.41 = ໂຫຼດ​ໄຟລ​໌​ໂຄງ​àºàº²àº™â€‹à»ƒàº«àº¡à»ˆ -OptionWizard.42 = ຜິດ​ພາດ​ໃນ​ເວ​ລາ​ປິດ​àºàº²àº™â€‹àº­à»ˆàº²àº™ CSV -OptionWizard.43 = ຊື່​ຂອງ​àºàº²àº™â€‹àºªà»àº²â€‹àº«àº¼àº§àº” -OptionWizard.44 = ຖານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ປ​ໃຫ້​ເຖິງ​ອັດ​ຕະ​ໂນ​ມັດ​ທີ່ -OptionWizard.45 = Open Earth Engine ຊູມ​ເຂົ້າ​ໄປ​ໃນ​ເຂດ​ຕອນ​ດິນ​ຂອງ​ຕົນ -OptionWizard.46 = timelapse ຈັàºâ€‹à»€àº›àºµàº”​ໂລàºâ€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºžàº·à»‰àº™â€‹àº—ີ່​ຕອນ​ດິນ​ຂອງ​ຕົນ -OptionWizard.47 = Open à»àºœàº™ Bing ສà»àº²â€‹àº¥àº±àºšâ€‹àºžàº·à»‰àº™â€‹àº—ີ່​ຕອນ​ດິນ​ຂອງ​ຕົນ -OptionWizard.48 = ຮູບ​à»àºšàºšâ€‹à»€àº›àºµàº”​ໃນ​ຕົວ​ທ່ອງ​ເວັບ​ຂອງ​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»„ດ້ (à»àº™àº°â€‹àº™à»àº²â€‹à»ƒàº«à»‰â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™ LINUX​) -OptionWizard.49 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™ Ced / csv ໄຟລ​໌​ທີ່​ມີ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº•ອນ​ດິນ​ຂອງ​ຕົນàºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -OptionWizard.5 = port ໂລຠServer​\: -OptionWizard.50 = Browse ... -OptionWizard.51 = ເອ​àºàº°â€‹àºªàº²àº™â€‹à»‚ຄງ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຜິດ​ພາດ -OptionWizard.52 = CSV / ເອ​àºàº°â€‹àºªàº²àº™ Ced ມີ​àºàº²àº™â€‹àº›àº°â€‹àºªàº²àº™â€‹àº‡àº²àº™â€‹à»€àº—ົ່າ​ນັ້ນ -OptionWizard.54 = ຈຸດ​ສູນ​àºàº²àº‡ -OptionWizard.55 = Error ໂຟນ​ເດີ​ໂຄງ​àºàº²àº™â€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ -OptionWizard.56 = ໂຄງ​àºàº²àº™ Load -OptionWizard.57 = ໂຄງ​àºàº²àº™ loaded àºà»ˆàº­àº™â€‹àº«àº™à»‰àº²â€‹àº™àºµà»‰ -OptionWizard.58 = Open GEE Code Editor (ຮຽàºâ€‹àº®à»‰àº­àº‡â€‹à»ƒàº«à»‰â€‹àº¡àºµâ€‹àºàº²àº™â€‹à»€àº‚ົ້າ​ເຖິງ Tester Trusted​) -OptionWizard.59 = Open ທີ່​ນີ້​à»àºœàº™â€‹àº—ີ່​ສຸມ​ໃສ່​ຕອນ​ດິນ​ຂອງ​ຕົນ -OptionWizard.6 = ຕົວ​àºà»àº²â€‹àº™àº»àº”​àºàº²àº™ PostgreSQL DB -OptionWizard.65 = ເສັ້ນ​ທາງ​àºàº±àºšâ€‹à»‚ຟນ​ເດີ​ທີ່ Saiku -OptionWizard.66 = Browse ... -OptionWizard.67 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ບັດ​àºàº²àº™ Firefox -OptionWizard.68 = Browse ... -OptionWizard.7 = ຊື່​ຜູ້​ໃຊ້ -OptionWizard.70 = àºàº²àº™â€‹àºšà»â€‹àº¥àº´â€‹àº«àº²àº™â€‹à»„ຟ -OptionWizard.72 = ໄຟລ​໌​ຖານ​ສອງ -OptionWizard.73 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ບັດ​àºàº²àº™ Chrome -OptionWizard.74 = Browse ... -OptionWizard.76 = àºàº²àº™â€‹àºšà»â€‹àº¥àº´â€‹àº«àº²àº™â€‹à»„ຟ -OptionWizard.78 = ໄຟລ​໌​ຖານ​ສອງ -OptionWizard.79 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹à»àºšàºš KML Freemarker -OptionWizard.8 = ລະ​ຫັດ​ຜ່ານ -OptionWizard.80 = Browse ... -OptionWizard.82 = à»àº¡à»ˆâ€‹à»àºšàºš Freemarker -OptionWizard.83 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº­àº­àºâ€‹à»àºšàºšâ€‹àº®àº¹àºšâ€‹à»àºšàºš HTML ປູມ​ເປົ້າ -OptionWizard.84 = Browse ... -OptionWizard.86 = HTML webpage -OptionWizard.87 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™ XML àºàº±àºšâ€‹àº„à»àº²â€‹àº™àº´â€‹àºàº²àº¡ IDM -OptionWizard.88 = Browse ... -OptionWizard.9 = ຊື່ DB -OptionWizard.90 = ຫມາຠIDM XML -OptionWizard.91 = Server (ສະ​ບັບ​ຜູ້​ຈັດ​àºàº²àº™â€‹àº«àº¼àº·â€‹àº¢àº·àº™â€‹àº¢àº¹à»ˆâ€‹àº„ົນ​ດຽວ​ໃຊ້​) -OptionWizard.92 = ລູàºâ€‹àº„້າ (ປະ​ຕິ​ບັດ​àºàº²àº™ / àºàº²àº™â€‹à»€àºŠàº·à»ˆàº­àº¡â€‹àº•à»à»ˆâ€‹àºàº±àºšâ€‹à»€àº„ື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹) -OptionWizard.93 = SQLite (à»àºšàºšâ€‹àºàº±àº‡ / ໄຟລ​໌​ດຽວ​ຕາມ​) +AboutDialog.19 = гарÑан нь аÑуудлыг +AboutDialog.5 = ДÑлгÑÑ€Ñнгүй мÑдÑÑллийг манай вÑб OpenForis.org очиж +AboutDialog.6 = Уучлаарай, аÑуудал нь таны ÑиÑтемийн Ñтандарт браузер ÑÐ½Ñ Ñ…Ð¾Ð»Ð±Ð¾Ð¾Ñыг нÑÑÑ… гÑж оролдож гарлаа. +AboutDialog.8 = Ок +AspectCode.0 = Хойд +AspectCode.1 = Зүүн Хойд +AspectCode.2 = Зүүн +AspectCode.3 = Зүүн-Өмнөд +AspectCode.4 = Өмнөд +AspectCode.5 = Баруун-Өмнөд +AspectCode.6 = Баруун +AspectCode.7 = Баруун Хойд +CollectEarthWindow.0 = CSV файл уруу өгөгдөл ÑкÑпортлох оролдож алдаа +CollectEarthWindow.1 = ЭкÑпортын алдаа +CollectEarthWindow.10 = Файлын +CollectEarthWindow.11 = Exit +CollectEarthWindow.12 Ñ…ÑÑ€ÑгÑÑл \= +CollectEarthWindow.13 = ЭкÑпортын CSV өгөгдөл +CollectEarthWindow.14 = Start SAIKU дүн шинжилгÑÑ +CollectEarthWindow.15 = Үл хөдлөх хөрөнгө +CollectEarthWindow.16 = туÑламж +CollectEarthWindow.17 = Disclaimer +CollectEarthWindow.18 = мÑдÑÑллийн Ñанд Ñураггүй алга газраа хай +CollectEarthWindow.19 = дÑлхийг цуглуулах +CollectEarthWindow.2 = Ñ…Ñл +CollectEarthWindow.20 = давхардÑан тоогоор бүртгÑлийн тоо\: +CollectEarthWindow.21 = гол хүрÑÑ Ð´Ò¯Ñ€Ñийг олж чадахгүй байна +CollectEarthWindow.22 = Ð¥ÑÑ€Ñв та цуглуулж дÑлхийг хаах Ñ…Ò¯ÑÑж байгаа гÑдÑгт итгÑлтÑй байна уу? Цонхыг хаах нь цуглуулж ДÑлхий Ñервер хаах болно
+CollectEarthWindow.23 = батлах Ñ…ÑÑ€ÑгтÑй +CollectEarthWindow.24 = XML ЭкÑпортын +CollectEarthWindow.25 = Та Ñмар ч байÑан ÑдгÑÑÑ€ бүртгÑлийг нÑмÑÑ…, таны одоогийн мÑдÑÑллийг алдах Ñ…Ò¯ÑÑж байна уу? +CollectEarthWindow.26 = Оператор +CollectEarthWindow.27 = шинÑчлÑÑ… +CollectEarthWindow.28 = <б> ÐÑÑлттÑй Foris оператор мÑдÑÑллийг хөрвүүлÑн ойлгох бол ДÑлхий Ñервер ажиллаж байх Ñ‘Ñтой цуглуулна. +CollectEarthWindow.29 = Saiku Ñерверийг тохируулаагүй байна. +CollectEarthWindow.3 = \ Импорт алдаа +CollectEarthWindow.30 = Та Google Earth ашиглаж байгаа бол ÑÐ½Ñ Ñ†Ð¾Ð½Ñ… нÑÑлттÑй байлгах уу. +CollectEarthWindow.31 = ЭкÑпортын CSV файлд мÑдÑÑллийг цуглуулÑан +CollectEarthWindow.32 = Quit +CollectEarthWindow.33 = операторын нÑÑ€ 5 Ñ‚ÑмдÑгтүүд болон 50 богино бодвол илүү урт байх Ñ‘Ñтой +CollectEarthWindow.34 = Баталгаажуулалт алдаа +CollectEarthWindow.35 = OPERATOR нÑÑ€ хооÑон \! Зар операторын нÑÑ€ бөглөх болон "шинÑчлÑÑ…" товчийг дарна уу. +CollectEarthWindow.36 = Оператор нÑÑ€ хооÑон байж болохгүй +CollectEarthWindow.37 = нÑÑлттÑй байлга +CollectEarthWindow.38 = CSV файлууд +CollectEarthWindow.39 = Ðнхааруулга\: Ð­Ð½Ñ Ð½ÑŒ зүйтÑй та нөөцлөх-ап таны одоогийн өгөгдөл (XML нь ЭкÑпортын) ÑˆÐ¸Ð½Ñ Ð¼ÑдÑÑллийг импортлогч өмнө +CollectEarthWindow.4 = ÐҮБ-ын ХХÐÐБ Disclaimer зар +CollectEarthWindow.40 Тодорхой хүртÑл \= Saiku Server Ð¥ÑÑ€ÑгÑÑл цÑÑÑн дотрооÑ> баÑлагт> ÐарийвчилÑан таб-д ÑуулгаÑан байна Ñ…Ð°Ð²Ñ‚Ð°Ñ Ð·Ð°Ð¼Ñ‹Ð³. +CollectEarthWindow.41 = Хадгаламж файл уруу өгөгдөл ÑкÑпортолÑон\: +CollectEarthWindow.42 = Quit +CollectEarthWindow.43 = ЗөрчилтÑй бүртгÑл олдлоо +CollectEarthWindow.44 = МÑдÑÑллийн Импорт / ЭкÑпортын +XML гÑж CollectEarthWindow.45 \= ЭкÑпортын мÑдÑÑ (шахÑан) +Zip-Ð°Ð°Ñ CollectEarthWindow.46 \= Импортын ÑˆÐ¸Ð½Ñ Ð¼ÑдÑÑ (шахÑан XML) +CSV ашиглан CollectEarthWindow.55 \= шинÑчлÑÑ… одоогийн бүртгÑл +CollectEarthWindow.47 = Saiku Ñерверийг тохируулаагүй бол +CollectEarthWindow.48 = Zip / цуглуулах-өгөгдлийн файлууд +CollectEarthWindow.49 = Fusion CSV файлууд +CollectEarthWindow.5 = Хаах +CollectEarthWindow.50 = ÐÑÑлттÑй Ñ…ÑÑ€ÑглÑгчийн гарын авлага +Цуглуулж дÑлхийн шинÑчлÑлтүүдийн хувьд CollectEarthWindow.51 \= шалгах +CollectEarthWindow.52 = ÐÑÑлттÑй Application нÑвтрÑÑ… Файлын +CollectEarthWindow.53 = цуглуулах ДÑлхий нÑвтрÑÑ… файл +KML нь CollectEarthWindow.54 \= ачааллын оноо +CollectEarthWindow.56 = тухай ... +CollectEarthWindow.57 = Saiku гарааны үйл Ñвц одоо ч ажиллаж байгаа, түр хүлÑÑÐ½Ñ Ò¯Ò¯. +CollectEarthWindow.58 = Saiku шинжилгÑÑг Ñхлүүлж чадахгүй +CollectEarthWindow.59 = Ð¥ÑÑ€Ñв та Saiku дүн шинжилгÑÑ Ñ…Ð¸Ð¹Ñ… мÑдÑÑллийн Ñанг дахин бий болгох Ñ…Ò¯ÑÑж байна уу?
Ð­Ð½Ñ Ò¯Ð¹Ð» Ñвц нь цаг хугацаа шаардÑан ажил байж болох юм.
Та хамгийн Ñүүлийн үеийн нь "YES" ÑˆÐ¸Ð½Ñ Ð´Ð°Ñ‚Ð°Ñетийн дÑÑÑ€ товшино уу мÑдÑÑллийг бий болно. +Fusion Ð¥Ò¯ÑнÑгт нь CollectEarthWindow.6 \= ЭкÑпортын +CollectEarthWindow.60 = Saiku мÑдÑÑ Ò¯ÐµÐ¸Ð¹Ð½ +CollectEarthWindow.61 = ЭкÑпортын XML өгөгдөл (Ñүүлийн ÑкÑпортын хойш өөрчлөгдÑөн бүртгÑл) +CollectEarthWindow.62 = тухай ... +CollectEarthWindow.63 = Ðлдаа KML авÑан оноо авах +CollectEarthWindow.64 = техникийн дÑмжлÑг үзүүлÑÑ… +CollectEarthWindow.7 = алдаа мÑдÑÑлÑл импортлох +CollectEarthWindow.8 = Disclaimer текÑÑ‚ олж чадахгүй байна +CollectEarthWindow.9 = оруулÑан мÑдÑÑллийг өөрийн мÑдÑÑллийн Ñанд нь байгаа бичлÑгийг агуулж байдаг. +DynamicsCode.0 = ЭхлÑÑд ой +DynamicsCode.1 = ЭхлÑÑд БÑлчÑÑрийн +DynamicsCode.2 = ЭхлÑÑд шийдвÑрлÑÑ… +DynamicsCode.3 = ЭхлÑÑд Otherland +DynamicsCode.4 = ЭхлÑÑд Ð£Ñ Ð½Ð°Ð¼Ð³Ð°Ñ€Ñ…Ð°Ð³ газрын +DynamicsCode.5 = ЭхлÑÑд Тариалангийн +OpenTextFileListener.0 = текÑÑ‚ файл олж байÑан юм\: +OptionWizard.0 = ДÑлхий Ñонголт цуглуулах +OptionWizard.1 = Хөтөч Ñонгоно уу +OptionWizard.10 = ÐÑÑлттÑй нөөц Ñ…Ð°Ð²Ñ‚Ð°Ñ +OptionWizard.11 = Тодорхойгүй\: ашиглах ifconfig +OptionWizard.12 = Ð¥ÑÑ€ÑглÑгч шатны +OptionWizard.13 = ДÑлхий Server IP цуглуулах +OptionWizard.14 = ДÑлхий Server портыг (жишÑÑ Ð½ÑŒ\: 8023) цуглуулах +OptionWizard.15 = Save & өөрчлөлт хийх +OptionWizard.16 = ID +OptionWizard.17 = X-coord +OptionWizard.18 = Y-coord +OptionWizard.19 = Elevation +OptionWizard.2 = урÑгал даÑгалын (Ñервер / үйлчлүүлÑгч) + OptionWizard.20 \= Google Earth агуулга нь өөрчлөгдÑөн байна.
Ðгуулга нь ачаалах хүлÑÑн авна уу та Google Earth-ÑÑÑ Ð°Ñуух үед. +OptionWizard.21 = шинÑчлÑÑ… амжилттай +OptionWizard.22 = Ð¥Ñвгий +OptionWizard.23 = дахин нÑÑÑ… Google Earth мÑдÑÑллийг үед алдаа гарлаа +OptionWizard.24 = Болих +OptionWizard.25 = үйл ажиллагааны горим +OptionWizard.26 = DB хоÑÑ‚ +OptionWizard.27 = Ð­Ð½Ñ Ð½ÑŒ хүлÑÑн зөвшөөрөгдÑөн Saiku Folder (ÑхлÑÑ… saiku.bat файл байхгүй бол) ороогүй байна +OptionWizard.28 = Saiku Server хүлÑÑн зөвшөөрөөгүй +OptionWizard.29 = DB порт +OptionWizard.3 = Server шатны +OptionWizard.30 = SQLite Ñонголт +OptionWizard.31 = ЖишÑÑ Ð¼ÑдÑÑлÑл +OptionWizard.32 = Plot зохион байгуулалт +OptionWizard.33 = Ñудалгаа тодорхойлолт +OptionWizard.34 = ÐарийвчилÑан +OptionWizard.35 = түүвÑÑ€ цÑгийн тоо +OptionWizard.36 = (метр) дÑÑж авах цÑгийн хоорондох зай +(Метр) ДÑÑж авах цÑгүүд OptionWizard.95 \= Side +OptionWizard.38 = CSV / CED файлыг зөв уншиж чадахгүй байгаа файлыг
иймÑрхүү таÑлалаар туÑгаарлаж утгыг байх төлөвтÑй байна\:.
<Б> +OptionWizard.39 = ID, YCoordinate, XCoordinate, өндрийн, налуу, тал +OptionWizard.4 = Одоогийн компьютерийн IP\: +OptionWizard.40 = төÑлүүд +OptionWizard.41 = ÑˆÐ¸Ð½Ñ Ñ‚Ó©Ñөл файлыг ачаалж +OptionWizard.42 = Ðлдаа CSV уншигч хаах +Судалгааны OptionWizard.43 \= нÑÑ€ +OptionWizard.44 = автоматаар нөөцлөх хүртÑл өгөгдлийн Ñан дÑÑÑ€ +OptionWizard.45 = ÐÑÑлттÑй Earth Engine талбай талбай руу томруулÑан +талбай мÑдÑÑлÑл / CSV файлыг ced нь OptionWizard.49 \= зам +Харин Google Earth-ийн браузер дÑÑÑ€ OptionWizard.48 \= ÐÑÑлттÑй Ñ…ÑлбÑÑ€ (ЛинукÑд зориулÑан байлгахыг зөвлөдөг) +OptionWizard.5 = цуглуулах ДÑлхий Server портыг\: +OptionWizard.50 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.51 = Ðлдаа импортлох төÑөл файл +Зөвхөн координат нь OptionWizard.52 \= CSV / CED файл +OptionWizard.53 = талбай +OptionWizard.54 = Төв цÑг нь +OptionWizard.55 = Ðлдаа импортлох төÑөл Ñ…Ð°Ð²Ñ‚Ð°Ñ +OptionWizard.56 = ачааллын төÑөл +OptionWizard.57 = Өмнө нь дуудагддаг төÑөл +OptionWizard.58 = ÐÑÑлттÑй Gee тоглоомын талбай (Trusted Tester хандах шаардлагатай) +OptionWizard.59 = ÐÑÑлттÑй Энд Maps газар дÑÑÑ€ анхаарлаа хандуулж +OptionWizard.6 = PostgreSQL DB параметрүүд +OptionWizard.65 = Saiku хавтÑанд зам +OptionWizard.66 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.67 = Firefox гүйцÑтгÑгдÑÑ… нь зам +OptionWizard.68 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.7 = Ð¥ÑÑ€ÑглÑгчийн нÑÑ€ +OptionWizard.70 = гүйцÑтгÑгдÑÑ… файлууд +OptionWizard.72 = Хоёртын файлууд +OptionWizard.73 = Chrome гүйцÑтгÑгдÑÑ… нь зам +OptionWizard.74 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.76 = гүйцÑтгÑгдÑÑ… файлууд +OptionWizard.78 = Хоёртын файлууд +OptionWizard.79 = KML Freemarker загварт зам +OptionWizard.8 = Ðууц үг +OptionWizard.80 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.82 = Freemarker загвар +OptionWizard.83 = HTML бөмбөлөг Ñ…ÑлбÑÑ€ дизайн зам +OptionWizard.84 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.86 = HTML вÑб Ñ…ÑƒÑƒÐ´Ð°Ñ +OptionWizard.87 = IDM тодорхойлолт нь XML нь зам +OptionWizard.88 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.9 = DB нÑÑ€ +OptionWizard.90 = XML IDM тодорхойлолт +OptionWizard.91 = Server (менежер хувилбар, ÑÑвÑл дангаараа ашиглах нь) +OptionWizard.92 = Ð¥ÑÑ€ÑглÑгч (оператор / Ñервер уруу холбогдÑон) +OptionWizard.93 = SQLite (Embedded / нÑг файл дÑÑÑ€ тулгуурлаÑан) OptionWizard.94 = PostgreSQL -SaikuAnalysisListener.0 = à»àº¡à»ˆàº™ - ຂà»à»‰â€‹àº¡àº¹àº™ Refresh Saiku (ຂະ​ບວນ​àºàº²àº™â€‹àºàº²àº§â€‹) -SaikuAnalysisListener.1 = ບà»à»ˆ - ພຽງ​à»àº•່​ເລີ່ມ​ຕົ້ນ Saiku -SaikuStarter.1 = ເລີ່ມ Saiku -SaikuStarter.2 = u0EC0ລີ່ມ Saiku ສາ​ມາດ​ໃຊ້​ເວ​ລາ​ນາ​ທີ \= àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº¥à»â€‹àº–້າ ​\! -SaveEarthDataServlet.0 = àºàº²àº™â€‹àº®à»‰àº­àº‡â€‹àº‚à»â€‹à»€àº›àº»à»ˆàº² -SaveEarthDataServlet.1 = ບັນ​ຫາ​ທີ່​ເàºàºµàº”​ຂຶ້ນ​ໃນ​ຂະ​ນະ​ທີ່​ປະ​ຢັດ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ດ້ -SaveEarthDataServlet.2 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໄດ້​ບັນ​ທືຠ-SlopeCode.0 = ລຽບ (0-5​)àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -EarthApp.11 = ໃນ​ທົ່ວ​ໂລàºâ€‹à»àº¡à»ˆàº™â€‹à»àº¥à»‰àº§â€‹à»àº¥à»ˆàº™ -EarthApp.21 = ໄຟ​ທີ່​ມີ​ຕາ​ຂ່າàºâ€‹à»„ຟ​ຟ້າ​ຂອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ເປັນ CSV / CED à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹àºžàº»àºšâ€‹à»€àº«àº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹à»€àºªàº±à»‰àº™â€‹àº—າງ​ທີ່​ເລືອàºâ€‹\:
-EarthApp.23 = ບà»à»ˆâ€‹à»„ຟລ​໌ CSV / CED ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

-EarthApp.24 = ໄຟ​ທີ່​ມີ​à»àº¡à»ˆâ€‹à»àºšàºš Freemarker ທີ່​ມີ​ຄà»àº²â€‹àº™àº´â€‹àºàº²àº¡ KML ບà»à»ˆâ€‹à»„ດ້​ພົບ​ເຫັນ​ຢູ່​ໃນ​ເສັ້ນ​ທາງ​ທີ່​ເລືອàºâ€‹\:
-EarthApp.26 = ບà»à»ˆâ€‹à»„ຟລ​໌​ຄà»àº²â€‹àº™àº´â€‹àºàº²àº¡ KML ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

-EarthApp.27 = ໄຟ​ທີ່​ມີ​ຮູບ​à»àºšàºšâ€‹àº›àº¹àº¡â€‹à»€àº›àº»à»‰àº² HTML ໄດ້​à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹àºžàº»àºšâ€‹à»€àº«àº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹à»€àºªàº±à»‰àº™â€‹àº—າງ​ທີ່​ເລືອàºâ€‹\:
-EarthApp.29 = ບà»à»ˆâ€‹à»„ຟລ​໌​ປູມ​ເປົ້າ HTML ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

-EarthApp.3 = ເຕືອນ​ຂ້ອàºâ€‹àº•à»à»ˆâ€‹àº¡àº² -EarthApp.30 = àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹à»àºà»‰â€‹à»„ຂ​ສະ​ຖານ​ທີ່​ໄຟລ​໌​ຢູ່​ໃນ​ເມ​ນູ Tools-> Properties​. -EarthApp.4 = àºàº²àº™â€‹àº›àº±àºšâ€‹àº›àº¸àº‡â€‹à»ƒàº™â€‹àº›àº±àº”​ຈຸ​ບັນ -EarthApp.5 = ຢ່າ​ເຕືອນ​ຂ້າ​ພະ​ເຈົ້າ​ອີàºâ€‹à»€àº—ື່ອ​ຫນຶ່ງ -EarthApp.57 = ມີ​ສະ​ບັບ​ໃຫມ່​ຂອງ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹àº—ີ່​ມີ à»àº¡à»ˆàº™â€‹\!
ທ່ານ​ບà»à»ˆâ€‹àº•້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹? ເຕືອນ -EarthApp.58 = ປັບ​ປຸງ -EarthApp.59 Error \= ໃນ​ເວ​ລາ​ທີ່​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ເອ​àºàº°â€‹àºªàº²àº™â€‹à»‚ຄງ​àºàº²àº™ -EarthApp.6 = \ - ສະ​ບັບ -EarthApp.61 = ເອ​àºàº°â€‹àºªàº²àº™â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹à»„ດ້​ເàºàº±àºšâ€‹àºà»àº²â€‹àºšà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ຈະ​ເປີດ​ເຜີàºâ€‹.
àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹à»€àº®àº±àº”​ໃຫ້​à»àº™à»ˆâ€‹à»ƒàºˆàº§à»ˆâ€‹àº²â€‹àº—ີ່​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»àº¡à»ˆàº™â€‹àºàº²àº™â€‹àº•ິດ​ຕັ້ງ​. -EarthSurveyService.9 = ພາàºâ€‹àºªàº°â€‹àº«àº™àº²àº¡â€‹àº—ີ່​ຕ້ອງ​àºàº²àº™à»€àº­àº»àº² -ExportActionListener.1 = ວັນ​ທີ່​ຈະ​ບັນ​ທຶàºâ€‹àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àºˆàº²àºàº‚à»à»‰â€‹àº¡àº¹àº™ -ExportDialogProcessMonitor.0 àºàº²àº™â€‹àº›àº¸àº‡â€‹à»àº•່ງ \= ... -ExportDialogProcessMonitor.1 = ລà»â€‹àº–້າ​ທີ່​ຈະ​ເລີ່ມ​ຕົ້ນ​ຂະ​ບວນ​àºàº²àº™â€‹\:àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àº -ExportDialogProcessMonitor.4 =​\: -ImportProcessMonitorDialog.0 = àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​\: -ImportActionListener.0 = ຄວນ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àº—ີ່​ດິນ​ທີ່​ບà»à»ˆâ€‹à»„ດ້​ຮັບ​àºàº²àº™â€‹à»€àº•ີມ​ລົງ​ໄປ​ໃນ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ໄດ້ -ImportActionListener.2 = ຖ້າ​ທ່ານ​ຄລິàºâ€‹à»ƒàºªà»ˆ ບà»à»ˆ ພຽງ​à»àº•່​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºˆàº²àºâ€‹àºžàº²àºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ຢູ່​ໃນ​ສະ​ພາບ "ສີ​ຂຽວ​"​, ທີ່​ບັນ​ຈຸ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ັງ​ຫມົດ​ໄດ້​, ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​. -ImportActionListener.3 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ບັນ​ທຶàºâ€‹àº—າງ​àºàº²àº™â€‹àºªà»àº²â€‹à»€àº¥àº±àº”​ຮູບ -ImportDialogProcessMonitor.0 = \ ຄິດ​ໄລ່ -ImportDialogProcessMonitor.11 = ຈà»àº²â€‹àº™àº§àº™â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ​ຂອງ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹\: -ImportDialogProcessMonitor.2 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ບັນ​ທຶàºâ€‹àºàº²àº™ ... -ImportDialogProcessMonitor.5 = ຈ​à»â€‹àº²â€‹àº™àº§àº™â€‹àº•ົວ​ຈິງ​ຂອງ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​\:ຂà»à»‰â€‹àº¡àº¹àº™ -ImportDialogProcessMonitor.8 àºàº²àº™â€‹àº›àº¸àº‡â€‹à»àº•່ງ \= ... -InfiniteProgressMonitor.0 = àºàº»àºâ€‹à»€àº¥àºµàºâ€‹àºàº²àº™â€‹àº”à»àº²â€‹à»€àº™àºµàº™â€‹àº‡àº²àº™àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -JFileChooserExistsAware.0 = file ໂລàºâ€‹à»‚ຄງ​àºàº²àº™ -KmlImportService.13 = ເລືອàºâ€‹à»„ຟລ​໌ CSV ເພື່ອ​ຊ່ວàºâ€‹àº›àº°â€‹àº¢àº±àº”​ສະ​ຖານ​ຕອນ​ດິນ​ຂອງ​ຕົນ​ເພື່ອ -MissingPlotsListener.0 Error \= ໃນ​ຂະ​ນະ​ທີ່​àºàº²àº™â€‹à»„ດ້​ຮັບ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àº—ີ່​ດິນ​ບà»à»ˆâ€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ດ້ -MissingPlotsListener.1 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ໄປ -MissingPlotsListener.10 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ໃນ​àºàº²àº™â€‹àº­àº­àºâ€‹à»àºšàºšâ€‹àºªàº¸à»ˆàº¡â€‹àº•ົວ​ຢ່າງ​\: -MissingPlotsListener.12 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ຫາàºâ€‹à»„ປ​\: -MissingPlotsListener.14 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທັງ​ຫມົດ​à»àº¡à»ˆàº™â€‹à»„ດ້​ເຕີມ​ລົງ​ໄປ ​\!ເນື້ອ​ໃນ -MissingPlotsListener.2 = ຄັດ​ລອàºâ€‹à»„ປ​ທີ່ clipboardເອົາ -MissingPlotsListener.3 = ໄຟລ​໌​ທີ່​ບັນ​ຈຸ​ມີ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ສານ​ຕອນ​ດິນ​ຂອງ​ຕົນ (.csv ຫຼື​ໄຟລ​໌ .ced​) ສà»àº²â€‹àº¥àº±àºšâ€‹àº—ີ່​ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ຮູ້​ວ່າ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ັງ​ຫມົດ​ໄດ້​ຮັບ​àºàº²àº™â€‹à»€àº•ີມ​ລົງ​ໄປ​. -MissingPlotsListener.4 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຫາàºâ€‹à»„ປ - ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ສານ -MissingPlotsListener.5 = ຈາàºâ€‹à»„ຟ​\: -MissingPlotsListener.6 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ​ໄຟລ​໌ CED -ProcessMonitorDialog.1 = ຂà»à»‰â€‹àºœàº´àº”​ພາດ Parsing àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àºˆà»àº²â€‹àº™àº§àº™â€‹àºàº²àº™â€‹àº•ິດ​ຕà»à»ˆâ€‹àºàº±àº™ -ProcessMonitorDialog.4 = ຖັນ​, -ProcessMonitorDialog.5 = \ - ຄຸນ​ຄ່າ \ No newline at end of file +SaikuAnalysisListener.0 = Тийм - СÑргÑÑÑ… Saiku мÑдÑÑлÑл (урт үйл Ñвц) +SaikuAnalysisListener.1 = Үгүй - ЗүгÑÑÑ€ л Saiku ÑхлÑÑ… +SaikuStarter.1 Saiku ÑхлÑн \= +SaikuStarter.2 Saiku ÑхлÑн зарим нÑг минут үргÑлжилж болох \= түр хүлÑÑÐ½Ñ Ò¯Ò¯ \! +SaveEarthDataServlet.0 = ХооÑон Ñ…Ò¯ÑÑлт +SaveEarthDataServlet.1 = ÐÑуудлын мÑдÑÑллийн Ñанд мÑдÑÑлÑл Ñ…ÑмнÑÑ… гарлаа +SaveEarthDataServlet.2 = өгөгдөл хадгалÑан байна +SlopeCode.0 = Хавтгай (0-5) +EarthApp.11 = дÑлхий аль Ñ…Ñдийн ажиллаж байгаа цуглуулах +EarthApp.21 хашааны ÑүлжÑÑ Ð°Ð³ÑƒÑƒÐ»Ñан файлыг \= а CSV / CED ÑонгоÑон зам олж чадаагүй байна гÑж\:
<би> +EarthApp.23 = Ямар ч CSV / CED файл тохируулга байна\:

+EarthApp.24 = KML тодорхойлолт нь Freemarker загварыг агуулÑан файлыг ÑонгоÑон замаар олж ороогүй байна\:
<би> +EarthApp.26 = Ямар ч KML тодорхойлолт файл тохируулга байна\:

+EarthApp.27 = HTML бөмбөлөг Ñ…ÑлбÑрийг агуулÑан файлыг ÑонгоÑон замаар олж ороогүй байна\:
<би> +EarthApp.29 = Ямар ч HTML бөмбөлөг файл тохируулга байна\:

+EarthApp.3 = дараа нь надад Ñануул +EarthApp.30 = Ð¥ÑÑ€ÑгÑÑл цÑÑÑн дотрооÑ> Properties цÑÑ Ñ„Ð°Ð¹Ð»Ñ‹Ð½ байршлыг зөв оруулна уу. +EarthApp.4 = шинÑчлÑÑ… Одоо +EarthApp.5 = намайг дахин Ñануулах байхгүй юу +EarthApp.57 = <б> цуглуулж ДÑлхий боломжтой -ийн ÑˆÐ¸Ð½Ñ Ñ…ÑƒÐ²Ð¸Ð»Ð±Ð°Ñ€ байна\! Ð¥ÑÑ€Ñв та Ñ…ÑрхÑн цааш Ñ…Ò¯ÑÑж байна вÑ?
+EarthApp.58 = шинÑчлÑÑ… бөгөөд дохио авах байрлуулах +EarthApp.59 = Ðлдаа төÑөл файлыг импортлох +EarthApp.6 = \ - Хувилбар +EarthApp.61 = цуглуулж ДÑлхий файл, нÑÑлттÑй байж чадÑангүй.
Google Earth ÑуулгаÑан ÑÑÑхийг шалгана уу. +EarthSurveyService.9 = талбар шаардлагатай +ExportActionListener.1 = ÑхлÑн ÑкÑпортын Records-руу огноо Ñонгох +ExportDialogProcessMonitor.0 = боловÑруулах мÑдÑÑ ... +ExportDialogProcessMonitor.1 = үйл Ñвцыг Ñхлүүлж хүлÑÑж байна\: +ExportDialogProcessMonitor.4 = ÑкÑпортлох бүртгÑл\: +ImportProcessMonitorDialog.0 = Импортын бүртгÑл\: +ImportActionListener.0 = бүрÑн дүүрÑн чадаагүй байна талбайд өгөгдлийн импортын Ñ‘Ñтой юу? +ImportActionListener.2 = Та дарна бол <и> <б> NO бүх өгөгдлийг агуулÑан "ногоон" төлөвт талбайд, зөвхөн өгөгдөл оруулÑан болно. +ImportActionListener.3 = Импорт Ð±ÑƒÑ Ð±Ð¾Ð»Ð¾Ð²ÑруулÑан бүртгÑл +ImportDialogProcessMonitor.0 = ТООЦОЖ бичлÑгүүдийн ImportDialogProcessMonitor.11 \= Эхний дугаар\: +ImportDialogProcessMonitor.2 = бүртгÑл импортлож байна ... +Импортын бүртгÑл ImportDialogProcessMonitor.5 \= бодит тоо\: +ImportDialogProcessMonitor.8 = боловÑруулах мÑдÑÑ ... +InfiniteProgressMonitor.0 = ажиллагааг Cancel +JFileChooserExistsAware.0 = ДÑлхий төÑөл файлыг цуглуулах +KmlImportService.13 = тулд талбай байршлыг хадгалахын тулд CSV файлыг Ñонгоно уу +Database дÑÑÑ€ нь байхгүй хашааны-ий тухай мÑдÑÑлÑл авах бол MissingPlotsListener.0 \= алдаа +MissingPlotsListener.1 = хайж байна газрууд +MissingPlotsListener.10 = дÑÑж дизайн талбайд нийт тоо\: +MissingPlotsListener.12 = алга хашааны тоо\: +MissingPlotsListener.14 = мÑдÑÑлÑл талбай дүүрÑн байдаг \! +MissingPlotsListener.2 = Хуулах Бал нь агуулга +MissingPlotsListener.3 = Та бүх мÑдÑÑлÑл ирÑÑн дүүрÑн байÑан ÑÑÑхийг мÑдÑхийг Ñ…Ò¯ÑÑж байгаа нь хуйвалдаан мÑдÑÑлÑл (.csv ÑÑвÑл .ced файлууд) агуулÑан файлуудыг Ñонгоорой. +MissingPlotsListener.4 = хайж байна талбай - мÑдÑÑлÑл +MissingPlotsListener.5 Ñ„Ð°Ð¹Ð»Ð°Ð°Ñ \=\: +CED файлд MissingPlotsListener.6 \= ЭкÑпортын +мөр нь Ñ…Ñд Ñ…ÑдÑн ProcessMonitorDialog.1 \= магадлах алдаа +ProcessMonitorDialog.4 = багана +ProcessMonitorDialog.5 = \ - утгууд \ No newline at end of file From 124a1a65597c968a76f60d081689ba6381370cde Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:37 +0100 Subject: [PATCH 0860/1620] New translations Messages_mn.properties (English) --- .../earth/app/view/Messages_en.properties | 436 +++++++++--------- 1 file changed, 217 insertions(+), 219 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index e5b9bd9e45..7531b1f880 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,220 +1,218 @@ -AboutDialog.19 = ບັນ​ຫາ​ເàºàºµàº” A -AboutDialog.5 = ສà»àº²â€‹àº¥àº±àºšâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹à»€àºžàºµà»ˆàº¡â€‹à»€àº•ີມ​ໄດ້​ທີ່ OpenForis.org ເວັບ​ໄຊ​ທ​໌​ຂອງ​ພວàºâ€‹à»€àº®àº»àº² -AboutDialog.6 = ຂà»â€‹à»‚ທດ​ນà»àº²â€‹, ບັນ​ຫາ​ທີ່​ເàºàºµàº”​ຂຶ້ນ​ໃນ​ຂະ​ນະ​ທີ່​ຄວາມ​ພະ​àºàº²â€‹àºàº²àº¡â€‹àº—ີ່​ຈະ​ເປີດ​àºàº²àº™â€‹à»€àºŠàº·à»ˆàº­àº¡â€‹àº•à»à»ˆâ€‹àº™àºµà»‰â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹àº¥àº°â€‹àºšàº»àºšâ€‹àº‚ອງ​ທ່ານ​ຕົວ​ທ່ອງ​ເວັບ​ຂອງ​ມາດ​ຕະ​ຖານ​. -AboutDialog.8 = Ok -AspectCode.0 = ເຫນືອ -AspectCode.1 = ວັນ​ອອàºâ€‹àºªà»ˆàº½àº‡â€‹à»€àº«àº™àº·àº­ -AspectCode.2 = ຕາ​ເວັນ​ອອຠ-AspectCode.3 = ພາàºâ€‹à»ƒàº•້​, ຕາ​ເວັນ​ອອຠ-AspectCode.4 = ໃຕ້ -AspectCode.5 = ພາàºâ€‹à»ƒàº•້​, ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ-AspectCode.6 = ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ-AspectCode.7 = ພາàºâ€‹à»€àº«àº™àº·àº­â€‹, ພາàºâ€‹àº•າ​ເວັນ​ຕົຠ-CollectEarthWindow.0 = ໃນ​ເວ​ລາ​ທີ່​ພະ​àºàº²â€‹àºàº²àº¡â€‹à»€àºžàº·à»ˆàº­â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌ CSVຄວາມ​ຜິດ​ພາດ -CollectEarthWindow.1 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àº -CollectEarthWindow.10 File \= -CollectEarthWindow.11 ອອàºâ€‹àºˆàº²àº \= -CollectEarthWindow.12 = ເຄື່ອງ​ມືຂà»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.13 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ CSV àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ -CollectEarthWindow.14 = Start SAIKU -CollectEarthWindow.15 = ຄຸນ​ສົມ​ບັດ -CollectEarthWindow.16 = ຊ່ວàºâ€‹à»€àº«àº¼àº·àº­ -CollectEarthWindow.17 = ປະ​ຕິ​ເສດ -CollectEarthWindow.18 = ຄົ້ນ​ຫາ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ຫາàºâ€‹à»„ປ​ໃນ​ຖານ​ຂà»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.19 = ເàºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ-CollectEarthWindow.2 = ພາ​ສາ -CollectEarthWindow.20 = ຈà»àº²â€‹àº™àº§àº™â€‹àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™ duplicated​\: -CollectEarthWindow.21 = ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ຊອàºâ€‹àº«àº² icon ສà»àº²â€‹àº¥àº±àºšâ€‹àºžàº²â€‹àº•ົ້ນ​ຕ໠-CollectEarthWindow.22 = ທ່ານ​ມີ​ຄວາມ​à»àº™à»ˆâ€‹à»ƒàºˆàº§à»ˆâ€‹àº²â€‹àº—່ານ​ຕ້ອງ​àºàº²àº™â€‹àº›àº´àº”​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹? ໃນ​àºàº²àº™â€‹àº›àº´àº”​ປ່ອງ​ຢ້ຽມ​àºàº±àº‡â€‹àºˆàº°â€‹àº›àº´àº”​ເຄື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹àº‚ອງ​ໂລàºâ€‹à»„ດ້​ເàºàº±àºšâ€‹àºà»àº² -CollectEarthWindow.23 = àºàº²àº™â€‹àº¢àº±à»‰àº‡â€‹àº¢àº·àº™â€‹àº—ີ່​ຈà»àº²â€‹à»€àº›àº±àº™ -CollectEarthWindow.24 = XML ສົ່ງ​ອອຠ-CollectEarthWindow.25 = ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ເພີ່ມ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹à»€àº«àº¼àº»à»ˆàº²â€‹àº™àºµà»‰â€‹à»àº¥à»‰àº§â€‹à»àº¥àº°â€‹àºàº²àº™â€‹àºªàº¹àº™â€‹à»€àºªàºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº‚ອງ​ທ່ານ​? -CollectEarthWindow.26 = ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™ -CollectEarthWindow.27 = ປັບ​ປຸງ -CollectEarthWindow.28 = ເຮັດ​ຢູ່​ຕ່າງ​ປະ​ເທດ​ເàºàº±àºšâ€‹àºà»àº²â€‹à»€àº„ື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹àº„ວນ​ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹à»àº¥à»ˆàº™â€‹à»ƒàº™â€‹àº‚ະ​ນະ​ທີ່​ຜູ້​ປະ​àºàº­àºšâ€‹àºàº²àº™â€‹àº•ີ​ຄວາມ​ຫມາàºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹. -CollectEarthWindow.29 = The Saiku Server ບà»à»ˆâ€‹à»„ດ້​ຖືàºâ€‹àº•ັ້ງ​. -CollectEarthWindow.3 = \ ຄວາມ​ຜິດ​ພາດ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ -CollectEarthWindow.30 = àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº®àº±àºâ€‹àºªàº²â€‹àºàº²àº™â€‹à»€àº›àºµàº”​ຫນ້າ​ຕ່າງ​ນີ້​ໃນ​ຂະ​ນະ​ທີ່​ທ່ານ​àºà»àº²â€‹àº¥àº±àº‡â€‹à»ƒàºŠà»‰â€‹àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹. -CollectEarthWindow.31 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌ CSV -CollectEarthWindow.32 = ອອຠ-CollectEarthWindow.33 = ຊື່​ຜູ້​ປະ​àºàº­àºšâ€‹àºàº²àº™â€‹àºˆàº°â€‹àº•້ອງ​ມີ​àºàº²àº™â€‹àº•à»à»ˆâ€‹à»„ປ​ອີàºâ€‹à»àº¥à»‰àº§â€‹àºâ€‹à»ˆâ€‹àº§àº² 5 ລັàºâ€‹àºªàº°â€‹àº™àº°â€‹à»àº¥àº°â€‹àºªàº±à»‰àº™â€‹àºâ€‹à»ˆâ€‹àº§àº² 50ຄວາມ​ຜິດ​ພາດ -CollectEarthWindow.34 = àºàº§àº”​ສອບ -CollectEarthWindow.35 = ຜູ້​ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹àº¥àº»àºšâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™ ​\! ຫລັàºâ€‹àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº•ື່ມ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàºªà»ˆâ€‹àºŠàº·à»ˆâ€‹àºœàº¹à»‰â€‹àº›àº°â€‹àºàº­àºšâ€‹àºàº²àº™â€‹à»àº¥àº°â€‹à»ƒàº«à»‰â€‹àºàº»àº”​ປຸ່ມ "ປັບ​ປຸງ​"​. ຊື່ -CollectEarthWindow.36 = ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹àºšà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ເປົ່າ -CollectEarthWindow.37 = ຮັàºâ€‹àºªàº²â€‹àºˆàº±àº™à»„ຟລ​໌ -CollectEarthWindow.38 = CSV -CollectEarthWindow.39 à»àºˆà»‰àº‡ \= ມັນ​ເປັນ​àºàº²àº™â€‹àºªàº»àº¡â€‹àº„ວນ​ທີ່​ທ່ານ​ໄປ​ເຖິງ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº‚ອງ​ທ່ານ (àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ XML​) àºà»ˆàº­àº™â€‹àº—ີ່​ຈະ​ໄດ້​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»ƒàº«àº¡à»ˆâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ -CollectEarthWindow.4 = FAO à»àºˆà»‰àº‡â€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ເສດ -CollectEarthWindow.40 = ທີ່​àºà»àº²â€‹àº™àº»àº”​ໄວ້​ຕາມ​ເສັ້ນ​ທາງ​àºàº±àºšâ€‹à»‚ຟນ​ເດີ​ທີ່ Saiku Server ໄດ້​ຖືàºâ€‹àº•ິດ​ຕັ້ງ​ຢູ່​ໃນ Tools-> Properties-> à»àº–ບ​à»àºšàºšâ€‹àºžàº´â€‹à»€àºªàº”​ໄດ້​. -CollectEarthWindow.41 = àºàº²àº™â€‹àº›àº°â€‹àº«àºàº±àº”​àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹à»„ຟລ​໌​\: -CollectEarthWindow.42 = ອອຠ-CollectEarthWindow.43 = àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº•à»àº²â€‹àºàº±àº™â€‹àº—ີ່​ພົບ​ເຫັນ -CollectEarthWindow.44 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ / ສົ່ງ​ອອàºàº‚à»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.45 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ XML (à»àº›â€‹)ຂà»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.46 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ໃຫມ່​ຈາàºâ€‹à»„ປ​ສະ​ນີ (XML à»àº›â€‹)àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™ -CollectEarthWindow.55 ປັບ​ປຸງ \= àºàº²àº™â€‹àº™à»àº²â€‹à»ƒàºŠà»‰ CSV -CollectEarthWindow.47 = Saiku Server ບà»à»ˆâ€‹à»„ດ້​àºà»àº²â€‹àº«àº™àº»àº” -CollectEarthWindow.48 = ໄຟລ​໌​ຫັດ​ໄປ​ສະໄຟລ​໌ -CollectEarthWindow.49 = Fusion CSV -CollectEarthWindow.5 = ປິດ -CollectEarthWindow.50 = ເປີດ​ຄູ່​ມື​àºàº²àº™â€‹à»ƒàºŠà»‰àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™â€‹àº›àº±àºšâ€‹àº›àº¸àº‡â€‹àº‚ອງ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ-CollectEarthWindow.51 CHECK \= àºàº§àº”​ສອບ -CollectEarthWindow.52 = File ເຂົ້າ​ສູ່​ລະ​ບົບ​ຄà»àº²â€‹àº®à»‰àº­àº‡â€‹àºªàº°â€‹àº«àº¡àº±àºâ€‹à»€àº›àºµàº” -CollectEarthWindow.53 = àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»€àº­â€‹àºàº°â€‹àºªàº²àº™â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹à»€àº‚ົ້າ​ສູ່​ລະ​ບົບຈຸດ -CollectEarthWindow.54 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຈາຠKMLàºà»ˆàº½àº§â€‹àºàº±àºš -CollectEarthWindow.56 = ... -CollectEarthWindow.57 = ຂະ​ບວນ​àºàº²àº™â€‹à»€àº¥àºµà»ˆàº¡â€‹àº•ົ້ນ Saiku à»àº¡à»ˆàº™â€‹àºàº±àº‡â€‹à»àº¥à»ˆàº™â€‹, àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº¥à»â€‹àº–້າ​. -CollectEarthWindow.58 = ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ເລີ່ມ​ຕົ້ນ​àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ Saiku -CollectEarthWindow.59 = ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ Re​\: àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº‚à»à»‰â€‹àº¡àº¹àº™â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™â€‹àº§àº´â€‹à»€àº„າະ Saiku ໄດ້​?
ຂະ​ບວນ​àºàº²àº™â€‹àº™àºµà»‰â€‹àºªàº²â€‹àº¡àº²àº”​ໃຊ້​ເວ​ລາ​ຫຼາàº
ຖ້າ​ທ່ານ​ຄລິàºâ€‹à»ƒàºªà»ˆ "à»àº¡à»ˆàº™â€‹à»àº¥à»‰àº§â€‹" ເປັນ​ຊຸດ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໃຫມ່​ທີ່​ມີ​ຄວາມ​ຫຼ້າ​ສຸດ​ໄດ້​. ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº‚ຶ້ນ​. -CollectEarthWindow.6 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ Fusion ຕາ​ຕະ​ລາງàºàº²àº™â€‹àºœàº°â€‹àº¥àº´àº”​ຂà»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.60 = Saiku -CollectEarthWindow.61 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່ XML (àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº”ັດ​à»àºà»‰â€‹àº™àº±àºšâ€‹àº•ັ້ງ​à»àº•່​àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àºªàº¸àº”​ທ້າàºâ€‹) ສົ່ງ​ອອàºàºà»ˆàº½àº§â€‹àºàº±àºš -CollectEarthWindow.62 = ... -CollectEarthWindow.63 Error \= àºàº²àº™â€‹à»„ດ້​ຮັບ​ຈຸດ​ທີ່​ໄດ້​ຈາຠKML -CollectEarthWindow.64 = ສະ​ຫນັບ​ສະ​ຫນູນ​ທາງ​ເທàºâ€‹àº™àº´àº -CollectEarthWindow.7 Error \= ໃນ​ເວ​ລາ​ທີ່​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຂà»à»‰â€‹àº¡àº¹àº™ -CollectEarthWindow.8 ຂà»à»‰â€‹àº„ວາມ​ປະ​ຕິ​ເສດ \= ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ພົບ​ເຫັນ -CollectEarthWindow.9 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໄດ້​ນà»àº²â€‹à»€àº‚ົ້າ​ມາ​ປະ​àºàº­àºšâ€‹àº”້ວàºâ€‹àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àº—ີ່​ມີ​ຢູ່​à»àº¥à»‰àº§â€‹à»ƒàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚ອງ​ທ່ານ​. -DynamicsCode.0 = ປ່າ​ໄມ້​ໃນ​ເບື້ອງ​ຕົ້ນ -DynamicsCode.1 = ທົ່ງ​ຫàºà»‰àº²â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ -DynamicsCode.2 = àºàº²àº™â€‹àº•ັ້ງ​ຖິ່ນ​ຖານ​ໃນ​ເບື້ອງ​ຕົ້ນ -DynamicsCode.3 = ເບື້ອງ​ຕົ້ນ Otherland -DynamicsCode.4 = ຊຸ່ມ​ນ​້​à»àº²â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ -DynamicsCode.5 = ເບື້ອງ​ຕົ້ນ Cro​​pland -OpenTextFileListener.0 = ໄຟລ​໌​ຂà»à»‰â€‹àº„ວາມ​à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹à»„ດ້​ພົບ​ໄດ້​ທີ່​\:àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -OptionWizard.0 = ທາງ​ເລືອàºâ€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລຠ-OptionWizard.1 = ເລືອàºâ€‹àº‚ອງ​ຕົວ​ທ່ອງ​ເວັບ -OptionWizard.10 = ໂຟ​ເດີ​ສà»àº²â€‹àº®àº­àº‡â€‹àºˆàº±àº™ -OptionWizard.11 = ບà»à»ˆâ€‹àº®àº¹à»‰â€‹àºˆàº±àºâ€‹\: àºàº²àº™â€‹àº™à»àº²â€‹à»ƒàºŠà»‰ ifconfig -OptionWizard.12 = ລູàºâ€‹àº„້າ​ຕົວ​ຢ່າງàºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -OptionWizard.13 = ໂລຠIP Serveràºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -OptionWizard.14 = port ໂລຠServer (ຕົວ​ຢ່າງ​\: 8023​) -OptionWizard.15 = ບັນ​ທຶàºâ€‹à»àº¥àº°â€‹à»ƒàºŠà»‰â€‹àºàº²àº™â€‹àº›à»ˆàº½àº™â€‹à»àº›àº‡ -OptionWizard.16 = ລະ​ຫັດ -OptionWizard.17 = X​-coord -OptionWizard.18 = Y coord​, -OptionWizard.19 = àºàº²àº™â€‹àºàº»àºâ€‹àº¥àº°â€‹àº”ັບ -OptionWizard.2 = ບວນ​àºàº²àº™â€‹à»€àº®àº±àº”​ວຽຠ(server / ລູàºâ€‹àº„້າ​) -OptionWizard.20 = ໄດ້​ເນື້ອ​ໃນ​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»„ດ້​ມີ​àºàº²àº™â€‹àº›à»ˆàº½àº™â€‹à»àº›àº‡â€‹.
àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº®àº±àºšâ€‹à»‚ຫລດ​ເນື້ອ​ຫາ​ໃນ​ເວ​ລາ​ທີ່​ທ່ານ​àºà»àº²â€‹àº¥àº±àº‡â€‹àº®àº±àºšâ€‹àºàº²àº™â€‹àºàº°â€‹àº•ຸ້ນ​ໂດàºâ€‹àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹. -OptionWizard.21 = ປັບ​ປຸງ​ສົບ​ຜົນ​ສà»àº²â€‹à»€àº¥àº±àº” -OptionWizard.22 = ຄ້ອຠ-OptionWizard.23 = ມີ​ຄວາມ​ຜິດ​ພາດ​ໃນ​ເວ​ລາ Re​\: ເປີດ​ໄດ້​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»€àº›àº±àº™â€‹à»„ດ້àºàº»àºâ€‹à»€àº¥àºµàºâ€‹àºàº²àº™ -OptionWizard.24 = àºàº»àºà»€àº¥àºµàºàºàº²àº™ -OptionWizard.25 = ຮູບ​à»àºšàºšâ€‹àºàº²àº™â€‹àº”à»àº²â€‹à»€àº™àºµàº™â€‹àº‡àº²àº™ -OptionWizard.26 = àºàº²àº™â€‹à»€àº›àº±àº™â€‹à»€àºˆàº»à»‰àº²â€‹àºžàº²àºš DB -OptionWizard.27 = ນີ້​ບà»à»ˆâ€‹à»„ດ້​ເປັນ​ທີ່​àºàº­àº¡â€‹àº®àº±àºš Saiku Folder (ເອ​àºàº°â€‹àºªàº²àº™â€‹à»€àº¥àºµà»ˆàº¡ saiku.bat ບà»à»ˆâ€‹à»àº¡à»ˆàº™â€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹) -OptionWizard.28 = Saiku Server ບà»à»ˆâ€‹àº®àº­àº‡â€‹àº®àº±àºš -OptionWizard.29 = ພ໠DB -OptionWizard.3 = Server ຕົວ​ຢ່າງ -OptionWizard.30 = ທາງ​ເລືອຠSQLite -OptionWizard.31 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº•ົວ​ຢ່າງ -OptionWizard.32 = ຮູບ​à»àºšàºšâ€‹àº”ິນ​ຕອນ -OptionWizard.33 = ສà»àº²â€‹àº«àº¼àº§àº”​ນຸ​àºàº»àº¡ -OptionWizard.34 = à»àºšàºšâ€‹àºžàº´â€‹à»€àºªàº” -OptionWizard.35 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ຈຸດ​ຕົວ​ຢ່າງ -OptionWizard.36 = ໄລ​àºàº°â€‹àº—າງ​ລະ​ຫວ່າງ​ຈຸດ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àº•ົວ​ຢ່າງ (ໃນ​ຕາ​) -OptionWizard.37 = ອັດ​ຕາ​ທີ່​ມີ​ຊາàºâ€‹à»àº”ນ​ດິນ​ຕອນ (à»àº¡àº±àº”​) -OptionWizard.38 = ໄຟລ​໌ CSV / CED ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ອ່ານ​ໄດ້​ຢ່າງ​ຖືàºâ€‹àº•້ອງ
ເອ​àºàº°â€‹àºªàº²àº™â€‹à»„ດ້​ຖືàºâ€‹àº„າດ​ວ່າ​ຈະ​ມີ​ມູນ​ຄ່າ​àºàº²àº™â€‹à»àºàºâ€‹àºˆàº¸â€‹àº¥àº°â€‹àºžàº²àºâ€‹à»€àºŠàº±à»ˆàº™â€‹àº™àºµà»‰â€‹\:​.
-OptionWizard.39 = ລະ​ຫັດ​, YCoordinate​, XCoordinate​, ພູ​, ລັàºâ€‹àºªàº°â€‹àº™àº° -OptionWizard.4 = IP ຄອມ​ພິວ​ເຕີ​ປັດ​ຈຸ​ບັນ​\: -OptionWizard.40 = ໂຄງ​àºàº²àº™ -OptionWizard.41 = ໂຫຼດ​ໄຟລ​໌​ໂຄງ​àºàº²àº™â€‹à»ƒàº«àº¡à»ˆ -OptionWizard.42 = ຜິດ​ພາດ​ໃນ​ເວ​ລາ​ປິດ​àºàº²àº™â€‹àº­à»ˆàº²àº™ CSV -OptionWizard.43 = ຊື່​ຂອງ​àºàº²àº™â€‹àºªà»àº²â€‹àº«àº¼àº§àº” -OptionWizard.44 = ຖານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ປ​ໃຫ້​ເຖິງ​ອັດ​ຕະ​ໂນ​ມັດ​ທີ່ -OptionWizard.45 = Open Earth Engine ຊູມ​ເຂົ້າ​ໄປ​ໃນ​ເຂດ​ຕອນ​ດິນ​ຂອງ​ຕົນ -OptionWizard.46 = timelapse ຈັàºâ€‹à»€àº›àºµàº”​ໂລàºâ€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºžàº·à»‰àº™â€‹àº—ີ່​ຕອນ​ດິນ​ຂອງ​ຕົນ -OptionWizard.47 = Open à»àºœàº™ Bing ສà»àº²â€‹àº¥àº±àºšâ€‹àºžàº·à»‰àº™â€‹àº—ີ່​ຕອນ​ດິນ​ຂອງ​ຕົນ -OptionWizard.48 = ຮູບ​à»àºšàºšâ€‹à»€àº›àºµàº”​ໃນ​ຕົວ​ທ່ອງ​ເວັບ​ຂອງ​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»„ດ້ (à»àº™àº°â€‹àº™à»àº²â€‹à»ƒàº«à»‰â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™ LINUX​) -OptionWizard.49 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™ Ced / csv ໄຟລ​໌​ທີ່​ມີ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº•ອນ​ດິນ​ຂອງ​ຕົນàºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -OptionWizard.5 = port ໂລຠServer​\: -OptionWizard.50 = Browse ... -OptionWizard.51 = ເອ​àºàº°â€‹àºªàº²àº™â€‹à»‚ຄງ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ຜິດ​ພາດ -OptionWizard.52 = CSV / ເອ​àºàº°â€‹àºªàº²àº™ Ced ມີ​àºàº²àº™â€‹àº›àº°â€‹àºªàº²àº™â€‹àº‡àº²àº™â€‹à»€àº—ົ່າ​ນັ້ນ -OptionWizard.54 = ຈຸດ​ສູນ​àºàº²àº‡ -OptionWizard.55 = Error ໂຟນ​ເດີ​ໂຄງ​àºàº²àº™â€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ -OptionWizard.56 = ໂຄງ​àºàº²àº™ Load -OptionWizard.57 = ໂຄງ​àºàº²àº™ loaded àºà»ˆàº­àº™â€‹àº«àº™à»‰àº²â€‹àº™àºµà»‰ -OptionWizard.58 = Open GEE Code Editor (ຮຽàºâ€‹àº®à»‰àº­àº‡â€‹à»ƒàº«à»‰â€‹àº¡àºµâ€‹àºàº²àº™â€‹à»€àº‚ົ້າ​ເຖິງ Tester Trusted​) -OptionWizard.59 = Open ທີ່​ນີ້​à»àºœàº™â€‹àº—ີ່​ສຸມ​ໃສ່​ຕອນ​ດິນ​ຂອງ​ຕົນ -OptionWizard.6 = ຕົວ​àºà»àº²â€‹àº™àº»àº”​àºàº²àº™ PostgreSQL DB -OptionWizard.65 = ເສັ້ນ​ທາງ​àºàº±àºšâ€‹à»‚ຟນ​ເດີ​ທີ່ Saiku -OptionWizard.66 = Browse ... -OptionWizard.67 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ບັດ​àºàº²àº™ Firefox -OptionWizard.68 = Browse ... -OptionWizard.7 = ຊື່​ຜູ້​ໃຊ້ -OptionWizard.70 = àºàº²àº™â€‹àºšà»â€‹àº¥àº´â€‹àº«àº²àº™â€‹à»„ຟ -OptionWizard.72 = ໄຟລ​໌​ຖານ​ສອງ -OptionWizard.73 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº›àº°â€‹àº•ິ​ບັດ​àºàº²àº™ Chrome -OptionWizard.74 = Browse ... -OptionWizard.76 = àºàº²àº™â€‹àºšà»â€‹àº¥àº´â€‹àº«àº²àº™â€‹à»„ຟ -OptionWizard.78 = ໄຟລ​໌​ຖານ​ສອງ -OptionWizard.79 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹à»àºšàºš KML Freemarker -OptionWizard.8 = ລະ​ຫັດ​ຜ່ານ -OptionWizard.80 = Browse ... -OptionWizard.82 = à»àº¡à»ˆâ€‹à»àºšàºš Freemarker -OptionWizard.83 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™â€‹àº­àº­àºâ€‹à»àºšàºšâ€‹àº®àº¹àºšâ€‹à»àºšàºš HTML ປູມ​ເປົ້າ -OptionWizard.84 = Browse ... -OptionWizard.86 = HTML webpage -OptionWizard.87 = ເສັ້ນ​ທາງ​àºà»‰àº²àº§â€‹àºªàº¹à»ˆâ€‹àºàº²àº™ XML àºàº±àºšâ€‹àº„à»àº²â€‹àº™àº´â€‹àºàº²àº¡ IDM -OptionWizard.88 = Browse ... -OptionWizard.9 = ຊື່ DB -OptionWizard.90 = ຫມາຠIDM XML -OptionWizard.91 = Server (ສະ​ບັບ​ຜູ້​ຈັດ​àºàº²àº™â€‹àº«àº¼àº·â€‹àº¢àº·àº™â€‹àº¢àº¹à»ˆâ€‹àº„ົນ​ດຽວ​ໃຊ້​) -OptionWizard.92 = ລູàºâ€‹àº„້າ (ປະ​ຕິ​ບັດ​àºàº²àº™ / àºàº²àº™â€‹à»€àºŠàº·à»ˆàº­àº¡â€‹àº•à»à»ˆâ€‹àºàº±àºšâ€‹à»€àº„ື່ອງ​à»àº¡à»ˆâ€‹àº‚່າàºâ€‹) -OptionWizard.93 = SQLite (à»àºšàºšâ€‹àºàº±àº‡ / ໄຟລ​໌​ດຽວ​ຕາມ​) +AboutDialog.19 = гарÑан нь аÑуудлыг +AboutDialog.5 = ДÑлгÑÑ€Ñнгүй мÑдÑÑллийг манай вÑб OpenForis.org очиж +AboutDialog.6 = Уучлаарай, аÑуудал нь таны ÑиÑтемийн Ñтандарт браузер ÑÐ½Ñ Ñ…Ð¾Ð»Ð±Ð¾Ð¾Ñыг нÑÑÑ… гÑж оролдож гарлаа. +AboutDialog.8 = Ок +AspectCode.0 = Хойд +AspectCode.1 = Зүүн Хойд +AspectCode.2 = Зүүн +AspectCode.3 = Зүүн-Өмнөд +AspectCode.4 = Өмнөд +AspectCode.5 = Баруун-Өмнөд +AspectCode.6 = Баруун +AspectCode.7 = Баруун Хойд +CollectEarthWindow.0 = CSV файл уруу өгөгдөл ÑкÑпортлох оролдож алдаа +CollectEarthWindow.1 = ЭкÑпортын алдаа +CollectEarthWindow.10 = Файлын +CollectEarthWindow.11 = Exit +CollectEarthWindow.12 Ñ…ÑÑ€ÑгÑÑл \= +CollectEarthWindow.13 = ЭкÑпортын CSV өгөгдөл +CollectEarthWindow.14 = Start SAIKU дүн шинжилгÑÑ +CollectEarthWindow.15 = Үл хөдлөх хөрөнгө +CollectEarthWindow.16 = туÑламж +CollectEarthWindow.17 = Disclaimer +CollectEarthWindow.18 = мÑдÑÑллийн Ñанд Ñураггүй алга газраа хай +CollectEarthWindow.19 = дÑлхийг цуглуулах +CollectEarthWindow.2 = Ñ…Ñл +CollectEarthWindow.20 = давхардÑан тоогоор бүртгÑлийн тоо\: +CollectEarthWindow.21 = гол хүрÑÑ Ð´Ò¯Ñ€Ñийг олж чадахгүй байна +CollectEarthWindow.22 = Ð¥ÑÑ€Ñв та цуглуулж дÑлхийг хаах Ñ…Ò¯ÑÑж байгаа гÑдÑгт итгÑлтÑй байна уу? Цонхыг хаах нь цуглуулж ДÑлхий Ñервер хаах болно
+CollectEarthWindow.23 = батлах Ñ…ÑÑ€ÑгтÑй +CollectEarthWindow.24 = XML ЭкÑпортын +CollectEarthWindow.25 = Та Ñмар ч байÑан ÑдгÑÑÑ€ бүртгÑлийг нÑмÑÑ…, таны одоогийн мÑдÑÑллийг алдах Ñ…Ò¯ÑÑж байна уу? +CollectEarthWindow.26 = Оператор +CollectEarthWindow.27 = шинÑчлÑÑ… +CollectEarthWindow.28 = <б> ÐÑÑлттÑй Foris оператор мÑдÑÑллийг хөрвүүлÑн ойлгох бол ДÑлхий Ñервер ажиллаж байх Ñ‘Ñтой цуглуулна. +CollectEarthWindow.29 = Saiku Ñерверийг тохируулаагүй байна. +CollectEarthWindow.3 = \ Импорт алдаа +CollectEarthWindow.30 = Та Google Earth ашиглаж байгаа бол ÑÐ½Ñ Ñ†Ð¾Ð½Ñ… нÑÑлттÑй байлгах уу. +CollectEarthWindow.31 = ЭкÑпортын CSV файлд мÑдÑÑллийг цуглуулÑан +CollectEarthWindow.32 = Quit +CollectEarthWindow.33 = операторын нÑÑ€ 5 Ñ‚ÑмдÑгтүүд болон 50 богино бодвол илүү урт байх Ñ‘Ñтой +CollectEarthWindow.34 = Баталгаажуулалт алдаа +CollectEarthWindow.35 = OPERATOR нÑÑ€ хооÑон \! Зар операторын нÑÑ€ бөглөх болон "шинÑчлÑÑ…" товчийг дарна уу. +CollectEarthWindow.36 = Оператор нÑÑ€ хооÑон байж болохгүй +CollectEarthWindow.37 = нÑÑлттÑй байлга +CollectEarthWindow.38 = CSV файлууд +CollectEarthWindow.39 = Ðнхааруулга\: Ð­Ð½Ñ Ð½ÑŒ зүйтÑй та нөөцлөх-ап таны одоогийн өгөгдөл (XML нь ЭкÑпортын) ÑˆÐ¸Ð½Ñ Ð¼ÑдÑÑллийг импортлогч өмнө +CollectEarthWindow.4 = ÐҮБ-ын ХХÐÐБ Disclaimer зар +CollectEarthWindow.40 Тодорхой хүртÑл \= Saiku Server Ð¥ÑÑ€ÑгÑÑл цÑÑÑн дотрооÑ> баÑлагт> ÐарийвчилÑан таб-д ÑуулгаÑан байна Ñ…Ð°Ð²Ñ‚Ð°Ñ Ð·Ð°Ð¼Ñ‹Ð³. +CollectEarthWindow.41 = Хадгаламж файл уруу өгөгдөл ÑкÑпортолÑон\: +CollectEarthWindow.42 = Quit +CollectEarthWindow.43 = ЗөрчилтÑй бүртгÑл олдлоо +CollectEarthWindow.44 = МÑдÑÑллийн Импорт / ЭкÑпортын +XML гÑж CollectEarthWindow.45 \= ЭкÑпортын мÑдÑÑ (шахÑан) +Zip-Ð°Ð°Ñ CollectEarthWindow.46 \= Импортын ÑˆÐ¸Ð½Ñ Ð¼ÑдÑÑ (шахÑан XML) +CSV ашиглан CollectEarthWindow.55 \= шинÑчлÑÑ… одоогийн бүртгÑл +CollectEarthWindow.47 = Saiku Ñерверийг тохируулаагүй бол +CollectEarthWindow.48 = Zip / цуглуулах-өгөгдлийн файлууд +CollectEarthWindow.49 = Fusion CSV файлууд +CollectEarthWindow.5 = Хаах +CollectEarthWindow.50 = ÐÑÑлттÑй Ñ…ÑÑ€ÑглÑгчийн гарын авлага +Цуглуулж дÑлхийн шинÑчлÑлтүүдийн хувьд CollectEarthWindow.51 \= шалгах +CollectEarthWindow.52 = ÐÑÑлттÑй Application нÑвтрÑÑ… Файлын +CollectEarthWindow.53 = цуглуулах ДÑлхий нÑвтрÑÑ… файл +KML нь CollectEarthWindow.54 \= ачааллын оноо +CollectEarthWindow.56 = тухай ... +CollectEarthWindow.57 = Saiku гарааны үйл Ñвц одоо ч ажиллаж байгаа, түр хүлÑÑÐ½Ñ Ò¯Ò¯. +CollectEarthWindow.58 = Saiku шинжилгÑÑг Ñхлүүлж чадахгүй +CollectEarthWindow.59 = Ð¥ÑÑ€Ñв та Saiku дүн шинжилгÑÑ Ñ…Ð¸Ð¹Ñ… мÑдÑÑллийн Ñанг дахин бий болгох Ñ…Ò¯ÑÑж байна уу?
Ð­Ð½Ñ Ò¯Ð¹Ð» Ñвц нь цаг хугацаа шаардÑан ажил байж болох юм.
Та хамгийн Ñүүлийн үеийн нь "YES" ÑˆÐ¸Ð½Ñ Ð´Ð°Ñ‚Ð°Ñетийн дÑÑÑ€ товшино уу мÑдÑÑллийг бий болно. +Fusion Ð¥Ò¯ÑнÑгт нь CollectEarthWindow.6 \= ЭкÑпортын +CollectEarthWindow.60 = Saiku мÑдÑÑ Ò¯ÐµÐ¸Ð¹Ð½ +CollectEarthWindow.61 = ЭкÑпортын XML өгөгдөл (Ñүүлийн ÑкÑпортын хойш өөрчлөгдÑөн бүртгÑл) +CollectEarthWindow.62 = тухай ... +CollectEarthWindow.63 = Ðлдаа KML авÑан оноо авах +CollectEarthWindow.64 = техникийн дÑмжлÑг үзүүлÑÑ… +CollectEarthWindow.7 = алдаа мÑдÑÑлÑл импортлох +CollectEarthWindow.8 = Disclaimer текÑÑ‚ олж чадахгүй байна +CollectEarthWindow.9 = оруулÑан мÑдÑÑллийг өөрийн мÑдÑÑллийн Ñанд нь байгаа бичлÑгийг агуулж байдаг. +DynamicsCode.0 = ЭхлÑÑд ой +DynamicsCode.1 = ЭхлÑÑд БÑлчÑÑрийн +DynamicsCode.2 = ЭхлÑÑд шийдвÑрлÑÑ… +DynamicsCode.3 = ЭхлÑÑд Otherland +DynamicsCode.4 = ЭхлÑÑд Ð£Ñ Ð½Ð°Ð¼Ð³Ð°Ñ€Ñ…Ð°Ð³ газрын +DynamicsCode.5 = ЭхлÑÑд Тариалангийн +OpenTextFileListener.0 = текÑÑ‚ файл олж байÑан юм\: +OptionWizard.0 = ДÑлхий Ñонголт цуглуулах +OptionWizard.1 = Хөтөч Ñонгоно уу +OptionWizard.10 = ÐÑÑлттÑй нөөц Ñ…Ð°Ð²Ñ‚Ð°Ñ +OptionWizard.11 = Тодорхойгүй\: ашиглах ifconfig +OptionWizard.12 = Ð¥ÑÑ€ÑглÑгч шатны +OptionWizard.13 = ДÑлхий Server IP цуглуулах +OptionWizard.14 = ДÑлхий Server портыг (жишÑÑ Ð½ÑŒ\: 8023) цуглуулах +OptionWizard.15 = Save & өөрчлөлт хийх +OptionWizard.16 = ID +OptionWizard.17 = X-coord +OptionWizard.18 = Y-coord +OptionWizard.19 = Elevation +OptionWizard.2 = урÑгал даÑгалын (Ñервер / үйлчлүүлÑгч) + OptionWizard.20 \= Google Earth агуулга нь өөрчлөгдÑөн байна.
Ðгуулга нь ачаалах хүлÑÑн авна уу та Google Earth-ÑÑÑ Ð°Ñуух үед. +OptionWizard.21 = шинÑчлÑÑ… амжилттай +OptionWizard.22 = Ð¥Ñвгий +OptionWizard.23 = дахин нÑÑÑ… Google Earth мÑдÑÑллийг үед алдаа гарлаа +OptionWizard.24 = Болих +OptionWizard.25 = үйл ажиллагааны горим +OptionWizard.26 = DB хоÑÑ‚ +OptionWizard.27 = Ð­Ð½Ñ Ð½ÑŒ хүлÑÑн зөвшөөрөгдÑөн Saiku Folder (ÑхлÑÑ… saiku.bat файл байхгүй бол) ороогүй байна +OptionWizard.28 = Saiku Server хүлÑÑн зөвшөөрөөгүй +OptionWizard.29 = DB порт +OptionWizard.3 = Server шатны +OptionWizard.30 = SQLite Ñонголт +OptionWizard.31 = ЖишÑÑ Ð¼ÑдÑÑлÑл +OptionWizard.32 = Plot зохион байгуулалт +OptionWizard.33 = Ñудалгаа тодорхойлолт +OptionWizard.34 = ÐарийвчилÑан +OptionWizard.35 = түүвÑÑ€ цÑгийн тоо +OptionWizard.36 = (метр) дÑÑж авах цÑгийн хоорондох зай +(Метр) ДÑÑж авах цÑгүүд OptionWizard.95 \= Side +OptionWizard.38 = CSV / CED файлыг зөв уншиж чадахгүй байгаа файлыг
иймÑрхүү таÑлалаар туÑгаарлаж утгыг байх төлөвтÑй байна\:.
<Б> +OptionWizard.39 = ID, YCoordinate, XCoordinate, өндрийн, налуу, тал +OptionWizard.4 = Одоогийн компьютерийн IP\: +OptionWizard.40 = төÑлүүд +OptionWizard.41 = ÑˆÐ¸Ð½Ñ Ñ‚Ó©Ñөл файлыг ачаалж +OptionWizard.42 = Ðлдаа CSV уншигч хаах +Судалгааны OptionWizard.43 \= нÑÑ€ +OptionWizard.44 = автоматаар нөөцлөх хүртÑл өгөгдлийн Ñан дÑÑÑ€ +OptionWizard.45 = ÐÑÑлттÑй Earth Engine талбай талбай руу томруулÑан +талбай мÑдÑÑлÑл / CSV файлыг ced нь OptionWizard.49 \= зам +Харин Google Earth-ийн браузер дÑÑÑ€ OptionWizard.48 \= ÐÑÑлттÑй Ñ…ÑлбÑÑ€ (ЛинукÑд зориулÑан байлгахыг зөвлөдөг) +OptionWizard.5 = цуглуулах ДÑлхий Server портыг\: +OptionWizard.50 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.51 = Ðлдаа импортлох төÑөл файл +Зөвхөн координат нь OptionWizard.52 \= CSV / CED файл +OptionWizard.53 = талбай +OptionWizard.54 = Төв цÑг нь +OptionWizard.55 = Ðлдаа импортлох төÑөл Ñ…Ð°Ð²Ñ‚Ð°Ñ +OptionWizard.56 = ачааллын төÑөл +OptionWizard.57 = Өмнө нь дуудагддаг төÑөл +OptionWizard.58 = ÐÑÑлттÑй Gee тоглоомын талбай (Trusted Tester хандах шаардлагатай) +OptionWizard.59 = ÐÑÑлттÑй Энд Maps газар дÑÑÑ€ анхаарлаа хандуулж +OptionWizard.6 = PostgreSQL DB параметрүүд +OptionWizard.65 = Saiku хавтÑанд зам +OptionWizard.66 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.67 = Firefox гүйцÑтгÑгдÑÑ… нь зам +OptionWizard.68 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.7 = Ð¥ÑÑ€ÑглÑгчийн нÑÑ€ +OptionWizard.70 = гүйцÑтгÑгдÑÑ… файлууд +OptionWizard.72 = Хоёртын файлууд +OptionWizard.73 = Chrome гүйцÑтгÑгдÑÑ… нь зам +OptionWizard.74 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.76 = гүйцÑтгÑгдÑÑ… файлууд +OptionWizard.78 = Хоёртын файлууд +OptionWizard.79 = KML Freemarker загварт зам +OptionWizard.8 = Ðууц үг +OptionWizard.80 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.82 = Freemarker загвар +OptionWizard.83 = HTML бөмбөлөг Ñ…ÑлбÑÑ€ дизайн зам +OptionWizard.84 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.86 = HTML вÑб Ñ…ÑƒÑƒÐ´Ð°Ñ +OptionWizard.87 = IDM тодорхойлолт нь XML нь зам +OptionWizard.88 = линкүүдÑÑÑ Ð´ÑƒÑƒÐ´Ð°Ñ… ... +OptionWizard.9 = DB нÑÑ€ +OptionWizard.90 = XML IDM тодорхойлолт +OptionWizard.91 = Server (менежер хувилбар, ÑÑвÑл дангаараа ашиглах нь) +OptionWizard.92 = Ð¥ÑÑ€ÑглÑгч (оператор / Ñервер уруу холбогдÑон) +OptionWizard.93 = SQLite (Embedded / нÑг файл дÑÑÑ€ тулгуурлаÑан) OptionWizard.94 = PostgreSQL -SaikuAnalysisListener.0 = à»àº¡à»ˆàº™ - ຂà»à»‰â€‹àº¡àº¹àº™ Refresh Saiku (ຂະ​ບວນ​àºàº²àº™â€‹àºàº²àº§â€‹) -SaikuAnalysisListener.1 = ບà»à»ˆ - ພຽງ​à»àº•່​ເລີ່ມ​ຕົ້ນ Saiku -SaikuStarter.1 = ເລີ່ມ Saiku -SaikuStarter.2 = u0EC0ລີ່ມ Saiku ສາ​ມາດ​ໃຊ້​ເວ​ລາ​ນາ​ທີ \= àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹àº¥à»â€‹àº–້າ ​\! -SaveEarthDataServlet.0 = àºàº²àº™â€‹àº®à»‰àº­àº‡â€‹àº‚à»â€‹à»€àº›àº»à»ˆàº² -SaveEarthDataServlet.1 = ບັນ​ຫາ​ທີ່​ເàºàºµàº”​ຂຶ້ນ​ໃນ​ຂະ​ນະ​ທີ່​ປະ​ຢັດ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºàº±àºšâ€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ດ້ -SaveEarthDataServlet.2 = ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ີ່​ໄດ້​ບັນ​ທືຠ-SlopeCode.0 = ລຽບ (0-5​)àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -EarthApp.11 = ໃນ​ທົ່ວ​ໂລàºâ€‹à»àº¡à»ˆàº™â€‹à»àº¥à»‰àº§â€‹à»àº¥à»ˆàº™ -EarthApp.21 = ໄຟ​ທີ່​ມີ​ຕາ​ຂ່າàºâ€‹à»„ຟ​ຟ້າ​ຂອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ເປັນ CSV / CED à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹àºžàº»àºšâ€‹à»€àº«àº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹à»€àºªàº±à»‰àº™â€‹àº—າງ​ທີ່​ເລືອàºâ€‹\:
-EarthApp.23 = ບà»à»ˆâ€‹à»„ຟລ​໌ CSV / CED ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

-EarthApp.24 = ໄຟ​ທີ່​ມີ​à»àº¡à»ˆâ€‹à»àºšàºš Freemarker ທີ່​ມີ​ຄà»àº²â€‹àº™àº´â€‹àºàº²àº¡ KML ບà»à»ˆâ€‹à»„ດ້​ພົບ​ເຫັນ​ຢູ່​ໃນ​ເສັ້ນ​ທາງ​ທີ່​ເລືອàºâ€‹\:
-EarthApp.26 = ບà»à»ˆâ€‹à»„ຟລ​໌​ຄà»àº²â€‹àº™àº´â€‹àºàº²àº¡ KML ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

-EarthApp.27 = ໄຟ​ທີ່​ມີ​ຮູບ​à»àºšàºšâ€‹àº›àº¹àº¡â€‹à»€àº›àº»à»‰àº² HTML ໄດ້​à»àº¡à»ˆàº™â€‹àºšà»à»ˆâ€‹àºžàº»àºšâ€‹à»€àº«àº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹à»€àºªàº±à»‰àº™â€‹àº—າງ​ທີ່​ເລືອàºâ€‹\:
-EarthApp.29 = ບà»à»ˆâ€‹à»„ຟລ​໌​ປູມ​ເປົ້າ HTML ໄດ້​ຮັບ​àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹àº•ັ້ງ​ຂຶ້ນ​\:

-EarthApp.3 = ເຕືອນ​ຂ້ອàºâ€‹àº•à»à»ˆâ€‹àº¡àº² -EarthApp.30 = àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹à»àºà»‰â€‹à»„ຂ​ສະ​ຖານ​ທີ່​ໄຟລ​໌​ຢູ່​ໃນ​ເມ​ນູ Tools-> Properties​. -EarthApp.4 = àºàº²àº™â€‹àº›àº±àºšâ€‹àº›àº¸àº‡â€‹à»ƒàº™â€‹àº›àº±àº”​ຈຸ​ບັນ -EarthApp.5 = ຢ່າ​ເຕືອນ​ຂ້າ​ພະ​ເຈົ້າ​ອີàºâ€‹à»€àº—ື່ອ​ຫນຶ່ງ -EarthApp.57 = ມີ​ສະ​ບັບ​ໃຫມ່​ຂອງ​àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº²â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹àº—ີ່​ມີ à»àº¡à»ˆàº™â€‹\!
ທ່ານ​ບà»à»ˆâ€‹àº•້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ດà»àº²â€‹à»€àº™àºµàº™â€‹àºàº²àº™â€‹? ເຕືອນ -EarthApp.58 = ປັບ​ປຸງ -EarthApp.59 Error \= ໃນ​ເວ​ລາ​ທີ່​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ເອ​àºàº°â€‹àºªàº²àº™â€‹à»‚ຄງ​àºàº²àº™ -EarthApp.6 = \ - ສະ​ບັບ -EarthApp.61 = ເອ​àºàº°â€‹àºªàº²àº™â€‹à»ƒàº™â€‹àº—ົ່ວ​ໂລàºâ€‹à»„ດ້​ເàºàº±àºšâ€‹àºà»àº²â€‹àºšà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ຈະ​ເປີດ​ເຜີàºâ€‹.
àºàº°â€‹àº¥àº¸â€‹àº™àº²â€‹à»€àº®àº±àº”​ໃຫ້​à»àº™à»ˆâ€‹à»ƒàºˆàº§à»ˆâ€‹àº²â€‹àº—ີ່​àºàº¹â€‹à»‚àºâ€‹à»‚ລàºâ€‹à»àº¡à»ˆàº™â€‹àºàº²àº™â€‹àº•ິດ​ຕັ້ງ​. -EarthSurveyService.9 = ພາàºâ€‹àºªàº°â€‹àº«àº™àº²àº¡â€‹àº—ີ່​ຕ້ອງ​àºàº²àº™à»€àº­àº»àº² -ExportActionListener.1 = ວັນ​ທີ່​ຈະ​ບັນ​ທຶàºâ€‹àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹àºˆàº²àºàº‚à»à»‰â€‹àº¡àº¹àº™ -ExportDialogProcessMonitor.0 àºàº²àº™â€‹àº›àº¸àº‡â€‹à»àº•່ງ \= ... -ExportDialogProcessMonitor.1 = ລà»â€‹àº–້າ​ທີ່​ຈະ​ເລີ່ມ​ຕົ້ນ​ຂະ​ບວນ​àºàº²àº™â€‹\:àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àº -ExportDialogProcessMonitor.4 =​\: -ImportProcessMonitorDialog.0 = àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​\: -ImportActionListener.0 = ຄວນ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºªà»àº²â€‹àº¥àº±àºšâ€‹àº—ີ່​ດິນ​ທີ່​ບà»à»ˆâ€‹à»„ດ້​ຮັບ​àºàº²àº™â€‹à»€àº•ີມ​ລົງ​ໄປ​ໃນ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ໄດ້ -ImportActionListener.2 = ຖ້າ​ທ່ານ​ຄລິàºâ€‹à»ƒàºªà»ˆ ບà»à»ˆ ພຽງ​à»àº•່​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºˆàº²àºâ€‹àºžàº²àºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ຢູ່​ໃນ​ສະ​ພາບ "ສີ​ຂຽວ​"​, ທີ່​ບັນ​ຈຸ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ັງ​ຫມົດ​ໄດ້​, ຈະ​ໄດ້​ຮັບ​àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​. -ImportActionListener.3 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ບັນ​ທຶàºâ€‹àº—າງ​àºàº²àº™â€‹àºªà»àº²â€‹à»€àº¥àº±àº”​ຮູບ -ImportDialogProcessMonitor.0 = \ ຄິດ​ໄລ່ -ImportDialogProcessMonitor.11 = ຈà»àº²â€‹àº™àº§àº™â€‹à»ƒàº™â€‹à»€àºšàº·à»‰àº­àº‡â€‹àº•ົ້ນ​ຂອງ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹\: -ImportDialogProcessMonitor.2 = àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​ບັນ​ທຶàºâ€‹àºàº²àº™ ... -ImportDialogProcessMonitor.5 = ຈ​à»â€‹àº²â€‹àº™àº§àº™â€‹àº•ົວ​ຈິງ​ຂອງ​àºàº²àº™â€‹àºšàº±àº™â€‹àº—ຶàºâ€‹àºàº²àº™â€‹àº™à»àº²â€‹à»€àº‚ົ້າ​\:ຂà»à»‰â€‹àº¡àº¹àº™ -ImportDialogProcessMonitor.8 àºàº²àº™â€‹àº›àº¸àº‡â€‹à»àº•່ງ \= ... -InfiniteProgressMonitor.0 = àºàº»àºâ€‹à»€àº¥àºµàºâ€‹àºàº²àº™â€‹àº”à»àº²â€‹à»€àº™àºµàº™â€‹àº‡àº²àº™àºàº²àº™â€‹à»€àºàº±àºšâ€‹àºà»àº² -JFileChooserExistsAware.0 = file ໂລàºâ€‹à»‚ຄງ​àºàº²àº™ -KmlImportService.13 = ເລືອàºâ€‹à»„ຟລ​໌ CSV ເພື່ອ​ຊ່ວàºâ€‹àº›àº°â€‹àº¢àº±àº”​ສະ​ຖານ​ຕອນ​ດິນ​ຂອງ​ຕົນ​ເພື່ອ -MissingPlotsListener.0 Error \= ໃນ​ຂະ​ນະ​ທີ່​àºàº²àº™â€‹à»„ດ້​ຮັບ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àº—ີ່​ດິນ​ບà»à»ˆâ€‹àº›àº°â€‹àºˆàº¸â€‹àºšàº±àº™â€‹àº¢àº¹à»ˆâ€‹à»ƒàº™â€‹àº–ານ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹à»„ດ້ -MissingPlotsListener.1 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ໄປ -MissingPlotsListener.10 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ໃນ​àºàº²àº™â€‹àº­àº­àºâ€‹à»àºšàºšâ€‹àºªàº¸à»ˆàº¡â€‹àº•ົວ​ຢ່າງ​\: -MissingPlotsListener.12 = ຈà»àº²â€‹àº™àº§àº™â€‹àº‚ອງ​ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຂາດ​ຫາàºâ€‹à»„ປ​\: -MissingPlotsListener.14 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທັງ​ຫມົດ​à»àº¡à»ˆàº™â€‹à»„ດ້​ເຕີມ​ລົງ​ໄປ ​\!ເນື້ອ​ໃນ -MissingPlotsListener.2 = ຄັດ​ລອàºâ€‹à»„ປ​ທີ່ clipboardເອົາ -MissingPlotsListener.3 = ໄຟລ​໌​ທີ່​ບັນ​ຈຸ​ມີ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ສານ​ຕອນ​ດິນ​ຂອງ​ຕົນ (.csv ຫຼື​ໄຟລ​໌ .ced​) ສà»àº²â€‹àº¥àº±àºšâ€‹àº—ີ່​ທ່ານ​ຕ້ອງ​àºàº²àº™â€‹àº—ີ່​ຈະ​ຮູ້​ວ່າ​ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº—ັງ​ຫມົດ​ໄດ້​ຮັບ​àºàº²àº™â€‹à»€àº•ີມ​ລົງ​ໄປ​. -MissingPlotsListener.4 = ພາàºâ€‹à»ƒàº™â€‹àº‚ອບ​ເຂດ​ທີ່​ຫາàºâ€‹à»„ປ - ຂà»à»‰â€‹àº¡àº¹àº™â€‹àº‚່າວ​ສານ -MissingPlotsListener.5 = ຈາàºâ€‹à»„ຟ​\: -MissingPlotsListener.6 = àºàº²àº™â€‹àºªàº»à»ˆàº‡â€‹àº­àº­àºâ€‹à»„ປ​ໄຟລ​໌ CED -ProcessMonitorDialog.1 = ຂà»à»‰â€‹àºœàº´àº”​ພາດ Parsing àºà»ˆàº½àº§â€‹àºàº±àºšâ€‹àºˆà»àº²â€‹àº™àº§àº™â€‹àºàº²àº™â€‹àº•ິດ​ຕà»à»ˆâ€‹àºàº±àº™ -ProcessMonitorDialog.4 = ຖັນ​, -ProcessMonitorDialog.5 = \ - ຄຸນ​ຄ່າ \ No newline at end of file +SaikuAnalysisListener.0 = Тийм - СÑргÑÑÑ… Saiku мÑдÑÑлÑл (урт үйл Ñвц) +SaikuAnalysisListener.1 = Үгүй - ЗүгÑÑÑ€ л Saiku ÑхлÑÑ… +SaikuStarter.1 Saiku ÑхлÑн \= +SaikuStarter.2 Saiku ÑхлÑн зарим нÑг минут үргÑлжилж болох \= түр хүлÑÑÐ½Ñ Ò¯Ò¯ \! +SaveEarthDataServlet.0 = ХооÑон Ñ…Ò¯ÑÑлт +SaveEarthDataServlet.1 = ÐÑуудлын мÑдÑÑллийн Ñанд мÑдÑÑлÑл Ñ…ÑмнÑÑ… гарлаа +SaveEarthDataServlet.2 = өгөгдөл хадгалÑан байна +SlopeCode.0 = Хавтгай (0-5) +EarthApp.11 = дÑлхий аль Ñ…Ñдийн ажиллаж байгаа цуглуулах +EarthApp.21 хашааны ÑүлжÑÑ Ð°Ð³ÑƒÑƒÐ»Ñан файлыг \= а CSV / CED ÑонгоÑон зам олж чадаагүй байна гÑж\:
<би> +EarthApp.23 = Ямар ч CSV / CED файл тохируулга байна\:

+EarthApp.24 = KML тодорхойлолт нь Freemarker загварыг агуулÑан файлыг ÑонгоÑон замаар олж ороогүй байна\:
<би> +EarthApp.26 = Ямар ч KML тодорхойлолт файл тохируулга байна\:

+EarthApp.27 = HTML бөмбөлөг Ñ…ÑлбÑрийг агуулÑан файлыг ÑонгоÑон замаар олж ороогүй байна\:
<би> +EarthApp.29 = Ямар ч HTML бөмбөлөг файл тохируулга байна\:

+EarthApp.3 = дараа нь надад Ñануул +EarthApp.30 = Ð¥ÑÑ€ÑгÑÑл цÑÑÑн дотрооÑ> Properties цÑÑ Ñ„Ð°Ð¹Ð»Ñ‹Ð½ байршлыг зөв оруулна уу. +EarthApp.4 = шинÑчлÑÑ… Одоо +EarthApp.5 = намайг дахин Ñануулах байхгүй юу +EarthApp.57 = <б> цуглуулж ДÑлхий боломжтой -ийн ÑˆÐ¸Ð½Ñ Ñ…ÑƒÐ²Ð¸Ð»Ð±Ð°Ñ€ байна\! Ð¥ÑÑ€Ñв та Ñ…ÑрхÑн цааш Ñ…Ò¯ÑÑж байна вÑ?
+EarthApp.58 = шинÑчлÑÑ… бөгөөд дохио авах байрлуулах +EarthApp.59 = Ðлдаа төÑөл файлыг импортлох +EarthApp.6 = \ - Хувилбар +EarthApp.61 = цуглуулж ДÑлхий файл, нÑÑлттÑй байж чадÑангүй.
Google Earth ÑуулгаÑан ÑÑÑхийг шалгана уу. +EarthSurveyService.9 = талбар шаардлагатай +ExportActionListener.1 = ÑхлÑн ÑкÑпортын Records-руу огноо Ñонгох +ExportDialogProcessMonitor.0 = боловÑруулах мÑдÑÑ ... +ExportDialogProcessMonitor.1 = үйл Ñвцыг Ñхлүүлж хүлÑÑж байна\: +ExportDialogProcessMonitor.4 = ÑкÑпортлох бүртгÑл\: +ImportProcessMonitorDialog.0 = Импортын бүртгÑл\: +ImportActionListener.0 = бүрÑн дүүрÑн чадаагүй байна талбайд өгөгдлийн импортын Ñ‘Ñтой юу? +ImportActionListener.2 = Та дарна бол <и> <б> NO бүх өгөгдлийг агуулÑан "ногоон" төлөвт талбайд, зөвхөн өгөгдөл оруулÑан болно. +ImportActionListener.3 = Импорт Ð±ÑƒÑ Ð±Ð¾Ð»Ð¾Ð²ÑруулÑан бүртгÑл +ImportDialogProcessMonitor.0 = ТООЦОЖ бичлÑгүүдийн ImportDialogProcessMonitor.11 \= Эхний дугаар\: +ImportDialogProcessMonitor.2 = бүртгÑл импортлож байна ... +Импортын бүртгÑл ImportDialogProcessMonitor.5 \= бодит тоо\: +ImportDialogProcessMonitor.8 = боловÑруулах мÑдÑÑ ... +InfiniteProgressMonitor.0 = ажиллагааг Cancel +JFileChooserExistsAware.0 = ДÑлхий төÑөл файлыг цуглуулах +KmlImportService.13 = тулд талбай байршлыг хадгалахын тулд CSV файлыг Ñонгоно уу +Database дÑÑÑ€ нь байхгүй хашааны-ий тухай мÑдÑÑлÑл авах бол MissingPlotsListener.0 \= алдаа +MissingPlotsListener.1 = хайж байна газрууд +MissingPlotsListener.10 = дÑÑж дизайн талбайд нийт тоо\: +MissingPlotsListener.12 = алга хашааны тоо\: +MissingPlotsListener.14 = мÑдÑÑлÑл талбай дүүрÑн байдаг \! +MissingPlotsListener.2 = Хуулах Бал нь агуулга +MissingPlotsListener.3 = Та бүх мÑдÑÑлÑл ирÑÑн дүүрÑн байÑан ÑÑÑхийг мÑдÑхийг Ñ…Ò¯ÑÑж байгаа нь хуйвалдаан мÑдÑÑлÑл (.csv ÑÑвÑл .ced файлууд) агуулÑан файлуудыг Ñонгоорой. +MissingPlotsListener.4 = хайж байна талбай - мÑдÑÑлÑл +MissingPlotsListener.5 Ñ„Ð°Ð¹Ð»Ð°Ð°Ñ \=\: +CED файлд MissingPlotsListener.6 \= ЭкÑпортын +мөр нь Ñ…Ñд Ñ…ÑдÑн ProcessMonitorDialog.1 \= магадлах алдаа +ProcessMonitorDialog.4 = багана +ProcessMonitorDialog.5 = \ - утгууд \ No newline at end of file From a57cd67369a2398ec78f1552f86f1af8cdd13054 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:38 +0100 Subject: [PATCH 0861/1620] New translations arhangai.ttf (Spanish) --- .../earth/app/view/Messages_es.properties | Bin 17309 -> 70708 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 7531b1f880577174fbd54a1f934f5ea15407dcc7..aefdf309744a0187d10430151fd9f27cdefc40a9 100644 GIT binary patch literal 70708 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 JCm)K+e*iLS20#D+ From 7fc2fc5c087c8931427088893f9fad5f768b10f8 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:39 +0100 Subject: [PATCH 0862/1620] New translations arhangai.ttf (Portuguese) --- .../earth/app/view/Messages_pt.properties | Bin 17309 -> 70708 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 7531b1f880577174fbd54a1f934f5ea15407dcc7..aefdf309744a0187d10430151fd9f27cdefc40a9 100644 GIT binary patch literal 70708 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 JCm)K+e*iLS20#D+ From 07a66d972e4db92aaef557272f89938c167cd8c3 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:40 +0100 Subject: [PATCH 0863/1620] New translations fao-logo.png (English) --- .../earth/app/view/Messages_en.properties | Bin 17309 -> 3038 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 7531b1f880577174fbd54a1f934f5ea15407dcc7..2eeeadd2c16af47e2282400756fb6654d7ff27bd 100644 GIT binary patch literal 3038 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 literal 17309 zcmcIrU2j{*wSDKWIL*VY3`Fvmq}YL-K-ZF6H}SO_`Q9dlUTBH2iPEA#(st4(NxrfT zByMb=Xbaprz;&;J<{>w-NIO>ak-u=5{GqP3_RQhT;ZROo6oO@uJTtRrf2_Usp5e^Z z=FQG*z1nDAn>cC47@V z>#t_qK>tD3-^dTJ&{Orrcq#Roa1)W}rzra8`L~ss z_DXHBbFR5mn>fbzHZgD~?}hIl=lg&D{%dG(Kl#9k;DK=9$>9C*AO4R0?*H&*Joh9X zNq<6H=Z~Ziy2Jj631oxdv2gu2N>dDkKi6zDu|DTH9z*>NTAHIZw`J%syHxSA{e3=|bSLm<9WNY&H zJw$6t`Sgm}dV8@^t>37%l8-1lhM|Iy3jOcrJ%%jY124KBS!g_jn_@2iMxSj#YT7Hg zhTsoS1en_p4s^5rT{wCdZ_wd^DE*DpNJbm&nC~V(m7CD@wz)Xu=$X(^4S@sm6Fydf zG2eeJ2PSeD6k>mRX5r1`%yL@}r)e}8*dya&9-x|mDIw~421wizoNajhJf$WGv&p%+ zsWZR4a`9b2?WXh5ZHfaO###ZYm9$13Lsupg-5QVBYOseag7-M4OK5$8NwsCT$^$}v zAs8e6&f8i31-7^k4HIBxKu(T#K23=7N6g_2Nap}r=i7$aUMk`BE;fFUow?e2D?4*E z(>{}GP~1Tv$SC_`{UTr`ZgLdk?fr}IX8BOWCLb5FKA~nmW9nmqx#!g2T?P75?nL%X zIf^A7Ce!}L>#`Em^9eu@!_3Dlv8B_kgSn)|;2&m&q~rqo&jG#EGnE8KPCm#OH@Ja_ z$j%fr`5+_R`Q4fPDV*;y9;HdwoqLD|aA(n?X(C}5m2WFmVohQ?vnhc=NrI^xd|;&0 zz+DX;NhiD)Q%{dX5inQT1);AAx>Ww?t>pfQGV|5??`}rk>G6gN1o$9)9pYeFN0f@F zm`Ke_KV8W3zrcT79(+mmIw@G9)BU2^yw<2?O1&5)D*^L@4MSTBThkWRNb++Rx{S=0B(&(G9>;MbHh#FI}E{Z|2IS_sn3x7_wLJR*ApxGcZa)4_-!*6{;bBO0wYy zK(P7O%Ax%lG3Wppj~rc;UQC+VCiI69?vO&2q}0yS6qrnN3?79`Qk!C*;^!lrH93la z6gr}`-%CC!2Jw(V!FVZx7}2xvCUXJ92ER~KeZ%6%0U9&~k^&+QK6Tf0JC5<+9RlMq z<;%vDYc%mt!Z}jFZaRKop8_(dL1dYGq?9TRQoEE-J_a9rG;Xf3nQ!I~@$)Dkao8ah zkQ|Rdd4hG2n4ls0ATZR}3qy=NIpdG0&vN1CYAtK?dMw8Q}{yluN2;v5F`rVcs&eb6%`>2hsc~!am_iQ^)B^n8M}S z5j$b{4eexRWu;MHtahj|;yf_}8&D_cB`ty}hHOk@sKuC-mge*(th~c2gUFxS&!i$_ z3(A097{jJe(3MefKUI|M#J!ztVj_ujQv)wHOKAaC9L#GhM?ZrC?iK-}dL~7sIXd5B z#X@*e9-t>cf6SG%U3z`Gyo;it9tMj<=-n6>c0FACCLNS6Kce8Zl}0vAAU6GrCOf1> zff9`zh>ya*pK^qeL|=?32}aejXG?FhP(6xlW)z~NW2=LqM;6Blk1g;BsMTDV`OkM8 z@UF@kHft_-hyGE!HHwJ?LLr_7X4Z-^Wmw%F%R#C16PWPyY$i zInvm0`*fN(1rWL;GmZ@9X%U8ph!b^3GXV-Ik2?ZzV8J?Ldla}&lP$oc&#=@!O#N+O zZZaT-G`tfE1n`)^G8kfJ zj0BN0g+nfNuGd

he-NwdiH|T>dxmYZyR)!`x5sfd;4>G;bLd@f2bl(GwF;>)$g{uuG^mx403JC6X{JTfL@T1v1pwUauCkd1<8x5;nol+X8l}Z(tRmrSM z1MZ6iR{wCZx%^@MT4@S-g6{&eA1!@0XsJ8-&VnrQC(fFV~A)BQe(ZwcrWe zY>auVf1kc9`h%UEI(FhDiru(3O*R^t?Ks_LzIv;c{acK!?4`ixl*da$$cZk@mfj>( zy+6L#Y_^t4pAddNNPa>fnQPQ;i6+LQ1lDX0t;yp7btDV!g;D~thPtfQ%|7aw76HR! zD*5w~if?D*%rtP<6UWE}9lt4c{0fXgtQnacnRO6XIx;AD!o%UgklPbZ(pb_OhfBy? z%p#uF5SiolGK!B|?1Tb7#w>MGJ7Jb@N4Z}=4ipiO5&}&25!_V5^rslmXU)$QYv~;cFz-ZPi&bS8bb%Y zXH175_4L`gW=mtQG%wwB_TTBmJd9p1eX7(Nw4h?Md;?ao-M?>kkC=whp!3bf5?V21 z)Q91I)@BoX;%c=s=x;dC3{IGkZ;t>{A+Js$xU(?X#^xE2dIuMW%19|WUumC=F=)Y~ zMf@o(?B`~SA%R`$i_ic1-Fl}Mf-+pHG?ifWPXiPR{DO(K^fX=Xa--Q{4@oV4!o638 z&+%}dp=BsCgF$)UwSXBoQ3DNr22Br*m8U(HBa*^L9k7yo^gCB9E4dR$0rHN@XuX5d z5c=B~A`bMvzX~gh+moj_rdXQ7y3KS19M@6@)=t~0jOBkV<^b+v*`YavaJ?AOPOB#~ zUtg+~LNnkM z^eS?IUwnt+12)5>KdTTgTrRVuNwOAE9H_>uSXv-Na`z;a5$hZ->{H6~(s*I|L+IQ}26gJa zUD?V8UI96Qv-$tVK_oDZ^f`G_{Sw0dYH1befmIO$k4LmjFEA<;D$I0!dnG%#gf+6U z4|h!k;+clv4nT1iD?_V@(mqxQD1{*ucHFt#-14>hG7yRD^2QO|qx3@M3EzW&5Fw~l zD$%H+q6z^L+_I5pF4mTe2*mn1E&ZUgkKB`Qa{t)Yev}`_-9}3nrVJdQuXw^!ny|cM zb_Kaf+5rgjKU@U1V~yN1{KUF=!}s!C6=fZKyCq-|u9)H-q3)5`oVu;atMsv){|VQ2kgkS+F>IoIl7h{pd&PjPZbHz|E_ZKw<8UarSB#0O` zqN6ApyVAOeN^&W?Qp0~OgBd0^QC_x?867-fK^2R?MMukCsK!Fs`*V;q`1!@^O50Vx zoT`8frq|+tQPaCd9dTYkk6Tuew=qv&ZnituS~c(*M~)~R>9Ue{3Ye#9P$PeWP^PA$ zcVQ3^ufk;@&rgkoX%f@(bzC5AeuVv!(UE#UVLU=&$BPskTjr@LMJ{bl7X0bUiVhD| zw2&TYlB*4+fHzcskCM-~4=n0q5#O+~1Ht-8sX@Nv?ldN!XE>g_-fG^cy@EpCP_({+ zLS(;J+Mi6Y`Q!ITw`ZI2e5+QwQEmN>XS_6RR~^PxB3Z)HE>u|+-erl@jkSDA_W9}i zK1J({kfgK%?ZT@RpzVN?J^fZ&7SSJMEJXbaZ9uM++Q}=L=oC$40@$r+w)>6L^w&zV z(!VdvUNk;Hy1j}hwyRI76fB|!_Xbj8zG7(k3M>&sr)eZEdYEYOPEIpdx?HSk1L*h+ zg|V(->o^bE79;Afg3}`TBC)7fOhU+hoIx>u13E?bb7v)u_-yB@Fh%Zt#FT!}e0cjIbpX$gr0XX(%wdRrb#29OWv)ddAw z8@P>}Vo+S3mwq)s`ijtdX1Ut2ts_u0(4q{*e>Ik1*b_ z3-BnfMZ~9QBhZ9LCCVn~{mWURV=o^0jy!$L7Ji1cZ`E`;ZnoN~(i0oC&fsdkzd*$@ z5Oq3~g)%%j#7G}&dBvzcSt_^46+0-Iv` zfcF;Nbv&)ci}21j`^7d@KRTy%6$KlWa-8SrFI(M@JE{4Lw*oO4%lX&vHkg9P+`*#7 z_ZCo-QA36h*aCJRD19(Dk6weR8P3d;;6ll6k74+T+$B96t|ik2r13s%X_pEo;UtW~ zV56FM1F_305t9g1a_Ans-L%VB(GoM=%d@h)F+5O9xy`>yA>#RgLPm)DPx^~Ikp;*q zEojbx1gKm8C@5^h0-xQ1li4-kf(RResm#-#;KC#i!4131Eg(dzQ?Iq%Q$@Z~kz|nr zPrnZ+;7N_^wb6}iZHkof&)_7#z!bW?ax@XnT@&ZmqSSyINUdU%TjLkSitDA;wh#9S zWuSI&Z8jI%=vmzfW}^Fq_svU~gaANKa)5CD!Y>XQ6qY-g?|68z34gd`q(sBph=?Q! zzNykYoy$a}R#G<@6R z7E^@kE<{5=h*8c4yT0DwX1A|*B5oIJ?e@jya=p{E<8KH@jOR7&wIVtdF$L{V@5+Qs zPD4>yva?~UD_@Fv6JA{fUAGvV0ET{yZrUL;3kjl~Q&fd>c=ZL7T)06U#`|+$X;n@5 z7ofzTi3dcB?#>hwl#HOE_9TtK%U@bo7GZa41Ya1~9a`xH>*(L?(E3Wnvo@rIRJZ$J|ZAJjn}u*n^W!z422PZA@orbE?UeP`hlA^>7+8{6J(Lk z^Dpr4Pn`9IAtP}C{_DxAxl(cxuwAmsuYd}?;)G*NwA&D8B1?r6C5Os#k<$&~B#Bm$ zB@}ewS9x4!4fmTJBC6f6rsl9OUTYwKJUCoN)%po#TLz8s-~w)l07YsDIrJ1um=e-` zX$Js$uDZNfYgB&43pnSlH=FHR3tx$CciJH JCm)K+e*iLS20#D+ From e6cb6ad15fe29fc14888ae86bb321a1e4ac7d9f6 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:41 +0100 Subject: [PATCH 0864/1620] New translations CollectEarth.png (Portuguese) --- .../earth/app/view/Messages_pt.properties | Bin 70708 -> 19074 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index aefdf309744a0187d10430151fd9f27cdefc40a9..b6445ac6bf893204dfa034348cf755ec98dacf8a 100644 GIT binary patch literal 19074 zcmbTdbyS?svM36JJHg%E-QC?~aCdii3myoN;O;hPf)5bfLvVL@*F1iEpMCCo>z#Z5 zxU*)>bbnu0b#-+~OI56ziYy8u0U`th1d64lm>cg zx>$Sqn7La)h+DdtTan2-nb}xrSeaS+xs6x}K|ny++Gznjfyzn(7A{UKX8*Kd@pW?j zfQEn&67_X8vv9ETBr~_Nv2zxtxajDiAhWX+rqJb9W>a>Rw6e96^LMw>^jFcc@OQA_ zx1*VO{A>b=a@h`jrALV}@vr>@#tBI$BFvY)#0xGMKNxHaO zk#VzdGFz~*vy<`gu&{G+^YE}Uk#VrGbFi{~e0iAJxdga*1UPuf{_8{W(VM%awSb0{ z%zyRuQ4^-H_4ITVU}g33@nP}dWN~q~VP)s%=l=%>2M6;<3uX^LXHPR@yaVGl*qnWvjm!~kr2c`cWf|IMV@_!?C_V_PGeXxwx*UXiborR6n$?2bQ z{j0Tyr-s%4BIAE-?V;u8YQ?Hy<>BJxZt*c6)|CGN{@~sJxubs?eo!Nz>TdTjDQ1pR zE*4%+R?eRCQoR1Yw(bMc&#szw%9RgLwmBgK8G7%VW86O(&J?*nEkj2O!~?~LOuv94>xnK(FZifRghS`loILMXg8r#mNl(dB;^$Aui>`s-Unt8m`jj$?1 z<4;A=fZ0rQb6I>=-kjGA*=@M6d}p^QOc0 zQfWg{R)#t>p=wA>Nu_T@D-@tJp#{_vm5C2(;ebdO@|Z)j{m3cXv06GL^PaJV!pLV9 zbZE+LbP5G@Nfde=xz&Ui75Z5j;`suB)?ÐQv8PcsF+Tb*~)bHKqTdSVz0)=y>VZ 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 Date: Tue, 29 Nov 2022 15:37:42 +0100 Subject: [PATCH 0865/1620] New translations CollectEarth.png (English) --- .../earth/app/view/Messages_en.properties | Bin 3038 -> 19074 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 2eeeadd2c16af47e2282400756fb6654d7ff27bd..b6445ac6bf893204dfa034348cf755ec98dacf8a 100644 GIT binary patch literal 19074 zcmbTdbyS?svM36JJHg%E-QC?~aCdii3myoN;O;hPf)5bfLvVL@*F1iEpMCCo>z#Z5 zxU*)>bbnu0b#-+~OI56ziYy8u0U`th1d64lm>cg zx>$Sqn7La)h+DdtTan2-nb}xrSeaS+xs6x}K|ny++Gznjfyzn(7A{UKX8*Kd@pW?j zfQEn&67_X8vv9ETBr~_Nv2zxtxajDiAhWX+rqJb9W>a>Rw6e96^LMw>^jFcc@OQA_ zx1*VO{A>b=a@h`jrALV}@vr>@#tBI$BFvY)#0xGMKNxHaO zk#VzdGFz~*vy<`gu&{G+^YE}Uk#VrGbFi{~e0iAJxdga*1UPuf{_8{W(VM%awSb0{ z%zyRuQ4^-H_4ITVU}g33@nP}dWN~q~VP)s%=l=%>2M6;<3uX^LXHPR@yaVGl*qnWvjm!~kr2c`cWf|IMV@_!?C_V_PGeXxwx*UXiborR6n$?2bQ z{j0Tyr-s%4BIAE-?V;u8YQ?Hy<>BJxZt*c6)|CGN{@~sJxubs?eo!Nz>TdTjDQ1pR zE*4%+R?eRCQoR1Yw(bMc&#szw%9RgLwmBgK8G7%VW86O(&J?*nEkj2O!~?~LOuv94>xnK(FZifRghS`loILMXg8r#mNl(dB;^$Aui>`s-Unt8m`jj$?1 z<4;A=fZ0rQb6I>=-kjGA*=@M6d}p^QOc0 zQfWg{R)#t>p=wA>Nu_T@D-@tJp#{_vm5C2(;ebdO@|Z)j{m3cXv06GL^PaJV!pLV9 zbZE+LbP5G@Nfde=xz&Ui75Z5j;`suB)?ÐQv8PcsF+Tb*~)bHKqTdSVz0)=y>VZ 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 From 7c3e588a7f88741738175a1c009039ae80dee73f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:43 +0100 Subject: [PATCH 0866/1620] New translations dockIconMac.png (French) --- .../earth/app/view/Messages_fr.properties | Bin 17309 -> 7227 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 7531b1f880577174fbd54a1f934f5ea15407dcc7..411ea29eae07402a848bffe6829186428a5aefae 100644 GIT binary patch literal 7227 zcmV-B9K_>^P)4Tx04R}TU|TKTf5O1cAi==Jz`?+hm|R@o z7!cqCRKftGQNg!s42&T9vM$K1phJI)t7e&O^(%1uWxrH$5vF<+z?G6(oD8J@0C9S9 zK~V_<17ix1tz2GG0AhCl*&;ZjmhY*eUgWZ*==y(EK@)QS=i?VMjwS(KTcQKH}o45d^B z&%9(k9R(u;BLfBoP?$qhe+~kNC8O9rgjoI(1_q073=GT@5n@SG7#Oy)rqVKWi{Buuo)Q_&f3c|KE%M|Npxf zX#Q;mh69xVA{1ctMMw+%0000uWmrjOO-%qQ0000800D<-00aO40096102%-Q00002 zpaK8{000010000$paTE|000010000$00000Wtm`#000_lNkl68L{D0qy^a`)8kB?Wt}%J8bCXi#5l;STv_ubB+0;>wzo{Bt^$h;}E_LxsJBS zqiO$>iP^pF?VlTer|5jg1h4@N?;J?YZ!C$le0s@6^Fx8^iwrIJUc>NKfKiX%TPlV} z7gsE?ouv9WPC`=YadB)*EXx&5)6$w~y}F@2>A21xT+?{It@4(hQz?v7Du7QvdU1`I zvQiiA(qzh77V?(WE~`0z&WFzWurFXlz^qp^@!+F_hpDAq*Ad4}tB>u(C6yVFc&bOz znSR`hi`T1(Wuw0<-L~Uwa;(fx+Zt}$3IVxqR~S=Nyp5S|+H~PEH{<=JYv}7N+ilS` zQyqZ%`|<;3@#Ulhu)!6*f79xlTrqCfbYpHh<%;9zvZ`sV zT(R)OQW3141qrk3O4AsLz5 zG{d;cb#;K2BLSmSt~qVJtZsh)Y}Y@j{;r#mk=QmFjlKrKXT<08O2)FIFo_Lqb+`Q6 zY$lzR23-H-d(RPD|B>!7&a%=XX&`mPS1H$>^?5m~ZuxB1Rec@D1+HZq3DNagkt5O6 zeiyf<{V3N#J5HScS4dKAO3Gaskrc{Lk5-IVC zY0z~RZy9?G^FN8T`Y@Lvrs;ucW`59CS9_bLT?1X6x&2uIeEQ+bmbr%U8!~TO@W(DZ zxfYPmo%dy^{jwQnwrodw24m7cM!#-LSHfSXB$L*^v^U)PwHb-TgA)qi zW1Ft5HdE;*bdTqpObQMM%!4oa=+f)teGC3-#(9UMDe3AT1My%S3UN1IaM#JiQblZ)Z z;k!DW(m|9dY54gHUyXe5^lOVUPnF+$cvLadP#Kb?b1N07?L9oA)?L(CK8<zD5XgQGK~${@_3q zKo?UQP*WC^zR|=CLcm6qu7F@mF`pwzcpZ<&v(oX!Za$81+$bu5xa;|X82%m!uc{P+G$81Nl;ThQV7J4m>}0E#BylGVwe&IG8#*Z z1zhO{=EShe$F@kxSU8u(sb;)h?31L*~Xj=~LYk>QE0V7?E}6Ugo~sDD6e%Pi@S z8gl2$e(A&bL*pZ|wYOV--?dkK(9f3gO6=tHh>$`^Arxh75eZ?P;g|wby3fL9=zfID zolpWBUW}o(UYU%?UcLLyjk|OGrkOy{44x0%TwvLdnB#?tnG*1Xu_Nc^`sc6XAeO$J zJKr-Dh2I{LPM|e~Fu%GKpAuQzPzL|rCC|V46fofch(>(}k(viPHx@TRkU-5H`Sq@V z48zrW5g-vX$#7phCf|PHY5B(Q9+9Eg@rX~LWKdOI=2u>WnvkTl3!2YUg}9>@n*#*E zeME?wX1UV>m}vrVUGr)&dXV72DPg}Q-NPPvzL!js#HnUrn@z(b&-HXd z2)~x2(b1`g_{QKW4YjsF12KUb$Y80kX#moozZsq*3&N8odCtzByHJ+Pw!8p7@Z;Me zw&Phw;G^5acS$1jJ)?FJRCu}yGLab^Pcr*b$V{+fP!q-O6A##8$u1ch-wO4!Boefx zr8KUORe7zW4lZvBOggGJaqqXmV|W z-AFX4?iKzC`R0TEYzV-m4|k|sP0i$m`qVix(6m?`+*_lH3*8#Gz*&tVCeTY zLPJn|g#i3MGi+N{-W}$>fSvKTX+E>mN-BP?ymg8+U;A zNamU73{UJt-EKgkZy_;MQw3nqtVqC-LortlCTt0rHpB$TRf(1<8VW6%ivlVHr~$yR z0+==Bq3zpcUa(mzgXJ)(v|^U-ks0IMsuHZ5QtsDRGNrM^oPe)hc^`_DxPw3K`1>S2 zQ-P4BX^SkVJ#8NqFQ}(Ti8mzW#|VI#9sMprC>P++B*O2V zUOZ(;(3g?dd*M1YN77&tIwkNKl9ZIBw3KADv>=#;%2K_N)nG>k5;1xCPzN;3Q5hyZ z5SeeSMa}_}2qJ4tXRQ2Mxi4O$5@z7TPr7zo90}*1<*BsATjxOXTnwcp^by4F0rkms z=9TJfW0u0|&3Gb>-@23qd=Sn7m=94qKXraMcRv9W<28?|LvKQKK9Oxs`@ zbpbaeNw~|j#KbU@va)q9!ef!$XQ<=&d17LUz0TDNajY1%Q$2PBr(I^FwH62_U z)erp1Q3;N<7HS)r&k6wmFN)uC)^%;((Aa@6(=XbvO1v#V?6&ddH<>Ov*b9;ucMtFMyFT9!)p#GrHy z_o_6zy)FV!b&!XQs6q;XksHCe3LEnR9zabM;1rXpOHKfYl*CWfM>3if0<>WcOyJl? zrU_8ob!KsFNvMC&PeBopd5V?YQ9dhd)UbHkBYqDAFpP0fYifgyoo|nXo}qOD)#QWYaCkargB?Qc4^B+T4UcV-jr+Rb6-=oOh9s8B zzzc=spDy|U)PD(fm&i2L(g?sjlgSpN&+&LhZA_8nu|{??iCy6INN$$A0Kj-M%QTrM zSZFes%t|`fnO7oz7JdB)f=b{LlL$~8+~+eNYz<(O1Bb$ac%DFp>GJ^1Uq&8fN)Z3N|>l)?$t3M*k>zfoF%!^b)5G87DVo)y0N&)dh%Jf8OLU{;LEU2dj z9ov{0QZR^GZOw5H=bqfj; zgL}7u0aS}U(2kOFH7zy357Wyv3WFO&MvFC`E23n6#5BzVx#v@(U85U&h@H>+T{tM9 zbP}MIoaPF>P<589ne-6(Yf+nHRfmAM{optvvIxT09z{fGiaI#JH*7e<(61O2is6PXlu|xui3sHTlQ3F`n9f$vAV^qk(W*KUDr2zv) zjXBai2>VU(7<>v2=mBU}9*Dd%I%Uf=fef_Zkv(0~F*+s{0l$23(GrhrfFQEI zo&d;}fEGlN2=Ny+gkt*QiZkT8GZ!l+n_x!smGb7-g9*%)d{=@seuv*^pSr@X^Bl z>U$;pE|ZQZf}w>dg|RR}=`%oLeQ#OIVrf9;mj>c@9Sy-HAyiihAd!Jk$PfNe zh2Jx;URE^Kq86ab?!h7XyT>1wNB1zC*5oJKUzR8K?NBDLu%ZtA7DM=m7NHSklLZhm z-;1IMO_Cc|teGZjhtA{k>uNd*pXUXz`I-$;=*LU+)dWGBf(KFH%Ln!=#tH|~&MF`T z?jYCWPB0gsDX@hDZPHX(j}&+uX9IEAr6WU86Mb|L8UWH{(_a!Bw=B8&@#o|pp53Z6 zF99#GE-thR9F(O z{R148O$$@=0>}<9f9+aii$Wj_8nScfs2l+rAKQ3{!RjwffG0K-#L#3u&Kg`r=}LfD z7yz1-xfOA#k0h`|C{ts34OQk6G6i$6-Gj0KE!m5KWV*cH|BP#c27RYl0o)JWo zX%!F5r2bFt>4AqyJtP}89G5Ci6Tss)Y@ng=2wZ6ZwSa^_gRpc0F0rt2hZudaPTzrO zP*sFL$OLkPT=ScC*qzH!gg|_c5ZKTyDTNkz4Q73a3?c0_+-?GSKht4;()b`DmKa=L zDg53|=dF-0t-e%R>&lh;rTMkhM%0-BJyIN|M>=W$#o8#&E1uZ7KRNECr-5It?=%6Z zo38V)ow9oH4jag0gk{LC!2x-pyE8W?f8}viTU|D_CI-+Z4-LgszMkvkg$7UvWx;cm zNt6du2&M5F9QqP8v!85=orYERi@_oEs{)Xo zTU8-fp4KimuQ*?>J@agsShgBPM)&lNLiN2;k7IHcKY4022mn;a?n)>HL`{C(KR7OT zJpDRkXMOX(KXc6+$M>KcF47W4<_BI&`xs1N9s!8zz5`nDU)x@lPc6UTxDgGgRL}#E zAXaOmFoO;V;?OV{3kTIXA1gnoxS>2%E;p^3FE_3P4nS*qhbI(%(3XqE@Q@W;>6lux zxu#Tko-tq!PmAgExdFu*>wowBajzU6i@(sAs(P?kAKsh3os+%#9(#JCaoxH&l0&@p zME0}UVF!HldG(D_Rgyi(%uR|8@B}D^LWL)gkfKNCFo&l&dhA z_`v9mZ;Vh=#?XgFOoAuDOqmKrl>M&)t35bcXDyI(@Fa-A4#!dxPQ?7y{r&RI=XSx1 zxc9w0`ue~B?BOb&V9>Z5mqEcw$L*FP= z8_^xl_Ch`r-XdGrAfWQ)C?2;FGfvbxaYB6CZ(fm|Fq77x`ITos`~F{^sDJL+pA`T* z9^Sa|wc0i7SWH~ax)1fy1_Q73_DSFPgq#B*1dt6DYs3cHD^HNP+uTLEFxqqm_D#lu zV4CNNbzqjydB8FUrowT>Jj1c;Z0R^6w}SaD2)5R1eEqqhSMQP&*nQ!6koVRa%23*} z@Bip}*U-L;-3vI(t$|oPpgg;Jj(m01`Eo{M?OU7d6!l8LtnT~cZn@{RPHc!FwWjv> zFMRIuf1b_sZ&?7jNzc6JzV$e6q7cGaA@FF-Mfuty39 zLAi6wPTA5s40r2IS9#=HVE&HTt}|-^aDk=YyKfaFKLCU&m5x8mQd9n>+Cu*BKN=EC6DbnETc%QL*n+fg}h(bc+=VkPG-)N5&#!E z<2yfWbbX%hz(_v`FTrjO(ja))pFkaI=p6w^F{zB-}hrgIE?~m5#JS#L#sv*PQTGJD6jPn$*X-M zvKQ|KM)5p=I$_AMdn-)+J6~&G_#f-mwNJe?pjMvUpSLG~$+ec>eSbLWIG=(LJ_(M_ zfJU&Ap~_bD`A`ZKaPUQoDxCkdmX}Ihq*TQetSSc~5Jq|G#S0Ww4vs}--&jl%7|4Tj zDj4IBfGz_;P5;HhGT+_5Sbs^^>{u<{`;-VEH}%qQ|GYfo)!vJZU61WO6UVv@DvvXYz`S(}ViIfijqpN#TtyZAX2;_scTT9(weaH9fiY zPQ~?<3ZRgnC3pR-4R4yP0%I3|=M{L?3PuquXoky#2s=vws6!YQzF;o+hqq>oOi{|i#>!81W+$-Dpn002ov JPDHLkV1jsYk_Z3* literal 17309 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 JCm)K+e*iLS20#D+ From 63f099b3dae87ffbdc2492289ba9865c893aed71 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:44 +0100 Subject: [PATCH 0867/1620] New translations dockIconMac.png (Spanish) --- .../earth/app/view/Messages_es.properties | Bin 70708 -> 7227 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index aefdf309744a0187d10430151fd9f27cdefc40a9..411ea29eae07402a848bffe6829186428a5aefae 100644 GIT binary patch literal 7227 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 JPDHLkV1jsYk_Z3* literal 70708 zcmeFa34B~hbuV0XyVd)??|r+kdSA4(q}F2XvMhPGB-`?MMz$=;wg$=aNcQYA49tXO zhGmAGKnMgvAZ!Bz#N!y4E${U_f%g7OiR?>dbWx*uwv!*A5jnoqBuyZ1Gj?q5QEuR;eVR@N5gmoIg_n{nft zP_pGH$+v@^3x6zI65i zV+FLA>eDjf4G+Hk+i&{#lgI4ae#C+rYBzf@^`_%=y!g={u+497%37c1HvBX)iO%AK z`=tMS^AIy?&*J(&YJGx|dQC0hqBGpZ7Fd&dLVTNWALIW`Ehx?NC+VtmNqQV-UZWoQ z->`P}V=C9A!C48dWD@1BefA%jnr1^xP9#MeVrbjf#YGJ>puB_e%}qvkg!sU zzn*t6gZ9()yp!p*pRMOzIRE=-Bi8~eY*G8i^*m>ernY)sVz#E?dS1htoA%Z7z;V+? zJ>SHVO^?>|I-LLYdS1^anm$#}o7g9tuGaHb{i}2zujd`iVe6^qoy=yNtmj=ge|U85 z?0xIYr%s=fvkN(Sx;!$!xIVv9l-qiGddl+f%8D$mZpiCP8%yhVFD;gb*H6!%IW@mL zwRGzI%KZBHzP&TMhes-{y)!f0XZP=$nrRd`w6wmlymm%zE4TFtdW{Q>qrAK!&&%i5 z=NFe&=ht5%ubsTsfNQnLr4q{QSvzxTZDo1>jC^wK%sHzmJDL*|OYN<#?Xo;Qe`aO* zl&rR0&TgC#oyf`C)XdPr>E$!0PAzYg7uHq>W=^A8A|sz&Upuuvze>$GxxTa{Z>*g> zchCI#QlEU^+Ie{awXH8LE^nM$Up{gE+>*R}PM$xr*s`{6HLb2KE}y)Q&YVB9xU?>x zJG~^ITUuY;pgz!#9eWSTJC@EYftT|B^Cwo87v$Z`3rlAm4JilT!E#14YBnlVhvuOG9hL9Cl0hXLOhnAgNlb6pdtejs& z*KTFm8F}7n+7Gj{v9P{;_8c{0|Jb;Ea(RV{qd5y}XEwk)!I61+ac$xJ>JoU~xOQ%S z`OF4*b}yufnocaq;Ply*`TI~aXq{bO7L7Q+0m)sjzX*w(nqOaBS=wl@+G;{gi_6q) zoLZN`YL(4r&#v4jZeGLvAm3=g^0|$rm6K(w$!hwkP`EDfMKD0zdwT6`y;qR@2qHSO6xH9CPChDRoMPtF{nPK-~^?A<;+EsyV;l85E}!&5VpqX%~nPs#fa zPVL_}y&ck=24Lz)vzmSe)J}rb>e@OwzXX1-Y=}-D0k${Ltd&Li^!(jR;ON5AG87x& zSb#D3IS8I#ff|ZVL1s5YqEB8vDW6$8SCsErUxv0osMNfl1#Iwb^2|cHD0lYAGfQC0 zlDvOqeqpI7PoJmTE0xxwJOX^JohizDhUM1wwzjrXTcx!sADkX;Sdh96YW!rQY>k~| z_px=h%ucb>FxxWAVra_YIL*pzgw3->T%Ct;FXCJq>k)rtQ+l_J~tioC`?9AYAJDX+uacv6u zn<*R;^fy3j4OFRBWu!ilQ`>j*9XJ1$aWA!Y9_bufLA_jJtD;3O!MQbd65ls-;MTs# ztb{+6&K}X4Q}|v1b?UDSD%8Sr%*ssQ>!{#sgNG#ywypSUM>(pC?w~tQ;n!BalSDSy z3DHJX5+t2%H=G%Q%ueH8;_)fbw=&MGp+^JYA6=o|Hd-S?=Igk6O7wgcR~pyX!G$IK z-oVw9X!kvWBTIs}_u<@mTwAF3jmj>HJBfqKXwP}vL3c0XNIW@%>n*rzUG#qyIVyh= zcx#k7FUk;FNDimP-9%#@EvFW%a%f!H0i+zn*&QfxMwB94%D~Ba)K0uxz^~onNF@k| z)Q$~N|JiG$HbhN}xOPIcr9poj^{V}!7Bye*zYLsG@2N-gXsL=kLfjJa>iyIQ!u&ew zYao+kyR{F5gB#mNT16ZpDHCNGEuxy}4C!X0E|NKMlz2y)qjKry8c8onGaK060EH!R zh48o{xUj_T#qXspl&J+&ig->qxZZjd6)H*y#UyW%(;B`BYYU)x9_NV5#DfNkRLuW0 zl#x!%i+1b>l?~jr0V;$Z>S==$``H-yO?X{K4GrolcL>!aS*nZfZt#~hc@ftZ(4tk` zL+w>twe`MpsGV9)_fdcD#W%@B?b8WSmx}4Lg3I^e4E0%+5NQqF-QdJ|(GJqNpVoik zE8&T(-a4pIPl&sX7OSYC+SNW$y$xxrr3eEms<)!~EO@m79H`n(HIqCV7`~MUM3ppQ z1^g_F-cp@2{~>u%JARsu6HloA>-C;SD+opE8I|X%9k>T2)saHwFL7-NZJ`mMDB7c1 z4w)ThlW5ljto}h93CDZc5gZRAH-$g?J%cl(cSM!?Ou9mnUJ|;uwMEOo0dZ;>*QmX! zEh7s`5+pq$%_Lsz!DurD>pW4ffkvW9=qa^^>Q|*dE`IMt*=hWdMWE4%T1gg&S~!Ce zqi8#gWprgf@>60Io5o$LZcd{$4KC49wQ1Cf|D07LTTb{Ot4b&%IW3`Igzpt__`0Nz zpaj`%vU-$T5!|2=nXHwHQL+fj^%0vil&rk!8Qh50MtlF?Y%p0H(o@omhNP&EB(a}w zB}le3M##8(4dqFT?m-Vp+A80+qWwQ>u~ocHg7yM9M6^5M&&ZG*jsAods$)Nn^C+<- zN=$=ijoK^1L!tXd&^od})JyukN8o@)^EUBU!Z&#{Ra`p=ybR;-=lMZ5UllWQgapLV zLo-lJ&_hVN#&jJ=iaInR527HxP)_rq4}atn&wTP}ZIe!KFq+I3tIh6ky4)VG&mRbe z!XJ-BV{t?Yl;%`Alg;G|#ZtMYwXMC<(b-k)?&%^?)*XXF%!lXUcxl1XJ1Cy5B}zFeBf8v zuQPTB{Q^iBTf67Xz31~(h|}#64UaX`0iygVjv-wVS|WzJj~wD zKEyu8F0jwCKV@HI|H{70uCPrl*P65kw1>5~X+Ng@EA6-Cpd6JyEPphSL@b1XLKgQ9 zvv;%KU>{|lV$ZVAvCHglaqsuoRorXTI<$whN3WQdQtB<(ijqb zs4r7UD@b=D{p^nhJ^V2H2>S$khJBJf%_w4V8)7iGgKu+a{ikvNOW1FL2hXyL>>=>v zrR)**GWK%z+w4*H7&!C__DXh%eFi-G9D9x!&Rv{7W8#~>s@3XlKDN95yK!t>?rUV~ z$0V=f7V)FNdGhAVbbA^}kg14bTe9Le@8i37qelF|-MA_WsF#qZt2dlNb?F#NiL=#e zGQB$;!Ogdjr8}wA7jE?GpZz%JuRC&qZ~oE+ zHWqyr(LT+wxzYv3i?Y0ZdF*L^96zKYPUI8FX^Qgr)0))y)U0wueq4Tha`AC_98<@| zr?n|@#D%5DkF>~7v+3Doe9z1#o*p_9zLs4&a-O~%@c?41>u5LHi(@Ch$h!IWknd)BDaTUM5!}4;+{4Y@F<;^Sno2cXa zOwa!u^?#48@vpJVI6fu#=wnk-kyVibND*m)`J_=cBrTzjY48R8;(x*hM4tLE23~xJ zWpVHGXjcLED0H3Z3m(1`JRm+|fRp|n{RSU3ufcuq0AId}bCfoaKFh3vhv2Q?-4}2q z-cz4e4b`+v+1YD2jGVHVKbhU3FXA3`FYEwElGjJ|#xJUEK_z&Gi$sIQ61 z(lpK?@o(eU0=h5Y*oQdGJYstI4mhl4b}zo^z7*{3+`EJM@WUiGFD;I6?;6v&^P>j_v=2c}p1m8T^${e}l)=ziT{hwCTm*HTCO1 z%kKssz;_{6;Ee;X?3Y{I{c#?icx8;hKe+yq$D*-M%=5@G-;Z&I<5F1 zD`@ETTHHajwOW-NNa=MtgAQL!pk^={@q@~0>5Izh@r~jJoY3p(mtK-I8V!CnNd}!! zr!^T2xJ7RwGA83KWL3I4qfw7qOt+9mP1kAbM1Q!!(4-Yr=}czg30R_|UJ?t`k46Iy zz)PgY>-8Emi^vPUph-H>ZEyocbQ+yb@B{^QU@dw<9Ri1Nfj+1VcMyMZj(Vsw5?MV6 z5_OZ#U^eTGxLFUL5T8(1d=tNPO<))Z8dRPjCmHo7eUsT}08xWU51yD!H@2^}E~)M`NIb&w2x;uo3( z(UaimH29z=RB6yeoYp~<#CLr3>Sdh~JORGYOq>&pB_Zn#^o=H%^hRnr36u)q07g^O zP~1ce6d*E665$f(H732;&}1(I4KJ8gfN7U4wQ%|)MyhF2a+S6n5mOilL@yN zEhHhUb3l;DoABuhpj4GeAjaAjy;D=%Y7iwcr4; z#E4pr8kDtwyonlUu%HBR00jaUzy|}N3Ou3H;824n265S7Fqw2_00LA2b`UTbEJo2( zBauS~O;(#xAca7PGhmB}dI=PRK>|d2v&s`RS!2QdI-42iaVL_&X1$p#HJ$iuMKKh@ zuNz64WJ@sn2k0fYX(80ZZlf!4ij-41yC9F zPhbeeiO(nlL|8N$5(D^vifksm-D1TpW;-Ngbl7huYf|Z&><)_sg>E5DP1!;lRcbX> zu+9Qb8jKDX@dU_%>Vh$i4@M(!z-Y3VEhcnIi?TM5w^+~@lg$KmAY;=+k|v&z6$ejn z8s`W{gc*|-7r{e7+iEfjj2SSkH(E?~Gd0y_wg{e>EDom`Y(iPV6BR?aS8o6S3}`F( zWQF2Da%i&FhWiZ;n-$HlI3OXD%W*SV!4vS=;Y2Bm;}+7WX)A5irPbJM1Yk(dkvzyRR8;#>l1URkT z?64S|HXHQ9>V$;M9_P(uAxWZZcDYf?>b!+CMy>0#O*ZO;#tt}HNe4`BpUK3aL`E~r zD4GoFBI$JCfXRZIE$CDemRr#Z{Ime_PV|T@i4mg~v;ZTX7GVts-3ogJ)d1h|F*gZH z7Q4-8Cwvho5d1OOERdefVx@2N%Vn{9JZQHS#0*3p<$xhlQ= zRR>ytg41DgLiuqM&ebNwRhU{AMSO z<9ak272$r9*XeRvt#+@~;fxvVCK1&p=^ z!WIhyBF#3KToVLW|LFA&o5PBLp3`n~Idv9?)$4NEU3Q1fY4h44dXv!%ZrH4Lo55~t z(phyL+-b+SXA?MrZrJozwAyBOyUcFz(q@CW>|m_R?z4lIlez`)dF`%1(BZK=Knx9l zT+sy=h@rU4VuP%4&gy}ag%J=C)p>0`hdJQ!cYKbClC}#?4##XZ26eYOU`EXVBnb}(gTduMyWMWL)9!KWZ7v&H;q#!XbD@HB+!S3sHHeG;jgKpZbz!7~M2B6I8aQZwJufP}}fS9S>;|#h%%N=lg+yGy| z;R#1vekb^C2PEBAl(mCJ4j3>mcxU=@6DD2xU(a=L&c;IfAOe!tV{4m<2#XDoCx zS*J?Z8IJh;D0B~;o3TAeVt7N?VBM_)#x8-!h6uh-@9 zdJO=2$m?_ayl$t*8FIM*H#58nhtq+gE~j2^*9YlF435B&iZ!PJOmaD0exEhqa@w5e ztIg&1I=rrs2V^}U==D0CL6@BOscr z54yr0TQm>|xLw|;)8Tg|A~%zDt8`t_SRm;3MsFc~18s*Nk~8Rn0hi71@S(|avje-h zV5!^~Vy%FM+l4>3%VhGp(QcpL?{NkE1^_)02zUbMi_aZ}d|@bT4ilAincObD-l-4c zHa7-GmmN^1KR1}=^0+;rfIS32fT-Ppz`8TwiF!fS7x4%DewRD!2_%xfh{xyhIBjm1 z57>0La31RA2-@9_aK!C*I78&TnXG8CKH`b`>~bg^@_2l4w=?Kzj@?Ywqtf*xk|7X| z-$I(2a-DV%Ff;1IA-5yw3b8(S-`!o^a3}_P8C;JG%pG4X%JE z<_iS8{-{3)S%bsDMA9Ge`dwa^&ExhvF<7{8UbNfc0se8$6&5_PL0=3JPt5N~gd<_E zHz2!RK~E}vGg+@n*PBR&BPetW=^JSWAx)z`681Pkt{|G6%DdeRTI%${Jtlq|(7S%%R_d28295$Rdn}c$}^% zP#KT=!fsCtuB^r40N{+WFBx>DXps$`FOs*>s2nK>dh%aEZMuHK4C=!c>0`ZvH7xAUya#)T;0?}YP z6bwT7-CnCd2w7W$0iep%Om{lGR=~jHrN5vB$`J~LlCnD)40wY9zuOy%MEvnkIuehE zqN$i1gTALj@nR|39FF=!epe_E^#y}oKUfs-d%Q_c(A%5}#(cgc+%}sPjrN*Sp>))f zQxqi}j^%^?M5r})Gug08H(V?wn^EW%(!s5?{RzO2x%jD2Id1k&e>MWTPtGXt^bwL7`hn z-$=VT7z$aN{3Qq5KXy_8DJ z>0~0R#7gm4%lhJQ~lY{n=PF7z0Ft z@q`ji#Y@RlDz228)6LD%XepkmbS4XO62yG5s1gErA}KT^>7HN*QW^+m|rNq;6Ya$^-`2%4m(4UAq z6LE_rVr{{_2~XG=4`xDPz$Yx*V=-J#6m!91A|96Gv0ymaoQh@>ZOxfXGToZaWzuoE zC6TRmr&^M!SR(3A#M2R34#l!)1&Zf^%2HX*M50AFye_9d9S&Q|iMCXzt5hl}$#kb2 z%P0CfZYHa!bd%NYVhal0LR#KR8@d&b+byM1BAk!q(B$5cXp})q!wQC>K(hWxBwenI zl98LS{@k1>hUqETzR(wU9)wzamUQu$s*E;WyI-%K{8(oOaCx3r_s zEu@vLwB-^kgu~X_szggN*5Z`W-N__N27>V{Ol~Ao|70^>Zz)?!<;$(DxpaH0ODQSa z+AD=hxtM9mZp-DeQ2toLo64rLX>T@dw=0g`bS9e(CcWu+s|<9=iL5)7O64-Su1dTs zmq}#Psdyq^DmS;~`b%wX`Ic?1mDbiwW?QapY`olCD5rAG(QLXUnaw6rZRtz~#XIF} zvb!hSnryDx?HCRtEy<*#H`ia5N4vYb3x(FvY^o!-d-!Iu1(j}LY`ofwLbs64Zl#^- zXilfy_MU1k(UGd4$-54w(+r4IN-(){u~5VZUj@Ivz0{s-sdRRg3*DWbOnY{;yQj6M z(pKmwjh0Krh#X0z{JB!DR0xy`PG`nBj13K?NIFnZx|&l;syS8i=5zUSp}eg}=`R&i zr9xgwwX|1q)$&+-wc64-+S$|DStyQ{yLaua47FBr<*ZyTbf!y?MYT{YkI?Hn$TRhoAW3=XumcI_GMd|JBFLsmy!7gB z9=-0(BZJW>kHrQ?cI-^0F5JJeavJ;E@89_IjdRP`M8VkzevAaT$%k(Rdjx zGN3gQTGLc-a1$;t6wu*lx=d0+brrATRXUaSuMT__|M<)48yitLyK{4e{V_H&Sy}ud zeqtvO>LA(-Nk{Z`b!k^CUWz+nzfV^`SMFTkfnb~0ZfjqCO)(a?R5cjZ<3w>E`#XM^ zcY!B%>?pZTvbC++negu8hQB*_P}GddsAdfd69d(nHIAF^p~m02u)0cju+1I(eL#-} z98sk}DD+|{245Piz2jNU`72Lgk(QM=zas^tFX9=b1pDd*mP7{>q@?JP+9B;_l|cp^ z6`Z%faDn+>5IFP$hkgKE;Lr~o`hi0~aOejP{lK9gIP?RDe&Em#9QuJnKXB*=4*dd$ z#QN9^Lf>N0w;1#-27QY`-(t|W81yX$eTzZgV$io3^eqN`i$ULF4SkD2-(sY17n!@x z95;Bv!k`GDM?yKe_fS!Km32aF4JD^>ICMMq)<$*tc{MoV(rY>=;+v)J?T^` zy=V9CblQ8{k&9SJ)I9si+m3$rbGO~LYv;~4y>ZvhH@xMo6L`K2yMGveDfnz+%0)b+ zh0QC#guzkAnhsdoDphx91(jASPR02$?@()tVPsCSwJFK&t7DQ4CHo)}KctakAGyHt zkV63}0e%xm8S;5>%ZI!Vc?m}eM<33SjI>l1d5bC=3uI$y$i@QMSU}bS*;pVO3uI$~ zY%GwC1+uX~HWtXn0@+v~8;g()QTC#CItDL;yM!$2AOm-!u$h#Pg1aei0-Qz9@Yf0Z zrX=;cC|8KxI7R#>b)Y}VTTAB)Z@VoV;_39zXeM*}z~IKp;2=*V-nAo;HKB%Ro{jd%Af>~60tmJ}t8R^)(NJ2=(BjTc!2jiIJQ(5y0~K>4z2 zDGlHPp3YMdY5*4u;DP~MFn|jNaKQjB7{CPsxL^Pm4B&zRTrhwO25{jb0BK-ln63*f z4Gz0h?z%wN)u8JFT^H!OK-UGjF3@#>t_yTspz8u%7wEb`*9E#R!QBYB8oEpjyujj@ zFS0y(q1IEznXVVW?q|P*)iKi-{bp%i56hOhk8@&l^0Hd<5e>Q_$%&&H=&1?kf_KADG))+?fSiadkTeIZlaLM z+GpGN{k1=g$eDE8e1HGY@cpOz2cGF4D&%MP6pJobkl(fMPa{?f9~xf08&5j6gX5*T z6_4R@nSZD8I3OBByR8F9)88*7A(HNwUkVPlQ3u}0WfBW$b@Hr5Cm zYlMw8Hf*dBHWm-!!gB~fEOAu}($Io*LkrT-f;6-s4J}AR3)0YnG_)WMEl5KP($Io5 zv>**FNJ9(KLJM4=)qsWkqzx4dz02GB_=D$O3;X}F zxzn{b@83O~%kp$)d`B)XCA<9okkg?|l8aiSOfw3Mj()R;}{Qy8e3iJbo{Xk(qP}mO? z_5+3eKw&>n*bfx;1BLw!6!rs!{b&p+VvO~Rc51#dD{7$0AV7k<}R>y5Ev%^Q26dDwn%&RTeMjC7FD6_ z0)!NjLzI`sdjU(~WK`OJt0f%n?VY=$uQwbi_bSP4{Tt`DZ5#VQPckvm+lLuuqIU?u zUNuy9VO1iX`>MVzpn+ z=SKR|>D~P!`P>$}AhQ;3zX-Xh1}ledhR|v1a!9ocIY=Z2iR2)W93+y1L~@Ww4id>h zA~{GT2Z`h$ksKtFYe*yqiJ&Ujg&df~!EJK+L&%#|8<7Bh5)J$$fS&})CxD*>@RI<3 z62MOa_(=di3E(FI{3L*%1n`p(n6%(X234ioMv~OmhkQM{;s<1@D}Lllb+4p^2I!G! z9HG1!M>Bw8!SxbIT^lWhL#DtrAxkX0L)c~U1Ik|)q!?AJ2lc7uR!N#F7PQ)Eq1b(A zU*E%bJ@Vjd9=g4=i?8rPVQe&$&A?zxy{#n_936cy<#LaVoZNWDZ~o5jf4W@aZ{A-n zmCMtkrSdF!-n19}kFi5igT7R^diCnSM$)EIUgx9~Yz+b<* zTDyz9f6%6xilFWMd9)jYtcm6>w_2=R@YaMmPRVB{HWT;|ez%^BmrQyYx&f8_(U zZ%`9z-#`mGLF8X0dMiSi9mco>B)1}I$OA`efjo$3O*p5;Z<;>R{F3D4#nDUWkuQgEH61l9o#vlyyqaA-ITUe5~)&m8XTKDW@<=k;x?IGvM{ z!5q0;*OXKS#+nnWtNhz~{Zh4;x3nItWHRlANH{J@UYj)<&O{%^LS;)Lk!~KxV=dC= z6@0B@gwkWo3}2HFnhz;mchaC4dIj@DC6lUX-aE3yjf>p4G*bKi5AXlfr=&|)$3C@> z9|4CjF_rECH77>v4Cmx&sD7RcAl23ltyUeE0X007V^_6wp)}G!@WPKvMxt1vC}VR6tV!O$9U+ z&{RNE0Zj!o70|rEtQeQ*MHpC#hHW8FBnl~7am0Lw=tT zdAEx0gc>?gookqogxh<~-_WR8nr$BBmF3fkWczR~_wa+YznuHbaC0+HDnrlxx0y^j zl|Ce0;&anI`GP@XE);jqpO9AnIuh>cj6`Z*`B6MJ*ei?30eO7CCcJ{xi|D&L?+mK8 zJP2DJge?!kmIqs@+%=CL-wPS~6&T#V3THm&z zq1EYX^;>ssALqx8eek2pr}@C(+Rm9hd!Kq}-~P5X(tkqKdx0nu+W%&lb7)fl$q#un z=D*~7Hjy^sXs&DEi!~!dudQ`PT7|^Tb&0Exu+#XTsK*Wp-0iHiH)dD|IseV614oZu z{My{3lJw}y`v*3pOLKGYes+3BTD|)Bk3I3&_U$kST=Z}nJv5V5)L)%H1I|DNG%wWs*IYZCuK?IrxFeLvVIUD{W#rGQ$D42rF-3$k7d zs>4ZreR4#j=grg+n-H`oYri$e|DyIP{_1_T&l6#kB-DKfs4KA#!Lx#F$U>4sUW6vW z%(J4 zG{L0?QuKznM`Jx%9Ru=uBrzV78%5D$4U!%*YpR>qCTO7>LaI0uNQ(2BxjB9u3G$LI z)n4GuSI0O-rl3vi8Pu#{{;h)%>^=pOBoUK#DhKE0$fl#bfAc&1Ih6OXsydQUjLC~u zHFS?!N|7K7jz*fdlgH3hw~^GUdi()QM8oQH+fM%+k46UuLm@ub)^^vOU0vTgkxpkb z$N86PT~7=Qbak!Px%8`oOQo$*G@%!SSg;0(I6`%bH%O^AmsgBj(dfNk$20u4m!kXC zhc?fG8}s~V?d!Ege#h!}L06T7AGs!q-6A$Gz|urEum5T1b{H2B8s!BX!u*dDM@p${pwd=J11$rA?*%d z{ZlmjIcW%C#kTO(PuBbYdi21^fI}0iG$WbNgRM9;<2PZjiKI)oqqY&(4GkWNHj$!h zkgMa66AYi3JI&9{ostSyzl^HCjN=%3LH6PcuorfWrC)*ugH!@ZMm-HwQN)t!B#Z7) zEse+R}d2gWZ4#xDoPF9*gi2gWZ4#xDoPF9*gi2gWZ4#xF->{BmIYa$x)dMNkW< z^N(NH_kh*$)T28dSQ;(-9m0y1^iV_=)bJ+FAFB01u;IRyZa@0gw;#QYA3pr6?>TgM zabV!g>EYqNZ5tbX+xXlk=8wi;D{%erj^(jva4#`GEub_cunuV~~~=7Vg(C zurPQQK?-l-8-+p|BcToaqX`cAqdv9QK6ppIhIiz{sP2PzZ)M9`rH0m`c*qwr-haVl`9q7IHQ z1ggUmJv%t?$hstbdT#E+lC&?K=9%mP_&Keur_Y_PeOp?s{d-awABx4O@1@O83(UCj z;5SwzO6WI@G!FDJsP-+0zLA?ERvoZO0)IKA9;8X6BS_0g_aVI+>Fr1#M0ytK3rOVo zHPBZ=^VL8S#o0w{B7yEFfW8FKmjL<_KwkprO8|Wdpf3URC4jyJ(3b%EXo`wJ$(ND& z2PAk;WL+=fxoLIwk^$!|@TUkfWcV{kDU3=fzdmE*@SYk=5*Ujze)#@^Y1cd|F(_rE z#eE&q%I)p%|G+2S`PSQy@?h|D`((QvKGf>j{{DgfRn8M~+_QJ!aN8Xo5C4<*edzh) z$DcX2ef;#1Y-h*L*X+jUHBau`i5jDb3+Ckc85B{(Xm8bZz;xOMxJ6kh^9jl7)cuwF$#=}Ke0-S z06>8UIed2^1r^L)8-2ZrL>IO!;Xxdob-~`Gv;k*k?t`gQsmsOmb!6$QrPiF9m zrjcgw$qYW3!6!5LWCowi;FB4AGJ{WM@W~85nFXJ^0Jg@=)C~@ig%9IM7KO(4w2JvO zFpu2<`0GL%M>>Rb66tQFS0KFw>HSEbM*2Kb9rI~mo&vzIk$TMEiPz*)2J2DspzsPr zAdEOjW|98Xbs-U;ZG>#a(s*48WJybNm9As^TFP;G@1K=R6Fcrdvt!&ar!N*KCyS*- zV)dQf)zPunJuxx)HLZ4}SWYGfTB1=`sgQ%`cD%Erqw_?+j6FV`E!b=sZ*4ug(A_=I z51w0r{B|H;&oWzGDqx1z>gbIS)CUQyp@m&7(BW3F6stIu?|oBBePa$G+I?^dP;LU! zI}1tyHVVrGeuj{OxT#@V8lD}+!pM4A8_1;fa6>&5M+23*^6ad$i6#{oQDF^4L~3HL zP(Y;b_|zQVvE!GX7~2jf@0dojQRzIh!QWGxe*5k*igyP{Dv6`uS2sUMyF(W!aqC_IEq=ndVic{#Ecpz-?HPksqeA)iF}NH>iC z)Qg5Ez=3DjnWI;&n! zW3Rwg|L!9Cf_H@qPlKc7ZpF+MH=5t}vGd>h(R~*#-1nnzo#!9q?%HqGewiz^zu_nO zp*kn#LEUiU{D-=rdS~@Isb}O_U-u_b3q~&|q8}~4d$x9Uu6E@tzn72IPLp5F--ecl z(DEv18xcX-I=LcSqb@krXK5Uhs7{_}#oX*p{+n07!QWAPK)ST+>eu!ilITHN#OQYL zeozufykSlM`tF3AW@lIeqh+u=zx2QZUy?2jT-6T{FK<}srzr)k^fyrm=Y3e|AH-5W zN_C=?p-~%osVdCThwIKT)uxVFq7U%uIw^hWOZVR|UApqbfb{Rw?r#3~oRFg8Or1-p zIMYIZn2?sc;#V?y<>}k*9Y1z#T)OnvANyFnrQh3p0BF2Y%aI11x73Y$0zn>Y%aI0~CM3Y$0z zn>Y%aI0~CM3Y$0zn>gCAiKDQIqpD5Zfj|>6dIxNxo^^=49yZZkkN=5if>+RfQxV~6kWwNHD0L3Tb`Kd=sI({y%o)IZbO(%1Xg zWGEKz+!2rcP{PB3cP#k*;c#&~=BXz&n(=aLsfcyl?`SkBgK*LDs>^pibk$UMcgRVk z8DnErfb#CkVpS=Mu`Svd+oCX8QH*U-h%<_@EsC)%im@$dzOoVmYeK+L2sjD>Mw=(`Vn_o44J@esbW z4}GWUi%L5N+A(M+4ar!ACksbxR)e0j;_j^b8&2?pCdHjwqdm0$#NX7InZf;_i~P4{ zr!@XTvG>fj{{H@#^k=i7+81-VT@%?X&*pY*$D%L7BI6~Wf7h;uUNttxy}rV4pYE#m z_AJiz_HbCL26t%bF~?qceZLNk^)gb!4{)H>4GqX6Ptzs}XV7^U@^tjz=)pO12WZC) z*(&nSvLyL%UGiZe`DTG_3-a_%aKbrFr)g>!yj(}awKZ>aoKTPuohJ`0m8kdM>*1fC zu~)l~-}88X|HEhc`t-bZU$L-LlG@W5jCOfVDm}O_lX>HwQt9zmymZ&j!J*gTdGMw~ zot@#xe?M5r^S0J8n0w(-@pkDsc-q)?p}~MnO`;VMEfV#Wjx;-^bF?x`#~7_R5nQfM zH^|nj-WS1%L`}gJ%Ik5o8ulB-Jo= zl=Jqr*||A6vEA&(!&!PmI)L32R|aY${IdhwC21gr7a&P|fII97ji#UUpk;FqYw!-N zGj_0Fzleo+bupj~LWtF2NbAlv-0tzc`Fu~a%f++Vz13cyfA{W(UpY4F4;030&Qq0+X61c7-OI;hNgZ}R=J})no7Hc2n)jI~-T4yDx_8pQny*un(!vD}y zRX5u?iq%q^bkrtwFKJ_KR*W`^6YG29v$M1ON=+*rzx{U5-2Cq5D0>fR+Oc+o$p6hW z$x9)cE}}^>H!=_82|MfkB)f)@tS-q6?JMo1dM0OiG`0;-YT5>DR@8X)%X?)Rn}_?35#4yFw1TYBb5tV9i1Gy&JWWA8Z0AiKl7~wN@*7cRj-T?(Z)@|H8>< z4xw+R@Bd!yc`hCN2nefnuy+fd{k&N7#4H#uV$DEh)sH%^c zj0SH~OE7*1GOurBKG(<`Yh>g`=DQ+8RunhL7$?P@#~PW}H!`1VWS(nezAG{m97r%c zO@`or2dznfQ)JC)Wsqbq7#Y-E$1S}h_ z2;fO}m^PjQo=%z;Q^1Fi%H5@6TQ!}wh05jL>1>A2@<5<%U}6>v?>*@ZguGpsM>IVe ztzb>Cqw`qp0w39_C{ud?;4kvw9jRu(db0M#hSvQEeD>2EmDbW|o=RqNE5B*ZN^5Bp zpQavq8`|a*n&zx)n&`=v4s307yj<#-hEq8kj&$rurP0V8CBMI=^%!Z_Q8~`r+K#H) zMV?X&EwaOKA|g!wI59B3rA;)P{r@&1Tx~>z>+2skMuc^R!NCXa9~v4RJ@>%i;2rt= z#7;aqQJ9#R*}Q-EuHC!udt`Fw?%fZp;7yTT%P;BZI1Npl*xVuI!7;qMiM@BL?I5J8 zJHaTbLy}VmMH+>=J`c#iQ29KLINsFjy3=T87Eiri9F?ifDc-%2~+%b6EF?ifD zc-%2~+%b6EF?igx)fy;49m4zQd&hSZd#>){JRb~B?0EF#U+L+6Yb6@R9A9y{Y^j9YGoDUoGP??a0MDls7asDI6TQ2N zMJ%Ear>)?0QF;@+aO?*`&`dOtJa4iKv`$2M8kXp2!jaaBX!b$Z$!DcwlyE?sn8?q% z^*I^B2A=j1L!%DGV`6lJ8$xlZYqQO2BZ>j<+o@QO&aSLjtPwNbhv7pkwh|5<Lb%s8tbR^`61**ZNyr&I#U)QYG;N2XjTfhwzf@S z$8{ipx2BGz)3XyTK0hxP5sBpoYG2T3_9&@R`2_c(#S}Z`e~lLZyvS=+jl6#6$zzvJ zUOG0*-&fP(4mE1~=g7S{ao5v#&b{yGgLfXf^TDI$eDRCi_yf?@Z;tZsgRT#*lj^Ax z?->%!(Y%m>6`n6GgJWjW32h()GRQ^5Sc63{=*3Y7-U$}L%QY-7EWh`avwslnE#rL* z7ltKF#hi|gGT3v2;0qZSaorqU_eIMKqy6cQH{s8@CR#u z#k*?9d28(-Xwvt{zyN;)#Ms*ADnBlLgKg)71Q|6#>Qh(2UWDiENZ<6Ak-!kj8<8iI zOL;;tO>ZdQKsCk60ys}z8|52zjq)^$ruAUTH)11{&)|Hfem;jhML6kv0r^5bUqYVN zROx&R@>FLxj@>v%`CjCE>-lZSZ>#4AkRPb$hmfbTBcx?CBkzEO70ivX-;j0%(EOwd z-D<4#2$KLE6Q)q?n-&kCkVVva#m+ImS5-ze;EC@{dada5;f=vkHnT@@x_|=C!;${} zNSID?ms8o3&EO=|Qa_??R<_~oUp_zHv9v#*Yw9%k16jP%0WSu!S+?g35nVK27_(aO zoB&?+l=TM;olW^HJZ6L06!2QiroLuu-{oKd;W5%z?j9-r#zaBGwJ!brR z%=q<~@#`_;*EeSTdd&FsV#ZGa5Zc7tzzXFXSfTtcf)yFG$@3;0WRcI-^J>gOJzvIo zT6?E5t;kb^obv6+(@0MF4&n+Pq8SaGqyaH3l?$JVEDG+sb~k@{$>#$$vf15u4qo7; zYhWO(B8PLAE4dqCJ}v=ZlOs(^b01#I<_(z4hW)ubuoLiS@$NLdk;iJ4q~V#UE>g&E z$GZ^mQbfFe2e8WG}7v|_xIBOB==hK0#zrSyd*mk zjj43xmsNOEUV}U>9a7j$ds#%TjKHxGI5q;u|DT>10x#5p@wN&Dua&?aUsm0G1^q(X|(xwn09O^&@_;z9UByNaR80jry-PB z-S;YsJUJKS>XSN>ROvT48g`WTQ!Gk&L{uV#Z3%c5fkg$LQ(|PpW6ab+tajr$W)Yp& zK=NHxjXMAL^Pia34~8OgMSlFTHIFA=i7#7^@xp0`t2`pjHQ7g|hTn1EP}7F(+`wmE z_Bzd7wzcfpN~rcKZCja_`QpMuEo8X@n?IDa(qG~~1o|6_NviQlS}F*@t0t>-ebz6e z`U^j6OS4ZGi;1q&@-R&`)L$tuLBZ7&u3f}KHjVSt0`crdi6&@hQc3vI>NC1t|1;2v;DCNmi5zmtt$x~P$qrhILSQJBySLH47Reg>Zz9^we4~CP1N!r%#)a#n} z&9!$Lj_nFQc;fcEb;nG1b#D*9{ndtStJ0i*Wu&{q(4BS2#WXpA(_7y%k1!tOIrBu)o+EY<;2L?o#2D<}peM9m zgs1Rqph_-V8dPakK>Hi1hDMm3TB1g_>$*a&3vFkm2pCy7nsU)b?F3{-2Bz===0=bW zJ;L9>K1@3HJVAgN=!7RGRoVxn&W^IAByG~c?#`}a*U0SjaA%>j+JmqDLx+bti+!<< zu}o&H9W$j-Jd9U~eR;=$+Xkvd1VB+{X!g)(SD_QzJ@S7-g-|%19;?J+mF>_8yt7)` zBmEIYzi3TT-Of#`hGg;RNW3-UNXkq{H;qdacf|s|K%&@sjtd?jk1O7)S1*#%sqd^J z4dM~!gtX^h&f|0JE`0buV{^b`A2>O+bl~Ll(zo6+f8YfD{dfWh8rnQ7X{0aX|D~8= z|9XKP1j7y?Il-`lsG<{X=tR|CY``El>H<5U;^_eTaR4$t06ZN4o(=#{2Y{yoz|#TX z=>YI_0C+k8JRJa@4m9v|0C+ke@TB^PcuD>>+B7?!RM9huIrt=siMY@tti>ee;FFkx zPl~@I_+Cc359!rNZ%6td(z8fkK%zPL0Z`jVD^)oFm^7OnFdMA9(1Wn|*PhI5%!aQ$ zJf}MUn1+dkD$>|3yM(%`v^!3nPkTKYjGdhwX>6KPeFXk{J0*{&oW{G;oEtLroP3Z$8!9GCDG4c6aCTJajIzUt3$UB;*RPX6?;O zQd?XGTEw2Z8O=0cMp6EIXj0PH-%rb2>flEYY`g10eK)v9vvJaP%6sXVldXF{to57d zX@sBtJOFeMH#$Io?4uJXZ9E%Ad-$s~HAhmP6L?RJ<5{UY4RiO;HJ%lC>ppy_?VZq+ z?}_yZ`cK=i8*Kr|Ttr#`*@iV*ME<`fE*nyj7y=S$!CN3P1SEz4s1T4C0?tB+28Dpc z5Re!G5<@^@2uKV8i6J17md(LGdiI(SNMS%NjpoP`lgU*jEv6m2A{1W_O{(!(6?QbP z=$ga>F2X6h9?-!(WW?Zo;g8nW=?~-0wdsqm0_f7H4wtm^RWo_2A({hYvmYz()@se!3Eln6-FdAzH=jCLMcAMY~4g zp->U;A=dgFb^|=&Vi_*3y&}tIiAUmaWJ&7RcV`DMZ$Eb9+dmpoSL#w1gYjj64X7aR zFa*1$&QHPhSe@(SaA@nR()5J9qwah-U;}R6D~-2x35M&NX!j*a;Ktq3QinB9JEaR& zez{iC_R!wx{u_2p|I_U~2ln^gKJ&8CojXQgVF%bEf0WbCB#JhugR+=nqsbQXzWv@z zXVn|$;;?+@o8LT+#2vRyJ&M2E)C1bz&;}>mm|?b?KXBu-ZNr$d5UhsL!3ygW`3mx; zdRUM~7UGbk`p+(4k{-f$!G617zg@83F4%7u?6(W{+XegWg8g>Ee!F15>E#f@J9WW+ zi&sq082<}L?}ew(2Mz0MXjmVF(+3UfgNF4%!}_3MebBHzXjmUKtPdL22Mz0khV?f!#0iQ8sAKA0vSNYyN^}5hxxO2ReB%+pt`yFXVT2$yj^So< z4SgU$$IxY}WRQ)a5<<=O0YKfq)6m#!I;*4I<}?Asgz@_R-7?-$LECq|PVwlS*y_`H z^3+pLojOV1Cr^z`Po0NW@$*yD@4x%*_rLQU)mY5#hy*Nn)4N8}jq0INPFJ>bR|5O2 zoz4`Ws4eF9m?fRdl^?{*^!1LOw9WbyFR$8d z;gHSxU%V^vAl5>f5e>^x%(U^|7}{$hfvH=cGNPauMWG5fQoJ;YWGAnOCViyZ94-jW zC+PVOdMAULgD*#04;z6}SULJZT04kIyFxBqy0OpTBeS!ySP#W%W=#esUZkBtxTfL{ zcw=!ziOU`TB7Lfc9cM>#g>vaO?yWtX!tM(`paGBNJl>fK$g?bVD}F$%S=-s5+As<; zkw@CFOB53!Eu)o7@@D9*L>5|;C5KD z$p&b$0h(-pCL5s1252(9K1OJ=0h&xNp@C*->z1Y^=O41`ccW&SQXz%LpVHw+-KY_wY7+-!ruBxK_?gOk@&To~nJ#5X+5>fv3--}pwZJ^qF_aO3pUtH++0J$(Ct*N?n@mh?}*xmQHg4Xn`E7)8z@LikWjpq$W6 zI!n9O#gl=;S~e-2YD}FE-Y&xE&wSz&YTz8<{}=fQaP=vYbHJnx0|}njr70jiS3nyd z2!9mOrWq?~ENxHIA&*@dG@5xa4tX2nkQcXmfnP7iAuq-uFUBD+#vw1pAuq-uFUBD+ z#vw1pAuq-uuj=VJ>p>uT`t$mmgJ^+V4ReV-%&`6H$e<+P5z~_#>ij}^<|}w^rnm20 z?GO0(YOBAuE0;^9r=-*~VeuC>3t8jB9~E6Ij$|9_r!H^LJ9uXxrS%Yu>{ zI1|rqUVmH}T0o=K^)Nm33!7;Y-e>0cXYt(i8|k5CY*E}iA>o-spu$h1s|k{|L*g@_T;|9?>Tk)FfdDfoJK4EOP>rE zPkB6vTAb_{Z7u_}(HR;&sUzeUP+q(#kt`SO3nL{Kp(q^bxfNPNq<3l1az`U)x|Va) zb68__a>a;85HR41XLPv}%aC7L=cBbhJj5fRWRzv=us_`2bRgxuuL9UCJ!u= z2bReL%jAJ&^1w2AV3|CyOdeP!4=j@hmdOLlR23I>fd0YGO zz8Q?BEiF6d>rY7$8eajN7}+!h#8ep2yoNABiyCCh$*xn>OhR6L)~W7CQY@X;%haca zu^CC=1%5{TS)M9w(FQ)~neFp)bG0Yt=3XsT@FY_8>K9NcbXL@l|2>bkgkWB}b!54@ z1vIkU&;n{MIg5?a(FU)LIBygBtEumBq}I@0NAUexYpQrV9?jt?0zk~Y);jwxsRQp| z((JNhuhwL~u%)%{O6BvZA$sdFjoQ?18YfJ&%k%n67Km5i4L!$B%p=~=o68!{9c_Ki z$z9hL!JNL0+B1CN0lbJ|jz7c)YnSjghSeJE8r5aR|I4?Gtef`sQ5cpsZqUxe28YPk zGeI`wA=9dxP2D-K3e<)Ajdfqth}n6iQ%u1-@lpY7ou;{zlEi=JGMvou--*L!uu6B;klGq1+Y zf0Oou`#$m9CfPD#KXI7$_%KLCwe^;I4v~NCdujwzX_=lJa9CWv{R0dC63b+_hp~7{ z{|inj7;x17?SHm+CGb&J*Z$s_B$I@!3|S_VWs*rUlWnriWU>xPfIt!;B!mzULf8q5 zxFI6$3ocZxOI<1|)@ohrf}+-)Rus45*1BNdYqf3_t!r(8nfL$S`wfYe{+{pYYx~+H z-1FVc4By=E-gD1A_bmT=v`mxNA9$=iC&z4x?1?g&Z8jf(aUrXVLvNdB;0$3qcB$3k z5r&*#e0NhtgLGxA_YwGh739SOagy zD|gM2KD}k8QG$D8nwC{B!Cr-6SybsLX)vk0bFB}^^Ihl8nLB;@wXOlzmEAL>?3;C- z$>bWySdILprq##UO{Sy#wKe|Z>={FoCZ4xp`t+46J33FdAZlO zc)(x7)dN5OcNw^17If}kfltQJ^Cqy+n6Zl;j!NW$r+p*rZIu^IZJR4MHSP!)OW4B^ zcvGOa{JAvTP{XFiuy|mRrRTsa16`cAdzq=BSEB3H_g$<9iq;{rCSx2Z4J60?`}m}h zM_^R$2)|OHD)>r#o`V>vKaUN!&O0zFcW?{NS1MEmk_VqZ*nYAiy@!!T`xzp2u>E`n z)qeYcv=8jRL$@E#zyxeOL1lPW6JD@EYEn-E> zJ$h@S`1w1~(Z=VEN=5jU@2d)W2lr17YX;PrIIHQxUq7d8&+@w%^Wr-r$JT%xBHfktAXB7e=!!EPZE zi*6N>SWKuBQj|TeYZwr;lu8gMe>|@Ai9ypub~?m8v(qD;$rj{><(f7$wcvL!&@dR> zIyhkf9I+NLfxA_ik9|pz7ep3&DSfEvL}GN}u!poW11!PtCR3@5f(k}u5PdAgJJ*((hlq1mIQ=1}_PQfKD37bx64yNjrvCjt{9`IPa@FX?8caip;;}zJRUe z9>J=2Rp0vgA%7`*5B<#KNtNzKtu_3tDllx@uEUY6+0eKu`0BvJ^+iQMRRuZ+p0c)f z;bNchl#ZO%rrcbJM7{5zKA412z8~TmPn3m1u}$$#0mTR@8bT8h<$@$B1KEU~PS)c> zKq~?x()k+DcxX9JRlkLxH7IQ;eJIONjz!soaw*CUDBDqXq8OIra2_n4pAwQ0M+w-t zbF9gFc1#=AnHdTLpRlVP4G^)M8mSg>M-ZM+=&^@XD~dE(ues%zhv!yRopiJ;8F+kJ zVPR=W*L^ZI_`Y;R`h9&!{#_xd3+3lGOmaBTC!?A6%F*Gk`G;lN*TeSjHN7Dm@Qb}j z!K@R_G`hE2F~E0+?oI10@+N4dbwg^o!&1u)spW>$azkplA+_9)T5d=!H>8#uQp*jg z<%ZO9Lu$DpwcJW-jm6y%^QC8R0r;BSO7C9+To#&(A)mu8_k+0IdjF~2HV|7rM}hFDX9i!Qg8pC7m6;i2dxEjwJ3kvc`^W z8COv;uQe~Xqhr&FZIkEBxqeGuU#3R}vlmx;7cE)U(13&sN_pm}eh4p`6+K-d?tzyC zQ;xCH^p;Sn(GXUKdIIJ?jb4Nu$E$cnWeVaGl=&{*d*2%62wn{*9Kh@)V*U%PeXMhV zOfkGObp6DluG1Bn+hEmU3Wh6`{RpT^D40t8)8Ankwt-Liqze!S8Fp7qR%UU@qL2EI zH<`*a?11>KI_XrT@MLAz%l%o|fr{*$SaW=iqYics`S7JFDf!6!ed$)K)m@&RhP8+N z_G9$hH?_}h?U(c9!$`N@&(i`#=mgVj{O?3?$Cs6I-#&1x135;o zVT5YLUb;OsatY$6zZ2gS88Jl^D&CCIh-cq{wYucsJ|Q8TOxFu`)Y)3kw?>^PRG`p|izo zs?5m9%C7Z09I`i})<3Y&>y>F~MO9guzM3^F>+84pvU6;z8C@$CzXD^1N*&@cmQahvYDg0grqQmC}Og$c+g1Z?rKJfjffhh_>ot9^=jb-oCt5 z#w_X&ez~}Rx%>eVt}X=>6Oy%%Q_Js#o)-fH04&^LobPgc)5veGIMg>&38b5ofFxzm z$GCFntocLRl-Zd^h=ht8t5(@&Y1tBceruc2xaddPp!dsnQ2kDA&^Y>vDl55A*`PhCnNkk+Z z$tf-7Qva4mFqRLW`fLlNt>&Ri(1s+jK^y+R9X2a?jQeaW55HJmg_fUa53VrA=To$MjOf%h3kI#kf#XJ6G9z~DZ7l5! z-v}94#py8W6MNjP{r&s;`}cwgo_{_VvDa9cMzim~dG@`YMSsR9eK+=IXg+uLYt@G= z3@-TBM2=E6XZg75H|D$LX&cjScgDY-$VjVRVoX}QCR z!iSV)8g+7Hc-O;pAG(OGcui$#qfSoXYh*uO?P^C!%aPhaa$wcU0we=xo-@kDuureA ztlws9fv!>$X^Bej@6XGKPq0KsM=t?L*#0fG@d+mRK``P4Ch%sYBj*-RO8x6g)!WzW zwJ!!=_%(YyxVmaAkM6a!AAdAohl8u3ZzZXnQ@T;qLG&2wuTwI5Z>1@o!r2 zF>>k`W4QID{+Id>%+Mo;(Th-H2mUcnM=eo2ukH7oWGW1m_eWPM55)iaiF9kx{)10+ z@EQN=(ex8>py{yUG*{Mr9nFOO0Jvj#pR75R9}4e_DdzZhB(8d&%*Yhu>BHR19_Wki zI572KCukOiTqnM+7yXa`Bh^(}Q4S-QhkJzFYr^d*R@nRB)mfsj09cKk4^L*Htl%0$ z>}Mj5vTnv#Qd}mHuMNkWwvi;K8AcMM9J%86oIF%jS?1~aqJN{wRGSI?vt~M0q+JDt zGrIB%5PJ$BY5BC7#kANOaFsf6~4W(tXjBdz+ zt*Be(5ZY`PEa@{kT&~aWO}CX7r=>~@0!-DuO8!ChMLI|SZ=oX7#z<{e_X6tp`#Xya z1yBFCJwQ8I%AuaT5D(3q)paz$^B0O5wEkm(Dm7NJa1_+_mBwql{{lB z8Frp0hLK8$OcIu6KM&hgTEjR{(?043)0{(NQ1v14gP{O_zTkDFW^zSFkZZj%I{GSX^ze{)`A4XhDd(_ zj@eSYKnDgF4mvZqqvqd~^#v9u*KNpj9WU=}0yc+s9aL8V2_^o_h38Jp&-Zw`4)mYg zl3~xzs>fj`Pd>RT%2n71Wd9;}FyhHCY#F6R>FMkv#zTDpP3j*XAuJ5ZKo4f?(;hC^NhX^Ln=6V zIYT&D95fZx!q`kR?}LM;d{sUqLSM_ zV&LwyvmzsetAyqix*3ME5_J=(Nm8$&1{sAbGZ4wXW5Gi__E$d{JoZLS=BtOiY~-UZ z(GQH4y5(M(i&NKPzHUbdD=+LnDkN-O5+xm&J{iUI2sRi(Vvc0^e@~Y$iBW&2U-R*VD zW)RbZkKzaIsuHoL&8F>GK61n=_1%0*uH@_i#-nIfV?0VcG(X;%3J2Ma-KUmWT=`l! zQBW!mI4DF1*5A z7+#BTorY^Au9ezO8-T|PJ_((H8o+`cfX6EUk5>R5uK+w=0eHLu@OTB_@e07>6@bSp z0FPGy9 z3_sEw)XR`8&d-#gOL9@T2e5&^vhbNX=sd#Sb{hfHbMSr`G>G+je6}7luRupJ=@lfL zW)pVixs*X~a_QX=?%>9UI#j&F{SOS8u()Ocr`@Y7ven`tlFpOu(UR@Qb-*K|2={wbU9 z7!xbgn_vUa%NyU2pP%cX?&k|#XY!a4Mvm0_772XSfH46B=+JVb)5}qJBB_*}>qKW! zaB?D+Bxt)LKEUcQp4s$MdD#tPr#KEt{7Lo&Iy-|YdxflIy3BG ziXL{EURh>ti!SHIN^)PKLy&hz=${(?A|J-!8gb3b~PSbUeVMD3}4>@UsWH@ zW2szITU+0-!nd}rPNtg8wR!n@dFz@SxjEUpI|>R-GS-HpSO?2JEiLBCim7I^$C)Sp zWUZ>6y`b6~)!iNG^S%-cx!kptxsGKYnsOZes?1Do!hE4G&2vq^z}PcosTRmjKWEap zP77hud7N;lPGIs`opE$^9qLs`C1&UF=wSwaSE(sQpk3CK+=#=C;xImO7@s(dPaMW4 z4&xJt@rlFu#9@5mFg|e@pE!(9TzJOEVSM7kaw8RY`IeaLOqO?R4lD)-7Kb^o7#vuP z$1YY+){g5Olp&N2DCeMDfpQbd{V2Oolt_9FkN!T2Ay->)mloWm1$SuyAGhExEx1by z?$Uz0wBRl+xJwJ}(t^9RC_ZK=Wd~&$&x~eA^7!j$BNdxxIA<8nV&cJj#3c0@kLv6i zbx<^SLir+EEdxv><<#Rwg!`asM5LMtG(px=Vv6yZ;Y{Po>2~=lwn7PX9+~pRr>v+;_jXvz6aSPGx1ht z7UPiR{yDXN#9__pt;bLAL>wyYp4jFpEG(R03huyr{#w3u4Bv6P)H_%b)p<0xU}bd+ zznCnJW+!NnY>!4s@_;Km;4TmP&jarAfV({4E)TfN1Mc#GyFB1754g(%?(&4W%LDH6 zVDK>OGcn_tc3qLU|_cgEwrnK>@ zDZ48+K0fuhp-I_wb?r+V8cT|2=O-n5Jd>vsxt;lqSB!~@YQL>H$DuYIRmH^{itHIF zDUSTq)Yw>ARiB@qcYcp2Gpnv{U}|->+g*@fI02b4#r6KOvaIdawA53c&v3hI8VU;l z0X{1s*HM~hb4gDYL0)*_yx2>XcB3Mbj_0Dqnf_L$bn zpJHOSVTpKLY4VKMD3HL$9>&KXRs*>u$${`>r}C)Tc+3yhsjyK!wCI`mtz+nvcl$dy zJB{r!PGQjcx6Tz~LRFq>IOBU_4ZCwJ>Zt}JYG__aQ6>7q`D4W6lnlOfj90ygvJ249)mCL8B|I(^Zi=`6)wZ*h^&_sihjIIy!4haNt2;3m`TnMd^Y z9>EfPpuM)Xo#nm>6uCGe+MEIe9{` zCt$KsgBZbk#Kzz@D3dEAjUL>4)6bEBZ{<*O?@jI3rfx~gFoOjdETnI%-=S_6u8lKl z6_qj4DXloO1baL`j26HiDscLufC2BTHa!2Oscw7V@y6;6#|EF7oY#4>58dEJ zIk~g5@twCeZ{G7!y16*%FzPGpfkM>-aZpKsb2;*K*fDH9eVut|H(SkE0=p5=N)r>? zE75M&Q(@6Y%ka;qHlWoq7ua?L<$@S=LPTN-N6<_)c0z1o@O0fWF9K{^Cix2{G{<&~ zJ9Wa;sx{e<=;j80_)&V(VFyb5WfktCjGBs-jTJ?KR-APl0m(jc+{&e$vMpaVkpljk zj9dP}anm)m-hOL|NdCze9>vbtMok9>FdmE?p<>^{+)x7P%YH3EqepT^o}q=azca8y z|07SmLxieKd|3&uZapS{#VwL>XjsmOP~-C=u@H24j7+~)Nt#m8GE~u0RpTvkFZ2}>eTBB3f6p^3 zrKrcVyRi1!#YQfY!%@R@1kov@^CPvPji!ot6z&1Ime^=fNW_Qu!FbHS;nRJzoS>~k znP%`G7=6MmE(46IgR^c$-AcO$_ELIP)c_sNVW@Fm{XlN+@|3*1@_~UGw|m?rl@+E3 zpEa2#q}fa|LN-C`sEClJ;vxVXL-H{5mRV44F_S#5cifb8RO2ZEcy$_A?x*=)F}1TC zNPF@x7qSFn14QX3jhm>fe02!T!HA=SIu|qmDqxIB0*aE?m;0IQh^VbwJ*V1>qyM_5 zZ@6h@kL;Vh<*d%B@dI)Gn*PO&jh5hcdEu%F6N-xi%bS|y(xqD;7#!^AIHs?%s-gZU zc%fj%0&l{ea5tVO6)NdN+^FbKO1cROAavPaE?PX)jdhx`xN+g=(PYjimfAvKhb9X= zKy4wgW2Lr3leI&WwL_D&LzA^bleI&WwL_D&LzA^blSME&$}SY{$O>>r_8q^alzj&4 zt@_$DGyyS`s?L}$X*7*W0OxrTbSx`l6NeR0bQwZruy!)K-_SwBOt5VzX71eY{b2t5 z!{%Ln&CFiQQe=^CTQfc&o0`_H4d_EdFaQ3m-ob@;A;EP1{2%iG=>sQqv|q^MLOahf zna=O*WbcihKyauN2qYupWe`z>g`$%@rG-2BrVxd;e_r!(fG_k0>l`ZgsiMy|IlA0~-TP_4OyNsH;opjV{Qa z&{3HGUZA(MBsZ_>u+q}WQ_ebNGGK3(wdUpds%K(~t5N;H^jow(6;t5Oug-}ygYn3a zF~)xOP;-JzY17)N1M|WWo)-?x3kT+f1M|XxdEvmkaA00IFfSaK7Y@t|2j+zX^TL67 z;ZXB}-vGUm7AHL)h`|~OJ%v5<)%jq|gJJL-&I87&g;4|*P+(rv))_Iatt;2JwzRe$ zvn~*bp3&cbTTxNR)F>Pz1>a*HX&S=r=}>=68T7$~!{3=~a!X z>0B1GvAT`?`Z30Q7=xw^8%}gn%)9mOg3Y2ODH1E3%2HSB0~64cok*qpFhH9-c5ERG zLFh_|jEah$g2NQ#_FaRmt@RCSgRkzBN36w)VCs3O0f*Hf7pTY7({rUPLqbrscjW@V zAF1s-??aqIw{q+>;(v3d%)sQl9Q(LrbmL>(+Juorxi(rh6*Gt>kr@!@=1q=SN;EbEQmLDg#?q0e|b_VY;JrjIMmL51~V{-#~ zM8$T~qhUd3*wGGZxZDNuM7L<@t^EFI$}$U&A$7V6s?FE6E|oD$WX#gm;3uCQf6qO% zbllS==Wun#Ek|*Lu+d3Z9T$*r~{4S2rn?`YjMsb9cZRLNP%W>ITCey%qufKlYfXV!(X{sHD<_8ZvYHCKB zbfx{k-Pos-&qi^Clva@rts)&-MLM*KbZ8Yg@D*hUWdq7NC|97|gmOR1E)<2^J9oNMX@iH% z1}~%yUPv3fkT!TBZSX?c;Dxlo3u%KF(gyZ`I{Y#!zej-=lJ)@|&7#j}(VMP#>^6*( z&<%$pc86(B&xrU%e~oG4Ktg-_*<1SO^v=BQ?8%ek2BMest!-#*ZeBCf?|=8mNo{h$ zf}4Iiv_b~PukGlaHvPgAyJl2Y(sRSO<|?)0`Jd*qeEgQF;7x!`b#)!Mn0Fe*P#VQh za$3#RvhwzI?|#1FzWX+O{_Z+?le7kJ4*pO&gKx-XvX5)Z-x)*cU(JVsHQ79h38ive zh=r%ZLH}7Wp{OtYd&Gs0Vn_XZU`LJmOku(r^_d>@nTB_Sqex<-NMdPzY+m^r4$c@w z5*tMl8$}WuMG_lD66mj zujF}!bHT!Xr>K(g<2N4P-2BgjBsLnQ+tG38DBV$nHO7yRBCJ6UmeEE9S*Wuv&?)$P z6k%-?VND0hhVyis;EGX%wNZq%L4+9?N2?eW4IZa;DCUKZBCM&n#8HH`QG~U>?g5pJ z7|zfbi7oey5!OcYt5nk8zifWhD1zQMLC_mLOMU&BQawTi5bI4OsLJs z_aX)i`zi_%m}yQQQp(IDP&^)5vc!|_bf(+#^LJh;PY#}Hs>n~bIh{5e@;XCrAx zMP%E#M)b@`tdp(t=ACTx($9>mDQZW!qfFrn#vZ5snu)K=6N>&SuQSic>(obp=$w6K zVdkM2d7a<-Od_2RUp6wYlLw^bfDcA~{a5ok^<0WGni6J3HY;*B^9FTZr_THL>i9*+mX$6HiEaIV-Rw=){ALs&})D-k14zx3;o1&1RrgA#R7);DWRI8Cd$yBun zqfcom2uHUNRgjQoOsGuKIi0D&=xF_Q3xkTZn0_4+<~hvd(`BOap!IM zUQ6ks%dQ@ndt$I5+E;PuDefk@Z0qt>&+J*$I&)ldSK+Ev%N~_O?Muu{Cb88{v>NBE zBj-7rt!9fIMyrV$Oh_O?eNaa8R8E3&rsHq&nT@R;hgRE-R`bNa7_47xHP7$Xt%jXi zH#MOQm^z$Mk9K z8yA(=XC)-o=U2F=w%>MdM8FH#%y|A?K+j0T_vP|D_B^!8iNYyNcBHtY)r5UbEF>bE zC^3lFG7dfo*4u1jnq{l0r9n6%6n|?`pM)o|hAr=Oc42A7>6Ac$g6k_X*8m6kYR-qr z8(-Xb^wA9^@p5;tETS%O_==V$IdIp)!G#O&ymj%CC5zvmSJyqGeqQgX6FMfh;(5a3 zpr6O3+NF7c?czD5>{SBzB^gT)+ZFENFq)a=Ywa?{G`1XzP6l1y+&CEFa7~%w%8if( z!QVt@7qzw)WlQsh_G#1Gk2|h?`t&J_r+WN;&(!v&f~qQlNrw)E-j(}IuLCJ%HriAG zj$u0pOp;{e$tR)iKq4+*Cx%44(VukeZ~*A!;Y@X)9)&tzCypm&uflf*WWU+zs`mP7 z(x8@%t*%K;vv?#rx7q?;2OejlOa(%l+*f-4&g?34zS-=m%6xKgMXEQgvv*C_^$C~7 zMnsrTO*|^&+_Q48xHC@1d9B%A3n1T<%*#EFvRM(4zxJBO<)>M_@-eIVbWHSAu>Le; z&!_P$;NjePt)DPIo{IowYNBzq5)X$bDx^^!;7JKH!AUW0H%7sk;!m-t0wgS-A7wl+ zsB%qHKUjyK1xMmXeqi#OHr>3eXKDAcnM>cjbYb@*{_Y1J+rgh{VvBf7rpobhrd%yg zF*!_=O?%8Yo8OLD99aXJ}tW9chp(Pc-KT~_vz=LF9!o;S-Umfu-nt+=$( zQh8xjPjyuFkE$Q@7JF~=?(;q3+gG!u=9-${`kVagYm;i5Yj3T6zAm=zmHLSKw)zJe z@*8e!%x(NhQ&!XMfr3DLU`=4h_{i~9Fn+O>*tird1B7nbGzog zaG2w;x8^zKT{Q0(^P}c3n!jbhH?VZz;|22@4Rj^ck|FVg_^DVU7Kznju{c~@jq|g&inVz6 zX>p`jiu2Y#7e|Sw#P`H6#X9jUwD9M|dhs4Kp=IJlaXe1i*dU%48^!J7M6q1_QCujl z6~7WMiIb4bb&6OaP8EL;ABeq>bVoyDzgOHX?orA|6uv<~P!Re&8f)CU;$zf5L-|5H zDV`C>KstN~HEI>cz>HV_p+7Q0948}Xl(MF#3Q!Vc;XnV~Pi=UJe6A{*2x zazOJz{{+r=fEJ2eP?yL9bz?356J|nw=nKq-0?-mgOGP2-Wx^Hu9J9j>S}uw}D?~A9 zCF}v8W44rpKEsSD1@%Hl`3y7116l*^@Kem73eZ|n30kLUy{JOHK~#r6!L0IvHUZ7| z6U?p}(DA|_`WUl}v_;f{wu(B?38FsqN6fkg&`H20|08B!6X;|`r-(r4Bh19{pdF$a zv{STzP8F@84>2<*fKFGmOH4$4hL{A}E!skRFs==sZQ|iy5d7i0;t)nBhI3gJLG=LeUGl2pMGWW9H5Zy@#3J z2f9?u23;olL6?g;p?5J0=YkH2!$4Omx=PGLeYKb$dIxiV0Q7LN0CcSw1U*75484un zPkNMC1bVbs40?=M0=iBt4gDT+U>WFou^jX`MK_2Q*y$fHhCnxpm7phxRiGz|)u1Pd zHK8{lcSuhWhl8Ff)`FfUjtKouoGy+8JwqG?dZsuUbQ9=rA+L@BJzJ~;Jx3f1dahUx zx>+0-`cKHD4WQ>KdcHUw^$Wzt(0@RJod9~FI1%(BaT4go;$+ZEKz}2CAWi|jRGbQW znK%vfa&da-4Q$uW0R5pj6ZA?&w}?%sUnR~8?SWi88}u4+4(L{KF6gylbLe%*RnqIk z_dtIv&I7$(oDX_~xFGbJ_=)&F=#An+(3`|Xpf`iQDsB-MgWf7G0liK90Q9HgQqbGQ zWuaHZ9pZA(I~Bc4T!H#F@x#!sAv>=Gy+>>T-7c;Iy;ocfdLQVou+6*%^k-r#=mX+f z&Uz z^ht3m=q_68C}rTHGJ{rFcdB4D?m;0O)JtLD1JhpA&n;L!fVnhe3ZM9s&Ii@hIqj zipN6Fir_%-N0@k;0kv0uCjdO*Ae8dNkSUJvd3FZ Date: Tue, 29 Nov 2022 15:37:45 +0100 Subject: [PATCH 0868/1620] New translations dockIconMac.png (Portuguese) --- .../earth/app/view/Messages_pt.properties | Bin 19074 -> 7227 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index b6445ac6bf893204dfa034348cf755ec98dacf8a..411ea29eae07402a848bffe6829186428a5aefae 100644 GIT binary patch literal 7227 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 JPDHLkV1jsYk_Z3* literal 19074 zcmbTdbyS?svM36JJHg%E-QC?~aCdii3myoN;O;hPf)5bfLvVL@*F1iEpMCCo>z#Z5 zxU*)>bbnu0b#-+~OI56ziYy8u0U`th1d64lm>cg zx>$Sqn7La)h+DdtTan2-nb}xrSeaS+xs6x}K|ny++Gznjfyzn(7A{UKX8*Kd@pW?j zfQEn&67_X8vv9ETBr~_Nv2zxtxajDiAhWX+rqJb9W>a>Rw6e96^LMw>^jFcc@OQA_ zx1*VO{A>b=a@h`jrALV}@vr>@#tBI$BFvY)#0xGMKNxHaO zk#VzdGFz~*vy<`gu&{G+^YE}Uk#VrGbFi{~e0iAJxdga*1UPuf{_8{W(VM%awSb0{ z%zyRuQ4^-H_4ITVU}g33@nP}dWN~q~VP)s%=l=%>2M6;<3uX^LXHPR@yaVGl*qnWvjm!~kr2c`cWf|IMV@_!?C_V_PGeXxwx*UXiborR6n$?2bQ z{j0Tyr-s%4BIAE-?V;u8YQ?Hy<>BJxZt*c6)|CGN{@~sJxubs?eo!Nz>TdTjDQ1pR zE*4%+R?eRCQoR1Yw(bMc&#szw%9RgLwmBgK8G7%VW86O(&J?*nEkj2O!~?~LOuv94>xnK(FZifRghS`loILMXg8r#mNl(dB;^$Aui>`s-Unt8m`jj$?1 z<4;A=fZ0rQb6I>=-kjGA*=@M6d}p^QOc0 zQfWg{R)#t>p=wA>Nu_T@D-@tJp#{_vm5C2(;ebdO@|Z)j{m3cXv06GL^PaJV!pLV9 zbZE+LbP5G@Nfde=xz&Ui75Z5j;`suB)?ÐQv8PcsF+Tb*~)bHKqTdSVz0)=y>VZ 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 Date: Tue, 29 Nov 2022 15:37:46 +0100 Subject: [PATCH 0869/1620] New translations dockIconMac.png (English) --- .../earth/app/view/Messages_en.properties | Bin 19074 -> 7227 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index b6445ac6bf893204dfa034348cf755ec98dacf8a..411ea29eae07402a848bffe6829186428a5aefae 100644 GIT binary patch literal 7227 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 JPDHLkV1jsYk_Z3* literal 19074 zcmbTdbyS?svM36JJHg%E-QC?~aCdii3myoN;O;hPf)5bfLvVL@*F1iEpMCCo>z#Z5 zxU*)>bbnu0b#-+~OI56ziYy8u0U`th1d64lm>cg zx>$Sqn7La)h+DdtTan2-nb}xrSeaS+xs6x}K|ny++Gznjfyzn(7A{UKX8*Kd@pW?j zfQEn&67_X8vv9ETBr~_Nv2zxtxajDiAhWX+rqJb9W>a>Rw6e96^LMw>^jFcc@OQA_ zx1*VO{A>b=a@h`jrALV}@vr>@#tBI$BFvY)#0xGMKNxHaO zk#VzdGFz~*vy<`gu&{G+^YE}Uk#VrGbFi{~e0iAJxdga*1UPuf{_8{W(VM%awSb0{ z%zyRuQ4^-H_4ITVU}g33@nP}dWN~q~VP)s%=l=%>2M6;<3uX^LXHPR@yaVGl*qnWvjm!~kr2c`cWf|IMV@_!?C_V_PGeXxwx*UXiborR6n$?2bQ z{j0Tyr-s%4BIAE-?V;u8YQ?Hy<>BJxZt*c6)|CGN{@~sJxubs?eo!Nz>TdTjDQ1pR zE*4%+R?eRCQoR1Yw(bMc&#szw%9RgLwmBgK8G7%VW86O(&J?*nEkj2O!~?~LOuv94>xnK(FZifRghS`loILMXg8r#mNl(dB;^$Aui>`s-Unt8m`jj$?1 z<4;A=fZ0rQb6I>=-kjGA*=@M6d}p^QOc0 zQfWg{R)#t>p=wA>Nu_T@D-@tJp#{_vm5C2(;ebdO@|Z)j{m3cXv06GL^PaJV!pLV9 zbZE+LbP5G@Nfde=xz&Ui75Z5j;`suB)?ÐQv8PcsF+Tb*~)bHKqTdSVz0)=y>VZ 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 Date: Tue, 29 Nov 2022 15:37:47 +0100 Subject: [PATCH 0870/1620] New translations fao-logo.png (French) --- .../earth/app/view/Messages_fr.properties | Bin 7227 -> 3038 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 411ea29eae07402a848bffe6829186428a5aefae..2eeeadd2c16af47e2282400756fb6654d7ff27bd 100644 GIT binary patch literal 3038 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 literal 7227 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 JPDHLkV1jsYk_Z3* From 1b77af22250208c2852c5a65fff64dffa22b54cd Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:48 +0100 Subject: [PATCH 0871/1620] New translations fao-logo.png (Spanish) --- .../earth/app/view/Messages_es.properties | Bin 7227 -> 3038 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 411ea29eae07402a848bffe6829186428a5aefae..2eeeadd2c16af47e2282400756fb6654d7ff27bd 100644 GIT binary patch literal 3038 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 literal 7227 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 JPDHLkV1jsYk_Z3* From 757fbe4dc9877ae1e79ecffe9bea51efa6c1614a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:49 +0100 Subject: [PATCH 0872/1620] New translations fao-logo.png (Portuguese) --- .../earth/app/view/Messages_pt.properties | Bin 7227 -> 3038 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 411ea29eae07402a848bffe6829186428a5aefae..2eeeadd2c16af47e2282400756fb6654d7ff27bd 100644 GIT binary patch literal 3038 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 literal 7227 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 JPDHLkV1jsYk_Z3* From 4ff9417d8010a03d74a5d1af3d5bc71da10953e7 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:51 +0100 Subject: [PATCH 0873/1620] New translations installer_icon.icns (French) --- .../earth/app/view/Messages_fr.properties | Bin 3038 -> 11933 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 2eeeadd2c16af47e2282400756fb6654d7ff27bd..0589f39b42ac62e1df44c27797657da2936753cd 100644 GIT binary patch literal 11933 zcmcgyd3;k<_P^c0Wt?$PoSEMbXPlqg3@WlIBB-E%2nDK$0|O{1C=9#8xQ@IuK$RUV z-O?uMk}hfJzSD($DU?zg8cLcpNwd8qui5wI{LTwFBlDB7{`0#ZK7{w~_nv$1z2}_o zIrp*lgN>gMGA3v3ClkgK5_iw`4I4IoNT6k)Uv^%t=~t=NtRAuD-9irpz2^SwSCy*u zE4Qp^f}qvm1>Znlk7DzeD;vRlO{M7V_k=V``IAe&0YjfZsP(w6x!p?7nuQ%6xlSe9 zwx}nd3hVmjEp;$PLx1h0XO}3nfkFASwPB4>L+_coeMhau=jz+^(g)#zUZrtm(&4Q| z0hdqtO5&hJdE@e1AAS6p62N(N@uWtO`V}*uc%{A~8@x zd_`CjH0GuX`)-`o-+)8eXcLR4&zg`FG;U30YpG8 zOsla&t`M3IrI(*LSAVXz!j2ojzdQ4rlz)8nMm;adv`d{vU0vN$t8o6lc9 zpFBS~&E#PEk7skYrt{yNI5)8jAQ%SF6@T~jk-6_D)q=<3at_+TCQ94?)Z+c%w1e9i z3Yy_YhH2}j>k*sdbYV%EHsT0N4u7%N>kXVqEiTLAGfp^nh{KP#9EI89y4Kn&evqeb z+9iy*O$Gd;t>=o*0BF+orMtcE*6fV8P!(E$%oVVl9OGs%L?^zClF5l zUBV*1FrN=$KLww>uwfk`F?SIX8$-x%rq7xFAc=`3_(<;Ce997mh&lTYBn}^+?nROK zCjz$F_+pd>0wH_>kpOrm6H*KTe2BInT#O&@|NaSo!!Umfg#Ps+4Buqj{+#pO51&Ku z`RX4$MRO<2gJkCL*TG_AZQ&OsAa`&c9o40)Z z#iliBnjJ7a;%C%K^?-s>QRJ@m>o;ur$F_}|PJ9aqLAqb1R#U2xgsj@~#riGlH%Qqf zdQ1a4t=<)(AkL~%;bbE}TDNZFrgiJCLO8$&XJSyTJm3Zg~h8rCRlu#S7ok0@Lm7bJMCD=jz^=Jni)< zpM{;u9v66V1Kxgf&dLC&Z61YPsTz=dH(}B%FU^`&-rM74AgJxvY@auO*5AV*cbGLM zrAi@P^VqCe)UNt{u4`T^fKjPQocHP;fF8M;*7vLWTj&3Vzi-#xZJ&9RYV-k%QZr}n z^c@h^_O{#g%6?VB_!mA{m65r3^`OnB0kA4HZ@e*mT^MxE>pcpMsz3dAvqW$2-LUM_ zK}XmEFsRJlKJ)e0-g1L+pjXz>u8?sbTCya4SL0i079V;&*p!NyGhdt84bJNtqwmt` zGn+^5-u>R{wX1kw2PmyXYvG3&)l2&+|ca462L95Z>!a}#IxbvHCOoeY^Nfa%j` zzWA;kyq%Yv;OJTNt4IGldCA$}_GPPX zVGn272g|pqS5f4bFTXPFE36Rl z^!CZs@;*)2r=i!*m^*XXbu$BzX>+DbesSv956$Q-j8fjG>axK8`Ey^J@!A`2uBAaw zrcQWq(xl0w-@b_E8TNZUem~GlpPT;jD^p%P1zkX{#OA1LzM=O>Jt1S2L+c;<=U zKR)*5iH|-w;z_tNItT0=NG87;S#DPzWG?Gqz)aJMh9;BfcCz)@F%9}} z*oq=e6pj8{+j6R@xv>d%5FlW)FpSm5`mYlK9C~D3V`Fo3V*`zm$f>;{>t{4NjlqTf z>oz9S=)aBsRjtImrwv+zD_~Pu^foPxk<4zSjWkWw-`!Ao7DMQO*=|Aq)!V_sm~R;H zD9lC^P1n}f)gawP3|2;m{_9fv!of(;CN}_55=D=yt*MqEt=NrzwbA8d6xYj(yL|wR z#(@Hm?<*@SN_){djRR(%LZ<9(N#|!Zdcft=hXM7c%gZH49pF?441O!EyV04KEi4eW zMm+R@7yP)sa!E-|7|d?J(QTy7>Qg*kPEKB4w^kc)Ldaq?NlJ@a(G5HfGj5l$zcQ_` z@Wg4w1oO zLT=Qw?k_9vIITQ-*&6hE*ztzKLXpS>UY*$%=#%x-?mcs^s-{d9WZjo_Z<$C`DCodw zYBGSw&?`B@%i-}vgJ!D#@qviD4InSSKv3xezp~E@9!>S`@6vK4n()c0x~k?-Z_3tV zocyP9uHj5Klva;@py^m^k3Z}`RasNnVz0)-&nqa%6&4QSX~}!_1I{o9CJy>q#bu=p zPBrpZey%V#msjaU)7BXcXrD|ZWOvsWiHoWjH@?j)777GHUagygdz`evU{cxPyttSW z{i>+6-VIKYn=Q!U3o;~n3Vt661_GfFxGQqaLH?CibzROP`BjzS1&Rb9fzdtO<<@1gla`@=IiSrVZ_U>8q!iuIo zok`n!p)NN)yXZ(3#YgX5uwZ`DUz6UL%~kAxdm@(exmiN-VO%Cf?p^fG!o^D$Brd8) zf7=BK&ZbO$Za&2yMaYM9C(TM)@YhZxSxo+2F1I_trVf{K_(Bf(+3Wx(`bu;TbwQA^S7*7y>h{9=(i*?;7-gwrR%GNAmR3ka!u{e%z&_{)eYPN%+OZ=Yb@vC{-5J81ywZwNQBKz3 zZu?-!3+_^0{x{$5EX1@g;B{2;1pI=s^6eExElu6kK_-N;q#>hV_nuvK$d)#jvml!< zD6T5$IeVhHIN$GZdLwWuL$qh#H`N&ZtR_!BTBEqC=2+eNbJZChzYn9p#mvI}2lf_4 z0HdF!Fq@w%sj0tScCs`*-yewJ`1TC4_uzr70Jt&dJ}b!0lhm~Svc9wR`oV@k(C?4H z#k51z;RlWwAYgU)Ed_-o6_r;n)f~;f805f=2y|@UlA4-!=qyAW4jZ0WK}|!IM3|Og zIxZ?Htnvgfx~3n=OfB(2$ZQHgZ;7~4T##F$4sDv9H2eKQePMP7mH9L;4XY|YZE{Bj z)*` zFU}Jc6z0~_tQUuZp)dyL(u|z!9A1_R46GODii$BPh%egFi#-*&g$4QQn_irkn=2|R zmPks<&L~V)w}a7Mp&iv?aUVFstQY^bu&B83qoT5k@}rW9+UCaE%E|^{D&^ph`f-W4 zMEqrALrraMb!AO`n+?-z7ZNS{#tyPWf*xG)_f6_>kbQwpOx8!siFhn0Znl^>wwCz5 z#m0UAuUo&-7sJM`<|HR`R*g;|F}DG*4v8D{@lg%RW)u6!wJ%4pS^M`5yPqm{vNK1* z*pU4|w>dsqys!|IwGCY~h#j|DI249f6cH5=L+(mLCqt!w&@ej6pTOb(qM(SKGqw{@}) zVOUSd_B%+&{vcZ()w1c(kGC*LANuXJJC6^8;i*4q@7#}7`P3TMS04*&hRi;4P96N7nzV zp1lnfg0pv#m>6>JxgXac0^G-+n}p^w1v9MMM&5deVE&xT8qjJ$H~x_phRXZU0MWui zSl0a?KoCye6Sd$tGT#WHe;FZ~I)X#c`P-WojDL?3vgdTmJ+Kq2K2ZGrmIts?#7_FI z|JDp)>85f_p!MTOd{jL97weA+Q`aY>doKA?0vUM@Y_HxDehU--FMq^wf4s2t=IFI+ z*m8Qr(>AhOm5r76rj11=o0Ia!*=$BlvMPfle7t$nhB{9Q#Ck0njw%&jAm|XY2V%oE zd~uL{v3cW$wgV6o9^|O@lY}ieV%xxB%$qfoYA;E^$Mv5K?0}d-U9v1zY4mX+#;>PT zyGg>vjqCsR@jx=f`g9#s`(09-d`c3P?}V#cDK7xmo6m*!*zg4cD1AQ zm@rPuCGo31Sn=*o4kXB>Azg=&1H=866IQHd9Tdce=7GB#UTmruY7O$(jE#% zm^*x+>`;foHm&OHiMCf}?KE&8&L@{j5gTN&@$W8Qx@0{C4~DvoMp?T~cd1*YQq*_7 zK5_C(({d3k4@q?hwooj1>5{)J;!`lv+}@>=D#0l~(RAT*6K@;~p0NjO8>4%$3(>d( z!wFfu_??AG-MBPqhuhcg_EV|{dd}82B|Y~X3!f!I)s4oe+PJ`Bge-dd&H3|i>4*iR z6!gieUpG}vdgayEX3m^FJF(xa>*z2WZ|Z{RHy6yCw-JS#r2sOWJ6Sd2di@t;#!Y(p zwb$p&PfG4;mxe%%XnR!lym^U~lN(d|A*dk8Ia#OeCcW5(_KbS309y5@C5SC?DIfvDs}%uNd@NRV~N9PPkWjc7iM zP{+xaQa_qC7ojq@9HDn>RVqT}%z0xri&f%Mq>!w7K;HB>1W%m&`BxvohI!3CH5g?G zHnQM1X3u_|LaBLkGiT12fjj?jmsHsvvbHr{lAk#G=;%f8(E(VTwry^qTMnRPJ;aDs zLS|AkNF!Q_P6q9RVCgws-?Zbg(X(6UvB$pkTZp;A+R}^}uf6s)1;4@5mSIh!S1Fpm zocR26&rgb?K*#Ni$IR*CqGXbQ$XBOhhWwDOLyn61^@P8LvY2bJxbzfOhl_k}!SRE3eE!nIqjD z?Hy{&yw%qdaRa7(dXf#6-*8vPRlxc`qaVNW@=Gu6!lk(}WW>sKx?K>5%T4AkiIu?W zU4(imcIwoVcnm0~OWDybHx4GV{%D4;xJj|a(3y%W3WGnuns$4P*QIlVo(aVKc zhf>OEkMF>ZKl<%!>~`-Y!zRBl>G|iTx9ta#lJYW1p&*3}$2SuvO!!#056I4)Q^-yV zX>$043FF6)dwGv;FOW6d=gBq-_LA7~J} zkR!q>_qeoXg%+#Xm>|x8Y|z+HUyDaOEUZ;nT`CO5_jnWghr!Inp>e;ftE(z2kVi&1 z6hWXBW=z#BbZ?J5PjuRe0Y0eLXb>A>vGIs3Z$LH(tE^V7oM9Adnl^Oyi*f|Q{HqAo zhc)t|%`%iqU?gL#|>pGdcMB`7=;hmb)u3i8;D~{F0*KP&?66{WsZ<_r)Bcaw^YGZWuVjq zDwU5xHemG-my{GExh7~8T8|vK^oXlx5b9S8FV+>6AXMwqBQ(K6;}u^CRZNf`6KGtD z29oIq^j$Rw&Jna8uY;yi6@EFgYB6M6Suj-`Q*;W!4C9bT!2_~_w9IoVfx%xv*OZ!E zc<+tigebU}Dk3fHZqQ(sYxErYfxf=fC|Xh`LOrZzyvjkNxh1+Nrci=x;8TTZxmMa| zplR7vg!6JL)x~~oNgb##lAan)MJXS_vtnL_~pB!e~M60{eihv#TXFO{6Met)vCnz{uK?NK{a89N7R*TZ}68BiV0-!aW zi{G>e+UG-Ija-hAC}Qe6A6*rmGBV2rZbKa2y{97=Hnkp$j+YtfRA)JOs$7lxg?7?+DNS!inj z1Fs(uNCIy!TD)upB7W_{dvz0y2sa(@S)C>;-Xp~@I0KTv;-&9>z?K9NtI6%Nc##AG zCS(gH7-39aBmp&tkLI)V-S1_=1A?9Dh8GXAF@Av~q0udWc z2Qh|qa`?F4fBW0UkN=LQF~VyKf!*Yc_&de?!eU`j@kw;-xR8xumr3hXQm2EptRsQB8&9a$5yl=<%hf!D0!zkOWxl?mc_Onj4<{gdZrsx9)4;{)x5(ru%cG`MYgg4_wg$S1v)u;r%zCCH| zXS)d6a!egwnI{}PbolUhn2tPbVeE9oQ6d%zixJ)iEf=BiROy~mK^uOjVLhadwUWc% zr5?c|cObw0a}~JZ-BJ{1tpbNkwB_Rar?C z1qyCgJk~sxqZmVvq@|~4uq5Cz*-$a2LQpKJuc^fEPNF=K48G(h#TNl|R-u!mXJlq} zAQDN1Mh@|x5*0_+h3AYRXeW1hTp4((kp?m{vv_$d4FpZJ$r*xx@zNRGfTL|l0}(jL zT^Cmi7i-Xuvv}D#n9M~pz*w8hg*1T6&EkF@+YIfyNJ2JdDSVa&P>{uLqHS(W#=H`{LL=do=ECFXE;$S4W+l$BRh)}1*k?LBwCsjj~MDg;`~%UiMkF!>$!Ra910RafIZaUFIxG@!vX zv|uMz1#CwR+kx++gkZ-H=RY8XHPJicyZ?D-eCuZE|KsQWB&xiPZROOo`+s7>M^*?r zZ(Wt${3&1YA4aTbyA6Buq5n=JlKOuH&A#d!`y+GQ-*yKy`Fj_5|C-_UEoVD_tR;Ov0RKP5P@47DVGl_gR^Y8A2!8$YZywv`q2v2m`9s^Bn?fJ?S?U0+AY|Im)rs2O5I6s(RNT>@g>S>c^5^J- z__m*eFaMc%ijV_8M?UW7&sr~@SJKar&)UNyKLd~I6VgBA0XH3H=nKB-!9!Q*R+wuW zqC)Iy**0y6_{}%rLp|c}#p9M*hcd%~X>5zmF?1Ie+|)@hlnD^ic`Iby-#MfK-^0=C zhccl5mULF9`^$fF2J5Z!y19g(H0*za6EgNc>vX&H=p-xp@2u2{TWZ|?lO(YIa7aJ( r$cmfKKMrRHPoo6UY@m%=@d*2TfE_@w{~BTw{F5n$I^dQSu<-u{E`*uc literal 3038 zcmV<43nBE0P)45Abw205W#-Mk za2=8};%ZXzizGn^T6_Vvxod-wFmP?j6@;{AGf=YH>;@80vB4~YmK zUIc^$fC#*#>8V^fl2E5YxnMM($QH|*CJBPmDmS{#ZS|IVx5=&u21x`W0w6#J2>7R4 z;{S_800^W5oEu%aKAQ+evx%&(6IDJI80fqb%|r%vv*2-?`~A+ny&i!f5h1dN_gqI> z&td%?a-#8jiC>+*n z{oOwQ)>gNGjEE2c=s|M#b0Q)jKtRA`uK2s5#VeCBjqBbj^I)H6o8M(oGoLU^6Po5kOF0JMTCO+EfdSOqK%W4DyLPU5N2?;q1rE{;pKat4rtj7Q8 zV0$=S{Ay3VEO0;p01@ElA5V_VB@F`p`sK%9J(7yN{QJ?hTBqq}$L|;=$!?K;{A_29 z)5N}1M)oCQa3!66{ewG^lxDTEA3f8y6w7wjo32cT5d|PZ-~@bRE?MVL3R-C{oB<#p zKxCt{DSwSQ7SH^{!7jH|jHlF}9-9cq3+q1u^Z*GF;~Dj}52hlC@~(|lhx?nFYt3t^ zVndbr@auTMJ1*7}($vnep~~5-Mkm_}Q_wR*!WyQfT*B_w{-n-%=Y*m4A9{ zI+`v3A`+(x5&>{dzrC=O$mrc(+jpMwcQ;w4mNN(Yy_cq9hj)2Tjf4;x0FB*CNsMjr zy9JRZBWYdN0O-_c`0%53SEix|`aCm%^hTfa+fVu)@jBCa^|$92xUO?x2*8L4fsf3s zU7L;@BzS3myFnCOHse$v?Qt8UDYdiFmdL0DRa47+F_JE7@XOP)K!X&386hm*e@Iss&=D-ZtxjzWSXTTr2THDyIkIYNyAsmMEEIoD8PzCfO*9 z9MEBwUj2)90REq67K@sO2n+#E4+n}m+tlLR)a(Gj%CoQ6bNu4cV_oid&M)-%-JgsE z3q?&9_;b5_Tbk|94K%wg@=7B2`?28GHplNSEbQoVAHA@&ueTlm7$5-aZnF2byLHk( zz8(Ysu~5=(%qJy=Pi?OHY&??8YQTVT@YgAw&5l%7X95eyb7n=3rAu%A&GvLbd-bic zpZwL%w~}Sv2rR~67NNF zIaS})?FL|iAlBJUKYX^^u1K6n=PXyyJZ>Wp0zhYzEfCF(FD49qnDO8 zH`~vSg$bwpQ0WLrXimt3<|tD$>D9oHHUKXz?hF zSTLFr6Pc1MNe*SbS=bc$`GF>@B6A=h?y?vftIhK(*&3Jf=~%>OVpGexqeBaK!$qe> zI)7`;u1JAc!D$g)7Guj{knLb0s1*W1qD3O~EE>CBClZ|rFXpeDDn zx2NvCp{3W3-#&FM+|g*+*6IWVQ4mUHO_T)WoHz%8!Ol)+QPU*xi=GPr(BM);QK+`c zI%f{6c(AYTqv7yZx7FE<(%5XGw#umK*jl3i017969FznvX$0QkpV!Y2ZI1^^x4jghM(9_ zBa1jTmwMyGrM`bHaEKo86qMeA_8E!td}&7zyNS@HLL6BaVf0BV?%@+ zbFuqp4@uWyUGmpgt;1xLaXDJ-YI5qJ%>?o#D0SA^;~5P}_qY_Si1z(;Y})3N_L zGn2}fhUeA?0|$l}Osl1K-jWK zxEg%p#N?qJzT+2{Dog=z1^~c_Q@+f9b9N!8mVfd0{aTqHIXhQSx%MUfCe#@U?+wjY zS&h58tNPok1%~Oe+Tc)}HY2kbrHx*zuH(?H$e(Sge(jq*ocQ;iZVe~12!zNgLx;E8 zNIHo!yEK`2>&(oBi8WD{Iq8iq<-w#tQYeu>@MzP``Pi|`0fUU!rekHDbv0QmMu8E) zV4oLAzc?97sk$t%c8~3|KZb_y#sQEM5ODxH&|9w)0HJ_%btcXL5%e!B zPWo&pGjcaR*zY~q?}??0LlZIJe6Y`pz!(uY%;MJve40)_`*6C<`KjSxu>=SDyoCB% zO05uWF)Kef)Lw0qiaO~!lsLLAhFA7?cpRqnQIhn3e*4zwT>RX4-74u$(fbhW1aRF_q5o|#%!_p?q|VFvGDR>w`EAhZ438x>ic z2&9K@g~~e5s@l;%EYC-Be>vbaEAo};*wCF-#UQ+}$16!vrQfjiMgY`YYkTEDhbY0Z zp@kzC7QeOE|KgsOoLUxuHv3!#Nk9Y+K!A3WEC_%Mj$c{|r;7I?nJR~QqtBYlYeq%< z=<4#jLyIzFFAcV}dmKm{5P(3uKgt3D?`pLD@NoB=AI}Wmi3dWtfBahKa|2#r!oq5D zXIGW4+Jp$46DI=T2yBzjNentXj!ahf)tErQe|hKjN~~ZuNZ&uuw#n-R;Dii82Nb?= z01s@)TqyOM&ljfy8Ka1gZ>rth?XIyK>?WBp0f)kfBp#JrnBmePoufuE%C-TEH=?fE~OuDQB2b~7DH$1bW(I7DbKqC0ky?)p~ z5m3d9U?iFQ=z3^oIkS?=X=Ts>OcE%Hl2=O>gPd2@OqoO=SrTd;hOP$NV1Hx1Q(2F$ zSPEhfxtjmu1}n4yA_3{?0$)uQZ!aaMgX!gHK3&idfBaYO3utWyaZK0n{{R3007*qoM6N<$f~f@91^@s6 From dbbc14ecdc2a04622797b208e8a2a6e0b424dddb Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:52 +0100 Subject: [PATCH 0874/1620] New translations CollectEarth.png (French) --- .../earth/app/view/Messages_fr.properties | Bin 11933 -> 19074 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 0589f39b42ac62e1df44c27797657da2936753cd..b6445ac6bf893204dfa034348cf755ec98dacf8a 100644 GIT binary patch literal 19074 zcmbTdbyS?svM36JJHg%E-QC?~aCdii3myoN;O;hPf)5bfLvVL@*F1iEpMCCo>z#Z5 zxU*)>bbnu0b#-+~OI56ziYy8u0U`th1d64lm>cg zx>$Sqn7La)h+DdtTan2-nb}xrSeaS+xs6x}K|ny++Gznjfyzn(7A{UKX8*Kd@pW?j zfQEn&67_X8vv9ETBr~_Nv2zxtxajDiAhWX+rqJb9W>a>Rw6e96^LMw>^jFcc@OQA_ zx1*VO{A>b=a@h`jrALV}@vr>@#tBI$BFvY)#0xGMKNxHaO zk#VzdGFz~*vy<`gu&{G+^YE}Uk#VrGbFi{~e0iAJxdga*1UPuf{_8{W(VM%awSb0{ z%zyRuQ4^-H_4ITVU}g33@nP}dWN~q~VP)s%=l=%>2M6;<3uX^LXHPR@yaVGl*qnWvjm!~kr2c`cWf|IMV@_!?C_V_PGeXxwx*UXiborR6n$?2bQ z{j0Tyr-s%4BIAE-?V;u8YQ?Hy<>BJxZt*c6)|CGN{@~sJxubs?eo!Nz>TdTjDQ1pR zE*4%+R?eRCQoR1Yw(bMc&#szw%9RgLwmBgK8G7%VW86O(&J?*nEkj2O!~?~LOuv94>xnK(FZifRghS`loILMXg8r#mNl(dB;^$Aui>`s-Unt8m`jj$?1 z<4;A=fZ0rQb6I>=-kjGA*=@M6d}p^QOc0 zQfWg{R)#t>p=wA>Nu_T@D-@tJp#{_vm5C2(;ebdO@|Z)j{m3cXv06GL^PaJV!pLV9 zbZE+LbP5G@Nfde=xz&Ui75Z5j;`suB)?ÐQv8PcsF+Tb*~)bHKqTdSVz0)=y>VZ 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 From a6ebce390d2285a94d2548b35bfc08afb34c7326 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:53 +0100 Subject: [PATCH 0875/1620] New translations installer_icon.icns (Spanish) --- .../earth/app/view/Messages_es.properties | Bin 3038 -> 11933 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 2eeeadd2c16af47e2282400756fb6654d7ff27bd..0589f39b42ac62e1df44c27797657da2936753cd 100644 GIT binary patch literal 11933 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 literal 3038 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 From 432dab434ef57f361abf127e848baa588de8d3b9 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:54 +0100 Subject: [PATCH 0876/1620] New translations installer_icon.icns (Portuguese) --- .../earth/app/view/Messages_pt.properties | Bin 3038 -> 11933 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 2eeeadd2c16af47e2282400756fb6654d7ff27bd..0589f39b42ac62e1df44c27797657da2936753cd 100644 GIT binary patch literal 11933 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 literal 3038 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 From c70db1bc302ae9d104dca40388704eb90a7a8fd5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:54 +0100 Subject: [PATCH 0877/1620] New translations installer_icon.icns (English) --- .../earth/app/view/Messages_en.properties | Bin 7227 -> 11933 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 411ea29eae07402a848bffe6829186428a5aefae..0589f39b42ac62e1df44c27797657da2936753cd 100644 GIT binary patch literal 11933 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 literal 7227 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 JPDHLkV1jsYk_Z3* From 6c2e10e155a08a31ec5c900a096bdb9d4241933b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:56 +0100 Subject: [PATCH 0878/1620] New translations largeOpenForisIcon.jpg (French) --- .../earth/app/view/Messages_fr.properties | Bin 19074 -> 14209 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index b6445ac6bf893204dfa034348cf755ec98dacf8a..7498201fddebdd9c3bf0a85dd50ea3590128e3c7 100644 GIT binary patch literal 14209 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 R)+^bDTQ+<5e^yz#Z5 zxU*)>bbnu0b#-+~OI56ziYy8u0U`th1d64lm>cg zx>$Sqn7La)h+DdtTan2-nb}xrSeaS+xs6x}K|ny++Gznjfyzn(7A{UKX8*Kd@pW?j zfQEn&67_X8vv9ETBr~_Nv2zxtxajDiAhWX+rqJb9W>a>Rw6e96^LMw>^jFcc@OQA_ zx1*VO{A>b=a@h`jrALV}@vr>@#tBI$BFvY)#0xGMKNxHaO zk#VzdGFz~*vy<`gu&{G+^YE}Uk#VrGbFi{~e0iAJxdga*1UPuf{_8{W(VM%awSb0{ z%zyRuQ4^-H_4ITVU}g33@nP}dWN~q~VP)s%=l=%>2M6;<3uX^LXHPR@yaVGl*qnWvjm!~kr2c`cWf|IMV@_!?C_V_PGeXxwx*UXiborR6n$?2bQ z{j0Tyr-s%4BIAE-?V;u8YQ?Hy<>BJxZt*c6)|CGN{@~sJxubs?eo!Nz>TdTjDQ1pR zE*4%+R?eRCQoR1Yw(bMc&#szw%9RgLwmBgK8G7%VW86O(&J?*nEkj2O!~?~LOuv94>xnK(FZifRghS`loILMXg8r#mNl(dB;^$Aui>`s-Unt8m`jj$?1 z<4;A=fZ0rQb6I>=-kjGA*=@M6d}p^QOc0 zQfWg{R)#t>p=wA>Nu_T@D-@tJp#{_vm5C2(;ebdO@|Z)j{m3cXv06GL^PaJV!pLV9 zbZE+LbP5G@Nfde=xz&Ui75Z5j;`suB)?ÐQv8PcsF+Tb*~)bHKqTdSVz0)=y>VZ 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 Date: Tue, 29 Nov 2022 15:37:57 +0100 Subject: [PATCH 0879/1620] New translations largeOpenForisIcon.jpg (Spanish) --- .../earth/app/view/Messages_es.properties | Bin 11933 -> 14209 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 0589f39b42ac62e1df44c27797657da2936753cd..7498201fddebdd9c3bf0a85dd50ea3590128e3c7 100644 GIT binary patch literal 14209 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 From 0ffa17472d6a99c2c855eeac6cf2519aa60888d0 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:58 +0100 Subject: [PATCH 0880/1620] New translations largeOpenForisIcon.jpg (Portuguese) --- .../earth/app/view/Messages_pt.properties | Bin 11933 -> 14209 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 0589f39b42ac62e1df44c27797657da2936753cd..7498201fddebdd9c3bf0a85dd50ea3590128e3c7 100644 GIT binary patch literal 14209 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 From 56399cb194301de1cea6f2a6718d9da43a82a56e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:37:59 +0100 Subject: [PATCH 0881/1620] New translations largeOpenForisIcon.jpg (English) --- .../earth/app/view/Messages_en.properties | Bin 11933 -> 14209 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 0589f39b42ac62e1df44c27797657da2936753cd..7498201fddebdd9c3bf0a85dd50ea3590128e3c7 100644 GIT binary patch literal 14209 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 From c283e84709748dad7aec49f76f16b0d51711aa63 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:38:00 +0100 Subject: [PATCH 0882/1620] New translations list_empty.png (French) --- .../earth/app/view/Messages_fr.properties | Bin 14209 -> 472 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 7498201fddebdd9c3bf0a85dd50ea3590128e3c7..7970bf0c5cba40b6e46c7a75190fcdf44909bc74 100644 GIT binary patch literal 472 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 R)+^bDTQ+<5e^y Date: Tue, 29 Nov 2022 15:38:01 +0100 Subject: [PATCH 0883/1620] New translations list_empty.png (Spanish) --- .../earth/app/view/Messages_es.properties | Bin 14209 -> 472 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 7498201fddebdd9c3bf0a85dd50ea3590128e3c7..7970bf0c5cba40b6e46c7a75190fcdf44909bc74 100644 GIT binary patch literal 472 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 R)+^bDTQ+<5e^y Date: Tue, 29 Nov 2022 15:38:02 +0100 Subject: [PATCH 0884/1620] New translations list_empty.png (Portuguese) --- .../earth/app/view/Messages_pt.properties | Bin 14209 -> 472 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 7498201fddebdd9c3bf0a85dd50ea3590128e3c7..7970bf0c5cba40b6e46c7a75190fcdf44909bc74 100644 GIT binary patch literal 472 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 R)+^bDTQ+<5e^y Date: Tue, 29 Nov 2022 15:38:03 +0100 Subject: [PATCH 0885/1620] New translations CollectEarth.png (Spanish) --- .../earth/app/view/Messages_es.properties | Bin 472 -> 19074 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 7970bf0c5cba40b6e46c7a75190fcdf44909bc74..b6445ac6bf893204dfa034348cf755ec98dacf8a 100644 GIT binary patch literal 19074 zcmbTdbyS?svM36JJHg%E-QC?~aCdii3myoN;O;hPf)5bfLvVL@*F1iEpMCCo>z#Z5 zxU*)>bbnu0b#-+~OI56ziYy8u0U`th1d64lm>cg zx>$Sqn7La)h+DdtTan2-nb}xrSeaS+xs6x}K|ny++Gznjfyzn(7A{UKX8*Kd@pW?j zfQEn&67_X8vv9ETBr~_Nv2zxtxajDiAhWX+rqJb9W>a>Rw6e96^LMw>^jFcc@OQA_ zx1*VO{A>b=a@h`jrALV}@vr>@#tBI$BFvY)#0xGMKNxHaO zk#VzdGFz~*vy<`gu&{G+^YE}Uk#VrGbFi{~e0iAJxdga*1UPuf{_8{W(VM%awSb0{ z%zyRuQ4^-H_4ITVU}g33@nP}dWN~q~VP)s%=l=%>2M6;<3uX^LXHPR@yaVGl*qnWvjm!~kr2c`cWf|IMV@_!?C_V_PGeXxwx*UXiborR6n$?2bQ z{j0Tyr-s%4BIAE-?V;u8YQ?Hy<>BJxZt*c6)|CGN{@~sJxubs?eo!Nz>TdTjDQ1pR zE*4%+R?eRCQoR1Yw(bMc&#szw%9RgLwmBgK8G7%VW86O(&J?*nEkj2O!~?~LOuv94>xnK(FZifRghS`loILMXg8r#mNl(dB;^$Aui>`s-Unt8m`jj$?1 z<4;A=fZ0rQb6I>=-kjGA*=@M6d}p^QOc0 zQfWg{R)#t>p=wA>Nu_T@D-@tJp#{_vm5C2(;ebdO@|Z)j{m3cXv06GL^PaJV!pLV9 zbZE+LbP5G@Nfde=xz&Ui75Z5j;`suB)?ÐQv8PcsF+Tb*~)bHKqTdSVz0)=y>VZ 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 O0000 Date: Tue, 29 Nov 2022 15:38:04 +0100 Subject: [PATCH 0886/1620] New translations webServer.xml (English) --- .../earth/app/view/Messages_en.properties | Bin 14209 -> 3651 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 7498201fddebdd9c3bf0a85dd50ea3590128e3c7..de3ed9a2d3dd17acf22e70a4f4073dae2867bbc1 100644 GIT binary patch literal 3651 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 R)+^bDTQ+<5e^y Date: Tue, 29 Nov 2022 15:38:05 +0100 Subject: [PATCH 0887/1620] New translations arhangai.ttf (English) --- .../earth/app/view/Messages_en.properties | Bin 3651 -> 70708 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index de3ed9a2d3dd17acf22e70a4f4073dae2867bbc1..aefdf309744a0187d10430151fd9f27cdefc40a9 100644 GIT binary patch literal 70708 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 KF5EA|eE2_Eo# Date: Tue, 29 Nov 2022 15:38:07 +0100 Subject: [PATCH 0888/1620] New translations dispatcher-servlet.xml (Portuguese) --- .../earth/app/view/Messages_pt.properties | Bin 472 -> 582 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 7970bf0c5cba40b6e46c7a75190fcdf44909bc74..bc1fe5558de89324a103f2396e7fb28dc25d3243 100644 GIT binary patch literal 582 zcmb8sy$*sf6b0a&r)auEQ5Qq_*_?1v6W3abHcCr+8{5aX6c|_x?C0yb_cpIw_d#E- zK`2?^U6NwNB~y)%&jR1Br}&7gGRhyENjTczKL(oX{H z#XCv@!K2CA4|i+fke!_av0(NPD)wo*BlmNC301L>V5nq#R{g^KnX#V*Q_^r}*19R~ yHHd87w^odra72XAh70-hmN*%=iNkdh2hHHuzA%lw8O)`VA8K(KMfv#0W%L8Nh|)L! literal 472 zcmV;}0Vn>6P)NkloE@^#u)JJQyHVW8g@jxzNhGCKq9{pP)b3aK11P23C?zCGUgAn_ zC{dQkTQjY(Ih(WhbB?(`tH<~9`F;EJ>-QiqNV0dxp;niyA-mL;mX+w!#a(C9$>Ehz z7a2XKJ(CYqYfYW5YCxNL2%g?(_Qe&79PmyBP_5MtnLJ?P;L{%j+x#*j22wNQ0aR0J z2buwzV<2+>4rTL8{{TGGepJcUtG9j-ULN84HkfV<$viQT=8<@lv z%;R&cBM>lx?fB1VeIc89RL4dh@Wm8dl26LG`V&E?klekI)jKn~PibSkn zui$_*#y8-LYgLxo5?IQa%VxEWSi&`?XOD=1xFjx65%L+-CyD4)4^+`Wdd>`qwX&{G?@`b{lo?U O0000 Date: Tue, 29 Nov 2022 15:38:08 +0100 Subject: [PATCH 0889/1620] New translations context.xml (French) --- .../earth/app/view/Messages_fr.properties | Bin 472 -> 187 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 7970bf0c5cba40b6e46c7a75190fcdf44909bc74..64ca93cbce9743687f3bf5544242b2e9c1865c12 100644 GIT binary patch literal 187 zcmZXOyApyh5Jh{wVrP4ab`}W~GFDbTK41wepi6>DWbp4r$Ie@xJ7?zTavlUG4zc&n z;3i)qu(Q7DU2E`i-mkV;7Mb38mv~MvQtAvUrjR;>z~ZT)TG-%~Br+BmEYnAh{uwME wdUpp$!}8yn+A8Zs*rqBXq}TYNG|`;LhvXF{I(;RCR(wtJ=cpw_{Yr}L4UjB8J^%m! literal 472 zcmV;}0Vn>6P)NkloE@^#u)JJQyHVW8g@jxzNhGCKq9{pP)b3aK11P23C?zCGUgAn_ zC{dQkTQjY(Ih(WhbB?(`tH<~9`F;EJ>-QiqNV0dxp;niyA-mL;mX+w!#a(C9$>Ehz z7a2XKJ(CYqYfYW5YCxNL2%g?(_Qe&79PmyBP_5MtnLJ?P;L{%j+x#*j22wNQ0aR0J z2buwzV<2+>4rTL8{{TGGepJcUtG9j-ULN84HkfV<$viQT=8<@lv z%;R&cBM>lx?fB1VeIc89RL4dh@Wm8dl26LG`V&E?klekI)jKn~PibSkn zui$_*#y8-LYgLxo5?IQa%VxEWSi&`?XOD=1xFjx65%L+-CyD4)4^+`Wdd>`qwX&{G?@`b{lo?U O0000 Date: Tue, 29 Nov 2022 15:38:09 +0100 Subject: [PATCH 0890/1620] New translations context.xml (Spanish) --- .../earth/app/view/Messages_es.properties | Bin 19074 -> 187 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index b6445ac6bf893204dfa034348cf755ec98dacf8a..64ca93cbce9743687f3bf5544242b2e9c1865c12 100644 GIT binary patch literal 187 zcmZXOyApyh5Jh{wVrP4ab`}W~GFDbTK41wepi6>DWbp4r$Ie@xJ7?zTavlUG4zc&n z;3i)qu(Q7DU2E`i-mkV;7Mb38mv~MvQtAvUrjR;>z~ZT)TG-%~Br+BmEYnAh{uwME wdUpp$!}8yn+A8Zs*rqBXq}TYNG|`;LhvXF{I(;RCR(wtJ=cpw_{Yr}L4UjB8J^%m! literal 19074 zcmbTdbyS?svM36JJHg%E-QC?~aCdii3myoN;O;hPf)5bfLvVL@*F1iEpMCCo>z#Z5 zxU*)>bbnu0b#-+~OI56ziYy8u0U`th1d64lm>cg zx>$Sqn7La)h+DdtTan2-nb}xrSeaS+xs6x}K|ny++Gznjfyzn(7A{UKX8*Kd@pW?j zfQEn&67_X8vv9ETBr~_Nv2zxtxajDiAhWX+rqJb9W>a>Rw6e96^LMw>^jFcc@OQA_ zx1*VO{A>b=a@h`jrALV}@vr>@#tBI$BFvY)#0xGMKNxHaO zk#VzdGFz~*vy<`gu&{G+^YE}Uk#VrGbFi{~e0iAJxdga*1UPuf{_8{W(VM%awSb0{ z%zyRuQ4^-H_4ITVU}g33@nP}dWN~q~VP)s%=l=%>2M6;<3uX^LXHPR@yaVGl*qnWvjm!~kr2c`cWf|IMV@_!?C_V_PGeXxwx*UXiborR6n$?2bQ z{j0Tyr-s%4BIAE-?V;u8YQ?Hy<>BJxZt*c6)|CGN{@~sJxubs?eo!Nz>TdTjDQ1pR zE*4%+R?eRCQoR1Yw(bMc&#szw%9RgLwmBgK8G7%VW86O(&J?*nEkj2O!~?~LOuv94>xnK(FZifRghS`loILMXg8r#mNl(dB;^$Aui>`s-Unt8m`jj$?1 z<4;A=fZ0rQb6I>=-kjGA*=@M6d}p^QOc0 zQfWg{R)#t>p=wA>Nu_T@D-@tJp#{_vm5C2(;ebdO@|Z)j{m3cXv06GL^PaJV!pLV9 zbZE+LbP5G@Nfde=xz&Ui75Z5j;`suB)?ÐQv8PcsF+Tb*~)bHKqTdSVz0)=y>VZ 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 Date: Tue, 29 Nov 2022 15:38:10 +0100 Subject: [PATCH 0891/1620] New translations context.xml (Portuguese) --- .../openforis/collect/earth/app/view/Messages_pt.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index bc1fe5558d..64ca93cbce 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,4 +1,4 @@ - - - + + + From 1ab1e86a1f7bb70eda0efa4de5f5a34e6e7bf420 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:38:11 +0100 Subject: [PATCH 0892/1620] New translations context.xml (English) --- .../earth/app/view/Messages_en.properties | Bin 70708 -> 187 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index aefdf309744a0187d10430151fd9f27cdefc40a9..64ca93cbce9743687f3bf5544242b2e9c1865c12 100644 GIT binary patch literal 187 zcmZXOyApyh5Jh{wVrP4ab`}W~GFDbTK41wepi6>DWbp4r$Ie@xJ7?zTavlUG4zc&n z;3i)qu(Q7DU2E`i-mkV;7Mb38mv~MvQtAvUrjR;>z~ZT)TG-%~Br+BmEYnAh{uwME wdUpp$!}8yn+A8Zs*rqBXq}TYNG|`;LhvXF{I(;RCR(wtJ=cpw_{Yr}L4UjB8J^%m! literal 70708 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 Date: Tue, 29 Nov 2022 15:38:13 +0100 Subject: [PATCH 0893/1620] New translations jetty-env.xml (French) --- .../earth/app/view/Messages_fr.properties | 63 +++++++++++++++++-- 1 file changed, 59 insertions(+), 4 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 64ca93cbce..ffc6c29d58 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,4 +1,59 @@ - - - - + + + + + + + + + + + + + + + jdbc/collectDs + + + jdbc:sqlite::memory: + org.sqlite.JDBC + + + + + + + + + + + + * + Access-Control-Allow-Origin + * + + + + + + + + + + + + + + + + + + + + + + + + + + From ffd189f4245e8f5ad8ce1481eb463a3305d4fbae Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:38:14 +0100 Subject: [PATCH 0894/1620] New translations jetty-env.xml (Spanish) --- .../earth/app/view/Messages_es.properties | 63 +++++++++++++++++-- 1 file changed, 59 insertions(+), 4 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 64ca93cbce..ffc6c29d58 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,4 +1,59 @@ - - - - + + + + + + + + + + + + + + + jdbc/collectDs + + + jdbc:sqlite::memory: + org.sqlite.JDBC + + + + + + + + + + + + * + Access-Control-Allow-Origin + * + + + + + + + + + + + + + + + + + + + + + + + + + + From d5dd55659b903c9563237e4d044b7bddc691fcd3 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:38:15 +0100 Subject: [PATCH 0895/1620] New translations jetty-env.xml (Portuguese) --- .../earth/app/view/Messages_pt.properties | 63 +++++++++++++++++-- 1 file changed, 59 insertions(+), 4 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 64ca93cbce..ffc6c29d58 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,4 +1,59 @@ - - - - + + + + + + + + + + + + + + + jdbc/collectDs + + + jdbc:sqlite::memory: + org.sqlite.JDBC + + + + + + + + + + + + * + Access-Control-Allow-Origin + * + + + + + + + + + + + + + + + + + + + + + + + + + + From cd46da05f467a253f14583edc50516d84d6ae862 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:38:16 +0100 Subject: [PATCH 0896/1620] New translations jetty-env.xml (English) --- .../earth/app/view/Messages_en.properties | 63 +++++++++++++++++-- 1 file changed, 59 insertions(+), 4 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 64ca93cbce..ffc6c29d58 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,4 +1,59 @@ - - - - + + + + + + + + + + + + + + + jdbc/collectDs + + + jdbc:sqlite::memory: + org.sqlite.JDBC + + + + + + + + + + + + * + Access-Control-Allow-Origin + * + + + + + + + + + + + + + + + + + + + + + + + + + + From d3f3c4f3919f23c83895e5f363e3f6652847dba5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:38:17 +0100 Subject: [PATCH 0897/1620] New translations dispatcher-servlet.xml (French) --- .../earth/app/view/Messages_fr.properties | 63 ++----------------- 1 file changed, 4 insertions(+), 59 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index ffc6c29d58..bc1fe5558d 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,59 +1,4 @@ - - - - - - - - - - - - - - - jdbc/collectDs - - - jdbc:sqlite::memory: - org.sqlite.JDBC - - - - - - - - - - - - * - Access-Control-Allow-Origin - * - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + From 7772812558157bf907af52f42227afbc84211f40 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:38:18 +0100 Subject: [PATCH 0898/1620] New translations dispatcher-servlet.xml (Spanish) --- .../earth/app/view/Messages_es.properties | 63 ++----------------- 1 file changed, 4 insertions(+), 59 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index ffc6c29d58..bc1fe5558d 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,59 +1,4 @@ - - - - - - - - - - - - - - - jdbc/collectDs - - - jdbc:sqlite::memory: - org.sqlite.JDBC - - - - - - - - - - - - * - Access-Control-Allow-Origin - * - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + From 5d151c9154b780b784ecd12fbe1c54c1f99d0089 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:38:20 +0100 Subject: [PATCH 0899/1620] New translations dispatcher-servlet.xml (English) --- .../earth/app/view/Messages_en.properties | 63 ++----------------- 1 file changed, 4 insertions(+), 59 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index ffc6c29d58..bc1fe5558d 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,59 +1,4 @@ - - - - - - - - - - - - - - - jdbc/collectDs - - - jdbc:sqlite::memory: - org.sqlite.JDBC - - - - - - - - - - - - * - Access-Control-Allow-Origin - * - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + From 45c9b7a8eaa9b914ab99a4abf27b9daddb2e6241 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:38:21 +0100 Subject: [PATCH 0900/1620] New translations webServer.xml (Portuguese) --- .../earth/app/view/Messages_pt.properties | 173 ++++++++++++------ 1 file changed, 117 insertions(+), 56 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index ffc6c29d58..de3ed9a2d3 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,59 +1,120 @@ - - - - - - - - - - - - - - - jdbc/collectDs - - - jdbc:sqlite::memory: - org.sqlite.JDBC - - - - + + + earth + + + contextConfigLocation + + classpath:/WEB-INF/conf/applicationContextServer.xml + + + + webAppRootKey + SimpleServer.root + + + + org.apache.logging.log4j.web.Log4jServletContextListener + + + org.springframework.web.context.ContextLoaderListener + + + localizationFilter + org.springframework.web.filter.RequestContextFilter + + + characterEncodingFilter + org.springframework.web.filter.CharacterEncodingFilter + + encoding + UTF-8 + + + + googleEarthHeaderFilter + org.openforis.collect.earth.app.server.GoogleEarthHeaderFilter + + + cross-origin + org.eclipse.jetty.servlets.CrossOriginFilter + + + + localizationFilter + /* + + + characterEncodingFilter + /* + + + googleEarthHeaderFilter + /* + + + cross-origin + /* + - - - + + + DB Connection + jdbc/collectDs + javax.sql.DataSource + Container + + + + dispatcher + org.springframework.web.servlet.DispatcherServlet + 1 + + contextConfigLocation + classpath:/WEB-INF/dispatcher-servlet.xml + + + + default + org.eclipse.jetty.servlet.DefaultServlet + + cacheControl + max-age=3600,public + + + + + + dispatcher + / + + + + default + /generated/* + - - - * - Access-Control-Allow-Origin - * - - + + default + /testOnline/* + - - - - - - - - - - - - - - - - - - - - - - - + + 2 + + + + index.html + + + + kml + application/vnd.google-earth.kml+xml + + + + kmz + application/vnd.google-earth.kmz + + + From eb7d03adc2eeff201c75528184c68a5292f7a3df Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:38:22 +0100 Subject: [PATCH 0901/1620] New translations index.html (French) --- .../collect/earth/app/view/Messages_fr.properties | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index bc1fe5558d..45cb1a2530 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,4 +1,6 @@ - - - - + + +Collect Earth.
+This server is supposed to be used in conjunction with Google Earth! + + From 405130e8febf020e2b9c26b63a67cc86138d248c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:38:23 +0100 Subject: [PATCH 0902/1620] New translations index.html (Spanish) --- .../collect/earth/app/view/Messages_es.properties | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index bc1fe5558d..45cb1a2530 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,4 +1,6 @@ - - - - + + +Collect Earth.
+This server is supposed to be used in conjunction with Google Earth! + + From d545c07fd09a7c226b38186005deda03a2d63fae Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:38:24 +0100 Subject: [PATCH 0903/1620] New translations index.html (Portuguese) --- .../earth/app/view/Messages_pt.properties | 126 +----------------- 1 file changed, 6 insertions(+), 120 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index de3ed9a2d3..45cb1a2530 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,120 +1,6 @@ - - - earth - - - contextConfigLocation - - classpath:/WEB-INF/conf/applicationContextServer.xml - - - - webAppRootKey - SimpleServer.root - - - - org.apache.logging.log4j.web.Log4jServletContextListener - - - org.springframework.web.context.ContextLoaderListener - - - localizationFilter - org.springframework.web.filter.RequestContextFilter - - - characterEncodingFilter - org.springframework.web.filter.CharacterEncodingFilter - - encoding - UTF-8 - - - - googleEarthHeaderFilter - org.openforis.collect.earth.app.server.GoogleEarthHeaderFilter - - - cross-origin - org.eclipse.jetty.servlets.CrossOriginFilter - - - - localizationFilter - /* - - - characterEncodingFilter - /* - - - googleEarthHeaderFilter - /* - - - cross-origin - /* - - - - - DB Connection - jdbc/collectDs - javax.sql.DataSource - Container - - - - dispatcher - org.springframework.web.servlet.DispatcherServlet - 1 - - contextConfigLocation - classpath:/WEB-INF/dispatcher-servlet.xml - - - - default - org.eclipse.jetty.servlet.DefaultServlet - - cacheControl - max-age=3600,public - - - - - - dispatcher - / - - - - default - /generated/* - - - - default - /testOnline/* - - - - 2 - - - - index.html - - - - kml - application/vnd.google-earth.kml+xml - - - - kmz - application/vnd.google-earth.kmz - - - + + +Collect Earth.
+This server is supposed to be used in conjunction with Google Earth! + + From 6c33f7b4416ddc4d85e77fd7f7120e4c622a39c5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:38:25 +0100 Subject: [PATCH 0904/1620] New translations index.html (English) --- .../collect/earth/app/view/Messages_en.properties | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index bc1fe5558d..45cb1a2530 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,4 +1,6 @@ - - - - + + +Collect Earth.
+This server is supposed to be used in conjunction with Google Earth! + + From 636804a3afc717367dbcdf57e145eb374f179ec0 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:38:26 +0100 Subject: [PATCH 0905/1620] New translations web.xml (French) --- .../earth/app/view/Messages_fr.properties | 129 +++++++++++++++++- 1 file changed, 123 insertions(+), 6 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 45cb1a2530..06cc3503c4 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,6 +1,123 @@ - - -Collect Earth.
-This server is supposed to be used in conjunction with Google Earth! - - + + + earth + + + contextConfigLocation + file:${collectEarth.userFolder}/generated/applicationContext.xml + + + webAppRootKey + SimpleServer.root + + + + org.apache.logging.log4j.web.Log4jServletContextListener + + + + org.springframework.web.context.ContextLoaderListener + + + + localizationFilter + org.springframework.web.filter.RequestContextFilter + + + characterEncodingFilter + org.springframework.web.filter.CharacterEncodingFilter + + encoding + UTF-8 + + + + googleEarthHeaderFilter + org.openforis.collect.earth.app.server.GoogleEarthHeaderFilter + + + cross-origin + org.eclipse.jetty.servlets.CrossOriginFilter + + + + localizationFilter + /* + + + characterEncodingFilter + /* + + + googleEarthHeaderFilter + /* + + + cross-origin + /* + + + + + DB Connection + jdbc/collectDs + javax.sql.DataSource + Container + + + + dispatcher + org.springframework.web.servlet.DispatcherServlet + 1 + + contextConfigLocation + classpath:/WEB-INF/dispatcher-servlet.xml + + + + default + org.eclipse.jetty.servlet.DefaultServlet + + useFileMappedBuffer + false + + + + + dispatcher + / + + + + default + /generated/* + + + + default + /testOnline/* + + + + 2 + + + + index.html + + + + kml + application/vnd.google-earth.kml+xml + + + + kmz + application/vnd.google-earth.kmz + + + From 057cce513dd70a07355a924870188466ac8b4798 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:38:27 +0100 Subject: [PATCH 0906/1620] New translations web.xml (Spanish) --- .../earth/app/view/Messages_es.properties | 129 +++++++++++++++++- 1 file changed, 123 insertions(+), 6 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 45cb1a2530..06cc3503c4 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,6 +1,123 @@ - - -Collect Earth.
-This server is supposed to be used in conjunction with Google Earth! - - + + + earth + + + contextConfigLocation + file:${collectEarth.userFolder}/generated/applicationContext.xml + + + webAppRootKey + SimpleServer.root + + + + org.apache.logging.log4j.web.Log4jServletContextListener + + + + org.springframework.web.context.ContextLoaderListener + + + + localizationFilter + org.springframework.web.filter.RequestContextFilter + + + characterEncodingFilter + org.springframework.web.filter.CharacterEncodingFilter + + encoding + UTF-8 + + + + googleEarthHeaderFilter + org.openforis.collect.earth.app.server.GoogleEarthHeaderFilter + + + cross-origin + org.eclipse.jetty.servlets.CrossOriginFilter + + + + localizationFilter + /* + + + characterEncodingFilter + /* + + + googleEarthHeaderFilter + /* + + + cross-origin + /* + + + + + DB Connection + jdbc/collectDs + javax.sql.DataSource + Container + + + + dispatcher + org.springframework.web.servlet.DispatcherServlet + 1 + + contextConfigLocation + classpath:/WEB-INF/dispatcher-servlet.xml + + + + default + org.eclipse.jetty.servlet.DefaultServlet + + useFileMappedBuffer + false + + + + + dispatcher + / + + + + default + /generated/* + + + + default + /testOnline/* + + + + 2 + + + + index.html + + + + kml + application/vnd.google-earth.kml+xml + + + + kmz + application/vnd.google-earth.kmz + + + From e8d04a4e60c76e2e6b882d837ae44a142187fb57 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:38:29 +0100 Subject: [PATCH 0907/1620] New translations web.xml (Portuguese) --- .../earth/app/view/Messages_pt.properties | 129 +++++++++++++++++- 1 file changed, 123 insertions(+), 6 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 45cb1a2530..06cc3503c4 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,6 +1,123 @@ - - -Collect Earth.
-This server is supposed to be used in conjunction with Google Earth! - - + + + earth + + + contextConfigLocation + file:${collectEarth.userFolder}/generated/applicationContext.xml + + + webAppRootKey + SimpleServer.root + + + + org.apache.logging.log4j.web.Log4jServletContextListener + + + + org.springframework.web.context.ContextLoaderListener + + + + localizationFilter + org.springframework.web.filter.RequestContextFilter + + + characterEncodingFilter + org.springframework.web.filter.CharacterEncodingFilter + + encoding + UTF-8 + + + + googleEarthHeaderFilter + org.openforis.collect.earth.app.server.GoogleEarthHeaderFilter + + + cross-origin + org.eclipse.jetty.servlets.CrossOriginFilter + + + + localizationFilter + /* + + + characterEncodingFilter + /* + + + googleEarthHeaderFilter + /* + + + cross-origin + /* + + + + + DB Connection + jdbc/collectDs + javax.sql.DataSource + Container + + + + dispatcher + org.springframework.web.servlet.DispatcherServlet + 1 + + contextConfigLocation + classpath:/WEB-INF/dispatcher-servlet.xml + + + + default + org.eclipse.jetty.servlet.DefaultServlet + + useFileMappedBuffer + false + + + + + dispatcher + / + + + + default + /generated/* + + + + default + /testOnline/* + + + + 2 + + + + index.html + + + + kml + application/vnd.google-earth.kml+xml + + + + kmz + application/vnd.google-earth.kmz + + + From 871edbeb31d3ad5beff6c1c40351b444add2b98d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:38:30 +0100 Subject: [PATCH 0908/1620] New translations web.xml (English) --- .../earth/app/view/Messages_en.properties | 129 +++++++++++++++++- 1 file changed, 123 insertions(+), 6 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 45cb1a2530..06cc3503c4 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,6 +1,123 @@ - - -Collect Earth.
-This server is supposed to be used in conjunction with Google Earth! - - + + + earth + + + contextConfigLocation + file:${collectEarth.userFolder}/generated/applicationContext.xml + + + webAppRootKey + SimpleServer.root + + + + org.apache.logging.log4j.web.Log4jServletContextListener + + + + org.springframework.web.context.ContextLoaderListener + + + + localizationFilter + org.springframework.web.filter.RequestContextFilter + + + characterEncodingFilter + org.springframework.web.filter.CharacterEncodingFilter + + encoding + UTF-8 + + + + googleEarthHeaderFilter + org.openforis.collect.earth.app.server.GoogleEarthHeaderFilter + + + cross-origin + org.eclipse.jetty.servlets.CrossOriginFilter + + + + localizationFilter + /* + + + characterEncodingFilter + /* + + + googleEarthHeaderFilter + /* + + + cross-origin + /* + + + + + DB Connection + jdbc/collectDs + javax.sql.DataSource + Container + + + + dispatcher + org.springframework.web.servlet.DispatcherServlet + 1 + + contextConfigLocation + classpath:/WEB-INF/dispatcher-servlet.xml + + + + default + org.eclipse.jetty.servlet.DefaultServlet + + useFileMappedBuffer + false + + + + + dispatcher + / + + + + default + /generated/* + + + + default + /testOnline/* + + + + 2 + + + + index.html + + + + kml + application/vnd.google-earth.kml+xml + + + + kmz + application/vnd.google-earth.kmz + + + From df055b69acb9201e789c2e270165ff587ed842ba Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:38:31 +0100 Subject: [PATCH 0909/1620] New translations webServer.xml (French) --- .../earth/app/view/Messages_fr.properties | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 06cc3503c4..de3ed9a2d3 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -4,26 +4,22 @@ contextConfigLocation - file:${collectEarth.userFolder}/generated/applicationContext.xml + + classpath:/WEB-INF/conf/applicationContextServer.xml + webAppRootKey SimpleServer.root - + org.apache.logging.log4j.web.Log4jServletContextListener - org.springframework.web.context.ContextLoaderListener - - + localizationFilter org.springframework.web.filter.RequestContextFilter @@ -82,9 +78,10 @@ default org.eclipse.jetty.servlet.DefaultServlet - useFileMappedBuffer - false - + cacheControl + max-age=3600,public + + From dd1b941e84726bc01cbb5d3596068b83a862c230 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:38:34 +0100 Subject: [PATCH 0910/1620] New translations webServer.xml (Spanish) --- .../earth/app/view/Messages_es.properties | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 06cc3503c4..de3ed9a2d3 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -4,26 +4,22 @@ contextConfigLocation - file:${collectEarth.userFolder}/generated/applicationContext.xml + + classpath:/WEB-INF/conf/applicationContextServer.xml + webAppRootKey SimpleServer.root - + org.apache.logging.log4j.web.Log4jServletContextListener - org.springframework.web.context.ContextLoaderListener - - + localizationFilter org.springframework.web.filter.RequestContextFilter @@ -82,9 +78,10 @@ default org.eclipse.jetty.servlet.DefaultServlet - useFileMappedBuffer - false - + cacheControl + max-age=3600,public + + From 189a54c7fd926a287ee9c4e8d9b93976af4b42d4 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:38:35 +0100 Subject: [PATCH 0911/1620] New translations list_empty.png (English) --- .../earth/app/view/Messages_en.properties | Bin 3817 -> 472 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 06cc3503c42731f8bdcd4c8acd7b70385fff3744..7970bf0c5cba40b6e46c7a75190fcdf44909bc74 100644 GIT binary patch literal 472 zcmV;}0Vn>6P)NkloE@^#u)JJQyHVW8g@jxzNhGCKq9{pP)b3aK11P23C?zCGUgAn_ zC{dQkTQjY(Ih(WhbB?(`tH<~9`F;EJ>-QiqNV0dxp;niyA-mL;mX+w!#a(C9$>Ehz z7a2XKJ(CYqYfYW5YCxNL2%g?(_Qe&79PmyBP_5MtnLJ?P;L{%j+x#*j22wNQ0aR0J z2buwzV<2+>4rTL8{{TGGepJcUtG9j-ULN84HkfV<$viQT=8<@lv z%;R&cBM>lx?fB1VeIc89RL4dh@Wm8dl26LG`V&E?klekI)jKn~PibSkn zui$_*#y8-LYgLxo5?IQa%VxEWSi&`?XOD=1xFjx65%L+-CyD4)4^+`Wdd>`qwX&{G?@`b{lo?U O0000VS6iB`D`<#MU|vtr^EjD-jSj{ zY{zzo+rvZ!u=jF!AhI_qU^Yu?$n?-VQc6Ofp{pNm} zFJUE^EUXhnj#7;!7yKpau=3J+mV2EG=S@5cJ@S7?*^>H6A1*$;z(F!~YRY5kF3NF9@ zC)Y|r?rsT`R~F2jRx>dFCJQLQ2nVwS1E6H^1L`LmI66Hl58BYaWZS^Q7NZ}2Da-d- zyWim{D)SE5wsb02rGhCKj1o5}5V;RPf5+J9Fuu}@7Z2ayuUrXhOW~H6$zQkE?Dg9_ zdhk5)dU$Dc3C2mVM~xdXMln~?I&!g(Wc*+rCBt0hq7;~d9MvzdDCqx-2aZnT_jDp} zC~$Q=?rU9XvZaW^5=jVj0<0|!!p$+oV6Dw3k5~tmM>H)kLr%m*NX#@>zcU;|$||fa zCBOLky7Me)(!HlNsJ~mU>@zPg@%Qk#0vlbjr7>tAcLZ*VKy!-6x|Eh!U^!ZRTQ{UF zRZWft`A*0V7=GrXM7(p`9-((Y8;Ulqtd{x&8;_W*n z+bg56yE{z1B1?WqlkRt$x*dqXZ3@}sdW3zlz?q6)IL13y)X`9u#6oI5%s%EgMSP7+ zaB}o6Be#1hA)}RN!|i9qC&G!ThY$SzI`WFjEi-DEI_REwDK{t5Lt z*hRaCa5#QYMel-eBB3p#eSNRy;*&!$D6bxM?nwg~%4iNhppUT=TGu zN+dqADbmh6eSNmBZUkG8^a^vg5AG;G3Gi9}_t4t4cTWS}0j7;=m)O$6Q%^&7xV*e8 z6c+Bj4!n!vp)LJ@VwnAy_H`Wxl9MaYmCG*3y?qi2Hnb>-v^6OFJp~M>7BE^Gy}m9r zlf?`+eCcTW?_H3}E}@o3@(S(fw9i3`KOdkVtFup}rv0P}_uRgtVUETh9m!)c<6)q% hut=cfkG?QlezKsCbqxH=e+Ea%gTUkq|GPCCeg#S7BUb Date: Tue, 29 Nov 2022 15:38:37 +0100 Subject: [PATCH 0912/1620] New translations list_filled.png (French) --- .../earth/app/view/Messages_fr.properties | Bin 3651 -> 682 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index de3ed9a2d3dd17acf22e70a4f4073dae2867bbc1..4524177685d013019b7d6ff8c0b6a8a4b7d6f486 100644 GIT binary patch literal 682 zcmV;b0#*HqP)djvRmvxnun58#g3e;_h37eVuR)H~l@~P}Eu>A$|#Rn;pz(^w~ zP0$FY4@PCCmqf@6U1oDbb5}PvHg&g$FhoY_dHitB`JB)BFgOajArppl@RXMY%KLcA z-D8g+mIy;eugOl?EEZsS%a4z1Q!+WMo-(xklDS5vgY-uRS7~;Mz0#!M zXJQHE*_8-HgP8d>>!XCa|D4bT1q2EhsAz+_C(h_GN`xUESJ_R3lNxdjc@Q}xp3S`g zOW4-QCRHQog2y5iO*>B3_2i@-n?^T0`-<~4S)5X?n1d~ZQJirK?^h-e-HCQiHmPF( zz=A>h?XngaI02XCTJ+BKx6eNOB8i;gaejK9>#C&zft_VoGD_f&tY9jr`Y1!)drJry zz{rbOORQpZH-tOq+h8xOa#2D@ThFy%ha@2KA~?ch=-V(Tq0R3aC$+yR(FiG&&@S4| zR>buf;(83WLK})D85O3p*uXkY7>eNajbTCax!+!y=-Xd1#SmWmYXkD;_NHPpTMI=&$sFP`xHcwj)Y)K@|vPu$l}alh1;I zi0J+N6x+#!!}sJzAf*8S#9t-`Vvd+RADUOJ<{D%PnaC4N@Gg#FL0fct9pilm#VK*- z`RN|#n>u}PyeTB-tkeJEGpU9b1}pCiRJbcpUZaFIkJNkBR6GFq4J)tFe*XqI Q5dZ)H07*qoM6N<$g1HzuTmS$7 literal 3651 zcmb_f+in{-5Pg=uLeOK|<;qS|6vldk#?%updqWf|w6d_ZNy#g|My)~SR$eI_-e|QD%jk8Mb|hMbCoXFs1BK+ql-#ba z(tmH?Ccpo6m!h3Tii}I)FOCKYbOset#E|QuzvpNajYn%4>Gm8v?lJQ4OIg0x+WrC0 z(U>D(*VCC;mlA>t6)HsOgV4y96vl#r$`KVm5_jVqLxJ&<;|nvXmrIN}`v2o2L!a0^ ztq4ql4Y$7!wz71`5aKjj^p5fP5U43D1Y6+y!A4gf9bRCKMJ&zdP@Ri7$QDA{a7(}R z@gOm9rTFZE_s)rAY4@Bs4&N;&``q(F>^*#{!9+rKEP4w>hLpQgW_Fdq5X=Vz1N;Q<^CMWu~N5EOGI zD*5+p%fX8WgF=eZ0DA;$pPg%%QHI@+t#{7U&Ygo>+-3FOkN>)$!i zURM%Jr^V1ydHP+JcE8)u?Lfr*I0Raph`Ja+Sr_S>AfFvPUyM9@ap|v)hojitH||hQ zZLR{N>#BgHf`xnNIhdjnCAHyv`gVkMQeo8N7xu``5mhwQB{d(KkMoBDdy>nMsmapb zVU)JdCFC?uY?=8a*_2y8bMRi?9YQ(u7exo(A1&H@C((bLCr;PWAWTiAT{i2$DJ*y`aWDuHp*Za&bZ=c^ zQ*U8*n8#xT(JVocQR(JFG5!0ztob(KOSpdZ(`52PSwG;Mb%Fs3uIAn?2c4|h<)R6S zMzN)%mz6JzV5G09d1nD0B)^BYq;ZT}nD48BFMtQ%5ZU77@=i(2+An}M^wT84(8rh$ zN$j_*Sc9%@eo6H9xBOf6HF0kP5`U>cf-MUYnh~A7?rtvB9JXv_DIt0XWU{*v^l^KQ ze)OUM=X6lyb^ejew4apTPTG~T&UBwXsX6oAB=J)OYJTssvXv(f`dFvHKYukiY90k9 KF5EA|eE2_Eo# Date: Tue, 29 Nov 2022 15:38:38 +0100 Subject: [PATCH 0913/1620] New translations FixDuplicatePlots.java (Spanish) --- .../earth/app/view/Messages_es.properties | 232 +++++++++--------- 1 file changed, 112 insertions(+), 120 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index de3ed9a2d3..e62a057929 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,120 +1,112 @@ - - - earth - - - contextConfigLocation - - classpath:/WEB-INF/conf/applicationContextServer.xml - - - - webAppRootKey - SimpleServer.root - - - - org.apache.logging.log4j.web.Log4jServletContextListener - - - org.springframework.web.context.ContextLoaderListener - - - localizationFilter - org.springframework.web.filter.RequestContextFilter - - - characterEncodingFilter - org.springframework.web.filter.CharacterEncodingFilter - - encoding - UTF-8 - - - - googleEarthHeaderFilter - org.openforis.collect.earth.app.server.GoogleEarthHeaderFilter - - - cross-origin - org.eclipse.jetty.servlets.CrossOriginFilter - - - - localizationFilter - /* - - - characterEncodingFilter - /* - - - googleEarthHeaderFilter - /* - - - cross-origin - /* - - - - - DB Connection - jdbc/collectDs - javax.sql.DataSource - Container - - - - dispatcher - org.springframework.web.servlet.DispatcherServlet - 1 - - contextConfigLocation - classpath:/WEB-INF/dispatcher-servlet.xml - - - - default - org.eclipse.jetty.servlet.DefaultServlet - - cacheControl - max-age=3600,public - - - - - - dispatcher - / - - - - default - /generated/* - - - - default - /testOnline/* - - - - 2 - - - - index.html - - - - kml - application/vnd.google-earth.kml+xml - - - - kmz - application/vnd.google-earth.kmz - - - +package org.openforis.collect.earth.app.ad_hoc; + +import java.util.ArrayList; +import java.util.List; + +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.manager.RecordManager; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.CollectRecordSummary; +import org.openforis.collect.model.RecordFilter; +import org.openforis.idm.model.CoordinateAttribute; +import org.openforis.idm.model.TextAttribute; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class FixDuplicatePlots { + + @Autowired + private RecordManager recordManager; + + @Autowired + private EarthSurveyService earthSurveyService; + + private Logger logger = LoggerFactory.getLogger( FixDuplicatePlots.class); + + private boolean stopFix = false; + + private List getAllRecords(){ + return recordManager.loadSummaries( + new RecordFilter( + earthSurveyService.getCollectSurvey() , + EarthConstants.ROOT_ENTITY_NAME + ) ); + } + + + + public void fixHela(){ + List allRecords = getAllRecords(); + + if( shouldStopFixing()){ + return; + } + int i = 0; + for (CollectRecordSummary summaryCollectRecord : allRecords) { + if( shouldStopFixing()){ + break; + } + try { + CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); + + if( isSouthernPlot(collectRecord) ){ + recordManager.delete( collectRecord.getId() ); + i++; + + } + + } catch (Exception e) { + logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ + } + } + logger.info("In total fixed plots " + i); //$NON-NLS-1$ + + } + + private List getSouthernHighlandsRecords(List allRecords) { + List southernHighlandsPlots = new ArrayList(); + + for (CollectRecord record : allRecords) { + if( record!= null ){ + CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), record.getId(), Step.ENTRY); + TextAttribute plot_file = (TextAttribute) collectRecord.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ + if( plot_file !=null && plot_file.getValue().getValue().equals("southernHighlands.ced") ){ //$NON-NLS-1$ + southernHighlandsPlots.add( collectRecord ); + } + } + } + return southernHighlandsPlots; + } + + private CollectRecord findMathingCoordinatePlotInSouthern(List southernHighlandRecords, CoordinateAttribute plotCoord) { + for (CollectRecord southernPlot : southernHighlandRecords) { + + CoordinateAttribute sothernCoord = (CoordinateAttribute) southernPlot.getNodeByPath("/plot/location"); //$NON-NLS-1$ + if( sothernCoord.getValue().equals(plotCoord.getValue() ) ){ + return southernPlot; + } + } + return null; + } + + private boolean isSouthernPlot(CollectRecord record) { + + TextAttribute plot_file = (TextAttribute) record.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ + return( plot_file!=null && plot_file.getValue().getValue().equals("southernHighlands.ced") ); //$NON-NLS-1$ + } + + private boolean shouldStopFixing() { + return stopFix; + } + + public void stopFixing() { + stopFix = true; + + } + +} \ No newline at end of file From 8c3db7ba73a9fa80415b90e79ff60a5a2b4e7bdb Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:38:39 +0100 Subject: [PATCH 0914/1620] New translations FixCoordinatesMongolia.java (French) --- .../earth/app/view/Messages_fr.properties | Bin 682 -> 239 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 4524177685d013019b7d6ff8c0b6a8a4b7d6f486..c36b2d4338f3a5a98949337efe689c43c94ece9c 100644 GIT binary patch literal 239 zcmZ9Gv1&sx3`J+_D?Fx)*9Ni#0-aL&2|=|LN5sz(vR;}{^6xbrI&{38bKolGD^`kP zHHlI`i}6TVTBGcV(EO56HDNhjB<}!tQ8EAZhZ^^KHeBdS?3#v?k@!O?9b{^qy3b<& zH$d0V#yRGOW5hSUA4IHhN2l>Fy-H(@ba(3IKaSr3VgGR>GcE){O?*D261jV<djvRmvxnun58#g3e;_h37eVuR)H~l@~P}Eu>A$|#Rn;pz(^w~ zP0$FY4@PCCmqf@6U1oDbb5}PvHg&g$FhoY_dHitB`JB)BFgOajArppl@RXMY%KLcA z-D8g+mIy;eugOl?EEZsS%a4z1Q!+WMo-(xklDS5vgY-uRS7~;Mz0#!M zXJQHE*_8-HgP8d>>!XCa|D4bT1q2EhsAz+_C(h_GN`xUESJ_R3lNxdjc@Q}xp3S`g zOW4-QCRHQog2y5iO*>B3_2i@-n?^T0`-<~4S)5X?n1d~ZQJirK?^h-e-HCQiHmPF( zz=A>h?XngaI02XCTJ+BKx6eNOB8i;gaejK9>#C&zft_VoGD_f&tY9jr`Y1!)drJry zz{rbOORQpZH-tOq+h8xOa#2D@ThFy%ha@2KA~?ch=-V(Tq0R3aC$+yR(FiG&&@S4| zR>buf;(83WLK})D85O3p*uXkY7>eNajbTCax!+!y=-Xd1#SmWmYXkD;_NHPpTMI=&$sFP`xHcwj)Y)K@|vPu$l}alh1;I zi0J+N6x+#!!}sJzAf*8S#9t-`Vvd+RADUOJ<{D%PnaC4N@Gg#FL0fct9pilm#VK*- z`RN|#n>u}PyeTB-tkeJEGpU9b1}pCiRJbcpUZaFIkJNkBR6GFq4J)tFe*XqI Q5dZ)H07*qoM6N<$g1HzuTmS$7 From 30643889f523e9a1dccb8af02760f7620f3e1367 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:38:40 +0100 Subject: [PATCH 0915/1620] New translations FixCoordinatesMongolia.java (Spanish) --- .../earth/app/view/Messages_es.properties | 109 +----------------- 1 file changed, 5 insertions(+), 104 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index e62a057929..c36b2d4338 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,112 +1,13 @@ package org.openforis.collect.earth.app.ad_hoc; -import java.util.ArrayList; -import java.util.List; - -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.manager.RecordManager; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.CollectRecordSummary; -import org.openforis.collect.model.RecordFilter; -import org.openforis.idm.model.CoordinateAttribute; -import org.openforis.idm.model.TextAttribute; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component -public class FixDuplicatePlots { - - @Autowired - private RecordManager recordManager; - - @Autowired - private EarthSurveyService earthSurveyService; - - private Logger logger = LoggerFactory.getLogger( FixDuplicatePlots.class); - - private boolean stopFix = false; - - private List getAllRecords(){ - return recordManager.loadSummaries( - new RecordFilter( - earthSurveyService.getCollectSurvey() , - EarthConstants.ROOT_ENTITY_NAME - ) ); - } - - - - public void fixHela(){ - List allRecords = getAllRecords(); - - if( shouldStopFixing()){ - return; - } - int i = 0; - for (CollectRecordSummary summaryCollectRecord : allRecords) { - if( shouldStopFixing()){ - break; - } - try { - CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); - - if( isSouthernPlot(collectRecord) ){ - recordManager.delete( collectRecord.getId() ); - i++; - - } - - } catch (Exception e) { - logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ - } - } - logger.info("In total fixed plots " + i); //$NON-NLS-1$ - - } - - private List getSouthernHighlandsRecords(List allRecords) { - List southernHighlandsPlots = new ArrayList(); - - for (CollectRecord record : allRecords) { - if( record!= null ){ - CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), record.getId(), Step.ENTRY); - TextAttribute plot_file = (TextAttribute) collectRecord.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ - if( plot_file !=null && plot_file.getValue().getValue().equals("southernHighlands.ced") ){ //$NON-NLS-1$ - southernHighlandsPlots.add( collectRecord ); - } - } - } - return southernHighlandsPlots; - } - - private CollectRecord findMathingCoordinatePlotInSouthern(List southernHighlandRecords, CoordinateAttribute plotCoord) { - for (CollectRecord southernPlot : southernHighlandRecords) { - - CoordinateAttribute sothernCoord = (CoordinateAttribute) southernPlot.getNodeByPath("/plot/location"); //$NON-NLS-1$ - if( sothernCoord.getValue().equals(plotCoord.getValue() ) ){ - return southernPlot; - } - } - return null; - } - - private boolean isSouthernPlot(CollectRecord record) { - - TextAttribute plot_file = (TextAttribute) record.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ - return( plot_file!=null && plot_file.getValue().getValue().equals("southernHighlands.ced") ); //$NON-NLS-1$ - } - - private boolean shouldStopFixing() { - return stopFix; - } - - public void stopFixing() { - stopFix = true; +public class FixCoordinatesMongolia extends FixCoordinates { + @Override + protected int getLongitudeLimit() { + return 87; } -} \ No newline at end of file +} From f15c55a62c7fadda260ff1a6deb2a7513abcf009 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:38:41 +0100 Subject: [PATCH 0916/1620] New translations FixCoordinatesMongolia.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 128 ++---------------- 1 file changed, 9 insertions(+), 119 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 06cc3503c4..c36b2d4338 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,123 +1,13 @@ - - - earth +package org.openforis.collect.earth.app.ad_hoc; - - contextConfigLocation - file:${collectEarth.userFolder}/generated/applicationContext.xml - - - webAppRootKey - SimpleServer.root - - - - org.apache.logging.log4j.web.Log4jServletContextListener - - - - org.springframework.web.context.ContextLoaderListener - +import org.springframework.stereotype.Component; - - localizationFilter - org.springframework.web.filter.RequestContextFilter - - - characterEncodingFilter - org.springframework.web.filter.CharacterEncodingFilter - - encoding - UTF-8 - - - - googleEarthHeaderFilter - org.openforis.collect.earth.app.server.GoogleEarthHeaderFilter - - - cross-origin - org.eclipse.jetty.servlets.CrossOriginFilter - - - - localizationFilter - /* - - - characterEncodingFilter - /* - - - googleEarthHeaderFilter - /* - - - cross-origin - /* - - +@Component +public class FixCoordinatesMongolia extends FixCoordinates { - - DB Connection - jdbc/collectDs - javax.sql.DataSource - Container - + @Override + protected int getLongitudeLimit() { + return 87; + } - - dispatcher - org.springframework.web.servlet.DispatcherServlet - 1 - - contextConfigLocation - classpath:/WEB-INF/dispatcher-servlet.xml - - - - default - org.eclipse.jetty.servlet.DefaultServlet - - useFileMappedBuffer - false - - - - - dispatcher - / - - - - default - /generated/* - - - - default - /testOnline/* - - - - 2 - - - - index.html - - - - kml - application/vnd.google-earth.kml+xml - - - - kmz - application/vnd.google-earth.kmz - - - +} From 6049681e6a619fbade16eff63c290318fafcc0f0 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:38:42 +0100 Subject: [PATCH 0917/1620] New translations FixCoordinatesMongolia.java (English) --- .../earth/app/view/Messages_en.properties | Bin 472 -> 239 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 7970bf0c5cba40b6e46c7a75190fcdf44909bc74..c36b2d4338f3a5a98949337efe689c43c94ece9c 100644 GIT binary patch literal 239 zcmZ9Gv1&sx3`J+_D?Fx)*9Ni#0-aL&2|=|LN5sz(vR;}{^6xbrI&{38bKolGD^`kP zHHlI`i}6TVTBGcV(EO56HDNhjB<}!tQ8EAZhZ^^KHeBdS?3#v?k@!O?9b{^qy3b<& zH$d0V#yRGOW5hSUA4IHhN2l>Fy-H(@ba(3IKaSr3VgGR>GcE){O?*D261jV<6P)NkloE@^#u)JJQyHVW8g@jxzNhGCKq9{pP)b3aK11P23C?zCGUgAn_ zC{dQkTQjY(Ih(WhbB?(`tH<~9`F;EJ>-QiqNV0dxp;niyA-mL;mX+w!#a(C9$>Ehz z7a2XKJ(CYqYfYW5YCxNL2%g?(_Qe&79PmyBP_5MtnLJ?P;L{%j+x#*j22wNQ0aR0J z2buwzV<2+>4rTL8{{TGGepJcUtG9j-ULN84HkfV<$viQT=8<@lv z%;R&cBM>lx?fB1VeIc89RL4dh@Wm8dl26LG`V&E?klekI)jKn~PibSkn zui$_*#y8-LYgLxo5?IQa%VxEWSi&`?XOD=1xFjx65%L+-CyD4)4^+`Wdd>`qwX&{G?@`b{lo?U O0000 Date: Tue, 29 Nov 2022 15:38:43 +0100 Subject: [PATCH 0918/1620] New translations FixCoordinatesPNG.java (French) --- .../openforis/collect/earth/app/view/Messages_fr.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index c36b2d4338..8612606a4d 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -3,11 +3,11 @@ package org.openforis.collect.earth.app.ad_hoc; import org.springframework.stereotype.Component; @Component -public class FixCoordinatesMongolia extends FixCoordinates { +public class FixCoordinatesPNG extends FixCoordinates { @Override protected int getLongitudeLimit() { - return 87; + return 5; } } From 29704c0213b7fdb320af7e4b445e95563201e59c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:38:45 +0100 Subject: [PATCH 0919/1620] New translations FixCoordinatesPNG.java (Spanish) --- .../openforis/collect/earth/app/view/Messages_es.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index c36b2d4338..8612606a4d 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -3,11 +3,11 @@ package org.openforis.collect.earth.app.ad_hoc; import org.springframework.stereotype.Component; @Component -public class FixCoordinatesMongolia extends FixCoordinates { +public class FixCoordinatesPNG extends FixCoordinates { @Override protected int getLongitudeLimit() { - return 87; + return 5; } } From 6321652ff8f13070b63e48619ff59cb2684aaa5c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:38:46 +0100 Subject: [PATCH 0920/1620] New translations FixCoordinatesPNG.java (Portuguese) --- .../openforis/collect/earth/app/view/Messages_pt.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index c36b2d4338..8612606a4d 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -3,11 +3,11 @@ package org.openforis.collect.earth.app.ad_hoc; import org.springframework.stereotype.Component; @Component -public class FixCoordinatesMongolia extends FixCoordinates { +public class FixCoordinatesPNG extends FixCoordinates { @Override protected int getLongitudeLimit() { - return 87; + return 5; } } From 8aef02f4b16648d089159910e49429a76e90004a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:38:47 +0100 Subject: [PATCH 0921/1620] New translations FixCoordinatesPNG.java (English) --- .../openforis/collect/earth/app/view/Messages_en.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index c36b2d4338..8612606a4d 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -3,11 +3,11 @@ package org.openforis.collect.earth.app.ad_hoc; import org.springframework.stereotype.Component; @Component -public class FixCoordinatesMongolia extends FixCoordinates { +public class FixCoordinatesPNG extends FixCoordinates { @Override protected int getLongitudeLimit() { - return 87; + return 5; } } From 155ef9b16c770fd08384e0bdc7028f0d629ce2cd Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:38:48 +0100 Subject: [PATCH 0922/1620] New translations FixDuplicatePlots.java (French) --- .../earth/app/view/Messages_fr.properties | 109 +++++++++++++++++- 1 file changed, 104 insertions(+), 5 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 8612606a4d..e62a057929 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,13 +1,112 @@ package org.openforis.collect.earth.app.ad_hoc; +import java.util.ArrayList; +import java.util.List; + +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.manager.RecordManager; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.CollectRecordSummary; +import org.openforis.collect.model.RecordFilter; +import org.openforis.idm.model.CoordinateAttribute; +import org.openforis.idm.model.TextAttribute; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component -public class FixCoordinatesPNG extends FixCoordinates { +public class FixDuplicatePlots { + + @Autowired + private RecordManager recordManager; + + @Autowired + private EarthSurveyService earthSurveyService; + + private Logger logger = LoggerFactory.getLogger( FixDuplicatePlots.class); + + private boolean stopFix = false; + + private List getAllRecords(){ + return recordManager.loadSummaries( + new RecordFilter( + earthSurveyService.getCollectSurvey() , + EarthConstants.ROOT_ENTITY_NAME + ) ); + } + + + + public void fixHela(){ + List allRecords = getAllRecords(); + + if( shouldStopFixing()){ + return; + } + int i = 0; + for (CollectRecordSummary summaryCollectRecord : allRecords) { + if( shouldStopFixing()){ + break; + } + try { + CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); + + if( isSouthernPlot(collectRecord) ){ + recordManager.delete( collectRecord.getId() ); + i++; + + } + + } catch (Exception e) { + logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ + } + } + logger.info("In total fixed plots " + i); //$NON-NLS-1$ + + } + + private List getSouthernHighlandsRecords(List allRecords) { + List southernHighlandsPlots = new ArrayList(); + + for (CollectRecord record : allRecords) { + if( record!= null ){ + CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), record.getId(), Step.ENTRY); + TextAttribute plot_file = (TextAttribute) collectRecord.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ + if( plot_file !=null && plot_file.getValue().getValue().equals("southernHighlands.ced") ){ //$NON-NLS-1$ + southernHighlandsPlots.add( collectRecord ); + } + } + } + return southernHighlandsPlots; + } + + private CollectRecord findMathingCoordinatePlotInSouthern(List southernHighlandRecords, CoordinateAttribute plotCoord) { + for (CollectRecord southernPlot : southernHighlandRecords) { + + CoordinateAttribute sothernCoord = (CoordinateAttribute) southernPlot.getNodeByPath("/plot/location"); //$NON-NLS-1$ + if( sothernCoord.getValue().equals(plotCoord.getValue() ) ){ + return southernPlot; + } + } + return null; + } + + private boolean isSouthernPlot(CollectRecord record) { + + TextAttribute plot_file = (TextAttribute) record.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ + return( plot_file!=null && plot_file.getValue().getValue().equals("southernHighlands.ced") ); //$NON-NLS-1$ + } + + private boolean shouldStopFixing() { + return stopFix; + } + + public void stopFixing() { + stopFix = true; - @Override - protected int getLongitudeLimit() { - return 5; } -} +} \ No newline at end of file From 81d28192d42e6a22c64847e455a182256882d616 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:38:49 +0100 Subject: [PATCH 0923/1620] New translations FixDuplicatePlots.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 109 +++++++++++++++++- 1 file changed, 104 insertions(+), 5 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 8612606a4d..e62a057929 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,13 +1,112 @@ package org.openforis.collect.earth.app.ad_hoc; +import java.util.ArrayList; +import java.util.List; + +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.manager.RecordManager; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.CollectRecordSummary; +import org.openforis.collect.model.RecordFilter; +import org.openforis.idm.model.CoordinateAttribute; +import org.openforis.idm.model.TextAttribute; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component -public class FixCoordinatesPNG extends FixCoordinates { +public class FixDuplicatePlots { + + @Autowired + private RecordManager recordManager; + + @Autowired + private EarthSurveyService earthSurveyService; + + private Logger logger = LoggerFactory.getLogger( FixDuplicatePlots.class); + + private boolean stopFix = false; + + private List getAllRecords(){ + return recordManager.loadSummaries( + new RecordFilter( + earthSurveyService.getCollectSurvey() , + EarthConstants.ROOT_ENTITY_NAME + ) ); + } + + + + public void fixHela(){ + List allRecords = getAllRecords(); + + if( shouldStopFixing()){ + return; + } + int i = 0; + for (CollectRecordSummary summaryCollectRecord : allRecords) { + if( shouldStopFixing()){ + break; + } + try { + CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); + + if( isSouthernPlot(collectRecord) ){ + recordManager.delete( collectRecord.getId() ); + i++; + + } + + } catch (Exception e) { + logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ + } + } + logger.info("In total fixed plots " + i); //$NON-NLS-1$ + + } + + private List getSouthernHighlandsRecords(List allRecords) { + List southernHighlandsPlots = new ArrayList(); + + for (CollectRecord record : allRecords) { + if( record!= null ){ + CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), record.getId(), Step.ENTRY); + TextAttribute plot_file = (TextAttribute) collectRecord.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ + if( plot_file !=null && plot_file.getValue().getValue().equals("southernHighlands.ced") ){ //$NON-NLS-1$ + southernHighlandsPlots.add( collectRecord ); + } + } + } + return southernHighlandsPlots; + } + + private CollectRecord findMathingCoordinatePlotInSouthern(List southernHighlandRecords, CoordinateAttribute plotCoord) { + for (CollectRecord southernPlot : southernHighlandRecords) { + + CoordinateAttribute sothernCoord = (CoordinateAttribute) southernPlot.getNodeByPath("/plot/location"); //$NON-NLS-1$ + if( sothernCoord.getValue().equals(plotCoord.getValue() ) ){ + return southernPlot; + } + } + return null; + } + + private boolean isSouthernPlot(CollectRecord record) { + + TextAttribute plot_file = (TextAttribute) record.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ + return( plot_file!=null && plot_file.getValue().getValue().equals("southernHighlands.ced") ); //$NON-NLS-1$ + } + + private boolean shouldStopFixing() { + return stopFix; + } + + public void stopFixing() { + stopFix = true; - @Override - protected int getLongitudeLimit() { - return 5; } -} +} \ No newline at end of file From 0f7e8eae7752d9801f51832ac95bf5216726655d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:38:50 +0100 Subject: [PATCH 0924/1620] New translations FixCoordinates.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 66 ++++--------------- 1 file changed, 14 insertions(+), 52 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index e62a057929..499b7cb5ec 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,6 +1,5 @@ package org.openforis.collect.earth.app.ad_hoc; -import java.util.ArrayList; import java.util.List; import org.openforis.collect.earth.app.EarthConstants; @@ -10,15 +9,15 @@ import org.openforis.collect.model.CollectRecord; import org.openforis.collect.model.CollectRecord.Step; import org.openforis.collect.model.CollectRecordSummary; import org.openforis.collect.model.RecordFilter; +import org.openforis.idm.model.Coordinate; import org.openforis.idm.model.CoordinateAttribute; -import org.openforis.idm.model.TextAttribute; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component -public class FixDuplicatePlots { +public abstract class FixCoordinates { @Autowired private RecordManager recordManager; @@ -26,79 +25,42 @@ public class FixDuplicatePlots { @Autowired private EarthSurveyService earthSurveyService; - private Logger logger = LoggerFactory.getLogger( FixDuplicatePlots.class); + private Logger logger = LoggerFactory.getLogger( FixCoordinates.class); private boolean stopFix = false; private List getAllRecords(){ - return recordManager.loadSummaries( - new RecordFilter( - earthSurveyService.getCollectSurvey() , - EarthConstants.ROOT_ENTITY_NAME - ) ); + RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); + return recordManager.loadSummaries( rf ); } - - - public void fixHela(){ + public void fixCoordinates(){ List allRecords = getAllRecords(); - + if( shouldStopFixing()){ return; } - int i = 0; + for (CollectRecordSummary summaryCollectRecord : allRecords) { if( shouldStopFixing()){ break; } try { CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); - - if( isSouthernPlot(collectRecord) ){ - recordManager.delete( collectRecord.getId() ); - i++; - + CoordinateAttribute plotCoord = (CoordinateAttribute) collectRecord.getNodeByPath("/plot/location"); //$NON-NLS-1$ + if( plotCoord != null && plotCoord.getValue() != null && plotCoord.getValue().getX() < getLongitudeLimit() ){ + Coordinate coordinate = new Coordinate(plotCoord.getValue().getY(), plotCoord.getValue().getX(), plotCoord.getValue().getSrsId() ); + plotCoord.setValue( coordinate ); + recordManager.save( collectRecord ); } - } catch (Exception e) { logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ } } - logger.info("In total fixed plots " + i); //$NON-NLS-1$ } - private List getSouthernHighlandsRecords(List allRecords) { - List southernHighlandsPlots = new ArrayList(); - - for (CollectRecord record : allRecords) { - if( record!= null ){ - CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), record.getId(), Step.ENTRY); - TextAttribute plot_file = (TextAttribute) collectRecord.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ - if( plot_file !=null && plot_file.getValue().getValue().equals("southernHighlands.ced") ){ //$NON-NLS-1$ - southernHighlandsPlots.add( collectRecord ); - } - } - } - return southernHighlandsPlots; - } - - private CollectRecord findMathingCoordinatePlotInSouthern(List southernHighlandRecords, CoordinateAttribute plotCoord) { - for (CollectRecord southernPlot : southernHighlandRecords) { - - CoordinateAttribute sothernCoord = (CoordinateAttribute) southernPlot.getNodeByPath("/plot/location"); //$NON-NLS-1$ - if( sothernCoord.getValue().equals(plotCoord.getValue() ) ){ - return southernPlot; - } - } - return null; - } - - private boolean isSouthernPlot(CollectRecord record) { - - TextAttribute plot_file = (TextAttribute) record.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ - return( plot_file!=null && plot_file.getValue().getValue().equals("southernHighlands.ced") ); //$NON-NLS-1$ - } + protected abstract int getLongitudeLimit(); private boolean shouldStopFixing() { return stopFix; From 212a22ab9b94ac52af50ac533ac60047daf4c182 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:38:51 +0100 Subject: [PATCH 0925/1620] New translations FixDuplicatePlots.java (English) --- .../earth/app/view/Messages_en.properties | 109 +++++++++++++++++- 1 file changed, 104 insertions(+), 5 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 8612606a4d..e62a057929 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,13 +1,112 @@ package org.openforis.collect.earth.app.ad_hoc; +import java.util.ArrayList; +import java.util.List; + +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.manager.RecordManager; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.CollectRecordSummary; +import org.openforis.collect.model.RecordFilter; +import org.openforis.idm.model.CoordinateAttribute; +import org.openforis.idm.model.TextAttribute; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component -public class FixCoordinatesPNG extends FixCoordinates { +public class FixDuplicatePlots { + + @Autowired + private RecordManager recordManager; + + @Autowired + private EarthSurveyService earthSurveyService; + + private Logger logger = LoggerFactory.getLogger( FixDuplicatePlots.class); + + private boolean stopFix = false; + + private List getAllRecords(){ + return recordManager.loadSummaries( + new RecordFilter( + earthSurveyService.getCollectSurvey() , + EarthConstants.ROOT_ENTITY_NAME + ) ); + } + + + + public void fixHela(){ + List allRecords = getAllRecords(); + + if( shouldStopFixing()){ + return; + } + int i = 0; + for (CollectRecordSummary summaryCollectRecord : allRecords) { + if( shouldStopFixing()){ + break; + } + try { + CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); + + if( isSouthernPlot(collectRecord) ){ + recordManager.delete( collectRecord.getId() ); + i++; + + } + + } catch (Exception e) { + logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ + } + } + logger.info("In total fixed plots " + i); //$NON-NLS-1$ + + } + + private List getSouthernHighlandsRecords(List allRecords) { + List southernHighlandsPlots = new ArrayList(); + + for (CollectRecord record : allRecords) { + if( record!= null ){ + CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), record.getId(), Step.ENTRY); + TextAttribute plot_file = (TextAttribute) collectRecord.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ + if( plot_file !=null && plot_file.getValue().getValue().equals("southernHighlands.ced") ){ //$NON-NLS-1$ + southernHighlandsPlots.add( collectRecord ); + } + } + } + return southernHighlandsPlots; + } + + private CollectRecord findMathingCoordinatePlotInSouthern(List southernHighlandRecords, CoordinateAttribute plotCoord) { + for (CollectRecord southernPlot : southernHighlandRecords) { + + CoordinateAttribute sothernCoord = (CoordinateAttribute) southernPlot.getNodeByPath("/plot/location"); //$NON-NLS-1$ + if( sothernCoord.getValue().equals(plotCoord.getValue() ) ){ + return southernPlot; + } + } + return null; + } + + private boolean isSouthernPlot(CollectRecord record) { + + TextAttribute plot_file = (TextAttribute) record.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ + return( plot_file!=null && plot_file.getValue().getValue().equals("southernHighlands.ced") ); //$NON-NLS-1$ + } + + private boolean shouldStopFixing() { + return stopFix; + } + + public void stopFixing() { + stopFix = true; - @Override - protected int getLongitudeLimit() { - return 5; } -} +} \ No newline at end of file From 5467dcd8b097fbb271a4f2f2bc4d361d3ac2069c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:38:53 +0100 Subject: [PATCH 0926/1620] New translations FixMissingPlotsFileInfo.java (French) --- .../earth/app/view/Messages_fr.properties | 168 ++++++++++++------ 1 file changed, 118 insertions(+), 50 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index e62a057929..315f96ec2c 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,24 +1,43 @@ package org.openforis.collect.earth.app.ad_hoc; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.swing.JFrame; import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.view.DataFormat; +import org.openforis.collect.earth.app.view.JFileChooserExistsAware; import org.openforis.collect.manager.RecordManager; import org.openforis.collect.model.CollectRecord; import org.openforis.collect.model.CollectRecord.Step; import org.openforis.collect.model.CollectRecordSummary; import org.openforis.collect.model.RecordFilter; -import org.openforis.idm.model.CoordinateAttribute; +import org.openforis.collect.persistence.RecordPersistenceException; import org.openforis.idm.model.TextAttribute; +import org.openforis.idm.model.TextValue; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import com.opencsv.CSVReader; +import com.opencsv.exceptions.CsvValidationException; + @Component -public class FixDuplicatePlots { +public final class FixMissingPlotsFileInfo { @Autowired private RecordManager recordManager; @@ -26,87 +45,136 @@ public class FixDuplicatePlots { @Autowired private EarthSurveyService earthSurveyService; - private Logger logger = LoggerFactory.getLogger( FixDuplicatePlots.class); + @Autowired + private LocalPropertiesService localPropertiesService; + + private final Logger logger = LoggerFactory.getLogger(FixMissingPlotsFileInfo.class); private boolean stopFix = false; + + + public void findMissingPlots(JFrame frame) { + final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, false, true, null, + localPropertiesService, frame); + + final Map> plotIdsByFile = getPlotIdsByFile(selectedPlotFiles); + + List plotIdsWithNoRegion = getPlotsNoRegion(); + + for (CollectRecord record : plotIdsWithNoRegion) { + String plotFile = getFileNameForId( plotIdsByFile, record ); + if( plotFile != null ){ + setPlotFile( record, plotFile ); + }else{ + logger.info("No plot file found for plot with ID : " + getPlotId(record) ); //$NON-NLS-1$ + try { + recordManager.delete( record.getId() ); + } catch (RecordPersistenceException e) { + logger.error("Not able to remove plot with ID " + record.getId(), e ) ; //$NON-NLS-1$ + } + } + } + } + + private String getPlotId(CollectRecord record) { + TextAttribute plot_id = (TextAttribute) record.getNodeByPath("/plot/id"); //$NON-NLS-1$ + return plot_id.getValue().getValue(); + } + private List getAllRecords(){ - return recordManager.loadSummaries( - new RecordFilter( - earthSurveyService.getCollectSurvey() , - EarthConstants.ROOT_ENTITY_NAME - ) ); + RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); + List records = recordManager.loadSummaries( rf ); + return records; } + private void setPlotFile(CollectRecord record, String plotFile) { + TextValue textValue = new TextValue( plotFile ); + recordManager.addAttribute(record.getRootEntity(), "plot_file", textValue, null, null); //$NON-NLS-1$ - public void fixHela(){ - List allRecords = getAllRecords(); + recordManager.save( record ); + logger.info("Setting record to plot_file : " + plotFile ); //$NON-NLS-1$ - if( shouldStopFixing()){ - return; - } - int i = 0; - for (CollectRecordSummary summaryCollectRecord : allRecords) { - if( shouldStopFixing()){ - break; - } - try { - CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); + } - if( isSouthernPlot(collectRecord) ){ - recordManager.delete( collectRecord.getId() ); - i++; + private String getFileNameForId(Map> plotIdsByFile, CollectRecord record) { - } + Set fileNames = plotIdsByFile.keySet(); + String plotId = getPlotId(record); + for (String filename : fileNames) { - } catch (Exception e) { - logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ + List plotIds = plotIdsByFile.get(filename); + for (String plotIdInFile : plotIds) { + if( plotIdInFile.equals(plotId)){ + return filename; + } } } - logger.info("In total fixed plots " + i); //$NON-NLS-1$ + return null; + } + private List getPlotsNoRegion() { + List plotsWithNoRegionInfo = new ArrayList(); + List allRecords = getAllRecords(); + for (CollectRecordSummary summary : allRecords) { + CollectRecord record = recordManager.load( earthSurveyService.getCollectSurvey(), summary.getId(), Step.ENTRY); + TextAttribute plot_file = (TextAttribute) record.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ + if( plot_file ==null || plot_file.getValue() == null || plot_file.getValue().getValue() == null ){ + plotsWithNoRegionInfo.add( record ); + } + } + return plotsWithNoRegionInfo; } - private List getSouthernHighlandsRecords(List allRecords) { - List southernHighlandsPlots = new ArrayList(); + private CSVReader getCsvReader(String csvFile) throws FileNotFoundException { + CSVReader reader; + final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 )); //$NON-NLS-1$ + reader = new CSVReader(bufferedReader); + return reader; + } - for (CollectRecord record : allRecords) { - if( record!= null ){ - CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), record.getId(), Step.ENTRY); - TextAttribute plot_file = (TextAttribute) collectRecord.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ - if( plot_file !=null && plot_file.getValue().getValue().equals("southernHighlands.ced") ){ //$NON-NLS-1$ - southernHighlandsPlots.add( collectRecord ); - } + private List getIdsInFile(String plotCoordinateFile) { + final List plotIds = new ArrayList(); + try { + final CSVReader plotCsvReader = getCsvReader(plotCoordinateFile); + String[] csvRow; + while ((csvRow = plotCsvReader.readNext()) != null) { + plotIds.add(csvRow[0]); } + } catch (final FileNotFoundException e) { + logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ + } catch (final IOException e) { + logger.error("Error reading CSV line", e); //$NON-NLS-1$ + } catch (CsvValidationException e) { + logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ } - return southernHighlandsPlots; + + return plotIds; } - private CollectRecord findMathingCoordinatePlotInSouthern(List southernHighlandRecords, CoordinateAttribute plotCoord) { - for (CollectRecord southernPlot : southernHighlandRecords) { - CoordinateAttribute sothernCoord = (CoordinateAttribute) southernPlot.getNodeByPath("/plot/location"); //$NON-NLS-1$ - if( sothernCoord.getValue().equals(plotCoord.getValue() ) ){ - return southernPlot; + private Map> getPlotIdsByFile(File[] selectedPlotFiles) { + final Map> plotIdsByFile = new HashMap>(); + + for (final File file : selectedPlotFiles) { + if (shouldStopFixing()) { + break; } + plotIdsByFile.put(file.getName(), getIdsInFile(file.getAbsolutePath())); } - return null; + + return plotIdsByFile; } - private boolean isSouthernPlot(CollectRecord record) { - TextAttribute plot_file = (TextAttribute) record.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ - return( plot_file!=null && plot_file.getValue().getValue().equals("southernHighlands.ced") ); //$NON-NLS-1$ - } private boolean shouldStopFixing() { return stopFix; } public void stopFixing() { - stopFix = true; + stopFix = true; } - -} \ No newline at end of file +} From d486342e0e3368be0b71cf884ea845bb918b092f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:38:54 +0100 Subject: [PATCH 0927/1620] New translations FixMissingPlotsFileInfo.java (Spanish) --- .../earth/app/view/Messages_es.properties | 175 +++++++++++++++++- 1 file changed, 171 insertions(+), 4 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 8612606a4d..315f96ec2c 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,13 +1,180 @@ package org.openforis.collect.earth.app.ad_hoc; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.swing.JFrame; + +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.view.DataFormat; +import org.openforis.collect.earth.app.view.JFileChooserExistsAware; +import org.openforis.collect.manager.RecordManager; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.CollectRecordSummary; +import org.openforis.collect.model.RecordFilter; +import org.openforis.collect.persistence.RecordPersistenceException; +import org.openforis.idm.model.TextAttribute; +import org.openforis.idm.model.TextValue; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import com.opencsv.CSVReader; +import com.opencsv.exceptions.CsvValidationException; + @Component -public class FixCoordinatesPNG extends FixCoordinates { +public final class FixMissingPlotsFileInfo { + + @Autowired + private RecordManager recordManager; + + @Autowired + private EarthSurveyService earthSurveyService; + + @Autowired + private LocalPropertiesService localPropertiesService; + + private final Logger logger = LoggerFactory.getLogger(FixMissingPlotsFileInfo.class); + + private boolean stopFix = false; + + + + public void findMissingPlots(JFrame frame) { + final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, false, true, null, + localPropertiesService, frame); + + final Map> plotIdsByFile = getPlotIdsByFile(selectedPlotFiles); + + List plotIdsWithNoRegion = getPlotsNoRegion(); + + for (CollectRecord record : plotIdsWithNoRegion) { + String plotFile = getFileNameForId( plotIdsByFile, record ); + if( plotFile != null ){ + setPlotFile( record, plotFile ); + }else{ + logger.info("No plot file found for plot with ID : " + getPlotId(record) ); //$NON-NLS-1$ + try { + recordManager.delete( record.getId() ); + } catch (RecordPersistenceException e) { + logger.error("Not able to remove plot with ID " + record.getId(), e ) ; //$NON-NLS-1$ + } + } + } + } + + private String getPlotId(CollectRecord record) { + TextAttribute plot_id = (TextAttribute) record.getNodeByPath("/plot/id"); //$NON-NLS-1$ + return plot_id.getValue().getValue(); + } + + private List getAllRecords(){ + RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); + List records = recordManager.loadSummaries( rf ); + return records; + } + + private void setPlotFile(CollectRecord record, String plotFile) { + + TextValue textValue = new TextValue( plotFile ); + recordManager.addAttribute(record.getRootEntity(), "plot_file", textValue, null, null); //$NON-NLS-1$ + + recordManager.save( record ); + logger.info("Setting record to plot_file : " + plotFile ); //$NON-NLS-1$ - @Override - protected int getLongitudeLimit() { - return 5; } + private String getFileNameForId(Map> plotIdsByFile, CollectRecord record) { + + Set fileNames = plotIdsByFile.keySet(); + String plotId = getPlotId(record); + for (String filename : fileNames) { + + List plotIds = plotIdsByFile.get(filename); + for (String plotIdInFile : plotIds) { + if( plotIdInFile.equals(plotId)){ + return filename; + } + } + } + return null; + } + + private List getPlotsNoRegion() { + List plotsWithNoRegionInfo = new ArrayList(); + List allRecords = getAllRecords(); + for (CollectRecordSummary summary : allRecords) { + CollectRecord record = recordManager.load( earthSurveyService.getCollectSurvey(), summary.getId(), Step.ENTRY); + TextAttribute plot_file = (TextAttribute) record.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ + if( plot_file ==null || plot_file.getValue() == null || plot_file.getValue().getValue() == null ){ + plotsWithNoRegionInfo.add( record ); + } + } + return plotsWithNoRegionInfo; + } + + private CSVReader getCsvReader(String csvFile) throws FileNotFoundException { + CSVReader reader; + final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 )); //$NON-NLS-1$ + reader = new CSVReader(bufferedReader); + return reader; + } + + private List getIdsInFile(String plotCoordinateFile) { + final List plotIds = new ArrayList(); + try { + final CSVReader plotCsvReader = getCsvReader(plotCoordinateFile); + String[] csvRow; + while ((csvRow = plotCsvReader.readNext()) != null) { + plotIds.add(csvRow[0]); + } + } catch (final FileNotFoundException e) { + logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ + } catch (final IOException e) { + logger.error("Error reading CSV line", e); //$NON-NLS-1$ + } catch (CsvValidationException e) { + logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ + } + + return plotIds; + } + + + private Map> getPlotIdsByFile(File[] selectedPlotFiles) { + final Map> plotIdsByFile = new HashMap>(); + + for (final File file : selectedPlotFiles) { + if (shouldStopFixing()) { + break; + } + plotIdsByFile.put(file.getName(), getIdsInFile(file.getAbsolutePath())); + } + + return plotIdsByFile; + } + + + + private boolean shouldStopFixing() { + return stopFix; + } + + public void stopFixing() { + stopFix = true; + + } } From 34821a2b60b834eaa8ac7a0602d4315e11be3fa7 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:38:55 +0100 Subject: [PATCH 0928/1620] New translations FixMissingPlotsFileInfo.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 160 +++++++++++++++--- 1 file changed, 133 insertions(+), 27 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 499b7cb5ec..315f96ec2c 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,23 +1,43 @@ package org.openforis.collect.earth.app.ad_hoc; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.swing.JFrame; import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.view.DataFormat; +import org.openforis.collect.earth.app.view.JFileChooserExistsAware; import org.openforis.collect.manager.RecordManager; import org.openforis.collect.model.CollectRecord; import org.openforis.collect.model.CollectRecord.Step; import org.openforis.collect.model.CollectRecordSummary; import org.openforis.collect.model.RecordFilter; -import org.openforis.idm.model.Coordinate; -import org.openforis.idm.model.CoordinateAttribute; +import org.openforis.collect.persistence.RecordPersistenceException; +import org.openforis.idm.model.TextAttribute; +import org.openforis.idm.model.TextValue; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import com.opencsv.CSVReader; +import com.opencsv.exceptions.CsvValidationException; + @Component -public abstract class FixCoordinates { +public final class FixMissingPlotsFileInfo { @Autowired private RecordManager recordManager; @@ -25,50 +45,136 @@ public abstract class FixCoordinates { @Autowired private EarthSurveyService earthSurveyService; - private Logger logger = LoggerFactory.getLogger( FixCoordinates.class); + @Autowired + private LocalPropertiesService localPropertiesService; + + private final Logger logger = LoggerFactory.getLogger(FixMissingPlotsFileInfo.class); private boolean stopFix = false; + + + public void findMissingPlots(JFrame frame) { + final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, false, true, null, + localPropertiesService, frame); + + final Map> plotIdsByFile = getPlotIdsByFile(selectedPlotFiles); + + List plotIdsWithNoRegion = getPlotsNoRegion(); + + for (CollectRecord record : plotIdsWithNoRegion) { + String plotFile = getFileNameForId( plotIdsByFile, record ); + if( plotFile != null ){ + setPlotFile( record, plotFile ); + }else{ + logger.info("No plot file found for plot with ID : " + getPlotId(record) ); //$NON-NLS-1$ + try { + recordManager.delete( record.getId() ); + } catch (RecordPersistenceException e) { + logger.error("Not able to remove plot with ID " + record.getId(), e ) ; //$NON-NLS-1$ + } + } + } + } + + private String getPlotId(CollectRecord record) { + TextAttribute plot_id = (TextAttribute) record.getNodeByPath("/plot/id"); //$NON-NLS-1$ + return plot_id.getValue().getValue(); + } + private List getAllRecords(){ RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); - return recordManager.loadSummaries( rf ); + List records = recordManager.loadSummaries( rf ); + return records; + } + + private void setPlotFile(CollectRecord record, String plotFile) { + + TextValue textValue = new TextValue( plotFile ); + recordManager.addAttribute(record.getRootEntity(), "plot_file", textValue, null, null); //$NON-NLS-1$ + + recordManager.save( record ); + logger.info("Setting record to plot_file : " + plotFile ); //$NON-NLS-1$ + + } + + private String getFileNameForId(Map> plotIdsByFile, CollectRecord record) { + + Set fileNames = plotIdsByFile.keySet(); + String plotId = getPlotId(record); + for (String filename : fileNames) { + + List plotIds = plotIdsByFile.get(filename); + for (String plotIdInFile : plotIds) { + if( plotIdInFile.equals(plotId)){ + return filename; + } + } + } + return null; } - public void fixCoordinates(){ + private List getPlotsNoRegion() { + List plotsWithNoRegionInfo = new ArrayList(); List allRecords = getAllRecords(); - - if( shouldStopFixing()){ - return; + for (CollectRecordSummary summary : allRecords) { + CollectRecord record = recordManager.load( earthSurveyService.getCollectSurvey(), summary.getId(), Step.ENTRY); + TextAttribute plot_file = (TextAttribute) record.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ + if( plot_file ==null || plot_file.getValue() == null || plot_file.getValue().getValue() == null ){ + plotsWithNoRegionInfo.add( record ); + } } - - for (CollectRecordSummary summaryCollectRecord : allRecords) { - if( shouldStopFixing()){ - break; + return plotsWithNoRegionInfo; + } + + private CSVReader getCsvReader(String csvFile) throws FileNotFoundException { + CSVReader reader; + final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 )); //$NON-NLS-1$ + reader = new CSVReader(bufferedReader); + return reader; + } + + private List getIdsInFile(String plotCoordinateFile) { + final List plotIds = new ArrayList(); + try { + final CSVReader plotCsvReader = getCsvReader(plotCoordinateFile); + String[] csvRow; + while ((csvRow = plotCsvReader.readNext()) != null) { + plotIds.add(csvRow[0]); } - try { - CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); - CoordinateAttribute plotCoord = (CoordinateAttribute) collectRecord.getNodeByPath("/plot/location"); //$NON-NLS-1$ - if( plotCoord != null && plotCoord.getValue() != null && plotCoord.getValue().getX() < getLongitudeLimit() ){ - Coordinate coordinate = new Coordinate(plotCoord.getValue().getY(), plotCoord.getValue().getX(), plotCoord.getValue().getSrsId() ); - plotCoord.setValue( coordinate ); - recordManager.save( collectRecord ); - } - } catch (Exception e) { - logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ + } catch (final FileNotFoundException e) { + logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ + } catch (final IOException e) { + logger.error("Error reading CSV line", e); //$NON-NLS-1$ + } catch (CsvValidationException e) { + logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ + } + + return plotIds; + } + + + private Map> getPlotIdsByFile(File[] selectedPlotFiles) { + final Map> plotIdsByFile = new HashMap>(); + + for (final File file : selectedPlotFiles) { + if (shouldStopFixing()) { + break; } + plotIdsByFile.put(file.getName(), getIdsInFile(file.getAbsolutePath())); } + return plotIdsByFile; } - protected abstract int getLongitudeLimit(); + private boolean shouldStopFixing() { return stopFix; } public void stopFixing() { - stopFix = true; + stopFix = true; } - -} \ No newline at end of file +} From 594af577ef626e04b7919990891c0cc173f6237c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:38:57 +0100 Subject: [PATCH 0929/1620] New translations FixMissingPlotsFileInfo.java (English) --- .../earth/app/view/Messages_en.properties | 168 ++++++++++++------ 1 file changed, 118 insertions(+), 50 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index e62a057929..315f96ec2c 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,24 +1,43 @@ package org.openforis.collect.earth.app.ad_hoc; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.swing.JFrame; import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.view.DataFormat; +import org.openforis.collect.earth.app.view.JFileChooserExistsAware; import org.openforis.collect.manager.RecordManager; import org.openforis.collect.model.CollectRecord; import org.openforis.collect.model.CollectRecord.Step; import org.openforis.collect.model.CollectRecordSummary; import org.openforis.collect.model.RecordFilter; -import org.openforis.idm.model.CoordinateAttribute; +import org.openforis.collect.persistence.RecordPersistenceException; import org.openforis.idm.model.TextAttribute; +import org.openforis.idm.model.TextValue; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import com.opencsv.CSVReader; +import com.opencsv.exceptions.CsvValidationException; + @Component -public class FixDuplicatePlots { +public final class FixMissingPlotsFileInfo { @Autowired private RecordManager recordManager; @@ -26,87 +45,136 @@ public class FixDuplicatePlots { @Autowired private EarthSurveyService earthSurveyService; - private Logger logger = LoggerFactory.getLogger( FixDuplicatePlots.class); + @Autowired + private LocalPropertiesService localPropertiesService; + + private final Logger logger = LoggerFactory.getLogger(FixMissingPlotsFileInfo.class); private boolean stopFix = false; + + + public void findMissingPlots(JFrame frame) { + final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, false, true, null, + localPropertiesService, frame); + + final Map> plotIdsByFile = getPlotIdsByFile(selectedPlotFiles); + + List plotIdsWithNoRegion = getPlotsNoRegion(); + + for (CollectRecord record : plotIdsWithNoRegion) { + String plotFile = getFileNameForId( plotIdsByFile, record ); + if( plotFile != null ){ + setPlotFile( record, plotFile ); + }else{ + logger.info("No plot file found for plot with ID : " + getPlotId(record) ); //$NON-NLS-1$ + try { + recordManager.delete( record.getId() ); + } catch (RecordPersistenceException e) { + logger.error("Not able to remove plot with ID " + record.getId(), e ) ; //$NON-NLS-1$ + } + } + } + } + + private String getPlotId(CollectRecord record) { + TextAttribute plot_id = (TextAttribute) record.getNodeByPath("/plot/id"); //$NON-NLS-1$ + return plot_id.getValue().getValue(); + } + private List getAllRecords(){ - return recordManager.loadSummaries( - new RecordFilter( - earthSurveyService.getCollectSurvey() , - EarthConstants.ROOT_ENTITY_NAME - ) ); + RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); + List records = recordManager.loadSummaries( rf ); + return records; } + private void setPlotFile(CollectRecord record, String plotFile) { + TextValue textValue = new TextValue( plotFile ); + recordManager.addAttribute(record.getRootEntity(), "plot_file", textValue, null, null); //$NON-NLS-1$ - public void fixHela(){ - List allRecords = getAllRecords(); + recordManager.save( record ); + logger.info("Setting record to plot_file : " + plotFile ); //$NON-NLS-1$ - if( shouldStopFixing()){ - return; - } - int i = 0; - for (CollectRecordSummary summaryCollectRecord : allRecords) { - if( shouldStopFixing()){ - break; - } - try { - CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); + } - if( isSouthernPlot(collectRecord) ){ - recordManager.delete( collectRecord.getId() ); - i++; + private String getFileNameForId(Map> plotIdsByFile, CollectRecord record) { - } + Set fileNames = plotIdsByFile.keySet(); + String plotId = getPlotId(record); + for (String filename : fileNames) { - } catch (Exception e) { - logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ + List plotIds = plotIdsByFile.get(filename); + for (String plotIdInFile : plotIds) { + if( plotIdInFile.equals(plotId)){ + return filename; + } } } - logger.info("In total fixed plots " + i); //$NON-NLS-1$ + return null; + } + private List getPlotsNoRegion() { + List plotsWithNoRegionInfo = new ArrayList(); + List allRecords = getAllRecords(); + for (CollectRecordSummary summary : allRecords) { + CollectRecord record = recordManager.load( earthSurveyService.getCollectSurvey(), summary.getId(), Step.ENTRY); + TextAttribute plot_file = (TextAttribute) record.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ + if( plot_file ==null || plot_file.getValue() == null || plot_file.getValue().getValue() == null ){ + plotsWithNoRegionInfo.add( record ); + } + } + return plotsWithNoRegionInfo; } - private List getSouthernHighlandsRecords(List allRecords) { - List southernHighlandsPlots = new ArrayList(); + private CSVReader getCsvReader(String csvFile) throws FileNotFoundException { + CSVReader reader; + final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 )); //$NON-NLS-1$ + reader = new CSVReader(bufferedReader); + return reader; + } - for (CollectRecord record : allRecords) { - if( record!= null ){ - CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), record.getId(), Step.ENTRY); - TextAttribute plot_file = (TextAttribute) collectRecord.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ - if( plot_file !=null && plot_file.getValue().getValue().equals("southernHighlands.ced") ){ //$NON-NLS-1$ - southernHighlandsPlots.add( collectRecord ); - } + private List getIdsInFile(String plotCoordinateFile) { + final List plotIds = new ArrayList(); + try { + final CSVReader plotCsvReader = getCsvReader(plotCoordinateFile); + String[] csvRow; + while ((csvRow = plotCsvReader.readNext()) != null) { + plotIds.add(csvRow[0]); } + } catch (final FileNotFoundException e) { + logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ + } catch (final IOException e) { + logger.error("Error reading CSV line", e); //$NON-NLS-1$ + } catch (CsvValidationException e) { + logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ } - return southernHighlandsPlots; + + return plotIds; } - private CollectRecord findMathingCoordinatePlotInSouthern(List southernHighlandRecords, CoordinateAttribute plotCoord) { - for (CollectRecord southernPlot : southernHighlandRecords) { - CoordinateAttribute sothernCoord = (CoordinateAttribute) southernPlot.getNodeByPath("/plot/location"); //$NON-NLS-1$ - if( sothernCoord.getValue().equals(plotCoord.getValue() ) ){ - return southernPlot; + private Map> getPlotIdsByFile(File[] selectedPlotFiles) { + final Map> plotIdsByFile = new HashMap>(); + + for (final File file : selectedPlotFiles) { + if (shouldStopFixing()) { + break; } + plotIdsByFile.put(file.getName(), getIdsInFile(file.getAbsolutePath())); } - return null; + + return plotIdsByFile; } - private boolean isSouthernPlot(CollectRecord record) { - TextAttribute plot_file = (TextAttribute) record.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ - return( plot_file!=null && plot_file.getValue().getValue().equals("southernHighlands.ced") ); //$NON-NLS-1$ - } private boolean shouldStopFixing() { return stopFix; } public void stopFixing() { - stopFix = true; + stopFix = true; } - -} \ No newline at end of file +} From 62d88d82be53d430f2fb462a98cce3fd9bce824e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:38:58 +0100 Subject: [PATCH 0930/1620] New translations FixMissingSaxaulStrataInfo.java (French) --- .../earth/app/view/Messages_fr.properties | 162 ++++-------------- 1 file changed, 30 insertions(+), 132 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 315f96ec2c..00daac5398 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,33 +1,17 @@ package org.openforis.collect.earth.app.ad_hoc; import java.io.BufferedReader; -import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Set; - -import javax.swing.JFrame; import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.view.DataFormat; -import org.openforis.collect.earth.app.view.JFileChooserExistsAware; -import org.openforis.collect.manager.RecordManager; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.CollectRecordSummary; -import org.openforis.collect.model.RecordFilter; -import org.openforis.collect.persistence.RecordPersistenceException; -import org.openforis.idm.model.TextAttribute; -import org.openforis.idm.model.TextValue; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -37,144 +21,58 @@ import com.opencsv.CSVReader; import com.opencsv.exceptions.CsvValidationException; @Component -public final class FixMissingPlotsFileInfo { +public class FixMissingSaxaulStrataInfo { - @Autowired - private RecordManager recordManager; + String saxaulPlots= "SaxaulStrataPlots.csv"; //$NON-NLS-1$ + Logger logger = LoggerFactory.getLogger(FixMissingSaxaulStrataInfo.class); @Autowired private EarthSurveyService earthSurveyService; - @Autowired - private LocalPropertiesService localPropertiesService; - - private final Logger logger = LoggerFactory.getLogger(FixMissingPlotsFileInfo.class); - - private boolean stopFix = false; - - - - public void findMissingPlots(JFrame frame) { - final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, false, true, null, - localPropertiesService, frame); - - final Map> plotIdsByFile = getPlotIdsByFile(selectedPlotFiles); - - List plotIdsWithNoRegion = getPlotsNoRegion(); - - for (CollectRecord record : plotIdsWithNoRegion) { - String plotFile = getFileNameForId( plotIdsByFile, record ); - if( plotFile != null ){ - setPlotFile( record, plotFile ); - }else{ - logger.info("No plot file found for plot with ID : " + getPlotId(record) ); //$NON-NLS-1$ - try { - recordManager.delete( record.getId() ); - } catch (RecordPersistenceException e) { - logger.error("Not able to remove plot with ID " + record.getId(), e ) ; //$NON-NLS-1$ - } - } - } - } - - private String getPlotId(CollectRecord record) { - TextAttribute plot_id = (TextAttribute) record.getNodeByPath("/plot/id"); //$NON-NLS-1$ - return plot_id.getValue().getValue(); - } - - private List getAllRecords(){ - RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); - List records = recordManager.loadSummaries( rf ); - return records; - } - - private void setPlotFile(CollectRecord record, String plotFile) { - - TextValue textValue = new TextValue( plotFile ); - recordManager.addAttribute(record.getRootEntity(), "plot_file", textValue, null, null); //$NON-NLS-1$ - - recordManager.save( record ); - logger.info("Setting record to plot_file : " + plotFile ); //$NON-NLS-1$ - - } - - private String getFileNameForId(Map> plotIdsByFile, CollectRecord record) { - - Set fileNames = plotIdsByFile.keySet(); - String plotId = getPlotId(record); - for (String filename : fileNames) { - - List plotIds = plotIdsByFile.get(filename); - for (String plotIdInFile : plotIds) { - if( plotIdInFile.equals(plotId)){ - return filename; - } - } - } - return null; - } - - private List getPlotsNoRegion() { - List plotsWithNoRegionInfo = new ArrayList(); - List allRecords = getAllRecords(); - for (CollectRecordSummary summary : allRecords) { - CollectRecord record = recordManager.load( earthSurveyService.getCollectSurvey(), summary.getId(), Step.ENTRY); - TextAttribute plot_file = (TextAttribute) record.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ - if( plot_file ==null || plot_file.getValue() == null || plot_file.getValue().getValue() == null ){ - plotsWithNoRegionInfo.add( record ); - } - } - return plotsWithNoRegionInfo; - } - - private CSVReader getCsvReader(String csvFile) throws FileNotFoundException { + protected CSVReader getCsvReader(String csvFile) throws FileNotFoundException { CSVReader reader; final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 )); //$NON-NLS-1$ reader = new CSVReader(bufferedReader); return reader; } - private List getIdsInFile(String plotCoordinateFile) { - final List plotIds = new ArrayList(); + private List getAllSaxaulIds(){ + List saxaulIds = new ArrayList(); try { - final CSVReader plotCsvReader = getCsvReader(plotCoordinateFile); + CSVReader saxaulCsvReader = getCsvReader(saxaulPlots); String[] csvRow; - while ((csvRow = plotCsvReader.readNext()) != null) { - plotIds.add(csvRow[0]); + while ((csvRow = saxaulCsvReader.readNext()) != null ) { + saxaulIds.add( csvRow[0]); } - } catch (final FileNotFoundException e) { - logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ - } catch (final IOException e) { - logger.error("Error reading CSV line", e); //$NON-NLS-1$ + } catch (FileNotFoundException e) { + logger.error("Error reading Saxaul file", e ); //$NON-NLS-1$ + } catch (IOException e) { + logger.error("Error reading CSV line", e ); //$NON-NLS-1$ } catch (CsvValidationException e) { - logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ + logger.error("Error reading Saxaul file", e ); //$NON-NLS-1$ } - return plotIds; - } - - private Map> getPlotIdsByFile(File[] selectedPlotFiles) { - final Map> plotIdsByFile = new HashMap>(); + return saxaulIds; + } - for (final File file : selectedPlotFiles) { - if (shouldStopFixing()) { - break; + public void setSaxaulStrata(){ + List allSaxaulIds = getAllSaxaulIds(); + for (String plotId : allSaxaulIds) { + if( plotId.startsWith("sax") ){ //$NON-NLS-1$ + setPlotValue(plotId,"collect_text_strata","Pure Saxaul"); //$NON-NLS-1$ //$NON-NLS-2$ + }else{ + setPlotValue(plotId,"collect_text_strata","Saxaul & Systematic"); //$NON-NLS-1$ //$NON-NLS-2$ } - plotIdsByFile.put(file.getName(), getIdsInFile(file.getAbsolutePath())); } - - return plotIdsByFile; } - - - private boolean shouldStopFixing() { - return stopFix; - } - - public void stopFixing() { - stopFix = true; - + @SuppressWarnings("deprecation") + private void setPlotValue(String plotId, String collectParameterName, String value) { + Map plotInformation = earthSurveyService.getPlacemark( new String[]{plotId},true); + if( plotInformation.get( EarthConstants.PLACEMARK_FOUND_PARAMETER ).trim().equals("true") ){ //$NON-NLS-1$ + plotInformation.put(collectParameterName, value); + earthSurveyService.storePlacemarkOld(plotInformation); + } } } From 6e46579274e72e67b0a16f0a8759320109be208f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:38:59 +0100 Subject: [PATCH 0931/1620] New translations FixMissingSaxaulStrataInfo.java (Spanish) --- .../earth/app/view/Messages_es.properties | 162 ++++-------------- 1 file changed, 30 insertions(+), 132 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 315f96ec2c..00daac5398 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,33 +1,17 @@ package org.openforis.collect.earth.app.ad_hoc; import java.io.BufferedReader; -import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Set; - -import javax.swing.JFrame; import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.view.DataFormat; -import org.openforis.collect.earth.app.view.JFileChooserExistsAware; -import org.openforis.collect.manager.RecordManager; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.CollectRecordSummary; -import org.openforis.collect.model.RecordFilter; -import org.openforis.collect.persistence.RecordPersistenceException; -import org.openforis.idm.model.TextAttribute; -import org.openforis.idm.model.TextValue; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -37,144 +21,58 @@ import com.opencsv.CSVReader; import com.opencsv.exceptions.CsvValidationException; @Component -public final class FixMissingPlotsFileInfo { +public class FixMissingSaxaulStrataInfo { - @Autowired - private RecordManager recordManager; + String saxaulPlots= "SaxaulStrataPlots.csv"; //$NON-NLS-1$ + Logger logger = LoggerFactory.getLogger(FixMissingSaxaulStrataInfo.class); @Autowired private EarthSurveyService earthSurveyService; - @Autowired - private LocalPropertiesService localPropertiesService; - - private final Logger logger = LoggerFactory.getLogger(FixMissingPlotsFileInfo.class); - - private boolean stopFix = false; - - - - public void findMissingPlots(JFrame frame) { - final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, false, true, null, - localPropertiesService, frame); - - final Map> plotIdsByFile = getPlotIdsByFile(selectedPlotFiles); - - List plotIdsWithNoRegion = getPlotsNoRegion(); - - for (CollectRecord record : plotIdsWithNoRegion) { - String plotFile = getFileNameForId( plotIdsByFile, record ); - if( plotFile != null ){ - setPlotFile( record, plotFile ); - }else{ - logger.info("No plot file found for plot with ID : " + getPlotId(record) ); //$NON-NLS-1$ - try { - recordManager.delete( record.getId() ); - } catch (RecordPersistenceException e) { - logger.error("Not able to remove plot with ID " + record.getId(), e ) ; //$NON-NLS-1$ - } - } - } - } - - private String getPlotId(CollectRecord record) { - TextAttribute plot_id = (TextAttribute) record.getNodeByPath("/plot/id"); //$NON-NLS-1$ - return plot_id.getValue().getValue(); - } - - private List getAllRecords(){ - RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); - List records = recordManager.loadSummaries( rf ); - return records; - } - - private void setPlotFile(CollectRecord record, String plotFile) { - - TextValue textValue = new TextValue( plotFile ); - recordManager.addAttribute(record.getRootEntity(), "plot_file", textValue, null, null); //$NON-NLS-1$ - - recordManager.save( record ); - logger.info("Setting record to plot_file : " + plotFile ); //$NON-NLS-1$ - - } - - private String getFileNameForId(Map> plotIdsByFile, CollectRecord record) { - - Set fileNames = plotIdsByFile.keySet(); - String plotId = getPlotId(record); - for (String filename : fileNames) { - - List plotIds = plotIdsByFile.get(filename); - for (String plotIdInFile : plotIds) { - if( plotIdInFile.equals(plotId)){ - return filename; - } - } - } - return null; - } - - private List getPlotsNoRegion() { - List plotsWithNoRegionInfo = new ArrayList(); - List allRecords = getAllRecords(); - for (CollectRecordSummary summary : allRecords) { - CollectRecord record = recordManager.load( earthSurveyService.getCollectSurvey(), summary.getId(), Step.ENTRY); - TextAttribute plot_file = (TextAttribute) record.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ - if( plot_file ==null || plot_file.getValue() == null || plot_file.getValue().getValue() == null ){ - plotsWithNoRegionInfo.add( record ); - } - } - return plotsWithNoRegionInfo; - } - - private CSVReader getCsvReader(String csvFile) throws FileNotFoundException { + protected CSVReader getCsvReader(String csvFile) throws FileNotFoundException { CSVReader reader; final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 )); //$NON-NLS-1$ reader = new CSVReader(bufferedReader); return reader; } - private List getIdsInFile(String plotCoordinateFile) { - final List plotIds = new ArrayList(); + private List getAllSaxaulIds(){ + List saxaulIds = new ArrayList(); try { - final CSVReader plotCsvReader = getCsvReader(plotCoordinateFile); + CSVReader saxaulCsvReader = getCsvReader(saxaulPlots); String[] csvRow; - while ((csvRow = plotCsvReader.readNext()) != null) { - plotIds.add(csvRow[0]); + while ((csvRow = saxaulCsvReader.readNext()) != null ) { + saxaulIds.add( csvRow[0]); } - } catch (final FileNotFoundException e) { - logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ - } catch (final IOException e) { - logger.error("Error reading CSV line", e); //$NON-NLS-1$ + } catch (FileNotFoundException e) { + logger.error("Error reading Saxaul file", e ); //$NON-NLS-1$ + } catch (IOException e) { + logger.error("Error reading CSV line", e ); //$NON-NLS-1$ } catch (CsvValidationException e) { - logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ + logger.error("Error reading Saxaul file", e ); //$NON-NLS-1$ } - return plotIds; - } - - private Map> getPlotIdsByFile(File[] selectedPlotFiles) { - final Map> plotIdsByFile = new HashMap>(); + return saxaulIds; + } - for (final File file : selectedPlotFiles) { - if (shouldStopFixing()) { - break; + public void setSaxaulStrata(){ + List allSaxaulIds = getAllSaxaulIds(); + for (String plotId : allSaxaulIds) { + if( plotId.startsWith("sax") ){ //$NON-NLS-1$ + setPlotValue(plotId,"collect_text_strata","Pure Saxaul"); //$NON-NLS-1$ //$NON-NLS-2$ + }else{ + setPlotValue(plotId,"collect_text_strata","Saxaul & Systematic"); //$NON-NLS-1$ //$NON-NLS-2$ } - plotIdsByFile.put(file.getName(), getIdsInFile(file.getAbsolutePath())); } - - return plotIdsByFile; } - - - private boolean shouldStopFixing() { - return stopFix; - } - - public void stopFixing() { - stopFix = true; - + @SuppressWarnings("deprecation") + private void setPlotValue(String plotId, String collectParameterName, String value) { + Map plotInformation = earthSurveyService.getPlacemark( new String[]{plotId},true); + if( plotInformation.get( EarthConstants.PLACEMARK_FOUND_PARAMETER ).trim().equals("true") ){ //$NON-NLS-1$ + plotInformation.put(collectParameterName, value); + earthSurveyService.storePlacemarkOld(plotInformation); + } } } From 17d637bd403c7d943fc821380708f2d921c49ca3 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:00 +0100 Subject: [PATCH 0932/1620] New translations FixMissingSaxaulStrataInfo.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 162 ++++-------------- 1 file changed, 30 insertions(+), 132 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 315f96ec2c..00daac5398 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,33 +1,17 @@ package org.openforis.collect.earth.app.ad_hoc; import java.io.BufferedReader; -import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Set; - -import javax.swing.JFrame; import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.view.DataFormat; -import org.openforis.collect.earth.app.view.JFileChooserExistsAware; -import org.openforis.collect.manager.RecordManager; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.CollectRecordSummary; -import org.openforis.collect.model.RecordFilter; -import org.openforis.collect.persistence.RecordPersistenceException; -import org.openforis.idm.model.TextAttribute; -import org.openforis.idm.model.TextValue; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -37,144 +21,58 @@ import com.opencsv.CSVReader; import com.opencsv.exceptions.CsvValidationException; @Component -public final class FixMissingPlotsFileInfo { +public class FixMissingSaxaulStrataInfo { - @Autowired - private RecordManager recordManager; + String saxaulPlots= "SaxaulStrataPlots.csv"; //$NON-NLS-1$ + Logger logger = LoggerFactory.getLogger(FixMissingSaxaulStrataInfo.class); @Autowired private EarthSurveyService earthSurveyService; - @Autowired - private LocalPropertiesService localPropertiesService; - - private final Logger logger = LoggerFactory.getLogger(FixMissingPlotsFileInfo.class); - - private boolean stopFix = false; - - - - public void findMissingPlots(JFrame frame) { - final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, false, true, null, - localPropertiesService, frame); - - final Map> plotIdsByFile = getPlotIdsByFile(selectedPlotFiles); - - List plotIdsWithNoRegion = getPlotsNoRegion(); - - for (CollectRecord record : plotIdsWithNoRegion) { - String plotFile = getFileNameForId( plotIdsByFile, record ); - if( plotFile != null ){ - setPlotFile( record, plotFile ); - }else{ - logger.info("No plot file found for plot with ID : " + getPlotId(record) ); //$NON-NLS-1$ - try { - recordManager.delete( record.getId() ); - } catch (RecordPersistenceException e) { - logger.error("Not able to remove plot with ID " + record.getId(), e ) ; //$NON-NLS-1$ - } - } - } - } - - private String getPlotId(CollectRecord record) { - TextAttribute plot_id = (TextAttribute) record.getNodeByPath("/plot/id"); //$NON-NLS-1$ - return plot_id.getValue().getValue(); - } - - private List getAllRecords(){ - RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); - List records = recordManager.loadSummaries( rf ); - return records; - } - - private void setPlotFile(CollectRecord record, String plotFile) { - - TextValue textValue = new TextValue( plotFile ); - recordManager.addAttribute(record.getRootEntity(), "plot_file", textValue, null, null); //$NON-NLS-1$ - - recordManager.save( record ); - logger.info("Setting record to plot_file : " + plotFile ); //$NON-NLS-1$ - - } - - private String getFileNameForId(Map> plotIdsByFile, CollectRecord record) { - - Set fileNames = plotIdsByFile.keySet(); - String plotId = getPlotId(record); - for (String filename : fileNames) { - - List plotIds = plotIdsByFile.get(filename); - for (String plotIdInFile : plotIds) { - if( plotIdInFile.equals(plotId)){ - return filename; - } - } - } - return null; - } - - private List getPlotsNoRegion() { - List plotsWithNoRegionInfo = new ArrayList(); - List allRecords = getAllRecords(); - for (CollectRecordSummary summary : allRecords) { - CollectRecord record = recordManager.load( earthSurveyService.getCollectSurvey(), summary.getId(), Step.ENTRY); - TextAttribute plot_file = (TextAttribute) record.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ - if( plot_file ==null || plot_file.getValue() == null || plot_file.getValue().getValue() == null ){ - plotsWithNoRegionInfo.add( record ); - } - } - return plotsWithNoRegionInfo; - } - - private CSVReader getCsvReader(String csvFile) throws FileNotFoundException { + protected CSVReader getCsvReader(String csvFile) throws FileNotFoundException { CSVReader reader; final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 )); //$NON-NLS-1$ reader = new CSVReader(bufferedReader); return reader; } - private List getIdsInFile(String plotCoordinateFile) { - final List plotIds = new ArrayList(); + private List getAllSaxaulIds(){ + List saxaulIds = new ArrayList(); try { - final CSVReader plotCsvReader = getCsvReader(plotCoordinateFile); + CSVReader saxaulCsvReader = getCsvReader(saxaulPlots); String[] csvRow; - while ((csvRow = plotCsvReader.readNext()) != null) { - plotIds.add(csvRow[0]); + while ((csvRow = saxaulCsvReader.readNext()) != null ) { + saxaulIds.add( csvRow[0]); } - } catch (final FileNotFoundException e) { - logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ - } catch (final IOException e) { - logger.error("Error reading CSV line", e); //$NON-NLS-1$ + } catch (FileNotFoundException e) { + logger.error("Error reading Saxaul file", e ); //$NON-NLS-1$ + } catch (IOException e) { + logger.error("Error reading CSV line", e ); //$NON-NLS-1$ } catch (CsvValidationException e) { - logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ + logger.error("Error reading Saxaul file", e ); //$NON-NLS-1$ } - return plotIds; - } - - private Map> getPlotIdsByFile(File[] selectedPlotFiles) { - final Map> plotIdsByFile = new HashMap>(); + return saxaulIds; + } - for (final File file : selectedPlotFiles) { - if (shouldStopFixing()) { - break; + public void setSaxaulStrata(){ + List allSaxaulIds = getAllSaxaulIds(); + for (String plotId : allSaxaulIds) { + if( plotId.startsWith("sax") ){ //$NON-NLS-1$ + setPlotValue(plotId,"collect_text_strata","Pure Saxaul"); //$NON-NLS-1$ //$NON-NLS-2$ + }else{ + setPlotValue(plotId,"collect_text_strata","Saxaul & Systematic"); //$NON-NLS-1$ //$NON-NLS-2$ } - plotIdsByFile.put(file.getName(), getIdsInFile(file.getAbsolutePath())); } - - return plotIdsByFile; } - - - private boolean shouldStopFixing() { - return stopFix; - } - - public void stopFixing() { - stopFix = true; - + @SuppressWarnings("deprecation") + private void setPlotValue(String plotId, String collectParameterName, String value) { + Map plotInformation = earthSurveyService.getPlacemark( new String[]{plotId},true); + if( plotInformation.get( EarthConstants.PLACEMARK_FOUND_PARAMETER ).trim().equals("true") ){ //$NON-NLS-1$ + plotInformation.put(collectParameterName, value); + earthSurveyService.storePlacemarkOld(plotInformation); + } } } From 5ca8e81a871ed5b9eeacbadf802fa9f489753e9b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:01 +0100 Subject: [PATCH 0933/1620] New translations FixMissingSaxaulStrataInfo.java (English) --- .../earth/app/view/Messages_en.properties | 162 ++++-------------- 1 file changed, 30 insertions(+), 132 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 315f96ec2c..00daac5398 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,33 +1,17 @@ package org.openforis.collect.earth.app.ad_hoc; import java.io.BufferedReader; -import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Set; - -import javax.swing.JFrame; import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.view.DataFormat; -import org.openforis.collect.earth.app.view.JFileChooserExistsAware; -import org.openforis.collect.manager.RecordManager; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.CollectRecordSummary; -import org.openforis.collect.model.RecordFilter; -import org.openforis.collect.persistence.RecordPersistenceException; -import org.openforis.idm.model.TextAttribute; -import org.openforis.idm.model.TextValue; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -37,144 +21,58 @@ import com.opencsv.CSVReader; import com.opencsv.exceptions.CsvValidationException; @Component -public final class FixMissingPlotsFileInfo { +public class FixMissingSaxaulStrataInfo { - @Autowired - private RecordManager recordManager; + String saxaulPlots= "SaxaulStrataPlots.csv"; //$NON-NLS-1$ + Logger logger = LoggerFactory.getLogger(FixMissingSaxaulStrataInfo.class); @Autowired private EarthSurveyService earthSurveyService; - @Autowired - private LocalPropertiesService localPropertiesService; - - private final Logger logger = LoggerFactory.getLogger(FixMissingPlotsFileInfo.class); - - private boolean stopFix = false; - - - - public void findMissingPlots(JFrame frame) { - final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, false, true, null, - localPropertiesService, frame); - - final Map> plotIdsByFile = getPlotIdsByFile(selectedPlotFiles); - - List plotIdsWithNoRegion = getPlotsNoRegion(); - - for (CollectRecord record : plotIdsWithNoRegion) { - String plotFile = getFileNameForId( plotIdsByFile, record ); - if( plotFile != null ){ - setPlotFile( record, plotFile ); - }else{ - logger.info("No plot file found for plot with ID : " + getPlotId(record) ); //$NON-NLS-1$ - try { - recordManager.delete( record.getId() ); - } catch (RecordPersistenceException e) { - logger.error("Not able to remove plot with ID " + record.getId(), e ) ; //$NON-NLS-1$ - } - } - } - } - - private String getPlotId(CollectRecord record) { - TextAttribute plot_id = (TextAttribute) record.getNodeByPath("/plot/id"); //$NON-NLS-1$ - return plot_id.getValue().getValue(); - } - - private List getAllRecords(){ - RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); - List records = recordManager.loadSummaries( rf ); - return records; - } - - private void setPlotFile(CollectRecord record, String plotFile) { - - TextValue textValue = new TextValue( plotFile ); - recordManager.addAttribute(record.getRootEntity(), "plot_file", textValue, null, null); //$NON-NLS-1$ - - recordManager.save( record ); - logger.info("Setting record to plot_file : " + plotFile ); //$NON-NLS-1$ - - } - - private String getFileNameForId(Map> plotIdsByFile, CollectRecord record) { - - Set fileNames = plotIdsByFile.keySet(); - String plotId = getPlotId(record); - for (String filename : fileNames) { - - List plotIds = plotIdsByFile.get(filename); - for (String plotIdInFile : plotIds) { - if( plotIdInFile.equals(plotId)){ - return filename; - } - } - } - return null; - } - - private List getPlotsNoRegion() { - List plotsWithNoRegionInfo = new ArrayList(); - List allRecords = getAllRecords(); - for (CollectRecordSummary summary : allRecords) { - CollectRecord record = recordManager.load( earthSurveyService.getCollectSurvey(), summary.getId(), Step.ENTRY); - TextAttribute plot_file = (TextAttribute) record.getNodeByPath("/plot/plot_file"); //$NON-NLS-1$ - if( plot_file ==null || plot_file.getValue() == null || plot_file.getValue().getValue() == null ){ - plotsWithNoRegionInfo.add( record ); - } - } - return plotsWithNoRegionInfo; - } - - private CSVReader getCsvReader(String csvFile) throws FileNotFoundException { + protected CSVReader getCsvReader(String csvFile) throws FileNotFoundException { CSVReader reader; final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 )); //$NON-NLS-1$ reader = new CSVReader(bufferedReader); return reader; } - private List getIdsInFile(String plotCoordinateFile) { - final List plotIds = new ArrayList(); + private List getAllSaxaulIds(){ + List saxaulIds = new ArrayList(); try { - final CSVReader plotCsvReader = getCsvReader(plotCoordinateFile); + CSVReader saxaulCsvReader = getCsvReader(saxaulPlots); String[] csvRow; - while ((csvRow = plotCsvReader.readNext()) != null) { - plotIds.add(csvRow[0]); + while ((csvRow = saxaulCsvReader.readNext()) != null ) { + saxaulIds.add( csvRow[0]); } - } catch (final FileNotFoundException e) { - logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ - } catch (final IOException e) { - logger.error("Error reading CSV line", e); //$NON-NLS-1$ + } catch (FileNotFoundException e) { + logger.error("Error reading Saxaul file", e ); //$NON-NLS-1$ + } catch (IOException e) { + logger.error("Error reading CSV line", e ); //$NON-NLS-1$ } catch (CsvValidationException e) { - logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ + logger.error("Error reading Saxaul file", e ); //$NON-NLS-1$ } - return plotIds; - } - - private Map> getPlotIdsByFile(File[] selectedPlotFiles) { - final Map> plotIdsByFile = new HashMap>(); + return saxaulIds; + } - for (final File file : selectedPlotFiles) { - if (shouldStopFixing()) { - break; + public void setSaxaulStrata(){ + List allSaxaulIds = getAllSaxaulIds(); + for (String plotId : allSaxaulIds) { + if( plotId.startsWith("sax") ){ //$NON-NLS-1$ + setPlotValue(plotId,"collect_text_strata","Pure Saxaul"); //$NON-NLS-1$ //$NON-NLS-2$ + }else{ + setPlotValue(plotId,"collect_text_strata","Saxaul & Systematic"); //$NON-NLS-1$ //$NON-NLS-2$ } - plotIdsByFile.put(file.getName(), getIdsInFile(file.getAbsolutePath())); } - - return plotIdsByFile; } - - - private boolean shouldStopFixing() { - return stopFix; - } - - public void stopFixing() { - stopFix = true; - + @SuppressWarnings("deprecation") + private void setPlotValue(String plotId, String collectParameterName, String value) { + Map plotInformation = earthSurveyService.getPlacemark( new String[]{plotId},true); + if( plotInformation.get( EarthConstants.PLACEMARK_FOUND_PARAMETER ).trim().equals("true") ){ //$NON-NLS-1$ + plotInformation.put(collectParameterName, value); + earthSurveyService.storePlacemarkOld(plotInformation); + } } } From 9960383688e1d14d971d2f58af07338ade1b693f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:02 +0100 Subject: [PATCH 0934/1620] New translations FixOtherLand.java (French) --- .../earth/app/view/Messages_fr.properties | 104 +++++++++--------- 1 file changed, 53 insertions(+), 51 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 00daac5398..6e034a1981 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,78 +1,80 @@ package org.openforis.collect.earth.app.ad_hoc; -import java.io.BufferedReader; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; import java.util.List; -import java.util.Map; import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.manager.RecordManager; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.CollectRecordSummary; +import org.openforis.collect.model.RecordFilter; +import org.openforis.idm.model.Coordinate; +import org.openforis.idm.model.CoordinateAttribute; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.opencsv.CSVReader; -import com.opencsv.exceptions.CsvValidationException; - @Component -public class FixMissingSaxaulStrataInfo { +public abstract class FixOtherLand { - String saxaulPlots= "SaxaulStrataPlots.csv"; //$NON-NLS-1$ - Logger logger = LoggerFactory.getLogger(FixMissingSaxaulStrataInfo.class); + @Autowired + private RecordManager recordManager; @Autowired private EarthSurveyService earthSurveyService; - protected CSVReader getCsvReader(String csvFile) throws FileNotFoundException { - CSVReader reader; - final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 )); //$NON-NLS-1$ - reader = new CSVReader(bufferedReader); - return reader; + private Logger logger = LoggerFactory.getLogger( FixOtherLand.class); + + private boolean stopFix = false; + + private List getAllRecords(){ + RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); + List records = recordManager.loadSummaries( rf ); + return records; } - private List getAllSaxaulIds(){ - List saxaulIds = new ArrayList(); - try { - CSVReader saxaulCsvReader = getCsvReader(saxaulPlots); - String[] csvRow; - while ((csvRow = saxaulCsvReader.readNext()) != null ) { - saxaulIds.add( csvRow[0]); - } - } catch (FileNotFoundException e) { - logger.error("Error reading Saxaul file", e ); //$NON-NLS-1$ - } catch (IOException e) { - logger.error("Error reading CSV line", e ); //$NON-NLS-1$ - } catch (CsvValidationException e) { - logger.error("Error reading Saxaul file", e ); //$NON-NLS-1$ + public void fixCoordinates(){ + List allRecords = getAllRecords(); + + if( shouldStopFixing()){ + return; } + + for (CollectRecordSummary summaryCollectRecord : allRecords) { + if( shouldStopFixing()){ + break; + } + try { + CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); + CoordinateAttribute plotCoord = (CoordinateAttribute) collectRecord.getNodeByPath("/plot/location"); //$NON-NLS-1$ + if( plotCoord != null && plotCoord.getValue() != null ){ + if( plotCoord.getValue().getX() < getLongitudeLimit() ){ + Coordinate coordinate = new Coordinate(plotCoord.getValue().getY(), plotCoord.getValue().getX(), plotCoord.getValue().getSrsId() ); + plotCoord.setValue( coordinate ); + recordManager.save( collectRecord ); + + } - return saxaulIds; - } - - public void setSaxaulStrata(){ - List allSaxaulIds = getAllSaxaulIds(); - for (String plotId : allSaxaulIds) { - if( plotId.startsWith("sax") ){ //$NON-NLS-1$ - setPlotValue(plotId,"collect_text_strata","Pure Saxaul"); //$NON-NLS-1$ //$NON-NLS-2$ - }else{ - setPlotValue(plotId,"collect_text_strata","Saxaul & Systematic"); //$NON-NLS-1$ //$NON-NLS-2$ + } + } catch (Exception e) { + logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ } } + } - @SuppressWarnings("deprecation") - private void setPlotValue(String plotId, String collectParameterName, String value) { - Map plotInformation = earthSurveyService.getPlacemark( new String[]{plotId},true); - if( plotInformation.get( EarthConstants.PLACEMARK_FOUND_PARAMETER ).trim().equals("true") ){ //$NON-NLS-1$ - plotInformation.put(collectParameterName, value); - earthSurveyService.storePlacemarkOld(plotInformation); - } + protected abstract int getLongitudeLimit(); + + private boolean shouldStopFixing() { + return stopFix; } -} + + public void stopFixing() { + stopFix = true; + + } + +} \ No newline at end of file From b0e64f28191da8dff47aab9412f2c95562d71c9f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:06 +0100 Subject: [PATCH 0935/1620] New translations FixCoordinates.java (English) --- .../earth/app/view/Messages_en.properties | 98 +++++++++---------- 1 file changed, 47 insertions(+), 51 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 00daac5398..499b7cb5ec 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,78 +1,74 @@ package org.openforis.collect.earth.app.ad_hoc; -import java.io.BufferedReader; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; import java.util.List; -import java.util.Map; import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.manager.RecordManager; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.CollectRecordSummary; +import org.openforis.collect.model.RecordFilter; +import org.openforis.idm.model.Coordinate; +import org.openforis.idm.model.CoordinateAttribute; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.opencsv.CSVReader; -import com.opencsv.exceptions.CsvValidationException; - @Component -public class FixMissingSaxaulStrataInfo { +public abstract class FixCoordinates { - String saxaulPlots= "SaxaulStrataPlots.csv"; //$NON-NLS-1$ - Logger logger = LoggerFactory.getLogger(FixMissingSaxaulStrataInfo.class); + @Autowired + private RecordManager recordManager; @Autowired private EarthSurveyService earthSurveyService; - protected CSVReader getCsvReader(String csvFile) throws FileNotFoundException { - CSVReader reader; - final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 )); //$NON-NLS-1$ - reader = new CSVReader(bufferedReader); - return reader; + private Logger logger = LoggerFactory.getLogger( FixCoordinates.class); + + private boolean stopFix = false; + + private List getAllRecords(){ + RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); + return recordManager.loadSummaries( rf ); } - private List getAllSaxaulIds(){ - List saxaulIds = new ArrayList(); - try { - CSVReader saxaulCsvReader = getCsvReader(saxaulPlots); - String[] csvRow; - while ((csvRow = saxaulCsvReader.readNext()) != null ) { - saxaulIds.add( csvRow[0]); + public void fixCoordinates(){ + List allRecords = getAllRecords(); + + if( shouldStopFixing()){ + return; + } + + for (CollectRecordSummary summaryCollectRecord : allRecords) { + if( shouldStopFixing()){ + break; + } + try { + CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); + CoordinateAttribute plotCoord = (CoordinateAttribute) collectRecord.getNodeByPath("/plot/location"); //$NON-NLS-1$ + if( plotCoord != null && plotCoord.getValue() != null && plotCoord.getValue().getX() < getLongitudeLimit() ){ + Coordinate coordinate = new Coordinate(plotCoord.getValue().getY(), plotCoord.getValue().getX(), plotCoord.getValue().getSrsId() ); + plotCoord.setValue( coordinate ); + recordManager.save( collectRecord ); + } + } catch (Exception e) { + logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ } - } catch (FileNotFoundException e) { - logger.error("Error reading Saxaul file", e ); //$NON-NLS-1$ - } catch (IOException e) { - logger.error("Error reading CSV line", e ); //$NON-NLS-1$ - } catch (CsvValidationException e) { - logger.error("Error reading Saxaul file", e ); //$NON-NLS-1$ } - - return saxaulIds; } - public void setSaxaulStrata(){ - List allSaxaulIds = getAllSaxaulIds(); - for (String plotId : allSaxaulIds) { - if( plotId.startsWith("sax") ){ //$NON-NLS-1$ - setPlotValue(plotId,"collect_text_strata","Pure Saxaul"); //$NON-NLS-1$ //$NON-NLS-2$ - }else{ - setPlotValue(plotId,"collect_text_strata","Saxaul & Systematic"); //$NON-NLS-1$ //$NON-NLS-2$ - } - } + protected abstract int getLongitudeLimit(); + + private boolean shouldStopFixing() { + return stopFix; } - @SuppressWarnings("deprecation") - private void setPlotValue(String plotId, String collectParameterName, String value) { - Map plotInformation = earthSurveyService.getPlacemark( new String[]{plotId},true); - if( plotInformation.get( EarthConstants.PLACEMARK_FOUND_PARAMETER ).trim().equals("true") ){ //$NON-NLS-1$ - plotInformation.put(collectParameterName, value); - earthSurveyService.storePlacemarkOld(plotInformation); - } + public void stopFixing() { + stopFix = true; + } -} + +} \ No newline at end of file From 29146d0ef5b406b811935231cc56e86541e83f8c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:08 +0100 Subject: [PATCH 0936/1620] New translations FixCoordinates.java (Spanish) --- .../earth/app/view/Messages_es.properties | 98 +++++++++---------- 1 file changed, 47 insertions(+), 51 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 00daac5398..499b7cb5ec 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,78 +1,74 @@ package org.openforis.collect.earth.app.ad_hoc; -import java.io.BufferedReader; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; import java.util.List; -import java.util.Map; import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.manager.RecordManager; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.CollectRecordSummary; +import org.openforis.collect.model.RecordFilter; +import org.openforis.idm.model.Coordinate; +import org.openforis.idm.model.CoordinateAttribute; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.opencsv.CSVReader; -import com.opencsv.exceptions.CsvValidationException; - @Component -public class FixMissingSaxaulStrataInfo { +public abstract class FixCoordinates { - String saxaulPlots= "SaxaulStrataPlots.csv"; //$NON-NLS-1$ - Logger logger = LoggerFactory.getLogger(FixMissingSaxaulStrataInfo.class); + @Autowired + private RecordManager recordManager; @Autowired private EarthSurveyService earthSurveyService; - protected CSVReader getCsvReader(String csvFile) throws FileNotFoundException { - CSVReader reader; - final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 )); //$NON-NLS-1$ - reader = new CSVReader(bufferedReader); - return reader; + private Logger logger = LoggerFactory.getLogger( FixCoordinates.class); + + private boolean stopFix = false; + + private List getAllRecords(){ + RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); + return recordManager.loadSummaries( rf ); } - private List getAllSaxaulIds(){ - List saxaulIds = new ArrayList(); - try { - CSVReader saxaulCsvReader = getCsvReader(saxaulPlots); - String[] csvRow; - while ((csvRow = saxaulCsvReader.readNext()) != null ) { - saxaulIds.add( csvRow[0]); + public void fixCoordinates(){ + List allRecords = getAllRecords(); + + if( shouldStopFixing()){ + return; + } + + for (CollectRecordSummary summaryCollectRecord : allRecords) { + if( shouldStopFixing()){ + break; + } + try { + CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); + CoordinateAttribute plotCoord = (CoordinateAttribute) collectRecord.getNodeByPath("/plot/location"); //$NON-NLS-1$ + if( plotCoord != null && plotCoord.getValue() != null && plotCoord.getValue().getX() < getLongitudeLimit() ){ + Coordinate coordinate = new Coordinate(plotCoord.getValue().getY(), plotCoord.getValue().getX(), plotCoord.getValue().getSrsId() ); + plotCoord.setValue( coordinate ); + recordManager.save( collectRecord ); + } + } catch (Exception e) { + logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ } - } catch (FileNotFoundException e) { - logger.error("Error reading Saxaul file", e ); //$NON-NLS-1$ - } catch (IOException e) { - logger.error("Error reading CSV line", e ); //$NON-NLS-1$ - } catch (CsvValidationException e) { - logger.error("Error reading Saxaul file", e ); //$NON-NLS-1$ } - - return saxaulIds; } - public void setSaxaulStrata(){ - List allSaxaulIds = getAllSaxaulIds(); - for (String plotId : allSaxaulIds) { - if( plotId.startsWith("sax") ){ //$NON-NLS-1$ - setPlotValue(plotId,"collect_text_strata","Pure Saxaul"); //$NON-NLS-1$ //$NON-NLS-2$ - }else{ - setPlotValue(plotId,"collect_text_strata","Saxaul & Systematic"); //$NON-NLS-1$ //$NON-NLS-2$ - } - } + protected abstract int getLongitudeLimit(); + + private boolean shouldStopFixing() { + return stopFix; } - @SuppressWarnings("deprecation") - private void setPlotValue(String plotId, String collectParameterName, String value) { - Map plotInformation = earthSurveyService.getPlacemark( new String[]{plotId},true); - if( plotInformation.get( EarthConstants.PLACEMARK_FOUND_PARAMETER ).trim().equals("true") ){ //$NON-NLS-1$ - plotInformation.put(collectParameterName, value); - earthSurveyService.storePlacemarkOld(plotInformation); - } + public void stopFixing() { + stopFix = true; + } -} + +} \ No newline at end of file From cfaea231230f635edc93bddd9efca73b1c6c2279 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:09 +0100 Subject: [PATCH 0937/1620] New translations list_filled.png (Spanish) --- .../earth/app/view/Messages_es.properties | Bin 2323 -> 682 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 499b7cb5ec09770b777469ca5e4920683ce4c3c5..4524177685d013019b7d6ff8c0b6a8a4b7d6f486 100644 GIT binary patch literal 682 zcmV;b0#*HqP)djvRmvxnun58#g3e;_h37eVuR)H~l@~P}Eu>A$|#Rn;pz(^w~ zP0$FY4@PCCmqf@6U1oDbb5}PvHg&g$FhoY_dHitB`JB)BFgOajArppl@RXMY%KLcA z-D8g+mIy;eugOl?EEZsS%a4z1Q!+WMo-(xklDS5vgY-uRS7~;Mz0#!M zXJQHE*_8-HgP8d>>!XCa|D4bT1q2EhsAz+_C(h_GN`xUESJ_R3lNxdjc@Q}xp3S`g zOW4-QCRHQog2y5iO*>B3_2i@-n?^T0`-<~4S)5X?n1d~ZQJirK?^h-e-HCQiHmPF( zz=A>h?XngaI02XCTJ+BKx6eNOB8i;gaejK9>#C&zft_VoGD_f&tY9jr`Y1!)drJry zz{rbOORQpZH-tOq+h8xOa#2D@ThFy%ha@2KA~?ch=-V(Tq0R3aC$+yR(FiG&&@S4| zR>buf;(83WLK})D85O3p*uXkY7>eNajbTCax!+!y=-Xd1#SmWmYXkD;_NHPpTMI=&$sFP`xHcwj)Y)K@|vPu$l}alh1;I zi0J+N6x+#!!}sJzAf*8S#9t-`Vvd+RADUOJ<{D%PnaC4N@Gg#FL0fct9pilm#VK*- z`RN|#n>u}PyeTB-tkeJEGpU9b1}pCiRJbcpUZaFIkJNkBR6GFq4J)tFe*XqI Q5dZ)H07*qoM6N<$g1HzuTmS$7 literal 2323 zcmb7GTWi}e6n=Jo#aSrDfmC6zr?nf+N(zNE9ZebQQ&DU=Q7cBO*6IR5hKohTBs#kP5sf45GlfaqNDY@R5ZvRA2I$c)iUlf+vRnq|^Z!(~Q>g^{mZ zvA7+6%UvUGCe12m*esM~#xkqK%le^{7c;>lpfhb0W`Rght>K!#UCD|K4ey;!a9L;U z1ej%sG(k%;pxOf3@3JdTa3i#(*d~W35rpFset>^2xg&FC{6V-?GjTwA2)3?vCZ#|+ zK^vJPK#Y}8p|RPGiJjDomaI#){RGT36v89cVeh>Y1e@vtm0-Y(y_TeS&4s(zY{_K? zk2&l?9~>?9(3AVSyN9RIxm`9^{7en1?5=?0jH-;ZX5Lv6$L{PR`-VttnFX4yReEF%WTd~5wkH* zxxrK4c}&_sK>!u1ax|K|u&!&P1pD*R5_sqm(;vQ^DsAa^`nTwVCW@|5ZkAN`#?IBo zi;rl!WMP~8Dx_6&um+?&T0l5@i&$=VF|bmkfnQRDDJ50d9oa8CdN>-;K-b+qdhF?! z4Q~h64X=_0|6Z`T*~~mM` GpY=aui6tHY From 3f9983c5fea809f8da0270203f2d6127be59154d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:10 +0100 Subject: [PATCH 0938/1620] New translations smallOpenForisBanner.png (French) --- .../earth/app/view/Messages_fr.properties | Bin 2391 -> 2784 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 6e034a198170858c87a0c4e52769262a63bc4098..800ed67a3ee630d85c4bd4b6e56a4af593a6ba00 100644 GIT binary patch literal 2784 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 Date: Tue, 29 Nov 2022 15:39:11 +0100 Subject: [PATCH 0939/1620] New translations list_filled.png (Portuguese) --- .../earth/app/view/Messages_pt.properties | Bin 2702 -> 682 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 00daac539850c4ae587298b3cfe98c4a14ddd20b..4524177685d013019b7d6ff8c0b6a8a4b7d6f486 100644 GIT binary patch literal 682 zcmV;b0#*HqP)djvRmvxnun58#g3e;_h37eVuR)H~l@~P}Eu>A$|#Rn;pz(^w~ zP0$FY4@PCCmqf@6U1oDbb5}PvHg&g$FhoY_dHitB`JB)BFgOajArppl@RXMY%KLcA z-D8g+mIy;eugOl?EEZsS%a4z1Q!+WMo-(xklDS5vgY-uRS7~;Mz0#!M zXJQHE*_8-HgP8d>>!XCa|D4bT1q2EhsAz+_C(h_GN`xUESJ_R3lNxdjc@Q}xp3S`g zOW4-QCRHQog2y5iO*>B3_2i@-n?^T0`-<~4S)5X?n1d~ZQJirK?^h-e-HCQiHmPF( zz=A>h?XngaI02XCTJ+BKx6eNOB8i;gaejK9>#C&zft_VoGD_f&tY9jr`Y1!)drJry zz{rbOORQpZH-tOq+h8xOa#2D@ThFy%ha@2KA~?ch=-V(Tq0R3aC$+yR(FiG&&@S4| zR>buf;(83WLK})D85O3p*uXkY7>eNajbTCax!+!y=-Xd1#SmWmYXkD;_NHPpTMI=&$sFP`xHcwj)Y)K@|vPu$l}alh1;I zi0J+N6x+#!!}sJzAf*8S#9t-`Vvd+RADUOJ<{D%PnaC4N@Gg#FL0fct9pilm#VK*- z`RN|#n>u}PyeTB-tkeJEGpU9b1}pCiRJbcpUZaFIkJNkBR6GFq4J)tFe*XqI Q5dZ)H07*qoM6N<$g1HzuTmS$7 literal 2702 zcmb7GU2ozz6n##9#hqxhN+ia!yV{4d6aQB&WlpVS~9xsv`>T{i84=zj|nSuCi1ge($M9I9beCYE73F#^4kVr#(R z?5yn&7tcHT!G5(J?RkqVryNc@9qvyWA5qBJwsj{oM~&{Uax$l_xey)_>_NLp$=5HV z`JWI)XEb;&!zy&0czBu_g6!ct2!8Swg?I~|Nu6-EY=lN(Mk zXshDZ6XW0`v=O!3Sv(tnx|cOK`2K_{XSTAl9x936-T{I$6I)Yw)YJ?b!u;0=;eat@Kp#H&-sX`Y6a+uL97T(~{@-$O!mvI3NDmq1WJ1`p3EpD-zf z41=NhvDli9ifu>10v!ZBV9>!^9i=hX;WfUIW8hi-vSS3fV_Li_#%uETQ9cJv)u19j zR#t8ZZA6v=E*9hXD7H`q*mWE zy$ShMQ$E z Date: Tue, 29 Nov 2022 15:39:12 +0100 Subject: [PATCH 0940/1620] New translations list_filled.png (English) --- .../earth/app/view/Messages_en.properties | Bin 2323 -> 682 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 499b7cb5ec09770b777469ca5e4920683ce4c3c5..4524177685d013019b7d6ff8c0b6a8a4b7d6f486 100644 GIT binary patch literal 682 zcmV;b0#*HqP)djvRmvxnun58#g3e;_h37eVuR)H~l@~P}Eu>A$|#Rn;pz(^w~ zP0$FY4@PCCmqf@6U1oDbb5}PvHg&g$FhoY_dHitB`JB)BFgOajArppl@RXMY%KLcA z-D8g+mIy;eugOl?EEZsS%a4z1Q!+WMo-(xklDS5vgY-uRS7~;Mz0#!M zXJQHE*_8-HgP8d>>!XCa|D4bT1q2EhsAz+_C(h_GN`xUESJ_R3lNxdjc@Q}xp3S`g zOW4-QCRHQog2y5iO*>B3_2i@-n?^T0`-<~4S)5X?n1d~ZQJirK?^h-e-HCQiHmPF( zz=A>h?XngaI02XCTJ+BKx6eNOB8i;gaejK9>#C&zft_VoGD_f&tY9jr`Y1!)drJry zz{rbOORQpZH-tOq+h8xOa#2D@ThFy%ha@2KA~?ch=-V(Tq0R3aC$+yR(FiG&&@S4| zR>buf;(83WLK})D85O3p*uXkY7>eNajbTCax!+!y=-Xd1#SmWmYXkD;_NHPpTMI=&$sFP`xHcwj)Y)K@|vPu$l}alh1;I zi0J+N6x+#!!}sJzAf*8S#9t-`Vvd+RADUOJ<{D%PnaC4N@Gg#FL0fct9pilm#VK*- z`RN|#n>u}PyeTB-tkeJEGpU9b1}pCiRJbcpUZaFIkJNkBR6GFq4J)tFe*XqI Q5dZ)H07*qoM6N<$g1HzuTmS$7 literal 2323 zcmb7GTWi}e6n=Jo#aSrDfmC6zr?nf+N(zNE9ZebQQ&DU=Q7cBO*6IR5hKohTBs#kP5sf45GlfaqNDY@R5ZvRA2I$c)iUlf+vRnq|^Z!(~Q>g^{mZ zvA7+6%UvUGCe12m*esM~#xkqK%le^{7c;>lpfhb0W`Rght>K!#UCD|K4ey;!a9L;U z1ej%sG(k%;pxOf3@3JdTa3i#(*d~W35rpFset>^2xg&FC{6V-?GjTwA2)3?vCZ#|+ zK^vJPK#Y}8p|RPGiJjDomaI#){RGT36v89cVeh>Y1e@vtm0-Y(y_TeS&4s(zY{_K? zk2&l?9~>?9(3AVSyN9RIxm`9^{7en1?5=?0jH-;ZX5Lv6$L{PR`-VttnFX4yReEF%WTd~5wkH* zxxrK4c}&_sK>!u1ax|K|u&!&P1pD*R5_sqm(;vQ^DsAa^`nTwVCW@|5ZkAN`#?IBo zi;rl!WMP~8Dx_6&um+?&T0l5@i&$=VF|bmkfnQRDDJ50d9oa8CdN>-;K-b+qdhF?! z4Q~h64X=_0|6Z`T*~~mM` GpY=aui6tHY From a8b1bb81cf252e8a141cbcbbf08d59dee1a719f2 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:13 +0100 Subject: [PATCH 0941/1620] New translations list_not_finished.png (French) --- .../earth/app/view/Messages_fr.properties | Bin 2784 -> 3498 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 800ed67a3ee630d85c4bd4b6e56a4af593a6ba00..d7449eea8d9f158b954aeeccf8f1a9c2c209fd29 100644 GIT binary patch delta 3490 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 QZU6uP07*qoM6N<$f;`rgo&W#< delta 2767 zcmV;=3NZDm8{icoiBL{Q4GJ0x0000DNk~Le0000W0000W2nGNE0CReJ^pj=^Fn`_% z6$%sy>9WzZ000VYNkl}|(A|+lnarv>b$>qWRco*Rf33Y9!e1y~+IoeAk;9F%Ze>QUfu_t{ z6_Jy4y8G8ly?z|WNdQ87zC#N=owVmWKGd#!*uko8OZd*h&8*tC1jTc{yYQK4>}<=< znG@SvmtE{R*>hF3Sv3SPeXdEro`_H0F}Z0;KR}_U(`nClM5h8Ke~xr1-+#Si6RWl@ zL2%_i7jD#l*nZXIl3%^RNNVX#A6tImc`fJ85);Rf1gasSt>6c})apkF!a=NtuZWm$ z3(j+AP1hp^0}*I^=F^aRogCKqH2C-HE#ZH z_CH3mCeCrJT0{i-pvWnx=%`UaHKKQTTU7NAIwI~muq!~yz)38eWNBsBHD>jqr|rt; zmOiNJtx%2Yzb^QWv?N1aK{wy>bh1|FWO-5>bmxyRNWP!jYs#+zt3q&wvMB!_#sD*k5Kj_{4k_B zlc2RBNnf$b(ZMp^eIqocW8@oCq~b21WRf2d)jIv9-=1qEwhivsq4d^J%LnE*0P-T}0=9j?bfVSs5Q~*{ydy^4pwU|9Y=w&}X>3sLD z^KTmqE&C1+l1;?OrDF69S2$}@!#Kr<2Ff&N<0NA)M+VDS3xA$#7##6Qc!u`Y9AL2; zab#eFjjS)Ai`(-Zzbf=}Vs6=dtNd{BV>XDAcSJVZ6xy_V-8omIdLp3;y(K0$rHOln zp|XF{UsD<^zz=rD$tT)0~NOT2qR_iqCo&oy zn{JEwHuf*|$bZur6J|(0-2w=MBR_ z&7Bv_=HjW-ag9SR6=T}O90Mhvky=0|;gU(rV9&BW^{MMx;}Sz-KzN?#c-%p)Shw)RV5X3Ie&6| zgh@?lQZZ%Dv{_h%?&BHCzRQsjmmsptY;I)HnNxYO`w+!?z_On|O2UnC-OP)KyDpJc zj*s{xJokMJ*zkottG-$HcZ#{>@%sfe4}*iXhG*Z|i-_R42G4N_BFoT-kLPBXHt|!O z(L6vZ77~OGEwLD{96ZKv-aSGs2!E;8L(~din}01sBXxo(qT&ZMW#XgIm2wcuS9jFE zwfwWxmTexyM3G_Z7w+6)t-O(or})MGx2c68RxQ)>ISM@``b#x}(2_}>LvwB^2~RL? zkzT(}C`u%j-b$I~WQzMQyN>C(JcH#LlNwVv#^5<-EcSM9e=&IOo&NQzDu3($qf1@H zQ2?vvD}vc_c%*E19y@C0ojwJCvrlhi|B)f~96HXFmMrP`BpR|;vwY4mO3@&Zt&vL@ zK66H%h0~@HS><4ViM9!8Dt?GDf)N>S%U^$C_gi~^{l?pEfeJ6*ccL9Hc=Ta0M8>Ll z37k(kV)(@kpC{pY7@*<@?0@MVB9rh)C0t6CIuo*Snlp)$vfHY1u&>0_mMndx8jYzK z@zLijBK-67uk(!;-dxDNpMM_U%Mcesk@8c>L=Qt?C5Nf*}`PHRfzI^)Q7dw-#q&pq?QmuD?X^H*7ar~mS zCq}cmo$Ic@u=B^&S$_{brdK@qb6XfHs;a8BR;`{|#^!TX)p9+w-+y(#o$#$qZ~l1S z(M0mTp9;X)4{Z7Ksd(PnM|o-a-!ixJF<$PtiSyU2KM%~-NSUZA(Umi%J71oA9@&_8 zQp~NMXb}RKKTgEDaqnUKZ!hh04ww8VCg&12ALuVtrZgtC8h=E*bI0OSuV!=Ct^r~u>8V$<3p*d@m5whkXU$JQMRwkDz0Urxr`iPf z2CJ-$BAFVEj(_QnaS#lVLSUgDDHhoQ^6l1i{MWDD{F&m+2fAe6?Thpy4{Txo?U()K z%juklpJ3-L*Yoj*o&v$_y7f8>@UaJf)-GZe7%}H4CMzmfksgEDl}#kJzqo8c8DQG| zTO5T*fIr-M+5dk#{!^L#&`-r8poVI>rU&l1{-pE7Hzb~xmQ Date: Tue, 29 Nov 2022 15:39:14 +0100 Subject: [PATCH 0942/1620] New translations list_not_finished.png (Spanish) --- .../earth/app/view/Messages_es.properties | Bin 682 -> 3498 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 4524177685d013019b7d6ff8c0b6a8a4b7d6f486..d7449eea8d9f158b954aeeccf8f1a9c2c209fd29 100644 GIT binary patch literal 3498 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 literal 682 zcmV;b0#*HqP)djvRmvxnun58#g3e;_h37eVuR)H~l@~P}Eu>A$|#Rn;pz(^w~ zP0$FY4@PCCmqf@6U1oDbb5}PvHg&g$FhoY_dHitB`JB)BFgOajArppl@RXMY%KLcA z-D8g+mIy;eugOl?EEZsS%a4z1Q!+WMo-(xklDS5vgY-uRS7~;Mz0#!M zXJQHE*_8-HgP8d>>!XCa|D4bT1q2EhsAz+_C(h_GN`xUESJ_R3lNxdjc@Q}xp3S`g zOW4-QCRHQog2y5iO*>B3_2i@-n?^T0`-<~4S)5X?n1d~ZQJirK?^h-e-HCQiHmPF( zz=A>h?XngaI02XCTJ+BKx6eNOB8i;gaejK9>#C&zft_VoGD_f&tY9jr`Y1!)drJry zz{rbOORQpZH-tOq+h8xOa#2D@ThFy%ha@2KA~?ch=-V(Tq0R3aC$+yR(FiG&&@S4| zR>buf;(83WLK})D85O3p*uXkY7>eNajbTCax!+!y=-Xd1#SmWmYXkD;_NHPpTMI=&$sFP`xHcwj)Y)K@|vPu$l}alh1;I zi0J+N6x+#!!}sJzAf*8S#9t-`Vvd+RADUOJ<{D%PnaC4N@Gg#FL0fct9pilm#VK*- z`RN|#n>u}PyeTB-tkeJEGpU9b1}pCiRJbcpUZaFIkJNkBR6GFq4J)tFe*XqI Q5dZ)H07*qoM6N<$g1HzuTmS$7 From 9c55ef21dd3506b1deb6b87adfb076dbbf3cb58f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:15 +0100 Subject: [PATCH 0943/1620] New translations list_not_finished.png (Portuguese) --- .../earth/app/view/Messages_pt.properties | Bin 682 -> 3498 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 4524177685d013019b7d6ff8c0b6a8a4b7d6f486..d7449eea8d9f158b954aeeccf8f1a9c2c209fd29 100644 GIT binary patch literal 3498 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 literal 682 zcmV;b0#*HqP)djvRmvxnun58#g3e;_h37eVuR)H~l@~P}Eu>A$|#Rn;pz(^w~ zP0$FY4@PCCmqf@6U1oDbb5}PvHg&g$FhoY_dHitB`JB)BFgOajArppl@RXMY%KLcA z-D8g+mIy;eugOl?EEZsS%a4z1Q!+WMo-(xklDS5vgY-uRS7~;Mz0#!M zXJQHE*_8-HgP8d>>!XCa|D4bT1q2EhsAz+_C(h_GN`xUESJ_R3lNxdjc@Q}xp3S`g zOW4-QCRHQog2y5iO*>B3_2i@-n?^T0`-<~4S)5X?n1d~ZQJirK?^h-e-HCQiHmPF( zz=A>h?XngaI02XCTJ+BKx6eNOB8i;gaejK9>#C&zft_VoGD_f&tY9jr`Y1!)drJry zz{rbOORQpZH-tOq+h8xOa#2D@ThFy%ha@2KA~?ch=-V(Tq0R3aC$+yR(FiG&&@S4| zR>buf;(83WLK})D85O3p*uXkY7>eNajbTCax!+!y=-Xd1#SmWmYXkD;_NHPpTMI=&$sFP`xHcwj)Y)K@|vPu$l}alh1;I zi0J+N6x+#!!}sJzAf*8S#9t-`Vvd+RADUOJ<{D%PnaC4N@Gg#FL0fct9pilm#VK*- z`RN|#n>u}PyeTB-tkeJEGpU9b1}pCiRJbcpUZaFIkJNkBR6GFq4J)tFe*XqI Q5dZ)H07*qoM6N<$g1HzuTmS$7 From 10dd69669bd07adaec2b26fc72676d5e1bf78a8c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:16 +0100 Subject: [PATCH 0944/1620] New translations list_not_finished.png (English) --- .../earth/app/view/Messages_en.properties | Bin 682 -> 3498 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 4524177685d013019b7d6ff8c0b6a8a4b7d6f486..d7449eea8d9f158b954aeeccf8f1a9c2c209fd29 100644 GIT binary patch literal 3498 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 literal 682 zcmV;b0#*HqP)djvRmvxnun58#g3e;_h37eVuR)H~l@~P}Eu>A$|#Rn;pz(^w~ zP0$FY4@PCCmqf@6U1oDbb5}PvHg&g$FhoY_dHitB`JB)BFgOajArppl@RXMY%KLcA z-D8g+mIy;eugOl?EEZsS%a4z1Q!+WMo-(xklDS5vgY-uRS7~;Mz0#!M zXJQHE*_8-HgP8d>>!XCa|D4bT1q2EhsAz+_C(h_GN`xUESJ_R3lNxdjc@Q}xp3S`g zOW4-QCRHQog2y5iO*>B3_2i@-n?^T0`-<~4S)5X?n1d~ZQJirK?^h-e-HCQiHmPF( zz=A>h?XngaI02XCTJ+BKx6eNOB8i;gaejK9>#C&zft_VoGD_f&tY9jr`Y1!)drJry zz{rbOORQpZH-tOq+h8xOa#2D@ThFy%ha@2KA~?ch=-V(Tq0R3aC$+yR(FiG&&@S4| zR>buf;(83WLK})D85O3p*uXkY7>eNajbTCax!+!y=-Xd1#SmWmYXkD;_NHPpTMI=&$sFP`xHcwj)Y)K@|vPu$l}alh1;I zi0J+N6x+#!!}sJzAf*8S#9t-`Vvd+RADUOJ<{D%PnaC4N@Gg#FL0fct9pilm#VK*- z`RN|#n>u}PyeTB-tkeJEGpU9b1}pCiRJbcpUZaFIkJNkBR6GFq4J)tFe*XqI Q5dZ)H07*qoM6N<$g1HzuTmS$7 From 67e32adb0e50f6219f8b9135ce3c95442a56bee2 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:18 +0100 Subject: [PATCH 0945/1620] New translations macDockImageCE.png (French) --- .../earth/app/view/Messages_fr.properties | Bin 3498 -> 7227 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index d7449eea8d9f158b954aeeccf8f1a9c2c209fd29..411ea29eae07402a848bffe6829186428a5aefae 100644 GIT binary patch literal 7227 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 JPDHLkV1jsYk_Z3* literal 3498 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 From f69cbc3584c0d639af262e93b257992ac5e58998 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:19 +0100 Subject: [PATCH 0946/1620] New translations macDockImageCE.png (Spanish) --- .../earth/app/view/Messages_es.properties | Bin 3498 -> 7227 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index d7449eea8d9f158b954aeeccf8f1a9c2c209fd29..411ea29eae07402a848bffe6829186428a5aefae 100644 GIT binary patch literal 7227 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 JPDHLkV1jsYk_Z3* literal 3498 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 From 5f51bc78ebcd2c83ade60a78ac72b71b4b7f9e0d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:20 +0100 Subject: [PATCH 0947/1620] New translations macDockImageCE.png (Portuguese) --- .../earth/app/view/Messages_pt.properties | Bin 3498 -> 7227 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index d7449eea8d9f158b954aeeccf8f1a9c2c209fd29..411ea29eae07402a848bffe6829186428a5aefae 100644 GIT binary patch literal 7227 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 JPDHLkV1jsYk_Z3* literal 3498 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 From a6af45f5c445c28b3f2009a39b5e94ed3b57c92a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:21 +0100 Subject: [PATCH 0948/1620] New translations macDockImageCE.png (English) --- .../earth/app/view/Messages_en.properties | Bin 3498 -> 7227 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index d7449eea8d9f158b954aeeccf8f1a9c2c209fd29..411ea29eae07402a848bffe6829186428a5aefae 100644 GIT binary patch literal 7227 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 JPDHLkV1jsYk_Z3* literal 3498 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 From bf8ded4bec18e6b03e8962ebd5056ed33a2189c4 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:22 +0100 Subject: [PATCH 0949/1620] New translations smallOpenForisBanner.png (Spanish) --- .../earth/app/view/Messages_es.properties | Bin 7227 -> 2784 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 411ea29eae07402a848bffe6829186428a5aefae..800ed67a3ee630d85c4bd4b6e56a4af593a6ba00 100644 GIT binary patch literal 2784 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 JPDHLkV1jsYk_Z3* From 55782e8f3fb976028128f08f4c0cb165a8b85fe7 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:23 +0100 Subject: [PATCH 0950/1620] New translations FixCoordinates.java (French) --- .../earth/app/view/Messages_fr.properties | Bin 7227 -> 2323 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 411ea29eae07402a848bffe6829186428a5aefae..499b7cb5ec09770b777469ca5e4920683ce4c3c5 100644 GIT binary patch literal 2323 zcmb7GTWi}e6n=Jo#aSrDfmC6zr?nf+N(zNE9ZebQQ&DU=Q7cBO*6IR5hKohTBs#kP5sf45GlfaqNDY@R5ZvRA2I$c)iUlf+vRnq|^Z!(~Q>g^{mZ zvA7+6%UvUGCe12m*esM~#xkqK%le^{7c;>lpfhb0W`Rght>K!#UCD|K4ey;!a9L;U z1ej%sG(k%;pxOf3@3JdTa3i#(*d~W35rpFset>^2xg&FC{6V-?GjTwA2)3?vCZ#|+ zK^vJPK#Y}8p|RPGiJjDomaI#){RGT36v89cVeh>Y1e@vtm0-Y(y_TeS&4s(zY{_K? zk2&l?9~>?9(3AVSyN9RIxm`9^{7en1?5=?0jH-;ZX5Lv6$L{PR`-VttnFX4yReEF%WTd~5wkH* zxxrK4c}&_sK>!u1ax|K|u&!&P1pD*R5_sqm(;vQ^DsAa^`nTwVCW@|5ZkAN`#?IBo zi;rl!WMP~8Dx_6&um+?&T0l5@i&$=VF|bmkfnQRDDJ50d9oa8CdN>-;K-b+qdhF?! z4Q~h64X=_0|6Z`T*~~mM` GpY=aui6tHY literal 7227 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 JPDHLkV1jsYk_Z3* From 556a37f808a2f95e4c3d1b491fa3df135e7d92ac Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:24 +0100 Subject: [PATCH 0951/1620] New translations smallOpenForisBanner.png (Portuguese) --- .../earth/app/view/Messages_pt.properties | Bin 7227 -> 2784 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 411ea29eae07402a848bffe6829186428a5aefae..800ed67a3ee630d85c4bd4b6e56a4af593a6ba00 100644 GIT binary patch literal 2784 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 JPDHLkV1jsYk_Z3* From 254a4b94b852cd0d19723bcf7afcdeea8d482518 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:25 +0100 Subject: [PATCH 0952/1620] New translations smallOpenForisBanner.png (English) --- .../earth/app/view/Messages_en.properties | Bin 7227 -> 2784 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 411ea29eae07402a848bffe6829186428a5aefae..800ed67a3ee630d85c4bd4b6e56a4af593a6ba00 100644 GIT binary patch literal 2784 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 JPDHLkV1jsYk_Z3* From eb4957e830889242053fd6f2a6a373cf98c9f467 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:26 +0100 Subject: [PATCH 0953/1620] New translations log4j2.xml (French) --- .../earth/app/view/Messages_fr.properties | 111 ++++++------------ 1 file changed, 37 insertions(+), 74 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 499b7cb5ec..893729524c 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,74 +1,37 @@ -package org.openforis.collect.earth.app.ad_hoc; - -import java.util.List; - -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.manager.RecordManager; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.CollectRecordSummary; -import org.openforis.collect.model.RecordFilter; -import org.openforis.idm.model.Coordinate; -import org.openforis.idm.model.CoordinateAttribute; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public abstract class FixCoordinates { - - @Autowired - private RecordManager recordManager; - - @Autowired - private EarthSurveyService earthSurveyService; - - private Logger logger = LoggerFactory.getLogger( FixCoordinates.class); - - private boolean stopFix = false; - - private List getAllRecords(){ - RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); - return recordManager.loadSummaries( rf ); - } - - public void fixCoordinates(){ - List allRecords = getAllRecords(); - - if( shouldStopFixing()){ - return; - } - - for (CollectRecordSummary summaryCollectRecord : allRecords) { - if( shouldStopFixing()){ - break; - } - try { - CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); - CoordinateAttribute plotCoord = (CoordinateAttribute) collectRecord.getNodeByPath("/plot/location"); //$NON-NLS-1$ - if( plotCoord != null && plotCoord.getValue() != null && plotCoord.getValue().getX() < getLongitudeLimit() ){ - Coordinate coordinate = new Coordinate(plotCoord.getValue().getY(), plotCoord.getValue().getX(), plotCoord.getValue().getSrsId() ); - plotCoord.setValue( coordinate ); - recordManager.save( collectRecord ); - } - } catch (Exception e) { - logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ - } - } - - } - - protected abstract int getLongitudeLimit(); - - private boolean shouldStopFixing() { - return stopFix; - } - - public void stopFixing() { - stopFix = true; - - } - -} \ No newline at end of file + + + + + + + + + + + + %-5p %d [%t] %c: %m%n + + + + + + + + + + + + + + [%-5level] %d{yyyy-MM-dd HH:mm:ss} %msg%n + + + + + + + + + + + From 50b3ad50a1a2f19cee184931bb15ac81a7d2a1d7 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:27 +0100 Subject: [PATCH 0954/1620] New translations log4j2.xml (Spanish) --- .../earth/app/view/Messages_es.properties | Bin 2784 -> 1305 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 800ed67a3ee630d85c4bd4b6e56a4af593a6ba00..893729524c46dadaed7c727da0ca3cc394ee36ba 100644 GIT binary patch literal 1305 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 mmX=hUxZ`3$Pj%`0<$nS5#z Date: Tue, 29 Nov 2022 15:39:28 +0100 Subject: [PATCH 0955/1620] New translations log4j2.xml (Portuguese) --- .../earth/app/view/Messages_pt.properties | Bin 2784 -> 1305 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 800ed67a3ee630d85c4bd4b6e56a4af593a6ba00..893729524c46dadaed7c727da0ca3cc394ee36ba 100644 GIT binary patch literal 1305 zcma)6ZEM>w5dQ4^3L)k%1>5bQFoK-Ymy~WaX>n3UDWhoi+4W{yMv~iPrT={=S$0#_ zLH)r<=X-hXp6AStHg!cFL8?+TF+B+PDS;*xS=kgZy;+|JU+B?n!cIk#mqjPJMn9r7 z*PV*#6PFDoEl+>*0`M+m5sDU?T*y*|si-PQbqHMQhmf~zSc#&*#B?^9c zJdY(%z@|44Y0fbX_ev2eXtdm7rl!G6SUN-??l|A1&|2FbC8Akyoj%0$Y`(m;*HYEJ z<@oe;e!ZrVEp*aJrCp&49-)fqJV~w+O0YG+0Z>x&jrEG@p$%fuh!jyDx7c4c;>H%S zA#?!J@EQ~3c%;O-?9=`1@*L!<{DaUA4?a`U8zB376;mxcKrTEaz?Hn@ThVE28f`N_ zIBbcZkvm`iAbvU}e(g6bav^>EaN9}1u0>U*C0K^BgaL8F6=Z8!76nM0oAuZdW#Jv{ zlf_9-lZV-NgV`D6ysLDA;}$5^l{Rb@Tf@~r6ULa&jtxsTYDI~WnbrF2>Sj%e=CS}C z)79;2Jzv}#+dDHrRXY;iZQsc$awUwQJ@#$&gyjc?I6?eU#uylK`!erp{cULYaYc_b z?M&Wd4*cv6!CRRlaoMwxMqpJ!E-t2ZJyq%j$y9}*a|p3=_?J!=y@iOquxM!2P|PlI zxnK7}XyW$k`*E^#tq=YQpeY;uz=eslW0Y$&%{Z9aeB8n3T;V5 zK~z}7m6vOfRn?Wpe`}v}?)%>ErklQC3pQv#6O@E#BnVShFep=q@6jYWgw|2U2ZmUg znVPB8n5xud%p{Y97>yHYM#T^nBOxS`79_!FsTnDvh#+XLG_QWq-S_r=oO{mMYd+B3 zkwlrysycN(>{V;8|9`E$9>QNJU)p+wgptFIvu6c})apkF!a=NtuZWm$3(j+At)qF8GeLBwJB* z{Nm7Bij_LWNb@My}!asDJRN2>d^uee=|#NU8u9!M34#+-1+6z}S~R#q?C zVDIX>_McSU6`_qs_s+l1X-T$@qpJ8JM~;tB_9Of-q&btIwINAgvC7fGGTnV6G^S(Z z8&jm>E}&$R9}(3${iWZYYb3S}^db-ew9wOuta$b&ez^EC0PgJin+~h7HODJ8U3tMh zGPmu*an$b~8^&`T;;w@qM&uilgjVr`h(iM-wB}M2t97R5vvl{D39aRI%|j!v z=}={t2aKIwe-uJdmj3oZK&50Xv9$faWR3|Ba7 zQo}gKhX%?tXX7MeE=LB-SPPzO7##6Qc!u`Y9AL2;ab#eFjjS)Ai`(-Zzbf=}Vs6=d ztNd{BV>XDAcSJVZ6xy_V-8omIdLp3;y(K0$rHOlnp|XF{UsD<^zz=rD$tT z)0~NOT2qR_iqCo&oyn{JEwHuf*|$kQ1UW=KBW0tka6 zKGs??36FP9(0NU*)+QHvI&W;xcdRpyE?un^o4GBpX&I;~mrTD1Q2~YSff0-m3Oz-V zF_*Rp9tVzYWLM#JhAR<966`H`6pBd(Di!Yi%{EqcZ6L5ARuxs4(vqQfxH|se8q%{w zu>fBLFaUujudYW4j5Nw8C(S?wYC(u=glVlg>Neu^<}}BSZ=xYN%+%&OCEvwHhV{EM zBt~mP+;!PIaE$N$t_veV+;bQz`&9gpFtPxo;_V1xLC!4ntjU_Ip8i_a5995%C}!KT zd6I4n0gBat_SPJJ5Rq^bgwcBhQ4y;yB1&U2q&JAzGh}d$Aub*gxFpH4{`b4s^431y zJUB?T9x}77ky14P6l3BzCSidTNXmpZo{H2&BW^frD>_ zzN$mQbNKp;ud;F90fuW8rZr4tR!bYzpiUSmo@2UH~ zhM}52uH+iSl$H#+RE$DjjkudV5deW8GzD+P+-!++kzYEh=VM)N$S$8X8wh#a*iP2vtiWW;i%7m6Gp( zf~e3_H3Zg@a9yt1@Jnu(^-+4uC7!sdgIZK)-sv+L@$2N0G3sGN+%w~SQ*DIW`o_l0 zY-_qccX!>Y`5(n_s8rORatT!>6>~Xqe1u6&X;Lv|&a_!rh3?}S%D&5y5tksc%xrFC z(V0_uvHK9kdcd-uKT5)laox;|h`TP4RgRDNBs}+h4A}66J*&Q1_jii9 zwT5Tk*^7waxdzX12qMeSh>z!Hm^SfKoY6c$Di#ui4lS`5uN*waZ{9sZEeNUBL(~di zn}01sBXxo(qT&ZMW#XgIm2wcuS9jFEwfwWxmTexyM3G_Z7w+6)t-O(or})MGx2c68 zRxQ)>ISM@``b#x}(2_}>LvwB^2~RL?kzT(}C`u%j-b$I~WQzMQyN>C(JcH#LlNwVv z#^5<-EcSM9e=&IOo&NQzD(nBFOI^fK0ITLJg4uF-q-=K{J8I^gJ_UfYPj6)Zksiu zTYG=~#@lUy3NPPxq8%@I^kFeX#;SPR-iIcM1s&cTe#MG87eWeV z2(5Dd$_(NzcJ`4Z;bh93%Sp?t}7` zt*`HD%cefvGg7U0e`$&Rz;XPdwI@cixt;5-zp(Si)maZcrdK@qb6XfHs;a8BR;`{| z#^!TX)p9+w-+y(#o$#$qZ~l1S(M0mTp9;X)4{Z7Ksd(PnM|o-a-!ixJF<$PtiSyU2 zKM%~-NSUZA(Umi%J71oA9@&_8Qp~NMXb}RKKTgEDaqnUKZ!hh04ww8VCg&12ALuVt zrZgtC8brKv$Kq43W^>oB1B<+T^Nsq6ho9_paIP)-VOCXi@mW*2a>f~)IUz^fb?}TK zQpFD~$I3O?Ug*`wcX!Ky!E&K3m-_14f4^v5+xIq`!*?&SGamRAZ{L3DsaLZLJ0Itj zjxR80%}+o@cHVNm&i=2b+64CotE`M7nHr6b>5g#_43R=$p&ls~*#YwH)^z;WuigBa z;>-uSWZ&(J^dk>!VgK!y{pHK)oQI!a=PlRs@rRxQ!R)&AIt%cz2Y=QsVip)N=O`vC zDp-*ogV~i$B(}e}Y(W`d+WlJ`g-C!u+?tDnf=gD#Uh}FYPqHd?z#S?^Taov mmX=hUxZ`3$Pj%`0<$nS5#z Date: Tue, 29 Nov 2022 15:39:29 +0100 Subject: [PATCH 0956/1620] New translations log4j2.xml (English) --- .../earth/app/view/Messages_en.properties | Bin 2784 -> 1305 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 800ed67a3ee630d85c4bd4b6e56a4af593a6ba00..893729524c46dadaed7c727da0ca3cc394ee36ba 100644 GIT binary patch literal 1305 zcma)6ZEM>w5dQ4^3L)k%1>5bQFoK-Ymy~WaX>n3UDWhoi+4W{yMv~iPrT={=S$0#_ zLH)r<=X-hXp6AStHg!cFL8?+TF+B+PDS;*xS=kgZy;+|JU+B?n!cIk#mqjPJMn9r7 z*PV*#6PFDoEl+>*0`M+m5sDU?T*y*|si-PQbqHMQhmf~zSc#&*#B?^9c zJdY(%z@|44Y0fbX_ev2eXtdm7rl!G6SUN-??l|A1&|2FbC8Akyoj%0$Y`(m;*HYEJ z<@oe;e!ZrVEp*aJrCp&49-)fqJV~w+O0YG+0Z>x&jrEG@p$%fuh!jyDx7c4c;>H%S zA#?!J@EQ~3c%;O-?9=`1@*L!<{DaUA4?a`U8zB376;mxcKrTEaz?Hn@ThVE28f`N_ zIBbcZkvm`iAbvU}e(g6bav^>EaN9}1u0>U*C0K^BgaL8F6=Z8!76nM0oAuZdW#Jv{ zlf_9-lZV-NgV`D6ysLDA;}$5^l{Rb@Tf@~r6ULa&jtxsTYDI~WnbrF2>Sj%e=CS}C z)79;2Jzv}#+dDHrRXY;iZQsc$awUwQJ@#$&gyjc?I6?eU#uylK`!erp{cULYaYc_b z?M&Wd4*cv6!CRRlaoMwxMqpJ!E-t2ZJyq%j$y9}*a|p3=_?J!=y@iOquxM!2P|PlI zxnK7}XyW$k`*E^#tq=YQpeY;uz=eslW0Y$&%{Z9aeB8n3T;V5 zK~z}7m6vOfRn?Wpe`}v}?)%>ErklQC3pQv#6O@E#BnVShFep=q@6jYWgw|2U2ZmUg znVPB8n5xud%p{Y97>yHYM#T^nBOxS`79_!FsTnDvh#+XLG_QWq-S_r=oO{mMYd+B3 zkwlrysycN(>{V;8|9`E$9>QNJU)p+wgptFIvu6c})apkF!a=NtuZWm$3(j+At)qF8GeLBwJB* z{Nm7Bij_LWNb@My}!asDJRN2>d^uee=|#NU8u9!M34#+-1+6z}S~R#q?C zVDIX>_McSU6`_qs_s+l1X-T$@qpJ8JM~;tB_9Of-q&btIwINAgvC7fGGTnV6G^S(Z z8&jm>E}&$R9}(3${iWZYYb3S}^db-ew9wOuta$b&ez^EC0PgJin+~h7HODJ8U3tMh zGPmu*an$b~8^&`T;;w@qM&uilgjVr`h(iM-wB}M2t97R5vvl{D39aRI%|j!v z=}={t2aKIwe-uJdmj3oZK&50Xv9$faWR3|Ba7 zQo}gKhX%?tXX7MeE=LB-SPPzO7##6Qc!u`Y9AL2;ab#eFjjS)Ai`(-Zzbf=}Vs6=d ztNd{BV>XDAcSJVZ6xy_V-8omIdLp3;y(K0$rHOlnp|XF{UsD<^zz=rD$tT z)0~NOT2qR_iqCo&oyn{JEwHuf*|$kQ1UW=KBW0tka6 zKGs??36FP9(0NU*)+QHvI&W;xcdRpyE?un^o4GBpX&I;~mrTD1Q2~YSff0-m3Oz-V zF_*Rp9tVzYWLM#JhAR<966`H`6pBd(Di!Yi%{EqcZ6L5ARuxs4(vqQfxH|se8q%{w zu>fBLFaUujudYW4j5Nw8C(S?wYC(u=glVlg>Neu^<}}BSZ=xYN%+%&OCEvwHhV{EM zBt~mP+;!PIaE$N$t_veV+;bQz`&9gpFtPxo;_V1xLC!4ntjU_Ip8i_a5995%C}!KT zd6I4n0gBat_SPJJ5Rq^bgwcBhQ4y;yB1&U2q&JAzGh}d$Aub*gxFpH4{`b4s^431y zJUB?T9x}77ky14P6l3BzCSidTNXmpZo{H2&BW^frD>_ zzN$mQbNKp;ud;F90fuW8rZr4tR!bYzpiUSmo@2UH~ zhM}52uH+iSl$H#+RE$DjjkudV5deW8GzD+P+-!++kzYEh=VM)N$S$8X8wh#a*iP2vtiWW;i%7m6Gp( zf~e3_H3Zg@a9yt1@Jnu(^-+4uC7!sdgIZK)-sv+L@$2N0G3sGN+%w~SQ*DIW`o_l0 zY-_qccX!>Y`5(n_s8rORatT!>6>~Xqe1u6&X;Lv|&a_!rh3?}S%D&5y5tksc%xrFC z(V0_uvHK9kdcd-uKT5)laox;|h`TP4RgRDNBs}+h4A}66J*&Q1_jii9 zwT5Tk*^7waxdzX12qMeSh>z!Hm^SfKoY6c$Di#ui4lS`5uN*waZ{9sZEeNUBL(~di zn}01sBXxo(qT&ZMW#XgIm2wcuS9jFEwfwWxmTexyM3G_Z7w+6)t-O(or})MGx2c68 zRxQ)>ISM@``b#x}(2_}>LvwB^2~RL?kzT(}C`u%j-b$I~WQzMQyN>C(JcH#LlNwVv z#^5<-EcSM9e=&IOo&NQzD(nBFOI^fK0ITLJg4uF-q-=K{J8I^gJ_UfYPj6)Zksiu zTYG=~#@lUy3NPPxq8%@I^kFeX#;SPR-iIcM1s&cTe#MG87eWeV z2(5Dd$_(NzcJ`4Z;bh93%Sp?t}7` zt*`HD%cefvGg7U0e`$&Rz;XPdwI@cixt;5-zp(Si)maZcrdK@qb6XfHs;a8BR;`{| z#^!TX)p9+w-+y(#o$#$qZ~l1S(M0mTp9;X)4{Z7Ksd(PnM|o-a-!ixJF<$PtiSyU2 zKM%~-NSUZA(Umi%J71oA9@&_8Qp~NMXb}RKKTgEDaqnUKZ!hh04ww8VCg&12ALuVt zrZgtC8brKv$Kq43W^>oB1B<+T^Nsq6ho9_paIP)-VOCXi@mW*2a>f~)IUz^fb?}TK zQpFD~$I3O?Ug*`wcX!Ky!E&K3m-_14f4^v5+xIq`!*?&SGamRAZ{L3DsaLZLJ0Itj zjxR80%}+o@cHVNm&i=2b+64CotE`M7nHr6b>5g#_43R=$p&ls~*#YwH)^z;WuigBa z;>-uSWZ&(J^dk>!VgK!y{pHK)oQI!a=PlRs@rRxQ!R)&AIt%cz2Y=QsVip)N=O`vC zDp-*ogV~i$B(}e}Y(W`d+WlJ`g-C!u+?tDnf=gD#Uh}FYPqHd?z#S?^Taov mmX=hUxZ`3$Pj%`0<$nS5#z Date: Tue, 29 Nov 2022 15:39:31 +0100 Subject: [PATCH 0957/1620] New translations AluToolUtils.java (French) --- .../earth/app/view/Messages_fr.properties | 122 +++++++++++++----- 1 file changed, 88 insertions(+), 34 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 893729524c..268889968b 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,37 +1,91 @@ - - +package org.openforis.collect.earth.app.ad_hoc; - - - - +import java.util.HashMap; +import java.util.Map; - - - - %-5p %d [%t] %c: %m%n - - - - - - - - - +import org.apache.commons.lang3.StringUtils; - - - - [%-5level] %d{yyyy-MM-dd HH:mm:ss} %msg%n - - - - - - - - - - - + + + +public class AluToolUtils { + + + /** + * Returns the climate zone code according to the ALU tool rules + * @param elevation The elevation at the plot center point in meters + * @param precipitation The precipitation in mm per year + * @param shortDrySeason If the dry season is shorter or equal to 5 months (true) or not + * @return The climate zone according to the ALU tool documentation + */ + public String getClimateZone( int elevation, int precipitation, boolean shortDrySeason ){ + + String climateName = null; + + if( elevation < 1000 && precipitation < 1000 ){ // Tropical Dry + climateName = "TRD"; //$NON-NLS-1$ + }else if( elevation < 1000 && ( precipitation >= 1000 && precipitation < 2000) && !shortDrySeason ){ // Tropical Moist, Long Dry Season + climateName = "TMLD"; //$NON-NLS-1$ + }else if( elevation < 1000 && ( precipitation >= 1000 && precipitation < 2000) && shortDrySeason ){ // Tropical Moist, Short Dry Season + climateName = "TMSD"; //$NON-NLS-1$ + }else if( elevation >= 1000 && precipitation < 1000 ){ // Tropical Montane Dry + climateName = "TRMD"; //$NON-NLS-1$ + }else if( elevation >= 1000 && precipitation >= 1000 ){ // Tropical Montane Moist + climateName = "TRMM"; //$NON-NLS-1$ + }else if( elevation < 1000 && precipitation >= 2000 ){ // Tropical Wet + climateName = "TRW"; //$NON-NLS-1$ + } + + return climateName; + } + + public String getSoilType( String initialSoilGroup ){ + + if( StringUtils.isBlank(initialSoilGroup) ){ + return "N/A"; //$NON-NLS-1$ + } + + Map fundamentalToSoilGroup = new HashMap<>(); + + fundamentalToSoilGroup.put("B", "HAC"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("L", "HAC"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("P", "VOL"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("V", "VOL"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("S", "SAN"); // SAN+POD //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("Z", "LAC"); // LAc+HAC //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("T", "SAN"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("A", "LAC"); // LAC+WET //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("C", "LAC"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("G", "LAC"); // LAC+HAC //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("W", "ORG"); // ORG+WET //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("M", "WET"); //$NON-NLS-1$ //$NON-NLS-2$ + + return fundamentalToSoilGroup.get(initialSoilGroup); + } + + + public String getAluSubclass( String collectEarthSubclass ){ + if( StringUtils.isBlank(collectEarthSubclass) ){ + return "N/A"; //$NON-NLS-1$ + } + String aluSubClass = collectEarthSubclass.replace("to", ""); //$NON-NLS-1$ //$NON-NLS-2$ + aluSubClass = aluSubClass.replace("L", ""); //$NON-NLS-1$ //$NON-NLS-2$ + aluSubClass = aluSubClass.replace("T", ""); //$NON-NLS-1$ //$NON-NLS-2$ + return aluSubClass; + } + + /** + * Returns the lower bracket of the precipitation range + * @param precipitationRange expects values like "0-100" or "2000-2100" + * @return the lowest bracket of the range. So for "0-100" it would return 0 + */ + public Integer getPrecipitationFromRange(String precipitationRange){ + String lowerBracket = precipitationRange.substring(0, precipitationRange.indexOf('-')).trim(); + if( lowerBracket.length() > 0 ){ + return Integer.parseInt(lowerBracket); + }else{ + return -1; + } + } + +} From 4b5a385afc474f12d71177861cdbc29e0dce5a6d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:32 +0100 Subject: [PATCH 0958/1620] New translations AluToolUtils.java (Spanish) --- .../earth/app/view/Messages_es.properties | 122 +++++++++++++----- 1 file changed, 88 insertions(+), 34 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 893729524c..268889968b 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,37 +1,91 @@ - - +package org.openforis.collect.earth.app.ad_hoc; - - - - +import java.util.HashMap; +import java.util.Map; - - - - %-5p %d [%t] %c: %m%n - - - - - - - - - +import org.apache.commons.lang3.StringUtils; - - - - [%-5level] %d{yyyy-MM-dd HH:mm:ss} %msg%n - - - - - - - - - - - + + + +public class AluToolUtils { + + + /** + * Returns the climate zone code according to the ALU tool rules + * @param elevation The elevation at the plot center point in meters + * @param precipitation The precipitation in mm per year + * @param shortDrySeason If the dry season is shorter or equal to 5 months (true) or not + * @return The climate zone according to the ALU tool documentation + */ + public String getClimateZone( int elevation, int precipitation, boolean shortDrySeason ){ + + String climateName = null; + + if( elevation < 1000 && precipitation < 1000 ){ // Tropical Dry + climateName = "TRD"; //$NON-NLS-1$ + }else if( elevation < 1000 && ( precipitation >= 1000 && precipitation < 2000) && !shortDrySeason ){ // Tropical Moist, Long Dry Season + climateName = "TMLD"; //$NON-NLS-1$ + }else if( elevation < 1000 && ( precipitation >= 1000 && precipitation < 2000) && shortDrySeason ){ // Tropical Moist, Short Dry Season + climateName = "TMSD"; //$NON-NLS-1$ + }else if( elevation >= 1000 && precipitation < 1000 ){ // Tropical Montane Dry + climateName = "TRMD"; //$NON-NLS-1$ + }else if( elevation >= 1000 && precipitation >= 1000 ){ // Tropical Montane Moist + climateName = "TRMM"; //$NON-NLS-1$ + }else if( elevation < 1000 && precipitation >= 2000 ){ // Tropical Wet + climateName = "TRW"; //$NON-NLS-1$ + } + + return climateName; + } + + public String getSoilType( String initialSoilGroup ){ + + if( StringUtils.isBlank(initialSoilGroup) ){ + return "N/A"; //$NON-NLS-1$ + } + + Map fundamentalToSoilGroup = new HashMap<>(); + + fundamentalToSoilGroup.put("B", "HAC"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("L", "HAC"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("P", "VOL"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("V", "VOL"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("S", "SAN"); // SAN+POD //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("Z", "LAC"); // LAc+HAC //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("T", "SAN"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("A", "LAC"); // LAC+WET //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("C", "LAC"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("G", "LAC"); // LAC+HAC //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("W", "ORG"); // ORG+WET //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("M", "WET"); //$NON-NLS-1$ //$NON-NLS-2$ + + return fundamentalToSoilGroup.get(initialSoilGroup); + } + + + public String getAluSubclass( String collectEarthSubclass ){ + if( StringUtils.isBlank(collectEarthSubclass) ){ + return "N/A"; //$NON-NLS-1$ + } + String aluSubClass = collectEarthSubclass.replace("to", ""); //$NON-NLS-1$ //$NON-NLS-2$ + aluSubClass = aluSubClass.replace("L", ""); //$NON-NLS-1$ //$NON-NLS-2$ + aluSubClass = aluSubClass.replace("T", ""); //$NON-NLS-1$ //$NON-NLS-2$ + return aluSubClass; + } + + /** + * Returns the lower bracket of the precipitation range + * @param precipitationRange expects values like "0-100" or "2000-2100" + * @return the lowest bracket of the range. So for "0-100" it would return 0 + */ + public Integer getPrecipitationFromRange(String precipitationRange){ + String lowerBracket = precipitationRange.substring(0, precipitationRange.indexOf('-')).trim(); + if( lowerBracket.length() > 0 ){ + return Integer.parseInt(lowerBracket); + }else{ + return -1; + } + } + +} From 7b4cdc78818b45ed87b57aef94ab5acf99876d09 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:33 +0100 Subject: [PATCH 0959/1620] New translations AluToolUtils.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 122 +++++++++++++----- 1 file changed, 88 insertions(+), 34 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 893729524c..268889968b 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,37 +1,91 @@ - - +package org.openforis.collect.earth.app.ad_hoc; - - - - +import java.util.HashMap; +import java.util.Map; - - - - %-5p %d [%t] %c: %m%n - - - - - - - - - +import org.apache.commons.lang3.StringUtils; - - - - [%-5level] %d{yyyy-MM-dd HH:mm:ss} %msg%n - - - - - - - - - - - + + + +public class AluToolUtils { + + + /** + * Returns the climate zone code according to the ALU tool rules + * @param elevation The elevation at the plot center point in meters + * @param precipitation The precipitation in mm per year + * @param shortDrySeason If the dry season is shorter or equal to 5 months (true) or not + * @return The climate zone according to the ALU tool documentation + */ + public String getClimateZone( int elevation, int precipitation, boolean shortDrySeason ){ + + String climateName = null; + + if( elevation < 1000 && precipitation < 1000 ){ // Tropical Dry + climateName = "TRD"; //$NON-NLS-1$ + }else if( elevation < 1000 && ( precipitation >= 1000 && precipitation < 2000) && !shortDrySeason ){ // Tropical Moist, Long Dry Season + climateName = "TMLD"; //$NON-NLS-1$ + }else if( elevation < 1000 && ( precipitation >= 1000 && precipitation < 2000) && shortDrySeason ){ // Tropical Moist, Short Dry Season + climateName = "TMSD"; //$NON-NLS-1$ + }else if( elevation >= 1000 && precipitation < 1000 ){ // Tropical Montane Dry + climateName = "TRMD"; //$NON-NLS-1$ + }else if( elevation >= 1000 && precipitation >= 1000 ){ // Tropical Montane Moist + climateName = "TRMM"; //$NON-NLS-1$ + }else if( elevation < 1000 && precipitation >= 2000 ){ // Tropical Wet + climateName = "TRW"; //$NON-NLS-1$ + } + + return climateName; + } + + public String getSoilType( String initialSoilGroup ){ + + if( StringUtils.isBlank(initialSoilGroup) ){ + return "N/A"; //$NON-NLS-1$ + } + + Map fundamentalToSoilGroup = new HashMap<>(); + + fundamentalToSoilGroup.put("B", "HAC"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("L", "HAC"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("P", "VOL"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("V", "VOL"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("S", "SAN"); // SAN+POD //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("Z", "LAC"); // LAc+HAC //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("T", "SAN"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("A", "LAC"); // LAC+WET //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("C", "LAC"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("G", "LAC"); // LAC+HAC //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("W", "ORG"); // ORG+WET //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("M", "WET"); //$NON-NLS-1$ //$NON-NLS-2$ + + return fundamentalToSoilGroup.get(initialSoilGroup); + } + + + public String getAluSubclass( String collectEarthSubclass ){ + if( StringUtils.isBlank(collectEarthSubclass) ){ + return "N/A"; //$NON-NLS-1$ + } + String aluSubClass = collectEarthSubclass.replace("to", ""); //$NON-NLS-1$ //$NON-NLS-2$ + aluSubClass = aluSubClass.replace("L", ""); //$NON-NLS-1$ //$NON-NLS-2$ + aluSubClass = aluSubClass.replace("T", ""); //$NON-NLS-1$ //$NON-NLS-2$ + return aluSubClass; + } + + /** + * Returns the lower bracket of the precipitation range + * @param precipitationRange expects values like "0-100" or "2000-2100" + * @return the lowest bracket of the range. So for "0-100" it would return 0 + */ + public Integer getPrecipitationFromRange(String precipitationRange){ + String lowerBracket = precipitationRange.substring(0, precipitationRange.indexOf('-')).trim(); + if( lowerBracket.length() > 0 ){ + return Integer.parseInt(lowerBracket); + }else{ + return -1; + } + } + +} From db75d447e25735d61feca63779ab23e57c23ab77 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:34 +0100 Subject: [PATCH 0960/1620] New translations AluToolUtils.java (English) --- .../earth/app/view/Messages_en.properties | 122 +++++++++++++----- 1 file changed, 88 insertions(+), 34 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 893729524c..268889968b 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,37 +1,91 @@ - - +package org.openforis.collect.earth.app.ad_hoc; - - - - +import java.util.HashMap; +import java.util.Map; - - - - %-5p %d [%t] %c: %m%n - - - - - - - - - +import org.apache.commons.lang3.StringUtils; - - - - [%-5level] %d{yyyy-MM-dd HH:mm:ss} %msg%n - - - - - - - - - - - + + + +public class AluToolUtils { + + + /** + * Returns the climate zone code according to the ALU tool rules + * @param elevation The elevation at the plot center point in meters + * @param precipitation The precipitation in mm per year + * @param shortDrySeason If the dry season is shorter or equal to 5 months (true) or not + * @return The climate zone according to the ALU tool documentation + */ + public String getClimateZone( int elevation, int precipitation, boolean shortDrySeason ){ + + String climateName = null; + + if( elevation < 1000 && precipitation < 1000 ){ // Tropical Dry + climateName = "TRD"; //$NON-NLS-1$ + }else if( elevation < 1000 && ( precipitation >= 1000 && precipitation < 2000) && !shortDrySeason ){ // Tropical Moist, Long Dry Season + climateName = "TMLD"; //$NON-NLS-1$ + }else if( elevation < 1000 && ( precipitation >= 1000 && precipitation < 2000) && shortDrySeason ){ // Tropical Moist, Short Dry Season + climateName = "TMSD"; //$NON-NLS-1$ + }else if( elevation >= 1000 && precipitation < 1000 ){ // Tropical Montane Dry + climateName = "TRMD"; //$NON-NLS-1$ + }else if( elevation >= 1000 && precipitation >= 1000 ){ // Tropical Montane Moist + climateName = "TRMM"; //$NON-NLS-1$ + }else if( elevation < 1000 && precipitation >= 2000 ){ // Tropical Wet + climateName = "TRW"; //$NON-NLS-1$ + } + + return climateName; + } + + public String getSoilType( String initialSoilGroup ){ + + if( StringUtils.isBlank(initialSoilGroup) ){ + return "N/A"; //$NON-NLS-1$ + } + + Map fundamentalToSoilGroup = new HashMap<>(); + + fundamentalToSoilGroup.put("B", "HAC"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("L", "HAC"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("P", "VOL"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("V", "VOL"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("S", "SAN"); // SAN+POD //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("Z", "LAC"); // LAc+HAC //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("T", "SAN"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("A", "LAC"); // LAC+WET //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("C", "LAC"); //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("G", "LAC"); // LAC+HAC //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("W", "ORG"); // ORG+WET //$NON-NLS-1$ //$NON-NLS-2$ + fundamentalToSoilGroup.put("M", "WET"); //$NON-NLS-1$ //$NON-NLS-2$ + + return fundamentalToSoilGroup.get(initialSoilGroup); + } + + + public String getAluSubclass( String collectEarthSubclass ){ + if( StringUtils.isBlank(collectEarthSubclass) ){ + return "N/A"; //$NON-NLS-1$ + } + String aluSubClass = collectEarthSubclass.replace("to", ""); //$NON-NLS-1$ //$NON-NLS-2$ + aluSubClass = aluSubClass.replace("L", ""); //$NON-NLS-1$ //$NON-NLS-2$ + aluSubClass = aluSubClass.replace("T", ""); //$NON-NLS-1$ //$NON-NLS-2$ + return aluSubClass; + } + + /** + * Returns the lower bracket of the precipitation range + * @param precipitationRange expects values like "0-100" or "2000-2100" + * @return the lowest bracket of the range. So for "0-100" it would return 0 + */ + public Integer getPrecipitationFromRange(String precipitationRange){ + String lowerBracket = precipitationRange.substring(0, precipitationRange.indexOf('-')).trim(); + if( lowerBracket.length() > 0 ){ + return Integer.parseInt(lowerBracket); + }else{ + return -1; + } + } + +} From 4ba0f69997a98a5312c389e7aeea3b945bc903da Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:35 +0100 Subject: [PATCH 0961/1620] New translations FixOtherLand.java (Spanish) --- .../earth/app/view/Messages_es.properties | 141 ++++++++---------- 1 file changed, 65 insertions(+), 76 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 268889968b..6e034a1981 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,91 +1,80 @@ package org.openforis.collect.earth.app.ad_hoc; -import java.util.HashMap; -import java.util.Map; +import java.util.List; -import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.manager.RecordManager; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.CollectRecordSummary; +import org.openforis.collect.model.RecordFilter; +import org.openforis.idm.model.Coordinate; +import org.openforis.idm.model.CoordinateAttribute; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +@Component +public abstract class FixOtherLand { + @Autowired + private RecordManager recordManager; + @Autowired + private EarthSurveyService earthSurveyService; -public class AluToolUtils { - - - /** - * Returns the climate zone code according to the ALU tool rules - * @param elevation The elevation at the plot center point in meters - * @param precipitation The precipitation in mm per year - * @param shortDrySeason If the dry season is shorter or equal to 5 months (true) or not - * @return The climate zone according to the ALU tool documentation - */ - public String getClimateZone( int elevation, int precipitation, boolean shortDrySeason ){ - - String climateName = null; - - if( elevation < 1000 && precipitation < 1000 ){ // Tropical Dry - climateName = "TRD"; //$NON-NLS-1$ - }else if( elevation < 1000 && ( precipitation >= 1000 && precipitation < 2000) && !shortDrySeason ){ // Tropical Moist, Long Dry Season - climateName = "TMLD"; //$NON-NLS-1$ - }else if( elevation < 1000 && ( precipitation >= 1000 && precipitation < 2000) && shortDrySeason ){ // Tropical Moist, Short Dry Season - climateName = "TMSD"; //$NON-NLS-1$ - }else if( elevation >= 1000 && precipitation < 1000 ){ // Tropical Montane Dry - climateName = "TRMD"; //$NON-NLS-1$ - }else if( elevation >= 1000 && precipitation >= 1000 ){ // Tropical Montane Moist - climateName = "TRMM"; //$NON-NLS-1$ - }else if( elevation < 1000 && precipitation >= 2000 ){ // Tropical Wet - climateName = "TRW"; //$NON-NLS-1$ - } - - return climateName; + private Logger logger = LoggerFactory.getLogger( FixOtherLand.class); + + private boolean stopFix = false; + + private List getAllRecords(){ + RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); + List records = recordManager.loadSummaries( rf ); + return records; } - - public String getSoilType( String initialSoilGroup ){ + + public void fixCoordinates(){ + List allRecords = getAllRecords(); - if( StringUtils.isBlank(initialSoilGroup) ){ - return "N/A"; //$NON-NLS-1$ + if( shouldStopFixing()){ + return; } - Map fundamentalToSoilGroup = new HashMap<>(); - - fundamentalToSoilGroup.put("B", "HAC"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("L", "HAC"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("P", "VOL"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("V", "VOL"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("S", "SAN"); // SAN+POD //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("Z", "LAC"); // LAc+HAC //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("T", "SAN"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("A", "LAC"); // LAC+WET //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("C", "LAC"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("G", "LAC"); // LAC+HAC //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("W", "ORG"); // ORG+WET //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("M", "WET"); //$NON-NLS-1$ //$NON-NLS-2$ - - return fundamentalToSoilGroup.get(initialSoilGroup); - } - - - public String getAluSubclass( String collectEarthSubclass ){ - if( StringUtils.isBlank(collectEarthSubclass) ){ - return "N/A"; //$NON-NLS-1$ + for (CollectRecordSummary summaryCollectRecord : allRecords) { + if( shouldStopFixing()){ + break; + } + try { + CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); + CoordinateAttribute plotCoord = (CoordinateAttribute) collectRecord.getNodeByPath("/plot/location"); //$NON-NLS-1$ + if( plotCoord != null && plotCoord.getValue() != null ){ + if( plotCoord.getValue().getX() < getLongitudeLimit() ){ + Coordinate coordinate = new Coordinate(plotCoord.getValue().getY(), plotCoord.getValue().getX(), plotCoord.getValue().getSrsId() ); + plotCoord.setValue( coordinate ); + recordManager.save( collectRecord ); + + } + + + } + } catch (Exception e) { + logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ + } } - String aluSubClass = collectEarthSubclass.replace("to", ""); //$NON-NLS-1$ //$NON-NLS-2$ - aluSubClass = aluSubClass.replace("L", ""); //$NON-NLS-1$ //$NON-NLS-2$ - aluSubClass = aluSubClass.replace("T", ""); //$NON-NLS-1$ //$NON-NLS-2$ - return aluSubClass; + } - - /** - * Returns the lower bracket of the precipitation range - * @param precipitationRange expects values like "0-100" or "2000-2100" - * @return the lowest bracket of the range. So for "0-100" it would return 0 - */ - public Integer getPrecipitationFromRange(String precipitationRange){ - String lowerBracket = precipitationRange.substring(0, precipitationRange.indexOf('-')).trim(); - if( lowerBracket.length() > 0 ){ - return Integer.parseInt(lowerBracket); - }else{ - return -1; - } + + protected abstract int getLongitudeLimit(); + + private boolean shouldStopFixing() { + return stopFix; + } + + public void stopFixing() { + stopFix = true; + } -} +} \ No newline at end of file From 93937d34b0ba1db8a3b8a8bea0bf994f6648394d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:36 +0100 Subject: [PATCH 0962/1620] New translations FixOtherLand.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 141 ++++++++---------- 1 file changed, 65 insertions(+), 76 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 268889968b..6e034a1981 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,91 +1,80 @@ package org.openforis.collect.earth.app.ad_hoc; -import java.util.HashMap; -import java.util.Map; +import java.util.List; -import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.manager.RecordManager; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.CollectRecordSummary; +import org.openforis.collect.model.RecordFilter; +import org.openforis.idm.model.Coordinate; +import org.openforis.idm.model.CoordinateAttribute; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +@Component +public abstract class FixOtherLand { + @Autowired + private RecordManager recordManager; + @Autowired + private EarthSurveyService earthSurveyService; -public class AluToolUtils { - - - /** - * Returns the climate zone code according to the ALU tool rules - * @param elevation The elevation at the plot center point in meters - * @param precipitation The precipitation in mm per year - * @param shortDrySeason If the dry season is shorter or equal to 5 months (true) or not - * @return The climate zone according to the ALU tool documentation - */ - public String getClimateZone( int elevation, int precipitation, boolean shortDrySeason ){ - - String climateName = null; - - if( elevation < 1000 && precipitation < 1000 ){ // Tropical Dry - climateName = "TRD"; //$NON-NLS-1$ - }else if( elevation < 1000 && ( precipitation >= 1000 && precipitation < 2000) && !shortDrySeason ){ // Tropical Moist, Long Dry Season - climateName = "TMLD"; //$NON-NLS-1$ - }else if( elevation < 1000 && ( precipitation >= 1000 && precipitation < 2000) && shortDrySeason ){ // Tropical Moist, Short Dry Season - climateName = "TMSD"; //$NON-NLS-1$ - }else if( elevation >= 1000 && precipitation < 1000 ){ // Tropical Montane Dry - climateName = "TRMD"; //$NON-NLS-1$ - }else if( elevation >= 1000 && precipitation >= 1000 ){ // Tropical Montane Moist - climateName = "TRMM"; //$NON-NLS-1$ - }else if( elevation < 1000 && precipitation >= 2000 ){ // Tropical Wet - climateName = "TRW"; //$NON-NLS-1$ - } - - return climateName; + private Logger logger = LoggerFactory.getLogger( FixOtherLand.class); + + private boolean stopFix = false; + + private List getAllRecords(){ + RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); + List records = recordManager.loadSummaries( rf ); + return records; } - - public String getSoilType( String initialSoilGroup ){ + + public void fixCoordinates(){ + List allRecords = getAllRecords(); - if( StringUtils.isBlank(initialSoilGroup) ){ - return "N/A"; //$NON-NLS-1$ + if( shouldStopFixing()){ + return; } - Map fundamentalToSoilGroup = new HashMap<>(); - - fundamentalToSoilGroup.put("B", "HAC"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("L", "HAC"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("P", "VOL"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("V", "VOL"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("S", "SAN"); // SAN+POD //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("Z", "LAC"); // LAc+HAC //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("T", "SAN"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("A", "LAC"); // LAC+WET //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("C", "LAC"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("G", "LAC"); // LAC+HAC //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("W", "ORG"); // ORG+WET //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("M", "WET"); //$NON-NLS-1$ //$NON-NLS-2$ - - return fundamentalToSoilGroup.get(initialSoilGroup); - } - - - public String getAluSubclass( String collectEarthSubclass ){ - if( StringUtils.isBlank(collectEarthSubclass) ){ - return "N/A"; //$NON-NLS-1$ + for (CollectRecordSummary summaryCollectRecord : allRecords) { + if( shouldStopFixing()){ + break; + } + try { + CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); + CoordinateAttribute plotCoord = (CoordinateAttribute) collectRecord.getNodeByPath("/plot/location"); //$NON-NLS-1$ + if( plotCoord != null && plotCoord.getValue() != null ){ + if( plotCoord.getValue().getX() < getLongitudeLimit() ){ + Coordinate coordinate = new Coordinate(plotCoord.getValue().getY(), plotCoord.getValue().getX(), plotCoord.getValue().getSrsId() ); + plotCoord.setValue( coordinate ); + recordManager.save( collectRecord ); + + } + + + } + } catch (Exception e) { + logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ + } } - String aluSubClass = collectEarthSubclass.replace("to", ""); //$NON-NLS-1$ //$NON-NLS-2$ - aluSubClass = aluSubClass.replace("L", ""); //$NON-NLS-1$ //$NON-NLS-2$ - aluSubClass = aluSubClass.replace("T", ""); //$NON-NLS-1$ //$NON-NLS-2$ - return aluSubClass; + } - - /** - * Returns the lower bracket of the precipitation range - * @param precipitationRange expects values like "0-100" or "2000-2100" - * @return the lowest bracket of the range. So for "0-100" it would return 0 - */ - public Integer getPrecipitationFromRange(String precipitationRange){ - String lowerBracket = precipitationRange.substring(0, precipitationRange.indexOf('-')).trim(); - if( lowerBracket.length() > 0 ){ - return Integer.parseInt(lowerBracket); - }else{ - return -1; - } + + protected abstract int getLongitudeLimit(); + + private boolean shouldStopFixing() { + return stopFix; + } + + public void stopFixing() { + stopFix = true; + } -} +} \ No newline at end of file From 29a9ceb07e335de4c8c0a1dc528fa820818c497b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:37 +0100 Subject: [PATCH 0963/1620] New translations SlopeCode.java (English) --- .../earth/app/view/Messages_en.properties | 131 ++++++++---------- 1 file changed, 55 insertions(+), 76 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 268889968b..eb2152ecb3 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,91 +1,70 @@ -package org.openforis.collect.earth.app.ad_hoc; +package org.openforis.collect.earth.app.model; -import java.util.HashMap; -import java.util.Map; +import org.openforis.collect.earth.app.view.Messages; -import org.apache.commons.lang3.StringUtils; +/** + * Slope codes by range associated to a slope in degrees ( 0-5 degrees flat, 6-15 slight, 15-30 steep and so on) + * @author Alfonso Sanchez-Paus Diaz + * + */ +public enum SlopeCode { + FLAT(Messages.getString("SlopeCode.0"), 1, 0, 5), SLIGHT("6-15", 2, 6, 15), STEEP("16-30", 3, 16, 30), VERY_STEEP("31-45", 4, 31, 45), EXTREME("46-60", 5, 46, 60), FALL( //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ + "61-90", 6, 61, 90), NA("NA", 7, -1, -1); //$NON-NLS-1$ //$NON-NLS-2$ + + /** + * Utility method to calculate the slope-code for a given slope in degrees. + * @param slope The slope in degrees + * @return The slope code for the given slope in degrees. + */ + public static SlopeCode getSlopeCode(int slope) { + final SlopeCode[] slopeCodes = SlopeCode.values(); + for (final SlopeCode slopeCode : slopeCodes) { + if (slope >= slopeCode.getStartSlope() && slope <= slopeCode.getEndSlope()) { + return slopeCode; + } + } + return null; + } -public class AluToolUtils { - + private String label; + + private int id; /** - * Returns the climate zone code according to the ALU tool rules - * @param elevation The elevation at the plot center point in meters - * @param precipitation The precipitation in mm per year - * @param shortDrySeason If the dry season is shorter or equal to 5 months (true) or not - * @return The climate zone according to the ALU tool documentation + * The start and end of the range used to classify a slope code. */ - public String getClimateZone( int elevation, int precipitation, boolean shortDrySeason ){ - - String climateName = null; - - if( elevation < 1000 && precipitation < 1000 ){ // Tropical Dry - climateName = "TRD"; //$NON-NLS-1$ - }else if( elevation < 1000 && ( precipitation >= 1000 && precipitation < 2000) && !shortDrySeason ){ // Tropical Moist, Long Dry Season - climateName = "TMLD"; //$NON-NLS-1$ - }else if( elevation < 1000 && ( precipitation >= 1000 && precipitation < 2000) && shortDrySeason ){ // Tropical Moist, Short Dry Season - climateName = "TMSD"; //$NON-NLS-1$ - }else if( elevation >= 1000 && precipitation < 1000 ){ // Tropical Montane Dry - climateName = "TRMD"; //$NON-NLS-1$ - }else if( elevation >= 1000 && precipitation >= 1000 ){ // Tropical Montane Moist - climateName = "TRMM"; //$NON-NLS-1$ - }else if( elevation < 1000 && precipitation >= 2000 ){ // Tropical Wet - climateName = "TRW"; //$NON-NLS-1$ - } - - return climateName; - } + private int startSlope, endSlope; - public String getSoilType( String initialSoilGroup ){ - - if( StringUtils.isBlank(initialSoilGroup) ){ - return "N/A"; //$NON-NLS-1$ - } - - Map fundamentalToSoilGroup = new HashMap<>(); - - fundamentalToSoilGroup.put("B", "HAC"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("L", "HAC"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("P", "VOL"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("V", "VOL"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("S", "SAN"); // SAN+POD //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("Z", "LAC"); // LAc+HAC //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("T", "SAN"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("A", "LAC"); // LAC+WET //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("C", "LAC"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("G", "LAC"); // LAC+HAC //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("W", "ORG"); // ORG+WET //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("M", "WET"); //$NON-NLS-1$ //$NON-NLS-2$ - - return fundamentalToSoilGroup.get(initialSoilGroup); + + private SlopeCode(String label, int id, int startSlope, int endSlope) { + this.label = label; + this.id = id; + this.startSlope = startSlope; + this.endSlope = endSlope; } - - - public String getAluSubclass( String collectEarthSubclass ){ - if( StringUtils.isBlank(collectEarthSubclass) ){ - return "N/A"; //$NON-NLS-1$ - } - String aluSubClass = collectEarthSubclass.replace("to", ""); //$NON-NLS-1$ //$NON-NLS-2$ - aluSubClass = aluSubClass.replace("L", ""); //$NON-NLS-1$ //$NON-NLS-2$ - aluSubClass = aluSubClass.replace("T", ""); //$NON-NLS-1$ //$NON-NLS-2$ - return aluSubClass; + + public int getEndSlope() { + return endSlope; } - - /** - * Returns the lower bracket of the precipitation range - * @param precipitationRange expects values like "0-100" or "2000-2100" - * @return the lowest bracket of the range. So for "0-100" it would return 0 - */ - public Integer getPrecipitationFromRange(String precipitationRange){ - String lowerBracket = precipitationRange.substring(0, precipitationRange.indexOf('-')).trim(); - if( lowerBracket.length() > 0 ){ - return Integer.parseInt(lowerBracket); - }else{ - return -1; - } + + public int getId() { + return id; + } + + public String getLabel() { + return label; + } + + public int getStartSlope() { + return startSlope; + } + + @Override + public String toString() { + return label; } } From 3c17040b2efaccd56bcdd8a2ed992163efe16d70 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:38 +0100 Subject: [PATCH 0964/1620] New translations AspectCode.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 114 +++++++----------- 1 file changed, 46 insertions(+), 68 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 6e034a1981..dfaad035c3 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,80 +1,58 @@ -package org.openforis.collect.earth.app.ad_hoc; - -import java.util.List; - -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.manager.RecordManager; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.CollectRecordSummary; -import org.openforis.collect.model.RecordFilter; -import org.openforis.idm.model.Coordinate; -import org.openforis.idm.model.CoordinateAttribute; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public abstract class FixOtherLand { - - @Autowired - private RecordManager recordManager; - - @Autowired - private EarthSurveyService earthSurveyService; - - private Logger logger = LoggerFactory.getLogger( FixOtherLand.class); - - private boolean stopFix = false; - - private List getAllRecords(){ - RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); - List records = recordManager.loadSummaries( rf ); - return records; +package org.openforis.collect.earth.app.model; + +import org.openforis.collect.earth.app.view.Messages; + +/** + * Enumeration of the aspects that Collect Earth can use to classify the plots. + * Each aspect has an ID attach to it and represents a 45 dregree range ( -22.5 to 22.5 for North, 22.5 to 67.5 to North East, 66.5 to 112.5 for East + * and so on) + * The enumeration also has an static method to calculate the + * + * @author Alfonso Sanchez-Paus Diaz + * + */ +public enum AspectCode { + N(Messages.getString("AspectCode.0"), 1), NE(Messages.getString("AspectCode.1"), 2), E(Messages.getString("AspectCode.2"), 3), SE(Messages.getString("AspectCode.3"), 4), S(Messages.getString("AspectCode.4"), 5), SW(Messages.getString("AspectCode.5"), 6), W(Messages.getString("AspectCode.6"), 7), NW(Messages.getString("AspectCode.7"), 8), NA( "NA", 9); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ + /** + * Utility method to get the aspect code ( N, N-E ... ) from the aspect in degrees + * + * @param aspect + * The aspect in degrees + * @return The aspect code corresponding to the aspect in degrees. + */ + public static AspectCode getAspectCode(Double aspect) { + double aspectProc = aspect + 22.5d; // North starts at -22.5, so add 22.5 to normalize so north becomes 0-45 , north east 45-90 and so on.. + if (aspectProc >= 360d) { + aspectProc = aspectProc - 360d; + } + final int modulo = (int) Math.floor(aspectProc / 45d); + return AspectCode.values()[modulo]; } - public void fixCoordinates(){ - List allRecords = getAllRecords(); - - if( shouldStopFixing()){ - return; - } - - for (CollectRecordSummary summaryCollectRecord : allRecords) { - if( shouldStopFixing()){ - break; - } - try { - CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); - CoordinateAttribute plotCoord = (CoordinateAttribute) collectRecord.getNodeByPath("/plot/location"); //$NON-NLS-1$ - if( plotCoord != null && plotCoord.getValue() != null ){ - if( plotCoord.getValue().getX() < getLongitudeLimit() ){ - Coordinate coordinate = new Coordinate(plotCoord.getValue().getY(), plotCoord.getValue().getX(), plotCoord.getValue().getSrsId() ); - plotCoord.setValue( coordinate ); - recordManager.save( collectRecord ); - - } + private String label; + private int id; - } - } catch (Exception e) { - logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ - } - } - + private AspectCode(String label, int id) { + this.label = label; + this.id = id; } - protected abstract int getLongitudeLimit(); + public int getId() { + return id; + } - private boolean shouldStopFixing() { - return stopFix; + public String getLabel() { + return label; } - public void stopFixing() { - stopFix = true; + public void setId(int id) { + this.id = id; + } + @Override + public String toString() { + return label; } -} \ No newline at end of file +} From 0bb88bfca76a8f4e4f6d066bd180d58033ec0057 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:40 +0100 Subject: [PATCH 0965/1620] New translations AspectCode.java (English) --- .../earth/app/view/Messages_en.properties | 56 ++++++++----------- 1 file changed, 22 insertions(+), 34 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index eb2152ecb3..dfaad035c3 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -3,51 +3,39 @@ package org.openforis.collect.earth.app.model; import org.openforis.collect.earth.app.view.Messages; /** - * Slope codes by range associated to a slope in degrees ( 0-5 degrees flat, 6-15 slight, 15-30 steep and so on) + * Enumeration of the aspects that Collect Earth can use to classify the plots. + * Each aspect has an ID attach to it and represents a 45 dregree range ( -22.5 to 22.5 for North, 22.5 to 67.5 to North East, 66.5 to 112.5 for East + * and so on) + * The enumeration also has an static method to calculate the + * * @author Alfonso Sanchez-Paus Diaz - * + * */ -public enum SlopeCode { - FLAT(Messages.getString("SlopeCode.0"), 1, 0, 5), SLIGHT("6-15", 2, 6, 15), STEEP("16-30", 3, 16, 30), VERY_STEEP("31-45", 4, 31, 45), EXTREME("46-60", 5, 46, 60), FALL( //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ - "61-90", 6, 61, 90), NA("NA", 7, -1, -1); //$NON-NLS-1$ //$NON-NLS-2$ - - +public enum AspectCode { + N(Messages.getString("AspectCode.0"), 1), NE(Messages.getString("AspectCode.1"), 2), E(Messages.getString("AspectCode.2"), 3), SE(Messages.getString("AspectCode.3"), 4), S(Messages.getString("AspectCode.4"), 5), SW(Messages.getString("AspectCode.5"), 6), W(Messages.getString("AspectCode.6"), 7), NW(Messages.getString("AspectCode.7"), 8), NA( "NA", 9); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ /** - * Utility method to calculate the slope-code for a given slope in degrees. - * @param slope The slope in degrees - * @return The slope code for the given slope in degrees. + * Utility method to get the aspect code ( N, N-E ... ) from the aspect in degrees + * + * @param aspect + * The aspect in degrees + * @return The aspect code corresponding to the aspect in degrees. */ - public static SlopeCode getSlopeCode(int slope) { - - final SlopeCode[] slopeCodes = SlopeCode.values(); - for (final SlopeCode slopeCode : slopeCodes) { - if (slope >= slopeCode.getStartSlope() && slope <= slopeCode.getEndSlope()) { - return slopeCode; - } + public static AspectCode getAspectCode(Double aspect) { + double aspectProc = aspect + 22.5d; // North starts at -22.5, so add 22.5 to normalize so north becomes 0-45 , north east 45-90 and so on.. + if (aspectProc >= 360d) { + aspectProc = aspectProc - 360d; } - return null; - + final int modulo = (int) Math.floor(aspectProc / 45d); + return AspectCode.values()[modulo]; } private String label; private int id; - - /** - * The start and end of the range used to classify a slope code. - */ - private int startSlope, endSlope; - - private SlopeCode(String label, int id, int startSlope, int endSlope) { + private AspectCode(String label, int id) { this.label = label; this.id = id; - this.startSlope = startSlope; - this.endSlope = endSlope; - } - - public int getEndSlope() { - return endSlope; } public int getId() { @@ -58,8 +46,8 @@ public enum SlopeCode { return label; } - public int getStartSlope() { - return startSlope; + public void setId(int id) { + this.id = id; } @Override From 77bc83097c7c06b03dadf6415457b3018df361fa Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:42 +0100 Subject: [PATCH 0966/1620] New translations DynamicsCode.java (French) --- .../earth/app/view/Messages_fr.properties | 124 +++++++----------- 1 file changed, 47 insertions(+), 77 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 268889968b..f5ef63f5c6 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,90 +1,60 @@ -package org.openforis.collect.earth.app.ad_hoc; - -import java.util.HashMap; -import java.util.Map; +package org.openforis.collect.earth.app.model; import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.view.Messages; +/** + * Enumeration of the dynamics that Collect Earth can use to classify the plots. + * + * @author Alfonso Sanchez-Paus Diaz + * + */ +public enum DynamicsCode { + FROM_FOREST(Messages.getString("DynamicsCode.0"), 1), FROM_GRASSLAND(Messages.getString("DynamicsCode.1"), 3), FROM_SETTLEMENT(Messages.getString("DynamicsCode.2"), 4), FROM_OTHERLAND(Messages.getString("DynamicsCode.3"), 5), FROM_WETLAND(Messages.getString("DynamicsCode.4"), 6), FROM_CROPLAND(Messages.getString("DynamicsCode.5"), 7), NA("NA", 8); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ + private String label; + private int id; -public class AluToolUtils { - - - /** - * Returns the climate zone code according to the ALU tool rules - * @param elevation The elevation at the plot center point in meters - * @param precipitation The precipitation in mm per year - * @param shortDrySeason If the dry season is shorter or equal to 5 months (true) or not - * @return The climate zone according to the ALU tool documentation - */ - public String getClimateZone( int elevation, int precipitation, boolean shortDrySeason ){ - - String climateName = null; - - if( elevation < 1000 && precipitation < 1000 ){ // Tropical Dry - climateName = "TRD"; //$NON-NLS-1$ - }else if( elevation < 1000 && ( precipitation >= 1000 && precipitation < 2000) && !shortDrySeason ){ // Tropical Moist, Long Dry Season - climateName = "TMLD"; //$NON-NLS-1$ - }else if( elevation < 1000 && ( precipitation >= 1000 && precipitation < 2000) && shortDrySeason ){ // Tropical Moist, Short Dry Season - climateName = "TMSD"; //$NON-NLS-1$ - }else if( elevation >= 1000 && precipitation < 1000 ){ // Tropical Montane Dry - climateName = "TRMD"; //$NON-NLS-1$ - }else if( elevation >= 1000 && precipitation >= 1000 ){ // Tropical Montane Moist - climateName = "TRMM"; //$NON-NLS-1$ - }else if( elevation < 1000 && precipitation >= 2000 ){ // Tropical Wet - climateName = "TRW"; //$NON-NLS-1$ - } - - return climateName; + private DynamicsCode(String label, int id) { + this.label = label; + this.id = id; } - - public String getSoilType( String initialSoilGroup ){ - - if( StringUtils.isBlank(initialSoilGroup) ){ - return "N/A"; //$NON-NLS-1$ - } - - Map fundamentalToSoilGroup = new HashMap<>(); - - fundamentalToSoilGroup.put("B", "HAC"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("L", "HAC"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("P", "VOL"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("V", "VOL"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("S", "SAN"); // SAN+POD //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("Z", "LAC"); // LAc+HAC //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("T", "SAN"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("A", "LAC"); // LAC+WET //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("C", "LAC"); //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("G", "LAC"); // LAC+HAC //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("W", "ORG"); // ORG+WET //$NON-NLS-1$ //$NON-NLS-2$ - fundamentalToSoilGroup.put("M", "WET"); //$NON-NLS-1$ //$NON-NLS-2$ - - return fundamentalToSoilGroup.get(initialSoilGroup); + + public int getId() { + return id; } - - - public String getAluSubclass( String collectEarthSubclass ){ - if( StringUtils.isBlank(collectEarthSubclass) ){ - return "N/A"; //$NON-NLS-1$ - } - String aluSubClass = collectEarthSubclass.replace("to", ""); //$NON-NLS-1$ //$NON-NLS-2$ - aluSubClass = aluSubClass.replace("L", ""); //$NON-NLS-1$ //$NON-NLS-2$ - aluSubClass = aluSubClass.replace("T", ""); //$NON-NLS-1$ //$NON-NLS-2$ - return aluSubClass; + + public String getLabel() { + return label; } - - /** - * Returns the lower bracket of the precipitation range - * @param precipitationRange expects values like "0-100" or "2000-2100" - * @return the lowest bracket of the range. So for "0-100" it would return 0 - */ - public Integer getPrecipitationFromRange(String precipitationRange){ - String lowerBracket = precipitationRange.substring(0, precipitationRange.indexOf('-')).trim(); - if( lowerBracket.length() > 0 ){ - return Integer.parseInt(lowerBracket); + + public void setId(int id) { + this.id = id; + } + + @Override + public String toString() { + return label; + } + + public static Integer getDynamicsCode(String landUseSubcategory) { + if( landUseSubcategory.startsWith("FLto") ){ //$NON-NLS-1$ + return FROM_FOREST.getId(); + }else if( landUseSubcategory.startsWith("CLto") ){ //$NON-NLS-1$ + return FROM_CROPLAND.getId(); + }else if( landUseSubcategory.startsWith("SLto") ){ //$NON-NLS-1$ + return FROM_SETTLEMENT.getId(); + }else if( landUseSubcategory.startsWith("WLto") ){ //$NON-NLS-1$ + return FROM_WETLAND.getId(); + }else if( landUseSubcategory.startsWith("GLto") ){ //$NON-NLS-1$ + return FROM_GRASSLAND.getId(); + }else if( landUseSubcategory.startsWith("OLto") || landUseSubcategory.startsWith("OTto")){ //$NON-NLS-1$ //$NON-NLS-2$ + return FROM_OTHERLAND.getId(); + }else if ( StringUtils.isBlank( landUseSubcategory )) { + throw new IllegalArgumentException("The land use subcategory " + landUseSubcategory + " is not recognizable."); //$NON-NLS-1$ //$NON-NLS-2$ }else{ - return -1; + return NA.getId(); } } From eac4331a6ddbed2603ddcd190c37b25abcc4a1c6 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:43 +0100 Subject: [PATCH 0967/1620] New translations DynamicsCode.java (Spanish) --- .../earth/app/view/Messages_es.properties | 111 ++++++++---------- 1 file changed, 46 insertions(+), 65 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 6e034a1981..f5ef63f5c6 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,80 +1,61 @@ -package org.openforis.collect.earth.app.ad_hoc; +package org.openforis.collect.earth.app.model; -import java.util.List; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.view.Messages; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.manager.RecordManager; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.CollectRecordSummary; -import org.openforis.collect.model.RecordFilter; -import org.openforis.idm.model.Coordinate; -import org.openforis.idm.model.CoordinateAttribute; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; +/** + * Enumeration of the dynamics that Collect Earth can use to classify the plots. + * + * @author Alfonso Sanchez-Paus Diaz + * + */ +public enum DynamicsCode { + FROM_FOREST(Messages.getString("DynamicsCode.0"), 1), FROM_GRASSLAND(Messages.getString("DynamicsCode.1"), 3), FROM_SETTLEMENT(Messages.getString("DynamicsCode.2"), 4), FROM_OTHERLAND(Messages.getString("DynamicsCode.3"), 5), FROM_WETLAND(Messages.getString("DynamicsCode.4"), 6), FROM_CROPLAND(Messages.getString("DynamicsCode.5"), 7), NA("NA", 8); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ -@Component -public abstract class FixOtherLand { + private String label; - @Autowired - private RecordManager recordManager; + private int id; - @Autowired - private EarthSurveyService earthSurveyService; - - private Logger logger = LoggerFactory.getLogger( FixOtherLand.class); - - private boolean stopFix = false; - - private List getAllRecords(){ - RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); - List records = recordManager.loadSummaries( rf ); - return records; + private DynamicsCode(String label, int id) { + this.label = label; + this.id = id; } - public void fixCoordinates(){ - List allRecords = getAllRecords(); - - if( shouldStopFixing()){ - return; - } - - for (CollectRecordSummary summaryCollectRecord : allRecords) { - if( shouldStopFixing()){ - break; - } - try { - CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); - CoordinateAttribute plotCoord = (CoordinateAttribute) collectRecord.getNodeByPath("/plot/location"); //$NON-NLS-1$ - if( plotCoord != null && plotCoord.getValue() != null ){ - if( plotCoord.getValue().getX() < getLongitudeLimit() ){ - Coordinate coordinate = new Coordinate(plotCoord.getValue().getY(), plotCoord.getValue().getX(), plotCoord.getValue().getSrsId() ); - plotCoord.setValue( coordinate ); - recordManager.save( collectRecord ); - - } - - - } - } catch (Exception e) { - logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ - } - } - + public int getId() { + return id; } - protected abstract int getLongitudeLimit(); + public String getLabel() { + return label; + } - private boolean shouldStopFixing() { - return stopFix; + public void setId(int id) { + this.id = id; } - public void stopFixing() { - stopFix = true; + @Override + public String toString() { + return label; + } + public static Integer getDynamicsCode(String landUseSubcategory) { + if( landUseSubcategory.startsWith("FLto") ){ //$NON-NLS-1$ + return FROM_FOREST.getId(); + }else if( landUseSubcategory.startsWith("CLto") ){ //$NON-NLS-1$ + return FROM_CROPLAND.getId(); + }else if( landUseSubcategory.startsWith("SLto") ){ //$NON-NLS-1$ + return FROM_SETTLEMENT.getId(); + }else if( landUseSubcategory.startsWith("WLto") ){ //$NON-NLS-1$ + return FROM_WETLAND.getId(); + }else if( landUseSubcategory.startsWith("GLto") ){ //$NON-NLS-1$ + return FROM_GRASSLAND.getId(); + }else if( landUseSubcategory.startsWith("OLto") || landUseSubcategory.startsWith("OTto")){ //$NON-NLS-1$ //$NON-NLS-2$ + return FROM_OTHERLAND.getId(); + }else if ( StringUtils.isBlank( landUseSubcategory )) { + throw new IllegalArgumentException("The land use subcategory " + landUseSubcategory + " is not recognizable."); //$NON-NLS-1$ //$NON-NLS-2$ + }else{ + return NA.getId(); + } } -} \ No newline at end of file +} From d334fa52395b1350b53dd084ecdfd3e1290a365f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:44 +0100 Subject: [PATCH 0968/1620] New translations DynamicsCode.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 47 ++++++++++--------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index dfaad035c3..f5ef63f5c6 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,39 +1,22 @@ package org.openforis.collect.earth.app.model; +import org.apache.commons.lang3.StringUtils; import org.openforis.collect.earth.app.view.Messages; /** - * Enumeration of the aspects that Collect Earth can use to classify the plots. - * Each aspect has an ID attach to it and represents a 45 dregree range ( -22.5 to 22.5 for North, 22.5 to 67.5 to North East, 66.5 to 112.5 for East - * and so on) - * The enumeration also has an static method to calculate the + * Enumeration of the dynamics that Collect Earth can use to classify the plots. * * @author Alfonso Sanchez-Paus Diaz * */ -public enum AspectCode { - N(Messages.getString("AspectCode.0"), 1), NE(Messages.getString("AspectCode.1"), 2), E(Messages.getString("AspectCode.2"), 3), SE(Messages.getString("AspectCode.3"), 4), S(Messages.getString("AspectCode.4"), 5), SW(Messages.getString("AspectCode.5"), 6), W(Messages.getString("AspectCode.6"), 7), NW(Messages.getString("AspectCode.7"), 8), NA( "NA", 9); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ - /** - * Utility method to get the aspect code ( N, N-E ... ) from the aspect in degrees - * - * @param aspect - * The aspect in degrees - * @return The aspect code corresponding to the aspect in degrees. - */ - public static AspectCode getAspectCode(Double aspect) { - double aspectProc = aspect + 22.5d; // North starts at -22.5, so add 22.5 to normalize so north becomes 0-45 , north east 45-90 and so on.. - if (aspectProc >= 360d) { - aspectProc = aspectProc - 360d; - } - final int modulo = (int) Math.floor(aspectProc / 45d); - return AspectCode.values()[modulo]; - } +public enum DynamicsCode { + FROM_FOREST(Messages.getString("DynamicsCode.0"), 1), FROM_GRASSLAND(Messages.getString("DynamicsCode.1"), 3), FROM_SETTLEMENT(Messages.getString("DynamicsCode.2"), 4), FROM_OTHERLAND(Messages.getString("DynamicsCode.3"), 5), FROM_WETLAND(Messages.getString("DynamicsCode.4"), 6), FROM_CROPLAND(Messages.getString("DynamicsCode.5"), 7), NA("NA", 8); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ private String label; private int id; - private AspectCode(String label, int id) { + private DynamicsCode(String label, int id) { this.label = label; this.id = id; } @@ -55,4 +38,24 @@ public enum AspectCode { return label; } + public static Integer getDynamicsCode(String landUseSubcategory) { + if( landUseSubcategory.startsWith("FLto") ){ //$NON-NLS-1$ + return FROM_FOREST.getId(); + }else if( landUseSubcategory.startsWith("CLto") ){ //$NON-NLS-1$ + return FROM_CROPLAND.getId(); + }else if( landUseSubcategory.startsWith("SLto") ){ //$NON-NLS-1$ + return FROM_SETTLEMENT.getId(); + }else if( landUseSubcategory.startsWith("WLto") ){ //$NON-NLS-1$ + return FROM_WETLAND.getId(); + }else if( landUseSubcategory.startsWith("GLto") ){ //$NON-NLS-1$ + return FROM_GRASSLAND.getId(); + }else if( landUseSubcategory.startsWith("OLto") || landUseSubcategory.startsWith("OTto")){ //$NON-NLS-1$ //$NON-NLS-2$ + return FROM_OTHERLAND.getId(); + }else if ( StringUtils.isBlank( landUseSubcategory )) { + throw new IllegalArgumentException("The land use subcategory " + landUseSubcategory + " is not recognizable."); //$NON-NLS-1$ //$NON-NLS-2$ + }else{ + return NA.getId(); + } + } + } From ad4a97725d307a5f8865bb47d1ba543d50dc8d2a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:45 +0100 Subject: [PATCH 0969/1620] New translations DynamicsCode.java (English) --- .../earth/app/view/Messages_en.properties | 47 ++++++++++--------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index dfaad035c3..f5ef63f5c6 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,39 +1,22 @@ package org.openforis.collect.earth.app.model; +import org.apache.commons.lang3.StringUtils; import org.openforis.collect.earth.app.view.Messages; /** - * Enumeration of the aspects that Collect Earth can use to classify the plots. - * Each aspect has an ID attach to it and represents a 45 dregree range ( -22.5 to 22.5 for North, 22.5 to 67.5 to North East, 66.5 to 112.5 for East - * and so on) - * The enumeration also has an static method to calculate the + * Enumeration of the dynamics that Collect Earth can use to classify the plots. * * @author Alfonso Sanchez-Paus Diaz * */ -public enum AspectCode { - N(Messages.getString("AspectCode.0"), 1), NE(Messages.getString("AspectCode.1"), 2), E(Messages.getString("AspectCode.2"), 3), SE(Messages.getString("AspectCode.3"), 4), S(Messages.getString("AspectCode.4"), 5), SW(Messages.getString("AspectCode.5"), 6), W(Messages.getString("AspectCode.6"), 7), NW(Messages.getString("AspectCode.7"), 8), NA( "NA", 9); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ - /** - * Utility method to get the aspect code ( N, N-E ... ) from the aspect in degrees - * - * @param aspect - * The aspect in degrees - * @return The aspect code corresponding to the aspect in degrees. - */ - public static AspectCode getAspectCode(Double aspect) { - double aspectProc = aspect + 22.5d; // North starts at -22.5, so add 22.5 to normalize so north becomes 0-45 , north east 45-90 and so on.. - if (aspectProc >= 360d) { - aspectProc = aspectProc - 360d; - } - final int modulo = (int) Math.floor(aspectProc / 45d); - return AspectCode.values()[modulo]; - } +public enum DynamicsCode { + FROM_FOREST(Messages.getString("DynamicsCode.0"), 1), FROM_GRASSLAND(Messages.getString("DynamicsCode.1"), 3), FROM_SETTLEMENT(Messages.getString("DynamicsCode.2"), 4), FROM_OTHERLAND(Messages.getString("DynamicsCode.3"), 5), FROM_WETLAND(Messages.getString("DynamicsCode.4"), 6), FROM_CROPLAND(Messages.getString("DynamicsCode.5"), 7), NA("NA", 8); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ private String label; private int id; - private AspectCode(String label, int id) { + private DynamicsCode(String label, int id) { this.label = label; this.id = id; } @@ -55,4 +38,24 @@ public enum AspectCode { return label; } + public static Integer getDynamicsCode(String landUseSubcategory) { + if( landUseSubcategory.startsWith("FLto") ){ //$NON-NLS-1$ + return FROM_FOREST.getId(); + }else if( landUseSubcategory.startsWith("CLto") ){ //$NON-NLS-1$ + return FROM_CROPLAND.getId(); + }else if( landUseSubcategory.startsWith("SLto") ){ //$NON-NLS-1$ + return FROM_SETTLEMENT.getId(); + }else if( landUseSubcategory.startsWith("WLto") ){ //$NON-NLS-1$ + return FROM_WETLAND.getId(); + }else if( landUseSubcategory.startsWith("GLto") ){ //$NON-NLS-1$ + return FROM_GRASSLAND.getId(); + }else if( landUseSubcategory.startsWith("OLto") || landUseSubcategory.startsWith("OTto")){ //$NON-NLS-1$ //$NON-NLS-2$ + return FROM_OTHERLAND.getId(); + }else if ( StringUtils.isBlank( landUseSubcategory )) { + throw new IllegalArgumentException("The land use subcategory " + landUseSubcategory + " is not recognizable."); //$NON-NLS-1$ //$NON-NLS-2$ + }else{ + return NA.getId(); + } + } + } From 8a41732e5c17aa9b72149f7386dda115dbc0a99c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:47 +0100 Subject: [PATCH 0970/1620] New translations SlopeCode.java (French) --- .../earth/app/view/Messages_fr.properties | 67 +++++++++++-------- 1 file changed, 38 insertions(+), 29 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index f5ef63f5c6..eb2152ecb3 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,24 +1,53 @@ package org.openforis.collect.earth.app.model; -import org.apache.commons.lang3.StringUtils; import org.openforis.collect.earth.app.view.Messages; /** - * Enumeration of the dynamics that Collect Earth can use to classify the plots. - * + * Slope codes by range associated to a slope in degrees ( 0-5 degrees flat, 6-15 slight, 15-30 steep and so on) * @author Alfonso Sanchez-Paus Diaz - * + * */ -public enum DynamicsCode { - FROM_FOREST(Messages.getString("DynamicsCode.0"), 1), FROM_GRASSLAND(Messages.getString("DynamicsCode.1"), 3), FROM_SETTLEMENT(Messages.getString("DynamicsCode.2"), 4), FROM_OTHERLAND(Messages.getString("DynamicsCode.3"), 5), FROM_WETLAND(Messages.getString("DynamicsCode.4"), 6), FROM_CROPLAND(Messages.getString("DynamicsCode.5"), 7), NA("NA", 8); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ +public enum SlopeCode { + FLAT(Messages.getString("SlopeCode.0"), 1, 0, 5), SLIGHT("6-15", 2, 6, 15), STEEP("16-30", 3, 16, 30), VERY_STEEP("31-45", 4, 31, 45), EXTREME("46-60", 5, 46, 60), FALL( //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ + "61-90", 6, 61, 90), NA("NA", 7, -1, -1); //$NON-NLS-1$ //$NON-NLS-2$ + + + /** + * Utility method to calculate the slope-code for a given slope in degrees. + * @param slope The slope in degrees + * @return The slope code for the given slope in degrees. + */ + public static SlopeCode getSlopeCode(int slope) { + + final SlopeCode[] slopeCodes = SlopeCode.values(); + for (final SlopeCode slopeCode : slopeCodes) { + if (slope >= slopeCode.getStartSlope() && slope <= slopeCode.getEndSlope()) { + return slopeCode; + } + } + return null; + + } private String label; private int id; + + /** + * The start and end of the range used to classify a slope code. + */ + private int startSlope, endSlope; + - private DynamicsCode(String label, int id) { + private SlopeCode(String label, int id, int startSlope, int endSlope) { this.label = label; this.id = id; + this.startSlope = startSlope; + this.endSlope = endSlope; + } + + public int getEndSlope() { + return endSlope; } public int getId() { @@ -29,8 +58,8 @@ public enum DynamicsCode { return label; } - public void setId(int id) { - this.id = id; + public int getStartSlope() { + return startSlope; } @Override @@ -38,24 +67,4 @@ public enum DynamicsCode { return label; } - public static Integer getDynamicsCode(String landUseSubcategory) { - if( landUseSubcategory.startsWith("FLto") ){ //$NON-NLS-1$ - return FROM_FOREST.getId(); - }else if( landUseSubcategory.startsWith("CLto") ){ //$NON-NLS-1$ - return FROM_CROPLAND.getId(); - }else if( landUseSubcategory.startsWith("SLto") ){ //$NON-NLS-1$ - return FROM_SETTLEMENT.getId(); - }else if( landUseSubcategory.startsWith("WLto") ){ //$NON-NLS-1$ - return FROM_WETLAND.getId(); - }else if( landUseSubcategory.startsWith("GLto") ){ //$NON-NLS-1$ - return FROM_GRASSLAND.getId(); - }else if( landUseSubcategory.startsWith("OLto") || landUseSubcategory.startsWith("OTto")){ //$NON-NLS-1$ //$NON-NLS-2$ - return FROM_OTHERLAND.getId(); - }else if ( StringUtils.isBlank( landUseSubcategory )) { - throw new IllegalArgumentException("The land use subcategory " + landUseSubcategory + " is not recognizable."); //$NON-NLS-1$ //$NON-NLS-2$ - }else{ - return NA.getId(); - } - } - } From 0311ff0625d3c2f47ab3ee68929350cc3353e2b6 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:48 +0100 Subject: [PATCH 0971/1620] New translations SlopeCode.java (Spanish) --- .../earth/app/view/Messages_es.properties | 67 +++++++++++-------- 1 file changed, 38 insertions(+), 29 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index f5ef63f5c6..eb2152ecb3 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,24 +1,53 @@ package org.openforis.collect.earth.app.model; -import org.apache.commons.lang3.StringUtils; import org.openforis.collect.earth.app.view.Messages; /** - * Enumeration of the dynamics that Collect Earth can use to classify the plots. - * + * Slope codes by range associated to a slope in degrees ( 0-5 degrees flat, 6-15 slight, 15-30 steep and so on) * @author Alfonso Sanchez-Paus Diaz - * + * */ -public enum DynamicsCode { - FROM_FOREST(Messages.getString("DynamicsCode.0"), 1), FROM_GRASSLAND(Messages.getString("DynamicsCode.1"), 3), FROM_SETTLEMENT(Messages.getString("DynamicsCode.2"), 4), FROM_OTHERLAND(Messages.getString("DynamicsCode.3"), 5), FROM_WETLAND(Messages.getString("DynamicsCode.4"), 6), FROM_CROPLAND(Messages.getString("DynamicsCode.5"), 7), NA("NA", 8); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ +public enum SlopeCode { + FLAT(Messages.getString("SlopeCode.0"), 1, 0, 5), SLIGHT("6-15", 2, 6, 15), STEEP("16-30", 3, 16, 30), VERY_STEEP("31-45", 4, 31, 45), EXTREME("46-60", 5, 46, 60), FALL( //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ + "61-90", 6, 61, 90), NA("NA", 7, -1, -1); //$NON-NLS-1$ //$NON-NLS-2$ + + + /** + * Utility method to calculate the slope-code for a given slope in degrees. + * @param slope The slope in degrees + * @return The slope code for the given slope in degrees. + */ + public static SlopeCode getSlopeCode(int slope) { + + final SlopeCode[] slopeCodes = SlopeCode.values(); + for (final SlopeCode slopeCode : slopeCodes) { + if (slope >= slopeCode.getStartSlope() && slope <= slopeCode.getEndSlope()) { + return slopeCode; + } + } + return null; + + } private String label; private int id; + + /** + * The start and end of the range used to classify a slope code. + */ + private int startSlope, endSlope; + - private DynamicsCode(String label, int id) { + private SlopeCode(String label, int id, int startSlope, int endSlope) { this.label = label; this.id = id; + this.startSlope = startSlope; + this.endSlope = endSlope; + } + + public int getEndSlope() { + return endSlope; } public int getId() { @@ -29,8 +58,8 @@ public enum DynamicsCode { return label; } - public void setId(int id) { - this.id = id; + public int getStartSlope() { + return startSlope; } @Override @@ -38,24 +67,4 @@ public enum DynamicsCode { return label; } - public static Integer getDynamicsCode(String landUseSubcategory) { - if( landUseSubcategory.startsWith("FLto") ){ //$NON-NLS-1$ - return FROM_FOREST.getId(); - }else if( landUseSubcategory.startsWith("CLto") ){ //$NON-NLS-1$ - return FROM_CROPLAND.getId(); - }else if( landUseSubcategory.startsWith("SLto") ){ //$NON-NLS-1$ - return FROM_SETTLEMENT.getId(); - }else if( landUseSubcategory.startsWith("WLto") ){ //$NON-NLS-1$ - return FROM_WETLAND.getId(); - }else if( landUseSubcategory.startsWith("GLto") ){ //$NON-NLS-1$ - return FROM_GRASSLAND.getId(); - }else if( landUseSubcategory.startsWith("OLto") || landUseSubcategory.startsWith("OTto")){ //$NON-NLS-1$ //$NON-NLS-2$ - return FROM_OTHERLAND.getId(); - }else if ( StringUtils.isBlank( landUseSubcategory )) { - throw new IllegalArgumentException("The land use subcategory " + landUseSubcategory + " is not recognizable."); //$NON-NLS-1$ //$NON-NLS-2$ - }else{ - return NA.getId(); - } - } - } From 8bae717fe7e67280ab2dc56d6fbbe79eb023f8e2 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:49 +0100 Subject: [PATCH 0972/1620] New translations SlopeCode.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 67 +++++++++++-------- 1 file changed, 38 insertions(+), 29 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index f5ef63f5c6..eb2152ecb3 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,24 +1,53 @@ package org.openforis.collect.earth.app.model; -import org.apache.commons.lang3.StringUtils; import org.openforis.collect.earth.app.view.Messages; /** - * Enumeration of the dynamics that Collect Earth can use to classify the plots. - * + * Slope codes by range associated to a slope in degrees ( 0-5 degrees flat, 6-15 slight, 15-30 steep and so on) * @author Alfonso Sanchez-Paus Diaz - * + * */ -public enum DynamicsCode { - FROM_FOREST(Messages.getString("DynamicsCode.0"), 1), FROM_GRASSLAND(Messages.getString("DynamicsCode.1"), 3), FROM_SETTLEMENT(Messages.getString("DynamicsCode.2"), 4), FROM_OTHERLAND(Messages.getString("DynamicsCode.3"), 5), FROM_WETLAND(Messages.getString("DynamicsCode.4"), 6), FROM_CROPLAND(Messages.getString("DynamicsCode.5"), 7), NA("NA", 8); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ +public enum SlopeCode { + FLAT(Messages.getString("SlopeCode.0"), 1, 0, 5), SLIGHT("6-15", 2, 6, 15), STEEP("16-30", 3, 16, 30), VERY_STEEP("31-45", 4, 31, 45), EXTREME("46-60", 5, 46, 60), FALL( //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ + "61-90", 6, 61, 90), NA("NA", 7, -1, -1); //$NON-NLS-1$ //$NON-NLS-2$ + + + /** + * Utility method to calculate the slope-code for a given slope in degrees. + * @param slope The slope in degrees + * @return The slope code for the given slope in degrees. + */ + public static SlopeCode getSlopeCode(int slope) { + + final SlopeCode[] slopeCodes = SlopeCode.values(); + for (final SlopeCode slopeCode : slopeCodes) { + if (slope >= slopeCode.getStartSlope() && slope <= slopeCode.getEndSlope()) { + return slopeCode; + } + } + return null; + + } private String label; private int id; + + /** + * The start and end of the range used to classify a slope code. + */ + private int startSlope, endSlope; + - private DynamicsCode(String label, int id) { + private SlopeCode(String label, int id, int startSlope, int endSlope) { this.label = label; this.id = id; + this.startSlope = startSlope; + this.endSlope = endSlope; + } + + public int getEndSlope() { + return endSlope; } public int getId() { @@ -29,8 +58,8 @@ public enum DynamicsCode { return label; } - public void setId(int id) { - this.id = id; + public int getStartSlope() { + return startSlope; } @Override @@ -38,24 +67,4 @@ public enum DynamicsCode { return label; } - public static Integer getDynamicsCode(String landUseSubcategory) { - if( landUseSubcategory.startsWith("FLto") ){ //$NON-NLS-1$ - return FROM_FOREST.getId(); - }else if( landUseSubcategory.startsWith("CLto") ){ //$NON-NLS-1$ - return FROM_CROPLAND.getId(); - }else if( landUseSubcategory.startsWith("SLto") ){ //$NON-NLS-1$ - return FROM_SETTLEMENT.getId(); - }else if( landUseSubcategory.startsWith("WLto") ){ //$NON-NLS-1$ - return FROM_WETLAND.getId(); - }else if( landUseSubcategory.startsWith("GLto") ){ //$NON-NLS-1$ - return FROM_GRASSLAND.getId(); - }else if( landUseSubcategory.startsWith("OLto") || landUseSubcategory.startsWith("OTto")){ //$NON-NLS-1$ //$NON-NLS-2$ - return FROM_OTHERLAND.getId(); - }else if ( StringUtils.isBlank( landUseSubcategory )) { - throw new IllegalArgumentException("The land use subcategory " + landUseSubcategory + " is not recognizable."); //$NON-NLS-1$ //$NON-NLS-2$ - }else{ - return NA.getId(); - } - } - } From 92da4aa25882586f1627987edeb71ed98c8d60c4 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:50 +0100 Subject: [PATCH 0973/1620] New translations BalloonServlet.java (French) --- .../earth/app/view/Messages_fr.properties | 151 ++++++++++++------ 1 file changed, 100 insertions(+), 51 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index eb2152ecb3..511ad9d567 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,70 +1,119 @@ -package org.openforis.collect.earth.app.model; +package org.openforis.collect.earth.app.server; -import org.openforis.collect.earth.app.view.Messages; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.regex.Pattern; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.io.FileUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.service.BrowserNotFoundException; +import org.openforis.collect.earth.app.service.BrowserService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; /** - * Slope codes by range associated to a slope in degrees ( 0-5 degrees flat, 6-15 slight, 15-30 steep and so on) + * This servlet is called by the balloon (KML pop-up form) when it is open and the user has chosen to see the form in a separate browser + * window. + * In that case a special HTML is used whose sole purpose is to load an invisible iframe that calls the URL localhot/openInBrowser + * This causes a new browser window to open and then the browser is redirected to another URL ( localhost/balloon ) that contains the actual HTML + * form. + * The functionality is used mostly for LINUX users due to the different bugs present in Google Earth for LINUX which makes the Bootstrap library + * fail. + * * @author Alfonso Sanchez-Paus Diaz * */ -public enum SlopeCode { - FLAT(Messages.getString("SlopeCode.0"), 1, 0, 5), SLIGHT("6-15", 2, 6, 15), STEEP("16-30", 3, 16, 30), VERY_STEEP("31-45", 4, 31, 45), EXTREME("46-60", 5, 46, 60), FALL( //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ - "61-90", 6, 61, 90), NA("NA", 7, -1, -1); //$NON-NLS-1$ //$NON-NLS-2$ - - - /** - * Utility method to calculate the slope-code for a given slope in degrees. - * @param slope The slope in degrees - * @return The slope code for the given slope in degrees. - */ - public static SlopeCode getSlopeCode(int slope) { - - final SlopeCode[] slopeCodes = SlopeCode.values(); - for (final SlopeCode slopeCode : slopeCodes) { - if (slope >= slopeCode.getStartSlope() && slope <= slopeCode.getEndSlope()) { - return slopeCode; - } - } - return null; +@Controller +public class BalloonServlet extends DataAccessingServlet { - } + @Autowired + private BrowserService browserService; - private String label; - - private int id; - - /** - * The start and end of the range used to classify a slope code. - */ - private int startSlope, endSlope; - - - private SlopeCode(String label, int id, int startSlope, int endSlope) { - this.label = label; - this.id = id; - this.startSlope = startSlope; - this.endSlope = endSlope; - } + @Autowired + private LocalPropertiesService localPropertiesService; - public int getEndSlope() { - return endSlope; - } + private RemoteWebDriver webKitDriver = null; + + private static final String BALLOON_EXTERNAL_URL = "balloon"; //$NON-NLS-1$ - public int getId() { - return id; + private String buildGetParameters(Map parameterMap) { + final StringBuilder getParameters = new StringBuilder(); + final Set> entrySet = parameterMap.entrySet(); + for (final Entry entry : entrySet) { + getParameters.append(entry.getKey()).append("=").append(entry.getValue()[0]).append("&"); //$NON-NLS-1$ //$NON-NLS-2$ + } + return getParameters.toString(); } - public String getLabel() { - return label; + @GetMapping("/openInBrowser") + public void openInBrowser(HttpServletResponse response, HttpServletRequest request, String imageName) { + String url = ServerController.getHostAddress(localPropertiesService.getHost(), localPropertiesService.getLocalPort()); + url = url + BALLOON_EXTERNAL_URL + "?" + buildGetParameters(request.getParameterMap()); //$NON-NLS-1$ + final String fUrl = url; + final Thread openBrowser = new Thread("Open URL in browser : " + fUrl) { + @Override + public void run() { + try { + webKitDriver = browserService.navigateTo(fUrl, webKitDriver, false); + } catch (BrowserNotFoundException e) { + logger.error("No browser found", e); //$NON-NLS-1$ + } + } + }; + openBrowser.start(); } - public int getStartSlope() { - return startSlope; + private String replaceGoalsWithParameters(String htmlWithGoals, Map parameterMap) { + final Set> entrySet = parameterMap.entrySet(); + for (final Entry entry : entrySet) { + htmlWithGoals = htmlWithGoals.replaceAll("\\$\\[" + Pattern.quote( entry.getKey() ) + "\\]", entry.getValue()[0]); //$NON-NLS-1$ //$NON-NLS-2$ + } + return htmlWithGoals; } - @Override - public String toString() { - return label; + @GetMapping("/"+BALLOON_EXTERNAL_URL) + public void returnBalloon(HttpServletResponse response, HttpServletRequest request, String imageName) throws IOException { + response.setHeader("Content-Type", "text/html"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Content-Disposition", "inline; filename=\"" + imageName + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Date", new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH).format(new Date())); //$NON-NLS-1$ + + String balloonContents = FileUtils.readFileToString( new File(localPropertiesService.getBalloonFile()), StandardCharsets.UTF_8 ); + + if (balloonContents != null) { + balloonContents = balloonContents.replace(EarthConstants.FOLDER_COPIED_TO_KMZ + "/", EarthConstants.GENERATED_FOLDER_SUFFIX + "/" //$NON-NLS-1$ //$NON-NLS-2$ + + EarthConstants.FOLDER_COPIED_TO_KMZ + "/"); //$NON-NLS-1$ + balloonContents = replaceGoalsWithParameters(balloonContents, request.getParameterMap()); + + final byte[] bytes = balloonContents.getBytes(); + response.setHeader("Content-Length", Integer.toString( bytes.length ) ); //$NON-NLS-1$ //$NON-NLS-2$ + writeToResponse(response, bytes); + } else { + getLogger().error("There was a problem fetching the balloon html, please check the name!"); //$NON-NLS-1$ + } } + private void writeToResponse(HttpServletResponse response, byte[] fileContents) throws IOException { + try { + response.getOutputStream().write(fileContents); + } catch (final Exception e) { + getLogger().error("Error writing reponse body to output stream ", e); //$NON-NLS-1$ + } finally { + response.getOutputStream().close(); + } + } } From 61335e36c43ae24d495a273ed50f3fc424dee113 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:51 +0100 Subject: [PATCH 0974/1620] New translations AspectCode.java (French) --- .../earth/app/view/Messages_fr.properties | 141 +++++------------- 1 file changed, 40 insertions(+), 101 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 511ad9d567..dfaad035c3 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,119 +1,58 @@ -package org.openforis.collect.earth.app.server; +package org.openforis.collect.earth.app.model; -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Locale; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.regex.Pattern; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.apache.commons.io.FileUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.desktop.ServerController; -import org.openforis.collect.earth.app.service.BrowserNotFoundException; -import org.openforis.collect.earth.app.service.BrowserService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openqa.selenium.remote.RemoteWebDriver; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; +import org.openforis.collect.earth.app.view.Messages; /** - * This servlet is called by the balloon (KML pop-up form) when it is open and the user has chosen to see the form in a separate browser - * window. - * In that case a special HTML is used whose sole purpose is to load an invisible iframe that calls the URL localhot/openInBrowser - * This causes a new browser window to open and then the browser is redirected to another URL ( localhost/balloon ) that contains the actual HTML - * form. - * The functionality is used mostly for LINUX users due to the different bugs present in Google Earth for LINUX which makes the Bootstrap library - * fail. - * + * Enumeration of the aspects that Collect Earth can use to classify the plots. + * Each aspect has an ID attach to it and represents a 45 dregree range ( -22.5 to 22.5 for North, 22.5 to 67.5 to North East, 66.5 to 112.5 for East + * and so on) + * The enumeration also has an static method to calculate the + * * @author Alfonso Sanchez-Paus Diaz - * + * */ -@Controller -public class BalloonServlet extends DataAccessingServlet { - - @Autowired - private BrowserService browserService; - - @Autowired - private LocalPropertiesService localPropertiesService; +public enum AspectCode { + N(Messages.getString("AspectCode.0"), 1), NE(Messages.getString("AspectCode.1"), 2), E(Messages.getString("AspectCode.2"), 3), SE(Messages.getString("AspectCode.3"), 4), S(Messages.getString("AspectCode.4"), 5), SW(Messages.getString("AspectCode.5"), 6), W(Messages.getString("AspectCode.6"), 7), NW(Messages.getString("AspectCode.7"), 8), NA( "NA", 9); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ + /** + * Utility method to get the aspect code ( N, N-E ... ) from the aspect in degrees + * + * @param aspect + * The aspect in degrees + * @return The aspect code corresponding to the aspect in degrees. + */ + public static AspectCode getAspectCode(Double aspect) { + double aspectProc = aspect + 22.5d; // North starts at -22.5, so add 22.5 to normalize so north becomes 0-45 , north east 45-90 and so on.. + if (aspectProc >= 360d) { + aspectProc = aspectProc - 360d; + } + final int modulo = (int) Math.floor(aspectProc / 45d); + return AspectCode.values()[modulo]; + } - private RemoteWebDriver webKitDriver = null; + private String label; - private static final String BALLOON_EXTERNAL_URL = "balloon"; //$NON-NLS-1$ + private int id; - private String buildGetParameters(Map parameterMap) { - final StringBuilder getParameters = new StringBuilder(); - final Set> entrySet = parameterMap.entrySet(); - for (final Entry entry : entrySet) { - getParameters.append(entry.getKey()).append("=").append(entry.getValue()[0]).append("&"); //$NON-NLS-1$ //$NON-NLS-2$ - } - return getParameters.toString(); + private AspectCode(String label, int id) { + this.label = label; + this.id = id; } - @GetMapping("/openInBrowser") - public void openInBrowser(HttpServletResponse response, HttpServletRequest request, String imageName) { - String url = ServerController.getHostAddress(localPropertiesService.getHost(), localPropertiesService.getLocalPort()); - url = url + BALLOON_EXTERNAL_URL + "?" + buildGetParameters(request.getParameterMap()); //$NON-NLS-1$ - final String fUrl = url; - final Thread openBrowser = new Thread("Open URL in browser : " + fUrl) { - @Override - public void run() { - try { - webKitDriver = browserService.navigateTo(fUrl, webKitDriver, false); - } catch (BrowserNotFoundException e) { - logger.error("No browser found", e); //$NON-NLS-1$ - } - } - }; - openBrowser.start(); + public int getId() { + return id; } - private String replaceGoalsWithParameters(String htmlWithGoals, Map parameterMap) { - final Set> entrySet = parameterMap.entrySet(); - for (final Entry entry : entrySet) { - htmlWithGoals = htmlWithGoals.replaceAll("\\$\\[" + Pattern.quote( entry.getKey() ) + "\\]", entry.getValue()[0]); //$NON-NLS-1$ //$NON-NLS-2$ - } - return htmlWithGoals; + public String getLabel() { + return label; } - @GetMapping("/"+BALLOON_EXTERNAL_URL) - public void returnBalloon(HttpServletResponse response, HttpServletRequest request, String imageName) throws IOException { - response.setHeader("Content-Type", "text/html"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Content-Disposition", "inline; filename=\"" + imageName + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Date", new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH).format(new Date())); //$NON-NLS-1$ - - String balloonContents = FileUtils.readFileToString( new File(localPropertiesService.getBalloonFile()), StandardCharsets.UTF_8 ); - - if (balloonContents != null) { - balloonContents = balloonContents.replace(EarthConstants.FOLDER_COPIED_TO_KMZ + "/", EarthConstants.GENERATED_FOLDER_SUFFIX + "/" //$NON-NLS-1$ //$NON-NLS-2$ - + EarthConstants.FOLDER_COPIED_TO_KMZ + "/"); //$NON-NLS-1$ - balloonContents = replaceGoalsWithParameters(balloonContents, request.getParameterMap()); - - final byte[] bytes = balloonContents.getBytes(); - response.setHeader("Content-Length", Integer.toString( bytes.length ) ); //$NON-NLS-1$ //$NON-NLS-2$ - writeToResponse(response, bytes); - } else { - getLogger().error("There was a problem fetching the balloon html, please check the name!"); //$NON-NLS-1$ - } + public void setId(int id) { + this.id = id; } - private void writeToResponse(HttpServletResponse response, byte[] fileContents) throws IOException { - try { - response.getOutputStream().write(fileContents); - } catch (final Exception e) { - getLogger().error("Error writing reponse body to output stream ", e); //$NON-NLS-1$ - } finally { - response.getOutputStream().close(); - } + @Override + public String toString() { + return label; } + } From 906a065d27d988dbb5db48e2afc71f5b2cc08d7a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:52 +0100 Subject: [PATCH 0975/1620] New translations BalloonServlet.java (Spanish) --- .../earth/app/view/Messages_es.properties | 151 ++++++++++++------ 1 file changed, 100 insertions(+), 51 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index eb2152ecb3..511ad9d567 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,70 +1,119 @@ -package org.openforis.collect.earth.app.model; +package org.openforis.collect.earth.app.server; -import org.openforis.collect.earth.app.view.Messages; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.regex.Pattern; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.io.FileUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.service.BrowserNotFoundException; +import org.openforis.collect.earth.app.service.BrowserService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; /** - * Slope codes by range associated to a slope in degrees ( 0-5 degrees flat, 6-15 slight, 15-30 steep and so on) + * This servlet is called by the balloon (KML pop-up form) when it is open and the user has chosen to see the form in a separate browser + * window. + * In that case a special HTML is used whose sole purpose is to load an invisible iframe that calls the URL localhot/openInBrowser + * This causes a new browser window to open and then the browser is redirected to another URL ( localhost/balloon ) that contains the actual HTML + * form. + * The functionality is used mostly for LINUX users due to the different bugs present in Google Earth for LINUX which makes the Bootstrap library + * fail. + * * @author Alfonso Sanchez-Paus Diaz * */ -public enum SlopeCode { - FLAT(Messages.getString("SlopeCode.0"), 1, 0, 5), SLIGHT("6-15", 2, 6, 15), STEEP("16-30", 3, 16, 30), VERY_STEEP("31-45", 4, 31, 45), EXTREME("46-60", 5, 46, 60), FALL( //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ - "61-90", 6, 61, 90), NA("NA", 7, -1, -1); //$NON-NLS-1$ //$NON-NLS-2$ - - - /** - * Utility method to calculate the slope-code for a given slope in degrees. - * @param slope The slope in degrees - * @return The slope code for the given slope in degrees. - */ - public static SlopeCode getSlopeCode(int slope) { - - final SlopeCode[] slopeCodes = SlopeCode.values(); - for (final SlopeCode slopeCode : slopeCodes) { - if (slope >= slopeCode.getStartSlope() && slope <= slopeCode.getEndSlope()) { - return slopeCode; - } - } - return null; +@Controller +public class BalloonServlet extends DataAccessingServlet { - } + @Autowired + private BrowserService browserService; - private String label; - - private int id; - - /** - * The start and end of the range used to classify a slope code. - */ - private int startSlope, endSlope; - - - private SlopeCode(String label, int id, int startSlope, int endSlope) { - this.label = label; - this.id = id; - this.startSlope = startSlope; - this.endSlope = endSlope; - } + @Autowired + private LocalPropertiesService localPropertiesService; - public int getEndSlope() { - return endSlope; - } + private RemoteWebDriver webKitDriver = null; + + private static final String BALLOON_EXTERNAL_URL = "balloon"; //$NON-NLS-1$ - public int getId() { - return id; + private String buildGetParameters(Map parameterMap) { + final StringBuilder getParameters = new StringBuilder(); + final Set> entrySet = parameterMap.entrySet(); + for (final Entry entry : entrySet) { + getParameters.append(entry.getKey()).append("=").append(entry.getValue()[0]).append("&"); //$NON-NLS-1$ //$NON-NLS-2$ + } + return getParameters.toString(); } - public String getLabel() { - return label; + @GetMapping("/openInBrowser") + public void openInBrowser(HttpServletResponse response, HttpServletRequest request, String imageName) { + String url = ServerController.getHostAddress(localPropertiesService.getHost(), localPropertiesService.getLocalPort()); + url = url + BALLOON_EXTERNAL_URL + "?" + buildGetParameters(request.getParameterMap()); //$NON-NLS-1$ + final String fUrl = url; + final Thread openBrowser = new Thread("Open URL in browser : " + fUrl) { + @Override + public void run() { + try { + webKitDriver = browserService.navigateTo(fUrl, webKitDriver, false); + } catch (BrowserNotFoundException e) { + logger.error("No browser found", e); //$NON-NLS-1$ + } + } + }; + openBrowser.start(); } - public int getStartSlope() { - return startSlope; + private String replaceGoalsWithParameters(String htmlWithGoals, Map parameterMap) { + final Set> entrySet = parameterMap.entrySet(); + for (final Entry entry : entrySet) { + htmlWithGoals = htmlWithGoals.replaceAll("\\$\\[" + Pattern.quote( entry.getKey() ) + "\\]", entry.getValue()[0]); //$NON-NLS-1$ //$NON-NLS-2$ + } + return htmlWithGoals; } - @Override - public String toString() { - return label; + @GetMapping("/"+BALLOON_EXTERNAL_URL) + public void returnBalloon(HttpServletResponse response, HttpServletRequest request, String imageName) throws IOException { + response.setHeader("Content-Type", "text/html"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Content-Disposition", "inline; filename=\"" + imageName + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Date", new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH).format(new Date())); //$NON-NLS-1$ + + String balloonContents = FileUtils.readFileToString( new File(localPropertiesService.getBalloonFile()), StandardCharsets.UTF_8 ); + + if (balloonContents != null) { + balloonContents = balloonContents.replace(EarthConstants.FOLDER_COPIED_TO_KMZ + "/", EarthConstants.GENERATED_FOLDER_SUFFIX + "/" //$NON-NLS-1$ //$NON-NLS-2$ + + EarthConstants.FOLDER_COPIED_TO_KMZ + "/"); //$NON-NLS-1$ + balloonContents = replaceGoalsWithParameters(balloonContents, request.getParameterMap()); + + final byte[] bytes = balloonContents.getBytes(); + response.setHeader("Content-Length", Integer.toString( bytes.length ) ); //$NON-NLS-1$ //$NON-NLS-2$ + writeToResponse(response, bytes); + } else { + getLogger().error("There was a problem fetching the balloon html, please check the name!"); //$NON-NLS-1$ + } } + private void writeToResponse(HttpServletResponse response, byte[] fileContents) throws IOException { + try { + response.getOutputStream().write(fileContents); + } catch (final Exception e) { + getLogger().error("Error writing reponse body to output stream ", e); //$NON-NLS-1$ + } finally { + response.getOutputStream().close(); + } + } } From 3b5ce8b032d2075368763ec3c6f933a6b78725d7 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:53 +0100 Subject: [PATCH 0976/1620] New translations BalloonServlet.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 151 ++++++++++++------ 1 file changed, 100 insertions(+), 51 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index eb2152ecb3..511ad9d567 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,70 +1,119 @@ -package org.openforis.collect.earth.app.model; +package org.openforis.collect.earth.app.server; -import org.openforis.collect.earth.app.view.Messages; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.regex.Pattern; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.io.FileUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.service.BrowserNotFoundException; +import org.openforis.collect.earth.app.service.BrowserService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; /** - * Slope codes by range associated to a slope in degrees ( 0-5 degrees flat, 6-15 slight, 15-30 steep and so on) + * This servlet is called by the balloon (KML pop-up form) when it is open and the user has chosen to see the form in a separate browser + * window. + * In that case a special HTML is used whose sole purpose is to load an invisible iframe that calls the URL localhot/openInBrowser + * This causes a new browser window to open and then the browser is redirected to another URL ( localhost/balloon ) that contains the actual HTML + * form. + * The functionality is used mostly for LINUX users due to the different bugs present in Google Earth for LINUX which makes the Bootstrap library + * fail. + * * @author Alfonso Sanchez-Paus Diaz * */ -public enum SlopeCode { - FLAT(Messages.getString("SlopeCode.0"), 1, 0, 5), SLIGHT("6-15", 2, 6, 15), STEEP("16-30", 3, 16, 30), VERY_STEEP("31-45", 4, 31, 45), EXTREME("46-60", 5, 46, 60), FALL( //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ - "61-90", 6, 61, 90), NA("NA", 7, -1, -1); //$NON-NLS-1$ //$NON-NLS-2$ - - - /** - * Utility method to calculate the slope-code for a given slope in degrees. - * @param slope The slope in degrees - * @return The slope code for the given slope in degrees. - */ - public static SlopeCode getSlopeCode(int slope) { - - final SlopeCode[] slopeCodes = SlopeCode.values(); - for (final SlopeCode slopeCode : slopeCodes) { - if (slope >= slopeCode.getStartSlope() && slope <= slopeCode.getEndSlope()) { - return slopeCode; - } - } - return null; +@Controller +public class BalloonServlet extends DataAccessingServlet { - } + @Autowired + private BrowserService browserService; - private String label; - - private int id; - - /** - * The start and end of the range used to classify a slope code. - */ - private int startSlope, endSlope; - - - private SlopeCode(String label, int id, int startSlope, int endSlope) { - this.label = label; - this.id = id; - this.startSlope = startSlope; - this.endSlope = endSlope; - } + @Autowired + private LocalPropertiesService localPropertiesService; - public int getEndSlope() { - return endSlope; - } + private RemoteWebDriver webKitDriver = null; + + private static final String BALLOON_EXTERNAL_URL = "balloon"; //$NON-NLS-1$ - public int getId() { - return id; + private String buildGetParameters(Map parameterMap) { + final StringBuilder getParameters = new StringBuilder(); + final Set> entrySet = parameterMap.entrySet(); + for (final Entry entry : entrySet) { + getParameters.append(entry.getKey()).append("=").append(entry.getValue()[0]).append("&"); //$NON-NLS-1$ //$NON-NLS-2$ + } + return getParameters.toString(); } - public String getLabel() { - return label; + @GetMapping("/openInBrowser") + public void openInBrowser(HttpServletResponse response, HttpServletRequest request, String imageName) { + String url = ServerController.getHostAddress(localPropertiesService.getHost(), localPropertiesService.getLocalPort()); + url = url + BALLOON_EXTERNAL_URL + "?" + buildGetParameters(request.getParameterMap()); //$NON-NLS-1$ + final String fUrl = url; + final Thread openBrowser = new Thread("Open URL in browser : " + fUrl) { + @Override + public void run() { + try { + webKitDriver = browserService.navigateTo(fUrl, webKitDriver, false); + } catch (BrowserNotFoundException e) { + logger.error("No browser found", e); //$NON-NLS-1$ + } + } + }; + openBrowser.start(); } - public int getStartSlope() { - return startSlope; + private String replaceGoalsWithParameters(String htmlWithGoals, Map parameterMap) { + final Set> entrySet = parameterMap.entrySet(); + for (final Entry entry : entrySet) { + htmlWithGoals = htmlWithGoals.replaceAll("\\$\\[" + Pattern.quote( entry.getKey() ) + "\\]", entry.getValue()[0]); //$NON-NLS-1$ //$NON-NLS-2$ + } + return htmlWithGoals; } - @Override - public String toString() { - return label; + @GetMapping("/"+BALLOON_EXTERNAL_URL) + public void returnBalloon(HttpServletResponse response, HttpServletRequest request, String imageName) throws IOException { + response.setHeader("Content-Type", "text/html"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Content-Disposition", "inline; filename=\"" + imageName + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Date", new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH).format(new Date())); //$NON-NLS-1$ + + String balloonContents = FileUtils.readFileToString( new File(localPropertiesService.getBalloonFile()), StandardCharsets.UTF_8 ); + + if (balloonContents != null) { + balloonContents = balloonContents.replace(EarthConstants.FOLDER_COPIED_TO_KMZ + "/", EarthConstants.GENERATED_FOLDER_SUFFIX + "/" //$NON-NLS-1$ //$NON-NLS-2$ + + EarthConstants.FOLDER_COPIED_TO_KMZ + "/"); //$NON-NLS-1$ + balloonContents = replaceGoalsWithParameters(balloonContents, request.getParameterMap()); + + final byte[] bytes = balloonContents.getBytes(); + response.setHeader("Content-Length", Integer.toString( bytes.length ) ); //$NON-NLS-1$ //$NON-NLS-2$ + writeToResponse(response, bytes); + } else { + getLogger().error("There was a problem fetching the balloon html, please check the name!"); //$NON-NLS-1$ + } } + private void writeToResponse(HttpServletResponse response, byte[] fileContents) throws IOException { + try { + response.getOutputStream().write(fileContents); + } catch (final Exception e) { + getLogger().error("Error writing reponse body to output stream ", e); //$NON-NLS-1$ + } finally { + response.getOutputStream().close(); + } + } } From f44a70361071c183e0d07059683d3170ef636bbe Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:55 +0100 Subject: [PATCH 0977/1620] New translations BalloonServlet.java (English) --- .../earth/app/view/Messages_en.properties | 140 +++++++++++++----- 1 file changed, 99 insertions(+), 41 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index f5ef63f5c6..511ad9d567 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,61 +1,119 @@ -package org.openforis.collect.earth.app.model; +package org.openforis.collect.earth.app.server; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.view.Messages; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.regex.Pattern; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.io.FileUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.service.BrowserNotFoundException; +import org.openforis.collect.earth.app.service.BrowserService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; /** - * Enumeration of the dynamics that Collect Earth can use to classify the plots. - * + * This servlet is called by the balloon (KML pop-up form) when it is open and the user has chosen to see the form in a separate browser + * window. + * In that case a special HTML is used whose sole purpose is to load an invisible iframe that calls the URL localhot/openInBrowser + * This causes a new browser window to open and then the browser is redirected to another URL ( localhost/balloon ) that contains the actual HTML + * form. + * The functionality is used mostly for LINUX users due to the different bugs present in Google Earth for LINUX which makes the Bootstrap library + * fail. + * * @author Alfonso Sanchez-Paus Diaz - * + * */ -public enum DynamicsCode { - FROM_FOREST(Messages.getString("DynamicsCode.0"), 1), FROM_GRASSLAND(Messages.getString("DynamicsCode.1"), 3), FROM_SETTLEMENT(Messages.getString("DynamicsCode.2"), 4), FROM_OTHERLAND(Messages.getString("DynamicsCode.3"), 5), FROM_WETLAND(Messages.getString("DynamicsCode.4"), 6), FROM_CROPLAND(Messages.getString("DynamicsCode.5"), 7), NA("NA", 8); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ +@Controller +public class BalloonServlet extends DataAccessingServlet { - private String label; + @Autowired + private BrowserService browserService; - private int id; + @Autowired + private LocalPropertiesService localPropertiesService; - private DynamicsCode(String label, int id) { - this.label = label; - this.id = id; - } + private RemoteWebDriver webKitDriver = null; - public int getId() { - return id; - } + private static final String BALLOON_EXTERNAL_URL = "balloon"; //$NON-NLS-1$ - public String getLabel() { - return label; + private String buildGetParameters(Map parameterMap) { + final StringBuilder getParameters = new StringBuilder(); + final Set> entrySet = parameterMap.entrySet(); + for (final Entry entry : entrySet) { + getParameters.append(entry.getKey()).append("=").append(entry.getValue()[0]).append("&"); //$NON-NLS-1$ //$NON-NLS-2$ + } + return getParameters.toString(); } - public void setId(int id) { - this.id = id; + @GetMapping("/openInBrowser") + public void openInBrowser(HttpServletResponse response, HttpServletRequest request, String imageName) { + String url = ServerController.getHostAddress(localPropertiesService.getHost(), localPropertiesService.getLocalPort()); + url = url + BALLOON_EXTERNAL_URL + "?" + buildGetParameters(request.getParameterMap()); //$NON-NLS-1$ + final String fUrl = url; + final Thread openBrowser = new Thread("Open URL in browser : " + fUrl) { + @Override + public void run() { + try { + webKitDriver = browserService.navigateTo(fUrl, webKitDriver, false); + } catch (BrowserNotFoundException e) { + logger.error("No browser found", e); //$NON-NLS-1$ + } + } + }; + openBrowser.start(); } - @Override - public String toString() { - return label; + private String replaceGoalsWithParameters(String htmlWithGoals, Map parameterMap) { + final Set> entrySet = parameterMap.entrySet(); + for (final Entry entry : entrySet) { + htmlWithGoals = htmlWithGoals.replaceAll("\\$\\[" + Pattern.quote( entry.getKey() ) + "\\]", entry.getValue()[0]); //$NON-NLS-1$ //$NON-NLS-2$ + } + return htmlWithGoals; } - public static Integer getDynamicsCode(String landUseSubcategory) { - if( landUseSubcategory.startsWith("FLto") ){ //$NON-NLS-1$ - return FROM_FOREST.getId(); - }else if( landUseSubcategory.startsWith("CLto") ){ //$NON-NLS-1$ - return FROM_CROPLAND.getId(); - }else if( landUseSubcategory.startsWith("SLto") ){ //$NON-NLS-1$ - return FROM_SETTLEMENT.getId(); - }else if( landUseSubcategory.startsWith("WLto") ){ //$NON-NLS-1$ - return FROM_WETLAND.getId(); - }else if( landUseSubcategory.startsWith("GLto") ){ //$NON-NLS-1$ - return FROM_GRASSLAND.getId(); - }else if( landUseSubcategory.startsWith("OLto") || landUseSubcategory.startsWith("OTto")){ //$NON-NLS-1$ //$NON-NLS-2$ - return FROM_OTHERLAND.getId(); - }else if ( StringUtils.isBlank( landUseSubcategory )) { - throw new IllegalArgumentException("The land use subcategory " + landUseSubcategory + " is not recognizable."); //$NON-NLS-1$ //$NON-NLS-2$ - }else{ - return NA.getId(); + @GetMapping("/"+BALLOON_EXTERNAL_URL) + public void returnBalloon(HttpServletResponse response, HttpServletRequest request, String imageName) throws IOException { + response.setHeader("Content-Type", "text/html"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Content-Disposition", "inline; filename=\"" + imageName + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Date", new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH).format(new Date())); //$NON-NLS-1$ + + String balloonContents = FileUtils.readFileToString( new File(localPropertiesService.getBalloonFile()), StandardCharsets.UTF_8 ); + + if (balloonContents != null) { + balloonContents = balloonContents.replace(EarthConstants.FOLDER_COPIED_TO_KMZ + "/", EarthConstants.GENERATED_FOLDER_SUFFIX + "/" //$NON-NLS-1$ //$NON-NLS-2$ + + EarthConstants.FOLDER_COPIED_TO_KMZ + "/"); //$NON-NLS-1$ + balloonContents = replaceGoalsWithParameters(balloonContents, request.getParameterMap()); + + final byte[] bytes = balloonContents.getBytes(); + response.setHeader("Content-Length", Integer.toString( bytes.length ) ); //$NON-NLS-1$ //$NON-NLS-2$ + writeToResponse(response, bytes); + } else { + getLogger().error("There was a problem fetching the balloon html, please check the name!"); //$NON-NLS-1$ } } + private void writeToResponse(HttpServletResponse response, byte[] fileContents) throws IOException { + try { + response.getOutputStream().write(fileContents); + } catch (final Exception e) { + getLogger().error("Error writing reponse body to output stream ", e); //$NON-NLS-1$ + } finally { + response.getOutputStream().close(); + } + } } From 20cc6f6f4adf74348e35c14e41054e31ad8e488a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:56 +0100 Subject: [PATCH 0978/1620] New translations GoogleEarthHeaderFilter.java (French) --- .../earth/app/view/Messages_fr.properties | 104 ++++++++++-------- 1 file changed, 59 insertions(+), 45 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index dfaad035c3..c5752cae99 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,58 +1,72 @@ -package org.openforis.collect.earth.app.model; - -import org.openforis.collect.earth.app.view.Messages; - -/** - * Enumeration of the aspects that Collect Earth can use to classify the plots. - * Each aspect has an ID attach to it and represents a 45 dregree range ( -22.5 to 22.5 for North, 22.5 to 67.5 to North East, 66.5 to 112.5 for East - * and so on) - * The enumeration also has an static method to calculate the - * - * @author Alfonso Sanchez-Paus Diaz - * - */ -public enum AspectCode { - N(Messages.getString("AspectCode.0"), 1), NE(Messages.getString("AspectCode.1"), 2), E(Messages.getString("AspectCode.2"), 3), SE(Messages.getString("AspectCode.3"), 4), S(Messages.getString("AspectCode.4"), 5), SW(Messages.getString("AspectCode.5"), 6), W(Messages.getString("AspectCode.6"), 7), NW(Messages.getString("AspectCode.7"), 8), NA( "NA", 9); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ - /** - * Utility method to get the aspect code ( N, N-E ... ) from the aspect in degrees - * - * @param aspect - * The aspect in degrees - * @return The aspect code corresponding to the aspect in degrees. - */ - public static AspectCode getAspectCode(Double aspect) { - double aspectProc = aspect + 22.5d; // North starts at -22.5, so add 22.5 to normalize so north becomes 0-45 , north east 45-90 and so on.. - if (aspectProc >= 360d) { - aspectProc = aspectProc - 360d; - } - final int modulo = (int) Math.floor(aspectProc / 45d); - return AspectCode.values()[modulo]; - } +package org.openforis.collect.earth.app.server; - private String label; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; - private int id; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import javax.servlet.http.HttpServletResponse; - private AspectCode(String label, int id) { - this.label = label; - this.id = id; - } +import org.eclipse.jetty.http.HttpHeader; +import org.openforis.collect.earth.app.EarthConstants; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; - public int getId() { - return id; - } +public class GoogleEarthHeaderFilter implements Filter{ + + final SimpleDateFormat dateFormat = new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH ); + Logger logger = LoggerFactory.getLogger(GoogleEarthHeaderFilter.class ); + static final String ORIGIN_HEADER = "Origin"; - public String getLabel() { - return label; + @Override + public void init(FilterConfig filterConfig) throws ServletException { } - public void setId(int id) { - this.id = id; + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + + chain.doFilter(new HttpServletRequestWrapper( (HttpServletRequest) request) { + @Override + public long getDateHeader(String name){ + if(name.equals(HttpHeader.IF_MODIFIED_SINCE.toString() )){ + Date now = new Date(); + return now.getTime(); + }else { + return super.getDateHeader(name); + } + } + + @Override + public String getHeader(String name) { + if(name!=null && name.equals(ORIGIN_HEADER) && (super.getHeader(ORIGIN_HEADER)==null || super.getHeader(ORIGIN_HEADER).equals("null")) ){ + return "*"; + }else + return super.getHeader(name); + } + }, response + ); + + + + ((HttpServletResponse) response).setHeader("Access-Control-Allow-Origin" , "*"); + ((HttpServletResponse) response).setHeader("Access-Control-Allow-Methods" , "GET, POST, PATCH, PUT, DELETE, OPTIONS"); + ((HttpServletResponse) response).setHeader("Access-Control-Allow-Headers" , "Origin, Content-Type, X-Auth-Token"); + + logger.debug( "Added Acces control origin to " + ( ( HttpServletRequest)request).getRequestURI() ); } @Override - public String toString() { - return label; + public void destroy() { + } } From cf03e919a0eba236f8b644f0a63ed207383e2f82 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:57 +0100 Subject: [PATCH 0979/1620] New translations GoogleEarthHeaderFilter.java (Spanish) --- .../earth/app/view/Messages_es.properties | 153 ++++++------------ 1 file changed, 53 insertions(+), 100 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 511ad9d567..c5752cae99 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,119 +1,72 @@ package org.openforis.collect.earth.app.server; -import java.io.File; import java.io.IOException; -import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.regex.Pattern; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; -import org.apache.commons.io.FileUtils; +import org.eclipse.jetty.http.HttpHeader; import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.desktop.ServerController; -import org.openforis.collect.earth.app.service.BrowserNotFoundException; -import org.openforis.collect.earth.app.service.BrowserService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openqa.selenium.remote.RemoteWebDriver; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; - -/** - * This servlet is called by the balloon (KML pop-up form) when it is open and the user has chosen to see the form in a separate browser - * window. - * In that case a special HTML is used whose sole purpose is to load an invisible iframe that calls the URL localhot/openInBrowser - * This causes a new browser window to open and then the browser is redirected to another URL ( localhost/balloon ) that contains the actual HTML - * form. - * The functionality is used mostly for LINUX users due to the different bugs present in Google Earth for LINUX which makes the Bootstrap library - * fail. - * - * @author Alfonso Sanchez-Paus Diaz - * - */ -@Controller -public class BalloonServlet extends DataAccessingServlet { - - @Autowired - private BrowserService browserService; - - @Autowired - private LocalPropertiesService localPropertiesService; - - private RemoteWebDriver webKitDriver = null; - - private static final String BALLOON_EXTERNAL_URL = "balloon"; //$NON-NLS-1$ - - private String buildGetParameters(Map parameterMap) { - final StringBuilder getParameters = new StringBuilder(); - final Set> entrySet = parameterMap.entrySet(); - for (final Entry entry : entrySet) { - getParameters.append(entry.getKey()).append("=").append(entry.getValue()[0]).append("&"); //$NON-NLS-1$ //$NON-NLS-2$ - } - return getParameters.toString(); - } +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; - @GetMapping("/openInBrowser") - public void openInBrowser(HttpServletResponse response, HttpServletRequest request, String imageName) { - String url = ServerController.getHostAddress(localPropertiesService.getHost(), localPropertiesService.getLocalPort()); - url = url + BALLOON_EXTERNAL_URL + "?" + buildGetParameters(request.getParameterMap()); //$NON-NLS-1$ - final String fUrl = url; - final Thread openBrowser = new Thread("Open URL in browser : " + fUrl) { - @Override - public void run() { - try { - webKitDriver = browserService.navigateTo(fUrl, webKitDriver, false); - } catch (BrowserNotFoundException e) { - logger.error("No browser found", e); //$NON-NLS-1$ - } - } - }; - openBrowser.start(); - } +public class GoogleEarthHeaderFilter implements Filter{ + + final SimpleDateFormat dateFormat = new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH ); + Logger logger = LoggerFactory.getLogger(GoogleEarthHeaderFilter.class ); + static final String ORIGIN_HEADER = "Origin"; - private String replaceGoalsWithParameters(String htmlWithGoals, Map parameterMap) { - final Set> entrySet = parameterMap.entrySet(); - for (final Entry entry : entrySet) { - htmlWithGoals = htmlWithGoals.replaceAll("\\$\\[" + Pattern.quote( entry.getKey() ) + "\\]", entry.getValue()[0]); //$NON-NLS-1$ //$NON-NLS-2$ - } - return htmlWithGoals; + @Override + public void init(FilterConfig filterConfig) throws ServletException { } - @GetMapping("/"+BALLOON_EXTERNAL_URL) - public void returnBalloon(HttpServletResponse response, HttpServletRequest request, String imageName) throws IOException { - response.setHeader("Content-Type", "text/html"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Content-Disposition", "inline; filename=\"" + imageName + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Date", new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH).format(new Date())); //$NON-NLS-1$ - - String balloonContents = FileUtils.readFileToString( new File(localPropertiesService.getBalloonFile()), StandardCharsets.UTF_8 ); - - if (balloonContents != null) { - balloonContents = balloonContents.replace(EarthConstants.FOLDER_COPIED_TO_KMZ + "/", EarthConstants.GENERATED_FOLDER_SUFFIX + "/" //$NON-NLS-1$ //$NON-NLS-2$ - + EarthConstants.FOLDER_COPIED_TO_KMZ + "/"); //$NON-NLS-1$ - balloonContents = replaceGoalsWithParameters(balloonContents, request.getParameterMap()); - - final byte[] bytes = balloonContents.getBytes(); - response.setHeader("Content-Length", Integer.toString( bytes.length ) ); //$NON-NLS-1$ //$NON-NLS-2$ - writeToResponse(response, bytes); - } else { - getLogger().error("There was a problem fetching the balloon html, please check the name!"); //$NON-NLS-1$ - } + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + + chain.doFilter(new HttpServletRequestWrapper( (HttpServletRequest) request) { + @Override + public long getDateHeader(String name){ + if(name.equals(HttpHeader.IF_MODIFIED_SINCE.toString() )){ + Date now = new Date(); + return now.getTime(); + }else { + return super.getDateHeader(name); + } + } + + @Override + public String getHeader(String name) { + if(name!=null && name.equals(ORIGIN_HEADER) && (super.getHeader(ORIGIN_HEADER)==null || super.getHeader(ORIGIN_HEADER).equals("null")) ){ + return "*"; + }else + return super.getHeader(name); + } + }, response + ); + + + + ((HttpServletResponse) response).setHeader("Access-Control-Allow-Origin" , "*"); + ((HttpServletResponse) response).setHeader("Access-Control-Allow-Methods" , "GET, POST, PATCH, PUT, DELETE, OPTIONS"); + ((HttpServletResponse) response).setHeader("Access-Control-Allow-Headers" , "Origin, Content-Type, X-Auth-Token"); + + logger.debug( "Added Acces control origin to " + ( ( HttpServletRequest)request).getRequestURI() ); } - private void writeToResponse(HttpServletResponse response, byte[] fileContents) throws IOException { - try { - response.getOutputStream().write(fileContents); - } catch (final Exception e) { - getLogger().error("Error writing reponse body to output stream ", e); //$NON-NLS-1$ - } finally { - response.getOutputStream().close(); - } + @Override + public void destroy() { + } + } From 7f33341a8833f3c43ce9c4be6d69623a3b0d6238 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:58 +0100 Subject: [PATCH 0980/1620] New translations GoogleEarthHeaderFilter.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 153 ++++++------------ 1 file changed, 53 insertions(+), 100 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 511ad9d567..c5752cae99 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,119 +1,72 @@ package org.openforis.collect.earth.app.server; -import java.io.File; import java.io.IOException; -import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.regex.Pattern; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; -import org.apache.commons.io.FileUtils; +import org.eclipse.jetty.http.HttpHeader; import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.desktop.ServerController; -import org.openforis.collect.earth.app.service.BrowserNotFoundException; -import org.openforis.collect.earth.app.service.BrowserService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openqa.selenium.remote.RemoteWebDriver; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; - -/** - * This servlet is called by the balloon (KML pop-up form) when it is open and the user has chosen to see the form in a separate browser - * window. - * In that case a special HTML is used whose sole purpose is to load an invisible iframe that calls the URL localhot/openInBrowser - * This causes a new browser window to open and then the browser is redirected to another URL ( localhost/balloon ) that contains the actual HTML - * form. - * The functionality is used mostly for LINUX users due to the different bugs present in Google Earth for LINUX which makes the Bootstrap library - * fail. - * - * @author Alfonso Sanchez-Paus Diaz - * - */ -@Controller -public class BalloonServlet extends DataAccessingServlet { - - @Autowired - private BrowserService browserService; - - @Autowired - private LocalPropertiesService localPropertiesService; - - private RemoteWebDriver webKitDriver = null; - - private static final String BALLOON_EXTERNAL_URL = "balloon"; //$NON-NLS-1$ - - private String buildGetParameters(Map parameterMap) { - final StringBuilder getParameters = new StringBuilder(); - final Set> entrySet = parameterMap.entrySet(); - for (final Entry entry : entrySet) { - getParameters.append(entry.getKey()).append("=").append(entry.getValue()[0]).append("&"); //$NON-NLS-1$ //$NON-NLS-2$ - } - return getParameters.toString(); - } +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; - @GetMapping("/openInBrowser") - public void openInBrowser(HttpServletResponse response, HttpServletRequest request, String imageName) { - String url = ServerController.getHostAddress(localPropertiesService.getHost(), localPropertiesService.getLocalPort()); - url = url + BALLOON_EXTERNAL_URL + "?" + buildGetParameters(request.getParameterMap()); //$NON-NLS-1$ - final String fUrl = url; - final Thread openBrowser = new Thread("Open URL in browser : " + fUrl) { - @Override - public void run() { - try { - webKitDriver = browserService.navigateTo(fUrl, webKitDriver, false); - } catch (BrowserNotFoundException e) { - logger.error("No browser found", e); //$NON-NLS-1$ - } - } - }; - openBrowser.start(); - } +public class GoogleEarthHeaderFilter implements Filter{ + + final SimpleDateFormat dateFormat = new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH ); + Logger logger = LoggerFactory.getLogger(GoogleEarthHeaderFilter.class ); + static final String ORIGIN_HEADER = "Origin"; - private String replaceGoalsWithParameters(String htmlWithGoals, Map parameterMap) { - final Set> entrySet = parameterMap.entrySet(); - for (final Entry entry : entrySet) { - htmlWithGoals = htmlWithGoals.replaceAll("\\$\\[" + Pattern.quote( entry.getKey() ) + "\\]", entry.getValue()[0]); //$NON-NLS-1$ //$NON-NLS-2$ - } - return htmlWithGoals; + @Override + public void init(FilterConfig filterConfig) throws ServletException { } - @GetMapping("/"+BALLOON_EXTERNAL_URL) - public void returnBalloon(HttpServletResponse response, HttpServletRequest request, String imageName) throws IOException { - response.setHeader("Content-Type", "text/html"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Content-Disposition", "inline; filename=\"" + imageName + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Date", new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH).format(new Date())); //$NON-NLS-1$ - - String balloonContents = FileUtils.readFileToString( new File(localPropertiesService.getBalloonFile()), StandardCharsets.UTF_8 ); - - if (balloonContents != null) { - balloonContents = balloonContents.replace(EarthConstants.FOLDER_COPIED_TO_KMZ + "/", EarthConstants.GENERATED_FOLDER_SUFFIX + "/" //$NON-NLS-1$ //$NON-NLS-2$ - + EarthConstants.FOLDER_COPIED_TO_KMZ + "/"); //$NON-NLS-1$ - balloonContents = replaceGoalsWithParameters(balloonContents, request.getParameterMap()); - - final byte[] bytes = balloonContents.getBytes(); - response.setHeader("Content-Length", Integer.toString( bytes.length ) ); //$NON-NLS-1$ //$NON-NLS-2$ - writeToResponse(response, bytes); - } else { - getLogger().error("There was a problem fetching the balloon html, please check the name!"); //$NON-NLS-1$ - } + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + + chain.doFilter(new HttpServletRequestWrapper( (HttpServletRequest) request) { + @Override + public long getDateHeader(String name){ + if(name.equals(HttpHeader.IF_MODIFIED_SINCE.toString() )){ + Date now = new Date(); + return now.getTime(); + }else { + return super.getDateHeader(name); + } + } + + @Override + public String getHeader(String name) { + if(name!=null && name.equals(ORIGIN_HEADER) && (super.getHeader(ORIGIN_HEADER)==null || super.getHeader(ORIGIN_HEADER).equals("null")) ){ + return "*"; + }else + return super.getHeader(name); + } + }, response + ); + + + + ((HttpServletResponse) response).setHeader("Access-Control-Allow-Origin" , "*"); + ((HttpServletResponse) response).setHeader("Access-Control-Allow-Methods" , "GET, POST, PATCH, PUT, DELETE, OPTIONS"); + ((HttpServletResponse) response).setHeader("Access-Control-Allow-Headers" , "Origin, Content-Type, X-Auth-Token"); + + logger.debug( "Added Acces control origin to " + ( ( HttpServletRequest)request).getRequestURI() ); } - private void writeToResponse(HttpServletResponse response, byte[] fileContents) throws IOException { - try { - response.getOutputStream().write(fileContents); - } catch (final Exception e) { - getLogger().error("Error writing reponse body to output stream ", e); //$NON-NLS-1$ - } finally { - response.getOutputStream().close(); - } + @Override + public void destroy() { + } + } From a61f68091af9dc07bb1c613956cb68a270ef42e7 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:39:59 +0100 Subject: [PATCH 0981/1620] New translations GoogleEarthHeaderFilter.java (English) --- .../earth/app/view/Messages_en.properties | 153 ++++++------------ 1 file changed, 53 insertions(+), 100 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 511ad9d567..c5752cae99 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,119 +1,72 @@ package org.openforis.collect.earth.app.server; -import java.io.File; import java.io.IOException; -import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.regex.Pattern; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; -import org.apache.commons.io.FileUtils; +import org.eclipse.jetty.http.HttpHeader; import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.desktop.ServerController; -import org.openforis.collect.earth.app.service.BrowserNotFoundException; -import org.openforis.collect.earth.app.service.BrowserService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openqa.selenium.remote.RemoteWebDriver; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; - -/** - * This servlet is called by the balloon (KML pop-up form) when it is open and the user has chosen to see the form in a separate browser - * window. - * In that case a special HTML is used whose sole purpose is to load an invisible iframe that calls the URL localhot/openInBrowser - * This causes a new browser window to open and then the browser is redirected to another URL ( localhost/balloon ) that contains the actual HTML - * form. - * The functionality is used mostly for LINUX users due to the different bugs present in Google Earth for LINUX which makes the Bootstrap library - * fail. - * - * @author Alfonso Sanchez-Paus Diaz - * - */ -@Controller -public class BalloonServlet extends DataAccessingServlet { - - @Autowired - private BrowserService browserService; - - @Autowired - private LocalPropertiesService localPropertiesService; - - private RemoteWebDriver webKitDriver = null; - - private static final String BALLOON_EXTERNAL_URL = "balloon"; //$NON-NLS-1$ - - private String buildGetParameters(Map parameterMap) { - final StringBuilder getParameters = new StringBuilder(); - final Set> entrySet = parameterMap.entrySet(); - for (final Entry entry : entrySet) { - getParameters.append(entry.getKey()).append("=").append(entry.getValue()[0]).append("&"); //$NON-NLS-1$ //$NON-NLS-2$ - } - return getParameters.toString(); - } +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; - @GetMapping("/openInBrowser") - public void openInBrowser(HttpServletResponse response, HttpServletRequest request, String imageName) { - String url = ServerController.getHostAddress(localPropertiesService.getHost(), localPropertiesService.getLocalPort()); - url = url + BALLOON_EXTERNAL_URL + "?" + buildGetParameters(request.getParameterMap()); //$NON-NLS-1$ - final String fUrl = url; - final Thread openBrowser = new Thread("Open URL in browser : " + fUrl) { - @Override - public void run() { - try { - webKitDriver = browserService.navigateTo(fUrl, webKitDriver, false); - } catch (BrowserNotFoundException e) { - logger.error("No browser found", e); //$NON-NLS-1$ - } - } - }; - openBrowser.start(); - } +public class GoogleEarthHeaderFilter implements Filter{ + + final SimpleDateFormat dateFormat = new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH ); + Logger logger = LoggerFactory.getLogger(GoogleEarthHeaderFilter.class ); + static final String ORIGIN_HEADER = "Origin"; - private String replaceGoalsWithParameters(String htmlWithGoals, Map parameterMap) { - final Set> entrySet = parameterMap.entrySet(); - for (final Entry entry : entrySet) { - htmlWithGoals = htmlWithGoals.replaceAll("\\$\\[" + Pattern.quote( entry.getKey() ) + "\\]", entry.getValue()[0]); //$NON-NLS-1$ //$NON-NLS-2$ - } - return htmlWithGoals; + @Override + public void init(FilterConfig filterConfig) throws ServletException { } - @GetMapping("/"+BALLOON_EXTERNAL_URL) - public void returnBalloon(HttpServletResponse response, HttpServletRequest request, String imageName) throws IOException { - response.setHeader("Content-Type", "text/html"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Content-Disposition", "inline; filename=\"" + imageName + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Date", new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH).format(new Date())); //$NON-NLS-1$ - - String balloonContents = FileUtils.readFileToString( new File(localPropertiesService.getBalloonFile()), StandardCharsets.UTF_8 ); - - if (balloonContents != null) { - balloonContents = balloonContents.replace(EarthConstants.FOLDER_COPIED_TO_KMZ + "/", EarthConstants.GENERATED_FOLDER_SUFFIX + "/" //$NON-NLS-1$ //$NON-NLS-2$ - + EarthConstants.FOLDER_COPIED_TO_KMZ + "/"); //$NON-NLS-1$ - balloonContents = replaceGoalsWithParameters(balloonContents, request.getParameterMap()); - - final byte[] bytes = balloonContents.getBytes(); - response.setHeader("Content-Length", Integer.toString( bytes.length ) ); //$NON-NLS-1$ //$NON-NLS-2$ - writeToResponse(response, bytes); - } else { - getLogger().error("There was a problem fetching the balloon html, please check the name!"); //$NON-NLS-1$ - } + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + + chain.doFilter(new HttpServletRequestWrapper( (HttpServletRequest) request) { + @Override + public long getDateHeader(String name){ + if(name.equals(HttpHeader.IF_MODIFIED_SINCE.toString() )){ + Date now = new Date(); + return now.getTime(); + }else { + return super.getDateHeader(name); + } + } + + @Override + public String getHeader(String name) { + if(name!=null && name.equals(ORIGIN_HEADER) && (super.getHeader(ORIGIN_HEADER)==null || super.getHeader(ORIGIN_HEADER).equals("null")) ){ + return "*"; + }else + return super.getHeader(name); + } + }, response + ); + + + + ((HttpServletResponse) response).setHeader("Access-Control-Allow-Origin" , "*"); + ((HttpServletResponse) response).setHeader("Access-Control-Allow-Methods" , "GET, POST, PATCH, PUT, DELETE, OPTIONS"); + ((HttpServletResponse) response).setHeader("Access-Control-Allow-Headers" , "Origin, Content-Type, X-Auth-Token"); + + logger.debug( "Added Acces control origin to " + ( ( HttpServletRequest)request).getRequestURI() ); } - private void writeToResponse(HttpServletResponse response, byte[] fileContents) throws IOException { - try { - response.getOutputStream().write(fileContents); - } catch (final Exception e) { - getLogger().error("Error writing reponse body to output stream ", e); //$NON-NLS-1$ - } finally { - response.getOutputStream().close(); - } + @Override + public void destroy() { + } + } From 6e3590947d69aeed79f454b63e548cf376a61b18 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:00 +0100 Subject: [PATCH 0982/1620] New translations LoadProjectFileServlet.java (French) --- .../earth/app/view/Messages_fr.properties | 125 +++++++++--------- 1 file changed, 66 insertions(+), 59 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index c5752cae99..93a4d09fe6 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,71 +1,78 @@ package org.openforis.collect.earth.app.server; +import java.io.File; import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Locale; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; +import javax.swing.SwingUtilities; -import org.eclipse.jetty.http.HttpHeader; -import org.openforis.collect.earth.app.EarthConstants; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.EarthProjectsService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - -public class GoogleEarthHeaderFilter implements Filter{ - - final SimpleDateFormat dateFormat = new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH ); - Logger logger = LoggerFactory.getLogger(GoogleEarthHeaderFilter.class ); - static final String ORIGIN_HEADER = "Origin"; - - @Override - public void init(FilterConfig filterConfig) throws ServletException { - } - - @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) - throws IOException, ServletException { - - chain.doFilter(new HttpServletRequestWrapper( (HttpServletRequest) request) { - @Override - public long getDateHeader(String name){ - if(name.equals(HttpHeader.IF_MODIFIED_SINCE.toString() )){ - Date now = new Date(); - return now.getTime(); - }else { - return super.getDateHeader(name); - } - } - - @Override - public String getHeader(String name) { - if(name!=null && name.equals(ORIGIN_HEADER) && (super.getHeader(ORIGIN_HEADER)==null || super.getHeader(ORIGIN_HEADER).equals("null")) ){ - return "*"; - }else - return super.getHeader(name); - } - }, response - ); - - - - ((HttpServletResponse) response).setHeader("Access-Control-Allow-Origin" , "*"); - ((HttpServletResponse) response).setHeader("Access-Control-Allow-Methods" , "GET, POST, PATCH, PUT, DELETE, OPTIONS"); - ((HttpServletResponse) response).setHeader("Access-Control-Allow-Headers" , "Origin, Content-Type, X-Auth-Token"); - - logger.debug( "Added Acces control origin to " + ( ( HttpServletRequest)request).getRequestURI() ); - } - - @Override - public void destroy() { +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +/** + * Servlet to load a project file when Collect Earth is already running: + * + * If the user double-clicks on a project file, Collect Earth will first check + * if there is already another instance running, if it is, then send a HTTP + * request and quit. This servlet will receive the HTTP request and load the + * project. + * + * @author Alfonso Sanchez-Paus Diaz + * + */ +@Controller +public class LoadProjectFileServlet { + + public static final String PROJECT_FILE_PARAMETER = "projectFilePath"; //$NON-NLS-1$ + public static final String SERVLET_NAME = "loadProjectFile"; //$NON-NLS-1$ + private Logger logger = LoggerFactory.getLogger(LoadProjectFileServlet.class); + + @Autowired + EarthProjectsService earthProjectsService; + + @Autowired + LocalPropertiesService localPropertiesService; + + @GetMapping("/" + SERVLET_NAME) + public void processRequest(HttpServletRequest request, HttpServletResponse response) { + String projectFilePath = request.getParameter(PROJECT_FILE_PARAMETER); + if (StringUtils.isBlank(projectFilePath)) { + logger.error("The " + PROJECT_FILE_PARAMETER + " parameter cannot be empty"); //$NON-NLS-1$ //$NON-NLS-2$ + } else { + + SwingUtilities.invokeLater(() -> { + File projectZipFile = new File(projectFilePath); + try { + if (earthProjectsService.loadCompressedProjectFile(projectZipFile)) { + localPropertiesService.nullifyChecksumValues(); + // Re-generate KMZ + new Thread( + "Restarting server after double-clicking on CEP file : " + projectZipFile.getName()) { + @Override + public void run() { + EarthApp.restart(); + } + + }.start(); + } + + } catch (IllegalArgumentException | IOException e) { + logger.error("Error loading the project file " + projectFilePath, e); //$NON-NLS-1$ + response.setStatus(500); + } + }); + + response.setStatus(200); + + } } From 24e2ad37241cdbf7137fa8e107d5f40ef3129106 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:02 +0100 Subject: [PATCH 0983/1620] New translations LoadProjectFileServlet.java (Spanish) --- .../earth/app/view/Messages_es.properties | 125 +++++++++--------- 1 file changed, 66 insertions(+), 59 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index c5752cae99..93a4d09fe6 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,71 +1,78 @@ package org.openforis.collect.earth.app.server; +import java.io.File; import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Locale; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; +import javax.swing.SwingUtilities; -import org.eclipse.jetty.http.HttpHeader; -import org.openforis.collect.earth.app.EarthConstants; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.EarthProjectsService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - -public class GoogleEarthHeaderFilter implements Filter{ - - final SimpleDateFormat dateFormat = new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH ); - Logger logger = LoggerFactory.getLogger(GoogleEarthHeaderFilter.class ); - static final String ORIGIN_HEADER = "Origin"; - - @Override - public void init(FilterConfig filterConfig) throws ServletException { - } - - @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) - throws IOException, ServletException { - - chain.doFilter(new HttpServletRequestWrapper( (HttpServletRequest) request) { - @Override - public long getDateHeader(String name){ - if(name.equals(HttpHeader.IF_MODIFIED_SINCE.toString() )){ - Date now = new Date(); - return now.getTime(); - }else { - return super.getDateHeader(name); - } - } - - @Override - public String getHeader(String name) { - if(name!=null && name.equals(ORIGIN_HEADER) && (super.getHeader(ORIGIN_HEADER)==null || super.getHeader(ORIGIN_HEADER).equals("null")) ){ - return "*"; - }else - return super.getHeader(name); - } - }, response - ); - - - - ((HttpServletResponse) response).setHeader("Access-Control-Allow-Origin" , "*"); - ((HttpServletResponse) response).setHeader("Access-Control-Allow-Methods" , "GET, POST, PATCH, PUT, DELETE, OPTIONS"); - ((HttpServletResponse) response).setHeader("Access-Control-Allow-Headers" , "Origin, Content-Type, X-Auth-Token"); - - logger.debug( "Added Acces control origin to " + ( ( HttpServletRequest)request).getRequestURI() ); - } - - @Override - public void destroy() { +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +/** + * Servlet to load a project file when Collect Earth is already running: + * + * If the user double-clicks on a project file, Collect Earth will first check + * if there is already another instance running, if it is, then send a HTTP + * request and quit. This servlet will receive the HTTP request and load the + * project. + * + * @author Alfonso Sanchez-Paus Diaz + * + */ +@Controller +public class LoadProjectFileServlet { + + public static final String PROJECT_FILE_PARAMETER = "projectFilePath"; //$NON-NLS-1$ + public static final String SERVLET_NAME = "loadProjectFile"; //$NON-NLS-1$ + private Logger logger = LoggerFactory.getLogger(LoadProjectFileServlet.class); + + @Autowired + EarthProjectsService earthProjectsService; + + @Autowired + LocalPropertiesService localPropertiesService; + + @GetMapping("/" + SERVLET_NAME) + public void processRequest(HttpServletRequest request, HttpServletResponse response) { + String projectFilePath = request.getParameter(PROJECT_FILE_PARAMETER); + if (StringUtils.isBlank(projectFilePath)) { + logger.error("The " + PROJECT_FILE_PARAMETER + " parameter cannot be empty"); //$NON-NLS-1$ //$NON-NLS-2$ + } else { + + SwingUtilities.invokeLater(() -> { + File projectZipFile = new File(projectFilePath); + try { + if (earthProjectsService.loadCompressedProjectFile(projectZipFile)) { + localPropertiesService.nullifyChecksumValues(); + // Re-generate KMZ + new Thread( + "Restarting server after double-clicking on CEP file : " + projectZipFile.getName()) { + @Override + public void run() { + EarthApp.restart(); + } + + }.start(); + } + + } catch (IllegalArgumentException | IOException e) { + logger.error("Error loading the project file " + projectFilePath, e); //$NON-NLS-1$ + response.setStatus(500); + } + }); + + response.setStatus(200); + + } } From cf5afa7330740da1a12b3956e9092bafc9d5aac9 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:03 +0100 Subject: [PATCH 0984/1620] New translations LoadProjectFileServlet.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 125 +++++++++--------- 1 file changed, 66 insertions(+), 59 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index c5752cae99..93a4d09fe6 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,71 +1,78 @@ package org.openforis.collect.earth.app.server; +import java.io.File; import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Locale; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; +import javax.swing.SwingUtilities; -import org.eclipse.jetty.http.HttpHeader; -import org.openforis.collect.earth.app.EarthConstants; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.EarthProjectsService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - -public class GoogleEarthHeaderFilter implements Filter{ - - final SimpleDateFormat dateFormat = new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH ); - Logger logger = LoggerFactory.getLogger(GoogleEarthHeaderFilter.class ); - static final String ORIGIN_HEADER = "Origin"; - - @Override - public void init(FilterConfig filterConfig) throws ServletException { - } - - @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) - throws IOException, ServletException { - - chain.doFilter(new HttpServletRequestWrapper( (HttpServletRequest) request) { - @Override - public long getDateHeader(String name){ - if(name.equals(HttpHeader.IF_MODIFIED_SINCE.toString() )){ - Date now = new Date(); - return now.getTime(); - }else { - return super.getDateHeader(name); - } - } - - @Override - public String getHeader(String name) { - if(name!=null && name.equals(ORIGIN_HEADER) && (super.getHeader(ORIGIN_HEADER)==null || super.getHeader(ORIGIN_HEADER).equals("null")) ){ - return "*"; - }else - return super.getHeader(name); - } - }, response - ); - - - - ((HttpServletResponse) response).setHeader("Access-Control-Allow-Origin" , "*"); - ((HttpServletResponse) response).setHeader("Access-Control-Allow-Methods" , "GET, POST, PATCH, PUT, DELETE, OPTIONS"); - ((HttpServletResponse) response).setHeader("Access-Control-Allow-Headers" , "Origin, Content-Type, X-Auth-Token"); - - logger.debug( "Added Acces control origin to " + ( ( HttpServletRequest)request).getRequestURI() ); - } - - @Override - public void destroy() { +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +/** + * Servlet to load a project file when Collect Earth is already running: + * + * If the user double-clicks on a project file, Collect Earth will first check + * if there is already another instance running, if it is, then send a HTTP + * request and quit. This servlet will receive the HTTP request and load the + * project. + * + * @author Alfonso Sanchez-Paus Diaz + * + */ +@Controller +public class LoadProjectFileServlet { + + public static final String PROJECT_FILE_PARAMETER = "projectFilePath"; //$NON-NLS-1$ + public static final String SERVLET_NAME = "loadProjectFile"; //$NON-NLS-1$ + private Logger logger = LoggerFactory.getLogger(LoadProjectFileServlet.class); + + @Autowired + EarthProjectsService earthProjectsService; + + @Autowired + LocalPropertiesService localPropertiesService; + + @GetMapping("/" + SERVLET_NAME) + public void processRequest(HttpServletRequest request, HttpServletResponse response) { + String projectFilePath = request.getParameter(PROJECT_FILE_PARAMETER); + if (StringUtils.isBlank(projectFilePath)) { + logger.error("The " + PROJECT_FILE_PARAMETER + " parameter cannot be empty"); //$NON-NLS-1$ //$NON-NLS-2$ + } else { + + SwingUtilities.invokeLater(() -> { + File projectZipFile = new File(projectFilePath); + try { + if (earthProjectsService.loadCompressedProjectFile(projectZipFile)) { + localPropertiesService.nullifyChecksumValues(); + // Re-generate KMZ + new Thread( + "Restarting server after double-clicking on CEP file : " + projectZipFile.getName()) { + @Override + public void run() { + EarthApp.restart(); + } + + }.start(); + } + + } catch (IllegalArgumentException | IOException e) { + logger.error("Error loading the project file " + projectFilePath, e); //$NON-NLS-1$ + response.setStatus(500); + } + }); + + response.setStatus(200); + + } } From 7fa84ffd1abc76649a8108c35d5b24d4f05ce11c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:05 +0100 Subject: [PATCH 0985/1620] New translations AspectCode.java (Spanish) --- .../earth/app/view/Messages_es.properties | 107 +++++++----------- 1 file changed, 43 insertions(+), 64 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 93a4d09fe6..dfaad035c3 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,79 +1,58 @@ -package org.openforis.collect.earth.app.server; +package org.openforis.collect.earth.app.model; -import java.io.File; -import java.io.IOException; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.EarthProjectsService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; +import org.openforis.collect.earth.app.view.Messages; /** - * Servlet to load a project file when Collect Earth is already running: - * - * If the user double-clicks on a project file, Collect Earth will first check - * if there is already another instance running, if it is, then send a HTTP - * request and quit. This servlet will receive the HTTP request and load the - * project. - * + * Enumeration of the aspects that Collect Earth can use to classify the plots. + * Each aspect has an ID attach to it and represents a 45 dregree range ( -22.5 to 22.5 for North, 22.5 to 67.5 to North East, 66.5 to 112.5 for East + * and so on) + * The enumeration also has an static method to calculate the + * * @author Alfonso Sanchez-Paus Diaz - * + * */ -@Controller -public class LoadProjectFileServlet { - - public static final String PROJECT_FILE_PARAMETER = "projectFilePath"; //$NON-NLS-1$ - public static final String SERVLET_NAME = "loadProjectFile"; //$NON-NLS-1$ - private Logger logger = LoggerFactory.getLogger(LoadProjectFileServlet.class); - - @Autowired - EarthProjectsService earthProjectsService; - - @Autowired - LocalPropertiesService localPropertiesService; +public enum AspectCode { + N(Messages.getString("AspectCode.0"), 1), NE(Messages.getString("AspectCode.1"), 2), E(Messages.getString("AspectCode.2"), 3), SE(Messages.getString("AspectCode.3"), 4), S(Messages.getString("AspectCode.4"), 5), SW(Messages.getString("AspectCode.5"), 6), W(Messages.getString("AspectCode.6"), 7), NW(Messages.getString("AspectCode.7"), 8), NA( "NA", 9); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ + /** + * Utility method to get the aspect code ( N, N-E ... ) from the aspect in degrees + * + * @param aspect + * The aspect in degrees + * @return The aspect code corresponding to the aspect in degrees. + */ + public static AspectCode getAspectCode(Double aspect) { + double aspectProc = aspect + 22.5d; // North starts at -22.5, so add 22.5 to normalize so north becomes 0-45 , north east 45-90 and so on.. + if (aspectProc >= 360d) { + aspectProc = aspectProc - 360d; + } + final int modulo = (int) Math.floor(aspectProc / 45d); + return AspectCode.values()[modulo]; + } - @GetMapping("/" + SERVLET_NAME) - public void processRequest(HttpServletRequest request, HttpServletResponse response) { - String projectFilePath = request.getParameter(PROJECT_FILE_PARAMETER); - if (StringUtils.isBlank(projectFilePath)) { - logger.error("The " + PROJECT_FILE_PARAMETER + " parameter cannot be empty"); //$NON-NLS-1$ //$NON-NLS-2$ - } else { + private String label; - SwingUtilities.invokeLater(() -> { - File projectZipFile = new File(projectFilePath); - try { - if (earthProjectsService.loadCompressedProjectFile(projectZipFile)) { - localPropertiesService.nullifyChecksumValues(); - // Re-generate KMZ - new Thread( - "Restarting server after double-clicking on CEP file : " + projectZipFile.getName()) { - @Override - public void run() { - EarthApp.restart(); - } + private int id; - }.start(); - } + private AspectCode(String label, int id) { + this.label = label; + this.id = id; + } - } catch (IllegalArgumentException | IOException e) { - logger.error("Error loading the project file " + projectFilePath, e); //$NON-NLS-1$ - response.setStatus(500); - } - }); + public int getId() { + return id; + } - response.setStatus(200); + public String getLabel() { + return label; + } - } + public void setId(int id) { + this.id = id; + } + @Override + public String toString() { + return label; } } From 85a663856e5abdf96303a800132c216384e5c54e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:06 +0100 Subject: [PATCH 0986/1620] New translations JSwingAppender.java (English) --- .../earth/app/view/Messages_en.properties | 140 ++++++++++-------- 1 file changed, 81 insertions(+), 59 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index c5752cae99..9f9883c25f 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,72 +1,94 @@ -package org.openforis.collect.earth.app.server; - -import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Locale; - -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletRequestWrapper; -import javax.servlet.http.HttpServletResponse; - -import org.eclipse.jetty.http.HttpHeader; -import org.openforis.collect.earth.app.EarthConstants; +package org.openforis.collect.earth.app.logging; + +import java.awt.Dimension; + +import javax.swing.JEditorPane; +import javax.swing.JOptionPane; +import javax.swing.JScrollPane; +import javax.swing.SwingUtilities; + +import org.apache.logging.log4j.core.Filter; +import org.apache.logging.log4j.core.Layout; +import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.core.appender.AbstractAppender; +import org.apache.logging.log4j.core.config.Property; +import org.apache.logging.log4j.core.config.plugins.Plugin; +import org.apache.logging.log4j.core.config.plugins.PluginAttribute; +import org.apache.logging.log4j.core.config.plugins.PluginElement; +import org.apache.logging.log4j.core.config.plugins.PluginFactory; +import org.apache.logging.log4j.core.layout.PatternLayout; +import org.openforis.collect.earth.app.service.LocalPropertiesService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class GoogleEarthHeaderFilter implements Filter{ +@Plugin(name = "JSwingAppender", category = "Core", elementType = "appender", printObject = true) +public class JSwingAppender extends AbstractAppender { - final SimpleDateFormat dateFormat = new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH ); - Logger logger = LoggerFactory.getLogger(GoogleEarthHeaderFilter.class ); - static final String ORIGIN_HEADER = "Origin"; + private Boolean showException; - @Override - public void init(FilterConfig filterConfig) throws ServletException { + private Logger logger = LoggerFactory.getLogger( JSwingAppender.class ); + + public JSwingAppender(String name, Filter filter, Layout layout, boolean ignoreExceptions, Property[] properties) { + super(name, filter, layout, ignoreExceptions, properties); } - @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) - throws IOException, ServletException { - - chain.doFilter(new HttpServletRequestWrapper( (HttpServletRequest) request) { - @Override - public long getDateHeader(String name){ - if(name.equals(HttpHeader.IF_MODIFIED_SINCE.toString() )){ - Date now = new Date(); - return now.getTime(); - }else { - return super.getDateHeader(name); - } - } - - @Override - public String getHeader(String name) { - if(name!=null && name.equals(ORIGIN_HEADER) && (super.getHeader(ORIGIN_HEADER)==null || super.getHeader(ORIGIN_HEADER).equals("null")) ){ - return "*"; - }else - return super.getHeader(name); - } - }, response - ); - - - - ((HttpServletResponse) response).setHeader("Access-Control-Allow-Origin" , "*"); - ((HttpServletResponse) response).setHeader("Access-Control-Allow-Methods" , "GET, POST, PATCH, PUT, DELETE, OPTIONS"); - ((HttpServletResponse) response).setHeader("Access-Control-Allow-Headers" , "Origin, Content-Type, X-Auth-Token"); - - logger.debug( "Added Acces control origin to " + ( ( HttpServletRequest)request).getRequestURI() ); + @PluginFactory + public static JSwingAppender createAppender(@PluginAttribute("name") String name, + @PluginElement("Layout") Layout layout, @PluginElement("Filters") Filter filter, + @PluginAttribute("ignoreExceptions") boolean ignoreExceptions) { + + if (name == null) { + LoggerFactory.getLogger( JSwingAppender.class ).error("No name provided for JTextAreaAppender"); + return null; + } + + if (layout == null) { + layout = PatternLayout.createDefaultLayout(); + } + return new JSwingAppender(name, filter, layout, ignoreExceptions, Property.EMPTY_ARRAY); } @Override - public void destroy() { + public void append(LogEvent event) { + try { + if( isExceptionShown() ) { + final String message = new String(this.getLayout().toByteArray(event)).replaceAll("(\r\n|\n)", "
"); + + // Append formatted message to text area using the Thread. + + SwingUtilities.invokeLater( () -> { + try { + JEditorPane web = new JEditorPane(); + web.setEditable(false); + web.setContentType("text/html"); + web.setText(message); + + JScrollPane scrollPane = new JScrollPane(web); + scrollPane.setPreferredSize(new Dimension(450, 350)); + + JOptionPane.showMessageDialog(null, scrollPane, "Error has been loogged", JOptionPane.ERROR_MESSAGE); + }catch (Exception e) { + // Avoid creating an infinite loop by catching this exception and not logging it as error + logger.debug("Error shown exception", e); + } + } ); + } + } catch (final Exception e) { + // ignore case when the platform hasn't yet been initialized + logger.debug("Error shown exception", e); + } + + } + private boolean isExceptionShown() { + if( showException == null ) { + LocalPropertiesService localPropertiesService = new LocalPropertiesService(); + showException = localPropertiesService.isExceptionShown(); + } + return showException; } -} + public void setExceptionShown(Boolean showException) { + this.showException = showException; + } +} \ No newline at end of file From 6955a4ffb70e6d587a0534b02116f78032a8cccb Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:07 +0100 Subject: [PATCH 0987/1620] New translations FixOtherLand.java (English) --- .../earth/app/view/Messages_en.properties | 132 ++++++++---------- 1 file changed, 59 insertions(+), 73 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 9f9883c25f..6e034a1981 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,94 +1,80 @@ -package org.openforis.collect.earth.app.logging; - -import java.awt.Dimension; - -import javax.swing.JEditorPane; -import javax.swing.JOptionPane; -import javax.swing.JScrollPane; -import javax.swing.SwingUtilities; - -import org.apache.logging.log4j.core.Filter; -import org.apache.logging.log4j.core.Layout; -import org.apache.logging.log4j.core.LogEvent; -import org.apache.logging.log4j.core.appender.AbstractAppender; -import org.apache.logging.log4j.core.config.Property; -import org.apache.logging.log4j.core.config.plugins.Plugin; -import org.apache.logging.log4j.core.config.plugins.PluginAttribute; -import org.apache.logging.log4j.core.config.plugins.PluginElement; -import org.apache.logging.log4j.core.config.plugins.PluginFactory; -import org.apache.logging.log4j.core.layout.PatternLayout; -import org.openforis.collect.earth.app.service.LocalPropertiesService; +package org.openforis.collect.earth.app.ad_hoc; + +import java.util.List; + +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.manager.RecordManager; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.CollectRecordSummary; +import org.openforis.collect.model.RecordFilter; +import org.openforis.idm.model.Coordinate; +import org.openforis.idm.model.CoordinateAttribute; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; -@Plugin(name = "JSwingAppender", category = "Core", elementType = "appender", printObject = true) -public class JSwingAppender extends AbstractAppender { +@Component +public abstract class FixOtherLand { - private Boolean showException; + @Autowired + private RecordManager recordManager; - private Logger logger = LoggerFactory.getLogger( JSwingAppender.class ); + @Autowired + private EarthSurveyService earthSurveyService; - public JSwingAppender(String name, Filter filter, Layout layout, boolean ignoreExceptions, Property[] properties) { - super(name, filter, layout, ignoreExceptions, properties); - } - - @PluginFactory - public static JSwingAppender createAppender(@PluginAttribute("name") String name, - @PluginElement("Layout") Layout layout, @PluginElement("Filters") Filter filter, - @PluginAttribute("ignoreExceptions") boolean ignoreExceptions) { + private Logger logger = LoggerFactory.getLogger( FixOtherLand.class); - if (name == null) { - LoggerFactory.getLogger( JSwingAppender.class ).error("No name provided for JTextAreaAppender"); - return null; - } + private boolean stopFix = false; - if (layout == null) { - layout = PatternLayout.createDefaultLayout(); - } - return new JSwingAppender(name, filter, layout, ignoreExceptions, Property.EMPTY_ARRAY); + private List getAllRecords(){ + RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); + List records = recordManager.loadSummaries( rf ); + return records; } - @Override - public void append(LogEvent event) { - try { - if( isExceptionShown() ) { - final String message = new String(this.getLayout().toByteArray(event)).replaceAll("(\r\n|\n)", "
"); - - // Append formatted message to text area using the Thread. - - SwingUtilities.invokeLater( () -> { - try { - JEditorPane web = new JEditorPane(); - web.setEditable(false); - web.setContentType("text/html"); - web.setText(message); + public void fixCoordinates(){ + List allRecords = getAllRecords(); + + if( shouldStopFixing()){ + return; + } + + for (CollectRecordSummary summaryCollectRecord : allRecords) { + if( shouldStopFixing()){ + break; + } + try { + CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); + CoordinateAttribute plotCoord = (CoordinateAttribute) collectRecord.getNodeByPath("/plot/location"); //$NON-NLS-1$ + if( plotCoord != null && plotCoord.getValue() != null ){ + if( plotCoord.getValue().getX() < getLongitudeLimit() ){ + Coordinate coordinate = new Coordinate(plotCoord.getValue().getY(), plotCoord.getValue().getX(), plotCoord.getValue().getSrsId() ); + plotCoord.setValue( coordinate ); + recordManager.save( collectRecord ); + + } - JScrollPane scrollPane = new JScrollPane(web); - scrollPane.setPreferredSize(new Dimension(450, 350)); - JOptionPane.showMessageDialog(null, scrollPane, "Error has been loogged", JOptionPane.ERROR_MESSAGE); - }catch (Exception e) { - // Avoid creating an infinite loop by catching this exception and not logging it as error - logger.debug("Error shown exception", e); - } - } ); + } + } catch (Exception e) { + logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ } - } catch (final Exception e) { - // ignore case when the platform hasn't yet been initialized - logger.debug("Error shown exception", e); } } - private boolean isExceptionShown() { - if( showException == null ) { - LocalPropertiesService localPropertiesService = new LocalPropertiesService(); - showException = localPropertiesService.isExceptionShown(); - } - return showException; + protected abstract int getLongitudeLimit(); + + private boolean shouldStopFixing() { + return stopFix; } - public void setExceptionShown(Boolean showException) { - this.showException = showException; + public void stopFixing() { + stopFix = true; + } + } \ No newline at end of file From 093d7b61ffa4de712decede0fc9f718ec02adda5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:08 +0100 Subject: [PATCH 0988/1620] New translations MacOpenFilesInvocationHandler.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 122 ++++++++---------- 1 file changed, 54 insertions(+), 68 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 93a4d09fe6..1f014d967a 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,79 +1,65 @@ -package org.openforis.collect.earth.app.server; +package org.openforis.collect.earth.app.desktop; import java.io.File; import java.io.IOException; +import java.lang.reflect.Method; +import java.util.List; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.EarthProjectsService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; /** - * Servlet to load a project file when Collect Earth is already running: - * - * If the user double-clicks on a project file, Collect Earth will first check - * if there is already another instance running, if it is, then send a HTTP - * request and quit. This servlet will receive the HTTP request and load the - * project. - * + * Use reflection to be able to add the code specific to Mac OS X without generating compilation errors + * This class generates a Proxy so that an Interface method can be invoked. Sort of implementing an Interface using reflection + * @see How to implement an interface using Reflection * @author Alfonso Sanchez-Paus Diaz * */ -@Controller -public class LoadProjectFileServlet { - - public static final String PROJECT_FILE_PARAMETER = "projectFilePath"; //$NON-NLS-1$ - public static final String SERVLET_NAME = "loadProjectFile"; //$NON-NLS-1$ - private Logger logger = LoggerFactory.getLogger(LoadProjectFileServlet.class); - - @Autowired - EarthProjectsService earthProjectsService; - - @Autowired - LocalPropertiesService localPropertiesService; - - @GetMapping("/" + SERVLET_NAME) - public void processRequest(HttpServletRequest request, HttpServletResponse response) { - String projectFilePath = request.getParameter(PROJECT_FILE_PARAMETER); - if (StringUtils.isBlank(projectFilePath)) { - logger.error("The " + PROJECT_FILE_PARAMETER + " parameter cannot be empty"); //$NON-NLS-1$ //$NON-NLS-2$ - } else { - - SwingUtilities.invokeLater(() -> { - File projectZipFile = new File(projectFilePath); - try { - if (earthProjectsService.loadCompressedProjectFile(projectZipFile)) { - localPropertiesService.nullifyChecksumValues(); - // Re-generate KMZ - new Thread( - "Restarting server after double-clicking on CEP file : " + projectZipFile.getName()) { - @Override - public void run() { - EarthApp.restart(); - } - - }.start(); - } - - } catch (IllegalArgumentException | IOException e) { - logger.error("Error loading the project file " + projectFilePath, e); //$NON-NLS-1$ - response.setStatus(500); - } - }); - - response.setStatus(200); - - } - - } - -} +public class MacOpenFilesInvocationHandler implements java.lang.reflect.InvocationHandler { + + private final Logger logger = LoggerFactory.getLogger(MacOpenFilesInvocationHandler.class); + + public MacOpenFilesInvocationHandler() { + super(); + } + + public Object invoke(Object proxy, Method m, Object[] args) throws Throwable + + { + + Object result = null; + + try { + + // if the method name equals some method's name then call your method + if ( m!= null && m.getName().equals("openFiles") && args !=null && args.length>0) { + openFilesImplmentation(args[0]); + } + + } catch (Exception e) { + logger.error(" Error while interpreting invocation " , e ); + } finally { + logger.info("end method {}", m!=null?m.getName():"Unknown method"); + } + + return result; + + } + + private void openFilesImplmentation(Object openFilesEventObject) throws Exception { + Class openFilesEventClass = Class.forName("com.apple.eawt.AppEvent.OpenFilesEvent"); + Method getFilesMethod = openFilesEventClass.getMethod("getFiles"); + + List files = (List) getFilesMethod.invoke( openFilesEventClass.cast( openFilesEventObject ) ); + + for (File file : files ){ + try { + EarthApp.openProjectFileInRunningCollectEarth(file.getAbsolutePath()); + } catch (IOException e1) { + logger.error("Error opening CEP file " + e1); + } + } + + } + } + From 7fc41d19d003f5b23ff278ad0955beb0317ad828 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:10 +0100 Subject: [PATCH 0989/1620] New translations findMissingCountries.java (French) --- .../earth/app/view/Messages_fr.properties | 1974 ++++++++++++++++- 1 file changed, 1895 insertions(+), 79 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 93a4d09fe6..768f973a7f 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,79 +1,1895 @@ -package org.openforis.collect.earth.app.server; - -import java.io.File; -import java.io.IOException; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.EarthProjectsService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; - -/** - * Servlet to load a project file when Collect Earth is already running: - * - * If the user double-clicks on a project file, Collect Earth will first check - * if there is already another instance running, if it is, then send a HTTP - * request and quit. This servlet will receive the HTTP request and load the - * project. - * - * @author Alfonso Sanchez-Paus Diaz - * - */ -@Controller -public class LoadProjectFileServlet { - - public static final String PROJECT_FILE_PARAMETER = "projectFilePath"; //$NON-NLS-1$ - public static final String SERVLET_NAME = "loadProjectFile"; //$NON-NLS-1$ - private Logger logger = LoggerFactory.getLogger(LoadProjectFileServlet.class); - - @Autowired - EarthProjectsService earthProjectsService; - - @Autowired - LocalPropertiesService localPropertiesService; - - @GetMapping("/" + SERVLET_NAME) - public void processRequest(HttpServletRequest request, HttpServletResponse response) { - String projectFilePath = request.getParameter(PROJECT_FILE_PARAMETER); - if (StringUtils.isBlank(projectFilePath)) { - logger.error("The " + PROJECT_FILE_PARAMETER + " parameter cannot be empty"); //$NON-NLS-1$ //$NON-NLS-2$ - } else { - - SwingUtilities.invokeLater(() -> { - File projectZipFile = new File(projectFilePath); - try { - if (earthProjectsService.loadCompressedProjectFile(projectZipFile)) { - localPropertiesService.nullifyChecksumValues(); - // Re-generate KMZ - new Thread( - "Restarting server after double-clicking on CEP file : " + projectZipFile.getName()) { - @Override - public void run() { - EarthApp.restart(); - } - - }.start(); - } - - } catch (IllegalArgumentException | IOException e) { - logger.error("Error loading the project file " + projectFilePath, e); //$NON-NLS-1$ - response.setStatus(500); - } - }); - - response.setStatus(200); - - } - - } - -} +package org.openforis.collect.earth.app.ad_hoc; + +import java.util.ArrayList; +import java.util.Arrays; + +public class findMissingCountries { + + private static ArrayList allCountryNames = new ArrayList<>( + Arrays.asList( + "Abyei", + "Afghanistan", + "Aksai_Chin", + "Albania", + "Algeria", + "American_Samoa", + "Andorra", + "Angola", + "Anguilla", + "Antarctica", + "Antigua_and_Barbuda", + "Argentina", + "Armenia", + "Aruba", + "Arunachal_Pradesh", + "Ashmore_and_Cartier_Islands", + "Australia", + "Austria", + "Azerbaijan", + "Azores_Islands", + "Bahamas", + "Bahrain", + "Baker_Island", + "Bangladesh", + "Barbados", + "Bassas_da_India", + "Belarus", + "Belgium", + "Belize", + "Benin", + "Bermuda", + "Bhutan", + "Bird_Island", + "Bolivia", + "Bosnia_and_Herzegovina", + "Botswana", + "Bouvet_Island", + "Brazil", + "British_Indian_Ocean_Territory", + "British_Virgin_Islands", + "Brunei_Darussalam", + "Bulgaria", + "Burkina_Faso", + "Burundi", + "Cambodia", + "Cameroon", + "Canada", + "Cape_Verde", + "Cayman_Islands", + "Central_African_Republic", + "Chad", + "Chile", + "China", + "China/India", + "Christmas_Island", + "Clipperton_Island", + "Cocos__Keeling__Islands", + "Colombia", + "Comoros", + "Congo", + "Cook_Islands", + "Costa_Rica", + "Croatia", + "Cuba", + "Cyprus", + "Czech_Republic", + "C�te_d_Ivoire", + "Dem_People_s_Rep_of_Korea", + "Democratic_Republic_of_the_Congo", + "Denmark", + "Djibouti", + "Dominica", + "Dominican_Republic", + "Ecuador", + "Egypt", + "El_Salvador", + "Equatorial_Guinea", + "Eritrea", + "Estonia", + "Ethiopia", + "Europa_Island", + "Falkland_Islands__Malvinas_", + "Faroe_Islands", + "Fiji", + "Finland", + "France", + "French_Guiana", + "French_Polynesia", + "French_Southern_and_Antarctic_Territories", + "Gabon", + "Gambia", + "Gaza_Strip", + "Georgia", + "Germany", + "Ghana", + "Gibraltar", + "Glorioso_Island", + "Greece", + "Greenland", + "Grenada", + "Guadeloupe", + "Guam", + "Guatemala", + "Guernsey", + "Guinea", + "Guinea-Bissau", + "Guyana", + "Haiti", + "Hala_ib_triangle", + "Heard_Island_and_McDonald_Islands", + "Holy_See", + "Honduras", + "Hong_Kong", + "Howland_Island", + "Hungary", + "Iceland", + "Ilemi_triangle", + "India", + "Indonesia", + "Iran___Islamic_Republic_of_", + "Iraq", + "Ireland", + "Isle_of_Man", + "Israel", + "Italy", + "Jamaica", + "Jammu_and_Kashmir", + "Japan", + "Jarvis_Island", + "Jersey", + "Johnston_Atoll", + "Jordan", + "Juan_de_Nova_Island", + "Kazakhstan", + "Kenya", + "Kingman_Reef", + "Kiribati", + "Kuril_islands", + "Kuwait", + "Kyrgyzstan", + "Lao_People_s_Democratic_Republic", + "Latvia", + "Lebanon", + "Lesotho", + "Liberia", + "Libya", + "Liechtenstein", + "Lithuania", + "Luxembourg", + "Ma_tan_al-Sarra", + "Macau", + "Madagascar", + "Madeira_Islands", + "Malawi", + "Malaysia", + "Maldives", + "Mali", + "Malta", + "Marshall_Islands", + "Martinique", + "Mauritania", + "Mauritius", + "Mayotte", + "Mexico", + "Micronesia__Federated_States_of_", + "Midway_Island", + "Moldova,_Republic_of", + "Monaco", + "Mongolia", + "Montenegro", + "Montserrat", + "Morocco", + "Mozambique", + "Myanmar", + "Namibia", + "Nauru", + "Navassa_Island", + "Nepal", + "Netherlands", + "Netherlands_Antilles", + "New_Caledonia", + "New_Zealand", + "Nicaragua", + "Niger", + "Nigeria", + "Niue", + "Norfolk_Island", + "Northern_Mariana_Islands", + "Norway", + "Oman", + "Pakistan", + "Palau", + "Palmyra_Atoll", + "Panama", + "Papua_New_Guinea", + "Paracel_Islands", + "Paraguay", + "Peru", + "Philippines", + "Pitcairn", + "Poland", + "Portugal", + "Puerto_Rico", + "Qatar", + "Republic_of_Korea", + "Romania", + "Russian_Federation", + "Rwanda", + "R�union", + "Saint_Helena", + "Saint_Kitts_and_Nevis", + "Saint_Lucia", + "Saint_Pierre_et_Miquelon", + "Saint_Vincent_and_the_Grenadines", + "Samoa", + "San_Marino", + "Sao_Tome_and_Principe", + "Saudi_Arabia", + "Scarborough_Reef", + "Senegal", + "Senkaku_Islands", + "Serbia", + "Seychelles", + "Sierra_Leone", + "Singapore", + "Slovakia", + "Slovenia", + "Solomon_Islands", + "Somalia", + "South_Africa", + "South_Georgia_and_the_South_Sandwich_Islands", + "South_Sudan", + "Spain", + "Spratly_Islands", + "Sri_Lanka", + "Sudan", + "Suriname", + "Svalbard_and_Jan_Mayen_Islands", + "Swaziland", + "Sweden", + "Switzerland", + "Syrian_Arab_Republic", + "Taiwan", + "Tajikistan", + "Thailand", + "The_former_Yugoslav_Republic_of_Macedonia", + "Timor-Leste", + "Togo", + "Tokelau", + "Tonga", + "Trinidad_and_Tobago", + "Tromelin_Island", + "Tunisia", + "Turkey", + "Turkmenistan", + "Turks_and_Caicos_islands", + "Tuvalu", + "UK_of_Great_Britain_and_Northern_Ireland", + "Uganda", + "Ukraine", + "United_Arab_Emirates", + "United_Republic_of_Tanzania", + "United_States_Virgin_Islands", + "United_States_of_America", + "Uruguay", + "Uzbekistan", + "Vanuatu", + "Venezuela", + "Viet_Nam", + "Wake_Island", + "Wallis_and_Futuna", + "West_Bank", + "Western_Sahara", + "Yemen", + "Zambia", + "Zimbabwe" ) ); + + private static ArrayList filesGenerated = new ArrayList<>( + Arrays.asList( "Azores_Islands_bassin_10", + "Azores_Islands_bassin_11", + "Azores_Islands_bassin_12", + "Azores_Islands", + "Azores_Islands_bassin_5", + "Azores_Islands_bassin_6", + "Azores_Islands_bassin_7", + "Azores_Islands_bassin_8", + "Azores_Islands_bassin_9", + "Brunei_Darussalam_bassin_10", + "Brunei_Darussalam_bassin_11", + "Brunei_Darussalam_bassin_12", + "Brunei_Darussalam_bassin_7", + "Brunei_Darussalam_bassin_8", + "Brunei_Darussalam_bassin_9", + "Bulgaria_bassin_10", + "Bulgaria_bassin_11", + "Bulgaria_bassin_12", + "Bulgaria", + "Bulgaria_bassin_5", + "Bulgaria_bassin_6", + "Bulgaria_bassin_7", + "Bulgaria_bassin_8", + "Bulgaria_bassin_9", + "Burkina_Faso_bassin_10", + "Burkina_Faso_bassin_11", + "Burkina_Faso_bassin_12", + "Burkina_Faso", + "Burkina_Faso_bassin_5", + "Burkina_Faso_bassin_6", + "Burkina_Faso_bassin_7", + "Burkina_Faso_bassin_8", + "Burkina_Faso_bassin_9", + "Burundi_bassin_10", + "Burundi_bassin_11", + "Burundi_bassin_12", + "Burundi", + "Burundi_bassin_5", + "Burundi_bassin_6", + "Burundi_bassin_7", + "Burundi_bassin_8", + "Burundi_bassin_9", + "Cambodia_bassin_10", + "Cambodia_bassin_11", + "Cambodia_bassin_12", + "Cambodia", + "Cambodia_bassin_5", + "Cambodia_bassin_6", + "Cambodia_bassin_7", + "Cambodia_bassin_8", + "Cambodia_bassin_9", + "Cameroon_bassin_10", + "Cameroon_bassin_11", + "Cameroon_bassin_12", + "Cameroon", + "Cameroon_bassin_5", + "Cameroon_bassin_6", + "Cameroon_bassin_7", + "Cameroon_bassin_8", + "Cameroon_bassin_9", + "Canada_bassin_10", + "Canada_bassin_11", + "Canada_bassin_12", + "Canada", + "Canada_bassin_5", + "Canada_bassin_6", + "Canada_bassin_7", + "Canada_bassin_8", + "Canada_bassin_9", + "Cape_Verde_bassin_10", + "Cape_Verde_bassin_11", + "Cape_Verde_bassin_12", + "Cape_Verde", + "Cape_Verde_bassin_5", + "Cape_Verde_bassin_6", + "Cape_Verde_bassin_7", + "Cape_Verde_bassin_8", + "Cape_Verde_bassin_9", + "Cayman_Islands_bassin_10", + "Cayman_Islands_bassin_11", + "Cayman_Islands_bassin_12", + "Cayman_Islands", + "Cayman_Islands_bassin_5", + "Cayman_Islands_bassin_6", + "Cayman_Islands_bassin_7", + "Cayman_Islands_bassin_8", + "Cayman_Islands_bassin_9", + "Central_African Republic_bassin_10", + "Central_African Republic_bassin_11", + "Central_African Republic_bassin_12", + "Central_African Republic", + "Central_African Republic_bassin_5", + "Central_African Republic_bassin_6", + "Central_African Republic_bassin_7", + "Central_African Republic_bassin_8", + "Central_African Republic_bassin_9", + "Chad_bassin_10", + "Chad_bassin_11", + "Chad_bassin_12", + "Chad", + "Chad_bassin_5", + "Chad_bassin_6", + "Chad_bassin_7", + "Chad_bassin_8", + "Chad_bassin_9", + "Chile_bassin_10", + "Chile_bassin_11", + "Chile_bassin_12", + "Chile", + "Chile_bassin_5", + "Chile_bassin_6", + "Chile_bassin_7", + "Chile_bassin_8", + "Chile_bassin_9", + "China_bassin_10", + "China_bassin_11", + "China_bassin_12", + "China", + "China_bassin_5", + "China_bassin_6", + "China_bassin_7", + "China_bassin_8", + "China_bassin_9", + "Christmas_Island_bassin_10", + "Christmas_Island_bassin_11", + "Christmas_Island_bassin_12", + "Christmas_Island", + "Christmas_Island_bassin_5", + "Christmas_Island_bassin_6", + "Christmas_Island_bassin_7", + "Christmas_Island_bassin_8", + "Christmas_Island_bassin_9", + "Clipperton_Island_bassin_10", + "Clipperton_Island_bassin_11", + "Clipperton_Island_bassin_12", + "Clipperton_Island", + "Clipperton_Island_bassin_5", + "Clipperton_Island_bassin_6", + "Clipperton_Island_bassin_7", + "Clipperton_Island_bassin_8", + "Clipperton_Island_bassin_9", + "Colombia_bassin_10", + "Colombia_bassin_11", + "Colombia_bassin_12", + "Colombia", + "Colombia_bassin_5", + "Colombia_bassin_6", + "Colombia_bassin_7", + "Colombia_bassin_8", + "Colombia_bassin_9", + "Comoros_bassin_10", + "Comoros_bassin_11", + "Comoros_bassin_12", + "Comoros", + "Comoros_bassin_5", + "Comoros_bassin_6", + "Comoros_bassin_7", + "Comoros_bassin_8", + "Comoros_bassin_9", + "Congo_bassin_10", + "Congo_bassin_11", + "Congo_bassin_12", + "Congo", + "Congo_bassin_5", + "Congo_bassin_6", + "Congo_bassin_7", + "Congo_bassin_8", + "Congo_bassin_9", + "Cook_Islands_bassin_10", + "Cook_Islands_bassin_11", + "Cook_Islands_bassin_12", + "Cook_Islands", + "Cook_Islands_bassin_5", + "Cook_Islands_bassin_6", + "Cook_Islands_bassin_7", + "Cook_Islands_bassin_8", + "Cook_Islands_bassin_9", + "Costa_Rica_bassin_10", + "Costa_Rica_bassin_11", + "Costa_Rica_bassin_12", + "Costa_Rica", + "Costa_Rica_bassin_5", + "Costa_Rica_bassin_6", + "Costa_Rica_bassin_7", + "Costa_Rica_bassin_8", + "Costa_Rica_bassin_9", + "Croatia_bassin_10", + "Croatia_bassin_11", + "Croatia_bassin_12", + "Croatia", + "Croatia_bassin_5", + "Croatia_bassin_6", + "Croatia_bassin_7", + "Croatia_bassin_8", + "Croatia_bassin_9", + "Cuba_bassin_10", + "Cuba_bassin_11", + "Cuba_bassin_12", + "Cuba", + "Cuba_bassin_5", + "Cuba_bassin_6", + "Cuba_bassin_7", + "Cuba_bassin_8", + "Cuba_bassin_9", + "Cyprus_bassin_10", + "Cyprus_bassin_11", + "Cyprus_bassin_12", + "Cyprus", + "Cyprus_bassin_5", + "Cyprus_bassin_6", + "Cyprus_bassin_7", + "Cyprus_bassin_8", + "Cyprus_bassin_9", + "Czech_Republic_bassin_10", + "Czech_Republic_bassin_11", + "Czech_Republic_bassin_12", + "Czech_Republic", + "Czech_Republic_bassin_5", + "Czech_Republic_bassin_6", + "Czech_Republic_bassin_7", + "Czech_Republic_bassin_8", + "Czech_Republic_bassin_9", + "Democratic_Republic of the Congo_bassin_10", + "Democratic_Republic of the Congo_bassin_11", + "Democratic_Republic of the Congo_bassin_12", + "Democratic_Republic of the Congo", + "Democratic_Republic of the Congo_bassin_5", + "Democratic_Republic of the Congo_bassin_6", + "Democratic_Republic of the Congo_bassin_7", + "Democratic_Republic of the Congo_bassin_8", + "Democratic_Republic of the Congo_bassin_9", + "Dem_Peoples Rep of Korea_bassin_10", + "Dem_Peoples Rep of Korea_bassin_11", + "Dem_Peoples Rep of Korea_bassin_12", + "Dem_Peoples Rep of Korea", + "Dem_Peoples Rep of Korea_bassin_5", + "Dem_Peoples Rep of Korea_bassin_6", + "Dem_Peoples Rep of Korea_bassin_7", + "Dem_Peoples Rep of Korea_bassin_8", + "Dem_Peoples Rep of Korea_bassin_9", + "Denmark_bassin_10", + "Denmark_bassin_11", + "Denmark_bassin_12", + "Denmark", + "Denmark_bassin_5", + "Denmark_bassin_6", + "Denmark_bassin_7", + "Denmark_bassin_8", + "Denmark_bassin_9", + "Djibouti_bassin_10", + "Djibouti_bassin_11", + "Djibouti_bassin_12", + "Djibouti", + "Djibouti_bassin_5", + "Djibouti_bassin_6", + "Djibouti_bassin_7", + "Djibouti_bassin_8", + "Djibouti_bassin_9", + "Dominican_Republic_bassin_10", + "Dominican_Republic_bassin_11", + "Dominican_Republic_bassin_12", + "Dominican_Republic", + "Dominican_Republic_bassin_5", + "Dominican_Republic_bassin_6", + "Dominican_Republic_bassin_7", + "Dominican_Republic_bassin_8", + "Dominican_Republic_bassin_9", + "Dominica_bassin_10", + "Dominica_bassin_11", + "Dominica_bassin_12", + "Dominica", + "Dominica_bassin_5", + "Dominica_bassin_6", + "Dominica_bassin_7", + "Dominica_bassin_8", + "Dominica_bassin_9", + "Ecuador_bassin_10", + "Ecuador_bassin_11", + "Ecuador_bassin_12", + "Ecuador", + "Ecuador_bassin_5", + "Ecuador_bassin_6", + "Ecuador_bassin_7", + "Ecuador_bassin_8", + "Ecuador_bassin_9", + "Egypt_bassin_10", + "Egypt_bassin_11", + "Egypt_bassin_12", + "Egypt", + "Egypt_bassin_5", + "Egypt_bassin_6", + "Egypt_bassin_7", + "Egypt_bassin_8", + "Egypt_bassin_9", + "El_Salvador_bassin_10", + "El_Salvador_bassin_11", + "El_Salvador_bassin_12", + "El_Salvador", + "El_Salvador_bassin_5", + "El_Salvador_bassin_6", + "El_Salvador_bassin_7", + "El_Salvador_bassin_8", + "El_Salvador_bassin_9", + "Equatorial_Guinea_bassin_10", + "Equatorial_Guinea_bassin_11", + "Equatorial_Guinea_bassin_12", + "Equatorial_Guinea", + "Equatorial_Guinea_bassin_5", + "Equatorial_Guinea_bassin_6", + "Equatorial_Guinea_bassin_7", + "Equatorial_Guinea_bassin_8", + "Equatorial_Guinea_bassin_9", + "Eritrea_bassin_10", + "Eritrea_bassin_11", + "Eritrea_bassin_12", + "Eritrea", + "Eritrea_bassin_5", + "Eritrea_bassin_6", + "Eritrea_bassin_7", + "Eritrea_bassin_8", + "Eritrea_bassin_9", + "Estonia_bassin_10", + "Estonia_bassin_11", + "Estonia_bassin_12", + "Estonia", + "Estonia_bassin_5", + "Estonia_bassin_6", + "Estonia_bassin_7", + "Estonia_bassin_8", + "Estonia_bassin_9", + "Ethiopia_bassin_10", + "Ethiopia_bassin_11", + "Ethiopia_bassin_12", + "Ethiopia", + "Ethiopia_bassin_5", + "Ethiopia_bassin_6", + "Ethiopia_bassin_7", + "Ethiopia_bassin_8", + "Ethiopia_bassin_9", + "Europa_Island_bassin_10", + "Europa_Island_bassin_11", + "Europa_Island_bassin_12", + "Europa_Island", + "Europa_Island_bassin_5", + "Europa_Island_bassin_6", + "Europa_Island_bassin_7", + "Europa_Island_bassin_8", + "Europa_Island_bassin_9", + "Faroe_Islands_bassin_10", + "Faroe_Islands_bassin_11", + "Faroe_Islands_bassin_12", + "Faroe_Islands", + "Faroe_Islands_bassin_5", + "Faroe_Islands_bassin_6", + "Faroe_Islands_bassin_7", + "Faroe_Islands_bassin_8", + "Faroe_Islands_bassin_9", + "Fiji_bassin_10", + "Fiji_bassin_11", + "Fiji_bassin_12", + "Fiji", + "Fiji_bassin_5", + "Fiji_bassin_6", + "Fiji_bassin_7", + "Fiji_bassin_8", + "Fiji_bassin_9", + "Finland_bassin_10", + "Finland_bassin_11", + "Finland_bassin_12", + "Finland", + "Finland_bassin_5", + "Finland_bassin_6", + "Finland_bassin_7", + "Finland_bassin_8", + "Finland_bassin_9", + "France_bassin_10", + "France_bassin_11", + "France_bassin_12", + "France", + "France_bassin_5", + "France_bassin_6", + "France_bassin_7", + "France_bassin_8", + "France_bassin_9", + "French_Guiana_bassin_10", + "French_Guiana_bassin_11", + "French_Guiana_bassin_12", + "French_Guiana", + "French_Guiana_bassin_5", + "French_Guiana_bassin_6", + "French_Guiana_bassin_7", + "French_Guiana_bassin_8", + "French_Guiana_bassin_9", + "French_Polynesia_bassin_10", + "French_Polynesia_bassin_11", + "French_Polynesia_bassin_12", + "French_Polynesia", + "French_Polynesia_bassin_5", + "French_Polynesia_bassin_6", + "French_Polynesia_bassin_7", + "French_Polynesia_bassin_8", + "French_Polynesia_bassin_9", + "French_Southern and Antarctic Territories_bassin_10", + "French_Southern and Antarctic Territories_bassin_11", + "French_Southern and Antarctic Territories_bassin_12", + "French_Southern and Antarctic Territories", + "French_Southern and Antarctic Territories_bassin_5", + "French_Southern and Antarctic Territories_bassin_6", + "French_Southern and Antarctic Territories_bassin_7", + "French_Southern and Antarctic Territories_bassin_8", + "French_Southern and Antarctic Territories_bassin_9", + "Gabon_bassin_10", + "Gabon_bassin_11", + "Gabon_bassin_12", + "Gabon", + "Gabon_bassin_5", + "Gabon_bassin_6", + "Gabon_bassin_7", + "Gabon_bassin_8", + "Gabon_bassin_9", + "Gambia_bassin_10", + "Gambia_bassin_11", + "Gambia_bassin_12", + "Gambia", + "Gambia_bassin_5", + "Gambia_bassin_6", + "Gambia_bassin_7", + "Gambia_bassin_8", + "Gambia_bassin_9", + "Gaza_Strip_bassin_10", + "Gaza_Strip_bassin_11", + "Gaza_Strip_bassin_12", + "Gaza_Strip", + "Gaza_Strip_bassin_5", + "Gaza_Strip_bassin_6", + "Gaza_Strip_bassin_7", + "Gaza_Strip_bassin_8", + "Gaza_Strip_bassin_9", + "Georgia_bassin_10", + "Georgia_bassin_11", + "Georgia_bassin_12", + "Georgia", + "Georgia_bassin_5", + "Georgia_bassin_6", + "Georgia_bassin_7", + "Georgia_bassin_8", + "Georgia_bassin_9", + "Germany_bassin_10", + "Germany_bassin_11", + "Germany_bassin_12", + "Germany", + "Germany_bassin_5", + "Germany_bassin_6", + "Germany_bassin_7", + "Germany_bassin_8", + "Germany_bassin_9", + "Ghana_bassin_10", + "Ghana_bassin_11", + "Ghana_bassin_12", + "Ghana", + "Ghana_bassin_5", + "Ghana_bassin_6", + "Ghana_bassin_8", + "Ghana_bassin_9", + "Gibraltar_bassin_10", + "Gibraltar_bassin_11", + "Gibraltar_bassin_12", + "Gibraltar", + "Gibraltar_bassin_5", + "Gibraltar_bassin_6", + "Gibraltar_bassin_7", + "Gibraltar_bassin_8", + "Gibraltar_bassin_9", + "Glorioso_Island_bassin_10", + "Glorioso_Island_bassin_11", + "Glorioso_Island_bassin_12", + "Glorioso_Island", + "Glorioso_Island_bassin_5", + "Glorioso_Island_bassin_6", + "Glorioso_Island_bassin_7", + "Glorioso_Island_bassin_8", + "Glorioso_Island_bassin_9", + "Greece_bassin_10", + "Greece_bassin_11", + "Greece_bassin_12", + "Greece", + "Greece_bassin_5", + "Greece_bassin_6", + "Greece_bassin_7", + "Greece_bassin_8", + "Greece_bassin_9", + "Greenland_bassin_10", + "Greenland_bassin_11", + "Greenland_bassin_12", + "Greenland", + "Greenland_bassin_5", + "Greenland_bassin_6", + "Greenland_bassin_7", + "Greenland_bassin_8", + "Greenland_bassin_9", + "Grenada_bassin_10", + "Grenada_bassin_11", + "Grenada_bassin_12", + "Grenada", + "Grenada_bassin_5", + "Grenada_bassin_6", + "Grenada_bassin_7", + "Grenada_bassin_8", + "Grenada_bassin_9", + "Guadeloupe_bassin_10", + "Guadeloupe_bassin_11", + "Guadeloupe_bassin_12", + "Guadeloupe", + "Guadeloupe_bassin_5", + "Guadeloupe_bassin_6", + "Guadeloupe_bassin_7", + "Guadeloupe_bassin_8", + "Guadeloupe_bassin_9", + "Guam_bassin_10", + "Guam_bassin_11", + "Guam_bassin_12", + "Guam", + "Guam_bassin_5", + "Guam_bassin_6", + "Guam_bassin_7", + "Guam_bassin_8", + "Guam_bassin_9", + "Halaib_triangle_bassin_10", + "Halaib_triangle_bassin_11", + "Halaib_triangle_bassin_12", + "Halaib_triangle", + "Halaib_triangle_bassin_5", + "Halaib_triangle_bassin_6", + "Halaib_triangle_bassin_7", + "Halaib_triangle_bassin_8", + "Halaib_triangle_bassin_9", + "Heard_Island and McDonald Islands_bassin_12", + "Holy_See_bassin_10", + "Holy_See_bassin_11", + "Holy_See_bassin_12", + "Holy_See", + "Holy_See_bassin_5", + "Holy_See_bassin_6", + "Holy_See_bassin_7", + "Holy_See_bassin_8", + "Holy_See_bassin_9", + "Honduras_bassin_10", + "Honduras_bassin_11", + "Honduras_bassin_12", + "Honduras", + "Honduras_bassin_5", + "Honduras_bassin_6", + "Honduras_bassin_7", + "Honduras_bassin_8", + "Honduras_bassin_9", + "Hong_Kong_bassin_10", + "Hong_Kong_bassin_11", + "Hong_Kong_bassin_12", + "Hong_Kong", + "Hong_Kong_bassin_5", + "Hong_Kong_bassin_6", + "Hong_Kong_bassin_7", + "Hong_Kong_bassin_8", + "Hong_Kong_bassin_9", + "Howland_Island_bassin_10", + "Howland_Island_bassin_11", + "Howland_Island_bassin_12", + "Howland_Island", + "Howland_Island_bassin_5", + "Howland_Island_bassin_6", + "Howland_Island_bassin_7", + "Howland_Island_bassin_8", + "Howland_Island_bassin_9", + "Hungary_bassin_10", + "Hungary_bassin_11", + "Hungary_bassin_12", + "Hungary", + "Hungary_bassin_5", + "Hungary_bassin_6", + "Hungary_bassin_7", + "Hungary_bassin_8", + "Hungary_bassin_9", + "Iceland_bassin_10", + "Iceland_bassin_11", + "Iceland_bassin_12", + "Iceland", + "Iceland_bassin_5", + "Iceland_bassin_6", + "Iceland_bassin_7", + "Iceland_bassin_8", + "Iceland_bassin_9", + "Ilemi_triangle_bassin_10", + "Ilemi_triangle_bassin_11", + "Ilemi_triangle_bassin_12", + "Ilemi_triangle", + "Ilemi_triangle_bassin_5", + "Ilemi_triangle_bassin_6", + "Ilemi_triangle_bassin_7", + "Ilemi_triangle_bassin_8", + "Ilemi_triangle_bassin_9", + "India_bassin_10", + "India_bassin_11", + "India_bassin_12", + "India", + "India_bassin_5", + "India_bassin_6", + "India_bassin_7", + "India_bassin_8", + "India_bassin_9", + "Indonesia_bassin_10", + "Indonesia_bassin_11", + "Indonesia_bassin_12", + "Indonesia", + "Indonesia_bassin_5", + "Indonesia_bassin_6", + "Indonesia_bassin_7", + "Indonesia_bassin_8", + "Indonesia_bassin_9", + "Iraq_bassin_10", + "Iraq_bassin_11", + "Iraq_bassin_12", + "Iraq", + "Iraq_bassin_5", + "Iraq_bassin_6", + "Iraq_bassin_7", + "Iraq_bassin_8", + "Iraq_bassin_9", + "Ireland_bassin_10", + "Ireland_bassin_11", + "Ireland_bassin_12", + "Ireland", + "Ireland_bassin_5", + "Ireland_bassin_6", + "Ireland_bassin_7", + "Ireland_bassin_8", + "Ireland_bassin_9", + "Isle_of Man_bassin_10", + "Isle_of Man_bassin_11", + "Isle_of Man_bassin_12", + "Isle_of Man", + "Isle_of Man_bassin_5", + "Isle_of Man_bassin_6", + "Isle_of Man_bassin_7", + "Isle_of Man_bassin_8", + "Isle_of Man_bassin_9", + "Israel_bassin_10", + "Israel_bassin_11", + "Israel_bassin_12", + "Israel", + "Israel_bassin_5", + "Israel_bassin_6", + "Israel_bassin_7", + "Israel_bassin_8", + "Israel_bassin_9", + "Italy_bassin_10", + "Italy_bassin_11", + "Italy_bassin_12", + "Italy", + "Italy_bassin_5", + "Italy_bassin_6", + "Italy_bassin_7", + "Italy_bassin_8", + "Italy_bassin_9", + "Jamaica_bassin_10", + "Jamaica_bassin_11", + "Jamaica_bassin_12", + "Jamaica", + "Jamaica_bassin_5", + "Jamaica_bassin_6", + "Jamaica_bassin_7", + "Jamaica_bassin_8", + "Jamaica_bassin_9", + "Jammu_and Kashmir_bassin_10", + "Jammu_and Kashmir_bassin_11", + "Jammu_and Kashmir_bassin_12", + "Jammu_and Kashmir", + "Jammu_and Kashmir_bassin_5", + "Jammu_and Kashmir_bassin_6", + "Jammu_and Kashmir_bassin_7", + "Jammu_and Kashmir_bassin_8", + "Jammu_and Kashmir_bassin_9", + "Japan_bassin_10", + "Japan_bassin_11", + "Japan_bassin_12", + "Japan", + "Japan_bassin_5", + "Japan_bassin_6", + "Japan_bassin_7", + "Japan_bassin_8", + "Japan_bassin_9", + "Jarvis_Island_bassin_10", + "Jarvis_Island_bassin_11", + "Jarvis_Island_bassin_12", + "Jarvis_Island", + "Jarvis_Island_bassin_5", + "Jarvis_Island_bassin_6", + "Jarvis_Island_bassin_7", + "Jarvis_Island_bassin_8", + "Jarvis_Island_bassin_9", + "Jersey_bassin_10", + "Jersey_bassin_11", + "Jersey_bassin_12", + "Jersey", + "Jersey_bassin_5", + "Jersey_bassin_6", + "Jersey_bassin_7", + "Jersey_bassin_8", + "Jersey_bassin_9", + "Johnston_Atoll_bassin_10", + "Johnston_Atoll_bassin_11", + "Johnston_Atoll_bassin_12", + "Johnston_Atoll", + "Johnston_Atoll_bassin_5", + "Johnston_Atoll_bassin_6", + "Johnston_Atoll_bassin_7", + "Johnston_Atoll_bassin_8", + "Johnston_Atoll_bassin_9", + "Jordan_bassin_10", + "Jordan_bassin_11", + "Jordan_bassin_12", + "Jordan", + "Jordan_bassin_5", + "Jordan_bassin_6", + "Jordan_bassin_7", + "Jordan_bassin_8", + "Jordan_bassin_9", + "Juan_de Nova Island_bassin_10", + "Juan_de Nova Island_bassin_11", + "Juan_de Nova Island_bassin_12", + "Juan_de Nova Island", + "Juan_de Nova Island_bassin_5", + "Juan_de Nova Island_bassin_6", + "Juan_de Nova Island_bassin_7", + "Juan_de Nova Island_bassin_8", + "Juan_de Nova Island_bassin_9", + "Kazakhstan_bassin_10", + "Kazakhstan_bassin_11", + "Kazakhstan_bassin_12", + "Kazakhstan", + "Kazakhstan_bassin_5", + "Kazakhstan_bassin_6", + "Kazakhstan_bassin_7", + "Kazakhstan_bassin_8", + "Kazakhstan_bassin_9", + "Kenya_bassin_10", + "Kenya_bassin_11", + "Kenya_bassin_12", + "Kenya", + "Kenya_bassin_5", + "Kenya_bassin_6", + "Kenya_bassin_7", + "Kenya_bassin_8", + "Kenya_bassin_9", + "Kingman_Reef_bassin_10", + "Kingman_Reef_bassin_11", + "Kingman_Reef_bassin_12", + "Kingman_Reef", + "Kingman_Reef_bassin_5", + "Kingman_Reef_bassin_6", + "Kingman_Reef_bassin_7", + "Kingman_Reef_bassin_8", + "Kingman_Reef_bassin_9", + "Kiribati_bassin_10", + "Kiribati_bassin_11", + "Kiribati_bassin_12", + "Kiribati", + "Kiribati_bassin_5", + "Kiribati_bassin_6", + "Kiribati_bassin_7", + "Kiribati_bassin_8", + "Kiribati_bassin_9", + "Kuril_islands_bassin_10", + "Kuril_islands_bassin_11", + "Kuril_islands_bassin_12", + "Kuril_islands", + "Kuril_islands_bassin_5", + "Kuril_islands_bassin_6", + "Kuril_islands_bassin_7", + "Kuril_islands_bassin_8", + "Kuril_islands_bassin_9", + "Kuwait_bassin_10", + "Kuwait_bassin_11", + "Kuwait_bassin_12", + "Kuwait", + "Kuwait_bassin_5", + "Kuwait_bassin_6", + "Kuwait_bassin_7", + "Kuwait_bassin_8", + "Kuwait_bassin_9", + "Kyrgyzstan_bassin_10", + "Kyrgyzstan_bassin_11", + "Kyrgyzstan_bassin_12", + "Kyrgyzstan", + "Kyrgyzstan_bassin_5", + "Kyrgyzstan_bassin_6", + "Kyrgyzstan_bassin_7", + "Kyrgyzstan_bassin_8", + "Kyrgyzstan_bassin_9", + "Lao_Peoples Democratic Republic_bassin_10", + "Lao_Peoples Democratic Republic_bassin_11", + "Lao_Peoples Democratic Republic_bassin_12", + "Lao_Peoples Democratic Republic", + "Lao_Peoples Democratic Republic_bassin_5", + "Lao_Peoples Democratic Republic_bassin_6", + "Lao_Peoples Democratic Republic_bassin_7", + "Lao_Peoples Democratic Republic_bassin_8", + "Lao_Peoples Democratic Republic_bassin_9", + "Latvia_bassin_10", + "Latvia_bassin_11", + "Latvia_bassin_12", + "Latvia", + "Latvia_bassin_5", + "Latvia_bassin_6", + "Latvia_bassin_7", + "Latvia_bassin_8", + "Latvia_bassin_9", + "Lebanon_bassin_10", + "Lebanon_bassin_11", + "Lebanon_bassin_12", + "Lebanon", + "Lebanon_bassin_5", + "Lebanon_bassin_6", + "Lebanon_bassin_7", + "Lebanon_bassin_8", + "Lebanon_bassin_9", + "Lesotho_bassin_10", + "Lesotho_bassin_11", + "Lesotho_bassin_12", + "Lesotho", + "Lesotho_bassin_5", + "Lesotho_bassin_6", + "Lesotho_bassin_7", + "Lesotho_bassin_8", + "Lesotho_bassin_9", + "Liberia_bassin_10", + "Liberia_bassin_11", + "Liberia_bassin_12", + "Liberia", + "Liberia_bassin_5", + "Liberia_bassin_6", + "Liberia_bassin_7", + "Liberia_bassin_8", + "Liberia_bassin_9", + "Libya_bassin_10", + "Libya_bassin_11", + "Libya_bassin_12", + "Libya", + "Libya_bassin_5", + "Libya_bassin_6", + "Libya_bassin_7", + "Libya_bassin_8", + "Libya_bassin_9", + "Liechtenstein_bassin_10", + "Liechtenstein_bassin_11", + "Liechtenstein_bassin_12", + "Liechtenstein", + "Liechtenstein_bassin_5", + "Liechtenstein_bassin_6", + "Liechtenstein_bassin_7", + "Liechtenstein_bassin_8", + "Liechtenstein_bassin_9", + "Lithuania_bassin_10", + "Lithuania_bassin_11", + "Lithuania_bassin_12", + "Lithuania", + "Lithuania_bassin_5", + "Lithuania_bassin_6", + "Lithuania_bassin_7", + "Lithuania_bassin_8", + "Lithuania_bassin_9", + "Luxembourg_bassin_10", + "Luxembourg_bassin_11", + "Luxembourg_bassin_12", + "Luxembourg", + "Luxembourg_bassin_5", + "Luxembourg_bassin_6", + "Luxembourg_bassin_7", + "Luxembourg_bassin_8", + "Luxembourg_bassin_9", + "Macau_bassin_10", + "Macau_bassin_11", + "Macau_bassin_12", + "Macau", + "Macau_bassin_5", + "Macau_bassin_6", + "Macau_bassin_7", + "Macau_bassin_8", + "Macau_bassin_9", + "Madagascar_bassin_10", + "Madagascar_bassin_11", + "Madagascar_bassin_12", + "Madagascar", + "Madagascar_bassin_5", + "Madagascar_bassin_6", + "Madagascar_bassin_7", + "Madagascar_bassin_8", + "Madagascar_bassin_9", + "Madeira_Islands_bassin_10", + "Madeira_Islands_bassin_11", + "Madeira_Islands_bassin_12", + "Madeira_Islands", + "Madeira_Islands_bassin_5", + "Madeira_Islands_bassin_6", + "Madeira_Islands_bassin_7", + "Madeira_Islands_bassin_8", + "Madeira_Islands_bassin_9", + "Malawi_bassin_10", + "Malawi_bassin_11", + "Malawi_bassin_12", + "Malawi", + "Malawi_bassin_5", + "Malawi_bassin_6", + "Malawi_bassin_7", + "Malawi_bassin_8", + "Malawi_bassin_9", + "Malaysia_bassin_10", + "Malaysia_bassin_11", + "Malaysia_bassin_12", + "Malaysia", + "Malaysia_bassin_5", + "Malaysia_bassin_6", + "Malaysia_bassin_7", + "Malaysia_bassin_8", + "Malaysia_bassin_9", + "Maldives_bassin_10", + "Maldives_bassin_11", + "Maldives_bassin_12", + "Maldives", + "Maldives_bassin_5", + "Maldives_bassin_6", + "Maldives_bassin_7", + "Maldives_bassin_8", + "Maldives_bassin_9", + "Matan_al-Sarra_bassin_10", + "Matan_al-Sarra_bassin_11", + "Matan_al-Sarra_bassin_12", + "Matan_al-Sarra", + "Matan_al-Sarra_bassin_5", + "Matan_al-Sarra_bassin_6", + "Matan_al-Sarra_bassin_7", + "Matan_al-Sarra_bassin_8", + "Matan_al-Sarra_bassin_9", + "Montenegro_bassin_10", + "Montenegro_bassin_11", + "Montenegro_bassin_12", + "Montenegro", + "Montenegro_bassin_5", + "Montenegro_bassin_6", + "Montenegro_bassin_7", + "Montenegro_bassin_8", + "Montenegro_bassin_9", + "Qatar_bassin_10", + "Qatar_bassin_11", + "Qatar_bassin_12", + "Republic_of Korea_bassin_10", + "Republic_of Korea_bassin_11", + "Republic_of Korea_bassin_12", + "Republic_of Korea", + "Republic_of Korea_bassin_5", + "Republic_of Korea_bassin_6", + "Republic_of Korea_bassin_7", + "Republic_of Korea_bassin_8", + "Republic_of Korea_bassin_9", + "Romania_bassin_10", + "Romania_bassin_11", + "Romania_bassin_12", + "Romania", + "Romania_bassin_5", + "Romania_bassin_6", + "Romania_bassin_7", + "Romania_bassin_8", + "Romania_bassin_9", + "Russian_Federation_bassin_10", + "Russian_Federation_bassin_11", + "Russian_Federation_bassin_12", + "Russian_Federation", + "Russian_Federation_bassin_5", + "Russian_Federation_bassin_6", + "Russian_Federation_bassin_7", + "Russian_Federation_bassin_8", + "Russian_Federation_bassin_9", + "Rwanda_bassin_10", + "Rwanda_bassin_11", + "Rwanda_bassin_12", + "Rwanda", + "Rwanda_bassin_5", + "Rwanda_bassin_6", + "Rwanda_bassin_7", + "Rwanda_bassin_8", + "Rwanda_bassin_9", + "Saint_Helena_bassin_10", + "Saint_Helena_bassin_11", + "Saint_Helena_bassin_12", + "Saint_Helena", + "Saint_Helena_bassin_5", + "Saint_Helena_bassin_6", + "Saint_Helena_bassin_7", + "Saint_Helena_bassin_8", + "Saint_Helena_bassin_9", + "Saint_Kitts and Nevis_bassin_10", + "Saint_Kitts and Nevis_bassin_11", + "Saint_Kitts and Nevis_bassin_12", + "Saint_Kitts and Nevis", + "Saint_Kitts and Nevis_bassin_5", + "Saint_Kitts and Nevis_bassin_6", + "Saint_Kitts and Nevis_bassin_7", + "Saint_Kitts and Nevis_bassin_8", + "Saint_Kitts and Nevis_bassin_9", + "Saint_Lucia_bassin_10", + "Saint_Lucia_bassin_11", + "Saint_Lucia_bassin_12", + "Saint_Lucia", + "Saint_Lucia_bassin_5", + "Saint_Lucia_bassin_6", + "Saint_Lucia_bassin_7", + "Saint_Lucia_bassin_8", + "Saint_Lucia_bassin_9", + "Saint_Pierre et Miquelon_bassin_10", + "Saint_Pierre et Miquelon_bassin_11", + "Saint_Pierre et Miquelon_bassin_12", + "Saint_Pierre et Miquelon", + "Saint_Pierre et Miquelon_bassin_5", + "Saint_Pierre et Miquelon_bassin_6", + "Saint_Pierre et Miquelon_bassin_7", + "Saint_Pierre et Miquelon_bassin_8", + "Saint_Pierre et Miquelon_bassin_9", + "Saint_Vincent and the Grenadines_bassin_10", + "Saint_Vincent and the Grenadines_bassin_11", + "Saint_Vincent and the Grenadines_bassin_12", + "Saint_Vincent and the Grenadines", + "Saint_Vincent and the Grenadines_bassin_5", + "Saint_Vincent and the Grenadines_bassin_6", + "Saint_Vincent and the Grenadines_bassin_7", + "Saint_Vincent and the Grenadines_bassin_8", + "Saint_Vincent and the Grenadines_bassin_9", + "Samoa_bassin_10", + "Samoa_bassin_11", + "Samoa_bassin_12", + "Samoa", + "Samoa_bassin_5", + "Samoa_bassin_6", + "Samoa_bassin_7", + "Samoa_bassin_8", + "Samoa_bassin_9", + "San_Marino_bassin_10", + "San_Marino_bassin_11", + "San_Marino_bassin_12", + "San_Marino", + "San_Marino_bassin_5", + "San_Marino_bassin_6", + "San_Marino_bassin_7", + "San_Marino_bassin_8", + "San_Marino_bassin_9", + "Sao_Tome and Principe_bassin_10", + "Sao_Tome and Principe_bassin_11", + "Sao_Tome and Principe_bassin_12", + "Sao_Tome and Principe", + "Sao_Tome and Principe_bassin_5", + "Sao_Tome and Principe_bassin_6", + "Sao_Tome and Principe_bassin_7", + "Sao_Tome and Principe_bassin_8", + "Sao_Tome and Principe_bassin_9", + "Saudi_Arabia_bassin_10", + "Saudi_Arabia_bassin_11", + "Saudi_Arabia_bassin_12", + "Saudi_Arabia", + "Saudi_Arabia_bassin_5", + "Saudi_Arabia_bassin_6", + "Saudi_Arabia_bassin_7", + "Saudi_Arabia_bassin_8", + "Saudi_Arabia_bassin_9", + "Scarborough_Reef_bassin_10", + "Scarborough_Reef_bassin_11", + "Scarborough_Reef_bassin_12", + "Scarborough_Reef", + "Scarborough_Reef_bassin_5", + "Scarborough_Reef_bassin_6", + "Scarborough_Reef_bassin_7", + "Scarborough_Reef_bassin_8", + "Scarborough_Reef_bassin_9", + "Senegal_bassin_10", + "Senegal_bassin_11", + "Senegal_bassin_12", + "Senegal", + "Senegal_bassin_5", + "Senegal_bassin_6", + "Senegal_bassin_7", + "Senegal_bassin_8", + "Senegal_bassin_9", + "Senkaku_Islands_bassin_10", + "Senkaku_Islands_bassin_11", + "Senkaku_Islands_bassin_12", + "Senkaku_Islands", + "Senkaku_Islands_bassin_5", + "Senkaku_Islands_bassin_6", + "Senkaku_Islands_bassin_7", + "Senkaku_Islands_bassin_8", + "Senkaku_Islands_bassin_9", + "Serbia_bassin_10", + "Serbia_bassin_11", + "Serbia_bassin_12", + "Serbia", + "Serbia_bassin_5", + "Serbia_bassin_6", + "Serbia_bassin_7", + "Serbia_bassin_8", + "Serbia_bassin_9", + "Seychelles_bassin_10", + "Seychelles_bassin_11", + "Seychelles_bassin_12", + "Seychelles", + "Seychelles_bassin_5", + "Seychelles_bassin_6", + "Seychelles_bassin_7", + "Seychelles_bassin_8", + "Seychelles_bassin_9", + "Sierra_Leone_bassin_10", + "Sierra_Leone_bassin_11", + "Sierra_Leone_bassin_12", + "Sierra_Leone", + "Sierra_Leone_bassin_5", + "Sierra_Leone_bassin_6", + "Sierra_Leone_bassin_7", + "Sierra_Leone_bassin_8", + "Sierra_Leone_bassin_9", + "Singapore_bassin_10", + "Singapore_bassin_11", + "Singapore_bassin_12", + "Singapore", + "Singapore_bassin_5", + "Singapore_bassin_6", + "Singapore_bassin_7", + "Singapore_bassin_8", + "Singapore_bassin_9", + "Slovakia_bassin_10", + "Slovakia_bassin_11", + "Slovakia_bassin_12", + "Slovakia", + "Slovakia_bassin_5", + "Slovakia_bassin_6", + "Slovakia_bassin_7", + "Slovakia_bassin_8", + "Slovakia_bassin_9", + "Slovenia_bassin_10", + "Slovenia_bassin_11", + "Slovenia_bassin_12", + "Slovenia", + "Slovenia_bassin_5", + "Slovenia_bassin_6", + "Slovenia_bassin_7", + "Slovenia_bassin_8", + "Slovenia_bassin_9", + "Solomon_Islands_bassin_10", + "Solomon_Islands_bassin_11", + "Solomon_Islands_bassin_12", + "Solomon_Islands", + "Solomon_Islands_bassin_5", + "Solomon_Islands_bassin_6", + "Solomon_Islands_bassin_7", + "Solomon_Islands_bassin_8", + "Solomon_Islands_bassin_9", + "Somalia_bassin_10", + "Somalia_bassin_11", + "Somalia_bassin_12", + "Somalia", + "Somalia_bassin_5", + "Somalia_bassin_6", + "Somalia_bassin_7", + "Somalia_bassin_8", + "Somalia_bassin_9", + "South_Africa_bassin_10", + "South_Africa_bassin_11", + "South_Africa_bassin_12", + "South_Africa", + "South_Africa_bassin_5", + "South_Africa_bassin_6", + "South_Africa_bassin_7", + "South_Africa_bassin_8", + "South_Africa_bassin_9", + "South_Georgia and the South Sandwich Islands_bassin_10", + "South_Georgia and the South Sandwich Islands_bassin_11", + "South_Georgia and the South Sandwich Islands_bassin_12", + "South_Georgia and the South Sandwich Islands", + "South_Georgia and the South Sandwich Islands_bassin_5", + "South_Georgia and the South Sandwich Islands_bassin_6", + "South_Georgia and the South Sandwich Islands_bassin_7", + "South_Georgia and the South Sandwich Islands_bassin_8", + "South_Georgia and the South Sandwich Islands_bassin_9", + "South_Sudan_bassin_10", + "South_Sudan_bassin_11", + "South_Sudan_bassin_12", + "South_Sudan", + "South_Sudan_bassin_5", + "South_Sudan_bassin_6", + "South_Sudan_bassin_7", + "South_Sudan_bassin_8", + "South_Sudan_bassin_9", + "Spain_bassin_10", + "Spain_bassin_11", + "Spain_bassin_12", + "Spain", + "Spain_bassin_5", + "Spain_bassin_6", + "Spain_bassin_7", + "Spain_bassin_8", + "Spain_bassin_9", + "Spratly_Islands_bassin_10", + "Spratly_Islands_bassin_11", + "Spratly_Islands_bassin_12", + "Spratly_Islands", + "Spratly_Islands_bassin_5", + "Spratly_Islands_bassin_6", + "Spratly_Islands_bassin_7", + "Spratly_Islands_bassin_8", + "Spratly_Islands_bassin_9", + "Sri_Lanka_bassin_10", + "Sri_Lanka_bassin_11", + "Sri_Lanka_bassin_12", + "Sri_Lanka", + "Sri_Lanka_bassin_5", + "Sri_Lanka_bassin_6", + "Sri_Lanka_bassin_7", + "Sri_Lanka_bassin_8", + "Sri_Lanka_bassin_9", + "Suriname_bassin_10", + "Suriname_bassin_11", + "Suriname_bassin_12", + "Suriname", + "Suriname_bassin_5", + "Suriname_bassin_6", + "Suriname_bassin_7", + "Suriname_bassin_8", + "Suriname_bassin_9", + "Svalbard_and Jan Mayen Islands_bassin_10", + "Svalbard_and Jan Mayen Islands_bassin_11", + "Svalbard_and Jan Mayen Islands_bassin_12", + "Svalbard_and Jan Mayen Islands", + "Svalbard_and Jan Mayen Islands_bassin_5", + "Svalbard_and Jan Mayen Islands_bassin_6", + "Svalbard_and Jan Mayen Islands_bassin_7", + "Svalbard_and Jan Mayen Islands_bassin_8", + "Svalbard_and Jan Mayen Islands_bassin_9", + "Swaziland_bassin_10", + "Swaziland_bassin_11", + "Swaziland_bassin_12", + "Swaziland", + "Swaziland_bassin_5", + "Swaziland_bassin_6", + "Swaziland_bassin_7", + "Swaziland_bassin_8", + "Swaziland_bassin_9", + "Sweden_bassin_10", + "Sweden_bassin_11", + "Sweden_bassin_12", + "Sweden", + "Sweden_bassin_5", + "Sweden_bassin_6", + "Sweden_bassin_7", + "Sweden_bassin_8", + "Sweden_bassin_9", + "Switzerland_bassin_10", + "Switzerland_bassin_11", + "Switzerland_bassin_12", + "Switzerland", + "Switzerland_bassin_5", + "Switzerland_bassin_6", + "Switzerland_bassin_7", + "Switzerland_bassin_8", + "Switzerland_bassin_9", + "Syrian_Arab Republic_bassin_10", + "Syrian_Arab Republic_bassin_11", + "Syrian_Arab Republic_bassin_12", + "Syrian_Arab Republic", + "Syrian_Arab Republic_bassin_5", + "Syrian_Arab Republic_bassin_6", + "Syrian_Arab Republic_bassin_7", + "Syrian_Arab Republic_bassin_8", + "Syrian_Arab Republic_bassin_9", + "Taiwan_bassin_10", + "Taiwan_bassin_11", + "Taiwan_bassin_12", + "Taiwan", + "Taiwan_bassin_5", + "Taiwan_bassin_6", + "Taiwan_bassin_7", + "Taiwan_bassin_8", + "Taiwan_bassin_9", + "Tajikistan_bassin_10", + "Tajikistan_bassin_11", + "Tajikistan_bassin_12", + "Tajikistan", + "Tajikistan_bassin_5", + "Tajikistan_bassin_6", + "Tajikistan_bassin_7", + "Tajikistan_bassin_8", + "Tajikistan_bassin_9", + "Thailand_bassin_10", + "Thailand_bassin_11", + "Thailand_bassin_12", + "Thailand", + "Thailand_bassin_5", + "Thailand_bassin_6", + "Thailand_bassin_7", + "Thailand_bassin_8", + "Thailand_bassin_9", + "The_former Yugoslav Republic of Macedonia_bassin_10", + "The_former Yugoslav Republic of Macedonia_bassin_11", + "The_former Yugoslav Republic of Macedonia_bassin_12", + "The_former Yugoslav Republic of Macedonia", + "The_former Yugoslav Republic of Macedonia_bassin_5", + "The_former Yugoslav Republic of Macedonia_bassin_6", + "The_former Yugoslav Republic of Macedonia_bassin_7", + "The_former Yugoslav Republic of Macedonia_bassin_8", + "The_former Yugoslav Republic of Macedonia_bassin_9", + "Timor-Leste_bassin_10", + "Timor-Leste_bassin_11", + "Timor-Leste_bassin_12", + "Timor-Leste", + "Timor-Leste_bassin_5", + "Timor-Leste_bassin_6", + "Timor-Leste_bassin_7", + "Timor-Leste_bassin_8", + "Timor-Leste_bassin_9", + "Togo_bassin_10", + "Togo_bassin_11", + "Togo_bassin_12", + "Togo", + "Togo_bassin_5", + "Togo_bassin_6", + "Togo_bassin_7", + "Togo_bassin_8", + "Togo_bassin_9", + "Tokelau_bassin_10", + "Tokelau_bassin_11", + "Tokelau_bassin_12", + "Tokelau", + "Tokelau_bassin_5", + "Tokelau_bassin_6", + "Tokelau_bassin_7", + "Tokelau_bassin_8", + "Tokelau_bassin_9", + "Tonga_bassin_10", + "Tonga_bassin_11", + "Tonga_bassin_12", + "Tonga", + "Tonga_bassin_5", + "Tonga_bassin_6", + "Tonga_bassin_7", + "Tonga_bassin_8", + "Tonga_bassin_9", + "Trinidad_and Tobago_bassin_10", + "Trinidad_and Tobago_bassin_11", + "Trinidad_and Tobago_bassin_12", + "Trinidad_and Tobago", + "Trinidad_and Tobago_bassin_5", + "Trinidad_and Tobago_bassin_6", + "Trinidad_and Tobago_bassin_7", + "Trinidad_and Tobago_bassin_8", + "Trinidad_and Tobago_bassin_9", + "Tromelin_Island_bassin_10", + "Tromelin_Island_bassin_11", + "Tromelin_Island_bassin_12", + "Tromelin_Island", + "Tromelin_Island_bassin_5", + "Tromelin_Island_bassin_6", + "Tromelin_Island_bassin_7", + "Tromelin_Island_bassin_8", + "Tromelin_Island_bassin_9", + "Tunisia_bassin_10", + "Tunisia_bassin_11", + "Tunisia_bassin_12", + "Tunisia", + "Tunisia_bassin_5", + "Tunisia_bassin_6", + "Tunisia_bassin_7", + "Tunisia_bassin_8", + "Tunisia_bassin_9", + "Turkey_bassin_10", + "Turkey_bassin_11", + "Turkey_bassin_12", + "Turkey", + "Turkey_bassin_5", + "Turkey_bassin_6", + "Turkey_bassin_7", + "Turkey_bassin_8", + "Turkey_bassin_9", + "Turkmenistan_bassin_10", + "Turkmenistan_bassin_11", + "Turkmenistan_bassin_12", + "Turkmenistan", + "Turkmenistan_bassin_5", + "Turkmenistan_bassin_6", + "Turkmenistan_bassin_7", + "Turkmenistan_bassin_8", + "Turkmenistan_bassin_9", + "Turks_and Caicos islands_bassin_10", + "Turks_and Caicos islands_bassin_11", + "Turks_and Caicos islands_bassin_12", + "Turks_and Caicos islands", + "Turks_and Caicos islands_bassin_5", + "Turks_and Caicos islands_bassin_6", + "Turks_and Caicos islands_bassin_7", + "Turks_and Caicos islands_bassin_8", + "Turks_and Caicos islands_bassin_9", + "Tuvalu_bassin_10", + "Tuvalu_bassin_11", + "Tuvalu_bassin_12", + "Tuvalu", + "Tuvalu_bassin_5", + "Tuvalu_bassin_6", + "Tuvalu_bassin_7", + "Tuvalu_bassin_8", + "Tuvalu_bassin_9", + "Uganda_bassin_10", + "Uganda_bassin_11", + "Uganda_bassin_12", + "Uganda", + "Uganda_bassin_5", + "Uganda_bassin_6", + "Uganda_bassin_7", + "Uganda_bassin_8", + "Uganda_bassin_9", + "Ukraine_bassin_10", + "Ukraine_bassin_11", + "Ukraine_bassin_12", + "Ukraine", + "Ukraine_bassin_5", + "Ukraine_bassin_6", + "Ukraine_bassin_7", + "Ukraine_bassin_8", + "Ukraine_bassin_9", + "UK_of Great Britain and Northern Ireland_bassin_10", + "UK_of Great Britain and Northern Ireland_bassin_11", + "UK_of Great Britain and Northern Ireland_bassin_12", + "UK_of Great Britain and Northern Ireland", + "UK_of Great Britain and Northern Ireland_bassin_5", + "UK_of Great Britain and Northern Ireland_bassin_6", + "UK_of Great Britain and Northern Ireland_bassin_7", + "UK_of Great Britain and Northern Ireland_bassin_8", + "UK_of Great Britain and Northern Ireland_bassin_9", + "United_Arab Emirates_bassin_10", + "United_Arab Emirates_bassin_11", + "United_Arab Emirates_bassin_12", + "United_Arab Emirates", + "United_Arab Emirates_bassin_5", + "United_Arab Emirates_bassin_6", + "United_Arab Emirates_bassin_7", + "United_Arab Emirates_bassin_8", + "United_Arab Emirates_bassin_9", + "United_Republic of Tanzania_bassin_10", + "United_Republic of Tanzania_bassin_11", + "United_Republic of Tanzania_bassin_12", + "United_Republic of Tanzania", + "United_Republic of Tanzania_bassin_5", + "United_Republic of Tanzania_bassin_6", + "United_Republic of Tanzania_bassin_7", + "United_Republic of Tanzania_bassin_8", + "United_Republic of Tanzania_bassin_9", + "United_States of America_bassin_10", + "United_States of America_bassin_11", + "United_States of America_bassin_12", + "United_States of America", + "United_States of America_bassin_5", + "United_States of America_bassin_6", + "United_States of America_bassin_7", + "United_States of America_bassin_8", + "United_States of America_bassin_9", + "United_States Virgin Islands_bassin_10", + "United_States Virgin Islands_bassin_11", + "United_States Virgin Islands_bassin_12", + "United_States Virgin Islands", + "United_States Virgin Islands_bassin_5", + "United_States Virgin Islands_bassin_6", + "United_States Virgin Islands_bassin_7", + "United_States Virgin Islands_bassin_8", + "United_States Virgin Islands_bassin_9", + "Uruguay_bassin_10", + "Uruguay_bassin_11", + "Uruguay_bassin_12", + "Uruguay", + "Uruguay_bassin_5", + "Uruguay_bassin_6", + "Uruguay_bassin_7", + "Uruguay_bassin_8", + "Uruguay_bassin_9", + "Uzbekistan_bassin_10", + "Uzbekistan_bassin_11", + "Uzbekistan_bassin_12", + "Uzbekistan", + "Uzbekistan_bassin_5", + "Uzbekistan_bassin_6", + "Uzbekistan_bassin_7", + "Uzbekistan_bassin_8", + "Uzbekistan_bassin_9", + "Vanuatu_bassin_10", + "Vanuatu_bassin_11", + "Vanuatu_bassin_12", + "Vanuatu", + "Vanuatu_bassin_5", + "Vanuatu_bassin_6", + "Vanuatu_bassin_7", + "Vanuatu_bassin_8", + "Vanuatu_bassin_9", + "Venezuela_bassin_10", + "Venezuela_bassin_11", + "Venezuela_bassin_12", + "Venezuela", + "Venezuela_bassin_5", + "Venezuela_bassin_6", + "Venezuela_bassin_7", + "Venezuela_bassin_8", + "Venezuela_bassin_9", + "Viet_Nam_bassin_10", + "Viet_Nam_bassin_11", + "Viet_Nam_bassin_12", + "Viet_Nam", + "Viet_Nam_bassin_5", + "Viet_Nam_bassin_6", + "Viet_Nam_bassin_7", + "Viet_Nam_bassin_8", + "Viet_Nam_bassin_9", + "Wake_Island_bassin_10", + "Wake_Island_bassin_11", + "Wake_Island_bassin_12", + "Wake_Island", + "Wake_Island_bassin_5", + "Wake_Island_bassin_6", + "Wake_Island_bassin_7", + "Wake_Island_bassin_8", + "Wake_Island_bassin_9", + "Wallis_and Futuna_bassin_10", + "Wallis_and Futuna_bassin_11", + "Wallis_and Futuna_bassin_12", + "Wallis_and Futuna", + "Wallis_and Futuna_bassin_5", + "Wallis_and Futuna_bassin_6", + "Wallis_and Futuna_bassin_7", + "Wallis_and Futuna_bassin_8", + "Wallis_and Futuna_bassin_9", + "Western_Sahara_bassin_10", + "Western_Sahara_bassin_11", + "Western_Sahara_bassin_12", + "Western_Sahara", + "Western_Sahara_bassin_5", + "Western_Sahara_bassin_6", + "Western_Sahara_bassin_7", + "Western_Sahara_bassin_8", + "Western_Sahara_bassin_9", + "West_Bank_bassin_10", + "West_Bank_bassin_11", + "West_Bank_bassin_12", + "West_Bank", + "West_Bank_bassin_5", + "West_Bank_bassin_6", + "West_Bank_bassin_7", + "West_Bank_bassin_8", + "West_Bank_bassin_9", + "Yemen_bassin_10", + "Yemen_bassin_11", + "Yemen_bassin_12", + "Yemen", + "Yemen_bassin_5", + "Yemen_bassin_6", + "Yemen_bassin_7", + "Yemen_bassin_8", + "Yemen_bassin_9", + "Zambia_bassin_10", + "Zambia_bassin_11", + "Zambia_bassin_12", + "Zambia", + "Zambia_bassin_5", + "Zambia_bassin_6", + "Zambia_bassin_7", + "Zambia_bassin_8", + "Zambia_bassin_9", + "Zimbabwe_bassin_10", + "Zimbabwe_bassin_11", + "Zimbabwe_bassin_12", + "Zimbabwe", + "Zimbabwe_bassin_5", + "Zimbabwe_bassin_6", + "Zimbabwe_bassin_7", + "Zimbabwe_bassin_8", + "Zimbabwe_bassin_9" + ) ); + + public static void main(String[] args) { + + ArrayList missingCountries = new ArrayList(); + + for (String country : allCountryNames) { + if( !filesGenerated.contains(country) ) { + missingCountries.add( country); + } + } + System.out.println( missingCountries.size() ); + System.out.println( missingCountries ); + + String finalCountries = ""; + for (String missing : missingCountries) { + finalCountries += '"' + missing.replaceAll( "_", " ") + "\", "; + } + System.out.println( finalCountries ); + + } + + +} From bf9cf7a6f1e9db359b562d4930c59d5dcbaaf110 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:11 +0100 Subject: [PATCH 0990/1620] New translations findMissingCountries.java (Spanish) --- .../earth/app/view/Messages_es.properties | 1953 ++++++++++++++++- 1 file changed, 1895 insertions(+), 58 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index dfaad035c3..768f973a7f 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,58 +1,1895 @@ -package org.openforis.collect.earth.app.model; - -import org.openforis.collect.earth.app.view.Messages; - -/** - * Enumeration of the aspects that Collect Earth can use to classify the plots. - * Each aspect has an ID attach to it and represents a 45 dregree range ( -22.5 to 22.5 for North, 22.5 to 67.5 to North East, 66.5 to 112.5 for East - * and so on) - * The enumeration also has an static method to calculate the - * - * @author Alfonso Sanchez-Paus Diaz - * - */ -public enum AspectCode { - N(Messages.getString("AspectCode.0"), 1), NE(Messages.getString("AspectCode.1"), 2), E(Messages.getString("AspectCode.2"), 3), SE(Messages.getString("AspectCode.3"), 4), S(Messages.getString("AspectCode.4"), 5), SW(Messages.getString("AspectCode.5"), 6), W(Messages.getString("AspectCode.6"), 7), NW(Messages.getString("AspectCode.7"), 8), NA( "NA", 9); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ - /** - * Utility method to get the aspect code ( N, N-E ... ) from the aspect in degrees - * - * @param aspect - * The aspect in degrees - * @return The aspect code corresponding to the aspect in degrees. - */ - public static AspectCode getAspectCode(Double aspect) { - double aspectProc = aspect + 22.5d; // North starts at -22.5, so add 22.5 to normalize so north becomes 0-45 , north east 45-90 and so on.. - if (aspectProc >= 360d) { - aspectProc = aspectProc - 360d; - } - final int modulo = (int) Math.floor(aspectProc / 45d); - return AspectCode.values()[modulo]; - } - - private String label; - - private int id; - - private AspectCode(String label, int id) { - this.label = label; - this.id = id; - } - - public int getId() { - return id; - } - - public String getLabel() { - return label; - } - - public void setId(int id) { - this.id = id; - } - - @Override - public String toString() { - return label; - } - -} +package org.openforis.collect.earth.app.ad_hoc; + +import java.util.ArrayList; +import java.util.Arrays; + +public class findMissingCountries { + + private static ArrayList allCountryNames = new ArrayList<>( + Arrays.asList( + "Abyei", + "Afghanistan", + "Aksai_Chin", + "Albania", + "Algeria", + "American_Samoa", + "Andorra", + "Angola", + "Anguilla", + "Antarctica", + "Antigua_and_Barbuda", + "Argentina", + "Armenia", + "Aruba", + "Arunachal_Pradesh", + "Ashmore_and_Cartier_Islands", + "Australia", + "Austria", + "Azerbaijan", + "Azores_Islands", + "Bahamas", + "Bahrain", + "Baker_Island", + "Bangladesh", + "Barbados", + "Bassas_da_India", + "Belarus", + "Belgium", + "Belize", + "Benin", + "Bermuda", + "Bhutan", + "Bird_Island", + "Bolivia", + "Bosnia_and_Herzegovina", + "Botswana", + "Bouvet_Island", + "Brazil", + "British_Indian_Ocean_Territory", + "British_Virgin_Islands", + "Brunei_Darussalam", + "Bulgaria", + "Burkina_Faso", + "Burundi", + "Cambodia", + "Cameroon", + "Canada", + "Cape_Verde", + "Cayman_Islands", + "Central_African_Republic", + "Chad", + "Chile", + "China", + "China/India", + "Christmas_Island", + "Clipperton_Island", + "Cocos__Keeling__Islands", + "Colombia", + "Comoros", + "Congo", + "Cook_Islands", + "Costa_Rica", + "Croatia", + "Cuba", + "Cyprus", + "Czech_Republic", + "C�te_d_Ivoire", + "Dem_People_s_Rep_of_Korea", + "Democratic_Republic_of_the_Congo", + "Denmark", + "Djibouti", + "Dominica", + "Dominican_Republic", + "Ecuador", + "Egypt", + "El_Salvador", + "Equatorial_Guinea", + "Eritrea", + "Estonia", + "Ethiopia", + "Europa_Island", + "Falkland_Islands__Malvinas_", + "Faroe_Islands", + "Fiji", + "Finland", + "France", + "French_Guiana", + "French_Polynesia", + "French_Southern_and_Antarctic_Territories", + "Gabon", + "Gambia", + "Gaza_Strip", + "Georgia", + "Germany", + "Ghana", + "Gibraltar", + "Glorioso_Island", + "Greece", + "Greenland", + "Grenada", + "Guadeloupe", + "Guam", + "Guatemala", + "Guernsey", + "Guinea", + "Guinea-Bissau", + "Guyana", + "Haiti", + "Hala_ib_triangle", + "Heard_Island_and_McDonald_Islands", + "Holy_See", + "Honduras", + "Hong_Kong", + "Howland_Island", + "Hungary", + "Iceland", + "Ilemi_triangle", + "India", + "Indonesia", + "Iran___Islamic_Republic_of_", + "Iraq", + "Ireland", + "Isle_of_Man", + "Israel", + "Italy", + "Jamaica", + "Jammu_and_Kashmir", + "Japan", + "Jarvis_Island", + "Jersey", + "Johnston_Atoll", + "Jordan", + "Juan_de_Nova_Island", + "Kazakhstan", + "Kenya", + "Kingman_Reef", + "Kiribati", + "Kuril_islands", + "Kuwait", + "Kyrgyzstan", + "Lao_People_s_Democratic_Republic", + "Latvia", + "Lebanon", + "Lesotho", + "Liberia", + "Libya", + "Liechtenstein", + "Lithuania", + "Luxembourg", + "Ma_tan_al-Sarra", + "Macau", + "Madagascar", + "Madeira_Islands", + "Malawi", + "Malaysia", + "Maldives", + "Mali", + "Malta", + "Marshall_Islands", + "Martinique", + "Mauritania", + "Mauritius", + "Mayotte", + "Mexico", + "Micronesia__Federated_States_of_", + "Midway_Island", + "Moldova,_Republic_of", + "Monaco", + "Mongolia", + "Montenegro", + "Montserrat", + "Morocco", + "Mozambique", + "Myanmar", + "Namibia", + "Nauru", + "Navassa_Island", + "Nepal", + "Netherlands", + "Netherlands_Antilles", + "New_Caledonia", + "New_Zealand", + "Nicaragua", + "Niger", + "Nigeria", + "Niue", + "Norfolk_Island", + "Northern_Mariana_Islands", + "Norway", + "Oman", + "Pakistan", + "Palau", + "Palmyra_Atoll", + "Panama", + "Papua_New_Guinea", + "Paracel_Islands", + "Paraguay", + "Peru", + "Philippines", + "Pitcairn", + "Poland", + "Portugal", + "Puerto_Rico", + "Qatar", + "Republic_of_Korea", + "Romania", + "Russian_Federation", + "Rwanda", + "R�union", + "Saint_Helena", + "Saint_Kitts_and_Nevis", + "Saint_Lucia", + "Saint_Pierre_et_Miquelon", + "Saint_Vincent_and_the_Grenadines", + "Samoa", + "San_Marino", + "Sao_Tome_and_Principe", + "Saudi_Arabia", + "Scarborough_Reef", + "Senegal", + "Senkaku_Islands", + "Serbia", + "Seychelles", + "Sierra_Leone", + "Singapore", + "Slovakia", + "Slovenia", + "Solomon_Islands", + "Somalia", + "South_Africa", + "South_Georgia_and_the_South_Sandwich_Islands", + "South_Sudan", + "Spain", + "Spratly_Islands", + "Sri_Lanka", + "Sudan", + "Suriname", + "Svalbard_and_Jan_Mayen_Islands", + "Swaziland", + "Sweden", + "Switzerland", + "Syrian_Arab_Republic", + "Taiwan", + "Tajikistan", + "Thailand", + "The_former_Yugoslav_Republic_of_Macedonia", + "Timor-Leste", + "Togo", + "Tokelau", + "Tonga", + "Trinidad_and_Tobago", + "Tromelin_Island", + "Tunisia", + "Turkey", + "Turkmenistan", + "Turks_and_Caicos_islands", + "Tuvalu", + "UK_of_Great_Britain_and_Northern_Ireland", + "Uganda", + "Ukraine", + "United_Arab_Emirates", + "United_Republic_of_Tanzania", + "United_States_Virgin_Islands", + "United_States_of_America", + "Uruguay", + "Uzbekistan", + "Vanuatu", + "Venezuela", + "Viet_Nam", + "Wake_Island", + "Wallis_and_Futuna", + "West_Bank", + "Western_Sahara", + "Yemen", + "Zambia", + "Zimbabwe" ) ); + + private static ArrayList filesGenerated = new ArrayList<>( + Arrays.asList( "Azores_Islands_bassin_10", + "Azores_Islands_bassin_11", + "Azores_Islands_bassin_12", + "Azores_Islands", + "Azores_Islands_bassin_5", + "Azores_Islands_bassin_6", + "Azores_Islands_bassin_7", + "Azores_Islands_bassin_8", + "Azores_Islands_bassin_9", + "Brunei_Darussalam_bassin_10", + "Brunei_Darussalam_bassin_11", + "Brunei_Darussalam_bassin_12", + "Brunei_Darussalam_bassin_7", + "Brunei_Darussalam_bassin_8", + "Brunei_Darussalam_bassin_9", + "Bulgaria_bassin_10", + "Bulgaria_bassin_11", + "Bulgaria_bassin_12", + "Bulgaria", + "Bulgaria_bassin_5", + "Bulgaria_bassin_6", + "Bulgaria_bassin_7", + "Bulgaria_bassin_8", + "Bulgaria_bassin_9", + "Burkina_Faso_bassin_10", + "Burkina_Faso_bassin_11", + "Burkina_Faso_bassin_12", + "Burkina_Faso", + "Burkina_Faso_bassin_5", + "Burkina_Faso_bassin_6", + "Burkina_Faso_bassin_7", + "Burkina_Faso_bassin_8", + "Burkina_Faso_bassin_9", + "Burundi_bassin_10", + "Burundi_bassin_11", + "Burundi_bassin_12", + "Burundi", + "Burundi_bassin_5", + "Burundi_bassin_6", + "Burundi_bassin_7", + "Burundi_bassin_8", + "Burundi_bassin_9", + "Cambodia_bassin_10", + "Cambodia_bassin_11", + "Cambodia_bassin_12", + "Cambodia", + "Cambodia_bassin_5", + "Cambodia_bassin_6", + "Cambodia_bassin_7", + "Cambodia_bassin_8", + "Cambodia_bassin_9", + "Cameroon_bassin_10", + "Cameroon_bassin_11", + "Cameroon_bassin_12", + "Cameroon", + "Cameroon_bassin_5", + "Cameroon_bassin_6", + "Cameroon_bassin_7", + "Cameroon_bassin_8", + "Cameroon_bassin_9", + "Canada_bassin_10", + "Canada_bassin_11", + "Canada_bassin_12", + "Canada", + "Canada_bassin_5", + "Canada_bassin_6", + "Canada_bassin_7", + "Canada_bassin_8", + "Canada_bassin_9", + "Cape_Verde_bassin_10", + "Cape_Verde_bassin_11", + "Cape_Verde_bassin_12", + "Cape_Verde", + "Cape_Verde_bassin_5", + "Cape_Verde_bassin_6", + "Cape_Verde_bassin_7", + "Cape_Verde_bassin_8", + "Cape_Verde_bassin_9", + "Cayman_Islands_bassin_10", + "Cayman_Islands_bassin_11", + "Cayman_Islands_bassin_12", + "Cayman_Islands", + "Cayman_Islands_bassin_5", + "Cayman_Islands_bassin_6", + "Cayman_Islands_bassin_7", + "Cayman_Islands_bassin_8", + "Cayman_Islands_bassin_9", + "Central_African Republic_bassin_10", + "Central_African Republic_bassin_11", + "Central_African Republic_bassin_12", + "Central_African Republic", + "Central_African Republic_bassin_5", + "Central_African Republic_bassin_6", + "Central_African Republic_bassin_7", + "Central_African Republic_bassin_8", + "Central_African Republic_bassin_9", + "Chad_bassin_10", + "Chad_bassin_11", + "Chad_bassin_12", + "Chad", + "Chad_bassin_5", + "Chad_bassin_6", + "Chad_bassin_7", + "Chad_bassin_8", + "Chad_bassin_9", + "Chile_bassin_10", + "Chile_bassin_11", + "Chile_bassin_12", + "Chile", + "Chile_bassin_5", + "Chile_bassin_6", + "Chile_bassin_7", + "Chile_bassin_8", + "Chile_bassin_9", + "China_bassin_10", + "China_bassin_11", + "China_bassin_12", + "China", + "China_bassin_5", + "China_bassin_6", + "China_bassin_7", + "China_bassin_8", + "China_bassin_9", + "Christmas_Island_bassin_10", + "Christmas_Island_bassin_11", + "Christmas_Island_bassin_12", + "Christmas_Island", + "Christmas_Island_bassin_5", + "Christmas_Island_bassin_6", + "Christmas_Island_bassin_7", + "Christmas_Island_bassin_8", + "Christmas_Island_bassin_9", + "Clipperton_Island_bassin_10", + "Clipperton_Island_bassin_11", + "Clipperton_Island_bassin_12", + "Clipperton_Island", + "Clipperton_Island_bassin_5", + "Clipperton_Island_bassin_6", + "Clipperton_Island_bassin_7", + "Clipperton_Island_bassin_8", + "Clipperton_Island_bassin_9", + "Colombia_bassin_10", + "Colombia_bassin_11", + "Colombia_bassin_12", + "Colombia", + "Colombia_bassin_5", + "Colombia_bassin_6", + "Colombia_bassin_7", + "Colombia_bassin_8", + "Colombia_bassin_9", + "Comoros_bassin_10", + "Comoros_bassin_11", + "Comoros_bassin_12", + "Comoros", + "Comoros_bassin_5", + "Comoros_bassin_6", + "Comoros_bassin_7", + "Comoros_bassin_8", + "Comoros_bassin_9", + "Congo_bassin_10", + "Congo_bassin_11", + "Congo_bassin_12", + "Congo", + "Congo_bassin_5", + "Congo_bassin_6", + "Congo_bassin_7", + "Congo_bassin_8", + "Congo_bassin_9", + "Cook_Islands_bassin_10", + "Cook_Islands_bassin_11", + "Cook_Islands_bassin_12", + "Cook_Islands", + "Cook_Islands_bassin_5", + "Cook_Islands_bassin_6", + "Cook_Islands_bassin_7", + "Cook_Islands_bassin_8", + "Cook_Islands_bassin_9", + "Costa_Rica_bassin_10", + "Costa_Rica_bassin_11", + "Costa_Rica_bassin_12", + "Costa_Rica", + "Costa_Rica_bassin_5", + "Costa_Rica_bassin_6", + "Costa_Rica_bassin_7", + "Costa_Rica_bassin_8", + "Costa_Rica_bassin_9", + "Croatia_bassin_10", + "Croatia_bassin_11", + "Croatia_bassin_12", + "Croatia", + "Croatia_bassin_5", + "Croatia_bassin_6", + "Croatia_bassin_7", + "Croatia_bassin_8", + "Croatia_bassin_9", + "Cuba_bassin_10", + "Cuba_bassin_11", + "Cuba_bassin_12", + "Cuba", + "Cuba_bassin_5", + "Cuba_bassin_6", + "Cuba_bassin_7", + "Cuba_bassin_8", + "Cuba_bassin_9", + "Cyprus_bassin_10", + "Cyprus_bassin_11", + "Cyprus_bassin_12", + "Cyprus", + "Cyprus_bassin_5", + "Cyprus_bassin_6", + "Cyprus_bassin_7", + "Cyprus_bassin_8", + "Cyprus_bassin_9", + "Czech_Republic_bassin_10", + "Czech_Republic_bassin_11", + "Czech_Republic_bassin_12", + "Czech_Republic", + "Czech_Republic_bassin_5", + "Czech_Republic_bassin_6", + "Czech_Republic_bassin_7", + "Czech_Republic_bassin_8", + "Czech_Republic_bassin_9", + "Democratic_Republic of the Congo_bassin_10", + "Democratic_Republic of the Congo_bassin_11", + "Democratic_Republic of the Congo_bassin_12", + "Democratic_Republic of the Congo", + "Democratic_Republic of the Congo_bassin_5", + "Democratic_Republic of the Congo_bassin_6", + "Democratic_Republic of the Congo_bassin_7", + "Democratic_Republic of the Congo_bassin_8", + "Democratic_Republic of the Congo_bassin_9", + "Dem_Peoples Rep of Korea_bassin_10", + "Dem_Peoples Rep of Korea_bassin_11", + "Dem_Peoples Rep of Korea_bassin_12", + "Dem_Peoples Rep of Korea", + "Dem_Peoples Rep of Korea_bassin_5", + "Dem_Peoples Rep of Korea_bassin_6", + "Dem_Peoples Rep of Korea_bassin_7", + "Dem_Peoples Rep of Korea_bassin_8", + "Dem_Peoples Rep of Korea_bassin_9", + "Denmark_bassin_10", + "Denmark_bassin_11", + "Denmark_bassin_12", + "Denmark", + "Denmark_bassin_5", + "Denmark_bassin_6", + "Denmark_bassin_7", + "Denmark_bassin_8", + "Denmark_bassin_9", + "Djibouti_bassin_10", + "Djibouti_bassin_11", + "Djibouti_bassin_12", + "Djibouti", + "Djibouti_bassin_5", + "Djibouti_bassin_6", + "Djibouti_bassin_7", + "Djibouti_bassin_8", + "Djibouti_bassin_9", + "Dominican_Republic_bassin_10", + "Dominican_Republic_bassin_11", + "Dominican_Republic_bassin_12", + "Dominican_Republic", + "Dominican_Republic_bassin_5", + "Dominican_Republic_bassin_6", + "Dominican_Republic_bassin_7", + "Dominican_Republic_bassin_8", + "Dominican_Republic_bassin_9", + "Dominica_bassin_10", + "Dominica_bassin_11", + "Dominica_bassin_12", + "Dominica", + "Dominica_bassin_5", + "Dominica_bassin_6", + "Dominica_bassin_7", + "Dominica_bassin_8", + "Dominica_bassin_9", + "Ecuador_bassin_10", + "Ecuador_bassin_11", + "Ecuador_bassin_12", + "Ecuador", + "Ecuador_bassin_5", + "Ecuador_bassin_6", + "Ecuador_bassin_7", + "Ecuador_bassin_8", + "Ecuador_bassin_9", + "Egypt_bassin_10", + "Egypt_bassin_11", + "Egypt_bassin_12", + "Egypt", + "Egypt_bassin_5", + "Egypt_bassin_6", + "Egypt_bassin_7", + "Egypt_bassin_8", + "Egypt_bassin_9", + "El_Salvador_bassin_10", + "El_Salvador_bassin_11", + "El_Salvador_bassin_12", + "El_Salvador", + "El_Salvador_bassin_5", + "El_Salvador_bassin_6", + "El_Salvador_bassin_7", + "El_Salvador_bassin_8", + "El_Salvador_bassin_9", + "Equatorial_Guinea_bassin_10", + "Equatorial_Guinea_bassin_11", + "Equatorial_Guinea_bassin_12", + "Equatorial_Guinea", + "Equatorial_Guinea_bassin_5", + "Equatorial_Guinea_bassin_6", + "Equatorial_Guinea_bassin_7", + "Equatorial_Guinea_bassin_8", + "Equatorial_Guinea_bassin_9", + "Eritrea_bassin_10", + "Eritrea_bassin_11", + "Eritrea_bassin_12", + "Eritrea", + "Eritrea_bassin_5", + "Eritrea_bassin_6", + "Eritrea_bassin_7", + "Eritrea_bassin_8", + "Eritrea_bassin_9", + "Estonia_bassin_10", + "Estonia_bassin_11", + "Estonia_bassin_12", + "Estonia", + "Estonia_bassin_5", + "Estonia_bassin_6", + "Estonia_bassin_7", + "Estonia_bassin_8", + "Estonia_bassin_9", + "Ethiopia_bassin_10", + "Ethiopia_bassin_11", + "Ethiopia_bassin_12", + "Ethiopia", + "Ethiopia_bassin_5", + "Ethiopia_bassin_6", + "Ethiopia_bassin_7", + "Ethiopia_bassin_8", + "Ethiopia_bassin_9", + "Europa_Island_bassin_10", + "Europa_Island_bassin_11", + "Europa_Island_bassin_12", + "Europa_Island", + "Europa_Island_bassin_5", + "Europa_Island_bassin_6", + "Europa_Island_bassin_7", + "Europa_Island_bassin_8", + "Europa_Island_bassin_9", + "Faroe_Islands_bassin_10", + "Faroe_Islands_bassin_11", + "Faroe_Islands_bassin_12", + "Faroe_Islands", + "Faroe_Islands_bassin_5", + "Faroe_Islands_bassin_6", + "Faroe_Islands_bassin_7", + "Faroe_Islands_bassin_8", + "Faroe_Islands_bassin_9", + "Fiji_bassin_10", + "Fiji_bassin_11", + "Fiji_bassin_12", + "Fiji", + "Fiji_bassin_5", + "Fiji_bassin_6", + "Fiji_bassin_7", + "Fiji_bassin_8", + "Fiji_bassin_9", + "Finland_bassin_10", + "Finland_bassin_11", + "Finland_bassin_12", + "Finland", + "Finland_bassin_5", + "Finland_bassin_6", + "Finland_bassin_7", + "Finland_bassin_8", + "Finland_bassin_9", + "France_bassin_10", + "France_bassin_11", + "France_bassin_12", + "France", + "France_bassin_5", + "France_bassin_6", + "France_bassin_7", + "France_bassin_8", + "France_bassin_9", + "French_Guiana_bassin_10", + "French_Guiana_bassin_11", + "French_Guiana_bassin_12", + "French_Guiana", + "French_Guiana_bassin_5", + "French_Guiana_bassin_6", + "French_Guiana_bassin_7", + "French_Guiana_bassin_8", + "French_Guiana_bassin_9", + "French_Polynesia_bassin_10", + "French_Polynesia_bassin_11", + "French_Polynesia_bassin_12", + "French_Polynesia", + "French_Polynesia_bassin_5", + "French_Polynesia_bassin_6", + "French_Polynesia_bassin_7", + "French_Polynesia_bassin_8", + "French_Polynesia_bassin_9", + "French_Southern and Antarctic Territories_bassin_10", + "French_Southern and Antarctic Territories_bassin_11", + "French_Southern and Antarctic Territories_bassin_12", + "French_Southern and Antarctic Territories", + "French_Southern and Antarctic Territories_bassin_5", + "French_Southern and Antarctic Territories_bassin_6", + "French_Southern and Antarctic Territories_bassin_7", + "French_Southern and Antarctic Territories_bassin_8", + "French_Southern and Antarctic Territories_bassin_9", + "Gabon_bassin_10", + "Gabon_bassin_11", + "Gabon_bassin_12", + "Gabon", + "Gabon_bassin_5", + "Gabon_bassin_6", + "Gabon_bassin_7", + "Gabon_bassin_8", + "Gabon_bassin_9", + "Gambia_bassin_10", + "Gambia_bassin_11", + "Gambia_bassin_12", + "Gambia", + "Gambia_bassin_5", + "Gambia_bassin_6", + "Gambia_bassin_7", + "Gambia_bassin_8", + "Gambia_bassin_9", + "Gaza_Strip_bassin_10", + "Gaza_Strip_bassin_11", + "Gaza_Strip_bassin_12", + "Gaza_Strip", + "Gaza_Strip_bassin_5", + "Gaza_Strip_bassin_6", + "Gaza_Strip_bassin_7", + "Gaza_Strip_bassin_8", + "Gaza_Strip_bassin_9", + "Georgia_bassin_10", + "Georgia_bassin_11", + "Georgia_bassin_12", + "Georgia", + "Georgia_bassin_5", + "Georgia_bassin_6", + "Georgia_bassin_7", + "Georgia_bassin_8", + "Georgia_bassin_9", + "Germany_bassin_10", + "Germany_bassin_11", + "Germany_bassin_12", + "Germany", + "Germany_bassin_5", + "Germany_bassin_6", + "Germany_bassin_7", + "Germany_bassin_8", + "Germany_bassin_9", + "Ghana_bassin_10", + "Ghana_bassin_11", + "Ghana_bassin_12", + "Ghana", + "Ghana_bassin_5", + "Ghana_bassin_6", + "Ghana_bassin_8", + "Ghana_bassin_9", + "Gibraltar_bassin_10", + "Gibraltar_bassin_11", + "Gibraltar_bassin_12", + "Gibraltar", + "Gibraltar_bassin_5", + "Gibraltar_bassin_6", + "Gibraltar_bassin_7", + "Gibraltar_bassin_8", + "Gibraltar_bassin_9", + "Glorioso_Island_bassin_10", + "Glorioso_Island_bassin_11", + "Glorioso_Island_bassin_12", + "Glorioso_Island", + "Glorioso_Island_bassin_5", + "Glorioso_Island_bassin_6", + "Glorioso_Island_bassin_7", + "Glorioso_Island_bassin_8", + "Glorioso_Island_bassin_9", + "Greece_bassin_10", + "Greece_bassin_11", + "Greece_bassin_12", + "Greece", + "Greece_bassin_5", + "Greece_bassin_6", + "Greece_bassin_7", + "Greece_bassin_8", + "Greece_bassin_9", + "Greenland_bassin_10", + "Greenland_bassin_11", + "Greenland_bassin_12", + "Greenland", + "Greenland_bassin_5", + "Greenland_bassin_6", + "Greenland_bassin_7", + "Greenland_bassin_8", + "Greenland_bassin_9", + "Grenada_bassin_10", + "Grenada_bassin_11", + "Grenada_bassin_12", + "Grenada", + "Grenada_bassin_5", + "Grenada_bassin_6", + "Grenada_bassin_7", + "Grenada_bassin_8", + "Grenada_bassin_9", + "Guadeloupe_bassin_10", + "Guadeloupe_bassin_11", + "Guadeloupe_bassin_12", + "Guadeloupe", + "Guadeloupe_bassin_5", + "Guadeloupe_bassin_6", + "Guadeloupe_bassin_7", + "Guadeloupe_bassin_8", + "Guadeloupe_bassin_9", + "Guam_bassin_10", + "Guam_bassin_11", + "Guam_bassin_12", + "Guam", + "Guam_bassin_5", + "Guam_bassin_6", + "Guam_bassin_7", + "Guam_bassin_8", + "Guam_bassin_9", + "Halaib_triangle_bassin_10", + "Halaib_triangle_bassin_11", + "Halaib_triangle_bassin_12", + "Halaib_triangle", + "Halaib_triangle_bassin_5", + "Halaib_triangle_bassin_6", + "Halaib_triangle_bassin_7", + "Halaib_triangle_bassin_8", + "Halaib_triangle_bassin_9", + "Heard_Island and McDonald Islands_bassin_12", + "Holy_See_bassin_10", + "Holy_See_bassin_11", + "Holy_See_bassin_12", + "Holy_See", + "Holy_See_bassin_5", + "Holy_See_bassin_6", + "Holy_See_bassin_7", + "Holy_See_bassin_8", + "Holy_See_bassin_9", + "Honduras_bassin_10", + "Honduras_bassin_11", + "Honduras_bassin_12", + "Honduras", + "Honduras_bassin_5", + "Honduras_bassin_6", + "Honduras_bassin_7", + "Honduras_bassin_8", + "Honduras_bassin_9", + "Hong_Kong_bassin_10", + "Hong_Kong_bassin_11", + "Hong_Kong_bassin_12", + "Hong_Kong", + "Hong_Kong_bassin_5", + "Hong_Kong_bassin_6", + "Hong_Kong_bassin_7", + "Hong_Kong_bassin_8", + "Hong_Kong_bassin_9", + "Howland_Island_bassin_10", + "Howland_Island_bassin_11", + "Howland_Island_bassin_12", + "Howland_Island", + "Howland_Island_bassin_5", + "Howland_Island_bassin_6", + "Howland_Island_bassin_7", + "Howland_Island_bassin_8", + "Howland_Island_bassin_9", + "Hungary_bassin_10", + "Hungary_bassin_11", + "Hungary_bassin_12", + "Hungary", + "Hungary_bassin_5", + "Hungary_bassin_6", + "Hungary_bassin_7", + "Hungary_bassin_8", + "Hungary_bassin_9", + "Iceland_bassin_10", + "Iceland_bassin_11", + "Iceland_bassin_12", + "Iceland", + "Iceland_bassin_5", + "Iceland_bassin_6", + "Iceland_bassin_7", + "Iceland_bassin_8", + "Iceland_bassin_9", + "Ilemi_triangle_bassin_10", + "Ilemi_triangle_bassin_11", + "Ilemi_triangle_bassin_12", + "Ilemi_triangle", + "Ilemi_triangle_bassin_5", + "Ilemi_triangle_bassin_6", + "Ilemi_triangle_bassin_7", + "Ilemi_triangle_bassin_8", + "Ilemi_triangle_bassin_9", + "India_bassin_10", + "India_bassin_11", + "India_bassin_12", + "India", + "India_bassin_5", + "India_bassin_6", + "India_bassin_7", + "India_bassin_8", + "India_bassin_9", + "Indonesia_bassin_10", + "Indonesia_bassin_11", + "Indonesia_bassin_12", + "Indonesia", + "Indonesia_bassin_5", + "Indonesia_bassin_6", + "Indonesia_bassin_7", + "Indonesia_bassin_8", + "Indonesia_bassin_9", + "Iraq_bassin_10", + "Iraq_bassin_11", + "Iraq_bassin_12", + "Iraq", + "Iraq_bassin_5", + "Iraq_bassin_6", + "Iraq_bassin_7", + "Iraq_bassin_8", + "Iraq_bassin_9", + "Ireland_bassin_10", + "Ireland_bassin_11", + "Ireland_bassin_12", + "Ireland", + "Ireland_bassin_5", + "Ireland_bassin_6", + "Ireland_bassin_7", + "Ireland_bassin_8", + "Ireland_bassin_9", + "Isle_of Man_bassin_10", + "Isle_of Man_bassin_11", + "Isle_of Man_bassin_12", + "Isle_of Man", + "Isle_of Man_bassin_5", + "Isle_of Man_bassin_6", + "Isle_of Man_bassin_7", + "Isle_of Man_bassin_8", + "Isle_of Man_bassin_9", + "Israel_bassin_10", + "Israel_bassin_11", + "Israel_bassin_12", + "Israel", + "Israel_bassin_5", + "Israel_bassin_6", + "Israel_bassin_7", + "Israel_bassin_8", + "Israel_bassin_9", + "Italy_bassin_10", + "Italy_bassin_11", + "Italy_bassin_12", + "Italy", + "Italy_bassin_5", + "Italy_bassin_6", + "Italy_bassin_7", + "Italy_bassin_8", + "Italy_bassin_9", + "Jamaica_bassin_10", + "Jamaica_bassin_11", + "Jamaica_bassin_12", + "Jamaica", + "Jamaica_bassin_5", + "Jamaica_bassin_6", + "Jamaica_bassin_7", + "Jamaica_bassin_8", + "Jamaica_bassin_9", + "Jammu_and Kashmir_bassin_10", + "Jammu_and Kashmir_bassin_11", + "Jammu_and Kashmir_bassin_12", + "Jammu_and Kashmir", + "Jammu_and Kashmir_bassin_5", + "Jammu_and Kashmir_bassin_6", + "Jammu_and Kashmir_bassin_7", + "Jammu_and Kashmir_bassin_8", + "Jammu_and Kashmir_bassin_9", + "Japan_bassin_10", + "Japan_bassin_11", + "Japan_bassin_12", + "Japan", + "Japan_bassin_5", + "Japan_bassin_6", + "Japan_bassin_7", + "Japan_bassin_8", + "Japan_bassin_9", + "Jarvis_Island_bassin_10", + "Jarvis_Island_bassin_11", + "Jarvis_Island_bassin_12", + "Jarvis_Island", + "Jarvis_Island_bassin_5", + "Jarvis_Island_bassin_6", + "Jarvis_Island_bassin_7", + "Jarvis_Island_bassin_8", + "Jarvis_Island_bassin_9", + "Jersey_bassin_10", + "Jersey_bassin_11", + "Jersey_bassin_12", + "Jersey", + "Jersey_bassin_5", + "Jersey_bassin_6", + "Jersey_bassin_7", + "Jersey_bassin_8", + "Jersey_bassin_9", + "Johnston_Atoll_bassin_10", + "Johnston_Atoll_bassin_11", + "Johnston_Atoll_bassin_12", + "Johnston_Atoll", + "Johnston_Atoll_bassin_5", + "Johnston_Atoll_bassin_6", + "Johnston_Atoll_bassin_7", + "Johnston_Atoll_bassin_8", + "Johnston_Atoll_bassin_9", + "Jordan_bassin_10", + "Jordan_bassin_11", + "Jordan_bassin_12", + "Jordan", + "Jordan_bassin_5", + "Jordan_bassin_6", + "Jordan_bassin_7", + "Jordan_bassin_8", + "Jordan_bassin_9", + "Juan_de Nova Island_bassin_10", + "Juan_de Nova Island_bassin_11", + "Juan_de Nova Island_bassin_12", + "Juan_de Nova Island", + "Juan_de Nova Island_bassin_5", + "Juan_de Nova Island_bassin_6", + "Juan_de Nova Island_bassin_7", + "Juan_de Nova Island_bassin_8", + "Juan_de Nova Island_bassin_9", + "Kazakhstan_bassin_10", + "Kazakhstan_bassin_11", + "Kazakhstan_bassin_12", + "Kazakhstan", + "Kazakhstan_bassin_5", + "Kazakhstan_bassin_6", + "Kazakhstan_bassin_7", + "Kazakhstan_bassin_8", + "Kazakhstan_bassin_9", + "Kenya_bassin_10", + "Kenya_bassin_11", + "Kenya_bassin_12", + "Kenya", + "Kenya_bassin_5", + "Kenya_bassin_6", + "Kenya_bassin_7", + "Kenya_bassin_8", + "Kenya_bassin_9", + "Kingman_Reef_bassin_10", + "Kingman_Reef_bassin_11", + "Kingman_Reef_bassin_12", + "Kingman_Reef", + "Kingman_Reef_bassin_5", + "Kingman_Reef_bassin_6", + "Kingman_Reef_bassin_7", + "Kingman_Reef_bassin_8", + "Kingman_Reef_bassin_9", + "Kiribati_bassin_10", + "Kiribati_bassin_11", + "Kiribati_bassin_12", + "Kiribati", + "Kiribati_bassin_5", + "Kiribati_bassin_6", + "Kiribati_bassin_7", + "Kiribati_bassin_8", + "Kiribati_bassin_9", + "Kuril_islands_bassin_10", + "Kuril_islands_bassin_11", + "Kuril_islands_bassin_12", + "Kuril_islands", + "Kuril_islands_bassin_5", + "Kuril_islands_bassin_6", + "Kuril_islands_bassin_7", + "Kuril_islands_bassin_8", + "Kuril_islands_bassin_9", + "Kuwait_bassin_10", + "Kuwait_bassin_11", + "Kuwait_bassin_12", + "Kuwait", + "Kuwait_bassin_5", + "Kuwait_bassin_6", + "Kuwait_bassin_7", + "Kuwait_bassin_8", + "Kuwait_bassin_9", + "Kyrgyzstan_bassin_10", + "Kyrgyzstan_bassin_11", + "Kyrgyzstan_bassin_12", + "Kyrgyzstan", + "Kyrgyzstan_bassin_5", + "Kyrgyzstan_bassin_6", + "Kyrgyzstan_bassin_7", + "Kyrgyzstan_bassin_8", + "Kyrgyzstan_bassin_9", + "Lao_Peoples Democratic Republic_bassin_10", + "Lao_Peoples Democratic Republic_bassin_11", + "Lao_Peoples Democratic Republic_bassin_12", + "Lao_Peoples Democratic Republic", + "Lao_Peoples Democratic Republic_bassin_5", + "Lao_Peoples Democratic Republic_bassin_6", + "Lao_Peoples Democratic Republic_bassin_7", + "Lao_Peoples Democratic Republic_bassin_8", + "Lao_Peoples Democratic Republic_bassin_9", + "Latvia_bassin_10", + "Latvia_bassin_11", + "Latvia_bassin_12", + "Latvia", + "Latvia_bassin_5", + "Latvia_bassin_6", + "Latvia_bassin_7", + "Latvia_bassin_8", + "Latvia_bassin_9", + "Lebanon_bassin_10", + "Lebanon_bassin_11", + "Lebanon_bassin_12", + "Lebanon", + "Lebanon_bassin_5", + "Lebanon_bassin_6", + "Lebanon_bassin_7", + "Lebanon_bassin_8", + "Lebanon_bassin_9", + "Lesotho_bassin_10", + "Lesotho_bassin_11", + "Lesotho_bassin_12", + "Lesotho", + "Lesotho_bassin_5", + "Lesotho_bassin_6", + "Lesotho_bassin_7", + "Lesotho_bassin_8", + "Lesotho_bassin_9", + "Liberia_bassin_10", + "Liberia_bassin_11", + "Liberia_bassin_12", + "Liberia", + "Liberia_bassin_5", + "Liberia_bassin_6", + "Liberia_bassin_7", + "Liberia_bassin_8", + "Liberia_bassin_9", + "Libya_bassin_10", + "Libya_bassin_11", + "Libya_bassin_12", + "Libya", + "Libya_bassin_5", + "Libya_bassin_6", + "Libya_bassin_7", + "Libya_bassin_8", + "Libya_bassin_9", + "Liechtenstein_bassin_10", + "Liechtenstein_bassin_11", + "Liechtenstein_bassin_12", + "Liechtenstein", + "Liechtenstein_bassin_5", + "Liechtenstein_bassin_6", + "Liechtenstein_bassin_7", + "Liechtenstein_bassin_8", + "Liechtenstein_bassin_9", + "Lithuania_bassin_10", + "Lithuania_bassin_11", + "Lithuania_bassin_12", + "Lithuania", + "Lithuania_bassin_5", + "Lithuania_bassin_6", + "Lithuania_bassin_7", + "Lithuania_bassin_8", + "Lithuania_bassin_9", + "Luxembourg_bassin_10", + "Luxembourg_bassin_11", + "Luxembourg_bassin_12", + "Luxembourg", + "Luxembourg_bassin_5", + "Luxembourg_bassin_6", + "Luxembourg_bassin_7", + "Luxembourg_bassin_8", + "Luxembourg_bassin_9", + "Macau_bassin_10", + "Macau_bassin_11", + "Macau_bassin_12", + "Macau", + "Macau_bassin_5", + "Macau_bassin_6", + "Macau_bassin_7", + "Macau_bassin_8", + "Macau_bassin_9", + "Madagascar_bassin_10", + "Madagascar_bassin_11", + "Madagascar_bassin_12", + "Madagascar", + "Madagascar_bassin_5", + "Madagascar_bassin_6", + "Madagascar_bassin_7", + "Madagascar_bassin_8", + "Madagascar_bassin_9", + "Madeira_Islands_bassin_10", + "Madeira_Islands_bassin_11", + "Madeira_Islands_bassin_12", + "Madeira_Islands", + "Madeira_Islands_bassin_5", + "Madeira_Islands_bassin_6", + "Madeira_Islands_bassin_7", + "Madeira_Islands_bassin_8", + "Madeira_Islands_bassin_9", + "Malawi_bassin_10", + "Malawi_bassin_11", + "Malawi_bassin_12", + "Malawi", + "Malawi_bassin_5", + "Malawi_bassin_6", + "Malawi_bassin_7", + "Malawi_bassin_8", + "Malawi_bassin_9", + "Malaysia_bassin_10", + "Malaysia_bassin_11", + "Malaysia_bassin_12", + "Malaysia", + "Malaysia_bassin_5", + "Malaysia_bassin_6", + "Malaysia_bassin_7", + "Malaysia_bassin_8", + "Malaysia_bassin_9", + "Maldives_bassin_10", + "Maldives_bassin_11", + "Maldives_bassin_12", + "Maldives", + "Maldives_bassin_5", + "Maldives_bassin_6", + "Maldives_bassin_7", + "Maldives_bassin_8", + "Maldives_bassin_9", + "Matan_al-Sarra_bassin_10", + "Matan_al-Sarra_bassin_11", + "Matan_al-Sarra_bassin_12", + "Matan_al-Sarra", + "Matan_al-Sarra_bassin_5", + "Matan_al-Sarra_bassin_6", + "Matan_al-Sarra_bassin_7", + "Matan_al-Sarra_bassin_8", + "Matan_al-Sarra_bassin_9", + "Montenegro_bassin_10", + "Montenegro_bassin_11", + "Montenegro_bassin_12", + "Montenegro", + "Montenegro_bassin_5", + "Montenegro_bassin_6", + "Montenegro_bassin_7", + "Montenegro_bassin_8", + "Montenegro_bassin_9", + "Qatar_bassin_10", + "Qatar_bassin_11", + "Qatar_bassin_12", + "Republic_of Korea_bassin_10", + "Republic_of Korea_bassin_11", + "Republic_of Korea_bassin_12", + "Republic_of Korea", + "Republic_of Korea_bassin_5", + "Republic_of Korea_bassin_6", + "Republic_of Korea_bassin_7", + "Republic_of Korea_bassin_8", + "Republic_of Korea_bassin_9", + "Romania_bassin_10", + "Romania_bassin_11", + "Romania_bassin_12", + "Romania", + "Romania_bassin_5", + "Romania_bassin_6", + "Romania_bassin_7", + "Romania_bassin_8", + "Romania_bassin_9", + "Russian_Federation_bassin_10", + "Russian_Federation_bassin_11", + "Russian_Federation_bassin_12", + "Russian_Federation", + "Russian_Federation_bassin_5", + "Russian_Federation_bassin_6", + "Russian_Federation_bassin_7", + "Russian_Federation_bassin_8", + "Russian_Federation_bassin_9", + "Rwanda_bassin_10", + "Rwanda_bassin_11", + "Rwanda_bassin_12", + "Rwanda", + "Rwanda_bassin_5", + "Rwanda_bassin_6", + "Rwanda_bassin_7", + "Rwanda_bassin_8", + "Rwanda_bassin_9", + "Saint_Helena_bassin_10", + "Saint_Helena_bassin_11", + "Saint_Helena_bassin_12", + "Saint_Helena", + "Saint_Helena_bassin_5", + "Saint_Helena_bassin_6", + "Saint_Helena_bassin_7", + "Saint_Helena_bassin_8", + "Saint_Helena_bassin_9", + "Saint_Kitts and Nevis_bassin_10", + "Saint_Kitts and Nevis_bassin_11", + "Saint_Kitts and Nevis_bassin_12", + "Saint_Kitts and Nevis", + "Saint_Kitts and Nevis_bassin_5", + "Saint_Kitts and Nevis_bassin_6", + "Saint_Kitts and Nevis_bassin_7", + "Saint_Kitts and Nevis_bassin_8", + "Saint_Kitts and Nevis_bassin_9", + "Saint_Lucia_bassin_10", + "Saint_Lucia_bassin_11", + "Saint_Lucia_bassin_12", + "Saint_Lucia", + "Saint_Lucia_bassin_5", + "Saint_Lucia_bassin_6", + "Saint_Lucia_bassin_7", + "Saint_Lucia_bassin_8", + "Saint_Lucia_bassin_9", + "Saint_Pierre et Miquelon_bassin_10", + "Saint_Pierre et Miquelon_bassin_11", + "Saint_Pierre et Miquelon_bassin_12", + "Saint_Pierre et Miquelon", + "Saint_Pierre et Miquelon_bassin_5", + "Saint_Pierre et Miquelon_bassin_6", + "Saint_Pierre et Miquelon_bassin_7", + "Saint_Pierre et Miquelon_bassin_8", + "Saint_Pierre et Miquelon_bassin_9", + "Saint_Vincent and the Grenadines_bassin_10", + "Saint_Vincent and the Grenadines_bassin_11", + "Saint_Vincent and the Grenadines_bassin_12", + "Saint_Vincent and the Grenadines", + "Saint_Vincent and the Grenadines_bassin_5", + "Saint_Vincent and the Grenadines_bassin_6", + "Saint_Vincent and the Grenadines_bassin_7", + "Saint_Vincent and the Grenadines_bassin_8", + "Saint_Vincent and the Grenadines_bassin_9", + "Samoa_bassin_10", + "Samoa_bassin_11", + "Samoa_bassin_12", + "Samoa", + "Samoa_bassin_5", + "Samoa_bassin_6", + "Samoa_bassin_7", + "Samoa_bassin_8", + "Samoa_bassin_9", + "San_Marino_bassin_10", + "San_Marino_bassin_11", + "San_Marino_bassin_12", + "San_Marino", + "San_Marino_bassin_5", + "San_Marino_bassin_6", + "San_Marino_bassin_7", + "San_Marino_bassin_8", + "San_Marino_bassin_9", + "Sao_Tome and Principe_bassin_10", + "Sao_Tome and Principe_bassin_11", + "Sao_Tome and Principe_bassin_12", + "Sao_Tome and Principe", + "Sao_Tome and Principe_bassin_5", + "Sao_Tome and Principe_bassin_6", + "Sao_Tome and Principe_bassin_7", + "Sao_Tome and Principe_bassin_8", + "Sao_Tome and Principe_bassin_9", + "Saudi_Arabia_bassin_10", + "Saudi_Arabia_bassin_11", + "Saudi_Arabia_bassin_12", + "Saudi_Arabia", + "Saudi_Arabia_bassin_5", + "Saudi_Arabia_bassin_6", + "Saudi_Arabia_bassin_7", + "Saudi_Arabia_bassin_8", + "Saudi_Arabia_bassin_9", + "Scarborough_Reef_bassin_10", + "Scarborough_Reef_bassin_11", + "Scarborough_Reef_bassin_12", + "Scarborough_Reef", + "Scarborough_Reef_bassin_5", + "Scarborough_Reef_bassin_6", + "Scarborough_Reef_bassin_7", + "Scarborough_Reef_bassin_8", + "Scarborough_Reef_bassin_9", + "Senegal_bassin_10", + "Senegal_bassin_11", + "Senegal_bassin_12", + "Senegal", + "Senegal_bassin_5", + "Senegal_bassin_6", + "Senegal_bassin_7", + "Senegal_bassin_8", + "Senegal_bassin_9", + "Senkaku_Islands_bassin_10", + "Senkaku_Islands_bassin_11", + "Senkaku_Islands_bassin_12", + "Senkaku_Islands", + "Senkaku_Islands_bassin_5", + "Senkaku_Islands_bassin_6", + "Senkaku_Islands_bassin_7", + "Senkaku_Islands_bassin_8", + "Senkaku_Islands_bassin_9", + "Serbia_bassin_10", + "Serbia_bassin_11", + "Serbia_bassin_12", + "Serbia", + "Serbia_bassin_5", + "Serbia_bassin_6", + "Serbia_bassin_7", + "Serbia_bassin_8", + "Serbia_bassin_9", + "Seychelles_bassin_10", + "Seychelles_bassin_11", + "Seychelles_bassin_12", + "Seychelles", + "Seychelles_bassin_5", + "Seychelles_bassin_6", + "Seychelles_bassin_7", + "Seychelles_bassin_8", + "Seychelles_bassin_9", + "Sierra_Leone_bassin_10", + "Sierra_Leone_bassin_11", + "Sierra_Leone_bassin_12", + "Sierra_Leone", + "Sierra_Leone_bassin_5", + "Sierra_Leone_bassin_6", + "Sierra_Leone_bassin_7", + "Sierra_Leone_bassin_8", + "Sierra_Leone_bassin_9", + "Singapore_bassin_10", + "Singapore_bassin_11", + "Singapore_bassin_12", + "Singapore", + "Singapore_bassin_5", + "Singapore_bassin_6", + "Singapore_bassin_7", + "Singapore_bassin_8", + "Singapore_bassin_9", + "Slovakia_bassin_10", + "Slovakia_bassin_11", + "Slovakia_bassin_12", + "Slovakia", + "Slovakia_bassin_5", + "Slovakia_bassin_6", + "Slovakia_bassin_7", + "Slovakia_bassin_8", + "Slovakia_bassin_9", + "Slovenia_bassin_10", + "Slovenia_bassin_11", + "Slovenia_bassin_12", + "Slovenia", + "Slovenia_bassin_5", + "Slovenia_bassin_6", + "Slovenia_bassin_7", + "Slovenia_bassin_8", + "Slovenia_bassin_9", + "Solomon_Islands_bassin_10", + "Solomon_Islands_bassin_11", + "Solomon_Islands_bassin_12", + "Solomon_Islands", + "Solomon_Islands_bassin_5", + "Solomon_Islands_bassin_6", + "Solomon_Islands_bassin_7", + "Solomon_Islands_bassin_8", + "Solomon_Islands_bassin_9", + "Somalia_bassin_10", + "Somalia_bassin_11", + "Somalia_bassin_12", + "Somalia", + "Somalia_bassin_5", + "Somalia_bassin_6", + "Somalia_bassin_7", + "Somalia_bassin_8", + "Somalia_bassin_9", + "South_Africa_bassin_10", + "South_Africa_bassin_11", + "South_Africa_bassin_12", + "South_Africa", + "South_Africa_bassin_5", + "South_Africa_bassin_6", + "South_Africa_bassin_7", + "South_Africa_bassin_8", + "South_Africa_bassin_9", + "South_Georgia and the South Sandwich Islands_bassin_10", + "South_Georgia and the South Sandwich Islands_bassin_11", + "South_Georgia and the South Sandwich Islands_bassin_12", + "South_Georgia and the South Sandwich Islands", + "South_Georgia and the South Sandwich Islands_bassin_5", + "South_Georgia and the South Sandwich Islands_bassin_6", + "South_Georgia and the South Sandwich Islands_bassin_7", + "South_Georgia and the South Sandwich Islands_bassin_8", + "South_Georgia and the South Sandwich Islands_bassin_9", + "South_Sudan_bassin_10", + "South_Sudan_bassin_11", + "South_Sudan_bassin_12", + "South_Sudan", + "South_Sudan_bassin_5", + "South_Sudan_bassin_6", + "South_Sudan_bassin_7", + "South_Sudan_bassin_8", + "South_Sudan_bassin_9", + "Spain_bassin_10", + "Spain_bassin_11", + "Spain_bassin_12", + "Spain", + "Spain_bassin_5", + "Spain_bassin_6", + "Spain_bassin_7", + "Spain_bassin_8", + "Spain_bassin_9", + "Spratly_Islands_bassin_10", + "Spratly_Islands_bassin_11", + "Spratly_Islands_bassin_12", + "Spratly_Islands", + "Spratly_Islands_bassin_5", + "Spratly_Islands_bassin_6", + "Spratly_Islands_bassin_7", + "Spratly_Islands_bassin_8", + "Spratly_Islands_bassin_9", + "Sri_Lanka_bassin_10", + "Sri_Lanka_bassin_11", + "Sri_Lanka_bassin_12", + "Sri_Lanka", + "Sri_Lanka_bassin_5", + "Sri_Lanka_bassin_6", + "Sri_Lanka_bassin_7", + "Sri_Lanka_bassin_8", + "Sri_Lanka_bassin_9", + "Suriname_bassin_10", + "Suriname_bassin_11", + "Suriname_bassin_12", + "Suriname", + "Suriname_bassin_5", + "Suriname_bassin_6", + "Suriname_bassin_7", + "Suriname_bassin_8", + "Suriname_bassin_9", + "Svalbard_and Jan Mayen Islands_bassin_10", + "Svalbard_and Jan Mayen Islands_bassin_11", + "Svalbard_and Jan Mayen Islands_bassin_12", + "Svalbard_and Jan Mayen Islands", + "Svalbard_and Jan Mayen Islands_bassin_5", + "Svalbard_and Jan Mayen Islands_bassin_6", + "Svalbard_and Jan Mayen Islands_bassin_7", + "Svalbard_and Jan Mayen Islands_bassin_8", + "Svalbard_and Jan Mayen Islands_bassin_9", + "Swaziland_bassin_10", + "Swaziland_bassin_11", + "Swaziland_bassin_12", + "Swaziland", + "Swaziland_bassin_5", + "Swaziland_bassin_6", + "Swaziland_bassin_7", + "Swaziland_bassin_8", + "Swaziland_bassin_9", + "Sweden_bassin_10", + "Sweden_bassin_11", + "Sweden_bassin_12", + "Sweden", + "Sweden_bassin_5", + "Sweden_bassin_6", + "Sweden_bassin_7", + "Sweden_bassin_8", + "Sweden_bassin_9", + "Switzerland_bassin_10", + "Switzerland_bassin_11", + "Switzerland_bassin_12", + "Switzerland", + "Switzerland_bassin_5", + "Switzerland_bassin_6", + "Switzerland_bassin_7", + "Switzerland_bassin_8", + "Switzerland_bassin_9", + "Syrian_Arab Republic_bassin_10", + "Syrian_Arab Republic_bassin_11", + "Syrian_Arab Republic_bassin_12", + "Syrian_Arab Republic", + "Syrian_Arab Republic_bassin_5", + "Syrian_Arab Republic_bassin_6", + "Syrian_Arab Republic_bassin_7", + "Syrian_Arab Republic_bassin_8", + "Syrian_Arab Republic_bassin_9", + "Taiwan_bassin_10", + "Taiwan_bassin_11", + "Taiwan_bassin_12", + "Taiwan", + "Taiwan_bassin_5", + "Taiwan_bassin_6", + "Taiwan_bassin_7", + "Taiwan_bassin_8", + "Taiwan_bassin_9", + "Tajikistan_bassin_10", + "Tajikistan_bassin_11", + "Tajikistan_bassin_12", + "Tajikistan", + "Tajikistan_bassin_5", + "Tajikistan_bassin_6", + "Tajikistan_bassin_7", + "Tajikistan_bassin_8", + "Tajikistan_bassin_9", + "Thailand_bassin_10", + "Thailand_bassin_11", + "Thailand_bassin_12", + "Thailand", + "Thailand_bassin_5", + "Thailand_bassin_6", + "Thailand_bassin_7", + "Thailand_bassin_8", + "Thailand_bassin_9", + "The_former Yugoslav Republic of Macedonia_bassin_10", + "The_former Yugoslav Republic of Macedonia_bassin_11", + "The_former Yugoslav Republic of Macedonia_bassin_12", + "The_former Yugoslav Republic of Macedonia", + "The_former Yugoslav Republic of Macedonia_bassin_5", + "The_former Yugoslav Republic of Macedonia_bassin_6", + "The_former Yugoslav Republic of Macedonia_bassin_7", + "The_former Yugoslav Republic of Macedonia_bassin_8", + "The_former Yugoslav Republic of Macedonia_bassin_9", + "Timor-Leste_bassin_10", + "Timor-Leste_bassin_11", + "Timor-Leste_bassin_12", + "Timor-Leste", + "Timor-Leste_bassin_5", + "Timor-Leste_bassin_6", + "Timor-Leste_bassin_7", + "Timor-Leste_bassin_8", + "Timor-Leste_bassin_9", + "Togo_bassin_10", + "Togo_bassin_11", + "Togo_bassin_12", + "Togo", + "Togo_bassin_5", + "Togo_bassin_6", + "Togo_bassin_7", + "Togo_bassin_8", + "Togo_bassin_9", + "Tokelau_bassin_10", + "Tokelau_bassin_11", + "Tokelau_bassin_12", + "Tokelau", + "Tokelau_bassin_5", + "Tokelau_bassin_6", + "Tokelau_bassin_7", + "Tokelau_bassin_8", + "Tokelau_bassin_9", + "Tonga_bassin_10", + "Tonga_bassin_11", + "Tonga_bassin_12", + "Tonga", + "Tonga_bassin_5", + "Tonga_bassin_6", + "Tonga_bassin_7", + "Tonga_bassin_8", + "Tonga_bassin_9", + "Trinidad_and Tobago_bassin_10", + "Trinidad_and Tobago_bassin_11", + "Trinidad_and Tobago_bassin_12", + "Trinidad_and Tobago", + "Trinidad_and Tobago_bassin_5", + "Trinidad_and Tobago_bassin_6", + "Trinidad_and Tobago_bassin_7", + "Trinidad_and Tobago_bassin_8", + "Trinidad_and Tobago_bassin_9", + "Tromelin_Island_bassin_10", + "Tromelin_Island_bassin_11", + "Tromelin_Island_bassin_12", + "Tromelin_Island", + "Tromelin_Island_bassin_5", + "Tromelin_Island_bassin_6", + "Tromelin_Island_bassin_7", + "Tromelin_Island_bassin_8", + "Tromelin_Island_bassin_9", + "Tunisia_bassin_10", + "Tunisia_bassin_11", + "Tunisia_bassin_12", + "Tunisia", + "Tunisia_bassin_5", + "Tunisia_bassin_6", + "Tunisia_bassin_7", + "Tunisia_bassin_8", + "Tunisia_bassin_9", + "Turkey_bassin_10", + "Turkey_bassin_11", + "Turkey_bassin_12", + "Turkey", + "Turkey_bassin_5", + "Turkey_bassin_6", + "Turkey_bassin_7", + "Turkey_bassin_8", + "Turkey_bassin_9", + "Turkmenistan_bassin_10", + "Turkmenistan_bassin_11", + "Turkmenistan_bassin_12", + "Turkmenistan", + "Turkmenistan_bassin_5", + "Turkmenistan_bassin_6", + "Turkmenistan_bassin_7", + "Turkmenistan_bassin_8", + "Turkmenistan_bassin_9", + "Turks_and Caicos islands_bassin_10", + "Turks_and Caicos islands_bassin_11", + "Turks_and Caicos islands_bassin_12", + "Turks_and Caicos islands", + "Turks_and Caicos islands_bassin_5", + "Turks_and Caicos islands_bassin_6", + "Turks_and Caicos islands_bassin_7", + "Turks_and Caicos islands_bassin_8", + "Turks_and Caicos islands_bassin_9", + "Tuvalu_bassin_10", + "Tuvalu_bassin_11", + "Tuvalu_bassin_12", + "Tuvalu", + "Tuvalu_bassin_5", + "Tuvalu_bassin_6", + "Tuvalu_bassin_7", + "Tuvalu_bassin_8", + "Tuvalu_bassin_9", + "Uganda_bassin_10", + "Uganda_bassin_11", + "Uganda_bassin_12", + "Uganda", + "Uganda_bassin_5", + "Uganda_bassin_6", + "Uganda_bassin_7", + "Uganda_bassin_8", + "Uganda_bassin_9", + "Ukraine_bassin_10", + "Ukraine_bassin_11", + "Ukraine_bassin_12", + "Ukraine", + "Ukraine_bassin_5", + "Ukraine_bassin_6", + "Ukraine_bassin_7", + "Ukraine_bassin_8", + "Ukraine_bassin_9", + "UK_of Great Britain and Northern Ireland_bassin_10", + "UK_of Great Britain and Northern Ireland_bassin_11", + "UK_of Great Britain and Northern Ireland_bassin_12", + "UK_of Great Britain and Northern Ireland", + "UK_of Great Britain and Northern Ireland_bassin_5", + "UK_of Great Britain and Northern Ireland_bassin_6", + "UK_of Great Britain and Northern Ireland_bassin_7", + "UK_of Great Britain and Northern Ireland_bassin_8", + "UK_of Great Britain and Northern Ireland_bassin_9", + "United_Arab Emirates_bassin_10", + "United_Arab Emirates_bassin_11", + "United_Arab Emirates_bassin_12", + "United_Arab Emirates", + "United_Arab Emirates_bassin_5", + "United_Arab Emirates_bassin_6", + "United_Arab Emirates_bassin_7", + "United_Arab Emirates_bassin_8", + "United_Arab Emirates_bassin_9", + "United_Republic of Tanzania_bassin_10", + "United_Republic of Tanzania_bassin_11", + "United_Republic of Tanzania_bassin_12", + "United_Republic of Tanzania", + "United_Republic of Tanzania_bassin_5", + "United_Republic of Tanzania_bassin_6", + "United_Republic of Tanzania_bassin_7", + "United_Republic of Tanzania_bassin_8", + "United_Republic of Tanzania_bassin_9", + "United_States of America_bassin_10", + "United_States of America_bassin_11", + "United_States of America_bassin_12", + "United_States of America", + "United_States of America_bassin_5", + "United_States of America_bassin_6", + "United_States of America_bassin_7", + "United_States of America_bassin_8", + "United_States of America_bassin_9", + "United_States Virgin Islands_bassin_10", + "United_States Virgin Islands_bassin_11", + "United_States Virgin Islands_bassin_12", + "United_States Virgin Islands", + "United_States Virgin Islands_bassin_5", + "United_States Virgin Islands_bassin_6", + "United_States Virgin Islands_bassin_7", + "United_States Virgin Islands_bassin_8", + "United_States Virgin Islands_bassin_9", + "Uruguay_bassin_10", + "Uruguay_bassin_11", + "Uruguay_bassin_12", + "Uruguay", + "Uruguay_bassin_5", + "Uruguay_bassin_6", + "Uruguay_bassin_7", + "Uruguay_bassin_8", + "Uruguay_bassin_9", + "Uzbekistan_bassin_10", + "Uzbekistan_bassin_11", + "Uzbekistan_bassin_12", + "Uzbekistan", + "Uzbekistan_bassin_5", + "Uzbekistan_bassin_6", + "Uzbekistan_bassin_7", + "Uzbekistan_bassin_8", + "Uzbekistan_bassin_9", + "Vanuatu_bassin_10", + "Vanuatu_bassin_11", + "Vanuatu_bassin_12", + "Vanuatu", + "Vanuatu_bassin_5", + "Vanuatu_bassin_6", + "Vanuatu_bassin_7", + "Vanuatu_bassin_8", + "Vanuatu_bassin_9", + "Venezuela_bassin_10", + "Venezuela_bassin_11", + "Venezuela_bassin_12", + "Venezuela", + "Venezuela_bassin_5", + "Venezuela_bassin_6", + "Venezuela_bassin_7", + "Venezuela_bassin_8", + "Venezuela_bassin_9", + "Viet_Nam_bassin_10", + "Viet_Nam_bassin_11", + "Viet_Nam_bassin_12", + "Viet_Nam", + "Viet_Nam_bassin_5", + "Viet_Nam_bassin_6", + "Viet_Nam_bassin_7", + "Viet_Nam_bassin_8", + "Viet_Nam_bassin_9", + "Wake_Island_bassin_10", + "Wake_Island_bassin_11", + "Wake_Island_bassin_12", + "Wake_Island", + "Wake_Island_bassin_5", + "Wake_Island_bassin_6", + "Wake_Island_bassin_7", + "Wake_Island_bassin_8", + "Wake_Island_bassin_9", + "Wallis_and Futuna_bassin_10", + "Wallis_and Futuna_bassin_11", + "Wallis_and Futuna_bassin_12", + "Wallis_and Futuna", + "Wallis_and Futuna_bassin_5", + "Wallis_and Futuna_bassin_6", + "Wallis_and Futuna_bassin_7", + "Wallis_and Futuna_bassin_8", + "Wallis_and Futuna_bassin_9", + "Western_Sahara_bassin_10", + "Western_Sahara_bassin_11", + "Western_Sahara_bassin_12", + "Western_Sahara", + "Western_Sahara_bassin_5", + "Western_Sahara_bassin_6", + "Western_Sahara_bassin_7", + "Western_Sahara_bassin_8", + "Western_Sahara_bassin_9", + "West_Bank_bassin_10", + "West_Bank_bassin_11", + "West_Bank_bassin_12", + "West_Bank", + "West_Bank_bassin_5", + "West_Bank_bassin_6", + "West_Bank_bassin_7", + "West_Bank_bassin_8", + "West_Bank_bassin_9", + "Yemen_bassin_10", + "Yemen_bassin_11", + "Yemen_bassin_12", + "Yemen", + "Yemen_bassin_5", + "Yemen_bassin_6", + "Yemen_bassin_7", + "Yemen_bassin_8", + "Yemen_bassin_9", + "Zambia_bassin_10", + "Zambia_bassin_11", + "Zambia_bassin_12", + "Zambia", + "Zambia_bassin_5", + "Zambia_bassin_6", + "Zambia_bassin_7", + "Zambia_bassin_8", + "Zambia_bassin_9", + "Zimbabwe_bassin_10", + "Zimbabwe_bassin_11", + "Zimbabwe_bassin_12", + "Zimbabwe", + "Zimbabwe_bassin_5", + "Zimbabwe_bassin_6", + "Zimbabwe_bassin_7", + "Zimbabwe_bassin_8", + "Zimbabwe_bassin_9" + ) ); + + public static void main(String[] args) { + + ArrayList missingCountries = new ArrayList(); + + for (String country : allCountryNames) { + if( !filesGenerated.contains(country) ) { + missingCountries.add( country); + } + } + System.out.println( missingCountries.size() ); + System.out.println( missingCountries ); + + String finalCountries = ""; + for (String missing : missingCountries) { + finalCountries += '"' + missing.replaceAll( "_", " ") + "\", "; + } + System.out.println( finalCountries ); + + } + + +} From e427f47545f0e298b803a61b27e697ef1431e80d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:13 +0100 Subject: [PATCH 0991/1620] New translations findMissingCountries.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 1960 ++++++++++++++++- 1 file changed, 1895 insertions(+), 65 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 1f014d967a..768f973a7f 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,65 +1,1895 @@ -package org.openforis.collect.earth.app.desktop; - -import java.io.File; -import java.io.IOException; -import java.lang.reflect.Method; -import java.util.List; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Use reflection to be able to add the code specific to Mac OS X without generating compilation errors - * This class generates a Proxy so that an Interface method can be invoked. Sort of implementing an Interface using reflection - * @see How to implement an interface using Reflection - * @author Alfonso Sanchez-Paus Diaz - * - */ -public class MacOpenFilesInvocationHandler implements java.lang.reflect.InvocationHandler { - - private final Logger logger = LoggerFactory.getLogger(MacOpenFilesInvocationHandler.class); - - public MacOpenFilesInvocationHandler() { - super(); - } - - public Object invoke(Object proxy, Method m, Object[] args) throws Throwable - - { - - Object result = null; - - try { - - // if the method name equals some method's name then call your method - if ( m!= null && m.getName().equals("openFiles") && args !=null && args.length>0) { - openFilesImplmentation(args[0]); - } - - } catch (Exception e) { - logger.error(" Error while interpreting invocation " , e ); - } finally { - logger.info("end method {}", m!=null?m.getName():"Unknown method"); - } - - return result; - - } - - private void openFilesImplmentation(Object openFilesEventObject) throws Exception { - Class openFilesEventClass = Class.forName("com.apple.eawt.AppEvent.OpenFilesEvent"); - Method getFilesMethod = openFilesEventClass.getMethod("getFiles"); - - List files = (List) getFilesMethod.invoke( openFilesEventClass.cast( openFilesEventObject ) ); - - for (File file : files ){ - try { - EarthApp.openProjectFileInRunningCollectEarth(file.getAbsolutePath()); - } catch (IOException e1) { - logger.error("Error opening CEP file " + e1); - } - } - - } - } - +package org.openforis.collect.earth.app.ad_hoc; + +import java.util.ArrayList; +import java.util.Arrays; + +public class findMissingCountries { + + private static ArrayList allCountryNames = new ArrayList<>( + Arrays.asList( + "Abyei", + "Afghanistan", + "Aksai_Chin", + "Albania", + "Algeria", + "American_Samoa", + "Andorra", + "Angola", + "Anguilla", + "Antarctica", + "Antigua_and_Barbuda", + "Argentina", + "Armenia", + "Aruba", + "Arunachal_Pradesh", + "Ashmore_and_Cartier_Islands", + "Australia", + "Austria", + "Azerbaijan", + "Azores_Islands", + "Bahamas", + "Bahrain", + "Baker_Island", + "Bangladesh", + "Barbados", + "Bassas_da_India", + "Belarus", + "Belgium", + "Belize", + "Benin", + "Bermuda", + "Bhutan", + "Bird_Island", + "Bolivia", + "Bosnia_and_Herzegovina", + "Botswana", + "Bouvet_Island", + "Brazil", + "British_Indian_Ocean_Territory", + "British_Virgin_Islands", + "Brunei_Darussalam", + "Bulgaria", + "Burkina_Faso", + "Burundi", + "Cambodia", + "Cameroon", + "Canada", + "Cape_Verde", + "Cayman_Islands", + "Central_African_Republic", + "Chad", + "Chile", + "China", + "China/India", + "Christmas_Island", + "Clipperton_Island", + "Cocos__Keeling__Islands", + "Colombia", + "Comoros", + "Congo", + "Cook_Islands", + "Costa_Rica", + "Croatia", + "Cuba", + "Cyprus", + "Czech_Republic", + "C�te_d_Ivoire", + "Dem_People_s_Rep_of_Korea", + "Democratic_Republic_of_the_Congo", + "Denmark", + "Djibouti", + "Dominica", + "Dominican_Republic", + "Ecuador", + "Egypt", + "El_Salvador", + "Equatorial_Guinea", + "Eritrea", + "Estonia", + "Ethiopia", + "Europa_Island", + "Falkland_Islands__Malvinas_", + "Faroe_Islands", + "Fiji", + "Finland", + "France", + "French_Guiana", + "French_Polynesia", + "French_Southern_and_Antarctic_Territories", + "Gabon", + "Gambia", + "Gaza_Strip", + "Georgia", + "Germany", + "Ghana", + "Gibraltar", + "Glorioso_Island", + "Greece", + "Greenland", + "Grenada", + "Guadeloupe", + "Guam", + "Guatemala", + "Guernsey", + "Guinea", + "Guinea-Bissau", + "Guyana", + "Haiti", + "Hala_ib_triangle", + "Heard_Island_and_McDonald_Islands", + "Holy_See", + "Honduras", + "Hong_Kong", + "Howland_Island", + "Hungary", + "Iceland", + "Ilemi_triangle", + "India", + "Indonesia", + "Iran___Islamic_Republic_of_", + "Iraq", + "Ireland", + "Isle_of_Man", + "Israel", + "Italy", + "Jamaica", + "Jammu_and_Kashmir", + "Japan", + "Jarvis_Island", + "Jersey", + "Johnston_Atoll", + "Jordan", + "Juan_de_Nova_Island", + "Kazakhstan", + "Kenya", + "Kingman_Reef", + "Kiribati", + "Kuril_islands", + "Kuwait", + "Kyrgyzstan", + "Lao_People_s_Democratic_Republic", + "Latvia", + "Lebanon", + "Lesotho", + "Liberia", + "Libya", + "Liechtenstein", + "Lithuania", + "Luxembourg", + "Ma_tan_al-Sarra", + "Macau", + "Madagascar", + "Madeira_Islands", + "Malawi", + "Malaysia", + "Maldives", + "Mali", + "Malta", + "Marshall_Islands", + "Martinique", + "Mauritania", + "Mauritius", + "Mayotte", + "Mexico", + "Micronesia__Federated_States_of_", + "Midway_Island", + "Moldova,_Republic_of", + "Monaco", + "Mongolia", + "Montenegro", + "Montserrat", + "Morocco", + "Mozambique", + "Myanmar", + "Namibia", + "Nauru", + "Navassa_Island", + "Nepal", + "Netherlands", + "Netherlands_Antilles", + "New_Caledonia", + "New_Zealand", + "Nicaragua", + "Niger", + "Nigeria", + "Niue", + "Norfolk_Island", + "Northern_Mariana_Islands", + "Norway", + "Oman", + "Pakistan", + "Palau", + "Palmyra_Atoll", + "Panama", + "Papua_New_Guinea", + "Paracel_Islands", + "Paraguay", + "Peru", + "Philippines", + "Pitcairn", + "Poland", + "Portugal", + "Puerto_Rico", + "Qatar", + "Republic_of_Korea", + "Romania", + "Russian_Federation", + "Rwanda", + "R�union", + "Saint_Helena", + "Saint_Kitts_and_Nevis", + "Saint_Lucia", + "Saint_Pierre_et_Miquelon", + "Saint_Vincent_and_the_Grenadines", + "Samoa", + "San_Marino", + "Sao_Tome_and_Principe", + "Saudi_Arabia", + "Scarborough_Reef", + "Senegal", + "Senkaku_Islands", + "Serbia", + "Seychelles", + "Sierra_Leone", + "Singapore", + "Slovakia", + "Slovenia", + "Solomon_Islands", + "Somalia", + "South_Africa", + "South_Georgia_and_the_South_Sandwich_Islands", + "South_Sudan", + "Spain", + "Spratly_Islands", + "Sri_Lanka", + "Sudan", + "Suriname", + "Svalbard_and_Jan_Mayen_Islands", + "Swaziland", + "Sweden", + "Switzerland", + "Syrian_Arab_Republic", + "Taiwan", + "Tajikistan", + "Thailand", + "The_former_Yugoslav_Republic_of_Macedonia", + "Timor-Leste", + "Togo", + "Tokelau", + "Tonga", + "Trinidad_and_Tobago", + "Tromelin_Island", + "Tunisia", + "Turkey", + "Turkmenistan", + "Turks_and_Caicos_islands", + "Tuvalu", + "UK_of_Great_Britain_and_Northern_Ireland", + "Uganda", + "Ukraine", + "United_Arab_Emirates", + "United_Republic_of_Tanzania", + "United_States_Virgin_Islands", + "United_States_of_America", + "Uruguay", + "Uzbekistan", + "Vanuatu", + "Venezuela", + "Viet_Nam", + "Wake_Island", + "Wallis_and_Futuna", + "West_Bank", + "Western_Sahara", + "Yemen", + "Zambia", + "Zimbabwe" ) ); + + private static ArrayList filesGenerated = new ArrayList<>( + Arrays.asList( "Azores_Islands_bassin_10", + "Azores_Islands_bassin_11", + "Azores_Islands_bassin_12", + "Azores_Islands", + "Azores_Islands_bassin_5", + "Azores_Islands_bassin_6", + "Azores_Islands_bassin_7", + "Azores_Islands_bassin_8", + "Azores_Islands_bassin_9", + "Brunei_Darussalam_bassin_10", + "Brunei_Darussalam_bassin_11", + "Brunei_Darussalam_bassin_12", + "Brunei_Darussalam_bassin_7", + "Brunei_Darussalam_bassin_8", + "Brunei_Darussalam_bassin_9", + "Bulgaria_bassin_10", + "Bulgaria_bassin_11", + "Bulgaria_bassin_12", + "Bulgaria", + "Bulgaria_bassin_5", + "Bulgaria_bassin_6", + "Bulgaria_bassin_7", + "Bulgaria_bassin_8", + "Bulgaria_bassin_9", + "Burkina_Faso_bassin_10", + "Burkina_Faso_bassin_11", + "Burkina_Faso_bassin_12", + "Burkina_Faso", + "Burkina_Faso_bassin_5", + "Burkina_Faso_bassin_6", + "Burkina_Faso_bassin_7", + "Burkina_Faso_bassin_8", + "Burkina_Faso_bassin_9", + "Burundi_bassin_10", + "Burundi_bassin_11", + "Burundi_bassin_12", + "Burundi", + "Burundi_bassin_5", + "Burundi_bassin_6", + "Burundi_bassin_7", + "Burundi_bassin_8", + "Burundi_bassin_9", + "Cambodia_bassin_10", + "Cambodia_bassin_11", + "Cambodia_bassin_12", + "Cambodia", + "Cambodia_bassin_5", + "Cambodia_bassin_6", + "Cambodia_bassin_7", + "Cambodia_bassin_8", + "Cambodia_bassin_9", + "Cameroon_bassin_10", + "Cameroon_bassin_11", + "Cameroon_bassin_12", + "Cameroon", + "Cameroon_bassin_5", + "Cameroon_bassin_6", + "Cameroon_bassin_7", + "Cameroon_bassin_8", + "Cameroon_bassin_9", + "Canada_bassin_10", + "Canada_bassin_11", + "Canada_bassin_12", + "Canada", + "Canada_bassin_5", + "Canada_bassin_6", + "Canada_bassin_7", + "Canada_bassin_8", + "Canada_bassin_9", + "Cape_Verde_bassin_10", + "Cape_Verde_bassin_11", + "Cape_Verde_bassin_12", + "Cape_Verde", + "Cape_Verde_bassin_5", + "Cape_Verde_bassin_6", + "Cape_Verde_bassin_7", + "Cape_Verde_bassin_8", + "Cape_Verde_bassin_9", + "Cayman_Islands_bassin_10", + "Cayman_Islands_bassin_11", + "Cayman_Islands_bassin_12", + "Cayman_Islands", + "Cayman_Islands_bassin_5", + "Cayman_Islands_bassin_6", + "Cayman_Islands_bassin_7", + "Cayman_Islands_bassin_8", + "Cayman_Islands_bassin_9", + "Central_African Republic_bassin_10", + "Central_African Republic_bassin_11", + "Central_African Republic_bassin_12", + "Central_African Republic", + "Central_African Republic_bassin_5", + "Central_African Republic_bassin_6", + "Central_African Republic_bassin_7", + "Central_African Republic_bassin_8", + "Central_African Republic_bassin_9", + "Chad_bassin_10", + "Chad_bassin_11", + "Chad_bassin_12", + "Chad", + "Chad_bassin_5", + "Chad_bassin_6", + "Chad_bassin_7", + "Chad_bassin_8", + "Chad_bassin_9", + "Chile_bassin_10", + "Chile_bassin_11", + "Chile_bassin_12", + "Chile", + "Chile_bassin_5", + "Chile_bassin_6", + "Chile_bassin_7", + "Chile_bassin_8", + "Chile_bassin_9", + "China_bassin_10", + "China_bassin_11", + "China_bassin_12", + "China", + "China_bassin_5", + "China_bassin_6", + "China_bassin_7", + "China_bassin_8", + "China_bassin_9", + "Christmas_Island_bassin_10", + "Christmas_Island_bassin_11", + "Christmas_Island_bassin_12", + "Christmas_Island", + "Christmas_Island_bassin_5", + "Christmas_Island_bassin_6", + "Christmas_Island_bassin_7", + "Christmas_Island_bassin_8", + "Christmas_Island_bassin_9", + "Clipperton_Island_bassin_10", + "Clipperton_Island_bassin_11", + "Clipperton_Island_bassin_12", + "Clipperton_Island", + "Clipperton_Island_bassin_5", + "Clipperton_Island_bassin_6", + "Clipperton_Island_bassin_7", + "Clipperton_Island_bassin_8", + "Clipperton_Island_bassin_9", + "Colombia_bassin_10", + "Colombia_bassin_11", + "Colombia_bassin_12", + "Colombia", + "Colombia_bassin_5", + "Colombia_bassin_6", + "Colombia_bassin_7", + "Colombia_bassin_8", + "Colombia_bassin_9", + "Comoros_bassin_10", + "Comoros_bassin_11", + "Comoros_bassin_12", + "Comoros", + "Comoros_bassin_5", + "Comoros_bassin_6", + "Comoros_bassin_7", + "Comoros_bassin_8", + "Comoros_bassin_9", + "Congo_bassin_10", + "Congo_bassin_11", + "Congo_bassin_12", + "Congo", + "Congo_bassin_5", + "Congo_bassin_6", + "Congo_bassin_7", + "Congo_bassin_8", + "Congo_bassin_9", + "Cook_Islands_bassin_10", + "Cook_Islands_bassin_11", + "Cook_Islands_bassin_12", + "Cook_Islands", + "Cook_Islands_bassin_5", + "Cook_Islands_bassin_6", + "Cook_Islands_bassin_7", + "Cook_Islands_bassin_8", + "Cook_Islands_bassin_9", + "Costa_Rica_bassin_10", + "Costa_Rica_bassin_11", + "Costa_Rica_bassin_12", + "Costa_Rica", + "Costa_Rica_bassin_5", + "Costa_Rica_bassin_6", + "Costa_Rica_bassin_7", + "Costa_Rica_bassin_8", + "Costa_Rica_bassin_9", + "Croatia_bassin_10", + "Croatia_bassin_11", + "Croatia_bassin_12", + "Croatia", + "Croatia_bassin_5", + "Croatia_bassin_6", + "Croatia_bassin_7", + "Croatia_bassin_8", + "Croatia_bassin_9", + "Cuba_bassin_10", + "Cuba_bassin_11", + "Cuba_bassin_12", + "Cuba", + "Cuba_bassin_5", + "Cuba_bassin_6", + "Cuba_bassin_7", + "Cuba_bassin_8", + "Cuba_bassin_9", + "Cyprus_bassin_10", + "Cyprus_bassin_11", + "Cyprus_bassin_12", + "Cyprus", + "Cyprus_bassin_5", + "Cyprus_bassin_6", + "Cyprus_bassin_7", + "Cyprus_bassin_8", + "Cyprus_bassin_9", + "Czech_Republic_bassin_10", + "Czech_Republic_bassin_11", + "Czech_Republic_bassin_12", + "Czech_Republic", + "Czech_Republic_bassin_5", + "Czech_Republic_bassin_6", + "Czech_Republic_bassin_7", + "Czech_Republic_bassin_8", + "Czech_Republic_bassin_9", + "Democratic_Republic of the Congo_bassin_10", + "Democratic_Republic of the Congo_bassin_11", + "Democratic_Republic of the Congo_bassin_12", + "Democratic_Republic of the Congo", + "Democratic_Republic of the Congo_bassin_5", + "Democratic_Republic of the Congo_bassin_6", + "Democratic_Republic of the Congo_bassin_7", + "Democratic_Republic of the Congo_bassin_8", + "Democratic_Republic of the Congo_bassin_9", + "Dem_Peoples Rep of Korea_bassin_10", + "Dem_Peoples Rep of Korea_bassin_11", + "Dem_Peoples Rep of Korea_bassin_12", + "Dem_Peoples Rep of Korea", + "Dem_Peoples Rep of Korea_bassin_5", + "Dem_Peoples Rep of Korea_bassin_6", + "Dem_Peoples Rep of Korea_bassin_7", + "Dem_Peoples Rep of Korea_bassin_8", + "Dem_Peoples Rep of Korea_bassin_9", + "Denmark_bassin_10", + "Denmark_bassin_11", + "Denmark_bassin_12", + "Denmark", + "Denmark_bassin_5", + "Denmark_bassin_6", + "Denmark_bassin_7", + "Denmark_bassin_8", + "Denmark_bassin_9", + "Djibouti_bassin_10", + "Djibouti_bassin_11", + "Djibouti_bassin_12", + "Djibouti", + "Djibouti_bassin_5", + "Djibouti_bassin_6", + "Djibouti_bassin_7", + "Djibouti_bassin_8", + "Djibouti_bassin_9", + "Dominican_Republic_bassin_10", + "Dominican_Republic_bassin_11", + "Dominican_Republic_bassin_12", + "Dominican_Republic", + "Dominican_Republic_bassin_5", + "Dominican_Republic_bassin_6", + "Dominican_Republic_bassin_7", + "Dominican_Republic_bassin_8", + "Dominican_Republic_bassin_9", + "Dominica_bassin_10", + "Dominica_bassin_11", + "Dominica_bassin_12", + "Dominica", + "Dominica_bassin_5", + "Dominica_bassin_6", + "Dominica_bassin_7", + "Dominica_bassin_8", + "Dominica_bassin_9", + "Ecuador_bassin_10", + "Ecuador_bassin_11", + "Ecuador_bassin_12", + "Ecuador", + "Ecuador_bassin_5", + "Ecuador_bassin_6", + "Ecuador_bassin_7", + "Ecuador_bassin_8", + "Ecuador_bassin_9", + "Egypt_bassin_10", + "Egypt_bassin_11", + "Egypt_bassin_12", + "Egypt", + "Egypt_bassin_5", + "Egypt_bassin_6", + "Egypt_bassin_7", + "Egypt_bassin_8", + "Egypt_bassin_9", + "El_Salvador_bassin_10", + "El_Salvador_bassin_11", + "El_Salvador_bassin_12", + "El_Salvador", + "El_Salvador_bassin_5", + "El_Salvador_bassin_6", + "El_Salvador_bassin_7", + "El_Salvador_bassin_8", + "El_Salvador_bassin_9", + "Equatorial_Guinea_bassin_10", + "Equatorial_Guinea_bassin_11", + "Equatorial_Guinea_bassin_12", + "Equatorial_Guinea", + "Equatorial_Guinea_bassin_5", + "Equatorial_Guinea_bassin_6", + "Equatorial_Guinea_bassin_7", + "Equatorial_Guinea_bassin_8", + "Equatorial_Guinea_bassin_9", + "Eritrea_bassin_10", + "Eritrea_bassin_11", + "Eritrea_bassin_12", + "Eritrea", + "Eritrea_bassin_5", + "Eritrea_bassin_6", + "Eritrea_bassin_7", + "Eritrea_bassin_8", + "Eritrea_bassin_9", + "Estonia_bassin_10", + "Estonia_bassin_11", + "Estonia_bassin_12", + "Estonia", + "Estonia_bassin_5", + "Estonia_bassin_6", + "Estonia_bassin_7", + "Estonia_bassin_8", + "Estonia_bassin_9", + "Ethiopia_bassin_10", + "Ethiopia_bassin_11", + "Ethiopia_bassin_12", + "Ethiopia", + "Ethiopia_bassin_5", + "Ethiopia_bassin_6", + "Ethiopia_bassin_7", + "Ethiopia_bassin_8", + "Ethiopia_bassin_9", + "Europa_Island_bassin_10", + "Europa_Island_bassin_11", + "Europa_Island_bassin_12", + "Europa_Island", + "Europa_Island_bassin_5", + "Europa_Island_bassin_6", + "Europa_Island_bassin_7", + "Europa_Island_bassin_8", + "Europa_Island_bassin_9", + "Faroe_Islands_bassin_10", + "Faroe_Islands_bassin_11", + "Faroe_Islands_bassin_12", + "Faroe_Islands", + "Faroe_Islands_bassin_5", + "Faroe_Islands_bassin_6", + "Faroe_Islands_bassin_7", + "Faroe_Islands_bassin_8", + "Faroe_Islands_bassin_9", + "Fiji_bassin_10", + "Fiji_bassin_11", + "Fiji_bassin_12", + "Fiji", + "Fiji_bassin_5", + "Fiji_bassin_6", + "Fiji_bassin_7", + "Fiji_bassin_8", + "Fiji_bassin_9", + "Finland_bassin_10", + "Finland_bassin_11", + "Finland_bassin_12", + "Finland", + "Finland_bassin_5", + "Finland_bassin_6", + "Finland_bassin_7", + "Finland_bassin_8", + "Finland_bassin_9", + "France_bassin_10", + "France_bassin_11", + "France_bassin_12", + "France", + "France_bassin_5", + "France_bassin_6", + "France_bassin_7", + "France_bassin_8", + "France_bassin_9", + "French_Guiana_bassin_10", + "French_Guiana_bassin_11", + "French_Guiana_bassin_12", + "French_Guiana", + "French_Guiana_bassin_5", + "French_Guiana_bassin_6", + "French_Guiana_bassin_7", + "French_Guiana_bassin_8", + "French_Guiana_bassin_9", + "French_Polynesia_bassin_10", + "French_Polynesia_bassin_11", + "French_Polynesia_bassin_12", + "French_Polynesia", + "French_Polynesia_bassin_5", + "French_Polynesia_bassin_6", + "French_Polynesia_bassin_7", + "French_Polynesia_bassin_8", + "French_Polynesia_bassin_9", + "French_Southern and Antarctic Territories_bassin_10", + "French_Southern and Antarctic Territories_bassin_11", + "French_Southern and Antarctic Territories_bassin_12", + "French_Southern and Antarctic Territories", + "French_Southern and Antarctic Territories_bassin_5", + "French_Southern and Antarctic Territories_bassin_6", + "French_Southern and Antarctic Territories_bassin_7", + "French_Southern and Antarctic Territories_bassin_8", + "French_Southern and Antarctic Territories_bassin_9", + "Gabon_bassin_10", + "Gabon_bassin_11", + "Gabon_bassin_12", + "Gabon", + "Gabon_bassin_5", + "Gabon_bassin_6", + "Gabon_bassin_7", + "Gabon_bassin_8", + "Gabon_bassin_9", + "Gambia_bassin_10", + "Gambia_bassin_11", + "Gambia_bassin_12", + "Gambia", + "Gambia_bassin_5", + "Gambia_bassin_6", + "Gambia_bassin_7", + "Gambia_bassin_8", + "Gambia_bassin_9", + "Gaza_Strip_bassin_10", + "Gaza_Strip_bassin_11", + "Gaza_Strip_bassin_12", + "Gaza_Strip", + "Gaza_Strip_bassin_5", + "Gaza_Strip_bassin_6", + "Gaza_Strip_bassin_7", + "Gaza_Strip_bassin_8", + "Gaza_Strip_bassin_9", + "Georgia_bassin_10", + "Georgia_bassin_11", + "Georgia_bassin_12", + "Georgia", + "Georgia_bassin_5", + "Georgia_bassin_6", + "Georgia_bassin_7", + "Georgia_bassin_8", + "Georgia_bassin_9", + "Germany_bassin_10", + "Germany_bassin_11", + "Germany_bassin_12", + "Germany", + "Germany_bassin_5", + "Germany_bassin_6", + "Germany_bassin_7", + "Germany_bassin_8", + "Germany_bassin_9", + "Ghana_bassin_10", + "Ghana_bassin_11", + "Ghana_bassin_12", + "Ghana", + "Ghana_bassin_5", + "Ghana_bassin_6", + "Ghana_bassin_8", + "Ghana_bassin_9", + "Gibraltar_bassin_10", + "Gibraltar_bassin_11", + "Gibraltar_bassin_12", + "Gibraltar", + "Gibraltar_bassin_5", + "Gibraltar_bassin_6", + "Gibraltar_bassin_7", + "Gibraltar_bassin_8", + "Gibraltar_bassin_9", + "Glorioso_Island_bassin_10", + "Glorioso_Island_bassin_11", + "Glorioso_Island_bassin_12", + "Glorioso_Island", + "Glorioso_Island_bassin_5", + "Glorioso_Island_bassin_6", + "Glorioso_Island_bassin_7", + "Glorioso_Island_bassin_8", + "Glorioso_Island_bassin_9", + "Greece_bassin_10", + "Greece_bassin_11", + "Greece_bassin_12", + "Greece", + "Greece_bassin_5", + "Greece_bassin_6", + "Greece_bassin_7", + "Greece_bassin_8", + "Greece_bassin_9", + "Greenland_bassin_10", + "Greenland_bassin_11", + "Greenland_bassin_12", + "Greenland", + "Greenland_bassin_5", + "Greenland_bassin_6", + "Greenland_bassin_7", + "Greenland_bassin_8", + "Greenland_bassin_9", + "Grenada_bassin_10", + "Grenada_bassin_11", + "Grenada_bassin_12", + "Grenada", + "Grenada_bassin_5", + "Grenada_bassin_6", + "Grenada_bassin_7", + "Grenada_bassin_8", + "Grenada_bassin_9", + "Guadeloupe_bassin_10", + "Guadeloupe_bassin_11", + "Guadeloupe_bassin_12", + "Guadeloupe", + "Guadeloupe_bassin_5", + "Guadeloupe_bassin_6", + "Guadeloupe_bassin_7", + "Guadeloupe_bassin_8", + "Guadeloupe_bassin_9", + "Guam_bassin_10", + "Guam_bassin_11", + "Guam_bassin_12", + "Guam", + "Guam_bassin_5", + "Guam_bassin_6", + "Guam_bassin_7", + "Guam_bassin_8", + "Guam_bassin_9", + "Halaib_triangle_bassin_10", + "Halaib_triangle_bassin_11", + "Halaib_triangle_bassin_12", + "Halaib_triangle", + "Halaib_triangle_bassin_5", + "Halaib_triangle_bassin_6", + "Halaib_triangle_bassin_7", + "Halaib_triangle_bassin_8", + "Halaib_triangle_bassin_9", + "Heard_Island and McDonald Islands_bassin_12", + "Holy_See_bassin_10", + "Holy_See_bassin_11", + "Holy_See_bassin_12", + "Holy_See", + "Holy_See_bassin_5", + "Holy_See_bassin_6", + "Holy_See_bassin_7", + "Holy_See_bassin_8", + "Holy_See_bassin_9", + "Honduras_bassin_10", + "Honduras_bassin_11", + "Honduras_bassin_12", + "Honduras", + "Honduras_bassin_5", + "Honduras_bassin_6", + "Honduras_bassin_7", + "Honduras_bassin_8", + "Honduras_bassin_9", + "Hong_Kong_bassin_10", + "Hong_Kong_bassin_11", + "Hong_Kong_bassin_12", + "Hong_Kong", + "Hong_Kong_bassin_5", + "Hong_Kong_bassin_6", + "Hong_Kong_bassin_7", + "Hong_Kong_bassin_8", + "Hong_Kong_bassin_9", + "Howland_Island_bassin_10", + "Howland_Island_bassin_11", + "Howland_Island_bassin_12", + "Howland_Island", + "Howland_Island_bassin_5", + "Howland_Island_bassin_6", + "Howland_Island_bassin_7", + "Howland_Island_bassin_8", + "Howland_Island_bassin_9", + "Hungary_bassin_10", + "Hungary_bassin_11", + "Hungary_bassin_12", + "Hungary", + "Hungary_bassin_5", + "Hungary_bassin_6", + "Hungary_bassin_7", + "Hungary_bassin_8", + "Hungary_bassin_9", + "Iceland_bassin_10", + "Iceland_bassin_11", + "Iceland_bassin_12", + "Iceland", + "Iceland_bassin_5", + "Iceland_bassin_6", + "Iceland_bassin_7", + "Iceland_bassin_8", + "Iceland_bassin_9", + "Ilemi_triangle_bassin_10", + "Ilemi_triangle_bassin_11", + "Ilemi_triangle_bassin_12", + "Ilemi_triangle", + "Ilemi_triangle_bassin_5", + "Ilemi_triangle_bassin_6", + "Ilemi_triangle_bassin_7", + "Ilemi_triangle_bassin_8", + "Ilemi_triangle_bassin_9", + "India_bassin_10", + "India_bassin_11", + "India_bassin_12", + "India", + "India_bassin_5", + "India_bassin_6", + "India_bassin_7", + "India_bassin_8", + "India_bassin_9", + "Indonesia_bassin_10", + "Indonesia_bassin_11", + "Indonesia_bassin_12", + "Indonesia", + "Indonesia_bassin_5", + "Indonesia_bassin_6", + "Indonesia_bassin_7", + "Indonesia_bassin_8", + "Indonesia_bassin_9", + "Iraq_bassin_10", + "Iraq_bassin_11", + "Iraq_bassin_12", + "Iraq", + "Iraq_bassin_5", + "Iraq_bassin_6", + "Iraq_bassin_7", + "Iraq_bassin_8", + "Iraq_bassin_9", + "Ireland_bassin_10", + "Ireland_bassin_11", + "Ireland_bassin_12", + "Ireland", + "Ireland_bassin_5", + "Ireland_bassin_6", + "Ireland_bassin_7", + "Ireland_bassin_8", + "Ireland_bassin_9", + "Isle_of Man_bassin_10", + "Isle_of Man_bassin_11", + "Isle_of Man_bassin_12", + "Isle_of Man", + "Isle_of Man_bassin_5", + "Isle_of Man_bassin_6", + "Isle_of Man_bassin_7", + "Isle_of Man_bassin_8", + "Isle_of Man_bassin_9", + "Israel_bassin_10", + "Israel_bassin_11", + "Israel_bassin_12", + "Israel", + "Israel_bassin_5", + "Israel_bassin_6", + "Israel_bassin_7", + "Israel_bassin_8", + "Israel_bassin_9", + "Italy_bassin_10", + "Italy_bassin_11", + "Italy_bassin_12", + "Italy", + "Italy_bassin_5", + "Italy_bassin_6", + "Italy_bassin_7", + "Italy_bassin_8", + "Italy_bassin_9", + "Jamaica_bassin_10", + "Jamaica_bassin_11", + "Jamaica_bassin_12", + "Jamaica", + "Jamaica_bassin_5", + "Jamaica_bassin_6", + "Jamaica_bassin_7", + "Jamaica_bassin_8", + "Jamaica_bassin_9", + "Jammu_and Kashmir_bassin_10", + "Jammu_and Kashmir_bassin_11", + "Jammu_and Kashmir_bassin_12", + "Jammu_and Kashmir", + "Jammu_and Kashmir_bassin_5", + "Jammu_and Kashmir_bassin_6", + "Jammu_and Kashmir_bassin_7", + "Jammu_and Kashmir_bassin_8", + "Jammu_and Kashmir_bassin_9", + "Japan_bassin_10", + "Japan_bassin_11", + "Japan_bassin_12", + "Japan", + "Japan_bassin_5", + "Japan_bassin_6", + "Japan_bassin_7", + "Japan_bassin_8", + "Japan_bassin_9", + "Jarvis_Island_bassin_10", + "Jarvis_Island_bassin_11", + "Jarvis_Island_bassin_12", + "Jarvis_Island", + "Jarvis_Island_bassin_5", + "Jarvis_Island_bassin_6", + "Jarvis_Island_bassin_7", + "Jarvis_Island_bassin_8", + "Jarvis_Island_bassin_9", + "Jersey_bassin_10", + "Jersey_bassin_11", + "Jersey_bassin_12", + "Jersey", + "Jersey_bassin_5", + "Jersey_bassin_6", + "Jersey_bassin_7", + "Jersey_bassin_8", + "Jersey_bassin_9", + "Johnston_Atoll_bassin_10", + "Johnston_Atoll_bassin_11", + "Johnston_Atoll_bassin_12", + "Johnston_Atoll", + "Johnston_Atoll_bassin_5", + "Johnston_Atoll_bassin_6", + "Johnston_Atoll_bassin_7", + "Johnston_Atoll_bassin_8", + "Johnston_Atoll_bassin_9", + "Jordan_bassin_10", + "Jordan_bassin_11", + "Jordan_bassin_12", + "Jordan", + "Jordan_bassin_5", + "Jordan_bassin_6", + "Jordan_bassin_7", + "Jordan_bassin_8", + "Jordan_bassin_9", + "Juan_de Nova Island_bassin_10", + "Juan_de Nova Island_bassin_11", + "Juan_de Nova Island_bassin_12", + "Juan_de Nova Island", + "Juan_de Nova Island_bassin_5", + "Juan_de Nova Island_bassin_6", + "Juan_de Nova Island_bassin_7", + "Juan_de Nova Island_bassin_8", + "Juan_de Nova Island_bassin_9", + "Kazakhstan_bassin_10", + "Kazakhstan_bassin_11", + "Kazakhstan_bassin_12", + "Kazakhstan", + "Kazakhstan_bassin_5", + "Kazakhstan_bassin_6", + "Kazakhstan_bassin_7", + "Kazakhstan_bassin_8", + "Kazakhstan_bassin_9", + "Kenya_bassin_10", + "Kenya_bassin_11", + "Kenya_bassin_12", + "Kenya", + "Kenya_bassin_5", + "Kenya_bassin_6", + "Kenya_bassin_7", + "Kenya_bassin_8", + "Kenya_bassin_9", + "Kingman_Reef_bassin_10", + "Kingman_Reef_bassin_11", + "Kingman_Reef_bassin_12", + "Kingman_Reef", + "Kingman_Reef_bassin_5", + "Kingman_Reef_bassin_6", + "Kingman_Reef_bassin_7", + "Kingman_Reef_bassin_8", + "Kingman_Reef_bassin_9", + "Kiribati_bassin_10", + "Kiribati_bassin_11", + "Kiribati_bassin_12", + "Kiribati", + "Kiribati_bassin_5", + "Kiribati_bassin_6", + "Kiribati_bassin_7", + "Kiribati_bassin_8", + "Kiribati_bassin_9", + "Kuril_islands_bassin_10", + "Kuril_islands_bassin_11", + "Kuril_islands_bassin_12", + "Kuril_islands", + "Kuril_islands_bassin_5", + "Kuril_islands_bassin_6", + "Kuril_islands_bassin_7", + "Kuril_islands_bassin_8", + "Kuril_islands_bassin_9", + "Kuwait_bassin_10", + "Kuwait_bassin_11", + "Kuwait_bassin_12", + "Kuwait", + "Kuwait_bassin_5", + "Kuwait_bassin_6", + "Kuwait_bassin_7", + "Kuwait_bassin_8", + "Kuwait_bassin_9", + "Kyrgyzstan_bassin_10", + "Kyrgyzstan_bassin_11", + "Kyrgyzstan_bassin_12", + "Kyrgyzstan", + "Kyrgyzstan_bassin_5", + "Kyrgyzstan_bassin_6", + "Kyrgyzstan_bassin_7", + "Kyrgyzstan_bassin_8", + "Kyrgyzstan_bassin_9", + "Lao_Peoples Democratic Republic_bassin_10", + "Lao_Peoples Democratic Republic_bassin_11", + "Lao_Peoples Democratic Republic_bassin_12", + "Lao_Peoples Democratic Republic", + "Lao_Peoples Democratic Republic_bassin_5", + "Lao_Peoples Democratic Republic_bassin_6", + "Lao_Peoples Democratic Republic_bassin_7", + "Lao_Peoples Democratic Republic_bassin_8", + "Lao_Peoples Democratic Republic_bassin_9", + "Latvia_bassin_10", + "Latvia_bassin_11", + "Latvia_bassin_12", + "Latvia", + "Latvia_bassin_5", + "Latvia_bassin_6", + "Latvia_bassin_7", + "Latvia_bassin_8", + "Latvia_bassin_9", + "Lebanon_bassin_10", + "Lebanon_bassin_11", + "Lebanon_bassin_12", + "Lebanon", + "Lebanon_bassin_5", + "Lebanon_bassin_6", + "Lebanon_bassin_7", + "Lebanon_bassin_8", + "Lebanon_bassin_9", + "Lesotho_bassin_10", + "Lesotho_bassin_11", + "Lesotho_bassin_12", + "Lesotho", + "Lesotho_bassin_5", + "Lesotho_bassin_6", + "Lesotho_bassin_7", + "Lesotho_bassin_8", + "Lesotho_bassin_9", + "Liberia_bassin_10", + "Liberia_bassin_11", + "Liberia_bassin_12", + "Liberia", + "Liberia_bassin_5", + "Liberia_bassin_6", + "Liberia_bassin_7", + "Liberia_bassin_8", + "Liberia_bassin_9", + "Libya_bassin_10", + "Libya_bassin_11", + "Libya_bassin_12", + "Libya", + "Libya_bassin_5", + "Libya_bassin_6", + "Libya_bassin_7", + "Libya_bassin_8", + "Libya_bassin_9", + "Liechtenstein_bassin_10", + "Liechtenstein_bassin_11", + "Liechtenstein_bassin_12", + "Liechtenstein", + "Liechtenstein_bassin_5", + "Liechtenstein_bassin_6", + "Liechtenstein_bassin_7", + "Liechtenstein_bassin_8", + "Liechtenstein_bassin_9", + "Lithuania_bassin_10", + "Lithuania_bassin_11", + "Lithuania_bassin_12", + "Lithuania", + "Lithuania_bassin_5", + "Lithuania_bassin_6", + "Lithuania_bassin_7", + "Lithuania_bassin_8", + "Lithuania_bassin_9", + "Luxembourg_bassin_10", + "Luxembourg_bassin_11", + "Luxembourg_bassin_12", + "Luxembourg", + "Luxembourg_bassin_5", + "Luxembourg_bassin_6", + "Luxembourg_bassin_7", + "Luxembourg_bassin_8", + "Luxembourg_bassin_9", + "Macau_bassin_10", + "Macau_bassin_11", + "Macau_bassin_12", + "Macau", + "Macau_bassin_5", + "Macau_bassin_6", + "Macau_bassin_7", + "Macau_bassin_8", + "Macau_bassin_9", + "Madagascar_bassin_10", + "Madagascar_bassin_11", + "Madagascar_bassin_12", + "Madagascar", + "Madagascar_bassin_5", + "Madagascar_bassin_6", + "Madagascar_bassin_7", + "Madagascar_bassin_8", + "Madagascar_bassin_9", + "Madeira_Islands_bassin_10", + "Madeira_Islands_bassin_11", + "Madeira_Islands_bassin_12", + "Madeira_Islands", + "Madeira_Islands_bassin_5", + "Madeira_Islands_bassin_6", + "Madeira_Islands_bassin_7", + "Madeira_Islands_bassin_8", + "Madeira_Islands_bassin_9", + "Malawi_bassin_10", + "Malawi_bassin_11", + "Malawi_bassin_12", + "Malawi", + "Malawi_bassin_5", + "Malawi_bassin_6", + "Malawi_bassin_7", + "Malawi_bassin_8", + "Malawi_bassin_9", + "Malaysia_bassin_10", + "Malaysia_bassin_11", + "Malaysia_bassin_12", + "Malaysia", + "Malaysia_bassin_5", + "Malaysia_bassin_6", + "Malaysia_bassin_7", + "Malaysia_bassin_8", + "Malaysia_bassin_9", + "Maldives_bassin_10", + "Maldives_bassin_11", + "Maldives_bassin_12", + "Maldives", + "Maldives_bassin_5", + "Maldives_bassin_6", + "Maldives_bassin_7", + "Maldives_bassin_8", + "Maldives_bassin_9", + "Matan_al-Sarra_bassin_10", + "Matan_al-Sarra_bassin_11", + "Matan_al-Sarra_bassin_12", + "Matan_al-Sarra", + "Matan_al-Sarra_bassin_5", + "Matan_al-Sarra_bassin_6", + "Matan_al-Sarra_bassin_7", + "Matan_al-Sarra_bassin_8", + "Matan_al-Sarra_bassin_9", + "Montenegro_bassin_10", + "Montenegro_bassin_11", + "Montenegro_bassin_12", + "Montenegro", + "Montenegro_bassin_5", + "Montenegro_bassin_6", + "Montenegro_bassin_7", + "Montenegro_bassin_8", + "Montenegro_bassin_9", + "Qatar_bassin_10", + "Qatar_bassin_11", + "Qatar_bassin_12", + "Republic_of Korea_bassin_10", + "Republic_of Korea_bassin_11", + "Republic_of Korea_bassin_12", + "Republic_of Korea", + "Republic_of Korea_bassin_5", + "Republic_of Korea_bassin_6", + "Republic_of Korea_bassin_7", + "Republic_of Korea_bassin_8", + "Republic_of Korea_bassin_9", + "Romania_bassin_10", + "Romania_bassin_11", + "Romania_bassin_12", + "Romania", + "Romania_bassin_5", + "Romania_bassin_6", + "Romania_bassin_7", + "Romania_bassin_8", + "Romania_bassin_9", + "Russian_Federation_bassin_10", + "Russian_Federation_bassin_11", + "Russian_Federation_bassin_12", + "Russian_Federation", + "Russian_Federation_bassin_5", + "Russian_Federation_bassin_6", + "Russian_Federation_bassin_7", + "Russian_Federation_bassin_8", + "Russian_Federation_bassin_9", + "Rwanda_bassin_10", + "Rwanda_bassin_11", + "Rwanda_bassin_12", + "Rwanda", + "Rwanda_bassin_5", + "Rwanda_bassin_6", + "Rwanda_bassin_7", + "Rwanda_bassin_8", + "Rwanda_bassin_9", + "Saint_Helena_bassin_10", + "Saint_Helena_bassin_11", + "Saint_Helena_bassin_12", + "Saint_Helena", + "Saint_Helena_bassin_5", + "Saint_Helena_bassin_6", + "Saint_Helena_bassin_7", + "Saint_Helena_bassin_8", + "Saint_Helena_bassin_9", + "Saint_Kitts and Nevis_bassin_10", + "Saint_Kitts and Nevis_bassin_11", + "Saint_Kitts and Nevis_bassin_12", + "Saint_Kitts and Nevis", + "Saint_Kitts and Nevis_bassin_5", + "Saint_Kitts and Nevis_bassin_6", + "Saint_Kitts and Nevis_bassin_7", + "Saint_Kitts and Nevis_bassin_8", + "Saint_Kitts and Nevis_bassin_9", + "Saint_Lucia_bassin_10", + "Saint_Lucia_bassin_11", + "Saint_Lucia_bassin_12", + "Saint_Lucia", + "Saint_Lucia_bassin_5", + "Saint_Lucia_bassin_6", + "Saint_Lucia_bassin_7", + "Saint_Lucia_bassin_8", + "Saint_Lucia_bassin_9", + "Saint_Pierre et Miquelon_bassin_10", + "Saint_Pierre et Miquelon_bassin_11", + "Saint_Pierre et Miquelon_bassin_12", + "Saint_Pierre et Miquelon", + "Saint_Pierre et Miquelon_bassin_5", + "Saint_Pierre et Miquelon_bassin_6", + "Saint_Pierre et Miquelon_bassin_7", + "Saint_Pierre et Miquelon_bassin_8", + "Saint_Pierre et Miquelon_bassin_9", + "Saint_Vincent and the Grenadines_bassin_10", + "Saint_Vincent and the Grenadines_bassin_11", + "Saint_Vincent and the Grenadines_bassin_12", + "Saint_Vincent and the Grenadines", + "Saint_Vincent and the Grenadines_bassin_5", + "Saint_Vincent and the Grenadines_bassin_6", + "Saint_Vincent and the Grenadines_bassin_7", + "Saint_Vincent and the Grenadines_bassin_8", + "Saint_Vincent and the Grenadines_bassin_9", + "Samoa_bassin_10", + "Samoa_bassin_11", + "Samoa_bassin_12", + "Samoa", + "Samoa_bassin_5", + "Samoa_bassin_6", + "Samoa_bassin_7", + "Samoa_bassin_8", + "Samoa_bassin_9", + "San_Marino_bassin_10", + "San_Marino_bassin_11", + "San_Marino_bassin_12", + "San_Marino", + "San_Marino_bassin_5", + "San_Marino_bassin_6", + "San_Marino_bassin_7", + "San_Marino_bassin_8", + "San_Marino_bassin_9", + "Sao_Tome and Principe_bassin_10", + "Sao_Tome and Principe_bassin_11", + "Sao_Tome and Principe_bassin_12", + "Sao_Tome and Principe", + "Sao_Tome and Principe_bassin_5", + "Sao_Tome and Principe_bassin_6", + "Sao_Tome and Principe_bassin_7", + "Sao_Tome and Principe_bassin_8", + "Sao_Tome and Principe_bassin_9", + "Saudi_Arabia_bassin_10", + "Saudi_Arabia_bassin_11", + "Saudi_Arabia_bassin_12", + "Saudi_Arabia", + "Saudi_Arabia_bassin_5", + "Saudi_Arabia_bassin_6", + "Saudi_Arabia_bassin_7", + "Saudi_Arabia_bassin_8", + "Saudi_Arabia_bassin_9", + "Scarborough_Reef_bassin_10", + "Scarborough_Reef_bassin_11", + "Scarborough_Reef_bassin_12", + "Scarborough_Reef", + "Scarborough_Reef_bassin_5", + "Scarborough_Reef_bassin_6", + "Scarborough_Reef_bassin_7", + "Scarborough_Reef_bassin_8", + "Scarborough_Reef_bassin_9", + "Senegal_bassin_10", + "Senegal_bassin_11", + "Senegal_bassin_12", + "Senegal", + "Senegal_bassin_5", + "Senegal_bassin_6", + "Senegal_bassin_7", + "Senegal_bassin_8", + "Senegal_bassin_9", + "Senkaku_Islands_bassin_10", + "Senkaku_Islands_bassin_11", + "Senkaku_Islands_bassin_12", + "Senkaku_Islands", + "Senkaku_Islands_bassin_5", + "Senkaku_Islands_bassin_6", + "Senkaku_Islands_bassin_7", + "Senkaku_Islands_bassin_8", + "Senkaku_Islands_bassin_9", + "Serbia_bassin_10", + "Serbia_bassin_11", + "Serbia_bassin_12", + "Serbia", + "Serbia_bassin_5", + "Serbia_bassin_6", + "Serbia_bassin_7", + "Serbia_bassin_8", + "Serbia_bassin_9", + "Seychelles_bassin_10", + "Seychelles_bassin_11", + "Seychelles_bassin_12", + "Seychelles", + "Seychelles_bassin_5", + "Seychelles_bassin_6", + "Seychelles_bassin_7", + "Seychelles_bassin_8", + "Seychelles_bassin_9", + "Sierra_Leone_bassin_10", + "Sierra_Leone_bassin_11", + "Sierra_Leone_bassin_12", + "Sierra_Leone", + "Sierra_Leone_bassin_5", + "Sierra_Leone_bassin_6", + "Sierra_Leone_bassin_7", + "Sierra_Leone_bassin_8", + "Sierra_Leone_bassin_9", + "Singapore_bassin_10", + "Singapore_bassin_11", + "Singapore_bassin_12", + "Singapore", + "Singapore_bassin_5", + "Singapore_bassin_6", + "Singapore_bassin_7", + "Singapore_bassin_8", + "Singapore_bassin_9", + "Slovakia_bassin_10", + "Slovakia_bassin_11", + "Slovakia_bassin_12", + "Slovakia", + "Slovakia_bassin_5", + "Slovakia_bassin_6", + "Slovakia_bassin_7", + "Slovakia_bassin_8", + "Slovakia_bassin_9", + "Slovenia_bassin_10", + "Slovenia_bassin_11", + "Slovenia_bassin_12", + "Slovenia", + "Slovenia_bassin_5", + "Slovenia_bassin_6", + "Slovenia_bassin_7", + "Slovenia_bassin_8", + "Slovenia_bassin_9", + "Solomon_Islands_bassin_10", + "Solomon_Islands_bassin_11", + "Solomon_Islands_bassin_12", + "Solomon_Islands", + "Solomon_Islands_bassin_5", + "Solomon_Islands_bassin_6", + "Solomon_Islands_bassin_7", + "Solomon_Islands_bassin_8", + "Solomon_Islands_bassin_9", + "Somalia_bassin_10", + "Somalia_bassin_11", + "Somalia_bassin_12", + "Somalia", + "Somalia_bassin_5", + "Somalia_bassin_6", + "Somalia_bassin_7", + "Somalia_bassin_8", + "Somalia_bassin_9", + "South_Africa_bassin_10", + "South_Africa_bassin_11", + "South_Africa_bassin_12", + "South_Africa", + "South_Africa_bassin_5", + "South_Africa_bassin_6", + "South_Africa_bassin_7", + "South_Africa_bassin_8", + "South_Africa_bassin_9", + "South_Georgia and the South Sandwich Islands_bassin_10", + "South_Georgia and the South Sandwich Islands_bassin_11", + "South_Georgia and the South Sandwich Islands_bassin_12", + "South_Georgia and the South Sandwich Islands", + "South_Georgia and the South Sandwich Islands_bassin_5", + "South_Georgia and the South Sandwich Islands_bassin_6", + "South_Georgia and the South Sandwich Islands_bassin_7", + "South_Georgia and the South Sandwich Islands_bassin_8", + "South_Georgia and the South Sandwich Islands_bassin_9", + "South_Sudan_bassin_10", + "South_Sudan_bassin_11", + "South_Sudan_bassin_12", + "South_Sudan", + "South_Sudan_bassin_5", + "South_Sudan_bassin_6", + "South_Sudan_bassin_7", + "South_Sudan_bassin_8", + "South_Sudan_bassin_9", + "Spain_bassin_10", + "Spain_bassin_11", + "Spain_bassin_12", + "Spain", + "Spain_bassin_5", + "Spain_bassin_6", + "Spain_bassin_7", + "Spain_bassin_8", + "Spain_bassin_9", + "Spratly_Islands_bassin_10", + "Spratly_Islands_bassin_11", + "Spratly_Islands_bassin_12", + "Spratly_Islands", + "Spratly_Islands_bassin_5", + "Spratly_Islands_bassin_6", + "Spratly_Islands_bassin_7", + "Spratly_Islands_bassin_8", + "Spratly_Islands_bassin_9", + "Sri_Lanka_bassin_10", + "Sri_Lanka_bassin_11", + "Sri_Lanka_bassin_12", + "Sri_Lanka", + "Sri_Lanka_bassin_5", + "Sri_Lanka_bassin_6", + "Sri_Lanka_bassin_7", + "Sri_Lanka_bassin_8", + "Sri_Lanka_bassin_9", + "Suriname_bassin_10", + "Suriname_bassin_11", + "Suriname_bassin_12", + "Suriname", + "Suriname_bassin_5", + "Suriname_bassin_6", + "Suriname_bassin_7", + "Suriname_bassin_8", + "Suriname_bassin_9", + "Svalbard_and Jan Mayen Islands_bassin_10", + "Svalbard_and Jan Mayen Islands_bassin_11", + "Svalbard_and Jan Mayen Islands_bassin_12", + "Svalbard_and Jan Mayen Islands", + "Svalbard_and Jan Mayen Islands_bassin_5", + "Svalbard_and Jan Mayen Islands_bassin_6", + "Svalbard_and Jan Mayen Islands_bassin_7", + "Svalbard_and Jan Mayen Islands_bassin_8", + "Svalbard_and Jan Mayen Islands_bassin_9", + "Swaziland_bassin_10", + "Swaziland_bassin_11", + "Swaziland_bassin_12", + "Swaziland", + "Swaziland_bassin_5", + "Swaziland_bassin_6", + "Swaziland_bassin_7", + "Swaziland_bassin_8", + "Swaziland_bassin_9", + "Sweden_bassin_10", + "Sweden_bassin_11", + "Sweden_bassin_12", + "Sweden", + "Sweden_bassin_5", + "Sweden_bassin_6", + "Sweden_bassin_7", + "Sweden_bassin_8", + "Sweden_bassin_9", + "Switzerland_bassin_10", + "Switzerland_bassin_11", + "Switzerland_bassin_12", + "Switzerland", + "Switzerland_bassin_5", + "Switzerland_bassin_6", + "Switzerland_bassin_7", + "Switzerland_bassin_8", + "Switzerland_bassin_9", + "Syrian_Arab Republic_bassin_10", + "Syrian_Arab Republic_bassin_11", + "Syrian_Arab Republic_bassin_12", + "Syrian_Arab Republic", + "Syrian_Arab Republic_bassin_5", + "Syrian_Arab Republic_bassin_6", + "Syrian_Arab Republic_bassin_7", + "Syrian_Arab Republic_bassin_8", + "Syrian_Arab Republic_bassin_9", + "Taiwan_bassin_10", + "Taiwan_bassin_11", + "Taiwan_bassin_12", + "Taiwan", + "Taiwan_bassin_5", + "Taiwan_bassin_6", + "Taiwan_bassin_7", + "Taiwan_bassin_8", + "Taiwan_bassin_9", + "Tajikistan_bassin_10", + "Tajikistan_bassin_11", + "Tajikistan_bassin_12", + "Tajikistan", + "Tajikistan_bassin_5", + "Tajikistan_bassin_6", + "Tajikistan_bassin_7", + "Tajikistan_bassin_8", + "Tajikistan_bassin_9", + "Thailand_bassin_10", + "Thailand_bassin_11", + "Thailand_bassin_12", + "Thailand", + "Thailand_bassin_5", + "Thailand_bassin_6", + "Thailand_bassin_7", + "Thailand_bassin_8", + "Thailand_bassin_9", + "The_former Yugoslav Republic of Macedonia_bassin_10", + "The_former Yugoslav Republic of Macedonia_bassin_11", + "The_former Yugoslav Republic of Macedonia_bassin_12", + "The_former Yugoslav Republic of Macedonia", + "The_former Yugoslav Republic of Macedonia_bassin_5", + "The_former Yugoslav Republic of Macedonia_bassin_6", + "The_former Yugoslav Republic of Macedonia_bassin_7", + "The_former Yugoslav Republic of Macedonia_bassin_8", + "The_former Yugoslav Republic of Macedonia_bassin_9", + "Timor-Leste_bassin_10", + "Timor-Leste_bassin_11", + "Timor-Leste_bassin_12", + "Timor-Leste", + "Timor-Leste_bassin_5", + "Timor-Leste_bassin_6", + "Timor-Leste_bassin_7", + "Timor-Leste_bassin_8", + "Timor-Leste_bassin_9", + "Togo_bassin_10", + "Togo_bassin_11", + "Togo_bassin_12", + "Togo", + "Togo_bassin_5", + "Togo_bassin_6", + "Togo_bassin_7", + "Togo_bassin_8", + "Togo_bassin_9", + "Tokelau_bassin_10", + "Tokelau_bassin_11", + "Tokelau_bassin_12", + "Tokelau", + "Tokelau_bassin_5", + "Tokelau_bassin_6", + "Tokelau_bassin_7", + "Tokelau_bassin_8", + "Tokelau_bassin_9", + "Tonga_bassin_10", + "Tonga_bassin_11", + "Tonga_bassin_12", + "Tonga", + "Tonga_bassin_5", + "Tonga_bassin_6", + "Tonga_bassin_7", + "Tonga_bassin_8", + "Tonga_bassin_9", + "Trinidad_and Tobago_bassin_10", + "Trinidad_and Tobago_bassin_11", + "Trinidad_and Tobago_bassin_12", + "Trinidad_and Tobago", + "Trinidad_and Tobago_bassin_5", + "Trinidad_and Tobago_bassin_6", + "Trinidad_and Tobago_bassin_7", + "Trinidad_and Tobago_bassin_8", + "Trinidad_and Tobago_bassin_9", + "Tromelin_Island_bassin_10", + "Tromelin_Island_bassin_11", + "Tromelin_Island_bassin_12", + "Tromelin_Island", + "Tromelin_Island_bassin_5", + "Tromelin_Island_bassin_6", + "Tromelin_Island_bassin_7", + "Tromelin_Island_bassin_8", + "Tromelin_Island_bassin_9", + "Tunisia_bassin_10", + "Tunisia_bassin_11", + "Tunisia_bassin_12", + "Tunisia", + "Tunisia_bassin_5", + "Tunisia_bassin_6", + "Tunisia_bassin_7", + "Tunisia_bassin_8", + "Tunisia_bassin_9", + "Turkey_bassin_10", + "Turkey_bassin_11", + "Turkey_bassin_12", + "Turkey", + "Turkey_bassin_5", + "Turkey_bassin_6", + "Turkey_bassin_7", + "Turkey_bassin_8", + "Turkey_bassin_9", + "Turkmenistan_bassin_10", + "Turkmenistan_bassin_11", + "Turkmenistan_bassin_12", + "Turkmenistan", + "Turkmenistan_bassin_5", + "Turkmenistan_bassin_6", + "Turkmenistan_bassin_7", + "Turkmenistan_bassin_8", + "Turkmenistan_bassin_9", + "Turks_and Caicos islands_bassin_10", + "Turks_and Caicos islands_bassin_11", + "Turks_and Caicos islands_bassin_12", + "Turks_and Caicos islands", + "Turks_and Caicos islands_bassin_5", + "Turks_and Caicos islands_bassin_6", + "Turks_and Caicos islands_bassin_7", + "Turks_and Caicos islands_bassin_8", + "Turks_and Caicos islands_bassin_9", + "Tuvalu_bassin_10", + "Tuvalu_bassin_11", + "Tuvalu_bassin_12", + "Tuvalu", + "Tuvalu_bassin_5", + "Tuvalu_bassin_6", + "Tuvalu_bassin_7", + "Tuvalu_bassin_8", + "Tuvalu_bassin_9", + "Uganda_bassin_10", + "Uganda_bassin_11", + "Uganda_bassin_12", + "Uganda", + "Uganda_bassin_5", + "Uganda_bassin_6", + "Uganda_bassin_7", + "Uganda_bassin_8", + "Uganda_bassin_9", + "Ukraine_bassin_10", + "Ukraine_bassin_11", + "Ukraine_bassin_12", + "Ukraine", + "Ukraine_bassin_5", + "Ukraine_bassin_6", + "Ukraine_bassin_7", + "Ukraine_bassin_8", + "Ukraine_bassin_9", + "UK_of Great Britain and Northern Ireland_bassin_10", + "UK_of Great Britain and Northern Ireland_bassin_11", + "UK_of Great Britain and Northern Ireland_bassin_12", + "UK_of Great Britain and Northern Ireland", + "UK_of Great Britain and Northern Ireland_bassin_5", + "UK_of Great Britain and Northern Ireland_bassin_6", + "UK_of Great Britain and Northern Ireland_bassin_7", + "UK_of Great Britain and Northern Ireland_bassin_8", + "UK_of Great Britain and Northern Ireland_bassin_9", + "United_Arab Emirates_bassin_10", + "United_Arab Emirates_bassin_11", + "United_Arab Emirates_bassin_12", + "United_Arab Emirates", + "United_Arab Emirates_bassin_5", + "United_Arab Emirates_bassin_6", + "United_Arab Emirates_bassin_7", + "United_Arab Emirates_bassin_8", + "United_Arab Emirates_bassin_9", + "United_Republic of Tanzania_bassin_10", + "United_Republic of Tanzania_bassin_11", + "United_Republic of Tanzania_bassin_12", + "United_Republic of Tanzania", + "United_Republic of Tanzania_bassin_5", + "United_Republic of Tanzania_bassin_6", + "United_Republic of Tanzania_bassin_7", + "United_Republic of Tanzania_bassin_8", + "United_Republic of Tanzania_bassin_9", + "United_States of America_bassin_10", + "United_States of America_bassin_11", + "United_States of America_bassin_12", + "United_States of America", + "United_States of America_bassin_5", + "United_States of America_bassin_6", + "United_States of America_bassin_7", + "United_States of America_bassin_8", + "United_States of America_bassin_9", + "United_States Virgin Islands_bassin_10", + "United_States Virgin Islands_bassin_11", + "United_States Virgin Islands_bassin_12", + "United_States Virgin Islands", + "United_States Virgin Islands_bassin_5", + "United_States Virgin Islands_bassin_6", + "United_States Virgin Islands_bassin_7", + "United_States Virgin Islands_bassin_8", + "United_States Virgin Islands_bassin_9", + "Uruguay_bassin_10", + "Uruguay_bassin_11", + "Uruguay_bassin_12", + "Uruguay", + "Uruguay_bassin_5", + "Uruguay_bassin_6", + "Uruguay_bassin_7", + "Uruguay_bassin_8", + "Uruguay_bassin_9", + "Uzbekistan_bassin_10", + "Uzbekistan_bassin_11", + "Uzbekistan_bassin_12", + "Uzbekistan", + "Uzbekistan_bassin_5", + "Uzbekistan_bassin_6", + "Uzbekistan_bassin_7", + "Uzbekistan_bassin_8", + "Uzbekistan_bassin_9", + "Vanuatu_bassin_10", + "Vanuatu_bassin_11", + "Vanuatu_bassin_12", + "Vanuatu", + "Vanuatu_bassin_5", + "Vanuatu_bassin_6", + "Vanuatu_bassin_7", + "Vanuatu_bassin_8", + "Vanuatu_bassin_9", + "Venezuela_bassin_10", + "Venezuela_bassin_11", + "Venezuela_bassin_12", + "Venezuela", + "Venezuela_bassin_5", + "Venezuela_bassin_6", + "Venezuela_bassin_7", + "Venezuela_bassin_8", + "Venezuela_bassin_9", + "Viet_Nam_bassin_10", + "Viet_Nam_bassin_11", + "Viet_Nam_bassin_12", + "Viet_Nam", + "Viet_Nam_bassin_5", + "Viet_Nam_bassin_6", + "Viet_Nam_bassin_7", + "Viet_Nam_bassin_8", + "Viet_Nam_bassin_9", + "Wake_Island_bassin_10", + "Wake_Island_bassin_11", + "Wake_Island_bassin_12", + "Wake_Island", + "Wake_Island_bassin_5", + "Wake_Island_bassin_6", + "Wake_Island_bassin_7", + "Wake_Island_bassin_8", + "Wake_Island_bassin_9", + "Wallis_and Futuna_bassin_10", + "Wallis_and Futuna_bassin_11", + "Wallis_and Futuna_bassin_12", + "Wallis_and Futuna", + "Wallis_and Futuna_bassin_5", + "Wallis_and Futuna_bassin_6", + "Wallis_and Futuna_bassin_7", + "Wallis_and Futuna_bassin_8", + "Wallis_and Futuna_bassin_9", + "Western_Sahara_bassin_10", + "Western_Sahara_bassin_11", + "Western_Sahara_bassin_12", + "Western_Sahara", + "Western_Sahara_bassin_5", + "Western_Sahara_bassin_6", + "Western_Sahara_bassin_7", + "Western_Sahara_bassin_8", + "Western_Sahara_bassin_9", + "West_Bank_bassin_10", + "West_Bank_bassin_11", + "West_Bank_bassin_12", + "West_Bank", + "West_Bank_bassin_5", + "West_Bank_bassin_6", + "West_Bank_bassin_7", + "West_Bank_bassin_8", + "West_Bank_bassin_9", + "Yemen_bassin_10", + "Yemen_bassin_11", + "Yemen_bassin_12", + "Yemen", + "Yemen_bassin_5", + "Yemen_bassin_6", + "Yemen_bassin_7", + "Yemen_bassin_8", + "Yemen_bassin_9", + "Zambia_bassin_10", + "Zambia_bassin_11", + "Zambia_bassin_12", + "Zambia", + "Zambia_bassin_5", + "Zambia_bassin_6", + "Zambia_bassin_7", + "Zambia_bassin_8", + "Zambia_bassin_9", + "Zimbabwe_bassin_10", + "Zimbabwe_bassin_11", + "Zimbabwe_bassin_12", + "Zimbabwe", + "Zimbabwe_bassin_5", + "Zimbabwe_bassin_6", + "Zimbabwe_bassin_7", + "Zimbabwe_bassin_8", + "Zimbabwe_bassin_9" + ) ); + + public static void main(String[] args) { + + ArrayList missingCountries = new ArrayList(); + + for (String country : allCountryNames) { + if( !filesGenerated.contains(country) ) { + missingCountries.add( country); + } + } + System.out.println( missingCountries.size() ); + System.out.println( missingCountries ); + + String finalCountries = ""; + for (String missing : missingCountries) { + finalCountries += '"' + missing.replaceAll( "_", " ") + "\", "; + } + System.out.println( finalCountries ); + + } + + +} From a061afa0ec6a5c58b607806be43997b5488f1a15 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:14 +0100 Subject: [PATCH 0992/1620] New translations findMissingCountries.java (English) --- .../earth/app/view/Messages_en.properties | 1975 ++++++++++++++++- 1 file changed, 1895 insertions(+), 80 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 6e034a1981..768f973a7f 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,80 +1,1895 @@ -package org.openforis.collect.earth.app.ad_hoc; - -import java.util.List; - -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.manager.RecordManager; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.CollectRecordSummary; -import org.openforis.collect.model.RecordFilter; -import org.openforis.idm.model.Coordinate; -import org.openforis.idm.model.CoordinateAttribute; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public abstract class FixOtherLand { - - @Autowired - private RecordManager recordManager; - - @Autowired - private EarthSurveyService earthSurveyService; - - private Logger logger = LoggerFactory.getLogger( FixOtherLand.class); - - private boolean stopFix = false; - - private List getAllRecords(){ - RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey() , EarthConstants.ROOT_ENTITY_NAME); - List records = recordManager.loadSummaries( rf ); - return records; - } - - public void fixCoordinates(){ - List allRecords = getAllRecords(); - - if( shouldStopFixing()){ - return; - } - - for (CollectRecordSummary summaryCollectRecord : allRecords) { - if( shouldStopFixing()){ - break; - } - try { - CollectRecord collectRecord = recordManager.load( earthSurveyService.getCollectSurvey(), summaryCollectRecord.getId(), Step.ENTRY); - CoordinateAttribute plotCoord = (CoordinateAttribute) collectRecord.getNodeByPath("/plot/location"); //$NON-NLS-1$ - if( plotCoord != null && plotCoord.getValue() != null ){ - if( plotCoord.getValue().getX() < getLongitudeLimit() ){ - Coordinate coordinate = new Coordinate(plotCoord.getValue().getY(), plotCoord.getValue().getX(), plotCoord.getValue().getSrsId() ); - plotCoord.setValue( coordinate ); - recordManager.save( collectRecord ); - - } - - - } - } catch (Exception e) { - logger.error("Error fixing Coordinates", e); //$NON-NLS-1$ - } - } - - } - - protected abstract int getLongitudeLimit(); - - private boolean shouldStopFixing() { - return stopFix; - } - - public void stopFixing() { - stopFix = true; - - } - -} \ No newline at end of file +package org.openforis.collect.earth.app.ad_hoc; + +import java.util.ArrayList; +import java.util.Arrays; + +public class findMissingCountries { + + private static ArrayList allCountryNames = new ArrayList<>( + Arrays.asList( + "Abyei", + "Afghanistan", + "Aksai_Chin", + "Albania", + "Algeria", + "American_Samoa", + "Andorra", + "Angola", + "Anguilla", + "Antarctica", + "Antigua_and_Barbuda", + "Argentina", + "Armenia", + "Aruba", + "Arunachal_Pradesh", + "Ashmore_and_Cartier_Islands", + "Australia", + "Austria", + "Azerbaijan", + "Azores_Islands", + "Bahamas", + "Bahrain", + "Baker_Island", + "Bangladesh", + "Barbados", + "Bassas_da_India", + "Belarus", + "Belgium", + "Belize", + "Benin", + "Bermuda", + "Bhutan", + "Bird_Island", + "Bolivia", + "Bosnia_and_Herzegovina", + "Botswana", + "Bouvet_Island", + "Brazil", + "British_Indian_Ocean_Territory", + "British_Virgin_Islands", + "Brunei_Darussalam", + "Bulgaria", + "Burkina_Faso", + "Burundi", + "Cambodia", + "Cameroon", + "Canada", + "Cape_Verde", + "Cayman_Islands", + "Central_African_Republic", + "Chad", + "Chile", + "China", + "China/India", + "Christmas_Island", + "Clipperton_Island", + "Cocos__Keeling__Islands", + "Colombia", + "Comoros", + "Congo", + "Cook_Islands", + "Costa_Rica", + "Croatia", + "Cuba", + "Cyprus", + "Czech_Republic", + "C�te_d_Ivoire", + "Dem_People_s_Rep_of_Korea", + "Democratic_Republic_of_the_Congo", + "Denmark", + "Djibouti", + "Dominica", + "Dominican_Republic", + "Ecuador", + "Egypt", + "El_Salvador", + "Equatorial_Guinea", + "Eritrea", + "Estonia", + "Ethiopia", + "Europa_Island", + "Falkland_Islands__Malvinas_", + "Faroe_Islands", + "Fiji", + "Finland", + "France", + "French_Guiana", + "French_Polynesia", + "French_Southern_and_Antarctic_Territories", + "Gabon", + "Gambia", + "Gaza_Strip", + "Georgia", + "Germany", + "Ghana", + "Gibraltar", + "Glorioso_Island", + "Greece", + "Greenland", + "Grenada", + "Guadeloupe", + "Guam", + "Guatemala", + "Guernsey", + "Guinea", + "Guinea-Bissau", + "Guyana", + "Haiti", + "Hala_ib_triangle", + "Heard_Island_and_McDonald_Islands", + "Holy_See", + "Honduras", + "Hong_Kong", + "Howland_Island", + "Hungary", + "Iceland", + "Ilemi_triangle", + "India", + "Indonesia", + "Iran___Islamic_Republic_of_", + "Iraq", + "Ireland", + "Isle_of_Man", + "Israel", + "Italy", + "Jamaica", + "Jammu_and_Kashmir", + "Japan", + "Jarvis_Island", + "Jersey", + "Johnston_Atoll", + "Jordan", + "Juan_de_Nova_Island", + "Kazakhstan", + "Kenya", + "Kingman_Reef", + "Kiribati", + "Kuril_islands", + "Kuwait", + "Kyrgyzstan", + "Lao_People_s_Democratic_Republic", + "Latvia", + "Lebanon", + "Lesotho", + "Liberia", + "Libya", + "Liechtenstein", + "Lithuania", + "Luxembourg", + "Ma_tan_al-Sarra", + "Macau", + "Madagascar", + "Madeira_Islands", + "Malawi", + "Malaysia", + "Maldives", + "Mali", + "Malta", + "Marshall_Islands", + "Martinique", + "Mauritania", + "Mauritius", + "Mayotte", + "Mexico", + "Micronesia__Federated_States_of_", + "Midway_Island", + "Moldova,_Republic_of", + "Monaco", + "Mongolia", + "Montenegro", + "Montserrat", + "Morocco", + "Mozambique", + "Myanmar", + "Namibia", + "Nauru", + "Navassa_Island", + "Nepal", + "Netherlands", + "Netherlands_Antilles", + "New_Caledonia", + "New_Zealand", + "Nicaragua", + "Niger", + "Nigeria", + "Niue", + "Norfolk_Island", + "Northern_Mariana_Islands", + "Norway", + "Oman", + "Pakistan", + "Palau", + "Palmyra_Atoll", + "Panama", + "Papua_New_Guinea", + "Paracel_Islands", + "Paraguay", + "Peru", + "Philippines", + "Pitcairn", + "Poland", + "Portugal", + "Puerto_Rico", + "Qatar", + "Republic_of_Korea", + "Romania", + "Russian_Federation", + "Rwanda", + "R�union", + "Saint_Helena", + "Saint_Kitts_and_Nevis", + "Saint_Lucia", + "Saint_Pierre_et_Miquelon", + "Saint_Vincent_and_the_Grenadines", + "Samoa", + "San_Marino", + "Sao_Tome_and_Principe", + "Saudi_Arabia", + "Scarborough_Reef", + "Senegal", + "Senkaku_Islands", + "Serbia", + "Seychelles", + "Sierra_Leone", + "Singapore", + "Slovakia", + "Slovenia", + "Solomon_Islands", + "Somalia", + "South_Africa", + "South_Georgia_and_the_South_Sandwich_Islands", + "South_Sudan", + "Spain", + "Spratly_Islands", + "Sri_Lanka", + "Sudan", + "Suriname", + "Svalbard_and_Jan_Mayen_Islands", + "Swaziland", + "Sweden", + "Switzerland", + "Syrian_Arab_Republic", + "Taiwan", + "Tajikistan", + "Thailand", + "The_former_Yugoslav_Republic_of_Macedonia", + "Timor-Leste", + "Togo", + "Tokelau", + "Tonga", + "Trinidad_and_Tobago", + "Tromelin_Island", + "Tunisia", + "Turkey", + "Turkmenistan", + "Turks_and_Caicos_islands", + "Tuvalu", + "UK_of_Great_Britain_and_Northern_Ireland", + "Uganda", + "Ukraine", + "United_Arab_Emirates", + "United_Republic_of_Tanzania", + "United_States_Virgin_Islands", + "United_States_of_America", + "Uruguay", + "Uzbekistan", + "Vanuatu", + "Venezuela", + "Viet_Nam", + "Wake_Island", + "Wallis_and_Futuna", + "West_Bank", + "Western_Sahara", + "Yemen", + "Zambia", + "Zimbabwe" ) ); + + private static ArrayList filesGenerated = new ArrayList<>( + Arrays.asList( "Azores_Islands_bassin_10", + "Azores_Islands_bassin_11", + "Azores_Islands_bassin_12", + "Azores_Islands", + "Azores_Islands_bassin_5", + "Azores_Islands_bassin_6", + "Azores_Islands_bassin_7", + "Azores_Islands_bassin_8", + "Azores_Islands_bassin_9", + "Brunei_Darussalam_bassin_10", + "Brunei_Darussalam_bassin_11", + "Brunei_Darussalam_bassin_12", + "Brunei_Darussalam_bassin_7", + "Brunei_Darussalam_bassin_8", + "Brunei_Darussalam_bassin_9", + "Bulgaria_bassin_10", + "Bulgaria_bassin_11", + "Bulgaria_bassin_12", + "Bulgaria", + "Bulgaria_bassin_5", + "Bulgaria_bassin_6", + "Bulgaria_bassin_7", + "Bulgaria_bassin_8", + "Bulgaria_bassin_9", + "Burkina_Faso_bassin_10", + "Burkina_Faso_bassin_11", + "Burkina_Faso_bassin_12", + "Burkina_Faso", + "Burkina_Faso_bassin_5", + "Burkina_Faso_bassin_6", + "Burkina_Faso_bassin_7", + "Burkina_Faso_bassin_8", + "Burkina_Faso_bassin_9", + "Burundi_bassin_10", + "Burundi_bassin_11", + "Burundi_bassin_12", + "Burundi", + "Burundi_bassin_5", + "Burundi_bassin_6", + "Burundi_bassin_7", + "Burundi_bassin_8", + "Burundi_bassin_9", + "Cambodia_bassin_10", + "Cambodia_bassin_11", + "Cambodia_bassin_12", + "Cambodia", + "Cambodia_bassin_5", + "Cambodia_bassin_6", + "Cambodia_bassin_7", + "Cambodia_bassin_8", + "Cambodia_bassin_9", + "Cameroon_bassin_10", + "Cameroon_bassin_11", + "Cameroon_bassin_12", + "Cameroon", + "Cameroon_bassin_5", + "Cameroon_bassin_6", + "Cameroon_bassin_7", + "Cameroon_bassin_8", + "Cameroon_bassin_9", + "Canada_bassin_10", + "Canada_bassin_11", + "Canada_bassin_12", + "Canada", + "Canada_bassin_5", + "Canada_bassin_6", + "Canada_bassin_7", + "Canada_bassin_8", + "Canada_bassin_9", + "Cape_Verde_bassin_10", + "Cape_Verde_bassin_11", + "Cape_Verde_bassin_12", + "Cape_Verde", + "Cape_Verde_bassin_5", + "Cape_Verde_bassin_6", + "Cape_Verde_bassin_7", + "Cape_Verde_bassin_8", + "Cape_Verde_bassin_9", + "Cayman_Islands_bassin_10", + "Cayman_Islands_bassin_11", + "Cayman_Islands_bassin_12", + "Cayman_Islands", + "Cayman_Islands_bassin_5", + "Cayman_Islands_bassin_6", + "Cayman_Islands_bassin_7", + "Cayman_Islands_bassin_8", + "Cayman_Islands_bassin_9", + "Central_African Republic_bassin_10", + "Central_African Republic_bassin_11", + "Central_African Republic_bassin_12", + "Central_African Republic", + "Central_African Republic_bassin_5", + "Central_African Republic_bassin_6", + "Central_African Republic_bassin_7", + "Central_African Republic_bassin_8", + "Central_African Republic_bassin_9", + "Chad_bassin_10", + "Chad_bassin_11", + "Chad_bassin_12", + "Chad", + "Chad_bassin_5", + "Chad_bassin_6", + "Chad_bassin_7", + "Chad_bassin_8", + "Chad_bassin_9", + "Chile_bassin_10", + "Chile_bassin_11", + "Chile_bassin_12", + "Chile", + "Chile_bassin_5", + "Chile_bassin_6", + "Chile_bassin_7", + "Chile_bassin_8", + "Chile_bassin_9", + "China_bassin_10", + "China_bassin_11", + "China_bassin_12", + "China", + "China_bassin_5", + "China_bassin_6", + "China_bassin_7", + "China_bassin_8", + "China_bassin_9", + "Christmas_Island_bassin_10", + "Christmas_Island_bassin_11", + "Christmas_Island_bassin_12", + "Christmas_Island", + "Christmas_Island_bassin_5", + "Christmas_Island_bassin_6", + "Christmas_Island_bassin_7", + "Christmas_Island_bassin_8", + "Christmas_Island_bassin_9", + "Clipperton_Island_bassin_10", + "Clipperton_Island_bassin_11", + "Clipperton_Island_bassin_12", + "Clipperton_Island", + "Clipperton_Island_bassin_5", + "Clipperton_Island_bassin_6", + "Clipperton_Island_bassin_7", + "Clipperton_Island_bassin_8", + "Clipperton_Island_bassin_9", + "Colombia_bassin_10", + "Colombia_bassin_11", + "Colombia_bassin_12", + "Colombia", + "Colombia_bassin_5", + "Colombia_bassin_6", + "Colombia_bassin_7", + "Colombia_bassin_8", + "Colombia_bassin_9", + "Comoros_bassin_10", + "Comoros_bassin_11", + "Comoros_bassin_12", + "Comoros", + "Comoros_bassin_5", + "Comoros_bassin_6", + "Comoros_bassin_7", + "Comoros_bassin_8", + "Comoros_bassin_9", + "Congo_bassin_10", + "Congo_bassin_11", + "Congo_bassin_12", + "Congo", + "Congo_bassin_5", + "Congo_bassin_6", + "Congo_bassin_7", + "Congo_bassin_8", + "Congo_bassin_9", + "Cook_Islands_bassin_10", + "Cook_Islands_bassin_11", + "Cook_Islands_bassin_12", + "Cook_Islands", + "Cook_Islands_bassin_5", + "Cook_Islands_bassin_6", + "Cook_Islands_bassin_7", + "Cook_Islands_bassin_8", + "Cook_Islands_bassin_9", + "Costa_Rica_bassin_10", + "Costa_Rica_bassin_11", + "Costa_Rica_bassin_12", + "Costa_Rica", + "Costa_Rica_bassin_5", + "Costa_Rica_bassin_6", + "Costa_Rica_bassin_7", + "Costa_Rica_bassin_8", + "Costa_Rica_bassin_9", + "Croatia_bassin_10", + "Croatia_bassin_11", + "Croatia_bassin_12", + "Croatia", + "Croatia_bassin_5", + "Croatia_bassin_6", + "Croatia_bassin_7", + "Croatia_bassin_8", + "Croatia_bassin_9", + "Cuba_bassin_10", + "Cuba_bassin_11", + "Cuba_bassin_12", + "Cuba", + "Cuba_bassin_5", + "Cuba_bassin_6", + "Cuba_bassin_7", + "Cuba_bassin_8", + "Cuba_bassin_9", + "Cyprus_bassin_10", + "Cyprus_bassin_11", + "Cyprus_bassin_12", + "Cyprus", + "Cyprus_bassin_5", + "Cyprus_bassin_6", + "Cyprus_bassin_7", + "Cyprus_bassin_8", + "Cyprus_bassin_9", + "Czech_Republic_bassin_10", + "Czech_Republic_bassin_11", + "Czech_Republic_bassin_12", + "Czech_Republic", + "Czech_Republic_bassin_5", + "Czech_Republic_bassin_6", + "Czech_Republic_bassin_7", + "Czech_Republic_bassin_8", + "Czech_Republic_bassin_9", + "Democratic_Republic of the Congo_bassin_10", + "Democratic_Republic of the Congo_bassin_11", + "Democratic_Republic of the Congo_bassin_12", + "Democratic_Republic of the Congo", + "Democratic_Republic of the Congo_bassin_5", + "Democratic_Republic of the Congo_bassin_6", + "Democratic_Republic of the Congo_bassin_7", + "Democratic_Republic of the Congo_bassin_8", + "Democratic_Republic of the Congo_bassin_9", + "Dem_Peoples Rep of Korea_bassin_10", + "Dem_Peoples Rep of Korea_bassin_11", + "Dem_Peoples Rep of Korea_bassin_12", + "Dem_Peoples Rep of Korea", + "Dem_Peoples Rep of Korea_bassin_5", + "Dem_Peoples Rep of Korea_bassin_6", + "Dem_Peoples Rep of Korea_bassin_7", + "Dem_Peoples Rep of Korea_bassin_8", + "Dem_Peoples Rep of Korea_bassin_9", + "Denmark_bassin_10", + "Denmark_bassin_11", + "Denmark_bassin_12", + "Denmark", + "Denmark_bassin_5", + "Denmark_bassin_6", + "Denmark_bassin_7", + "Denmark_bassin_8", + "Denmark_bassin_9", + "Djibouti_bassin_10", + "Djibouti_bassin_11", + "Djibouti_bassin_12", + "Djibouti", + "Djibouti_bassin_5", + "Djibouti_bassin_6", + "Djibouti_bassin_7", + "Djibouti_bassin_8", + "Djibouti_bassin_9", + "Dominican_Republic_bassin_10", + "Dominican_Republic_bassin_11", + "Dominican_Republic_bassin_12", + "Dominican_Republic", + "Dominican_Republic_bassin_5", + "Dominican_Republic_bassin_6", + "Dominican_Republic_bassin_7", + "Dominican_Republic_bassin_8", + "Dominican_Republic_bassin_9", + "Dominica_bassin_10", + "Dominica_bassin_11", + "Dominica_bassin_12", + "Dominica", + "Dominica_bassin_5", + "Dominica_bassin_6", + "Dominica_bassin_7", + "Dominica_bassin_8", + "Dominica_bassin_9", + "Ecuador_bassin_10", + "Ecuador_bassin_11", + "Ecuador_bassin_12", + "Ecuador", + "Ecuador_bassin_5", + "Ecuador_bassin_6", + "Ecuador_bassin_7", + "Ecuador_bassin_8", + "Ecuador_bassin_9", + "Egypt_bassin_10", + "Egypt_bassin_11", + "Egypt_bassin_12", + "Egypt", + "Egypt_bassin_5", + "Egypt_bassin_6", + "Egypt_bassin_7", + "Egypt_bassin_8", + "Egypt_bassin_9", + "El_Salvador_bassin_10", + "El_Salvador_bassin_11", + "El_Salvador_bassin_12", + "El_Salvador", + "El_Salvador_bassin_5", + "El_Salvador_bassin_6", + "El_Salvador_bassin_7", + "El_Salvador_bassin_8", + "El_Salvador_bassin_9", + "Equatorial_Guinea_bassin_10", + "Equatorial_Guinea_bassin_11", + "Equatorial_Guinea_bassin_12", + "Equatorial_Guinea", + "Equatorial_Guinea_bassin_5", + "Equatorial_Guinea_bassin_6", + "Equatorial_Guinea_bassin_7", + "Equatorial_Guinea_bassin_8", + "Equatorial_Guinea_bassin_9", + "Eritrea_bassin_10", + "Eritrea_bassin_11", + "Eritrea_bassin_12", + "Eritrea", + "Eritrea_bassin_5", + "Eritrea_bassin_6", + "Eritrea_bassin_7", + "Eritrea_bassin_8", + "Eritrea_bassin_9", + "Estonia_bassin_10", + "Estonia_bassin_11", + "Estonia_bassin_12", + "Estonia", + "Estonia_bassin_5", + "Estonia_bassin_6", + "Estonia_bassin_7", + "Estonia_bassin_8", + "Estonia_bassin_9", + "Ethiopia_bassin_10", + "Ethiopia_bassin_11", + "Ethiopia_bassin_12", + "Ethiopia", + "Ethiopia_bassin_5", + "Ethiopia_bassin_6", + "Ethiopia_bassin_7", + "Ethiopia_bassin_8", + "Ethiopia_bassin_9", + "Europa_Island_bassin_10", + "Europa_Island_bassin_11", + "Europa_Island_bassin_12", + "Europa_Island", + "Europa_Island_bassin_5", + "Europa_Island_bassin_6", + "Europa_Island_bassin_7", + "Europa_Island_bassin_8", + "Europa_Island_bassin_9", + "Faroe_Islands_bassin_10", + "Faroe_Islands_bassin_11", + "Faroe_Islands_bassin_12", + "Faroe_Islands", + "Faroe_Islands_bassin_5", + "Faroe_Islands_bassin_6", + "Faroe_Islands_bassin_7", + "Faroe_Islands_bassin_8", + "Faroe_Islands_bassin_9", + "Fiji_bassin_10", + "Fiji_bassin_11", + "Fiji_bassin_12", + "Fiji", + "Fiji_bassin_5", + "Fiji_bassin_6", + "Fiji_bassin_7", + "Fiji_bassin_8", + "Fiji_bassin_9", + "Finland_bassin_10", + "Finland_bassin_11", + "Finland_bassin_12", + "Finland", + "Finland_bassin_5", + "Finland_bassin_6", + "Finland_bassin_7", + "Finland_bassin_8", + "Finland_bassin_9", + "France_bassin_10", + "France_bassin_11", + "France_bassin_12", + "France", + "France_bassin_5", + "France_bassin_6", + "France_bassin_7", + "France_bassin_8", + "France_bassin_9", + "French_Guiana_bassin_10", + "French_Guiana_bassin_11", + "French_Guiana_bassin_12", + "French_Guiana", + "French_Guiana_bassin_5", + "French_Guiana_bassin_6", + "French_Guiana_bassin_7", + "French_Guiana_bassin_8", + "French_Guiana_bassin_9", + "French_Polynesia_bassin_10", + "French_Polynesia_bassin_11", + "French_Polynesia_bassin_12", + "French_Polynesia", + "French_Polynesia_bassin_5", + "French_Polynesia_bassin_6", + "French_Polynesia_bassin_7", + "French_Polynesia_bassin_8", + "French_Polynesia_bassin_9", + "French_Southern and Antarctic Territories_bassin_10", + "French_Southern and Antarctic Territories_bassin_11", + "French_Southern and Antarctic Territories_bassin_12", + "French_Southern and Antarctic Territories", + "French_Southern and Antarctic Territories_bassin_5", + "French_Southern and Antarctic Territories_bassin_6", + "French_Southern and Antarctic Territories_bassin_7", + "French_Southern and Antarctic Territories_bassin_8", + "French_Southern and Antarctic Territories_bassin_9", + "Gabon_bassin_10", + "Gabon_bassin_11", + "Gabon_bassin_12", + "Gabon", + "Gabon_bassin_5", + "Gabon_bassin_6", + "Gabon_bassin_7", + "Gabon_bassin_8", + "Gabon_bassin_9", + "Gambia_bassin_10", + "Gambia_bassin_11", + "Gambia_bassin_12", + "Gambia", + "Gambia_bassin_5", + "Gambia_bassin_6", + "Gambia_bassin_7", + "Gambia_bassin_8", + "Gambia_bassin_9", + "Gaza_Strip_bassin_10", + "Gaza_Strip_bassin_11", + "Gaza_Strip_bassin_12", + "Gaza_Strip", + "Gaza_Strip_bassin_5", + "Gaza_Strip_bassin_6", + "Gaza_Strip_bassin_7", + "Gaza_Strip_bassin_8", + "Gaza_Strip_bassin_9", + "Georgia_bassin_10", + "Georgia_bassin_11", + "Georgia_bassin_12", + "Georgia", + "Georgia_bassin_5", + "Georgia_bassin_6", + "Georgia_bassin_7", + "Georgia_bassin_8", + "Georgia_bassin_9", + "Germany_bassin_10", + "Germany_bassin_11", + "Germany_bassin_12", + "Germany", + "Germany_bassin_5", + "Germany_bassin_6", + "Germany_bassin_7", + "Germany_bassin_8", + "Germany_bassin_9", + "Ghana_bassin_10", + "Ghana_bassin_11", + "Ghana_bassin_12", + "Ghana", + "Ghana_bassin_5", + "Ghana_bassin_6", + "Ghana_bassin_8", + "Ghana_bassin_9", + "Gibraltar_bassin_10", + "Gibraltar_bassin_11", + "Gibraltar_bassin_12", + "Gibraltar", + "Gibraltar_bassin_5", + "Gibraltar_bassin_6", + "Gibraltar_bassin_7", + "Gibraltar_bassin_8", + "Gibraltar_bassin_9", + "Glorioso_Island_bassin_10", + "Glorioso_Island_bassin_11", + "Glorioso_Island_bassin_12", + "Glorioso_Island", + "Glorioso_Island_bassin_5", + "Glorioso_Island_bassin_6", + "Glorioso_Island_bassin_7", + "Glorioso_Island_bassin_8", + "Glorioso_Island_bassin_9", + "Greece_bassin_10", + "Greece_bassin_11", + "Greece_bassin_12", + "Greece", + "Greece_bassin_5", + "Greece_bassin_6", + "Greece_bassin_7", + "Greece_bassin_8", + "Greece_bassin_9", + "Greenland_bassin_10", + "Greenland_bassin_11", + "Greenland_bassin_12", + "Greenland", + "Greenland_bassin_5", + "Greenland_bassin_6", + "Greenland_bassin_7", + "Greenland_bassin_8", + "Greenland_bassin_9", + "Grenada_bassin_10", + "Grenada_bassin_11", + "Grenada_bassin_12", + "Grenada", + "Grenada_bassin_5", + "Grenada_bassin_6", + "Grenada_bassin_7", + "Grenada_bassin_8", + "Grenada_bassin_9", + "Guadeloupe_bassin_10", + "Guadeloupe_bassin_11", + "Guadeloupe_bassin_12", + "Guadeloupe", + "Guadeloupe_bassin_5", + "Guadeloupe_bassin_6", + "Guadeloupe_bassin_7", + "Guadeloupe_bassin_8", + "Guadeloupe_bassin_9", + "Guam_bassin_10", + "Guam_bassin_11", + "Guam_bassin_12", + "Guam", + "Guam_bassin_5", + "Guam_bassin_6", + "Guam_bassin_7", + "Guam_bassin_8", + "Guam_bassin_9", + "Halaib_triangle_bassin_10", + "Halaib_triangle_bassin_11", + "Halaib_triangle_bassin_12", + "Halaib_triangle", + "Halaib_triangle_bassin_5", + "Halaib_triangle_bassin_6", + "Halaib_triangle_bassin_7", + "Halaib_triangle_bassin_8", + "Halaib_triangle_bassin_9", + "Heard_Island and McDonald Islands_bassin_12", + "Holy_See_bassin_10", + "Holy_See_bassin_11", + "Holy_See_bassin_12", + "Holy_See", + "Holy_See_bassin_5", + "Holy_See_bassin_6", + "Holy_See_bassin_7", + "Holy_See_bassin_8", + "Holy_See_bassin_9", + "Honduras_bassin_10", + "Honduras_bassin_11", + "Honduras_bassin_12", + "Honduras", + "Honduras_bassin_5", + "Honduras_bassin_6", + "Honduras_bassin_7", + "Honduras_bassin_8", + "Honduras_bassin_9", + "Hong_Kong_bassin_10", + "Hong_Kong_bassin_11", + "Hong_Kong_bassin_12", + "Hong_Kong", + "Hong_Kong_bassin_5", + "Hong_Kong_bassin_6", + "Hong_Kong_bassin_7", + "Hong_Kong_bassin_8", + "Hong_Kong_bassin_9", + "Howland_Island_bassin_10", + "Howland_Island_bassin_11", + "Howland_Island_bassin_12", + "Howland_Island", + "Howland_Island_bassin_5", + "Howland_Island_bassin_6", + "Howland_Island_bassin_7", + "Howland_Island_bassin_8", + "Howland_Island_bassin_9", + "Hungary_bassin_10", + "Hungary_bassin_11", + "Hungary_bassin_12", + "Hungary", + "Hungary_bassin_5", + "Hungary_bassin_6", + "Hungary_bassin_7", + "Hungary_bassin_8", + "Hungary_bassin_9", + "Iceland_bassin_10", + "Iceland_bassin_11", + "Iceland_bassin_12", + "Iceland", + "Iceland_bassin_5", + "Iceland_bassin_6", + "Iceland_bassin_7", + "Iceland_bassin_8", + "Iceland_bassin_9", + "Ilemi_triangle_bassin_10", + "Ilemi_triangle_bassin_11", + "Ilemi_triangle_bassin_12", + "Ilemi_triangle", + "Ilemi_triangle_bassin_5", + "Ilemi_triangle_bassin_6", + "Ilemi_triangle_bassin_7", + "Ilemi_triangle_bassin_8", + "Ilemi_triangle_bassin_9", + "India_bassin_10", + "India_bassin_11", + "India_bassin_12", + "India", + "India_bassin_5", + "India_bassin_6", + "India_bassin_7", + "India_bassin_8", + "India_bassin_9", + "Indonesia_bassin_10", + "Indonesia_bassin_11", + "Indonesia_bassin_12", + "Indonesia", + "Indonesia_bassin_5", + "Indonesia_bassin_6", + "Indonesia_bassin_7", + "Indonesia_bassin_8", + "Indonesia_bassin_9", + "Iraq_bassin_10", + "Iraq_bassin_11", + "Iraq_bassin_12", + "Iraq", + "Iraq_bassin_5", + "Iraq_bassin_6", + "Iraq_bassin_7", + "Iraq_bassin_8", + "Iraq_bassin_9", + "Ireland_bassin_10", + "Ireland_bassin_11", + "Ireland_bassin_12", + "Ireland", + "Ireland_bassin_5", + "Ireland_bassin_6", + "Ireland_bassin_7", + "Ireland_bassin_8", + "Ireland_bassin_9", + "Isle_of Man_bassin_10", + "Isle_of Man_bassin_11", + "Isle_of Man_bassin_12", + "Isle_of Man", + "Isle_of Man_bassin_5", + "Isle_of Man_bassin_6", + "Isle_of Man_bassin_7", + "Isle_of Man_bassin_8", + "Isle_of Man_bassin_9", + "Israel_bassin_10", + "Israel_bassin_11", + "Israel_bassin_12", + "Israel", + "Israel_bassin_5", + "Israel_bassin_6", + "Israel_bassin_7", + "Israel_bassin_8", + "Israel_bassin_9", + "Italy_bassin_10", + "Italy_bassin_11", + "Italy_bassin_12", + "Italy", + "Italy_bassin_5", + "Italy_bassin_6", + "Italy_bassin_7", + "Italy_bassin_8", + "Italy_bassin_9", + "Jamaica_bassin_10", + "Jamaica_bassin_11", + "Jamaica_bassin_12", + "Jamaica", + "Jamaica_bassin_5", + "Jamaica_bassin_6", + "Jamaica_bassin_7", + "Jamaica_bassin_8", + "Jamaica_bassin_9", + "Jammu_and Kashmir_bassin_10", + "Jammu_and Kashmir_bassin_11", + "Jammu_and Kashmir_bassin_12", + "Jammu_and Kashmir", + "Jammu_and Kashmir_bassin_5", + "Jammu_and Kashmir_bassin_6", + "Jammu_and Kashmir_bassin_7", + "Jammu_and Kashmir_bassin_8", + "Jammu_and Kashmir_bassin_9", + "Japan_bassin_10", + "Japan_bassin_11", + "Japan_bassin_12", + "Japan", + "Japan_bassin_5", + "Japan_bassin_6", + "Japan_bassin_7", + "Japan_bassin_8", + "Japan_bassin_9", + "Jarvis_Island_bassin_10", + "Jarvis_Island_bassin_11", + "Jarvis_Island_bassin_12", + "Jarvis_Island", + "Jarvis_Island_bassin_5", + "Jarvis_Island_bassin_6", + "Jarvis_Island_bassin_7", + "Jarvis_Island_bassin_8", + "Jarvis_Island_bassin_9", + "Jersey_bassin_10", + "Jersey_bassin_11", + "Jersey_bassin_12", + "Jersey", + "Jersey_bassin_5", + "Jersey_bassin_6", + "Jersey_bassin_7", + "Jersey_bassin_8", + "Jersey_bassin_9", + "Johnston_Atoll_bassin_10", + "Johnston_Atoll_bassin_11", + "Johnston_Atoll_bassin_12", + "Johnston_Atoll", + "Johnston_Atoll_bassin_5", + "Johnston_Atoll_bassin_6", + "Johnston_Atoll_bassin_7", + "Johnston_Atoll_bassin_8", + "Johnston_Atoll_bassin_9", + "Jordan_bassin_10", + "Jordan_bassin_11", + "Jordan_bassin_12", + "Jordan", + "Jordan_bassin_5", + "Jordan_bassin_6", + "Jordan_bassin_7", + "Jordan_bassin_8", + "Jordan_bassin_9", + "Juan_de Nova Island_bassin_10", + "Juan_de Nova Island_bassin_11", + "Juan_de Nova Island_bassin_12", + "Juan_de Nova Island", + "Juan_de Nova Island_bassin_5", + "Juan_de Nova Island_bassin_6", + "Juan_de Nova Island_bassin_7", + "Juan_de Nova Island_bassin_8", + "Juan_de Nova Island_bassin_9", + "Kazakhstan_bassin_10", + "Kazakhstan_bassin_11", + "Kazakhstan_bassin_12", + "Kazakhstan", + "Kazakhstan_bassin_5", + "Kazakhstan_bassin_6", + "Kazakhstan_bassin_7", + "Kazakhstan_bassin_8", + "Kazakhstan_bassin_9", + "Kenya_bassin_10", + "Kenya_bassin_11", + "Kenya_bassin_12", + "Kenya", + "Kenya_bassin_5", + "Kenya_bassin_6", + "Kenya_bassin_7", + "Kenya_bassin_8", + "Kenya_bassin_9", + "Kingman_Reef_bassin_10", + "Kingman_Reef_bassin_11", + "Kingman_Reef_bassin_12", + "Kingman_Reef", + "Kingman_Reef_bassin_5", + "Kingman_Reef_bassin_6", + "Kingman_Reef_bassin_7", + "Kingman_Reef_bassin_8", + "Kingman_Reef_bassin_9", + "Kiribati_bassin_10", + "Kiribati_bassin_11", + "Kiribati_bassin_12", + "Kiribati", + "Kiribati_bassin_5", + "Kiribati_bassin_6", + "Kiribati_bassin_7", + "Kiribati_bassin_8", + "Kiribati_bassin_9", + "Kuril_islands_bassin_10", + "Kuril_islands_bassin_11", + "Kuril_islands_bassin_12", + "Kuril_islands", + "Kuril_islands_bassin_5", + "Kuril_islands_bassin_6", + "Kuril_islands_bassin_7", + "Kuril_islands_bassin_8", + "Kuril_islands_bassin_9", + "Kuwait_bassin_10", + "Kuwait_bassin_11", + "Kuwait_bassin_12", + "Kuwait", + "Kuwait_bassin_5", + "Kuwait_bassin_6", + "Kuwait_bassin_7", + "Kuwait_bassin_8", + "Kuwait_bassin_9", + "Kyrgyzstan_bassin_10", + "Kyrgyzstan_bassin_11", + "Kyrgyzstan_bassin_12", + "Kyrgyzstan", + "Kyrgyzstan_bassin_5", + "Kyrgyzstan_bassin_6", + "Kyrgyzstan_bassin_7", + "Kyrgyzstan_bassin_8", + "Kyrgyzstan_bassin_9", + "Lao_Peoples Democratic Republic_bassin_10", + "Lao_Peoples Democratic Republic_bassin_11", + "Lao_Peoples Democratic Republic_bassin_12", + "Lao_Peoples Democratic Republic", + "Lao_Peoples Democratic Republic_bassin_5", + "Lao_Peoples Democratic Republic_bassin_6", + "Lao_Peoples Democratic Republic_bassin_7", + "Lao_Peoples Democratic Republic_bassin_8", + "Lao_Peoples Democratic Republic_bassin_9", + "Latvia_bassin_10", + "Latvia_bassin_11", + "Latvia_bassin_12", + "Latvia", + "Latvia_bassin_5", + "Latvia_bassin_6", + "Latvia_bassin_7", + "Latvia_bassin_8", + "Latvia_bassin_9", + "Lebanon_bassin_10", + "Lebanon_bassin_11", + "Lebanon_bassin_12", + "Lebanon", + "Lebanon_bassin_5", + "Lebanon_bassin_6", + "Lebanon_bassin_7", + "Lebanon_bassin_8", + "Lebanon_bassin_9", + "Lesotho_bassin_10", + "Lesotho_bassin_11", + "Lesotho_bassin_12", + "Lesotho", + "Lesotho_bassin_5", + "Lesotho_bassin_6", + "Lesotho_bassin_7", + "Lesotho_bassin_8", + "Lesotho_bassin_9", + "Liberia_bassin_10", + "Liberia_bassin_11", + "Liberia_bassin_12", + "Liberia", + "Liberia_bassin_5", + "Liberia_bassin_6", + "Liberia_bassin_7", + "Liberia_bassin_8", + "Liberia_bassin_9", + "Libya_bassin_10", + "Libya_bassin_11", + "Libya_bassin_12", + "Libya", + "Libya_bassin_5", + "Libya_bassin_6", + "Libya_bassin_7", + "Libya_bassin_8", + "Libya_bassin_9", + "Liechtenstein_bassin_10", + "Liechtenstein_bassin_11", + "Liechtenstein_bassin_12", + "Liechtenstein", + "Liechtenstein_bassin_5", + "Liechtenstein_bassin_6", + "Liechtenstein_bassin_7", + "Liechtenstein_bassin_8", + "Liechtenstein_bassin_9", + "Lithuania_bassin_10", + "Lithuania_bassin_11", + "Lithuania_bassin_12", + "Lithuania", + "Lithuania_bassin_5", + "Lithuania_bassin_6", + "Lithuania_bassin_7", + "Lithuania_bassin_8", + "Lithuania_bassin_9", + "Luxembourg_bassin_10", + "Luxembourg_bassin_11", + "Luxembourg_bassin_12", + "Luxembourg", + "Luxembourg_bassin_5", + "Luxembourg_bassin_6", + "Luxembourg_bassin_7", + "Luxembourg_bassin_8", + "Luxembourg_bassin_9", + "Macau_bassin_10", + "Macau_bassin_11", + "Macau_bassin_12", + "Macau", + "Macau_bassin_5", + "Macau_bassin_6", + "Macau_bassin_7", + "Macau_bassin_8", + "Macau_bassin_9", + "Madagascar_bassin_10", + "Madagascar_bassin_11", + "Madagascar_bassin_12", + "Madagascar", + "Madagascar_bassin_5", + "Madagascar_bassin_6", + "Madagascar_bassin_7", + "Madagascar_bassin_8", + "Madagascar_bassin_9", + "Madeira_Islands_bassin_10", + "Madeira_Islands_bassin_11", + "Madeira_Islands_bassin_12", + "Madeira_Islands", + "Madeira_Islands_bassin_5", + "Madeira_Islands_bassin_6", + "Madeira_Islands_bassin_7", + "Madeira_Islands_bassin_8", + "Madeira_Islands_bassin_9", + "Malawi_bassin_10", + "Malawi_bassin_11", + "Malawi_bassin_12", + "Malawi", + "Malawi_bassin_5", + "Malawi_bassin_6", + "Malawi_bassin_7", + "Malawi_bassin_8", + "Malawi_bassin_9", + "Malaysia_bassin_10", + "Malaysia_bassin_11", + "Malaysia_bassin_12", + "Malaysia", + "Malaysia_bassin_5", + "Malaysia_bassin_6", + "Malaysia_bassin_7", + "Malaysia_bassin_8", + "Malaysia_bassin_9", + "Maldives_bassin_10", + "Maldives_bassin_11", + "Maldives_bassin_12", + "Maldives", + "Maldives_bassin_5", + "Maldives_bassin_6", + "Maldives_bassin_7", + "Maldives_bassin_8", + "Maldives_bassin_9", + "Matan_al-Sarra_bassin_10", + "Matan_al-Sarra_bassin_11", + "Matan_al-Sarra_bassin_12", + "Matan_al-Sarra", + "Matan_al-Sarra_bassin_5", + "Matan_al-Sarra_bassin_6", + "Matan_al-Sarra_bassin_7", + "Matan_al-Sarra_bassin_8", + "Matan_al-Sarra_bassin_9", + "Montenegro_bassin_10", + "Montenegro_bassin_11", + "Montenegro_bassin_12", + "Montenegro", + "Montenegro_bassin_5", + "Montenegro_bassin_6", + "Montenegro_bassin_7", + "Montenegro_bassin_8", + "Montenegro_bassin_9", + "Qatar_bassin_10", + "Qatar_bassin_11", + "Qatar_bassin_12", + "Republic_of Korea_bassin_10", + "Republic_of Korea_bassin_11", + "Republic_of Korea_bassin_12", + "Republic_of Korea", + "Republic_of Korea_bassin_5", + "Republic_of Korea_bassin_6", + "Republic_of Korea_bassin_7", + "Republic_of Korea_bassin_8", + "Republic_of Korea_bassin_9", + "Romania_bassin_10", + "Romania_bassin_11", + "Romania_bassin_12", + "Romania", + "Romania_bassin_5", + "Romania_bassin_6", + "Romania_bassin_7", + "Romania_bassin_8", + "Romania_bassin_9", + "Russian_Federation_bassin_10", + "Russian_Federation_bassin_11", + "Russian_Federation_bassin_12", + "Russian_Federation", + "Russian_Federation_bassin_5", + "Russian_Federation_bassin_6", + "Russian_Federation_bassin_7", + "Russian_Federation_bassin_8", + "Russian_Federation_bassin_9", + "Rwanda_bassin_10", + "Rwanda_bassin_11", + "Rwanda_bassin_12", + "Rwanda", + "Rwanda_bassin_5", + "Rwanda_bassin_6", + "Rwanda_bassin_7", + "Rwanda_bassin_8", + "Rwanda_bassin_9", + "Saint_Helena_bassin_10", + "Saint_Helena_bassin_11", + "Saint_Helena_bassin_12", + "Saint_Helena", + "Saint_Helena_bassin_5", + "Saint_Helena_bassin_6", + "Saint_Helena_bassin_7", + "Saint_Helena_bassin_8", + "Saint_Helena_bassin_9", + "Saint_Kitts and Nevis_bassin_10", + "Saint_Kitts and Nevis_bassin_11", + "Saint_Kitts and Nevis_bassin_12", + "Saint_Kitts and Nevis", + "Saint_Kitts and Nevis_bassin_5", + "Saint_Kitts and Nevis_bassin_6", + "Saint_Kitts and Nevis_bassin_7", + "Saint_Kitts and Nevis_bassin_8", + "Saint_Kitts and Nevis_bassin_9", + "Saint_Lucia_bassin_10", + "Saint_Lucia_bassin_11", + "Saint_Lucia_bassin_12", + "Saint_Lucia", + "Saint_Lucia_bassin_5", + "Saint_Lucia_bassin_6", + "Saint_Lucia_bassin_7", + "Saint_Lucia_bassin_8", + "Saint_Lucia_bassin_9", + "Saint_Pierre et Miquelon_bassin_10", + "Saint_Pierre et Miquelon_bassin_11", + "Saint_Pierre et Miquelon_bassin_12", + "Saint_Pierre et Miquelon", + "Saint_Pierre et Miquelon_bassin_5", + "Saint_Pierre et Miquelon_bassin_6", + "Saint_Pierre et Miquelon_bassin_7", + "Saint_Pierre et Miquelon_bassin_8", + "Saint_Pierre et Miquelon_bassin_9", + "Saint_Vincent and the Grenadines_bassin_10", + "Saint_Vincent and the Grenadines_bassin_11", + "Saint_Vincent and the Grenadines_bassin_12", + "Saint_Vincent and the Grenadines", + "Saint_Vincent and the Grenadines_bassin_5", + "Saint_Vincent and the Grenadines_bassin_6", + "Saint_Vincent and the Grenadines_bassin_7", + "Saint_Vincent and the Grenadines_bassin_8", + "Saint_Vincent and the Grenadines_bassin_9", + "Samoa_bassin_10", + "Samoa_bassin_11", + "Samoa_bassin_12", + "Samoa", + "Samoa_bassin_5", + "Samoa_bassin_6", + "Samoa_bassin_7", + "Samoa_bassin_8", + "Samoa_bassin_9", + "San_Marino_bassin_10", + "San_Marino_bassin_11", + "San_Marino_bassin_12", + "San_Marino", + "San_Marino_bassin_5", + "San_Marino_bassin_6", + "San_Marino_bassin_7", + "San_Marino_bassin_8", + "San_Marino_bassin_9", + "Sao_Tome and Principe_bassin_10", + "Sao_Tome and Principe_bassin_11", + "Sao_Tome and Principe_bassin_12", + "Sao_Tome and Principe", + "Sao_Tome and Principe_bassin_5", + "Sao_Tome and Principe_bassin_6", + "Sao_Tome and Principe_bassin_7", + "Sao_Tome and Principe_bassin_8", + "Sao_Tome and Principe_bassin_9", + "Saudi_Arabia_bassin_10", + "Saudi_Arabia_bassin_11", + "Saudi_Arabia_bassin_12", + "Saudi_Arabia", + "Saudi_Arabia_bassin_5", + "Saudi_Arabia_bassin_6", + "Saudi_Arabia_bassin_7", + "Saudi_Arabia_bassin_8", + "Saudi_Arabia_bassin_9", + "Scarborough_Reef_bassin_10", + "Scarborough_Reef_bassin_11", + "Scarborough_Reef_bassin_12", + "Scarborough_Reef", + "Scarborough_Reef_bassin_5", + "Scarborough_Reef_bassin_6", + "Scarborough_Reef_bassin_7", + "Scarborough_Reef_bassin_8", + "Scarborough_Reef_bassin_9", + "Senegal_bassin_10", + "Senegal_bassin_11", + "Senegal_bassin_12", + "Senegal", + "Senegal_bassin_5", + "Senegal_bassin_6", + "Senegal_bassin_7", + "Senegal_bassin_8", + "Senegal_bassin_9", + "Senkaku_Islands_bassin_10", + "Senkaku_Islands_bassin_11", + "Senkaku_Islands_bassin_12", + "Senkaku_Islands", + "Senkaku_Islands_bassin_5", + "Senkaku_Islands_bassin_6", + "Senkaku_Islands_bassin_7", + "Senkaku_Islands_bassin_8", + "Senkaku_Islands_bassin_9", + "Serbia_bassin_10", + "Serbia_bassin_11", + "Serbia_bassin_12", + "Serbia", + "Serbia_bassin_5", + "Serbia_bassin_6", + "Serbia_bassin_7", + "Serbia_bassin_8", + "Serbia_bassin_9", + "Seychelles_bassin_10", + "Seychelles_bassin_11", + "Seychelles_bassin_12", + "Seychelles", + "Seychelles_bassin_5", + "Seychelles_bassin_6", + "Seychelles_bassin_7", + "Seychelles_bassin_8", + "Seychelles_bassin_9", + "Sierra_Leone_bassin_10", + "Sierra_Leone_bassin_11", + "Sierra_Leone_bassin_12", + "Sierra_Leone", + "Sierra_Leone_bassin_5", + "Sierra_Leone_bassin_6", + "Sierra_Leone_bassin_7", + "Sierra_Leone_bassin_8", + "Sierra_Leone_bassin_9", + "Singapore_bassin_10", + "Singapore_bassin_11", + "Singapore_bassin_12", + "Singapore", + "Singapore_bassin_5", + "Singapore_bassin_6", + "Singapore_bassin_7", + "Singapore_bassin_8", + "Singapore_bassin_9", + "Slovakia_bassin_10", + "Slovakia_bassin_11", + "Slovakia_bassin_12", + "Slovakia", + "Slovakia_bassin_5", + "Slovakia_bassin_6", + "Slovakia_bassin_7", + "Slovakia_bassin_8", + "Slovakia_bassin_9", + "Slovenia_bassin_10", + "Slovenia_bassin_11", + "Slovenia_bassin_12", + "Slovenia", + "Slovenia_bassin_5", + "Slovenia_bassin_6", + "Slovenia_bassin_7", + "Slovenia_bassin_8", + "Slovenia_bassin_9", + "Solomon_Islands_bassin_10", + "Solomon_Islands_bassin_11", + "Solomon_Islands_bassin_12", + "Solomon_Islands", + "Solomon_Islands_bassin_5", + "Solomon_Islands_bassin_6", + "Solomon_Islands_bassin_7", + "Solomon_Islands_bassin_8", + "Solomon_Islands_bassin_9", + "Somalia_bassin_10", + "Somalia_bassin_11", + "Somalia_bassin_12", + "Somalia", + "Somalia_bassin_5", + "Somalia_bassin_6", + "Somalia_bassin_7", + "Somalia_bassin_8", + "Somalia_bassin_9", + "South_Africa_bassin_10", + "South_Africa_bassin_11", + "South_Africa_bassin_12", + "South_Africa", + "South_Africa_bassin_5", + "South_Africa_bassin_6", + "South_Africa_bassin_7", + "South_Africa_bassin_8", + "South_Africa_bassin_9", + "South_Georgia and the South Sandwich Islands_bassin_10", + "South_Georgia and the South Sandwich Islands_bassin_11", + "South_Georgia and the South Sandwich Islands_bassin_12", + "South_Georgia and the South Sandwich Islands", + "South_Georgia and the South Sandwich Islands_bassin_5", + "South_Georgia and the South Sandwich Islands_bassin_6", + "South_Georgia and the South Sandwich Islands_bassin_7", + "South_Georgia and the South Sandwich Islands_bassin_8", + "South_Georgia and the South Sandwich Islands_bassin_9", + "South_Sudan_bassin_10", + "South_Sudan_bassin_11", + "South_Sudan_bassin_12", + "South_Sudan", + "South_Sudan_bassin_5", + "South_Sudan_bassin_6", + "South_Sudan_bassin_7", + "South_Sudan_bassin_8", + "South_Sudan_bassin_9", + "Spain_bassin_10", + "Spain_bassin_11", + "Spain_bassin_12", + "Spain", + "Spain_bassin_5", + "Spain_bassin_6", + "Spain_bassin_7", + "Spain_bassin_8", + "Spain_bassin_9", + "Spratly_Islands_bassin_10", + "Spratly_Islands_bassin_11", + "Spratly_Islands_bassin_12", + "Spratly_Islands", + "Spratly_Islands_bassin_5", + "Spratly_Islands_bassin_6", + "Spratly_Islands_bassin_7", + "Spratly_Islands_bassin_8", + "Spratly_Islands_bassin_9", + "Sri_Lanka_bassin_10", + "Sri_Lanka_bassin_11", + "Sri_Lanka_bassin_12", + "Sri_Lanka", + "Sri_Lanka_bassin_5", + "Sri_Lanka_bassin_6", + "Sri_Lanka_bassin_7", + "Sri_Lanka_bassin_8", + "Sri_Lanka_bassin_9", + "Suriname_bassin_10", + "Suriname_bassin_11", + "Suriname_bassin_12", + "Suriname", + "Suriname_bassin_5", + "Suriname_bassin_6", + "Suriname_bassin_7", + "Suriname_bassin_8", + "Suriname_bassin_9", + "Svalbard_and Jan Mayen Islands_bassin_10", + "Svalbard_and Jan Mayen Islands_bassin_11", + "Svalbard_and Jan Mayen Islands_bassin_12", + "Svalbard_and Jan Mayen Islands", + "Svalbard_and Jan Mayen Islands_bassin_5", + "Svalbard_and Jan Mayen Islands_bassin_6", + "Svalbard_and Jan Mayen Islands_bassin_7", + "Svalbard_and Jan Mayen Islands_bassin_8", + "Svalbard_and Jan Mayen Islands_bassin_9", + "Swaziland_bassin_10", + "Swaziland_bassin_11", + "Swaziland_bassin_12", + "Swaziland", + "Swaziland_bassin_5", + "Swaziland_bassin_6", + "Swaziland_bassin_7", + "Swaziland_bassin_8", + "Swaziland_bassin_9", + "Sweden_bassin_10", + "Sweden_bassin_11", + "Sweden_bassin_12", + "Sweden", + "Sweden_bassin_5", + "Sweden_bassin_6", + "Sweden_bassin_7", + "Sweden_bassin_8", + "Sweden_bassin_9", + "Switzerland_bassin_10", + "Switzerland_bassin_11", + "Switzerland_bassin_12", + "Switzerland", + "Switzerland_bassin_5", + "Switzerland_bassin_6", + "Switzerland_bassin_7", + "Switzerland_bassin_8", + "Switzerland_bassin_9", + "Syrian_Arab Republic_bassin_10", + "Syrian_Arab Republic_bassin_11", + "Syrian_Arab Republic_bassin_12", + "Syrian_Arab Republic", + "Syrian_Arab Republic_bassin_5", + "Syrian_Arab Republic_bassin_6", + "Syrian_Arab Republic_bassin_7", + "Syrian_Arab Republic_bassin_8", + "Syrian_Arab Republic_bassin_9", + "Taiwan_bassin_10", + "Taiwan_bassin_11", + "Taiwan_bassin_12", + "Taiwan", + "Taiwan_bassin_5", + "Taiwan_bassin_6", + "Taiwan_bassin_7", + "Taiwan_bassin_8", + "Taiwan_bassin_9", + "Tajikistan_bassin_10", + "Tajikistan_bassin_11", + "Tajikistan_bassin_12", + "Tajikistan", + "Tajikistan_bassin_5", + "Tajikistan_bassin_6", + "Tajikistan_bassin_7", + "Tajikistan_bassin_8", + "Tajikistan_bassin_9", + "Thailand_bassin_10", + "Thailand_bassin_11", + "Thailand_bassin_12", + "Thailand", + "Thailand_bassin_5", + "Thailand_bassin_6", + "Thailand_bassin_7", + "Thailand_bassin_8", + "Thailand_bassin_9", + "The_former Yugoslav Republic of Macedonia_bassin_10", + "The_former Yugoslav Republic of Macedonia_bassin_11", + "The_former Yugoslav Republic of Macedonia_bassin_12", + "The_former Yugoslav Republic of Macedonia", + "The_former Yugoslav Republic of Macedonia_bassin_5", + "The_former Yugoslav Republic of Macedonia_bassin_6", + "The_former Yugoslav Republic of Macedonia_bassin_7", + "The_former Yugoslav Republic of Macedonia_bassin_8", + "The_former Yugoslav Republic of Macedonia_bassin_9", + "Timor-Leste_bassin_10", + "Timor-Leste_bassin_11", + "Timor-Leste_bassin_12", + "Timor-Leste", + "Timor-Leste_bassin_5", + "Timor-Leste_bassin_6", + "Timor-Leste_bassin_7", + "Timor-Leste_bassin_8", + "Timor-Leste_bassin_9", + "Togo_bassin_10", + "Togo_bassin_11", + "Togo_bassin_12", + "Togo", + "Togo_bassin_5", + "Togo_bassin_6", + "Togo_bassin_7", + "Togo_bassin_8", + "Togo_bassin_9", + "Tokelau_bassin_10", + "Tokelau_bassin_11", + "Tokelau_bassin_12", + "Tokelau", + "Tokelau_bassin_5", + "Tokelau_bassin_6", + "Tokelau_bassin_7", + "Tokelau_bassin_8", + "Tokelau_bassin_9", + "Tonga_bassin_10", + "Tonga_bassin_11", + "Tonga_bassin_12", + "Tonga", + "Tonga_bassin_5", + "Tonga_bassin_6", + "Tonga_bassin_7", + "Tonga_bassin_8", + "Tonga_bassin_9", + "Trinidad_and Tobago_bassin_10", + "Trinidad_and Tobago_bassin_11", + "Trinidad_and Tobago_bassin_12", + "Trinidad_and Tobago", + "Trinidad_and Tobago_bassin_5", + "Trinidad_and Tobago_bassin_6", + "Trinidad_and Tobago_bassin_7", + "Trinidad_and Tobago_bassin_8", + "Trinidad_and Tobago_bassin_9", + "Tromelin_Island_bassin_10", + "Tromelin_Island_bassin_11", + "Tromelin_Island_bassin_12", + "Tromelin_Island", + "Tromelin_Island_bassin_5", + "Tromelin_Island_bassin_6", + "Tromelin_Island_bassin_7", + "Tromelin_Island_bassin_8", + "Tromelin_Island_bassin_9", + "Tunisia_bassin_10", + "Tunisia_bassin_11", + "Tunisia_bassin_12", + "Tunisia", + "Tunisia_bassin_5", + "Tunisia_bassin_6", + "Tunisia_bassin_7", + "Tunisia_bassin_8", + "Tunisia_bassin_9", + "Turkey_bassin_10", + "Turkey_bassin_11", + "Turkey_bassin_12", + "Turkey", + "Turkey_bassin_5", + "Turkey_bassin_6", + "Turkey_bassin_7", + "Turkey_bassin_8", + "Turkey_bassin_9", + "Turkmenistan_bassin_10", + "Turkmenistan_bassin_11", + "Turkmenistan_bassin_12", + "Turkmenistan", + "Turkmenistan_bassin_5", + "Turkmenistan_bassin_6", + "Turkmenistan_bassin_7", + "Turkmenistan_bassin_8", + "Turkmenistan_bassin_9", + "Turks_and Caicos islands_bassin_10", + "Turks_and Caicos islands_bassin_11", + "Turks_and Caicos islands_bassin_12", + "Turks_and Caicos islands", + "Turks_and Caicos islands_bassin_5", + "Turks_and Caicos islands_bassin_6", + "Turks_and Caicos islands_bassin_7", + "Turks_and Caicos islands_bassin_8", + "Turks_and Caicos islands_bassin_9", + "Tuvalu_bassin_10", + "Tuvalu_bassin_11", + "Tuvalu_bassin_12", + "Tuvalu", + "Tuvalu_bassin_5", + "Tuvalu_bassin_6", + "Tuvalu_bassin_7", + "Tuvalu_bassin_8", + "Tuvalu_bassin_9", + "Uganda_bassin_10", + "Uganda_bassin_11", + "Uganda_bassin_12", + "Uganda", + "Uganda_bassin_5", + "Uganda_bassin_6", + "Uganda_bassin_7", + "Uganda_bassin_8", + "Uganda_bassin_9", + "Ukraine_bassin_10", + "Ukraine_bassin_11", + "Ukraine_bassin_12", + "Ukraine", + "Ukraine_bassin_5", + "Ukraine_bassin_6", + "Ukraine_bassin_7", + "Ukraine_bassin_8", + "Ukraine_bassin_9", + "UK_of Great Britain and Northern Ireland_bassin_10", + "UK_of Great Britain and Northern Ireland_bassin_11", + "UK_of Great Britain and Northern Ireland_bassin_12", + "UK_of Great Britain and Northern Ireland", + "UK_of Great Britain and Northern Ireland_bassin_5", + "UK_of Great Britain and Northern Ireland_bassin_6", + "UK_of Great Britain and Northern Ireland_bassin_7", + "UK_of Great Britain and Northern Ireland_bassin_8", + "UK_of Great Britain and Northern Ireland_bassin_9", + "United_Arab Emirates_bassin_10", + "United_Arab Emirates_bassin_11", + "United_Arab Emirates_bassin_12", + "United_Arab Emirates", + "United_Arab Emirates_bassin_5", + "United_Arab Emirates_bassin_6", + "United_Arab Emirates_bassin_7", + "United_Arab Emirates_bassin_8", + "United_Arab Emirates_bassin_9", + "United_Republic of Tanzania_bassin_10", + "United_Republic of Tanzania_bassin_11", + "United_Republic of Tanzania_bassin_12", + "United_Republic of Tanzania", + "United_Republic of Tanzania_bassin_5", + "United_Republic of Tanzania_bassin_6", + "United_Republic of Tanzania_bassin_7", + "United_Republic of Tanzania_bassin_8", + "United_Republic of Tanzania_bassin_9", + "United_States of America_bassin_10", + "United_States of America_bassin_11", + "United_States of America_bassin_12", + "United_States of America", + "United_States of America_bassin_5", + "United_States of America_bassin_6", + "United_States of America_bassin_7", + "United_States of America_bassin_8", + "United_States of America_bassin_9", + "United_States Virgin Islands_bassin_10", + "United_States Virgin Islands_bassin_11", + "United_States Virgin Islands_bassin_12", + "United_States Virgin Islands", + "United_States Virgin Islands_bassin_5", + "United_States Virgin Islands_bassin_6", + "United_States Virgin Islands_bassin_7", + "United_States Virgin Islands_bassin_8", + "United_States Virgin Islands_bassin_9", + "Uruguay_bassin_10", + "Uruguay_bassin_11", + "Uruguay_bassin_12", + "Uruguay", + "Uruguay_bassin_5", + "Uruguay_bassin_6", + "Uruguay_bassin_7", + "Uruguay_bassin_8", + "Uruguay_bassin_9", + "Uzbekistan_bassin_10", + "Uzbekistan_bassin_11", + "Uzbekistan_bassin_12", + "Uzbekistan", + "Uzbekistan_bassin_5", + "Uzbekistan_bassin_6", + "Uzbekistan_bassin_7", + "Uzbekistan_bassin_8", + "Uzbekistan_bassin_9", + "Vanuatu_bassin_10", + "Vanuatu_bassin_11", + "Vanuatu_bassin_12", + "Vanuatu", + "Vanuatu_bassin_5", + "Vanuatu_bassin_6", + "Vanuatu_bassin_7", + "Vanuatu_bassin_8", + "Vanuatu_bassin_9", + "Venezuela_bassin_10", + "Venezuela_bassin_11", + "Venezuela_bassin_12", + "Venezuela", + "Venezuela_bassin_5", + "Venezuela_bassin_6", + "Venezuela_bassin_7", + "Venezuela_bassin_8", + "Venezuela_bassin_9", + "Viet_Nam_bassin_10", + "Viet_Nam_bassin_11", + "Viet_Nam_bassin_12", + "Viet_Nam", + "Viet_Nam_bassin_5", + "Viet_Nam_bassin_6", + "Viet_Nam_bassin_7", + "Viet_Nam_bassin_8", + "Viet_Nam_bassin_9", + "Wake_Island_bassin_10", + "Wake_Island_bassin_11", + "Wake_Island_bassin_12", + "Wake_Island", + "Wake_Island_bassin_5", + "Wake_Island_bassin_6", + "Wake_Island_bassin_7", + "Wake_Island_bassin_8", + "Wake_Island_bassin_9", + "Wallis_and Futuna_bassin_10", + "Wallis_and Futuna_bassin_11", + "Wallis_and Futuna_bassin_12", + "Wallis_and Futuna", + "Wallis_and Futuna_bassin_5", + "Wallis_and Futuna_bassin_6", + "Wallis_and Futuna_bassin_7", + "Wallis_and Futuna_bassin_8", + "Wallis_and Futuna_bassin_9", + "Western_Sahara_bassin_10", + "Western_Sahara_bassin_11", + "Western_Sahara_bassin_12", + "Western_Sahara", + "Western_Sahara_bassin_5", + "Western_Sahara_bassin_6", + "Western_Sahara_bassin_7", + "Western_Sahara_bassin_8", + "Western_Sahara_bassin_9", + "West_Bank_bassin_10", + "West_Bank_bassin_11", + "West_Bank_bassin_12", + "West_Bank", + "West_Bank_bassin_5", + "West_Bank_bassin_6", + "West_Bank_bassin_7", + "West_Bank_bassin_8", + "West_Bank_bassin_9", + "Yemen_bassin_10", + "Yemen_bassin_11", + "Yemen_bassin_12", + "Yemen", + "Yemen_bassin_5", + "Yemen_bassin_6", + "Yemen_bassin_7", + "Yemen_bassin_8", + "Yemen_bassin_9", + "Zambia_bassin_10", + "Zambia_bassin_11", + "Zambia_bassin_12", + "Zambia", + "Zambia_bassin_5", + "Zambia_bassin_6", + "Zambia_bassin_7", + "Zambia_bassin_8", + "Zambia_bassin_9", + "Zimbabwe_bassin_10", + "Zimbabwe_bassin_11", + "Zimbabwe_bassin_12", + "Zimbabwe", + "Zimbabwe_bassin_5", + "Zimbabwe_bassin_6", + "Zimbabwe_bassin_7", + "Zimbabwe_bassin_8", + "Zimbabwe_bassin_9" + ) ); + + public static void main(String[] args) { + + ArrayList missingCountries = new ArrayList(); + + for (String country : allCountryNames) { + if( !filesGenerated.contains(country) ) { + missingCountries.add( country); + } + } + System.out.println( missingCountries.size() ); + System.out.println( missingCountries ); + + String finalCountries = ""; + for (String missing : missingCountries) { + finalCountries += '"' + missing.replaceAll( "_", " ") + "\", "; + } + System.out.println( finalCountries ); + + } + + +} From 567376d24232e429a8b889c86cb008bff45c5571 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:15 +0100 Subject: [PATCH 0993/1620] New translations EarthApp.java (French) --- .../earth/app/view/Messages_fr.properties | 2429 ++++------------- 1 file changed, 534 insertions(+), 1895 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 768f973a7f..0777f46090 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,1895 +1,534 @@ -package org.openforis.collect.earth.app.ad_hoc; - -import java.util.ArrayList; -import java.util.Arrays; - -public class findMissingCountries { - - private static ArrayList allCountryNames = new ArrayList<>( - Arrays.asList( - "Abyei", - "Afghanistan", - "Aksai_Chin", - "Albania", - "Algeria", - "American_Samoa", - "Andorra", - "Angola", - "Anguilla", - "Antarctica", - "Antigua_and_Barbuda", - "Argentina", - "Armenia", - "Aruba", - "Arunachal_Pradesh", - "Ashmore_and_Cartier_Islands", - "Australia", - "Austria", - "Azerbaijan", - "Azores_Islands", - "Bahamas", - "Bahrain", - "Baker_Island", - "Bangladesh", - "Barbados", - "Bassas_da_India", - "Belarus", - "Belgium", - "Belize", - "Benin", - "Bermuda", - "Bhutan", - "Bird_Island", - "Bolivia", - "Bosnia_and_Herzegovina", - "Botswana", - "Bouvet_Island", - "Brazil", - "British_Indian_Ocean_Territory", - "British_Virgin_Islands", - "Brunei_Darussalam", - "Bulgaria", - "Burkina_Faso", - "Burundi", - "Cambodia", - "Cameroon", - "Canada", - "Cape_Verde", - "Cayman_Islands", - "Central_African_Republic", - "Chad", - "Chile", - "China", - "China/India", - "Christmas_Island", - "Clipperton_Island", - "Cocos__Keeling__Islands", - "Colombia", - "Comoros", - "Congo", - "Cook_Islands", - "Costa_Rica", - "Croatia", - "Cuba", - "Cyprus", - "Czech_Republic", - "C�te_d_Ivoire", - "Dem_People_s_Rep_of_Korea", - "Democratic_Republic_of_the_Congo", - "Denmark", - "Djibouti", - "Dominica", - "Dominican_Republic", - "Ecuador", - "Egypt", - "El_Salvador", - "Equatorial_Guinea", - "Eritrea", - "Estonia", - "Ethiopia", - "Europa_Island", - "Falkland_Islands__Malvinas_", - "Faroe_Islands", - "Fiji", - "Finland", - "France", - "French_Guiana", - "French_Polynesia", - "French_Southern_and_Antarctic_Territories", - "Gabon", - "Gambia", - "Gaza_Strip", - "Georgia", - "Germany", - "Ghana", - "Gibraltar", - "Glorioso_Island", - "Greece", - "Greenland", - "Grenada", - "Guadeloupe", - "Guam", - "Guatemala", - "Guernsey", - "Guinea", - "Guinea-Bissau", - "Guyana", - "Haiti", - "Hala_ib_triangle", - "Heard_Island_and_McDonald_Islands", - "Holy_See", - "Honduras", - "Hong_Kong", - "Howland_Island", - "Hungary", - "Iceland", - "Ilemi_triangle", - "India", - "Indonesia", - "Iran___Islamic_Republic_of_", - "Iraq", - "Ireland", - "Isle_of_Man", - "Israel", - "Italy", - "Jamaica", - "Jammu_and_Kashmir", - "Japan", - "Jarvis_Island", - "Jersey", - "Johnston_Atoll", - "Jordan", - "Juan_de_Nova_Island", - "Kazakhstan", - "Kenya", - "Kingman_Reef", - "Kiribati", - "Kuril_islands", - "Kuwait", - "Kyrgyzstan", - "Lao_People_s_Democratic_Republic", - "Latvia", - "Lebanon", - "Lesotho", - "Liberia", - "Libya", - "Liechtenstein", - "Lithuania", - "Luxembourg", - "Ma_tan_al-Sarra", - "Macau", - "Madagascar", - "Madeira_Islands", - "Malawi", - "Malaysia", - "Maldives", - "Mali", - "Malta", - "Marshall_Islands", - "Martinique", - "Mauritania", - "Mauritius", - "Mayotte", - "Mexico", - "Micronesia__Federated_States_of_", - "Midway_Island", - "Moldova,_Republic_of", - "Monaco", - "Mongolia", - "Montenegro", - "Montserrat", - "Morocco", - "Mozambique", - "Myanmar", - "Namibia", - "Nauru", - "Navassa_Island", - "Nepal", - "Netherlands", - "Netherlands_Antilles", - "New_Caledonia", - "New_Zealand", - "Nicaragua", - "Niger", - "Nigeria", - "Niue", - "Norfolk_Island", - "Northern_Mariana_Islands", - "Norway", - "Oman", - "Pakistan", - "Palau", - "Palmyra_Atoll", - "Panama", - "Papua_New_Guinea", - "Paracel_Islands", - "Paraguay", - "Peru", - "Philippines", - "Pitcairn", - "Poland", - "Portugal", - "Puerto_Rico", - "Qatar", - "Republic_of_Korea", - "Romania", - "Russian_Federation", - "Rwanda", - "R�union", - "Saint_Helena", - "Saint_Kitts_and_Nevis", - "Saint_Lucia", - "Saint_Pierre_et_Miquelon", - "Saint_Vincent_and_the_Grenadines", - "Samoa", - "San_Marino", - "Sao_Tome_and_Principe", - "Saudi_Arabia", - "Scarborough_Reef", - "Senegal", - "Senkaku_Islands", - "Serbia", - "Seychelles", - "Sierra_Leone", - "Singapore", - "Slovakia", - "Slovenia", - "Solomon_Islands", - "Somalia", - "South_Africa", - "South_Georgia_and_the_South_Sandwich_Islands", - "South_Sudan", - "Spain", - "Spratly_Islands", - "Sri_Lanka", - "Sudan", - "Suriname", - "Svalbard_and_Jan_Mayen_Islands", - "Swaziland", - "Sweden", - "Switzerland", - "Syrian_Arab_Republic", - "Taiwan", - "Tajikistan", - "Thailand", - "The_former_Yugoslav_Republic_of_Macedonia", - "Timor-Leste", - "Togo", - "Tokelau", - "Tonga", - "Trinidad_and_Tobago", - "Tromelin_Island", - "Tunisia", - "Turkey", - "Turkmenistan", - "Turks_and_Caicos_islands", - "Tuvalu", - "UK_of_Great_Britain_and_Northern_Ireland", - "Uganda", - "Ukraine", - "United_Arab_Emirates", - "United_Republic_of_Tanzania", - "United_States_Virgin_Islands", - "United_States_of_America", - "Uruguay", - "Uzbekistan", - "Vanuatu", - "Venezuela", - "Viet_Nam", - "Wake_Island", - "Wallis_and_Futuna", - "West_Bank", - "Western_Sahara", - "Yemen", - "Zambia", - "Zimbabwe" ) ); - - private static ArrayList filesGenerated = new ArrayList<>( - Arrays.asList( "Azores_Islands_bassin_10", - "Azores_Islands_bassin_11", - "Azores_Islands_bassin_12", - "Azores_Islands", - "Azores_Islands_bassin_5", - "Azores_Islands_bassin_6", - "Azores_Islands_bassin_7", - "Azores_Islands_bassin_8", - "Azores_Islands_bassin_9", - "Brunei_Darussalam_bassin_10", - "Brunei_Darussalam_bassin_11", - "Brunei_Darussalam_bassin_12", - "Brunei_Darussalam_bassin_7", - "Brunei_Darussalam_bassin_8", - "Brunei_Darussalam_bassin_9", - "Bulgaria_bassin_10", - "Bulgaria_bassin_11", - "Bulgaria_bassin_12", - "Bulgaria", - "Bulgaria_bassin_5", - "Bulgaria_bassin_6", - "Bulgaria_bassin_7", - "Bulgaria_bassin_8", - "Bulgaria_bassin_9", - "Burkina_Faso_bassin_10", - "Burkina_Faso_bassin_11", - "Burkina_Faso_bassin_12", - "Burkina_Faso", - "Burkina_Faso_bassin_5", - "Burkina_Faso_bassin_6", - "Burkina_Faso_bassin_7", - "Burkina_Faso_bassin_8", - "Burkina_Faso_bassin_9", - "Burundi_bassin_10", - "Burundi_bassin_11", - "Burundi_bassin_12", - "Burundi", - "Burundi_bassin_5", - "Burundi_bassin_6", - "Burundi_bassin_7", - "Burundi_bassin_8", - "Burundi_bassin_9", - "Cambodia_bassin_10", - "Cambodia_bassin_11", - "Cambodia_bassin_12", - "Cambodia", - "Cambodia_bassin_5", - "Cambodia_bassin_6", - "Cambodia_bassin_7", - "Cambodia_bassin_8", - "Cambodia_bassin_9", - "Cameroon_bassin_10", - "Cameroon_bassin_11", - "Cameroon_bassin_12", - "Cameroon", - "Cameroon_bassin_5", - "Cameroon_bassin_6", - "Cameroon_bassin_7", - "Cameroon_bassin_8", - "Cameroon_bassin_9", - "Canada_bassin_10", - "Canada_bassin_11", - "Canada_bassin_12", - "Canada", - "Canada_bassin_5", - "Canada_bassin_6", - "Canada_bassin_7", - "Canada_bassin_8", - "Canada_bassin_9", - "Cape_Verde_bassin_10", - "Cape_Verde_bassin_11", - "Cape_Verde_bassin_12", - "Cape_Verde", - "Cape_Verde_bassin_5", - "Cape_Verde_bassin_6", - "Cape_Verde_bassin_7", - "Cape_Verde_bassin_8", - "Cape_Verde_bassin_9", - "Cayman_Islands_bassin_10", - "Cayman_Islands_bassin_11", - "Cayman_Islands_bassin_12", - "Cayman_Islands", - "Cayman_Islands_bassin_5", - "Cayman_Islands_bassin_6", - "Cayman_Islands_bassin_7", - "Cayman_Islands_bassin_8", - "Cayman_Islands_bassin_9", - "Central_African Republic_bassin_10", - "Central_African Republic_bassin_11", - "Central_African Republic_bassin_12", - "Central_African Republic", - "Central_African Republic_bassin_5", - "Central_African Republic_bassin_6", - "Central_African Republic_bassin_7", - "Central_African Republic_bassin_8", - "Central_African Republic_bassin_9", - "Chad_bassin_10", - "Chad_bassin_11", - "Chad_bassin_12", - "Chad", - "Chad_bassin_5", - "Chad_bassin_6", - "Chad_bassin_7", - "Chad_bassin_8", - "Chad_bassin_9", - "Chile_bassin_10", - "Chile_bassin_11", - "Chile_bassin_12", - "Chile", - "Chile_bassin_5", - "Chile_bassin_6", - "Chile_bassin_7", - "Chile_bassin_8", - "Chile_bassin_9", - "China_bassin_10", - "China_bassin_11", - "China_bassin_12", - "China", - "China_bassin_5", - "China_bassin_6", - "China_bassin_7", - "China_bassin_8", - "China_bassin_9", - "Christmas_Island_bassin_10", - "Christmas_Island_bassin_11", - "Christmas_Island_bassin_12", - "Christmas_Island", - "Christmas_Island_bassin_5", - "Christmas_Island_bassin_6", - "Christmas_Island_bassin_7", - "Christmas_Island_bassin_8", - "Christmas_Island_bassin_9", - "Clipperton_Island_bassin_10", - "Clipperton_Island_bassin_11", - "Clipperton_Island_bassin_12", - "Clipperton_Island", - "Clipperton_Island_bassin_5", - "Clipperton_Island_bassin_6", - "Clipperton_Island_bassin_7", - "Clipperton_Island_bassin_8", - "Clipperton_Island_bassin_9", - "Colombia_bassin_10", - "Colombia_bassin_11", - "Colombia_bassin_12", - "Colombia", - "Colombia_bassin_5", - "Colombia_bassin_6", - "Colombia_bassin_7", - "Colombia_bassin_8", - "Colombia_bassin_9", - "Comoros_bassin_10", - "Comoros_bassin_11", - "Comoros_bassin_12", - "Comoros", - "Comoros_bassin_5", - "Comoros_bassin_6", - "Comoros_bassin_7", - "Comoros_bassin_8", - "Comoros_bassin_9", - "Congo_bassin_10", - "Congo_bassin_11", - "Congo_bassin_12", - "Congo", - "Congo_bassin_5", - "Congo_bassin_6", - "Congo_bassin_7", - "Congo_bassin_8", - "Congo_bassin_9", - "Cook_Islands_bassin_10", - "Cook_Islands_bassin_11", - "Cook_Islands_bassin_12", - "Cook_Islands", - "Cook_Islands_bassin_5", - "Cook_Islands_bassin_6", - "Cook_Islands_bassin_7", - "Cook_Islands_bassin_8", - "Cook_Islands_bassin_9", - "Costa_Rica_bassin_10", - "Costa_Rica_bassin_11", - "Costa_Rica_bassin_12", - "Costa_Rica", - "Costa_Rica_bassin_5", - "Costa_Rica_bassin_6", - "Costa_Rica_bassin_7", - "Costa_Rica_bassin_8", - "Costa_Rica_bassin_9", - "Croatia_bassin_10", - "Croatia_bassin_11", - "Croatia_bassin_12", - "Croatia", - "Croatia_bassin_5", - "Croatia_bassin_6", - "Croatia_bassin_7", - "Croatia_bassin_8", - "Croatia_bassin_9", - "Cuba_bassin_10", - "Cuba_bassin_11", - "Cuba_bassin_12", - "Cuba", - "Cuba_bassin_5", - "Cuba_bassin_6", - "Cuba_bassin_7", - "Cuba_bassin_8", - "Cuba_bassin_9", - "Cyprus_bassin_10", - "Cyprus_bassin_11", - "Cyprus_bassin_12", - "Cyprus", - "Cyprus_bassin_5", - "Cyprus_bassin_6", - "Cyprus_bassin_7", - "Cyprus_bassin_8", - "Cyprus_bassin_9", - "Czech_Republic_bassin_10", - "Czech_Republic_bassin_11", - "Czech_Republic_bassin_12", - "Czech_Republic", - "Czech_Republic_bassin_5", - "Czech_Republic_bassin_6", - "Czech_Republic_bassin_7", - "Czech_Republic_bassin_8", - "Czech_Republic_bassin_9", - "Democratic_Republic of the Congo_bassin_10", - "Democratic_Republic of the Congo_bassin_11", - "Democratic_Republic of the Congo_bassin_12", - "Democratic_Republic of the Congo", - "Democratic_Republic of the Congo_bassin_5", - "Democratic_Republic of the Congo_bassin_6", - "Democratic_Republic of the Congo_bassin_7", - "Democratic_Republic of the Congo_bassin_8", - "Democratic_Republic of the Congo_bassin_9", - "Dem_Peoples Rep of Korea_bassin_10", - "Dem_Peoples Rep of Korea_bassin_11", - "Dem_Peoples Rep of Korea_bassin_12", - "Dem_Peoples Rep of Korea", - "Dem_Peoples Rep of Korea_bassin_5", - "Dem_Peoples Rep of Korea_bassin_6", - "Dem_Peoples Rep of Korea_bassin_7", - "Dem_Peoples Rep of Korea_bassin_8", - "Dem_Peoples Rep of Korea_bassin_9", - "Denmark_bassin_10", - "Denmark_bassin_11", - "Denmark_bassin_12", - "Denmark", - "Denmark_bassin_5", - "Denmark_bassin_6", - "Denmark_bassin_7", - "Denmark_bassin_8", - "Denmark_bassin_9", - "Djibouti_bassin_10", - "Djibouti_bassin_11", - "Djibouti_bassin_12", - "Djibouti", - "Djibouti_bassin_5", - "Djibouti_bassin_6", - "Djibouti_bassin_7", - "Djibouti_bassin_8", - "Djibouti_bassin_9", - "Dominican_Republic_bassin_10", - "Dominican_Republic_bassin_11", - "Dominican_Republic_bassin_12", - "Dominican_Republic", - "Dominican_Republic_bassin_5", - "Dominican_Republic_bassin_6", - "Dominican_Republic_bassin_7", - "Dominican_Republic_bassin_8", - "Dominican_Republic_bassin_9", - "Dominica_bassin_10", - "Dominica_bassin_11", - "Dominica_bassin_12", - "Dominica", - "Dominica_bassin_5", - "Dominica_bassin_6", - "Dominica_bassin_7", - "Dominica_bassin_8", - "Dominica_bassin_9", - "Ecuador_bassin_10", - "Ecuador_bassin_11", - "Ecuador_bassin_12", - "Ecuador", - "Ecuador_bassin_5", - "Ecuador_bassin_6", - "Ecuador_bassin_7", - "Ecuador_bassin_8", - "Ecuador_bassin_9", - "Egypt_bassin_10", - "Egypt_bassin_11", - "Egypt_bassin_12", - "Egypt", - "Egypt_bassin_5", - "Egypt_bassin_6", - "Egypt_bassin_7", - "Egypt_bassin_8", - "Egypt_bassin_9", - "El_Salvador_bassin_10", - "El_Salvador_bassin_11", - "El_Salvador_bassin_12", - "El_Salvador", - "El_Salvador_bassin_5", - "El_Salvador_bassin_6", - "El_Salvador_bassin_7", - "El_Salvador_bassin_8", - "El_Salvador_bassin_9", - "Equatorial_Guinea_bassin_10", - "Equatorial_Guinea_bassin_11", - "Equatorial_Guinea_bassin_12", - "Equatorial_Guinea", - "Equatorial_Guinea_bassin_5", - "Equatorial_Guinea_bassin_6", - "Equatorial_Guinea_bassin_7", - "Equatorial_Guinea_bassin_8", - "Equatorial_Guinea_bassin_9", - "Eritrea_bassin_10", - "Eritrea_bassin_11", - "Eritrea_bassin_12", - "Eritrea", - "Eritrea_bassin_5", - "Eritrea_bassin_6", - "Eritrea_bassin_7", - "Eritrea_bassin_8", - "Eritrea_bassin_9", - "Estonia_bassin_10", - "Estonia_bassin_11", - "Estonia_bassin_12", - "Estonia", - "Estonia_bassin_5", - "Estonia_bassin_6", - "Estonia_bassin_7", - "Estonia_bassin_8", - "Estonia_bassin_9", - "Ethiopia_bassin_10", - "Ethiopia_bassin_11", - "Ethiopia_bassin_12", - "Ethiopia", - "Ethiopia_bassin_5", - "Ethiopia_bassin_6", - "Ethiopia_bassin_7", - "Ethiopia_bassin_8", - "Ethiopia_bassin_9", - "Europa_Island_bassin_10", - "Europa_Island_bassin_11", - "Europa_Island_bassin_12", - "Europa_Island", - "Europa_Island_bassin_5", - "Europa_Island_bassin_6", - "Europa_Island_bassin_7", - "Europa_Island_bassin_8", - "Europa_Island_bassin_9", - "Faroe_Islands_bassin_10", - "Faroe_Islands_bassin_11", - "Faroe_Islands_bassin_12", - "Faroe_Islands", - "Faroe_Islands_bassin_5", - "Faroe_Islands_bassin_6", - "Faroe_Islands_bassin_7", - "Faroe_Islands_bassin_8", - "Faroe_Islands_bassin_9", - "Fiji_bassin_10", - "Fiji_bassin_11", - "Fiji_bassin_12", - "Fiji", - "Fiji_bassin_5", - "Fiji_bassin_6", - "Fiji_bassin_7", - "Fiji_bassin_8", - "Fiji_bassin_9", - "Finland_bassin_10", - "Finland_bassin_11", - "Finland_bassin_12", - "Finland", - "Finland_bassin_5", - "Finland_bassin_6", - "Finland_bassin_7", - "Finland_bassin_8", - "Finland_bassin_9", - "France_bassin_10", - "France_bassin_11", - "France_bassin_12", - "France", - "France_bassin_5", - "France_bassin_6", - "France_bassin_7", - "France_bassin_8", - "France_bassin_9", - "French_Guiana_bassin_10", - "French_Guiana_bassin_11", - "French_Guiana_bassin_12", - "French_Guiana", - "French_Guiana_bassin_5", - "French_Guiana_bassin_6", - "French_Guiana_bassin_7", - "French_Guiana_bassin_8", - "French_Guiana_bassin_9", - "French_Polynesia_bassin_10", - "French_Polynesia_bassin_11", - "French_Polynesia_bassin_12", - "French_Polynesia", - "French_Polynesia_bassin_5", - "French_Polynesia_bassin_6", - "French_Polynesia_bassin_7", - "French_Polynesia_bassin_8", - "French_Polynesia_bassin_9", - "French_Southern and Antarctic Territories_bassin_10", - "French_Southern and Antarctic Territories_bassin_11", - "French_Southern and Antarctic Territories_bassin_12", - "French_Southern and Antarctic Territories", - "French_Southern and Antarctic Territories_bassin_5", - "French_Southern and Antarctic Territories_bassin_6", - "French_Southern and Antarctic Territories_bassin_7", - "French_Southern and Antarctic Territories_bassin_8", - "French_Southern and Antarctic Territories_bassin_9", - "Gabon_bassin_10", - "Gabon_bassin_11", - "Gabon_bassin_12", - "Gabon", - "Gabon_bassin_5", - "Gabon_bassin_6", - "Gabon_bassin_7", - "Gabon_bassin_8", - "Gabon_bassin_9", - "Gambia_bassin_10", - "Gambia_bassin_11", - "Gambia_bassin_12", - "Gambia", - "Gambia_bassin_5", - "Gambia_bassin_6", - "Gambia_bassin_7", - "Gambia_bassin_8", - "Gambia_bassin_9", - "Gaza_Strip_bassin_10", - "Gaza_Strip_bassin_11", - "Gaza_Strip_bassin_12", - "Gaza_Strip", - "Gaza_Strip_bassin_5", - "Gaza_Strip_bassin_6", - "Gaza_Strip_bassin_7", - "Gaza_Strip_bassin_8", - "Gaza_Strip_bassin_9", - "Georgia_bassin_10", - "Georgia_bassin_11", - "Georgia_bassin_12", - "Georgia", - "Georgia_bassin_5", - "Georgia_bassin_6", - "Georgia_bassin_7", - "Georgia_bassin_8", - "Georgia_bassin_9", - "Germany_bassin_10", - "Germany_bassin_11", - "Germany_bassin_12", - "Germany", - "Germany_bassin_5", - "Germany_bassin_6", - "Germany_bassin_7", - "Germany_bassin_8", - "Germany_bassin_9", - "Ghana_bassin_10", - "Ghana_bassin_11", - "Ghana_bassin_12", - "Ghana", - "Ghana_bassin_5", - "Ghana_bassin_6", - "Ghana_bassin_8", - "Ghana_bassin_9", - "Gibraltar_bassin_10", - "Gibraltar_bassin_11", - "Gibraltar_bassin_12", - "Gibraltar", - "Gibraltar_bassin_5", - "Gibraltar_bassin_6", - "Gibraltar_bassin_7", - "Gibraltar_bassin_8", - "Gibraltar_bassin_9", - "Glorioso_Island_bassin_10", - "Glorioso_Island_bassin_11", - "Glorioso_Island_bassin_12", - "Glorioso_Island", - "Glorioso_Island_bassin_5", - "Glorioso_Island_bassin_6", - "Glorioso_Island_bassin_7", - "Glorioso_Island_bassin_8", - "Glorioso_Island_bassin_9", - "Greece_bassin_10", - "Greece_bassin_11", - "Greece_bassin_12", - "Greece", - "Greece_bassin_5", - "Greece_bassin_6", - "Greece_bassin_7", - "Greece_bassin_8", - "Greece_bassin_9", - "Greenland_bassin_10", - "Greenland_bassin_11", - "Greenland_bassin_12", - "Greenland", - "Greenland_bassin_5", - "Greenland_bassin_6", - "Greenland_bassin_7", - "Greenland_bassin_8", - "Greenland_bassin_9", - "Grenada_bassin_10", - "Grenada_bassin_11", - "Grenada_bassin_12", - "Grenada", - "Grenada_bassin_5", - "Grenada_bassin_6", - "Grenada_bassin_7", - "Grenada_bassin_8", - "Grenada_bassin_9", - "Guadeloupe_bassin_10", - "Guadeloupe_bassin_11", - "Guadeloupe_bassin_12", - "Guadeloupe", - "Guadeloupe_bassin_5", - "Guadeloupe_bassin_6", - "Guadeloupe_bassin_7", - "Guadeloupe_bassin_8", - "Guadeloupe_bassin_9", - "Guam_bassin_10", - "Guam_bassin_11", - "Guam_bassin_12", - "Guam", - "Guam_bassin_5", - "Guam_bassin_6", - "Guam_bassin_7", - "Guam_bassin_8", - "Guam_bassin_9", - "Halaib_triangle_bassin_10", - "Halaib_triangle_bassin_11", - "Halaib_triangle_bassin_12", - "Halaib_triangle", - "Halaib_triangle_bassin_5", - "Halaib_triangle_bassin_6", - "Halaib_triangle_bassin_7", - "Halaib_triangle_bassin_8", - "Halaib_triangle_bassin_9", - "Heard_Island and McDonald Islands_bassin_12", - "Holy_See_bassin_10", - "Holy_See_bassin_11", - "Holy_See_bassin_12", - "Holy_See", - "Holy_See_bassin_5", - "Holy_See_bassin_6", - "Holy_See_bassin_7", - "Holy_See_bassin_8", - "Holy_See_bassin_9", - "Honduras_bassin_10", - "Honduras_bassin_11", - "Honduras_bassin_12", - "Honduras", - "Honduras_bassin_5", - "Honduras_bassin_6", - "Honduras_bassin_7", - "Honduras_bassin_8", - "Honduras_bassin_9", - "Hong_Kong_bassin_10", - "Hong_Kong_bassin_11", - "Hong_Kong_bassin_12", - "Hong_Kong", - "Hong_Kong_bassin_5", - "Hong_Kong_bassin_6", - "Hong_Kong_bassin_7", - "Hong_Kong_bassin_8", - "Hong_Kong_bassin_9", - "Howland_Island_bassin_10", - "Howland_Island_bassin_11", - "Howland_Island_bassin_12", - "Howland_Island", - "Howland_Island_bassin_5", - "Howland_Island_bassin_6", - "Howland_Island_bassin_7", - "Howland_Island_bassin_8", - "Howland_Island_bassin_9", - "Hungary_bassin_10", - "Hungary_bassin_11", - "Hungary_bassin_12", - "Hungary", - "Hungary_bassin_5", - "Hungary_bassin_6", - "Hungary_bassin_7", - "Hungary_bassin_8", - "Hungary_bassin_9", - "Iceland_bassin_10", - "Iceland_bassin_11", - "Iceland_bassin_12", - "Iceland", - "Iceland_bassin_5", - "Iceland_bassin_6", - "Iceland_bassin_7", - "Iceland_bassin_8", - "Iceland_bassin_9", - "Ilemi_triangle_bassin_10", - "Ilemi_triangle_bassin_11", - "Ilemi_triangle_bassin_12", - "Ilemi_triangle", - "Ilemi_triangle_bassin_5", - "Ilemi_triangle_bassin_6", - "Ilemi_triangle_bassin_7", - "Ilemi_triangle_bassin_8", - "Ilemi_triangle_bassin_9", - "India_bassin_10", - "India_bassin_11", - "India_bassin_12", - "India", - "India_bassin_5", - "India_bassin_6", - "India_bassin_7", - "India_bassin_8", - "India_bassin_9", - "Indonesia_bassin_10", - "Indonesia_bassin_11", - "Indonesia_bassin_12", - "Indonesia", - "Indonesia_bassin_5", - "Indonesia_bassin_6", - "Indonesia_bassin_7", - "Indonesia_bassin_8", - "Indonesia_bassin_9", - "Iraq_bassin_10", - "Iraq_bassin_11", - "Iraq_bassin_12", - "Iraq", - "Iraq_bassin_5", - "Iraq_bassin_6", - "Iraq_bassin_7", - "Iraq_bassin_8", - "Iraq_bassin_9", - "Ireland_bassin_10", - "Ireland_bassin_11", - "Ireland_bassin_12", - "Ireland", - "Ireland_bassin_5", - "Ireland_bassin_6", - "Ireland_bassin_7", - "Ireland_bassin_8", - "Ireland_bassin_9", - "Isle_of Man_bassin_10", - "Isle_of Man_bassin_11", - "Isle_of Man_bassin_12", - "Isle_of Man", - "Isle_of Man_bassin_5", - "Isle_of Man_bassin_6", - "Isle_of Man_bassin_7", - "Isle_of Man_bassin_8", - "Isle_of Man_bassin_9", - "Israel_bassin_10", - "Israel_bassin_11", - "Israel_bassin_12", - "Israel", - "Israel_bassin_5", - "Israel_bassin_6", - "Israel_bassin_7", - "Israel_bassin_8", - "Israel_bassin_9", - "Italy_bassin_10", - "Italy_bassin_11", - "Italy_bassin_12", - "Italy", - "Italy_bassin_5", - "Italy_bassin_6", - "Italy_bassin_7", - "Italy_bassin_8", - "Italy_bassin_9", - "Jamaica_bassin_10", - "Jamaica_bassin_11", - "Jamaica_bassin_12", - "Jamaica", - "Jamaica_bassin_5", - "Jamaica_bassin_6", - "Jamaica_bassin_7", - "Jamaica_bassin_8", - "Jamaica_bassin_9", - "Jammu_and Kashmir_bassin_10", - "Jammu_and Kashmir_bassin_11", - "Jammu_and Kashmir_bassin_12", - "Jammu_and Kashmir", - "Jammu_and Kashmir_bassin_5", - "Jammu_and Kashmir_bassin_6", - "Jammu_and Kashmir_bassin_7", - "Jammu_and Kashmir_bassin_8", - "Jammu_and Kashmir_bassin_9", - "Japan_bassin_10", - "Japan_bassin_11", - "Japan_bassin_12", - "Japan", - "Japan_bassin_5", - "Japan_bassin_6", - "Japan_bassin_7", - "Japan_bassin_8", - "Japan_bassin_9", - "Jarvis_Island_bassin_10", - "Jarvis_Island_bassin_11", - "Jarvis_Island_bassin_12", - "Jarvis_Island", - "Jarvis_Island_bassin_5", - "Jarvis_Island_bassin_6", - "Jarvis_Island_bassin_7", - "Jarvis_Island_bassin_8", - "Jarvis_Island_bassin_9", - "Jersey_bassin_10", - "Jersey_bassin_11", - "Jersey_bassin_12", - "Jersey", - "Jersey_bassin_5", - "Jersey_bassin_6", - "Jersey_bassin_7", - "Jersey_bassin_8", - "Jersey_bassin_9", - "Johnston_Atoll_bassin_10", - "Johnston_Atoll_bassin_11", - "Johnston_Atoll_bassin_12", - "Johnston_Atoll", - "Johnston_Atoll_bassin_5", - "Johnston_Atoll_bassin_6", - "Johnston_Atoll_bassin_7", - "Johnston_Atoll_bassin_8", - "Johnston_Atoll_bassin_9", - "Jordan_bassin_10", - "Jordan_bassin_11", - "Jordan_bassin_12", - "Jordan", - "Jordan_bassin_5", - "Jordan_bassin_6", - "Jordan_bassin_7", - "Jordan_bassin_8", - "Jordan_bassin_9", - "Juan_de Nova Island_bassin_10", - "Juan_de Nova Island_bassin_11", - "Juan_de Nova Island_bassin_12", - "Juan_de Nova Island", - "Juan_de Nova Island_bassin_5", - "Juan_de Nova Island_bassin_6", - "Juan_de Nova Island_bassin_7", - "Juan_de Nova Island_bassin_8", - "Juan_de Nova Island_bassin_9", - "Kazakhstan_bassin_10", - "Kazakhstan_bassin_11", - "Kazakhstan_bassin_12", - "Kazakhstan", - "Kazakhstan_bassin_5", - "Kazakhstan_bassin_6", - "Kazakhstan_bassin_7", - "Kazakhstan_bassin_8", - "Kazakhstan_bassin_9", - "Kenya_bassin_10", - "Kenya_bassin_11", - "Kenya_bassin_12", - "Kenya", - "Kenya_bassin_5", - "Kenya_bassin_6", - "Kenya_bassin_7", - "Kenya_bassin_8", - "Kenya_bassin_9", - "Kingman_Reef_bassin_10", - "Kingman_Reef_bassin_11", - "Kingman_Reef_bassin_12", - "Kingman_Reef", - "Kingman_Reef_bassin_5", - "Kingman_Reef_bassin_6", - "Kingman_Reef_bassin_7", - "Kingman_Reef_bassin_8", - "Kingman_Reef_bassin_9", - "Kiribati_bassin_10", - "Kiribati_bassin_11", - "Kiribati_bassin_12", - "Kiribati", - "Kiribati_bassin_5", - "Kiribati_bassin_6", - "Kiribati_bassin_7", - "Kiribati_bassin_8", - "Kiribati_bassin_9", - "Kuril_islands_bassin_10", - "Kuril_islands_bassin_11", - "Kuril_islands_bassin_12", - "Kuril_islands", - "Kuril_islands_bassin_5", - "Kuril_islands_bassin_6", - "Kuril_islands_bassin_7", - "Kuril_islands_bassin_8", - "Kuril_islands_bassin_9", - "Kuwait_bassin_10", - "Kuwait_bassin_11", - "Kuwait_bassin_12", - "Kuwait", - "Kuwait_bassin_5", - "Kuwait_bassin_6", - "Kuwait_bassin_7", - "Kuwait_bassin_8", - "Kuwait_bassin_9", - "Kyrgyzstan_bassin_10", - "Kyrgyzstan_bassin_11", - "Kyrgyzstan_bassin_12", - "Kyrgyzstan", - "Kyrgyzstan_bassin_5", - "Kyrgyzstan_bassin_6", - "Kyrgyzstan_bassin_7", - "Kyrgyzstan_bassin_8", - "Kyrgyzstan_bassin_9", - "Lao_Peoples Democratic Republic_bassin_10", - "Lao_Peoples Democratic Republic_bassin_11", - "Lao_Peoples Democratic Republic_bassin_12", - "Lao_Peoples Democratic Republic", - "Lao_Peoples Democratic Republic_bassin_5", - "Lao_Peoples Democratic Republic_bassin_6", - "Lao_Peoples Democratic Republic_bassin_7", - "Lao_Peoples Democratic Republic_bassin_8", - "Lao_Peoples Democratic Republic_bassin_9", - "Latvia_bassin_10", - "Latvia_bassin_11", - "Latvia_bassin_12", - "Latvia", - "Latvia_bassin_5", - "Latvia_bassin_6", - "Latvia_bassin_7", - "Latvia_bassin_8", - "Latvia_bassin_9", - "Lebanon_bassin_10", - "Lebanon_bassin_11", - "Lebanon_bassin_12", - "Lebanon", - "Lebanon_bassin_5", - "Lebanon_bassin_6", - "Lebanon_bassin_7", - "Lebanon_bassin_8", - "Lebanon_bassin_9", - "Lesotho_bassin_10", - "Lesotho_bassin_11", - "Lesotho_bassin_12", - "Lesotho", - "Lesotho_bassin_5", - "Lesotho_bassin_6", - "Lesotho_bassin_7", - "Lesotho_bassin_8", - "Lesotho_bassin_9", - "Liberia_bassin_10", - "Liberia_bassin_11", - "Liberia_bassin_12", - "Liberia", - "Liberia_bassin_5", - "Liberia_bassin_6", - "Liberia_bassin_7", - "Liberia_bassin_8", - "Liberia_bassin_9", - "Libya_bassin_10", - "Libya_bassin_11", - "Libya_bassin_12", - "Libya", - "Libya_bassin_5", - "Libya_bassin_6", - "Libya_bassin_7", - "Libya_bassin_8", - "Libya_bassin_9", - "Liechtenstein_bassin_10", - "Liechtenstein_bassin_11", - "Liechtenstein_bassin_12", - "Liechtenstein", - "Liechtenstein_bassin_5", - "Liechtenstein_bassin_6", - "Liechtenstein_bassin_7", - "Liechtenstein_bassin_8", - "Liechtenstein_bassin_9", - "Lithuania_bassin_10", - "Lithuania_bassin_11", - "Lithuania_bassin_12", - "Lithuania", - "Lithuania_bassin_5", - "Lithuania_bassin_6", - "Lithuania_bassin_7", - "Lithuania_bassin_8", - "Lithuania_bassin_9", - "Luxembourg_bassin_10", - "Luxembourg_bassin_11", - "Luxembourg_bassin_12", - "Luxembourg", - "Luxembourg_bassin_5", - "Luxembourg_bassin_6", - "Luxembourg_bassin_7", - "Luxembourg_bassin_8", - "Luxembourg_bassin_9", - "Macau_bassin_10", - "Macau_bassin_11", - "Macau_bassin_12", - "Macau", - "Macau_bassin_5", - "Macau_bassin_6", - "Macau_bassin_7", - "Macau_bassin_8", - "Macau_bassin_9", - "Madagascar_bassin_10", - "Madagascar_bassin_11", - "Madagascar_bassin_12", - "Madagascar", - "Madagascar_bassin_5", - "Madagascar_bassin_6", - "Madagascar_bassin_7", - "Madagascar_bassin_8", - "Madagascar_bassin_9", - "Madeira_Islands_bassin_10", - "Madeira_Islands_bassin_11", - "Madeira_Islands_bassin_12", - "Madeira_Islands", - "Madeira_Islands_bassin_5", - "Madeira_Islands_bassin_6", - "Madeira_Islands_bassin_7", - "Madeira_Islands_bassin_8", - "Madeira_Islands_bassin_9", - "Malawi_bassin_10", - "Malawi_bassin_11", - "Malawi_bassin_12", - "Malawi", - "Malawi_bassin_5", - "Malawi_bassin_6", - "Malawi_bassin_7", - "Malawi_bassin_8", - "Malawi_bassin_9", - "Malaysia_bassin_10", - "Malaysia_bassin_11", - "Malaysia_bassin_12", - "Malaysia", - "Malaysia_bassin_5", - "Malaysia_bassin_6", - "Malaysia_bassin_7", - "Malaysia_bassin_8", - "Malaysia_bassin_9", - "Maldives_bassin_10", - "Maldives_bassin_11", - "Maldives_bassin_12", - "Maldives", - "Maldives_bassin_5", - "Maldives_bassin_6", - "Maldives_bassin_7", - "Maldives_bassin_8", - "Maldives_bassin_9", - "Matan_al-Sarra_bassin_10", - "Matan_al-Sarra_bassin_11", - "Matan_al-Sarra_bassin_12", - "Matan_al-Sarra", - "Matan_al-Sarra_bassin_5", - "Matan_al-Sarra_bassin_6", - "Matan_al-Sarra_bassin_7", - "Matan_al-Sarra_bassin_8", - "Matan_al-Sarra_bassin_9", - "Montenegro_bassin_10", - "Montenegro_bassin_11", - "Montenegro_bassin_12", - "Montenegro", - "Montenegro_bassin_5", - "Montenegro_bassin_6", - "Montenegro_bassin_7", - "Montenegro_bassin_8", - "Montenegro_bassin_9", - "Qatar_bassin_10", - "Qatar_bassin_11", - "Qatar_bassin_12", - "Republic_of Korea_bassin_10", - "Republic_of Korea_bassin_11", - "Republic_of Korea_bassin_12", - "Republic_of Korea", - "Republic_of Korea_bassin_5", - "Republic_of Korea_bassin_6", - "Republic_of Korea_bassin_7", - "Republic_of Korea_bassin_8", - "Republic_of Korea_bassin_9", - "Romania_bassin_10", - "Romania_bassin_11", - "Romania_bassin_12", - "Romania", - "Romania_bassin_5", - "Romania_bassin_6", - "Romania_bassin_7", - "Romania_bassin_8", - "Romania_bassin_9", - "Russian_Federation_bassin_10", - "Russian_Federation_bassin_11", - "Russian_Federation_bassin_12", - "Russian_Federation", - "Russian_Federation_bassin_5", - "Russian_Federation_bassin_6", - "Russian_Federation_bassin_7", - "Russian_Federation_bassin_8", - "Russian_Federation_bassin_9", - "Rwanda_bassin_10", - "Rwanda_bassin_11", - "Rwanda_bassin_12", - "Rwanda", - "Rwanda_bassin_5", - "Rwanda_bassin_6", - "Rwanda_bassin_7", - "Rwanda_bassin_8", - "Rwanda_bassin_9", - "Saint_Helena_bassin_10", - "Saint_Helena_bassin_11", - "Saint_Helena_bassin_12", - "Saint_Helena", - "Saint_Helena_bassin_5", - "Saint_Helena_bassin_6", - "Saint_Helena_bassin_7", - "Saint_Helena_bassin_8", - "Saint_Helena_bassin_9", - "Saint_Kitts and Nevis_bassin_10", - "Saint_Kitts and Nevis_bassin_11", - "Saint_Kitts and Nevis_bassin_12", - "Saint_Kitts and Nevis", - "Saint_Kitts and Nevis_bassin_5", - "Saint_Kitts and Nevis_bassin_6", - "Saint_Kitts and Nevis_bassin_7", - "Saint_Kitts and Nevis_bassin_8", - "Saint_Kitts and Nevis_bassin_9", - "Saint_Lucia_bassin_10", - "Saint_Lucia_bassin_11", - "Saint_Lucia_bassin_12", - "Saint_Lucia", - "Saint_Lucia_bassin_5", - "Saint_Lucia_bassin_6", - "Saint_Lucia_bassin_7", - "Saint_Lucia_bassin_8", - "Saint_Lucia_bassin_9", - "Saint_Pierre et Miquelon_bassin_10", - "Saint_Pierre et Miquelon_bassin_11", - "Saint_Pierre et Miquelon_bassin_12", - "Saint_Pierre et Miquelon", - "Saint_Pierre et Miquelon_bassin_5", - "Saint_Pierre et Miquelon_bassin_6", - "Saint_Pierre et Miquelon_bassin_7", - "Saint_Pierre et Miquelon_bassin_8", - "Saint_Pierre et Miquelon_bassin_9", - "Saint_Vincent and the Grenadines_bassin_10", - "Saint_Vincent and the Grenadines_bassin_11", - "Saint_Vincent and the Grenadines_bassin_12", - "Saint_Vincent and the Grenadines", - "Saint_Vincent and the Grenadines_bassin_5", - "Saint_Vincent and the Grenadines_bassin_6", - "Saint_Vincent and the Grenadines_bassin_7", - "Saint_Vincent and the Grenadines_bassin_8", - "Saint_Vincent and the Grenadines_bassin_9", - "Samoa_bassin_10", - "Samoa_bassin_11", - "Samoa_bassin_12", - "Samoa", - "Samoa_bassin_5", - "Samoa_bassin_6", - "Samoa_bassin_7", - "Samoa_bassin_8", - "Samoa_bassin_9", - "San_Marino_bassin_10", - "San_Marino_bassin_11", - "San_Marino_bassin_12", - "San_Marino", - "San_Marino_bassin_5", - "San_Marino_bassin_6", - "San_Marino_bassin_7", - "San_Marino_bassin_8", - "San_Marino_bassin_9", - "Sao_Tome and Principe_bassin_10", - "Sao_Tome and Principe_bassin_11", - "Sao_Tome and Principe_bassin_12", - "Sao_Tome and Principe", - "Sao_Tome and Principe_bassin_5", - "Sao_Tome and Principe_bassin_6", - "Sao_Tome and Principe_bassin_7", - "Sao_Tome and Principe_bassin_8", - "Sao_Tome and Principe_bassin_9", - "Saudi_Arabia_bassin_10", - "Saudi_Arabia_bassin_11", - "Saudi_Arabia_bassin_12", - "Saudi_Arabia", - "Saudi_Arabia_bassin_5", - "Saudi_Arabia_bassin_6", - "Saudi_Arabia_bassin_7", - "Saudi_Arabia_bassin_8", - "Saudi_Arabia_bassin_9", - "Scarborough_Reef_bassin_10", - "Scarborough_Reef_bassin_11", - "Scarborough_Reef_bassin_12", - "Scarborough_Reef", - "Scarborough_Reef_bassin_5", - "Scarborough_Reef_bassin_6", - "Scarborough_Reef_bassin_7", - "Scarborough_Reef_bassin_8", - "Scarborough_Reef_bassin_9", - "Senegal_bassin_10", - "Senegal_bassin_11", - "Senegal_bassin_12", - "Senegal", - "Senegal_bassin_5", - "Senegal_bassin_6", - "Senegal_bassin_7", - "Senegal_bassin_8", - "Senegal_bassin_9", - "Senkaku_Islands_bassin_10", - "Senkaku_Islands_bassin_11", - "Senkaku_Islands_bassin_12", - "Senkaku_Islands", - "Senkaku_Islands_bassin_5", - "Senkaku_Islands_bassin_6", - "Senkaku_Islands_bassin_7", - "Senkaku_Islands_bassin_8", - "Senkaku_Islands_bassin_9", - "Serbia_bassin_10", - "Serbia_bassin_11", - "Serbia_bassin_12", - "Serbia", - "Serbia_bassin_5", - "Serbia_bassin_6", - "Serbia_bassin_7", - "Serbia_bassin_8", - "Serbia_bassin_9", - "Seychelles_bassin_10", - "Seychelles_bassin_11", - "Seychelles_bassin_12", - "Seychelles", - "Seychelles_bassin_5", - "Seychelles_bassin_6", - "Seychelles_bassin_7", - "Seychelles_bassin_8", - "Seychelles_bassin_9", - "Sierra_Leone_bassin_10", - "Sierra_Leone_bassin_11", - "Sierra_Leone_bassin_12", - "Sierra_Leone", - "Sierra_Leone_bassin_5", - "Sierra_Leone_bassin_6", - "Sierra_Leone_bassin_7", - "Sierra_Leone_bassin_8", - "Sierra_Leone_bassin_9", - "Singapore_bassin_10", - "Singapore_bassin_11", - "Singapore_bassin_12", - "Singapore", - "Singapore_bassin_5", - "Singapore_bassin_6", - "Singapore_bassin_7", - "Singapore_bassin_8", - "Singapore_bassin_9", - "Slovakia_bassin_10", - "Slovakia_bassin_11", - "Slovakia_bassin_12", - "Slovakia", - "Slovakia_bassin_5", - "Slovakia_bassin_6", - "Slovakia_bassin_7", - "Slovakia_bassin_8", - "Slovakia_bassin_9", - "Slovenia_bassin_10", - "Slovenia_bassin_11", - "Slovenia_bassin_12", - "Slovenia", - "Slovenia_bassin_5", - "Slovenia_bassin_6", - "Slovenia_bassin_7", - "Slovenia_bassin_8", - "Slovenia_bassin_9", - "Solomon_Islands_bassin_10", - "Solomon_Islands_bassin_11", - "Solomon_Islands_bassin_12", - "Solomon_Islands", - "Solomon_Islands_bassin_5", - "Solomon_Islands_bassin_6", - "Solomon_Islands_bassin_7", - "Solomon_Islands_bassin_8", - "Solomon_Islands_bassin_9", - "Somalia_bassin_10", - "Somalia_bassin_11", - "Somalia_bassin_12", - "Somalia", - "Somalia_bassin_5", - "Somalia_bassin_6", - "Somalia_bassin_7", - "Somalia_bassin_8", - "Somalia_bassin_9", - "South_Africa_bassin_10", - "South_Africa_bassin_11", - "South_Africa_bassin_12", - "South_Africa", - "South_Africa_bassin_5", - "South_Africa_bassin_6", - "South_Africa_bassin_7", - "South_Africa_bassin_8", - "South_Africa_bassin_9", - "South_Georgia and the South Sandwich Islands_bassin_10", - "South_Georgia and the South Sandwich Islands_bassin_11", - "South_Georgia and the South Sandwich Islands_bassin_12", - "South_Georgia and the South Sandwich Islands", - "South_Georgia and the South Sandwich Islands_bassin_5", - "South_Georgia and the South Sandwich Islands_bassin_6", - "South_Georgia and the South Sandwich Islands_bassin_7", - "South_Georgia and the South Sandwich Islands_bassin_8", - "South_Georgia and the South Sandwich Islands_bassin_9", - "South_Sudan_bassin_10", - "South_Sudan_bassin_11", - "South_Sudan_bassin_12", - "South_Sudan", - "South_Sudan_bassin_5", - "South_Sudan_bassin_6", - "South_Sudan_bassin_7", - "South_Sudan_bassin_8", - "South_Sudan_bassin_9", - "Spain_bassin_10", - "Spain_bassin_11", - "Spain_bassin_12", - "Spain", - "Spain_bassin_5", - "Spain_bassin_6", - "Spain_bassin_7", - "Spain_bassin_8", - "Spain_bassin_9", - "Spratly_Islands_bassin_10", - "Spratly_Islands_bassin_11", - "Spratly_Islands_bassin_12", - "Spratly_Islands", - "Spratly_Islands_bassin_5", - "Spratly_Islands_bassin_6", - "Spratly_Islands_bassin_7", - "Spratly_Islands_bassin_8", - "Spratly_Islands_bassin_9", - "Sri_Lanka_bassin_10", - "Sri_Lanka_bassin_11", - "Sri_Lanka_bassin_12", - "Sri_Lanka", - "Sri_Lanka_bassin_5", - "Sri_Lanka_bassin_6", - "Sri_Lanka_bassin_7", - "Sri_Lanka_bassin_8", - "Sri_Lanka_bassin_9", - "Suriname_bassin_10", - "Suriname_bassin_11", - "Suriname_bassin_12", - "Suriname", - "Suriname_bassin_5", - "Suriname_bassin_6", - "Suriname_bassin_7", - "Suriname_bassin_8", - "Suriname_bassin_9", - "Svalbard_and Jan Mayen Islands_bassin_10", - "Svalbard_and Jan Mayen Islands_bassin_11", - "Svalbard_and Jan Mayen Islands_bassin_12", - "Svalbard_and Jan Mayen Islands", - "Svalbard_and Jan Mayen Islands_bassin_5", - "Svalbard_and Jan Mayen Islands_bassin_6", - "Svalbard_and Jan Mayen Islands_bassin_7", - "Svalbard_and Jan Mayen Islands_bassin_8", - "Svalbard_and Jan Mayen Islands_bassin_9", - "Swaziland_bassin_10", - "Swaziland_bassin_11", - "Swaziland_bassin_12", - "Swaziland", - "Swaziland_bassin_5", - "Swaziland_bassin_6", - "Swaziland_bassin_7", - "Swaziland_bassin_8", - "Swaziland_bassin_9", - "Sweden_bassin_10", - "Sweden_bassin_11", - "Sweden_bassin_12", - "Sweden", - "Sweden_bassin_5", - "Sweden_bassin_6", - "Sweden_bassin_7", - "Sweden_bassin_8", - "Sweden_bassin_9", - "Switzerland_bassin_10", - "Switzerland_bassin_11", - "Switzerland_bassin_12", - "Switzerland", - "Switzerland_bassin_5", - "Switzerland_bassin_6", - "Switzerland_bassin_7", - "Switzerland_bassin_8", - "Switzerland_bassin_9", - "Syrian_Arab Republic_bassin_10", - "Syrian_Arab Republic_bassin_11", - "Syrian_Arab Republic_bassin_12", - "Syrian_Arab Republic", - "Syrian_Arab Republic_bassin_5", - "Syrian_Arab Republic_bassin_6", - "Syrian_Arab Republic_bassin_7", - "Syrian_Arab Republic_bassin_8", - "Syrian_Arab Republic_bassin_9", - "Taiwan_bassin_10", - "Taiwan_bassin_11", - "Taiwan_bassin_12", - "Taiwan", - "Taiwan_bassin_5", - "Taiwan_bassin_6", - "Taiwan_bassin_7", - "Taiwan_bassin_8", - "Taiwan_bassin_9", - "Tajikistan_bassin_10", - "Tajikistan_bassin_11", - "Tajikistan_bassin_12", - "Tajikistan", - "Tajikistan_bassin_5", - "Tajikistan_bassin_6", - "Tajikistan_bassin_7", - "Tajikistan_bassin_8", - "Tajikistan_bassin_9", - "Thailand_bassin_10", - "Thailand_bassin_11", - "Thailand_bassin_12", - "Thailand", - "Thailand_bassin_5", - "Thailand_bassin_6", - "Thailand_bassin_7", - "Thailand_bassin_8", - "Thailand_bassin_9", - "The_former Yugoslav Republic of Macedonia_bassin_10", - "The_former Yugoslav Republic of Macedonia_bassin_11", - "The_former Yugoslav Republic of Macedonia_bassin_12", - "The_former Yugoslav Republic of Macedonia", - "The_former Yugoslav Republic of Macedonia_bassin_5", - "The_former Yugoslav Republic of Macedonia_bassin_6", - "The_former Yugoslav Republic of Macedonia_bassin_7", - "The_former Yugoslav Republic of Macedonia_bassin_8", - "The_former Yugoslav Republic of Macedonia_bassin_9", - "Timor-Leste_bassin_10", - "Timor-Leste_bassin_11", - "Timor-Leste_bassin_12", - "Timor-Leste", - "Timor-Leste_bassin_5", - "Timor-Leste_bassin_6", - "Timor-Leste_bassin_7", - "Timor-Leste_bassin_8", - "Timor-Leste_bassin_9", - "Togo_bassin_10", - "Togo_bassin_11", - "Togo_bassin_12", - "Togo", - "Togo_bassin_5", - "Togo_bassin_6", - "Togo_bassin_7", - "Togo_bassin_8", - "Togo_bassin_9", - "Tokelau_bassin_10", - "Tokelau_bassin_11", - "Tokelau_bassin_12", - "Tokelau", - "Tokelau_bassin_5", - "Tokelau_bassin_6", - "Tokelau_bassin_7", - "Tokelau_bassin_8", - "Tokelau_bassin_9", - "Tonga_bassin_10", - "Tonga_bassin_11", - "Tonga_bassin_12", - "Tonga", - "Tonga_bassin_5", - "Tonga_bassin_6", - "Tonga_bassin_7", - "Tonga_bassin_8", - "Tonga_bassin_9", - "Trinidad_and Tobago_bassin_10", - "Trinidad_and Tobago_bassin_11", - "Trinidad_and Tobago_bassin_12", - "Trinidad_and Tobago", - "Trinidad_and Tobago_bassin_5", - "Trinidad_and Tobago_bassin_6", - "Trinidad_and Tobago_bassin_7", - "Trinidad_and Tobago_bassin_8", - "Trinidad_and Tobago_bassin_9", - "Tromelin_Island_bassin_10", - "Tromelin_Island_bassin_11", - "Tromelin_Island_bassin_12", - "Tromelin_Island", - "Tromelin_Island_bassin_5", - "Tromelin_Island_bassin_6", - "Tromelin_Island_bassin_7", - "Tromelin_Island_bassin_8", - "Tromelin_Island_bassin_9", - "Tunisia_bassin_10", - "Tunisia_bassin_11", - "Tunisia_bassin_12", - "Tunisia", - "Tunisia_bassin_5", - "Tunisia_bassin_6", - "Tunisia_bassin_7", - "Tunisia_bassin_8", - "Tunisia_bassin_9", - "Turkey_bassin_10", - "Turkey_bassin_11", - "Turkey_bassin_12", - "Turkey", - "Turkey_bassin_5", - "Turkey_bassin_6", - "Turkey_bassin_7", - "Turkey_bassin_8", - "Turkey_bassin_9", - "Turkmenistan_bassin_10", - "Turkmenistan_bassin_11", - "Turkmenistan_bassin_12", - "Turkmenistan", - "Turkmenistan_bassin_5", - "Turkmenistan_bassin_6", - "Turkmenistan_bassin_7", - "Turkmenistan_bassin_8", - "Turkmenistan_bassin_9", - "Turks_and Caicos islands_bassin_10", - "Turks_and Caicos islands_bassin_11", - "Turks_and Caicos islands_bassin_12", - "Turks_and Caicos islands", - "Turks_and Caicos islands_bassin_5", - "Turks_and Caicos islands_bassin_6", - "Turks_and Caicos islands_bassin_7", - "Turks_and Caicos islands_bassin_8", - "Turks_and Caicos islands_bassin_9", - "Tuvalu_bassin_10", - "Tuvalu_bassin_11", - "Tuvalu_bassin_12", - "Tuvalu", - "Tuvalu_bassin_5", - "Tuvalu_bassin_6", - "Tuvalu_bassin_7", - "Tuvalu_bassin_8", - "Tuvalu_bassin_9", - "Uganda_bassin_10", - "Uganda_bassin_11", - "Uganda_bassin_12", - "Uganda", - "Uganda_bassin_5", - "Uganda_bassin_6", - "Uganda_bassin_7", - "Uganda_bassin_8", - "Uganda_bassin_9", - "Ukraine_bassin_10", - "Ukraine_bassin_11", - "Ukraine_bassin_12", - "Ukraine", - "Ukraine_bassin_5", - "Ukraine_bassin_6", - "Ukraine_bassin_7", - "Ukraine_bassin_8", - "Ukraine_bassin_9", - "UK_of Great Britain and Northern Ireland_bassin_10", - "UK_of Great Britain and Northern Ireland_bassin_11", - "UK_of Great Britain and Northern Ireland_bassin_12", - "UK_of Great Britain and Northern Ireland", - "UK_of Great Britain and Northern Ireland_bassin_5", - "UK_of Great Britain and Northern Ireland_bassin_6", - "UK_of Great Britain and Northern Ireland_bassin_7", - "UK_of Great Britain and Northern Ireland_bassin_8", - "UK_of Great Britain and Northern Ireland_bassin_9", - "United_Arab Emirates_bassin_10", - "United_Arab Emirates_bassin_11", - "United_Arab Emirates_bassin_12", - "United_Arab Emirates", - "United_Arab Emirates_bassin_5", - "United_Arab Emirates_bassin_6", - "United_Arab Emirates_bassin_7", - "United_Arab Emirates_bassin_8", - "United_Arab Emirates_bassin_9", - "United_Republic of Tanzania_bassin_10", - "United_Republic of Tanzania_bassin_11", - "United_Republic of Tanzania_bassin_12", - "United_Republic of Tanzania", - "United_Republic of Tanzania_bassin_5", - "United_Republic of Tanzania_bassin_6", - "United_Republic of Tanzania_bassin_7", - "United_Republic of Tanzania_bassin_8", - "United_Republic of Tanzania_bassin_9", - "United_States of America_bassin_10", - "United_States of America_bassin_11", - "United_States of America_bassin_12", - "United_States of America", - "United_States of America_bassin_5", - "United_States of America_bassin_6", - "United_States of America_bassin_7", - "United_States of America_bassin_8", - "United_States of America_bassin_9", - "United_States Virgin Islands_bassin_10", - "United_States Virgin Islands_bassin_11", - "United_States Virgin Islands_bassin_12", - "United_States Virgin Islands", - "United_States Virgin Islands_bassin_5", - "United_States Virgin Islands_bassin_6", - "United_States Virgin Islands_bassin_7", - "United_States Virgin Islands_bassin_8", - "United_States Virgin Islands_bassin_9", - "Uruguay_bassin_10", - "Uruguay_bassin_11", - "Uruguay_bassin_12", - "Uruguay", - "Uruguay_bassin_5", - "Uruguay_bassin_6", - "Uruguay_bassin_7", - "Uruguay_bassin_8", - "Uruguay_bassin_9", - "Uzbekistan_bassin_10", - "Uzbekistan_bassin_11", - "Uzbekistan_bassin_12", - "Uzbekistan", - "Uzbekistan_bassin_5", - "Uzbekistan_bassin_6", - "Uzbekistan_bassin_7", - "Uzbekistan_bassin_8", - "Uzbekistan_bassin_9", - "Vanuatu_bassin_10", - "Vanuatu_bassin_11", - "Vanuatu_bassin_12", - "Vanuatu", - "Vanuatu_bassin_5", - "Vanuatu_bassin_6", - "Vanuatu_bassin_7", - "Vanuatu_bassin_8", - "Vanuatu_bassin_9", - "Venezuela_bassin_10", - "Venezuela_bassin_11", - "Venezuela_bassin_12", - "Venezuela", - "Venezuela_bassin_5", - "Venezuela_bassin_6", - "Venezuela_bassin_7", - "Venezuela_bassin_8", - "Venezuela_bassin_9", - "Viet_Nam_bassin_10", - "Viet_Nam_bassin_11", - "Viet_Nam_bassin_12", - "Viet_Nam", - "Viet_Nam_bassin_5", - "Viet_Nam_bassin_6", - "Viet_Nam_bassin_7", - "Viet_Nam_bassin_8", - "Viet_Nam_bassin_9", - "Wake_Island_bassin_10", - "Wake_Island_bassin_11", - "Wake_Island_bassin_12", - "Wake_Island", - "Wake_Island_bassin_5", - "Wake_Island_bassin_6", - "Wake_Island_bassin_7", - "Wake_Island_bassin_8", - "Wake_Island_bassin_9", - "Wallis_and Futuna_bassin_10", - "Wallis_and Futuna_bassin_11", - "Wallis_and Futuna_bassin_12", - "Wallis_and Futuna", - "Wallis_and Futuna_bassin_5", - "Wallis_and Futuna_bassin_6", - "Wallis_and Futuna_bassin_7", - "Wallis_and Futuna_bassin_8", - "Wallis_and Futuna_bassin_9", - "Western_Sahara_bassin_10", - "Western_Sahara_bassin_11", - "Western_Sahara_bassin_12", - "Western_Sahara", - "Western_Sahara_bassin_5", - "Western_Sahara_bassin_6", - "Western_Sahara_bassin_7", - "Western_Sahara_bassin_8", - "Western_Sahara_bassin_9", - "West_Bank_bassin_10", - "West_Bank_bassin_11", - "West_Bank_bassin_12", - "West_Bank", - "West_Bank_bassin_5", - "West_Bank_bassin_6", - "West_Bank_bassin_7", - "West_Bank_bassin_8", - "West_Bank_bassin_9", - "Yemen_bassin_10", - "Yemen_bassin_11", - "Yemen_bassin_12", - "Yemen", - "Yemen_bassin_5", - "Yemen_bassin_6", - "Yemen_bassin_7", - "Yemen_bassin_8", - "Yemen_bassin_9", - "Zambia_bassin_10", - "Zambia_bassin_11", - "Zambia_bassin_12", - "Zambia", - "Zambia_bassin_5", - "Zambia_bassin_6", - "Zambia_bassin_7", - "Zambia_bassin_8", - "Zambia_bassin_9", - "Zimbabwe_bassin_10", - "Zimbabwe_bassin_11", - "Zimbabwe_bassin_12", - "Zimbabwe", - "Zimbabwe_bassin_5", - "Zimbabwe_bassin_6", - "Zimbabwe_bassin_7", - "Zimbabwe_bassin_8", - "Zimbabwe_bassin_9" - ) ); - - public static void main(String[] args) { - - ArrayList missingCountries = new ArrayList(); - - for (String country : allCountryNames) { - if( !filesGenerated.contains(country) ) { - missingCountries.add( country); - } - } - System.out.println( missingCountries.size() ); - System.out.println( missingCountries ); - - String finalCountries = ""; - for (String missing : missingCountries) { - finalCountries += '"' + missing.replaceAll( "_", " ") + "\", "; - } - System.out.println( finalCountries ); - - } - - -} +package org.openforis.collect.earth.app.desktop; + +import java.awt.Image; +import java.awt.SplashScreen; +import java.awt.Window; +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.net.MalformedURLException; +import java.net.Socket; +import java.net.URL; +import java.net.URLConnection; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.Observer; + +import javax.swing.ImageIcon; +import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; + +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.SystemUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.desktop.ServerController.ServerInitializationEvent; +import org.openforis.collect.earth.app.logging.GAlogger; +import org.openforis.collect.earth.app.server.LoadProjectFileServlet; +import org.openforis.collect.earth.app.service.EarthProjectsService; +import org.openforis.collect.earth.app.service.FolderFinder; +import org.openforis.collect.earth.app.service.KmlGeneratorService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.app.service.UpdateIniUtils; +import org.openforis.collect.earth.app.view.CheckForUpdatesListener; +import org.openforis.collect.earth.app.view.CollectEarthWindow; +import org.openforis.collect.earth.app.view.Messages; +import org.openforis.collect.earth.app.view.PropertiesDialog; +import org.openforis.collect.earth.sampler.utils.KmlGenerationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.opencsv.exceptions.CsvValidationException; + +import io.sentry.Sentry; +import io.sentry.protocol.User; + +/** + * Contains the main class that starts Collect Earth and opens Google Earth. + * + * @author Alfonso Sanchez-Paus Diaz + * + */ +public class EarthApp { + + private static Logger logger; + private static ServerController serverController; + private static EarthApp earthApp; + + private static void closeSplash() { + try { + final SplashScreen splash = SplashScreen.getSplashScreen(); + if (splash != null) { + splash.close(); + } + } catch (final IllegalStateException e) { + logger.error("Error closing the splash window", e); //$NON-NLS-1$ + } + } + + /** + * Start the application, opening Google Earth and starting the Jetty server. + * + * @param args + * No arguments are used by this method. + */ + public static void main(String[] args) { + + try { + + // System property used in the web.xml configuration + System.setProperty("collectEarth.userFolder", FolderFinder.getCollectEarthDataFolder()); //$NON-NLS-1$ + + // Specify a browser as http.agent so that calls to CloudFlare hosted OpenForis.org do not return with a 403 http error + System.setProperty("http.agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2"); + + initializeSentry(); + + // Change of font so that Lao and Thao glyphs are supported + CollectEarthUtils.setFontDependingOnLanguaue( getLocalProperties().getUiLanguage() ); + + logger = LoggerFactory.getLogger(EarthApp.class); + + String doubleClickedProjectFile = null; + + if (args != null && args.length == 1) { + doubleClickedProjectFile = args[0]; + }else if( getProjectsService().getProjectList().size() == 0 ){ + doubleClickedProjectFile = "resources/demo_survey.cep"; + } + + if ( SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX){ + handleMacStartup( doubleClickedProjectFile ); + }else{ + startCollectEarth( doubleClickedProjectFile ); + } + + } catch (final Exception e) { + // The logger factory has not been initialized, this will not work, just output to console + if (logger != null) { + logger.error("The server could not start", e); //$NON-NLS-1$ + } + System.exit(1); + } finally { + closeSplash(); + } + } + + private static void initializeSentry() { + try { + String releaseName= UpdateIniUtils.getReleaseNameInstalled(); + + Sentry.init("https://24dd6a90c1e4461484712db99c3b3bb7:831e42661c5c4ff3aa5eca270db3f619@sentry.io/299626?release="+releaseName+"&maxmessagelength=2000" ); + if( !StringUtils.isEmpty( UpdateIniUtils.getVersionInstalled() ) ) { + Sentry.setTag( "ReleaseDate", UpdateIniUtils.getVersionInstalled() ); + } + if( !StringUtils.isEmpty( getLocalProperties().getOperator() ) ) { + User user = new User(); + user.setUsername( getLocalProperties().getOperator() ); + Sentry.setUser(user); + } + + } catch (Exception e) { + logger.error( "Error initializing Sentry logger" , e); + } + } + /** + * Special code that uses reflection to handle how the application should behave in Mac OS X. + * Without reflection the code provokes compilation-time errors. + * @param doubleClickedProjectFile Project file (CEP) that was clicked + * @throws Exception Throws Exception when the process fails to open the file double-clicked. Initializes the server in any case + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + public static void handleMacStartup(String doubleClickedProjectFile) throws Exception{ + try { + Class applicationClass = Class.forName("com.apple.eawt.Application"); + Method getApplicationMethod = applicationClass.getMethod("getApplication"); + Method setDockIconImageMethod = applicationClass.getMethod( "setDockIconImage", Image.class ); + + Class openFilesHandlerInterface = Class.forName("com.apple.eawt.OpenFilesHandler"); + Method setOpenFileHandlerMethod = applicationClass.getMethod( "setOpenFileHandler", openFilesHandlerInterface ); + + // SET THE MAC OS X DOCK ICON! + // Get an Application object + Object applicationObject = getApplicationMethod.invoke( null ); + try { + Image dockIconImage = new ImageIcon(new File("images/dockIconMac.png").toURI().toURL()).getImage(); + // Invoke the setDockIconImage on the application object using the dockIconImage as an argument + setDockIconImageMethod.invoke(applicationObject, dockIconImage ); + } catch (MalformedURLException e2) { + logger.error("Problems finding the docker icon", e2); + } + // ------------------------------------------- + + + // DEFINE A LISTENER THAT IS REGISTERED BY THE OS TO HEAR DOUBLE-CLICK EVENTS AND REGISTER ITSELF AS THE CEP OPENER + MacOpenFilesInvocationHandler macOpenFileHandlerProxyInterface = new MacOpenFilesInvocationHandler(); + Object openFilesHandlerImplementation = Proxy.newProxyInstance( + applicationClass.getClassLoader(), + new Class[]{ openFilesHandlerInterface }, + macOpenFileHandlerProxyInterface + ); + + // Call the setOpenFileHandler method of the application object using the + setOpenFileHandlerMethod.invoke(applicationObject, ( openFilesHandlerInterface.cast( openFilesHandlerImplementation ) ) ); + + // Lets wait for the Apple event to arrive. If it did then the earthApp variable will be non-nulls + Thread.sleep(2000); + if( earthApp == null ){ + startCollectEarth( doubleClickedProjectFile ); + } + } catch (Exception e) { + logger.error("Error while defining the double-click behaviour on CEP files in Mac OS X", e); + startCollectEarth( null ); + } + } + + public void generateKml() { + + try { + getKmlGeneratorService().generateKmlFile(); + } catch (final KmlGenerationException e) { + logger.error("Problems while generating the KML file ", e); //$NON-NLS-1$ + showMessage("Problems while generating the KML file:
" + (e.getCause()!=null?(e.getCause()+"
"):"") + ( e.getMessage().length() > 300?e.getMessage().substring(0,300):e.getMessage() ) + ""); //$NON-NLS-1$ + } catch (final Exception e) { + logger.error("Could not generate KML file", e); //$NON-NLS-1$ + showMessage("Error generating KML file :
" + e.getMessage()); //$NON-NLS-1$ + } + } + + public static void openProjectFileInRunningCollectEarth(String doubleClickedProjecFile) throws IOException { + final File projectFile = new File(doubleClickedProjecFile); + + if (projectFile.exists()) { + + String hostAddress = ServerController.getHostAddress( getLocalProperties().getHost(), getLocalProperties().getPort()); + + URL loadProjectFileInRunningCE = new URL(hostAddress + LoadProjectFileServlet.SERVLET_NAME + + "?" + LoadProjectFileServlet.PROJECT_FILE_PARAMETER + "=" + //$NON-NLS-1$ //$NON-NLS-2$ + URLEncoder.encode(doubleClickedProjecFile, StandardCharsets.UTF_8.name() ) ); + URLConnection urlConn = loadProjectFileInRunningCE.openConnection(); + + try( BufferedReader in = new BufferedReader(new InputStreamReader(urlConn.getInputStream())) ){ + String inputLine; + while ((inputLine = in.readLine()) != null) { + logger.info(inputLine); + } + } + + } + } + + private static boolean isAnotherCollectEarthRunning(LocalPropertiesService localProperties) { + boolean alreadyRunning = false; + try { + new Socket( LocalPropertiesService.LOCAL_HOST , Integer.parseInt(localProperties.getPort())).close(); //$NON-NLS-1$ + // If here there is something is serving on port 8028 + // So stop it + logger.warn("There is a server already running {}", localProperties.getPort()); //$NON-NLS-1$ + alreadyRunning = true; + } catch (final IOException e) { + // Nothing there, so OK to proceed + logger.info("There is no server running in port {}", localProperties.getPort()); //$NON-NLS-1$ + alreadyRunning = false; + } catch (final NumberFormatException e) { + // Nothing there, so OK to proceed + logger.info("Error parsing integer value {}", localProperties.getPort()); //$NON-NLS-1$ + alreadyRunning = false; + } + return alreadyRunning; + } + + public static void quitServer() { + try { + serverController.stopServer(); + } catch (Exception e) { + logger.error("Error stoping server", e); //$NON-NLS-1$ + } + } + + /** + * Generates the KML for the project and opens it in Google Earth + * @param forceKmlRecreation Set to true if you want to forece the regeneration of the KML even if is is up to date (you might want to do this to force the update of the placemark icons as the date changes) + * @throws IOException Throws exception if the KMl file cannot be generated + * @throws KmlGenerationException Throws exception if the KML file contents cannot be generated + * @throws CsvValidationException + */ + private static synchronized void loadKmlInGoogleEarth(boolean forceKmlRecreation) throws IOException, KmlGenerationException, CsvValidationException { + earthApp.getKmlGeneratorService().generatePlacemarksKmzFile( forceKmlRecreation ); + earthApp.simulateClickKmz(); + } + + public static void restart() { + try { + + serverController.stopServer(); + startServer(null); + + } catch (final Exception e) { + logger.error("Error while stopping server", e); //$NON-NLS-1$ + } + } + + private static LocalPropertiesService nonManagedPropertiesService; + + + private static LocalPropertiesService getLocalProperties() { + if (serverController == null || serverController.getContext() == null) { + if (nonManagedPropertiesService == null) { + nonManagedPropertiesService = new LocalPropertiesService(); + } + return nonManagedPropertiesService; + } else { + return serverController.getContext().getBean(LocalPropertiesService.class); + } + } + + private static EarthProjectsService getProjectsService() { + if (serverController != null) { + return serverController.getContext().getBean(EarthProjectsService.class); + } else { + final EarthProjectsService earthProjectsService = new EarthProjectsService(); + earthProjectsService.init(getLocalProperties()); + return earthProjectsService; + } + } + + + private KmlGeneratorService getKmlGeneratorService() { + if (serverController != null) { + return serverController.getContext().getBean(KmlGeneratorService.class); + } else { + throw new IllegalStateException("The server must be initialized before this method is called"); //$NON-NLS-1$ + } + } + + private static void startCollectEarth(final String doubleClickedProjectFile) throws Exception { + logger.info("START - Server Initilization"); //$NON-NLS-1$ + final boolean ceAlreadyOpen = isAnotherCollectEarthRunning( getLocalProperties()); + + if( ceAlreadyOpen ){ + closeSplash(); + // If the user double clicked on a project file while Collect Earth is running then load the project in the running Collect Earth + if (doubleClickedProjectFile!=null) { + openProjectFileInRunningCollectEarth(doubleClickedProjectFile); + }else{ + showMessage(Messages.getString("EarthApp.11")); //$NON-NLS-1$ + } + }else{ + + startServer(doubleClickedProjectFile); + } + + GAlogger.logGAnalytics("Start"); + } + + public static void startServer(final String doubleClickedProjectFile) + throws Exception { + earthApp = new EarthApp(); + + // Load the double-clicked CEP file before the survey manager is instantiated by the server start-up + earthApp.loadProjectIfDoubleClicked(doubleClickedProjectFile); + + + final Observer observeInitialization = getServerObserver(); + serverStartAndOpenGe(observeInitialization); + } + + private static Observer getServerObserver() { + return (observable, initializationEvent) ->{ + if (initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT)) { + serverController = null; + } + + if( initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT) || + initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT) ){ + + showMessage( initializationEvent.toString()); + } + + if (!initializationEvent.equals(ServerInitializationEvent.SERVER_STOPPED_EVENT)) { + try { + earthApp.generateKml(); + earthApp.simulateClickKmz(); + earthApp.checkForUpdates(); + closeSplash(); + } catch (final Exception e) { + logger.error("Error generating KML file", e); //$NON-NLS-1$ + } + } + }; + } + + private void openKmlOnGoogleEarth(){ + if (! CollectEarthUtils.openFile( new File(KmlGeneratorService.KML_NETWORK_LINK_STARTER)) ) { + showMessage("The KML file cannot be open at " + KmlGeneratorService.KML_NETWORK_LINK_STARTER); //$NON-NLS-1$ + } + } + + private void checkForUpdates() { + new Thread("Check for new Collect Earth versions on the server") { + @Override + public void run() { + + // Wait a few seconds before checking for updates + try { + Thread.sleep(10000); + } catch (InterruptedException e1) { + logger.error("Error while waiting", e1); //$NON-NLS-1$ + } + + final UpdateIniUtils updateIniUtils = new UpdateIniUtils(); + + + if (updateIniUtils.shouldWarnUser(getLocalProperties() )) { + + javax.swing.SwingUtilities.invokeLater( () -> { + String remindLater = Messages.getString("EarthApp.3"); //$NON-NLS-1$ + String doItNow = Messages.getString("EarthApp.4"); //$NON-NLS-1$ + String doNotBother = Messages.getString("EarthApp.5"); //$NON-NLS-1$ + + String newestVersionOnline = updateIniUtils.getVersionAvailableOnline(); + + if( StringUtils.isNotBlank( newestVersionOnline ) ) { + + Object[] possibleValues = { remindLater, doItNow, doNotBother }; + int chosenOption = JOptionPane.showOptionDialog(null, + Messages.getString("EarthApp.57"), Messages.getString("EarthApp.58") + Messages.getString("EarthApp.6") + updateIniUtils.convertToDate(newestVersionOnline), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, possibleValues, possibleValues[0]); + if( chosenOption != JOptionPane.CLOSED_OPTION ){ + if (possibleValues[chosenOption].equals(doItNow)) { + CheckForUpdatesListener checkForUpdatesListener = new CheckForUpdatesListener(); + checkForUpdatesListener.actionPerformed(null); + } else if (possibleValues[chosenOption].equals(doNotBother)) { + getLocalProperties().setValue(EarthProperty.LAST_IGNORED_UPDATE, newestVersionOnline); + } + } + } + }); + } + } + }.start(); + + } + + + /** + * If Collect Earth is started by double clicking on a ".cep" file ( Collect Earth Project file ) + * Then it should open directly with that project in focus + * + * @param doubleClickedProjecFile + * The path to the CEP file that was double-clicked + * + */ + private void loadProjectIfDoubleClicked(String doubleClickedProjectFile) { + try { + if (doubleClickedProjectFile != null) { + + final File projectFile = new File(doubleClickedProjectFile); + + if (projectFile.exists()) { + getProjectsService().loadCompressedProjectFile(projectFile); + } + } + } catch (final Exception e) { + showMessage(Messages.getString("EarthApp.59")); //$NON-NLS-1$ + logger.error(Messages.getString("EarthApp.59"), e);//$NON-NLS-1$ + } + } + + private static void serverStartAndOpenGe(Observer observeInitialization) throws Exception { + serverController = new ServerController(); + serverController.deleteObservers(); + serverController.startServer(observeInitialization); + + // Inform Mac OS users of the issues about opening CEP files in the Mac version of CE + if(SystemUtils.IS_OS_MAC_OSX ) { + showMessage( + "" //$NON-NLS-1$ + + "" //$NON-NLS-1$ + + Messages.getString("EarthApp.70") + + ": " //$NON-NLS-1$ + + Messages.getString("EarthApp.71") + + Messages.getString("EarthApp.72") + + "" //$NON-NLS-1$ + + Messages.getString("CollectEarthWindow.10") + + " -> " //$NON-NLS-1$ + + Messages.getString("CollectEarthMenu.0") + + "", //$NON-NLS-1$ + Messages.getString("EarthApp.73") + ); + } + } + + public static void showMessage(String message) { + showMessage(message, "Collect Earth"); + + } + + public static void showMessage(String message, String title) { + try { + SwingUtilities.invokeLater( + () -> JOptionPane.showMessageDialog(null, message, title, JOptionPane.WARNING_MESSAGE) + ); + } catch (Exception e) { + logger.error("Error showing message",e); + } + + } + + private void simulateClickKmz() { + try { + getKmlGeneratorService().generateLoaderKmlFile(); + openKmlOnGoogleEarth(); + } catch (final Exception e) { + showMessage(Messages.getString("EarthApp.61")); //$NON-NLS-1$ + logger.error("The KMZ file could not be found", e); //$NON-NLS-1$ + } + } + + public static void executeKmlLoadAsynchronously( Window windowShowingTimer ) { + new Thread("Load KML in Google Earth"){ + @Override + public void run() { + // Only regenerate KML and reload + try { + SwingUtilities.invokeLater( ( ) -> { + if( windowShowingTimer != null ){ + CollectEarthWindow.startWaiting(windowShowingTimer); + } + }); + + EarthApp.loadKmlInGoogleEarth(true); + + } catch (Exception e) { + logger.error("Error loading the KML",e); + EarthApp.showMessage("Problems while generating the KML file:
" + + (e.getCause()!=null?(e.getCause()+"
"):"") + + ( + ( e.getMessage()!=null && e.getMessage().length() > 300 ) ? e.getMessage().substring(0,300) : + ( e.getMessage()!=null ) ? e.getMessage() : "" + ) + ""); //$NON-NLS-1$ + }finally{ + if( windowShowingTimer != null ){ + try { + SwingUtilities.invokeLater( () -> { + CollectEarthWindow.endWaiting(windowShowingTimer); + if( windowShowingTimer instanceof PropertiesDialog ){ + ( (PropertiesDialog) windowShowingTimer).closeDialog(); + } + }); + } catch (Exception e2) { + logger.error("Error closing Options dialog", e2); + } + } + } + + } + }.start(); + } + + +} From 2fd09189eea533b64efedfdbb3e24956c282c751 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:16 +0100 Subject: [PATCH 0994/1620] New translations EarthApp.java (Spanish) --- .../earth/app/view/Messages_es.properties | 2429 ++++------------- 1 file changed, 534 insertions(+), 1895 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 768f973a7f..0777f46090 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,1895 +1,534 @@ -package org.openforis.collect.earth.app.ad_hoc; - -import java.util.ArrayList; -import java.util.Arrays; - -public class findMissingCountries { - - private static ArrayList allCountryNames = new ArrayList<>( - Arrays.asList( - "Abyei", - "Afghanistan", - "Aksai_Chin", - "Albania", - "Algeria", - "American_Samoa", - "Andorra", - "Angola", - "Anguilla", - "Antarctica", - "Antigua_and_Barbuda", - "Argentina", - "Armenia", - "Aruba", - "Arunachal_Pradesh", - "Ashmore_and_Cartier_Islands", - "Australia", - "Austria", - "Azerbaijan", - "Azores_Islands", - "Bahamas", - "Bahrain", - "Baker_Island", - "Bangladesh", - "Barbados", - "Bassas_da_India", - "Belarus", - "Belgium", - "Belize", - "Benin", - "Bermuda", - "Bhutan", - "Bird_Island", - "Bolivia", - "Bosnia_and_Herzegovina", - "Botswana", - "Bouvet_Island", - "Brazil", - "British_Indian_Ocean_Territory", - "British_Virgin_Islands", - "Brunei_Darussalam", - "Bulgaria", - "Burkina_Faso", - "Burundi", - "Cambodia", - "Cameroon", - "Canada", - "Cape_Verde", - "Cayman_Islands", - "Central_African_Republic", - "Chad", - "Chile", - "China", - "China/India", - "Christmas_Island", - "Clipperton_Island", - "Cocos__Keeling__Islands", - "Colombia", - "Comoros", - "Congo", - "Cook_Islands", - "Costa_Rica", - "Croatia", - "Cuba", - "Cyprus", - "Czech_Republic", - "C�te_d_Ivoire", - "Dem_People_s_Rep_of_Korea", - "Democratic_Republic_of_the_Congo", - "Denmark", - "Djibouti", - "Dominica", - "Dominican_Republic", - "Ecuador", - "Egypt", - "El_Salvador", - "Equatorial_Guinea", - "Eritrea", - "Estonia", - "Ethiopia", - "Europa_Island", - "Falkland_Islands__Malvinas_", - "Faroe_Islands", - "Fiji", - "Finland", - "France", - "French_Guiana", - "French_Polynesia", - "French_Southern_and_Antarctic_Territories", - "Gabon", - "Gambia", - "Gaza_Strip", - "Georgia", - "Germany", - "Ghana", - "Gibraltar", - "Glorioso_Island", - "Greece", - "Greenland", - "Grenada", - "Guadeloupe", - "Guam", - "Guatemala", - "Guernsey", - "Guinea", - "Guinea-Bissau", - "Guyana", - "Haiti", - "Hala_ib_triangle", - "Heard_Island_and_McDonald_Islands", - "Holy_See", - "Honduras", - "Hong_Kong", - "Howland_Island", - "Hungary", - "Iceland", - "Ilemi_triangle", - "India", - "Indonesia", - "Iran___Islamic_Republic_of_", - "Iraq", - "Ireland", - "Isle_of_Man", - "Israel", - "Italy", - "Jamaica", - "Jammu_and_Kashmir", - "Japan", - "Jarvis_Island", - "Jersey", - "Johnston_Atoll", - "Jordan", - "Juan_de_Nova_Island", - "Kazakhstan", - "Kenya", - "Kingman_Reef", - "Kiribati", - "Kuril_islands", - "Kuwait", - "Kyrgyzstan", - "Lao_People_s_Democratic_Republic", - "Latvia", - "Lebanon", - "Lesotho", - "Liberia", - "Libya", - "Liechtenstein", - "Lithuania", - "Luxembourg", - "Ma_tan_al-Sarra", - "Macau", - "Madagascar", - "Madeira_Islands", - "Malawi", - "Malaysia", - "Maldives", - "Mali", - "Malta", - "Marshall_Islands", - "Martinique", - "Mauritania", - "Mauritius", - "Mayotte", - "Mexico", - "Micronesia__Federated_States_of_", - "Midway_Island", - "Moldova,_Republic_of", - "Monaco", - "Mongolia", - "Montenegro", - "Montserrat", - "Morocco", - "Mozambique", - "Myanmar", - "Namibia", - "Nauru", - "Navassa_Island", - "Nepal", - "Netherlands", - "Netherlands_Antilles", - "New_Caledonia", - "New_Zealand", - "Nicaragua", - "Niger", - "Nigeria", - "Niue", - "Norfolk_Island", - "Northern_Mariana_Islands", - "Norway", - "Oman", - "Pakistan", - "Palau", - "Palmyra_Atoll", - "Panama", - "Papua_New_Guinea", - "Paracel_Islands", - "Paraguay", - "Peru", - "Philippines", - "Pitcairn", - "Poland", - "Portugal", - "Puerto_Rico", - "Qatar", - "Republic_of_Korea", - "Romania", - "Russian_Federation", - "Rwanda", - "R�union", - "Saint_Helena", - "Saint_Kitts_and_Nevis", - "Saint_Lucia", - "Saint_Pierre_et_Miquelon", - "Saint_Vincent_and_the_Grenadines", - "Samoa", - "San_Marino", - "Sao_Tome_and_Principe", - "Saudi_Arabia", - "Scarborough_Reef", - "Senegal", - "Senkaku_Islands", - "Serbia", - "Seychelles", - "Sierra_Leone", - "Singapore", - "Slovakia", - "Slovenia", - "Solomon_Islands", - "Somalia", - "South_Africa", - "South_Georgia_and_the_South_Sandwich_Islands", - "South_Sudan", - "Spain", - "Spratly_Islands", - "Sri_Lanka", - "Sudan", - "Suriname", - "Svalbard_and_Jan_Mayen_Islands", - "Swaziland", - "Sweden", - "Switzerland", - "Syrian_Arab_Republic", - "Taiwan", - "Tajikistan", - "Thailand", - "The_former_Yugoslav_Republic_of_Macedonia", - "Timor-Leste", - "Togo", - "Tokelau", - "Tonga", - "Trinidad_and_Tobago", - "Tromelin_Island", - "Tunisia", - "Turkey", - "Turkmenistan", - "Turks_and_Caicos_islands", - "Tuvalu", - "UK_of_Great_Britain_and_Northern_Ireland", - "Uganda", - "Ukraine", - "United_Arab_Emirates", - "United_Republic_of_Tanzania", - "United_States_Virgin_Islands", - "United_States_of_America", - "Uruguay", - "Uzbekistan", - "Vanuatu", - "Venezuela", - "Viet_Nam", - "Wake_Island", - "Wallis_and_Futuna", - "West_Bank", - "Western_Sahara", - "Yemen", - "Zambia", - "Zimbabwe" ) ); - - private static ArrayList filesGenerated = new ArrayList<>( - Arrays.asList( "Azores_Islands_bassin_10", - "Azores_Islands_bassin_11", - "Azores_Islands_bassin_12", - "Azores_Islands", - "Azores_Islands_bassin_5", - "Azores_Islands_bassin_6", - "Azores_Islands_bassin_7", - "Azores_Islands_bassin_8", - "Azores_Islands_bassin_9", - "Brunei_Darussalam_bassin_10", - "Brunei_Darussalam_bassin_11", - "Brunei_Darussalam_bassin_12", - "Brunei_Darussalam_bassin_7", - "Brunei_Darussalam_bassin_8", - "Brunei_Darussalam_bassin_9", - "Bulgaria_bassin_10", - "Bulgaria_bassin_11", - "Bulgaria_bassin_12", - "Bulgaria", - "Bulgaria_bassin_5", - "Bulgaria_bassin_6", - "Bulgaria_bassin_7", - "Bulgaria_bassin_8", - "Bulgaria_bassin_9", - "Burkina_Faso_bassin_10", - "Burkina_Faso_bassin_11", - "Burkina_Faso_bassin_12", - "Burkina_Faso", - "Burkina_Faso_bassin_5", - "Burkina_Faso_bassin_6", - "Burkina_Faso_bassin_7", - "Burkina_Faso_bassin_8", - "Burkina_Faso_bassin_9", - "Burundi_bassin_10", - "Burundi_bassin_11", - "Burundi_bassin_12", - "Burundi", - "Burundi_bassin_5", - "Burundi_bassin_6", - "Burundi_bassin_7", - "Burundi_bassin_8", - "Burundi_bassin_9", - "Cambodia_bassin_10", - "Cambodia_bassin_11", - "Cambodia_bassin_12", - "Cambodia", - "Cambodia_bassin_5", - "Cambodia_bassin_6", - "Cambodia_bassin_7", - "Cambodia_bassin_8", - "Cambodia_bassin_9", - "Cameroon_bassin_10", - "Cameroon_bassin_11", - "Cameroon_bassin_12", - "Cameroon", - "Cameroon_bassin_5", - "Cameroon_bassin_6", - "Cameroon_bassin_7", - "Cameroon_bassin_8", - "Cameroon_bassin_9", - "Canada_bassin_10", - "Canada_bassin_11", - "Canada_bassin_12", - "Canada", - "Canada_bassin_5", - "Canada_bassin_6", - "Canada_bassin_7", - "Canada_bassin_8", - "Canada_bassin_9", - "Cape_Verde_bassin_10", - "Cape_Verde_bassin_11", - "Cape_Verde_bassin_12", - "Cape_Verde", - "Cape_Verde_bassin_5", - "Cape_Verde_bassin_6", - "Cape_Verde_bassin_7", - "Cape_Verde_bassin_8", - "Cape_Verde_bassin_9", - "Cayman_Islands_bassin_10", - "Cayman_Islands_bassin_11", - "Cayman_Islands_bassin_12", - "Cayman_Islands", - "Cayman_Islands_bassin_5", - "Cayman_Islands_bassin_6", - "Cayman_Islands_bassin_7", - "Cayman_Islands_bassin_8", - "Cayman_Islands_bassin_9", - "Central_African Republic_bassin_10", - "Central_African Republic_bassin_11", - "Central_African Republic_bassin_12", - "Central_African Republic", - "Central_African Republic_bassin_5", - "Central_African Republic_bassin_6", - "Central_African Republic_bassin_7", - "Central_African Republic_bassin_8", - "Central_African Republic_bassin_9", - "Chad_bassin_10", - "Chad_bassin_11", - "Chad_bassin_12", - "Chad", - "Chad_bassin_5", - "Chad_bassin_6", - "Chad_bassin_7", - "Chad_bassin_8", - "Chad_bassin_9", - "Chile_bassin_10", - "Chile_bassin_11", - "Chile_bassin_12", - "Chile", - "Chile_bassin_5", - "Chile_bassin_6", - "Chile_bassin_7", - "Chile_bassin_8", - "Chile_bassin_9", - "China_bassin_10", - "China_bassin_11", - "China_bassin_12", - "China", - "China_bassin_5", - "China_bassin_6", - "China_bassin_7", - "China_bassin_8", - "China_bassin_9", - "Christmas_Island_bassin_10", - "Christmas_Island_bassin_11", - "Christmas_Island_bassin_12", - "Christmas_Island", - "Christmas_Island_bassin_5", - "Christmas_Island_bassin_6", - "Christmas_Island_bassin_7", - "Christmas_Island_bassin_8", - "Christmas_Island_bassin_9", - "Clipperton_Island_bassin_10", - "Clipperton_Island_bassin_11", - "Clipperton_Island_bassin_12", - "Clipperton_Island", - "Clipperton_Island_bassin_5", - "Clipperton_Island_bassin_6", - "Clipperton_Island_bassin_7", - "Clipperton_Island_bassin_8", - "Clipperton_Island_bassin_9", - "Colombia_bassin_10", - "Colombia_bassin_11", - "Colombia_bassin_12", - "Colombia", - "Colombia_bassin_5", - "Colombia_bassin_6", - "Colombia_bassin_7", - "Colombia_bassin_8", - "Colombia_bassin_9", - "Comoros_bassin_10", - "Comoros_bassin_11", - "Comoros_bassin_12", - "Comoros", - "Comoros_bassin_5", - "Comoros_bassin_6", - "Comoros_bassin_7", - "Comoros_bassin_8", - "Comoros_bassin_9", - "Congo_bassin_10", - "Congo_bassin_11", - "Congo_bassin_12", - "Congo", - "Congo_bassin_5", - "Congo_bassin_6", - "Congo_bassin_7", - "Congo_bassin_8", - "Congo_bassin_9", - "Cook_Islands_bassin_10", - "Cook_Islands_bassin_11", - "Cook_Islands_bassin_12", - "Cook_Islands", - "Cook_Islands_bassin_5", - "Cook_Islands_bassin_6", - "Cook_Islands_bassin_7", - "Cook_Islands_bassin_8", - "Cook_Islands_bassin_9", - "Costa_Rica_bassin_10", - "Costa_Rica_bassin_11", - "Costa_Rica_bassin_12", - "Costa_Rica", - "Costa_Rica_bassin_5", - "Costa_Rica_bassin_6", - "Costa_Rica_bassin_7", - "Costa_Rica_bassin_8", - "Costa_Rica_bassin_9", - "Croatia_bassin_10", - "Croatia_bassin_11", - "Croatia_bassin_12", - "Croatia", - "Croatia_bassin_5", - "Croatia_bassin_6", - "Croatia_bassin_7", - "Croatia_bassin_8", - "Croatia_bassin_9", - "Cuba_bassin_10", - "Cuba_bassin_11", - "Cuba_bassin_12", - "Cuba", - "Cuba_bassin_5", - "Cuba_bassin_6", - "Cuba_bassin_7", - "Cuba_bassin_8", - "Cuba_bassin_9", - "Cyprus_bassin_10", - "Cyprus_bassin_11", - "Cyprus_bassin_12", - "Cyprus", - "Cyprus_bassin_5", - "Cyprus_bassin_6", - "Cyprus_bassin_7", - "Cyprus_bassin_8", - "Cyprus_bassin_9", - "Czech_Republic_bassin_10", - "Czech_Republic_bassin_11", - "Czech_Republic_bassin_12", - "Czech_Republic", - "Czech_Republic_bassin_5", - "Czech_Republic_bassin_6", - "Czech_Republic_bassin_7", - "Czech_Republic_bassin_8", - "Czech_Republic_bassin_9", - "Democratic_Republic of the Congo_bassin_10", - "Democratic_Republic of the Congo_bassin_11", - "Democratic_Republic of the Congo_bassin_12", - "Democratic_Republic of the Congo", - "Democratic_Republic of the Congo_bassin_5", - "Democratic_Republic of the Congo_bassin_6", - "Democratic_Republic of the Congo_bassin_7", - "Democratic_Republic of the Congo_bassin_8", - "Democratic_Republic of the Congo_bassin_9", - "Dem_Peoples Rep of Korea_bassin_10", - "Dem_Peoples Rep of Korea_bassin_11", - "Dem_Peoples Rep of Korea_bassin_12", - "Dem_Peoples Rep of Korea", - "Dem_Peoples Rep of Korea_bassin_5", - "Dem_Peoples Rep of Korea_bassin_6", - "Dem_Peoples Rep of Korea_bassin_7", - "Dem_Peoples Rep of Korea_bassin_8", - "Dem_Peoples Rep of Korea_bassin_9", - "Denmark_bassin_10", - "Denmark_bassin_11", - "Denmark_bassin_12", - "Denmark", - "Denmark_bassin_5", - "Denmark_bassin_6", - "Denmark_bassin_7", - "Denmark_bassin_8", - "Denmark_bassin_9", - "Djibouti_bassin_10", - "Djibouti_bassin_11", - "Djibouti_bassin_12", - "Djibouti", - "Djibouti_bassin_5", - "Djibouti_bassin_6", - "Djibouti_bassin_7", - "Djibouti_bassin_8", - "Djibouti_bassin_9", - "Dominican_Republic_bassin_10", - "Dominican_Republic_bassin_11", - "Dominican_Republic_bassin_12", - "Dominican_Republic", - "Dominican_Republic_bassin_5", - "Dominican_Republic_bassin_6", - "Dominican_Republic_bassin_7", - "Dominican_Republic_bassin_8", - "Dominican_Republic_bassin_9", - "Dominica_bassin_10", - "Dominica_bassin_11", - "Dominica_bassin_12", - "Dominica", - "Dominica_bassin_5", - "Dominica_bassin_6", - "Dominica_bassin_7", - "Dominica_bassin_8", - "Dominica_bassin_9", - "Ecuador_bassin_10", - "Ecuador_bassin_11", - "Ecuador_bassin_12", - "Ecuador", - "Ecuador_bassin_5", - "Ecuador_bassin_6", - "Ecuador_bassin_7", - "Ecuador_bassin_8", - "Ecuador_bassin_9", - "Egypt_bassin_10", - "Egypt_bassin_11", - "Egypt_bassin_12", - "Egypt", - "Egypt_bassin_5", - "Egypt_bassin_6", - "Egypt_bassin_7", - "Egypt_bassin_8", - "Egypt_bassin_9", - "El_Salvador_bassin_10", - "El_Salvador_bassin_11", - "El_Salvador_bassin_12", - "El_Salvador", - "El_Salvador_bassin_5", - "El_Salvador_bassin_6", - "El_Salvador_bassin_7", - "El_Salvador_bassin_8", - "El_Salvador_bassin_9", - "Equatorial_Guinea_bassin_10", - "Equatorial_Guinea_bassin_11", - "Equatorial_Guinea_bassin_12", - "Equatorial_Guinea", - "Equatorial_Guinea_bassin_5", - "Equatorial_Guinea_bassin_6", - "Equatorial_Guinea_bassin_7", - "Equatorial_Guinea_bassin_8", - "Equatorial_Guinea_bassin_9", - "Eritrea_bassin_10", - "Eritrea_bassin_11", - "Eritrea_bassin_12", - "Eritrea", - "Eritrea_bassin_5", - "Eritrea_bassin_6", - "Eritrea_bassin_7", - "Eritrea_bassin_8", - "Eritrea_bassin_9", - "Estonia_bassin_10", - "Estonia_bassin_11", - "Estonia_bassin_12", - "Estonia", - "Estonia_bassin_5", - "Estonia_bassin_6", - "Estonia_bassin_7", - "Estonia_bassin_8", - "Estonia_bassin_9", - "Ethiopia_bassin_10", - "Ethiopia_bassin_11", - "Ethiopia_bassin_12", - "Ethiopia", - "Ethiopia_bassin_5", - "Ethiopia_bassin_6", - "Ethiopia_bassin_7", - "Ethiopia_bassin_8", - "Ethiopia_bassin_9", - "Europa_Island_bassin_10", - "Europa_Island_bassin_11", - "Europa_Island_bassin_12", - "Europa_Island", - "Europa_Island_bassin_5", - "Europa_Island_bassin_6", - "Europa_Island_bassin_7", - "Europa_Island_bassin_8", - "Europa_Island_bassin_9", - "Faroe_Islands_bassin_10", - "Faroe_Islands_bassin_11", - "Faroe_Islands_bassin_12", - "Faroe_Islands", - "Faroe_Islands_bassin_5", - "Faroe_Islands_bassin_6", - "Faroe_Islands_bassin_7", - "Faroe_Islands_bassin_8", - "Faroe_Islands_bassin_9", - "Fiji_bassin_10", - "Fiji_bassin_11", - "Fiji_bassin_12", - "Fiji", - "Fiji_bassin_5", - "Fiji_bassin_6", - "Fiji_bassin_7", - "Fiji_bassin_8", - "Fiji_bassin_9", - "Finland_bassin_10", - "Finland_bassin_11", - "Finland_bassin_12", - "Finland", - "Finland_bassin_5", - "Finland_bassin_6", - "Finland_bassin_7", - "Finland_bassin_8", - "Finland_bassin_9", - "France_bassin_10", - "France_bassin_11", - "France_bassin_12", - "France", - "France_bassin_5", - "France_bassin_6", - "France_bassin_7", - "France_bassin_8", - "France_bassin_9", - "French_Guiana_bassin_10", - "French_Guiana_bassin_11", - "French_Guiana_bassin_12", - "French_Guiana", - "French_Guiana_bassin_5", - "French_Guiana_bassin_6", - "French_Guiana_bassin_7", - "French_Guiana_bassin_8", - "French_Guiana_bassin_9", - "French_Polynesia_bassin_10", - "French_Polynesia_bassin_11", - "French_Polynesia_bassin_12", - "French_Polynesia", - "French_Polynesia_bassin_5", - "French_Polynesia_bassin_6", - "French_Polynesia_bassin_7", - "French_Polynesia_bassin_8", - "French_Polynesia_bassin_9", - "French_Southern and Antarctic Territories_bassin_10", - "French_Southern and Antarctic Territories_bassin_11", - "French_Southern and Antarctic Territories_bassin_12", - "French_Southern and Antarctic Territories", - "French_Southern and Antarctic Territories_bassin_5", - "French_Southern and Antarctic Territories_bassin_6", - "French_Southern and Antarctic Territories_bassin_7", - "French_Southern and Antarctic Territories_bassin_8", - "French_Southern and Antarctic Territories_bassin_9", - "Gabon_bassin_10", - "Gabon_bassin_11", - "Gabon_bassin_12", - "Gabon", - "Gabon_bassin_5", - "Gabon_bassin_6", - "Gabon_bassin_7", - "Gabon_bassin_8", - "Gabon_bassin_9", - "Gambia_bassin_10", - "Gambia_bassin_11", - "Gambia_bassin_12", - "Gambia", - "Gambia_bassin_5", - "Gambia_bassin_6", - "Gambia_bassin_7", - "Gambia_bassin_8", - "Gambia_bassin_9", - "Gaza_Strip_bassin_10", - "Gaza_Strip_bassin_11", - "Gaza_Strip_bassin_12", - "Gaza_Strip", - "Gaza_Strip_bassin_5", - "Gaza_Strip_bassin_6", - "Gaza_Strip_bassin_7", - "Gaza_Strip_bassin_8", - "Gaza_Strip_bassin_9", - "Georgia_bassin_10", - "Georgia_bassin_11", - "Georgia_bassin_12", - "Georgia", - "Georgia_bassin_5", - "Georgia_bassin_6", - "Georgia_bassin_7", - "Georgia_bassin_8", - "Georgia_bassin_9", - "Germany_bassin_10", - "Germany_bassin_11", - "Germany_bassin_12", - "Germany", - "Germany_bassin_5", - "Germany_bassin_6", - "Germany_bassin_7", - "Germany_bassin_8", - "Germany_bassin_9", - "Ghana_bassin_10", - "Ghana_bassin_11", - "Ghana_bassin_12", - "Ghana", - "Ghana_bassin_5", - "Ghana_bassin_6", - "Ghana_bassin_8", - "Ghana_bassin_9", - "Gibraltar_bassin_10", - "Gibraltar_bassin_11", - "Gibraltar_bassin_12", - "Gibraltar", - "Gibraltar_bassin_5", - "Gibraltar_bassin_6", - "Gibraltar_bassin_7", - "Gibraltar_bassin_8", - "Gibraltar_bassin_9", - "Glorioso_Island_bassin_10", - "Glorioso_Island_bassin_11", - "Glorioso_Island_bassin_12", - "Glorioso_Island", - "Glorioso_Island_bassin_5", - "Glorioso_Island_bassin_6", - "Glorioso_Island_bassin_7", - "Glorioso_Island_bassin_8", - "Glorioso_Island_bassin_9", - "Greece_bassin_10", - "Greece_bassin_11", - "Greece_bassin_12", - "Greece", - "Greece_bassin_5", - "Greece_bassin_6", - "Greece_bassin_7", - "Greece_bassin_8", - "Greece_bassin_9", - "Greenland_bassin_10", - "Greenland_bassin_11", - "Greenland_bassin_12", - "Greenland", - "Greenland_bassin_5", - "Greenland_bassin_6", - "Greenland_bassin_7", - "Greenland_bassin_8", - "Greenland_bassin_9", - "Grenada_bassin_10", - "Grenada_bassin_11", - "Grenada_bassin_12", - "Grenada", - "Grenada_bassin_5", - "Grenada_bassin_6", - "Grenada_bassin_7", - "Grenada_bassin_8", - "Grenada_bassin_9", - "Guadeloupe_bassin_10", - "Guadeloupe_bassin_11", - "Guadeloupe_bassin_12", - "Guadeloupe", - "Guadeloupe_bassin_5", - "Guadeloupe_bassin_6", - "Guadeloupe_bassin_7", - "Guadeloupe_bassin_8", - "Guadeloupe_bassin_9", - "Guam_bassin_10", - "Guam_bassin_11", - "Guam_bassin_12", - "Guam", - "Guam_bassin_5", - "Guam_bassin_6", - "Guam_bassin_7", - "Guam_bassin_8", - "Guam_bassin_9", - "Halaib_triangle_bassin_10", - "Halaib_triangle_bassin_11", - "Halaib_triangle_bassin_12", - "Halaib_triangle", - "Halaib_triangle_bassin_5", - "Halaib_triangle_bassin_6", - "Halaib_triangle_bassin_7", - "Halaib_triangle_bassin_8", - "Halaib_triangle_bassin_9", - "Heard_Island and McDonald Islands_bassin_12", - "Holy_See_bassin_10", - "Holy_See_bassin_11", - "Holy_See_bassin_12", - "Holy_See", - "Holy_See_bassin_5", - "Holy_See_bassin_6", - "Holy_See_bassin_7", - "Holy_See_bassin_8", - "Holy_See_bassin_9", - "Honduras_bassin_10", - "Honduras_bassin_11", - "Honduras_bassin_12", - "Honduras", - "Honduras_bassin_5", - "Honduras_bassin_6", - "Honduras_bassin_7", - "Honduras_bassin_8", - "Honduras_bassin_9", - "Hong_Kong_bassin_10", - "Hong_Kong_bassin_11", - "Hong_Kong_bassin_12", - "Hong_Kong", - "Hong_Kong_bassin_5", - "Hong_Kong_bassin_6", - "Hong_Kong_bassin_7", - "Hong_Kong_bassin_8", - "Hong_Kong_bassin_9", - "Howland_Island_bassin_10", - "Howland_Island_bassin_11", - "Howland_Island_bassin_12", - "Howland_Island", - "Howland_Island_bassin_5", - "Howland_Island_bassin_6", - "Howland_Island_bassin_7", - "Howland_Island_bassin_8", - "Howland_Island_bassin_9", - "Hungary_bassin_10", - "Hungary_bassin_11", - "Hungary_bassin_12", - "Hungary", - "Hungary_bassin_5", - "Hungary_bassin_6", - "Hungary_bassin_7", - "Hungary_bassin_8", - "Hungary_bassin_9", - "Iceland_bassin_10", - "Iceland_bassin_11", - "Iceland_bassin_12", - "Iceland", - "Iceland_bassin_5", - "Iceland_bassin_6", - "Iceland_bassin_7", - "Iceland_bassin_8", - "Iceland_bassin_9", - "Ilemi_triangle_bassin_10", - "Ilemi_triangle_bassin_11", - "Ilemi_triangle_bassin_12", - "Ilemi_triangle", - "Ilemi_triangle_bassin_5", - "Ilemi_triangle_bassin_6", - "Ilemi_triangle_bassin_7", - "Ilemi_triangle_bassin_8", - "Ilemi_triangle_bassin_9", - "India_bassin_10", - "India_bassin_11", - "India_bassin_12", - "India", - "India_bassin_5", - "India_bassin_6", - "India_bassin_7", - "India_bassin_8", - "India_bassin_9", - "Indonesia_bassin_10", - "Indonesia_bassin_11", - "Indonesia_bassin_12", - "Indonesia", - "Indonesia_bassin_5", - "Indonesia_bassin_6", - "Indonesia_bassin_7", - "Indonesia_bassin_8", - "Indonesia_bassin_9", - "Iraq_bassin_10", - "Iraq_bassin_11", - "Iraq_bassin_12", - "Iraq", - "Iraq_bassin_5", - "Iraq_bassin_6", - "Iraq_bassin_7", - "Iraq_bassin_8", - "Iraq_bassin_9", - "Ireland_bassin_10", - "Ireland_bassin_11", - "Ireland_bassin_12", - "Ireland", - "Ireland_bassin_5", - "Ireland_bassin_6", - "Ireland_bassin_7", - "Ireland_bassin_8", - "Ireland_bassin_9", - "Isle_of Man_bassin_10", - "Isle_of Man_bassin_11", - "Isle_of Man_bassin_12", - "Isle_of Man", - "Isle_of Man_bassin_5", - "Isle_of Man_bassin_6", - "Isle_of Man_bassin_7", - "Isle_of Man_bassin_8", - "Isle_of Man_bassin_9", - "Israel_bassin_10", - "Israel_bassin_11", - "Israel_bassin_12", - "Israel", - "Israel_bassin_5", - "Israel_bassin_6", - "Israel_bassin_7", - "Israel_bassin_8", - "Israel_bassin_9", - "Italy_bassin_10", - "Italy_bassin_11", - "Italy_bassin_12", - "Italy", - "Italy_bassin_5", - "Italy_bassin_6", - "Italy_bassin_7", - "Italy_bassin_8", - "Italy_bassin_9", - "Jamaica_bassin_10", - "Jamaica_bassin_11", - "Jamaica_bassin_12", - "Jamaica", - "Jamaica_bassin_5", - "Jamaica_bassin_6", - "Jamaica_bassin_7", - "Jamaica_bassin_8", - "Jamaica_bassin_9", - "Jammu_and Kashmir_bassin_10", - "Jammu_and Kashmir_bassin_11", - "Jammu_and Kashmir_bassin_12", - "Jammu_and Kashmir", - "Jammu_and Kashmir_bassin_5", - "Jammu_and Kashmir_bassin_6", - "Jammu_and Kashmir_bassin_7", - "Jammu_and Kashmir_bassin_8", - "Jammu_and Kashmir_bassin_9", - "Japan_bassin_10", - "Japan_bassin_11", - "Japan_bassin_12", - "Japan", - "Japan_bassin_5", - "Japan_bassin_6", - "Japan_bassin_7", - "Japan_bassin_8", - "Japan_bassin_9", - "Jarvis_Island_bassin_10", - "Jarvis_Island_bassin_11", - "Jarvis_Island_bassin_12", - "Jarvis_Island", - "Jarvis_Island_bassin_5", - "Jarvis_Island_bassin_6", - "Jarvis_Island_bassin_7", - "Jarvis_Island_bassin_8", - "Jarvis_Island_bassin_9", - "Jersey_bassin_10", - "Jersey_bassin_11", - "Jersey_bassin_12", - "Jersey", - "Jersey_bassin_5", - "Jersey_bassin_6", - "Jersey_bassin_7", - "Jersey_bassin_8", - "Jersey_bassin_9", - "Johnston_Atoll_bassin_10", - "Johnston_Atoll_bassin_11", - "Johnston_Atoll_bassin_12", - "Johnston_Atoll", - "Johnston_Atoll_bassin_5", - "Johnston_Atoll_bassin_6", - "Johnston_Atoll_bassin_7", - "Johnston_Atoll_bassin_8", - "Johnston_Atoll_bassin_9", - "Jordan_bassin_10", - "Jordan_bassin_11", - "Jordan_bassin_12", - "Jordan", - "Jordan_bassin_5", - "Jordan_bassin_6", - "Jordan_bassin_7", - "Jordan_bassin_8", - "Jordan_bassin_9", - "Juan_de Nova Island_bassin_10", - "Juan_de Nova Island_bassin_11", - "Juan_de Nova Island_bassin_12", - "Juan_de Nova Island", - "Juan_de Nova Island_bassin_5", - "Juan_de Nova Island_bassin_6", - "Juan_de Nova Island_bassin_7", - "Juan_de Nova Island_bassin_8", - "Juan_de Nova Island_bassin_9", - "Kazakhstan_bassin_10", - "Kazakhstan_bassin_11", - "Kazakhstan_bassin_12", - "Kazakhstan", - "Kazakhstan_bassin_5", - "Kazakhstan_bassin_6", - "Kazakhstan_bassin_7", - "Kazakhstan_bassin_8", - "Kazakhstan_bassin_9", - "Kenya_bassin_10", - "Kenya_bassin_11", - "Kenya_bassin_12", - "Kenya", - "Kenya_bassin_5", - "Kenya_bassin_6", - "Kenya_bassin_7", - "Kenya_bassin_8", - "Kenya_bassin_9", - "Kingman_Reef_bassin_10", - "Kingman_Reef_bassin_11", - "Kingman_Reef_bassin_12", - "Kingman_Reef", - "Kingman_Reef_bassin_5", - "Kingman_Reef_bassin_6", - "Kingman_Reef_bassin_7", - "Kingman_Reef_bassin_8", - "Kingman_Reef_bassin_9", - "Kiribati_bassin_10", - "Kiribati_bassin_11", - "Kiribati_bassin_12", - "Kiribati", - "Kiribati_bassin_5", - "Kiribati_bassin_6", - "Kiribati_bassin_7", - "Kiribati_bassin_8", - "Kiribati_bassin_9", - "Kuril_islands_bassin_10", - "Kuril_islands_bassin_11", - "Kuril_islands_bassin_12", - "Kuril_islands", - "Kuril_islands_bassin_5", - "Kuril_islands_bassin_6", - "Kuril_islands_bassin_7", - "Kuril_islands_bassin_8", - "Kuril_islands_bassin_9", - "Kuwait_bassin_10", - "Kuwait_bassin_11", - "Kuwait_bassin_12", - "Kuwait", - "Kuwait_bassin_5", - "Kuwait_bassin_6", - "Kuwait_bassin_7", - "Kuwait_bassin_8", - "Kuwait_bassin_9", - "Kyrgyzstan_bassin_10", - "Kyrgyzstan_bassin_11", - "Kyrgyzstan_bassin_12", - "Kyrgyzstan", - "Kyrgyzstan_bassin_5", - "Kyrgyzstan_bassin_6", - "Kyrgyzstan_bassin_7", - "Kyrgyzstan_bassin_8", - "Kyrgyzstan_bassin_9", - "Lao_Peoples Democratic Republic_bassin_10", - "Lao_Peoples Democratic Republic_bassin_11", - "Lao_Peoples Democratic Republic_bassin_12", - "Lao_Peoples Democratic Republic", - "Lao_Peoples Democratic Republic_bassin_5", - "Lao_Peoples Democratic Republic_bassin_6", - "Lao_Peoples Democratic Republic_bassin_7", - "Lao_Peoples Democratic Republic_bassin_8", - "Lao_Peoples Democratic Republic_bassin_9", - "Latvia_bassin_10", - "Latvia_bassin_11", - "Latvia_bassin_12", - "Latvia", - "Latvia_bassin_5", - "Latvia_bassin_6", - "Latvia_bassin_7", - "Latvia_bassin_8", - "Latvia_bassin_9", - "Lebanon_bassin_10", - "Lebanon_bassin_11", - "Lebanon_bassin_12", - "Lebanon", - "Lebanon_bassin_5", - "Lebanon_bassin_6", - "Lebanon_bassin_7", - "Lebanon_bassin_8", - "Lebanon_bassin_9", - "Lesotho_bassin_10", - "Lesotho_bassin_11", - "Lesotho_bassin_12", - "Lesotho", - "Lesotho_bassin_5", - "Lesotho_bassin_6", - "Lesotho_bassin_7", - "Lesotho_bassin_8", - "Lesotho_bassin_9", - "Liberia_bassin_10", - "Liberia_bassin_11", - "Liberia_bassin_12", - "Liberia", - "Liberia_bassin_5", - "Liberia_bassin_6", - "Liberia_bassin_7", - "Liberia_bassin_8", - "Liberia_bassin_9", - "Libya_bassin_10", - "Libya_bassin_11", - "Libya_bassin_12", - "Libya", - "Libya_bassin_5", - "Libya_bassin_6", - "Libya_bassin_7", - "Libya_bassin_8", - "Libya_bassin_9", - "Liechtenstein_bassin_10", - "Liechtenstein_bassin_11", - "Liechtenstein_bassin_12", - "Liechtenstein", - "Liechtenstein_bassin_5", - "Liechtenstein_bassin_6", - "Liechtenstein_bassin_7", - "Liechtenstein_bassin_8", - "Liechtenstein_bassin_9", - "Lithuania_bassin_10", - "Lithuania_bassin_11", - "Lithuania_bassin_12", - "Lithuania", - "Lithuania_bassin_5", - "Lithuania_bassin_6", - "Lithuania_bassin_7", - "Lithuania_bassin_8", - "Lithuania_bassin_9", - "Luxembourg_bassin_10", - "Luxembourg_bassin_11", - "Luxembourg_bassin_12", - "Luxembourg", - "Luxembourg_bassin_5", - "Luxembourg_bassin_6", - "Luxembourg_bassin_7", - "Luxembourg_bassin_8", - "Luxembourg_bassin_9", - "Macau_bassin_10", - "Macau_bassin_11", - "Macau_bassin_12", - "Macau", - "Macau_bassin_5", - "Macau_bassin_6", - "Macau_bassin_7", - "Macau_bassin_8", - "Macau_bassin_9", - "Madagascar_bassin_10", - "Madagascar_bassin_11", - "Madagascar_bassin_12", - "Madagascar", - "Madagascar_bassin_5", - "Madagascar_bassin_6", - "Madagascar_bassin_7", - "Madagascar_bassin_8", - "Madagascar_bassin_9", - "Madeira_Islands_bassin_10", - "Madeira_Islands_bassin_11", - "Madeira_Islands_bassin_12", - "Madeira_Islands", - "Madeira_Islands_bassin_5", - "Madeira_Islands_bassin_6", - "Madeira_Islands_bassin_7", - "Madeira_Islands_bassin_8", - "Madeira_Islands_bassin_9", - "Malawi_bassin_10", - "Malawi_bassin_11", - "Malawi_bassin_12", - "Malawi", - "Malawi_bassin_5", - "Malawi_bassin_6", - "Malawi_bassin_7", - "Malawi_bassin_8", - "Malawi_bassin_9", - "Malaysia_bassin_10", - "Malaysia_bassin_11", - "Malaysia_bassin_12", - "Malaysia", - "Malaysia_bassin_5", - "Malaysia_bassin_6", - "Malaysia_bassin_7", - "Malaysia_bassin_8", - "Malaysia_bassin_9", - "Maldives_bassin_10", - "Maldives_bassin_11", - "Maldives_bassin_12", - "Maldives", - "Maldives_bassin_5", - "Maldives_bassin_6", - "Maldives_bassin_7", - "Maldives_bassin_8", - "Maldives_bassin_9", - "Matan_al-Sarra_bassin_10", - "Matan_al-Sarra_bassin_11", - "Matan_al-Sarra_bassin_12", - "Matan_al-Sarra", - "Matan_al-Sarra_bassin_5", - "Matan_al-Sarra_bassin_6", - "Matan_al-Sarra_bassin_7", - "Matan_al-Sarra_bassin_8", - "Matan_al-Sarra_bassin_9", - "Montenegro_bassin_10", - "Montenegro_bassin_11", - "Montenegro_bassin_12", - "Montenegro", - "Montenegro_bassin_5", - "Montenegro_bassin_6", - "Montenegro_bassin_7", - "Montenegro_bassin_8", - "Montenegro_bassin_9", - "Qatar_bassin_10", - "Qatar_bassin_11", - "Qatar_bassin_12", - "Republic_of Korea_bassin_10", - "Republic_of Korea_bassin_11", - "Republic_of Korea_bassin_12", - "Republic_of Korea", - "Republic_of Korea_bassin_5", - "Republic_of Korea_bassin_6", - "Republic_of Korea_bassin_7", - "Republic_of Korea_bassin_8", - "Republic_of Korea_bassin_9", - "Romania_bassin_10", - "Romania_bassin_11", - "Romania_bassin_12", - "Romania", - "Romania_bassin_5", - "Romania_bassin_6", - "Romania_bassin_7", - "Romania_bassin_8", - "Romania_bassin_9", - "Russian_Federation_bassin_10", - "Russian_Federation_bassin_11", - "Russian_Federation_bassin_12", - "Russian_Federation", - "Russian_Federation_bassin_5", - "Russian_Federation_bassin_6", - "Russian_Federation_bassin_7", - "Russian_Federation_bassin_8", - "Russian_Federation_bassin_9", - "Rwanda_bassin_10", - "Rwanda_bassin_11", - "Rwanda_bassin_12", - "Rwanda", - "Rwanda_bassin_5", - "Rwanda_bassin_6", - "Rwanda_bassin_7", - "Rwanda_bassin_8", - "Rwanda_bassin_9", - "Saint_Helena_bassin_10", - "Saint_Helena_bassin_11", - "Saint_Helena_bassin_12", - "Saint_Helena", - "Saint_Helena_bassin_5", - "Saint_Helena_bassin_6", - "Saint_Helena_bassin_7", - "Saint_Helena_bassin_8", - "Saint_Helena_bassin_9", - "Saint_Kitts and Nevis_bassin_10", - "Saint_Kitts and Nevis_bassin_11", - "Saint_Kitts and Nevis_bassin_12", - "Saint_Kitts and Nevis", - "Saint_Kitts and Nevis_bassin_5", - "Saint_Kitts and Nevis_bassin_6", - "Saint_Kitts and Nevis_bassin_7", - "Saint_Kitts and Nevis_bassin_8", - "Saint_Kitts and Nevis_bassin_9", - "Saint_Lucia_bassin_10", - "Saint_Lucia_bassin_11", - "Saint_Lucia_bassin_12", - "Saint_Lucia", - "Saint_Lucia_bassin_5", - "Saint_Lucia_bassin_6", - "Saint_Lucia_bassin_7", - "Saint_Lucia_bassin_8", - "Saint_Lucia_bassin_9", - "Saint_Pierre et Miquelon_bassin_10", - "Saint_Pierre et Miquelon_bassin_11", - "Saint_Pierre et Miquelon_bassin_12", - "Saint_Pierre et Miquelon", - "Saint_Pierre et Miquelon_bassin_5", - "Saint_Pierre et Miquelon_bassin_6", - "Saint_Pierre et Miquelon_bassin_7", - "Saint_Pierre et Miquelon_bassin_8", - "Saint_Pierre et Miquelon_bassin_9", - "Saint_Vincent and the Grenadines_bassin_10", - "Saint_Vincent and the Grenadines_bassin_11", - "Saint_Vincent and the Grenadines_bassin_12", - "Saint_Vincent and the Grenadines", - "Saint_Vincent and the Grenadines_bassin_5", - "Saint_Vincent and the Grenadines_bassin_6", - "Saint_Vincent and the Grenadines_bassin_7", - "Saint_Vincent and the Grenadines_bassin_8", - "Saint_Vincent and the Grenadines_bassin_9", - "Samoa_bassin_10", - "Samoa_bassin_11", - "Samoa_bassin_12", - "Samoa", - "Samoa_bassin_5", - "Samoa_bassin_6", - "Samoa_bassin_7", - "Samoa_bassin_8", - "Samoa_bassin_9", - "San_Marino_bassin_10", - "San_Marino_bassin_11", - "San_Marino_bassin_12", - "San_Marino", - "San_Marino_bassin_5", - "San_Marino_bassin_6", - "San_Marino_bassin_7", - "San_Marino_bassin_8", - "San_Marino_bassin_9", - "Sao_Tome and Principe_bassin_10", - "Sao_Tome and Principe_bassin_11", - "Sao_Tome and Principe_bassin_12", - "Sao_Tome and Principe", - "Sao_Tome and Principe_bassin_5", - "Sao_Tome and Principe_bassin_6", - "Sao_Tome and Principe_bassin_7", - "Sao_Tome and Principe_bassin_8", - "Sao_Tome and Principe_bassin_9", - "Saudi_Arabia_bassin_10", - "Saudi_Arabia_bassin_11", - "Saudi_Arabia_bassin_12", - "Saudi_Arabia", - "Saudi_Arabia_bassin_5", - "Saudi_Arabia_bassin_6", - "Saudi_Arabia_bassin_7", - "Saudi_Arabia_bassin_8", - "Saudi_Arabia_bassin_9", - "Scarborough_Reef_bassin_10", - "Scarborough_Reef_bassin_11", - "Scarborough_Reef_bassin_12", - "Scarborough_Reef", - "Scarborough_Reef_bassin_5", - "Scarborough_Reef_bassin_6", - "Scarborough_Reef_bassin_7", - "Scarborough_Reef_bassin_8", - "Scarborough_Reef_bassin_9", - "Senegal_bassin_10", - "Senegal_bassin_11", - "Senegal_bassin_12", - "Senegal", - "Senegal_bassin_5", - "Senegal_bassin_6", - "Senegal_bassin_7", - "Senegal_bassin_8", - "Senegal_bassin_9", - "Senkaku_Islands_bassin_10", - "Senkaku_Islands_bassin_11", - "Senkaku_Islands_bassin_12", - "Senkaku_Islands", - "Senkaku_Islands_bassin_5", - "Senkaku_Islands_bassin_6", - "Senkaku_Islands_bassin_7", - "Senkaku_Islands_bassin_8", - "Senkaku_Islands_bassin_9", - "Serbia_bassin_10", - "Serbia_bassin_11", - "Serbia_bassin_12", - "Serbia", - "Serbia_bassin_5", - "Serbia_bassin_6", - "Serbia_bassin_7", - "Serbia_bassin_8", - "Serbia_bassin_9", - "Seychelles_bassin_10", - "Seychelles_bassin_11", - "Seychelles_bassin_12", - "Seychelles", - "Seychelles_bassin_5", - "Seychelles_bassin_6", - "Seychelles_bassin_7", - "Seychelles_bassin_8", - "Seychelles_bassin_9", - "Sierra_Leone_bassin_10", - "Sierra_Leone_bassin_11", - "Sierra_Leone_bassin_12", - "Sierra_Leone", - "Sierra_Leone_bassin_5", - "Sierra_Leone_bassin_6", - "Sierra_Leone_bassin_7", - "Sierra_Leone_bassin_8", - "Sierra_Leone_bassin_9", - "Singapore_bassin_10", - "Singapore_bassin_11", - "Singapore_bassin_12", - "Singapore", - "Singapore_bassin_5", - "Singapore_bassin_6", - "Singapore_bassin_7", - "Singapore_bassin_8", - "Singapore_bassin_9", - "Slovakia_bassin_10", - "Slovakia_bassin_11", - "Slovakia_bassin_12", - "Slovakia", - "Slovakia_bassin_5", - "Slovakia_bassin_6", - "Slovakia_bassin_7", - "Slovakia_bassin_8", - "Slovakia_bassin_9", - "Slovenia_bassin_10", - "Slovenia_bassin_11", - "Slovenia_bassin_12", - "Slovenia", - "Slovenia_bassin_5", - "Slovenia_bassin_6", - "Slovenia_bassin_7", - "Slovenia_bassin_8", - "Slovenia_bassin_9", - "Solomon_Islands_bassin_10", - "Solomon_Islands_bassin_11", - "Solomon_Islands_bassin_12", - "Solomon_Islands", - "Solomon_Islands_bassin_5", - "Solomon_Islands_bassin_6", - "Solomon_Islands_bassin_7", - "Solomon_Islands_bassin_8", - "Solomon_Islands_bassin_9", - "Somalia_bassin_10", - "Somalia_bassin_11", - "Somalia_bassin_12", - "Somalia", - "Somalia_bassin_5", - "Somalia_bassin_6", - "Somalia_bassin_7", - "Somalia_bassin_8", - "Somalia_bassin_9", - "South_Africa_bassin_10", - "South_Africa_bassin_11", - "South_Africa_bassin_12", - "South_Africa", - "South_Africa_bassin_5", - "South_Africa_bassin_6", - "South_Africa_bassin_7", - "South_Africa_bassin_8", - "South_Africa_bassin_9", - "South_Georgia and the South Sandwich Islands_bassin_10", - "South_Georgia and the South Sandwich Islands_bassin_11", - "South_Georgia and the South Sandwich Islands_bassin_12", - "South_Georgia and the South Sandwich Islands", - "South_Georgia and the South Sandwich Islands_bassin_5", - "South_Georgia and the South Sandwich Islands_bassin_6", - "South_Georgia and the South Sandwich Islands_bassin_7", - "South_Georgia and the South Sandwich Islands_bassin_8", - "South_Georgia and the South Sandwich Islands_bassin_9", - "South_Sudan_bassin_10", - "South_Sudan_bassin_11", - "South_Sudan_bassin_12", - "South_Sudan", - "South_Sudan_bassin_5", - "South_Sudan_bassin_6", - "South_Sudan_bassin_7", - "South_Sudan_bassin_8", - "South_Sudan_bassin_9", - "Spain_bassin_10", - "Spain_bassin_11", - "Spain_bassin_12", - "Spain", - "Spain_bassin_5", - "Spain_bassin_6", - "Spain_bassin_7", - "Spain_bassin_8", - "Spain_bassin_9", - "Spratly_Islands_bassin_10", - "Spratly_Islands_bassin_11", - "Spratly_Islands_bassin_12", - "Spratly_Islands", - "Spratly_Islands_bassin_5", - "Spratly_Islands_bassin_6", - "Spratly_Islands_bassin_7", - "Spratly_Islands_bassin_8", - "Spratly_Islands_bassin_9", - "Sri_Lanka_bassin_10", - "Sri_Lanka_bassin_11", - "Sri_Lanka_bassin_12", - "Sri_Lanka", - "Sri_Lanka_bassin_5", - "Sri_Lanka_bassin_6", - "Sri_Lanka_bassin_7", - "Sri_Lanka_bassin_8", - "Sri_Lanka_bassin_9", - "Suriname_bassin_10", - "Suriname_bassin_11", - "Suriname_bassin_12", - "Suriname", - "Suriname_bassin_5", - "Suriname_bassin_6", - "Suriname_bassin_7", - "Suriname_bassin_8", - "Suriname_bassin_9", - "Svalbard_and Jan Mayen Islands_bassin_10", - "Svalbard_and Jan Mayen Islands_bassin_11", - "Svalbard_and Jan Mayen Islands_bassin_12", - "Svalbard_and Jan Mayen Islands", - "Svalbard_and Jan Mayen Islands_bassin_5", - "Svalbard_and Jan Mayen Islands_bassin_6", - "Svalbard_and Jan Mayen Islands_bassin_7", - "Svalbard_and Jan Mayen Islands_bassin_8", - "Svalbard_and Jan Mayen Islands_bassin_9", - "Swaziland_bassin_10", - "Swaziland_bassin_11", - "Swaziland_bassin_12", - "Swaziland", - "Swaziland_bassin_5", - "Swaziland_bassin_6", - "Swaziland_bassin_7", - "Swaziland_bassin_8", - "Swaziland_bassin_9", - "Sweden_bassin_10", - "Sweden_bassin_11", - "Sweden_bassin_12", - "Sweden", - "Sweden_bassin_5", - "Sweden_bassin_6", - "Sweden_bassin_7", - "Sweden_bassin_8", - "Sweden_bassin_9", - "Switzerland_bassin_10", - "Switzerland_bassin_11", - "Switzerland_bassin_12", - "Switzerland", - "Switzerland_bassin_5", - "Switzerland_bassin_6", - "Switzerland_bassin_7", - "Switzerland_bassin_8", - "Switzerland_bassin_9", - "Syrian_Arab Republic_bassin_10", - "Syrian_Arab Republic_bassin_11", - "Syrian_Arab Republic_bassin_12", - "Syrian_Arab Republic", - "Syrian_Arab Republic_bassin_5", - "Syrian_Arab Republic_bassin_6", - "Syrian_Arab Republic_bassin_7", - "Syrian_Arab Republic_bassin_8", - "Syrian_Arab Republic_bassin_9", - "Taiwan_bassin_10", - "Taiwan_bassin_11", - "Taiwan_bassin_12", - "Taiwan", - "Taiwan_bassin_5", - "Taiwan_bassin_6", - "Taiwan_bassin_7", - "Taiwan_bassin_8", - "Taiwan_bassin_9", - "Tajikistan_bassin_10", - "Tajikistan_bassin_11", - "Tajikistan_bassin_12", - "Tajikistan", - "Tajikistan_bassin_5", - "Tajikistan_bassin_6", - "Tajikistan_bassin_7", - "Tajikistan_bassin_8", - "Tajikistan_bassin_9", - "Thailand_bassin_10", - "Thailand_bassin_11", - "Thailand_bassin_12", - "Thailand", - "Thailand_bassin_5", - "Thailand_bassin_6", - "Thailand_bassin_7", - "Thailand_bassin_8", - "Thailand_bassin_9", - "The_former Yugoslav Republic of Macedonia_bassin_10", - "The_former Yugoslav Republic of Macedonia_bassin_11", - "The_former Yugoslav Republic of Macedonia_bassin_12", - "The_former Yugoslav Republic of Macedonia", - "The_former Yugoslav Republic of Macedonia_bassin_5", - "The_former Yugoslav Republic of Macedonia_bassin_6", - "The_former Yugoslav Republic of Macedonia_bassin_7", - "The_former Yugoslav Republic of Macedonia_bassin_8", - "The_former Yugoslav Republic of Macedonia_bassin_9", - "Timor-Leste_bassin_10", - "Timor-Leste_bassin_11", - "Timor-Leste_bassin_12", - "Timor-Leste", - "Timor-Leste_bassin_5", - "Timor-Leste_bassin_6", - "Timor-Leste_bassin_7", - "Timor-Leste_bassin_8", - "Timor-Leste_bassin_9", - "Togo_bassin_10", - "Togo_bassin_11", - "Togo_bassin_12", - "Togo", - "Togo_bassin_5", - "Togo_bassin_6", - "Togo_bassin_7", - "Togo_bassin_8", - "Togo_bassin_9", - "Tokelau_bassin_10", - "Tokelau_bassin_11", - "Tokelau_bassin_12", - "Tokelau", - "Tokelau_bassin_5", - "Tokelau_bassin_6", - "Tokelau_bassin_7", - "Tokelau_bassin_8", - "Tokelau_bassin_9", - "Tonga_bassin_10", - "Tonga_bassin_11", - "Tonga_bassin_12", - "Tonga", - "Tonga_bassin_5", - "Tonga_bassin_6", - "Tonga_bassin_7", - "Tonga_bassin_8", - "Tonga_bassin_9", - "Trinidad_and Tobago_bassin_10", - "Trinidad_and Tobago_bassin_11", - "Trinidad_and Tobago_bassin_12", - "Trinidad_and Tobago", - "Trinidad_and Tobago_bassin_5", - "Trinidad_and Tobago_bassin_6", - "Trinidad_and Tobago_bassin_7", - "Trinidad_and Tobago_bassin_8", - "Trinidad_and Tobago_bassin_9", - "Tromelin_Island_bassin_10", - "Tromelin_Island_bassin_11", - "Tromelin_Island_bassin_12", - "Tromelin_Island", - "Tromelin_Island_bassin_5", - "Tromelin_Island_bassin_6", - "Tromelin_Island_bassin_7", - "Tromelin_Island_bassin_8", - "Tromelin_Island_bassin_9", - "Tunisia_bassin_10", - "Tunisia_bassin_11", - "Tunisia_bassin_12", - "Tunisia", - "Tunisia_bassin_5", - "Tunisia_bassin_6", - "Tunisia_bassin_7", - "Tunisia_bassin_8", - "Tunisia_bassin_9", - "Turkey_bassin_10", - "Turkey_bassin_11", - "Turkey_bassin_12", - "Turkey", - "Turkey_bassin_5", - "Turkey_bassin_6", - "Turkey_bassin_7", - "Turkey_bassin_8", - "Turkey_bassin_9", - "Turkmenistan_bassin_10", - "Turkmenistan_bassin_11", - "Turkmenistan_bassin_12", - "Turkmenistan", - "Turkmenistan_bassin_5", - "Turkmenistan_bassin_6", - "Turkmenistan_bassin_7", - "Turkmenistan_bassin_8", - "Turkmenistan_bassin_9", - "Turks_and Caicos islands_bassin_10", - "Turks_and Caicos islands_bassin_11", - "Turks_and Caicos islands_bassin_12", - "Turks_and Caicos islands", - "Turks_and Caicos islands_bassin_5", - "Turks_and Caicos islands_bassin_6", - "Turks_and Caicos islands_bassin_7", - "Turks_and Caicos islands_bassin_8", - "Turks_and Caicos islands_bassin_9", - "Tuvalu_bassin_10", - "Tuvalu_bassin_11", - "Tuvalu_bassin_12", - "Tuvalu", - "Tuvalu_bassin_5", - "Tuvalu_bassin_6", - "Tuvalu_bassin_7", - "Tuvalu_bassin_8", - "Tuvalu_bassin_9", - "Uganda_bassin_10", - "Uganda_bassin_11", - "Uganda_bassin_12", - "Uganda", - "Uganda_bassin_5", - "Uganda_bassin_6", - "Uganda_bassin_7", - "Uganda_bassin_8", - "Uganda_bassin_9", - "Ukraine_bassin_10", - "Ukraine_bassin_11", - "Ukraine_bassin_12", - "Ukraine", - "Ukraine_bassin_5", - "Ukraine_bassin_6", - "Ukraine_bassin_7", - "Ukraine_bassin_8", - "Ukraine_bassin_9", - "UK_of Great Britain and Northern Ireland_bassin_10", - "UK_of Great Britain and Northern Ireland_bassin_11", - "UK_of Great Britain and Northern Ireland_bassin_12", - "UK_of Great Britain and Northern Ireland", - "UK_of Great Britain and Northern Ireland_bassin_5", - "UK_of Great Britain and Northern Ireland_bassin_6", - "UK_of Great Britain and Northern Ireland_bassin_7", - "UK_of Great Britain and Northern Ireland_bassin_8", - "UK_of Great Britain and Northern Ireland_bassin_9", - "United_Arab Emirates_bassin_10", - "United_Arab Emirates_bassin_11", - "United_Arab Emirates_bassin_12", - "United_Arab Emirates", - "United_Arab Emirates_bassin_5", - "United_Arab Emirates_bassin_6", - "United_Arab Emirates_bassin_7", - "United_Arab Emirates_bassin_8", - "United_Arab Emirates_bassin_9", - "United_Republic of Tanzania_bassin_10", - "United_Republic of Tanzania_bassin_11", - "United_Republic of Tanzania_bassin_12", - "United_Republic of Tanzania", - "United_Republic of Tanzania_bassin_5", - "United_Republic of Tanzania_bassin_6", - "United_Republic of Tanzania_bassin_7", - "United_Republic of Tanzania_bassin_8", - "United_Republic of Tanzania_bassin_9", - "United_States of America_bassin_10", - "United_States of America_bassin_11", - "United_States of America_bassin_12", - "United_States of America", - "United_States of America_bassin_5", - "United_States of America_bassin_6", - "United_States of America_bassin_7", - "United_States of America_bassin_8", - "United_States of America_bassin_9", - "United_States Virgin Islands_bassin_10", - "United_States Virgin Islands_bassin_11", - "United_States Virgin Islands_bassin_12", - "United_States Virgin Islands", - "United_States Virgin Islands_bassin_5", - "United_States Virgin Islands_bassin_6", - "United_States Virgin Islands_bassin_7", - "United_States Virgin Islands_bassin_8", - "United_States Virgin Islands_bassin_9", - "Uruguay_bassin_10", - "Uruguay_bassin_11", - "Uruguay_bassin_12", - "Uruguay", - "Uruguay_bassin_5", - "Uruguay_bassin_6", - "Uruguay_bassin_7", - "Uruguay_bassin_8", - "Uruguay_bassin_9", - "Uzbekistan_bassin_10", - "Uzbekistan_bassin_11", - "Uzbekistan_bassin_12", - "Uzbekistan", - "Uzbekistan_bassin_5", - "Uzbekistan_bassin_6", - "Uzbekistan_bassin_7", - "Uzbekistan_bassin_8", - "Uzbekistan_bassin_9", - "Vanuatu_bassin_10", - "Vanuatu_bassin_11", - "Vanuatu_bassin_12", - "Vanuatu", - "Vanuatu_bassin_5", - "Vanuatu_bassin_6", - "Vanuatu_bassin_7", - "Vanuatu_bassin_8", - "Vanuatu_bassin_9", - "Venezuela_bassin_10", - "Venezuela_bassin_11", - "Venezuela_bassin_12", - "Venezuela", - "Venezuela_bassin_5", - "Venezuela_bassin_6", - "Venezuela_bassin_7", - "Venezuela_bassin_8", - "Venezuela_bassin_9", - "Viet_Nam_bassin_10", - "Viet_Nam_bassin_11", - "Viet_Nam_bassin_12", - "Viet_Nam", - "Viet_Nam_bassin_5", - "Viet_Nam_bassin_6", - "Viet_Nam_bassin_7", - "Viet_Nam_bassin_8", - "Viet_Nam_bassin_9", - "Wake_Island_bassin_10", - "Wake_Island_bassin_11", - "Wake_Island_bassin_12", - "Wake_Island", - "Wake_Island_bassin_5", - "Wake_Island_bassin_6", - "Wake_Island_bassin_7", - "Wake_Island_bassin_8", - "Wake_Island_bassin_9", - "Wallis_and Futuna_bassin_10", - "Wallis_and Futuna_bassin_11", - "Wallis_and Futuna_bassin_12", - "Wallis_and Futuna", - "Wallis_and Futuna_bassin_5", - "Wallis_and Futuna_bassin_6", - "Wallis_and Futuna_bassin_7", - "Wallis_and Futuna_bassin_8", - "Wallis_and Futuna_bassin_9", - "Western_Sahara_bassin_10", - "Western_Sahara_bassin_11", - "Western_Sahara_bassin_12", - "Western_Sahara", - "Western_Sahara_bassin_5", - "Western_Sahara_bassin_6", - "Western_Sahara_bassin_7", - "Western_Sahara_bassin_8", - "Western_Sahara_bassin_9", - "West_Bank_bassin_10", - "West_Bank_bassin_11", - "West_Bank_bassin_12", - "West_Bank", - "West_Bank_bassin_5", - "West_Bank_bassin_6", - "West_Bank_bassin_7", - "West_Bank_bassin_8", - "West_Bank_bassin_9", - "Yemen_bassin_10", - "Yemen_bassin_11", - "Yemen_bassin_12", - "Yemen", - "Yemen_bassin_5", - "Yemen_bassin_6", - "Yemen_bassin_7", - "Yemen_bassin_8", - "Yemen_bassin_9", - "Zambia_bassin_10", - "Zambia_bassin_11", - "Zambia_bassin_12", - "Zambia", - "Zambia_bassin_5", - "Zambia_bassin_6", - "Zambia_bassin_7", - "Zambia_bassin_8", - "Zambia_bassin_9", - "Zimbabwe_bassin_10", - "Zimbabwe_bassin_11", - "Zimbabwe_bassin_12", - "Zimbabwe", - "Zimbabwe_bassin_5", - "Zimbabwe_bassin_6", - "Zimbabwe_bassin_7", - "Zimbabwe_bassin_8", - "Zimbabwe_bassin_9" - ) ); - - public static void main(String[] args) { - - ArrayList missingCountries = new ArrayList(); - - for (String country : allCountryNames) { - if( !filesGenerated.contains(country) ) { - missingCountries.add( country); - } - } - System.out.println( missingCountries.size() ); - System.out.println( missingCountries ); - - String finalCountries = ""; - for (String missing : missingCountries) { - finalCountries += '"' + missing.replaceAll( "_", " ") + "\", "; - } - System.out.println( finalCountries ); - - } - - -} +package org.openforis.collect.earth.app.desktop; + +import java.awt.Image; +import java.awt.SplashScreen; +import java.awt.Window; +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.net.MalformedURLException; +import java.net.Socket; +import java.net.URL; +import java.net.URLConnection; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.Observer; + +import javax.swing.ImageIcon; +import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; + +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.SystemUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.desktop.ServerController.ServerInitializationEvent; +import org.openforis.collect.earth.app.logging.GAlogger; +import org.openforis.collect.earth.app.server.LoadProjectFileServlet; +import org.openforis.collect.earth.app.service.EarthProjectsService; +import org.openforis.collect.earth.app.service.FolderFinder; +import org.openforis.collect.earth.app.service.KmlGeneratorService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.app.service.UpdateIniUtils; +import org.openforis.collect.earth.app.view.CheckForUpdatesListener; +import org.openforis.collect.earth.app.view.CollectEarthWindow; +import org.openforis.collect.earth.app.view.Messages; +import org.openforis.collect.earth.app.view.PropertiesDialog; +import org.openforis.collect.earth.sampler.utils.KmlGenerationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.opencsv.exceptions.CsvValidationException; + +import io.sentry.Sentry; +import io.sentry.protocol.User; + +/** + * Contains the main class that starts Collect Earth and opens Google Earth. + * + * @author Alfonso Sanchez-Paus Diaz + * + */ +public class EarthApp { + + private static Logger logger; + private static ServerController serverController; + private static EarthApp earthApp; + + private static void closeSplash() { + try { + final SplashScreen splash = SplashScreen.getSplashScreen(); + if (splash != null) { + splash.close(); + } + } catch (final IllegalStateException e) { + logger.error("Error closing the splash window", e); //$NON-NLS-1$ + } + } + + /** + * Start the application, opening Google Earth and starting the Jetty server. + * + * @param args + * No arguments are used by this method. + */ + public static void main(String[] args) { + + try { + + // System property used in the web.xml configuration + System.setProperty("collectEarth.userFolder", FolderFinder.getCollectEarthDataFolder()); //$NON-NLS-1$ + + // Specify a browser as http.agent so that calls to CloudFlare hosted OpenForis.org do not return with a 403 http error + System.setProperty("http.agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2"); + + initializeSentry(); + + // Change of font so that Lao and Thao glyphs are supported + CollectEarthUtils.setFontDependingOnLanguaue( getLocalProperties().getUiLanguage() ); + + logger = LoggerFactory.getLogger(EarthApp.class); + + String doubleClickedProjectFile = null; + + if (args != null && args.length == 1) { + doubleClickedProjectFile = args[0]; + }else if( getProjectsService().getProjectList().size() == 0 ){ + doubleClickedProjectFile = "resources/demo_survey.cep"; + } + + if ( SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX){ + handleMacStartup( doubleClickedProjectFile ); + }else{ + startCollectEarth( doubleClickedProjectFile ); + } + + } catch (final Exception e) { + // The logger factory has not been initialized, this will not work, just output to console + if (logger != null) { + logger.error("The server could not start", e); //$NON-NLS-1$ + } + System.exit(1); + } finally { + closeSplash(); + } + } + + private static void initializeSentry() { + try { + String releaseName= UpdateIniUtils.getReleaseNameInstalled(); + + Sentry.init("https://24dd6a90c1e4461484712db99c3b3bb7:831e42661c5c4ff3aa5eca270db3f619@sentry.io/299626?release="+releaseName+"&maxmessagelength=2000" ); + if( !StringUtils.isEmpty( UpdateIniUtils.getVersionInstalled() ) ) { + Sentry.setTag( "ReleaseDate", UpdateIniUtils.getVersionInstalled() ); + } + if( !StringUtils.isEmpty( getLocalProperties().getOperator() ) ) { + User user = new User(); + user.setUsername( getLocalProperties().getOperator() ); + Sentry.setUser(user); + } + + } catch (Exception e) { + logger.error( "Error initializing Sentry logger" , e); + } + } + /** + * Special code that uses reflection to handle how the application should behave in Mac OS X. + * Without reflection the code provokes compilation-time errors. + * @param doubleClickedProjectFile Project file (CEP) that was clicked + * @throws Exception Throws Exception when the process fails to open the file double-clicked. Initializes the server in any case + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + public static void handleMacStartup(String doubleClickedProjectFile) throws Exception{ + try { + Class applicationClass = Class.forName("com.apple.eawt.Application"); + Method getApplicationMethod = applicationClass.getMethod("getApplication"); + Method setDockIconImageMethod = applicationClass.getMethod( "setDockIconImage", Image.class ); + + Class openFilesHandlerInterface = Class.forName("com.apple.eawt.OpenFilesHandler"); + Method setOpenFileHandlerMethod = applicationClass.getMethod( "setOpenFileHandler", openFilesHandlerInterface ); + + // SET THE MAC OS X DOCK ICON! + // Get an Application object + Object applicationObject = getApplicationMethod.invoke( null ); + try { + Image dockIconImage = new ImageIcon(new File("images/dockIconMac.png").toURI().toURL()).getImage(); + // Invoke the setDockIconImage on the application object using the dockIconImage as an argument + setDockIconImageMethod.invoke(applicationObject, dockIconImage ); + } catch (MalformedURLException e2) { + logger.error("Problems finding the docker icon", e2); + } + // ------------------------------------------- + + + // DEFINE A LISTENER THAT IS REGISTERED BY THE OS TO HEAR DOUBLE-CLICK EVENTS AND REGISTER ITSELF AS THE CEP OPENER + MacOpenFilesInvocationHandler macOpenFileHandlerProxyInterface = new MacOpenFilesInvocationHandler(); + Object openFilesHandlerImplementation = Proxy.newProxyInstance( + applicationClass.getClassLoader(), + new Class[]{ openFilesHandlerInterface }, + macOpenFileHandlerProxyInterface + ); + + // Call the setOpenFileHandler method of the application object using the + setOpenFileHandlerMethod.invoke(applicationObject, ( openFilesHandlerInterface.cast( openFilesHandlerImplementation ) ) ); + + // Lets wait for the Apple event to arrive. If it did then the earthApp variable will be non-nulls + Thread.sleep(2000); + if( earthApp == null ){ + startCollectEarth( doubleClickedProjectFile ); + } + } catch (Exception e) { + logger.error("Error while defining the double-click behaviour on CEP files in Mac OS X", e); + startCollectEarth( null ); + } + } + + public void generateKml() { + + try { + getKmlGeneratorService().generateKmlFile(); + } catch (final KmlGenerationException e) { + logger.error("Problems while generating the KML file ", e); //$NON-NLS-1$ + showMessage("Problems while generating the KML file:
" + (e.getCause()!=null?(e.getCause()+"
"):"") + ( e.getMessage().length() > 300?e.getMessage().substring(0,300):e.getMessage() ) + ""); //$NON-NLS-1$ + } catch (final Exception e) { + logger.error("Could not generate KML file", e); //$NON-NLS-1$ + showMessage("Error generating KML file :
" + e.getMessage()); //$NON-NLS-1$ + } + } + + public static void openProjectFileInRunningCollectEarth(String doubleClickedProjecFile) throws IOException { + final File projectFile = new File(doubleClickedProjecFile); + + if (projectFile.exists()) { + + String hostAddress = ServerController.getHostAddress( getLocalProperties().getHost(), getLocalProperties().getPort()); + + URL loadProjectFileInRunningCE = new URL(hostAddress + LoadProjectFileServlet.SERVLET_NAME + + "?" + LoadProjectFileServlet.PROJECT_FILE_PARAMETER + "=" + //$NON-NLS-1$ //$NON-NLS-2$ + URLEncoder.encode(doubleClickedProjecFile, StandardCharsets.UTF_8.name() ) ); + URLConnection urlConn = loadProjectFileInRunningCE.openConnection(); + + try( BufferedReader in = new BufferedReader(new InputStreamReader(urlConn.getInputStream())) ){ + String inputLine; + while ((inputLine = in.readLine()) != null) { + logger.info(inputLine); + } + } + + } + } + + private static boolean isAnotherCollectEarthRunning(LocalPropertiesService localProperties) { + boolean alreadyRunning = false; + try { + new Socket( LocalPropertiesService.LOCAL_HOST , Integer.parseInt(localProperties.getPort())).close(); //$NON-NLS-1$ + // If here there is something is serving on port 8028 + // So stop it + logger.warn("There is a server already running {}", localProperties.getPort()); //$NON-NLS-1$ + alreadyRunning = true; + } catch (final IOException e) { + // Nothing there, so OK to proceed + logger.info("There is no server running in port {}", localProperties.getPort()); //$NON-NLS-1$ + alreadyRunning = false; + } catch (final NumberFormatException e) { + // Nothing there, so OK to proceed + logger.info("Error parsing integer value {}", localProperties.getPort()); //$NON-NLS-1$ + alreadyRunning = false; + } + return alreadyRunning; + } + + public static void quitServer() { + try { + serverController.stopServer(); + } catch (Exception e) { + logger.error("Error stoping server", e); //$NON-NLS-1$ + } + } + + /** + * Generates the KML for the project and opens it in Google Earth + * @param forceKmlRecreation Set to true if you want to forece the regeneration of the KML even if is is up to date (you might want to do this to force the update of the placemark icons as the date changes) + * @throws IOException Throws exception if the KMl file cannot be generated + * @throws KmlGenerationException Throws exception if the KML file contents cannot be generated + * @throws CsvValidationException + */ + private static synchronized void loadKmlInGoogleEarth(boolean forceKmlRecreation) throws IOException, KmlGenerationException, CsvValidationException { + earthApp.getKmlGeneratorService().generatePlacemarksKmzFile( forceKmlRecreation ); + earthApp.simulateClickKmz(); + } + + public static void restart() { + try { + + serverController.stopServer(); + startServer(null); + + } catch (final Exception e) { + logger.error("Error while stopping server", e); //$NON-NLS-1$ + } + } + + private static LocalPropertiesService nonManagedPropertiesService; + + + private static LocalPropertiesService getLocalProperties() { + if (serverController == null || serverController.getContext() == null) { + if (nonManagedPropertiesService == null) { + nonManagedPropertiesService = new LocalPropertiesService(); + } + return nonManagedPropertiesService; + } else { + return serverController.getContext().getBean(LocalPropertiesService.class); + } + } + + private static EarthProjectsService getProjectsService() { + if (serverController != null) { + return serverController.getContext().getBean(EarthProjectsService.class); + } else { + final EarthProjectsService earthProjectsService = new EarthProjectsService(); + earthProjectsService.init(getLocalProperties()); + return earthProjectsService; + } + } + + + private KmlGeneratorService getKmlGeneratorService() { + if (serverController != null) { + return serverController.getContext().getBean(KmlGeneratorService.class); + } else { + throw new IllegalStateException("The server must be initialized before this method is called"); //$NON-NLS-1$ + } + } + + private static void startCollectEarth(final String doubleClickedProjectFile) throws Exception { + logger.info("START - Server Initilization"); //$NON-NLS-1$ + final boolean ceAlreadyOpen = isAnotherCollectEarthRunning( getLocalProperties()); + + if( ceAlreadyOpen ){ + closeSplash(); + // If the user double clicked on a project file while Collect Earth is running then load the project in the running Collect Earth + if (doubleClickedProjectFile!=null) { + openProjectFileInRunningCollectEarth(doubleClickedProjectFile); + }else{ + showMessage(Messages.getString("EarthApp.11")); //$NON-NLS-1$ + } + }else{ + + startServer(doubleClickedProjectFile); + } + + GAlogger.logGAnalytics("Start"); + } + + public static void startServer(final String doubleClickedProjectFile) + throws Exception { + earthApp = new EarthApp(); + + // Load the double-clicked CEP file before the survey manager is instantiated by the server start-up + earthApp.loadProjectIfDoubleClicked(doubleClickedProjectFile); + + + final Observer observeInitialization = getServerObserver(); + serverStartAndOpenGe(observeInitialization); + } + + private static Observer getServerObserver() { + return (observable, initializationEvent) ->{ + if (initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT)) { + serverController = null; + } + + if( initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT) || + initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT) ){ + + showMessage( initializationEvent.toString()); + } + + if (!initializationEvent.equals(ServerInitializationEvent.SERVER_STOPPED_EVENT)) { + try { + earthApp.generateKml(); + earthApp.simulateClickKmz(); + earthApp.checkForUpdates(); + closeSplash(); + } catch (final Exception e) { + logger.error("Error generating KML file", e); //$NON-NLS-1$ + } + } + }; + } + + private void openKmlOnGoogleEarth(){ + if (! CollectEarthUtils.openFile( new File(KmlGeneratorService.KML_NETWORK_LINK_STARTER)) ) { + showMessage("The KML file cannot be open at " + KmlGeneratorService.KML_NETWORK_LINK_STARTER); //$NON-NLS-1$ + } + } + + private void checkForUpdates() { + new Thread("Check for new Collect Earth versions on the server") { + @Override + public void run() { + + // Wait a few seconds before checking for updates + try { + Thread.sleep(10000); + } catch (InterruptedException e1) { + logger.error("Error while waiting", e1); //$NON-NLS-1$ + } + + final UpdateIniUtils updateIniUtils = new UpdateIniUtils(); + + + if (updateIniUtils.shouldWarnUser(getLocalProperties() )) { + + javax.swing.SwingUtilities.invokeLater( () -> { + String remindLater = Messages.getString("EarthApp.3"); //$NON-NLS-1$ + String doItNow = Messages.getString("EarthApp.4"); //$NON-NLS-1$ + String doNotBother = Messages.getString("EarthApp.5"); //$NON-NLS-1$ + + String newestVersionOnline = updateIniUtils.getVersionAvailableOnline(); + + if( StringUtils.isNotBlank( newestVersionOnline ) ) { + + Object[] possibleValues = { remindLater, doItNow, doNotBother }; + int chosenOption = JOptionPane.showOptionDialog(null, + Messages.getString("EarthApp.57"), Messages.getString("EarthApp.58") + Messages.getString("EarthApp.6") + updateIniUtils.convertToDate(newestVersionOnline), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, possibleValues, possibleValues[0]); + if( chosenOption != JOptionPane.CLOSED_OPTION ){ + if (possibleValues[chosenOption].equals(doItNow)) { + CheckForUpdatesListener checkForUpdatesListener = new CheckForUpdatesListener(); + checkForUpdatesListener.actionPerformed(null); + } else if (possibleValues[chosenOption].equals(doNotBother)) { + getLocalProperties().setValue(EarthProperty.LAST_IGNORED_UPDATE, newestVersionOnline); + } + } + } + }); + } + } + }.start(); + + } + + + /** + * If Collect Earth is started by double clicking on a ".cep" file ( Collect Earth Project file ) + * Then it should open directly with that project in focus + * + * @param doubleClickedProjecFile + * The path to the CEP file that was double-clicked + * + */ + private void loadProjectIfDoubleClicked(String doubleClickedProjectFile) { + try { + if (doubleClickedProjectFile != null) { + + final File projectFile = new File(doubleClickedProjectFile); + + if (projectFile.exists()) { + getProjectsService().loadCompressedProjectFile(projectFile); + } + } + } catch (final Exception e) { + showMessage(Messages.getString("EarthApp.59")); //$NON-NLS-1$ + logger.error(Messages.getString("EarthApp.59"), e);//$NON-NLS-1$ + } + } + + private static void serverStartAndOpenGe(Observer observeInitialization) throws Exception { + serverController = new ServerController(); + serverController.deleteObservers(); + serverController.startServer(observeInitialization); + + // Inform Mac OS users of the issues about opening CEP files in the Mac version of CE + if(SystemUtils.IS_OS_MAC_OSX ) { + showMessage( + "" //$NON-NLS-1$ + + "" //$NON-NLS-1$ + + Messages.getString("EarthApp.70") + + ": " //$NON-NLS-1$ + + Messages.getString("EarthApp.71") + + Messages.getString("EarthApp.72") + + "" //$NON-NLS-1$ + + Messages.getString("CollectEarthWindow.10") + + " -> " //$NON-NLS-1$ + + Messages.getString("CollectEarthMenu.0") + + "", //$NON-NLS-1$ + Messages.getString("EarthApp.73") + ); + } + } + + public static void showMessage(String message) { + showMessage(message, "Collect Earth"); + + } + + public static void showMessage(String message, String title) { + try { + SwingUtilities.invokeLater( + () -> JOptionPane.showMessageDialog(null, message, title, JOptionPane.WARNING_MESSAGE) + ); + } catch (Exception e) { + logger.error("Error showing message",e); + } + + } + + private void simulateClickKmz() { + try { + getKmlGeneratorService().generateLoaderKmlFile(); + openKmlOnGoogleEarth(); + } catch (final Exception e) { + showMessage(Messages.getString("EarthApp.61")); //$NON-NLS-1$ + logger.error("The KMZ file could not be found", e); //$NON-NLS-1$ + } + } + + public static void executeKmlLoadAsynchronously( Window windowShowingTimer ) { + new Thread("Load KML in Google Earth"){ + @Override + public void run() { + // Only regenerate KML and reload + try { + SwingUtilities.invokeLater( ( ) -> { + if( windowShowingTimer != null ){ + CollectEarthWindow.startWaiting(windowShowingTimer); + } + }); + + EarthApp.loadKmlInGoogleEarth(true); + + } catch (Exception e) { + logger.error("Error loading the KML",e); + EarthApp.showMessage("Problems while generating the KML file:
" + + (e.getCause()!=null?(e.getCause()+"
"):"") + + ( + ( e.getMessage()!=null && e.getMessage().length() > 300 ) ? e.getMessage().substring(0,300) : + ( e.getMessage()!=null ) ? e.getMessage() : "" + ) + ""); //$NON-NLS-1$ + }finally{ + if( windowShowingTimer != null ){ + try { + SwingUtilities.invokeLater( () -> { + CollectEarthWindow.endWaiting(windowShowingTimer); + if( windowShowingTimer instanceof PropertiesDialog ){ + ( (PropertiesDialog) windowShowingTimer).closeDialog(); + } + }); + } catch (Exception e2) { + logger.error("Error closing Options dialog", e2); + } + } + } + + } + }.start(); + } + + +} From 93545371d87445e3a37716a5e08acb225f81401a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:17 +0100 Subject: [PATCH 0995/1620] New translations EarthApp.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 2429 ++++------------- 1 file changed, 534 insertions(+), 1895 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 768f973a7f..0777f46090 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,1895 +1,534 @@ -package org.openforis.collect.earth.app.ad_hoc; - -import java.util.ArrayList; -import java.util.Arrays; - -public class findMissingCountries { - - private static ArrayList allCountryNames = new ArrayList<>( - Arrays.asList( - "Abyei", - "Afghanistan", - "Aksai_Chin", - "Albania", - "Algeria", - "American_Samoa", - "Andorra", - "Angola", - "Anguilla", - "Antarctica", - "Antigua_and_Barbuda", - "Argentina", - "Armenia", - "Aruba", - "Arunachal_Pradesh", - "Ashmore_and_Cartier_Islands", - "Australia", - "Austria", - "Azerbaijan", - "Azores_Islands", - "Bahamas", - "Bahrain", - "Baker_Island", - "Bangladesh", - "Barbados", - "Bassas_da_India", - "Belarus", - "Belgium", - "Belize", - "Benin", - "Bermuda", - "Bhutan", - "Bird_Island", - "Bolivia", - "Bosnia_and_Herzegovina", - "Botswana", - "Bouvet_Island", - "Brazil", - "British_Indian_Ocean_Territory", - "British_Virgin_Islands", - "Brunei_Darussalam", - "Bulgaria", - "Burkina_Faso", - "Burundi", - "Cambodia", - "Cameroon", - "Canada", - "Cape_Verde", - "Cayman_Islands", - "Central_African_Republic", - "Chad", - "Chile", - "China", - "China/India", - "Christmas_Island", - "Clipperton_Island", - "Cocos__Keeling__Islands", - "Colombia", - "Comoros", - "Congo", - "Cook_Islands", - "Costa_Rica", - "Croatia", - "Cuba", - "Cyprus", - "Czech_Republic", - "C�te_d_Ivoire", - "Dem_People_s_Rep_of_Korea", - "Democratic_Republic_of_the_Congo", - "Denmark", - "Djibouti", - "Dominica", - "Dominican_Republic", - "Ecuador", - "Egypt", - "El_Salvador", - "Equatorial_Guinea", - "Eritrea", - "Estonia", - "Ethiopia", - "Europa_Island", - "Falkland_Islands__Malvinas_", - "Faroe_Islands", - "Fiji", - "Finland", - "France", - "French_Guiana", - "French_Polynesia", - "French_Southern_and_Antarctic_Territories", - "Gabon", - "Gambia", - "Gaza_Strip", - "Georgia", - "Germany", - "Ghana", - "Gibraltar", - "Glorioso_Island", - "Greece", - "Greenland", - "Grenada", - "Guadeloupe", - "Guam", - "Guatemala", - "Guernsey", - "Guinea", - "Guinea-Bissau", - "Guyana", - "Haiti", - "Hala_ib_triangle", - "Heard_Island_and_McDonald_Islands", - "Holy_See", - "Honduras", - "Hong_Kong", - "Howland_Island", - "Hungary", - "Iceland", - "Ilemi_triangle", - "India", - "Indonesia", - "Iran___Islamic_Republic_of_", - "Iraq", - "Ireland", - "Isle_of_Man", - "Israel", - "Italy", - "Jamaica", - "Jammu_and_Kashmir", - "Japan", - "Jarvis_Island", - "Jersey", - "Johnston_Atoll", - "Jordan", - "Juan_de_Nova_Island", - "Kazakhstan", - "Kenya", - "Kingman_Reef", - "Kiribati", - "Kuril_islands", - "Kuwait", - "Kyrgyzstan", - "Lao_People_s_Democratic_Republic", - "Latvia", - "Lebanon", - "Lesotho", - "Liberia", - "Libya", - "Liechtenstein", - "Lithuania", - "Luxembourg", - "Ma_tan_al-Sarra", - "Macau", - "Madagascar", - "Madeira_Islands", - "Malawi", - "Malaysia", - "Maldives", - "Mali", - "Malta", - "Marshall_Islands", - "Martinique", - "Mauritania", - "Mauritius", - "Mayotte", - "Mexico", - "Micronesia__Federated_States_of_", - "Midway_Island", - "Moldova,_Republic_of", - "Monaco", - "Mongolia", - "Montenegro", - "Montserrat", - "Morocco", - "Mozambique", - "Myanmar", - "Namibia", - "Nauru", - "Navassa_Island", - "Nepal", - "Netherlands", - "Netherlands_Antilles", - "New_Caledonia", - "New_Zealand", - "Nicaragua", - "Niger", - "Nigeria", - "Niue", - "Norfolk_Island", - "Northern_Mariana_Islands", - "Norway", - "Oman", - "Pakistan", - "Palau", - "Palmyra_Atoll", - "Panama", - "Papua_New_Guinea", - "Paracel_Islands", - "Paraguay", - "Peru", - "Philippines", - "Pitcairn", - "Poland", - "Portugal", - "Puerto_Rico", - "Qatar", - "Republic_of_Korea", - "Romania", - "Russian_Federation", - "Rwanda", - "R�union", - "Saint_Helena", - "Saint_Kitts_and_Nevis", - "Saint_Lucia", - "Saint_Pierre_et_Miquelon", - "Saint_Vincent_and_the_Grenadines", - "Samoa", - "San_Marino", - "Sao_Tome_and_Principe", - "Saudi_Arabia", - "Scarborough_Reef", - "Senegal", - "Senkaku_Islands", - "Serbia", - "Seychelles", - "Sierra_Leone", - "Singapore", - "Slovakia", - "Slovenia", - "Solomon_Islands", - "Somalia", - "South_Africa", - "South_Georgia_and_the_South_Sandwich_Islands", - "South_Sudan", - "Spain", - "Spratly_Islands", - "Sri_Lanka", - "Sudan", - "Suriname", - "Svalbard_and_Jan_Mayen_Islands", - "Swaziland", - "Sweden", - "Switzerland", - "Syrian_Arab_Republic", - "Taiwan", - "Tajikistan", - "Thailand", - "The_former_Yugoslav_Republic_of_Macedonia", - "Timor-Leste", - "Togo", - "Tokelau", - "Tonga", - "Trinidad_and_Tobago", - "Tromelin_Island", - "Tunisia", - "Turkey", - "Turkmenistan", - "Turks_and_Caicos_islands", - "Tuvalu", - "UK_of_Great_Britain_and_Northern_Ireland", - "Uganda", - "Ukraine", - "United_Arab_Emirates", - "United_Republic_of_Tanzania", - "United_States_Virgin_Islands", - "United_States_of_America", - "Uruguay", - "Uzbekistan", - "Vanuatu", - "Venezuela", - "Viet_Nam", - "Wake_Island", - "Wallis_and_Futuna", - "West_Bank", - "Western_Sahara", - "Yemen", - "Zambia", - "Zimbabwe" ) ); - - private static ArrayList filesGenerated = new ArrayList<>( - Arrays.asList( "Azores_Islands_bassin_10", - "Azores_Islands_bassin_11", - "Azores_Islands_bassin_12", - "Azores_Islands", - "Azores_Islands_bassin_5", - "Azores_Islands_bassin_6", - "Azores_Islands_bassin_7", - "Azores_Islands_bassin_8", - "Azores_Islands_bassin_9", - "Brunei_Darussalam_bassin_10", - "Brunei_Darussalam_bassin_11", - "Brunei_Darussalam_bassin_12", - "Brunei_Darussalam_bassin_7", - "Brunei_Darussalam_bassin_8", - "Brunei_Darussalam_bassin_9", - "Bulgaria_bassin_10", - "Bulgaria_bassin_11", - "Bulgaria_bassin_12", - "Bulgaria", - "Bulgaria_bassin_5", - "Bulgaria_bassin_6", - "Bulgaria_bassin_7", - "Bulgaria_bassin_8", - "Bulgaria_bassin_9", - "Burkina_Faso_bassin_10", - "Burkina_Faso_bassin_11", - "Burkina_Faso_bassin_12", - "Burkina_Faso", - "Burkina_Faso_bassin_5", - "Burkina_Faso_bassin_6", - "Burkina_Faso_bassin_7", - "Burkina_Faso_bassin_8", - "Burkina_Faso_bassin_9", - "Burundi_bassin_10", - "Burundi_bassin_11", - "Burundi_bassin_12", - "Burundi", - "Burundi_bassin_5", - "Burundi_bassin_6", - "Burundi_bassin_7", - "Burundi_bassin_8", - "Burundi_bassin_9", - "Cambodia_bassin_10", - "Cambodia_bassin_11", - "Cambodia_bassin_12", - "Cambodia", - "Cambodia_bassin_5", - "Cambodia_bassin_6", - "Cambodia_bassin_7", - "Cambodia_bassin_8", - "Cambodia_bassin_9", - "Cameroon_bassin_10", - "Cameroon_bassin_11", - "Cameroon_bassin_12", - "Cameroon", - "Cameroon_bassin_5", - "Cameroon_bassin_6", - "Cameroon_bassin_7", - "Cameroon_bassin_8", - "Cameroon_bassin_9", - "Canada_bassin_10", - "Canada_bassin_11", - "Canada_bassin_12", - "Canada", - "Canada_bassin_5", - "Canada_bassin_6", - "Canada_bassin_7", - "Canada_bassin_8", - "Canada_bassin_9", - "Cape_Verde_bassin_10", - "Cape_Verde_bassin_11", - "Cape_Verde_bassin_12", - "Cape_Verde", - "Cape_Verde_bassin_5", - "Cape_Verde_bassin_6", - "Cape_Verde_bassin_7", - "Cape_Verde_bassin_8", - "Cape_Verde_bassin_9", - "Cayman_Islands_bassin_10", - "Cayman_Islands_bassin_11", - "Cayman_Islands_bassin_12", - "Cayman_Islands", - "Cayman_Islands_bassin_5", - "Cayman_Islands_bassin_6", - "Cayman_Islands_bassin_7", - "Cayman_Islands_bassin_8", - "Cayman_Islands_bassin_9", - "Central_African Republic_bassin_10", - "Central_African Republic_bassin_11", - "Central_African Republic_bassin_12", - "Central_African Republic", - "Central_African Republic_bassin_5", - "Central_African Republic_bassin_6", - "Central_African Republic_bassin_7", - "Central_African Republic_bassin_8", - "Central_African Republic_bassin_9", - "Chad_bassin_10", - "Chad_bassin_11", - "Chad_bassin_12", - "Chad", - "Chad_bassin_5", - "Chad_bassin_6", - "Chad_bassin_7", - "Chad_bassin_8", - "Chad_bassin_9", - "Chile_bassin_10", - "Chile_bassin_11", - "Chile_bassin_12", - "Chile", - "Chile_bassin_5", - "Chile_bassin_6", - "Chile_bassin_7", - "Chile_bassin_8", - "Chile_bassin_9", - "China_bassin_10", - "China_bassin_11", - "China_bassin_12", - "China", - "China_bassin_5", - "China_bassin_6", - "China_bassin_7", - "China_bassin_8", - "China_bassin_9", - "Christmas_Island_bassin_10", - "Christmas_Island_bassin_11", - "Christmas_Island_bassin_12", - "Christmas_Island", - "Christmas_Island_bassin_5", - "Christmas_Island_bassin_6", - "Christmas_Island_bassin_7", - "Christmas_Island_bassin_8", - "Christmas_Island_bassin_9", - "Clipperton_Island_bassin_10", - "Clipperton_Island_bassin_11", - "Clipperton_Island_bassin_12", - "Clipperton_Island", - "Clipperton_Island_bassin_5", - "Clipperton_Island_bassin_6", - "Clipperton_Island_bassin_7", - "Clipperton_Island_bassin_8", - "Clipperton_Island_bassin_9", - "Colombia_bassin_10", - "Colombia_bassin_11", - "Colombia_bassin_12", - "Colombia", - "Colombia_bassin_5", - "Colombia_bassin_6", - "Colombia_bassin_7", - "Colombia_bassin_8", - "Colombia_bassin_9", - "Comoros_bassin_10", - "Comoros_bassin_11", - "Comoros_bassin_12", - "Comoros", - "Comoros_bassin_5", - "Comoros_bassin_6", - "Comoros_bassin_7", - "Comoros_bassin_8", - "Comoros_bassin_9", - "Congo_bassin_10", - "Congo_bassin_11", - "Congo_bassin_12", - "Congo", - "Congo_bassin_5", - "Congo_bassin_6", - "Congo_bassin_7", - "Congo_bassin_8", - "Congo_bassin_9", - "Cook_Islands_bassin_10", - "Cook_Islands_bassin_11", - "Cook_Islands_bassin_12", - "Cook_Islands", - "Cook_Islands_bassin_5", - "Cook_Islands_bassin_6", - "Cook_Islands_bassin_7", - "Cook_Islands_bassin_8", - "Cook_Islands_bassin_9", - "Costa_Rica_bassin_10", - "Costa_Rica_bassin_11", - "Costa_Rica_bassin_12", - "Costa_Rica", - "Costa_Rica_bassin_5", - "Costa_Rica_bassin_6", - "Costa_Rica_bassin_7", - "Costa_Rica_bassin_8", - "Costa_Rica_bassin_9", - "Croatia_bassin_10", - "Croatia_bassin_11", - "Croatia_bassin_12", - "Croatia", - "Croatia_bassin_5", - "Croatia_bassin_6", - "Croatia_bassin_7", - "Croatia_bassin_8", - "Croatia_bassin_9", - "Cuba_bassin_10", - "Cuba_bassin_11", - "Cuba_bassin_12", - "Cuba", - "Cuba_bassin_5", - "Cuba_bassin_6", - "Cuba_bassin_7", - "Cuba_bassin_8", - "Cuba_bassin_9", - "Cyprus_bassin_10", - "Cyprus_bassin_11", - "Cyprus_bassin_12", - "Cyprus", - "Cyprus_bassin_5", - "Cyprus_bassin_6", - "Cyprus_bassin_7", - "Cyprus_bassin_8", - "Cyprus_bassin_9", - "Czech_Republic_bassin_10", - "Czech_Republic_bassin_11", - "Czech_Republic_bassin_12", - "Czech_Republic", - "Czech_Republic_bassin_5", - "Czech_Republic_bassin_6", - "Czech_Republic_bassin_7", - "Czech_Republic_bassin_8", - "Czech_Republic_bassin_9", - "Democratic_Republic of the Congo_bassin_10", - "Democratic_Republic of the Congo_bassin_11", - "Democratic_Republic of the Congo_bassin_12", - "Democratic_Republic of the Congo", - "Democratic_Republic of the Congo_bassin_5", - "Democratic_Republic of the Congo_bassin_6", - "Democratic_Republic of the Congo_bassin_7", - "Democratic_Republic of the Congo_bassin_8", - "Democratic_Republic of the Congo_bassin_9", - "Dem_Peoples Rep of Korea_bassin_10", - "Dem_Peoples Rep of Korea_bassin_11", - "Dem_Peoples Rep of Korea_bassin_12", - "Dem_Peoples Rep of Korea", - "Dem_Peoples Rep of Korea_bassin_5", - "Dem_Peoples Rep of Korea_bassin_6", - "Dem_Peoples Rep of Korea_bassin_7", - "Dem_Peoples Rep of Korea_bassin_8", - "Dem_Peoples Rep of Korea_bassin_9", - "Denmark_bassin_10", - "Denmark_bassin_11", - "Denmark_bassin_12", - "Denmark", - "Denmark_bassin_5", - "Denmark_bassin_6", - "Denmark_bassin_7", - "Denmark_bassin_8", - "Denmark_bassin_9", - "Djibouti_bassin_10", - "Djibouti_bassin_11", - "Djibouti_bassin_12", - "Djibouti", - "Djibouti_bassin_5", - "Djibouti_bassin_6", - "Djibouti_bassin_7", - "Djibouti_bassin_8", - "Djibouti_bassin_9", - "Dominican_Republic_bassin_10", - "Dominican_Republic_bassin_11", - "Dominican_Republic_bassin_12", - "Dominican_Republic", - "Dominican_Republic_bassin_5", - "Dominican_Republic_bassin_6", - "Dominican_Republic_bassin_7", - "Dominican_Republic_bassin_8", - "Dominican_Republic_bassin_9", - "Dominica_bassin_10", - "Dominica_bassin_11", - "Dominica_bassin_12", - "Dominica", - "Dominica_bassin_5", - "Dominica_bassin_6", - "Dominica_bassin_7", - "Dominica_bassin_8", - "Dominica_bassin_9", - "Ecuador_bassin_10", - "Ecuador_bassin_11", - "Ecuador_bassin_12", - "Ecuador", - "Ecuador_bassin_5", - "Ecuador_bassin_6", - "Ecuador_bassin_7", - "Ecuador_bassin_8", - "Ecuador_bassin_9", - "Egypt_bassin_10", - "Egypt_bassin_11", - "Egypt_bassin_12", - "Egypt", - "Egypt_bassin_5", - "Egypt_bassin_6", - "Egypt_bassin_7", - "Egypt_bassin_8", - "Egypt_bassin_9", - "El_Salvador_bassin_10", - "El_Salvador_bassin_11", - "El_Salvador_bassin_12", - "El_Salvador", - "El_Salvador_bassin_5", - "El_Salvador_bassin_6", - "El_Salvador_bassin_7", - "El_Salvador_bassin_8", - "El_Salvador_bassin_9", - "Equatorial_Guinea_bassin_10", - "Equatorial_Guinea_bassin_11", - "Equatorial_Guinea_bassin_12", - "Equatorial_Guinea", - "Equatorial_Guinea_bassin_5", - "Equatorial_Guinea_bassin_6", - "Equatorial_Guinea_bassin_7", - "Equatorial_Guinea_bassin_8", - "Equatorial_Guinea_bassin_9", - "Eritrea_bassin_10", - "Eritrea_bassin_11", - "Eritrea_bassin_12", - "Eritrea", - "Eritrea_bassin_5", - "Eritrea_bassin_6", - "Eritrea_bassin_7", - "Eritrea_bassin_8", - "Eritrea_bassin_9", - "Estonia_bassin_10", - "Estonia_bassin_11", - "Estonia_bassin_12", - "Estonia", - "Estonia_bassin_5", - "Estonia_bassin_6", - "Estonia_bassin_7", - "Estonia_bassin_8", - "Estonia_bassin_9", - "Ethiopia_bassin_10", - "Ethiopia_bassin_11", - "Ethiopia_bassin_12", - "Ethiopia", - "Ethiopia_bassin_5", - "Ethiopia_bassin_6", - "Ethiopia_bassin_7", - "Ethiopia_bassin_8", - "Ethiopia_bassin_9", - "Europa_Island_bassin_10", - "Europa_Island_bassin_11", - "Europa_Island_bassin_12", - "Europa_Island", - "Europa_Island_bassin_5", - "Europa_Island_bassin_6", - "Europa_Island_bassin_7", - "Europa_Island_bassin_8", - "Europa_Island_bassin_9", - "Faroe_Islands_bassin_10", - "Faroe_Islands_bassin_11", - "Faroe_Islands_bassin_12", - "Faroe_Islands", - "Faroe_Islands_bassin_5", - "Faroe_Islands_bassin_6", - "Faroe_Islands_bassin_7", - "Faroe_Islands_bassin_8", - "Faroe_Islands_bassin_9", - "Fiji_bassin_10", - "Fiji_bassin_11", - "Fiji_bassin_12", - "Fiji", - "Fiji_bassin_5", - "Fiji_bassin_6", - "Fiji_bassin_7", - "Fiji_bassin_8", - "Fiji_bassin_9", - "Finland_bassin_10", - "Finland_bassin_11", - "Finland_bassin_12", - "Finland", - "Finland_bassin_5", - "Finland_bassin_6", - "Finland_bassin_7", - "Finland_bassin_8", - "Finland_bassin_9", - "France_bassin_10", - "France_bassin_11", - "France_bassin_12", - "France", - "France_bassin_5", - "France_bassin_6", - "France_bassin_7", - "France_bassin_8", - "France_bassin_9", - "French_Guiana_bassin_10", - "French_Guiana_bassin_11", - "French_Guiana_bassin_12", - "French_Guiana", - "French_Guiana_bassin_5", - "French_Guiana_bassin_6", - "French_Guiana_bassin_7", - "French_Guiana_bassin_8", - "French_Guiana_bassin_9", - "French_Polynesia_bassin_10", - "French_Polynesia_bassin_11", - "French_Polynesia_bassin_12", - "French_Polynesia", - "French_Polynesia_bassin_5", - "French_Polynesia_bassin_6", - "French_Polynesia_bassin_7", - "French_Polynesia_bassin_8", - "French_Polynesia_bassin_9", - "French_Southern and Antarctic Territories_bassin_10", - "French_Southern and Antarctic Territories_bassin_11", - "French_Southern and Antarctic Territories_bassin_12", - "French_Southern and Antarctic Territories", - "French_Southern and Antarctic Territories_bassin_5", - "French_Southern and Antarctic Territories_bassin_6", - "French_Southern and Antarctic Territories_bassin_7", - "French_Southern and Antarctic Territories_bassin_8", - "French_Southern and Antarctic Territories_bassin_9", - "Gabon_bassin_10", - "Gabon_bassin_11", - "Gabon_bassin_12", - "Gabon", - "Gabon_bassin_5", - "Gabon_bassin_6", - "Gabon_bassin_7", - "Gabon_bassin_8", - "Gabon_bassin_9", - "Gambia_bassin_10", - "Gambia_bassin_11", - "Gambia_bassin_12", - "Gambia", - "Gambia_bassin_5", - "Gambia_bassin_6", - "Gambia_bassin_7", - "Gambia_bassin_8", - "Gambia_bassin_9", - "Gaza_Strip_bassin_10", - "Gaza_Strip_bassin_11", - "Gaza_Strip_bassin_12", - "Gaza_Strip", - "Gaza_Strip_bassin_5", - "Gaza_Strip_bassin_6", - "Gaza_Strip_bassin_7", - "Gaza_Strip_bassin_8", - "Gaza_Strip_bassin_9", - "Georgia_bassin_10", - "Georgia_bassin_11", - "Georgia_bassin_12", - "Georgia", - "Georgia_bassin_5", - "Georgia_bassin_6", - "Georgia_bassin_7", - "Georgia_bassin_8", - "Georgia_bassin_9", - "Germany_bassin_10", - "Germany_bassin_11", - "Germany_bassin_12", - "Germany", - "Germany_bassin_5", - "Germany_bassin_6", - "Germany_bassin_7", - "Germany_bassin_8", - "Germany_bassin_9", - "Ghana_bassin_10", - "Ghana_bassin_11", - "Ghana_bassin_12", - "Ghana", - "Ghana_bassin_5", - "Ghana_bassin_6", - "Ghana_bassin_8", - "Ghana_bassin_9", - "Gibraltar_bassin_10", - "Gibraltar_bassin_11", - "Gibraltar_bassin_12", - "Gibraltar", - "Gibraltar_bassin_5", - "Gibraltar_bassin_6", - "Gibraltar_bassin_7", - "Gibraltar_bassin_8", - "Gibraltar_bassin_9", - "Glorioso_Island_bassin_10", - "Glorioso_Island_bassin_11", - "Glorioso_Island_bassin_12", - "Glorioso_Island", - "Glorioso_Island_bassin_5", - "Glorioso_Island_bassin_6", - "Glorioso_Island_bassin_7", - "Glorioso_Island_bassin_8", - "Glorioso_Island_bassin_9", - "Greece_bassin_10", - "Greece_bassin_11", - "Greece_bassin_12", - "Greece", - "Greece_bassin_5", - "Greece_bassin_6", - "Greece_bassin_7", - "Greece_bassin_8", - "Greece_bassin_9", - "Greenland_bassin_10", - "Greenland_bassin_11", - "Greenland_bassin_12", - "Greenland", - "Greenland_bassin_5", - "Greenland_bassin_6", - "Greenland_bassin_7", - "Greenland_bassin_8", - "Greenland_bassin_9", - "Grenada_bassin_10", - "Grenada_bassin_11", - "Grenada_bassin_12", - "Grenada", - "Grenada_bassin_5", - "Grenada_bassin_6", - "Grenada_bassin_7", - "Grenada_bassin_8", - "Grenada_bassin_9", - "Guadeloupe_bassin_10", - "Guadeloupe_bassin_11", - "Guadeloupe_bassin_12", - "Guadeloupe", - "Guadeloupe_bassin_5", - "Guadeloupe_bassin_6", - "Guadeloupe_bassin_7", - "Guadeloupe_bassin_8", - "Guadeloupe_bassin_9", - "Guam_bassin_10", - "Guam_bassin_11", - "Guam_bassin_12", - "Guam", - "Guam_bassin_5", - "Guam_bassin_6", - "Guam_bassin_7", - "Guam_bassin_8", - "Guam_bassin_9", - "Halaib_triangle_bassin_10", - "Halaib_triangle_bassin_11", - "Halaib_triangle_bassin_12", - "Halaib_triangle", - "Halaib_triangle_bassin_5", - "Halaib_triangle_bassin_6", - "Halaib_triangle_bassin_7", - "Halaib_triangle_bassin_8", - "Halaib_triangle_bassin_9", - "Heard_Island and McDonald Islands_bassin_12", - "Holy_See_bassin_10", - "Holy_See_bassin_11", - "Holy_See_bassin_12", - "Holy_See", - "Holy_See_bassin_5", - "Holy_See_bassin_6", - "Holy_See_bassin_7", - "Holy_See_bassin_8", - "Holy_See_bassin_9", - "Honduras_bassin_10", - "Honduras_bassin_11", - "Honduras_bassin_12", - "Honduras", - "Honduras_bassin_5", - "Honduras_bassin_6", - "Honduras_bassin_7", - "Honduras_bassin_8", - "Honduras_bassin_9", - "Hong_Kong_bassin_10", - "Hong_Kong_bassin_11", - "Hong_Kong_bassin_12", - "Hong_Kong", - "Hong_Kong_bassin_5", - "Hong_Kong_bassin_6", - "Hong_Kong_bassin_7", - "Hong_Kong_bassin_8", - "Hong_Kong_bassin_9", - "Howland_Island_bassin_10", - "Howland_Island_bassin_11", - "Howland_Island_bassin_12", - "Howland_Island", - "Howland_Island_bassin_5", - "Howland_Island_bassin_6", - "Howland_Island_bassin_7", - "Howland_Island_bassin_8", - "Howland_Island_bassin_9", - "Hungary_bassin_10", - "Hungary_bassin_11", - "Hungary_bassin_12", - "Hungary", - "Hungary_bassin_5", - "Hungary_bassin_6", - "Hungary_bassin_7", - "Hungary_bassin_8", - "Hungary_bassin_9", - "Iceland_bassin_10", - "Iceland_bassin_11", - "Iceland_bassin_12", - "Iceland", - "Iceland_bassin_5", - "Iceland_bassin_6", - "Iceland_bassin_7", - "Iceland_bassin_8", - "Iceland_bassin_9", - "Ilemi_triangle_bassin_10", - "Ilemi_triangle_bassin_11", - "Ilemi_triangle_bassin_12", - "Ilemi_triangle", - "Ilemi_triangle_bassin_5", - "Ilemi_triangle_bassin_6", - "Ilemi_triangle_bassin_7", - "Ilemi_triangle_bassin_8", - "Ilemi_triangle_bassin_9", - "India_bassin_10", - "India_bassin_11", - "India_bassin_12", - "India", - "India_bassin_5", - "India_bassin_6", - "India_bassin_7", - "India_bassin_8", - "India_bassin_9", - "Indonesia_bassin_10", - "Indonesia_bassin_11", - "Indonesia_bassin_12", - "Indonesia", - "Indonesia_bassin_5", - "Indonesia_bassin_6", - "Indonesia_bassin_7", - "Indonesia_bassin_8", - "Indonesia_bassin_9", - "Iraq_bassin_10", - "Iraq_bassin_11", - "Iraq_bassin_12", - "Iraq", - "Iraq_bassin_5", - "Iraq_bassin_6", - "Iraq_bassin_7", - "Iraq_bassin_8", - "Iraq_bassin_9", - "Ireland_bassin_10", - "Ireland_bassin_11", - "Ireland_bassin_12", - "Ireland", - "Ireland_bassin_5", - "Ireland_bassin_6", - "Ireland_bassin_7", - "Ireland_bassin_8", - "Ireland_bassin_9", - "Isle_of Man_bassin_10", - "Isle_of Man_bassin_11", - "Isle_of Man_bassin_12", - "Isle_of Man", - "Isle_of Man_bassin_5", - "Isle_of Man_bassin_6", - "Isle_of Man_bassin_7", - "Isle_of Man_bassin_8", - "Isle_of Man_bassin_9", - "Israel_bassin_10", - "Israel_bassin_11", - "Israel_bassin_12", - "Israel", - "Israel_bassin_5", - "Israel_bassin_6", - "Israel_bassin_7", - "Israel_bassin_8", - "Israel_bassin_9", - "Italy_bassin_10", - "Italy_bassin_11", - "Italy_bassin_12", - "Italy", - "Italy_bassin_5", - "Italy_bassin_6", - "Italy_bassin_7", - "Italy_bassin_8", - "Italy_bassin_9", - "Jamaica_bassin_10", - "Jamaica_bassin_11", - "Jamaica_bassin_12", - "Jamaica", - "Jamaica_bassin_5", - "Jamaica_bassin_6", - "Jamaica_bassin_7", - "Jamaica_bassin_8", - "Jamaica_bassin_9", - "Jammu_and Kashmir_bassin_10", - "Jammu_and Kashmir_bassin_11", - "Jammu_and Kashmir_bassin_12", - "Jammu_and Kashmir", - "Jammu_and Kashmir_bassin_5", - "Jammu_and Kashmir_bassin_6", - "Jammu_and Kashmir_bassin_7", - "Jammu_and Kashmir_bassin_8", - "Jammu_and Kashmir_bassin_9", - "Japan_bassin_10", - "Japan_bassin_11", - "Japan_bassin_12", - "Japan", - "Japan_bassin_5", - "Japan_bassin_6", - "Japan_bassin_7", - "Japan_bassin_8", - "Japan_bassin_9", - "Jarvis_Island_bassin_10", - "Jarvis_Island_bassin_11", - "Jarvis_Island_bassin_12", - "Jarvis_Island", - "Jarvis_Island_bassin_5", - "Jarvis_Island_bassin_6", - "Jarvis_Island_bassin_7", - "Jarvis_Island_bassin_8", - "Jarvis_Island_bassin_9", - "Jersey_bassin_10", - "Jersey_bassin_11", - "Jersey_bassin_12", - "Jersey", - "Jersey_bassin_5", - "Jersey_bassin_6", - "Jersey_bassin_7", - "Jersey_bassin_8", - "Jersey_bassin_9", - "Johnston_Atoll_bassin_10", - "Johnston_Atoll_bassin_11", - "Johnston_Atoll_bassin_12", - "Johnston_Atoll", - "Johnston_Atoll_bassin_5", - "Johnston_Atoll_bassin_6", - "Johnston_Atoll_bassin_7", - "Johnston_Atoll_bassin_8", - "Johnston_Atoll_bassin_9", - "Jordan_bassin_10", - "Jordan_bassin_11", - "Jordan_bassin_12", - "Jordan", - "Jordan_bassin_5", - "Jordan_bassin_6", - "Jordan_bassin_7", - "Jordan_bassin_8", - "Jordan_bassin_9", - "Juan_de Nova Island_bassin_10", - "Juan_de Nova Island_bassin_11", - "Juan_de Nova Island_bassin_12", - "Juan_de Nova Island", - "Juan_de Nova Island_bassin_5", - "Juan_de Nova Island_bassin_6", - "Juan_de Nova Island_bassin_7", - "Juan_de Nova Island_bassin_8", - "Juan_de Nova Island_bassin_9", - "Kazakhstan_bassin_10", - "Kazakhstan_bassin_11", - "Kazakhstan_bassin_12", - "Kazakhstan", - "Kazakhstan_bassin_5", - "Kazakhstan_bassin_6", - "Kazakhstan_bassin_7", - "Kazakhstan_bassin_8", - "Kazakhstan_bassin_9", - "Kenya_bassin_10", - "Kenya_bassin_11", - "Kenya_bassin_12", - "Kenya", - "Kenya_bassin_5", - "Kenya_bassin_6", - "Kenya_bassin_7", - "Kenya_bassin_8", - "Kenya_bassin_9", - "Kingman_Reef_bassin_10", - "Kingman_Reef_bassin_11", - "Kingman_Reef_bassin_12", - "Kingman_Reef", - "Kingman_Reef_bassin_5", - "Kingman_Reef_bassin_6", - "Kingman_Reef_bassin_7", - "Kingman_Reef_bassin_8", - "Kingman_Reef_bassin_9", - "Kiribati_bassin_10", - "Kiribati_bassin_11", - "Kiribati_bassin_12", - "Kiribati", - "Kiribati_bassin_5", - "Kiribati_bassin_6", - "Kiribati_bassin_7", - "Kiribati_bassin_8", - "Kiribati_bassin_9", - "Kuril_islands_bassin_10", - "Kuril_islands_bassin_11", - "Kuril_islands_bassin_12", - "Kuril_islands", - "Kuril_islands_bassin_5", - "Kuril_islands_bassin_6", - "Kuril_islands_bassin_7", - "Kuril_islands_bassin_8", - "Kuril_islands_bassin_9", - "Kuwait_bassin_10", - "Kuwait_bassin_11", - "Kuwait_bassin_12", - "Kuwait", - "Kuwait_bassin_5", - "Kuwait_bassin_6", - "Kuwait_bassin_7", - "Kuwait_bassin_8", - "Kuwait_bassin_9", - "Kyrgyzstan_bassin_10", - "Kyrgyzstan_bassin_11", - "Kyrgyzstan_bassin_12", - "Kyrgyzstan", - "Kyrgyzstan_bassin_5", - "Kyrgyzstan_bassin_6", - "Kyrgyzstan_bassin_7", - "Kyrgyzstan_bassin_8", - "Kyrgyzstan_bassin_9", - "Lao_Peoples Democratic Republic_bassin_10", - "Lao_Peoples Democratic Republic_bassin_11", - "Lao_Peoples Democratic Republic_bassin_12", - "Lao_Peoples Democratic Republic", - "Lao_Peoples Democratic Republic_bassin_5", - "Lao_Peoples Democratic Republic_bassin_6", - "Lao_Peoples Democratic Republic_bassin_7", - "Lao_Peoples Democratic Republic_bassin_8", - "Lao_Peoples Democratic Republic_bassin_9", - "Latvia_bassin_10", - "Latvia_bassin_11", - "Latvia_bassin_12", - "Latvia", - "Latvia_bassin_5", - "Latvia_bassin_6", - "Latvia_bassin_7", - "Latvia_bassin_8", - "Latvia_bassin_9", - "Lebanon_bassin_10", - "Lebanon_bassin_11", - "Lebanon_bassin_12", - "Lebanon", - "Lebanon_bassin_5", - "Lebanon_bassin_6", - "Lebanon_bassin_7", - "Lebanon_bassin_8", - "Lebanon_bassin_9", - "Lesotho_bassin_10", - "Lesotho_bassin_11", - "Lesotho_bassin_12", - "Lesotho", - "Lesotho_bassin_5", - "Lesotho_bassin_6", - "Lesotho_bassin_7", - "Lesotho_bassin_8", - "Lesotho_bassin_9", - "Liberia_bassin_10", - "Liberia_bassin_11", - "Liberia_bassin_12", - "Liberia", - "Liberia_bassin_5", - "Liberia_bassin_6", - "Liberia_bassin_7", - "Liberia_bassin_8", - "Liberia_bassin_9", - "Libya_bassin_10", - "Libya_bassin_11", - "Libya_bassin_12", - "Libya", - "Libya_bassin_5", - "Libya_bassin_6", - "Libya_bassin_7", - "Libya_bassin_8", - "Libya_bassin_9", - "Liechtenstein_bassin_10", - "Liechtenstein_bassin_11", - "Liechtenstein_bassin_12", - "Liechtenstein", - "Liechtenstein_bassin_5", - "Liechtenstein_bassin_6", - "Liechtenstein_bassin_7", - "Liechtenstein_bassin_8", - "Liechtenstein_bassin_9", - "Lithuania_bassin_10", - "Lithuania_bassin_11", - "Lithuania_bassin_12", - "Lithuania", - "Lithuania_bassin_5", - "Lithuania_bassin_6", - "Lithuania_bassin_7", - "Lithuania_bassin_8", - "Lithuania_bassin_9", - "Luxembourg_bassin_10", - "Luxembourg_bassin_11", - "Luxembourg_bassin_12", - "Luxembourg", - "Luxembourg_bassin_5", - "Luxembourg_bassin_6", - "Luxembourg_bassin_7", - "Luxembourg_bassin_8", - "Luxembourg_bassin_9", - "Macau_bassin_10", - "Macau_bassin_11", - "Macau_bassin_12", - "Macau", - "Macau_bassin_5", - "Macau_bassin_6", - "Macau_bassin_7", - "Macau_bassin_8", - "Macau_bassin_9", - "Madagascar_bassin_10", - "Madagascar_bassin_11", - "Madagascar_bassin_12", - "Madagascar", - "Madagascar_bassin_5", - "Madagascar_bassin_6", - "Madagascar_bassin_7", - "Madagascar_bassin_8", - "Madagascar_bassin_9", - "Madeira_Islands_bassin_10", - "Madeira_Islands_bassin_11", - "Madeira_Islands_bassin_12", - "Madeira_Islands", - "Madeira_Islands_bassin_5", - "Madeira_Islands_bassin_6", - "Madeira_Islands_bassin_7", - "Madeira_Islands_bassin_8", - "Madeira_Islands_bassin_9", - "Malawi_bassin_10", - "Malawi_bassin_11", - "Malawi_bassin_12", - "Malawi", - "Malawi_bassin_5", - "Malawi_bassin_6", - "Malawi_bassin_7", - "Malawi_bassin_8", - "Malawi_bassin_9", - "Malaysia_bassin_10", - "Malaysia_bassin_11", - "Malaysia_bassin_12", - "Malaysia", - "Malaysia_bassin_5", - "Malaysia_bassin_6", - "Malaysia_bassin_7", - "Malaysia_bassin_8", - "Malaysia_bassin_9", - "Maldives_bassin_10", - "Maldives_bassin_11", - "Maldives_bassin_12", - "Maldives", - "Maldives_bassin_5", - "Maldives_bassin_6", - "Maldives_bassin_7", - "Maldives_bassin_8", - "Maldives_bassin_9", - "Matan_al-Sarra_bassin_10", - "Matan_al-Sarra_bassin_11", - "Matan_al-Sarra_bassin_12", - "Matan_al-Sarra", - "Matan_al-Sarra_bassin_5", - "Matan_al-Sarra_bassin_6", - "Matan_al-Sarra_bassin_7", - "Matan_al-Sarra_bassin_8", - "Matan_al-Sarra_bassin_9", - "Montenegro_bassin_10", - "Montenegro_bassin_11", - "Montenegro_bassin_12", - "Montenegro", - "Montenegro_bassin_5", - "Montenegro_bassin_6", - "Montenegro_bassin_7", - "Montenegro_bassin_8", - "Montenegro_bassin_9", - "Qatar_bassin_10", - "Qatar_bassin_11", - "Qatar_bassin_12", - "Republic_of Korea_bassin_10", - "Republic_of Korea_bassin_11", - "Republic_of Korea_bassin_12", - "Republic_of Korea", - "Republic_of Korea_bassin_5", - "Republic_of Korea_bassin_6", - "Republic_of Korea_bassin_7", - "Republic_of Korea_bassin_8", - "Republic_of Korea_bassin_9", - "Romania_bassin_10", - "Romania_bassin_11", - "Romania_bassin_12", - "Romania", - "Romania_bassin_5", - "Romania_bassin_6", - "Romania_bassin_7", - "Romania_bassin_8", - "Romania_bassin_9", - "Russian_Federation_bassin_10", - "Russian_Federation_bassin_11", - "Russian_Federation_bassin_12", - "Russian_Federation", - "Russian_Federation_bassin_5", - "Russian_Federation_bassin_6", - "Russian_Federation_bassin_7", - "Russian_Federation_bassin_8", - "Russian_Federation_bassin_9", - "Rwanda_bassin_10", - "Rwanda_bassin_11", - "Rwanda_bassin_12", - "Rwanda", - "Rwanda_bassin_5", - "Rwanda_bassin_6", - "Rwanda_bassin_7", - "Rwanda_bassin_8", - "Rwanda_bassin_9", - "Saint_Helena_bassin_10", - "Saint_Helena_bassin_11", - "Saint_Helena_bassin_12", - "Saint_Helena", - "Saint_Helena_bassin_5", - "Saint_Helena_bassin_6", - "Saint_Helena_bassin_7", - "Saint_Helena_bassin_8", - "Saint_Helena_bassin_9", - "Saint_Kitts and Nevis_bassin_10", - "Saint_Kitts and Nevis_bassin_11", - "Saint_Kitts and Nevis_bassin_12", - "Saint_Kitts and Nevis", - "Saint_Kitts and Nevis_bassin_5", - "Saint_Kitts and Nevis_bassin_6", - "Saint_Kitts and Nevis_bassin_7", - "Saint_Kitts and Nevis_bassin_8", - "Saint_Kitts and Nevis_bassin_9", - "Saint_Lucia_bassin_10", - "Saint_Lucia_bassin_11", - "Saint_Lucia_bassin_12", - "Saint_Lucia", - "Saint_Lucia_bassin_5", - "Saint_Lucia_bassin_6", - "Saint_Lucia_bassin_7", - "Saint_Lucia_bassin_8", - "Saint_Lucia_bassin_9", - "Saint_Pierre et Miquelon_bassin_10", - "Saint_Pierre et Miquelon_bassin_11", - "Saint_Pierre et Miquelon_bassin_12", - "Saint_Pierre et Miquelon", - "Saint_Pierre et Miquelon_bassin_5", - "Saint_Pierre et Miquelon_bassin_6", - "Saint_Pierre et Miquelon_bassin_7", - "Saint_Pierre et Miquelon_bassin_8", - "Saint_Pierre et Miquelon_bassin_9", - "Saint_Vincent and the Grenadines_bassin_10", - "Saint_Vincent and the Grenadines_bassin_11", - "Saint_Vincent and the Grenadines_bassin_12", - "Saint_Vincent and the Grenadines", - "Saint_Vincent and the Grenadines_bassin_5", - "Saint_Vincent and the Grenadines_bassin_6", - "Saint_Vincent and the Grenadines_bassin_7", - "Saint_Vincent and the Grenadines_bassin_8", - "Saint_Vincent and the Grenadines_bassin_9", - "Samoa_bassin_10", - "Samoa_bassin_11", - "Samoa_bassin_12", - "Samoa", - "Samoa_bassin_5", - "Samoa_bassin_6", - "Samoa_bassin_7", - "Samoa_bassin_8", - "Samoa_bassin_9", - "San_Marino_bassin_10", - "San_Marino_bassin_11", - "San_Marino_bassin_12", - "San_Marino", - "San_Marino_bassin_5", - "San_Marino_bassin_6", - "San_Marino_bassin_7", - "San_Marino_bassin_8", - "San_Marino_bassin_9", - "Sao_Tome and Principe_bassin_10", - "Sao_Tome and Principe_bassin_11", - "Sao_Tome and Principe_bassin_12", - "Sao_Tome and Principe", - "Sao_Tome and Principe_bassin_5", - "Sao_Tome and Principe_bassin_6", - "Sao_Tome and Principe_bassin_7", - "Sao_Tome and Principe_bassin_8", - "Sao_Tome and Principe_bassin_9", - "Saudi_Arabia_bassin_10", - "Saudi_Arabia_bassin_11", - "Saudi_Arabia_bassin_12", - "Saudi_Arabia", - "Saudi_Arabia_bassin_5", - "Saudi_Arabia_bassin_6", - "Saudi_Arabia_bassin_7", - "Saudi_Arabia_bassin_8", - "Saudi_Arabia_bassin_9", - "Scarborough_Reef_bassin_10", - "Scarborough_Reef_bassin_11", - "Scarborough_Reef_bassin_12", - "Scarborough_Reef", - "Scarborough_Reef_bassin_5", - "Scarborough_Reef_bassin_6", - "Scarborough_Reef_bassin_7", - "Scarborough_Reef_bassin_8", - "Scarborough_Reef_bassin_9", - "Senegal_bassin_10", - "Senegal_bassin_11", - "Senegal_bassin_12", - "Senegal", - "Senegal_bassin_5", - "Senegal_bassin_6", - "Senegal_bassin_7", - "Senegal_bassin_8", - "Senegal_bassin_9", - "Senkaku_Islands_bassin_10", - "Senkaku_Islands_bassin_11", - "Senkaku_Islands_bassin_12", - "Senkaku_Islands", - "Senkaku_Islands_bassin_5", - "Senkaku_Islands_bassin_6", - "Senkaku_Islands_bassin_7", - "Senkaku_Islands_bassin_8", - "Senkaku_Islands_bassin_9", - "Serbia_bassin_10", - "Serbia_bassin_11", - "Serbia_bassin_12", - "Serbia", - "Serbia_bassin_5", - "Serbia_bassin_6", - "Serbia_bassin_7", - "Serbia_bassin_8", - "Serbia_bassin_9", - "Seychelles_bassin_10", - "Seychelles_bassin_11", - "Seychelles_bassin_12", - "Seychelles", - "Seychelles_bassin_5", - "Seychelles_bassin_6", - "Seychelles_bassin_7", - "Seychelles_bassin_8", - "Seychelles_bassin_9", - "Sierra_Leone_bassin_10", - "Sierra_Leone_bassin_11", - "Sierra_Leone_bassin_12", - "Sierra_Leone", - "Sierra_Leone_bassin_5", - "Sierra_Leone_bassin_6", - "Sierra_Leone_bassin_7", - "Sierra_Leone_bassin_8", - "Sierra_Leone_bassin_9", - "Singapore_bassin_10", - "Singapore_bassin_11", - "Singapore_bassin_12", - "Singapore", - "Singapore_bassin_5", - "Singapore_bassin_6", - "Singapore_bassin_7", - "Singapore_bassin_8", - "Singapore_bassin_9", - "Slovakia_bassin_10", - "Slovakia_bassin_11", - "Slovakia_bassin_12", - "Slovakia", - "Slovakia_bassin_5", - "Slovakia_bassin_6", - "Slovakia_bassin_7", - "Slovakia_bassin_8", - "Slovakia_bassin_9", - "Slovenia_bassin_10", - "Slovenia_bassin_11", - "Slovenia_bassin_12", - "Slovenia", - "Slovenia_bassin_5", - "Slovenia_bassin_6", - "Slovenia_bassin_7", - "Slovenia_bassin_8", - "Slovenia_bassin_9", - "Solomon_Islands_bassin_10", - "Solomon_Islands_bassin_11", - "Solomon_Islands_bassin_12", - "Solomon_Islands", - "Solomon_Islands_bassin_5", - "Solomon_Islands_bassin_6", - "Solomon_Islands_bassin_7", - "Solomon_Islands_bassin_8", - "Solomon_Islands_bassin_9", - "Somalia_bassin_10", - "Somalia_bassin_11", - "Somalia_bassin_12", - "Somalia", - "Somalia_bassin_5", - "Somalia_bassin_6", - "Somalia_bassin_7", - "Somalia_bassin_8", - "Somalia_bassin_9", - "South_Africa_bassin_10", - "South_Africa_bassin_11", - "South_Africa_bassin_12", - "South_Africa", - "South_Africa_bassin_5", - "South_Africa_bassin_6", - "South_Africa_bassin_7", - "South_Africa_bassin_8", - "South_Africa_bassin_9", - "South_Georgia and the South Sandwich Islands_bassin_10", - "South_Georgia and the South Sandwich Islands_bassin_11", - "South_Georgia and the South Sandwich Islands_bassin_12", - "South_Georgia and the South Sandwich Islands", - "South_Georgia and the South Sandwich Islands_bassin_5", - "South_Georgia and the South Sandwich Islands_bassin_6", - "South_Georgia and the South Sandwich Islands_bassin_7", - "South_Georgia and the South Sandwich Islands_bassin_8", - "South_Georgia and the South Sandwich Islands_bassin_9", - "South_Sudan_bassin_10", - "South_Sudan_bassin_11", - "South_Sudan_bassin_12", - "South_Sudan", - "South_Sudan_bassin_5", - "South_Sudan_bassin_6", - "South_Sudan_bassin_7", - "South_Sudan_bassin_8", - "South_Sudan_bassin_9", - "Spain_bassin_10", - "Spain_bassin_11", - "Spain_bassin_12", - "Spain", - "Spain_bassin_5", - "Spain_bassin_6", - "Spain_bassin_7", - "Spain_bassin_8", - "Spain_bassin_9", - "Spratly_Islands_bassin_10", - "Spratly_Islands_bassin_11", - "Spratly_Islands_bassin_12", - "Spratly_Islands", - "Spratly_Islands_bassin_5", - "Spratly_Islands_bassin_6", - "Spratly_Islands_bassin_7", - "Spratly_Islands_bassin_8", - "Spratly_Islands_bassin_9", - "Sri_Lanka_bassin_10", - "Sri_Lanka_bassin_11", - "Sri_Lanka_bassin_12", - "Sri_Lanka", - "Sri_Lanka_bassin_5", - "Sri_Lanka_bassin_6", - "Sri_Lanka_bassin_7", - "Sri_Lanka_bassin_8", - "Sri_Lanka_bassin_9", - "Suriname_bassin_10", - "Suriname_bassin_11", - "Suriname_bassin_12", - "Suriname", - "Suriname_bassin_5", - "Suriname_bassin_6", - "Suriname_bassin_7", - "Suriname_bassin_8", - "Suriname_bassin_9", - "Svalbard_and Jan Mayen Islands_bassin_10", - "Svalbard_and Jan Mayen Islands_bassin_11", - "Svalbard_and Jan Mayen Islands_bassin_12", - "Svalbard_and Jan Mayen Islands", - "Svalbard_and Jan Mayen Islands_bassin_5", - "Svalbard_and Jan Mayen Islands_bassin_6", - "Svalbard_and Jan Mayen Islands_bassin_7", - "Svalbard_and Jan Mayen Islands_bassin_8", - "Svalbard_and Jan Mayen Islands_bassin_9", - "Swaziland_bassin_10", - "Swaziland_bassin_11", - "Swaziland_bassin_12", - "Swaziland", - "Swaziland_bassin_5", - "Swaziland_bassin_6", - "Swaziland_bassin_7", - "Swaziland_bassin_8", - "Swaziland_bassin_9", - "Sweden_bassin_10", - "Sweden_bassin_11", - "Sweden_bassin_12", - "Sweden", - "Sweden_bassin_5", - "Sweden_bassin_6", - "Sweden_bassin_7", - "Sweden_bassin_8", - "Sweden_bassin_9", - "Switzerland_bassin_10", - "Switzerland_bassin_11", - "Switzerland_bassin_12", - "Switzerland", - "Switzerland_bassin_5", - "Switzerland_bassin_6", - "Switzerland_bassin_7", - "Switzerland_bassin_8", - "Switzerland_bassin_9", - "Syrian_Arab Republic_bassin_10", - "Syrian_Arab Republic_bassin_11", - "Syrian_Arab Republic_bassin_12", - "Syrian_Arab Republic", - "Syrian_Arab Republic_bassin_5", - "Syrian_Arab Republic_bassin_6", - "Syrian_Arab Republic_bassin_7", - "Syrian_Arab Republic_bassin_8", - "Syrian_Arab Republic_bassin_9", - "Taiwan_bassin_10", - "Taiwan_bassin_11", - "Taiwan_bassin_12", - "Taiwan", - "Taiwan_bassin_5", - "Taiwan_bassin_6", - "Taiwan_bassin_7", - "Taiwan_bassin_8", - "Taiwan_bassin_9", - "Tajikistan_bassin_10", - "Tajikistan_bassin_11", - "Tajikistan_bassin_12", - "Tajikistan", - "Tajikistan_bassin_5", - "Tajikistan_bassin_6", - "Tajikistan_bassin_7", - "Tajikistan_bassin_8", - "Tajikistan_bassin_9", - "Thailand_bassin_10", - "Thailand_bassin_11", - "Thailand_bassin_12", - "Thailand", - "Thailand_bassin_5", - "Thailand_bassin_6", - "Thailand_bassin_7", - "Thailand_bassin_8", - "Thailand_bassin_9", - "The_former Yugoslav Republic of Macedonia_bassin_10", - "The_former Yugoslav Republic of Macedonia_bassin_11", - "The_former Yugoslav Republic of Macedonia_bassin_12", - "The_former Yugoslav Republic of Macedonia", - "The_former Yugoslav Republic of Macedonia_bassin_5", - "The_former Yugoslav Republic of Macedonia_bassin_6", - "The_former Yugoslav Republic of Macedonia_bassin_7", - "The_former Yugoslav Republic of Macedonia_bassin_8", - "The_former Yugoslav Republic of Macedonia_bassin_9", - "Timor-Leste_bassin_10", - "Timor-Leste_bassin_11", - "Timor-Leste_bassin_12", - "Timor-Leste", - "Timor-Leste_bassin_5", - "Timor-Leste_bassin_6", - "Timor-Leste_bassin_7", - "Timor-Leste_bassin_8", - "Timor-Leste_bassin_9", - "Togo_bassin_10", - "Togo_bassin_11", - "Togo_bassin_12", - "Togo", - "Togo_bassin_5", - "Togo_bassin_6", - "Togo_bassin_7", - "Togo_bassin_8", - "Togo_bassin_9", - "Tokelau_bassin_10", - "Tokelau_bassin_11", - "Tokelau_bassin_12", - "Tokelau", - "Tokelau_bassin_5", - "Tokelau_bassin_6", - "Tokelau_bassin_7", - "Tokelau_bassin_8", - "Tokelau_bassin_9", - "Tonga_bassin_10", - "Tonga_bassin_11", - "Tonga_bassin_12", - "Tonga", - "Tonga_bassin_5", - "Tonga_bassin_6", - "Tonga_bassin_7", - "Tonga_bassin_8", - "Tonga_bassin_9", - "Trinidad_and Tobago_bassin_10", - "Trinidad_and Tobago_bassin_11", - "Trinidad_and Tobago_bassin_12", - "Trinidad_and Tobago", - "Trinidad_and Tobago_bassin_5", - "Trinidad_and Tobago_bassin_6", - "Trinidad_and Tobago_bassin_7", - "Trinidad_and Tobago_bassin_8", - "Trinidad_and Tobago_bassin_9", - "Tromelin_Island_bassin_10", - "Tromelin_Island_bassin_11", - "Tromelin_Island_bassin_12", - "Tromelin_Island", - "Tromelin_Island_bassin_5", - "Tromelin_Island_bassin_6", - "Tromelin_Island_bassin_7", - "Tromelin_Island_bassin_8", - "Tromelin_Island_bassin_9", - "Tunisia_bassin_10", - "Tunisia_bassin_11", - "Tunisia_bassin_12", - "Tunisia", - "Tunisia_bassin_5", - "Tunisia_bassin_6", - "Tunisia_bassin_7", - "Tunisia_bassin_8", - "Tunisia_bassin_9", - "Turkey_bassin_10", - "Turkey_bassin_11", - "Turkey_bassin_12", - "Turkey", - "Turkey_bassin_5", - "Turkey_bassin_6", - "Turkey_bassin_7", - "Turkey_bassin_8", - "Turkey_bassin_9", - "Turkmenistan_bassin_10", - "Turkmenistan_bassin_11", - "Turkmenistan_bassin_12", - "Turkmenistan", - "Turkmenistan_bassin_5", - "Turkmenistan_bassin_6", - "Turkmenistan_bassin_7", - "Turkmenistan_bassin_8", - "Turkmenistan_bassin_9", - "Turks_and Caicos islands_bassin_10", - "Turks_and Caicos islands_bassin_11", - "Turks_and Caicos islands_bassin_12", - "Turks_and Caicos islands", - "Turks_and Caicos islands_bassin_5", - "Turks_and Caicos islands_bassin_6", - "Turks_and Caicos islands_bassin_7", - "Turks_and Caicos islands_bassin_8", - "Turks_and Caicos islands_bassin_9", - "Tuvalu_bassin_10", - "Tuvalu_bassin_11", - "Tuvalu_bassin_12", - "Tuvalu", - "Tuvalu_bassin_5", - "Tuvalu_bassin_6", - "Tuvalu_bassin_7", - "Tuvalu_bassin_8", - "Tuvalu_bassin_9", - "Uganda_bassin_10", - "Uganda_bassin_11", - "Uganda_bassin_12", - "Uganda", - "Uganda_bassin_5", - "Uganda_bassin_6", - "Uganda_bassin_7", - "Uganda_bassin_8", - "Uganda_bassin_9", - "Ukraine_bassin_10", - "Ukraine_bassin_11", - "Ukraine_bassin_12", - "Ukraine", - "Ukraine_bassin_5", - "Ukraine_bassin_6", - "Ukraine_bassin_7", - "Ukraine_bassin_8", - "Ukraine_bassin_9", - "UK_of Great Britain and Northern Ireland_bassin_10", - "UK_of Great Britain and Northern Ireland_bassin_11", - "UK_of Great Britain and Northern Ireland_bassin_12", - "UK_of Great Britain and Northern Ireland", - "UK_of Great Britain and Northern Ireland_bassin_5", - "UK_of Great Britain and Northern Ireland_bassin_6", - "UK_of Great Britain and Northern Ireland_bassin_7", - "UK_of Great Britain and Northern Ireland_bassin_8", - "UK_of Great Britain and Northern Ireland_bassin_9", - "United_Arab Emirates_bassin_10", - "United_Arab Emirates_bassin_11", - "United_Arab Emirates_bassin_12", - "United_Arab Emirates", - "United_Arab Emirates_bassin_5", - "United_Arab Emirates_bassin_6", - "United_Arab Emirates_bassin_7", - "United_Arab Emirates_bassin_8", - "United_Arab Emirates_bassin_9", - "United_Republic of Tanzania_bassin_10", - "United_Republic of Tanzania_bassin_11", - "United_Republic of Tanzania_bassin_12", - "United_Republic of Tanzania", - "United_Republic of Tanzania_bassin_5", - "United_Republic of Tanzania_bassin_6", - "United_Republic of Tanzania_bassin_7", - "United_Republic of Tanzania_bassin_8", - "United_Republic of Tanzania_bassin_9", - "United_States of America_bassin_10", - "United_States of America_bassin_11", - "United_States of America_bassin_12", - "United_States of America", - "United_States of America_bassin_5", - "United_States of America_bassin_6", - "United_States of America_bassin_7", - "United_States of America_bassin_8", - "United_States of America_bassin_9", - "United_States Virgin Islands_bassin_10", - "United_States Virgin Islands_bassin_11", - "United_States Virgin Islands_bassin_12", - "United_States Virgin Islands", - "United_States Virgin Islands_bassin_5", - "United_States Virgin Islands_bassin_6", - "United_States Virgin Islands_bassin_7", - "United_States Virgin Islands_bassin_8", - "United_States Virgin Islands_bassin_9", - "Uruguay_bassin_10", - "Uruguay_bassin_11", - "Uruguay_bassin_12", - "Uruguay", - "Uruguay_bassin_5", - "Uruguay_bassin_6", - "Uruguay_bassin_7", - "Uruguay_bassin_8", - "Uruguay_bassin_9", - "Uzbekistan_bassin_10", - "Uzbekistan_bassin_11", - "Uzbekistan_bassin_12", - "Uzbekistan", - "Uzbekistan_bassin_5", - "Uzbekistan_bassin_6", - "Uzbekistan_bassin_7", - "Uzbekistan_bassin_8", - "Uzbekistan_bassin_9", - "Vanuatu_bassin_10", - "Vanuatu_bassin_11", - "Vanuatu_bassin_12", - "Vanuatu", - "Vanuatu_bassin_5", - "Vanuatu_bassin_6", - "Vanuatu_bassin_7", - "Vanuatu_bassin_8", - "Vanuatu_bassin_9", - "Venezuela_bassin_10", - "Venezuela_bassin_11", - "Venezuela_bassin_12", - "Venezuela", - "Venezuela_bassin_5", - "Venezuela_bassin_6", - "Venezuela_bassin_7", - "Venezuela_bassin_8", - "Venezuela_bassin_9", - "Viet_Nam_bassin_10", - "Viet_Nam_bassin_11", - "Viet_Nam_bassin_12", - "Viet_Nam", - "Viet_Nam_bassin_5", - "Viet_Nam_bassin_6", - "Viet_Nam_bassin_7", - "Viet_Nam_bassin_8", - "Viet_Nam_bassin_9", - "Wake_Island_bassin_10", - "Wake_Island_bassin_11", - "Wake_Island_bassin_12", - "Wake_Island", - "Wake_Island_bassin_5", - "Wake_Island_bassin_6", - "Wake_Island_bassin_7", - "Wake_Island_bassin_8", - "Wake_Island_bassin_9", - "Wallis_and Futuna_bassin_10", - "Wallis_and Futuna_bassin_11", - "Wallis_and Futuna_bassin_12", - "Wallis_and Futuna", - "Wallis_and Futuna_bassin_5", - "Wallis_and Futuna_bassin_6", - "Wallis_and Futuna_bassin_7", - "Wallis_and Futuna_bassin_8", - "Wallis_and Futuna_bassin_9", - "Western_Sahara_bassin_10", - "Western_Sahara_bassin_11", - "Western_Sahara_bassin_12", - "Western_Sahara", - "Western_Sahara_bassin_5", - "Western_Sahara_bassin_6", - "Western_Sahara_bassin_7", - "Western_Sahara_bassin_8", - "Western_Sahara_bassin_9", - "West_Bank_bassin_10", - "West_Bank_bassin_11", - "West_Bank_bassin_12", - "West_Bank", - "West_Bank_bassin_5", - "West_Bank_bassin_6", - "West_Bank_bassin_7", - "West_Bank_bassin_8", - "West_Bank_bassin_9", - "Yemen_bassin_10", - "Yemen_bassin_11", - "Yemen_bassin_12", - "Yemen", - "Yemen_bassin_5", - "Yemen_bassin_6", - "Yemen_bassin_7", - "Yemen_bassin_8", - "Yemen_bassin_9", - "Zambia_bassin_10", - "Zambia_bassin_11", - "Zambia_bassin_12", - "Zambia", - "Zambia_bassin_5", - "Zambia_bassin_6", - "Zambia_bassin_7", - "Zambia_bassin_8", - "Zambia_bassin_9", - "Zimbabwe_bassin_10", - "Zimbabwe_bassin_11", - "Zimbabwe_bassin_12", - "Zimbabwe", - "Zimbabwe_bassin_5", - "Zimbabwe_bassin_6", - "Zimbabwe_bassin_7", - "Zimbabwe_bassin_8", - "Zimbabwe_bassin_9" - ) ); - - public static void main(String[] args) { - - ArrayList missingCountries = new ArrayList(); - - for (String country : allCountryNames) { - if( !filesGenerated.contains(country) ) { - missingCountries.add( country); - } - } - System.out.println( missingCountries.size() ); - System.out.println( missingCountries ); - - String finalCountries = ""; - for (String missing : missingCountries) { - finalCountries += '"' + missing.replaceAll( "_", " ") + "\", "; - } - System.out.println( finalCountries ); - - } - - -} +package org.openforis.collect.earth.app.desktop; + +import java.awt.Image; +import java.awt.SplashScreen; +import java.awt.Window; +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.net.MalformedURLException; +import java.net.Socket; +import java.net.URL; +import java.net.URLConnection; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.Observer; + +import javax.swing.ImageIcon; +import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; + +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.SystemUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.desktop.ServerController.ServerInitializationEvent; +import org.openforis.collect.earth.app.logging.GAlogger; +import org.openforis.collect.earth.app.server.LoadProjectFileServlet; +import org.openforis.collect.earth.app.service.EarthProjectsService; +import org.openforis.collect.earth.app.service.FolderFinder; +import org.openforis.collect.earth.app.service.KmlGeneratorService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.app.service.UpdateIniUtils; +import org.openforis.collect.earth.app.view.CheckForUpdatesListener; +import org.openforis.collect.earth.app.view.CollectEarthWindow; +import org.openforis.collect.earth.app.view.Messages; +import org.openforis.collect.earth.app.view.PropertiesDialog; +import org.openforis.collect.earth.sampler.utils.KmlGenerationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.opencsv.exceptions.CsvValidationException; + +import io.sentry.Sentry; +import io.sentry.protocol.User; + +/** + * Contains the main class that starts Collect Earth and opens Google Earth. + * + * @author Alfonso Sanchez-Paus Diaz + * + */ +public class EarthApp { + + private static Logger logger; + private static ServerController serverController; + private static EarthApp earthApp; + + private static void closeSplash() { + try { + final SplashScreen splash = SplashScreen.getSplashScreen(); + if (splash != null) { + splash.close(); + } + } catch (final IllegalStateException e) { + logger.error("Error closing the splash window", e); //$NON-NLS-1$ + } + } + + /** + * Start the application, opening Google Earth and starting the Jetty server. + * + * @param args + * No arguments are used by this method. + */ + public static void main(String[] args) { + + try { + + // System property used in the web.xml configuration + System.setProperty("collectEarth.userFolder", FolderFinder.getCollectEarthDataFolder()); //$NON-NLS-1$ + + // Specify a browser as http.agent so that calls to CloudFlare hosted OpenForis.org do not return with a 403 http error + System.setProperty("http.agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2"); + + initializeSentry(); + + // Change of font so that Lao and Thao glyphs are supported + CollectEarthUtils.setFontDependingOnLanguaue( getLocalProperties().getUiLanguage() ); + + logger = LoggerFactory.getLogger(EarthApp.class); + + String doubleClickedProjectFile = null; + + if (args != null && args.length == 1) { + doubleClickedProjectFile = args[0]; + }else if( getProjectsService().getProjectList().size() == 0 ){ + doubleClickedProjectFile = "resources/demo_survey.cep"; + } + + if ( SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX){ + handleMacStartup( doubleClickedProjectFile ); + }else{ + startCollectEarth( doubleClickedProjectFile ); + } + + } catch (final Exception e) { + // The logger factory has not been initialized, this will not work, just output to console + if (logger != null) { + logger.error("The server could not start", e); //$NON-NLS-1$ + } + System.exit(1); + } finally { + closeSplash(); + } + } + + private static void initializeSentry() { + try { + String releaseName= UpdateIniUtils.getReleaseNameInstalled(); + + Sentry.init("https://24dd6a90c1e4461484712db99c3b3bb7:831e42661c5c4ff3aa5eca270db3f619@sentry.io/299626?release="+releaseName+"&maxmessagelength=2000" ); + if( !StringUtils.isEmpty( UpdateIniUtils.getVersionInstalled() ) ) { + Sentry.setTag( "ReleaseDate", UpdateIniUtils.getVersionInstalled() ); + } + if( !StringUtils.isEmpty( getLocalProperties().getOperator() ) ) { + User user = new User(); + user.setUsername( getLocalProperties().getOperator() ); + Sentry.setUser(user); + } + + } catch (Exception e) { + logger.error( "Error initializing Sentry logger" , e); + } + } + /** + * Special code that uses reflection to handle how the application should behave in Mac OS X. + * Without reflection the code provokes compilation-time errors. + * @param doubleClickedProjectFile Project file (CEP) that was clicked + * @throws Exception Throws Exception when the process fails to open the file double-clicked. Initializes the server in any case + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + public static void handleMacStartup(String doubleClickedProjectFile) throws Exception{ + try { + Class applicationClass = Class.forName("com.apple.eawt.Application"); + Method getApplicationMethod = applicationClass.getMethod("getApplication"); + Method setDockIconImageMethod = applicationClass.getMethod( "setDockIconImage", Image.class ); + + Class openFilesHandlerInterface = Class.forName("com.apple.eawt.OpenFilesHandler"); + Method setOpenFileHandlerMethod = applicationClass.getMethod( "setOpenFileHandler", openFilesHandlerInterface ); + + // SET THE MAC OS X DOCK ICON! + // Get an Application object + Object applicationObject = getApplicationMethod.invoke( null ); + try { + Image dockIconImage = new ImageIcon(new File("images/dockIconMac.png").toURI().toURL()).getImage(); + // Invoke the setDockIconImage on the application object using the dockIconImage as an argument + setDockIconImageMethod.invoke(applicationObject, dockIconImage ); + } catch (MalformedURLException e2) { + logger.error("Problems finding the docker icon", e2); + } + // ------------------------------------------- + + + // DEFINE A LISTENER THAT IS REGISTERED BY THE OS TO HEAR DOUBLE-CLICK EVENTS AND REGISTER ITSELF AS THE CEP OPENER + MacOpenFilesInvocationHandler macOpenFileHandlerProxyInterface = new MacOpenFilesInvocationHandler(); + Object openFilesHandlerImplementation = Proxy.newProxyInstance( + applicationClass.getClassLoader(), + new Class[]{ openFilesHandlerInterface }, + macOpenFileHandlerProxyInterface + ); + + // Call the setOpenFileHandler method of the application object using the + setOpenFileHandlerMethod.invoke(applicationObject, ( openFilesHandlerInterface.cast( openFilesHandlerImplementation ) ) ); + + // Lets wait for the Apple event to arrive. If it did then the earthApp variable will be non-nulls + Thread.sleep(2000); + if( earthApp == null ){ + startCollectEarth( doubleClickedProjectFile ); + } + } catch (Exception e) { + logger.error("Error while defining the double-click behaviour on CEP files in Mac OS X", e); + startCollectEarth( null ); + } + } + + public void generateKml() { + + try { + getKmlGeneratorService().generateKmlFile(); + } catch (final KmlGenerationException e) { + logger.error("Problems while generating the KML file ", e); //$NON-NLS-1$ + showMessage("Problems while generating the KML file:
" + (e.getCause()!=null?(e.getCause()+"
"):"") + ( e.getMessage().length() > 300?e.getMessage().substring(0,300):e.getMessage() ) + ""); //$NON-NLS-1$ + } catch (final Exception e) { + logger.error("Could not generate KML file", e); //$NON-NLS-1$ + showMessage("Error generating KML file :
" + e.getMessage()); //$NON-NLS-1$ + } + } + + public static void openProjectFileInRunningCollectEarth(String doubleClickedProjecFile) throws IOException { + final File projectFile = new File(doubleClickedProjecFile); + + if (projectFile.exists()) { + + String hostAddress = ServerController.getHostAddress( getLocalProperties().getHost(), getLocalProperties().getPort()); + + URL loadProjectFileInRunningCE = new URL(hostAddress + LoadProjectFileServlet.SERVLET_NAME + + "?" + LoadProjectFileServlet.PROJECT_FILE_PARAMETER + "=" + //$NON-NLS-1$ //$NON-NLS-2$ + URLEncoder.encode(doubleClickedProjecFile, StandardCharsets.UTF_8.name() ) ); + URLConnection urlConn = loadProjectFileInRunningCE.openConnection(); + + try( BufferedReader in = new BufferedReader(new InputStreamReader(urlConn.getInputStream())) ){ + String inputLine; + while ((inputLine = in.readLine()) != null) { + logger.info(inputLine); + } + } + + } + } + + private static boolean isAnotherCollectEarthRunning(LocalPropertiesService localProperties) { + boolean alreadyRunning = false; + try { + new Socket( LocalPropertiesService.LOCAL_HOST , Integer.parseInt(localProperties.getPort())).close(); //$NON-NLS-1$ + // If here there is something is serving on port 8028 + // So stop it + logger.warn("There is a server already running {}", localProperties.getPort()); //$NON-NLS-1$ + alreadyRunning = true; + } catch (final IOException e) { + // Nothing there, so OK to proceed + logger.info("There is no server running in port {}", localProperties.getPort()); //$NON-NLS-1$ + alreadyRunning = false; + } catch (final NumberFormatException e) { + // Nothing there, so OK to proceed + logger.info("Error parsing integer value {}", localProperties.getPort()); //$NON-NLS-1$ + alreadyRunning = false; + } + return alreadyRunning; + } + + public static void quitServer() { + try { + serverController.stopServer(); + } catch (Exception e) { + logger.error("Error stoping server", e); //$NON-NLS-1$ + } + } + + /** + * Generates the KML for the project and opens it in Google Earth + * @param forceKmlRecreation Set to true if you want to forece the regeneration of the KML even if is is up to date (you might want to do this to force the update of the placemark icons as the date changes) + * @throws IOException Throws exception if the KMl file cannot be generated + * @throws KmlGenerationException Throws exception if the KML file contents cannot be generated + * @throws CsvValidationException + */ + private static synchronized void loadKmlInGoogleEarth(boolean forceKmlRecreation) throws IOException, KmlGenerationException, CsvValidationException { + earthApp.getKmlGeneratorService().generatePlacemarksKmzFile( forceKmlRecreation ); + earthApp.simulateClickKmz(); + } + + public static void restart() { + try { + + serverController.stopServer(); + startServer(null); + + } catch (final Exception e) { + logger.error("Error while stopping server", e); //$NON-NLS-1$ + } + } + + private static LocalPropertiesService nonManagedPropertiesService; + + + private static LocalPropertiesService getLocalProperties() { + if (serverController == null || serverController.getContext() == null) { + if (nonManagedPropertiesService == null) { + nonManagedPropertiesService = new LocalPropertiesService(); + } + return nonManagedPropertiesService; + } else { + return serverController.getContext().getBean(LocalPropertiesService.class); + } + } + + private static EarthProjectsService getProjectsService() { + if (serverController != null) { + return serverController.getContext().getBean(EarthProjectsService.class); + } else { + final EarthProjectsService earthProjectsService = new EarthProjectsService(); + earthProjectsService.init(getLocalProperties()); + return earthProjectsService; + } + } + + + private KmlGeneratorService getKmlGeneratorService() { + if (serverController != null) { + return serverController.getContext().getBean(KmlGeneratorService.class); + } else { + throw new IllegalStateException("The server must be initialized before this method is called"); //$NON-NLS-1$ + } + } + + private static void startCollectEarth(final String doubleClickedProjectFile) throws Exception { + logger.info("START - Server Initilization"); //$NON-NLS-1$ + final boolean ceAlreadyOpen = isAnotherCollectEarthRunning( getLocalProperties()); + + if( ceAlreadyOpen ){ + closeSplash(); + // If the user double clicked on a project file while Collect Earth is running then load the project in the running Collect Earth + if (doubleClickedProjectFile!=null) { + openProjectFileInRunningCollectEarth(doubleClickedProjectFile); + }else{ + showMessage(Messages.getString("EarthApp.11")); //$NON-NLS-1$ + } + }else{ + + startServer(doubleClickedProjectFile); + } + + GAlogger.logGAnalytics("Start"); + } + + public static void startServer(final String doubleClickedProjectFile) + throws Exception { + earthApp = new EarthApp(); + + // Load the double-clicked CEP file before the survey manager is instantiated by the server start-up + earthApp.loadProjectIfDoubleClicked(doubleClickedProjectFile); + + + final Observer observeInitialization = getServerObserver(); + serverStartAndOpenGe(observeInitialization); + } + + private static Observer getServerObserver() { + return (observable, initializationEvent) ->{ + if (initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT)) { + serverController = null; + } + + if( initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT) || + initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT) ){ + + showMessage( initializationEvent.toString()); + } + + if (!initializationEvent.equals(ServerInitializationEvent.SERVER_STOPPED_EVENT)) { + try { + earthApp.generateKml(); + earthApp.simulateClickKmz(); + earthApp.checkForUpdates(); + closeSplash(); + } catch (final Exception e) { + logger.error("Error generating KML file", e); //$NON-NLS-1$ + } + } + }; + } + + private void openKmlOnGoogleEarth(){ + if (! CollectEarthUtils.openFile( new File(KmlGeneratorService.KML_NETWORK_LINK_STARTER)) ) { + showMessage("The KML file cannot be open at " + KmlGeneratorService.KML_NETWORK_LINK_STARTER); //$NON-NLS-1$ + } + } + + private void checkForUpdates() { + new Thread("Check for new Collect Earth versions on the server") { + @Override + public void run() { + + // Wait a few seconds before checking for updates + try { + Thread.sleep(10000); + } catch (InterruptedException e1) { + logger.error("Error while waiting", e1); //$NON-NLS-1$ + } + + final UpdateIniUtils updateIniUtils = new UpdateIniUtils(); + + + if (updateIniUtils.shouldWarnUser(getLocalProperties() )) { + + javax.swing.SwingUtilities.invokeLater( () -> { + String remindLater = Messages.getString("EarthApp.3"); //$NON-NLS-1$ + String doItNow = Messages.getString("EarthApp.4"); //$NON-NLS-1$ + String doNotBother = Messages.getString("EarthApp.5"); //$NON-NLS-1$ + + String newestVersionOnline = updateIniUtils.getVersionAvailableOnline(); + + if( StringUtils.isNotBlank( newestVersionOnline ) ) { + + Object[] possibleValues = { remindLater, doItNow, doNotBother }; + int chosenOption = JOptionPane.showOptionDialog(null, + Messages.getString("EarthApp.57"), Messages.getString("EarthApp.58") + Messages.getString("EarthApp.6") + updateIniUtils.convertToDate(newestVersionOnline), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, possibleValues, possibleValues[0]); + if( chosenOption != JOptionPane.CLOSED_OPTION ){ + if (possibleValues[chosenOption].equals(doItNow)) { + CheckForUpdatesListener checkForUpdatesListener = new CheckForUpdatesListener(); + checkForUpdatesListener.actionPerformed(null); + } else if (possibleValues[chosenOption].equals(doNotBother)) { + getLocalProperties().setValue(EarthProperty.LAST_IGNORED_UPDATE, newestVersionOnline); + } + } + } + }); + } + } + }.start(); + + } + + + /** + * If Collect Earth is started by double clicking on a ".cep" file ( Collect Earth Project file ) + * Then it should open directly with that project in focus + * + * @param doubleClickedProjecFile + * The path to the CEP file that was double-clicked + * + */ + private void loadProjectIfDoubleClicked(String doubleClickedProjectFile) { + try { + if (doubleClickedProjectFile != null) { + + final File projectFile = new File(doubleClickedProjectFile); + + if (projectFile.exists()) { + getProjectsService().loadCompressedProjectFile(projectFile); + } + } + } catch (final Exception e) { + showMessage(Messages.getString("EarthApp.59")); //$NON-NLS-1$ + logger.error(Messages.getString("EarthApp.59"), e);//$NON-NLS-1$ + } + } + + private static void serverStartAndOpenGe(Observer observeInitialization) throws Exception { + serverController = new ServerController(); + serverController.deleteObservers(); + serverController.startServer(observeInitialization); + + // Inform Mac OS users of the issues about opening CEP files in the Mac version of CE + if(SystemUtils.IS_OS_MAC_OSX ) { + showMessage( + "" //$NON-NLS-1$ + + "" //$NON-NLS-1$ + + Messages.getString("EarthApp.70") + + ": " //$NON-NLS-1$ + + Messages.getString("EarthApp.71") + + Messages.getString("EarthApp.72") + + "" //$NON-NLS-1$ + + Messages.getString("CollectEarthWindow.10") + + " -> " //$NON-NLS-1$ + + Messages.getString("CollectEarthMenu.0") + + "", //$NON-NLS-1$ + Messages.getString("EarthApp.73") + ); + } + } + + public static void showMessage(String message) { + showMessage(message, "Collect Earth"); + + } + + public static void showMessage(String message, String title) { + try { + SwingUtilities.invokeLater( + () -> JOptionPane.showMessageDialog(null, message, title, JOptionPane.WARNING_MESSAGE) + ); + } catch (Exception e) { + logger.error("Error showing message",e); + } + + } + + private void simulateClickKmz() { + try { + getKmlGeneratorService().generateLoaderKmlFile(); + openKmlOnGoogleEarth(); + } catch (final Exception e) { + showMessage(Messages.getString("EarthApp.61")); //$NON-NLS-1$ + logger.error("The KMZ file could not be found", e); //$NON-NLS-1$ + } + } + + public static void executeKmlLoadAsynchronously( Window windowShowingTimer ) { + new Thread("Load KML in Google Earth"){ + @Override + public void run() { + // Only regenerate KML and reload + try { + SwingUtilities.invokeLater( ( ) -> { + if( windowShowingTimer != null ){ + CollectEarthWindow.startWaiting(windowShowingTimer); + } + }); + + EarthApp.loadKmlInGoogleEarth(true); + + } catch (Exception e) { + logger.error("Error loading the KML",e); + EarthApp.showMessage("Problems while generating the KML file:
" + + (e.getCause()!=null?(e.getCause()+"
"):"") + + ( + ( e.getMessage()!=null && e.getMessage().length() > 300 ) ? e.getMessage().substring(0,300) : + ( e.getMessage()!=null ) ? e.getMessage() : "" + ) + ""); //$NON-NLS-1$ + }finally{ + if( windowShowingTimer != null ){ + try { + SwingUtilities.invokeLater( () -> { + CollectEarthWindow.endWaiting(windowShowingTimer); + if( windowShowingTimer instanceof PropertiesDialog ){ + ( (PropertiesDialog) windowShowingTimer).closeDialog(); + } + }); + } catch (Exception e2) { + logger.error("Error closing Options dialog", e2); + } + } + } + + } + }.start(); + } + + +} From fb14d16f7506efcf9eddf03c4a29156ae9c68e22 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:19 +0100 Subject: [PATCH 0996/1620] New translations EarthApp.java (English) --- .../earth/app/view/Messages_en.properties | 2429 ++++------------- 1 file changed, 534 insertions(+), 1895 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 768f973a7f..0777f46090 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,1895 +1,534 @@ -package org.openforis.collect.earth.app.ad_hoc; - -import java.util.ArrayList; -import java.util.Arrays; - -public class findMissingCountries { - - private static ArrayList allCountryNames = new ArrayList<>( - Arrays.asList( - "Abyei", - "Afghanistan", - "Aksai_Chin", - "Albania", - "Algeria", - "American_Samoa", - "Andorra", - "Angola", - "Anguilla", - "Antarctica", - "Antigua_and_Barbuda", - "Argentina", - "Armenia", - "Aruba", - "Arunachal_Pradesh", - "Ashmore_and_Cartier_Islands", - "Australia", - "Austria", - "Azerbaijan", - "Azores_Islands", - "Bahamas", - "Bahrain", - "Baker_Island", - "Bangladesh", - "Barbados", - "Bassas_da_India", - "Belarus", - "Belgium", - "Belize", - "Benin", - "Bermuda", - "Bhutan", - "Bird_Island", - "Bolivia", - "Bosnia_and_Herzegovina", - "Botswana", - "Bouvet_Island", - "Brazil", - "British_Indian_Ocean_Territory", - "British_Virgin_Islands", - "Brunei_Darussalam", - "Bulgaria", - "Burkina_Faso", - "Burundi", - "Cambodia", - "Cameroon", - "Canada", - "Cape_Verde", - "Cayman_Islands", - "Central_African_Republic", - "Chad", - "Chile", - "China", - "China/India", - "Christmas_Island", - "Clipperton_Island", - "Cocos__Keeling__Islands", - "Colombia", - "Comoros", - "Congo", - "Cook_Islands", - "Costa_Rica", - "Croatia", - "Cuba", - "Cyprus", - "Czech_Republic", - "C�te_d_Ivoire", - "Dem_People_s_Rep_of_Korea", - "Democratic_Republic_of_the_Congo", - "Denmark", - "Djibouti", - "Dominica", - "Dominican_Republic", - "Ecuador", - "Egypt", - "El_Salvador", - "Equatorial_Guinea", - "Eritrea", - "Estonia", - "Ethiopia", - "Europa_Island", - "Falkland_Islands__Malvinas_", - "Faroe_Islands", - "Fiji", - "Finland", - "France", - "French_Guiana", - "French_Polynesia", - "French_Southern_and_Antarctic_Territories", - "Gabon", - "Gambia", - "Gaza_Strip", - "Georgia", - "Germany", - "Ghana", - "Gibraltar", - "Glorioso_Island", - "Greece", - "Greenland", - "Grenada", - "Guadeloupe", - "Guam", - "Guatemala", - "Guernsey", - "Guinea", - "Guinea-Bissau", - "Guyana", - "Haiti", - "Hala_ib_triangle", - "Heard_Island_and_McDonald_Islands", - "Holy_See", - "Honduras", - "Hong_Kong", - "Howland_Island", - "Hungary", - "Iceland", - "Ilemi_triangle", - "India", - "Indonesia", - "Iran___Islamic_Republic_of_", - "Iraq", - "Ireland", - "Isle_of_Man", - "Israel", - "Italy", - "Jamaica", - "Jammu_and_Kashmir", - "Japan", - "Jarvis_Island", - "Jersey", - "Johnston_Atoll", - "Jordan", - "Juan_de_Nova_Island", - "Kazakhstan", - "Kenya", - "Kingman_Reef", - "Kiribati", - "Kuril_islands", - "Kuwait", - "Kyrgyzstan", - "Lao_People_s_Democratic_Republic", - "Latvia", - "Lebanon", - "Lesotho", - "Liberia", - "Libya", - "Liechtenstein", - "Lithuania", - "Luxembourg", - "Ma_tan_al-Sarra", - "Macau", - "Madagascar", - "Madeira_Islands", - "Malawi", - "Malaysia", - "Maldives", - "Mali", - "Malta", - "Marshall_Islands", - "Martinique", - "Mauritania", - "Mauritius", - "Mayotte", - "Mexico", - "Micronesia__Federated_States_of_", - "Midway_Island", - "Moldova,_Republic_of", - "Monaco", - "Mongolia", - "Montenegro", - "Montserrat", - "Morocco", - "Mozambique", - "Myanmar", - "Namibia", - "Nauru", - "Navassa_Island", - "Nepal", - "Netherlands", - "Netherlands_Antilles", - "New_Caledonia", - "New_Zealand", - "Nicaragua", - "Niger", - "Nigeria", - "Niue", - "Norfolk_Island", - "Northern_Mariana_Islands", - "Norway", - "Oman", - "Pakistan", - "Palau", - "Palmyra_Atoll", - "Panama", - "Papua_New_Guinea", - "Paracel_Islands", - "Paraguay", - "Peru", - "Philippines", - "Pitcairn", - "Poland", - "Portugal", - "Puerto_Rico", - "Qatar", - "Republic_of_Korea", - "Romania", - "Russian_Federation", - "Rwanda", - "R�union", - "Saint_Helena", - "Saint_Kitts_and_Nevis", - "Saint_Lucia", - "Saint_Pierre_et_Miquelon", - "Saint_Vincent_and_the_Grenadines", - "Samoa", - "San_Marino", - "Sao_Tome_and_Principe", - "Saudi_Arabia", - "Scarborough_Reef", - "Senegal", - "Senkaku_Islands", - "Serbia", - "Seychelles", - "Sierra_Leone", - "Singapore", - "Slovakia", - "Slovenia", - "Solomon_Islands", - "Somalia", - "South_Africa", - "South_Georgia_and_the_South_Sandwich_Islands", - "South_Sudan", - "Spain", - "Spratly_Islands", - "Sri_Lanka", - "Sudan", - "Suriname", - "Svalbard_and_Jan_Mayen_Islands", - "Swaziland", - "Sweden", - "Switzerland", - "Syrian_Arab_Republic", - "Taiwan", - "Tajikistan", - "Thailand", - "The_former_Yugoslav_Republic_of_Macedonia", - "Timor-Leste", - "Togo", - "Tokelau", - "Tonga", - "Trinidad_and_Tobago", - "Tromelin_Island", - "Tunisia", - "Turkey", - "Turkmenistan", - "Turks_and_Caicos_islands", - "Tuvalu", - "UK_of_Great_Britain_and_Northern_Ireland", - "Uganda", - "Ukraine", - "United_Arab_Emirates", - "United_Republic_of_Tanzania", - "United_States_Virgin_Islands", - "United_States_of_America", - "Uruguay", - "Uzbekistan", - "Vanuatu", - "Venezuela", - "Viet_Nam", - "Wake_Island", - "Wallis_and_Futuna", - "West_Bank", - "Western_Sahara", - "Yemen", - "Zambia", - "Zimbabwe" ) ); - - private static ArrayList filesGenerated = new ArrayList<>( - Arrays.asList( "Azores_Islands_bassin_10", - "Azores_Islands_bassin_11", - "Azores_Islands_bassin_12", - "Azores_Islands", - "Azores_Islands_bassin_5", - "Azores_Islands_bassin_6", - "Azores_Islands_bassin_7", - "Azores_Islands_bassin_8", - "Azores_Islands_bassin_9", - "Brunei_Darussalam_bassin_10", - "Brunei_Darussalam_bassin_11", - "Brunei_Darussalam_bassin_12", - "Brunei_Darussalam_bassin_7", - "Brunei_Darussalam_bassin_8", - "Brunei_Darussalam_bassin_9", - "Bulgaria_bassin_10", - "Bulgaria_bassin_11", - "Bulgaria_bassin_12", - "Bulgaria", - "Bulgaria_bassin_5", - "Bulgaria_bassin_6", - "Bulgaria_bassin_7", - "Bulgaria_bassin_8", - "Bulgaria_bassin_9", - "Burkina_Faso_bassin_10", - "Burkina_Faso_bassin_11", - "Burkina_Faso_bassin_12", - "Burkina_Faso", - "Burkina_Faso_bassin_5", - "Burkina_Faso_bassin_6", - "Burkina_Faso_bassin_7", - "Burkina_Faso_bassin_8", - "Burkina_Faso_bassin_9", - "Burundi_bassin_10", - "Burundi_bassin_11", - "Burundi_bassin_12", - "Burundi", - "Burundi_bassin_5", - "Burundi_bassin_6", - "Burundi_bassin_7", - "Burundi_bassin_8", - "Burundi_bassin_9", - "Cambodia_bassin_10", - "Cambodia_bassin_11", - "Cambodia_bassin_12", - "Cambodia", - "Cambodia_bassin_5", - "Cambodia_bassin_6", - "Cambodia_bassin_7", - "Cambodia_bassin_8", - "Cambodia_bassin_9", - "Cameroon_bassin_10", - "Cameroon_bassin_11", - "Cameroon_bassin_12", - "Cameroon", - "Cameroon_bassin_5", - "Cameroon_bassin_6", - "Cameroon_bassin_7", - "Cameroon_bassin_8", - "Cameroon_bassin_9", - "Canada_bassin_10", - "Canada_bassin_11", - "Canada_bassin_12", - "Canada", - "Canada_bassin_5", - "Canada_bassin_6", - "Canada_bassin_7", - "Canada_bassin_8", - "Canada_bassin_9", - "Cape_Verde_bassin_10", - "Cape_Verde_bassin_11", - "Cape_Verde_bassin_12", - "Cape_Verde", - "Cape_Verde_bassin_5", - "Cape_Verde_bassin_6", - "Cape_Verde_bassin_7", - "Cape_Verde_bassin_8", - "Cape_Verde_bassin_9", - "Cayman_Islands_bassin_10", - "Cayman_Islands_bassin_11", - "Cayman_Islands_bassin_12", - "Cayman_Islands", - "Cayman_Islands_bassin_5", - "Cayman_Islands_bassin_6", - "Cayman_Islands_bassin_7", - "Cayman_Islands_bassin_8", - "Cayman_Islands_bassin_9", - "Central_African Republic_bassin_10", - "Central_African Republic_bassin_11", - "Central_African Republic_bassin_12", - "Central_African Republic", - "Central_African Republic_bassin_5", - "Central_African Republic_bassin_6", - "Central_African Republic_bassin_7", - "Central_African Republic_bassin_8", - "Central_African Republic_bassin_9", - "Chad_bassin_10", - "Chad_bassin_11", - "Chad_bassin_12", - "Chad", - "Chad_bassin_5", - "Chad_bassin_6", - "Chad_bassin_7", - "Chad_bassin_8", - "Chad_bassin_9", - "Chile_bassin_10", - "Chile_bassin_11", - "Chile_bassin_12", - "Chile", - "Chile_bassin_5", - "Chile_bassin_6", - "Chile_bassin_7", - "Chile_bassin_8", - "Chile_bassin_9", - "China_bassin_10", - "China_bassin_11", - "China_bassin_12", - "China", - "China_bassin_5", - "China_bassin_6", - "China_bassin_7", - "China_bassin_8", - "China_bassin_9", - "Christmas_Island_bassin_10", - "Christmas_Island_bassin_11", - "Christmas_Island_bassin_12", - "Christmas_Island", - "Christmas_Island_bassin_5", - "Christmas_Island_bassin_6", - "Christmas_Island_bassin_7", - "Christmas_Island_bassin_8", - "Christmas_Island_bassin_9", - "Clipperton_Island_bassin_10", - "Clipperton_Island_bassin_11", - "Clipperton_Island_bassin_12", - "Clipperton_Island", - "Clipperton_Island_bassin_5", - "Clipperton_Island_bassin_6", - "Clipperton_Island_bassin_7", - "Clipperton_Island_bassin_8", - "Clipperton_Island_bassin_9", - "Colombia_bassin_10", - "Colombia_bassin_11", - "Colombia_bassin_12", - "Colombia", - "Colombia_bassin_5", - "Colombia_bassin_6", - "Colombia_bassin_7", - "Colombia_bassin_8", - "Colombia_bassin_9", - "Comoros_bassin_10", - "Comoros_bassin_11", - "Comoros_bassin_12", - "Comoros", - "Comoros_bassin_5", - "Comoros_bassin_6", - "Comoros_bassin_7", - "Comoros_bassin_8", - "Comoros_bassin_9", - "Congo_bassin_10", - "Congo_bassin_11", - "Congo_bassin_12", - "Congo", - "Congo_bassin_5", - "Congo_bassin_6", - "Congo_bassin_7", - "Congo_bassin_8", - "Congo_bassin_9", - "Cook_Islands_bassin_10", - "Cook_Islands_bassin_11", - "Cook_Islands_bassin_12", - "Cook_Islands", - "Cook_Islands_bassin_5", - "Cook_Islands_bassin_6", - "Cook_Islands_bassin_7", - "Cook_Islands_bassin_8", - "Cook_Islands_bassin_9", - "Costa_Rica_bassin_10", - "Costa_Rica_bassin_11", - "Costa_Rica_bassin_12", - "Costa_Rica", - "Costa_Rica_bassin_5", - "Costa_Rica_bassin_6", - "Costa_Rica_bassin_7", - "Costa_Rica_bassin_8", - "Costa_Rica_bassin_9", - "Croatia_bassin_10", - "Croatia_bassin_11", - "Croatia_bassin_12", - "Croatia", - "Croatia_bassin_5", - "Croatia_bassin_6", - "Croatia_bassin_7", - "Croatia_bassin_8", - "Croatia_bassin_9", - "Cuba_bassin_10", - "Cuba_bassin_11", - "Cuba_bassin_12", - "Cuba", - "Cuba_bassin_5", - "Cuba_bassin_6", - "Cuba_bassin_7", - "Cuba_bassin_8", - "Cuba_bassin_9", - "Cyprus_bassin_10", - "Cyprus_bassin_11", - "Cyprus_bassin_12", - "Cyprus", - "Cyprus_bassin_5", - "Cyprus_bassin_6", - "Cyprus_bassin_7", - "Cyprus_bassin_8", - "Cyprus_bassin_9", - "Czech_Republic_bassin_10", - "Czech_Republic_bassin_11", - "Czech_Republic_bassin_12", - "Czech_Republic", - "Czech_Republic_bassin_5", - "Czech_Republic_bassin_6", - "Czech_Republic_bassin_7", - "Czech_Republic_bassin_8", - "Czech_Republic_bassin_9", - "Democratic_Republic of the Congo_bassin_10", - "Democratic_Republic of the Congo_bassin_11", - "Democratic_Republic of the Congo_bassin_12", - "Democratic_Republic of the Congo", - "Democratic_Republic of the Congo_bassin_5", - "Democratic_Republic of the Congo_bassin_6", - "Democratic_Republic of the Congo_bassin_7", - "Democratic_Republic of the Congo_bassin_8", - "Democratic_Republic of the Congo_bassin_9", - "Dem_Peoples Rep of Korea_bassin_10", - "Dem_Peoples Rep of Korea_bassin_11", - "Dem_Peoples Rep of Korea_bassin_12", - "Dem_Peoples Rep of Korea", - "Dem_Peoples Rep of Korea_bassin_5", - "Dem_Peoples Rep of Korea_bassin_6", - "Dem_Peoples Rep of Korea_bassin_7", - "Dem_Peoples Rep of Korea_bassin_8", - "Dem_Peoples Rep of Korea_bassin_9", - "Denmark_bassin_10", - "Denmark_bassin_11", - "Denmark_bassin_12", - "Denmark", - "Denmark_bassin_5", - "Denmark_bassin_6", - "Denmark_bassin_7", - "Denmark_bassin_8", - "Denmark_bassin_9", - "Djibouti_bassin_10", - "Djibouti_bassin_11", - "Djibouti_bassin_12", - "Djibouti", - "Djibouti_bassin_5", - "Djibouti_bassin_6", - "Djibouti_bassin_7", - "Djibouti_bassin_8", - "Djibouti_bassin_9", - "Dominican_Republic_bassin_10", - "Dominican_Republic_bassin_11", - "Dominican_Republic_bassin_12", - "Dominican_Republic", - "Dominican_Republic_bassin_5", - "Dominican_Republic_bassin_6", - "Dominican_Republic_bassin_7", - "Dominican_Republic_bassin_8", - "Dominican_Republic_bassin_9", - "Dominica_bassin_10", - "Dominica_bassin_11", - "Dominica_bassin_12", - "Dominica", - "Dominica_bassin_5", - "Dominica_bassin_6", - "Dominica_bassin_7", - "Dominica_bassin_8", - "Dominica_bassin_9", - "Ecuador_bassin_10", - "Ecuador_bassin_11", - "Ecuador_bassin_12", - "Ecuador", - "Ecuador_bassin_5", - "Ecuador_bassin_6", - "Ecuador_bassin_7", - "Ecuador_bassin_8", - "Ecuador_bassin_9", - "Egypt_bassin_10", - "Egypt_bassin_11", - "Egypt_bassin_12", - "Egypt", - "Egypt_bassin_5", - "Egypt_bassin_6", - "Egypt_bassin_7", - "Egypt_bassin_8", - "Egypt_bassin_9", - "El_Salvador_bassin_10", - "El_Salvador_bassin_11", - "El_Salvador_bassin_12", - "El_Salvador", - "El_Salvador_bassin_5", - "El_Salvador_bassin_6", - "El_Salvador_bassin_7", - "El_Salvador_bassin_8", - "El_Salvador_bassin_9", - "Equatorial_Guinea_bassin_10", - "Equatorial_Guinea_bassin_11", - "Equatorial_Guinea_bassin_12", - "Equatorial_Guinea", - "Equatorial_Guinea_bassin_5", - "Equatorial_Guinea_bassin_6", - "Equatorial_Guinea_bassin_7", - "Equatorial_Guinea_bassin_8", - "Equatorial_Guinea_bassin_9", - "Eritrea_bassin_10", - "Eritrea_bassin_11", - "Eritrea_bassin_12", - "Eritrea", - "Eritrea_bassin_5", - "Eritrea_bassin_6", - "Eritrea_bassin_7", - "Eritrea_bassin_8", - "Eritrea_bassin_9", - "Estonia_bassin_10", - "Estonia_bassin_11", - "Estonia_bassin_12", - "Estonia", - "Estonia_bassin_5", - "Estonia_bassin_6", - "Estonia_bassin_7", - "Estonia_bassin_8", - "Estonia_bassin_9", - "Ethiopia_bassin_10", - "Ethiopia_bassin_11", - "Ethiopia_bassin_12", - "Ethiopia", - "Ethiopia_bassin_5", - "Ethiopia_bassin_6", - "Ethiopia_bassin_7", - "Ethiopia_bassin_8", - "Ethiopia_bassin_9", - "Europa_Island_bassin_10", - "Europa_Island_bassin_11", - "Europa_Island_bassin_12", - "Europa_Island", - "Europa_Island_bassin_5", - "Europa_Island_bassin_6", - "Europa_Island_bassin_7", - "Europa_Island_bassin_8", - "Europa_Island_bassin_9", - "Faroe_Islands_bassin_10", - "Faroe_Islands_bassin_11", - "Faroe_Islands_bassin_12", - "Faroe_Islands", - "Faroe_Islands_bassin_5", - "Faroe_Islands_bassin_6", - "Faroe_Islands_bassin_7", - "Faroe_Islands_bassin_8", - "Faroe_Islands_bassin_9", - "Fiji_bassin_10", - "Fiji_bassin_11", - "Fiji_bassin_12", - "Fiji", - "Fiji_bassin_5", - "Fiji_bassin_6", - "Fiji_bassin_7", - "Fiji_bassin_8", - "Fiji_bassin_9", - "Finland_bassin_10", - "Finland_bassin_11", - "Finland_bassin_12", - "Finland", - "Finland_bassin_5", - "Finland_bassin_6", - "Finland_bassin_7", - "Finland_bassin_8", - "Finland_bassin_9", - "France_bassin_10", - "France_bassin_11", - "France_bassin_12", - "France", - "France_bassin_5", - "France_bassin_6", - "France_bassin_7", - "France_bassin_8", - "France_bassin_9", - "French_Guiana_bassin_10", - "French_Guiana_bassin_11", - "French_Guiana_bassin_12", - "French_Guiana", - "French_Guiana_bassin_5", - "French_Guiana_bassin_6", - "French_Guiana_bassin_7", - "French_Guiana_bassin_8", - "French_Guiana_bassin_9", - "French_Polynesia_bassin_10", - "French_Polynesia_bassin_11", - "French_Polynesia_bassin_12", - "French_Polynesia", - "French_Polynesia_bassin_5", - "French_Polynesia_bassin_6", - "French_Polynesia_bassin_7", - "French_Polynesia_bassin_8", - "French_Polynesia_bassin_9", - "French_Southern and Antarctic Territories_bassin_10", - "French_Southern and Antarctic Territories_bassin_11", - "French_Southern and Antarctic Territories_bassin_12", - "French_Southern and Antarctic Territories", - "French_Southern and Antarctic Territories_bassin_5", - "French_Southern and Antarctic Territories_bassin_6", - "French_Southern and Antarctic Territories_bassin_7", - "French_Southern and Antarctic Territories_bassin_8", - "French_Southern and Antarctic Territories_bassin_9", - "Gabon_bassin_10", - "Gabon_bassin_11", - "Gabon_bassin_12", - "Gabon", - "Gabon_bassin_5", - "Gabon_bassin_6", - "Gabon_bassin_7", - "Gabon_bassin_8", - "Gabon_bassin_9", - "Gambia_bassin_10", - "Gambia_bassin_11", - "Gambia_bassin_12", - "Gambia", - "Gambia_bassin_5", - "Gambia_bassin_6", - "Gambia_bassin_7", - "Gambia_bassin_8", - "Gambia_bassin_9", - "Gaza_Strip_bassin_10", - "Gaza_Strip_bassin_11", - "Gaza_Strip_bassin_12", - "Gaza_Strip", - "Gaza_Strip_bassin_5", - "Gaza_Strip_bassin_6", - "Gaza_Strip_bassin_7", - "Gaza_Strip_bassin_8", - "Gaza_Strip_bassin_9", - "Georgia_bassin_10", - "Georgia_bassin_11", - "Georgia_bassin_12", - "Georgia", - "Georgia_bassin_5", - "Georgia_bassin_6", - "Georgia_bassin_7", - "Georgia_bassin_8", - "Georgia_bassin_9", - "Germany_bassin_10", - "Germany_bassin_11", - "Germany_bassin_12", - "Germany", - "Germany_bassin_5", - "Germany_bassin_6", - "Germany_bassin_7", - "Germany_bassin_8", - "Germany_bassin_9", - "Ghana_bassin_10", - "Ghana_bassin_11", - "Ghana_bassin_12", - "Ghana", - "Ghana_bassin_5", - "Ghana_bassin_6", - "Ghana_bassin_8", - "Ghana_bassin_9", - "Gibraltar_bassin_10", - "Gibraltar_bassin_11", - "Gibraltar_bassin_12", - "Gibraltar", - "Gibraltar_bassin_5", - "Gibraltar_bassin_6", - "Gibraltar_bassin_7", - "Gibraltar_bassin_8", - "Gibraltar_bassin_9", - "Glorioso_Island_bassin_10", - "Glorioso_Island_bassin_11", - "Glorioso_Island_bassin_12", - "Glorioso_Island", - "Glorioso_Island_bassin_5", - "Glorioso_Island_bassin_6", - "Glorioso_Island_bassin_7", - "Glorioso_Island_bassin_8", - "Glorioso_Island_bassin_9", - "Greece_bassin_10", - "Greece_bassin_11", - "Greece_bassin_12", - "Greece", - "Greece_bassin_5", - "Greece_bassin_6", - "Greece_bassin_7", - "Greece_bassin_8", - "Greece_bassin_9", - "Greenland_bassin_10", - "Greenland_bassin_11", - "Greenland_bassin_12", - "Greenland", - "Greenland_bassin_5", - "Greenland_bassin_6", - "Greenland_bassin_7", - "Greenland_bassin_8", - "Greenland_bassin_9", - "Grenada_bassin_10", - "Grenada_bassin_11", - "Grenada_bassin_12", - "Grenada", - "Grenada_bassin_5", - "Grenada_bassin_6", - "Grenada_bassin_7", - "Grenada_bassin_8", - "Grenada_bassin_9", - "Guadeloupe_bassin_10", - "Guadeloupe_bassin_11", - "Guadeloupe_bassin_12", - "Guadeloupe", - "Guadeloupe_bassin_5", - "Guadeloupe_bassin_6", - "Guadeloupe_bassin_7", - "Guadeloupe_bassin_8", - "Guadeloupe_bassin_9", - "Guam_bassin_10", - "Guam_bassin_11", - "Guam_bassin_12", - "Guam", - "Guam_bassin_5", - "Guam_bassin_6", - "Guam_bassin_7", - "Guam_bassin_8", - "Guam_bassin_9", - "Halaib_triangle_bassin_10", - "Halaib_triangle_bassin_11", - "Halaib_triangle_bassin_12", - "Halaib_triangle", - "Halaib_triangle_bassin_5", - "Halaib_triangle_bassin_6", - "Halaib_triangle_bassin_7", - "Halaib_triangle_bassin_8", - "Halaib_triangle_bassin_9", - "Heard_Island and McDonald Islands_bassin_12", - "Holy_See_bassin_10", - "Holy_See_bassin_11", - "Holy_See_bassin_12", - "Holy_See", - "Holy_See_bassin_5", - "Holy_See_bassin_6", - "Holy_See_bassin_7", - "Holy_See_bassin_8", - "Holy_See_bassin_9", - "Honduras_bassin_10", - "Honduras_bassin_11", - "Honduras_bassin_12", - "Honduras", - "Honduras_bassin_5", - "Honduras_bassin_6", - "Honduras_bassin_7", - "Honduras_bassin_8", - "Honduras_bassin_9", - "Hong_Kong_bassin_10", - "Hong_Kong_bassin_11", - "Hong_Kong_bassin_12", - "Hong_Kong", - "Hong_Kong_bassin_5", - "Hong_Kong_bassin_6", - "Hong_Kong_bassin_7", - "Hong_Kong_bassin_8", - "Hong_Kong_bassin_9", - "Howland_Island_bassin_10", - "Howland_Island_bassin_11", - "Howland_Island_bassin_12", - "Howland_Island", - "Howland_Island_bassin_5", - "Howland_Island_bassin_6", - "Howland_Island_bassin_7", - "Howland_Island_bassin_8", - "Howland_Island_bassin_9", - "Hungary_bassin_10", - "Hungary_bassin_11", - "Hungary_bassin_12", - "Hungary", - "Hungary_bassin_5", - "Hungary_bassin_6", - "Hungary_bassin_7", - "Hungary_bassin_8", - "Hungary_bassin_9", - "Iceland_bassin_10", - "Iceland_bassin_11", - "Iceland_bassin_12", - "Iceland", - "Iceland_bassin_5", - "Iceland_bassin_6", - "Iceland_bassin_7", - "Iceland_bassin_8", - "Iceland_bassin_9", - "Ilemi_triangle_bassin_10", - "Ilemi_triangle_bassin_11", - "Ilemi_triangle_bassin_12", - "Ilemi_triangle", - "Ilemi_triangle_bassin_5", - "Ilemi_triangle_bassin_6", - "Ilemi_triangle_bassin_7", - "Ilemi_triangle_bassin_8", - "Ilemi_triangle_bassin_9", - "India_bassin_10", - "India_bassin_11", - "India_bassin_12", - "India", - "India_bassin_5", - "India_bassin_6", - "India_bassin_7", - "India_bassin_8", - "India_bassin_9", - "Indonesia_bassin_10", - "Indonesia_bassin_11", - "Indonesia_bassin_12", - "Indonesia", - "Indonesia_bassin_5", - "Indonesia_bassin_6", - "Indonesia_bassin_7", - "Indonesia_bassin_8", - "Indonesia_bassin_9", - "Iraq_bassin_10", - "Iraq_bassin_11", - "Iraq_bassin_12", - "Iraq", - "Iraq_bassin_5", - "Iraq_bassin_6", - "Iraq_bassin_7", - "Iraq_bassin_8", - "Iraq_bassin_9", - "Ireland_bassin_10", - "Ireland_bassin_11", - "Ireland_bassin_12", - "Ireland", - "Ireland_bassin_5", - "Ireland_bassin_6", - "Ireland_bassin_7", - "Ireland_bassin_8", - "Ireland_bassin_9", - "Isle_of Man_bassin_10", - "Isle_of Man_bassin_11", - "Isle_of Man_bassin_12", - "Isle_of Man", - "Isle_of Man_bassin_5", - "Isle_of Man_bassin_6", - "Isle_of Man_bassin_7", - "Isle_of Man_bassin_8", - "Isle_of Man_bassin_9", - "Israel_bassin_10", - "Israel_bassin_11", - "Israel_bassin_12", - "Israel", - "Israel_bassin_5", - "Israel_bassin_6", - "Israel_bassin_7", - "Israel_bassin_8", - "Israel_bassin_9", - "Italy_bassin_10", - "Italy_bassin_11", - "Italy_bassin_12", - "Italy", - "Italy_bassin_5", - "Italy_bassin_6", - "Italy_bassin_7", - "Italy_bassin_8", - "Italy_bassin_9", - "Jamaica_bassin_10", - "Jamaica_bassin_11", - "Jamaica_bassin_12", - "Jamaica", - "Jamaica_bassin_5", - "Jamaica_bassin_6", - "Jamaica_bassin_7", - "Jamaica_bassin_8", - "Jamaica_bassin_9", - "Jammu_and Kashmir_bassin_10", - "Jammu_and Kashmir_bassin_11", - "Jammu_and Kashmir_bassin_12", - "Jammu_and Kashmir", - "Jammu_and Kashmir_bassin_5", - "Jammu_and Kashmir_bassin_6", - "Jammu_and Kashmir_bassin_7", - "Jammu_and Kashmir_bassin_8", - "Jammu_and Kashmir_bassin_9", - "Japan_bassin_10", - "Japan_bassin_11", - "Japan_bassin_12", - "Japan", - "Japan_bassin_5", - "Japan_bassin_6", - "Japan_bassin_7", - "Japan_bassin_8", - "Japan_bassin_9", - "Jarvis_Island_bassin_10", - "Jarvis_Island_bassin_11", - "Jarvis_Island_bassin_12", - "Jarvis_Island", - "Jarvis_Island_bassin_5", - "Jarvis_Island_bassin_6", - "Jarvis_Island_bassin_7", - "Jarvis_Island_bassin_8", - "Jarvis_Island_bassin_9", - "Jersey_bassin_10", - "Jersey_bassin_11", - "Jersey_bassin_12", - "Jersey", - "Jersey_bassin_5", - "Jersey_bassin_6", - "Jersey_bassin_7", - "Jersey_bassin_8", - "Jersey_bassin_9", - "Johnston_Atoll_bassin_10", - "Johnston_Atoll_bassin_11", - "Johnston_Atoll_bassin_12", - "Johnston_Atoll", - "Johnston_Atoll_bassin_5", - "Johnston_Atoll_bassin_6", - "Johnston_Atoll_bassin_7", - "Johnston_Atoll_bassin_8", - "Johnston_Atoll_bassin_9", - "Jordan_bassin_10", - "Jordan_bassin_11", - "Jordan_bassin_12", - "Jordan", - "Jordan_bassin_5", - "Jordan_bassin_6", - "Jordan_bassin_7", - "Jordan_bassin_8", - "Jordan_bassin_9", - "Juan_de Nova Island_bassin_10", - "Juan_de Nova Island_bassin_11", - "Juan_de Nova Island_bassin_12", - "Juan_de Nova Island", - "Juan_de Nova Island_bassin_5", - "Juan_de Nova Island_bassin_6", - "Juan_de Nova Island_bassin_7", - "Juan_de Nova Island_bassin_8", - "Juan_de Nova Island_bassin_9", - "Kazakhstan_bassin_10", - "Kazakhstan_bassin_11", - "Kazakhstan_bassin_12", - "Kazakhstan", - "Kazakhstan_bassin_5", - "Kazakhstan_bassin_6", - "Kazakhstan_bassin_7", - "Kazakhstan_bassin_8", - "Kazakhstan_bassin_9", - "Kenya_bassin_10", - "Kenya_bassin_11", - "Kenya_bassin_12", - "Kenya", - "Kenya_bassin_5", - "Kenya_bassin_6", - "Kenya_bassin_7", - "Kenya_bassin_8", - "Kenya_bassin_9", - "Kingman_Reef_bassin_10", - "Kingman_Reef_bassin_11", - "Kingman_Reef_bassin_12", - "Kingman_Reef", - "Kingman_Reef_bassin_5", - "Kingman_Reef_bassin_6", - "Kingman_Reef_bassin_7", - "Kingman_Reef_bassin_8", - "Kingman_Reef_bassin_9", - "Kiribati_bassin_10", - "Kiribati_bassin_11", - "Kiribati_bassin_12", - "Kiribati", - "Kiribati_bassin_5", - "Kiribati_bassin_6", - "Kiribati_bassin_7", - "Kiribati_bassin_8", - "Kiribati_bassin_9", - "Kuril_islands_bassin_10", - "Kuril_islands_bassin_11", - "Kuril_islands_bassin_12", - "Kuril_islands", - "Kuril_islands_bassin_5", - "Kuril_islands_bassin_6", - "Kuril_islands_bassin_7", - "Kuril_islands_bassin_8", - "Kuril_islands_bassin_9", - "Kuwait_bassin_10", - "Kuwait_bassin_11", - "Kuwait_bassin_12", - "Kuwait", - "Kuwait_bassin_5", - "Kuwait_bassin_6", - "Kuwait_bassin_7", - "Kuwait_bassin_8", - "Kuwait_bassin_9", - "Kyrgyzstan_bassin_10", - "Kyrgyzstan_bassin_11", - "Kyrgyzstan_bassin_12", - "Kyrgyzstan", - "Kyrgyzstan_bassin_5", - "Kyrgyzstan_bassin_6", - "Kyrgyzstan_bassin_7", - "Kyrgyzstan_bassin_8", - "Kyrgyzstan_bassin_9", - "Lao_Peoples Democratic Republic_bassin_10", - "Lao_Peoples Democratic Republic_bassin_11", - "Lao_Peoples Democratic Republic_bassin_12", - "Lao_Peoples Democratic Republic", - "Lao_Peoples Democratic Republic_bassin_5", - "Lao_Peoples Democratic Republic_bassin_6", - "Lao_Peoples Democratic Republic_bassin_7", - "Lao_Peoples Democratic Republic_bassin_8", - "Lao_Peoples Democratic Republic_bassin_9", - "Latvia_bassin_10", - "Latvia_bassin_11", - "Latvia_bassin_12", - "Latvia", - "Latvia_bassin_5", - "Latvia_bassin_6", - "Latvia_bassin_7", - "Latvia_bassin_8", - "Latvia_bassin_9", - "Lebanon_bassin_10", - "Lebanon_bassin_11", - "Lebanon_bassin_12", - "Lebanon", - "Lebanon_bassin_5", - "Lebanon_bassin_6", - "Lebanon_bassin_7", - "Lebanon_bassin_8", - "Lebanon_bassin_9", - "Lesotho_bassin_10", - "Lesotho_bassin_11", - "Lesotho_bassin_12", - "Lesotho", - "Lesotho_bassin_5", - "Lesotho_bassin_6", - "Lesotho_bassin_7", - "Lesotho_bassin_8", - "Lesotho_bassin_9", - "Liberia_bassin_10", - "Liberia_bassin_11", - "Liberia_bassin_12", - "Liberia", - "Liberia_bassin_5", - "Liberia_bassin_6", - "Liberia_bassin_7", - "Liberia_bassin_8", - "Liberia_bassin_9", - "Libya_bassin_10", - "Libya_bassin_11", - "Libya_bassin_12", - "Libya", - "Libya_bassin_5", - "Libya_bassin_6", - "Libya_bassin_7", - "Libya_bassin_8", - "Libya_bassin_9", - "Liechtenstein_bassin_10", - "Liechtenstein_bassin_11", - "Liechtenstein_bassin_12", - "Liechtenstein", - "Liechtenstein_bassin_5", - "Liechtenstein_bassin_6", - "Liechtenstein_bassin_7", - "Liechtenstein_bassin_8", - "Liechtenstein_bassin_9", - "Lithuania_bassin_10", - "Lithuania_bassin_11", - "Lithuania_bassin_12", - "Lithuania", - "Lithuania_bassin_5", - "Lithuania_bassin_6", - "Lithuania_bassin_7", - "Lithuania_bassin_8", - "Lithuania_bassin_9", - "Luxembourg_bassin_10", - "Luxembourg_bassin_11", - "Luxembourg_bassin_12", - "Luxembourg", - "Luxembourg_bassin_5", - "Luxembourg_bassin_6", - "Luxembourg_bassin_7", - "Luxembourg_bassin_8", - "Luxembourg_bassin_9", - "Macau_bassin_10", - "Macau_bassin_11", - "Macau_bassin_12", - "Macau", - "Macau_bassin_5", - "Macau_bassin_6", - "Macau_bassin_7", - "Macau_bassin_8", - "Macau_bassin_9", - "Madagascar_bassin_10", - "Madagascar_bassin_11", - "Madagascar_bassin_12", - "Madagascar", - "Madagascar_bassin_5", - "Madagascar_bassin_6", - "Madagascar_bassin_7", - "Madagascar_bassin_8", - "Madagascar_bassin_9", - "Madeira_Islands_bassin_10", - "Madeira_Islands_bassin_11", - "Madeira_Islands_bassin_12", - "Madeira_Islands", - "Madeira_Islands_bassin_5", - "Madeira_Islands_bassin_6", - "Madeira_Islands_bassin_7", - "Madeira_Islands_bassin_8", - "Madeira_Islands_bassin_9", - "Malawi_bassin_10", - "Malawi_bassin_11", - "Malawi_bassin_12", - "Malawi", - "Malawi_bassin_5", - "Malawi_bassin_6", - "Malawi_bassin_7", - "Malawi_bassin_8", - "Malawi_bassin_9", - "Malaysia_bassin_10", - "Malaysia_bassin_11", - "Malaysia_bassin_12", - "Malaysia", - "Malaysia_bassin_5", - "Malaysia_bassin_6", - "Malaysia_bassin_7", - "Malaysia_bassin_8", - "Malaysia_bassin_9", - "Maldives_bassin_10", - "Maldives_bassin_11", - "Maldives_bassin_12", - "Maldives", - "Maldives_bassin_5", - "Maldives_bassin_6", - "Maldives_bassin_7", - "Maldives_bassin_8", - "Maldives_bassin_9", - "Matan_al-Sarra_bassin_10", - "Matan_al-Sarra_bassin_11", - "Matan_al-Sarra_bassin_12", - "Matan_al-Sarra", - "Matan_al-Sarra_bassin_5", - "Matan_al-Sarra_bassin_6", - "Matan_al-Sarra_bassin_7", - "Matan_al-Sarra_bassin_8", - "Matan_al-Sarra_bassin_9", - "Montenegro_bassin_10", - "Montenegro_bassin_11", - "Montenegro_bassin_12", - "Montenegro", - "Montenegro_bassin_5", - "Montenegro_bassin_6", - "Montenegro_bassin_7", - "Montenegro_bassin_8", - "Montenegro_bassin_9", - "Qatar_bassin_10", - "Qatar_bassin_11", - "Qatar_bassin_12", - "Republic_of Korea_bassin_10", - "Republic_of Korea_bassin_11", - "Republic_of Korea_bassin_12", - "Republic_of Korea", - "Republic_of Korea_bassin_5", - "Republic_of Korea_bassin_6", - "Republic_of Korea_bassin_7", - "Republic_of Korea_bassin_8", - "Republic_of Korea_bassin_9", - "Romania_bassin_10", - "Romania_bassin_11", - "Romania_bassin_12", - "Romania", - "Romania_bassin_5", - "Romania_bassin_6", - "Romania_bassin_7", - "Romania_bassin_8", - "Romania_bassin_9", - "Russian_Federation_bassin_10", - "Russian_Federation_bassin_11", - "Russian_Federation_bassin_12", - "Russian_Federation", - "Russian_Federation_bassin_5", - "Russian_Federation_bassin_6", - "Russian_Federation_bassin_7", - "Russian_Federation_bassin_8", - "Russian_Federation_bassin_9", - "Rwanda_bassin_10", - "Rwanda_bassin_11", - "Rwanda_bassin_12", - "Rwanda", - "Rwanda_bassin_5", - "Rwanda_bassin_6", - "Rwanda_bassin_7", - "Rwanda_bassin_8", - "Rwanda_bassin_9", - "Saint_Helena_bassin_10", - "Saint_Helena_bassin_11", - "Saint_Helena_bassin_12", - "Saint_Helena", - "Saint_Helena_bassin_5", - "Saint_Helena_bassin_6", - "Saint_Helena_bassin_7", - "Saint_Helena_bassin_8", - "Saint_Helena_bassin_9", - "Saint_Kitts and Nevis_bassin_10", - "Saint_Kitts and Nevis_bassin_11", - "Saint_Kitts and Nevis_bassin_12", - "Saint_Kitts and Nevis", - "Saint_Kitts and Nevis_bassin_5", - "Saint_Kitts and Nevis_bassin_6", - "Saint_Kitts and Nevis_bassin_7", - "Saint_Kitts and Nevis_bassin_8", - "Saint_Kitts and Nevis_bassin_9", - "Saint_Lucia_bassin_10", - "Saint_Lucia_bassin_11", - "Saint_Lucia_bassin_12", - "Saint_Lucia", - "Saint_Lucia_bassin_5", - "Saint_Lucia_bassin_6", - "Saint_Lucia_bassin_7", - "Saint_Lucia_bassin_8", - "Saint_Lucia_bassin_9", - "Saint_Pierre et Miquelon_bassin_10", - "Saint_Pierre et Miquelon_bassin_11", - "Saint_Pierre et Miquelon_bassin_12", - "Saint_Pierre et Miquelon", - "Saint_Pierre et Miquelon_bassin_5", - "Saint_Pierre et Miquelon_bassin_6", - "Saint_Pierre et Miquelon_bassin_7", - "Saint_Pierre et Miquelon_bassin_8", - "Saint_Pierre et Miquelon_bassin_9", - "Saint_Vincent and the Grenadines_bassin_10", - "Saint_Vincent and the Grenadines_bassin_11", - "Saint_Vincent and the Grenadines_bassin_12", - "Saint_Vincent and the Grenadines", - "Saint_Vincent and the Grenadines_bassin_5", - "Saint_Vincent and the Grenadines_bassin_6", - "Saint_Vincent and the Grenadines_bassin_7", - "Saint_Vincent and the Grenadines_bassin_8", - "Saint_Vincent and the Grenadines_bassin_9", - "Samoa_bassin_10", - "Samoa_bassin_11", - "Samoa_bassin_12", - "Samoa", - "Samoa_bassin_5", - "Samoa_bassin_6", - "Samoa_bassin_7", - "Samoa_bassin_8", - "Samoa_bassin_9", - "San_Marino_bassin_10", - "San_Marino_bassin_11", - "San_Marino_bassin_12", - "San_Marino", - "San_Marino_bassin_5", - "San_Marino_bassin_6", - "San_Marino_bassin_7", - "San_Marino_bassin_8", - "San_Marino_bassin_9", - "Sao_Tome and Principe_bassin_10", - "Sao_Tome and Principe_bassin_11", - "Sao_Tome and Principe_bassin_12", - "Sao_Tome and Principe", - "Sao_Tome and Principe_bassin_5", - "Sao_Tome and Principe_bassin_6", - "Sao_Tome and Principe_bassin_7", - "Sao_Tome and Principe_bassin_8", - "Sao_Tome and Principe_bassin_9", - "Saudi_Arabia_bassin_10", - "Saudi_Arabia_bassin_11", - "Saudi_Arabia_bassin_12", - "Saudi_Arabia", - "Saudi_Arabia_bassin_5", - "Saudi_Arabia_bassin_6", - "Saudi_Arabia_bassin_7", - "Saudi_Arabia_bassin_8", - "Saudi_Arabia_bassin_9", - "Scarborough_Reef_bassin_10", - "Scarborough_Reef_bassin_11", - "Scarborough_Reef_bassin_12", - "Scarborough_Reef", - "Scarborough_Reef_bassin_5", - "Scarborough_Reef_bassin_6", - "Scarborough_Reef_bassin_7", - "Scarborough_Reef_bassin_8", - "Scarborough_Reef_bassin_9", - "Senegal_bassin_10", - "Senegal_bassin_11", - "Senegal_bassin_12", - "Senegal", - "Senegal_bassin_5", - "Senegal_bassin_6", - "Senegal_bassin_7", - "Senegal_bassin_8", - "Senegal_bassin_9", - "Senkaku_Islands_bassin_10", - "Senkaku_Islands_bassin_11", - "Senkaku_Islands_bassin_12", - "Senkaku_Islands", - "Senkaku_Islands_bassin_5", - "Senkaku_Islands_bassin_6", - "Senkaku_Islands_bassin_7", - "Senkaku_Islands_bassin_8", - "Senkaku_Islands_bassin_9", - "Serbia_bassin_10", - "Serbia_bassin_11", - "Serbia_bassin_12", - "Serbia", - "Serbia_bassin_5", - "Serbia_bassin_6", - "Serbia_bassin_7", - "Serbia_bassin_8", - "Serbia_bassin_9", - "Seychelles_bassin_10", - "Seychelles_bassin_11", - "Seychelles_bassin_12", - "Seychelles", - "Seychelles_bassin_5", - "Seychelles_bassin_6", - "Seychelles_bassin_7", - "Seychelles_bassin_8", - "Seychelles_bassin_9", - "Sierra_Leone_bassin_10", - "Sierra_Leone_bassin_11", - "Sierra_Leone_bassin_12", - "Sierra_Leone", - "Sierra_Leone_bassin_5", - "Sierra_Leone_bassin_6", - "Sierra_Leone_bassin_7", - "Sierra_Leone_bassin_8", - "Sierra_Leone_bassin_9", - "Singapore_bassin_10", - "Singapore_bassin_11", - "Singapore_bassin_12", - "Singapore", - "Singapore_bassin_5", - "Singapore_bassin_6", - "Singapore_bassin_7", - "Singapore_bassin_8", - "Singapore_bassin_9", - "Slovakia_bassin_10", - "Slovakia_bassin_11", - "Slovakia_bassin_12", - "Slovakia", - "Slovakia_bassin_5", - "Slovakia_bassin_6", - "Slovakia_bassin_7", - "Slovakia_bassin_8", - "Slovakia_bassin_9", - "Slovenia_bassin_10", - "Slovenia_bassin_11", - "Slovenia_bassin_12", - "Slovenia", - "Slovenia_bassin_5", - "Slovenia_bassin_6", - "Slovenia_bassin_7", - "Slovenia_bassin_8", - "Slovenia_bassin_9", - "Solomon_Islands_bassin_10", - "Solomon_Islands_bassin_11", - "Solomon_Islands_bassin_12", - "Solomon_Islands", - "Solomon_Islands_bassin_5", - "Solomon_Islands_bassin_6", - "Solomon_Islands_bassin_7", - "Solomon_Islands_bassin_8", - "Solomon_Islands_bassin_9", - "Somalia_bassin_10", - "Somalia_bassin_11", - "Somalia_bassin_12", - "Somalia", - "Somalia_bassin_5", - "Somalia_bassin_6", - "Somalia_bassin_7", - "Somalia_bassin_8", - "Somalia_bassin_9", - "South_Africa_bassin_10", - "South_Africa_bassin_11", - "South_Africa_bassin_12", - "South_Africa", - "South_Africa_bassin_5", - "South_Africa_bassin_6", - "South_Africa_bassin_7", - "South_Africa_bassin_8", - "South_Africa_bassin_9", - "South_Georgia and the South Sandwich Islands_bassin_10", - "South_Georgia and the South Sandwich Islands_bassin_11", - "South_Georgia and the South Sandwich Islands_bassin_12", - "South_Georgia and the South Sandwich Islands", - "South_Georgia and the South Sandwich Islands_bassin_5", - "South_Georgia and the South Sandwich Islands_bassin_6", - "South_Georgia and the South Sandwich Islands_bassin_7", - "South_Georgia and the South Sandwich Islands_bassin_8", - "South_Georgia and the South Sandwich Islands_bassin_9", - "South_Sudan_bassin_10", - "South_Sudan_bassin_11", - "South_Sudan_bassin_12", - "South_Sudan", - "South_Sudan_bassin_5", - "South_Sudan_bassin_6", - "South_Sudan_bassin_7", - "South_Sudan_bassin_8", - "South_Sudan_bassin_9", - "Spain_bassin_10", - "Spain_bassin_11", - "Spain_bassin_12", - "Spain", - "Spain_bassin_5", - "Spain_bassin_6", - "Spain_bassin_7", - "Spain_bassin_8", - "Spain_bassin_9", - "Spratly_Islands_bassin_10", - "Spratly_Islands_bassin_11", - "Spratly_Islands_bassin_12", - "Spratly_Islands", - "Spratly_Islands_bassin_5", - "Spratly_Islands_bassin_6", - "Spratly_Islands_bassin_7", - "Spratly_Islands_bassin_8", - "Spratly_Islands_bassin_9", - "Sri_Lanka_bassin_10", - "Sri_Lanka_bassin_11", - "Sri_Lanka_bassin_12", - "Sri_Lanka", - "Sri_Lanka_bassin_5", - "Sri_Lanka_bassin_6", - "Sri_Lanka_bassin_7", - "Sri_Lanka_bassin_8", - "Sri_Lanka_bassin_9", - "Suriname_bassin_10", - "Suriname_bassin_11", - "Suriname_bassin_12", - "Suriname", - "Suriname_bassin_5", - "Suriname_bassin_6", - "Suriname_bassin_7", - "Suriname_bassin_8", - "Suriname_bassin_9", - "Svalbard_and Jan Mayen Islands_bassin_10", - "Svalbard_and Jan Mayen Islands_bassin_11", - "Svalbard_and Jan Mayen Islands_bassin_12", - "Svalbard_and Jan Mayen Islands", - "Svalbard_and Jan Mayen Islands_bassin_5", - "Svalbard_and Jan Mayen Islands_bassin_6", - "Svalbard_and Jan Mayen Islands_bassin_7", - "Svalbard_and Jan Mayen Islands_bassin_8", - "Svalbard_and Jan Mayen Islands_bassin_9", - "Swaziland_bassin_10", - "Swaziland_bassin_11", - "Swaziland_bassin_12", - "Swaziland", - "Swaziland_bassin_5", - "Swaziland_bassin_6", - "Swaziland_bassin_7", - "Swaziland_bassin_8", - "Swaziland_bassin_9", - "Sweden_bassin_10", - "Sweden_bassin_11", - "Sweden_bassin_12", - "Sweden", - "Sweden_bassin_5", - "Sweden_bassin_6", - "Sweden_bassin_7", - "Sweden_bassin_8", - "Sweden_bassin_9", - "Switzerland_bassin_10", - "Switzerland_bassin_11", - "Switzerland_bassin_12", - "Switzerland", - "Switzerland_bassin_5", - "Switzerland_bassin_6", - "Switzerland_bassin_7", - "Switzerland_bassin_8", - "Switzerland_bassin_9", - "Syrian_Arab Republic_bassin_10", - "Syrian_Arab Republic_bassin_11", - "Syrian_Arab Republic_bassin_12", - "Syrian_Arab Republic", - "Syrian_Arab Republic_bassin_5", - "Syrian_Arab Republic_bassin_6", - "Syrian_Arab Republic_bassin_7", - "Syrian_Arab Republic_bassin_8", - "Syrian_Arab Republic_bassin_9", - "Taiwan_bassin_10", - "Taiwan_bassin_11", - "Taiwan_bassin_12", - "Taiwan", - "Taiwan_bassin_5", - "Taiwan_bassin_6", - "Taiwan_bassin_7", - "Taiwan_bassin_8", - "Taiwan_bassin_9", - "Tajikistan_bassin_10", - "Tajikistan_bassin_11", - "Tajikistan_bassin_12", - "Tajikistan", - "Tajikistan_bassin_5", - "Tajikistan_bassin_6", - "Tajikistan_bassin_7", - "Tajikistan_bassin_8", - "Tajikistan_bassin_9", - "Thailand_bassin_10", - "Thailand_bassin_11", - "Thailand_bassin_12", - "Thailand", - "Thailand_bassin_5", - "Thailand_bassin_6", - "Thailand_bassin_7", - "Thailand_bassin_8", - "Thailand_bassin_9", - "The_former Yugoslav Republic of Macedonia_bassin_10", - "The_former Yugoslav Republic of Macedonia_bassin_11", - "The_former Yugoslav Republic of Macedonia_bassin_12", - "The_former Yugoslav Republic of Macedonia", - "The_former Yugoslav Republic of Macedonia_bassin_5", - "The_former Yugoslav Republic of Macedonia_bassin_6", - "The_former Yugoslav Republic of Macedonia_bassin_7", - "The_former Yugoslav Republic of Macedonia_bassin_8", - "The_former Yugoslav Republic of Macedonia_bassin_9", - "Timor-Leste_bassin_10", - "Timor-Leste_bassin_11", - "Timor-Leste_bassin_12", - "Timor-Leste", - "Timor-Leste_bassin_5", - "Timor-Leste_bassin_6", - "Timor-Leste_bassin_7", - "Timor-Leste_bassin_8", - "Timor-Leste_bassin_9", - "Togo_bassin_10", - "Togo_bassin_11", - "Togo_bassin_12", - "Togo", - "Togo_bassin_5", - "Togo_bassin_6", - "Togo_bassin_7", - "Togo_bassin_8", - "Togo_bassin_9", - "Tokelau_bassin_10", - "Tokelau_bassin_11", - "Tokelau_bassin_12", - "Tokelau", - "Tokelau_bassin_5", - "Tokelau_bassin_6", - "Tokelau_bassin_7", - "Tokelau_bassin_8", - "Tokelau_bassin_9", - "Tonga_bassin_10", - "Tonga_bassin_11", - "Tonga_bassin_12", - "Tonga", - "Tonga_bassin_5", - "Tonga_bassin_6", - "Tonga_bassin_7", - "Tonga_bassin_8", - "Tonga_bassin_9", - "Trinidad_and Tobago_bassin_10", - "Trinidad_and Tobago_bassin_11", - "Trinidad_and Tobago_bassin_12", - "Trinidad_and Tobago", - "Trinidad_and Tobago_bassin_5", - "Trinidad_and Tobago_bassin_6", - "Trinidad_and Tobago_bassin_7", - "Trinidad_and Tobago_bassin_8", - "Trinidad_and Tobago_bassin_9", - "Tromelin_Island_bassin_10", - "Tromelin_Island_bassin_11", - "Tromelin_Island_bassin_12", - "Tromelin_Island", - "Tromelin_Island_bassin_5", - "Tromelin_Island_bassin_6", - "Tromelin_Island_bassin_7", - "Tromelin_Island_bassin_8", - "Tromelin_Island_bassin_9", - "Tunisia_bassin_10", - "Tunisia_bassin_11", - "Tunisia_bassin_12", - "Tunisia", - "Tunisia_bassin_5", - "Tunisia_bassin_6", - "Tunisia_bassin_7", - "Tunisia_bassin_8", - "Tunisia_bassin_9", - "Turkey_bassin_10", - "Turkey_bassin_11", - "Turkey_bassin_12", - "Turkey", - "Turkey_bassin_5", - "Turkey_bassin_6", - "Turkey_bassin_7", - "Turkey_bassin_8", - "Turkey_bassin_9", - "Turkmenistan_bassin_10", - "Turkmenistan_bassin_11", - "Turkmenistan_bassin_12", - "Turkmenistan", - "Turkmenistan_bassin_5", - "Turkmenistan_bassin_6", - "Turkmenistan_bassin_7", - "Turkmenistan_bassin_8", - "Turkmenistan_bassin_9", - "Turks_and Caicos islands_bassin_10", - "Turks_and Caicos islands_bassin_11", - "Turks_and Caicos islands_bassin_12", - "Turks_and Caicos islands", - "Turks_and Caicos islands_bassin_5", - "Turks_and Caicos islands_bassin_6", - "Turks_and Caicos islands_bassin_7", - "Turks_and Caicos islands_bassin_8", - "Turks_and Caicos islands_bassin_9", - "Tuvalu_bassin_10", - "Tuvalu_bassin_11", - "Tuvalu_bassin_12", - "Tuvalu", - "Tuvalu_bassin_5", - "Tuvalu_bassin_6", - "Tuvalu_bassin_7", - "Tuvalu_bassin_8", - "Tuvalu_bassin_9", - "Uganda_bassin_10", - "Uganda_bassin_11", - "Uganda_bassin_12", - "Uganda", - "Uganda_bassin_5", - "Uganda_bassin_6", - "Uganda_bassin_7", - "Uganda_bassin_8", - "Uganda_bassin_9", - "Ukraine_bassin_10", - "Ukraine_bassin_11", - "Ukraine_bassin_12", - "Ukraine", - "Ukraine_bassin_5", - "Ukraine_bassin_6", - "Ukraine_bassin_7", - "Ukraine_bassin_8", - "Ukraine_bassin_9", - "UK_of Great Britain and Northern Ireland_bassin_10", - "UK_of Great Britain and Northern Ireland_bassin_11", - "UK_of Great Britain and Northern Ireland_bassin_12", - "UK_of Great Britain and Northern Ireland", - "UK_of Great Britain and Northern Ireland_bassin_5", - "UK_of Great Britain and Northern Ireland_bassin_6", - "UK_of Great Britain and Northern Ireland_bassin_7", - "UK_of Great Britain and Northern Ireland_bassin_8", - "UK_of Great Britain and Northern Ireland_bassin_9", - "United_Arab Emirates_bassin_10", - "United_Arab Emirates_bassin_11", - "United_Arab Emirates_bassin_12", - "United_Arab Emirates", - "United_Arab Emirates_bassin_5", - "United_Arab Emirates_bassin_6", - "United_Arab Emirates_bassin_7", - "United_Arab Emirates_bassin_8", - "United_Arab Emirates_bassin_9", - "United_Republic of Tanzania_bassin_10", - "United_Republic of Tanzania_bassin_11", - "United_Republic of Tanzania_bassin_12", - "United_Republic of Tanzania", - "United_Republic of Tanzania_bassin_5", - "United_Republic of Tanzania_bassin_6", - "United_Republic of Tanzania_bassin_7", - "United_Republic of Tanzania_bassin_8", - "United_Republic of Tanzania_bassin_9", - "United_States of America_bassin_10", - "United_States of America_bassin_11", - "United_States of America_bassin_12", - "United_States of America", - "United_States of America_bassin_5", - "United_States of America_bassin_6", - "United_States of America_bassin_7", - "United_States of America_bassin_8", - "United_States of America_bassin_9", - "United_States Virgin Islands_bassin_10", - "United_States Virgin Islands_bassin_11", - "United_States Virgin Islands_bassin_12", - "United_States Virgin Islands", - "United_States Virgin Islands_bassin_5", - "United_States Virgin Islands_bassin_6", - "United_States Virgin Islands_bassin_7", - "United_States Virgin Islands_bassin_8", - "United_States Virgin Islands_bassin_9", - "Uruguay_bassin_10", - "Uruguay_bassin_11", - "Uruguay_bassin_12", - "Uruguay", - "Uruguay_bassin_5", - "Uruguay_bassin_6", - "Uruguay_bassin_7", - "Uruguay_bassin_8", - "Uruguay_bassin_9", - "Uzbekistan_bassin_10", - "Uzbekistan_bassin_11", - "Uzbekistan_bassin_12", - "Uzbekistan", - "Uzbekistan_bassin_5", - "Uzbekistan_bassin_6", - "Uzbekistan_bassin_7", - "Uzbekistan_bassin_8", - "Uzbekistan_bassin_9", - "Vanuatu_bassin_10", - "Vanuatu_bassin_11", - "Vanuatu_bassin_12", - "Vanuatu", - "Vanuatu_bassin_5", - "Vanuatu_bassin_6", - "Vanuatu_bassin_7", - "Vanuatu_bassin_8", - "Vanuatu_bassin_9", - "Venezuela_bassin_10", - "Venezuela_bassin_11", - "Venezuela_bassin_12", - "Venezuela", - "Venezuela_bassin_5", - "Venezuela_bassin_6", - "Venezuela_bassin_7", - "Venezuela_bassin_8", - "Venezuela_bassin_9", - "Viet_Nam_bassin_10", - "Viet_Nam_bassin_11", - "Viet_Nam_bassin_12", - "Viet_Nam", - "Viet_Nam_bassin_5", - "Viet_Nam_bassin_6", - "Viet_Nam_bassin_7", - "Viet_Nam_bassin_8", - "Viet_Nam_bassin_9", - "Wake_Island_bassin_10", - "Wake_Island_bassin_11", - "Wake_Island_bassin_12", - "Wake_Island", - "Wake_Island_bassin_5", - "Wake_Island_bassin_6", - "Wake_Island_bassin_7", - "Wake_Island_bassin_8", - "Wake_Island_bassin_9", - "Wallis_and Futuna_bassin_10", - "Wallis_and Futuna_bassin_11", - "Wallis_and Futuna_bassin_12", - "Wallis_and Futuna", - "Wallis_and Futuna_bassin_5", - "Wallis_and Futuna_bassin_6", - "Wallis_and Futuna_bassin_7", - "Wallis_and Futuna_bassin_8", - "Wallis_and Futuna_bassin_9", - "Western_Sahara_bassin_10", - "Western_Sahara_bassin_11", - "Western_Sahara_bassin_12", - "Western_Sahara", - "Western_Sahara_bassin_5", - "Western_Sahara_bassin_6", - "Western_Sahara_bassin_7", - "Western_Sahara_bassin_8", - "Western_Sahara_bassin_9", - "West_Bank_bassin_10", - "West_Bank_bassin_11", - "West_Bank_bassin_12", - "West_Bank", - "West_Bank_bassin_5", - "West_Bank_bassin_6", - "West_Bank_bassin_7", - "West_Bank_bassin_8", - "West_Bank_bassin_9", - "Yemen_bassin_10", - "Yemen_bassin_11", - "Yemen_bassin_12", - "Yemen", - "Yemen_bassin_5", - "Yemen_bassin_6", - "Yemen_bassin_7", - "Yemen_bassin_8", - "Yemen_bassin_9", - "Zambia_bassin_10", - "Zambia_bassin_11", - "Zambia_bassin_12", - "Zambia", - "Zambia_bassin_5", - "Zambia_bassin_6", - "Zambia_bassin_7", - "Zambia_bassin_8", - "Zambia_bassin_9", - "Zimbabwe_bassin_10", - "Zimbabwe_bassin_11", - "Zimbabwe_bassin_12", - "Zimbabwe", - "Zimbabwe_bassin_5", - "Zimbabwe_bassin_6", - "Zimbabwe_bassin_7", - "Zimbabwe_bassin_8", - "Zimbabwe_bassin_9" - ) ); - - public static void main(String[] args) { - - ArrayList missingCountries = new ArrayList(); - - for (String country : allCountryNames) { - if( !filesGenerated.contains(country) ) { - missingCountries.add( country); - } - } - System.out.println( missingCountries.size() ); - System.out.println( missingCountries ); - - String finalCountries = ""; - for (String missing : missingCountries) { - finalCountries += '"' + missing.replaceAll( "_", " ") + "\", "; - } - System.out.println( finalCountries ); - - } - - -} +package org.openforis.collect.earth.app.desktop; + +import java.awt.Image; +import java.awt.SplashScreen; +import java.awt.Window; +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.net.MalformedURLException; +import java.net.Socket; +import java.net.URL; +import java.net.URLConnection; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.Observer; + +import javax.swing.ImageIcon; +import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; + +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.SystemUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.desktop.ServerController.ServerInitializationEvent; +import org.openforis.collect.earth.app.logging.GAlogger; +import org.openforis.collect.earth.app.server.LoadProjectFileServlet; +import org.openforis.collect.earth.app.service.EarthProjectsService; +import org.openforis.collect.earth.app.service.FolderFinder; +import org.openforis.collect.earth.app.service.KmlGeneratorService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.app.service.UpdateIniUtils; +import org.openforis.collect.earth.app.view.CheckForUpdatesListener; +import org.openforis.collect.earth.app.view.CollectEarthWindow; +import org.openforis.collect.earth.app.view.Messages; +import org.openforis.collect.earth.app.view.PropertiesDialog; +import org.openforis.collect.earth.sampler.utils.KmlGenerationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.opencsv.exceptions.CsvValidationException; + +import io.sentry.Sentry; +import io.sentry.protocol.User; + +/** + * Contains the main class that starts Collect Earth and opens Google Earth. + * + * @author Alfonso Sanchez-Paus Diaz + * + */ +public class EarthApp { + + private static Logger logger; + private static ServerController serverController; + private static EarthApp earthApp; + + private static void closeSplash() { + try { + final SplashScreen splash = SplashScreen.getSplashScreen(); + if (splash != null) { + splash.close(); + } + } catch (final IllegalStateException e) { + logger.error("Error closing the splash window", e); //$NON-NLS-1$ + } + } + + /** + * Start the application, opening Google Earth and starting the Jetty server. + * + * @param args + * No arguments are used by this method. + */ + public static void main(String[] args) { + + try { + + // System property used in the web.xml configuration + System.setProperty("collectEarth.userFolder", FolderFinder.getCollectEarthDataFolder()); //$NON-NLS-1$ + + // Specify a browser as http.agent so that calls to CloudFlare hosted OpenForis.org do not return with a 403 http error + System.setProperty("http.agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2"); + + initializeSentry(); + + // Change of font so that Lao and Thao glyphs are supported + CollectEarthUtils.setFontDependingOnLanguaue( getLocalProperties().getUiLanguage() ); + + logger = LoggerFactory.getLogger(EarthApp.class); + + String doubleClickedProjectFile = null; + + if (args != null && args.length == 1) { + doubleClickedProjectFile = args[0]; + }else if( getProjectsService().getProjectList().size() == 0 ){ + doubleClickedProjectFile = "resources/demo_survey.cep"; + } + + if ( SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX){ + handleMacStartup( doubleClickedProjectFile ); + }else{ + startCollectEarth( doubleClickedProjectFile ); + } + + } catch (final Exception e) { + // The logger factory has not been initialized, this will not work, just output to console + if (logger != null) { + logger.error("The server could not start", e); //$NON-NLS-1$ + } + System.exit(1); + } finally { + closeSplash(); + } + } + + private static void initializeSentry() { + try { + String releaseName= UpdateIniUtils.getReleaseNameInstalled(); + + Sentry.init("https://24dd6a90c1e4461484712db99c3b3bb7:831e42661c5c4ff3aa5eca270db3f619@sentry.io/299626?release="+releaseName+"&maxmessagelength=2000" ); + if( !StringUtils.isEmpty( UpdateIniUtils.getVersionInstalled() ) ) { + Sentry.setTag( "ReleaseDate", UpdateIniUtils.getVersionInstalled() ); + } + if( !StringUtils.isEmpty( getLocalProperties().getOperator() ) ) { + User user = new User(); + user.setUsername( getLocalProperties().getOperator() ); + Sentry.setUser(user); + } + + } catch (Exception e) { + logger.error( "Error initializing Sentry logger" , e); + } + } + /** + * Special code that uses reflection to handle how the application should behave in Mac OS X. + * Without reflection the code provokes compilation-time errors. + * @param doubleClickedProjectFile Project file (CEP) that was clicked + * @throws Exception Throws Exception when the process fails to open the file double-clicked. Initializes the server in any case + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + public static void handleMacStartup(String doubleClickedProjectFile) throws Exception{ + try { + Class applicationClass = Class.forName("com.apple.eawt.Application"); + Method getApplicationMethod = applicationClass.getMethod("getApplication"); + Method setDockIconImageMethod = applicationClass.getMethod( "setDockIconImage", Image.class ); + + Class openFilesHandlerInterface = Class.forName("com.apple.eawt.OpenFilesHandler"); + Method setOpenFileHandlerMethod = applicationClass.getMethod( "setOpenFileHandler", openFilesHandlerInterface ); + + // SET THE MAC OS X DOCK ICON! + // Get an Application object + Object applicationObject = getApplicationMethod.invoke( null ); + try { + Image dockIconImage = new ImageIcon(new File("images/dockIconMac.png").toURI().toURL()).getImage(); + // Invoke the setDockIconImage on the application object using the dockIconImage as an argument + setDockIconImageMethod.invoke(applicationObject, dockIconImage ); + } catch (MalformedURLException e2) { + logger.error("Problems finding the docker icon", e2); + } + // ------------------------------------------- + + + // DEFINE A LISTENER THAT IS REGISTERED BY THE OS TO HEAR DOUBLE-CLICK EVENTS AND REGISTER ITSELF AS THE CEP OPENER + MacOpenFilesInvocationHandler macOpenFileHandlerProxyInterface = new MacOpenFilesInvocationHandler(); + Object openFilesHandlerImplementation = Proxy.newProxyInstance( + applicationClass.getClassLoader(), + new Class[]{ openFilesHandlerInterface }, + macOpenFileHandlerProxyInterface + ); + + // Call the setOpenFileHandler method of the application object using the + setOpenFileHandlerMethod.invoke(applicationObject, ( openFilesHandlerInterface.cast( openFilesHandlerImplementation ) ) ); + + // Lets wait for the Apple event to arrive. If it did then the earthApp variable will be non-nulls + Thread.sleep(2000); + if( earthApp == null ){ + startCollectEarth( doubleClickedProjectFile ); + } + } catch (Exception e) { + logger.error("Error while defining the double-click behaviour on CEP files in Mac OS X", e); + startCollectEarth( null ); + } + } + + public void generateKml() { + + try { + getKmlGeneratorService().generateKmlFile(); + } catch (final KmlGenerationException e) { + logger.error("Problems while generating the KML file ", e); //$NON-NLS-1$ + showMessage("Problems while generating the KML file:
" + (e.getCause()!=null?(e.getCause()+"
"):"") + ( e.getMessage().length() > 300?e.getMessage().substring(0,300):e.getMessage() ) + ""); //$NON-NLS-1$ + } catch (final Exception e) { + logger.error("Could not generate KML file", e); //$NON-NLS-1$ + showMessage("Error generating KML file :
" + e.getMessage()); //$NON-NLS-1$ + } + } + + public static void openProjectFileInRunningCollectEarth(String doubleClickedProjecFile) throws IOException { + final File projectFile = new File(doubleClickedProjecFile); + + if (projectFile.exists()) { + + String hostAddress = ServerController.getHostAddress( getLocalProperties().getHost(), getLocalProperties().getPort()); + + URL loadProjectFileInRunningCE = new URL(hostAddress + LoadProjectFileServlet.SERVLET_NAME + + "?" + LoadProjectFileServlet.PROJECT_FILE_PARAMETER + "=" + //$NON-NLS-1$ //$NON-NLS-2$ + URLEncoder.encode(doubleClickedProjecFile, StandardCharsets.UTF_8.name() ) ); + URLConnection urlConn = loadProjectFileInRunningCE.openConnection(); + + try( BufferedReader in = new BufferedReader(new InputStreamReader(urlConn.getInputStream())) ){ + String inputLine; + while ((inputLine = in.readLine()) != null) { + logger.info(inputLine); + } + } + + } + } + + private static boolean isAnotherCollectEarthRunning(LocalPropertiesService localProperties) { + boolean alreadyRunning = false; + try { + new Socket( LocalPropertiesService.LOCAL_HOST , Integer.parseInt(localProperties.getPort())).close(); //$NON-NLS-1$ + // If here there is something is serving on port 8028 + // So stop it + logger.warn("There is a server already running {}", localProperties.getPort()); //$NON-NLS-1$ + alreadyRunning = true; + } catch (final IOException e) { + // Nothing there, so OK to proceed + logger.info("There is no server running in port {}", localProperties.getPort()); //$NON-NLS-1$ + alreadyRunning = false; + } catch (final NumberFormatException e) { + // Nothing there, so OK to proceed + logger.info("Error parsing integer value {}", localProperties.getPort()); //$NON-NLS-1$ + alreadyRunning = false; + } + return alreadyRunning; + } + + public static void quitServer() { + try { + serverController.stopServer(); + } catch (Exception e) { + logger.error("Error stoping server", e); //$NON-NLS-1$ + } + } + + /** + * Generates the KML for the project and opens it in Google Earth + * @param forceKmlRecreation Set to true if you want to forece the regeneration of the KML even if is is up to date (you might want to do this to force the update of the placemark icons as the date changes) + * @throws IOException Throws exception if the KMl file cannot be generated + * @throws KmlGenerationException Throws exception if the KML file contents cannot be generated + * @throws CsvValidationException + */ + private static synchronized void loadKmlInGoogleEarth(boolean forceKmlRecreation) throws IOException, KmlGenerationException, CsvValidationException { + earthApp.getKmlGeneratorService().generatePlacemarksKmzFile( forceKmlRecreation ); + earthApp.simulateClickKmz(); + } + + public static void restart() { + try { + + serverController.stopServer(); + startServer(null); + + } catch (final Exception e) { + logger.error("Error while stopping server", e); //$NON-NLS-1$ + } + } + + private static LocalPropertiesService nonManagedPropertiesService; + + + private static LocalPropertiesService getLocalProperties() { + if (serverController == null || serverController.getContext() == null) { + if (nonManagedPropertiesService == null) { + nonManagedPropertiesService = new LocalPropertiesService(); + } + return nonManagedPropertiesService; + } else { + return serverController.getContext().getBean(LocalPropertiesService.class); + } + } + + private static EarthProjectsService getProjectsService() { + if (serverController != null) { + return serverController.getContext().getBean(EarthProjectsService.class); + } else { + final EarthProjectsService earthProjectsService = new EarthProjectsService(); + earthProjectsService.init(getLocalProperties()); + return earthProjectsService; + } + } + + + private KmlGeneratorService getKmlGeneratorService() { + if (serverController != null) { + return serverController.getContext().getBean(KmlGeneratorService.class); + } else { + throw new IllegalStateException("The server must be initialized before this method is called"); //$NON-NLS-1$ + } + } + + private static void startCollectEarth(final String doubleClickedProjectFile) throws Exception { + logger.info("START - Server Initilization"); //$NON-NLS-1$ + final boolean ceAlreadyOpen = isAnotherCollectEarthRunning( getLocalProperties()); + + if( ceAlreadyOpen ){ + closeSplash(); + // If the user double clicked on a project file while Collect Earth is running then load the project in the running Collect Earth + if (doubleClickedProjectFile!=null) { + openProjectFileInRunningCollectEarth(doubleClickedProjectFile); + }else{ + showMessage(Messages.getString("EarthApp.11")); //$NON-NLS-1$ + } + }else{ + + startServer(doubleClickedProjectFile); + } + + GAlogger.logGAnalytics("Start"); + } + + public static void startServer(final String doubleClickedProjectFile) + throws Exception { + earthApp = new EarthApp(); + + // Load the double-clicked CEP file before the survey manager is instantiated by the server start-up + earthApp.loadProjectIfDoubleClicked(doubleClickedProjectFile); + + + final Observer observeInitialization = getServerObserver(); + serverStartAndOpenGe(observeInitialization); + } + + private static Observer getServerObserver() { + return (observable, initializationEvent) ->{ + if (initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT)) { + serverController = null; + } + + if( initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT) || + initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT) ){ + + showMessage( initializationEvent.toString()); + } + + if (!initializationEvent.equals(ServerInitializationEvent.SERVER_STOPPED_EVENT)) { + try { + earthApp.generateKml(); + earthApp.simulateClickKmz(); + earthApp.checkForUpdates(); + closeSplash(); + } catch (final Exception e) { + logger.error("Error generating KML file", e); //$NON-NLS-1$ + } + } + }; + } + + private void openKmlOnGoogleEarth(){ + if (! CollectEarthUtils.openFile( new File(KmlGeneratorService.KML_NETWORK_LINK_STARTER)) ) { + showMessage("The KML file cannot be open at " + KmlGeneratorService.KML_NETWORK_LINK_STARTER); //$NON-NLS-1$ + } + } + + private void checkForUpdates() { + new Thread("Check for new Collect Earth versions on the server") { + @Override + public void run() { + + // Wait a few seconds before checking for updates + try { + Thread.sleep(10000); + } catch (InterruptedException e1) { + logger.error("Error while waiting", e1); //$NON-NLS-1$ + } + + final UpdateIniUtils updateIniUtils = new UpdateIniUtils(); + + + if (updateIniUtils.shouldWarnUser(getLocalProperties() )) { + + javax.swing.SwingUtilities.invokeLater( () -> { + String remindLater = Messages.getString("EarthApp.3"); //$NON-NLS-1$ + String doItNow = Messages.getString("EarthApp.4"); //$NON-NLS-1$ + String doNotBother = Messages.getString("EarthApp.5"); //$NON-NLS-1$ + + String newestVersionOnline = updateIniUtils.getVersionAvailableOnline(); + + if( StringUtils.isNotBlank( newestVersionOnline ) ) { + + Object[] possibleValues = { remindLater, doItNow, doNotBother }; + int chosenOption = JOptionPane.showOptionDialog(null, + Messages.getString("EarthApp.57"), Messages.getString("EarthApp.58") + Messages.getString("EarthApp.6") + updateIniUtils.convertToDate(newestVersionOnline), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, possibleValues, possibleValues[0]); + if( chosenOption != JOptionPane.CLOSED_OPTION ){ + if (possibleValues[chosenOption].equals(doItNow)) { + CheckForUpdatesListener checkForUpdatesListener = new CheckForUpdatesListener(); + checkForUpdatesListener.actionPerformed(null); + } else if (possibleValues[chosenOption].equals(doNotBother)) { + getLocalProperties().setValue(EarthProperty.LAST_IGNORED_UPDATE, newestVersionOnline); + } + } + } + }); + } + } + }.start(); + + } + + + /** + * If Collect Earth is started by double clicking on a ".cep" file ( Collect Earth Project file ) + * Then it should open directly with that project in focus + * + * @param doubleClickedProjecFile + * The path to the CEP file that was double-clicked + * + */ + private void loadProjectIfDoubleClicked(String doubleClickedProjectFile) { + try { + if (doubleClickedProjectFile != null) { + + final File projectFile = new File(doubleClickedProjectFile); + + if (projectFile.exists()) { + getProjectsService().loadCompressedProjectFile(projectFile); + } + } + } catch (final Exception e) { + showMessage(Messages.getString("EarthApp.59")); //$NON-NLS-1$ + logger.error(Messages.getString("EarthApp.59"), e);//$NON-NLS-1$ + } + } + + private static void serverStartAndOpenGe(Observer observeInitialization) throws Exception { + serverController = new ServerController(); + serverController.deleteObservers(); + serverController.startServer(observeInitialization); + + // Inform Mac OS users of the issues about opening CEP files in the Mac version of CE + if(SystemUtils.IS_OS_MAC_OSX ) { + showMessage( + "" //$NON-NLS-1$ + + "" //$NON-NLS-1$ + + Messages.getString("EarthApp.70") + + ": " //$NON-NLS-1$ + + Messages.getString("EarthApp.71") + + Messages.getString("EarthApp.72") + + "" //$NON-NLS-1$ + + Messages.getString("CollectEarthWindow.10") + + " -> " //$NON-NLS-1$ + + Messages.getString("CollectEarthMenu.0") + + "", //$NON-NLS-1$ + Messages.getString("EarthApp.73") + ); + } + } + + public static void showMessage(String message) { + showMessage(message, "Collect Earth"); + + } + + public static void showMessage(String message, String title) { + try { + SwingUtilities.invokeLater( + () -> JOptionPane.showMessageDialog(null, message, title, JOptionPane.WARNING_MESSAGE) + ); + } catch (Exception e) { + logger.error("Error showing message",e); + } + + } + + private void simulateClickKmz() { + try { + getKmlGeneratorService().generateLoaderKmlFile(); + openKmlOnGoogleEarth(); + } catch (final Exception e) { + showMessage(Messages.getString("EarthApp.61")); //$NON-NLS-1$ + logger.error("The KMZ file could not be found", e); //$NON-NLS-1$ + } + } + + public static void executeKmlLoadAsynchronously( Window windowShowingTimer ) { + new Thread("Load KML in Google Earth"){ + @Override + public void run() { + // Only regenerate KML and reload + try { + SwingUtilities.invokeLater( ( ) -> { + if( windowShowingTimer != null ){ + CollectEarthWindow.startWaiting(windowShowingTimer); + } + }); + + EarthApp.loadKmlInGoogleEarth(true); + + } catch (Exception e) { + logger.error("Error loading the KML",e); + EarthApp.showMessage("Problems while generating the KML file:
" + + (e.getCause()!=null?(e.getCause()+"
"):"") + + ( + ( e.getMessage()!=null && e.getMessage().length() > 300 ) ? e.getMessage().substring(0,300) : + ( e.getMessage()!=null ) ? e.getMessage() : "" + ) + ""); //$NON-NLS-1$ + }finally{ + if( windowShowingTimer != null ){ + try { + SwingUtilities.invokeLater( () -> { + CollectEarthWindow.endWaiting(windowShowingTimer); + if( windowShowingTimer instanceof PropertiesDialog ){ + ( (PropertiesDialog) windowShowingTimer).closeDialog(); + } + }); + } catch (Exception e2) { + logger.error("Error closing Options dialog", e2); + } + } + } + + } + }.start(); + } + + +} From 7020cdee47fd8c6fb5767b03b08282f160fe6721 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:20 +0100 Subject: [PATCH 0997/1620] New translations MacOpenFilesInvocationHandler.java (French) --- .../earth/app/view/Messages_fr.properties | 541 ++---------------- 1 file changed, 36 insertions(+), 505 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 0777f46090..1f014d967a 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,534 +1,65 @@ package org.openforis.collect.earth.app.desktop; -import java.awt.Image; -import java.awt.SplashScreen; -import java.awt.Window; -import java.io.BufferedReader; import java.io.File; import java.io.IOException; -import java.io.InputStreamReader; import java.lang.reflect.Method; -import java.lang.reflect.Proxy; -import java.net.MalformedURLException; -import java.net.Socket; -import java.net.URL; -import java.net.URLConnection; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.util.Observer; +import java.util.List; -import javax.swing.ImageIcon; -import javax.swing.JOptionPane; -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.SystemUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.desktop.ServerController.ServerInitializationEvent; -import org.openforis.collect.earth.app.logging.GAlogger; -import org.openforis.collect.earth.app.server.LoadProjectFileServlet; -import org.openforis.collect.earth.app.service.EarthProjectsService; -import org.openforis.collect.earth.app.service.FolderFinder; -import org.openforis.collect.earth.app.service.KmlGeneratorService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.app.service.UpdateIniUtils; -import org.openforis.collect.earth.app.view.CheckForUpdatesListener; -import org.openforis.collect.earth.app.view.CollectEarthWindow; -import org.openforis.collect.earth.app.view.Messages; -import org.openforis.collect.earth.app.view.PropertiesDialog; -import org.openforis.collect.earth.sampler.utils.KmlGenerationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.opencsv.exceptions.CsvValidationException; - -import io.sentry.Sentry; -import io.sentry.protocol.User; - /** - * Contains the main class that starts Collect Earth and opens Google Earth. - * + * Use reflection to be able to add the code specific to Mac OS X without generating compilation errors + * This class generates a Proxy so that an Interface method can be invoked. Sort of implementing an Interface using reflection + * @see How to implement an interface using Reflection * @author Alfonso Sanchez-Paus Diaz * */ -public class EarthApp { - - private static Logger logger; - private static ServerController serverController; - private static EarthApp earthApp; - - private static void closeSplash() { - try { - final SplashScreen splash = SplashScreen.getSplashScreen(); - if (splash != null) { - splash.close(); - } - } catch (final IllegalStateException e) { - logger.error("Error closing the splash window", e); //$NON-NLS-1$ - } - } - - /** - * Start the application, opening Google Earth and starting the Jetty server. - * - * @param args - * No arguments are used by this method. - */ - public static void main(String[] args) { - - try { - - // System property used in the web.xml configuration - System.setProperty("collectEarth.userFolder", FolderFinder.getCollectEarthDataFolder()); //$NON-NLS-1$ - - // Specify a browser as http.agent so that calls to CloudFlare hosted OpenForis.org do not return with a 403 http error - System.setProperty("http.agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2"); - - initializeSentry(); - - // Change of font so that Lao and Thao glyphs are supported - CollectEarthUtils.setFontDependingOnLanguaue( getLocalProperties().getUiLanguage() ); - - logger = LoggerFactory.getLogger(EarthApp.class); - - String doubleClickedProjectFile = null; - - if (args != null && args.length == 1) { - doubleClickedProjectFile = args[0]; - }else if( getProjectsService().getProjectList().size() == 0 ){ - doubleClickedProjectFile = "resources/demo_survey.cep"; - } - - if ( SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX){ - handleMacStartup( doubleClickedProjectFile ); - }else{ - startCollectEarth( doubleClickedProjectFile ); - } - - } catch (final Exception e) { - // The logger factory has not been initialized, this will not work, just output to console - if (logger != null) { - logger.error("The server could not start", e); //$NON-NLS-1$ - } - System.exit(1); - } finally { - closeSplash(); - } - } - - private static void initializeSentry() { - try { - String releaseName= UpdateIniUtils.getReleaseNameInstalled(); - - Sentry.init("https://24dd6a90c1e4461484712db99c3b3bb7:831e42661c5c4ff3aa5eca270db3f619@sentry.io/299626?release="+releaseName+"&maxmessagelength=2000" ); - if( !StringUtils.isEmpty( UpdateIniUtils.getVersionInstalled() ) ) { - Sentry.setTag( "ReleaseDate", UpdateIniUtils.getVersionInstalled() ); - } - if( !StringUtils.isEmpty( getLocalProperties().getOperator() ) ) { - User user = new User(); - user.setUsername( getLocalProperties().getOperator() ); - Sentry.setUser(user); - } - - } catch (Exception e) { - logger.error( "Error initializing Sentry logger" , e); - } - } - /** - * Special code that uses reflection to handle how the application should behave in Mac OS X. - * Without reflection the code provokes compilation-time errors. - * @param doubleClickedProjectFile Project file (CEP) that was clicked - * @throws Exception Throws Exception when the process fails to open the file double-clicked. Initializes the server in any case - */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - public static void handleMacStartup(String doubleClickedProjectFile) throws Exception{ - try { - Class applicationClass = Class.forName("com.apple.eawt.Application"); - Method getApplicationMethod = applicationClass.getMethod("getApplication"); - Method setDockIconImageMethod = applicationClass.getMethod( "setDockIconImage", Image.class ); - - Class openFilesHandlerInterface = Class.forName("com.apple.eawt.OpenFilesHandler"); - Method setOpenFileHandlerMethod = applicationClass.getMethod( "setOpenFileHandler", openFilesHandlerInterface ); - - // SET THE MAC OS X DOCK ICON! - // Get an Application object - Object applicationObject = getApplicationMethod.invoke( null ); - try { - Image dockIconImage = new ImageIcon(new File("images/dockIconMac.png").toURI().toURL()).getImage(); - // Invoke the setDockIconImage on the application object using the dockIconImage as an argument - setDockIconImageMethod.invoke(applicationObject, dockIconImage ); - } catch (MalformedURLException e2) { - logger.error("Problems finding the docker icon", e2); - } - // ------------------------------------------- - - - // DEFINE A LISTENER THAT IS REGISTERED BY THE OS TO HEAR DOUBLE-CLICK EVENTS AND REGISTER ITSELF AS THE CEP OPENER - MacOpenFilesInvocationHandler macOpenFileHandlerProxyInterface = new MacOpenFilesInvocationHandler(); - Object openFilesHandlerImplementation = Proxy.newProxyInstance( - applicationClass.getClassLoader(), - new Class[]{ openFilesHandlerInterface }, - macOpenFileHandlerProxyInterface - ); - - // Call the setOpenFileHandler method of the application object using the - setOpenFileHandlerMethod.invoke(applicationObject, ( openFilesHandlerInterface.cast( openFilesHandlerImplementation ) ) ); - - // Lets wait for the Apple event to arrive. If it did then the earthApp variable will be non-nulls - Thread.sleep(2000); - if( earthApp == null ){ - startCollectEarth( doubleClickedProjectFile ); - } - } catch (Exception e) { - logger.error("Error while defining the double-click behaviour on CEP files in Mac OS X", e); - startCollectEarth( null ); - } - } - - public void generateKml() { - - try { - getKmlGeneratorService().generateKmlFile(); - } catch (final KmlGenerationException e) { - logger.error("Problems while generating the KML file ", e); //$NON-NLS-1$ - showMessage("Problems while generating the KML file:
" + (e.getCause()!=null?(e.getCause()+"
"):"") + ( e.getMessage().length() > 300?e.getMessage().substring(0,300):e.getMessage() ) + ""); //$NON-NLS-1$ - } catch (final Exception e) { - logger.error("Could not generate KML file", e); //$NON-NLS-1$ - showMessage("Error generating KML file :
" + e.getMessage()); //$NON-NLS-1$ - } - } - - public static void openProjectFileInRunningCollectEarth(String doubleClickedProjecFile) throws IOException { - final File projectFile = new File(doubleClickedProjecFile); - - if (projectFile.exists()) { - - String hostAddress = ServerController.getHostAddress( getLocalProperties().getHost(), getLocalProperties().getPort()); - - URL loadProjectFileInRunningCE = new URL(hostAddress + LoadProjectFileServlet.SERVLET_NAME + - "?" + LoadProjectFileServlet.PROJECT_FILE_PARAMETER + "=" + //$NON-NLS-1$ //$NON-NLS-2$ - URLEncoder.encode(doubleClickedProjecFile, StandardCharsets.UTF_8.name() ) ); - URLConnection urlConn = loadProjectFileInRunningCE.openConnection(); - - try( BufferedReader in = new BufferedReader(new InputStreamReader(urlConn.getInputStream())) ){ - String inputLine; - while ((inputLine = in.readLine()) != null) { - logger.info(inputLine); - } - } +public class MacOpenFilesInvocationHandler implements java.lang.reflect.InvocationHandler { - } - } + private final Logger logger = LoggerFactory.getLogger(MacOpenFilesInvocationHandler.class); - private static boolean isAnotherCollectEarthRunning(LocalPropertiesService localProperties) { - boolean alreadyRunning = false; - try { - new Socket( LocalPropertiesService.LOCAL_HOST , Integer.parseInt(localProperties.getPort())).close(); //$NON-NLS-1$ - // If here there is something is serving on port 8028 - // So stop it - logger.warn("There is a server already running {}", localProperties.getPort()); //$NON-NLS-1$ - alreadyRunning = true; - } catch (final IOException e) { - // Nothing there, so OK to proceed - logger.info("There is no server running in port {}", localProperties.getPort()); //$NON-NLS-1$ - alreadyRunning = false; - } catch (final NumberFormatException e) { - // Nothing there, so OK to proceed - logger.info("Error parsing integer value {}", localProperties.getPort()); //$NON-NLS-1$ - alreadyRunning = false; - } - return alreadyRunning; - } - - public static void quitServer() { - try { - serverController.stopServer(); - } catch (Exception e) { - logger.error("Error stoping server", e); //$NON-NLS-1$ - } - } - - /** - * Generates the KML for the project and opens it in Google Earth - * @param forceKmlRecreation Set to true if you want to forece the regeneration of the KML even if is is up to date (you might want to do this to force the update of the placemark icons as the date changes) - * @throws IOException Throws exception if the KMl file cannot be generated - * @throws KmlGenerationException Throws exception if the KML file contents cannot be generated - * @throws CsvValidationException - */ - private static synchronized void loadKmlInGoogleEarth(boolean forceKmlRecreation) throws IOException, KmlGenerationException, CsvValidationException { - earthApp.getKmlGeneratorService().generatePlacemarksKmzFile( forceKmlRecreation ); - earthApp.simulateClickKmz(); - } - - public static void restart() { - try { - - serverController.stopServer(); - startServer(null); - - } catch (final Exception e) { - logger.error("Error while stopping server", e); //$NON-NLS-1$ - } - } - - private static LocalPropertiesService nonManagedPropertiesService; - - - private static LocalPropertiesService getLocalProperties() { - if (serverController == null || serverController.getContext() == null) { - if (nonManagedPropertiesService == null) { - nonManagedPropertiesService = new LocalPropertiesService(); - } - return nonManagedPropertiesService; - } else { - return serverController.getContext().getBean(LocalPropertiesService.class); - } - } - - private static EarthProjectsService getProjectsService() { - if (serverController != null) { - return serverController.getContext().getBean(EarthProjectsService.class); - } else { - final EarthProjectsService earthProjectsService = new EarthProjectsService(); - earthProjectsService.init(getLocalProperties()); - return earthProjectsService; - } - } - - - private KmlGeneratorService getKmlGeneratorService() { - if (serverController != null) { - return serverController.getContext().getBean(KmlGeneratorService.class); - } else { - throw new IllegalStateException("The server must be initialized before this method is called"); //$NON-NLS-1$ - } - } - - private static void startCollectEarth(final String doubleClickedProjectFile) throws Exception { - logger.info("START - Server Initilization"); //$NON-NLS-1$ - final boolean ceAlreadyOpen = isAnotherCollectEarthRunning( getLocalProperties()); - - if( ceAlreadyOpen ){ - closeSplash(); - // If the user double clicked on a project file while Collect Earth is running then load the project in the running Collect Earth - if (doubleClickedProjectFile!=null) { - openProjectFileInRunningCollectEarth(doubleClickedProjectFile); - }else{ - showMessage(Messages.getString("EarthApp.11")); //$NON-NLS-1$ - } - }else{ - - startServer(doubleClickedProjectFile); - } - - GAlogger.logGAnalytics("Start"); - } - - public static void startServer(final String doubleClickedProjectFile) - throws Exception { - earthApp = new EarthApp(); - - // Load the double-clicked CEP file before the survey manager is instantiated by the server start-up - earthApp.loadProjectIfDoubleClicked(doubleClickedProjectFile); - - - final Observer observeInitialization = getServerObserver(); - serverStartAndOpenGe(observeInitialization); - } - - private static Observer getServerObserver() { - return (observable, initializationEvent) ->{ - if (initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT)) { - serverController = null; - } - - if( initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT) || - initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT) ){ - - showMessage( initializationEvent.toString()); - } - - if (!initializationEvent.equals(ServerInitializationEvent.SERVER_STOPPED_EVENT)) { - try { - earthApp.generateKml(); - earthApp.simulateClickKmz(); - earthApp.checkForUpdates(); - closeSplash(); - } catch (final Exception e) { - logger.error("Error generating KML file", e); //$NON-NLS-1$ - } - } - }; - } - - private void openKmlOnGoogleEarth(){ - if (! CollectEarthUtils.openFile( new File(KmlGeneratorService.KML_NETWORK_LINK_STARTER)) ) { - showMessage("The KML file cannot be open at " + KmlGeneratorService.KML_NETWORK_LINK_STARTER); //$NON-NLS-1$ - } - } - - private void checkForUpdates() { - new Thread("Check for new Collect Earth versions on the server") { - @Override - public void run() { - - // Wait a few seconds before checking for updates - try { - Thread.sleep(10000); - } catch (InterruptedException e1) { - logger.error("Error while waiting", e1); //$NON-NLS-1$ - } - - final UpdateIniUtils updateIniUtils = new UpdateIniUtils(); - - - if (updateIniUtils.shouldWarnUser(getLocalProperties() )) { - - javax.swing.SwingUtilities.invokeLater( () -> { - String remindLater = Messages.getString("EarthApp.3"); //$NON-NLS-1$ - String doItNow = Messages.getString("EarthApp.4"); //$NON-NLS-1$ - String doNotBother = Messages.getString("EarthApp.5"); //$NON-NLS-1$ - - String newestVersionOnline = updateIniUtils.getVersionAvailableOnline(); - - if( StringUtils.isNotBlank( newestVersionOnline ) ) { - - Object[] possibleValues = { remindLater, doItNow, doNotBother }; - int chosenOption = JOptionPane.showOptionDialog(null, - Messages.getString("EarthApp.57"), Messages.getString("EarthApp.58") + Messages.getString("EarthApp.6") + updateIniUtils.convertToDate(newestVersionOnline), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, possibleValues, possibleValues[0]); - if( chosenOption != JOptionPane.CLOSED_OPTION ){ - if (possibleValues[chosenOption].equals(doItNow)) { - CheckForUpdatesListener checkForUpdatesListener = new CheckForUpdatesListener(); - checkForUpdatesListener.actionPerformed(null); - } else if (possibleValues[chosenOption].equals(doNotBother)) { - getLocalProperties().setValue(EarthProperty.LAST_IGNORED_UPDATE, newestVersionOnline); - } - } - } - }); - } - } - }.start(); - - } - - - /** - * If Collect Earth is started by double clicking on a ".cep" file ( Collect Earth Project file ) - * Then it should open directly with that project in focus - * - * @param doubleClickedProjecFile - * The path to the CEP file that was double-clicked - * - */ - private void loadProjectIfDoubleClicked(String doubleClickedProjectFile) { - try { - if (doubleClickedProjectFile != null) { - - final File projectFile = new File(doubleClickedProjectFile); - - if (projectFile.exists()) { - getProjectsService().loadCompressedProjectFile(projectFile); - } - } - } catch (final Exception e) { - showMessage(Messages.getString("EarthApp.59")); //$NON-NLS-1$ - logger.error(Messages.getString("EarthApp.59"), e);//$NON-NLS-1$ - } - } + public MacOpenFilesInvocationHandler() { + super(); + } - private static void serverStartAndOpenGe(Observer observeInitialization) throws Exception { - serverController = new ServerController(); - serverController.deleteObservers(); - serverController.startServer(observeInitialization); + public Object invoke(Object proxy, Method m, Object[] args) throws Throwable - // Inform Mac OS users of the issues about opening CEP files in the Mac version of CE - if(SystemUtils.IS_OS_MAC_OSX ) { - showMessage( - "" //$NON-NLS-1$ - + "" //$NON-NLS-1$ - + Messages.getString("EarthApp.70") - + ": " //$NON-NLS-1$ - + Messages.getString("EarthApp.71") - + Messages.getString("EarthApp.72") - + "" //$NON-NLS-1$ - + Messages.getString("CollectEarthWindow.10") - + " -> " //$NON-NLS-1$ - + Messages.getString("CollectEarthMenu.0") - + "", //$NON-NLS-1$ - Messages.getString("EarthApp.73") - ); - } - } + { - public static void showMessage(String message) { - showMessage(message, "Collect Earth"); + Object result = null; - } + try { - public static void showMessage(String message, String title) { - try { - SwingUtilities.invokeLater( - () -> JOptionPane.showMessageDialog(null, message, title, JOptionPane.WARNING_MESSAGE) - ); - } catch (Exception e) { - logger.error("Error showing message",e); - } + // if the method name equals some method's name then call your method + if ( m!= null && m.getName().equals("openFiles") && args !=null && args.length>0) { + openFilesImplmentation(args[0]); + } - } + } catch (Exception e) { + logger.error(" Error while interpreting invocation " , e ); + } finally { + logger.info("end method {}", m!=null?m.getName():"Unknown method"); + } - private void simulateClickKmz() { - try { - getKmlGeneratorService().generateLoaderKmlFile(); - openKmlOnGoogleEarth(); - } catch (final Exception e) { - showMessage(Messages.getString("EarthApp.61")); //$NON-NLS-1$ - logger.error("The KMZ file could not be found", e); //$NON-NLS-1$ - } - } + return result; - public static void executeKmlLoadAsynchronously( Window windowShowingTimer ) { - new Thread("Load KML in Google Earth"){ - @Override - public void run() { - // Only regenerate KML and reload - try { - SwingUtilities.invokeLater( ( ) -> { - if( windowShowingTimer != null ){ - CollectEarthWindow.startWaiting(windowShowingTimer); - } - }); + } - EarthApp.loadKmlInGoogleEarth(true); + private void openFilesImplmentation(Object openFilesEventObject) throws Exception { + Class openFilesEventClass = Class.forName("com.apple.eawt.AppEvent.OpenFilesEvent"); + Method getFilesMethod = openFilesEventClass.getMethod("getFiles"); - } catch (Exception e) { - logger.error("Error loading the KML",e); - EarthApp.showMessage("Problems while generating the KML file:
" + - (e.getCause()!=null?(e.getCause()+"
"):"") + - ( - ( e.getMessage()!=null && e.getMessage().length() > 300 ) ? e.getMessage().substring(0,300) : - ( e.getMessage()!=null ) ? e.getMessage() : "" - ) + ""); //$NON-NLS-1$ - }finally{ - if( windowShowingTimer != null ){ - try { - SwingUtilities.invokeLater( () -> { - CollectEarthWindow.endWaiting(windowShowingTimer); - if( windowShowingTimer instanceof PropertiesDialog ){ - ( (PropertiesDialog) windowShowingTimer).closeDialog(); - } - }); - } catch (Exception e2) { - logger.error("Error closing Options dialog", e2); - } - } - } + List files = (List) getFilesMethod.invoke( openFilesEventClass.cast( openFilesEventObject ) ); + for (File file : files ){ + try { + EarthApp.openProjectFileInRunningCollectEarth(file.getAbsolutePath()); + } catch (IOException e1) { + logger.error("Error opening CEP file " + e1); } - }.start(); - } + } + } + } -} From 8ddfd9f2f9547ff06e349ba9b0b55852d1246eda Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:21 +0100 Subject: [PATCH 0998/1620] New translations MacOpenFilesInvocationHandler.java (Spanish) --- .../earth/app/view/Messages_es.properties | 541 ++---------------- 1 file changed, 36 insertions(+), 505 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 0777f46090..1f014d967a 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,534 +1,65 @@ package org.openforis.collect.earth.app.desktop; -import java.awt.Image; -import java.awt.SplashScreen; -import java.awt.Window; -import java.io.BufferedReader; import java.io.File; import java.io.IOException; -import java.io.InputStreamReader; import java.lang.reflect.Method; -import java.lang.reflect.Proxy; -import java.net.MalformedURLException; -import java.net.Socket; -import java.net.URL; -import java.net.URLConnection; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.util.Observer; +import java.util.List; -import javax.swing.ImageIcon; -import javax.swing.JOptionPane; -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.SystemUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.desktop.ServerController.ServerInitializationEvent; -import org.openforis.collect.earth.app.logging.GAlogger; -import org.openforis.collect.earth.app.server.LoadProjectFileServlet; -import org.openforis.collect.earth.app.service.EarthProjectsService; -import org.openforis.collect.earth.app.service.FolderFinder; -import org.openforis.collect.earth.app.service.KmlGeneratorService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.app.service.UpdateIniUtils; -import org.openforis.collect.earth.app.view.CheckForUpdatesListener; -import org.openforis.collect.earth.app.view.CollectEarthWindow; -import org.openforis.collect.earth.app.view.Messages; -import org.openforis.collect.earth.app.view.PropertiesDialog; -import org.openforis.collect.earth.sampler.utils.KmlGenerationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.opencsv.exceptions.CsvValidationException; - -import io.sentry.Sentry; -import io.sentry.protocol.User; - /** - * Contains the main class that starts Collect Earth and opens Google Earth. - * + * Use reflection to be able to add the code specific to Mac OS X without generating compilation errors + * This class generates a Proxy so that an Interface method can be invoked. Sort of implementing an Interface using reflection + * @see How to implement an interface using Reflection * @author Alfonso Sanchez-Paus Diaz * */ -public class EarthApp { - - private static Logger logger; - private static ServerController serverController; - private static EarthApp earthApp; - - private static void closeSplash() { - try { - final SplashScreen splash = SplashScreen.getSplashScreen(); - if (splash != null) { - splash.close(); - } - } catch (final IllegalStateException e) { - logger.error("Error closing the splash window", e); //$NON-NLS-1$ - } - } - - /** - * Start the application, opening Google Earth and starting the Jetty server. - * - * @param args - * No arguments are used by this method. - */ - public static void main(String[] args) { - - try { - - // System property used in the web.xml configuration - System.setProperty("collectEarth.userFolder", FolderFinder.getCollectEarthDataFolder()); //$NON-NLS-1$ - - // Specify a browser as http.agent so that calls to CloudFlare hosted OpenForis.org do not return with a 403 http error - System.setProperty("http.agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2"); - - initializeSentry(); - - // Change of font so that Lao and Thao glyphs are supported - CollectEarthUtils.setFontDependingOnLanguaue( getLocalProperties().getUiLanguage() ); - - logger = LoggerFactory.getLogger(EarthApp.class); - - String doubleClickedProjectFile = null; - - if (args != null && args.length == 1) { - doubleClickedProjectFile = args[0]; - }else if( getProjectsService().getProjectList().size() == 0 ){ - doubleClickedProjectFile = "resources/demo_survey.cep"; - } - - if ( SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX){ - handleMacStartup( doubleClickedProjectFile ); - }else{ - startCollectEarth( doubleClickedProjectFile ); - } - - } catch (final Exception e) { - // The logger factory has not been initialized, this will not work, just output to console - if (logger != null) { - logger.error("The server could not start", e); //$NON-NLS-1$ - } - System.exit(1); - } finally { - closeSplash(); - } - } - - private static void initializeSentry() { - try { - String releaseName= UpdateIniUtils.getReleaseNameInstalled(); - - Sentry.init("https://24dd6a90c1e4461484712db99c3b3bb7:831e42661c5c4ff3aa5eca270db3f619@sentry.io/299626?release="+releaseName+"&maxmessagelength=2000" ); - if( !StringUtils.isEmpty( UpdateIniUtils.getVersionInstalled() ) ) { - Sentry.setTag( "ReleaseDate", UpdateIniUtils.getVersionInstalled() ); - } - if( !StringUtils.isEmpty( getLocalProperties().getOperator() ) ) { - User user = new User(); - user.setUsername( getLocalProperties().getOperator() ); - Sentry.setUser(user); - } - - } catch (Exception e) { - logger.error( "Error initializing Sentry logger" , e); - } - } - /** - * Special code that uses reflection to handle how the application should behave in Mac OS X. - * Without reflection the code provokes compilation-time errors. - * @param doubleClickedProjectFile Project file (CEP) that was clicked - * @throws Exception Throws Exception when the process fails to open the file double-clicked. Initializes the server in any case - */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - public static void handleMacStartup(String doubleClickedProjectFile) throws Exception{ - try { - Class applicationClass = Class.forName("com.apple.eawt.Application"); - Method getApplicationMethod = applicationClass.getMethod("getApplication"); - Method setDockIconImageMethod = applicationClass.getMethod( "setDockIconImage", Image.class ); - - Class openFilesHandlerInterface = Class.forName("com.apple.eawt.OpenFilesHandler"); - Method setOpenFileHandlerMethod = applicationClass.getMethod( "setOpenFileHandler", openFilesHandlerInterface ); - - // SET THE MAC OS X DOCK ICON! - // Get an Application object - Object applicationObject = getApplicationMethod.invoke( null ); - try { - Image dockIconImage = new ImageIcon(new File("images/dockIconMac.png").toURI().toURL()).getImage(); - // Invoke the setDockIconImage on the application object using the dockIconImage as an argument - setDockIconImageMethod.invoke(applicationObject, dockIconImage ); - } catch (MalformedURLException e2) { - logger.error("Problems finding the docker icon", e2); - } - // ------------------------------------------- - - - // DEFINE A LISTENER THAT IS REGISTERED BY THE OS TO HEAR DOUBLE-CLICK EVENTS AND REGISTER ITSELF AS THE CEP OPENER - MacOpenFilesInvocationHandler macOpenFileHandlerProxyInterface = new MacOpenFilesInvocationHandler(); - Object openFilesHandlerImplementation = Proxy.newProxyInstance( - applicationClass.getClassLoader(), - new Class[]{ openFilesHandlerInterface }, - macOpenFileHandlerProxyInterface - ); - - // Call the setOpenFileHandler method of the application object using the - setOpenFileHandlerMethod.invoke(applicationObject, ( openFilesHandlerInterface.cast( openFilesHandlerImplementation ) ) ); - - // Lets wait for the Apple event to arrive. If it did then the earthApp variable will be non-nulls - Thread.sleep(2000); - if( earthApp == null ){ - startCollectEarth( doubleClickedProjectFile ); - } - } catch (Exception e) { - logger.error("Error while defining the double-click behaviour on CEP files in Mac OS X", e); - startCollectEarth( null ); - } - } - - public void generateKml() { - - try { - getKmlGeneratorService().generateKmlFile(); - } catch (final KmlGenerationException e) { - logger.error("Problems while generating the KML file ", e); //$NON-NLS-1$ - showMessage("Problems while generating the KML file:
" + (e.getCause()!=null?(e.getCause()+"
"):"") + ( e.getMessage().length() > 300?e.getMessage().substring(0,300):e.getMessage() ) + ""); //$NON-NLS-1$ - } catch (final Exception e) { - logger.error("Could not generate KML file", e); //$NON-NLS-1$ - showMessage("Error generating KML file :
" + e.getMessage()); //$NON-NLS-1$ - } - } - - public static void openProjectFileInRunningCollectEarth(String doubleClickedProjecFile) throws IOException { - final File projectFile = new File(doubleClickedProjecFile); - - if (projectFile.exists()) { - - String hostAddress = ServerController.getHostAddress( getLocalProperties().getHost(), getLocalProperties().getPort()); - - URL loadProjectFileInRunningCE = new URL(hostAddress + LoadProjectFileServlet.SERVLET_NAME + - "?" + LoadProjectFileServlet.PROJECT_FILE_PARAMETER + "=" + //$NON-NLS-1$ //$NON-NLS-2$ - URLEncoder.encode(doubleClickedProjecFile, StandardCharsets.UTF_8.name() ) ); - URLConnection urlConn = loadProjectFileInRunningCE.openConnection(); - - try( BufferedReader in = new BufferedReader(new InputStreamReader(urlConn.getInputStream())) ){ - String inputLine; - while ((inputLine = in.readLine()) != null) { - logger.info(inputLine); - } - } +public class MacOpenFilesInvocationHandler implements java.lang.reflect.InvocationHandler { - } - } + private final Logger logger = LoggerFactory.getLogger(MacOpenFilesInvocationHandler.class); - private static boolean isAnotherCollectEarthRunning(LocalPropertiesService localProperties) { - boolean alreadyRunning = false; - try { - new Socket( LocalPropertiesService.LOCAL_HOST , Integer.parseInt(localProperties.getPort())).close(); //$NON-NLS-1$ - // If here there is something is serving on port 8028 - // So stop it - logger.warn("There is a server already running {}", localProperties.getPort()); //$NON-NLS-1$ - alreadyRunning = true; - } catch (final IOException e) { - // Nothing there, so OK to proceed - logger.info("There is no server running in port {}", localProperties.getPort()); //$NON-NLS-1$ - alreadyRunning = false; - } catch (final NumberFormatException e) { - // Nothing there, so OK to proceed - logger.info("Error parsing integer value {}", localProperties.getPort()); //$NON-NLS-1$ - alreadyRunning = false; - } - return alreadyRunning; - } - - public static void quitServer() { - try { - serverController.stopServer(); - } catch (Exception e) { - logger.error("Error stoping server", e); //$NON-NLS-1$ - } - } - - /** - * Generates the KML for the project and opens it in Google Earth - * @param forceKmlRecreation Set to true if you want to forece the regeneration of the KML even if is is up to date (you might want to do this to force the update of the placemark icons as the date changes) - * @throws IOException Throws exception if the KMl file cannot be generated - * @throws KmlGenerationException Throws exception if the KML file contents cannot be generated - * @throws CsvValidationException - */ - private static synchronized void loadKmlInGoogleEarth(boolean forceKmlRecreation) throws IOException, KmlGenerationException, CsvValidationException { - earthApp.getKmlGeneratorService().generatePlacemarksKmzFile( forceKmlRecreation ); - earthApp.simulateClickKmz(); - } - - public static void restart() { - try { - - serverController.stopServer(); - startServer(null); - - } catch (final Exception e) { - logger.error("Error while stopping server", e); //$NON-NLS-1$ - } - } - - private static LocalPropertiesService nonManagedPropertiesService; - - - private static LocalPropertiesService getLocalProperties() { - if (serverController == null || serverController.getContext() == null) { - if (nonManagedPropertiesService == null) { - nonManagedPropertiesService = new LocalPropertiesService(); - } - return nonManagedPropertiesService; - } else { - return serverController.getContext().getBean(LocalPropertiesService.class); - } - } - - private static EarthProjectsService getProjectsService() { - if (serverController != null) { - return serverController.getContext().getBean(EarthProjectsService.class); - } else { - final EarthProjectsService earthProjectsService = new EarthProjectsService(); - earthProjectsService.init(getLocalProperties()); - return earthProjectsService; - } - } - - - private KmlGeneratorService getKmlGeneratorService() { - if (serverController != null) { - return serverController.getContext().getBean(KmlGeneratorService.class); - } else { - throw new IllegalStateException("The server must be initialized before this method is called"); //$NON-NLS-1$ - } - } - - private static void startCollectEarth(final String doubleClickedProjectFile) throws Exception { - logger.info("START - Server Initilization"); //$NON-NLS-1$ - final boolean ceAlreadyOpen = isAnotherCollectEarthRunning( getLocalProperties()); - - if( ceAlreadyOpen ){ - closeSplash(); - // If the user double clicked on a project file while Collect Earth is running then load the project in the running Collect Earth - if (doubleClickedProjectFile!=null) { - openProjectFileInRunningCollectEarth(doubleClickedProjectFile); - }else{ - showMessage(Messages.getString("EarthApp.11")); //$NON-NLS-1$ - } - }else{ - - startServer(doubleClickedProjectFile); - } - - GAlogger.logGAnalytics("Start"); - } - - public static void startServer(final String doubleClickedProjectFile) - throws Exception { - earthApp = new EarthApp(); - - // Load the double-clicked CEP file before the survey manager is instantiated by the server start-up - earthApp.loadProjectIfDoubleClicked(doubleClickedProjectFile); - - - final Observer observeInitialization = getServerObserver(); - serverStartAndOpenGe(observeInitialization); - } - - private static Observer getServerObserver() { - return (observable, initializationEvent) ->{ - if (initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT)) { - serverController = null; - } - - if( initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT) || - initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT) ){ - - showMessage( initializationEvent.toString()); - } - - if (!initializationEvent.equals(ServerInitializationEvent.SERVER_STOPPED_EVENT)) { - try { - earthApp.generateKml(); - earthApp.simulateClickKmz(); - earthApp.checkForUpdates(); - closeSplash(); - } catch (final Exception e) { - logger.error("Error generating KML file", e); //$NON-NLS-1$ - } - } - }; - } - - private void openKmlOnGoogleEarth(){ - if (! CollectEarthUtils.openFile( new File(KmlGeneratorService.KML_NETWORK_LINK_STARTER)) ) { - showMessage("The KML file cannot be open at " + KmlGeneratorService.KML_NETWORK_LINK_STARTER); //$NON-NLS-1$ - } - } - - private void checkForUpdates() { - new Thread("Check for new Collect Earth versions on the server") { - @Override - public void run() { - - // Wait a few seconds before checking for updates - try { - Thread.sleep(10000); - } catch (InterruptedException e1) { - logger.error("Error while waiting", e1); //$NON-NLS-1$ - } - - final UpdateIniUtils updateIniUtils = new UpdateIniUtils(); - - - if (updateIniUtils.shouldWarnUser(getLocalProperties() )) { - - javax.swing.SwingUtilities.invokeLater( () -> { - String remindLater = Messages.getString("EarthApp.3"); //$NON-NLS-1$ - String doItNow = Messages.getString("EarthApp.4"); //$NON-NLS-1$ - String doNotBother = Messages.getString("EarthApp.5"); //$NON-NLS-1$ - - String newestVersionOnline = updateIniUtils.getVersionAvailableOnline(); - - if( StringUtils.isNotBlank( newestVersionOnline ) ) { - - Object[] possibleValues = { remindLater, doItNow, doNotBother }; - int chosenOption = JOptionPane.showOptionDialog(null, - Messages.getString("EarthApp.57"), Messages.getString("EarthApp.58") + Messages.getString("EarthApp.6") + updateIniUtils.convertToDate(newestVersionOnline), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, possibleValues, possibleValues[0]); - if( chosenOption != JOptionPane.CLOSED_OPTION ){ - if (possibleValues[chosenOption].equals(doItNow)) { - CheckForUpdatesListener checkForUpdatesListener = new CheckForUpdatesListener(); - checkForUpdatesListener.actionPerformed(null); - } else if (possibleValues[chosenOption].equals(doNotBother)) { - getLocalProperties().setValue(EarthProperty.LAST_IGNORED_UPDATE, newestVersionOnline); - } - } - } - }); - } - } - }.start(); - - } - - - /** - * If Collect Earth is started by double clicking on a ".cep" file ( Collect Earth Project file ) - * Then it should open directly with that project in focus - * - * @param doubleClickedProjecFile - * The path to the CEP file that was double-clicked - * - */ - private void loadProjectIfDoubleClicked(String doubleClickedProjectFile) { - try { - if (doubleClickedProjectFile != null) { - - final File projectFile = new File(doubleClickedProjectFile); - - if (projectFile.exists()) { - getProjectsService().loadCompressedProjectFile(projectFile); - } - } - } catch (final Exception e) { - showMessage(Messages.getString("EarthApp.59")); //$NON-NLS-1$ - logger.error(Messages.getString("EarthApp.59"), e);//$NON-NLS-1$ - } - } + public MacOpenFilesInvocationHandler() { + super(); + } - private static void serverStartAndOpenGe(Observer observeInitialization) throws Exception { - serverController = new ServerController(); - serverController.deleteObservers(); - serverController.startServer(observeInitialization); + public Object invoke(Object proxy, Method m, Object[] args) throws Throwable - // Inform Mac OS users of the issues about opening CEP files in the Mac version of CE - if(SystemUtils.IS_OS_MAC_OSX ) { - showMessage( - "" //$NON-NLS-1$ - + "" //$NON-NLS-1$ - + Messages.getString("EarthApp.70") - + ": " //$NON-NLS-1$ - + Messages.getString("EarthApp.71") - + Messages.getString("EarthApp.72") - + "" //$NON-NLS-1$ - + Messages.getString("CollectEarthWindow.10") - + " -> " //$NON-NLS-1$ - + Messages.getString("CollectEarthMenu.0") - + "", //$NON-NLS-1$ - Messages.getString("EarthApp.73") - ); - } - } + { - public static void showMessage(String message) { - showMessage(message, "Collect Earth"); + Object result = null; - } + try { - public static void showMessage(String message, String title) { - try { - SwingUtilities.invokeLater( - () -> JOptionPane.showMessageDialog(null, message, title, JOptionPane.WARNING_MESSAGE) - ); - } catch (Exception e) { - logger.error("Error showing message",e); - } + // if the method name equals some method's name then call your method + if ( m!= null && m.getName().equals("openFiles") && args !=null && args.length>0) { + openFilesImplmentation(args[0]); + } - } + } catch (Exception e) { + logger.error(" Error while interpreting invocation " , e ); + } finally { + logger.info("end method {}", m!=null?m.getName():"Unknown method"); + } - private void simulateClickKmz() { - try { - getKmlGeneratorService().generateLoaderKmlFile(); - openKmlOnGoogleEarth(); - } catch (final Exception e) { - showMessage(Messages.getString("EarthApp.61")); //$NON-NLS-1$ - logger.error("The KMZ file could not be found", e); //$NON-NLS-1$ - } - } + return result; - public static void executeKmlLoadAsynchronously( Window windowShowingTimer ) { - new Thread("Load KML in Google Earth"){ - @Override - public void run() { - // Only regenerate KML and reload - try { - SwingUtilities.invokeLater( ( ) -> { - if( windowShowingTimer != null ){ - CollectEarthWindow.startWaiting(windowShowingTimer); - } - }); + } - EarthApp.loadKmlInGoogleEarth(true); + private void openFilesImplmentation(Object openFilesEventObject) throws Exception { + Class openFilesEventClass = Class.forName("com.apple.eawt.AppEvent.OpenFilesEvent"); + Method getFilesMethod = openFilesEventClass.getMethod("getFiles"); - } catch (Exception e) { - logger.error("Error loading the KML",e); - EarthApp.showMessage("Problems while generating the KML file:
" + - (e.getCause()!=null?(e.getCause()+"
"):"") + - ( - ( e.getMessage()!=null && e.getMessage().length() > 300 ) ? e.getMessage().substring(0,300) : - ( e.getMessage()!=null ) ? e.getMessage() : "" - ) + ""); //$NON-NLS-1$ - }finally{ - if( windowShowingTimer != null ){ - try { - SwingUtilities.invokeLater( () -> { - CollectEarthWindow.endWaiting(windowShowingTimer); - if( windowShowingTimer instanceof PropertiesDialog ){ - ( (PropertiesDialog) windowShowingTimer).closeDialog(); - } - }); - } catch (Exception e2) { - logger.error("Error closing Options dialog", e2); - } - } - } + List files = (List) getFilesMethod.invoke( openFilesEventClass.cast( openFilesEventObject ) ); + for (File file : files ){ + try { + EarthApp.openProjectFileInRunningCollectEarth(file.getAbsolutePath()); + } catch (IOException e1) { + logger.error("Error opening CEP file " + e1); } - }.start(); - } + } + } + } -} From 5307218f1f93d7cf4b7e91e2f3da9166eef3c17f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:22 +0100 Subject: [PATCH 0999/1620] New translations MacOpenFilesInvocationHandler.java (English) --- .../earth/app/view/Messages_en.properties | 541 ++---------------- 1 file changed, 36 insertions(+), 505 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 0777f46090..1f014d967a 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,534 +1,65 @@ package org.openforis.collect.earth.app.desktop; -import java.awt.Image; -import java.awt.SplashScreen; -import java.awt.Window; -import java.io.BufferedReader; import java.io.File; import java.io.IOException; -import java.io.InputStreamReader; import java.lang.reflect.Method; -import java.lang.reflect.Proxy; -import java.net.MalformedURLException; -import java.net.Socket; -import java.net.URL; -import java.net.URLConnection; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.util.Observer; +import java.util.List; -import javax.swing.ImageIcon; -import javax.swing.JOptionPane; -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.SystemUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.desktop.ServerController.ServerInitializationEvent; -import org.openforis.collect.earth.app.logging.GAlogger; -import org.openforis.collect.earth.app.server.LoadProjectFileServlet; -import org.openforis.collect.earth.app.service.EarthProjectsService; -import org.openforis.collect.earth.app.service.FolderFinder; -import org.openforis.collect.earth.app.service.KmlGeneratorService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.app.service.UpdateIniUtils; -import org.openforis.collect.earth.app.view.CheckForUpdatesListener; -import org.openforis.collect.earth.app.view.CollectEarthWindow; -import org.openforis.collect.earth.app.view.Messages; -import org.openforis.collect.earth.app.view.PropertiesDialog; -import org.openforis.collect.earth.sampler.utils.KmlGenerationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.opencsv.exceptions.CsvValidationException; - -import io.sentry.Sentry; -import io.sentry.protocol.User; - /** - * Contains the main class that starts Collect Earth and opens Google Earth. - * + * Use reflection to be able to add the code specific to Mac OS X without generating compilation errors + * This class generates a Proxy so that an Interface method can be invoked. Sort of implementing an Interface using reflection + * @see How to implement an interface using Reflection * @author Alfonso Sanchez-Paus Diaz * */ -public class EarthApp { - - private static Logger logger; - private static ServerController serverController; - private static EarthApp earthApp; - - private static void closeSplash() { - try { - final SplashScreen splash = SplashScreen.getSplashScreen(); - if (splash != null) { - splash.close(); - } - } catch (final IllegalStateException e) { - logger.error("Error closing the splash window", e); //$NON-NLS-1$ - } - } - - /** - * Start the application, opening Google Earth and starting the Jetty server. - * - * @param args - * No arguments are used by this method. - */ - public static void main(String[] args) { - - try { - - // System property used in the web.xml configuration - System.setProperty("collectEarth.userFolder", FolderFinder.getCollectEarthDataFolder()); //$NON-NLS-1$ - - // Specify a browser as http.agent so that calls to CloudFlare hosted OpenForis.org do not return with a 403 http error - System.setProperty("http.agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2"); - - initializeSentry(); - - // Change of font so that Lao and Thao glyphs are supported - CollectEarthUtils.setFontDependingOnLanguaue( getLocalProperties().getUiLanguage() ); - - logger = LoggerFactory.getLogger(EarthApp.class); - - String doubleClickedProjectFile = null; - - if (args != null && args.length == 1) { - doubleClickedProjectFile = args[0]; - }else if( getProjectsService().getProjectList().size() == 0 ){ - doubleClickedProjectFile = "resources/demo_survey.cep"; - } - - if ( SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX){ - handleMacStartup( doubleClickedProjectFile ); - }else{ - startCollectEarth( doubleClickedProjectFile ); - } - - } catch (final Exception e) { - // The logger factory has not been initialized, this will not work, just output to console - if (logger != null) { - logger.error("The server could not start", e); //$NON-NLS-1$ - } - System.exit(1); - } finally { - closeSplash(); - } - } - - private static void initializeSentry() { - try { - String releaseName= UpdateIniUtils.getReleaseNameInstalled(); - - Sentry.init("https://24dd6a90c1e4461484712db99c3b3bb7:831e42661c5c4ff3aa5eca270db3f619@sentry.io/299626?release="+releaseName+"&maxmessagelength=2000" ); - if( !StringUtils.isEmpty( UpdateIniUtils.getVersionInstalled() ) ) { - Sentry.setTag( "ReleaseDate", UpdateIniUtils.getVersionInstalled() ); - } - if( !StringUtils.isEmpty( getLocalProperties().getOperator() ) ) { - User user = new User(); - user.setUsername( getLocalProperties().getOperator() ); - Sentry.setUser(user); - } - - } catch (Exception e) { - logger.error( "Error initializing Sentry logger" , e); - } - } - /** - * Special code that uses reflection to handle how the application should behave in Mac OS X. - * Without reflection the code provokes compilation-time errors. - * @param doubleClickedProjectFile Project file (CEP) that was clicked - * @throws Exception Throws Exception when the process fails to open the file double-clicked. Initializes the server in any case - */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - public static void handleMacStartup(String doubleClickedProjectFile) throws Exception{ - try { - Class applicationClass = Class.forName("com.apple.eawt.Application"); - Method getApplicationMethod = applicationClass.getMethod("getApplication"); - Method setDockIconImageMethod = applicationClass.getMethod( "setDockIconImage", Image.class ); - - Class openFilesHandlerInterface = Class.forName("com.apple.eawt.OpenFilesHandler"); - Method setOpenFileHandlerMethod = applicationClass.getMethod( "setOpenFileHandler", openFilesHandlerInterface ); - - // SET THE MAC OS X DOCK ICON! - // Get an Application object - Object applicationObject = getApplicationMethod.invoke( null ); - try { - Image dockIconImage = new ImageIcon(new File("images/dockIconMac.png").toURI().toURL()).getImage(); - // Invoke the setDockIconImage on the application object using the dockIconImage as an argument - setDockIconImageMethod.invoke(applicationObject, dockIconImage ); - } catch (MalformedURLException e2) { - logger.error("Problems finding the docker icon", e2); - } - // ------------------------------------------- - - - // DEFINE A LISTENER THAT IS REGISTERED BY THE OS TO HEAR DOUBLE-CLICK EVENTS AND REGISTER ITSELF AS THE CEP OPENER - MacOpenFilesInvocationHandler macOpenFileHandlerProxyInterface = new MacOpenFilesInvocationHandler(); - Object openFilesHandlerImplementation = Proxy.newProxyInstance( - applicationClass.getClassLoader(), - new Class[]{ openFilesHandlerInterface }, - macOpenFileHandlerProxyInterface - ); - - // Call the setOpenFileHandler method of the application object using the - setOpenFileHandlerMethod.invoke(applicationObject, ( openFilesHandlerInterface.cast( openFilesHandlerImplementation ) ) ); - - // Lets wait for the Apple event to arrive. If it did then the earthApp variable will be non-nulls - Thread.sleep(2000); - if( earthApp == null ){ - startCollectEarth( doubleClickedProjectFile ); - } - } catch (Exception e) { - logger.error("Error while defining the double-click behaviour on CEP files in Mac OS X", e); - startCollectEarth( null ); - } - } - - public void generateKml() { - - try { - getKmlGeneratorService().generateKmlFile(); - } catch (final KmlGenerationException e) { - logger.error("Problems while generating the KML file ", e); //$NON-NLS-1$ - showMessage("Problems while generating the KML file:
" + (e.getCause()!=null?(e.getCause()+"
"):"") + ( e.getMessage().length() > 300?e.getMessage().substring(0,300):e.getMessage() ) + ""); //$NON-NLS-1$ - } catch (final Exception e) { - logger.error("Could not generate KML file", e); //$NON-NLS-1$ - showMessage("Error generating KML file :
" + e.getMessage()); //$NON-NLS-1$ - } - } - - public static void openProjectFileInRunningCollectEarth(String doubleClickedProjecFile) throws IOException { - final File projectFile = new File(doubleClickedProjecFile); - - if (projectFile.exists()) { - - String hostAddress = ServerController.getHostAddress( getLocalProperties().getHost(), getLocalProperties().getPort()); - - URL loadProjectFileInRunningCE = new URL(hostAddress + LoadProjectFileServlet.SERVLET_NAME + - "?" + LoadProjectFileServlet.PROJECT_FILE_PARAMETER + "=" + //$NON-NLS-1$ //$NON-NLS-2$ - URLEncoder.encode(doubleClickedProjecFile, StandardCharsets.UTF_8.name() ) ); - URLConnection urlConn = loadProjectFileInRunningCE.openConnection(); - - try( BufferedReader in = new BufferedReader(new InputStreamReader(urlConn.getInputStream())) ){ - String inputLine; - while ((inputLine = in.readLine()) != null) { - logger.info(inputLine); - } - } +public class MacOpenFilesInvocationHandler implements java.lang.reflect.InvocationHandler { - } - } + private final Logger logger = LoggerFactory.getLogger(MacOpenFilesInvocationHandler.class); - private static boolean isAnotherCollectEarthRunning(LocalPropertiesService localProperties) { - boolean alreadyRunning = false; - try { - new Socket( LocalPropertiesService.LOCAL_HOST , Integer.parseInt(localProperties.getPort())).close(); //$NON-NLS-1$ - // If here there is something is serving on port 8028 - // So stop it - logger.warn("There is a server already running {}", localProperties.getPort()); //$NON-NLS-1$ - alreadyRunning = true; - } catch (final IOException e) { - // Nothing there, so OK to proceed - logger.info("There is no server running in port {}", localProperties.getPort()); //$NON-NLS-1$ - alreadyRunning = false; - } catch (final NumberFormatException e) { - // Nothing there, so OK to proceed - logger.info("Error parsing integer value {}", localProperties.getPort()); //$NON-NLS-1$ - alreadyRunning = false; - } - return alreadyRunning; - } - - public static void quitServer() { - try { - serverController.stopServer(); - } catch (Exception e) { - logger.error("Error stoping server", e); //$NON-NLS-1$ - } - } - - /** - * Generates the KML for the project and opens it in Google Earth - * @param forceKmlRecreation Set to true if you want to forece the regeneration of the KML even if is is up to date (you might want to do this to force the update of the placemark icons as the date changes) - * @throws IOException Throws exception if the KMl file cannot be generated - * @throws KmlGenerationException Throws exception if the KML file contents cannot be generated - * @throws CsvValidationException - */ - private static synchronized void loadKmlInGoogleEarth(boolean forceKmlRecreation) throws IOException, KmlGenerationException, CsvValidationException { - earthApp.getKmlGeneratorService().generatePlacemarksKmzFile( forceKmlRecreation ); - earthApp.simulateClickKmz(); - } - - public static void restart() { - try { - - serverController.stopServer(); - startServer(null); - - } catch (final Exception e) { - logger.error("Error while stopping server", e); //$NON-NLS-1$ - } - } - - private static LocalPropertiesService nonManagedPropertiesService; - - - private static LocalPropertiesService getLocalProperties() { - if (serverController == null || serverController.getContext() == null) { - if (nonManagedPropertiesService == null) { - nonManagedPropertiesService = new LocalPropertiesService(); - } - return nonManagedPropertiesService; - } else { - return serverController.getContext().getBean(LocalPropertiesService.class); - } - } - - private static EarthProjectsService getProjectsService() { - if (serverController != null) { - return serverController.getContext().getBean(EarthProjectsService.class); - } else { - final EarthProjectsService earthProjectsService = new EarthProjectsService(); - earthProjectsService.init(getLocalProperties()); - return earthProjectsService; - } - } - - - private KmlGeneratorService getKmlGeneratorService() { - if (serverController != null) { - return serverController.getContext().getBean(KmlGeneratorService.class); - } else { - throw new IllegalStateException("The server must be initialized before this method is called"); //$NON-NLS-1$ - } - } - - private static void startCollectEarth(final String doubleClickedProjectFile) throws Exception { - logger.info("START - Server Initilization"); //$NON-NLS-1$ - final boolean ceAlreadyOpen = isAnotherCollectEarthRunning( getLocalProperties()); - - if( ceAlreadyOpen ){ - closeSplash(); - // If the user double clicked on a project file while Collect Earth is running then load the project in the running Collect Earth - if (doubleClickedProjectFile!=null) { - openProjectFileInRunningCollectEarth(doubleClickedProjectFile); - }else{ - showMessage(Messages.getString("EarthApp.11")); //$NON-NLS-1$ - } - }else{ - - startServer(doubleClickedProjectFile); - } - - GAlogger.logGAnalytics("Start"); - } - - public static void startServer(final String doubleClickedProjectFile) - throws Exception { - earthApp = new EarthApp(); - - // Load the double-clicked CEP file before the survey manager is instantiated by the server start-up - earthApp.loadProjectIfDoubleClicked(doubleClickedProjectFile); - - - final Observer observeInitialization = getServerObserver(); - serverStartAndOpenGe(observeInitialization); - } - - private static Observer getServerObserver() { - return (observable, initializationEvent) ->{ - if (initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT)) { - serverController = null; - } - - if( initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT) || - initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT) ){ - - showMessage( initializationEvent.toString()); - } - - if (!initializationEvent.equals(ServerInitializationEvent.SERVER_STOPPED_EVENT)) { - try { - earthApp.generateKml(); - earthApp.simulateClickKmz(); - earthApp.checkForUpdates(); - closeSplash(); - } catch (final Exception e) { - logger.error("Error generating KML file", e); //$NON-NLS-1$ - } - } - }; - } - - private void openKmlOnGoogleEarth(){ - if (! CollectEarthUtils.openFile( new File(KmlGeneratorService.KML_NETWORK_LINK_STARTER)) ) { - showMessage("The KML file cannot be open at " + KmlGeneratorService.KML_NETWORK_LINK_STARTER); //$NON-NLS-1$ - } - } - - private void checkForUpdates() { - new Thread("Check for new Collect Earth versions on the server") { - @Override - public void run() { - - // Wait a few seconds before checking for updates - try { - Thread.sleep(10000); - } catch (InterruptedException e1) { - logger.error("Error while waiting", e1); //$NON-NLS-1$ - } - - final UpdateIniUtils updateIniUtils = new UpdateIniUtils(); - - - if (updateIniUtils.shouldWarnUser(getLocalProperties() )) { - - javax.swing.SwingUtilities.invokeLater( () -> { - String remindLater = Messages.getString("EarthApp.3"); //$NON-NLS-1$ - String doItNow = Messages.getString("EarthApp.4"); //$NON-NLS-1$ - String doNotBother = Messages.getString("EarthApp.5"); //$NON-NLS-1$ - - String newestVersionOnline = updateIniUtils.getVersionAvailableOnline(); - - if( StringUtils.isNotBlank( newestVersionOnline ) ) { - - Object[] possibleValues = { remindLater, doItNow, doNotBother }; - int chosenOption = JOptionPane.showOptionDialog(null, - Messages.getString("EarthApp.57"), Messages.getString("EarthApp.58") + Messages.getString("EarthApp.6") + updateIniUtils.convertToDate(newestVersionOnline), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, possibleValues, possibleValues[0]); - if( chosenOption != JOptionPane.CLOSED_OPTION ){ - if (possibleValues[chosenOption].equals(doItNow)) { - CheckForUpdatesListener checkForUpdatesListener = new CheckForUpdatesListener(); - checkForUpdatesListener.actionPerformed(null); - } else if (possibleValues[chosenOption].equals(doNotBother)) { - getLocalProperties().setValue(EarthProperty.LAST_IGNORED_UPDATE, newestVersionOnline); - } - } - } - }); - } - } - }.start(); - - } - - - /** - * If Collect Earth is started by double clicking on a ".cep" file ( Collect Earth Project file ) - * Then it should open directly with that project in focus - * - * @param doubleClickedProjecFile - * The path to the CEP file that was double-clicked - * - */ - private void loadProjectIfDoubleClicked(String doubleClickedProjectFile) { - try { - if (doubleClickedProjectFile != null) { - - final File projectFile = new File(doubleClickedProjectFile); - - if (projectFile.exists()) { - getProjectsService().loadCompressedProjectFile(projectFile); - } - } - } catch (final Exception e) { - showMessage(Messages.getString("EarthApp.59")); //$NON-NLS-1$ - logger.error(Messages.getString("EarthApp.59"), e);//$NON-NLS-1$ - } - } + public MacOpenFilesInvocationHandler() { + super(); + } - private static void serverStartAndOpenGe(Observer observeInitialization) throws Exception { - serverController = new ServerController(); - serverController.deleteObservers(); - serverController.startServer(observeInitialization); + public Object invoke(Object proxy, Method m, Object[] args) throws Throwable - // Inform Mac OS users of the issues about opening CEP files in the Mac version of CE - if(SystemUtils.IS_OS_MAC_OSX ) { - showMessage( - "" //$NON-NLS-1$ - + "" //$NON-NLS-1$ - + Messages.getString("EarthApp.70") - + ": " //$NON-NLS-1$ - + Messages.getString("EarthApp.71") - + Messages.getString("EarthApp.72") - + "" //$NON-NLS-1$ - + Messages.getString("CollectEarthWindow.10") - + " -> " //$NON-NLS-1$ - + Messages.getString("CollectEarthMenu.0") - + "", //$NON-NLS-1$ - Messages.getString("EarthApp.73") - ); - } - } + { - public static void showMessage(String message) { - showMessage(message, "Collect Earth"); + Object result = null; - } + try { - public static void showMessage(String message, String title) { - try { - SwingUtilities.invokeLater( - () -> JOptionPane.showMessageDialog(null, message, title, JOptionPane.WARNING_MESSAGE) - ); - } catch (Exception e) { - logger.error("Error showing message",e); - } + // if the method name equals some method's name then call your method + if ( m!= null && m.getName().equals("openFiles") && args !=null && args.length>0) { + openFilesImplmentation(args[0]); + } - } + } catch (Exception e) { + logger.error(" Error while interpreting invocation " , e ); + } finally { + logger.info("end method {}", m!=null?m.getName():"Unknown method"); + } - private void simulateClickKmz() { - try { - getKmlGeneratorService().generateLoaderKmlFile(); - openKmlOnGoogleEarth(); - } catch (final Exception e) { - showMessage(Messages.getString("EarthApp.61")); //$NON-NLS-1$ - logger.error("The KMZ file could not be found", e); //$NON-NLS-1$ - } - } + return result; - public static void executeKmlLoadAsynchronously( Window windowShowingTimer ) { - new Thread("Load KML in Google Earth"){ - @Override - public void run() { - // Only regenerate KML and reload - try { - SwingUtilities.invokeLater( ( ) -> { - if( windowShowingTimer != null ){ - CollectEarthWindow.startWaiting(windowShowingTimer); - } - }); + } - EarthApp.loadKmlInGoogleEarth(true); + private void openFilesImplmentation(Object openFilesEventObject) throws Exception { + Class openFilesEventClass = Class.forName("com.apple.eawt.AppEvent.OpenFilesEvent"); + Method getFilesMethod = openFilesEventClass.getMethod("getFiles"); - } catch (Exception e) { - logger.error("Error loading the KML",e); - EarthApp.showMessage("Problems while generating the KML file:
" + - (e.getCause()!=null?(e.getCause()+"
"):"") + - ( - ( e.getMessage()!=null && e.getMessage().length() > 300 ) ? e.getMessage().substring(0,300) : - ( e.getMessage()!=null ) ? e.getMessage() : "" - ) + ""); //$NON-NLS-1$ - }finally{ - if( windowShowingTimer != null ){ - try { - SwingUtilities.invokeLater( () -> { - CollectEarthWindow.endWaiting(windowShowingTimer); - if( windowShowingTimer instanceof PropertiesDialog ){ - ( (PropertiesDialog) windowShowingTimer).closeDialog(); - } - }); - } catch (Exception e2) { - logger.error("Error closing Options dialog", e2); - } - } - } + List files = (List) getFilesMethod.invoke( openFilesEventClass.cast( openFilesEventObject ) ); + for (File file : files ){ + try { + EarthApp.openProjectFileInRunningCollectEarth(file.getAbsolutePath()); + } catch (IOException e1) { + logger.error("Error opening CEP file " + e1); } - }.start(); - } + } + } + } -} From 00f76aa623518bd2ef0460c798947be5c8d81bb2 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:23 +0100 Subject: [PATCH 1000/1620] New translations JSwingAppender.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 558 ++---------------- 1 file changed, 59 insertions(+), 499 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 0777f46090..9f9883c25f 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,534 +1,94 @@ -package org.openforis.collect.earth.app.desktop; +package org.openforis.collect.earth.app.logging; -import java.awt.Image; -import java.awt.SplashScreen; -import java.awt.Window; -import java.io.BufferedReader; -import java.io.File; -import java.io.IOException; -import java.io.InputStreamReader; -import java.lang.reflect.Method; -import java.lang.reflect.Proxy; -import java.net.MalformedURLException; -import java.net.Socket; -import java.net.URL; -import java.net.URLConnection; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.util.Observer; +import java.awt.Dimension; -import javax.swing.ImageIcon; +import javax.swing.JEditorPane; import javax.swing.JOptionPane; +import javax.swing.JScrollPane; import javax.swing.SwingUtilities; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.SystemUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.desktop.ServerController.ServerInitializationEvent; -import org.openforis.collect.earth.app.logging.GAlogger; -import org.openforis.collect.earth.app.server.LoadProjectFileServlet; -import org.openforis.collect.earth.app.service.EarthProjectsService; -import org.openforis.collect.earth.app.service.FolderFinder; -import org.openforis.collect.earth.app.service.KmlGeneratorService; +import org.apache.logging.log4j.core.Filter; +import org.apache.logging.log4j.core.Layout; +import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.core.appender.AbstractAppender; +import org.apache.logging.log4j.core.config.Property; +import org.apache.logging.log4j.core.config.plugins.Plugin; +import org.apache.logging.log4j.core.config.plugins.PluginAttribute; +import org.apache.logging.log4j.core.config.plugins.PluginElement; +import org.apache.logging.log4j.core.config.plugins.PluginFactory; +import org.apache.logging.log4j.core.layout.PatternLayout; import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.app.service.UpdateIniUtils; -import org.openforis.collect.earth.app.view.CheckForUpdatesListener; -import org.openforis.collect.earth.app.view.CollectEarthWindow; -import org.openforis.collect.earth.app.view.Messages; -import org.openforis.collect.earth.app.view.PropertiesDialog; -import org.openforis.collect.earth.sampler.utils.KmlGenerationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.opencsv.exceptions.CsvValidationException; +@Plugin(name = "JSwingAppender", category = "Core", elementType = "appender", printObject = true) +public class JSwingAppender extends AbstractAppender { -import io.sentry.Sentry; -import io.sentry.protocol.User; + private Boolean showException; -/** - * Contains the main class that starts Collect Earth and opens Google Earth. - * - * @author Alfonso Sanchez-Paus Diaz - * - */ -public class EarthApp { + private Logger logger = LoggerFactory.getLogger( JSwingAppender.class ); - private static Logger logger; - private static ServerController serverController; - private static EarthApp earthApp; - - private static void closeSplash() { - try { - final SplashScreen splash = SplashScreen.getSplashScreen(); - if (splash != null) { - splash.close(); - } - } catch (final IllegalStateException e) { - logger.error("Error closing the splash window", e); //$NON-NLS-1$ - } + public JSwingAppender(String name, Filter filter, Layout layout, boolean ignoreExceptions, Property[] properties) { + super(name, filter, layout, ignoreExceptions, properties); } - /** - * Start the application, opening Google Earth and starting the Jetty server. - * - * @param args - * No arguments are used by this method. - */ - public static void main(String[] args) { - - try { - - // System property used in the web.xml configuration - System.setProperty("collectEarth.userFolder", FolderFinder.getCollectEarthDataFolder()); //$NON-NLS-1$ - - // Specify a browser as http.agent so that calls to CloudFlare hosted OpenForis.org do not return with a 403 http error - System.setProperty("http.agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2"); - - initializeSentry(); + @PluginFactory + public static JSwingAppender createAppender(@PluginAttribute("name") String name, + @PluginElement("Layout") Layout layout, @PluginElement("Filters") Filter filter, + @PluginAttribute("ignoreExceptions") boolean ignoreExceptions) { - // Change of font so that Lao and Thao glyphs are supported - CollectEarthUtils.setFontDependingOnLanguaue( getLocalProperties().getUiLanguage() ); - - logger = LoggerFactory.getLogger(EarthApp.class); - - String doubleClickedProjectFile = null; - - if (args != null && args.length == 1) { - doubleClickedProjectFile = args[0]; - }else if( getProjectsService().getProjectList().size() == 0 ){ - doubleClickedProjectFile = "resources/demo_survey.cep"; - } - - if ( SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX){ - handleMacStartup( doubleClickedProjectFile ); - }else{ - startCollectEarth( doubleClickedProjectFile ); - } - - } catch (final Exception e) { - // The logger factory has not been initialized, this will not work, just output to console - if (logger != null) { - logger.error("The server could not start", e); //$NON-NLS-1$ - } - System.exit(1); - } finally { - closeSplash(); + if (name == null) { + LoggerFactory.getLogger( JSwingAppender.class ).error("No name provided for JTextAreaAppender"); + return null; } - } - private static void initializeSentry() { - try { - String releaseName= UpdateIniUtils.getReleaseNameInstalled(); - - Sentry.init("https://24dd6a90c1e4461484712db99c3b3bb7:831e42661c5c4ff3aa5eca270db3f619@sentry.io/299626?release="+releaseName+"&maxmessagelength=2000" ); - if( !StringUtils.isEmpty( UpdateIniUtils.getVersionInstalled() ) ) { - Sentry.setTag( "ReleaseDate", UpdateIniUtils.getVersionInstalled() ); - } - if( !StringUtils.isEmpty( getLocalProperties().getOperator() ) ) { - User user = new User(); - user.setUsername( getLocalProperties().getOperator() ); - Sentry.setUser(user); - } - - } catch (Exception e) { - logger.error( "Error initializing Sentry logger" , e); + if (layout == null) { + layout = PatternLayout.createDefaultLayout(); } + return new JSwingAppender(name, filter, layout, ignoreExceptions, Property.EMPTY_ARRAY); } - /** - * Special code that uses reflection to handle how the application should behave in Mac OS X. - * Without reflection the code provokes compilation-time errors. - * @param doubleClickedProjectFile Project file (CEP) that was clicked - * @throws Exception Throws Exception when the process fails to open the file double-clicked. Initializes the server in any case - */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - public static void handleMacStartup(String doubleClickedProjectFile) throws Exception{ - try { - Class applicationClass = Class.forName("com.apple.eawt.Application"); - Method getApplicationMethod = applicationClass.getMethod("getApplication"); - Method setDockIconImageMethod = applicationClass.getMethod( "setDockIconImage", Image.class ); - - Class openFilesHandlerInterface = Class.forName("com.apple.eawt.OpenFilesHandler"); - Method setOpenFileHandlerMethod = applicationClass.getMethod( "setOpenFileHandler", openFilesHandlerInterface ); - - // SET THE MAC OS X DOCK ICON! - // Get an Application object - Object applicationObject = getApplicationMethod.invoke( null ); - try { - Image dockIconImage = new ImageIcon(new File("images/dockIconMac.png").toURI().toURL()).getImage(); - // Invoke the setDockIconImage on the application object using the dockIconImage as an argument - setDockIconImageMethod.invoke(applicationObject, dockIconImage ); - } catch (MalformedURLException e2) { - logger.error("Problems finding the docker icon", e2); - } - // ------------------------------------------- - - - // DEFINE A LISTENER THAT IS REGISTERED BY THE OS TO HEAR DOUBLE-CLICK EVENTS AND REGISTER ITSELF AS THE CEP OPENER - MacOpenFilesInvocationHandler macOpenFileHandlerProxyInterface = new MacOpenFilesInvocationHandler(); - Object openFilesHandlerImplementation = Proxy.newProxyInstance( - applicationClass.getClassLoader(), - new Class[]{ openFilesHandlerInterface }, - macOpenFileHandlerProxyInterface - ); - - // Call the setOpenFileHandler method of the application object using the - setOpenFileHandlerMethod.invoke(applicationObject, ( openFilesHandlerInterface.cast( openFilesHandlerImplementation ) ) ); - - // Lets wait for the Apple event to arrive. If it did then the earthApp variable will be non-nulls - Thread.sleep(2000); - if( earthApp == null ){ - startCollectEarth( doubleClickedProjectFile ); - } - } catch (Exception e) { - logger.error("Error while defining the double-click behaviour on CEP files in Mac OS X", e); - startCollectEarth( null ); - } - } - - public void generateKml() { + @Override + public void append(LogEvent event) { try { - getKmlGeneratorService().generateKmlFile(); - } catch (final KmlGenerationException e) { - logger.error("Problems while generating the KML file ", e); //$NON-NLS-1$ - showMessage("Problems while generating the KML file:
" + (e.getCause()!=null?(e.getCause()+"
"):"") + ( e.getMessage().length() > 300?e.getMessage().substring(0,300):e.getMessage() ) + ""); //$NON-NLS-1$ - } catch (final Exception e) { - logger.error("Could not generate KML file", e); //$NON-NLS-1$ - showMessage("Error generating KML file :
" + e.getMessage()); //$NON-NLS-1$ - } - } - - public static void openProjectFileInRunningCollectEarth(String doubleClickedProjecFile) throws IOException { - final File projectFile = new File(doubleClickedProjecFile); - - if (projectFile.exists()) { - - String hostAddress = ServerController.getHostAddress( getLocalProperties().getHost(), getLocalProperties().getPort()); - - URL loadProjectFileInRunningCE = new URL(hostAddress + LoadProjectFileServlet.SERVLET_NAME + - "?" + LoadProjectFileServlet.PROJECT_FILE_PARAMETER + "=" + //$NON-NLS-1$ //$NON-NLS-2$ - URLEncoder.encode(doubleClickedProjecFile, StandardCharsets.UTF_8.name() ) ); - URLConnection urlConn = loadProjectFileInRunningCE.openConnection(); + if( isExceptionShown() ) { + final String message = new String(this.getLayout().toByteArray(event)).replaceAll("(\r\n|\n)", "
"); - try( BufferedReader in = new BufferedReader(new InputStreamReader(urlConn.getInputStream())) ){ - String inputLine; - while ((inputLine = in.readLine()) != null) { - logger.info(inputLine); - } - } - - } - } - - private static boolean isAnotherCollectEarthRunning(LocalPropertiesService localProperties) { - boolean alreadyRunning = false; - try { - new Socket( LocalPropertiesService.LOCAL_HOST , Integer.parseInt(localProperties.getPort())).close(); //$NON-NLS-1$ - // If here there is something is serving on port 8028 - // So stop it - logger.warn("There is a server already running {}", localProperties.getPort()); //$NON-NLS-1$ - alreadyRunning = true; - } catch (final IOException e) { - // Nothing there, so OK to proceed - logger.info("There is no server running in port {}", localProperties.getPort()); //$NON-NLS-1$ - alreadyRunning = false; - } catch (final NumberFormatException e) { - // Nothing there, so OK to proceed - logger.info("Error parsing integer value {}", localProperties.getPort()); //$NON-NLS-1$ - alreadyRunning = false; - } - return alreadyRunning; - } + // Append formatted message to text area using the Thread. - public static void quitServer() { - try { - serverController.stopServer(); - } catch (Exception e) { - logger.error("Error stoping server", e); //$NON-NLS-1$ - } - } - - /** - * Generates the KML for the project and opens it in Google Earth - * @param forceKmlRecreation Set to true if you want to forece the regeneration of the KML even if is is up to date (you might want to do this to force the update of the placemark icons as the date changes) - * @throws IOException Throws exception if the KMl file cannot be generated - * @throws KmlGenerationException Throws exception if the KML file contents cannot be generated - * @throws CsvValidationException - */ - private static synchronized void loadKmlInGoogleEarth(boolean forceKmlRecreation) throws IOException, KmlGenerationException, CsvValidationException { - earthApp.getKmlGeneratorService().generatePlacemarksKmzFile( forceKmlRecreation ); - earthApp.simulateClickKmz(); - } - - public static void restart() { - try { - - serverController.stopServer(); - startServer(null); - - } catch (final Exception e) { - logger.error("Error while stopping server", e); //$NON-NLS-1$ - } - } - - private static LocalPropertiesService nonManagedPropertiesService; - - - private static LocalPropertiesService getLocalProperties() { - if (serverController == null || serverController.getContext() == null) { - if (nonManagedPropertiesService == null) { - nonManagedPropertiesService = new LocalPropertiesService(); - } - return nonManagedPropertiesService; - } else { - return serverController.getContext().getBean(LocalPropertiesService.class); - } - } - - private static EarthProjectsService getProjectsService() { - if (serverController != null) { - return serverController.getContext().getBean(EarthProjectsService.class); - } else { - final EarthProjectsService earthProjectsService = new EarthProjectsService(); - earthProjectsService.init(getLocalProperties()); - return earthProjectsService; - } - } - - - private KmlGeneratorService getKmlGeneratorService() { - if (serverController != null) { - return serverController.getContext().getBean(KmlGeneratorService.class); - } else { - throw new IllegalStateException("The server must be initialized before this method is called"); //$NON-NLS-1$ - } - } - - private static void startCollectEarth(final String doubleClickedProjectFile) throws Exception { - logger.info("START - Server Initilization"); //$NON-NLS-1$ - final boolean ceAlreadyOpen = isAnotherCollectEarthRunning( getLocalProperties()); - - if( ceAlreadyOpen ){ - closeSplash(); - // If the user double clicked on a project file while Collect Earth is running then load the project in the running Collect Earth - if (doubleClickedProjectFile!=null) { - openProjectFileInRunningCollectEarth(doubleClickedProjectFile); - }else{ - showMessage(Messages.getString("EarthApp.11")); //$NON-NLS-1$ - } - }else{ - - startServer(doubleClickedProjectFile); - } - - GAlogger.logGAnalytics("Start"); - } - - public static void startServer(final String doubleClickedProjectFile) - throws Exception { - earthApp = new EarthApp(); - - // Load the double-clicked CEP file before the survey manager is instantiated by the server start-up - earthApp.loadProjectIfDoubleClicked(doubleClickedProjectFile); - - - final Observer observeInitialization = getServerObserver(); - serverStartAndOpenGe(observeInitialization); - } - - private static Observer getServerObserver() { - return (observable, initializationEvent) ->{ - if (initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT)) { - serverController = null; - } - - if( initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT) || - initializationEvent.equals(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT) ){ - - showMessage( initializationEvent.toString()); - } - - if (!initializationEvent.equals(ServerInitializationEvent.SERVER_STOPPED_EVENT)) { + SwingUtilities.invokeLater( () -> { try { - earthApp.generateKml(); - earthApp.simulateClickKmz(); - earthApp.checkForUpdates(); - closeSplash(); - } catch (final Exception e) { - logger.error("Error generating KML file", e); //$NON-NLS-1$ + JEditorPane web = new JEditorPane(); + web.setEditable(false); + web.setContentType("text/html"); + web.setText(message); + + JScrollPane scrollPane = new JScrollPane(web); + scrollPane.setPreferredSize(new Dimension(450, 350)); + + JOptionPane.showMessageDialog(null, scrollPane, "Error has been loogged", JOptionPane.ERROR_MESSAGE); + }catch (Exception e) { + // Avoid creating an infinite loop by catching this exception and not logging it as error + logger.debug("Error shown exception", e); } - } - }; - } - - private void openKmlOnGoogleEarth(){ - if (! CollectEarthUtils.openFile( new File(KmlGeneratorService.KML_NETWORK_LINK_STARTER)) ) { - showMessage("The KML file cannot be open at " + KmlGeneratorService.KML_NETWORK_LINK_STARTER); //$NON-NLS-1$ - } - } - - private void checkForUpdates() { - new Thread("Check for new Collect Earth versions on the server") { - @Override - public void run() { - - // Wait a few seconds before checking for updates - try { - Thread.sleep(10000); - } catch (InterruptedException e1) { - logger.error("Error while waiting", e1); //$NON-NLS-1$ - } - - final UpdateIniUtils updateIniUtils = new UpdateIniUtils(); - - - if (updateIniUtils.shouldWarnUser(getLocalProperties() )) { - - javax.swing.SwingUtilities.invokeLater( () -> { - String remindLater = Messages.getString("EarthApp.3"); //$NON-NLS-1$ - String doItNow = Messages.getString("EarthApp.4"); //$NON-NLS-1$ - String doNotBother = Messages.getString("EarthApp.5"); //$NON-NLS-1$ - - String newestVersionOnline = updateIniUtils.getVersionAvailableOnline(); - - if( StringUtils.isNotBlank( newestVersionOnline ) ) { - - Object[] possibleValues = { remindLater, doItNow, doNotBother }; - int chosenOption = JOptionPane.showOptionDialog(null, - Messages.getString("EarthApp.57"), Messages.getString("EarthApp.58") + Messages.getString("EarthApp.6") + updateIniUtils.convertToDate(newestVersionOnline), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, possibleValues, possibleValues[0]); - if( chosenOption != JOptionPane.CLOSED_OPTION ){ - if (possibleValues[chosenOption].equals(doItNow)) { - CheckForUpdatesListener checkForUpdatesListener = new CheckForUpdatesListener(); - checkForUpdatesListener.actionPerformed(null); - } else if (possibleValues[chosenOption].equals(doNotBother)) { - getLocalProperties().setValue(EarthProperty.LAST_IGNORED_UPDATE, newestVersionOnline); - } - } - } - }); - } - } - }.start(); - - } - - - /** - * If Collect Earth is started by double clicking on a ".cep" file ( Collect Earth Project file ) - * Then it should open directly with that project in focus - * - * @param doubleClickedProjecFile - * The path to the CEP file that was double-clicked - * - */ - private void loadProjectIfDoubleClicked(String doubleClickedProjectFile) { - try { - if (doubleClickedProjectFile != null) { - - final File projectFile = new File(doubleClickedProjectFile); - - if (projectFile.exists()) { - getProjectsService().loadCompressedProjectFile(projectFile); - } + } ); } } catch (final Exception e) { - showMessage(Messages.getString("EarthApp.59")); //$NON-NLS-1$ - logger.error(Messages.getString("EarthApp.59"), e);//$NON-NLS-1$ + // ignore case when the platform hasn't yet been initialized + logger.debug("Error shown exception", e); } - } - - private static void serverStartAndOpenGe(Observer observeInitialization) throws Exception { - serverController = new ServerController(); - serverController.deleteObservers(); - serverController.startServer(observeInitialization); - // Inform Mac OS users of the issues about opening CEP files in the Mac version of CE - if(SystemUtils.IS_OS_MAC_OSX ) { - showMessage( - "" //$NON-NLS-1$ - + "" //$NON-NLS-1$ - + Messages.getString("EarthApp.70") - + ": " //$NON-NLS-1$ - + Messages.getString("EarthApp.71") - + Messages.getString("EarthApp.72") - + "" //$NON-NLS-1$ - + Messages.getString("CollectEarthWindow.10") - + " -> " //$NON-NLS-1$ - + Messages.getString("CollectEarthMenu.0") - + "", //$NON-NLS-1$ - Messages.getString("EarthApp.73") - ); - } } - public static void showMessage(String message) { - showMessage(message, "Collect Earth"); - - } - - public static void showMessage(String message, String title) { - try { - SwingUtilities.invokeLater( - () -> JOptionPane.showMessageDialog(null, message, title, JOptionPane.WARNING_MESSAGE) - ); - } catch (Exception e) { - logger.error("Error showing message",e); - } - - } - - private void simulateClickKmz() { - try { - getKmlGeneratorService().generateLoaderKmlFile(); - openKmlOnGoogleEarth(); - } catch (final Exception e) { - showMessage(Messages.getString("EarthApp.61")); //$NON-NLS-1$ - logger.error("The KMZ file could not be found", e); //$NON-NLS-1$ + private boolean isExceptionShown() { + if( showException == null ) { + LocalPropertiesService localPropertiesService = new LocalPropertiesService(); + showException = localPropertiesService.isExceptionShown(); } + return showException; } - public static void executeKmlLoadAsynchronously( Window windowShowingTimer ) { - new Thread("Load KML in Google Earth"){ - @Override - public void run() { - // Only regenerate KML and reload - try { - SwingUtilities.invokeLater( ( ) -> { - if( windowShowingTimer != null ){ - CollectEarthWindow.startWaiting(windowShowingTimer); - } - }); - - EarthApp.loadKmlInGoogleEarth(true); - - } catch (Exception e) { - logger.error("Error loading the KML",e); - EarthApp.showMessage("Problems while generating the KML file:
" + - (e.getCause()!=null?(e.getCause()+"
"):"") + - ( - ( e.getMessage()!=null && e.getMessage().length() > 300 ) ? e.getMessage().substring(0,300) : - ( e.getMessage()!=null ) ? e.getMessage() : "" - ) + ""); //$NON-NLS-1$ - }finally{ - if( windowShowingTimer != null ){ - try { - SwingUtilities.invokeLater( () -> { - CollectEarthWindow.endWaiting(windowShowingTimer); - if( windowShowingTimer instanceof PropertiesDialog ){ - ( (PropertiesDialog) windowShowingTimer).closeDialog(); - } - }); - } catch (Exception e2) { - logger.error("Error closing Options dialog", e2); - } - } - } - - } - }.start(); + public void setExceptionShown(Boolean showException) { + this.showException = showException; } - - -} +} \ No newline at end of file From 45d63f923629772e4497420037bd77c5e2ce7c32 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:25 +0100 Subject: [PATCH 1001/1620] New translations ServerController.java (French) --- .../earth/app/view/Messages_fr.properties | 300 +++++++++++++++--- 1 file changed, 263 insertions(+), 37 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 1f014d967a..5b52f161d0 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -2,64 +2,290 @@ package org.openforis.collect.earth.app.desktop; import java.io.File; import java.io.IOException; -import java.lang.reflect.Method; -import java.util.List; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.Statement; +import java.util.Map; +import java.util.Observable; +import java.util.Observer; +import org.eclipse.jetty.server.Connector; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.ServerConnector; +import org.eclipse.jetty.util.thread.ExecutorThreadPool; +import org.eclipse.jetty.webapp.WebAppContext; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; +import org.openforis.collect.earth.app.service.BrowserService; +import org.openforis.collect.earth.app.service.FolderFinder; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.BeanCreationException; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.context.support.WebApplicationContextUtils; + +import freemarker.template.TemplateException; /** - * Use reflection to be able to add the code specific to Mac OS X without generating compilation errors - * This class generates a Proxy so that an Interface method can be invoked. Sort of implementing an Interface using reflection - * @see How to implement an interface using Reflection + * Controls the Jetty server, starting and stopping it as well as reporting its staus. + * * @author Alfonso Sanchez-Paus Diaz * */ -public class MacOpenFilesInvocationHandler implements java.lang.reflect.InvocationHandler { +public class ServerController extends Observable { + + private static final String EARTH_SUBDOMAIN = "earth"; //$NON-NLS-1$ + + + public static final String SAIKU_RDB_SUFFIX = "Saiku"; //$NON-NLS-1$ + public static final String IPCC_RDB_SUFFIX = "Ipcc"; //$NON-NLS-1$ + + // Make sure that the default ports are the same for Server and Generator + private static final String DEFAULT_PORT = "80"; //$NON-NLS-1$ + + public enum ServerInitializationEvent{ + SERVER_STOPPED_EVENT("The Server has stopped"), + SERVER_STARTED_EVENT("The server started without problems"), + SERVER_STARTED_NO_DB_CONNECTION_EVENT("Collect Earth could not start due to a DB connection issue"), + SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT( "Collect Earth started but the PostgreSQL DB could not be reached (SQLite used instead until problems are fixed)"); + + private String message; + + private ServerInitializationEvent(String message) { + this.message = message; + } + + @Override + public String toString() { + return message; + } + + } + + private Server server; + private final Logger logger = LoggerFactory.getLogger(ServerController.class); + private WebAppContext root; + static LocalPropertiesService localPropertiesService; + + public WebApplicationContext getContext() { + WebApplicationContext webApplicationContext = null; + try { + webApplicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(getRoot().getServletContext()); + } catch (Exception e) { + logger.error("Error getting web application context", e); //$NON-NLS-1$ + } + return webApplicationContext; + } + + private static String getDbURL(final CollectDBDriver collectDBDriver) { + // jdbc:postgresql://hostname:port/dbname + + String url = collectDBDriver.getUrl(); + url = url.replace("REPLACE_HOSTNAME", localPropertiesService.getValue(EarthProperty.DB_HOST)); //$NON-NLS-1$ + url = url.replace("REPLACE_PORT", localPropertiesService.getValue(EarthProperty.DB_PORT)); //$NON-NLS-1$ + url = url.replace("REPLACE_DBNAME", localPropertiesService.getValue(EarthProperty.DB_NAME)); //$NON-NLS-1$ + return url; + } + + private int getPort() { + + String webPort = localPropertiesService.getLocalPort(); + if (webPort == null || webPort.isEmpty()) { + webPort = DEFAULT_PORT; + } + return Integer.parseInt(webPort); + } + + private WebAppContext getRoot() { + return root; + } + + private void setRoot(WebAppContext root) { + this.root = root; + } + + private boolean initilizeDataSources() throws IOException, TemplateException { + + CollectDBDriver collectDBDriver = localPropertiesService.getCollectDBDriver(); + boolean isConnectionTypeSwitched = false; + if(localPropertiesService.isUsingPostgreSqlDB() && !isPostgreSQLReachable(collectDBDriver) ){ + + logger.warn("Impossible to reach the PostgreSQL server at " + getDbURL(CollectDBDriver.POSTGRESQL)); + logger.warn("Using the SQLite version until fixed!"); + logger.error("Impossible to reach the PostgreSQL server at " + getDbURL(CollectDBDriver.POSTGRESQL) + " using SQLite version"); + collectDBDriver = CollectDBDriver.SQLITE; + isConnectionTypeSwitched = true; + } + + final File jettyAppCtxTemplateSrc = new File("resources/applicationContext.fmt"); //$NON-NLS-1$ + final File jettyAppCtxDst = new File(EarthConstants.GENERATED_FOLDER + "/applicationContext.xml"); //$NON-NLS-1$ + + jettyAppCtxDst.getParentFile().mkdirs(); + + final Map data = new java.util.HashMap<>(); - private final Logger logger = LoggerFactory.getLogger(MacOpenFilesInvocationHandler.class); + data.put("driver", collectDBDriver.getDriverClass()); //$NON-NLS-1$ + data.put("url", getDbURL(collectDBDriver)); //$NON-NLS-1$ + data.put("urlSaiku", getSaikuDbURL(collectDBDriver)); //$NON-NLS-1$ + data.put("urlIpcc", getIpccDbURL(collectDBDriver)); //$NON-NLS-1$ + data.put("username", localPropertiesService.getValue(EarthProperty.DB_USERNAME)); //$NON-NLS-1$ + data.put("password", localPropertiesService.getValue(EarthProperty.DB_PASSWORD)); //$NON-NLS-1$ + data.put("collectEarthExecutionFolder", System.getProperty("user.dir") + File.separator); //$NON-NLS-1$ //$NON-NLS-2$ - public MacOpenFilesInvocationHandler() { - super(); - } + FreemarkerTemplateUtils.applyTemplate(jettyAppCtxTemplateSrc, jettyAppCtxDst, data); - public Object invoke(Object proxy, Method m, Object[] args) throws Throwable - { + return isConnectionTypeSwitched; - Object result = null; + } - try { + private boolean isPostgreSQLReachable(CollectDBDriver collectDBDriver) { + boolean connectionWorked = false; + try ( Connection connection = DriverManager.getConnection( + getDbURL(collectDBDriver), + localPropertiesService.getValue(EarthProperty.DB_USERNAME), + localPropertiesService.getValue(EarthProperty.DB_PASSWORD) + ) ){ + String query="select version()"; + try( Statement s = connection.createStatement() ){ + try( ResultSet rs=s.executeQuery(query) ){ + while(rs.next()) + { + logger.debug( "It works, there are " + rs.getString(1) + " rows on the ofc_record table"); + } + connectionWorked = true; + } + } + } + catch(Exception e){ + logger.error("Error while testing the connection to the postgresSQL DB", e); + } + + return connectionWorked; + + } + + public static String getSaikuDbURL(CollectDBDriver collectDBDriver) { + String urlSaikuDB = getDbURL(collectDBDriver); + + if (localPropertiesService.isUsingSqliteDB()) { + urlSaikuDB += EarthConstants.SAIKU_RDB_SUFFIX; + } + return urlSaikuDB; + } + + public static String getIpccDbURL(CollectDBDriver collectDBDriver) { + String urlIpccDB = getDbURL(collectDBDriver); + + if (localPropertiesService.isUsingSqliteDB()) { + urlIpccDB += IPCC_RDB_SUFFIX; + } + return urlIpccDB; + } + + public void startServer(Observer observeInitialization) throws Exception { + + localPropertiesService = new LocalPropertiesService(); + + this.addObserver(observeInitialization); + + boolean postgresConnectionSwitchedtoSqlite = initilizeDataSources(); + try { + + final String webappDirLocation = FolderFinder.getCollectEarthDataFolder(); + + // The port that we should run on can be set into an environment variable + // Look for that variable and default to 8080 if it isn't there. - // if the method name equals some method's name then call your method - if ( m!= null && m.getName().equals("openFiles") && args !=null && args.length>0) { - openFilesImplmentation(args[0]); - } + // For log4j 1.2 --> Moving to Log4J2 + //PropertyConfigurator.configure(this.getClass().getResource("/WEB-INF/conf/log4j.properties")); - } catch (Exception e) { - logger.error(" Error while interpreting invocation " , e ); - } finally { - logger.info("end method {}", m!=null?m.getName():"Unknown method"); - } + //server = new Server(new ExecutorThreadPool(10, 50, 5, TimeUnit.SECONDS)); // For JEtty 7 + //server = new Server(new ExecutorThreadPool(50, 50, 5, TimeUnit.MILLISECONDS) ); // For JEtty 9, different parameters for the constructor + server = new Server(new ExecutorThreadPool() ); // For JEtty 9.4, different parameters for the constructor + + // // Use blocking-IO connector to improve throughput + final ServerConnector connector = new ServerConnector(server); + connector.setName( LocalPropertiesService.LOCAL_HOST + ":" + getPort()); //$NON-NLS-1$ + connector.setHost("0.0.0.0"); //$NON-NLS-1$ + //connector.setHost( LocalPropertiesService.LOCAL_HOST ); + + connector.setPort(getPort()); + + connector.setStopTimeout(1000); + + server.setConnectors(new Connector[] { connector }); + + WebAppContext wweAppContext = new WebAppContext(); + setRoot(wweAppContext); + + getRoot().setContextPath("/" + EARTH_SUBDOMAIN); //$NON-NLS-1$ + + getRoot().setDescriptor(this.getClass().getResource("/WEB-INF/web.xml").toURI().toString()); //$NON-NLS-1$ + + getRoot().setResourceBase(webappDirLocation); + + // Parent loader priority is a class loader setting that Jetty accepts. + // By default Jetty will behave like most web containers in that it will + // allow your application to replace non-server libraries that are part of the container. + // Setting parent loader priority to true changes this behaviour. + // Read more here: + // http://wiki.eclipse.org/Jetty/Reference/Jetty_Classloading + getRoot().setParentLoaderPriority(true); + + server.setHandler(getRoot()); + server.setStopAtShutdown(true); + server.start(); + setChanged(); + + Object attribute = getRoot().getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); + if (attribute instanceof BeanCreationException) { + ( (BeanCreationException) attribute).printStackTrace(System.out); + logger.error("Error creating the database connection", attribute); //$NON-NLS-1$ + notifyObservers(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT); + } else { + if (postgresConnectionSwitchedtoSqlite){ + notifyObservers(ServerInitializationEvent.SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT); + }else{ + notifyObservers(ServerInitializationEvent.SERVER_STARTED_EVENT); + } + } + } catch (final IOException e) { + logger.error("Error initializing local properties", e); //$NON-NLS-1$ + } catch (Exception e) { + logger.error("Error staring the server", e); //$NON-NLS-1$ + } - return result; + // Force the local properties to be loaded before the browserservice is instantiated!! DO NOT REMOVE + getContext().getBean(LocalPropertiesService.class); + this.addObserver(getContext().getBean(BrowserService.class)); - } + } - private void openFilesImplmentation(Object openFilesEventObject) throws Exception { - Class openFilesEventClass = Class.forName("com.apple.eawt.AppEvent.OpenFilesEvent"); - Method getFilesMethod = openFilesEventClass.getMethod("getFiles"); + public void stopServer() throws Exception { + if (server != null && server.isRunning()) { + server.stop(); + setChanged(); + notifyObservers(ServerInitializationEvent.SERVER_STOPPED_EVENT); + } + } - List files = (List) getFilesMethod.invoke( openFilesEventClass.cast( openFilesEventObject ) ); - for (File file : files ){ - try { - EarthApp.openProjectFileInRunningCollectEarth(file.getAbsolutePath()); - } catch (IOException e1) { - logger.error("Error opening CEP file " + e1); + public static String getHostAddress(String host, String port) { + String hostAndPort = ""; //$NON-NLS-1$ + if (host != null && host.length() > 0) { + hostAndPort = host; + if (port != null && port.length() > 0) { + hostAndPort += ":" + port; //$NON-NLS-1$ } - } - } - } + hostAndPort = "http://" + hostAndPort + "/" + EARTH_SUBDOMAIN + "/"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + return hostAndPort; + } +} From b4d290aafc3b5a1121cbcca51c9eed94241ea92a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:26 +0100 Subject: [PATCH 1002/1620] New translations ServerController.java (Spanish) --- .../earth/app/view/Messages_es.properties | 300 +++++++++++++++--- 1 file changed, 263 insertions(+), 37 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 1f014d967a..5b52f161d0 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -2,64 +2,290 @@ package org.openforis.collect.earth.app.desktop; import java.io.File; import java.io.IOException; -import java.lang.reflect.Method; -import java.util.List; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.Statement; +import java.util.Map; +import java.util.Observable; +import java.util.Observer; +import org.eclipse.jetty.server.Connector; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.ServerConnector; +import org.eclipse.jetty.util.thread.ExecutorThreadPool; +import org.eclipse.jetty.webapp.WebAppContext; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; +import org.openforis.collect.earth.app.service.BrowserService; +import org.openforis.collect.earth.app.service.FolderFinder; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.BeanCreationException; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.context.support.WebApplicationContextUtils; + +import freemarker.template.TemplateException; /** - * Use reflection to be able to add the code specific to Mac OS X without generating compilation errors - * This class generates a Proxy so that an Interface method can be invoked. Sort of implementing an Interface using reflection - * @see How to implement an interface using Reflection + * Controls the Jetty server, starting and stopping it as well as reporting its staus. + * * @author Alfonso Sanchez-Paus Diaz * */ -public class MacOpenFilesInvocationHandler implements java.lang.reflect.InvocationHandler { +public class ServerController extends Observable { + + private static final String EARTH_SUBDOMAIN = "earth"; //$NON-NLS-1$ + + + public static final String SAIKU_RDB_SUFFIX = "Saiku"; //$NON-NLS-1$ + public static final String IPCC_RDB_SUFFIX = "Ipcc"; //$NON-NLS-1$ + + // Make sure that the default ports are the same for Server and Generator + private static final String DEFAULT_PORT = "80"; //$NON-NLS-1$ + + public enum ServerInitializationEvent{ + SERVER_STOPPED_EVENT("The Server has stopped"), + SERVER_STARTED_EVENT("The server started without problems"), + SERVER_STARTED_NO_DB_CONNECTION_EVENT("Collect Earth could not start due to a DB connection issue"), + SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT( "Collect Earth started but the PostgreSQL DB could not be reached (SQLite used instead until problems are fixed)"); + + private String message; + + private ServerInitializationEvent(String message) { + this.message = message; + } + + @Override + public String toString() { + return message; + } + + } + + private Server server; + private final Logger logger = LoggerFactory.getLogger(ServerController.class); + private WebAppContext root; + static LocalPropertiesService localPropertiesService; + + public WebApplicationContext getContext() { + WebApplicationContext webApplicationContext = null; + try { + webApplicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(getRoot().getServletContext()); + } catch (Exception e) { + logger.error("Error getting web application context", e); //$NON-NLS-1$ + } + return webApplicationContext; + } + + private static String getDbURL(final CollectDBDriver collectDBDriver) { + // jdbc:postgresql://hostname:port/dbname + + String url = collectDBDriver.getUrl(); + url = url.replace("REPLACE_HOSTNAME", localPropertiesService.getValue(EarthProperty.DB_HOST)); //$NON-NLS-1$ + url = url.replace("REPLACE_PORT", localPropertiesService.getValue(EarthProperty.DB_PORT)); //$NON-NLS-1$ + url = url.replace("REPLACE_DBNAME", localPropertiesService.getValue(EarthProperty.DB_NAME)); //$NON-NLS-1$ + return url; + } + + private int getPort() { + + String webPort = localPropertiesService.getLocalPort(); + if (webPort == null || webPort.isEmpty()) { + webPort = DEFAULT_PORT; + } + return Integer.parseInt(webPort); + } + + private WebAppContext getRoot() { + return root; + } + + private void setRoot(WebAppContext root) { + this.root = root; + } + + private boolean initilizeDataSources() throws IOException, TemplateException { + + CollectDBDriver collectDBDriver = localPropertiesService.getCollectDBDriver(); + boolean isConnectionTypeSwitched = false; + if(localPropertiesService.isUsingPostgreSqlDB() && !isPostgreSQLReachable(collectDBDriver) ){ + + logger.warn("Impossible to reach the PostgreSQL server at " + getDbURL(CollectDBDriver.POSTGRESQL)); + logger.warn("Using the SQLite version until fixed!"); + logger.error("Impossible to reach the PostgreSQL server at " + getDbURL(CollectDBDriver.POSTGRESQL) + " using SQLite version"); + collectDBDriver = CollectDBDriver.SQLITE; + isConnectionTypeSwitched = true; + } + + final File jettyAppCtxTemplateSrc = new File("resources/applicationContext.fmt"); //$NON-NLS-1$ + final File jettyAppCtxDst = new File(EarthConstants.GENERATED_FOLDER + "/applicationContext.xml"); //$NON-NLS-1$ + + jettyAppCtxDst.getParentFile().mkdirs(); + + final Map data = new java.util.HashMap<>(); - private final Logger logger = LoggerFactory.getLogger(MacOpenFilesInvocationHandler.class); + data.put("driver", collectDBDriver.getDriverClass()); //$NON-NLS-1$ + data.put("url", getDbURL(collectDBDriver)); //$NON-NLS-1$ + data.put("urlSaiku", getSaikuDbURL(collectDBDriver)); //$NON-NLS-1$ + data.put("urlIpcc", getIpccDbURL(collectDBDriver)); //$NON-NLS-1$ + data.put("username", localPropertiesService.getValue(EarthProperty.DB_USERNAME)); //$NON-NLS-1$ + data.put("password", localPropertiesService.getValue(EarthProperty.DB_PASSWORD)); //$NON-NLS-1$ + data.put("collectEarthExecutionFolder", System.getProperty("user.dir") + File.separator); //$NON-NLS-1$ //$NON-NLS-2$ - public MacOpenFilesInvocationHandler() { - super(); - } + FreemarkerTemplateUtils.applyTemplate(jettyAppCtxTemplateSrc, jettyAppCtxDst, data); - public Object invoke(Object proxy, Method m, Object[] args) throws Throwable - { + return isConnectionTypeSwitched; - Object result = null; + } - try { + private boolean isPostgreSQLReachable(CollectDBDriver collectDBDriver) { + boolean connectionWorked = false; + try ( Connection connection = DriverManager.getConnection( + getDbURL(collectDBDriver), + localPropertiesService.getValue(EarthProperty.DB_USERNAME), + localPropertiesService.getValue(EarthProperty.DB_PASSWORD) + ) ){ + String query="select version()"; + try( Statement s = connection.createStatement() ){ + try( ResultSet rs=s.executeQuery(query) ){ + while(rs.next()) + { + logger.debug( "It works, there are " + rs.getString(1) + " rows on the ofc_record table"); + } + connectionWorked = true; + } + } + } + catch(Exception e){ + logger.error("Error while testing the connection to the postgresSQL DB", e); + } + + return connectionWorked; + + } + + public static String getSaikuDbURL(CollectDBDriver collectDBDriver) { + String urlSaikuDB = getDbURL(collectDBDriver); + + if (localPropertiesService.isUsingSqliteDB()) { + urlSaikuDB += EarthConstants.SAIKU_RDB_SUFFIX; + } + return urlSaikuDB; + } + + public static String getIpccDbURL(CollectDBDriver collectDBDriver) { + String urlIpccDB = getDbURL(collectDBDriver); + + if (localPropertiesService.isUsingSqliteDB()) { + urlIpccDB += IPCC_RDB_SUFFIX; + } + return urlIpccDB; + } + + public void startServer(Observer observeInitialization) throws Exception { + + localPropertiesService = new LocalPropertiesService(); + + this.addObserver(observeInitialization); + + boolean postgresConnectionSwitchedtoSqlite = initilizeDataSources(); + try { + + final String webappDirLocation = FolderFinder.getCollectEarthDataFolder(); + + // The port that we should run on can be set into an environment variable + // Look for that variable and default to 8080 if it isn't there. - // if the method name equals some method's name then call your method - if ( m!= null && m.getName().equals("openFiles") && args !=null && args.length>0) { - openFilesImplmentation(args[0]); - } + // For log4j 1.2 --> Moving to Log4J2 + //PropertyConfigurator.configure(this.getClass().getResource("/WEB-INF/conf/log4j.properties")); - } catch (Exception e) { - logger.error(" Error while interpreting invocation " , e ); - } finally { - logger.info("end method {}", m!=null?m.getName():"Unknown method"); - } + //server = new Server(new ExecutorThreadPool(10, 50, 5, TimeUnit.SECONDS)); // For JEtty 7 + //server = new Server(new ExecutorThreadPool(50, 50, 5, TimeUnit.MILLISECONDS) ); // For JEtty 9, different parameters for the constructor + server = new Server(new ExecutorThreadPool() ); // For JEtty 9.4, different parameters for the constructor + + // // Use blocking-IO connector to improve throughput + final ServerConnector connector = new ServerConnector(server); + connector.setName( LocalPropertiesService.LOCAL_HOST + ":" + getPort()); //$NON-NLS-1$ + connector.setHost("0.0.0.0"); //$NON-NLS-1$ + //connector.setHost( LocalPropertiesService.LOCAL_HOST ); + + connector.setPort(getPort()); + + connector.setStopTimeout(1000); + + server.setConnectors(new Connector[] { connector }); + + WebAppContext wweAppContext = new WebAppContext(); + setRoot(wweAppContext); + + getRoot().setContextPath("/" + EARTH_SUBDOMAIN); //$NON-NLS-1$ + + getRoot().setDescriptor(this.getClass().getResource("/WEB-INF/web.xml").toURI().toString()); //$NON-NLS-1$ + + getRoot().setResourceBase(webappDirLocation); + + // Parent loader priority is a class loader setting that Jetty accepts. + // By default Jetty will behave like most web containers in that it will + // allow your application to replace non-server libraries that are part of the container. + // Setting parent loader priority to true changes this behaviour. + // Read more here: + // http://wiki.eclipse.org/Jetty/Reference/Jetty_Classloading + getRoot().setParentLoaderPriority(true); + + server.setHandler(getRoot()); + server.setStopAtShutdown(true); + server.start(); + setChanged(); + + Object attribute = getRoot().getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); + if (attribute instanceof BeanCreationException) { + ( (BeanCreationException) attribute).printStackTrace(System.out); + logger.error("Error creating the database connection", attribute); //$NON-NLS-1$ + notifyObservers(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT); + } else { + if (postgresConnectionSwitchedtoSqlite){ + notifyObservers(ServerInitializationEvent.SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT); + }else{ + notifyObservers(ServerInitializationEvent.SERVER_STARTED_EVENT); + } + } + } catch (final IOException e) { + logger.error("Error initializing local properties", e); //$NON-NLS-1$ + } catch (Exception e) { + logger.error("Error staring the server", e); //$NON-NLS-1$ + } - return result; + // Force the local properties to be loaded before the browserservice is instantiated!! DO NOT REMOVE + getContext().getBean(LocalPropertiesService.class); + this.addObserver(getContext().getBean(BrowserService.class)); - } + } - private void openFilesImplmentation(Object openFilesEventObject) throws Exception { - Class openFilesEventClass = Class.forName("com.apple.eawt.AppEvent.OpenFilesEvent"); - Method getFilesMethod = openFilesEventClass.getMethod("getFiles"); + public void stopServer() throws Exception { + if (server != null && server.isRunning()) { + server.stop(); + setChanged(); + notifyObservers(ServerInitializationEvent.SERVER_STOPPED_EVENT); + } + } - List files = (List) getFilesMethod.invoke( openFilesEventClass.cast( openFilesEventObject ) ); - for (File file : files ){ - try { - EarthApp.openProjectFileInRunningCollectEarth(file.getAbsolutePath()); - } catch (IOException e1) { - logger.error("Error opening CEP file " + e1); + public static String getHostAddress(String host, String port) { + String hostAndPort = ""; //$NON-NLS-1$ + if (host != null && host.length() > 0) { + hostAndPort = host; + if (port != null && port.length() > 0) { + hostAndPort += ":" + port; //$NON-NLS-1$ } - } - } - } + hostAndPort = "http://" + hostAndPort + "/" + EARTH_SUBDOMAIN + "/"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + return hostAndPort; + } +} From 2533ab8024cbcf9b900b504d0bba58700a4a1914 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:27 +0100 Subject: [PATCH 1003/1620] New translations ServerController.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 327 ++++++++++++++---- 1 file changed, 262 insertions(+), 65 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 9f9883c25f..5b52f161d0 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,94 +1,291 @@ -package org.openforis.collect.earth.app.logging; - -import java.awt.Dimension; - -import javax.swing.JEditorPane; -import javax.swing.JOptionPane; -import javax.swing.JScrollPane; -import javax.swing.SwingUtilities; - -import org.apache.logging.log4j.core.Filter; -import org.apache.logging.log4j.core.Layout; -import org.apache.logging.log4j.core.LogEvent; -import org.apache.logging.log4j.core.appender.AbstractAppender; -import org.apache.logging.log4j.core.config.Property; -import org.apache.logging.log4j.core.config.plugins.Plugin; -import org.apache.logging.log4j.core.config.plugins.PluginAttribute; -import org.apache.logging.log4j.core.config.plugins.PluginElement; -import org.apache.logging.log4j.core.config.plugins.PluginFactory; -import org.apache.logging.log4j.core.layout.PatternLayout; +package org.openforis.collect.earth.app.desktop; + +import java.io.File; +import java.io.IOException; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.Statement; +import java.util.Map; +import java.util.Observable; +import java.util.Observer; + +import org.eclipse.jetty.server.Connector; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.ServerConnector; +import org.eclipse.jetty.util.thread.ExecutorThreadPool; +import org.eclipse.jetty.webapp.WebAppContext; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; +import org.openforis.collect.earth.app.service.BrowserService; +import org.openforis.collect.earth.app.service.FolderFinder; import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.BeanCreationException; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.context.support.WebApplicationContextUtils; -@Plugin(name = "JSwingAppender", category = "Core", elementType = "appender", printObject = true) -public class JSwingAppender extends AbstractAppender { +import freemarker.template.TemplateException; - private Boolean showException; +/** + * Controls the Jetty server, starting and stopping it as well as reporting its staus. + * + * @author Alfonso Sanchez-Paus Diaz + * + */ +public class ServerController extends Observable { - private Logger logger = LoggerFactory.getLogger( JSwingAppender.class ); + private static final String EARTH_SUBDOMAIN = "earth"; //$NON-NLS-1$ - public JSwingAppender(String name, Filter filter, Layout layout, boolean ignoreExceptions, Property[] properties) { - super(name, filter, layout, ignoreExceptions, properties); - } - @PluginFactory - public static JSwingAppender createAppender(@PluginAttribute("name") String name, - @PluginElement("Layout") Layout layout, @PluginElement("Filters") Filter filter, - @PluginAttribute("ignoreExceptions") boolean ignoreExceptions) { + public static final String SAIKU_RDB_SUFFIX = "Saiku"; //$NON-NLS-1$ + public static final String IPCC_RDB_SUFFIX = "Ipcc"; //$NON-NLS-1$ + + // Make sure that the default ports are the same for Server and Generator + private static final String DEFAULT_PORT = "80"; //$NON-NLS-1$ + + public enum ServerInitializationEvent{ + SERVER_STOPPED_EVENT("The Server has stopped"), + SERVER_STARTED_EVENT("The server started without problems"), + SERVER_STARTED_NO_DB_CONNECTION_EVENT("Collect Earth could not start due to a DB connection issue"), + SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT( "Collect Earth started but the PostgreSQL DB could not be reached (SQLite used instead until problems are fixed)"); + + private String message; - if (name == null) { - LoggerFactory.getLogger( JSwingAppender.class ).error("No name provided for JTextAreaAppender"); - return null; + private ServerInitializationEvent(String message) { + this.message = message; } - if (layout == null) { - layout = PatternLayout.createDefaultLayout(); + @Override + public String toString() { + return message; } - return new JSwingAppender(name, filter, layout, ignoreExceptions, Property.EMPTY_ARRAY); + } - @Override - public void append(LogEvent event) { + private Server server; + private final Logger logger = LoggerFactory.getLogger(ServerController.class); + private WebAppContext root; + static LocalPropertiesService localPropertiesService; + + public WebApplicationContext getContext() { + WebApplicationContext webApplicationContext = null; try { - if( isExceptionShown() ) { - final String message = new String(this.getLayout().toByteArray(event)).replaceAll("(\r\n|\n)", "
"); + webApplicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(getRoot().getServletContext()); + } catch (Exception e) { + logger.error("Error getting web application context", e); //$NON-NLS-1$ + } + return webApplicationContext; + } - // Append formatted message to text area using the Thread. + private static String getDbURL(final CollectDBDriver collectDBDriver) { + // jdbc:postgresql://hostname:port/dbname - SwingUtilities.invokeLater( () -> { - try { - JEditorPane web = new JEditorPane(); - web.setEditable(false); - web.setContentType("text/html"); - web.setText(message); + String url = collectDBDriver.getUrl(); + url = url.replace("REPLACE_HOSTNAME", localPropertiesService.getValue(EarthProperty.DB_HOST)); //$NON-NLS-1$ + url = url.replace("REPLACE_PORT", localPropertiesService.getValue(EarthProperty.DB_PORT)); //$NON-NLS-1$ + url = url.replace("REPLACE_DBNAME", localPropertiesService.getValue(EarthProperty.DB_NAME)); //$NON-NLS-1$ + return url; + } + + private int getPort() { + + String webPort = localPropertiesService.getLocalPort(); + if (webPort == null || webPort.isEmpty()) { + webPort = DEFAULT_PORT; + } + return Integer.parseInt(webPort); + } + + private WebAppContext getRoot() { + return root; + } + + private void setRoot(WebAppContext root) { + this.root = root; + } - JScrollPane scrollPane = new JScrollPane(web); - scrollPane.setPreferredSize(new Dimension(450, 350)); + private boolean initilizeDataSources() throws IOException, TemplateException { - JOptionPane.showMessageDialog(null, scrollPane, "Error has been loogged", JOptionPane.ERROR_MESSAGE); - }catch (Exception e) { - // Avoid creating an infinite loop by catching this exception and not logging it as error - logger.debug("Error shown exception", e); + CollectDBDriver collectDBDriver = localPropertiesService.getCollectDBDriver(); + boolean isConnectionTypeSwitched = false; + if(localPropertiesService.isUsingPostgreSqlDB() && !isPostgreSQLReachable(collectDBDriver) ){ + + logger.warn("Impossible to reach the PostgreSQL server at " + getDbURL(CollectDBDriver.POSTGRESQL)); + logger.warn("Using the SQLite version until fixed!"); + logger.error("Impossible to reach the PostgreSQL server at " + getDbURL(CollectDBDriver.POSTGRESQL) + " using SQLite version"); + collectDBDriver = CollectDBDriver.SQLITE; + isConnectionTypeSwitched = true; + } + + final File jettyAppCtxTemplateSrc = new File("resources/applicationContext.fmt"); //$NON-NLS-1$ + final File jettyAppCtxDst = new File(EarthConstants.GENERATED_FOLDER + "/applicationContext.xml"); //$NON-NLS-1$ + + jettyAppCtxDst.getParentFile().mkdirs(); + + final Map data = new java.util.HashMap<>(); + + data.put("driver", collectDBDriver.getDriverClass()); //$NON-NLS-1$ + data.put("url", getDbURL(collectDBDriver)); //$NON-NLS-1$ + data.put("urlSaiku", getSaikuDbURL(collectDBDriver)); //$NON-NLS-1$ + data.put("urlIpcc", getIpccDbURL(collectDBDriver)); //$NON-NLS-1$ + data.put("username", localPropertiesService.getValue(EarthProperty.DB_USERNAME)); //$NON-NLS-1$ + data.put("password", localPropertiesService.getValue(EarthProperty.DB_PASSWORD)); //$NON-NLS-1$ + data.put("collectEarthExecutionFolder", System.getProperty("user.dir") + File.separator); //$NON-NLS-1$ //$NON-NLS-2$ + + FreemarkerTemplateUtils.applyTemplate(jettyAppCtxTemplateSrc, jettyAppCtxDst, data); + + + return isConnectionTypeSwitched; + + } + + private boolean isPostgreSQLReachable(CollectDBDriver collectDBDriver) { + boolean connectionWorked = false; + try ( Connection connection = DriverManager.getConnection( + getDbURL(collectDBDriver), + localPropertiesService.getValue(EarthProperty.DB_USERNAME), + localPropertiesService.getValue(EarthProperty.DB_PASSWORD) + ) ){ + String query="select version()"; + try( Statement s = connection.createStatement() ){ + try( ResultSet rs=s.executeQuery(query) ){ + while(rs.next()) + { + logger.debug( "It works, there are " + rs.getString(1) + " rows on the ofc_record table"); } - } ); + connectionWorked = true; + } } - } catch (final Exception e) { - // ignore case when the platform hasn't yet been initialized - logger.debug("Error shown exception", e); + } + catch(Exception e){ + logger.error("Error while testing the connection to the postgresSQL DB", e); } + return connectionWorked; + } - private boolean isExceptionShown() { - if( showException == null ) { - LocalPropertiesService localPropertiesService = new LocalPropertiesService(); - showException = localPropertiesService.isExceptionShown(); + public static String getSaikuDbURL(CollectDBDriver collectDBDriver) { + String urlSaikuDB = getDbURL(collectDBDriver); + + if (localPropertiesService.isUsingSqliteDB()) { + urlSaikuDB += EarthConstants.SAIKU_RDB_SUFFIX; } - return showException; + return urlSaikuDB; } - public void setExceptionShown(Boolean showException) { - this.showException = showException; + public static String getIpccDbURL(CollectDBDriver collectDBDriver) { + String urlIpccDB = getDbURL(collectDBDriver); + + if (localPropertiesService.isUsingSqliteDB()) { + urlIpccDB += IPCC_RDB_SUFFIX; + } + return urlIpccDB; + } + + public void startServer(Observer observeInitialization) throws Exception { + + localPropertiesService = new LocalPropertiesService(); + + this.addObserver(observeInitialization); + + boolean postgresConnectionSwitchedtoSqlite = initilizeDataSources(); + try { + + final String webappDirLocation = FolderFinder.getCollectEarthDataFolder(); + + // The port that we should run on can be set into an environment variable + // Look for that variable and default to 8080 if it isn't there. + + // For log4j 1.2 --> Moving to Log4J2 + //PropertyConfigurator.configure(this.getClass().getResource("/WEB-INF/conf/log4j.properties")); + + //server = new Server(new ExecutorThreadPool(10, 50, 5, TimeUnit.SECONDS)); // For JEtty 7 + //server = new Server(new ExecutorThreadPool(50, 50, 5, TimeUnit.MILLISECONDS) ); // For JEtty 9, different parameters for the constructor + server = new Server(new ExecutorThreadPool() ); // For JEtty 9.4, different parameters for the constructor + + // // Use blocking-IO connector to improve throughput + final ServerConnector connector = new ServerConnector(server); + connector.setName( LocalPropertiesService.LOCAL_HOST + ":" + getPort()); //$NON-NLS-1$ + connector.setHost("0.0.0.0"); //$NON-NLS-1$ + //connector.setHost( LocalPropertiesService.LOCAL_HOST ); + + connector.setPort(getPort()); + + connector.setStopTimeout(1000); + + server.setConnectors(new Connector[] { connector }); + + WebAppContext wweAppContext = new WebAppContext(); + setRoot(wweAppContext); + + getRoot().setContextPath("/" + EARTH_SUBDOMAIN); //$NON-NLS-1$ + + getRoot().setDescriptor(this.getClass().getResource("/WEB-INF/web.xml").toURI().toString()); //$NON-NLS-1$ + + getRoot().setResourceBase(webappDirLocation); + + // Parent loader priority is a class loader setting that Jetty accepts. + // By default Jetty will behave like most web containers in that it will + // allow your application to replace non-server libraries that are part of the container. + // Setting parent loader priority to true changes this behaviour. + // Read more here: + // http://wiki.eclipse.org/Jetty/Reference/Jetty_Classloading + getRoot().setParentLoaderPriority(true); + + server.setHandler(getRoot()); + server.setStopAtShutdown(true); + server.start(); + setChanged(); + + Object attribute = getRoot().getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); + if (attribute instanceof BeanCreationException) { + ( (BeanCreationException) attribute).printStackTrace(System.out); + logger.error("Error creating the database connection", attribute); //$NON-NLS-1$ + notifyObservers(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT); + } else { + if (postgresConnectionSwitchedtoSqlite){ + notifyObservers(ServerInitializationEvent.SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT); + }else{ + notifyObservers(ServerInitializationEvent.SERVER_STARTED_EVENT); + } + } + } catch (final IOException e) { + logger.error("Error initializing local properties", e); //$NON-NLS-1$ + } catch (Exception e) { + logger.error("Error staring the server", e); //$NON-NLS-1$ + } + + // Force the local properties to be loaded before the browserservice is instantiated!! DO NOT REMOVE + getContext().getBean(LocalPropertiesService.class); + this.addObserver(getContext().getBean(BrowserService.class)); + + } + + public void stopServer() throws Exception { + if (server != null && server.isRunning()) { + server.stop(); + setChanged(); + notifyObservers(ServerInitializationEvent.SERVER_STOPPED_EVENT); + } + } + + + public static String getHostAddress(String host, String port) { + String hostAndPort = ""; //$NON-NLS-1$ + if (host != null && host.length() > 0) { + hostAndPort = host; + if (port != null && port.length() > 0) { + hostAndPort += ":" + port; //$NON-NLS-1$ + } + + hostAndPort = "http://" + hostAndPort + "/" + EARTH_SUBDOMAIN + "/"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + return hostAndPort; + } -} \ No newline at end of file +} From a667334f958177720e8ce4028051dd7d76a802e5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:28 +0100 Subject: [PATCH 1004/1620] New translations ServerController.java (English) --- .../earth/app/view/Messages_en.properties | 300 +++++++++++++++--- 1 file changed, 263 insertions(+), 37 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 1f014d967a..5b52f161d0 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -2,64 +2,290 @@ package org.openforis.collect.earth.app.desktop; import java.io.File; import java.io.IOException; -import java.lang.reflect.Method; -import java.util.List; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.Statement; +import java.util.Map; +import java.util.Observable; +import java.util.Observer; +import org.eclipse.jetty.server.Connector; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.ServerConnector; +import org.eclipse.jetty.util.thread.ExecutorThreadPool; +import org.eclipse.jetty.webapp.WebAppContext; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; +import org.openforis.collect.earth.app.service.BrowserService; +import org.openforis.collect.earth.app.service.FolderFinder; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.BeanCreationException; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.context.support.WebApplicationContextUtils; + +import freemarker.template.TemplateException; /** - * Use reflection to be able to add the code specific to Mac OS X without generating compilation errors - * This class generates a Proxy so that an Interface method can be invoked. Sort of implementing an Interface using reflection - * @see How to implement an interface using Reflection + * Controls the Jetty server, starting and stopping it as well as reporting its staus. + * * @author Alfonso Sanchez-Paus Diaz * */ -public class MacOpenFilesInvocationHandler implements java.lang.reflect.InvocationHandler { +public class ServerController extends Observable { + + private static final String EARTH_SUBDOMAIN = "earth"; //$NON-NLS-1$ + + + public static final String SAIKU_RDB_SUFFIX = "Saiku"; //$NON-NLS-1$ + public static final String IPCC_RDB_SUFFIX = "Ipcc"; //$NON-NLS-1$ + + // Make sure that the default ports are the same for Server and Generator + private static final String DEFAULT_PORT = "80"; //$NON-NLS-1$ + + public enum ServerInitializationEvent{ + SERVER_STOPPED_EVENT("The Server has stopped"), + SERVER_STARTED_EVENT("The server started without problems"), + SERVER_STARTED_NO_DB_CONNECTION_EVENT("Collect Earth could not start due to a DB connection issue"), + SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT( "Collect Earth started but the PostgreSQL DB could not be reached (SQLite used instead until problems are fixed)"); + + private String message; + + private ServerInitializationEvent(String message) { + this.message = message; + } + + @Override + public String toString() { + return message; + } + + } + + private Server server; + private final Logger logger = LoggerFactory.getLogger(ServerController.class); + private WebAppContext root; + static LocalPropertiesService localPropertiesService; + + public WebApplicationContext getContext() { + WebApplicationContext webApplicationContext = null; + try { + webApplicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(getRoot().getServletContext()); + } catch (Exception e) { + logger.error("Error getting web application context", e); //$NON-NLS-1$ + } + return webApplicationContext; + } + + private static String getDbURL(final CollectDBDriver collectDBDriver) { + // jdbc:postgresql://hostname:port/dbname + + String url = collectDBDriver.getUrl(); + url = url.replace("REPLACE_HOSTNAME", localPropertiesService.getValue(EarthProperty.DB_HOST)); //$NON-NLS-1$ + url = url.replace("REPLACE_PORT", localPropertiesService.getValue(EarthProperty.DB_PORT)); //$NON-NLS-1$ + url = url.replace("REPLACE_DBNAME", localPropertiesService.getValue(EarthProperty.DB_NAME)); //$NON-NLS-1$ + return url; + } + + private int getPort() { + + String webPort = localPropertiesService.getLocalPort(); + if (webPort == null || webPort.isEmpty()) { + webPort = DEFAULT_PORT; + } + return Integer.parseInt(webPort); + } + + private WebAppContext getRoot() { + return root; + } + + private void setRoot(WebAppContext root) { + this.root = root; + } + + private boolean initilizeDataSources() throws IOException, TemplateException { + + CollectDBDriver collectDBDriver = localPropertiesService.getCollectDBDriver(); + boolean isConnectionTypeSwitched = false; + if(localPropertiesService.isUsingPostgreSqlDB() && !isPostgreSQLReachable(collectDBDriver) ){ + + logger.warn("Impossible to reach the PostgreSQL server at " + getDbURL(CollectDBDriver.POSTGRESQL)); + logger.warn("Using the SQLite version until fixed!"); + logger.error("Impossible to reach the PostgreSQL server at " + getDbURL(CollectDBDriver.POSTGRESQL) + " using SQLite version"); + collectDBDriver = CollectDBDriver.SQLITE; + isConnectionTypeSwitched = true; + } + + final File jettyAppCtxTemplateSrc = new File("resources/applicationContext.fmt"); //$NON-NLS-1$ + final File jettyAppCtxDst = new File(EarthConstants.GENERATED_FOLDER + "/applicationContext.xml"); //$NON-NLS-1$ + + jettyAppCtxDst.getParentFile().mkdirs(); + + final Map data = new java.util.HashMap<>(); - private final Logger logger = LoggerFactory.getLogger(MacOpenFilesInvocationHandler.class); + data.put("driver", collectDBDriver.getDriverClass()); //$NON-NLS-1$ + data.put("url", getDbURL(collectDBDriver)); //$NON-NLS-1$ + data.put("urlSaiku", getSaikuDbURL(collectDBDriver)); //$NON-NLS-1$ + data.put("urlIpcc", getIpccDbURL(collectDBDriver)); //$NON-NLS-1$ + data.put("username", localPropertiesService.getValue(EarthProperty.DB_USERNAME)); //$NON-NLS-1$ + data.put("password", localPropertiesService.getValue(EarthProperty.DB_PASSWORD)); //$NON-NLS-1$ + data.put("collectEarthExecutionFolder", System.getProperty("user.dir") + File.separator); //$NON-NLS-1$ //$NON-NLS-2$ - public MacOpenFilesInvocationHandler() { - super(); - } + FreemarkerTemplateUtils.applyTemplate(jettyAppCtxTemplateSrc, jettyAppCtxDst, data); - public Object invoke(Object proxy, Method m, Object[] args) throws Throwable - { + return isConnectionTypeSwitched; - Object result = null; + } - try { + private boolean isPostgreSQLReachable(CollectDBDriver collectDBDriver) { + boolean connectionWorked = false; + try ( Connection connection = DriverManager.getConnection( + getDbURL(collectDBDriver), + localPropertiesService.getValue(EarthProperty.DB_USERNAME), + localPropertiesService.getValue(EarthProperty.DB_PASSWORD) + ) ){ + String query="select version()"; + try( Statement s = connection.createStatement() ){ + try( ResultSet rs=s.executeQuery(query) ){ + while(rs.next()) + { + logger.debug( "It works, there are " + rs.getString(1) + " rows on the ofc_record table"); + } + connectionWorked = true; + } + } + } + catch(Exception e){ + logger.error("Error while testing the connection to the postgresSQL DB", e); + } + + return connectionWorked; + + } + + public static String getSaikuDbURL(CollectDBDriver collectDBDriver) { + String urlSaikuDB = getDbURL(collectDBDriver); + + if (localPropertiesService.isUsingSqliteDB()) { + urlSaikuDB += EarthConstants.SAIKU_RDB_SUFFIX; + } + return urlSaikuDB; + } + + public static String getIpccDbURL(CollectDBDriver collectDBDriver) { + String urlIpccDB = getDbURL(collectDBDriver); + + if (localPropertiesService.isUsingSqliteDB()) { + urlIpccDB += IPCC_RDB_SUFFIX; + } + return urlIpccDB; + } + + public void startServer(Observer observeInitialization) throws Exception { + + localPropertiesService = new LocalPropertiesService(); + + this.addObserver(observeInitialization); + + boolean postgresConnectionSwitchedtoSqlite = initilizeDataSources(); + try { + + final String webappDirLocation = FolderFinder.getCollectEarthDataFolder(); + + // The port that we should run on can be set into an environment variable + // Look for that variable and default to 8080 if it isn't there. - // if the method name equals some method's name then call your method - if ( m!= null && m.getName().equals("openFiles") && args !=null && args.length>0) { - openFilesImplmentation(args[0]); - } + // For log4j 1.2 --> Moving to Log4J2 + //PropertyConfigurator.configure(this.getClass().getResource("/WEB-INF/conf/log4j.properties")); - } catch (Exception e) { - logger.error(" Error while interpreting invocation " , e ); - } finally { - logger.info("end method {}", m!=null?m.getName():"Unknown method"); - } + //server = new Server(new ExecutorThreadPool(10, 50, 5, TimeUnit.SECONDS)); // For JEtty 7 + //server = new Server(new ExecutorThreadPool(50, 50, 5, TimeUnit.MILLISECONDS) ); // For JEtty 9, different parameters for the constructor + server = new Server(new ExecutorThreadPool() ); // For JEtty 9.4, different parameters for the constructor + + // // Use blocking-IO connector to improve throughput + final ServerConnector connector = new ServerConnector(server); + connector.setName( LocalPropertiesService.LOCAL_HOST + ":" + getPort()); //$NON-NLS-1$ + connector.setHost("0.0.0.0"); //$NON-NLS-1$ + //connector.setHost( LocalPropertiesService.LOCAL_HOST ); + + connector.setPort(getPort()); + + connector.setStopTimeout(1000); + + server.setConnectors(new Connector[] { connector }); + + WebAppContext wweAppContext = new WebAppContext(); + setRoot(wweAppContext); + + getRoot().setContextPath("/" + EARTH_SUBDOMAIN); //$NON-NLS-1$ + + getRoot().setDescriptor(this.getClass().getResource("/WEB-INF/web.xml").toURI().toString()); //$NON-NLS-1$ + + getRoot().setResourceBase(webappDirLocation); + + // Parent loader priority is a class loader setting that Jetty accepts. + // By default Jetty will behave like most web containers in that it will + // allow your application to replace non-server libraries that are part of the container. + // Setting parent loader priority to true changes this behaviour. + // Read more here: + // http://wiki.eclipse.org/Jetty/Reference/Jetty_Classloading + getRoot().setParentLoaderPriority(true); + + server.setHandler(getRoot()); + server.setStopAtShutdown(true); + server.start(); + setChanged(); + + Object attribute = getRoot().getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); + if (attribute instanceof BeanCreationException) { + ( (BeanCreationException) attribute).printStackTrace(System.out); + logger.error("Error creating the database connection", attribute); //$NON-NLS-1$ + notifyObservers(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT); + } else { + if (postgresConnectionSwitchedtoSqlite){ + notifyObservers(ServerInitializationEvent.SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT); + }else{ + notifyObservers(ServerInitializationEvent.SERVER_STARTED_EVENT); + } + } + } catch (final IOException e) { + logger.error("Error initializing local properties", e); //$NON-NLS-1$ + } catch (Exception e) { + logger.error("Error staring the server", e); //$NON-NLS-1$ + } - return result; + // Force the local properties to be loaded before the browserservice is instantiated!! DO NOT REMOVE + getContext().getBean(LocalPropertiesService.class); + this.addObserver(getContext().getBean(BrowserService.class)); - } + } - private void openFilesImplmentation(Object openFilesEventObject) throws Exception { - Class openFilesEventClass = Class.forName("com.apple.eawt.AppEvent.OpenFilesEvent"); - Method getFilesMethod = openFilesEventClass.getMethod("getFiles"); + public void stopServer() throws Exception { + if (server != null && server.isRunning()) { + server.stop(); + setChanged(); + notifyObservers(ServerInitializationEvent.SERVER_STOPPED_EVENT); + } + } - List files = (List) getFilesMethod.invoke( openFilesEventClass.cast( openFilesEventObject ) ); - for (File file : files ){ - try { - EarthApp.openProjectFileInRunningCollectEarth(file.getAbsolutePath()); - } catch (IOException e1) { - logger.error("Error opening CEP file " + e1); + public static String getHostAddress(String host, String port) { + String hostAndPort = ""; //$NON-NLS-1$ + if (host != null && host.length() > 0) { + hostAndPort = host; + if (port != null && port.length() > 0) { + hostAndPort += ":" + port; //$NON-NLS-1$ } - } - } - } + hostAndPort = "http://" + hostAndPort + "/" + EARTH_SUBDOMAIN + "/"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + return hostAndPort; + } +} From ac1e374a8e8b0a67a428d2978bc6b0e4ecb3f3c2 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:29 +0100 Subject: [PATCH 1005/1620] New translations GAlogger.java (French) --- .../earth/app/view/Messages_fr.properties | 341 +++--------------- 1 file changed, 50 insertions(+), 291 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 5b52f161d0..c05160789c 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,291 +1,50 @@ -package org.openforis.collect.earth.app.desktop; - -import java.io.File; -import java.io.IOException; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.ResultSet; -import java.sql.Statement; -import java.util.Map; -import java.util.Observable; -import java.util.Observer; - -import org.eclipse.jetty.server.Connector; -import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.server.ServerConnector; -import org.eclipse.jetty.util.thread.ExecutorThreadPool; -import org.eclipse.jetty.webapp.WebAppContext; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; -import org.openforis.collect.earth.app.service.BrowserService; -import org.openforis.collect.earth.app.service.FolderFinder; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.BeanCreationException; -import org.springframework.web.context.WebApplicationContext; -import org.springframework.web.context.support.WebApplicationContextUtils; - -import freemarker.template.TemplateException; - -/** - * Controls the Jetty server, starting and stopping it as well as reporting its staus. - * - * @author Alfonso Sanchez-Paus Diaz - * - */ -public class ServerController extends Observable { - - private static final String EARTH_SUBDOMAIN = "earth"; //$NON-NLS-1$ - - - public static final String SAIKU_RDB_SUFFIX = "Saiku"; //$NON-NLS-1$ - public static final String IPCC_RDB_SUFFIX = "Ipcc"; //$NON-NLS-1$ - - // Make sure that the default ports are the same for Server and Generator - private static final String DEFAULT_PORT = "80"; //$NON-NLS-1$ - - public enum ServerInitializationEvent{ - SERVER_STOPPED_EVENT("The Server has stopped"), - SERVER_STARTED_EVENT("The server started without problems"), - SERVER_STARTED_NO_DB_CONNECTION_EVENT("Collect Earth could not start due to a DB connection issue"), - SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT( "Collect Earth started but the PostgreSQL DB could not be reached (SQLite used instead until problems are fixed)"); - - private String message; - - private ServerInitializationEvent(String message) { - this.message = message; - } - - @Override - public String toString() { - return message; - } - - } - - private Server server; - private final Logger logger = LoggerFactory.getLogger(ServerController.class); - private WebAppContext root; - static LocalPropertiesService localPropertiesService; - - public WebApplicationContext getContext() { - WebApplicationContext webApplicationContext = null; - try { - webApplicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(getRoot().getServletContext()); - } catch (Exception e) { - logger.error("Error getting web application context", e); //$NON-NLS-1$ - } - return webApplicationContext; - } - - private static String getDbURL(final CollectDBDriver collectDBDriver) { - // jdbc:postgresql://hostname:port/dbname - - String url = collectDBDriver.getUrl(); - url = url.replace("REPLACE_HOSTNAME", localPropertiesService.getValue(EarthProperty.DB_HOST)); //$NON-NLS-1$ - url = url.replace("REPLACE_PORT", localPropertiesService.getValue(EarthProperty.DB_PORT)); //$NON-NLS-1$ - url = url.replace("REPLACE_DBNAME", localPropertiesService.getValue(EarthProperty.DB_NAME)); //$NON-NLS-1$ - return url; - } - - private int getPort() { - - String webPort = localPropertiesService.getLocalPort(); - if (webPort == null || webPort.isEmpty()) { - webPort = DEFAULT_PORT; - } - return Integer.parseInt(webPort); - } - - private WebAppContext getRoot() { - return root; - } - - private void setRoot(WebAppContext root) { - this.root = root; - } - - private boolean initilizeDataSources() throws IOException, TemplateException { - - CollectDBDriver collectDBDriver = localPropertiesService.getCollectDBDriver(); - boolean isConnectionTypeSwitched = false; - if(localPropertiesService.isUsingPostgreSqlDB() && !isPostgreSQLReachable(collectDBDriver) ){ - - logger.warn("Impossible to reach the PostgreSQL server at " + getDbURL(CollectDBDriver.POSTGRESQL)); - logger.warn("Using the SQLite version until fixed!"); - logger.error("Impossible to reach the PostgreSQL server at " + getDbURL(CollectDBDriver.POSTGRESQL) + " using SQLite version"); - collectDBDriver = CollectDBDriver.SQLITE; - isConnectionTypeSwitched = true; - } - - final File jettyAppCtxTemplateSrc = new File("resources/applicationContext.fmt"); //$NON-NLS-1$ - final File jettyAppCtxDst = new File(EarthConstants.GENERATED_FOLDER + "/applicationContext.xml"); //$NON-NLS-1$ - - jettyAppCtxDst.getParentFile().mkdirs(); - - final Map data = new java.util.HashMap<>(); - - data.put("driver", collectDBDriver.getDriverClass()); //$NON-NLS-1$ - data.put("url", getDbURL(collectDBDriver)); //$NON-NLS-1$ - data.put("urlSaiku", getSaikuDbURL(collectDBDriver)); //$NON-NLS-1$ - data.put("urlIpcc", getIpccDbURL(collectDBDriver)); //$NON-NLS-1$ - data.put("username", localPropertiesService.getValue(EarthProperty.DB_USERNAME)); //$NON-NLS-1$ - data.put("password", localPropertiesService.getValue(EarthProperty.DB_PASSWORD)); //$NON-NLS-1$ - data.put("collectEarthExecutionFolder", System.getProperty("user.dir") + File.separator); //$NON-NLS-1$ //$NON-NLS-2$ - - FreemarkerTemplateUtils.applyTemplate(jettyAppCtxTemplateSrc, jettyAppCtxDst, data); - - - return isConnectionTypeSwitched; - - } - - private boolean isPostgreSQLReachable(CollectDBDriver collectDBDriver) { - boolean connectionWorked = false; - try ( Connection connection = DriverManager.getConnection( - getDbURL(collectDBDriver), - localPropertiesService.getValue(EarthProperty.DB_USERNAME), - localPropertiesService.getValue(EarthProperty.DB_PASSWORD) - ) ){ - String query="select version()"; - try( Statement s = connection.createStatement() ){ - try( ResultSet rs=s.executeQuery(query) ){ - while(rs.next()) - { - logger.debug( "It works, there are " + rs.getString(1) + " rows on the ofc_record table"); - } - connectionWorked = true; - } - } - } - catch(Exception e){ - logger.error("Error while testing the connection to the postgresSQL DB", e); - } - - return connectionWorked; - - } - - public static String getSaikuDbURL(CollectDBDriver collectDBDriver) { - String urlSaikuDB = getDbURL(collectDBDriver); - - if (localPropertiesService.isUsingSqliteDB()) { - urlSaikuDB += EarthConstants.SAIKU_RDB_SUFFIX; - } - return urlSaikuDB; - } - - public static String getIpccDbURL(CollectDBDriver collectDBDriver) { - String urlIpccDB = getDbURL(collectDBDriver); - - if (localPropertiesService.isUsingSqliteDB()) { - urlIpccDB += IPCC_RDB_SUFFIX; - } - return urlIpccDB; - } - - public void startServer(Observer observeInitialization) throws Exception { - - localPropertiesService = new LocalPropertiesService(); - - this.addObserver(observeInitialization); - - boolean postgresConnectionSwitchedtoSqlite = initilizeDataSources(); - try { - - final String webappDirLocation = FolderFinder.getCollectEarthDataFolder(); - - // The port that we should run on can be set into an environment variable - // Look for that variable and default to 8080 if it isn't there. - - // For log4j 1.2 --> Moving to Log4J2 - //PropertyConfigurator.configure(this.getClass().getResource("/WEB-INF/conf/log4j.properties")); - - //server = new Server(new ExecutorThreadPool(10, 50, 5, TimeUnit.SECONDS)); // For JEtty 7 - //server = new Server(new ExecutorThreadPool(50, 50, 5, TimeUnit.MILLISECONDS) ); // For JEtty 9, different parameters for the constructor - server = new Server(new ExecutorThreadPool() ); // For JEtty 9.4, different parameters for the constructor - - // // Use blocking-IO connector to improve throughput - final ServerConnector connector = new ServerConnector(server); - connector.setName( LocalPropertiesService.LOCAL_HOST + ":" + getPort()); //$NON-NLS-1$ - connector.setHost("0.0.0.0"); //$NON-NLS-1$ - //connector.setHost( LocalPropertiesService.LOCAL_HOST ); - - connector.setPort(getPort()); - - connector.setStopTimeout(1000); - - server.setConnectors(new Connector[] { connector }); - - WebAppContext wweAppContext = new WebAppContext(); - setRoot(wweAppContext); - - getRoot().setContextPath("/" + EARTH_SUBDOMAIN); //$NON-NLS-1$ - - getRoot().setDescriptor(this.getClass().getResource("/WEB-INF/web.xml").toURI().toString()); //$NON-NLS-1$ - - getRoot().setResourceBase(webappDirLocation); - - // Parent loader priority is a class loader setting that Jetty accepts. - // By default Jetty will behave like most web containers in that it will - // allow your application to replace non-server libraries that are part of the container. - // Setting parent loader priority to true changes this behaviour. - // Read more here: - // http://wiki.eclipse.org/Jetty/Reference/Jetty_Classloading - getRoot().setParentLoaderPriority(true); - - server.setHandler(getRoot()); - server.setStopAtShutdown(true); - server.start(); - setChanged(); - - Object attribute = getRoot().getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); - if (attribute instanceof BeanCreationException) { - ( (BeanCreationException) attribute).printStackTrace(System.out); - logger.error("Error creating the database connection", attribute); //$NON-NLS-1$ - notifyObservers(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT); - } else { - if (postgresConnectionSwitchedtoSqlite){ - notifyObservers(ServerInitializationEvent.SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT); - }else{ - notifyObservers(ServerInitializationEvent.SERVER_STARTED_EVENT); - } - } - } catch (final IOException e) { - logger.error("Error initializing local properties", e); //$NON-NLS-1$ - } catch (Exception e) { - logger.error("Error staring the server", e); //$NON-NLS-1$ - } - - // Force the local properties to be loaded before the browserservice is instantiated!! DO NOT REMOVE - getContext().getBean(LocalPropertiesService.class); - this.addObserver(getContext().getBean(BrowserService.class)); - - } - - public void stopServer() throws Exception { - if (server != null && server.isRunning()) { - server.stop(); - setChanged(); - notifyObservers(ServerInitializationEvent.SERVER_STOPPED_EVENT); - } - } - - - public static String getHostAddress(String host, String port) { - String hostAndPort = ""; //$NON-NLS-1$ - if (host != null && host.length() > 0) { - hostAndPort = host; - if (port != null && port.length() > 0) { - hostAndPort += ":" + port; //$NON-NLS-1$ - } - - hostAndPort = "http://" + hostAndPort + "/" + EARTH_SUBDOMAIN + "/"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - return hostAndPort; - - } -} +package org.openforis.collect.earth.app.logging; + +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; + +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.impl.client.HttpClientBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class GAlogger { + + private static final Logger logger = LoggerFactory.getLogger(GAlogger.class); + + public static void logGAnalytics(String event) { + new Thread("GA logging thread") { + + @Override + public void run() { + try { + String trackingId = "UA-55115982-1"; + HttpClient client = HttpClientBuilder.create().build(); + URIBuilder builder = new URIBuilder(); + builder.setScheme("http").setHost("www.google-analytics.com").setPath("/collect") + .addParameter("v", "1") // API Version. + .addParameter("tid", trackingId) // Tracking ID / Property ID. + // Anonymous Client Identifier. Ideally, this should be a UUID that + // is associated with particular user, device, or browser instance. + .addParameter("cid", "555").addParameter("t", "event") // Event hit type. + .addParameter("ec", "Collect Earth") // Event category. + .addParameter("ea", event); // Event action. + URI uri; + uri = builder.build(); + HttpGet request = new HttpGet(uri); + request.addHeader("user-agent", "Collect Earth Java Application"); + HttpResponse response = client.execute(request); + logger.info(event + " GA Logged - Response http " + response.getStatusLine().getStatusCode()); + } catch (URISyntaxException | IOException e) { + logger.error("Error generating URL for Analytics", e); + } + + } + }.start(); + + } +} From d785a67b1e1d969b82ba40a113fb9db89df7062a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:30 +0100 Subject: [PATCH 1006/1620] New translations GAlogger.java (Spanish) --- .../earth/app/view/Messages_es.properties | 341 +++--------------- 1 file changed, 50 insertions(+), 291 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 5b52f161d0..c05160789c 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,291 +1,50 @@ -package org.openforis.collect.earth.app.desktop; - -import java.io.File; -import java.io.IOException; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.ResultSet; -import java.sql.Statement; -import java.util.Map; -import java.util.Observable; -import java.util.Observer; - -import org.eclipse.jetty.server.Connector; -import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.server.ServerConnector; -import org.eclipse.jetty.util.thread.ExecutorThreadPool; -import org.eclipse.jetty.webapp.WebAppContext; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; -import org.openforis.collect.earth.app.service.BrowserService; -import org.openforis.collect.earth.app.service.FolderFinder; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.BeanCreationException; -import org.springframework.web.context.WebApplicationContext; -import org.springframework.web.context.support.WebApplicationContextUtils; - -import freemarker.template.TemplateException; - -/** - * Controls the Jetty server, starting and stopping it as well as reporting its staus. - * - * @author Alfonso Sanchez-Paus Diaz - * - */ -public class ServerController extends Observable { - - private static final String EARTH_SUBDOMAIN = "earth"; //$NON-NLS-1$ - - - public static final String SAIKU_RDB_SUFFIX = "Saiku"; //$NON-NLS-1$ - public static final String IPCC_RDB_SUFFIX = "Ipcc"; //$NON-NLS-1$ - - // Make sure that the default ports are the same for Server and Generator - private static final String DEFAULT_PORT = "80"; //$NON-NLS-1$ - - public enum ServerInitializationEvent{ - SERVER_STOPPED_EVENT("The Server has stopped"), - SERVER_STARTED_EVENT("The server started without problems"), - SERVER_STARTED_NO_DB_CONNECTION_EVENT("Collect Earth could not start due to a DB connection issue"), - SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT( "Collect Earth started but the PostgreSQL DB could not be reached (SQLite used instead until problems are fixed)"); - - private String message; - - private ServerInitializationEvent(String message) { - this.message = message; - } - - @Override - public String toString() { - return message; - } - - } - - private Server server; - private final Logger logger = LoggerFactory.getLogger(ServerController.class); - private WebAppContext root; - static LocalPropertiesService localPropertiesService; - - public WebApplicationContext getContext() { - WebApplicationContext webApplicationContext = null; - try { - webApplicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(getRoot().getServletContext()); - } catch (Exception e) { - logger.error("Error getting web application context", e); //$NON-NLS-1$ - } - return webApplicationContext; - } - - private static String getDbURL(final CollectDBDriver collectDBDriver) { - // jdbc:postgresql://hostname:port/dbname - - String url = collectDBDriver.getUrl(); - url = url.replace("REPLACE_HOSTNAME", localPropertiesService.getValue(EarthProperty.DB_HOST)); //$NON-NLS-1$ - url = url.replace("REPLACE_PORT", localPropertiesService.getValue(EarthProperty.DB_PORT)); //$NON-NLS-1$ - url = url.replace("REPLACE_DBNAME", localPropertiesService.getValue(EarthProperty.DB_NAME)); //$NON-NLS-1$ - return url; - } - - private int getPort() { - - String webPort = localPropertiesService.getLocalPort(); - if (webPort == null || webPort.isEmpty()) { - webPort = DEFAULT_PORT; - } - return Integer.parseInt(webPort); - } - - private WebAppContext getRoot() { - return root; - } - - private void setRoot(WebAppContext root) { - this.root = root; - } - - private boolean initilizeDataSources() throws IOException, TemplateException { - - CollectDBDriver collectDBDriver = localPropertiesService.getCollectDBDriver(); - boolean isConnectionTypeSwitched = false; - if(localPropertiesService.isUsingPostgreSqlDB() && !isPostgreSQLReachable(collectDBDriver) ){ - - logger.warn("Impossible to reach the PostgreSQL server at " + getDbURL(CollectDBDriver.POSTGRESQL)); - logger.warn("Using the SQLite version until fixed!"); - logger.error("Impossible to reach the PostgreSQL server at " + getDbURL(CollectDBDriver.POSTGRESQL) + " using SQLite version"); - collectDBDriver = CollectDBDriver.SQLITE; - isConnectionTypeSwitched = true; - } - - final File jettyAppCtxTemplateSrc = new File("resources/applicationContext.fmt"); //$NON-NLS-1$ - final File jettyAppCtxDst = new File(EarthConstants.GENERATED_FOLDER + "/applicationContext.xml"); //$NON-NLS-1$ - - jettyAppCtxDst.getParentFile().mkdirs(); - - final Map data = new java.util.HashMap<>(); - - data.put("driver", collectDBDriver.getDriverClass()); //$NON-NLS-1$ - data.put("url", getDbURL(collectDBDriver)); //$NON-NLS-1$ - data.put("urlSaiku", getSaikuDbURL(collectDBDriver)); //$NON-NLS-1$ - data.put("urlIpcc", getIpccDbURL(collectDBDriver)); //$NON-NLS-1$ - data.put("username", localPropertiesService.getValue(EarthProperty.DB_USERNAME)); //$NON-NLS-1$ - data.put("password", localPropertiesService.getValue(EarthProperty.DB_PASSWORD)); //$NON-NLS-1$ - data.put("collectEarthExecutionFolder", System.getProperty("user.dir") + File.separator); //$NON-NLS-1$ //$NON-NLS-2$ - - FreemarkerTemplateUtils.applyTemplate(jettyAppCtxTemplateSrc, jettyAppCtxDst, data); - - - return isConnectionTypeSwitched; - - } - - private boolean isPostgreSQLReachable(CollectDBDriver collectDBDriver) { - boolean connectionWorked = false; - try ( Connection connection = DriverManager.getConnection( - getDbURL(collectDBDriver), - localPropertiesService.getValue(EarthProperty.DB_USERNAME), - localPropertiesService.getValue(EarthProperty.DB_PASSWORD) - ) ){ - String query="select version()"; - try( Statement s = connection.createStatement() ){ - try( ResultSet rs=s.executeQuery(query) ){ - while(rs.next()) - { - logger.debug( "It works, there are " + rs.getString(1) + " rows on the ofc_record table"); - } - connectionWorked = true; - } - } - } - catch(Exception e){ - logger.error("Error while testing the connection to the postgresSQL DB", e); - } - - return connectionWorked; - - } - - public static String getSaikuDbURL(CollectDBDriver collectDBDriver) { - String urlSaikuDB = getDbURL(collectDBDriver); - - if (localPropertiesService.isUsingSqliteDB()) { - urlSaikuDB += EarthConstants.SAIKU_RDB_SUFFIX; - } - return urlSaikuDB; - } - - public static String getIpccDbURL(CollectDBDriver collectDBDriver) { - String urlIpccDB = getDbURL(collectDBDriver); - - if (localPropertiesService.isUsingSqliteDB()) { - urlIpccDB += IPCC_RDB_SUFFIX; - } - return urlIpccDB; - } - - public void startServer(Observer observeInitialization) throws Exception { - - localPropertiesService = new LocalPropertiesService(); - - this.addObserver(observeInitialization); - - boolean postgresConnectionSwitchedtoSqlite = initilizeDataSources(); - try { - - final String webappDirLocation = FolderFinder.getCollectEarthDataFolder(); - - // The port that we should run on can be set into an environment variable - // Look for that variable and default to 8080 if it isn't there. - - // For log4j 1.2 --> Moving to Log4J2 - //PropertyConfigurator.configure(this.getClass().getResource("/WEB-INF/conf/log4j.properties")); - - //server = new Server(new ExecutorThreadPool(10, 50, 5, TimeUnit.SECONDS)); // For JEtty 7 - //server = new Server(new ExecutorThreadPool(50, 50, 5, TimeUnit.MILLISECONDS) ); // For JEtty 9, different parameters for the constructor - server = new Server(new ExecutorThreadPool() ); // For JEtty 9.4, different parameters for the constructor - - // // Use blocking-IO connector to improve throughput - final ServerConnector connector = new ServerConnector(server); - connector.setName( LocalPropertiesService.LOCAL_HOST + ":" + getPort()); //$NON-NLS-1$ - connector.setHost("0.0.0.0"); //$NON-NLS-1$ - //connector.setHost( LocalPropertiesService.LOCAL_HOST ); - - connector.setPort(getPort()); - - connector.setStopTimeout(1000); - - server.setConnectors(new Connector[] { connector }); - - WebAppContext wweAppContext = new WebAppContext(); - setRoot(wweAppContext); - - getRoot().setContextPath("/" + EARTH_SUBDOMAIN); //$NON-NLS-1$ - - getRoot().setDescriptor(this.getClass().getResource("/WEB-INF/web.xml").toURI().toString()); //$NON-NLS-1$ - - getRoot().setResourceBase(webappDirLocation); - - // Parent loader priority is a class loader setting that Jetty accepts. - // By default Jetty will behave like most web containers in that it will - // allow your application to replace non-server libraries that are part of the container. - // Setting parent loader priority to true changes this behaviour. - // Read more here: - // http://wiki.eclipse.org/Jetty/Reference/Jetty_Classloading - getRoot().setParentLoaderPriority(true); - - server.setHandler(getRoot()); - server.setStopAtShutdown(true); - server.start(); - setChanged(); - - Object attribute = getRoot().getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); - if (attribute instanceof BeanCreationException) { - ( (BeanCreationException) attribute).printStackTrace(System.out); - logger.error("Error creating the database connection", attribute); //$NON-NLS-1$ - notifyObservers(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT); - } else { - if (postgresConnectionSwitchedtoSqlite){ - notifyObservers(ServerInitializationEvent.SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT); - }else{ - notifyObservers(ServerInitializationEvent.SERVER_STARTED_EVENT); - } - } - } catch (final IOException e) { - logger.error("Error initializing local properties", e); //$NON-NLS-1$ - } catch (Exception e) { - logger.error("Error staring the server", e); //$NON-NLS-1$ - } - - // Force the local properties to be loaded before the browserservice is instantiated!! DO NOT REMOVE - getContext().getBean(LocalPropertiesService.class); - this.addObserver(getContext().getBean(BrowserService.class)); - - } - - public void stopServer() throws Exception { - if (server != null && server.isRunning()) { - server.stop(); - setChanged(); - notifyObservers(ServerInitializationEvent.SERVER_STOPPED_EVENT); - } - } - - - public static String getHostAddress(String host, String port) { - String hostAndPort = ""; //$NON-NLS-1$ - if (host != null && host.length() > 0) { - hostAndPort = host; - if (port != null && port.length() > 0) { - hostAndPort += ":" + port; //$NON-NLS-1$ - } - - hostAndPort = "http://" + hostAndPort + "/" + EARTH_SUBDOMAIN + "/"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - return hostAndPort; - - } -} +package org.openforis.collect.earth.app.logging; + +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; + +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.impl.client.HttpClientBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class GAlogger { + + private static final Logger logger = LoggerFactory.getLogger(GAlogger.class); + + public static void logGAnalytics(String event) { + new Thread("GA logging thread") { + + @Override + public void run() { + try { + String trackingId = "UA-55115982-1"; + HttpClient client = HttpClientBuilder.create().build(); + URIBuilder builder = new URIBuilder(); + builder.setScheme("http").setHost("www.google-analytics.com").setPath("/collect") + .addParameter("v", "1") // API Version. + .addParameter("tid", trackingId) // Tracking ID / Property ID. + // Anonymous Client Identifier. Ideally, this should be a UUID that + // is associated with particular user, device, or browser instance. + .addParameter("cid", "555").addParameter("t", "event") // Event hit type. + .addParameter("ec", "Collect Earth") // Event category. + .addParameter("ea", event); // Event action. + URI uri; + uri = builder.build(); + HttpGet request = new HttpGet(uri); + request.addHeader("user-agent", "Collect Earth Java Application"); + HttpResponse response = client.execute(request); + logger.info(event + " GA Logged - Response http " + response.getStatusLine().getStatusCode()); + } catch (URISyntaxException | IOException e) { + logger.error("Error generating URL for Analytics", e); + } + + } + }.start(); + + } +} From 291ecbcc71ad2d07f4b91df447e93949d39d9b23 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:32 +0100 Subject: [PATCH 1007/1620] New translations GAlogger.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 341 +++--------------- 1 file changed, 50 insertions(+), 291 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 5b52f161d0..c05160789c 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,291 +1,50 @@ -package org.openforis.collect.earth.app.desktop; - -import java.io.File; -import java.io.IOException; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.ResultSet; -import java.sql.Statement; -import java.util.Map; -import java.util.Observable; -import java.util.Observer; - -import org.eclipse.jetty.server.Connector; -import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.server.ServerConnector; -import org.eclipse.jetty.util.thread.ExecutorThreadPool; -import org.eclipse.jetty.webapp.WebAppContext; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; -import org.openforis.collect.earth.app.service.BrowserService; -import org.openforis.collect.earth.app.service.FolderFinder; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.BeanCreationException; -import org.springframework.web.context.WebApplicationContext; -import org.springframework.web.context.support.WebApplicationContextUtils; - -import freemarker.template.TemplateException; - -/** - * Controls the Jetty server, starting and stopping it as well as reporting its staus. - * - * @author Alfonso Sanchez-Paus Diaz - * - */ -public class ServerController extends Observable { - - private static final String EARTH_SUBDOMAIN = "earth"; //$NON-NLS-1$ - - - public static final String SAIKU_RDB_SUFFIX = "Saiku"; //$NON-NLS-1$ - public static final String IPCC_RDB_SUFFIX = "Ipcc"; //$NON-NLS-1$ - - // Make sure that the default ports are the same for Server and Generator - private static final String DEFAULT_PORT = "80"; //$NON-NLS-1$ - - public enum ServerInitializationEvent{ - SERVER_STOPPED_EVENT("The Server has stopped"), - SERVER_STARTED_EVENT("The server started without problems"), - SERVER_STARTED_NO_DB_CONNECTION_EVENT("Collect Earth could not start due to a DB connection issue"), - SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT( "Collect Earth started but the PostgreSQL DB could not be reached (SQLite used instead until problems are fixed)"); - - private String message; - - private ServerInitializationEvent(String message) { - this.message = message; - } - - @Override - public String toString() { - return message; - } - - } - - private Server server; - private final Logger logger = LoggerFactory.getLogger(ServerController.class); - private WebAppContext root; - static LocalPropertiesService localPropertiesService; - - public WebApplicationContext getContext() { - WebApplicationContext webApplicationContext = null; - try { - webApplicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(getRoot().getServletContext()); - } catch (Exception e) { - logger.error("Error getting web application context", e); //$NON-NLS-1$ - } - return webApplicationContext; - } - - private static String getDbURL(final CollectDBDriver collectDBDriver) { - // jdbc:postgresql://hostname:port/dbname - - String url = collectDBDriver.getUrl(); - url = url.replace("REPLACE_HOSTNAME", localPropertiesService.getValue(EarthProperty.DB_HOST)); //$NON-NLS-1$ - url = url.replace("REPLACE_PORT", localPropertiesService.getValue(EarthProperty.DB_PORT)); //$NON-NLS-1$ - url = url.replace("REPLACE_DBNAME", localPropertiesService.getValue(EarthProperty.DB_NAME)); //$NON-NLS-1$ - return url; - } - - private int getPort() { - - String webPort = localPropertiesService.getLocalPort(); - if (webPort == null || webPort.isEmpty()) { - webPort = DEFAULT_PORT; - } - return Integer.parseInt(webPort); - } - - private WebAppContext getRoot() { - return root; - } - - private void setRoot(WebAppContext root) { - this.root = root; - } - - private boolean initilizeDataSources() throws IOException, TemplateException { - - CollectDBDriver collectDBDriver = localPropertiesService.getCollectDBDriver(); - boolean isConnectionTypeSwitched = false; - if(localPropertiesService.isUsingPostgreSqlDB() && !isPostgreSQLReachable(collectDBDriver) ){ - - logger.warn("Impossible to reach the PostgreSQL server at " + getDbURL(CollectDBDriver.POSTGRESQL)); - logger.warn("Using the SQLite version until fixed!"); - logger.error("Impossible to reach the PostgreSQL server at " + getDbURL(CollectDBDriver.POSTGRESQL) + " using SQLite version"); - collectDBDriver = CollectDBDriver.SQLITE; - isConnectionTypeSwitched = true; - } - - final File jettyAppCtxTemplateSrc = new File("resources/applicationContext.fmt"); //$NON-NLS-1$ - final File jettyAppCtxDst = new File(EarthConstants.GENERATED_FOLDER + "/applicationContext.xml"); //$NON-NLS-1$ - - jettyAppCtxDst.getParentFile().mkdirs(); - - final Map data = new java.util.HashMap<>(); - - data.put("driver", collectDBDriver.getDriverClass()); //$NON-NLS-1$ - data.put("url", getDbURL(collectDBDriver)); //$NON-NLS-1$ - data.put("urlSaiku", getSaikuDbURL(collectDBDriver)); //$NON-NLS-1$ - data.put("urlIpcc", getIpccDbURL(collectDBDriver)); //$NON-NLS-1$ - data.put("username", localPropertiesService.getValue(EarthProperty.DB_USERNAME)); //$NON-NLS-1$ - data.put("password", localPropertiesService.getValue(EarthProperty.DB_PASSWORD)); //$NON-NLS-1$ - data.put("collectEarthExecutionFolder", System.getProperty("user.dir") + File.separator); //$NON-NLS-1$ //$NON-NLS-2$ - - FreemarkerTemplateUtils.applyTemplate(jettyAppCtxTemplateSrc, jettyAppCtxDst, data); - - - return isConnectionTypeSwitched; - - } - - private boolean isPostgreSQLReachable(CollectDBDriver collectDBDriver) { - boolean connectionWorked = false; - try ( Connection connection = DriverManager.getConnection( - getDbURL(collectDBDriver), - localPropertiesService.getValue(EarthProperty.DB_USERNAME), - localPropertiesService.getValue(EarthProperty.DB_PASSWORD) - ) ){ - String query="select version()"; - try( Statement s = connection.createStatement() ){ - try( ResultSet rs=s.executeQuery(query) ){ - while(rs.next()) - { - logger.debug( "It works, there are " + rs.getString(1) + " rows on the ofc_record table"); - } - connectionWorked = true; - } - } - } - catch(Exception e){ - logger.error("Error while testing the connection to the postgresSQL DB", e); - } - - return connectionWorked; - - } - - public static String getSaikuDbURL(CollectDBDriver collectDBDriver) { - String urlSaikuDB = getDbURL(collectDBDriver); - - if (localPropertiesService.isUsingSqliteDB()) { - urlSaikuDB += EarthConstants.SAIKU_RDB_SUFFIX; - } - return urlSaikuDB; - } - - public static String getIpccDbURL(CollectDBDriver collectDBDriver) { - String urlIpccDB = getDbURL(collectDBDriver); - - if (localPropertiesService.isUsingSqliteDB()) { - urlIpccDB += IPCC_RDB_SUFFIX; - } - return urlIpccDB; - } - - public void startServer(Observer observeInitialization) throws Exception { - - localPropertiesService = new LocalPropertiesService(); - - this.addObserver(observeInitialization); - - boolean postgresConnectionSwitchedtoSqlite = initilizeDataSources(); - try { - - final String webappDirLocation = FolderFinder.getCollectEarthDataFolder(); - - // The port that we should run on can be set into an environment variable - // Look for that variable and default to 8080 if it isn't there. - - // For log4j 1.2 --> Moving to Log4J2 - //PropertyConfigurator.configure(this.getClass().getResource("/WEB-INF/conf/log4j.properties")); - - //server = new Server(new ExecutorThreadPool(10, 50, 5, TimeUnit.SECONDS)); // For JEtty 7 - //server = new Server(new ExecutorThreadPool(50, 50, 5, TimeUnit.MILLISECONDS) ); // For JEtty 9, different parameters for the constructor - server = new Server(new ExecutorThreadPool() ); // For JEtty 9.4, different parameters for the constructor - - // // Use blocking-IO connector to improve throughput - final ServerConnector connector = new ServerConnector(server); - connector.setName( LocalPropertiesService.LOCAL_HOST + ":" + getPort()); //$NON-NLS-1$ - connector.setHost("0.0.0.0"); //$NON-NLS-1$ - //connector.setHost( LocalPropertiesService.LOCAL_HOST ); - - connector.setPort(getPort()); - - connector.setStopTimeout(1000); - - server.setConnectors(new Connector[] { connector }); - - WebAppContext wweAppContext = new WebAppContext(); - setRoot(wweAppContext); - - getRoot().setContextPath("/" + EARTH_SUBDOMAIN); //$NON-NLS-1$ - - getRoot().setDescriptor(this.getClass().getResource("/WEB-INF/web.xml").toURI().toString()); //$NON-NLS-1$ - - getRoot().setResourceBase(webappDirLocation); - - // Parent loader priority is a class loader setting that Jetty accepts. - // By default Jetty will behave like most web containers in that it will - // allow your application to replace non-server libraries that are part of the container. - // Setting parent loader priority to true changes this behaviour. - // Read more here: - // http://wiki.eclipse.org/Jetty/Reference/Jetty_Classloading - getRoot().setParentLoaderPriority(true); - - server.setHandler(getRoot()); - server.setStopAtShutdown(true); - server.start(); - setChanged(); - - Object attribute = getRoot().getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); - if (attribute instanceof BeanCreationException) { - ( (BeanCreationException) attribute).printStackTrace(System.out); - logger.error("Error creating the database connection", attribute); //$NON-NLS-1$ - notifyObservers(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT); - } else { - if (postgresConnectionSwitchedtoSqlite){ - notifyObservers(ServerInitializationEvent.SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT); - }else{ - notifyObservers(ServerInitializationEvent.SERVER_STARTED_EVENT); - } - } - } catch (final IOException e) { - logger.error("Error initializing local properties", e); //$NON-NLS-1$ - } catch (Exception e) { - logger.error("Error staring the server", e); //$NON-NLS-1$ - } - - // Force the local properties to be loaded before the browserservice is instantiated!! DO NOT REMOVE - getContext().getBean(LocalPropertiesService.class); - this.addObserver(getContext().getBean(BrowserService.class)); - - } - - public void stopServer() throws Exception { - if (server != null && server.isRunning()) { - server.stop(); - setChanged(); - notifyObservers(ServerInitializationEvent.SERVER_STOPPED_EVENT); - } - } - - - public static String getHostAddress(String host, String port) { - String hostAndPort = ""; //$NON-NLS-1$ - if (host != null && host.length() > 0) { - hostAndPort = host; - if (port != null && port.length() > 0) { - hostAndPort += ":" + port; //$NON-NLS-1$ - } - - hostAndPort = "http://" + hostAndPort + "/" + EARTH_SUBDOMAIN + "/"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - return hostAndPort; - - } -} +package org.openforis.collect.earth.app.logging; + +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; + +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.impl.client.HttpClientBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class GAlogger { + + private static final Logger logger = LoggerFactory.getLogger(GAlogger.class); + + public static void logGAnalytics(String event) { + new Thread("GA logging thread") { + + @Override + public void run() { + try { + String trackingId = "UA-55115982-1"; + HttpClient client = HttpClientBuilder.create().build(); + URIBuilder builder = new URIBuilder(); + builder.setScheme("http").setHost("www.google-analytics.com").setPath("/collect") + .addParameter("v", "1") // API Version. + .addParameter("tid", trackingId) // Tracking ID / Property ID. + // Anonymous Client Identifier. Ideally, this should be a UUID that + // is associated with particular user, device, or browser instance. + .addParameter("cid", "555").addParameter("t", "event") // Event hit type. + .addParameter("ec", "Collect Earth") // Event category. + .addParameter("ea", event); // Event action. + URI uri; + uri = builder.build(); + HttpGet request = new HttpGet(uri); + request.addHeader("user-agent", "Collect Earth Java Application"); + HttpResponse response = client.execute(request); + logger.info(event + " GA Logged - Response http " + response.getStatusLine().getStatusCode()); + } catch (URISyntaxException | IOException e) { + logger.error("Error generating URL for Analytics", e); + } + + } + }.start(); + + } +} From de528244f5969f28e9ae0995098c91ddc0affb41 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:33 +0100 Subject: [PATCH 1008/1620] New translations GAlogger.java (English) --- .../earth/app/view/Messages_en.properties | 341 +++--------------- 1 file changed, 50 insertions(+), 291 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 5b52f161d0..c05160789c 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,291 +1,50 @@ -package org.openforis.collect.earth.app.desktop; - -import java.io.File; -import java.io.IOException; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.ResultSet; -import java.sql.Statement; -import java.util.Map; -import java.util.Observable; -import java.util.Observer; - -import org.eclipse.jetty.server.Connector; -import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.server.ServerConnector; -import org.eclipse.jetty.util.thread.ExecutorThreadPool; -import org.eclipse.jetty.webapp.WebAppContext; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; -import org.openforis.collect.earth.app.service.BrowserService; -import org.openforis.collect.earth.app.service.FolderFinder; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.BeanCreationException; -import org.springframework.web.context.WebApplicationContext; -import org.springframework.web.context.support.WebApplicationContextUtils; - -import freemarker.template.TemplateException; - -/** - * Controls the Jetty server, starting and stopping it as well as reporting its staus. - * - * @author Alfonso Sanchez-Paus Diaz - * - */ -public class ServerController extends Observable { - - private static final String EARTH_SUBDOMAIN = "earth"; //$NON-NLS-1$ - - - public static final String SAIKU_RDB_SUFFIX = "Saiku"; //$NON-NLS-1$ - public static final String IPCC_RDB_SUFFIX = "Ipcc"; //$NON-NLS-1$ - - // Make sure that the default ports are the same for Server and Generator - private static final String DEFAULT_PORT = "80"; //$NON-NLS-1$ - - public enum ServerInitializationEvent{ - SERVER_STOPPED_EVENT("The Server has stopped"), - SERVER_STARTED_EVENT("The server started without problems"), - SERVER_STARTED_NO_DB_CONNECTION_EVENT("Collect Earth could not start due to a DB connection issue"), - SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT( "Collect Earth started but the PostgreSQL DB could not be reached (SQLite used instead until problems are fixed)"); - - private String message; - - private ServerInitializationEvent(String message) { - this.message = message; - } - - @Override - public String toString() { - return message; - } - - } - - private Server server; - private final Logger logger = LoggerFactory.getLogger(ServerController.class); - private WebAppContext root; - static LocalPropertiesService localPropertiesService; - - public WebApplicationContext getContext() { - WebApplicationContext webApplicationContext = null; - try { - webApplicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(getRoot().getServletContext()); - } catch (Exception e) { - logger.error("Error getting web application context", e); //$NON-NLS-1$ - } - return webApplicationContext; - } - - private static String getDbURL(final CollectDBDriver collectDBDriver) { - // jdbc:postgresql://hostname:port/dbname - - String url = collectDBDriver.getUrl(); - url = url.replace("REPLACE_HOSTNAME", localPropertiesService.getValue(EarthProperty.DB_HOST)); //$NON-NLS-1$ - url = url.replace("REPLACE_PORT", localPropertiesService.getValue(EarthProperty.DB_PORT)); //$NON-NLS-1$ - url = url.replace("REPLACE_DBNAME", localPropertiesService.getValue(EarthProperty.DB_NAME)); //$NON-NLS-1$ - return url; - } - - private int getPort() { - - String webPort = localPropertiesService.getLocalPort(); - if (webPort == null || webPort.isEmpty()) { - webPort = DEFAULT_PORT; - } - return Integer.parseInt(webPort); - } - - private WebAppContext getRoot() { - return root; - } - - private void setRoot(WebAppContext root) { - this.root = root; - } - - private boolean initilizeDataSources() throws IOException, TemplateException { - - CollectDBDriver collectDBDriver = localPropertiesService.getCollectDBDriver(); - boolean isConnectionTypeSwitched = false; - if(localPropertiesService.isUsingPostgreSqlDB() && !isPostgreSQLReachable(collectDBDriver) ){ - - logger.warn("Impossible to reach the PostgreSQL server at " + getDbURL(CollectDBDriver.POSTGRESQL)); - logger.warn("Using the SQLite version until fixed!"); - logger.error("Impossible to reach the PostgreSQL server at " + getDbURL(CollectDBDriver.POSTGRESQL) + " using SQLite version"); - collectDBDriver = CollectDBDriver.SQLITE; - isConnectionTypeSwitched = true; - } - - final File jettyAppCtxTemplateSrc = new File("resources/applicationContext.fmt"); //$NON-NLS-1$ - final File jettyAppCtxDst = new File(EarthConstants.GENERATED_FOLDER + "/applicationContext.xml"); //$NON-NLS-1$ - - jettyAppCtxDst.getParentFile().mkdirs(); - - final Map data = new java.util.HashMap<>(); - - data.put("driver", collectDBDriver.getDriverClass()); //$NON-NLS-1$ - data.put("url", getDbURL(collectDBDriver)); //$NON-NLS-1$ - data.put("urlSaiku", getSaikuDbURL(collectDBDriver)); //$NON-NLS-1$ - data.put("urlIpcc", getIpccDbURL(collectDBDriver)); //$NON-NLS-1$ - data.put("username", localPropertiesService.getValue(EarthProperty.DB_USERNAME)); //$NON-NLS-1$ - data.put("password", localPropertiesService.getValue(EarthProperty.DB_PASSWORD)); //$NON-NLS-1$ - data.put("collectEarthExecutionFolder", System.getProperty("user.dir") + File.separator); //$NON-NLS-1$ //$NON-NLS-2$ - - FreemarkerTemplateUtils.applyTemplate(jettyAppCtxTemplateSrc, jettyAppCtxDst, data); - - - return isConnectionTypeSwitched; - - } - - private boolean isPostgreSQLReachable(CollectDBDriver collectDBDriver) { - boolean connectionWorked = false; - try ( Connection connection = DriverManager.getConnection( - getDbURL(collectDBDriver), - localPropertiesService.getValue(EarthProperty.DB_USERNAME), - localPropertiesService.getValue(EarthProperty.DB_PASSWORD) - ) ){ - String query="select version()"; - try( Statement s = connection.createStatement() ){ - try( ResultSet rs=s.executeQuery(query) ){ - while(rs.next()) - { - logger.debug( "It works, there are " + rs.getString(1) + " rows on the ofc_record table"); - } - connectionWorked = true; - } - } - } - catch(Exception e){ - logger.error("Error while testing the connection to the postgresSQL DB", e); - } - - return connectionWorked; - - } - - public static String getSaikuDbURL(CollectDBDriver collectDBDriver) { - String urlSaikuDB = getDbURL(collectDBDriver); - - if (localPropertiesService.isUsingSqliteDB()) { - urlSaikuDB += EarthConstants.SAIKU_RDB_SUFFIX; - } - return urlSaikuDB; - } - - public static String getIpccDbURL(CollectDBDriver collectDBDriver) { - String urlIpccDB = getDbURL(collectDBDriver); - - if (localPropertiesService.isUsingSqliteDB()) { - urlIpccDB += IPCC_RDB_SUFFIX; - } - return urlIpccDB; - } - - public void startServer(Observer observeInitialization) throws Exception { - - localPropertiesService = new LocalPropertiesService(); - - this.addObserver(observeInitialization); - - boolean postgresConnectionSwitchedtoSqlite = initilizeDataSources(); - try { - - final String webappDirLocation = FolderFinder.getCollectEarthDataFolder(); - - // The port that we should run on can be set into an environment variable - // Look for that variable and default to 8080 if it isn't there. - - // For log4j 1.2 --> Moving to Log4J2 - //PropertyConfigurator.configure(this.getClass().getResource("/WEB-INF/conf/log4j.properties")); - - //server = new Server(new ExecutorThreadPool(10, 50, 5, TimeUnit.SECONDS)); // For JEtty 7 - //server = new Server(new ExecutorThreadPool(50, 50, 5, TimeUnit.MILLISECONDS) ); // For JEtty 9, different parameters for the constructor - server = new Server(new ExecutorThreadPool() ); // For JEtty 9.4, different parameters for the constructor - - // // Use blocking-IO connector to improve throughput - final ServerConnector connector = new ServerConnector(server); - connector.setName( LocalPropertiesService.LOCAL_HOST + ":" + getPort()); //$NON-NLS-1$ - connector.setHost("0.0.0.0"); //$NON-NLS-1$ - //connector.setHost( LocalPropertiesService.LOCAL_HOST ); - - connector.setPort(getPort()); - - connector.setStopTimeout(1000); - - server.setConnectors(new Connector[] { connector }); - - WebAppContext wweAppContext = new WebAppContext(); - setRoot(wweAppContext); - - getRoot().setContextPath("/" + EARTH_SUBDOMAIN); //$NON-NLS-1$ - - getRoot().setDescriptor(this.getClass().getResource("/WEB-INF/web.xml").toURI().toString()); //$NON-NLS-1$ - - getRoot().setResourceBase(webappDirLocation); - - // Parent loader priority is a class loader setting that Jetty accepts. - // By default Jetty will behave like most web containers in that it will - // allow your application to replace non-server libraries that are part of the container. - // Setting parent loader priority to true changes this behaviour. - // Read more here: - // http://wiki.eclipse.org/Jetty/Reference/Jetty_Classloading - getRoot().setParentLoaderPriority(true); - - server.setHandler(getRoot()); - server.setStopAtShutdown(true); - server.start(); - setChanged(); - - Object attribute = getRoot().getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); - if (attribute instanceof BeanCreationException) { - ( (BeanCreationException) attribute).printStackTrace(System.out); - logger.error("Error creating the database connection", attribute); //$NON-NLS-1$ - notifyObservers(ServerInitializationEvent.SERVER_STARTED_NO_DB_CONNECTION_EVENT); - } else { - if (postgresConnectionSwitchedtoSqlite){ - notifyObservers(ServerInitializationEvent.SERVER_STARTED_WITH_DATABASE_CHANGE_EVENT); - }else{ - notifyObservers(ServerInitializationEvent.SERVER_STARTED_EVENT); - } - } - } catch (final IOException e) { - logger.error("Error initializing local properties", e); //$NON-NLS-1$ - } catch (Exception e) { - logger.error("Error staring the server", e); //$NON-NLS-1$ - } - - // Force the local properties to be loaded before the browserservice is instantiated!! DO NOT REMOVE - getContext().getBean(LocalPropertiesService.class); - this.addObserver(getContext().getBean(BrowserService.class)); - - } - - public void stopServer() throws Exception { - if (server != null && server.isRunning()) { - server.stop(); - setChanged(); - notifyObservers(ServerInitializationEvent.SERVER_STOPPED_EVENT); - } - } - - - public static String getHostAddress(String host, String port) { - String hostAndPort = ""; //$NON-NLS-1$ - if (host != null && host.length() > 0) { - hostAndPort = host; - if (port != null && port.length() > 0) { - hostAndPort += ":" + port; //$NON-NLS-1$ - } - - hostAndPort = "http://" + hostAndPort + "/" + EARTH_SUBDOMAIN + "/"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - return hostAndPort; - - } -} +package org.openforis.collect.earth.app.logging; + +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; + +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.impl.client.HttpClientBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class GAlogger { + + private static final Logger logger = LoggerFactory.getLogger(GAlogger.class); + + public static void logGAnalytics(String event) { + new Thread("GA logging thread") { + + @Override + public void run() { + try { + String trackingId = "UA-55115982-1"; + HttpClient client = HttpClientBuilder.create().build(); + URIBuilder builder = new URIBuilder(); + builder.setScheme("http").setHost("www.google-analytics.com").setPath("/collect") + .addParameter("v", "1") // API Version. + .addParameter("tid", trackingId) // Tracking ID / Property ID. + // Anonymous Client Identifier. Ideally, this should be a UUID that + // is associated with particular user, device, or browser instance. + .addParameter("cid", "555").addParameter("t", "event") // Event hit type. + .addParameter("ec", "Collect Earth") // Event category. + .addParameter("ea", event); // Event action. + URI uri; + uri = builder.build(); + HttpGet request = new HttpGet(uri); + request.addHeader("user-agent", "Collect Earth Java Application"); + HttpResponse response = client.execute(request); + logger.info(event + " GA Logged - Response http " + response.getStatusLine().getStatusCode()); + } catch (URISyntaxException | IOException e) { + logger.error("Error generating URL for Analytics", e); + } + + } + }.start(); + + } +} From 9b9854d10552e87aa65042fd0c9d6082c85928d6 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:34 +0100 Subject: [PATCH 1009/1620] New translations JSwingAppender.java (French) --- .../earth/app/view/Messages_fr.properties | 144 ++++++++++++------ 1 file changed, 94 insertions(+), 50 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index c05160789c..9f9883c25f 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,50 +1,94 @@ -package org.openforis.collect.earth.app.logging; - -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; - -import org.apache.http.HttpResponse; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.impl.client.HttpClientBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class GAlogger { - - private static final Logger logger = LoggerFactory.getLogger(GAlogger.class); - - public static void logGAnalytics(String event) { - new Thread("GA logging thread") { - - @Override - public void run() { - try { - String trackingId = "UA-55115982-1"; - HttpClient client = HttpClientBuilder.create().build(); - URIBuilder builder = new URIBuilder(); - builder.setScheme("http").setHost("www.google-analytics.com").setPath("/collect") - .addParameter("v", "1") // API Version. - .addParameter("tid", trackingId) // Tracking ID / Property ID. - // Anonymous Client Identifier. Ideally, this should be a UUID that - // is associated with particular user, device, or browser instance. - .addParameter("cid", "555").addParameter("t", "event") // Event hit type. - .addParameter("ec", "Collect Earth") // Event category. - .addParameter("ea", event); // Event action. - URI uri; - uri = builder.build(); - HttpGet request = new HttpGet(uri); - request.addHeader("user-agent", "Collect Earth Java Application"); - HttpResponse response = client.execute(request); - logger.info(event + " GA Logged - Response http " + response.getStatusLine().getStatusCode()); - } catch (URISyntaxException | IOException e) { - logger.error("Error generating URL for Analytics", e); - } - - } - }.start(); - - } -} +package org.openforis.collect.earth.app.logging; + +import java.awt.Dimension; + +import javax.swing.JEditorPane; +import javax.swing.JOptionPane; +import javax.swing.JScrollPane; +import javax.swing.SwingUtilities; + +import org.apache.logging.log4j.core.Filter; +import org.apache.logging.log4j.core.Layout; +import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.core.appender.AbstractAppender; +import org.apache.logging.log4j.core.config.Property; +import org.apache.logging.log4j.core.config.plugins.Plugin; +import org.apache.logging.log4j.core.config.plugins.PluginAttribute; +import org.apache.logging.log4j.core.config.plugins.PluginElement; +import org.apache.logging.log4j.core.config.plugins.PluginFactory; +import org.apache.logging.log4j.core.layout.PatternLayout; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Plugin(name = "JSwingAppender", category = "Core", elementType = "appender", printObject = true) +public class JSwingAppender extends AbstractAppender { + + private Boolean showException; + + private Logger logger = LoggerFactory.getLogger( JSwingAppender.class ); + + public JSwingAppender(String name, Filter filter, Layout layout, boolean ignoreExceptions, Property[] properties) { + super(name, filter, layout, ignoreExceptions, properties); + } + + @PluginFactory + public static JSwingAppender createAppender(@PluginAttribute("name") String name, + @PluginElement("Layout") Layout layout, @PluginElement("Filters") Filter filter, + @PluginAttribute("ignoreExceptions") boolean ignoreExceptions) { + + if (name == null) { + LoggerFactory.getLogger( JSwingAppender.class ).error("No name provided for JTextAreaAppender"); + return null; + } + + if (layout == null) { + layout = PatternLayout.createDefaultLayout(); + } + return new JSwingAppender(name, filter, layout, ignoreExceptions, Property.EMPTY_ARRAY); + } + + @Override + public void append(LogEvent event) { + try { + if( isExceptionShown() ) { + final String message = new String(this.getLayout().toByteArray(event)).replaceAll("(\r\n|\n)", "
"); + + // Append formatted message to text area using the Thread. + + SwingUtilities.invokeLater( () -> { + try { + JEditorPane web = new JEditorPane(); + web.setEditable(false); + web.setContentType("text/html"); + web.setText(message); + + JScrollPane scrollPane = new JScrollPane(web); + scrollPane.setPreferredSize(new Dimension(450, 350)); + + JOptionPane.showMessageDialog(null, scrollPane, "Error has been loogged", JOptionPane.ERROR_MESSAGE); + }catch (Exception e) { + // Avoid creating an infinite loop by catching this exception and not logging it as error + logger.debug("Error shown exception", e); + } + } ); + } + } catch (final Exception e) { + // ignore case when the platform hasn't yet been initialized + logger.debug("Error shown exception", e); + } + + } + + private boolean isExceptionShown() { + if( showException == null ) { + LocalPropertiesService localPropertiesService = new LocalPropertiesService(); + showException = localPropertiesService.isExceptionShown(); + } + return showException; + } + + public void setExceptionShown(Boolean showException) { + this.showException = showException; + } +} \ No newline at end of file From 5c0a2cdb51f075860002208dec18dbb3ac35bb41 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:35 +0100 Subject: [PATCH 1010/1620] New translations JSwingAppender.java (Spanish) --- .../earth/app/view/Messages_es.properties | 144 ++++++++++++------ 1 file changed, 94 insertions(+), 50 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index c05160789c..9f9883c25f 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,50 +1,94 @@ -package org.openforis.collect.earth.app.logging; - -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; - -import org.apache.http.HttpResponse; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.impl.client.HttpClientBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class GAlogger { - - private static final Logger logger = LoggerFactory.getLogger(GAlogger.class); - - public static void logGAnalytics(String event) { - new Thread("GA logging thread") { - - @Override - public void run() { - try { - String trackingId = "UA-55115982-1"; - HttpClient client = HttpClientBuilder.create().build(); - URIBuilder builder = new URIBuilder(); - builder.setScheme("http").setHost("www.google-analytics.com").setPath("/collect") - .addParameter("v", "1") // API Version. - .addParameter("tid", trackingId) // Tracking ID / Property ID. - // Anonymous Client Identifier. Ideally, this should be a UUID that - // is associated with particular user, device, or browser instance. - .addParameter("cid", "555").addParameter("t", "event") // Event hit type. - .addParameter("ec", "Collect Earth") // Event category. - .addParameter("ea", event); // Event action. - URI uri; - uri = builder.build(); - HttpGet request = new HttpGet(uri); - request.addHeader("user-agent", "Collect Earth Java Application"); - HttpResponse response = client.execute(request); - logger.info(event + " GA Logged - Response http " + response.getStatusLine().getStatusCode()); - } catch (URISyntaxException | IOException e) { - logger.error("Error generating URL for Analytics", e); - } - - } - }.start(); - - } -} +package org.openforis.collect.earth.app.logging; + +import java.awt.Dimension; + +import javax.swing.JEditorPane; +import javax.swing.JOptionPane; +import javax.swing.JScrollPane; +import javax.swing.SwingUtilities; + +import org.apache.logging.log4j.core.Filter; +import org.apache.logging.log4j.core.Layout; +import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.core.appender.AbstractAppender; +import org.apache.logging.log4j.core.config.Property; +import org.apache.logging.log4j.core.config.plugins.Plugin; +import org.apache.logging.log4j.core.config.plugins.PluginAttribute; +import org.apache.logging.log4j.core.config.plugins.PluginElement; +import org.apache.logging.log4j.core.config.plugins.PluginFactory; +import org.apache.logging.log4j.core.layout.PatternLayout; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Plugin(name = "JSwingAppender", category = "Core", elementType = "appender", printObject = true) +public class JSwingAppender extends AbstractAppender { + + private Boolean showException; + + private Logger logger = LoggerFactory.getLogger( JSwingAppender.class ); + + public JSwingAppender(String name, Filter filter, Layout layout, boolean ignoreExceptions, Property[] properties) { + super(name, filter, layout, ignoreExceptions, properties); + } + + @PluginFactory + public static JSwingAppender createAppender(@PluginAttribute("name") String name, + @PluginElement("Layout") Layout layout, @PluginElement("Filters") Filter filter, + @PluginAttribute("ignoreExceptions") boolean ignoreExceptions) { + + if (name == null) { + LoggerFactory.getLogger( JSwingAppender.class ).error("No name provided for JTextAreaAppender"); + return null; + } + + if (layout == null) { + layout = PatternLayout.createDefaultLayout(); + } + return new JSwingAppender(name, filter, layout, ignoreExceptions, Property.EMPTY_ARRAY); + } + + @Override + public void append(LogEvent event) { + try { + if( isExceptionShown() ) { + final String message = new String(this.getLayout().toByteArray(event)).replaceAll("(\r\n|\n)", "
"); + + // Append formatted message to text area using the Thread. + + SwingUtilities.invokeLater( () -> { + try { + JEditorPane web = new JEditorPane(); + web.setEditable(false); + web.setContentType("text/html"); + web.setText(message); + + JScrollPane scrollPane = new JScrollPane(web); + scrollPane.setPreferredSize(new Dimension(450, 350)); + + JOptionPane.showMessageDialog(null, scrollPane, "Error has been loogged", JOptionPane.ERROR_MESSAGE); + }catch (Exception e) { + // Avoid creating an infinite loop by catching this exception and not logging it as error + logger.debug("Error shown exception", e); + } + } ); + } + } catch (final Exception e) { + // ignore case when the platform hasn't yet been initialized + logger.debug("Error shown exception", e); + } + + } + + private boolean isExceptionShown() { + if( showException == null ) { + LocalPropertiesService localPropertiesService = new LocalPropertiesService(); + showException = localPropertiesService.isExceptionShown(); + } + return showException; + } + + public void setExceptionShown(Boolean showException) { + this.showException = showException; + } +} \ No newline at end of file From 2ebf0e69f5f6d146039c87c669cf4b177634cee1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:36 +0100 Subject: [PATCH 1011/1620] New translations LoadProjectFileServlet.java (English) --- .../earth/app/view/Messages_en.properties | 129 +++++++++++------- 1 file changed, 79 insertions(+), 50 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index c05160789c..93a4d09fe6 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,50 +1,79 @@ -package org.openforis.collect.earth.app.logging; - -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; - -import org.apache.http.HttpResponse; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.impl.client.HttpClientBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class GAlogger { - - private static final Logger logger = LoggerFactory.getLogger(GAlogger.class); - - public static void logGAnalytics(String event) { - new Thread("GA logging thread") { - - @Override - public void run() { - try { - String trackingId = "UA-55115982-1"; - HttpClient client = HttpClientBuilder.create().build(); - URIBuilder builder = new URIBuilder(); - builder.setScheme("http").setHost("www.google-analytics.com").setPath("/collect") - .addParameter("v", "1") // API Version. - .addParameter("tid", trackingId) // Tracking ID / Property ID. - // Anonymous Client Identifier. Ideally, this should be a UUID that - // is associated with particular user, device, or browser instance. - .addParameter("cid", "555").addParameter("t", "event") // Event hit type. - .addParameter("ec", "Collect Earth") // Event category. - .addParameter("ea", event); // Event action. - URI uri; - uri = builder.build(); - HttpGet request = new HttpGet(uri); - request.addHeader("user-agent", "Collect Earth Java Application"); - HttpResponse response = client.execute(request); - logger.info(event + " GA Logged - Response http " + response.getStatusLine().getStatusCode()); - } catch (URISyntaxException | IOException e) { - logger.error("Error generating URL for Analytics", e); - } - - } - }.start(); - - } -} +package org.openforis.collect.earth.app.server; + +import java.io.File; +import java.io.IOException; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.swing.SwingUtilities; + +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.EarthProjectsService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +/** + * Servlet to load a project file when Collect Earth is already running: + * + * If the user double-clicks on a project file, Collect Earth will first check + * if there is already another instance running, if it is, then send a HTTP + * request and quit. This servlet will receive the HTTP request and load the + * project. + * + * @author Alfonso Sanchez-Paus Diaz + * + */ +@Controller +public class LoadProjectFileServlet { + + public static final String PROJECT_FILE_PARAMETER = "projectFilePath"; //$NON-NLS-1$ + public static final String SERVLET_NAME = "loadProjectFile"; //$NON-NLS-1$ + private Logger logger = LoggerFactory.getLogger(LoadProjectFileServlet.class); + + @Autowired + EarthProjectsService earthProjectsService; + + @Autowired + LocalPropertiesService localPropertiesService; + + @GetMapping("/" + SERVLET_NAME) + public void processRequest(HttpServletRequest request, HttpServletResponse response) { + String projectFilePath = request.getParameter(PROJECT_FILE_PARAMETER); + if (StringUtils.isBlank(projectFilePath)) { + logger.error("The " + PROJECT_FILE_PARAMETER + " parameter cannot be empty"); //$NON-NLS-1$ //$NON-NLS-2$ + } else { + + SwingUtilities.invokeLater(() -> { + File projectZipFile = new File(projectFilePath); + try { + if (earthProjectsService.loadCompressedProjectFile(projectZipFile)) { + localPropertiesService.nullifyChecksumValues(); + // Re-generate KMZ + new Thread( + "Restarting server after double-clicking on CEP file : " + projectZipFile.getName()) { + @Override + public void run() { + EarthApp.restart(); + } + + }.start(); + } + + } catch (IllegalArgumentException | IOException e) { + logger.error("Error loading the project file " + projectFilePath, e); //$NON-NLS-1$ + response.setStatus(500); + } + }); + + response.setStatus(200); + + } + + } + +} From 9b5118a43851fdf897527792140babf7a63cc3c2 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:37 +0100 Subject: [PATCH 1012/1620] New translations PlacemarkBrowserServlet.java (French) --- .../earth/app/view/Messages_fr.properties | 405 +++++++++++++++--- 1 file changed, 336 insertions(+), 69 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 9f9883c25f..de96e18020 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,94 +1,361 @@ -package org.openforis.collect.earth.app.logging; - -import java.awt.Dimension; - -import javax.swing.JEditorPane; -import javax.swing.JOptionPane; -import javax.swing.JScrollPane; -import javax.swing.SwingUtilities; - -import org.apache.logging.log4j.core.Filter; -import org.apache.logging.log4j.core.Layout; -import org.apache.logging.log4j.core.LogEvent; -import org.apache.logging.log4j.core.appender.AbstractAppender; -import org.apache.logging.log4j.core.config.Property; -import org.apache.logging.log4j.core.config.plugins.Plugin; -import org.apache.logging.log4j.core.config.plugins.PluginAttribute; -import org.apache.logging.log4j.core.config.plugins.PluginElement; -import org.apache.logging.log4j.core.config.plugins.PluginFactory; -import org.apache.logging.log4j.core.layout.PatternLayout; +package org.openforis.collect.earth.app.server; + +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.openforis.collect.earth.app.service.BrowserService; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.KmlGeneratorService; import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; +import org.openforis.collect.earth.sampler.processor.KmlGenerator; +import org.openforis.collect.earth.sampler.utils.KmlGenerationException; +import org.openforis.idm.metamodel.AttributeDefinition; +import org.opengis.referencing.operation.TransformException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; -@Plugin(name = "JSwingAppender", category = "Core", elementType = "appender", printObject = true) -public class JSwingAppender extends AbstractAppender { +import com.opencsv.CSVReader; - private Boolean showException; +/** + * Servlet to return the information that is stored in Collect Earth for one + * placemark (plot) + * + * @author Alfonso Sanchez-Paus Diaz + * + */ +@Controller +public class PlacemarkBrowserServlet { + @Autowired + private BrowserService browserService; - private Logger logger = LoggerFactory.getLogger( JSwingAppender.class ); + @Autowired + private EarthSurveyService earthSurveyService; - public JSwingAppender(String name, Filter filter, Layout layout, boolean ignoreExceptions, Property[] properties) { - super(name, filter, layout, ignoreExceptions, properties); - } + @Autowired + private LocalPropertiesService localPropertiesService; + + @Autowired + private KmlGeneratorService kmlGeneratorService; + + private KmlGenerator kmlGenerator; + + private SimplePlacemarkObject lastPlacemark = null; - @PluginFactory - public static JSwingAppender createAppender(@PluginAttribute("name") String name, - @PluginElement("Layout") Layout layout, @PluginElement("Filters") Filter filter, - @PluginAttribute("ignoreExceptions") boolean ignoreExceptions) { + private final Logger logger = LoggerFactory.getLogger( PlacemarkBrowserServlet.class ); - if (name == null) { - LoggerFactory.getLogger( JSwingAppender.class ).error("No name provided for JTextAreaAppender"); - return null; + private final class OpenBrowserThread extends Thread { + + private SimplePlacemarkObject placemarkObject; + + private OpenBrowserThread(String name, SimplePlacemarkObject placemarkObject) { + super(name); + this.placemarkObject = placemarkObject; } - if (layout == null) { - layout = PatternLayout.createDefaultLayout(); + @Override + public void run() { + // If this is the first plot or the plot is the last one that + // was opened + if (lastPlacemark == null + || !lastPlacemark.equals( placemarkObject ) ) { + + try { + kmlGenerator.fillSamplePoints(placemarkObject); + + kmlGenerator.fillExternalLine(placemarkObject); + + openGEEAppWindow(placemarkObject); + + openGEECodeEditorWindow(placemarkObject); + + openEarthMapWindow( placemarkObject ); + + openTimeLapseWindow(placemarkObject); + + openBingMapsWindow(placemarkObject); + + openBaiduMapsWindow(placemarkObject); + + openYandexMapsWindow(placemarkObject); + + openExtraMapWindow(placemarkObject); + + openStreetViewWindow(placemarkObject); + + openPlanetMapsWindow(placemarkObject); + + openSecureWatchWindow(placemarkObject); + + } catch (TransformException|KmlGenerationException e) { + logger.error("Error generating polygon", e ); + } + } + + lastPlacemark = placemarkObject; + } - return new JSwingAppender(name, filter, layout, ignoreExceptions, Property.EMPTY_ARRAY); - } - @Override - public void append(LogEvent event) { - try { - if( isExceptionShown() ) { - final String message = new String(this.getLayout().toByteArray(event)).replaceAll("(\r\n|\n)", "
"); - // Append formatted message to text area using the Thread. + public void openEarthMapWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Earth Map window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openEarthMapURL(placemarkObject); + } catch (final Exception e) { + logger.error("Exception opening Earth Map window", e); //$NON-NLS-1$ + } + } + }.start(); + } - SwingUtilities.invokeLater( () -> { + public void openGEECodeEditorWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open GEE Playground window") { //$NON-NLS-1$ + @Override + public void run() { try { - JEditorPane web = new JEditorPane(); - web.setEditable(false); - web.setContentType("text/html"); - web.setText(message); - - JScrollPane scrollPane = new JScrollPane(web); - scrollPane.setPreferredSize(new Dimension(450, 350)); - - JOptionPane.showMessageDialog(null, scrollPane, "Error has been loogged", JOptionPane.ERROR_MESSAGE); - }catch (Exception e) { - // Avoid creating an infinite loop by catching this exception and not logging it as error - logger.debug("Error shown exception", e); + browserService.openGEECodeEditor(placemarkObject); + } catch (final Exception e) { + logger.error("Exception opening Earth Engine Playground window", e); //$NON-NLS-1$ } - } ); - } - } catch (final Exception e) { - // ignore case when the platform hasn't yet been initialized - logger.debug("Error shown exception", e); + } + }.start(); + } + + public void openGEEAppWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open GEE APP window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openGEEAppURL(placemarkObject); + } catch (final Exception e) { + logger.error("Exception opening Earth Engine APP window", e); //$NON-NLS-1$ + } + } + }.start(); + } + + public void openBingMapsWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Bing Maps window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openBingMaps(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Bing Maps window", e); //$NON-NLS-1$ + } + } + }.start(); + } + + + public void openPlanetMapsWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Planet Maps window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openPlanetMaps(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Planet Maps window", e); //$NON-NLS-1$ + } + } + }.start(); + } + + public void openSecureWatchWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open SecureWatch window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openSecureWatch(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening SecureWatch window", e); //$NON-NLS-1$ + } + } + }.start(); + } + + public void openBaiduMapsWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Baidu Maps window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openBaiduMaps(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Baidu Maps window", e); //$NON-NLS-1$ + + } + } + + }.start(); + } + + public void openYandexMapsWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Yandex Maps window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openYandexMaps(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Yandex Maps window", e); //$NON-NLS-1$ + + } + } + + }.start(); } + public void openExtraMapWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Expa Map window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openExtraMap(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Extra Map window", e); //$NON-NLS-1$ + + } + } + + }.start(); + } + + public void openStreetViewWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Street View window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openStreetView(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Street View window", e); //$NON-NLS-1$ + + } + } + + }.start(); + } + + public void openTimeLapseWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open TimeLapse window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openTimelapse(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Earth Engine window", e); //$NON-NLS-1$ + + } + } + + }.start(); + } + + } + + + /* + * Opens the extra browser windows for Earth Engine, Timelapse and Bing. (non-Javadoc) + * + * @see + * org.openforis.collect.earth.app.server.JsonPocessorServlet#processRequest + * (javax.servlet.http.HttpServletRequest, + * javax.servlet.http.HttpServletResponse) + */ + @GetMapping(path = "/openAuxiliaryWindows") + public void openAuxiliaryWindows( + HttpServletResponse response, + @RequestParam(value = "latLongCoordinates", required = false) final String latLongCoordinates) + { + try { + SimplePlacemarkObject placemarkObject = new SimplePlacemarkObject(latLongCoordinates.split(",") ); + OpenBrowserThread browserThread = new OpenBrowserThread("Open auxiliary windows " + latLongCoordinates, placemarkObject); + browserThread.start(); + } catch (Exception e) { + logger.error("Error loading browsers " , e); + } } - private boolean isExceptionShown() { - if( showException == null ) { - LocalPropertiesService localPropertiesService = new LocalPropertiesService(); - showException = localPropertiesService.isExceptionShown(); + @GetMapping(path = "/ancillaryWindows") + public void openAuxiliaryWindowsNew(HttpServletResponse response, HttpServletRequest request) { + + + List keyAttributeDefinitions = earthSurveyService + .getRootEntityDefinition() + .getKeyAttributeDefinitions(); + + // the keys should the the parameter names + Map keys = request.getParameterMap(); + + String[] keysInOrder = new String[keys.size()]; + for (int i = 0; i < keyAttributeDefinitions.size(); i++) { + keysInOrder[i] = keys.get(keyAttributeDefinitions.get(i).getName())[0]; + } + + try { + kmlGenerator = kmlGeneratorService.getKmlGenerator(); + + String[] csvValues = getValuesFromCsv(keysInOrder); + + if( csvValues == null ){ + throw new IllegalArgumentException("The keys " + keys.toString() + " are not present on the CSV file with the plot locations!!!"); + } + + SimplePlacemarkObject placemarkObject = kmlGenerator.getPlotObject(csvValues, null, earthSurveyService.getCollectSurvey() ); + OpenBrowserThread browserThread = new OpenBrowserThread("Open ancillary windows - polygon ", placemarkObject ); + browserThread.start(); + } catch (Exception e) { + logger.error("Error loading browsers " , e); } - return showException; + } - public void setExceptionShown(Boolean showException) { - this.showException = showException; + private String[] getValuesFromCsv(String[] keysInOrder) { + + final String csvFile = localPropertiesService.getCsvFile(); + try ( + CSVReader reader = CsvReaderUtils.getCsvReader( csvFile ); + ){ + + + String[] csvRow; + int numberOfKeys = keysInOrder.length; + while ((csvRow = reader.readNext()) != null) { + boolean foundIt = true; + for( int idx=0; idx Date: Tue, 29 Nov 2022 15:40:39 +0100 Subject: [PATCH 1013/1620] New translations BackupSqlLiteService.java (Spanish) --- .../earth/app/view/Messages_es.properties | 194 +++++++++++------- 1 file changed, 121 insertions(+), 73 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 9f9883c25f..8c14343c96 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,94 +1,142 @@ -package org.openforis.collect.earth.app.logging; - -import java.awt.Dimension; - -import javax.swing.JEditorPane; -import javax.swing.JOptionPane; -import javax.swing.JScrollPane; -import javax.swing.SwingUtilities; - -import org.apache.logging.log4j.core.Filter; -import org.apache.logging.log4j.core.Layout; -import org.apache.logging.log4j.core.LogEvent; -import org.apache.logging.log4j.core.appender.AbstractAppender; -import org.apache.logging.log4j.core.config.Property; -import org.apache.logging.log4j.core.config.plugins.Plugin; -import org.apache.logging.log4j.core.config.plugins.PluginAttribute; -import org.apache.logging.log4j.core.config.plugins.PluginElement; -import org.apache.logging.log4j.core.config.plugins.PluginFactory; -import org.apache.logging.log4j.core.layout.PatternLayout; -import org.openforis.collect.earth.app.service.LocalPropertiesService; +package org.openforis.collect.earth.app.service; + +import java.io.File; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Date; + +import org.apache.commons.dbcp.BasicDataSource; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; -@Plugin(name = "JSwingAppender", category = "Core", elementType = "appender", printObject = true) -public class JSwingAppender extends AbstractAppender { +import net.lingala.zip4j.ZipFile; - private Boolean showException; - private Logger logger = LoggerFactory.getLogger( JSwingAppender.class ); +/** + * Spring managed bean that handles the creation of backups of the Collect database. + * The SQLite database file will be saved everytime the application closes. + * A maximum of 10 copies (the last ten times the application was used) will be saved on the backupCollectEarth folder on the users application data folder (OS dependant). + * @author Alfonso Sanchez-Paus Diaz + * + */ +@Component +@Lazy(false) +public class BackupSqlLiteService implements InitializingBean{ - public JSwingAppender(String name, Filter filter, Layout layout, boolean ignoreExceptions, Property[] properties) { - super(name, filter, layout, ignoreExceptions, properties); + private static final String BACKUP_COLLECT_EARTH = "backupSqlite"; //$NON-NLS-1$ + + private static final int MAXIMUM_NUMBER_OF_BACKUPS = 10; + + @Autowired + BasicDataSource dataSource; + + @Autowired + private LocalPropertiesService localPropertiesService; + + private Logger logger = LoggerFactory.getLogger( BackupSqlLiteService.class ); + + @Override + public void afterPropertiesSet() throws Exception { + attachShutDownHook(); } - @PluginFactory - public static JSwingAppender createAppender(@PluginAttribute("name") String name, - @PluginElement("Layout") Layout layout, @PluginElement("Filters") Filter filter, - @PluginAttribute("ignoreExceptions") boolean ignoreExceptions) { + private void attachShutDownHook() { + Runtime.getRuntime().addShutdownHook(new Thread("Shutdown hook - Backup Database") { + @Override + public void run() { + if ( "true".equals(localPropertiesService.getValue(EarthProperty.AUTOMATIC_BACKUP) ) ) { //$NON-NLS-1$ + automaticDBBackup(); + } + } - if (name == null) { - LoggerFactory.getLogger( JSwingAppender.class ).error("No name provided for JTextAreaAppender"); - return null; - } + }); + } + + private void automaticDBBackup() { + if( localPropertiesService.isUsingSqliteDB() ){ + + String pathToBackupZip = ""; //$NON-NLS-1$ + + String nameCollectDB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB; + File originalDBFile = new File(nameCollectDB); + + try { + + pathToBackupZip = getBackupZipFilename(); + + try( ZipFile zipFile = CollectEarthUtils.addFileToZip(pathToBackupZip, originalDBFile, EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME) ){ + removeExtraBackups(); + } - if (layout == null) { - layout = PatternLayout.createDefaultLayout(); + } catch (IOException e) { + logger.error("Error when create backup of the Collect Earth Database from " + nameCollectDB + " to " + pathToBackupZip, e); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (Exception e) { + logger.error("Error when zipping the Collect Earth Database from " + nameCollectDB + " to " + pathToBackupZip, e); //$NON-NLS-1$ //$NON-NLS-2$ + } } - return new JSwingAppender(name, filter, layout, ignoreExceptions, Property.EMPTY_ARRAY); } - @Override - public void append(LogEvent event) { - try { - if( isExceptionShown() ) { - final String message = new String(this.getLayout().toByteArray(event)).replaceAll("(\r\n|\n)", "
"); - - // Append formatted message to text area using the Thread. - - SwingUtilities.invokeLater( () -> { - try { - JEditorPane web = new JEditorPane(); - web.setEditable(false); - web.setContentType("text/html"); - web.setText(message); - - JScrollPane scrollPane = new JScrollPane(web); - scrollPane.setPreferredSize(new Dimension(450, 350)); - - JOptionPane.showMessageDialog(null, scrollPane, "Error has been loogged", JOptionPane.ERROR_MESSAGE); - }catch (Exception e) { - // Avoid creating an infinite loop by catching this exception and not logging it as error - logger.debug("Error shown exception", e); + private String getBackupZipFilename() throws IOException { + File backupFolder = getAutomaticBackUpFolder(); + return getDBCopyName(backupFolder); + } + + public String getDBCopyName(File backupFolder) throws IOException { + String pathToBackup; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HHmmss"); //$NON-NLS-1$ + StringBuilder destPathStr = new StringBuilder(); + destPathStr.append(backupFolder.getCanonicalPath()); + destPathStr.append(File.separatorChar); + destPathStr.append( EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME); + destPathStr.append(sdf.format( new Date() )).append( ".zip"); + pathToBackup = destPathStr.toString(); + return pathToBackup; + } + + private void removeExtraBackups() { + + File backupFolder = getAutomaticBackUpFolder(); + + File[] files = backupFolder.listFiles(); + if( files!=null && files.length > MAXIMUM_NUMBER_OF_BACKUPS ){ + + Arrays.sort(files, (o1,o2) -> { + if( o1.lastModified() < o2.lastModified() ){ + return 1; + }else if( o1.lastModified() == o2.lastModified() ){ + return 0; + }else{ + return -1; } - } ); + + } + ); + + for( int i = MAXIMUM_NUMBER_OF_BACKUPS; i< files.length ; i++ ){ + if( !files[i].delete() ) { + logger.error( "Error deleteting file", files[i].getAbsolutePath() ); + } } - } catch (final Exception e) { - // ignore case when the platform hasn't yet been initialized - logger.debug("Error shown exception", e); + } } - private boolean isExceptionShown() { - if( showException == null ) { - LocalPropertiesService localPropertiesService = new LocalPropertiesService(); - showException = localPropertiesService.isExceptionShown(); - } - return showException; - } - public void setExceptionShown(Boolean showException) { - this.showException = showException; + /** + * Returns the folder where the backup copies should be placed. + * @return The OS dependent folder where the application should saved the backed up copies. + */ + public File getAutomaticBackUpFolder() { + return FolderFinder.createFolderInAppData( BACKUP_COLLECT_EARTH); } -} \ No newline at end of file + +} From 784e2433daa26836fca308488c73e34d83be242f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:40 +0100 Subject: [PATCH 1014/1620] New translations .gitignore (French) --- .../earth/app/view/Messages_fr.properties | 362 +----------------- 1 file changed, 1 insertion(+), 361 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index de96e18020..fa1df1b41e 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,361 +1 @@ -package org.openforis.collect.earth.app.server; - -import java.util.List; -import java.util.Map; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.openforis.collect.earth.app.service.BrowserService; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.KmlGeneratorService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; -import org.openforis.collect.earth.sampler.processor.KmlGenerator; -import org.openforis.collect.earth.sampler.utils.KmlGenerationException; -import org.openforis.idm.metamodel.AttributeDefinition; -import org.opengis.referencing.operation.TransformException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; - -import com.opencsv.CSVReader; - -/** - * Servlet to return the information that is stored in Collect Earth for one - * placemark (plot) - * - * @author Alfonso Sanchez-Paus Diaz - * - */ -@Controller -public class PlacemarkBrowserServlet { - @Autowired - private BrowserService browserService; - - @Autowired - private EarthSurveyService earthSurveyService; - - @Autowired - private LocalPropertiesService localPropertiesService; - - @Autowired - private KmlGeneratorService kmlGeneratorService; - - private KmlGenerator kmlGenerator; - - private SimplePlacemarkObject lastPlacemark = null; - - private final Logger logger = LoggerFactory.getLogger( PlacemarkBrowserServlet.class ); - - private final class OpenBrowserThread extends Thread { - - private SimplePlacemarkObject placemarkObject; - - private OpenBrowserThread(String name, SimplePlacemarkObject placemarkObject) { - super(name); - this.placemarkObject = placemarkObject; - } - - @Override - public void run() { - // If this is the first plot or the plot is the last one that - // was opened - if (lastPlacemark == null - || !lastPlacemark.equals( placemarkObject ) ) { - - try { - kmlGenerator.fillSamplePoints(placemarkObject); - - kmlGenerator.fillExternalLine(placemarkObject); - - openGEEAppWindow(placemarkObject); - - openGEECodeEditorWindow(placemarkObject); - - openEarthMapWindow( placemarkObject ); - - openTimeLapseWindow(placemarkObject); - - openBingMapsWindow(placemarkObject); - - openBaiduMapsWindow(placemarkObject); - - openYandexMapsWindow(placemarkObject); - - openExtraMapWindow(placemarkObject); - - openStreetViewWindow(placemarkObject); - - openPlanetMapsWindow(placemarkObject); - - openSecureWatchWindow(placemarkObject); - - } catch (TransformException|KmlGenerationException e) { - logger.error("Error generating polygon", e ); - } - } - - lastPlacemark = placemarkObject; - - } - - - public void openEarthMapWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Earth Map window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openEarthMapURL(placemarkObject); - } catch (final Exception e) { - logger.error("Exception opening Earth Map window", e); //$NON-NLS-1$ - } - } - }.start(); - } - - public void openGEECodeEditorWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open GEE Playground window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openGEECodeEditor(placemarkObject); - } catch (final Exception e) { - logger.error("Exception opening Earth Engine Playground window", e); //$NON-NLS-1$ - } - } - }.start(); - } - - public void openGEEAppWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open GEE APP window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openGEEAppURL(placemarkObject); - } catch (final Exception e) { - logger.error("Exception opening Earth Engine APP window", e); //$NON-NLS-1$ - } - } - }.start(); - } - - public void openBingMapsWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Bing Maps window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openBingMaps(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Bing Maps window", e); //$NON-NLS-1$ - } - } - }.start(); - } - - - public void openPlanetMapsWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Planet Maps window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openPlanetMaps(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Planet Maps window", e); //$NON-NLS-1$ - } - } - }.start(); - } - - public void openSecureWatchWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open SecureWatch window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openSecureWatch(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening SecureWatch window", e); //$NON-NLS-1$ - } - } - }.start(); - } - - public void openBaiduMapsWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Baidu Maps window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openBaiduMaps(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Baidu Maps window", e); //$NON-NLS-1$ - - } - } - - }.start(); - } - - public void openYandexMapsWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Yandex Maps window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openYandexMaps(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Yandex Maps window", e); //$NON-NLS-1$ - - } - } - - }.start(); - } - - public void openExtraMapWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Expa Map window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openExtraMap(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Extra Map window", e); //$NON-NLS-1$ - - } - } - - }.start(); - } - - public void openStreetViewWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Street View window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openStreetView(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Street View window", e); //$NON-NLS-1$ - - } - } - - }.start(); - } - - public void openTimeLapseWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open TimeLapse window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openTimelapse(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Earth Engine window", e); //$NON-NLS-1$ - - } - } - - }.start(); - } - - } - - - /* - * Opens the extra browser windows for Earth Engine, Timelapse and Bing. (non-Javadoc) - * - * @see - * org.openforis.collect.earth.app.server.JsonPocessorServlet#processRequest - * (javax.servlet.http.HttpServletRequest, - * javax.servlet.http.HttpServletResponse) - */ - @GetMapping(path = "/openAuxiliaryWindows") - public void openAuxiliaryWindows( - HttpServletResponse response, - @RequestParam(value = "latLongCoordinates", required = false) final String latLongCoordinates) - { - try { - SimplePlacemarkObject placemarkObject = new SimplePlacemarkObject(latLongCoordinates.split(",") ); - OpenBrowserThread browserThread = new OpenBrowserThread("Open auxiliary windows " + latLongCoordinates, placemarkObject); - browserThread.start(); - } catch (Exception e) { - logger.error("Error loading browsers " , e); - } - } - - @GetMapping(path = "/ancillaryWindows") - public void openAuxiliaryWindowsNew(HttpServletResponse response, HttpServletRequest request) { - - - List keyAttributeDefinitions = earthSurveyService - .getRootEntityDefinition() - .getKeyAttributeDefinitions(); - - // the keys should the the parameter names - Map keys = request.getParameterMap(); - - String[] keysInOrder = new String[keys.size()]; - for (int i = 0; i < keyAttributeDefinitions.size(); i++) { - keysInOrder[i] = keys.get(keyAttributeDefinitions.get(i).getName())[0]; - } - - try { - kmlGenerator = kmlGeneratorService.getKmlGenerator(); - - String[] csvValues = getValuesFromCsv(keysInOrder); - - if( csvValues == null ){ - throw new IllegalArgumentException("The keys " + keys.toString() + " are not present on the CSV file with the plot locations!!!"); - } - - SimplePlacemarkObject placemarkObject = kmlGenerator.getPlotObject(csvValues, null, earthSurveyService.getCollectSurvey() ); - OpenBrowserThread browserThread = new OpenBrowserThread("Open ancillary windows - polygon ", placemarkObject ); - browserThread.start(); - } catch (Exception e) { - logger.error("Error loading browsers " , e); - } - - } - - private String[] getValuesFromCsv(String[] keysInOrder) { - - final String csvFile = localPropertiesService.getCsvFile(); - try ( - CSVReader reader = CsvReaderUtils.getCsvReader( csvFile ); - ){ - - - String[] csvRow; - int numberOfKeys = keysInOrder.length; - while ((csvRow = reader.readNext()) != null) { - boolean foundIt = true; - for( int idx=0; idx Date: Tue, 29 Nov 2022 15:40:41 +0100 Subject: [PATCH 1015/1620] New translations .gitignore (Spanish) --- .../earth/app/view/Messages_es.properties | 143 +----------------- 1 file changed, 1 insertion(+), 142 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 8c14343c96..fa1df1b41e 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,142 +1 @@ -package org.openforis.collect.earth.app.service; - -import java.io.File; -import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.Arrays; -import java.util.Date; - -import org.apache.commons.dbcp.BasicDataSource; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; - -import net.lingala.zip4j.ZipFile; - - -/** - * Spring managed bean that handles the creation of backups of the Collect database. - * The SQLite database file will be saved everytime the application closes. - * A maximum of 10 copies (the last ten times the application was used) will be saved on the backupCollectEarth folder on the users application data folder (OS dependant). - * @author Alfonso Sanchez-Paus Diaz - * - */ -@Component -@Lazy(false) -public class BackupSqlLiteService implements InitializingBean{ - - private static final String BACKUP_COLLECT_EARTH = "backupSqlite"; //$NON-NLS-1$ - - private static final int MAXIMUM_NUMBER_OF_BACKUPS = 10; - - @Autowired - BasicDataSource dataSource; - - @Autowired - private LocalPropertiesService localPropertiesService; - - private Logger logger = LoggerFactory.getLogger( BackupSqlLiteService.class ); - - @Override - public void afterPropertiesSet() throws Exception { - attachShutDownHook(); - } - - private void attachShutDownHook() { - Runtime.getRuntime().addShutdownHook(new Thread("Shutdown hook - Backup Database") { - @Override - public void run() { - if ( "true".equals(localPropertiesService.getValue(EarthProperty.AUTOMATIC_BACKUP) ) ) { //$NON-NLS-1$ - automaticDBBackup(); - } - } - - }); - } - - private void automaticDBBackup() { - if( localPropertiesService.isUsingSqliteDB() ){ - - String pathToBackupZip = ""; //$NON-NLS-1$ - - String nameCollectDB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB; - File originalDBFile = new File(nameCollectDB); - - try { - - pathToBackupZip = getBackupZipFilename(); - - try( ZipFile zipFile = CollectEarthUtils.addFileToZip(pathToBackupZip, originalDBFile, EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME) ){ - removeExtraBackups(); - } - - } catch (IOException e) { - logger.error("Error when create backup of the Collect Earth Database from " + nameCollectDB + " to " + pathToBackupZip, e); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (Exception e) { - logger.error("Error when zipping the Collect Earth Database from " + nameCollectDB + " to " + pathToBackupZip, e); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - } - - private String getBackupZipFilename() throws IOException { - File backupFolder = getAutomaticBackUpFolder(); - return getDBCopyName(backupFolder); - } - - public String getDBCopyName(File backupFolder) throws IOException { - String pathToBackup; - SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HHmmss"); //$NON-NLS-1$ - StringBuilder destPathStr = new StringBuilder(); - destPathStr.append(backupFolder.getCanonicalPath()); - destPathStr.append(File.separatorChar); - destPathStr.append( EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME); - destPathStr.append(sdf.format( new Date() )).append( ".zip"); - pathToBackup = destPathStr.toString(); - return pathToBackup; - } - - private void removeExtraBackups() { - - File backupFolder = getAutomaticBackUpFolder(); - - File[] files = backupFolder.listFiles(); - if( files!=null && files.length > MAXIMUM_NUMBER_OF_BACKUPS ){ - - Arrays.sort(files, (o1,o2) -> { - if( o1.lastModified() < o2.lastModified() ){ - return 1; - }else if( o1.lastModified() == o2.lastModified() ){ - return 0; - }else{ - return -1; - } - - } - ); - - for( int i = MAXIMUM_NUMBER_OF_BACKUPS; i< files.length ; i++ ){ - if( !files[i].delete() ) { - logger.error( "Error deleteting file", files[i].getAbsolutePath() ); - } - } - - } - - } - - - /** - * Returns the folder where the backup copies should be placed. - * @return The OS dependent folder where the application should saved the backed up copies. - */ - public File getAutomaticBackUpFolder() { - return FolderFinder.createFolderInAppData( BACKUP_COLLECT_EARTH); - } - -} +/DataRepositoryService.java_bc From 8da3718644733920d98d60ad6435e9ef0155878c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:42 +0100 Subject: [PATCH 1016/1620] New translations .gitignore (Portuguese) --- .../earth/app/view/Messages_pt.properties | 51 +------------------ 1 file changed, 1 insertion(+), 50 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index c05160789c..fa1df1b41e 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,50 +1 @@ -package org.openforis.collect.earth.app.logging; - -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; - -import org.apache.http.HttpResponse; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.impl.client.HttpClientBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class GAlogger { - - private static final Logger logger = LoggerFactory.getLogger(GAlogger.class); - - public static void logGAnalytics(String event) { - new Thread("GA logging thread") { - - @Override - public void run() { - try { - String trackingId = "UA-55115982-1"; - HttpClient client = HttpClientBuilder.create().build(); - URIBuilder builder = new URIBuilder(); - builder.setScheme("http").setHost("www.google-analytics.com").setPath("/collect") - .addParameter("v", "1") // API Version. - .addParameter("tid", trackingId) // Tracking ID / Property ID. - // Anonymous Client Identifier. Ideally, this should be a UUID that - // is associated with particular user, device, or browser instance. - .addParameter("cid", "555").addParameter("t", "event") // Event hit type. - .addParameter("ec", "Collect Earth") // Event category. - .addParameter("ea", event); // Event action. - URI uri; - uri = builder.build(); - HttpGet request = new HttpGet(uri); - request.addHeader("user-agent", "Collect Earth Java Application"); - HttpResponse response = client.execute(request); - logger.info(event + " GA Logged - Response http " + response.getStatusLine().getStatusCode()); - } catch (URISyntaxException | IOException e) { - logger.error("Error generating URL for Analytics", e); - } - - } - }.start(); - - } -} +/DataRepositoryService.java_bc From be6f173b3db0093735001eb56dead92abf8769c7 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:43 +0100 Subject: [PATCH 1017/1620] New translations .gitignore (English) --- .../earth/app/view/Messages_en.properties | 80 +------------------ 1 file changed, 1 insertion(+), 79 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 93a4d09fe6..fa1df1b41e 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,79 +1 @@ -package org.openforis.collect.earth.app.server; - -import java.io.File; -import java.io.IOException; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.EarthProjectsService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; - -/** - * Servlet to load a project file when Collect Earth is already running: - * - * If the user double-clicks on a project file, Collect Earth will first check - * if there is already another instance running, if it is, then send a HTTP - * request and quit. This servlet will receive the HTTP request and load the - * project. - * - * @author Alfonso Sanchez-Paus Diaz - * - */ -@Controller -public class LoadProjectFileServlet { - - public static final String PROJECT_FILE_PARAMETER = "projectFilePath"; //$NON-NLS-1$ - public static final String SERVLET_NAME = "loadProjectFile"; //$NON-NLS-1$ - private Logger logger = LoggerFactory.getLogger(LoadProjectFileServlet.class); - - @Autowired - EarthProjectsService earthProjectsService; - - @Autowired - LocalPropertiesService localPropertiesService; - - @GetMapping("/" + SERVLET_NAME) - public void processRequest(HttpServletRequest request, HttpServletResponse response) { - String projectFilePath = request.getParameter(PROJECT_FILE_PARAMETER); - if (StringUtils.isBlank(projectFilePath)) { - logger.error("The " + PROJECT_FILE_PARAMETER + " parameter cannot be empty"); //$NON-NLS-1$ //$NON-NLS-2$ - } else { - - SwingUtilities.invokeLater(() -> { - File projectZipFile = new File(projectFilePath); - try { - if (earthProjectsService.loadCompressedProjectFile(projectZipFile)) { - localPropertiesService.nullifyChecksumValues(); - // Re-generate KMZ - new Thread( - "Restarting server after double-clicking on CEP file : " + projectZipFile.getName()) { - @Override - public void run() { - EarthApp.restart(); - } - - }.start(); - } - - } catch (IllegalArgumentException | IOException e) { - logger.error("Error loading the project file " + projectFilePath, e); //$NON-NLS-1$ - response.setStatus(500); - } - }); - - response.setStatus(200); - - } - - } - -} +/DataRepositoryService.java_bc From 18c70a01982489f07b63f91d9c0f9f7742be8991 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:44 +0100 Subject: [PATCH 1018/1620] New translations AnalysisSaikuService.java (French) --- .../earth/app/view/Messages_fr.properties | 732 +++++++++++++++++- 1 file changed, 731 insertions(+), 1 deletion(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index fa1df1b41e..cba7f5812d 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1 +1,731 @@ -/DataRepositoryService.java_bc +package org.openforis.collect.earth.app.service; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.swing.SwingUtilities; + +import org.apache.commons.lang3.SystemUtils; +import org.apache.commons.text.StringEscapeUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; +import org.openforis.collect.earth.app.ad_hoc.AluToolUtils; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.model.AspectCode; +import org.openforis.collect.earth.app.model.DynamicsCode; +import org.openforis.collect.earth.app.model.SlopeCode; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; +import org.openforis.collect.model.CollectSurvey; +import org.openforis.collect.relational.CollectRDBPublisher; +import org.openforis.collect.relational.CollectRdbException; +import org.openforis.concurrency.Progress; +import org.openforis.idm.metamodel.NodeDefinition; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Component; + +import com.opencsv.CSVReader; + +import freemarker.template.TemplateException; + +@Component +public class AnalysisSaikuService extends GenerateDatabase implements DisposableBean{ + + private static final String PLOT_ADD = "plot ADD "; + + private static final String UPDATE = "UPDATE "; + + private static final String UNKNOWN = "Unknown"; + + private static final String VARCHAR_5 = " VARCHAR(5)"; + + private static final String INTEGER = " INTEGER"; + + private static final String ALTER_TABLE = "ALTER TABLE "; + + private static final String INSERT_INTO = "INSERT INTO "; + + private static final String CREATE_TABLE = "CREATE TABLE "; + + private static final String ALU_CLIMATE_ZONE_CODE = "alu_climate_zone_code"; //$NON-NLS-1$ + + private static final String ALU_SOIL_TYPE_CODE = "alu_soil_type_code"; //$NON-NLS-1$ + + private static final String ALU_SUBCLASS_CODE = "alu_subclass_code"; //$NON-NLS-1$ + + private static final String DYNAMICS_ID = "dynamics_id"; //$NON-NLS-1$ + + private static final String ELEVATION_ID = "elevation_id"; //$NON-NLS-1$ + + private static final String SLOPE_ID = "slope_id"; //$NON-NLS-1$ + + private static final String ASPECT_ID = "aspect_id"; //$NON-NLS-1$ + + private static final String START_SAIKU = "start-saiku"; //$NON-NLS-1$ + + private static final String STOP_SAIKU = "stop-saiku"; //$NON-NLS-1$ + + private static final String COMMAND_SUFFIX_BAT = ".bat"; //$NON-NLS-1$ + + private static final String COMMAND_SUFFIX_SH = ".sh"; //$NON-NLS-1$ + + public static final String COLLECT_EARTH_DATABASE_RDB_DB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + + EarthConstants.SAIKU_RDB_SUFFIX; + + + @Autowired + RDBExporter rdbExporter; + + @Autowired + CollectRDBPublisher collectRDBPublisher; + + @Autowired + EarthSurveyService earthSurveyService; + + @Autowired + public LocalPropertiesService localPropertiesService; + + @Autowired + BrowserService browserService; + + @Autowired + private RegionCalculationUtils regionCalculation; + + @Autowired + private SchemaService schemaNamingService; + + private static final int ELEVATION_RANGE = 100; + + private RemoteWebDriver saikuWebDriver; + + private static final String SQLITE_FREEMARKER_HTML_TEMPLATE = "resources" + File.separator //$NON-NLS-1$ + + "collectEarthSqliteDS.fmt"; //$NON-NLS-1$ + private static final String POSTGRESQL_FREEMARKER_HTML_TEMPLATE = "resources" + File.separator //$NON-NLS-1$ + + "collectEarthPostgreSqlDS.fmt"; //$NON-NLS-1$ + public static final String MDX_XML = "collectEarthCubes.xml"; //$NON-NLS-1$ + private static final String MDX_TEMPLATE = MDX_XML + ".fmt"; //$NON-NLS-1$ + + private boolean saikuStarted; + + private void assignDimensionValues() { + try { + final String schemaName = getSchemaPrefix(); + // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id + final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query( + "SELECT " + EarthConstants.PLOT_ID + ", elevation, slope, aspect FROM " + schemaName + "plot", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + new RowMapper() { + @Override + public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { + + final Object[] updateValues = new Object[4]; + + Integer aspect = AspectCode.NA.getId(); + if (AspectCode.getAspectCode(rs.getDouble("aspect")) != null) { //$NON-NLS-1$ + aspect = AspectCode.getAspectCode(rs.getDouble("aspect")).getId(); //$NON-NLS-1$ + } + + Integer slope = SlopeCode.NA.getId(); + + if (SlopeCode.getSlopeCode((int) rs.getFloat("slope")) != null) { //$NON-NLS-1$ + slope = SlopeCode.getSlopeCode((int) rs.getFloat("slope")).getId(); //$NON-NLS-1$ + } + + updateValues[0] = aspect; + updateValues[1] = slope; + updateValues[2] = ( (int) rs.getFloat("elevation") / ELEVATION_RANGE) + 1; // 0 //$NON-NLS-1$ + + updateValues[3] = rs.getLong(EarthConstants.PLOT_ID); + return updateValues; + } + + }); + + rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + ASPECT_ID + "=?," + SLOPE_ID + "=?," //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + ELEVATION_ID + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (Exception e) { + logger.warn("No DEM information", e); //$NON-NLS-1$ + } + } + + private String getSchemaPrefix() { + return schemaNamingService.getSchemaPrefix(ExportType.SAIKU); + } + + private void assignPngAluToolDimensionValues() { + try { + if (earthSurveyService.getCollectSurvey().getName().toLowerCase().contains("png")) { //$NON-NLS-1$ + final String schemaName = getSchemaPrefix(); + // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id + final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query("SELECT " + EarthConstants.PLOT_ID //$NON-NLS-1$ + + ", elevation, soil_fundamental, land_use_subcategory, precipitation_ranges FROM " + schemaName //$NON-NLS-1$ + + "plot LEFT JOIN " + schemaName + "precipitation_ranges_code where " //$NON-NLS-1$ //$NON-NLS-2$ + + "plot.annual_precipitation_code_id=precipitation_ranges_code.precipitation_ranges_code_id", //$NON-NLS-1$ + new RowMapper() { + @Override + public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { + + final Object[] updateValues = new Object[3]; + + try { + AluToolUtils aluToolUtils = new AluToolUtils(); + + Integer elevation = rs.getInt("elevation"); //$NON-NLS-1$ + String soilFundamental = rs.getString("soil_fundamental"); //$NON-NLS-1$ + String precipitationRange = rs.getString("precipitation_ranges"); //$NON-NLS-1$ + + int precipitation = -1; + String climateZone = UNKNOWN; //$NON-NLS-1$ + if (precipitationRange != null) { + precipitation = aluToolUtils.getPrecipitationFromRange(precipitationRange); + boolean shortDrySeason = true; // According to information from Abe PNG has less + // than 5 months of dry season + climateZone = aluToolUtils.getClimateZone(elevation, precipitation, + shortDrySeason); + } + + String soilType = UNKNOWN; //$NON-NLS-1$ + if (soilFundamental != null) { + soilType = aluToolUtils.getSoilType(soilFundamental); + } + + updateValues[0] = climateZone; + updateValues[1] = soilType; + updateValues[2] = rs.getLong(EarthConstants.PLOT_ID); + } catch (Exception e) { + logger.error("Error while processing the data", e); //$NON-NLS-1$ + updateValues[0] = UNKNOWN; //$NON-NLS-1$ + updateValues[1] = UNKNOWN; //$NON-NLS-1$ + updateValues[2] = UNKNOWN; //$NON-NLS-1$ + } + return updateValues; + } + + }); + + rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + ALU_CLIMATE_ZONE_CODE + "=?," //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + ALU_SOIL_TYPE_CODE + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ //$NON-NLS-2$ + } + } catch (Exception e) { + logger.error("No PNG ALU information", e); //$NON-NLS-1$ + } + } + + private void assignLUCDimensionValues() { + try { + final String schemaName = getSchemaPrefix(); + // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id + final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query( + "SELECT " + EarthConstants.PLOT_ID + ", land_use_subcategory FROM " + schemaName + "plot", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + new RowMapper() { + @Override + public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { + + AluToolUtils aluToolUtils = new AluToolUtils(); + final Object[] updateValues = new Object[3]; + + String collectEarthSubcategory = rs.getString("land_use_subcategory"); //$NON-NLS-1$ + Integer dynamics = DynamicsCode.getDynamicsCode(collectEarthSubcategory); + String subClass = UNKNOWN; //$NON-NLS-1$ + if (collectEarthSubcategory != null) { + subClass = aluToolUtils.getAluSubclass(collectEarthSubcategory); + } + + updateValues[0] = dynamics; + updateValues[1] = subClass; + updateValues[2] = rs.getLong(EarthConstants.PLOT_ID); + return updateValues; + } + + }); + + rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + DYNAMICS_ID + "=?," + ALU_SUBCLASS_CODE //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ + } catch (Exception e) { + logger.warn("No PNG Alu information available", e); //$NON-NLS-1$ + } + } + + private void createAspectAuxTable() { + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "aspect_category (" + ASPECT_ID //$NON-NLS-1$ //$NON-NLS-2$ + + " INTEGER PRIMARY KEY, aspect_caption TEXT);"); //$NON-NLS-1$ + final AspectCode[] aspects = AspectCode.values(); + for (final AspectCode aspectCode : aspects) { + rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "aspect_category values (" + aspectCode.getId() + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + aspectCode.getLabel() + "')"); //$NON-NLS-1$ + } + } + + private void createElevationtAuxTable() { + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "elevation_category ( " + ELEVATION_ID //$NON-NLS-1$ //$NON-NLS-2$ + + " INTEGER PRIMARY KEY, elevation_caption TEXT);"); //$NON-NLS-1$ + final int slots = 9000 / ELEVATION_RANGE; // Highest mountain in the world, mount everest is + // 8820m high + for (int i = 1; i <= slots; i++) { + rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "elevation_category values (" + i + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + ((i - 1) * ELEVATION_RANGE) + "-" + i //$NON-NLS-1$ + * ELEVATION_RANGE + + "')"); //$NON-NLS-1$ + } + + } + + private void createDynamicsAuxTable() { + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "dynamics_category (" + DYNAMICS_ID //$NON-NLS-1$ //$NON-NLS-2$ + + " INTEGER PRIMARY KEY, dynamics_caption TEXT);"); //$NON-NLS-1$ + final DynamicsCode[] dynamicsCodes = DynamicsCode.values(); + for (final DynamicsCode dynamicsCode : dynamicsCodes) { + rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "dynamics_category values (" + dynamicsCode.getId() //$NON-NLS-1$ //$NON-NLS-2$ + + ", '" + dynamicsCode.getLabel() + "')"); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + + private void createPlotForeignKeys() { + // Add aspect_id column to plot + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ASPECT_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + SLOPE_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ELEVATION_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + DYNAMICS_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + + private void createPngAluVariables() { + if (earthSurveyService.getCollectSurvey().getName().toLowerCase().contains("png")) { //$NON-NLS-1$ + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_SOIL_TYPE_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_CLIMATE_ZONE_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + } + + private void creatAluSubclassVariables() { + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_SUBCLASS_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + + private void createSlopeAuxTable() { + final String schemaName = getSchemaPrefix(); + // Slope can be from 0 to 90 + rdbExporter.getJdbcTemplate().execute( + CREATE_TABLE + schemaName + "slope_category (slope_id INTEGER PRIMARY KEY, slope_caption TEXT);"); //$NON-NLS-1$ //$NON-NLS-2$ + final SlopeCode[] slopeCodes = SlopeCode.values(); + for (final SlopeCode slopeCode : slopeCodes) { + rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "slope_category values (" + slopeCode.getId() + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + slopeCode.getLabel() + "')"); //$NON-NLS-1$ + } + } + + private String getSaikuConfigurationFilePath() { + + String configFile = localPropertiesService.getSaikuFolder() + "/" //$NON-NLS-1$ + + "tomcat/webapps/saiku/WEB-INF/classes/saiku-datasources/collectEarthDS"; //$NON-NLS-1$ + configFile = configFile.replace('/', File.separatorChar); + return configFile; + } + + private String getSaikuThreeConfigurationFilePath() { + + String configFile = localPropertiesService.getSaikuFolder() + "/" //$NON-NLS-1$ + + "tomcat/webapps/saiku/WEB-INF/classes/legacy-datasources/collectEarthDS"; //$NON-NLS-1$ + configFile = configFile.replace('/', File.separatorChar); + return configFile; + } + + private boolean isSaikuConfigured() { + return localPropertiesService.getSaikuFolder() != null + && isSaikuFolder(new File(localPropertiesService.getSaikuFolder())); + } + + /* + * private boolean isJavaHomeConfigured() { + * + * if (SystemUtils.IS_OS_MAC){ return true; } return ! ( StringUtils.isBlank( + * System.getenv("JAVA_HOME") ) //$NON-NLS-1$ && StringUtils.isBlank( + * System.getenv("JRE_HOME") ) //$NON-NLS-1$ && StringUtils.isBlank( + * System.getenv("COLLECT_EARTH_JRE_HOME") ) //$NON-NLS-1$ ); } + */ + + public boolean isSaikuFolder(File saikuFolder) { + boolean isSaikuFolder = false; + if (saikuFolder.listFiles() != null) { + for (final File file : saikuFolder.listFiles()) { + if (file.getName().equals(START_SAIKU + getCommandSuffix())) { + isSaikuFolder = true; + } + } + } + return isSaikuFolder; + } + + private void openSaiku() throws BrowserNotFoundException { + saikuWebDriver = browserService.navigateTo("http://127.0.0.1:8181", saikuWebDriver, false); //$NON-NLS-1$ + if (browserService.waitFor("username", saikuWebDriver)) { //$NON-NLS-1$ + saikuWebDriver.findElementByName("username").sendKeys("admin"); //$NON-NLS-1$ //$NON-NLS-2$ + saikuWebDriver.findElementByName("password").sendKeys("admin"); //$NON-NLS-1$ //$NON-NLS-2$ + saikuWebDriver.findElementByClassName("form_button").click(); //$NON-NLS-1$ + } + } + + + public void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws SaikuExecutionException { + + try { + + stopSaiku(); + + try { + + if ((localPropertiesService.isUsingSqliteDB() && !getZippedProjectDB( ExportType.SAIKU ).exists()) + || isRefreshDatabase()) { + + // The user clicked on the option to refresh the database, or there is no + // previous copy of the Saiku DB + // Generate the DB file + rdbExporter.exportDataToRDB( + earthSurveyService.getCollectSurvey(), + ExportType.SAIKU, + progressListener, + this::processQuantityData + ); + + try { + // Save the DB file in a zipped file to extends GenerateDatabase keep for the next usages + replaceZippedProjectDB( ExportType.SAIKU ); + } catch (Exception e) { + logger.error("Error while refreshing the Zipped content of the project Saiku DB", e); + } + + } else if (getZippedProjectDB(ExportType.SAIKU).exists() && localPropertiesService.isUsingSqliteDB()) { + // If the zipped version of the project exists ( and the user clicked on the + // option to not refresh it) then restore this last version of the data + restoreZippedProjectDB(ExportType.SAIKU); + } + + refreshDataSourceForSaiku(); + + if (startSaikuAfterDBExport && !isUserCancelledOperation()) { + startSaiku(); + new Thread("Opening Saiku") { + @Override + public void run() { + try { + AnalysisSaikuService.this.openSaiku(); + } catch (BrowserNotFoundException e) { + logger.error("No browser has been set up", e); //$NON-NLS-1$ + } + }; + }.start(); + + stopSaikuOnExit(); + } + } catch (final IOException e) { + logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ + } catch (TemplateException e1) { + logger.error("Error while applying the freemarker template tothe Saiku data source", e1); //$NON-NLS-1$ + } + + } catch (final CollectRdbException e) { + logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ + } + } + + private void processQuantityData(InfiniteProgressMonitor progressListener) { + + SwingUtilities.invokeLater( () -> progressListener.setMessage("Preparing Saiku data for analysis") ); + + progressListener.progressMade(new Progress(0, 100)); + createPngAluVariables(); + createPlotForeignKeys(); + + progressListener.progressMade(new Progress(25, 100)); + + if (!surveyContains("calculated_elevation_range", earthSurveyService.getCollectSurvey())) { + createAspectAuxTable(); + createSlopeAuxTable(); + createElevationtAuxTable(); + assignDimensionValues(); + + } + progressListener.progressMade(new Progress(50, 100)); + + if (!surveyContains("calculated_initial_land_use", earthSurveyService.getCollectSurvey())) { + createDynamicsAuxTable(); + creatAluSubclassVariables(); + assignLUCDimensionValues(); + + } + progressListener.progressMade(new Progress(75, 100)); + + assignPngAluToolDimensionValues(); + + SwingUtilities.invokeLater( () -> progressListener.setMessage("Calculating expansion factors") ); + + regionCalculation.handleRegionCalculation( ExportType.SAIKU, rdbExporter.getJdbcTemplate() ); + progressListener.progressMade(new Progress(100, 100)); + + } + + public static boolean surveyContains(String nodeName, CollectSurvey survey) { + NodeDefinition nodeDefForNAme = survey.getSchema().findNodeDefinition( nodeDef -> nodeDef.getName().equals(nodeName) ); + return nodeDefForNAme != null; + } + + public static CSVReader getCsvReader(String csvFile) throws FileNotFoundException { + final BufferedReader bufferedReader = new BufferedReader( + new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 ) ); //$NON-NLS-1$ + return new CSVReader(bufferedReader); + } + + private void refreshDataSourceForSaiku() throws IOException, TemplateException { + final File mdxFile = new File(localPropertiesService.getProjectFolder() + File.separatorChar + MDX_XML); + + Map data = new HashMap<>(); + data.put("cubeFilePath", StringEscapeUtils.escapeJava(mdxFile.getAbsolutePath().replace('\\', '/'))); //$NON-NLS-1$ + + final File mdxTemplate = getMdxTemplate(); + final File dataSourceTemplate = getDataSourceTemplate(data); + + // First try Saiku 2.5/2.6 + File dataSourceFile; + try { + dataSourceFile = new File(getSaikuConfigurationFilePath()); + FreemarkerTemplateUtils.applyTemplate(dataSourceTemplate, dataSourceFile, data); + } catch (Exception e) { + logger.error("Error starting Saiku", e); + dataSourceFile = new File(getSaikuThreeConfigurationFilePath()); + FreemarkerTemplateUtils.applyTemplate(dataSourceTemplate, dataSourceFile, data); + } + + setMdxSaikuSchema(mdxTemplate, mdxFile); + } + + private File getMdxTemplate() throws IOException { + final File mdxFileTemplate = new File( + localPropertiesService.getProjectFolder() + File.separatorChar + MDX_TEMPLATE); + if (!mdxFileTemplate.exists()) { + throw new IOException( + "The file containing the MDX Cube definition Template does not exist in expected location " //$NON-NLS-1$ + + mdxFileTemplate.getAbsolutePath()); + } + return mdxFileTemplate; + } + + private File getDataSourceTemplate(Map data) throws IOException { + File dataSourceTemplate = null; + + if (localPropertiesService.isUsingSqliteDB()) { + dataSourceTemplate = new File(SQLITE_FREEMARKER_HTML_TEMPLATE); + final File rdbDb = rdbExporter.getRdbFile( ExportType.SAIKU ); + if (!rdbDb.exists()) { + throw new IOException( + "The file contianing the Relational SQLite Database does not exist in expected location " //$NON-NLS-1$ + + rdbDb.getAbsolutePath()); + } + data.put("rdbFilePath", StringEscapeUtils.escapeJava(rdbDb.getAbsolutePath().replace('\\', '/'))); //$NON-NLS-1$ + } else { + dataSourceTemplate = new File(POSTGRESQL_FREEMARKER_HTML_TEMPLATE); + CollectDBDriver collectDBDriver = localPropertiesService.getCollectDBDriver(); + data.put("dbUrl", StringEscapeUtils.escapeJava(ServerController.getSaikuDbURL(collectDBDriver))); //$NON-NLS-1$ + data.put("username", //$NON-NLS-1$ + StringEscapeUtils.escapeJava(localPropertiesService.getValue(EarthProperty.DB_USERNAME))); + data.put("password", //$NON-NLS-1$ + StringEscapeUtils.escapeJava(localPropertiesService.getValue(EarthProperty.DB_PASSWORD))); + } + + if (!dataSourceTemplate.exists()) { + throw new IOException( + "The file containing the Saiku Data Source template does not exist in expected location " //$NON-NLS-1$ + + dataSourceTemplate.getAbsolutePath()); + } + + return dataSourceTemplate; + } + + private void setMdxSaikuSchema(final File mdxFileTemplate, final File mdxFile) + throws IOException, TemplateException { + Map saikuData = new HashMap<>(); + String saikuSchemaName = getSchemaName(); + if (saikuSchemaName == null) { + saikuSchemaName = ""; //$NON-NLS-1$ + } + saikuData.put("saikuDbSchema", saikuSchemaName); //$NON-NLS-1$ + FreemarkerTemplateUtils.applyTemplate(mdxFileTemplate, mdxFile, saikuData); + } + + private void runSaikuBat(String commandName) throws SaikuExecutionException { + if (!isSaikuConfigured()) { + throw new SaikuExecutionException("The Saiku server is not configured."); //$NON-NLS-1$ + } + + else { + String saikuCmd = localPropertiesService.getSaikuFolder() + File.separator + commandName + + getCommandSuffix(); + + if (SystemUtils.IS_OS_WINDOWS) { + saikuCmd = "\"" + saikuCmd + "\""; //$NON-NLS-1$ //$NON-NLS-2$ + } + + try { + + Process runSaiku = runProcessBuilder(new String[] { saikuCmd }); + + if (commandName.equals(STOP_SAIKU)) { + int result = runSaiku.waitFor(); + logger.warn("Script ended with result {}", result); //$NON-NLS-1$ + } else if (commandName.equals(START_SAIKU)) { + Thread.sleep(6000); + } + + } catch (final IOException e) { + logger.error("Error when running Saiku start/stop command", e); //$NON-NLS-1$ + } catch (InterruptedException e) { + logger.error("Error while waiting to start", e); //$NON-NLS-1$ + Thread.currentThread().interrupt(); + } + } + } + + private void setMacJreHome(ProcessBuilder p) { + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX || SystemUtils.IS_OS_LINUX) { + + File javaFolder = new File("./java"); + + if (!javaFolder.exists()) { + String userName = System.getProperty("user.name"); + String testWithPath = "/Users/" + userName + "/OpenForis/CollectEarth/java"; + File testJavaPath = new File(testWithPath); + if (testJavaPath.exists()) { + javaFolder = testJavaPath; + } + } + + Map environment = p.environment(); + environment.put("COLLECT_EARTH_JRE_HOME", javaFolder.getAbsolutePath()); + + /* + * // In MAC the environment variable COLLECT_EARTH_JRE_HOME is not accesible + * from outside the bash, set it again! if( SystemUtils.IS_OS_MAC || + * SystemUtils.IS_OS_MAC_OSX){ try { File javaFolder = new File("./java"); + * + * if( !javaFolder.exists() ){ String userName = + * System.getProperty("user.name"); String testWithPath = "/Users/"+userName + + * "/OpenForis/CollectEarth/java"; File testJavaPath = new File(testWithPath); + * if( testJavaPath.exists()){ javaFolder = testJavaPath; } } + * + * Process setEnv = runProcessBuilder(new String[] { "/bin/bash", "setenv", + * "COLLECT_EARTH_JRE_HOME=\""+ javaFolder.getAbsolutePath() +"\"" }); + * setEnv.waitFor(); } catch (final IOException e) { + * logger.error("Error setting the COLLECT_EARTH_JRE_HOME environment variable", + * e); //$NON-NLS-1$ } catch (InterruptedException e) { + * logger.error("Error when running COLLECT_EARTH_JRE_HOME environment variable" + * , e); //$NON-NLS-1$ } } + */ + } + } + + private Process runProcessBuilder(String[] cmd) throws IOException { + final ProcessBuilder builder = new ProcessBuilder(cmd); + + // Fixes bug with Mac OS X not using the environemnt variable set for bash + setMacJreHome(builder); + + builder.directory(new File(localPropertiesService.getSaikuFolder()).getAbsoluteFile()); + builder.redirectErrorStream(true); + Process p = builder.start(); + (new ProcessLoggerThread(p.getInputStream(), Boolean.FALSE)).start(); + (new ProcessLoggerThread(p.getErrorStream(), Boolean.TRUE)).start(); + return p; + } + + private String getCommandSuffix() { + if (SystemUtils.IS_OS_WINDOWS) { + return COMMAND_SUFFIX_BAT; + } else { + return COMMAND_SUFFIX_SH; + } + } + + private void startSaiku() throws SaikuExecutionException { + logger.warn( + "Starting the Saiku server {}{}{}", localPropertiesService.getSaikuFolder(), File.separator, START_SAIKU); //$NON-NLS-1$ + + runSaikuBat(START_SAIKU); + + this.setSaikuStarted(true); + + logger.warn("Finished starting the Saiku server"); //$NON-NLS-1$ + } + + void stopSaiku() throws SaikuExecutionException { + logger.warn("Stoping the Saiku server {}{}{}", localPropertiesService.getSaikuFolder() , File.separator , STOP_SAIKU); //$NON-NLS-1$ + if (isSaikuStarted()) { + runSaikuBat(STOP_SAIKU); + this.setSaikuStarted(true); + } + logger.warn("Finished stoping the Saiku server"); //$NON-NLS-1$ + } + + private void stopSaikuOnExit() { + Runtime.getRuntime().addShutdownHook(new Thread("Shutting down Saiku on exit hook") { + @Override + public void run() { + try { + if (isSaikuStarted()) { + stopSaiku(); + } + } catch (final SaikuExecutionException e) { + logger.error("The Saiku server has been de-configured after it was started", e); //$NON-NLS-1$ + } + } + + }); + } + + private boolean isSaikuStarted() { + return saikuStarted; + } + + private void setSaikuStarted(boolean saikuStarted) { + this.saikuStarted = saikuStarted; + } + + @Override + public void destroy() throws Exception { + try { + stopSaiku(); + } catch (SaikuExecutionException e) { + logger.error("Error while trying to quite Saiku before destroying the bean", e); //$NON-NLS-1$ + } + } + + @Override + public LocalPropertiesService getLocalPropertiesService() { + return localPropertiesService; + } + + @Override + public EarthSurveyService getEarthSurveyService() { + return earthSurveyService; + } + + @Override + public RDBExporter getRdbExporter() { + return rdbExporter; + } + +} \ No newline at end of file From 83f41e3c726878e72defdd41ac7a4d132a1834ef Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:45 +0100 Subject: [PATCH 1019/1620] New translations AnalysisSaikuService.java (Spanish) --- .../earth/app/view/Messages_es.properties | 732 +++++++++++++++++- 1 file changed, 731 insertions(+), 1 deletion(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index fa1df1b41e..cba7f5812d 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1 +1,731 @@ -/DataRepositoryService.java_bc +package org.openforis.collect.earth.app.service; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.swing.SwingUtilities; + +import org.apache.commons.lang3.SystemUtils; +import org.apache.commons.text.StringEscapeUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; +import org.openforis.collect.earth.app.ad_hoc.AluToolUtils; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.model.AspectCode; +import org.openforis.collect.earth.app.model.DynamicsCode; +import org.openforis.collect.earth.app.model.SlopeCode; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; +import org.openforis.collect.model.CollectSurvey; +import org.openforis.collect.relational.CollectRDBPublisher; +import org.openforis.collect.relational.CollectRdbException; +import org.openforis.concurrency.Progress; +import org.openforis.idm.metamodel.NodeDefinition; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Component; + +import com.opencsv.CSVReader; + +import freemarker.template.TemplateException; + +@Component +public class AnalysisSaikuService extends GenerateDatabase implements DisposableBean{ + + private static final String PLOT_ADD = "plot ADD "; + + private static final String UPDATE = "UPDATE "; + + private static final String UNKNOWN = "Unknown"; + + private static final String VARCHAR_5 = " VARCHAR(5)"; + + private static final String INTEGER = " INTEGER"; + + private static final String ALTER_TABLE = "ALTER TABLE "; + + private static final String INSERT_INTO = "INSERT INTO "; + + private static final String CREATE_TABLE = "CREATE TABLE "; + + private static final String ALU_CLIMATE_ZONE_CODE = "alu_climate_zone_code"; //$NON-NLS-1$ + + private static final String ALU_SOIL_TYPE_CODE = "alu_soil_type_code"; //$NON-NLS-1$ + + private static final String ALU_SUBCLASS_CODE = "alu_subclass_code"; //$NON-NLS-1$ + + private static final String DYNAMICS_ID = "dynamics_id"; //$NON-NLS-1$ + + private static final String ELEVATION_ID = "elevation_id"; //$NON-NLS-1$ + + private static final String SLOPE_ID = "slope_id"; //$NON-NLS-1$ + + private static final String ASPECT_ID = "aspect_id"; //$NON-NLS-1$ + + private static final String START_SAIKU = "start-saiku"; //$NON-NLS-1$ + + private static final String STOP_SAIKU = "stop-saiku"; //$NON-NLS-1$ + + private static final String COMMAND_SUFFIX_BAT = ".bat"; //$NON-NLS-1$ + + private static final String COMMAND_SUFFIX_SH = ".sh"; //$NON-NLS-1$ + + public static final String COLLECT_EARTH_DATABASE_RDB_DB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + + EarthConstants.SAIKU_RDB_SUFFIX; + + + @Autowired + RDBExporter rdbExporter; + + @Autowired + CollectRDBPublisher collectRDBPublisher; + + @Autowired + EarthSurveyService earthSurveyService; + + @Autowired + public LocalPropertiesService localPropertiesService; + + @Autowired + BrowserService browserService; + + @Autowired + private RegionCalculationUtils regionCalculation; + + @Autowired + private SchemaService schemaNamingService; + + private static final int ELEVATION_RANGE = 100; + + private RemoteWebDriver saikuWebDriver; + + private static final String SQLITE_FREEMARKER_HTML_TEMPLATE = "resources" + File.separator //$NON-NLS-1$ + + "collectEarthSqliteDS.fmt"; //$NON-NLS-1$ + private static final String POSTGRESQL_FREEMARKER_HTML_TEMPLATE = "resources" + File.separator //$NON-NLS-1$ + + "collectEarthPostgreSqlDS.fmt"; //$NON-NLS-1$ + public static final String MDX_XML = "collectEarthCubes.xml"; //$NON-NLS-1$ + private static final String MDX_TEMPLATE = MDX_XML + ".fmt"; //$NON-NLS-1$ + + private boolean saikuStarted; + + private void assignDimensionValues() { + try { + final String schemaName = getSchemaPrefix(); + // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id + final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query( + "SELECT " + EarthConstants.PLOT_ID + ", elevation, slope, aspect FROM " + schemaName + "plot", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + new RowMapper() { + @Override + public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { + + final Object[] updateValues = new Object[4]; + + Integer aspect = AspectCode.NA.getId(); + if (AspectCode.getAspectCode(rs.getDouble("aspect")) != null) { //$NON-NLS-1$ + aspect = AspectCode.getAspectCode(rs.getDouble("aspect")).getId(); //$NON-NLS-1$ + } + + Integer slope = SlopeCode.NA.getId(); + + if (SlopeCode.getSlopeCode((int) rs.getFloat("slope")) != null) { //$NON-NLS-1$ + slope = SlopeCode.getSlopeCode((int) rs.getFloat("slope")).getId(); //$NON-NLS-1$ + } + + updateValues[0] = aspect; + updateValues[1] = slope; + updateValues[2] = ( (int) rs.getFloat("elevation") / ELEVATION_RANGE) + 1; // 0 //$NON-NLS-1$ + + updateValues[3] = rs.getLong(EarthConstants.PLOT_ID); + return updateValues; + } + + }); + + rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + ASPECT_ID + "=?," + SLOPE_ID + "=?," //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + ELEVATION_ID + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (Exception e) { + logger.warn("No DEM information", e); //$NON-NLS-1$ + } + } + + private String getSchemaPrefix() { + return schemaNamingService.getSchemaPrefix(ExportType.SAIKU); + } + + private void assignPngAluToolDimensionValues() { + try { + if (earthSurveyService.getCollectSurvey().getName().toLowerCase().contains("png")) { //$NON-NLS-1$ + final String schemaName = getSchemaPrefix(); + // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id + final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query("SELECT " + EarthConstants.PLOT_ID //$NON-NLS-1$ + + ", elevation, soil_fundamental, land_use_subcategory, precipitation_ranges FROM " + schemaName //$NON-NLS-1$ + + "plot LEFT JOIN " + schemaName + "precipitation_ranges_code where " //$NON-NLS-1$ //$NON-NLS-2$ + + "plot.annual_precipitation_code_id=precipitation_ranges_code.precipitation_ranges_code_id", //$NON-NLS-1$ + new RowMapper() { + @Override + public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { + + final Object[] updateValues = new Object[3]; + + try { + AluToolUtils aluToolUtils = new AluToolUtils(); + + Integer elevation = rs.getInt("elevation"); //$NON-NLS-1$ + String soilFundamental = rs.getString("soil_fundamental"); //$NON-NLS-1$ + String precipitationRange = rs.getString("precipitation_ranges"); //$NON-NLS-1$ + + int precipitation = -1; + String climateZone = UNKNOWN; //$NON-NLS-1$ + if (precipitationRange != null) { + precipitation = aluToolUtils.getPrecipitationFromRange(precipitationRange); + boolean shortDrySeason = true; // According to information from Abe PNG has less + // than 5 months of dry season + climateZone = aluToolUtils.getClimateZone(elevation, precipitation, + shortDrySeason); + } + + String soilType = UNKNOWN; //$NON-NLS-1$ + if (soilFundamental != null) { + soilType = aluToolUtils.getSoilType(soilFundamental); + } + + updateValues[0] = climateZone; + updateValues[1] = soilType; + updateValues[2] = rs.getLong(EarthConstants.PLOT_ID); + } catch (Exception e) { + logger.error("Error while processing the data", e); //$NON-NLS-1$ + updateValues[0] = UNKNOWN; //$NON-NLS-1$ + updateValues[1] = UNKNOWN; //$NON-NLS-1$ + updateValues[2] = UNKNOWN; //$NON-NLS-1$ + } + return updateValues; + } + + }); + + rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + ALU_CLIMATE_ZONE_CODE + "=?," //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + ALU_SOIL_TYPE_CODE + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ //$NON-NLS-2$ + } + } catch (Exception e) { + logger.error("No PNG ALU information", e); //$NON-NLS-1$ + } + } + + private void assignLUCDimensionValues() { + try { + final String schemaName = getSchemaPrefix(); + // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id + final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query( + "SELECT " + EarthConstants.PLOT_ID + ", land_use_subcategory FROM " + schemaName + "plot", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + new RowMapper() { + @Override + public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { + + AluToolUtils aluToolUtils = new AluToolUtils(); + final Object[] updateValues = new Object[3]; + + String collectEarthSubcategory = rs.getString("land_use_subcategory"); //$NON-NLS-1$ + Integer dynamics = DynamicsCode.getDynamicsCode(collectEarthSubcategory); + String subClass = UNKNOWN; //$NON-NLS-1$ + if (collectEarthSubcategory != null) { + subClass = aluToolUtils.getAluSubclass(collectEarthSubcategory); + } + + updateValues[0] = dynamics; + updateValues[1] = subClass; + updateValues[2] = rs.getLong(EarthConstants.PLOT_ID); + return updateValues; + } + + }); + + rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + DYNAMICS_ID + "=?," + ALU_SUBCLASS_CODE //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ + } catch (Exception e) { + logger.warn("No PNG Alu information available", e); //$NON-NLS-1$ + } + } + + private void createAspectAuxTable() { + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "aspect_category (" + ASPECT_ID //$NON-NLS-1$ //$NON-NLS-2$ + + " INTEGER PRIMARY KEY, aspect_caption TEXT);"); //$NON-NLS-1$ + final AspectCode[] aspects = AspectCode.values(); + for (final AspectCode aspectCode : aspects) { + rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "aspect_category values (" + aspectCode.getId() + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + aspectCode.getLabel() + "')"); //$NON-NLS-1$ + } + } + + private void createElevationtAuxTable() { + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "elevation_category ( " + ELEVATION_ID //$NON-NLS-1$ //$NON-NLS-2$ + + " INTEGER PRIMARY KEY, elevation_caption TEXT);"); //$NON-NLS-1$ + final int slots = 9000 / ELEVATION_RANGE; // Highest mountain in the world, mount everest is + // 8820m high + for (int i = 1; i <= slots; i++) { + rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "elevation_category values (" + i + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + ((i - 1) * ELEVATION_RANGE) + "-" + i //$NON-NLS-1$ + * ELEVATION_RANGE + + "')"); //$NON-NLS-1$ + } + + } + + private void createDynamicsAuxTable() { + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "dynamics_category (" + DYNAMICS_ID //$NON-NLS-1$ //$NON-NLS-2$ + + " INTEGER PRIMARY KEY, dynamics_caption TEXT);"); //$NON-NLS-1$ + final DynamicsCode[] dynamicsCodes = DynamicsCode.values(); + for (final DynamicsCode dynamicsCode : dynamicsCodes) { + rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "dynamics_category values (" + dynamicsCode.getId() //$NON-NLS-1$ //$NON-NLS-2$ + + ", '" + dynamicsCode.getLabel() + "')"); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + + private void createPlotForeignKeys() { + // Add aspect_id column to plot + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ASPECT_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + SLOPE_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ELEVATION_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + DYNAMICS_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + + private void createPngAluVariables() { + if (earthSurveyService.getCollectSurvey().getName().toLowerCase().contains("png")) { //$NON-NLS-1$ + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_SOIL_TYPE_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_CLIMATE_ZONE_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + } + + private void creatAluSubclassVariables() { + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_SUBCLASS_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + + private void createSlopeAuxTable() { + final String schemaName = getSchemaPrefix(); + // Slope can be from 0 to 90 + rdbExporter.getJdbcTemplate().execute( + CREATE_TABLE + schemaName + "slope_category (slope_id INTEGER PRIMARY KEY, slope_caption TEXT);"); //$NON-NLS-1$ //$NON-NLS-2$ + final SlopeCode[] slopeCodes = SlopeCode.values(); + for (final SlopeCode slopeCode : slopeCodes) { + rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "slope_category values (" + slopeCode.getId() + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + slopeCode.getLabel() + "')"); //$NON-NLS-1$ + } + } + + private String getSaikuConfigurationFilePath() { + + String configFile = localPropertiesService.getSaikuFolder() + "/" //$NON-NLS-1$ + + "tomcat/webapps/saiku/WEB-INF/classes/saiku-datasources/collectEarthDS"; //$NON-NLS-1$ + configFile = configFile.replace('/', File.separatorChar); + return configFile; + } + + private String getSaikuThreeConfigurationFilePath() { + + String configFile = localPropertiesService.getSaikuFolder() + "/" //$NON-NLS-1$ + + "tomcat/webapps/saiku/WEB-INF/classes/legacy-datasources/collectEarthDS"; //$NON-NLS-1$ + configFile = configFile.replace('/', File.separatorChar); + return configFile; + } + + private boolean isSaikuConfigured() { + return localPropertiesService.getSaikuFolder() != null + && isSaikuFolder(new File(localPropertiesService.getSaikuFolder())); + } + + /* + * private boolean isJavaHomeConfigured() { + * + * if (SystemUtils.IS_OS_MAC){ return true; } return ! ( StringUtils.isBlank( + * System.getenv("JAVA_HOME") ) //$NON-NLS-1$ && StringUtils.isBlank( + * System.getenv("JRE_HOME") ) //$NON-NLS-1$ && StringUtils.isBlank( + * System.getenv("COLLECT_EARTH_JRE_HOME") ) //$NON-NLS-1$ ); } + */ + + public boolean isSaikuFolder(File saikuFolder) { + boolean isSaikuFolder = false; + if (saikuFolder.listFiles() != null) { + for (final File file : saikuFolder.listFiles()) { + if (file.getName().equals(START_SAIKU + getCommandSuffix())) { + isSaikuFolder = true; + } + } + } + return isSaikuFolder; + } + + private void openSaiku() throws BrowserNotFoundException { + saikuWebDriver = browserService.navigateTo("http://127.0.0.1:8181", saikuWebDriver, false); //$NON-NLS-1$ + if (browserService.waitFor("username", saikuWebDriver)) { //$NON-NLS-1$ + saikuWebDriver.findElementByName("username").sendKeys("admin"); //$NON-NLS-1$ //$NON-NLS-2$ + saikuWebDriver.findElementByName("password").sendKeys("admin"); //$NON-NLS-1$ //$NON-NLS-2$ + saikuWebDriver.findElementByClassName("form_button").click(); //$NON-NLS-1$ + } + } + + + public void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws SaikuExecutionException { + + try { + + stopSaiku(); + + try { + + if ((localPropertiesService.isUsingSqliteDB() && !getZippedProjectDB( ExportType.SAIKU ).exists()) + || isRefreshDatabase()) { + + // The user clicked on the option to refresh the database, or there is no + // previous copy of the Saiku DB + // Generate the DB file + rdbExporter.exportDataToRDB( + earthSurveyService.getCollectSurvey(), + ExportType.SAIKU, + progressListener, + this::processQuantityData + ); + + try { + // Save the DB file in a zipped file to extends GenerateDatabase keep for the next usages + replaceZippedProjectDB( ExportType.SAIKU ); + } catch (Exception e) { + logger.error("Error while refreshing the Zipped content of the project Saiku DB", e); + } + + } else if (getZippedProjectDB(ExportType.SAIKU).exists() && localPropertiesService.isUsingSqliteDB()) { + // If the zipped version of the project exists ( and the user clicked on the + // option to not refresh it) then restore this last version of the data + restoreZippedProjectDB(ExportType.SAIKU); + } + + refreshDataSourceForSaiku(); + + if (startSaikuAfterDBExport && !isUserCancelledOperation()) { + startSaiku(); + new Thread("Opening Saiku") { + @Override + public void run() { + try { + AnalysisSaikuService.this.openSaiku(); + } catch (BrowserNotFoundException e) { + logger.error("No browser has been set up", e); //$NON-NLS-1$ + } + }; + }.start(); + + stopSaikuOnExit(); + } + } catch (final IOException e) { + logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ + } catch (TemplateException e1) { + logger.error("Error while applying the freemarker template tothe Saiku data source", e1); //$NON-NLS-1$ + } + + } catch (final CollectRdbException e) { + logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ + } + } + + private void processQuantityData(InfiniteProgressMonitor progressListener) { + + SwingUtilities.invokeLater( () -> progressListener.setMessage("Preparing Saiku data for analysis") ); + + progressListener.progressMade(new Progress(0, 100)); + createPngAluVariables(); + createPlotForeignKeys(); + + progressListener.progressMade(new Progress(25, 100)); + + if (!surveyContains("calculated_elevation_range", earthSurveyService.getCollectSurvey())) { + createAspectAuxTable(); + createSlopeAuxTable(); + createElevationtAuxTable(); + assignDimensionValues(); + + } + progressListener.progressMade(new Progress(50, 100)); + + if (!surveyContains("calculated_initial_land_use", earthSurveyService.getCollectSurvey())) { + createDynamicsAuxTable(); + creatAluSubclassVariables(); + assignLUCDimensionValues(); + + } + progressListener.progressMade(new Progress(75, 100)); + + assignPngAluToolDimensionValues(); + + SwingUtilities.invokeLater( () -> progressListener.setMessage("Calculating expansion factors") ); + + regionCalculation.handleRegionCalculation( ExportType.SAIKU, rdbExporter.getJdbcTemplate() ); + progressListener.progressMade(new Progress(100, 100)); + + } + + public static boolean surveyContains(String nodeName, CollectSurvey survey) { + NodeDefinition nodeDefForNAme = survey.getSchema().findNodeDefinition( nodeDef -> nodeDef.getName().equals(nodeName) ); + return nodeDefForNAme != null; + } + + public static CSVReader getCsvReader(String csvFile) throws FileNotFoundException { + final BufferedReader bufferedReader = new BufferedReader( + new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 ) ); //$NON-NLS-1$ + return new CSVReader(bufferedReader); + } + + private void refreshDataSourceForSaiku() throws IOException, TemplateException { + final File mdxFile = new File(localPropertiesService.getProjectFolder() + File.separatorChar + MDX_XML); + + Map data = new HashMap<>(); + data.put("cubeFilePath", StringEscapeUtils.escapeJava(mdxFile.getAbsolutePath().replace('\\', '/'))); //$NON-NLS-1$ + + final File mdxTemplate = getMdxTemplate(); + final File dataSourceTemplate = getDataSourceTemplate(data); + + // First try Saiku 2.5/2.6 + File dataSourceFile; + try { + dataSourceFile = new File(getSaikuConfigurationFilePath()); + FreemarkerTemplateUtils.applyTemplate(dataSourceTemplate, dataSourceFile, data); + } catch (Exception e) { + logger.error("Error starting Saiku", e); + dataSourceFile = new File(getSaikuThreeConfigurationFilePath()); + FreemarkerTemplateUtils.applyTemplate(dataSourceTemplate, dataSourceFile, data); + } + + setMdxSaikuSchema(mdxTemplate, mdxFile); + } + + private File getMdxTemplate() throws IOException { + final File mdxFileTemplate = new File( + localPropertiesService.getProjectFolder() + File.separatorChar + MDX_TEMPLATE); + if (!mdxFileTemplate.exists()) { + throw new IOException( + "The file containing the MDX Cube definition Template does not exist in expected location " //$NON-NLS-1$ + + mdxFileTemplate.getAbsolutePath()); + } + return mdxFileTemplate; + } + + private File getDataSourceTemplate(Map data) throws IOException { + File dataSourceTemplate = null; + + if (localPropertiesService.isUsingSqliteDB()) { + dataSourceTemplate = new File(SQLITE_FREEMARKER_HTML_TEMPLATE); + final File rdbDb = rdbExporter.getRdbFile( ExportType.SAIKU ); + if (!rdbDb.exists()) { + throw new IOException( + "The file contianing the Relational SQLite Database does not exist in expected location " //$NON-NLS-1$ + + rdbDb.getAbsolutePath()); + } + data.put("rdbFilePath", StringEscapeUtils.escapeJava(rdbDb.getAbsolutePath().replace('\\', '/'))); //$NON-NLS-1$ + } else { + dataSourceTemplate = new File(POSTGRESQL_FREEMARKER_HTML_TEMPLATE); + CollectDBDriver collectDBDriver = localPropertiesService.getCollectDBDriver(); + data.put("dbUrl", StringEscapeUtils.escapeJava(ServerController.getSaikuDbURL(collectDBDriver))); //$NON-NLS-1$ + data.put("username", //$NON-NLS-1$ + StringEscapeUtils.escapeJava(localPropertiesService.getValue(EarthProperty.DB_USERNAME))); + data.put("password", //$NON-NLS-1$ + StringEscapeUtils.escapeJava(localPropertiesService.getValue(EarthProperty.DB_PASSWORD))); + } + + if (!dataSourceTemplate.exists()) { + throw new IOException( + "The file containing the Saiku Data Source template does not exist in expected location " //$NON-NLS-1$ + + dataSourceTemplate.getAbsolutePath()); + } + + return dataSourceTemplate; + } + + private void setMdxSaikuSchema(final File mdxFileTemplate, final File mdxFile) + throws IOException, TemplateException { + Map saikuData = new HashMap<>(); + String saikuSchemaName = getSchemaName(); + if (saikuSchemaName == null) { + saikuSchemaName = ""; //$NON-NLS-1$ + } + saikuData.put("saikuDbSchema", saikuSchemaName); //$NON-NLS-1$ + FreemarkerTemplateUtils.applyTemplate(mdxFileTemplate, mdxFile, saikuData); + } + + private void runSaikuBat(String commandName) throws SaikuExecutionException { + if (!isSaikuConfigured()) { + throw new SaikuExecutionException("The Saiku server is not configured."); //$NON-NLS-1$ + } + + else { + String saikuCmd = localPropertiesService.getSaikuFolder() + File.separator + commandName + + getCommandSuffix(); + + if (SystemUtils.IS_OS_WINDOWS) { + saikuCmd = "\"" + saikuCmd + "\""; //$NON-NLS-1$ //$NON-NLS-2$ + } + + try { + + Process runSaiku = runProcessBuilder(new String[] { saikuCmd }); + + if (commandName.equals(STOP_SAIKU)) { + int result = runSaiku.waitFor(); + logger.warn("Script ended with result {}", result); //$NON-NLS-1$ + } else if (commandName.equals(START_SAIKU)) { + Thread.sleep(6000); + } + + } catch (final IOException e) { + logger.error("Error when running Saiku start/stop command", e); //$NON-NLS-1$ + } catch (InterruptedException e) { + logger.error("Error while waiting to start", e); //$NON-NLS-1$ + Thread.currentThread().interrupt(); + } + } + } + + private void setMacJreHome(ProcessBuilder p) { + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX || SystemUtils.IS_OS_LINUX) { + + File javaFolder = new File("./java"); + + if (!javaFolder.exists()) { + String userName = System.getProperty("user.name"); + String testWithPath = "/Users/" + userName + "/OpenForis/CollectEarth/java"; + File testJavaPath = new File(testWithPath); + if (testJavaPath.exists()) { + javaFolder = testJavaPath; + } + } + + Map environment = p.environment(); + environment.put("COLLECT_EARTH_JRE_HOME", javaFolder.getAbsolutePath()); + + /* + * // In MAC the environment variable COLLECT_EARTH_JRE_HOME is not accesible + * from outside the bash, set it again! if( SystemUtils.IS_OS_MAC || + * SystemUtils.IS_OS_MAC_OSX){ try { File javaFolder = new File("./java"); + * + * if( !javaFolder.exists() ){ String userName = + * System.getProperty("user.name"); String testWithPath = "/Users/"+userName + + * "/OpenForis/CollectEarth/java"; File testJavaPath = new File(testWithPath); + * if( testJavaPath.exists()){ javaFolder = testJavaPath; } } + * + * Process setEnv = runProcessBuilder(new String[] { "/bin/bash", "setenv", + * "COLLECT_EARTH_JRE_HOME=\""+ javaFolder.getAbsolutePath() +"\"" }); + * setEnv.waitFor(); } catch (final IOException e) { + * logger.error("Error setting the COLLECT_EARTH_JRE_HOME environment variable", + * e); //$NON-NLS-1$ } catch (InterruptedException e) { + * logger.error("Error when running COLLECT_EARTH_JRE_HOME environment variable" + * , e); //$NON-NLS-1$ } } + */ + } + } + + private Process runProcessBuilder(String[] cmd) throws IOException { + final ProcessBuilder builder = new ProcessBuilder(cmd); + + // Fixes bug with Mac OS X not using the environemnt variable set for bash + setMacJreHome(builder); + + builder.directory(new File(localPropertiesService.getSaikuFolder()).getAbsoluteFile()); + builder.redirectErrorStream(true); + Process p = builder.start(); + (new ProcessLoggerThread(p.getInputStream(), Boolean.FALSE)).start(); + (new ProcessLoggerThread(p.getErrorStream(), Boolean.TRUE)).start(); + return p; + } + + private String getCommandSuffix() { + if (SystemUtils.IS_OS_WINDOWS) { + return COMMAND_SUFFIX_BAT; + } else { + return COMMAND_SUFFIX_SH; + } + } + + private void startSaiku() throws SaikuExecutionException { + logger.warn( + "Starting the Saiku server {}{}{}", localPropertiesService.getSaikuFolder(), File.separator, START_SAIKU); //$NON-NLS-1$ + + runSaikuBat(START_SAIKU); + + this.setSaikuStarted(true); + + logger.warn("Finished starting the Saiku server"); //$NON-NLS-1$ + } + + void stopSaiku() throws SaikuExecutionException { + logger.warn("Stoping the Saiku server {}{}{}", localPropertiesService.getSaikuFolder() , File.separator , STOP_SAIKU); //$NON-NLS-1$ + if (isSaikuStarted()) { + runSaikuBat(STOP_SAIKU); + this.setSaikuStarted(true); + } + logger.warn("Finished stoping the Saiku server"); //$NON-NLS-1$ + } + + private void stopSaikuOnExit() { + Runtime.getRuntime().addShutdownHook(new Thread("Shutting down Saiku on exit hook") { + @Override + public void run() { + try { + if (isSaikuStarted()) { + stopSaiku(); + } + } catch (final SaikuExecutionException e) { + logger.error("The Saiku server has been de-configured after it was started", e); //$NON-NLS-1$ + } + } + + }); + } + + private boolean isSaikuStarted() { + return saikuStarted; + } + + private void setSaikuStarted(boolean saikuStarted) { + this.saikuStarted = saikuStarted; + } + + @Override + public void destroy() throws Exception { + try { + stopSaiku(); + } catch (SaikuExecutionException e) { + logger.error("Error while trying to quite Saiku before destroying the bean", e); //$NON-NLS-1$ + } + } + + @Override + public LocalPropertiesService getLocalPropertiesService() { + return localPropertiesService; + } + + @Override + public EarthSurveyService getEarthSurveyService() { + return earthSurveyService; + } + + @Override + public RDBExporter getRdbExporter() { + return rdbExporter; + } + +} \ No newline at end of file From 941cc0934d900394325d37aae47586616b870bfa Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:47 +0100 Subject: [PATCH 1020/1620] New translations AnalysisSaikuService.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 732 +++++++++++++++++- 1 file changed, 731 insertions(+), 1 deletion(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index fa1df1b41e..cba7f5812d 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1 +1,731 @@ -/DataRepositoryService.java_bc +package org.openforis.collect.earth.app.service; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.swing.SwingUtilities; + +import org.apache.commons.lang3.SystemUtils; +import org.apache.commons.text.StringEscapeUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; +import org.openforis.collect.earth.app.ad_hoc.AluToolUtils; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.model.AspectCode; +import org.openforis.collect.earth.app.model.DynamicsCode; +import org.openforis.collect.earth.app.model.SlopeCode; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; +import org.openforis.collect.model.CollectSurvey; +import org.openforis.collect.relational.CollectRDBPublisher; +import org.openforis.collect.relational.CollectRdbException; +import org.openforis.concurrency.Progress; +import org.openforis.idm.metamodel.NodeDefinition; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Component; + +import com.opencsv.CSVReader; + +import freemarker.template.TemplateException; + +@Component +public class AnalysisSaikuService extends GenerateDatabase implements DisposableBean{ + + private static final String PLOT_ADD = "plot ADD "; + + private static final String UPDATE = "UPDATE "; + + private static final String UNKNOWN = "Unknown"; + + private static final String VARCHAR_5 = " VARCHAR(5)"; + + private static final String INTEGER = " INTEGER"; + + private static final String ALTER_TABLE = "ALTER TABLE "; + + private static final String INSERT_INTO = "INSERT INTO "; + + private static final String CREATE_TABLE = "CREATE TABLE "; + + private static final String ALU_CLIMATE_ZONE_CODE = "alu_climate_zone_code"; //$NON-NLS-1$ + + private static final String ALU_SOIL_TYPE_CODE = "alu_soil_type_code"; //$NON-NLS-1$ + + private static final String ALU_SUBCLASS_CODE = "alu_subclass_code"; //$NON-NLS-1$ + + private static final String DYNAMICS_ID = "dynamics_id"; //$NON-NLS-1$ + + private static final String ELEVATION_ID = "elevation_id"; //$NON-NLS-1$ + + private static final String SLOPE_ID = "slope_id"; //$NON-NLS-1$ + + private static final String ASPECT_ID = "aspect_id"; //$NON-NLS-1$ + + private static final String START_SAIKU = "start-saiku"; //$NON-NLS-1$ + + private static final String STOP_SAIKU = "stop-saiku"; //$NON-NLS-1$ + + private static final String COMMAND_SUFFIX_BAT = ".bat"; //$NON-NLS-1$ + + private static final String COMMAND_SUFFIX_SH = ".sh"; //$NON-NLS-1$ + + public static final String COLLECT_EARTH_DATABASE_RDB_DB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + + EarthConstants.SAIKU_RDB_SUFFIX; + + + @Autowired + RDBExporter rdbExporter; + + @Autowired + CollectRDBPublisher collectRDBPublisher; + + @Autowired + EarthSurveyService earthSurveyService; + + @Autowired + public LocalPropertiesService localPropertiesService; + + @Autowired + BrowserService browserService; + + @Autowired + private RegionCalculationUtils regionCalculation; + + @Autowired + private SchemaService schemaNamingService; + + private static final int ELEVATION_RANGE = 100; + + private RemoteWebDriver saikuWebDriver; + + private static final String SQLITE_FREEMARKER_HTML_TEMPLATE = "resources" + File.separator //$NON-NLS-1$ + + "collectEarthSqliteDS.fmt"; //$NON-NLS-1$ + private static final String POSTGRESQL_FREEMARKER_HTML_TEMPLATE = "resources" + File.separator //$NON-NLS-1$ + + "collectEarthPostgreSqlDS.fmt"; //$NON-NLS-1$ + public static final String MDX_XML = "collectEarthCubes.xml"; //$NON-NLS-1$ + private static final String MDX_TEMPLATE = MDX_XML + ".fmt"; //$NON-NLS-1$ + + private boolean saikuStarted; + + private void assignDimensionValues() { + try { + final String schemaName = getSchemaPrefix(); + // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id + final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query( + "SELECT " + EarthConstants.PLOT_ID + ", elevation, slope, aspect FROM " + schemaName + "plot", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + new RowMapper() { + @Override + public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { + + final Object[] updateValues = new Object[4]; + + Integer aspect = AspectCode.NA.getId(); + if (AspectCode.getAspectCode(rs.getDouble("aspect")) != null) { //$NON-NLS-1$ + aspect = AspectCode.getAspectCode(rs.getDouble("aspect")).getId(); //$NON-NLS-1$ + } + + Integer slope = SlopeCode.NA.getId(); + + if (SlopeCode.getSlopeCode((int) rs.getFloat("slope")) != null) { //$NON-NLS-1$ + slope = SlopeCode.getSlopeCode((int) rs.getFloat("slope")).getId(); //$NON-NLS-1$ + } + + updateValues[0] = aspect; + updateValues[1] = slope; + updateValues[2] = ( (int) rs.getFloat("elevation") / ELEVATION_RANGE) + 1; // 0 //$NON-NLS-1$ + + updateValues[3] = rs.getLong(EarthConstants.PLOT_ID); + return updateValues; + } + + }); + + rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + ASPECT_ID + "=?," + SLOPE_ID + "=?," //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + ELEVATION_ID + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (Exception e) { + logger.warn("No DEM information", e); //$NON-NLS-1$ + } + } + + private String getSchemaPrefix() { + return schemaNamingService.getSchemaPrefix(ExportType.SAIKU); + } + + private void assignPngAluToolDimensionValues() { + try { + if (earthSurveyService.getCollectSurvey().getName().toLowerCase().contains("png")) { //$NON-NLS-1$ + final String schemaName = getSchemaPrefix(); + // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id + final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query("SELECT " + EarthConstants.PLOT_ID //$NON-NLS-1$ + + ", elevation, soil_fundamental, land_use_subcategory, precipitation_ranges FROM " + schemaName //$NON-NLS-1$ + + "plot LEFT JOIN " + schemaName + "precipitation_ranges_code where " //$NON-NLS-1$ //$NON-NLS-2$ + + "plot.annual_precipitation_code_id=precipitation_ranges_code.precipitation_ranges_code_id", //$NON-NLS-1$ + new RowMapper() { + @Override + public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { + + final Object[] updateValues = new Object[3]; + + try { + AluToolUtils aluToolUtils = new AluToolUtils(); + + Integer elevation = rs.getInt("elevation"); //$NON-NLS-1$ + String soilFundamental = rs.getString("soil_fundamental"); //$NON-NLS-1$ + String precipitationRange = rs.getString("precipitation_ranges"); //$NON-NLS-1$ + + int precipitation = -1; + String climateZone = UNKNOWN; //$NON-NLS-1$ + if (precipitationRange != null) { + precipitation = aluToolUtils.getPrecipitationFromRange(precipitationRange); + boolean shortDrySeason = true; // According to information from Abe PNG has less + // than 5 months of dry season + climateZone = aluToolUtils.getClimateZone(elevation, precipitation, + shortDrySeason); + } + + String soilType = UNKNOWN; //$NON-NLS-1$ + if (soilFundamental != null) { + soilType = aluToolUtils.getSoilType(soilFundamental); + } + + updateValues[0] = climateZone; + updateValues[1] = soilType; + updateValues[2] = rs.getLong(EarthConstants.PLOT_ID); + } catch (Exception e) { + logger.error("Error while processing the data", e); //$NON-NLS-1$ + updateValues[0] = UNKNOWN; //$NON-NLS-1$ + updateValues[1] = UNKNOWN; //$NON-NLS-1$ + updateValues[2] = UNKNOWN; //$NON-NLS-1$ + } + return updateValues; + } + + }); + + rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + ALU_CLIMATE_ZONE_CODE + "=?," //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + ALU_SOIL_TYPE_CODE + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ //$NON-NLS-2$ + } + } catch (Exception e) { + logger.error("No PNG ALU information", e); //$NON-NLS-1$ + } + } + + private void assignLUCDimensionValues() { + try { + final String schemaName = getSchemaPrefix(); + // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id + final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query( + "SELECT " + EarthConstants.PLOT_ID + ", land_use_subcategory FROM " + schemaName + "plot", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + new RowMapper() { + @Override + public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { + + AluToolUtils aluToolUtils = new AluToolUtils(); + final Object[] updateValues = new Object[3]; + + String collectEarthSubcategory = rs.getString("land_use_subcategory"); //$NON-NLS-1$ + Integer dynamics = DynamicsCode.getDynamicsCode(collectEarthSubcategory); + String subClass = UNKNOWN; //$NON-NLS-1$ + if (collectEarthSubcategory != null) { + subClass = aluToolUtils.getAluSubclass(collectEarthSubcategory); + } + + updateValues[0] = dynamics; + updateValues[1] = subClass; + updateValues[2] = rs.getLong(EarthConstants.PLOT_ID); + return updateValues; + } + + }); + + rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + DYNAMICS_ID + "=?," + ALU_SUBCLASS_CODE //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ + } catch (Exception e) { + logger.warn("No PNG Alu information available", e); //$NON-NLS-1$ + } + } + + private void createAspectAuxTable() { + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "aspect_category (" + ASPECT_ID //$NON-NLS-1$ //$NON-NLS-2$ + + " INTEGER PRIMARY KEY, aspect_caption TEXT);"); //$NON-NLS-1$ + final AspectCode[] aspects = AspectCode.values(); + for (final AspectCode aspectCode : aspects) { + rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "aspect_category values (" + aspectCode.getId() + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + aspectCode.getLabel() + "')"); //$NON-NLS-1$ + } + } + + private void createElevationtAuxTable() { + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "elevation_category ( " + ELEVATION_ID //$NON-NLS-1$ //$NON-NLS-2$ + + " INTEGER PRIMARY KEY, elevation_caption TEXT);"); //$NON-NLS-1$ + final int slots = 9000 / ELEVATION_RANGE; // Highest mountain in the world, mount everest is + // 8820m high + for (int i = 1; i <= slots; i++) { + rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "elevation_category values (" + i + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + ((i - 1) * ELEVATION_RANGE) + "-" + i //$NON-NLS-1$ + * ELEVATION_RANGE + + "')"); //$NON-NLS-1$ + } + + } + + private void createDynamicsAuxTable() { + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "dynamics_category (" + DYNAMICS_ID //$NON-NLS-1$ //$NON-NLS-2$ + + " INTEGER PRIMARY KEY, dynamics_caption TEXT);"); //$NON-NLS-1$ + final DynamicsCode[] dynamicsCodes = DynamicsCode.values(); + for (final DynamicsCode dynamicsCode : dynamicsCodes) { + rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "dynamics_category values (" + dynamicsCode.getId() //$NON-NLS-1$ //$NON-NLS-2$ + + ", '" + dynamicsCode.getLabel() + "')"); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + + private void createPlotForeignKeys() { + // Add aspect_id column to plot + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ASPECT_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + SLOPE_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ELEVATION_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + DYNAMICS_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + + private void createPngAluVariables() { + if (earthSurveyService.getCollectSurvey().getName().toLowerCase().contains("png")) { //$NON-NLS-1$ + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_SOIL_TYPE_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_CLIMATE_ZONE_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + } + + private void creatAluSubclassVariables() { + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_SUBCLASS_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + + private void createSlopeAuxTable() { + final String schemaName = getSchemaPrefix(); + // Slope can be from 0 to 90 + rdbExporter.getJdbcTemplate().execute( + CREATE_TABLE + schemaName + "slope_category (slope_id INTEGER PRIMARY KEY, slope_caption TEXT);"); //$NON-NLS-1$ //$NON-NLS-2$ + final SlopeCode[] slopeCodes = SlopeCode.values(); + for (final SlopeCode slopeCode : slopeCodes) { + rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "slope_category values (" + slopeCode.getId() + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + slopeCode.getLabel() + "')"); //$NON-NLS-1$ + } + } + + private String getSaikuConfigurationFilePath() { + + String configFile = localPropertiesService.getSaikuFolder() + "/" //$NON-NLS-1$ + + "tomcat/webapps/saiku/WEB-INF/classes/saiku-datasources/collectEarthDS"; //$NON-NLS-1$ + configFile = configFile.replace('/', File.separatorChar); + return configFile; + } + + private String getSaikuThreeConfigurationFilePath() { + + String configFile = localPropertiesService.getSaikuFolder() + "/" //$NON-NLS-1$ + + "tomcat/webapps/saiku/WEB-INF/classes/legacy-datasources/collectEarthDS"; //$NON-NLS-1$ + configFile = configFile.replace('/', File.separatorChar); + return configFile; + } + + private boolean isSaikuConfigured() { + return localPropertiesService.getSaikuFolder() != null + && isSaikuFolder(new File(localPropertiesService.getSaikuFolder())); + } + + /* + * private boolean isJavaHomeConfigured() { + * + * if (SystemUtils.IS_OS_MAC){ return true; } return ! ( StringUtils.isBlank( + * System.getenv("JAVA_HOME") ) //$NON-NLS-1$ && StringUtils.isBlank( + * System.getenv("JRE_HOME") ) //$NON-NLS-1$ && StringUtils.isBlank( + * System.getenv("COLLECT_EARTH_JRE_HOME") ) //$NON-NLS-1$ ); } + */ + + public boolean isSaikuFolder(File saikuFolder) { + boolean isSaikuFolder = false; + if (saikuFolder.listFiles() != null) { + for (final File file : saikuFolder.listFiles()) { + if (file.getName().equals(START_SAIKU + getCommandSuffix())) { + isSaikuFolder = true; + } + } + } + return isSaikuFolder; + } + + private void openSaiku() throws BrowserNotFoundException { + saikuWebDriver = browserService.navigateTo("http://127.0.0.1:8181", saikuWebDriver, false); //$NON-NLS-1$ + if (browserService.waitFor("username", saikuWebDriver)) { //$NON-NLS-1$ + saikuWebDriver.findElementByName("username").sendKeys("admin"); //$NON-NLS-1$ //$NON-NLS-2$ + saikuWebDriver.findElementByName("password").sendKeys("admin"); //$NON-NLS-1$ //$NON-NLS-2$ + saikuWebDriver.findElementByClassName("form_button").click(); //$NON-NLS-1$ + } + } + + + public void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws SaikuExecutionException { + + try { + + stopSaiku(); + + try { + + if ((localPropertiesService.isUsingSqliteDB() && !getZippedProjectDB( ExportType.SAIKU ).exists()) + || isRefreshDatabase()) { + + // The user clicked on the option to refresh the database, or there is no + // previous copy of the Saiku DB + // Generate the DB file + rdbExporter.exportDataToRDB( + earthSurveyService.getCollectSurvey(), + ExportType.SAIKU, + progressListener, + this::processQuantityData + ); + + try { + // Save the DB file in a zipped file to extends GenerateDatabase keep for the next usages + replaceZippedProjectDB( ExportType.SAIKU ); + } catch (Exception e) { + logger.error("Error while refreshing the Zipped content of the project Saiku DB", e); + } + + } else if (getZippedProjectDB(ExportType.SAIKU).exists() && localPropertiesService.isUsingSqliteDB()) { + // If the zipped version of the project exists ( and the user clicked on the + // option to not refresh it) then restore this last version of the data + restoreZippedProjectDB(ExportType.SAIKU); + } + + refreshDataSourceForSaiku(); + + if (startSaikuAfterDBExport && !isUserCancelledOperation()) { + startSaiku(); + new Thread("Opening Saiku") { + @Override + public void run() { + try { + AnalysisSaikuService.this.openSaiku(); + } catch (BrowserNotFoundException e) { + logger.error("No browser has been set up", e); //$NON-NLS-1$ + } + }; + }.start(); + + stopSaikuOnExit(); + } + } catch (final IOException e) { + logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ + } catch (TemplateException e1) { + logger.error("Error while applying the freemarker template tothe Saiku data source", e1); //$NON-NLS-1$ + } + + } catch (final CollectRdbException e) { + logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ + } + } + + private void processQuantityData(InfiniteProgressMonitor progressListener) { + + SwingUtilities.invokeLater( () -> progressListener.setMessage("Preparing Saiku data for analysis") ); + + progressListener.progressMade(new Progress(0, 100)); + createPngAluVariables(); + createPlotForeignKeys(); + + progressListener.progressMade(new Progress(25, 100)); + + if (!surveyContains("calculated_elevation_range", earthSurveyService.getCollectSurvey())) { + createAspectAuxTable(); + createSlopeAuxTable(); + createElevationtAuxTable(); + assignDimensionValues(); + + } + progressListener.progressMade(new Progress(50, 100)); + + if (!surveyContains("calculated_initial_land_use", earthSurveyService.getCollectSurvey())) { + createDynamicsAuxTable(); + creatAluSubclassVariables(); + assignLUCDimensionValues(); + + } + progressListener.progressMade(new Progress(75, 100)); + + assignPngAluToolDimensionValues(); + + SwingUtilities.invokeLater( () -> progressListener.setMessage("Calculating expansion factors") ); + + regionCalculation.handleRegionCalculation( ExportType.SAIKU, rdbExporter.getJdbcTemplate() ); + progressListener.progressMade(new Progress(100, 100)); + + } + + public static boolean surveyContains(String nodeName, CollectSurvey survey) { + NodeDefinition nodeDefForNAme = survey.getSchema().findNodeDefinition( nodeDef -> nodeDef.getName().equals(nodeName) ); + return nodeDefForNAme != null; + } + + public static CSVReader getCsvReader(String csvFile) throws FileNotFoundException { + final BufferedReader bufferedReader = new BufferedReader( + new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 ) ); //$NON-NLS-1$ + return new CSVReader(bufferedReader); + } + + private void refreshDataSourceForSaiku() throws IOException, TemplateException { + final File mdxFile = new File(localPropertiesService.getProjectFolder() + File.separatorChar + MDX_XML); + + Map data = new HashMap<>(); + data.put("cubeFilePath", StringEscapeUtils.escapeJava(mdxFile.getAbsolutePath().replace('\\', '/'))); //$NON-NLS-1$ + + final File mdxTemplate = getMdxTemplate(); + final File dataSourceTemplate = getDataSourceTemplate(data); + + // First try Saiku 2.5/2.6 + File dataSourceFile; + try { + dataSourceFile = new File(getSaikuConfigurationFilePath()); + FreemarkerTemplateUtils.applyTemplate(dataSourceTemplate, dataSourceFile, data); + } catch (Exception e) { + logger.error("Error starting Saiku", e); + dataSourceFile = new File(getSaikuThreeConfigurationFilePath()); + FreemarkerTemplateUtils.applyTemplate(dataSourceTemplate, dataSourceFile, data); + } + + setMdxSaikuSchema(mdxTemplate, mdxFile); + } + + private File getMdxTemplate() throws IOException { + final File mdxFileTemplate = new File( + localPropertiesService.getProjectFolder() + File.separatorChar + MDX_TEMPLATE); + if (!mdxFileTemplate.exists()) { + throw new IOException( + "The file containing the MDX Cube definition Template does not exist in expected location " //$NON-NLS-1$ + + mdxFileTemplate.getAbsolutePath()); + } + return mdxFileTemplate; + } + + private File getDataSourceTemplate(Map data) throws IOException { + File dataSourceTemplate = null; + + if (localPropertiesService.isUsingSqliteDB()) { + dataSourceTemplate = new File(SQLITE_FREEMARKER_HTML_TEMPLATE); + final File rdbDb = rdbExporter.getRdbFile( ExportType.SAIKU ); + if (!rdbDb.exists()) { + throw new IOException( + "The file contianing the Relational SQLite Database does not exist in expected location " //$NON-NLS-1$ + + rdbDb.getAbsolutePath()); + } + data.put("rdbFilePath", StringEscapeUtils.escapeJava(rdbDb.getAbsolutePath().replace('\\', '/'))); //$NON-NLS-1$ + } else { + dataSourceTemplate = new File(POSTGRESQL_FREEMARKER_HTML_TEMPLATE); + CollectDBDriver collectDBDriver = localPropertiesService.getCollectDBDriver(); + data.put("dbUrl", StringEscapeUtils.escapeJava(ServerController.getSaikuDbURL(collectDBDriver))); //$NON-NLS-1$ + data.put("username", //$NON-NLS-1$ + StringEscapeUtils.escapeJava(localPropertiesService.getValue(EarthProperty.DB_USERNAME))); + data.put("password", //$NON-NLS-1$ + StringEscapeUtils.escapeJava(localPropertiesService.getValue(EarthProperty.DB_PASSWORD))); + } + + if (!dataSourceTemplate.exists()) { + throw new IOException( + "The file containing the Saiku Data Source template does not exist in expected location " //$NON-NLS-1$ + + dataSourceTemplate.getAbsolutePath()); + } + + return dataSourceTemplate; + } + + private void setMdxSaikuSchema(final File mdxFileTemplate, final File mdxFile) + throws IOException, TemplateException { + Map saikuData = new HashMap<>(); + String saikuSchemaName = getSchemaName(); + if (saikuSchemaName == null) { + saikuSchemaName = ""; //$NON-NLS-1$ + } + saikuData.put("saikuDbSchema", saikuSchemaName); //$NON-NLS-1$ + FreemarkerTemplateUtils.applyTemplate(mdxFileTemplate, mdxFile, saikuData); + } + + private void runSaikuBat(String commandName) throws SaikuExecutionException { + if (!isSaikuConfigured()) { + throw new SaikuExecutionException("The Saiku server is not configured."); //$NON-NLS-1$ + } + + else { + String saikuCmd = localPropertiesService.getSaikuFolder() + File.separator + commandName + + getCommandSuffix(); + + if (SystemUtils.IS_OS_WINDOWS) { + saikuCmd = "\"" + saikuCmd + "\""; //$NON-NLS-1$ //$NON-NLS-2$ + } + + try { + + Process runSaiku = runProcessBuilder(new String[] { saikuCmd }); + + if (commandName.equals(STOP_SAIKU)) { + int result = runSaiku.waitFor(); + logger.warn("Script ended with result {}", result); //$NON-NLS-1$ + } else if (commandName.equals(START_SAIKU)) { + Thread.sleep(6000); + } + + } catch (final IOException e) { + logger.error("Error when running Saiku start/stop command", e); //$NON-NLS-1$ + } catch (InterruptedException e) { + logger.error("Error while waiting to start", e); //$NON-NLS-1$ + Thread.currentThread().interrupt(); + } + } + } + + private void setMacJreHome(ProcessBuilder p) { + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX || SystemUtils.IS_OS_LINUX) { + + File javaFolder = new File("./java"); + + if (!javaFolder.exists()) { + String userName = System.getProperty("user.name"); + String testWithPath = "/Users/" + userName + "/OpenForis/CollectEarth/java"; + File testJavaPath = new File(testWithPath); + if (testJavaPath.exists()) { + javaFolder = testJavaPath; + } + } + + Map environment = p.environment(); + environment.put("COLLECT_EARTH_JRE_HOME", javaFolder.getAbsolutePath()); + + /* + * // In MAC the environment variable COLLECT_EARTH_JRE_HOME is not accesible + * from outside the bash, set it again! if( SystemUtils.IS_OS_MAC || + * SystemUtils.IS_OS_MAC_OSX){ try { File javaFolder = new File("./java"); + * + * if( !javaFolder.exists() ){ String userName = + * System.getProperty("user.name"); String testWithPath = "/Users/"+userName + + * "/OpenForis/CollectEarth/java"; File testJavaPath = new File(testWithPath); + * if( testJavaPath.exists()){ javaFolder = testJavaPath; } } + * + * Process setEnv = runProcessBuilder(new String[] { "/bin/bash", "setenv", + * "COLLECT_EARTH_JRE_HOME=\""+ javaFolder.getAbsolutePath() +"\"" }); + * setEnv.waitFor(); } catch (final IOException e) { + * logger.error("Error setting the COLLECT_EARTH_JRE_HOME environment variable", + * e); //$NON-NLS-1$ } catch (InterruptedException e) { + * logger.error("Error when running COLLECT_EARTH_JRE_HOME environment variable" + * , e); //$NON-NLS-1$ } } + */ + } + } + + private Process runProcessBuilder(String[] cmd) throws IOException { + final ProcessBuilder builder = new ProcessBuilder(cmd); + + // Fixes bug with Mac OS X not using the environemnt variable set for bash + setMacJreHome(builder); + + builder.directory(new File(localPropertiesService.getSaikuFolder()).getAbsoluteFile()); + builder.redirectErrorStream(true); + Process p = builder.start(); + (new ProcessLoggerThread(p.getInputStream(), Boolean.FALSE)).start(); + (new ProcessLoggerThread(p.getErrorStream(), Boolean.TRUE)).start(); + return p; + } + + private String getCommandSuffix() { + if (SystemUtils.IS_OS_WINDOWS) { + return COMMAND_SUFFIX_BAT; + } else { + return COMMAND_SUFFIX_SH; + } + } + + private void startSaiku() throws SaikuExecutionException { + logger.warn( + "Starting the Saiku server {}{}{}", localPropertiesService.getSaikuFolder(), File.separator, START_SAIKU); //$NON-NLS-1$ + + runSaikuBat(START_SAIKU); + + this.setSaikuStarted(true); + + logger.warn("Finished starting the Saiku server"); //$NON-NLS-1$ + } + + void stopSaiku() throws SaikuExecutionException { + logger.warn("Stoping the Saiku server {}{}{}", localPropertiesService.getSaikuFolder() , File.separator , STOP_SAIKU); //$NON-NLS-1$ + if (isSaikuStarted()) { + runSaikuBat(STOP_SAIKU); + this.setSaikuStarted(true); + } + logger.warn("Finished stoping the Saiku server"); //$NON-NLS-1$ + } + + private void stopSaikuOnExit() { + Runtime.getRuntime().addShutdownHook(new Thread("Shutting down Saiku on exit hook") { + @Override + public void run() { + try { + if (isSaikuStarted()) { + stopSaiku(); + } + } catch (final SaikuExecutionException e) { + logger.error("The Saiku server has been de-configured after it was started", e); //$NON-NLS-1$ + } + } + + }); + } + + private boolean isSaikuStarted() { + return saikuStarted; + } + + private void setSaikuStarted(boolean saikuStarted) { + this.saikuStarted = saikuStarted; + } + + @Override + public void destroy() throws Exception { + try { + stopSaiku(); + } catch (SaikuExecutionException e) { + logger.error("Error while trying to quite Saiku before destroying the bean", e); //$NON-NLS-1$ + } + } + + @Override + public LocalPropertiesService getLocalPropertiesService() { + return localPropertiesService; + } + + @Override + public EarthSurveyService getEarthSurveyService() { + return earthSurveyService; + } + + @Override + public RDBExporter getRdbExporter() { + return rdbExporter; + } + +} \ No newline at end of file From dbb26b6073d60cc373f8b4ef10233a0d0b3753a8 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:48 +0100 Subject: [PATCH 1021/1620] New translations AnalysisSaikuService.java (English) --- .../earth/app/view/Messages_en.properties | 732 +++++++++++++++++- 1 file changed, 731 insertions(+), 1 deletion(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index fa1df1b41e..cba7f5812d 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1 +1,731 @@ -/DataRepositoryService.java_bc +package org.openforis.collect.earth.app.service; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.swing.SwingUtilities; + +import org.apache.commons.lang3.SystemUtils; +import org.apache.commons.text.StringEscapeUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; +import org.openforis.collect.earth.app.ad_hoc.AluToolUtils; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.model.AspectCode; +import org.openforis.collect.earth.app.model.DynamicsCode; +import org.openforis.collect.earth.app.model.SlopeCode; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; +import org.openforis.collect.model.CollectSurvey; +import org.openforis.collect.relational.CollectRDBPublisher; +import org.openforis.collect.relational.CollectRdbException; +import org.openforis.concurrency.Progress; +import org.openforis.idm.metamodel.NodeDefinition; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Component; + +import com.opencsv.CSVReader; + +import freemarker.template.TemplateException; + +@Component +public class AnalysisSaikuService extends GenerateDatabase implements DisposableBean{ + + private static final String PLOT_ADD = "plot ADD "; + + private static final String UPDATE = "UPDATE "; + + private static final String UNKNOWN = "Unknown"; + + private static final String VARCHAR_5 = " VARCHAR(5)"; + + private static final String INTEGER = " INTEGER"; + + private static final String ALTER_TABLE = "ALTER TABLE "; + + private static final String INSERT_INTO = "INSERT INTO "; + + private static final String CREATE_TABLE = "CREATE TABLE "; + + private static final String ALU_CLIMATE_ZONE_CODE = "alu_climate_zone_code"; //$NON-NLS-1$ + + private static final String ALU_SOIL_TYPE_CODE = "alu_soil_type_code"; //$NON-NLS-1$ + + private static final String ALU_SUBCLASS_CODE = "alu_subclass_code"; //$NON-NLS-1$ + + private static final String DYNAMICS_ID = "dynamics_id"; //$NON-NLS-1$ + + private static final String ELEVATION_ID = "elevation_id"; //$NON-NLS-1$ + + private static final String SLOPE_ID = "slope_id"; //$NON-NLS-1$ + + private static final String ASPECT_ID = "aspect_id"; //$NON-NLS-1$ + + private static final String START_SAIKU = "start-saiku"; //$NON-NLS-1$ + + private static final String STOP_SAIKU = "stop-saiku"; //$NON-NLS-1$ + + private static final String COMMAND_SUFFIX_BAT = ".bat"; //$NON-NLS-1$ + + private static final String COMMAND_SUFFIX_SH = ".sh"; //$NON-NLS-1$ + + public static final String COLLECT_EARTH_DATABASE_RDB_DB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + + EarthConstants.SAIKU_RDB_SUFFIX; + + + @Autowired + RDBExporter rdbExporter; + + @Autowired + CollectRDBPublisher collectRDBPublisher; + + @Autowired + EarthSurveyService earthSurveyService; + + @Autowired + public LocalPropertiesService localPropertiesService; + + @Autowired + BrowserService browserService; + + @Autowired + private RegionCalculationUtils regionCalculation; + + @Autowired + private SchemaService schemaNamingService; + + private static final int ELEVATION_RANGE = 100; + + private RemoteWebDriver saikuWebDriver; + + private static final String SQLITE_FREEMARKER_HTML_TEMPLATE = "resources" + File.separator //$NON-NLS-1$ + + "collectEarthSqliteDS.fmt"; //$NON-NLS-1$ + private static final String POSTGRESQL_FREEMARKER_HTML_TEMPLATE = "resources" + File.separator //$NON-NLS-1$ + + "collectEarthPostgreSqlDS.fmt"; //$NON-NLS-1$ + public static final String MDX_XML = "collectEarthCubes.xml"; //$NON-NLS-1$ + private static final String MDX_TEMPLATE = MDX_XML + ".fmt"; //$NON-NLS-1$ + + private boolean saikuStarted; + + private void assignDimensionValues() { + try { + final String schemaName = getSchemaPrefix(); + // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id + final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query( + "SELECT " + EarthConstants.PLOT_ID + ", elevation, slope, aspect FROM " + schemaName + "plot", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + new RowMapper() { + @Override + public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { + + final Object[] updateValues = new Object[4]; + + Integer aspect = AspectCode.NA.getId(); + if (AspectCode.getAspectCode(rs.getDouble("aspect")) != null) { //$NON-NLS-1$ + aspect = AspectCode.getAspectCode(rs.getDouble("aspect")).getId(); //$NON-NLS-1$ + } + + Integer slope = SlopeCode.NA.getId(); + + if (SlopeCode.getSlopeCode((int) rs.getFloat("slope")) != null) { //$NON-NLS-1$ + slope = SlopeCode.getSlopeCode((int) rs.getFloat("slope")).getId(); //$NON-NLS-1$ + } + + updateValues[0] = aspect; + updateValues[1] = slope; + updateValues[2] = ( (int) rs.getFloat("elevation") / ELEVATION_RANGE) + 1; // 0 //$NON-NLS-1$ + + updateValues[3] = rs.getLong(EarthConstants.PLOT_ID); + return updateValues; + } + + }); + + rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + ASPECT_ID + "=?," + SLOPE_ID + "=?," //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + ELEVATION_ID + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (Exception e) { + logger.warn("No DEM information", e); //$NON-NLS-1$ + } + } + + private String getSchemaPrefix() { + return schemaNamingService.getSchemaPrefix(ExportType.SAIKU); + } + + private void assignPngAluToolDimensionValues() { + try { + if (earthSurveyService.getCollectSurvey().getName().toLowerCase().contains("png")) { //$NON-NLS-1$ + final String schemaName = getSchemaPrefix(); + // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id + final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query("SELECT " + EarthConstants.PLOT_ID //$NON-NLS-1$ + + ", elevation, soil_fundamental, land_use_subcategory, precipitation_ranges FROM " + schemaName //$NON-NLS-1$ + + "plot LEFT JOIN " + schemaName + "precipitation_ranges_code where " //$NON-NLS-1$ //$NON-NLS-2$ + + "plot.annual_precipitation_code_id=precipitation_ranges_code.precipitation_ranges_code_id", //$NON-NLS-1$ + new RowMapper() { + @Override + public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { + + final Object[] updateValues = new Object[3]; + + try { + AluToolUtils aluToolUtils = new AluToolUtils(); + + Integer elevation = rs.getInt("elevation"); //$NON-NLS-1$ + String soilFundamental = rs.getString("soil_fundamental"); //$NON-NLS-1$ + String precipitationRange = rs.getString("precipitation_ranges"); //$NON-NLS-1$ + + int precipitation = -1; + String climateZone = UNKNOWN; //$NON-NLS-1$ + if (precipitationRange != null) { + precipitation = aluToolUtils.getPrecipitationFromRange(precipitationRange); + boolean shortDrySeason = true; // According to information from Abe PNG has less + // than 5 months of dry season + climateZone = aluToolUtils.getClimateZone(elevation, precipitation, + shortDrySeason); + } + + String soilType = UNKNOWN; //$NON-NLS-1$ + if (soilFundamental != null) { + soilType = aluToolUtils.getSoilType(soilFundamental); + } + + updateValues[0] = climateZone; + updateValues[1] = soilType; + updateValues[2] = rs.getLong(EarthConstants.PLOT_ID); + } catch (Exception e) { + logger.error("Error while processing the data", e); //$NON-NLS-1$ + updateValues[0] = UNKNOWN; //$NON-NLS-1$ + updateValues[1] = UNKNOWN; //$NON-NLS-1$ + updateValues[2] = UNKNOWN; //$NON-NLS-1$ + } + return updateValues; + } + + }); + + rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + ALU_CLIMATE_ZONE_CODE + "=?," //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + ALU_SOIL_TYPE_CODE + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ //$NON-NLS-2$ + } + } catch (Exception e) { + logger.error("No PNG ALU information", e); //$NON-NLS-1$ + } + } + + private void assignLUCDimensionValues() { + try { + final String schemaName = getSchemaPrefix(); + // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id + final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query( + "SELECT " + EarthConstants.PLOT_ID + ", land_use_subcategory FROM " + schemaName + "plot", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + new RowMapper() { + @Override + public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { + + AluToolUtils aluToolUtils = new AluToolUtils(); + final Object[] updateValues = new Object[3]; + + String collectEarthSubcategory = rs.getString("land_use_subcategory"); //$NON-NLS-1$ + Integer dynamics = DynamicsCode.getDynamicsCode(collectEarthSubcategory); + String subClass = UNKNOWN; //$NON-NLS-1$ + if (collectEarthSubcategory != null) { + subClass = aluToolUtils.getAluSubclass(collectEarthSubcategory); + } + + updateValues[0] = dynamics; + updateValues[1] = subClass; + updateValues[2] = rs.getLong(EarthConstants.PLOT_ID); + return updateValues; + } + + }); + + rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + DYNAMICS_ID + "=?," + ALU_SUBCLASS_CODE //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ + } catch (Exception e) { + logger.warn("No PNG Alu information available", e); //$NON-NLS-1$ + } + } + + private void createAspectAuxTable() { + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "aspect_category (" + ASPECT_ID //$NON-NLS-1$ //$NON-NLS-2$ + + " INTEGER PRIMARY KEY, aspect_caption TEXT);"); //$NON-NLS-1$ + final AspectCode[] aspects = AspectCode.values(); + for (final AspectCode aspectCode : aspects) { + rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "aspect_category values (" + aspectCode.getId() + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + aspectCode.getLabel() + "')"); //$NON-NLS-1$ + } + } + + private void createElevationtAuxTable() { + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "elevation_category ( " + ELEVATION_ID //$NON-NLS-1$ //$NON-NLS-2$ + + " INTEGER PRIMARY KEY, elevation_caption TEXT);"); //$NON-NLS-1$ + final int slots = 9000 / ELEVATION_RANGE; // Highest mountain in the world, mount everest is + // 8820m high + for (int i = 1; i <= slots; i++) { + rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "elevation_category values (" + i + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + ((i - 1) * ELEVATION_RANGE) + "-" + i //$NON-NLS-1$ + * ELEVATION_RANGE + + "')"); //$NON-NLS-1$ + } + + } + + private void createDynamicsAuxTable() { + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "dynamics_category (" + DYNAMICS_ID //$NON-NLS-1$ //$NON-NLS-2$ + + " INTEGER PRIMARY KEY, dynamics_caption TEXT);"); //$NON-NLS-1$ + final DynamicsCode[] dynamicsCodes = DynamicsCode.values(); + for (final DynamicsCode dynamicsCode : dynamicsCodes) { + rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "dynamics_category values (" + dynamicsCode.getId() //$NON-NLS-1$ //$NON-NLS-2$ + + ", '" + dynamicsCode.getLabel() + "')"); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + + private void createPlotForeignKeys() { + // Add aspect_id column to plot + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ASPECT_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + SLOPE_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ELEVATION_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + DYNAMICS_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + + private void createPngAluVariables() { + if (earthSurveyService.getCollectSurvey().getName().toLowerCase().contains("png")) { //$NON-NLS-1$ + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_SOIL_TYPE_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_CLIMATE_ZONE_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + } + + private void creatAluSubclassVariables() { + final String schemaName = getSchemaPrefix(); + rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_SUBCLASS_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + + private void createSlopeAuxTable() { + final String schemaName = getSchemaPrefix(); + // Slope can be from 0 to 90 + rdbExporter.getJdbcTemplate().execute( + CREATE_TABLE + schemaName + "slope_category (slope_id INTEGER PRIMARY KEY, slope_caption TEXT);"); //$NON-NLS-1$ //$NON-NLS-2$ + final SlopeCode[] slopeCodes = SlopeCode.values(); + for (final SlopeCode slopeCode : slopeCodes) { + rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "slope_category values (" + slopeCode.getId() + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + slopeCode.getLabel() + "')"); //$NON-NLS-1$ + } + } + + private String getSaikuConfigurationFilePath() { + + String configFile = localPropertiesService.getSaikuFolder() + "/" //$NON-NLS-1$ + + "tomcat/webapps/saiku/WEB-INF/classes/saiku-datasources/collectEarthDS"; //$NON-NLS-1$ + configFile = configFile.replace('/', File.separatorChar); + return configFile; + } + + private String getSaikuThreeConfigurationFilePath() { + + String configFile = localPropertiesService.getSaikuFolder() + "/" //$NON-NLS-1$ + + "tomcat/webapps/saiku/WEB-INF/classes/legacy-datasources/collectEarthDS"; //$NON-NLS-1$ + configFile = configFile.replace('/', File.separatorChar); + return configFile; + } + + private boolean isSaikuConfigured() { + return localPropertiesService.getSaikuFolder() != null + && isSaikuFolder(new File(localPropertiesService.getSaikuFolder())); + } + + /* + * private boolean isJavaHomeConfigured() { + * + * if (SystemUtils.IS_OS_MAC){ return true; } return ! ( StringUtils.isBlank( + * System.getenv("JAVA_HOME") ) //$NON-NLS-1$ && StringUtils.isBlank( + * System.getenv("JRE_HOME") ) //$NON-NLS-1$ && StringUtils.isBlank( + * System.getenv("COLLECT_EARTH_JRE_HOME") ) //$NON-NLS-1$ ); } + */ + + public boolean isSaikuFolder(File saikuFolder) { + boolean isSaikuFolder = false; + if (saikuFolder.listFiles() != null) { + for (final File file : saikuFolder.listFiles()) { + if (file.getName().equals(START_SAIKU + getCommandSuffix())) { + isSaikuFolder = true; + } + } + } + return isSaikuFolder; + } + + private void openSaiku() throws BrowserNotFoundException { + saikuWebDriver = browserService.navigateTo("http://127.0.0.1:8181", saikuWebDriver, false); //$NON-NLS-1$ + if (browserService.waitFor("username", saikuWebDriver)) { //$NON-NLS-1$ + saikuWebDriver.findElementByName("username").sendKeys("admin"); //$NON-NLS-1$ //$NON-NLS-2$ + saikuWebDriver.findElementByName("password").sendKeys("admin"); //$NON-NLS-1$ //$NON-NLS-2$ + saikuWebDriver.findElementByClassName("form_button").click(); //$NON-NLS-1$ + } + } + + + public void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws SaikuExecutionException { + + try { + + stopSaiku(); + + try { + + if ((localPropertiesService.isUsingSqliteDB() && !getZippedProjectDB( ExportType.SAIKU ).exists()) + || isRefreshDatabase()) { + + // The user clicked on the option to refresh the database, or there is no + // previous copy of the Saiku DB + // Generate the DB file + rdbExporter.exportDataToRDB( + earthSurveyService.getCollectSurvey(), + ExportType.SAIKU, + progressListener, + this::processQuantityData + ); + + try { + // Save the DB file in a zipped file to extends GenerateDatabase keep for the next usages + replaceZippedProjectDB( ExportType.SAIKU ); + } catch (Exception e) { + logger.error("Error while refreshing the Zipped content of the project Saiku DB", e); + } + + } else if (getZippedProjectDB(ExportType.SAIKU).exists() && localPropertiesService.isUsingSqliteDB()) { + // If the zipped version of the project exists ( and the user clicked on the + // option to not refresh it) then restore this last version of the data + restoreZippedProjectDB(ExportType.SAIKU); + } + + refreshDataSourceForSaiku(); + + if (startSaikuAfterDBExport && !isUserCancelledOperation()) { + startSaiku(); + new Thread("Opening Saiku") { + @Override + public void run() { + try { + AnalysisSaikuService.this.openSaiku(); + } catch (BrowserNotFoundException e) { + logger.error("No browser has been set up", e); //$NON-NLS-1$ + } + }; + }.start(); + + stopSaikuOnExit(); + } + } catch (final IOException e) { + logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ + } catch (TemplateException e1) { + logger.error("Error while applying the freemarker template tothe Saiku data source", e1); //$NON-NLS-1$ + } + + } catch (final CollectRdbException e) { + logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ + } + } + + private void processQuantityData(InfiniteProgressMonitor progressListener) { + + SwingUtilities.invokeLater( () -> progressListener.setMessage("Preparing Saiku data for analysis") ); + + progressListener.progressMade(new Progress(0, 100)); + createPngAluVariables(); + createPlotForeignKeys(); + + progressListener.progressMade(new Progress(25, 100)); + + if (!surveyContains("calculated_elevation_range", earthSurveyService.getCollectSurvey())) { + createAspectAuxTable(); + createSlopeAuxTable(); + createElevationtAuxTable(); + assignDimensionValues(); + + } + progressListener.progressMade(new Progress(50, 100)); + + if (!surveyContains("calculated_initial_land_use", earthSurveyService.getCollectSurvey())) { + createDynamicsAuxTable(); + creatAluSubclassVariables(); + assignLUCDimensionValues(); + + } + progressListener.progressMade(new Progress(75, 100)); + + assignPngAluToolDimensionValues(); + + SwingUtilities.invokeLater( () -> progressListener.setMessage("Calculating expansion factors") ); + + regionCalculation.handleRegionCalculation( ExportType.SAIKU, rdbExporter.getJdbcTemplate() ); + progressListener.progressMade(new Progress(100, 100)); + + } + + public static boolean surveyContains(String nodeName, CollectSurvey survey) { + NodeDefinition nodeDefForNAme = survey.getSchema().findNodeDefinition( nodeDef -> nodeDef.getName().equals(nodeName) ); + return nodeDefForNAme != null; + } + + public static CSVReader getCsvReader(String csvFile) throws FileNotFoundException { + final BufferedReader bufferedReader = new BufferedReader( + new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 ) ); //$NON-NLS-1$ + return new CSVReader(bufferedReader); + } + + private void refreshDataSourceForSaiku() throws IOException, TemplateException { + final File mdxFile = new File(localPropertiesService.getProjectFolder() + File.separatorChar + MDX_XML); + + Map data = new HashMap<>(); + data.put("cubeFilePath", StringEscapeUtils.escapeJava(mdxFile.getAbsolutePath().replace('\\', '/'))); //$NON-NLS-1$ + + final File mdxTemplate = getMdxTemplate(); + final File dataSourceTemplate = getDataSourceTemplate(data); + + // First try Saiku 2.5/2.6 + File dataSourceFile; + try { + dataSourceFile = new File(getSaikuConfigurationFilePath()); + FreemarkerTemplateUtils.applyTemplate(dataSourceTemplate, dataSourceFile, data); + } catch (Exception e) { + logger.error("Error starting Saiku", e); + dataSourceFile = new File(getSaikuThreeConfigurationFilePath()); + FreemarkerTemplateUtils.applyTemplate(dataSourceTemplate, dataSourceFile, data); + } + + setMdxSaikuSchema(mdxTemplate, mdxFile); + } + + private File getMdxTemplate() throws IOException { + final File mdxFileTemplate = new File( + localPropertiesService.getProjectFolder() + File.separatorChar + MDX_TEMPLATE); + if (!mdxFileTemplate.exists()) { + throw new IOException( + "The file containing the MDX Cube definition Template does not exist in expected location " //$NON-NLS-1$ + + mdxFileTemplate.getAbsolutePath()); + } + return mdxFileTemplate; + } + + private File getDataSourceTemplate(Map data) throws IOException { + File dataSourceTemplate = null; + + if (localPropertiesService.isUsingSqliteDB()) { + dataSourceTemplate = new File(SQLITE_FREEMARKER_HTML_TEMPLATE); + final File rdbDb = rdbExporter.getRdbFile( ExportType.SAIKU ); + if (!rdbDb.exists()) { + throw new IOException( + "The file contianing the Relational SQLite Database does not exist in expected location " //$NON-NLS-1$ + + rdbDb.getAbsolutePath()); + } + data.put("rdbFilePath", StringEscapeUtils.escapeJava(rdbDb.getAbsolutePath().replace('\\', '/'))); //$NON-NLS-1$ + } else { + dataSourceTemplate = new File(POSTGRESQL_FREEMARKER_HTML_TEMPLATE); + CollectDBDriver collectDBDriver = localPropertiesService.getCollectDBDriver(); + data.put("dbUrl", StringEscapeUtils.escapeJava(ServerController.getSaikuDbURL(collectDBDriver))); //$NON-NLS-1$ + data.put("username", //$NON-NLS-1$ + StringEscapeUtils.escapeJava(localPropertiesService.getValue(EarthProperty.DB_USERNAME))); + data.put("password", //$NON-NLS-1$ + StringEscapeUtils.escapeJava(localPropertiesService.getValue(EarthProperty.DB_PASSWORD))); + } + + if (!dataSourceTemplate.exists()) { + throw new IOException( + "The file containing the Saiku Data Source template does not exist in expected location " //$NON-NLS-1$ + + dataSourceTemplate.getAbsolutePath()); + } + + return dataSourceTemplate; + } + + private void setMdxSaikuSchema(final File mdxFileTemplate, final File mdxFile) + throws IOException, TemplateException { + Map saikuData = new HashMap<>(); + String saikuSchemaName = getSchemaName(); + if (saikuSchemaName == null) { + saikuSchemaName = ""; //$NON-NLS-1$ + } + saikuData.put("saikuDbSchema", saikuSchemaName); //$NON-NLS-1$ + FreemarkerTemplateUtils.applyTemplate(mdxFileTemplate, mdxFile, saikuData); + } + + private void runSaikuBat(String commandName) throws SaikuExecutionException { + if (!isSaikuConfigured()) { + throw new SaikuExecutionException("The Saiku server is not configured."); //$NON-NLS-1$ + } + + else { + String saikuCmd = localPropertiesService.getSaikuFolder() + File.separator + commandName + + getCommandSuffix(); + + if (SystemUtils.IS_OS_WINDOWS) { + saikuCmd = "\"" + saikuCmd + "\""; //$NON-NLS-1$ //$NON-NLS-2$ + } + + try { + + Process runSaiku = runProcessBuilder(new String[] { saikuCmd }); + + if (commandName.equals(STOP_SAIKU)) { + int result = runSaiku.waitFor(); + logger.warn("Script ended with result {}", result); //$NON-NLS-1$ + } else if (commandName.equals(START_SAIKU)) { + Thread.sleep(6000); + } + + } catch (final IOException e) { + logger.error("Error when running Saiku start/stop command", e); //$NON-NLS-1$ + } catch (InterruptedException e) { + logger.error("Error while waiting to start", e); //$NON-NLS-1$ + Thread.currentThread().interrupt(); + } + } + } + + private void setMacJreHome(ProcessBuilder p) { + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX || SystemUtils.IS_OS_LINUX) { + + File javaFolder = new File("./java"); + + if (!javaFolder.exists()) { + String userName = System.getProperty("user.name"); + String testWithPath = "/Users/" + userName + "/OpenForis/CollectEarth/java"; + File testJavaPath = new File(testWithPath); + if (testJavaPath.exists()) { + javaFolder = testJavaPath; + } + } + + Map environment = p.environment(); + environment.put("COLLECT_EARTH_JRE_HOME", javaFolder.getAbsolutePath()); + + /* + * // In MAC the environment variable COLLECT_EARTH_JRE_HOME is not accesible + * from outside the bash, set it again! if( SystemUtils.IS_OS_MAC || + * SystemUtils.IS_OS_MAC_OSX){ try { File javaFolder = new File("./java"); + * + * if( !javaFolder.exists() ){ String userName = + * System.getProperty("user.name"); String testWithPath = "/Users/"+userName + + * "/OpenForis/CollectEarth/java"; File testJavaPath = new File(testWithPath); + * if( testJavaPath.exists()){ javaFolder = testJavaPath; } } + * + * Process setEnv = runProcessBuilder(new String[] { "/bin/bash", "setenv", + * "COLLECT_EARTH_JRE_HOME=\""+ javaFolder.getAbsolutePath() +"\"" }); + * setEnv.waitFor(); } catch (final IOException e) { + * logger.error("Error setting the COLLECT_EARTH_JRE_HOME environment variable", + * e); //$NON-NLS-1$ } catch (InterruptedException e) { + * logger.error("Error when running COLLECT_EARTH_JRE_HOME environment variable" + * , e); //$NON-NLS-1$ } } + */ + } + } + + private Process runProcessBuilder(String[] cmd) throws IOException { + final ProcessBuilder builder = new ProcessBuilder(cmd); + + // Fixes bug with Mac OS X not using the environemnt variable set for bash + setMacJreHome(builder); + + builder.directory(new File(localPropertiesService.getSaikuFolder()).getAbsoluteFile()); + builder.redirectErrorStream(true); + Process p = builder.start(); + (new ProcessLoggerThread(p.getInputStream(), Boolean.FALSE)).start(); + (new ProcessLoggerThread(p.getErrorStream(), Boolean.TRUE)).start(); + return p; + } + + private String getCommandSuffix() { + if (SystemUtils.IS_OS_WINDOWS) { + return COMMAND_SUFFIX_BAT; + } else { + return COMMAND_SUFFIX_SH; + } + } + + private void startSaiku() throws SaikuExecutionException { + logger.warn( + "Starting the Saiku server {}{}{}", localPropertiesService.getSaikuFolder(), File.separator, START_SAIKU); //$NON-NLS-1$ + + runSaikuBat(START_SAIKU); + + this.setSaikuStarted(true); + + logger.warn("Finished starting the Saiku server"); //$NON-NLS-1$ + } + + void stopSaiku() throws SaikuExecutionException { + logger.warn("Stoping the Saiku server {}{}{}", localPropertiesService.getSaikuFolder() , File.separator , STOP_SAIKU); //$NON-NLS-1$ + if (isSaikuStarted()) { + runSaikuBat(STOP_SAIKU); + this.setSaikuStarted(true); + } + logger.warn("Finished stoping the Saiku server"); //$NON-NLS-1$ + } + + private void stopSaikuOnExit() { + Runtime.getRuntime().addShutdownHook(new Thread("Shutting down Saiku on exit hook") { + @Override + public void run() { + try { + if (isSaikuStarted()) { + stopSaiku(); + } + } catch (final SaikuExecutionException e) { + logger.error("The Saiku server has been de-configured after it was started", e); //$NON-NLS-1$ + } + } + + }); + } + + private boolean isSaikuStarted() { + return saikuStarted; + } + + private void setSaikuStarted(boolean saikuStarted) { + this.saikuStarted = saikuStarted; + } + + @Override + public void destroy() throws Exception { + try { + stopSaiku(); + } catch (SaikuExecutionException e) { + logger.error("Error while trying to quite Saiku before destroying the bean", e); //$NON-NLS-1$ + } + } + + @Override + public LocalPropertiesService getLocalPropertiesService() { + return localPropertiesService; + } + + @Override + public EarthSurveyService getEarthSurveyService() { + return earthSurveyService; + } + + @Override + public RDBExporter getRdbExporter() { + return rdbExporter; + } + +} \ No newline at end of file From b4617d1191814da561dc134fc4b1b14c6a8138f5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:49 +0100 Subject: [PATCH 1022/1620] New translations BackupSqlLiteService.java (French) --- .../earth/app/view/Messages_fr.properties | 755 ++---------------- 1 file changed, 83 insertions(+), 672 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index cba7f5812d..8c14343c96 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,731 +1,142 @@ package org.openforis.collect.earth.app.service; -import java.io.BufferedReader; import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.IOException; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.SystemUtils; -import org.apache.commons.text.StringEscapeUtils; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Date; + +import org.apache.commons.dbcp.BasicDataSource; +import org.openforis.collect.earth.app.CollectEarthUtils; import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; -import org.openforis.collect.earth.app.ad_hoc.AluToolUtils; -import org.openforis.collect.earth.app.desktop.ServerController; -import org.openforis.collect.earth.app.model.AspectCode; -import org.openforis.collect.earth.app.model.DynamicsCode; -import org.openforis.collect.earth.app.model.SlopeCode; import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; -import org.openforis.collect.model.CollectSurvey; -import org.openforis.collect.relational.CollectRDBPublisher; -import org.openforis.collect.relational.CollectRdbException; -import org.openforis.concurrency.Progress; -import org.openforis.idm.metamodel.NodeDefinition; -import org.openqa.selenium.remote.RemoteWebDriver; -import org.springframework.beans.factory.DisposableBean; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.RowMapper; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; -import com.opencsv.CSVReader; +import net.lingala.zip4j.ZipFile; -import freemarker.template.TemplateException; +/** + * Spring managed bean that handles the creation of backups of the Collect database. + * The SQLite database file will be saved everytime the application closes. + * A maximum of 10 copies (the last ten times the application was used) will be saved on the backupCollectEarth folder on the users application data folder (OS dependant). + * @author Alfonso Sanchez-Paus Diaz + * + */ @Component -public class AnalysisSaikuService extends GenerateDatabase implements DisposableBean{ - - private static final String PLOT_ADD = "plot ADD "; - - private static final String UPDATE = "UPDATE "; - - private static final String UNKNOWN = "Unknown"; - - private static final String VARCHAR_5 = " VARCHAR(5)"; - - private static final String INTEGER = " INTEGER"; - - private static final String ALTER_TABLE = "ALTER TABLE "; - - private static final String INSERT_INTO = "INSERT INTO "; - - private static final String CREATE_TABLE = "CREATE TABLE "; - - private static final String ALU_CLIMATE_ZONE_CODE = "alu_climate_zone_code"; //$NON-NLS-1$ - - private static final String ALU_SOIL_TYPE_CODE = "alu_soil_type_code"; //$NON-NLS-1$ +@Lazy(false) +public class BackupSqlLiteService implements InitializingBean{ - private static final String ALU_SUBCLASS_CODE = "alu_subclass_code"; //$NON-NLS-1$ - - private static final String DYNAMICS_ID = "dynamics_id"; //$NON-NLS-1$ - - private static final String ELEVATION_ID = "elevation_id"; //$NON-NLS-1$ - - private static final String SLOPE_ID = "slope_id"; //$NON-NLS-1$ - - private static final String ASPECT_ID = "aspect_id"; //$NON-NLS-1$ - - private static final String START_SAIKU = "start-saiku"; //$NON-NLS-1$ - - private static final String STOP_SAIKU = "stop-saiku"; //$NON-NLS-1$ - - private static final String COMMAND_SUFFIX_BAT = ".bat"; //$NON-NLS-1$ - - private static final String COMMAND_SUFFIX_SH = ".sh"; //$NON-NLS-1$ - - public static final String COLLECT_EARTH_DATABASE_RDB_DB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB - + EarthConstants.SAIKU_RDB_SUFFIX; + private static final String BACKUP_COLLECT_EARTH = "backupSqlite"; //$NON-NLS-1$ + private static final int MAXIMUM_NUMBER_OF_BACKUPS = 10; @Autowired - RDBExporter rdbExporter; + BasicDataSource dataSource; @Autowired - CollectRDBPublisher collectRDBPublisher; - - @Autowired - EarthSurveyService earthSurveyService; - - @Autowired - public LocalPropertiesService localPropertiesService; - - @Autowired - BrowserService browserService; - - @Autowired - private RegionCalculationUtils regionCalculation; - - @Autowired - private SchemaService schemaNamingService; - - private static final int ELEVATION_RANGE = 100; - - private RemoteWebDriver saikuWebDriver; - - private static final String SQLITE_FREEMARKER_HTML_TEMPLATE = "resources" + File.separator //$NON-NLS-1$ - + "collectEarthSqliteDS.fmt"; //$NON-NLS-1$ - private static final String POSTGRESQL_FREEMARKER_HTML_TEMPLATE = "resources" + File.separator //$NON-NLS-1$ - + "collectEarthPostgreSqlDS.fmt"; //$NON-NLS-1$ - public static final String MDX_XML = "collectEarthCubes.xml"; //$NON-NLS-1$ - private static final String MDX_TEMPLATE = MDX_XML + ".fmt"; //$NON-NLS-1$ - - private boolean saikuStarted; - - private void assignDimensionValues() { - try { - final String schemaName = getSchemaPrefix(); - // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id - final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query( - "SELECT " + EarthConstants.PLOT_ID + ", elevation, slope, aspect FROM " + schemaName + "plot", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - new RowMapper() { - @Override - public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { - - final Object[] updateValues = new Object[4]; - - Integer aspect = AspectCode.NA.getId(); - if (AspectCode.getAspectCode(rs.getDouble("aspect")) != null) { //$NON-NLS-1$ - aspect = AspectCode.getAspectCode(rs.getDouble("aspect")).getId(); //$NON-NLS-1$ - } - - Integer slope = SlopeCode.NA.getId(); - - if (SlopeCode.getSlopeCode((int) rs.getFloat("slope")) != null) { //$NON-NLS-1$ - slope = SlopeCode.getSlopeCode((int) rs.getFloat("slope")).getId(); //$NON-NLS-1$ - } - - updateValues[0] = aspect; - updateValues[1] = slope; - updateValues[2] = ( (int) rs.getFloat("elevation") / ELEVATION_RANGE) + 1; // 0 //$NON-NLS-1$ - - updateValues[3] = rs.getLong(EarthConstants.PLOT_ID); - return updateValues; - } - - }); - - rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + ASPECT_ID + "=?," + SLOPE_ID + "=?," //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - + ELEVATION_ID + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (Exception e) { - logger.warn("No DEM information", e); //$NON-NLS-1$ - } - } - - private String getSchemaPrefix() { - return schemaNamingService.getSchemaPrefix(ExportType.SAIKU); - } - - private void assignPngAluToolDimensionValues() { - try { - if (earthSurveyService.getCollectSurvey().getName().toLowerCase().contains("png")) { //$NON-NLS-1$ - final String schemaName = getSchemaPrefix(); - // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id - final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query("SELECT " + EarthConstants.PLOT_ID //$NON-NLS-1$ - + ", elevation, soil_fundamental, land_use_subcategory, precipitation_ranges FROM " + schemaName //$NON-NLS-1$ - + "plot LEFT JOIN " + schemaName + "precipitation_ranges_code where " //$NON-NLS-1$ //$NON-NLS-2$ - + "plot.annual_precipitation_code_id=precipitation_ranges_code.precipitation_ranges_code_id", //$NON-NLS-1$ - new RowMapper() { - @Override - public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { - - final Object[] updateValues = new Object[3]; - - try { - AluToolUtils aluToolUtils = new AluToolUtils(); - - Integer elevation = rs.getInt("elevation"); //$NON-NLS-1$ - String soilFundamental = rs.getString("soil_fundamental"); //$NON-NLS-1$ - String precipitationRange = rs.getString("precipitation_ranges"); //$NON-NLS-1$ - - int precipitation = -1; - String climateZone = UNKNOWN; //$NON-NLS-1$ - if (precipitationRange != null) { - precipitation = aluToolUtils.getPrecipitationFromRange(precipitationRange); - boolean shortDrySeason = true; // According to information from Abe PNG has less - // than 5 months of dry season - climateZone = aluToolUtils.getClimateZone(elevation, precipitation, - shortDrySeason); - } - - String soilType = UNKNOWN; //$NON-NLS-1$ - if (soilFundamental != null) { - soilType = aluToolUtils.getSoilType(soilFundamental); - } - - updateValues[0] = climateZone; - updateValues[1] = soilType; - updateValues[2] = rs.getLong(EarthConstants.PLOT_ID); - } catch (Exception e) { - logger.error("Error while processing the data", e); //$NON-NLS-1$ - updateValues[0] = UNKNOWN; //$NON-NLS-1$ - updateValues[1] = UNKNOWN; //$NON-NLS-1$ - updateValues[2] = UNKNOWN; //$NON-NLS-1$ - } - return updateValues; - } - - }); - - rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + ALU_CLIMATE_ZONE_CODE + "=?," //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + ALU_SOIL_TYPE_CODE + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ //$NON-NLS-2$ - } - } catch (Exception e) { - logger.error("No PNG ALU information", e); //$NON-NLS-1$ - } - } - - private void assignLUCDimensionValues() { - try { - final String schemaName = getSchemaPrefix(); - // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id - final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query( - "SELECT " + EarthConstants.PLOT_ID + ", land_use_subcategory FROM " + schemaName + "plot", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - new RowMapper() { - @Override - public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { - - AluToolUtils aluToolUtils = new AluToolUtils(); - final Object[] updateValues = new Object[3]; - - String collectEarthSubcategory = rs.getString("land_use_subcategory"); //$NON-NLS-1$ - Integer dynamics = DynamicsCode.getDynamicsCode(collectEarthSubcategory); - String subClass = UNKNOWN; //$NON-NLS-1$ - if (collectEarthSubcategory != null) { - subClass = aluToolUtils.getAluSubclass(collectEarthSubcategory); - } - - updateValues[0] = dynamics; - updateValues[1] = subClass; - updateValues[2] = rs.getLong(EarthConstants.PLOT_ID); - return updateValues; - } - - }); - - rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + DYNAMICS_ID + "=?," + ALU_SUBCLASS_CODE //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ - } catch (Exception e) { - logger.warn("No PNG Alu information available", e); //$NON-NLS-1$ - } - } + private LocalPropertiesService localPropertiesService; - private void createAspectAuxTable() { - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "aspect_category (" + ASPECT_ID //$NON-NLS-1$ //$NON-NLS-2$ - + " INTEGER PRIMARY KEY, aspect_caption TEXT);"); //$NON-NLS-1$ - final AspectCode[] aspects = AspectCode.values(); - for (final AspectCode aspectCode : aspects) { - rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "aspect_category values (" + aspectCode.getId() + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + aspectCode.getLabel() + "')"); //$NON-NLS-1$ - } - } - - private void createElevationtAuxTable() { - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "elevation_category ( " + ELEVATION_ID //$NON-NLS-1$ //$NON-NLS-2$ - + " INTEGER PRIMARY KEY, elevation_caption TEXT);"); //$NON-NLS-1$ - final int slots = 9000 / ELEVATION_RANGE; // Highest mountain in the world, mount everest is - // 8820m high - for (int i = 1; i <= slots; i++) { - rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "elevation_category values (" + i + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + ((i - 1) * ELEVATION_RANGE) + "-" + i //$NON-NLS-1$ - * ELEVATION_RANGE - + "')"); //$NON-NLS-1$ - } - - } - - private void createDynamicsAuxTable() { - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "dynamics_category (" + DYNAMICS_ID //$NON-NLS-1$ //$NON-NLS-2$ - + " INTEGER PRIMARY KEY, dynamics_caption TEXT);"); //$NON-NLS-1$ - final DynamicsCode[] dynamicsCodes = DynamicsCode.values(); - for (final DynamicsCode dynamicsCode : dynamicsCodes) { - rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "dynamics_category values (" + dynamicsCode.getId() //$NON-NLS-1$ //$NON-NLS-2$ - + ", '" + dynamicsCode.getLabel() + "')"); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - - private void createPlotForeignKeys() { - // Add aspect_id column to plot - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ASPECT_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + SLOPE_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ELEVATION_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + DYNAMICS_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } + private Logger logger = LoggerFactory.getLogger( BackupSqlLiteService.class ); - private void createPngAluVariables() { - if (earthSurveyService.getCollectSurvey().getName().toLowerCase().contains("png")) { //$NON-NLS-1$ - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_SOIL_TYPE_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_CLIMATE_ZONE_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - } - - private void creatAluSubclassVariables() { - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_SUBCLASS_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - - private void createSlopeAuxTable() { - final String schemaName = getSchemaPrefix(); - // Slope can be from 0 to 90 - rdbExporter.getJdbcTemplate().execute( - CREATE_TABLE + schemaName + "slope_category (slope_id INTEGER PRIMARY KEY, slope_caption TEXT);"); //$NON-NLS-1$ //$NON-NLS-2$ - final SlopeCode[] slopeCodes = SlopeCode.values(); - for (final SlopeCode slopeCode : slopeCodes) { - rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "slope_category values (" + slopeCode.getId() + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + slopeCode.getLabel() + "')"); //$NON-NLS-1$ - } - } - - private String getSaikuConfigurationFilePath() { - - String configFile = localPropertiesService.getSaikuFolder() + "/" //$NON-NLS-1$ - + "tomcat/webapps/saiku/WEB-INF/classes/saiku-datasources/collectEarthDS"; //$NON-NLS-1$ - configFile = configFile.replace('/', File.separatorChar); - return configFile; - } - - private String getSaikuThreeConfigurationFilePath() { - - String configFile = localPropertiesService.getSaikuFolder() + "/" //$NON-NLS-1$ - + "tomcat/webapps/saiku/WEB-INF/classes/legacy-datasources/collectEarthDS"; //$NON-NLS-1$ - configFile = configFile.replace('/', File.separatorChar); - return configFile; - } - - private boolean isSaikuConfigured() { - return localPropertiesService.getSaikuFolder() != null - && isSaikuFolder(new File(localPropertiesService.getSaikuFolder())); + @Override + public void afterPropertiesSet() throws Exception { + attachShutDownHook(); } - /* - * private boolean isJavaHomeConfigured() { - * - * if (SystemUtils.IS_OS_MAC){ return true; } return ! ( StringUtils.isBlank( - * System.getenv("JAVA_HOME") ) //$NON-NLS-1$ && StringUtils.isBlank( - * System.getenv("JRE_HOME") ) //$NON-NLS-1$ && StringUtils.isBlank( - * System.getenv("COLLECT_EARTH_JRE_HOME") ) //$NON-NLS-1$ ); } - */ - - public boolean isSaikuFolder(File saikuFolder) { - boolean isSaikuFolder = false; - if (saikuFolder.listFiles() != null) { - for (final File file : saikuFolder.listFiles()) { - if (file.getName().equals(START_SAIKU + getCommandSuffix())) { - isSaikuFolder = true; + private void attachShutDownHook() { + Runtime.getRuntime().addShutdownHook(new Thread("Shutdown hook - Backup Database") { + @Override + public void run() { + if ( "true".equals(localPropertiesService.getValue(EarthProperty.AUTOMATIC_BACKUP) ) ) { //$NON-NLS-1$ + automaticDBBackup(); } } - } - return isSaikuFolder; - } - private void openSaiku() throws BrowserNotFoundException { - saikuWebDriver = browserService.navigateTo("http://127.0.0.1:8181", saikuWebDriver, false); //$NON-NLS-1$ - if (browserService.waitFor("username", saikuWebDriver)) { //$NON-NLS-1$ - saikuWebDriver.findElementByName("username").sendKeys("admin"); //$NON-NLS-1$ //$NON-NLS-2$ - saikuWebDriver.findElementByName("password").sendKeys("admin"); //$NON-NLS-1$ //$NON-NLS-2$ - saikuWebDriver.findElementByClassName("form_button").click(); //$NON-NLS-1$ - } + }); } + private void automaticDBBackup() { + if( localPropertiesService.isUsingSqliteDB() ){ - public void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws SaikuExecutionException { + String pathToBackupZip = ""; //$NON-NLS-1$ - try { - - stopSaiku(); + String nameCollectDB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB; + File originalDBFile = new File(nameCollectDB); try { - if ((localPropertiesService.isUsingSqliteDB() && !getZippedProjectDB( ExportType.SAIKU ).exists()) - || isRefreshDatabase()) { - - // The user clicked on the option to refresh the database, or there is no - // previous copy of the Saiku DB - // Generate the DB file - rdbExporter.exportDataToRDB( - earthSurveyService.getCollectSurvey(), - ExportType.SAIKU, - progressListener, - this::processQuantityData - ); - - try { - // Save the DB file in a zipped file to extends GenerateDatabase keep for the next usages - replaceZippedProjectDB( ExportType.SAIKU ); - } catch (Exception e) { - logger.error("Error while refreshing the Zipped content of the project Saiku DB", e); - } + pathToBackupZip = getBackupZipFilename(); - } else if (getZippedProjectDB(ExportType.SAIKU).exists() && localPropertiesService.isUsingSqliteDB()) { - // If the zipped version of the project exists ( and the user clicked on the - // option to not refresh it) then restore this last version of the data - restoreZippedProjectDB(ExportType.SAIKU); + try( ZipFile zipFile = CollectEarthUtils.addFileToZip(pathToBackupZip, originalDBFile, EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME) ){ + removeExtraBackups(); } - refreshDataSourceForSaiku(); - - if (startSaikuAfterDBExport && !isUserCancelledOperation()) { - startSaiku(); - new Thread("Opening Saiku") { - @Override - public void run() { - try { - AnalysisSaikuService.this.openSaiku(); - } catch (BrowserNotFoundException e) { - logger.error("No browser has been set up", e); //$NON-NLS-1$ - } - }; - }.start(); - - stopSaikuOnExit(); - } - } catch (final IOException e) { - logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ - } catch (TemplateException e1) { - logger.error("Error while applying the freemarker template tothe Saiku data source", e1); //$NON-NLS-1$ + } catch (IOException e) { + logger.error("Error when create backup of the Collect Earth Database from " + nameCollectDB + " to " + pathToBackupZip, e); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (Exception e) { + logger.error("Error when zipping the Collect Earth Database from " + nameCollectDB + " to " + pathToBackupZip, e); //$NON-NLS-1$ //$NON-NLS-2$ } - - } catch (final CollectRdbException e) { - logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ } } - private void processQuantityData(InfiniteProgressMonitor progressListener) { - - SwingUtilities.invokeLater( () -> progressListener.setMessage("Preparing Saiku data for analysis") ); - - progressListener.progressMade(new Progress(0, 100)); - createPngAluVariables(); - createPlotForeignKeys(); - - progressListener.progressMade(new Progress(25, 100)); - - if (!surveyContains("calculated_elevation_range", earthSurveyService.getCollectSurvey())) { - createAspectAuxTable(); - createSlopeAuxTable(); - createElevationtAuxTable(); - assignDimensionValues(); - - } - progressListener.progressMade(new Progress(50, 100)); - - if (!surveyContains("calculated_initial_land_use", earthSurveyService.getCollectSurvey())) { - createDynamicsAuxTable(); - creatAluSubclassVariables(); - assignLUCDimensionValues(); - - } - progressListener.progressMade(new Progress(75, 100)); - - assignPngAluToolDimensionValues(); - - SwingUtilities.invokeLater( () -> progressListener.setMessage("Calculating expansion factors") ); - - regionCalculation.handleRegionCalculation( ExportType.SAIKU, rdbExporter.getJdbcTemplate() ); - progressListener.progressMade(new Progress(100, 100)); - + private String getBackupZipFilename() throws IOException { + File backupFolder = getAutomaticBackUpFolder(); + return getDBCopyName(backupFolder); } - public static boolean surveyContains(String nodeName, CollectSurvey survey) { - NodeDefinition nodeDefForNAme = survey.getSchema().findNodeDefinition( nodeDef -> nodeDef.getName().equals(nodeName) ); - return nodeDefForNAme != null; + public String getDBCopyName(File backupFolder) throws IOException { + String pathToBackup; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HHmmss"); //$NON-NLS-1$ + StringBuilder destPathStr = new StringBuilder(); + destPathStr.append(backupFolder.getCanonicalPath()); + destPathStr.append(File.separatorChar); + destPathStr.append( EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME); + destPathStr.append(sdf.format( new Date() )).append( ".zip"); + pathToBackup = destPathStr.toString(); + return pathToBackup; } - public static CSVReader getCsvReader(String csvFile) throws FileNotFoundException { - final BufferedReader bufferedReader = new BufferedReader( - new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 ) ); //$NON-NLS-1$ - return new CSVReader(bufferedReader); - } + private void removeExtraBackups() { - private void refreshDataSourceForSaiku() throws IOException, TemplateException { - final File mdxFile = new File(localPropertiesService.getProjectFolder() + File.separatorChar + MDX_XML); + File backupFolder = getAutomaticBackUpFolder(); - Map data = new HashMap<>(); - data.put("cubeFilePath", StringEscapeUtils.escapeJava(mdxFile.getAbsolutePath().replace('\\', '/'))); //$NON-NLS-1$ + File[] files = backupFolder.listFiles(); + if( files!=null && files.length > MAXIMUM_NUMBER_OF_BACKUPS ){ - final File mdxTemplate = getMdxTemplate(); - final File dataSourceTemplate = getDataSourceTemplate(data); - - // First try Saiku 2.5/2.6 - File dataSourceFile; - try { - dataSourceFile = new File(getSaikuConfigurationFilePath()); - FreemarkerTemplateUtils.applyTemplate(dataSourceTemplate, dataSourceFile, data); - } catch (Exception e) { - logger.error("Error starting Saiku", e); - dataSourceFile = new File(getSaikuThreeConfigurationFilePath()); - FreemarkerTemplateUtils.applyTemplate(dataSourceTemplate, dataSourceFile, data); - } - - setMdxSaikuSchema(mdxTemplate, mdxFile); - } - - private File getMdxTemplate() throws IOException { - final File mdxFileTemplate = new File( - localPropertiesService.getProjectFolder() + File.separatorChar + MDX_TEMPLATE); - if (!mdxFileTemplate.exists()) { - throw new IOException( - "The file containing the MDX Cube definition Template does not exist in expected location " //$NON-NLS-1$ - + mdxFileTemplate.getAbsolutePath()); - } - return mdxFileTemplate; - } - - private File getDataSourceTemplate(Map data) throws IOException { - File dataSourceTemplate = null; - - if (localPropertiesService.isUsingSqliteDB()) { - dataSourceTemplate = new File(SQLITE_FREEMARKER_HTML_TEMPLATE); - final File rdbDb = rdbExporter.getRdbFile( ExportType.SAIKU ); - if (!rdbDb.exists()) { - throw new IOException( - "The file contianing the Relational SQLite Database does not exist in expected location " //$NON-NLS-1$ - + rdbDb.getAbsolutePath()); - } - data.put("rdbFilePath", StringEscapeUtils.escapeJava(rdbDb.getAbsolutePath().replace('\\', '/'))); //$NON-NLS-1$ - } else { - dataSourceTemplate = new File(POSTGRESQL_FREEMARKER_HTML_TEMPLATE); - CollectDBDriver collectDBDriver = localPropertiesService.getCollectDBDriver(); - data.put("dbUrl", StringEscapeUtils.escapeJava(ServerController.getSaikuDbURL(collectDBDriver))); //$NON-NLS-1$ - data.put("username", //$NON-NLS-1$ - StringEscapeUtils.escapeJava(localPropertiesService.getValue(EarthProperty.DB_USERNAME))); - data.put("password", //$NON-NLS-1$ - StringEscapeUtils.escapeJava(localPropertiesService.getValue(EarthProperty.DB_PASSWORD))); - } - - if (!dataSourceTemplate.exists()) { - throw new IOException( - "The file containing the Saiku Data Source template does not exist in expected location " //$NON-NLS-1$ - + dataSourceTemplate.getAbsolutePath()); - } - - return dataSourceTemplate; - } - - private void setMdxSaikuSchema(final File mdxFileTemplate, final File mdxFile) - throws IOException, TemplateException { - Map saikuData = new HashMap<>(); - String saikuSchemaName = getSchemaName(); - if (saikuSchemaName == null) { - saikuSchemaName = ""; //$NON-NLS-1$ - } - saikuData.put("saikuDbSchema", saikuSchemaName); //$NON-NLS-1$ - FreemarkerTemplateUtils.applyTemplate(mdxFileTemplate, mdxFile, saikuData); - } - - private void runSaikuBat(String commandName) throws SaikuExecutionException { - if (!isSaikuConfigured()) { - throw new SaikuExecutionException("The Saiku server is not configured."); //$NON-NLS-1$ - } - - else { - String saikuCmd = localPropertiesService.getSaikuFolder() + File.separator + commandName - + getCommandSuffix(); - - if (SystemUtils.IS_OS_WINDOWS) { - saikuCmd = "\"" + saikuCmd + "\""; //$NON-NLS-1$ //$NON-NLS-2$ - } - - try { - - Process runSaiku = runProcessBuilder(new String[] { saikuCmd }); - - if (commandName.equals(STOP_SAIKU)) { - int result = runSaiku.waitFor(); - logger.warn("Script ended with result {}", result); //$NON-NLS-1$ - } else if (commandName.equals(START_SAIKU)) { - Thread.sleep(6000); - } - - } catch (final IOException e) { - logger.error("Error when running Saiku start/stop command", e); //$NON-NLS-1$ - } catch (InterruptedException e) { - logger.error("Error while waiting to start", e); //$NON-NLS-1$ - Thread.currentThread().interrupt(); - } - } - } - - private void setMacJreHome(ProcessBuilder p) { - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX || SystemUtils.IS_OS_LINUX) { - - File javaFolder = new File("./java"); + Arrays.sort(files, (o1,o2) -> { + if( o1.lastModified() < o2.lastModified() ){ + return 1; + }else if( o1.lastModified() == o2.lastModified() ){ + return 0; + }else{ + return -1; + } - if (!javaFolder.exists()) { - String userName = System.getProperty("user.name"); - String testWithPath = "/Users/" + userName + "/OpenForis/CollectEarth/java"; - File testJavaPath = new File(testWithPath); - if (testJavaPath.exists()) { - javaFolder = testJavaPath; } - } - - Map environment = p.environment(); - environment.put("COLLECT_EARTH_JRE_HOME", javaFolder.getAbsolutePath()); - - /* - * // In MAC the environment variable COLLECT_EARTH_JRE_HOME is not accesible - * from outside the bash, set it again! if( SystemUtils.IS_OS_MAC || - * SystemUtils.IS_OS_MAC_OSX){ try { File javaFolder = new File("./java"); - * - * if( !javaFolder.exists() ){ String userName = - * System.getProperty("user.name"); String testWithPath = "/Users/"+userName + - * "/OpenForis/CollectEarth/java"; File testJavaPath = new File(testWithPath); - * if( testJavaPath.exists()){ javaFolder = testJavaPath; } } - * - * Process setEnv = runProcessBuilder(new String[] { "/bin/bash", "setenv", - * "COLLECT_EARTH_JRE_HOME=\""+ javaFolder.getAbsolutePath() +"\"" }); - * setEnv.waitFor(); } catch (final IOException e) { - * logger.error("Error setting the COLLECT_EARTH_JRE_HOME environment variable", - * e); //$NON-NLS-1$ } catch (InterruptedException e) { - * logger.error("Error when running COLLECT_EARTH_JRE_HOME environment variable" - * , e); //$NON-NLS-1$ } } - */ - } - } - - private Process runProcessBuilder(String[] cmd) throws IOException { - final ProcessBuilder builder = new ProcessBuilder(cmd); - - // Fixes bug with Mac OS X not using the environemnt variable set for bash - setMacJreHome(builder); - - builder.directory(new File(localPropertiesService.getSaikuFolder()).getAbsoluteFile()); - builder.redirectErrorStream(true); - Process p = builder.start(); - (new ProcessLoggerThread(p.getInputStream(), Boolean.FALSE)).start(); - (new ProcessLoggerThread(p.getErrorStream(), Boolean.TRUE)).start(); - return p; - } - - private String getCommandSuffix() { - if (SystemUtils.IS_OS_WINDOWS) { - return COMMAND_SUFFIX_BAT; - } else { - return COMMAND_SUFFIX_SH; - } - } - - private void startSaiku() throws SaikuExecutionException { - logger.warn( - "Starting the Saiku server {}{}{}", localPropertiesService.getSaikuFolder(), File.separator, START_SAIKU); //$NON-NLS-1$ - - runSaikuBat(START_SAIKU); - - this.setSaikuStarted(true); - - logger.warn("Finished starting the Saiku server"); //$NON-NLS-1$ - } + ); - void stopSaiku() throws SaikuExecutionException { - logger.warn("Stoping the Saiku server {}{}{}", localPropertiesService.getSaikuFolder() , File.separator , STOP_SAIKU); //$NON-NLS-1$ - if (isSaikuStarted()) { - runSaikuBat(STOP_SAIKU); - this.setSaikuStarted(true); - } - logger.warn("Finished stoping the Saiku server"); //$NON-NLS-1$ - } - - private void stopSaikuOnExit() { - Runtime.getRuntime().addShutdownHook(new Thread("Shutting down Saiku on exit hook") { - @Override - public void run() { - try { - if (isSaikuStarted()) { - stopSaiku(); - } - } catch (final SaikuExecutionException e) { - logger.error("The Saiku server has been de-configured after it was started", e); //$NON-NLS-1$ + for( int i = MAXIMUM_NUMBER_OF_BACKUPS; i< files.length ; i++ ){ + if( !files[i].delete() ) { + logger.error( "Error deleteting file", files[i].getAbsolutePath() ); } } - }); - } - - private boolean isSaikuStarted() { - return saikuStarted; - } - - private void setSaikuStarted(boolean saikuStarted) { - this.saikuStarted = saikuStarted; - } - - @Override - public void destroy() throws Exception { - try { - stopSaiku(); - } catch (SaikuExecutionException e) { - logger.error("Error while trying to quite Saiku before destroying the bean", e); //$NON-NLS-1$ } - } - @Override - public LocalPropertiesService getLocalPropertiesService() { - return localPropertiesService; } - @Override - public EarthSurveyService getEarthSurveyService() { - return earthSurveyService; - } - @Override - public RDBExporter getRdbExporter() { - return rdbExporter; + /** + * Returns the folder where the backup copies should be placed. + * @return The OS dependent folder where the application should saved the backed up copies. + */ + public File getAutomaticBackUpFolder() { + return FolderFinder.createFolderInAppData( BACKUP_COLLECT_EARTH); } -} \ No newline at end of file +} From a86d822d54daf70e89bd486c90ff6e69256f97a8 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:50 +0100 Subject: [PATCH 1023/1620] New translations BackupSqlLiteService.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 755 ++---------------- 1 file changed, 83 insertions(+), 672 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index cba7f5812d..8c14343c96 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,731 +1,142 @@ package org.openforis.collect.earth.app.service; -import java.io.BufferedReader; import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.IOException; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.SystemUtils; -import org.apache.commons.text.StringEscapeUtils; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Date; + +import org.apache.commons.dbcp.BasicDataSource; +import org.openforis.collect.earth.app.CollectEarthUtils; import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; -import org.openforis.collect.earth.app.ad_hoc.AluToolUtils; -import org.openforis.collect.earth.app.desktop.ServerController; -import org.openforis.collect.earth.app.model.AspectCode; -import org.openforis.collect.earth.app.model.DynamicsCode; -import org.openforis.collect.earth.app.model.SlopeCode; import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; -import org.openforis.collect.model.CollectSurvey; -import org.openforis.collect.relational.CollectRDBPublisher; -import org.openforis.collect.relational.CollectRdbException; -import org.openforis.concurrency.Progress; -import org.openforis.idm.metamodel.NodeDefinition; -import org.openqa.selenium.remote.RemoteWebDriver; -import org.springframework.beans.factory.DisposableBean; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.RowMapper; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; -import com.opencsv.CSVReader; +import net.lingala.zip4j.ZipFile; -import freemarker.template.TemplateException; +/** + * Spring managed bean that handles the creation of backups of the Collect database. + * The SQLite database file will be saved everytime the application closes. + * A maximum of 10 copies (the last ten times the application was used) will be saved on the backupCollectEarth folder on the users application data folder (OS dependant). + * @author Alfonso Sanchez-Paus Diaz + * + */ @Component -public class AnalysisSaikuService extends GenerateDatabase implements DisposableBean{ - - private static final String PLOT_ADD = "plot ADD "; - - private static final String UPDATE = "UPDATE "; - - private static final String UNKNOWN = "Unknown"; - - private static final String VARCHAR_5 = " VARCHAR(5)"; - - private static final String INTEGER = " INTEGER"; - - private static final String ALTER_TABLE = "ALTER TABLE "; - - private static final String INSERT_INTO = "INSERT INTO "; - - private static final String CREATE_TABLE = "CREATE TABLE "; - - private static final String ALU_CLIMATE_ZONE_CODE = "alu_climate_zone_code"; //$NON-NLS-1$ - - private static final String ALU_SOIL_TYPE_CODE = "alu_soil_type_code"; //$NON-NLS-1$ +@Lazy(false) +public class BackupSqlLiteService implements InitializingBean{ - private static final String ALU_SUBCLASS_CODE = "alu_subclass_code"; //$NON-NLS-1$ - - private static final String DYNAMICS_ID = "dynamics_id"; //$NON-NLS-1$ - - private static final String ELEVATION_ID = "elevation_id"; //$NON-NLS-1$ - - private static final String SLOPE_ID = "slope_id"; //$NON-NLS-1$ - - private static final String ASPECT_ID = "aspect_id"; //$NON-NLS-1$ - - private static final String START_SAIKU = "start-saiku"; //$NON-NLS-1$ - - private static final String STOP_SAIKU = "stop-saiku"; //$NON-NLS-1$ - - private static final String COMMAND_SUFFIX_BAT = ".bat"; //$NON-NLS-1$ - - private static final String COMMAND_SUFFIX_SH = ".sh"; //$NON-NLS-1$ - - public static final String COLLECT_EARTH_DATABASE_RDB_DB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB - + EarthConstants.SAIKU_RDB_SUFFIX; + private static final String BACKUP_COLLECT_EARTH = "backupSqlite"; //$NON-NLS-1$ + private static final int MAXIMUM_NUMBER_OF_BACKUPS = 10; @Autowired - RDBExporter rdbExporter; + BasicDataSource dataSource; @Autowired - CollectRDBPublisher collectRDBPublisher; - - @Autowired - EarthSurveyService earthSurveyService; - - @Autowired - public LocalPropertiesService localPropertiesService; - - @Autowired - BrowserService browserService; - - @Autowired - private RegionCalculationUtils regionCalculation; - - @Autowired - private SchemaService schemaNamingService; - - private static final int ELEVATION_RANGE = 100; - - private RemoteWebDriver saikuWebDriver; - - private static final String SQLITE_FREEMARKER_HTML_TEMPLATE = "resources" + File.separator //$NON-NLS-1$ - + "collectEarthSqliteDS.fmt"; //$NON-NLS-1$ - private static final String POSTGRESQL_FREEMARKER_HTML_TEMPLATE = "resources" + File.separator //$NON-NLS-1$ - + "collectEarthPostgreSqlDS.fmt"; //$NON-NLS-1$ - public static final String MDX_XML = "collectEarthCubes.xml"; //$NON-NLS-1$ - private static final String MDX_TEMPLATE = MDX_XML + ".fmt"; //$NON-NLS-1$ - - private boolean saikuStarted; - - private void assignDimensionValues() { - try { - final String schemaName = getSchemaPrefix(); - // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id - final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query( - "SELECT " + EarthConstants.PLOT_ID + ", elevation, slope, aspect FROM " + schemaName + "plot", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - new RowMapper() { - @Override - public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { - - final Object[] updateValues = new Object[4]; - - Integer aspect = AspectCode.NA.getId(); - if (AspectCode.getAspectCode(rs.getDouble("aspect")) != null) { //$NON-NLS-1$ - aspect = AspectCode.getAspectCode(rs.getDouble("aspect")).getId(); //$NON-NLS-1$ - } - - Integer slope = SlopeCode.NA.getId(); - - if (SlopeCode.getSlopeCode((int) rs.getFloat("slope")) != null) { //$NON-NLS-1$ - slope = SlopeCode.getSlopeCode((int) rs.getFloat("slope")).getId(); //$NON-NLS-1$ - } - - updateValues[0] = aspect; - updateValues[1] = slope; - updateValues[2] = ( (int) rs.getFloat("elevation") / ELEVATION_RANGE) + 1; // 0 //$NON-NLS-1$ - - updateValues[3] = rs.getLong(EarthConstants.PLOT_ID); - return updateValues; - } - - }); - - rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + ASPECT_ID + "=?," + SLOPE_ID + "=?," //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - + ELEVATION_ID + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (Exception e) { - logger.warn("No DEM information", e); //$NON-NLS-1$ - } - } - - private String getSchemaPrefix() { - return schemaNamingService.getSchemaPrefix(ExportType.SAIKU); - } - - private void assignPngAluToolDimensionValues() { - try { - if (earthSurveyService.getCollectSurvey().getName().toLowerCase().contains("png")) { //$NON-NLS-1$ - final String schemaName = getSchemaPrefix(); - // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id - final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query("SELECT " + EarthConstants.PLOT_ID //$NON-NLS-1$ - + ", elevation, soil_fundamental, land_use_subcategory, precipitation_ranges FROM " + schemaName //$NON-NLS-1$ - + "plot LEFT JOIN " + schemaName + "precipitation_ranges_code where " //$NON-NLS-1$ //$NON-NLS-2$ - + "plot.annual_precipitation_code_id=precipitation_ranges_code.precipitation_ranges_code_id", //$NON-NLS-1$ - new RowMapper() { - @Override - public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { - - final Object[] updateValues = new Object[3]; - - try { - AluToolUtils aluToolUtils = new AluToolUtils(); - - Integer elevation = rs.getInt("elevation"); //$NON-NLS-1$ - String soilFundamental = rs.getString("soil_fundamental"); //$NON-NLS-1$ - String precipitationRange = rs.getString("precipitation_ranges"); //$NON-NLS-1$ - - int precipitation = -1; - String climateZone = UNKNOWN; //$NON-NLS-1$ - if (precipitationRange != null) { - precipitation = aluToolUtils.getPrecipitationFromRange(precipitationRange); - boolean shortDrySeason = true; // According to information from Abe PNG has less - // than 5 months of dry season - climateZone = aluToolUtils.getClimateZone(elevation, precipitation, - shortDrySeason); - } - - String soilType = UNKNOWN; //$NON-NLS-1$ - if (soilFundamental != null) { - soilType = aluToolUtils.getSoilType(soilFundamental); - } - - updateValues[0] = climateZone; - updateValues[1] = soilType; - updateValues[2] = rs.getLong(EarthConstants.PLOT_ID); - } catch (Exception e) { - logger.error("Error while processing the data", e); //$NON-NLS-1$ - updateValues[0] = UNKNOWN; //$NON-NLS-1$ - updateValues[1] = UNKNOWN; //$NON-NLS-1$ - updateValues[2] = UNKNOWN; //$NON-NLS-1$ - } - return updateValues; - } - - }); - - rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + ALU_CLIMATE_ZONE_CODE + "=?," //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + ALU_SOIL_TYPE_CODE + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ //$NON-NLS-2$ - } - } catch (Exception e) { - logger.error("No PNG ALU information", e); //$NON-NLS-1$ - } - } - - private void assignLUCDimensionValues() { - try { - final String schemaName = getSchemaPrefix(); - // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id - final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query( - "SELECT " + EarthConstants.PLOT_ID + ", land_use_subcategory FROM " + schemaName + "plot", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - new RowMapper() { - @Override - public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { - - AluToolUtils aluToolUtils = new AluToolUtils(); - final Object[] updateValues = new Object[3]; - - String collectEarthSubcategory = rs.getString("land_use_subcategory"); //$NON-NLS-1$ - Integer dynamics = DynamicsCode.getDynamicsCode(collectEarthSubcategory); - String subClass = UNKNOWN; //$NON-NLS-1$ - if (collectEarthSubcategory != null) { - subClass = aluToolUtils.getAluSubclass(collectEarthSubcategory); - } - - updateValues[0] = dynamics; - updateValues[1] = subClass; - updateValues[2] = rs.getLong(EarthConstants.PLOT_ID); - return updateValues; - } - - }); - - rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + DYNAMICS_ID + "=?," + ALU_SUBCLASS_CODE //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ - } catch (Exception e) { - logger.warn("No PNG Alu information available", e); //$NON-NLS-1$ - } - } + private LocalPropertiesService localPropertiesService; - private void createAspectAuxTable() { - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "aspect_category (" + ASPECT_ID //$NON-NLS-1$ //$NON-NLS-2$ - + " INTEGER PRIMARY KEY, aspect_caption TEXT);"); //$NON-NLS-1$ - final AspectCode[] aspects = AspectCode.values(); - for (final AspectCode aspectCode : aspects) { - rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "aspect_category values (" + aspectCode.getId() + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + aspectCode.getLabel() + "')"); //$NON-NLS-1$ - } - } - - private void createElevationtAuxTable() { - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "elevation_category ( " + ELEVATION_ID //$NON-NLS-1$ //$NON-NLS-2$ - + " INTEGER PRIMARY KEY, elevation_caption TEXT);"); //$NON-NLS-1$ - final int slots = 9000 / ELEVATION_RANGE; // Highest mountain in the world, mount everest is - // 8820m high - for (int i = 1; i <= slots; i++) { - rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "elevation_category values (" + i + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + ((i - 1) * ELEVATION_RANGE) + "-" + i //$NON-NLS-1$ - * ELEVATION_RANGE - + "')"); //$NON-NLS-1$ - } - - } - - private void createDynamicsAuxTable() { - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "dynamics_category (" + DYNAMICS_ID //$NON-NLS-1$ //$NON-NLS-2$ - + " INTEGER PRIMARY KEY, dynamics_caption TEXT);"); //$NON-NLS-1$ - final DynamicsCode[] dynamicsCodes = DynamicsCode.values(); - for (final DynamicsCode dynamicsCode : dynamicsCodes) { - rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "dynamics_category values (" + dynamicsCode.getId() //$NON-NLS-1$ //$NON-NLS-2$ - + ", '" + dynamicsCode.getLabel() + "')"); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - - private void createPlotForeignKeys() { - // Add aspect_id column to plot - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ASPECT_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + SLOPE_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ELEVATION_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + DYNAMICS_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } + private Logger logger = LoggerFactory.getLogger( BackupSqlLiteService.class ); - private void createPngAluVariables() { - if (earthSurveyService.getCollectSurvey().getName().toLowerCase().contains("png")) { //$NON-NLS-1$ - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_SOIL_TYPE_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_CLIMATE_ZONE_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - } - - private void creatAluSubclassVariables() { - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_SUBCLASS_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - - private void createSlopeAuxTable() { - final String schemaName = getSchemaPrefix(); - // Slope can be from 0 to 90 - rdbExporter.getJdbcTemplate().execute( - CREATE_TABLE + schemaName + "slope_category (slope_id INTEGER PRIMARY KEY, slope_caption TEXT);"); //$NON-NLS-1$ //$NON-NLS-2$ - final SlopeCode[] slopeCodes = SlopeCode.values(); - for (final SlopeCode slopeCode : slopeCodes) { - rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "slope_category values (" + slopeCode.getId() + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + slopeCode.getLabel() + "')"); //$NON-NLS-1$ - } - } - - private String getSaikuConfigurationFilePath() { - - String configFile = localPropertiesService.getSaikuFolder() + "/" //$NON-NLS-1$ - + "tomcat/webapps/saiku/WEB-INF/classes/saiku-datasources/collectEarthDS"; //$NON-NLS-1$ - configFile = configFile.replace('/', File.separatorChar); - return configFile; - } - - private String getSaikuThreeConfigurationFilePath() { - - String configFile = localPropertiesService.getSaikuFolder() + "/" //$NON-NLS-1$ - + "tomcat/webapps/saiku/WEB-INF/classes/legacy-datasources/collectEarthDS"; //$NON-NLS-1$ - configFile = configFile.replace('/', File.separatorChar); - return configFile; - } - - private boolean isSaikuConfigured() { - return localPropertiesService.getSaikuFolder() != null - && isSaikuFolder(new File(localPropertiesService.getSaikuFolder())); + @Override + public void afterPropertiesSet() throws Exception { + attachShutDownHook(); } - /* - * private boolean isJavaHomeConfigured() { - * - * if (SystemUtils.IS_OS_MAC){ return true; } return ! ( StringUtils.isBlank( - * System.getenv("JAVA_HOME") ) //$NON-NLS-1$ && StringUtils.isBlank( - * System.getenv("JRE_HOME") ) //$NON-NLS-1$ && StringUtils.isBlank( - * System.getenv("COLLECT_EARTH_JRE_HOME") ) //$NON-NLS-1$ ); } - */ - - public boolean isSaikuFolder(File saikuFolder) { - boolean isSaikuFolder = false; - if (saikuFolder.listFiles() != null) { - for (final File file : saikuFolder.listFiles()) { - if (file.getName().equals(START_SAIKU + getCommandSuffix())) { - isSaikuFolder = true; + private void attachShutDownHook() { + Runtime.getRuntime().addShutdownHook(new Thread("Shutdown hook - Backup Database") { + @Override + public void run() { + if ( "true".equals(localPropertiesService.getValue(EarthProperty.AUTOMATIC_BACKUP) ) ) { //$NON-NLS-1$ + automaticDBBackup(); } } - } - return isSaikuFolder; - } - private void openSaiku() throws BrowserNotFoundException { - saikuWebDriver = browserService.navigateTo("http://127.0.0.1:8181", saikuWebDriver, false); //$NON-NLS-1$ - if (browserService.waitFor("username", saikuWebDriver)) { //$NON-NLS-1$ - saikuWebDriver.findElementByName("username").sendKeys("admin"); //$NON-NLS-1$ //$NON-NLS-2$ - saikuWebDriver.findElementByName("password").sendKeys("admin"); //$NON-NLS-1$ //$NON-NLS-2$ - saikuWebDriver.findElementByClassName("form_button").click(); //$NON-NLS-1$ - } + }); } + private void automaticDBBackup() { + if( localPropertiesService.isUsingSqliteDB() ){ - public void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws SaikuExecutionException { + String pathToBackupZip = ""; //$NON-NLS-1$ - try { - - stopSaiku(); + String nameCollectDB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB; + File originalDBFile = new File(nameCollectDB); try { - if ((localPropertiesService.isUsingSqliteDB() && !getZippedProjectDB( ExportType.SAIKU ).exists()) - || isRefreshDatabase()) { - - // The user clicked on the option to refresh the database, or there is no - // previous copy of the Saiku DB - // Generate the DB file - rdbExporter.exportDataToRDB( - earthSurveyService.getCollectSurvey(), - ExportType.SAIKU, - progressListener, - this::processQuantityData - ); - - try { - // Save the DB file in a zipped file to extends GenerateDatabase keep for the next usages - replaceZippedProjectDB( ExportType.SAIKU ); - } catch (Exception e) { - logger.error("Error while refreshing the Zipped content of the project Saiku DB", e); - } + pathToBackupZip = getBackupZipFilename(); - } else if (getZippedProjectDB(ExportType.SAIKU).exists() && localPropertiesService.isUsingSqliteDB()) { - // If the zipped version of the project exists ( and the user clicked on the - // option to not refresh it) then restore this last version of the data - restoreZippedProjectDB(ExportType.SAIKU); + try( ZipFile zipFile = CollectEarthUtils.addFileToZip(pathToBackupZip, originalDBFile, EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME) ){ + removeExtraBackups(); } - refreshDataSourceForSaiku(); - - if (startSaikuAfterDBExport && !isUserCancelledOperation()) { - startSaiku(); - new Thread("Opening Saiku") { - @Override - public void run() { - try { - AnalysisSaikuService.this.openSaiku(); - } catch (BrowserNotFoundException e) { - logger.error("No browser has been set up", e); //$NON-NLS-1$ - } - }; - }.start(); - - stopSaikuOnExit(); - } - } catch (final IOException e) { - logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ - } catch (TemplateException e1) { - logger.error("Error while applying the freemarker template tothe Saiku data source", e1); //$NON-NLS-1$ + } catch (IOException e) { + logger.error("Error when create backup of the Collect Earth Database from " + nameCollectDB + " to " + pathToBackupZip, e); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (Exception e) { + logger.error("Error when zipping the Collect Earth Database from " + nameCollectDB + " to " + pathToBackupZip, e); //$NON-NLS-1$ //$NON-NLS-2$ } - - } catch (final CollectRdbException e) { - logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ } } - private void processQuantityData(InfiniteProgressMonitor progressListener) { - - SwingUtilities.invokeLater( () -> progressListener.setMessage("Preparing Saiku data for analysis") ); - - progressListener.progressMade(new Progress(0, 100)); - createPngAluVariables(); - createPlotForeignKeys(); - - progressListener.progressMade(new Progress(25, 100)); - - if (!surveyContains("calculated_elevation_range", earthSurveyService.getCollectSurvey())) { - createAspectAuxTable(); - createSlopeAuxTable(); - createElevationtAuxTable(); - assignDimensionValues(); - - } - progressListener.progressMade(new Progress(50, 100)); - - if (!surveyContains("calculated_initial_land_use", earthSurveyService.getCollectSurvey())) { - createDynamicsAuxTable(); - creatAluSubclassVariables(); - assignLUCDimensionValues(); - - } - progressListener.progressMade(new Progress(75, 100)); - - assignPngAluToolDimensionValues(); - - SwingUtilities.invokeLater( () -> progressListener.setMessage("Calculating expansion factors") ); - - regionCalculation.handleRegionCalculation( ExportType.SAIKU, rdbExporter.getJdbcTemplate() ); - progressListener.progressMade(new Progress(100, 100)); - + private String getBackupZipFilename() throws IOException { + File backupFolder = getAutomaticBackUpFolder(); + return getDBCopyName(backupFolder); } - public static boolean surveyContains(String nodeName, CollectSurvey survey) { - NodeDefinition nodeDefForNAme = survey.getSchema().findNodeDefinition( nodeDef -> nodeDef.getName().equals(nodeName) ); - return nodeDefForNAme != null; + public String getDBCopyName(File backupFolder) throws IOException { + String pathToBackup; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HHmmss"); //$NON-NLS-1$ + StringBuilder destPathStr = new StringBuilder(); + destPathStr.append(backupFolder.getCanonicalPath()); + destPathStr.append(File.separatorChar); + destPathStr.append( EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME); + destPathStr.append(sdf.format( new Date() )).append( ".zip"); + pathToBackup = destPathStr.toString(); + return pathToBackup; } - public static CSVReader getCsvReader(String csvFile) throws FileNotFoundException { - final BufferedReader bufferedReader = new BufferedReader( - new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 ) ); //$NON-NLS-1$ - return new CSVReader(bufferedReader); - } + private void removeExtraBackups() { - private void refreshDataSourceForSaiku() throws IOException, TemplateException { - final File mdxFile = new File(localPropertiesService.getProjectFolder() + File.separatorChar + MDX_XML); + File backupFolder = getAutomaticBackUpFolder(); - Map data = new HashMap<>(); - data.put("cubeFilePath", StringEscapeUtils.escapeJava(mdxFile.getAbsolutePath().replace('\\', '/'))); //$NON-NLS-1$ + File[] files = backupFolder.listFiles(); + if( files!=null && files.length > MAXIMUM_NUMBER_OF_BACKUPS ){ - final File mdxTemplate = getMdxTemplate(); - final File dataSourceTemplate = getDataSourceTemplate(data); - - // First try Saiku 2.5/2.6 - File dataSourceFile; - try { - dataSourceFile = new File(getSaikuConfigurationFilePath()); - FreemarkerTemplateUtils.applyTemplate(dataSourceTemplate, dataSourceFile, data); - } catch (Exception e) { - logger.error("Error starting Saiku", e); - dataSourceFile = new File(getSaikuThreeConfigurationFilePath()); - FreemarkerTemplateUtils.applyTemplate(dataSourceTemplate, dataSourceFile, data); - } - - setMdxSaikuSchema(mdxTemplate, mdxFile); - } - - private File getMdxTemplate() throws IOException { - final File mdxFileTemplate = new File( - localPropertiesService.getProjectFolder() + File.separatorChar + MDX_TEMPLATE); - if (!mdxFileTemplate.exists()) { - throw new IOException( - "The file containing the MDX Cube definition Template does not exist in expected location " //$NON-NLS-1$ - + mdxFileTemplate.getAbsolutePath()); - } - return mdxFileTemplate; - } - - private File getDataSourceTemplate(Map data) throws IOException { - File dataSourceTemplate = null; - - if (localPropertiesService.isUsingSqliteDB()) { - dataSourceTemplate = new File(SQLITE_FREEMARKER_HTML_TEMPLATE); - final File rdbDb = rdbExporter.getRdbFile( ExportType.SAIKU ); - if (!rdbDb.exists()) { - throw new IOException( - "The file contianing the Relational SQLite Database does not exist in expected location " //$NON-NLS-1$ - + rdbDb.getAbsolutePath()); - } - data.put("rdbFilePath", StringEscapeUtils.escapeJava(rdbDb.getAbsolutePath().replace('\\', '/'))); //$NON-NLS-1$ - } else { - dataSourceTemplate = new File(POSTGRESQL_FREEMARKER_HTML_TEMPLATE); - CollectDBDriver collectDBDriver = localPropertiesService.getCollectDBDriver(); - data.put("dbUrl", StringEscapeUtils.escapeJava(ServerController.getSaikuDbURL(collectDBDriver))); //$NON-NLS-1$ - data.put("username", //$NON-NLS-1$ - StringEscapeUtils.escapeJava(localPropertiesService.getValue(EarthProperty.DB_USERNAME))); - data.put("password", //$NON-NLS-1$ - StringEscapeUtils.escapeJava(localPropertiesService.getValue(EarthProperty.DB_PASSWORD))); - } - - if (!dataSourceTemplate.exists()) { - throw new IOException( - "The file containing the Saiku Data Source template does not exist in expected location " //$NON-NLS-1$ - + dataSourceTemplate.getAbsolutePath()); - } - - return dataSourceTemplate; - } - - private void setMdxSaikuSchema(final File mdxFileTemplate, final File mdxFile) - throws IOException, TemplateException { - Map saikuData = new HashMap<>(); - String saikuSchemaName = getSchemaName(); - if (saikuSchemaName == null) { - saikuSchemaName = ""; //$NON-NLS-1$ - } - saikuData.put("saikuDbSchema", saikuSchemaName); //$NON-NLS-1$ - FreemarkerTemplateUtils.applyTemplate(mdxFileTemplate, mdxFile, saikuData); - } - - private void runSaikuBat(String commandName) throws SaikuExecutionException { - if (!isSaikuConfigured()) { - throw new SaikuExecutionException("The Saiku server is not configured."); //$NON-NLS-1$ - } - - else { - String saikuCmd = localPropertiesService.getSaikuFolder() + File.separator + commandName - + getCommandSuffix(); - - if (SystemUtils.IS_OS_WINDOWS) { - saikuCmd = "\"" + saikuCmd + "\""; //$NON-NLS-1$ //$NON-NLS-2$ - } - - try { - - Process runSaiku = runProcessBuilder(new String[] { saikuCmd }); - - if (commandName.equals(STOP_SAIKU)) { - int result = runSaiku.waitFor(); - logger.warn("Script ended with result {}", result); //$NON-NLS-1$ - } else if (commandName.equals(START_SAIKU)) { - Thread.sleep(6000); - } - - } catch (final IOException e) { - logger.error("Error when running Saiku start/stop command", e); //$NON-NLS-1$ - } catch (InterruptedException e) { - logger.error("Error while waiting to start", e); //$NON-NLS-1$ - Thread.currentThread().interrupt(); - } - } - } - - private void setMacJreHome(ProcessBuilder p) { - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX || SystemUtils.IS_OS_LINUX) { - - File javaFolder = new File("./java"); + Arrays.sort(files, (o1,o2) -> { + if( o1.lastModified() < o2.lastModified() ){ + return 1; + }else if( o1.lastModified() == o2.lastModified() ){ + return 0; + }else{ + return -1; + } - if (!javaFolder.exists()) { - String userName = System.getProperty("user.name"); - String testWithPath = "/Users/" + userName + "/OpenForis/CollectEarth/java"; - File testJavaPath = new File(testWithPath); - if (testJavaPath.exists()) { - javaFolder = testJavaPath; } - } - - Map environment = p.environment(); - environment.put("COLLECT_EARTH_JRE_HOME", javaFolder.getAbsolutePath()); - - /* - * // In MAC the environment variable COLLECT_EARTH_JRE_HOME is not accesible - * from outside the bash, set it again! if( SystemUtils.IS_OS_MAC || - * SystemUtils.IS_OS_MAC_OSX){ try { File javaFolder = new File("./java"); - * - * if( !javaFolder.exists() ){ String userName = - * System.getProperty("user.name"); String testWithPath = "/Users/"+userName + - * "/OpenForis/CollectEarth/java"; File testJavaPath = new File(testWithPath); - * if( testJavaPath.exists()){ javaFolder = testJavaPath; } } - * - * Process setEnv = runProcessBuilder(new String[] { "/bin/bash", "setenv", - * "COLLECT_EARTH_JRE_HOME=\""+ javaFolder.getAbsolutePath() +"\"" }); - * setEnv.waitFor(); } catch (final IOException e) { - * logger.error("Error setting the COLLECT_EARTH_JRE_HOME environment variable", - * e); //$NON-NLS-1$ } catch (InterruptedException e) { - * logger.error("Error when running COLLECT_EARTH_JRE_HOME environment variable" - * , e); //$NON-NLS-1$ } } - */ - } - } - - private Process runProcessBuilder(String[] cmd) throws IOException { - final ProcessBuilder builder = new ProcessBuilder(cmd); - - // Fixes bug with Mac OS X not using the environemnt variable set for bash - setMacJreHome(builder); - - builder.directory(new File(localPropertiesService.getSaikuFolder()).getAbsoluteFile()); - builder.redirectErrorStream(true); - Process p = builder.start(); - (new ProcessLoggerThread(p.getInputStream(), Boolean.FALSE)).start(); - (new ProcessLoggerThread(p.getErrorStream(), Boolean.TRUE)).start(); - return p; - } - - private String getCommandSuffix() { - if (SystemUtils.IS_OS_WINDOWS) { - return COMMAND_SUFFIX_BAT; - } else { - return COMMAND_SUFFIX_SH; - } - } - - private void startSaiku() throws SaikuExecutionException { - logger.warn( - "Starting the Saiku server {}{}{}", localPropertiesService.getSaikuFolder(), File.separator, START_SAIKU); //$NON-NLS-1$ - - runSaikuBat(START_SAIKU); - - this.setSaikuStarted(true); - - logger.warn("Finished starting the Saiku server"); //$NON-NLS-1$ - } + ); - void stopSaiku() throws SaikuExecutionException { - logger.warn("Stoping the Saiku server {}{}{}", localPropertiesService.getSaikuFolder() , File.separator , STOP_SAIKU); //$NON-NLS-1$ - if (isSaikuStarted()) { - runSaikuBat(STOP_SAIKU); - this.setSaikuStarted(true); - } - logger.warn("Finished stoping the Saiku server"); //$NON-NLS-1$ - } - - private void stopSaikuOnExit() { - Runtime.getRuntime().addShutdownHook(new Thread("Shutting down Saiku on exit hook") { - @Override - public void run() { - try { - if (isSaikuStarted()) { - stopSaiku(); - } - } catch (final SaikuExecutionException e) { - logger.error("The Saiku server has been de-configured after it was started", e); //$NON-NLS-1$ + for( int i = MAXIMUM_NUMBER_OF_BACKUPS; i< files.length ; i++ ){ + if( !files[i].delete() ) { + logger.error( "Error deleteting file", files[i].getAbsolutePath() ); } } - }); - } - - private boolean isSaikuStarted() { - return saikuStarted; - } - - private void setSaikuStarted(boolean saikuStarted) { - this.saikuStarted = saikuStarted; - } - - @Override - public void destroy() throws Exception { - try { - stopSaiku(); - } catch (SaikuExecutionException e) { - logger.error("Error while trying to quite Saiku before destroying the bean", e); //$NON-NLS-1$ } - } - @Override - public LocalPropertiesService getLocalPropertiesService() { - return localPropertiesService; } - @Override - public EarthSurveyService getEarthSurveyService() { - return earthSurveyService; - } - @Override - public RDBExporter getRdbExporter() { - return rdbExporter; + /** + * Returns the folder where the backup copies should be placed. + * @return The OS dependent folder where the application should saved the backed up copies. + */ + public File getAutomaticBackUpFolder() { + return FolderFinder.createFolderInAppData( BACKUP_COLLECT_EARTH); } -} \ No newline at end of file +} From cbd97e8b367d58fa56fc7fa7a54c8b24b9aebed2 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:51 +0100 Subject: [PATCH 1024/1620] New translations SaveEarthDataServlet.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 169 ++++++------------ 1 file changed, 57 insertions(+), 112 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 8c14343c96..b23ed83438 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,142 +1,87 @@ -package org.openforis.collect.earth.app.service; +package org.openforis.collect.earth.app.server; -import java.io.File; import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.Arrays; -import java.util.Date; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; -import org.apache.commons.dbcp.BasicDataSource; -import org.openforis.collect.earth.app.CollectEarthUtils; import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.InitializingBean; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.view.Messages; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; - -import net.lingala.zip4j.ZipFile; - +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; /** - * Spring managed bean that handles the creation of backups of the Collect database. - * The SQLite database file will be saved everytime the application closes. - * A maximum of 10 copies (the last ten times the application was used) will be saved on the backupCollectEarth folder on the users application data folder (OS dependant). + * Servlet called for updating/saving the information about a placemark. Called from the form in Google Earth when the user interacts with it or clicks the save button. * @author Alfonso Sanchez-Paus Diaz * + * @deprecated Replaced by {@link PlacemarkDataController} + * */ -@Component -@Lazy(false) -public class BackupSqlLiteService implements InitializingBean{ - - private static final String BACKUP_COLLECT_EARTH = "backupSqlite"; //$NON-NLS-1$ - - private static final int MAXIMUM_NUMBER_OF_BACKUPS = 10; +@Deprecated +@Controller +public class SaveEarthDataServlet extends JsonPocessorServlet { @Autowired - BasicDataSource dataSource; + LocalPropertiesService localPropertiesService; - @Autowired - private LocalPropertiesService localPropertiesService; + //@Autowired + //CollectDesignerController collectDesignerController; - private Logger logger = LoggerFactory.getLogger( BackupSqlLiteService.class ); - @Override - public void afterPropertiesSet() throws Exception { - attachShutDownHook(); - } + @Deprecated + @GetMapping("/saveData") + public void saveData(HttpServletRequest request, HttpServletResponse response) throws IOException { - private void attachShutDownHook() { - Runtime.getRuntime().addShutdownHook(new Thread("Shutdown hook - Backup Database") { - @Override - public void run() { - if ( "true".equals(localPropertiesService.getValue(EarthProperty.AUTOMATIC_BACKUP) ) ) { //$NON-NLS-1$ - automaticDBBackup(); - } - } + Map collectedData = extractRequestData(request); - }); - } - - private void automaticDBBackup() { - if( localPropertiesService.isUsingSqliteDB() ){ - - String pathToBackupZip = ""; //$NON-NLS-1$ - - String nameCollectDB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB; - File originalDBFile = new File(nameCollectDB); + replaceTestVariables(collectedData); - try { - - pathToBackupZip = getBackupZipFilename(); - - try( ZipFile zipFile = CollectEarthUtils.addFileToZip(pathToBackupZip, originalDBFile, EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME) ){ - removeExtraBackups(); - } - - } catch (IOException e) { - logger.error("Error when create backup of the Collect Earth Database from " + nameCollectDB + " to " + pathToBackupZip, e); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (Exception e) { - logger.error("Error when zipping the Collect Earth Database from " + nameCollectDB + " to " + pathToBackupZip, e); //$NON-NLS-1$ //$NON-NLS-2$ + if (collectedData.size() == 0) { + setResult(false, Messages.getString("SaveEarthDataServlet.0"), collectedData); //$NON-NLS-1$ + getLogger().info("The request was empty"); //$NON-NLS-1$ + } else { + if (getDataAccessor().saveData(collectedData)) { + setResult(true, Messages.getString("SaveEarthDataServlet.2"), collectedData); //$NON-NLS-1$ + } else { + setResult(false, Messages.getString("SaveEarthDataServlet.1"), collectedData); //$NON-NLS-1$ + getLogger().error("The data could not be saved"); //$NON-NLS-1$ } } - } - private String getBackupZipFilename() throws IOException { - File backupFolder = getAutomaticBackUpFolder(); - return getDBCopyName(backupFolder); + setJsonResponse(response, collectedData); } - public String getDBCopyName(File backupFolder) throws IOException { - String pathToBackup; - SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HHmmss"); //$NON-NLS-1$ - StringBuilder destPathStr = new StringBuilder(); - destPathStr.append(backupFolder.getCanonicalPath()); - destPathStr.append(File.separatorChar); - destPathStr.append( EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME); - destPathStr.append(sdf.format( new Date() )).append( ".zip"); - pathToBackup = destPathStr.toString(); - return pathToBackup; - } - - private void removeExtraBackups() { - - File backupFolder = getAutomaticBackUpFolder(); - - File[] files = backupFolder.listFiles(); - if( files!=null && files.length > MAXIMUM_NUMBER_OF_BACKUPS ){ - - Arrays.sort(files, (o1,o2) -> { - if( o1.lastModified() < o2.lastModified() ){ - return 1; - }else if( o1.lastModified() == o2.lastModified() ){ - return 0; - }else{ - return -1; - } - - } - ); - - for( int i = MAXIMUM_NUMBER_OF_BACKUPS; i< files.length ; i++ ){ - if( !files[i].delete() ) { - logger.error( "Error deleteting file", files[i].getAbsolutePath() ); - } - } + /** + * This method replaces the variable values that the form contains when it is not run + * through Google Earth and the variable replacement of the ExtendedData of the KML does not kick in. + * + * @param collectedData + * The data POSTed by the form that has already been processed. + */ + private void replaceTestVariables(Map collectedData) { + // REMOVE THIS!!!! + if (collectedData.get(EarthConstants.PLACEMARK_ID_PARAMETER).equals("$[id]")) { //$NON-NLS-1$ //$NON-NLS-2$ + collectedData.put(EarthConstants.PLACEMARK_ID_PARAMETER, "testPlacemark"); //$NON-NLS-1$ //$NON-NLS-2$ + } + if (collectedData.get("collect_integer_elevation") != null && collectedData.get("collect_integer_elevation").equals("$[elevation]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + collectedData.put("collect_integer_elevation", "0"); //$NON-NLS-1$ //$NON-NLS-2$ } - } + if (collectedData.get("collect_real_slope") != null && collectedData.get("collect_real_slope").equals("$[slope]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + collectedData.put("collect_real_slope", "0"); //$NON-NLS-1$ //$NON-NLS-2$ + } + if (collectedData.get("collect_real_aspect") != null && collectedData.get("collect_real_aspect").equals("$[aspect]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + collectedData.put("collect_real_aspect", "0"); //$NON-NLS-1$ //$NON-NLS-2$ + } - /** - * Returns the folder where the backup copies should be placed. - * @return The OS dependent folder where the application should saved the backed up copies. - */ - public File getAutomaticBackUpFolder() { - return FolderFinder.createFolderInAppData( BACKUP_COLLECT_EARTH); + if (collectedData.get("collect_coord_location").equals("$[latitude],$[longitude]")) { //$NON-NLS-1$ //$NON-NLS-2$ + collectedData.put("collect_coord_location", "0,0"); //$NON-NLS-1$ //$NON-NLS-2$ + } } -} +} \ No newline at end of file From 7a9162661b74865228772723ee9bf8c539bd7d01 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:52 +0100 Subject: [PATCH 1025/1620] New translations BackupSqlLiteService.java (English) --- .../earth/app/view/Messages_en.properties | 755 ++---------------- 1 file changed, 83 insertions(+), 672 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index cba7f5812d..8c14343c96 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,731 +1,142 @@ package org.openforis.collect.earth.app.service; -import java.io.BufferedReader; import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.IOException; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.SystemUtils; -import org.apache.commons.text.StringEscapeUtils; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Date; + +import org.apache.commons.dbcp.BasicDataSource; +import org.openforis.collect.earth.app.CollectEarthUtils; import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; -import org.openforis.collect.earth.app.ad_hoc.AluToolUtils; -import org.openforis.collect.earth.app.desktop.ServerController; -import org.openforis.collect.earth.app.model.AspectCode; -import org.openforis.collect.earth.app.model.DynamicsCode; -import org.openforis.collect.earth.app.model.SlopeCode; import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; -import org.openforis.collect.model.CollectSurvey; -import org.openforis.collect.relational.CollectRDBPublisher; -import org.openforis.collect.relational.CollectRdbException; -import org.openforis.concurrency.Progress; -import org.openforis.idm.metamodel.NodeDefinition; -import org.openqa.selenium.remote.RemoteWebDriver; -import org.springframework.beans.factory.DisposableBean; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.RowMapper; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; -import com.opencsv.CSVReader; +import net.lingala.zip4j.ZipFile; -import freemarker.template.TemplateException; +/** + * Spring managed bean that handles the creation of backups of the Collect database. + * The SQLite database file will be saved everytime the application closes. + * A maximum of 10 copies (the last ten times the application was used) will be saved on the backupCollectEarth folder on the users application data folder (OS dependant). + * @author Alfonso Sanchez-Paus Diaz + * + */ @Component -public class AnalysisSaikuService extends GenerateDatabase implements DisposableBean{ - - private static final String PLOT_ADD = "plot ADD "; - - private static final String UPDATE = "UPDATE "; - - private static final String UNKNOWN = "Unknown"; - - private static final String VARCHAR_5 = " VARCHAR(5)"; - - private static final String INTEGER = " INTEGER"; - - private static final String ALTER_TABLE = "ALTER TABLE "; - - private static final String INSERT_INTO = "INSERT INTO "; - - private static final String CREATE_TABLE = "CREATE TABLE "; - - private static final String ALU_CLIMATE_ZONE_CODE = "alu_climate_zone_code"; //$NON-NLS-1$ - - private static final String ALU_SOIL_TYPE_CODE = "alu_soil_type_code"; //$NON-NLS-1$ +@Lazy(false) +public class BackupSqlLiteService implements InitializingBean{ - private static final String ALU_SUBCLASS_CODE = "alu_subclass_code"; //$NON-NLS-1$ - - private static final String DYNAMICS_ID = "dynamics_id"; //$NON-NLS-1$ - - private static final String ELEVATION_ID = "elevation_id"; //$NON-NLS-1$ - - private static final String SLOPE_ID = "slope_id"; //$NON-NLS-1$ - - private static final String ASPECT_ID = "aspect_id"; //$NON-NLS-1$ - - private static final String START_SAIKU = "start-saiku"; //$NON-NLS-1$ - - private static final String STOP_SAIKU = "stop-saiku"; //$NON-NLS-1$ - - private static final String COMMAND_SUFFIX_BAT = ".bat"; //$NON-NLS-1$ - - private static final String COMMAND_SUFFIX_SH = ".sh"; //$NON-NLS-1$ - - public static final String COLLECT_EARTH_DATABASE_RDB_DB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB - + EarthConstants.SAIKU_RDB_SUFFIX; + private static final String BACKUP_COLLECT_EARTH = "backupSqlite"; //$NON-NLS-1$ + private static final int MAXIMUM_NUMBER_OF_BACKUPS = 10; @Autowired - RDBExporter rdbExporter; + BasicDataSource dataSource; @Autowired - CollectRDBPublisher collectRDBPublisher; - - @Autowired - EarthSurveyService earthSurveyService; - - @Autowired - public LocalPropertiesService localPropertiesService; - - @Autowired - BrowserService browserService; - - @Autowired - private RegionCalculationUtils regionCalculation; - - @Autowired - private SchemaService schemaNamingService; - - private static final int ELEVATION_RANGE = 100; - - private RemoteWebDriver saikuWebDriver; - - private static final String SQLITE_FREEMARKER_HTML_TEMPLATE = "resources" + File.separator //$NON-NLS-1$ - + "collectEarthSqliteDS.fmt"; //$NON-NLS-1$ - private static final String POSTGRESQL_FREEMARKER_HTML_TEMPLATE = "resources" + File.separator //$NON-NLS-1$ - + "collectEarthPostgreSqlDS.fmt"; //$NON-NLS-1$ - public static final String MDX_XML = "collectEarthCubes.xml"; //$NON-NLS-1$ - private static final String MDX_TEMPLATE = MDX_XML + ".fmt"; //$NON-NLS-1$ - - private boolean saikuStarted; - - private void assignDimensionValues() { - try { - final String schemaName = getSchemaPrefix(); - // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id - final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query( - "SELECT " + EarthConstants.PLOT_ID + ", elevation, slope, aspect FROM " + schemaName + "plot", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - new RowMapper() { - @Override - public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { - - final Object[] updateValues = new Object[4]; - - Integer aspect = AspectCode.NA.getId(); - if (AspectCode.getAspectCode(rs.getDouble("aspect")) != null) { //$NON-NLS-1$ - aspect = AspectCode.getAspectCode(rs.getDouble("aspect")).getId(); //$NON-NLS-1$ - } - - Integer slope = SlopeCode.NA.getId(); - - if (SlopeCode.getSlopeCode((int) rs.getFloat("slope")) != null) { //$NON-NLS-1$ - slope = SlopeCode.getSlopeCode((int) rs.getFloat("slope")).getId(); //$NON-NLS-1$ - } - - updateValues[0] = aspect; - updateValues[1] = slope; - updateValues[2] = ( (int) rs.getFloat("elevation") / ELEVATION_RANGE) + 1; // 0 //$NON-NLS-1$ - - updateValues[3] = rs.getLong(EarthConstants.PLOT_ID); - return updateValues; - } - - }); - - rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + ASPECT_ID + "=?," + SLOPE_ID + "=?," //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - + ELEVATION_ID + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (Exception e) { - logger.warn("No DEM information", e); //$NON-NLS-1$ - } - } - - private String getSchemaPrefix() { - return schemaNamingService.getSchemaPrefix(ExportType.SAIKU); - } - - private void assignPngAluToolDimensionValues() { - try { - if (earthSurveyService.getCollectSurvey().getName().toLowerCase().contains("png")) { //$NON-NLS-1$ - final String schemaName = getSchemaPrefix(); - // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id - final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query("SELECT " + EarthConstants.PLOT_ID //$NON-NLS-1$ - + ", elevation, soil_fundamental, land_use_subcategory, precipitation_ranges FROM " + schemaName //$NON-NLS-1$ - + "plot LEFT JOIN " + schemaName + "precipitation_ranges_code where " //$NON-NLS-1$ //$NON-NLS-2$ - + "plot.annual_precipitation_code_id=precipitation_ranges_code.precipitation_ranges_code_id", //$NON-NLS-1$ - new RowMapper() { - @Override - public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { - - final Object[] updateValues = new Object[3]; - - try { - AluToolUtils aluToolUtils = new AluToolUtils(); - - Integer elevation = rs.getInt("elevation"); //$NON-NLS-1$ - String soilFundamental = rs.getString("soil_fundamental"); //$NON-NLS-1$ - String precipitationRange = rs.getString("precipitation_ranges"); //$NON-NLS-1$ - - int precipitation = -1; - String climateZone = UNKNOWN; //$NON-NLS-1$ - if (precipitationRange != null) { - precipitation = aluToolUtils.getPrecipitationFromRange(precipitationRange); - boolean shortDrySeason = true; // According to information from Abe PNG has less - // than 5 months of dry season - climateZone = aluToolUtils.getClimateZone(elevation, precipitation, - shortDrySeason); - } - - String soilType = UNKNOWN; //$NON-NLS-1$ - if (soilFundamental != null) { - soilType = aluToolUtils.getSoilType(soilFundamental); - } - - updateValues[0] = climateZone; - updateValues[1] = soilType; - updateValues[2] = rs.getLong(EarthConstants.PLOT_ID); - } catch (Exception e) { - logger.error("Error while processing the data", e); //$NON-NLS-1$ - updateValues[0] = UNKNOWN; //$NON-NLS-1$ - updateValues[1] = UNKNOWN; //$NON-NLS-1$ - updateValues[2] = UNKNOWN; //$NON-NLS-1$ - } - return updateValues; - } - - }); - - rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + ALU_CLIMATE_ZONE_CODE + "=?," //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + ALU_SOIL_TYPE_CODE + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ //$NON-NLS-2$ - } - } catch (Exception e) { - logger.error("No PNG ALU information", e); //$NON-NLS-1$ - } - } - - private void assignLUCDimensionValues() { - try { - final String schemaName = getSchemaPrefix(); - // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id - final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query( - "SELECT " + EarthConstants.PLOT_ID + ", land_use_subcategory FROM " + schemaName + "plot", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - new RowMapper() { - @Override - public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { - - AluToolUtils aluToolUtils = new AluToolUtils(); - final Object[] updateValues = new Object[3]; - - String collectEarthSubcategory = rs.getString("land_use_subcategory"); //$NON-NLS-1$ - Integer dynamics = DynamicsCode.getDynamicsCode(collectEarthSubcategory); - String subClass = UNKNOWN; //$NON-NLS-1$ - if (collectEarthSubcategory != null) { - subClass = aluToolUtils.getAluSubclass(collectEarthSubcategory); - } - - updateValues[0] = dynamics; - updateValues[1] = subClass; - updateValues[2] = rs.getLong(EarthConstants.PLOT_ID); - return updateValues; - } - - }); - - rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + DYNAMICS_ID + "=?," + ALU_SUBCLASS_CODE //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ - } catch (Exception e) { - logger.warn("No PNG Alu information available", e); //$NON-NLS-1$ - } - } + private LocalPropertiesService localPropertiesService; - private void createAspectAuxTable() { - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "aspect_category (" + ASPECT_ID //$NON-NLS-1$ //$NON-NLS-2$ - + " INTEGER PRIMARY KEY, aspect_caption TEXT);"); //$NON-NLS-1$ - final AspectCode[] aspects = AspectCode.values(); - for (final AspectCode aspectCode : aspects) { - rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "aspect_category values (" + aspectCode.getId() + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + aspectCode.getLabel() + "')"); //$NON-NLS-1$ - } - } - - private void createElevationtAuxTable() { - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "elevation_category ( " + ELEVATION_ID //$NON-NLS-1$ //$NON-NLS-2$ - + " INTEGER PRIMARY KEY, elevation_caption TEXT);"); //$NON-NLS-1$ - final int slots = 9000 / ELEVATION_RANGE; // Highest mountain in the world, mount everest is - // 8820m high - for (int i = 1; i <= slots; i++) { - rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "elevation_category values (" + i + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + ((i - 1) * ELEVATION_RANGE) + "-" + i //$NON-NLS-1$ - * ELEVATION_RANGE - + "')"); //$NON-NLS-1$ - } - - } - - private void createDynamicsAuxTable() { - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "dynamics_category (" + DYNAMICS_ID //$NON-NLS-1$ //$NON-NLS-2$ - + " INTEGER PRIMARY KEY, dynamics_caption TEXT);"); //$NON-NLS-1$ - final DynamicsCode[] dynamicsCodes = DynamicsCode.values(); - for (final DynamicsCode dynamicsCode : dynamicsCodes) { - rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "dynamics_category values (" + dynamicsCode.getId() //$NON-NLS-1$ //$NON-NLS-2$ - + ", '" + dynamicsCode.getLabel() + "')"); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - - private void createPlotForeignKeys() { - // Add aspect_id column to plot - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ASPECT_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + SLOPE_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ELEVATION_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + DYNAMICS_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } + private Logger logger = LoggerFactory.getLogger( BackupSqlLiteService.class ); - private void createPngAluVariables() { - if (earthSurveyService.getCollectSurvey().getName().toLowerCase().contains("png")) { //$NON-NLS-1$ - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_SOIL_TYPE_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_CLIMATE_ZONE_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - } - - private void creatAluSubclassVariables() { - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_SUBCLASS_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - - private void createSlopeAuxTable() { - final String schemaName = getSchemaPrefix(); - // Slope can be from 0 to 90 - rdbExporter.getJdbcTemplate().execute( - CREATE_TABLE + schemaName + "slope_category (slope_id INTEGER PRIMARY KEY, slope_caption TEXT);"); //$NON-NLS-1$ //$NON-NLS-2$ - final SlopeCode[] slopeCodes = SlopeCode.values(); - for (final SlopeCode slopeCode : slopeCodes) { - rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "slope_category values (" + slopeCode.getId() + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + slopeCode.getLabel() + "')"); //$NON-NLS-1$ - } - } - - private String getSaikuConfigurationFilePath() { - - String configFile = localPropertiesService.getSaikuFolder() + "/" //$NON-NLS-1$ - + "tomcat/webapps/saiku/WEB-INF/classes/saiku-datasources/collectEarthDS"; //$NON-NLS-1$ - configFile = configFile.replace('/', File.separatorChar); - return configFile; - } - - private String getSaikuThreeConfigurationFilePath() { - - String configFile = localPropertiesService.getSaikuFolder() + "/" //$NON-NLS-1$ - + "tomcat/webapps/saiku/WEB-INF/classes/legacy-datasources/collectEarthDS"; //$NON-NLS-1$ - configFile = configFile.replace('/', File.separatorChar); - return configFile; - } - - private boolean isSaikuConfigured() { - return localPropertiesService.getSaikuFolder() != null - && isSaikuFolder(new File(localPropertiesService.getSaikuFolder())); + @Override + public void afterPropertiesSet() throws Exception { + attachShutDownHook(); } - /* - * private boolean isJavaHomeConfigured() { - * - * if (SystemUtils.IS_OS_MAC){ return true; } return ! ( StringUtils.isBlank( - * System.getenv("JAVA_HOME") ) //$NON-NLS-1$ && StringUtils.isBlank( - * System.getenv("JRE_HOME") ) //$NON-NLS-1$ && StringUtils.isBlank( - * System.getenv("COLLECT_EARTH_JRE_HOME") ) //$NON-NLS-1$ ); } - */ - - public boolean isSaikuFolder(File saikuFolder) { - boolean isSaikuFolder = false; - if (saikuFolder.listFiles() != null) { - for (final File file : saikuFolder.listFiles()) { - if (file.getName().equals(START_SAIKU + getCommandSuffix())) { - isSaikuFolder = true; + private void attachShutDownHook() { + Runtime.getRuntime().addShutdownHook(new Thread("Shutdown hook - Backup Database") { + @Override + public void run() { + if ( "true".equals(localPropertiesService.getValue(EarthProperty.AUTOMATIC_BACKUP) ) ) { //$NON-NLS-1$ + automaticDBBackup(); } } - } - return isSaikuFolder; - } - private void openSaiku() throws BrowserNotFoundException { - saikuWebDriver = browserService.navigateTo("http://127.0.0.1:8181", saikuWebDriver, false); //$NON-NLS-1$ - if (browserService.waitFor("username", saikuWebDriver)) { //$NON-NLS-1$ - saikuWebDriver.findElementByName("username").sendKeys("admin"); //$NON-NLS-1$ //$NON-NLS-2$ - saikuWebDriver.findElementByName("password").sendKeys("admin"); //$NON-NLS-1$ //$NON-NLS-2$ - saikuWebDriver.findElementByClassName("form_button").click(); //$NON-NLS-1$ - } + }); } + private void automaticDBBackup() { + if( localPropertiesService.isUsingSqliteDB() ){ - public void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws SaikuExecutionException { + String pathToBackupZip = ""; //$NON-NLS-1$ - try { - - stopSaiku(); + String nameCollectDB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB; + File originalDBFile = new File(nameCollectDB); try { - if ((localPropertiesService.isUsingSqliteDB() && !getZippedProjectDB( ExportType.SAIKU ).exists()) - || isRefreshDatabase()) { - - // The user clicked on the option to refresh the database, or there is no - // previous copy of the Saiku DB - // Generate the DB file - rdbExporter.exportDataToRDB( - earthSurveyService.getCollectSurvey(), - ExportType.SAIKU, - progressListener, - this::processQuantityData - ); - - try { - // Save the DB file in a zipped file to extends GenerateDatabase keep for the next usages - replaceZippedProjectDB( ExportType.SAIKU ); - } catch (Exception e) { - logger.error("Error while refreshing the Zipped content of the project Saiku DB", e); - } + pathToBackupZip = getBackupZipFilename(); - } else if (getZippedProjectDB(ExportType.SAIKU).exists() && localPropertiesService.isUsingSqliteDB()) { - // If the zipped version of the project exists ( and the user clicked on the - // option to not refresh it) then restore this last version of the data - restoreZippedProjectDB(ExportType.SAIKU); + try( ZipFile zipFile = CollectEarthUtils.addFileToZip(pathToBackupZip, originalDBFile, EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME) ){ + removeExtraBackups(); } - refreshDataSourceForSaiku(); - - if (startSaikuAfterDBExport && !isUserCancelledOperation()) { - startSaiku(); - new Thread("Opening Saiku") { - @Override - public void run() { - try { - AnalysisSaikuService.this.openSaiku(); - } catch (BrowserNotFoundException e) { - logger.error("No browser has been set up", e); //$NON-NLS-1$ - } - }; - }.start(); - - stopSaikuOnExit(); - } - } catch (final IOException e) { - logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ - } catch (TemplateException e1) { - logger.error("Error while applying the freemarker template tothe Saiku data source", e1); //$NON-NLS-1$ + } catch (IOException e) { + logger.error("Error when create backup of the Collect Earth Database from " + nameCollectDB + " to " + pathToBackupZip, e); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (Exception e) { + logger.error("Error when zipping the Collect Earth Database from " + nameCollectDB + " to " + pathToBackupZip, e); //$NON-NLS-1$ //$NON-NLS-2$ } - - } catch (final CollectRdbException e) { - logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ } } - private void processQuantityData(InfiniteProgressMonitor progressListener) { - - SwingUtilities.invokeLater( () -> progressListener.setMessage("Preparing Saiku data for analysis") ); - - progressListener.progressMade(new Progress(0, 100)); - createPngAluVariables(); - createPlotForeignKeys(); - - progressListener.progressMade(new Progress(25, 100)); - - if (!surveyContains("calculated_elevation_range", earthSurveyService.getCollectSurvey())) { - createAspectAuxTable(); - createSlopeAuxTable(); - createElevationtAuxTable(); - assignDimensionValues(); - - } - progressListener.progressMade(new Progress(50, 100)); - - if (!surveyContains("calculated_initial_land_use", earthSurveyService.getCollectSurvey())) { - createDynamicsAuxTable(); - creatAluSubclassVariables(); - assignLUCDimensionValues(); - - } - progressListener.progressMade(new Progress(75, 100)); - - assignPngAluToolDimensionValues(); - - SwingUtilities.invokeLater( () -> progressListener.setMessage("Calculating expansion factors") ); - - regionCalculation.handleRegionCalculation( ExportType.SAIKU, rdbExporter.getJdbcTemplate() ); - progressListener.progressMade(new Progress(100, 100)); - + private String getBackupZipFilename() throws IOException { + File backupFolder = getAutomaticBackUpFolder(); + return getDBCopyName(backupFolder); } - public static boolean surveyContains(String nodeName, CollectSurvey survey) { - NodeDefinition nodeDefForNAme = survey.getSchema().findNodeDefinition( nodeDef -> nodeDef.getName().equals(nodeName) ); - return nodeDefForNAme != null; + public String getDBCopyName(File backupFolder) throws IOException { + String pathToBackup; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HHmmss"); //$NON-NLS-1$ + StringBuilder destPathStr = new StringBuilder(); + destPathStr.append(backupFolder.getCanonicalPath()); + destPathStr.append(File.separatorChar); + destPathStr.append( EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME); + destPathStr.append(sdf.format( new Date() )).append( ".zip"); + pathToBackup = destPathStr.toString(); + return pathToBackup; } - public static CSVReader getCsvReader(String csvFile) throws FileNotFoundException { - final BufferedReader bufferedReader = new BufferedReader( - new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 ) ); //$NON-NLS-1$ - return new CSVReader(bufferedReader); - } + private void removeExtraBackups() { - private void refreshDataSourceForSaiku() throws IOException, TemplateException { - final File mdxFile = new File(localPropertiesService.getProjectFolder() + File.separatorChar + MDX_XML); + File backupFolder = getAutomaticBackUpFolder(); - Map data = new HashMap<>(); - data.put("cubeFilePath", StringEscapeUtils.escapeJava(mdxFile.getAbsolutePath().replace('\\', '/'))); //$NON-NLS-1$ + File[] files = backupFolder.listFiles(); + if( files!=null && files.length > MAXIMUM_NUMBER_OF_BACKUPS ){ - final File mdxTemplate = getMdxTemplate(); - final File dataSourceTemplate = getDataSourceTemplate(data); - - // First try Saiku 2.5/2.6 - File dataSourceFile; - try { - dataSourceFile = new File(getSaikuConfigurationFilePath()); - FreemarkerTemplateUtils.applyTemplate(dataSourceTemplate, dataSourceFile, data); - } catch (Exception e) { - logger.error("Error starting Saiku", e); - dataSourceFile = new File(getSaikuThreeConfigurationFilePath()); - FreemarkerTemplateUtils.applyTemplate(dataSourceTemplate, dataSourceFile, data); - } - - setMdxSaikuSchema(mdxTemplate, mdxFile); - } - - private File getMdxTemplate() throws IOException { - final File mdxFileTemplate = new File( - localPropertiesService.getProjectFolder() + File.separatorChar + MDX_TEMPLATE); - if (!mdxFileTemplate.exists()) { - throw new IOException( - "The file containing the MDX Cube definition Template does not exist in expected location " //$NON-NLS-1$ - + mdxFileTemplate.getAbsolutePath()); - } - return mdxFileTemplate; - } - - private File getDataSourceTemplate(Map data) throws IOException { - File dataSourceTemplate = null; - - if (localPropertiesService.isUsingSqliteDB()) { - dataSourceTemplate = new File(SQLITE_FREEMARKER_HTML_TEMPLATE); - final File rdbDb = rdbExporter.getRdbFile( ExportType.SAIKU ); - if (!rdbDb.exists()) { - throw new IOException( - "The file contianing the Relational SQLite Database does not exist in expected location " //$NON-NLS-1$ - + rdbDb.getAbsolutePath()); - } - data.put("rdbFilePath", StringEscapeUtils.escapeJava(rdbDb.getAbsolutePath().replace('\\', '/'))); //$NON-NLS-1$ - } else { - dataSourceTemplate = new File(POSTGRESQL_FREEMARKER_HTML_TEMPLATE); - CollectDBDriver collectDBDriver = localPropertiesService.getCollectDBDriver(); - data.put("dbUrl", StringEscapeUtils.escapeJava(ServerController.getSaikuDbURL(collectDBDriver))); //$NON-NLS-1$ - data.put("username", //$NON-NLS-1$ - StringEscapeUtils.escapeJava(localPropertiesService.getValue(EarthProperty.DB_USERNAME))); - data.put("password", //$NON-NLS-1$ - StringEscapeUtils.escapeJava(localPropertiesService.getValue(EarthProperty.DB_PASSWORD))); - } - - if (!dataSourceTemplate.exists()) { - throw new IOException( - "The file containing the Saiku Data Source template does not exist in expected location " //$NON-NLS-1$ - + dataSourceTemplate.getAbsolutePath()); - } - - return dataSourceTemplate; - } - - private void setMdxSaikuSchema(final File mdxFileTemplate, final File mdxFile) - throws IOException, TemplateException { - Map saikuData = new HashMap<>(); - String saikuSchemaName = getSchemaName(); - if (saikuSchemaName == null) { - saikuSchemaName = ""; //$NON-NLS-1$ - } - saikuData.put("saikuDbSchema", saikuSchemaName); //$NON-NLS-1$ - FreemarkerTemplateUtils.applyTemplate(mdxFileTemplate, mdxFile, saikuData); - } - - private void runSaikuBat(String commandName) throws SaikuExecutionException { - if (!isSaikuConfigured()) { - throw new SaikuExecutionException("The Saiku server is not configured."); //$NON-NLS-1$ - } - - else { - String saikuCmd = localPropertiesService.getSaikuFolder() + File.separator + commandName - + getCommandSuffix(); - - if (SystemUtils.IS_OS_WINDOWS) { - saikuCmd = "\"" + saikuCmd + "\""; //$NON-NLS-1$ //$NON-NLS-2$ - } - - try { - - Process runSaiku = runProcessBuilder(new String[] { saikuCmd }); - - if (commandName.equals(STOP_SAIKU)) { - int result = runSaiku.waitFor(); - logger.warn("Script ended with result {}", result); //$NON-NLS-1$ - } else if (commandName.equals(START_SAIKU)) { - Thread.sleep(6000); - } - - } catch (final IOException e) { - logger.error("Error when running Saiku start/stop command", e); //$NON-NLS-1$ - } catch (InterruptedException e) { - logger.error("Error while waiting to start", e); //$NON-NLS-1$ - Thread.currentThread().interrupt(); - } - } - } - - private void setMacJreHome(ProcessBuilder p) { - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX || SystemUtils.IS_OS_LINUX) { - - File javaFolder = new File("./java"); + Arrays.sort(files, (o1,o2) -> { + if( o1.lastModified() < o2.lastModified() ){ + return 1; + }else if( o1.lastModified() == o2.lastModified() ){ + return 0; + }else{ + return -1; + } - if (!javaFolder.exists()) { - String userName = System.getProperty("user.name"); - String testWithPath = "/Users/" + userName + "/OpenForis/CollectEarth/java"; - File testJavaPath = new File(testWithPath); - if (testJavaPath.exists()) { - javaFolder = testJavaPath; } - } - - Map environment = p.environment(); - environment.put("COLLECT_EARTH_JRE_HOME", javaFolder.getAbsolutePath()); - - /* - * // In MAC the environment variable COLLECT_EARTH_JRE_HOME is not accesible - * from outside the bash, set it again! if( SystemUtils.IS_OS_MAC || - * SystemUtils.IS_OS_MAC_OSX){ try { File javaFolder = new File("./java"); - * - * if( !javaFolder.exists() ){ String userName = - * System.getProperty("user.name"); String testWithPath = "/Users/"+userName + - * "/OpenForis/CollectEarth/java"; File testJavaPath = new File(testWithPath); - * if( testJavaPath.exists()){ javaFolder = testJavaPath; } } - * - * Process setEnv = runProcessBuilder(new String[] { "/bin/bash", "setenv", - * "COLLECT_EARTH_JRE_HOME=\""+ javaFolder.getAbsolutePath() +"\"" }); - * setEnv.waitFor(); } catch (final IOException e) { - * logger.error("Error setting the COLLECT_EARTH_JRE_HOME environment variable", - * e); //$NON-NLS-1$ } catch (InterruptedException e) { - * logger.error("Error when running COLLECT_EARTH_JRE_HOME environment variable" - * , e); //$NON-NLS-1$ } } - */ - } - } - - private Process runProcessBuilder(String[] cmd) throws IOException { - final ProcessBuilder builder = new ProcessBuilder(cmd); - - // Fixes bug with Mac OS X not using the environemnt variable set for bash - setMacJreHome(builder); - - builder.directory(new File(localPropertiesService.getSaikuFolder()).getAbsoluteFile()); - builder.redirectErrorStream(true); - Process p = builder.start(); - (new ProcessLoggerThread(p.getInputStream(), Boolean.FALSE)).start(); - (new ProcessLoggerThread(p.getErrorStream(), Boolean.TRUE)).start(); - return p; - } - - private String getCommandSuffix() { - if (SystemUtils.IS_OS_WINDOWS) { - return COMMAND_SUFFIX_BAT; - } else { - return COMMAND_SUFFIX_SH; - } - } - - private void startSaiku() throws SaikuExecutionException { - logger.warn( - "Starting the Saiku server {}{}{}", localPropertiesService.getSaikuFolder(), File.separator, START_SAIKU); //$NON-NLS-1$ - - runSaikuBat(START_SAIKU); - - this.setSaikuStarted(true); - - logger.warn("Finished starting the Saiku server"); //$NON-NLS-1$ - } + ); - void stopSaiku() throws SaikuExecutionException { - logger.warn("Stoping the Saiku server {}{}{}", localPropertiesService.getSaikuFolder() , File.separator , STOP_SAIKU); //$NON-NLS-1$ - if (isSaikuStarted()) { - runSaikuBat(STOP_SAIKU); - this.setSaikuStarted(true); - } - logger.warn("Finished stoping the Saiku server"); //$NON-NLS-1$ - } - - private void stopSaikuOnExit() { - Runtime.getRuntime().addShutdownHook(new Thread("Shutting down Saiku on exit hook") { - @Override - public void run() { - try { - if (isSaikuStarted()) { - stopSaiku(); - } - } catch (final SaikuExecutionException e) { - logger.error("The Saiku server has been de-configured after it was started", e); //$NON-NLS-1$ + for( int i = MAXIMUM_NUMBER_OF_BACKUPS; i< files.length ; i++ ){ + if( !files[i].delete() ) { + logger.error( "Error deleteting file", files[i].getAbsolutePath() ); } } - }); - } - - private boolean isSaikuStarted() { - return saikuStarted; - } - - private void setSaikuStarted(boolean saikuStarted) { - this.saikuStarted = saikuStarted; - } - - @Override - public void destroy() throws Exception { - try { - stopSaiku(); - } catch (SaikuExecutionException e) { - logger.error("Error while trying to quite Saiku before destroying the bean", e); //$NON-NLS-1$ } - } - @Override - public LocalPropertiesService getLocalPropertiesService() { - return localPropertiesService; } - @Override - public EarthSurveyService getEarthSurveyService() { - return earthSurveyService; - } - @Override - public RDBExporter getRdbExporter() { - return rdbExporter; + /** + * Returns the folder where the backup copies should be placed. + * @return The OS dependent folder where the application should saved the backed up copies. + */ + public File getAutomaticBackUpFolder() { + return FolderFinder.createFolderInAppData( BACKUP_COLLECT_EARTH); } -} \ No newline at end of file +} From 180c384bbc4b665784e83b12e796196118978726 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:54 +0100 Subject: [PATCH 1026/1620] New translations BrowserNotFoundException.java (French) --- .../earth/app/view/Messages_fr.properties | 142 ++---------------- 1 file changed, 14 insertions(+), 128 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 8c14343c96..6570688ad6 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,142 +1,28 @@ package org.openforis.collect.earth.app.service; -import java.io.File; -import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.Arrays; -import java.util.Date; +public class BrowserNotFoundException extends Exception{ -import org.apache.commons.dbcp.BasicDataSource; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; - -import net.lingala.zip4j.ZipFile; - - -/** - * Spring managed bean that handles the creation of backups of the Collect database. - * The SQLite database file will be saved everytime the application closes. - * A maximum of 10 copies (the last ten times the application was used) will be saved on the backupCollectEarth folder on the users application data folder (OS dependant). - * @author Alfonso Sanchez-Paus Diaz - * - */ -@Component -@Lazy(false) -public class BackupSqlLiteService implements InitializingBean{ - - private static final String BACKUP_COLLECT_EARTH = "backupSqlite"; //$NON-NLS-1$ - - private static final int MAXIMUM_NUMBER_OF_BACKUPS = 10; - - @Autowired - BasicDataSource dataSource; - - @Autowired - private LocalPropertiesService localPropertiesService; - - private Logger logger = LoggerFactory.getLogger( BackupSqlLiteService.class ); - - @Override - public void afterPropertiesSet() throws Exception { - attachShutDownHook(); - } - - private void attachShutDownHook() { - Runtime.getRuntime().addShutdownHook(new Thread("Shutdown hook - Backup Database") { - @Override - public void run() { - if ( "true".equals(localPropertiesService.getValue(EarthProperty.AUTOMATIC_BACKUP) ) ) { //$NON-NLS-1$ - automaticDBBackup(); - } - } - - }); - } - - private void automaticDBBackup() { - if( localPropertiesService.isUsingSqliteDB() ){ - - String pathToBackupZip = ""; //$NON-NLS-1$ - - String nameCollectDB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB; - File originalDBFile = new File(nameCollectDB); - - try { - - pathToBackupZip = getBackupZipFilename(); - - try( ZipFile zipFile = CollectEarthUtils.addFileToZip(pathToBackupZip, originalDBFile, EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME) ){ - removeExtraBackups(); - } + /** + * + */ + private static final long serialVersionUID = -404938492481063378L; - } catch (IOException e) { - logger.error("Error when create backup of the Collect Earth Database from " + nameCollectDB + " to " + pathToBackupZip, e); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (Exception e) { - logger.error("Error when zipping the Collect Earth Database from " + nameCollectDB + " to " + pathToBackupZip, e); //$NON-NLS-1$ //$NON-NLS-2$ - } - } + public BrowserNotFoundException() { + super(); } - private String getBackupZipFilename() throws IOException { - File backupFolder = getAutomaticBackUpFolder(); - return getDBCopyName(backupFolder); - } - public String getDBCopyName(File backupFolder) throws IOException { - String pathToBackup; - SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HHmmss"); //$NON-NLS-1$ - StringBuilder destPathStr = new StringBuilder(); - destPathStr.append(backupFolder.getCanonicalPath()); - destPathStr.append(File.separatorChar); - destPathStr.append( EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME); - destPathStr.append(sdf.format( new Date() )).append( ".zip"); - pathToBackup = destPathStr.toString(); - return pathToBackup; + public BrowserNotFoundException(String message, Throwable cause) { + super(message, cause); } - private void removeExtraBackups() { - - File backupFolder = getAutomaticBackUpFolder(); - - File[] files = backupFolder.listFiles(); - if( files!=null && files.length > MAXIMUM_NUMBER_OF_BACKUPS ){ - - Arrays.sort(files, (o1,o2) -> { - if( o1.lastModified() < o2.lastModified() ){ - return 1; - }else if( o1.lastModified() == o2.lastModified() ){ - return 0; - }else{ - return -1; - } - - } - ); - - for( int i = MAXIMUM_NUMBER_OF_BACKUPS; i< files.length ; i++ ){ - if( !files[i].delete() ) { - logger.error( "Error deleteting file", files[i].getAbsolutePath() ); - } - } - - } - + public BrowserNotFoundException(String message) { + super(message); } - - /** - * Returns the folder where the backup copies should be placed. - * @return The OS dependent folder where the application should saved the backed up copies. - */ - public File getAutomaticBackUpFolder() { - return FolderFinder.createFolderInAppData( BACKUP_COLLECT_EARTH); + public BrowserNotFoundException(Throwable cause) { + super(cause); } + } From 588f1db3496c415011dc4a3fbc849d8d8ae973d3 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:55 +0100 Subject: [PATCH 1027/1620] New translations BrowserNotFoundException.java (Spanish) --- .../earth/app/view/Messages_es.properties | 729 +----------------- 1 file changed, 13 insertions(+), 716 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index cba7f5812d..6570688ad6 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,731 +1,28 @@ package org.openforis.collect.earth.app.service; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +public class BrowserNotFoundException extends Exception{ -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.SystemUtils; -import org.apache.commons.text.StringEscapeUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; -import org.openforis.collect.earth.app.ad_hoc.AluToolUtils; -import org.openforis.collect.earth.app.desktop.ServerController; -import org.openforis.collect.earth.app.model.AspectCode; -import org.openforis.collect.earth.app.model.DynamicsCode; -import org.openforis.collect.earth.app.model.SlopeCode; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; -import org.openforis.collect.model.CollectSurvey; -import org.openforis.collect.relational.CollectRDBPublisher; -import org.openforis.collect.relational.CollectRdbException; -import org.openforis.concurrency.Progress; -import org.openforis.idm.metamodel.NodeDefinition; -import org.openqa.selenium.remote.RemoteWebDriver; -import org.springframework.beans.factory.DisposableBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.RowMapper; -import org.springframework.stereotype.Component; - -import com.opencsv.CSVReader; - -import freemarker.template.TemplateException; - -@Component -public class AnalysisSaikuService extends GenerateDatabase implements DisposableBean{ - - private static final String PLOT_ADD = "plot ADD "; - - private static final String UPDATE = "UPDATE "; - - private static final String UNKNOWN = "Unknown"; - - private static final String VARCHAR_5 = " VARCHAR(5)"; - - private static final String INTEGER = " INTEGER"; - - private static final String ALTER_TABLE = "ALTER TABLE "; - - private static final String INSERT_INTO = "INSERT INTO "; - - private static final String CREATE_TABLE = "CREATE TABLE "; - - private static final String ALU_CLIMATE_ZONE_CODE = "alu_climate_zone_code"; //$NON-NLS-1$ - - private static final String ALU_SOIL_TYPE_CODE = "alu_soil_type_code"; //$NON-NLS-1$ - - private static final String ALU_SUBCLASS_CODE = "alu_subclass_code"; //$NON-NLS-1$ - - private static final String DYNAMICS_ID = "dynamics_id"; //$NON-NLS-1$ - - private static final String ELEVATION_ID = "elevation_id"; //$NON-NLS-1$ - - private static final String SLOPE_ID = "slope_id"; //$NON-NLS-1$ - - private static final String ASPECT_ID = "aspect_id"; //$NON-NLS-1$ - - private static final String START_SAIKU = "start-saiku"; //$NON-NLS-1$ - - private static final String STOP_SAIKU = "stop-saiku"; //$NON-NLS-1$ - - private static final String COMMAND_SUFFIX_BAT = ".bat"; //$NON-NLS-1$ - - private static final String COMMAND_SUFFIX_SH = ".sh"; //$NON-NLS-1$ - - public static final String COLLECT_EARTH_DATABASE_RDB_DB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB - + EarthConstants.SAIKU_RDB_SUFFIX; - - - @Autowired - RDBExporter rdbExporter; - - @Autowired - CollectRDBPublisher collectRDBPublisher; - - @Autowired - EarthSurveyService earthSurveyService; - - @Autowired - public LocalPropertiesService localPropertiesService; - - @Autowired - BrowserService browserService; - - @Autowired - private RegionCalculationUtils regionCalculation; - - @Autowired - private SchemaService schemaNamingService; - - private static final int ELEVATION_RANGE = 100; - - private RemoteWebDriver saikuWebDriver; - - private static final String SQLITE_FREEMARKER_HTML_TEMPLATE = "resources" + File.separator //$NON-NLS-1$ - + "collectEarthSqliteDS.fmt"; //$NON-NLS-1$ - private static final String POSTGRESQL_FREEMARKER_HTML_TEMPLATE = "resources" + File.separator //$NON-NLS-1$ - + "collectEarthPostgreSqlDS.fmt"; //$NON-NLS-1$ - public static final String MDX_XML = "collectEarthCubes.xml"; //$NON-NLS-1$ - private static final String MDX_TEMPLATE = MDX_XML + ".fmt"; //$NON-NLS-1$ - - private boolean saikuStarted; - - private void assignDimensionValues() { - try { - final String schemaName = getSchemaPrefix(); - // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id - final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query( - "SELECT " + EarthConstants.PLOT_ID + ", elevation, slope, aspect FROM " + schemaName + "plot", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - new RowMapper() { - @Override - public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { - - final Object[] updateValues = new Object[4]; - - Integer aspect = AspectCode.NA.getId(); - if (AspectCode.getAspectCode(rs.getDouble("aspect")) != null) { //$NON-NLS-1$ - aspect = AspectCode.getAspectCode(rs.getDouble("aspect")).getId(); //$NON-NLS-1$ - } - - Integer slope = SlopeCode.NA.getId(); - - if (SlopeCode.getSlopeCode((int) rs.getFloat("slope")) != null) { //$NON-NLS-1$ - slope = SlopeCode.getSlopeCode((int) rs.getFloat("slope")).getId(); //$NON-NLS-1$ - } - - updateValues[0] = aspect; - updateValues[1] = slope; - updateValues[2] = ( (int) rs.getFloat("elevation") / ELEVATION_RANGE) + 1; // 0 //$NON-NLS-1$ - - updateValues[3] = rs.getLong(EarthConstants.PLOT_ID); - return updateValues; - } - - }); - - rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + ASPECT_ID + "=?," + SLOPE_ID + "=?," //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - + ELEVATION_ID + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (Exception e) { - logger.warn("No DEM information", e); //$NON-NLS-1$ - } - } - - private String getSchemaPrefix() { - return schemaNamingService.getSchemaPrefix(ExportType.SAIKU); - } - - private void assignPngAluToolDimensionValues() { - try { - if (earthSurveyService.getCollectSurvey().getName().toLowerCase().contains("png")) { //$NON-NLS-1$ - final String schemaName = getSchemaPrefix(); - // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id - final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query("SELECT " + EarthConstants.PLOT_ID //$NON-NLS-1$ - + ", elevation, soil_fundamental, land_use_subcategory, precipitation_ranges FROM " + schemaName //$NON-NLS-1$ - + "plot LEFT JOIN " + schemaName + "precipitation_ranges_code where " //$NON-NLS-1$ //$NON-NLS-2$ - + "plot.annual_precipitation_code_id=precipitation_ranges_code.precipitation_ranges_code_id", //$NON-NLS-1$ - new RowMapper() { - @Override - public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { - - final Object[] updateValues = new Object[3]; - - try { - AluToolUtils aluToolUtils = new AluToolUtils(); - - Integer elevation = rs.getInt("elevation"); //$NON-NLS-1$ - String soilFundamental = rs.getString("soil_fundamental"); //$NON-NLS-1$ - String precipitationRange = rs.getString("precipitation_ranges"); //$NON-NLS-1$ - - int precipitation = -1; - String climateZone = UNKNOWN; //$NON-NLS-1$ - if (precipitationRange != null) { - precipitation = aluToolUtils.getPrecipitationFromRange(precipitationRange); - boolean shortDrySeason = true; // According to information from Abe PNG has less - // than 5 months of dry season - climateZone = aluToolUtils.getClimateZone(elevation, precipitation, - shortDrySeason); - } - - String soilType = UNKNOWN; //$NON-NLS-1$ - if (soilFundamental != null) { - soilType = aluToolUtils.getSoilType(soilFundamental); - } - - updateValues[0] = climateZone; - updateValues[1] = soilType; - updateValues[2] = rs.getLong(EarthConstants.PLOT_ID); - } catch (Exception e) { - logger.error("Error while processing the data", e); //$NON-NLS-1$ - updateValues[0] = UNKNOWN; //$NON-NLS-1$ - updateValues[1] = UNKNOWN; //$NON-NLS-1$ - updateValues[2] = UNKNOWN; //$NON-NLS-1$ - } - return updateValues; - } - - }); - - rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + ALU_CLIMATE_ZONE_CODE + "=?," //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + ALU_SOIL_TYPE_CODE + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ //$NON-NLS-2$ - } - } catch (Exception e) { - logger.error("No PNG ALU information", e); //$NON-NLS-1$ - } - } - - private void assignLUCDimensionValues() { - try { - final String schemaName = getSchemaPrefix(); - // Objet[] --> aspect_id, sloped_id, elevation_bucket_id, _plot_id - final List sqlUpdateValues = rdbExporter.getJdbcTemplate().query( - "SELECT " + EarthConstants.PLOT_ID + ", land_use_subcategory FROM " + schemaName + "plot", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - new RowMapper() { - @Override - public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException { - - AluToolUtils aluToolUtils = new AluToolUtils(); - final Object[] updateValues = new Object[3]; - - String collectEarthSubcategory = rs.getString("land_use_subcategory"); //$NON-NLS-1$ - Integer dynamics = DynamicsCode.getDynamicsCode(collectEarthSubcategory); - String subClass = UNKNOWN; //$NON-NLS-1$ - if (collectEarthSubcategory != null) { - subClass = aluToolUtils.getAluSubclass(collectEarthSubcategory); - } - - updateValues[0] = dynamics; - updateValues[1] = subClass; - updateValues[2] = rs.getLong(EarthConstants.PLOT_ID); - return updateValues; - } - - }); - - rdbExporter.getJdbcTemplate().batchUpdate(UPDATE + schemaName + "plot SET " + DYNAMICS_ID + "=?," + ALU_SUBCLASS_CODE //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + "=? WHERE " + EarthConstants.PLOT_ID + "=?", sqlUpdateValues); //$NON-NLS-1$ - } catch (Exception e) { - logger.warn("No PNG Alu information available", e); //$NON-NLS-1$ - } - } - - private void createAspectAuxTable() { - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "aspect_category (" + ASPECT_ID //$NON-NLS-1$ //$NON-NLS-2$ - + " INTEGER PRIMARY KEY, aspect_caption TEXT);"); //$NON-NLS-1$ - final AspectCode[] aspects = AspectCode.values(); - for (final AspectCode aspectCode : aspects) { - rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "aspect_category values (" + aspectCode.getId() + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + aspectCode.getLabel() + "')"); //$NON-NLS-1$ - } - } - - private void createElevationtAuxTable() { - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "elevation_category ( " + ELEVATION_ID //$NON-NLS-1$ //$NON-NLS-2$ - + " INTEGER PRIMARY KEY, elevation_caption TEXT);"); //$NON-NLS-1$ - final int slots = 9000 / ELEVATION_RANGE; // Highest mountain in the world, mount everest is - // 8820m high - for (int i = 1; i <= slots; i++) { - rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "elevation_category values (" + i + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + ((i - 1) * ELEVATION_RANGE) + "-" + i //$NON-NLS-1$ - * ELEVATION_RANGE - + "')"); //$NON-NLS-1$ - } - - } - - private void createDynamicsAuxTable() { - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(CREATE_TABLE + schemaName + "dynamics_category (" + DYNAMICS_ID //$NON-NLS-1$ //$NON-NLS-2$ - + " INTEGER PRIMARY KEY, dynamics_caption TEXT);"); //$NON-NLS-1$ - final DynamicsCode[] dynamicsCodes = DynamicsCode.values(); - for (final DynamicsCode dynamicsCode : dynamicsCodes) { - rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "dynamics_category values (" + dynamicsCode.getId() //$NON-NLS-1$ //$NON-NLS-2$ - + ", '" + dynamicsCode.getLabel() + "')"); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - - private void createPlotForeignKeys() { - // Add aspect_id column to plot - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ASPECT_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + SLOPE_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ELEVATION_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + DYNAMICS_ID + INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - - private void createPngAluVariables() { - if (earthSurveyService.getCollectSurvey().getName().toLowerCase().contains("png")) { //$NON-NLS-1$ - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_SOIL_TYPE_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_CLIMATE_ZONE_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - } - - private void creatAluSubclassVariables() { - final String schemaName = getSchemaPrefix(); - rdbExporter.getJdbcTemplate().execute(ALTER_TABLE + schemaName + PLOT_ADD + ALU_SUBCLASS_CODE + VARCHAR_5); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - - private void createSlopeAuxTable() { - final String schemaName = getSchemaPrefix(); - // Slope can be from 0 to 90 - rdbExporter.getJdbcTemplate().execute( - CREATE_TABLE + schemaName + "slope_category (slope_id INTEGER PRIMARY KEY, slope_caption TEXT);"); //$NON-NLS-1$ //$NON-NLS-2$ - final SlopeCode[] slopeCodes = SlopeCode.values(); - for (final SlopeCode slopeCode : slopeCodes) { - rdbExporter.getJdbcTemplate().execute(INSERT_INTO + schemaName + "slope_category values (" + slopeCode.getId() + ", '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + slopeCode.getLabel() + "')"); //$NON-NLS-1$ - } - } - - private String getSaikuConfigurationFilePath() { - - String configFile = localPropertiesService.getSaikuFolder() + "/" //$NON-NLS-1$ - + "tomcat/webapps/saiku/WEB-INF/classes/saiku-datasources/collectEarthDS"; //$NON-NLS-1$ - configFile = configFile.replace('/', File.separatorChar); - return configFile; - } - - private String getSaikuThreeConfigurationFilePath() { - - String configFile = localPropertiesService.getSaikuFolder() + "/" //$NON-NLS-1$ - + "tomcat/webapps/saiku/WEB-INF/classes/legacy-datasources/collectEarthDS"; //$NON-NLS-1$ - configFile = configFile.replace('/', File.separatorChar); - return configFile; - } - - private boolean isSaikuConfigured() { - return localPropertiesService.getSaikuFolder() != null - && isSaikuFolder(new File(localPropertiesService.getSaikuFolder())); - } - - /* - * private boolean isJavaHomeConfigured() { - * - * if (SystemUtils.IS_OS_MAC){ return true; } return ! ( StringUtils.isBlank( - * System.getenv("JAVA_HOME") ) //$NON-NLS-1$ && StringUtils.isBlank( - * System.getenv("JRE_HOME") ) //$NON-NLS-1$ && StringUtils.isBlank( - * System.getenv("COLLECT_EARTH_JRE_HOME") ) //$NON-NLS-1$ ); } + /** + * */ + private static final long serialVersionUID = -404938492481063378L; - public boolean isSaikuFolder(File saikuFolder) { - boolean isSaikuFolder = false; - if (saikuFolder.listFiles() != null) { - for (final File file : saikuFolder.listFiles()) { - if (file.getName().equals(START_SAIKU + getCommandSuffix())) { - isSaikuFolder = true; - } - } - } - return isSaikuFolder; - } - - private void openSaiku() throws BrowserNotFoundException { - saikuWebDriver = browserService.navigateTo("http://127.0.0.1:8181", saikuWebDriver, false); //$NON-NLS-1$ - if (browserService.waitFor("username", saikuWebDriver)) { //$NON-NLS-1$ - saikuWebDriver.findElementByName("username").sendKeys("admin"); //$NON-NLS-1$ //$NON-NLS-2$ - saikuWebDriver.findElementByName("password").sendKeys("admin"); //$NON-NLS-1$ //$NON-NLS-2$ - saikuWebDriver.findElementByClassName("form_button").click(); //$NON-NLS-1$ - } - } - - - public void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws SaikuExecutionException { - - try { - - stopSaiku(); - - try { - - if ((localPropertiesService.isUsingSqliteDB() && !getZippedProjectDB( ExportType.SAIKU ).exists()) - || isRefreshDatabase()) { - - // The user clicked on the option to refresh the database, or there is no - // previous copy of the Saiku DB - // Generate the DB file - rdbExporter.exportDataToRDB( - earthSurveyService.getCollectSurvey(), - ExportType.SAIKU, - progressListener, - this::processQuantityData - ); - - try { - // Save the DB file in a zipped file to extends GenerateDatabase keep for the next usages - replaceZippedProjectDB( ExportType.SAIKU ); - } catch (Exception e) { - logger.error("Error while refreshing the Zipped content of the project Saiku DB", e); - } - - } else if (getZippedProjectDB(ExportType.SAIKU).exists() && localPropertiesService.isUsingSqliteDB()) { - // If the zipped version of the project exists ( and the user clicked on the - // option to not refresh it) then restore this last version of the data - restoreZippedProjectDB(ExportType.SAIKU); - } - - refreshDataSourceForSaiku(); - - if (startSaikuAfterDBExport && !isUserCancelledOperation()) { - startSaiku(); - new Thread("Opening Saiku") { - @Override - public void run() { - try { - AnalysisSaikuService.this.openSaiku(); - } catch (BrowserNotFoundException e) { - logger.error("No browser has been set up", e); //$NON-NLS-1$ - } - }; - }.start(); - - stopSaikuOnExit(); - } - } catch (final IOException e) { - logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ - } catch (TemplateException e1) { - logger.error("Error while applying the freemarker template tothe Saiku data source", e1); //$NON-NLS-1$ - } - - } catch (final CollectRdbException e) { - logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ - } - } - - private void processQuantityData(InfiniteProgressMonitor progressListener) { - - SwingUtilities.invokeLater( () -> progressListener.setMessage("Preparing Saiku data for analysis") ); - - progressListener.progressMade(new Progress(0, 100)); - createPngAluVariables(); - createPlotForeignKeys(); - - progressListener.progressMade(new Progress(25, 100)); - - if (!surveyContains("calculated_elevation_range", earthSurveyService.getCollectSurvey())) { - createAspectAuxTable(); - createSlopeAuxTable(); - createElevationtAuxTable(); - assignDimensionValues(); - - } - progressListener.progressMade(new Progress(50, 100)); - - if (!surveyContains("calculated_initial_land_use", earthSurveyService.getCollectSurvey())) { - createDynamicsAuxTable(); - creatAluSubclassVariables(); - assignLUCDimensionValues(); - - } - progressListener.progressMade(new Progress(75, 100)); - - assignPngAluToolDimensionValues(); - - SwingUtilities.invokeLater( () -> progressListener.setMessage("Calculating expansion factors") ); - - regionCalculation.handleRegionCalculation( ExportType.SAIKU, rdbExporter.getJdbcTemplate() ); - progressListener.progressMade(new Progress(100, 100)); - - } - - public static boolean surveyContains(String nodeName, CollectSurvey survey) { - NodeDefinition nodeDefForNAme = survey.getSchema().findNodeDefinition( nodeDef -> nodeDef.getName().equals(nodeName) ); - return nodeDefForNAme != null; - } - - public static CSVReader getCsvReader(String csvFile) throws FileNotFoundException { - final BufferedReader bufferedReader = new BufferedReader( - new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8 ) ); //$NON-NLS-1$ - return new CSVReader(bufferedReader); - } - - private void refreshDataSourceForSaiku() throws IOException, TemplateException { - final File mdxFile = new File(localPropertiesService.getProjectFolder() + File.separatorChar + MDX_XML); - - Map data = new HashMap<>(); - data.put("cubeFilePath", StringEscapeUtils.escapeJava(mdxFile.getAbsolutePath().replace('\\', '/'))); //$NON-NLS-1$ - - final File mdxTemplate = getMdxTemplate(); - final File dataSourceTemplate = getDataSourceTemplate(data); - - // First try Saiku 2.5/2.6 - File dataSourceFile; - try { - dataSourceFile = new File(getSaikuConfigurationFilePath()); - FreemarkerTemplateUtils.applyTemplate(dataSourceTemplate, dataSourceFile, data); - } catch (Exception e) { - logger.error("Error starting Saiku", e); - dataSourceFile = new File(getSaikuThreeConfigurationFilePath()); - FreemarkerTemplateUtils.applyTemplate(dataSourceTemplate, dataSourceFile, data); - } - - setMdxSaikuSchema(mdxTemplate, mdxFile); - } - - private File getMdxTemplate() throws IOException { - final File mdxFileTemplate = new File( - localPropertiesService.getProjectFolder() + File.separatorChar + MDX_TEMPLATE); - if (!mdxFileTemplate.exists()) { - throw new IOException( - "The file containing the MDX Cube definition Template does not exist in expected location " //$NON-NLS-1$ - + mdxFileTemplate.getAbsolutePath()); - } - return mdxFileTemplate; - } - - private File getDataSourceTemplate(Map data) throws IOException { - File dataSourceTemplate = null; - - if (localPropertiesService.isUsingSqliteDB()) { - dataSourceTemplate = new File(SQLITE_FREEMARKER_HTML_TEMPLATE); - final File rdbDb = rdbExporter.getRdbFile( ExportType.SAIKU ); - if (!rdbDb.exists()) { - throw new IOException( - "The file contianing the Relational SQLite Database does not exist in expected location " //$NON-NLS-1$ - + rdbDb.getAbsolutePath()); - } - data.put("rdbFilePath", StringEscapeUtils.escapeJava(rdbDb.getAbsolutePath().replace('\\', '/'))); //$NON-NLS-1$ - } else { - dataSourceTemplate = new File(POSTGRESQL_FREEMARKER_HTML_TEMPLATE); - CollectDBDriver collectDBDriver = localPropertiesService.getCollectDBDriver(); - data.put("dbUrl", StringEscapeUtils.escapeJava(ServerController.getSaikuDbURL(collectDBDriver))); //$NON-NLS-1$ - data.put("username", //$NON-NLS-1$ - StringEscapeUtils.escapeJava(localPropertiesService.getValue(EarthProperty.DB_USERNAME))); - data.put("password", //$NON-NLS-1$ - StringEscapeUtils.escapeJava(localPropertiesService.getValue(EarthProperty.DB_PASSWORD))); - } - - if (!dataSourceTemplate.exists()) { - throw new IOException( - "The file containing the Saiku Data Source template does not exist in expected location " //$NON-NLS-1$ - + dataSourceTemplate.getAbsolutePath()); - } - - return dataSourceTemplate; - } - - private void setMdxSaikuSchema(final File mdxFileTemplate, final File mdxFile) - throws IOException, TemplateException { - Map saikuData = new HashMap<>(); - String saikuSchemaName = getSchemaName(); - if (saikuSchemaName == null) { - saikuSchemaName = ""; //$NON-NLS-1$ - } - saikuData.put("saikuDbSchema", saikuSchemaName); //$NON-NLS-1$ - FreemarkerTemplateUtils.applyTemplate(mdxFileTemplate, mdxFile, saikuData); - } - - private void runSaikuBat(String commandName) throws SaikuExecutionException { - if (!isSaikuConfigured()) { - throw new SaikuExecutionException("The Saiku server is not configured."); //$NON-NLS-1$ - } - - else { - String saikuCmd = localPropertiesService.getSaikuFolder() + File.separator + commandName - + getCommandSuffix(); - - if (SystemUtils.IS_OS_WINDOWS) { - saikuCmd = "\"" + saikuCmd + "\""; //$NON-NLS-1$ //$NON-NLS-2$ - } - - try { - - Process runSaiku = runProcessBuilder(new String[] { saikuCmd }); - - if (commandName.equals(STOP_SAIKU)) { - int result = runSaiku.waitFor(); - logger.warn("Script ended with result {}", result); //$NON-NLS-1$ - } else if (commandName.equals(START_SAIKU)) { - Thread.sleep(6000); - } - - } catch (final IOException e) { - logger.error("Error when running Saiku start/stop command", e); //$NON-NLS-1$ - } catch (InterruptedException e) { - logger.error("Error while waiting to start", e); //$NON-NLS-1$ - Thread.currentThread().interrupt(); - } - } - } - - private void setMacJreHome(ProcessBuilder p) { - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX || SystemUtils.IS_OS_LINUX) { - - File javaFolder = new File("./java"); - - if (!javaFolder.exists()) { - String userName = System.getProperty("user.name"); - String testWithPath = "/Users/" + userName + "/OpenForis/CollectEarth/java"; - File testJavaPath = new File(testWithPath); - if (testJavaPath.exists()) { - javaFolder = testJavaPath; - } - } - - Map environment = p.environment(); - environment.put("COLLECT_EARTH_JRE_HOME", javaFolder.getAbsolutePath()); - - /* - * // In MAC the environment variable COLLECT_EARTH_JRE_HOME is not accesible - * from outside the bash, set it again! if( SystemUtils.IS_OS_MAC || - * SystemUtils.IS_OS_MAC_OSX){ try { File javaFolder = new File("./java"); - * - * if( !javaFolder.exists() ){ String userName = - * System.getProperty("user.name"); String testWithPath = "/Users/"+userName + - * "/OpenForis/CollectEarth/java"; File testJavaPath = new File(testWithPath); - * if( testJavaPath.exists()){ javaFolder = testJavaPath; } } - * - * Process setEnv = runProcessBuilder(new String[] { "/bin/bash", "setenv", - * "COLLECT_EARTH_JRE_HOME=\""+ javaFolder.getAbsolutePath() +"\"" }); - * setEnv.waitFor(); } catch (final IOException e) { - * logger.error("Error setting the COLLECT_EARTH_JRE_HOME environment variable", - * e); //$NON-NLS-1$ } catch (InterruptedException e) { - * logger.error("Error when running COLLECT_EARTH_JRE_HOME environment variable" - * , e); //$NON-NLS-1$ } } - */ - } + public BrowserNotFoundException() { + super(); } - private Process runProcessBuilder(String[] cmd) throws IOException { - final ProcessBuilder builder = new ProcessBuilder(cmd); - - // Fixes bug with Mac OS X not using the environemnt variable set for bash - setMacJreHome(builder); - builder.directory(new File(localPropertiesService.getSaikuFolder()).getAbsoluteFile()); - builder.redirectErrorStream(true); - Process p = builder.start(); - (new ProcessLoggerThread(p.getInputStream(), Boolean.FALSE)).start(); - (new ProcessLoggerThread(p.getErrorStream(), Boolean.TRUE)).start(); - return p; + public BrowserNotFoundException(String message, Throwable cause) { + super(message, cause); } - private String getCommandSuffix() { - if (SystemUtils.IS_OS_WINDOWS) { - return COMMAND_SUFFIX_BAT; - } else { - return COMMAND_SUFFIX_SH; - } + public BrowserNotFoundException(String message) { + super(message); } - private void startSaiku() throws SaikuExecutionException { - logger.warn( - "Starting the Saiku server {}{}{}", localPropertiesService.getSaikuFolder(), File.separator, START_SAIKU); //$NON-NLS-1$ - - runSaikuBat(START_SAIKU); - - this.setSaikuStarted(true); - - logger.warn("Finished starting the Saiku server"); //$NON-NLS-1$ + public BrowserNotFoundException(Throwable cause) { + super(cause); } - void stopSaiku() throws SaikuExecutionException { - logger.warn("Stoping the Saiku server {}{}{}", localPropertiesService.getSaikuFolder() , File.separator , STOP_SAIKU); //$NON-NLS-1$ - if (isSaikuStarted()) { - runSaikuBat(STOP_SAIKU); - this.setSaikuStarted(true); - } - logger.warn("Finished stoping the Saiku server"); //$NON-NLS-1$ - } - - private void stopSaikuOnExit() { - Runtime.getRuntime().addShutdownHook(new Thread("Shutting down Saiku on exit hook") { - @Override - public void run() { - try { - if (isSaikuStarted()) { - stopSaiku(); - } - } catch (final SaikuExecutionException e) { - logger.error("The Saiku server has been de-configured after it was started", e); //$NON-NLS-1$ - } - } - - }); - } - - private boolean isSaikuStarted() { - return saikuStarted; - } - - private void setSaikuStarted(boolean saikuStarted) { - this.saikuStarted = saikuStarted; - } - @Override - public void destroy() throws Exception { - try { - stopSaiku(); - } catch (SaikuExecutionException e) { - logger.error("Error while trying to quite Saiku before destroying the bean", e); //$NON-NLS-1$ - } - } - - @Override - public LocalPropertiesService getLocalPropertiesService() { - return localPropertiesService; - } - - @Override - public EarthSurveyService getEarthSurveyService() { - return earthSurveyService; - } - - @Override - public RDBExporter getRdbExporter() { - return rdbExporter; - } - -} \ No newline at end of file +} From 91919e770fd9e9ac72f8f40d8c079c0c75ff8c03 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:56 +0100 Subject: [PATCH 1028/1620] New translations BrowserNotFoundException.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 95 ++++--------------- 1 file changed, 18 insertions(+), 77 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index b23ed83438..6570688ad6 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,87 +1,28 @@ -package org.openforis.collect.earth.app.server; +package org.openforis.collect.earth.app.service; -import java.io.IOException; -import java.util.Map; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.view.Messages; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; - -/** - * Servlet called for updating/saving the information about a placemark. Called from the form in Google Earth when the user interacts with it or clicks the save button. - * @author Alfonso Sanchez-Paus Diaz - * - * @deprecated Replaced by {@link PlacemarkDataController} - * - */ -@Deprecated -@Controller -public class SaveEarthDataServlet extends JsonPocessorServlet { - - @Autowired - LocalPropertiesService localPropertiesService; - - //@Autowired - //CollectDesignerController collectDesignerController; - - - @Deprecated - @GetMapping("/saveData") - public void saveData(HttpServletRequest request, HttpServletResponse response) throws IOException { - - Map collectedData = extractRequestData(request); - - replaceTestVariables(collectedData); - - if (collectedData.size() == 0) { - setResult(false, Messages.getString("SaveEarthDataServlet.0"), collectedData); //$NON-NLS-1$ - getLogger().info("The request was empty"); //$NON-NLS-1$ - } else { - if (getDataAccessor().saveData(collectedData)) { - setResult(true, Messages.getString("SaveEarthDataServlet.2"), collectedData); //$NON-NLS-1$ - } else { - setResult(false, Messages.getString("SaveEarthDataServlet.1"), collectedData); //$NON-NLS-1$ - getLogger().error("The data could not be saved"); //$NON-NLS-1$ - } - } - - setJsonResponse(response, collectedData); - } +public class BrowserNotFoundException extends Exception{ /** - * This method replaces the variable values that the form contains when it is not run - * through Google Earth and the variable replacement of the ExtendedData of the KML does not kick in. - * - * @param collectedData - * The data POSTed by the form that has already been processed. + * */ - private void replaceTestVariables(Map collectedData) { - // REMOVE THIS!!!! - if (collectedData.get(EarthConstants.PLACEMARK_ID_PARAMETER).equals("$[id]")) { //$NON-NLS-1$ //$NON-NLS-2$ - collectedData.put(EarthConstants.PLACEMARK_ID_PARAMETER, "testPlacemark"); //$NON-NLS-1$ //$NON-NLS-2$ - } + private static final long serialVersionUID = -404938492481063378L; + + public BrowserNotFoundException() { + super(); + } - if (collectedData.get("collect_integer_elevation") != null && collectedData.get("collect_integer_elevation").equals("$[elevation]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - collectedData.put("collect_integer_elevation", "0"); //$NON-NLS-1$ //$NON-NLS-2$ - } - if (collectedData.get("collect_real_slope") != null && collectedData.get("collect_real_slope").equals("$[slope]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - collectedData.put("collect_real_slope", "0"); //$NON-NLS-1$ //$NON-NLS-2$ - } + public BrowserNotFoundException(String message, Throwable cause) { + super(message, cause); + } - if (collectedData.get("collect_real_aspect") != null && collectedData.get("collect_real_aspect").equals("$[aspect]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - collectedData.put("collect_real_aspect", "0"); //$NON-NLS-1$ //$NON-NLS-2$ - } + public BrowserNotFoundException(String message) { + super(message); + } - if (collectedData.get("collect_coord_location").equals("$[latitude],$[longitude]")) { //$NON-NLS-1$ //$NON-NLS-2$ - collectedData.put("collect_coord_location", "0,0"); //$NON-NLS-1$ //$NON-NLS-2$ - } + public BrowserNotFoundException(Throwable cause) { + super(cause); } -} \ No newline at end of file + +} From f306b3761f5fc885cbd8c1d44a46ce1e579273ea Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:57 +0100 Subject: [PATCH 1029/1620] New translations BrowserNotFoundException.java (English) --- .../earth/app/view/Messages_en.properties | 142 ++---------------- 1 file changed, 14 insertions(+), 128 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 8c14343c96..6570688ad6 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,142 +1,28 @@ package org.openforis.collect.earth.app.service; -import java.io.File; -import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.Arrays; -import java.util.Date; +public class BrowserNotFoundException extends Exception{ -import org.apache.commons.dbcp.BasicDataSource; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; - -import net.lingala.zip4j.ZipFile; - - -/** - * Spring managed bean that handles the creation of backups of the Collect database. - * The SQLite database file will be saved everytime the application closes. - * A maximum of 10 copies (the last ten times the application was used) will be saved on the backupCollectEarth folder on the users application data folder (OS dependant). - * @author Alfonso Sanchez-Paus Diaz - * - */ -@Component -@Lazy(false) -public class BackupSqlLiteService implements InitializingBean{ - - private static final String BACKUP_COLLECT_EARTH = "backupSqlite"; //$NON-NLS-1$ - - private static final int MAXIMUM_NUMBER_OF_BACKUPS = 10; - - @Autowired - BasicDataSource dataSource; - - @Autowired - private LocalPropertiesService localPropertiesService; - - private Logger logger = LoggerFactory.getLogger( BackupSqlLiteService.class ); - - @Override - public void afterPropertiesSet() throws Exception { - attachShutDownHook(); - } - - private void attachShutDownHook() { - Runtime.getRuntime().addShutdownHook(new Thread("Shutdown hook - Backup Database") { - @Override - public void run() { - if ( "true".equals(localPropertiesService.getValue(EarthProperty.AUTOMATIC_BACKUP) ) ) { //$NON-NLS-1$ - automaticDBBackup(); - } - } - - }); - } - - private void automaticDBBackup() { - if( localPropertiesService.isUsingSqliteDB() ){ - - String pathToBackupZip = ""; //$NON-NLS-1$ - - String nameCollectDB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB; - File originalDBFile = new File(nameCollectDB); - - try { - - pathToBackupZip = getBackupZipFilename(); - - try( ZipFile zipFile = CollectEarthUtils.addFileToZip(pathToBackupZip, originalDBFile, EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME) ){ - removeExtraBackups(); - } + /** + * + */ + private static final long serialVersionUID = -404938492481063378L; - } catch (IOException e) { - logger.error("Error when create backup of the Collect Earth Database from " + nameCollectDB + " to " + pathToBackupZip, e); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (Exception e) { - logger.error("Error when zipping the Collect Earth Database from " + nameCollectDB + " to " + pathToBackupZip, e); //$NON-NLS-1$ //$NON-NLS-2$ - } - } + public BrowserNotFoundException() { + super(); } - private String getBackupZipFilename() throws IOException { - File backupFolder = getAutomaticBackUpFolder(); - return getDBCopyName(backupFolder); - } - public String getDBCopyName(File backupFolder) throws IOException { - String pathToBackup; - SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HHmmss"); //$NON-NLS-1$ - StringBuilder destPathStr = new StringBuilder(); - destPathStr.append(backupFolder.getCanonicalPath()); - destPathStr.append(File.separatorChar); - destPathStr.append( EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME); - destPathStr.append(sdf.format( new Date() )).append( ".zip"); - pathToBackup = destPathStr.toString(); - return pathToBackup; + public BrowserNotFoundException(String message, Throwable cause) { + super(message, cause); } - private void removeExtraBackups() { - - File backupFolder = getAutomaticBackUpFolder(); - - File[] files = backupFolder.listFiles(); - if( files!=null && files.length > MAXIMUM_NUMBER_OF_BACKUPS ){ - - Arrays.sort(files, (o1,o2) -> { - if( o1.lastModified() < o2.lastModified() ){ - return 1; - }else if( o1.lastModified() == o2.lastModified() ){ - return 0; - }else{ - return -1; - } - - } - ); - - for( int i = MAXIMUM_NUMBER_OF_BACKUPS; i< files.length ; i++ ){ - if( !files[i].delete() ) { - logger.error( "Error deleteting file", files[i].getAbsolutePath() ); - } - } - - } - + public BrowserNotFoundException(String message) { + super(message); } - - /** - * Returns the folder where the backup copies should be placed. - * @return The OS dependent folder where the application should saved the backed up copies. - */ - public File getAutomaticBackUpFolder() { - return FolderFinder.createFolderInAppData( BACKUP_COLLECT_EARTH); + public BrowserNotFoundException(Throwable cause) { + super(cause); } + } From bda1127243c856912c6db04f1032704c4ed4f85d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:40:59 +0100 Subject: [PATCH 1030/1620] New translations BrowserService.java (French) --- .../earth/app/view/Messages_fr.properties | 905 +++++++++++++++++- 1 file changed, 893 insertions(+), 12 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 6570688ad6..5a933d094d 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,28 +1,909 @@ package org.openforis.collect.earth.app.service; -public class BrowserNotFoundException extends Exception{ +import java.io.BufferedWriter; +import java.io.File; +import java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; +import java.net.URI; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Observable; +import java.util.Observer; +import java.util.concurrent.CopyOnWriteArrayList; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.desktop.ServerController.ServerInitializationEvent; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.sampler.model.SimpleCoordinate; +import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; +import org.openqa.selenium.By; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.WebDriverException; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.firefox.GeckoDriverService; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import freemarker.cache.FileTemplateLoader; +import freemarker.template.Configuration; +import freemarker.template.Template; +import freemarker.template.TemplateException; +import freemarker.template.Version; +import io.github.bonigarcia.wdm.WebDriverManager; +import liquibase.repackaged.org.apache.commons.lang3.SystemUtils; + +/** + * This class contains methods that allow Collect Earth to open browser windows + * that allow the user to have a better understanding of the plot. So far there + * are integrations with Google Earth Engine, Google Earth Engine Timelapse and + * Bing Maps. When a user clicks on a plot Collect Earth will check if the + * program is set to open any of these integrations, and if it is so it will + * open each one in its own window. These windows are closed when the program + * is closed. + *s + * @author Alfonso Sanchez-Paus Diaz + * + */ +@Component +public class BrowserService implements InitializingBean, Observer { + + + @Autowired + private LocalPropertiesService localPropertiesService; + + @Autowired + private GeolocalizeMapService geoLocalizeTemplateService; + + @Autowired + private EarthSurveyService earthSurveyService; + + @Autowired + private CodeEditorHandlerThread codeEditorHandlerThread; + + private final ArrayList drivers = new ArrayList<>(); + private final Logger logger = LoggerFactory.getLogger(BrowserService.class); + private static final String TEMPLATE_FOR_DGMAP_JS = "resources/javascript_dgmap.fmt"; + private static final Configuration cfg = new Configuration(new Version("2.3.23")); + private RemoteWebDriver webDriverBing, webDriverBaidu, webDriverTimelapse, webDriverGeeCodeEditor, + webDriverHere, webDriverStreetView, webDriverYandex, webDriverPlanetHtml, webDriverExtraMap, webDriverSecureWatch, + webDriverGEEMap, webDriverEarthMap; + + + Map locks = new HashMap(); + + private static boolean geeMethodUpdated = false; + + private boolean isClosing = false; + + public void closeBrowsers() { + synchronized (this) { + getClosingBrowsersThread().start(); + } + } + + @Override + public void afterPropertiesSet() throws Exception { + Runtime.getRuntime().addShutdownHook(getClosingBrowsersThread()); + setGeckoDriverPath(); + } + + private RemoteWebDriver chooseDriver() throws BrowserNotFoundException { + RemoteWebDriver driver = null; + final String browserSetInProperties = localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim(); + + if (browserSetInProperties.equalsIgnoreCase(EarthConstants.CHROME_BROWSER)) { + driver = tryStartChrome(); + } else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.FIREFOX_BROWSER)) { + driver = tryStartFirefox(); + } else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.EDGE_BROWSER)) { + driver = tryStartEdge(); + }else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.SAFARI_BROWSER)) { + driver = tryStartSafari(); + } + + // If the browser chosen is not installed try to find and installed browser in the computer + if( driver== null ) { + driver = tryStartChrome(); + if( driver== null ) { + driver = tryStartFirefox(); + } + if( driver== null ) { + driver = tryStartEdge(); + } + if( driver== null ) { + driver = tryStartSafari(); + } + } + + if (driver == null) { + throw new BrowserNotFoundException( + "Neither Chrome nor Firefox could be opened. You need to have one of them installed in order to use GEE, Bing Maps or Saiku."); + } + + return driver; + } + + private RemoteWebDriver tryStartFirefox() { + RemoteWebDriver driver = null; + try { + driver = (RemoteWebDriver) WebDriverManager.firefoxdriver().create(); + } catch (final WebDriverException e) { + logger.warn( + "Problem starting Firefox browser!", + e); + } + return driver; + } + + private RemoteWebDriver tryStartEdge() { + RemoteWebDriver driver = null; + try { + driver = (RemoteWebDriver) WebDriverManager.edgedriver().create(); + } catch (final WebDriverException e) { + logger.warn( + "Problem starting Edge browser", + e); + } + return driver; + } + + private RemoteWebDriver tryStartSafari() { + RemoteWebDriver driver = null; + try { + driver = (RemoteWebDriver) WebDriverManager.safaridriver().create(); + } catch (final WebDriverException e) { + logger.warn( + "Problem starting Safari browser", + e); + } + return driver; + } + + private RemoteWebDriver tryStartChrome() { + RemoteWebDriver driver = null; + try { + driver = (RemoteWebDriver) WebDriverManager.chromedriver().create(); + } catch (final Exception e) { + logger.warn( + "Problem starting Chrome browser", + e); + } + return driver; + } + + + private String getDGMapJavascript(SimplePlacemarkObject placemarkObject) { + final Map data = geoLocalizeTemplateService.getPlacemarkData(placemarkObject); + data.put("latitude", placemarkObject.getCoord().getLatitude()); + data.put("longitude", placemarkObject.getCoord().getLongitude()); + return processJavascriptTemplate(data, TEMPLATE_FOR_DGMAP_JS); + } + + private String processJavascriptTemplate(final Map data, String templateName) { + Writer out; + String result = null; + try (StringWriter fw = new StringWriter();) { + // Load template from source folder + cfg.setTemplateLoader(new FileTemplateLoader(new File(System.getProperty("user.dir")))); + final Template template = cfg.getTemplate(templateName); + + // Console output + out = new BufferedWriter(fw); + + // Add date to avoid caching + template.process(data, out); + + out.flush(); + + result = fw.toString(); + + } catch (final TemplateException e) { + logger.error("Error when generating the javascript commands", e); + } catch (final IOException e) { + logger.error("Error when reading/writing the template information", e); + } + return result; + } + + private RemoteWebDriver initBrowser() throws BrowserNotFoundException { + RemoteWebDriver driver = null; + driver = chooseDriver(); + if (isClosing) { // In case the browser takes so long to start that the user closes CE and this + // method is called when the other windows are being closed + driver.quit(); + driver = null; + } else { + drivers.add(driver); + } + return driver; + } + + public static boolean isIdOrNamePresent(String elementId, RemoteWebDriver driver) { + boolean found = false; + + try { + if (driver.findElementById(elementId).isDisplayed() || driver.findElementByName(elementId).isDisplayed()) { + found = true; + } + } catch (final Exception e) { + // Not found + } + + return found; + } + + public static boolean isCssElementPresent(String cssElement, RemoteWebDriver driver) { + boolean found = false; + + try { + WebElement elementByCssSelector = driver.findElementByCssSelector(cssElement); + found = elementByCssSelector != null; + } catch (final Exception e) { + // Not found + } + + return found; + } + + private boolean isXPathPresent(String xpath, RemoteWebDriver driver) { + boolean found = false; + + try { + if (driver.findElementByXPath(xpath).isDisplayed()) { + found = true; + } + logger.debug(String.format("Found %s", xpath)); + } catch (final Exception e) { + logger.debug(String.format("Not Found %s", xpath)); + } + + return found; + } + + private boolean loadPlotInDGMap(SimplePlacemarkObject placemarkObject, RemoteWebDriver driver) { + + boolean success = true; + if (driver != null && waitFor("mainContent", driver) && driver instanceof JavascriptExecutor) { + try { + String dgmapJs = getDGMapJavascript(placemarkObject); + driver.executeScript(dgmapJs); + + Thread.sleep( 1000 ); + // Unlock the view if it is locked + if( isCssElementPresent(".lock.on", driver) ) { + driver.findElementByCssSelector(".lock.on").click(); // UNLOCK + } + + } catch (final Exception e) { + processSeleniumError(e); + success = false; + } + } + return success; + } + + public void clickOnElements(RemoteWebDriver driver, String cssSelector) { + final List dataLayerVisibility = driver.findElementsByCssSelector(cssSelector); + for (final WebElement webElement : dataLayerVisibility) { + if (webElement.isDisplayed()) { + webElement.click(); + } + } + } + + public static boolean isGeeMethodUpdated() { + return geeMethodUpdated; + } + + public static void setGeeMethodUpdated(boolean geeMethosUpdated) { + BrowserService.geeMethodUpdated = geeMethosUpdated; + } + + private void processSeleniumError(final Exception e) { + if (e.getCause() != null && e.getCause().getMessage() != null + && !e.getCause().getMessage().contains("latitude")) { + logger.warn("Error in the selenium driver", e); + } else { + logger.info("Error in the selenium driver provoked by known bug", e); + } + } + + public RemoteWebDriver navigateTo(String url, RemoteWebDriver driver) throws BrowserNotFoundException { + return navigateTo(url, driver, true); + } /** - * + * Loads the given URL into the browser. If the browser is null then a new + * browser window is open. + * + * @param url + * The URL to load. + * @param driverParam + * The browser window to use. If this value is null a new browser + * window is open. + * @param retry + * Specify if there should be a second try to open a browser window + * if the first time fails (useful if the browser could not be found) + * @return The browser window (firefox or chrome depending on the configuration) + * used to open the URL. + * @throws BrowserNotFoundException + * Exception thrown when there is no Firefox/Chrome installed */ - private static final long serialVersionUID = -404938492481063378L; + public RemoteWebDriver navigateTo(String url, RemoteWebDriver driverParam, boolean retry) + throws BrowserNotFoundException { + + RemoteWebDriver driver = driverParam; + + if (driver == null || !isDriverWorking(driver)) { + driver = initBrowser(); + } - public BrowserNotFoundException() { - super(); + if (driver != null) { + try { + driver.navigate().to(url); + } catch (final Exception e) { + if (retry && (e.getCause() != null && e.getCause().getMessage() != null + && e.getCause().getMessage().contains("Session not found"))) { + // Browser closed, restart it! + logger.error("Browser was closed, restaring it...", e); + driver = initBrowser(); + navigateTo(url, driver, false); // only try to re-open one + } + } + } else { + logger.error("No Selenium driver available, Is Firefox or Chrome installed?"); + } + return driver; } + protected boolean isDriverWorking(RemoteWebDriver driver) { + boolean stillWorking = true; + try { + driver.findElement(By.xpath("//body")); + } catch (Exception e) { + stillWorking = false; + } + return stillWorking; + } + + /** + * Opens a browser window with the Bing Maps representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openBingMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("BING"); + synchronized (lock) { + if (localPropertiesService.isBingMapsSupported()) { + try { + webDriverBing = navigateTo(geoLocalizeTemplateService + .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_BING_HTML_TEMPLATE, + "bingMapsKey", localPropertiesService.getValue(EarthProperty.BING_MAPS_KEY)) + .toString(), webDriverBing); + } catch (final Exception e) { + logger.error("Problems loading Bing", e); + } + } + } + } + + private Object getLock(String key) { + String lock = locks.get(key); + if( lock !=null ) { + return lock; + }else{ + locks.put(key, key); + return key; + } + } + + /** + * Opens a browser window with the Planet Basemaps representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openPlanetMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("PLANET"); + synchronized (lock) { + if (localPropertiesService.isPlanetMapsSupported()) { + + boolean monthly = localPropertiesService.isPlanetMapsMonthlyOpen(); + + String template = monthly ? GeolocalizeMapService.FREEMARKER_PLANET_NICFI_ARGUMENTS : GeolocalizeMapService.FREEMARKER_PLANET_DAILY_HTML_TEMPLATE; + String key = monthly ? localPropertiesService.getValue( EarthProperty.PLANET_MAPS_CE_KEY ) : localPropertiesService.getValue( EarthProperty.PLANET_MAPS_KEY ); + + try { + + String processTemplate = geoLocalizeTemplateService.getUrlToFreemarkerOutput( + placemarkObject, + template, + "planetMapsKey", + key, + "urlPlanetEndpointPrefix", + ServerController.getHostAddress(localPropertiesService.getHost(),localPropertiesService.getPort()) + ).toString(); + + String urlPlanet = null; + if( monthly ) { + + String parameters = FileUtils.readFileToString( new File( new URI( processTemplate ) ) , StandardCharsets.UTF_8 ); + + // remove new lines + parameters = parameters.replace("\n", "").replace("\r", "").replace("\t", "").replace(" ", ""); + // remove trailing commas + parameters = parameters.replace(",],", "],").replace("],]", "]]"); + + urlPlanet = localPropertiesService.getValue( EarthProperty.PLANET_NICFI_URL ) + parameters; + }else { + urlPlanet = processTemplate; + } + + webDriverPlanetHtml = navigateTo( urlPlanet, webDriverPlanetHtml ); + + } catch (final Exception e) { + logger.error("Problems loading Planet", e); + } + } + } + } + + /** + * Opens a browser window with the Baidu Maps representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openBaiduMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("BAIDU"); + synchronized (lock) { + if (localPropertiesService.isBaiduMapsSupported()) { + + try { + webDriverBaidu = navigateTo(geoLocalizeTemplateService + .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_BAIDU_HTML_TEMPLATE) + .toString(), webDriverBaidu); + } catch (final Exception e) { + logger.error("Problems loading Baidu", e); + } + } + } + } + + /** + * Opens a browser window with the Yandex Maps representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openYandexMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("YANDEX"); + synchronized (lock) { + if (localPropertiesService.isYandexMapsSupported()) { + try { + webDriverYandex = navigateTo(geoLocalizeTemplateService.getUrlToFreemarkerOutput(placemarkObject, + GeolocalizeMapService.FREEMARKER_YANDEX_HTML_TEMPLATE).toString(), webDriverYandex); + } catch (final Exception e) { + logger.error("Problems loading Yandex", e); + } + } + } + } + + /** + * Opens a browser window with a map representation of the plot in SecureWatch. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openSecureWatch(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("SECUREWATCH"); + synchronized (lock) { + if ( localPropertiesService.isSecureWatchSupported() ) { + String url = getUrlBaseIntegration(placemarkObject, localPropertiesService.getSecureWatchURL() + "/#18/LATITUDE/LONGITUDE" ); + webDriverSecureWatch = navigateTo(url, webDriverSecureWatch); + try { + logger.warn("Loading layers - {}", placemarkObject); + loadPlotInDGMap(placemarkObject, webDriverSecureWatch); + } catch (final Exception e) { + logger.error("Error when opening Secure Watch browser window", e); + } + } + } + } + + /** + * Opens a browser window with a map representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openExtraMap(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("EXTRA"); + synchronized (lock) { + if (!StringUtils.isBlank(localPropertiesService.getExtraMap())) { + webDriverExtraMap = navigateTo( getUrlBaseIntegration(placemarkObject, localPropertiesService.getExtraMap() ) , webDriverExtraMap ); + } + } + } + + private String getUrlBaseIntegration(SimplePlacemarkObject placemarkObject, String url) { + String temp = null; + try { + String latitude = placemarkObject.getCoord().getLatitude(); + String longitude = placemarkObject.getCoord().getLongitude(); + String id = placemarkObject.getPlacemarkId().split(",")[0]; // for cases where ID also has round, then + // the id string would be something like + // "plotId,round", we only want the ID + + temp = url.replace("LATITUDE", latitude).replace("LONGITUDE", longitude).replace("PLOT_ID", id); + + } catch (final Exception e) { + logger.error("Problems Getting the URL filling for " + url, e); + } + return temp; + } + + /** + * Opens a browser window with the Google Street View representation of the + * plot. + * https://www.google.com/maps/@43.7815661,11.1484876,3a,75y,210.23h,82.32t/data=!3m6!1e1!3m4!1sEz7NiCbaIYzTJkP_RMBiqw!2e0!7i13312!8i6656?hl=en + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openStreetView(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("STREET_VIEW"); + synchronized (lock) { + if (localPropertiesService.isStreetViewSupported()) { + try { + webDriverStreetView = navigateTo( + geoLocalizeTemplateService.getUrlToFreemarkerOutput(placemarkObject, + GeolocalizeMapService.FREEMARKER_STREET_VIEW_HTML_TEMPLATE, "googleMapsApiKey", + localPropertiesService.getValue(EarthProperty.GOOGLE_MAPS_API_KEY)).toString(), + webDriverStreetView); + } catch (final Exception e) { + logger.error("Problems loading Street View", e); + } + } + } + } + + /** + * Opens a browser window with the Here Maps representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openHereMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("HERE"); + synchronized (lock) { + if (localPropertiesService.isHereMapsSupported()) { + try { + webDriverHere = navigateTo(geoLocalizeTemplateService + .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_HERE_HTML_TEMPLATE, + "hereAppId", localPropertiesService.getValue(EarthProperty.HERE_MAPS_APP_ID), + "hereAppCode", localPropertiesService.getValue(EarthProperty.HERE_MAPS_APP_CODE)) + .toString(), webDriverHere); + } catch (final Exception e) { + logger.error("Problems loading Here Maps", e); + } + + } + } + } + + private StringBuilder getGeoJsonSegment(List coordinates) { + StringBuilder geoJson = new StringBuilder("["); + if (coordinates != null) { + for (SimpleCoordinate coord : coordinates) { + geoJson = geoJson.append("[").append(coord.getLongitude()).append(",").append(coord.getLatitude()) + .append("],"); + } + // remove last character + geoJson = geoJson.deleteCharAt(geoJson.length() - 1); + } + geoJson = geoJson.append("],"); + return geoJson; + } + + + + + private String getFeature(SimplePlacemarkObject placemarkObject, String shapeType, String name ) { + StringBuilder feature = new StringBuilder("{\"type\":\"Feature\",\"properties\":{\"name\":\"").append( name).append("\"},\"geometry\":"); + feature= feature.append( getGeoJson(placemarkObject, shapeType )).append("}"); + return feature.toString(); + } + + private String getGeoJson(SimplePlacemarkObject placemarkObject, String shapeType ) { + + StringBuilder geoJson = new StringBuilder("{\"type\":\"" ).append( shapeType).append("\",\"coordinates\":["); + List shape = placemarkObject.getShape(); + geoJson = geoJson.append(getGeoJsonSegment(shape)); + geoJson = geoJson.deleteCharAt(geoJson.length() - 1); + geoJson = geoJson.append("]}"); + return geoJson.toString(); + } + + /** + * Opens a browser window with the Google Earth Engine Code Editor and runs the + * freemarker template found in resources/eeCodeEditorScript.fmt on the main + * editor of GEE. + * + * @param placemarkObject + * The center point of the plot. + * @throws BrowserNotFoundException + * If the browser cannot be found + * + */ + public void openGEEAppURL(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("GEEAPP"); + synchronized (lock) { + if (localPropertiesService.isGEEAppSupported()) { + + try { + StringBuilder url = new StringBuilder(localPropertiesService.getGEEAppURL()); + url = url.append("#geoJson=") + .append(URLEncoder.encode(getGeoJson(placemarkObject, "MultiLineString"), StandardCharsets.UTF_8.toString())) + .append(";"); + url = url.append("plotId=") + .append(URLEncoder.encode(placemarkObject.getPlacemarkId(), StandardCharsets.UTF_8.toString())) + .append(";"); + url = url.append("survey=") + .append(URLEncoder.encode( earthSurveyService.getCollectSurvey().getName() , StandardCharsets.UTF_8.toString())) + .append(";"); + webDriverGEEMap = navigateTo(url.toString(), webDriverGEEMap); + webDriverGEEMap.navigate().refresh(); // FORCE REFRESH - OTHERWISE WINDOW IS NOT REFRESHED FOR SOME STRANGE REASON + } catch (final Exception e) { + logger.error("Problems loading GEE APP window", e); + } + } + } + } + + + public void openEarthMapURL(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("EARTH_MAP"); + synchronized (lock) { + if (localPropertiesService.isEarthMapSupported()) { + + + try { + StringBuilder url = new StringBuilder(localPropertiesService.getEarthMapURL()).append("?"); + url = url.append("polygon=") + .append(URLEncoder.encode(getFeature(placemarkObject, "Polygon", placemarkObject.getPlacemarkId()), StandardCharsets.UTF_8.toString())) + .append("&"); + + if( StringUtils.isNotBlank(localPropertiesService.getEarthMapLayers()) ) { + url = url.append("layers=") + .append(URLEncoder.encode(localPropertiesService.getEarthMapLayers(), StandardCharsets.UTF_8.toString())) + .append("&"); + } + + if( StringUtils.isNotBlank(localPropertiesService.getEarthMapScripts()) ) { + url = url.append("scripts=") + .append(URLEncoder.encode(localPropertiesService.getEarthMapScripts(), StandardCharsets.UTF_8.toString())) + .append("&"); + } + + String aoi = localPropertiesService.getEarthMapAOI(); + if( StringUtils.isBlank(aoi) ) { + aoi = "global"; + } + url = url.append("aoi=") + .append(URLEncoder.encode( aoi, StandardCharsets.UTF_8.toString() )) + .append("&embed=true"); // Set the EMBED parameter to true so that the user does not need to log in. + + webDriverEarthMap = navigateTo(url.toString(), webDriverEarthMap); + //Desktop.getDesktop().browse( new URI( url.toString() ) ); + //webDriverEarthMap.navigate().refresh(); // FORCE REFRESH - OTHERWISE WINDOW IS NOT REFRESHED FOR SOME STRANGE REASON + } catch (final Exception e) { + logger.error("Problems loading Earth Map window", e); + } + } + } + } + + /** + * Opens a browser window with the Google Earth Engine Code Editor and runs the + * freemarker template found in resources/eeCodeEditorScript.fmt on the main + * editor of GEE. + * + * @param placemarkObject + * The center point of the plot. + * @throws BrowserNotFoundException + * If the browser cannot be found + * + */ + public void openGEECodeEditor(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("CODE_EDITOR"); + synchronized (lock) { + if (localPropertiesService.isCodeEditorSupported()) { + + boolean firstOpening = false; + if (getWebDriverGeeCodeEditor() == null) { + setWebDriverGeeCodeEditor(initBrowser()); + firstOpening = true; + } + + if (firstOpening && (liquibase.repackaged.org.apache.commons.lang3.SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX)) { + codeEditorHandlerThread.disableCodeEditorAutocomplete(getWebDriverGeeCodeEditor()); + } + + codeEditorHandlerThread.loadCodeEditorScript(placemarkObject, getWebDriverGeeCodeEditor()); + } + } + } + + + /** + * Opens a browser window with the Google Earth Engine Timelapse representation + * of the plot. + * + * @param placemarkObject + * The center point of the plot. + * @throws BrowserNotFoundException + * If the browser cannot be found + * + */ + public void openTimelapse(final SimplePlacemarkObject placemarkObject) + throws BrowserNotFoundException { + Object lock = getLock("TIMELAPSE"); + synchronized (lock) { + if (localPropertiesService.isTimelapseSupported()) { + try { + String coordinates = placemarkObject.getCoord().toString(); + webDriverTimelapse = navigateTo( + "https://earthengine.google.org/timelapse/timelapseplayer_v2.html?timelapseclient=http://earthengine.google.org/timelapse/data&v=" + + coordinates + ",10.812,latLng&t=0.08", + webDriverTimelapse); + } catch (final Exception e) { + logger.error("Problems loading Timelapse", e); + } + } + } + } + + private void setGeckoDriverPath() { + String geckoDriverPath = ""; + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { + geckoDriverPath = "resources/geckodriver_mac"; + } else if (SystemUtils.IS_OS_UNIX) { + if (System.getProperty("os.arch").contains("64") + || System.getProperty("sun.arch.data.model").equals("64")) { + geckoDriverPath = "resources/geckodriver_64"; + } else { + geckoDriverPath = "resources/geckodriver_32"; + } + } else if (SystemUtils.IS_OS_WINDOWS) { + try { + if (System.getProperty("os.arch").contains("64") + || System.getProperty("sun.arch.data.model").equals("64")) + geckoDriverPath = "resources/geckodriver_64.exe"; + else + geckoDriverPath = "resources/geckodriver_32.exe"; + } catch (Exception e) { + geckoDriverPath = "resources/geckodriver_64.exe"; + } + } else { + throw new IllegalArgumentException("Geckodriver is not supported in the current OS"); + } + + File geckoDriverFile = new File(geckoDriverPath); + + // if above property is not working or not opening the application in browser + // then try below property + System.setProperty(GeckoDriverService.GECKO_DRIVER_EXE_PROPERTY, geckoDriverFile.getAbsolutePath()); + System.setProperty(FirefoxDriver.SystemProperty.DRIVER_USE_MARIONETTE, "true"); + + } + + public boolean waitFor(String elementId, RemoteWebDriver driver) { + int i = 0; + while (!isIdOrNamePresent(elementId, driver)) { + try { + Thread.sleep(1000); + } catch (final InterruptedException e) { + return false; + } + i++; + if (i > 60) { + return false; + } + } + return true; + } + + public boolean waitForXPath(String xpath, RemoteWebDriver driver) { + int i = 0; + while (!isXPathPresent(xpath, driver)) { + try { + Thread.sleep(1000); + } catch (final InterruptedException e) { + return false; + + } + i++; + if (i > 30) { + return false; + } + } + return true; + } + + private Thread getClosingBrowsersThread() { + + return new Thread("Quit the open browsers") { + @Override + public void run() { + isClosing = true; + CopyOnWriteArrayList driversCopy = new CopyOnWriteArrayList<>(drivers); + for (Iterator iterator = driversCopy.iterator(); iterator.hasNext();) { + RemoteWebDriver remoteWebDriver = iterator.next(); + try { + remoteWebDriver.quit(); + } catch (final Exception e) { + logger.error("Error quitting the browser", e); + } + } + + } + }; + } - public BrowserNotFoundException(String message, Throwable cause) { - super(message, cause); + @Override + public void update(Observable o, Object arg) { + if (ServerInitializationEvent.SERVER_STOPPED_EVENT.equals(arg)) { + this.closeBrowsers(); + } } - public BrowserNotFoundException(String message) { - super(message); + private RemoteWebDriver getWebDriverGeeCodeEditor() { + return webDriverGeeCodeEditor; } - public BrowserNotFoundException(Throwable cause) { - super(cause); + protected void setWebDriverGeeCodeEditor(RemoteWebDriver webDriverGeeCodeEditor) { + this.webDriverGeeCodeEditor = webDriverGeeCodeEditor; } - } From b3d7313c15891e3f0d98c36aa868b5ad539eb288 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:00 +0100 Subject: [PATCH 1031/1620] New translations BrowserService.java (Spanish) --- .../earth/app/view/Messages_es.properties | 905 +++++++++++++++++- 1 file changed, 893 insertions(+), 12 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 6570688ad6..5a933d094d 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,28 +1,909 @@ package org.openforis.collect.earth.app.service; -public class BrowserNotFoundException extends Exception{ +import java.io.BufferedWriter; +import java.io.File; +import java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; +import java.net.URI; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Observable; +import java.util.Observer; +import java.util.concurrent.CopyOnWriteArrayList; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.desktop.ServerController.ServerInitializationEvent; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.sampler.model.SimpleCoordinate; +import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; +import org.openqa.selenium.By; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.WebDriverException; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.firefox.GeckoDriverService; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import freemarker.cache.FileTemplateLoader; +import freemarker.template.Configuration; +import freemarker.template.Template; +import freemarker.template.TemplateException; +import freemarker.template.Version; +import io.github.bonigarcia.wdm.WebDriverManager; +import liquibase.repackaged.org.apache.commons.lang3.SystemUtils; + +/** + * This class contains methods that allow Collect Earth to open browser windows + * that allow the user to have a better understanding of the plot. So far there + * are integrations with Google Earth Engine, Google Earth Engine Timelapse and + * Bing Maps. When a user clicks on a plot Collect Earth will check if the + * program is set to open any of these integrations, and if it is so it will + * open each one in its own window. These windows are closed when the program + * is closed. + *s + * @author Alfonso Sanchez-Paus Diaz + * + */ +@Component +public class BrowserService implements InitializingBean, Observer { + + + @Autowired + private LocalPropertiesService localPropertiesService; + + @Autowired + private GeolocalizeMapService geoLocalizeTemplateService; + + @Autowired + private EarthSurveyService earthSurveyService; + + @Autowired + private CodeEditorHandlerThread codeEditorHandlerThread; + + private final ArrayList drivers = new ArrayList<>(); + private final Logger logger = LoggerFactory.getLogger(BrowserService.class); + private static final String TEMPLATE_FOR_DGMAP_JS = "resources/javascript_dgmap.fmt"; + private static final Configuration cfg = new Configuration(new Version("2.3.23")); + private RemoteWebDriver webDriverBing, webDriverBaidu, webDriverTimelapse, webDriverGeeCodeEditor, + webDriverHere, webDriverStreetView, webDriverYandex, webDriverPlanetHtml, webDriverExtraMap, webDriverSecureWatch, + webDriverGEEMap, webDriverEarthMap; + + + Map locks = new HashMap(); + + private static boolean geeMethodUpdated = false; + + private boolean isClosing = false; + + public void closeBrowsers() { + synchronized (this) { + getClosingBrowsersThread().start(); + } + } + + @Override + public void afterPropertiesSet() throws Exception { + Runtime.getRuntime().addShutdownHook(getClosingBrowsersThread()); + setGeckoDriverPath(); + } + + private RemoteWebDriver chooseDriver() throws BrowserNotFoundException { + RemoteWebDriver driver = null; + final String browserSetInProperties = localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim(); + + if (browserSetInProperties.equalsIgnoreCase(EarthConstants.CHROME_BROWSER)) { + driver = tryStartChrome(); + } else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.FIREFOX_BROWSER)) { + driver = tryStartFirefox(); + } else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.EDGE_BROWSER)) { + driver = tryStartEdge(); + }else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.SAFARI_BROWSER)) { + driver = tryStartSafari(); + } + + // If the browser chosen is not installed try to find and installed browser in the computer + if( driver== null ) { + driver = tryStartChrome(); + if( driver== null ) { + driver = tryStartFirefox(); + } + if( driver== null ) { + driver = tryStartEdge(); + } + if( driver== null ) { + driver = tryStartSafari(); + } + } + + if (driver == null) { + throw new BrowserNotFoundException( + "Neither Chrome nor Firefox could be opened. You need to have one of them installed in order to use GEE, Bing Maps or Saiku."); + } + + return driver; + } + + private RemoteWebDriver tryStartFirefox() { + RemoteWebDriver driver = null; + try { + driver = (RemoteWebDriver) WebDriverManager.firefoxdriver().create(); + } catch (final WebDriverException e) { + logger.warn( + "Problem starting Firefox browser!", + e); + } + return driver; + } + + private RemoteWebDriver tryStartEdge() { + RemoteWebDriver driver = null; + try { + driver = (RemoteWebDriver) WebDriverManager.edgedriver().create(); + } catch (final WebDriverException e) { + logger.warn( + "Problem starting Edge browser", + e); + } + return driver; + } + + private RemoteWebDriver tryStartSafari() { + RemoteWebDriver driver = null; + try { + driver = (RemoteWebDriver) WebDriverManager.safaridriver().create(); + } catch (final WebDriverException e) { + logger.warn( + "Problem starting Safari browser", + e); + } + return driver; + } + + private RemoteWebDriver tryStartChrome() { + RemoteWebDriver driver = null; + try { + driver = (RemoteWebDriver) WebDriverManager.chromedriver().create(); + } catch (final Exception e) { + logger.warn( + "Problem starting Chrome browser", + e); + } + return driver; + } + + + private String getDGMapJavascript(SimplePlacemarkObject placemarkObject) { + final Map data = geoLocalizeTemplateService.getPlacemarkData(placemarkObject); + data.put("latitude", placemarkObject.getCoord().getLatitude()); + data.put("longitude", placemarkObject.getCoord().getLongitude()); + return processJavascriptTemplate(data, TEMPLATE_FOR_DGMAP_JS); + } + + private String processJavascriptTemplate(final Map data, String templateName) { + Writer out; + String result = null; + try (StringWriter fw = new StringWriter();) { + // Load template from source folder + cfg.setTemplateLoader(new FileTemplateLoader(new File(System.getProperty("user.dir")))); + final Template template = cfg.getTemplate(templateName); + + // Console output + out = new BufferedWriter(fw); + + // Add date to avoid caching + template.process(data, out); + + out.flush(); + + result = fw.toString(); + + } catch (final TemplateException e) { + logger.error("Error when generating the javascript commands", e); + } catch (final IOException e) { + logger.error("Error when reading/writing the template information", e); + } + return result; + } + + private RemoteWebDriver initBrowser() throws BrowserNotFoundException { + RemoteWebDriver driver = null; + driver = chooseDriver(); + if (isClosing) { // In case the browser takes so long to start that the user closes CE and this + // method is called when the other windows are being closed + driver.quit(); + driver = null; + } else { + drivers.add(driver); + } + return driver; + } + + public static boolean isIdOrNamePresent(String elementId, RemoteWebDriver driver) { + boolean found = false; + + try { + if (driver.findElementById(elementId).isDisplayed() || driver.findElementByName(elementId).isDisplayed()) { + found = true; + } + } catch (final Exception e) { + // Not found + } + + return found; + } + + public static boolean isCssElementPresent(String cssElement, RemoteWebDriver driver) { + boolean found = false; + + try { + WebElement elementByCssSelector = driver.findElementByCssSelector(cssElement); + found = elementByCssSelector != null; + } catch (final Exception e) { + // Not found + } + + return found; + } + + private boolean isXPathPresent(String xpath, RemoteWebDriver driver) { + boolean found = false; + + try { + if (driver.findElementByXPath(xpath).isDisplayed()) { + found = true; + } + logger.debug(String.format("Found %s", xpath)); + } catch (final Exception e) { + logger.debug(String.format("Not Found %s", xpath)); + } + + return found; + } + + private boolean loadPlotInDGMap(SimplePlacemarkObject placemarkObject, RemoteWebDriver driver) { + + boolean success = true; + if (driver != null && waitFor("mainContent", driver) && driver instanceof JavascriptExecutor) { + try { + String dgmapJs = getDGMapJavascript(placemarkObject); + driver.executeScript(dgmapJs); + + Thread.sleep( 1000 ); + // Unlock the view if it is locked + if( isCssElementPresent(".lock.on", driver) ) { + driver.findElementByCssSelector(".lock.on").click(); // UNLOCK + } + + } catch (final Exception e) { + processSeleniumError(e); + success = false; + } + } + return success; + } + + public void clickOnElements(RemoteWebDriver driver, String cssSelector) { + final List dataLayerVisibility = driver.findElementsByCssSelector(cssSelector); + for (final WebElement webElement : dataLayerVisibility) { + if (webElement.isDisplayed()) { + webElement.click(); + } + } + } + + public static boolean isGeeMethodUpdated() { + return geeMethodUpdated; + } + + public static void setGeeMethodUpdated(boolean geeMethosUpdated) { + BrowserService.geeMethodUpdated = geeMethosUpdated; + } + + private void processSeleniumError(final Exception e) { + if (e.getCause() != null && e.getCause().getMessage() != null + && !e.getCause().getMessage().contains("latitude")) { + logger.warn("Error in the selenium driver", e); + } else { + logger.info("Error in the selenium driver provoked by known bug", e); + } + } + + public RemoteWebDriver navigateTo(String url, RemoteWebDriver driver) throws BrowserNotFoundException { + return navigateTo(url, driver, true); + } /** - * + * Loads the given URL into the browser. If the browser is null then a new + * browser window is open. + * + * @param url + * The URL to load. + * @param driverParam + * The browser window to use. If this value is null a new browser + * window is open. + * @param retry + * Specify if there should be a second try to open a browser window + * if the first time fails (useful if the browser could not be found) + * @return The browser window (firefox or chrome depending on the configuration) + * used to open the URL. + * @throws BrowserNotFoundException + * Exception thrown when there is no Firefox/Chrome installed */ - private static final long serialVersionUID = -404938492481063378L; + public RemoteWebDriver navigateTo(String url, RemoteWebDriver driverParam, boolean retry) + throws BrowserNotFoundException { + + RemoteWebDriver driver = driverParam; + + if (driver == null || !isDriverWorking(driver)) { + driver = initBrowser(); + } - public BrowserNotFoundException() { - super(); + if (driver != null) { + try { + driver.navigate().to(url); + } catch (final Exception e) { + if (retry && (e.getCause() != null && e.getCause().getMessage() != null + && e.getCause().getMessage().contains("Session not found"))) { + // Browser closed, restart it! + logger.error("Browser was closed, restaring it...", e); + driver = initBrowser(); + navigateTo(url, driver, false); // only try to re-open one + } + } + } else { + logger.error("No Selenium driver available, Is Firefox or Chrome installed?"); + } + return driver; } + protected boolean isDriverWorking(RemoteWebDriver driver) { + boolean stillWorking = true; + try { + driver.findElement(By.xpath("//body")); + } catch (Exception e) { + stillWorking = false; + } + return stillWorking; + } + + /** + * Opens a browser window with the Bing Maps representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openBingMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("BING"); + synchronized (lock) { + if (localPropertiesService.isBingMapsSupported()) { + try { + webDriverBing = navigateTo(geoLocalizeTemplateService + .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_BING_HTML_TEMPLATE, + "bingMapsKey", localPropertiesService.getValue(EarthProperty.BING_MAPS_KEY)) + .toString(), webDriverBing); + } catch (final Exception e) { + logger.error("Problems loading Bing", e); + } + } + } + } + + private Object getLock(String key) { + String lock = locks.get(key); + if( lock !=null ) { + return lock; + }else{ + locks.put(key, key); + return key; + } + } + + /** + * Opens a browser window with the Planet Basemaps representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openPlanetMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("PLANET"); + synchronized (lock) { + if (localPropertiesService.isPlanetMapsSupported()) { + + boolean monthly = localPropertiesService.isPlanetMapsMonthlyOpen(); + + String template = monthly ? GeolocalizeMapService.FREEMARKER_PLANET_NICFI_ARGUMENTS : GeolocalizeMapService.FREEMARKER_PLANET_DAILY_HTML_TEMPLATE; + String key = monthly ? localPropertiesService.getValue( EarthProperty.PLANET_MAPS_CE_KEY ) : localPropertiesService.getValue( EarthProperty.PLANET_MAPS_KEY ); + + try { + + String processTemplate = geoLocalizeTemplateService.getUrlToFreemarkerOutput( + placemarkObject, + template, + "planetMapsKey", + key, + "urlPlanetEndpointPrefix", + ServerController.getHostAddress(localPropertiesService.getHost(),localPropertiesService.getPort()) + ).toString(); + + String urlPlanet = null; + if( monthly ) { + + String parameters = FileUtils.readFileToString( new File( new URI( processTemplate ) ) , StandardCharsets.UTF_8 ); + + // remove new lines + parameters = parameters.replace("\n", "").replace("\r", "").replace("\t", "").replace(" ", ""); + // remove trailing commas + parameters = parameters.replace(",],", "],").replace("],]", "]]"); + + urlPlanet = localPropertiesService.getValue( EarthProperty.PLANET_NICFI_URL ) + parameters; + }else { + urlPlanet = processTemplate; + } + + webDriverPlanetHtml = navigateTo( urlPlanet, webDriverPlanetHtml ); + + } catch (final Exception e) { + logger.error("Problems loading Planet", e); + } + } + } + } + + /** + * Opens a browser window with the Baidu Maps representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openBaiduMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("BAIDU"); + synchronized (lock) { + if (localPropertiesService.isBaiduMapsSupported()) { + + try { + webDriverBaidu = navigateTo(geoLocalizeTemplateService + .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_BAIDU_HTML_TEMPLATE) + .toString(), webDriverBaidu); + } catch (final Exception e) { + logger.error("Problems loading Baidu", e); + } + } + } + } + + /** + * Opens a browser window with the Yandex Maps representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openYandexMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("YANDEX"); + synchronized (lock) { + if (localPropertiesService.isYandexMapsSupported()) { + try { + webDriverYandex = navigateTo(geoLocalizeTemplateService.getUrlToFreemarkerOutput(placemarkObject, + GeolocalizeMapService.FREEMARKER_YANDEX_HTML_TEMPLATE).toString(), webDriverYandex); + } catch (final Exception e) { + logger.error("Problems loading Yandex", e); + } + } + } + } + + /** + * Opens a browser window with a map representation of the plot in SecureWatch. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openSecureWatch(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("SECUREWATCH"); + synchronized (lock) { + if ( localPropertiesService.isSecureWatchSupported() ) { + String url = getUrlBaseIntegration(placemarkObject, localPropertiesService.getSecureWatchURL() + "/#18/LATITUDE/LONGITUDE" ); + webDriverSecureWatch = navigateTo(url, webDriverSecureWatch); + try { + logger.warn("Loading layers - {}", placemarkObject); + loadPlotInDGMap(placemarkObject, webDriverSecureWatch); + } catch (final Exception e) { + logger.error("Error when opening Secure Watch browser window", e); + } + } + } + } + + /** + * Opens a browser window with a map representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openExtraMap(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("EXTRA"); + synchronized (lock) { + if (!StringUtils.isBlank(localPropertiesService.getExtraMap())) { + webDriverExtraMap = navigateTo( getUrlBaseIntegration(placemarkObject, localPropertiesService.getExtraMap() ) , webDriverExtraMap ); + } + } + } + + private String getUrlBaseIntegration(SimplePlacemarkObject placemarkObject, String url) { + String temp = null; + try { + String latitude = placemarkObject.getCoord().getLatitude(); + String longitude = placemarkObject.getCoord().getLongitude(); + String id = placemarkObject.getPlacemarkId().split(",")[0]; // for cases where ID also has round, then + // the id string would be something like + // "plotId,round", we only want the ID + + temp = url.replace("LATITUDE", latitude).replace("LONGITUDE", longitude).replace("PLOT_ID", id); + + } catch (final Exception e) { + logger.error("Problems Getting the URL filling for " + url, e); + } + return temp; + } + + /** + * Opens a browser window with the Google Street View representation of the + * plot. + * https://www.google.com/maps/@43.7815661,11.1484876,3a,75y,210.23h,82.32t/data=!3m6!1e1!3m4!1sEz7NiCbaIYzTJkP_RMBiqw!2e0!7i13312!8i6656?hl=en + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openStreetView(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("STREET_VIEW"); + synchronized (lock) { + if (localPropertiesService.isStreetViewSupported()) { + try { + webDriverStreetView = navigateTo( + geoLocalizeTemplateService.getUrlToFreemarkerOutput(placemarkObject, + GeolocalizeMapService.FREEMARKER_STREET_VIEW_HTML_TEMPLATE, "googleMapsApiKey", + localPropertiesService.getValue(EarthProperty.GOOGLE_MAPS_API_KEY)).toString(), + webDriverStreetView); + } catch (final Exception e) { + logger.error("Problems loading Street View", e); + } + } + } + } + + /** + * Opens a browser window with the Here Maps representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openHereMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("HERE"); + synchronized (lock) { + if (localPropertiesService.isHereMapsSupported()) { + try { + webDriverHere = navigateTo(geoLocalizeTemplateService + .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_HERE_HTML_TEMPLATE, + "hereAppId", localPropertiesService.getValue(EarthProperty.HERE_MAPS_APP_ID), + "hereAppCode", localPropertiesService.getValue(EarthProperty.HERE_MAPS_APP_CODE)) + .toString(), webDriverHere); + } catch (final Exception e) { + logger.error("Problems loading Here Maps", e); + } + + } + } + } + + private StringBuilder getGeoJsonSegment(List coordinates) { + StringBuilder geoJson = new StringBuilder("["); + if (coordinates != null) { + for (SimpleCoordinate coord : coordinates) { + geoJson = geoJson.append("[").append(coord.getLongitude()).append(",").append(coord.getLatitude()) + .append("],"); + } + // remove last character + geoJson = geoJson.deleteCharAt(geoJson.length() - 1); + } + geoJson = geoJson.append("],"); + return geoJson; + } + + + + + private String getFeature(SimplePlacemarkObject placemarkObject, String shapeType, String name ) { + StringBuilder feature = new StringBuilder("{\"type\":\"Feature\",\"properties\":{\"name\":\"").append( name).append("\"},\"geometry\":"); + feature= feature.append( getGeoJson(placemarkObject, shapeType )).append("}"); + return feature.toString(); + } + + private String getGeoJson(SimplePlacemarkObject placemarkObject, String shapeType ) { + + StringBuilder geoJson = new StringBuilder("{\"type\":\"" ).append( shapeType).append("\",\"coordinates\":["); + List shape = placemarkObject.getShape(); + geoJson = geoJson.append(getGeoJsonSegment(shape)); + geoJson = geoJson.deleteCharAt(geoJson.length() - 1); + geoJson = geoJson.append("]}"); + return geoJson.toString(); + } + + /** + * Opens a browser window with the Google Earth Engine Code Editor and runs the + * freemarker template found in resources/eeCodeEditorScript.fmt on the main + * editor of GEE. + * + * @param placemarkObject + * The center point of the plot. + * @throws BrowserNotFoundException + * If the browser cannot be found + * + */ + public void openGEEAppURL(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("GEEAPP"); + synchronized (lock) { + if (localPropertiesService.isGEEAppSupported()) { + + try { + StringBuilder url = new StringBuilder(localPropertiesService.getGEEAppURL()); + url = url.append("#geoJson=") + .append(URLEncoder.encode(getGeoJson(placemarkObject, "MultiLineString"), StandardCharsets.UTF_8.toString())) + .append(";"); + url = url.append("plotId=") + .append(URLEncoder.encode(placemarkObject.getPlacemarkId(), StandardCharsets.UTF_8.toString())) + .append(";"); + url = url.append("survey=") + .append(URLEncoder.encode( earthSurveyService.getCollectSurvey().getName() , StandardCharsets.UTF_8.toString())) + .append(";"); + webDriverGEEMap = navigateTo(url.toString(), webDriverGEEMap); + webDriverGEEMap.navigate().refresh(); // FORCE REFRESH - OTHERWISE WINDOW IS NOT REFRESHED FOR SOME STRANGE REASON + } catch (final Exception e) { + logger.error("Problems loading GEE APP window", e); + } + } + } + } + + + public void openEarthMapURL(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("EARTH_MAP"); + synchronized (lock) { + if (localPropertiesService.isEarthMapSupported()) { + + + try { + StringBuilder url = new StringBuilder(localPropertiesService.getEarthMapURL()).append("?"); + url = url.append("polygon=") + .append(URLEncoder.encode(getFeature(placemarkObject, "Polygon", placemarkObject.getPlacemarkId()), StandardCharsets.UTF_8.toString())) + .append("&"); + + if( StringUtils.isNotBlank(localPropertiesService.getEarthMapLayers()) ) { + url = url.append("layers=") + .append(URLEncoder.encode(localPropertiesService.getEarthMapLayers(), StandardCharsets.UTF_8.toString())) + .append("&"); + } + + if( StringUtils.isNotBlank(localPropertiesService.getEarthMapScripts()) ) { + url = url.append("scripts=") + .append(URLEncoder.encode(localPropertiesService.getEarthMapScripts(), StandardCharsets.UTF_8.toString())) + .append("&"); + } + + String aoi = localPropertiesService.getEarthMapAOI(); + if( StringUtils.isBlank(aoi) ) { + aoi = "global"; + } + url = url.append("aoi=") + .append(URLEncoder.encode( aoi, StandardCharsets.UTF_8.toString() )) + .append("&embed=true"); // Set the EMBED parameter to true so that the user does not need to log in. + + webDriverEarthMap = navigateTo(url.toString(), webDriverEarthMap); + //Desktop.getDesktop().browse( new URI( url.toString() ) ); + //webDriverEarthMap.navigate().refresh(); // FORCE REFRESH - OTHERWISE WINDOW IS NOT REFRESHED FOR SOME STRANGE REASON + } catch (final Exception e) { + logger.error("Problems loading Earth Map window", e); + } + } + } + } + + /** + * Opens a browser window with the Google Earth Engine Code Editor and runs the + * freemarker template found in resources/eeCodeEditorScript.fmt on the main + * editor of GEE. + * + * @param placemarkObject + * The center point of the plot. + * @throws BrowserNotFoundException + * If the browser cannot be found + * + */ + public void openGEECodeEditor(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("CODE_EDITOR"); + synchronized (lock) { + if (localPropertiesService.isCodeEditorSupported()) { + + boolean firstOpening = false; + if (getWebDriverGeeCodeEditor() == null) { + setWebDriverGeeCodeEditor(initBrowser()); + firstOpening = true; + } + + if (firstOpening && (liquibase.repackaged.org.apache.commons.lang3.SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX)) { + codeEditorHandlerThread.disableCodeEditorAutocomplete(getWebDriverGeeCodeEditor()); + } + + codeEditorHandlerThread.loadCodeEditorScript(placemarkObject, getWebDriverGeeCodeEditor()); + } + } + } + + + /** + * Opens a browser window with the Google Earth Engine Timelapse representation + * of the plot. + * + * @param placemarkObject + * The center point of the plot. + * @throws BrowserNotFoundException + * If the browser cannot be found + * + */ + public void openTimelapse(final SimplePlacemarkObject placemarkObject) + throws BrowserNotFoundException { + Object lock = getLock("TIMELAPSE"); + synchronized (lock) { + if (localPropertiesService.isTimelapseSupported()) { + try { + String coordinates = placemarkObject.getCoord().toString(); + webDriverTimelapse = navigateTo( + "https://earthengine.google.org/timelapse/timelapseplayer_v2.html?timelapseclient=http://earthengine.google.org/timelapse/data&v=" + + coordinates + ",10.812,latLng&t=0.08", + webDriverTimelapse); + } catch (final Exception e) { + logger.error("Problems loading Timelapse", e); + } + } + } + } + + private void setGeckoDriverPath() { + String geckoDriverPath = ""; + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { + geckoDriverPath = "resources/geckodriver_mac"; + } else if (SystemUtils.IS_OS_UNIX) { + if (System.getProperty("os.arch").contains("64") + || System.getProperty("sun.arch.data.model").equals("64")) { + geckoDriverPath = "resources/geckodriver_64"; + } else { + geckoDriverPath = "resources/geckodriver_32"; + } + } else if (SystemUtils.IS_OS_WINDOWS) { + try { + if (System.getProperty("os.arch").contains("64") + || System.getProperty("sun.arch.data.model").equals("64")) + geckoDriverPath = "resources/geckodriver_64.exe"; + else + geckoDriverPath = "resources/geckodriver_32.exe"; + } catch (Exception e) { + geckoDriverPath = "resources/geckodriver_64.exe"; + } + } else { + throw new IllegalArgumentException("Geckodriver is not supported in the current OS"); + } + + File geckoDriverFile = new File(geckoDriverPath); + + // if above property is not working or not opening the application in browser + // then try below property + System.setProperty(GeckoDriverService.GECKO_DRIVER_EXE_PROPERTY, geckoDriverFile.getAbsolutePath()); + System.setProperty(FirefoxDriver.SystemProperty.DRIVER_USE_MARIONETTE, "true"); + + } + + public boolean waitFor(String elementId, RemoteWebDriver driver) { + int i = 0; + while (!isIdOrNamePresent(elementId, driver)) { + try { + Thread.sleep(1000); + } catch (final InterruptedException e) { + return false; + } + i++; + if (i > 60) { + return false; + } + } + return true; + } + + public boolean waitForXPath(String xpath, RemoteWebDriver driver) { + int i = 0; + while (!isXPathPresent(xpath, driver)) { + try { + Thread.sleep(1000); + } catch (final InterruptedException e) { + return false; + + } + i++; + if (i > 30) { + return false; + } + } + return true; + } + + private Thread getClosingBrowsersThread() { + + return new Thread("Quit the open browsers") { + @Override + public void run() { + isClosing = true; + CopyOnWriteArrayList driversCopy = new CopyOnWriteArrayList<>(drivers); + for (Iterator iterator = driversCopy.iterator(); iterator.hasNext();) { + RemoteWebDriver remoteWebDriver = iterator.next(); + try { + remoteWebDriver.quit(); + } catch (final Exception e) { + logger.error("Error quitting the browser", e); + } + } + + } + }; + } - public BrowserNotFoundException(String message, Throwable cause) { - super(message, cause); + @Override + public void update(Observable o, Object arg) { + if (ServerInitializationEvent.SERVER_STOPPED_EVENT.equals(arg)) { + this.closeBrowsers(); + } } - public BrowserNotFoundException(String message) { - super(message); + private RemoteWebDriver getWebDriverGeeCodeEditor() { + return webDriverGeeCodeEditor; } - public BrowserNotFoundException(Throwable cause) { - super(cause); + protected void setWebDriverGeeCodeEditor(RemoteWebDriver webDriverGeeCodeEditor) { + this.webDriverGeeCodeEditor = webDriverGeeCodeEditor; } - } From 4107b7f84a03f1bb3450e41ad727d76ebfead316 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:01 +0100 Subject: [PATCH 1032/1620] New translations BrowserService.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 905 +++++++++++++++++- 1 file changed, 893 insertions(+), 12 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 6570688ad6..5a933d094d 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,28 +1,909 @@ package org.openforis.collect.earth.app.service; -public class BrowserNotFoundException extends Exception{ +import java.io.BufferedWriter; +import java.io.File; +import java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; +import java.net.URI; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Observable; +import java.util.Observer; +import java.util.concurrent.CopyOnWriteArrayList; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.desktop.ServerController.ServerInitializationEvent; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.sampler.model.SimpleCoordinate; +import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; +import org.openqa.selenium.By; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.WebDriverException; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.firefox.GeckoDriverService; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import freemarker.cache.FileTemplateLoader; +import freemarker.template.Configuration; +import freemarker.template.Template; +import freemarker.template.TemplateException; +import freemarker.template.Version; +import io.github.bonigarcia.wdm.WebDriverManager; +import liquibase.repackaged.org.apache.commons.lang3.SystemUtils; + +/** + * This class contains methods that allow Collect Earth to open browser windows + * that allow the user to have a better understanding of the plot. So far there + * are integrations with Google Earth Engine, Google Earth Engine Timelapse and + * Bing Maps. When a user clicks on a plot Collect Earth will check if the + * program is set to open any of these integrations, and if it is so it will + * open each one in its own window. These windows are closed when the program + * is closed. + *s + * @author Alfonso Sanchez-Paus Diaz + * + */ +@Component +public class BrowserService implements InitializingBean, Observer { + + + @Autowired + private LocalPropertiesService localPropertiesService; + + @Autowired + private GeolocalizeMapService geoLocalizeTemplateService; + + @Autowired + private EarthSurveyService earthSurveyService; + + @Autowired + private CodeEditorHandlerThread codeEditorHandlerThread; + + private final ArrayList drivers = new ArrayList<>(); + private final Logger logger = LoggerFactory.getLogger(BrowserService.class); + private static final String TEMPLATE_FOR_DGMAP_JS = "resources/javascript_dgmap.fmt"; + private static final Configuration cfg = new Configuration(new Version("2.3.23")); + private RemoteWebDriver webDriverBing, webDriverBaidu, webDriverTimelapse, webDriverGeeCodeEditor, + webDriverHere, webDriverStreetView, webDriverYandex, webDriverPlanetHtml, webDriverExtraMap, webDriverSecureWatch, + webDriverGEEMap, webDriverEarthMap; + + + Map locks = new HashMap(); + + private static boolean geeMethodUpdated = false; + + private boolean isClosing = false; + + public void closeBrowsers() { + synchronized (this) { + getClosingBrowsersThread().start(); + } + } + + @Override + public void afterPropertiesSet() throws Exception { + Runtime.getRuntime().addShutdownHook(getClosingBrowsersThread()); + setGeckoDriverPath(); + } + + private RemoteWebDriver chooseDriver() throws BrowserNotFoundException { + RemoteWebDriver driver = null; + final String browserSetInProperties = localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim(); + + if (browserSetInProperties.equalsIgnoreCase(EarthConstants.CHROME_BROWSER)) { + driver = tryStartChrome(); + } else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.FIREFOX_BROWSER)) { + driver = tryStartFirefox(); + } else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.EDGE_BROWSER)) { + driver = tryStartEdge(); + }else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.SAFARI_BROWSER)) { + driver = tryStartSafari(); + } + + // If the browser chosen is not installed try to find and installed browser in the computer + if( driver== null ) { + driver = tryStartChrome(); + if( driver== null ) { + driver = tryStartFirefox(); + } + if( driver== null ) { + driver = tryStartEdge(); + } + if( driver== null ) { + driver = tryStartSafari(); + } + } + + if (driver == null) { + throw new BrowserNotFoundException( + "Neither Chrome nor Firefox could be opened. You need to have one of them installed in order to use GEE, Bing Maps or Saiku."); + } + + return driver; + } + + private RemoteWebDriver tryStartFirefox() { + RemoteWebDriver driver = null; + try { + driver = (RemoteWebDriver) WebDriverManager.firefoxdriver().create(); + } catch (final WebDriverException e) { + logger.warn( + "Problem starting Firefox browser!", + e); + } + return driver; + } + + private RemoteWebDriver tryStartEdge() { + RemoteWebDriver driver = null; + try { + driver = (RemoteWebDriver) WebDriverManager.edgedriver().create(); + } catch (final WebDriverException e) { + logger.warn( + "Problem starting Edge browser", + e); + } + return driver; + } + + private RemoteWebDriver tryStartSafari() { + RemoteWebDriver driver = null; + try { + driver = (RemoteWebDriver) WebDriverManager.safaridriver().create(); + } catch (final WebDriverException e) { + logger.warn( + "Problem starting Safari browser", + e); + } + return driver; + } + + private RemoteWebDriver tryStartChrome() { + RemoteWebDriver driver = null; + try { + driver = (RemoteWebDriver) WebDriverManager.chromedriver().create(); + } catch (final Exception e) { + logger.warn( + "Problem starting Chrome browser", + e); + } + return driver; + } + + + private String getDGMapJavascript(SimplePlacemarkObject placemarkObject) { + final Map data = geoLocalizeTemplateService.getPlacemarkData(placemarkObject); + data.put("latitude", placemarkObject.getCoord().getLatitude()); + data.put("longitude", placemarkObject.getCoord().getLongitude()); + return processJavascriptTemplate(data, TEMPLATE_FOR_DGMAP_JS); + } + + private String processJavascriptTemplate(final Map data, String templateName) { + Writer out; + String result = null; + try (StringWriter fw = new StringWriter();) { + // Load template from source folder + cfg.setTemplateLoader(new FileTemplateLoader(new File(System.getProperty("user.dir")))); + final Template template = cfg.getTemplate(templateName); + + // Console output + out = new BufferedWriter(fw); + + // Add date to avoid caching + template.process(data, out); + + out.flush(); + + result = fw.toString(); + + } catch (final TemplateException e) { + logger.error("Error when generating the javascript commands", e); + } catch (final IOException e) { + logger.error("Error when reading/writing the template information", e); + } + return result; + } + + private RemoteWebDriver initBrowser() throws BrowserNotFoundException { + RemoteWebDriver driver = null; + driver = chooseDriver(); + if (isClosing) { // In case the browser takes so long to start that the user closes CE and this + // method is called when the other windows are being closed + driver.quit(); + driver = null; + } else { + drivers.add(driver); + } + return driver; + } + + public static boolean isIdOrNamePresent(String elementId, RemoteWebDriver driver) { + boolean found = false; + + try { + if (driver.findElementById(elementId).isDisplayed() || driver.findElementByName(elementId).isDisplayed()) { + found = true; + } + } catch (final Exception e) { + // Not found + } + + return found; + } + + public static boolean isCssElementPresent(String cssElement, RemoteWebDriver driver) { + boolean found = false; + + try { + WebElement elementByCssSelector = driver.findElementByCssSelector(cssElement); + found = elementByCssSelector != null; + } catch (final Exception e) { + // Not found + } + + return found; + } + + private boolean isXPathPresent(String xpath, RemoteWebDriver driver) { + boolean found = false; + + try { + if (driver.findElementByXPath(xpath).isDisplayed()) { + found = true; + } + logger.debug(String.format("Found %s", xpath)); + } catch (final Exception e) { + logger.debug(String.format("Not Found %s", xpath)); + } + + return found; + } + + private boolean loadPlotInDGMap(SimplePlacemarkObject placemarkObject, RemoteWebDriver driver) { + + boolean success = true; + if (driver != null && waitFor("mainContent", driver) && driver instanceof JavascriptExecutor) { + try { + String dgmapJs = getDGMapJavascript(placemarkObject); + driver.executeScript(dgmapJs); + + Thread.sleep( 1000 ); + // Unlock the view if it is locked + if( isCssElementPresent(".lock.on", driver) ) { + driver.findElementByCssSelector(".lock.on").click(); // UNLOCK + } + + } catch (final Exception e) { + processSeleniumError(e); + success = false; + } + } + return success; + } + + public void clickOnElements(RemoteWebDriver driver, String cssSelector) { + final List dataLayerVisibility = driver.findElementsByCssSelector(cssSelector); + for (final WebElement webElement : dataLayerVisibility) { + if (webElement.isDisplayed()) { + webElement.click(); + } + } + } + + public static boolean isGeeMethodUpdated() { + return geeMethodUpdated; + } + + public static void setGeeMethodUpdated(boolean geeMethosUpdated) { + BrowserService.geeMethodUpdated = geeMethosUpdated; + } + + private void processSeleniumError(final Exception e) { + if (e.getCause() != null && e.getCause().getMessage() != null + && !e.getCause().getMessage().contains("latitude")) { + logger.warn("Error in the selenium driver", e); + } else { + logger.info("Error in the selenium driver provoked by known bug", e); + } + } + + public RemoteWebDriver navigateTo(String url, RemoteWebDriver driver) throws BrowserNotFoundException { + return navigateTo(url, driver, true); + } /** - * + * Loads the given URL into the browser. If the browser is null then a new + * browser window is open. + * + * @param url + * The URL to load. + * @param driverParam + * The browser window to use. If this value is null a new browser + * window is open. + * @param retry + * Specify if there should be a second try to open a browser window + * if the first time fails (useful if the browser could not be found) + * @return The browser window (firefox or chrome depending on the configuration) + * used to open the URL. + * @throws BrowserNotFoundException + * Exception thrown when there is no Firefox/Chrome installed */ - private static final long serialVersionUID = -404938492481063378L; + public RemoteWebDriver navigateTo(String url, RemoteWebDriver driverParam, boolean retry) + throws BrowserNotFoundException { + + RemoteWebDriver driver = driverParam; + + if (driver == null || !isDriverWorking(driver)) { + driver = initBrowser(); + } - public BrowserNotFoundException() { - super(); + if (driver != null) { + try { + driver.navigate().to(url); + } catch (final Exception e) { + if (retry && (e.getCause() != null && e.getCause().getMessage() != null + && e.getCause().getMessage().contains("Session not found"))) { + // Browser closed, restart it! + logger.error("Browser was closed, restaring it...", e); + driver = initBrowser(); + navigateTo(url, driver, false); // only try to re-open one + } + } + } else { + logger.error("No Selenium driver available, Is Firefox or Chrome installed?"); + } + return driver; } + protected boolean isDriverWorking(RemoteWebDriver driver) { + boolean stillWorking = true; + try { + driver.findElement(By.xpath("//body")); + } catch (Exception e) { + stillWorking = false; + } + return stillWorking; + } + + /** + * Opens a browser window with the Bing Maps representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openBingMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("BING"); + synchronized (lock) { + if (localPropertiesService.isBingMapsSupported()) { + try { + webDriverBing = navigateTo(geoLocalizeTemplateService + .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_BING_HTML_TEMPLATE, + "bingMapsKey", localPropertiesService.getValue(EarthProperty.BING_MAPS_KEY)) + .toString(), webDriverBing); + } catch (final Exception e) { + logger.error("Problems loading Bing", e); + } + } + } + } + + private Object getLock(String key) { + String lock = locks.get(key); + if( lock !=null ) { + return lock; + }else{ + locks.put(key, key); + return key; + } + } + + /** + * Opens a browser window with the Planet Basemaps representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openPlanetMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("PLANET"); + synchronized (lock) { + if (localPropertiesService.isPlanetMapsSupported()) { + + boolean monthly = localPropertiesService.isPlanetMapsMonthlyOpen(); + + String template = monthly ? GeolocalizeMapService.FREEMARKER_PLANET_NICFI_ARGUMENTS : GeolocalizeMapService.FREEMARKER_PLANET_DAILY_HTML_TEMPLATE; + String key = monthly ? localPropertiesService.getValue( EarthProperty.PLANET_MAPS_CE_KEY ) : localPropertiesService.getValue( EarthProperty.PLANET_MAPS_KEY ); + + try { + + String processTemplate = geoLocalizeTemplateService.getUrlToFreemarkerOutput( + placemarkObject, + template, + "planetMapsKey", + key, + "urlPlanetEndpointPrefix", + ServerController.getHostAddress(localPropertiesService.getHost(),localPropertiesService.getPort()) + ).toString(); + + String urlPlanet = null; + if( monthly ) { + + String parameters = FileUtils.readFileToString( new File( new URI( processTemplate ) ) , StandardCharsets.UTF_8 ); + + // remove new lines + parameters = parameters.replace("\n", "").replace("\r", "").replace("\t", "").replace(" ", ""); + // remove trailing commas + parameters = parameters.replace(",],", "],").replace("],]", "]]"); + + urlPlanet = localPropertiesService.getValue( EarthProperty.PLANET_NICFI_URL ) + parameters; + }else { + urlPlanet = processTemplate; + } + + webDriverPlanetHtml = navigateTo( urlPlanet, webDriverPlanetHtml ); + + } catch (final Exception e) { + logger.error("Problems loading Planet", e); + } + } + } + } + + /** + * Opens a browser window with the Baidu Maps representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openBaiduMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("BAIDU"); + synchronized (lock) { + if (localPropertiesService.isBaiduMapsSupported()) { + + try { + webDriverBaidu = navigateTo(geoLocalizeTemplateService + .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_BAIDU_HTML_TEMPLATE) + .toString(), webDriverBaidu); + } catch (final Exception e) { + logger.error("Problems loading Baidu", e); + } + } + } + } + + /** + * Opens a browser window with the Yandex Maps representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openYandexMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("YANDEX"); + synchronized (lock) { + if (localPropertiesService.isYandexMapsSupported()) { + try { + webDriverYandex = navigateTo(geoLocalizeTemplateService.getUrlToFreemarkerOutput(placemarkObject, + GeolocalizeMapService.FREEMARKER_YANDEX_HTML_TEMPLATE).toString(), webDriverYandex); + } catch (final Exception e) { + logger.error("Problems loading Yandex", e); + } + } + } + } + + /** + * Opens a browser window with a map representation of the plot in SecureWatch. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openSecureWatch(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("SECUREWATCH"); + synchronized (lock) { + if ( localPropertiesService.isSecureWatchSupported() ) { + String url = getUrlBaseIntegration(placemarkObject, localPropertiesService.getSecureWatchURL() + "/#18/LATITUDE/LONGITUDE" ); + webDriverSecureWatch = navigateTo(url, webDriverSecureWatch); + try { + logger.warn("Loading layers - {}", placemarkObject); + loadPlotInDGMap(placemarkObject, webDriverSecureWatch); + } catch (final Exception e) { + logger.error("Error when opening Secure Watch browser window", e); + } + } + } + } + + /** + * Opens a browser window with a map representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openExtraMap(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("EXTRA"); + synchronized (lock) { + if (!StringUtils.isBlank(localPropertiesService.getExtraMap())) { + webDriverExtraMap = navigateTo( getUrlBaseIntegration(placemarkObject, localPropertiesService.getExtraMap() ) , webDriverExtraMap ); + } + } + } + + private String getUrlBaseIntegration(SimplePlacemarkObject placemarkObject, String url) { + String temp = null; + try { + String latitude = placemarkObject.getCoord().getLatitude(); + String longitude = placemarkObject.getCoord().getLongitude(); + String id = placemarkObject.getPlacemarkId().split(",")[0]; // for cases where ID also has round, then + // the id string would be something like + // "plotId,round", we only want the ID + + temp = url.replace("LATITUDE", latitude).replace("LONGITUDE", longitude).replace("PLOT_ID", id); + + } catch (final Exception e) { + logger.error("Problems Getting the URL filling for " + url, e); + } + return temp; + } + + /** + * Opens a browser window with the Google Street View representation of the + * plot. + * https://www.google.com/maps/@43.7815661,11.1484876,3a,75y,210.23h,82.32t/data=!3m6!1e1!3m4!1sEz7NiCbaIYzTJkP_RMBiqw!2e0!7i13312!8i6656?hl=en + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openStreetView(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("STREET_VIEW"); + synchronized (lock) { + if (localPropertiesService.isStreetViewSupported()) { + try { + webDriverStreetView = navigateTo( + geoLocalizeTemplateService.getUrlToFreemarkerOutput(placemarkObject, + GeolocalizeMapService.FREEMARKER_STREET_VIEW_HTML_TEMPLATE, "googleMapsApiKey", + localPropertiesService.getValue(EarthProperty.GOOGLE_MAPS_API_KEY)).toString(), + webDriverStreetView); + } catch (final Exception e) { + logger.error("Problems loading Street View", e); + } + } + } + } + + /** + * Opens a browser window with the Here Maps representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openHereMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("HERE"); + synchronized (lock) { + if (localPropertiesService.isHereMapsSupported()) { + try { + webDriverHere = navigateTo(geoLocalizeTemplateService + .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_HERE_HTML_TEMPLATE, + "hereAppId", localPropertiesService.getValue(EarthProperty.HERE_MAPS_APP_ID), + "hereAppCode", localPropertiesService.getValue(EarthProperty.HERE_MAPS_APP_CODE)) + .toString(), webDriverHere); + } catch (final Exception e) { + logger.error("Problems loading Here Maps", e); + } + + } + } + } + + private StringBuilder getGeoJsonSegment(List coordinates) { + StringBuilder geoJson = new StringBuilder("["); + if (coordinates != null) { + for (SimpleCoordinate coord : coordinates) { + geoJson = geoJson.append("[").append(coord.getLongitude()).append(",").append(coord.getLatitude()) + .append("],"); + } + // remove last character + geoJson = geoJson.deleteCharAt(geoJson.length() - 1); + } + geoJson = geoJson.append("],"); + return geoJson; + } + + + + + private String getFeature(SimplePlacemarkObject placemarkObject, String shapeType, String name ) { + StringBuilder feature = new StringBuilder("{\"type\":\"Feature\",\"properties\":{\"name\":\"").append( name).append("\"},\"geometry\":"); + feature= feature.append( getGeoJson(placemarkObject, shapeType )).append("}"); + return feature.toString(); + } + + private String getGeoJson(SimplePlacemarkObject placemarkObject, String shapeType ) { + + StringBuilder geoJson = new StringBuilder("{\"type\":\"" ).append( shapeType).append("\",\"coordinates\":["); + List shape = placemarkObject.getShape(); + geoJson = geoJson.append(getGeoJsonSegment(shape)); + geoJson = geoJson.deleteCharAt(geoJson.length() - 1); + geoJson = geoJson.append("]}"); + return geoJson.toString(); + } + + /** + * Opens a browser window with the Google Earth Engine Code Editor and runs the + * freemarker template found in resources/eeCodeEditorScript.fmt on the main + * editor of GEE. + * + * @param placemarkObject + * The center point of the plot. + * @throws BrowserNotFoundException + * If the browser cannot be found + * + */ + public void openGEEAppURL(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("GEEAPP"); + synchronized (lock) { + if (localPropertiesService.isGEEAppSupported()) { + + try { + StringBuilder url = new StringBuilder(localPropertiesService.getGEEAppURL()); + url = url.append("#geoJson=") + .append(URLEncoder.encode(getGeoJson(placemarkObject, "MultiLineString"), StandardCharsets.UTF_8.toString())) + .append(";"); + url = url.append("plotId=") + .append(URLEncoder.encode(placemarkObject.getPlacemarkId(), StandardCharsets.UTF_8.toString())) + .append(";"); + url = url.append("survey=") + .append(URLEncoder.encode( earthSurveyService.getCollectSurvey().getName() , StandardCharsets.UTF_8.toString())) + .append(";"); + webDriverGEEMap = navigateTo(url.toString(), webDriverGEEMap); + webDriverGEEMap.navigate().refresh(); // FORCE REFRESH - OTHERWISE WINDOW IS NOT REFRESHED FOR SOME STRANGE REASON + } catch (final Exception e) { + logger.error("Problems loading GEE APP window", e); + } + } + } + } + + + public void openEarthMapURL(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("EARTH_MAP"); + synchronized (lock) { + if (localPropertiesService.isEarthMapSupported()) { + + + try { + StringBuilder url = new StringBuilder(localPropertiesService.getEarthMapURL()).append("?"); + url = url.append("polygon=") + .append(URLEncoder.encode(getFeature(placemarkObject, "Polygon", placemarkObject.getPlacemarkId()), StandardCharsets.UTF_8.toString())) + .append("&"); + + if( StringUtils.isNotBlank(localPropertiesService.getEarthMapLayers()) ) { + url = url.append("layers=") + .append(URLEncoder.encode(localPropertiesService.getEarthMapLayers(), StandardCharsets.UTF_8.toString())) + .append("&"); + } + + if( StringUtils.isNotBlank(localPropertiesService.getEarthMapScripts()) ) { + url = url.append("scripts=") + .append(URLEncoder.encode(localPropertiesService.getEarthMapScripts(), StandardCharsets.UTF_8.toString())) + .append("&"); + } + + String aoi = localPropertiesService.getEarthMapAOI(); + if( StringUtils.isBlank(aoi) ) { + aoi = "global"; + } + url = url.append("aoi=") + .append(URLEncoder.encode( aoi, StandardCharsets.UTF_8.toString() )) + .append("&embed=true"); // Set the EMBED parameter to true so that the user does not need to log in. + + webDriverEarthMap = navigateTo(url.toString(), webDriverEarthMap); + //Desktop.getDesktop().browse( new URI( url.toString() ) ); + //webDriverEarthMap.navigate().refresh(); // FORCE REFRESH - OTHERWISE WINDOW IS NOT REFRESHED FOR SOME STRANGE REASON + } catch (final Exception e) { + logger.error("Problems loading Earth Map window", e); + } + } + } + } + + /** + * Opens a browser window with the Google Earth Engine Code Editor and runs the + * freemarker template found in resources/eeCodeEditorScript.fmt on the main + * editor of GEE. + * + * @param placemarkObject + * The center point of the plot. + * @throws BrowserNotFoundException + * If the browser cannot be found + * + */ + public void openGEECodeEditor(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("CODE_EDITOR"); + synchronized (lock) { + if (localPropertiesService.isCodeEditorSupported()) { + + boolean firstOpening = false; + if (getWebDriverGeeCodeEditor() == null) { + setWebDriverGeeCodeEditor(initBrowser()); + firstOpening = true; + } + + if (firstOpening && (liquibase.repackaged.org.apache.commons.lang3.SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX)) { + codeEditorHandlerThread.disableCodeEditorAutocomplete(getWebDriverGeeCodeEditor()); + } + + codeEditorHandlerThread.loadCodeEditorScript(placemarkObject, getWebDriverGeeCodeEditor()); + } + } + } + + + /** + * Opens a browser window with the Google Earth Engine Timelapse representation + * of the plot. + * + * @param placemarkObject + * The center point of the plot. + * @throws BrowserNotFoundException + * If the browser cannot be found + * + */ + public void openTimelapse(final SimplePlacemarkObject placemarkObject) + throws BrowserNotFoundException { + Object lock = getLock("TIMELAPSE"); + synchronized (lock) { + if (localPropertiesService.isTimelapseSupported()) { + try { + String coordinates = placemarkObject.getCoord().toString(); + webDriverTimelapse = navigateTo( + "https://earthengine.google.org/timelapse/timelapseplayer_v2.html?timelapseclient=http://earthengine.google.org/timelapse/data&v=" + + coordinates + ",10.812,latLng&t=0.08", + webDriverTimelapse); + } catch (final Exception e) { + logger.error("Problems loading Timelapse", e); + } + } + } + } + + private void setGeckoDriverPath() { + String geckoDriverPath = ""; + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { + geckoDriverPath = "resources/geckodriver_mac"; + } else if (SystemUtils.IS_OS_UNIX) { + if (System.getProperty("os.arch").contains("64") + || System.getProperty("sun.arch.data.model").equals("64")) { + geckoDriverPath = "resources/geckodriver_64"; + } else { + geckoDriverPath = "resources/geckodriver_32"; + } + } else if (SystemUtils.IS_OS_WINDOWS) { + try { + if (System.getProperty("os.arch").contains("64") + || System.getProperty("sun.arch.data.model").equals("64")) + geckoDriverPath = "resources/geckodriver_64.exe"; + else + geckoDriverPath = "resources/geckodriver_32.exe"; + } catch (Exception e) { + geckoDriverPath = "resources/geckodriver_64.exe"; + } + } else { + throw new IllegalArgumentException("Geckodriver is not supported in the current OS"); + } + + File geckoDriverFile = new File(geckoDriverPath); + + // if above property is not working or not opening the application in browser + // then try below property + System.setProperty(GeckoDriverService.GECKO_DRIVER_EXE_PROPERTY, geckoDriverFile.getAbsolutePath()); + System.setProperty(FirefoxDriver.SystemProperty.DRIVER_USE_MARIONETTE, "true"); + + } + + public boolean waitFor(String elementId, RemoteWebDriver driver) { + int i = 0; + while (!isIdOrNamePresent(elementId, driver)) { + try { + Thread.sleep(1000); + } catch (final InterruptedException e) { + return false; + } + i++; + if (i > 60) { + return false; + } + } + return true; + } + + public boolean waitForXPath(String xpath, RemoteWebDriver driver) { + int i = 0; + while (!isXPathPresent(xpath, driver)) { + try { + Thread.sleep(1000); + } catch (final InterruptedException e) { + return false; + + } + i++; + if (i > 30) { + return false; + } + } + return true; + } + + private Thread getClosingBrowsersThread() { + + return new Thread("Quit the open browsers") { + @Override + public void run() { + isClosing = true; + CopyOnWriteArrayList driversCopy = new CopyOnWriteArrayList<>(drivers); + for (Iterator iterator = driversCopy.iterator(); iterator.hasNext();) { + RemoteWebDriver remoteWebDriver = iterator.next(); + try { + remoteWebDriver.quit(); + } catch (final Exception e) { + logger.error("Error quitting the browser", e); + } + } + + } + }; + } - public BrowserNotFoundException(String message, Throwable cause) { - super(message, cause); + @Override + public void update(Observable o, Object arg) { + if (ServerInitializationEvent.SERVER_STOPPED_EVENT.equals(arg)) { + this.closeBrowsers(); + } } - public BrowserNotFoundException(String message) { - super(message); + private RemoteWebDriver getWebDriverGeeCodeEditor() { + return webDriverGeeCodeEditor; } - public BrowserNotFoundException(Throwable cause) { - super(cause); + protected void setWebDriverGeeCodeEditor(RemoteWebDriver webDriverGeeCodeEditor) { + this.webDriverGeeCodeEditor = webDriverGeeCodeEditor; } - } From 72f1008c1050f0e53176a83ac2eee70d4d4293f9 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:03 +0100 Subject: [PATCH 1033/1620] New translations BrowserService.java (English) --- .../earth/app/view/Messages_en.properties | 905 +++++++++++++++++- 1 file changed, 893 insertions(+), 12 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 6570688ad6..5a933d094d 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,28 +1,909 @@ package org.openforis.collect.earth.app.service; -public class BrowserNotFoundException extends Exception{ +import java.io.BufferedWriter; +import java.io.File; +import java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; +import java.net.URI; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Observable; +import java.util.Observer; +import java.util.concurrent.CopyOnWriteArrayList; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.desktop.ServerController.ServerInitializationEvent; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.sampler.model.SimpleCoordinate; +import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; +import org.openqa.selenium.By; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.WebDriverException; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.firefox.GeckoDriverService; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import freemarker.cache.FileTemplateLoader; +import freemarker.template.Configuration; +import freemarker.template.Template; +import freemarker.template.TemplateException; +import freemarker.template.Version; +import io.github.bonigarcia.wdm.WebDriverManager; +import liquibase.repackaged.org.apache.commons.lang3.SystemUtils; + +/** + * This class contains methods that allow Collect Earth to open browser windows + * that allow the user to have a better understanding of the plot. So far there + * are integrations with Google Earth Engine, Google Earth Engine Timelapse and + * Bing Maps. When a user clicks on a plot Collect Earth will check if the + * program is set to open any of these integrations, and if it is so it will + * open each one in its own window. These windows are closed when the program + * is closed. + *s + * @author Alfonso Sanchez-Paus Diaz + * + */ +@Component +public class BrowserService implements InitializingBean, Observer { + + + @Autowired + private LocalPropertiesService localPropertiesService; + + @Autowired + private GeolocalizeMapService geoLocalizeTemplateService; + + @Autowired + private EarthSurveyService earthSurveyService; + + @Autowired + private CodeEditorHandlerThread codeEditorHandlerThread; + + private final ArrayList drivers = new ArrayList<>(); + private final Logger logger = LoggerFactory.getLogger(BrowserService.class); + private static final String TEMPLATE_FOR_DGMAP_JS = "resources/javascript_dgmap.fmt"; + private static final Configuration cfg = new Configuration(new Version("2.3.23")); + private RemoteWebDriver webDriverBing, webDriverBaidu, webDriverTimelapse, webDriverGeeCodeEditor, + webDriverHere, webDriverStreetView, webDriverYandex, webDriverPlanetHtml, webDriverExtraMap, webDriverSecureWatch, + webDriverGEEMap, webDriverEarthMap; + + + Map locks = new HashMap(); + + private static boolean geeMethodUpdated = false; + + private boolean isClosing = false; + + public void closeBrowsers() { + synchronized (this) { + getClosingBrowsersThread().start(); + } + } + + @Override + public void afterPropertiesSet() throws Exception { + Runtime.getRuntime().addShutdownHook(getClosingBrowsersThread()); + setGeckoDriverPath(); + } + + private RemoteWebDriver chooseDriver() throws BrowserNotFoundException { + RemoteWebDriver driver = null; + final String browserSetInProperties = localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim(); + + if (browserSetInProperties.equalsIgnoreCase(EarthConstants.CHROME_BROWSER)) { + driver = tryStartChrome(); + } else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.FIREFOX_BROWSER)) { + driver = tryStartFirefox(); + } else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.EDGE_BROWSER)) { + driver = tryStartEdge(); + }else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.SAFARI_BROWSER)) { + driver = tryStartSafari(); + } + + // If the browser chosen is not installed try to find and installed browser in the computer + if( driver== null ) { + driver = tryStartChrome(); + if( driver== null ) { + driver = tryStartFirefox(); + } + if( driver== null ) { + driver = tryStartEdge(); + } + if( driver== null ) { + driver = tryStartSafari(); + } + } + + if (driver == null) { + throw new BrowserNotFoundException( + "Neither Chrome nor Firefox could be opened. You need to have one of them installed in order to use GEE, Bing Maps or Saiku."); + } + + return driver; + } + + private RemoteWebDriver tryStartFirefox() { + RemoteWebDriver driver = null; + try { + driver = (RemoteWebDriver) WebDriverManager.firefoxdriver().create(); + } catch (final WebDriverException e) { + logger.warn( + "Problem starting Firefox browser!", + e); + } + return driver; + } + + private RemoteWebDriver tryStartEdge() { + RemoteWebDriver driver = null; + try { + driver = (RemoteWebDriver) WebDriverManager.edgedriver().create(); + } catch (final WebDriverException e) { + logger.warn( + "Problem starting Edge browser", + e); + } + return driver; + } + + private RemoteWebDriver tryStartSafari() { + RemoteWebDriver driver = null; + try { + driver = (RemoteWebDriver) WebDriverManager.safaridriver().create(); + } catch (final WebDriverException e) { + logger.warn( + "Problem starting Safari browser", + e); + } + return driver; + } + + private RemoteWebDriver tryStartChrome() { + RemoteWebDriver driver = null; + try { + driver = (RemoteWebDriver) WebDriverManager.chromedriver().create(); + } catch (final Exception e) { + logger.warn( + "Problem starting Chrome browser", + e); + } + return driver; + } + + + private String getDGMapJavascript(SimplePlacemarkObject placemarkObject) { + final Map data = geoLocalizeTemplateService.getPlacemarkData(placemarkObject); + data.put("latitude", placemarkObject.getCoord().getLatitude()); + data.put("longitude", placemarkObject.getCoord().getLongitude()); + return processJavascriptTemplate(data, TEMPLATE_FOR_DGMAP_JS); + } + + private String processJavascriptTemplate(final Map data, String templateName) { + Writer out; + String result = null; + try (StringWriter fw = new StringWriter();) { + // Load template from source folder + cfg.setTemplateLoader(new FileTemplateLoader(new File(System.getProperty("user.dir")))); + final Template template = cfg.getTemplate(templateName); + + // Console output + out = new BufferedWriter(fw); + + // Add date to avoid caching + template.process(data, out); + + out.flush(); + + result = fw.toString(); + + } catch (final TemplateException e) { + logger.error("Error when generating the javascript commands", e); + } catch (final IOException e) { + logger.error("Error when reading/writing the template information", e); + } + return result; + } + + private RemoteWebDriver initBrowser() throws BrowserNotFoundException { + RemoteWebDriver driver = null; + driver = chooseDriver(); + if (isClosing) { // In case the browser takes so long to start that the user closes CE and this + // method is called when the other windows are being closed + driver.quit(); + driver = null; + } else { + drivers.add(driver); + } + return driver; + } + + public static boolean isIdOrNamePresent(String elementId, RemoteWebDriver driver) { + boolean found = false; + + try { + if (driver.findElementById(elementId).isDisplayed() || driver.findElementByName(elementId).isDisplayed()) { + found = true; + } + } catch (final Exception e) { + // Not found + } + + return found; + } + + public static boolean isCssElementPresent(String cssElement, RemoteWebDriver driver) { + boolean found = false; + + try { + WebElement elementByCssSelector = driver.findElementByCssSelector(cssElement); + found = elementByCssSelector != null; + } catch (final Exception e) { + // Not found + } + + return found; + } + + private boolean isXPathPresent(String xpath, RemoteWebDriver driver) { + boolean found = false; + + try { + if (driver.findElementByXPath(xpath).isDisplayed()) { + found = true; + } + logger.debug(String.format("Found %s", xpath)); + } catch (final Exception e) { + logger.debug(String.format("Not Found %s", xpath)); + } + + return found; + } + + private boolean loadPlotInDGMap(SimplePlacemarkObject placemarkObject, RemoteWebDriver driver) { + + boolean success = true; + if (driver != null && waitFor("mainContent", driver) && driver instanceof JavascriptExecutor) { + try { + String dgmapJs = getDGMapJavascript(placemarkObject); + driver.executeScript(dgmapJs); + + Thread.sleep( 1000 ); + // Unlock the view if it is locked + if( isCssElementPresent(".lock.on", driver) ) { + driver.findElementByCssSelector(".lock.on").click(); // UNLOCK + } + + } catch (final Exception e) { + processSeleniumError(e); + success = false; + } + } + return success; + } + + public void clickOnElements(RemoteWebDriver driver, String cssSelector) { + final List dataLayerVisibility = driver.findElementsByCssSelector(cssSelector); + for (final WebElement webElement : dataLayerVisibility) { + if (webElement.isDisplayed()) { + webElement.click(); + } + } + } + + public static boolean isGeeMethodUpdated() { + return geeMethodUpdated; + } + + public static void setGeeMethodUpdated(boolean geeMethosUpdated) { + BrowserService.geeMethodUpdated = geeMethosUpdated; + } + + private void processSeleniumError(final Exception e) { + if (e.getCause() != null && e.getCause().getMessage() != null + && !e.getCause().getMessage().contains("latitude")) { + logger.warn("Error in the selenium driver", e); + } else { + logger.info("Error in the selenium driver provoked by known bug", e); + } + } + + public RemoteWebDriver navigateTo(String url, RemoteWebDriver driver) throws BrowserNotFoundException { + return navigateTo(url, driver, true); + } /** - * + * Loads the given URL into the browser. If the browser is null then a new + * browser window is open. + * + * @param url + * The URL to load. + * @param driverParam + * The browser window to use. If this value is null a new browser + * window is open. + * @param retry + * Specify if there should be a second try to open a browser window + * if the first time fails (useful if the browser could not be found) + * @return The browser window (firefox or chrome depending on the configuration) + * used to open the URL. + * @throws BrowserNotFoundException + * Exception thrown when there is no Firefox/Chrome installed */ - private static final long serialVersionUID = -404938492481063378L; + public RemoteWebDriver navigateTo(String url, RemoteWebDriver driverParam, boolean retry) + throws BrowserNotFoundException { + + RemoteWebDriver driver = driverParam; + + if (driver == null || !isDriverWorking(driver)) { + driver = initBrowser(); + } - public BrowserNotFoundException() { - super(); + if (driver != null) { + try { + driver.navigate().to(url); + } catch (final Exception e) { + if (retry && (e.getCause() != null && e.getCause().getMessage() != null + && e.getCause().getMessage().contains("Session not found"))) { + // Browser closed, restart it! + logger.error("Browser was closed, restaring it...", e); + driver = initBrowser(); + navigateTo(url, driver, false); // only try to re-open one + } + } + } else { + logger.error("No Selenium driver available, Is Firefox or Chrome installed?"); + } + return driver; } + protected boolean isDriverWorking(RemoteWebDriver driver) { + boolean stillWorking = true; + try { + driver.findElement(By.xpath("//body")); + } catch (Exception e) { + stillWorking = false; + } + return stillWorking; + } + + /** + * Opens a browser window with the Bing Maps representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openBingMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("BING"); + synchronized (lock) { + if (localPropertiesService.isBingMapsSupported()) { + try { + webDriverBing = navigateTo(geoLocalizeTemplateService + .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_BING_HTML_TEMPLATE, + "bingMapsKey", localPropertiesService.getValue(EarthProperty.BING_MAPS_KEY)) + .toString(), webDriverBing); + } catch (final Exception e) { + logger.error("Problems loading Bing", e); + } + } + } + } + + private Object getLock(String key) { + String lock = locks.get(key); + if( lock !=null ) { + return lock; + }else{ + locks.put(key, key); + return key; + } + } + + /** + * Opens a browser window with the Planet Basemaps representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openPlanetMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("PLANET"); + synchronized (lock) { + if (localPropertiesService.isPlanetMapsSupported()) { + + boolean monthly = localPropertiesService.isPlanetMapsMonthlyOpen(); + + String template = monthly ? GeolocalizeMapService.FREEMARKER_PLANET_NICFI_ARGUMENTS : GeolocalizeMapService.FREEMARKER_PLANET_DAILY_HTML_TEMPLATE; + String key = monthly ? localPropertiesService.getValue( EarthProperty.PLANET_MAPS_CE_KEY ) : localPropertiesService.getValue( EarthProperty.PLANET_MAPS_KEY ); + + try { + + String processTemplate = geoLocalizeTemplateService.getUrlToFreemarkerOutput( + placemarkObject, + template, + "planetMapsKey", + key, + "urlPlanetEndpointPrefix", + ServerController.getHostAddress(localPropertiesService.getHost(),localPropertiesService.getPort()) + ).toString(); + + String urlPlanet = null; + if( monthly ) { + + String parameters = FileUtils.readFileToString( new File( new URI( processTemplate ) ) , StandardCharsets.UTF_8 ); + + // remove new lines + parameters = parameters.replace("\n", "").replace("\r", "").replace("\t", "").replace(" ", ""); + // remove trailing commas + parameters = parameters.replace(",],", "],").replace("],]", "]]"); + + urlPlanet = localPropertiesService.getValue( EarthProperty.PLANET_NICFI_URL ) + parameters; + }else { + urlPlanet = processTemplate; + } + + webDriverPlanetHtml = navigateTo( urlPlanet, webDriverPlanetHtml ); + + } catch (final Exception e) { + logger.error("Problems loading Planet", e); + } + } + } + } + + /** + * Opens a browser window with the Baidu Maps representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openBaiduMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("BAIDU"); + synchronized (lock) { + if (localPropertiesService.isBaiduMapsSupported()) { + + try { + webDriverBaidu = navigateTo(geoLocalizeTemplateService + .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_BAIDU_HTML_TEMPLATE) + .toString(), webDriverBaidu); + } catch (final Exception e) { + logger.error("Problems loading Baidu", e); + } + } + } + } + + /** + * Opens a browser window with the Yandex Maps representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openYandexMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("YANDEX"); + synchronized (lock) { + if (localPropertiesService.isYandexMapsSupported()) { + try { + webDriverYandex = navigateTo(geoLocalizeTemplateService.getUrlToFreemarkerOutput(placemarkObject, + GeolocalizeMapService.FREEMARKER_YANDEX_HTML_TEMPLATE).toString(), webDriverYandex); + } catch (final Exception e) { + logger.error("Problems loading Yandex", e); + } + } + } + } + + /** + * Opens a browser window with a map representation of the plot in SecureWatch. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openSecureWatch(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("SECUREWATCH"); + synchronized (lock) { + if ( localPropertiesService.isSecureWatchSupported() ) { + String url = getUrlBaseIntegration(placemarkObject, localPropertiesService.getSecureWatchURL() + "/#18/LATITUDE/LONGITUDE" ); + webDriverSecureWatch = navigateTo(url, webDriverSecureWatch); + try { + logger.warn("Loading layers - {}", placemarkObject); + loadPlotInDGMap(placemarkObject, webDriverSecureWatch); + } catch (final Exception e) { + logger.error("Error when opening Secure Watch browser window", e); + } + } + } + } + + /** + * Opens a browser window with a map representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openExtraMap(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("EXTRA"); + synchronized (lock) { + if (!StringUtils.isBlank(localPropertiesService.getExtraMap())) { + webDriverExtraMap = navigateTo( getUrlBaseIntegration(placemarkObject, localPropertiesService.getExtraMap() ) , webDriverExtraMap ); + } + } + } + + private String getUrlBaseIntegration(SimplePlacemarkObject placemarkObject, String url) { + String temp = null; + try { + String latitude = placemarkObject.getCoord().getLatitude(); + String longitude = placemarkObject.getCoord().getLongitude(); + String id = placemarkObject.getPlacemarkId().split(",")[0]; // for cases where ID also has round, then + // the id string would be something like + // "plotId,round", we only want the ID + + temp = url.replace("LATITUDE", latitude).replace("LONGITUDE", longitude).replace("PLOT_ID", id); + + } catch (final Exception e) { + logger.error("Problems Getting the URL filling for " + url, e); + } + return temp; + } + + /** + * Opens a browser window with the Google Street View representation of the + * plot. + * https://www.google.com/maps/@43.7815661,11.1484876,3a,75y,210.23h,82.32t/data=!3m6!1e1!3m4!1sEz7NiCbaIYzTJkP_RMBiqw!2e0!7i13312!8i6656?hl=en + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openStreetView(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("STREET_VIEW"); + synchronized (lock) { + if (localPropertiesService.isStreetViewSupported()) { + try { + webDriverStreetView = navigateTo( + geoLocalizeTemplateService.getUrlToFreemarkerOutput(placemarkObject, + GeolocalizeMapService.FREEMARKER_STREET_VIEW_HTML_TEMPLATE, "googleMapsApiKey", + localPropertiesService.getValue(EarthProperty.GOOGLE_MAPS_API_KEY)).toString(), + webDriverStreetView); + } catch (final Exception e) { + logger.error("Problems loading Street View", e); + } + } + } + } + + /** + * Opens a browser window with the Here Maps representation of the plot. + * + * @param placemarkObject + * The data of the plot. + * @throws BrowserNotFoundException + * In case the browser could not be found + * + */ + public void openHereMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("HERE"); + synchronized (lock) { + if (localPropertiesService.isHereMapsSupported()) { + try { + webDriverHere = navigateTo(geoLocalizeTemplateService + .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_HERE_HTML_TEMPLATE, + "hereAppId", localPropertiesService.getValue(EarthProperty.HERE_MAPS_APP_ID), + "hereAppCode", localPropertiesService.getValue(EarthProperty.HERE_MAPS_APP_CODE)) + .toString(), webDriverHere); + } catch (final Exception e) { + logger.error("Problems loading Here Maps", e); + } + + } + } + } + + private StringBuilder getGeoJsonSegment(List coordinates) { + StringBuilder geoJson = new StringBuilder("["); + if (coordinates != null) { + for (SimpleCoordinate coord : coordinates) { + geoJson = geoJson.append("[").append(coord.getLongitude()).append(",").append(coord.getLatitude()) + .append("],"); + } + // remove last character + geoJson = geoJson.deleteCharAt(geoJson.length() - 1); + } + geoJson = geoJson.append("],"); + return geoJson; + } + + + + + private String getFeature(SimplePlacemarkObject placemarkObject, String shapeType, String name ) { + StringBuilder feature = new StringBuilder("{\"type\":\"Feature\",\"properties\":{\"name\":\"").append( name).append("\"},\"geometry\":"); + feature= feature.append( getGeoJson(placemarkObject, shapeType )).append("}"); + return feature.toString(); + } + + private String getGeoJson(SimplePlacemarkObject placemarkObject, String shapeType ) { + + StringBuilder geoJson = new StringBuilder("{\"type\":\"" ).append( shapeType).append("\",\"coordinates\":["); + List shape = placemarkObject.getShape(); + geoJson = geoJson.append(getGeoJsonSegment(shape)); + geoJson = geoJson.deleteCharAt(geoJson.length() - 1); + geoJson = geoJson.append("]}"); + return geoJson.toString(); + } + + /** + * Opens a browser window with the Google Earth Engine Code Editor and runs the + * freemarker template found in resources/eeCodeEditorScript.fmt on the main + * editor of GEE. + * + * @param placemarkObject + * The center point of the plot. + * @throws BrowserNotFoundException + * If the browser cannot be found + * + */ + public void openGEEAppURL(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("GEEAPP"); + synchronized (lock) { + if (localPropertiesService.isGEEAppSupported()) { + + try { + StringBuilder url = new StringBuilder(localPropertiesService.getGEEAppURL()); + url = url.append("#geoJson=") + .append(URLEncoder.encode(getGeoJson(placemarkObject, "MultiLineString"), StandardCharsets.UTF_8.toString())) + .append(";"); + url = url.append("plotId=") + .append(URLEncoder.encode(placemarkObject.getPlacemarkId(), StandardCharsets.UTF_8.toString())) + .append(";"); + url = url.append("survey=") + .append(URLEncoder.encode( earthSurveyService.getCollectSurvey().getName() , StandardCharsets.UTF_8.toString())) + .append(";"); + webDriverGEEMap = navigateTo(url.toString(), webDriverGEEMap); + webDriverGEEMap.navigate().refresh(); // FORCE REFRESH - OTHERWISE WINDOW IS NOT REFRESHED FOR SOME STRANGE REASON + } catch (final Exception e) { + logger.error("Problems loading GEE APP window", e); + } + } + } + } + + + public void openEarthMapURL(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("EARTH_MAP"); + synchronized (lock) { + if (localPropertiesService.isEarthMapSupported()) { + + + try { + StringBuilder url = new StringBuilder(localPropertiesService.getEarthMapURL()).append("?"); + url = url.append("polygon=") + .append(URLEncoder.encode(getFeature(placemarkObject, "Polygon", placemarkObject.getPlacemarkId()), StandardCharsets.UTF_8.toString())) + .append("&"); + + if( StringUtils.isNotBlank(localPropertiesService.getEarthMapLayers()) ) { + url = url.append("layers=") + .append(URLEncoder.encode(localPropertiesService.getEarthMapLayers(), StandardCharsets.UTF_8.toString())) + .append("&"); + } + + if( StringUtils.isNotBlank(localPropertiesService.getEarthMapScripts()) ) { + url = url.append("scripts=") + .append(URLEncoder.encode(localPropertiesService.getEarthMapScripts(), StandardCharsets.UTF_8.toString())) + .append("&"); + } + + String aoi = localPropertiesService.getEarthMapAOI(); + if( StringUtils.isBlank(aoi) ) { + aoi = "global"; + } + url = url.append("aoi=") + .append(URLEncoder.encode( aoi, StandardCharsets.UTF_8.toString() )) + .append("&embed=true"); // Set the EMBED parameter to true so that the user does not need to log in. + + webDriverEarthMap = navigateTo(url.toString(), webDriverEarthMap); + //Desktop.getDesktop().browse( new URI( url.toString() ) ); + //webDriverEarthMap.navigate().refresh(); // FORCE REFRESH - OTHERWISE WINDOW IS NOT REFRESHED FOR SOME STRANGE REASON + } catch (final Exception e) { + logger.error("Problems loading Earth Map window", e); + } + } + } + } + + /** + * Opens a browser window with the Google Earth Engine Code Editor and runs the + * freemarker template found in resources/eeCodeEditorScript.fmt on the main + * editor of GEE. + * + * @param placemarkObject + * The center point of the plot. + * @throws BrowserNotFoundException + * If the browser cannot be found + * + */ + public void openGEECodeEditor(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { + Object lock = getLock("CODE_EDITOR"); + synchronized (lock) { + if (localPropertiesService.isCodeEditorSupported()) { + + boolean firstOpening = false; + if (getWebDriverGeeCodeEditor() == null) { + setWebDriverGeeCodeEditor(initBrowser()); + firstOpening = true; + } + + if (firstOpening && (liquibase.repackaged.org.apache.commons.lang3.SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX)) { + codeEditorHandlerThread.disableCodeEditorAutocomplete(getWebDriverGeeCodeEditor()); + } + + codeEditorHandlerThread.loadCodeEditorScript(placemarkObject, getWebDriverGeeCodeEditor()); + } + } + } + + + /** + * Opens a browser window with the Google Earth Engine Timelapse representation + * of the plot. + * + * @param placemarkObject + * The center point of the plot. + * @throws BrowserNotFoundException + * If the browser cannot be found + * + */ + public void openTimelapse(final SimplePlacemarkObject placemarkObject) + throws BrowserNotFoundException { + Object lock = getLock("TIMELAPSE"); + synchronized (lock) { + if (localPropertiesService.isTimelapseSupported()) { + try { + String coordinates = placemarkObject.getCoord().toString(); + webDriverTimelapse = navigateTo( + "https://earthengine.google.org/timelapse/timelapseplayer_v2.html?timelapseclient=http://earthengine.google.org/timelapse/data&v=" + + coordinates + ",10.812,latLng&t=0.08", + webDriverTimelapse); + } catch (final Exception e) { + logger.error("Problems loading Timelapse", e); + } + } + } + } + + private void setGeckoDriverPath() { + String geckoDriverPath = ""; + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { + geckoDriverPath = "resources/geckodriver_mac"; + } else if (SystemUtils.IS_OS_UNIX) { + if (System.getProperty("os.arch").contains("64") + || System.getProperty("sun.arch.data.model").equals("64")) { + geckoDriverPath = "resources/geckodriver_64"; + } else { + geckoDriverPath = "resources/geckodriver_32"; + } + } else if (SystemUtils.IS_OS_WINDOWS) { + try { + if (System.getProperty("os.arch").contains("64") + || System.getProperty("sun.arch.data.model").equals("64")) + geckoDriverPath = "resources/geckodriver_64.exe"; + else + geckoDriverPath = "resources/geckodriver_32.exe"; + } catch (Exception e) { + geckoDriverPath = "resources/geckodriver_64.exe"; + } + } else { + throw new IllegalArgumentException("Geckodriver is not supported in the current OS"); + } + + File geckoDriverFile = new File(geckoDriverPath); + + // if above property is not working or not opening the application in browser + // then try below property + System.setProperty(GeckoDriverService.GECKO_DRIVER_EXE_PROPERTY, geckoDriverFile.getAbsolutePath()); + System.setProperty(FirefoxDriver.SystemProperty.DRIVER_USE_MARIONETTE, "true"); + + } + + public boolean waitFor(String elementId, RemoteWebDriver driver) { + int i = 0; + while (!isIdOrNamePresent(elementId, driver)) { + try { + Thread.sleep(1000); + } catch (final InterruptedException e) { + return false; + } + i++; + if (i > 60) { + return false; + } + } + return true; + } + + public boolean waitForXPath(String xpath, RemoteWebDriver driver) { + int i = 0; + while (!isXPathPresent(xpath, driver)) { + try { + Thread.sleep(1000); + } catch (final InterruptedException e) { + return false; + + } + i++; + if (i > 30) { + return false; + } + } + return true; + } + + private Thread getClosingBrowsersThread() { + + return new Thread("Quit the open browsers") { + @Override + public void run() { + isClosing = true; + CopyOnWriteArrayList driversCopy = new CopyOnWriteArrayList<>(drivers); + for (Iterator iterator = driversCopy.iterator(); iterator.hasNext();) { + RemoteWebDriver remoteWebDriver = iterator.next(); + try { + remoteWebDriver.quit(); + } catch (final Exception e) { + logger.error("Error quitting the browser", e); + } + } + + } + }; + } - public BrowserNotFoundException(String message, Throwable cause) { - super(message, cause); + @Override + public void update(Observable o, Object arg) { + if (ServerInitializationEvent.SERVER_STOPPED_EVENT.equals(arg)) { + this.closeBrowsers(); + } } - public BrowserNotFoundException(String message) { - super(message); + private RemoteWebDriver getWebDriverGeeCodeEditor() { + return webDriverGeeCodeEditor; } - public BrowserNotFoundException(Throwable cause) { - super(cause); + protected void setWebDriverGeeCodeEditor(RemoteWebDriver webDriverGeeCodeEditor) { + this.webDriverGeeCodeEditor = webDriverGeeCodeEditor; } - } From 47cc53c3b742e934b368b49f933b6d95c051ca17 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:04 +0100 Subject: [PATCH 1034/1620] New translations CodeEditorHandlerThread.java (French) --- .../earth/app/view/Messages_fr.properties | 1012 ++++------------- 1 file changed, 211 insertions(+), 801 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 5a933d094d..c2259f5db0 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,909 +1,319 @@ package org.openforis.collect.earth.app.service; -import java.io.BufferedWriter; +import java.awt.Toolkit; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.StringSelection; import java.io.File; import java.io.IOException; -import java.io.StringWriter; -import java.io.Writer; -import java.net.URI; -import java.net.URLEncoder; +import java.net.URISyntaxException; +import java.net.URL; import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Observable; -import java.util.Observer; -import java.util.concurrent.CopyOnWriteArrayList; +import java.util.NoSuchElementException; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.desktop.ServerController; -import org.openforis.collect.earth.app.desktop.ServerController.ServerInitializationEvent; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.sampler.model.SimpleCoordinate; import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; import org.openqa.selenium.By; import org.openqa.selenium.JavascriptExecutor; -import org.openqa.selenium.WebDriverException; +import org.openqa.selenium.Keys; import org.openqa.selenium.WebElement; -import org.openqa.selenium.firefox.FirefoxDriver; -import org.openqa.selenium.firefox.GeckoDriverService; import org.openqa.selenium.remote.RemoteWebDriver; +import org.openqa.selenium.remote.RemoteWebElement; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import freemarker.cache.FileTemplateLoader; -import freemarker.template.Configuration; -import freemarker.template.Template; -import freemarker.template.TemplateException; -import freemarker.template.Version; -import io.github.bonigarcia.wdm.WebDriverManager; import liquibase.repackaged.org.apache.commons.lang3.SystemUtils; -/** - * This class contains methods that allow Collect Earth to open browser windows - * that allow the user to have a better understanding of the plot. So far there - * are integrations with Google Earth Engine, Google Earth Engine Timelapse and - * Bing Maps. When a user clicks on a plot Collect Earth will check if the - * program is set to open any of these integrations, and if it is so it will - * open each one in its own window. These windows are closed when the program - * is closed. - *s - * @author Alfonso Sanchez-Paus Diaz - * - */ + @Component -public class BrowserService implements InitializingBean, Observer { +public class CodeEditorHandlerThread { + private static final String RUN_SCRIPT_BUTTON = "button.run-button"; + private static final String RESET_SCRIPT_BUTTON = "button.reset-button"; + private SimplePlacemarkObject placemarkObject; + private RemoteWebDriver webDriverGee; @Autowired - private LocalPropertiesService localPropertiesService; + private BrowserService browserService; + private Logger logger = LoggerFactory.getLogger(CodeEditorHandlerThread.class); @Autowired private GeolocalizeMapService geoLocalizeTemplateService; @Autowired - private EarthSurveyService earthSurveyService; - - @Autowired - private CodeEditorHandlerThread codeEditorHandlerThread; - - private final ArrayList drivers = new ArrayList<>(); - private final Logger logger = LoggerFactory.getLogger(BrowserService.class); - private static final String TEMPLATE_FOR_DGMAP_JS = "resources/javascript_dgmap.fmt"; - private static final Configuration cfg = new Configuration(new Version("2.3.23")); - private RemoteWebDriver webDriverBing, webDriverBaidu, webDriverTimelapse, webDriverGeeCodeEditor, - webDriverHere, webDriverStreetView, webDriverYandex, webDriverPlanetHtml, webDriverExtraMap, webDriverSecureWatch, - webDriverGEEMap, webDriverEarthMap; - - - Map locks = new HashMap(); - - private static boolean geeMethodUpdated = false; - - private boolean isClosing = false; - - public void closeBrowsers() { - synchronized (this) { - getClosingBrowsersThread().start(); - } - } - - @Override - public void afterPropertiesSet() throws Exception { - Runtime.getRuntime().addShutdownHook(getClosingBrowsersThread()); - setGeckoDriverPath(); - } - - private RemoteWebDriver chooseDriver() throws BrowserNotFoundException { - RemoteWebDriver driver = null; - final String browserSetInProperties = localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim(); - - if (browserSetInProperties.equalsIgnoreCase(EarthConstants.CHROME_BROWSER)) { - driver = tryStartChrome(); - } else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.FIREFOX_BROWSER)) { - driver = tryStartFirefox(); - } else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.EDGE_BROWSER)) { - driver = tryStartEdge(); - }else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.SAFARI_BROWSER)) { - driver = tryStartSafari(); - } - - // If the browser chosen is not installed try to find and installed browser in the computer - if( driver== null ) { - driver = tryStartChrome(); - if( driver== null ) { - driver = tryStartFirefox(); - } - if( driver== null ) { - driver = tryStartEdge(); - } - if( driver== null ) { - driver = tryStartSafari(); - } - } - - if (driver == null) { - throw new BrowserNotFoundException( - "Neither Chrome nor Firefox could be opened. You need to have one of them installed in order to use GEE, Bing Maps or Saiku."); - } - - return driver; - } - - private RemoteWebDriver tryStartFirefox() { - RemoteWebDriver driver = null; - try { - driver = (RemoteWebDriver) WebDriverManager.firefoxdriver().create(); - } catch (final WebDriverException e) { - logger.warn( - "Problem starting Firefox browser!", - e); - } - return driver; - } - - private RemoteWebDriver tryStartEdge() { - RemoteWebDriver driver = null; - try { - driver = (RemoteWebDriver) WebDriverManager.edgedriver().create(); - } catch (final WebDriverException e) { - logger.warn( - "Problem starting Edge browser", - e); - } - return driver; - } - - private RemoteWebDriver tryStartSafari() { - RemoteWebDriver driver = null; - try { - driver = (RemoteWebDriver) WebDriverManager.safaridriver().create(); - } catch (final WebDriverException e) { - logger.warn( - "Problem starting Safari browser", - e); - } - return driver; - } - - private RemoteWebDriver tryStartChrome() { - RemoteWebDriver driver = null; - try { - driver = (RemoteWebDriver) WebDriverManager.chromedriver().create(); - } catch (final Exception e) { - logger.warn( - "Problem starting Chrome browser", - e); - } - return driver; - } - + private LocalPropertiesService localPropertiesService; - private String getDGMapJavascript(SimplePlacemarkObject placemarkObject) { - final Map data = geoLocalizeTemplateService.getPlacemarkData(placemarkObject); - data.put("latitude", placemarkObject.getCoord().getLatitude()); - data.put("longitude", placemarkObject.getCoord().getLongitude()); - return processJavascriptTemplate(data, TEMPLATE_FOR_DGMAP_JS); + public boolean isCodeEditorShowing() { + return BrowserService.isCssElementPresent(RUN_SCRIPT_BUTTON, webDriverGee); } - private String processJavascriptTemplate(final Map data, String templateName) { - Writer out; - String result = null; - try (StringWriter fw = new StringWriter();) { - // Load template from source folder - cfg.setTemplateLoader(new FileTemplateLoader(new File(System.getProperty("user.dir")))); - final Template template = cfg.getTemplate(templateName); + public void runScript() throws IOException, URISyntaxException, InterruptedException { - // Console output - out = new BufferedWriter(fw); - - // Add date to avoid caching - template.process(data, out); - - out.flush(); - - result = fw.toString(); - - } catch (final TemplateException e) { - logger.error("Error when generating the javascript commands", e); - } catch (final IOException e) { - logger.error("Error when reading/writing the template information", e); - } - return result; - } - - private RemoteWebDriver initBrowser() throws BrowserNotFoundException { - RemoteWebDriver driver = null; - driver = chooseDriver(); - if (isClosing) { // In case the browser takes so long to start that the user closes CE and this - // method is called when the other windows are being closed - driver.quit(); - driver = null; - } else { - drivers.add(driver); - } - return driver; - } - - public static boolean isIdOrNamePresent(String elementId, RemoteWebDriver driver) { - boolean found = false; try { - if (driver.findElementById(elementId).isDisplayed() || driver.findElementByName(elementId).isDisplayed()) { - found = true; - } - } catch (final Exception e) { - // Not found - } + WebElement resetButton = webDriverGee.findElementByCssSelector(RESET_SCRIPT_BUTTON); - return found; - } + forceClick( resetButton ); - public static boolean isCssElementPresent(String cssElement, RemoteWebDriver driver) { - boolean found = false; + URL fileWithScript = geoLocalizeTemplateService.getTemporaryUrl(placemarkObject, getGeeCodeEditorTemplate()); - try { - WebElement elementByCssSelector = driver.findElementByCssSelector(cssElement); - found = elementByCssSelector != null; - } catch (final Exception e) { - // Not found - } + WebElement textArea = webDriverGee.findElement(By.className("ace_text-input")); - return found; - } - - private boolean isXPathPresent(String xpath, RemoteWebDriver driver) { - boolean found = false; - - try { - if (driver.findElementByXPath(xpath).isDisplayed()) { - found = true; - } - logger.debug(String.format("Found %s", xpath)); - } catch (final Exception e) { - logger.debug(String.format("Not Found %s", xpath)); - } + String contents = FileUtils.readFileToString(new File(fileWithScript.toURI()), StandardCharsets.UTF_8 ); - return found; - } + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { + sendThroughKeys(textArea, contents); - private boolean loadPlotInDGMap(SimplePlacemarkObject placemarkObject, RemoteWebDriver driver) { - - boolean success = true; - if (driver != null && waitFor("mainContent", driver) && driver instanceof JavascriptExecutor) { - try { - String dgmapJs = getDGMapJavascript(placemarkObject); - driver.executeScript(dgmapJs); + } else { + sendThroughClipboard(textArea, contents); + try { + // Fix bug provoked by antivirus not accepting the control characters sent by Selenium + WebElement element = webDriverGee.findElement(By.className("ace_line") ); + if( element!= null && element.getAttribute("value").trim().equals("av") ) { + sendThroughKeys(textArea, contents); + } + } catch (Exception e) { + logger.warn("Error while refreshing code editor", e); - Thread.sleep( 1000 ); - // Unlock the view if it is locked - if( isCssElementPresent(".lock.on", driver) ) { - driver.findElementByCssSelector(".lock.on").click(); // UNLOCK } - - } catch (final Exception e) { - processSeleniumError(e); - success = false; - } - } - return success; - } - - public void clickOnElements(RemoteWebDriver driver, String cssSelector) { - final List dataLayerVisibility = driver.findElementsByCssSelector(cssSelector); - for (final WebElement webElement : dataLayerVisibility) { - if (webElement.isDisplayed()) { - webElement.click(); } - } - } - - public static boolean isGeeMethodUpdated() { - return geeMethodUpdated; - } - public static void setGeeMethodUpdated(boolean geeMethosUpdated) { - BrowserService.geeMethodUpdated = geeMethosUpdated; - } - - private void processSeleniumError(final Exception e) { - if (e.getCause() != null && e.getCause().getMessage() != null - && !e.getCause().getMessage().contains("latitude")) { - logger.warn("Error in the selenium driver", e); - } else { - logger.info("Error in the selenium driver provoked by known bug", e); - } - } - - public RemoteWebDriver navigateTo(String url, RemoteWebDriver driver) throws BrowserNotFoundException { - return navigateTo(url, driver, true); - } - - /** - * Loads the given URL into the browser. If the browser is null then a new - * browser window is open. - * - * @param url - * The URL to load. - * @param driverParam - * The browser window to use. If this value is null a new browser - * window is open. - * @param retry - * Specify if there should be a second try to open a browser window - * if the first time fails (useful if the browser could not be found) - * @return The browser window (firefox or chrome depending on the configuration) - * used to open the URL. - * @throws BrowserNotFoundException - * Exception thrown when there is no Firefox/Chrome installed - */ - public RemoteWebDriver navigateTo(String url, RemoteWebDriver driverParam, boolean retry) - throws BrowserNotFoundException { - - RemoteWebDriver driver = driverParam; - - if (driver == null || !isDriverWorking(driver)) { - driver = initBrowser(); - } - - if (driver != null) { + Thread.sleep(1000); + WebElement runButton = webDriverGee.findElementByCssSelector(RUN_SCRIPT_BUTTON); + forceClick( runButton ); + } catch (NoSuchElementException e) { try { - driver.navigate().to(url); - } catch (final Exception e) { - if (retry && (e.getCause() != null && e.getCause().getMessage() != null - && e.getCause().getMessage().contains("Session not found"))) { - // Browser closed, restart it! - logger.error("Browser was closed, restaring it...", e); - driver = initBrowser(); - navigateTo(url, driver, false); // only try to re-open one - } + // retry + Thread.sleep(1000); + WebElement runButton = webDriverGee.findElementByCssSelector(RUN_SCRIPT_BUTTON); + forceClick( runButton ); + }catch (Exception e2) { + // TODO: handle exception } - } else { - logger.error("No Selenium driver available, Is Firefox or Chrome installed?"); } - return driver; - } - protected boolean isDriverWorking(RemoteWebDriver driver) { - boolean stillWorking = true; - try { - driver.findElement(By.xpath("//body")); - } catch (Exception e) { - stillWorking = false; - } - return stillWorking; } - /** - * Opens a browser window with the Bing Maps representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openBingMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("BING"); - synchronized (lock) { - if (localPropertiesService.isBingMapsSupported()) { - try { - webDriverBing = navigateTo(geoLocalizeTemplateService - .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_BING_HTML_TEMPLATE, - "bingMapsKey", localPropertiesService.getValue(EarthProperty.BING_MAPS_KEY)) - .toString(), webDriverBing); - } catch (final Exception e) { - logger.error("Problems loading Bing", e); - } - } - } - } - - private Object getLock(String key) { - String lock = locks.get(key); - if( lock !=null ) { - return lock; - }else{ - locks.put(key, key); - return key; + private void sendThroughClipboard(WebElement textArea, String contents) { + Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); + StringSelection clipboardtext = new StringSelection(contents); + clipboard.setContents(clipboardtext, null); + Keys controlChar = Keys.CONTROL; + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { + controlChar = Keys.COMMAND; } + textArea.sendKeys(Keys.chord(controlChar, "a")); + textArea.sendKeys(Keys.chord(controlChar, "v")); } - /** - * Opens a browser window with the Planet Basemaps representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openPlanetMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("PLANET"); - synchronized (lock) { - if (localPropertiesService.isPlanetMapsSupported()) { - - boolean monthly = localPropertiesService.isPlanetMapsMonthlyOpen(); + private void sendThroughKeys(WebElement textArea, String contents) + throws InterruptedException { + // Command key (apple key) is not working on Chrome on Mac. Try with the right click + // This is not going to be fixed by Selenium - String template = monthly ? GeolocalizeMapService.FREEMARKER_PLANET_NICFI_ARGUMENTS : GeolocalizeMapService.FREEMARKER_PLANET_DAILY_HTML_TEMPLATE; - String key = monthly ? localPropertiesService.getValue( EarthProperty.PLANET_MAPS_CE_KEY ) : localPropertiesService.getValue( EarthProperty.PLANET_MAPS_KEY ); + // Remove comments so it is faster to send the text! + String noComments = removeComments(contents); - try { - - String processTemplate = geoLocalizeTemplateService.getUrlToFreemarkerOutput( - placemarkObject, - template, - "planetMapsKey", - key, - "urlPlanetEndpointPrefix", - ServerController.getHostAddress(localPropertiesService.getHost(),localPropertiesService.getPort()) - ).toString(); - - String urlPlanet = null; - if( monthly ) { + // Clear the code area + WebElement clearButton = webDriverGee.findElementByCssSelector(RESET_SCRIPT_BUTTON); + forceClick( clearButton ); - String parameters = FileUtils.readFileToString( new File( new URI( processTemplate ) ) , StandardCharsets.UTF_8 ); + StringBuilder fixedScriptForMac = new StringBuilder(); + String[] lines = noComments.split("\\n"); + for (String line : lines) { + // Send the content of the script + String trimmedLine = line.trim(); - // remove new lines - parameters = parameters.replace("\n", "").replace("\r", "").replace("\t", "").replace(" ", ""); - // remove trailing commas - parameters = parameters.replace(",],", "],").replace("],]", "]]"); - - urlPlanet = localPropertiesService.getValue( EarthProperty.PLANET_NICFI_URL ) + parameters; - }else { - urlPlanet = processTemplate; - } + // Add Spaces after "{" so we avoid the automatic closing of the method by GEE + // Playground JS + trimmedLine = trimmedLine.replace("{", "{ "); - webDriverPlanetHtml = navigateTo( urlPlanet, webDriverPlanetHtml ); - - } catch (final Exception e) { - logger.error("Problems loading Planet", e); - } + if (!StringUtils.isBlank(trimmedLine)) { + fixedScriptForMac = fixedScriptForMac.append(trimmedLine).append("\n"); } } - } - /** - * Opens a browser window with the Baidu Maps representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openBaiduMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("BAIDU"); - synchronized (lock) { - if (localPropertiesService.isBaiduMapsSupported()) { - - try { - webDriverBaidu = navigateTo(geoLocalizeTemplateService - .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_BAIDU_HTML_TEMPLATE) - .toString(), webDriverBaidu); - } catch (final Exception e) { - logger.error("Problems loading Baidu", e); - } - } - } - } - - /** - * Opens a browser window with the Yandex Maps representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openYandexMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("YANDEX"); - synchronized (lock) { - if (localPropertiesService.isYandexMapsSupported()) { - try { - webDriverYandex = navigateTo(geoLocalizeTemplateService.getUrlToFreemarkerOutput(placemarkObject, - GeolocalizeMapService.FREEMARKER_YANDEX_HTML_TEMPLATE).toString(), webDriverYandex); - } catch (final Exception e) { - logger.error("Problems loading Yandex", e); + fixedScriptForMac.append("//THE END"); // Don't remove this!!! this way we mark the point where there should be no trailing character removal + Keys controlChar = Keys.CONTROL; + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { + controlChar = Keys.COMMAND; + } + textArea.sendKeys(Keys.chord(controlChar, "a")); + textArea.sendKeys(fixedScriptForMac); +/* + Thread.sleep(500); + // Fix the extra characters added by removing the last 10 chars ( this is a bug from Selenium! ) + textArea.sendKeys(Keys.PAGE_DOWN); + Thread.sleep(500); + textArea.sendKeys(Keys.PAGE_DOWN); + */ + } + + private void forceClick( WebElement element ) { + JavascriptExecutor js = webDriverGee; + js.executeScript("arguments[0].click();", element); + } + + public String removeComments(String contents) { + + String wholeCode = contents; + wholeCode = wholeCode.replace("http://", ""); + wholeCode = wholeCode.replace("https://", ""); + wholeCode = wholeCode.replace("\r", ""); + + StringBuilder noComments = new StringBuilder(""); + int indexComments = contents.indexOf("//"); + if (indexComments != -1) { + while (indexComments >= 0) { + int endOfLine = contents.indexOf('\n', indexComments); + if (endOfLine != -1) + indexComments = contents.indexOf("//", endOfLine + 2); + else { + break; } - } - } - } - /** - * Opens a browser window with a map representation of the plot in SecureWatch. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openSecureWatch(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("SECUREWATCH"); - synchronized (lock) { - if ( localPropertiesService.isSecureWatchSupported() ) { - String url = getUrlBaseIntegration(placemarkObject, localPropertiesService.getSecureWatchURL() + "/#18/LATITUDE/LONGITUDE" ); - webDriverSecureWatch = navigateTo(url, webDriverSecureWatch); - try { - logger.warn("Loading layers - {}", placemarkObject); - loadPlotInDGMap(placemarkObject, webDriverSecureWatch); - } catch (final Exception e) { - logger.error("Error when opening Secure Watch browser window", e); - } + if (indexComments != -1) + noComments = noComments.append(contents.substring(endOfLine, indexComments)); + else + noComments = noComments.append(contents.substring(endOfLine)); } + return noComments.toString(); + } else { + return wholeCode; } } /** - * Opens a browser window with a map representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found + * Get the GEE Playground script that should be used. There is an standard one + * that resides in resources/eePlaygroundScript.fmt but a project might have its + * own script. * + * @return The generic script in the resources folder or the file called + * eePlaygroundScript.fmt in the same folder where the current project + * file resides */ - public void openExtraMap(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("EXTRA"); - synchronized (lock) { - if (!StringUtils.isBlank(localPropertiesService.getExtraMap())) { - webDriverExtraMap = navigateTo( getUrlBaseIntegration(placemarkObject, localPropertiesService.getExtraMap() ) , webDriverExtraMap ); - } - } - } + private String getGeeCodeEditorTemplate() { - private String getUrlBaseIntegration(SimplePlacemarkObject placemarkObject, String url) { - String temp = null; - try { - String latitude = placemarkObject.getCoord().getLatitude(); - String longitude = placemarkObject.getCoord().getLongitude(); - String id = placemarkObject.getPlacemarkId().split(",")[0]; // for cases where ID also has round, then - // the id string would be something like - // "plotId,round", we only want the ID - - temp = url.replace("LATITUDE", latitude).replace("LONGITUDE", longitude).replace("PLOT_ID", id); - - } catch (final Exception e) { - logger.error("Problems Getting the URL filling for " + url, e); + String projectPlaygroundScript = getProjectGeeScript(); + if (projectPlaygroundScript != null) { + return projectPlaygroundScript; + } else { + return GeolocalizeMapService.FREEMARKER_GEE_CODE_EDITOR_TEMPLATE; // New format name since version 1.6.20 } - return temp; - } - /** - * Opens a browser window with the Google Street View representation of the - * plot. - * https://www.google.com/maps/@43.7815661,11.1484876,3a,75y,210.23h,82.32t/data=!3m6!1e1!3m4!1sEz7NiCbaIYzTJkP_RMBiqw!2e0!7i13312!8i6656?hl=en - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openStreetView(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("STREET_VIEW"); - synchronized (lock) { - if (localPropertiesService.isStreetViewSupported()) { - try { - webDriverStreetView = navigateTo( - geoLocalizeTemplateService.getUrlToFreemarkerOutput(placemarkObject, - GeolocalizeMapService.FREEMARKER_STREET_VIEW_HTML_TEMPLATE, "googleMapsApiKey", - localPropertiesService.getValue(EarthProperty.GOOGLE_MAPS_API_KEY)).toString(), - webDriverStreetView); - } catch (final Exception e) { - logger.error("Problems loading Street View", e); - } - } - } } /** - * Opens a browser window with the Here Maps representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * + * @return The path to the GEE Code Editor generic script or the one that is + * specified in the project folder if it exists. */ - public void openHereMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("HERE"); - synchronized (lock) { - if (localPropertiesService.isHereMapsSupported()) { - try { - webDriverHere = navigateTo(geoLocalizeTemplateService - .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_HERE_HTML_TEMPLATE, - "hereAppId", localPropertiesService.getValue(EarthProperty.HERE_MAPS_APP_ID), - "hereAppCode", localPropertiesService.getValue(EarthProperty.HERE_MAPS_APP_CODE)) - .toString(), webDriverHere); - } catch (final Exception e) { - logger.error("Problems loading Here Maps", e); - } - - } - } - } - - private StringBuilder getGeoJsonSegment(List coordinates) { - StringBuilder geoJson = new StringBuilder("["); - if (coordinates != null) { - for (SimpleCoordinate coord : coordinates) { - geoJson = geoJson.append("[").append(coord.getLongitude()).append(",").append(coord.getLatitude()) - .append("],"); - } - // remove last character - geoJson = geoJson.deleteCharAt(geoJson.length() - 1); - } - geoJson = geoJson.append("],"); - return geoJson; - } - - + private String getProjectGeeScript() { + // Is there a "eePlaygroundScript.fmt" file in the same folder than in the + // metadata file folder? + File projectGeePlayground = new File(localPropertiesService.getProjectFolder() + File.separatorChar + + GeolocalizeMapService.FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME); + // Is there a "eeCodeEditorScript.fmt" file in the same folder than in the + // metadata file folder? NEW NAME AFTER 12/2017!!! + File projectGeeCodeEditor = new File(localPropertiesService.getProjectFolder() + File.separatorChar + + GeolocalizeMapService.FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME); - private String getFeature(SimplePlacemarkObject placemarkObject, String shapeType, String name ) { - StringBuilder feature = new StringBuilder("{\"type\":\"Feature\",\"properties\":{\"name\":\"").append( name).append("\"},\"geometry\":"); - feature= feature.append( getGeoJson(placemarkObject, shapeType )).append("}"); - return feature.toString(); - } - - private String getGeoJson(SimplePlacemarkObject placemarkObject, String shapeType ) { - - StringBuilder geoJson = new StringBuilder("{\"type\":\"" ).append( shapeType).append("\",\"coordinates\":["); - List shape = placemarkObject.getShape(); - geoJson = geoJson.append(getGeoJsonSegment(shape)); - geoJson = geoJson.deleteCharAt(geoJson.length() - 1); - geoJson = geoJson.append("]}"); - return geoJson.toString(); - } - - /** - * Opens a browser window with the Google Earth Engine Code Editor and runs the - * freemarker template found in resources/eeCodeEditorScript.fmt on the main - * editor of GEE. - * - * @param placemarkObject - * The center point of the plot. - * @throws BrowserNotFoundException - * If the browser cannot be found - * - */ - public void openGEEAppURL(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("GEEAPP"); - synchronized (lock) { - if (localPropertiesService.isGEEAppSupported()) { - - try { - StringBuilder url = new StringBuilder(localPropertiesService.getGEEAppURL()); - url = url.append("#geoJson=") - .append(URLEncoder.encode(getGeoJson(placemarkObject, "MultiLineString"), StandardCharsets.UTF_8.toString())) - .append(";"); - url = url.append("plotId=") - .append(URLEncoder.encode(placemarkObject.getPlacemarkId(), StandardCharsets.UTF_8.toString())) - .append(";"); - url = url.append("survey=") - .append(URLEncoder.encode( earthSurveyService.getCollectSurvey().getName() , StandardCharsets.UTF_8.toString())) - .append(";"); - webDriverGEEMap = navigateTo(url.toString(), webDriverGEEMap); - webDriverGEEMap.navigate().refresh(); // FORCE REFRESH - OTHERWISE WINDOW IS NOT REFRESHED FOR SOME STRANGE REASON - } catch (final Exception e) { - logger.error("Problems loading GEE APP window", e); - } - } + String geeFilePath = null; + if (projectGeeCodeEditor.exists()) { // The new format name takes precedence + geeFilePath = projectGeeCodeEditor.getAbsolutePath(); + } else if (projectGeePlayground.exists()) { + geeFilePath = projectGeePlayground.getAbsolutePath(); } + return geeFilePath; } - - public void openEarthMapURL(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("EARTH_MAP"); - synchronized (lock) { - if (localPropertiesService.isEarthMapSupported()) { - - - try { - StringBuilder url = new StringBuilder(localPropertiesService.getEarthMapURL()).append("?"); - url = url.append("polygon=") - .append(URLEncoder.encode(getFeature(placemarkObject, "Polygon", placemarkObject.getPlacemarkId()), StandardCharsets.UTF_8.toString())) - .append("&"); - - if( StringUtils.isNotBlank(localPropertiesService.getEarthMapLayers()) ) { - url = url.append("layers=") - .append(URLEncoder.encode(localPropertiesService.getEarthMapLayers(), StandardCharsets.UTF_8.toString())) - .append("&"); - } - - if( StringUtils.isNotBlank(localPropertiesService.getEarthMapScripts()) ) { - url = url.append("scripts=") - .append(URLEncoder.encode(localPropertiesService.getEarthMapScripts(), StandardCharsets.UTF_8.toString())) - .append("&"); - } - - String aoi = localPropertiesService.getEarthMapAOI(); - if( StringUtils.isBlank(aoi) ) { - aoi = "global"; - } - url = url.append("aoi=") - .append(URLEncoder.encode( aoi, StandardCharsets.UTF_8.toString() )) - .append("&embed=true"); // Set the EMBED parameter to true so that the user does not need to log in. - - webDriverEarthMap = navigateTo(url.toString(), webDriverEarthMap); - //Desktop.getDesktop().browse( new URI( url.toString() ) ); - //webDriverEarthMap.navigate().refresh(); // FORCE REFRESH - OTHERWISE WINDOW IS NOT REFRESHED FOR SOME STRANGE REASON - } catch (final Exception e) { - logger.error("Problems loading Earth Map window", e); - } - } - } + public void loadCodeEditorScript(SimplePlacemarkObject placemarkObject, RemoteWebDriver webDriverGeePlayground) { + this.placemarkObject = placemarkObject; + loadCodeEditorScript(webDriverGeePlayground); } - /** - * Opens a browser window with the Google Earth Engine Code Editor and runs the - * freemarker template found in resources/eeCodeEditorScript.fmt on the main - * editor of GEE. - * - * @param placemarkObject - * The center point of the plot. - * @throws BrowserNotFoundException - * If the browser cannot be found - * - */ - public void openGEECodeEditor(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("CODE_EDITOR"); - synchronized (lock) { - if (localPropertiesService.isCodeEditorSupported()) { - - boolean firstOpening = false; - if (getWebDriverGeeCodeEditor() == null) { - setWebDriverGeeCodeEditor(initBrowser()); - firstOpening = true; + public void disableCodeEditorAutocomplete(RemoteWebDriver webDriverCodeEditor) { + this.webDriverGee = webDriverCodeEditor; + try { + if (!isCodeEditorShowing()) { + // Open GEE Playground + if (!browserService.isDriverWorking(webDriverGee) || webDriverGee.getCurrentUrl() == null + || !webDriverGee.getCurrentUrl().contains("google")) { + webDriverGee = browserService.navigateTo(localPropertiesService.getGeePlaygoundUrl(), webDriverGee); + browserService.setWebDriverGeeCodeEditor(webDriverGee); } - if (firstOpening && (liquibase.repackaged.org.apache.commons.lang3.SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX)) { - codeEditorHandlerThread.disableCodeEditorAutocomplete(getWebDriverGeeCodeEditor()); + // Initially the login page appears! + while (!isCodeEditorShowing()) { // 5 minutes a 2 seconds == 30 * 5 = 150 + Thread.sleep(2000); } - codeEditorHandlerThread.loadCodeEditorScript(placemarkObject, getWebDriverGeeCodeEditor()); - } - } - } - - - /** - * Opens a browser window with the Google Earth Engine Timelapse representation - * of the plot. - * - * @param placemarkObject - * The center point of the plot. - * @throws BrowserNotFoundException - * If the browser cannot be found - * - */ - public void openTimelapse(final SimplePlacemarkObject placemarkObject) - throws BrowserNotFoundException { - Object lock = getLock("TIMELAPSE"); - synchronized (lock) { - if (localPropertiesService.isTimelapseSupported()) { - try { - String coordinates = placemarkObject.getCoord().toString(); - webDriverTimelapse = navigateTo( - "https://earthengine.google.org/timelapse/timelapseplayer_v2.html?timelapseclient=http://earthengine.google.org/timelapse/data&v=" - + coordinates + ",10.812,latLng&t=0.08", - webDriverTimelapse); - } catch (final Exception e) { - logger.error("Problems loading Timelapse", e); - } - } - } - } - - private void setGeckoDriverPath() { - String geckoDriverPath = ""; - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { - geckoDriverPath = "resources/geckodriver_mac"; - } else if (SystemUtils.IS_OS_UNIX) { - if (System.getProperty("os.arch").contains("64") - || System.getProperty("sun.arch.data.model").equals("64")) { - geckoDriverPath = "resources/geckodriver_64"; } else { - geckoDriverPath = "resources/geckodriver_32"; + disableAutoComplete(); } - } else if (SystemUtils.IS_OS_WINDOWS) { - try { - if (System.getProperty("os.arch").contains("64") - || System.getProperty("sun.arch.data.model").equals("64")) - geckoDriverPath = "resources/geckodriver_64.exe"; - else - geckoDriverPath = "resources/geckodriver_32.exe"; - } catch (Exception e) { - geckoDriverPath = "resources/geckodriver_64.exe"; - } - } else { - throw new IllegalArgumentException("Geckodriver is not supported in the current OS"); - } - - File geckoDriverFile = new File(geckoDriverPath); - // if above property is not working or not opening the application in browser - // then try below property - System.setProperty(GeckoDriverService.GECKO_DRIVER_EXE_PROPERTY, geckoDriverFile.getAbsolutePath()); - System.setProperty(FirefoxDriver.SystemProperty.DRIVER_USE_MARIONETTE, "true"); - - } - - public boolean waitFor(String elementId, RemoteWebDriver driver) { - int i = 0; - while (!isIdOrNamePresent(elementId, driver)) { - try { - Thread.sleep(1000); - } catch (final InterruptedException e) { - return false; - } - i++; - if (i > 60) { - return false; - } + } catch (final NoSuchElementException e) { + // This is a well known exception. Down-grade if to warning + logger.warn("Error when opening Earth Engine browser window. Known problem", e); + } catch (final Exception e) { + // This is a well known exception. + logger.error("Error when opening Earth Engine browser window", e); } - return true; } - public boolean waitForXPath(String xpath, RemoteWebDriver driver) { - int i = 0; - while (!isXPathPresent(xpath, driver)) { - try { - Thread.sleep(1000); - } catch (final InterruptedException e) { - return false; + private void disableAutoComplete() { + // Display the settings in Google Earth Engine Code Editor (this emulates + // clicking on the settings icon) + webDriverGee.findElementByClassName("settings-menu-button").click(); + // Get the Div that is the parent of the one with text that contains + // Autocomplete + RemoteWebElement autocompleteButton = (RemoteWebElement) webDriverGee + .findElementByXPath("//div[contains(text(), \"Autocomplete\")]/.."); - } - i++; - if (i > 30) { - return false; - } + if (isAutocompleChecked(autocompleteButton)) { + // Disable the Autocomplete of special characters + autocompleteButton.click(); } - return true; + } - private Thread getClosingBrowsersThread() { + public boolean isAutocompleChecked(RemoteWebElement autocompleteButton) { + String buttonChecked = autocompleteButton.getAttribute("aria-checked"); + return buttonChecked.equals("true"); + } - return new Thread("Quit the open browsers") { + private void loadCodeEditorScript(RemoteWebDriver webDriverCodeEditor) { + this.webDriverGee = webDriverCodeEditor; + Thread loadGee = new Thread( + "Opening GEE Playground " + (placemarkObject != null ? placemarkObject.toString() : "")) { @Override public void run() { - isClosing = true; - CopyOnWriteArrayList driversCopy = new CopyOnWriteArrayList<>(drivers); - for (Iterator iterator = driversCopy.iterator(); iterator.hasNext();) { - RemoteWebDriver remoteWebDriver = iterator.next(); - try { - remoteWebDriver.quit(); - } catch (final Exception e) { - logger.error("Error quitting the browser", e); + try { + if (!isCodeEditorShowing()) { + // Open GEE Code Editor + if (!browserService.isDriverWorking(webDriverGee) || webDriverGee.getCurrentUrl() == null + || !webDriverGee.getCurrentUrl().contains("google")) { + webDriverGee = browserService.navigateTo(localPropertiesService.getGeePlaygoundUrl(), + webDriverGee); + browserService.setWebDriverGeeCodeEditor(webDriverGee); + } + // Initially the login page appears! + while (!isCodeEditorShowing()) { + sleep(2000); + } } + runScript(); + } catch (final NoSuchElementException e) { + // This is a well known exception. Down-grade if to warning + logger.warn("Error when opening Earth Engine browser window. Known problem", e); + } catch (final Exception e) { + // This is a well known exception. + logger.error("Error when opening Earth Engine browser window", e); } - } }; + loadGee.start(); } - - @Override - public void update(Observable o, Object arg) { - if (ServerInitializationEvent.SERVER_STOPPED_EVENT.equals(arg)) { - this.closeBrowsers(); - } - } - - private RemoteWebDriver getWebDriverGeeCodeEditor() { - return webDriverGeeCodeEditor; - } - - protected void setWebDriverGeeCodeEditor(RemoteWebDriver webDriverGeeCodeEditor) { - this.webDriverGeeCodeEditor = webDriverGeeCodeEditor; - } - } From e94c4878cd613b4e48c40e22c70346044937ce68 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:05 +0100 Subject: [PATCH 1035/1620] New translations SaveEarthDataServlet.java (English) --- .../earth/app/view/Messages_en.properties | 918 +----------------- 1 file changed, 48 insertions(+), 870 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 5a933d094d..b23ed83438 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,909 +1,87 @@ -package org.openforis.collect.earth.app.service; +package org.openforis.collect.earth.app.server; -import java.io.BufferedWriter; -import java.io.File; import java.io.IOException; -import java.io.StringWriter; -import java.io.Writer; -import java.net.URI; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; import java.util.Map; -import java.util.Observable; -import java.util.Observer; -import java.util.concurrent.CopyOnWriteArrayList; -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.desktop.ServerController; -import org.openforis.collect.earth.app.desktop.ServerController.ServerInitializationEvent; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.sampler.model.SimpleCoordinate; -import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; -import org.openqa.selenium.By; -import org.openqa.selenium.JavascriptExecutor; -import org.openqa.selenium.WebDriverException; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.firefox.FirefoxDriver; -import org.openqa.selenium.firefox.GeckoDriverService; -import org.openqa.selenium.remote.RemoteWebDriver; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.InitializingBean; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.view.Messages; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import freemarker.cache.FileTemplateLoader; -import freemarker.template.Configuration; -import freemarker.template.Template; -import freemarker.template.TemplateException; -import freemarker.template.Version; -import io.github.bonigarcia.wdm.WebDriverManager; -import liquibase.repackaged.org.apache.commons.lang3.SystemUtils; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; /** - * This class contains methods that allow Collect Earth to open browser windows - * that allow the user to have a better understanding of the plot. So far there - * are integrations with Google Earth Engine, Google Earth Engine Timelapse and - * Bing Maps. When a user clicks on a plot Collect Earth will check if the - * program is set to open any of these integrations, and if it is so it will - * open each one in its own window. These windows are closed when the program - * is closed. - *s + * Servlet called for updating/saving the information about a placemark. Called from the form in Google Earth when the user interacts with it or clicks the save button. * @author Alfonso Sanchez-Paus Diaz * + * @deprecated Replaced by {@link PlacemarkDataController} + * */ -@Component -public class BrowserService implements InitializingBean, Observer { - +@Deprecated +@Controller +public class SaveEarthDataServlet extends JsonPocessorServlet { @Autowired - private LocalPropertiesService localPropertiesService; + LocalPropertiesService localPropertiesService; - @Autowired - private GeolocalizeMapService geoLocalizeTemplateService; - - @Autowired - private EarthSurveyService earthSurveyService; - - @Autowired - private CodeEditorHandlerThread codeEditorHandlerThread; + //@Autowired + //CollectDesignerController collectDesignerController; - private final ArrayList drivers = new ArrayList<>(); - private final Logger logger = LoggerFactory.getLogger(BrowserService.class); - private static final String TEMPLATE_FOR_DGMAP_JS = "resources/javascript_dgmap.fmt"; - private static final Configuration cfg = new Configuration(new Version("2.3.23")); - private RemoteWebDriver webDriverBing, webDriverBaidu, webDriverTimelapse, webDriverGeeCodeEditor, - webDriverHere, webDriverStreetView, webDriverYandex, webDriverPlanetHtml, webDriverExtraMap, webDriverSecureWatch, - webDriverGEEMap, webDriverEarthMap; + @Deprecated + @GetMapping("/saveData") + public void saveData(HttpServletRequest request, HttpServletResponse response) throws IOException { - Map locks = new HashMap(); - - private static boolean geeMethodUpdated = false; - - private boolean isClosing = false; - - public void closeBrowsers() { - synchronized (this) { - getClosingBrowsersThread().start(); - } - } - - @Override - public void afterPropertiesSet() throws Exception { - Runtime.getRuntime().addShutdownHook(getClosingBrowsersThread()); - setGeckoDriverPath(); - } - - private RemoteWebDriver chooseDriver() throws BrowserNotFoundException { - RemoteWebDriver driver = null; - final String browserSetInProperties = localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim(); + Map collectedData = extractRequestData(request); - if (browserSetInProperties.equalsIgnoreCase(EarthConstants.CHROME_BROWSER)) { - driver = tryStartChrome(); - } else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.FIREFOX_BROWSER)) { - driver = tryStartFirefox(); - } else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.EDGE_BROWSER)) { - driver = tryStartEdge(); - }else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.SAFARI_BROWSER)) { - driver = tryStartSafari(); - } - - // If the browser chosen is not installed try to find and installed browser in the computer - if( driver== null ) { - driver = tryStartChrome(); - if( driver== null ) { - driver = tryStartFirefox(); - } - if( driver== null ) { - driver = tryStartEdge(); - } - if( driver== null ) { - driver = tryStartSafari(); - } - } - - if (driver == null) { - throw new BrowserNotFoundException( - "Neither Chrome nor Firefox could be opened. You need to have one of them installed in order to use GEE, Bing Maps or Saiku."); - } - - return driver; - } - - private RemoteWebDriver tryStartFirefox() { - RemoteWebDriver driver = null; - try { - driver = (RemoteWebDriver) WebDriverManager.firefoxdriver().create(); - } catch (final WebDriverException e) { - logger.warn( - "Problem starting Firefox browser!", - e); - } - return driver; - } - - private RemoteWebDriver tryStartEdge() { - RemoteWebDriver driver = null; - try { - driver = (RemoteWebDriver) WebDriverManager.edgedriver().create(); - } catch (final WebDriverException e) { - logger.warn( - "Problem starting Edge browser", - e); - } - return driver; - } + replaceTestVariables(collectedData); - private RemoteWebDriver tryStartSafari() { - RemoteWebDriver driver = null; - try { - driver = (RemoteWebDriver) WebDriverManager.safaridriver().create(); - } catch (final WebDriverException e) { - logger.warn( - "Problem starting Safari browser", - e); - } - return driver; - } - - private RemoteWebDriver tryStartChrome() { - RemoteWebDriver driver = null; - try { - driver = (RemoteWebDriver) WebDriverManager.chromedriver().create(); - } catch (final Exception e) { - logger.warn( - "Problem starting Chrome browser", - e); - } - return driver; - } - - - private String getDGMapJavascript(SimplePlacemarkObject placemarkObject) { - final Map data = geoLocalizeTemplateService.getPlacemarkData(placemarkObject); - data.put("latitude", placemarkObject.getCoord().getLatitude()); - data.put("longitude", placemarkObject.getCoord().getLongitude()); - return processJavascriptTemplate(data, TEMPLATE_FOR_DGMAP_JS); - } - - private String processJavascriptTemplate(final Map data, String templateName) { - Writer out; - String result = null; - try (StringWriter fw = new StringWriter();) { - // Load template from source folder - cfg.setTemplateLoader(new FileTemplateLoader(new File(System.getProperty("user.dir")))); - final Template template = cfg.getTemplate(templateName); - - // Console output - out = new BufferedWriter(fw); - - // Add date to avoid caching - template.process(data, out); - - out.flush(); - - result = fw.toString(); - - } catch (final TemplateException e) { - logger.error("Error when generating the javascript commands", e); - } catch (final IOException e) { - logger.error("Error when reading/writing the template information", e); - } - return result; - } - - private RemoteWebDriver initBrowser() throws BrowserNotFoundException { - RemoteWebDriver driver = null; - driver = chooseDriver(); - if (isClosing) { // In case the browser takes so long to start that the user closes CE and this - // method is called when the other windows are being closed - driver.quit(); - driver = null; + if (collectedData.size() == 0) { + setResult(false, Messages.getString("SaveEarthDataServlet.0"), collectedData); //$NON-NLS-1$ + getLogger().info("The request was empty"); //$NON-NLS-1$ } else { - drivers.add(driver); - } - return driver; - } - - public static boolean isIdOrNamePresent(String elementId, RemoteWebDriver driver) { - boolean found = false; - - try { - if (driver.findElementById(elementId).isDisplayed() || driver.findElementByName(elementId).isDisplayed()) { - found = true; - } - } catch (final Exception e) { - // Not found - } - - return found; - } - - public static boolean isCssElementPresent(String cssElement, RemoteWebDriver driver) { - boolean found = false; - - try { - WebElement elementByCssSelector = driver.findElementByCssSelector(cssElement); - found = elementByCssSelector != null; - } catch (final Exception e) { - // Not found - } - - return found; - } - - private boolean isXPathPresent(String xpath, RemoteWebDriver driver) { - boolean found = false; - - try { - if (driver.findElementByXPath(xpath).isDisplayed()) { - found = true; - } - logger.debug(String.format("Found %s", xpath)); - } catch (final Exception e) { - logger.debug(String.format("Not Found %s", xpath)); - } - - return found; - } - - private boolean loadPlotInDGMap(SimplePlacemarkObject placemarkObject, RemoteWebDriver driver) { - - boolean success = true; - if (driver != null && waitFor("mainContent", driver) && driver instanceof JavascriptExecutor) { - try { - String dgmapJs = getDGMapJavascript(placemarkObject); - driver.executeScript(dgmapJs); - - Thread.sleep( 1000 ); - // Unlock the view if it is locked - if( isCssElementPresent(".lock.on", driver) ) { - driver.findElementByCssSelector(".lock.on").click(); // UNLOCK - } - - } catch (final Exception e) { - processSeleniumError(e); - success = false; - } - } - return success; - } - - public void clickOnElements(RemoteWebDriver driver, String cssSelector) { - final List dataLayerVisibility = driver.findElementsByCssSelector(cssSelector); - for (final WebElement webElement : dataLayerVisibility) { - if (webElement.isDisplayed()) { - webElement.click(); - } - } - } - - public static boolean isGeeMethodUpdated() { - return geeMethodUpdated; - } - - public static void setGeeMethodUpdated(boolean geeMethosUpdated) { - BrowserService.geeMethodUpdated = geeMethosUpdated; - } - - private void processSeleniumError(final Exception e) { - if (e.getCause() != null && e.getCause().getMessage() != null - && !e.getCause().getMessage().contains("latitude")) { - logger.warn("Error in the selenium driver", e); - } else { - logger.info("Error in the selenium driver provoked by known bug", e); - } - } - - public RemoteWebDriver navigateTo(String url, RemoteWebDriver driver) throws BrowserNotFoundException { - return navigateTo(url, driver, true); - } - - /** - * Loads the given URL into the browser. If the browser is null then a new - * browser window is open. - * - * @param url - * The URL to load. - * @param driverParam - * The browser window to use. If this value is null a new browser - * window is open. - * @param retry - * Specify if there should be a second try to open a browser window - * if the first time fails (useful if the browser could not be found) - * @return The browser window (firefox or chrome depending on the configuration) - * used to open the URL. - * @throws BrowserNotFoundException - * Exception thrown when there is no Firefox/Chrome installed - */ - public RemoteWebDriver navigateTo(String url, RemoteWebDriver driverParam, boolean retry) - throws BrowserNotFoundException { - - RemoteWebDriver driver = driverParam; - - if (driver == null || !isDriverWorking(driver)) { - driver = initBrowser(); - } - - if (driver != null) { - try { - driver.navigate().to(url); - } catch (final Exception e) { - if (retry && (e.getCause() != null && e.getCause().getMessage() != null - && e.getCause().getMessage().contains("Session not found"))) { - // Browser closed, restart it! - logger.error("Browser was closed, restaring it...", e); - driver = initBrowser(); - navigateTo(url, driver, false); // only try to re-open one - } - } - } else { - logger.error("No Selenium driver available, Is Firefox or Chrome installed?"); - } - return driver; - } - - protected boolean isDriverWorking(RemoteWebDriver driver) { - boolean stillWorking = true; - try { - driver.findElement(By.xpath("//body")); - } catch (Exception e) { - stillWorking = false; - } - return stillWorking; - } - - /** - * Opens a browser window with the Bing Maps representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openBingMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("BING"); - synchronized (lock) { - if (localPropertiesService.isBingMapsSupported()) { - try { - webDriverBing = navigateTo(geoLocalizeTemplateService - .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_BING_HTML_TEMPLATE, - "bingMapsKey", localPropertiesService.getValue(EarthProperty.BING_MAPS_KEY)) - .toString(), webDriverBing); - } catch (final Exception e) { - logger.error("Problems loading Bing", e); - } - } - } - } - - private Object getLock(String key) { - String lock = locks.get(key); - if( lock !=null ) { - return lock; - }else{ - locks.put(key, key); - return key; - } - } - - /** - * Opens a browser window with the Planet Basemaps representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openPlanetMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("PLANET"); - synchronized (lock) { - if (localPropertiesService.isPlanetMapsSupported()) { - - boolean monthly = localPropertiesService.isPlanetMapsMonthlyOpen(); - - String template = monthly ? GeolocalizeMapService.FREEMARKER_PLANET_NICFI_ARGUMENTS : GeolocalizeMapService.FREEMARKER_PLANET_DAILY_HTML_TEMPLATE; - String key = monthly ? localPropertiesService.getValue( EarthProperty.PLANET_MAPS_CE_KEY ) : localPropertiesService.getValue( EarthProperty.PLANET_MAPS_KEY ); - - try { - - String processTemplate = geoLocalizeTemplateService.getUrlToFreemarkerOutput( - placemarkObject, - template, - "planetMapsKey", - key, - "urlPlanetEndpointPrefix", - ServerController.getHostAddress(localPropertiesService.getHost(),localPropertiesService.getPort()) - ).toString(); - - String urlPlanet = null; - if( monthly ) { - - String parameters = FileUtils.readFileToString( new File( new URI( processTemplate ) ) , StandardCharsets.UTF_8 ); - - // remove new lines - parameters = parameters.replace("\n", "").replace("\r", "").replace("\t", "").replace(" ", ""); - // remove trailing commas - parameters = parameters.replace(",],", "],").replace("],]", "]]"); - - urlPlanet = localPropertiesService.getValue( EarthProperty.PLANET_NICFI_URL ) + parameters; - }else { - urlPlanet = processTemplate; - } - - webDriverPlanetHtml = navigateTo( urlPlanet, webDriverPlanetHtml ); - - } catch (final Exception e) { - logger.error("Problems loading Planet", e); - } - } - } - } - - /** - * Opens a browser window with the Baidu Maps representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openBaiduMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("BAIDU"); - synchronized (lock) { - if (localPropertiesService.isBaiduMapsSupported()) { - - try { - webDriverBaidu = navigateTo(geoLocalizeTemplateService - .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_BAIDU_HTML_TEMPLATE) - .toString(), webDriverBaidu); - } catch (final Exception e) { - logger.error("Problems loading Baidu", e); - } - } - } - } - - /** - * Opens a browser window with the Yandex Maps representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openYandexMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("YANDEX"); - synchronized (lock) { - if (localPropertiesService.isYandexMapsSupported()) { - try { - webDriverYandex = navigateTo(geoLocalizeTemplateService.getUrlToFreemarkerOutput(placemarkObject, - GeolocalizeMapService.FREEMARKER_YANDEX_HTML_TEMPLATE).toString(), webDriverYandex); - } catch (final Exception e) { - logger.error("Problems loading Yandex", e); - } - } - } - } - - /** - * Opens a browser window with a map representation of the plot in SecureWatch. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openSecureWatch(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("SECUREWATCH"); - synchronized (lock) { - if ( localPropertiesService.isSecureWatchSupported() ) { - String url = getUrlBaseIntegration(placemarkObject, localPropertiesService.getSecureWatchURL() + "/#18/LATITUDE/LONGITUDE" ); - webDriverSecureWatch = navigateTo(url, webDriverSecureWatch); - try { - logger.warn("Loading layers - {}", placemarkObject); - loadPlotInDGMap(placemarkObject, webDriverSecureWatch); - } catch (final Exception e) { - logger.error("Error when opening Secure Watch browser window", e); - } - } - } - } - - /** - * Opens a browser window with a map representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openExtraMap(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("EXTRA"); - synchronized (lock) { - if (!StringUtils.isBlank(localPropertiesService.getExtraMap())) { - webDriverExtraMap = navigateTo( getUrlBaseIntegration(placemarkObject, localPropertiesService.getExtraMap() ) , webDriverExtraMap ); - } - } - } - - private String getUrlBaseIntegration(SimplePlacemarkObject placemarkObject, String url) { - String temp = null; - try { - String latitude = placemarkObject.getCoord().getLatitude(); - String longitude = placemarkObject.getCoord().getLongitude(); - String id = placemarkObject.getPlacemarkId().split(",")[0]; // for cases where ID also has round, then - // the id string would be something like - // "plotId,round", we only want the ID - - temp = url.replace("LATITUDE", latitude).replace("LONGITUDE", longitude).replace("PLOT_ID", id); - - } catch (final Exception e) { - logger.error("Problems Getting the URL filling for " + url, e); - } - return temp; - } - - /** - * Opens a browser window with the Google Street View representation of the - * plot. - * https://www.google.com/maps/@43.7815661,11.1484876,3a,75y,210.23h,82.32t/data=!3m6!1e1!3m4!1sEz7NiCbaIYzTJkP_RMBiqw!2e0!7i13312!8i6656?hl=en - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openStreetView(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("STREET_VIEW"); - synchronized (lock) { - if (localPropertiesService.isStreetViewSupported()) { - try { - webDriverStreetView = navigateTo( - geoLocalizeTemplateService.getUrlToFreemarkerOutput(placemarkObject, - GeolocalizeMapService.FREEMARKER_STREET_VIEW_HTML_TEMPLATE, "googleMapsApiKey", - localPropertiesService.getValue(EarthProperty.GOOGLE_MAPS_API_KEY)).toString(), - webDriverStreetView); - } catch (final Exception e) { - logger.error("Problems loading Street View", e); - } - } - } - } - - /** - * Opens a browser window with the Here Maps representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openHereMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("HERE"); - synchronized (lock) { - if (localPropertiesService.isHereMapsSupported()) { - try { - webDriverHere = navigateTo(geoLocalizeTemplateService - .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_HERE_HTML_TEMPLATE, - "hereAppId", localPropertiesService.getValue(EarthProperty.HERE_MAPS_APP_ID), - "hereAppCode", localPropertiesService.getValue(EarthProperty.HERE_MAPS_APP_CODE)) - .toString(), webDriverHere); - } catch (final Exception e) { - logger.error("Problems loading Here Maps", e); - } - - } - } - } - - private StringBuilder getGeoJsonSegment(List coordinates) { - StringBuilder geoJson = new StringBuilder("["); - if (coordinates != null) { - for (SimpleCoordinate coord : coordinates) { - geoJson = geoJson.append("[").append(coord.getLongitude()).append(",").append(coord.getLatitude()) - .append("],"); - } - // remove last character - geoJson = geoJson.deleteCharAt(geoJson.length() - 1); - } - geoJson = geoJson.append("],"); - return geoJson; - } - - - - - private String getFeature(SimplePlacemarkObject placemarkObject, String shapeType, String name ) { - StringBuilder feature = new StringBuilder("{\"type\":\"Feature\",\"properties\":{\"name\":\"").append( name).append("\"},\"geometry\":"); - feature= feature.append( getGeoJson(placemarkObject, shapeType )).append("}"); - return feature.toString(); - } - - private String getGeoJson(SimplePlacemarkObject placemarkObject, String shapeType ) { - - StringBuilder geoJson = new StringBuilder("{\"type\":\"" ).append( shapeType).append("\",\"coordinates\":["); - List shape = placemarkObject.getShape(); - geoJson = geoJson.append(getGeoJsonSegment(shape)); - geoJson = geoJson.deleteCharAt(geoJson.length() - 1); - geoJson = geoJson.append("]}"); - return geoJson.toString(); - } - - /** - * Opens a browser window with the Google Earth Engine Code Editor and runs the - * freemarker template found in resources/eeCodeEditorScript.fmt on the main - * editor of GEE. - * - * @param placemarkObject - * The center point of the plot. - * @throws BrowserNotFoundException - * If the browser cannot be found - * - */ - public void openGEEAppURL(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("GEEAPP"); - synchronized (lock) { - if (localPropertiesService.isGEEAppSupported()) { - - try { - StringBuilder url = new StringBuilder(localPropertiesService.getGEEAppURL()); - url = url.append("#geoJson=") - .append(URLEncoder.encode(getGeoJson(placemarkObject, "MultiLineString"), StandardCharsets.UTF_8.toString())) - .append(";"); - url = url.append("plotId=") - .append(URLEncoder.encode(placemarkObject.getPlacemarkId(), StandardCharsets.UTF_8.toString())) - .append(";"); - url = url.append("survey=") - .append(URLEncoder.encode( earthSurveyService.getCollectSurvey().getName() , StandardCharsets.UTF_8.toString())) - .append(";"); - webDriverGEEMap = navigateTo(url.toString(), webDriverGEEMap); - webDriverGEEMap.navigate().refresh(); // FORCE REFRESH - OTHERWISE WINDOW IS NOT REFRESHED FOR SOME STRANGE REASON - } catch (final Exception e) { - logger.error("Problems loading GEE APP window", e); - } - } - } - } - - - public void openEarthMapURL(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("EARTH_MAP"); - synchronized (lock) { - if (localPropertiesService.isEarthMapSupported()) { - - - try { - StringBuilder url = new StringBuilder(localPropertiesService.getEarthMapURL()).append("?"); - url = url.append("polygon=") - .append(URLEncoder.encode(getFeature(placemarkObject, "Polygon", placemarkObject.getPlacemarkId()), StandardCharsets.UTF_8.toString())) - .append("&"); - - if( StringUtils.isNotBlank(localPropertiesService.getEarthMapLayers()) ) { - url = url.append("layers=") - .append(URLEncoder.encode(localPropertiesService.getEarthMapLayers(), StandardCharsets.UTF_8.toString())) - .append("&"); - } - - if( StringUtils.isNotBlank(localPropertiesService.getEarthMapScripts()) ) { - url = url.append("scripts=") - .append(URLEncoder.encode(localPropertiesService.getEarthMapScripts(), StandardCharsets.UTF_8.toString())) - .append("&"); - } - - String aoi = localPropertiesService.getEarthMapAOI(); - if( StringUtils.isBlank(aoi) ) { - aoi = "global"; - } - url = url.append("aoi=") - .append(URLEncoder.encode( aoi, StandardCharsets.UTF_8.toString() )) - .append("&embed=true"); // Set the EMBED parameter to true so that the user does not need to log in. - - webDriverEarthMap = navigateTo(url.toString(), webDriverEarthMap); - //Desktop.getDesktop().browse( new URI( url.toString() ) ); - //webDriverEarthMap.navigate().refresh(); // FORCE REFRESH - OTHERWISE WINDOW IS NOT REFRESHED FOR SOME STRANGE REASON - } catch (final Exception e) { - logger.error("Problems loading Earth Map window", e); - } + if (getDataAccessor().saveData(collectedData)) { + setResult(true, Messages.getString("SaveEarthDataServlet.2"), collectedData); //$NON-NLS-1$ + } else { + setResult(false, Messages.getString("SaveEarthDataServlet.1"), collectedData); //$NON-NLS-1$ + getLogger().error("The data could not be saved"); //$NON-NLS-1$ } } - } - - /** - * Opens a browser window with the Google Earth Engine Code Editor and runs the - * freemarker template found in resources/eeCodeEditorScript.fmt on the main - * editor of GEE. - * - * @param placemarkObject - * The center point of the plot. - * @throws BrowserNotFoundException - * If the browser cannot be found - * - */ - public void openGEECodeEditor(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("CODE_EDITOR"); - synchronized (lock) { - if (localPropertiesService.isCodeEditorSupported()) { - boolean firstOpening = false; - if (getWebDriverGeeCodeEditor() == null) { - setWebDriverGeeCodeEditor(initBrowser()); - firstOpening = true; - } - - if (firstOpening && (liquibase.repackaged.org.apache.commons.lang3.SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX)) { - codeEditorHandlerThread.disableCodeEditorAutocomplete(getWebDriverGeeCodeEditor()); - } - - codeEditorHandlerThread.loadCodeEditorScript(placemarkObject, getWebDriverGeeCodeEditor()); - } - } + setJsonResponse(response, collectedData); } - /** - * Opens a browser window with the Google Earth Engine Timelapse representation - * of the plot. - * - * @param placemarkObject - * The center point of the plot. - * @throws BrowserNotFoundException - * If the browser cannot be found + * This method replaces the variable values that the form contains when it is not run + * through Google Earth and the variable replacement of the ExtendedData of the KML does not kick in. * + * @param collectedData + * The data POSTed by the form that has already been processed. */ - public void openTimelapse(final SimplePlacemarkObject placemarkObject) - throws BrowserNotFoundException { - Object lock = getLock("TIMELAPSE"); - synchronized (lock) { - if (localPropertiesService.isTimelapseSupported()) { - try { - String coordinates = placemarkObject.getCoord().toString(); - webDriverTimelapse = navigateTo( - "https://earthengine.google.org/timelapse/timelapseplayer_v2.html?timelapseclient=http://earthengine.google.org/timelapse/data&v=" - + coordinates + ",10.812,latLng&t=0.08", - webDriverTimelapse); - } catch (final Exception e) { - logger.error("Problems loading Timelapse", e); - } - } + private void replaceTestVariables(Map collectedData) { + // REMOVE THIS!!!! + if (collectedData.get(EarthConstants.PLACEMARK_ID_PARAMETER).equals("$[id]")) { //$NON-NLS-1$ //$NON-NLS-2$ + collectedData.put(EarthConstants.PLACEMARK_ID_PARAMETER, "testPlacemark"); //$NON-NLS-1$ //$NON-NLS-2$ } - } - private void setGeckoDriverPath() { - String geckoDriverPath = ""; - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { - geckoDriverPath = "resources/geckodriver_mac"; - } else if (SystemUtils.IS_OS_UNIX) { - if (System.getProperty("os.arch").contains("64") - || System.getProperty("sun.arch.data.model").equals("64")) { - geckoDriverPath = "resources/geckodriver_64"; - } else { - geckoDriverPath = "resources/geckodriver_32"; - } - } else if (SystemUtils.IS_OS_WINDOWS) { - try { - if (System.getProperty("os.arch").contains("64") - || System.getProperty("sun.arch.data.model").equals("64")) - geckoDriverPath = "resources/geckodriver_64.exe"; - else - geckoDriverPath = "resources/geckodriver_32.exe"; - } catch (Exception e) { - geckoDriverPath = "resources/geckodriver_64.exe"; - } - } else { - throw new IllegalArgumentException("Geckodriver is not supported in the current OS"); + if (collectedData.get("collect_integer_elevation") != null && collectedData.get("collect_integer_elevation").equals("$[elevation]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + collectedData.put("collect_integer_elevation", "0"); //$NON-NLS-1$ //$NON-NLS-2$ } - File geckoDriverFile = new File(geckoDriverPath); - - // if above property is not working or not opening the application in browser - // then try below property - System.setProperty(GeckoDriverService.GECKO_DRIVER_EXE_PROPERTY, geckoDriverFile.getAbsolutePath()); - System.setProperty(FirefoxDriver.SystemProperty.DRIVER_USE_MARIONETTE, "true"); - - } - - public boolean waitFor(String elementId, RemoteWebDriver driver) { - int i = 0; - while (!isIdOrNamePresent(elementId, driver)) { - try { - Thread.sleep(1000); - } catch (final InterruptedException e) { - return false; - } - i++; - if (i > 60) { - return false; - } + if (collectedData.get("collect_real_slope") != null && collectedData.get("collect_real_slope").equals("$[slope]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + collectedData.put("collect_real_slope", "0"); //$NON-NLS-1$ //$NON-NLS-2$ } - return true; - } - - public boolean waitForXPath(String xpath, RemoteWebDriver driver) { - int i = 0; - while (!isXPathPresent(xpath, driver)) { - try { - Thread.sleep(1000); - } catch (final InterruptedException e) { - return false; - } - i++; - if (i > 30) { - return false; - } + if (collectedData.get("collect_real_aspect") != null && collectedData.get("collect_real_aspect").equals("$[aspect]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + collectedData.put("collect_real_aspect", "0"); //$NON-NLS-1$ //$NON-NLS-2$ } - return true; - } - - private Thread getClosingBrowsersThread() { - return new Thread("Quit the open browsers") { - @Override - public void run() { - isClosing = true; - CopyOnWriteArrayList driversCopy = new CopyOnWriteArrayList<>(drivers); - for (Iterator iterator = driversCopy.iterator(); iterator.hasNext();) { - RemoteWebDriver remoteWebDriver = iterator.next(); - try { - remoteWebDriver.quit(); - } catch (final Exception e) { - logger.error("Error quitting the browser", e); - } - } - - } - }; - } - - @Override - public void update(Observable o, Object arg) { - if (ServerInitializationEvent.SERVER_STOPPED_EVENT.equals(arg)) { - this.closeBrowsers(); + if (collectedData.get("collect_coord_location").equals("$[latitude],$[longitude]")) { //$NON-NLS-1$ //$NON-NLS-2$ + collectedData.put("collect_coord_location", "0,0"); //$NON-NLS-1$ //$NON-NLS-2$ } } - private RemoteWebDriver getWebDriverGeeCodeEditor() { - return webDriverGeeCodeEditor; - } - - protected void setWebDriverGeeCodeEditor(RemoteWebDriver webDriverGeeCodeEditor) { - this.webDriverGeeCodeEditor = webDriverGeeCodeEditor; - } - -} +} \ No newline at end of file From 07af13c710d7f14019ba41f31be11f724afae9e9 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:06 +0100 Subject: [PATCH 1036/1620] New translations SaveEarthDataServlet.java (Spanish) --- .../earth/app/view/Messages_es.properties | 918 +----------------- 1 file changed, 48 insertions(+), 870 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 5a933d094d..b23ed83438 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,909 +1,87 @@ -package org.openforis.collect.earth.app.service; +package org.openforis.collect.earth.app.server; -import java.io.BufferedWriter; -import java.io.File; import java.io.IOException; -import java.io.StringWriter; -import java.io.Writer; -import java.net.URI; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; import java.util.Map; -import java.util.Observable; -import java.util.Observer; -import java.util.concurrent.CopyOnWriteArrayList; -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.desktop.ServerController; -import org.openforis.collect.earth.app.desktop.ServerController.ServerInitializationEvent; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.sampler.model.SimpleCoordinate; -import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; -import org.openqa.selenium.By; -import org.openqa.selenium.JavascriptExecutor; -import org.openqa.selenium.WebDriverException; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.firefox.FirefoxDriver; -import org.openqa.selenium.firefox.GeckoDriverService; -import org.openqa.selenium.remote.RemoteWebDriver; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.InitializingBean; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.view.Messages; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import freemarker.cache.FileTemplateLoader; -import freemarker.template.Configuration; -import freemarker.template.Template; -import freemarker.template.TemplateException; -import freemarker.template.Version; -import io.github.bonigarcia.wdm.WebDriverManager; -import liquibase.repackaged.org.apache.commons.lang3.SystemUtils; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; /** - * This class contains methods that allow Collect Earth to open browser windows - * that allow the user to have a better understanding of the plot. So far there - * are integrations with Google Earth Engine, Google Earth Engine Timelapse and - * Bing Maps. When a user clicks on a plot Collect Earth will check if the - * program is set to open any of these integrations, and if it is so it will - * open each one in its own window. These windows are closed when the program - * is closed. - *s + * Servlet called for updating/saving the information about a placemark. Called from the form in Google Earth when the user interacts with it or clicks the save button. * @author Alfonso Sanchez-Paus Diaz * + * @deprecated Replaced by {@link PlacemarkDataController} + * */ -@Component -public class BrowserService implements InitializingBean, Observer { - +@Deprecated +@Controller +public class SaveEarthDataServlet extends JsonPocessorServlet { @Autowired - private LocalPropertiesService localPropertiesService; + LocalPropertiesService localPropertiesService; - @Autowired - private GeolocalizeMapService geoLocalizeTemplateService; - - @Autowired - private EarthSurveyService earthSurveyService; - - @Autowired - private CodeEditorHandlerThread codeEditorHandlerThread; + //@Autowired + //CollectDesignerController collectDesignerController; - private final ArrayList drivers = new ArrayList<>(); - private final Logger logger = LoggerFactory.getLogger(BrowserService.class); - private static final String TEMPLATE_FOR_DGMAP_JS = "resources/javascript_dgmap.fmt"; - private static final Configuration cfg = new Configuration(new Version("2.3.23")); - private RemoteWebDriver webDriverBing, webDriverBaidu, webDriverTimelapse, webDriverGeeCodeEditor, - webDriverHere, webDriverStreetView, webDriverYandex, webDriverPlanetHtml, webDriverExtraMap, webDriverSecureWatch, - webDriverGEEMap, webDriverEarthMap; + @Deprecated + @GetMapping("/saveData") + public void saveData(HttpServletRequest request, HttpServletResponse response) throws IOException { - Map locks = new HashMap(); - - private static boolean geeMethodUpdated = false; - - private boolean isClosing = false; - - public void closeBrowsers() { - synchronized (this) { - getClosingBrowsersThread().start(); - } - } - - @Override - public void afterPropertiesSet() throws Exception { - Runtime.getRuntime().addShutdownHook(getClosingBrowsersThread()); - setGeckoDriverPath(); - } - - private RemoteWebDriver chooseDriver() throws BrowserNotFoundException { - RemoteWebDriver driver = null; - final String browserSetInProperties = localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim(); + Map collectedData = extractRequestData(request); - if (browserSetInProperties.equalsIgnoreCase(EarthConstants.CHROME_BROWSER)) { - driver = tryStartChrome(); - } else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.FIREFOX_BROWSER)) { - driver = tryStartFirefox(); - } else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.EDGE_BROWSER)) { - driver = tryStartEdge(); - }else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.SAFARI_BROWSER)) { - driver = tryStartSafari(); - } - - // If the browser chosen is not installed try to find and installed browser in the computer - if( driver== null ) { - driver = tryStartChrome(); - if( driver== null ) { - driver = tryStartFirefox(); - } - if( driver== null ) { - driver = tryStartEdge(); - } - if( driver== null ) { - driver = tryStartSafari(); - } - } - - if (driver == null) { - throw new BrowserNotFoundException( - "Neither Chrome nor Firefox could be opened. You need to have one of them installed in order to use GEE, Bing Maps or Saiku."); - } - - return driver; - } - - private RemoteWebDriver tryStartFirefox() { - RemoteWebDriver driver = null; - try { - driver = (RemoteWebDriver) WebDriverManager.firefoxdriver().create(); - } catch (final WebDriverException e) { - logger.warn( - "Problem starting Firefox browser!", - e); - } - return driver; - } - - private RemoteWebDriver tryStartEdge() { - RemoteWebDriver driver = null; - try { - driver = (RemoteWebDriver) WebDriverManager.edgedriver().create(); - } catch (final WebDriverException e) { - logger.warn( - "Problem starting Edge browser", - e); - } - return driver; - } + replaceTestVariables(collectedData); - private RemoteWebDriver tryStartSafari() { - RemoteWebDriver driver = null; - try { - driver = (RemoteWebDriver) WebDriverManager.safaridriver().create(); - } catch (final WebDriverException e) { - logger.warn( - "Problem starting Safari browser", - e); - } - return driver; - } - - private RemoteWebDriver tryStartChrome() { - RemoteWebDriver driver = null; - try { - driver = (RemoteWebDriver) WebDriverManager.chromedriver().create(); - } catch (final Exception e) { - logger.warn( - "Problem starting Chrome browser", - e); - } - return driver; - } - - - private String getDGMapJavascript(SimplePlacemarkObject placemarkObject) { - final Map data = geoLocalizeTemplateService.getPlacemarkData(placemarkObject); - data.put("latitude", placemarkObject.getCoord().getLatitude()); - data.put("longitude", placemarkObject.getCoord().getLongitude()); - return processJavascriptTemplate(data, TEMPLATE_FOR_DGMAP_JS); - } - - private String processJavascriptTemplate(final Map data, String templateName) { - Writer out; - String result = null; - try (StringWriter fw = new StringWriter();) { - // Load template from source folder - cfg.setTemplateLoader(new FileTemplateLoader(new File(System.getProperty("user.dir")))); - final Template template = cfg.getTemplate(templateName); - - // Console output - out = new BufferedWriter(fw); - - // Add date to avoid caching - template.process(data, out); - - out.flush(); - - result = fw.toString(); - - } catch (final TemplateException e) { - logger.error("Error when generating the javascript commands", e); - } catch (final IOException e) { - logger.error("Error when reading/writing the template information", e); - } - return result; - } - - private RemoteWebDriver initBrowser() throws BrowserNotFoundException { - RemoteWebDriver driver = null; - driver = chooseDriver(); - if (isClosing) { // In case the browser takes so long to start that the user closes CE and this - // method is called when the other windows are being closed - driver.quit(); - driver = null; + if (collectedData.size() == 0) { + setResult(false, Messages.getString("SaveEarthDataServlet.0"), collectedData); //$NON-NLS-1$ + getLogger().info("The request was empty"); //$NON-NLS-1$ } else { - drivers.add(driver); - } - return driver; - } - - public static boolean isIdOrNamePresent(String elementId, RemoteWebDriver driver) { - boolean found = false; - - try { - if (driver.findElementById(elementId).isDisplayed() || driver.findElementByName(elementId).isDisplayed()) { - found = true; - } - } catch (final Exception e) { - // Not found - } - - return found; - } - - public static boolean isCssElementPresent(String cssElement, RemoteWebDriver driver) { - boolean found = false; - - try { - WebElement elementByCssSelector = driver.findElementByCssSelector(cssElement); - found = elementByCssSelector != null; - } catch (final Exception e) { - // Not found - } - - return found; - } - - private boolean isXPathPresent(String xpath, RemoteWebDriver driver) { - boolean found = false; - - try { - if (driver.findElementByXPath(xpath).isDisplayed()) { - found = true; - } - logger.debug(String.format("Found %s", xpath)); - } catch (final Exception e) { - logger.debug(String.format("Not Found %s", xpath)); - } - - return found; - } - - private boolean loadPlotInDGMap(SimplePlacemarkObject placemarkObject, RemoteWebDriver driver) { - - boolean success = true; - if (driver != null && waitFor("mainContent", driver) && driver instanceof JavascriptExecutor) { - try { - String dgmapJs = getDGMapJavascript(placemarkObject); - driver.executeScript(dgmapJs); - - Thread.sleep( 1000 ); - // Unlock the view if it is locked - if( isCssElementPresent(".lock.on", driver) ) { - driver.findElementByCssSelector(".lock.on").click(); // UNLOCK - } - - } catch (final Exception e) { - processSeleniumError(e); - success = false; - } - } - return success; - } - - public void clickOnElements(RemoteWebDriver driver, String cssSelector) { - final List dataLayerVisibility = driver.findElementsByCssSelector(cssSelector); - for (final WebElement webElement : dataLayerVisibility) { - if (webElement.isDisplayed()) { - webElement.click(); - } - } - } - - public static boolean isGeeMethodUpdated() { - return geeMethodUpdated; - } - - public static void setGeeMethodUpdated(boolean geeMethosUpdated) { - BrowserService.geeMethodUpdated = geeMethosUpdated; - } - - private void processSeleniumError(final Exception e) { - if (e.getCause() != null && e.getCause().getMessage() != null - && !e.getCause().getMessage().contains("latitude")) { - logger.warn("Error in the selenium driver", e); - } else { - logger.info("Error in the selenium driver provoked by known bug", e); - } - } - - public RemoteWebDriver navigateTo(String url, RemoteWebDriver driver) throws BrowserNotFoundException { - return navigateTo(url, driver, true); - } - - /** - * Loads the given URL into the browser. If the browser is null then a new - * browser window is open. - * - * @param url - * The URL to load. - * @param driverParam - * The browser window to use. If this value is null a new browser - * window is open. - * @param retry - * Specify if there should be a second try to open a browser window - * if the first time fails (useful if the browser could not be found) - * @return The browser window (firefox or chrome depending on the configuration) - * used to open the URL. - * @throws BrowserNotFoundException - * Exception thrown when there is no Firefox/Chrome installed - */ - public RemoteWebDriver navigateTo(String url, RemoteWebDriver driverParam, boolean retry) - throws BrowserNotFoundException { - - RemoteWebDriver driver = driverParam; - - if (driver == null || !isDriverWorking(driver)) { - driver = initBrowser(); - } - - if (driver != null) { - try { - driver.navigate().to(url); - } catch (final Exception e) { - if (retry && (e.getCause() != null && e.getCause().getMessage() != null - && e.getCause().getMessage().contains("Session not found"))) { - // Browser closed, restart it! - logger.error("Browser was closed, restaring it...", e); - driver = initBrowser(); - navigateTo(url, driver, false); // only try to re-open one - } - } - } else { - logger.error("No Selenium driver available, Is Firefox or Chrome installed?"); - } - return driver; - } - - protected boolean isDriverWorking(RemoteWebDriver driver) { - boolean stillWorking = true; - try { - driver.findElement(By.xpath("//body")); - } catch (Exception e) { - stillWorking = false; - } - return stillWorking; - } - - /** - * Opens a browser window with the Bing Maps representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openBingMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("BING"); - synchronized (lock) { - if (localPropertiesService.isBingMapsSupported()) { - try { - webDriverBing = navigateTo(geoLocalizeTemplateService - .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_BING_HTML_TEMPLATE, - "bingMapsKey", localPropertiesService.getValue(EarthProperty.BING_MAPS_KEY)) - .toString(), webDriverBing); - } catch (final Exception e) { - logger.error("Problems loading Bing", e); - } - } - } - } - - private Object getLock(String key) { - String lock = locks.get(key); - if( lock !=null ) { - return lock; - }else{ - locks.put(key, key); - return key; - } - } - - /** - * Opens a browser window with the Planet Basemaps representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openPlanetMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("PLANET"); - synchronized (lock) { - if (localPropertiesService.isPlanetMapsSupported()) { - - boolean monthly = localPropertiesService.isPlanetMapsMonthlyOpen(); - - String template = monthly ? GeolocalizeMapService.FREEMARKER_PLANET_NICFI_ARGUMENTS : GeolocalizeMapService.FREEMARKER_PLANET_DAILY_HTML_TEMPLATE; - String key = monthly ? localPropertiesService.getValue( EarthProperty.PLANET_MAPS_CE_KEY ) : localPropertiesService.getValue( EarthProperty.PLANET_MAPS_KEY ); - - try { - - String processTemplate = geoLocalizeTemplateService.getUrlToFreemarkerOutput( - placemarkObject, - template, - "planetMapsKey", - key, - "urlPlanetEndpointPrefix", - ServerController.getHostAddress(localPropertiesService.getHost(),localPropertiesService.getPort()) - ).toString(); - - String urlPlanet = null; - if( monthly ) { - - String parameters = FileUtils.readFileToString( new File( new URI( processTemplate ) ) , StandardCharsets.UTF_8 ); - - // remove new lines - parameters = parameters.replace("\n", "").replace("\r", "").replace("\t", "").replace(" ", ""); - // remove trailing commas - parameters = parameters.replace(",],", "],").replace("],]", "]]"); - - urlPlanet = localPropertiesService.getValue( EarthProperty.PLANET_NICFI_URL ) + parameters; - }else { - urlPlanet = processTemplate; - } - - webDriverPlanetHtml = navigateTo( urlPlanet, webDriverPlanetHtml ); - - } catch (final Exception e) { - logger.error("Problems loading Planet", e); - } - } - } - } - - /** - * Opens a browser window with the Baidu Maps representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openBaiduMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("BAIDU"); - synchronized (lock) { - if (localPropertiesService.isBaiduMapsSupported()) { - - try { - webDriverBaidu = navigateTo(geoLocalizeTemplateService - .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_BAIDU_HTML_TEMPLATE) - .toString(), webDriverBaidu); - } catch (final Exception e) { - logger.error("Problems loading Baidu", e); - } - } - } - } - - /** - * Opens a browser window with the Yandex Maps representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openYandexMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("YANDEX"); - synchronized (lock) { - if (localPropertiesService.isYandexMapsSupported()) { - try { - webDriverYandex = navigateTo(geoLocalizeTemplateService.getUrlToFreemarkerOutput(placemarkObject, - GeolocalizeMapService.FREEMARKER_YANDEX_HTML_TEMPLATE).toString(), webDriverYandex); - } catch (final Exception e) { - logger.error("Problems loading Yandex", e); - } - } - } - } - - /** - * Opens a browser window with a map representation of the plot in SecureWatch. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openSecureWatch(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("SECUREWATCH"); - synchronized (lock) { - if ( localPropertiesService.isSecureWatchSupported() ) { - String url = getUrlBaseIntegration(placemarkObject, localPropertiesService.getSecureWatchURL() + "/#18/LATITUDE/LONGITUDE" ); - webDriverSecureWatch = navigateTo(url, webDriverSecureWatch); - try { - logger.warn("Loading layers - {}", placemarkObject); - loadPlotInDGMap(placemarkObject, webDriverSecureWatch); - } catch (final Exception e) { - logger.error("Error when opening Secure Watch browser window", e); - } - } - } - } - - /** - * Opens a browser window with a map representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openExtraMap(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("EXTRA"); - synchronized (lock) { - if (!StringUtils.isBlank(localPropertiesService.getExtraMap())) { - webDriverExtraMap = navigateTo( getUrlBaseIntegration(placemarkObject, localPropertiesService.getExtraMap() ) , webDriverExtraMap ); - } - } - } - - private String getUrlBaseIntegration(SimplePlacemarkObject placemarkObject, String url) { - String temp = null; - try { - String latitude = placemarkObject.getCoord().getLatitude(); - String longitude = placemarkObject.getCoord().getLongitude(); - String id = placemarkObject.getPlacemarkId().split(",")[0]; // for cases where ID also has round, then - // the id string would be something like - // "plotId,round", we only want the ID - - temp = url.replace("LATITUDE", latitude).replace("LONGITUDE", longitude).replace("PLOT_ID", id); - - } catch (final Exception e) { - logger.error("Problems Getting the URL filling for " + url, e); - } - return temp; - } - - /** - * Opens a browser window with the Google Street View representation of the - * plot. - * https://www.google.com/maps/@43.7815661,11.1484876,3a,75y,210.23h,82.32t/data=!3m6!1e1!3m4!1sEz7NiCbaIYzTJkP_RMBiqw!2e0!7i13312!8i6656?hl=en - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openStreetView(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("STREET_VIEW"); - synchronized (lock) { - if (localPropertiesService.isStreetViewSupported()) { - try { - webDriverStreetView = navigateTo( - geoLocalizeTemplateService.getUrlToFreemarkerOutput(placemarkObject, - GeolocalizeMapService.FREEMARKER_STREET_VIEW_HTML_TEMPLATE, "googleMapsApiKey", - localPropertiesService.getValue(EarthProperty.GOOGLE_MAPS_API_KEY)).toString(), - webDriverStreetView); - } catch (final Exception e) { - logger.error("Problems loading Street View", e); - } - } - } - } - - /** - * Opens a browser window with the Here Maps representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openHereMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("HERE"); - synchronized (lock) { - if (localPropertiesService.isHereMapsSupported()) { - try { - webDriverHere = navigateTo(geoLocalizeTemplateService - .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_HERE_HTML_TEMPLATE, - "hereAppId", localPropertiesService.getValue(EarthProperty.HERE_MAPS_APP_ID), - "hereAppCode", localPropertiesService.getValue(EarthProperty.HERE_MAPS_APP_CODE)) - .toString(), webDriverHere); - } catch (final Exception e) { - logger.error("Problems loading Here Maps", e); - } - - } - } - } - - private StringBuilder getGeoJsonSegment(List coordinates) { - StringBuilder geoJson = new StringBuilder("["); - if (coordinates != null) { - for (SimpleCoordinate coord : coordinates) { - geoJson = geoJson.append("[").append(coord.getLongitude()).append(",").append(coord.getLatitude()) - .append("],"); - } - // remove last character - geoJson = geoJson.deleteCharAt(geoJson.length() - 1); - } - geoJson = geoJson.append("],"); - return geoJson; - } - - - - - private String getFeature(SimplePlacemarkObject placemarkObject, String shapeType, String name ) { - StringBuilder feature = new StringBuilder("{\"type\":\"Feature\",\"properties\":{\"name\":\"").append( name).append("\"},\"geometry\":"); - feature= feature.append( getGeoJson(placemarkObject, shapeType )).append("}"); - return feature.toString(); - } - - private String getGeoJson(SimplePlacemarkObject placemarkObject, String shapeType ) { - - StringBuilder geoJson = new StringBuilder("{\"type\":\"" ).append( shapeType).append("\",\"coordinates\":["); - List shape = placemarkObject.getShape(); - geoJson = geoJson.append(getGeoJsonSegment(shape)); - geoJson = geoJson.deleteCharAt(geoJson.length() - 1); - geoJson = geoJson.append("]}"); - return geoJson.toString(); - } - - /** - * Opens a browser window with the Google Earth Engine Code Editor and runs the - * freemarker template found in resources/eeCodeEditorScript.fmt on the main - * editor of GEE. - * - * @param placemarkObject - * The center point of the plot. - * @throws BrowserNotFoundException - * If the browser cannot be found - * - */ - public void openGEEAppURL(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("GEEAPP"); - synchronized (lock) { - if (localPropertiesService.isGEEAppSupported()) { - - try { - StringBuilder url = new StringBuilder(localPropertiesService.getGEEAppURL()); - url = url.append("#geoJson=") - .append(URLEncoder.encode(getGeoJson(placemarkObject, "MultiLineString"), StandardCharsets.UTF_8.toString())) - .append(";"); - url = url.append("plotId=") - .append(URLEncoder.encode(placemarkObject.getPlacemarkId(), StandardCharsets.UTF_8.toString())) - .append(";"); - url = url.append("survey=") - .append(URLEncoder.encode( earthSurveyService.getCollectSurvey().getName() , StandardCharsets.UTF_8.toString())) - .append(";"); - webDriverGEEMap = navigateTo(url.toString(), webDriverGEEMap); - webDriverGEEMap.navigate().refresh(); // FORCE REFRESH - OTHERWISE WINDOW IS NOT REFRESHED FOR SOME STRANGE REASON - } catch (final Exception e) { - logger.error("Problems loading GEE APP window", e); - } - } - } - } - - - public void openEarthMapURL(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("EARTH_MAP"); - synchronized (lock) { - if (localPropertiesService.isEarthMapSupported()) { - - - try { - StringBuilder url = new StringBuilder(localPropertiesService.getEarthMapURL()).append("?"); - url = url.append("polygon=") - .append(URLEncoder.encode(getFeature(placemarkObject, "Polygon", placemarkObject.getPlacemarkId()), StandardCharsets.UTF_8.toString())) - .append("&"); - - if( StringUtils.isNotBlank(localPropertiesService.getEarthMapLayers()) ) { - url = url.append("layers=") - .append(URLEncoder.encode(localPropertiesService.getEarthMapLayers(), StandardCharsets.UTF_8.toString())) - .append("&"); - } - - if( StringUtils.isNotBlank(localPropertiesService.getEarthMapScripts()) ) { - url = url.append("scripts=") - .append(URLEncoder.encode(localPropertiesService.getEarthMapScripts(), StandardCharsets.UTF_8.toString())) - .append("&"); - } - - String aoi = localPropertiesService.getEarthMapAOI(); - if( StringUtils.isBlank(aoi) ) { - aoi = "global"; - } - url = url.append("aoi=") - .append(URLEncoder.encode( aoi, StandardCharsets.UTF_8.toString() )) - .append("&embed=true"); // Set the EMBED parameter to true so that the user does not need to log in. - - webDriverEarthMap = navigateTo(url.toString(), webDriverEarthMap); - //Desktop.getDesktop().browse( new URI( url.toString() ) ); - //webDriverEarthMap.navigate().refresh(); // FORCE REFRESH - OTHERWISE WINDOW IS NOT REFRESHED FOR SOME STRANGE REASON - } catch (final Exception e) { - logger.error("Problems loading Earth Map window", e); - } + if (getDataAccessor().saveData(collectedData)) { + setResult(true, Messages.getString("SaveEarthDataServlet.2"), collectedData); //$NON-NLS-1$ + } else { + setResult(false, Messages.getString("SaveEarthDataServlet.1"), collectedData); //$NON-NLS-1$ + getLogger().error("The data could not be saved"); //$NON-NLS-1$ } } - } - - /** - * Opens a browser window with the Google Earth Engine Code Editor and runs the - * freemarker template found in resources/eeCodeEditorScript.fmt on the main - * editor of GEE. - * - * @param placemarkObject - * The center point of the plot. - * @throws BrowserNotFoundException - * If the browser cannot be found - * - */ - public void openGEECodeEditor(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("CODE_EDITOR"); - synchronized (lock) { - if (localPropertiesService.isCodeEditorSupported()) { - boolean firstOpening = false; - if (getWebDriverGeeCodeEditor() == null) { - setWebDriverGeeCodeEditor(initBrowser()); - firstOpening = true; - } - - if (firstOpening && (liquibase.repackaged.org.apache.commons.lang3.SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX)) { - codeEditorHandlerThread.disableCodeEditorAutocomplete(getWebDriverGeeCodeEditor()); - } - - codeEditorHandlerThread.loadCodeEditorScript(placemarkObject, getWebDriverGeeCodeEditor()); - } - } + setJsonResponse(response, collectedData); } - /** - * Opens a browser window with the Google Earth Engine Timelapse representation - * of the plot. - * - * @param placemarkObject - * The center point of the plot. - * @throws BrowserNotFoundException - * If the browser cannot be found + * This method replaces the variable values that the form contains when it is not run + * through Google Earth and the variable replacement of the ExtendedData of the KML does not kick in. * + * @param collectedData + * The data POSTed by the form that has already been processed. */ - public void openTimelapse(final SimplePlacemarkObject placemarkObject) - throws BrowserNotFoundException { - Object lock = getLock("TIMELAPSE"); - synchronized (lock) { - if (localPropertiesService.isTimelapseSupported()) { - try { - String coordinates = placemarkObject.getCoord().toString(); - webDriverTimelapse = navigateTo( - "https://earthengine.google.org/timelapse/timelapseplayer_v2.html?timelapseclient=http://earthengine.google.org/timelapse/data&v=" - + coordinates + ",10.812,latLng&t=0.08", - webDriverTimelapse); - } catch (final Exception e) { - logger.error("Problems loading Timelapse", e); - } - } + private void replaceTestVariables(Map collectedData) { + // REMOVE THIS!!!! + if (collectedData.get(EarthConstants.PLACEMARK_ID_PARAMETER).equals("$[id]")) { //$NON-NLS-1$ //$NON-NLS-2$ + collectedData.put(EarthConstants.PLACEMARK_ID_PARAMETER, "testPlacemark"); //$NON-NLS-1$ //$NON-NLS-2$ } - } - private void setGeckoDriverPath() { - String geckoDriverPath = ""; - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { - geckoDriverPath = "resources/geckodriver_mac"; - } else if (SystemUtils.IS_OS_UNIX) { - if (System.getProperty("os.arch").contains("64") - || System.getProperty("sun.arch.data.model").equals("64")) { - geckoDriverPath = "resources/geckodriver_64"; - } else { - geckoDriverPath = "resources/geckodriver_32"; - } - } else if (SystemUtils.IS_OS_WINDOWS) { - try { - if (System.getProperty("os.arch").contains("64") - || System.getProperty("sun.arch.data.model").equals("64")) - geckoDriverPath = "resources/geckodriver_64.exe"; - else - geckoDriverPath = "resources/geckodriver_32.exe"; - } catch (Exception e) { - geckoDriverPath = "resources/geckodriver_64.exe"; - } - } else { - throw new IllegalArgumentException("Geckodriver is not supported in the current OS"); + if (collectedData.get("collect_integer_elevation") != null && collectedData.get("collect_integer_elevation").equals("$[elevation]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + collectedData.put("collect_integer_elevation", "0"); //$NON-NLS-1$ //$NON-NLS-2$ } - File geckoDriverFile = new File(geckoDriverPath); - - // if above property is not working or not opening the application in browser - // then try below property - System.setProperty(GeckoDriverService.GECKO_DRIVER_EXE_PROPERTY, geckoDriverFile.getAbsolutePath()); - System.setProperty(FirefoxDriver.SystemProperty.DRIVER_USE_MARIONETTE, "true"); - - } - - public boolean waitFor(String elementId, RemoteWebDriver driver) { - int i = 0; - while (!isIdOrNamePresent(elementId, driver)) { - try { - Thread.sleep(1000); - } catch (final InterruptedException e) { - return false; - } - i++; - if (i > 60) { - return false; - } + if (collectedData.get("collect_real_slope") != null && collectedData.get("collect_real_slope").equals("$[slope]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + collectedData.put("collect_real_slope", "0"); //$NON-NLS-1$ //$NON-NLS-2$ } - return true; - } - - public boolean waitForXPath(String xpath, RemoteWebDriver driver) { - int i = 0; - while (!isXPathPresent(xpath, driver)) { - try { - Thread.sleep(1000); - } catch (final InterruptedException e) { - return false; - } - i++; - if (i > 30) { - return false; - } + if (collectedData.get("collect_real_aspect") != null && collectedData.get("collect_real_aspect").equals("$[aspect]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + collectedData.put("collect_real_aspect", "0"); //$NON-NLS-1$ //$NON-NLS-2$ } - return true; - } - - private Thread getClosingBrowsersThread() { - return new Thread("Quit the open browsers") { - @Override - public void run() { - isClosing = true; - CopyOnWriteArrayList driversCopy = new CopyOnWriteArrayList<>(drivers); - for (Iterator iterator = driversCopy.iterator(); iterator.hasNext();) { - RemoteWebDriver remoteWebDriver = iterator.next(); - try { - remoteWebDriver.quit(); - } catch (final Exception e) { - logger.error("Error quitting the browser", e); - } - } - - } - }; - } - - @Override - public void update(Observable o, Object arg) { - if (ServerInitializationEvent.SERVER_STOPPED_EVENT.equals(arg)) { - this.closeBrowsers(); + if (collectedData.get("collect_coord_location").equals("$[latitude],$[longitude]")) { //$NON-NLS-1$ //$NON-NLS-2$ + collectedData.put("collect_coord_location", "0,0"); //$NON-NLS-1$ //$NON-NLS-2$ } } - private RemoteWebDriver getWebDriverGeeCodeEditor() { - return webDriverGeeCodeEditor; - } - - protected void setWebDriverGeeCodeEditor(RemoteWebDriver webDriverGeeCodeEditor) { - this.webDriverGeeCodeEditor = webDriverGeeCodeEditor; - } - -} +} \ No newline at end of file From 0b019f2a3f60e537f8a71f5c153d0fb0d5f851e8 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:08 +0100 Subject: [PATCH 1037/1620] New translations PlacemarkBrowserServlet.java (Spanish) --- .../earth/app/view/Messages_es.properties | 364 +++++++++++++++--- 1 file changed, 319 insertions(+), 45 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index b23ed83438..de96e18020 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,87 +1,361 @@ package org.openforis.collect.earth.app.server; -import java.io.IOException; +import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.service.BrowserService; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.KmlGeneratorService; import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.view.Messages; +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; +import org.openforis.collect.earth.sampler.processor.KmlGenerator; +import org.openforis.collect.earth.sampler.utils.KmlGenerationException; +import org.openforis.idm.metamodel.AttributeDefinition; +import org.opengis.referencing.operation.TransformException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import com.opencsv.CSVReader; /** - * Servlet called for updating/saving the information about a placemark. Called from the form in Google Earth when the user interacts with it or clicks the save button. - * @author Alfonso Sanchez-Paus Diaz + * Servlet to return the information that is stored in Collect Earth for one + * placemark (plot) * - * @deprecated Replaced by {@link PlacemarkDataController} + * @author Alfonso Sanchez-Paus Diaz * */ -@Deprecated @Controller -public class SaveEarthDataServlet extends JsonPocessorServlet { +public class PlacemarkBrowserServlet { + @Autowired + private BrowserService browserService; + + @Autowired + private EarthSurveyService earthSurveyService; @Autowired - LocalPropertiesService localPropertiesService; + private LocalPropertiesService localPropertiesService; + + @Autowired + private KmlGeneratorService kmlGeneratorService; + + private KmlGenerator kmlGenerator; + + private SimplePlacemarkObject lastPlacemark = null; + + private final Logger logger = LoggerFactory.getLogger( PlacemarkBrowserServlet.class ); + + private final class OpenBrowserThread extends Thread { + + private SimplePlacemarkObject placemarkObject; + + private OpenBrowserThread(String name, SimplePlacemarkObject placemarkObject) { + super(name); + this.placemarkObject = placemarkObject; + } + + @Override + public void run() { + // If this is the first plot or the plot is the last one that + // was opened + if (lastPlacemark == null + || !lastPlacemark.equals( placemarkObject ) ) { + + try { + kmlGenerator.fillSamplePoints(placemarkObject); + + kmlGenerator.fillExternalLine(placemarkObject); + + openGEEAppWindow(placemarkObject); + + openGEECodeEditorWindow(placemarkObject); + + openEarthMapWindow( placemarkObject ); - //@Autowired - //CollectDesignerController collectDesignerController; + openTimeLapseWindow(placemarkObject); + openBingMapsWindow(placemarkObject); - @Deprecated - @GetMapping("/saveData") - public void saveData(HttpServletRequest request, HttpServletResponse response) throws IOException { + openBaiduMapsWindow(placemarkObject); - Map collectedData = extractRequestData(request); + openYandexMapsWindow(placemarkObject); - replaceTestVariables(collectedData); + openExtraMapWindow(placemarkObject); - if (collectedData.size() == 0) { - setResult(false, Messages.getString("SaveEarthDataServlet.0"), collectedData); //$NON-NLS-1$ - getLogger().info("The request was empty"); //$NON-NLS-1$ - } else { - if (getDataAccessor().saveData(collectedData)) { - setResult(true, Messages.getString("SaveEarthDataServlet.2"), collectedData); //$NON-NLS-1$ - } else { - setResult(false, Messages.getString("SaveEarthDataServlet.1"), collectedData); //$NON-NLS-1$ - getLogger().error("The data could not be saved"); //$NON-NLS-1$ + openStreetViewWindow(placemarkObject); + + openPlanetMapsWindow(placemarkObject); + + openSecureWatchWindow(placemarkObject); + + } catch (TransformException|KmlGenerationException e) { + logger.error("Error generating polygon", e ); + } } + + lastPlacemark = placemarkObject; + + } + + + public void openEarthMapWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Earth Map window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openEarthMapURL(placemarkObject); + } catch (final Exception e) { + logger.error("Exception opening Earth Map window", e); //$NON-NLS-1$ + } + } + }.start(); + } + + public void openGEECodeEditorWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open GEE Playground window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openGEECodeEditor(placemarkObject); + } catch (final Exception e) { + logger.error("Exception opening Earth Engine Playground window", e); //$NON-NLS-1$ + } + } + }.start(); + } + + public void openGEEAppWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open GEE APP window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openGEEAppURL(placemarkObject); + } catch (final Exception e) { + logger.error("Exception opening Earth Engine APP window", e); //$NON-NLS-1$ + } + } + }.start(); + } + + public void openBingMapsWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Bing Maps window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openBingMaps(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Bing Maps window", e); //$NON-NLS-1$ + } + } + }.start(); + } + + + public void openPlanetMapsWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Planet Maps window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openPlanetMaps(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Planet Maps window", e); //$NON-NLS-1$ + } + } + }.start(); + } + + public void openSecureWatchWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open SecureWatch window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openSecureWatch(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening SecureWatch window", e); //$NON-NLS-1$ + } + } + }.start(); + } + + public void openBaiduMapsWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Baidu Maps window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openBaiduMaps(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Baidu Maps window", e); //$NON-NLS-1$ + + } + } + + }.start(); + } + + public void openYandexMapsWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Yandex Maps window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openYandexMaps(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Yandex Maps window", e); //$NON-NLS-1$ + + } + } + + }.start(); + } + + public void openExtraMapWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Expa Map window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openExtraMap(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Extra Map window", e); //$NON-NLS-1$ + + } + } + + }.start(); + } + + public void openStreetViewWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Street View window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openStreetView(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Street View window", e); //$NON-NLS-1$ + + } + } + + }.start(); + } + + public void openTimeLapseWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open TimeLapse window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openTimelapse(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Earth Engine window", e); //$NON-NLS-1$ + + } + } + + }.start(); } - setJsonResponse(response, collectedData); } - /** - * This method replaces the variable values that the form contains when it is not run - * through Google Earth and the variable replacement of the ExtendedData of the KML does not kick in. + + /* + * Opens the extra browser windows for Earth Engine, Timelapse and Bing. (non-Javadoc) * - * @param collectedData - * The data POSTed by the form that has already been processed. + * @see + * org.openforis.collect.earth.app.server.JsonPocessorServlet#processRequest + * (javax.servlet.http.HttpServletRequest, + * javax.servlet.http.HttpServletResponse) */ - private void replaceTestVariables(Map collectedData) { - // REMOVE THIS!!!! - if (collectedData.get(EarthConstants.PLACEMARK_ID_PARAMETER).equals("$[id]")) { //$NON-NLS-1$ //$NON-NLS-2$ - collectedData.put(EarthConstants.PLACEMARK_ID_PARAMETER, "testPlacemark"); //$NON-NLS-1$ //$NON-NLS-2$ + @GetMapping(path = "/openAuxiliaryWindows") + public void openAuxiliaryWindows( + HttpServletResponse response, + @RequestParam(value = "latLongCoordinates", required = false) final String latLongCoordinates) + { + try { + SimplePlacemarkObject placemarkObject = new SimplePlacemarkObject(latLongCoordinates.split(",") ); + OpenBrowserThread browserThread = new OpenBrowserThread("Open auxiliary windows " + latLongCoordinates, placemarkObject); + browserThread.start(); + } catch (Exception e) { + logger.error("Error loading browsers " , e); } + } - if (collectedData.get("collect_integer_elevation") != null && collectedData.get("collect_integer_elevation").equals("$[elevation]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - collectedData.put("collect_integer_elevation", "0"); //$NON-NLS-1$ //$NON-NLS-2$ - } + @GetMapping(path = "/ancillaryWindows") + public void openAuxiliaryWindowsNew(HttpServletResponse response, HttpServletRequest request) { + + + List keyAttributeDefinitions = earthSurveyService + .getRootEntityDefinition() + .getKeyAttributeDefinitions(); + + // the keys should the the parameter names + Map keys = request.getParameterMap(); - if (collectedData.get("collect_real_slope") != null && collectedData.get("collect_real_slope").equals("$[slope]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - collectedData.put("collect_real_slope", "0"); //$NON-NLS-1$ //$NON-NLS-2$ + String[] keysInOrder = new String[keys.size()]; + for (int i = 0; i < keyAttributeDefinitions.size(); i++) { + keysInOrder[i] = keys.get(keyAttributeDefinitions.get(i).getName())[0]; } - if (collectedData.get("collect_real_aspect") != null && collectedData.get("collect_real_aspect").equals("$[aspect]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - collectedData.put("collect_real_aspect", "0"); //$NON-NLS-1$ //$NON-NLS-2$ + try { + kmlGenerator = kmlGeneratorService.getKmlGenerator(); + + String[] csvValues = getValuesFromCsv(keysInOrder); + + if( csvValues == null ){ + throw new IllegalArgumentException("The keys " + keys.toString() + " are not present on the CSV file with the plot locations!!!"); + } + + SimplePlacemarkObject placemarkObject = kmlGenerator.getPlotObject(csvValues, null, earthSurveyService.getCollectSurvey() ); + OpenBrowserThread browserThread = new OpenBrowserThread("Open ancillary windows - polygon ", placemarkObject ); + browserThread.start(); + } catch (Exception e) { + logger.error("Error loading browsers " , e); } - if (collectedData.get("collect_coord_location").equals("$[latitude],$[longitude]")) { //$NON-NLS-1$ //$NON-NLS-2$ - collectedData.put("collect_coord_location", "0,0"); //$NON-NLS-1$ //$NON-NLS-2$ + } + + private String[] getValuesFromCsv(String[] keysInOrder) { + + final String csvFile = localPropertiesService.getCsvFile(); + try ( + CSVReader reader = CsvReaderUtils.getCsvReader( csvFile ); + ){ + + + String[] csvRow; + int numberOfKeys = keysInOrder.length; + while ((csvRow = reader.readNext()) != null) { + boolean foundIt = true; + for( int idx=0; idx Date: Tue, 29 Nov 2022 15:41:09 +0100 Subject: [PATCH 1038/1620] New translations PlacemarkInfoServlet.java (French) --- .../earth/app/view/Messages_fr.properties | 348 +++--------------- 1 file changed, 50 insertions(+), 298 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index c2259f5db0..0c1e208fbc 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,319 +1,71 @@ -package org.openforis.collect.earth.app.service; +package org.openforis.collect.earth.app.server; -import java.awt.Toolkit; -import java.awt.datatransfer.Clipboard; -import java.awt.datatransfer.StringSelection; -import java.io.File; import java.io.IOException; -import java.net.URISyntaxException; -import java.net.URL; -import java.nio.charset.StandardCharsets; -import java.util.NoSuchElementException; +import java.util.HashMap; +import java.util.Map; -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; -import org.openqa.selenium.By; -import org.openqa.selenium.JavascriptExecutor; -import org.openqa.selenium.Keys; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.remote.RemoteWebDriver; -import org.openqa.selenium.remote.RemoteWebElement; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; -import liquibase.repackaged.org.apache.commons.lang3.SystemUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +/** + * Servlet to return the information that is stored in Collect Earth for one placemark (plot) + * + * @author Alfonso Sanchez-Paus Diaz + * + * @deprecated Replaced by {@link PlacemarkDataController} + */ +@Deprecated +@Controller +public class PlacemarkInfoServlet extends JsonPocessorServlet { -@Component -public class CodeEditorHandlerThread { - private static final String RUN_SCRIPT_BUTTON = "button.run-button"; - private static final String RESET_SCRIPT_BUTTON = "button.reset-button"; - private SimplePlacemarkObject placemarkObject; - - private RemoteWebDriver webDriverGee; - - @Autowired - private BrowserService browserService; - private Logger logger = LoggerFactory.getLogger(CodeEditorHandlerThread.class); - - @Autowired - private GeolocalizeMapService geoLocalizeTemplateService; - - @Autowired - private LocalPropertiesService localPropertiesService; - - public boolean isCodeEditorShowing() { - return BrowserService.isCssElementPresent(RUN_SCRIPT_BUTTON, webDriverGee); - } - - public void runScript() throws IOException, URISyntaxException, InterruptedException { - - - try { - WebElement resetButton = webDriverGee.findElementByCssSelector(RESET_SCRIPT_BUTTON); - - forceClick( resetButton ); - - URL fileWithScript = geoLocalizeTemplateService.getTemporaryUrl(placemarkObject, getGeeCodeEditorTemplate()); - - WebElement textArea = webDriverGee.findElement(By.className("ace_text-input")); - - String contents = FileUtils.readFileToString(new File(fileWithScript.toURI()), StandardCharsets.UTF_8 ); - - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { - sendThroughKeys(textArea, contents); - - } else { - sendThroughClipboard(textArea, contents); - try { - // Fix bug provoked by antivirus not accepting the control characters sent by Selenium - WebElement element = webDriverGee.findElement(By.className("ace_line") ); - if( element!= null && element.getAttribute("value").trim().equals("av") ) { - sendThroughKeys(textArea, contents); - } - } catch (Exception e) { - logger.warn("Error while refreshing code editor", e); - - } - } - - Thread.sleep(1000); - WebElement runButton = webDriverGee.findElementByCssSelector(RUN_SCRIPT_BUTTON); - forceClick( runButton ); - } catch (NoSuchElementException e) { - try { - // retry - Thread.sleep(1000); - WebElement runButton = webDriverGee.findElementByCssSelector(RUN_SCRIPT_BUTTON); - forceClick( runButton ); - }catch (Exception e2) { - // TODO: handle exception - } - } - - } - - private void sendThroughClipboard(WebElement textArea, String contents) { - Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); - StringSelection clipboardtext = new StringSelection(contents); - clipboard.setContents(clipboardtext, null); - Keys controlChar = Keys.CONTROL; - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { - controlChar = Keys.COMMAND; - } - textArea.sendKeys(Keys.chord(controlChar, "a")); - textArea.sendKeys(Keys.chord(controlChar, "v")); - } - - private void sendThroughKeys(WebElement textArea, String contents) - throws InterruptedException { - // Command key (apple key) is not working on Chrome on Mac. Try with the right click - // This is not going to be fixed by Selenium - - // Remove comments so it is faster to send the text! - String noComments = removeComments(contents); - - // Clear the code area - WebElement clearButton = webDriverGee.findElementByCssSelector(RESET_SCRIPT_BUTTON); - forceClick( clearButton ); - - StringBuilder fixedScriptForMac = new StringBuilder(); - String[] lines = noComments.split("\\n"); - for (String line : lines) { - // Send the content of the script - String trimmedLine = line.trim(); - - // Add Spaces after "{" so we avoid the automatic closing of the method by GEE - // Playground JS - trimmedLine = trimmedLine.replace("{", "{ "); - - if (!StringUtils.isBlank(trimmedLine)) { - fixedScriptForMac = fixedScriptForMac.append(trimmedLine).append("\n"); - } - } - - fixedScriptForMac.append("//THE END"); // Don't remove this!!! this way we mark the point where there should be no trailing character removal - Keys controlChar = Keys.CONTROL; - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { - controlChar = Keys.COMMAND; - } - textArea.sendKeys(Keys.chord(controlChar, "a")); - textArea.sendKeys(fixedScriptForMac); -/* - Thread.sleep(500); - // Fix the extra characters added by removing the last 10 chars ( this is a bug from Selenium! ) - textArea.sendKeys(Keys.PAGE_DOWN); - Thread.sleep(500); - textArea.sendKeys(Keys.PAGE_DOWN); - */ - } - - private void forceClick( WebElement element ) { - JavascriptExecutor js = webDriverGee; - js.executeScript("arguments[0].click();", element); - } - - public String removeComments(String contents) { - - String wholeCode = contents; - wholeCode = wholeCode.replace("http://", ""); - wholeCode = wholeCode.replace("https://", ""); - wholeCode = wholeCode.replace("\r", ""); - - StringBuilder noComments = new StringBuilder(""); - int indexComments = contents.indexOf("//"); - if (indexComments != -1) { - while (indexComments >= 0) { - int endOfLine = contents.indexOf('\n', indexComments); - if (endOfLine != -1) - indexComments = contents.indexOf("//", endOfLine + 2); - else { - break; - } - - if (indexComments != -1) - noComments = noComments.append(contents.substring(endOfLine, indexComments)); - else - noComments = noComments.append(contents.substring(endOfLine)); - } - return noComments.toString(); - } else { - return wholeCode; - } - } /** - * Get the GEE Playground script that should be used. There is an standard one - * that resides in resources/eePlaygroundScript.fmt but a project might have its - * own script. - * - * @return The generic script in the resources folder or the file called - * eePlaygroundScript.fmt in the same folder where the current project - * file resides + * Returns a JSON object with the data collected for a placemark in the collect-earth format. + * @param request The request sent from Google Earth pop-up to Collect Earth + * @param response The response to the Collect Earth request + * @throws IOException Throws exception if the response cannot be written to the channel */ - private String getGeeCodeEditorTemplate() { - - String projectPlaygroundScript = getProjectGeeScript(); - if (projectPlaygroundScript != null) { - return projectPlaygroundScript; + @GetMapping("/placemarkInfo") + public void placemarkInfoOld(HttpServletRequest request, HttpServletResponse response) throws IOException { + Map collectedData = extractRequestData(request); + String placemarkId = getPlacemarkId(collectedData); + + if (placemarkId == null) { + setResult(false, "No placemark ID found in the request", collectedData); //$NON-NLS-1$ + getLogger().error("No placemark ID found in the received request"); //$NON-NLS-1$ } else { - return GeolocalizeMapService.FREEMARKER_GEE_CODE_EDITOR_TEMPLATE; // New format name since version 1.6.20 - } - - } - - /** - * @return The path to the GEE Code Editor generic script or the one that is - * specified in the project folder if it exists. - */ - private String getProjectGeeScript() { - // Is there a "eePlaygroundScript.fmt" file in the same folder than in the - // metadata file folder? - File projectGeePlayground = new File(localPropertiesService.getProjectFolder() + File.separatorChar - + GeolocalizeMapService.FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME); - - // Is there a "eeCodeEditorScript.fmt" file in the same folder than in the - // metadata file folder? NEW NAME AFTER 12/2017!!! - File projectGeeCodeEditor = new File(localPropertiesService.getProjectFolder() + File.separatorChar - + GeolocalizeMapService.FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME); - - String geeFilePath = null; - if (projectGeeCodeEditor.exists()) { // The new format name takes precedence - geeFilePath = projectGeeCodeEditor.getAbsolutePath(); - } else if (projectGeePlayground.exists()) { - geeFilePath = projectGeePlayground.getAbsolutePath(); - } - return geeFilePath; - } - - public void loadCodeEditorScript(SimplePlacemarkObject placemarkObject, RemoteWebDriver webDriverGeePlayground) { - this.placemarkObject = placemarkObject; - loadCodeEditorScript(webDriverGeePlayground); - } - - public void disableCodeEditorAutocomplete(RemoteWebDriver webDriverCodeEditor) { - this.webDriverGee = webDriverCodeEditor; - try { - if (!isCodeEditorShowing()) { - // Open GEE Playground - if (!browserService.isDriverWorking(webDriverGee) || webDriverGee.getCurrentUrl() == null - || !webDriverGee.getCurrentUrl().contains("google")) { - webDriverGee = browserService.navigateTo(localPropertiesService.getGeePlaygoundUrl(), webDriverGee); - browserService.setWebDriverGeeCodeEditor(webDriverGee); - } - - // Initially the login page appears! - while (!isCodeEditorShowing()) { // 5 minutes a 2 seconds == 30 * 5 = 150 - Thread.sleep(2000); - } - + placemarkId = replacePlacemarkIdTestValue(placemarkId); + collectedData = getDataAccessor().getData(placemarkId); + if (collectedData != null && collectedData.get(EarthConstants.PLACEMARK_FOUND_PARAMETER) != null + && collectedData.get(EarthConstants.PLACEMARK_FOUND_PARAMETER).equals("true")) { //$NON-NLS-1$ + setResult(true, "The placemark was found", collectedData); //$NON-NLS-1$ + getLogger().info("A placemark was found with these properties {}", collectedData ); //$NON-NLS-1$ } else { - disableAutoComplete(); + if (collectedData == null) { + collectedData = new HashMap<>(); + } + setResult(false, "No placemark found", collectedData); //$NON-NLS-1$ + getLogger().info("No placemark found {}", collectedData ); //$NON-NLS-1$ } - - } catch (final NoSuchElementException e) { - // This is a well known exception. Down-grade if to warning - logger.warn("Error when opening Earth Engine browser window. Known problem", e); - } catch (final Exception e) { - // This is a well known exception. - logger.error("Error when opening Earth Engine browser window", e); } - } - private void disableAutoComplete() { - // Display the settings in Google Earth Engine Code Editor (this emulates - // clicking on the settings icon) - webDriverGee.findElementByClassName("settings-menu-button").click(); - // Get the Div that is the parent of the one with text that contains - // Autocomplete - RemoteWebElement autocompleteButton = (RemoteWebElement) webDriverGee - .findElementByXPath("//div[contains(text(), \"Autocomplete\")]/.."); - - if (isAutocompleChecked(autocompleteButton)) { - // Disable the Autocomplete of special characters - autocompleteButton.click(); - } + setJsonResponse(response, collectedData); } - public boolean isAutocompleChecked(RemoteWebElement autocompleteButton) { - String buttonChecked = autocompleteButton.getAttribute("aria-checked"); - return buttonChecked.equals("true"); + private String getPlacemarkId(Map collectedData) { + return collectedData.get(EarthConstants.PLACEMARK_ID_PARAMETER); } - private void loadCodeEditorScript(RemoteWebDriver webDriverCodeEditor) { - this.webDriverGee = webDriverCodeEditor; - Thread loadGee = new Thread( - "Opening GEE Playground " + (placemarkObject != null ? placemarkObject.toString() : "")) { - @Override - public void run() { - try { - if (!isCodeEditorShowing()) { - // Open GEE Code Editor - if (!browserService.isDriverWorking(webDriverGee) || webDriverGee.getCurrentUrl() == null - || !webDriverGee.getCurrentUrl().contains("google")) { - webDriverGee = browserService.navigateTo(localPropertiesService.getGeePlaygoundUrl(), - webDriverGee); - browserService.setWebDriverGeeCodeEditor(webDriverGee); - } - // Initially the login page appears! - while (!isCodeEditorShowing()) { - sleep(2000); - } - } - runScript(); - } catch (final NoSuchElementException e) { - // This is a well known exception. Down-grade if to warning - logger.warn("Error when opening Earth Engine browser window. Known problem", e); - } catch (final Exception e) { - // This is a well known exception. - logger.error("Error when opening Earth Engine browser window", e); - } - } - }; - loadGee.start(); + private String replacePlacemarkIdTestValue(String placemarkId) { + if (placemarkId.equals("$[id]")) { //$NON-NLS-1$ + placemarkId = "testPlacemark"; //$NON-NLS-1$ + } + return placemarkId; } + } From 91274f816d377ca0823bab957be0b71f337bd1b4 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:10 +0100 Subject: [PATCH 1039/1620] New translations PlacemarkBrowserServlet.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 1026 ++++------------- 1 file changed, 239 insertions(+), 787 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 5a933d094d..de96e18020 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,909 +1,361 @@ -package org.openforis.collect.earth.app.service; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.IOException; -import java.io.StringWriter; -import java.io.Writer; -import java.net.URI; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; +package org.openforis.collect.earth.app.server; + import java.util.List; import java.util.Map; -import java.util.Observable; -import java.util.Observer; -import java.util.concurrent.CopyOnWriteArrayList; - -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.desktop.ServerController; -import org.openforis.collect.earth.app.desktop.ServerController.ServerInitializationEvent; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.sampler.model.SimpleCoordinate; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.openforis.collect.earth.app.service.BrowserService; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.KmlGeneratorService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.core.utils.CsvReaderUtils; import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; -import org.openqa.selenium.By; -import org.openqa.selenium.JavascriptExecutor; -import org.openqa.selenium.WebDriverException; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.firefox.FirefoxDriver; -import org.openqa.selenium.firefox.GeckoDriverService; -import org.openqa.selenium.remote.RemoteWebDriver; +import org.openforis.collect.earth.sampler.processor.KmlGenerator; +import org.openforis.collect.earth.sampler.utils.KmlGenerationException; +import org.openforis.idm.metamodel.AttributeDefinition; +import org.opengis.referencing.operation.TransformException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; -import freemarker.cache.FileTemplateLoader; -import freemarker.template.Configuration; -import freemarker.template.Template; -import freemarker.template.TemplateException; -import freemarker.template.Version; -import io.github.bonigarcia.wdm.WebDriverManager; -import liquibase.repackaged.org.apache.commons.lang3.SystemUtils; +import com.opencsv.CSVReader; /** - * This class contains methods that allow Collect Earth to open browser windows - * that allow the user to have a better understanding of the plot. So far there - * are integrations with Google Earth Engine, Google Earth Engine Timelapse and - * Bing Maps. When a user clicks on a plot Collect Earth will check if the - * program is set to open any of these integrations, and if it is so it will - * open each one in its own window. These windows are closed when the program - * is closed. - *s + * Servlet to return the information that is stored in Collect Earth for one + * placemark (plot) + * * @author Alfonso Sanchez-Paus Diaz * */ -@Component -public class BrowserService implements InitializingBean, Observer { - - +@Controller +public class PlacemarkBrowserServlet { @Autowired - private LocalPropertiesService localPropertiesService; + private BrowserService browserService; @Autowired - private GeolocalizeMapService geoLocalizeTemplateService; + private EarthSurveyService earthSurveyService; @Autowired - private EarthSurveyService earthSurveyService; + private LocalPropertiesService localPropertiesService; @Autowired - private CodeEditorHandlerThread codeEditorHandlerThread; + private KmlGeneratorService kmlGeneratorService; - private final ArrayList drivers = new ArrayList<>(); - private final Logger logger = LoggerFactory.getLogger(BrowserService.class); - private static final String TEMPLATE_FOR_DGMAP_JS = "resources/javascript_dgmap.fmt"; - private static final Configuration cfg = new Configuration(new Version("2.3.23")); - private RemoteWebDriver webDriverBing, webDriverBaidu, webDriverTimelapse, webDriverGeeCodeEditor, - webDriverHere, webDriverStreetView, webDriverYandex, webDriverPlanetHtml, webDriverExtraMap, webDriverSecureWatch, - webDriverGEEMap, webDriverEarthMap; + private KmlGenerator kmlGenerator; + private SimplePlacemarkObject lastPlacemark = null; - Map locks = new HashMap(); + private final Logger logger = LoggerFactory.getLogger( PlacemarkBrowserServlet.class ); - private static boolean geeMethodUpdated = false; + private final class OpenBrowserThread extends Thread { - private boolean isClosing = false; + private SimplePlacemarkObject placemarkObject; - public void closeBrowsers() { - synchronized (this) { - getClosingBrowsersThread().start(); + private OpenBrowserThread(String name, SimplePlacemarkObject placemarkObject) { + super(name); + this.placemarkObject = placemarkObject; } - } - - @Override - public void afterPropertiesSet() throws Exception { - Runtime.getRuntime().addShutdownHook(getClosingBrowsersThread()); - setGeckoDriverPath(); - } - private RemoteWebDriver chooseDriver() throws BrowserNotFoundException { - RemoteWebDriver driver = null; - final String browserSetInProperties = localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim(); - - if (browserSetInProperties.equalsIgnoreCase(EarthConstants.CHROME_BROWSER)) { - driver = tryStartChrome(); - } else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.FIREFOX_BROWSER)) { - driver = tryStartFirefox(); - } else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.EDGE_BROWSER)) { - driver = tryStartEdge(); - }else if (browserSetInProperties.equalsIgnoreCase(EarthConstants.SAFARI_BROWSER)) { - driver = tryStartSafari(); - } + @Override + public void run() { + // If this is the first plot or the plot is the last one that + // was opened + if (lastPlacemark == null + || !lastPlacemark.equals( placemarkObject ) ) { - // If the browser chosen is not installed try to find and installed browser in the computer - if( driver== null ) { - driver = tryStartChrome(); - if( driver== null ) { - driver = tryStartFirefox(); - } - if( driver== null ) { - driver = tryStartEdge(); - } - if( driver== null ) { - driver = tryStartSafari(); - } - } - - if (driver == null) { - throw new BrowserNotFoundException( - "Neither Chrome nor Firefox could be opened. You need to have one of them installed in order to use GEE, Bing Maps or Saiku."); - } - - return driver; - } - - private RemoteWebDriver tryStartFirefox() { - RemoteWebDriver driver = null; - try { - driver = (RemoteWebDriver) WebDriverManager.firefoxdriver().create(); - } catch (final WebDriverException e) { - logger.warn( - "Problem starting Firefox browser!", - e); - } - return driver; - } - - private RemoteWebDriver tryStartEdge() { - RemoteWebDriver driver = null; - try { - driver = (RemoteWebDriver) WebDriverManager.edgedriver().create(); - } catch (final WebDriverException e) { - logger.warn( - "Problem starting Edge browser", - e); - } - return driver; - } + try { + kmlGenerator.fillSamplePoints(placemarkObject); - private RemoteWebDriver tryStartSafari() { - RemoteWebDriver driver = null; - try { - driver = (RemoteWebDriver) WebDriverManager.safaridriver().create(); - } catch (final WebDriverException e) { - logger.warn( - "Problem starting Safari browser", - e); - } - return driver; - } + kmlGenerator.fillExternalLine(placemarkObject); - private RemoteWebDriver tryStartChrome() { - RemoteWebDriver driver = null; - try { - driver = (RemoteWebDriver) WebDriverManager.chromedriver().create(); - } catch (final Exception e) { - logger.warn( - "Problem starting Chrome browser", - e); - } - return driver; - } + openGEEAppWindow(placemarkObject); + openGEECodeEditorWindow(placemarkObject); - private String getDGMapJavascript(SimplePlacemarkObject placemarkObject) { - final Map data = geoLocalizeTemplateService.getPlacemarkData(placemarkObject); - data.put("latitude", placemarkObject.getCoord().getLatitude()); - data.put("longitude", placemarkObject.getCoord().getLongitude()); - return processJavascriptTemplate(data, TEMPLATE_FOR_DGMAP_JS); - } + openEarthMapWindow( placemarkObject ); - private String processJavascriptTemplate(final Map data, String templateName) { - Writer out; - String result = null; - try (StringWriter fw = new StringWriter();) { - // Load template from source folder - cfg.setTemplateLoader(new FileTemplateLoader(new File(System.getProperty("user.dir")))); - final Template template = cfg.getTemplate(templateName); + openTimeLapseWindow(placemarkObject); - // Console output - out = new BufferedWriter(fw); + openBingMapsWindow(placemarkObject); - // Add date to avoid caching - template.process(data, out); + openBaiduMapsWindow(placemarkObject); - out.flush(); + openYandexMapsWindow(placemarkObject); - result = fw.toString(); + openExtraMapWindow(placemarkObject); - } catch (final TemplateException e) { - logger.error("Error when generating the javascript commands", e); - } catch (final IOException e) { - logger.error("Error when reading/writing the template information", e); - } - return result; - } + openStreetViewWindow(placemarkObject); - private RemoteWebDriver initBrowser() throws BrowserNotFoundException { - RemoteWebDriver driver = null; - driver = chooseDriver(); - if (isClosing) { // In case the browser takes so long to start that the user closes CE and this - // method is called when the other windows are being closed - driver.quit(); - driver = null; - } else { - drivers.add(driver); - } - return driver; - } + openPlanetMapsWindow(placemarkObject); - public static boolean isIdOrNamePresent(String elementId, RemoteWebDriver driver) { - boolean found = false; + openSecureWatchWindow(placemarkObject); - try { - if (driver.findElementById(elementId).isDisplayed() || driver.findElementByName(elementId).isDisplayed()) { - found = true; + } catch (TransformException|KmlGenerationException e) { + logger.error("Error generating polygon", e ); + } } - } catch (final Exception e) { - // Not found - } - - return found; - } - public static boolean isCssElementPresent(String cssElement, RemoteWebDriver driver) { - boolean found = false; + lastPlacemark = placemarkObject; - try { - WebElement elementByCssSelector = driver.findElementByCssSelector(cssElement); - found = elementByCssSelector != null; - } catch (final Exception e) { - // Not found } - return found; - } - - private boolean isXPathPresent(String xpath, RemoteWebDriver driver) { - boolean found = false; - try { - if (driver.findElementByXPath(xpath).isDisplayed()) { - found = true; - } - logger.debug(String.format("Found %s", xpath)); - } catch (final Exception e) { - logger.debug(String.format("Not Found %s", xpath)); + public void openEarthMapWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Earth Map window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openEarthMapURL(placemarkObject); + } catch (final Exception e) { + logger.error("Exception opening Earth Map window", e); //$NON-NLS-1$ + } + } + }.start(); } - return found; - } - - private boolean loadPlotInDGMap(SimplePlacemarkObject placemarkObject, RemoteWebDriver driver) { - - boolean success = true; - if (driver != null && waitFor("mainContent", driver) && driver instanceof JavascriptExecutor) { - try { - String dgmapJs = getDGMapJavascript(placemarkObject); - driver.executeScript(dgmapJs); - - Thread.sleep( 1000 ); - // Unlock the view if it is locked - if( isCssElementPresent(".lock.on", driver) ) { - driver.findElementByCssSelector(".lock.on").click(); // UNLOCK + public void openGEECodeEditorWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open GEE Playground window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openGEECodeEditor(placemarkObject); + } catch (final Exception e) { + logger.error("Exception opening Earth Engine Playground window", e); //$NON-NLS-1$ + } } - - } catch (final Exception e) { - processSeleniumError(e); - success = false; - } + }.start(); } - return success; - } - public void clickOnElements(RemoteWebDriver driver, String cssSelector) { - final List dataLayerVisibility = driver.findElementsByCssSelector(cssSelector); - for (final WebElement webElement : dataLayerVisibility) { - if (webElement.isDisplayed()) { - webElement.click(); - } + public void openGEEAppWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open GEE APP window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openGEEAppURL(placemarkObject); + } catch (final Exception e) { + logger.error("Exception opening Earth Engine APP window", e); //$NON-NLS-1$ + } + } + }.start(); } - } - - public static boolean isGeeMethodUpdated() { - return geeMethodUpdated; - } - public static void setGeeMethodUpdated(boolean geeMethosUpdated) { - BrowserService.geeMethodUpdated = geeMethosUpdated; - } - - private void processSeleniumError(final Exception e) { - if (e.getCause() != null && e.getCause().getMessage() != null - && !e.getCause().getMessage().contains("latitude")) { - logger.warn("Error in the selenium driver", e); - } else { - logger.info("Error in the selenium driver provoked by known bug", e); + public void openBingMapsWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Bing Maps window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openBingMaps(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Bing Maps window", e); //$NON-NLS-1$ + } + } + }.start(); } - } - - public RemoteWebDriver navigateTo(String url, RemoteWebDriver driver) throws BrowserNotFoundException { - return navigateTo(url, driver, true); - } - - /** - * Loads the given URL into the browser. If the browser is null then a new - * browser window is open. - * - * @param url - * The URL to load. - * @param driverParam - * The browser window to use. If this value is null a new browser - * window is open. - * @param retry - * Specify if there should be a second try to open a browser window - * if the first time fails (useful if the browser could not be found) - * @return The browser window (firefox or chrome depending on the configuration) - * used to open the URL. - * @throws BrowserNotFoundException - * Exception thrown when there is no Firefox/Chrome installed - */ - public RemoteWebDriver navigateTo(String url, RemoteWebDriver driverParam, boolean retry) - throws BrowserNotFoundException { - RemoteWebDriver driver = driverParam; - if (driver == null || !isDriverWorking(driver)) { - driver = initBrowser(); + public void openPlanetMapsWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Planet Maps window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openPlanetMaps(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Planet Maps window", e); //$NON-NLS-1$ + } + } + }.start(); } - if (driver != null) { - try { - driver.navigate().to(url); - } catch (final Exception e) { - if (retry && (e.getCause() != null && e.getCause().getMessage() != null - && e.getCause().getMessage().contains("Session not found"))) { - // Browser closed, restart it! - logger.error("Browser was closed, restaring it...", e); - driver = initBrowser(); - navigateTo(url, driver, false); // only try to re-open one + public void openSecureWatchWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open SecureWatch window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openSecureWatch(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening SecureWatch window", e); //$NON-NLS-1$ + } } - } - } else { - logger.error("No Selenium driver available, Is Firefox or Chrome installed?"); + }.start(); } - return driver; - } - protected boolean isDriverWorking(RemoteWebDriver driver) { - boolean stillWorking = true; - try { - driver.findElement(By.xpath("//body")); - } catch (Exception e) { - stillWorking = false; - } - return stillWorking; - } + public void openBaiduMapsWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Baidu Maps window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openBaiduMaps(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Baidu Maps window", e); //$NON-NLS-1$ - /** - * Opens a browser window with the Bing Maps representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openBingMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("BING"); - synchronized (lock) { - if (localPropertiesService.isBingMapsSupported()) { - try { - webDriverBing = navigateTo(geoLocalizeTemplateService - .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_BING_HTML_TEMPLATE, - "bingMapsKey", localPropertiesService.getValue(EarthProperty.BING_MAPS_KEY)) - .toString(), webDriverBing); - } catch (final Exception e) { - logger.error("Problems loading Bing", e); + } } - } - } - } - private Object getLock(String key) { - String lock = locks.get(key); - if( lock !=null ) { - return lock; - }else{ - locks.put(key, key); - return key; + }.start(); } - } - - /** - * Opens a browser window with the Planet Basemaps representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openPlanetMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("PLANET"); - synchronized (lock) { - if (localPropertiesService.isPlanetMapsSupported()) { - - boolean monthly = localPropertiesService.isPlanetMapsMonthlyOpen(); - String template = monthly ? GeolocalizeMapService.FREEMARKER_PLANET_NICFI_ARGUMENTS : GeolocalizeMapService.FREEMARKER_PLANET_DAILY_HTML_TEMPLATE; - String key = monthly ? localPropertiesService.getValue( EarthProperty.PLANET_MAPS_CE_KEY ) : localPropertiesService.getValue( EarthProperty.PLANET_MAPS_KEY ); - - try { - - String processTemplate = geoLocalizeTemplateService.getUrlToFreemarkerOutput( - placemarkObject, - template, - "planetMapsKey", - key, - "urlPlanetEndpointPrefix", - ServerController.getHostAddress(localPropertiesService.getHost(),localPropertiesService.getPort()) - ).toString(); - - String urlPlanet = null; - if( monthly ) { - - String parameters = FileUtils.readFileToString( new File( new URI( processTemplate ) ) , StandardCharsets.UTF_8 ); - - // remove new lines - parameters = parameters.replace("\n", "").replace("\r", "").replace("\t", "").replace(" ", ""); - // remove trailing commas - parameters = parameters.replace(",],", "],").replace("],]", "]]"); + public void openYandexMapsWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Yandex Maps window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openYandexMaps(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Yandex Maps window", e); //$NON-NLS-1$ - urlPlanet = localPropertiesService.getValue( EarthProperty.PLANET_NICFI_URL ) + parameters; - }else { - urlPlanet = processTemplate; } - - webDriverPlanetHtml = navigateTo( urlPlanet, webDriverPlanetHtml ); - - } catch (final Exception e) { - logger.error("Problems loading Planet", e); } - } - } - } - - /** - * Opens a browser window with the Baidu Maps representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openBaiduMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("BAIDU"); - synchronized (lock) { - if (localPropertiesService.isBaiduMapsSupported()) { - try { - webDriverBaidu = navigateTo(geoLocalizeTemplateService - .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_BAIDU_HTML_TEMPLATE) - .toString(), webDriverBaidu); - } catch (final Exception e) { - logger.error("Problems loading Baidu", e); - } - } + }.start(); } - } - /** - * Opens a browser window with the Yandex Maps representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openYandexMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("YANDEX"); - synchronized (lock) { - if (localPropertiesService.isYandexMapsSupported()) { - try { - webDriverYandex = navigateTo(geoLocalizeTemplateService.getUrlToFreemarkerOutput(placemarkObject, - GeolocalizeMapService.FREEMARKER_YANDEX_HTML_TEMPLATE).toString(), webDriverYandex); - } catch (final Exception e) { - logger.error("Problems loading Yandex", e); - } - } - } - } + public void openExtraMapWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Expa Map window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openExtraMap(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Extra Map window", e); //$NON-NLS-1$ - /** - * Opens a browser window with a map representation of the plot in SecureWatch. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openSecureWatch(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("SECUREWATCH"); - synchronized (lock) { - if ( localPropertiesService.isSecureWatchSupported() ) { - String url = getUrlBaseIntegration(placemarkObject, localPropertiesService.getSecureWatchURL() + "/#18/LATITUDE/LONGITUDE" ); - webDriverSecureWatch = navigateTo(url, webDriverSecureWatch); - try { - logger.warn("Loading layers - {}", placemarkObject); - loadPlotInDGMap(placemarkObject, webDriverSecureWatch); - } catch (final Exception e) { - logger.error("Error when opening Secure Watch browser window", e); + } } - } - } - } - /** - * Opens a browser window with a map representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openExtraMap(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("EXTRA"); - synchronized (lock) { - if (!StringUtils.isBlank(localPropertiesService.getExtraMap())) { - webDriverExtraMap = navigateTo( getUrlBaseIntegration(placemarkObject, localPropertiesService.getExtraMap() ) , webDriverExtraMap ); - } + }.start(); } - } - private String getUrlBaseIntegration(SimplePlacemarkObject placemarkObject, String url) { - String temp = null; - try { - String latitude = placemarkObject.getCoord().getLatitude(); - String longitude = placemarkObject.getCoord().getLongitude(); - String id = placemarkObject.getPlacemarkId().split(",")[0]; // for cases where ID also has round, then - // the id string would be something like - // "plotId,round", we only want the ID + public void openStreetViewWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Street View window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openStreetView(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Street View window", e); //$NON-NLS-1$ - temp = url.replace("LATITUDE", latitude).replace("LONGITUDE", longitude).replace("PLOT_ID", id); + } + } - } catch (final Exception e) { - logger.error("Problems Getting the URL filling for " + url, e); + }.start(); } - return temp; - } - /** - * Opens a browser window with the Google Street View representation of the - * plot. - * https://www.google.com/maps/@43.7815661,11.1484876,3a,75y,210.23h,82.32t/data=!3m6!1e1!3m4!1sEz7NiCbaIYzTJkP_RMBiqw!2e0!7i13312!8i6656?hl=en - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openStreetView(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("STREET_VIEW"); - synchronized (lock) { - if (localPropertiesService.isStreetViewSupported()) { - try { - webDriverStreetView = navigateTo( - geoLocalizeTemplateService.getUrlToFreemarkerOutput(placemarkObject, - GeolocalizeMapService.FREEMARKER_STREET_VIEW_HTML_TEMPLATE, "googleMapsApiKey", - localPropertiesService.getValue(EarthProperty.GOOGLE_MAPS_API_KEY)).toString(), - webDriverStreetView); - } catch (final Exception e) { - logger.error("Problems loading Street View", e); - } - } - } - } + public void openTimeLapseWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open TimeLapse window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openTimelapse(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Earth Engine window", e); //$NON-NLS-1$ - /** - * Opens a browser window with the Here Maps representation of the plot. - * - * @param placemarkObject - * The data of the plot. - * @throws BrowserNotFoundException - * In case the browser could not be found - * - */ - public void openHereMaps(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("HERE"); - synchronized (lock) { - if (localPropertiesService.isHereMapsSupported()) { - try { - webDriverHere = navigateTo(geoLocalizeTemplateService - .getUrlToFreemarkerOutput(placemarkObject, GeolocalizeMapService.FREEMARKER_HERE_HTML_TEMPLATE, - "hereAppId", localPropertiesService.getValue(EarthProperty.HERE_MAPS_APP_ID), - "hereAppCode", localPropertiesService.getValue(EarthProperty.HERE_MAPS_APP_CODE)) - .toString(), webDriverHere); - } catch (final Exception e) { - logger.error("Problems loading Here Maps", e); + } } - } + }.start(); } - } - private StringBuilder getGeoJsonSegment(List coordinates) { - StringBuilder geoJson = new StringBuilder("["); - if (coordinates != null) { - for (SimpleCoordinate coord : coordinates) { - geoJson = geoJson.append("[").append(coord.getLongitude()).append(",").append(coord.getLatitude()) - .append("],"); - } - // remove last character - geoJson = geoJson.deleteCharAt(geoJson.length() - 1); - } - geoJson = geoJson.append("],"); - return geoJson; } - - - private String getFeature(SimplePlacemarkObject placemarkObject, String shapeType, String name ) { - StringBuilder feature = new StringBuilder("{\"type\":\"Feature\",\"properties\":{\"name\":\"").append( name).append("\"},\"geometry\":"); - feature= feature.append( getGeoJson(placemarkObject, shapeType )).append("}"); - return feature.toString(); - } - - private String getGeoJson(SimplePlacemarkObject placemarkObject, String shapeType ) { - - StringBuilder geoJson = new StringBuilder("{\"type\":\"" ).append( shapeType).append("\",\"coordinates\":["); - List shape = placemarkObject.getShape(); - geoJson = geoJson.append(getGeoJsonSegment(shape)); - geoJson = geoJson.deleteCharAt(geoJson.length() - 1); - geoJson = geoJson.append("]}"); - return geoJson.toString(); - } - - /** - * Opens a browser window with the Google Earth Engine Code Editor and runs the - * freemarker template found in resources/eeCodeEditorScript.fmt on the main - * editor of GEE. - * - * @param placemarkObject - * The center point of the plot. - * @throws BrowserNotFoundException - * If the browser cannot be found + /* + * Opens the extra browser windows for Earth Engine, Timelapse and Bing. (non-Javadoc) * + * @see + * org.openforis.collect.earth.app.server.JsonPocessorServlet#processRequest + * (javax.servlet.http.HttpServletRequest, + * javax.servlet.http.HttpServletResponse) */ - public void openGEEAppURL(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("GEEAPP"); - synchronized (lock) { - if (localPropertiesService.isGEEAppSupported()) { - - try { - StringBuilder url = new StringBuilder(localPropertiesService.getGEEAppURL()); - url = url.append("#geoJson=") - .append(URLEncoder.encode(getGeoJson(placemarkObject, "MultiLineString"), StandardCharsets.UTF_8.toString())) - .append(";"); - url = url.append("plotId=") - .append(URLEncoder.encode(placemarkObject.getPlacemarkId(), StandardCharsets.UTF_8.toString())) - .append(";"); - url = url.append("survey=") - .append(URLEncoder.encode( earthSurveyService.getCollectSurvey().getName() , StandardCharsets.UTF_8.toString())) - .append(";"); - webDriverGEEMap = navigateTo(url.toString(), webDriverGEEMap); - webDriverGEEMap.navigate().refresh(); // FORCE REFRESH - OTHERWISE WINDOW IS NOT REFRESHED FOR SOME STRANGE REASON - } catch (final Exception e) { - logger.error("Problems loading GEE APP window", e); - } - } + @GetMapping(path = "/openAuxiliaryWindows") + public void openAuxiliaryWindows( + HttpServletResponse response, + @RequestParam(value = "latLongCoordinates", required = false) final String latLongCoordinates) + { + try { + SimplePlacemarkObject placemarkObject = new SimplePlacemarkObject(latLongCoordinates.split(",") ); + OpenBrowserThread browserThread = new OpenBrowserThread("Open auxiliary windows " + latLongCoordinates, placemarkObject); + browserThread.start(); + } catch (Exception e) { + logger.error("Error loading browsers " , e); } } + @GetMapping(path = "/ancillaryWindows") + public void openAuxiliaryWindowsNew(HttpServletResponse response, HttpServletRequest request) { - public void openEarthMapURL(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("EARTH_MAP"); - synchronized (lock) { - if (localPropertiesService.isEarthMapSupported()) { + List keyAttributeDefinitions = earthSurveyService + .getRootEntityDefinition() + .getKeyAttributeDefinitions(); - try { - StringBuilder url = new StringBuilder(localPropertiesService.getEarthMapURL()).append("?"); - url = url.append("polygon=") - .append(URLEncoder.encode(getFeature(placemarkObject, "Polygon", placemarkObject.getPlacemarkId()), StandardCharsets.UTF_8.toString())) - .append("&"); - - if( StringUtils.isNotBlank(localPropertiesService.getEarthMapLayers()) ) { - url = url.append("layers=") - .append(URLEncoder.encode(localPropertiesService.getEarthMapLayers(), StandardCharsets.UTF_8.toString())) - .append("&"); - } - - if( StringUtils.isNotBlank(localPropertiesService.getEarthMapScripts()) ) { - url = url.append("scripts=") - .append(URLEncoder.encode(localPropertiesService.getEarthMapScripts(), StandardCharsets.UTF_8.toString())) - .append("&"); - } + // the keys should the the parameter names + Map keys = request.getParameterMap(); - String aoi = localPropertiesService.getEarthMapAOI(); - if( StringUtils.isBlank(aoi) ) { - aoi = "global"; - } - url = url.append("aoi=") - .append(URLEncoder.encode( aoi, StandardCharsets.UTF_8.toString() )) - .append("&embed=true"); // Set the EMBED parameter to true so that the user does not need to log in. - - webDriverEarthMap = navigateTo(url.toString(), webDriverEarthMap); - //Desktop.getDesktop().browse( new URI( url.toString() ) ); - //webDriverEarthMap.navigate().refresh(); // FORCE REFRESH - OTHERWISE WINDOW IS NOT REFRESHED FOR SOME STRANGE REASON - } catch (final Exception e) { - logger.error("Problems loading Earth Map window", e); - } - } + String[] keysInOrder = new String[keys.size()]; + for (int i = 0; i < keyAttributeDefinitions.size(); i++) { + keysInOrder[i] = keys.get(keyAttributeDefinitions.get(i).getName())[0]; } - } - /** - * Opens a browser window with the Google Earth Engine Code Editor and runs the - * freemarker template found in resources/eeCodeEditorScript.fmt on the main - * editor of GEE. - * - * @param placemarkObject - * The center point of the plot. - * @throws BrowserNotFoundException - * If the browser cannot be found - * - */ - public void openGEECodeEditor(SimplePlacemarkObject placemarkObject) throws BrowserNotFoundException { - Object lock = getLock("CODE_EDITOR"); - synchronized (lock) { - if (localPropertiesService.isCodeEditorSupported()) { - - boolean firstOpening = false; - if (getWebDriverGeeCodeEditor() == null) { - setWebDriverGeeCodeEditor(initBrowser()); - firstOpening = true; - } + try { + kmlGenerator = kmlGeneratorService.getKmlGenerator(); - if (firstOpening && (liquibase.repackaged.org.apache.commons.lang3.SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX)) { - codeEditorHandlerThread.disableCodeEditorAutocomplete(getWebDriverGeeCodeEditor()); - } + String[] csvValues = getValuesFromCsv(keysInOrder); - codeEditorHandlerThread.loadCodeEditorScript(placemarkObject, getWebDriverGeeCodeEditor()); + if( csvValues == null ){ + throw new IllegalArgumentException("The keys " + keys.toString() + " are not present on the CSV file with the plot locations!!!"); } - } - } - - /** - * Opens a browser window with the Google Earth Engine Timelapse representation - * of the plot. - * - * @param placemarkObject - * The center point of the plot. - * @throws BrowserNotFoundException - * If the browser cannot be found - * - */ - public void openTimelapse(final SimplePlacemarkObject placemarkObject) - throws BrowserNotFoundException { - Object lock = getLock("TIMELAPSE"); - synchronized (lock) { - if (localPropertiesService.isTimelapseSupported()) { - try { - String coordinates = placemarkObject.getCoord().toString(); - webDriverTimelapse = navigateTo( - "https://earthengine.google.org/timelapse/timelapseplayer_v2.html?timelapseclient=http://earthengine.google.org/timelapse/data&v=" - + coordinates + ",10.812,latLng&t=0.08", - webDriverTimelapse); - } catch (final Exception e) { - logger.error("Problems loading Timelapse", e); - } - } - } - } - - private void setGeckoDriverPath() { - String geckoDriverPath = ""; - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { - geckoDriverPath = "resources/geckodriver_mac"; - } else if (SystemUtils.IS_OS_UNIX) { - if (System.getProperty("os.arch").contains("64") - || System.getProperty("sun.arch.data.model").equals("64")) { - geckoDriverPath = "resources/geckodriver_64"; - } else { - geckoDriverPath = "resources/geckodriver_32"; - } - } else if (SystemUtils.IS_OS_WINDOWS) { - try { - if (System.getProperty("os.arch").contains("64") - || System.getProperty("sun.arch.data.model").equals("64")) - geckoDriverPath = "resources/geckodriver_64.exe"; - else - geckoDriverPath = "resources/geckodriver_32.exe"; - } catch (Exception e) { - geckoDriverPath = "resources/geckodriver_64.exe"; - } - } else { - throw new IllegalArgumentException("Geckodriver is not supported in the current OS"); + SimplePlacemarkObject placemarkObject = kmlGenerator.getPlotObject(csvValues, null, earthSurveyService.getCollectSurvey() ); + OpenBrowserThread browserThread = new OpenBrowserThread("Open ancillary windows - polygon ", placemarkObject ); + browserThread.start(); + } catch (Exception e) { + logger.error("Error loading browsers " , e); } - File geckoDriverFile = new File(geckoDriverPath); - - // if above property is not working or not opening the application in browser - // then try below property - System.setProperty(GeckoDriverService.GECKO_DRIVER_EXE_PROPERTY, geckoDriverFile.getAbsolutePath()); - System.setProperty(FirefoxDriver.SystemProperty.DRIVER_USE_MARIONETTE, "true"); - - } - - public boolean waitFor(String elementId, RemoteWebDriver driver) { - int i = 0; - while (!isIdOrNamePresent(elementId, driver)) { - try { - Thread.sleep(1000); - } catch (final InterruptedException e) { - return false; - } - i++; - if (i > 60) { - return false; - } - } - return true; } - public boolean waitForXPath(String xpath, RemoteWebDriver driver) { - int i = 0; - while (!isXPathPresent(xpath, driver)) { - try { - Thread.sleep(1000); - } catch (final InterruptedException e) { - return false; + private String[] getValuesFromCsv(String[] keysInOrder) { - } - i++; - if (i > 30) { - return false; - } - } - return true; - } + final String csvFile = localPropertiesService.getCsvFile(); + try ( + CSVReader reader = CsvReaderUtils.getCsvReader( csvFile ); + ){ - private Thread getClosingBrowsersThread() { - return new Thread("Quit the open browsers") { - @Override - public void run() { - isClosing = true; - CopyOnWriteArrayList driversCopy = new CopyOnWriteArrayList<>(drivers); - for (Iterator iterator = driversCopy.iterator(); iterator.hasNext();) { - RemoteWebDriver remoteWebDriver = iterator.next(); - try { - remoteWebDriver.quit(); - } catch (final Exception e) { - logger.error("Error quitting the browser", e); + String[] csvRow; + int numberOfKeys = keysInOrder.length; + while ((csvRow = reader.readNext()) != null) { + boolean foundIt = true; + for( int idx=0; idx Date: Tue, 29 Nov 2022 15:41:11 +0100 Subject: [PATCH 1040/1620] New translations PlacemarkBrowserServlet.java (English) --- .../earth/app/view/Messages_en.properties | 364 +++++++++++++++--- 1 file changed, 319 insertions(+), 45 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index b23ed83438..de96e18020 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,87 +1,361 @@ package org.openforis.collect.earth.app.server; -import java.io.IOException; +import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.service.BrowserService; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.KmlGeneratorService; import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.view.Messages; +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; +import org.openforis.collect.earth.sampler.processor.KmlGenerator; +import org.openforis.collect.earth.sampler.utils.KmlGenerationException; +import org.openforis.idm.metamodel.AttributeDefinition; +import org.opengis.referencing.operation.TransformException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import com.opencsv.CSVReader; /** - * Servlet called for updating/saving the information about a placemark. Called from the form in Google Earth when the user interacts with it or clicks the save button. - * @author Alfonso Sanchez-Paus Diaz + * Servlet to return the information that is stored in Collect Earth for one + * placemark (plot) * - * @deprecated Replaced by {@link PlacemarkDataController} + * @author Alfonso Sanchez-Paus Diaz * */ -@Deprecated @Controller -public class SaveEarthDataServlet extends JsonPocessorServlet { +public class PlacemarkBrowserServlet { + @Autowired + private BrowserService browserService; + + @Autowired + private EarthSurveyService earthSurveyService; @Autowired - LocalPropertiesService localPropertiesService; + private LocalPropertiesService localPropertiesService; + + @Autowired + private KmlGeneratorService kmlGeneratorService; + + private KmlGenerator kmlGenerator; + + private SimplePlacemarkObject lastPlacemark = null; + + private final Logger logger = LoggerFactory.getLogger( PlacemarkBrowserServlet.class ); + + private final class OpenBrowserThread extends Thread { + + private SimplePlacemarkObject placemarkObject; + + private OpenBrowserThread(String name, SimplePlacemarkObject placemarkObject) { + super(name); + this.placemarkObject = placemarkObject; + } + + @Override + public void run() { + // If this is the first plot or the plot is the last one that + // was opened + if (lastPlacemark == null + || !lastPlacemark.equals( placemarkObject ) ) { + + try { + kmlGenerator.fillSamplePoints(placemarkObject); + + kmlGenerator.fillExternalLine(placemarkObject); + + openGEEAppWindow(placemarkObject); + + openGEECodeEditorWindow(placemarkObject); + + openEarthMapWindow( placemarkObject ); - //@Autowired - //CollectDesignerController collectDesignerController; + openTimeLapseWindow(placemarkObject); + openBingMapsWindow(placemarkObject); - @Deprecated - @GetMapping("/saveData") - public void saveData(HttpServletRequest request, HttpServletResponse response) throws IOException { + openBaiduMapsWindow(placemarkObject); - Map collectedData = extractRequestData(request); + openYandexMapsWindow(placemarkObject); - replaceTestVariables(collectedData); + openExtraMapWindow(placemarkObject); - if (collectedData.size() == 0) { - setResult(false, Messages.getString("SaveEarthDataServlet.0"), collectedData); //$NON-NLS-1$ - getLogger().info("The request was empty"); //$NON-NLS-1$ - } else { - if (getDataAccessor().saveData(collectedData)) { - setResult(true, Messages.getString("SaveEarthDataServlet.2"), collectedData); //$NON-NLS-1$ - } else { - setResult(false, Messages.getString("SaveEarthDataServlet.1"), collectedData); //$NON-NLS-1$ - getLogger().error("The data could not be saved"); //$NON-NLS-1$ + openStreetViewWindow(placemarkObject); + + openPlanetMapsWindow(placemarkObject); + + openSecureWatchWindow(placemarkObject); + + } catch (TransformException|KmlGenerationException e) { + logger.error("Error generating polygon", e ); + } } + + lastPlacemark = placemarkObject; + + } + + + public void openEarthMapWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Earth Map window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openEarthMapURL(placemarkObject); + } catch (final Exception e) { + logger.error("Exception opening Earth Map window", e); //$NON-NLS-1$ + } + } + }.start(); + } + + public void openGEECodeEditorWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open GEE Playground window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openGEECodeEditor(placemarkObject); + } catch (final Exception e) { + logger.error("Exception opening Earth Engine Playground window", e); //$NON-NLS-1$ + } + } + }.start(); + } + + public void openGEEAppWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open GEE APP window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openGEEAppURL(placemarkObject); + } catch (final Exception e) { + logger.error("Exception opening Earth Engine APP window", e); //$NON-NLS-1$ + } + } + }.start(); + } + + public void openBingMapsWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Bing Maps window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openBingMaps(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Bing Maps window", e); //$NON-NLS-1$ + } + } + }.start(); + } + + + public void openPlanetMapsWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Planet Maps window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openPlanetMaps(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Planet Maps window", e); //$NON-NLS-1$ + } + } + }.start(); + } + + public void openSecureWatchWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open SecureWatch window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openSecureWatch(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening SecureWatch window", e); //$NON-NLS-1$ + } + } + }.start(); + } + + public void openBaiduMapsWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Baidu Maps window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openBaiduMaps(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Baidu Maps window", e); //$NON-NLS-1$ + + } + } + + }.start(); + } + + public void openYandexMapsWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Yandex Maps window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openYandexMaps(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Yandex Maps window", e); //$NON-NLS-1$ + + } + } + + }.start(); + } + + public void openExtraMapWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Expa Map window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openExtraMap(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Extra Map window", e); //$NON-NLS-1$ + + } + } + + }.start(); + } + + public void openStreetViewWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open Street View window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openStreetView(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Street View window", e); //$NON-NLS-1$ + + } + } + + }.start(); + } + + public void openTimeLapseWindow(final SimplePlacemarkObject placemarkObject) { + new Thread("Open TimeLapse window") { //$NON-NLS-1$ + @Override + public void run() { + try { + browserService.openTimelapse(placemarkObject); + } catch (final Exception e) { + LoggerFactory.getLogger(this.getClass()).error( + "Exception opening Earth Engine window", e); //$NON-NLS-1$ + + } + } + + }.start(); } - setJsonResponse(response, collectedData); } - /** - * This method replaces the variable values that the form contains when it is not run - * through Google Earth and the variable replacement of the ExtendedData of the KML does not kick in. + + /* + * Opens the extra browser windows for Earth Engine, Timelapse and Bing. (non-Javadoc) * - * @param collectedData - * The data POSTed by the form that has already been processed. + * @see + * org.openforis.collect.earth.app.server.JsonPocessorServlet#processRequest + * (javax.servlet.http.HttpServletRequest, + * javax.servlet.http.HttpServletResponse) */ - private void replaceTestVariables(Map collectedData) { - // REMOVE THIS!!!! - if (collectedData.get(EarthConstants.PLACEMARK_ID_PARAMETER).equals("$[id]")) { //$NON-NLS-1$ //$NON-NLS-2$ - collectedData.put(EarthConstants.PLACEMARK_ID_PARAMETER, "testPlacemark"); //$NON-NLS-1$ //$NON-NLS-2$ + @GetMapping(path = "/openAuxiliaryWindows") + public void openAuxiliaryWindows( + HttpServletResponse response, + @RequestParam(value = "latLongCoordinates", required = false) final String latLongCoordinates) + { + try { + SimplePlacemarkObject placemarkObject = new SimplePlacemarkObject(latLongCoordinates.split(",") ); + OpenBrowserThread browserThread = new OpenBrowserThread("Open auxiliary windows " + latLongCoordinates, placemarkObject); + browserThread.start(); + } catch (Exception e) { + logger.error("Error loading browsers " , e); } + } - if (collectedData.get("collect_integer_elevation") != null && collectedData.get("collect_integer_elevation").equals("$[elevation]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - collectedData.put("collect_integer_elevation", "0"); //$NON-NLS-1$ //$NON-NLS-2$ - } + @GetMapping(path = "/ancillaryWindows") + public void openAuxiliaryWindowsNew(HttpServletResponse response, HttpServletRequest request) { + + + List keyAttributeDefinitions = earthSurveyService + .getRootEntityDefinition() + .getKeyAttributeDefinitions(); + + // the keys should the the parameter names + Map keys = request.getParameterMap(); - if (collectedData.get("collect_real_slope") != null && collectedData.get("collect_real_slope").equals("$[slope]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - collectedData.put("collect_real_slope", "0"); //$NON-NLS-1$ //$NON-NLS-2$ + String[] keysInOrder = new String[keys.size()]; + for (int i = 0; i < keyAttributeDefinitions.size(); i++) { + keysInOrder[i] = keys.get(keyAttributeDefinitions.get(i).getName())[0]; } - if (collectedData.get("collect_real_aspect") != null && collectedData.get("collect_real_aspect").equals("$[aspect]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - collectedData.put("collect_real_aspect", "0"); //$NON-NLS-1$ //$NON-NLS-2$ + try { + kmlGenerator = kmlGeneratorService.getKmlGenerator(); + + String[] csvValues = getValuesFromCsv(keysInOrder); + + if( csvValues == null ){ + throw new IllegalArgumentException("The keys " + keys.toString() + " are not present on the CSV file with the plot locations!!!"); + } + + SimplePlacemarkObject placemarkObject = kmlGenerator.getPlotObject(csvValues, null, earthSurveyService.getCollectSurvey() ); + OpenBrowserThread browserThread = new OpenBrowserThread("Open ancillary windows - polygon ", placemarkObject ); + browserThread.start(); + } catch (Exception e) { + logger.error("Error loading browsers " , e); } - if (collectedData.get("collect_coord_location").equals("$[latitude],$[longitude]")) { //$NON-NLS-1$ //$NON-NLS-2$ - collectedData.put("collect_coord_location", "0,0"); //$NON-NLS-1$ //$NON-NLS-2$ + } + + private String[] getValuesFromCsv(String[] keysInOrder) { + + final String csvFile = localPropertiesService.getCsvFile(); + try ( + CSVReader reader = CsvReaderUtils.getCsvReader( csvFile ); + ){ + + + String[] csvRow; + int numberOfKeys = keysInOrder.length; + while ((csvRow = reader.readNext()) != null) { + boolean foundIt = true; + for( int idx=0; idx Date: Tue, 29 Nov 2022 15:41:12 +0100 Subject: [PATCH 1041/1620] New translations PlacemarkDataController.java (French) --- .../earth/app/view/Messages_fr.properties | 72 ++++++------------- 1 file changed, 23 insertions(+), 49 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 0c1e208fbc..fcb3cec51d 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,71 +1,45 @@ package org.openforis.collect.earth.app.server; import java.io.IOException; -import java.util.HashMap; -import java.util.Map; -import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.logging.GAlogger; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; /** - * Servlet to return the information that is stored in Collect Earth for one placemark (plot) + * Controller to load and store the information that is stored in Collect Earth for one placemark (plot) * * @author Alfonso Sanchez-Paus Diaz + * @author S. Ricci * - * @deprecated Replaced by {@link PlacemarkDataController} */ -@Deprecated @Controller -public class PlacemarkInfoServlet extends JsonPocessorServlet { - - - /** - * Returns a JSON object with the data collected for a placemark in the collect-earth format. - * @param request The request sent from Google Earth pop-up to Collect Earth - * @param response The response to the Collect Earth request - * @throws IOException Throws exception if the response cannot be written to the channel - */ - @GetMapping("/placemarkInfo") - public void placemarkInfoOld(HttpServletRequest request, HttpServletResponse response) throws IOException { - Map collectedData = extractRequestData(request); - String placemarkId = getPlacemarkId(collectedData); - - if (placemarkId == null) { - setResult(false, "No placemark ID found in the request", collectedData); //$NON-NLS-1$ - getLogger().error("No placemark ID found in the received request"); //$NON-NLS-1$ - } else { - placemarkId = replacePlacemarkIdTestValue(placemarkId); - collectedData = getDataAccessor().getData(placemarkId); - if (collectedData != null && collectedData.get(EarthConstants.PLACEMARK_FOUND_PARAMETER) != null - && collectedData.get(EarthConstants.PLACEMARK_FOUND_PARAMETER).equals("true")) { //$NON-NLS-1$ - setResult(true, "The placemark was found", collectedData); //$NON-NLS-1$ - getLogger().info("A placemark was found with these properties {}", collectedData ); //$NON-NLS-1$ - } else { - if (collectedData == null) { - collectedData = new HashMap<>(); - } - setResult(false, "No placemark found", collectedData); //$NON-NLS-1$ - getLogger().info("No placemark found {}", collectedData ); //$NON-NLS-1$ - } +public class PlacemarkDataController extends AbstractPlacemarkDataController { + @Override + @GetMapping(value="/placemark-info-expanded") + public void placemarkInfoExpanded(@RequestParam("id") String placemarkId, HttpServletResponse response) throws IOException { + try{ + super.placemarkInfoExpanded(placemarkId, response); + }catch(Exception e){ + logger.error("Error saving data" , e); } - - setJsonResponse(response, collectedData); - - } - - private String getPlacemarkId(Map collectedData) { - return collectedData.get(EarthConstants.PLACEMARK_ID_PARAMETER); } - private String replacePlacemarkIdTestValue(String placemarkId) { - if (placemarkId.equals("$[id]")) { //$NON-NLS-1$ - placemarkId = "testPlacemark"; //$NON-NLS-1$ + @Override + @PostMapping(value="/save-data-expanded") + public void saveDataExpanded(PlacemarkUpdateRequest updateRequest, HttpServletResponse response) throws IOException { + try{ + super.saveDataExpanded(updateRequest, response); + if( updateRequest.getValues().get("collect_boolean_actively_saved").equals("true")) { + GAlogger.logGAnalytics("Plot saved"); + } + }catch(Exception e){ + logger.error("Error saving data" , e); } - return placemarkId; } } From 9efa938e42f2a853f5ad09aa4de1a1d3c7303e33 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:14 +0100 Subject: [PATCH 1042/1620] New translations PlacemarkDataController.java (Spanish) --- .../earth/app/view/Messages_es.properties | 358 +----------------- 1 file changed, 21 insertions(+), 337 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index de96e18020..fcb3cec51d 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,361 +1,45 @@ package org.openforis.collect.earth.app.server; -import java.util.List; -import java.util.Map; +import java.io.IOException; -import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.openforis.collect.earth.app.service.BrowserService; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.KmlGeneratorService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; -import org.openforis.collect.earth.sampler.processor.KmlGenerator; -import org.openforis.collect.earth.sampler.utils.KmlGenerationException; -import org.openforis.idm.metamodel.AttributeDefinition; -import org.opengis.referencing.operation.TransformException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; +import org.openforis.collect.earth.app.logging.GAlogger; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; -import com.opencsv.CSVReader; - /** - * Servlet to return the information that is stored in Collect Earth for one - * placemark (plot) + * Controller to load and store the information that is stored in Collect Earth for one placemark (plot) * * @author Alfonso Sanchez-Paus Diaz + * @author S. Ricci * */ @Controller -public class PlacemarkBrowserServlet { - @Autowired - private BrowserService browserService; - - @Autowired - private EarthSurveyService earthSurveyService; - - @Autowired - private LocalPropertiesService localPropertiesService; - - @Autowired - private KmlGeneratorService kmlGeneratorService; - - private KmlGenerator kmlGenerator; - - private SimplePlacemarkObject lastPlacemark = null; - - private final Logger logger = LoggerFactory.getLogger( PlacemarkBrowserServlet.class ); - - private final class OpenBrowserThread extends Thread { - - private SimplePlacemarkObject placemarkObject; - - private OpenBrowserThread(String name, SimplePlacemarkObject placemarkObject) { - super(name); - this.placemarkObject = placemarkObject; - } - - @Override - public void run() { - // If this is the first plot or the plot is the last one that - // was opened - if (lastPlacemark == null - || !lastPlacemark.equals( placemarkObject ) ) { - - try { - kmlGenerator.fillSamplePoints(placemarkObject); - - kmlGenerator.fillExternalLine(placemarkObject); - - openGEEAppWindow(placemarkObject); - - openGEECodeEditorWindow(placemarkObject); - - openEarthMapWindow( placemarkObject ); - - openTimeLapseWindow(placemarkObject); - - openBingMapsWindow(placemarkObject); - - openBaiduMapsWindow(placemarkObject); - - openYandexMapsWindow(placemarkObject); - - openExtraMapWindow(placemarkObject); - - openStreetViewWindow(placemarkObject); - - openPlanetMapsWindow(placemarkObject); - - openSecureWatchWindow(placemarkObject); - - } catch (TransformException|KmlGenerationException e) { - logger.error("Error generating polygon", e ); - } - } - - lastPlacemark = placemarkObject; - - } - - - public void openEarthMapWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Earth Map window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openEarthMapURL(placemarkObject); - } catch (final Exception e) { - logger.error("Exception opening Earth Map window", e); //$NON-NLS-1$ - } - } - }.start(); - } - - public void openGEECodeEditorWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open GEE Playground window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openGEECodeEditor(placemarkObject); - } catch (final Exception e) { - logger.error("Exception opening Earth Engine Playground window", e); //$NON-NLS-1$ - } - } - }.start(); - } - - public void openGEEAppWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open GEE APP window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openGEEAppURL(placemarkObject); - } catch (final Exception e) { - logger.error("Exception opening Earth Engine APP window", e); //$NON-NLS-1$ - } - } - }.start(); - } - - public void openBingMapsWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Bing Maps window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openBingMaps(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Bing Maps window", e); //$NON-NLS-1$ - } - } - }.start(); - } - - - public void openPlanetMapsWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Planet Maps window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openPlanetMaps(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Planet Maps window", e); //$NON-NLS-1$ - } - } - }.start(); - } - - public void openSecureWatchWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open SecureWatch window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openSecureWatch(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening SecureWatch window", e); //$NON-NLS-1$ - } - } - }.start(); - } - - public void openBaiduMapsWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Baidu Maps window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openBaiduMaps(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Baidu Maps window", e); //$NON-NLS-1$ - - } - } - - }.start(); - } - - public void openYandexMapsWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Yandex Maps window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openYandexMaps(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Yandex Maps window", e); //$NON-NLS-1$ - - } - } - - }.start(); - } - - public void openExtraMapWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Expa Map window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openExtraMap(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Extra Map window", e); //$NON-NLS-1$ - - } - } - - }.start(); - } - - public void openStreetViewWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Street View window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openStreetView(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Street View window", e); //$NON-NLS-1$ - - } - } - - }.start(); - } - - public void openTimeLapseWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open TimeLapse window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openTimelapse(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Earth Engine window", e); //$NON-NLS-1$ - - } - } - - }.start(); - } - - } - - - /* - * Opens the extra browser windows for Earth Engine, Timelapse and Bing. (non-Javadoc) - * - * @see - * org.openforis.collect.earth.app.server.JsonPocessorServlet#processRequest - * (javax.servlet.http.HttpServletRequest, - * javax.servlet.http.HttpServletResponse) - */ - @GetMapping(path = "/openAuxiliaryWindows") - public void openAuxiliaryWindows( - HttpServletResponse response, - @RequestParam(value = "latLongCoordinates", required = false) final String latLongCoordinates) - { - try { - SimplePlacemarkObject placemarkObject = new SimplePlacemarkObject(latLongCoordinates.split(",") ); - OpenBrowserThread browserThread = new OpenBrowserThread("Open auxiliary windows " + latLongCoordinates, placemarkObject); - browserThread.start(); - } catch (Exception e) { - logger.error("Error loading browsers " , e); - } - } - - @GetMapping(path = "/ancillaryWindows") - public void openAuxiliaryWindowsNew(HttpServletResponse response, HttpServletRequest request) { - - - List keyAttributeDefinitions = earthSurveyService - .getRootEntityDefinition() - .getKeyAttributeDefinitions(); - - // the keys should the the parameter names - Map keys = request.getParameterMap(); - - String[] keysInOrder = new String[keys.size()]; - for (int i = 0; i < keyAttributeDefinitions.size(); i++) { - keysInOrder[i] = keys.get(keyAttributeDefinitions.get(i).getName())[0]; - } - - try { - kmlGenerator = kmlGeneratorService.getKmlGenerator(); - - String[] csvValues = getValuesFromCsv(keysInOrder); - - if( csvValues == null ){ - throw new IllegalArgumentException("The keys " + keys.toString() + " are not present on the CSV file with the plot locations!!!"); - } - - SimplePlacemarkObject placemarkObject = kmlGenerator.getPlotObject(csvValues, null, earthSurveyService.getCollectSurvey() ); - OpenBrowserThread browserThread = new OpenBrowserThread("Open ancillary windows - polygon ", placemarkObject ); - browserThread.start(); - } catch (Exception e) { - logger.error("Error loading browsers " , e); +public class PlacemarkDataController extends AbstractPlacemarkDataController { + @Override + @GetMapping(value="/placemark-info-expanded") + public void placemarkInfoExpanded(@RequestParam("id") String placemarkId, HttpServletResponse response) throws IOException { + try{ + super.placemarkInfoExpanded(placemarkId, response); + }catch(Exception e){ + logger.error("Error saving data" , e); } - } - private String[] getValuesFromCsv(String[] keysInOrder) { - - final String csvFile = localPropertiesService.getCsvFile(); - try ( - CSVReader reader = CsvReaderUtils.getCsvReader( csvFile ); - ){ - - - String[] csvRow; - int numberOfKeys = keysInOrder.length; - while ((csvRow = reader.readNext()) != null) { - boolean foundIt = true; - for( int idx=0; idx Date: Tue, 29 Nov 2022 15:41:15 +0100 Subject: [PATCH 1043/1620] New translations PlacemarkDataController.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 358 +----------------- 1 file changed, 21 insertions(+), 337 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index de96e18020..fcb3cec51d 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,361 +1,45 @@ package org.openforis.collect.earth.app.server; -import java.util.List; -import java.util.Map; +import java.io.IOException; -import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.openforis.collect.earth.app.service.BrowserService; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.KmlGeneratorService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; -import org.openforis.collect.earth.sampler.processor.KmlGenerator; -import org.openforis.collect.earth.sampler.utils.KmlGenerationException; -import org.openforis.idm.metamodel.AttributeDefinition; -import org.opengis.referencing.operation.TransformException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; +import org.openforis.collect.earth.app.logging.GAlogger; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; -import com.opencsv.CSVReader; - /** - * Servlet to return the information that is stored in Collect Earth for one - * placemark (plot) + * Controller to load and store the information that is stored in Collect Earth for one placemark (plot) * * @author Alfonso Sanchez-Paus Diaz + * @author S. Ricci * */ @Controller -public class PlacemarkBrowserServlet { - @Autowired - private BrowserService browserService; - - @Autowired - private EarthSurveyService earthSurveyService; - - @Autowired - private LocalPropertiesService localPropertiesService; - - @Autowired - private KmlGeneratorService kmlGeneratorService; - - private KmlGenerator kmlGenerator; - - private SimplePlacemarkObject lastPlacemark = null; - - private final Logger logger = LoggerFactory.getLogger( PlacemarkBrowserServlet.class ); - - private final class OpenBrowserThread extends Thread { - - private SimplePlacemarkObject placemarkObject; - - private OpenBrowserThread(String name, SimplePlacemarkObject placemarkObject) { - super(name); - this.placemarkObject = placemarkObject; - } - - @Override - public void run() { - // If this is the first plot or the plot is the last one that - // was opened - if (lastPlacemark == null - || !lastPlacemark.equals( placemarkObject ) ) { - - try { - kmlGenerator.fillSamplePoints(placemarkObject); - - kmlGenerator.fillExternalLine(placemarkObject); - - openGEEAppWindow(placemarkObject); - - openGEECodeEditorWindow(placemarkObject); - - openEarthMapWindow( placemarkObject ); - - openTimeLapseWindow(placemarkObject); - - openBingMapsWindow(placemarkObject); - - openBaiduMapsWindow(placemarkObject); - - openYandexMapsWindow(placemarkObject); - - openExtraMapWindow(placemarkObject); - - openStreetViewWindow(placemarkObject); - - openPlanetMapsWindow(placemarkObject); - - openSecureWatchWindow(placemarkObject); - - } catch (TransformException|KmlGenerationException e) { - logger.error("Error generating polygon", e ); - } - } - - lastPlacemark = placemarkObject; - - } - - - public void openEarthMapWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Earth Map window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openEarthMapURL(placemarkObject); - } catch (final Exception e) { - logger.error("Exception opening Earth Map window", e); //$NON-NLS-1$ - } - } - }.start(); - } - - public void openGEECodeEditorWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open GEE Playground window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openGEECodeEditor(placemarkObject); - } catch (final Exception e) { - logger.error("Exception opening Earth Engine Playground window", e); //$NON-NLS-1$ - } - } - }.start(); - } - - public void openGEEAppWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open GEE APP window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openGEEAppURL(placemarkObject); - } catch (final Exception e) { - logger.error("Exception opening Earth Engine APP window", e); //$NON-NLS-1$ - } - } - }.start(); - } - - public void openBingMapsWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Bing Maps window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openBingMaps(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Bing Maps window", e); //$NON-NLS-1$ - } - } - }.start(); - } - - - public void openPlanetMapsWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Planet Maps window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openPlanetMaps(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Planet Maps window", e); //$NON-NLS-1$ - } - } - }.start(); - } - - public void openSecureWatchWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open SecureWatch window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openSecureWatch(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening SecureWatch window", e); //$NON-NLS-1$ - } - } - }.start(); - } - - public void openBaiduMapsWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Baidu Maps window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openBaiduMaps(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Baidu Maps window", e); //$NON-NLS-1$ - - } - } - - }.start(); - } - - public void openYandexMapsWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Yandex Maps window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openYandexMaps(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Yandex Maps window", e); //$NON-NLS-1$ - - } - } - - }.start(); - } - - public void openExtraMapWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Expa Map window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openExtraMap(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Extra Map window", e); //$NON-NLS-1$ - - } - } - - }.start(); - } - - public void openStreetViewWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Street View window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openStreetView(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Street View window", e); //$NON-NLS-1$ - - } - } - - }.start(); - } - - public void openTimeLapseWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open TimeLapse window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openTimelapse(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Earth Engine window", e); //$NON-NLS-1$ - - } - } - - }.start(); - } - - } - - - /* - * Opens the extra browser windows for Earth Engine, Timelapse and Bing. (non-Javadoc) - * - * @see - * org.openforis.collect.earth.app.server.JsonPocessorServlet#processRequest - * (javax.servlet.http.HttpServletRequest, - * javax.servlet.http.HttpServletResponse) - */ - @GetMapping(path = "/openAuxiliaryWindows") - public void openAuxiliaryWindows( - HttpServletResponse response, - @RequestParam(value = "latLongCoordinates", required = false) final String latLongCoordinates) - { - try { - SimplePlacemarkObject placemarkObject = new SimplePlacemarkObject(latLongCoordinates.split(",") ); - OpenBrowserThread browserThread = new OpenBrowserThread("Open auxiliary windows " + latLongCoordinates, placemarkObject); - browserThread.start(); - } catch (Exception e) { - logger.error("Error loading browsers " , e); - } - } - - @GetMapping(path = "/ancillaryWindows") - public void openAuxiliaryWindowsNew(HttpServletResponse response, HttpServletRequest request) { - - - List keyAttributeDefinitions = earthSurveyService - .getRootEntityDefinition() - .getKeyAttributeDefinitions(); - - // the keys should the the parameter names - Map keys = request.getParameterMap(); - - String[] keysInOrder = new String[keys.size()]; - for (int i = 0; i < keyAttributeDefinitions.size(); i++) { - keysInOrder[i] = keys.get(keyAttributeDefinitions.get(i).getName())[0]; - } - - try { - kmlGenerator = kmlGeneratorService.getKmlGenerator(); - - String[] csvValues = getValuesFromCsv(keysInOrder); - - if( csvValues == null ){ - throw new IllegalArgumentException("The keys " + keys.toString() + " are not present on the CSV file with the plot locations!!!"); - } - - SimplePlacemarkObject placemarkObject = kmlGenerator.getPlotObject(csvValues, null, earthSurveyService.getCollectSurvey() ); - OpenBrowserThread browserThread = new OpenBrowserThread("Open ancillary windows - polygon ", placemarkObject ); - browserThread.start(); - } catch (Exception e) { - logger.error("Error loading browsers " , e); +public class PlacemarkDataController extends AbstractPlacemarkDataController { + @Override + @GetMapping(value="/placemark-info-expanded") + public void placemarkInfoExpanded(@RequestParam("id") String placemarkId, HttpServletResponse response) throws IOException { + try{ + super.placemarkInfoExpanded(placemarkId, response); + }catch(Exception e){ + logger.error("Error saving data" , e); } - } - private String[] getValuesFromCsv(String[] keysInOrder) { - - final String csvFile = localPropertiesService.getCsvFile(); - try ( - CSVReader reader = CsvReaderUtils.getCsvReader( csvFile ); - ){ - - - String[] csvRow; - int numberOfKeys = keysInOrder.length; - while ((csvRow = reader.readNext()) != null) { - boolean foundIt = true; - for( int idx=0; idx Date: Tue, 29 Nov 2022 15:41:16 +0100 Subject: [PATCH 1044/1620] New translations PlacemarkDataController.java (English) --- .../earth/app/view/Messages_en.properties | 358 +----------------- 1 file changed, 21 insertions(+), 337 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index de96e18020..fcb3cec51d 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,361 +1,45 @@ package org.openforis.collect.earth.app.server; -import java.util.List; -import java.util.Map; +import java.io.IOException; -import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.openforis.collect.earth.app.service.BrowserService; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.KmlGeneratorService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; -import org.openforis.collect.earth.sampler.processor.KmlGenerator; -import org.openforis.collect.earth.sampler.utils.KmlGenerationException; -import org.openforis.idm.metamodel.AttributeDefinition; -import org.opengis.referencing.operation.TransformException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; +import org.openforis.collect.earth.app.logging.GAlogger; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; -import com.opencsv.CSVReader; - /** - * Servlet to return the information that is stored in Collect Earth for one - * placemark (plot) + * Controller to load and store the information that is stored in Collect Earth for one placemark (plot) * * @author Alfonso Sanchez-Paus Diaz + * @author S. Ricci * */ @Controller -public class PlacemarkBrowserServlet { - @Autowired - private BrowserService browserService; - - @Autowired - private EarthSurveyService earthSurveyService; - - @Autowired - private LocalPropertiesService localPropertiesService; - - @Autowired - private KmlGeneratorService kmlGeneratorService; - - private KmlGenerator kmlGenerator; - - private SimplePlacemarkObject lastPlacemark = null; - - private final Logger logger = LoggerFactory.getLogger( PlacemarkBrowserServlet.class ); - - private final class OpenBrowserThread extends Thread { - - private SimplePlacemarkObject placemarkObject; - - private OpenBrowserThread(String name, SimplePlacemarkObject placemarkObject) { - super(name); - this.placemarkObject = placemarkObject; - } - - @Override - public void run() { - // If this is the first plot or the plot is the last one that - // was opened - if (lastPlacemark == null - || !lastPlacemark.equals( placemarkObject ) ) { - - try { - kmlGenerator.fillSamplePoints(placemarkObject); - - kmlGenerator.fillExternalLine(placemarkObject); - - openGEEAppWindow(placemarkObject); - - openGEECodeEditorWindow(placemarkObject); - - openEarthMapWindow( placemarkObject ); - - openTimeLapseWindow(placemarkObject); - - openBingMapsWindow(placemarkObject); - - openBaiduMapsWindow(placemarkObject); - - openYandexMapsWindow(placemarkObject); - - openExtraMapWindow(placemarkObject); - - openStreetViewWindow(placemarkObject); - - openPlanetMapsWindow(placemarkObject); - - openSecureWatchWindow(placemarkObject); - - } catch (TransformException|KmlGenerationException e) { - logger.error("Error generating polygon", e ); - } - } - - lastPlacemark = placemarkObject; - - } - - - public void openEarthMapWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Earth Map window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openEarthMapURL(placemarkObject); - } catch (final Exception e) { - logger.error("Exception opening Earth Map window", e); //$NON-NLS-1$ - } - } - }.start(); - } - - public void openGEECodeEditorWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open GEE Playground window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openGEECodeEditor(placemarkObject); - } catch (final Exception e) { - logger.error("Exception opening Earth Engine Playground window", e); //$NON-NLS-1$ - } - } - }.start(); - } - - public void openGEEAppWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open GEE APP window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openGEEAppURL(placemarkObject); - } catch (final Exception e) { - logger.error("Exception opening Earth Engine APP window", e); //$NON-NLS-1$ - } - } - }.start(); - } - - public void openBingMapsWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Bing Maps window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openBingMaps(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Bing Maps window", e); //$NON-NLS-1$ - } - } - }.start(); - } - - - public void openPlanetMapsWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Planet Maps window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openPlanetMaps(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Planet Maps window", e); //$NON-NLS-1$ - } - } - }.start(); - } - - public void openSecureWatchWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open SecureWatch window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openSecureWatch(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening SecureWatch window", e); //$NON-NLS-1$ - } - } - }.start(); - } - - public void openBaiduMapsWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Baidu Maps window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openBaiduMaps(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Baidu Maps window", e); //$NON-NLS-1$ - - } - } - - }.start(); - } - - public void openYandexMapsWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Yandex Maps window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openYandexMaps(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Yandex Maps window", e); //$NON-NLS-1$ - - } - } - - }.start(); - } - - public void openExtraMapWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Expa Map window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openExtraMap(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Extra Map window", e); //$NON-NLS-1$ - - } - } - - }.start(); - } - - public void openStreetViewWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open Street View window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openStreetView(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Street View window", e); //$NON-NLS-1$ - - } - } - - }.start(); - } - - public void openTimeLapseWindow(final SimplePlacemarkObject placemarkObject) { - new Thread("Open TimeLapse window") { //$NON-NLS-1$ - @Override - public void run() { - try { - browserService.openTimelapse(placemarkObject); - } catch (final Exception e) { - LoggerFactory.getLogger(this.getClass()).error( - "Exception opening Earth Engine window", e); //$NON-NLS-1$ - - } - } - - }.start(); - } - - } - - - /* - * Opens the extra browser windows for Earth Engine, Timelapse and Bing. (non-Javadoc) - * - * @see - * org.openforis.collect.earth.app.server.JsonPocessorServlet#processRequest - * (javax.servlet.http.HttpServletRequest, - * javax.servlet.http.HttpServletResponse) - */ - @GetMapping(path = "/openAuxiliaryWindows") - public void openAuxiliaryWindows( - HttpServletResponse response, - @RequestParam(value = "latLongCoordinates", required = false) final String latLongCoordinates) - { - try { - SimplePlacemarkObject placemarkObject = new SimplePlacemarkObject(latLongCoordinates.split(",") ); - OpenBrowserThread browserThread = new OpenBrowserThread("Open auxiliary windows " + latLongCoordinates, placemarkObject); - browserThread.start(); - } catch (Exception e) { - logger.error("Error loading browsers " , e); - } - } - - @GetMapping(path = "/ancillaryWindows") - public void openAuxiliaryWindowsNew(HttpServletResponse response, HttpServletRequest request) { - - - List keyAttributeDefinitions = earthSurveyService - .getRootEntityDefinition() - .getKeyAttributeDefinitions(); - - // the keys should the the parameter names - Map keys = request.getParameterMap(); - - String[] keysInOrder = new String[keys.size()]; - for (int i = 0; i < keyAttributeDefinitions.size(); i++) { - keysInOrder[i] = keys.get(keyAttributeDefinitions.get(i).getName())[0]; - } - - try { - kmlGenerator = kmlGeneratorService.getKmlGenerator(); - - String[] csvValues = getValuesFromCsv(keysInOrder); - - if( csvValues == null ){ - throw new IllegalArgumentException("The keys " + keys.toString() + " are not present on the CSV file with the plot locations!!!"); - } - - SimplePlacemarkObject placemarkObject = kmlGenerator.getPlotObject(csvValues, null, earthSurveyService.getCollectSurvey() ); - OpenBrowserThread browserThread = new OpenBrowserThread("Open ancillary windows - polygon ", placemarkObject ); - browserThread.start(); - } catch (Exception e) { - logger.error("Error loading browsers " , e); +public class PlacemarkDataController extends AbstractPlacemarkDataController { + @Override + @GetMapping(value="/placemark-info-expanded") + public void placemarkInfoExpanded(@RequestParam("id") String placemarkId, HttpServletResponse response) throws IOException { + try{ + super.placemarkInfoExpanded(placemarkId, response); + }catch(Exception e){ + logger.error("Error saving data" , e); } - } - private String[] getValuesFromCsv(String[] keysInOrder) { - - final String csvFile = localPropertiesService.getCsvFile(); - try ( - CSVReader reader = CsvReaderUtils.getCsvReader( csvFile ); - ){ - - - String[] csvRow; - int numberOfKeys = keysInOrder.length; - while ((csvRow = reader.readNext()) != null) { - boolean foundIt = true; - for( int idx=0; idx Date: Tue, 29 Nov 2022 15:41:17 +0100 Subject: [PATCH 1045/1620] New translations PlacemarkImageServlet.java (French) --- .../earth/app/view/Messages_fr.properties | 135 +++++++++++++++--- 1 file changed, 113 insertions(+), 22 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index fcb3cec51d..3cc75d6710 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,45 +1,136 @@ package org.openforis.collect.earth.app.server; +import java.io.File; import java.io.IOException; +import java.net.URISyntaxException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; +import java.util.Map; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.openforis.collect.earth.app.logging.GAlogger; +import org.apache.commons.lang3.ArrayUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.PreloadedFilesService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; /** - * Controller to load and store the information that is stored in Collect Earth for one placemark (plot) + * Servlet used to obtain the right icon/ground-overlay for each placemark. + * These icons symbolize the status of a placemark ( a red exclamation if the placemark has not been filled, a yellow warning sign if the placemark is + * partially filled or a green tick if the placemark information has been successfully filled) * * @author Alfonso Sanchez-Paus Diaz - * @author S. Ricci * */ @Controller -public class PlacemarkDataController extends AbstractPlacemarkDataController { - @Override - @GetMapping(value="/placemark-info-expanded") - public void placemarkInfoExpanded(@RequestParam("id") String placemarkId, HttpServletResponse response) throws IOException { - try{ - super.placemarkInfoExpanded(placemarkId, response); - }catch(Exception e){ - logger.error("Error saving data" , e); - } +public class PlacemarkImageServlet extends JsonPocessorServlet { + + @Autowired + private EarthSurveyService earthSurveyService; + + @Autowired + private PreloadedFilesService preloadedFilesService; + + private Logger loggerSlf4 = LoggerFactory.getLogger( PlacemarkImageServlet.class ); + + /** + * Returns an icon/overlay image that represents the state of the placemark not-filled/filling/filled + * @param response The HTTP response object + * @param request The HTTP request object + * @param placemarkId The ID of the placemark for which we want to get the icon/overlay + * @param listView True if want to get the icon for the placemark list, false to get the overlay image (transparent or see-through red for filled placemarks) + * @throws IOException In case the image icon cannot be open + * @throws URISyntaxException In case the image icon URL contains an error + */ + @GetMapping("/placemarkIcon") + public void getImage(HttpServletResponse response, HttpServletRequest request, @RequestParam( EarthConstants.PLACEMARK_ID_PARAMETER ) String placemarkId, + @RequestParam(value = "listView", required = false) Boolean listView) throws IOException, URISyntaxException { + getImageExt(response, request, placemarkId, listView); } - @Override - @PostMapping(value="/save-data-expanded") - public void saveDataExpanded(PlacemarkUpdateRequest updateRequest, HttpServletResponse response) throws IOException { - try{ - super.saveDataExpanded(updateRequest, response); - if( updateRequest.getValues().get("collect_boolean_actively_saved").equals("true")) { - GAlogger.logGAnalytics("Plot saved"); + /** + * Returns an icon/overlay image that represents the state of the placemark not-filled/filling/filled + * @param response The HTTP response object + * @param request The HTTP request object + * @param id The ID of the plot with separated by commas + * @param listView True if want to get the icon for the placemark list, false to get the overlay image (transparent or see-through red for filled placemarks) + * @throws IOException In case the image icon cannot be open + * @throws URISyntaxException In case the image icon URL contains an error + */ + @GetMapping("/placemarkIconExtd") + public void getImageExt(HttpServletResponse response, HttpServletRequest request, @RequestParam(value = "id", required = false) String id, @RequestParam(value = "listView", required = false) Boolean listView) throws IOException, URISyntaxException { + String[] keys = id.split(","); + + if( listView == null ){ + throw new IllegalArgumentException("This servlet only responds to listView type of requests where the status icons for the placemarks are the expected result"); //$NON-NLS-1$ + } + + // If there is an exception while we get the record info (problem that might happen when using SQLite due to concurrency) return the yellow icon. + String imageName = EarthConstants.LIST_NOT_FINISHED_IMAGE; + try { + + final Map placemarkParameters = earthSurveyService.getPlacemark(keys,false); + + if (earthSurveyService.isPlacemarkSavedActively(placemarkParameters)) { + imageName = EarthConstants.LIST_FILLED_IMAGE; + } else if (earthSurveyService.isPlacemarkEdited(placemarkParameters)) { + imageName = EarthConstants.LIST_NOT_FINISHED_IMAGE; + } else { + imageName = EarthConstants.LIST_NON_FILLED_IMAGE; } - }catch(Exception e){ - logger.error("Error saving data" , e); + } catch (Exception e) { + loggerSlf4.error("Error loading image for placemark with ID " + ArrayUtils.toString( keys ) , e); //$NON-NLS-1$ + }finally{ + returnImage(response, imageName); } } + private byte[] readFile(String filePath) { + final File imageFile = new File(filePath); + return preloadedFilesService.getFileContent(imageFile); + } + + private void returnImage(HttpServletResponse response, String imageName) throws IOException { + response.setHeader("Content-Type", "image/png"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Content-Disposition", "inline; filename=\"" + imageName + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Date", new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH).format(new Date())); //$NON-NLS-1$ + + byte[] resultingImage = null; + if (imageName.equals(EarthConstants.LIST_NON_FILLED_IMAGE)) { + resultingImage = readFile(EarthConstants.LIST_NON_FILLED_IMAGE); + } else if (imageName.equals(EarthConstants.LIST_FILLED_IMAGE)) { + resultingImage = readFile(EarthConstants.LIST_FILLED_IMAGE); + } else if (imageName.equals(EarthConstants.LIST_NOT_FINISHED_IMAGE)) { + resultingImage = readFile(EarthConstants.LIST_NOT_FINISHED_IMAGE); + } + + if (resultingImage != null) { + response.setHeader("Content-Length", Integer.toString( resultingImage.length ) ); //$NON-NLS-1$ //$NON-NLS-2$ + writeToResponse(response, resultingImage); + } else { + getLogger().error("There was a problem fetching the image, please check the name!"); //$NON-NLS-1$ + } + } + + private void writeToResponse(HttpServletResponse response, byte[] fileContents) throws IOException { + ServletOutputStream outputStream = response.getOutputStream(); + try { + outputStream.write(fileContents); + outputStream.flush(); + } catch (final Exception e) { + getLogger().error("Error writing reponse body to output stream ", e); //$NON-NLS-1$ + } finally { + outputStream.close(); + } + } } From 3df922a5a8f37453d42272cda72145942acdaa06 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:18 +0100 Subject: [PATCH 1046/1620] New translations PlacemarkImageServlet.java (Spanish) --- .../earth/app/view/Messages_es.properties | 135 +++++++++++++++--- 1 file changed, 113 insertions(+), 22 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index fcb3cec51d..3cc75d6710 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,45 +1,136 @@ package org.openforis.collect.earth.app.server; +import java.io.File; import java.io.IOException; +import java.net.URISyntaxException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; +import java.util.Map; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.openforis.collect.earth.app.logging.GAlogger; +import org.apache.commons.lang3.ArrayUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.PreloadedFilesService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; /** - * Controller to load and store the information that is stored in Collect Earth for one placemark (plot) + * Servlet used to obtain the right icon/ground-overlay for each placemark. + * These icons symbolize the status of a placemark ( a red exclamation if the placemark has not been filled, a yellow warning sign if the placemark is + * partially filled or a green tick if the placemark information has been successfully filled) * * @author Alfonso Sanchez-Paus Diaz - * @author S. Ricci * */ @Controller -public class PlacemarkDataController extends AbstractPlacemarkDataController { - @Override - @GetMapping(value="/placemark-info-expanded") - public void placemarkInfoExpanded(@RequestParam("id") String placemarkId, HttpServletResponse response) throws IOException { - try{ - super.placemarkInfoExpanded(placemarkId, response); - }catch(Exception e){ - logger.error("Error saving data" , e); - } +public class PlacemarkImageServlet extends JsonPocessorServlet { + + @Autowired + private EarthSurveyService earthSurveyService; + + @Autowired + private PreloadedFilesService preloadedFilesService; + + private Logger loggerSlf4 = LoggerFactory.getLogger( PlacemarkImageServlet.class ); + + /** + * Returns an icon/overlay image that represents the state of the placemark not-filled/filling/filled + * @param response The HTTP response object + * @param request The HTTP request object + * @param placemarkId The ID of the placemark for which we want to get the icon/overlay + * @param listView True if want to get the icon for the placemark list, false to get the overlay image (transparent or see-through red for filled placemarks) + * @throws IOException In case the image icon cannot be open + * @throws URISyntaxException In case the image icon URL contains an error + */ + @GetMapping("/placemarkIcon") + public void getImage(HttpServletResponse response, HttpServletRequest request, @RequestParam( EarthConstants.PLACEMARK_ID_PARAMETER ) String placemarkId, + @RequestParam(value = "listView", required = false) Boolean listView) throws IOException, URISyntaxException { + getImageExt(response, request, placemarkId, listView); } - @Override - @PostMapping(value="/save-data-expanded") - public void saveDataExpanded(PlacemarkUpdateRequest updateRequest, HttpServletResponse response) throws IOException { - try{ - super.saveDataExpanded(updateRequest, response); - if( updateRequest.getValues().get("collect_boolean_actively_saved").equals("true")) { - GAlogger.logGAnalytics("Plot saved"); + /** + * Returns an icon/overlay image that represents the state of the placemark not-filled/filling/filled + * @param response The HTTP response object + * @param request The HTTP request object + * @param id The ID of the plot with separated by commas + * @param listView True if want to get the icon for the placemark list, false to get the overlay image (transparent or see-through red for filled placemarks) + * @throws IOException In case the image icon cannot be open + * @throws URISyntaxException In case the image icon URL contains an error + */ + @GetMapping("/placemarkIconExtd") + public void getImageExt(HttpServletResponse response, HttpServletRequest request, @RequestParam(value = "id", required = false) String id, @RequestParam(value = "listView", required = false) Boolean listView) throws IOException, URISyntaxException { + String[] keys = id.split(","); + + if( listView == null ){ + throw new IllegalArgumentException("This servlet only responds to listView type of requests where the status icons for the placemarks are the expected result"); //$NON-NLS-1$ + } + + // If there is an exception while we get the record info (problem that might happen when using SQLite due to concurrency) return the yellow icon. + String imageName = EarthConstants.LIST_NOT_FINISHED_IMAGE; + try { + + final Map placemarkParameters = earthSurveyService.getPlacemark(keys,false); + + if (earthSurveyService.isPlacemarkSavedActively(placemarkParameters)) { + imageName = EarthConstants.LIST_FILLED_IMAGE; + } else if (earthSurveyService.isPlacemarkEdited(placemarkParameters)) { + imageName = EarthConstants.LIST_NOT_FINISHED_IMAGE; + } else { + imageName = EarthConstants.LIST_NON_FILLED_IMAGE; } - }catch(Exception e){ - logger.error("Error saving data" , e); + } catch (Exception e) { + loggerSlf4.error("Error loading image for placemark with ID " + ArrayUtils.toString( keys ) , e); //$NON-NLS-1$ + }finally{ + returnImage(response, imageName); } } + private byte[] readFile(String filePath) { + final File imageFile = new File(filePath); + return preloadedFilesService.getFileContent(imageFile); + } + + private void returnImage(HttpServletResponse response, String imageName) throws IOException { + response.setHeader("Content-Type", "image/png"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Content-Disposition", "inline; filename=\"" + imageName + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Date", new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH).format(new Date())); //$NON-NLS-1$ + + byte[] resultingImage = null; + if (imageName.equals(EarthConstants.LIST_NON_FILLED_IMAGE)) { + resultingImage = readFile(EarthConstants.LIST_NON_FILLED_IMAGE); + } else if (imageName.equals(EarthConstants.LIST_FILLED_IMAGE)) { + resultingImage = readFile(EarthConstants.LIST_FILLED_IMAGE); + } else if (imageName.equals(EarthConstants.LIST_NOT_FINISHED_IMAGE)) { + resultingImage = readFile(EarthConstants.LIST_NOT_FINISHED_IMAGE); + } + + if (resultingImage != null) { + response.setHeader("Content-Length", Integer.toString( resultingImage.length ) ); //$NON-NLS-1$ //$NON-NLS-2$ + writeToResponse(response, resultingImage); + } else { + getLogger().error("There was a problem fetching the image, please check the name!"); //$NON-NLS-1$ + } + } + + private void writeToResponse(HttpServletResponse response, byte[] fileContents) throws IOException { + ServletOutputStream outputStream = response.getOutputStream(); + try { + outputStream.write(fileContents); + outputStream.flush(); + } catch (final Exception e) { + getLogger().error("Error writing reponse body to output stream ", e); //$NON-NLS-1$ + } finally { + outputStream.close(); + } + } } From 2def686740b864c0dee817a96063d7b696bdd361 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:19 +0100 Subject: [PATCH 1047/1620] New translations PlacemarkImageServlet.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 135 +++++++++++++++--- 1 file changed, 113 insertions(+), 22 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index fcb3cec51d..3cc75d6710 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,45 +1,136 @@ package org.openforis.collect.earth.app.server; +import java.io.File; import java.io.IOException; +import java.net.URISyntaxException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; +import java.util.Map; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.openforis.collect.earth.app.logging.GAlogger; +import org.apache.commons.lang3.ArrayUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.PreloadedFilesService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; /** - * Controller to load and store the information that is stored in Collect Earth for one placemark (plot) + * Servlet used to obtain the right icon/ground-overlay for each placemark. + * These icons symbolize the status of a placemark ( a red exclamation if the placemark has not been filled, a yellow warning sign if the placemark is + * partially filled or a green tick if the placemark information has been successfully filled) * * @author Alfonso Sanchez-Paus Diaz - * @author S. Ricci * */ @Controller -public class PlacemarkDataController extends AbstractPlacemarkDataController { - @Override - @GetMapping(value="/placemark-info-expanded") - public void placemarkInfoExpanded(@RequestParam("id") String placemarkId, HttpServletResponse response) throws IOException { - try{ - super.placemarkInfoExpanded(placemarkId, response); - }catch(Exception e){ - logger.error("Error saving data" , e); - } +public class PlacemarkImageServlet extends JsonPocessorServlet { + + @Autowired + private EarthSurveyService earthSurveyService; + + @Autowired + private PreloadedFilesService preloadedFilesService; + + private Logger loggerSlf4 = LoggerFactory.getLogger( PlacemarkImageServlet.class ); + + /** + * Returns an icon/overlay image that represents the state of the placemark not-filled/filling/filled + * @param response The HTTP response object + * @param request The HTTP request object + * @param placemarkId The ID of the placemark for which we want to get the icon/overlay + * @param listView True if want to get the icon for the placemark list, false to get the overlay image (transparent or see-through red for filled placemarks) + * @throws IOException In case the image icon cannot be open + * @throws URISyntaxException In case the image icon URL contains an error + */ + @GetMapping("/placemarkIcon") + public void getImage(HttpServletResponse response, HttpServletRequest request, @RequestParam( EarthConstants.PLACEMARK_ID_PARAMETER ) String placemarkId, + @RequestParam(value = "listView", required = false) Boolean listView) throws IOException, URISyntaxException { + getImageExt(response, request, placemarkId, listView); } - @Override - @PostMapping(value="/save-data-expanded") - public void saveDataExpanded(PlacemarkUpdateRequest updateRequest, HttpServletResponse response) throws IOException { - try{ - super.saveDataExpanded(updateRequest, response); - if( updateRequest.getValues().get("collect_boolean_actively_saved").equals("true")) { - GAlogger.logGAnalytics("Plot saved"); + /** + * Returns an icon/overlay image that represents the state of the placemark not-filled/filling/filled + * @param response The HTTP response object + * @param request The HTTP request object + * @param id The ID of the plot with separated by commas + * @param listView True if want to get the icon for the placemark list, false to get the overlay image (transparent or see-through red for filled placemarks) + * @throws IOException In case the image icon cannot be open + * @throws URISyntaxException In case the image icon URL contains an error + */ + @GetMapping("/placemarkIconExtd") + public void getImageExt(HttpServletResponse response, HttpServletRequest request, @RequestParam(value = "id", required = false) String id, @RequestParam(value = "listView", required = false) Boolean listView) throws IOException, URISyntaxException { + String[] keys = id.split(","); + + if( listView == null ){ + throw new IllegalArgumentException("This servlet only responds to listView type of requests where the status icons for the placemarks are the expected result"); //$NON-NLS-1$ + } + + // If there is an exception while we get the record info (problem that might happen when using SQLite due to concurrency) return the yellow icon. + String imageName = EarthConstants.LIST_NOT_FINISHED_IMAGE; + try { + + final Map placemarkParameters = earthSurveyService.getPlacemark(keys,false); + + if (earthSurveyService.isPlacemarkSavedActively(placemarkParameters)) { + imageName = EarthConstants.LIST_FILLED_IMAGE; + } else if (earthSurveyService.isPlacemarkEdited(placemarkParameters)) { + imageName = EarthConstants.LIST_NOT_FINISHED_IMAGE; + } else { + imageName = EarthConstants.LIST_NON_FILLED_IMAGE; } - }catch(Exception e){ - logger.error("Error saving data" , e); + } catch (Exception e) { + loggerSlf4.error("Error loading image for placemark with ID " + ArrayUtils.toString( keys ) , e); //$NON-NLS-1$ + }finally{ + returnImage(response, imageName); } } + private byte[] readFile(String filePath) { + final File imageFile = new File(filePath); + return preloadedFilesService.getFileContent(imageFile); + } + + private void returnImage(HttpServletResponse response, String imageName) throws IOException { + response.setHeader("Content-Type", "image/png"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Content-Disposition", "inline; filename=\"" + imageName + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Date", new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH).format(new Date())); //$NON-NLS-1$ + + byte[] resultingImage = null; + if (imageName.equals(EarthConstants.LIST_NON_FILLED_IMAGE)) { + resultingImage = readFile(EarthConstants.LIST_NON_FILLED_IMAGE); + } else if (imageName.equals(EarthConstants.LIST_FILLED_IMAGE)) { + resultingImage = readFile(EarthConstants.LIST_FILLED_IMAGE); + } else if (imageName.equals(EarthConstants.LIST_NOT_FINISHED_IMAGE)) { + resultingImage = readFile(EarthConstants.LIST_NOT_FINISHED_IMAGE); + } + + if (resultingImage != null) { + response.setHeader("Content-Length", Integer.toString( resultingImage.length ) ); //$NON-NLS-1$ //$NON-NLS-2$ + writeToResponse(response, resultingImage); + } else { + getLogger().error("There was a problem fetching the image, please check the name!"); //$NON-NLS-1$ + } + } + + private void writeToResponse(HttpServletResponse response, byte[] fileContents) throws IOException { + ServletOutputStream outputStream = response.getOutputStream(); + try { + outputStream.write(fileContents); + outputStream.flush(); + } catch (final Exception e) { + getLogger().error("Error writing reponse body to output stream ", e); //$NON-NLS-1$ + } finally { + outputStream.close(); + } + } } From 4be408c9560fb33b4edf07d17368a313e42966d2 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:21 +0100 Subject: [PATCH 1048/1620] New translations PlacemarkImageServlet.java (English) --- .../earth/app/view/Messages_en.properties | 135 +++++++++++++++--- 1 file changed, 113 insertions(+), 22 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index fcb3cec51d..3cc75d6710 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,45 +1,136 @@ package org.openforis.collect.earth.app.server; +import java.io.File; import java.io.IOException; +import java.net.URISyntaxException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; +import java.util.Map; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.openforis.collect.earth.app.logging.GAlogger; +import org.apache.commons.lang3.ArrayUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.PreloadedFilesService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; /** - * Controller to load and store the information that is stored in Collect Earth for one placemark (plot) + * Servlet used to obtain the right icon/ground-overlay for each placemark. + * These icons symbolize the status of a placemark ( a red exclamation if the placemark has not been filled, a yellow warning sign if the placemark is + * partially filled or a green tick if the placemark information has been successfully filled) * * @author Alfonso Sanchez-Paus Diaz - * @author S. Ricci * */ @Controller -public class PlacemarkDataController extends AbstractPlacemarkDataController { - @Override - @GetMapping(value="/placemark-info-expanded") - public void placemarkInfoExpanded(@RequestParam("id") String placemarkId, HttpServletResponse response) throws IOException { - try{ - super.placemarkInfoExpanded(placemarkId, response); - }catch(Exception e){ - logger.error("Error saving data" , e); - } +public class PlacemarkImageServlet extends JsonPocessorServlet { + + @Autowired + private EarthSurveyService earthSurveyService; + + @Autowired + private PreloadedFilesService preloadedFilesService; + + private Logger loggerSlf4 = LoggerFactory.getLogger( PlacemarkImageServlet.class ); + + /** + * Returns an icon/overlay image that represents the state of the placemark not-filled/filling/filled + * @param response The HTTP response object + * @param request The HTTP request object + * @param placemarkId The ID of the placemark for which we want to get the icon/overlay + * @param listView True if want to get the icon for the placemark list, false to get the overlay image (transparent or see-through red for filled placemarks) + * @throws IOException In case the image icon cannot be open + * @throws URISyntaxException In case the image icon URL contains an error + */ + @GetMapping("/placemarkIcon") + public void getImage(HttpServletResponse response, HttpServletRequest request, @RequestParam( EarthConstants.PLACEMARK_ID_PARAMETER ) String placemarkId, + @RequestParam(value = "listView", required = false) Boolean listView) throws IOException, URISyntaxException { + getImageExt(response, request, placemarkId, listView); } - @Override - @PostMapping(value="/save-data-expanded") - public void saveDataExpanded(PlacemarkUpdateRequest updateRequest, HttpServletResponse response) throws IOException { - try{ - super.saveDataExpanded(updateRequest, response); - if( updateRequest.getValues().get("collect_boolean_actively_saved").equals("true")) { - GAlogger.logGAnalytics("Plot saved"); + /** + * Returns an icon/overlay image that represents the state of the placemark not-filled/filling/filled + * @param response The HTTP response object + * @param request The HTTP request object + * @param id The ID of the plot with separated by commas + * @param listView True if want to get the icon for the placemark list, false to get the overlay image (transparent or see-through red for filled placemarks) + * @throws IOException In case the image icon cannot be open + * @throws URISyntaxException In case the image icon URL contains an error + */ + @GetMapping("/placemarkIconExtd") + public void getImageExt(HttpServletResponse response, HttpServletRequest request, @RequestParam(value = "id", required = false) String id, @RequestParam(value = "listView", required = false) Boolean listView) throws IOException, URISyntaxException { + String[] keys = id.split(","); + + if( listView == null ){ + throw new IllegalArgumentException("This servlet only responds to listView type of requests where the status icons for the placemarks are the expected result"); //$NON-NLS-1$ + } + + // If there is an exception while we get the record info (problem that might happen when using SQLite due to concurrency) return the yellow icon. + String imageName = EarthConstants.LIST_NOT_FINISHED_IMAGE; + try { + + final Map placemarkParameters = earthSurveyService.getPlacemark(keys,false); + + if (earthSurveyService.isPlacemarkSavedActively(placemarkParameters)) { + imageName = EarthConstants.LIST_FILLED_IMAGE; + } else if (earthSurveyService.isPlacemarkEdited(placemarkParameters)) { + imageName = EarthConstants.LIST_NOT_FINISHED_IMAGE; + } else { + imageName = EarthConstants.LIST_NON_FILLED_IMAGE; } - }catch(Exception e){ - logger.error("Error saving data" , e); + } catch (Exception e) { + loggerSlf4.error("Error loading image for placemark with ID " + ArrayUtils.toString( keys ) , e); //$NON-NLS-1$ + }finally{ + returnImage(response, imageName); } } + private byte[] readFile(String filePath) { + final File imageFile = new File(filePath); + return preloadedFilesService.getFileContent(imageFile); + } + + private void returnImage(HttpServletResponse response, String imageName) throws IOException { + response.setHeader("Content-Type", "image/png"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Content-Disposition", "inline; filename=\"" + imageName + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Date", new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH).format(new Date())); //$NON-NLS-1$ + + byte[] resultingImage = null; + if (imageName.equals(EarthConstants.LIST_NON_FILLED_IMAGE)) { + resultingImage = readFile(EarthConstants.LIST_NON_FILLED_IMAGE); + } else if (imageName.equals(EarthConstants.LIST_FILLED_IMAGE)) { + resultingImage = readFile(EarthConstants.LIST_FILLED_IMAGE); + } else if (imageName.equals(EarthConstants.LIST_NOT_FINISHED_IMAGE)) { + resultingImage = readFile(EarthConstants.LIST_NOT_FINISHED_IMAGE); + } + + if (resultingImage != null) { + response.setHeader("Content-Length", Integer.toString( resultingImage.length ) ); //$NON-NLS-1$ //$NON-NLS-2$ + writeToResponse(response, resultingImage); + } else { + getLogger().error("There was a problem fetching the image, please check the name!"); //$NON-NLS-1$ + } + } + + private void writeToResponse(HttpServletResponse response, byte[] fileContents) throws IOException { + ServletOutputStream outputStream = response.getOutputStream(); + try { + outputStream.write(fileContents); + outputStream.flush(); + } catch (final Exception e) { + getLogger().error("Error writing reponse body to output stream ", e); //$NON-NLS-1$ + } finally { + outputStream.close(); + } + } } From c9c2403d7a4b3fe3c33e36a432254979ff0f5e60 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:22 +0100 Subject: [PATCH 1049/1620] New translations PlacemarkInfoServlet.java (Spanish) --- .../earth/app/view/Messages_es.properties | 141 +++++------------- 1 file changed, 38 insertions(+), 103 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 3cc75d6710..0c1e208fbc 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,136 +1,71 @@ package org.openforis.collect.earth.app.server; -import java.io.File; import java.io.IOException; -import java.net.URISyntaxException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Locale; +import java.util.HashMap; import java.util.Map; -import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.apache.commons.lang3.ArrayUtils; import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.PreloadedFilesService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; /** - * Servlet used to obtain the right icon/ground-overlay for each placemark. - * These icons symbolize the status of a placemark ( a red exclamation if the placemark has not been filled, a yellow warning sign if the placemark is - * partially filled or a green tick if the placemark information has been successfully filled) + * Servlet to return the information that is stored in Collect Earth for one placemark (plot) * * @author Alfonso Sanchez-Paus Diaz * + * @deprecated Replaced by {@link PlacemarkDataController} */ +@Deprecated @Controller -public class PlacemarkImageServlet extends JsonPocessorServlet { +public class PlacemarkInfoServlet extends JsonPocessorServlet { - @Autowired - private EarthSurveyService earthSurveyService; - - @Autowired - private PreloadedFilesService preloadedFilesService; - - private Logger loggerSlf4 = LoggerFactory.getLogger( PlacemarkImageServlet.class ); - - /** - * Returns an icon/overlay image that represents the state of the placemark not-filled/filling/filled - * @param response The HTTP response object - * @param request The HTTP request object - * @param placemarkId The ID of the placemark for which we want to get the icon/overlay - * @param listView True if want to get the icon for the placemark list, false to get the overlay image (transparent or see-through red for filled placemarks) - * @throws IOException In case the image icon cannot be open - * @throws URISyntaxException In case the image icon URL contains an error - */ - @GetMapping("/placemarkIcon") - public void getImage(HttpServletResponse response, HttpServletRequest request, @RequestParam( EarthConstants.PLACEMARK_ID_PARAMETER ) String placemarkId, - @RequestParam(value = "listView", required = false) Boolean listView) throws IOException, URISyntaxException { - getImageExt(response, request, placemarkId, listView); - } /** - * Returns an icon/overlay image that represents the state of the placemark not-filled/filling/filled - * @param response The HTTP response object - * @param request The HTTP request object - * @param id The ID of the plot with separated by commas - * @param listView True if want to get the icon for the placemark list, false to get the overlay image (transparent or see-through red for filled placemarks) - * @throws IOException In case the image icon cannot be open - * @throws URISyntaxException In case the image icon URL contains an error + * Returns a JSON object with the data collected for a placemark in the collect-earth format. + * @param request The request sent from Google Earth pop-up to Collect Earth + * @param response The response to the Collect Earth request + * @throws IOException Throws exception if the response cannot be written to the channel */ - @GetMapping("/placemarkIconExtd") - public void getImageExt(HttpServletResponse response, HttpServletRequest request, @RequestParam(value = "id", required = false) String id, @RequestParam(value = "listView", required = false) Boolean listView) throws IOException, URISyntaxException { - String[] keys = id.split(","); - - if( listView == null ){ - throw new IllegalArgumentException("This servlet only responds to listView type of requests where the status icons for the placemarks are the expected result"); //$NON-NLS-1$ - } - - // If there is an exception while we get the record info (problem that might happen when using SQLite due to concurrency) return the yellow icon. - String imageName = EarthConstants.LIST_NOT_FINISHED_IMAGE; - try { - - final Map placemarkParameters = earthSurveyService.getPlacemark(keys,false); - - if (earthSurveyService.isPlacemarkSavedActively(placemarkParameters)) { - imageName = EarthConstants.LIST_FILLED_IMAGE; - } else if (earthSurveyService.isPlacemarkEdited(placemarkParameters)) { - imageName = EarthConstants.LIST_NOT_FINISHED_IMAGE; + @GetMapping("/placemarkInfo") + public void placemarkInfoOld(HttpServletRequest request, HttpServletResponse response) throws IOException { + Map collectedData = extractRequestData(request); + String placemarkId = getPlacemarkId(collectedData); + + if (placemarkId == null) { + setResult(false, "No placemark ID found in the request", collectedData); //$NON-NLS-1$ + getLogger().error("No placemark ID found in the received request"); //$NON-NLS-1$ + } else { + placemarkId = replacePlacemarkIdTestValue(placemarkId); + collectedData = getDataAccessor().getData(placemarkId); + if (collectedData != null && collectedData.get(EarthConstants.PLACEMARK_FOUND_PARAMETER) != null + && collectedData.get(EarthConstants.PLACEMARK_FOUND_PARAMETER).equals("true")) { //$NON-NLS-1$ + setResult(true, "The placemark was found", collectedData); //$NON-NLS-1$ + getLogger().info("A placemark was found with these properties {}", collectedData ); //$NON-NLS-1$ } else { - imageName = EarthConstants.LIST_NON_FILLED_IMAGE; + if (collectedData == null) { + collectedData = new HashMap<>(); + } + setResult(false, "No placemark found", collectedData); //$NON-NLS-1$ + getLogger().info("No placemark found {}", collectedData ); //$NON-NLS-1$ } - } catch (Exception e) { - loggerSlf4.error("Error loading image for placemark with ID " + ArrayUtils.toString( keys ) , e); //$NON-NLS-1$ - }finally{ - returnImage(response, imageName); } - } - - private byte[] readFile(String filePath) { - final File imageFile = new File(filePath); - return preloadedFilesService.getFileContent(imageFile); - } - private void returnImage(HttpServletResponse response, String imageName) throws IOException { - response.setHeader("Content-Type", "image/png"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Content-Disposition", "inline; filename=\"" + imageName + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Date", new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH).format(new Date())); //$NON-NLS-1$ + setJsonResponse(response, collectedData); - byte[] resultingImage = null; - if (imageName.equals(EarthConstants.LIST_NON_FILLED_IMAGE)) { - resultingImage = readFile(EarthConstants.LIST_NON_FILLED_IMAGE); - } else if (imageName.equals(EarthConstants.LIST_FILLED_IMAGE)) { - resultingImage = readFile(EarthConstants.LIST_FILLED_IMAGE); - } else if (imageName.equals(EarthConstants.LIST_NOT_FINISHED_IMAGE)) { - resultingImage = readFile(EarthConstants.LIST_NOT_FINISHED_IMAGE); - } + } - if (resultingImage != null) { - response.setHeader("Content-Length", Integer.toString( resultingImage.length ) ); //$NON-NLS-1$ //$NON-NLS-2$ - writeToResponse(response, resultingImage); - } else { - getLogger().error("There was a problem fetching the image, please check the name!"); //$NON-NLS-1$ - } + private String getPlacemarkId(Map collectedData) { + return collectedData.get(EarthConstants.PLACEMARK_ID_PARAMETER); } - private void writeToResponse(HttpServletResponse response, byte[] fileContents) throws IOException { - ServletOutputStream outputStream = response.getOutputStream(); - try { - outputStream.write(fileContents); - outputStream.flush(); - } catch (final Exception e) { - getLogger().error("Error writing reponse body to output stream ", e); //$NON-NLS-1$ - } finally { - outputStream.close(); + private String replacePlacemarkIdTestValue(String placemarkId) { + if (placemarkId.equals("$[id]")) { //$NON-NLS-1$ + placemarkId = "testPlacemark"; //$NON-NLS-1$ } + return placemarkId; } + } From 1878d54c99c4b03df50034646cbe45a246daec3a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:23 +0100 Subject: [PATCH 1050/1620] New translations SaveEarthDataServlet.java (French) --- .../earth/app/view/Messages_fr.properties | 147 ++++++------------ 1 file changed, 49 insertions(+), 98 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 3cc75d6710..b23ed83438 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,136 +1,87 @@ package org.openforis.collect.earth.app.server; -import java.io.File; import java.io.IOException; -import java.net.URISyntaxException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Locale; import java.util.Map; -import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.apache.commons.lang3.ArrayUtils; import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.PreloadedFilesService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.view.Messages; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; /** - * Servlet used to obtain the right icon/ground-overlay for each placemark. - * These icons symbolize the status of a placemark ( a red exclamation if the placemark has not been filled, a yellow warning sign if the placemark is - * partially filled or a green tick if the placemark information has been successfully filled) - * + * Servlet called for updating/saving the information about a placemark. Called from the form in Google Earth when the user interacts with it or clicks the save button. * @author Alfonso Sanchez-Paus Diaz * + * @deprecated Replaced by {@link PlacemarkDataController} + * */ +@Deprecated @Controller -public class PlacemarkImageServlet extends JsonPocessorServlet { +public class SaveEarthDataServlet extends JsonPocessorServlet { @Autowired - private EarthSurveyService earthSurveyService; + LocalPropertiesService localPropertiesService; - @Autowired - private PreloadedFilesService preloadedFilesService; + //@Autowired + //CollectDesignerController collectDesignerController; - private Logger loggerSlf4 = LoggerFactory.getLogger( PlacemarkImageServlet.class ); - /** - * Returns an icon/overlay image that represents the state of the placemark not-filled/filling/filled - * @param response The HTTP response object - * @param request The HTTP request object - * @param placemarkId The ID of the placemark for which we want to get the icon/overlay - * @param listView True if want to get the icon for the placemark list, false to get the overlay image (transparent or see-through red for filled placemarks) - * @throws IOException In case the image icon cannot be open - * @throws URISyntaxException In case the image icon URL contains an error - */ - @GetMapping("/placemarkIcon") - public void getImage(HttpServletResponse response, HttpServletRequest request, @RequestParam( EarthConstants.PLACEMARK_ID_PARAMETER ) String placemarkId, - @RequestParam(value = "listView", required = false) Boolean listView) throws IOException, URISyntaxException { - getImageExt(response, request, placemarkId, listView); - } - - /** - * Returns an icon/overlay image that represents the state of the placemark not-filled/filling/filled - * @param response The HTTP response object - * @param request The HTTP request object - * @param id The ID of the plot with separated by commas - * @param listView True if want to get the icon for the placemark list, false to get the overlay image (transparent or see-through red for filled placemarks) - * @throws IOException In case the image icon cannot be open - * @throws URISyntaxException In case the image icon URL contains an error - */ - @GetMapping("/placemarkIconExtd") - public void getImageExt(HttpServletResponse response, HttpServletRequest request, @RequestParam(value = "id", required = false) String id, @RequestParam(value = "listView", required = false) Boolean listView) throws IOException, URISyntaxException { - String[] keys = id.split(","); - - if( listView == null ){ - throw new IllegalArgumentException("This servlet only responds to listView type of requests where the status icons for the placemarks are the expected result"); //$NON-NLS-1$ - } + @Deprecated + @GetMapping("/saveData") + public void saveData(HttpServletRequest request, HttpServletResponse response) throws IOException { - // If there is an exception while we get the record info (problem that might happen when using SQLite due to concurrency) return the yellow icon. - String imageName = EarthConstants.LIST_NOT_FINISHED_IMAGE; - try { + Map collectedData = extractRequestData(request); - final Map placemarkParameters = earthSurveyService.getPlacemark(keys,false); + replaceTestVariables(collectedData); - if (earthSurveyService.isPlacemarkSavedActively(placemarkParameters)) { - imageName = EarthConstants.LIST_FILLED_IMAGE; - } else if (earthSurveyService.isPlacemarkEdited(placemarkParameters)) { - imageName = EarthConstants.LIST_NOT_FINISHED_IMAGE; + if (collectedData.size() == 0) { + setResult(false, Messages.getString("SaveEarthDataServlet.0"), collectedData); //$NON-NLS-1$ + getLogger().info("The request was empty"); //$NON-NLS-1$ + } else { + if (getDataAccessor().saveData(collectedData)) { + setResult(true, Messages.getString("SaveEarthDataServlet.2"), collectedData); //$NON-NLS-1$ } else { - imageName = EarthConstants.LIST_NON_FILLED_IMAGE; + setResult(false, Messages.getString("SaveEarthDataServlet.1"), collectedData); //$NON-NLS-1$ + getLogger().error("The data could not be saved"); //$NON-NLS-1$ } - } catch (Exception e) { - loggerSlf4.error("Error loading image for placemark with ID " + ArrayUtils.toString( keys ) , e); //$NON-NLS-1$ - }finally{ - returnImage(response, imageName); } - } - private byte[] readFile(String filePath) { - final File imageFile = new File(filePath); - return preloadedFilesService.getFileContent(imageFile); + setJsonResponse(response, collectedData); } - private void returnImage(HttpServletResponse response, String imageName) throws IOException { - response.setHeader("Content-Type", "image/png"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Content-Disposition", "inline; filename=\"" + imageName + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Date", new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH).format(new Date())); //$NON-NLS-1$ - - byte[] resultingImage = null; - if (imageName.equals(EarthConstants.LIST_NON_FILLED_IMAGE)) { - resultingImage = readFile(EarthConstants.LIST_NON_FILLED_IMAGE); - } else if (imageName.equals(EarthConstants.LIST_FILLED_IMAGE)) { - resultingImage = readFile(EarthConstants.LIST_FILLED_IMAGE); - } else if (imageName.equals(EarthConstants.LIST_NOT_FINISHED_IMAGE)) { - resultingImage = readFile(EarthConstants.LIST_NOT_FINISHED_IMAGE); + /** + * This method replaces the variable values that the form contains when it is not run + * through Google Earth and the variable replacement of the ExtendedData of the KML does not kick in. + * + * @param collectedData + * The data POSTed by the form that has already been processed. + */ + private void replaceTestVariables(Map collectedData) { + // REMOVE THIS!!!! + if (collectedData.get(EarthConstants.PLACEMARK_ID_PARAMETER).equals("$[id]")) { //$NON-NLS-1$ //$NON-NLS-2$ + collectedData.put(EarthConstants.PLACEMARK_ID_PARAMETER, "testPlacemark"); //$NON-NLS-1$ //$NON-NLS-2$ } - if (resultingImage != null) { - response.setHeader("Content-Length", Integer.toString( resultingImage.length ) ); //$NON-NLS-1$ //$NON-NLS-2$ - writeToResponse(response, resultingImage); - } else { - getLogger().error("There was a problem fetching the image, please check the name!"); //$NON-NLS-1$ + if (collectedData.get("collect_integer_elevation") != null && collectedData.get("collect_integer_elevation").equals("$[elevation]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + collectedData.put("collect_integer_elevation", "0"); //$NON-NLS-1$ //$NON-NLS-2$ } - } - private void writeToResponse(HttpServletResponse response, byte[] fileContents) throws IOException { - ServletOutputStream outputStream = response.getOutputStream(); - try { - outputStream.write(fileContents); - outputStream.flush(); - } catch (final Exception e) { - getLogger().error("Error writing reponse body to output stream ", e); //$NON-NLS-1$ - } finally { - outputStream.close(); + if (collectedData.get("collect_real_slope") != null && collectedData.get("collect_real_slope").equals("$[slope]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + collectedData.put("collect_real_slope", "0"); //$NON-NLS-1$ //$NON-NLS-2$ + } + + if (collectedData.get("collect_real_aspect") != null && collectedData.get("collect_real_aspect").equals("$[aspect]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + collectedData.put("collect_real_aspect", "0"); //$NON-NLS-1$ //$NON-NLS-2$ + } + + if (collectedData.get("collect_coord_location").equals("$[latitude],$[longitude]")) { //$NON-NLS-1$ //$NON-NLS-2$ + collectedData.put("collect_coord_location", "0,0"); //$NON-NLS-1$ //$NON-NLS-2$ } } -} + +} \ No newline at end of file From d61f7cc3499925a2ddbf041eb5088cb32589b30a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:24 +0100 Subject: [PATCH 1051/1620] New translations PlacemarkInfoServlet.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 141 +++++------------- 1 file changed, 38 insertions(+), 103 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 3cc75d6710..0c1e208fbc 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,136 +1,71 @@ package org.openforis.collect.earth.app.server; -import java.io.File; import java.io.IOException; -import java.net.URISyntaxException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Locale; +import java.util.HashMap; import java.util.Map; -import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.apache.commons.lang3.ArrayUtils; import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.PreloadedFilesService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; /** - * Servlet used to obtain the right icon/ground-overlay for each placemark. - * These icons symbolize the status of a placemark ( a red exclamation if the placemark has not been filled, a yellow warning sign if the placemark is - * partially filled or a green tick if the placemark information has been successfully filled) + * Servlet to return the information that is stored in Collect Earth for one placemark (plot) * * @author Alfonso Sanchez-Paus Diaz * + * @deprecated Replaced by {@link PlacemarkDataController} */ +@Deprecated @Controller -public class PlacemarkImageServlet extends JsonPocessorServlet { +public class PlacemarkInfoServlet extends JsonPocessorServlet { - @Autowired - private EarthSurveyService earthSurveyService; - - @Autowired - private PreloadedFilesService preloadedFilesService; - - private Logger loggerSlf4 = LoggerFactory.getLogger( PlacemarkImageServlet.class ); - - /** - * Returns an icon/overlay image that represents the state of the placemark not-filled/filling/filled - * @param response The HTTP response object - * @param request The HTTP request object - * @param placemarkId The ID of the placemark for which we want to get the icon/overlay - * @param listView True if want to get the icon for the placemark list, false to get the overlay image (transparent or see-through red for filled placemarks) - * @throws IOException In case the image icon cannot be open - * @throws URISyntaxException In case the image icon URL contains an error - */ - @GetMapping("/placemarkIcon") - public void getImage(HttpServletResponse response, HttpServletRequest request, @RequestParam( EarthConstants.PLACEMARK_ID_PARAMETER ) String placemarkId, - @RequestParam(value = "listView", required = false) Boolean listView) throws IOException, URISyntaxException { - getImageExt(response, request, placemarkId, listView); - } /** - * Returns an icon/overlay image that represents the state of the placemark not-filled/filling/filled - * @param response The HTTP response object - * @param request The HTTP request object - * @param id The ID of the plot with separated by commas - * @param listView True if want to get the icon for the placemark list, false to get the overlay image (transparent or see-through red for filled placemarks) - * @throws IOException In case the image icon cannot be open - * @throws URISyntaxException In case the image icon URL contains an error + * Returns a JSON object with the data collected for a placemark in the collect-earth format. + * @param request The request sent from Google Earth pop-up to Collect Earth + * @param response The response to the Collect Earth request + * @throws IOException Throws exception if the response cannot be written to the channel */ - @GetMapping("/placemarkIconExtd") - public void getImageExt(HttpServletResponse response, HttpServletRequest request, @RequestParam(value = "id", required = false) String id, @RequestParam(value = "listView", required = false) Boolean listView) throws IOException, URISyntaxException { - String[] keys = id.split(","); - - if( listView == null ){ - throw new IllegalArgumentException("This servlet only responds to listView type of requests where the status icons for the placemarks are the expected result"); //$NON-NLS-1$ - } - - // If there is an exception while we get the record info (problem that might happen when using SQLite due to concurrency) return the yellow icon. - String imageName = EarthConstants.LIST_NOT_FINISHED_IMAGE; - try { - - final Map placemarkParameters = earthSurveyService.getPlacemark(keys,false); - - if (earthSurveyService.isPlacemarkSavedActively(placemarkParameters)) { - imageName = EarthConstants.LIST_FILLED_IMAGE; - } else if (earthSurveyService.isPlacemarkEdited(placemarkParameters)) { - imageName = EarthConstants.LIST_NOT_FINISHED_IMAGE; + @GetMapping("/placemarkInfo") + public void placemarkInfoOld(HttpServletRequest request, HttpServletResponse response) throws IOException { + Map collectedData = extractRequestData(request); + String placemarkId = getPlacemarkId(collectedData); + + if (placemarkId == null) { + setResult(false, "No placemark ID found in the request", collectedData); //$NON-NLS-1$ + getLogger().error("No placemark ID found in the received request"); //$NON-NLS-1$ + } else { + placemarkId = replacePlacemarkIdTestValue(placemarkId); + collectedData = getDataAccessor().getData(placemarkId); + if (collectedData != null && collectedData.get(EarthConstants.PLACEMARK_FOUND_PARAMETER) != null + && collectedData.get(EarthConstants.PLACEMARK_FOUND_PARAMETER).equals("true")) { //$NON-NLS-1$ + setResult(true, "The placemark was found", collectedData); //$NON-NLS-1$ + getLogger().info("A placemark was found with these properties {}", collectedData ); //$NON-NLS-1$ } else { - imageName = EarthConstants.LIST_NON_FILLED_IMAGE; + if (collectedData == null) { + collectedData = new HashMap<>(); + } + setResult(false, "No placemark found", collectedData); //$NON-NLS-1$ + getLogger().info("No placemark found {}", collectedData ); //$NON-NLS-1$ } - } catch (Exception e) { - loggerSlf4.error("Error loading image for placemark with ID " + ArrayUtils.toString( keys ) , e); //$NON-NLS-1$ - }finally{ - returnImage(response, imageName); } - } - - private byte[] readFile(String filePath) { - final File imageFile = new File(filePath); - return preloadedFilesService.getFileContent(imageFile); - } - private void returnImage(HttpServletResponse response, String imageName) throws IOException { - response.setHeader("Content-Type", "image/png"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Content-Disposition", "inline; filename=\"" + imageName + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Date", new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH).format(new Date())); //$NON-NLS-1$ + setJsonResponse(response, collectedData); - byte[] resultingImage = null; - if (imageName.equals(EarthConstants.LIST_NON_FILLED_IMAGE)) { - resultingImage = readFile(EarthConstants.LIST_NON_FILLED_IMAGE); - } else if (imageName.equals(EarthConstants.LIST_FILLED_IMAGE)) { - resultingImage = readFile(EarthConstants.LIST_FILLED_IMAGE); - } else if (imageName.equals(EarthConstants.LIST_NOT_FINISHED_IMAGE)) { - resultingImage = readFile(EarthConstants.LIST_NOT_FINISHED_IMAGE); - } + } - if (resultingImage != null) { - response.setHeader("Content-Length", Integer.toString( resultingImage.length ) ); //$NON-NLS-1$ //$NON-NLS-2$ - writeToResponse(response, resultingImage); - } else { - getLogger().error("There was a problem fetching the image, please check the name!"); //$NON-NLS-1$ - } + private String getPlacemarkId(Map collectedData) { + return collectedData.get(EarthConstants.PLACEMARK_ID_PARAMETER); } - private void writeToResponse(HttpServletResponse response, byte[] fileContents) throws IOException { - ServletOutputStream outputStream = response.getOutputStream(); - try { - outputStream.write(fileContents); - outputStream.flush(); - } catch (final Exception e) { - getLogger().error("Error writing reponse body to output stream ", e); //$NON-NLS-1$ - } finally { - outputStream.close(); + private String replacePlacemarkIdTestValue(String placemarkId) { + if (placemarkId.equals("$[id]")) { //$NON-NLS-1$ + placemarkId = "testPlacemark"; //$NON-NLS-1$ } + return placemarkId; } + } From 22667e58c13d13e66f1d99c51145b9df13101a89 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:25 +0100 Subject: [PATCH 1052/1620] New translations PlacemarkInfoServlet.java (English) --- .../earth/app/view/Messages_en.properties | 141 +++++------------- 1 file changed, 38 insertions(+), 103 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 3cc75d6710..0c1e208fbc 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,136 +1,71 @@ package org.openforis.collect.earth.app.server; -import java.io.File; import java.io.IOException; -import java.net.URISyntaxException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Locale; +import java.util.HashMap; import java.util.Map; -import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.apache.commons.lang3.ArrayUtils; import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.PreloadedFilesService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; /** - * Servlet used to obtain the right icon/ground-overlay for each placemark. - * These icons symbolize the status of a placemark ( a red exclamation if the placemark has not been filled, a yellow warning sign if the placemark is - * partially filled or a green tick if the placemark information has been successfully filled) + * Servlet to return the information that is stored in Collect Earth for one placemark (plot) * * @author Alfonso Sanchez-Paus Diaz * + * @deprecated Replaced by {@link PlacemarkDataController} */ +@Deprecated @Controller -public class PlacemarkImageServlet extends JsonPocessorServlet { +public class PlacemarkInfoServlet extends JsonPocessorServlet { - @Autowired - private EarthSurveyService earthSurveyService; - - @Autowired - private PreloadedFilesService preloadedFilesService; - - private Logger loggerSlf4 = LoggerFactory.getLogger( PlacemarkImageServlet.class ); - - /** - * Returns an icon/overlay image that represents the state of the placemark not-filled/filling/filled - * @param response The HTTP response object - * @param request The HTTP request object - * @param placemarkId The ID of the placemark for which we want to get the icon/overlay - * @param listView True if want to get the icon for the placemark list, false to get the overlay image (transparent or see-through red for filled placemarks) - * @throws IOException In case the image icon cannot be open - * @throws URISyntaxException In case the image icon URL contains an error - */ - @GetMapping("/placemarkIcon") - public void getImage(HttpServletResponse response, HttpServletRequest request, @RequestParam( EarthConstants.PLACEMARK_ID_PARAMETER ) String placemarkId, - @RequestParam(value = "listView", required = false) Boolean listView) throws IOException, URISyntaxException { - getImageExt(response, request, placemarkId, listView); - } /** - * Returns an icon/overlay image that represents the state of the placemark not-filled/filling/filled - * @param response The HTTP response object - * @param request The HTTP request object - * @param id The ID of the plot with separated by commas - * @param listView True if want to get the icon for the placemark list, false to get the overlay image (transparent or see-through red for filled placemarks) - * @throws IOException In case the image icon cannot be open - * @throws URISyntaxException In case the image icon URL contains an error + * Returns a JSON object with the data collected for a placemark in the collect-earth format. + * @param request The request sent from Google Earth pop-up to Collect Earth + * @param response The response to the Collect Earth request + * @throws IOException Throws exception if the response cannot be written to the channel */ - @GetMapping("/placemarkIconExtd") - public void getImageExt(HttpServletResponse response, HttpServletRequest request, @RequestParam(value = "id", required = false) String id, @RequestParam(value = "listView", required = false) Boolean listView) throws IOException, URISyntaxException { - String[] keys = id.split(","); - - if( listView == null ){ - throw new IllegalArgumentException("This servlet only responds to listView type of requests where the status icons for the placemarks are the expected result"); //$NON-NLS-1$ - } - - // If there is an exception while we get the record info (problem that might happen when using SQLite due to concurrency) return the yellow icon. - String imageName = EarthConstants.LIST_NOT_FINISHED_IMAGE; - try { - - final Map placemarkParameters = earthSurveyService.getPlacemark(keys,false); - - if (earthSurveyService.isPlacemarkSavedActively(placemarkParameters)) { - imageName = EarthConstants.LIST_FILLED_IMAGE; - } else if (earthSurveyService.isPlacemarkEdited(placemarkParameters)) { - imageName = EarthConstants.LIST_NOT_FINISHED_IMAGE; + @GetMapping("/placemarkInfo") + public void placemarkInfoOld(HttpServletRequest request, HttpServletResponse response) throws IOException { + Map collectedData = extractRequestData(request); + String placemarkId = getPlacemarkId(collectedData); + + if (placemarkId == null) { + setResult(false, "No placemark ID found in the request", collectedData); //$NON-NLS-1$ + getLogger().error("No placemark ID found in the received request"); //$NON-NLS-1$ + } else { + placemarkId = replacePlacemarkIdTestValue(placemarkId); + collectedData = getDataAccessor().getData(placemarkId); + if (collectedData != null && collectedData.get(EarthConstants.PLACEMARK_FOUND_PARAMETER) != null + && collectedData.get(EarthConstants.PLACEMARK_FOUND_PARAMETER).equals("true")) { //$NON-NLS-1$ + setResult(true, "The placemark was found", collectedData); //$NON-NLS-1$ + getLogger().info("A placemark was found with these properties {}", collectedData ); //$NON-NLS-1$ } else { - imageName = EarthConstants.LIST_NON_FILLED_IMAGE; + if (collectedData == null) { + collectedData = new HashMap<>(); + } + setResult(false, "No placemark found", collectedData); //$NON-NLS-1$ + getLogger().info("No placemark found {}", collectedData ); //$NON-NLS-1$ } - } catch (Exception e) { - loggerSlf4.error("Error loading image for placemark with ID " + ArrayUtils.toString( keys ) , e); //$NON-NLS-1$ - }finally{ - returnImage(response, imageName); } - } - - private byte[] readFile(String filePath) { - final File imageFile = new File(filePath); - return preloadedFilesService.getFileContent(imageFile); - } - private void returnImage(HttpServletResponse response, String imageName) throws IOException { - response.setHeader("Content-Type", "image/png"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Content-Disposition", "inline; filename=\"" + imageName + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Date", new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH).format(new Date())); //$NON-NLS-1$ + setJsonResponse(response, collectedData); - byte[] resultingImage = null; - if (imageName.equals(EarthConstants.LIST_NON_FILLED_IMAGE)) { - resultingImage = readFile(EarthConstants.LIST_NON_FILLED_IMAGE); - } else if (imageName.equals(EarthConstants.LIST_FILLED_IMAGE)) { - resultingImage = readFile(EarthConstants.LIST_FILLED_IMAGE); - } else if (imageName.equals(EarthConstants.LIST_NOT_FINISHED_IMAGE)) { - resultingImage = readFile(EarthConstants.LIST_NOT_FINISHED_IMAGE); - } + } - if (resultingImage != null) { - response.setHeader("Content-Length", Integer.toString( resultingImage.length ) ); //$NON-NLS-1$ //$NON-NLS-2$ - writeToResponse(response, resultingImage); - } else { - getLogger().error("There was a problem fetching the image, please check the name!"); //$NON-NLS-1$ - } + private String getPlacemarkId(Map collectedData) { + return collectedData.get(EarthConstants.PLACEMARK_ID_PARAMETER); } - private void writeToResponse(HttpServletResponse response, byte[] fileContents) throws IOException { - ServletOutputStream outputStream = response.getOutputStream(); - try { - outputStream.write(fileContents); - outputStream.flush(); - } catch (final Exception e) { - getLogger().error("Error writing reponse body to output stream ", e); //$NON-NLS-1$ - } finally { - outputStream.close(); + private String replacePlacemarkIdTestValue(String placemarkId) { + if (placemarkId.equals("$[id]")) { //$NON-NLS-1$ + placemarkId = "testPlacemark"; //$NON-NLS-1$ } + return placemarkId; } + } From 58dce8078cc17db7a7fd5c22ccc88d3d15d11e50 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:26 +0100 Subject: [PATCH 1053/1620] New translations PlacemarkPlanetImagery.java (French) --- .../earth/app/view/Messages_fr.properties | 113 ++++++++++-------- 1 file changed, 62 insertions(+), 51 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index b23ed83438..df62b703cb 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,87 +1,98 @@ package org.openforis.collect.earth.app.server; import java.io.IOException; -import java.util.Map; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.util.Date; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.openforis.collect.earth.app.EarthConstants; +import org.apache.commons.lang3.StringUtils; import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.view.Messages; +import org.openforis.collect.earth.planet.DateUtils; +import org.openforis.collect.earth.planet.PlanetImagery; +import org.openforis.collect.earth.planet.PlanetRequestParameters; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; /** - * Servlet called for updating/saving the information about a placemark. Called from the form in Google Earth when the user interacts with it or clicks the save button. - * @author Alfonso Sanchez-Paus Diaz + * Controller to load and store the information that is stored in Collect Earth + * for one placemark (plot) * - * @deprecated Replaced by {@link PlacemarkDataController} + * @author Alfonso Sanchez-Paus Diaz + * @author S. Ricci * */ -@Deprecated @Controller -public class SaveEarthDataServlet extends JsonPocessorServlet { +public class PlacemarkPlanetImagery extends JsonPocessorServlet { @Autowired LocalPropertiesService localPropertiesService; - //@Autowired - //CollectDesignerController collectDesignerController; + // 2015-07-17T10:50:18.650Z + private SimpleDateFormat planetDateFormat = new SimpleDateFormat("yyyy-MM-dd"); + + @PostMapping(value = "/planetTileUrl") + public void planetTileUrl(HttpServletRequest request, HttpServletResponse response) + throws IOException, ParseException { + PlanetRequestParameters params = getRequestParameters(request); - @Deprecated - @GetMapping("/saveData") - public void saveData(HttpServletRequest request, HttpServletResponse response) throws IOException { + PlanetImagery planetImagery = new PlanetImagery(localPropertiesService.getPlanetMapsKey()); + String tileUrl = planetImagery.getLayerUrl(params); - Map collectedData = extractRequestData(request); + setJsonResponse(response, tileUrl == null ? "" : tileUrl); + } - replaceTestVariables(collectedData); + private PlanetRequestParameters getRequestParameters(HttpServletRequest request) throws ParseException { + Date startDate = planetDateFormat.parse(request.getParameter("start")); + Date endDate = getEndDate(request, startDate); - if (collectedData.size() == 0) { - setResult(false, Messages.getString("SaveEarthDataServlet.0"), collectedData); //$NON-NLS-1$ - getLogger().info("The request was empty"); //$NON-NLS-1$ - } else { - if (getDataAccessor().saveData(collectedData)) { - setResult(true, Messages.getString("SaveEarthDataServlet.2"), collectedData); //$NON-NLS-1$ - } else { - setResult(false, Messages.getString("SaveEarthDataServlet.1"), collectedData); //$NON-NLS-1$ - getLogger().error("The data could not be saved"); //$NON-NLS-1$ - } - } + double[][][] coords = getCoordinates(request); + String[] itemTypeArray = getItemTypes(request); - setJsonResponse(response, collectedData); + return new PlanetRequestParameters(startDate, endDate, coords, itemTypeArray); } - /** - * This method replaces the variable values that the form contains when it is not run - * through Google Earth and the variable replacement of the ExtendedData of the KML does not kick in. - * - * @param collectedData - * The data POSTed by the form that has already been processed. - */ - private void replaceTestVariables(Map collectedData) { - // REMOVE THIS!!!! - if (collectedData.get(EarthConstants.PLACEMARK_ID_PARAMETER).equals("$[id]")) { //$NON-NLS-1$ //$NON-NLS-2$ - collectedData.put(EarthConstants.PLACEMARK_ID_PARAMETER, "testPlacemark"); //$NON-NLS-1$ //$NON-NLS-2$ - } + private double[][][] getCoordinates(HttpServletRequest request) { + Gson gson = new GsonBuilder().create(); + return gson.fromJson(request.getParameter("geometry"), double[][][].class); + } - if (collectedData.get("collect_integer_elevation") != null && collectedData.get("collect_integer_elevation").equals("$[elevation]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - collectedData.put("collect_integer_elevation", "0"); //$NON-NLS-1$ //$NON-NLS-2$ + private String[] getItemTypes(HttpServletRequest request) { + String[] itemTypeArray = request.getParameterMap().get("itemTypes[]"); + if (itemTypeArray == null || itemTypeArray.length == 0) { + itemTypeArray = new String[] { "PSScene3Band", "PSScene4Band" }; } + return itemTypeArray; + } - if (collectedData.get("collect_real_slope") != null && collectedData.get("collect_real_slope").equals("$[slope]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - collectedData.put("collect_real_slope", "0"); //$NON-NLS-1$ //$NON-NLS-2$ + private Date getEndDate(HttpServletRequest request, Date startDate) throws ParseException { + String endDateString = request.getParameter("end"); + Date endDate = null; + if (StringUtils.isNotBlank(endDateString)) { + endDate = planetDateFormat.parse(endDateString); + } else { + LocalDateTime localDateTime = DateUtils.asLocalDateTime(startDate); + endDate = DateUtils.asDate(localDateTime.plusDays(30)); } + return endDate; + } - if (collectedData.get("collect_real_aspect") != null && collectedData.get("collect_real_aspect").equals("$[aspect]")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - collectedData.put("collect_real_aspect", "0"); //$NON-NLS-1$ //$NON-NLS-2$ - } + @PostMapping(value = "/planetAvailableImagery") + public void planetAvailableImagery(HttpServletRequest request, HttpServletResponse response) + throws IOException, ParseException { - if (collectedData.get("collect_coord_location").equals("$[latitude],$[longitude]")) { //$NON-NLS-1$ //$NON-NLS-2$ - collectedData.put("collect_coord_location", "0,0"); //$NON-NLS-1$ //$NON-NLS-2$ - } + PlanetRequestParameters params = getRequestParameters(request); + + PlanetImagery planetImagery = new PlanetImagery(localPropertiesService.getPlanetMapsKey()); + setJsonResponse(response, planetImagery.getAvailableDates(params)); } -} \ No newline at end of file +} From ca57749cadf141dce3117ef5e6948fb50155632d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:27 +0100 Subject: [PATCH 1054/1620] New translations PlacemarkPlanetImagery.java (Spanish) --- .../earth/app/view/Messages_es.properties | 119 +++++++++++------- 1 file changed, 73 insertions(+), 46 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 0c1e208fbc..df62b703cb 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,71 +1,98 @@ package org.openforis.collect.earth.app.server; import java.io.IOException; -import java.util.HashMap; -import java.util.Map; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.util.Date; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.openforis.collect.earth.app.EarthConstants; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.planet.DateUtils; +import org.openforis.collect.earth.planet.PlanetImagery; +import org.openforis.collect.earth.planet.PlanetRequestParameters; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; /** - * Servlet to return the information that is stored in Collect Earth for one placemark (plot) + * Controller to load and store the information that is stored in Collect Earth + * for one placemark (plot) * * @author Alfonso Sanchez-Paus Diaz + * @author S. Ricci * - * @deprecated Replaced by {@link PlacemarkDataController} */ -@Deprecated @Controller -public class PlacemarkInfoServlet extends JsonPocessorServlet { - - - /** - * Returns a JSON object with the data collected for a placemark in the collect-earth format. - * @param request The request sent from Google Earth pop-up to Collect Earth - * @param response The response to the Collect Earth request - * @throws IOException Throws exception if the response cannot be written to the channel - */ - @GetMapping("/placemarkInfo") - public void placemarkInfoOld(HttpServletRequest request, HttpServletResponse response) throws IOException { - Map collectedData = extractRequestData(request); - String placemarkId = getPlacemarkId(collectedData); - - if (placemarkId == null) { - setResult(false, "No placemark ID found in the request", collectedData); //$NON-NLS-1$ - getLogger().error("No placemark ID found in the received request"); //$NON-NLS-1$ - } else { - placemarkId = replacePlacemarkIdTestValue(placemarkId); - collectedData = getDataAccessor().getData(placemarkId); - if (collectedData != null && collectedData.get(EarthConstants.PLACEMARK_FOUND_PARAMETER) != null - && collectedData.get(EarthConstants.PLACEMARK_FOUND_PARAMETER).equals("true")) { //$NON-NLS-1$ - setResult(true, "The placemark was found", collectedData); //$NON-NLS-1$ - getLogger().info("A placemark was found with these properties {}", collectedData ); //$NON-NLS-1$ - } else { - if (collectedData == null) { - collectedData = new HashMap<>(); - } - setResult(false, "No placemark found", collectedData); //$NON-NLS-1$ - getLogger().info("No placemark found {}", collectedData ); //$NON-NLS-1$ - } - } +public class PlacemarkPlanetImagery extends JsonPocessorServlet { + + @Autowired + LocalPropertiesService localPropertiesService; + + // 2015-07-17T10:50:18.650Z + private SimpleDateFormat planetDateFormat = new SimpleDateFormat("yyyy-MM-dd"); - setJsonResponse(response, collectedData); + @PostMapping(value = "/planetTileUrl") + public void planetTileUrl(HttpServletRequest request, HttpServletResponse response) + throws IOException, ParseException { + PlanetRequestParameters params = getRequestParameters(request); + + PlanetImagery planetImagery = new PlanetImagery(localPropertiesService.getPlanetMapsKey()); + String tileUrl = planetImagery.getLayerUrl(params); + + setJsonResponse(response, tileUrl == null ? "" : tileUrl); } - private String getPlacemarkId(Map collectedData) { - return collectedData.get(EarthConstants.PLACEMARK_ID_PARAMETER); + private PlanetRequestParameters getRequestParameters(HttpServletRequest request) throws ParseException { + Date startDate = planetDateFormat.parse(request.getParameter("start")); + Date endDate = getEndDate(request, startDate); + + double[][][] coords = getCoordinates(request); + String[] itemTypeArray = getItemTypes(request); + + return new PlanetRequestParameters(startDate, endDate, coords, itemTypeArray); } - private String replacePlacemarkIdTestValue(String placemarkId) { - if (placemarkId.equals("$[id]")) { //$NON-NLS-1$ - placemarkId = "testPlacemark"; //$NON-NLS-1$ + private double[][][] getCoordinates(HttpServletRequest request) { + Gson gson = new GsonBuilder().create(); + return gson.fromJson(request.getParameter("geometry"), double[][][].class); + } + + private String[] getItemTypes(HttpServletRequest request) { + String[] itemTypeArray = request.getParameterMap().get("itemTypes[]"); + if (itemTypeArray == null || itemTypeArray.length == 0) { + itemTypeArray = new String[] { "PSScene3Band", "PSScene4Band" }; + } + return itemTypeArray; + } + + private Date getEndDate(HttpServletRequest request, Date startDate) throws ParseException { + String endDateString = request.getParameter("end"); + Date endDate = null; + if (StringUtils.isNotBlank(endDateString)) { + endDate = planetDateFormat.parse(endDateString); + } else { + LocalDateTime localDateTime = DateUtils.asLocalDateTime(startDate); + endDate = DateUtils.asDate(localDateTime.plusDays(30)); } - return placemarkId; + return endDate; + } + + @PostMapping(value = "/planetAvailableImagery") + public void planetAvailableImagery(HttpServletRequest request, HttpServletResponse response) + throws IOException, ParseException { + + PlanetRequestParameters params = getRequestParameters(request); + + PlanetImagery planetImagery = new PlanetImagery(localPropertiesService.getPlanetMapsKey()); + setJsonResponse(response, planetImagery.getAvailableDates(params)); } } From 308af0f757d9cb3ffbb8a5a00b3cf0a0812de5ba Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:28 +0100 Subject: [PATCH 1055/1620] New translations PlacemarkPlanetImagery.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 119 +++++++++++------- 1 file changed, 73 insertions(+), 46 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 0c1e208fbc..df62b703cb 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,71 +1,98 @@ package org.openforis.collect.earth.app.server; import java.io.IOException; -import java.util.HashMap; -import java.util.Map; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.util.Date; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.openforis.collect.earth.app.EarthConstants; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.planet.DateUtils; +import org.openforis.collect.earth.planet.PlanetImagery; +import org.openforis.collect.earth.planet.PlanetRequestParameters; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; /** - * Servlet to return the information that is stored in Collect Earth for one placemark (plot) + * Controller to load and store the information that is stored in Collect Earth + * for one placemark (plot) * * @author Alfonso Sanchez-Paus Diaz + * @author S. Ricci * - * @deprecated Replaced by {@link PlacemarkDataController} */ -@Deprecated @Controller -public class PlacemarkInfoServlet extends JsonPocessorServlet { - - - /** - * Returns a JSON object with the data collected for a placemark in the collect-earth format. - * @param request The request sent from Google Earth pop-up to Collect Earth - * @param response The response to the Collect Earth request - * @throws IOException Throws exception if the response cannot be written to the channel - */ - @GetMapping("/placemarkInfo") - public void placemarkInfoOld(HttpServletRequest request, HttpServletResponse response) throws IOException { - Map collectedData = extractRequestData(request); - String placemarkId = getPlacemarkId(collectedData); - - if (placemarkId == null) { - setResult(false, "No placemark ID found in the request", collectedData); //$NON-NLS-1$ - getLogger().error("No placemark ID found in the received request"); //$NON-NLS-1$ - } else { - placemarkId = replacePlacemarkIdTestValue(placemarkId); - collectedData = getDataAccessor().getData(placemarkId); - if (collectedData != null && collectedData.get(EarthConstants.PLACEMARK_FOUND_PARAMETER) != null - && collectedData.get(EarthConstants.PLACEMARK_FOUND_PARAMETER).equals("true")) { //$NON-NLS-1$ - setResult(true, "The placemark was found", collectedData); //$NON-NLS-1$ - getLogger().info("A placemark was found with these properties {}", collectedData ); //$NON-NLS-1$ - } else { - if (collectedData == null) { - collectedData = new HashMap<>(); - } - setResult(false, "No placemark found", collectedData); //$NON-NLS-1$ - getLogger().info("No placemark found {}", collectedData ); //$NON-NLS-1$ - } - } +public class PlacemarkPlanetImagery extends JsonPocessorServlet { + + @Autowired + LocalPropertiesService localPropertiesService; + + // 2015-07-17T10:50:18.650Z + private SimpleDateFormat planetDateFormat = new SimpleDateFormat("yyyy-MM-dd"); - setJsonResponse(response, collectedData); + @PostMapping(value = "/planetTileUrl") + public void planetTileUrl(HttpServletRequest request, HttpServletResponse response) + throws IOException, ParseException { + PlanetRequestParameters params = getRequestParameters(request); + + PlanetImagery planetImagery = new PlanetImagery(localPropertiesService.getPlanetMapsKey()); + String tileUrl = planetImagery.getLayerUrl(params); + + setJsonResponse(response, tileUrl == null ? "" : tileUrl); } - private String getPlacemarkId(Map collectedData) { - return collectedData.get(EarthConstants.PLACEMARK_ID_PARAMETER); + private PlanetRequestParameters getRequestParameters(HttpServletRequest request) throws ParseException { + Date startDate = planetDateFormat.parse(request.getParameter("start")); + Date endDate = getEndDate(request, startDate); + + double[][][] coords = getCoordinates(request); + String[] itemTypeArray = getItemTypes(request); + + return new PlanetRequestParameters(startDate, endDate, coords, itemTypeArray); } - private String replacePlacemarkIdTestValue(String placemarkId) { - if (placemarkId.equals("$[id]")) { //$NON-NLS-1$ - placemarkId = "testPlacemark"; //$NON-NLS-1$ + private double[][][] getCoordinates(HttpServletRequest request) { + Gson gson = new GsonBuilder().create(); + return gson.fromJson(request.getParameter("geometry"), double[][][].class); + } + + private String[] getItemTypes(HttpServletRequest request) { + String[] itemTypeArray = request.getParameterMap().get("itemTypes[]"); + if (itemTypeArray == null || itemTypeArray.length == 0) { + itemTypeArray = new String[] { "PSScene3Band", "PSScene4Band" }; + } + return itemTypeArray; + } + + private Date getEndDate(HttpServletRequest request, Date startDate) throws ParseException { + String endDateString = request.getParameter("end"); + Date endDate = null; + if (StringUtils.isNotBlank(endDateString)) { + endDate = planetDateFormat.parse(endDateString); + } else { + LocalDateTime localDateTime = DateUtils.asLocalDateTime(startDate); + endDate = DateUtils.asDate(localDateTime.plusDays(30)); } - return placemarkId; + return endDate; + } + + @PostMapping(value = "/planetAvailableImagery") + public void planetAvailableImagery(HttpServletRequest request, HttpServletResponse response) + throws IOException, ParseException { + + PlanetRequestParameters params = getRequestParameters(request); + + PlanetImagery planetImagery = new PlanetImagery(localPropertiesService.getPlanetMapsKey()); + setJsonResponse(response, planetImagery.getAvailableDates(params)); } } From a97fd6af53cff5fec872654ac93bf3c0f360e59e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:29 +0100 Subject: [PATCH 1056/1620] New translations PlacemarkPlanetImagery.java (English) --- .../earth/app/view/Messages_en.properties | 119 +++++++++++------- 1 file changed, 73 insertions(+), 46 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 0c1e208fbc..df62b703cb 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,71 +1,98 @@ package org.openforis.collect.earth.app.server; import java.io.IOException; -import java.util.HashMap; -import java.util.Map; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.util.Date; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.openforis.collect.earth.app.EarthConstants; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.planet.DateUtils; +import org.openforis.collect.earth.planet.PlanetImagery; +import org.openforis.collect.earth.planet.PlanetRequestParameters; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; /** - * Servlet to return the information that is stored in Collect Earth for one placemark (plot) + * Controller to load and store the information that is stored in Collect Earth + * for one placemark (plot) * * @author Alfonso Sanchez-Paus Diaz + * @author S. Ricci * - * @deprecated Replaced by {@link PlacemarkDataController} */ -@Deprecated @Controller -public class PlacemarkInfoServlet extends JsonPocessorServlet { - - - /** - * Returns a JSON object with the data collected for a placemark in the collect-earth format. - * @param request The request sent from Google Earth pop-up to Collect Earth - * @param response The response to the Collect Earth request - * @throws IOException Throws exception if the response cannot be written to the channel - */ - @GetMapping("/placemarkInfo") - public void placemarkInfoOld(HttpServletRequest request, HttpServletResponse response) throws IOException { - Map collectedData = extractRequestData(request); - String placemarkId = getPlacemarkId(collectedData); - - if (placemarkId == null) { - setResult(false, "No placemark ID found in the request", collectedData); //$NON-NLS-1$ - getLogger().error("No placemark ID found in the received request"); //$NON-NLS-1$ - } else { - placemarkId = replacePlacemarkIdTestValue(placemarkId); - collectedData = getDataAccessor().getData(placemarkId); - if (collectedData != null && collectedData.get(EarthConstants.PLACEMARK_FOUND_PARAMETER) != null - && collectedData.get(EarthConstants.PLACEMARK_FOUND_PARAMETER).equals("true")) { //$NON-NLS-1$ - setResult(true, "The placemark was found", collectedData); //$NON-NLS-1$ - getLogger().info("A placemark was found with these properties {}", collectedData ); //$NON-NLS-1$ - } else { - if (collectedData == null) { - collectedData = new HashMap<>(); - } - setResult(false, "No placemark found", collectedData); //$NON-NLS-1$ - getLogger().info("No placemark found {}", collectedData ); //$NON-NLS-1$ - } - } +public class PlacemarkPlanetImagery extends JsonPocessorServlet { + + @Autowired + LocalPropertiesService localPropertiesService; + + // 2015-07-17T10:50:18.650Z + private SimpleDateFormat planetDateFormat = new SimpleDateFormat("yyyy-MM-dd"); - setJsonResponse(response, collectedData); + @PostMapping(value = "/planetTileUrl") + public void planetTileUrl(HttpServletRequest request, HttpServletResponse response) + throws IOException, ParseException { + PlanetRequestParameters params = getRequestParameters(request); + + PlanetImagery planetImagery = new PlanetImagery(localPropertiesService.getPlanetMapsKey()); + String tileUrl = planetImagery.getLayerUrl(params); + + setJsonResponse(response, tileUrl == null ? "" : tileUrl); } - private String getPlacemarkId(Map collectedData) { - return collectedData.get(EarthConstants.PLACEMARK_ID_PARAMETER); + private PlanetRequestParameters getRequestParameters(HttpServletRequest request) throws ParseException { + Date startDate = planetDateFormat.parse(request.getParameter("start")); + Date endDate = getEndDate(request, startDate); + + double[][][] coords = getCoordinates(request); + String[] itemTypeArray = getItemTypes(request); + + return new PlanetRequestParameters(startDate, endDate, coords, itemTypeArray); } - private String replacePlacemarkIdTestValue(String placemarkId) { - if (placemarkId.equals("$[id]")) { //$NON-NLS-1$ - placemarkId = "testPlacemark"; //$NON-NLS-1$ + private double[][][] getCoordinates(HttpServletRequest request) { + Gson gson = new GsonBuilder().create(); + return gson.fromJson(request.getParameter("geometry"), double[][][].class); + } + + private String[] getItemTypes(HttpServletRequest request) { + String[] itemTypeArray = request.getParameterMap().get("itemTypes[]"); + if (itemTypeArray == null || itemTypeArray.length == 0) { + itemTypeArray = new String[] { "PSScene3Band", "PSScene4Band" }; + } + return itemTypeArray; + } + + private Date getEndDate(HttpServletRequest request, Date startDate) throws ParseException { + String endDateString = request.getParameter("end"); + Date endDate = null; + if (StringUtils.isNotBlank(endDateString)) { + endDate = planetDateFormat.parse(endDateString); + } else { + LocalDateTime localDateTime = DateUtils.asLocalDateTime(startDate); + endDate = DateUtils.asDate(localDateTime.plusDays(30)); } - return placemarkId; + return endDate; + } + + @PostMapping(value = "/planetAvailableImagery") + public void planetAvailableImagery(HttpServletRequest request, HttpServletResponse response) + throws IOException, ParseException { + + PlanetRequestParameters params = getRequestParameters(request); + + PlanetImagery planetImagery = new PlanetImagery(localPropertiesService.getPlanetMapsKey()); + setJsonResponse(response, planetImagery.getAvailableDates(params)); } } From 70628db4823d76d74c7c00274082e4dde704397e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:30 +0100 Subject: [PATCH 1057/1620] New translations PlacemarkUpdateServlet.java (French) --- .../earth/app/view/Messages_fr.properties | 191 +++++++++++++----- 1 file changed, 137 insertions(+), 54 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index df62b703cb..3a7a63a8e1 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,98 +1,181 @@ package org.openforis.collect.earth.app.server; +import java.io.BufferedWriter; +import java.io.File; import java.io.IOException; +import java.io.StringWriter; +import java.io.UnsupportedEncodingException; +import java.io.Writer; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Calendar; import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; -import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.service.EarthSurveyService; import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.planet.DateUtils; -import org.openforis.collect.earth.planet.PlanetImagery; -import org.openforis.collect.earth.planet.PlanetRequestParameters; +import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; +import org.openforis.collect.model.CollectRecordSummary; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; +import freemarker.cache.FileTemplateLoader; +import freemarker.template.Configuration; +import freemarker.template.Template; +import freemarker.template.TemplateException; +import freemarker.template.Version; /** - * Controller to load and store the information that is stored in Collect Earth - * for one placemark (plot) + * Servlet called by the NetworkLink which tries to update the status of the placemark icons every few seconds. * * @author Alfonso Sanchez-Paus Diaz - * @author S. Ricci * */ @Controller -public class PlacemarkPlanetImagery extends JsonPocessorServlet { +public class PlacemarkUpdateServlet { + + private static final String STANDARD_KML_FOR_UPDATES_FILENAME = "updateIcons.fmt"; //$NON-NLS-1$ + private static final String GENERIC_KML_FOR_UPDATES = "resources/" + STANDARD_KML_FOR_UPDATES_FILENAME; //$NON-NLS-1$ + private final Logger logger = LoggerFactory.getLogger(PlacemarkUpdateServlet.class); @Autowired - LocalPropertiesService localPropertiesService; + private EarthSurveyService earthSurveyService; - // 2015-07-17T10:50:18.650Z - private SimpleDateFormat planetDateFormat = new SimpleDateFormat("yyyy-MM-dd"); + @Autowired + private LocalPropertiesService localPropertiesService; - @PostMapping(value = "/planetTileUrl") - public void planetTileUrl(HttpServletRequest request, HttpServletResponse response) - throws IOException, ParseException { + private final Configuration cfg = new Configuration( new Version("2.3.23")); - PlanetRequestParameters params = getRequestParameters(request); + private Template template; - PlanetImagery planetImagery = new PlanetImagery(localPropertiesService.getPlanetMapsKey()); - String tileUrl = planetImagery.getLayerUrl(params); - setJsonResponse(response, tileUrl == null ? "" : tileUrl); - } + private String getKmlFromTemplate( Map data) throws IOException { - private PlanetRequestParameters getRequestParameters(HttpServletRequest request) throws ParseException { - Date startDate = planetDateFormat.parse(request.getParameter("start")); - Date endDate = getEndDate(request, startDate); + intializeTemplate(); + // Console output + final StringWriter fw = new StringWriter(); + final Writer out = new BufferedWriter(fw); + try { + // Add date to avoid caching + template.process(data, out); + } catch (final TemplateException e) { + logger.error("Error when producing starter KML from template", e); //$NON-NLS-1$ + } finally { + out.flush(); + fw.close(); + } - double[][][] coords = getCoordinates(request); - String[] itemTypeArray = getItemTypes(request); + return fw.toString(); - return new PlanetRequestParameters(startDate, endDate, coords, itemTypeArray); } - private double[][][] getCoordinates(HttpServletRequest request) { - Gson gson = new GsonBuilder().create(); - return gson.fromJson(request.getParameter("geometry"), double[][][].class); - } + private void intializeTemplate() throws IOException { + if (template == null) { + + // first check if there is a custom update template included on the customization that can be used for the project + + String possibleUpdateKmlLocation = localPropertiesService.getProjectFolder() + File.separatorChar + STANDARD_KML_FOR_UPDATES_FILENAME; + File possibleKmlFile = new File( possibleUpdateKmlLocation ); - private String[] getItemTypes(HttpServletRequest request) { - String[] itemTypeArray = request.getParameterMap().get("itemTypes[]"); - if (itemTypeArray == null || itemTypeArray.length == 0) { - itemTypeArray = new String[] { "PSScene3Band", "PSScene4Band" }; + if( possibleKmlFile.exists() ){ + /* + * We need to create a new TemplateLoader and use it momentarily as by default the Template loader + * uses the basedir of the project which causes problems when loading file from outside the project folder + */ + cfg.setTemplateLoader( new FileTemplateLoader( new File( possibleKmlFile.getParent() ) ) ); + template = cfg.getTemplate( STANDARD_KML_FOR_UPDATES_FILENAME ); + + }else{ + // No specific updatekml template found on the project folder, fall back to the general one + // Load template from the resource folder + cfg.setTemplateLoader( new FileTemplateLoader( new File( "." ) ) ); + template = cfg.getTemplate(GENERIC_KML_FOR_UPDATES); + } } - return itemTypeArray; } - private Date getEndDate(HttpServletRequest request, Date startDate) throws ParseException { - String endDateString = request.getParameter("end"); - Date endDate = null; - if (StringUtils.isNotBlank(endDateString)) { - endDate = planetDateFormat.parse(endDateString); - } else { - LocalDateTime localDateTime = DateUtils.asLocalDateTime(startDate); - endDate = DateUtils.asDate(localDateTime.plusDays(30)); + + + /** + * Responds with KML code that causes the Google Earth placemark icon and overlay image to update is status ( filled/not-filled/partially-filled) + * + * @param response The HTTP response object + * @param lastUpdate The datetime when this servlet was last called by the Google Earth network link. + * The date that this request was last sent. This way we get the placemarks that have changed status since the last time this was + * checked. + */ + @GetMapping("/placemarkUpdate") + public void getUpdatePlacemark(HttpServletResponse response, @RequestParam(value = "lastUpdate", required = false) String lastUpdate) { + + try { + + final SimpleDateFormat dateFormat = new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH ); + Date lastUpdateDate = null; + if (lastUpdate != null && lastUpdate.length() > 0) { + lastUpdateDate = dateFormat.parse(lastUpdate); + }else{ + lastUpdateDate = getTwoMinutesAgo(); + } + + List lastUpdatedRecords = null; + try { + lastUpdatedRecords = earthSurveyService.getRecordSummariesSavedSince(lastUpdateDate); + } catch (Exception e) { + lastUpdatedRecords = new ArrayList<>(); + logger.error("Error fetching information about the records updated after : " + lastUpdateDate , e); //$NON-NLS-1$ + } + + final Map data = new HashMap<>(); + data.put("host", ServerController.getHostAddress(localPropertiesService.getHost(), localPropertiesService.getLocalPort())); //$NON-NLS-1$ + data.put("date", getUpdateFromDate(dateFormat) ); // Keep for historical reasons //$NON-NLS-1$ + data.put("lastUpdateDateTime", getUpdateFromDate(dateFormat) ); //$NON-NLS-1$ + data.put("uniqueId", FreemarkerTemplateUtils.randInt(10000, 5000000) ); //$NON-NLS-1$ + data.put("kmlGeneratedOn", localPropertiesService.getGeneratedOn()); //$NON-NLS-1$ + data.put("placemark_ids", earthSurveyService.getPlacemarksId(lastUpdatedRecords)); //$NON-NLS-1$ + + setKmlResponse(response, getKmlFromTemplate(data), dateFormat); + + } catch (final ParseException e) { + logger.error("Error in the lastUpdate date format : " + lastUpdate, e); //$NON-NLS-1$ + } catch (final Exception e) { + logger.error("Error generating the update KML.", e); //$NON-NLS-1$ } - return endDate; + } - @PostMapping(value = "/planetAvailableImagery") - public void planetAvailableImagery(HttpServletRequest request, HttpServletResponse response) - throws IOException, ParseException { + private String getUpdateFromDate(final SimpleDateFormat dateFormat) throws UnsupportedEncodingException { + Date twoMinutesAgo = getTwoMinutesAgo(); + return URLEncoder.encode(dateFormat.format(twoMinutesAgo), StandardCharsets.UTF_8.name() ); //$NON-NLS-1$ + } - PlanetRequestParameters params = getRequestParameters(request); + public Date getTwoMinutesAgo() { + Calendar cal = Calendar.getInstance(); + cal.add(Calendar.MINUTE, -2); + return cal.getTime(); + } - PlanetImagery planetImagery = new PlanetImagery(localPropertiesService.getPlanetMapsKey()); - setJsonResponse(response, planetImagery.getAvailableDates(params)); + private void setKmlResponse(HttpServletResponse response, String kmlCode, SimpleDateFormat dateFormat) throws IOException { + response.setHeader("Content-Type", "application/vnd.google-earth.kml+xml"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Date", dateFormat.format(new Date())); //$NON-NLS-1$ + response.setHeader("Content-Length", Integer.toString( kmlCode.getBytes( StandardCharsets.UTF_8 ).length ) ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + response.getOutputStream().write(kmlCode.getBytes( StandardCharsets.UTF_8 )); //$NON-NLS-1$ + response.getOutputStream().flush(); + response.getOutputStream().close(); } } From 35cb4c146cd58ca2be959e53a99dbcb91652475d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:32 +0100 Subject: [PATCH 1058/1620] New translations PlacemarkUpdateServlet.java (Spanish) --- .../earth/app/view/Messages_es.properties | 191 +++++++++++++----- 1 file changed, 137 insertions(+), 54 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index df62b703cb..3a7a63a8e1 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,98 +1,181 @@ package org.openforis.collect.earth.app.server; +import java.io.BufferedWriter; +import java.io.File; import java.io.IOException; +import java.io.StringWriter; +import java.io.UnsupportedEncodingException; +import java.io.Writer; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Calendar; import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; -import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.service.EarthSurveyService; import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.planet.DateUtils; -import org.openforis.collect.earth.planet.PlanetImagery; -import org.openforis.collect.earth.planet.PlanetRequestParameters; +import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; +import org.openforis.collect.model.CollectRecordSummary; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; +import freemarker.cache.FileTemplateLoader; +import freemarker.template.Configuration; +import freemarker.template.Template; +import freemarker.template.TemplateException; +import freemarker.template.Version; /** - * Controller to load and store the information that is stored in Collect Earth - * for one placemark (plot) + * Servlet called by the NetworkLink which tries to update the status of the placemark icons every few seconds. * * @author Alfonso Sanchez-Paus Diaz - * @author S. Ricci * */ @Controller -public class PlacemarkPlanetImagery extends JsonPocessorServlet { +public class PlacemarkUpdateServlet { + + private static final String STANDARD_KML_FOR_UPDATES_FILENAME = "updateIcons.fmt"; //$NON-NLS-1$ + private static final String GENERIC_KML_FOR_UPDATES = "resources/" + STANDARD_KML_FOR_UPDATES_FILENAME; //$NON-NLS-1$ + private final Logger logger = LoggerFactory.getLogger(PlacemarkUpdateServlet.class); @Autowired - LocalPropertiesService localPropertiesService; + private EarthSurveyService earthSurveyService; - // 2015-07-17T10:50:18.650Z - private SimpleDateFormat planetDateFormat = new SimpleDateFormat("yyyy-MM-dd"); + @Autowired + private LocalPropertiesService localPropertiesService; - @PostMapping(value = "/planetTileUrl") - public void planetTileUrl(HttpServletRequest request, HttpServletResponse response) - throws IOException, ParseException { + private final Configuration cfg = new Configuration( new Version("2.3.23")); - PlanetRequestParameters params = getRequestParameters(request); + private Template template; - PlanetImagery planetImagery = new PlanetImagery(localPropertiesService.getPlanetMapsKey()); - String tileUrl = planetImagery.getLayerUrl(params); - setJsonResponse(response, tileUrl == null ? "" : tileUrl); - } + private String getKmlFromTemplate( Map data) throws IOException { - private PlanetRequestParameters getRequestParameters(HttpServletRequest request) throws ParseException { - Date startDate = planetDateFormat.parse(request.getParameter("start")); - Date endDate = getEndDate(request, startDate); + intializeTemplate(); + // Console output + final StringWriter fw = new StringWriter(); + final Writer out = new BufferedWriter(fw); + try { + // Add date to avoid caching + template.process(data, out); + } catch (final TemplateException e) { + logger.error("Error when producing starter KML from template", e); //$NON-NLS-1$ + } finally { + out.flush(); + fw.close(); + } - double[][][] coords = getCoordinates(request); - String[] itemTypeArray = getItemTypes(request); + return fw.toString(); - return new PlanetRequestParameters(startDate, endDate, coords, itemTypeArray); } - private double[][][] getCoordinates(HttpServletRequest request) { - Gson gson = new GsonBuilder().create(); - return gson.fromJson(request.getParameter("geometry"), double[][][].class); - } + private void intializeTemplate() throws IOException { + if (template == null) { + + // first check if there is a custom update template included on the customization that can be used for the project + + String possibleUpdateKmlLocation = localPropertiesService.getProjectFolder() + File.separatorChar + STANDARD_KML_FOR_UPDATES_FILENAME; + File possibleKmlFile = new File( possibleUpdateKmlLocation ); - private String[] getItemTypes(HttpServletRequest request) { - String[] itemTypeArray = request.getParameterMap().get("itemTypes[]"); - if (itemTypeArray == null || itemTypeArray.length == 0) { - itemTypeArray = new String[] { "PSScene3Band", "PSScene4Band" }; + if( possibleKmlFile.exists() ){ + /* + * We need to create a new TemplateLoader and use it momentarily as by default the Template loader + * uses the basedir of the project which causes problems when loading file from outside the project folder + */ + cfg.setTemplateLoader( new FileTemplateLoader( new File( possibleKmlFile.getParent() ) ) ); + template = cfg.getTemplate( STANDARD_KML_FOR_UPDATES_FILENAME ); + + }else{ + // No specific updatekml template found on the project folder, fall back to the general one + // Load template from the resource folder + cfg.setTemplateLoader( new FileTemplateLoader( new File( "." ) ) ); + template = cfg.getTemplate(GENERIC_KML_FOR_UPDATES); + } } - return itemTypeArray; } - private Date getEndDate(HttpServletRequest request, Date startDate) throws ParseException { - String endDateString = request.getParameter("end"); - Date endDate = null; - if (StringUtils.isNotBlank(endDateString)) { - endDate = planetDateFormat.parse(endDateString); - } else { - LocalDateTime localDateTime = DateUtils.asLocalDateTime(startDate); - endDate = DateUtils.asDate(localDateTime.plusDays(30)); + + + /** + * Responds with KML code that causes the Google Earth placemark icon and overlay image to update is status ( filled/not-filled/partially-filled) + * + * @param response The HTTP response object + * @param lastUpdate The datetime when this servlet was last called by the Google Earth network link. + * The date that this request was last sent. This way we get the placemarks that have changed status since the last time this was + * checked. + */ + @GetMapping("/placemarkUpdate") + public void getUpdatePlacemark(HttpServletResponse response, @RequestParam(value = "lastUpdate", required = false) String lastUpdate) { + + try { + + final SimpleDateFormat dateFormat = new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH ); + Date lastUpdateDate = null; + if (lastUpdate != null && lastUpdate.length() > 0) { + lastUpdateDate = dateFormat.parse(lastUpdate); + }else{ + lastUpdateDate = getTwoMinutesAgo(); + } + + List lastUpdatedRecords = null; + try { + lastUpdatedRecords = earthSurveyService.getRecordSummariesSavedSince(lastUpdateDate); + } catch (Exception e) { + lastUpdatedRecords = new ArrayList<>(); + logger.error("Error fetching information about the records updated after : " + lastUpdateDate , e); //$NON-NLS-1$ + } + + final Map data = new HashMap<>(); + data.put("host", ServerController.getHostAddress(localPropertiesService.getHost(), localPropertiesService.getLocalPort())); //$NON-NLS-1$ + data.put("date", getUpdateFromDate(dateFormat) ); // Keep for historical reasons //$NON-NLS-1$ + data.put("lastUpdateDateTime", getUpdateFromDate(dateFormat) ); //$NON-NLS-1$ + data.put("uniqueId", FreemarkerTemplateUtils.randInt(10000, 5000000) ); //$NON-NLS-1$ + data.put("kmlGeneratedOn", localPropertiesService.getGeneratedOn()); //$NON-NLS-1$ + data.put("placemark_ids", earthSurveyService.getPlacemarksId(lastUpdatedRecords)); //$NON-NLS-1$ + + setKmlResponse(response, getKmlFromTemplate(data), dateFormat); + + } catch (final ParseException e) { + logger.error("Error in the lastUpdate date format : " + lastUpdate, e); //$NON-NLS-1$ + } catch (final Exception e) { + logger.error("Error generating the update KML.", e); //$NON-NLS-1$ } - return endDate; + } - @PostMapping(value = "/planetAvailableImagery") - public void planetAvailableImagery(HttpServletRequest request, HttpServletResponse response) - throws IOException, ParseException { + private String getUpdateFromDate(final SimpleDateFormat dateFormat) throws UnsupportedEncodingException { + Date twoMinutesAgo = getTwoMinutesAgo(); + return URLEncoder.encode(dateFormat.format(twoMinutesAgo), StandardCharsets.UTF_8.name() ); //$NON-NLS-1$ + } - PlanetRequestParameters params = getRequestParameters(request); + public Date getTwoMinutesAgo() { + Calendar cal = Calendar.getInstance(); + cal.add(Calendar.MINUTE, -2); + return cal.getTime(); + } - PlanetImagery planetImagery = new PlanetImagery(localPropertiesService.getPlanetMapsKey()); - setJsonResponse(response, planetImagery.getAvailableDates(params)); + private void setKmlResponse(HttpServletResponse response, String kmlCode, SimpleDateFormat dateFormat) throws IOException { + response.setHeader("Content-Type", "application/vnd.google-earth.kml+xml"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Date", dateFormat.format(new Date())); //$NON-NLS-1$ + response.setHeader("Content-Length", Integer.toString( kmlCode.getBytes( StandardCharsets.UTF_8 ).length ) ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + response.getOutputStream().write(kmlCode.getBytes( StandardCharsets.UTF_8 )); //$NON-NLS-1$ + response.getOutputStream().flush(); + response.getOutputStream().close(); } } From 76576d79068615eaf22f2c59ed4bdc634ad7640f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:33 +0100 Subject: [PATCH 1059/1620] New translations PlacemarkUpdateServlet.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 191 +++++++++++++----- 1 file changed, 137 insertions(+), 54 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index df62b703cb..3a7a63a8e1 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,98 +1,181 @@ package org.openforis.collect.earth.app.server; +import java.io.BufferedWriter; +import java.io.File; import java.io.IOException; +import java.io.StringWriter; +import java.io.UnsupportedEncodingException; +import java.io.Writer; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Calendar; import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; -import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.service.EarthSurveyService; import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.planet.DateUtils; -import org.openforis.collect.earth.planet.PlanetImagery; -import org.openforis.collect.earth.planet.PlanetRequestParameters; +import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; +import org.openforis.collect.model.CollectRecordSummary; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; +import freemarker.cache.FileTemplateLoader; +import freemarker.template.Configuration; +import freemarker.template.Template; +import freemarker.template.TemplateException; +import freemarker.template.Version; /** - * Controller to load and store the information that is stored in Collect Earth - * for one placemark (plot) + * Servlet called by the NetworkLink which tries to update the status of the placemark icons every few seconds. * * @author Alfonso Sanchez-Paus Diaz - * @author S. Ricci * */ @Controller -public class PlacemarkPlanetImagery extends JsonPocessorServlet { +public class PlacemarkUpdateServlet { + + private static final String STANDARD_KML_FOR_UPDATES_FILENAME = "updateIcons.fmt"; //$NON-NLS-1$ + private static final String GENERIC_KML_FOR_UPDATES = "resources/" + STANDARD_KML_FOR_UPDATES_FILENAME; //$NON-NLS-1$ + private final Logger logger = LoggerFactory.getLogger(PlacemarkUpdateServlet.class); @Autowired - LocalPropertiesService localPropertiesService; + private EarthSurveyService earthSurveyService; - // 2015-07-17T10:50:18.650Z - private SimpleDateFormat planetDateFormat = new SimpleDateFormat("yyyy-MM-dd"); + @Autowired + private LocalPropertiesService localPropertiesService; - @PostMapping(value = "/planetTileUrl") - public void planetTileUrl(HttpServletRequest request, HttpServletResponse response) - throws IOException, ParseException { + private final Configuration cfg = new Configuration( new Version("2.3.23")); - PlanetRequestParameters params = getRequestParameters(request); + private Template template; - PlanetImagery planetImagery = new PlanetImagery(localPropertiesService.getPlanetMapsKey()); - String tileUrl = planetImagery.getLayerUrl(params); - setJsonResponse(response, tileUrl == null ? "" : tileUrl); - } + private String getKmlFromTemplate( Map data) throws IOException { - private PlanetRequestParameters getRequestParameters(HttpServletRequest request) throws ParseException { - Date startDate = planetDateFormat.parse(request.getParameter("start")); - Date endDate = getEndDate(request, startDate); + intializeTemplate(); + // Console output + final StringWriter fw = new StringWriter(); + final Writer out = new BufferedWriter(fw); + try { + // Add date to avoid caching + template.process(data, out); + } catch (final TemplateException e) { + logger.error("Error when producing starter KML from template", e); //$NON-NLS-1$ + } finally { + out.flush(); + fw.close(); + } - double[][][] coords = getCoordinates(request); - String[] itemTypeArray = getItemTypes(request); + return fw.toString(); - return new PlanetRequestParameters(startDate, endDate, coords, itemTypeArray); } - private double[][][] getCoordinates(HttpServletRequest request) { - Gson gson = new GsonBuilder().create(); - return gson.fromJson(request.getParameter("geometry"), double[][][].class); - } + private void intializeTemplate() throws IOException { + if (template == null) { + + // first check if there is a custom update template included on the customization that can be used for the project + + String possibleUpdateKmlLocation = localPropertiesService.getProjectFolder() + File.separatorChar + STANDARD_KML_FOR_UPDATES_FILENAME; + File possibleKmlFile = new File( possibleUpdateKmlLocation ); - private String[] getItemTypes(HttpServletRequest request) { - String[] itemTypeArray = request.getParameterMap().get("itemTypes[]"); - if (itemTypeArray == null || itemTypeArray.length == 0) { - itemTypeArray = new String[] { "PSScene3Band", "PSScene4Band" }; + if( possibleKmlFile.exists() ){ + /* + * We need to create a new TemplateLoader and use it momentarily as by default the Template loader + * uses the basedir of the project which causes problems when loading file from outside the project folder + */ + cfg.setTemplateLoader( new FileTemplateLoader( new File( possibleKmlFile.getParent() ) ) ); + template = cfg.getTemplate( STANDARD_KML_FOR_UPDATES_FILENAME ); + + }else{ + // No specific updatekml template found on the project folder, fall back to the general one + // Load template from the resource folder + cfg.setTemplateLoader( new FileTemplateLoader( new File( "." ) ) ); + template = cfg.getTemplate(GENERIC_KML_FOR_UPDATES); + } } - return itemTypeArray; } - private Date getEndDate(HttpServletRequest request, Date startDate) throws ParseException { - String endDateString = request.getParameter("end"); - Date endDate = null; - if (StringUtils.isNotBlank(endDateString)) { - endDate = planetDateFormat.parse(endDateString); - } else { - LocalDateTime localDateTime = DateUtils.asLocalDateTime(startDate); - endDate = DateUtils.asDate(localDateTime.plusDays(30)); + + + /** + * Responds with KML code that causes the Google Earth placemark icon and overlay image to update is status ( filled/not-filled/partially-filled) + * + * @param response The HTTP response object + * @param lastUpdate The datetime when this servlet was last called by the Google Earth network link. + * The date that this request was last sent. This way we get the placemarks that have changed status since the last time this was + * checked. + */ + @GetMapping("/placemarkUpdate") + public void getUpdatePlacemark(HttpServletResponse response, @RequestParam(value = "lastUpdate", required = false) String lastUpdate) { + + try { + + final SimpleDateFormat dateFormat = new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH ); + Date lastUpdateDate = null; + if (lastUpdate != null && lastUpdate.length() > 0) { + lastUpdateDate = dateFormat.parse(lastUpdate); + }else{ + lastUpdateDate = getTwoMinutesAgo(); + } + + List lastUpdatedRecords = null; + try { + lastUpdatedRecords = earthSurveyService.getRecordSummariesSavedSince(lastUpdateDate); + } catch (Exception e) { + lastUpdatedRecords = new ArrayList<>(); + logger.error("Error fetching information about the records updated after : " + lastUpdateDate , e); //$NON-NLS-1$ + } + + final Map data = new HashMap<>(); + data.put("host", ServerController.getHostAddress(localPropertiesService.getHost(), localPropertiesService.getLocalPort())); //$NON-NLS-1$ + data.put("date", getUpdateFromDate(dateFormat) ); // Keep for historical reasons //$NON-NLS-1$ + data.put("lastUpdateDateTime", getUpdateFromDate(dateFormat) ); //$NON-NLS-1$ + data.put("uniqueId", FreemarkerTemplateUtils.randInt(10000, 5000000) ); //$NON-NLS-1$ + data.put("kmlGeneratedOn", localPropertiesService.getGeneratedOn()); //$NON-NLS-1$ + data.put("placemark_ids", earthSurveyService.getPlacemarksId(lastUpdatedRecords)); //$NON-NLS-1$ + + setKmlResponse(response, getKmlFromTemplate(data), dateFormat); + + } catch (final ParseException e) { + logger.error("Error in the lastUpdate date format : " + lastUpdate, e); //$NON-NLS-1$ + } catch (final Exception e) { + logger.error("Error generating the update KML.", e); //$NON-NLS-1$ } - return endDate; + } - @PostMapping(value = "/planetAvailableImagery") - public void planetAvailableImagery(HttpServletRequest request, HttpServletResponse response) - throws IOException, ParseException { + private String getUpdateFromDate(final SimpleDateFormat dateFormat) throws UnsupportedEncodingException { + Date twoMinutesAgo = getTwoMinutesAgo(); + return URLEncoder.encode(dateFormat.format(twoMinutesAgo), StandardCharsets.UTF_8.name() ); //$NON-NLS-1$ + } - PlanetRequestParameters params = getRequestParameters(request); + public Date getTwoMinutesAgo() { + Calendar cal = Calendar.getInstance(); + cal.add(Calendar.MINUTE, -2); + return cal.getTime(); + } - PlanetImagery planetImagery = new PlanetImagery(localPropertiesService.getPlanetMapsKey()); - setJsonResponse(response, planetImagery.getAvailableDates(params)); + private void setKmlResponse(HttpServletResponse response, String kmlCode, SimpleDateFormat dateFormat) throws IOException { + response.setHeader("Content-Type", "application/vnd.google-earth.kml+xml"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Date", dateFormat.format(new Date())); //$NON-NLS-1$ + response.setHeader("Content-Length", Integer.toString( kmlCode.getBytes( StandardCharsets.UTF_8 ).length ) ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + response.getOutputStream().write(kmlCode.getBytes( StandardCharsets.UTF_8 )); //$NON-NLS-1$ + response.getOutputStream().flush(); + response.getOutputStream().close(); } } From 4b2f9aea87d685cc1b1dc1775518b63550eaa00d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:34 +0100 Subject: [PATCH 1060/1620] New translations PlacemarkUpdateServlet.java (English) --- .../earth/app/view/Messages_en.properties | 191 +++++++++++++----- 1 file changed, 137 insertions(+), 54 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index df62b703cb..3a7a63a8e1 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,98 +1,181 @@ package org.openforis.collect.earth.app.server; +import java.io.BufferedWriter; +import java.io.File; import java.io.IOException; +import java.io.StringWriter; +import java.io.UnsupportedEncodingException; +import java.io.Writer; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Calendar; import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; -import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.service.EarthSurveyService; import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.planet.DateUtils; -import org.openforis.collect.earth.planet.PlanetImagery; -import org.openforis.collect.earth.planet.PlanetRequestParameters; +import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; +import org.openforis.collect.model.CollectRecordSummary; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; +import freemarker.cache.FileTemplateLoader; +import freemarker.template.Configuration; +import freemarker.template.Template; +import freemarker.template.TemplateException; +import freemarker.template.Version; /** - * Controller to load and store the information that is stored in Collect Earth - * for one placemark (plot) + * Servlet called by the NetworkLink which tries to update the status of the placemark icons every few seconds. * * @author Alfonso Sanchez-Paus Diaz - * @author S. Ricci * */ @Controller -public class PlacemarkPlanetImagery extends JsonPocessorServlet { +public class PlacemarkUpdateServlet { + + private static final String STANDARD_KML_FOR_UPDATES_FILENAME = "updateIcons.fmt"; //$NON-NLS-1$ + private static final String GENERIC_KML_FOR_UPDATES = "resources/" + STANDARD_KML_FOR_UPDATES_FILENAME; //$NON-NLS-1$ + private final Logger logger = LoggerFactory.getLogger(PlacemarkUpdateServlet.class); @Autowired - LocalPropertiesService localPropertiesService; + private EarthSurveyService earthSurveyService; - // 2015-07-17T10:50:18.650Z - private SimpleDateFormat planetDateFormat = new SimpleDateFormat("yyyy-MM-dd"); + @Autowired + private LocalPropertiesService localPropertiesService; - @PostMapping(value = "/planetTileUrl") - public void planetTileUrl(HttpServletRequest request, HttpServletResponse response) - throws IOException, ParseException { + private final Configuration cfg = new Configuration( new Version("2.3.23")); - PlanetRequestParameters params = getRequestParameters(request); + private Template template; - PlanetImagery planetImagery = new PlanetImagery(localPropertiesService.getPlanetMapsKey()); - String tileUrl = planetImagery.getLayerUrl(params); - setJsonResponse(response, tileUrl == null ? "" : tileUrl); - } + private String getKmlFromTemplate( Map data) throws IOException { - private PlanetRequestParameters getRequestParameters(HttpServletRequest request) throws ParseException { - Date startDate = planetDateFormat.parse(request.getParameter("start")); - Date endDate = getEndDate(request, startDate); + intializeTemplate(); + // Console output + final StringWriter fw = new StringWriter(); + final Writer out = new BufferedWriter(fw); + try { + // Add date to avoid caching + template.process(data, out); + } catch (final TemplateException e) { + logger.error("Error when producing starter KML from template", e); //$NON-NLS-1$ + } finally { + out.flush(); + fw.close(); + } - double[][][] coords = getCoordinates(request); - String[] itemTypeArray = getItemTypes(request); + return fw.toString(); - return new PlanetRequestParameters(startDate, endDate, coords, itemTypeArray); } - private double[][][] getCoordinates(HttpServletRequest request) { - Gson gson = new GsonBuilder().create(); - return gson.fromJson(request.getParameter("geometry"), double[][][].class); - } + private void intializeTemplate() throws IOException { + if (template == null) { + + // first check if there is a custom update template included on the customization that can be used for the project + + String possibleUpdateKmlLocation = localPropertiesService.getProjectFolder() + File.separatorChar + STANDARD_KML_FOR_UPDATES_FILENAME; + File possibleKmlFile = new File( possibleUpdateKmlLocation ); - private String[] getItemTypes(HttpServletRequest request) { - String[] itemTypeArray = request.getParameterMap().get("itemTypes[]"); - if (itemTypeArray == null || itemTypeArray.length == 0) { - itemTypeArray = new String[] { "PSScene3Band", "PSScene4Band" }; + if( possibleKmlFile.exists() ){ + /* + * We need to create a new TemplateLoader and use it momentarily as by default the Template loader + * uses the basedir of the project which causes problems when loading file from outside the project folder + */ + cfg.setTemplateLoader( new FileTemplateLoader( new File( possibleKmlFile.getParent() ) ) ); + template = cfg.getTemplate( STANDARD_KML_FOR_UPDATES_FILENAME ); + + }else{ + // No specific updatekml template found on the project folder, fall back to the general one + // Load template from the resource folder + cfg.setTemplateLoader( new FileTemplateLoader( new File( "." ) ) ); + template = cfg.getTemplate(GENERIC_KML_FOR_UPDATES); + } } - return itemTypeArray; } - private Date getEndDate(HttpServletRequest request, Date startDate) throws ParseException { - String endDateString = request.getParameter("end"); - Date endDate = null; - if (StringUtils.isNotBlank(endDateString)) { - endDate = planetDateFormat.parse(endDateString); - } else { - LocalDateTime localDateTime = DateUtils.asLocalDateTime(startDate); - endDate = DateUtils.asDate(localDateTime.plusDays(30)); + + + /** + * Responds with KML code that causes the Google Earth placemark icon and overlay image to update is status ( filled/not-filled/partially-filled) + * + * @param response The HTTP response object + * @param lastUpdate The datetime when this servlet was last called by the Google Earth network link. + * The date that this request was last sent. This way we get the placemarks that have changed status since the last time this was + * checked. + */ + @GetMapping("/placemarkUpdate") + public void getUpdatePlacemark(HttpServletResponse response, @RequestParam(value = "lastUpdate", required = false) String lastUpdate) { + + try { + + final SimpleDateFormat dateFormat = new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH ); + Date lastUpdateDate = null; + if (lastUpdate != null && lastUpdate.length() > 0) { + lastUpdateDate = dateFormat.parse(lastUpdate); + }else{ + lastUpdateDate = getTwoMinutesAgo(); + } + + List lastUpdatedRecords = null; + try { + lastUpdatedRecords = earthSurveyService.getRecordSummariesSavedSince(lastUpdateDate); + } catch (Exception e) { + lastUpdatedRecords = new ArrayList<>(); + logger.error("Error fetching information about the records updated after : " + lastUpdateDate , e); //$NON-NLS-1$ + } + + final Map data = new HashMap<>(); + data.put("host", ServerController.getHostAddress(localPropertiesService.getHost(), localPropertiesService.getLocalPort())); //$NON-NLS-1$ + data.put("date", getUpdateFromDate(dateFormat) ); // Keep for historical reasons //$NON-NLS-1$ + data.put("lastUpdateDateTime", getUpdateFromDate(dateFormat) ); //$NON-NLS-1$ + data.put("uniqueId", FreemarkerTemplateUtils.randInt(10000, 5000000) ); //$NON-NLS-1$ + data.put("kmlGeneratedOn", localPropertiesService.getGeneratedOn()); //$NON-NLS-1$ + data.put("placemark_ids", earthSurveyService.getPlacemarksId(lastUpdatedRecords)); //$NON-NLS-1$ + + setKmlResponse(response, getKmlFromTemplate(data), dateFormat); + + } catch (final ParseException e) { + logger.error("Error in the lastUpdate date format : " + lastUpdate, e); //$NON-NLS-1$ + } catch (final Exception e) { + logger.error("Error generating the update KML.", e); //$NON-NLS-1$ } - return endDate; + } - @PostMapping(value = "/planetAvailableImagery") - public void planetAvailableImagery(HttpServletRequest request, HttpServletResponse response) - throws IOException, ParseException { + private String getUpdateFromDate(final SimpleDateFormat dateFormat) throws UnsupportedEncodingException { + Date twoMinutesAgo = getTwoMinutesAgo(); + return URLEncoder.encode(dateFormat.format(twoMinutesAgo), StandardCharsets.UTF_8.name() ); //$NON-NLS-1$ + } - PlanetRequestParameters params = getRequestParameters(request); + public Date getTwoMinutesAgo() { + Calendar cal = Calendar.getInstance(); + cal.add(Calendar.MINUTE, -2); + return cal.getTime(); + } - PlanetImagery planetImagery = new PlanetImagery(localPropertiesService.getPlanetMapsKey()); - setJsonResponse(response, planetImagery.getAvailableDates(params)); + private void setKmlResponse(HttpServletResponse response, String kmlCode, SimpleDateFormat dateFormat) throws IOException { + response.setHeader("Content-Type", "application/vnd.google-earth.kml+xml"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ + response.setHeader("Date", dateFormat.format(new Date())); //$NON-NLS-1$ + response.setHeader("Content-Length", Integer.toString( kmlCode.getBytes( StandardCharsets.UTF_8 ).length ) ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + response.getOutputStream().write(kmlCode.getBytes( StandardCharsets.UTF_8 )); //$NON-NLS-1$ + response.getOutputStream().flush(); + response.getOutputStream().close(); } } From adf47b76f9548448bbd5077bbb2a6c07b907a443 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:36 +0100 Subject: [PATCH 1061/1620] New translations CodeEditorHandlerThread.java (Spanish) --- .../earth/app/view/Messages_es.properties | 398 ++++++++++++------ 1 file changed, 268 insertions(+), 130 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 3a7a63a8e1..c2259f5db0 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,181 +1,319 @@ -package org.openforis.collect.earth.app.server; +package org.openforis.collect.earth.app.service; -import java.io.BufferedWriter; +import java.awt.Toolkit; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.StringSelection; import java.io.File; import java.io.IOException; -import java.io.StringWriter; -import java.io.UnsupportedEncodingException; -import java.io.Writer; -import java.net.URLEncoder; +import java.net.URISyntaxException; +import java.net.URL; import java.nio.charset.StandardCharsets; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; - -import javax.servlet.http.HttpServletResponse; - -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.desktop.ServerController; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; -import org.openforis.collect.model.CollectRecordSummary; +import java.util.NoSuchElementException; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; +import org.openqa.selenium.By; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.Keys; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.openqa.selenium.remote.RemoteWebElement; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; - -import freemarker.cache.FileTemplateLoader; -import freemarker.template.Configuration; -import freemarker.template.Template; -import freemarker.template.TemplateException; -import freemarker.template.Version; - -/** - * Servlet called by the NetworkLink which tries to update the status of the placemark icons every few seconds. - * - * @author Alfonso Sanchez-Paus Diaz - * - */ -@Controller -public class PlacemarkUpdateServlet { - - private static final String STANDARD_KML_FOR_UPDATES_FILENAME = "updateIcons.fmt"; //$NON-NLS-1$ - private static final String GENERIC_KML_FOR_UPDATES = "resources/" + STANDARD_KML_FOR_UPDATES_FILENAME; //$NON-NLS-1$ - private final Logger logger = LoggerFactory.getLogger(PlacemarkUpdateServlet.class); +import org.springframework.stereotype.Component; + +import liquibase.repackaged.org.apache.commons.lang3.SystemUtils; + + +@Component +public class CodeEditorHandlerThread { + private static final String RUN_SCRIPT_BUTTON = "button.run-button"; + private static final String RESET_SCRIPT_BUTTON = "button.reset-button"; + private SimplePlacemarkObject placemarkObject; + + private RemoteWebDriver webDriverGee; @Autowired - private EarthSurveyService earthSurveyService; + private BrowserService browserService; + private Logger logger = LoggerFactory.getLogger(CodeEditorHandlerThread.class); @Autowired - private LocalPropertiesService localPropertiesService; + private GeolocalizeMapService geoLocalizeTemplateService; - private final Configuration cfg = new Configuration( new Version("2.3.23")); + @Autowired + private LocalPropertiesService localPropertiesService; - private Template template; + public boolean isCodeEditorShowing() { + return BrowserService.isCssElementPresent(RUN_SCRIPT_BUTTON, webDriverGee); + } + public void runScript() throws IOException, URISyntaxException, InterruptedException { - private String getKmlFromTemplate( Map data) throws IOException { - intializeTemplate(); - // Console output - final StringWriter fw = new StringWriter(); - final Writer out = new BufferedWriter(fw); try { - // Add date to avoid caching - template.process(data, out); - } catch (final TemplateException e) { - logger.error("Error when producing starter KML from template", e); //$NON-NLS-1$ - } finally { - out.flush(); - fw.close(); + WebElement resetButton = webDriverGee.findElementByCssSelector(RESET_SCRIPT_BUTTON); + + forceClick( resetButton ); + + URL fileWithScript = geoLocalizeTemplateService.getTemporaryUrl(placemarkObject, getGeeCodeEditorTemplate()); + + WebElement textArea = webDriverGee.findElement(By.className("ace_text-input")); + + String contents = FileUtils.readFileToString(new File(fileWithScript.toURI()), StandardCharsets.UTF_8 ); + + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { + sendThroughKeys(textArea, contents); + + } else { + sendThroughClipboard(textArea, contents); + try { + // Fix bug provoked by antivirus not accepting the control characters sent by Selenium + WebElement element = webDriverGee.findElement(By.className("ace_line") ); + if( element!= null && element.getAttribute("value").trim().equals("av") ) { + sendThroughKeys(textArea, contents); + } + } catch (Exception e) { + logger.warn("Error while refreshing code editor", e); + + } + } + + Thread.sleep(1000); + WebElement runButton = webDriverGee.findElementByCssSelector(RUN_SCRIPT_BUTTON); + forceClick( runButton ); + } catch (NoSuchElementException e) { + try { + // retry + Thread.sleep(1000); + WebElement runButton = webDriverGee.findElementByCssSelector(RUN_SCRIPT_BUTTON); + forceClick( runButton ); + }catch (Exception e2) { + // TODO: handle exception + } } - return fw.toString(); + } + private void sendThroughClipboard(WebElement textArea, String contents) { + Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); + StringSelection clipboardtext = new StringSelection(contents); + clipboard.setContents(clipboardtext, null); + Keys controlChar = Keys.CONTROL; + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { + controlChar = Keys.COMMAND; + } + textArea.sendKeys(Keys.chord(controlChar, "a")); + textArea.sendKeys(Keys.chord(controlChar, "v")); } - private void intializeTemplate() throws IOException { - if (template == null) { + private void sendThroughKeys(WebElement textArea, String contents) + throws InterruptedException { + // Command key (apple key) is not working on Chrome on Mac. Try with the right click + // This is not going to be fixed by Selenium - // first check if there is a custom update template included on the customization that can be used for the project + // Remove comments so it is faster to send the text! + String noComments = removeComments(contents); - String possibleUpdateKmlLocation = localPropertiesService.getProjectFolder() + File.separatorChar + STANDARD_KML_FOR_UPDATES_FILENAME; - File possibleKmlFile = new File( possibleUpdateKmlLocation ); + // Clear the code area + WebElement clearButton = webDriverGee.findElementByCssSelector(RESET_SCRIPT_BUTTON); + forceClick( clearButton ); - if( possibleKmlFile.exists() ){ - /* - * We need to create a new TemplateLoader and use it momentarily as by default the Template loader - * uses the basedir of the project which causes problems when loading file from outside the project folder - */ - cfg.setTemplateLoader( new FileTemplateLoader( new File( possibleKmlFile.getParent() ) ) ); - template = cfg.getTemplate( STANDARD_KML_FOR_UPDATES_FILENAME ); + StringBuilder fixedScriptForMac = new StringBuilder(); + String[] lines = noComments.split("\\n"); + for (String line : lines) { + // Send the content of the script + String trimmedLine = line.trim(); - }else{ - // No specific updatekml template found on the project folder, fall back to the general one - // Load template from the resource folder - cfg.setTemplateLoader( new FileTemplateLoader( new File( "." ) ) ); - template = cfg.getTemplate(GENERIC_KML_FOR_UPDATES); + // Add Spaces after "{" so we avoid the automatic closing of the method by GEE + // Playground JS + trimmedLine = trimmedLine.replace("{", "{ "); + + if (!StringUtils.isBlank(trimmedLine)) { + fixedScriptForMac = fixedScriptForMac.append(trimmedLine).append("\n"); } } + + fixedScriptForMac.append("//THE END"); // Don't remove this!!! this way we mark the point where there should be no trailing character removal + Keys controlChar = Keys.CONTROL; + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { + controlChar = Keys.COMMAND; + } + textArea.sendKeys(Keys.chord(controlChar, "a")); + textArea.sendKeys(fixedScriptForMac); +/* + Thread.sleep(500); + // Fix the extra characters added by removing the last 10 chars ( this is a bug from Selenium! ) + textArea.sendKeys(Keys.PAGE_DOWN); + Thread.sleep(500); + textArea.sendKeys(Keys.PAGE_DOWN); + */ } + private void forceClick( WebElement element ) { + JavascriptExecutor js = webDriverGee; + js.executeScript("arguments[0].click();", element); + } + public String removeComments(String contents) { + + String wholeCode = contents; + wholeCode = wholeCode.replace("http://", ""); + wholeCode = wholeCode.replace("https://", ""); + wholeCode = wholeCode.replace("\r", ""); + + StringBuilder noComments = new StringBuilder(""); + int indexComments = contents.indexOf("//"); + if (indexComments != -1) { + while (indexComments >= 0) { + int endOfLine = contents.indexOf('\n', indexComments); + if (endOfLine != -1) + indexComments = contents.indexOf("//", endOfLine + 2); + else { + break; + } + + if (indexComments != -1) + noComments = noComments.append(contents.substring(endOfLine, indexComments)); + else + noComments = noComments.append(contents.substring(endOfLine)); + } + return noComments.toString(); + } else { + return wholeCode; + } + } /** - * Responds with KML code that causes the Google Earth placemark icon and overlay image to update is status ( filled/not-filled/partially-filled) + * Get the GEE Playground script that should be used. There is an standard one + * that resides in resources/eePlaygroundScript.fmt but a project might have its + * own script. * - * @param response The HTTP response object - * @param lastUpdate The datetime when this servlet was last called by the Google Earth network link. - * The date that this request was last sent. This way we get the placemarks that have changed status since the last time this was - * checked. + * @return The generic script in the resources folder or the file called + * eePlaygroundScript.fmt in the same folder where the current project + * file resides */ - @GetMapping("/placemarkUpdate") - public void getUpdatePlacemark(HttpServletResponse response, @RequestParam(value = "lastUpdate", required = false) String lastUpdate) { + private String getGeeCodeEditorTemplate() { - try { + String projectPlaygroundScript = getProjectGeeScript(); + if (projectPlaygroundScript != null) { + return projectPlaygroundScript; + } else { + return GeolocalizeMapService.FREEMARKER_GEE_CODE_EDITOR_TEMPLATE; // New format name since version 1.6.20 + } - final SimpleDateFormat dateFormat = new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH ); - Date lastUpdateDate = null; - if (lastUpdate != null && lastUpdate.length() > 0) { - lastUpdateDate = dateFormat.parse(lastUpdate); - }else{ - lastUpdateDate = getTwoMinutesAgo(); - } + } - List lastUpdatedRecords = null; - try { - lastUpdatedRecords = earthSurveyService.getRecordSummariesSavedSince(lastUpdateDate); - } catch (Exception e) { - lastUpdatedRecords = new ArrayList<>(); - logger.error("Error fetching information about the records updated after : " + lastUpdateDate , e); //$NON-NLS-1$ - } + /** + * @return The path to the GEE Code Editor generic script or the one that is + * specified in the project folder if it exists. + */ + private String getProjectGeeScript() { + // Is there a "eePlaygroundScript.fmt" file in the same folder than in the + // metadata file folder? + File projectGeePlayground = new File(localPropertiesService.getProjectFolder() + File.separatorChar + + GeolocalizeMapService.FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME); + + // Is there a "eeCodeEditorScript.fmt" file in the same folder than in the + // metadata file folder? NEW NAME AFTER 12/2017!!! + File projectGeeCodeEditor = new File(localPropertiesService.getProjectFolder() + File.separatorChar + + GeolocalizeMapService.FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME); + + String geeFilePath = null; + if (projectGeeCodeEditor.exists()) { // The new format name takes precedence + geeFilePath = projectGeeCodeEditor.getAbsolutePath(); + } else if (projectGeePlayground.exists()) { + geeFilePath = projectGeePlayground.getAbsolutePath(); + } + return geeFilePath; + } - final Map data = new HashMap<>(); - data.put("host", ServerController.getHostAddress(localPropertiesService.getHost(), localPropertiesService.getLocalPort())); //$NON-NLS-1$ - data.put("date", getUpdateFromDate(dateFormat) ); // Keep for historical reasons //$NON-NLS-1$ - data.put("lastUpdateDateTime", getUpdateFromDate(dateFormat) ); //$NON-NLS-1$ - data.put("uniqueId", FreemarkerTemplateUtils.randInt(10000, 5000000) ); //$NON-NLS-1$ - data.put("kmlGeneratedOn", localPropertiesService.getGeneratedOn()); //$NON-NLS-1$ - data.put("placemark_ids", earthSurveyService.getPlacemarksId(lastUpdatedRecords)); //$NON-NLS-1$ + public void loadCodeEditorScript(SimplePlacemarkObject placemarkObject, RemoteWebDriver webDriverGeePlayground) { + this.placemarkObject = placemarkObject; + loadCodeEditorScript(webDriverGeePlayground); + } - setKmlResponse(response, getKmlFromTemplate(data), dateFormat); + public void disableCodeEditorAutocomplete(RemoteWebDriver webDriverCodeEditor) { + this.webDriverGee = webDriverCodeEditor; + try { + if (!isCodeEditorShowing()) { + // Open GEE Playground + if (!browserService.isDriverWorking(webDriverGee) || webDriverGee.getCurrentUrl() == null + || !webDriverGee.getCurrentUrl().contains("google")) { + webDriverGee = browserService.navigateTo(localPropertiesService.getGeePlaygoundUrl(), webDriverGee); + browserService.setWebDriverGeeCodeEditor(webDriverGee); + } + + // Initially the login page appears! + while (!isCodeEditorShowing()) { // 5 minutes a 2 seconds == 30 * 5 = 150 + Thread.sleep(2000); + } + + } else { + disableAutoComplete(); + } - } catch (final ParseException e) { - logger.error("Error in the lastUpdate date format : " + lastUpdate, e); //$NON-NLS-1$ + } catch (final NoSuchElementException e) { + // This is a well known exception. Down-grade if to warning + logger.warn("Error when opening Earth Engine browser window. Known problem", e); } catch (final Exception e) { - logger.error("Error generating the update KML.", e); //$NON-NLS-1$ + // This is a well known exception. + logger.error("Error when opening Earth Engine browser window", e); } - } - private String getUpdateFromDate(final SimpleDateFormat dateFormat) throws UnsupportedEncodingException { - Date twoMinutesAgo = getTwoMinutesAgo(); - return URLEncoder.encode(dateFormat.format(twoMinutesAgo), StandardCharsets.UTF_8.name() ); //$NON-NLS-1$ - } + private void disableAutoComplete() { + // Display the settings in Google Earth Engine Code Editor (this emulates + // clicking on the settings icon) + webDriverGee.findElementByClassName("settings-menu-button").click(); + // Get the Div that is the parent of the one with text that contains + // Autocomplete + RemoteWebElement autocompleteButton = (RemoteWebElement) webDriverGee + .findElementByXPath("//div[contains(text(), \"Autocomplete\")]/.."); + + if (isAutocompleChecked(autocompleteButton)) { + // Disable the Autocomplete of special characters + autocompleteButton.click(); + } - public Date getTwoMinutesAgo() { - Calendar cal = Calendar.getInstance(); - cal.add(Calendar.MINUTE, -2); - return cal.getTime(); } - private void setKmlResponse(HttpServletResponse response, String kmlCode, SimpleDateFormat dateFormat) throws IOException { - response.setHeader("Content-Type", "application/vnd.google-earth.kml+xml"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Date", dateFormat.format(new Date())); //$NON-NLS-1$ - response.setHeader("Content-Length", Integer.toString( kmlCode.getBytes( StandardCharsets.UTF_8 ).length ) ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - response.getOutputStream().write(kmlCode.getBytes( StandardCharsets.UTF_8 )); //$NON-NLS-1$ - response.getOutputStream().flush(); - response.getOutputStream().close(); + public boolean isAutocompleChecked(RemoteWebElement autocompleteButton) { + String buttonChecked = autocompleteButton.getAttribute("aria-checked"); + return buttonChecked.equals("true"); } + private void loadCodeEditorScript(RemoteWebDriver webDriverCodeEditor) { + this.webDriverGee = webDriverCodeEditor; + Thread loadGee = new Thread( + "Opening GEE Playground " + (placemarkObject != null ? placemarkObject.toString() : "")) { + @Override + public void run() { + try { + if (!isCodeEditorShowing()) { + // Open GEE Code Editor + if (!browserService.isDriverWorking(webDriverGee) || webDriverGee.getCurrentUrl() == null + || !webDriverGee.getCurrentUrl().contains("google")) { + webDriverGee = browserService.navigateTo(localPropertiesService.getGeePlaygoundUrl(), + webDriverGee); + browserService.setWebDriverGeeCodeEditor(webDriverGee); + } + // Initially the login page appears! + while (!isCodeEditorShowing()) { + sleep(2000); + } + } + runScript(); + } catch (final NoSuchElementException e) { + // This is a well known exception. Down-grade if to warning + logger.warn("Error when opening Earth Engine browser window. Known problem", e); + } catch (final Exception e) { + // This is a well known exception. + logger.error("Error when opening Earth Engine browser window", e); + } + } + }; + loadGee.start(); + } } From ff9ffb2adf4a5ded58dd8a3b2cd531cdd4da3b1a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:37 +0100 Subject: [PATCH 1062/1620] New translations CodeEditorHandlerThread.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 398 ++++++++++++------ 1 file changed, 268 insertions(+), 130 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 3a7a63a8e1..c2259f5db0 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,181 +1,319 @@ -package org.openforis.collect.earth.app.server; +package org.openforis.collect.earth.app.service; -import java.io.BufferedWriter; +import java.awt.Toolkit; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.StringSelection; import java.io.File; import java.io.IOException; -import java.io.StringWriter; -import java.io.UnsupportedEncodingException; -import java.io.Writer; -import java.net.URLEncoder; +import java.net.URISyntaxException; +import java.net.URL; import java.nio.charset.StandardCharsets; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; - -import javax.servlet.http.HttpServletResponse; - -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.desktop.ServerController; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; -import org.openforis.collect.model.CollectRecordSummary; +import java.util.NoSuchElementException; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; +import org.openqa.selenium.By; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.Keys; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.openqa.selenium.remote.RemoteWebElement; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; - -import freemarker.cache.FileTemplateLoader; -import freemarker.template.Configuration; -import freemarker.template.Template; -import freemarker.template.TemplateException; -import freemarker.template.Version; - -/** - * Servlet called by the NetworkLink which tries to update the status of the placemark icons every few seconds. - * - * @author Alfonso Sanchez-Paus Diaz - * - */ -@Controller -public class PlacemarkUpdateServlet { - - private static final String STANDARD_KML_FOR_UPDATES_FILENAME = "updateIcons.fmt"; //$NON-NLS-1$ - private static final String GENERIC_KML_FOR_UPDATES = "resources/" + STANDARD_KML_FOR_UPDATES_FILENAME; //$NON-NLS-1$ - private final Logger logger = LoggerFactory.getLogger(PlacemarkUpdateServlet.class); +import org.springframework.stereotype.Component; + +import liquibase.repackaged.org.apache.commons.lang3.SystemUtils; + + +@Component +public class CodeEditorHandlerThread { + private static final String RUN_SCRIPT_BUTTON = "button.run-button"; + private static final String RESET_SCRIPT_BUTTON = "button.reset-button"; + private SimplePlacemarkObject placemarkObject; + + private RemoteWebDriver webDriverGee; @Autowired - private EarthSurveyService earthSurveyService; + private BrowserService browserService; + private Logger logger = LoggerFactory.getLogger(CodeEditorHandlerThread.class); @Autowired - private LocalPropertiesService localPropertiesService; + private GeolocalizeMapService geoLocalizeTemplateService; - private final Configuration cfg = new Configuration( new Version("2.3.23")); + @Autowired + private LocalPropertiesService localPropertiesService; - private Template template; + public boolean isCodeEditorShowing() { + return BrowserService.isCssElementPresent(RUN_SCRIPT_BUTTON, webDriverGee); + } + public void runScript() throws IOException, URISyntaxException, InterruptedException { - private String getKmlFromTemplate( Map data) throws IOException { - intializeTemplate(); - // Console output - final StringWriter fw = new StringWriter(); - final Writer out = new BufferedWriter(fw); try { - // Add date to avoid caching - template.process(data, out); - } catch (final TemplateException e) { - logger.error("Error when producing starter KML from template", e); //$NON-NLS-1$ - } finally { - out.flush(); - fw.close(); + WebElement resetButton = webDriverGee.findElementByCssSelector(RESET_SCRIPT_BUTTON); + + forceClick( resetButton ); + + URL fileWithScript = geoLocalizeTemplateService.getTemporaryUrl(placemarkObject, getGeeCodeEditorTemplate()); + + WebElement textArea = webDriverGee.findElement(By.className("ace_text-input")); + + String contents = FileUtils.readFileToString(new File(fileWithScript.toURI()), StandardCharsets.UTF_8 ); + + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { + sendThroughKeys(textArea, contents); + + } else { + sendThroughClipboard(textArea, contents); + try { + // Fix bug provoked by antivirus not accepting the control characters sent by Selenium + WebElement element = webDriverGee.findElement(By.className("ace_line") ); + if( element!= null && element.getAttribute("value").trim().equals("av") ) { + sendThroughKeys(textArea, contents); + } + } catch (Exception e) { + logger.warn("Error while refreshing code editor", e); + + } + } + + Thread.sleep(1000); + WebElement runButton = webDriverGee.findElementByCssSelector(RUN_SCRIPT_BUTTON); + forceClick( runButton ); + } catch (NoSuchElementException e) { + try { + // retry + Thread.sleep(1000); + WebElement runButton = webDriverGee.findElementByCssSelector(RUN_SCRIPT_BUTTON); + forceClick( runButton ); + }catch (Exception e2) { + // TODO: handle exception + } } - return fw.toString(); + } + private void sendThroughClipboard(WebElement textArea, String contents) { + Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); + StringSelection clipboardtext = new StringSelection(contents); + clipboard.setContents(clipboardtext, null); + Keys controlChar = Keys.CONTROL; + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { + controlChar = Keys.COMMAND; + } + textArea.sendKeys(Keys.chord(controlChar, "a")); + textArea.sendKeys(Keys.chord(controlChar, "v")); } - private void intializeTemplate() throws IOException { - if (template == null) { + private void sendThroughKeys(WebElement textArea, String contents) + throws InterruptedException { + // Command key (apple key) is not working on Chrome on Mac. Try with the right click + // This is not going to be fixed by Selenium - // first check if there is a custom update template included on the customization that can be used for the project + // Remove comments so it is faster to send the text! + String noComments = removeComments(contents); - String possibleUpdateKmlLocation = localPropertiesService.getProjectFolder() + File.separatorChar + STANDARD_KML_FOR_UPDATES_FILENAME; - File possibleKmlFile = new File( possibleUpdateKmlLocation ); + // Clear the code area + WebElement clearButton = webDriverGee.findElementByCssSelector(RESET_SCRIPT_BUTTON); + forceClick( clearButton ); - if( possibleKmlFile.exists() ){ - /* - * We need to create a new TemplateLoader and use it momentarily as by default the Template loader - * uses the basedir of the project which causes problems when loading file from outside the project folder - */ - cfg.setTemplateLoader( new FileTemplateLoader( new File( possibleKmlFile.getParent() ) ) ); - template = cfg.getTemplate( STANDARD_KML_FOR_UPDATES_FILENAME ); + StringBuilder fixedScriptForMac = new StringBuilder(); + String[] lines = noComments.split("\\n"); + for (String line : lines) { + // Send the content of the script + String trimmedLine = line.trim(); - }else{ - // No specific updatekml template found on the project folder, fall back to the general one - // Load template from the resource folder - cfg.setTemplateLoader( new FileTemplateLoader( new File( "." ) ) ); - template = cfg.getTemplate(GENERIC_KML_FOR_UPDATES); + // Add Spaces after "{" so we avoid the automatic closing of the method by GEE + // Playground JS + trimmedLine = trimmedLine.replace("{", "{ "); + + if (!StringUtils.isBlank(trimmedLine)) { + fixedScriptForMac = fixedScriptForMac.append(trimmedLine).append("\n"); } } + + fixedScriptForMac.append("//THE END"); // Don't remove this!!! this way we mark the point where there should be no trailing character removal + Keys controlChar = Keys.CONTROL; + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { + controlChar = Keys.COMMAND; + } + textArea.sendKeys(Keys.chord(controlChar, "a")); + textArea.sendKeys(fixedScriptForMac); +/* + Thread.sleep(500); + // Fix the extra characters added by removing the last 10 chars ( this is a bug from Selenium! ) + textArea.sendKeys(Keys.PAGE_DOWN); + Thread.sleep(500); + textArea.sendKeys(Keys.PAGE_DOWN); + */ } + private void forceClick( WebElement element ) { + JavascriptExecutor js = webDriverGee; + js.executeScript("arguments[0].click();", element); + } + public String removeComments(String contents) { + + String wholeCode = contents; + wholeCode = wholeCode.replace("http://", ""); + wholeCode = wholeCode.replace("https://", ""); + wholeCode = wholeCode.replace("\r", ""); + + StringBuilder noComments = new StringBuilder(""); + int indexComments = contents.indexOf("//"); + if (indexComments != -1) { + while (indexComments >= 0) { + int endOfLine = contents.indexOf('\n', indexComments); + if (endOfLine != -1) + indexComments = contents.indexOf("//", endOfLine + 2); + else { + break; + } + + if (indexComments != -1) + noComments = noComments.append(contents.substring(endOfLine, indexComments)); + else + noComments = noComments.append(contents.substring(endOfLine)); + } + return noComments.toString(); + } else { + return wholeCode; + } + } /** - * Responds with KML code that causes the Google Earth placemark icon and overlay image to update is status ( filled/not-filled/partially-filled) + * Get the GEE Playground script that should be used. There is an standard one + * that resides in resources/eePlaygroundScript.fmt but a project might have its + * own script. * - * @param response The HTTP response object - * @param lastUpdate The datetime when this servlet was last called by the Google Earth network link. - * The date that this request was last sent. This way we get the placemarks that have changed status since the last time this was - * checked. + * @return The generic script in the resources folder or the file called + * eePlaygroundScript.fmt in the same folder where the current project + * file resides */ - @GetMapping("/placemarkUpdate") - public void getUpdatePlacemark(HttpServletResponse response, @RequestParam(value = "lastUpdate", required = false) String lastUpdate) { + private String getGeeCodeEditorTemplate() { - try { + String projectPlaygroundScript = getProjectGeeScript(); + if (projectPlaygroundScript != null) { + return projectPlaygroundScript; + } else { + return GeolocalizeMapService.FREEMARKER_GEE_CODE_EDITOR_TEMPLATE; // New format name since version 1.6.20 + } - final SimpleDateFormat dateFormat = new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH ); - Date lastUpdateDate = null; - if (lastUpdate != null && lastUpdate.length() > 0) { - lastUpdateDate = dateFormat.parse(lastUpdate); - }else{ - lastUpdateDate = getTwoMinutesAgo(); - } + } - List lastUpdatedRecords = null; - try { - lastUpdatedRecords = earthSurveyService.getRecordSummariesSavedSince(lastUpdateDate); - } catch (Exception e) { - lastUpdatedRecords = new ArrayList<>(); - logger.error("Error fetching information about the records updated after : " + lastUpdateDate , e); //$NON-NLS-1$ - } + /** + * @return The path to the GEE Code Editor generic script or the one that is + * specified in the project folder if it exists. + */ + private String getProjectGeeScript() { + // Is there a "eePlaygroundScript.fmt" file in the same folder than in the + // metadata file folder? + File projectGeePlayground = new File(localPropertiesService.getProjectFolder() + File.separatorChar + + GeolocalizeMapService.FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME); + + // Is there a "eeCodeEditorScript.fmt" file in the same folder than in the + // metadata file folder? NEW NAME AFTER 12/2017!!! + File projectGeeCodeEditor = new File(localPropertiesService.getProjectFolder() + File.separatorChar + + GeolocalizeMapService.FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME); + + String geeFilePath = null; + if (projectGeeCodeEditor.exists()) { // The new format name takes precedence + geeFilePath = projectGeeCodeEditor.getAbsolutePath(); + } else if (projectGeePlayground.exists()) { + geeFilePath = projectGeePlayground.getAbsolutePath(); + } + return geeFilePath; + } - final Map data = new HashMap<>(); - data.put("host", ServerController.getHostAddress(localPropertiesService.getHost(), localPropertiesService.getLocalPort())); //$NON-NLS-1$ - data.put("date", getUpdateFromDate(dateFormat) ); // Keep for historical reasons //$NON-NLS-1$ - data.put("lastUpdateDateTime", getUpdateFromDate(dateFormat) ); //$NON-NLS-1$ - data.put("uniqueId", FreemarkerTemplateUtils.randInt(10000, 5000000) ); //$NON-NLS-1$ - data.put("kmlGeneratedOn", localPropertiesService.getGeneratedOn()); //$NON-NLS-1$ - data.put("placemark_ids", earthSurveyService.getPlacemarksId(lastUpdatedRecords)); //$NON-NLS-1$ + public void loadCodeEditorScript(SimplePlacemarkObject placemarkObject, RemoteWebDriver webDriverGeePlayground) { + this.placemarkObject = placemarkObject; + loadCodeEditorScript(webDriverGeePlayground); + } - setKmlResponse(response, getKmlFromTemplate(data), dateFormat); + public void disableCodeEditorAutocomplete(RemoteWebDriver webDriverCodeEditor) { + this.webDriverGee = webDriverCodeEditor; + try { + if (!isCodeEditorShowing()) { + // Open GEE Playground + if (!browserService.isDriverWorking(webDriverGee) || webDriverGee.getCurrentUrl() == null + || !webDriverGee.getCurrentUrl().contains("google")) { + webDriverGee = browserService.navigateTo(localPropertiesService.getGeePlaygoundUrl(), webDriverGee); + browserService.setWebDriverGeeCodeEditor(webDriverGee); + } + + // Initially the login page appears! + while (!isCodeEditorShowing()) { // 5 minutes a 2 seconds == 30 * 5 = 150 + Thread.sleep(2000); + } + + } else { + disableAutoComplete(); + } - } catch (final ParseException e) { - logger.error("Error in the lastUpdate date format : " + lastUpdate, e); //$NON-NLS-1$ + } catch (final NoSuchElementException e) { + // This is a well known exception. Down-grade if to warning + logger.warn("Error when opening Earth Engine browser window. Known problem", e); } catch (final Exception e) { - logger.error("Error generating the update KML.", e); //$NON-NLS-1$ + // This is a well known exception. + logger.error("Error when opening Earth Engine browser window", e); } - } - private String getUpdateFromDate(final SimpleDateFormat dateFormat) throws UnsupportedEncodingException { - Date twoMinutesAgo = getTwoMinutesAgo(); - return URLEncoder.encode(dateFormat.format(twoMinutesAgo), StandardCharsets.UTF_8.name() ); //$NON-NLS-1$ - } + private void disableAutoComplete() { + // Display the settings in Google Earth Engine Code Editor (this emulates + // clicking on the settings icon) + webDriverGee.findElementByClassName("settings-menu-button").click(); + // Get the Div that is the parent of the one with text that contains + // Autocomplete + RemoteWebElement autocompleteButton = (RemoteWebElement) webDriverGee + .findElementByXPath("//div[contains(text(), \"Autocomplete\")]/.."); + + if (isAutocompleChecked(autocompleteButton)) { + // Disable the Autocomplete of special characters + autocompleteButton.click(); + } - public Date getTwoMinutesAgo() { - Calendar cal = Calendar.getInstance(); - cal.add(Calendar.MINUTE, -2); - return cal.getTime(); } - private void setKmlResponse(HttpServletResponse response, String kmlCode, SimpleDateFormat dateFormat) throws IOException { - response.setHeader("Content-Type", "application/vnd.google-earth.kml+xml"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Date", dateFormat.format(new Date())); //$NON-NLS-1$ - response.setHeader("Content-Length", Integer.toString( kmlCode.getBytes( StandardCharsets.UTF_8 ).length ) ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - response.getOutputStream().write(kmlCode.getBytes( StandardCharsets.UTF_8 )); //$NON-NLS-1$ - response.getOutputStream().flush(); - response.getOutputStream().close(); + public boolean isAutocompleChecked(RemoteWebElement autocompleteButton) { + String buttonChecked = autocompleteButton.getAttribute("aria-checked"); + return buttonChecked.equals("true"); } + private void loadCodeEditorScript(RemoteWebDriver webDriverCodeEditor) { + this.webDriverGee = webDriverCodeEditor; + Thread loadGee = new Thread( + "Opening GEE Playground " + (placemarkObject != null ? placemarkObject.toString() : "")) { + @Override + public void run() { + try { + if (!isCodeEditorShowing()) { + // Open GEE Code Editor + if (!browserService.isDriverWorking(webDriverGee) || webDriverGee.getCurrentUrl() == null + || !webDriverGee.getCurrentUrl().contains("google")) { + webDriverGee = browserService.navigateTo(localPropertiesService.getGeePlaygoundUrl(), + webDriverGee); + browserService.setWebDriverGeeCodeEditor(webDriverGee); + } + // Initially the login page appears! + while (!isCodeEditorShowing()) { + sleep(2000); + } + } + runScript(); + } catch (final NoSuchElementException e) { + // This is a well known exception. Down-grade if to warning + logger.warn("Error when opening Earth Engine browser window. Known problem", e); + } catch (final Exception e) { + // This is a well known exception. + logger.error("Error when opening Earth Engine browser window", e); + } + } + }; + loadGee.start(); + } } From 21ecd8e81da0e20b882f01cc5357d23d9a62a51b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:38 +0100 Subject: [PATCH 1063/1620] New translations ExportType.java (English) --- .../earth/app/view/Messages_en.properties | 236 ++++-------------- 1 file changed, 55 insertions(+), 181 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 3a7a63a8e1..7633aaf9fd 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,181 +1,55 @@ -package org.openforis.collect.earth.app.server; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.IOException; -import java.io.StringWriter; -import java.io.UnsupportedEncodingException; -import java.io.Writer; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; - -import javax.servlet.http.HttpServletResponse; - -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.desktop.ServerController; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; -import org.openforis.collect.model.CollectRecordSummary; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; - -import freemarker.cache.FileTemplateLoader; -import freemarker.template.Configuration; -import freemarker.template.Template; -import freemarker.template.TemplateException; -import freemarker.template.Version; - -/** - * Servlet called by the NetworkLink which tries to update the status of the placemark icons every few seconds. - * - * @author Alfonso Sanchez-Paus Diaz - * - */ -@Controller -public class PlacemarkUpdateServlet { - - private static final String STANDARD_KML_FOR_UPDATES_FILENAME = "updateIcons.fmt"; //$NON-NLS-1$ - private static final String GENERIC_KML_FOR_UPDATES = "resources/" + STANDARD_KML_FOR_UPDATES_FILENAME; //$NON-NLS-1$ - private final Logger logger = LoggerFactory.getLogger(PlacemarkUpdateServlet.class); - - @Autowired - private EarthSurveyService earthSurveyService; - - @Autowired - private LocalPropertiesService localPropertiesService; - - private final Configuration cfg = new Configuration( new Version("2.3.23")); - - private Template template; - - - private String getKmlFromTemplate( Map data) throws IOException { - - intializeTemplate(); - // Console output - final StringWriter fw = new StringWriter(); - final Writer out = new BufferedWriter(fw); - try { - // Add date to avoid caching - template.process(data, out); - } catch (final TemplateException e) { - logger.error("Error when producing starter KML from template", e); //$NON-NLS-1$ - } finally { - out.flush(); - fw.close(); - } - - return fw.toString(); - - } - - private void intializeTemplate() throws IOException { - if (template == null) { - - // first check if there is a custom update template included on the customization that can be used for the project - - String possibleUpdateKmlLocation = localPropertiesService.getProjectFolder() + File.separatorChar + STANDARD_KML_FOR_UPDATES_FILENAME; - File possibleKmlFile = new File( possibleUpdateKmlLocation ); - - if( possibleKmlFile.exists() ){ - /* - * We need to create a new TemplateLoader and use it momentarily as by default the Template loader - * uses the basedir of the project which causes problems when loading file from outside the project folder - */ - cfg.setTemplateLoader( new FileTemplateLoader( new File( possibleKmlFile.getParent() ) ) ); - template = cfg.getTemplate( STANDARD_KML_FOR_UPDATES_FILENAME ); - - }else{ - // No specific updatekml template found on the project folder, fall back to the general one - // Load template from the resource folder - cfg.setTemplateLoader( new FileTemplateLoader( new File( "." ) ) ); - template = cfg.getTemplate(GENERIC_KML_FOR_UPDATES); - } - } - } - - - - /** - * Responds with KML code that causes the Google Earth placemark icon and overlay image to update is status ( filled/not-filled/partially-filled) - * - * @param response The HTTP response object - * @param lastUpdate The datetime when this servlet was last called by the Google Earth network link. - * The date that this request was last sent. This way we get the placemarks that have changed status since the last time this was - * checked. - */ - @GetMapping("/placemarkUpdate") - public void getUpdatePlacemark(HttpServletResponse response, @RequestParam(value = "lastUpdate", required = false) String lastUpdate) { - - try { - - final SimpleDateFormat dateFormat = new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH ); - Date lastUpdateDate = null; - if (lastUpdate != null && lastUpdate.length() > 0) { - lastUpdateDate = dateFormat.parse(lastUpdate); - }else{ - lastUpdateDate = getTwoMinutesAgo(); - } - - List lastUpdatedRecords = null; - try { - lastUpdatedRecords = earthSurveyService.getRecordSummariesSavedSince(lastUpdateDate); - } catch (Exception e) { - lastUpdatedRecords = new ArrayList<>(); - logger.error("Error fetching information about the records updated after : " + lastUpdateDate , e); //$NON-NLS-1$ - } - - final Map data = new HashMap<>(); - data.put("host", ServerController.getHostAddress(localPropertiesService.getHost(), localPropertiesService.getLocalPort())); //$NON-NLS-1$ - data.put("date", getUpdateFromDate(dateFormat) ); // Keep for historical reasons //$NON-NLS-1$ - data.put("lastUpdateDateTime", getUpdateFromDate(dateFormat) ); //$NON-NLS-1$ - data.put("uniqueId", FreemarkerTemplateUtils.randInt(10000, 5000000) ); //$NON-NLS-1$ - data.put("kmlGeneratedOn", localPropertiesService.getGeneratedOn()); //$NON-NLS-1$ - data.put("placemark_ids", earthSurveyService.getPlacemarksId(lastUpdatedRecords)); //$NON-NLS-1$ - - setKmlResponse(response, getKmlFromTemplate(data), dateFormat); - - } catch (final ParseException e) { - logger.error("Error in the lastUpdate date format : " + lastUpdate, e); //$NON-NLS-1$ - } catch (final Exception e) { - logger.error("Error generating the update KML.", e); //$NON-NLS-1$ - } - - } - - private String getUpdateFromDate(final SimpleDateFormat dateFormat) throws UnsupportedEncodingException { - Date twoMinutesAgo = getTwoMinutesAgo(); - return URLEncoder.encode(dateFormat.format(twoMinutesAgo), StandardCharsets.UTF_8.name() ); //$NON-NLS-1$ - } - - public Date getTwoMinutesAgo() { - Calendar cal = Calendar.getInstance(); - cal.add(Calendar.MINUTE, -2); - return cal.getTime(); - } - - private void setKmlResponse(HttpServletResponse response, String kmlCode, SimpleDateFormat dateFormat) throws IOException { - response.setHeader("Content-Type", "application/vnd.google-earth.kml+xml"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Date", dateFormat.format(new Date())); //$NON-NLS-1$ - response.setHeader("Content-Length", Integer.toString( kmlCode.getBytes( StandardCharsets.UTF_8 ).length ) ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - response.getOutputStream().write(kmlCode.getBytes( StandardCharsets.UTF_8 )); //$NON-NLS-1$ - response.getOutputStream().flush(); - response.getOutputStream().close(); - } - -} +package org.openforis.collect.earth.app.service; + +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.desktop.ServerController; + +public enum ExportType { + SAIKU( + ServerController.SAIKU_RDB_SUFFIX, + "Saiku", + "SaikuDataFolder", + EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + ServerController.SAIKU_RDB_SUFFIX, + EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU + ), + IPCC( + ServerController.IPCC_RDB_SUFFIX, + "Ipcc", + "IPCCDataFolder", + EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + ServerController.IPCC_RDB_SUFFIX, + EarthConstants.POSTGRES_RDB_SCHEMA_IPCC + ); + + private String dbSuffix; + private String prefix; + private String dataFolder; + private String dbFileName; + private String rdbSchema; + + ExportType(String dbSuffix, String prefix, String dataFolder, String dbFileName, String rdbSchema ) { + this.dbSuffix = dbSuffix; + this.prefix = prefix; + this.dbFileName = dbFileName; + this.rdbSchema = rdbSchema; + } + + public String getDbSuffix() { + return dbSuffix; + } + + public String getPrefix() { + return prefix; + } + + public String getDataFolder() { + return dataFolder; + } + + public String getDbFileName() { + return dbFileName; + } + + public String getRdbSchema() { + return rdbSchema; + } + +} \ No newline at end of file From db53aa069b4cae56939537f97d3877a0016b7b72 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:39 +0100 Subject: [PATCH 1064/1620] New translations IPCCGeneratorService.java (Spanish) --- .../earth/app/view/Messages_es.properties | 344 ++++-------------- 1 file changed, 65 insertions(+), 279 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index c2259f5db0..c1b9c5db00 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,319 +1,105 @@ package org.openforis.collect.earth.app.service; -import java.awt.Toolkit; -import java.awt.datatransfer.Clipboard; -import java.awt.datatransfer.StringSelection; -import java.io.File; -import java.io.IOException; -import java.net.URISyntaxException; -import java.net.URL; -import java.nio.charset.StandardCharsets; -import java.util.NoSuchElementException; - -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; -import org.openqa.selenium.By; -import org.openqa.selenium.JavascriptExecutor; -import org.openqa.selenium.Keys; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.remote.RemoteWebDriver; -import org.openqa.selenium.remote.RemoteWebElement; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.ipcc.IPCCGenerator; +import org.openforis.collect.earth.ipcc.IPCCGeneratorException; +import org.openforis.collect.earth.ipcc.RdbExportException; +import org.openforis.collect.model.CollectSurvey; +import org.openforis.collect.relational.CollectRDBPublisher; +import org.openforis.collect.relational.CollectRdbException; +import org.openforis.idm.metamodel.NodeDefinition; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import liquibase.repackaged.org.apache.commons.lang3.SystemUtils; - - @Component -public class CodeEditorHandlerThread { - private static final String RUN_SCRIPT_BUTTON = "button.run-button"; - private static final String RESET_SCRIPT_BUTTON = "button.reset-button"; - private SimplePlacemarkObject placemarkObject; - - private RemoteWebDriver webDriverGee; +public class IPCCGeneratorService extends GenerateDatabase{ @Autowired - private BrowserService browserService; - private Logger logger = LoggerFactory.getLogger(CodeEditorHandlerThread.class); + RDBExporter rdbExporter; + + @Autowired + CollectRDBPublisher collectRDBPublisher; @Autowired - private GeolocalizeMapService geoLocalizeTemplateService; + EarthSurveyService earthSurveyService; @Autowired - private LocalPropertiesService localPropertiesService; + public LocalPropertiesService localPropertiesService; - public boolean isCodeEditorShowing() { - return BrowserService.isCssElementPresent(RUN_SCRIPT_BUTTON, webDriverGee); - } + @Autowired + BrowserService browserService; - public void runScript() throws IOException, URISyntaxException, InterruptedException { + @Autowired + private IPCCGenerator ipccGenerator; + + final Logger logger = LoggerFactory.getLogger(IPCCGeneratorService.class); + public void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws RdbExportException { try { - WebElement resetButton = webDriverGee.findElementByCssSelector(RESET_SCRIPT_BUTTON); - - forceClick( resetButton ); - - URL fileWithScript = geoLocalizeTemplateService.getTemporaryUrl(placemarkObject, getGeeCodeEditorTemplate()); - - WebElement textArea = webDriverGee.findElement(By.className("ace_text-input")); - - String contents = FileUtils.readFileToString(new File(fileWithScript.toURI()), StandardCharsets.UTF_8 ); - - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { - sendThroughKeys(textArea, contents); - - } else { - sendThroughClipboard(textArea, contents); - try { - // Fix bug provoked by antivirus not accepting the control characters sent by Selenium - WebElement element = webDriverGee.findElement(By.className("ace_line") ); - if( element!= null && element.getAttribute("value").trim().equals("av") ) { - sendThroughKeys(textArea, contents); - } - } catch (Exception e) { - logger.warn("Error while refreshing code editor", e); - } - } - - Thread.sleep(1000); - WebElement runButton = webDriverGee.findElementByCssSelector(RUN_SCRIPT_BUTTON); - forceClick( runButton ); - } catch (NoSuchElementException e) { try { - // retry - Thread.sleep(1000); - WebElement runButton = webDriverGee.findElementByCssSelector(RUN_SCRIPT_BUTTON); - forceClick( runButton ); - }catch (Exception e2) { - // TODO: handle exception - } - } - - } - - private void sendThroughClipboard(WebElement textArea, String contents) { - Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); - StringSelection clipboardtext = new StringSelection(contents); - clipboard.setContents(clipboardtext, null); - Keys controlChar = Keys.CONTROL; - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { - controlChar = Keys.COMMAND; - } - textArea.sendKeys(Keys.chord(controlChar, "a")); - textArea.sendKeys(Keys.chord(controlChar, "v")); - } - - private void sendThroughKeys(WebElement textArea, String contents) - throws InterruptedException { - // Command key (apple key) is not working on Chrome on Mac. Try with the right click - // This is not going to be fixed by Selenium - - // Remove comments so it is faster to send the text! - String noComments = removeComments(contents); - - // Clear the code area - WebElement clearButton = webDriverGee.findElementByCssSelector(RESET_SCRIPT_BUTTON); - forceClick( clearButton ); - StringBuilder fixedScriptForMac = new StringBuilder(); - String[] lines = noComments.split("\\n"); - for (String line : lines) { - // Send the content of the script - String trimmedLine = line.trim(); - - // Add Spaces after "{" so we avoid the automatic closing of the method by GEE - // Playground JS - trimmedLine = trimmedLine.replace("{", "{ "); - - if (!StringUtils.isBlank(trimmedLine)) { - fixedScriptForMac = fixedScriptForMac.append(trimmedLine).append("\n"); - } - } - - fixedScriptForMac.append("//THE END"); // Don't remove this!!! this way we mark the point where there should be no trailing character removal - Keys controlChar = Keys.CONTROL; - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { - controlChar = Keys.COMMAND; - } - textArea.sendKeys(Keys.chord(controlChar, "a")); - textArea.sendKeys(fixedScriptForMac); -/* - Thread.sleep(500); - // Fix the extra characters added by removing the last 10 chars ( this is a bug from Selenium! ) - textArea.sendKeys(Keys.PAGE_DOWN); - Thread.sleep(500); - textArea.sendKeys(Keys.PAGE_DOWN); - */ - } - - private void forceClick( WebElement element ) { - JavascriptExecutor js = webDriverGee; - js.executeScript("arguments[0].click();", element); - } - - public String removeComments(String contents) { - - String wholeCode = contents; - wholeCode = wholeCode.replace("http://", ""); - wholeCode = wholeCode.replace("https://", ""); - wholeCode = wholeCode.replace("\r", ""); + if ( + (localPropertiesService.isUsingSqliteDB() && !getZippedProjectDB( ExportType.IPCC ).exists()) + || + isRefreshDatabase() + ) { + + // The user clicked on the option to refresh the database, or there is no + // previous copy of the Saiku DB + // Generate the DB file + ipccGenerator.generateRDB( earthSurveyService.getCollectSurvey(), progressListener); + + try { + // Save the DB file in a zipped file to extends GenerateDatabase keep for the next usages + replaceZippedProjectDB( ExportType.IPCC ); + } catch (Exception e) { + logger.error("Error while refreshing the Zipped content of the project IPCC DB", e); + } - StringBuilder noComments = new StringBuilder(""); - int indexComments = contents.indexOf("//"); - if (indexComments != -1) { - while (indexComments >= 0) { - int endOfLine = contents.indexOf('\n', indexComments); - if (endOfLine != -1) - indexComments = contents.indexOf("//", endOfLine + 2); - else { - break; + } else if (getZippedProjectDB(ExportType.IPCC).exists()) { + // If the zipped version of the project exists ( and the user clicked on the + // option to not refresh it) then restore this last version of the data + if (localPropertiesService.isUsingSqliteDB()) { + restoreZippedProjectDB(ExportType.IPCC); + } } + + ipccGenerator.produceOutputs( earthSurveyService.getCollectSurvey(), progressListener ); - if (indexComments != -1) - noComments = noComments.append(contents.substring(endOfLine, indexComments)); - else - noComments = noComments.append(contents.substring(endOfLine)); - } - return noComments.toString(); - } else { - return wholeCode; - } - } + } catch (final IPCCGeneratorException e) { + logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ + } - /** - * Get the GEE Playground script that should be used. There is an standard one - * that resides in resources/eePlaygroundScript.fmt but a project might have its - * own script. - * - * @return The generic script in the resources folder or the file called - * eePlaygroundScript.fmt in the same folder where the current project - * file resides - */ - private String getGeeCodeEditorTemplate() { - - String projectPlaygroundScript = getProjectGeeScript(); - if (projectPlaygroundScript != null) { - return projectPlaygroundScript; - } else { - return GeolocalizeMapService.FREEMARKER_GEE_CODE_EDITOR_TEMPLATE; // New format name since version 1.6.20 + } catch (final CollectRdbException e) { + logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ } - } - /** - * @return The path to the GEE Code Editor generic script or the one that is - * specified in the project folder if it exists. - */ - private String getProjectGeeScript() { - // Is there a "eePlaygroundScript.fmt" file in the same folder than in the - // metadata file folder? - File projectGeePlayground = new File(localPropertiesService.getProjectFolder() + File.separatorChar - + GeolocalizeMapService.FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME); - - // Is there a "eeCodeEditorScript.fmt" file in the same folder than in the - // metadata file folder? NEW NAME AFTER 12/2017!!! - File projectGeeCodeEditor = new File(localPropertiesService.getProjectFolder() + File.separatorChar - + GeolocalizeMapService.FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME); - String geeFilePath = null; - if (projectGeeCodeEditor.exists()) { // The new format name takes precedence - geeFilePath = projectGeeCodeEditor.getAbsolutePath(); - } else if (projectGeePlayground.exists()) { - geeFilePath = projectGeePlayground.getAbsolutePath(); - } - return geeFilePath; - } - public void loadCodeEditorScript(SimplePlacemarkObject placemarkObject, RemoteWebDriver webDriverGeePlayground) { - this.placemarkObject = placemarkObject; - loadCodeEditorScript(webDriverGeePlayground); + public static boolean surveyContains(String nodeName, CollectSurvey survey) { + NodeDefinition nodeDefForNAme = survey.getSchema().findNodeDefinition( nodeDef -> nodeDef.getName().equals(nodeName) ); + return nodeDefForNAme != null; } - public void disableCodeEditorAutocomplete(RemoteWebDriver webDriverCodeEditor) { - this.webDriverGee = webDriverCodeEditor; - try { - if (!isCodeEditorShowing()) { - // Open GEE Playground - if (!browserService.isDriverWorking(webDriverGee) || webDriverGee.getCurrentUrl() == null - || !webDriverGee.getCurrentUrl().contains("google")) { - webDriverGee = browserService.navigateTo(localPropertiesService.getGeePlaygoundUrl(), webDriverGee); - browserService.setWebDriverGeeCodeEditor(webDriverGee); - } - - // Initially the login page appears! - while (!isCodeEditorShowing()) { // 5 minutes a 2 seconds == 30 * 5 = 150 - Thread.sleep(2000); - } - - } else { - disableAutoComplete(); - } - } catch (final NoSuchElementException e) { - // This is a well known exception. Down-grade if to warning - logger.warn("Error when opening Earth Engine browser window. Known problem", e); - } catch (final Exception e) { - // This is a well known exception. - logger.error("Error when opening Earth Engine browser window", e); - } + @Override + public LocalPropertiesService getLocalPropertiesService() { + return localPropertiesService; } - private void disableAutoComplete() { - // Display the settings in Google Earth Engine Code Editor (this emulates - // clicking on the settings icon) - webDriverGee.findElementByClassName("settings-menu-button").click(); - // Get the Div that is the parent of the one with text that contains - // Autocomplete - RemoteWebElement autocompleteButton = (RemoteWebElement) webDriverGee - .findElementByXPath("//div[contains(text(), \"Autocomplete\")]/.."); - - if (isAutocompleChecked(autocompleteButton)) { - // Disable the Autocomplete of special characters - autocompleteButton.click(); - } - + @Override + public EarthSurveyService getEarthSurveyService() { + return earthSurveyService; } - public boolean isAutocompleChecked(RemoteWebElement autocompleteButton) { - String buttonChecked = autocompleteButton.getAttribute("aria-checked"); - return buttonChecked.equals("true"); + @Override + public RDBExporter getRdbExporter() { + return rdbExporter; } - private void loadCodeEditorScript(RemoteWebDriver webDriverCodeEditor) { - this.webDriverGee = webDriverCodeEditor; - Thread loadGee = new Thread( - "Opening GEE Playground " + (placemarkObject != null ? placemarkObject.toString() : "")) { - @Override - public void run() { - try { - if (!isCodeEditorShowing()) { - // Open GEE Code Editor - if (!browserService.isDriverWorking(webDriverGee) || webDriverGee.getCurrentUrl() == null - || !webDriverGee.getCurrentUrl().contains("google")) { - webDriverGee = browserService.navigateTo(localPropertiesService.getGeePlaygoundUrl(), - webDriverGee); - browserService.setWebDriverGeeCodeEditor(webDriverGee); - } - // Initially the login page appears! - while (!isCodeEditorShowing()) { - sleep(2000); - } - } - runScript(); - } catch (final NoSuchElementException e) { - // This is a well known exception. Down-grade if to warning - logger.warn("Error when opening Earth Engine browser window. Known problem", e); - } catch (final Exception e) { - // This is a well known exception. - logger.error("Error when opening Earth Engine browser window", e); - } - } - }; - loadGee.start(); - } -} +} \ No newline at end of file From 80c2bf26429dfea384005079b6ac219bdfb7619f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:41 +0100 Subject: [PATCH 1065/1620] New translations IPCCGeneratorService.java (French) --- .../earth/app/view/Messages_fr.properties | 230 ++++++------------ 1 file changed, 77 insertions(+), 153 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 3a7a63a8e1..c1b9c5db00 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,181 +1,105 @@ -package org.openforis.collect.earth.app.server; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.IOException; -import java.io.StringWriter; -import java.io.UnsupportedEncodingException; -import java.io.Writer; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; - -import javax.servlet.http.HttpServletResponse; - -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.desktop.ServerController; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; -import org.openforis.collect.model.CollectRecordSummary; +package org.openforis.collect.earth.app.service; + +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.ipcc.IPCCGenerator; +import org.openforis.collect.earth.ipcc.IPCCGeneratorException; +import org.openforis.collect.earth.ipcc.RdbExportException; +import org.openforis.collect.model.CollectSurvey; +import org.openforis.collect.relational.CollectRDBPublisher; +import org.openforis.collect.relational.CollectRdbException; +import org.openforis.idm.metamodel.NodeDefinition; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; - -import freemarker.cache.FileTemplateLoader; -import freemarker.template.Configuration; -import freemarker.template.Template; -import freemarker.template.TemplateException; -import freemarker.template.Version; - -/** - * Servlet called by the NetworkLink which tries to update the status of the placemark icons every few seconds. - * - * @author Alfonso Sanchez-Paus Diaz - * - */ -@Controller -public class PlacemarkUpdateServlet { - - private static final String STANDARD_KML_FOR_UPDATES_FILENAME = "updateIcons.fmt"; //$NON-NLS-1$ - private static final String GENERIC_KML_FOR_UPDATES = "resources/" + STANDARD_KML_FOR_UPDATES_FILENAME; //$NON-NLS-1$ - private final Logger logger = LoggerFactory.getLogger(PlacemarkUpdateServlet.class); +import org.springframework.stereotype.Component; +@Component +public class IPCCGeneratorService extends GenerateDatabase{ + + @Autowired + RDBExporter rdbExporter; + @Autowired - private EarthSurveyService earthSurveyService; + CollectRDBPublisher collectRDBPublisher; @Autowired - private LocalPropertiesService localPropertiesService; + EarthSurveyService earthSurveyService; - private final Configuration cfg = new Configuration( new Version("2.3.23")); + @Autowired + public LocalPropertiesService localPropertiesService; - private Template template; + @Autowired + BrowserService browserService; + @Autowired + private IPCCGenerator ipccGenerator; + + final Logger logger = LoggerFactory.getLogger(IPCCGeneratorService.class); - private String getKmlFromTemplate( Map data) throws IOException { + public void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws RdbExportException { - intializeTemplate(); - // Console output - final StringWriter fw = new StringWriter(); - final Writer out = new BufferedWriter(fw); try { - // Add date to avoid caching - template.process(data, out); - } catch (final TemplateException e) { - logger.error("Error when producing starter KML from template", e); //$NON-NLS-1$ - } finally { - out.flush(); - fw.close(); - } - - return fw.toString(); - - } - - private void intializeTemplate() throws IOException { - if (template == null) { - - // first check if there is a custom update template included on the customization that can be used for the project - String possibleUpdateKmlLocation = localPropertiesService.getProjectFolder() + File.separatorChar + STANDARD_KML_FOR_UPDATES_FILENAME; - File possibleKmlFile = new File( possibleUpdateKmlLocation ); - - if( possibleKmlFile.exists() ){ - /* - * We need to create a new TemplateLoader and use it momentarily as by default the Template loader - * uses the basedir of the project which causes problems when loading file from outside the project folder - */ - cfg.setTemplateLoader( new FileTemplateLoader( new File( possibleKmlFile.getParent() ) ) ); - template = cfg.getTemplate( STANDARD_KML_FOR_UPDATES_FILENAME ); + try { - }else{ - // No specific updatekml template found on the project folder, fall back to the general one - // Load template from the resource folder - cfg.setTemplateLoader( new FileTemplateLoader( new File( "." ) ) ); - template = cfg.getTemplate(GENERIC_KML_FOR_UPDATES); - } + if ( + (localPropertiesService.isUsingSqliteDB() && !getZippedProjectDB( ExportType.IPCC ).exists()) + || + isRefreshDatabase() + ) { + + // The user clicked on the option to refresh the database, or there is no + // previous copy of the Saiku DB + // Generate the DB file + ipccGenerator.generateRDB( earthSurveyService.getCollectSurvey(), progressListener); + + try { + // Save the DB file in a zipped file to extends GenerateDatabase keep for the next usages + replaceZippedProjectDB( ExportType.IPCC ); + } catch (Exception e) { + logger.error("Error while refreshing the Zipped content of the project IPCC DB", e); + } + + } else if (getZippedProjectDB(ExportType.IPCC).exists()) { + // If the zipped version of the project exists ( and the user clicked on the + // option to not refresh it) then restore this last version of the data + if (localPropertiesService.isUsingSqliteDB()) { + restoreZippedProjectDB(ExportType.IPCC); + } + } + + ipccGenerator.produceOutputs( earthSurveyService.getCollectSurvey(), progressListener ); + + } catch (final IPCCGeneratorException e) { + logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ + } + + } catch (final CollectRdbException e) { + logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ } } - /** - * Responds with KML code that causes the Google Earth placemark icon and overlay image to update is status ( filled/not-filled/partially-filled) - * - * @param response The HTTP response object - * @param lastUpdate The datetime when this servlet was last called by the Google Earth network link. - * The date that this request was last sent. This way we get the placemarks that have changed status since the last time this was - * checked. - */ - @GetMapping("/placemarkUpdate") - public void getUpdatePlacemark(HttpServletResponse response, @RequestParam(value = "lastUpdate", required = false) String lastUpdate) { - - try { - - final SimpleDateFormat dateFormat = new SimpleDateFormat(EarthConstants.DATE_FORMAT_HTTP, Locale.ENGLISH ); - Date lastUpdateDate = null; - if (lastUpdate != null && lastUpdate.length() > 0) { - lastUpdateDate = dateFormat.parse(lastUpdate); - }else{ - lastUpdateDate = getTwoMinutesAgo(); - } - - List lastUpdatedRecords = null; - try { - lastUpdatedRecords = earthSurveyService.getRecordSummariesSavedSince(lastUpdateDate); - } catch (Exception e) { - lastUpdatedRecords = new ArrayList<>(); - logger.error("Error fetching information about the records updated after : " + lastUpdateDate , e); //$NON-NLS-1$ - } - - final Map data = new HashMap<>(); - data.put("host", ServerController.getHostAddress(localPropertiesService.getHost(), localPropertiesService.getLocalPort())); //$NON-NLS-1$ - data.put("date", getUpdateFromDate(dateFormat) ); // Keep for historical reasons //$NON-NLS-1$ - data.put("lastUpdateDateTime", getUpdateFromDate(dateFormat) ); //$NON-NLS-1$ - data.put("uniqueId", FreemarkerTemplateUtils.randInt(10000, 5000000) ); //$NON-NLS-1$ - data.put("kmlGeneratedOn", localPropertiesService.getGeneratedOn()); //$NON-NLS-1$ - data.put("placemark_ids", earthSurveyService.getPlacemarksId(lastUpdatedRecords)); //$NON-NLS-1$ - - setKmlResponse(response, getKmlFromTemplate(data), dateFormat); - - } catch (final ParseException e) { - logger.error("Error in the lastUpdate date format : " + lastUpdate, e); //$NON-NLS-1$ - } catch (final Exception e) { - logger.error("Error generating the update KML.", e); //$NON-NLS-1$ - } - + public static boolean surveyContains(String nodeName, CollectSurvey survey) { + NodeDefinition nodeDefForNAme = survey.getSchema().findNodeDefinition( nodeDef -> nodeDef.getName().equals(nodeName) ); + return nodeDefForNAme != null; } - private String getUpdateFromDate(final SimpleDateFormat dateFormat) throws UnsupportedEncodingException { - Date twoMinutesAgo = getTwoMinutesAgo(); - return URLEncoder.encode(dateFormat.format(twoMinutesAgo), StandardCharsets.UTF_8.name() ); //$NON-NLS-1$ + + @Override + public LocalPropertiesService getLocalPropertiesService() { + return localPropertiesService; } - public Date getTwoMinutesAgo() { - Calendar cal = Calendar.getInstance(); - cal.add(Calendar.MINUTE, -2); - return cal.getTime(); + @Override + public EarthSurveyService getEarthSurveyService() { + return earthSurveyService; } - private void setKmlResponse(HttpServletResponse response, String kmlCode, SimpleDateFormat dateFormat) throws IOException { - response.setHeader("Content-Type", "application/vnd.google-earth.kml+xml"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Cache-Control", "max-age=30"); //$NON-NLS-1$ //$NON-NLS-2$ - response.setHeader("Date", dateFormat.format(new Date())); //$NON-NLS-1$ - response.setHeader("Content-Length", Integer.toString( kmlCode.getBytes( StandardCharsets.UTF_8 ).length ) ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - response.getOutputStream().write(kmlCode.getBytes( StandardCharsets.UTF_8 )); //$NON-NLS-1$ - response.getOutputStream().flush(); - response.getOutputStream().close(); + @Override + public RDBExporter getRdbExporter() { + return rdbExporter; } -} +} \ No newline at end of file From a14eda6aea9231d18e6655b4af1c451e27fd4ddd Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:42 +0100 Subject: [PATCH 1066/1620] New translations GeolocalizeMapService.java (English) --- .../earth/app/view/Messages_en.properties | 242 ++++++++++++++---- 1 file changed, 187 insertions(+), 55 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 7633aaf9fd..4ed72d856d 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,55 +1,187 @@ -package org.openforis.collect.earth.app.service; - -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.desktop.ServerController; - -public enum ExportType { - SAIKU( - ServerController.SAIKU_RDB_SUFFIX, - "Saiku", - "SaikuDataFolder", - EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + ServerController.SAIKU_RDB_SUFFIX, - EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU - ), - IPCC( - ServerController.IPCC_RDB_SUFFIX, - "Ipcc", - "IPCCDataFolder", - EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + ServerController.IPCC_RDB_SUFFIX, - EarthConstants.POSTGRES_RDB_SCHEMA_IPCC - ); - - private String dbSuffix; - private String prefix; - private String dataFolder; - private String dbFileName; - private String rdbSchema; - - ExportType(String dbSuffix, String prefix, String dataFolder, String dbFileName, String rdbSchema ) { - this.dbSuffix = dbSuffix; - this.prefix = prefix; - this.dbFileName = dbFileName; - this.rdbSchema = rdbSchema; - } - - public String getDbSuffix() { - return dbSuffix; - } - - public String getPrefix() { - return prefix; - } - - public String getDataFolder() { - return dataFolder; - } - - public String getDbFileName() { - return dbFileName; - } - - public String getRdbSchema() { - return rdbSchema; - } - -} \ No newline at end of file +package org.openforis.collect.earth.app.service; + +import java.io.File; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; +import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import freemarker.template.TemplateException; + +/** + * Customizes a Bing Map page to open zoomed into a coordinate. The HTML page is + * created in a temporary file and its URL is returned so that it can be opened + * in a browser. A freemarker template that contains the javascript code to + * customize the Bing Map is used and the parameters for the specific + * coordinates are applied to it. This service uses the same code than the KML + * generator to get the plot sample deign as chosen through the configuration by + * the user. + * + * @author Alfonso Sanchez-Paus Diaz + * + */ +@Component +public class GeolocalizeMapService { + + private static final String RESOURCES_FOLDER = "resources"; + + /** + * The file that contains the freemarker template used to produce the Bing Maps + * code. + */ + public static final String FREEMARKER_BING_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectBing.fmt"; + + public static final String FREEMARKER_BAIDU_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectBaidu.fmt"; + + public static final String FREEMARKER_PLANET_MONTHLY_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectPlanetMonthlyHtml.fmt"; + + public static final String FREEMARKER_PLANET_NICFI_ARGUMENTS = RESOURCES_FOLDER + File.separator + "collectPlanetNicfiTxt.fmt"; + + public static final String FREEMARKER_PLANET_DAILY_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectPlanetHtml.fmt"; + + public static final String FREEMARKER_PLANET_URL_TEMPLATE = RESOURCES_FOLDER + File.separator + + "collectPlanetUrl.fmt"; + + /** + * The file that contains the freemarker template used to produce the Yandex + * Maps code. + */ + public static final String FREEMARKER_YANDEX_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + + "collectYandex.fmt"; + + public static final String FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME = "eePlaygroundScript.fmt"; + public static final String FREEMARKER_GEE_CODE_EDITOR_TEMPLATE_FILE_NAME = "eeCodeEditorScript.fmt"; + + /** + * The file that contains the freemarker template used to produce script that is + * run in GEE Code Editor. + */ + public static final String FREEMARKER_GEE_PLAYGROUND_TEMPLATE = RESOURCES_FOLDER + File.separator + + FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME; + public static final String FREEMARKER_GEE_CODE_EDITOR_TEMPLATE = RESOURCES_FOLDER + File.separator + + FREEMARKER_GEE_CODE_EDITOR_TEMPLATE_FILE_NAME; + + public static final String FREEMARKER_HERE_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + + "collectHereMaps.fmt"; + + public static final String FREEMARKER_STREET_VIEW_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + + "collectStreetView.fmt"; + @Autowired + LocalPropertiesService localPropertiesService; + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + KmlGeneratorService kmlGeneratorService; + + public void addDatesForImages(final Map data) { + SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-MM-dd"); + Date todayDate = new Date(); + String dateAsExpected = dt1.format(todayDate); + data.put("todayDate", dateAsExpected); + + Calendar cal = Calendar.getInstance(); + cal.setTime(todayDate); + cal.add(Calendar.YEAR, -1); + + data.put("oneYearAgoDate", dt1.format(cal.getTime())); + + } + + private File applyData(Map data, String freemarkerTemplateFile) + throws IOException, TemplateException { + + final File templateFileSrc = new File(freemarkerTemplateFile); + + final File tempFileDst = File.createTempFile("selenium", ".html"); + tempFileDst.deleteOnExit(); + + FreemarkerTemplateUtils.applyTemplate(templateFileSrc, tempFileDst, data); + + return tempFileDst; + + } + + public Map getPlacemarkData(SimplePlacemarkObject placemarkObject) { + final Map data = new HashMap<>(); + data.put("placemark", placemarkObject); + return data; + } + + /** + * Produces a temporary file with the necessary HTML code to show the plot in + * Bing Maps + * + * @param placemarkObject + * The object containing information of the placemark. + * @param freemarkerTemplate + * The path to the freemarker template that is used to produce the + * file. + * @return The URL to the temporary file that can be used to load it in a + * browser. + */ + public URL getTemporaryUrl(SimplePlacemarkObject placemarkObject, String freemarkerTemplate) { + final Map data = getPlacemarkData(placemarkObject); + addDatesForImages(data); + return processTemplateWithData(freemarkerTemplate, data); + } + + /** + * Produces a URL using Planet Labs explorer expected format + * + * @param placemarkObject + * The data of the plot. + * @param freemarkerTemplate + * The freemarker template file to use + * @param extraData + * Variable listof key value strings + * @return The URL to the temporary file that can be used to load it in a + * browser. + */ + public URL getUrlToFreemarkerOutput(SimplePlacemarkObject placemarkObject, String freemarkerTemplate, + String... extraData) { + + final Map data = getPlacemarkData(placemarkObject); + + if( extraData !=null) { + for (int i = 0; i < extraData.length; i = i+2) { + data.put(extraData[i], extraData[i+1]); + } + } + return processTemplateWithData(freemarkerTemplate, data); + + } + + + private URL processTemplateWithData(String freemarkerTemplate, final Map data) { + File transformedHtml = null; + try { + transformedHtml = applyData(data, freemarkerTemplate); + } catch (final Exception e) { + logger.error("Exception when applying template " + freemarkerTemplate + "with data : " + data.toString(), + e); + } + if (transformedHtml != null) { + try { + return transformedHtml.toURI().toURL(); + } catch (MalformedURLException e) { + logger.error("Error generating URL for File " + transformedHtml.getAbsolutePath()); + return null; + } + } else { + logger.error("No Bing map HTML generated."); + return null; + } + } +} From d083ab0e19500475296d4c97c0242fa91a8fb15c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:43 +0100 Subject: [PATCH 1067/1620] New translations GeolocalizeMapService.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 386 ++++++------------ 1 file changed, 127 insertions(+), 259 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index c2259f5db0..4ed72d856d 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,319 +1,187 @@ package org.openforis.collect.earth.app.service; -import java.awt.Toolkit; -import java.awt.datatransfer.Clipboard; -import java.awt.datatransfer.StringSelection; import java.io.File; import java.io.IOException; -import java.net.URISyntaxException; +import java.net.MalformedURLException; import java.net.URL; -import java.nio.charset.StandardCharsets; -import java.util.NoSuchElementException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; -import org.openqa.selenium.By; -import org.openqa.selenium.JavascriptExecutor; -import org.openqa.selenium.Keys; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.remote.RemoteWebDriver; -import org.openqa.selenium.remote.RemoteWebElement; +import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import liquibase.repackaged.org.apache.commons.lang3.SystemUtils; - - +import freemarker.template.TemplateException; + +/** + * Customizes a Bing Map page to open zoomed into a coordinate. The HTML page is + * created in a temporary file and its URL is returned so that it can be opened + * in a browser. A freemarker template that contains the javascript code to + * customize the Bing Map is used and the parameters for the specific + * coordinates are applied to it. This service uses the same code than the KML + * generator to get the plot sample deign as chosen through the configuration by + * the user. + * + * @author Alfonso Sanchez-Paus Diaz + * + */ @Component -public class CodeEditorHandlerThread { - private static final String RUN_SCRIPT_BUTTON = "button.run-button"; - private static final String RESET_SCRIPT_BUTTON = "button.reset-button"; - private SimplePlacemarkObject placemarkObject; +public class GeolocalizeMapService { - private RemoteWebDriver webDriverGee; + private static final String RESOURCES_FOLDER = "resources"; - @Autowired - private BrowserService browserService; - private Logger logger = LoggerFactory.getLogger(CodeEditorHandlerThread.class); + /** + * The file that contains the freemarker template used to produce the Bing Maps + * code. + */ + public static final String FREEMARKER_BING_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectBing.fmt"; - @Autowired - private GeolocalizeMapService geoLocalizeTemplateService; + public static final String FREEMARKER_BAIDU_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectBaidu.fmt"; - @Autowired - private LocalPropertiesService localPropertiesService; + public static final String FREEMARKER_PLANET_MONTHLY_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectPlanetMonthlyHtml.fmt"; - public boolean isCodeEditorShowing() { - return BrowserService.isCssElementPresent(RUN_SCRIPT_BUTTON, webDriverGee); - } + public static final String FREEMARKER_PLANET_NICFI_ARGUMENTS = RESOURCES_FOLDER + File.separator + "collectPlanetNicfiTxt.fmt"; - public void runScript() throws IOException, URISyntaxException, InterruptedException { + public static final String FREEMARKER_PLANET_DAILY_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectPlanetHtml.fmt"; + public static final String FREEMARKER_PLANET_URL_TEMPLATE = RESOURCES_FOLDER + File.separator + + "collectPlanetUrl.fmt"; - try { - WebElement resetButton = webDriverGee.findElementByCssSelector(RESET_SCRIPT_BUTTON); + /** + * The file that contains the freemarker template used to produce the Yandex + * Maps code. + */ + public static final String FREEMARKER_YANDEX_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + + "collectYandex.fmt"; - forceClick( resetButton ); + public static final String FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME = "eePlaygroundScript.fmt"; + public static final String FREEMARKER_GEE_CODE_EDITOR_TEMPLATE_FILE_NAME = "eeCodeEditorScript.fmt"; - URL fileWithScript = geoLocalizeTemplateService.getTemporaryUrl(placemarkObject, getGeeCodeEditorTemplate()); + /** + * The file that contains the freemarker template used to produce script that is + * run in GEE Code Editor. + */ + public static final String FREEMARKER_GEE_PLAYGROUND_TEMPLATE = RESOURCES_FOLDER + File.separator + + FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME; + public static final String FREEMARKER_GEE_CODE_EDITOR_TEMPLATE = RESOURCES_FOLDER + File.separator + + FREEMARKER_GEE_CODE_EDITOR_TEMPLATE_FILE_NAME; - WebElement textArea = webDriverGee.findElement(By.className("ace_text-input")); + public static final String FREEMARKER_HERE_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + + "collectHereMaps.fmt"; - String contents = FileUtils.readFileToString(new File(fileWithScript.toURI()), StandardCharsets.UTF_8 ); + public static final String FREEMARKER_STREET_VIEW_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + + "collectStreetView.fmt"; + @Autowired + LocalPropertiesService localPropertiesService; - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { - sendThroughKeys(textArea, contents); + private final Logger logger = LoggerFactory.getLogger(this.getClass()); - } else { - sendThroughClipboard(textArea, contents); - try { - // Fix bug provoked by antivirus not accepting the control characters sent by Selenium - WebElement element = webDriverGee.findElement(By.className("ace_line") ); - if( element!= null && element.getAttribute("value").trim().equals("av") ) { - sendThroughKeys(textArea, contents); - } - } catch (Exception e) { - logger.warn("Error while refreshing code editor", e); + @Autowired + KmlGeneratorService kmlGeneratorService; - } - } + public void addDatesForImages(final Map data) { + SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-MM-dd"); + Date todayDate = new Date(); + String dateAsExpected = dt1.format(todayDate); + data.put("todayDate", dateAsExpected); - Thread.sleep(1000); - WebElement runButton = webDriverGee.findElementByCssSelector(RUN_SCRIPT_BUTTON); - forceClick( runButton ); - } catch (NoSuchElementException e) { - try { - // retry - Thread.sleep(1000); - WebElement runButton = webDriverGee.findElementByCssSelector(RUN_SCRIPT_BUTTON); - forceClick( runButton ); - }catch (Exception e2) { - // TODO: handle exception - } - } + Calendar cal = Calendar.getInstance(); + cal.setTime(todayDate); + cal.add(Calendar.YEAR, -1); - } + data.put("oneYearAgoDate", dt1.format(cal.getTime())); - private void sendThroughClipboard(WebElement textArea, String contents) { - Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); - StringSelection clipboardtext = new StringSelection(contents); - clipboard.setContents(clipboardtext, null); - Keys controlChar = Keys.CONTROL; - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { - controlChar = Keys.COMMAND; - } - textArea.sendKeys(Keys.chord(controlChar, "a")); - textArea.sendKeys(Keys.chord(controlChar, "v")); } - private void sendThroughKeys(WebElement textArea, String contents) - throws InterruptedException { - // Command key (apple key) is not working on Chrome on Mac. Try with the right click - // This is not going to be fixed by Selenium - - // Remove comments so it is faster to send the text! - String noComments = removeComments(contents); + private File applyData(Map data, String freemarkerTemplateFile) + throws IOException, TemplateException { - // Clear the code area - WebElement clearButton = webDriverGee.findElementByCssSelector(RESET_SCRIPT_BUTTON); - forceClick( clearButton ); + final File templateFileSrc = new File(freemarkerTemplateFile); - StringBuilder fixedScriptForMac = new StringBuilder(); - String[] lines = noComments.split("\\n"); - for (String line : lines) { - // Send the content of the script - String trimmedLine = line.trim(); + final File tempFileDst = File.createTempFile("selenium", ".html"); + tempFileDst.deleteOnExit(); - // Add Spaces after "{" so we avoid the automatic closing of the method by GEE - // Playground JS - trimmedLine = trimmedLine.replace("{", "{ "); + FreemarkerTemplateUtils.applyTemplate(templateFileSrc, tempFileDst, data); - if (!StringUtils.isBlank(trimmedLine)) { - fixedScriptForMac = fixedScriptForMac.append(trimmedLine).append("\n"); - } - } + return tempFileDst; - fixedScriptForMac.append("//THE END"); // Don't remove this!!! this way we mark the point where there should be no trailing character removal - Keys controlChar = Keys.CONTROL; - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { - controlChar = Keys.COMMAND; - } - textArea.sendKeys(Keys.chord(controlChar, "a")); - textArea.sendKeys(fixedScriptForMac); -/* - Thread.sleep(500); - // Fix the extra characters added by removing the last 10 chars ( this is a bug from Selenium! ) - textArea.sendKeys(Keys.PAGE_DOWN); - Thread.sleep(500); - textArea.sendKeys(Keys.PAGE_DOWN); - */ } - private void forceClick( WebElement element ) { - JavascriptExecutor js = webDriverGee; - js.executeScript("arguments[0].click();", element); - } - - public String removeComments(String contents) { - - String wholeCode = contents; - wholeCode = wholeCode.replace("http://", ""); - wholeCode = wholeCode.replace("https://", ""); - wholeCode = wholeCode.replace("\r", ""); - - StringBuilder noComments = new StringBuilder(""); - int indexComments = contents.indexOf("//"); - if (indexComments != -1) { - while (indexComments >= 0) { - int endOfLine = contents.indexOf('\n', indexComments); - if (endOfLine != -1) - indexComments = contents.indexOf("//", endOfLine + 2); - else { - break; - } - - if (indexComments != -1) - noComments = noComments.append(contents.substring(endOfLine, indexComments)); - else - noComments = noComments.append(contents.substring(endOfLine)); - } - return noComments.toString(); - } else { - return wholeCode; - } + public Map getPlacemarkData(SimplePlacemarkObject placemarkObject) { + final Map data = new HashMap<>(); + data.put("placemark", placemarkObject); + return data; } /** - * Get the GEE Playground script that should be used. There is an standard one - * that resides in resources/eePlaygroundScript.fmt but a project might have its - * own script. + * Produces a temporary file with the necessary HTML code to show the plot in + * Bing Maps * - * @return The generic script in the resources folder or the file called - * eePlaygroundScript.fmt in the same folder where the current project - * file resides + * @param placemarkObject + * The object containing information of the placemark. + * @param freemarkerTemplate + * The path to the freemarker template that is used to produce the + * file. + * @return The URL to the temporary file that can be used to load it in a + * browser. */ - private String getGeeCodeEditorTemplate() { - - String projectPlaygroundScript = getProjectGeeScript(); - if (projectPlaygroundScript != null) { - return projectPlaygroundScript; - } else { - return GeolocalizeMapService.FREEMARKER_GEE_CODE_EDITOR_TEMPLATE; // New format name since version 1.6.20 - } - + public URL getTemporaryUrl(SimplePlacemarkObject placemarkObject, String freemarkerTemplate) { + final Map data = getPlacemarkData(placemarkObject); + addDatesForImages(data); + return processTemplateWithData(freemarkerTemplate, data); } /** - * @return The path to the GEE Code Editor generic script or the one that is - * specified in the project folder if it exists. + * Produces a URL using Planet Labs explorer expected format + * + * @param placemarkObject + * The data of the plot. + * @param freemarkerTemplate + * The freemarker template file to use + * @param extraData + * Variable listof key value strings + * @return The URL to the temporary file that can be used to load it in a + * browser. */ - private String getProjectGeeScript() { - // Is there a "eePlaygroundScript.fmt" file in the same folder than in the - // metadata file folder? - File projectGeePlayground = new File(localPropertiesService.getProjectFolder() + File.separatorChar - + GeolocalizeMapService.FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME); - - // Is there a "eeCodeEditorScript.fmt" file in the same folder than in the - // metadata file folder? NEW NAME AFTER 12/2017!!! - File projectGeeCodeEditor = new File(localPropertiesService.getProjectFolder() + File.separatorChar - + GeolocalizeMapService.FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME); - - String geeFilePath = null; - if (projectGeeCodeEditor.exists()) { // The new format name takes precedence - geeFilePath = projectGeeCodeEditor.getAbsolutePath(); - } else if (projectGeePlayground.exists()) { - geeFilePath = projectGeePlayground.getAbsolutePath(); - } - return geeFilePath; - } + public URL getUrlToFreemarkerOutput(SimplePlacemarkObject placemarkObject, String freemarkerTemplate, + String... extraData) { - public void loadCodeEditorScript(SimplePlacemarkObject placemarkObject, RemoteWebDriver webDriverGeePlayground) { - this.placemarkObject = placemarkObject; - loadCodeEditorScript(webDriverGeePlayground); - } + final Map data = getPlacemarkData(placemarkObject); - public void disableCodeEditorAutocomplete(RemoteWebDriver webDriverCodeEditor) { - this.webDriverGee = webDriverCodeEditor; - try { - if (!isCodeEditorShowing()) { - // Open GEE Playground - if (!browserService.isDriverWorking(webDriverGee) || webDriverGee.getCurrentUrl() == null - || !webDriverGee.getCurrentUrl().contains("google")) { - webDriverGee = browserService.navigateTo(localPropertiesService.getGeePlaygoundUrl(), webDriverGee); - browserService.setWebDriverGeeCodeEditor(webDriverGee); - } - - // Initially the login page appears! - while (!isCodeEditorShowing()) { // 5 minutes a 2 seconds == 30 * 5 = 150 - Thread.sleep(2000); - } - - } else { - disableAutoComplete(); + if( extraData !=null) { + for (int i = 0; i < extraData.length; i = i+2) { + data.put(extraData[i], extraData[i+1]); } - - } catch (final NoSuchElementException e) { - // This is a well known exception. Down-grade if to warning - logger.warn("Error when opening Earth Engine browser window. Known problem", e); - } catch (final Exception e) { - // This is a well known exception. - logger.error("Error when opening Earth Engine browser window", e); - } - } - - private void disableAutoComplete() { - // Display the settings in Google Earth Engine Code Editor (this emulates - // clicking on the settings icon) - webDriverGee.findElementByClassName("settings-menu-button").click(); - // Get the Div that is the parent of the one with text that contains - // Autocomplete - RemoteWebElement autocompleteButton = (RemoteWebElement) webDriverGee - .findElementByXPath("//div[contains(text(), \"Autocomplete\")]/.."); - - if (isAutocompleChecked(autocompleteButton)) { - // Disable the Autocomplete of special characters - autocompleteButton.click(); } + return processTemplateWithData(freemarkerTemplate, data); } - public boolean isAutocompleChecked(RemoteWebElement autocompleteButton) { - String buttonChecked = autocompleteButton.getAttribute("aria-checked"); - return buttonChecked.equals("true"); - } - private void loadCodeEditorScript(RemoteWebDriver webDriverCodeEditor) { - this.webDriverGee = webDriverCodeEditor; - Thread loadGee = new Thread( - "Opening GEE Playground " + (placemarkObject != null ? placemarkObject.toString() : "")) { - @Override - public void run() { - try { - if (!isCodeEditorShowing()) { - // Open GEE Code Editor - if (!browserService.isDriverWorking(webDriverGee) || webDriverGee.getCurrentUrl() == null - || !webDriverGee.getCurrentUrl().contains("google")) { - webDriverGee = browserService.navigateTo(localPropertiesService.getGeePlaygoundUrl(), - webDriverGee); - browserService.setWebDriverGeeCodeEditor(webDriverGee); - } - // Initially the login page appears! - while (!isCodeEditorShowing()) { - sleep(2000); - } - } - runScript(); - } catch (final NoSuchElementException e) { - // This is a well known exception. Down-grade if to warning - logger.warn("Error when opening Earth Engine browser window. Known problem", e); - } catch (final Exception e) { - // This is a well known exception. - logger.error("Error when opening Earth Engine browser window", e); - } + private URL processTemplateWithData(String freemarkerTemplate, final Map data) { + File transformedHtml = null; + try { + transformedHtml = applyData(data, freemarkerTemplate); + } catch (final Exception e) { + logger.error("Exception when applying template " + freemarkerTemplate + "with data : " + data.toString(), + e); + } + if (transformedHtml != null) { + try { + return transformedHtml.toURI().toURL(); + } catch (MalformedURLException e) { + logger.error("Error generating URL for File " + transformedHtml.getAbsolutePath()); + return null; } - }; - loadGee.start(); + } else { + logger.error("No Bing map HTML generated."); + return null; + } } } From 5b3ca88111389a067b4ccdd58c688c8e932f05cc Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:44 +0100 Subject: [PATCH 1068/1620] New translations GeolocalizeMapService.java (Spanish) --- .../earth/app/view/Messages_es.properties | 230 ++++++++++++------ 1 file changed, 156 insertions(+), 74 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index c1b9c5db00..4ed72d856d 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,105 +1,187 @@ package org.openforis.collect.earth.app.service; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.ipcc.IPCCGenerator; -import org.openforis.collect.earth.ipcc.IPCCGeneratorException; -import org.openforis.collect.earth.ipcc.RdbExportException; -import org.openforis.collect.model.CollectSurvey; -import org.openforis.collect.relational.CollectRDBPublisher; -import org.openforis.collect.relational.CollectRdbException; -import org.openforis.idm.metamodel.NodeDefinition; +import java.io.File; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; +import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import freemarker.template.TemplateException; + +/** + * Customizes a Bing Map page to open zoomed into a coordinate. The HTML page is + * created in a temporary file and its URL is returned so that it can be opened + * in a browser. A freemarker template that contains the javascript code to + * customize the Bing Map is used and the parameters for the specific + * coordinates are applied to it. This service uses the same code than the KML + * generator to get the plot sample deign as chosen through the configuration by + * the user. + * + * @author Alfonso Sanchez-Paus Diaz + * + */ @Component -public class IPCCGeneratorService extends GenerateDatabase{ +public class GeolocalizeMapService { - @Autowired - RDBExporter rdbExporter; - - @Autowired - CollectRDBPublisher collectRDBPublisher; + private static final String RESOURCES_FOLDER = "resources"; - @Autowired - EarthSurveyService earthSurveyService; + /** + * The file that contains the freemarker template used to produce the Bing Maps + * code. + */ + public static final String FREEMARKER_BING_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectBing.fmt"; - @Autowired - public LocalPropertiesService localPropertiesService; + public static final String FREEMARKER_BAIDU_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectBaidu.fmt"; + + public static final String FREEMARKER_PLANET_MONTHLY_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectPlanetMonthlyHtml.fmt"; + + public static final String FREEMARKER_PLANET_NICFI_ARGUMENTS = RESOURCES_FOLDER + File.separator + "collectPlanetNicfiTxt.fmt"; + + public static final String FREEMARKER_PLANET_DAILY_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectPlanetHtml.fmt"; + public static final String FREEMARKER_PLANET_URL_TEMPLATE = RESOURCES_FOLDER + File.separator + + "collectPlanetUrl.fmt"; + + /** + * The file that contains the freemarker template used to produce the Yandex + * Maps code. + */ + public static final String FREEMARKER_YANDEX_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + + "collectYandex.fmt"; + + public static final String FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME = "eePlaygroundScript.fmt"; + public static final String FREEMARKER_GEE_CODE_EDITOR_TEMPLATE_FILE_NAME = "eeCodeEditorScript.fmt"; + + /** + * The file that contains the freemarker template used to produce script that is + * run in GEE Code Editor. + */ + public static final String FREEMARKER_GEE_PLAYGROUND_TEMPLATE = RESOURCES_FOLDER + File.separator + + FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME; + public static final String FREEMARKER_GEE_CODE_EDITOR_TEMPLATE = RESOURCES_FOLDER + File.separator + + FREEMARKER_GEE_CODE_EDITOR_TEMPLATE_FILE_NAME; + + public static final String FREEMARKER_HERE_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + + "collectHereMaps.fmt"; + + public static final String FREEMARKER_STREET_VIEW_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + + "collectStreetView.fmt"; @Autowired - BrowserService browserService; + LocalPropertiesService localPropertiesService; + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired - private IPCCGenerator ipccGenerator; - - final Logger logger = LoggerFactory.getLogger(IPCCGeneratorService.class); + KmlGeneratorService kmlGeneratorService; - public void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws RdbExportException { + public void addDatesForImages(final Map data) { + SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-MM-dd"); + Date todayDate = new Date(); + String dateAsExpected = dt1.format(todayDate); + data.put("todayDate", dateAsExpected); - try { + Calendar cal = Calendar.getInstance(); + cal.setTime(todayDate); + cal.add(Calendar.YEAR, -1); - try { + data.put("oneYearAgoDate", dt1.format(cal.getTime())); - if ( - (localPropertiesService.isUsingSqliteDB() && !getZippedProjectDB( ExportType.IPCC ).exists()) - || - isRefreshDatabase() - ) { - - // The user clicked on the option to refresh the database, or there is no - // previous copy of the Saiku DB - // Generate the DB file - ipccGenerator.generateRDB( earthSurveyService.getCollectSurvey(), progressListener); - - try { - // Save the DB file in a zipped file to extends GenerateDatabase keep for the next usages - replaceZippedProjectDB( ExportType.IPCC ); - } catch (Exception e) { - logger.error("Error while refreshing the Zipped content of the project IPCC DB", e); - } - - } else if (getZippedProjectDB(ExportType.IPCC).exists()) { - // If the zipped version of the project exists ( and the user clicked on the - // option to not refresh it) then restore this last version of the data - if (localPropertiesService.isUsingSqliteDB()) { - restoreZippedProjectDB(ExportType.IPCC); - } - } - - ipccGenerator.produceOutputs( earthSurveyService.getCollectSurvey(), progressListener ); - - } catch (final IPCCGeneratorException e) { - logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ - } - - } catch (final CollectRdbException e) { - logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ - } } + private File applyData(Map data, String freemarkerTemplateFile) + throws IOException, TemplateException { + final File templateFileSrc = new File(freemarkerTemplateFile); - public static boolean surveyContains(String nodeName, CollectSurvey survey) { - NodeDefinition nodeDefForNAme = survey.getSchema().findNodeDefinition( nodeDef -> nodeDef.getName().equals(nodeName) ); - return nodeDefForNAme != null; - } + final File tempFileDst = File.createTempFile("selenium", ".html"); + tempFileDst.deleteOnExit(); + + FreemarkerTemplateUtils.applyTemplate(templateFileSrc, tempFileDst, data); + return tempFileDst; - @Override - public LocalPropertiesService getLocalPropertiesService() { - return localPropertiesService; } - @Override - public EarthSurveyService getEarthSurveyService() { - return earthSurveyService; + public Map getPlacemarkData(SimplePlacemarkObject placemarkObject) { + final Map data = new HashMap<>(); + data.put("placemark", placemarkObject); + return data; } - @Override - public RDBExporter getRdbExporter() { - return rdbExporter; + /** + * Produces a temporary file with the necessary HTML code to show the plot in + * Bing Maps + * + * @param placemarkObject + * The object containing information of the placemark. + * @param freemarkerTemplate + * The path to the freemarker template that is used to produce the + * file. + * @return The URL to the temporary file that can be used to load it in a + * browser. + */ + public URL getTemporaryUrl(SimplePlacemarkObject placemarkObject, String freemarkerTemplate) { + final Map data = getPlacemarkData(placemarkObject); + addDatesForImages(data); + return processTemplateWithData(freemarkerTemplate, data); + } + + /** + * Produces a URL using Planet Labs explorer expected format + * + * @param placemarkObject + * The data of the plot. + * @param freemarkerTemplate + * The freemarker template file to use + * @param extraData + * Variable listof key value strings + * @return The URL to the temporary file that can be used to load it in a + * browser. + */ + public URL getUrlToFreemarkerOutput(SimplePlacemarkObject placemarkObject, String freemarkerTemplate, + String... extraData) { + + final Map data = getPlacemarkData(placemarkObject); + + if( extraData !=null) { + for (int i = 0; i < extraData.length; i = i+2) { + data.put(extraData[i], extraData[i+1]); + } + } + return processTemplateWithData(freemarkerTemplate, data); + } -} \ No newline at end of file + + private URL processTemplateWithData(String freemarkerTemplate, final Map data) { + File transformedHtml = null; + try { + transformedHtml = applyData(data, freemarkerTemplate); + } catch (final Exception e) { + logger.error("Exception when applying template " + freemarkerTemplate + "with data : " + data.toString(), + e); + } + if (transformedHtml != null) { + try { + return transformedHtml.toURI().toURL(); + } catch (MalformedURLException e) { + logger.error("Error generating URL for File " + transformedHtml.getAbsolutePath()); + return null; + } + } else { + logger.error("No Bing map HTML generated."); + return null; + } + } +} From 883711c78d988b5b0181467d9d5c5cf0fbb4e7ac Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:45 +0100 Subject: [PATCH 1069/1620] New translations GeolocalizeMapService.java (French) --- .../earth/app/view/Messages_fr.properties | 230 ++++++++++++------ 1 file changed, 156 insertions(+), 74 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index c1b9c5db00..4ed72d856d 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,105 +1,187 @@ package org.openforis.collect.earth.app.service; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.ipcc.IPCCGenerator; -import org.openforis.collect.earth.ipcc.IPCCGeneratorException; -import org.openforis.collect.earth.ipcc.RdbExportException; -import org.openforis.collect.model.CollectSurvey; -import org.openforis.collect.relational.CollectRDBPublisher; -import org.openforis.collect.relational.CollectRdbException; -import org.openforis.idm.metamodel.NodeDefinition; +import java.io.File; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; +import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import freemarker.template.TemplateException; + +/** + * Customizes a Bing Map page to open zoomed into a coordinate. The HTML page is + * created in a temporary file and its URL is returned so that it can be opened + * in a browser. A freemarker template that contains the javascript code to + * customize the Bing Map is used and the parameters for the specific + * coordinates are applied to it. This service uses the same code than the KML + * generator to get the plot sample deign as chosen through the configuration by + * the user. + * + * @author Alfonso Sanchez-Paus Diaz + * + */ @Component -public class IPCCGeneratorService extends GenerateDatabase{ +public class GeolocalizeMapService { - @Autowired - RDBExporter rdbExporter; - - @Autowired - CollectRDBPublisher collectRDBPublisher; + private static final String RESOURCES_FOLDER = "resources"; - @Autowired - EarthSurveyService earthSurveyService; + /** + * The file that contains the freemarker template used to produce the Bing Maps + * code. + */ + public static final String FREEMARKER_BING_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectBing.fmt"; - @Autowired - public LocalPropertiesService localPropertiesService; + public static final String FREEMARKER_BAIDU_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectBaidu.fmt"; + + public static final String FREEMARKER_PLANET_MONTHLY_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectPlanetMonthlyHtml.fmt"; + + public static final String FREEMARKER_PLANET_NICFI_ARGUMENTS = RESOURCES_FOLDER + File.separator + "collectPlanetNicfiTxt.fmt"; + + public static final String FREEMARKER_PLANET_DAILY_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectPlanetHtml.fmt"; + public static final String FREEMARKER_PLANET_URL_TEMPLATE = RESOURCES_FOLDER + File.separator + + "collectPlanetUrl.fmt"; + + /** + * The file that contains the freemarker template used to produce the Yandex + * Maps code. + */ + public static final String FREEMARKER_YANDEX_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + + "collectYandex.fmt"; + + public static final String FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME = "eePlaygroundScript.fmt"; + public static final String FREEMARKER_GEE_CODE_EDITOR_TEMPLATE_FILE_NAME = "eeCodeEditorScript.fmt"; + + /** + * The file that contains the freemarker template used to produce script that is + * run in GEE Code Editor. + */ + public static final String FREEMARKER_GEE_PLAYGROUND_TEMPLATE = RESOURCES_FOLDER + File.separator + + FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME; + public static final String FREEMARKER_GEE_CODE_EDITOR_TEMPLATE = RESOURCES_FOLDER + File.separator + + FREEMARKER_GEE_CODE_EDITOR_TEMPLATE_FILE_NAME; + + public static final String FREEMARKER_HERE_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + + "collectHereMaps.fmt"; + + public static final String FREEMARKER_STREET_VIEW_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + + "collectStreetView.fmt"; @Autowired - BrowserService browserService; + LocalPropertiesService localPropertiesService; + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired - private IPCCGenerator ipccGenerator; - - final Logger logger = LoggerFactory.getLogger(IPCCGeneratorService.class); + KmlGeneratorService kmlGeneratorService; - public void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws RdbExportException { + public void addDatesForImages(final Map data) { + SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-MM-dd"); + Date todayDate = new Date(); + String dateAsExpected = dt1.format(todayDate); + data.put("todayDate", dateAsExpected); - try { + Calendar cal = Calendar.getInstance(); + cal.setTime(todayDate); + cal.add(Calendar.YEAR, -1); - try { + data.put("oneYearAgoDate", dt1.format(cal.getTime())); - if ( - (localPropertiesService.isUsingSqliteDB() && !getZippedProjectDB( ExportType.IPCC ).exists()) - || - isRefreshDatabase() - ) { - - // The user clicked on the option to refresh the database, or there is no - // previous copy of the Saiku DB - // Generate the DB file - ipccGenerator.generateRDB( earthSurveyService.getCollectSurvey(), progressListener); - - try { - // Save the DB file in a zipped file to extends GenerateDatabase keep for the next usages - replaceZippedProjectDB( ExportType.IPCC ); - } catch (Exception e) { - logger.error("Error while refreshing the Zipped content of the project IPCC DB", e); - } - - } else if (getZippedProjectDB(ExportType.IPCC).exists()) { - // If the zipped version of the project exists ( and the user clicked on the - // option to not refresh it) then restore this last version of the data - if (localPropertiesService.isUsingSqliteDB()) { - restoreZippedProjectDB(ExportType.IPCC); - } - } - - ipccGenerator.produceOutputs( earthSurveyService.getCollectSurvey(), progressListener ); - - } catch (final IPCCGeneratorException e) { - logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ - } - - } catch (final CollectRdbException e) { - logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ - } } + private File applyData(Map data, String freemarkerTemplateFile) + throws IOException, TemplateException { + final File templateFileSrc = new File(freemarkerTemplateFile); - public static boolean surveyContains(String nodeName, CollectSurvey survey) { - NodeDefinition nodeDefForNAme = survey.getSchema().findNodeDefinition( nodeDef -> nodeDef.getName().equals(nodeName) ); - return nodeDefForNAme != null; - } + final File tempFileDst = File.createTempFile("selenium", ".html"); + tempFileDst.deleteOnExit(); + + FreemarkerTemplateUtils.applyTemplate(templateFileSrc, tempFileDst, data); + return tempFileDst; - @Override - public LocalPropertiesService getLocalPropertiesService() { - return localPropertiesService; } - @Override - public EarthSurveyService getEarthSurveyService() { - return earthSurveyService; + public Map getPlacemarkData(SimplePlacemarkObject placemarkObject) { + final Map data = new HashMap<>(); + data.put("placemark", placemarkObject); + return data; } - @Override - public RDBExporter getRdbExporter() { - return rdbExporter; + /** + * Produces a temporary file with the necessary HTML code to show the plot in + * Bing Maps + * + * @param placemarkObject + * The object containing information of the placemark. + * @param freemarkerTemplate + * The path to the freemarker template that is used to produce the + * file. + * @return The URL to the temporary file that can be used to load it in a + * browser. + */ + public URL getTemporaryUrl(SimplePlacemarkObject placemarkObject, String freemarkerTemplate) { + final Map data = getPlacemarkData(placemarkObject); + addDatesForImages(data); + return processTemplateWithData(freemarkerTemplate, data); + } + + /** + * Produces a URL using Planet Labs explorer expected format + * + * @param placemarkObject + * The data of the plot. + * @param freemarkerTemplate + * The freemarker template file to use + * @param extraData + * Variable listof key value strings + * @return The URL to the temporary file that can be used to load it in a + * browser. + */ + public URL getUrlToFreemarkerOutput(SimplePlacemarkObject placemarkObject, String freemarkerTemplate, + String... extraData) { + + final Map data = getPlacemarkData(placemarkObject); + + if( extraData !=null) { + for (int i = 0; i < extraData.length; i = i+2) { + data.put(extraData[i], extraData[i+1]); + } + } + return processTemplateWithData(freemarkerTemplate, data); + } -} \ No newline at end of file + + private URL processTemplateWithData(String freemarkerTemplate, final Map data) { + File transformedHtml = null; + try { + transformedHtml = applyData(data, freemarkerTemplate); + } catch (final Exception e) { + logger.error("Exception when applying template " + freemarkerTemplate + "with data : " + data.toString(), + e); + } + if (transformedHtml != null) { + try { + return transformedHtml.toURI().toURL(); + } catch (MalformedURLException e) { + logger.error("Error generating URL for File " + transformedHtml.getAbsolutePath()); + return null; + } + } else { + logger.error("No Bing map HTML generated."); + return null; + } + } +} From c53cb497a0a474ab1a64820271e0c5af110f01ca Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:46 +0100 Subject: [PATCH 1070/1620] New translations CodeEditorHandlerThread.java (English) --- .../earth/app/view/Messages_en.properties | 386 ++++++++++++------ 1 file changed, 259 insertions(+), 127 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 4ed72d856d..c2259f5db0 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,187 +1,319 @@ package org.openforis.collect.earth.app.service; +import java.awt.Toolkit; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.StringSelection; import java.io.File; import java.io.IOException; -import java.net.MalformedURLException; +import java.net.URISyntaxException; import java.net.URL; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; +import java.nio.charset.StandardCharsets; +import java.util.NoSuchElementException; +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; -import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; +import org.openqa.selenium.By; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.Keys; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.openqa.selenium.remote.RemoteWebElement; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import freemarker.template.TemplateException; - -/** - * Customizes a Bing Map page to open zoomed into a coordinate. The HTML page is - * created in a temporary file and its URL is returned so that it can be opened - * in a browser. A freemarker template that contains the javascript code to - * customize the Bing Map is used and the parameters for the specific - * coordinates are applied to it. This service uses the same code than the KML - * generator to get the plot sample deign as chosen through the configuration by - * the user. - * - * @author Alfonso Sanchez-Paus Diaz - * - */ +import liquibase.repackaged.org.apache.commons.lang3.SystemUtils; + + @Component -public class GeolocalizeMapService { +public class CodeEditorHandlerThread { + private static final String RUN_SCRIPT_BUTTON = "button.run-button"; + private static final String RESET_SCRIPT_BUTTON = "button.reset-button"; + private SimplePlacemarkObject placemarkObject; - private static final String RESOURCES_FOLDER = "resources"; + private RemoteWebDriver webDriverGee; - /** - * The file that contains the freemarker template used to produce the Bing Maps - * code. - */ - public static final String FREEMARKER_BING_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectBing.fmt"; + @Autowired + private BrowserService browserService; + private Logger logger = LoggerFactory.getLogger(CodeEditorHandlerThread.class); - public static final String FREEMARKER_BAIDU_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectBaidu.fmt"; + @Autowired + private GeolocalizeMapService geoLocalizeTemplateService; - public static final String FREEMARKER_PLANET_MONTHLY_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectPlanetMonthlyHtml.fmt"; + @Autowired + private LocalPropertiesService localPropertiesService; - public static final String FREEMARKER_PLANET_NICFI_ARGUMENTS = RESOURCES_FOLDER + File.separator + "collectPlanetNicfiTxt.fmt"; + public boolean isCodeEditorShowing() { + return BrowserService.isCssElementPresent(RUN_SCRIPT_BUTTON, webDriverGee); + } - public static final String FREEMARKER_PLANET_DAILY_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectPlanetHtml.fmt"; + public void runScript() throws IOException, URISyntaxException, InterruptedException { - public static final String FREEMARKER_PLANET_URL_TEMPLATE = RESOURCES_FOLDER + File.separator - + "collectPlanetUrl.fmt"; - /** - * The file that contains the freemarker template used to produce the Yandex - * Maps code. - */ - public static final String FREEMARKER_YANDEX_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator - + "collectYandex.fmt"; + try { + WebElement resetButton = webDriverGee.findElementByCssSelector(RESET_SCRIPT_BUTTON); - public static final String FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME = "eePlaygroundScript.fmt"; - public static final String FREEMARKER_GEE_CODE_EDITOR_TEMPLATE_FILE_NAME = "eeCodeEditorScript.fmt"; + forceClick( resetButton ); - /** - * The file that contains the freemarker template used to produce script that is - * run in GEE Code Editor. - */ - public static final String FREEMARKER_GEE_PLAYGROUND_TEMPLATE = RESOURCES_FOLDER + File.separator - + FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME; - public static final String FREEMARKER_GEE_CODE_EDITOR_TEMPLATE = RESOURCES_FOLDER + File.separator - + FREEMARKER_GEE_CODE_EDITOR_TEMPLATE_FILE_NAME; + URL fileWithScript = geoLocalizeTemplateService.getTemporaryUrl(placemarkObject, getGeeCodeEditorTemplate()); - public static final String FREEMARKER_HERE_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator - + "collectHereMaps.fmt"; + WebElement textArea = webDriverGee.findElement(By.className("ace_text-input")); - public static final String FREEMARKER_STREET_VIEW_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator - + "collectStreetView.fmt"; - @Autowired - LocalPropertiesService localPropertiesService; + String contents = FileUtils.readFileToString(new File(fileWithScript.toURI()), StandardCharsets.UTF_8 ); - private final Logger logger = LoggerFactory.getLogger(this.getClass()); + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { + sendThroughKeys(textArea, contents); - @Autowired - KmlGeneratorService kmlGeneratorService; + } else { + sendThroughClipboard(textArea, contents); + try { + // Fix bug provoked by antivirus not accepting the control characters sent by Selenium + WebElement element = webDriverGee.findElement(By.className("ace_line") ); + if( element!= null && element.getAttribute("value").trim().equals("av") ) { + sendThroughKeys(textArea, contents); + } + } catch (Exception e) { + logger.warn("Error while refreshing code editor", e); - public void addDatesForImages(final Map data) { - SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-MM-dd"); - Date todayDate = new Date(); - String dateAsExpected = dt1.format(todayDate); - data.put("todayDate", dateAsExpected); + } + } - Calendar cal = Calendar.getInstance(); - cal.setTime(todayDate); - cal.add(Calendar.YEAR, -1); + Thread.sleep(1000); + WebElement runButton = webDriverGee.findElementByCssSelector(RUN_SCRIPT_BUTTON); + forceClick( runButton ); + } catch (NoSuchElementException e) { + try { + // retry + Thread.sleep(1000); + WebElement runButton = webDriverGee.findElementByCssSelector(RUN_SCRIPT_BUTTON); + forceClick( runButton ); + }catch (Exception e2) { + // TODO: handle exception + } + } - data.put("oneYearAgoDate", dt1.format(cal.getTime())); + } + private void sendThroughClipboard(WebElement textArea, String contents) { + Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); + StringSelection clipboardtext = new StringSelection(contents); + clipboard.setContents(clipboardtext, null); + Keys controlChar = Keys.CONTROL; + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { + controlChar = Keys.COMMAND; + } + textArea.sendKeys(Keys.chord(controlChar, "a")); + textArea.sendKeys(Keys.chord(controlChar, "v")); } - private File applyData(Map data, String freemarkerTemplateFile) - throws IOException, TemplateException { + private void sendThroughKeys(WebElement textArea, String contents) + throws InterruptedException { + // Command key (apple key) is not working on Chrome on Mac. Try with the right click + // This is not going to be fixed by Selenium + + // Remove comments so it is faster to send the text! + String noComments = removeComments(contents); - final File templateFileSrc = new File(freemarkerTemplateFile); + // Clear the code area + WebElement clearButton = webDriverGee.findElementByCssSelector(RESET_SCRIPT_BUTTON); + forceClick( clearButton ); - final File tempFileDst = File.createTempFile("selenium", ".html"); - tempFileDst.deleteOnExit(); + StringBuilder fixedScriptForMac = new StringBuilder(); + String[] lines = noComments.split("\\n"); + for (String line : lines) { + // Send the content of the script + String trimmedLine = line.trim(); - FreemarkerTemplateUtils.applyTemplate(templateFileSrc, tempFileDst, data); + // Add Spaces after "{" so we avoid the automatic closing of the method by GEE + // Playground JS + trimmedLine = trimmedLine.replace("{", "{ "); - return tempFileDst; + if (!StringUtils.isBlank(trimmedLine)) { + fixedScriptForMac = fixedScriptForMac.append(trimmedLine).append("\n"); + } + } + fixedScriptForMac.append("//THE END"); // Don't remove this!!! this way we mark the point where there should be no trailing character removal + Keys controlChar = Keys.CONTROL; + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { + controlChar = Keys.COMMAND; + } + textArea.sendKeys(Keys.chord(controlChar, "a")); + textArea.sendKeys(fixedScriptForMac); +/* + Thread.sleep(500); + // Fix the extra characters added by removing the last 10 chars ( this is a bug from Selenium! ) + textArea.sendKeys(Keys.PAGE_DOWN); + Thread.sleep(500); + textArea.sendKeys(Keys.PAGE_DOWN); + */ } - public Map getPlacemarkData(SimplePlacemarkObject placemarkObject) { - final Map data = new HashMap<>(); - data.put("placemark", placemarkObject); - return data; + private void forceClick( WebElement element ) { + JavascriptExecutor js = webDriverGee; + js.executeScript("arguments[0].click();", element); + } + + public String removeComments(String contents) { + + String wholeCode = contents; + wholeCode = wholeCode.replace("http://", ""); + wholeCode = wholeCode.replace("https://", ""); + wholeCode = wholeCode.replace("\r", ""); + + StringBuilder noComments = new StringBuilder(""); + int indexComments = contents.indexOf("//"); + if (indexComments != -1) { + while (indexComments >= 0) { + int endOfLine = contents.indexOf('\n', indexComments); + if (endOfLine != -1) + indexComments = contents.indexOf("//", endOfLine + 2); + else { + break; + } + + if (indexComments != -1) + noComments = noComments.append(contents.substring(endOfLine, indexComments)); + else + noComments = noComments.append(contents.substring(endOfLine)); + } + return noComments.toString(); + } else { + return wholeCode; + } } /** - * Produces a temporary file with the necessary HTML code to show the plot in - * Bing Maps + * Get the GEE Playground script that should be used. There is an standard one + * that resides in resources/eePlaygroundScript.fmt but a project might have its + * own script. * - * @param placemarkObject - * The object containing information of the placemark. - * @param freemarkerTemplate - * The path to the freemarker template that is used to produce the - * file. - * @return The URL to the temporary file that can be used to load it in a - * browser. + * @return The generic script in the resources folder or the file called + * eePlaygroundScript.fmt in the same folder where the current project + * file resides */ - public URL getTemporaryUrl(SimplePlacemarkObject placemarkObject, String freemarkerTemplate) { - final Map data = getPlacemarkData(placemarkObject); - addDatesForImages(data); - return processTemplateWithData(freemarkerTemplate, data); + private String getGeeCodeEditorTemplate() { + + String projectPlaygroundScript = getProjectGeeScript(); + if (projectPlaygroundScript != null) { + return projectPlaygroundScript; + } else { + return GeolocalizeMapService.FREEMARKER_GEE_CODE_EDITOR_TEMPLATE; // New format name since version 1.6.20 + } + } /** - * Produces a URL using Planet Labs explorer expected format - * - * @param placemarkObject - * The data of the plot. - * @param freemarkerTemplate - * The freemarker template file to use - * @param extraData - * Variable listof key value strings - * @return The URL to the temporary file that can be used to load it in a - * browser. + * @return The path to the GEE Code Editor generic script or the one that is + * specified in the project folder if it exists. */ - public URL getUrlToFreemarkerOutput(SimplePlacemarkObject placemarkObject, String freemarkerTemplate, - String... extraData) { + private String getProjectGeeScript() { + // Is there a "eePlaygroundScript.fmt" file in the same folder than in the + // metadata file folder? + File projectGeePlayground = new File(localPropertiesService.getProjectFolder() + File.separatorChar + + GeolocalizeMapService.FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME); + + // Is there a "eeCodeEditorScript.fmt" file in the same folder than in the + // metadata file folder? NEW NAME AFTER 12/2017!!! + File projectGeeCodeEditor = new File(localPropertiesService.getProjectFolder() + File.separatorChar + + GeolocalizeMapService.FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME); + + String geeFilePath = null; + if (projectGeeCodeEditor.exists()) { // The new format name takes precedence + geeFilePath = projectGeeCodeEditor.getAbsolutePath(); + } else if (projectGeePlayground.exists()) { + geeFilePath = projectGeePlayground.getAbsolutePath(); + } + return geeFilePath; + } - final Map data = getPlacemarkData(placemarkObject); + public void loadCodeEditorScript(SimplePlacemarkObject placemarkObject, RemoteWebDriver webDriverGeePlayground) { + this.placemarkObject = placemarkObject; + loadCodeEditorScript(webDriverGeePlayground); + } - if( extraData !=null) { - for (int i = 0; i < extraData.length; i = i+2) { - data.put(extraData[i], extraData[i+1]); + public void disableCodeEditorAutocomplete(RemoteWebDriver webDriverCodeEditor) { + this.webDriverGee = webDriverCodeEditor; + try { + if (!isCodeEditorShowing()) { + // Open GEE Playground + if (!browserService.isDriverWorking(webDriverGee) || webDriverGee.getCurrentUrl() == null + || !webDriverGee.getCurrentUrl().contains("google")) { + webDriverGee = browserService.navigateTo(localPropertiesService.getGeePlaygoundUrl(), webDriverGee); + browserService.setWebDriverGeeCodeEditor(webDriverGee); + } + + // Initially the login page appears! + while (!isCodeEditorShowing()) { // 5 minutes a 2 seconds == 30 * 5 = 150 + Thread.sleep(2000); + } + + } else { + disableAutoComplete(); } + + } catch (final NoSuchElementException e) { + // This is a well known exception. Down-grade if to warning + logger.warn("Error when opening Earth Engine browser window. Known problem", e); + } catch (final Exception e) { + // This is a well known exception. + logger.error("Error when opening Earth Engine browser window", e); + } + } + + private void disableAutoComplete() { + // Display the settings in Google Earth Engine Code Editor (this emulates + // clicking on the settings icon) + webDriverGee.findElementByClassName("settings-menu-button").click(); + // Get the Div that is the parent of the one with text that contains + // Autocomplete + RemoteWebElement autocompleteButton = (RemoteWebElement) webDriverGee + .findElementByXPath("//div[contains(text(), \"Autocomplete\")]/.."); + + if (isAutocompleChecked(autocompleteButton)) { + // Disable the Autocomplete of special characters + autocompleteButton.click(); } - return processTemplateWithData(freemarkerTemplate, data); } + public boolean isAutocompleChecked(RemoteWebElement autocompleteButton) { + String buttonChecked = autocompleteButton.getAttribute("aria-checked"); + return buttonChecked.equals("true"); + } - private URL processTemplateWithData(String freemarkerTemplate, final Map data) { - File transformedHtml = null; - try { - transformedHtml = applyData(data, freemarkerTemplate); - } catch (final Exception e) { - logger.error("Exception when applying template " + freemarkerTemplate + "with data : " + data.toString(), - e); - } - if (transformedHtml != null) { - try { - return transformedHtml.toURI().toURL(); - } catch (MalformedURLException e) { - logger.error("Error generating URL for File " + transformedHtml.getAbsolutePath()); - return null; + private void loadCodeEditorScript(RemoteWebDriver webDriverCodeEditor) { + this.webDriverGee = webDriverCodeEditor; + Thread loadGee = new Thread( + "Opening GEE Playground " + (placemarkObject != null ? placemarkObject.toString() : "")) { + @Override + public void run() { + try { + if (!isCodeEditorShowing()) { + // Open GEE Code Editor + if (!browserService.isDriverWorking(webDriverGee) || webDriverGee.getCurrentUrl() == null + || !webDriverGee.getCurrentUrl().contains("google")) { + webDriverGee = browserService.navigateTo(localPropertiesService.getGeePlaygoundUrl(), + webDriverGee); + browserService.setWebDriverGeeCodeEditor(webDriverGee); + } + // Initially the login page appears! + while (!isCodeEditorShowing()) { + sleep(2000); + } + } + runScript(); + } catch (final NoSuchElementException e) { + // This is a well known exception. Down-grade if to warning + logger.warn("Error when opening Earth Engine browser window. Known problem", e); + } catch (final Exception e) { + // This is a well known exception. + logger.error("Error when opening Earth Engine browser window", e); + } } - } else { - logger.error("No Bing map HTML generated."); - return null; - } + }; + loadGee.start(); } } From 2af13d7751abc9bf02afe42158f2548c7c5b9d1b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:48 +0100 Subject: [PATCH 1071/1620] New translations GenerateDatabase.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 316 +++++++----------- 1 file changed, 129 insertions(+), 187 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 4ed72d856d..8f7c20dd42 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,187 +1,129 @@ -package org.openforis.collect.earth.app.service; - -import java.io.File; -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; - -import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; -import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import freemarker.template.TemplateException; - -/** - * Customizes a Bing Map page to open zoomed into a coordinate. The HTML page is - * created in a temporary file and its URL is returned so that it can be opened - * in a browser. A freemarker template that contains the javascript code to - * customize the Bing Map is used and the parameters for the specific - * coordinates are applied to it. This service uses the same code than the KML - * generator to get the plot sample deign as chosen through the configuration by - * the user. - * - * @author Alfonso Sanchez-Paus Diaz - * - */ -@Component -public class GeolocalizeMapService { - - private static final String RESOURCES_FOLDER = "resources"; - - /** - * The file that contains the freemarker template used to produce the Bing Maps - * code. - */ - public static final String FREEMARKER_BING_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectBing.fmt"; - - public static final String FREEMARKER_BAIDU_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectBaidu.fmt"; - - public static final String FREEMARKER_PLANET_MONTHLY_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectPlanetMonthlyHtml.fmt"; - - public static final String FREEMARKER_PLANET_NICFI_ARGUMENTS = RESOURCES_FOLDER + File.separator + "collectPlanetNicfiTxt.fmt"; - - public static final String FREEMARKER_PLANET_DAILY_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectPlanetHtml.fmt"; - - public static final String FREEMARKER_PLANET_URL_TEMPLATE = RESOURCES_FOLDER + File.separator - + "collectPlanetUrl.fmt"; - - /** - * The file that contains the freemarker template used to produce the Yandex - * Maps code. - */ - public static final String FREEMARKER_YANDEX_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator - + "collectYandex.fmt"; - - public static final String FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME = "eePlaygroundScript.fmt"; - public static final String FREEMARKER_GEE_CODE_EDITOR_TEMPLATE_FILE_NAME = "eeCodeEditorScript.fmt"; - - /** - * The file that contains the freemarker template used to produce script that is - * run in GEE Code Editor. - */ - public static final String FREEMARKER_GEE_PLAYGROUND_TEMPLATE = RESOURCES_FOLDER + File.separator - + FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME; - public static final String FREEMARKER_GEE_CODE_EDITOR_TEMPLATE = RESOURCES_FOLDER + File.separator - + FREEMARKER_GEE_CODE_EDITOR_TEMPLATE_FILE_NAME; - - public static final String FREEMARKER_HERE_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator - + "collectHereMaps.fmt"; - - public static final String FREEMARKER_STREET_VIEW_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator - + "collectStreetView.fmt"; - @Autowired - LocalPropertiesService localPropertiesService; - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - @Autowired - KmlGeneratorService kmlGeneratorService; - - public void addDatesForImages(final Map data) { - SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-MM-dd"); - Date todayDate = new Date(); - String dateAsExpected = dt1.format(todayDate); - data.put("todayDate", dateAsExpected); - - Calendar cal = Calendar.getInstance(); - cal.setTime(todayDate); - cal.add(Calendar.YEAR, -1); - - data.put("oneYearAgoDate", dt1.format(cal.getTime())); - - } - - private File applyData(Map data, String freemarkerTemplateFile) - throws IOException, TemplateException { - - final File templateFileSrc = new File(freemarkerTemplateFile); - - final File tempFileDst = File.createTempFile("selenium", ".html"); - tempFileDst.deleteOnExit(); - - FreemarkerTemplateUtils.applyTemplate(templateFileSrc, tempFileDst, data); - - return tempFileDst; - - } - - public Map getPlacemarkData(SimplePlacemarkObject placemarkObject) { - final Map data = new HashMap<>(); - data.put("placemark", placemarkObject); - return data; - } - - /** - * Produces a temporary file with the necessary HTML code to show the plot in - * Bing Maps - * - * @param placemarkObject - * The object containing information of the placemark. - * @param freemarkerTemplate - * The path to the freemarker template that is used to produce the - * file. - * @return The URL to the temporary file that can be used to load it in a - * browser. - */ - public URL getTemporaryUrl(SimplePlacemarkObject placemarkObject, String freemarkerTemplate) { - final Map data = getPlacemarkData(placemarkObject); - addDatesForImages(data); - return processTemplateWithData(freemarkerTemplate, data); - } - - /** - * Produces a URL using Planet Labs explorer expected format - * - * @param placemarkObject - * The data of the plot. - * @param freemarkerTemplate - * The freemarker template file to use - * @param extraData - * Variable listof key value strings - * @return The URL to the temporary file that can be used to load it in a - * browser. - */ - public URL getUrlToFreemarkerOutput(SimplePlacemarkObject placemarkObject, String freemarkerTemplate, - String... extraData) { - - final Map data = getPlacemarkData(placemarkObject); - - if( extraData !=null) { - for (int i = 0; i < extraData.length; i = i+2) { - data.put(extraData[i], extraData[i+1]); - } - } - return processTemplateWithData(freemarkerTemplate, data); - - } - - - private URL processTemplateWithData(String freemarkerTemplate, final Map data) { - File transformedHtml = null; - try { - transformedHtml = applyData(data, freemarkerTemplate); - } catch (final Exception e) { - logger.error("Exception when applying template " + freemarkerTemplate + "with data : " + data.toString(), - e); - } - if (transformedHtml != null) { - try { - return transformedHtml.toURI().toURL(); - } catch (MalformedURLException e) { - logger.error("Error generating URL for File " + transformedHtml.getAbsolutePath()); - return null; - } - } else { - logger.error("No Bing map HTML generated."); - return null; - } - } -} +package org.openforis.collect.earth.app.service; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +import org.apache.commons.codec.binary.Hex; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.ipcc.RdbExportException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import net.lingala.zip4j.ZipFile; + +public abstract class GenerateDatabase { + + + Logger logger = LoggerFactory.getLogger( GenerateDatabase.class); + boolean refreshDatabase; + boolean userCancelledOperation = false; + + public GenerateDatabase() { + super(); + } + + public abstract EarthSurveyService getEarthSurveyService(); + public abstract LocalPropertiesService getLocalPropertiesService(); + public abstract RDBExporter getRdbExporter(); + + private String getRdbFilePrefix( ExportType type ) { + String result = ""; + try { + final MessageDigest messageDigest = MessageDigest.getInstance("MD5"); + messageDigest.reset(); + String concatenation = getEarthSurveyService().getCollectSurvey().getUri() + + getEarthSurveyService().getCollectSurvey().getName(); + messageDigest.update(concatenation.getBytes( StandardCharsets.UTF_8 ) ); + final byte[] resultByte = messageDigest.digest(); + result = new String(Hex.encodeHex(resultByte)); + } catch (NoSuchAlgorithmException e) { + logger.error("Problems getting the MD5 hash of the project name", e); + } + return result; + } + + protected String getSchemaName() { + if (getLocalPropertiesService().isUsingPostgreSqlDB()) { + return EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU; + } else { + return null; + } + } + + protected File getZippedProjectDB( ExportType type ) { + + File dbFolder = new File(FolderFinder.getCollectEarthDataFolder() + File.separator + type.getDataFolder()); + + if (!dbFolder.exists()) { + dbFolder.mkdir(); + } + + return new File(dbFolder.getAbsolutePath() + File.separator + getRdbFilePrefix( type ) + + type.getDbSuffix() + ".zip"); + } + + public boolean isRdbAlreadyGenerated(ExportType type) { + + boolean saikuDBAlreadyPresent = false; + if (getLocalPropertiesService().isUsingSqliteDB()) { + File rdbFile = getZippedProjectDB( type ); + saikuDBAlreadyPresent = rdbFile.exists(); + } else { + // Here we should check if the "rdbcollectearth" schema is created in the + // PostgreSQL database + saikuDBAlreadyPresent = true; + } + + return saikuDBAlreadyPresent; + } + + protected boolean isRefreshDatabase() { + return refreshDatabase; + } + + protected boolean isUserCancelledOperation() { + return userCancelledOperation; + } + + public abstract void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws RdbExportException; + + protected void replaceZippedProjectDB(ExportType type) throws IOException { + if ( getLocalPropertiesService().isUsingSqliteDB()) { + ZipFile zippedSaiku = CollectEarthUtils.addFileToZip( + getZippedProjectDB( type ), + getRdbExporter().getRdbFile( type ), + getRdbExporter().getRdbFile( type ).getName() + ); + zippedSaiku.close(); + } + } + + boolean restoreZippedProjectDB( ExportType type ) { + boolean restoredSaiku = false; + if (getZippedProjectDB( type ).exists()) { + // Unzip file + + try (ZipFile zippedProjectSaikuData = new ZipFile(getZippedProjectDB( type ))) { + zippedProjectSaikuData.extractAll(FolderFinder.getCollectEarthDataFolder()); + restoredSaiku = true; + } catch (IOException e) { + logger.error("Problems unzipping the contents of the zipped Saiku DB to the local user folder ", e); + } + + } + return restoredSaiku; + } + + public void setRefreshDatabase(boolean refreshDatabase) { + this.refreshDatabase = refreshDatabase; + } + + public void setUserCancelledOperation(boolean userCancelledOperation) { + this.userCancelledOperation = userCancelledOperation; + } +} \ No newline at end of file From cc8604f1343dd96b8f8fd3f5f0951f3e08c249a9 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:49 +0100 Subject: [PATCH 1072/1620] New translations GenerateDatabase.java (Spanish) --- .../earth/app/view/Messages_es.properties | 316 +++++++----------- 1 file changed, 129 insertions(+), 187 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 4ed72d856d..8f7c20dd42 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,187 +1,129 @@ -package org.openforis.collect.earth.app.service; - -import java.io.File; -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; - -import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; -import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import freemarker.template.TemplateException; - -/** - * Customizes a Bing Map page to open zoomed into a coordinate. The HTML page is - * created in a temporary file and its URL is returned so that it can be opened - * in a browser. A freemarker template that contains the javascript code to - * customize the Bing Map is used and the parameters for the specific - * coordinates are applied to it. This service uses the same code than the KML - * generator to get the plot sample deign as chosen through the configuration by - * the user. - * - * @author Alfonso Sanchez-Paus Diaz - * - */ -@Component -public class GeolocalizeMapService { - - private static final String RESOURCES_FOLDER = "resources"; - - /** - * The file that contains the freemarker template used to produce the Bing Maps - * code. - */ - public static final String FREEMARKER_BING_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectBing.fmt"; - - public static final String FREEMARKER_BAIDU_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectBaidu.fmt"; - - public static final String FREEMARKER_PLANET_MONTHLY_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectPlanetMonthlyHtml.fmt"; - - public static final String FREEMARKER_PLANET_NICFI_ARGUMENTS = RESOURCES_FOLDER + File.separator + "collectPlanetNicfiTxt.fmt"; - - public static final String FREEMARKER_PLANET_DAILY_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectPlanetHtml.fmt"; - - public static final String FREEMARKER_PLANET_URL_TEMPLATE = RESOURCES_FOLDER + File.separator - + "collectPlanetUrl.fmt"; - - /** - * The file that contains the freemarker template used to produce the Yandex - * Maps code. - */ - public static final String FREEMARKER_YANDEX_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator - + "collectYandex.fmt"; - - public static final String FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME = "eePlaygroundScript.fmt"; - public static final String FREEMARKER_GEE_CODE_EDITOR_TEMPLATE_FILE_NAME = "eeCodeEditorScript.fmt"; - - /** - * The file that contains the freemarker template used to produce script that is - * run in GEE Code Editor. - */ - public static final String FREEMARKER_GEE_PLAYGROUND_TEMPLATE = RESOURCES_FOLDER + File.separator - + FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME; - public static final String FREEMARKER_GEE_CODE_EDITOR_TEMPLATE = RESOURCES_FOLDER + File.separator - + FREEMARKER_GEE_CODE_EDITOR_TEMPLATE_FILE_NAME; - - public static final String FREEMARKER_HERE_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator - + "collectHereMaps.fmt"; - - public static final String FREEMARKER_STREET_VIEW_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator - + "collectStreetView.fmt"; - @Autowired - LocalPropertiesService localPropertiesService; - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - @Autowired - KmlGeneratorService kmlGeneratorService; - - public void addDatesForImages(final Map data) { - SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-MM-dd"); - Date todayDate = new Date(); - String dateAsExpected = dt1.format(todayDate); - data.put("todayDate", dateAsExpected); - - Calendar cal = Calendar.getInstance(); - cal.setTime(todayDate); - cal.add(Calendar.YEAR, -1); - - data.put("oneYearAgoDate", dt1.format(cal.getTime())); - - } - - private File applyData(Map data, String freemarkerTemplateFile) - throws IOException, TemplateException { - - final File templateFileSrc = new File(freemarkerTemplateFile); - - final File tempFileDst = File.createTempFile("selenium", ".html"); - tempFileDst.deleteOnExit(); - - FreemarkerTemplateUtils.applyTemplate(templateFileSrc, tempFileDst, data); - - return tempFileDst; - - } - - public Map getPlacemarkData(SimplePlacemarkObject placemarkObject) { - final Map data = new HashMap<>(); - data.put("placemark", placemarkObject); - return data; - } - - /** - * Produces a temporary file with the necessary HTML code to show the plot in - * Bing Maps - * - * @param placemarkObject - * The object containing information of the placemark. - * @param freemarkerTemplate - * The path to the freemarker template that is used to produce the - * file. - * @return The URL to the temporary file that can be used to load it in a - * browser. - */ - public URL getTemporaryUrl(SimplePlacemarkObject placemarkObject, String freemarkerTemplate) { - final Map data = getPlacemarkData(placemarkObject); - addDatesForImages(data); - return processTemplateWithData(freemarkerTemplate, data); - } - - /** - * Produces a URL using Planet Labs explorer expected format - * - * @param placemarkObject - * The data of the plot. - * @param freemarkerTemplate - * The freemarker template file to use - * @param extraData - * Variable listof key value strings - * @return The URL to the temporary file that can be used to load it in a - * browser. - */ - public URL getUrlToFreemarkerOutput(SimplePlacemarkObject placemarkObject, String freemarkerTemplate, - String... extraData) { - - final Map data = getPlacemarkData(placemarkObject); - - if( extraData !=null) { - for (int i = 0; i < extraData.length; i = i+2) { - data.put(extraData[i], extraData[i+1]); - } - } - return processTemplateWithData(freemarkerTemplate, data); - - } - - - private URL processTemplateWithData(String freemarkerTemplate, final Map data) { - File transformedHtml = null; - try { - transformedHtml = applyData(data, freemarkerTemplate); - } catch (final Exception e) { - logger.error("Exception when applying template " + freemarkerTemplate + "with data : " + data.toString(), - e); - } - if (transformedHtml != null) { - try { - return transformedHtml.toURI().toURL(); - } catch (MalformedURLException e) { - logger.error("Error generating URL for File " + transformedHtml.getAbsolutePath()); - return null; - } - } else { - logger.error("No Bing map HTML generated."); - return null; - } - } -} +package org.openforis.collect.earth.app.service; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +import org.apache.commons.codec.binary.Hex; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.ipcc.RdbExportException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import net.lingala.zip4j.ZipFile; + +public abstract class GenerateDatabase { + + + Logger logger = LoggerFactory.getLogger( GenerateDatabase.class); + boolean refreshDatabase; + boolean userCancelledOperation = false; + + public GenerateDatabase() { + super(); + } + + public abstract EarthSurveyService getEarthSurveyService(); + public abstract LocalPropertiesService getLocalPropertiesService(); + public abstract RDBExporter getRdbExporter(); + + private String getRdbFilePrefix( ExportType type ) { + String result = ""; + try { + final MessageDigest messageDigest = MessageDigest.getInstance("MD5"); + messageDigest.reset(); + String concatenation = getEarthSurveyService().getCollectSurvey().getUri() + + getEarthSurveyService().getCollectSurvey().getName(); + messageDigest.update(concatenation.getBytes( StandardCharsets.UTF_8 ) ); + final byte[] resultByte = messageDigest.digest(); + result = new String(Hex.encodeHex(resultByte)); + } catch (NoSuchAlgorithmException e) { + logger.error("Problems getting the MD5 hash of the project name", e); + } + return result; + } + + protected String getSchemaName() { + if (getLocalPropertiesService().isUsingPostgreSqlDB()) { + return EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU; + } else { + return null; + } + } + + protected File getZippedProjectDB( ExportType type ) { + + File dbFolder = new File(FolderFinder.getCollectEarthDataFolder() + File.separator + type.getDataFolder()); + + if (!dbFolder.exists()) { + dbFolder.mkdir(); + } + + return new File(dbFolder.getAbsolutePath() + File.separator + getRdbFilePrefix( type ) + + type.getDbSuffix() + ".zip"); + } + + public boolean isRdbAlreadyGenerated(ExportType type) { + + boolean saikuDBAlreadyPresent = false; + if (getLocalPropertiesService().isUsingSqliteDB()) { + File rdbFile = getZippedProjectDB( type ); + saikuDBAlreadyPresent = rdbFile.exists(); + } else { + // Here we should check if the "rdbcollectearth" schema is created in the + // PostgreSQL database + saikuDBAlreadyPresent = true; + } + + return saikuDBAlreadyPresent; + } + + protected boolean isRefreshDatabase() { + return refreshDatabase; + } + + protected boolean isUserCancelledOperation() { + return userCancelledOperation; + } + + public abstract void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws RdbExportException; + + protected void replaceZippedProjectDB(ExportType type) throws IOException { + if ( getLocalPropertiesService().isUsingSqliteDB()) { + ZipFile zippedSaiku = CollectEarthUtils.addFileToZip( + getZippedProjectDB( type ), + getRdbExporter().getRdbFile( type ), + getRdbExporter().getRdbFile( type ).getName() + ); + zippedSaiku.close(); + } + } + + boolean restoreZippedProjectDB( ExportType type ) { + boolean restoredSaiku = false; + if (getZippedProjectDB( type ).exists()) { + // Unzip file + + try (ZipFile zippedProjectSaikuData = new ZipFile(getZippedProjectDB( type ))) { + zippedProjectSaikuData.extractAll(FolderFinder.getCollectEarthDataFolder()); + restoredSaiku = true; + } catch (IOException e) { + logger.error("Problems unzipping the contents of the zipped Saiku DB to the local user folder ", e); + } + + } + return restoredSaiku; + } + + public void setRefreshDatabase(boolean refreshDatabase) { + this.refreshDatabase = refreshDatabase; + } + + public void setUserCancelledOperation(boolean userCancelledOperation) { + this.userCancelledOperation = userCancelledOperation; + } +} \ No newline at end of file From 39c11c8e62eecf0103013f04e1721743ec55b647 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:50 +0100 Subject: [PATCH 1073/1620] New translations GenerateDatabase.java (French) --- .../earth/app/view/Messages_fr.properties | 316 +++++++----------- 1 file changed, 129 insertions(+), 187 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 4ed72d856d..8f7c20dd42 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,187 +1,129 @@ -package org.openforis.collect.earth.app.service; - -import java.io.File; -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; - -import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; -import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import freemarker.template.TemplateException; - -/** - * Customizes a Bing Map page to open zoomed into a coordinate. The HTML page is - * created in a temporary file and its URL is returned so that it can be opened - * in a browser. A freemarker template that contains the javascript code to - * customize the Bing Map is used and the parameters for the specific - * coordinates are applied to it. This service uses the same code than the KML - * generator to get the plot sample deign as chosen through the configuration by - * the user. - * - * @author Alfonso Sanchez-Paus Diaz - * - */ -@Component -public class GeolocalizeMapService { - - private static final String RESOURCES_FOLDER = "resources"; - - /** - * The file that contains the freemarker template used to produce the Bing Maps - * code. - */ - public static final String FREEMARKER_BING_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectBing.fmt"; - - public static final String FREEMARKER_BAIDU_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectBaidu.fmt"; - - public static final String FREEMARKER_PLANET_MONTHLY_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectPlanetMonthlyHtml.fmt"; - - public static final String FREEMARKER_PLANET_NICFI_ARGUMENTS = RESOURCES_FOLDER + File.separator + "collectPlanetNicfiTxt.fmt"; - - public static final String FREEMARKER_PLANET_DAILY_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator + "collectPlanetHtml.fmt"; - - public static final String FREEMARKER_PLANET_URL_TEMPLATE = RESOURCES_FOLDER + File.separator - + "collectPlanetUrl.fmt"; - - /** - * The file that contains the freemarker template used to produce the Yandex - * Maps code. - */ - public static final String FREEMARKER_YANDEX_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator - + "collectYandex.fmt"; - - public static final String FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME = "eePlaygroundScript.fmt"; - public static final String FREEMARKER_GEE_CODE_EDITOR_TEMPLATE_FILE_NAME = "eeCodeEditorScript.fmt"; - - /** - * The file that contains the freemarker template used to produce script that is - * run in GEE Code Editor. - */ - public static final String FREEMARKER_GEE_PLAYGROUND_TEMPLATE = RESOURCES_FOLDER + File.separator - + FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME; - public static final String FREEMARKER_GEE_CODE_EDITOR_TEMPLATE = RESOURCES_FOLDER + File.separator - + FREEMARKER_GEE_CODE_EDITOR_TEMPLATE_FILE_NAME; - - public static final String FREEMARKER_HERE_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator - + "collectHereMaps.fmt"; - - public static final String FREEMARKER_STREET_VIEW_HTML_TEMPLATE = RESOURCES_FOLDER + File.separator - + "collectStreetView.fmt"; - @Autowired - LocalPropertiesService localPropertiesService; - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - @Autowired - KmlGeneratorService kmlGeneratorService; - - public void addDatesForImages(final Map data) { - SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-MM-dd"); - Date todayDate = new Date(); - String dateAsExpected = dt1.format(todayDate); - data.put("todayDate", dateAsExpected); - - Calendar cal = Calendar.getInstance(); - cal.setTime(todayDate); - cal.add(Calendar.YEAR, -1); - - data.put("oneYearAgoDate", dt1.format(cal.getTime())); - - } - - private File applyData(Map data, String freemarkerTemplateFile) - throws IOException, TemplateException { - - final File templateFileSrc = new File(freemarkerTemplateFile); - - final File tempFileDst = File.createTempFile("selenium", ".html"); - tempFileDst.deleteOnExit(); - - FreemarkerTemplateUtils.applyTemplate(templateFileSrc, tempFileDst, data); - - return tempFileDst; - - } - - public Map getPlacemarkData(SimplePlacemarkObject placemarkObject) { - final Map data = new HashMap<>(); - data.put("placemark", placemarkObject); - return data; - } - - /** - * Produces a temporary file with the necessary HTML code to show the plot in - * Bing Maps - * - * @param placemarkObject - * The object containing information of the placemark. - * @param freemarkerTemplate - * The path to the freemarker template that is used to produce the - * file. - * @return The URL to the temporary file that can be used to load it in a - * browser. - */ - public URL getTemporaryUrl(SimplePlacemarkObject placemarkObject, String freemarkerTemplate) { - final Map data = getPlacemarkData(placemarkObject); - addDatesForImages(data); - return processTemplateWithData(freemarkerTemplate, data); - } - - /** - * Produces a URL using Planet Labs explorer expected format - * - * @param placemarkObject - * The data of the plot. - * @param freemarkerTemplate - * The freemarker template file to use - * @param extraData - * Variable listof key value strings - * @return The URL to the temporary file that can be used to load it in a - * browser. - */ - public URL getUrlToFreemarkerOutput(SimplePlacemarkObject placemarkObject, String freemarkerTemplate, - String... extraData) { - - final Map data = getPlacemarkData(placemarkObject); - - if( extraData !=null) { - for (int i = 0; i < extraData.length; i = i+2) { - data.put(extraData[i], extraData[i+1]); - } - } - return processTemplateWithData(freemarkerTemplate, data); - - } - - - private URL processTemplateWithData(String freemarkerTemplate, final Map data) { - File transformedHtml = null; - try { - transformedHtml = applyData(data, freemarkerTemplate); - } catch (final Exception e) { - logger.error("Exception when applying template " + freemarkerTemplate + "with data : " + data.toString(), - e); - } - if (transformedHtml != null) { - try { - return transformedHtml.toURI().toURL(); - } catch (MalformedURLException e) { - logger.error("Error generating URL for File " + transformedHtml.getAbsolutePath()); - return null; - } - } else { - logger.error("No Bing map HTML generated."); - return null; - } - } -} +package org.openforis.collect.earth.app.service; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +import org.apache.commons.codec.binary.Hex; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.ipcc.RdbExportException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import net.lingala.zip4j.ZipFile; + +public abstract class GenerateDatabase { + + + Logger logger = LoggerFactory.getLogger( GenerateDatabase.class); + boolean refreshDatabase; + boolean userCancelledOperation = false; + + public GenerateDatabase() { + super(); + } + + public abstract EarthSurveyService getEarthSurveyService(); + public abstract LocalPropertiesService getLocalPropertiesService(); + public abstract RDBExporter getRdbExporter(); + + private String getRdbFilePrefix( ExportType type ) { + String result = ""; + try { + final MessageDigest messageDigest = MessageDigest.getInstance("MD5"); + messageDigest.reset(); + String concatenation = getEarthSurveyService().getCollectSurvey().getUri() + + getEarthSurveyService().getCollectSurvey().getName(); + messageDigest.update(concatenation.getBytes( StandardCharsets.UTF_8 ) ); + final byte[] resultByte = messageDigest.digest(); + result = new String(Hex.encodeHex(resultByte)); + } catch (NoSuchAlgorithmException e) { + logger.error("Problems getting the MD5 hash of the project name", e); + } + return result; + } + + protected String getSchemaName() { + if (getLocalPropertiesService().isUsingPostgreSqlDB()) { + return EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU; + } else { + return null; + } + } + + protected File getZippedProjectDB( ExportType type ) { + + File dbFolder = new File(FolderFinder.getCollectEarthDataFolder() + File.separator + type.getDataFolder()); + + if (!dbFolder.exists()) { + dbFolder.mkdir(); + } + + return new File(dbFolder.getAbsolutePath() + File.separator + getRdbFilePrefix( type ) + + type.getDbSuffix() + ".zip"); + } + + public boolean isRdbAlreadyGenerated(ExportType type) { + + boolean saikuDBAlreadyPresent = false; + if (getLocalPropertiesService().isUsingSqliteDB()) { + File rdbFile = getZippedProjectDB( type ); + saikuDBAlreadyPresent = rdbFile.exists(); + } else { + // Here we should check if the "rdbcollectearth" schema is created in the + // PostgreSQL database + saikuDBAlreadyPresent = true; + } + + return saikuDBAlreadyPresent; + } + + protected boolean isRefreshDatabase() { + return refreshDatabase; + } + + protected boolean isUserCancelledOperation() { + return userCancelledOperation; + } + + public abstract void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws RdbExportException; + + protected void replaceZippedProjectDB(ExportType type) throws IOException { + if ( getLocalPropertiesService().isUsingSqliteDB()) { + ZipFile zippedSaiku = CollectEarthUtils.addFileToZip( + getZippedProjectDB( type ), + getRdbExporter().getRdbFile( type ), + getRdbExporter().getRdbFile( type ).getName() + ); + zippedSaiku.close(); + } + } + + boolean restoreZippedProjectDB( ExportType type ) { + boolean restoredSaiku = false; + if (getZippedProjectDB( type ).exists()) { + // Unzip file + + try (ZipFile zippedProjectSaikuData = new ZipFile(getZippedProjectDB( type ))) { + zippedProjectSaikuData.extractAll(FolderFinder.getCollectEarthDataFolder()); + restoredSaiku = true; + } catch (IOException e) { + logger.error("Problems unzipping the contents of the zipped Saiku DB to the local user folder ", e); + } + + } + return restoredSaiku; + } + + public void setRefreshDatabase(boolean refreshDatabase) { + this.refreshDatabase = refreshDatabase; + } + + public void setUserCancelledOperation(boolean userCancelledOperation) { + this.userCancelledOperation = userCancelledOperation; + } +} \ No newline at end of file From 0c619cfea32aceed697b5f2a61cba7fbfcd30474 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:51 +0100 Subject: [PATCH 1074/1620] New translations FirefoxLocatorFixed.java (English) --- .../earth/app/view/Messages_en.properties | 323 ++---------------- 1 file changed, 34 insertions(+), 289 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index c2259f5db0..3f4bd647d1 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,319 +1,64 @@ package org.openforis.collect.earth.app.service; -import java.awt.Toolkit; -import java.awt.datatransfer.Clipboard; -import java.awt.datatransfer.StringSelection; import java.io.File; -import java.io.IOException; -import java.net.URISyntaxException; -import java.net.URL; -import java.nio.charset.StandardCharsets; -import java.util.NoSuchElementException; -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; -import org.openqa.selenium.By; -import org.openqa.selenium.JavascriptExecutor; -import org.openqa.selenium.Keys; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.remote.RemoteWebDriver; -import org.openqa.selenium.remote.RemoteWebElement; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; +import org.apache.commons.lang3.SystemUtils; -import liquibase.repackaged.org.apache.commons.lang3.SystemUtils; +public class FirefoxLocatorFixed{ -@Component -public class CodeEditorHandlerThread { - private static final String RUN_SCRIPT_BUTTON = "button.run-button"; - private static final String RESET_SCRIPT_BUTTON = "button.reset-button"; - private SimplePlacemarkObject placemarkObject; - - private RemoteWebDriver webDriverGee; - - @Autowired - private BrowserService browserService; - private Logger logger = LoggerFactory.getLogger(CodeEditorHandlerThread.class); - - @Autowired - private GeolocalizeMapService geoLocalizeTemplateService; - - @Autowired - private LocalPropertiesService localPropertiesService; - - public boolean isCodeEditorShowing() { - return BrowserService.isCssElementPresent(RUN_SCRIPT_BUTTON, webDriverGee); + private FirefoxLocatorFixed(){ } - public void runScript() throws IOException, URISyntaxException, InterruptedException { - - - try { - WebElement resetButton = webDriverGee.findElementByCssSelector(RESET_SCRIPT_BUTTON); - - forceClick( resetButton ); - - URL fileWithScript = geoLocalizeTemplateService.getTemporaryUrl(placemarkObject, getGeeCodeEditorTemplate()); - - WebElement textArea = webDriverGee.findElement(By.className("ace_text-input")); - - String contents = FileUtils.readFileToString(new File(fileWithScript.toURI()), StandardCharsets.UTF_8 ); - - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { - sendThroughKeys(textArea, contents); - - } else { - sendThroughClipboard(textArea, contents); - try { - // Fix bug provoked by antivirus not accepting the control characters sent by Selenium - WebElement element = webDriverGee.findElement(By.className("ace_line") ); - if( element!= null && element.getAttribute("value").trim().equals("av") ) { - sendThroughKeys(textArea, contents); - } - } catch (Exception e) { - logger.warn("Error while refreshing code editor", e); - - } - } - - Thread.sleep(1000); - WebElement runButton = webDriverGee.findElementByCssSelector(RUN_SCRIPT_BUTTON); - forceClick( runButton ); - } catch (NoSuchElementException e) { - try { - // retry - Thread.sleep(1000); - WebElement runButton = webDriverGee.findElementByCssSelector(RUN_SCRIPT_BUTTON); - forceClick( runButton ); - }catch (Exception e2) { - // TODO: handle exception - } - } - - } - - private void sendThroughClipboard(WebElement textArea, String contents) { - Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); - StringSelection clipboardtext = new StringSelection(contents); - clipboard.setContents(clipboardtext, null); - Keys controlChar = Keys.CONTROL; - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { - controlChar = Keys.COMMAND; + public static String tryToFindFolder(){ + String path = null; + if (SystemUtils.IS_OS_WINDOWS){ + return findInUsualWindowsLocations(); + }else if (SystemUtils.IS_OS_MAC){ + return findInUsualMacLocations(); } - textArea.sendKeys(Keys.chord(controlChar, "a")); - textArea.sendKeys(Keys.chord(controlChar, "v")); - } - - private void sendThroughKeys(WebElement textArea, String contents) - throws InterruptedException { - // Command key (apple key) is not working on Chrome on Mac. Try with the right click - // This is not going to be fixed by Selenium - - // Remove comments so it is faster to send the text! - String noComments = removeComments(contents); - // Clear the code area - WebElement clearButton = webDriverGee.findElementByCssSelector(RESET_SCRIPT_BUTTON); - forceClick( clearButton ); - - StringBuilder fixedScriptForMac = new StringBuilder(); - String[] lines = noComments.split("\\n"); - for (String line : lines) { - // Send the content of the script - String trimmedLine = line.trim(); - - // Add Spaces after "{" so we avoid the automatic closing of the method by GEE - // Playground JS - trimmedLine = trimmedLine.replace("{", "{ "); - - if (!StringUtils.isBlank(trimmedLine)) { - fixedScriptForMac = fixedScriptForMac.append(trimmedLine).append("\n"); - } - } - - fixedScriptForMac.append("//THE END"); // Don't remove this!!! this way we mark the point where there should be no trailing character removal - Keys controlChar = Keys.CONTROL; - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { - controlChar = Keys.COMMAND; - } - textArea.sendKeys(Keys.chord(controlChar, "a")); - textArea.sendKeys(fixedScriptForMac); -/* - Thread.sleep(500); - // Fix the extra characters added by removing the last 10 chars ( this is a bug from Selenium! ) - textArea.sendKeys(Keys.PAGE_DOWN); - Thread.sleep(500); - textArea.sendKeys(Keys.PAGE_DOWN); - */ - } - - private void forceClick( WebElement element ) { - JavascriptExecutor js = webDriverGee; - js.executeScript("arguments[0].click();", element); - } - - public String removeComments(String contents) { - - String wholeCode = contents; - wholeCode = wholeCode.replace("http://", ""); - wholeCode = wholeCode.replace("https://", ""); - wholeCode = wholeCode.replace("\r", ""); - - StringBuilder noComments = new StringBuilder(""); - int indexComments = contents.indexOf("//"); - if (indexComments != -1) { - while (indexComments >= 0) { - int endOfLine = contents.indexOf('\n', indexComments); - if (endOfLine != -1) - indexComments = contents.indexOf("//", endOfLine + 2); - else { - break; - } - - if (indexComments != -1) - noComments = noComments.append(contents.substring(endOfLine, indexComments)); - else - noComments = noComments.append(contents.substring(endOfLine)); - } - return noComments.toString(); - } else { - return wholeCode; - } + return path; } /** - * Get the GEE Playground script that should be used. There is an standard one - * that resides in resources/eePlaygroundScript.fmt but a project might have its - * own script. - * - * @return The generic script in the resources folder or the file called - * eePlaygroundScript.fmt in the same folder where the current project - * file resides + * Dynamic because the directory version number keep changing. */ - private String getGeeCodeEditorTemplate() { - - String projectPlaygroundScript = getProjectGeeScript(); - if (projectPlaygroundScript != null) { - return projectPlaygroundScript; - } else { - return GeolocalizeMapService.FREEMARKER_GEE_CODE_EDITOR_TEMPLATE; // New format name since version 1.6.20 - } + private static String findInUsualMacLocations() { - } - - /** - * @return The path to the GEE Code Editor generic script or the one that is - * specified in the project folder if it exists. - */ - private String getProjectGeeScript() { - // Is there a "eePlaygroundScript.fmt" file in the same folder than in the - // metadata file folder? - File projectGeePlayground = new File(localPropertiesService.getProjectFolder() + File.separatorChar - + GeolocalizeMapService.FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME); + String[] localAppDataLocations = new String[]{ + FolderFinder.getLocalAppDataFolder() + "/Applications/Firefox.app/Contents/MacOS/firefox-bin" , + FolderFinder.getLocalAppDataFolder() + "/Applications/Mozilla Firefox.app/Contents/MacOS/firefox-bin" + }; - // Is there a "eeCodeEditorScript.fmt" file in the same folder than in the - // metadata file folder? NEW NAME AFTER 12/2017!!! - File projectGeeCodeEditor = new File(localPropertiesService.getProjectFolder() + File.separatorChar - + GeolocalizeMapService.FREEMARKER_GEE_PLAYGROUND_TEMPLATE_FILE_NAME); + for (String path : localAppDataLocations) { + File f = new File(path); + if( f.exists() ){ + return path; + } - String geeFilePath = null; - if (projectGeeCodeEditor.exists()) { // The new format name takes precedence - geeFilePath = projectGeeCodeEditor.getAbsolutePath(); - } else if (projectGeePlayground.exists()) { - geeFilePath = projectGeePlayground.getAbsolutePath(); } - return geeFilePath; - } - public void loadCodeEditorScript(SimplePlacemarkObject placemarkObject, RemoteWebDriver webDriverGeePlayground) { - this.placemarkObject = placemarkObject; - loadCodeEditorScript(webDriverGeePlayground); + return null; } - public void disableCodeEditorAutocomplete(RemoteWebDriver webDriverCodeEditor) { - this.webDriverGee = webDriverCodeEditor; - try { - if (!isCodeEditorShowing()) { - // Open GEE Playground - if (!browserService.isDriverWorking(webDriverGee) || webDriverGee.getCurrentUrl() == null - || !webDriverGee.getCurrentUrl().contains("google")) { - webDriverGee = browserService.navigateTo(localPropertiesService.getGeePlaygoundUrl(), webDriverGee); - browserService.setWebDriverGeeCodeEditor(webDriverGee); - } - - // Initially the login page appears! - while (!isCodeEditorShowing()) { // 5 minutes a 2 seconds == 30 * 5 = 150 - Thread.sleep(2000); - } - } else { - disableAutoComplete(); - } + private static String findInUsualWindowsLocations() { - } catch (final NoSuchElementException e) { - // This is a well known exception. Down-grade if to warning - logger.warn("Error when opening Earth Engine browser window. Known problem", e); - } catch (final Exception e) { - // This is a well known exception. - logger.error("Error when opening Earth Engine browser window", e); - } - } + String[] localAppDataLocations = new String[]{ + FolderFinder.getLocalAppDataFolder() + "\\Firefox-3\\firefox.exe" , + FolderFinder.getLocalAppDataFolder() + "\\Mozilla Firefox\\firefox.exe", + FolderFinder.getLocalAppDataFolder() + "\\Firefox\\firefox.exe" + }; - private void disableAutoComplete() { - // Display the settings in Google Earth Engine Code Editor (this emulates - // clicking on the settings icon) - webDriverGee.findElementByClassName("settings-menu-button").click(); - // Get the Div that is the parent of the one with text that contains - // Autocomplete - RemoteWebElement autocompleteButton = (RemoteWebElement) webDriverGee - .findElementByXPath("//div[contains(text(), \"Autocomplete\")]/.."); + for (String path : localAppDataLocations) { + File f = new File(path); + if( f.exists() ){ + return path; + } - if (isAutocompleChecked(autocompleteButton)) { - // Disable the Autocomplete of special characters - autocompleteButton.click(); } - - } - - public boolean isAutocompleChecked(RemoteWebElement autocompleteButton) { - String buttonChecked = autocompleteButton.getAttribute("aria-checked"); - return buttonChecked.equals("true"); + return null; } - private void loadCodeEditorScript(RemoteWebDriver webDriverCodeEditor) { - this.webDriverGee = webDriverCodeEditor; - Thread loadGee = new Thread( - "Opening GEE Playground " + (placemarkObject != null ? placemarkObject.toString() : "")) { - @Override - public void run() { - try { - if (!isCodeEditorShowing()) { - // Open GEE Code Editor - if (!browserService.isDriverWorking(webDriverGee) || webDriverGee.getCurrentUrl() == null - || !webDriverGee.getCurrentUrl().contains("google")) { - webDriverGee = browserService.navigateTo(localPropertiesService.getGeePlaygoundUrl(), - webDriverGee); - browserService.setWebDriverGeeCodeEditor(webDriverGee); - } - // Initially the login page appears! - while (!isCodeEditorShowing()) { - sleep(2000); - } - } - runScript(); - } catch (final NoSuchElementException e) { - // This is a well known exception. Down-grade if to warning - logger.warn("Error when opening Earth Engine browser window. Known problem", e); - } catch (final Exception e) { - // This is a well known exception. - logger.error("Error when opening Earth Engine browser window", e); - } - } - }; - loadGee.start(); - } } From 7ddd9560fa11739ccf8cf1837d5e8566431a3043 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:52 +0100 Subject: [PATCH 1075/1620] New translations FirefoxLocatorFixed.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 193 ++++++------------ 1 file changed, 64 insertions(+), 129 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 8f7c20dd42..3f4bd647d1 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,129 +1,64 @@ -package org.openforis.collect.earth.app.service; - -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; - -import org.apache.commons.codec.binary.Hex; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.ipcc.RdbExportException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import net.lingala.zip4j.ZipFile; - -public abstract class GenerateDatabase { - - - Logger logger = LoggerFactory.getLogger( GenerateDatabase.class); - boolean refreshDatabase; - boolean userCancelledOperation = false; - - public GenerateDatabase() { - super(); - } - - public abstract EarthSurveyService getEarthSurveyService(); - public abstract LocalPropertiesService getLocalPropertiesService(); - public abstract RDBExporter getRdbExporter(); - - private String getRdbFilePrefix( ExportType type ) { - String result = ""; - try { - final MessageDigest messageDigest = MessageDigest.getInstance("MD5"); - messageDigest.reset(); - String concatenation = getEarthSurveyService().getCollectSurvey().getUri() - + getEarthSurveyService().getCollectSurvey().getName(); - messageDigest.update(concatenation.getBytes( StandardCharsets.UTF_8 ) ); - final byte[] resultByte = messageDigest.digest(); - result = new String(Hex.encodeHex(resultByte)); - } catch (NoSuchAlgorithmException e) { - logger.error("Problems getting the MD5 hash of the project name", e); - } - return result; - } - - protected String getSchemaName() { - if (getLocalPropertiesService().isUsingPostgreSqlDB()) { - return EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU; - } else { - return null; - } - } - - protected File getZippedProjectDB( ExportType type ) { - - File dbFolder = new File(FolderFinder.getCollectEarthDataFolder() + File.separator + type.getDataFolder()); - - if (!dbFolder.exists()) { - dbFolder.mkdir(); - } - - return new File(dbFolder.getAbsolutePath() + File.separator + getRdbFilePrefix( type ) - + type.getDbSuffix() + ".zip"); - } - - public boolean isRdbAlreadyGenerated(ExportType type) { - - boolean saikuDBAlreadyPresent = false; - if (getLocalPropertiesService().isUsingSqliteDB()) { - File rdbFile = getZippedProjectDB( type ); - saikuDBAlreadyPresent = rdbFile.exists(); - } else { - // Here we should check if the "rdbcollectearth" schema is created in the - // PostgreSQL database - saikuDBAlreadyPresent = true; - } - - return saikuDBAlreadyPresent; - } - - protected boolean isRefreshDatabase() { - return refreshDatabase; - } - - protected boolean isUserCancelledOperation() { - return userCancelledOperation; - } - - public abstract void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws RdbExportException; - - protected void replaceZippedProjectDB(ExportType type) throws IOException { - if ( getLocalPropertiesService().isUsingSqliteDB()) { - ZipFile zippedSaiku = CollectEarthUtils.addFileToZip( - getZippedProjectDB( type ), - getRdbExporter().getRdbFile( type ), - getRdbExporter().getRdbFile( type ).getName() - ); - zippedSaiku.close(); - } - } - - boolean restoreZippedProjectDB( ExportType type ) { - boolean restoredSaiku = false; - if (getZippedProjectDB( type ).exists()) { - // Unzip file - - try (ZipFile zippedProjectSaikuData = new ZipFile(getZippedProjectDB( type ))) { - zippedProjectSaikuData.extractAll(FolderFinder.getCollectEarthDataFolder()); - restoredSaiku = true; - } catch (IOException e) { - logger.error("Problems unzipping the contents of the zipped Saiku DB to the local user folder ", e); - } - - } - return restoredSaiku; - } - - public void setRefreshDatabase(boolean refreshDatabase) { - this.refreshDatabase = refreshDatabase; - } - - public void setUserCancelledOperation(boolean userCancelledOperation) { - this.userCancelledOperation = userCancelledOperation; - } -} \ No newline at end of file +package org.openforis.collect.earth.app.service; + +import java.io.File; + +import org.apache.commons.lang3.SystemUtils; + + +public class FirefoxLocatorFixed{ + + private FirefoxLocatorFixed(){ + } + + public static String tryToFindFolder(){ + String path = null; + if (SystemUtils.IS_OS_WINDOWS){ + return findInUsualWindowsLocations(); + }else if (SystemUtils.IS_OS_MAC){ + return findInUsualMacLocations(); + } + + return path; + } + + /** + * Dynamic because the directory version number keep changing. + */ + private static String findInUsualMacLocations() { + + String[] localAppDataLocations = new String[]{ + FolderFinder.getLocalAppDataFolder() + "/Applications/Firefox.app/Contents/MacOS/firefox-bin" , + FolderFinder.getLocalAppDataFolder() + "/Applications/Mozilla Firefox.app/Contents/MacOS/firefox-bin" + }; + + for (String path : localAppDataLocations) { + File f = new File(path); + if( f.exists() ){ + return path; + } + + } + + return null; + } + + + private static String findInUsualWindowsLocations() { + + String[] localAppDataLocations = new String[]{ + FolderFinder.getLocalAppDataFolder() + "\\Firefox-3\\firefox.exe" , + FolderFinder.getLocalAppDataFolder() + "\\Mozilla Firefox\\firefox.exe", + FolderFinder.getLocalAppDataFolder() + "\\Firefox\\firefox.exe" + }; + + for (String path : localAppDataLocations) { + File f = new File(path); + if( f.exists() ){ + return path; + } + + } + return null; + } + +} From 62006e6bd7b4998c7359c573a76e172e20b57962 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:53 +0100 Subject: [PATCH 1076/1620] New translations FirefoxLocatorFixed.java (Spanish) --- .../earth/app/view/Messages_es.properties | 193 ++++++------------ 1 file changed, 64 insertions(+), 129 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 8f7c20dd42..3f4bd647d1 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,129 +1,64 @@ -package org.openforis.collect.earth.app.service; - -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; - -import org.apache.commons.codec.binary.Hex; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.ipcc.RdbExportException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import net.lingala.zip4j.ZipFile; - -public abstract class GenerateDatabase { - - - Logger logger = LoggerFactory.getLogger( GenerateDatabase.class); - boolean refreshDatabase; - boolean userCancelledOperation = false; - - public GenerateDatabase() { - super(); - } - - public abstract EarthSurveyService getEarthSurveyService(); - public abstract LocalPropertiesService getLocalPropertiesService(); - public abstract RDBExporter getRdbExporter(); - - private String getRdbFilePrefix( ExportType type ) { - String result = ""; - try { - final MessageDigest messageDigest = MessageDigest.getInstance("MD5"); - messageDigest.reset(); - String concatenation = getEarthSurveyService().getCollectSurvey().getUri() - + getEarthSurveyService().getCollectSurvey().getName(); - messageDigest.update(concatenation.getBytes( StandardCharsets.UTF_8 ) ); - final byte[] resultByte = messageDigest.digest(); - result = new String(Hex.encodeHex(resultByte)); - } catch (NoSuchAlgorithmException e) { - logger.error("Problems getting the MD5 hash of the project name", e); - } - return result; - } - - protected String getSchemaName() { - if (getLocalPropertiesService().isUsingPostgreSqlDB()) { - return EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU; - } else { - return null; - } - } - - protected File getZippedProjectDB( ExportType type ) { - - File dbFolder = new File(FolderFinder.getCollectEarthDataFolder() + File.separator + type.getDataFolder()); - - if (!dbFolder.exists()) { - dbFolder.mkdir(); - } - - return new File(dbFolder.getAbsolutePath() + File.separator + getRdbFilePrefix( type ) - + type.getDbSuffix() + ".zip"); - } - - public boolean isRdbAlreadyGenerated(ExportType type) { - - boolean saikuDBAlreadyPresent = false; - if (getLocalPropertiesService().isUsingSqliteDB()) { - File rdbFile = getZippedProjectDB( type ); - saikuDBAlreadyPresent = rdbFile.exists(); - } else { - // Here we should check if the "rdbcollectearth" schema is created in the - // PostgreSQL database - saikuDBAlreadyPresent = true; - } - - return saikuDBAlreadyPresent; - } - - protected boolean isRefreshDatabase() { - return refreshDatabase; - } - - protected boolean isUserCancelledOperation() { - return userCancelledOperation; - } - - public abstract void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws RdbExportException; - - protected void replaceZippedProjectDB(ExportType type) throws IOException { - if ( getLocalPropertiesService().isUsingSqliteDB()) { - ZipFile zippedSaiku = CollectEarthUtils.addFileToZip( - getZippedProjectDB( type ), - getRdbExporter().getRdbFile( type ), - getRdbExporter().getRdbFile( type ).getName() - ); - zippedSaiku.close(); - } - } - - boolean restoreZippedProjectDB( ExportType type ) { - boolean restoredSaiku = false; - if (getZippedProjectDB( type ).exists()) { - // Unzip file - - try (ZipFile zippedProjectSaikuData = new ZipFile(getZippedProjectDB( type ))) { - zippedProjectSaikuData.extractAll(FolderFinder.getCollectEarthDataFolder()); - restoredSaiku = true; - } catch (IOException e) { - logger.error("Problems unzipping the contents of the zipped Saiku DB to the local user folder ", e); - } - - } - return restoredSaiku; - } - - public void setRefreshDatabase(boolean refreshDatabase) { - this.refreshDatabase = refreshDatabase; - } - - public void setUserCancelledOperation(boolean userCancelledOperation) { - this.userCancelledOperation = userCancelledOperation; - } -} \ No newline at end of file +package org.openforis.collect.earth.app.service; + +import java.io.File; + +import org.apache.commons.lang3.SystemUtils; + + +public class FirefoxLocatorFixed{ + + private FirefoxLocatorFixed(){ + } + + public static String tryToFindFolder(){ + String path = null; + if (SystemUtils.IS_OS_WINDOWS){ + return findInUsualWindowsLocations(); + }else if (SystemUtils.IS_OS_MAC){ + return findInUsualMacLocations(); + } + + return path; + } + + /** + * Dynamic because the directory version number keep changing. + */ + private static String findInUsualMacLocations() { + + String[] localAppDataLocations = new String[]{ + FolderFinder.getLocalAppDataFolder() + "/Applications/Firefox.app/Contents/MacOS/firefox-bin" , + FolderFinder.getLocalAppDataFolder() + "/Applications/Mozilla Firefox.app/Contents/MacOS/firefox-bin" + }; + + for (String path : localAppDataLocations) { + File f = new File(path); + if( f.exists() ){ + return path; + } + + } + + return null; + } + + + private static String findInUsualWindowsLocations() { + + String[] localAppDataLocations = new String[]{ + FolderFinder.getLocalAppDataFolder() + "\\Firefox-3\\firefox.exe" , + FolderFinder.getLocalAppDataFolder() + "\\Mozilla Firefox\\firefox.exe", + FolderFinder.getLocalAppDataFolder() + "\\Firefox\\firefox.exe" + }; + + for (String path : localAppDataLocations) { + File f = new File(path); + if( f.exists() ){ + return path; + } + + } + return null; + } + +} From 81d0640022834a8909f8c7739d502f093480ff18 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:55 +0100 Subject: [PATCH 1077/1620] New translations FirefoxLocatorFixed.java (French) --- .../earth/app/view/Messages_fr.properties | 193 ++++++------------ 1 file changed, 64 insertions(+), 129 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 8f7c20dd42..3f4bd647d1 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,129 +1,64 @@ -package org.openforis.collect.earth.app.service; - -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; - -import org.apache.commons.codec.binary.Hex; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.ipcc.RdbExportException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import net.lingala.zip4j.ZipFile; - -public abstract class GenerateDatabase { - - - Logger logger = LoggerFactory.getLogger( GenerateDatabase.class); - boolean refreshDatabase; - boolean userCancelledOperation = false; - - public GenerateDatabase() { - super(); - } - - public abstract EarthSurveyService getEarthSurveyService(); - public abstract LocalPropertiesService getLocalPropertiesService(); - public abstract RDBExporter getRdbExporter(); - - private String getRdbFilePrefix( ExportType type ) { - String result = ""; - try { - final MessageDigest messageDigest = MessageDigest.getInstance("MD5"); - messageDigest.reset(); - String concatenation = getEarthSurveyService().getCollectSurvey().getUri() - + getEarthSurveyService().getCollectSurvey().getName(); - messageDigest.update(concatenation.getBytes( StandardCharsets.UTF_8 ) ); - final byte[] resultByte = messageDigest.digest(); - result = new String(Hex.encodeHex(resultByte)); - } catch (NoSuchAlgorithmException e) { - logger.error("Problems getting the MD5 hash of the project name", e); - } - return result; - } - - protected String getSchemaName() { - if (getLocalPropertiesService().isUsingPostgreSqlDB()) { - return EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU; - } else { - return null; - } - } - - protected File getZippedProjectDB( ExportType type ) { - - File dbFolder = new File(FolderFinder.getCollectEarthDataFolder() + File.separator + type.getDataFolder()); - - if (!dbFolder.exists()) { - dbFolder.mkdir(); - } - - return new File(dbFolder.getAbsolutePath() + File.separator + getRdbFilePrefix( type ) - + type.getDbSuffix() + ".zip"); - } - - public boolean isRdbAlreadyGenerated(ExportType type) { - - boolean saikuDBAlreadyPresent = false; - if (getLocalPropertiesService().isUsingSqliteDB()) { - File rdbFile = getZippedProjectDB( type ); - saikuDBAlreadyPresent = rdbFile.exists(); - } else { - // Here we should check if the "rdbcollectearth" schema is created in the - // PostgreSQL database - saikuDBAlreadyPresent = true; - } - - return saikuDBAlreadyPresent; - } - - protected boolean isRefreshDatabase() { - return refreshDatabase; - } - - protected boolean isUserCancelledOperation() { - return userCancelledOperation; - } - - public abstract void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws RdbExportException; - - protected void replaceZippedProjectDB(ExportType type) throws IOException { - if ( getLocalPropertiesService().isUsingSqliteDB()) { - ZipFile zippedSaiku = CollectEarthUtils.addFileToZip( - getZippedProjectDB( type ), - getRdbExporter().getRdbFile( type ), - getRdbExporter().getRdbFile( type ).getName() - ); - zippedSaiku.close(); - } - } - - boolean restoreZippedProjectDB( ExportType type ) { - boolean restoredSaiku = false; - if (getZippedProjectDB( type ).exists()) { - // Unzip file - - try (ZipFile zippedProjectSaikuData = new ZipFile(getZippedProjectDB( type ))) { - zippedProjectSaikuData.extractAll(FolderFinder.getCollectEarthDataFolder()); - restoredSaiku = true; - } catch (IOException e) { - logger.error("Problems unzipping the contents of the zipped Saiku DB to the local user folder ", e); - } - - } - return restoredSaiku; - } - - public void setRefreshDatabase(boolean refreshDatabase) { - this.refreshDatabase = refreshDatabase; - } - - public void setUserCancelledOperation(boolean userCancelledOperation) { - this.userCancelledOperation = userCancelledOperation; - } -} \ No newline at end of file +package org.openforis.collect.earth.app.service; + +import java.io.File; + +import org.apache.commons.lang3.SystemUtils; + + +public class FirefoxLocatorFixed{ + + private FirefoxLocatorFixed(){ + } + + public static String tryToFindFolder(){ + String path = null; + if (SystemUtils.IS_OS_WINDOWS){ + return findInUsualWindowsLocations(); + }else if (SystemUtils.IS_OS_MAC){ + return findInUsualMacLocations(); + } + + return path; + } + + /** + * Dynamic because the directory version number keep changing. + */ + private static String findInUsualMacLocations() { + + String[] localAppDataLocations = new String[]{ + FolderFinder.getLocalAppDataFolder() + "/Applications/Firefox.app/Contents/MacOS/firefox-bin" , + FolderFinder.getLocalAppDataFolder() + "/Applications/Mozilla Firefox.app/Contents/MacOS/firefox-bin" + }; + + for (String path : localAppDataLocations) { + File f = new File(path); + if( f.exists() ){ + return path; + } + + } + + return null; + } + + + private static String findInUsualWindowsLocations() { + + String[] localAppDataLocations = new String[]{ + FolderFinder.getLocalAppDataFolder() + "\\Firefox-3\\firefox.exe" , + FolderFinder.getLocalAppDataFolder() + "\\Mozilla Firefox\\firefox.exe", + FolderFinder.getLocalAppDataFolder() + "\\Firefox\\firefox.exe" + }; + + for (String path : localAppDataLocations) { + File f = new File(path); + if( f.exists() ){ + return path; + } + + } + return null; + } + +} From db8adb66b95159f184ae00fa6f82d5dec8d790a2 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:56 +0100 Subject: [PATCH 1078/1620] New translations GenerateDatabase.java (English) --- .../earth/app/view/Messages_en.properties | 193 ++++++++++++------ 1 file changed, 129 insertions(+), 64 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 3f4bd647d1..8f7c20dd42 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,64 +1,129 @@ -package org.openforis.collect.earth.app.service; - -import java.io.File; - -import org.apache.commons.lang3.SystemUtils; - - -public class FirefoxLocatorFixed{ - - private FirefoxLocatorFixed(){ - } - - public static String tryToFindFolder(){ - String path = null; - if (SystemUtils.IS_OS_WINDOWS){ - return findInUsualWindowsLocations(); - }else if (SystemUtils.IS_OS_MAC){ - return findInUsualMacLocations(); - } - - return path; - } - - /** - * Dynamic because the directory version number keep changing. - */ - private static String findInUsualMacLocations() { - - String[] localAppDataLocations = new String[]{ - FolderFinder.getLocalAppDataFolder() + "/Applications/Firefox.app/Contents/MacOS/firefox-bin" , - FolderFinder.getLocalAppDataFolder() + "/Applications/Mozilla Firefox.app/Contents/MacOS/firefox-bin" - }; - - for (String path : localAppDataLocations) { - File f = new File(path); - if( f.exists() ){ - return path; - } - - } - - return null; - } - - - private static String findInUsualWindowsLocations() { - - String[] localAppDataLocations = new String[]{ - FolderFinder.getLocalAppDataFolder() + "\\Firefox-3\\firefox.exe" , - FolderFinder.getLocalAppDataFolder() + "\\Mozilla Firefox\\firefox.exe", - FolderFinder.getLocalAppDataFolder() + "\\Firefox\\firefox.exe" - }; - - for (String path : localAppDataLocations) { - File f = new File(path); - if( f.exists() ){ - return path; - } - - } - return null; - } - -} +package org.openforis.collect.earth.app.service; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +import org.apache.commons.codec.binary.Hex; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.ipcc.RdbExportException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import net.lingala.zip4j.ZipFile; + +public abstract class GenerateDatabase { + + + Logger logger = LoggerFactory.getLogger( GenerateDatabase.class); + boolean refreshDatabase; + boolean userCancelledOperation = false; + + public GenerateDatabase() { + super(); + } + + public abstract EarthSurveyService getEarthSurveyService(); + public abstract LocalPropertiesService getLocalPropertiesService(); + public abstract RDBExporter getRdbExporter(); + + private String getRdbFilePrefix( ExportType type ) { + String result = ""; + try { + final MessageDigest messageDigest = MessageDigest.getInstance("MD5"); + messageDigest.reset(); + String concatenation = getEarthSurveyService().getCollectSurvey().getUri() + + getEarthSurveyService().getCollectSurvey().getName(); + messageDigest.update(concatenation.getBytes( StandardCharsets.UTF_8 ) ); + final byte[] resultByte = messageDigest.digest(); + result = new String(Hex.encodeHex(resultByte)); + } catch (NoSuchAlgorithmException e) { + logger.error("Problems getting the MD5 hash of the project name", e); + } + return result; + } + + protected String getSchemaName() { + if (getLocalPropertiesService().isUsingPostgreSqlDB()) { + return EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU; + } else { + return null; + } + } + + protected File getZippedProjectDB( ExportType type ) { + + File dbFolder = new File(FolderFinder.getCollectEarthDataFolder() + File.separator + type.getDataFolder()); + + if (!dbFolder.exists()) { + dbFolder.mkdir(); + } + + return new File(dbFolder.getAbsolutePath() + File.separator + getRdbFilePrefix( type ) + + type.getDbSuffix() + ".zip"); + } + + public boolean isRdbAlreadyGenerated(ExportType type) { + + boolean saikuDBAlreadyPresent = false; + if (getLocalPropertiesService().isUsingSqliteDB()) { + File rdbFile = getZippedProjectDB( type ); + saikuDBAlreadyPresent = rdbFile.exists(); + } else { + // Here we should check if the "rdbcollectearth" schema is created in the + // PostgreSQL database + saikuDBAlreadyPresent = true; + } + + return saikuDBAlreadyPresent; + } + + protected boolean isRefreshDatabase() { + return refreshDatabase; + } + + protected boolean isUserCancelledOperation() { + return userCancelledOperation; + } + + public abstract void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws RdbExportException; + + protected void replaceZippedProjectDB(ExportType type) throws IOException { + if ( getLocalPropertiesService().isUsingSqliteDB()) { + ZipFile zippedSaiku = CollectEarthUtils.addFileToZip( + getZippedProjectDB( type ), + getRdbExporter().getRdbFile( type ), + getRdbExporter().getRdbFile( type ).getName() + ); + zippedSaiku.close(); + } + } + + boolean restoreZippedProjectDB( ExportType type ) { + boolean restoredSaiku = false; + if (getZippedProjectDB( type ).exists()) { + // Unzip file + + try (ZipFile zippedProjectSaikuData = new ZipFile(getZippedProjectDB( type ))) { + zippedProjectSaikuData.extractAll(FolderFinder.getCollectEarthDataFolder()); + restoredSaiku = true; + } catch (IOException e) { + logger.error("Problems unzipping the contents of the zipped Saiku DB to the local user folder ", e); + } + + } + return restoredSaiku; + } + + public void setRefreshDatabase(boolean refreshDatabase) { + this.refreshDatabase = refreshDatabase; + } + + public void setUserCancelledOperation(boolean userCancelledOperation) { + this.userCancelledOperation = userCancelledOperation; + } +} \ No newline at end of file From 3b2c042ef4d9de22cec01ccc0a12433c83a760a4 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:57 +0100 Subject: [PATCH 1079/1620] New translations ExportType.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 119 ++++++++---------- 1 file changed, 55 insertions(+), 64 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 3f4bd647d1..7633aaf9fd 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,64 +1,55 @@ -package org.openforis.collect.earth.app.service; - -import java.io.File; - -import org.apache.commons.lang3.SystemUtils; - - -public class FirefoxLocatorFixed{ - - private FirefoxLocatorFixed(){ - } - - public static String tryToFindFolder(){ - String path = null; - if (SystemUtils.IS_OS_WINDOWS){ - return findInUsualWindowsLocations(); - }else if (SystemUtils.IS_OS_MAC){ - return findInUsualMacLocations(); - } - - return path; - } - - /** - * Dynamic because the directory version number keep changing. - */ - private static String findInUsualMacLocations() { - - String[] localAppDataLocations = new String[]{ - FolderFinder.getLocalAppDataFolder() + "/Applications/Firefox.app/Contents/MacOS/firefox-bin" , - FolderFinder.getLocalAppDataFolder() + "/Applications/Mozilla Firefox.app/Contents/MacOS/firefox-bin" - }; - - for (String path : localAppDataLocations) { - File f = new File(path); - if( f.exists() ){ - return path; - } - - } - - return null; - } - - - private static String findInUsualWindowsLocations() { - - String[] localAppDataLocations = new String[]{ - FolderFinder.getLocalAppDataFolder() + "\\Firefox-3\\firefox.exe" , - FolderFinder.getLocalAppDataFolder() + "\\Mozilla Firefox\\firefox.exe", - FolderFinder.getLocalAppDataFolder() + "\\Firefox\\firefox.exe" - }; - - for (String path : localAppDataLocations) { - File f = new File(path); - if( f.exists() ){ - return path; - } - - } - return null; - } - -} +package org.openforis.collect.earth.app.service; + +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.desktop.ServerController; + +public enum ExportType { + SAIKU( + ServerController.SAIKU_RDB_SUFFIX, + "Saiku", + "SaikuDataFolder", + EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + ServerController.SAIKU_RDB_SUFFIX, + EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU + ), + IPCC( + ServerController.IPCC_RDB_SUFFIX, + "Ipcc", + "IPCCDataFolder", + EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + ServerController.IPCC_RDB_SUFFIX, + EarthConstants.POSTGRES_RDB_SCHEMA_IPCC + ); + + private String dbSuffix; + private String prefix; + private String dataFolder; + private String dbFileName; + private String rdbSchema; + + ExportType(String dbSuffix, String prefix, String dataFolder, String dbFileName, String rdbSchema ) { + this.dbSuffix = dbSuffix; + this.prefix = prefix; + this.dbFileName = dbFileName; + this.rdbSchema = rdbSchema; + } + + public String getDbSuffix() { + return dbSuffix; + } + + public String getPrefix() { + return prefix; + } + + public String getDataFolder() { + return dataFolder; + } + + public String getDbFileName() { + return dbFileName; + } + + public String getRdbSchema() { + return rdbSchema; + } + +} \ No newline at end of file From e848823f9375af111406cb0779375277442f697a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:58 +0100 Subject: [PATCH 1080/1620] New translations EarthProjectsService.java (Spanish) --- .../earth/app/view/Messages_es.properties | 344 ++++++++++++++++-- 1 file changed, 313 insertions(+), 31 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 3f4bd647d1..4f3bc4f7d2 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,64 +1,346 @@ package org.openforis.collect.earth.app.service; import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; -import org.apache.commons.lang3.SystemUtils; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.filefilter.IOFileFilter; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.exception.ZipException; -public class FirefoxLocatorFixed{ - private FirefoxLocatorFixed(){ + +@Component +public class EarthProjectsService { + + + private static final int OLD_MAX_FOLDER_LENGTH = 20; + + private static final int NEW_MAX_FOLDER_LENGTH = 255; + + private static final String PROJECT_PROPERTIES_FILE_NAME = "project_definition.properties"; //$NON-NLS-1$ + + private static final String PROJECTS = "projects"; //$NON-NLS-1$ + + @Autowired + LocalPropertiesService localPropertiesService; + + private Logger logger = LoggerFactory.getLogger( EarthProjectsService.class ); + + public void init(LocalPropertiesService localPropertiesService) { + this.localPropertiesService = localPropertiesService; } - public static String tryToFindFolder(){ - String path = null; - if (SystemUtils.IS_OS_WINDOWS){ - return findInUsualWindowsLocations(); - }else if (SystemUtils.IS_OS_MAC){ - return findInUsualMacLocations(); + public Map getProjectList(){ + ArrayList projectFolders = getProjects(); + + HashMap projectListByName = new HashMap<>(); + for (File projectFolder : projectFolders) { + + try { + + File projectPropertiesFile = getProjectPropertiesFile( projectFolder ); + String projectName = getProjectSurveyName(projectPropertiesFile); + if( projectName != null ) { + projectListByName.put( projectName , projectFolder); + } + } catch (IOException e) { + logger.error("The project definition file cannot be read.", e); //$NON-NLS-1$ + } + } - return path; + return projectListByName; } + + private String getProjectSurveyName(File projectPropertiesFile) throws IOException { + Properties properties = getProjectProperties(projectPropertiesFile); + if( properties != null) + return properties.getProperty( EarthProperty.SURVEY_NAME.toString() ); + else + return null; + } + + + private ArrayList getProjects() { + String loadedProjects = localPropertiesService.getValue( EarthProperty.LOADED_PROJECTS ); + + String[] projectFolderPaths = loadedProjects.split( File.pathSeparator ); + + ArrayList workingProjectFolders = new ArrayList<>(); + + for (String projectFolder : projectFolderPaths) { + try { + + File projectFolderFile = new File(projectFolder); + File projectDefinitionFile = getProjectPropertiesFile( projectFolderFile); + if( validateProjectDefinitionFile( projectDefinitionFile ) ){ + workingProjectFolders.add( projectFolderFile ); + } + + } catch (IllegalArgumentException e) { + logger.error("The project definition file is not complete.", e); //$NON-NLS-1$ + } catch (IOException e) { + logger.error("The project definition file cannot be read.", e); //$NON-NLS-1$ + } + + } + + + return workingProjectFolders; + } + + + private boolean checkValidContent(File definitionFile) throws IOException { + Properties projectProperties = getProjectProperties( definitionFile ); + return projectProperties.containsKey( EarthProperty.SURVEY_NAME.toString() ); + + } + + /** - * Dynamic because the directory version number keep changing. + * Loads the contents of the project-specific properties into earth.properties + * + * @param projectFolder The folder where the project definition and the rest of the files reside. + * @return True is the project was loaded correctly + * @throws IOException If the project folder or one of its files cannot be found */ - private static String findInUsualMacLocations() { + public boolean loadProjectInFolder(File projectFolder) throws IOException{ + + File projectPropertiesFile = getProjectPropertiesFile( projectFolder ); + + boolean success = false; + + // Change the loaded project only if the project definition file has changed or the user changes project + if( + !getProjectDefinitionMD5().equals( CollectEarthUtils.getMd5FromFolder( projectFolder ) ) + && + validateProjectDefinitionFile(projectPropertiesFile) + ){ + + // Remove the version of the survey used so that it is asked again to the user! + localPropertiesService.removeModelVersionName(); + + Properties projectProperties = getProjectProperties( projectPropertiesFile ); + + applyPropertiesToCollectEarth( projectProperties, projectFolder ); + + addToProjectList(projectFolder); + + setProjectDefinitionMD5(projectFolder); - String[] localAppDataLocations = new String[]{ - FolderFinder.getLocalAppDataFolder() + "/Applications/Firefox.app/Contents/MacOS/firefox-bin" , - FolderFinder.getLocalAppDataFolder() + "/Applications/Mozilla Firefox.app/Contents/MacOS/firefox-bin" - }; + moveSaikuQueriesToRepository(projectFolder, (String) projectProperties.get("survey_name") ); - for (String path : localAppDataLocations) { - File f = new File(path); - if( f.exists() ){ - return path; + success = true; + } + + + return success; + } + + + private void moveSaikuQueriesToRepository(File projectFolder, String surveyName) { + + try { + Collection saikuFiles = getSaikuFiles( projectFolder ); + + String repoDirectory = "tomcat/webapps/saiku/WEB-INF/classes/saiku-repository"; + File saikuRepo = new File( localPropertiesService.getSaikuFolder() + File.separator + repoDirectory + File.separator + surveyName ); + + for (File saikuFile : saikuFiles) { + FileUtils.copyFileToDirectory(saikuFile, saikuRepo, true); } + } catch (IOException e) { + logger.error("Error moving the Saiku files", e); + } + + + + } + private Collection getSaikuFiles(File projectFolder) { + return FileUtils.listFiles(projectFolder, new IOFileFilter() { + + @Override + public boolean accept(File dir, String name) { + return name.endsWith("saiku"); + } + + @Override + public boolean accept(File file) { + + return file.getName().endsWith("saiku"); + } + }, null); + } + + private void setProjectDefinitionMD5(File projectFolder) throws IOException { + localPropertiesService.setValue( EarthProperty.ACTIVE_PROJECT_DEFINITION, CollectEarthUtils.getMd5FromFolder( projectFolder ) ); + } + + private String getProjectDefinitionMD5() { + return localPropertiesService.getValue( EarthProperty.ACTIVE_PROJECT_DEFINITION); + } + + + public File getProjectPropertiesFile(File projectFolder) { + return new File( projectFolder.getAbsolutePath() + File.separator + PROJECT_PROPERTIES_FILE_NAME ); + } + + public File getSurveyStructureFile(File projectFolder) { + return new File( projectFolder.getAbsolutePath() + File.separator + PROJECT_PROPERTIES_FILE_NAME ); + } + + private void applyPropertiesToCollectEarth(Properties projectProperties, File projectFolder) { + + for (Object key : projectProperties.keySet()) { + String value = projectProperties.getProperty((String) key); + value = value.replace("${project_path}", projectFolder.getAbsolutePath()); //$NON-NLS-1$ + EarthProperty earthPropertyEnum = getEarthPropertyEnum(key); + if( earthPropertyEnum != null ){ + localPropertiesService.setValue( earthPropertyEnum , value); + }else{ + logger.warn("The property in the is unknown : {}", key) ; //$NON-NLS-1$ + } } + } + + private EarthProperty getEarthPropertyEnum(Object key) { + EarthProperty[] values = EarthProperty.values(); + for (EarthProperty earthProperty : values) { + if( earthProperty.toString().equals( key ) ){ + return earthProperty; + } + } return null; } + private Properties getProjectProperties(File definitionFile) throws IOException { + try( FileReader fr = new FileReader( definitionFile ) ){ + Properties properties = new Properties(); + properties.load(fr); + return properties; + }catch(IOException e ) { + logger.error("Impossible to open properties file ", e); + throw e; + } + } + + private void addToProjectList(File projectFolder) { + String loadedProjects = localPropertiesService.getValue( EarthProperty.LOADED_PROJECTS ); + + if( loadedProjects.length() > 0 ){ + + if( !ArrayUtils.contains(loadedProjects.split(File.pathSeparator), projectFolder.getAbsoluteFile() ) ){ + loadedProjects += File.pathSeparatorChar + projectFolder.getAbsolutePath(); + + } + }else{ + loadedProjects = projectFolder.getAbsolutePath(); + } + localPropertiesService.setValue( EarthProperty.LOADED_PROJECTS, loadedProjects ); + } + + + private boolean validateProjectDefinitionFile(File projectDefinitionFile) throws IOException{ + boolean success = false; + if( projectDefinitionFile.exists() ){ + if( checkValidContent(projectDefinitionFile) ){ + success = true; + }else{ + throw new IllegalArgumentException("The project definition file does not contain the necessary property " + EarthProperty.SURVEY_NAME.toString()+ ". File located at : " + projectDefinitionFile.getAbsolutePath() ); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + return success; + } + + + public boolean folderContainsProjectDefinition(File folder ) throws IOException{ + File projectPropertiesFile = getProjectPropertiesFile( folder ); + return validateProjectDefinitionFile(projectPropertiesFile); + } + + + public boolean loadCompressedProjectFile( File projectZipFile ) throws IOException{ + + File unzippedFolder = unzipContentsOnProjectFolder(projectZipFile); + return( loadProjectInFolder(unzippedFolder) ); + } + - private static String findInUsualWindowsLocations() { + private File unzipContentsOnProjectFolder(File projectZipFile) throws IOException { + String projectFolderName = "" ; + // There was an error in the first versions of Collect Earth that limited the folder names to 20 characters + // Newer version support up to 255 but we need to take in consideration backwards compatibility! + if ( oldFormatFolderExists( projectZipFile ) ){ + // If there was already a project with the older format of the name then use that! + projectFolderName = getProjectFolderName( projectZipFile , OLD_MAX_FOLDER_LENGTH ); + }else{ + projectFolderName = getProjectFolderName( projectZipFile , NEW_MAX_FOLDER_LENGTH ); + } - String[] localAppDataLocations = new String[]{ - FolderFinder.getLocalAppDataFolder() + "\\Firefox-3\\firefox.exe" , - FolderFinder.getLocalAppDataFolder() + "\\Mozilla Firefox\\firefox.exe", - FolderFinder.getLocalAppDataFolder() + "\\Firefox\\firefox.exe" - }; + return unzipContents(projectZipFile, projectFolderName); + } + + + private boolean oldFormatFolderExists(File projectZipFile) throws IOException { + String oldProjectFolderName = getProjectFolderName( projectZipFile , OLD_MAX_FOLDER_LENGTH ); + File oldProjectFolder = new File( getProjectsFolder() + File.separator + oldProjectFolderName ); + return oldProjectFolder.exists(); + } - for (String path : localAppDataLocations) { - File f = new File(path); - if( f.exists() ){ - return path; + private String getProjectFolderName(File projectZipFile, int maxLenghtFolderName) throws IOException { + try( ZipFile zipFile = new ZipFile(projectZipFile) ){ + File definitionFolder = new File(EarthConstants.GENERATED_FOLDER); + zipFile.extractFile( PROJECT_PROPERTIES_FILE_NAME, definitionFolder.getAbsolutePath() ); + String projectName = getProjectSurveyName(new File( definitionFolder + File.separator + PROJECT_PROPERTIES_FILE_NAME) ); + if( projectName != null ) { + projectName = StringUtils.remove(projectName, " "); //$NON-NLS-1$ + + if( projectName.length() > maxLenghtFolderName ){ + projectName = projectName.substring(0, maxLenghtFolderName); + } } + return projectName; + }catch(Exception e ) { + logger.error("Error opening project folder", projectZipFile.getAbsolutePath() ); + return null; + } + + } + public String getProjectsFolder(){ + return FolderFinder.getCollectEarthDataFolder() + File.separator + PROJECTS; + } + + private File unzipContents(File projectZipFile, String projectName) throws ZipException { + File projectFolder = new File( getProjectsFolder() + File.separator + projectName ); + if( projectFolder.exists() || projectFolder.mkdirs() ){ + try( ZipFile zipFile = new ZipFile(projectZipFile) ){ + zipFile.extractAll( projectFolder.getAbsolutePath() ); + }catch(Exception e) { + logger.error("Error unzipping contents " + projectZipFile.getAbsolutePath(), e); + } } - return null; + return projectFolder; } } From 6c0c991331cb89951e93e056fc349cf12d8730e6 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:41:59 +0100 Subject: [PATCH 1081/1620] New translations ExportType.java (Spanish) --- .../earth/app/view/Messages_es.properties | 401 +++--------------- 1 file changed, 55 insertions(+), 346 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 4f3bc4f7d2..7633aaf9fd 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,346 +1,55 @@ -package org.openforis.collect.earth.app.service; - -import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; - -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.filefilter.IOFileFilter; -import org.apache.commons.lang3.ArrayUtils; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import net.lingala.zip4j.ZipFile; -import net.lingala.zip4j.exception.ZipException; - - - -@Component -public class EarthProjectsService { - - - private static final int OLD_MAX_FOLDER_LENGTH = 20; - - private static final int NEW_MAX_FOLDER_LENGTH = 255; - - private static final String PROJECT_PROPERTIES_FILE_NAME = "project_definition.properties"; //$NON-NLS-1$ - - private static final String PROJECTS = "projects"; //$NON-NLS-1$ - - @Autowired - LocalPropertiesService localPropertiesService; - - private Logger logger = LoggerFactory.getLogger( EarthProjectsService.class ); - - public void init(LocalPropertiesService localPropertiesService) { - this.localPropertiesService = localPropertiesService; - } - - public Map getProjectList(){ - ArrayList projectFolders = getProjects(); - - HashMap projectListByName = new HashMap<>(); - for (File projectFolder : projectFolders) { - - try { - - File projectPropertiesFile = getProjectPropertiesFile( projectFolder ); - String projectName = getProjectSurveyName(projectPropertiesFile); - if( projectName != null ) { - projectListByName.put( projectName , projectFolder); - } - } catch (IOException e) { - logger.error("The project definition file cannot be read.", e); //$NON-NLS-1$ - } - - } - - return projectListByName; - } - - - private String getProjectSurveyName(File projectPropertiesFile) throws IOException { - Properties properties = getProjectProperties(projectPropertiesFile); - if( properties != null) - return properties.getProperty( EarthProperty.SURVEY_NAME.toString() ); - else - return null; - } - - - private ArrayList getProjects() { - String loadedProjects = localPropertiesService.getValue( EarthProperty.LOADED_PROJECTS ); - - String[] projectFolderPaths = loadedProjects.split( File.pathSeparator ); - - ArrayList workingProjectFolders = new ArrayList<>(); - - for (String projectFolder : projectFolderPaths) { - try { - - File projectFolderFile = new File(projectFolder); - File projectDefinitionFile = getProjectPropertiesFile( projectFolderFile); - if( validateProjectDefinitionFile( projectDefinitionFile ) ){ - workingProjectFolders.add( projectFolderFile ); - } - - } catch (IllegalArgumentException e) { - logger.error("The project definition file is not complete.", e); //$NON-NLS-1$ - } catch (IOException e) { - logger.error("The project definition file cannot be read.", e); //$NON-NLS-1$ - } - - } - - - return workingProjectFolders; - } - - - private boolean checkValidContent(File definitionFile) throws IOException { - Properties projectProperties = getProjectProperties( definitionFile ); - return projectProperties.containsKey( EarthProperty.SURVEY_NAME.toString() ); - - } - - - /** - * Loads the contents of the project-specific properties into earth.properties - * - * @param projectFolder The folder where the project definition and the rest of the files reside. - * @return True is the project was loaded correctly - * @throws IOException If the project folder or one of its files cannot be found - */ - public boolean loadProjectInFolder(File projectFolder) throws IOException{ - - File projectPropertiesFile = getProjectPropertiesFile( projectFolder ); - - boolean success = false; - - // Change the loaded project only if the project definition file has changed or the user changes project - if( - !getProjectDefinitionMD5().equals( CollectEarthUtils.getMd5FromFolder( projectFolder ) ) - && - validateProjectDefinitionFile(projectPropertiesFile) - ){ - - // Remove the version of the survey used so that it is asked again to the user! - localPropertiesService.removeModelVersionName(); - - Properties projectProperties = getProjectProperties( projectPropertiesFile ); - - applyPropertiesToCollectEarth( projectProperties, projectFolder ); - - addToProjectList(projectFolder); - - setProjectDefinitionMD5(projectFolder); - - moveSaikuQueriesToRepository(projectFolder, (String) projectProperties.get("survey_name") ); - - success = true; - } - - - return success; - } - - - private void moveSaikuQueriesToRepository(File projectFolder, String surveyName) { - - try { - Collection saikuFiles = getSaikuFiles( projectFolder ); - - String repoDirectory = "tomcat/webapps/saiku/WEB-INF/classes/saiku-repository"; - File saikuRepo = new File( localPropertiesService.getSaikuFolder() + File.separator + repoDirectory + File.separator + surveyName ); - - for (File saikuFile : saikuFiles) { - FileUtils.copyFileToDirectory(saikuFile, saikuRepo, true); - } - } catch (IOException e) { - logger.error("Error moving the Saiku files", e); - } - - - - } - - private Collection getSaikuFiles(File projectFolder) { - return FileUtils.listFiles(projectFolder, new IOFileFilter() { - - @Override - public boolean accept(File dir, String name) { - return name.endsWith("saiku"); - } - - @Override - public boolean accept(File file) { - - return file.getName().endsWith("saiku"); - } - }, null); - } - - private void setProjectDefinitionMD5(File projectFolder) throws IOException { - localPropertiesService.setValue( EarthProperty.ACTIVE_PROJECT_DEFINITION, CollectEarthUtils.getMd5FromFolder( projectFolder ) ); - } - - private String getProjectDefinitionMD5() { - return localPropertiesService.getValue( EarthProperty.ACTIVE_PROJECT_DEFINITION); - } - - - public File getProjectPropertiesFile(File projectFolder) { - return new File( projectFolder.getAbsolutePath() + File.separator + PROJECT_PROPERTIES_FILE_NAME ); - } - - public File getSurveyStructureFile(File projectFolder) { - return new File( projectFolder.getAbsolutePath() + File.separator + PROJECT_PROPERTIES_FILE_NAME ); - } - - private void applyPropertiesToCollectEarth(Properties projectProperties, File projectFolder) { - - for (Object key : projectProperties.keySet()) { - String value = projectProperties.getProperty((String) key); - value = value.replace("${project_path}", projectFolder.getAbsolutePath()); //$NON-NLS-1$ - EarthProperty earthPropertyEnum = getEarthPropertyEnum(key); - if( earthPropertyEnum != null ){ - localPropertiesService.setValue( earthPropertyEnum , value); - }else{ - logger.warn("The property in the is unknown : {}", key) ; //$NON-NLS-1$ - } - } - - } - - private EarthProperty getEarthPropertyEnum(Object key) { - EarthProperty[] values = EarthProperty.values(); - for (EarthProperty earthProperty : values) { - if( earthProperty.toString().equals( key ) ){ - return earthProperty; - } - } - return null; - } - - private Properties getProjectProperties(File definitionFile) throws IOException { - try( FileReader fr = new FileReader( definitionFile ) ){ - Properties properties = new Properties(); - properties.load(fr); - return properties; - }catch(IOException e ) { - logger.error("Impossible to open properties file ", e); - throw e; - } - } - - private void addToProjectList(File projectFolder) { - String loadedProjects = localPropertiesService.getValue( EarthProperty.LOADED_PROJECTS ); - - if( loadedProjects.length() > 0 ){ - - if( !ArrayUtils.contains(loadedProjects.split(File.pathSeparator), projectFolder.getAbsoluteFile() ) ){ - loadedProjects += File.pathSeparatorChar + projectFolder.getAbsolutePath(); - - } - }else{ - loadedProjects = projectFolder.getAbsolutePath(); - } - localPropertiesService.setValue( EarthProperty.LOADED_PROJECTS, loadedProjects ); - } - - - private boolean validateProjectDefinitionFile(File projectDefinitionFile) throws IOException{ - boolean success = false; - if( projectDefinitionFile.exists() ){ - if( checkValidContent(projectDefinitionFile) ){ - success = true; - }else{ - throw new IllegalArgumentException("The project definition file does not contain the necessary property " + EarthProperty.SURVEY_NAME.toString()+ ". File located at : " + projectDefinitionFile.getAbsolutePath() ); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - return success; - } - - - public boolean folderContainsProjectDefinition(File folder ) throws IOException{ - File projectPropertiesFile = getProjectPropertiesFile( folder ); - return validateProjectDefinitionFile(projectPropertiesFile); - } - - - public boolean loadCompressedProjectFile( File projectZipFile ) throws IOException{ - - File unzippedFolder = unzipContentsOnProjectFolder(projectZipFile); - return( loadProjectInFolder(unzippedFolder) ); - } - - - private File unzipContentsOnProjectFolder(File projectZipFile) throws IOException { - String projectFolderName = "" ; - // There was an error in the first versions of Collect Earth that limited the folder names to 20 characters - // Newer version support up to 255 but we need to take in consideration backwards compatibility! - if ( oldFormatFolderExists( projectZipFile ) ){ - // If there was already a project with the older format of the name then use that! - projectFolderName = getProjectFolderName( projectZipFile , OLD_MAX_FOLDER_LENGTH ); - }else{ - projectFolderName = getProjectFolderName( projectZipFile , NEW_MAX_FOLDER_LENGTH ); - } - - return unzipContents(projectZipFile, projectFolderName); - } - - - private boolean oldFormatFolderExists(File projectZipFile) throws IOException { - String oldProjectFolderName = getProjectFolderName( projectZipFile , OLD_MAX_FOLDER_LENGTH ); - File oldProjectFolder = new File( getProjectsFolder() + File.separator + oldProjectFolderName ); - return oldProjectFolder.exists(); - } - - private String getProjectFolderName(File projectZipFile, int maxLenghtFolderName) throws IOException { - try( ZipFile zipFile = new ZipFile(projectZipFile) ){ - File definitionFolder = new File(EarthConstants.GENERATED_FOLDER); - zipFile.extractFile( PROJECT_PROPERTIES_FILE_NAME, definitionFolder.getAbsolutePath() ); - String projectName = getProjectSurveyName(new File( definitionFolder + File.separator + PROJECT_PROPERTIES_FILE_NAME) ); - if( projectName != null ) { - projectName = StringUtils.remove(projectName, " "); //$NON-NLS-1$ - - if( projectName.length() > maxLenghtFolderName ){ - projectName = projectName.substring(0, maxLenghtFolderName); - } - } - return projectName; - }catch(Exception e ) { - logger.error("Error opening project folder", projectZipFile.getAbsolutePath() ); - return null; - } - - } - - public String getProjectsFolder(){ - return FolderFinder.getCollectEarthDataFolder() + File.separator + PROJECTS; - } - - private File unzipContents(File projectZipFile, String projectName) throws ZipException { - File projectFolder = new File( getProjectsFolder() + File.separator + projectName ); - if( projectFolder.exists() || projectFolder.mkdirs() ){ - try( ZipFile zipFile = new ZipFile(projectZipFile) ){ - zipFile.extractAll( projectFolder.getAbsolutePath() ); - }catch(Exception e) { - logger.error("Error unzipping contents " + projectZipFile.getAbsolutePath(), e); - } - } - return projectFolder; - } - -} +package org.openforis.collect.earth.app.service; + +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.desktop.ServerController; + +public enum ExportType { + SAIKU( + ServerController.SAIKU_RDB_SUFFIX, + "Saiku", + "SaikuDataFolder", + EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + ServerController.SAIKU_RDB_SUFFIX, + EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU + ), + IPCC( + ServerController.IPCC_RDB_SUFFIX, + "Ipcc", + "IPCCDataFolder", + EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + ServerController.IPCC_RDB_SUFFIX, + EarthConstants.POSTGRES_RDB_SCHEMA_IPCC + ); + + private String dbSuffix; + private String prefix; + private String dataFolder; + private String dbFileName; + private String rdbSchema; + + ExportType(String dbSuffix, String prefix, String dataFolder, String dbFileName, String rdbSchema ) { + this.dbSuffix = dbSuffix; + this.prefix = prefix; + this.dbFileName = dbFileName; + this.rdbSchema = rdbSchema; + } + + public String getDbSuffix() { + return dbSuffix; + } + + public String getPrefix() { + return prefix; + } + + public String getDataFolder() { + return dataFolder; + } + + public String getDbFileName() { + return dbFileName; + } + + public String getRdbSchema() { + return rdbSchema; + } + +} \ No newline at end of file From d232c9f9c3b4ed760af587b587a3ec4a1dc9fb5f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:01 +0100 Subject: [PATCH 1082/1620] New translations DataImportExportService.java (French) --- .../earth/app/view/Messages_fr.properties | 208 ++++++++++++++---- 1 file changed, 169 insertions(+), 39 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 3f4bd647d1..eb9f542d80 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,64 +1,194 @@ package org.openforis.collect.earth.app.service; import java.io.File; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.io.data.CSVDataExportProcess; +import org.openforis.collect.io.data.CSVDataImportProcess; +import org.openforis.collect.io.data.DataExportStatus; +import org.openforis.collect.io.data.DataImportSummaryItem; +import org.openforis.collect.io.data.XMLDataExportProcess; +import org.openforis.collect.io.data.XMLDataImportProcess; +import org.openforis.collect.io.data.csv.CSVDataExportParameters; +import org.openforis.collect.io.data.csv.CSVDataImportSettings; +import org.openforis.collect.manager.process.AbstractProcess; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.RecordFilter; +import org.openforis.commons.collection.Predicate; +import org.openforis.idm.model.BooleanAttribute; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Component; + +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ +@Component +public class DataImportExportService { + + @Autowired + private EarthSurveyService earthSurveyService; + + @Autowired + private LocalPropertiesService localPropertiesService; + + private final Logger logger = LoggerFactory.getLogger(DataImportExportService.class); + /** + * Use the application context to get a new bean everytime the data is exported ( as a new instance is needed every time) + */ + @Autowired + private ApplicationContext applicationContext; + + private void addRecordsToImportList( List recordsToImport, List entryIdsToImport) { + if (recordsToImport != null) { + List cleanRecordsToImport = recordsToImport; + for (final DataImportSummaryItem importRecord : cleanRecordsToImport) { + entryIdsToImport.add(importRecord.getEntryId()); + } + } + } -import org.apache.commons.lang3.SystemUtils; + public CSVDataExportProcess exportSurveyAsCsv(File exportToFile, boolean includeCodeItemLabelColumn) { + final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); + csvDataExportProcess.setOutputFile(exportToFile); + csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); + csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; -public class FirefoxLocatorFixed{ + CSVDataExportParameters config = new CSVDataExportParameters(); + config.setIncludeAllAncestorAttributes(true); + config.setIncludeEnumeratedEntities(true); + config.setLanguageCode( localPropertiesService.getValue(EarthProperty.UI_LANGUAGE) ); + config.setIncludeCodeItemLabelColumn(includeCodeItemLabelColumn); + csvDataExportProcess.setConfiguration(config); - private FirefoxLocatorFixed(){ + return csvDataExportProcess; } - public static String tryToFindFolder(){ - String path = null; - if (SystemUtils.IS_OS_WINDOWS){ - return findInUsualWindowsLocations(); - }else if (SystemUtils.IS_OS_MAC){ - return findInUsualMacLocations(); - } + private RecordFilter getRecordFilter( ) { + RecordFilter recordFilter = new RecordFilter(earthSurveyService.getCollectSurvey(), earthSurveyService.getRootEntityDefinition().getId()); + recordFilter.setStepGreaterOrEqual(Step.ENTRY); + return recordFilter; + } - return path; + public CSVDataExportProcess exportSurveyAsFusionTable(File exportToFile, boolean includeCodeItemLabelColumn) { + + final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); + csvDataExportProcess.setOutputFile(exportToFile); + csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); + csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; + + CSVDataExportParameters config = new CSVDataExportParameters(); + config.setIncludeAllAncestorAttributes(true); + config.setLanguageCode( localPropertiesService.getValue(EarthProperty.UI_LANGUAGE) ); + config.setIncludeCodeItemPositionColumn(true); + config.setIncludeKMLColumnForCoordinates(true); + config.setIncludeCodeItemLabelColumn( includeCodeItemLabelColumn ); + csvDataExportProcess.setConfiguration(config); + return csvDataExportProcess; } - /** - * Dynamic because the directory version number keep changing. - */ - private static String findInUsualMacLocations() { + public XMLDataExportProcess exportSurveyAsZipWithXml(File exportToFile, Date modifiedSince) throws Exception { + final XMLDataExportProcess xmlDataExportProcess = applicationContext.getBean(XMLDataExportProcess.class); + xmlDataExportProcess.setOutputFile(exportToFile); + xmlDataExportProcess.setRootEntityName(EarthConstants.ROOT_ENTITY_NAME); + xmlDataExportProcess.setSurvey(earthSurveyService.getCollectSurvey()); + xmlDataExportProcess.setModifiedSince(modifiedSince); + xmlDataExportProcess.setIncludeIdm(true); + xmlDataExportProcess.setSteps(new Step[] { Step.ENTRY }); + return xmlDataExportProcess; + } - String[] localAppDataLocations = new String[]{ - FolderFinder.getLocalAppDataFolder() + "/Applications/Firefox.app/Contents/MacOS/firefox-bin" , - FolderFinder.getLocalAppDataFolder() + "/Applications/Mozilla Firefox.app/Contents/MacOS/firefox-bin" - }; - for (String path : localAppDataLocations) { - File f = new File(path); - if( f.exists() ){ - return path; - } + public CSVDataImportProcess getCsvImporterProcess(File importFromFile) { + final CSVDataImportProcess importProcess = applicationContext.getBean("transactionalCsvDataImportProcess", CSVDataImportProcess.class); + + importProcess.setFile(importFromFile); + importProcess.setSurvey(earthSurveyService.getCollectSurvey()); + importProcess.setParentEntityDefinitionId(earthSurveyService.getRootEntityDefinition().getId()); + importProcess.setStep(Step.ENTRY ); + CSVDataImportSettings settings = new CSVDataImportSettings(); + settings.setRecordValidationEnabled(false); + settings.setInsertNewRecords(false); + settings.setNewRecordVersionName(null); + settings.setReportNoRecordFoundErrors(false); + importProcess.setSettings(settings); + return importProcess; + } - } + public XMLDataImportProcess getImportSummary(File zipWithXml, boolean importNonFinishedPlots) throws Exception { + final XMLDataImportProcess dataImportProcess = applicationContext.getBean(XMLDataImportProcess.class); + dataImportProcess.init(); + dataImportProcess.setFile(zipWithXml); + dataImportProcess.setValidateRecords(false); + dataImportProcess.prepareToStartSummaryCreation(); - return null; - } + if( !importNonFinishedPlots ){ // Import only plots whose actively_saved state is set to true + dataImportProcess.setIncludeRecordPredicate( new Predicate() { + @Override + public boolean evaluate(CollectRecord record) { + boolean include = true; - private static String findInUsualWindowsLocations() { + try { + final BooleanAttribute node = (BooleanAttribute) record.getNodeByPath("/plot/" + EarthConstants.ACTIVELY_SAVED_ATTRIBUTE_NAME); //$NON-NLS-1$ - String[] localAppDataLocations = new String[]{ - FolderFinder.getLocalAppDataFolder() + "\\Firefox-3\\firefox.exe" , - FolderFinder.getLocalAppDataFolder() + "\\Mozilla Firefox\\firefox.exe", - FolderFinder.getLocalAppDataFolder() + "\\Firefox\\firefox.exe" - }; + include = (node == null || (node != null && !node.isEmpty() && node.getValue().getValue()) ); + } catch (Exception e) { + logger.error("No \"/plot/actively_saved\" node found ", e ); //$NON-NLS-1$ + } - for (String path : localAppDataLocations) { - File f = new File(path); - if( f.exists() ){ - return path; - } + return include; + } + }); + } + return dataImportProcess; + } + + public void importRecordsFrom(File zipWithXml, XMLDataImportProcess dataImportProcess, List listConflictingRecords) throws Exception { + final List entryIdsToImport = new ArrayList(); + addRecordsToImportList( listConflictingRecords, entryIdsToImport); + addRecordsToImportList( dataImportProcess.getSummary().getRecordsToImport(),entryIdsToImport); + + dataImportProcess.setEntryIdsToImport(entryIdsToImport); + dataImportProcess.prepareToStartImport(); + dataImportProcess.call(); + + int conflictingRecordsAdded = 0; + if (listConflictingRecords != null) { + conflictingRecordsAdded = listConflictingRecords.size(); } - return null; + + logger.warn("Data imported into db. Number of Records imported : {} Conflicting records added : {}" //$NON-NLS-1$ //$NON-NLS-2$ + ,entryIdsToImport.size(), conflictingRecordsAdded); + } + + public AbstractProcess exportSurveyAsBackup(File exportToFile) { + final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); + csvDataExportProcess.setOutputFile(exportToFile); + csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); + csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; + + + CSVDataExportParameters config = new CSVDataExportParameters(); + config.setIncludeAllAncestorAttributes(true); + config.setIncludeCodeItemPositionColumn(true); + config.setIncludeKMLColumnForCoordinates(true); + csvDataExportProcess.setConfiguration(config); + return csvDataExportProcess; + } + + public EarthSurveyService getEarthSurveyService() { + return earthSurveyService; } } From 2779278e535b318efe1d46640710bf2e4b3b8e90 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:02 +0100 Subject: [PATCH 1083/1620] New translations DataImportExportService.java (Spanish) --- .../earth/app/view/Messages_es.properties | 249 ++++++++++++++---- 1 file changed, 194 insertions(+), 55 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 7633aaf9fd..eb9f542d80 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,55 +1,194 @@ -package org.openforis.collect.earth.app.service; - -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.desktop.ServerController; - -public enum ExportType { - SAIKU( - ServerController.SAIKU_RDB_SUFFIX, - "Saiku", - "SaikuDataFolder", - EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + ServerController.SAIKU_RDB_SUFFIX, - EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU - ), - IPCC( - ServerController.IPCC_RDB_SUFFIX, - "Ipcc", - "IPCCDataFolder", - EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + ServerController.IPCC_RDB_SUFFIX, - EarthConstants.POSTGRES_RDB_SCHEMA_IPCC - ); - - private String dbSuffix; - private String prefix; - private String dataFolder; - private String dbFileName; - private String rdbSchema; - - ExportType(String dbSuffix, String prefix, String dataFolder, String dbFileName, String rdbSchema ) { - this.dbSuffix = dbSuffix; - this.prefix = prefix; - this.dbFileName = dbFileName; - this.rdbSchema = rdbSchema; - } - - public String getDbSuffix() { - return dbSuffix; - } - - public String getPrefix() { - return prefix; - } - - public String getDataFolder() { - return dataFolder; - } - - public String getDbFileName() { - return dbFileName; - } - - public String getRdbSchema() { - return rdbSchema; - } - -} \ No newline at end of file +package org.openforis.collect.earth.app.service; + +import java.io.File; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.io.data.CSVDataExportProcess; +import org.openforis.collect.io.data.CSVDataImportProcess; +import org.openforis.collect.io.data.DataExportStatus; +import org.openforis.collect.io.data.DataImportSummaryItem; +import org.openforis.collect.io.data.XMLDataExportProcess; +import org.openforis.collect.io.data.XMLDataImportProcess; +import org.openforis.collect.io.data.csv.CSVDataExportParameters; +import org.openforis.collect.io.data.csv.CSVDataImportSettings; +import org.openforis.collect.manager.process.AbstractProcess; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.RecordFilter; +import org.openforis.commons.collection.Predicate; +import org.openforis.idm.model.BooleanAttribute; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Component; + +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ +@Component +public class DataImportExportService { + + @Autowired + private EarthSurveyService earthSurveyService; + + @Autowired + private LocalPropertiesService localPropertiesService; + + private final Logger logger = LoggerFactory.getLogger(DataImportExportService.class); + /** + * Use the application context to get a new bean everytime the data is exported ( as a new instance is needed every time) + */ + @Autowired + private ApplicationContext applicationContext; + + private void addRecordsToImportList( List recordsToImport, List entryIdsToImport) { + if (recordsToImport != null) { + List cleanRecordsToImport = recordsToImport; + for (final DataImportSummaryItem importRecord : cleanRecordsToImport) { + entryIdsToImport.add(importRecord.getEntryId()); + } + } + } + + public CSVDataExportProcess exportSurveyAsCsv(File exportToFile, boolean includeCodeItemLabelColumn) { + final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); + csvDataExportProcess.setOutputFile(exportToFile); + + csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); + csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; + + CSVDataExportParameters config = new CSVDataExportParameters(); + config.setIncludeAllAncestorAttributes(true); + config.setIncludeEnumeratedEntities(true); + config.setLanguageCode( localPropertiesService.getValue(EarthProperty.UI_LANGUAGE) ); + config.setIncludeCodeItemLabelColumn(includeCodeItemLabelColumn); + csvDataExportProcess.setConfiguration(config); + + return csvDataExportProcess; + } + + private RecordFilter getRecordFilter( ) { + RecordFilter recordFilter = new RecordFilter(earthSurveyService.getCollectSurvey(), earthSurveyService.getRootEntityDefinition().getId()); + recordFilter.setStepGreaterOrEqual(Step.ENTRY); + return recordFilter; + } + + public CSVDataExportProcess exportSurveyAsFusionTable(File exportToFile, boolean includeCodeItemLabelColumn) { + + final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); + csvDataExportProcess.setOutputFile(exportToFile); + csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); + csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; + + CSVDataExportParameters config = new CSVDataExportParameters(); + config.setIncludeAllAncestorAttributes(true); + config.setLanguageCode( localPropertiesService.getValue(EarthProperty.UI_LANGUAGE) ); + config.setIncludeCodeItemPositionColumn(true); + config.setIncludeKMLColumnForCoordinates(true); + config.setIncludeCodeItemLabelColumn( includeCodeItemLabelColumn ); + csvDataExportProcess.setConfiguration(config); + return csvDataExportProcess; + } + + public XMLDataExportProcess exportSurveyAsZipWithXml(File exportToFile, Date modifiedSince) throws Exception { + final XMLDataExportProcess xmlDataExportProcess = applicationContext.getBean(XMLDataExportProcess.class); + xmlDataExportProcess.setOutputFile(exportToFile); + xmlDataExportProcess.setRootEntityName(EarthConstants.ROOT_ENTITY_NAME); + xmlDataExportProcess.setSurvey(earthSurveyService.getCollectSurvey()); + xmlDataExportProcess.setModifiedSince(modifiedSince); + xmlDataExportProcess.setIncludeIdm(true); + xmlDataExportProcess.setSteps(new Step[] { Step.ENTRY }); + return xmlDataExportProcess; + } + + + public CSVDataImportProcess getCsvImporterProcess(File importFromFile) { + final CSVDataImportProcess importProcess = applicationContext.getBean("transactionalCsvDataImportProcess", CSVDataImportProcess.class); + + importProcess.setFile(importFromFile); + importProcess.setSurvey(earthSurveyService.getCollectSurvey()); + importProcess.setParentEntityDefinitionId(earthSurveyService.getRootEntityDefinition().getId()); + importProcess.setStep(Step.ENTRY ); + CSVDataImportSettings settings = new CSVDataImportSettings(); + settings.setRecordValidationEnabled(false); + settings.setInsertNewRecords(false); + settings.setNewRecordVersionName(null); + settings.setReportNoRecordFoundErrors(false); + importProcess.setSettings(settings); + return importProcess; + } + + public XMLDataImportProcess getImportSummary(File zipWithXml, boolean importNonFinishedPlots) throws Exception { + final XMLDataImportProcess dataImportProcess = applicationContext.getBean(XMLDataImportProcess.class); + dataImportProcess.init(); + dataImportProcess.setFile(zipWithXml); + dataImportProcess.setValidateRecords(false); + dataImportProcess.prepareToStartSummaryCreation(); + + if( !importNonFinishedPlots ){ // Import only plots whose actively_saved state is set to true + dataImportProcess.setIncludeRecordPredicate( new Predicate() { + + @Override + public boolean evaluate(CollectRecord record) { + boolean include = true; + + try { + final BooleanAttribute node = (BooleanAttribute) record.getNodeByPath("/plot/" + EarthConstants.ACTIVELY_SAVED_ATTRIBUTE_NAME); //$NON-NLS-1$ + + include = (node == null || (node != null && !node.isEmpty() && node.getValue().getValue()) ); + } catch (Exception e) { + logger.error("No \"/plot/actively_saved\" node found ", e ); //$NON-NLS-1$ + } + + return include; + } + }); + } + return dataImportProcess; + } + + public void importRecordsFrom(File zipWithXml, XMLDataImportProcess dataImportProcess, List listConflictingRecords) throws Exception { + final List entryIdsToImport = new ArrayList(); + + addRecordsToImportList( listConflictingRecords, entryIdsToImport); + addRecordsToImportList( dataImportProcess.getSummary().getRecordsToImport(),entryIdsToImport); + + dataImportProcess.setEntryIdsToImport(entryIdsToImport); + dataImportProcess.prepareToStartImport(); + dataImportProcess.call(); + + int conflictingRecordsAdded = 0; + if (listConflictingRecords != null) { + conflictingRecordsAdded = listConflictingRecords.size(); + } + + logger.warn("Data imported into db. Number of Records imported : {} Conflicting records added : {}" //$NON-NLS-1$ //$NON-NLS-2$ + ,entryIdsToImport.size(), conflictingRecordsAdded); + } + + public AbstractProcess exportSurveyAsBackup(File exportToFile) { + final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); + csvDataExportProcess.setOutputFile(exportToFile); + csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); + csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; + + + CSVDataExportParameters config = new CSVDataExportParameters(); + config.setIncludeAllAncestorAttributes(true); + config.setIncludeCodeItemPositionColumn(true); + config.setIncludeKMLColumnForCoordinates(true); + csvDataExportProcess.setConfiguration(config); + return csvDataExportProcess; + } + + public EarthSurveyService getEarthSurveyService() { + return earthSurveyService; + } + +} From 4140931e33d47232201081d83eee4eb3c1842826 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:03 +0100 Subject: [PATCH 1084/1620] New translations DataImportExportService.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 249 ++++++++++++++---- 1 file changed, 194 insertions(+), 55 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 7633aaf9fd..eb9f542d80 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,55 +1,194 @@ -package org.openforis.collect.earth.app.service; - -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.desktop.ServerController; - -public enum ExportType { - SAIKU( - ServerController.SAIKU_RDB_SUFFIX, - "Saiku", - "SaikuDataFolder", - EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + ServerController.SAIKU_RDB_SUFFIX, - EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU - ), - IPCC( - ServerController.IPCC_RDB_SUFFIX, - "Ipcc", - "IPCCDataFolder", - EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + ServerController.IPCC_RDB_SUFFIX, - EarthConstants.POSTGRES_RDB_SCHEMA_IPCC - ); - - private String dbSuffix; - private String prefix; - private String dataFolder; - private String dbFileName; - private String rdbSchema; - - ExportType(String dbSuffix, String prefix, String dataFolder, String dbFileName, String rdbSchema ) { - this.dbSuffix = dbSuffix; - this.prefix = prefix; - this.dbFileName = dbFileName; - this.rdbSchema = rdbSchema; - } - - public String getDbSuffix() { - return dbSuffix; - } - - public String getPrefix() { - return prefix; - } - - public String getDataFolder() { - return dataFolder; - } - - public String getDbFileName() { - return dbFileName; - } - - public String getRdbSchema() { - return rdbSchema; - } - -} \ No newline at end of file +package org.openforis.collect.earth.app.service; + +import java.io.File; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.io.data.CSVDataExportProcess; +import org.openforis.collect.io.data.CSVDataImportProcess; +import org.openforis.collect.io.data.DataExportStatus; +import org.openforis.collect.io.data.DataImportSummaryItem; +import org.openforis.collect.io.data.XMLDataExportProcess; +import org.openforis.collect.io.data.XMLDataImportProcess; +import org.openforis.collect.io.data.csv.CSVDataExportParameters; +import org.openforis.collect.io.data.csv.CSVDataImportSettings; +import org.openforis.collect.manager.process.AbstractProcess; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.RecordFilter; +import org.openforis.commons.collection.Predicate; +import org.openforis.idm.model.BooleanAttribute; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Component; + +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ +@Component +public class DataImportExportService { + + @Autowired + private EarthSurveyService earthSurveyService; + + @Autowired + private LocalPropertiesService localPropertiesService; + + private final Logger logger = LoggerFactory.getLogger(DataImportExportService.class); + /** + * Use the application context to get a new bean everytime the data is exported ( as a new instance is needed every time) + */ + @Autowired + private ApplicationContext applicationContext; + + private void addRecordsToImportList( List recordsToImport, List entryIdsToImport) { + if (recordsToImport != null) { + List cleanRecordsToImport = recordsToImport; + for (final DataImportSummaryItem importRecord : cleanRecordsToImport) { + entryIdsToImport.add(importRecord.getEntryId()); + } + } + } + + public CSVDataExportProcess exportSurveyAsCsv(File exportToFile, boolean includeCodeItemLabelColumn) { + final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); + csvDataExportProcess.setOutputFile(exportToFile); + + csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); + csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; + + CSVDataExportParameters config = new CSVDataExportParameters(); + config.setIncludeAllAncestorAttributes(true); + config.setIncludeEnumeratedEntities(true); + config.setLanguageCode( localPropertiesService.getValue(EarthProperty.UI_LANGUAGE) ); + config.setIncludeCodeItemLabelColumn(includeCodeItemLabelColumn); + csvDataExportProcess.setConfiguration(config); + + return csvDataExportProcess; + } + + private RecordFilter getRecordFilter( ) { + RecordFilter recordFilter = new RecordFilter(earthSurveyService.getCollectSurvey(), earthSurveyService.getRootEntityDefinition().getId()); + recordFilter.setStepGreaterOrEqual(Step.ENTRY); + return recordFilter; + } + + public CSVDataExportProcess exportSurveyAsFusionTable(File exportToFile, boolean includeCodeItemLabelColumn) { + + final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); + csvDataExportProcess.setOutputFile(exportToFile); + csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); + csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; + + CSVDataExportParameters config = new CSVDataExportParameters(); + config.setIncludeAllAncestorAttributes(true); + config.setLanguageCode( localPropertiesService.getValue(EarthProperty.UI_LANGUAGE) ); + config.setIncludeCodeItemPositionColumn(true); + config.setIncludeKMLColumnForCoordinates(true); + config.setIncludeCodeItemLabelColumn( includeCodeItemLabelColumn ); + csvDataExportProcess.setConfiguration(config); + return csvDataExportProcess; + } + + public XMLDataExportProcess exportSurveyAsZipWithXml(File exportToFile, Date modifiedSince) throws Exception { + final XMLDataExportProcess xmlDataExportProcess = applicationContext.getBean(XMLDataExportProcess.class); + xmlDataExportProcess.setOutputFile(exportToFile); + xmlDataExportProcess.setRootEntityName(EarthConstants.ROOT_ENTITY_NAME); + xmlDataExportProcess.setSurvey(earthSurveyService.getCollectSurvey()); + xmlDataExportProcess.setModifiedSince(modifiedSince); + xmlDataExportProcess.setIncludeIdm(true); + xmlDataExportProcess.setSteps(new Step[] { Step.ENTRY }); + return xmlDataExportProcess; + } + + + public CSVDataImportProcess getCsvImporterProcess(File importFromFile) { + final CSVDataImportProcess importProcess = applicationContext.getBean("transactionalCsvDataImportProcess", CSVDataImportProcess.class); + + importProcess.setFile(importFromFile); + importProcess.setSurvey(earthSurveyService.getCollectSurvey()); + importProcess.setParentEntityDefinitionId(earthSurveyService.getRootEntityDefinition().getId()); + importProcess.setStep(Step.ENTRY ); + CSVDataImportSettings settings = new CSVDataImportSettings(); + settings.setRecordValidationEnabled(false); + settings.setInsertNewRecords(false); + settings.setNewRecordVersionName(null); + settings.setReportNoRecordFoundErrors(false); + importProcess.setSettings(settings); + return importProcess; + } + + public XMLDataImportProcess getImportSummary(File zipWithXml, boolean importNonFinishedPlots) throws Exception { + final XMLDataImportProcess dataImportProcess = applicationContext.getBean(XMLDataImportProcess.class); + dataImportProcess.init(); + dataImportProcess.setFile(zipWithXml); + dataImportProcess.setValidateRecords(false); + dataImportProcess.prepareToStartSummaryCreation(); + + if( !importNonFinishedPlots ){ // Import only plots whose actively_saved state is set to true + dataImportProcess.setIncludeRecordPredicate( new Predicate() { + + @Override + public boolean evaluate(CollectRecord record) { + boolean include = true; + + try { + final BooleanAttribute node = (BooleanAttribute) record.getNodeByPath("/plot/" + EarthConstants.ACTIVELY_SAVED_ATTRIBUTE_NAME); //$NON-NLS-1$ + + include = (node == null || (node != null && !node.isEmpty() && node.getValue().getValue()) ); + } catch (Exception e) { + logger.error("No \"/plot/actively_saved\" node found ", e ); //$NON-NLS-1$ + } + + return include; + } + }); + } + return dataImportProcess; + } + + public void importRecordsFrom(File zipWithXml, XMLDataImportProcess dataImportProcess, List listConflictingRecords) throws Exception { + final List entryIdsToImport = new ArrayList(); + + addRecordsToImportList( listConflictingRecords, entryIdsToImport); + addRecordsToImportList( dataImportProcess.getSummary().getRecordsToImport(),entryIdsToImport); + + dataImportProcess.setEntryIdsToImport(entryIdsToImport); + dataImportProcess.prepareToStartImport(); + dataImportProcess.call(); + + int conflictingRecordsAdded = 0; + if (listConflictingRecords != null) { + conflictingRecordsAdded = listConflictingRecords.size(); + } + + logger.warn("Data imported into db. Number of Records imported : {} Conflicting records added : {}" //$NON-NLS-1$ //$NON-NLS-2$ + ,entryIdsToImport.size(), conflictingRecordsAdded); + } + + public AbstractProcess exportSurveyAsBackup(File exportToFile) { + final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); + csvDataExportProcess.setOutputFile(exportToFile); + csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); + csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; + + + CSVDataExportParameters config = new CSVDataExportParameters(); + config.setIncludeAllAncestorAttributes(true); + config.setIncludeCodeItemPositionColumn(true); + config.setIncludeKMLColumnForCoordinates(true); + csvDataExportProcess.setConfiguration(config); + return csvDataExportProcess; + } + + public EarthSurveyService getEarthSurveyService() { + return earthSurveyService; + } + +} From c6809ecf4bed4431c54d36c99fd1aa2f889aa49e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:04 +0100 Subject: [PATCH 1085/1620] New translations EarthProjectsService.java (French) --- .../earth/app/view/Messages_fr.properties | 416 ++++++++++++------ 1 file changed, 284 insertions(+), 132 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index eb9f542d80..4f3bc4f7d2 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,194 +1,346 @@ package org.openforis.collect.earth.app.service; import java.io.File; +import java.io.FileReader; +import java.io.IOException; import java.util.ArrayList; -import java.util.Date; -import java.util.List; - +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.filefilter.IOFileFilter; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.io.data.CSVDataExportProcess; -import org.openforis.collect.io.data.CSVDataImportProcess; -import org.openforis.collect.io.data.DataExportStatus; -import org.openforis.collect.io.data.DataImportSummaryItem; -import org.openforis.collect.io.data.XMLDataExportProcess; -import org.openforis.collect.io.data.XMLDataImportProcess; -import org.openforis.collect.io.data.csv.CSVDataExportParameters; -import org.openforis.collect.io.data.csv.CSVDataImportSettings; -import org.openforis.collect.manager.process.AbstractProcess; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.RecordFilter; -import org.openforis.commons.collection.Predicate; -import org.openforis.idm.model.BooleanAttribute; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ +import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.exception.ZipException; + + + @Component -public class DataImportExportService { +public class EarthProjectsService { - @Autowired - private EarthSurveyService earthSurveyService; + + private static final int OLD_MAX_FOLDER_LENGTH = 20; + + private static final int NEW_MAX_FOLDER_LENGTH = 255; + + private static final String PROJECT_PROPERTIES_FILE_NAME = "project_definition.properties"; //$NON-NLS-1$ + + private static final String PROJECTS = "projects"; //$NON-NLS-1$ @Autowired - private LocalPropertiesService localPropertiesService; + LocalPropertiesService localPropertiesService; + + private Logger logger = LoggerFactory.getLogger( EarthProjectsService.class ); + + public void init(LocalPropertiesService localPropertiesService) { + this.localPropertiesService = localPropertiesService; + } + + public Map getProjectList(){ + ArrayList projectFolders = getProjects(); + + HashMap projectListByName = new HashMap<>(); + for (File projectFolder : projectFolders) { + + try { + + File projectPropertiesFile = getProjectPropertiesFile( projectFolder ); + String projectName = getProjectSurveyName(projectPropertiesFile); + if( projectName != null ) { + projectListByName.put( projectName , projectFolder); + } + } catch (IOException e) { + logger.error("The project definition file cannot be read.", e); //$NON-NLS-1$ + } + + } + + return projectListByName; + } + + + private String getProjectSurveyName(File projectPropertiesFile) throws IOException { + Properties properties = getProjectProperties(projectPropertiesFile); + if( properties != null) + return properties.getProperty( EarthProperty.SURVEY_NAME.toString() ); + else + return null; + } + + + private ArrayList getProjects() { + String loadedProjects = localPropertiesService.getValue( EarthProperty.LOADED_PROJECTS ); + + String[] projectFolderPaths = loadedProjects.split( File.pathSeparator ); + + ArrayList workingProjectFolders = new ArrayList<>(); + + for (String projectFolder : projectFolderPaths) { + try { + + File projectFolderFile = new File(projectFolder); + File projectDefinitionFile = getProjectPropertiesFile( projectFolderFile); + if( validateProjectDefinitionFile( projectDefinitionFile ) ){ + workingProjectFolders.add( projectFolderFile ); + } + + } catch (IllegalArgumentException e) { + logger.error("The project definition file is not complete.", e); //$NON-NLS-1$ + } catch (IOException e) { + logger.error("The project definition file cannot be read.", e); //$NON-NLS-1$ + } + + } + + + return workingProjectFolders; + } + + + private boolean checkValidContent(File definitionFile) throws IOException { + Properties projectProperties = getProjectProperties( definitionFile ); + return projectProperties.containsKey( EarthProperty.SURVEY_NAME.toString() ); + + } + - private final Logger logger = LoggerFactory.getLogger(DataImportExportService.class); /** - * Use the application context to get a new bean everytime the data is exported ( as a new instance is needed every time) + * Loads the contents of the project-specific properties into earth.properties + * + * @param projectFolder The folder where the project definition and the rest of the files reside. + * @return True is the project was loaded correctly + * @throws IOException If the project folder or one of its files cannot be found */ - @Autowired - private ApplicationContext applicationContext; + public boolean loadProjectInFolder(File projectFolder) throws IOException{ + + File projectPropertiesFile = getProjectPropertiesFile( projectFolder ); + + boolean success = false; + + // Change the loaded project only if the project definition file has changed or the user changes project + if( + !getProjectDefinitionMD5().equals( CollectEarthUtils.getMd5FromFolder( projectFolder ) ) + && + validateProjectDefinitionFile(projectPropertiesFile) + ){ + + // Remove the version of the survey used so that it is asked again to the user! + localPropertiesService.removeModelVersionName(); - private void addRecordsToImportList( List recordsToImport, List entryIdsToImport) { - if (recordsToImport != null) { - List cleanRecordsToImport = recordsToImport; - for (final DataImportSummaryItem importRecord : cleanRecordsToImport) { - entryIdsToImport.add(importRecord.getEntryId()); + Properties projectProperties = getProjectProperties( projectPropertiesFile ); + + applyPropertiesToCollectEarth( projectProperties, projectFolder ); + + addToProjectList(projectFolder); + + setProjectDefinitionMD5(projectFolder); + + moveSaikuQueriesToRepository(projectFolder, (String) projectProperties.get("survey_name") ); + + success = true; + } + + + return success; + } + + + private void moveSaikuQueriesToRepository(File projectFolder, String surveyName) { + + try { + Collection saikuFiles = getSaikuFiles( projectFolder ); + + String repoDirectory = "tomcat/webapps/saiku/WEB-INF/classes/saiku-repository"; + File saikuRepo = new File( localPropertiesService.getSaikuFolder() + File.separator + repoDirectory + File.separator + surveyName ); + + for (File saikuFile : saikuFiles) { + FileUtils.copyFileToDirectory(saikuFile, saikuRepo, true); } + } catch (IOException e) { + logger.error("Error moving the Saiku files", e); } + + + } - public CSVDataExportProcess exportSurveyAsCsv(File exportToFile, boolean includeCodeItemLabelColumn) { - final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); - csvDataExportProcess.setOutputFile(exportToFile); + private Collection getSaikuFiles(File projectFolder) { + return FileUtils.listFiles(projectFolder, new IOFileFilter() { - csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); - csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; + @Override + public boolean accept(File dir, String name) { + return name.endsWith("saiku"); + } - CSVDataExportParameters config = new CSVDataExportParameters(); - config.setIncludeAllAncestorAttributes(true); - config.setIncludeEnumeratedEntities(true); - config.setLanguageCode( localPropertiesService.getValue(EarthProperty.UI_LANGUAGE) ); - config.setIncludeCodeItemLabelColumn(includeCodeItemLabelColumn); - csvDataExportProcess.setConfiguration(config); + @Override + public boolean accept(File file) { - return csvDataExportProcess; + return file.getName().endsWith("saiku"); + } + }, null); } - private RecordFilter getRecordFilter( ) { - RecordFilter recordFilter = new RecordFilter(earthSurveyService.getCollectSurvey(), earthSurveyService.getRootEntityDefinition().getId()); - recordFilter.setStepGreaterOrEqual(Step.ENTRY); - return recordFilter; + private void setProjectDefinitionMD5(File projectFolder) throws IOException { + localPropertiesService.setValue( EarthProperty.ACTIVE_PROJECT_DEFINITION, CollectEarthUtils.getMd5FromFolder( projectFolder ) ); } - public CSVDataExportProcess exportSurveyAsFusionTable(File exportToFile, boolean includeCodeItemLabelColumn) { + private String getProjectDefinitionMD5() { + return localPropertiesService.getValue( EarthProperty.ACTIVE_PROJECT_DEFINITION); + } - final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); - csvDataExportProcess.setOutputFile(exportToFile); - csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); - csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; - CSVDataExportParameters config = new CSVDataExportParameters(); - config.setIncludeAllAncestorAttributes(true); - config.setLanguageCode( localPropertiesService.getValue(EarthProperty.UI_LANGUAGE) ); - config.setIncludeCodeItemPositionColumn(true); - config.setIncludeKMLColumnForCoordinates(true); - config.setIncludeCodeItemLabelColumn( includeCodeItemLabelColumn ); - csvDataExportProcess.setConfiguration(config); - return csvDataExportProcess; + public File getProjectPropertiesFile(File projectFolder) { + return new File( projectFolder.getAbsolutePath() + File.separator + PROJECT_PROPERTIES_FILE_NAME ); } - public XMLDataExportProcess exportSurveyAsZipWithXml(File exportToFile, Date modifiedSince) throws Exception { - final XMLDataExportProcess xmlDataExportProcess = applicationContext.getBean(XMLDataExportProcess.class); - xmlDataExportProcess.setOutputFile(exportToFile); - xmlDataExportProcess.setRootEntityName(EarthConstants.ROOT_ENTITY_NAME); - xmlDataExportProcess.setSurvey(earthSurveyService.getCollectSurvey()); - xmlDataExportProcess.setModifiedSince(modifiedSince); - xmlDataExportProcess.setIncludeIdm(true); - xmlDataExportProcess.setSteps(new Step[] { Step.ENTRY }); - return xmlDataExportProcess; + public File getSurveyStructureFile(File projectFolder) { + return new File( projectFolder.getAbsolutePath() + File.separator + PROJECT_PROPERTIES_FILE_NAME ); } + private void applyPropertiesToCollectEarth(Properties projectProperties, File projectFolder) { + + for (Object key : projectProperties.keySet()) { + String value = projectProperties.getProperty((String) key); + value = value.replace("${project_path}", projectFolder.getAbsolutePath()); //$NON-NLS-1$ + EarthProperty earthPropertyEnum = getEarthPropertyEnum(key); + if( earthPropertyEnum != null ){ + localPropertiesService.setValue( earthPropertyEnum , value); + }else{ + logger.warn("The property in the is unknown : {}", key) ; //$NON-NLS-1$ + } + } + + } - public CSVDataImportProcess getCsvImporterProcess(File importFromFile) { - final CSVDataImportProcess importProcess = applicationContext.getBean("transactionalCsvDataImportProcess", CSVDataImportProcess.class); + private EarthProperty getEarthPropertyEnum(Object key) { + EarthProperty[] values = EarthProperty.values(); + for (EarthProperty earthProperty : values) { + if( earthProperty.toString().equals( key ) ){ + return earthProperty; + } + } + return null; + } - importProcess.setFile(importFromFile); - importProcess.setSurvey(earthSurveyService.getCollectSurvey()); - importProcess.setParentEntityDefinitionId(earthSurveyService.getRootEntityDefinition().getId()); - importProcess.setStep(Step.ENTRY ); - CSVDataImportSettings settings = new CSVDataImportSettings(); - settings.setRecordValidationEnabled(false); - settings.setInsertNewRecords(false); - settings.setNewRecordVersionName(null); - settings.setReportNoRecordFoundErrors(false); - importProcess.setSettings(settings); - return importProcess; + private Properties getProjectProperties(File definitionFile) throws IOException { + try( FileReader fr = new FileReader( definitionFile ) ){ + Properties properties = new Properties(); + properties.load(fr); + return properties; + }catch(IOException e ) { + logger.error("Impossible to open properties file ", e); + throw e; + } } - public XMLDataImportProcess getImportSummary(File zipWithXml, boolean importNonFinishedPlots) throws Exception { - final XMLDataImportProcess dataImportProcess = applicationContext.getBean(XMLDataImportProcess.class); - dataImportProcess.init(); - dataImportProcess.setFile(zipWithXml); - dataImportProcess.setValidateRecords(false); - dataImportProcess.prepareToStartSummaryCreation(); + private void addToProjectList(File projectFolder) { + String loadedProjects = localPropertiesService.getValue( EarthProperty.LOADED_PROJECTS ); - if( !importNonFinishedPlots ){ // Import only plots whose actively_saved state is set to true - dataImportProcess.setIncludeRecordPredicate( new Predicate() { + if( loadedProjects.length() > 0 ){ - @Override - public boolean evaluate(CollectRecord record) { - boolean include = true; + if( !ArrayUtils.contains(loadedProjects.split(File.pathSeparator), projectFolder.getAbsoluteFile() ) ){ + loadedProjects += File.pathSeparatorChar + projectFolder.getAbsolutePath(); - try { - final BooleanAttribute node = (BooleanAttribute) record.getNodeByPath("/plot/" + EarthConstants.ACTIVELY_SAVED_ATTRIBUTE_NAME); //$NON-NLS-1$ + } + }else{ + loadedProjects = projectFolder.getAbsolutePath(); + } + localPropertiesService.setValue( EarthProperty.LOADED_PROJECTS, loadedProjects ); + } - include = (node == null || (node != null && !node.isEmpty() && node.getValue().getValue()) ); - } catch (Exception e) { - logger.error("No \"/plot/actively_saved\" node found ", e ); //$NON-NLS-1$ - } - return include; - } - }); + private boolean validateProjectDefinitionFile(File projectDefinitionFile) throws IOException{ + boolean success = false; + if( projectDefinitionFile.exists() ){ + if( checkValidContent(projectDefinitionFile) ){ + success = true; + }else{ + throw new IllegalArgumentException("The project definition file does not contain the necessary property " + EarthProperty.SURVEY_NAME.toString()+ ". File located at : " + projectDefinitionFile.getAbsolutePath() ); //$NON-NLS-1$ //$NON-NLS-2$ + } } - return dataImportProcess; + return success; + } + + + public boolean folderContainsProjectDefinition(File folder ) throws IOException{ + File projectPropertiesFile = getProjectPropertiesFile( folder ); + return validateProjectDefinitionFile(projectPropertiesFile); } - public void importRecordsFrom(File zipWithXml, XMLDataImportProcess dataImportProcess, List listConflictingRecords) throws Exception { - final List entryIdsToImport = new ArrayList(); - addRecordsToImportList( listConflictingRecords, entryIdsToImport); - addRecordsToImportList( dataImportProcess.getSummary().getRecordsToImport(),entryIdsToImport); + public boolean loadCompressedProjectFile( File projectZipFile ) throws IOException{ + + File unzippedFolder = unzipContentsOnProjectFolder(projectZipFile); + return( loadProjectInFolder(unzippedFolder) ); + } - dataImportProcess.setEntryIdsToImport(entryIdsToImport); - dataImportProcess.prepareToStartImport(); - dataImportProcess.call(); - int conflictingRecordsAdded = 0; - if (listConflictingRecords != null) { - conflictingRecordsAdded = listConflictingRecords.size(); + private File unzipContentsOnProjectFolder(File projectZipFile) throws IOException { + String projectFolderName = "" ; + // There was an error in the first versions of Collect Earth that limited the folder names to 20 characters + // Newer version support up to 255 but we need to take in consideration backwards compatibility! + if ( oldFormatFolderExists( projectZipFile ) ){ + // If there was already a project with the older format of the name then use that! + projectFolderName = getProjectFolderName( projectZipFile , OLD_MAX_FOLDER_LENGTH ); + }else{ + projectFolderName = getProjectFolderName( projectZipFile , NEW_MAX_FOLDER_LENGTH ); } - logger.warn("Data imported into db. Number of Records imported : {} Conflicting records added : {}" //$NON-NLS-1$ //$NON-NLS-2$ - ,entryIdsToImport.size(), conflictingRecordsAdded); + return unzipContents(projectZipFile, projectFolderName); + } + + + private boolean oldFormatFolderExists(File projectZipFile) throws IOException { + String oldProjectFolderName = getProjectFolderName( projectZipFile , OLD_MAX_FOLDER_LENGTH ); + File oldProjectFolder = new File( getProjectsFolder() + File.separator + oldProjectFolderName ); + return oldProjectFolder.exists(); } - public AbstractProcess exportSurveyAsBackup(File exportToFile) { - final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); - csvDataExportProcess.setOutputFile(exportToFile); - csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); - csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; + private String getProjectFolderName(File projectZipFile, int maxLenghtFolderName) throws IOException { + try( ZipFile zipFile = new ZipFile(projectZipFile) ){ + File definitionFolder = new File(EarthConstants.GENERATED_FOLDER); + zipFile.extractFile( PROJECT_PROPERTIES_FILE_NAME, definitionFolder.getAbsolutePath() ); + String projectName = getProjectSurveyName(new File( definitionFolder + File.separator + PROJECT_PROPERTIES_FILE_NAME) ); + if( projectName != null ) { + projectName = StringUtils.remove(projectName, " "); //$NON-NLS-1$ + + if( projectName.length() > maxLenghtFolderName ){ + projectName = projectName.substring(0, maxLenghtFolderName); + } + } + return projectName; + }catch(Exception e ) { + logger.error("Error opening project folder", projectZipFile.getAbsolutePath() ); + return null; + } + } - CSVDataExportParameters config = new CSVDataExportParameters(); - config.setIncludeAllAncestorAttributes(true); - config.setIncludeCodeItemPositionColumn(true); - config.setIncludeKMLColumnForCoordinates(true); - csvDataExportProcess.setConfiguration(config); - return csvDataExportProcess; + public String getProjectsFolder(){ + return FolderFinder.getCollectEarthDataFolder() + File.separator + PROJECTS; } - public EarthSurveyService getEarthSurveyService() { - return earthSurveyService; + private File unzipContents(File projectZipFile, String projectName) throws ZipException { + File projectFolder = new File( getProjectsFolder() + File.separator + projectName ); + if( projectFolder.exists() || projectFolder.mkdirs() ){ + try( ZipFile zipFile = new ZipFile(projectZipFile) ){ + zipFile.extractAll( projectFolder.getAbsolutePath() ); + }catch(Exception e) { + logger.error("Error unzipping contents " + projectZipFile.getAbsolutePath(), e); + } + } + return projectFolder; } } From 7bb20470f3f6ba5d68c2420f76d8b6e8ca956905 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:05 +0100 Subject: [PATCH 1086/1620] New translations DataImportExportService.java (English) --- .../earth/app/view/Messages_en.properties | 323 +++++++++++------- 1 file changed, 194 insertions(+), 129 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 8f7c20dd42..eb9f542d80 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,129 +1,194 @@ -package org.openforis.collect.earth.app.service; - -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; - -import org.apache.commons.codec.binary.Hex; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.ipcc.RdbExportException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import net.lingala.zip4j.ZipFile; - -public abstract class GenerateDatabase { - - - Logger logger = LoggerFactory.getLogger( GenerateDatabase.class); - boolean refreshDatabase; - boolean userCancelledOperation = false; - - public GenerateDatabase() { - super(); - } - - public abstract EarthSurveyService getEarthSurveyService(); - public abstract LocalPropertiesService getLocalPropertiesService(); - public abstract RDBExporter getRdbExporter(); - - private String getRdbFilePrefix( ExportType type ) { - String result = ""; - try { - final MessageDigest messageDigest = MessageDigest.getInstance("MD5"); - messageDigest.reset(); - String concatenation = getEarthSurveyService().getCollectSurvey().getUri() - + getEarthSurveyService().getCollectSurvey().getName(); - messageDigest.update(concatenation.getBytes( StandardCharsets.UTF_8 ) ); - final byte[] resultByte = messageDigest.digest(); - result = new String(Hex.encodeHex(resultByte)); - } catch (NoSuchAlgorithmException e) { - logger.error("Problems getting the MD5 hash of the project name", e); - } - return result; - } - - protected String getSchemaName() { - if (getLocalPropertiesService().isUsingPostgreSqlDB()) { - return EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU; - } else { - return null; - } - } - - protected File getZippedProjectDB( ExportType type ) { - - File dbFolder = new File(FolderFinder.getCollectEarthDataFolder() + File.separator + type.getDataFolder()); - - if (!dbFolder.exists()) { - dbFolder.mkdir(); - } - - return new File(dbFolder.getAbsolutePath() + File.separator + getRdbFilePrefix( type ) - + type.getDbSuffix() + ".zip"); - } - - public boolean isRdbAlreadyGenerated(ExportType type) { - - boolean saikuDBAlreadyPresent = false; - if (getLocalPropertiesService().isUsingSqliteDB()) { - File rdbFile = getZippedProjectDB( type ); - saikuDBAlreadyPresent = rdbFile.exists(); - } else { - // Here we should check if the "rdbcollectearth" schema is created in the - // PostgreSQL database - saikuDBAlreadyPresent = true; - } - - return saikuDBAlreadyPresent; - } - - protected boolean isRefreshDatabase() { - return refreshDatabase; - } - - protected boolean isUserCancelledOperation() { - return userCancelledOperation; - } - - public abstract void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws RdbExportException; - - protected void replaceZippedProjectDB(ExportType type) throws IOException { - if ( getLocalPropertiesService().isUsingSqliteDB()) { - ZipFile zippedSaiku = CollectEarthUtils.addFileToZip( - getZippedProjectDB( type ), - getRdbExporter().getRdbFile( type ), - getRdbExporter().getRdbFile( type ).getName() - ); - zippedSaiku.close(); - } - } - - boolean restoreZippedProjectDB( ExportType type ) { - boolean restoredSaiku = false; - if (getZippedProjectDB( type ).exists()) { - // Unzip file - - try (ZipFile zippedProjectSaikuData = new ZipFile(getZippedProjectDB( type ))) { - zippedProjectSaikuData.extractAll(FolderFinder.getCollectEarthDataFolder()); - restoredSaiku = true; - } catch (IOException e) { - logger.error("Problems unzipping the contents of the zipped Saiku DB to the local user folder ", e); - } - - } - return restoredSaiku; - } - - public void setRefreshDatabase(boolean refreshDatabase) { - this.refreshDatabase = refreshDatabase; - } - - public void setUserCancelledOperation(boolean userCancelledOperation) { - this.userCancelledOperation = userCancelledOperation; - } -} \ No newline at end of file +package org.openforis.collect.earth.app.service; + +import java.io.File; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.io.data.CSVDataExportProcess; +import org.openforis.collect.io.data.CSVDataImportProcess; +import org.openforis.collect.io.data.DataExportStatus; +import org.openforis.collect.io.data.DataImportSummaryItem; +import org.openforis.collect.io.data.XMLDataExportProcess; +import org.openforis.collect.io.data.XMLDataImportProcess; +import org.openforis.collect.io.data.csv.CSVDataExportParameters; +import org.openforis.collect.io.data.csv.CSVDataImportSettings; +import org.openforis.collect.manager.process.AbstractProcess; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.RecordFilter; +import org.openforis.commons.collection.Predicate; +import org.openforis.idm.model.BooleanAttribute; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Component; + +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ +@Component +public class DataImportExportService { + + @Autowired + private EarthSurveyService earthSurveyService; + + @Autowired + private LocalPropertiesService localPropertiesService; + + private final Logger logger = LoggerFactory.getLogger(DataImportExportService.class); + /** + * Use the application context to get a new bean everytime the data is exported ( as a new instance is needed every time) + */ + @Autowired + private ApplicationContext applicationContext; + + private void addRecordsToImportList( List recordsToImport, List entryIdsToImport) { + if (recordsToImport != null) { + List cleanRecordsToImport = recordsToImport; + for (final DataImportSummaryItem importRecord : cleanRecordsToImport) { + entryIdsToImport.add(importRecord.getEntryId()); + } + } + } + + public CSVDataExportProcess exportSurveyAsCsv(File exportToFile, boolean includeCodeItemLabelColumn) { + final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); + csvDataExportProcess.setOutputFile(exportToFile); + + csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); + csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; + + CSVDataExportParameters config = new CSVDataExportParameters(); + config.setIncludeAllAncestorAttributes(true); + config.setIncludeEnumeratedEntities(true); + config.setLanguageCode( localPropertiesService.getValue(EarthProperty.UI_LANGUAGE) ); + config.setIncludeCodeItemLabelColumn(includeCodeItemLabelColumn); + csvDataExportProcess.setConfiguration(config); + + return csvDataExportProcess; + } + + private RecordFilter getRecordFilter( ) { + RecordFilter recordFilter = new RecordFilter(earthSurveyService.getCollectSurvey(), earthSurveyService.getRootEntityDefinition().getId()); + recordFilter.setStepGreaterOrEqual(Step.ENTRY); + return recordFilter; + } + + public CSVDataExportProcess exportSurveyAsFusionTable(File exportToFile, boolean includeCodeItemLabelColumn) { + + final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); + csvDataExportProcess.setOutputFile(exportToFile); + csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); + csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; + + CSVDataExportParameters config = new CSVDataExportParameters(); + config.setIncludeAllAncestorAttributes(true); + config.setLanguageCode( localPropertiesService.getValue(EarthProperty.UI_LANGUAGE) ); + config.setIncludeCodeItemPositionColumn(true); + config.setIncludeKMLColumnForCoordinates(true); + config.setIncludeCodeItemLabelColumn( includeCodeItemLabelColumn ); + csvDataExportProcess.setConfiguration(config); + return csvDataExportProcess; + } + + public XMLDataExportProcess exportSurveyAsZipWithXml(File exportToFile, Date modifiedSince) throws Exception { + final XMLDataExportProcess xmlDataExportProcess = applicationContext.getBean(XMLDataExportProcess.class); + xmlDataExportProcess.setOutputFile(exportToFile); + xmlDataExportProcess.setRootEntityName(EarthConstants.ROOT_ENTITY_NAME); + xmlDataExportProcess.setSurvey(earthSurveyService.getCollectSurvey()); + xmlDataExportProcess.setModifiedSince(modifiedSince); + xmlDataExportProcess.setIncludeIdm(true); + xmlDataExportProcess.setSteps(new Step[] { Step.ENTRY }); + return xmlDataExportProcess; + } + + + public CSVDataImportProcess getCsvImporterProcess(File importFromFile) { + final CSVDataImportProcess importProcess = applicationContext.getBean("transactionalCsvDataImportProcess", CSVDataImportProcess.class); + + importProcess.setFile(importFromFile); + importProcess.setSurvey(earthSurveyService.getCollectSurvey()); + importProcess.setParentEntityDefinitionId(earthSurveyService.getRootEntityDefinition().getId()); + importProcess.setStep(Step.ENTRY ); + CSVDataImportSettings settings = new CSVDataImportSettings(); + settings.setRecordValidationEnabled(false); + settings.setInsertNewRecords(false); + settings.setNewRecordVersionName(null); + settings.setReportNoRecordFoundErrors(false); + importProcess.setSettings(settings); + return importProcess; + } + + public XMLDataImportProcess getImportSummary(File zipWithXml, boolean importNonFinishedPlots) throws Exception { + final XMLDataImportProcess dataImportProcess = applicationContext.getBean(XMLDataImportProcess.class); + dataImportProcess.init(); + dataImportProcess.setFile(zipWithXml); + dataImportProcess.setValidateRecords(false); + dataImportProcess.prepareToStartSummaryCreation(); + + if( !importNonFinishedPlots ){ // Import only plots whose actively_saved state is set to true + dataImportProcess.setIncludeRecordPredicate( new Predicate() { + + @Override + public boolean evaluate(CollectRecord record) { + boolean include = true; + + try { + final BooleanAttribute node = (BooleanAttribute) record.getNodeByPath("/plot/" + EarthConstants.ACTIVELY_SAVED_ATTRIBUTE_NAME); //$NON-NLS-1$ + + include = (node == null || (node != null && !node.isEmpty() && node.getValue().getValue()) ); + } catch (Exception e) { + logger.error("No \"/plot/actively_saved\" node found ", e ); //$NON-NLS-1$ + } + + return include; + } + }); + } + return dataImportProcess; + } + + public void importRecordsFrom(File zipWithXml, XMLDataImportProcess dataImportProcess, List listConflictingRecords) throws Exception { + final List entryIdsToImport = new ArrayList(); + + addRecordsToImportList( listConflictingRecords, entryIdsToImport); + addRecordsToImportList( dataImportProcess.getSummary().getRecordsToImport(),entryIdsToImport); + + dataImportProcess.setEntryIdsToImport(entryIdsToImport); + dataImportProcess.prepareToStartImport(); + dataImportProcess.call(); + + int conflictingRecordsAdded = 0; + if (listConflictingRecords != null) { + conflictingRecordsAdded = listConflictingRecords.size(); + } + + logger.warn("Data imported into db. Number of Records imported : {} Conflicting records added : {}" //$NON-NLS-1$ //$NON-NLS-2$ + ,entryIdsToImport.size(), conflictingRecordsAdded); + } + + public AbstractProcess exportSurveyAsBackup(File exportToFile) { + final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); + csvDataExportProcess.setOutputFile(exportToFile); + csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); + csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; + + + CSVDataExportParameters config = new CSVDataExportParameters(); + config.setIncludeAllAncestorAttributes(true); + config.setIncludeCodeItemPositionColumn(true); + config.setIncludeKMLColumnForCoordinates(true); + csvDataExportProcess.setConfiguration(config); + return csvDataExportProcess; + } + + public EarthSurveyService getEarthSurveyService() { + return earthSurveyService; + } + +} From b98d8aee6e04d07a62f5c4bf1e894164389b51fb Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:06 +0100 Subject: [PATCH 1087/1620] New translations EarthProjectsService.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 416 ++++++++++++------ 1 file changed, 284 insertions(+), 132 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index eb9f542d80..4f3bc4f7d2 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,194 +1,346 @@ package org.openforis.collect.earth.app.service; import java.io.File; +import java.io.FileReader; +import java.io.IOException; import java.util.ArrayList; -import java.util.Date; -import java.util.List; - +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.filefilter.IOFileFilter; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.io.data.CSVDataExportProcess; -import org.openforis.collect.io.data.CSVDataImportProcess; -import org.openforis.collect.io.data.DataExportStatus; -import org.openforis.collect.io.data.DataImportSummaryItem; -import org.openforis.collect.io.data.XMLDataExportProcess; -import org.openforis.collect.io.data.XMLDataImportProcess; -import org.openforis.collect.io.data.csv.CSVDataExportParameters; -import org.openforis.collect.io.data.csv.CSVDataImportSettings; -import org.openforis.collect.manager.process.AbstractProcess; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.RecordFilter; -import org.openforis.commons.collection.Predicate; -import org.openforis.idm.model.BooleanAttribute; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ +import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.exception.ZipException; + + + @Component -public class DataImportExportService { +public class EarthProjectsService { - @Autowired - private EarthSurveyService earthSurveyService; + + private static final int OLD_MAX_FOLDER_LENGTH = 20; + + private static final int NEW_MAX_FOLDER_LENGTH = 255; + + private static final String PROJECT_PROPERTIES_FILE_NAME = "project_definition.properties"; //$NON-NLS-1$ + + private static final String PROJECTS = "projects"; //$NON-NLS-1$ @Autowired - private LocalPropertiesService localPropertiesService; + LocalPropertiesService localPropertiesService; + + private Logger logger = LoggerFactory.getLogger( EarthProjectsService.class ); + + public void init(LocalPropertiesService localPropertiesService) { + this.localPropertiesService = localPropertiesService; + } + + public Map getProjectList(){ + ArrayList projectFolders = getProjects(); + + HashMap projectListByName = new HashMap<>(); + for (File projectFolder : projectFolders) { + + try { + + File projectPropertiesFile = getProjectPropertiesFile( projectFolder ); + String projectName = getProjectSurveyName(projectPropertiesFile); + if( projectName != null ) { + projectListByName.put( projectName , projectFolder); + } + } catch (IOException e) { + logger.error("The project definition file cannot be read.", e); //$NON-NLS-1$ + } + + } + + return projectListByName; + } + + + private String getProjectSurveyName(File projectPropertiesFile) throws IOException { + Properties properties = getProjectProperties(projectPropertiesFile); + if( properties != null) + return properties.getProperty( EarthProperty.SURVEY_NAME.toString() ); + else + return null; + } + + + private ArrayList getProjects() { + String loadedProjects = localPropertiesService.getValue( EarthProperty.LOADED_PROJECTS ); + + String[] projectFolderPaths = loadedProjects.split( File.pathSeparator ); + + ArrayList workingProjectFolders = new ArrayList<>(); + + for (String projectFolder : projectFolderPaths) { + try { + + File projectFolderFile = new File(projectFolder); + File projectDefinitionFile = getProjectPropertiesFile( projectFolderFile); + if( validateProjectDefinitionFile( projectDefinitionFile ) ){ + workingProjectFolders.add( projectFolderFile ); + } + + } catch (IllegalArgumentException e) { + logger.error("The project definition file is not complete.", e); //$NON-NLS-1$ + } catch (IOException e) { + logger.error("The project definition file cannot be read.", e); //$NON-NLS-1$ + } + + } + + + return workingProjectFolders; + } + + + private boolean checkValidContent(File definitionFile) throws IOException { + Properties projectProperties = getProjectProperties( definitionFile ); + return projectProperties.containsKey( EarthProperty.SURVEY_NAME.toString() ); + + } + - private final Logger logger = LoggerFactory.getLogger(DataImportExportService.class); /** - * Use the application context to get a new bean everytime the data is exported ( as a new instance is needed every time) + * Loads the contents of the project-specific properties into earth.properties + * + * @param projectFolder The folder where the project definition and the rest of the files reside. + * @return True is the project was loaded correctly + * @throws IOException If the project folder or one of its files cannot be found */ - @Autowired - private ApplicationContext applicationContext; + public boolean loadProjectInFolder(File projectFolder) throws IOException{ + + File projectPropertiesFile = getProjectPropertiesFile( projectFolder ); + + boolean success = false; + + // Change the loaded project only if the project definition file has changed or the user changes project + if( + !getProjectDefinitionMD5().equals( CollectEarthUtils.getMd5FromFolder( projectFolder ) ) + && + validateProjectDefinitionFile(projectPropertiesFile) + ){ + + // Remove the version of the survey used so that it is asked again to the user! + localPropertiesService.removeModelVersionName(); - private void addRecordsToImportList( List recordsToImport, List entryIdsToImport) { - if (recordsToImport != null) { - List cleanRecordsToImport = recordsToImport; - for (final DataImportSummaryItem importRecord : cleanRecordsToImport) { - entryIdsToImport.add(importRecord.getEntryId()); + Properties projectProperties = getProjectProperties( projectPropertiesFile ); + + applyPropertiesToCollectEarth( projectProperties, projectFolder ); + + addToProjectList(projectFolder); + + setProjectDefinitionMD5(projectFolder); + + moveSaikuQueriesToRepository(projectFolder, (String) projectProperties.get("survey_name") ); + + success = true; + } + + + return success; + } + + + private void moveSaikuQueriesToRepository(File projectFolder, String surveyName) { + + try { + Collection saikuFiles = getSaikuFiles( projectFolder ); + + String repoDirectory = "tomcat/webapps/saiku/WEB-INF/classes/saiku-repository"; + File saikuRepo = new File( localPropertiesService.getSaikuFolder() + File.separator + repoDirectory + File.separator + surveyName ); + + for (File saikuFile : saikuFiles) { + FileUtils.copyFileToDirectory(saikuFile, saikuRepo, true); } + } catch (IOException e) { + logger.error("Error moving the Saiku files", e); } + + + } - public CSVDataExportProcess exportSurveyAsCsv(File exportToFile, boolean includeCodeItemLabelColumn) { - final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); - csvDataExportProcess.setOutputFile(exportToFile); + private Collection getSaikuFiles(File projectFolder) { + return FileUtils.listFiles(projectFolder, new IOFileFilter() { - csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); - csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; + @Override + public boolean accept(File dir, String name) { + return name.endsWith("saiku"); + } - CSVDataExportParameters config = new CSVDataExportParameters(); - config.setIncludeAllAncestorAttributes(true); - config.setIncludeEnumeratedEntities(true); - config.setLanguageCode( localPropertiesService.getValue(EarthProperty.UI_LANGUAGE) ); - config.setIncludeCodeItemLabelColumn(includeCodeItemLabelColumn); - csvDataExportProcess.setConfiguration(config); + @Override + public boolean accept(File file) { - return csvDataExportProcess; + return file.getName().endsWith("saiku"); + } + }, null); } - private RecordFilter getRecordFilter( ) { - RecordFilter recordFilter = new RecordFilter(earthSurveyService.getCollectSurvey(), earthSurveyService.getRootEntityDefinition().getId()); - recordFilter.setStepGreaterOrEqual(Step.ENTRY); - return recordFilter; + private void setProjectDefinitionMD5(File projectFolder) throws IOException { + localPropertiesService.setValue( EarthProperty.ACTIVE_PROJECT_DEFINITION, CollectEarthUtils.getMd5FromFolder( projectFolder ) ); } - public CSVDataExportProcess exportSurveyAsFusionTable(File exportToFile, boolean includeCodeItemLabelColumn) { + private String getProjectDefinitionMD5() { + return localPropertiesService.getValue( EarthProperty.ACTIVE_PROJECT_DEFINITION); + } - final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); - csvDataExportProcess.setOutputFile(exportToFile); - csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); - csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; - CSVDataExportParameters config = new CSVDataExportParameters(); - config.setIncludeAllAncestorAttributes(true); - config.setLanguageCode( localPropertiesService.getValue(EarthProperty.UI_LANGUAGE) ); - config.setIncludeCodeItemPositionColumn(true); - config.setIncludeKMLColumnForCoordinates(true); - config.setIncludeCodeItemLabelColumn( includeCodeItemLabelColumn ); - csvDataExportProcess.setConfiguration(config); - return csvDataExportProcess; + public File getProjectPropertiesFile(File projectFolder) { + return new File( projectFolder.getAbsolutePath() + File.separator + PROJECT_PROPERTIES_FILE_NAME ); } - public XMLDataExportProcess exportSurveyAsZipWithXml(File exportToFile, Date modifiedSince) throws Exception { - final XMLDataExportProcess xmlDataExportProcess = applicationContext.getBean(XMLDataExportProcess.class); - xmlDataExportProcess.setOutputFile(exportToFile); - xmlDataExportProcess.setRootEntityName(EarthConstants.ROOT_ENTITY_NAME); - xmlDataExportProcess.setSurvey(earthSurveyService.getCollectSurvey()); - xmlDataExportProcess.setModifiedSince(modifiedSince); - xmlDataExportProcess.setIncludeIdm(true); - xmlDataExportProcess.setSteps(new Step[] { Step.ENTRY }); - return xmlDataExportProcess; + public File getSurveyStructureFile(File projectFolder) { + return new File( projectFolder.getAbsolutePath() + File.separator + PROJECT_PROPERTIES_FILE_NAME ); } + private void applyPropertiesToCollectEarth(Properties projectProperties, File projectFolder) { + + for (Object key : projectProperties.keySet()) { + String value = projectProperties.getProperty((String) key); + value = value.replace("${project_path}", projectFolder.getAbsolutePath()); //$NON-NLS-1$ + EarthProperty earthPropertyEnum = getEarthPropertyEnum(key); + if( earthPropertyEnum != null ){ + localPropertiesService.setValue( earthPropertyEnum , value); + }else{ + logger.warn("The property in the is unknown : {}", key) ; //$NON-NLS-1$ + } + } + + } - public CSVDataImportProcess getCsvImporterProcess(File importFromFile) { - final CSVDataImportProcess importProcess = applicationContext.getBean("transactionalCsvDataImportProcess", CSVDataImportProcess.class); + private EarthProperty getEarthPropertyEnum(Object key) { + EarthProperty[] values = EarthProperty.values(); + for (EarthProperty earthProperty : values) { + if( earthProperty.toString().equals( key ) ){ + return earthProperty; + } + } + return null; + } - importProcess.setFile(importFromFile); - importProcess.setSurvey(earthSurveyService.getCollectSurvey()); - importProcess.setParentEntityDefinitionId(earthSurveyService.getRootEntityDefinition().getId()); - importProcess.setStep(Step.ENTRY ); - CSVDataImportSettings settings = new CSVDataImportSettings(); - settings.setRecordValidationEnabled(false); - settings.setInsertNewRecords(false); - settings.setNewRecordVersionName(null); - settings.setReportNoRecordFoundErrors(false); - importProcess.setSettings(settings); - return importProcess; + private Properties getProjectProperties(File definitionFile) throws IOException { + try( FileReader fr = new FileReader( definitionFile ) ){ + Properties properties = new Properties(); + properties.load(fr); + return properties; + }catch(IOException e ) { + logger.error("Impossible to open properties file ", e); + throw e; + } } - public XMLDataImportProcess getImportSummary(File zipWithXml, boolean importNonFinishedPlots) throws Exception { - final XMLDataImportProcess dataImportProcess = applicationContext.getBean(XMLDataImportProcess.class); - dataImportProcess.init(); - dataImportProcess.setFile(zipWithXml); - dataImportProcess.setValidateRecords(false); - dataImportProcess.prepareToStartSummaryCreation(); + private void addToProjectList(File projectFolder) { + String loadedProjects = localPropertiesService.getValue( EarthProperty.LOADED_PROJECTS ); - if( !importNonFinishedPlots ){ // Import only plots whose actively_saved state is set to true - dataImportProcess.setIncludeRecordPredicate( new Predicate() { + if( loadedProjects.length() > 0 ){ - @Override - public boolean evaluate(CollectRecord record) { - boolean include = true; + if( !ArrayUtils.contains(loadedProjects.split(File.pathSeparator), projectFolder.getAbsoluteFile() ) ){ + loadedProjects += File.pathSeparatorChar + projectFolder.getAbsolutePath(); - try { - final BooleanAttribute node = (BooleanAttribute) record.getNodeByPath("/plot/" + EarthConstants.ACTIVELY_SAVED_ATTRIBUTE_NAME); //$NON-NLS-1$ + } + }else{ + loadedProjects = projectFolder.getAbsolutePath(); + } + localPropertiesService.setValue( EarthProperty.LOADED_PROJECTS, loadedProjects ); + } - include = (node == null || (node != null && !node.isEmpty() && node.getValue().getValue()) ); - } catch (Exception e) { - logger.error("No \"/plot/actively_saved\" node found ", e ); //$NON-NLS-1$ - } - return include; - } - }); + private boolean validateProjectDefinitionFile(File projectDefinitionFile) throws IOException{ + boolean success = false; + if( projectDefinitionFile.exists() ){ + if( checkValidContent(projectDefinitionFile) ){ + success = true; + }else{ + throw new IllegalArgumentException("The project definition file does not contain the necessary property " + EarthProperty.SURVEY_NAME.toString()+ ". File located at : " + projectDefinitionFile.getAbsolutePath() ); //$NON-NLS-1$ //$NON-NLS-2$ + } } - return dataImportProcess; + return success; + } + + + public boolean folderContainsProjectDefinition(File folder ) throws IOException{ + File projectPropertiesFile = getProjectPropertiesFile( folder ); + return validateProjectDefinitionFile(projectPropertiesFile); } - public void importRecordsFrom(File zipWithXml, XMLDataImportProcess dataImportProcess, List listConflictingRecords) throws Exception { - final List entryIdsToImport = new ArrayList(); - addRecordsToImportList( listConflictingRecords, entryIdsToImport); - addRecordsToImportList( dataImportProcess.getSummary().getRecordsToImport(),entryIdsToImport); + public boolean loadCompressedProjectFile( File projectZipFile ) throws IOException{ + + File unzippedFolder = unzipContentsOnProjectFolder(projectZipFile); + return( loadProjectInFolder(unzippedFolder) ); + } - dataImportProcess.setEntryIdsToImport(entryIdsToImport); - dataImportProcess.prepareToStartImport(); - dataImportProcess.call(); - int conflictingRecordsAdded = 0; - if (listConflictingRecords != null) { - conflictingRecordsAdded = listConflictingRecords.size(); + private File unzipContentsOnProjectFolder(File projectZipFile) throws IOException { + String projectFolderName = "" ; + // There was an error in the first versions of Collect Earth that limited the folder names to 20 characters + // Newer version support up to 255 but we need to take in consideration backwards compatibility! + if ( oldFormatFolderExists( projectZipFile ) ){ + // If there was already a project with the older format of the name then use that! + projectFolderName = getProjectFolderName( projectZipFile , OLD_MAX_FOLDER_LENGTH ); + }else{ + projectFolderName = getProjectFolderName( projectZipFile , NEW_MAX_FOLDER_LENGTH ); } - logger.warn("Data imported into db. Number of Records imported : {} Conflicting records added : {}" //$NON-NLS-1$ //$NON-NLS-2$ - ,entryIdsToImport.size(), conflictingRecordsAdded); + return unzipContents(projectZipFile, projectFolderName); + } + + + private boolean oldFormatFolderExists(File projectZipFile) throws IOException { + String oldProjectFolderName = getProjectFolderName( projectZipFile , OLD_MAX_FOLDER_LENGTH ); + File oldProjectFolder = new File( getProjectsFolder() + File.separator + oldProjectFolderName ); + return oldProjectFolder.exists(); } - public AbstractProcess exportSurveyAsBackup(File exportToFile) { - final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); - csvDataExportProcess.setOutputFile(exportToFile); - csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); - csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; + private String getProjectFolderName(File projectZipFile, int maxLenghtFolderName) throws IOException { + try( ZipFile zipFile = new ZipFile(projectZipFile) ){ + File definitionFolder = new File(EarthConstants.GENERATED_FOLDER); + zipFile.extractFile( PROJECT_PROPERTIES_FILE_NAME, definitionFolder.getAbsolutePath() ); + String projectName = getProjectSurveyName(new File( definitionFolder + File.separator + PROJECT_PROPERTIES_FILE_NAME) ); + if( projectName != null ) { + projectName = StringUtils.remove(projectName, " "); //$NON-NLS-1$ + + if( projectName.length() > maxLenghtFolderName ){ + projectName = projectName.substring(0, maxLenghtFolderName); + } + } + return projectName; + }catch(Exception e ) { + logger.error("Error opening project folder", projectZipFile.getAbsolutePath() ); + return null; + } + } - CSVDataExportParameters config = new CSVDataExportParameters(); - config.setIncludeAllAncestorAttributes(true); - config.setIncludeCodeItemPositionColumn(true); - config.setIncludeKMLColumnForCoordinates(true); - csvDataExportProcess.setConfiguration(config); - return csvDataExportProcess; + public String getProjectsFolder(){ + return FolderFinder.getCollectEarthDataFolder() + File.separator + PROJECTS; } - public EarthSurveyService getEarthSurveyService() { - return earthSurveyService; + private File unzipContents(File projectZipFile, String projectName) throws ZipException { + File projectFolder = new File( getProjectsFolder() + File.separator + projectName ); + if( projectFolder.exists() || projectFolder.mkdirs() ){ + try( ZipFile zipFile = new ZipFile(projectZipFile) ){ + zipFile.extractAll( projectFolder.getAbsolutePath() ); + }catch(Exception e) { + logger.error("Error unzipping contents " + projectZipFile.getAbsolutePath(), e); + } + } + return projectFolder; } } From 90c03fb66e96a543dcf520f71195960c70c5ff51 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:08 +0100 Subject: [PATCH 1088/1620] New translations EarthProjectsService.java (English) --- .../earth/app/view/Messages_en.properties | 416 ++++++++++++------ 1 file changed, 284 insertions(+), 132 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index eb9f542d80..4f3bc4f7d2 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,194 +1,346 @@ package org.openforis.collect.earth.app.service; import java.io.File; +import java.io.FileReader; +import java.io.IOException; import java.util.ArrayList; -import java.util.Date; -import java.util.List; - +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.filefilter.IOFileFilter; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.io.data.CSVDataExportProcess; -import org.openforis.collect.io.data.CSVDataImportProcess; -import org.openforis.collect.io.data.DataExportStatus; -import org.openforis.collect.io.data.DataImportSummaryItem; -import org.openforis.collect.io.data.XMLDataExportProcess; -import org.openforis.collect.io.data.XMLDataImportProcess; -import org.openforis.collect.io.data.csv.CSVDataExportParameters; -import org.openforis.collect.io.data.csv.CSVDataImportSettings; -import org.openforis.collect.manager.process.AbstractProcess; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.RecordFilter; -import org.openforis.commons.collection.Predicate; -import org.openforis.idm.model.BooleanAttribute; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ +import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.exception.ZipException; + + + @Component -public class DataImportExportService { +public class EarthProjectsService { - @Autowired - private EarthSurveyService earthSurveyService; + + private static final int OLD_MAX_FOLDER_LENGTH = 20; + + private static final int NEW_MAX_FOLDER_LENGTH = 255; + + private static final String PROJECT_PROPERTIES_FILE_NAME = "project_definition.properties"; //$NON-NLS-1$ + + private static final String PROJECTS = "projects"; //$NON-NLS-1$ @Autowired - private LocalPropertiesService localPropertiesService; + LocalPropertiesService localPropertiesService; + + private Logger logger = LoggerFactory.getLogger( EarthProjectsService.class ); + + public void init(LocalPropertiesService localPropertiesService) { + this.localPropertiesService = localPropertiesService; + } + + public Map getProjectList(){ + ArrayList projectFolders = getProjects(); + + HashMap projectListByName = new HashMap<>(); + for (File projectFolder : projectFolders) { + + try { + + File projectPropertiesFile = getProjectPropertiesFile( projectFolder ); + String projectName = getProjectSurveyName(projectPropertiesFile); + if( projectName != null ) { + projectListByName.put( projectName , projectFolder); + } + } catch (IOException e) { + logger.error("The project definition file cannot be read.", e); //$NON-NLS-1$ + } + + } + + return projectListByName; + } + + + private String getProjectSurveyName(File projectPropertiesFile) throws IOException { + Properties properties = getProjectProperties(projectPropertiesFile); + if( properties != null) + return properties.getProperty( EarthProperty.SURVEY_NAME.toString() ); + else + return null; + } + + + private ArrayList getProjects() { + String loadedProjects = localPropertiesService.getValue( EarthProperty.LOADED_PROJECTS ); + + String[] projectFolderPaths = loadedProjects.split( File.pathSeparator ); + + ArrayList workingProjectFolders = new ArrayList<>(); + + for (String projectFolder : projectFolderPaths) { + try { + + File projectFolderFile = new File(projectFolder); + File projectDefinitionFile = getProjectPropertiesFile( projectFolderFile); + if( validateProjectDefinitionFile( projectDefinitionFile ) ){ + workingProjectFolders.add( projectFolderFile ); + } + + } catch (IllegalArgumentException e) { + logger.error("The project definition file is not complete.", e); //$NON-NLS-1$ + } catch (IOException e) { + logger.error("The project definition file cannot be read.", e); //$NON-NLS-1$ + } + + } + + + return workingProjectFolders; + } + + + private boolean checkValidContent(File definitionFile) throws IOException { + Properties projectProperties = getProjectProperties( definitionFile ); + return projectProperties.containsKey( EarthProperty.SURVEY_NAME.toString() ); + + } + - private final Logger logger = LoggerFactory.getLogger(DataImportExportService.class); /** - * Use the application context to get a new bean everytime the data is exported ( as a new instance is needed every time) + * Loads the contents of the project-specific properties into earth.properties + * + * @param projectFolder The folder where the project definition and the rest of the files reside. + * @return True is the project was loaded correctly + * @throws IOException If the project folder or one of its files cannot be found */ - @Autowired - private ApplicationContext applicationContext; + public boolean loadProjectInFolder(File projectFolder) throws IOException{ + + File projectPropertiesFile = getProjectPropertiesFile( projectFolder ); + + boolean success = false; + + // Change the loaded project only if the project definition file has changed or the user changes project + if( + !getProjectDefinitionMD5().equals( CollectEarthUtils.getMd5FromFolder( projectFolder ) ) + && + validateProjectDefinitionFile(projectPropertiesFile) + ){ + + // Remove the version of the survey used so that it is asked again to the user! + localPropertiesService.removeModelVersionName(); - private void addRecordsToImportList( List recordsToImport, List entryIdsToImport) { - if (recordsToImport != null) { - List cleanRecordsToImport = recordsToImport; - for (final DataImportSummaryItem importRecord : cleanRecordsToImport) { - entryIdsToImport.add(importRecord.getEntryId()); + Properties projectProperties = getProjectProperties( projectPropertiesFile ); + + applyPropertiesToCollectEarth( projectProperties, projectFolder ); + + addToProjectList(projectFolder); + + setProjectDefinitionMD5(projectFolder); + + moveSaikuQueriesToRepository(projectFolder, (String) projectProperties.get("survey_name") ); + + success = true; + } + + + return success; + } + + + private void moveSaikuQueriesToRepository(File projectFolder, String surveyName) { + + try { + Collection saikuFiles = getSaikuFiles( projectFolder ); + + String repoDirectory = "tomcat/webapps/saiku/WEB-INF/classes/saiku-repository"; + File saikuRepo = new File( localPropertiesService.getSaikuFolder() + File.separator + repoDirectory + File.separator + surveyName ); + + for (File saikuFile : saikuFiles) { + FileUtils.copyFileToDirectory(saikuFile, saikuRepo, true); } + } catch (IOException e) { + logger.error("Error moving the Saiku files", e); } + + + } - public CSVDataExportProcess exportSurveyAsCsv(File exportToFile, boolean includeCodeItemLabelColumn) { - final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); - csvDataExportProcess.setOutputFile(exportToFile); + private Collection getSaikuFiles(File projectFolder) { + return FileUtils.listFiles(projectFolder, new IOFileFilter() { - csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); - csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; + @Override + public boolean accept(File dir, String name) { + return name.endsWith("saiku"); + } - CSVDataExportParameters config = new CSVDataExportParameters(); - config.setIncludeAllAncestorAttributes(true); - config.setIncludeEnumeratedEntities(true); - config.setLanguageCode( localPropertiesService.getValue(EarthProperty.UI_LANGUAGE) ); - config.setIncludeCodeItemLabelColumn(includeCodeItemLabelColumn); - csvDataExportProcess.setConfiguration(config); + @Override + public boolean accept(File file) { - return csvDataExportProcess; + return file.getName().endsWith("saiku"); + } + }, null); } - private RecordFilter getRecordFilter( ) { - RecordFilter recordFilter = new RecordFilter(earthSurveyService.getCollectSurvey(), earthSurveyService.getRootEntityDefinition().getId()); - recordFilter.setStepGreaterOrEqual(Step.ENTRY); - return recordFilter; + private void setProjectDefinitionMD5(File projectFolder) throws IOException { + localPropertiesService.setValue( EarthProperty.ACTIVE_PROJECT_DEFINITION, CollectEarthUtils.getMd5FromFolder( projectFolder ) ); } - public CSVDataExportProcess exportSurveyAsFusionTable(File exportToFile, boolean includeCodeItemLabelColumn) { + private String getProjectDefinitionMD5() { + return localPropertiesService.getValue( EarthProperty.ACTIVE_PROJECT_DEFINITION); + } - final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); - csvDataExportProcess.setOutputFile(exportToFile); - csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); - csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; - CSVDataExportParameters config = new CSVDataExportParameters(); - config.setIncludeAllAncestorAttributes(true); - config.setLanguageCode( localPropertiesService.getValue(EarthProperty.UI_LANGUAGE) ); - config.setIncludeCodeItemPositionColumn(true); - config.setIncludeKMLColumnForCoordinates(true); - config.setIncludeCodeItemLabelColumn( includeCodeItemLabelColumn ); - csvDataExportProcess.setConfiguration(config); - return csvDataExportProcess; + public File getProjectPropertiesFile(File projectFolder) { + return new File( projectFolder.getAbsolutePath() + File.separator + PROJECT_PROPERTIES_FILE_NAME ); } - public XMLDataExportProcess exportSurveyAsZipWithXml(File exportToFile, Date modifiedSince) throws Exception { - final XMLDataExportProcess xmlDataExportProcess = applicationContext.getBean(XMLDataExportProcess.class); - xmlDataExportProcess.setOutputFile(exportToFile); - xmlDataExportProcess.setRootEntityName(EarthConstants.ROOT_ENTITY_NAME); - xmlDataExportProcess.setSurvey(earthSurveyService.getCollectSurvey()); - xmlDataExportProcess.setModifiedSince(modifiedSince); - xmlDataExportProcess.setIncludeIdm(true); - xmlDataExportProcess.setSteps(new Step[] { Step.ENTRY }); - return xmlDataExportProcess; + public File getSurveyStructureFile(File projectFolder) { + return new File( projectFolder.getAbsolutePath() + File.separator + PROJECT_PROPERTIES_FILE_NAME ); } + private void applyPropertiesToCollectEarth(Properties projectProperties, File projectFolder) { + + for (Object key : projectProperties.keySet()) { + String value = projectProperties.getProperty((String) key); + value = value.replace("${project_path}", projectFolder.getAbsolutePath()); //$NON-NLS-1$ + EarthProperty earthPropertyEnum = getEarthPropertyEnum(key); + if( earthPropertyEnum != null ){ + localPropertiesService.setValue( earthPropertyEnum , value); + }else{ + logger.warn("The property in the is unknown : {}", key) ; //$NON-NLS-1$ + } + } + + } - public CSVDataImportProcess getCsvImporterProcess(File importFromFile) { - final CSVDataImportProcess importProcess = applicationContext.getBean("transactionalCsvDataImportProcess", CSVDataImportProcess.class); + private EarthProperty getEarthPropertyEnum(Object key) { + EarthProperty[] values = EarthProperty.values(); + for (EarthProperty earthProperty : values) { + if( earthProperty.toString().equals( key ) ){ + return earthProperty; + } + } + return null; + } - importProcess.setFile(importFromFile); - importProcess.setSurvey(earthSurveyService.getCollectSurvey()); - importProcess.setParentEntityDefinitionId(earthSurveyService.getRootEntityDefinition().getId()); - importProcess.setStep(Step.ENTRY ); - CSVDataImportSettings settings = new CSVDataImportSettings(); - settings.setRecordValidationEnabled(false); - settings.setInsertNewRecords(false); - settings.setNewRecordVersionName(null); - settings.setReportNoRecordFoundErrors(false); - importProcess.setSettings(settings); - return importProcess; + private Properties getProjectProperties(File definitionFile) throws IOException { + try( FileReader fr = new FileReader( definitionFile ) ){ + Properties properties = new Properties(); + properties.load(fr); + return properties; + }catch(IOException e ) { + logger.error("Impossible to open properties file ", e); + throw e; + } } - public XMLDataImportProcess getImportSummary(File zipWithXml, boolean importNonFinishedPlots) throws Exception { - final XMLDataImportProcess dataImportProcess = applicationContext.getBean(XMLDataImportProcess.class); - dataImportProcess.init(); - dataImportProcess.setFile(zipWithXml); - dataImportProcess.setValidateRecords(false); - dataImportProcess.prepareToStartSummaryCreation(); + private void addToProjectList(File projectFolder) { + String loadedProjects = localPropertiesService.getValue( EarthProperty.LOADED_PROJECTS ); - if( !importNonFinishedPlots ){ // Import only plots whose actively_saved state is set to true - dataImportProcess.setIncludeRecordPredicate( new Predicate() { + if( loadedProjects.length() > 0 ){ - @Override - public boolean evaluate(CollectRecord record) { - boolean include = true; + if( !ArrayUtils.contains(loadedProjects.split(File.pathSeparator), projectFolder.getAbsoluteFile() ) ){ + loadedProjects += File.pathSeparatorChar + projectFolder.getAbsolutePath(); - try { - final BooleanAttribute node = (BooleanAttribute) record.getNodeByPath("/plot/" + EarthConstants.ACTIVELY_SAVED_ATTRIBUTE_NAME); //$NON-NLS-1$ + } + }else{ + loadedProjects = projectFolder.getAbsolutePath(); + } + localPropertiesService.setValue( EarthProperty.LOADED_PROJECTS, loadedProjects ); + } - include = (node == null || (node != null && !node.isEmpty() && node.getValue().getValue()) ); - } catch (Exception e) { - logger.error("No \"/plot/actively_saved\" node found ", e ); //$NON-NLS-1$ - } - return include; - } - }); + private boolean validateProjectDefinitionFile(File projectDefinitionFile) throws IOException{ + boolean success = false; + if( projectDefinitionFile.exists() ){ + if( checkValidContent(projectDefinitionFile) ){ + success = true; + }else{ + throw new IllegalArgumentException("The project definition file does not contain the necessary property " + EarthProperty.SURVEY_NAME.toString()+ ". File located at : " + projectDefinitionFile.getAbsolutePath() ); //$NON-NLS-1$ //$NON-NLS-2$ + } } - return dataImportProcess; + return success; + } + + + public boolean folderContainsProjectDefinition(File folder ) throws IOException{ + File projectPropertiesFile = getProjectPropertiesFile( folder ); + return validateProjectDefinitionFile(projectPropertiesFile); } - public void importRecordsFrom(File zipWithXml, XMLDataImportProcess dataImportProcess, List listConflictingRecords) throws Exception { - final List entryIdsToImport = new ArrayList(); - addRecordsToImportList( listConflictingRecords, entryIdsToImport); - addRecordsToImportList( dataImportProcess.getSummary().getRecordsToImport(),entryIdsToImport); + public boolean loadCompressedProjectFile( File projectZipFile ) throws IOException{ + + File unzippedFolder = unzipContentsOnProjectFolder(projectZipFile); + return( loadProjectInFolder(unzippedFolder) ); + } - dataImportProcess.setEntryIdsToImport(entryIdsToImport); - dataImportProcess.prepareToStartImport(); - dataImportProcess.call(); - int conflictingRecordsAdded = 0; - if (listConflictingRecords != null) { - conflictingRecordsAdded = listConflictingRecords.size(); + private File unzipContentsOnProjectFolder(File projectZipFile) throws IOException { + String projectFolderName = "" ; + // There was an error in the first versions of Collect Earth that limited the folder names to 20 characters + // Newer version support up to 255 but we need to take in consideration backwards compatibility! + if ( oldFormatFolderExists( projectZipFile ) ){ + // If there was already a project with the older format of the name then use that! + projectFolderName = getProjectFolderName( projectZipFile , OLD_MAX_FOLDER_LENGTH ); + }else{ + projectFolderName = getProjectFolderName( projectZipFile , NEW_MAX_FOLDER_LENGTH ); } - logger.warn("Data imported into db. Number of Records imported : {} Conflicting records added : {}" //$NON-NLS-1$ //$NON-NLS-2$ - ,entryIdsToImport.size(), conflictingRecordsAdded); + return unzipContents(projectZipFile, projectFolderName); + } + + + private boolean oldFormatFolderExists(File projectZipFile) throws IOException { + String oldProjectFolderName = getProjectFolderName( projectZipFile , OLD_MAX_FOLDER_LENGTH ); + File oldProjectFolder = new File( getProjectsFolder() + File.separator + oldProjectFolderName ); + return oldProjectFolder.exists(); } - public AbstractProcess exportSurveyAsBackup(File exportToFile) { - final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); - csvDataExportProcess.setOutputFile(exportToFile); - csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); - csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; + private String getProjectFolderName(File projectZipFile, int maxLenghtFolderName) throws IOException { + try( ZipFile zipFile = new ZipFile(projectZipFile) ){ + File definitionFolder = new File(EarthConstants.GENERATED_FOLDER); + zipFile.extractFile( PROJECT_PROPERTIES_FILE_NAME, definitionFolder.getAbsolutePath() ); + String projectName = getProjectSurveyName(new File( definitionFolder + File.separator + PROJECT_PROPERTIES_FILE_NAME) ); + if( projectName != null ) { + projectName = StringUtils.remove(projectName, " "); //$NON-NLS-1$ + + if( projectName.length() > maxLenghtFolderName ){ + projectName = projectName.substring(0, maxLenghtFolderName); + } + } + return projectName; + }catch(Exception e ) { + logger.error("Error opening project folder", projectZipFile.getAbsolutePath() ); + return null; + } + } - CSVDataExportParameters config = new CSVDataExportParameters(); - config.setIncludeAllAncestorAttributes(true); - config.setIncludeCodeItemPositionColumn(true); - config.setIncludeKMLColumnForCoordinates(true); - csvDataExportProcess.setConfiguration(config); - return csvDataExportProcess; + public String getProjectsFolder(){ + return FolderFinder.getCollectEarthDataFolder() + File.separator + PROJECTS; } - public EarthSurveyService getEarthSurveyService() { - return earthSurveyService; + private File unzipContents(File projectZipFile, String projectName) throws ZipException { + File projectFolder = new File( getProjectsFolder() + File.separator + projectName ); + if( projectFolder.exists() || projectFolder.mkdirs() ){ + try( ZipFile zipFile = new ZipFile(projectZipFile) ){ + zipFile.extractAll( projectFolder.getAbsolutePath() ); + }catch(Exception e) { + logger.error("Error unzipping contents " + projectZipFile.getAbsolutePath(), e); + } + } + return projectFolder; } } From ca07a15186494bb3b79631164379a5352c9f8edd Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:09 +0100 Subject: [PATCH 1089/1620] New translations EarthSurveyService.java (French) --- .../earth/app/view/Messages_fr.properties | 364 ++---------------- 1 file changed, 35 insertions(+), 329 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 4f3bc4f7d2..cb792b907b 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,346 +1,52 @@ package org.openforis.collect.earth.app.service; +import static org.openforis.collect.earth.app.EarthConstants.EARTH_SURVEY_NAME; + import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; +import java.io.FileInputStream; -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.filefilter.IOFileFilter; -import org.apache.commons.lang3.ArrayUtils; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; +import org.openforis.collect.manager.exception.SurveyValidationException; +import org.openforis.collect.model.CollectSurvey; +import org.springframework.beans.factory.InitializingBean; import org.springframework.stereotype.Component; -import net.lingala.zip4j.ZipFile; -import net.lingala.zip4j.exception.ZipException; - - - @Component -public class EarthProjectsService { - - - private static final int OLD_MAX_FOLDER_LENGTH = 20; - - private static final int NEW_MAX_FOLDER_LENGTH = 255; - - private static final String PROJECT_PROPERTIES_FILE_NAME = "project_definition.properties"; //$NON-NLS-1$ - - private static final String PROJECTS = "projects"; //$NON-NLS-1$ - - @Autowired - LocalPropertiesService localPropertiesService; - - private Logger logger = LoggerFactory.getLogger( EarthProjectsService.class ); - - public void init(LocalPropertiesService localPropertiesService) { - this.localPropertiesService = localPropertiesService; - } - - public Map getProjectList(){ - ArrayList projectFolders = getProjects(); - - HashMap projectListByName = new HashMap<>(); - for (File projectFolder : projectFolders) { - - try { +public class EarthSurveyService extends AbstractEarthSurveyService implements InitializingBean{ - File projectPropertiesFile = getProjectPropertiesFile( projectFolder ); - String projectName = getProjectSurveyName(projectPropertiesFile); - if( projectName != null ) { - projectListByName.put( projectName , projectFolder); - } - } catch (IOException e) { - logger.error("The project definition file cannot be read.", e); //$NON-NLS-1$ - } - - } - - return projectListByName; - } - - - private String getProjectSurveyName(File projectPropertiesFile) throws IOException { - Properties properties = getProjectProperties(projectPropertiesFile); - if( properties != null) - return properties.getProperty( EarthProperty.SURVEY_NAME.toString() ); - else - return null; - } + @Override + public void afterPropertiesSet() throws Exception { + // Initialize the Collect survey using the idm + // This is only done if the survey has not yet been created in the DB - - private ArrayList getProjects() { - String loadedProjects = localPropertiesService.getValue( EarthProperty.LOADED_PROJECTS ); - - String[] projectFolderPaths = loadedProjects.split( File.pathSeparator ); - - ArrayList workingProjectFolders = new ArrayList<>(); - - for (String projectFolder : projectFolderPaths) { + if (getCollectSurvey() == null) { + CollectSurvey survey; try { - - File projectFolderFile = new File(projectFolder); - File projectDefinitionFile = getProjectPropertiesFile( projectFolderFile); - if( validateProjectDefinitionFile( projectDefinitionFile ) ){ - workingProjectFolders.add( projectFolderFile ); - } - - } catch (IllegalArgumentException e) { - logger.error("The project definition file is not complete.", e); //$NON-NLS-1$ - } catch (IOException e) { - logger.error("The project definition file cannot be read.", e); //$NON-NLS-1$ - } - - } - - - return workingProjectFolders; - } - - - private boolean checkValidContent(File definitionFile) throws IOException { - Properties projectProperties = getProjectProperties( definitionFile ); - return projectProperties.containsKey( EarthProperty.SURVEY_NAME.toString() ); - - } - - - /** - * Loads the contents of the project-specific properties into earth.properties - * - * @param projectFolder The folder where the project definition and the rest of the files reside. - * @return True is the project was loaded correctly - * @throws IOException If the project folder or one of its files cannot be found - */ - public boolean loadProjectInFolder(File projectFolder) throws IOException{ - - File projectPropertiesFile = getProjectPropertiesFile( projectFolder ); - - boolean success = false; - - // Change the loaded project only if the project definition file has changed or the user changes project - if( - !getProjectDefinitionMD5().equals( CollectEarthUtils.getMd5FromFolder( projectFolder ) ) - && - validateProjectDefinitionFile(projectPropertiesFile) - ){ - - // Remove the version of the survey used so that it is asked again to the user! - localPropertiesService.removeModelVersionName(); - - Properties projectProperties = getProjectProperties( projectPropertiesFile ); - - applyPropertiesToCollectEarth( projectProperties, projectFolder ); - - addToProjectList(projectFolder); - - setProjectDefinitionMD5(projectFolder); - - moveSaikuQueriesToRepository(projectFolder, (String) projectProperties.get("survey_name") ); - - success = true; - } - - - return success; - } - - - private void moveSaikuQueriesToRepository(File projectFolder, String surveyName) { - - try { - Collection saikuFiles = getSaikuFiles( projectFolder ); - - String repoDirectory = "tomcat/webapps/saiku/WEB-INF/classes/saiku-repository"; - File saikuRepo = new File( localPropertiesService.getSaikuFolder() + File.separator + repoDirectory + File.separator + surveyName ); - - for (File saikuFile : saikuFiles) { - FileUtils.copyFileToDirectory(saikuFile, saikuRepo, true); - } - } catch (IOException e) { - logger.error("Error moving the Saiku files", e); - } - - - - } - - private Collection getSaikuFiles(File projectFolder) { - return FileUtils.listFiles(projectFolder, new IOFileFilter() { - - @Override - public boolean accept(File dir, String name) { - return name.endsWith("saiku"); - } - - @Override - public boolean accept(File file) { - - return file.getName().endsWith("saiku"); - } - }, null); - } - - private void setProjectDefinitionMD5(File projectFolder) throws IOException { - localPropertiesService.setValue( EarthProperty.ACTIVE_PROJECT_DEFINITION, CollectEarthUtils.getMd5FromFolder( projectFolder ) ); - } - - private String getProjectDefinitionMD5() { - return localPropertiesService.getValue( EarthProperty.ACTIVE_PROJECT_DEFINITION); - } - - - public File getProjectPropertiesFile(File projectFolder) { - return new File( projectFolder.getAbsolutePath() + File.separator + PROJECT_PROPERTIES_FILE_NAME ); - } - - public File getSurveyStructureFile(File projectFolder) { - return new File( projectFolder.getAbsolutePath() + File.separator + PROJECT_PROPERTIES_FILE_NAME ); - } - - private void applyPropertiesToCollectEarth(Properties projectProperties, File projectFolder) { - - for (Object key : projectProperties.keySet()) { - String value = projectProperties.getProperty((String) key); - value = value.replace("${project_path}", projectFolder.getAbsolutePath()); //$NON-NLS-1$ - EarthProperty earthPropertyEnum = getEarthPropertyEnum(key); - if( earthPropertyEnum != null ){ - localPropertiesService.setValue( earthPropertyEnum , value); - }else{ - logger.warn("The property in the is unknown : {}", key) ; //$NON-NLS-1$ - } - } - - } - - private EarthProperty getEarthPropertyEnum(Object key) { - EarthProperty[] values = EarthProperty.values(); - for (EarthProperty earthProperty : values) { - if( earthProperty.toString().equals( key ) ){ - return earthProperty; - } - } - return null; - } - - private Properties getProjectProperties(File definitionFile) throws IOException { - try( FileReader fr = new FileReader( definitionFile ) ){ - Properties properties = new Properties(); - properties.load(fr); - return properties; - }catch(IOException e ) { - logger.error("Impossible to open properties file ", e); - throw e; - } - } - - private void addToProjectList(File projectFolder) { - String loadedProjects = localPropertiesService.getValue( EarthProperty.LOADED_PROJECTS ); - - if( loadedProjects.length() > 0 ){ - - if( !ArrayUtils.contains(loadedProjects.split(File.pathSeparator), projectFolder.getAbsoluteFile() ) ){ - loadedProjects += File.pathSeparatorChar + projectFolder.getAbsolutePath(); - - } - }else{ - loadedProjects = projectFolder.getAbsolutePath(); - } - localPropertiesService.setValue( EarthProperty.LOADED_PROJECTS, loadedProjects ); - } - - - private boolean validateProjectDefinitionFile(File projectDefinitionFile) throws IOException{ - boolean success = false; - if( projectDefinitionFile.exists() ){ - if( checkValidContent(projectDefinitionFile) ){ - success = true; - }else{ - throw new IllegalArgumentException("The project definition file does not contain the necessary property " + EarthProperty.SURVEY_NAME.toString()+ ". File located at : " + projectDefinitionFile.getAbsolutePath() ); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - return success; - } - - - public boolean folderContainsProjectDefinition(File folder ) throws IOException{ - File projectPropertiesFile = getProjectPropertiesFile( folder ); - return validateProjectDefinitionFile(projectPropertiesFile); - } - - - public boolean loadCompressedProjectFile( File projectZipFile ) throws IOException{ - - File unzippedFolder = unzipContentsOnProjectFolder(projectZipFile); - return( loadProjectInFolder(unzippedFolder) ); - } - - - private File unzipContentsOnProjectFolder(File projectZipFile) throws IOException { - String projectFolderName = "" ; - // There was an error in the first versions of Collect Earth that limited the folder names to 20 characters - // Newer version support up to 255 but we need to take in consideration backwards compatibility! - if ( oldFormatFolderExists( projectZipFile ) ){ - // If there was already a project with the older format of the name then use that! - projectFolderName = getProjectFolderName( projectZipFile , OLD_MAX_FOLDER_LENGTH ); - }else{ - projectFolderName = getProjectFolderName( projectZipFile , NEW_MAX_FOLDER_LENGTH ); - } - - return unzipContents(projectZipFile, projectFolderName); - } - - - private boolean oldFormatFolderExists(File projectZipFile) throws IOException { - String oldProjectFolderName = getProjectFolderName( projectZipFile , OLD_MAX_FOLDER_LENGTH ); - File oldProjectFolder = new File( getProjectsFolder() + File.separator + oldProjectFolderName ); - return oldProjectFolder.exists(); - } - - private String getProjectFolderName(File projectZipFile, int maxLenghtFolderName) throws IOException { - try( ZipFile zipFile = new ZipFile(projectZipFile) ){ - File definitionFolder = new File(EarthConstants.GENERATED_FOLDER); - zipFile.extractFile( PROJECT_PROPERTIES_FILE_NAME, definitionFolder.getAbsolutePath() ); - String projectName = getProjectSurveyName(new File( definitionFolder + File.separator + PROJECT_PROPERTIES_FILE_NAME) ); - if( projectName != null ) { - projectName = StringUtils.remove(projectName, " "); //$NON-NLS-1$ - - if( projectName.length() > maxLenghtFolderName ){ - projectName = projectName.substring(0, maxLenghtFolderName); + File idmSurveyModel = new File(getIdmFilePath()); + if (idmSurveyModel.exists()) { + survey = surveyManager.unmarshalSurvey(new FileInputStream(idmSurveyModel), true, true); + if (surveyManager.getByUri(survey.getUri()) == null) { // NOT + // IN + // THE DB + String surveyName = EARTH_SURVEY_NAME + + localPropertiesService.getValue(EarthProperty.SURVEY_NAME); + survey = surveyManager.importModel(idmSurveyModel, surveyName, false, true); + + } else { // UPDATE ALREADY EXISTANT MODEL + survey = surveyManager.updateModel(idmSurveyModel, false, true); + } + + checkVersions(survey); + + setCollectSurvey(survey); + } else { + logger.error( + "The survey definition file could not be found in " + idmSurveyModel.getAbsolutePath()); //$NON-NLS-1$ } + } catch (final SurveyValidationException e) { + logger.error("Unable to validate survey at " + getIdmFilePath(), e); //$NON-NLS-1$ } - return projectName; - }catch(Exception e ) { - logger.error("Error opening project folder", projectZipFile.getAbsolutePath() ); - return null; } } - - public String getProjectsFolder(){ - return FolderFinder.getCollectEarthDataFolder() + File.separator + PROJECTS; - } - - private File unzipContents(File projectZipFile, String projectName) throws ZipException { - File projectFolder = new File( getProjectsFolder() + File.separator + projectName ); - if( projectFolder.exists() || projectFolder.mkdirs() ){ - try( ZipFile zipFile = new ZipFile(projectZipFile) ){ - zipFile.extractAll( projectFolder.getAbsolutePath() ); - }catch(Exception e) { - logger.error("Error unzipping contents " + projectZipFile.getAbsolutePath(), e); - } - } - return projectFolder; - } - } From 3310c703e6acd9cb9d74ae78a889e06884709fb9 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:10 +0100 Subject: [PATCH 1090/1620] New translations EarthSurveyService.java (Spanish) --- .../earth/app/view/Messages_es.properties | 216 +++--------------- 1 file changed, 37 insertions(+), 179 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index eb9f542d80..cb792b907b 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,194 +1,52 @@ package org.openforis.collect.earth.app.service; +import static org.openforis.collect.earth.app.EarthConstants.EARTH_SURVEY_NAME; + import java.io.File; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; +import java.io.FileInputStream; -import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.io.data.CSVDataExportProcess; -import org.openforis.collect.io.data.CSVDataImportProcess; -import org.openforis.collect.io.data.DataExportStatus; -import org.openforis.collect.io.data.DataImportSummaryItem; -import org.openforis.collect.io.data.XMLDataExportProcess; -import org.openforis.collect.io.data.XMLDataImportProcess; -import org.openforis.collect.io.data.csv.CSVDataExportParameters; -import org.openforis.collect.io.data.csv.CSVDataImportSettings; -import org.openforis.collect.manager.process.AbstractProcess; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.RecordFilter; -import org.openforis.commons.collection.Predicate; -import org.openforis.idm.model.BooleanAttribute; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; +import org.openforis.collect.manager.exception.SurveyValidationException; +import org.openforis.collect.model.CollectSurvey; +import org.springframework.beans.factory.InitializingBean; import org.springframework.stereotype.Component; -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ @Component -public class DataImportExportService { - - @Autowired - private EarthSurveyService earthSurveyService; - - @Autowired - private LocalPropertiesService localPropertiesService; - - private final Logger logger = LoggerFactory.getLogger(DataImportExportService.class); - /** - * Use the application context to get a new bean everytime the data is exported ( as a new instance is needed every time) - */ - @Autowired - private ApplicationContext applicationContext; - - private void addRecordsToImportList( List recordsToImport, List entryIdsToImport) { - if (recordsToImport != null) { - List cleanRecordsToImport = recordsToImport; - for (final DataImportSummaryItem importRecord : cleanRecordsToImport) { - entryIdsToImport.add(importRecord.getEntryId()); - } - } - } - - public CSVDataExportProcess exportSurveyAsCsv(File exportToFile, boolean includeCodeItemLabelColumn) { - final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); - csvDataExportProcess.setOutputFile(exportToFile); - - csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); - csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; - - CSVDataExportParameters config = new CSVDataExportParameters(); - config.setIncludeAllAncestorAttributes(true); - config.setIncludeEnumeratedEntities(true); - config.setLanguageCode( localPropertiesService.getValue(EarthProperty.UI_LANGUAGE) ); - config.setIncludeCodeItemLabelColumn(includeCodeItemLabelColumn); - csvDataExportProcess.setConfiguration(config); - - return csvDataExportProcess; - } - - private RecordFilter getRecordFilter( ) { - RecordFilter recordFilter = new RecordFilter(earthSurveyService.getCollectSurvey(), earthSurveyService.getRootEntityDefinition().getId()); - recordFilter.setStepGreaterOrEqual(Step.ENTRY); - return recordFilter; - } - - public CSVDataExportProcess exportSurveyAsFusionTable(File exportToFile, boolean includeCodeItemLabelColumn) { - - final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); - csvDataExportProcess.setOutputFile(exportToFile); - csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); - csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; - - CSVDataExportParameters config = new CSVDataExportParameters(); - config.setIncludeAllAncestorAttributes(true); - config.setLanguageCode( localPropertiesService.getValue(EarthProperty.UI_LANGUAGE) ); - config.setIncludeCodeItemPositionColumn(true); - config.setIncludeKMLColumnForCoordinates(true); - config.setIncludeCodeItemLabelColumn( includeCodeItemLabelColumn ); - csvDataExportProcess.setConfiguration(config); - return csvDataExportProcess; - } - - public XMLDataExportProcess exportSurveyAsZipWithXml(File exportToFile, Date modifiedSince) throws Exception { - final XMLDataExportProcess xmlDataExportProcess = applicationContext.getBean(XMLDataExportProcess.class); - xmlDataExportProcess.setOutputFile(exportToFile); - xmlDataExportProcess.setRootEntityName(EarthConstants.ROOT_ENTITY_NAME); - xmlDataExportProcess.setSurvey(earthSurveyService.getCollectSurvey()); - xmlDataExportProcess.setModifiedSince(modifiedSince); - xmlDataExportProcess.setIncludeIdm(true); - xmlDataExportProcess.setSteps(new Step[] { Step.ENTRY }); - return xmlDataExportProcess; - } - - - public CSVDataImportProcess getCsvImporterProcess(File importFromFile) { - final CSVDataImportProcess importProcess = applicationContext.getBean("transactionalCsvDataImportProcess", CSVDataImportProcess.class); - - importProcess.setFile(importFromFile); - importProcess.setSurvey(earthSurveyService.getCollectSurvey()); - importProcess.setParentEntityDefinitionId(earthSurveyService.getRootEntityDefinition().getId()); - importProcess.setStep(Step.ENTRY ); - CSVDataImportSettings settings = new CSVDataImportSettings(); - settings.setRecordValidationEnabled(false); - settings.setInsertNewRecords(false); - settings.setNewRecordVersionName(null); - settings.setReportNoRecordFoundErrors(false); - importProcess.setSettings(settings); - return importProcess; - } - - public XMLDataImportProcess getImportSummary(File zipWithXml, boolean importNonFinishedPlots) throws Exception { - final XMLDataImportProcess dataImportProcess = applicationContext.getBean(XMLDataImportProcess.class); - dataImportProcess.init(); - dataImportProcess.setFile(zipWithXml); - dataImportProcess.setValidateRecords(false); - dataImportProcess.prepareToStartSummaryCreation(); - - if( !importNonFinishedPlots ){ // Import only plots whose actively_saved state is set to true - dataImportProcess.setIncludeRecordPredicate( new Predicate() { - - @Override - public boolean evaluate(CollectRecord record) { - boolean include = true; - - try { - final BooleanAttribute node = (BooleanAttribute) record.getNodeByPath("/plot/" + EarthConstants.ACTIVELY_SAVED_ATTRIBUTE_NAME); //$NON-NLS-1$ - - include = (node == null || (node != null && !node.isEmpty() && node.getValue().getValue()) ); - } catch (Exception e) { - logger.error("No \"/plot/actively_saved\" node found ", e ); //$NON-NLS-1$ +public class EarthSurveyService extends AbstractEarthSurveyService implements InitializingBean{ + + @Override + public void afterPropertiesSet() throws Exception { + // Initialize the Collect survey using the idm + // This is only done if the survey has not yet been created in the DB + + if (getCollectSurvey() == null) { + CollectSurvey survey; + try { + File idmSurveyModel = new File(getIdmFilePath()); + if (idmSurveyModel.exists()) { + survey = surveyManager.unmarshalSurvey(new FileInputStream(idmSurveyModel), true, true); + if (surveyManager.getByUri(survey.getUri()) == null) { // NOT + // IN + // THE DB + String surveyName = EARTH_SURVEY_NAME + + localPropertiesService.getValue(EarthProperty.SURVEY_NAME); + survey = surveyManager.importModel(idmSurveyModel, surveyName, false, true); + + } else { // UPDATE ALREADY EXISTANT MODEL + survey = surveyManager.updateModel(idmSurveyModel, false, true); } - return include; - } - }); - } - return dataImportProcess; - } - - public void importRecordsFrom(File zipWithXml, XMLDataImportProcess dataImportProcess, List listConflictingRecords) throws Exception { - final List entryIdsToImport = new ArrayList(); + checkVersions(survey); - addRecordsToImportList( listConflictingRecords, entryIdsToImport); - addRecordsToImportList( dataImportProcess.getSummary().getRecordsToImport(),entryIdsToImport); - - dataImportProcess.setEntryIdsToImport(entryIdsToImport); - dataImportProcess.prepareToStartImport(); - dataImportProcess.call(); - - int conflictingRecordsAdded = 0; - if (listConflictingRecords != null) { - conflictingRecordsAdded = listConflictingRecords.size(); + setCollectSurvey(survey); + } else { + logger.error( + "The survey definition file could not be found in " + idmSurveyModel.getAbsolutePath()); //$NON-NLS-1$ + } + } catch (final SurveyValidationException e) { + logger.error("Unable to validate survey at " + getIdmFilePath(), e); //$NON-NLS-1$ + } } - logger.warn("Data imported into db. Number of Records imported : {} Conflicting records added : {}" //$NON-NLS-1$ //$NON-NLS-2$ - ,entryIdsToImport.size(), conflictingRecordsAdded); } - - public AbstractProcess exportSurveyAsBackup(File exportToFile) { - final CSVDataExportProcess csvDataExportProcess = applicationContext.getBean(CSVDataExportProcess.class); - csvDataExportProcess.setOutputFile(exportToFile); - csvDataExportProcess.setEntityId(earthSurveyService.getRootEntityDefinition().getId()); - csvDataExportProcess.setRecordFilter( getRecordFilter() ) ; - - - CSVDataExportParameters config = new CSVDataExportParameters(); - config.setIncludeAllAncestorAttributes(true); - config.setIncludeCodeItemPositionColumn(true); - config.setIncludeKMLColumnForCoordinates(true); - csvDataExportProcess.setConfiguration(config); - return csvDataExportProcess; - } - - public EarthSurveyService getEarthSurveyService() { - return earthSurveyService; - } - } From 1156289c80a4115e494e0480727c73a1de4a49c9 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:11 +0100 Subject: [PATCH 1091/1620] New translations EarthSurveyService.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 364 ++---------------- 1 file changed, 35 insertions(+), 329 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 4f3bc4f7d2..cb792b907b 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,346 +1,52 @@ package org.openforis.collect.earth.app.service; +import static org.openforis.collect.earth.app.EarthConstants.EARTH_SURVEY_NAME; + import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; +import java.io.FileInputStream; -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.filefilter.IOFileFilter; -import org.apache.commons.lang3.ArrayUtils; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; +import org.openforis.collect.manager.exception.SurveyValidationException; +import org.openforis.collect.model.CollectSurvey; +import org.springframework.beans.factory.InitializingBean; import org.springframework.stereotype.Component; -import net.lingala.zip4j.ZipFile; -import net.lingala.zip4j.exception.ZipException; - - - @Component -public class EarthProjectsService { - - - private static final int OLD_MAX_FOLDER_LENGTH = 20; - - private static final int NEW_MAX_FOLDER_LENGTH = 255; - - private static final String PROJECT_PROPERTIES_FILE_NAME = "project_definition.properties"; //$NON-NLS-1$ - - private static final String PROJECTS = "projects"; //$NON-NLS-1$ - - @Autowired - LocalPropertiesService localPropertiesService; - - private Logger logger = LoggerFactory.getLogger( EarthProjectsService.class ); - - public void init(LocalPropertiesService localPropertiesService) { - this.localPropertiesService = localPropertiesService; - } - - public Map getProjectList(){ - ArrayList projectFolders = getProjects(); - - HashMap projectListByName = new HashMap<>(); - for (File projectFolder : projectFolders) { - - try { +public class EarthSurveyService extends AbstractEarthSurveyService implements InitializingBean{ - File projectPropertiesFile = getProjectPropertiesFile( projectFolder ); - String projectName = getProjectSurveyName(projectPropertiesFile); - if( projectName != null ) { - projectListByName.put( projectName , projectFolder); - } - } catch (IOException e) { - logger.error("The project definition file cannot be read.", e); //$NON-NLS-1$ - } - - } - - return projectListByName; - } - - - private String getProjectSurveyName(File projectPropertiesFile) throws IOException { - Properties properties = getProjectProperties(projectPropertiesFile); - if( properties != null) - return properties.getProperty( EarthProperty.SURVEY_NAME.toString() ); - else - return null; - } + @Override + public void afterPropertiesSet() throws Exception { + // Initialize the Collect survey using the idm + // This is only done if the survey has not yet been created in the DB - - private ArrayList getProjects() { - String loadedProjects = localPropertiesService.getValue( EarthProperty.LOADED_PROJECTS ); - - String[] projectFolderPaths = loadedProjects.split( File.pathSeparator ); - - ArrayList workingProjectFolders = new ArrayList<>(); - - for (String projectFolder : projectFolderPaths) { + if (getCollectSurvey() == null) { + CollectSurvey survey; try { - - File projectFolderFile = new File(projectFolder); - File projectDefinitionFile = getProjectPropertiesFile( projectFolderFile); - if( validateProjectDefinitionFile( projectDefinitionFile ) ){ - workingProjectFolders.add( projectFolderFile ); - } - - } catch (IllegalArgumentException e) { - logger.error("The project definition file is not complete.", e); //$NON-NLS-1$ - } catch (IOException e) { - logger.error("The project definition file cannot be read.", e); //$NON-NLS-1$ - } - - } - - - return workingProjectFolders; - } - - - private boolean checkValidContent(File definitionFile) throws IOException { - Properties projectProperties = getProjectProperties( definitionFile ); - return projectProperties.containsKey( EarthProperty.SURVEY_NAME.toString() ); - - } - - - /** - * Loads the contents of the project-specific properties into earth.properties - * - * @param projectFolder The folder where the project definition and the rest of the files reside. - * @return True is the project was loaded correctly - * @throws IOException If the project folder or one of its files cannot be found - */ - public boolean loadProjectInFolder(File projectFolder) throws IOException{ - - File projectPropertiesFile = getProjectPropertiesFile( projectFolder ); - - boolean success = false; - - // Change the loaded project only if the project definition file has changed or the user changes project - if( - !getProjectDefinitionMD5().equals( CollectEarthUtils.getMd5FromFolder( projectFolder ) ) - && - validateProjectDefinitionFile(projectPropertiesFile) - ){ - - // Remove the version of the survey used so that it is asked again to the user! - localPropertiesService.removeModelVersionName(); - - Properties projectProperties = getProjectProperties( projectPropertiesFile ); - - applyPropertiesToCollectEarth( projectProperties, projectFolder ); - - addToProjectList(projectFolder); - - setProjectDefinitionMD5(projectFolder); - - moveSaikuQueriesToRepository(projectFolder, (String) projectProperties.get("survey_name") ); - - success = true; - } - - - return success; - } - - - private void moveSaikuQueriesToRepository(File projectFolder, String surveyName) { - - try { - Collection saikuFiles = getSaikuFiles( projectFolder ); - - String repoDirectory = "tomcat/webapps/saiku/WEB-INF/classes/saiku-repository"; - File saikuRepo = new File( localPropertiesService.getSaikuFolder() + File.separator + repoDirectory + File.separator + surveyName ); - - for (File saikuFile : saikuFiles) { - FileUtils.copyFileToDirectory(saikuFile, saikuRepo, true); - } - } catch (IOException e) { - logger.error("Error moving the Saiku files", e); - } - - - - } - - private Collection getSaikuFiles(File projectFolder) { - return FileUtils.listFiles(projectFolder, new IOFileFilter() { - - @Override - public boolean accept(File dir, String name) { - return name.endsWith("saiku"); - } - - @Override - public boolean accept(File file) { - - return file.getName().endsWith("saiku"); - } - }, null); - } - - private void setProjectDefinitionMD5(File projectFolder) throws IOException { - localPropertiesService.setValue( EarthProperty.ACTIVE_PROJECT_DEFINITION, CollectEarthUtils.getMd5FromFolder( projectFolder ) ); - } - - private String getProjectDefinitionMD5() { - return localPropertiesService.getValue( EarthProperty.ACTIVE_PROJECT_DEFINITION); - } - - - public File getProjectPropertiesFile(File projectFolder) { - return new File( projectFolder.getAbsolutePath() + File.separator + PROJECT_PROPERTIES_FILE_NAME ); - } - - public File getSurveyStructureFile(File projectFolder) { - return new File( projectFolder.getAbsolutePath() + File.separator + PROJECT_PROPERTIES_FILE_NAME ); - } - - private void applyPropertiesToCollectEarth(Properties projectProperties, File projectFolder) { - - for (Object key : projectProperties.keySet()) { - String value = projectProperties.getProperty((String) key); - value = value.replace("${project_path}", projectFolder.getAbsolutePath()); //$NON-NLS-1$ - EarthProperty earthPropertyEnum = getEarthPropertyEnum(key); - if( earthPropertyEnum != null ){ - localPropertiesService.setValue( earthPropertyEnum , value); - }else{ - logger.warn("The property in the is unknown : {}", key) ; //$NON-NLS-1$ - } - } - - } - - private EarthProperty getEarthPropertyEnum(Object key) { - EarthProperty[] values = EarthProperty.values(); - for (EarthProperty earthProperty : values) { - if( earthProperty.toString().equals( key ) ){ - return earthProperty; - } - } - return null; - } - - private Properties getProjectProperties(File definitionFile) throws IOException { - try( FileReader fr = new FileReader( definitionFile ) ){ - Properties properties = new Properties(); - properties.load(fr); - return properties; - }catch(IOException e ) { - logger.error("Impossible to open properties file ", e); - throw e; - } - } - - private void addToProjectList(File projectFolder) { - String loadedProjects = localPropertiesService.getValue( EarthProperty.LOADED_PROJECTS ); - - if( loadedProjects.length() > 0 ){ - - if( !ArrayUtils.contains(loadedProjects.split(File.pathSeparator), projectFolder.getAbsoluteFile() ) ){ - loadedProjects += File.pathSeparatorChar + projectFolder.getAbsolutePath(); - - } - }else{ - loadedProjects = projectFolder.getAbsolutePath(); - } - localPropertiesService.setValue( EarthProperty.LOADED_PROJECTS, loadedProjects ); - } - - - private boolean validateProjectDefinitionFile(File projectDefinitionFile) throws IOException{ - boolean success = false; - if( projectDefinitionFile.exists() ){ - if( checkValidContent(projectDefinitionFile) ){ - success = true; - }else{ - throw new IllegalArgumentException("The project definition file does not contain the necessary property " + EarthProperty.SURVEY_NAME.toString()+ ". File located at : " + projectDefinitionFile.getAbsolutePath() ); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - return success; - } - - - public boolean folderContainsProjectDefinition(File folder ) throws IOException{ - File projectPropertiesFile = getProjectPropertiesFile( folder ); - return validateProjectDefinitionFile(projectPropertiesFile); - } - - - public boolean loadCompressedProjectFile( File projectZipFile ) throws IOException{ - - File unzippedFolder = unzipContentsOnProjectFolder(projectZipFile); - return( loadProjectInFolder(unzippedFolder) ); - } - - - private File unzipContentsOnProjectFolder(File projectZipFile) throws IOException { - String projectFolderName = "" ; - // There was an error in the first versions of Collect Earth that limited the folder names to 20 characters - // Newer version support up to 255 but we need to take in consideration backwards compatibility! - if ( oldFormatFolderExists( projectZipFile ) ){ - // If there was already a project with the older format of the name then use that! - projectFolderName = getProjectFolderName( projectZipFile , OLD_MAX_FOLDER_LENGTH ); - }else{ - projectFolderName = getProjectFolderName( projectZipFile , NEW_MAX_FOLDER_LENGTH ); - } - - return unzipContents(projectZipFile, projectFolderName); - } - - - private boolean oldFormatFolderExists(File projectZipFile) throws IOException { - String oldProjectFolderName = getProjectFolderName( projectZipFile , OLD_MAX_FOLDER_LENGTH ); - File oldProjectFolder = new File( getProjectsFolder() + File.separator + oldProjectFolderName ); - return oldProjectFolder.exists(); - } - - private String getProjectFolderName(File projectZipFile, int maxLenghtFolderName) throws IOException { - try( ZipFile zipFile = new ZipFile(projectZipFile) ){ - File definitionFolder = new File(EarthConstants.GENERATED_FOLDER); - zipFile.extractFile( PROJECT_PROPERTIES_FILE_NAME, definitionFolder.getAbsolutePath() ); - String projectName = getProjectSurveyName(new File( definitionFolder + File.separator + PROJECT_PROPERTIES_FILE_NAME) ); - if( projectName != null ) { - projectName = StringUtils.remove(projectName, " "); //$NON-NLS-1$ - - if( projectName.length() > maxLenghtFolderName ){ - projectName = projectName.substring(0, maxLenghtFolderName); + File idmSurveyModel = new File(getIdmFilePath()); + if (idmSurveyModel.exists()) { + survey = surveyManager.unmarshalSurvey(new FileInputStream(idmSurveyModel), true, true); + if (surveyManager.getByUri(survey.getUri()) == null) { // NOT + // IN + // THE DB + String surveyName = EARTH_SURVEY_NAME + + localPropertiesService.getValue(EarthProperty.SURVEY_NAME); + survey = surveyManager.importModel(idmSurveyModel, surveyName, false, true); + + } else { // UPDATE ALREADY EXISTANT MODEL + survey = surveyManager.updateModel(idmSurveyModel, false, true); + } + + checkVersions(survey); + + setCollectSurvey(survey); + } else { + logger.error( + "The survey definition file could not be found in " + idmSurveyModel.getAbsolutePath()); //$NON-NLS-1$ } + } catch (final SurveyValidationException e) { + logger.error("Unable to validate survey at " + getIdmFilePath(), e); //$NON-NLS-1$ } - return projectName; - }catch(Exception e ) { - logger.error("Error opening project folder", projectZipFile.getAbsolutePath() ); - return null; } } - - public String getProjectsFolder(){ - return FolderFinder.getCollectEarthDataFolder() + File.separator + PROJECTS; - } - - private File unzipContents(File projectZipFile, String projectName) throws ZipException { - File projectFolder = new File( getProjectsFolder() + File.separator + projectName ); - if( projectFolder.exists() || projectFolder.mkdirs() ){ - try( ZipFile zipFile = new ZipFile(projectZipFile) ){ - zipFile.extractAll( projectFolder.getAbsolutePath() ); - }catch(Exception e) { - logger.error("Error unzipping contents " + projectZipFile.getAbsolutePath(), e); - } - } - return projectFolder; - } - } From 42ec736392ff558cdd9930f3aa952370b9c05ba9 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:12 +0100 Subject: [PATCH 1092/1620] New translations EarthSurveyService.java (English) --- .../earth/app/view/Messages_en.properties | 364 ++---------------- 1 file changed, 35 insertions(+), 329 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 4f3bc4f7d2..cb792b907b 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,346 +1,52 @@ package org.openforis.collect.earth.app.service; +import static org.openforis.collect.earth.app.EarthConstants.EARTH_SURVEY_NAME; + import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; +import java.io.FileInputStream; -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.filefilter.IOFileFilter; -import org.apache.commons.lang3.ArrayUtils; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; +import org.openforis.collect.manager.exception.SurveyValidationException; +import org.openforis.collect.model.CollectSurvey; +import org.springframework.beans.factory.InitializingBean; import org.springframework.stereotype.Component; -import net.lingala.zip4j.ZipFile; -import net.lingala.zip4j.exception.ZipException; - - - @Component -public class EarthProjectsService { - - - private static final int OLD_MAX_FOLDER_LENGTH = 20; - - private static final int NEW_MAX_FOLDER_LENGTH = 255; - - private static final String PROJECT_PROPERTIES_FILE_NAME = "project_definition.properties"; //$NON-NLS-1$ - - private static final String PROJECTS = "projects"; //$NON-NLS-1$ - - @Autowired - LocalPropertiesService localPropertiesService; - - private Logger logger = LoggerFactory.getLogger( EarthProjectsService.class ); - - public void init(LocalPropertiesService localPropertiesService) { - this.localPropertiesService = localPropertiesService; - } - - public Map getProjectList(){ - ArrayList projectFolders = getProjects(); - - HashMap projectListByName = new HashMap<>(); - for (File projectFolder : projectFolders) { - - try { +public class EarthSurveyService extends AbstractEarthSurveyService implements InitializingBean{ - File projectPropertiesFile = getProjectPropertiesFile( projectFolder ); - String projectName = getProjectSurveyName(projectPropertiesFile); - if( projectName != null ) { - projectListByName.put( projectName , projectFolder); - } - } catch (IOException e) { - logger.error("The project definition file cannot be read.", e); //$NON-NLS-1$ - } - - } - - return projectListByName; - } - - - private String getProjectSurveyName(File projectPropertiesFile) throws IOException { - Properties properties = getProjectProperties(projectPropertiesFile); - if( properties != null) - return properties.getProperty( EarthProperty.SURVEY_NAME.toString() ); - else - return null; - } + @Override + public void afterPropertiesSet() throws Exception { + // Initialize the Collect survey using the idm + // This is only done if the survey has not yet been created in the DB - - private ArrayList getProjects() { - String loadedProjects = localPropertiesService.getValue( EarthProperty.LOADED_PROJECTS ); - - String[] projectFolderPaths = loadedProjects.split( File.pathSeparator ); - - ArrayList workingProjectFolders = new ArrayList<>(); - - for (String projectFolder : projectFolderPaths) { + if (getCollectSurvey() == null) { + CollectSurvey survey; try { - - File projectFolderFile = new File(projectFolder); - File projectDefinitionFile = getProjectPropertiesFile( projectFolderFile); - if( validateProjectDefinitionFile( projectDefinitionFile ) ){ - workingProjectFolders.add( projectFolderFile ); - } - - } catch (IllegalArgumentException e) { - logger.error("The project definition file is not complete.", e); //$NON-NLS-1$ - } catch (IOException e) { - logger.error("The project definition file cannot be read.", e); //$NON-NLS-1$ - } - - } - - - return workingProjectFolders; - } - - - private boolean checkValidContent(File definitionFile) throws IOException { - Properties projectProperties = getProjectProperties( definitionFile ); - return projectProperties.containsKey( EarthProperty.SURVEY_NAME.toString() ); - - } - - - /** - * Loads the contents of the project-specific properties into earth.properties - * - * @param projectFolder The folder where the project definition and the rest of the files reside. - * @return True is the project was loaded correctly - * @throws IOException If the project folder or one of its files cannot be found - */ - public boolean loadProjectInFolder(File projectFolder) throws IOException{ - - File projectPropertiesFile = getProjectPropertiesFile( projectFolder ); - - boolean success = false; - - // Change the loaded project only if the project definition file has changed or the user changes project - if( - !getProjectDefinitionMD5().equals( CollectEarthUtils.getMd5FromFolder( projectFolder ) ) - && - validateProjectDefinitionFile(projectPropertiesFile) - ){ - - // Remove the version of the survey used so that it is asked again to the user! - localPropertiesService.removeModelVersionName(); - - Properties projectProperties = getProjectProperties( projectPropertiesFile ); - - applyPropertiesToCollectEarth( projectProperties, projectFolder ); - - addToProjectList(projectFolder); - - setProjectDefinitionMD5(projectFolder); - - moveSaikuQueriesToRepository(projectFolder, (String) projectProperties.get("survey_name") ); - - success = true; - } - - - return success; - } - - - private void moveSaikuQueriesToRepository(File projectFolder, String surveyName) { - - try { - Collection saikuFiles = getSaikuFiles( projectFolder ); - - String repoDirectory = "tomcat/webapps/saiku/WEB-INF/classes/saiku-repository"; - File saikuRepo = new File( localPropertiesService.getSaikuFolder() + File.separator + repoDirectory + File.separator + surveyName ); - - for (File saikuFile : saikuFiles) { - FileUtils.copyFileToDirectory(saikuFile, saikuRepo, true); - } - } catch (IOException e) { - logger.error("Error moving the Saiku files", e); - } - - - - } - - private Collection getSaikuFiles(File projectFolder) { - return FileUtils.listFiles(projectFolder, new IOFileFilter() { - - @Override - public boolean accept(File dir, String name) { - return name.endsWith("saiku"); - } - - @Override - public boolean accept(File file) { - - return file.getName().endsWith("saiku"); - } - }, null); - } - - private void setProjectDefinitionMD5(File projectFolder) throws IOException { - localPropertiesService.setValue( EarthProperty.ACTIVE_PROJECT_DEFINITION, CollectEarthUtils.getMd5FromFolder( projectFolder ) ); - } - - private String getProjectDefinitionMD5() { - return localPropertiesService.getValue( EarthProperty.ACTIVE_PROJECT_DEFINITION); - } - - - public File getProjectPropertiesFile(File projectFolder) { - return new File( projectFolder.getAbsolutePath() + File.separator + PROJECT_PROPERTIES_FILE_NAME ); - } - - public File getSurveyStructureFile(File projectFolder) { - return new File( projectFolder.getAbsolutePath() + File.separator + PROJECT_PROPERTIES_FILE_NAME ); - } - - private void applyPropertiesToCollectEarth(Properties projectProperties, File projectFolder) { - - for (Object key : projectProperties.keySet()) { - String value = projectProperties.getProperty((String) key); - value = value.replace("${project_path}", projectFolder.getAbsolutePath()); //$NON-NLS-1$ - EarthProperty earthPropertyEnum = getEarthPropertyEnum(key); - if( earthPropertyEnum != null ){ - localPropertiesService.setValue( earthPropertyEnum , value); - }else{ - logger.warn("The property in the is unknown : {}", key) ; //$NON-NLS-1$ - } - } - - } - - private EarthProperty getEarthPropertyEnum(Object key) { - EarthProperty[] values = EarthProperty.values(); - for (EarthProperty earthProperty : values) { - if( earthProperty.toString().equals( key ) ){ - return earthProperty; - } - } - return null; - } - - private Properties getProjectProperties(File definitionFile) throws IOException { - try( FileReader fr = new FileReader( definitionFile ) ){ - Properties properties = new Properties(); - properties.load(fr); - return properties; - }catch(IOException e ) { - logger.error("Impossible to open properties file ", e); - throw e; - } - } - - private void addToProjectList(File projectFolder) { - String loadedProjects = localPropertiesService.getValue( EarthProperty.LOADED_PROJECTS ); - - if( loadedProjects.length() > 0 ){ - - if( !ArrayUtils.contains(loadedProjects.split(File.pathSeparator), projectFolder.getAbsoluteFile() ) ){ - loadedProjects += File.pathSeparatorChar + projectFolder.getAbsolutePath(); - - } - }else{ - loadedProjects = projectFolder.getAbsolutePath(); - } - localPropertiesService.setValue( EarthProperty.LOADED_PROJECTS, loadedProjects ); - } - - - private boolean validateProjectDefinitionFile(File projectDefinitionFile) throws IOException{ - boolean success = false; - if( projectDefinitionFile.exists() ){ - if( checkValidContent(projectDefinitionFile) ){ - success = true; - }else{ - throw new IllegalArgumentException("The project definition file does not contain the necessary property " + EarthProperty.SURVEY_NAME.toString()+ ". File located at : " + projectDefinitionFile.getAbsolutePath() ); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - return success; - } - - - public boolean folderContainsProjectDefinition(File folder ) throws IOException{ - File projectPropertiesFile = getProjectPropertiesFile( folder ); - return validateProjectDefinitionFile(projectPropertiesFile); - } - - - public boolean loadCompressedProjectFile( File projectZipFile ) throws IOException{ - - File unzippedFolder = unzipContentsOnProjectFolder(projectZipFile); - return( loadProjectInFolder(unzippedFolder) ); - } - - - private File unzipContentsOnProjectFolder(File projectZipFile) throws IOException { - String projectFolderName = "" ; - // There was an error in the first versions of Collect Earth that limited the folder names to 20 characters - // Newer version support up to 255 but we need to take in consideration backwards compatibility! - if ( oldFormatFolderExists( projectZipFile ) ){ - // If there was already a project with the older format of the name then use that! - projectFolderName = getProjectFolderName( projectZipFile , OLD_MAX_FOLDER_LENGTH ); - }else{ - projectFolderName = getProjectFolderName( projectZipFile , NEW_MAX_FOLDER_LENGTH ); - } - - return unzipContents(projectZipFile, projectFolderName); - } - - - private boolean oldFormatFolderExists(File projectZipFile) throws IOException { - String oldProjectFolderName = getProjectFolderName( projectZipFile , OLD_MAX_FOLDER_LENGTH ); - File oldProjectFolder = new File( getProjectsFolder() + File.separator + oldProjectFolderName ); - return oldProjectFolder.exists(); - } - - private String getProjectFolderName(File projectZipFile, int maxLenghtFolderName) throws IOException { - try( ZipFile zipFile = new ZipFile(projectZipFile) ){ - File definitionFolder = new File(EarthConstants.GENERATED_FOLDER); - zipFile.extractFile( PROJECT_PROPERTIES_FILE_NAME, definitionFolder.getAbsolutePath() ); - String projectName = getProjectSurveyName(new File( definitionFolder + File.separator + PROJECT_PROPERTIES_FILE_NAME) ); - if( projectName != null ) { - projectName = StringUtils.remove(projectName, " "); //$NON-NLS-1$ - - if( projectName.length() > maxLenghtFolderName ){ - projectName = projectName.substring(0, maxLenghtFolderName); + File idmSurveyModel = new File(getIdmFilePath()); + if (idmSurveyModel.exists()) { + survey = surveyManager.unmarshalSurvey(new FileInputStream(idmSurveyModel), true, true); + if (surveyManager.getByUri(survey.getUri()) == null) { // NOT + // IN + // THE DB + String surveyName = EARTH_SURVEY_NAME + + localPropertiesService.getValue(EarthProperty.SURVEY_NAME); + survey = surveyManager.importModel(idmSurveyModel, surveyName, false, true); + + } else { // UPDATE ALREADY EXISTANT MODEL + survey = surveyManager.updateModel(idmSurveyModel, false, true); + } + + checkVersions(survey); + + setCollectSurvey(survey); + } else { + logger.error( + "The survey definition file could not be found in " + idmSurveyModel.getAbsolutePath()); //$NON-NLS-1$ } + } catch (final SurveyValidationException e) { + logger.error("Unable to validate survey at " + getIdmFilePath(), e); //$NON-NLS-1$ } - return projectName; - }catch(Exception e ) { - logger.error("Error opening project folder", projectZipFile.getAbsolutePath() ); - return null; } } - - public String getProjectsFolder(){ - return FolderFinder.getCollectEarthDataFolder() + File.separator + PROJECTS; - } - - private File unzipContents(File projectZipFile, String projectName) throws ZipException { - File projectFolder = new File( getProjectsFolder() + File.separator + projectName ); - if( projectFolder.exists() || projectFolder.mkdirs() ){ - try( ZipFile zipFile = new ZipFile(projectZipFile) ){ - zipFile.extractAll( projectFolder.getAbsolutePath() ); - }catch(Exception e) { - logger.error("Error unzipping contents " + projectZipFile.getAbsolutePath(), e); - } - } - return projectFolder; - } - } From a7c6868d8cc790347b6dfe0997d2d54ad576559d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:13 +0100 Subject: [PATCH 1093/1620] New translations ExportType.java (French) --- .../earth/app/view/Messages_fr.properties | 107 +++++++++--------- 1 file changed, 55 insertions(+), 52 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index cb792b907b..7633aaf9fd 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,52 +1,55 @@ -package org.openforis.collect.earth.app.service; - -import static org.openforis.collect.earth.app.EarthConstants.EARTH_SURVEY_NAME; - -import java.io.File; -import java.io.FileInputStream; - -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.manager.exception.SurveyValidationException; -import org.openforis.collect.model.CollectSurvey; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.stereotype.Component; - -@Component -public class EarthSurveyService extends AbstractEarthSurveyService implements InitializingBean{ - - @Override - public void afterPropertiesSet() throws Exception { - // Initialize the Collect survey using the idm - // This is only done if the survey has not yet been created in the DB - - if (getCollectSurvey() == null) { - CollectSurvey survey; - try { - File idmSurveyModel = new File(getIdmFilePath()); - if (idmSurveyModel.exists()) { - survey = surveyManager.unmarshalSurvey(new FileInputStream(idmSurveyModel), true, true); - if (surveyManager.getByUri(survey.getUri()) == null) { // NOT - // IN - // THE DB - String surveyName = EARTH_SURVEY_NAME - + localPropertiesService.getValue(EarthProperty.SURVEY_NAME); - survey = surveyManager.importModel(idmSurveyModel, surveyName, false, true); - - } else { // UPDATE ALREADY EXISTANT MODEL - survey = surveyManager.updateModel(idmSurveyModel, false, true); - } - - checkVersions(survey); - - setCollectSurvey(survey); - } else { - logger.error( - "The survey definition file could not be found in " + idmSurveyModel.getAbsolutePath()); //$NON-NLS-1$ - } - } catch (final SurveyValidationException e) { - logger.error("Unable to validate survey at " + getIdmFilePath(), e); //$NON-NLS-1$ - } - } - - } -} +package org.openforis.collect.earth.app.service; + +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.desktop.ServerController; + +public enum ExportType { + SAIKU( + ServerController.SAIKU_RDB_SUFFIX, + "Saiku", + "SaikuDataFolder", + EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + ServerController.SAIKU_RDB_SUFFIX, + EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU + ), + IPCC( + ServerController.IPCC_RDB_SUFFIX, + "Ipcc", + "IPCCDataFolder", + EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + ServerController.IPCC_RDB_SUFFIX, + EarthConstants.POSTGRES_RDB_SCHEMA_IPCC + ); + + private String dbSuffix; + private String prefix; + private String dataFolder; + private String dbFileName; + private String rdbSchema; + + ExportType(String dbSuffix, String prefix, String dataFolder, String dbFileName, String rdbSchema ) { + this.dbSuffix = dbSuffix; + this.prefix = prefix; + this.dbFileName = dbFileName; + this.rdbSchema = rdbSchema; + } + + public String getDbSuffix() { + return dbSuffix; + } + + public String getPrefix() { + return prefix; + } + + public String getDataFolder() { + return dataFolder; + } + + public String getDbFileName() { + return dbFileName; + } + + public String getRdbSchema() { + return rdbSchema; + } + +} \ No newline at end of file From c677859d0374b371d250c79b05f4849d689f7d0e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:14 +0100 Subject: [PATCH 1094/1620] New translations KmlImportService.java (English) --- .../earth/app/view/Messages_en.properties | 247 +++++++++++++++--- 1 file changed, 209 insertions(+), 38 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index cb792b907b..9fb3d5284e 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,52 +1,223 @@ package org.openforis.collect.earth.app.service; -import static org.openforis.collect.earth.app.EarthConstants.EARTH_SURVEY_NAME; - +import java.io.BufferedInputStream; +import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; + +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.xml.XMLConstants; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import org.apache.commons.io.FileUtils; import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.manager.exception.SurveyValidationException; -import org.openforis.collect.model.CollectSurvey; -import org.springframework.beans.factory.InitializingBean; +import org.openforis.collect.earth.app.view.DataFormat; +import org.openforis.collect.earth.app.view.JFileChooserExistsAware; +import org.openforis.collect.earth.app.view.Messages; +import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; +import org.openforis.collect.io.metadata.collectearth.CollectEarthProjectFileCreator; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; @Component -public class EarthSurveyService extends AbstractEarthSurveyService implements InitializingBean{ - - @Override - public void afterPropertiesSet() throws Exception { - // Initialize the Collect survey using the idm - // This is only done if the survey has not yet been created in the DB - - if (getCollectSurvey() == null) { - CollectSurvey survey; - try { - File idmSurveyModel = new File(getIdmFilePath()); - if (idmSurveyModel.exists()) { - survey = surveyManager.unmarshalSurvey(new FileInputStream(idmSurveyModel), true, true); - if (surveyManager.getByUri(survey.getUri()) == null) { // NOT - // IN - // THE DB - String surveyName = EARTH_SURVEY_NAME - + localPropertiesService.getValue(EarthProperty.SURVEY_NAME); - survey = surveyManager.importModel(idmSurveyModel, surveyName, false, true); - - } else { // UPDATE ALREADY EXISTANT MODEL - survey = surveyManager.updateModel(idmSurveyModel, false, true); - } - - checkVersions(survey); - - setCollectSurvey(survey); - } else { - logger.error( - "The survey definition file could not be found in " + idmSurveyModel.getAbsolutePath()); //$NON-NLS-1$ - } - } catch (final SurveyValidationException e) { - logger.error("Unable to validate survey at " + getIdmFilePath(), e); //$NON-NLS-1$ +public class KmlImportService { + + Map namesAndTimes = new HashMap<>(); + + @Autowired + LocalPropertiesService localPropertiesService; + + @Autowired + EarthProjectsService earthProjectsService; + + @Autowired + EarthSurveyService earthSurveyService; + + private JFrame frame; + + /* + * + + one + + -5.89991123135449 + 41.60459478540565 + 0 + -1.425202537313517e-006 + 0 + 177418.783783632 + relativeToSeaFloor + + #m_ylw-pushpin + + 1 + -5.899911231354489,41.60459478540565,0 + + + * + * + */ + + private File createTempCsv( File kmlFile) throws ParserConfigurationException, SAXException, IOException{ + + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); // Compliant + factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); // compliant + DocumentBuilder builder = factory.newDocumentBuilder(); + InputSource is = new InputSource(new FileReader(kmlFile)); + Document doc = builder.parse(is); + + NodeList placemarks = doc.getElementsByTagName("Placemark"); //$NON-NLS-1$ + + StringBuilder sb = new StringBuilder(); + + sb.append( CollectEarthProjectFileCreator.PLACEHOLDER_ID_COLUMNS_HEADER ).append(",").append( "YCoordinate" ).append(",").append( "XCoordinate" ).append(CollectEarthProjectFileCreator.PLACEHOLDER_FOR_EXTRA_COLUMNS_HEADER).append( "\r\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + + for (int i = 0; i < placemarks.getLength(); i++) { + Node placemark = placemarks.item(i); + + if (placemark.hasChildNodes()) { + NodeList childNodes = placemark.getChildNodes(); + String longitude = "",latitude = "",name = "Placemark"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + name = "placemark" + i; + for (int j=0; j Date: Tue, 29 Nov 2022 15:42:16 +0100 Subject: [PATCH 1095/1620] New translations PreloadedFilesService.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 66 ++++++++----------- 1 file changed, 28 insertions(+), 38 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index cb792b907b..8d225e803d 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,52 +1,42 @@ package org.openforis.collect.earth.app.service; -import static org.openforis.collect.earth.app.EarthConstants.EARTH_SURVEY_NAME; - import java.io.File; -import java.io.FileInputStream; +import java.io.IOException; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.manager.exception.SurveyValidationException; -import org.openforis.collect.model.CollectSurvey; -import org.springframework.beans.factory.InitializingBean; +import org.apache.commons.io.FileUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ @Component -public class EarthSurveyService extends AbstractEarthSurveyService implements InitializingBean{ +public class PreloadedFilesService { - @Override - public void afterPropertiesSet() throws Exception { - // Initialize the Collect survey using the idm - // This is only done if the survey has not yet been created in the DB + private final Logger logger = LoggerFactory.getLogger(PreloadedFilesService.class); - if (getCollectSurvey() == null) { - CollectSurvey survey; + private final Map filesInMemory; + + public PreloadedFilesService() { + filesInMemory = new ConcurrentHashMap<>(); + } + + public byte[] getFileContent(File file) { + byte[] fileContents = filesInMemory.get(file.getPath()); + if (fileContents == null) { + byte[] content = new byte[0]; try { - File idmSurveyModel = new File(getIdmFilePath()); - if (idmSurveyModel.exists()) { - survey = surveyManager.unmarshalSurvey(new FileInputStream(idmSurveyModel), true, true); - if (surveyManager.getByUri(survey.getUri()) == null) { // NOT - // IN - // THE DB - String surveyName = EARTH_SURVEY_NAME - + localPropertiesService.getValue(EarthProperty.SURVEY_NAME); - survey = surveyManager.importModel(idmSurveyModel, surveyName, false, true); - - } else { // UPDATE ALREADY EXISTANT MODEL - survey = surveyManager.updateModel(idmSurveyModel, false, true); - } - - checkVersions(survey); - - setCollectSurvey(survey); - } else { - logger.error( - "The survey definition file could not be found in " + idmSurveyModel.getAbsolutePath()); //$NON-NLS-1$ - } - } catch (final SurveyValidationException e) { - logger.error("Unable to validate survey at " + getIdmFilePath(), e); //$NON-NLS-1$ + content = FileUtils.readFileToByteArray(file); + filesInMemory.put(file.getPath(), content); + } catch (IOException e) { + logger.error("Problems while reading the file " + file.getPath() + " was not found.", e); } + fileContents = content; } - + return fileContents; } } From f37bbec1f94a9b83fc258df9075ec32dc967e41a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:17 +0100 Subject: [PATCH 1096/1620] New translations PreloadedFilesService.java (Spanish) --- .../earth/app/view/Messages_es.properties | 66 ++++++++----------- 1 file changed, 28 insertions(+), 38 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index cb792b907b..8d225e803d 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,52 +1,42 @@ package org.openforis.collect.earth.app.service; -import static org.openforis.collect.earth.app.EarthConstants.EARTH_SURVEY_NAME; - import java.io.File; -import java.io.FileInputStream; +import java.io.IOException; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.manager.exception.SurveyValidationException; -import org.openforis.collect.model.CollectSurvey; -import org.springframework.beans.factory.InitializingBean; +import org.apache.commons.io.FileUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ @Component -public class EarthSurveyService extends AbstractEarthSurveyService implements InitializingBean{ +public class PreloadedFilesService { - @Override - public void afterPropertiesSet() throws Exception { - // Initialize the Collect survey using the idm - // This is only done if the survey has not yet been created in the DB + private final Logger logger = LoggerFactory.getLogger(PreloadedFilesService.class); - if (getCollectSurvey() == null) { - CollectSurvey survey; + private final Map filesInMemory; + + public PreloadedFilesService() { + filesInMemory = new ConcurrentHashMap<>(); + } + + public byte[] getFileContent(File file) { + byte[] fileContents = filesInMemory.get(file.getPath()); + if (fileContents == null) { + byte[] content = new byte[0]; try { - File idmSurveyModel = new File(getIdmFilePath()); - if (idmSurveyModel.exists()) { - survey = surveyManager.unmarshalSurvey(new FileInputStream(idmSurveyModel), true, true); - if (surveyManager.getByUri(survey.getUri()) == null) { // NOT - // IN - // THE DB - String surveyName = EARTH_SURVEY_NAME - + localPropertiesService.getValue(EarthProperty.SURVEY_NAME); - survey = surveyManager.importModel(idmSurveyModel, surveyName, false, true); - - } else { // UPDATE ALREADY EXISTANT MODEL - survey = surveyManager.updateModel(idmSurveyModel, false, true); - } - - checkVersions(survey); - - setCollectSurvey(survey); - } else { - logger.error( - "The survey definition file could not be found in " + idmSurveyModel.getAbsolutePath()); //$NON-NLS-1$ - } - } catch (final SurveyValidationException e) { - logger.error("Unable to validate survey at " + getIdmFilePath(), e); //$NON-NLS-1$ + content = FileUtils.readFileToByteArray(file); + filesInMemory.put(file.getPath(), content); + } catch (IOException e) { + logger.error("Problems while reading the file " + file.getPath() + " was not found.", e); } + fileContents = content; } - + return fileContents; } } From 89efedacb4a1ba12abe984ed6527f8ea510c30ef Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:18 +0100 Subject: [PATCH 1097/1620] New translations PreloadedFilesService.java (French) --- .../earth/app/view/Messages_fr.properties | 97 ++++++++----------- 1 file changed, 42 insertions(+), 55 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 7633aaf9fd..8d225e803d 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,55 +1,42 @@ -package org.openforis.collect.earth.app.service; - -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.desktop.ServerController; - -public enum ExportType { - SAIKU( - ServerController.SAIKU_RDB_SUFFIX, - "Saiku", - "SaikuDataFolder", - EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + ServerController.SAIKU_RDB_SUFFIX, - EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU - ), - IPCC( - ServerController.IPCC_RDB_SUFFIX, - "Ipcc", - "IPCCDataFolder", - EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + ServerController.IPCC_RDB_SUFFIX, - EarthConstants.POSTGRES_RDB_SCHEMA_IPCC - ); - - private String dbSuffix; - private String prefix; - private String dataFolder; - private String dbFileName; - private String rdbSchema; - - ExportType(String dbSuffix, String prefix, String dataFolder, String dbFileName, String rdbSchema ) { - this.dbSuffix = dbSuffix; - this.prefix = prefix; - this.dbFileName = dbFileName; - this.rdbSchema = rdbSchema; - } - - public String getDbSuffix() { - return dbSuffix; - } - - public String getPrefix() { - return prefix; - } - - public String getDataFolder() { - return dataFolder; - } - - public String getDbFileName() { - return dbFileName; - } - - public String getRdbSchema() { - return rdbSchema; - } - -} \ No newline at end of file +package org.openforis.collect.earth.app.service; + +import java.io.File; +import java.io.IOException; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import org.apache.commons.io.FileUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ +@Component +public class PreloadedFilesService { + + private final Logger logger = LoggerFactory.getLogger(PreloadedFilesService.class); + + private final Map filesInMemory; + + public PreloadedFilesService() { + filesInMemory = new ConcurrentHashMap<>(); + } + + public byte[] getFileContent(File file) { + byte[] fileContents = filesInMemory.get(file.getPath()); + if (fileContents == null) { + byte[] content = new byte[0]; + try { + content = FileUtils.readFileToByteArray(file); + filesInMemory.put(file.getPath(), content); + } catch (IOException e) { + logger.error("Problems while reading the file " + file.getPath() + " was not found.", e); + } + fileContents = content; + } + return fileContents; + } +} From 1f2a0ff94b6a35c251bee7540dfb79b742cd5edf Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:19 +0100 Subject: [PATCH 1098/1620] New translations MissingPlotService.java (English) --- .../earth/app/view/Messages_en.properties | 348 +++++++++--------- 1 file changed, 176 insertions(+), 172 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 9fb3d5284e..1c73e5c34d 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,223 +1,227 @@ package org.openforis.collect.earth.app.service; -import java.io.BufferedInputStream; +import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.FileOutputStream; -import java.io.FileReader; import java.io.IOException; +import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; -import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.xml.XMLConstants; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; - -import org.apache.commons.io.FileUtils; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.app.view.DataFormat; -import org.openforis.collect.earth.app.view.JFileChooserExistsAware; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; import org.openforis.collect.earth.app.view.Messages; -import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; -import org.openforis.collect.io.metadata.collectearth.CollectEarthProjectFileCreator; +import org.openforis.collect.manager.RecordManager; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.CollectRecordSummary; +import org.openforis.collect.model.RecordFilter; +import org.openforis.idm.metamodel.AttributeDefinition; +import org.openforis.idm.model.BooleanAttribute; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.w3c.dom.Document; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; +import org.springframework.util.StringUtils; -@Component -public class KmlImportService { +import com.opencsv.CSVReader; +import com.opencsv.exceptions.CsvValidationException; - Map namesAndTimes = new HashMap<>(); +@Component +public class MissingPlotService { @Autowired - LocalPropertiesService localPropertiesService; + private RecordManager recordManager; @Autowired - EarthProjectsService earthProjectsService; + private EarthSurveyService earthSurveyService; - @Autowired - EarthSurveyService earthSurveyService; - - private JFrame frame; - - /* - * - - one - - -5.89991123135449 - 41.60459478540565 - 0 - -1.425202537313517e-006 - 0 - 177418.783783632 - relativeToSeaFloor - - #m_ylw-pushpin - - 1 - -5.899911231354489,41.60459478540565,0 - - - * - * - */ - - private File createTempCsv( File kmlFile) throws ParserConfigurationException, SAXException, IOException{ - - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); // Compliant - factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); // compliant - DocumentBuilder builder = factory.newDocumentBuilder(); - InputSource is = new InputSource(new FileReader(kmlFile)); - Document doc = builder.parse(is); - - NodeList placemarks = doc.getElementsByTagName("Placemark"); //$NON-NLS-1$ - - StringBuilder sb = new StringBuilder(); - - sb.append( CollectEarthProjectFileCreator.PLACEHOLDER_ID_COLUMNS_HEADER ).append(",").append( "YCoordinate" ).append(",").append( "XCoordinate" ).append(CollectEarthProjectFileCreator.PLACEHOLDER_FOR_EXTRA_COLUMNS_HEADER).append( "\r\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - - - for (int i = 0; i < placemarks.getLength(); i++) { - Node placemark = placemarks.item(i); - - if (placemark.hasChildNodes()) { - NodeList childNodes = placemark.getChildNodes(); - String longitude = "",latitude = "",name = "Placemark"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - name = "placemark" + i; - for (int j=0; j> missingPlotData) { + + File tempFile = null; + try { + tempFile = File.createTempFile("missingPlots", ".csv"); + tempFile.deleteOnExit(); + + try( BufferedWriter fw = new BufferedWriter(new OutputStreamWriter( new FileOutputStream( tempFile ), StandardCharsets.UTF_8 ) ) ){ + Set files = missingPlotData.keySet(); + for (String plotFile : files) { + + List missingPlots = missingPlotData.get(plotFile); + StringBuilder csvRow = new StringBuilder(""); + for (String[] plotData : missingPlots) { + csvRow = new StringBuilder(""); + for (String data : plotData) { + + data = data.replaceAll("\"", "\\\""); - public String processPoint(Node placemarkChild) { - NodeList lookAtNodes = placemarkChild.getChildNodes(); - String coordinates = null; - for (int h=0; h> allPlotDataInFiles, Map> missingPlotDataPerFile ) { + + String missingPlotsText = getTextMissingPlots( missingPlotDataPerFile ); - public boolean prompToOpenKml( JFrame frame) throws ParserConfigurationException, SAXException, IOException{ - this.frame = frame; - // Choose the file in the file system - File kmlFile = chooseKmlFile(); - boolean kmlImported = false; - if( kmlFile != null ){ - kmlImported = loadFromKml(frame, kmlFile); + int totalPlots = 0; + int missingPlots = 0; + for (Entry> entry : allPlotDataInFiles.entrySet() ) { + if( entry.getValue()!=null){ + totalPlots += entry.getValue().size(); + missingPlots += missingPlotDataPerFile.get( entry.getKey() ).size(); + } } + missingPlotsText += "\n\n"+Messages.getString("MissingPlotsListener.10") + totalPlots ; //$NON-NLS-1$ //$NON-NLS-2$ - return kmlImported; + if( missingPlots > 0 ){ + missingPlotsText += "\n"+Messages.getString("MissingPlotsListener.12") + missingPlots; //$NON-NLS-1$ //$NON-NLS-2$ + }else{ + missingPlotsText +="\n"+Messages.getString("MissingPlotsListener.14"); //$NON-NLS-1$ //$NON-NLS-2$ + } + return missingPlotsText; } + private String getTextMissingPlots(Map> missingPlotDataPerFile) { + StringBuilder missingPlots = new StringBuilder(""); //$NON-NLS-1$ - public boolean loadFromKml( JFrame frame, File kmlFile) throws ParserConfigurationException, SAXException, IOException{ + Set files = missingPlotDataPerFile.keySet(); + for (String fileToBeChecked : files) { - // Convert the KML into a CSV and save it into a temporary file - File convertedCsvFile = createTempCsv( kmlFile ); + missingPlots.append("\n").append(Messages.getString("MissingPlotsListener.5")).append( fileToBeChecked ).append(" : \n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - JOptionPane.showMessageDialog(frame, Messages.getString("KmlImportService.13")); //$NON-NLS-1$ - - // Move the temporary file to the current project folder - //File finalCsvFile = moveCsvToProjectFolder(convertedCsvFile, kmlFile.getName()); - File finalCsvFile = selectAndSaveToCsv(convertedCsvFile, kmlFile.getName()); + List missingIds = missingPlotDataPerFile.get(fileToBeChecked); + if( missingIds.isEmpty() ){ + missingPlots.append("COMPLETE "); //$NON-NLS-1$ + } - boolean loaded = false; - if( finalCsvFile != null ){ - // Load the plots from the CSV - localPropertiesService.setValue(EarthProperty.SAMPLE_FILE, finalCsvFile.getAbsolutePath()); - loaded = true; + for (String[] missingPlotData : missingIds) { + missingPlots.append( missingPlotData[0] ).append(","); //$NON-NLS-1$ } - return loaded; + missingPlots = missingPlots.delete(missingPlots.length() - 1, missingPlots.length() ).append("\n"); //$NON-NLS-1$ + + } + return missingPlots.toString(); + } + + private CSVReader getCsvReader(String csvFile) throws FileNotFoundException { + CSVReader reader; + final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8)); //$NON-NLS-1$ + reader = new CSVReader(bufferedReader); + return reader; } - private File selectAndSaveToCsv(File convertedCsvFile, String name) throws IOException { - final File[] saveToCsvFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, true, false, "importedFromKml_" + name + ".csv", //$NON-NLS-1$ //$NON-NLS-2$ - localPropertiesService, frame); - if( saveToCsvFile != null && saveToCsvFile.length == 1 ){ - FileUtils.copyFile( convertedCsvFile, saveToCsvFile[0]); - return saveToCsvFile[0]; - }else { - return null; + private List getPlotDataFromFile(String plotCoordinateFile) { + final List plotData = new ArrayList<>(); + try { + final CSVReader plotCsvReader = getCsvReader(plotCoordinateFile); + String[] csvRow; + while ((csvRow = plotCsvReader.readNext()) != null) { + plotData.add(csvRow); + } + } catch (final FileNotFoundException e) { + logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ + } catch (final IOException e) { + logger.error("Error reading CSV line", e); //$NON-NLS-1$ + } catch (CsvValidationException e) { + logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ } + return plotData; } -/* private File moveCsvToProjectFolder(File convertedCsvFile, String originalKmlFilename) throws IOException { - File destination = new File( earthProjectsService.getProjectsFolder() + File.separator + "generatedFromKml_" + originalKmlFilename + ".ced"); - FileUtils.copyFile( convertedCsvFile, destination); - return destination; - }*/ + private String[] getKeys(String[] plotData ) { + List keyAttributeDefinitions = earthSurveyService.getCollectSurvey().getSchema().getRootEntityDefinitions().get(0) + .getKeyAttributeDefinitions(); + String[] keys = new String[keyAttributeDefinitions.size()]; + int i = 0; + for (AttributeDefinition keyAttributeDefinition : keyAttributeDefinitions) { + keys[i] = plotData[i++]; + } + return keys; + } + + public Map> getMissingPlotsByFile(Map> plotDataByFIle, InfiniteProgressMonitor infiniteProgressMonitor) { + final Map> missingPlotIdsByFile = new HashMap<>(); + final Set plotFiles = plotDataByFIle.keySet(); + int i = 0; + for (final String plotFile : plotFiles) { + + infiniteProgressMonitor.updateProgress( ++i, plotFiles.size(), StringUtils.getFilename( StringUtils.cleanPath( plotFile ) ) ); + missingPlotIdsByFile.put(plotFile, new ArrayList()); + + final List plotDataInFile = plotDataByFIle.get(plotFile); + for (final String[] plotData : plotDataInFile) { + + String[] plotKeys = getKeys(plotData); + // If the plot ID is not contained in the DB + // And if the latitude cell (second column) actually contains a number (so it is not a header row) + if (!isIdActivelySavedInDB(plotKeys) && isLatitudeANumber(plotData[ plotKeys.length ]) ) { + missingPlotIdsByFile.get(plotFile).add(plotData); + } + } + } + return missingPlotIdsByFile; + } - private File chooseKmlFile() { - final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults(DataFormat.KML_FILE, false, false, null, - localPropertiesService, frame); + private boolean isLatitudeANumber(String string) { + try{ + Float.parseFloat(string); + return true; + }catch (Exception e){ + return false; + } + } - if( selectedPlotFiles != null && selectedPlotFiles.length == 1 ){ - return selectedPlotFiles[0]; - }else { - return null; + public Map> getPlotDataByFile(File[] selectedPlotFiles) { + final Map> plotDataByFile = new HashMap<>(); + if( selectedPlotFiles != null && selectedPlotFiles.length > 0 ) { + for (final File file : selectedPlotFiles) { + plotDataByFile.put(file.getAbsolutePath(), getPlotDataFromFile(file.getAbsolutePath())); + } } + return plotDataByFile; } + private boolean isIdActivelySavedInDB(String[] plotIds) { + RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey(), EarthConstants.ROOT_ENTITY_NAME); + rf.setKeyValues( Arrays.asList( plotIds )); + final List summaries = recordManager.loadSummaries(rf); + + if( summaries != null && summaries.size() == 1 ){ + CollectRecord record = recordManager.load(earthSurveyService.getCollectSurvey(), summaries.get(0).getId(), Step.ENTRY); + BooleanAttribute node = null; + try { + node = record.findNodeByPath("/plot/"+ EarthConstants.ACTIVELY_SAVED_ATTRIBUTE_NAME); //$NON-NLS-1$ + } catch (Exception e) { + logger.error("No actively_saved information found", e); //$NON-NLS-1$ + } + return (node != null && !node.isEmpty() && node.getValue().getValue() ); + }else{ + return false; + } + } } From 31b594d472869ad067cb9924186edb3681214de1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:21 +0100 Subject: [PATCH 1099/1620] New translations MissingPlotService.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 231 ++++++++++++++++-- 1 file changed, 208 insertions(+), 23 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 8d225e803d..1c73e5c34d 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,42 +1,227 @@ package org.openforis.collect.earth.app.service; +import java.io.BufferedReader; +import java.io.BufferedWriter; import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; +import java.util.Map.Entry; +import java.util.Set; -import org.apache.commons.io.FileUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.app.view.Messages; +import org.openforis.collect.manager.RecordManager; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.CollectRecordSummary; +import org.openforis.collect.model.RecordFilter; +import org.openforis.idm.metamodel.AttributeDefinition; +import org.openforis.idm.model.BooleanAttribute; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +import com.opencsv.CSVReader; +import com.opencsv.exceptions.CsvValidationException; -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ @Component -public class PreloadedFilesService { +public class MissingPlotService { + + @Autowired + private RecordManager recordManager; + + @Autowired + private EarthSurveyService earthSurveyService; + + private final Logger logger = LoggerFactory.getLogger(MissingPlotService.class); + + public File getMissingPlotFile(Map> missingPlotData) { + + File tempFile = null; + try { + tempFile = File.createTempFile("missingPlots", ".csv"); + tempFile.deleteOnExit(); + + try( BufferedWriter fw = new BufferedWriter(new OutputStreamWriter( new FileOutputStream( tempFile ), StandardCharsets.UTF_8 ) ) ){ + Set files = missingPlotData.keySet(); + for (String plotFile : files) { + + List missingPlots = missingPlotData.get(plotFile); + StringBuilder csvRow = new StringBuilder(""); + for (String[] plotData : missingPlots) { + csvRow = new StringBuilder(""); + for (String data : plotData) { - private final Logger logger = LoggerFactory.getLogger(PreloadedFilesService.class); + data = data.replaceAll("\"", "\\\""); - private final Map filesInMemory; - - public PreloadedFilesService() { - filesInMemory = new ConcurrentHashMap<>(); + csvRow.append("\"").append(data).append("\"").append(","); + } + csvRow.delete(csvRow.length()-1, csvRow.length()).append("\n"); + fw.write(csvRow.toString()); + } + } + } + + } catch (IOException e) { + logger.error("Error while producing the CSV with the missing plots" ); + } + + return tempFile; } - - public byte[] getFileContent(File file) { - byte[] fileContents = filesInMemory.get(file.getPath()); - if (fileContents == null) { - byte[] content = new byte[0]; + public String getMissingPlotInformation(Map> allPlotDataInFiles, Map> missingPlotDataPerFile ) { + + String missingPlotsText = getTextMissingPlots( missingPlotDataPerFile ); + + int totalPlots = 0; + int missingPlots = 0; + for (Entry> entry : allPlotDataInFiles.entrySet() ) { + if( entry.getValue()!=null){ + totalPlots += entry.getValue().size(); + missingPlots += missingPlotDataPerFile.get( entry.getKey() ).size(); + } + } + missingPlotsText += "\n\n"+Messages.getString("MissingPlotsListener.10") + totalPlots ; //$NON-NLS-1$ //$NON-NLS-2$ + + if( missingPlots > 0 ){ + missingPlotsText += "\n"+Messages.getString("MissingPlotsListener.12") + missingPlots; //$NON-NLS-1$ //$NON-NLS-2$ + }else{ + missingPlotsText +="\n"+Messages.getString("MissingPlotsListener.14"); //$NON-NLS-1$ //$NON-NLS-2$ + } + return missingPlotsText; + } + + private String getTextMissingPlots(Map> missingPlotDataPerFile) { + StringBuilder missingPlots = new StringBuilder(""); //$NON-NLS-1$ + + Set files = missingPlotDataPerFile.keySet(); + for (String fileToBeChecked : files) { + + missingPlots.append("\n").append(Messages.getString("MissingPlotsListener.5")).append( fileToBeChecked ).append(" : \n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + List missingIds = missingPlotDataPerFile.get(fileToBeChecked); + if( missingIds.isEmpty() ){ + missingPlots.append("COMPLETE "); //$NON-NLS-1$ + } + + for (String[] missingPlotData : missingIds) { + missingPlots.append( missingPlotData[0] ).append(","); //$NON-NLS-1$ + } + + missingPlots = missingPlots.delete(missingPlots.length() - 1, missingPlots.length() ).append("\n"); //$NON-NLS-1$ + + } + return missingPlots.toString(); + } + + private CSVReader getCsvReader(String csvFile) throws FileNotFoundException { + CSVReader reader; + final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8)); //$NON-NLS-1$ + reader = new CSVReader(bufferedReader); + return reader; + } + + + private List getPlotDataFromFile(String plotCoordinateFile) { + final List plotData = new ArrayList<>(); + try { + final CSVReader plotCsvReader = getCsvReader(plotCoordinateFile); + String[] csvRow; + while ((csvRow = plotCsvReader.readNext()) != null) { + plotData.add(csvRow); + } + } catch (final FileNotFoundException e) { + logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ + } catch (final IOException e) { + logger.error("Error reading CSV line", e); //$NON-NLS-1$ + } catch (CsvValidationException e) { + logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ + } + return plotData; + } + + private String[] getKeys(String[] plotData ) { + List keyAttributeDefinitions = earthSurveyService.getCollectSurvey().getSchema().getRootEntityDefinitions().get(0) + .getKeyAttributeDefinitions(); + String[] keys = new String[keyAttributeDefinitions.size()]; + int i = 0; + for (AttributeDefinition keyAttributeDefinition : keyAttributeDefinitions) { + keys[i] = plotData[i++]; + } + return keys; + } + + public Map> getMissingPlotsByFile(Map> plotDataByFIle, InfiniteProgressMonitor infiniteProgressMonitor) { + final Map> missingPlotIdsByFile = new HashMap<>(); + final Set plotFiles = plotDataByFIle.keySet(); + int i = 0; + for (final String plotFile : plotFiles) { + + infiniteProgressMonitor.updateProgress( ++i, plotFiles.size(), StringUtils.getFilename( StringUtils.cleanPath( plotFile ) ) ); + missingPlotIdsByFile.put(plotFile, new ArrayList()); + + final List plotDataInFile = plotDataByFIle.get(plotFile); + for (final String[] plotData : plotDataInFile) { + + String[] plotKeys = getKeys(plotData); + // If the plot ID is not contained in the DB + // And if the latitude cell (second column) actually contains a number (so it is not a header row) + if (!isIdActivelySavedInDB(plotKeys) && isLatitudeANumber(plotData[ plotKeys.length ]) ) { + missingPlotIdsByFile.get(plotFile).add(plotData); + } + } + } + return missingPlotIdsByFile; + } + + private boolean isLatitudeANumber(String string) { + try{ + Float.parseFloat(string); + return true; + }catch (Exception e){ + return false; + } + } + + public Map> getPlotDataByFile(File[] selectedPlotFiles) { + final Map> plotDataByFile = new HashMap<>(); + if( selectedPlotFiles != null && selectedPlotFiles.length > 0 ) { + for (final File file : selectedPlotFiles) { + plotDataByFile.put(file.getAbsolutePath(), getPlotDataFromFile(file.getAbsolutePath())); + } + } + return plotDataByFile; + } + + private boolean isIdActivelySavedInDB(String[] plotIds) { + RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey(), EarthConstants.ROOT_ENTITY_NAME); + rf.setKeyValues( Arrays.asList( plotIds )); + final List summaries = recordManager.loadSummaries(rf); + + if( summaries != null && summaries.size() == 1 ){ + CollectRecord record = recordManager.load(earthSurveyService.getCollectSurvey(), summaries.get(0).getId(), Step.ENTRY); + BooleanAttribute node = null; try { - content = FileUtils.readFileToByteArray(file); - filesInMemory.put(file.getPath(), content); - } catch (IOException e) { - logger.error("Problems while reading the file " + file.getPath() + " was not found.", e); + node = record.findNodeByPath("/plot/"+ EarthConstants.ACTIVELY_SAVED_ATTRIBUTE_NAME); //$NON-NLS-1$ + } catch (Exception e) { + logger.error("No actively_saved information found", e); //$NON-NLS-1$ } - fileContents = content; + return (node != null && !node.isEmpty() && node.getValue().getValue() ); + }else{ + return false; } - return fileContents; } + } From 7923b63985bd3d782c77a420b5cd34ce7e163bd7 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:22 +0100 Subject: [PATCH 1100/1620] New translations MissingPlotService.java (Spanish) --- .../earth/app/view/Messages_es.properties | 231 ++++++++++++++++-- 1 file changed, 208 insertions(+), 23 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 8d225e803d..1c73e5c34d 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,42 +1,227 @@ package org.openforis.collect.earth.app.service; +import java.io.BufferedReader; +import java.io.BufferedWriter; import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; +import java.util.Map.Entry; +import java.util.Set; -import org.apache.commons.io.FileUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.app.view.Messages; +import org.openforis.collect.manager.RecordManager; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.CollectRecordSummary; +import org.openforis.collect.model.RecordFilter; +import org.openforis.idm.metamodel.AttributeDefinition; +import org.openforis.idm.model.BooleanAttribute; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +import com.opencsv.CSVReader; +import com.opencsv.exceptions.CsvValidationException; -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ @Component -public class PreloadedFilesService { +public class MissingPlotService { + + @Autowired + private RecordManager recordManager; + + @Autowired + private EarthSurveyService earthSurveyService; + + private final Logger logger = LoggerFactory.getLogger(MissingPlotService.class); + + public File getMissingPlotFile(Map> missingPlotData) { + + File tempFile = null; + try { + tempFile = File.createTempFile("missingPlots", ".csv"); + tempFile.deleteOnExit(); + + try( BufferedWriter fw = new BufferedWriter(new OutputStreamWriter( new FileOutputStream( tempFile ), StandardCharsets.UTF_8 ) ) ){ + Set files = missingPlotData.keySet(); + for (String plotFile : files) { + + List missingPlots = missingPlotData.get(plotFile); + StringBuilder csvRow = new StringBuilder(""); + for (String[] plotData : missingPlots) { + csvRow = new StringBuilder(""); + for (String data : plotData) { - private final Logger logger = LoggerFactory.getLogger(PreloadedFilesService.class); + data = data.replaceAll("\"", "\\\""); - private final Map filesInMemory; - - public PreloadedFilesService() { - filesInMemory = new ConcurrentHashMap<>(); + csvRow.append("\"").append(data).append("\"").append(","); + } + csvRow.delete(csvRow.length()-1, csvRow.length()).append("\n"); + fw.write(csvRow.toString()); + } + } + } + + } catch (IOException e) { + logger.error("Error while producing the CSV with the missing plots" ); + } + + return tempFile; } - - public byte[] getFileContent(File file) { - byte[] fileContents = filesInMemory.get(file.getPath()); - if (fileContents == null) { - byte[] content = new byte[0]; + public String getMissingPlotInformation(Map> allPlotDataInFiles, Map> missingPlotDataPerFile ) { + + String missingPlotsText = getTextMissingPlots( missingPlotDataPerFile ); + + int totalPlots = 0; + int missingPlots = 0; + for (Entry> entry : allPlotDataInFiles.entrySet() ) { + if( entry.getValue()!=null){ + totalPlots += entry.getValue().size(); + missingPlots += missingPlotDataPerFile.get( entry.getKey() ).size(); + } + } + missingPlotsText += "\n\n"+Messages.getString("MissingPlotsListener.10") + totalPlots ; //$NON-NLS-1$ //$NON-NLS-2$ + + if( missingPlots > 0 ){ + missingPlotsText += "\n"+Messages.getString("MissingPlotsListener.12") + missingPlots; //$NON-NLS-1$ //$NON-NLS-2$ + }else{ + missingPlotsText +="\n"+Messages.getString("MissingPlotsListener.14"); //$NON-NLS-1$ //$NON-NLS-2$ + } + return missingPlotsText; + } + + private String getTextMissingPlots(Map> missingPlotDataPerFile) { + StringBuilder missingPlots = new StringBuilder(""); //$NON-NLS-1$ + + Set files = missingPlotDataPerFile.keySet(); + for (String fileToBeChecked : files) { + + missingPlots.append("\n").append(Messages.getString("MissingPlotsListener.5")).append( fileToBeChecked ).append(" : \n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + List missingIds = missingPlotDataPerFile.get(fileToBeChecked); + if( missingIds.isEmpty() ){ + missingPlots.append("COMPLETE "); //$NON-NLS-1$ + } + + for (String[] missingPlotData : missingIds) { + missingPlots.append( missingPlotData[0] ).append(","); //$NON-NLS-1$ + } + + missingPlots = missingPlots.delete(missingPlots.length() - 1, missingPlots.length() ).append("\n"); //$NON-NLS-1$ + + } + return missingPlots.toString(); + } + + private CSVReader getCsvReader(String csvFile) throws FileNotFoundException { + CSVReader reader; + final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8)); //$NON-NLS-1$ + reader = new CSVReader(bufferedReader); + return reader; + } + + + private List getPlotDataFromFile(String plotCoordinateFile) { + final List plotData = new ArrayList<>(); + try { + final CSVReader plotCsvReader = getCsvReader(plotCoordinateFile); + String[] csvRow; + while ((csvRow = plotCsvReader.readNext()) != null) { + plotData.add(csvRow); + } + } catch (final FileNotFoundException e) { + logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ + } catch (final IOException e) { + logger.error("Error reading CSV line", e); //$NON-NLS-1$ + } catch (CsvValidationException e) { + logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ + } + return plotData; + } + + private String[] getKeys(String[] plotData ) { + List keyAttributeDefinitions = earthSurveyService.getCollectSurvey().getSchema().getRootEntityDefinitions().get(0) + .getKeyAttributeDefinitions(); + String[] keys = new String[keyAttributeDefinitions.size()]; + int i = 0; + for (AttributeDefinition keyAttributeDefinition : keyAttributeDefinitions) { + keys[i] = plotData[i++]; + } + return keys; + } + + public Map> getMissingPlotsByFile(Map> plotDataByFIle, InfiniteProgressMonitor infiniteProgressMonitor) { + final Map> missingPlotIdsByFile = new HashMap<>(); + final Set plotFiles = plotDataByFIle.keySet(); + int i = 0; + for (final String plotFile : plotFiles) { + + infiniteProgressMonitor.updateProgress( ++i, plotFiles.size(), StringUtils.getFilename( StringUtils.cleanPath( plotFile ) ) ); + missingPlotIdsByFile.put(plotFile, new ArrayList()); + + final List plotDataInFile = plotDataByFIle.get(plotFile); + for (final String[] plotData : plotDataInFile) { + + String[] plotKeys = getKeys(plotData); + // If the plot ID is not contained in the DB + // And if the latitude cell (second column) actually contains a number (so it is not a header row) + if (!isIdActivelySavedInDB(plotKeys) && isLatitudeANumber(plotData[ plotKeys.length ]) ) { + missingPlotIdsByFile.get(plotFile).add(plotData); + } + } + } + return missingPlotIdsByFile; + } + + private boolean isLatitudeANumber(String string) { + try{ + Float.parseFloat(string); + return true; + }catch (Exception e){ + return false; + } + } + + public Map> getPlotDataByFile(File[] selectedPlotFiles) { + final Map> plotDataByFile = new HashMap<>(); + if( selectedPlotFiles != null && selectedPlotFiles.length > 0 ) { + for (final File file : selectedPlotFiles) { + plotDataByFile.put(file.getAbsolutePath(), getPlotDataFromFile(file.getAbsolutePath())); + } + } + return plotDataByFile; + } + + private boolean isIdActivelySavedInDB(String[] plotIds) { + RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey(), EarthConstants.ROOT_ENTITY_NAME); + rf.setKeyValues( Arrays.asList( plotIds )); + final List summaries = recordManager.loadSummaries(rf); + + if( summaries != null && summaries.size() == 1 ){ + CollectRecord record = recordManager.load(earthSurveyService.getCollectSurvey(), summaries.get(0).getId(), Step.ENTRY); + BooleanAttribute node = null; try { - content = FileUtils.readFileToByteArray(file); - filesInMemory.put(file.getPath(), content); - } catch (IOException e) { - logger.error("Problems while reading the file " + file.getPath() + " was not found.", e); + node = record.findNodeByPath("/plot/"+ EarthConstants.ACTIVELY_SAVED_ATTRIBUTE_NAME); //$NON-NLS-1$ + } catch (Exception e) { + logger.error("No actively_saved information found", e); //$NON-NLS-1$ } - fileContents = content; + return (node != null && !node.isEmpty() && node.getValue().getValue() ); + }else{ + return false; } - return fileContents; } + } From b873f053220b54bacb300b5a2a4e090875e3f69a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:23 +0100 Subject: [PATCH 1101/1620] New translations MissingPlotService.java (French) --- .../earth/app/view/Messages_fr.properties | 231 ++++++++++++++++-- 1 file changed, 208 insertions(+), 23 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 8d225e803d..1c73e5c34d 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,42 +1,227 @@ package org.openforis.collect.earth.app.service; +import java.io.BufferedReader; +import java.io.BufferedWriter; import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; +import java.util.Map.Entry; +import java.util.Set; -import org.apache.commons.io.FileUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.app.view.Messages; +import org.openforis.collect.manager.RecordManager; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.CollectRecordSummary; +import org.openforis.collect.model.RecordFilter; +import org.openforis.idm.metamodel.AttributeDefinition; +import org.openforis.idm.model.BooleanAttribute; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +import com.opencsv.CSVReader; +import com.opencsv.exceptions.CsvValidationException; -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ @Component -public class PreloadedFilesService { +public class MissingPlotService { + + @Autowired + private RecordManager recordManager; + + @Autowired + private EarthSurveyService earthSurveyService; + + private final Logger logger = LoggerFactory.getLogger(MissingPlotService.class); + + public File getMissingPlotFile(Map> missingPlotData) { + + File tempFile = null; + try { + tempFile = File.createTempFile("missingPlots", ".csv"); + tempFile.deleteOnExit(); + + try( BufferedWriter fw = new BufferedWriter(new OutputStreamWriter( new FileOutputStream( tempFile ), StandardCharsets.UTF_8 ) ) ){ + Set files = missingPlotData.keySet(); + for (String plotFile : files) { + + List missingPlots = missingPlotData.get(plotFile); + StringBuilder csvRow = new StringBuilder(""); + for (String[] plotData : missingPlots) { + csvRow = new StringBuilder(""); + for (String data : plotData) { - private final Logger logger = LoggerFactory.getLogger(PreloadedFilesService.class); + data = data.replaceAll("\"", "\\\""); - private final Map filesInMemory; - - public PreloadedFilesService() { - filesInMemory = new ConcurrentHashMap<>(); + csvRow.append("\"").append(data).append("\"").append(","); + } + csvRow.delete(csvRow.length()-1, csvRow.length()).append("\n"); + fw.write(csvRow.toString()); + } + } + } + + } catch (IOException e) { + logger.error("Error while producing the CSV with the missing plots" ); + } + + return tempFile; } - - public byte[] getFileContent(File file) { - byte[] fileContents = filesInMemory.get(file.getPath()); - if (fileContents == null) { - byte[] content = new byte[0]; + public String getMissingPlotInformation(Map> allPlotDataInFiles, Map> missingPlotDataPerFile ) { + + String missingPlotsText = getTextMissingPlots( missingPlotDataPerFile ); + + int totalPlots = 0; + int missingPlots = 0; + for (Entry> entry : allPlotDataInFiles.entrySet() ) { + if( entry.getValue()!=null){ + totalPlots += entry.getValue().size(); + missingPlots += missingPlotDataPerFile.get( entry.getKey() ).size(); + } + } + missingPlotsText += "\n\n"+Messages.getString("MissingPlotsListener.10") + totalPlots ; //$NON-NLS-1$ //$NON-NLS-2$ + + if( missingPlots > 0 ){ + missingPlotsText += "\n"+Messages.getString("MissingPlotsListener.12") + missingPlots; //$NON-NLS-1$ //$NON-NLS-2$ + }else{ + missingPlotsText +="\n"+Messages.getString("MissingPlotsListener.14"); //$NON-NLS-1$ //$NON-NLS-2$ + } + return missingPlotsText; + } + + private String getTextMissingPlots(Map> missingPlotDataPerFile) { + StringBuilder missingPlots = new StringBuilder(""); //$NON-NLS-1$ + + Set files = missingPlotDataPerFile.keySet(); + for (String fileToBeChecked : files) { + + missingPlots.append("\n").append(Messages.getString("MissingPlotsListener.5")).append( fileToBeChecked ).append(" : \n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + List missingIds = missingPlotDataPerFile.get(fileToBeChecked); + if( missingIds.isEmpty() ){ + missingPlots.append("COMPLETE "); //$NON-NLS-1$ + } + + for (String[] missingPlotData : missingIds) { + missingPlots.append( missingPlotData[0] ).append(","); //$NON-NLS-1$ + } + + missingPlots = missingPlots.delete(missingPlots.length() - 1, missingPlots.length() ).append("\n"); //$NON-NLS-1$ + + } + return missingPlots.toString(); + } + + private CSVReader getCsvReader(String csvFile) throws FileNotFoundException { + CSVReader reader; + final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8)); //$NON-NLS-1$ + reader = new CSVReader(bufferedReader); + return reader; + } + + + private List getPlotDataFromFile(String plotCoordinateFile) { + final List plotData = new ArrayList<>(); + try { + final CSVReader plotCsvReader = getCsvReader(plotCoordinateFile); + String[] csvRow; + while ((csvRow = plotCsvReader.readNext()) != null) { + plotData.add(csvRow); + } + } catch (final FileNotFoundException e) { + logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ + } catch (final IOException e) { + logger.error("Error reading CSV line", e); //$NON-NLS-1$ + } catch (CsvValidationException e) { + logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ + } + return plotData; + } + + private String[] getKeys(String[] plotData ) { + List keyAttributeDefinitions = earthSurveyService.getCollectSurvey().getSchema().getRootEntityDefinitions().get(0) + .getKeyAttributeDefinitions(); + String[] keys = new String[keyAttributeDefinitions.size()]; + int i = 0; + for (AttributeDefinition keyAttributeDefinition : keyAttributeDefinitions) { + keys[i] = plotData[i++]; + } + return keys; + } + + public Map> getMissingPlotsByFile(Map> plotDataByFIle, InfiniteProgressMonitor infiniteProgressMonitor) { + final Map> missingPlotIdsByFile = new HashMap<>(); + final Set plotFiles = plotDataByFIle.keySet(); + int i = 0; + for (final String plotFile : plotFiles) { + + infiniteProgressMonitor.updateProgress( ++i, plotFiles.size(), StringUtils.getFilename( StringUtils.cleanPath( plotFile ) ) ); + missingPlotIdsByFile.put(plotFile, new ArrayList()); + + final List plotDataInFile = plotDataByFIle.get(plotFile); + for (final String[] plotData : plotDataInFile) { + + String[] plotKeys = getKeys(plotData); + // If the plot ID is not contained in the DB + // And if the latitude cell (second column) actually contains a number (so it is not a header row) + if (!isIdActivelySavedInDB(plotKeys) && isLatitudeANumber(plotData[ plotKeys.length ]) ) { + missingPlotIdsByFile.get(plotFile).add(plotData); + } + } + } + return missingPlotIdsByFile; + } + + private boolean isLatitudeANumber(String string) { + try{ + Float.parseFloat(string); + return true; + }catch (Exception e){ + return false; + } + } + + public Map> getPlotDataByFile(File[] selectedPlotFiles) { + final Map> plotDataByFile = new HashMap<>(); + if( selectedPlotFiles != null && selectedPlotFiles.length > 0 ) { + for (final File file : selectedPlotFiles) { + plotDataByFile.put(file.getAbsolutePath(), getPlotDataFromFile(file.getAbsolutePath())); + } + } + return plotDataByFile; + } + + private boolean isIdActivelySavedInDB(String[] plotIds) { + RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey(), EarthConstants.ROOT_ENTITY_NAME); + rf.setKeyValues( Arrays.asList( plotIds )); + final List summaries = recordManager.loadSummaries(rf); + + if( summaries != null && summaries.size() == 1 ){ + CollectRecord record = recordManager.load(earthSurveyService.getCollectSurvey(), summaries.get(0).getId(), Step.ENTRY); + BooleanAttribute node = null; try { - content = FileUtils.readFileToByteArray(file); - filesInMemory.put(file.getPath(), content); - } catch (IOException e) { - logger.error("Problems while reading the file " + file.getPath() + " was not found.", e); + node = record.findNodeByPath("/plot/"+ EarthConstants.ACTIVELY_SAVED_ATTRIBUTE_NAME); //$NON-NLS-1$ + } catch (Exception e) { + logger.error("No actively_saved information found", e); //$NON-NLS-1$ } - fileContents = content; + return (node != null && !node.isEmpty() && node.getValue().getValue() ); + }else{ + return false; } - return fileContents; } + } From 45cd56bcd16c6b4822b141b36853a596e900f837 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:24 +0100 Subject: [PATCH 1102/1620] New translations IPCCGeneratorService.java (English) --- .../earth/app/view/Messages_en.properties | 256 +++++------------- 1 file changed, 67 insertions(+), 189 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 1c73e5c34d..c1b9c5db00 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,227 +1,105 @@ package org.openforis.collect.earth.app.service; -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStreamWriter; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - -import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.app.view.Messages; -import org.openforis.collect.manager.RecordManager; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.CollectRecordSummary; -import org.openforis.collect.model.RecordFilter; -import org.openforis.idm.metamodel.AttributeDefinition; -import org.openforis.idm.model.BooleanAttribute; +import org.openforis.collect.earth.ipcc.IPCCGenerator; +import org.openforis.collect.earth.ipcc.IPCCGeneratorException; +import org.openforis.collect.earth.ipcc.RdbExportException; +import org.openforis.collect.model.CollectSurvey; +import org.openforis.collect.relational.CollectRDBPublisher; +import org.openforis.collect.relational.CollectRdbException; +import org.openforis.idm.metamodel.NodeDefinition; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.springframework.util.StringUtils; - -import com.opencsv.CSVReader; -import com.opencsv.exceptions.CsvValidationException; @Component -public class MissingPlotService { +public class IPCCGeneratorService extends GenerateDatabase{ @Autowired - private RecordManager recordManager; + RDBExporter rdbExporter; + + @Autowired + CollectRDBPublisher collectRDBPublisher; @Autowired - private EarthSurveyService earthSurveyService; + EarthSurveyService earthSurveyService; - private final Logger logger = LoggerFactory.getLogger(MissingPlotService.class); + @Autowired + public LocalPropertiesService localPropertiesService; - public File getMissingPlotFile(Map> missingPlotData) { + @Autowired + BrowserService browserService; - File tempFile = null; - try { - tempFile = File.createTempFile("missingPlots", ".csv"); - tempFile.deleteOnExit(); + @Autowired + private IPCCGenerator ipccGenerator; + + final Logger logger = LoggerFactory.getLogger(IPCCGeneratorService.class); - try( BufferedWriter fw = new BufferedWriter(new OutputStreamWriter( new FileOutputStream( tempFile ), StandardCharsets.UTF_8 ) ) ){ - Set files = missingPlotData.keySet(); - for (String plotFile : files) { + public void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws RdbExportException { - List missingPlots = missingPlotData.get(plotFile); - StringBuilder csvRow = new StringBuilder(""); - for (String[] plotData : missingPlots) { - csvRow = new StringBuilder(""); - for (String data : plotData) { + try { - data = data.replaceAll("\"", "\\\""); + try { - csvRow.append("\"").append(data).append("\"").append(","); - } - csvRow.delete(csvRow.length()-1, csvRow.length()).append("\n"); - fw.write(csvRow.toString()); + if ( + (localPropertiesService.isUsingSqliteDB() && !getZippedProjectDB( ExportType.IPCC ).exists()) + || + isRefreshDatabase() + ) { + + // The user clicked on the option to refresh the database, or there is no + // previous copy of the Saiku DB + // Generate the DB file + ipccGenerator.generateRDB( earthSurveyService.getCollectSurvey(), progressListener); + + try { + // Save the DB file in a zipped file to extends GenerateDatabase keep for the next usages + replaceZippedProjectDB( ExportType.IPCC ); + } catch (Exception e) { + logger.error("Error while refreshing the Zipped content of the project IPCC DB", e); } - } - } - - } catch (IOException e) { - logger.error("Error while producing the CSV with the missing plots" ); - } - - return tempFile; - } - public String getMissingPlotInformation(Map> allPlotDataInFiles, Map> missingPlotDataPerFile ) { - - String missingPlotsText = getTextMissingPlots( missingPlotDataPerFile ); - - int totalPlots = 0; - int missingPlots = 0; - for (Entry> entry : allPlotDataInFiles.entrySet() ) { - if( entry.getValue()!=null){ - totalPlots += entry.getValue().size(); - missingPlots += missingPlotDataPerFile.get( entry.getKey() ).size(); - } - } - missingPlotsText += "\n\n"+Messages.getString("MissingPlotsListener.10") + totalPlots ; //$NON-NLS-1$ //$NON-NLS-2$ - - if( missingPlots > 0 ){ - missingPlotsText += "\n"+Messages.getString("MissingPlotsListener.12") + missingPlots; //$NON-NLS-1$ //$NON-NLS-2$ - }else{ - missingPlotsText +="\n"+Messages.getString("MissingPlotsListener.14"); //$NON-NLS-1$ //$NON-NLS-2$ - } - return missingPlotsText; - } - - private String getTextMissingPlots(Map> missingPlotDataPerFile) { - StringBuilder missingPlots = new StringBuilder(""); //$NON-NLS-1$ - - Set files = missingPlotDataPerFile.keySet(); - for (String fileToBeChecked : files) { - missingPlots.append("\n").append(Messages.getString("MissingPlotsListener.5")).append( fileToBeChecked ).append(" : \n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - - List missingIds = missingPlotDataPerFile.get(fileToBeChecked); - if( missingIds.isEmpty() ){ - missingPlots.append("COMPLETE "); //$NON-NLS-1$ - } - - for (String[] missingPlotData : missingIds) { - missingPlots.append( missingPlotData[0] ).append(","); //$NON-NLS-1$ - } + } else if (getZippedProjectDB(ExportType.IPCC).exists()) { + // If the zipped version of the project exists ( and the user clicked on the + // option to not refresh it) then restore this last version of the data + if (localPropertiesService.isUsingSqliteDB()) { + restoreZippedProjectDB(ExportType.IPCC); + } + } + + ipccGenerator.produceOutputs( earthSurveyService.getCollectSurvey(), progressListener ); - missingPlots = missingPlots.delete(missingPlots.length() - 1, missingPlots.length() ).append("\n"); //$NON-NLS-1$ + } catch (final IPCCGeneratorException e) { + logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ + } + } catch (final CollectRdbException e) { + logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ } - return missingPlots.toString(); } - private CSVReader getCsvReader(String csvFile) throws FileNotFoundException { - CSVReader reader; - final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8)); //$NON-NLS-1$ - reader = new CSVReader(bufferedReader); - return reader; - } - private List getPlotDataFromFile(String plotCoordinateFile) { - final List plotData = new ArrayList<>(); - try { - final CSVReader plotCsvReader = getCsvReader(plotCoordinateFile); - String[] csvRow; - while ((csvRow = plotCsvReader.readNext()) != null) { - plotData.add(csvRow); - } - } catch (final FileNotFoundException e) { - logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ - } catch (final IOException e) { - logger.error("Error reading CSV line", e); //$NON-NLS-1$ - } catch (CsvValidationException e) { - logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ - } - return plotData; + public static boolean surveyContains(String nodeName, CollectSurvey survey) { + NodeDefinition nodeDefForNAme = survey.getSchema().findNodeDefinition( nodeDef -> nodeDef.getName().equals(nodeName) ); + return nodeDefForNAme != null; } - private String[] getKeys(String[] plotData ) { - List keyAttributeDefinitions = earthSurveyService.getCollectSurvey().getSchema().getRootEntityDefinitions().get(0) - .getKeyAttributeDefinitions(); - String[] keys = new String[keyAttributeDefinitions.size()]; - int i = 0; - for (AttributeDefinition keyAttributeDefinition : keyAttributeDefinitions) { - keys[i] = plotData[i++]; - } - return keys; - } - - public Map> getMissingPlotsByFile(Map> plotDataByFIle, InfiniteProgressMonitor infiniteProgressMonitor) { - final Map> missingPlotIdsByFile = new HashMap<>(); - final Set plotFiles = plotDataByFIle.keySet(); - int i = 0; - for (final String plotFile : plotFiles) { - - infiniteProgressMonitor.updateProgress( ++i, plotFiles.size(), StringUtils.getFilename( StringUtils.cleanPath( plotFile ) ) ); - missingPlotIdsByFile.put(plotFile, new ArrayList()); - final List plotDataInFile = plotDataByFIle.get(plotFile); - for (final String[] plotData : plotDataInFile) { - - String[] plotKeys = getKeys(plotData); - // If the plot ID is not contained in the DB - // And if the latitude cell (second column) actually contains a number (so it is not a header row) - if (!isIdActivelySavedInDB(plotKeys) && isLatitudeANumber(plotData[ plotKeys.length ]) ) { - missingPlotIdsByFile.get(plotFile).add(plotData); - } - } - } - return missingPlotIdsByFile; - } - - private boolean isLatitudeANumber(String string) { - try{ - Float.parseFloat(string); - return true; - }catch (Exception e){ - return false; - } + @Override + public LocalPropertiesService getLocalPropertiesService() { + return localPropertiesService; } - public Map> getPlotDataByFile(File[] selectedPlotFiles) { - final Map> plotDataByFile = new HashMap<>(); - if( selectedPlotFiles != null && selectedPlotFiles.length > 0 ) { - for (final File file : selectedPlotFiles) { - plotDataByFile.put(file.getAbsolutePath(), getPlotDataFromFile(file.getAbsolutePath())); - } - } - return plotDataByFile; + @Override + public EarthSurveyService getEarthSurveyService() { + return earthSurveyService; } - private boolean isIdActivelySavedInDB(String[] plotIds) { - RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey(), EarthConstants.ROOT_ENTITY_NAME); - rf.setKeyValues( Arrays.asList( plotIds )); - final List summaries = recordManager.loadSummaries(rf); - - if( summaries != null && summaries.size() == 1 ){ - CollectRecord record = recordManager.load(earthSurveyService.getCollectSurvey(), summaries.get(0).getId(), Step.ENTRY); - BooleanAttribute node = null; - try { - node = record.findNodeByPath("/plot/"+ EarthConstants.ACTIVELY_SAVED_ATTRIBUTE_NAME); //$NON-NLS-1$ - } catch (Exception e) { - logger.error("No actively_saved information found", e); //$NON-NLS-1$ - } - return (node != null && !node.isEmpty() && node.getValue().getValue() ); - }else{ - return false; - } + @Override + public RDBExporter getRdbExporter() { + return rdbExporter; } -} +} \ No newline at end of file From e57659b779d0acd64503751d4fb0606432fe57ca Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:25 +0100 Subject: [PATCH 1103/1620] New translations KmlImportService.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 348 +++++++++--------- 1 file changed, 172 insertions(+), 176 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 1c73e5c34d..9fb3d5284e 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,227 +1,223 @@ package org.openforis.collect.earth.app.service; -import java.io.BufferedReader; +import java.io.BufferedInputStream; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.FileOutputStream; +import java.io.FileReader; import java.io.IOException; -import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; -import java.util.List; import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.xml.XMLConstants; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import org.apache.commons.io.FileUtils; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.app.view.DataFormat; +import org.openforis.collect.earth.app.view.JFileChooserExistsAware; import org.openforis.collect.earth.app.view.Messages; -import org.openforis.collect.manager.RecordManager; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.CollectRecordSummary; -import org.openforis.collect.model.RecordFilter; -import org.openforis.idm.metamodel.AttributeDefinition; -import org.openforis.idm.model.BooleanAttribute; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; +import org.openforis.collect.io.metadata.collectearth.CollectEarthProjectFileCreator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.springframework.util.StringUtils; - -import com.opencsv.CSVReader; -import com.opencsv.exceptions.CsvValidationException; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; @Component -public class MissingPlotService { +public class KmlImportService { - @Autowired - private RecordManager recordManager; + Map namesAndTimes = new HashMap<>(); @Autowired - private EarthSurveyService earthSurveyService; - - private final Logger logger = LoggerFactory.getLogger(MissingPlotService.class); - - public File getMissingPlotFile(Map> missingPlotData) { - - File tempFile = null; - try { - tempFile = File.createTempFile("missingPlots", ".csv"); - tempFile.deleteOnExit(); + LocalPropertiesService localPropertiesService; - try( BufferedWriter fw = new BufferedWriter(new OutputStreamWriter( new FileOutputStream( tempFile ), StandardCharsets.UTF_8 ) ) ){ - Set files = missingPlotData.keySet(); - for (String plotFile : files) { - - List missingPlots = missingPlotData.get(plotFile); - StringBuilder csvRow = new StringBuilder(""); - for (String[] plotData : missingPlots) { - csvRow = new StringBuilder(""); - for (String data : plotData) { - - data = data.replaceAll("\"", "\\\""); - - csvRow.append("\"").append(data).append("\"").append(","); - } - csvRow.delete(csvRow.length()-1, csvRow.length()).append("\n"); - fw.write(csvRow.toString()); - } - } - } + @Autowired + EarthProjectsService earthProjectsService; - } catch (IOException e) { - logger.error("Error while producing the CSV with the missing plots" ); + @Autowired + EarthSurveyService earthSurveyService; + + private JFrame frame; + + /* + * + + one + + -5.89991123135449 + 41.60459478540565 + 0 + -1.425202537313517e-006 + 0 + 177418.783783632 + relativeToSeaFloor + + #m_ylw-pushpin + + 1 + -5.899911231354489,41.60459478540565,0 + + + * + * + */ + + private File createTempCsv( File kmlFile) throws ParserConfigurationException, SAXException, IOException{ + + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); // Compliant + factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); // compliant + DocumentBuilder builder = factory.newDocumentBuilder(); + InputSource is = new InputSource(new FileReader(kmlFile)); + Document doc = builder.parse(is); + + NodeList placemarks = doc.getElementsByTagName("Placemark"); //$NON-NLS-1$ + + StringBuilder sb = new StringBuilder(); + + sb.append( CollectEarthProjectFileCreator.PLACEHOLDER_ID_COLUMNS_HEADER ).append(",").append( "YCoordinate" ).append(",").append( "XCoordinate" ).append(CollectEarthProjectFileCreator.PLACEHOLDER_FOR_EXTRA_COLUMNS_HEADER).append( "\r\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + + for (int i = 0; i < placemarks.getLength(); i++) { + Node placemark = placemarks.item(i); + + if (placemark.hasChildNodes()) { + NodeList childNodes = placemark.getChildNodes(); + String longitude = "",latitude = "",name = "Placemark"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + name = "placemark" + i; + for (int j=0; j> allPlotDataInFiles, Map> missingPlotDataPerFile ) { - - String missingPlotsText = getTextMissingPlots( missingPlotDataPerFile ); - int totalPlots = 0; - int missingPlots = 0; - for (Entry> entry : allPlotDataInFiles.entrySet() ) { - if( entry.getValue()!=null){ - totalPlots += entry.getValue().size(); - missingPlots += missingPlotDataPerFile.get( entry.getKey() ).size(); + public String processPoint(Node placemarkChild) { + NodeList lookAtNodes = placemarkChild.getChildNodes(); + String coordinates = null; + for (int h=0; h 0 ){ - missingPlotsText += "\n"+Messages.getString("MissingPlotsListener.12") + missingPlots; //$NON-NLS-1$ //$NON-NLS-2$ - }else{ - missingPlotsText +="\n"+Messages.getString("MissingPlotsListener.14"); //$NON-NLS-1$ //$NON-NLS-2$ - } - return missingPlotsText; + return coordinates; } - private String getTextMissingPlots(Map> missingPlotDataPerFile) { - StringBuilder missingPlots = new StringBuilder(""); //$NON-NLS-1$ - - Set files = missingPlotDataPerFile.keySet(); - for (String fileToBeChecked : files) { - - missingPlots.append("\n").append(Messages.getString("MissingPlotsListener.5")).append( fileToBeChecked ).append(" : \n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + public boolean prompToOpenKml( JFrame frame) throws ParserConfigurationException, SAXException, IOException{ + this.frame = frame; + // Choose the file in the file system + File kmlFile = chooseKmlFile(); + boolean kmlImported = false; + if( kmlFile != null ){ + kmlImported = loadFromKml(frame, kmlFile); + } - List missingIds = missingPlotDataPerFile.get(fileToBeChecked); - if( missingIds.isEmpty() ){ - missingPlots.append("COMPLETE "); //$NON-NLS-1$ - } + return kmlImported; + } - for (String[] missingPlotData : missingIds) { - missingPlots.append( missingPlotData[0] ).append(","); //$NON-NLS-1$ - } - missingPlots = missingPlots.delete(missingPlots.length() - 1, missingPlots.length() ).append("\n"); //$NON-NLS-1$ + public boolean loadFromKml( JFrame frame, File kmlFile) throws ParserConfigurationException, SAXException, IOException{ - } - return missingPlots.toString(); - } + // Convert the KML into a CSV and save it into a temporary file + File convertedCsvFile = createTempCsv( kmlFile ); - private CSVReader getCsvReader(String csvFile) throws FileNotFoundException { - CSVReader reader; - final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8)); //$NON-NLS-1$ - reader = new CSVReader(bufferedReader); - return reader; - } + JOptionPane.showMessageDialog(frame, Messages.getString("KmlImportService.13")); //$NON-NLS-1$ + // Move the temporary file to the current project folder + //File finalCsvFile = moveCsvToProjectFolder(convertedCsvFile, kmlFile.getName()); + File finalCsvFile = selectAndSaveToCsv(convertedCsvFile, kmlFile.getName()); - private List getPlotDataFromFile(String plotCoordinateFile) { - final List plotData = new ArrayList<>(); - try { - final CSVReader plotCsvReader = getCsvReader(plotCoordinateFile); - String[] csvRow; - while ((csvRow = plotCsvReader.readNext()) != null) { - plotData.add(csvRow); + boolean loaded = false; + if( finalCsvFile != null ){ + // Load the plots from the CSV + localPropertiesService.setValue(EarthProperty.SAMPLE_FILE, finalCsvFile.getAbsolutePath()); + loaded = true; } - } catch (final FileNotFoundException e) { - logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ - } catch (final IOException e) { - logger.error("Error reading CSV line", e); //$NON-NLS-1$ - } catch (CsvValidationException e) { - logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ - } - return plotData; - } - private String[] getKeys(String[] plotData ) { - List keyAttributeDefinitions = earthSurveyService.getCollectSurvey().getSchema().getRootEntityDefinitions().get(0) - .getKeyAttributeDefinitions(); - String[] keys = new String[keyAttributeDefinitions.size()]; - int i = 0; - for (AttributeDefinition keyAttributeDefinition : keyAttributeDefinitions) { - keys[i] = plotData[i++]; - } - return keys; + return loaded; } - public Map> getMissingPlotsByFile(Map> plotDataByFIle, InfiniteProgressMonitor infiniteProgressMonitor) { - final Map> missingPlotIdsByFile = new HashMap<>(); - final Set plotFiles = plotDataByFIle.keySet(); - int i = 0; - for (final String plotFile : plotFiles) { - - infiniteProgressMonitor.updateProgress( ++i, plotFiles.size(), StringUtils.getFilename( StringUtils.cleanPath( plotFile ) ) ); - missingPlotIdsByFile.put(plotFile, new ArrayList()); + private File selectAndSaveToCsv(File convertedCsvFile, String name) throws IOException { + final File[] saveToCsvFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, true, false, "importedFromKml_" + name + ".csv", //$NON-NLS-1$ //$NON-NLS-2$ + localPropertiesService, frame); - final List plotDataInFile = plotDataByFIle.get(plotFile); - for (final String[] plotData : plotDataInFile) { - - String[] plotKeys = getKeys(plotData); - // If the plot ID is not contained in the DB - // And if the latitude cell (second column) actually contains a number (so it is not a header row) - if (!isIdActivelySavedInDB(plotKeys) && isLatitudeANumber(plotData[ plotKeys.length ]) ) { - missingPlotIdsByFile.get(plotFile).add(plotData); - } - } + if( saveToCsvFile != null && saveToCsvFile.length == 1 ){ + FileUtils.copyFile( convertedCsvFile, saveToCsvFile[0]); + return saveToCsvFile[0]; + }else { + return null; } - return missingPlotIdsByFile; } - private boolean isLatitudeANumber(String string) { - try{ - Float.parseFloat(string); - return true; - }catch (Exception e){ - return false; - } - } +/* private File moveCsvToProjectFolder(File convertedCsvFile, String originalKmlFilename) throws IOException { + File destination = new File( earthProjectsService.getProjectsFolder() + File.separator + "generatedFromKml_" + originalKmlFilename + ".ced"); + FileUtils.copyFile( convertedCsvFile, destination); + return destination; + }*/ - public Map> getPlotDataByFile(File[] selectedPlotFiles) { - final Map> plotDataByFile = new HashMap<>(); - if( selectedPlotFiles != null && selectedPlotFiles.length > 0 ) { - for (final File file : selectedPlotFiles) { - plotDataByFile.put(file.getAbsolutePath(), getPlotDataFromFile(file.getAbsolutePath())); - } - } - return plotDataByFile; - } + private File chooseKmlFile() { + final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults(DataFormat.KML_FILE, false, false, null, + localPropertiesService, frame); - private boolean isIdActivelySavedInDB(String[] plotIds) { - RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey(), EarthConstants.ROOT_ENTITY_NAME); - rf.setKeyValues( Arrays.asList( plotIds )); - final List summaries = recordManager.loadSummaries(rf); - - if( summaries != null && summaries.size() == 1 ){ - CollectRecord record = recordManager.load(earthSurveyService.getCollectSurvey(), summaries.get(0).getId(), Step.ENTRY); - BooleanAttribute node = null; - try { - node = record.findNodeByPath("/plot/"+ EarthConstants.ACTIVELY_SAVED_ATTRIBUTE_NAME); //$NON-NLS-1$ - } catch (Exception e) { - logger.error("No actively_saved information found", e); //$NON-NLS-1$ - } - return (node != null && !node.isEmpty() && node.getValue().getValue() ); - }else{ - return false; + if( selectedPlotFiles != null && selectedPlotFiles.length == 1 ){ + return selectedPlotFiles[0]; + }else { + return null; } } + } From 2c4c53a0098a51677f3523152d39a5db9ff7ba0f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:27 +0100 Subject: [PATCH 1104/1620] New translations KmlImportService.java (Spanish) --- .../earth/app/view/Messages_es.properties | 348 +++++++++--------- 1 file changed, 172 insertions(+), 176 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 1c73e5c34d..9fb3d5284e 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,227 +1,223 @@ package org.openforis.collect.earth.app.service; -import java.io.BufferedReader; +import java.io.BufferedInputStream; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.FileOutputStream; +import java.io.FileReader; import java.io.IOException; -import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; -import java.util.List; import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.xml.XMLConstants; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import org.apache.commons.io.FileUtils; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.app.view.DataFormat; +import org.openforis.collect.earth.app.view.JFileChooserExistsAware; import org.openforis.collect.earth.app.view.Messages; -import org.openforis.collect.manager.RecordManager; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.CollectRecordSummary; -import org.openforis.collect.model.RecordFilter; -import org.openforis.idm.metamodel.AttributeDefinition; -import org.openforis.idm.model.BooleanAttribute; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; +import org.openforis.collect.io.metadata.collectearth.CollectEarthProjectFileCreator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.springframework.util.StringUtils; - -import com.opencsv.CSVReader; -import com.opencsv.exceptions.CsvValidationException; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; @Component -public class MissingPlotService { +public class KmlImportService { - @Autowired - private RecordManager recordManager; + Map namesAndTimes = new HashMap<>(); @Autowired - private EarthSurveyService earthSurveyService; - - private final Logger logger = LoggerFactory.getLogger(MissingPlotService.class); - - public File getMissingPlotFile(Map> missingPlotData) { - - File tempFile = null; - try { - tempFile = File.createTempFile("missingPlots", ".csv"); - tempFile.deleteOnExit(); + LocalPropertiesService localPropertiesService; - try( BufferedWriter fw = new BufferedWriter(new OutputStreamWriter( new FileOutputStream( tempFile ), StandardCharsets.UTF_8 ) ) ){ - Set files = missingPlotData.keySet(); - for (String plotFile : files) { - - List missingPlots = missingPlotData.get(plotFile); - StringBuilder csvRow = new StringBuilder(""); - for (String[] plotData : missingPlots) { - csvRow = new StringBuilder(""); - for (String data : plotData) { - - data = data.replaceAll("\"", "\\\""); - - csvRow.append("\"").append(data).append("\"").append(","); - } - csvRow.delete(csvRow.length()-1, csvRow.length()).append("\n"); - fw.write(csvRow.toString()); - } - } - } + @Autowired + EarthProjectsService earthProjectsService; - } catch (IOException e) { - logger.error("Error while producing the CSV with the missing plots" ); + @Autowired + EarthSurveyService earthSurveyService; + + private JFrame frame; + + /* + * + + one + + -5.89991123135449 + 41.60459478540565 + 0 + -1.425202537313517e-006 + 0 + 177418.783783632 + relativeToSeaFloor + + #m_ylw-pushpin + + 1 + -5.899911231354489,41.60459478540565,0 + + + * + * + */ + + private File createTempCsv( File kmlFile) throws ParserConfigurationException, SAXException, IOException{ + + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); // Compliant + factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); // compliant + DocumentBuilder builder = factory.newDocumentBuilder(); + InputSource is = new InputSource(new FileReader(kmlFile)); + Document doc = builder.parse(is); + + NodeList placemarks = doc.getElementsByTagName("Placemark"); //$NON-NLS-1$ + + StringBuilder sb = new StringBuilder(); + + sb.append( CollectEarthProjectFileCreator.PLACEHOLDER_ID_COLUMNS_HEADER ).append(",").append( "YCoordinate" ).append(",").append( "XCoordinate" ).append(CollectEarthProjectFileCreator.PLACEHOLDER_FOR_EXTRA_COLUMNS_HEADER).append( "\r\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + + for (int i = 0; i < placemarks.getLength(); i++) { + Node placemark = placemarks.item(i); + + if (placemark.hasChildNodes()) { + NodeList childNodes = placemark.getChildNodes(); + String longitude = "",latitude = "",name = "Placemark"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + name = "placemark" + i; + for (int j=0; j> allPlotDataInFiles, Map> missingPlotDataPerFile ) { - - String missingPlotsText = getTextMissingPlots( missingPlotDataPerFile ); - int totalPlots = 0; - int missingPlots = 0; - for (Entry> entry : allPlotDataInFiles.entrySet() ) { - if( entry.getValue()!=null){ - totalPlots += entry.getValue().size(); - missingPlots += missingPlotDataPerFile.get( entry.getKey() ).size(); + public String processPoint(Node placemarkChild) { + NodeList lookAtNodes = placemarkChild.getChildNodes(); + String coordinates = null; + for (int h=0; h 0 ){ - missingPlotsText += "\n"+Messages.getString("MissingPlotsListener.12") + missingPlots; //$NON-NLS-1$ //$NON-NLS-2$ - }else{ - missingPlotsText +="\n"+Messages.getString("MissingPlotsListener.14"); //$NON-NLS-1$ //$NON-NLS-2$ - } - return missingPlotsText; + return coordinates; } - private String getTextMissingPlots(Map> missingPlotDataPerFile) { - StringBuilder missingPlots = new StringBuilder(""); //$NON-NLS-1$ - - Set files = missingPlotDataPerFile.keySet(); - for (String fileToBeChecked : files) { - - missingPlots.append("\n").append(Messages.getString("MissingPlotsListener.5")).append( fileToBeChecked ).append(" : \n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + public boolean prompToOpenKml( JFrame frame) throws ParserConfigurationException, SAXException, IOException{ + this.frame = frame; + // Choose the file in the file system + File kmlFile = chooseKmlFile(); + boolean kmlImported = false; + if( kmlFile != null ){ + kmlImported = loadFromKml(frame, kmlFile); + } - List missingIds = missingPlotDataPerFile.get(fileToBeChecked); - if( missingIds.isEmpty() ){ - missingPlots.append("COMPLETE "); //$NON-NLS-1$ - } + return kmlImported; + } - for (String[] missingPlotData : missingIds) { - missingPlots.append( missingPlotData[0] ).append(","); //$NON-NLS-1$ - } - missingPlots = missingPlots.delete(missingPlots.length() - 1, missingPlots.length() ).append("\n"); //$NON-NLS-1$ + public boolean loadFromKml( JFrame frame, File kmlFile) throws ParserConfigurationException, SAXException, IOException{ - } - return missingPlots.toString(); - } + // Convert the KML into a CSV and save it into a temporary file + File convertedCsvFile = createTempCsv( kmlFile ); - private CSVReader getCsvReader(String csvFile) throws FileNotFoundException { - CSVReader reader; - final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8)); //$NON-NLS-1$ - reader = new CSVReader(bufferedReader); - return reader; - } + JOptionPane.showMessageDialog(frame, Messages.getString("KmlImportService.13")); //$NON-NLS-1$ + // Move the temporary file to the current project folder + //File finalCsvFile = moveCsvToProjectFolder(convertedCsvFile, kmlFile.getName()); + File finalCsvFile = selectAndSaveToCsv(convertedCsvFile, kmlFile.getName()); - private List getPlotDataFromFile(String plotCoordinateFile) { - final List plotData = new ArrayList<>(); - try { - final CSVReader plotCsvReader = getCsvReader(plotCoordinateFile); - String[] csvRow; - while ((csvRow = plotCsvReader.readNext()) != null) { - plotData.add(csvRow); + boolean loaded = false; + if( finalCsvFile != null ){ + // Load the plots from the CSV + localPropertiesService.setValue(EarthProperty.SAMPLE_FILE, finalCsvFile.getAbsolutePath()); + loaded = true; } - } catch (final FileNotFoundException e) { - logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ - } catch (final IOException e) { - logger.error("Error reading CSV line", e); //$NON-NLS-1$ - } catch (CsvValidationException e) { - logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ - } - return plotData; - } - private String[] getKeys(String[] plotData ) { - List keyAttributeDefinitions = earthSurveyService.getCollectSurvey().getSchema().getRootEntityDefinitions().get(0) - .getKeyAttributeDefinitions(); - String[] keys = new String[keyAttributeDefinitions.size()]; - int i = 0; - for (AttributeDefinition keyAttributeDefinition : keyAttributeDefinitions) { - keys[i] = plotData[i++]; - } - return keys; + return loaded; } - public Map> getMissingPlotsByFile(Map> plotDataByFIle, InfiniteProgressMonitor infiniteProgressMonitor) { - final Map> missingPlotIdsByFile = new HashMap<>(); - final Set plotFiles = plotDataByFIle.keySet(); - int i = 0; - for (final String plotFile : plotFiles) { - - infiniteProgressMonitor.updateProgress( ++i, plotFiles.size(), StringUtils.getFilename( StringUtils.cleanPath( plotFile ) ) ); - missingPlotIdsByFile.put(plotFile, new ArrayList()); + private File selectAndSaveToCsv(File convertedCsvFile, String name) throws IOException { + final File[] saveToCsvFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, true, false, "importedFromKml_" + name + ".csv", //$NON-NLS-1$ //$NON-NLS-2$ + localPropertiesService, frame); - final List plotDataInFile = plotDataByFIle.get(plotFile); - for (final String[] plotData : plotDataInFile) { - - String[] plotKeys = getKeys(plotData); - // If the plot ID is not contained in the DB - // And if the latitude cell (second column) actually contains a number (so it is not a header row) - if (!isIdActivelySavedInDB(plotKeys) && isLatitudeANumber(plotData[ plotKeys.length ]) ) { - missingPlotIdsByFile.get(plotFile).add(plotData); - } - } + if( saveToCsvFile != null && saveToCsvFile.length == 1 ){ + FileUtils.copyFile( convertedCsvFile, saveToCsvFile[0]); + return saveToCsvFile[0]; + }else { + return null; } - return missingPlotIdsByFile; } - private boolean isLatitudeANumber(String string) { - try{ - Float.parseFloat(string); - return true; - }catch (Exception e){ - return false; - } - } +/* private File moveCsvToProjectFolder(File convertedCsvFile, String originalKmlFilename) throws IOException { + File destination = new File( earthProjectsService.getProjectsFolder() + File.separator + "generatedFromKml_" + originalKmlFilename + ".ced"); + FileUtils.copyFile( convertedCsvFile, destination); + return destination; + }*/ - public Map> getPlotDataByFile(File[] selectedPlotFiles) { - final Map> plotDataByFile = new HashMap<>(); - if( selectedPlotFiles != null && selectedPlotFiles.length > 0 ) { - for (final File file : selectedPlotFiles) { - plotDataByFile.put(file.getAbsolutePath(), getPlotDataFromFile(file.getAbsolutePath())); - } - } - return plotDataByFile; - } + private File chooseKmlFile() { + final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults(DataFormat.KML_FILE, false, false, null, + localPropertiesService, frame); - private boolean isIdActivelySavedInDB(String[] plotIds) { - RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey(), EarthConstants.ROOT_ENTITY_NAME); - rf.setKeyValues( Arrays.asList( plotIds )); - final List summaries = recordManager.loadSummaries(rf); - - if( summaries != null && summaries.size() == 1 ){ - CollectRecord record = recordManager.load(earthSurveyService.getCollectSurvey(), summaries.get(0).getId(), Step.ENTRY); - BooleanAttribute node = null; - try { - node = record.findNodeByPath("/plot/"+ EarthConstants.ACTIVELY_SAVED_ATTRIBUTE_NAME); //$NON-NLS-1$ - } catch (Exception e) { - logger.error("No actively_saved information found", e); //$NON-NLS-1$ - } - return (node != null && !node.isEmpty() && node.getValue().getValue() ); - }else{ - return false; + if( selectedPlotFiles != null && selectedPlotFiles.length == 1 ){ + return selectedPlotFiles[0]; + }else { + return null; } } + } From fc7b2c85cd73ca91c6ce883440929c0fa82632c6 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:28 +0100 Subject: [PATCH 1105/1620] New translations KmlImportService.java (French) --- .../earth/app/view/Messages_fr.properties | 348 +++++++++--------- 1 file changed, 172 insertions(+), 176 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 1c73e5c34d..9fb3d5284e 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,227 +1,223 @@ package org.openforis.collect.earth.app.service; -import java.io.BufferedReader; +import java.io.BufferedInputStream; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.FileOutputStream; +import java.io.FileReader; import java.io.IOException; -import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; -import java.util.List; import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.xml.XMLConstants; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import org.apache.commons.io.FileUtils; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.app.view.DataFormat; +import org.openforis.collect.earth.app.view.JFileChooserExistsAware; import org.openforis.collect.earth.app.view.Messages; -import org.openforis.collect.manager.RecordManager; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.CollectRecordSummary; -import org.openforis.collect.model.RecordFilter; -import org.openforis.idm.metamodel.AttributeDefinition; -import org.openforis.idm.model.BooleanAttribute; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; +import org.openforis.collect.io.metadata.collectearth.CollectEarthProjectFileCreator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.springframework.util.StringUtils; - -import com.opencsv.CSVReader; -import com.opencsv.exceptions.CsvValidationException; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; @Component -public class MissingPlotService { +public class KmlImportService { - @Autowired - private RecordManager recordManager; + Map namesAndTimes = new HashMap<>(); @Autowired - private EarthSurveyService earthSurveyService; - - private final Logger logger = LoggerFactory.getLogger(MissingPlotService.class); - - public File getMissingPlotFile(Map> missingPlotData) { - - File tempFile = null; - try { - tempFile = File.createTempFile("missingPlots", ".csv"); - tempFile.deleteOnExit(); + LocalPropertiesService localPropertiesService; - try( BufferedWriter fw = new BufferedWriter(new OutputStreamWriter( new FileOutputStream( tempFile ), StandardCharsets.UTF_8 ) ) ){ - Set files = missingPlotData.keySet(); - for (String plotFile : files) { - - List missingPlots = missingPlotData.get(plotFile); - StringBuilder csvRow = new StringBuilder(""); - for (String[] plotData : missingPlots) { - csvRow = new StringBuilder(""); - for (String data : plotData) { - - data = data.replaceAll("\"", "\\\""); - - csvRow.append("\"").append(data).append("\"").append(","); - } - csvRow.delete(csvRow.length()-1, csvRow.length()).append("\n"); - fw.write(csvRow.toString()); - } - } - } + @Autowired + EarthProjectsService earthProjectsService; - } catch (IOException e) { - logger.error("Error while producing the CSV with the missing plots" ); + @Autowired + EarthSurveyService earthSurveyService; + + private JFrame frame; + + /* + * + + one + + -5.89991123135449 + 41.60459478540565 + 0 + -1.425202537313517e-006 + 0 + 177418.783783632 + relativeToSeaFloor + + #m_ylw-pushpin + + 1 + -5.899911231354489,41.60459478540565,0 + + + * + * + */ + + private File createTempCsv( File kmlFile) throws ParserConfigurationException, SAXException, IOException{ + + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); // Compliant + factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); // compliant + DocumentBuilder builder = factory.newDocumentBuilder(); + InputSource is = new InputSource(new FileReader(kmlFile)); + Document doc = builder.parse(is); + + NodeList placemarks = doc.getElementsByTagName("Placemark"); //$NON-NLS-1$ + + StringBuilder sb = new StringBuilder(); + + sb.append( CollectEarthProjectFileCreator.PLACEHOLDER_ID_COLUMNS_HEADER ).append(",").append( "YCoordinate" ).append(",").append( "XCoordinate" ).append(CollectEarthProjectFileCreator.PLACEHOLDER_FOR_EXTRA_COLUMNS_HEADER).append( "\r\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + + for (int i = 0; i < placemarks.getLength(); i++) { + Node placemark = placemarks.item(i); + + if (placemark.hasChildNodes()) { + NodeList childNodes = placemark.getChildNodes(); + String longitude = "",latitude = "",name = "Placemark"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + name = "placemark" + i; + for (int j=0; j> allPlotDataInFiles, Map> missingPlotDataPerFile ) { - - String missingPlotsText = getTextMissingPlots( missingPlotDataPerFile ); - int totalPlots = 0; - int missingPlots = 0; - for (Entry> entry : allPlotDataInFiles.entrySet() ) { - if( entry.getValue()!=null){ - totalPlots += entry.getValue().size(); - missingPlots += missingPlotDataPerFile.get( entry.getKey() ).size(); + public String processPoint(Node placemarkChild) { + NodeList lookAtNodes = placemarkChild.getChildNodes(); + String coordinates = null; + for (int h=0; h 0 ){ - missingPlotsText += "\n"+Messages.getString("MissingPlotsListener.12") + missingPlots; //$NON-NLS-1$ //$NON-NLS-2$ - }else{ - missingPlotsText +="\n"+Messages.getString("MissingPlotsListener.14"); //$NON-NLS-1$ //$NON-NLS-2$ - } - return missingPlotsText; + return coordinates; } - private String getTextMissingPlots(Map> missingPlotDataPerFile) { - StringBuilder missingPlots = new StringBuilder(""); //$NON-NLS-1$ - - Set files = missingPlotDataPerFile.keySet(); - for (String fileToBeChecked : files) { - - missingPlots.append("\n").append(Messages.getString("MissingPlotsListener.5")).append( fileToBeChecked ).append(" : \n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + public boolean prompToOpenKml( JFrame frame) throws ParserConfigurationException, SAXException, IOException{ + this.frame = frame; + // Choose the file in the file system + File kmlFile = chooseKmlFile(); + boolean kmlImported = false; + if( kmlFile != null ){ + kmlImported = loadFromKml(frame, kmlFile); + } - List missingIds = missingPlotDataPerFile.get(fileToBeChecked); - if( missingIds.isEmpty() ){ - missingPlots.append("COMPLETE "); //$NON-NLS-1$ - } + return kmlImported; + } - for (String[] missingPlotData : missingIds) { - missingPlots.append( missingPlotData[0] ).append(","); //$NON-NLS-1$ - } - missingPlots = missingPlots.delete(missingPlots.length() - 1, missingPlots.length() ).append("\n"); //$NON-NLS-1$ + public boolean loadFromKml( JFrame frame, File kmlFile) throws ParserConfigurationException, SAXException, IOException{ - } - return missingPlots.toString(); - } + // Convert the KML into a CSV and save it into a temporary file + File convertedCsvFile = createTempCsv( kmlFile ); - private CSVReader getCsvReader(String csvFile) throws FileNotFoundException { - CSVReader reader; - final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8)); //$NON-NLS-1$ - reader = new CSVReader(bufferedReader); - return reader; - } + JOptionPane.showMessageDialog(frame, Messages.getString("KmlImportService.13")); //$NON-NLS-1$ + // Move the temporary file to the current project folder + //File finalCsvFile = moveCsvToProjectFolder(convertedCsvFile, kmlFile.getName()); + File finalCsvFile = selectAndSaveToCsv(convertedCsvFile, kmlFile.getName()); - private List getPlotDataFromFile(String plotCoordinateFile) { - final List plotData = new ArrayList<>(); - try { - final CSVReader plotCsvReader = getCsvReader(plotCoordinateFile); - String[] csvRow; - while ((csvRow = plotCsvReader.readNext()) != null) { - plotData.add(csvRow); + boolean loaded = false; + if( finalCsvFile != null ){ + // Load the plots from the CSV + localPropertiesService.setValue(EarthProperty.SAMPLE_FILE, finalCsvFile.getAbsolutePath()); + loaded = true; } - } catch (final FileNotFoundException e) { - logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ - } catch (final IOException e) { - logger.error("Error reading CSV line", e); //$NON-NLS-1$ - } catch (CsvValidationException e) { - logger.error("Error reading coordinate file " + plotCoordinateFile, e); //$NON-NLS-1$ - } - return plotData; - } - private String[] getKeys(String[] plotData ) { - List keyAttributeDefinitions = earthSurveyService.getCollectSurvey().getSchema().getRootEntityDefinitions().get(0) - .getKeyAttributeDefinitions(); - String[] keys = new String[keyAttributeDefinitions.size()]; - int i = 0; - for (AttributeDefinition keyAttributeDefinition : keyAttributeDefinitions) { - keys[i] = plotData[i++]; - } - return keys; + return loaded; } - public Map> getMissingPlotsByFile(Map> plotDataByFIle, InfiniteProgressMonitor infiniteProgressMonitor) { - final Map> missingPlotIdsByFile = new HashMap<>(); - final Set plotFiles = plotDataByFIle.keySet(); - int i = 0; - for (final String plotFile : plotFiles) { - - infiniteProgressMonitor.updateProgress( ++i, plotFiles.size(), StringUtils.getFilename( StringUtils.cleanPath( plotFile ) ) ); - missingPlotIdsByFile.put(plotFile, new ArrayList()); + private File selectAndSaveToCsv(File convertedCsvFile, String name) throws IOException { + final File[] saveToCsvFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, true, false, "importedFromKml_" + name + ".csv", //$NON-NLS-1$ //$NON-NLS-2$ + localPropertiesService, frame); - final List plotDataInFile = plotDataByFIle.get(plotFile); - for (final String[] plotData : plotDataInFile) { - - String[] plotKeys = getKeys(plotData); - // If the plot ID is not contained in the DB - // And if the latitude cell (second column) actually contains a number (so it is not a header row) - if (!isIdActivelySavedInDB(plotKeys) && isLatitudeANumber(plotData[ plotKeys.length ]) ) { - missingPlotIdsByFile.get(plotFile).add(plotData); - } - } + if( saveToCsvFile != null && saveToCsvFile.length == 1 ){ + FileUtils.copyFile( convertedCsvFile, saveToCsvFile[0]); + return saveToCsvFile[0]; + }else { + return null; } - return missingPlotIdsByFile; } - private boolean isLatitudeANumber(String string) { - try{ - Float.parseFloat(string); - return true; - }catch (Exception e){ - return false; - } - } +/* private File moveCsvToProjectFolder(File convertedCsvFile, String originalKmlFilename) throws IOException { + File destination = new File( earthProjectsService.getProjectsFolder() + File.separator + "generatedFromKml_" + originalKmlFilename + ".ced"); + FileUtils.copyFile( convertedCsvFile, destination); + return destination; + }*/ - public Map> getPlotDataByFile(File[] selectedPlotFiles) { - final Map> plotDataByFile = new HashMap<>(); - if( selectedPlotFiles != null && selectedPlotFiles.length > 0 ) { - for (final File file : selectedPlotFiles) { - plotDataByFile.put(file.getAbsolutePath(), getPlotDataFromFile(file.getAbsolutePath())); - } - } - return plotDataByFile; - } + private File chooseKmlFile() { + final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults(DataFormat.KML_FILE, false, false, null, + localPropertiesService, frame); - private boolean isIdActivelySavedInDB(String[] plotIds) { - RecordFilter rf = new RecordFilter(earthSurveyService.getCollectSurvey(), EarthConstants.ROOT_ENTITY_NAME); - rf.setKeyValues( Arrays.asList( plotIds )); - final List summaries = recordManager.loadSummaries(rf); - - if( summaries != null && summaries.size() == 1 ){ - CollectRecord record = recordManager.load(earthSurveyService.getCollectSurvey(), summaries.get(0).getId(), Step.ENTRY); - BooleanAttribute node = null; - try { - node = record.findNodeByPath("/plot/"+ EarthConstants.ACTIVELY_SAVED_ATTRIBUTE_NAME); //$NON-NLS-1$ - } catch (Exception e) { - logger.error("No actively_saved information found", e); //$NON-NLS-1$ - } - return (node != null && !node.isEmpty() && node.getValue().getValue() ); - }else{ - return false; + if( selectedPlotFiles != null && selectedPlotFiles.length == 1 ){ + return selectedPlotFiles[0]; + }else { + return null; } } + } From d988eb823b51cc4db085f515d7b6c21dd1822ffc Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:29 +0100 Subject: [PATCH 1106/1620] New translations KmlGeneratorService.java (English) --- .../earth/app/view/Messages_en.properties | 482 +++++++++++++++--- 1 file changed, 414 insertions(+), 68 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index c1b9c5db00..884dd929bc 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,105 +1,451 @@ package org.openforis.collect.earth.app.service; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.ipcc.IPCCGenerator; -import org.openforis.collect.earth.ipcc.IPCCGeneratorException; -import org.openforis.collect.earth.ipcc.RdbExportException; -import org.openforis.collect.model.CollectSurvey; -import org.openforis.collect.relational.CollectRDBPublisher; -import org.openforis.collect.relational.CollectRdbException; -import org.openforis.idm.metamodel.NodeDefinition; +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.app.view.Messages; +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.collect.earth.sampler.processor.CircleKmlGenerator; +import org.openforis.collect.earth.sampler.processor.HexagonKmlGenerator; +import org.openforis.collect.earth.sampler.processor.KmlGenerator; +import org.openforis.collect.earth.sampler.processor.KmzGenerator; +import org.openforis.collect.earth.sampler.processor.NfiFourCirclesGenerator; +import org.openforis.collect.earth.sampler.processor.NfiThreeCirclesGenerator; +import org.openforis.collect.earth.sampler.processor.NfmaKmlGenerator; +import org.openforis.collect.earth.sampler.processor.PolygonGeojsonGenerator; +import org.openforis.collect.earth.sampler.processor.PolygonKmlGenerator; +import org.openforis.collect.earth.sampler.processor.PolygonWktGenerator; +import org.openforis.collect.earth.sampler.processor.SquareKmlGenerator; +import org.openforis.collect.earth.sampler.processor.SquareWithCirclesKmlGenerator; +import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; +import org.openforis.collect.earth.sampler.utils.KmlGenerationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import com.opencsv.CSVReader; +import com.opencsv.exceptions.CsvValidationException; + +import freemarker.template.TemplateException; + @Component -public class IPCCGeneratorService extends GenerateDatabase{ +public class KmlGeneratorService { @Autowired - RDBExporter rdbExporter; - - @Autowired - CollectRDBPublisher collectRDBPublisher; + LocalPropertiesService localPropertiesService; @Autowired EarthSurveyService earthSurveyService; - @Autowired - public LocalPropertiesService localPropertiesService; + Logger logger = LoggerFactory.getLogger(KmlGeneratorService.class); - @Autowired - BrowserService browserService; + public static final String KML_RESULTING_TEMP_FILE = EarthConstants.GENERATED_FOLDER + File.separator + "plots.kml"; //$NON-NLS-1$ + public static final String KMZ_FILE_PATH = EarthConstants.GENERATED_FOLDER + File.separator + "gePlugin.kmz"; //$NON-NLS-1$ + public static final String KML_NETWORK_LINK_TEMPLATE = "resources/loadApp.fmt"; //$NON-NLS-1$ + public static final String KML_NETWORK_LINK_STARTER = EarthConstants.GENERATED_FOLDER + "/loadApp.kml"; //$NON-NLS-1$ - @Autowired - private IPCCGenerator ipccGenerator; - - final Logger logger = LoggerFactory.getLogger(IPCCGeneratorService.class); + public static interface PolygonTest{ + Boolean isPolygon(String[] strColumns); + } + + public void generateKmlFile() throws IOException, KmlGenerationException, CsvValidationException{ + checkFilesExist(); + generatePlacemarksKmzFile(); + + } + + private void checkFilesExist() throws KmlGenerationException { + + fixUserDirectory(); + + final String csvFilePath = getLocalProperties().getCsvFile(); + final String balloonPath = getLocalProperties().getBalloonFile(); + final String templatePath = getLocalProperties().getTemplateFile(); + boolean filesExist = true; + String errorMessage = "Error generating the KML file for Google Earth.
"; //$NON-NLS-1$ + File csvFile = null; + File balloon = null; + File template = null; + try { + csvFile = new File(csvFilePath); + balloon = new File(balloonPath); + template = new File(templatePath); + } catch (final Exception e) { + logger.error("One of the definition files is not defined", e); //$NON-NLS-1$ + } + if (csvFile != null && !csvFile.exists()) { + errorMessage += Messages.getString("EarthApp.21") //$NON-NLS-1$ + + csvFile.getAbsolutePath() + "


"; //$NON-NLS-1$ + filesExist = false; + } else if (csvFile == null) { + errorMessage += Messages.getString("EarthApp.23"); //$NON-NLS-1$ + filesExist = false; + } + + if (template != null && !template.exists()) { + errorMessage += Messages.getString("EarthApp.24") //$NON-NLS-1$ + + template.getAbsolutePath() + "


"; //$NON-NLS-1$ + filesExist = false; + } else if (template == null) { + errorMessage += Messages.getString("EarthApp.26"); //$NON-NLS-1$ + filesExist = false; + } + + if (balloon != null && !balloon.exists()) { + errorMessage += Messages.getString("EarthApp.27") + balloon.getAbsolutePath() //$NON-NLS-1$ + + "


"; //$NON-NLS-1$ + filesExist = false; + } else if (balloon == null) { + errorMessage += Messages.getString("EarthApp.29"); //$NON-NLS-1$ + filesExist = false; + } + + errorMessage += Messages.getString("EarthApp.30"); //$NON-NLS-1$ + + if( !filesExist ){ + throw new KmlGenerationException(errorMessage); + } + } + + private LocalPropertiesService getLocalProperties() { + return localPropertiesService; + } + + private void copyContentsToGeneratedFolder(String folderToInclude) throws IOException { + final File sourceDir = new File(folderToInclude); + final File targetDir = new File(EarthConstants.GENERATED_FOLDER + File.separator + sourceDir.getName()); + FileUtils.copyDirectory(sourceDir, targetDir); + } + + private void fixUserDirectory() { + final String csvFilePath = getLocalProperties().getCsvFile(); + final String balloonPath = getLocalProperties().getBalloonFile(); + final String templatePath = getLocalProperties().getTemplateFile(); + final String metadataPath = getLocalProperties().getImdFile(); + + File csvFile = null; + File balloon = null; + File template = null; + File idmFile = null; + try { + csvFile = new File(csvFilePath); + balloon = new File(balloonPath); + template = new File(templatePath); + idmFile = new File(metadataPath); + + final String prefixUserFolder = FolderFinder.getCollectEarthDataFolder() + File.separator; + + if (!csvFile.exists()) { + final File otherFile = new File(prefixUserFolder + getLocalProperties().getCsvFile()); + if (otherFile.exists()) { + getLocalProperties().setValue(EarthProperty.SAMPLE_FILE, otherFile.getAbsolutePath()); + } + } + + if (!balloon.exists()) { + final File otherFile = new File(prefixUserFolder + getLocalProperties().getBalloonFile()); + if (otherFile.exists()) { + getLocalProperties().setValue(EarthProperty.BALLOON_TEMPLATE_KEY, otherFile.getAbsolutePath()); + } + } + + if (!template.exists()) { + final File otherFile = new File(prefixUserFolder + getLocalProperties().getTemplateFile()); + if (otherFile.exists()) { + getLocalProperties().setValue(EarthProperty.KML_TEMPLATE_KEY, otherFile.getAbsolutePath()); + } + } + + if (!idmFile.exists()) { + final File otherFile = new File(prefixUserFolder + getLocalProperties().getImdFile()); + if (otherFile.exists()) { + getLocalProperties().setValue(EarthProperty.METADATA_FILE, otherFile.getAbsolutePath()); + } + } + + } catch (final Exception e) { + logger.error("One of the definition files is not defined", e); //$NON-NLS-1$ + } + + } + + + private int parseInt( String intNumber ){ + int i = 0; + try{ + if( StringUtils.isNoneBlank( intNumber ) ) { + i = Integer.parseInt( intNumber ); + } + }catch(Exception e){ + logger.error( "Error parsing integer number" ); + } + return i; + } + + public KmlGenerator getKmlGenerator() throws KmlGenerationException, CsvValidationException { + KmlGenerator generateKml =null; + + final String crsSystem = getLocalProperties().getCrs(); + final Integer innerPointSide = parseInt(getLocalProperties().getValue(EarthProperty.INNER_SUBPLOT_SIDE)); + final Integer largeCentralPlotSide = parseInt(getLocalProperties().getValue(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)); + final String distanceToBuffers = getLocalProperties().getValue(EarthProperty.DISTANCE_TO_BUFFERS); + SAMPLE_SHAPE plotShape = getLocalProperties().getSampleShape(); + final String hostAddress = ServerController.getHostAddress(getLocalProperties().getHost(), getLocalProperties().getPort()); + + final float distanceBetweenSamplePoints; + final float distanceToPlotBoundaries; + String dBSP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS); + try { + distanceBetweenSamplePoints = Float.parseFloat(dBSP); + } catch (Exception e) { + logger.error("Error parsing distance between sample points , wrong value : " + dBSP,e); + EarthApp.showMessage("Attention: Check earth.properties file. The distance between sample points must be a number! You have set it to : " + dBSP); //$NON-NLS-1$ + return null; + } - public void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws RdbExportException { + String dToPlotB = getLocalProperties().getValue(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES); try { + distanceToPlotBoundaries = Float.parseFloat(dToPlotB); + } catch (Exception e) { + logger.error("Error parsing distance between plots , wrong value : " + dToPlotB,e); + EarthApp.showMessage("Attention: Check earth.properties file. The distance between sample point and border of the plot must be a number ! You have set it to : " + dToPlotB); //$NON-NLS-1$ + return null; + } + final String localPort = getLocalProperties().getLocalPort(); + final String numberOfSamplingPlots = getLocalProperties().getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT); + final String csvFile = getLocalProperties().getCsvFile(); + + int numberOfPoints = 25; + if ((numberOfSamplingPlots != null) && (numberOfSamplingPlots.trim().length() > 0)) { + numberOfPoints = parseInt(numberOfSamplingPlots.trim()); + } + + try{ + // If there is a polygon column then the type of plot shape is assumed to be POLYGON + if( csvContainsKml(csvFile)){ + plotShape = SAMPLE_SHAPE.KML_POLYGON; + }else if( csvContainsWkt(csvFile)){ + plotShape = SAMPLE_SHAPE.WKT_POLYGON; + }else if( csvContainsGeoJson(csvFile)){ + plotShape = SAMPLE_SHAPE.GEOJSON_POLYGON; + } + + if (plotShape.equals(SAMPLE_SHAPE.CIRCLE)) { + generateKml = new CircleKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, distanceBetweenSamplePoints ); + } else if (plotShape.equals(SAMPLE_SHAPE.NFMA)) { + generateKml = new NfmaKmlGenerator(crsSystem, hostAddress, localPort, 150, false); + } else if (plotShape.equals(SAMPLE_SHAPE.NFMA_250)) { + generateKml = new NfmaKmlGenerator(crsSystem, hostAddress, localPort, 250, true); + } else if (plotShape.equals(SAMPLE_SHAPE.NFI_THREE_CIRCLES)) { + + String dBP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS ); + float distanceBetweenPlots; + try { + distanceBetweenPlots = Float.parseFloat(dBP); + } catch (Exception e) { + logger.error("Error parsing distance between plots , wrong value : " + dBP,e); + EarthApp.showMessage("Attention: Check earth.properties file. The distance between plots must be a number! You have set it to : " + dBP); //$NON-NLS-1$ + return null; + } + + generateKml = new NfiThreeCirclesGenerator(crsSystem, hostAddress, localPort, innerPointSide, distanceBetweenSamplePoints, distanceBetweenPlots ); + }else if (plotShape.equals(SAMPLE_SHAPE.NFI_FOUR_CIRCLES)) { - try { - - if ( - (localPropertiesService.isUsingSqliteDB() && !getZippedProjectDB( ExportType.IPCC ).exists()) - || - isRefreshDatabase() - ) { - - // The user clicked on the option to refresh the database, or there is no - // previous copy of the Saiku DB - // Generate the DB file - ipccGenerator.generateRDB( earthSurveyService.getCollectSurvey(), progressListener); - - try { - // Save the DB file in a zipped file to extends GenerateDatabase keep for the next usages - replaceZippedProjectDB( ExportType.IPCC ); - } catch (Exception e) { - logger.error("Error while refreshing the Zipped content of the project IPCC DB", e); - } - - } else if (getZippedProjectDB(ExportType.IPCC).exists()) { - // If the zipped version of the project exists ( and the user clicked on the - // option to not refresh it) then restore this last version of the data - if (localPropertiesService.isUsingSqliteDB()) { - restoreZippedProjectDB(ExportType.IPCC); - } + String dBP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS ); + float distanceBetweenPlots; + try { + distanceBetweenPlots = Float.parseFloat(dBP); + } catch (Exception e) { + logger.error(String.format("Error parsing distance between plots , wrong value : %s", dBP) ,e); + EarthApp.showMessage("Attention: Check earth.properties file. The distance between plots must be a number! You have set it to : " + dBP); //$NON-NLS-1$ + return null; } - - ipccGenerator.produceOutputs( earthSurveyService.getCollectSurvey(), progressListener ); - } catch (final IPCCGeneratorException e) { - logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ - } + generateKml = new NfiFourCirclesGenerator(crsSystem, hostAddress, localPort, innerPointSide, distanceBetweenSamplePoints, distanceBetweenPlots ); + }else if (plotShape.equals(SAMPLE_SHAPE.HEXAGON)) { + generateKml = new HexagonKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, distanceBetweenSamplePoints ); + } else if (plotShape.equals(SAMPLE_SHAPE.SQUARE_CIRCLE)) { + generateKml = new SquareWithCirclesKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, + distanceBetweenSamplePoints, distanceToPlotBoundaries); + } else if (plotShape.equals(SAMPLE_SHAPE.KML_POLYGON)) { + generateKml = new PolygonKmlGenerator(crsSystem, hostAddress, localPort); + } else if (plotShape.equals(SAMPLE_SHAPE.GEOJSON_POLYGON)) { + generateKml = new PolygonGeojsonGenerator(crsSystem, hostAddress, localPort); + }else if (plotShape.equals(SAMPLE_SHAPE.WKT_POLYGON)) { + generateKml = new PolygonWktGenerator(crsSystem, hostAddress, localPort); + }else { + generateKml = new SquareKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, + distanceBetweenSamplePoints, distanceToPlotBoundaries, largeCentralPlotSide, distanceToBuffers); + } + }catch(IOException e){ + logger.error("Error generating KML", e ); + } - } catch (final CollectRdbException e) { - logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ + if( generateKml == null ) { + throw new KmlGenerationException("Error getting the KML generator for parameters " + plotShape.name() ); } + + return generateKml; } + private boolean csvContains(String csvFile, PolygonTest test ) throws IOException, CsvValidationException { + try( CSVReader csvReader = CsvReaderUtils.getCsvReader(csvFile) ){ + csvReader.readNext(); // Ignore it might be the column headers - public static boolean surveyContains(String nodeName, CollectSurvey survey) { - NodeDefinition nodeDefForNAme = survey.getSchema().findNodeDefinition( nodeDef -> nodeDef.getName().equals(nodeName) ); - return nodeDefForNAme != null; + String[] secondLine = csvReader.readNext(); + if( secondLine != null && !CsvReaderUtils.onlyEmptyCells(secondLine) ){ + return test.isPolygon( secondLine ); + } + + return false; + } } + private boolean csvContainsGeoJson(String csvFile) throws IOException, CsvValidationException { + return + csvContains( + csvFile, + csvColumns -> new PolygonGeojsonGenerator(null, null, null ).isGeoJsonPolygonColumnFound(csvColumns) != null + ); + } + + private boolean csvContainsWkt(String csvFile) throws IOException, CsvValidationException { + return csvContains( + csvFile, + csvColumns -> new PolygonWktGenerator(null, null, null ).isWktPolygonColumnFound(csvColumns) != null + ); + } + + private boolean csvContainsKml(String csvFile) throws IOException, CsvValidationException { + return csvContains( + csvFile, + csvColumns -> new PolygonKmlGenerator(null, null, null ).isKmlPolygonColumnFound(csvColumns) != null + ); + } + + private void generateKml() throws KmlGenerationException, IOException, CsvValidationException { + + KmlGenerator kmlGenerator = null; + kmlGenerator = getKmlGenerator(); + + if ( kmlGenerator == null ){ + throw new KmlGenerationException("Error while generating KML"); + } + + final String csvFile = getLocalProperties().getCsvFile(); + String balloon = getLocalProperties().getBalloonFile(); + final String template = getLocalProperties().getTemplateFile(); + + // In case the user sets up the OPEN_BALLOON_IN_FIREFOX flag to + // true. Meaning that a small ballon opens in the placemark which in + // its turn + // opens a firefox browser with the real form + final Boolean openBalloonInFirefox = Boolean.valueOf(getLocalProperties().getValue(EarthProperty.OPEN_BALLOON_IN_BROWSER)); + if (Boolean.TRUE.equals( openBalloonInFirefox) ) { + String alternativeBalloon = getLocalProperties().getValue(EarthProperty.ALTERNATIVE_BALLOON_FOR_BROWSER); + if( !StringUtils.isBlank( alternativeBalloon ) ){ + balloon = alternativeBalloon; + } + } + + // Using all of the files that compose the final KML it is generated and stores in KML_RESULTING_TEMP_FILE + kmlGenerator.generateKmlFile(KML_RESULTING_TEMP_FILE, csvFile, balloon, template, earthSurveyService.getCollectSurvey()); + updateFilesUsedChecksum(); - @Override - public LocalPropertiesService getLocalPropertiesService() { - return localPropertiesService; } - @Override - public EarthSurveyService getEarthSurveyService() { - return earthSurveyService; + private void updateFilesUsedChecksum() throws IOException { + final String csvFile = getLocalProperties().getCsvFile(); + final String balloon = getLocalProperties().getBalloonFile(); + final String template = getLocalProperties().getTemplateFile(); + + getLocalProperties().saveBalloonFileChecksum(CollectEarthUtils.getMd5FromFile(balloon)); + getLocalProperties().saveCsvFileCehcksum(CollectEarthUtils.getMd5FromFile(csvFile)); + getLocalProperties().saveTemplateFileChecksum(CollectEarthUtils.getMd5FromFile(template)); } - @Override - public RDBExporter getRdbExporter() { - return rdbExporter; + public void generateLoaderKmlFile() throws IOException, TemplateException { + + getLocalProperties().saveGeneratedOn(System.currentTimeMillis() + ""); //$NON-NLS-1$ + + final Map data = new HashMap<>(); + data.put("host", ServerController.getHostAddress(getLocalProperties().getHost(), getLocalProperties().getLocalPort())); //$NON-NLS-1$ + data.put("kmlGeneratedOn", getLocalProperties().getGeneratedOn()); //$NON-NLS-1$ + data.put("surveyName", getLocalProperties().getValue(EarthProperty.SURVEY_NAME)); //$NON-NLS-1$ + data.put("plotFileName", KmlGenerator.getCsvFileName(getLocalProperties().getValue(EarthProperty.SAMPLE_FILE))); //$NON-NLS-1$ + + FreemarkerTemplateUtils.applyTemplate(new File(KML_NETWORK_LINK_TEMPLATE), new File(KML_NETWORK_LINK_STARTER), data); + } + + private boolean isKmlUpToDate() throws IOException { + + final String csvFile = getLocalProperties().getCsvFile(); + final String balloon = getLocalProperties().getBalloonFile(); + final String template = getLocalProperties().getTemplateFile(); + + boolean upToDate = true; + if (!getLocalProperties().getBalloonFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(balloon)) + || !getLocalProperties().getTemplateFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(template)) + || !getLocalProperties().getCsvFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(csvFile))) { + upToDate = false; + } + + final File kmzFile = new File(KmlGeneratorService.KMZ_FILE_PATH); + if (!kmzFile.exists()) { + upToDate = false; + } + + return upToDate; + } -} \ No newline at end of file + public void generatePlacemarksKmzFile() throws IOException, KmlGenerationException, CsvValidationException { + generatePlacemarksKmzFile(false); + } + + public void generatePlacemarksKmzFile(boolean forceRegeneration ) throws IOException, KmlGenerationException, CsvValidationException { + + logger.info("START - Generate KMZ file"); //$NON-NLS-1$ + + if (forceRegeneration || !isKmlUpToDate()) { + + generateKml(); + + final KmzGenerator kmzGenerator = new KmzGenerator(); + + final String balloon = getLocalProperties().getBalloonFile(); + final File balloonFile = new File(balloon); + final String folderToInclude = balloonFile.getParent() + File.separator + EarthConstants.FOLDER_COPIED_TO_KMZ; + + kmzGenerator.generateKmzFile(KMZ_FILE_PATH, KML_RESULTING_TEMP_FILE, folderToInclude); + logger.info("KMZ File generated : {}", KMZ_FILE_PATH); //$NON-NLS-1$ + + copyContentsToGeneratedFolder(folderToInclude); + + final File kmlFile = new File(KML_RESULTING_TEMP_FILE); + if (kmlFile.exists()) { + final boolean deleted = kmlFile.delete(); + if (deleted) { + logger.info("KML File deleted : {}", KML_RESULTING_TEMP_FILE); //$NON-NLS-1$ + } else { + throw new IOException("The KML file could not be deleted at " + kmlFile.getPath()); //$NON-NLS-1$ + } + } + + } + logger.info("END - Generate KMZ file"); //$NON-NLS-1$ + } +} From 59e506b0f2ca379f9a4b2a9fe03612b7c4dc79c2 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:30 +0100 Subject: [PATCH 1107/1620] New translations KmlGeneratorService.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 578 ++++++++++++------ 1 file changed, 403 insertions(+), 175 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 9fb3d5284e..884dd929bc 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,223 +1,451 @@ package org.openforis.collect.earth.app.service; -import java.io.BufferedInputStream; -import java.io.BufferedWriter; import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.FileReader; import java.io.IOException; -import java.io.OutputStreamWriter; -import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; -import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.xml.XMLConstants; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; - import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.desktop.ServerController; import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.app.view.DataFormat; -import org.openforis.collect.earth.app.view.JFileChooserExistsAware; import org.openforis.collect.earth.app.view.Messages; -import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; -import org.openforis.collect.io.metadata.collectearth.CollectEarthProjectFileCreator; +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.collect.earth.sampler.processor.CircleKmlGenerator; +import org.openforis.collect.earth.sampler.processor.HexagonKmlGenerator; +import org.openforis.collect.earth.sampler.processor.KmlGenerator; +import org.openforis.collect.earth.sampler.processor.KmzGenerator; +import org.openforis.collect.earth.sampler.processor.NfiFourCirclesGenerator; +import org.openforis.collect.earth.sampler.processor.NfiThreeCirclesGenerator; +import org.openforis.collect.earth.sampler.processor.NfmaKmlGenerator; +import org.openforis.collect.earth.sampler.processor.PolygonGeojsonGenerator; +import org.openforis.collect.earth.sampler.processor.PolygonKmlGenerator; +import org.openforis.collect.earth.sampler.processor.PolygonWktGenerator; +import org.openforis.collect.earth.sampler.processor.SquareKmlGenerator; +import org.openforis.collect.earth.sampler.processor.SquareWithCirclesKmlGenerator; +import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; +import org.openforis.collect.earth.sampler.utils.KmlGenerationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.w3c.dom.Document; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; -@Component -public class KmlImportService { +import com.opencsv.CSVReader; +import com.opencsv.exceptions.CsvValidationException; - Map namesAndTimes = new HashMap<>(); +import freemarker.template.TemplateException; - @Autowired - LocalPropertiesService localPropertiesService; +@Component +public class KmlGeneratorService { @Autowired - EarthProjectsService earthProjectsService; + LocalPropertiesService localPropertiesService; @Autowired EarthSurveyService earthSurveyService; - private JFrame frame; - - /* - * - - one - - -5.89991123135449 - 41.60459478540565 - 0 - -1.425202537313517e-006 - 0 - 177418.783783632 - relativeToSeaFloor - - #m_ylw-pushpin - - 1 - -5.899911231354489,41.60459478540565,0 - - - * - * - */ - - private File createTempCsv( File kmlFile) throws ParserConfigurationException, SAXException, IOException{ - - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); // Compliant - factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); // compliant - DocumentBuilder builder = factory.newDocumentBuilder(); - InputSource is = new InputSource(new FileReader(kmlFile)); - Document doc = builder.parse(is); - - NodeList placemarks = doc.getElementsByTagName("Placemark"); //$NON-NLS-1$ - - StringBuilder sb = new StringBuilder(); - - sb.append( CollectEarthProjectFileCreator.PLACEHOLDER_ID_COLUMNS_HEADER ).append(",").append( "YCoordinate" ).append(",").append( "XCoordinate" ).append(CollectEarthProjectFileCreator.PLACEHOLDER_FOR_EXTRA_COLUMNS_HEADER).append( "\r\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - - - for (int i = 0; i < placemarks.getLength(); i++) { - Node placemark = placemarks.item(i); - - if (placemark.hasChildNodes()) { - NodeList childNodes = placemark.getChildNodes(); - String longitude = "",latitude = "",name = "Placemark"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - name = "placemark" + i; - for (int j=0; j

"; //$NON-NLS-1$ + filesExist = false; + } else if (csvFile == null) { + errorMessage += Messages.getString("EarthApp.23"); //$NON-NLS-1$ + filesExist = false; + } + + if (template != null && !template.exists()) { + errorMessage += Messages.getString("EarthApp.24") //$NON-NLS-1$ + + template.getAbsolutePath() + "


"; //$NON-NLS-1$ + filesExist = false; + } else if (template == null) { + errorMessage += Messages.getString("EarthApp.26"); //$NON-NLS-1$ + filesExist = false; + } + + if (balloon != null && !balloon.exists()) { + errorMessage += Messages.getString("EarthApp.27") + balloon.getAbsolutePath() //$NON-NLS-1$ + + "


"; //$NON-NLS-1$ + filesExist = false; + } else if (balloon == null) { + errorMessage += Messages.getString("EarthApp.29"); //$NON-NLS-1$ + filesExist = false; } - return kmlImported; + errorMessage += Messages.getString("EarthApp.30"); //$NON-NLS-1$ + + if( !filesExist ){ + throw new KmlGenerationException(errorMessage); + } } + private LocalPropertiesService getLocalProperties() { + return localPropertiesService; + } - public boolean loadFromKml( JFrame frame, File kmlFile) throws ParserConfigurationException, SAXException, IOException{ + private void copyContentsToGeneratedFolder(String folderToInclude) throws IOException { + final File sourceDir = new File(folderToInclude); + final File targetDir = new File(EarthConstants.GENERATED_FOLDER + File.separator + sourceDir.getName()); + FileUtils.copyDirectory(sourceDir, targetDir); + } - // Convert the KML into a CSV and save it into a temporary file - File convertedCsvFile = createTempCsv( kmlFile ); + private void fixUserDirectory() { + final String csvFilePath = getLocalProperties().getCsvFile(); + final String balloonPath = getLocalProperties().getBalloonFile(); + final String templatePath = getLocalProperties().getTemplateFile(); + final String metadataPath = getLocalProperties().getImdFile(); + + File csvFile = null; + File balloon = null; + File template = null; + File idmFile = null; + try { + csvFile = new File(csvFilePath); + balloon = new File(balloonPath); + template = new File(templatePath); + idmFile = new File(metadataPath); + + final String prefixUserFolder = FolderFinder.getCollectEarthDataFolder() + File.separator; + + if (!csvFile.exists()) { + final File otherFile = new File(prefixUserFolder + getLocalProperties().getCsvFile()); + if (otherFile.exists()) { + getLocalProperties().setValue(EarthProperty.SAMPLE_FILE, otherFile.getAbsolutePath()); + } + } - JOptionPane.showMessageDialog(frame, Messages.getString("KmlImportService.13")); //$NON-NLS-1$ + if (!balloon.exists()) { + final File otherFile = new File(prefixUserFolder + getLocalProperties().getBalloonFile()); + if (otherFile.exists()) { + getLocalProperties().setValue(EarthProperty.BALLOON_TEMPLATE_KEY, otherFile.getAbsolutePath()); + } + } - // Move the temporary file to the current project folder - //File finalCsvFile = moveCsvToProjectFolder(convertedCsvFile, kmlFile.getName()); - File finalCsvFile = selectAndSaveToCsv(convertedCsvFile, kmlFile.getName()); + if (!template.exists()) { + final File otherFile = new File(prefixUserFolder + getLocalProperties().getTemplateFile()); + if (otherFile.exists()) { + getLocalProperties().setValue(EarthProperty.KML_TEMPLATE_KEY, otherFile.getAbsolutePath()); + } + } - boolean loaded = false; - if( finalCsvFile != null ){ - // Load the plots from the CSV - localPropertiesService.setValue(EarthProperty.SAMPLE_FILE, finalCsvFile.getAbsolutePath()); - loaded = true; + if (!idmFile.exists()) { + final File otherFile = new File(prefixUserFolder + getLocalProperties().getImdFile()); + if (otherFile.exists()) { + getLocalProperties().setValue(EarthProperty.METADATA_FILE, otherFile.getAbsolutePath()); + } } - return loaded; + } catch (final Exception e) { + logger.error("One of the definition files is not defined", e); //$NON-NLS-1$ + } + } - private File selectAndSaveToCsv(File convertedCsvFile, String name) throws IOException { - final File[] saveToCsvFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, true, false, "importedFromKml_" + name + ".csv", //$NON-NLS-1$ //$NON-NLS-2$ - localPropertiesService, frame); - if( saveToCsvFile != null && saveToCsvFile.length == 1 ){ - FileUtils.copyFile( convertedCsvFile, saveToCsvFile[0]); - return saveToCsvFile[0]; - }else { - return null; + private int parseInt( String intNumber ){ + int i = 0; + try{ + if( StringUtils.isNoneBlank( intNumber ) ) { + i = Integer.parseInt( intNumber ); + } + }catch(Exception e){ + logger.error( "Error parsing integer number" ); } + return i; } -/* private File moveCsvToProjectFolder(File convertedCsvFile, String originalKmlFilename) throws IOException { - File destination = new File( earthProjectsService.getProjectsFolder() + File.separator + "generatedFromKml_" + originalKmlFilename + ".ced"); - FileUtils.copyFile( convertedCsvFile, destination); - return destination; - }*/ + public KmlGenerator getKmlGenerator() throws KmlGenerationException, CsvValidationException { + KmlGenerator generateKml =null; + + final String crsSystem = getLocalProperties().getCrs(); + final Integer innerPointSide = parseInt(getLocalProperties().getValue(EarthProperty.INNER_SUBPLOT_SIDE)); + final Integer largeCentralPlotSide = parseInt(getLocalProperties().getValue(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)); + final String distanceToBuffers = getLocalProperties().getValue(EarthProperty.DISTANCE_TO_BUFFERS); + SAMPLE_SHAPE plotShape = getLocalProperties().getSampleShape(); + final String hostAddress = ServerController.getHostAddress(getLocalProperties().getHost(), getLocalProperties().getPort()); + + final float distanceBetweenSamplePoints; + final float distanceToPlotBoundaries; + String dBSP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS); + try { + distanceBetweenSamplePoints = Float.parseFloat(dBSP); + } catch (Exception e) { + logger.error("Error parsing distance between sample points , wrong value : " + dBSP,e); + EarthApp.showMessage("Attention: Check earth.properties file. The distance between sample points must be a number! You have set it to : " + dBSP); //$NON-NLS-1$ + return null; + } - private File chooseKmlFile() { - final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults(DataFormat.KML_FILE, false, false, null, - localPropertiesService, frame); - if( selectedPlotFiles != null && selectedPlotFiles.length == 1 ){ - return selectedPlotFiles[0]; - }else { + String dToPlotB = getLocalProperties().getValue(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES); + try { + distanceToPlotBoundaries = Float.parseFloat(dToPlotB); + } catch (Exception e) { + logger.error("Error parsing distance between plots , wrong value : " + dToPlotB,e); + EarthApp.showMessage("Attention: Check earth.properties file. The distance between sample point and border of the plot must be a number ! You have set it to : " + dToPlotB); //$NON-NLS-1$ return null; } + final String localPort = getLocalProperties().getLocalPort(); + final String numberOfSamplingPlots = getLocalProperties().getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT); + final String csvFile = getLocalProperties().getCsvFile(); + + int numberOfPoints = 25; + if ((numberOfSamplingPlots != null) && (numberOfSamplingPlots.trim().length() > 0)) { + numberOfPoints = parseInt(numberOfSamplingPlots.trim()); + } + + try{ + // If there is a polygon column then the type of plot shape is assumed to be POLYGON + if( csvContainsKml(csvFile)){ + plotShape = SAMPLE_SHAPE.KML_POLYGON; + }else if( csvContainsWkt(csvFile)){ + plotShape = SAMPLE_SHAPE.WKT_POLYGON; + }else if( csvContainsGeoJson(csvFile)){ + plotShape = SAMPLE_SHAPE.GEOJSON_POLYGON; + } + + if (plotShape.equals(SAMPLE_SHAPE.CIRCLE)) { + generateKml = new CircleKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, distanceBetweenSamplePoints ); + } else if (plotShape.equals(SAMPLE_SHAPE.NFMA)) { + generateKml = new NfmaKmlGenerator(crsSystem, hostAddress, localPort, 150, false); + } else if (plotShape.equals(SAMPLE_SHAPE.NFMA_250)) { + generateKml = new NfmaKmlGenerator(crsSystem, hostAddress, localPort, 250, true); + } else if (plotShape.equals(SAMPLE_SHAPE.NFI_THREE_CIRCLES)) { + + String dBP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS ); + float distanceBetweenPlots; + try { + distanceBetweenPlots = Float.parseFloat(dBP); + } catch (Exception e) { + logger.error("Error parsing distance between plots , wrong value : " + dBP,e); + EarthApp.showMessage("Attention: Check earth.properties file. The distance between plots must be a number! You have set it to : " + dBP); //$NON-NLS-1$ + return null; + } + + generateKml = new NfiThreeCirclesGenerator(crsSystem, hostAddress, localPort, innerPointSide, distanceBetweenSamplePoints, distanceBetweenPlots ); + }else if (plotShape.equals(SAMPLE_SHAPE.NFI_FOUR_CIRCLES)) { + + String dBP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS ); + float distanceBetweenPlots; + try { + distanceBetweenPlots = Float.parseFloat(dBP); + } catch (Exception e) { + logger.error(String.format("Error parsing distance between plots , wrong value : %s", dBP) ,e); + EarthApp.showMessage("Attention: Check earth.properties file. The distance between plots must be a number! You have set it to : " + dBP); //$NON-NLS-1$ + return null; + } + + generateKml = new NfiFourCirclesGenerator(crsSystem, hostAddress, localPort, innerPointSide, distanceBetweenSamplePoints, distanceBetweenPlots ); + }else if (plotShape.equals(SAMPLE_SHAPE.HEXAGON)) { + generateKml = new HexagonKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, distanceBetweenSamplePoints ); + } else if (plotShape.equals(SAMPLE_SHAPE.SQUARE_CIRCLE)) { + generateKml = new SquareWithCirclesKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, + distanceBetweenSamplePoints, distanceToPlotBoundaries); + } else if (plotShape.equals(SAMPLE_SHAPE.KML_POLYGON)) { + generateKml = new PolygonKmlGenerator(crsSystem, hostAddress, localPort); + } else if (plotShape.equals(SAMPLE_SHAPE.GEOJSON_POLYGON)) { + generateKml = new PolygonGeojsonGenerator(crsSystem, hostAddress, localPort); + }else if (plotShape.equals(SAMPLE_SHAPE.WKT_POLYGON)) { + generateKml = new PolygonWktGenerator(crsSystem, hostAddress, localPort); + }else { + generateKml = new SquareKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, + distanceBetweenSamplePoints, distanceToPlotBoundaries, largeCentralPlotSide, distanceToBuffers); + } + }catch(IOException e){ + logger.error("Error generating KML", e ); + } + + if( generateKml == null ) { + throw new KmlGenerationException("Error getting the KML generator for parameters " + plotShape.name() ); + } + + return generateKml; + } + + + private boolean csvContains(String csvFile, PolygonTest test ) throws IOException, CsvValidationException { + try( CSVReader csvReader = CsvReaderUtils.getCsvReader(csvFile) ){ + csvReader.readNext(); // Ignore it might be the column headers + + String[] secondLine = csvReader.readNext(); + if( secondLine != null && !CsvReaderUtils.onlyEmptyCells(secondLine) ){ + return test.isPolygon( secondLine ); + } + + return false; + } + } + + private boolean csvContainsGeoJson(String csvFile) throws IOException, CsvValidationException { + return + csvContains( + csvFile, + csvColumns -> new PolygonGeojsonGenerator(null, null, null ).isGeoJsonPolygonColumnFound(csvColumns) != null + ); + } + + private boolean csvContainsWkt(String csvFile) throws IOException, CsvValidationException { + return csvContains( + csvFile, + csvColumns -> new PolygonWktGenerator(null, null, null ).isWktPolygonColumnFound(csvColumns) != null + ); + } + + private boolean csvContainsKml(String csvFile) throws IOException, CsvValidationException { + return csvContains( + csvFile, + csvColumns -> new PolygonKmlGenerator(null, null, null ).isKmlPolygonColumnFound(csvColumns) != null + ); + } + + private void generateKml() throws KmlGenerationException, IOException, CsvValidationException { + + KmlGenerator kmlGenerator = null; + kmlGenerator = getKmlGenerator(); + + if ( kmlGenerator == null ){ + throw new KmlGenerationException("Error while generating KML"); + } + + final String csvFile = getLocalProperties().getCsvFile(); + String balloon = getLocalProperties().getBalloonFile(); + final String template = getLocalProperties().getTemplateFile(); + + // In case the user sets up the OPEN_BALLOON_IN_FIREFOX flag to + // true. Meaning that a small ballon opens in the placemark which in + // its turn + // opens a firefox browser with the real form + final Boolean openBalloonInFirefox = Boolean.valueOf(getLocalProperties().getValue(EarthProperty.OPEN_BALLOON_IN_BROWSER)); + if (Boolean.TRUE.equals( openBalloonInFirefox) ) { + String alternativeBalloon = getLocalProperties().getValue(EarthProperty.ALTERNATIVE_BALLOON_FOR_BROWSER); + if( !StringUtils.isBlank( alternativeBalloon ) ){ + balloon = alternativeBalloon; + } + } + + // Using all of the files that compose the final KML it is generated and stores in KML_RESULTING_TEMP_FILE + kmlGenerator.generateKmlFile(KML_RESULTING_TEMP_FILE, csvFile, balloon, template, earthSurveyService.getCollectSurvey()); + updateFilesUsedChecksum(); + + } + + private void updateFilesUsedChecksum() throws IOException { + final String csvFile = getLocalProperties().getCsvFile(); + final String balloon = getLocalProperties().getBalloonFile(); + final String template = getLocalProperties().getTemplateFile(); + + getLocalProperties().saveBalloonFileChecksum(CollectEarthUtils.getMd5FromFile(balloon)); + getLocalProperties().saveCsvFileCehcksum(CollectEarthUtils.getMd5FromFile(csvFile)); + getLocalProperties().saveTemplateFileChecksum(CollectEarthUtils.getMd5FromFile(template)); } + public void generateLoaderKmlFile() throws IOException, TemplateException { + + getLocalProperties().saveGeneratedOn(System.currentTimeMillis() + ""); //$NON-NLS-1$ + + final Map data = new HashMap<>(); + data.put("host", ServerController.getHostAddress(getLocalProperties().getHost(), getLocalProperties().getLocalPort())); //$NON-NLS-1$ + data.put("kmlGeneratedOn", getLocalProperties().getGeneratedOn()); //$NON-NLS-1$ + data.put("surveyName", getLocalProperties().getValue(EarthProperty.SURVEY_NAME)); //$NON-NLS-1$ + data.put("plotFileName", KmlGenerator.getCsvFileName(getLocalProperties().getValue(EarthProperty.SAMPLE_FILE))); //$NON-NLS-1$ + + FreemarkerTemplateUtils.applyTemplate(new File(KML_NETWORK_LINK_TEMPLATE), new File(KML_NETWORK_LINK_STARTER), data); + } + private boolean isKmlUpToDate() throws IOException { + + final String csvFile = getLocalProperties().getCsvFile(); + final String balloon = getLocalProperties().getBalloonFile(); + final String template = getLocalProperties().getTemplateFile(); + + boolean upToDate = true; + if (!getLocalProperties().getBalloonFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(balloon)) + || !getLocalProperties().getTemplateFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(template)) + || !getLocalProperties().getCsvFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(csvFile))) { + upToDate = false; + } + + final File kmzFile = new File(KmlGeneratorService.KMZ_FILE_PATH); + if (!kmzFile.exists()) { + upToDate = false; + } + + return upToDate; + + } + + public void generatePlacemarksKmzFile() throws IOException, KmlGenerationException, CsvValidationException { + generatePlacemarksKmzFile(false); + } + + public void generatePlacemarksKmzFile(boolean forceRegeneration ) throws IOException, KmlGenerationException, CsvValidationException { + + logger.info("START - Generate KMZ file"); //$NON-NLS-1$ + + if (forceRegeneration || !isKmlUpToDate()) { + + generateKml(); + + final KmzGenerator kmzGenerator = new KmzGenerator(); + + final String balloon = getLocalProperties().getBalloonFile(); + final File balloonFile = new File(balloon); + final String folderToInclude = balloonFile.getParent() + File.separator + EarthConstants.FOLDER_COPIED_TO_KMZ; + + kmzGenerator.generateKmzFile(KMZ_FILE_PATH, KML_RESULTING_TEMP_FILE, folderToInclude); + logger.info("KMZ File generated : {}", KMZ_FILE_PATH); //$NON-NLS-1$ + + copyContentsToGeneratedFolder(folderToInclude); + + final File kmlFile = new File(KML_RESULTING_TEMP_FILE); + if (kmlFile.exists()) { + final boolean deleted = kmlFile.delete(); + if (deleted) { + logger.info("KML File deleted : {}", KML_RESULTING_TEMP_FILE); //$NON-NLS-1$ + } else { + throw new IOException("The KML file could not be deleted at " + kmlFile.getPath()); //$NON-NLS-1$ + } + } + + } + logger.info("END - Generate KMZ file"); //$NON-NLS-1$ + } } From a33df3cc20e242e1aef4c65643f48216d3f62848 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:32 +0100 Subject: [PATCH 1108/1620] New translations KmlGeneratorService.java (Spanish) --- .../earth/app/view/Messages_es.properties | 578 ++++++++++++------ 1 file changed, 403 insertions(+), 175 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 9fb3d5284e..884dd929bc 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,223 +1,451 @@ package org.openforis.collect.earth.app.service; -import java.io.BufferedInputStream; -import java.io.BufferedWriter; import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.FileReader; import java.io.IOException; -import java.io.OutputStreamWriter; -import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; -import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.xml.XMLConstants; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; - import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.desktop.ServerController; import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.app.view.DataFormat; -import org.openforis.collect.earth.app.view.JFileChooserExistsAware; import org.openforis.collect.earth.app.view.Messages; -import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; -import org.openforis.collect.io.metadata.collectearth.CollectEarthProjectFileCreator; +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.collect.earth.sampler.processor.CircleKmlGenerator; +import org.openforis.collect.earth.sampler.processor.HexagonKmlGenerator; +import org.openforis.collect.earth.sampler.processor.KmlGenerator; +import org.openforis.collect.earth.sampler.processor.KmzGenerator; +import org.openforis.collect.earth.sampler.processor.NfiFourCirclesGenerator; +import org.openforis.collect.earth.sampler.processor.NfiThreeCirclesGenerator; +import org.openforis.collect.earth.sampler.processor.NfmaKmlGenerator; +import org.openforis.collect.earth.sampler.processor.PolygonGeojsonGenerator; +import org.openforis.collect.earth.sampler.processor.PolygonKmlGenerator; +import org.openforis.collect.earth.sampler.processor.PolygonWktGenerator; +import org.openforis.collect.earth.sampler.processor.SquareKmlGenerator; +import org.openforis.collect.earth.sampler.processor.SquareWithCirclesKmlGenerator; +import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; +import org.openforis.collect.earth.sampler.utils.KmlGenerationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.w3c.dom.Document; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; -@Component -public class KmlImportService { +import com.opencsv.CSVReader; +import com.opencsv.exceptions.CsvValidationException; - Map namesAndTimes = new HashMap<>(); +import freemarker.template.TemplateException; - @Autowired - LocalPropertiesService localPropertiesService; +@Component +public class KmlGeneratorService { @Autowired - EarthProjectsService earthProjectsService; + LocalPropertiesService localPropertiesService; @Autowired EarthSurveyService earthSurveyService; - private JFrame frame; - - /* - * - - one - - -5.89991123135449 - 41.60459478540565 - 0 - -1.425202537313517e-006 - 0 - 177418.783783632 - relativeToSeaFloor - - #m_ylw-pushpin - - 1 - -5.899911231354489,41.60459478540565,0 - - - * - * - */ - - private File createTempCsv( File kmlFile) throws ParserConfigurationException, SAXException, IOException{ - - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); // Compliant - factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); // compliant - DocumentBuilder builder = factory.newDocumentBuilder(); - InputSource is = new InputSource(new FileReader(kmlFile)); - Document doc = builder.parse(is); - - NodeList placemarks = doc.getElementsByTagName("Placemark"); //$NON-NLS-1$ - - StringBuilder sb = new StringBuilder(); - - sb.append( CollectEarthProjectFileCreator.PLACEHOLDER_ID_COLUMNS_HEADER ).append(",").append( "YCoordinate" ).append(",").append( "XCoordinate" ).append(CollectEarthProjectFileCreator.PLACEHOLDER_FOR_EXTRA_COLUMNS_HEADER).append( "\r\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - - - for (int i = 0; i < placemarks.getLength(); i++) { - Node placemark = placemarks.item(i); - - if (placemark.hasChildNodes()) { - NodeList childNodes = placemark.getChildNodes(); - String longitude = "",latitude = "",name = "Placemark"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - name = "placemark" + i; - for (int j=0; j

"; //$NON-NLS-1$ + filesExist = false; + } else if (csvFile == null) { + errorMessage += Messages.getString("EarthApp.23"); //$NON-NLS-1$ + filesExist = false; + } + + if (template != null && !template.exists()) { + errorMessage += Messages.getString("EarthApp.24") //$NON-NLS-1$ + + template.getAbsolutePath() + "

"; //$NON-NLS-1$ + filesExist = false; + } else if (template == null) { + errorMessage += Messages.getString("EarthApp.26"); //$NON-NLS-1$ + filesExist = false; + } + + if (balloon != null && !balloon.exists()) { + errorMessage += Messages.getString("EarthApp.27") + balloon.getAbsolutePath() //$NON-NLS-1$ + + "

"; //$NON-NLS-1$ + filesExist = false; + } else if (balloon == null) { + errorMessage += Messages.getString("EarthApp.29"); //$NON-NLS-1$ + filesExist = false; } - return kmlImported; + errorMessage += Messages.getString("EarthApp.30"); //$NON-NLS-1$ + + if( !filesExist ){ + throw new KmlGenerationException(errorMessage); + } } + private LocalPropertiesService getLocalProperties() { + return localPropertiesService; + } - public boolean loadFromKml( JFrame frame, File kmlFile) throws ParserConfigurationException, SAXException, IOException{ + private void copyContentsToGeneratedFolder(String folderToInclude) throws IOException { + final File sourceDir = new File(folderToInclude); + final File targetDir = new File(EarthConstants.GENERATED_FOLDER + File.separator + sourceDir.getName()); + FileUtils.copyDirectory(sourceDir, targetDir); + } - // Convert the KML into a CSV and save it into a temporary file - File convertedCsvFile = createTempCsv( kmlFile ); + private void fixUserDirectory() { + final String csvFilePath = getLocalProperties().getCsvFile(); + final String balloonPath = getLocalProperties().getBalloonFile(); + final String templatePath = getLocalProperties().getTemplateFile(); + final String metadataPath = getLocalProperties().getImdFile(); + + File csvFile = null; + File balloon = null; + File template = null; + File idmFile = null; + try { + csvFile = new File(csvFilePath); + balloon = new File(balloonPath); + template = new File(templatePath); + idmFile = new File(metadataPath); + + final String prefixUserFolder = FolderFinder.getCollectEarthDataFolder() + File.separator; + + if (!csvFile.exists()) { + final File otherFile = new File(prefixUserFolder + getLocalProperties().getCsvFile()); + if (otherFile.exists()) { + getLocalProperties().setValue(EarthProperty.SAMPLE_FILE, otherFile.getAbsolutePath()); + } + } - JOptionPane.showMessageDialog(frame, Messages.getString("KmlImportService.13")); //$NON-NLS-1$ + if (!balloon.exists()) { + final File otherFile = new File(prefixUserFolder + getLocalProperties().getBalloonFile()); + if (otherFile.exists()) { + getLocalProperties().setValue(EarthProperty.BALLOON_TEMPLATE_KEY, otherFile.getAbsolutePath()); + } + } - // Move the temporary file to the current project folder - //File finalCsvFile = moveCsvToProjectFolder(convertedCsvFile, kmlFile.getName()); - File finalCsvFile = selectAndSaveToCsv(convertedCsvFile, kmlFile.getName()); + if (!template.exists()) { + final File otherFile = new File(prefixUserFolder + getLocalProperties().getTemplateFile()); + if (otherFile.exists()) { + getLocalProperties().setValue(EarthProperty.KML_TEMPLATE_KEY, otherFile.getAbsolutePath()); + } + } - boolean loaded = false; - if( finalCsvFile != null ){ - // Load the plots from the CSV - localPropertiesService.setValue(EarthProperty.SAMPLE_FILE, finalCsvFile.getAbsolutePath()); - loaded = true; + if (!idmFile.exists()) { + final File otherFile = new File(prefixUserFolder + getLocalProperties().getImdFile()); + if (otherFile.exists()) { + getLocalProperties().setValue(EarthProperty.METADATA_FILE, otherFile.getAbsolutePath()); + } } - return loaded; + } catch (final Exception e) { + logger.error("One of the definition files is not defined", e); //$NON-NLS-1$ + } + } - private File selectAndSaveToCsv(File convertedCsvFile, String name) throws IOException { - final File[] saveToCsvFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, true, false, "importedFromKml_" + name + ".csv", //$NON-NLS-1$ //$NON-NLS-2$ - localPropertiesService, frame); - if( saveToCsvFile != null && saveToCsvFile.length == 1 ){ - FileUtils.copyFile( convertedCsvFile, saveToCsvFile[0]); - return saveToCsvFile[0]; - }else { - return null; + private int parseInt( String intNumber ){ + int i = 0; + try{ + if( StringUtils.isNoneBlank( intNumber ) ) { + i = Integer.parseInt( intNumber ); + } + }catch(Exception e){ + logger.error( "Error parsing integer number" ); } + return i; } -/* private File moveCsvToProjectFolder(File convertedCsvFile, String originalKmlFilename) throws IOException { - File destination = new File( earthProjectsService.getProjectsFolder() + File.separator + "generatedFromKml_" + originalKmlFilename + ".ced"); - FileUtils.copyFile( convertedCsvFile, destination); - return destination; - }*/ + public KmlGenerator getKmlGenerator() throws KmlGenerationException, CsvValidationException { + KmlGenerator generateKml =null; + + final String crsSystem = getLocalProperties().getCrs(); + final Integer innerPointSide = parseInt(getLocalProperties().getValue(EarthProperty.INNER_SUBPLOT_SIDE)); + final Integer largeCentralPlotSide = parseInt(getLocalProperties().getValue(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)); + final String distanceToBuffers = getLocalProperties().getValue(EarthProperty.DISTANCE_TO_BUFFERS); + SAMPLE_SHAPE plotShape = getLocalProperties().getSampleShape(); + final String hostAddress = ServerController.getHostAddress(getLocalProperties().getHost(), getLocalProperties().getPort()); + + final float distanceBetweenSamplePoints; + final float distanceToPlotBoundaries; + String dBSP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS); + try { + distanceBetweenSamplePoints = Float.parseFloat(dBSP); + } catch (Exception e) { + logger.error("Error parsing distance between sample points , wrong value : " + dBSP,e); + EarthApp.showMessage("Attention: Check earth.properties file. The distance between sample points must be a number! You have set it to : " + dBSP); //$NON-NLS-1$ + return null; + } - private File chooseKmlFile() { - final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults(DataFormat.KML_FILE, false, false, null, - localPropertiesService, frame); - if( selectedPlotFiles != null && selectedPlotFiles.length == 1 ){ - return selectedPlotFiles[0]; - }else { + String dToPlotB = getLocalProperties().getValue(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES); + try { + distanceToPlotBoundaries = Float.parseFloat(dToPlotB); + } catch (Exception e) { + logger.error("Error parsing distance between plots , wrong value : " + dToPlotB,e); + EarthApp.showMessage("Attention: Check earth.properties file. The distance between sample point and border of the plot must be a number ! You have set it to : " + dToPlotB); //$NON-NLS-1$ return null; } + final String localPort = getLocalProperties().getLocalPort(); + final String numberOfSamplingPlots = getLocalProperties().getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT); + final String csvFile = getLocalProperties().getCsvFile(); + + int numberOfPoints = 25; + if ((numberOfSamplingPlots != null) && (numberOfSamplingPlots.trim().length() > 0)) { + numberOfPoints = parseInt(numberOfSamplingPlots.trim()); + } + + try{ + // If there is a polygon column then the type of plot shape is assumed to be POLYGON + if( csvContainsKml(csvFile)){ + plotShape = SAMPLE_SHAPE.KML_POLYGON; + }else if( csvContainsWkt(csvFile)){ + plotShape = SAMPLE_SHAPE.WKT_POLYGON; + }else if( csvContainsGeoJson(csvFile)){ + plotShape = SAMPLE_SHAPE.GEOJSON_POLYGON; + } + + if (plotShape.equals(SAMPLE_SHAPE.CIRCLE)) { + generateKml = new CircleKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, distanceBetweenSamplePoints ); + } else if (plotShape.equals(SAMPLE_SHAPE.NFMA)) { + generateKml = new NfmaKmlGenerator(crsSystem, hostAddress, localPort, 150, false); + } else if (plotShape.equals(SAMPLE_SHAPE.NFMA_250)) { + generateKml = new NfmaKmlGenerator(crsSystem, hostAddress, localPort, 250, true); + } else if (plotShape.equals(SAMPLE_SHAPE.NFI_THREE_CIRCLES)) { + + String dBP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS ); + float distanceBetweenPlots; + try { + distanceBetweenPlots = Float.parseFloat(dBP); + } catch (Exception e) { + logger.error("Error parsing distance between plots , wrong value : " + dBP,e); + EarthApp.showMessage("Attention: Check earth.properties file. The distance between plots must be a number! You have set it to : " + dBP); //$NON-NLS-1$ + return null; + } + + generateKml = new NfiThreeCirclesGenerator(crsSystem, hostAddress, localPort, innerPointSide, distanceBetweenSamplePoints, distanceBetweenPlots ); + }else if (plotShape.equals(SAMPLE_SHAPE.NFI_FOUR_CIRCLES)) { + + String dBP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS ); + float distanceBetweenPlots; + try { + distanceBetweenPlots = Float.parseFloat(dBP); + } catch (Exception e) { + logger.error(String.format("Error parsing distance between plots , wrong value : %s", dBP) ,e); + EarthApp.showMessage("Attention: Check earth.properties file. The distance between plots must be a number! You have set it to : " + dBP); //$NON-NLS-1$ + return null; + } + + generateKml = new NfiFourCirclesGenerator(crsSystem, hostAddress, localPort, innerPointSide, distanceBetweenSamplePoints, distanceBetweenPlots ); + }else if (plotShape.equals(SAMPLE_SHAPE.HEXAGON)) { + generateKml = new HexagonKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, distanceBetweenSamplePoints ); + } else if (plotShape.equals(SAMPLE_SHAPE.SQUARE_CIRCLE)) { + generateKml = new SquareWithCirclesKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, + distanceBetweenSamplePoints, distanceToPlotBoundaries); + } else if (plotShape.equals(SAMPLE_SHAPE.KML_POLYGON)) { + generateKml = new PolygonKmlGenerator(crsSystem, hostAddress, localPort); + } else if (plotShape.equals(SAMPLE_SHAPE.GEOJSON_POLYGON)) { + generateKml = new PolygonGeojsonGenerator(crsSystem, hostAddress, localPort); + }else if (plotShape.equals(SAMPLE_SHAPE.WKT_POLYGON)) { + generateKml = new PolygonWktGenerator(crsSystem, hostAddress, localPort); + }else { + generateKml = new SquareKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, + distanceBetweenSamplePoints, distanceToPlotBoundaries, largeCentralPlotSide, distanceToBuffers); + } + }catch(IOException e){ + logger.error("Error generating KML", e ); + } + + if( generateKml == null ) { + throw new KmlGenerationException("Error getting the KML generator for parameters " + plotShape.name() ); + } + + return generateKml; + } + + + private boolean csvContains(String csvFile, PolygonTest test ) throws IOException, CsvValidationException { + try( CSVReader csvReader = CsvReaderUtils.getCsvReader(csvFile) ){ + csvReader.readNext(); // Ignore it might be the column headers + + String[] secondLine = csvReader.readNext(); + if( secondLine != null && !CsvReaderUtils.onlyEmptyCells(secondLine) ){ + return test.isPolygon( secondLine ); + } + + return false; + } + } + + private boolean csvContainsGeoJson(String csvFile) throws IOException, CsvValidationException { + return + csvContains( + csvFile, + csvColumns -> new PolygonGeojsonGenerator(null, null, null ).isGeoJsonPolygonColumnFound(csvColumns) != null + ); + } + + private boolean csvContainsWkt(String csvFile) throws IOException, CsvValidationException { + return csvContains( + csvFile, + csvColumns -> new PolygonWktGenerator(null, null, null ).isWktPolygonColumnFound(csvColumns) != null + ); + } + + private boolean csvContainsKml(String csvFile) throws IOException, CsvValidationException { + return csvContains( + csvFile, + csvColumns -> new PolygonKmlGenerator(null, null, null ).isKmlPolygonColumnFound(csvColumns) != null + ); + } + + private void generateKml() throws KmlGenerationException, IOException, CsvValidationException { + + KmlGenerator kmlGenerator = null; + kmlGenerator = getKmlGenerator(); + + if ( kmlGenerator == null ){ + throw new KmlGenerationException("Error while generating KML"); + } + + final String csvFile = getLocalProperties().getCsvFile(); + String balloon = getLocalProperties().getBalloonFile(); + final String template = getLocalProperties().getTemplateFile(); + + // In case the user sets up the OPEN_BALLOON_IN_FIREFOX flag to + // true. Meaning that a small ballon opens in the placemark which in + // its turn + // opens a firefox browser with the real form + final Boolean openBalloonInFirefox = Boolean.valueOf(getLocalProperties().getValue(EarthProperty.OPEN_BALLOON_IN_BROWSER)); + if (Boolean.TRUE.equals( openBalloonInFirefox) ) { + String alternativeBalloon = getLocalProperties().getValue(EarthProperty.ALTERNATIVE_BALLOON_FOR_BROWSER); + if( !StringUtils.isBlank( alternativeBalloon ) ){ + balloon = alternativeBalloon; + } + } + + // Using all of the files that compose the final KML it is generated and stores in KML_RESULTING_TEMP_FILE + kmlGenerator.generateKmlFile(KML_RESULTING_TEMP_FILE, csvFile, balloon, template, earthSurveyService.getCollectSurvey()); + updateFilesUsedChecksum(); + + } + + private void updateFilesUsedChecksum() throws IOException { + final String csvFile = getLocalProperties().getCsvFile(); + final String balloon = getLocalProperties().getBalloonFile(); + final String template = getLocalProperties().getTemplateFile(); + + getLocalProperties().saveBalloonFileChecksum(CollectEarthUtils.getMd5FromFile(balloon)); + getLocalProperties().saveCsvFileCehcksum(CollectEarthUtils.getMd5FromFile(csvFile)); + getLocalProperties().saveTemplateFileChecksum(CollectEarthUtils.getMd5FromFile(template)); } + public void generateLoaderKmlFile() throws IOException, TemplateException { + + getLocalProperties().saveGeneratedOn(System.currentTimeMillis() + ""); //$NON-NLS-1$ + + final Map data = new HashMap<>(); + data.put("host", ServerController.getHostAddress(getLocalProperties().getHost(), getLocalProperties().getLocalPort())); //$NON-NLS-1$ + data.put("kmlGeneratedOn", getLocalProperties().getGeneratedOn()); //$NON-NLS-1$ + data.put("surveyName", getLocalProperties().getValue(EarthProperty.SURVEY_NAME)); //$NON-NLS-1$ + data.put("plotFileName", KmlGenerator.getCsvFileName(getLocalProperties().getValue(EarthProperty.SAMPLE_FILE))); //$NON-NLS-1$ + + FreemarkerTemplateUtils.applyTemplate(new File(KML_NETWORK_LINK_TEMPLATE), new File(KML_NETWORK_LINK_STARTER), data); + } + private boolean isKmlUpToDate() throws IOException { + + final String csvFile = getLocalProperties().getCsvFile(); + final String balloon = getLocalProperties().getBalloonFile(); + final String template = getLocalProperties().getTemplateFile(); + + boolean upToDate = true; + if (!getLocalProperties().getBalloonFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(balloon)) + || !getLocalProperties().getTemplateFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(template)) + || !getLocalProperties().getCsvFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(csvFile))) { + upToDate = false; + } + + final File kmzFile = new File(KmlGeneratorService.KMZ_FILE_PATH); + if (!kmzFile.exists()) { + upToDate = false; + } + + return upToDate; + + } + + public void generatePlacemarksKmzFile() throws IOException, KmlGenerationException, CsvValidationException { + generatePlacemarksKmzFile(false); + } + + public void generatePlacemarksKmzFile(boolean forceRegeneration ) throws IOException, KmlGenerationException, CsvValidationException { + + logger.info("START - Generate KMZ file"); //$NON-NLS-1$ + + if (forceRegeneration || !isKmlUpToDate()) { + + generateKml(); + + final KmzGenerator kmzGenerator = new KmzGenerator(); + + final String balloon = getLocalProperties().getBalloonFile(); + final File balloonFile = new File(balloon); + final String folderToInclude = balloonFile.getParent() + File.separator + EarthConstants.FOLDER_COPIED_TO_KMZ; + + kmzGenerator.generateKmzFile(KMZ_FILE_PATH, KML_RESULTING_TEMP_FILE, folderToInclude); + logger.info("KMZ File generated : {}", KMZ_FILE_PATH); //$NON-NLS-1$ + + copyContentsToGeneratedFolder(folderToInclude); + + final File kmlFile = new File(KML_RESULTING_TEMP_FILE); + if (kmlFile.exists()) { + final boolean deleted = kmlFile.delete(); + if (deleted) { + logger.info("KML File deleted : {}", KML_RESULTING_TEMP_FILE); //$NON-NLS-1$ + } else { + throw new IOException("The KML file could not be deleted at " + kmlFile.getPath()); //$NON-NLS-1$ + } + } + + } + logger.info("END - Generate KMZ file"); //$NON-NLS-1$ + } } From 7025ea460a9bee63ed16e596959687c1e0577e2d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:33 +0100 Subject: [PATCH 1109/1620] New translations KmlGeneratorService.java (French) --- .../earth/app/view/Messages_fr.properties | 578 ++++++++++++------ 1 file changed, 403 insertions(+), 175 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 9fb3d5284e..884dd929bc 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,223 +1,451 @@ package org.openforis.collect.earth.app.service; -import java.io.BufferedInputStream; -import java.io.BufferedWriter; import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.FileReader; import java.io.IOException; -import java.io.OutputStreamWriter; -import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; -import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.xml.XMLConstants; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; - import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.desktop.ServerController; import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.app.view.DataFormat; -import org.openforis.collect.earth.app.view.JFileChooserExistsAware; import org.openforis.collect.earth.app.view.Messages; -import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; -import org.openforis.collect.io.metadata.collectearth.CollectEarthProjectFileCreator; +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.collect.earth.sampler.processor.CircleKmlGenerator; +import org.openforis.collect.earth.sampler.processor.HexagonKmlGenerator; +import org.openforis.collect.earth.sampler.processor.KmlGenerator; +import org.openforis.collect.earth.sampler.processor.KmzGenerator; +import org.openforis.collect.earth.sampler.processor.NfiFourCirclesGenerator; +import org.openforis.collect.earth.sampler.processor.NfiThreeCirclesGenerator; +import org.openforis.collect.earth.sampler.processor.NfmaKmlGenerator; +import org.openforis.collect.earth.sampler.processor.PolygonGeojsonGenerator; +import org.openforis.collect.earth.sampler.processor.PolygonKmlGenerator; +import org.openforis.collect.earth.sampler.processor.PolygonWktGenerator; +import org.openforis.collect.earth.sampler.processor.SquareKmlGenerator; +import org.openforis.collect.earth.sampler.processor.SquareWithCirclesKmlGenerator; +import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; +import org.openforis.collect.earth.sampler.utils.KmlGenerationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.w3c.dom.Document; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; -@Component -public class KmlImportService { +import com.opencsv.CSVReader; +import com.opencsv.exceptions.CsvValidationException; - Map namesAndTimes = new HashMap<>(); +import freemarker.template.TemplateException; - @Autowired - LocalPropertiesService localPropertiesService; +@Component +public class KmlGeneratorService { @Autowired - EarthProjectsService earthProjectsService; + LocalPropertiesService localPropertiesService; @Autowired EarthSurveyService earthSurveyService; - private JFrame frame; - - /* - * - - one - - -5.89991123135449 - 41.60459478540565 - 0 - -1.425202537313517e-006 - 0 - 177418.783783632 - relativeToSeaFloor - - #m_ylw-pushpin - - 1 - -5.899911231354489,41.60459478540565,0 - - - * - * - */ - - private File createTempCsv( File kmlFile) throws ParserConfigurationException, SAXException, IOException{ - - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); // Compliant - factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); // compliant - DocumentBuilder builder = factory.newDocumentBuilder(); - InputSource is = new InputSource(new FileReader(kmlFile)); - Document doc = builder.parse(is); - - NodeList placemarks = doc.getElementsByTagName("Placemark"); //$NON-NLS-1$ - - StringBuilder sb = new StringBuilder(); - - sb.append( CollectEarthProjectFileCreator.PLACEHOLDER_ID_COLUMNS_HEADER ).append(",").append( "YCoordinate" ).append(",").append( "XCoordinate" ).append(CollectEarthProjectFileCreator.PLACEHOLDER_FOR_EXTRA_COLUMNS_HEADER).append( "\r\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - - - for (int i = 0; i < placemarks.getLength(); i++) { - Node placemark = placemarks.item(i); - - if (placemark.hasChildNodes()) { - NodeList childNodes = placemark.getChildNodes(); - String longitude = "",latitude = "",name = "Placemark"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - name = "placemark" + i; - for (int j=0; j

"; //$NON-NLS-1$ + filesExist = false; + } else if (csvFile == null) { + errorMessage += Messages.getString("EarthApp.23"); //$NON-NLS-1$ + filesExist = false; + } + + if (template != null && !template.exists()) { + errorMessage += Messages.getString("EarthApp.24") //$NON-NLS-1$ + + template.getAbsolutePath() + "

"; //$NON-NLS-1$ + filesExist = false; + } else if (template == null) { + errorMessage += Messages.getString("EarthApp.26"); //$NON-NLS-1$ + filesExist = false; + } + + if (balloon != null && !balloon.exists()) { + errorMessage += Messages.getString("EarthApp.27") + balloon.getAbsolutePath() //$NON-NLS-1$ + + "

"; //$NON-NLS-1$ + filesExist = false; + } else if (balloon == null) { + errorMessage += Messages.getString("EarthApp.29"); //$NON-NLS-1$ + filesExist = false; } - return kmlImported; + errorMessage += Messages.getString("EarthApp.30"); //$NON-NLS-1$ + + if( !filesExist ){ + throw new KmlGenerationException(errorMessage); + } } + private LocalPropertiesService getLocalProperties() { + return localPropertiesService; + } - public boolean loadFromKml( JFrame frame, File kmlFile) throws ParserConfigurationException, SAXException, IOException{ + private void copyContentsToGeneratedFolder(String folderToInclude) throws IOException { + final File sourceDir = new File(folderToInclude); + final File targetDir = new File(EarthConstants.GENERATED_FOLDER + File.separator + sourceDir.getName()); + FileUtils.copyDirectory(sourceDir, targetDir); + } - // Convert the KML into a CSV and save it into a temporary file - File convertedCsvFile = createTempCsv( kmlFile ); + private void fixUserDirectory() { + final String csvFilePath = getLocalProperties().getCsvFile(); + final String balloonPath = getLocalProperties().getBalloonFile(); + final String templatePath = getLocalProperties().getTemplateFile(); + final String metadataPath = getLocalProperties().getImdFile(); + + File csvFile = null; + File balloon = null; + File template = null; + File idmFile = null; + try { + csvFile = new File(csvFilePath); + balloon = new File(balloonPath); + template = new File(templatePath); + idmFile = new File(metadataPath); + + final String prefixUserFolder = FolderFinder.getCollectEarthDataFolder() + File.separator; + + if (!csvFile.exists()) { + final File otherFile = new File(prefixUserFolder + getLocalProperties().getCsvFile()); + if (otherFile.exists()) { + getLocalProperties().setValue(EarthProperty.SAMPLE_FILE, otherFile.getAbsolutePath()); + } + } - JOptionPane.showMessageDialog(frame, Messages.getString("KmlImportService.13")); //$NON-NLS-1$ + if (!balloon.exists()) { + final File otherFile = new File(prefixUserFolder + getLocalProperties().getBalloonFile()); + if (otherFile.exists()) { + getLocalProperties().setValue(EarthProperty.BALLOON_TEMPLATE_KEY, otherFile.getAbsolutePath()); + } + } - // Move the temporary file to the current project folder - //File finalCsvFile = moveCsvToProjectFolder(convertedCsvFile, kmlFile.getName()); - File finalCsvFile = selectAndSaveToCsv(convertedCsvFile, kmlFile.getName()); + if (!template.exists()) { + final File otherFile = new File(prefixUserFolder + getLocalProperties().getTemplateFile()); + if (otherFile.exists()) { + getLocalProperties().setValue(EarthProperty.KML_TEMPLATE_KEY, otherFile.getAbsolutePath()); + } + } - boolean loaded = false; - if( finalCsvFile != null ){ - // Load the plots from the CSV - localPropertiesService.setValue(EarthProperty.SAMPLE_FILE, finalCsvFile.getAbsolutePath()); - loaded = true; + if (!idmFile.exists()) { + final File otherFile = new File(prefixUserFolder + getLocalProperties().getImdFile()); + if (otherFile.exists()) { + getLocalProperties().setValue(EarthProperty.METADATA_FILE, otherFile.getAbsolutePath()); + } } - return loaded; + } catch (final Exception e) { + logger.error("One of the definition files is not defined", e); //$NON-NLS-1$ + } + } - private File selectAndSaveToCsv(File convertedCsvFile, String name) throws IOException { - final File[] saveToCsvFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, true, false, "importedFromKml_" + name + ".csv", //$NON-NLS-1$ //$NON-NLS-2$ - localPropertiesService, frame); - if( saveToCsvFile != null && saveToCsvFile.length == 1 ){ - FileUtils.copyFile( convertedCsvFile, saveToCsvFile[0]); - return saveToCsvFile[0]; - }else { - return null; + private int parseInt( String intNumber ){ + int i = 0; + try{ + if( StringUtils.isNoneBlank( intNumber ) ) { + i = Integer.parseInt( intNumber ); + } + }catch(Exception e){ + logger.error( "Error parsing integer number" ); } + return i; } -/* private File moveCsvToProjectFolder(File convertedCsvFile, String originalKmlFilename) throws IOException { - File destination = new File( earthProjectsService.getProjectsFolder() + File.separator + "generatedFromKml_" + originalKmlFilename + ".ced"); - FileUtils.copyFile( convertedCsvFile, destination); - return destination; - }*/ + public KmlGenerator getKmlGenerator() throws KmlGenerationException, CsvValidationException { + KmlGenerator generateKml =null; + + final String crsSystem = getLocalProperties().getCrs(); + final Integer innerPointSide = parseInt(getLocalProperties().getValue(EarthProperty.INNER_SUBPLOT_SIDE)); + final Integer largeCentralPlotSide = parseInt(getLocalProperties().getValue(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)); + final String distanceToBuffers = getLocalProperties().getValue(EarthProperty.DISTANCE_TO_BUFFERS); + SAMPLE_SHAPE plotShape = getLocalProperties().getSampleShape(); + final String hostAddress = ServerController.getHostAddress(getLocalProperties().getHost(), getLocalProperties().getPort()); + + final float distanceBetweenSamplePoints; + final float distanceToPlotBoundaries; + String dBSP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS); + try { + distanceBetweenSamplePoints = Float.parseFloat(dBSP); + } catch (Exception e) { + logger.error("Error parsing distance between sample points , wrong value : " + dBSP,e); + EarthApp.showMessage("Attention: Check earth.properties file. The distance between sample points must be a number! You have set it to : " + dBSP); //$NON-NLS-1$ + return null; + } - private File chooseKmlFile() { - final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults(DataFormat.KML_FILE, false, false, null, - localPropertiesService, frame); - if( selectedPlotFiles != null && selectedPlotFiles.length == 1 ){ - return selectedPlotFiles[0]; - }else { + String dToPlotB = getLocalProperties().getValue(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES); + try { + distanceToPlotBoundaries = Float.parseFloat(dToPlotB); + } catch (Exception e) { + logger.error("Error parsing distance between plots , wrong value : " + dToPlotB,e); + EarthApp.showMessage("Attention: Check earth.properties file. The distance between sample point and border of the plot must be a number ! You have set it to : " + dToPlotB); //$NON-NLS-1$ return null; } + final String localPort = getLocalProperties().getLocalPort(); + final String numberOfSamplingPlots = getLocalProperties().getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT); + final String csvFile = getLocalProperties().getCsvFile(); + + int numberOfPoints = 25; + if ((numberOfSamplingPlots != null) && (numberOfSamplingPlots.trim().length() > 0)) { + numberOfPoints = parseInt(numberOfSamplingPlots.trim()); + } + + try{ + // If there is a polygon column then the type of plot shape is assumed to be POLYGON + if( csvContainsKml(csvFile)){ + plotShape = SAMPLE_SHAPE.KML_POLYGON; + }else if( csvContainsWkt(csvFile)){ + plotShape = SAMPLE_SHAPE.WKT_POLYGON; + }else if( csvContainsGeoJson(csvFile)){ + plotShape = SAMPLE_SHAPE.GEOJSON_POLYGON; + } + + if (plotShape.equals(SAMPLE_SHAPE.CIRCLE)) { + generateKml = new CircleKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, distanceBetweenSamplePoints ); + } else if (plotShape.equals(SAMPLE_SHAPE.NFMA)) { + generateKml = new NfmaKmlGenerator(crsSystem, hostAddress, localPort, 150, false); + } else if (plotShape.equals(SAMPLE_SHAPE.NFMA_250)) { + generateKml = new NfmaKmlGenerator(crsSystem, hostAddress, localPort, 250, true); + } else if (plotShape.equals(SAMPLE_SHAPE.NFI_THREE_CIRCLES)) { + + String dBP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS ); + float distanceBetweenPlots; + try { + distanceBetweenPlots = Float.parseFloat(dBP); + } catch (Exception e) { + logger.error("Error parsing distance between plots , wrong value : " + dBP,e); + EarthApp.showMessage("Attention: Check earth.properties file. The distance between plots must be a number! You have set it to : " + dBP); //$NON-NLS-1$ + return null; + } + + generateKml = new NfiThreeCirclesGenerator(crsSystem, hostAddress, localPort, innerPointSide, distanceBetweenSamplePoints, distanceBetweenPlots ); + }else if (plotShape.equals(SAMPLE_SHAPE.NFI_FOUR_CIRCLES)) { + + String dBP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS ); + float distanceBetweenPlots; + try { + distanceBetweenPlots = Float.parseFloat(dBP); + } catch (Exception e) { + logger.error(String.format("Error parsing distance between plots , wrong value : %s", dBP) ,e); + EarthApp.showMessage("Attention: Check earth.properties file. The distance between plots must be a number! You have set it to : " + dBP); //$NON-NLS-1$ + return null; + } + + generateKml = new NfiFourCirclesGenerator(crsSystem, hostAddress, localPort, innerPointSide, distanceBetweenSamplePoints, distanceBetweenPlots ); + }else if (plotShape.equals(SAMPLE_SHAPE.HEXAGON)) { + generateKml = new HexagonKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, distanceBetweenSamplePoints ); + } else if (plotShape.equals(SAMPLE_SHAPE.SQUARE_CIRCLE)) { + generateKml = new SquareWithCirclesKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, + distanceBetweenSamplePoints, distanceToPlotBoundaries); + } else if (plotShape.equals(SAMPLE_SHAPE.KML_POLYGON)) { + generateKml = new PolygonKmlGenerator(crsSystem, hostAddress, localPort); + } else if (plotShape.equals(SAMPLE_SHAPE.GEOJSON_POLYGON)) { + generateKml = new PolygonGeojsonGenerator(crsSystem, hostAddress, localPort); + }else if (plotShape.equals(SAMPLE_SHAPE.WKT_POLYGON)) { + generateKml = new PolygonWktGenerator(crsSystem, hostAddress, localPort); + }else { + generateKml = new SquareKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, + distanceBetweenSamplePoints, distanceToPlotBoundaries, largeCentralPlotSide, distanceToBuffers); + } + }catch(IOException e){ + logger.error("Error generating KML", e ); + } + + if( generateKml == null ) { + throw new KmlGenerationException("Error getting the KML generator for parameters " + plotShape.name() ); + } + + return generateKml; + } + + + private boolean csvContains(String csvFile, PolygonTest test ) throws IOException, CsvValidationException { + try( CSVReader csvReader = CsvReaderUtils.getCsvReader(csvFile) ){ + csvReader.readNext(); // Ignore it might be the column headers + + String[] secondLine = csvReader.readNext(); + if( secondLine != null && !CsvReaderUtils.onlyEmptyCells(secondLine) ){ + return test.isPolygon( secondLine ); + } + + return false; + } + } + + private boolean csvContainsGeoJson(String csvFile) throws IOException, CsvValidationException { + return + csvContains( + csvFile, + csvColumns -> new PolygonGeojsonGenerator(null, null, null ).isGeoJsonPolygonColumnFound(csvColumns) != null + ); + } + + private boolean csvContainsWkt(String csvFile) throws IOException, CsvValidationException { + return csvContains( + csvFile, + csvColumns -> new PolygonWktGenerator(null, null, null ).isWktPolygonColumnFound(csvColumns) != null + ); + } + + private boolean csvContainsKml(String csvFile) throws IOException, CsvValidationException { + return csvContains( + csvFile, + csvColumns -> new PolygonKmlGenerator(null, null, null ).isKmlPolygonColumnFound(csvColumns) != null + ); + } + + private void generateKml() throws KmlGenerationException, IOException, CsvValidationException { + + KmlGenerator kmlGenerator = null; + kmlGenerator = getKmlGenerator(); + + if ( kmlGenerator == null ){ + throw new KmlGenerationException("Error while generating KML"); + } + + final String csvFile = getLocalProperties().getCsvFile(); + String balloon = getLocalProperties().getBalloonFile(); + final String template = getLocalProperties().getTemplateFile(); + + // In case the user sets up the OPEN_BALLOON_IN_FIREFOX flag to + // true. Meaning that a small ballon opens in the placemark which in + // its turn + // opens a firefox browser with the real form + final Boolean openBalloonInFirefox = Boolean.valueOf(getLocalProperties().getValue(EarthProperty.OPEN_BALLOON_IN_BROWSER)); + if (Boolean.TRUE.equals( openBalloonInFirefox) ) { + String alternativeBalloon = getLocalProperties().getValue(EarthProperty.ALTERNATIVE_BALLOON_FOR_BROWSER); + if( !StringUtils.isBlank( alternativeBalloon ) ){ + balloon = alternativeBalloon; + } + } + + // Using all of the files that compose the final KML it is generated and stores in KML_RESULTING_TEMP_FILE + kmlGenerator.generateKmlFile(KML_RESULTING_TEMP_FILE, csvFile, balloon, template, earthSurveyService.getCollectSurvey()); + updateFilesUsedChecksum(); + + } + + private void updateFilesUsedChecksum() throws IOException { + final String csvFile = getLocalProperties().getCsvFile(); + final String balloon = getLocalProperties().getBalloonFile(); + final String template = getLocalProperties().getTemplateFile(); + + getLocalProperties().saveBalloonFileChecksum(CollectEarthUtils.getMd5FromFile(balloon)); + getLocalProperties().saveCsvFileCehcksum(CollectEarthUtils.getMd5FromFile(csvFile)); + getLocalProperties().saveTemplateFileChecksum(CollectEarthUtils.getMd5FromFile(template)); } + public void generateLoaderKmlFile() throws IOException, TemplateException { + + getLocalProperties().saveGeneratedOn(System.currentTimeMillis() + ""); //$NON-NLS-1$ + + final Map data = new HashMap<>(); + data.put("host", ServerController.getHostAddress(getLocalProperties().getHost(), getLocalProperties().getLocalPort())); //$NON-NLS-1$ + data.put("kmlGeneratedOn", getLocalProperties().getGeneratedOn()); //$NON-NLS-1$ + data.put("surveyName", getLocalProperties().getValue(EarthProperty.SURVEY_NAME)); //$NON-NLS-1$ + data.put("plotFileName", KmlGenerator.getCsvFileName(getLocalProperties().getValue(EarthProperty.SAMPLE_FILE))); //$NON-NLS-1$ + + FreemarkerTemplateUtils.applyTemplate(new File(KML_NETWORK_LINK_TEMPLATE), new File(KML_NETWORK_LINK_STARTER), data); + } + private boolean isKmlUpToDate() throws IOException { + + final String csvFile = getLocalProperties().getCsvFile(); + final String balloon = getLocalProperties().getBalloonFile(); + final String template = getLocalProperties().getTemplateFile(); + + boolean upToDate = true; + if (!getLocalProperties().getBalloonFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(balloon)) + || !getLocalProperties().getTemplateFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(template)) + || !getLocalProperties().getCsvFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(csvFile))) { + upToDate = false; + } + + final File kmzFile = new File(KmlGeneratorService.KMZ_FILE_PATH); + if (!kmzFile.exists()) { + upToDate = false; + } + + return upToDate; + + } + + public void generatePlacemarksKmzFile() throws IOException, KmlGenerationException, CsvValidationException { + generatePlacemarksKmzFile(false); + } + + public void generatePlacemarksKmzFile(boolean forceRegeneration ) throws IOException, KmlGenerationException, CsvValidationException { + + logger.info("START - Generate KMZ file"); //$NON-NLS-1$ + + if (forceRegeneration || !isKmlUpToDate()) { + + generateKml(); + + final KmzGenerator kmzGenerator = new KmzGenerator(); + + final String balloon = getLocalProperties().getBalloonFile(); + final File balloonFile = new File(balloon); + final String folderToInclude = balloonFile.getParent() + File.separator + EarthConstants.FOLDER_COPIED_TO_KMZ; + + kmzGenerator.generateKmzFile(KMZ_FILE_PATH, KML_RESULTING_TEMP_FILE, folderToInclude); + logger.info("KMZ File generated : {}", KMZ_FILE_PATH); //$NON-NLS-1$ + + copyContentsToGeneratedFolder(folderToInclude); + + final File kmlFile = new File(KML_RESULTING_TEMP_FILE); + if (kmlFile.exists()) { + final boolean deleted = kmlFile.delete(); + if (deleted) { + logger.info("KML File deleted : {}", KML_RESULTING_TEMP_FILE); //$NON-NLS-1$ + } else { + throw new IOException("The KML file could not be deleted at " + kmlFile.getPath()); //$NON-NLS-1$ + } + } + + } + logger.info("END - Generate KMZ file"); //$NON-NLS-1$ + } } From 740ea434e5d0fcd5b2115a29b65ea8d587a8788e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:34 +0100 Subject: [PATCH 1110/1620] New translations IPCCGeneratorService.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 482 +++--------------- 1 file changed, 68 insertions(+), 414 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 884dd929bc..c1b9c5db00 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,451 +1,105 @@ package org.openforis.collect.earth.app.service; -import java.io.File; -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; - -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.desktop.ServerController; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.app.view.Messages; -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.collect.earth.sampler.processor.CircleKmlGenerator; -import org.openforis.collect.earth.sampler.processor.HexagonKmlGenerator; -import org.openforis.collect.earth.sampler.processor.KmlGenerator; -import org.openforis.collect.earth.sampler.processor.KmzGenerator; -import org.openforis.collect.earth.sampler.processor.NfiFourCirclesGenerator; -import org.openforis.collect.earth.sampler.processor.NfiThreeCirclesGenerator; -import org.openforis.collect.earth.sampler.processor.NfmaKmlGenerator; -import org.openforis.collect.earth.sampler.processor.PolygonGeojsonGenerator; -import org.openforis.collect.earth.sampler.processor.PolygonKmlGenerator; -import org.openforis.collect.earth.sampler.processor.PolygonWktGenerator; -import org.openforis.collect.earth.sampler.processor.SquareKmlGenerator; -import org.openforis.collect.earth.sampler.processor.SquareWithCirclesKmlGenerator; -import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; -import org.openforis.collect.earth.sampler.utils.KmlGenerationException; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.ipcc.IPCCGenerator; +import org.openforis.collect.earth.ipcc.IPCCGeneratorException; +import org.openforis.collect.earth.ipcc.RdbExportException; +import org.openforis.collect.model.CollectSurvey; +import org.openforis.collect.relational.CollectRDBPublisher; +import org.openforis.collect.relational.CollectRdbException; +import org.openforis.idm.metamodel.NodeDefinition; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.opencsv.CSVReader; -import com.opencsv.exceptions.CsvValidationException; - -import freemarker.template.TemplateException; - @Component -public class KmlGeneratorService { +public class IPCCGeneratorService extends GenerateDatabase{ @Autowired - LocalPropertiesService localPropertiesService; + RDBExporter rdbExporter; + + @Autowired + CollectRDBPublisher collectRDBPublisher; @Autowired EarthSurveyService earthSurveyService; - Logger logger = LoggerFactory.getLogger(KmlGeneratorService.class); - - public static final String KML_RESULTING_TEMP_FILE = EarthConstants.GENERATED_FOLDER + File.separator + "plots.kml"; //$NON-NLS-1$ - public static final String KMZ_FILE_PATH = EarthConstants.GENERATED_FOLDER + File.separator + "gePlugin.kmz"; //$NON-NLS-1$ - public static final String KML_NETWORK_LINK_TEMPLATE = "resources/loadApp.fmt"; //$NON-NLS-1$ - public static final String KML_NETWORK_LINK_STARTER = EarthConstants.GENERATED_FOLDER + "/loadApp.kml"; //$NON-NLS-1$ - - public static interface PolygonTest{ - Boolean isPolygon(String[] strColumns); - } - - public void generateKmlFile() throws IOException, KmlGenerationException, CsvValidationException{ - checkFilesExist(); - generatePlacemarksKmzFile(); - - } - - private void checkFilesExist() throws KmlGenerationException { - - fixUserDirectory(); - - final String csvFilePath = getLocalProperties().getCsvFile(); - final String balloonPath = getLocalProperties().getBalloonFile(); - final String templatePath = getLocalProperties().getTemplateFile(); - boolean filesExist = true; - String errorMessage = "Error generating the KML file for Google Earth.
"; //$NON-NLS-1$ - File csvFile = null; - File balloon = null; - File template = null; - try { - csvFile = new File(csvFilePath); - balloon = new File(balloonPath); - template = new File(templatePath); - } catch (final Exception e) { - logger.error("One of the definition files is not defined", e); //$NON-NLS-1$ - } - if (csvFile != null && !csvFile.exists()) { - errorMessage += Messages.getString("EarthApp.21") //$NON-NLS-1$ - + csvFile.getAbsolutePath() + "

"; //$NON-NLS-1$ - filesExist = false; - } else if (csvFile == null) { - errorMessage += Messages.getString("EarthApp.23"); //$NON-NLS-1$ - filesExist = false; - } - - if (template != null && !template.exists()) { - errorMessage += Messages.getString("EarthApp.24") //$NON-NLS-1$ - + template.getAbsolutePath() + "

"; //$NON-NLS-1$ - filesExist = false; - } else if (template == null) { - errorMessage += Messages.getString("EarthApp.26"); //$NON-NLS-1$ - filesExist = false; - } - - if (balloon != null && !balloon.exists()) { - errorMessage += Messages.getString("EarthApp.27") + balloon.getAbsolutePath() //$NON-NLS-1$ - + "

"; //$NON-NLS-1$ - filesExist = false; - } else if (balloon == null) { - errorMessage += Messages.getString("EarthApp.29"); //$NON-NLS-1$ - filesExist = false; - } - - errorMessage += Messages.getString("EarthApp.30"); //$NON-NLS-1$ - - if( !filesExist ){ - throw new KmlGenerationException(errorMessage); - } - } - - private LocalPropertiesService getLocalProperties() { - return localPropertiesService; - } - - private void copyContentsToGeneratedFolder(String folderToInclude) throws IOException { - final File sourceDir = new File(folderToInclude); - final File targetDir = new File(EarthConstants.GENERATED_FOLDER + File.separator + sourceDir.getName()); - FileUtils.copyDirectory(sourceDir, targetDir); - } - - private void fixUserDirectory() { - final String csvFilePath = getLocalProperties().getCsvFile(); - final String balloonPath = getLocalProperties().getBalloonFile(); - final String templatePath = getLocalProperties().getTemplateFile(); - final String metadataPath = getLocalProperties().getImdFile(); - - File csvFile = null; - File balloon = null; - File template = null; - File idmFile = null; - try { - csvFile = new File(csvFilePath); - balloon = new File(balloonPath); - template = new File(templatePath); - idmFile = new File(metadataPath); - - final String prefixUserFolder = FolderFinder.getCollectEarthDataFolder() + File.separator; - - if (!csvFile.exists()) { - final File otherFile = new File(prefixUserFolder + getLocalProperties().getCsvFile()); - if (otherFile.exists()) { - getLocalProperties().setValue(EarthProperty.SAMPLE_FILE, otherFile.getAbsolutePath()); - } - } - - if (!balloon.exists()) { - final File otherFile = new File(prefixUserFolder + getLocalProperties().getBalloonFile()); - if (otherFile.exists()) { - getLocalProperties().setValue(EarthProperty.BALLOON_TEMPLATE_KEY, otherFile.getAbsolutePath()); - } - } - - if (!template.exists()) { - final File otherFile = new File(prefixUserFolder + getLocalProperties().getTemplateFile()); - if (otherFile.exists()) { - getLocalProperties().setValue(EarthProperty.KML_TEMPLATE_KEY, otherFile.getAbsolutePath()); - } - } - - if (!idmFile.exists()) { - final File otherFile = new File(prefixUserFolder + getLocalProperties().getImdFile()); - if (otherFile.exists()) { - getLocalProperties().setValue(EarthProperty.METADATA_FILE, otherFile.getAbsolutePath()); - } - } - - } catch (final Exception e) { - logger.error("One of the definition files is not defined", e); //$NON-NLS-1$ - } - - } - - - private int parseInt( String intNumber ){ - int i = 0; - try{ - if( StringUtils.isNoneBlank( intNumber ) ) { - i = Integer.parseInt( intNumber ); - } - }catch(Exception e){ - logger.error( "Error parsing integer number" ); - } - return i; - } - - public KmlGenerator getKmlGenerator() throws KmlGenerationException, CsvValidationException { - KmlGenerator generateKml =null; + @Autowired + public LocalPropertiesService localPropertiesService; - final String crsSystem = getLocalProperties().getCrs(); - final Integer innerPointSide = parseInt(getLocalProperties().getValue(EarthProperty.INNER_SUBPLOT_SIDE)); - final Integer largeCentralPlotSide = parseInt(getLocalProperties().getValue(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)); - final String distanceToBuffers = getLocalProperties().getValue(EarthProperty.DISTANCE_TO_BUFFERS); - SAMPLE_SHAPE plotShape = getLocalProperties().getSampleShape(); - final String hostAddress = ServerController.getHostAddress(getLocalProperties().getHost(), getLocalProperties().getPort()); + @Autowired + BrowserService browserService; - final float distanceBetweenSamplePoints; - final float distanceToPlotBoundaries; - String dBSP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS); - try { - distanceBetweenSamplePoints = Float.parseFloat(dBSP); - } catch (Exception e) { - logger.error("Error parsing distance between sample points , wrong value : " + dBSP,e); - EarthApp.showMessage("Attention: Check earth.properties file. The distance between sample points must be a number! You have set it to : " + dBSP); //$NON-NLS-1$ - return null; - } + @Autowired + private IPCCGenerator ipccGenerator; + + final Logger logger = LoggerFactory.getLogger(IPCCGeneratorService.class); + public void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws RdbExportException { - String dToPlotB = getLocalProperties().getValue(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES); try { - distanceToPlotBoundaries = Float.parseFloat(dToPlotB); - } catch (Exception e) { - logger.error("Error parsing distance between plots , wrong value : " + dToPlotB,e); - EarthApp.showMessage("Attention: Check earth.properties file. The distance between sample point and border of the plot must be a number ! You have set it to : " + dToPlotB); //$NON-NLS-1$ - return null; - } - final String localPort = getLocalProperties().getLocalPort(); - final String numberOfSamplingPlots = getLocalProperties().getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT); - final String csvFile = getLocalProperties().getCsvFile(); - - int numberOfPoints = 25; - if ((numberOfSamplingPlots != null) && (numberOfSamplingPlots.trim().length() > 0)) { - numberOfPoints = parseInt(numberOfSamplingPlots.trim()); - } - - try{ - // If there is a polygon column then the type of plot shape is assumed to be POLYGON - if( csvContainsKml(csvFile)){ - plotShape = SAMPLE_SHAPE.KML_POLYGON; - }else if( csvContainsWkt(csvFile)){ - plotShape = SAMPLE_SHAPE.WKT_POLYGON; - }else if( csvContainsGeoJson(csvFile)){ - plotShape = SAMPLE_SHAPE.GEOJSON_POLYGON; - } - - if (plotShape.equals(SAMPLE_SHAPE.CIRCLE)) { - generateKml = new CircleKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, distanceBetweenSamplePoints ); - } else if (plotShape.equals(SAMPLE_SHAPE.NFMA)) { - generateKml = new NfmaKmlGenerator(crsSystem, hostAddress, localPort, 150, false); - } else if (plotShape.equals(SAMPLE_SHAPE.NFMA_250)) { - generateKml = new NfmaKmlGenerator(crsSystem, hostAddress, localPort, 250, true); - } else if (plotShape.equals(SAMPLE_SHAPE.NFI_THREE_CIRCLES)) { - - String dBP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS ); - float distanceBetweenPlots; - try { - distanceBetweenPlots = Float.parseFloat(dBP); - } catch (Exception e) { - logger.error("Error parsing distance between plots , wrong value : " + dBP,e); - EarthApp.showMessage("Attention: Check earth.properties file. The distance between plots must be a number! You have set it to : " + dBP); //$NON-NLS-1$ - return null; - } - - generateKml = new NfiThreeCirclesGenerator(crsSystem, hostAddress, localPort, innerPointSide, distanceBetweenSamplePoints, distanceBetweenPlots ); - }else if (plotShape.equals(SAMPLE_SHAPE.NFI_FOUR_CIRCLES)) { - String dBP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS ); - float distanceBetweenPlots; - try { - distanceBetweenPlots = Float.parseFloat(dBP); - } catch (Exception e) { - logger.error(String.format("Error parsing distance between plots , wrong value : %s", dBP) ,e); - EarthApp.showMessage("Attention: Check earth.properties file. The distance between plots must be a number! You have set it to : " + dBP); //$NON-NLS-1$ - return null; + try { + + if ( + (localPropertiesService.isUsingSqliteDB() && !getZippedProjectDB( ExportType.IPCC ).exists()) + || + isRefreshDatabase() + ) { + + // The user clicked on the option to refresh the database, or there is no + // previous copy of the Saiku DB + // Generate the DB file + ipccGenerator.generateRDB( earthSurveyService.getCollectSurvey(), progressListener); + + try { + // Save the DB file in a zipped file to extends GenerateDatabase keep for the next usages + replaceZippedProjectDB( ExportType.IPCC ); + } catch (Exception e) { + logger.error("Error while refreshing the Zipped content of the project IPCC DB", e); + } + + } else if (getZippedProjectDB(ExportType.IPCC).exists()) { + // If the zipped version of the project exists ( and the user clicked on the + // option to not refresh it) then restore this last version of the data + if (localPropertiesService.isUsingSqliteDB()) { + restoreZippedProjectDB(ExportType.IPCC); + } } + + ipccGenerator.produceOutputs( earthSurveyService.getCollectSurvey(), progressListener ); - generateKml = new NfiFourCirclesGenerator(crsSystem, hostAddress, localPort, innerPointSide, distanceBetweenSamplePoints, distanceBetweenPlots ); - }else if (plotShape.equals(SAMPLE_SHAPE.HEXAGON)) { - generateKml = new HexagonKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, distanceBetweenSamplePoints ); - } else if (plotShape.equals(SAMPLE_SHAPE.SQUARE_CIRCLE)) { - generateKml = new SquareWithCirclesKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, - distanceBetweenSamplePoints, distanceToPlotBoundaries); - } else if (plotShape.equals(SAMPLE_SHAPE.KML_POLYGON)) { - generateKml = new PolygonKmlGenerator(crsSystem, hostAddress, localPort); - } else if (plotShape.equals(SAMPLE_SHAPE.GEOJSON_POLYGON)) { - generateKml = new PolygonGeojsonGenerator(crsSystem, hostAddress, localPort); - }else if (plotShape.equals(SAMPLE_SHAPE.WKT_POLYGON)) { - generateKml = new PolygonWktGenerator(crsSystem, hostAddress, localPort); - }else { - generateKml = new SquareKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, - distanceBetweenSamplePoints, distanceToPlotBoundaries, largeCentralPlotSide, distanceToBuffers); - } - }catch(IOException e){ - logger.error("Error generating KML", e ); - } + } catch (final IPCCGeneratorException e) { + logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ + } - if( generateKml == null ) { - throw new KmlGenerationException("Error getting the KML generator for parameters " + plotShape.name() ); + } catch (final CollectRdbException e) { + logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ } - - return generateKml; } - private boolean csvContains(String csvFile, PolygonTest test ) throws IOException, CsvValidationException { - try( CSVReader csvReader = CsvReaderUtils.getCsvReader(csvFile) ){ - csvReader.readNext(); // Ignore it might be the column headers - - String[] secondLine = csvReader.readNext(); - if( secondLine != null && !CsvReaderUtils.onlyEmptyCells(secondLine) ){ - return test.isPolygon( secondLine ); - } - - return false; - } - } - - private boolean csvContainsGeoJson(String csvFile) throws IOException, CsvValidationException { - return - csvContains( - csvFile, - csvColumns -> new PolygonGeojsonGenerator(null, null, null ).isGeoJsonPolygonColumnFound(csvColumns) != null - ); - } - - private boolean csvContainsWkt(String csvFile) throws IOException, CsvValidationException { - return csvContains( - csvFile, - csvColumns -> new PolygonWktGenerator(null, null, null ).isWktPolygonColumnFound(csvColumns) != null - ); - } - - private boolean csvContainsKml(String csvFile) throws IOException, CsvValidationException { - return csvContains( - csvFile, - csvColumns -> new PolygonKmlGenerator(null, null, null ).isKmlPolygonColumnFound(csvColumns) != null - ); - } - - private void generateKml() throws KmlGenerationException, IOException, CsvValidationException { - - KmlGenerator kmlGenerator = null; - kmlGenerator = getKmlGenerator(); - - if ( kmlGenerator == null ){ - throw new KmlGenerationException("Error while generating KML"); - } - - final String csvFile = getLocalProperties().getCsvFile(); - String balloon = getLocalProperties().getBalloonFile(); - final String template = getLocalProperties().getTemplateFile(); - - // In case the user sets up the OPEN_BALLOON_IN_FIREFOX flag to - // true. Meaning that a small ballon opens in the placemark which in - // its turn - // opens a firefox browser with the real form - final Boolean openBalloonInFirefox = Boolean.valueOf(getLocalProperties().getValue(EarthProperty.OPEN_BALLOON_IN_BROWSER)); - if (Boolean.TRUE.equals( openBalloonInFirefox) ) { - String alternativeBalloon = getLocalProperties().getValue(EarthProperty.ALTERNATIVE_BALLOON_FOR_BROWSER); - if( !StringUtils.isBlank( alternativeBalloon ) ){ - balloon = alternativeBalloon; - } - } - - // Using all of the files that compose the final KML it is generated and stores in KML_RESULTING_TEMP_FILE - kmlGenerator.generateKmlFile(KML_RESULTING_TEMP_FILE, csvFile, balloon, template, earthSurveyService.getCollectSurvey()); - updateFilesUsedChecksum(); + public static boolean surveyContains(String nodeName, CollectSurvey survey) { + NodeDefinition nodeDefForNAme = survey.getSchema().findNodeDefinition( nodeDef -> nodeDef.getName().equals(nodeName) ); + return nodeDefForNAme != null; } - private void updateFilesUsedChecksum() throws IOException { - final String csvFile = getLocalProperties().getCsvFile(); - final String balloon = getLocalProperties().getBalloonFile(); - final String template = getLocalProperties().getTemplateFile(); - getLocalProperties().saveBalloonFileChecksum(CollectEarthUtils.getMd5FromFile(balloon)); - getLocalProperties().saveCsvFileCehcksum(CollectEarthUtils.getMd5FromFile(csvFile)); - getLocalProperties().saveTemplateFileChecksum(CollectEarthUtils.getMd5FromFile(template)); + @Override + public LocalPropertiesService getLocalPropertiesService() { + return localPropertiesService; } - public void generateLoaderKmlFile() throws IOException, TemplateException { - - getLocalProperties().saveGeneratedOn(System.currentTimeMillis() + ""); //$NON-NLS-1$ - - final Map data = new HashMap<>(); - data.put("host", ServerController.getHostAddress(getLocalProperties().getHost(), getLocalProperties().getLocalPort())); //$NON-NLS-1$ - data.put("kmlGeneratedOn", getLocalProperties().getGeneratedOn()); //$NON-NLS-1$ - data.put("surveyName", getLocalProperties().getValue(EarthProperty.SURVEY_NAME)); //$NON-NLS-1$ - data.put("plotFileName", KmlGenerator.getCsvFileName(getLocalProperties().getValue(EarthProperty.SAMPLE_FILE))); //$NON-NLS-1$ - - FreemarkerTemplateUtils.applyTemplate(new File(KML_NETWORK_LINK_TEMPLATE), new File(KML_NETWORK_LINK_STARTER), data); + @Override + public EarthSurveyService getEarthSurveyService() { + return earthSurveyService; } - private boolean isKmlUpToDate() throws IOException { - - final String csvFile = getLocalProperties().getCsvFile(); - final String balloon = getLocalProperties().getBalloonFile(); - final String template = getLocalProperties().getTemplateFile(); - - boolean upToDate = true; - if (!getLocalProperties().getBalloonFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(balloon)) - || !getLocalProperties().getTemplateFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(template)) - || !getLocalProperties().getCsvFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(csvFile))) { - upToDate = false; - } - - final File kmzFile = new File(KmlGeneratorService.KMZ_FILE_PATH); - if (!kmzFile.exists()) { - upToDate = false; - } - - return upToDate; - + @Override + public RDBExporter getRdbExporter() { + return rdbExporter; } - public void generatePlacemarksKmzFile() throws IOException, KmlGenerationException, CsvValidationException { - generatePlacemarksKmzFile(false); - } - - public void generatePlacemarksKmzFile(boolean forceRegeneration ) throws IOException, KmlGenerationException, CsvValidationException { - - logger.info("START - Generate KMZ file"); //$NON-NLS-1$ - - if (forceRegeneration || !isKmlUpToDate()) { - - generateKml(); - - final KmzGenerator kmzGenerator = new KmzGenerator(); - - final String balloon = getLocalProperties().getBalloonFile(); - final File balloonFile = new File(balloon); - final String folderToInclude = balloonFile.getParent() + File.separator + EarthConstants.FOLDER_COPIED_TO_KMZ; - - kmzGenerator.generateKmzFile(KMZ_FILE_PATH, KML_RESULTING_TEMP_FILE, folderToInclude); - logger.info("KMZ File generated : {}", KMZ_FILE_PATH); //$NON-NLS-1$ - - copyContentsToGeneratedFolder(folderToInclude); - - final File kmlFile = new File(KML_RESULTING_TEMP_FILE); - if (kmlFile.exists()) { - final boolean deleted = kmlFile.delete(); - if (deleted) { - logger.info("KML File deleted : {}", KML_RESULTING_TEMP_FILE); //$NON-NLS-1$ - } else { - throw new IOException("The KML file could not be deleted at " + kmlFile.getPath()); //$NON-NLS-1$ - } - } - - } - logger.info("END - Generate KMZ file"); //$NON-NLS-1$ - } -} +} \ No newline at end of file From d389fa3327d256916d90b24818189de486cef109 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:36 +0100 Subject: [PATCH 1111/1620] New translations PreloadedFilesService.java (English) --- .../earth/app/view/Messages_en.properties | 455 +----------------- 1 file changed, 23 insertions(+), 432 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 884dd929bc..8d225e803d 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -2,450 +2,41 @@ package org.openforis.collect.earth.app.service; import java.io.File; import java.io.IOException; -import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.desktop.ServerController; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.app.view.Messages; -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.collect.earth.sampler.processor.CircleKmlGenerator; -import org.openforis.collect.earth.sampler.processor.HexagonKmlGenerator; -import org.openforis.collect.earth.sampler.processor.KmlGenerator; -import org.openforis.collect.earth.sampler.processor.KmzGenerator; -import org.openforis.collect.earth.sampler.processor.NfiFourCirclesGenerator; -import org.openforis.collect.earth.sampler.processor.NfiThreeCirclesGenerator; -import org.openforis.collect.earth.sampler.processor.NfmaKmlGenerator; -import org.openforis.collect.earth.sampler.processor.PolygonGeojsonGenerator; -import org.openforis.collect.earth.sampler.processor.PolygonKmlGenerator; -import org.openforis.collect.earth.sampler.processor.PolygonWktGenerator; -import org.openforis.collect.earth.sampler.processor.SquareKmlGenerator; -import org.openforis.collect.earth.sampler.processor.SquareWithCirclesKmlGenerator; -import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; -import org.openforis.collect.earth.sampler.utils.KmlGenerationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.opencsv.CSVReader; -import com.opencsv.exceptions.CsvValidationException; - -import freemarker.template.TemplateException; - +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ @Component -public class KmlGeneratorService { - - @Autowired - LocalPropertiesService localPropertiesService; - - @Autowired - EarthSurveyService earthSurveyService; - - Logger logger = LoggerFactory.getLogger(KmlGeneratorService.class); - - public static final String KML_RESULTING_TEMP_FILE = EarthConstants.GENERATED_FOLDER + File.separator + "plots.kml"; //$NON-NLS-1$ - public static final String KMZ_FILE_PATH = EarthConstants.GENERATED_FOLDER + File.separator + "gePlugin.kmz"; //$NON-NLS-1$ - public static final String KML_NETWORK_LINK_TEMPLATE = "resources/loadApp.fmt"; //$NON-NLS-1$ - public static final String KML_NETWORK_LINK_STARTER = EarthConstants.GENERATED_FOLDER + "/loadApp.kml"; //$NON-NLS-1$ - - public static interface PolygonTest{ - Boolean isPolygon(String[] strColumns); - } - - public void generateKmlFile() throws IOException, KmlGenerationException, CsvValidationException{ - checkFilesExist(); - generatePlacemarksKmzFile(); - - } - - private void checkFilesExist() throws KmlGenerationException { - - fixUserDirectory(); - - final String csvFilePath = getLocalProperties().getCsvFile(); - final String balloonPath = getLocalProperties().getBalloonFile(); - final String templatePath = getLocalProperties().getTemplateFile(); - boolean filesExist = true; - String errorMessage = "Error generating the KML file for Google Earth.
"; //$NON-NLS-1$ - File csvFile = null; - File balloon = null; - File template = null; - try { - csvFile = new File(csvFilePath); - balloon = new File(balloonPath); - template = new File(templatePath); - } catch (final Exception e) { - logger.error("One of the definition files is not defined", e); //$NON-NLS-1$ - } - if (csvFile != null && !csvFile.exists()) { - errorMessage += Messages.getString("EarthApp.21") //$NON-NLS-1$ - + csvFile.getAbsolutePath() + "

"; //$NON-NLS-1$ - filesExist = false; - } else if (csvFile == null) { - errorMessage += Messages.getString("EarthApp.23"); //$NON-NLS-1$ - filesExist = false; - } - - if (template != null && !template.exists()) { - errorMessage += Messages.getString("EarthApp.24") //$NON-NLS-1$ - + template.getAbsolutePath() + "

"; //$NON-NLS-1$ - filesExist = false; - } else if (template == null) { - errorMessage += Messages.getString("EarthApp.26"); //$NON-NLS-1$ - filesExist = false; - } - - if (balloon != null && !balloon.exists()) { - errorMessage += Messages.getString("EarthApp.27") + balloon.getAbsolutePath() //$NON-NLS-1$ - + "

"; //$NON-NLS-1$ - filesExist = false; - } else if (balloon == null) { - errorMessage += Messages.getString("EarthApp.29"); //$NON-NLS-1$ - filesExist = false; - } - - errorMessage += Messages.getString("EarthApp.30"); //$NON-NLS-1$ - - if( !filesExist ){ - throw new KmlGenerationException(errorMessage); - } - } - - private LocalPropertiesService getLocalProperties() { - return localPropertiesService; - } - - private void copyContentsToGeneratedFolder(String folderToInclude) throws IOException { - final File sourceDir = new File(folderToInclude); - final File targetDir = new File(EarthConstants.GENERATED_FOLDER + File.separator + sourceDir.getName()); - FileUtils.copyDirectory(sourceDir, targetDir); - } - - private void fixUserDirectory() { - final String csvFilePath = getLocalProperties().getCsvFile(); - final String balloonPath = getLocalProperties().getBalloonFile(); - final String templatePath = getLocalProperties().getTemplateFile(); - final String metadataPath = getLocalProperties().getImdFile(); - - File csvFile = null; - File balloon = null; - File template = null; - File idmFile = null; - try { - csvFile = new File(csvFilePath); - balloon = new File(balloonPath); - template = new File(templatePath); - idmFile = new File(metadataPath); - - final String prefixUserFolder = FolderFinder.getCollectEarthDataFolder() + File.separator; - - if (!csvFile.exists()) { - final File otherFile = new File(prefixUserFolder + getLocalProperties().getCsvFile()); - if (otherFile.exists()) { - getLocalProperties().setValue(EarthProperty.SAMPLE_FILE, otherFile.getAbsolutePath()); - } - } - - if (!balloon.exists()) { - final File otherFile = new File(prefixUserFolder + getLocalProperties().getBalloonFile()); - if (otherFile.exists()) { - getLocalProperties().setValue(EarthProperty.BALLOON_TEMPLATE_KEY, otherFile.getAbsolutePath()); - } - } - - if (!template.exists()) { - final File otherFile = new File(prefixUserFolder + getLocalProperties().getTemplateFile()); - if (otherFile.exists()) { - getLocalProperties().setValue(EarthProperty.KML_TEMPLATE_KEY, otherFile.getAbsolutePath()); - } - } - - if (!idmFile.exists()) { - final File otherFile = new File(prefixUserFolder + getLocalProperties().getImdFile()); - if (otherFile.exists()) { - getLocalProperties().setValue(EarthProperty.METADATA_FILE, otherFile.getAbsolutePath()); - } - } - - } catch (final Exception e) { - logger.error("One of the definition files is not defined", e); //$NON-NLS-1$ - } - - } - - - private int parseInt( String intNumber ){ - int i = 0; - try{ - if( StringUtils.isNoneBlank( intNumber ) ) { - i = Integer.parseInt( intNumber ); - } - }catch(Exception e){ - logger.error( "Error parsing integer number" ); - } - return i; - } - - public KmlGenerator getKmlGenerator() throws KmlGenerationException, CsvValidationException { - KmlGenerator generateKml =null; - - final String crsSystem = getLocalProperties().getCrs(); - final Integer innerPointSide = parseInt(getLocalProperties().getValue(EarthProperty.INNER_SUBPLOT_SIDE)); - final Integer largeCentralPlotSide = parseInt(getLocalProperties().getValue(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)); - final String distanceToBuffers = getLocalProperties().getValue(EarthProperty.DISTANCE_TO_BUFFERS); - SAMPLE_SHAPE plotShape = getLocalProperties().getSampleShape(); - final String hostAddress = ServerController.getHostAddress(getLocalProperties().getHost(), getLocalProperties().getPort()); - - final float distanceBetweenSamplePoints; - final float distanceToPlotBoundaries; - String dBSP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS); - try { - distanceBetweenSamplePoints = Float.parseFloat(dBSP); - } catch (Exception e) { - logger.error("Error parsing distance between sample points , wrong value : " + dBSP,e); - EarthApp.showMessage("Attention: Check earth.properties file. The distance between sample points must be a number! You have set it to : " + dBSP); //$NON-NLS-1$ - return null; - } - - - String dToPlotB = getLocalProperties().getValue(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES); - try { - distanceToPlotBoundaries = Float.parseFloat(dToPlotB); - } catch (Exception e) { - logger.error("Error parsing distance between plots , wrong value : " + dToPlotB,e); - EarthApp.showMessage("Attention: Check earth.properties file. The distance between sample point and border of the plot must be a number ! You have set it to : " + dToPlotB); //$NON-NLS-1$ - return null; - } - final String localPort = getLocalProperties().getLocalPort(); - final String numberOfSamplingPlots = getLocalProperties().getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT); - final String csvFile = getLocalProperties().getCsvFile(); - - int numberOfPoints = 25; - if ((numberOfSamplingPlots != null) && (numberOfSamplingPlots.trim().length() > 0)) { - numberOfPoints = parseInt(numberOfSamplingPlots.trim()); - } - - try{ - // If there is a polygon column then the type of plot shape is assumed to be POLYGON - if( csvContainsKml(csvFile)){ - plotShape = SAMPLE_SHAPE.KML_POLYGON; - }else if( csvContainsWkt(csvFile)){ - plotShape = SAMPLE_SHAPE.WKT_POLYGON; - }else if( csvContainsGeoJson(csvFile)){ - plotShape = SAMPLE_SHAPE.GEOJSON_POLYGON; - } - - if (plotShape.equals(SAMPLE_SHAPE.CIRCLE)) { - generateKml = new CircleKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, distanceBetweenSamplePoints ); - } else if (plotShape.equals(SAMPLE_SHAPE.NFMA)) { - generateKml = new NfmaKmlGenerator(crsSystem, hostAddress, localPort, 150, false); - } else if (plotShape.equals(SAMPLE_SHAPE.NFMA_250)) { - generateKml = new NfmaKmlGenerator(crsSystem, hostAddress, localPort, 250, true); - } else if (plotShape.equals(SAMPLE_SHAPE.NFI_THREE_CIRCLES)) { +public class PreloadedFilesService { - String dBP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS ); - float distanceBetweenPlots; - try { - distanceBetweenPlots = Float.parseFloat(dBP); - } catch (Exception e) { - logger.error("Error parsing distance between plots , wrong value : " + dBP,e); - EarthApp.showMessage("Attention: Check earth.properties file. The distance between plots must be a number! You have set it to : " + dBP); //$NON-NLS-1$ - return null; - } + private final Logger logger = LoggerFactory.getLogger(PreloadedFilesService.class); - generateKml = new NfiThreeCirclesGenerator(crsSystem, hostAddress, localPort, innerPointSide, distanceBetweenSamplePoints, distanceBetweenPlots ); - }else if (plotShape.equals(SAMPLE_SHAPE.NFI_FOUR_CIRCLES)) { - - String dBP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS ); - float distanceBetweenPlots; - try { - distanceBetweenPlots = Float.parseFloat(dBP); - } catch (Exception e) { - logger.error(String.format("Error parsing distance between plots , wrong value : %s", dBP) ,e); - EarthApp.showMessage("Attention: Check earth.properties file. The distance between plots must be a number! You have set it to : " + dBP); //$NON-NLS-1$ - return null; - } - - generateKml = new NfiFourCirclesGenerator(crsSystem, hostAddress, localPort, innerPointSide, distanceBetweenSamplePoints, distanceBetweenPlots ); - }else if (plotShape.equals(SAMPLE_SHAPE.HEXAGON)) { - generateKml = new HexagonKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, distanceBetweenSamplePoints ); - } else if (plotShape.equals(SAMPLE_SHAPE.SQUARE_CIRCLE)) { - generateKml = new SquareWithCirclesKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, - distanceBetweenSamplePoints, distanceToPlotBoundaries); - } else if (plotShape.equals(SAMPLE_SHAPE.KML_POLYGON)) { - generateKml = new PolygonKmlGenerator(crsSystem, hostAddress, localPort); - } else if (plotShape.equals(SAMPLE_SHAPE.GEOJSON_POLYGON)) { - generateKml = new PolygonGeojsonGenerator(crsSystem, hostAddress, localPort); - }else if (plotShape.equals(SAMPLE_SHAPE.WKT_POLYGON)) { - generateKml = new PolygonWktGenerator(crsSystem, hostAddress, localPort); - }else { - generateKml = new SquareKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, - distanceBetweenSamplePoints, distanceToPlotBoundaries, largeCentralPlotSide, distanceToBuffers); - } - }catch(IOException e){ - logger.error("Error generating KML", e ); - } - - if( generateKml == null ) { - throw new KmlGenerationException("Error getting the KML generator for parameters " + plotShape.name() ); - } - - return generateKml; - } - - - private boolean csvContains(String csvFile, PolygonTest test ) throws IOException, CsvValidationException { - try( CSVReader csvReader = CsvReaderUtils.getCsvReader(csvFile) ){ - csvReader.readNext(); // Ignore it might be the column headers - - String[] secondLine = csvReader.readNext(); - if( secondLine != null && !CsvReaderUtils.onlyEmptyCells(secondLine) ){ - return test.isPolygon( secondLine ); - } - - return false; - } - } - - private boolean csvContainsGeoJson(String csvFile) throws IOException, CsvValidationException { - return - csvContains( - csvFile, - csvColumns -> new PolygonGeojsonGenerator(null, null, null ).isGeoJsonPolygonColumnFound(csvColumns) != null - ); - } - - private boolean csvContainsWkt(String csvFile) throws IOException, CsvValidationException { - return csvContains( - csvFile, - csvColumns -> new PolygonWktGenerator(null, null, null ).isWktPolygonColumnFound(csvColumns) != null - ); - } - - private boolean csvContainsKml(String csvFile) throws IOException, CsvValidationException { - return csvContains( - csvFile, - csvColumns -> new PolygonKmlGenerator(null, null, null ).isKmlPolygonColumnFound(csvColumns) != null - ); - } - - private void generateKml() throws KmlGenerationException, IOException, CsvValidationException { - - KmlGenerator kmlGenerator = null; - kmlGenerator = getKmlGenerator(); - - if ( kmlGenerator == null ){ - throw new KmlGenerationException("Error while generating KML"); - } - - final String csvFile = getLocalProperties().getCsvFile(); - String balloon = getLocalProperties().getBalloonFile(); - final String template = getLocalProperties().getTemplateFile(); - - // In case the user sets up the OPEN_BALLOON_IN_FIREFOX flag to - // true. Meaning that a small ballon opens in the placemark which in - // its turn - // opens a firefox browser with the real form - final Boolean openBalloonInFirefox = Boolean.valueOf(getLocalProperties().getValue(EarthProperty.OPEN_BALLOON_IN_BROWSER)); - if (Boolean.TRUE.equals( openBalloonInFirefox) ) { - String alternativeBalloon = getLocalProperties().getValue(EarthProperty.ALTERNATIVE_BALLOON_FOR_BROWSER); - if( !StringUtils.isBlank( alternativeBalloon ) ){ - balloon = alternativeBalloon; - } - } - - // Using all of the files that compose the final KML it is generated and stores in KML_RESULTING_TEMP_FILE - kmlGenerator.generateKmlFile(KML_RESULTING_TEMP_FILE, csvFile, balloon, template, earthSurveyService.getCollectSurvey()); - updateFilesUsedChecksum(); - - } - - private void updateFilesUsedChecksum() throws IOException { - final String csvFile = getLocalProperties().getCsvFile(); - final String balloon = getLocalProperties().getBalloonFile(); - final String template = getLocalProperties().getTemplateFile(); - - getLocalProperties().saveBalloonFileChecksum(CollectEarthUtils.getMd5FromFile(balloon)); - getLocalProperties().saveCsvFileCehcksum(CollectEarthUtils.getMd5FromFile(csvFile)); - getLocalProperties().saveTemplateFileChecksum(CollectEarthUtils.getMd5FromFile(template)); - } - - public void generateLoaderKmlFile() throws IOException, TemplateException { - - getLocalProperties().saveGeneratedOn(System.currentTimeMillis() + ""); //$NON-NLS-1$ - - final Map data = new HashMap<>(); - data.put("host", ServerController.getHostAddress(getLocalProperties().getHost(), getLocalProperties().getLocalPort())); //$NON-NLS-1$ - data.put("kmlGeneratedOn", getLocalProperties().getGeneratedOn()); //$NON-NLS-1$ - data.put("surveyName", getLocalProperties().getValue(EarthProperty.SURVEY_NAME)); //$NON-NLS-1$ - data.put("plotFileName", KmlGenerator.getCsvFileName(getLocalProperties().getValue(EarthProperty.SAMPLE_FILE))); //$NON-NLS-1$ - - FreemarkerTemplateUtils.applyTemplate(new File(KML_NETWORK_LINK_TEMPLATE), new File(KML_NETWORK_LINK_STARTER), data); - } - - private boolean isKmlUpToDate() throws IOException { - - final String csvFile = getLocalProperties().getCsvFile(); - final String balloon = getLocalProperties().getBalloonFile(); - final String template = getLocalProperties().getTemplateFile(); - - boolean upToDate = true; - if (!getLocalProperties().getBalloonFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(balloon)) - || !getLocalProperties().getTemplateFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(template)) - || !getLocalProperties().getCsvFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(csvFile))) { - upToDate = false; - } - - final File kmzFile = new File(KmlGeneratorService.KMZ_FILE_PATH); - if (!kmzFile.exists()) { - upToDate = false; - } - - return upToDate; - - } - - public void generatePlacemarksKmzFile() throws IOException, KmlGenerationException, CsvValidationException { - generatePlacemarksKmzFile(false); + private final Map filesInMemory; + + public PreloadedFilesService() { + filesInMemory = new ConcurrentHashMap<>(); } - - public void generatePlacemarksKmzFile(boolean forceRegeneration ) throws IOException, KmlGenerationException, CsvValidationException { - - logger.info("START - Generate KMZ file"); //$NON-NLS-1$ - - if (forceRegeneration || !isKmlUpToDate()) { - - generateKml(); - - final KmzGenerator kmzGenerator = new KmzGenerator(); - - final String balloon = getLocalProperties().getBalloonFile(); - final File balloonFile = new File(balloon); - final String folderToInclude = balloonFile.getParent() + File.separator + EarthConstants.FOLDER_COPIED_TO_KMZ; - - kmzGenerator.generateKmzFile(KMZ_FILE_PATH, KML_RESULTING_TEMP_FILE, folderToInclude); - logger.info("KMZ File generated : {}", KMZ_FILE_PATH); //$NON-NLS-1$ - - copyContentsToGeneratedFolder(folderToInclude); - - final File kmlFile = new File(KML_RESULTING_TEMP_FILE); - if (kmlFile.exists()) { - final boolean deleted = kmlFile.delete(); - if (deleted) { - logger.info("KML File deleted : {}", KML_RESULTING_TEMP_FILE); //$NON-NLS-1$ - } else { - throw new IOException("The KML file could not be deleted at " + kmlFile.getPath()); //$NON-NLS-1$ - } + + public byte[] getFileContent(File file) { + byte[] fileContents = filesInMemory.get(file.getPath()); + if (fileContents == null) { + byte[] content = new byte[0]; + try { + content = FileUtils.readFileToByteArray(file); + filesInMemory.put(file.getPath(), content); + } catch (IOException e) { + logger.error("Problems while reading the file " + file.getPath() + " was not found.", e); } - + fileContents = content; } - logger.info("END - Generate KMZ file"); //$NON-NLS-1$ + return fileContents; } } From 10548ca85e4a5dbe1c010eace5cc89cd7e0a8278 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:37 +0100 Subject: [PATCH 1112/1620] New translations ProcessLoggerThread.java (French) --- .../earth/app/view/Messages_fr.properties | 455 +----------------- 1 file changed, 26 insertions(+), 429 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 884dd929bc..4b902b8805 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,451 +1,48 @@ package org.openforis.collect.earth.app.service; -import java.io.File; +import java.io.BufferedReader; import java.io.IOException; -import java.util.HashMap; -import java.util.Map; +import java.io.InputStream; +import java.io.InputStreamReader; -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.desktop.ServerController; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.app.view.Messages; -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.collect.earth.sampler.processor.CircleKmlGenerator; -import org.openforis.collect.earth.sampler.processor.HexagonKmlGenerator; -import org.openforis.collect.earth.sampler.processor.KmlGenerator; -import org.openforis.collect.earth.sampler.processor.KmzGenerator; -import org.openforis.collect.earth.sampler.processor.NfiFourCirclesGenerator; -import org.openforis.collect.earth.sampler.processor.NfiThreeCirclesGenerator; -import org.openforis.collect.earth.sampler.processor.NfmaKmlGenerator; -import org.openforis.collect.earth.sampler.processor.PolygonGeojsonGenerator; -import org.openforis.collect.earth.sampler.processor.PolygonKmlGenerator; -import org.openforis.collect.earth.sampler.processor.PolygonWktGenerator; -import org.openforis.collect.earth.sampler.processor.SquareKmlGenerator; -import org.openforis.collect.earth.sampler.processor.SquareWithCirclesKmlGenerator; -import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; -import org.openforis.collect.earth.sampler.utils.KmlGenerationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import com.opencsv.CSVReader; -import com.opencsv.exceptions.CsvValidationException; -import freemarker.template.TemplateException; +public class ProcessLoggerThread extends Thread { -@Component -public class KmlGeneratorService { + private static final Logger LOGGER = LoggerFactory.getLogger(ProcessLoggerThread.class); - @Autowired - LocalPropertiesService localPropertiesService; + private InputStream inputStream; - @Autowired - EarthSurveyService earthSurveyService; + private Boolean logOutputAsError; - Logger logger = LoggerFactory.getLogger(KmlGeneratorService.class); - public static final String KML_RESULTING_TEMP_FILE = EarthConstants.GENERATED_FOLDER + File.separator + "plots.kml"; //$NON-NLS-1$ - public static final String KMZ_FILE_PATH = EarthConstants.GENERATED_FOLDER + File.separator + "gePlugin.kmz"; //$NON-NLS-1$ - public static final String KML_NETWORK_LINK_TEMPLATE = "resources/loadApp.fmt"; //$NON-NLS-1$ - public static final String KML_NETWORK_LINK_STARTER = EarthConstants.GENERATED_FOLDER + "/loadApp.kml"; //$NON-NLS-1$ + public ProcessLoggerThread(InputStream inputStream, Boolean logOutputAsError) { + super(); - public static interface PolygonTest{ - Boolean isPolygon(String[] strColumns); + this.inputStream = inputStream; + this.logOutputAsError = logOutputAsError; } - public void generateKmlFile() throws IOException, KmlGenerationException, CsvValidationException{ - checkFilesExist(); - generatePlacemarksKmzFile(); - } - - private void checkFilesExist() throws KmlGenerationException { - - fixUserDirectory(); - - final String csvFilePath = getLocalProperties().getCsvFile(); - final String balloonPath = getLocalProperties().getBalloonFile(); - final String templatePath = getLocalProperties().getTemplateFile(); - boolean filesExist = true; - String errorMessage = "Error generating the KML file for Google Earth.
"; //$NON-NLS-1$ - File csvFile = null; - File balloon = null; - File template = null; - try { - csvFile = new File(csvFilePath); - balloon = new File(balloonPath); - template = new File(templatePath); - } catch (final Exception e) { - logger.error("One of the definition files is not defined", e); //$NON-NLS-1$ - } - if (csvFile != null && !csvFile.exists()) { - errorMessage += Messages.getString("EarthApp.21") //$NON-NLS-1$ - + csvFile.getAbsolutePath() + "

"; //$NON-NLS-1$ - filesExist = false; - } else if (csvFile == null) { - errorMessage += Messages.getString("EarthApp.23"); //$NON-NLS-1$ - filesExist = false; - } - - if (template != null && !template.exists()) { - errorMessage += Messages.getString("EarthApp.24") //$NON-NLS-1$ - + template.getAbsolutePath() + "

"; //$NON-NLS-1$ - filesExist = false; - } else if (template == null) { - errorMessage += Messages.getString("EarthApp.26"); //$NON-NLS-1$ - filesExist = false; - } - - if (balloon != null && !balloon.exists()) { - errorMessage += Messages.getString("EarthApp.27") + balloon.getAbsolutePath() //$NON-NLS-1$ - + "

"; //$NON-NLS-1$ - filesExist = false; - } else if (balloon == null) { - errorMessage += Messages.getString("EarthApp.29"); //$NON-NLS-1$ - filesExist = false; - } - - errorMessage += Messages.getString("EarthApp.30"); //$NON-NLS-1$ - - if( !filesExist ){ - throw new KmlGenerationException(errorMessage); - } - } - - private LocalPropertiesService getLocalProperties() { - return localPropertiesService; - } - - private void copyContentsToGeneratedFolder(String folderToInclude) throws IOException { - final File sourceDir = new File(folderToInclude); - final File targetDir = new File(EarthConstants.GENERATED_FOLDER + File.separator + sourceDir.getName()); - FileUtils.copyDirectory(sourceDir, targetDir); - } - - private void fixUserDirectory() { - final String csvFilePath = getLocalProperties().getCsvFile(); - final String balloonPath = getLocalProperties().getBalloonFile(); - final String templatePath = getLocalProperties().getTemplateFile(); - final String metadataPath = getLocalProperties().getImdFile(); - - File csvFile = null; - File balloon = null; - File template = null; - File idmFile = null; - try { - csvFile = new File(csvFilePath); - balloon = new File(balloonPath); - template = new File(templatePath); - idmFile = new File(metadataPath); - - final String prefixUserFolder = FolderFinder.getCollectEarthDataFolder() + File.separator; - - if (!csvFile.exists()) { - final File otherFile = new File(prefixUserFolder + getLocalProperties().getCsvFile()); - if (otherFile.exists()) { - getLocalProperties().setValue(EarthProperty.SAMPLE_FILE, otherFile.getAbsolutePath()); - } - } - - if (!balloon.exists()) { - final File otherFile = new File(prefixUserFolder + getLocalProperties().getBalloonFile()); - if (otherFile.exists()) { - getLocalProperties().setValue(EarthProperty.BALLOON_TEMPLATE_KEY, otherFile.getAbsolutePath()); - } - } - - if (!template.exists()) { - final File otherFile = new File(prefixUserFolder + getLocalProperties().getTemplateFile()); - if (otherFile.exists()) { - getLocalProperties().setValue(EarthProperty.KML_TEMPLATE_KEY, otherFile.getAbsolutePath()); - } - } - - if (!idmFile.exists()) { - final File otherFile = new File(prefixUserFolder + getLocalProperties().getImdFile()); - if (otherFile.exists()) { - getLocalProperties().setValue(EarthProperty.METADATA_FILE, otherFile.getAbsolutePath()); - } - } - - } catch (final Exception e) { - logger.error("One of the definition files is not defined", e); //$NON-NLS-1$ - } - - } - - - private int parseInt( String intNumber ){ - int i = 0; - try{ - if( StringUtils.isNoneBlank( intNumber ) ) { - i = Integer.parseInt( intNumber ); - } - }catch(Exception e){ - logger.error( "Error parsing integer number" ); - } - return i; - } - - public KmlGenerator getKmlGenerator() throws KmlGenerationException, CsvValidationException { - KmlGenerator generateKml =null; - - final String crsSystem = getLocalProperties().getCrs(); - final Integer innerPointSide = parseInt(getLocalProperties().getValue(EarthProperty.INNER_SUBPLOT_SIDE)); - final Integer largeCentralPlotSide = parseInt(getLocalProperties().getValue(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)); - final String distanceToBuffers = getLocalProperties().getValue(EarthProperty.DISTANCE_TO_BUFFERS); - SAMPLE_SHAPE plotShape = getLocalProperties().getSampleShape(); - final String hostAddress = ServerController.getHostAddress(getLocalProperties().getHost(), getLocalProperties().getPort()); - - final float distanceBetweenSamplePoints; - final float distanceToPlotBoundaries; - String dBSP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS); + @Override + public void run() { try { - distanceBetweenSamplePoints = Float.parseFloat(dBSP); - } catch (Exception e) { - logger.error("Error parsing distance between sample points , wrong value : " + dBSP,e); - EarthApp.showMessage("Attention: Check earth.properties file. The distance between sample points must be a number! You have set it to : " + dBSP); //$NON-NLS-1$ - return null; - } + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); + String line = reader.readLine(); + while (line != null) { + if( Boolean.TRUE.equals( logOutputAsError ) ) + LOGGER.error(line); + else + LOGGER.warn(line); - - String dToPlotB = getLocalProperties().getValue(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES); - try { - distanceToPlotBoundaries = Float.parseFloat(dToPlotB); - } catch (Exception e) { - logger.error("Error parsing distance between plots , wrong value : " + dToPlotB,e); - EarthApp.showMessage("Attention: Check earth.properties file. The distance between sample point and border of the plot must be a number ! You have set it to : " + dToPlotB); //$NON-NLS-1$ - return null; - } - final String localPort = getLocalProperties().getLocalPort(); - final String numberOfSamplingPlots = getLocalProperties().getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT); - final String csvFile = getLocalProperties().getCsvFile(); - - int numberOfPoints = 25; - if ((numberOfSamplingPlots != null) && (numberOfSamplingPlots.trim().length() > 0)) { - numberOfPoints = parseInt(numberOfSamplingPlots.trim()); - } - - try{ - // If there is a polygon column then the type of plot shape is assumed to be POLYGON - if( csvContainsKml(csvFile)){ - plotShape = SAMPLE_SHAPE.KML_POLYGON; - }else if( csvContainsWkt(csvFile)){ - plotShape = SAMPLE_SHAPE.WKT_POLYGON; - }else if( csvContainsGeoJson(csvFile)){ - plotShape = SAMPLE_SHAPE.GEOJSON_POLYGON; - } - - if (plotShape.equals(SAMPLE_SHAPE.CIRCLE)) { - generateKml = new CircleKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, distanceBetweenSamplePoints ); - } else if (plotShape.equals(SAMPLE_SHAPE.NFMA)) { - generateKml = new NfmaKmlGenerator(crsSystem, hostAddress, localPort, 150, false); - } else if (plotShape.equals(SAMPLE_SHAPE.NFMA_250)) { - generateKml = new NfmaKmlGenerator(crsSystem, hostAddress, localPort, 250, true); - } else if (plotShape.equals(SAMPLE_SHAPE.NFI_THREE_CIRCLES)) { - - String dBP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS ); - float distanceBetweenPlots; - try { - distanceBetweenPlots = Float.parseFloat(dBP); - } catch (Exception e) { - logger.error("Error parsing distance between plots , wrong value : " + dBP,e); - EarthApp.showMessage("Attention: Check earth.properties file. The distance between plots must be a number! You have set it to : " + dBP); //$NON-NLS-1$ - return null; - } - - generateKml = new NfiThreeCirclesGenerator(crsSystem, hostAddress, localPort, innerPointSide, distanceBetweenSamplePoints, distanceBetweenPlots ); - }else if (plotShape.equals(SAMPLE_SHAPE.NFI_FOUR_CIRCLES)) { - - String dBP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS ); - float distanceBetweenPlots; - try { - distanceBetweenPlots = Float.parseFloat(dBP); - } catch (Exception e) { - logger.error(String.format("Error parsing distance between plots , wrong value : %s", dBP) ,e); - EarthApp.showMessage("Attention: Check earth.properties file. The distance between plots must be a number! You have set it to : " + dBP); //$NON-NLS-1$ - return null; - } - - generateKml = new NfiFourCirclesGenerator(crsSystem, hostAddress, localPort, innerPointSide, distanceBetweenSamplePoints, distanceBetweenPlots ); - }else if (plotShape.equals(SAMPLE_SHAPE.HEXAGON)) { - generateKml = new HexagonKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, distanceBetweenSamplePoints ); - } else if (plotShape.equals(SAMPLE_SHAPE.SQUARE_CIRCLE)) { - generateKml = new SquareWithCirclesKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, - distanceBetweenSamplePoints, distanceToPlotBoundaries); - } else if (plotShape.equals(SAMPLE_SHAPE.KML_POLYGON)) { - generateKml = new PolygonKmlGenerator(crsSystem, hostAddress, localPort); - } else if (plotShape.equals(SAMPLE_SHAPE.GEOJSON_POLYGON)) { - generateKml = new PolygonGeojsonGenerator(crsSystem, hostAddress, localPort); - }else if (plotShape.equals(SAMPLE_SHAPE.WKT_POLYGON)) { - generateKml = new PolygonWktGenerator(crsSystem, hostAddress, localPort); - }else { - generateKml = new SquareKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, - distanceBetweenSamplePoints, distanceToPlotBoundaries, largeCentralPlotSide, distanceToBuffers); + line = reader.readLine(); } - }catch(IOException e){ - logger.error("Error generating KML", e ); - } - - if( generateKml == null ) { - throw new KmlGenerationException("Error getting the KML generator for parameters " + plotShape.name() ); - } - - return generateKml; - } - - - private boolean csvContains(String csvFile, PolygonTest test ) throws IOException, CsvValidationException { - try( CSVReader csvReader = CsvReaderUtils.getCsvReader(csvFile) ){ - csvReader.readNext(); // Ignore it might be the column headers - - String[] secondLine = csvReader.readNext(); - if( secondLine != null && !CsvReaderUtils.onlyEmptyCells(secondLine) ){ - return test.isPolygon( secondLine ); - } - - return false; - } - } - - private boolean csvContainsGeoJson(String csvFile) throws IOException, CsvValidationException { - return - csvContains( - csvFile, - csvColumns -> new PolygonGeojsonGenerator(null, null, null ).isGeoJsonPolygonColumnFound(csvColumns) != null - ); - } - - private boolean csvContainsWkt(String csvFile) throws IOException, CsvValidationException { - return csvContains( - csvFile, - csvColumns -> new PolygonWktGenerator(null, null, null ).isWktPolygonColumnFound(csvColumns) != null - ); - } - - private boolean csvContainsKml(String csvFile) throws IOException, CsvValidationException { - return csvContains( - csvFile, - csvColumns -> new PolygonKmlGenerator(null, null, null ).isKmlPolygonColumnFound(csvColumns) != null - ); - } - - private void generateKml() throws KmlGenerationException, IOException, CsvValidationException { - - KmlGenerator kmlGenerator = null; - kmlGenerator = getKmlGenerator(); - - if ( kmlGenerator == null ){ - throw new KmlGenerationException("Error while generating KML"); - } - - final String csvFile = getLocalProperties().getCsvFile(); - String balloon = getLocalProperties().getBalloonFile(); - final String template = getLocalProperties().getTemplateFile(); - - // In case the user sets up the OPEN_BALLOON_IN_FIREFOX flag to - // true. Meaning that a small ballon opens in the placemark which in - // its turn - // opens a firefox browser with the real form - final Boolean openBalloonInFirefox = Boolean.valueOf(getLocalProperties().getValue(EarthProperty.OPEN_BALLOON_IN_BROWSER)); - if (Boolean.TRUE.equals( openBalloonInFirefox) ) { - String alternativeBalloon = getLocalProperties().getValue(EarthProperty.ALTERNATIVE_BALLOON_FOR_BROWSER); - if( !StringUtils.isBlank( alternativeBalloon ) ){ - balloon = alternativeBalloon; - } - } - - // Using all of the files that compose the final KML it is generated and stores in KML_RESULTING_TEMP_FILE - kmlGenerator.generateKmlFile(KML_RESULTING_TEMP_FILE, csvFile, balloon, template, earthSurveyService.getCollectSurvey()); - updateFilesUsedChecksum(); - - } - - private void updateFilesUsedChecksum() throws IOException { - final String csvFile = getLocalProperties().getCsvFile(); - final String balloon = getLocalProperties().getBalloonFile(); - final String template = getLocalProperties().getTemplateFile(); - - getLocalProperties().saveBalloonFileChecksum(CollectEarthUtils.getMd5FromFile(balloon)); - getLocalProperties().saveCsvFileCehcksum(CollectEarthUtils.getMd5FromFile(csvFile)); - getLocalProperties().saveTemplateFileChecksum(CollectEarthUtils.getMd5FromFile(template)); - } - - public void generateLoaderKmlFile() throws IOException, TemplateException { - - getLocalProperties().saveGeneratedOn(System.currentTimeMillis() + ""); //$NON-NLS-1$ - - final Map data = new HashMap<>(); - data.put("host", ServerController.getHostAddress(getLocalProperties().getHost(), getLocalProperties().getLocalPort())); //$NON-NLS-1$ - data.put("kmlGeneratedOn", getLocalProperties().getGeneratedOn()); //$NON-NLS-1$ - data.put("surveyName", getLocalProperties().getValue(EarthProperty.SURVEY_NAME)); //$NON-NLS-1$ - data.put("plotFileName", KmlGenerator.getCsvFileName(getLocalProperties().getValue(EarthProperty.SAMPLE_FILE))); //$NON-NLS-1$ - - FreemarkerTemplateUtils.applyTemplate(new File(KML_NETWORK_LINK_TEMPLATE), new File(KML_NETWORK_LINK_STARTER), data); - } - - private boolean isKmlUpToDate() throws IOException { - - final String csvFile = getLocalProperties().getCsvFile(); - final String balloon = getLocalProperties().getBalloonFile(); - final String template = getLocalProperties().getTemplateFile(); - - boolean upToDate = true; - if (!getLocalProperties().getBalloonFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(balloon)) - || !getLocalProperties().getTemplateFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(template)) - || !getLocalProperties().getCsvFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(csvFile))) { - upToDate = false; - } - - final File kmzFile = new File(KmlGeneratorService.KMZ_FILE_PATH); - if (!kmzFile.exists()) { - upToDate = false; - } - - return upToDate; - - } - - public void generatePlacemarksKmzFile() throws IOException, KmlGenerationException, CsvValidationException { - generatePlacemarksKmzFile(false); - } - - public void generatePlacemarksKmzFile(boolean forceRegeneration ) throws IOException, KmlGenerationException, CsvValidationException { - - logger.info("START - Generate KMZ file"); //$NON-NLS-1$ - - if (forceRegeneration || !isKmlUpToDate()) { - - generateKml(); - - final KmzGenerator kmzGenerator = new KmzGenerator(); - - final String balloon = getLocalProperties().getBalloonFile(); - final File balloonFile = new File(balloon); - final String folderToInclude = balloonFile.getParent() + File.separator + EarthConstants.FOLDER_COPIED_TO_KMZ; - - kmzGenerator.generateKmzFile(KMZ_FILE_PATH, KML_RESULTING_TEMP_FILE, folderToInclude); - logger.info("KMZ File generated : {}", KMZ_FILE_PATH); //$NON-NLS-1$ - - copyContentsToGeneratedFolder(folderToInclude); - - final File kmlFile = new File(KML_RESULTING_TEMP_FILE); - if (kmlFile.exists()) { - final boolean deleted = kmlFile.delete(); - if (deleted) { - logger.info("KML File deleted : {}", KML_RESULTING_TEMP_FILE); //$NON-NLS-1$ - } else { - throw new IOException("The KML file could not be deleted at " + kmlFile.getPath()); //$NON-NLS-1$ - } - } - + reader.close(); + LOGGER.warn("End of logs"); + } catch (IOException e) { + LOGGER.error("The log reader died unexpectedly.", e); } - logger.info("END - Generate KMZ file"); //$NON-NLS-1$ } -} +} \ No newline at end of file From 1556d65691bdb39ed94819a1119aa0005b20bdc4 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:38 +0100 Subject: [PATCH 1113/1620] New translations AboutDialog.java (Spanish) --- .../earth/app/view/Messages_es.properties | 507 ++++-------------- 1 file changed, 92 insertions(+), 415 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 884dd929bc..1550d687ee 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,451 +1,128 @@ -package org.openforis.collect.earth.app.service; +package org.openforis.collect.earth.app.view; -import java.io.File; +import java.awt.Desktop; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseListener; +import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.IOException; -import java.util.HashMap; -import java.util.Map; - -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.desktop.ServerController; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.openforis.collect.earth.app.view.Messages; -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.collect.earth.sampler.processor.CircleKmlGenerator; -import org.openforis.collect.earth.sampler.processor.HexagonKmlGenerator; -import org.openforis.collect.earth.sampler.processor.KmlGenerator; -import org.openforis.collect.earth.sampler.processor.KmzGenerator; -import org.openforis.collect.earth.sampler.processor.NfiFourCirclesGenerator; -import org.openforis.collect.earth.sampler.processor.NfiThreeCirclesGenerator; -import org.openforis.collect.earth.sampler.processor.NfmaKmlGenerator; -import org.openforis.collect.earth.sampler.processor.PolygonGeojsonGenerator; -import org.openforis.collect.earth.sampler.processor.PolygonKmlGenerator; -import org.openforis.collect.earth.sampler.processor.PolygonWktGenerator; -import org.openforis.collect.earth.sampler.processor.SquareKmlGenerator; -import org.openforis.collect.earth.sampler.processor.SquareWithCirclesKmlGenerator; -import org.openforis.collect.earth.sampler.utils.FreemarkerTemplateUtils; -import org.openforis.collect.earth.sampler.utils.KmlGenerationException; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.Properties; + +import javax.swing.Box; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; + +import org.openforis.collect.earth.app.service.UpdateIniUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import com.opencsv.CSVReader; -import com.opencsv.exceptions.CsvValidationException; +public class AboutDialog extends JDialog { -import freemarker.template.TemplateException; + private static final long serialVersionUID = 3108968706818898461L; + private transient Logger logger = LoggerFactory.getLogger( AboutDialog.class ); -@Component -public class KmlGeneratorService { + public AboutDialog(JFrame parent, String title) { + super(parent, title, true); - @Autowired - LocalPropertiesService localPropertiesService; + UpdateIniUtils updateIniUtils = new UpdateIniUtils(); + String buildDate = updateIniUtils.convertToDate(getBuild()); - @Autowired - EarthSurveyService earthSurveyService; + Box b = Box.createVerticalBox(); + b.setAlignmentX(CENTER_ALIGNMENT); + b.add(Box.createGlue()); + b.add(new JLabel("Collect Earth v. " + getVersion() + " ( built " + buildDate + ") ")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + b.add(new JLabel("By Open Foris Initiative / Part of the Food and Agriculture Organization of the UN")); //$NON-NLS-1$ + JLabel comp = new JLabel("" + Messages.getString("AboutDialog.5") + ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + JLabel comp2 = new JLabel("CHECK THE CHANGE LOG"); + if (isBrowsingSupported()) { + makeLinkable(comp, new LinkMouseListener( "http://www.openforis.org" )); + makeLinkable(comp2, new LinkMouseListener( "https://github.com/openforis/collect-earth/blob/master/collect-earth/CHANGELOG.md" )); + } + b.add(comp); + b.add(comp2); + b.add(Box.createGlue()); + getContentPane().add(b, "Center"); //$NON-NLS-1$ - Logger logger = LoggerFactory.getLogger(KmlGeneratorService.class); + JPanel p2 = new JPanel(); + JButton ok = new JButton(Messages.getString("AboutDialog.8")); //$NON-NLS-1$ + p2.add(ok); + getContentPane().add(p2, "South"); //$NON-NLS-1$ - public static final String KML_RESULTING_TEMP_FILE = EarthConstants.GENERATED_FOLDER + File.separator + "plots.kml"; //$NON-NLS-1$ - public static final String KMZ_FILE_PATH = EarthConstants.GENERATED_FOLDER + File.separator + "gePlugin.kmz"; //$NON-NLS-1$ - public static final String KML_NETWORK_LINK_TEMPLATE = "resources/loadApp.fmt"; //$NON-NLS-1$ - public static final String KML_NETWORK_LINK_STARTER = EarthConstants.GENERATED_FOLDER + "/loadApp.kml"; //$NON-NLS-1$ + ok.addActionListener( e -> setVisible(false) ); - public static interface PolygonTest{ - Boolean isPolygon(String[] strColumns); + setSize(380, 150); } - public void generateKmlFile() throws IOException, KmlGenerationException, CsvValidationException{ - checkFilesExist(); - generatePlacemarksKmzFile(); - + private String getBuild() { + String key = "version_id"; //$NON-NLS-1$ + return getValueFromUpdateIni(key); } - private void checkFilesExist() throws KmlGenerationException { - - fixUserDirectory(); - - final String csvFilePath = getLocalProperties().getCsvFile(); - final String balloonPath = getLocalProperties().getBalloonFile(); - final String templatePath = getLocalProperties().getTemplateFile(); - boolean filesExist = true; - String errorMessage = "Error generating the KML file for Google Earth.
"; //$NON-NLS-1$ - File csvFile = null; - File balloon = null; - File template = null; - try { - csvFile = new File(csvFilePath); - balloon = new File(balloonPath); - template = new File(templatePath); - } catch (final Exception e) { - logger.error("One of the definition files is not defined", e); //$NON-NLS-1$ - } - if (csvFile != null && !csvFile.exists()) { - errorMessage += Messages.getString("EarthApp.21") //$NON-NLS-1$ - + csvFile.getAbsolutePath() + "

"; //$NON-NLS-1$ - filesExist = false; - } else if (csvFile == null) { - errorMessage += Messages.getString("EarthApp.23"); //$NON-NLS-1$ - filesExist = false; - } - - if (template != null && !template.exists()) { - errorMessage += Messages.getString("EarthApp.24") //$NON-NLS-1$ - + template.getAbsolutePath() + "

"; //$NON-NLS-1$ - filesExist = false; - } else if (template == null) { - errorMessage += Messages.getString("EarthApp.26"); //$NON-NLS-1$ - filesExist = false; - } - - if (balloon != null && !balloon.exists()) { - errorMessage += Messages.getString("EarthApp.27") + balloon.getAbsolutePath() //$NON-NLS-1$ - + "

"; //$NON-NLS-1$ - filesExist = false; - } else if (balloon == null) { - errorMessage += Messages.getString("EarthApp.29"); //$NON-NLS-1$ - filesExist = false; - } - - errorMessage += Messages.getString("EarthApp.30"); //$NON-NLS-1$ - - if( !filesExist ){ - throw new KmlGenerationException(errorMessage); + public String getValueFromUpdateIni(String key) { + Properties properties = new Properties(); + String value = "unknwown"; //$NON-NLS-1$ + try (FileInputStream fis = new FileInputStream("update.ini")) { //$NON-NLS-1$ + properties.load(fis); + value = properties.getProperty(key); + } catch (FileNotFoundException e) { + logger.error("The update.,ini file could not be found", e); //$NON-NLS-1$ + } catch (IOException e) { + logger.error("Error opening the update.ini file", e); //$NON-NLS-1$ } + return value; } - private LocalPropertiesService getLocalProperties() { - return localPropertiesService; - } - - private void copyContentsToGeneratedFolder(String folderToInclude) throws IOException { - final File sourceDir = new File(folderToInclude); - final File targetDir = new File(EarthConstants.GENERATED_FOLDER + File.separator + sourceDir.getName()); - FileUtils.copyDirectory(sourceDir, targetDir); + private String getVersion() { + String key = "version"; //$NON-NLS-1$ + return getValueFromUpdateIni(key); } - private void fixUserDirectory() { - final String csvFilePath = getLocalProperties().getCsvFile(); - final String balloonPath = getLocalProperties().getBalloonFile(); - final String templatePath = getLocalProperties().getTemplateFile(); - final String metadataPath = getLocalProperties().getImdFile(); - - File csvFile = null; - File balloon = null; - File template = null; - File idmFile = null; - try { - csvFile = new File(csvFilePath); - balloon = new File(balloonPath); - template = new File(templatePath); - idmFile = new File(metadataPath); - - final String prefixUserFolder = FolderFinder.getCollectEarthDataFolder() + File.separator; - - if (!csvFile.exists()) { - final File otherFile = new File(prefixUserFolder + getLocalProperties().getCsvFile()); - if (otherFile.exists()) { - getLocalProperties().setValue(EarthProperty.SAMPLE_FILE, otherFile.getAbsolutePath()); - } - } - - if (!balloon.exists()) { - final File otherFile = new File(prefixUserFolder + getLocalProperties().getBalloonFile()); - if (otherFile.exists()) { - getLocalProperties().setValue(EarthProperty.BALLOON_TEMPLATE_KEY, otherFile.getAbsolutePath()); - } - } - - if (!template.exists()) { - final File otherFile = new File(prefixUserFolder + getLocalProperties().getTemplateFile()); - if (otherFile.exists()) { - getLocalProperties().setValue(EarthProperty.KML_TEMPLATE_KEY, otherFile.getAbsolutePath()); - } - } - - if (!idmFile.exists()) { - final File otherFile = new File(prefixUserFolder + getLocalProperties().getImdFile()); - if (otherFile.exists()) { - getLocalProperties().setValue(EarthProperty.METADATA_FILE, otherFile.getAbsolutePath()); - } - } - - } catch (final Exception e) { - logger.error("One of the definition files is not defined", e); //$NON-NLS-1$ - } + private static void makeLinkable(JLabel c, MouseListener ml) { + assert ml != null; + c.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); + c.addMouseListener(ml); } + private static boolean isBrowsingSupported() { + if (!Desktop.isDesktopSupported()) { + return false; + } + boolean result = false; + Desktop desktop = java.awt.Desktop.getDesktop(); + if (desktop.isSupported(Desktop.Action.BROWSE)) { + result = true; + } + return result; - private int parseInt( String intNumber ){ - int i = 0; - try{ - if( StringUtils.isNoneBlank( intNumber ) ) { - i = Integer.parseInt( intNumber ); - } - }catch(Exception e){ - logger.error( "Error parsing integer number" ); - } - return i; } - public KmlGenerator getKmlGenerator() throws KmlGenerationException, CsvValidationException { - KmlGenerator generateKml =null; - - final String crsSystem = getLocalProperties().getCrs(); - final Integer innerPointSide = parseInt(getLocalProperties().getValue(EarthProperty.INNER_SUBPLOT_SIDE)); - final Integer largeCentralPlotSide = parseInt(getLocalProperties().getValue(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)); - final String distanceToBuffers = getLocalProperties().getValue(EarthProperty.DISTANCE_TO_BUFFERS); - SAMPLE_SHAPE plotShape = getLocalProperties().getSampleShape(); - final String hostAddress = ServerController.getHostAddress(getLocalProperties().getHost(), getLocalProperties().getPort()); - - final float distanceBetweenSamplePoints; - final float distanceToPlotBoundaries; - String dBSP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS); - try { - distanceBetweenSamplePoints = Float.parseFloat(dBSP); - } catch (Exception e) { - logger.error("Error parsing distance between sample points , wrong value : " + dBSP,e); - EarthApp.showMessage("Attention: Check earth.properties file. The distance between sample points must be a number! You have set it to : " + dBSP); //$NON-NLS-1$ - return null; - } - - - String dToPlotB = getLocalProperties().getValue(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES); - try { - distanceToPlotBoundaries = Float.parseFloat(dToPlotB); - } catch (Exception e) { - logger.error("Error parsing distance between plots , wrong value : " + dToPlotB,e); - EarthApp.showMessage("Attention: Check earth.properties file. The distance between sample point and border of the plot must be a number ! You have set it to : " + dToPlotB); //$NON-NLS-1$ - return null; - } - final String localPort = getLocalProperties().getLocalPort(); - final String numberOfSamplingPlots = getLocalProperties().getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT); - final String csvFile = getLocalProperties().getCsvFile(); - - int numberOfPoints = 25; - if ((numberOfSamplingPlots != null) && (numberOfSamplingPlots.trim().length() > 0)) { - numberOfPoints = parseInt(numberOfSamplingPlots.trim()); - } - - try{ - // If there is a polygon column then the type of plot shape is assumed to be POLYGON - if( csvContainsKml(csvFile)){ - plotShape = SAMPLE_SHAPE.KML_POLYGON; - }else if( csvContainsWkt(csvFile)){ - plotShape = SAMPLE_SHAPE.WKT_POLYGON; - }else if( csvContainsGeoJson(csvFile)){ - plotShape = SAMPLE_SHAPE.GEOJSON_POLYGON; - } - - if (plotShape.equals(SAMPLE_SHAPE.CIRCLE)) { - generateKml = new CircleKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, distanceBetweenSamplePoints ); - } else if (plotShape.equals(SAMPLE_SHAPE.NFMA)) { - generateKml = new NfmaKmlGenerator(crsSystem, hostAddress, localPort, 150, false); - } else if (plotShape.equals(SAMPLE_SHAPE.NFMA_250)) { - generateKml = new NfmaKmlGenerator(crsSystem, hostAddress, localPort, 250, true); - } else if (plotShape.equals(SAMPLE_SHAPE.NFI_THREE_CIRCLES)) { + private static class LinkMouseListener extends MouseAdapter { + String url; - String dBP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS ); - float distanceBetweenPlots; - try { - distanceBetweenPlots = Float.parseFloat(dBP); - } catch (Exception e) { - logger.error("Error parsing distance between plots , wrong value : " + dBP,e); - EarthApp.showMessage("Attention: Check earth.properties file. The distance between plots must be a number! You have set it to : " + dBP); //$NON-NLS-1$ - return null; - } - generateKml = new NfiThreeCirclesGenerator(crsSystem, hostAddress, localPort, innerPointSide, distanceBetweenSamplePoints, distanceBetweenPlots ); - }else if (plotShape.equals(SAMPLE_SHAPE.NFI_FOUR_CIRCLES)) { - - String dBP = getLocalProperties().getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS ); - float distanceBetweenPlots; - try { - distanceBetweenPlots = Float.parseFloat(dBP); - } catch (Exception e) { - logger.error(String.format("Error parsing distance between plots , wrong value : %s", dBP) ,e); - EarthApp.showMessage("Attention: Check earth.properties file. The distance between plots must be a number! You have set it to : " + dBP); //$NON-NLS-1$ - return null; - } - - generateKml = new NfiFourCirclesGenerator(crsSystem, hostAddress, localPort, innerPointSide, distanceBetweenSamplePoints, distanceBetweenPlots ); - }else if (plotShape.equals(SAMPLE_SHAPE.HEXAGON)) { - generateKml = new HexagonKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, distanceBetweenSamplePoints ); - } else if (plotShape.equals(SAMPLE_SHAPE.SQUARE_CIRCLE)) { - generateKml = new SquareWithCirclesKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, - distanceBetweenSamplePoints, distanceToPlotBoundaries); - } else if (plotShape.equals(SAMPLE_SHAPE.KML_POLYGON)) { - generateKml = new PolygonKmlGenerator(crsSystem, hostAddress, localPort); - } else if (plotShape.equals(SAMPLE_SHAPE.GEOJSON_POLYGON)) { - generateKml = new PolygonGeojsonGenerator(crsSystem, hostAddress, localPort); - }else if (plotShape.equals(SAMPLE_SHAPE.WKT_POLYGON)) { - generateKml = new PolygonWktGenerator(crsSystem, hostAddress, localPort); - }else { - generateKml = new SquareKmlGenerator(crsSystem, hostAddress, localPort, innerPointSide, numberOfPoints, - distanceBetweenSamplePoints, distanceToPlotBoundaries, largeCentralPlotSide, distanceToBuffers); - } - }catch(IOException e){ - logger.error("Error generating KML", e ); - } - - if( generateKml == null ) { - throw new KmlGenerationException("Error getting the KML generator for parameters " + plotShape.name() ); + public LinkMouseListener(String url) { + super(); + this.url = url; } - return generateKml; - } - - private boolean csvContains(String csvFile, PolygonTest test ) throws IOException, CsvValidationException { - try( CSVReader csvReader = CsvReaderUtils.getCsvReader(csvFile) ){ - csvReader.readNext(); // Ignore it might be the column headers + @Override + public void mouseClicked(java.awt.event.MouseEvent evt) { + JLabel l = (JLabel) evt.getSource(); + try { - String[] secondLine = csvReader.readNext(); - if( secondLine != null && !CsvReaderUtils.onlyEmptyCells(secondLine) ){ - return test.isPolygon( secondLine ); - } - - return false; - } + URI uri = new java.net.URI(url); //$NON-NLS-1$ + (new LinkRunner(uri)).execute(); + } catch (URISyntaxException use) { + throw new AssertionError(use + ": " + l.getText()); //NOI18N //$NON-NLS-1$ + } + } } - private boolean csvContainsGeoJson(String csvFile) throws IOException, CsvValidationException { - return - csvContains( - csvFile, - csvColumns -> new PolygonGeojsonGenerator(null, null, null ).isGeoJsonPolygonColumnFound(csvColumns) != null - ); - } - - private boolean csvContainsWkt(String csvFile) throws IOException, CsvValidationException { - return csvContains( - csvFile, - csvColumns -> new PolygonWktGenerator(null, null, null ).isWktPolygonColumnFound(csvColumns) != null - ); - } - - private boolean csvContainsKml(String csvFile) throws IOException, CsvValidationException { - return csvContains( - csvFile, - csvColumns -> new PolygonKmlGenerator(null, null, null ).isKmlPolygonColumnFound(csvColumns) != null - ); - } - - private void generateKml() throws KmlGenerationException, IOException, CsvValidationException { - - KmlGenerator kmlGenerator = null; - kmlGenerator = getKmlGenerator(); - - if ( kmlGenerator == null ){ - throw new KmlGenerationException("Error while generating KML"); - } - - final String csvFile = getLocalProperties().getCsvFile(); - String balloon = getLocalProperties().getBalloonFile(); - final String template = getLocalProperties().getTemplateFile(); - - // In case the user sets up the OPEN_BALLOON_IN_FIREFOX flag to - // true. Meaning that a small ballon opens in the placemark which in - // its turn - // opens a firefox browser with the real form - final Boolean openBalloonInFirefox = Boolean.valueOf(getLocalProperties().getValue(EarthProperty.OPEN_BALLOON_IN_BROWSER)); - if (Boolean.TRUE.equals( openBalloonInFirefox) ) { - String alternativeBalloon = getLocalProperties().getValue(EarthProperty.ALTERNATIVE_BALLOON_FOR_BROWSER); - if( !StringUtils.isBlank( alternativeBalloon ) ){ - balloon = alternativeBalloon; - } - } - - // Using all of the files that compose the final KML it is generated and stores in KML_RESULTING_TEMP_FILE - kmlGenerator.generateKmlFile(KML_RESULTING_TEMP_FILE, csvFile, balloon, template, earthSurveyService.getCollectSurvey()); - updateFilesUsedChecksum(); - - } - - private void updateFilesUsedChecksum() throws IOException { - final String csvFile = getLocalProperties().getCsvFile(); - final String balloon = getLocalProperties().getBalloonFile(); - final String template = getLocalProperties().getTemplateFile(); - - getLocalProperties().saveBalloonFileChecksum(CollectEarthUtils.getMd5FromFile(balloon)); - getLocalProperties().saveCsvFileCehcksum(CollectEarthUtils.getMd5FromFile(csvFile)); - getLocalProperties().saveTemplateFileChecksum(CollectEarthUtils.getMd5FromFile(template)); - } - - public void generateLoaderKmlFile() throws IOException, TemplateException { - - getLocalProperties().saveGeneratedOn(System.currentTimeMillis() + ""); //$NON-NLS-1$ - - final Map data = new HashMap<>(); - data.put("host", ServerController.getHostAddress(getLocalProperties().getHost(), getLocalProperties().getLocalPort())); //$NON-NLS-1$ - data.put("kmlGeneratedOn", getLocalProperties().getGeneratedOn()); //$NON-NLS-1$ - data.put("surveyName", getLocalProperties().getValue(EarthProperty.SURVEY_NAME)); //$NON-NLS-1$ - data.put("plotFileName", KmlGenerator.getCsvFileName(getLocalProperties().getValue(EarthProperty.SAMPLE_FILE))); //$NON-NLS-1$ - - FreemarkerTemplateUtils.applyTemplate(new File(KML_NETWORK_LINK_TEMPLATE), new File(KML_NETWORK_LINK_STARTER), data); - } - - private boolean isKmlUpToDate() throws IOException { - - final String csvFile = getLocalProperties().getCsvFile(); - final String balloon = getLocalProperties().getBalloonFile(); - final String template = getLocalProperties().getTemplateFile(); - - boolean upToDate = true; - if (!getLocalProperties().getBalloonFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(balloon)) - || !getLocalProperties().getTemplateFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(template)) - || !getLocalProperties().getCsvFileChecksum().trim().equals(CollectEarthUtils.getMd5FromFile(csvFile))) { - upToDate = false; - } - - final File kmzFile = new File(KmlGeneratorService.KMZ_FILE_PATH); - if (!kmzFile.exists()) { - upToDate = false; - } - - return upToDate; - - } - - public void generatePlacemarksKmzFile() throws IOException, KmlGenerationException, CsvValidationException { - generatePlacemarksKmzFile(false); - } - - public void generatePlacemarksKmzFile(boolean forceRegeneration ) throws IOException, KmlGenerationException, CsvValidationException { - - logger.info("START - Generate KMZ file"); //$NON-NLS-1$ - - if (forceRegeneration || !isKmlUpToDate()) { - - generateKml(); - - final KmzGenerator kmzGenerator = new KmzGenerator(); - - final String balloon = getLocalProperties().getBalloonFile(); - final File balloonFile = new File(balloon); - final String folderToInclude = balloonFile.getParent() + File.separator + EarthConstants.FOLDER_COPIED_TO_KMZ; - - kmzGenerator.generateKmzFile(KMZ_FILE_PATH, KML_RESULTING_TEMP_FILE, folderToInclude); - logger.info("KMZ File generated : {}", KMZ_FILE_PATH); //$NON-NLS-1$ - - copyContentsToGeneratedFolder(folderToInclude); - - final File kmlFile = new File(KML_RESULTING_TEMP_FILE); - if (kmlFile.exists()) { - final boolean deleted = kmlFile.delete(); - if (deleted) { - logger.info("KML File deleted : {}", KML_RESULTING_TEMP_FILE); //$NON-NLS-1$ - } else { - throw new IOException("The KML file could not be deleted at " + kmlFile.getPath()); //$NON-NLS-1$ - } - } - - } - logger.info("END - Generate KMZ file"); //$NON-NLS-1$ - } } From eff95dc64985e32c4703ac543b9fb1f04cfd420a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:39 +0100 Subject: [PATCH 1114/1620] New translations UpdateIniUtils.java (French) --- .../earth/app/view/Messages_fr.properties | 202 +++++++++++++++--- 1 file changed, 176 insertions(+), 26 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 4b902b8805..758b0b1b1a 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,48 +1,198 @@ package org.openforis.collect.earth.app.service; -import java.io.BufferedReader; +import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; +import java.net.URL; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Properties; +import java.util.concurrent.TimeUnit; +import javax.xml.parsers.DocumentBuilderFactory; + +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.w3c.dom.Document; + +public class UpdateIniUtils { + + private static final String VERSION_ID = "version_id"; + private static final String VERSION_NAME = "version"; + private static final Logger logger = LoggerFactory.getLogger(UpdateIniUtils.class); + private final SimpleDateFormat fromXml = new SimpleDateFormat("yyyyMMddHHmm"); + public static final String UPDATE_INI = "update.ini"; + + /** + * Checks if there is a newer version of the Collect Earth updater available + * @return The new version build-number if there is a new version. Null if the version online is not newer than the one installed + */ + public String getVersionAvailableOnline(){ + + String installedVersionBuild = getVersionInstalled(); + String urlXmlUpdaterOnline = getValueFromUpdateIni("url", UPDATE_INI); //$NON-NLS-1$ + String onlineVersionBuild = getVersionBuild(urlXmlUpdaterOnline); + + + try { + long installedBuild = Long.parseLong(installedVersionBuild); + long onlineBuild = Long.parseLong(onlineVersionBuild); + + if( onlineBuild > installedBuild ){ + return onlineBuild+""; //$NON-NLS-1$ + } + + } catch (NumberFormatException e) { + logger.error("Error parsing the buildNumber ", e); //$NON-NLS-1$ + } + + return null; + } + public static String getVersionInstalled() { + return getValueFromUpdateIni(VERSION_ID, UPDATE_INI); //$NON-NLS-1$ + } -public class ProcessLoggerThread extends Thread { + public static String getReleaseNameInstalled() { + return getValueFromUpdateIni(VERSION_NAME, UPDATE_INI); //$NON-NLS-1$ + } - private static final Logger LOGGER = LoggerFactory.getLogger(ProcessLoggerThread.class); + public boolean shouldWarnUser(LocalPropertiesService localPropertiesService){ + boolean warnUser = false; - private InputStream inputStream; + // newVersionAvailable will be null if the version installed is not older than the current version of the updater + String currentVersionOnline = getVersionAvailableOnline(); - private Boolean logOutputAsError; + if( !StringUtils.isBlank( currentVersionOnline ) ){ + // There is a new version. did the user chose "Not to be bother"with this update? + String lastIgnoredBuildNumber = localPropertiesService.getValue(EarthProperty.LAST_IGNORED_UPDATE); - public ProcessLoggerThread(InputStream inputStream, Boolean logOutputAsError) { - super(); + if( + ( isCurrentNewerThanIgnoredUpdate(lastIgnoredBuildNumber, currentVersionOnline) && isMajorUpdate()) + || + isInstalledOlderThanOneMonth(currentVersionOnline, getVersionInstalled() ) + ){ + warnUser = true; + } - this.inputStream = inputStream; - this.logOutputAsError = logOutputAsError; + } + return warnUser; } - @Override - public void run() { + /** + * Check if the current version of the updater is newer than the version of the updater that was last ignored + * @param lastIgnoredBuildNumber The version of the last ignored updater as a string with the format yyyyMMddHHmm + * @param buildNumberOnline The version of the current updater in the server in the format yyyyMMddHHmm + * @return True is the new version of the updater is newer than the one last ignored. False otherwise + */ + private boolean isCurrentNewerThanIgnoredUpdate(String lastIgnoredBuildNumber, String buildNumberOnline){ + + boolean isNewerThanIgnored = true; + try { - BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); - String line = reader.readLine(); - while (line != null) { - if( Boolean.TRUE.equals( logOutputAsError ) ) - LOGGER.error(line); - else - LOGGER.warn(line); - - line = reader.readLine(); + if( !StringUtils.isEmpty(lastIgnoredBuildNumber) && !StringUtils.isEmpty(buildNumberOnline) ){ + Long ignoredBuildNumberUpdate =new Long(lastIgnoredBuildNumber); + Long buildOnline = new Long( buildNumberOnline ); + + isNewerThanIgnored = ignoredBuildNumberUpdate 30); + } catch (Exception e) { + logger.error( "Error calculating difference in dates bvetween installed and available versions", e ); + } + + return isOlderThanOneMonth; + } + + + /** + * Checks if the update in the server is a "Major"update, meaning that every user should update Collect Earth + * @return True if the version on the server should be installed by all users + */ + public boolean isMajorUpdate() { + String urlXmlUpdaterOnline = getValueFromUpdateIni("url", UPDATE_INI); //$NON-NLS-1$ + String majorUpdateString = getXmlValueFromTag(urlXmlUpdaterOnline, VERSION_NAME); + return majorUpdateString.toLowerCase().contains("major"); + } + + private String getVersionBuild(String urlXmlUpdate) { + String tagname = "versionId"; //$NON-NLS-1$ + return getXmlValueFromTag(urlXmlUpdate, tagname); + } + + public String getXmlValueFromTag(String urlXmlUpdate, String tagname) { + + String onlineVersion = "0"; //$NON-NLS-1$ + try { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + //factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); // Compliant + //factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); // compliant + + factory.setNamespaceAware(true); + Document parse = factory.newDocumentBuilder().parse(new URL(urlXmlUpdate).openStream()); + + onlineVersion = parse.getElementsByTagName(tagname).item(0).getChildNodes().item(0).getNodeValue(); + + logger.info("CE Online Version available {}" , onlineVersion); + } catch (Exception e) { + logger.warn("Error while reading the remote XML where the updater version is defined", e); //$NON-NLS-1$ + } + + return onlineVersion; + } + + public static String getValueFromUpdateIni(String key, String pathToUpdateIni) { + Properties properties = new Properties(); + String value = "unknown"; //$NON-NLS-1$ + try (FileInputStream fis = new FileInputStream(pathToUpdateIni) ){ + properties.load( fis ); + value = properties.getProperty(key); + } catch (FileNotFoundException e) { + logger.error("The update.ini file could not be found", e); //$NON-NLS-1$ } catch (IOException e) { - LOGGER.error("The log reader died unexpectedly.", e); + logger.error("Error opening the update.ini file", e); //$NON-NLS-1$ } + return value; + } + + public String convertToDate(String buildVersionNumber) { + SimpleDateFormat humanReadable = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = buildVersionNumber; + try { + + reformattedStr = humanReadable.format(fromXml.parse(buildVersionNumber)); + } catch (java.text.ParseException e) { + logger.error("Error parsing the date from the XML updater" , e ); + } + + return reformattedStr; } -} \ No newline at end of file +} From 3d679a26796f487985172c5ff6565be52254f81f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:40 +0100 Subject: [PATCH 1115/1620] New translations UpdateIniUtils.java (Spanish) --- .../earth/app/view/Messages_es.properties | 260 +++++++++++------- 1 file changed, 165 insertions(+), 95 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 1550d687ee..758b0b1b1a 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,128 +1,198 @@ -package org.openforis.collect.earth.app.view; +package org.openforis.collect.earth.app.service; -import java.awt.Desktop; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseListener; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; +import java.net.URL; +import java.text.SimpleDateFormat; +import java.util.Date; import java.util.Properties; +import java.util.concurrent.TimeUnit; -import javax.swing.Box; -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JPanel; +import javax.xml.parsers.DocumentBuilderFactory; -import org.openforis.collect.earth.app.service.UpdateIniUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.w3c.dom.Document; -public class AboutDialog extends JDialog { - - private static final long serialVersionUID = 3108968706818898461L; - private transient Logger logger = LoggerFactory.getLogger( AboutDialog.class ); - - public AboutDialog(JFrame parent, String title) { - super(parent, title, true); - - UpdateIniUtils updateIniUtils = new UpdateIniUtils(); - String buildDate = updateIniUtils.convertToDate(getBuild()); - - Box b = Box.createVerticalBox(); - b.setAlignmentX(CENTER_ALIGNMENT); - b.add(Box.createGlue()); - b.add(new JLabel("Collect Earth v. " + getVersion() + " ( built " + buildDate + ") ")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - b.add(new JLabel("By Open Foris Initiative / Part of the Food and Agriculture Organization of the UN")); //$NON-NLS-1$ - JLabel comp = new JLabel("" + Messages.getString("AboutDialog.5") + ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - JLabel comp2 = new JLabel("CHECK THE CHANGE LOG"); - if (isBrowsingSupported()) { - makeLinkable(comp, new LinkMouseListener( "http://www.openforis.org" )); - makeLinkable(comp2, new LinkMouseListener( "https://github.com/openforis/collect-earth/blob/master/collect-earth/CHANGELOG.md" )); - } - b.add(comp); - b.add(comp2); - b.add(Box.createGlue()); - getContentPane().add(b, "Center"); //$NON-NLS-1$ - - JPanel p2 = new JPanel(); - JButton ok = new JButton(Messages.getString("AboutDialog.8")); //$NON-NLS-1$ - p2.add(ok); - getContentPane().add(p2, "South"); //$NON-NLS-1$ - - ok.addActionListener( e -> setVisible(false) ); - - setSize(380, 150); +public class UpdateIniUtils { + + private static final String VERSION_ID = "version_id"; + private static final String VERSION_NAME = "version"; + private static final Logger logger = LoggerFactory.getLogger(UpdateIniUtils.class); + private final SimpleDateFormat fromXml = new SimpleDateFormat("yyyyMMddHHmm"); + public static final String UPDATE_INI = "update.ini"; + + /** + * Checks if there is a newer version of the Collect Earth updater available + * @return The new version build-number if there is a new version. Null if the version online is not newer than the one installed + */ + public String getVersionAvailableOnline(){ + + String installedVersionBuild = getVersionInstalled(); + String urlXmlUpdaterOnline = getValueFromUpdateIni("url", UPDATE_INI); //$NON-NLS-1$ + String onlineVersionBuild = getVersionBuild(urlXmlUpdaterOnline); + + + try { + long installedBuild = Long.parseLong(installedVersionBuild); + long onlineBuild = Long.parseLong(onlineVersionBuild); + + if( onlineBuild > installedBuild ){ + return onlineBuild+""; //$NON-NLS-1$ + } + + } catch (NumberFormatException e) { + logger.error("Error parsing the buildNumber ", e); //$NON-NLS-1$ + } + + return null; } - private String getBuild() { - String key = "version_id"; //$NON-NLS-1$ - return getValueFromUpdateIni(key); + public static String getVersionInstalled() { + return getValueFromUpdateIni(VERSION_ID, UPDATE_INI); //$NON-NLS-1$ } - public String getValueFromUpdateIni(String key) { - Properties properties = new Properties(); - String value = "unknwown"; //$NON-NLS-1$ - try (FileInputStream fis = new FileInputStream("update.ini")) { //$NON-NLS-1$ - properties.load(fis); - value = properties.getProperty(key); - } catch (FileNotFoundException e) { - logger.error("The update.,ini file could not be found", e); //$NON-NLS-1$ - } catch (IOException e) { - logger.error("Error opening the update.ini file", e); //$NON-NLS-1$ + public static String getReleaseNameInstalled() { + return getValueFromUpdateIni(VERSION_NAME, UPDATE_INI); //$NON-NLS-1$ + } + + public boolean shouldWarnUser(LocalPropertiesService localPropertiesService){ + boolean warnUser = false; + + // newVersionAvailable will be null if the version installed is not older than the current version of the updater + String currentVersionOnline = getVersionAvailableOnline(); + + if( !StringUtils.isBlank( currentVersionOnline ) ){ + + // There is a new version. did the user chose "Not to be bother"with this update? + String lastIgnoredBuildNumber = localPropertiesService.getValue(EarthProperty.LAST_IGNORED_UPDATE); + + if( + ( isCurrentNewerThanIgnoredUpdate(lastIgnoredBuildNumber, currentVersionOnline) && isMajorUpdate()) + || + isInstalledOlderThanOneMonth(currentVersionOnline, getVersionInstalled() ) + ){ + warnUser = true; + } + } - return value; + return warnUser; } - private String getVersion() { - String key = "version"; //$NON-NLS-1$ - return getValueFromUpdateIni(key); + + /** + * Check if the current version of the updater is newer than the version of the updater that was last ignored + * @param lastIgnoredBuildNumber The version of the last ignored updater as a string with the format yyyyMMddHHmm + * @param buildNumberOnline The version of the current updater in the server in the format yyyyMMddHHmm + * @return True is the new version of the updater is newer than the one last ignored. False otherwise + */ + private boolean isCurrentNewerThanIgnoredUpdate(String lastIgnoredBuildNumber, String buildNumberOnline){ + + boolean isNewerThanIgnored = true; + + try { + if( !StringUtils.isEmpty(lastIgnoredBuildNumber) && !StringUtils.isEmpty(buildNumberOnline) ){ + Long ignoredBuildNumberUpdate =new Long(lastIgnoredBuildNumber); + Long buildOnline = new Long( buildNumberOnline ); + + isNewerThanIgnored = ignoredBuildNumberUpdate 30); + } catch (Exception e) { + logger.error( "Error calculating difference in dates bvetween installed and available versions", e ); + } + + return isOlderThanOneMonth; } - private static boolean isBrowsingSupported() { - if (!Desktop.isDesktopSupported()) { - return false; - } - boolean result = false; - Desktop desktop = java.awt.Desktop.getDesktop(); - if (desktop.isSupported(Desktop.Action.BROWSE)) { - result = true; - } - return result; + /** + * Checks if the update in the server is a "Major"update, meaning that every user should update Collect Earth + * @return True if the version on the server should be installed by all users + */ + public boolean isMajorUpdate() { + String urlXmlUpdaterOnline = getValueFromUpdateIni("url", UPDATE_INI); //$NON-NLS-1$ + String majorUpdateString = getXmlValueFromTag(urlXmlUpdaterOnline, VERSION_NAME); + return majorUpdateString.toLowerCase().contains("major"); } - private static class LinkMouseListener extends MouseAdapter { - String url; + private String getVersionBuild(String urlXmlUpdate) { + String tagname = "versionId"; //$NON-NLS-1$ + return getXmlValueFromTag(urlXmlUpdate, tagname); + } + public String getXmlValueFromTag(String urlXmlUpdate, String tagname) { - public LinkMouseListener(String url) { - super(); - this.url = url; - } + String onlineVersion = "0"; //$NON-NLS-1$ + try { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + //factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); // Compliant + //factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); // compliant + + factory.setNamespaceAware(true); + Document parse = factory.newDocumentBuilder().parse(new URL(urlXmlUpdate).openStream()); + onlineVersion = parse.getElementsByTagName(tagname).item(0).getChildNodes().item(0).getNodeValue(); - @Override - public void mouseClicked(java.awt.event.MouseEvent evt) { - JLabel l = (JLabel) evt.getSource(); - try { + logger.info("CE Online Version available {}" , onlineVersion); + } catch (Exception e) { + logger.warn("Error while reading the remote XML where the updater version is defined", e); //$NON-NLS-1$ + } - URI uri = new java.net.URI(url); //$NON-NLS-1$ - (new LinkRunner(uri)).execute(); - } catch (URISyntaxException use) { - throw new AssertionError(use + ": " + l.getText()); //NOI18N //$NON-NLS-1$ - } - } + return onlineVersion; } + public static String getValueFromUpdateIni(String key, String pathToUpdateIni) { + Properties properties = new Properties(); + String value = "unknown"; //$NON-NLS-1$ + try (FileInputStream fis = new FileInputStream(pathToUpdateIni) ){ + properties.load( fis ); + value = properties.getProperty(key); + } catch (FileNotFoundException e) { + logger.error("The update.ini file could not be found", e); //$NON-NLS-1$ + } catch (IOException e) { + logger.error("Error opening the update.ini file", e); //$NON-NLS-1$ + } + return value; + } + + public String convertToDate(String buildVersionNumber) { + SimpleDateFormat humanReadable = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = buildVersionNumber; + try { + + reformattedStr = humanReadable.format(fromXml.parse(buildVersionNumber)); + } catch (java.text.ParseException e) { + logger.error("Error parsing the date from the XML updater" , e ); + } + + return reformattedStr; + } } From 96388127ff1e52351946ec3cb653725801e0bde6 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:42 +0100 Subject: [PATCH 1116/1620] New translations UpdateIniUtils.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 249 ++++++++++++------ 1 file changed, 171 insertions(+), 78 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index c1b9c5db00..758b0b1b1a 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,105 +1,198 @@ package org.openforis.collect.earth.app.service; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.ipcc.IPCCGenerator; -import org.openforis.collect.earth.ipcc.IPCCGeneratorException; -import org.openforis.collect.earth.ipcc.RdbExportException; -import org.openforis.collect.model.CollectSurvey; -import org.openforis.collect.relational.CollectRDBPublisher; -import org.openforis.collect.relational.CollectRdbException; -import org.openforis.idm.metamodel.NodeDefinition; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.net.URL; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Properties; +import java.util.concurrent.TimeUnit; + +import javax.xml.parsers.DocumentBuilderFactory; + +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; +import org.w3c.dom.Document; -@Component -public class IPCCGeneratorService extends GenerateDatabase{ +public class UpdateIniUtils { - @Autowired - RDBExporter rdbExporter; - - @Autowired - CollectRDBPublisher collectRDBPublisher; + private static final String VERSION_ID = "version_id"; + private static final String VERSION_NAME = "version"; + private static final Logger logger = LoggerFactory.getLogger(UpdateIniUtils.class); + private final SimpleDateFormat fromXml = new SimpleDateFormat("yyyyMMddHHmm"); + public static final String UPDATE_INI = "update.ini"; - @Autowired - EarthSurveyService earthSurveyService; + /** + * Checks if there is a newer version of the Collect Earth updater available + * @return The new version build-number if there is a new version. Null if the version online is not newer than the one installed + */ + public String getVersionAvailableOnline(){ - @Autowired - public LocalPropertiesService localPropertiesService; + String installedVersionBuild = getVersionInstalled(); + String urlXmlUpdaterOnline = getValueFromUpdateIni("url", UPDATE_INI); //$NON-NLS-1$ + String onlineVersionBuild = getVersionBuild(urlXmlUpdaterOnline); - @Autowired - BrowserService browserService; - @Autowired - private IPCCGenerator ipccGenerator; - - final Logger logger = LoggerFactory.getLogger(IPCCGeneratorService.class); + try { + long installedBuild = Long.parseLong(installedVersionBuild); + long onlineBuild = Long.parseLong(onlineVersionBuild); - public void prepareDataForAnalysis(InfiniteProgressMonitor progressListener, boolean startSaikuAfterDBExport) throws RdbExportException { + if( onlineBuild > installedBuild ){ + return onlineBuild+""; //$NON-NLS-1$ + } - try { + } catch (NumberFormatException e) { + logger.error("Error parsing the buildNumber ", e); //$NON-NLS-1$ + } + + return null; + } + + public static String getVersionInstalled() { + return getValueFromUpdateIni(VERSION_ID, UPDATE_INI); //$NON-NLS-1$ + } + + public static String getReleaseNameInstalled() { + return getValueFromUpdateIni(VERSION_NAME, UPDATE_INI); //$NON-NLS-1$ + } + + public boolean shouldWarnUser(LocalPropertiesService localPropertiesService){ + boolean warnUser = false; + + // newVersionAvailable will be null if the version installed is not older than the current version of the updater + String currentVersionOnline = getVersionAvailableOnline(); + + if( !StringUtils.isBlank( currentVersionOnline ) ){ + + // There is a new version. did the user chose "Not to be bother"with this update? + String lastIgnoredBuildNumber = localPropertiesService.getValue(EarthProperty.LAST_IGNORED_UPDATE); + + if( + ( isCurrentNewerThanIgnoredUpdate(lastIgnoredBuildNumber, currentVersionOnline) && isMajorUpdate()) + || + isInstalledOlderThanOneMonth(currentVersionOnline, getVersionInstalled() ) + ){ + warnUser = true; + } + + } + return warnUser; + } + + + /** + * Check if the current version of the updater is newer than the version of the updater that was last ignored + * @param lastIgnoredBuildNumber The version of the last ignored updater as a string with the format yyyyMMddHHmm + * @param buildNumberOnline The version of the current updater in the server in the format yyyyMMddHHmm + * @return True is the new version of the updater is newer than the one last ignored. False otherwise + */ + private boolean isCurrentNewerThanIgnoredUpdate(String lastIgnoredBuildNumber, String buildNumberOnline){ + + boolean isNewerThanIgnored = true; - try { - - if ( - (localPropertiesService.isUsingSqliteDB() && !getZippedProjectDB( ExportType.IPCC ).exists()) - || - isRefreshDatabase() - ) { - - // The user clicked on the option to refresh the database, or there is no - // previous copy of the Saiku DB - // Generate the DB file - ipccGenerator.generateRDB( earthSurveyService.getCollectSurvey(), progressListener); - - try { - // Save the DB file in a zipped file to extends GenerateDatabase keep for the next usages - replaceZippedProjectDB( ExportType.IPCC ); - } catch (Exception e) { - logger.error("Error while refreshing the Zipped content of the project IPCC DB", e); - } - - } else if (getZippedProjectDB(ExportType.IPCC).exists()) { - // If the zipped version of the project exists ( and the user clicked on the - // option to not refresh it) then restore this last version of the data - if (localPropertiesService.isUsingSqliteDB()) { - restoreZippedProjectDB(ExportType.IPCC); - } - } - - ipccGenerator.produceOutputs( earthSurveyService.getCollectSurvey(), progressListener ); - - } catch (final IPCCGeneratorException e) { - logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ - } - - } catch (final CollectRdbException e) { - logger.error("Error while producing Relational DB from Collect format", e); //$NON-NLS-1$ + try { + if( !StringUtils.isEmpty(lastIgnoredBuildNumber) && !StringUtils.isEmpty(buildNumberOnline) ){ + Long ignoredBuildNumberUpdate =new Long(lastIgnoredBuildNumber); + Long buildOnline = new Long( buildNumberOnline ); + + isNewerThanIgnored = ignoredBuildNumberUpdate 30); + } catch (Exception e) { + logger.error( "Error calculating difference in dates bvetween installed and available versions", e ); + } - public static boolean surveyContains(String nodeName, CollectSurvey survey) { - NodeDefinition nodeDefForNAme = survey.getSchema().findNodeDefinition( nodeDef -> nodeDef.getName().equals(nodeName) ); - return nodeDefForNAme != null; + return isOlderThanOneMonth; } - @Override - public LocalPropertiesService getLocalPropertiesService() { - return localPropertiesService; + /** + * Checks if the update in the server is a "Major"update, meaning that every user should update Collect Earth + * @return True if the version on the server should be installed by all users + */ + public boolean isMajorUpdate() { + String urlXmlUpdaterOnline = getValueFromUpdateIni("url", UPDATE_INI); //$NON-NLS-1$ + String majorUpdateString = getXmlValueFromTag(urlXmlUpdaterOnline, VERSION_NAME); + return majorUpdateString.toLowerCase().contains("major"); } - @Override - public EarthSurveyService getEarthSurveyService() { - return earthSurveyService; + private String getVersionBuild(String urlXmlUpdate) { + String tagname = "versionId"; //$NON-NLS-1$ + return getXmlValueFromTag(urlXmlUpdate, tagname); + } + + public String getXmlValueFromTag(String urlXmlUpdate, String tagname) { + + String onlineVersion = "0"; //$NON-NLS-1$ + try { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + //factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); // Compliant + //factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); // compliant + + factory.setNamespaceAware(true); + Document parse = factory.newDocumentBuilder().parse(new URL(urlXmlUpdate).openStream()); + + onlineVersion = parse.getElementsByTagName(tagname).item(0).getChildNodes().item(0).getNodeValue(); + + logger.info("CE Online Version available {}" , onlineVersion); + } catch (Exception e) { + logger.warn("Error while reading the remote XML where the updater version is defined", e); //$NON-NLS-1$ + } + + return onlineVersion; } - @Override - public RDBExporter getRdbExporter() { - return rdbExporter; + public static String getValueFromUpdateIni(String key, String pathToUpdateIni) { + Properties properties = new Properties(); + String value = "unknown"; //$NON-NLS-1$ + try (FileInputStream fis = new FileInputStream(pathToUpdateIni) ){ + properties.load( fis ); + value = properties.getProperty(key); + } catch (FileNotFoundException e) { + logger.error("The update.ini file could not be found", e); //$NON-NLS-1$ + } catch (IOException e) { + logger.error("Error opening the update.ini file", e); //$NON-NLS-1$ + } + return value; } -} \ No newline at end of file + public String convertToDate(String buildVersionNumber) { + SimpleDateFormat humanReadable = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = buildVersionNumber; + try { + + reformattedStr = humanReadable.format(fromXml.parse(buildVersionNumber)); + } catch (java.text.ParseException e) { + logger.error("Error parsing the date from the XML updater" , e ); + } + + return reformattedStr; + } +} From 030b7a4a29d1b5afc044487750223af6c3c3c88f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:43 +0100 Subject: [PATCH 1117/1620] New translations UpdateIniUtils.java (English) --- .../earth/app/view/Messages_en.properties | 220 +++++++++++++++--- 1 file changed, 188 insertions(+), 32 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 8d225e803d..758b0b1b1a 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,42 +1,198 @@ package org.openforis.collect.earth.app.service; -import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.IOException; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; +import java.net.URL; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Properties; +import java.util.concurrent.TimeUnit; -import org.apache.commons.io.FileUtils; +import javax.xml.parsers.DocumentBuilderFactory; + +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ -@Component -public class PreloadedFilesService { - - private final Logger logger = LoggerFactory.getLogger(PreloadedFilesService.class); - - private final Map filesInMemory; - - public PreloadedFilesService() { - filesInMemory = new ConcurrentHashMap<>(); - } - - public byte[] getFileContent(File file) { - byte[] fileContents = filesInMemory.get(file.getPath()); - if (fileContents == null) { - byte[] content = new byte[0]; - try { - content = FileUtils.readFileToByteArray(file); - filesInMemory.put(file.getPath(), content); - } catch (IOException e) { - logger.error("Problems while reading the file " + file.getPath() + " was not found.", e); +import org.w3c.dom.Document; + +public class UpdateIniUtils { + + private static final String VERSION_ID = "version_id"; + private static final String VERSION_NAME = "version"; + private static final Logger logger = LoggerFactory.getLogger(UpdateIniUtils.class); + private final SimpleDateFormat fromXml = new SimpleDateFormat("yyyyMMddHHmm"); + public static final String UPDATE_INI = "update.ini"; + + /** + * Checks if there is a newer version of the Collect Earth updater available + * @return The new version build-number if there is a new version. Null if the version online is not newer than the one installed + */ + public String getVersionAvailableOnline(){ + + String installedVersionBuild = getVersionInstalled(); + String urlXmlUpdaterOnline = getValueFromUpdateIni("url", UPDATE_INI); //$NON-NLS-1$ + String onlineVersionBuild = getVersionBuild(urlXmlUpdaterOnline); + + + try { + long installedBuild = Long.parseLong(installedVersionBuild); + long onlineBuild = Long.parseLong(onlineVersionBuild); + + if( onlineBuild > installedBuild ){ + return onlineBuild+""; //$NON-NLS-1$ + } + + } catch (NumberFormatException e) { + logger.error("Error parsing the buildNumber ", e); //$NON-NLS-1$ + } + + return null; + } + + public static String getVersionInstalled() { + return getValueFromUpdateIni(VERSION_ID, UPDATE_INI); //$NON-NLS-1$ + } + + public static String getReleaseNameInstalled() { + return getValueFromUpdateIni(VERSION_NAME, UPDATE_INI); //$NON-NLS-1$ + } + + public boolean shouldWarnUser(LocalPropertiesService localPropertiesService){ + boolean warnUser = false; + + // newVersionAvailable will be null if the version installed is not older than the current version of the updater + String currentVersionOnline = getVersionAvailableOnline(); + + if( !StringUtils.isBlank( currentVersionOnline ) ){ + + // There is a new version. did the user chose "Not to be bother"with this update? + String lastIgnoredBuildNumber = localPropertiesService.getValue(EarthProperty.LAST_IGNORED_UPDATE); + + if( + ( isCurrentNewerThanIgnoredUpdate(lastIgnoredBuildNumber, currentVersionOnline) && isMajorUpdate()) + || + isInstalledOlderThanOneMonth(currentVersionOnline, getVersionInstalled() ) + ){ + warnUser = true; } - fileContents = content; + } - return fileContents; + return warnUser; + } + + + /** + * Check if the current version of the updater is newer than the version of the updater that was last ignored + * @param lastIgnoredBuildNumber The version of the last ignored updater as a string with the format yyyyMMddHHmm + * @param buildNumberOnline The version of the current updater in the server in the format yyyyMMddHHmm + * @return True is the new version of the updater is newer than the one last ignored. False otherwise + */ + private boolean isCurrentNewerThanIgnoredUpdate(String lastIgnoredBuildNumber, String buildNumberOnline){ + + boolean isNewerThanIgnored = true; + + try { + if( !StringUtils.isEmpty(lastIgnoredBuildNumber) && !StringUtils.isEmpty(buildNumberOnline) ){ + Long ignoredBuildNumberUpdate =new Long(lastIgnoredBuildNumber); + Long buildOnline = new Long( buildNumberOnline ); + + isNewerThanIgnored = ignoredBuildNumberUpdate 30); + } catch (Exception e) { + logger.error( "Error calculating difference in dates bvetween installed and available versions", e ); + } + + return isOlderThanOneMonth; + } + + + /** + * Checks if the update in the server is a "Major"update, meaning that every user should update Collect Earth + * @return True if the version on the server should be installed by all users + */ + public boolean isMajorUpdate() { + String urlXmlUpdaterOnline = getValueFromUpdateIni("url", UPDATE_INI); //$NON-NLS-1$ + String majorUpdateString = getXmlValueFromTag(urlXmlUpdaterOnline, VERSION_NAME); + return majorUpdateString.toLowerCase().contains("major"); + } + + private String getVersionBuild(String urlXmlUpdate) { + String tagname = "versionId"; //$NON-NLS-1$ + return getXmlValueFromTag(urlXmlUpdate, tagname); + } + + public String getXmlValueFromTag(String urlXmlUpdate, String tagname) { + + String onlineVersion = "0"; //$NON-NLS-1$ + try { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + //factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); // Compliant + //factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); // compliant + + factory.setNamespaceAware(true); + Document parse = factory.newDocumentBuilder().parse(new URL(urlXmlUpdate).openStream()); + + onlineVersion = parse.getElementsByTagName(tagname).item(0).getChildNodes().item(0).getNodeValue(); + + logger.info("CE Online Version available {}" , onlineVersion); + } catch (Exception e) { + logger.warn("Error while reading the remote XML where the updater version is defined", e); //$NON-NLS-1$ + } + + return onlineVersion; + } + + public static String getValueFromUpdateIni(String key, String pathToUpdateIni) { + Properties properties = new Properties(); + String value = "unknown"; //$NON-NLS-1$ + try (FileInputStream fis = new FileInputStream(pathToUpdateIni) ){ + properties.load( fis ); + value = properties.getProperty(key); + } catch (FileNotFoundException e) { + logger.error("The update.ini file could not be found", e); //$NON-NLS-1$ + } catch (IOException e) { + logger.error("Error opening the update.ini file", e); //$NON-NLS-1$ + } + return value; + } + + public String convertToDate(String buildVersionNumber) { + SimpleDateFormat humanReadable = new SimpleDateFormat("yyyy-MM-dd"); + String reformattedStr = buildVersionNumber; + try { + + reformattedStr = humanReadable.format(fromXml.parse(buildVersionNumber)); + } catch (java.text.ParseException e) { + logger.error("Error parsing the date from the XML updater" , e ); + } + + return reformattedStr; } } From a01e54c5fcfb2237fe3face2050466a47036f4f8 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:44 +0100 Subject: [PATCH 1118/1620] New translations .gitignore (French) --- .../earth/app/view/Messages_fr.properties | 199 +----------------- 1 file changed, 1 insertion(+), 198 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 758b0b1b1a..8c63826403 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,198 +1 @@ -package org.openforis.collect.earth.app.service; - -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.net.URL; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Properties; -import java.util.concurrent.TimeUnit; - -import javax.xml.parsers.DocumentBuilderFactory; - -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.w3c.dom.Document; - -public class UpdateIniUtils { - - private static final String VERSION_ID = "version_id"; - private static final String VERSION_NAME = "version"; - private static final Logger logger = LoggerFactory.getLogger(UpdateIniUtils.class); - private final SimpleDateFormat fromXml = new SimpleDateFormat("yyyyMMddHHmm"); - public static final String UPDATE_INI = "update.ini"; - - /** - * Checks if there is a newer version of the Collect Earth updater available - * @return The new version build-number if there is a new version. Null if the version online is not newer than the one installed - */ - public String getVersionAvailableOnline(){ - - String installedVersionBuild = getVersionInstalled(); - String urlXmlUpdaterOnline = getValueFromUpdateIni("url", UPDATE_INI); //$NON-NLS-1$ - String onlineVersionBuild = getVersionBuild(urlXmlUpdaterOnline); - - - try { - long installedBuild = Long.parseLong(installedVersionBuild); - long onlineBuild = Long.parseLong(onlineVersionBuild); - - if( onlineBuild > installedBuild ){ - return onlineBuild+""; //$NON-NLS-1$ - } - - } catch (NumberFormatException e) { - logger.error("Error parsing the buildNumber ", e); //$NON-NLS-1$ - } - - return null; - } - - public static String getVersionInstalled() { - return getValueFromUpdateIni(VERSION_ID, UPDATE_INI); //$NON-NLS-1$ - } - - public static String getReleaseNameInstalled() { - return getValueFromUpdateIni(VERSION_NAME, UPDATE_INI); //$NON-NLS-1$ - } - - public boolean shouldWarnUser(LocalPropertiesService localPropertiesService){ - boolean warnUser = false; - - // newVersionAvailable will be null if the version installed is not older than the current version of the updater - String currentVersionOnline = getVersionAvailableOnline(); - - if( !StringUtils.isBlank( currentVersionOnline ) ){ - - // There is a new version. did the user chose "Not to be bother"with this update? - String lastIgnoredBuildNumber = localPropertiesService.getValue(EarthProperty.LAST_IGNORED_UPDATE); - - if( - ( isCurrentNewerThanIgnoredUpdate(lastIgnoredBuildNumber, currentVersionOnline) && isMajorUpdate()) - || - isInstalledOlderThanOneMonth(currentVersionOnline, getVersionInstalled() ) - ){ - warnUser = true; - } - - } - return warnUser; - } - - - /** - * Check if the current version of the updater is newer than the version of the updater that was last ignored - * @param lastIgnoredBuildNumber The version of the last ignored updater as a string with the format yyyyMMddHHmm - * @param buildNumberOnline The version of the current updater in the server in the format yyyyMMddHHmm - * @return True is the new version of the updater is newer than the one last ignored. False otherwise - */ - private boolean isCurrentNewerThanIgnoredUpdate(String lastIgnoredBuildNumber, String buildNumberOnline){ - - boolean isNewerThanIgnored = true; - - try { - if( !StringUtils.isEmpty(lastIgnoredBuildNumber) && !StringUtils.isEmpty(buildNumberOnline) ){ - Long ignoredBuildNumberUpdate =new Long(lastIgnoredBuildNumber); - Long buildOnline = new Long( buildNumberOnline ); - - isNewerThanIgnored = ignoredBuildNumberUpdate 30); - } catch (Exception e) { - logger.error( "Error calculating difference in dates bvetween installed and available versions", e ); - } - - return isOlderThanOneMonth; - } - - - /** - * Checks if the update in the server is a "Major"update, meaning that every user should update Collect Earth - * @return True if the version on the server should be installed by all users - */ - public boolean isMajorUpdate() { - String urlXmlUpdaterOnline = getValueFromUpdateIni("url", UPDATE_INI); //$NON-NLS-1$ - String majorUpdateString = getXmlValueFromTag(urlXmlUpdaterOnline, VERSION_NAME); - return majorUpdateString.toLowerCase().contains("major"); - } - - private String getVersionBuild(String urlXmlUpdate) { - String tagname = "versionId"; //$NON-NLS-1$ - return getXmlValueFromTag(urlXmlUpdate, tagname); - } - - public String getXmlValueFromTag(String urlXmlUpdate, String tagname) { - - String onlineVersion = "0"; //$NON-NLS-1$ - try { - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - //factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); // Compliant - //factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); // compliant - - factory.setNamespaceAware(true); - Document parse = factory.newDocumentBuilder().parse(new URL(urlXmlUpdate).openStream()); - - onlineVersion = parse.getElementsByTagName(tagname).item(0).getChildNodes().item(0).getNodeValue(); - - logger.info("CE Online Version available {}" , onlineVersion); - } catch (Exception e) { - logger.warn("Error while reading the remote XML where the updater version is defined", e); //$NON-NLS-1$ - } - - return onlineVersion; - } - - public static String getValueFromUpdateIni(String key, String pathToUpdateIni) { - Properties properties = new Properties(); - String value = "unknown"; //$NON-NLS-1$ - try (FileInputStream fis = new FileInputStream(pathToUpdateIni) ){ - properties.load( fis ); - value = properties.getProperty(key); - } catch (FileNotFoundException e) { - logger.error("The update.ini file could not be found", e); //$NON-NLS-1$ - } catch (IOException e) { - logger.error("Error opening the update.ini file", e); //$NON-NLS-1$ - } - return value; - } - - public String convertToDate(String buildVersionNumber) { - SimpleDateFormat humanReadable = new SimpleDateFormat("yyyy-MM-dd"); - String reformattedStr = buildVersionNumber; - try { - - reformattedStr = humanReadable.format(fromXml.parse(buildVersionNumber)); - } catch (java.text.ParseException e) { - logger.error("Error parsing the date from the XML updater" , e ); - } - - return reformattedStr; - } -} +/SaikuToolGenerationDlg.java From bab54bcd95a94685d4d2c2def573a229c0d1e144 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:45 +0100 Subject: [PATCH 1119/1620] New translations .gitignore (Spanish) --- .../earth/app/view/Messages_es.properties | 199 +----------------- 1 file changed, 1 insertion(+), 198 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 758b0b1b1a..8c63826403 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,198 +1 @@ -package org.openforis.collect.earth.app.service; - -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.net.URL; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Properties; -import java.util.concurrent.TimeUnit; - -import javax.xml.parsers.DocumentBuilderFactory; - -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.w3c.dom.Document; - -public class UpdateIniUtils { - - private static final String VERSION_ID = "version_id"; - private static final String VERSION_NAME = "version"; - private static final Logger logger = LoggerFactory.getLogger(UpdateIniUtils.class); - private final SimpleDateFormat fromXml = new SimpleDateFormat("yyyyMMddHHmm"); - public static final String UPDATE_INI = "update.ini"; - - /** - * Checks if there is a newer version of the Collect Earth updater available - * @return The new version build-number if there is a new version. Null if the version online is not newer than the one installed - */ - public String getVersionAvailableOnline(){ - - String installedVersionBuild = getVersionInstalled(); - String urlXmlUpdaterOnline = getValueFromUpdateIni("url", UPDATE_INI); //$NON-NLS-1$ - String onlineVersionBuild = getVersionBuild(urlXmlUpdaterOnline); - - - try { - long installedBuild = Long.parseLong(installedVersionBuild); - long onlineBuild = Long.parseLong(onlineVersionBuild); - - if( onlineBuild > installedBuild ){ - return onlineBuild+""; //$NON-NLS-1$ - } - - } catch (NumberFormatException e) { - logger.error("Error parsing the buildNumber ", e); //$NON-NLS-1$ - } - - return null; - } - - public static String getVersionInstalled() { - return getValueFromUpdateIni(VERSION_ID, UPDATE_INI); //$NON-NLS-1$ - } - - public static String getReleaseNameInstalled() { - return getValueFromUpdateIni(VERSION_NAME, UPDATE_INI); //$NON-NLS-1$ - } - - public boolean shouldWarnUser(LocalPropertiesService localPropertiesService){ - boolean warnUser = false; - - // newVersionAvailable will be null if the version installed is not older than the current version of the updater - String currentVersionOnline = getVersionAvailableOnline(); - - if( !StringUtils.isBlank( currentVersionOnline ) ){ - - // There is a new version. did the user chose "Not to be bother"with this update? - String lastIgnoredBuildNumber = localPropertiesService.getValue(EarthProperty.LAST_IGNORED_UPDATE); - - if( - ( isCurrentNewerThanIgnoredUpdate(lastIgnoredBuildNumber, currentVersionOnline) && isMajorUpdate()) - || - isInstalledOlderThanOneMonth(currentVersionOnline, getVersionInstalled() ) - ){ - warnUser = true; - } - - } - return warnUser; - } - - - /** - * Check if the current version of the updater is newer than the version of the updater that was last ignored - * @param lastIgnoredBuildNumber The version of the last ignored updater as a string with the format yyyyMMddHHmm - * @param buildNumberOnline The version of the current updater in the server in the format yyyyMMddHHmm - * @return True is the new version of the updater is newer than the one last ignored. False otherwise - */ - private boolean isCurrentNewerThanIgnoredUpdate(String lastIgnoredBuildNumber, String buildNumberOnline){ - - boolean isNewerThanIgnored = true; - - try { - if( !StringUtils.isEmpty(lastIgnoredBuildNumber) && !StringUtils.isEmpty(buildNumberOnline) ){ - Long ignoredBuildNumberUpdate =new Long(lastIgnoredBuildNumber); - Long buildOnline = new Long( buildNumberOnline ); - - isNewerThanIgnored = ignoredBuildNumberUpdate 30); - } catch (Exception e) { - logger.error( "Error calculating difference in dates bvetween installed and available versions", e ); - } - - return isOlderThanOneMonth; - } - - - /** - * Checks if the update in the server is a "Major"update, meaning that every user should update Collect Earth - * @return True if the version on the server should be installed by all users - */ - public boolean isMajorUpdate() { - String urlXmlUpdaterOnline = getValueFromUpdateIni("url", UPDATE_INI); //$NON-NLS-1$ - String majorUpdateString = getXmlValueFromTag(urlXmlUpdaterOnline, VERSION_NAME); - return majorUpdateString.toLowerCase().contains("major"); - } - - private String getVersionBuild(String urlXmlUpdate) { - String tagname = "versionId"; //$NON-NLS-1$ - return getXmlValueFromTag(urlXmlUpdate, tagname); - } - - public String getXmlValueFromTag(String urlXmlUpdate, String tagname) { - - String onlineVersion = "0"; //$NON-NLS-1$ - try { - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - //factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); // Compliant - //factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); // compliant - - factory.setNamespaceAware(true); - Document parse = factory.newDocumentBuilder().parse(new URL(urlXmlUpdate).openStream()); - - onlineVersion = parse.getElementsByTagName(tagname).item(0).getChildNodes().item(0).getNodeValue(); - - logger.info("CE Online Version available {}" , onlineVersion); - } catch (Exception e) { - logger.warn("Error while reading the remote XML where the updater version is defined", e); //$NON-NLS-1$ - } - - return onlineVersion; - } - - public static String getValueFromUpdateIni(String key, String pathToUpdateIni) { - Properties properties = new Properties(); - String value = "unknown"; //$NON-NLS-1$ - try (FileInputStream fis = new FileInputStream(pathToUpdateIni) ){ - properties.load( fis ); - value = properties.getProperty(key); - } catch (FileNotFoundException e) { - logger.error("The update.ini file could not be found", e); //$NON-NLS-1$ - } catch (IOException e) { - logger.error("Error opening the update.ini file", e); //$NON-NLS-1$ - } - return value; - } - - public String convertToDate(String buildVersionNumber) { - SimpleDateFormat humanReadable = new SimpleDateFormat("yyyy-MM-dd"); - String reformattedStr = buildVersionNumber; - try { - - reformattedStr = humanReadable.format(fromXml.parse(buildVersionNumber)); - } catch (java.text.ParseException e) { - logger.error("Error parsing the date from the XML updater" , e ); - } - - return reformattedStr; - } -} +/SaikuToolGenerationDlg.java From 847ccf0c52138ed06da52c103c20bf941eb325cb Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:46 +0100 Subject: [PATCH 1120/1620] New translations .gitignore (Portuguese) --- .../earth/app/view/Messages_pt.properties | 199 +----------------- 1 file changed, 1 insertion(+), 198 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 758b0b1b1a..8c63826403 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,198 +1 @@ -package org.openforis.collect.earth.app.service; - -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.net.URL; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Properties; -import java.util.concurrent.TimeUnit; - -import javax.xml.parsers.DocumentBuilderFactory; - -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.w3c.dom.Document; - -public class UpdateIniUtils { - - private static final String VERSION_ID = "version_id"; - private static final String VERSION_NAME = "version"; - private static final Logger logger = LoggerFactory.getLogger(UpdateIniUtils.class); - private final SimpleDateFormat fromXml = new SimpleDateFormat("yyyyMMddHHmm"); - public static final String UPDATE_INI = "update.ini"; - - /** - * Checks if there is a newer version of the Collect Earth updater available - * @return The new version build-number if there is a new version. Null if the version online is not newer than the one installed - */ - public String getVersionAvailableOnline(){ - - String installedVersionBuild = getVersionInstalled(); - String urlXmlUpdaterOnline = getValueFromUpdateIni("url", UPDATE_INI); //$NON-NLS-1$ - String onlineVersionBuild = getVersionBuild(urlXmlUpdaterOnline); - - - try { - long installedBuild = Long.parseLong(installedVersionBuild); - long onlineBuild = Long.parseLong(onlineVersionBuild); - - if( onlineBuild > installedBuild ){ - return onlineBuild+""; //$NON-NLS-1$ - } - - } catch (NumberFormatException e) { - logger.error("Error parsing the buildNumber ", e); //$NON-NLS-1$ - } - - return null; - } - - public static String getVersionInstalled() { - return getValueFromUpdateIni(VERSION_ID, UPDATE_INI); //$NON-NLS-1$ - } - - public static String getReleaseNameInstalled() { - return getValueFromUpdateIni(VERSION_NAME, UPDATE_INI); //$NON-NLS-1$ - } - - public boolean shouldWarnUser(LocalPropertiesService localPropertiesService){ - boolean warnUser = false; - - // newVersionAvailable will be null if the version installed is not older than the current version of the updater - String currentVersionOnline = getVersionAvailableOnline(); - - if( !StringUtils.isBlank( currentVersionOnline ) ){ - - // There is a new version. did the user chose "Not to be bother"with this update? - String lastIgnoredBuildNumber = localPropertiesService.getValue(EarthProperty.LAST_IGNORED_UPDATE); - - if( - ( isCurrentNewerThanIgnoredUpdate(lastIgnoredBuildNumber, currentVersionOnline) && isMajorUpdate()) - || - isInstalledOlderThanOneMonth(currentVersionOnline, getVersionInstalled() ) - ){ - warnUser = true; - } - - } - return warnUser; - } - - - /** - * Check if the current version of the updater is newer than the version of the updater that was last ignored - * @param lastIgnoredBuildNumber The version of the last ignored updater as a string with the format yyyyMMddHHmm - * @param buildNumberOnline The version of the current updater in the server in the format yyyyMMddHHmm - * @return True is the new version of the updater is newer than the one last ignored. False otherwise - */ - private boolean isCurrentNewerThanIgnoredUpdate(String lastIgnoredBuildNumber, String buildNumberOnline){ - - boolean isNewerThanIgnored = true; - - try { - if( !StringUtils.isEmpty(lastIgnoredBuildNumber) && !StringUtils.isEmpty(buildNumberOnline) ){ - Long ignoredBuildNumberUpdate =new Long(lastIgnoredBuildNumber); - Long buildOnline = new Long( buildNumberOnline ); - - isNewerThanIgnored = ignoredBuildNumberUpdate 30); - } catch (Exception e) { - logger.error( "Error calculating difference in dates bvetween installed and available versions", e ); - } - - return isOlderThanOneMonth; - } - - - /** - * Checks if the update in the server is a "Major"update, meaning that every user should update Collect Earth - * @return True if the version on the server should be installed by all users - */ - public boolean isMajorUpdate() { - String urlXmlUpdaterOnline = getValueFromUpdateIni("url", UPDATE_INI); //$NON-NLS-1$ - String majorUpdateString = getXmlValueFromTag(urlXmlUpdaterOnline, VERSION_NAME); - return majorUpdateString.toLowerCase().contains("major"); - } - - private String getVersionBuild(String urlXmlUpdate) { - String tagname = "versionId"; //$NON-NLS-1$ - return getXmlValueFromTag(urlXmlUpdate, tagname); - } - - public String getXmlValueFromTag(String urlXmlUpdate, String tagname) { - - String onlineVersion = "0"; //$NON-NLS-1$ - try { - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - //factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); // Compliant - //factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); // compliant - - factory.setNamespaceAware(true); - Document parse = factory.newDocumentBuilder().parse(new URL(urlXmlUpdate).openStream()); - - onlineVersion = parse.getElementsByTagName(tagname).item(0).getChildNodes().item(0).getNodeValue(); - - logger.info("CE Online Version available {}" , onlineVersion); - } catch (Exception e) { - logger.warn("Error while reading the remote XML where the updater version is defined", e); //$NON-NLS-1$ - } - - return onlineVersion; - } - - public static String getValueFromUpdateIni(String key, String pathToUpdateIni) { - Properties properties = new Properties(); - String value = "unknown"; //$NON-NLS-1$ - try (FileInputStream fis = new FileInputStream(pathToUpdateIni) ){ - properties.load( fis ); - value = properties.getProperty(key); - } catch (FileNotFoundException e) { - logger.error("The update.ini file could not be found", e); //$NON-NLS-1$ - } catch (IOException e) { - logger.error("Error opening the update.ini file", e); //$NON-NLS-1$ - } - return value; - } - - public String convertToDate(String buildVersionNumber) { - SimpleDateFormat humanReadable = new SimpleDateFormat("yyyy-MM-dd"); - String reformattedStr = buildVersionNumber; - try { - - reformattedStr = humanReadable.format(fromXml.parse(buildVersionNumber)); - } catch (java.text.ParseException e) { - logger.error("Error parsing the date from the XML updater" , e ); - } - - return reformattedStr; - } -} +/SaikuToolGenerationDlg.java From cacf6c39569168310e2def6a074727617553787f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:47 +0100 Subject: [PATCH 1121/1620] New translations .gitignore (English) --- .../earth/app/view/Messages_en.properties | 199 +----------------- 1 file changed, 1 insertion(+), 198 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 758b0b1b1a..8c63826403 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,198 +1 @@ -package org.openforis.collect.earth.app.service; - -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.net.URL; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Properties; -import java.util.concurrent.TimeUnit; - -import javax.xml.parsers.DocumentBuilderFactory; - -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.w3c.dom.Document; - -public class UpdateIniUtils { - - private static final String VERSION_ID = "version_id"; - private static final String VERSION_NAME = "version"; - private static final Logger logger = LoggerFactory.getLogger(UpdateIniUtils.class); - private final SimpleDateFormat fromXml = new SimpleDateFormat("yyyyMMddHHmm"); - public static final String UPDATE_INI = "update.ini"; - - /** - * Checks if there is a newer version of the Collect Earth updater available - * @return The new version build-number if there is a new version. Null if the version online is not newer than the one installed - */ - public String getVersionAvailableOnline(){ - - String installedVersionBuild = getVersionInstalled(); - String urlXmlUpdaterOnline = getValueFromUpdateIni("url", UPDATE_INI); //$NON-NLS-1$ - String onlineVersionBuild = getVersionBuild(urlXmlUpdaterOnline); - - - try { - long installedBuild = Long.parseLong(installedVersionBuild); - long onlineBuild = Long.parseLong(onlineVersionBuild); - - if( onlineBuild > installedBuild ){ - return onlineBuild+""; //$NON-NLS-1$ - } - - } catch (NumberFormatException e) { - logger.error("Error parsing the buildNumber ", e); //$NON-NLS-1$ - } - - return null; - } - - public static String getVersionInstalled() { - return getValueFromUpdateIni(VERSION_ID, UPDATE_INI); //$NON-NLS-1$ - } - - public static String getReleaseNameInstalled() { - return getValueFromUpdateIni(VERSION_NAME, UPDATE_INI); //$NON-NLS-1$ - } - - public boolean shouldWarnUser(LocalPropertiesService localPropertiesService){ - boolean warnUser = false; - - // newVersionAvailable will be null if the version installed is not older than the current version of the updater - String currentVersionOnline = getVersionAvailableOnline(); - - if( !StringUtils.isBlank( currentVersionOnline ) ){ - - // There is a new version. did the user chose "Not to be bother"with this update? - String lastIgnoredBuildNumber = localPropertiesService.getValue(EarthProperty.LAST_IGNORED_UPDATE); - - if( - ( isCurrentNewerThanIgnoredUpdate(lastIgnoredBuildNumber, currentVersionOnline) && isMajorUpdate()) - || - isInstalledOlderThanOneMonth(currentVersionOnline, getVersionInstalled() ) - ){ - warnUser = true; - } - - } - return warnUser; - } - - - /** - * Check if the current version of the updater is newer than the version of the updater that was last ignored - * @param lastIgnoredBuildNumber The version of the last ignored updater as a string with the format yyyyMMddHHmm - * @param buildNumberOnline The version of the current updater in the server in the format yyyyMMddHHmm - * @return True is the new version of the updater is newer than the one last ignored. False otherwise - */ - private boolean isCurrentNewerThanIgnoredUpdate(String lastIgnoredBuildNumber, String buildNumberOnline){ - - boolean isNewerThanIgnored = true; - - try { - if( !StringUtils.isEmpty(lastIgnoredBuildNumber) && !StringUtils.isEmpty(buildNumberOnline) ){ - Long ignoredBuildNumberUpdate =new Long(lastIgnoredBuildNumber); - Long buildOnline = new Long( buildNumberOnline ); - - isNewerThanIgnored = ignoredBuildNumberUpdate 30); - } catch (Exception e) { - logger.error( "Error calculating difference in dates bvetween installed and available versions", e ); - } - - return isOlderThanOneMonth; - } - - - /** - * Checks if the update in the server is a "Major"update, meaning that every user should update Collect Earth - * @return True if the version on the server should be installed by all users - */ - public boolean isMajorUpdate() { - String urlXmlUpdaterOnline = getValueFromUpdateIni("url", UPDATE_INI); //$NON-NLS-1$ - String majorUpdateString = getXmlValueFromTag(urlXmlUpdaterOnline, VERSION_NAME); - return majorUpdateString.toLowerCase().contains("major"); - } - - private String getVersionBuild(String urlXmlUpdate) { - String tagname = "versionId"; //$NON-NLS-1$ - return getXmlValueFromTag(urlXmlUpdate, tagname); - } - - public String getXmlValueFromTag(String urlXmlUpdate, String tagname) { - - String onlineVersion = "0"; //$NON-NLS-1$ - try { - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - //factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); // Compliant - //factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); // compliant - - factory.setNamespaceAware(true); - Document parse = factory.newDocumentBuilder().parse(new URL(urlXmlUpdate).openStream()); - - onlineVersion = parse.getElementsByTagName(tagname).item(0).getChildNodes().item(0).getNodeValue(); - - logger.info("CE Online Version available {}" , onlineVersion); - } catch (Exception e) { - logger.warn("Error while reading the remote XML where the updater version is defined", e); //$NON-NLS-1$ - } - - return onlineVersion; - } - - public static String getValueFromUpdateIni(String key, String pathToUpdateIni) { - Properties properties = new Properties(); - String value = "unknown"; //$NON-NLS-1$ - try (FileInputStream fis = new FileInputStream(pathToUpdateIni) ){ - properties.load( fis ); - value = properties.getProperty(key); - } catch (FileNotFoundException e) { - logger.error("The update.ini file could not be found", e); //$NON-NLS-1$ - } catch (IOException e) { - logger.error("Error opening the update.ini file", e); //$NON-NLS-1$ - } - return value; - } - - public String convertToDate(String buildVersionNumber) { - SimpleDateFormat humanReadable = new SimpleDateFormat("yyyy-MM-dd"); - String reformattedStr = buildVersionNumber; - try { - - reformattedStr = humanReadable.format(fromXml.parse(buildVersionNumber)); - } catch (java.text.ParseException e) { - logger.error("Error parsing the date from the XML updater" , e ); - } - - return reformattedStr; - } -} +/SaikuToolGenerationDlg.java From c5c1141f017baaf956e8cd516815a0219546a026 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:48 +0100 Subject: [PATCH 1122/1620] New translations AboutDialog.java (French) --- .../earth/app/view/Messages_fr.properties | 129 +++++++++++++++++- 1 file changed, 128 insertions(+), 1 deletion(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 8c63826403..1550d687ee 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1 +1,128 @@ -/SaikuToolGenerationDlg.java +package org.openforis.collect.earth.app.view; + +import java.awt.Desktop; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseListener; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.Properties; + +import javax.swing.Box; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; + +import org.openforis.collect.earth.app.service.UpdateIniUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class AboutDialog extends JDialog { + + private static final long serialVersionUID = 3108968706818898461L; + private transient Logger logger = LoggerFactory.getLogger( AboutDialog.class ); + + public AboutDialog(JFrame parent, String title) { + super(parent, title, true); + + UpdateIniUtils updateIniUtils = new UpdateIniUtils(); + String buildDate = updateIniUtils.convertToDate(getBuild()); + + Box b = Box.createVerticalBox(); + b.setAlignmentX(CENTER_ALIGNMENT); + b.add(Box.createGlue()); + b.add(new JLabel("Collect Earth v. " + getVersion() + " ( built " + buildDate + ") ")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + b.add(new JLabel("By Open Foris Initiative / Part of the Food and Agriculture Organization of the UN")); //$NON-NLS-1$ + JLabel comp = new JLabel("" + Messages.getString("AboutDialog.5") + ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + JLabel comp2 = new JLabel("CHECK THE CHANGE LOG"); + if (isBrowsingSupported()) { + makeLinkable(comp, new LinkMouseListener( "http://www.openforis.org" )); + makeLinkable(comp2, new LinkMouseListener( "https://github.com/openforis/collect-earth/blob/master/collect-earth/CHANGELOG.md" )); + } + b.add(comp); + b.add(comp2); + b.add(Box.createGlue()); + getContentPane().add(b, "Center"); //$NON-NLS-1$ + + JPanel p2 = new JPanel(); + JButton ok = new JButton(Messages.getString("AboutDialog.8")); //$NON-NLS-1$ + p2.add(ok); + getContentPane().add(p2, "South"); //$NON-NLS-1$ + + ok.addActionListener( e -> setVisible(false) ); + + setSize(380, 150); + } + + private String getBuild() { + String key = "version_id"; //$NON-NLS-1$ + return getValueFromUpdateIni(key); + } + + public String getValueFromUpdateIni(String key) { + Properties properties = new Properties(); + String value = "unknwown"; //$NON-NLS-1$ + try (FileInputStream fis = new FileInputStream("update.ini")) { //$NON-NLS-1$ + properties.load(fis); + value = properties.getProperty(key); + } catch (FileNotFoundException e) { + logger.error("The update.,ini file could not be found", e); //$NON-NLS-1$ + } catch (IOException e) { + logger.error("Error opening the update.ini file", e); //$NON-NLS-1$ + } + return value; + } + + private String getVersion() { + String key = "version"; //$NON-NLS-1$ + return getValueFromUpdateIni(key); + } + + private static void makeLinkable(JLabel c, MouseListener ml) { + assert ml != null; + + c.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); + c.addMouseListener(ml); + } + + private static boolean isBrowsingSupported() { + if (!Desktop.isDesktopSupported()) { + return false; + } + boolean result = false; + Desktop desktop = java.awt.Desktop.getDesktop(); + if (desktop.isSupported(Desktop.Action.BROWSE)) { + result = true; + } + return result; + + } + + private static class LinkMouseListener extends MouseAdapter { + String url; + + + public LinkMouseListener(String url) { + super(); + this.url = url; + } + + + @Override + public void mouseClicked(java.awt.event.MouseEvent evt) { + JLabel l = (JLabel) evt.getSource(); + try { + + URI uri = new java.net.URI(url); //$NON-NLS-1$ + (new LinkRunner(uri)).execute(); + } catch (URISyntaxException use) { + throw new AssertionError(use + ": " + l.getText()); //NOI18N //$NON-NLS-1$ + } + } + } + +} From aea4de7f2e7f7a7a99c3497165b5fc9274079047 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:49 +0100 Subject: [PATCH 1123/1620] New translations AboutDialog.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 129 +++++++++++++++++- 1 file changed, 128 insertions(+), 1 deletion(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 8c63826403..1550d687ee 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1 +1,128 @@ -/SaikuToolGenerationDlg.java +package org.openforis.collect.earth.app.view; + +import java.awt.Desktop; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseListener; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.Properties; + +import javax.swing.Box; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; + +import org.openforis.collect.earth.app.service.UpdateIniUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class AboutDialog extends JDialog { + + private static final long serialVersionUID = 3108968706818898461L; + private transient Logger logger = LoggerFactory.getLogger( AboutDialog.class ); + + public AboutDialog(JFrame parent, String title) { + super(parent, title, true); + + UpdateIniUtils updateIniUtils = new UpdateIniUtils(); + String buildDate = updateIniUtils.convertToDate(getBuild()); + + Box b = Box.createVerticalBox(); + b.setAlignmentX(CENTER_ALIGNMENT); + b.add(Box.createGlue()); + b.add(new JLabel("Collect Earth v. " + getVersion() + " ( built " + buildDate + ") ")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + b.add(new JLabel("By Open Foris Initiative / Part of the Food and Agriculture Organization of the UN")); //$NON-NLS-1$ + JLabel comp = new JLabel("" + Messages.getString("AboutDialog.5") + ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + JLabel comp2 = new JLabel("CHECK THE CHANGE LOG"); + if (isBrowsingSupported()) { + makeLinkable(comp, new LinkMouseListener( "http://www.openforis.org" )); + makeLinkable(comp2, new LinkMouseListener( "https://github.com/openforis/collect-earth/blob/master/collect-earth/CHANGELOG.md" )); + } + b.add(comp); + b.add(comp2); + b.add(Box.createGlue()); + getContentPane().add(b, "Center"); //$NON-NLS-1$ + + JPanel p2 = new JPanel(); + JButton ok = new JButton(Messages.getString("AboutDialog.8")); //$NON-NLS-1$ + p2.add(ok); + getContentPane().add(p2, "South"); //$NON-NLS-1$ + + ok.addActionListener( e -> setVisible(false) ); + + setSize(380, 150); + } + + private String getBuild() { + String key = "version_id"; //$NON-NLS-1$ + return getValueFromUpdateIni(key); + } + + public String getValueFromUpdateIni(String key) { + Properties properties = new Properties(); + String value = "unknwown"; //$NON-NLS-1$ + try (FileInputStream fis = new FileInputStream("update.ini")) { //$NON-NLS-1$ + properties.load(fis); + value = properties.getProperty(key); + } catch (FileNotFoundException e) { + logger.error("The update.,ini file could not be found", e); //$NON-NLS-1$ + } catch (IOException e) { + logger.error("Error opening the update.ini file", e); //$NON-NLS-1$ + } + return value; + } + + private String getVersion() { + String key = "version"; //$NON-NLS-1$ + return getValueFromUpdateIni(key); + } + + private static void makeLinkable(JLabel c, MouseListener ml) { + assert ml != null; + + c.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); + c.addMouseListener(ml); + } + + private static boolean isBrowsingSupported() { + if (!Desktop.isDesktopSupported()) { + return false; + } + boolean result = false; + Desktop desktop = java.awt.Desktop.getDesktop(); + if (desktop.isSupported(Desktop.Action.BROWSE)) { + result = true; + } + return result; + + } + + private static class LinkMouseListener extends MouseAdapter { + String url; + + + public LinkMouseListener(String url) { + super(); + this.url = url; + } + + + @Override + public void mouseClicked(java.awt.event.MouseEvent evt) { + JLabel l = (JLabel) evt.getSource(); + try { + + URI uri = new java.net.URI(url); //$NON-NLS-1$ + (new LinkRunner(uri)).execute(); + } catch (URISyntaxException use) { + throw new AssertionError(use + ": " + l.getText()); //NOI18N //$NON-NLS-1$ + } + } + } + +} From f1e5f9d76f788a0955bc7b26724829808afb207e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:51 +0100 Subject: [PATCH 1124/1620] New translations SchemaService.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 150 ++++-------------- 1 file changed, 28 insertions(+), 122 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 1550d687ee..ea8d41cfa0 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,128 +1,34 @@ -package org.openforis.collect.earth.app.view; - -import java.awt.Desktop; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseListener; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.Properties; - -import javax.swing.Box; -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JPanel; - -import org.openforis.collect.earth.app.service.UpdateIniUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class AboutDialog extends JDialog { - - private static final long serialVersionUID = 3108968706818898461L; - private transient Logger logger = LoggerFactory.getLogger( AboutDialog.class ); - - public AboutDialog(JFrame parent, String title) { - super(parent, title, true); - - UpdateIniUtils updateIniUtils = new UpdateIniUtils(); - String buildDate = updateIniUtils.convertToDate(getBuild()); - - Box b = Box.createVerticalBox(); - b.setAlignmentX(CENTER_ALIGNMENT); - b.add(Box.createGlue()); - b.add(new JLabel("Collect Earth v. " + getVersion() + " ( built " + buildDate + ") ")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - b.add(new JLabel("By Open Foris Initiative / Part of the Food and Agriculture Organization of the UN")); //$NON-NLS-1$ - JLabel comp = new JLabel("" + Messages.getString("AboutDialog.5") + ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - JLabel comp2 = new JLabel("CHECK THE CHANGE LOG"); - if (isBrowsingSupported()) { - makeLinkable(comp, new LinkMouseListener( "http://www.openforis.org" )); - makeLinkable(comp2, new LinkMouseListener( "https://github.com/openforis/collect-earth/blob/master/collect-earth/CHANGELOG.md" )); - } - b.add(comp); - b.add(comp2); - b.add(Box.createGlue()); - getContentPane().add(b, "Center"); //$NON-NLS-1$ - - JPanel p2 = new JPanel(); - JButton ok = new JButton(Messages.getString("AboutDialog.8")); //$NON-NLS-1$ - p2.add(ok); - getContentPane().add(p2, "South"); //$NON-NLS-1$ - - ok.addActionListener( e -> setVisible(false) ); - - setSize(380, 150); - } - - private String getBuild() { - String key = "version_id"; //$NON-NLS-1$ - return getValueFromUpdateIni(key); - } - - public String getValueFromUpdateIni(String key) { - Properties properties = new Properties(); - String value = "unknwown"; //$NON-NLS-1$ - try (FileInputStream fis = new FileInputStream("update.ini")) { //$NON-NLS-1$ - properties.load(fis); - value = properties.getProperty(key); - } catch (FileNotFoundException e) { - logger.error("The update.,ini file could not be found", e); //$NON-NLS-1$ - } catch (IOException e) { - logger.error("Error opening the update.ini file", e); //$NON-NLS-1$ +package org.openforis.collect.earth.app.service; + +import org.openforis.collect.earth.app.EarthConstants; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class SchemaService { + + @Autowired + LocalPropertiesService localPropertiesService; + + private String getSchemaName(ExportType exportType) { + String schemaName = null; + if (localPropertiesService.isUsingPostgreSqlDB()) { + if( exportType.equals( ExportType.SAIKU )) + schemaName = EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU; + else + schemaName = EarthConstants.POSTGRES_RDB_SCHEMA_IPCC; } - return value; + return schemaName; } - private String getVersion() { - String key = "version"; //$NON-NLS-1$ - return getValueFromUpdateIni(key); - } - - private static void makeLinkable(JLabel c, MouseListener ml) { - assert ml != null; - - c.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); - c.addMouseListener(ml); - } - - private static boolean isBrowsingSupported() { - if (!Desktop.isDesktopSupported()) { - return false; - } - boolean result = false; - Desktop desktop = java.awt.Desktop.getDesktop(); - if (desktop.isSupported(Desktop.Action.BROWSE)) { - result = true; - } - return result; - - } - - private static class LinkMouseListener extends MouseAdapter { - String url; - - - public LinkMouseListener(String url) { - super(); - this.url = url; + public String getSchemaPrefix(ExportType exportType) { + String schemaName = getSchemaName(exportType); + if (schemaName != null) { + schemaName += "."; //$NON-NLS-1$ + } else { + schemaName = ""; //$NON-NLS-1$ } - - - @Override - public void mouseClicked(java.awt.event.MouseEvent evt) { - JLabel l = (JLabel) evt.getSource(); - try { - - URI uri = new java.net.URI(url); //$NON-NLS-1$ - (new LinkRunner(uri)).execute(); - } catch (URISyntaxException use) { - throw new AssertionError(use + ": " + l.getText()); //NOI18N //$NON-NLS-1$ - } - } + return schemaName; } - + } From 8eb67e041545a03a2bd556b9e812b67477ec2689 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:52 +0100 Subject: [PATCH 1125/1620] New translations AboutDialog.java (English) --- .../earth/app/view/Messages_en.properties | 129 +++++++++++++++++- 1 file changed, 128 insertions(+), 1 deletion(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 8c63826403..1550d687ee 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1 +1,128 @@ -/SaikuToolGenerationDlg.java +package org.openforis.collect.earth.app.view; + +import java.awt.Desktop; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseListener; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.Properties; + +import javax.swing.Box; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; + +import org.openforis.collect.earth.app.service.UpdateIniUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class AboutDialog extends JDialog { + + private static final long serialVersionUID = 3108968706818898461L; + private transient Logger logger = LoggerFactory.getLogger( AboutDialog.class ); + + public AboutDialog(JFrame parent, String title) { + super(parent, title, true); + + UpdateIniUtils updateIniUtils = new UpdateIniUtils(); + String buildDate = updateIniUtils.convertToDate(getBuild()); + + Box b = Box.createVerticalBox(); + b.setAlignmentX(CENTER_ALIGNMENT); + b.add(Box.createGlue()); + b.add(new JLabel("Collect Earth v. " + getVersion() + " ( built " + buildDate + ") ")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + b.add(new JLabel("By Open Foris Initiative / Part of the Food and Agriculture Organization of the UN")); //$NON-NLS-1$ + JLabel comp = new JLabel("" + Messages.getString("AboutDialog.5") + ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + JLabel comp2 = new JLabel("CHECK THE CHANGE LOG"); + if (isBrowsingSupported()) { + makeLinkable(comp, new LinkMouseListener( "http://www.openforis.org" )); + makeLinkable(comp2, new LinkMouseListener( "https://github.com/openforis/collect-earth/blob/master/collect-earth/CHANGELOG.md" )); + } + b.add(comp); + b.add(comp2); + b.add(Box.createGlue()); + getContentPane().add(b, "Center"); //$NON-NLS-1$ + + JPanel p2 = new JPanel(); + JButton ok = new JButton(Messages.getString("AboutDialog.8")); //$NON-NLS-1$ + p2.add(ok); + getContentPane().add(p2, "South"); //$NON-NLS-1$ + + ok.addActionListener( e -> setVisible(false) ); + + setSize(380, 150); + } + + private String getBuild() { + String key = "version_id"; //$NON-NLS-1$ + return getValueFromUpdateIni(key); + } + + public String getValueFromUpdateIni(String key) { + Properties properties = new Properties(); + String value = "unknwown"; //$NON-NLS-1$ + try (FileInputStream fis = new FileInputStream("update.ini")) { //$NON-NLS-1$ + properties.load(fis); + value = properties.getProperty(key); + } catch (FileNotFoundException e) { + logger.error("The update.,ini file could not be found", e); //$NON-NLS-1$ + } catch (IOException e) { + logger.error("Error opening the update.ini file", e); //$NON-NLS-1$ + } + return value; + } + + private String getVersion() { + String key = "version"; //$NON-NLS-1$ + return getValueFromUpdateIni(key); + } + + private static void makeLinkable(JLabel c, MouseListener ml) { + assert ml != null; + + c.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); + c.addMouseListener(ml); + } + + private static boolean isBrowsingSupported() { + if (!Desktop.isDesktopSupported()) { + return false; + } + boolean result = false; + Desktop desktop = java.awt.Desktop.getDesktop(); + if (desktop.isSupported(Desktop.Action.BROWSE)) { + result = true; + } + return result; + + } + + private static class LinkMouseListener extends MouseAdapter { + String url; + + + public LinkMouseListener(String url) { + super(); + this.url = url; + } + + + @Override + public void mouseClicked(java.awt.event.MouseEvent evt) { + JLabel l = (JLabel) evt.getSource(); + try { + + URI uri = new java.net.URI(url); //$NON-NLS-1$ + (new LinkRunner(uri)).execute(); + } catch (URISyntaxException use) { + throw new AssertionError(use + ": " + l.getText()); //NOI18N //$NON-NLS-1$ + } + } + } + +} From b6a9aa7d917f809f439205902d049d58136296af Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:53 +0100 Subject: [PATCH 1126/1620] New translations ApplyOptionChangesListener.java (French) --- .../earth/app/view/Messages_fr.properties | 222 ++++++++++-------- 1 file changed, 118 insertions(+), 104 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 1550d687ee..a4628939fc 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,128 +1,142 @@ package org.openforis.collect.earth.app.view; -import java.awt.Desktop; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseListener; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.Properties; - -import javax.swing.Box; -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JPanel; - -import org.openforis.collect.earth.app.service.UpdateIniUtils; +import java.awt.Window; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.HashMap; +import java.util.Set; + +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JList; +import javax.swing.JOptionPane; +import javax.swing.JPasswordField; +import javax.swing.JRadioButton; +import javax.swing.SwingUtilities; +import javax.swing.text.JTextComponent; + +import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class AboutDialog extends JDialog { - - private static final long serialVersionUID = 3108968706818898461L; - private transient Logger logger = LoggerFactory.getLogger( AboutDialog.class ); - - public AboutDialog(JFrame parent, String title) { - super(parent, title, true); - - UpdateIniUtils updateIniUtils = new UpdateIniUtils(); - String buildDate = updateIniUtils.convertToDate(getBuild()); - - Box b = Box.createVerticalBox(); - b.setAlignmentX(CENTER_ALIGNMENT); - b.add(Box.createGlue()); - b.add(new JLabel("Collect Earth v. " + getVersion() + " ( built " + buildDate + ") ")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - b.add(new JLabel("By Open Foris Initiative / Part of the Food and Agriculture Organization of the UN")); //$NON-NLS-1$ - JLabel comp = new JLabel("" + Messages.getString("AboutDialog.5") + ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - JLabel comp2 = new JLabel("CHECK THE CHANGE LOG"); - if (isBrowsingSupported()) { - makeLinkable(comp, new LinkMouseListener( "http://www.openforis.org" )); - makeLinkable(comp2, new LinkMouseListener( "https://github.com/openforis/collect-earth/blob/master/collect-earth/CHANGELOG.md" )); - } - b.add(comp); - b.add(comp2); - b.add(Box.createGlue()); - getContentPane().add(b, "Center"); //$NON-NLS-1$ - - JPanel p2 = new JPanel(); - JButton ok = new JButton(Messages.getString("AboutDialog.8")); //$NON-NLS-1$ - p2.add(ok); - getContentPane().add(p2, "South"); //$NON-NLS-1$ - - ok.addActionListener( e -> setVisible(false) ); - - setSize(380, 150); +public abstract class ApplyOptionChangesListener implements ActionListener { + private LocalPropertiesService localPropertiesService; + private HashMap, JComponent[]> propertyToComponent; + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + protected Window callingDialog; + + + public ApplyOptionChangesListener(Window callingDialog, LocalPropertiesService localPropertiesService, HashMap, JComponent[]> propertyToComponent) { + this.callingDialog = callingDialog; + this.localPropertiesService = localPropertiesService; + this.propertyToComponent = propertyToComponent; + } - private String getBuild() { - String key = "version_id"; //$NON-NLS-1$ - return getValueFromUpdateIni(key); + public ApplyOptionChangesListener(Window callingDialog, LocalPropertiesService localPropertiesService) { + this.callingDialog = callingDialog; + this.localPropertiesService = localPropertiesService; } - public String getValueFromUpdateIni(String key) { - Properties properties = new Properties(); - String value = "unknwown"; //$NON-NLS-1$ - try (FileInputStream fis = new FileInputStream("update.ini")) { //$NON-NLS-1$ - properties.load(fis); - value = properties.getProperty(key); - } catch (FileNotFoundException e) { - logger.error("The update.,ini file could not be found", e); //$NON-NLS-1$ - } catch (IOException e) { - logger.error("Error opening the update.ini file", e); //$NON-NLS-1$ + @Override + public void actionPerformed(ActionEvent arg0) { + try { + startWaiting(); + applyProperties(); + } catch (final Exception e) { + logger.error("Error applying the new properties", e); //$NON-NLS-1$ + } finally { + endWaiting(); } - return value; } - private String getVersion() { - String key = "version"; //$NON-NLS-1$ - return getValueFromUpdateIni(key); - } + private void setPropertyValue( Enum enumKey, String value ){ - private static void makeLinkable(JLabel c, MouseListener ml) { - assert ml != null; + localPropertiesService.setValue((EarthProperty) enumKey, value); - c.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); - c.addMouseListener(ml); } - private static boolean isBrowsingSupported() { - if (!Desktop.isDesktopSupported()) { - return false; - } - boolean result = false; - Desktop desktop = java.awt.Desktop.getDesktop(); - if (desktop.isSupported(Desktop.Action.BROWSE)) { - result = true; - } - return result; - + protected abstract void applyProperties(); + + public void savePropertyValues() { + final Set> keySet = propertyToComponent.keySet(); + for (final Enum propertyKey : keySet) { + final JComponent component = propertyToComponent.get(propertyKey)[0]; + if( !component.isVisible() ) { + setPropertyValue(propertyKey, ""); + }else { + if (component instanceof JTextComponent) { + setPropertyValue(propertyKey, ((JTextComponent) component).getText()); + } else if (component instanceof JPasswordField) { + setPropertyValue(propertyKey, new String( ((JPasswordField) component).getPassword()) ); + }else if (component instanceof JCheckBox) { + setPropertyValue(propertyKey, ((JCheckBox) component).isSelected() + ""); //$NON-NLS-1$ + } else if (component instanceof JComboBox) { + if (((JComboBox) component).getItemAt(0) instanceof ComboBoxItem) { + setPropertyValue(propertyKey, + ((ComboBoxItem) ((JComboBox) component).getSelectedItem()).getNumberOfPoints() + ""); //$NON-NLS-1$ + } else if (((JComboBox) component).getItemAt(0) instanceof String) { + setPropertyValue(propertyKey, ((String) ((JComboBox) component).getSelectedItem() ) ); //$NON-NLS-1$ + } else if (((JComboBox) component).getItemAt(0) instanceof SAMPLE_SHAPE) { + setPropertyValue(propertyKey, ( (SAMPLE_SHAPE) ((JComboBox) component).getSelectedItem() ).name() ); + } + } else if (component instanceof JList) { + setPropertyValue(propertyKey, ((JList) component).getSelectedValue() + ""); //$NON-NLS-1$ + } else if (component instanceof JRadioButton) { + final JComponent[] jComponents = propertyToComponent.get(propertyKey); + for (final JComponent jComponent : jComponents) { + if (((JRadioButton) jComponent).isSelected()) { + setPropertyValue(propertyKey, ((JRadioButton) jComponent).getName()); + } + } + } else if (component instanceof JFilePicker) { + setPropertyValue(propertyKey, ((JFilePicker) component).getSelectedFilePath()); + } + } + } } - private static class LinkMouseListener extends MouseAdapter { - String url; - - - public LinkMouseListener(String url) { - super(); - this.url = url; + public void restartEarth() { + localPropertiesService.nullifyChecksumValues(); + + try { + // Re-generate KMZ + new Thread("Restarting Collect Earth after changing properties/loading project/loading KML points"){ + @Override + public void run() { + EarthApp.restart(); + } + }.start(); + + SwingUtilities.invokeLater( ()->{ + JOptionPane.showMessageDialog( callingDialog, Messages.getString("OptionWizard.20"), //$NON-NLS-1$ + Messages.getString("OptionWizard.21"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ + if( callingDialog!= null && callingDialog instanceof PropertiesDialog){ + callingDialog.dispose(); + } + }); + + } catch (final Exception e) { + logger.error("Error when re-generating the KML code to open in GE ", e); //$NON-NLS-1$ + JOptionPane.showMessageDialog(callingDialog, e.getMessage(), Messages.getString("OptionWizard.23"), //$NON-NLS-1$ + JOptionPane.WARNING_MESSAGE); } + } + private void startWaiting() { + if( callingDialog != null ){ + callingDialog.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); + } + } - @Override - public void mouseClicked(java.awt.event.MouseEvent evt) { - JLabel l = (JLabel) evt.getSource(); - try { - URI uri = new java.net.URI(url); //$NON-NLS-1$ - (new LinkRunner(uri)).execute(); - } catch (URISyntaxException use) { - throw new AssertionError(use + ": " + l.getText()); //NOI18N //$NON-NLS-1$ - } - } + private void endWaiting() { + if( callingDialog != null ){ + callingDialog.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); + } } - } From ab76e753adfe0deb8df4e3a27ff16a84f112c7bc Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:54 +0100 Subject: [PATCH 1127/1620] New translations ApplyOptionChangesListener.java (Spanish) --- .../earth/app/view/Messages_es.properties | 143 +++++++++++++++++- 1 file changed, 142 insertions(+), 1 deletion(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 8c63826403..a4628939fc 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1 +1,142 @@ -/SaikuToolGenerationDlg.java +package org.openforis.collect.earth.app.view; + +import java.awt.Window; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.HashMap; +import java.util.Set; + +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JList; +import javax.swing.JOptionPane; +import javax.swing.JPasswordField; +import javax.swing.JRadioButton; +import javax.swing.SwingUtilities; +import javax.swing.text.JTextComponent; + +import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public abstract class ApplyOptionChangesListener implements ActionListener { + private LocalPropertiesService localPropertiesService; + private HashMap, JComponent[]> propertyToComponent; + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + protected Window callingDialog; + + + public ApplyOptionChangesListener(Window callingDialog, LocalPropertiesService localPropertiesService, HashMap, JComponent[]> propertyToComponent) { + this.callingDialog = callingDialog; + this.localPropertiesService = localPropertiesService; + this.propertyToComponent = propertyToComponent; + + } + + public ApplyOptionChangesListener(Window callingDialog, LocalPropertiesService localPropertiesService) { + this.callingDialog = callingDialog; + this.localPropertiesService = localPropertiesService; + } + + @Override + public void actionPerformed(ActionEvent arg0) { + try { + startWaiting(); + applyProperties(); + } catch (final Exception e) { + logger.error("Error applying the new properties", e); //$NON-NLS-1$ + } finally { + endWaiting(); + } + } + + private void setPropertyValue( Enum enumKey, String value ){ + + localPropertiesService.setValue((EarthProperty) enumKey, value); + + } + + protected abstract void applyProperties(); + + public void savePropertyValues() { + final Set> keySet = propertyToComponent.keySet(); + for (final Enum propertyKey : keySet) { + final JComponent component = propertyToComponent.get(propertyKey)[0]; + if( !component.isVisible() ) { + setPropertyValue(propertyKey, ""); + }else { + if (component instanceof JTextComponent) { + setPropertyValue(propertyKey, ((JTextComponent) component).getText()); + } else if (component instanceof JPasswordField) { + setPropertyValue(propertyKey, new String( ((JPasswordField) component).getPassword()) ); + }else if (component instanceof JCheckBox) { + setPropertyValue(propertyKey, ((JCheckBox) component).isSelected() + ""); //$NON-NLS-1$ + } else if (component instanceof JComboBox) { + if (((JComboBox) component).getItemAt(0) instanceof ComboBoxItem) { + setPropertyValue(propertyKey, + ((ComboBoxItem) ((JComboBox) component).getSelectedItem()).getNumberOfPoints() + ""); //$NON-NLS-1$ + } else if (((JComboBox) component).getItemAt(0) instanceof String) { + setPropertyValue(propertyKey, ((String) ((JComboBox) component).getSelectedItem() ) ); //$NON-NLS-1$ + } else if (((JComboBox) component).getItemAt(0) instanceof SAMPLE_SHAPE) { + setPropertyValue(propertyKey, ( (SAMPLE_SHAPE) ((JComboBox) component).getSelectedItem() ).name() ); + } + } else if (component instanceof JList) { + setPropertyValue(propertyKey, ((JList) component).getSelectedValue() + ""); //$NON-NLS-1$ + } else if (component instanceof JRadioButton) { + final JComponent[] jComponents = propertyToComponent.get(propertyKey); + for (final JComponent jComponent : jComponents) { + if (((JRadioButton) jComponent).isSelected()) { + setPropertyValue(propertyKey, ((JRadioButton) jComponent).getName()); + } + } + } else if (component instanceof JFilePicker) { + setPropertyValue(propertyKey, ((JFilePicker) component).getSelectedFilePath()); + } + } + } + } + + public void restartEarth() { + localPropertiesService.nullifyChecksumValues(); + + try { + // Re-generate KMZ + new Thread("Restarting Collect Earth after changing properties/loading project/loading KML points"){ + @Override + public void run() { + EarthApp.restart(); + } + }.start(); + + SwingUtilities.invokeLater( ()->{ + JOptionPane.showMessageDialog( callingDialog, Messages.getString("OptionWizard.20"), //$NON-NLS-1$ + Messages.getString("OptionWizard.21"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ + if( callingDialog!= null && callingDialog instanceof PropertiesDialog){ + callingDialog.dispose(); + } + }); + + } catch (final Exception e) { + logger.error("Error when re-generating the KML code to open in GE ", e); //$NON-NLS-1$ + JOptionPane.showMessageDialog(callingDialog, e.getMessage(), Messages.getString("OptionWizard.23"), //$NON-NLS-1$ + JOptionPane.WARNING_MESSAGE); + } + } + + private void startWaiting() { + if( callingDialog != null ){ + callingDialog.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); + } + } + + + private void endWaiting() { + if( callingDialog != null ){ + callingDialog.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); + } + } +} From cc35675c2ca3e2c30d567b63fcda930b53f66f54 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:55 +0100 Subject: [PATCH 1128/1620] New translations ApplyOptionChangesListener.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 164 +++++++++++++++--- 1 file changed, 136 insertions(+), 28 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index ea8d41cfa0..a4628939fc 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,34 +1,142 @@ -package org.openforis.collect.earth.app.service; - -import org.openforis.collect.earth.app.EarthConstants; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public class SchemaService { - - @Autowired - LocalPropertiesService localPropertiesService; - - private String getSchemaName(ExportType exportType) { - String schemaName = null; - if (localPropertiesService.isUsingPostgreSqlDB()) { - if( exportType.equals( ExportType.SAIKU )) - schemaName = EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU; - else - schemaName = EarthConstants.POSTGRES_RDB_SCHEMA_IPCC; +package org.openforis.collect.earth.app.view; + +import java.awt.Window; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.HashMap; +import java.util.Set; + +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JList; +import javax.swing.JOptionPane; +import javax.swing.JPasswordField; +import javax.swing.JRadioButton; +import javax.swing.SwingUtilities; +import javax.swing.text.JTextComponent; + +import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public abstract class ApplyOptionChangesListener implements ActionListener { + private LocalPropertiesService localPropertiesService; + private HashMap, JComponent[]> propertyToComponent; + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + protected Window callingDialog; + + + public ApplyOptionChangesListener(Window callingDialog, LocalPropertiesService localPropertiesService, HashMap, JComponent[]> propertyToComponent) { + this.callingDialog = callingDialog; + this.localPropertiesService = localPropertiesService; + this.propertyToComponent = propertyToComponent; + + } + + public ApplyOptionChangesListener(Window callingDialog, LocalPropertiesService localPropertiesService) { + this.callingDialog = callingDialog; + this.localPropertiesService = localPropertiesService; + } + + @Override + public void actionPerformed(ActionEvent arg0) { + try { + startWaiting(); + applyProperties(); + } catch (final Exception e) { + logger.error("Error applying the new properties", e); //$NON-NLS-1$ + } finally { + endWaiting(); } - return schemaName; } - public String getSchemaPrefix(ExportType exportType) { - String schemaName = getSchemaName(exportType); - if (schemaName != null) { - schemaName += "."; //$NON-NLS-1$ - } else { - schemaName = ""; //$NON-NLS-1$ + private void setPropertyValue( Enum enumKey, String value ){ + + localPropertiesService.setValue((EarthProperty) enumKey, value); + + } + + protected abstract void applyProperties(); + + public void savePropertyValues() { + final Set> keySet = propertyToComponent.keySet(); + for (final Enum propertyKey : keySet) { + final JComponent component = propertyToComponent.get(propertyKey)[0]; + if( !component.isVisible() ) { + setPropertyValue(propertyKey, ""); + }else { + if (component instanceof JTextComponent) { + setPropertyValue(propertyKey, ((JTextComponent) component).getText()); + } else if (component instanceof JPasswordField) { + setPropertyValue(propertyKey, new String( ((JPasswordField) component).getPassword()) ); + }else if (component instanceof JCheckBox) { + setPropertyValue(propertyKey, ((JCheckBox) component).isSelected() + ""); //$NON-NLS-1$ + } else if (component instanceof JComboBox) { + if (((JComboBox) component).getItemAt(0) instanceof ComboBoxItem) { + setPropertyValue(propertyKey, + ((ComboBoxItem) ((JComboBox) component).getSelectedItem()).getNumberOfPoints() + ""); //$NON-NLS-1$ + } else if (((JComboBox) component).getItemAt(0) instanceof String) { + setPropertyValue(propertyKey, ((String) ((JComboBox) component).getSelectedItem() ) ); //$NON-NLS-1$ + } else if (((JComboBox) component).getItemAt(0) instanceof SAMPLE_SHAPE) { + setPropertyValue(propertyKey, ( (SAMPLE_SHAPE) ((JComboBox) component).getSelectedItem() ).name() ); + } + } else if (component instanceof JList) { + setPropertyValue(propertyKey, ((JList) component).getSelectedValue() + ""); //$NON-NLS-1$ + } else if (component instanceof JRadioButton) { + final JComponent[] jComponents = propertyToComponent.get(propertyKey); + for (final JComponent jComponent : jComponents) { + if (((JRadioButton) jComponent).isSelected()) { + setPropertyValue(propertyKey, ((JRadioButton) jComponent).getName()); + } + } + } else if (component instanceof JFilePicker) { + setPropertyValue(propertyKey, ((JFilePicker) component).getSelectedFilePath()); + } + } + } + } + + public void restartEarth() { + localPropertiesService.nullifyChecksumValues(); + + try { + // Re-generate KMZ + new Thread("Restarting Collect Earth after changing properties/loading project/loading KML points"){ + @Override + public void run() { + EarthApp.restart(); + } + }.start(); + + SwingUtilities.invokeLater( ()->{ + JOptionPane.showMessageDialog( callingDialog, Messages.getString("OptionWizard.20"), //$NON-NLS-1$ + Messages.getString("OptionWizard.21"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ + if( callingDialog!= null && callingDialog instanceof PropertiesDialog){ + callingDialog.dispose(); + } + }); + + } catch (final Exception e) { + logger.error("Error when re-generating the KML code to open in GE ", e); //$NON-NLS-1$ + JOptionPane.showMessageDialog(callingDialog, e.getMessage(), Messages.getString("OptionWizard.23"), //$NON-NLS-1$ + JOptionPane.WARNING_MESSAGE); + } + } + + private void startWaiting() { + if( callingDialog != null ){ + callingDialog.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); + } + } + + + private void endWaiting() { + if( callingDialog != null ){ + callingDialog.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); } - return schemaName; } - } From 242a4fbe2e5963ae151b4a0d62f94056f0c73d1a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:42:57 +0100 Subject: [PATCH 1129/1620] New translations ApplyOptionChangesListener.java (English) --- .../earth/app/view/Messages_en.properties | 222 ++++++++++-------- 1 file changed, 118 insertions(+), 104 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 1550d687ee..a4628939fc 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,128 +1,142 @@ package org.openforis.collect.earth.app.view; -import java.awt.Desktop; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseListener; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.Properties; - -import javax.swing.Box; -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JPanel; - -import org.openforis.collect.earth.app.service.UpdateIniUtils; +import java.awt.Window; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.HashMap; +import java.util.Set; + +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JList; +import javax.swing.JOptionPane; +import javax.swing.JPasswordField; +import javax.swing.JRadioButton; +import javax.swing.SwingUtilities; +import javax.swing.text.JTextComponent; + +import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class AboutDialog extends JDialog { - - private static final long serialVersionUID = 3108968706818898461L; - private transient Logger logger = LoggerFactory.getLogger( AboutDialog.class ); - - public AboutDialog(JFrame parent, String title) { - super(parent, title, true); - - UpdateIniUtils updateIniUtils = new UpdateIniUtils(); - String buildDate = updateIniUtils.convertToDate(getBuild()); - - Box b = Box.createVerticalBox(); - b.setAlignmentX(CENTER_ALIGNMENT); - b.add(Box.createGlue()); - b.add(new JLabel("Collect Earth v. " + getVersion() + " ( built " + buildDate + ") ")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - b.add(new JLabel("By Open Foris Initiative / Part of the Food and Agriculture Organization of the UN")); //$NON-NLS-1$ - JLabel comp = new JLabel("" + Messages.getString("AboutDialog.5") + ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - JLabel comp2 = new JLabel("CHECK THE CHANGE LOG"); - if (isBrowsingSupported()) { - makeLinkable(comp, new LinkMouseListener( "http://www.openforis.org" )); - makeLinkable(comp2, new LinkMouseListener( "https://github.com/openforis/collect-earth/blob/master/collect-earth/CHANGELOG.md" )); - } - b.add(comp); - b.add(comp2); - b.add(Box.createGlue()); - getContentPane().add(b, "Center"); //$NON-NLS-1$ - - JPanel p2 = new JPanel(); - JButton ok = new JButton(Messages.getString("AboutDialog.8")); //$NON-NLS-1$ - p2.add(ok); - getContentPane().add(p2, "South"); //$NON-NLS-1$ - - ok.addActionListener( e -> setVisible(false) ); - - setSize(380, 150); +public abstract class ApplyOptionChangesListener implements ActionListener { + private LocalPropertiesService localPropertiesService; + private HashMap, JComponent[]> propertyToComponent; + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + protected Window callingDialog; + + + public ApplyOptionChangesListener(Window callingDialog, LocalPropertiesService localPropertiesService, HashMap, JComponent[]> propertyToComponent) { + this.callingDialog = callingDialog; + this.localPropertiesService = localPropertiesService; + this.propertyToComponent = propertyToComponent; + } - private String getBuild() { - String key = "version_id"; //$NON-NLS-1$ - return getValueFromUpdateIni(key); + public ApplyOptionChangesListener(Window callingDialog, LocalPropertiesService localPropertiesService) { + this.callingDialog = callingDialog; + this.localPropertiesService = localPropertiesService; } - public String getValueFromUpdateIni(String key) { - Properties properties = new Properties(); - String value = "unknwown"; //$NON-NLS-1$ - try (FileInputStream fis = new FileInputStream("update.ini")) { //$NON-NLS-1$ - properties.load(fis); - value = properties.getProperty(key); - } catch (FileNotFoundException e) { - logger.error("The update.,ini file could not be found", e); //$NON-NLS-1$ - } catch (IOException e) { - logger.error("Error opening the update.ini file", e); //$NON-NLS-1$ + @Override + public void actionPerformed(ActionEvent arg0) { + try { + startWaiting(); + applyProperties(); + } catch (final Exception e) { + logger.error("Error applying the new properties", e); //$NON-NLS-1$ + } finally { + endWaiting(); } - return value; } - private String getVersion() { - String key = "version"; //$NON-NLS-1$ - return getValueFromUpdateIni(key); - } + private void setPropertyValue( Enum enumKey, String value ){ - private static void makeLinkable(JLabel c, MouseListener ml) { - assert ml != null; + localPropertiesService.setValue((EarthProperty) enumKey, value); - c.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); - c.addMouseListener(ml); } - private static boolean isBrowsingSupported() { - if (!Desktop.isDesktopSupported()) { - return false; - } - boolean result = false; - Desktop desktop = java.awt.Desktop.getDesktop(); - if (desktop.isSupported(Desktop.Action.BROWSE)) { - result = true; - } - return result; - + protected abstract void applyProperties(); + + public void savePropertyValues() { + final Set> keySet = propertyToComponent.keySet(); + for (final Enum propertyKey : keySet) { + final JComponent component = propertyToComponent.get(propertyKey)[0]; + if( !component.isVisible() ) { + setPropertyValue(propertyKey, ""); + }else { + if (component instanceof JTextComponent) { + setPropertyValue(propertyKey, ((JTextComponent) component).getText()); + } else if (component instanceof JPasswordField) { + setPropertyValue(propertyKey, new String( ((JPasswordField) component).getPassword()) ); + }else if (component instanceof JCheckBox) { + setPropertyValue(propertyKey, ((JCheckBox) component).isSelected() + ""); //$NON-NLS-1$ + } else if (component instanceof JComboBox) { + if (((JComboBox) component).getItemAt(0) instanceof ComboBoxItem) { + setPropertyValue(propertyKey, + ((ComboBoxItem) ((JComboBox) component).getSelectedItem()).getNumberOfPoints() + ""); //$NON-NLS-1$ + } else if (((JComboBox) component).getItemAt(0) instanceof String) { + setPropertyValue(propertyKey, ((String) ((JComboBox) component).getSelectedItem() ) ); //$NON-NLS-1$ + } else if (((JComboBox) component).getItemAt(0) instanceof SAMPLE_SHAPE) { + setPropertyValue(propertyKey, ( (SAMPLE_SHAPE) ((JComboBox) component).getSelectedItem() ).name() ); + } + } else if (component instanceof JList) { + setPropertyValue(propertyKey, ((JList) component).getSelectedValue() + ""); //$NON-NLS-1$ + } else if (component instanceof JRadioButton) { + final JComponent[] jComponents = propertyToComponent.get(propertyKey); + for (final JComponent jComponent : jComponents) { + if (((JRadioButton) jComponent).isSelected()) { + setPropertyValue(propertyKey, ((JRadioButton) jComponent).getName()); + } + } + } else if (component instanceof JFilePicker) { + setPropertyValue(propertyKey, ((JFilePicker) component).getSelectedFilePath()); + } + } + } } - private static class LinkMouseListener extends MouseAdapter { - String url; - - - public LinkMouseListener(String url) { - super(); - this.url = url; + public void restartEarth() { + localPropertiesService.nullifyChecksumValues(); + + try { + // Re-generate KMZ + new Thread("Restarting Collect Earth after changing properties/loading project/loading KML points"){ + @Override + public void run() { + EarthApp.restart(); + } + }.start(); + + SwingUtilities.invokeLater( ()->{ + JOptionPane.showMessageDialog( callingDialog, Messages.getString("OptionWizard.20"), //$NON-NLS-1$ + Messages.getString("OptionWizard.21"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ + if( callingDialog!= null && callingDialog instanceof PropertiesDialog){ + callingDialog.dispose(); + } + }); + + } catch (final Exception e) { + logger.error("Error when re-generating the KML code to open in GE ", e); //$NON-NLS-1$ + JOptionPane.showMessageDialog(callingDialog, e.getMessage(), Messages.getString("OptionWizard.23"), //$NON-NLS-1$ + JOptionPane.WARNING_MESSAGE); } + } + private void startWaiting() { + if( callingDialog != null ){ + callingDialog.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); + } + } - @Override - public void mouseClicked(java.awt.event.MouseEvent evt) { - JLabel l = (JLabel) evt.getSource(); - try { - URI uri = new java.net.URI(url); //$NON-NLS-1$ - (new LinkRunner(uri)).execute(); - } catch (URISyntaxException use) { - throw new AssertionError(use + ": " + l.getText()); //NOI18N //$NON-NLS-1$ - } - } + private void endWaiting() { + if( callingDialog != null ){ + callingDialog.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); + } } - } From 6c98e9d0ab32109db44d298c5f573ba1204b43cf Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:00 +0100 Subject: [PATCH 1130/1620] New translations CheckForUpdatesListener.java (French) --- .../earth/app/view/Messages_fr.properties | 164 ++++++------------ 1 file changed, 49 insertions(+), 115 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index a4628939fc..24b488682f 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,142 +1,76 @@ package org.openforis.collect.earth.app.view; -import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.util.HashMap; -import java.util.Set; - -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JComponent; -import javax.swing.JList; -import javax.swing.JOptionPane; -import javax.swing.JPasswordField; -import javax.swing.JRadioButton; -import javax.swing.SwingUtilities; -import javax.swing.text.JTextComponent; - -import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import java.io.File; +import java.io.IOException; + +import org.apache.commons.lang3.SystemUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.service.ProcessLoggerThread; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public abstract class ApplyOptionChangesListener implements ActionListener { - private LocalPropertiesService localPropertiesService; - private HashMap, JComponent[]> propertyToComponent; - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - protected Window callingDialog; - - - public ApplyOptionChangesListener(Window callingDialog, LocalPropertiesService localPropertiesService, HashMap, JComponent[]> propertyToComponent) { - this.callingDialog = callingDialog; - this.localPropertiesService = localPropertiesService; - this.propertyToComponent = propertyToComponent; - - } - - public ApplyOptionChangesListener(Window callingDialog, LocalPropertiesService localPropertiesService) { - this.callingDialog = callingDialog; - this.localPropertiesService = localPropertiesService; - } +public class CheckForUpdatesListener implements ActionListener { + Logger logger = LoggerFactory.getLogger( CheckForUpdatesListener.class ); @Override - public void actionPerformed(ActionEvent arg0) { + public void actionPerformed(ActionEvent e) { + // Start the auto_updater try { - startWaiting(); - applyProperties(); - } catch (final Exception e) { - logger.error("Error applying the new properties", e); //$NON-NLS-1$ - } finally { - endWaiting(); - } - } + String autoUpdateExecutable = getAutoUpdateExecutable(); - private void setPropertyValue( Enum enumKey, String value ){ + File autoupdateFile = new File( autoUpdateExecutable); - localPropertiesService.setValue((EarthProperty) enumKey, value); - - } + if( !autoupdateFile.exists() ){ + autoupdateFile = new File( "autoupdate/"+autoUpdateExecutable); //$NON-NLS-1$ + } - protected abstract void applyProperties(); - - public void savePropertyValues() { - final Set> keySet = propertyToComponent.keySet(); - for (final Enum propertyKey : keySet) { - final JComponent component = propertyToComponent.get(propertyKey)[0]; - if( !component.isVisible() ) { - setPropertyValue(propertyKey, ""); - }else { - if (component instanceof JTextComponent) { - setPropertyValue(propertyKey, ((JTextComponent) component).getText()); - } else if (component instanceof JPasswordField) { - setPropertyValue(propertyKey, new String( ((JPasswordField) component).getPassword()) ); - }else if (component instanceof JCheckBox) { - setPropertyValue(propertyKey, ((JCheckBox) component).isSelected() + ""); //$NON-NLS-1$ - } else if (component instanceof JComboBox) { - if (((JComboBox) component).getItemAt(0) instanceof ComboBoxItem) { - setPropertyValue(propertyKey, - ((ComboBoxItem) ((JComboBox) component).getSelectedItem()).getNumberOfPoints() + ""); //$NON-NLS-1$ - } else if (((JComboBox) component).getItemAt(0) instanceof String) { - setPropertyValue(propertyKey, ((String) ((JComboBox) component).getSelectedItem() ) ); //$NON-NLS-1$ - } else if (((JComboBox) component).getItemAt(0) instanceof SAMPLE_SHAPE) { - setPropertyValue(propertyKey, ( (SAMPLE_SHAPE) ((JComboBox) component).getSelectedItem() ).name() ); - } - } else if (component instanceof JList) { - setPropertyValue(propertyKey, ((JList) component).getSelectedValue() + ""); //$NON-NLS-1$ - } else if (component instanceof JRadioButton) { - final JComponent[] jComponents = propertyToComponent.get(propertyKey); - for (final JComponent jComponent : jComponents) { - if (((JRadioButton) jComponent).isSelected()) { - setPropertyValue(propertyKey, ((JRadioButton) jComponent).getName()); - } - } - } else if (component instanceof JFilePicker) { - setPropertyValue(propertyKey, ((JFilePicker) component).getSelectedFilePath()); - } + if( !autoupdateFile.exists() ){ + logger.error("No "+ autoUpdateExecutable + " found "); //$NON-NLS-1$ //$NON-NLS-2$ + return; } - } - } + if( SystemUtils.IS_OS_LINUX ){ + try { + final ProcessBuilder builder = new ProcessBuilder(new String[] { autoupdateFile.getAbsolutePath() }); - public void restartEarth() { - localPropertiesService.nullifyChecksumValues(); + builder.redirectErrorStream(true); + Process p = builder.start(); - try { - // Re-generate KMZ - new Thread("Restarting Collect Earth after changing properties/loading project/loading KML points"){ - @Override - public void run() { - EarthApp.restart(); - } - }.start(); + (new ProcessLoggerThread(p.getInputStream(), Boolean.FALSE)).start(); + (new ProcessLoggerThread(p.getErrorStream(), Boolean.TRUE)).start(); - SwingUtilities.invokeLater( ()->{ - JOptionPane.showMessageDialog( callingDialog, Messages.getString("OptionWizard.20"), //$NON-NLS-1$ - Messages.getString("OptionWizard.21"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ - if( callingDialog!= null && callingDialog instanceof PropertiesDialog){ - callingDialog.dispose(); + } catch (final IOException e2) { + logger.error("Error when starting the Autoupdate executable", e2); //$NON-NLS-1$ } - }); + }else{ - } catch (final Exception e) { - logger.error("Error when re-generating the KML code to open in GE ", e); //$NON-NLS-1$ - JOptionPane.showMessageDialog(callingDialog, e.getMessage(), Messages.getString("OptionWizard.23"), //$NON-NLS-1$ - JOptionPane.WARNING_MESSAGE); + CollectEarthUtils.openFile( autoupdateFile ); + } + } catch (Exception e1) { + logger.error("Error when opening the Autoupdate executable", e1); //$NON-NLS-1$ } } - private void startWaiting() { - if( callingDialog != null ){ - callingDialog.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); - } - } + private String getAutoUpdateExecutable() { + String autoUpdateExecutable = "autoupdate" ; //$NON-NLS-1$ + try { - private void endWaiting() { - if( callingDialog != null ){ - callingDialog.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); + if (SystemUtils.IS_OS_WINDOWS){ + autoUpdateExecutable += ".exe"; //$NON-NLS-1$ + }else if (SystemUtils.IS_OS_MAC){ + autoUpdateExecutable += ".app"; //$NON-NLS-1$ + }else if ( SystemUtils.IS_OS_UNIX && System.getProperty("sun.arch.data.model").equals("64")){ + autoUpdateExecutable += "-x64.run"; //$NON-NLS-1$ + }else if ( SystemUtils.IS_OS_UNIX ) { + autoUpdateExecutable += ".run"; //$NON-NLS-1$ + } + + } catch (Exception e) { + logger.error("Error in Autoupdate executable", e); //$NON-NLS-1$ } + return autoUpdateExecutable; } + } From 9509fde55ea5d4ee80c837d8a34540ef81b9598f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:01 +0100 Subject: [PATCH 1131/1620] New translations CheckForUpdatesListener.java (Spanish) --- .../earth/app/view/Messages_es.properties | 164 ++++++------------ 1 file changed, 49 insertions(+), 115 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index a4628939fc..24b488682f 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,142 +1,76 @@ package org.openforis.collect.earth.app.view; -import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.util.HashMap; -import java.util.Set; - -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JComponent; -import javax.swing.JList; -import javax.swing.JOptionPane; -import javax.swing.JPasswordField; -import javax.swing.JRadioButton; -import javax.swing.SwingUtilities; -import javax.swing.text.JTextComponent; - -import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import java.io.File; +import java.io.IOException; + +import org.apache.commons.lang3.SystemUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.service.ProcessLoggerThread; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public abstract class ApplyOptionChangesListener implements ActionListener { - private LocalPropertiesService localPropertiesService; - private HashMap, JComponent[]> propertyToComponent; - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - protected Window callingDialog; - - - public ApplyOptionChangesListener(Window callingDialog, LocalPropertiesService localPropertiesService, HashMap, JComponent[]> propertyToComponent) { - this.callingDialog = callingDialog; - this.localPropertiesService = localPropertiesService; - this.propertyToComponent = propertyToComponent; - - } - - public ApplyOptionChangesListener(Window callingDialog, LocalPropertiesService localPropertiesService) { - this.callingDialog = callingDialog; - this.localPropertiesService = localPropertiesService; - } +public class CheckForUpdatesListener implements ActionListener { + Logger logger = LoggerFactory.getLogger( CheckForUpdatesListener.class ); @Override - public void actionPerformed(ActionEvent arg0) { + public void actionPerformed(ActionEvent e) { + // Start the auto_updater try { - startWaiting(); - applyProperties(); - } catch (final Exception e) { - logger.error("Error applying the new properties", e); //$NON-NLS-1$ - } finally { - endWaiting(); - } - } + String autoUpdateExecutable = getAutoUpdateExecutable(); - private void setPropertyValue( Enum enumKey, String value ){ + File autoupdateFile = new File( autoUpdateExecutable); - localPropertiesService.setValue((EarthProperty) enumKey, value); - - } + if( !autoupdateFile.exists() ){ + autoupdateFile = new File( "autoupdate/"+autoUpdateExecutable); //$NON-NLS-1$ + } - protected abstract void applyProperties(); - - public void savePropertyValues() { - final Set> keySet = propertyToComponent.keySet(); - for (final Enum propertyKey : keySet) { - final JComponent component = propertyToComponent.get(propertyKey)[0]; - if( !component.isVisible() ) { - setPropertyValue(propertyKey, ""); - }else { - if (component instanceof JTextComponent) { - setPropertyValue(propertyKey, ((JTextComponent) component).getText()); - } else if (component instanceof JPasswordField) { - setPropertyValue(propertyKey, new String( ((JPasswordField) component).getPassword()) ); - }else if (component instanceof JCheckBox) { - setPropertyValue(propertyKey, ((JCheckBox) component).isSelected() + ""); //$NON-NLS-1$ - } else if (component instanceof JComboBox) { - if (((JComboBox) component).getItemAt(0) instanceof ComboBoxItem) { - setPropertyValue(propertyKey, - ((ComboBoxItem) ((JComboBox) component).getSelectedItem()).getNumberOfPoints() + ""); //$NON-NLS-1$ - } else if (((JComboBox) component).getItemAt(0) instanceof String) { - setPropertyValue(propertyKey, ((String) ((JComboBox) component).getSelectedItem() ) ); //$NON-NLS-1$ - } else if (((JComboBox) component).getItemAt(0) instanceof SAMPLE_SHAPE) { - setPropertyValue(propertyKey, ( (SAMPLE_SHAPE) ((JComboBox) component).getSelectedItem() ).name() ); - } - } else if (component instanceof JList) { - setPropertyValue(propertyKey, ((JList) component).getSelectedValue() + ""); //$NON-NLS-1$ - } else if (component instanceof JRadioButton) { - final JComponent[] jComponents = propertyToComponent.get(propertyKey); - for (final JComponent jComponent : jComponents) { - if (((JRadioButton) jComponent).isSelected()) { - setPropertyValue(propertyKey, ((JRadioButton) jComponent).getName()); - } - } - } else if (component instanceof JFilePicker) { - setPropertyValue(propertyKey, ((JFilePicker) component).getSelectedFilePath()); - } + if( !autoupdateFile.exists() ){ + logger.error("No "+ autoUpdateExecutable + " found "); //$NON-NLS-1$ //$NON-NLS-2$ + return; } - } - } + if( SystemUtils.IS_OS_LINUX ){ + try { + final ProcessBuilder builder = new ProcessBuilder(new String[] { autoupdateFile.getAbsolutePath() }); - public void restartEarth() { - localPropertiesService.nullifyChecksumValues(); + builder.redirectErrorStream(true); + Process p = builder.start(); - try { - // Re-generate KMZ - new Thread("Restarting Collect Earth after changing properties/loading project/loading KML points"){ - @Override - public void run() { - EarthApp.restart(); - } - }.start(); + (new ProcessLoggerThread(p.getInputStream(), Boolean.FALSE)).start(); + (new ProcessLoggerThread(p.getErrorStream(), Boolean.TRUE)).start(); - SwingUtilities.invokeLater( ()->{ - JOptionPane.showMessageDialog( callingDialog, Messages.getString("OptionWizard.20"), //$NON-NLS-1$ - Messages.getString("OptionWizard.21"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ - if( callingDialog!= null && callingDialog instanceof PropertiesDialog){ - callingDialog.dispose(); + } catch (final IOException e2) { + logger.error("Error when starting the Autoupdate executable", e2); //$NON-NLS-1$ } - }); + }else{ - } catch (final Exception e) { - logger.error("Error when re-generating the KML code to open in GE ", e); //$NON-NLS-1$ - JOptionPane.showMessageDialog(callingDialog, e.getMessage(), Messages.getString("OptionWizard.23"), //$NON-NLS-1$ - JOptionPane.WARNING_MESSAGE); + CollectEarthUtils.openFile( autoupdateFile ); + } + } catch (Exception e1) { + logger.error("Error when opening the Autoupdate executable", e1); //$NON-NLS-1$ } } - private void startWaiting() { - if( callingDialog != null ){ - callingDialog.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); - } - } + private String getAutoUpdateExecutable() { + String autoUpdateExecutable = "autoupdate" ; //$NON-NLS-1$ + try { - private void endWaiting() { - if( callingDialog != null ){ - callingDialog.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); + if (SystemUtils.IS_OS_WINDOWS){ + autoUpdateExecutable += ".exe"; //$NON-NLS-1$ + }else if (SystemUtils.IS_OS_MAC){ + autoUpdateExecutable += ".app"; //$NON-NLS-1$ + }else if ( SystemUtils.IS_OS_UNIX && System.getProperty("sun.arch.data.model").equals("64")){ + autoUpdateExecutable += "-x64.run"; //$NON-NLS-1$ + }else if ( SystemUtils.IS_OS_UNIX ) { + autoUpdateExecutable += ".run"; //$NON-NLS-1$ + } + + } catch (Exception e) { + logger.error("Error in Autoupdate executable", e); //$NON-NLS-1$ } + return autoUpdateExecutable; } + } From 6ed49bfcda859f0dade13d8f7d43ad77c5fd9a33 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:02 +0100 Subject: [PATCH 1132/1620] New translations CheckForUpdatesListener.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 164 ++++++------------ 1 file changed, 49 insertions(+), 115 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index a4628939fc..24b488682f 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,142 +1,76 @@ package org.openforis.collect.earth.app.view; -import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.util.HashMap; -import java.util.Set; - -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JComponent; -import javax.swing.JList; -import javax.swing.JOptionPane; -import javax.swing.JPasswordField; -import javax.swing.JRadioButton; -import javax.swing.SwingUtilities; -import javax.swing.text.JTextComponent; - -import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import java.io.File; +import java.io.IOException; + +import org.apache.commons.lang3.SystemUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.service.ProcessLoggerThread; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public abstract class ApplyOptionChangesListener implements ActionListener { - private LocalPropertiesService localPropertiesService; - private HashMap, JComponent[]> propertyToComponent; - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - protected Window callingDialog; - - - public ApplyOptionChangesListener(Window callingDialog, LocalPropertiesService localPropertiesService, HashMap, JComponent[]> propertyToComponent) { - this.callingDialog = callingDialog; - this.localPropertiesService = localPropertiesService; - this.propertyToComponent = propertyToComponent; - - } - - public ApplyOptionChangesListener(Window callingDialog, LocalPropertiesService localPropertiesService) { - this.callingDialog = callingDialog; - this.localPropertiesService = localPropertiesService; - } +public class CheckForUpdatesListener implements ActionListener { + Logger logger = LoggerFactory.getLogger( CheckForUpdatesListener.class ); @Override - public void actionPerformed(ActionEvent arg0) { + public void actionPerformed(ActionEvent e) { + // Start the auto_updater try { - startWaiting(); - applyProperties(); - } catch (final Exception e) { - logger.error("Error applying the new properties", e); //$NON-NLS-1$ - } finally { - endWaiting(); - } - } + String autoUpdateExecutable = getAutoUpdateExecutable(); - private void setPropertyValue( Enum enumKey, String value ){ + File autoupdateFile = new File( autoUpdateExecutable); - localPropertiesService.setValue((EarthProperty) enumKey, value); - - } + if( !autoupdateFile.exists() ){ + autoupdateFile = new File( "autoupdate/"+autoUpdateExecutable); //$NON-NLS-1$ + } - protected abstract void applyProperties(); - - public void savePropertyValues() { - final Set> keySet = propertyToComponent.keySet(); - for (final Enum propertyKey : keySet) { - final JComponent component = propertyToComponent.get(propertyKey)[0]; - if( !component.isVisible() ) { - setPropertyValue(propertyKey, ""); - }else { - if (component instanceof JTextComponent) { - setPropertyValue(propertyKey, ((JTextComponent) component).getText()); - } else if (component instanceof JPasswordField) { - setPropertyValue(propertyKey, new String( ((JPasswordField) component).getPassword()) ); - }else if (component instanceof JCheckBox) { - setPropertyValue(propertyKey, ((JCheckBox) component).isSelected() + ""); //$NON-NLS-1$ - } else if (component instanceof JComboBox) { - if (((JComboBox) component).getItemAt(0) instanceof ComboBoxItem) { - setPropertyValue(propertyKey, - ((ComboBoxItem) ((JComboBox) component).getSelectedItem()).getNumberOfPoints() + ""); //$NON-NLS-1$ - } else if (((JComboBox) component).getItemAt(0) instanceof String) { - setPropertyValue(propertyKey, ((String) ((JComboBox) component).getSelectedItem() ) ); //$NON-NLS-1$ - } else if (((JComboBox) component).getItemAt(0) instanceof SAMPLE_SHAPE) { - setPropertyValue(propertyKey, ( (SAMPLE_SHAPE) ((JComboBox) component).getSelectedItem() ).name() ); - } - } else if (component instanceof JList) { - setPropertyValue(propertyKey, ((JList) component).getSelectedValue() + ""); //$NON-NLS-1$ - } else if (component instanceof JRadioButton) { - final JComponent[] jComponents = propertyToComponent.get(propertyKey); - for (final JComponent jComponent : jComponents) { - if (((JRadioButton) jComponent).isSelected()) { - setPropertyValue(propertyKey, ((JRadioButton) jComponent).getName()); - } - } - } else if (component instanceof JFilePicker) { - setPropertyValue(propertyKey, ((JFilePicker) component).getSelectedFilePath()); - } + if( !autoupdateFile.exists() ){ + logger.error("No "+ autoUpdateExecutable + " found "); //$NON-NLS-1$ //$NON-NLS-2$ + return; } - } - } + if( SystemUtils.IS_OS_LINUX ){ + try { + final ProcessBuilder builder = new ProcessBuilder(new String[] { autoupdateFile.getAbsolutePath() }); - public void restartEarth() { - localPropertiesService.nullifyChecksumValues(); + builder.redirectErrorStream(true); + Process p = builder.start(); - try { - // Re-generate KMZ - new Thread("Restarting Collect Earth after changing properties/loading project/loading KML points"){ - @Override - public void run() { - EarthApp.restart(); - } - }.start(); + (new ProcessLoggerThread(p.getInputStream(), Boolean.FALSE)).start(); + (new ProcessLoggerThread(p.getErrorStream(), Boolean.TRUE)).start(); - SwingUtilities.invokeLater( ()->{ - JOptionPane.showMessageDialog( callingDialog, Messages.getString("OptionWizard.20"), //$NON-NLS-1$ - Messages.getString("OptionWizard.21"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ - if( callingDialog!= null && callingDialog instanceof PropertiesDialog){ - callingDialog.dispose(); + } catch (final IOException e2) { + logger.error("Error when starting the Autoupdate executable", e2); //$NON-NLS-1$ } - }); + }else{ - } catch (final Exception e) { - logger.error("Error when re-generating the KML code to open in GE ", e); //$NON-NLS-1$ - JOptionPane.showMessageDialog(callingDialog, e.getMessage(), Messages.getString("OptionWizard.23"), //$NON-NLS-1$ - JOptionPane.WARNING_MESSAGE); + CollectEarthUtils.openFile( autoupdateFile ); + } + } catch (Exception e1) { + logger.error("Error when opening the Autoupdate executable", e1); //$NON-NLS-1$ } } - private void startWaiting() { - if( callingDialog != null ){ - callingDialog.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); - } - } + private String getAutoUpdateExecutable() { + String autoUpdateExecutable = "autoupdate" ; //$NON-NLS-1$ + try { - private void endWaiting() { - if( callingDialog != null ){ - callingDialog.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); + if (SystemUtils.IS_OS_WINDOWS){ + autoUpdateExecutable += ".exe"; //$NON-NLS-1$ + }else if (SystemUtils.IS_OS_MAC){ + autoUpdateExecutable += ".app"; //$NON-NLS-1$ + }else if ( SystemUtils.IS_OS_UNIX && System.getProperty("sun.arch.data.model").equals("64")){ + autoUpdateExecutable += "-x64.run"; //$NON-NLS-1$ + }else if ( SystemUtils.IS_OS_UNIX ) { + autoUpdateExecutable += ".run"; //$NON-NLS-1$ + } + + } catch (Exception e) { + logger.error("Error in Autoupdate executable", e); //$NON-NLS-1$ } + return autoUpdateExecutable; } + } From d94908fe2ba8d1effee7c4c7febd8ac9909ce27a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:03 +0100 Subject: [PATCH 1133/1620] New translations CheckForUpdatesListener.java (English) --- .../earth/app/view/Messages_en.properties | 164 ++++++------------ 1 file changed, 49 insertions(+), 115 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index a4628939fc..24b488682f 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,142 +1,76 @@ package org.openforis.collect.earth.app.view; -import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.util.HashMap; -import java.util.Set; - -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JComponent; -import javax.swing.JList; -import javax.swing.JOptionPane; -import javax.swing.JPasswordField; -import javax.swing.JRadioButton; -import javax.swing.SwingUtilities; -import javax.swing.text.JTextComponent; - -import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import java.io.File; +import java.io.IOException; + +import org.apache.commons.lang3.SystemUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.service.ProcessLoggerThread; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public abstract class ApplyOptionChangesListener implements ActionListener { - private LocalPropertiesService localPropertiesService; - private HashMap, JComponent[]> propertyToComponent; - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - protected Window callingDialog; - - - public ApplyOptionChangesListener(Window callingDialog, LocalPropertiesService localPropertiesService, HashMap, JComponent[]> propertyToComponent) { - this.callingDialog = callingDialog; - this.localPropertiesService = localPropertiesService; - this.propertyToComponent = propertyToComponent; - - } - - public ApplyOptionChangesListener(Window callingDialog, LocalPropertiesService localPropertiesService) { - this.callingDialog = callingDialog; - this.localPropertiesService = localPropertiesService; - } +public class CheckForUpdatesListener implements ActionListener { + Logger logger = LoggerFactory.getLogger( CheckForUpdatesListener.class ); @Override - public void actionPerformed(ActionEvent arg0) { + public void actionPerformed(ActionEvent e) { + // Start the auto_updater try { - startWaiting(); - applyProperties(); - } catch (final Exception e) { - logger.error("Error applying the new properties", e); //$NON-NLS-1$ - } finally { - endWaiting(); - } - } + String autoUpdateExecutable = getAutoUpdateExecutable(); - private void setPropertyValue( Enum enumKey, String value ){ + File autoupdateFile = new File( autoUpdateExecutable); - localPropertiesService.setValue((EarthProperty) enumKey, value); - - } + if( !autoupdateFile.exists() ){ + autoupdateFile = new File( "autoupdate/"+autoUpdateExecutable); //$NON-NLS-1$ + } - protected abstract void applyProperties(); - - public void savePropertyValues() { - final Set> keySet = propertyToComponent.keySet(); - for (final Enum propertyKey : keySet) { - final JComponent component = propertyToComponent.get(propertyKey)[0]; - if( !component.isVisible() ) { - setPropertyValue(propertyKey, ""); - }else { - if (component instanceof JTextComponent) { - setPropertyValue(propertyKey, ((JTextComponent) component).getText()); - } else if (component instanceof JPasswordField) { - setPropertyValue(propertyKey, new String( ((JPasswordField) component).getPassword()) ); - }else if (component instanceof JCheckBox) { - setPropertyValue(propertyKey, ((JCheckBox) component).isSelected() + ""); //$NON-NLS-1$ - } else if (component instanceof JComboBox) { - if (((JComboBox) component).getItemAt(0) instanceof ComboBoxItem) { - setPropertyValue(propertyKey, - ((ComboBoxItem) ((JComboBox) component).getSelectedItem()).getNumberOfPoints() + ""); //$NON-NLS-1$ - } else if (((JComboBox) component).getItemAt(0) instanceof String) { - setPropertyValue(propertyKey, ((String) ((JComboBox) component).getSelectedItem() ) ); //$NON-NLS-1$ - } else if (((JComboBox) component).getItemAt(0) instanceof SAMPLE_SHAPE) { - setPropertyValue(propertyKey, ( (SAMPLE_SHAPE) ((JComboBox) component).getSelectedItem() ).name() ); - } - } else if (component instanceof JList) { - setPropertyValue(propertyKey, ((JList) component).getSelectedValue() + ""); //$NON-NLS-1$ - } else if (component instanceof JRadioButton) { - final JComponent[] jComponents = propertyToComponent.get(propertyKey); - for (final JComponent jComponent : jComponents) { - if (((JRadioButton) jComponent).isSelected()) { - setPropertyValue(propertyKey, ((JRadioButton) jComponent).getName()); - } - } - } else if (component instanceof JFilePicker) { - setPropertyValue(propertyKey, ((JFilePicker) component).getSelectedFilePath()); - } + if( !autoupdateFile.exists() ){ + logger.error("No "+ autoUpdateExecutable + " found "); //$NON-NLS-1$ //$NON-NLS-2$ + return; } - } - } + if( SystemUtils.IS_OS_LINUX ){ + try { + final ProcessBuilder builder = new ProcessBuilder(new String[] { autoupdateFile.getAbsolutePath() }); - public void restartEarth() { - localPropertiesService.nullifyChecksumValues(); + builder.redirectErrorStream(true); + Process p = builder.start(); - try { - // Re-generate KMZ - new Thread("Restarting Collect Earth after changing properties/loading project/loading KML points"){ - @Override - public void run() { - EarthApp.restart(); - } - }.start(); + (new ProcessLoggerThread(p.getInputStream(), Boolean.FALSE)).start(); + (new ProcessLoggerThread(p.getErrorStream(), Boolean.TRUE)).start(); - SwingUtilities.invokeLater( ()->{ - JOptionPane.showMessageDialog( callingDialog, Messages.getString("OptionWizard.20"), //$NON-NLS-1$ - Messages.getString("OptionWizard.21"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ - if( callingDialog!= null && callingDialog instanceof PropertiesDialog){ - callingDialog.dispose(); + } catch (final IOException e2) { + logger.error("Error when starting the Autoupdate executable", e2); //$NON-NLS-1$ } - }); + }else{ - } catch (final Exception e) { - logger.error("Error when re-generating the KML code to open in GE ", e); //$NON-NLS-1$ - JOptionPane.showMessageDialog(callingDialog, e.getMessage(), Messages.getString("OptionWizard.23"), //$NON-NLS-1$ - JOptionPane.WARNING_MESSAGE); + CollectEarthUtils.openFile( autoupdateFile ); + } + } catch (Exception e1) { + logger.error("Error when opening the Autoupdate executable", e1); //$NON-NLS-1$ } } - private void startWaiting() { - if( callingDialog != null ){ - callingDialog.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); - } - } + private String getAutoUpdateExecutable() { + String autoUpdateExecutable = "autoupdate" ; //$NON-NLS-1$ + try { - private void endWaiting() { - if( callingDialog != null ){ - callingDialog.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); + if (SystemUtils.IS_OS_WINDOWS){ + autoUpdateExecutable += ".exe"; //$NON-NLS-1$ + }else if (SystemUtils.IS_OS_MAC){ + autoUpdateExecutable += ".app"; //$NON-NLS-1$ + }else if ( SystemUtils.IS_OS_UNIX && System.getProperty("sun.arch.data.model").equals("64")){ + autoUpdateExecutable += "-x64.run"; //$NON-NLS-1$ + }else if ( SystemUtils.IS_OS_UNIX ) { + autoUpdateExecutable += ".run"; //$NON-NLS-1$ + } + + } catch (Exception e) { + logger.error("Error in Autoupdate executable", e); //$NON-NLS-1$ } + return autoUpdateExecutable; } + } From 0300cd7efdcd257791635b61f0fb177892f552dc Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:04 +0100 Subject: [PATCH 1134/1620] New translations CollectEarthMenu.java (French) --- .../earth/app/view/Messages_fr.properties | 470 ++++++++++++++++-- 1 file changed, 427 insertions(+), 43 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 24b488682f..4c34fd0a7f 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,76 +1,460 @@ package org.openforis.collect.earth.app.view; -import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.ButtonGroup; +import javax.swing.JCheckBoxMenuItem; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JRadioButtonMenuItem; +import javax.swing.SwingUtilities; import org.apache.commons.lang3.SystemUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.LoggerContext; +import org.apache.logging.log4j.core.config.Configuration; import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.service.ProcessLoggerThread; -import org.slf4j.Logger; +import org.openforis.collect.earth.app.EarthConstants.UI_LANGUAGE; +import org.openforis.collect.earth.app.logging.JSwingAppender; +import org.openforis.collect.earth.app.service.AnalysisSaikuService; +import org.openforis.collect.earth.app.service.BackupSqlLiteService; +import org.openforis.collect.earth.app.service.DataImportExportService; +import org.openforis.collect.earth.app.service.EarthProjectsService; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.FolderFinder; +import org.openforis.collect.earth.app.service.IPCCGeneratorService; +import org.openforis.collect.earth.app.service.KmlImportService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.MissingPlotService; +import org.openforis.collect.earth.app.view.ExportActionListener.RecordsToExport; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class CollectEarthMenu extends JMenuBar implements InitializingBean { + + @Autowired + private transient DataImportExportService dataImportExportService; + + @Autowired + private transient KmlImportService kmlImportService; + + @Autowired + private transient MissingPlotService missingPlotService; + + @Autowired + private transient AnalysisSaikuService analysisSaikuService; + + @Autowired + private transient IPCCGeneratorService ipccGeneratorService; + + @Autowired + private transient LocalPropertiesService localPropertiesService; + + @Autowired + private transient CollectEarthWindow collectEarthWindow; + + @Autowired + private transient EarthSurveyService earthSurveyService; + + @Autowired + private transient EarthProjectsService earthProjectsService; + + @Autowired + private transient BackupSqlLiteService backupSqlLiteService; + + @Autowired + private transient RemovePlotsFromDBDlg removePlotsFromDBDlg; + + @Autowired + private transient EarthProjectsService projectsService; + + private static final long serialVersionUID = -2457052260968029351L; + private final List serverMenuItems = new ArrayList<>(); + private JFrame frame; + private final transient org.slf4j.Logger logger = LoggerFactory.getLogger(CollectEarthMenu.class); -public class CheckForUpdatesListener implements ActionListener { + public CollectEarthMenu() { + // Where the GUI is created: + super(); + } + + protected void init() { + setFrame(collectEarthWindow.getFrame()); + + // Build file menu in the menu bar. + this.add( getFileMenu() ); + + // Build tools menu in the menu bar. + this.add(getToolsMenu()); + + // Build help menu in the menu bar. + this.add(getHelpMenu()); + } + + @Override + public void afterPropertiesSet() throws Exception { + init(); + } - Logger logger = LoggerFactory.getLogger( CheckForUpdatesListener.class ); @Override - public void actionPerformed(ActionEvent e) { - // Start the auto_updater - try { - String autoUpdateExecutable = getAutoUpdateExecutable(); + public JMenu getHelpMenu() { + JMenu menuHelp = new JMenu(Messages.getString("CollectEarthWindow.16")); //$NON-NLS-1$ + JMenuItem menuItem; + File surveyGuide = earthSurveyService.getSurveyGuide(); + if( surveyGuide != null ) { + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.70")); //$NON-NLS-1$ + menuItem.addActionListener( (e) -> CollectEarthUtils.openFile( surveyGuide) ); + menuHelp.add(menuItem); + menuHelp.addSeparator(); + } + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.56")); //$NON-NLS-1$ + menuItem.addActionListener(new OpenAboutDialogListener(frame, Messages.getString("CollectEarthWindow.62"))); //$NON-NLS-1$ + menuHelp.add(menuItem); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.17")); //$NON-NLS-1$ + menuItem.addActionListener( + new OpenTextFileListener(frame, getDisclaimerFilePath(), Messages.getString("CollectEarthWindow.4")));//$NON-NLS-1$ + menuHelp.add(menuItem); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.50")); //$NON-NLS-1$ + menuItem.addActionListener( (e) -> CollectEarthUtils.openFile( new File("UserManual.pdf"))); + menuHelp.add(menuItem); + - File autoupdateFile = new File( autoUpdateExecutable); + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.64")); //$NON-NLS-1$ + menuItem.addActionListener(new OpenSupportForum()); + menuHelp.add(menuItem); + + menuHelp.addSeparator(); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.52")); //$NON-NLS-1$ + menuItem.addActionListener( + new OpenTextFileListener(frame, getLogFilePath(), Messages.getString("CollectEarthWindow.53"))); //$NON-NLS-1$ + menuHelp.add(menuItem); + + JCheckBoxMenuItem checkboxErrors = new JCheckBoxMenuItem("Show exception errors", localPropertiesService.isExceptionShown() ); //$NON-NLS-1$ + checkboxErrors.addActionListener( e -> { + // This sets/unsets the property that is checked when an exception is catch by the JSwingAppender log4j2 appender + + Boolean showException = checkboxErrors.isSelected(); + localPropertiesService.setExceptionShown( showException ); + + final LoggerContext ctx = (LoggerContext) LogManager.getContext(false); + final Configuration config = ctx.getConfiguration(); + + JSwingAppender jSwingAppender = config.getAppender("jswing-log"); + + jSwingAppender.setExceptionShown( showException ); + } + + ); + menuHelp.add(checkboxErrors); + + + menuHelp.addSeparator(); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.51")); //$NON-NLS-1$ + menuItem.addActionListener(new CheckForUpdatesListener()); + menuHelp.add(menuItem); + return menuHelp; + } + + private JMenu getToolsMenu() { + JMenu toolsMenu = new JMenu(Messages.getString("CollectEarthWindow.12")); //$NON-NLS-1$ + + addImportExportMenu(toolsMenu); + + JMenuItem menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.14")); //$NON-NLS-1$ + menuItem.addActionListener(getSaikuAnalysisActionListener()); + toolsMenu.add(menuItem); + + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.71")); //$NON-NLS-1$ + menuItem.addActionListener(getSaikuToolExportActionListener()); + menuItem.setEnabled(SystemUtils.IS_OS_WINDOWS ); // This option is only available in Windows!! + toolsMenu.add(menuItem); + +/* + toolsMenu.addSeparator(); + menuItem = new JMenuItem("Generate IPCC GHGi software LULUCF package"); //$NON-NLS-1$ + menuItem.addActionListener(getIPCCExportActionListener()); + toolsMenu.add(menuItem); + + + toolsMenu.addSeparator(); +*/ + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.54")); //$NON-NLS-1$ + menuItem.addActionListener(new ApplyOptionChangesListener(this.getFrame(), localPropertiesService) { + + @Override + protected void applyProperties() { + + try { + if (kmlImportService.prompToOpenKml(getFrame())) { + restartEarth(); + } + } catch (Exception e1) { + JOptionPane.showMessageDialog(getFrame(), e1.getMessage(), + Messages.getString("CollectEarthWindow.63"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + logger.error("Error importing KML file", e1); //$NON-NLS-1$ + } - if( !autoupdateFile.exists() ){ - autoupdateFile = new File( "autoupdate/"+autoUpdateExecutable); //$NON-NLS-1$ } - if( !autoupdateFile.exists() ){ - logger.error("No "+ autoUpdateExecutable + " found "); //$NON-NLS-1$ //$NON-NLS-2$ - return; + }); + serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is + // acting as a client ) + toolsMenu.add(menuItem); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.67")); //$NON-NLS-1$ + menuItem.addActionListener( e-> { + try { + CollectEarthUtils.openFolderInExplorer(FolderFinder.getCollectEarthDataFolder()); + } catch (IOException e1) { + logger.error("Could not find the data folder", e1); } - if( SystemUtils.IS_OS_LINUX ){ - try { - final ProcessBuilder builder = new ProcessBuilder(new String[] { autoupdateFile.getAbsolutePath() }); + }); + serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is + // acting as a client ) + toolsMenu.add(menuItem); - builder.redirectErrorStream(true); - Process p = builder.start(); + toolsMenu.addSeparator(); - (new ProcessLoggerThread(p.getInputStream(), Boolean.FALSE)).start(); - (new ProcessLoggerThread(p.getErrorStream(), Boolean.TRUE)).start(); + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.15")); //$NON-NLS-1$ + menuItem.addActionListener(getPropertiesAction(frame)); + toolsMenu.add(menuItem); + toolsMenu.add(getUtilitiesMenu() ); - } catch (final IOException e2) { - logger.error("Error when starting the Autoupdate executable", e2); //$NON-NLS-1$ - } - }else{ + toolsMenu.addSeparator(); + toolsMenu.add(getLanguageMenu()); + return toolsMenu; + } - CollectEarthUtils.openFile( autoupdateFile ); + private JMenu getUtilitiesMenu() { + JMenuItem menuItem; + JMenu utilities = new JMenu(Messages.getString("CollectEarthMenu.2")); //$NON-NLS-1$ + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.18")); //$NON-NLS-1$ + menuItem.addActionListener(new MissingPlotsListener(frame, localPropertiesService, missingPlotService)); + serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is + // acting as a client ) + + utilities.add(menuItem); + + menuItem = new JMenuItem(Messages.getString("CollectEarthMenu.3")); //$NON-NLS-1$ + menuItem.addActionListener( e -> FileDividerToolDlg.open(frame, earthSurveyService.getCollectSurvey()) ); + serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is // acting as a client ) + utilities.add(menuItem); + + menuItem = new JMenuItem("Delete Plots from DB using CSV"); + menuItem.addActionListener( e -> removePlotsFromDBDlg.open(frame, earthSurveyService.getCollectSurvey()) ); + utilities.add(menuItem); + + + utilities.add(menuItem); + return utilities; + } + + private JMenu getFileMenu() { + JMenu fileMenu = new JMenu(Messages.getString("CollectEarthWindow.10")); //$NON-NLS-1$ + + JMenuItem menuItem = new JMenuItem(Messages.getString("CollectEarthMenu.0")); //$NON-NLS-1$ + menuItem.addActionListener(new ApplyOptionChangesListener(this.getFrame(), localPropertiesService) { + + @Override + protected void applyProperties() { + final File[] selectedProjectFile = JFileChooserExistsAware.getFileChooserResults( + DataFormat.PROJECT_DEFINITION_FILE, false, false, null, localPropertiesService, + getFrame() ); + + if (selectedProjectFile != null && selectedProjectFile.length == 1) { + try { + projectsService.loadCompressedProjectFile(selectedProjectFile[0]); + + restartEarth(); + } catch (Exception e1) { + JOptionPane.showMessageDialog( getFrame(), e1.getMessage(), + Messages.getString("OptionWizard.51"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + logger.error("Error importing project file " + selectedProjectFile[0].getAbsolutePath(), e1); //$NON-NLS-1$ + } + } } - } catch (Exception e1) { - logger.error("Error when opening the Autoupdate executable", e1); //$NON-NLS-1$ + }); + fileMenu.add(menuItem); + this.add(fileMenu); + fileMenu.addSeparator(); + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.11")); //$NON-NLS-1$ + menuItem.addActionListener(collectEarthWindow.getCloseActionListener()); + fileMenu.add(menuItem); + return fileMenu; + } + + private void addImportExportMenu(JMenu menu) { + + final JMenu ieSubmenu = new JMenu(Messages.getString("CollectEarthWindow.44")); //$NON-NLS-1$ + JMenuItem menuItem; + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.13")); //$NON-NLS-1$ + menuItem.addActionListener(getExportActionListener(DataFormat.CSV, RecordsToExport.ALL)); + ieSubmenu.add(menuItem); + + final JMenu xmlExportSubmenu = new JMenu(Messages.getString("CollectEarthWindow.24")); //$NON-NLS-1$ + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.45")); //$NON-NLS-1$ + menuItem.addActionListener(getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.ALL)); + xmlExportSubmenu.add(menuItem); + + final JMenuItem exportModifiedRecords = new JMenuItem(Messages.getString("CollectEarthWindow.61")); //$NON-NLS-1$ + exportModifiedRecords.addActionListener( + getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.MODIFIED_SINCE_LAST_EXPORT)); + xmlExportSubmenu.add(exportModifiedRecords); + + final JMenuItem exportDataRangeRecords = new JMenuItem(Messages.getString("CollectEarthMenu.4")); //$NON-NLS-1$ + exportDataRangeRecords + .addActionListener(getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.PICK_FROM_DATE)); + xmlExportSubmenu.add(exportDataRangeRecords); + + ieSubmenu.add(xmlExportSubmenu); + + final JMenu backupExportSubmenu = new JMenu(Messages.getString("CollectEarthMenu.5")); //$NON-NLS-1$ + + final JMenuItem exportDataBackup = new JMenuItem(Messages.getString("CollectEarthMenu.6")); //$NON-NLS-1$ + exportDataBackup.addActionListener(getExportActionListener(DataFormat.COLLECT_BACKUP, RecordsToExport.ALL)); + backupExportSubmenu.add(exportDataBackup); + + final JMenuItem exportDataRangeBackup = new JMenuItem(Messages.getString("CollectEarthMenu.7")); //$NON-NLS-1$ + exportDataRangeBackup + .addActionListener(getExportActionListener(DataFormat.COLLECT_BACKUP, RecordsToExport.PICK_FROM_DATE)); + backupExportSubmenu.add(exportDataRangeBackup); + + ieSubmenu.add(backupExportSubmenu); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.6")); //$NON-NLS-1$ + menuItem.addActionListener(getExportActionListener(DataFormat.FUSION, RecordsToExport.ALL)); + ieSubmenu.add(menuItem); + + ieSubmenu.addSeparator(); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.46")); //$NON-NLS-1$ + menuItem.addActionListener(getImportActionListener(DataFormat.ZIP_WITH_XML)); + ieSubmenu.add(menuItem); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.55")); //$NON-NLS-1$ + menuItem.addActionListener(getImportActionListener(DataFormat.CSV)); + ieSubmenu.add(menuItem); + + menu.add(ieSubmenu); + + serverMenuItems.add(ieSubmenu); // This menu should only be shown if the DB is local ( not if Collect Earth is + // acting as a client ) + } + + private String getDisclaimerFilePath() { + final String suffixLang = localPropertiesService.getUiLanguage().getLocale().getLanguage(); + if (new File("resources/disclaimer_" + suffixLang + ".txt").exists()) { //$NON-NLS-1$ //$NON-NLS-2$ + return "resources/disclaimer_" + suffixLang + ".txt"; + } else { + return "resources/disclaimer_en.txt"; } } - private String getAutoUpdateExecutable() { - String autoUpdateExecutable = "autoupdate" ; //$NON-NLS-1$ - try { + private ActionListener getExportActionListener(final DataFormat exportFormat, final RecordsToExport xmlExportType) { + return new ExportActionListener(exportFormat, xmlExportType, getFrame(), localPropertiesService, + dataImportExportService, earthSurveyService); + } + + private ActionListener getImportActionListener(final DataFormat importFormat) { + return new ImportActionListener(importFormat, getFrame(), localPropertiesService, dataImportExportService); + } + + private JMenu getLanguageMenu() { + + final ActionListener actionLanguage = e -> { + try { + final String langName = ((JRadioButtonMenuItem) e.getSource()).getName(); + final UI_LANGUAGE language = UI_LANGUAGE.valueOf(langName); + CollectEarthUtils.setFontDependingOnLanguaue(language); + localPropertiesService.setUiLanguage(language); + + SwingUtilities.invokeLater( () -> { + getFrame().getContentPane().removeAll(); + getFrame().dispose(); + collectEarthWindow.openWindow(); + }); + + } catch (final Exception ex) { + logger.error("Error while changing language", ex); //$NON-NLS-1$ + } + }; + + final JMenu menuLanguage = new JMenu(Messages.getString("CollectEarthWindow.2")); //$NON-NLS-1$ + final ButtonGroup group = new ButtonGroup(); + final UI_LANGUAGE[] languages = UI_LANGUAGE.values(); - if (SystemUtils.IS_OS_WINDOWS){ - autoUpdateExecutable += ".exe"; //$NON-NLS-1$ - }else if (SystemUtils.IS_OS_MAC){ - autoUpdateExecutable += ".app"; //$NON-NLS-1$ - }else if ( SystemUtils.IS_OS_UNIX && System.getProperty("sun.arch.data.model").equals("64")){ - autoUpdateExecutable += "-x64.run"; //$NON-NLS-1$ - }else if ( SystemUtils.IS_OS_UNIX ) { - autoUpdateExecutable += ".run"; //$NON-NLS-1$ + for (final UI_LANGUAGE language : languages) { + final JRadioButtonMenuItem langItem = new JRadioButtonMenuItem(language.getLabel()); + langItem.setName(language.name()); + langItem.addActionListener(actionLanguage); + menuLanguage.add(langItem); + group.add(menuLanguage); + if (localPropertiesService.getUiLanguage().equals(language)) { + langItem.setSelected(true); } - } catch (Exception e) { - logger.error("Error in Autoupdate executable", e); //$NON-NLS-1$ } - return autoUpdateExecutable; + + return menuLanguage; + } + + public ActionListener getPropertiesAction(final JFrame owner) { + return e -> { + final JDialog dialog = new PropertiesDialog(owner, localPropertiesService, earthProjectsService, + backupSqlLiteService.getAutomaticBackUpFolder().getPath(), analysisSaikuService, + earthSurveyService.getCollectSurvey()); + dialog.setVisible(true); + dialog.pack(); + }; + } + + private ActionListener getSaikuAnalysisActionListener() { + return new GenerateRDBAnalysisListener(getFrame(), new GenerateDatabaseStarter(analysisSaikuService, getFrame() ) ); + } + + private ActionListener getSaikuToolExportActionListener() { + return new SaikuToolExportListener(getFrame(), new GenerateDatabaseStarter(analysisSaikuService, getFrame() ), localPropertiesService); + } + + + private ActionListener getIPCCExportActionListener() { + return new IPCCGeneratorListener(getFrame(), new GenerateDatabaseStarter(ipccGeneratorService, getFrame() ) ); + } + + private String getLogFilePath() { + return FolderFinder.getCollectEarthDataFolder() + "/earth_error.log"; //$NON-NLS-1$ + } + + public JFrame getFrame() { + return frame; } + public void setFrame(JFrame frame) { + this.frame = frame; + } + + public List getServerMenuItems() { + return serverMenuItems; + } } From 11e0c776ed128d0e2577e96585b87d69c3f5ef15 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:06 +0100 Subject: [PATCH 1135/1620] New translations SchemaService.java (English) --- .../earth/app/view/Messages_en.properties | 98 ++++++------------- 1 file changed, 28 insertions(+), 70 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 24b488682f..ea8d41cfa0 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,76 +1,34 @@ -package org.openforis.collect.earth.app.view; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; -import java.io.IOException; - -import org.apache.commons.lang3.SystemUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.service.ProcessLoggerThread; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class CheckForUpdatesListener implements ActionListener { - - Logger logger = LoggerFactory.getLogger( CheckForUpdatesListener.class ); - @Override - public void actionPerformed(ActionEvent e) { - // Start the auto_updater - try { - String autoUpdateExecutable = getAutoUpdateExecutable(); - - File autoupdateFile = new File( autoUpdateExecutable); - - if( !autoupdateFile.exists() ){ - autoupdateFile = new File( "autoupdate/"+autoUpdateExecutable); //$NON-NLS-1$ - } - - if( !autoupdateFile.exists() ){ - logger.error("No "+ autoUpdateExecutable + " found "); //$NON-NLS-1$ //$NON-NLS-2$ - return; - } - if( SystemUtils.IS_OS_LINUX ){ - try { - final ProcessBuilder builder = new ProcessBuilder(new String[] { autoupdateFile.getAbsolutePath() }); - - builder.redirectErrorStream(true); - Process p = builder.start(); - - (new ProcessLoggerThread(p.getInputStream(), Boolean.FALSE)).start(); - (new ProcessLoggerThread(p.getErrorStream(), Boolean.TRUE)).start(); - - } catch (final IOException e2) { - logger.error("Error when starting the Autoupdate executable", e2); //$NON-NLS-1$ - } - }else{ - - CollectEarthUtils.openFile( autoupdateFile ); - } - } catch (Exception e1) { - logger.error("Error when opening the Autoupdate executable", e1); //$NON-NLS-1$ +package org.openforis.collect.earth.app.service; + +import org.openforis.collect.earth.app.EarthConstants; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class SchemaService { + + @Autowired + LocalPropertiesService localPropertiesService; + + private String getSchemaName(ExportType exportType) { + String schemaName = null; + if (localPropertiesService.isUsingPostgreSqlDB()) { + if( exportType.equals( ExportType.SAIKU )) + schemaName = EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU; + else + schemaName = EarthConstants.POSTGRES_RDB_SCHEMA_IPCC; } + return schemaName; } - private String getAutoUpdateExecutable() { - String autoUpdateExecutable = "autoupdate" ; //$NON-NLS-1$ - try { - - - if (SystemUtils.IS_OS_WINDOWS){ - autoUpdateExecutable += ".exe"; //$NON-NLS-1$ - }else if (SystemUtils.IS_OS_MAC){ - autoUpdateExecutable += ".app"; //$NON-NLS-1$ - }else if ( SystemUtils.IS_OS_UNIX && System.getProperty("sun.arch.data.model").equals("64")){ - autoUpdateExecutable += "-x64.run"; //$NON-NLS-1$ - }else if ( SystemUtils.IS_OS_UNIX ) { - autoUpdateExecutable += ".run"; //$NON-NLS-1$ - } - - } catch (Exception e) { - logger.error("Error in Autoupdate executable", e); //$NON-NLS-1$ + public String getSchemaPrefix(ExportType exportType) { + String schemaName = getSchemaName(exportType); + if (schemaName != null) { + schemaName += "."; //$NON-NLS-1$ + } else { + schemaName = ""; //$NON-NLS-1$ } - return autoUpdateExecutable; + return schemaName; } - + } From 338dd01feed17157f8b4fb635c5253b51f2d89e7 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:07 +0100 Subject: [PATCH 1136/1620] New translations SchemaService.java (Spanish) --- .../earth/app/view/Messages_es.properties | 98 ++++++------------- 1 file changed, 28 insertions(+), 70 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 24b488682f..ea8d41cfa0 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,76 +1,34 @@ -package org.openforis.collect.earth.app.view; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; -import java.io.IOException; - -import org.apache.commons.lang3.SystemUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.service.ProcessLoggerThread; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class CheckForUpdatesListener implements ActionListener { - - Logger logger = LoggerFactory.getLogger( CheckForUpdatesListener.class ); - @Override - public void actionPerformed(ActionEvent e) { - // Start the auto_updater - try { - String autoUpdateExecutable = getAutoUpdateExecutable(); - - File autoupdateFile = new File( autoUpdateExecutable); - - if( !autoupdateFile.exists() ){ - autoupdateFile = new File( "autoupdate/"+autoUpdateExecutable); //$NON-NLS-1$ - } - - if( !autoupdateFile.exists() ){ - logger.error("No "+ autoUpdateExecutable + " found "); //$NON-NLS-1$ //$NON-NLS-2$ - return; - } - if( SystemUtils.IS_OS_LINUX ){ - try { - final ProcessBuilder builder = new ProcessBuilder(new String[] { autoupdateFile.getAbsolutePath() }); - - builder.redirectErrorStream(true); - Process p = builder.start(); - - (new ProcessLoggerThread(p.getInputStream(), Boolean.FALSE)).start(); - (new ProcessLoggerThread(p.getErrorStream(), Boolean.TRUE)).start(); - - } catch (final IOException e2) { - logger.error("Error when starting the Autoupdate executable", e2); //$NON-NLS-1$ - } - }else{ - - CollectEarthUtils.openFile( autoupdateFile ); - } - } catch (Exception e1) { - logger.error("Error when opening the Autoupdate executable", e1); //$NON-NLS-1$ +package org.openforis.collect.earth.app.service; + +import org.openforis.collect.earth.app.EarthConstants; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class SchemaService { + + @Autowired + LocalPropertiesService localPropertiesService; + + private String getSchemaName(ExportType exportType) { + String schemaName = null; + if (localPropertiesService.isUsingPostgreSqlDB()) { + if( exportType.equals( ExportType.SAIKU )) + schemaName = EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU; + else + schemaName = EarthConstants.POSTGRES_RDB_SCHEMA_IPCC; } + return schemaName; } - private String getAutoUpdateExecutable() { - String autoUpdateExecutable = "autoupdate" ; //$NON-NLS-1$ - try { - - - if (SystemUtils.IS_OS_WINDOWS){ - autoUpdateExecutable += ".exe"; //$NON-NLS-1$ - }else if (SystemUtils.IS_OS_MAC){ - autoUpdateExecutable += ".app"; //$NON-NLS-1$ - }else if ( SystemUtils.IS_OS_UNIX && System.getProperty("sun.arch.data.model").equals("64")){ - autoUpdateExecutable += "-x64.run"; //$NON-NLS-1$ - }else if ( SystemUtils.IS_OS_UNIX ) { - autoUpdateExecutable += ".run"; //$NON-NLS-1$ - } - - } catch (Exception e) { - logger.error("Error in Autoupdate executable", e); //$NON-NLS-1$ + public String getSchemaPrefix(ExportType exportType) { + String schemaName = getSchemaName(exportType); + if (schemaName != null) { + schemaName += "."; //$NON-NLS-1$ + } else { + schemaName = ""; //$NON-NLS-1$ } - return autoUpdateExecutable; + return schemaName; } - + } From ce2bc8d607ac28af66e2478f637d35994ce96722 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:08 +0100 Subject: [PATCH 1137/1620] New translations ProcessLoggerThread.java (Spanish) --- .../earth/app/view/Messages_es.properties | 70 +++++++++++-------- 1 file changed, 42 insertions(+), 28 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index ea8d41cfa0..4b902b8805 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,34 +1,48 @@ package org.openforis.collect.earth.app.service; -import org.openforis.collect.earth.app.EarthConstants; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public class SchemaService { - - @Autowired - LocalPropertiesService localPropertiesService; - - private String getSchemaName(ExportType exportType) { - String schemaName = null; - if (localPropertiesService.isUsingPostgreSqlDB()) { - if( exportType.equals( ExportType.SAIKU )) - schemaName = EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU; - else - schemaName = EarthConstants.POSTGRES_RDB_SCHEMA_IPCC; - } - return schemaName; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class ProcessLoggerThread extends Thread { + + private static final Logger LOGGER = LoggerFactory.getLogger(ProcessLoggerThread.class); + + private InputStream inputStream; + + private Boolean logOutputAsError; + + + public ProcessLoggerThread(InputStream inputStream, Boolean logOutputAsError) { + super(); + + this.inputStream = inputStream; + this.logOutputAsError = logOutputAsError; } - public String getSchemaPrefix(ExportType exportType) { - String schemaName = getSchemaName(exportType); - if (schemaName != null) { - schemaName += "."; //$NON-NLS-1$ - } else { - schemaName = ""; //$NON-NLS-1$ + + @Override + public void run() { + try { + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); + String line = reader.readLine(); + while (line != null) { + if( Boolean.TRUE.equals( logOutputAsError ) ) + LOGGER.error(line); + else + LOGGER.warn(line); + + line = reader.readLine(); + } + reader.close(); + LOGGER.warn("End of logs"); + } catch (IOException e) { + LOGGER.error("The log reader died unexpectedly.", e); } - return schemaName; } - -} +} \ No newline at end of file From 227d023d4b7ed1e91f4c8fd3c5cff0e64b613f04 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:09 +0100 Subject: [PATCH 1138/1620] New translations RDBPostProcessor.java (French) --- .../earth/app/view/Messages_fr.properties | 469 +----------------- 1 file changed, 9 insertions(+), 460 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 4c34fd0a7f..7ea79d00ff 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,460 +1,9 @@ -package org.openforis.collect.earth.app.view; - -import java.awt.event.ActionListener; -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.ButtonGroup; -import javax.swing.JCheckBoxMenuItem; -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JMenu; -import javax.swing.JMenuBar; -import javax.swing.JMenuItem; -import javax.swing.JOptionPane; -import javax.swing.JRadioButtonMenuItem; -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.SystemUtils; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.core.LoggerContext; -import org.apache.logging.log4j.core.config.Configuration; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants.UI_LANGUAGE; -import org.openforis.collect.earth.app.logging.JSwingAppender; -import org.openforis.collect.earth.app.service.AnalysisSaikuService; -import org.openforis.collect.earth.app.service.BackupSqlLiteService; -import org.openforis.collect.earth.app.service.DataImportExportService; -import org.openforis.collect.earth.app.service.EarthProjectsService; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.FolderFinder; -import org.openforis.collect.earth.app.service.IPCCGeneratorService; -import org.openforis.collect.earth.app.service.KmlImportService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.MissingPlotService; -import org.openforis.collect.earth.app.view.ExportActionListener.RecordsToExport; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public class CollectEarthMenu extends JMenuBar implements InitializingBean { - - @Autowired - private transient DataImportExportService dataImportExportService; - - @Autowired - private transient KmlImportService kmlImportService; - - @Autowired - private transient MissingPlotService missingPlotService; - - @Autowired - private transient AnalysisSaikuService analysisSaikuService; - - @Autowired - private transient IPCCGeneratorService ipccGeneratorService; - - @Autowired - private transient LocalPropertiesService localPropertiesService; - - @Autowired - private transient CollectEarthWindow collectEarthWindow; - - @Autowired - private transient EarthSurveyService earthSurveyService; - - @Autowired - private transient EarthProjectsService earthProjectsService; - - @Autowired - private transient BackupSqlLiteService backupSqlLiteService; - - @Autowired - private transient RemovePlotsFromDBDlg removePlotsFromDBDlg; - - @Autowired - private transient EarthProjectsService projectsService; - - private static final long serialVersionUID = -2457052260968029351L; - private final List serverMenuItems = new ArrayList<>(); - private JFrame frame; - private final transient org.slf4j.Logger logger = LoggerFactory.getLogger(CollectEarthMenu.class); - - public CollectEarthMenu() { - // Where the GUI is created: - super(); - } - - protected void init() { - setFrame(collectEarthWindow.getFrame()); - - // Build file menu in the menu bar. - this.add( getFileMenu() ); - - // Build tools menu in the menu bar. - this.add(getToolsMenu()); - - // Build help menu in the menu bar. - this.add(getHelpMenu()); - } - - @Override - public void afterPropertiesSet() throws Exception { - init(); - } - - @Override - public JMenu getHelpMenu() { - JMenu menuHelp = new JMenu(Messages.getString("CollectEarthWindow.16")); //$NON-NLS-1$ - JMenuItem menuItem; - File surveyGuide = earthSurveyService.getSurveyGuide(); - if( surveyGuide != null ) { - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.70")); //$NON-NLS-1$ - menuItem.addActionListener( (e) -> CollectEarthUtils.openFile( surveyGuide) ); - menuHelp.add(menuItem); - menuHelp.addSeparator(); - } - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.56")); //$NON-NLS-1$ - menuItem.addActionListener(new OpenAboutDialogListener(frame, Messages.getString("CollectEarthWindow.62"))); //$NON-NLS-1$ - menuHelp.add(menuItem); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.17")); //$NON-NLS-1$ - menuItem.addActionListener( - new OpenTextFileListener(frame, getDisclaimerFilePath(), Messages.getString("CollectEarthWindow.4")));//$NON-NLS-1$ - menuHelp.add(menuItem); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.50")); //$NON-NLS-1$ - menuItem.addActionListener( (e) -> CollectEarthUtils.openFile( new File("UserManual.pdf"))); - menuHelp.add(menuItem); - - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.64")); //$NON-NLS-1$ - menuItem.addActionListener(new OpenSupportForum()); - menuHelp.add(menuItem); - - menuHelp.addSeparator(); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.52")); //$NON-NLS-1$ - menuItem.addActionListener( - new OpenTextFileListener(frame, getLogFilePath(), Messages.getString("CollectEarthWindow.53"))); //$NON-NLS-1$ - menuHelp.add(menuItem); - - JCheckBoxMenuItem checkboxErrors = new JCheckBoxMenuItem("Show exception errors", localPropertiesService.isExceptionShown() ); //$NON-NLS-1$ - checkboxErrors.addActionListener( e -> { - // This sets/unsets the property that is checked when an exception is catch by the JSwingAppender log4j2 appender - - Boolean showException = checkboxErrors.isSelected(); - localPropertiesService.setExceptionShown( showException ); - - final LoggerContext ctx = (LoggerContext) LogManager.getContext(false); - final Configuration config = ctx.getConfiguration(); - - JSwingAppender jSwingAppender = config.getAppender("jswing-log"); - - jSwingAppender.setExceptionShown( showException ); - } - - ); - menuHelp.add(checkboxErrors); - - - menuHelp.addSeparator(); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.51")); //$NON-NLS-1$ - menuItem.addActionListener(new CheckForUpdatesListener()); - menuHelp.add(menuItem); - return menuHelp; - } - - private JMenu getToolsMenu() { - JMenu toolsMenu = new JMenu(Messages.getString("CollectEarthWindow.12")); //$NON-NLS-1$ - - addImportExportMenu(toolsMenu); - - JMenuItem menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.14")); //$NON-NLS-1$ - menuItem.addActionListener(getSaikuAnalysisActionListener()); - toolsMenu.add(menuItem); - - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.71")); //$NON-NLS-1$ - menuItem.addActionListener(getSaikuToolExportActionListener()); - menuItem.setEnabled(SystemUtils.IS_OS_WINDOWS ); // This option is only available in Windows!! - toolsMenu.add(menuItem); - -/* - toolsMenu.addSeparator(); - menuItem = new JMenuItem("Generate IPCC GHGi software LULUCF package"); //$NON-NLS-1$ - menuItem.addActionListener(getIPCCExportActionListener()); - toolsMenu.add(menuItem); - - - toolsMenu.addSeparator(); -*/ - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.54")); //$NON-NLS-1$ - menuItem.addActionListener(new ApplyOptionChangesListener(this.getFrame(), localPropertiesService) { - - @Override - protected void applyProperties() { - - try { - if (kmlImportService.prompToOpenKml(getFrame())) { - restartEarth(); - } - } catch (Exception e1) { - JOptionPane.showMessageDialog(getFrame(), e1.getMessage(), - Messages.getString("CollectEarthWindow.63"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - logger.error("Error importing KML file", e1); //$NON-NLS-1$ - } - - } - - }); - serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is - // acting as a client ) - toolsMenu.add(menuItem); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.67")); //$NON-NLS-1$ - menuItem.addActionListener( e-> { - try { - CollectEarthUtils.openFolderInExplorer(FolderFinder.getCollectEarthDataFolder()); - } catch (IOException e1) { - logger.error("Could not find the data folder", e1); - } - }); - serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is - // acting as a client ) - toolsMenu.add(menuItem); - - toolsMenu.addSeparator(); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.15")); //$NON-NLS-1$ - menuItem.addActionListener(getPropertiesAction(frame)); - toolsMenu.add(menuItem); - toolsMenu.add(getUtilitiesMenu() ); - - toolsMenu.addSeparator(); - toolsMenu.add(getLanguageMenu()); - return toolsMenu; - } - - private JMenu getUtilitiesMenu() { - JMenuItem menuItem; - JMenu utilities = new JMenu(Messages.getString("CollectEarthMenu.2")); //$NON-NLS-1$ - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.18")); //$NON-NLS-1$ - menuItem.addActionListener(new MissingPlotsListener(frame, localPropertiesService, missingPlotService)); - serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is - // acting as a client ) - - utilities.add(menuItem); - - menuItem = new JMenuItem(Messages.getString("CollectEarthMenu.3")); //$NON-NLS-1$ - menuItem.addActionListener( e -> FileDividerToolDlg.open(frame, earthSurveyService.getCollectSurvey()) ); - serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is // acting as a client ) - utilities.add(menuItem); - - menuItem = new JMenuItem("Delete Plots from DB using CSV"); - menuItem.addActionListener( e -> removePlotsFromDBDlg.open(frame, earthSurveyService.getCollectSurvey()) ); - utilities.add(menuItem); - - - utilities.add(menuItem); - return utilities; - } - - private JMenu getFileMenu() { - JMenu fileMenu = new JMenu(Messages.getString("CollectEarthWindow.10")); //$NON-NLS-1$ - - JMenuItem menuItem = new JMenuItem(Messages.getString("CollectEarthMenu.0")); //$NON-NLS-1$ - menuItem.addActionListener(new ApplyOptionChangesListener(this.getFrame(), localPropertiesService) { - - @Override - protected void applyProperties() { - final File[] selectedProjectFile = JFileChooserExistsAware.getFileChooserResults( - DataFormat.PROJECT_DEFINITION_FILE, false, false, null, localPropertiesService, - getFrame() ); - - if (selectedProjectFile != null && selectedProjectFile.length == 1) { - try { - projectsService.loadCompressedProjectFile(selectedProjectFile[0]); - - restartEarth(); - } catch (Exception e1) { - JOptionPane.showMessageDialog( getFrame(), e1.getMessage(), - Messages.getString("OptionWizard.51"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - logger.error("Error importing project file " + selectedProjectFile[0].getAbsolutePath(), e1); //$NON-NLS-1$ - } - } - } - }); - fileMenu.add(menuItem); - this.add(fileMenu); - fileMenu.addSeparator(); - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.11")); //$NON-NLS-1$ - menuItem.addActionListener(collectEarthWindow.getCloseActionListener()); - fileMenu.add(menuItem); - return fileMenu; - } - - private void addImportExportMenu(JMenu menu) { - - final JMenu ieSubmenu = new JMenu(Messages.getString("CollectEarthWindow.44")); //$NON-NLS-1$ - JMenuItem menuItem; - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.13")); //$NON-NLS-1$ - menuItem.addActionListener(getExportActionListener(DataFormat.CSV, RecordsToExport.ALL)); - ieSubmenu.add(menuItem); - - final JMenu xmlExportSubmenu = new JMenu(Messages.getString("CollectEarthWindow.24")); //$NON-NLS-1$ - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.45")); //$NON-NLS-1$ - menuItem.addActionListener(getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.ALL)); - xmlExportSubmenu.add(menuItem); - - final JMenuItem exportModifiedRecords = new JMenuItem(Messages.getString("CollectEarthWindow.61")); //$NON-NLS-1$ - exportModifiedRecords.addActionListener( - getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.MODIFIED_SINCE_LAST_EXPORT)); - xmlExportSubmenu.add(exportModifiedRecords); - - final JMenuItem exportDataRangeRecords = new JMenuItem(Messages.getString("CollectEarthMenu.4")); //$NON-NLS-1$ - exportDataRangeRecords - .addActionListener(getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.PICK_FROM_DATE)); - xmlExportSubmenu.add(exportDataRangeRecords); - - ieSubmenu.add(xmlExportSubmenu); - - final JMenu backupExportSubmenu = new JMenu(Messages.getString("CollectEarthMenu.5")); //$NON-NLS-1$ - - final JMenuItem exportDataBackup = new JMenuItem(Messages.getString("CollectEarthMenu.6")); //$NON-NLS-1$ - exportDataBackup.addActionListener(getExportActionListener(DataFormat.COLLECT_BACKUP, RecordsToExport.ALL)); - backupExportSubmenu.add(exportDataBackup); - - final JMenuItem exportDataRangeBackup = new JMenuItem(Messages.getString("CollectEarthMenu.7")); //$NON-NLS-1$ - exportDataRangeBackup - .addActionListener(getExportActionListener(DataFormat.COLLECT_BACKUP, RecordsToExport.PICK_FROM_DATE)); - backupExportSubmenu.add(exportDataRangeBackup); - - ieSubmenu.add(backupExportSubmenu); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.6")); //$NON-NLS-1$ - menuItem.addActionListener(getExportActionListener(DataFormat.FUSION, RecordsToExport.ALL)); - ieSubmenu.add(menuItem); - - ieSubmenu.addSeparator(); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.46")); //$NON-NLS-1$ - menuItem.addActionListener(getImportActionListener(DataFormat.ZIP_WITH_XML)); - ieSubmenu.add(menuItem); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.55")); //$NON-NLS-1$ - menuItem.addActionListener(getImportActionListener(DataFormat.CSV)); - ieSubmenu.add(menuItem); - - menu.add(ieSubmenu); - - serverMenuItems.add(ieSubmenu); // This menu should only be shown if the DB is local ( not if Collect Earth is - // acting as a client ) - } - - private String getDisclaimerFilePath() { - final String suffixLang = localPropertiesService.getUiLanguage().getLocale().getLanguage(); - if (new File("resources/disclaimer_" + suffixLang + ".txt").exists()) { //$NON-NLS-1$ //$NON-NLS-2$ - return "resources/disclaimer_" + suffixLang + ".txt"; - } else { - return "resources/disclaimer_en.txt"; - } - } - - private ActionListener getExportActionListener(final DataFormat exportFormat, final RecordsToExport xmlExportType) { - return new ExportActionListener(exportFormat, xmlExportType, getFrame(), localPropertiesService, - dataImportExportService, earthSurveyService); - } - - private ActionListener getImportActionListener(final DataFormat importFormat) { - return new ImportActionListener(importFormat, getFrame(), localPropertiesService, dataImportExportService); - } - - private JMenu getLanguageMenu() { - - final ActionListener actionLanguage = e -> { - try { - final String langName = ((JRadioButtonMenuItem) e.getSource()).getName(); - final UI_LANGUAGE language = UI_LANGUAGE.valueOf(langName); - CollectEarthUtils.setFontDependingOnLanguaue(language); - localPropertiesService.setUiLanguage(language); - - SwingUtilities.invokeLater( () -> { - getFrame().getContentPane().removeAll(); - getFrame().dispose(); - collectEarthWindow.openWindow(); - }); - - } catch (final Exception ex) { - logger.error("Error while changing language", ex); //$NON-NLS-1$ - } - }; - - final JMenu menuLanguage = new JMenu(Messages.getString("CollectEarthWindow.2")); //$NON-NLS-1$ - - final ButtonGroup group = new ButtonGroup(); - final UI_LANGUAGE[] languages = UI_LANGUAGE.values(); - - for (final UI_LANGUAGE language : languages) { - final JRadioButtonMenuItem langItem = new JRadioButtonMenuItem(language.getLabel()); - langItem.setName(language.name()); - langItem.addActionListener(actionLanguage); - menuLanguage.add(langItem); - group.add(menuLanguage); - if (localPropertiesService.getUiLanguage().equals(language)) { - langItem.setSelected(true); - } - - } - - return menuLanguage; - } - - public ActionListener getPropertiesAction(final JFrame owner) { - return e -> { - final JDialog dialog = new PropertiesDialog(owner, localPropertiesService, earthProjectsService, - backupSqlLiteService.getAutomaticBackUpFolder().getPath(), analysisSaikuService, - earthSurveyService.getCollectSurvey()); - dialog.setVisible(true); - dialog.pack(); - }; - } - - private ActionListener getSaikuAnalysisActionListener() { - return new GenerateRDBAnalysisListener(getFrame(), new GenerateDatabaseStarter(analysisSaikuService, getFrame() ) ); - } - - private ActionListener getSaikuToolExportActionListener() { - return new SaikuToolExportListener(getFrame(), new GenerateDatabaseStarter(analysisSaikuService, getFrame() ), localPropertiesService); - } - - - private ActionListener getIPCCExportActionListener() { - return new IPCCGeneratorListener(getFrame(), new GenerateDatabaseStarter(ipccGeneratorService, getFrame() ) ); - } - - private String getLogFilePath() { - return FolderFinder.getCollectEarthDataFolder() + "/earth_error.log"; //$NON-NLS-1$ - } - - public JFrame getFrame() { - return frame; - } - - public void setFrame(JFrame frame) { - this.frame = frame; - } - - public List getServerMenuItems() { - return serverMenuItems; - } -} +package org.openforis.collect.earth.app.service; + +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; + +public interface RDBPostProcessor { + + void processRDBData(InfiniteProgressMonitor progressListener); + +} From 948a6d5786e4cc166792f2433df7a5fcc0b9d232 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:10 +0100 Subject: [PATCH 1139/1620] New translations ProcessLoggerThread.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 86 +++++++------------ 1 file changed, 29 insertions(+), 57 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 24b488682f..4b902b8805 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,76 +1,48 @@ -package org.openforis.collect.earth.app.view; +package org.openforis.collect.earth.app.service; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; +import java.io.BufferedReader; import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; -import org.apache.commons.lang3.SystemUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.service.ProcessLoggerThread; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class CheckForUpdatesListener implements ActionListener { - Logger logger = LoggerFactory.getLogger( CheckForUpdatesListener.class ); - @Override - public void actionPerformed(ActionEvent e) { - // Start the auto_updater - try { - String autoUpdateExecutable = getAutoUpdateExecutable(); +public class ProcessLoggerThread extends Thread { - File autoupdateFile = new File( autoUpdateExecutable); + private static final Logger LOGGER = LoggerFactory.getLogger(ProcessLoggerThread.class); - if( !autoupdateFile.exists() ){ - autoupdateFile = new File( "autoupdate/"+autoUpdateExecutable); //$NON-NLS-1$ - } + private InputStream inputStream; - if( !autoupdateFile.exists() ){ - logger.error("No "+ autoUpdateExecutable + " found "); //$NON-NLS-1$ //$NON-NLS-2$ - return; - } - if( SystemUtils.IS_OS_LINUX ){ - try { - final ProcessBuilder builder = new ProcessBuilder(new String[] { autoupdateFile.getAbsolutePath() }); + private Boolean logOutputAsError; - builder.redirectErrorStream(true); - Process p = builder.start(); - (new ProcessLoggerThread(p.getInputStream(), Boolean.FALSE)).start(); - (new ProcessLoggerThread(p.getErrorStream(), Boolean.TRUE)).start(); + public ProcessLoggerThread(InputStream inputStream, Boolean logOutputAsError) { + super(); - } catch (final IOException e2) { - logger.error("Error when starting the Autoupdate executable", e2); //$NON-NLS-1$ - } - }else{ - - CollectEarthUtils.openFile( autoupdateFile ); - } - } catch (Exception e1) { - logger.error("Error when opening the Autoupdate executable", e1); //$NON-NLS-1$ - } + this.inputStream = inputStream; + this.logOutputAsError = logOutputAsError; } - private String getAutoUpdateExecutable() { - String autoUpdateExecutable = "autoupdate" ; //$NON-NLS-1$ - try { - - if (SystemUtils.IS_OS_WINDOWS){ - autoUpdateExecutable += ".exe"; //$NON-NLS-1$ - }else if (SystemUtils.IS_OS_MAC){ - autoUpdateExecutable += ".app"; //$NON-NLS-1$ - }else if ( SystemUtils.IS_OS_UNIX && System.getProperty("sun.arch.data.model").equals("64")){ - autoUpdateExecutable += "-x64.run"; //$NON-NLS-1$ - }else if ( SystemUtils.IS_OS_UNIX ) { - autoUpdateExecutable += ".run"; //$NON-NLS-1$ + @Override + public void run() { + try { + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); + String line = reader.readLine(); + while (line != null) { + if( Boolean.TRUE.equals( logOutputAsError ) ) + LOGGER.error(line); + else + LOGGER.warn(line); + + line = reader.readLine(); } - - } catch (Exception e) { - logger.error("Error in Autoupdate executable", e); //$NON-NLS-1$ + reader.close(); + LOGGER.warn("End of logs"); + } catch (IOException e) { + LOGGER.error("The log reader died unexpectedly.", e); } - return autoUpdateExecutable; } - -} +} \ No newline at end of file From a745ca207c5cb35ac9212b0ffc97d5008958f5ba Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:11 +0100 Subject: [PATCH 1140/1620] New translations ProcessLoggerThread.java (English) --- .../earth/app/view/Messages_en.properties | 70 +++++++++++-------- 1 file changed, 42 insertions(+), 28 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index ea8d41cfa0..4b902b8805 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,34 +1,48 @@ package org.openforis.collect.earth.app.service; -import org.openforis.collect.earth.app.EarthConstants; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public class SchemaService { - - @Autowired - LocalPropertiesService localPropertiesService; - - private String getSchemaName(ExportType exportType) { - String schemaName = null; - if (localPropertiesService.isUsingPostgreSqlDB()) { - if( exportType.equals( ExportType.SAIKU )) - schemaName = EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU; - else - schemaName = EarthConstants.POSTGRES_RDB_SCHEMA_IPCC; - } - return schemaName; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class ProcessLoggerThread extends Thread { + + private static final Logger LOGGER = LoggerFactory.getLogger(ProcessLoggerThread.class); + + private InputStream inputStream; + + private Boolean logOutputAsError; + + + public ProcessLoggerThread(InputStream inputStream, Boolean logOutputAsError) { + super(); + + this.inputStream = inputStream; + this.logOutputAsError = logOutputAsError; } - public String getSchemaPrefix(ExportType exportType) { - String schemaName = getSchemaName(exportType); - if (schemaName != null) { - schemaName += "."; //$NON-NLS-1$ - } else { - schemaName = ""; //$NON-NLS-1$ + + @Override + public void run() { + try { + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); + String line = reader.readLine(); + while (line != null) { + if( Boolean.TRUE.equals( logOutputAsError ) ) + LOGGER.error(line); + else + LOGGER.warn(line); + + line = reader.readLine(); + } + reader.close(); + LOGGER.warn("End of logs"); + } catch (IOException e) { + LOGGER.error("The log reader died unexpectedly.", e); } - return schemaName; } - -} +} \ No newline at end of file From f9a8b1a31a19f132fad516703d693be3e945b5a4 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:12 +0100 Subject: [PATCH 1141/1620] New translations RDBConnector.java (French) --- .../earth/app/view/Messages_fr.properties | 54 +++++++++++++++++-- 1 file changed, 51 insertions(+), 3 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 7ea79d00ff..70e2ecd6d6 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,9 +1,57 @@ package org.openforis.collect.earth.app.service; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import java.sql.Connection; -public interface RDBPostProcessor { +import javax.sql.DataSource; - void processRDBData(InfiniteProgressMonitor progressListener); +import org.apache.commons.dbcp.BasicDataSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.DataSourceUtils; + +public abstract class RDBConnector { + @Autowired + @Qualifier("rdbDataSource") + private DataSource rdbDataSource; + + @Autowired + @Qualifier("rdbDataSourceIpcc") + private BasicDataSource rdbDataSourceIpcc; + + private JdbcTemplate jdbcTemplate; + + private ExportType exportTypeUsed; + + public JdbcTemplate getJdbcTemplate() { + if( jdbcTemplate == null ) { + if( getExportTypeUsed().equals( ExportType.SAIKU) ) { + jdbcTemplate = new JdbcTemplate(rdbDataSource); + }else if( getExportTypeUsed().equals( ExportType.IPCC ) ){ + jdbcTemplate = new JdbcTemplate(rdbDataSourceIpcc); + }else { + throw new IllegalArgumentException("The ExportType has not been set yet"); + } + } + return jdbcTemplate; + } + + protected Connection getJDBCConnection() { + if( getExportTypeUsed().equals( ExportType.SAIKU ) ) { + return DataSourceUtils.getConnection(rdbDataSource); + }else if( getExportTypeUsed().equals( ExportType.IPCC ) ){ + return DataSourceUtils.getConnection(rdbDataSourceIpcc); + }else { + throw new IllegalArgumentException("The ExportType has not been set yet"); + } + } + + public ExportType getExportTypeUsed() { + return exportTypeUsed; + } + + public void setExportTypeUsed(ExportType exportTypeUsed) { + this.exportTypeUsed = exportTypeUsed; + } } From 9742fe663fd4389915087ebbe3d38b8144b96de3 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:13 +0100 Subject: [PATCH 1142/1620] New translations RDBConnector.java (Spanish) --- .../earth/app/view/Messages_es.properties | 105 ++++++++++-------- 1 file changed, 57 insertions(+), 48 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 4b902b8805..70e2ecd6d6 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,48 +1,57 @@ -package org.openforis.collect.earth.app.service; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - -public class ProcessLoggerThread extends Thread { - - private static final Logger LOGGER = LoggerFactory.getLogger(ProcessLoggerThread.class); - - private InputStream inputStream; - - private Boolean logOutputAsError; - - - public ProcessLoggerThread(InputStream inputStream, Boolean logOutputAsError) { - super(); - - this.inputStream = inputStream; - this.logOutputAsError = logOutputAsError; - } - - - @Override - public void run() { - try { - BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); - String line = reader.readLine(); - while (line != null) { - if( Boolean.TRUE.equals( logOutputAsError ) ) - LOGGER.error(line); - else - LOGGER.warn(line); - - line = reader.readLine(); - } - reader.close(); - LOGGER.warn("End of logs"); - } catch (IOException e) { - LOGGER.error("The log reader died unexpectedly.", e); - } - } -} \ No newline at end of file +package org.openforis.collect.earth.app.service; + +import java.sql.Connection; + +import javax.sql.DataSource; + +import org.apache.commons.dbcp.BasicDataSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.DataSourceUtils; + +public abstract class RDBConnector { + @Autowired + @Qualifier("rdbDataSource") + private DataSource rdbDataSource; + + @Autowired + @Qualifier("rdbDataSourceIpcc") + private BasicDataSource rdbDataSourceIpcc; + + private JdbcTemplate jdbcTemplate; + + private ExportType exportTypeUsed; + + public JdbcTemplate getJdbcTemplate() { + if( jdbcTemplate == null ) { + if( getExportTypeUsed().equals( ExportType.SAIKU) ) { + jdbcTemplate = new JdbcTemplate(rdbDataSource); + }else if( getExportTypeUsed().equals( ExportType.IPCC ) ){ + jdbcTemplate = new JdbcTemplate(rdbDataSourceIpcc); + }else { + throw new IllegalArgumentException("The ExportType has not been set yet"); + } + } + return jdbcTemplate; + } + + protected Connection getJDBCConnection() { + if( getExportTypeUsed().equals( ExportType.SAIKU ) ) { + return DataSourceUtils.getConnection(rdbDataSource); + }else if( getExportTypeUsed().equals( ExportType.IPCC ) ){ + return DataSourceUtils.getConnection(rdbDataSourceIpcc); + }else { + throw new IllegalArgumentException("The ExportType has not been set yet"); + } + } + + public ExportType getExportTypeUsed() { + return exportTypeUsed; + } + + public void setExportTypeUsed(ExportType exportTypeUsed) { + this.exportTypeUsed = exportTypeUsed; + } + +} From cd9162d8c13bc950efd002e62408e6bbae65840b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:14 +0100 Subject: [PATCH 1143/1620] New translations RDBConnector.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 105 ++++++++++-------- 1 file changed, 57 insertions(+), 48 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 4b902b8805..70e2ecd6d6 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,48 +1,57 @@ -package org.openforis.collect.earth.app.service; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - -public class ProcessLoggerThread extends Thread { - - private static final Logger LOGGER = LoggerFactory.getLogger(ProcessLoggerThread.class); - - private InputStream inputStream; - - private Boolean logOutputAsError; - - - public ProcessLoggerThread(InputStream inputStream, Boolean logOutputAsError) { - super(); - - this.inputStream = inputStream; - this.logOutputAsError = logOutputAsError; - } - - - @Override - public void run() { - try { - BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); - String line = reader.readLine(); - while (line != null) { - if( Boolean.TRUE.equals( logOutputAsError ) ) - LOGGER.error(line); - else - LOGGER.warn(line); - - line = reader.readLine(); - } - reader.close(); - LOGGER.warn("End of logs"); - } catch (IOException e) { - LOGGER.error("The log reader died unexpectedly.", e); - } - } -} \ No newline at end of file +package org.openforis.collect.earth.app.service; + +import java.sql.Connection; + +import javax.sql.DataSource; + +import org.apache.commons.dbcp.BasicDataSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.DataSourceUtils; + +public abstract class RDBConnector { + @Autowired + @Qualifier("rdbDataSource") + private DataSource rdbDataSource; + + @Autowired + @Qualifier("rdbDataSourceIpcc") + private BasicDataSource rdbDataSourceIpcc; + + private JdbcTemplate jdbcTemplate; + + private ExportType exportTypeUsed; + + public JdbcTemplate getJdbcTemplate() { + if( jdbcTemplate == null ) { + if( getExportTypeUsed().equals( ExportType.SAIKU) ) { + jdbcTemplate = new JdbcTemplate(rdbDataSource); + }else if( getExportTypeUsed().equals( ExportType.IPCC ) ){ + jdbcTemplate = new JdbcTemplate(rdbDataSourceIpcc); + }else { + throw new IllegalArgumentException("The ExportType has not been set yet"); + } + } + return jdbcTemplate; + } + + protected Connection getJDBCConnection() { + if( getExportTypeUsed().equals( ExportType.SAIKU ) ) { + return DataSourceUtils.getConnection(rdbDataSource); + }else if( getExportTypeUsed().equals( ExportType.IPCC ) ){ + return DataSourceUtils.getConnection(rdbDataSourceIpcc); + }else { + throw new IllegalArgumentException("The ExportType has not been set yet"); + } + } + + public ExportType getExportTypeUsed() { + return exportTypeUsed; + } + + public void setExportTypeUsed(ExportType exportTypeUsed) { + this.exportTypeUsed = exportTypeUsed; + } + +} From f754efe24eadef66f0f5f2f6e756f2f70043ce0f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:15 +0100 Subject: [PATCH 1144/1620] New translations RDBConnector.java (English) --- .../earth/app/view/Messages_en.properties | 105 ++++++++++-------- 1 file changed, 57 insertions(+), 48 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 4b902b8805..70e2ecd6d6 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,48 +1,57 @@ -package org.openforis.collect.earth.app.service; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - -public class ProcessLoggerThread extends Thread { - - private static final Logger LOGGER = LoggerFactory.getLogger(ProcessLoggerThread.class); - - private InputStream inputStream; - - private Boolean logOutputAsError; - - - public ProcessLoggerThread(InputStream inputStream, Boolean logOutputAsError) { - super(); - - this.inputStream = inputStream; - this.logOutputAsError = logOutputAsError; - } - - - @Override - public void run() { - try { - BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); - String line = reader.readLine(); - while (line != null) { - if( Boolean.TRUE.equals( logOutputAsError ) ) - LOGGER.error(line); - else - LOGGER.warn(line); - - line = reader.readLine(); - } - reader.close(); - LOGGER.warn("End of logs"); - } catch (IOException e) { - LOGGER.error("The log reader died unexpectedly.", e); - } - } -} \ No newline at end of file +package org.openforis.collect.earth.app.service; + +import java.sql.Connection; + +import javax.sql.DataSource; + +import org.apache.commons.dbcp.BasicDataSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.DataSourceUtils; + +public abstract class RDBConnector { + @Autowired + @Qualifier("rdbDataSource") + private DataSource rdbDataSource; + + @Autowired + @Qualifier("rdbDataSourceIpcc") + private BasicDataSource rdbDataSourceIpcc; + + private JdbcTemplate jdbcTemplate; + + private ExportType exportTypeUsed; + + public JdbcTemplate getJdbcTemplate() { + if( jdbcTemplate == null ) { + if( getExportTypeUsed().equals( ExportType.SAIKU) ) { + jdbcTemplate = new JdbcTemplate(rdbDataSource); + }else if( getExportTypeUsed().equals( ExportType.IPCC ) ){ + jdbcTemplate = new JdbcTemplate(rdbDataSourceIpcc); + }else { + throw new IllegalArgumentException("The ExportType has not been set yet"); + } + } + return jdbcTemplate; + } + + protected Connection getJDBCConnection() { + if( getExportTypeUsed().equals( ExportType.SAIKU ) ) { + return DataSourceUtils.getConnection(rdbDataSource); + }else if( getExportTypeUsed().equals( ExportType.IPCC ) ){ + return DataSourceUtils.getConnection(rdbDataSourceIpcc); + }else { + throw new IllegalArgumentException("The ExportType has not been set yet"); + } + } + + public ExportType getExportTypeUsed() { + return exportTypeUsed; + } + + public void setExportTypeUsed(ExportType exportTypeUsed) { + this.exportTypeUsed = exportTypeUsed; + } + +} From 1a342e3ee6e215c90f07b3bb47434d4509dda54c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:17 +0100 Subject: [PATCH 1145/1620] New translations RDBExporter.java (French) --- .../earth/app/view/Messages_fr.properties | 212 +++++++++++++++--- 1 file changed, 177 insertions(+), 35 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 70e2ecd6d6..8b698b71db 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,57 +1,199 @@ package org.openforis.collect.earth.app.service; -import java.sql.Connection; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; -import javax.sql.DataSource; +import javax.swing.SwingUtilities; -import org.apache.commons.dbcp.BasicDataSource; +import org.apache.commons.lang3.SystemUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.core.rdb.RelationalSchemaContext; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.relational.CollectRDBPublisher; +import org.openforis.collect.relational.CollectRdbException; +import org.openforis.collect.relational.model.RelationalSchemaConfig; +import org.openforis.idm.metamodel.Survey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.datasource.DataSourceUtils; +import org.springframework.jdbc.CannotGetJdbcConnectionException; +import org.springframework.stereotype.Component; -public abstract class RDBConnector { - @Autowired - @Qualifier("rdbDataSource") - private DataSource rdbDataSource; +@Component +public class RDBExporter extends RDBConnector{ @Autowired - @Qualifier("rdbDataSourceIpcc") - private BasicDataSource rdbDataSourceIpcc; + CollectRDBPublisher collectRDBPublisher; + + @Autowired + EarthSurveyService earthSurveyService; + + @Autowired + public LocalPropertiesService localPropertiesService; + + private final Logger logger = LoggerFactory.getLogger(RDBExporter.class); - private JdbcTemplate jdbcTemplate; + public static final String COLLECT_EARTH_IPCC_DATABASE_RDB_DB = + EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + + ServerController.IPCC_RDB_SUFFIX; + public static final String COLLECT_EARTH_SAIKU_DATABASE_RDB_DB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + + ServerController.SAIKU_RDB_SUFFIX; + + private boolean userCancelledOperation = false; - private ExportType exportTypeUsed; + private void removeOldRdb( ) { + + final List tables = new ArrayList<>(); + + if (localPropertiesService.isUsingSqliteDB()) { + + cleanSqlLiteDb( tables); + + } else if (localPropertiesService.isUsingPostgreSqlDB()) { + cleanPostgresDb(); + + } + + } - public JdbcTemplate getJdbcTemplate() { - if( jdbcTemplate == null ) { - if( getExportTypeUsed().equals( ExportType.SAIKU) ) { - jdbcTemplate = new JdbcTemplate(rdbDataSource); - }else if( getExportTypeUsed().equals( ExportType.IPCC ) ){ - jdbcTemplate = new JdbcTemplate(rdbDataSourceIpcc); - }else { - throw new IllegalArgumentException("The ExportType has not been set yet"); + private void cleanPostgresDb( ) { + getJdbcTemplate().execute("DROP SCHEMA IF EXISTS " + getExportTypeUsed().getRdbSchema() + " CASCADE"); //$NON-NLS-1$ //$NON-NLS-2$ + getJdbcTemplate().execute("CREATE SCHEMA IF NOT EXISTS " + getExportTypeUsed().getRdbSchema() ); //$NON-NLS-1$ + } + + public File getRdbFile( ExportType exportType) { + return new File(exportType.getDbFileName()); + } + + private void cleanSqlLiteDb( final List tables) { + final File oldRdbFile = getRdbFile( getExportTypeUsed() ) ; + if (oldRdbFile.exists()) { + + // Now we can remove the SQLite file so that a completely new connection is open + try { + Files.delete( Paths.get( oldRdbFile.toURI() ) ); + } catch (IOException e1) { + logger.error("Error deleteing old Relational DB sqlite file", e1); + + // We need to delete all tables before we can remove the file and drop the + // connection + final List> listOfTables = getJdbcTemplate() + .queryForList("SELECT name FROM sqlite_master WHERE type='table' OR type ;"); //$NON-NLS-1$ + for (final Map entry : listOfTables) { + final String tableName = (String) entry.get("name"); //$NON-NLS-1$ + if (!tableName.equals("sqlite_sequence")) { //$NON-NLS-1$ + tables.add(tableName); + } + } + + for (final String tableName : tables) { + getJdbcTemplate().execute("DROP TABLE IF EXISTS " + tableName); //$NON-NLS-1$ + } + + // DROP VIEWS! + final List> listOfViews = getJdbcTemplate() + .queryForList("SELECT name FROM sqlite_master WHERE type = 'view';"); //$NON-NLS-1$ + for (final Map entry : listOfViews) { + final String viewName = (String) entry.get("name"); //$NON-NLS-1$ + getJdbcTemplate().execute("DROP VIEW IF EXISTS " + viewName); //$NON-NLS-1$ + } + try { + if( getJdbcTemplate().getDataSource() != null && getJdbcTemplate().getDataSource().getConnection() != null){ + getJdbcTemplate().getDataSource().getConnection().close(); + } + } catch (CannotGetJdbcConnectionException | SQLException e2) { + logger.error("Error closing the DB connection", e2); + } + // Now we can remove the SQLite file so that a completely new connection is open + try { + Files.delete( Paths.get( oldRdbFile.toURI() ) ); + } catch (IOException e3) { + logger.error("Error deleteing old Saiku DB sqlite file", e3); + } + } + + + if (!SystemUtils.IS_OS_WINDOWS) { + try { + Thread.yield(); + Thread.sleep(10000); + } catch (InterruptedException e) { + logger.error("Error while giving pass to other processes", e); + Thread.currentThread().interrupt(); + } } + + } - return jdbcTemplate; + } - - protected Connection getJDBCConnection() { - if( getExportTypeUsed().equals( ExportType.SAIKU ) ) { - return DataSourceUtils.getConnection(rdbDataSource); - }else if( getExportTypeUsed().equals( ExportType.IPCC ) ){ - return DataSourceUtils.getConnection(rdbDataSourceIpcc); - }else { - throw new IllegalArgumentException("The ExportType has not been set yet"); + + + public String getSchemaName( ExportType exportType ) { + if (localPropertiesService.isUsingPostgreSqlDB()) { + return exportType.getRdbSchema(); + } else { + return null; } } + + public void exportDataToRDB( + Survey survey, + ExportType exportType, + InfiniteProgressMonitor progressListener, + RDBPostProcessor callbackProcessor ) throws CollectRdbException { + + setExportTypeUsed(exportType); + + // Clean the previous RDB + removeOldRdb( ); + + /* + * The SQLite DB has no limit on the length of the varchar. By default, if no + * RelationalSchemaConfig is passed to the export command text fields will be + * truncated to 255 characters + */ + final RelationalSchemaConfig rdbConfig = new RelationalSchemaContext().getRdbConfig(); + + final String rdbPostgreSQLSchema = getSchemaName( exportType ); + + SwingUtilities.invokeLater( () -> progressListener.setMessage("Exporting collected records into Relational DB") ); - public ExportType getExportTypeUsed() { - return exportTypeUsed; + collectRDBPublisher.export( survey.getName(), + EarthConstants.ROOT_ENTITY_NAME, + Step.ENTRY, + rdbPostgreSQLSchema, + getJDBCConnection(), + rdbConfig, + progressListener); + + if (!isUserCancelledOperation()) { + System.currentTimeMillis(); + try { + setJDBCDefaultSchema( exportType); + callbackProcessor.processRDBData(progressListener); + } catch (final Exception e) { + logger.error("Error processing quantity data", e); //$NON-NLS-1$ + } + } + } + + private void setJDBCDefaultSchema( ExportType exportType ) { + if (localPropertiesService.isUsingPostgreSqlDB()) { + getJdbcTemplate().execute("SET search_path TO " + getSchemaName( exportType )); //$NON-NLS-1$ + } } - public void setExportTypeUsed(ExportType exportTypeUsed) { - this.exportTypeUsed = exportTypeUsed; + private boolean isUserCancelledOperation() { + return userCancelledOperation; } } From 688d52624764f9d9bb8d7bcb75a284a7ac16df05 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:18 +0100 Subject: [PATCH 1146/1620] New translations RDBExporter.java (Spanish) --- .../earth/app/view/Messages_es.properties | 212 +++++++++++++++--- 1 file changed, 177 insertions(+), 35 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 70e2ecd6d6..8b698b71db 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,57 +1,199 @@ package org.openforis.collect.earth.app.service; -import java.sql.Connection; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; -import javax.sql.DataSource; +import javax.swing.SwingUtilities; -import org.apache.commons.dbcp.BasicDataSource; +import org.apache.commons.lang3.SystemUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.core.rdb.RelationalSchemaContext; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.relational.CollectRDBPublisher; +import org.openforis.collect.relational.CollectRdbException; +import org.openforis.collect.relational.model.RelationalSchemaConfig; +import org.openforis.idm.metamodel.Survey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.datasource.DataSourceUtils; +import org.springframework.jdbc.CannotGetJdbcConnectionException; +import org.springframework.stereotype.Component; -public abstract class RDBConnector { - @Autowired - @Qualifier("rdbDataSource") - private DataSource rdbDataSource; +@Component +public class RDBExporter extends RDBConnector{ @Autowired - @Qualifier("rdbDataSourceIpcc") - private BasicDataSource rdbDataSourceIpcc; + CollectRDBPublisher collectRDBPublisher; + + @Autowired + EarthSurveyService earthSurveyService; + + @Autowired + public LocalPropertiesService localPropertiesService; + + private final Logger logger = LoggerFactory.getLogger(RDBExporter.class); - private JdbcTemplate jdbcTemplate; + public static final String COLLECT_EARTH_IPCC_DATABASE_RDB_DB = + EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + + ServerController.IPCC_RDB_SUFFIX; + public static final String COLLECT_EARTH_SAIKU_DATABASE_RDB_DB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + + ServerController.SAIKU_RDB_SUFFIX; + + private boolean userCancelledOperation = false; - private ExportType exportTypeUsed; + private void removeOldRdb( ) { + + final List tables = new ArrayList<>(); + + if (localPropertiesService.isUsingSqliteDB()) { + + cleanSqlLiteDb( tables); + + } else if (localPropertiesService.isUsingPostgreSqlDB()) { + cleanPostgresDb(); + + } + + } - public JdbcTemplate getJdbcTemplate() { - if( jdbcTemplate == null ) { - if( getExportTypeUsed().equals( ExportType.SAIKU) ) { - jdbcTemplate = new JdbcTemplate(rdbDataSource); - }else if( getExportTypeUsed().equals( ExportType.IPCC ) ){ - jdbcTemplate = new JdbcTemplate(rdbDataSourceIpcc); - }else { - throw new IllegalArgumentException("The ExportType has not been set yet"); + private void cleanPostgresDb( ) { + getJdbcTemplate().execute("DROP SCHEMA IF EXISTS " + getExportTypeUsed().getRdbSchema() + " CASCADE"); //$NON-NLS-1$ //$NON-NLS-2$ + getJdbcTemplate().execute("CREATE SCHEMA IF NOT EXISTS " + getExportTypeUsed().getRdbSchema() ); //$NON-NLS-1$ + } + + public File getRdbFile( ExportType exportType) { + return new File(exportType.getDbFileName()); + } + + private void cleanSqlLiteDb( final List tables) { + final File oldRdbFile = getRdbFile( getExportTypeUsed() ) ; + if (oldRdbFile.exists()) { + + // Now we can remove the SQLite file so that a completely new connection is open + try { + Files.delete( Paths.get( oldRdbFile.toURI() ) ); + } catch (IOException e1) { + logger.error("Error deleteing old Relational DB sqlite file", e1); + + // We need to delete all tables before we can remove the file and drop the + // connection + final List> listOfTables = getJdbcTemplate() + .queryForList("SELECT name FROM sqlite_master WHERE type='table' OR type ;"); //$NON-NLS-1$ + for (final Map entry : listOfTables) { + final String tableName = (String) entry.get("name"); //$NON-NLS-1$ + if (!tableName.equals("sqlite_sequence")) { //$NON-NLS-1$ + tables.add(tableName); + } + } + + for (final String tableName : tables) { + getJdbcTemplate().execute("DROP TABLE IF EXISTS " + tableName); //$NON-NLS-1$ + } + + // DROP VIEWS! + final List> listOfViews = getJdbcTemplate() + .queryForList("SELECT name FROM sqlite_master WHERE type = 'view';"); //$NON-NLS-1$ + for (final Map entry : listOfViews) { + final String viewName = (String) entry.get("name"); //$NON-NLS-1$ + getJdbcTemplate().execute("DROP VIEW IF EXISTS " + viewName); //$NON-NLS-1$ + } + try { + if( getJdbcTemplate().getDataSource() != null && getJdbcTemplate().getDataSource().getConnection() != null){ + getJdbcTemplate().getDataSource().getConnection().close(); + } + } catch (CannotGetJdbcConnectionException | SQLException e2) { + logger.error("Error closing the DB connection", e2); + } + // Now we can remove the SQLite file so that a completely new connection is open + try { + Files.delete( Paths.get( oldRdbFile.toURI() ) ); + } catch (IOException e3) { + logger.error("Error deleteing old Saiku DB sqlite file", e3); + } + } + + + if (!SystemUtils.IS_OS_WINDOWS) { + try { + Thread.yield(); + Thread.sleep(10000); + } catch (InterruptedException e) { + logger.error("Error while giving pass to other processes", e); + Thread.currentThread().interrupt(); + } } + + } - return jdbcTemplate; + } - - protected Connection getJDBCConnection() { - if( getExportTypeUsed().equals( ExportType.SAIKU ) ) { - return DataSourceUtils.getConnection(rdbDataSource); - }else if( getExportTypeUsed().equals( ExportType.IPCC ) ){ - return DataSourceUtils.getConnection(rdbDataSourceIpcc); - }else { - throw new IllegalArgumentException("The ExportType has not been set yet"); + + + public String getSchemaName( ExportType exportType ) { + if (localPropertiesService.isUsingPostgreSqlDB()) { + return exportType.getRdbSchema(); + } else { + return null; } } + + public void exportDataToRDB( + Survey survey, + ExportType exportType, + InfiniteProgressMonitor progressListener, + RDBPostProcessor callbackProcessor ) throws CollectRdbException { + + setExportTypeUsed(exportType); + + // Clean the previous RDB + removeOldRdb( ); + + /* + * The SQLite DB has no limit on the length of the varchar. By default, if no + * RelationalSchemaConfig is passed to the export command text fields will be + * truncated to 255 characters + */ + final RelationalSchemaConfig rdbConfig = new RelationalSchemaContext().getRdbConfig(); + + final String rdbPostgreSQLSchema = getSchemaName( exportType ); + + SwingUtilities.invokeLater( () -> progressListener.setMessage("Exporting collected records into Relational DB") ); - public ExportType getExportTypeUsed() { - return exportTypeUsed; + collectRDBPublisher.export( survey.getName(), + EarthConstants.ROOT_ENTITY_NAME, + Step.ENTRY, + rdbPostgreSQLSchema, + getJDBCConnection(), + rdbConfig, + progressListener); + + if (!isUserCancelledOperation()) { + System.currentTimeMillis(); + try { + setJDBCDefaultSchema( exportType); + callbackProcessor.processRDBData(progressListener); + } catch (final Exception e) { + logger.error("Error processing quantity data", e); //$NON-NLS-1$ + } + } + } + + private void setJDBCDefaultSchema( ExportType exportType ) { + if (localPropertiesService.isUsingPostgreSqlDB()) { + getJdbcTemplate().execute("SET search_path TO " + getSchemaName( exportType )); //$NON-NLS-1$ + } } - public void setExportTypeUsed(ExportType exportTypeUsed) { - this.exportTypeUsed = exportTypeUsed; + private boolean isUserCancelledOperation() { + return userCancelledOperation; } } From b23ae5d5cf6604d49af8eca4f3001fed3027e6ce Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:19 +0100 Subject: [PATCH 1147/1620] New translations RDBExporter.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 212 +++++++++++++++--- 1 file changed, 177 insertions(+), 35 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 70e2ecd6d6..8b698b71db 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,57 +1,199 @@ package org.openforis.collect.earth.app.service; -import java.sql.Connection; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; -import javax.sql.DataSource; +import javax.swing.SwingUtilities; -import org.apache.commons.dbcp.BasicDataSource; +import org.apache.commons.lang3.SystemUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.core.rdb.RelationalSchemaContext; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.relational.CollectRDBPublisher; +import org.openforis.collect.relational.CollectRdbException; +import org.openforis.collect.relational.model.RelationalSchemaConfig; +import org.openforis.idm.metamodel.Survey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.datasource.DataSourceUtils; +import org.springframework.jdbc.CannotGetJdbcConnectionException; +import org.springframework.stereotype.Component; -public abstract class RDBConnector { - @Autowired - @Qualifier("rdbDataSource") - private DataSource rdbDataSource; +@Component +public class RDBExporter extends RDBConnector{ @Autowired - @Qualifier("rdbDataSourceIpcc") - private BasicDataSource rdbDataSourceIpcc; + CollectRDBPublisher collectRDBPublisher; + + @Autowired + EarthSurveyService earthSurveyService; + + @Autowired + public LocalPropertiesService localPropertiesService; + + private final Logger logger = LoggerFactory.getLogger(RDBExporter.class); - private JdbcTemplate jdbcTemplate; + public static final String COLLECT_EARTH_IPCC_DATABASE_RDB_DB = + EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + + ServerController.IPCC_RDB_SUFFIX; + public static final String COLLECT_EARTH_SAIKU_DATABASE_RDB_DB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + + ServerController.SAIKU_RDB_SUFFIX; + + private boolean userCancelledOperation = false; - private ExportType exportTypeUsed; + private void removeOldRdb( ) { + + final List tables = new ArrayList<>(); + + if (localPropertiesService.isUsingSqliteDB()) { + + cleanSqlLiteDb( tables); + + } else if (localPropertiesService.isUsingPostgreSqlDB()) { + cleanPostgresDb(); + + } + + } - public JdbcTemplate getJdbcTemplate() { - if( jdbcTemplate == null ) { - if( getExportTypeUsed().equals( ExportType.SAIKU) ) { - jdbcTemplate = new JdbcTemplate(rdbDataSource); - }else if( getExportTypeUsed().equals( ExportType.IPCC ) ){ - jdbcTemplate = new JdbcTemplate(rdbDataSourceIpcc); - }else { - throw new IllegalArgumentException("The ExportType has not been set yet"); + private void cleanPostgresDb( ) { + getJdbcTemplate().execute("DROP SCHEMA IF EXISTS " + getExportTypeUsed().getRdbSchema() + " CASCADE"); //$NON-NLS-1$ //$NON-NLS-2$ + getJdbcTemplate().execute("CREATE SCHEMA IF NOT EXISTS " + getExportTypeUsed().getRdbSchema() ); //$NON-NLS-1$ + } + + public File getRdbFile( ExportType exportType) { + return new File(exportType.getDbFileName()); + } + + private void cleanSqlLiteDb( final List tables) { + final File oldRdbFile = getRdbFile( getExportTypeUsed() ) ; + if (oldRdbFile.exists()) { + + // Now we can remove the SQLite file so that a completely new connection is open + try { + Files.delete( Paths.get( oldRdbFile.toURI() ) ); + } catch (IOException e1) { + logger.error("Error deleteing old Relational DB sqlite file", e1); + + // We need to delete all tables before we can remove the file and drop the + // connection + final List> listOfTables = getJdbcTemplate() + .queryForList("SELECT name FROM sqlite_master WHERE type='table' OR type ;"); //$NON-NLS-1$ + for (final Map entry : listOfTables) { + final String tableName = (String) entry.get("name"); //$NON-NLS-1$ + if (!tableName.equals("sqlite_sequence")) { //$NON-NLS-1$ + tables.add(tableName); + } + } + + for (final String tableName : tables) { + getJdbcTemplate().execute("DROP TABLE IF EXISTS " + tableName); //$NON-NLS-1$ + } + + // DROP VIEWS! + final List> listOfViews = getJdbcTemplate() + .queryForList("SELECT name FROM sqlite_master WHERE type = 'view';"); //$NON-NLS-1$ + for (final Map entry : listOfViews) { + final String viewName = (String) entry.get("name"); //$NON-NLS-1$ + getJdbcTemplate().execute("DROP VIEW IF EXISTS " + viewName); //$NON-NLS-1$ + } + try { + if( getJdbcTemplate().getDataSource() != null && getJdbcTemplate().getDataSource().getConnection() != null){ + getJdbcTemplate().getDataSource().getConnection().close(); + } + } catch (CannotGetJdbcConnectionException | SQLException e2) { + logger.error("Error closing the DB connection", e2); + } + // Now we can remove the SQLite file so that a completely new connection is open + try { + Files.delete( Paths.get( oldRdbFile.toURI() ) ); + } catch (IOException e3) { + logger.error("Error deleteing old Saiku DB sqlite file", e3); + } + } + + + if (!SystemUtils.IS_OS_WINDOWS) { + try { + Thread.yield(); + Thread.sleep(10000); + } catch (InterruptedException e) { + logger.error("Error while giving pass to other processes", e); + Thread.currentThread().interrupt(); + } } + + } - return jdbcTemplate; + } - - protected Connection getJDBCConnection() { - if( getExportTypeUsed().equals( ExportType.SAIKU ) ) { - return DataSourceUtils.getConnection(rdbDataSource); - }else if( getExportTypeUsed().equals( ExportType.IPCC ) ){ - return DataSourceUtils.getConnection(rdbDataSourceIpcc); - }else { - throw new IllegalArgumentException("The ExportType has not been set yet"); + + + public String getSchemaName( ExportType exportType ) { + if (localPropertiesService.isUsingPostgreSqlDB()) { + return exportType.getRdbSchema(); + } else { + return null; } } + + public void exportDataToRDB( + Survey survey, + ExportType exportType, + InfiniteProgressMonitor progressListener, + RDBPostProcessor callbackProcessor ) throws CollectRdbException { + + setExportTypeUsed(exportType); + + // Clean the previous RDB + removeOldRdb( ); + + /* + * The SQLite DB has no limit on the length of the varchar. By default, if no + * RelationalSchemaConfig is passed to the export command text fields will be + * truncated to 255 characters + */ + final RelationalSchemaConfig rdbConfig = new RelationalSchemaContext().getRdbConfig(); + + final String rdbPostgreSQLSchema = getSchemaName( exportType ); + + SwingUtilities.invokeLater( () -> progressListener.setMessage("Exporting collected records into Relational DB") ); - public ExportType getExportTypeUsed() { - return exportTypeUsed; + collectRDBPublisher.export( survey.getName(), + EarthConstants.ROOT_ENTITY_NAME, + Step.ENTRY, + rdbPostgreSQLSchema, + getJDBCConnection(), + rdbConfig, + progressListener); + + if (!isUserCancelledOperation()) { + System.currentTimeMillis(); + try { + setJDBCDefaultSchema( exportType); + callbackProcessor.processRDBData(progressListener); + } catch (final Exception e) { + logger.error("Error processing quantity data", e); //$NON-NLS-1$ + } + } + } + + private void setJDBCDefaultSchema( ExportType exportType ) { + if (localPropertiesService.isUsingPostgreSqlDB()) { + getJdbcTemplate().execute("SET search_path TO " + getSchemaName( exportType )); //$NON-NLS-1$ + } } - public void setExportTypeUsed(ExportType exportTypeUsed) { - this.exportTypeUsed = exportTypeUsed; + private boolean isUserCancelledOperation() { + return userCancelledOperation; } } From 63345536ad0add443c314023e56fa0d0dfcbde5a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:20 +0100 Subject: [PATCH 1148/1620] New translations RDBExporter.java (English) --- .../earth/app/view/Messages_en.properties | 212 +++++++++++++++--- 1 file changed, 177 insertions(+), 35 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 70e2ecd6d6..8b698b71db 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,57 +1,199 @@ package org.openforis.collect.earth.app.service; -import java.sql.Connection; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; -import javax.sql.DataSource; +import javax.swing.SwingUtilities; -import org.apache.commons.dbcp.BasicDataSource; +import org.apache.commons.lang3.SystemUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.desktop.ServerController; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.core.rdb.RelationalSchemaContext; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.relational.CollectRDBPublisher; +import org.openforis.collect.relational.CollectRdbException; +import org.openforis.collect.relational.model.RelationalSchemaConfig; +import org.openforis.idm.metamodel.Survey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.datasource.DataSourceUtils; +import org.springframework.jdbc.CannotGetJdbcConnectionException; +import org.springframework.stereotype.Component; -public abstract class RDBConnector { - @Autowired - @Qualifier("rdbDataSource") - private DataSource rdbDataSource; +@Component +public class RDBExporter extends RDBConnector{ @Autowired - @Qualifier("rdbDataSourceIpcc") - private BasicDataSource rdbDataSourceIpcc; + CollectRDBPublisher collectRDBPublisher; + + @Autowired + EarthSurveyService earthSurveyService; + + @Autowired + public LocalPropertiesService localPropertiesService; + + private final Logger logger = LoggerFactory.getLogger(RDBExporter.class); - private JdbcTemplate jdbcTemplate; + public static final String COLLECT_EARTH_IPCC_DATABASE_RDB_DB = + EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + + ServerController.IPCC_RDB_SUFFIX; + public static final String COLLECT_EARTH_SAIKU_DATABASE_RDB_DB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB + + ServerController.SAIKU_RDB_SUFFIX; + + private boolean userCancelledOperation = false; - private ExportType exportTypeUsed; + private void removeOldRdb( ) { + + final List tables = new ArrayList<>(); + + if (localPropertiesService.isUsingSqliteDB()) { + + cleanSqlLiteDb( tables); + + } else if (localPropertiesService.isUsingPostgreSqlDB()) { + cleanPostgresDb(); + + } + + } - public JdbcTemplate getJdbcTemplate() { - if( jdbcTemplate == null ) { - if( getExportTypeUsed().equals( ExportType.SAIKU) ) { - jdbcTemplate = new JdbcTemplate(rdbDataSource); - }else if( getExportTypeUsed().equals( ExportType.IPCC ) ){ - jdbcTemplate = new JdbcTemplate(rdbDataSourceIpcc); - }else { - throw new IllegalArgumentException("The ExportType has not been set yet"); + private void cleanPostgresDb( ) { + getJdbcTemplate().execute("DROP SCHEMA IF EXISTS " + getExportTypeUsed().getRdbSchema() + " CASCADE"); //$NON-NLS-1$ //$NON-NLS-2$ + getJdbcTemplate().execute("CREATE SCHEMA IF NOT EXISTS " + getExportTypeUsed().getRdbSchema() ); //$NON-NLS-1$ + } + + public File getRdbFile( ExportType exportType) { + return new File(exportType.getDbFileName()); + } + + private void cleanSqlLiteDb( final List tables) { + final File oldRdbFile = getRdbFile( getExportTypeUsed() ) ; + if (oldRdbFile.exists()) { + + // Now we can remove the SQLite file so that a completely new connection is open + try { + Files.delete( Paths.get( oldRdbFile.toURI() ) ); + } catch (IOException e1) { + logger.error("Error deleteing old Relational DB sqlite file", e1); + + // We need to delete all tables before we can remove the file and drop the + // connection + final List> listOfTables = getJdbcTemplate() + .queryForList("SELECT name FROM sqlite_master WHERE type='table' OR type ;"); //$NON-NLS-1$ + for (final Map entry : listOfTables) { + final String tableName = (String) entry.get("name"); //$NON-NLS-1$ + if (!tableName.equals("sqlite_sequence")) { //$NON-NLS-1$ + tables.add(tableName); + } + } + + for (final String tableName : tables) { + getJdbcTemplate().execute("DROP TABLE IF EXISTS " + tableName); //$NON-NLS-1$ + } + + // DROP VIEWS! + final List> listOfViews = getJdbcTemplate() + .queryForList("SELECT name FROM sqlite_master WHERE type = 'view';"); //$NON-NLS-1$ + for (final Map entry : listOfViews) { + final String viewName = (String) entry.get("name"); //$NON-NLS-1$ + getJdbcTemplate().execute("DROP VIEW IF EXISTS " + viewName); //$NON-NLS-1$ + } + try { + if( getJdbcTemplate().getDataSource() != null && getJdbcTemplate().getDataSource().getConnection() != null){ + getJdbcTemplate().getDataSource().getConnection().close(); + } + } catch (CannotGetJdbcConnectionException | SQLException e2) { + logger.error("Error closing the DB connection", e2); + } + // Now we can remove the SQLite file so that a completely new connection is open + try { + Files.delete( Paths.get( oldRdbFile.toURI() ) ); + } catch (IOException e3) { + logger.error("Error deleteing old Saiku DB sqlite file", e3); + } + } + + + if (!SystemUtils.IS_OS_WINDOWS) { + try { + Thread.yield(); + Thread.sleep(10000); + } catch (InterruptedException e) { + logger.error("Error while giving pass to other processes", e); + Thread.currentThread().interrupt(); + } } + + } - return jdbcTemplate; + } - - protected Connection getJDBCConnection() { - if( getExportTypeUsed().equals( ExportType.SAIKU ) ) { - return DataSourceUtils.getConnection(rdbDataSource); - }else if( getExportTypeUsed().equals( ExportType.IPCC ) ){ - return DataSourceUtils.getConnection(rdbDataSourceIpcc); - }else { - throw new IllegalArgumentException("The ExportType has not been set yet"); + + + public String getSchemaName( ExportType exportType ) { + if (localPropertiesService.isUsingPostgreSqlDB()) { + return exportType.getRdbSchema(); + } else { + return null; } } + + public void exportDataToRDB( + Survey survey, + ExportType exportType, + InfiniteProgressMonitor progressListener, + RDBPostProcessor callbackProcessor ) throws CollectRdbException { + + setExportTypeUsed(exportType); + + // Clean the previous RDB + removeOldRdb( ); + + /* + * The SQLite DB has no limit on the length of the varchar. By default, if no + * RelationalSchemaConfig is passed to the export command text fields will be + * truncated to 255 characters + */ + final RelationalSchemaConfig rdbConfig = new RelationalSchemaContext().getRdbConfig(); + + final String rdbPostgreSQLSchema = getSchemaName( exportType ); + + SwingUtilities.invokeLater( () -> progressListener.setMessage("Exporting collected records into Relational DB") ); - public ExportType getExportTypeUsed() { - return exportTypeUsed; + collectRDBPublisher.export( survey.getName(), + EarthConstants.ROOT_ENTITY_NAME, + Step.ENTRY, + rdbPostgreSQLSchema, + getJDBCConnection(), + rdbConfig, + progressListener); + + if (!isUserCancelledOperation()) { + System.currentTimeMillis(); + try { + setJDBCDefaultSchema( exportType); + callbackProcessor.processRDBData(progressListener); + } catch (final Exception e) { + logger.error("Error processing quantity data", e); //$NON-NLS-1$ + } + } + } + + private void setJDBCDefaultSchema( ExportType exportType ) { + if (localPropertiesService.isUsingPostgreSqlDB()) { + getJdbcTemplate().execute("SET search_path TO " + getSchemaName( exportType )); //$NON-NLS-1$ + } } - public void setExportTypeUsed(ExportType exportTypeUsed) { - this.exportTypeUsed = exportTypeUsed; + private boolean isUserCancelledOperation() { + return userCancelledOperation; } } From 8b5366f56bb36b39fea521c786465a904fbfe406 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:21 +0100 Subject: [PATCH 1149/1620] New translations RDBPostProcessor.java (Spanish) --- .../earth/app/view/Messages_es.properties | 194 +----------------- 1 file changed, 2 insertions(+), 192 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 8b698b71db..7ea79d00ff 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,199 +1,9 @@ package org.openforis.collect.earth.app.service; -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.SystemUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.desktop.ServerController; import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.core.rdb.RelationalSchemaContext; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.relational.CollectRDBPublisher; -import org.openforis.collect.relational.CollectRdbException; -import org.openforis.collect.relational.model.RelationalSchemaConfig; -import org.openforis.idm.metamodel.Survey; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.CannotGetJdbcConnectionException; -import org.springframework.stereotype.Component; - -@Component -public class RDBExporter extends RDBConnector{ - - @Autowired - CollectRDBPublisher collectRDBPublisher; - - @Autowired - EarthSurveyService earthSurveyService; - - @Autowired - public LocalPropertiesService localPropertiesService; - - private final Logger logger = LoggerFactory.getLogger(RDBExporter.class); - - public static final String COLLECT_EARTH_IPCC_DATABASE_RDB_DB = - EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB - + ServerController.IPCC_RDB_SUFFIX; - public static final String COLLECT_EARTH_SAIKU_DATABASE_RDB_DB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB - + ServerController.SAIKU_RDB_SUFFIX; - - private boolean userCancelledOperation = false; - - private void removeOldRdb( ) { - - final List tables = new ArrayList<>(); - - if (localPropertiesService.isUsingSqliteDB()) { - - cleanSqlLiteDb( tables); - - } else if (localPropertiesService.isUsingPostgreSqlDB()) { - cleanPostgresDb(); - - } - - } - - private void cleanPostgresDb( ) { - getJdbcTemplate().execute("DROP SCHEMA IF EXISTS " + getExportTypeUsed().getRdbSchema() + " CASCADE"); //$NON-NLS-1$ //$NON-NLS-2$ - getJdbcTemplate().execute("CREATE SCHEMA IF NOT EXISTS " + getExportTypeUsed().getRdbSchema() ); //$NON-NLS-1$ - } - - public File getRdbFile( ExportType exportType) { - return new File(exportType.getDbFileName()); - } - - private void cleanSqlLiteDb( final List tables) { - final File oldRdbFile = getRdbFile( getExportTypeUsed() ) ; - if (oldRdbFile.exists()) { - - // Now we can remove the SQLite file so that a completely new connection is open - try { - Files.delete( Paths.get( oldRdbFile.toURI() ) ); - } catch (IOException e1) { - logger.error("Error deleteing old Relational DB sqlite file", e1); - - // We need to delete all tables before we can remove the file and drop the - // connection - final List> listOfTables = getJdbcTemplate() - .queryForList("SELECT name FROM sqlite_master WHERE type='table' OR type ;"); //$NON-NLS-1$ - for (final Map entry : listOfTables) { - final String tableName = (String) entry.get("name"); //$NON-NLS-1$ - if (!tableName.equals("sqlite_sequence")) { //$NON-NLS-1$ - tables.add(tableName); - } - } - - for (final String tableName : tables) { - getJdbcTemplate().execute("DROP TABLE IF EXISTS " + tableName); //$NON-NLS-1$ - } - - // DROP VIEWS! - final List> listOfViews = getJdbcTemplate() - .queryForList("SELECT name FROM sqlite_master WHERE type = 'view';"); //$NON-NLS-1$ - for (final Map entry : listOfViews) { - final String viewName = (String) entry.get("name"); //$NON-NLS-1$ - getJdbcTemplate().execute("DROP VIEW IF EXISTS " + viewName); //$NON-NLS-1$ - } - try { - if( getJdbcTemplate().getDataSource() != null && getJdbcTemplate().getDataSource().getConnection() != null){ - getJdbcTemplate().getDataSource().getConnection().close(); - } - } catch (CannotGetJdbcConnectionException | SQLException e2) { - logger.error("Error closing the DB connection", e2); - } - // Now we can remove the SQLite file so that a completely new connection is open - try { - Files.delete( Paths.get( oldRdbFile.toURI() ) ); - } catch (IOException e3) { - logger.error("Error deleteing old Saiku DB sqlite file", e3); - } - } - - - if (!SystemUtils.IS_OS_WINDOWS) { - try { - Thread.yield(); - Thread.sleep(10000); - } catch (InterruptedException e) { - logger.error("Error while giving pass to other processes", e); - Thread.currentThread().interrupt(); - } - } - - - } - - } - - - public String getSchemaName( ExportType exportType ) { - if (localPropertiesService.isUsingPostgreSqlDB()) { - return exportType.getRdbSchema(); - } else { - return null; - } - } - - public void exportDataToRDB( - Survey survey, - ExportType exportType, - InfiniteProgressMonitor progressListener, - RDBPostProcessor callbackProcessor ) throws CollectRdbException { - - setExportTypeUsed(exportType); - - // Clean the previous RDB - removeOldRdb( ); - - /* - * The SQLite DB has no limit on the length of the varchar. By default, if no - * RelationalSchemaConfig is passed to the export command text fields will be - * truncated to 255 characters - */ - final RelationalSchemaConfig rdbConfig = new RelationalSchemaContext().getRdbConfig(); - - final String rdbPostgreSQLSchema = getSchemaName( exportType ); - - SwingUtilities.invokeLater( () -> progressListener.setMessage("Exporting collected records into Relational DB") ); - - collectRDBPublisher.export( survey.getName(), - EarthConstants.ROOT_ENTITY_NAME, - Step.ENTRY, - rdbPostgreSQLSchema, - getJDBCConnection(), - rdbConfig, - progressListener); - if (!isUserCancelledOperation()) { - System.currentTimeMillis(); - try { - setJDBCDefaultSchema( exportType); - callbackProcessor.processRDBData(progressListener); - } catch (final Exception e) { - logger.error("Error processing quantity data", e); //$NON-NLS-1$ - } - } - } - - private void setJDBCDefaultSchema( ExportType exportType ) { - if (localPropertiesService.isUsingPostgreSqlDB()) { - getJdbcTemplate().execute("SET search_path TO " + getSchemaName( exportType )); //$NON-NLS-1$ - } - } +public interface RDBPostProcessor { - private boolean isUserCancelledOperation() { - return userCancelledOperation; - } + void processRDBData(InfiniteProgressMonitor progressListener); } From d7e0a9d49e817bd5cc281a53f181d26ca04b0367 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:22 +0100 Subject: [PATCH 1150/1620] New translations SchemaService.java (French) --- .../earth/app/view/Messages_fr.properties | 233 +++--------------- 1 file changed, 34 insertions(+), 199 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 8b698b71db..ea8d41cfa0 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,199 +1,34 @@ -package org.openforis.collect.earth.app.service; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.SystemUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.desktop.ServerController; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.core.rdb.RelationalSchemaContext; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.relational.CollectRDBPublisher; -import org.openforis.collect.relational.CollectRdbException; -import org.openforis.collect.relational.model.RelationalSchemaConfig; -import org.openforis.idm.metamodel.Survey; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.CannotGetJdbcConnectionException; -import org.springframework.stereotype.Component; - -@Component -public class RDBExporter extends RDBConnector{ - - @Autowired - CollectRDBPublisher collectRDBPublisher; - - @Autowired - EarthSurveyService earthSurveyService; - - @Autowired - public LocalPropertiesService localPropertiesService; - - private final Logger logger = LoggerFactory.getLogger(RDBExporter.class); - - public static final String COLLECT_EARTH_IPCC_DATABASE_RDB_DB = - EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB - + ServerController.IPCC_RDB_SUFFIX; - public static final String COLLECT_EARTH_SAIKU_DATABASE_RDB_DB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB - + ServerController.SAIKU_RDB_SUFFIX; - - private boolean userCancelledOperation = false; - - private void removeOldRdb( ) { - - final List tables = new ArrayList<>(); - - if (localPropertiesService.isUsingSqliteDB()) { - - cleanSqlLiteDb( tables); - - } else if (localPropertiesService.isUsingPostgreSqlDB()) { - cleanPostgresDb(); - - } - - } - - private void cleanPostgresDb( ) { - getJdbcTemplate().execute("DROP SCHEMA IF EXISTS " + getExportTypeUsed().getRdbSchema() + " CASCADE"); //$NON-NLS-1$ //$NON-NLS-2$ - getJdbcTemplate().execute("CREATE SCHEMA IF NOT EXISTS " + getExportTypeUsed().getRdbSchema() ); //$NON-NLS-1$ - } - - public File getRdbFile( ExportType exportType) { - return new File(exportType.getDbFileName()); - } - - private void cleanSqlLiteDb( final List tables) { - final File oldRdbFile = getRdbFile( getExportTypeUsed() ) ; - if (oldRdbFile.exists()) { - - // Now we can remove the SQLite file so that a completely new connection is open - try { - Files.delete( Paths.get( oldRdbFile.toURI() ) ); - } catch (IOException e1) { - logger.error("Error deleteing old Relational DB sqlite file", e1); - - // We need to delete all tables before we can remove the file and drop the - // connection - final List> listOfTables = getJdbcTemplate() - .queryForList("SELECT name FROM sqlite_master WHERE type='table' OR type ;"); //$NON-NLS-1$ - for (final Map entry : listOfTables) { - final String tableName = (String) entry.get("name"); //$NON-NLS-1$ - if (!tableName.equals("sqlite_sequence")) { //$NON-NLS-1$ - tables.add(tableName); - } - } - - for (final String tableName : tables) { - getJdbcTemplate().execute("DROP TABLE IF EXISTS " + tableName); //$NON-NLS-1$ - } - - // DROP VIEWS! - final List> listOfViews = getJdbcTemplate() - .queryForList("SELECT name FROM sqlite_master WHERE type = 'view';"); //$NON-NLS-1$ - for (final Map entry : listOfViews) { - final String viewName = (String) entry.get("name"); //$NON-NLS-1$ - getJdbcTemplate().execute("DROP VIEW IF EXISTS " + viewName); //$NON-NLS-1$ - } - try { - if( getJdbcTemplate().getDataSource() != null && getJdbcTemplate().getDataSource().getConnection() != null){ - getJdbcTemplate().getDataSource().getConnection().close(); - } - } catch (CannotGetJdbcConnectionException | SQLException e2) { - logger.error("Error closing the DB connection", e2); - } - // Now we can remove the SQLite file so that a completely new connection is open - try { - Files.delete( Paths.get( oldRdbFile.toURI() ) ); - } catch (IOException e3) { - logger.error("Error deleteing old Saiku DB sqlite file", e3); - } - } - - - if (!SystemUtils.IS_OS_WINDOWS) { - try { - Thread.yield(); - Thread.sleep(10000); - } catch (InterruptedException e) { - logger.error("Error while giving pass to other processes", e); - Thread.currentThread().interrupt(); - } - } - - - } - - } - - - public String getSchemaName( ExportType exportType ) { - if (localPropertiesService.isUsingPostgreSqlDB()) { - return exportType.getRdbSchema(); - } else { - return null; - } - } - - public void exportDataToRDB( - Survey survey, - ExportType exportType, - InfiniteProgressMonitor progressListener, - RDBPostProcessor callbackProcessor ) throws CollectRdbException { - - setExportTypeUsed(exportType); - - // Clean the previous RDB - removeOldRdb( ); - - /* - * The SQLite DB has no limit on the length of the varchar. By default, if no - * RelationalSchemaConfig is passed to the export command text fields will be - * truncated to 255 characters - */ - final RelationalSchemaConfig rdbConfig = new RelationalSchemaContext().getRdbConfig(); - - final String rdbPostgreSQLSchema = getSchemaName( exportType ); - - SwingUtilities.invokeLater( () -> progressListener.setMessage("Exporting collected records into Relational DB") ); - - collectRDBPublisher.export( survey.getName(), - EarthConstants.ROOT_ENTITY_NAME, - Step.ENTRY, - rdbPostgreSQLSchema, - getJDBCConnection(), - rdbConfig, - progressListener); - - if (!isUserCancelledOperation()) { - System.currentTimeMillis(); - try { - setJDBCDefaultSchema( exportType); - callbackProcessor.processRDBData(progressListener); - } catch (final Exception e) { - logger.error("Error processing quantity data", e); //$NON-NLS-1$ - } - } - } - - private void setJDBCDefaultSchema( ExportType exportType ) { - if (localPropertiesService.isUsingPostgreSqlDB()) { - getJdbcTemplate().execute("SET search_path TO " + getSchemaName( exportType )); //$NON-NLS-1$ - } - } - - private boolean isUserCancelledOperation() { - return userCancelledOperation; - } - -} +package org.openforis.collect.earth.app.service; + +import org.openforis.collect.earth.app.EarthConstants; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class SchemaService { + + @Autowired + LocalPropertiesService localPropertiesService; + + private String getSchemaName(ExportType exportType) { + String schemaName = null; + if (localPropertiesService.isUsingPostgreSqlDB()) { + if( exportType.equals( ExportType.SAIKU )) + schemaName = EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU; + else + schemaName = EarthConstants.POSTGRES_RDB_SCHEMA_IPCC; + } + return schemaName; + } + + public String getSchemaPrefix(ExportType exportType) { + String schemaName = getSchemaName(exportType); + if (schemaName != null) { + schemaName += "."; //$NON-NLS-1$ + } else { + schemaName = ""; //$NON-NLS-1$ + } + return schemaName; + } + +} From a8a7445396183df08e2149751c31ee6ad00b794c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:23 +0100 Subject: [PATCH 1151/1620] New translations RDBPostProcessor.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 194 +----------------- 1 file changed, 2 insertions(+), 192 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 8b698b71db..7ea79d00ff 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,199 +1,9 @@ package org.openforis.collect.earth.app.service; -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.SystemUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.desktop.ServerController; import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.core.rdb.RelationalSchemaContext; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.relational.CollectRDBPublisher; -import org.openforis.collect.relational.CollectRdbException; -import org.openforis.collect.relational.model.RelationalSchemaConfig; -import org.openforis.idm.metamodel.Survey; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.CannotGetJdbcConnectionException; -import org.springframework.stereotype.Component; - -@Component -public class RDBExporter extends RDBConnector{ - - @Autowired - CollectRDBPublisher collectRDBPublisher; - - @Autowired - EarthSurveyService earthSurveyService; - - @Autowired - public LocalPropertiesService localPropertiesService; - - private final Logger logger = LoggerFactory.getLogger(RDBExporter.class); - - public static final String COLLECT_EARTH_IPCC_DATABASE_RDB_DB = - EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB - + ServerController.IPCC_RDB_SUFFIX; - public static final String COLLECT_EARTH_SAIKU_DATABASE_RDB_DB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB - + ServerController.SAIKU_RDB_SUFFIX; - - private boolean userCancelledOperation = false; - - private void removeOldRdb( ) { - - final List tables = new ArrayList<>(); - - if (localPropertiesService.isUsingSqliteDB()) { - - cleanSqlLiteDb( tables); - - } else if (localPropertiesService.isUsingPostgreSqlDB()) { - cleanPostgresDb(); - - } - - } - - private void cleanPostgresDb( ) { - getJdbcTemplate().execute("DROP SCHEMA IF EXISTS " + getExportTypeUsed().getRdbSchema() + " CASCADE"); //$NON-NLS-1$ //$NON-NLS-2$ - getJdbcTemplate().execute("CREATE SCHEMA IF NOT EXISTS " + getExportTypeUsed().getRdbSchema() ); //$NON-NLS-1$ - } - - public File getRdbFile( ExportType exportType) { - return new File(exportType.getDbFileName()); - } - - private void cleanSqlLiteDb( final List tables) { - final File oldRdbFile = getRdbFile( getExportTypeUsed() ) ; - if (oldRdbFile.exists()) { - - // Now we can remove the SQLite file so that a completely new connection is open - try { - Files.delete( Paths.get( oldRdbFile.toURI() ) ); - } catch (IOException e1) { - logger.error("Error deleteing old Relational DB sqlite file", e1); - - // We need to delete all tables before we can remove the file and drop the - // connection - final List> listOfTables = getJdbcTemplate() - .queryForList("SELECT name FROM sqlite_master WHERE type='table' OR type ;"); //$NON-NLS-1$ - for (final Map entry : listOfTables) { - final String tableName = (String) entry.get("name"); //$NON-NLS-1$ - if (!tableName.equals("sqlite_sequence")) { //$NON-NLS-1$ - tables.add(tableName); - } - } - - for (final String tableName : tables) { - getJdbcTemplate().execute("DROP TABLE IF EXISTS " + tableName); //$NON-NLS-1$ - } - - // DROP VIEWS! - final List> listOfViews = getJdbcTemplate() - .queryForList("SELECT name FROM sqlite_master WHERE type = 'view';"); //$NON-NLS-1$ - for (final Map entry : listOfViews) { - final String viewName = (String) entry.get("name"); //$NON-NLS-1$ - getJdbcTemplate().execute("DROP VIEW IF EXISTS " + viewName); //$NON-NLS-1$ - } - try { - if( getJdbcTemplate().getDataSource() != null && getJdbcTemplate().getDataSource().getConnection() != null){ - getJdbcTemplate().getDataSource().getConnection().close(); - } - } catch (CannotGetJdbcConnectionException | SQLException e2) { - logger.error("Error closing the DB connection", e2); - } - // Now we can remove the SQLite file so that a completely new connection is open - try { - Files.delete( Paths.get( oldRdbFile.toURI() ) ); - } catch (IOException e3) { - logger.error("Error deleteing old Saiku DB sqlite file", e3); - } - } - - - if (!SystemUtils.IS_OS_WINDOWS) { - try { - Thread.yield(); - Thread.sleep(10000); - } catch (InterruptedException e) { - logger.error("Error while giving pass to other processes", e); - Thread.currentThread().interrupt(); - } - } - - - } - - } - - - public String getSchemaName( ExportType exportType ) { - if (localPropertiesService.isUsingPostgreSqlDB()) { - return exportType.getRdbSchema(); - } else { - return null; - } - } - - public void exportDataToRDB( - Survey survey, - ExportType exportType, - InfiniteProgressMonitor progressListener, - RDBPostProcessor callbackProcessor ) throws CollectRdbException { - - setExportTypeUsed(exportType); - - // Clean the previous RDB - removeOldRdb( ); - - /* - * The SQLite DB has no limit on the length of the varchar. By default, if no - * RelationalSchemaConfig is passed to the export command text fields will be - * truncated to 255 characters - */ - final RelationalSchemaConfig rdbConfig = new RelationalSchemaContext().getRdbConfig(); - - final String rdbPostgreSQLSchema = getSchemaName( exportType ); - - SwingUtilities.invokeLater( () -> progressListener.setMessage("Exporting collected records into Relational DB") ); - - collectRDBPublisher.export( survey.getName(), - EarthConstants.ROOT_ENTITY_NAME, - Step.ENTRY, - rdbPostgreSQLSchema, - getJDBCConnection(), - rdbConfig, - progressListener); - if (!isUserCancelledOperation()) { - System.currentTimeMillis(); - try { - setJDBCDefaultSchema( exportType); - callbackProcessor.processRDBData(progressListener); - } catch (final Exception e) { - logger.error("Error processing quantity data", e); //$NON-NLS-1$ - } - } - } - - private void setJDBCDefaultSchema( ExportType exportType ) { - if (localPropertiesService.isUsingPostgreSqlDB()) { - getJdbcTemplate().execute("SET search_path TO " + getSchemaName( exportType )); //$NON-NLS-1$ - } - } +public interface RDBPostProcessor { - private boolean isUserCancelledOperation() { - return userCancelledOperation; - } + void processRDBData(InfiniteProgressMonitor progressListener); } From 72f359339201c4438cde4bdf1afb03b95d47ab11 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:24 +0100 Subject: [PATCH 1152/1620] New translations RDBPostProcessor.java (English) --- .../earth/app/view/Messages_en.properties | 194 +----------------- 1 file changed, 2 insertions(+), 192 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 8b698b71db..7ea79d00ff 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,199 +1,9 @@ package org.openforis.collect.earth.app.service; -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.SystemUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.desktop.ServerController; import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.core.rdb.RelationalSchemaContext; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.relational.CollectRDBPublisher; -import org.openforis.collect.relational.CollectRdbException; -import org.openforis.collect.relational.model.RelationalSchemaConfig; -import org.openforis.idm.metamodel.Survey; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.CannotGetJdbcConnectionException; -import org.springframework.stereotype.Component; - -@Component -public class RDBExporter extends RDBConnector{ - - @Autowired - CollectRDBPublisher collectRDBPublisher; - - @Autowired - EarthSurveyService earthSurveyService; - - @Autowired - public LocalPropertiesService localPropertiesService; - - private final Logger logger = LoggerFactory.getLogger(RDBExporter.class); - - public static final String COLLECT_EARTH_IPCC_DATABASE_RDB_DB = - EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB - + ServerController.IPCC_RDB_SUFFIX; - public static final String COLLECT_EARTH_SAIKU_DATABASE_RDB_DB = EarthConstants.COLLECT_EARTH_DATABASE_SQLITE_DB - + ServerController.SAIKU_RDB_SUFFIX; - - private boolean userCancelledOperation = false; - - private void removeOldRdb( ) { - - final List tables = new ArrayList<>(); - - if (localPropertiesService.isUsingSqliteDB()) { - - cleanSqlLiteDb( tables); - - } else if (localPropertiesService.isUsingPostgreSqlDB()) { - cleanPostgresDb(); - - } - - } - - private void cleanPostgresDb( ) { - getJdbcTemplate().execute("DROP SCHEMA IF EXISTS " + getExportTypeUsed().getRdbSchema() + " CASCADE"); //$NON-NLS-1$ //$NON-NLS-2$ - getJdbcTemplate().execute("CREATE SCHEMA IF NOT EXISTS " + getExportTypeUsed().getRdbSchema() ); //$NON-NLS-1$ - } - - public File getRdbFile( ExportType exportType) { - return new File(exportType.getDbFileName()); - } - - private void cleanSqlLiteDb( final List tables) { - final File oldRdbFile = getRdbFile( getExportTypeUsed() ) ; - if (oldRdbFile.exists()) { - - // Now we can remove the SQLite file so that a completely new connection is open - try { - Files.delete( Paths.get( oldRdbFile.toURI() ) ); - } catch (IOException e1) { - logger.error("Error deleteing old Relational DB sqlite file", e1); - - // We need to delete all tables before we can remove the file and drop the - // connection - final List> listOfTables = getJdbcTemplate() - .queryForList("SELECT name FROM sqlite_master WHERE type='table' OR type ;"); //$NON-NLS-1$ - for (final Map entry : listOfTables) { - final String tableName = (String) entry.get("name"); //$NON-NLS-1$ - if (!tableName.equals("sqlite_sequence")) { //$NON-NLS-1$ - tables.add(tableName); - } - } - - for (final String tableName : tables) { - getJdbcTemplate().execute("DROP TABLE IF EXISTS " + tableName); //$NON-NLS-1$ - } - - // DROP VIEWS! - final List> listOfViews = getJdbcTemplate() - .queryForList("SELECT name FROM sqlite_master WHERE type = 'view';"); //$NON-NLS-1$ - for (final Map entry : listOfViews) { - final String viewName = (String) entry.get("name"); //$NON-NLS-1$ - getJdbcTemplate().execute("DROP VIEW IF EXISTS " + viewName); //$NON-NLS-1$ - } - try { - if( getJdbcTemplate().getDataSource() != null && getJdbcTemplate().getDataSource().getConnection() != null){ - getJdbcTemplate().getDataSource().getConnection().close(); - } - } catch (CannotGetJdbcConnectionException | SQLException e2) { - logger.error("Error closing the DB connection", e2); - } - // Now we can remove the SQLite file so that a completely new connection is open - try { - Files.delete( Paths.get( oldRdbFile.toURI() ) ); - } catch (IOException e3) { - logger.error("Error deleteing old Saiku DB sqlite file", e3); - } - } - - - if (!SystemUtils.IS_OS_WINDOWS) { - try { - Thread.yield(); - Thread.sleep(10000); - } catch (InterruptedException e) { - logger.error("Error while giving pass to other processes", e); - Thread.currentThread().interrupt(); - } - } - - - } - - } - - - public String getSchemaName( ExportType exportType ) { - if (localPropertiesService.isUsingPostgreSqlDB()) { - return exportType.getRdbSchema(); - } else { - return null; - } - } - - public void exportDataToRDB( - Survey survey, - ExportType exportType, - InfiniteProgressMonitor progressListener, - RDBPostProcessor callbackProcessor ) throws CollectRdbException { - - setExportTypeUsed(exportType); - - // Clean the previous RDB - removeOldRdb( ); - - /* - * The SQLite DB has no limit on the length of the varchar. By default, if no - * RelationalSchemaConfig is passed to the export command text fields will be - * truncated to 255 characters - */ - final RelationalSchemaConfig rdbConfig = new RelationalSchemaContext().getRdbConfig(); - - final String rdbPostgreSQLSchema = getSchemaName( exportType ); - - SwingUtilities.invokeLater( () -> progressListener.setMessage("Exporting collected records into Relational DB") ); - - collectRDBPublisher.export( survey.getName(), - EarthConstants.ROOT_ENTITY_NAME, - Step.ENTRY, - rdbPostgreSQLSchema, - getJDBCConnection(), - rdbConfig, - progressListener); - if (!isUserCancelledOperation()) { - System.currentTimeMillis(); - try { - setJDBCDefaultSchema( exportType); - callbackProcessor.processRDBData(progressListener); - } catch (final Exception e) { - logger.error("Error processing quantity data", e); //$NON-NLS-1$ - } - } - } - - private void setJDBCDefaultSchema( ExportType exportType ) { - if (localPropertiesService.isUsingPostgreSqlDB()) { - getJdbcTemplate().execute("SET search_path TO " + getSchemaName( exportType )); //$NON-NLS-1$ - } - } +public interface RDBPostProcessor { - private boolean isUserCancelledOperation() { - return userCancelledOperation; - } + void processRDBData(InfiniteProgressMonitor progressListener); } From 7415a20899f012f199f0646637cb7a8482fbc131 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:25 +0100 Subject: [PATCH 1153/1620] New translations RegionCalculationUtils.java (French) --- .../earth/app/view/Messages_fr.properties | 382 +++++++++++++++++- 1 file changed, 362 insertions(+), 20 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index ea8d41cfa0..905f384f1e 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,34 +1,376 @@ package org.openforis.collect.earth.app.service; +import java.io.File; +import java.io.FileNotFoundException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Locale; + import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.idm.metamodel.BooleanAttributeDefinition; +import org.openforis.idm.metamodel.EntityDefinition; +import org.openforis.idm.metamodel.NodeDefinition; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Component; +import com.opencsv.CSVReader; + @Component -public class SchemaService { +public class RegionCalculationUtils{ + + private static final String AREA_CSV_COLUMN = "area"; + private static final String WEIGHT_CSV_COLUMN = "weight"; + private static final String PLOT_SET = "plot SET "; + private static final String UPDATE = "UPDATE "; + private static final String PLOT_ADD = "plot ADD "; + private static final String FLOAT = " FLOAT"; + private static final String ALTER_TABLE = "ALTER TABLE "; + private static final String ALTER_TABLE2 = ALTER_TABLE; + private static final String SHRUB_COUNT = "shrub_count"; + private static final String TREE_COUNT = "tree_count"; + private static final String REGION_AREAS_CSV = "region_areas.csv"; //$NON-NLS-1$ + private static final String ATTRIBUTE_AREAS_CSV = "areas_per_attribute.csv"; //$NON-NLS-1$ + private static final String PLOT_WEIGHT = "plot_weight"; //$NON-NLS-1$ + private static final String TREES_PER_EXP_FACTOR = "trees_per_expansion_factor"; //$NON-NLS-1$ + private static final String SHRUBS_PER_EXP_FACTOR = "shrubs_per_expansion_factor"; //$NON-NLS-1$ + private static final String NO_DATA_LAND_USE = "noData"; //$NON-NLS-1$ + private static final String MANY_TREES = "many_trees"; + private static final String MANY_SHRUBS = "many_shrubs"; + + public static final String EXPANSION_FACTOR = "expansion_factor"; //$NON-NLS-1$ + private final Logger logger = LoggerFactory.getLogger(RegionCalculationUtils.class); + + @Autowired + EarthSurveyService earthSurveyService; @Autowired LocalPropertiesService localPropertiesService; - - private String getSchemaName(ExportType exportType) { - String schemaName = null; - if (localPropertiesService.isUsingPostgreSqlDB()) { - if( exportType.equals( ExportType.SAIKU )) - schemaName = EarthConstants.POSTGRES_RDB_SCHEMA_SAIKU; - else - schemaName = EarthConstants.POSTGRES_RDB_SCHEMA_IPCC; - } - return schemaName; - } - - public String getSchemaPrefix(ExportType exportType) { - String schemaName = getSchemaName(exportType); - if (schemaName != null) { - schemaName += "."; //$NON-NLS-1$ + + @Autowired + private SchemaService schemaService; + + private JdbcTemplate jdbcTemplate; + + private ExportType exportType; + + public void handleRegionCalculation(ExportType exportType, JdbcTemplate jdbcTemplate){ + + try { + setExportType(exportType); + setJdbcTemplate(jdbcTemplate); + createWeightFactors(); + + // If the region_areas.csv is not present then try to add the areas "per attribute" using the file areas_per_attribute.csv + boolean areasAdded = false; + if(!addAreasPerRegion()){ + if( addAreasPerAttribute() ){ + areasAdded = true; + } + }else{ + areasAdded = true; + } + + if( areasAdded ){ + handleNumberOfTrees(); + handleNumberOfShrubs(); + recalculatePlotWeights(); + } + + } catch (Exception e) { + logger.error( "Error when calculating the expansion factors for the plots ", e); + } + } + + private void recalculatePlotWeights() { + String schemaName = getSchemaPrefix(); + String selectMinExpansionFactorSql = String.format("SELECT MIN(%s) FROM %splot", EXPANSION_FACTOR, schemaName); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + Double minExpansionFactor = getJdbcTemplate().queryForObject(selectMinExpansionFactorSql, Double.class); + //set plot_weight = expansion_factor / minExpansionFactor + String updatePlotWeightSql = String.format(Locale.US, "UPDATE %splot SET %s=%s/%.5f", schemaName, PLOT_WEIGHT, EXPANSION_FACTOR, minExpansionFactor); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + getJdbcTemplate().update(updatePlotWeightSql); + } + + private String getSchemaPrefix() { + return schemaService.getSchemaPrefix( getExportType() ); + } + + private void createWeightFactors(){ + final String schemaName = getSchemaPrefix(); + getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + EXPANSION_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + PLOT_WEIGHT + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + + /** + * This is the "old way"of assigning an expansion factor (the area in hectares that a plot represents) to a plot based on the information form the "region_areas.csv" file. + * @return True if there was a region_areas.csv file, false if not present so that areas were not assigned. + */ + private boolean addAreasPerRegion() { + + final File regionAreas = new File( localPropertiesService.getProjectFolder() + File.separatorChar + REGION_AREAS_CSV); + String schemaName = getSchemaPrefix(); + + if (regionAreas.exists()) { + + try( CSVReader csvReader = CsvReaderUtils.getCsvReader(regionAreas.getAbsolutePath()) ) { + + String[] csvLine = null; + + while( ( csvLine = csvReader.readNext() ) != null ){ + try { + String region = csvLine[0]; + String plotFile = csvLine[1]; + int areaHectares = Integer.parseInt( csvLine[2] ); + final Float plotWeight = 1f; // The plot weight will always be calculated in a later step + + Object[] parameters = new String[]{region,plotFile}; + + Integer plotsInRegion = getJdbcTemplate().queryForObject( + "SELECT count( DISTINCT "+EarthConstants.PLOT_ID+") FROM " + schemaName + "plot WHERE ( region=? OR plot_file=? ) AND land_use_category != '"+NO_DATA_LAND_USE+"' ", + Integer.class, + parameters); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + Float expansionFactorHectaresCalc = 0f; + if( plotsInRegion.intValue() != 0 ){ + expansionFactorHectaresCalc = (float)areaHectares / (float) plotsInRegion.intValue(); + } + + final Object[] updateValues = new Object[4]; + updateValues[0] = expansionFactorHectaresCalc; + updateValues[1] = plotWeight; + updateValues[2] = region; + updateValues[3] = plotFile; + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+EXPANSION_FACTOR+"=?, "+PLOT_WEIGHT+"=? WHERE region=? OR plot_file=?", updateValues); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + } catch (NumberFormatException e) { + logger.error("Possibly the header", e); //$NON-NLS-1$ + } + + } + + // FINALLY ASSIGN A WEIGHT OF CERO AND AN EXPANSION FACTOR OF 0 FOR THE PLOTS WITH NO_DATA + + final Object[] updateNoDataValues = new Object[3]; + updateNoDataValues[0] = 0; + updateNoDataValues[1] = 0; + updateNoDataValues[2] = NO_DATA_LAND_USE; + + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+EXPANSION_FACTOR+"=?, "+PLOT_WEIGHT+"=? WHERE land_use_category=?", updateNoDataValues); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + + } catch (FileNotFoundException e) { + logger.error("File not found?", e); //$NON-NLS-1$ + } catch (Exception e) { + logger.error("Error reading the CSV file", e); //$NON-NLS-1$ + } + + return true; + }else{ + logger.warn("No CSV " + REGION_AREAS_CSV + " present, calculating areas will not be possible"); //$NON-NLS-1$ + return false; + } + + } + + + private void handleNumberOfShrubs() { + String schemaName = getSchemaPrefix(); + // This is specific to the Global Forest Survey - Drylands monitoring assessment + if( + AnalysisSaikuService.surveyContains(SHRUB_COUNT, earthSurveyService.getCollectSurvey() ) + && + AnalysisSaikuService.surveyContains(MANY_SHRUBS, earthSurveyService.getCollectSurvey() ) + ){ + // First set the number of shrubs to 30 if the user assessed that there were more than 30 shrubs on the plot + // This way we get a conservative estimation + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+SHRUB_COUNT+"=30 WHERE " + MANY_SHRUBS + "='1'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + SHRUBS_PER_EXP_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+SHRUBS_PER_EXP_FACTOR+"="+EXPANSION_FACTOR+"*2*" + SHRUB_COUNT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + } + } + + private void handleNumberOfTrees() { + String schemaName = getSchemaPrefix(); + // This is specific to the Global Forest Survey - Drylands monitoring assessment + if( + AnalysisSaikuService.surveyContains(TREE_COUNT, earthSurveyService.getCollectSurvey() ) + && + AnalysisSaikuService.surveyContains(MANY_TREES, earthSurveyService.getCollectSurvey() ) + ){ + // First set the number of shrubs to 30 if the user assessed that there were more than 30 shrubs on the plot + // This way we get a conservative estimation + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+TREE_COUNT+"=30 WHERE " + MANY_TREES + "='1'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + TREES_PER_EXP_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+TREES_PER_EXP_FACTOR+"="+EXPANSION_FACTOR+"*2*" + TREE_COUNT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + } + } + + private boolean addAreasPerAttribute() { + + final File areasPerAttribute = new File( localPropertiesService.getProjectFolder() + File.separatorChar + ATTRIBUTE_AREAS_CSV); + String schemaName = getSchemaPrefix(); + + if (areasPerAttribute.exists()) { + + try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(areasPerAttribute.getAbsolutePath(), false) ){ + // The header (first line) should contain the names of the three columns : attribute_name,area + + String[] columnNames = csvReader.readNext(); + + + ArrayList attributeNames = new ArrayList(); + + if(columnNames.length < 2 ){ + throw new RuntimeException("The " + areasPerAttribute.getAbsolutePath() + " file needs have this format : attribute_name1,attribute_name2,...attribute_nameN,"+AREA_CSV_COLUMN+"./nAt least one attribute is necessary. This would be the attribute or attributes (their name in the survey definition) that would relate the plot with its expansion factor"); + } + + // The weight column has been removed in the latest versions of the areas per attribute csv + // Lets add it again for backward compatibility + boolean weightColumnPresent = columnNames[columnNames.length -1].equalsIgnoreCase(WEIGHT_CSV_COLUMN); + if( ! weightColumnPresent ) { + // We need to create anew array with an extra item + String[] longer = new String[columnNames.length + 1]; + for (int i = 0; i < columnNames.length; i++) + longer[i] = columnNames[i]; + longer[columnNames.length] = WEIGHT_CSV_COLUMN; // add the + columnNames = longer; + } + + for( int colPosition = 0; colPosition batchArgs = new ArrayList<>(); + int line = 1; + String[] csvLine = null; + while( ( csvLine = csvReader.readNext() ) != null ){ + try{ + float areaHectares = Float.parseFloat( csvLine[ columnNames.length-2 ] ); + final Float plotWeight = weightColumnPresent ? Float.parseFloat( csvLine[columnNames.length -1] ) : 1; // if no weight column present we assume same weight for all plots + + List attributeValues = extractAttributeValues(csvLine, attributeNames); + + Integer plotCountPerAttributes = getJdbcTemplate().queryForObject(plotCountSelectQuery, Integer.class, attributeValues.toArray()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + // Calculate the expansion factor: simply the division of the area for the selected attributes by the amount of plots that match the attribute values + Float expansionFactorHectaresCalc = 0f; + if( plotCountPerAttributes.intValue() != 0 ){ + expansionFactorHectaresCalc = areaHectares / (float) plotCountPerAttributes.intValue(); + } + + // Add the expansion factor and plot_weight to the values that will be sent with the update + attributeValues.add(0, expansionFactorHectaresCalc); + attributeValues.add(1, plotWeight); + + batchArgs.add(attributeValues.toArray()); + }catch( Exception e5){ + logger.error("Problem in line number " + line + " with values " + Arrays.toString( csvLine ), e5 ); + }finally{ + line++; + } + } + getJdbcTemplate().batchUpdate(updatePlotQuery, batchArgs); + } catch (FileNotFoundException e) { + logger.error("File not found?", e); //$NON-NLS-1$ + } catch (Exception e) { + logger.error("Error reading the CSV file", e); //$NON-NLS-1$ + } + + return true; + }else{ + logger.warn("No CSV " + ATTRIBUTE_AREAS_CSV + " present, calculating areas will not be possible"); //$NON-NLS-1$ + return false; + } + + } + + private List extractAttributeValues(String[] csvLine, List attributeNames) { + List values = new ArrayList<>(attributeNames.size()); + for(int colIndex = 0; colIndex < attributeNames.size(); colIndex++) { + String stringValue = csvLine[colIndex]; + String attributeName = attributeNames.get(colIndex); + Object value = getTypedValue(attributeName, stringValue); + values.add(value); + } + return values; + } + + private Object getTypedValue(String attributeName, String stringValue) { + EntityDefinition rootEntityDef = earthSurveyService.getRootEntityDefinition(); + NodeDefinition attributeDef = rootEntityDef.getChildDefinition(attributeName); + if (attributeDef instanceof BooleanAttributeDefinition) { + return Boolean.TRUE.toString().equalsIgnoreCase(stringValue) || "1".equals(stringValue); } else { - schemaName = ""; //$NON-NLS-1$ + return stringValue; } - return schemaName; } - + + private boolean isAttributeInPlotEntity(String attributeName) { + EntityDefinition rootEntityDefinition = earthSurveyService.getRootEntityDefinition(); + try { + rootEntityDefinition.getChildDefinition(attributeName); + } catch (Exception e) { + // The attribute does not exist under the plot entity + return false; + } + return true; + } + + public ExportType getExportType() { + return exportType; + } + + public void setExportType(ExportType exportType) { + this.exportType = exportType; + } + + private JdbcTemplate getJdbcTemplate() { + return jdbcTemplate; + } + + private void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + } From 8e4bfad53f362f023a8ec7511fa5f7cfcf40581c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:27 +0100 Subject: [PATCH 1154/1620] New translations RegionCalculationUtils.java (Spanish) --- .../earth/app/view/Messages_es.properties | 385 +++++++++++++++++- 1 file changed, 376 insertions(+), 9 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 7ea79d00ff..905f384f1e 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,9 +1,376 @@ -package org.openforis.collect.earth.app.service; - -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; - -public interface RDBPostProcessor { - - void processRDBData(InfiniteProgressMonitor progressListener); - -} +package org.openforis.collect.earth.app.service; + +import java.io.File; +import java.io.FileNotFoundException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Locale; + +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.idm.metamodel.BooleanAttributeDefinition; +import org.openforis.idm.metamodel.EntityDefinition; +import org.openforis.idm.metamodel.NodeDefinition; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Component; + +import com.opencsv.CSVReader; + +@Component +public class RegionCalculationUtils{ + + private static final String AREA_CSV_COLUMN = "area"; + private static final String WEIGHT_CSV_COLUMN = "weight"; + private static final String PLOT_SET = "plot SET "; + private static final String UPDATE = "UPDATE "; + private static final String PLOT_ADD = "plot ADD "; + private static final String FLOAT = " FLOAT"; + private static final String ALTER_TABLE = "ALTER TABLE "; + private static final String ALTER_TABLE2 = ALTER_TABLE; + private static final String SHRUB_COUNT = "shrub_count"; + private static final String TREE_COUNT = "tree_count"; + private static final String REGION_AREAS_CSV = "region_areas.csv"; //$NON-NLS-1$ + private static final String ATTRIBUTE_AREAS_CSV = "areas_per_attribute.csv"; //$NON-NLS-1$ + private static final String PLOT_WEIGHT = "plot_weight"; //$NON-NLS-1$ + private static final String TREES_PER_EXP_FACTOR = "trees_per_expansion_factor"; //$NON-NLS-1$ + private static final String SHRUBS_PER_EXP_FACTOR = "shrubs_per_expansion_factor"; //$NON-NLS-1$ + private static final String NO_DATA_LAND_USE = "noData"; //$NON-NLS-1$ + private static final String MANY_TREES = "many_trees"; + private static final String MANY_SHRUBS = "many_shrubs"; + + public static final String EXPANSION_FACTOR = "expansion_factor"; //$NON-NLS-1$ + private final Logger logger = LoggerFactory.getLogger(RegionCalculationUtils.class); + + @Autowired + EarthSurveyService earthSurveyService; + + @Autowired + LocalPropertiesService localPropertiesService; + + @Autowired + private SchemaService schemaService; + + private JdbcTemplate jdbcTemplate; + + private ExportType exportType; + + public void handleRegionCalculation(ExportType exportType, JdbcTemplate jdbcTemplate){ + + try { + setExportType(exportType); + setJdbcTemplate(jdbcTemplate); + createWeightFactors(); + + // If the region_areas.csv is not present then try to add the areas "per attribute" using the file areas_per_attribute.csv + boolean areasAdded = false; + if(!addAreasPerRegion()){ + if( addAreasPerAttribute() ){ + areasAdded = true; + } + }else{ + areasAdded = true; + } + + if( areasAdded ){ + handleNumberOfTrees(); + handleNumberOfShrubs(); + recalculatePlotWeights(); + } + + } catch (Exception e) { + logger.error( "Error when calculating the expansion factors for the plots ", e); + } + } + + private void recalculatePlotWeights() { + String schemaName = getSchemaPrefix(); + String selectMinExpansionFactorSql = String.format("SELECT MIN(%s) FROM %splot", EXPANSION_FACTOR, schemaName); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + Double minExpansionFactor = getJdbcTemplate().queryForObject(selectMinExpansionFactorSql, Double.class); + //set plot_weight = expansion_factor / minExpansionFactor + String updatePlotWeightSql = String.format(Locale.US, "UPDATE %splot SET %s=%s/%.5f", schemaName, PLOT_WEIGHT, EXPANSION_FACTOR, minExpansionFactor); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + getJdbcTemplate().update(updatePlotWeightSql); + } + + private String getSchemaPrefix() { + return schemaService.getSchemaPrefix( getExportType() ); + } + + private void createWeightFactors(){ + final String schemaName = getSchemaPrefix(); + getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + EXPANSION_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + PLOT_WEIGHT + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + + /** + * This is the "old way"of assigning an expansion factor (the area in hectares that a plot represents) to a plot based on the information form the "region_areas.csv" file. + * @return True if there was a region_areas.csv file, false if not present so that areas were not assigned. + */ + private boolean addAreasPerRegion() { + + final File regionAreas = new File( localPropertiesService.getProjectFolder() + File.separatorChar + REGION_AREAS_CSV); + String schemaName = getSchemaPrefix(); + + if (regionAreas.exists()) { + + try( CSVReader csvReader = CsvReaderUtils.getCsvReader(regionAreas.getAbsolutePath()) ) { + + String[] csvLine = null; + + while( ( csvLine = csvReader.readNext() ) != null ){ + try { + String region = csvLine[0]; + String plotFile = csvLine[1]; + int areaHectares = Integer.parseInt( csvLine[2] ); + final Float plotWeight = 1f; // The plot weight will always be calculated in a later step + + Object[] parameters = new String[]{region,plotFile}; + + Integer plotsInRegion = getJdbcTemplate().queryForObject( + "SELECT count( DISTINCT "+EarthConstants.PLOT_ID+") FROM " + schemaName + "plot WHERE ( region=? OR plot_file=? ) AND land_use_category != '"+NO_DATA_LAND_USE+"' ", + Integer.class, + parameters); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + Float expansionFactorHectaresCalc = 0f; + if( plotsInRegion.intValue() != 0 ){ + expansionFactorHectaresCalc = (float)areaHectares / (float) plotsInRegion.intValue(); + } + + final Object[] updateValues = new Object[4]; + updateValues[0] = expansionFactorHectaresCalc; + updateValues[1] = plotWeight; + updateValues[2] = region; + updateValues[3] = plotFile; + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+EXPANSION_FACTOR+"=?, "+PLOT_WEIGHT+"=? WHERE region=? OR plot_file=?", updateValues); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + } catch (NumberFormatException e) { + logger.error("Possibly the header", e); //$NON-NLS-1$ + } + + } + + // FINALLY ASSIGN A WEIGHT OF CERO AND AN EXPANSION FACTOR OF 0 FOR THE PLOTS WITH NO_DATA + + final Object[] updateNoDataValues = new Object[3]; + updateNoDataValues[0] = 0; + updateNoDataValues[1] = 0; + updateNoDataValues[2] = NO_DATA_LAND_USE; + + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+EXPANSION_FACTOR+"=?, "+PLOT_WEIGHT+"=? WHERE land_use_category=?", updateNoDataValues); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + + } catch (FileNotFoundException e) { + logger.error("File not found?", e); //$NON-NLS-1$ + } catch (Exception e) { + logger.error("Error reading the CSV file", e); //$NON-NLS-1$ + } + + return true; + }else{ + logger.warn("No CSV " + REGION_AREAS_CSV + " present, calculating areas will not be possible"); //$NON-NLS-1$ + return false; + } + + } + + + private void handleNumberOfShrubs() { + String schemaName = getSchemaPrefix(); + // This is specific to the Global Forest Survey - Drylands monitoring assessment + if( + AnalysisSaikuService.surveyContains(SHRUB_COUNT, earthSurveyService.getCollectSurvey() ) + && + AnalysisSaikuService.surveyContains(MANY_SHRUBS, earthSurveyService.getCollectSurvey() ) + ){ + // First set the number of shrubs to 30 if the user assessed that there were more than 30 shrubs on the plot + // This way we get a conservative estimation + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+SHRUB_COUNT+"=30 WHERE " + MANY_SHRUBS + "='1'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + SHRUBS_PER_EXP_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+SHRUBS_PER_EXP_FACTOR+"="+EXPANSION_FACTOR+"*2*" + SHRUB_COUNT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + } + } + + private void handleNumberOfTrees() { + String schemaName = getSchemaPrefix(); + // This is specific to the Global Forest Survey - Drylands monitoring assessment + if( + AnalysisSaikuService.surveyContains(TREE_COUNT, earthSurveyService.getCollectSurvey() ) + && + AnalysisSaikuService.surveyContains(MANY_TREES, earthSurveyService.getCollectSurvey() ) + ){ + // First set the number of shrubs to 30 if the user assessed that there were more than 30 shrubs on the plot + // This way we get a conservative estimation + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+TREE_COUNT+"=30 WHERE " + MANY_TREES + "='1'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + TREES_PER_EXP_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+TREES_PER_EXP_FACTOR+"="+EXPANSION_FACTOR+"*2*" + TREE_COUNT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + } + } + + private boolean addAreasPerAttribute() { + + final File areasPerAttribute = new File( localPropertiesService.getProjectFolder() + File.separatorChar + ATTRIBUTE_AREAS_CSV); + String schemaName = getSchemaPrefix(); + + if (areasPerAttribute.exists()) { + + try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(areasPerAttribute.getAbsolutePath(), false) ){ + // The header (first line) should contain the names of the three columns : attribute_name,area + + String[] columnNames = csvReader.readNext(); + + + ArrayList attributeNames = new ArrayList(); + + if(columnNames.length < 2 ){ + throw new RuntimeException("The " + areasPerAttribute.getAbsolutePath() + " file needs have this format : attribute_name1,attribute_name2,...attribute_nameN,"+AREA_CSV_COLUMN+"./nAt least one attribute is necessary. This would be the attribute or attributes (their name in the survey definition) that would relate the plot with its expansion factor"); + } + + // The weight column has been removed in the latest versions of the areas per attribute csv + // Lets add it again for backward compatibility + boolean weightColumnPresent = columnNames[columnNames.length -1].equalsIgnoreCase(WEIGHT_CSV_COLUMN); + if( ! weightColumnPresent ) { + // We need to create anew array with an extra item + String[] longer = new String[columnNames.length + 1]; + for (int i = 0; i < columnNames.length; i++) + longer[i] = columnNames[i]; + longer[columnNames.length] = WEIGHT_CSV_COLUMN; // add the + columnNames = longer; + } + + for( int colPosition = 0; colPosition batchArgs = new ArrayList<>(); + int line = 1; + String[] csvLine = null; + while( ( csvLine = csvReader.readNext() ) != null ){ + try{ + float areaHectares = Float.parseFloat( csvLine[ columnNames.length-2 ] ); + final Float plotWeight = weightColumnPresent ? Float.parseFloat( csvLine[columnNames.length -1] ) : 1; // if no weight column present we assume same weight for all plots + + List attributeValues = extractAttributeValues(csvLine, attributeNames); + + Integer plotCountPerAttributes = getJdbcTemplate().queryForObject(plotCountSelectQuery, Integer.class, attributeValues.toArray()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + // Calculate the expansion factor: simply the division of the area for the selected attributes by the amount of plots that match the attribute values + Float expansionFactorHectaresCalc = 0f; + if( plotCountPerAttributes.intValue() != 0 ){ + expansionFactorHectaresCalc = areaHectares / (float) plotCountPerAttributes.intValue(); + } + + // Add the expansion factor and plot_weight to the values that will be sent with the update + attributeValues.add(0, expansionFactorHectaresCalc); + attributeValues.add(1, plotWeight); + + batchArgs.add(attributeValues.toArray()); + }catch( Exception e5){ + logger.error("Problem in line number " + line + " with values " + Arrays.toString( csvLine ), e5 ); + }finally{ + line++; + } + } + getJdbcTemplate().batchUpdate(updatePlotQuery, batchArgs); + } catch (FileNotFoundException e) { + logger.error("File not found?", e); //$NON-NLS-1$ + } catch (Exception e) { + logger.error("Error reading the CSV file", e); //$NON-NLS-1$ + } + + return true; + }else{ + logger.warn("No CSV " + ATTRIBUTE_AREAS_CSV + " present, calculating areas will not be possible"); //$NON-NLS-1$ + return false; + } + + } + + private List extractAttributeValues(String[] csvLine, List attributeNames) { + List values = new ArrayList<>(attributeNames.size()); + for(int colIndex = 0; colIndex < attributeNames.size(); colIndex++) { + String stringValue = csvLine[colIndex]; + String attributeName = attributeNames.get(colIndex); + Object value = getTypedValue(attributeName, stringValue); + values.add(value); + } + return values; + } + + private Object getTypedValue(String attributeName, String stringValue) { + EntityDefinition rootEntityDef = earthSurveyService.getRootEntityDefinition(); + NodeDefinition attributeDef = rootEntityDef.getChildDefinition(attributeName); + if (attributeDef instanceof BooleanAttributeDefinition) { + return Boolean.TRUE.toString().equalsIgnoreCase(stringValue) || "1".equals(stringValue); + } else { + return stringValue; + } + } + + private boolean isAttributeInPlotEntity(String attributeName) { + EntityDefinition rootEntityDefinition = earthSurveyService.getRootEntityDefinition(); + try { + rootEntityDefinition.getChildDefinition(attributeName); + } catch (Exception e) { + // The attribute does not exist under the plot entity + return false; + } + return true; + } + + public ExportType getExportType() { + return exportType; + } + + public void setExportType(ExportType exportType) { + this.exportType = exportType; + } + + private JdbcTemplate getJdbcTemplate() { + return jdbcTemplate; + } + + private void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + +} From fd5db3be375a657355cee94cd07c3171b1a7f5a3 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:28 +0100 Subject: [PATCH 1155/1620] New translations RegionCalculationUtils.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 385 +++++++++++++++++- 1 file changed, 376 insertions(+), 9 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 7ea79d00ff..905f384f1e 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,9 +1,376 @@ -package org.openforis.collect.earth.app.service; - -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; - -public interface RDBPostProcessor { - - void processRDBData(InfiniteProgressMonitor progressListener); - -} +package org.openforis.collect.earth.app.service; + +import java.io.File; +import java.io.FileNotFoundException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Locale; + +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.idm.metamodel.BooleanAttributeDefinition; +import org.openforis.idm.metamodel.EntityDefinition; +import org.openforis.idm.metamodel.NodeDefinition; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Component; + +import com.opencsv.CSVReader; + +@Component +public class RegionCalculationUtils{ + + private static final String AREA_CSV_COLUMN = "area"; + private static final String WEIGHT_CSV_COLUMN = "weight"; + private static final String PLOT_SET = "plot SET "; + private static final String UPDATE = "UPDATE "; + private static final String PLOT_ADD = "plot ADD "; + private static final String FLOAT = " FLOAT"; + private static final String ALTER_TABLE = "ALTER TABLE "; + private static final String ALTER_TABLE2 = ALTER_TABLE; + private static final String SHRUB_COUNT = "shrub_count"; + private static final String TREE_COUNT = "tree_count"; + private static final String REGION_AREAS_CSV = "region_areas.csv"; //$NON-NLS-1$ + private static final String ATTRIBUTE_AREAS_CSV = "areas_per_attribute.csv"; //$NON-NLS-1$ + private static final String PLOT_WEIGHT = "plot_weight"; //$NON-NLS-1$ + private static final String TREES_PER_EXP_FACTOR = "trees_per_expansion_factor"; //$NON-NLS-1$ + private static final String SHRUBS_PER_EXP_FACTOR = "shrubs_per_expansion_factor"; //$NON-NLS-1$ + private static final String NO_DATA_LAND_USE = "noData"; //$NON-NLS-1$ + private static final String MANY_TREES = "many_trees"; + private static final String MANY_SHRUBS = "many_shrubs"; + + public static final String EXPANSION_FACTOR = "expansion_factor"; //$NON-NLS-1$ + private final Logger logger = LoggerFactory.getLogger(RegionCalculationUtils.class); + + @Autowired + EarthSurveyService earthSurveyService; + + @Autowired + LocalPropertiesService localPropertiesService; + + @Autowired + private SchemaService schemaService; + + private JdbcTemplate jdbcTemplate; + + private ExportType exportType; + + public void handleRegionCalculation(ExportType exportType, JdbcTemplate jdbcTemplate){ + + try { + setExportType(exportType); + setJdbcTemplate(jdbcTemplate); + createWeightFactors(); + + // If the region_areas.csv is not present then try to add the areas "per attribute" using the file areas_per_attribute.csv + boolean areasAdded = false; + if(!addAreasPerRegion()){ + if( addAreasPerAttribute() ){ + areasAdded = true; + } + }else{ + areasAdded = true; + } + + if( areasAdded ){ + handleNumberOfTrees(); + handleNumberOfShrubs(); + recalculatePlotWeights(); + } + + } catch (Exception e) { + logger.error( "Error when calculating the expansion factors for the plots ", e); + } + } + + private void recalculatePlotWeights() { + String schemaName = getSchemaPrefix(); + String selectMinExpansionFactorSql = String.format("SELECT MIN(%s) FROM %splot", EXPANSION_FACTOR, schemaName); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + Double minExpansionFactor = getJdbcTemplate().queryForObject(selectMinExpansionFactorSql, Double.class); + //set plot_weight = expansion_factor / minExpansionFactor + String updatePlotWeightSql = String.format(Locale.US, "UPDATE %splot SET %s=%s/%.5f", schemaName, PLOT_WEIGHT, EXPANSION_FACTOR, minExpansionFactor); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + getJdbcTemplate().update(updatePlotWeightSql); + } + + private String getSchemaPrefix() { + return schemaService.getSchemaPrefix( getExportType() ); + } + + private void createWeightFactors(){ + final String schemaName = getSchemaPrefix(); + getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + EXPANSION_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + PLOT_WEIGHT + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + + /** + * This is the "old way"of assigning an expansion factor (the area in hectares that a plot represents) to a plot based on the information form the "region_areas.csv" file. + * @return True if there was a region_areas.csv file, false if not present so that areas were not assigned. + */ + private boolean addAreasPerRegion() { + + final File regionAreas = new File( localPropertiesService.getProjectFolder() + File.separatorChar + REGION_AREAS_CSV); + String schemaName = getSchemaPrefix(); + + if (regionAreas.exists()) { + + try( CSVReader csvReader = CsvReaderUtils.getCsvReader(regionAreas.getAbsolutePath()) ) { + + String[] csvLine = null; + + while( ( csvLine = csvReader.readNext() ) != null ){ + try { + String region = csvLine[0]; + String plotFile = csvLine[1]; + int areaHectares = Integer.parseInt( csvLine[2] ); + final Float plotWeight = 1f; // The plot weight will always be calculated in a later step + + Object[] parameters = new String[]{region,plotFile}; + + Integer plotsInRegion = getJdbcTemplate().queryForObject( + "SELECT count( DISTINCT "+EarthConstants.PLOT_ID+") FROM " + schemaName + "plot WHERE ( region=? OR plot_file=? ) AND land_use_category != '"+NO_DATA_LAND_USE+"' ", + Integer.class, + parameters); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + Float expansionFactorHectaresCalc = 0f; + if( plotsInRegion.intValue() != 0 ){ + expansionFactorHectaresCalc = (float)areaHectares / (float) plotsInRegion.intValue(); + } + + final Object[] updateValues = new Object[4]; + updateValues[0] = expansionFactorHectaresCalc; + updateValues[1] = plotWeight; + updateValues[2] = region; + updateValues[3] = plotFile; + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+EXPANSION_FACTOR+"=?, "+PLOT_WEIGHT+"=? WHERE region=? OR plot_file=?", updateValues); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + } catch (NumberFormatException e) { + logger.error("Possibly the header", e); //$NON-NLS-1$ + } + + } + + // FINALLY ASSIGN A WEIGHT OF CERO AND AN EXPANSION FACTOR OF 0 FOR THE PLOTS WITH NO_DATA + + final Object[] updateNoDataValues = new Object[3]; + updateNoDataValues[0] = 0; + updateNoDataValues[1] = 0; + updateNoDataValues[2] = NO_DATA_LAND_USE; + + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+EXPANSION_FACTOR+"=?, "+PLOT_WEIGHT+"=? WHERE land_use_category=?", updateNoDataValues); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + + } catch (FileNotFoundException e) { + logger.error("File not found?", e); //$NON-NLS-1$ + } catch (Exception e) { + logger.error("Error reading the CSV file", e); //$NON-NLS-1$ + } + + return true; + }else{ + logger.warn("No CSV " + REGION_AREAS_CSV + " present, calculating areas will not be possible"); //$NON-NLS-1$ + return false; + } + + } + + + private void handleNumberOfShrubs() { + String schemaName = getSchemaPrefix(); + // This is specific to the Global Forest Survey - Drylands monitoring assessment + if( + AnalysisSaikuService.surveyContains(SHRUB_COUNT, earthSurveyService.getCollectSurvey() ) + && + AnalysisSaikuService.surveyContains(MANY_SHRUBS, earthSurveyService.getCollectSurvey() ) + ){ + // First set the number of shrubs to 30 if the user assessed that there were more than 30 shrubs on the plot + // This way we get a conservative estimation + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+SHRUB_COUNT+"=30 WHERE " + MANY_SHRUBS + "='1'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + SHRUBS_PER_EXP_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+SHRUBS_PER_EXP_FACTOR+"="+EXPANSION_FACTOR+"*2*" + SHRUB_COUNT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + } + } + + private void handleNumberOfTrees() { + String schemaName = getSchemaPrefix(); + // This is specific to the Global Forest Survey - Drylands monitoring assessment + if( + AnalysisSaikuService.surveyContains(TREE_COUNT, earthSurveyService.getCollectSurvey() ) + && + AnalysisSaikuService.surveyContains(MANY_TREES, earthSurveyService.getCollectSurvey() ) + ){ + // First set the number of shrubs to 30 if the user assessed that there were more than 30 shrubs on the plot + // This way we get a conservative estimation + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+TREE_COUNT+"=30 WHERE " + MANY_TREES + "='1'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + TREES_PER_EXP_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+TREES_PER_EXP_FACTOR+"="+EXPANSION_FACTOR+"*2*" + TREE_COUNT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + } + } + + private boolean addAreasPerAttribute() { + + final File areasPerAttribute = new File( localPropertiesService.getProjectFolder() + File.separatorChar + ATTRIBUTE_AREAS_CSV); + String schemaName = getSchemaPrefix(); + + if (areasPerAttribute.exists()) { + + try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(areasPerAttribute.getAbsolutePath(), false) ){ + // The header (first line) should contain the names of the three columns : attribute_name,area + + String[] columnNames = csvReader.readNext(); + + + ArrayList attributeNames = new ArrayList(); + + if(columnNames.length < 2 ){ + throw new RuntimeException("The " + areasPerAttribute.getAbsolutePath() + " file needs have this format : attribute_name1,attribute_name2,...attribute_nameN,"+AREA_CSV_COLUMN+"./nAt least one attribute is necessary. This would be the attribute or attributes (their name in the survey definition) that would relate the plot with its expansion factor"); + } + + // The weight column has been removed in the latest versions of the areas per attribute csv + // Lets add it again for backward compatibility + boolean weightColumnPresent = columnNames[columnNames.length -1].equalsIgnoreCase(WEIGHT_CSV_COLUMN); + if( ! weightColumnPresent ) { + // We need to create anew array with an extra item + String[] longer = new String[columnNames.length + 1]; + for (int i = 0; i < columnNames.length; i++) + longer[i] = columnNames[i]; + longer[columnNames.length] = WEIGHT_CSV_COLUMN; // add the + columnNames = longer; + } + + for( int colPosition = 0; colPosition batchArgs = new ArrayList<>(); + int line = 1; + String[] csvLine = null; + while( ( csvLine = csvReader.readNext() ) != null ){ + try{ + float areaHectares = Float.parseFloat( csvLine[ columnNames.length-2 ] ); + final Float plotWeight = weightColumnPresent ? Float.parseFloat( csvLine[columnNames.length -1] ) : 1; // if no weight column present we assume same weight for all plots + + List attributeValues = extractAttributeValues(csvLine, attributeNames); + + Integer plotCountPerAttributes = getJdbcTemplate().queryForObject(plotCountSelectQuery, Integer.class, attributeValues.toArray()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + // Calculate the expansion factor: simply the division of the area for the selected attributes by the amount of plots that match the attribute values + Float expansionFactorHectaresCalc = 0f; + if( plotCountPerAttributes.intValue() != 0 ){ + expansionFactorHectaresCalc = areaHectares / (float) plotCountPerAttributes.intValue(); + } + + // Add the expansion factor and plot_weight to the values that will be sent with the update + attributeValues.add(0, expansionFactorHectaresCalc); + attributeValues.add(1, plotWeight); + + batchArgs.add(attributeValues.toArray()); + }catch( Exception e5){ + logger.error("Problem in line number " + line + " with values " + Arrays.toString( csvLine ), e5 ); + }finally{ + line++; + } + } + getJdbcTemplate().batchUpdate(updatePlotQuery, batchArgs); + } catch (FileNotFoundException e) { + logger.error("File not found?", e); //$NON-NLS-1$ + } catch (Exception e) { + logger.error("Error reading the CSV file", e); //$NON-NLS-1$ + } + + return true; + }else{ + logger.warn("No CSV " + ATTRIBUTE_AREAS_CSV + " present, calculating areas will not be possible"); //$NON-NLS-1$ + return false; + } + + } + + private List extractAttributeValues(String[] csvLine, List attributeNames) { + List values = new ArrayList<>(attributeNames.size()); + for(int colIndex = 0; colIndex < attributeNames.size(); colIndex++) { + String stringValue = csvLine[colIndex]; + String attributeName = attributeNames.get(colIndex); + Object value = getTypedValue(attributeName, stringValue); + values.add(value); + } + return values; + } + + private Object getTypedValue(String attributeName, String stringValue) { + EntityDefinition rootEntityDef = earthSurveyService.getRootEntityDefinition(); + NodeDefinition attributeDef = rootEntityDef.getChildDefinition(attributeName); + if (attributeDef instanceof BooleanAttributeDefinition) { + return Boolean.TRUE.toString().equalsIgnoreCase(stringValue) || "1".equals(stringValue); + } else { + return stringValue; + } + } + + private boolean isAttributeInPlotEntity(String attributeName) { + EntityDefinition rootEntityDefinition = earthSurveyService.getRootEntityDefinition(); + try { + rootEntityDefinition.getChildDefinition(attributeName); + } catch (Exception e) { + // The attribute does not exist under the plot entity + return false; + } + return true; + } + + public ExportType getExportType() { + return exportType; + } + + public void setExportType(ExportType exportType) { + this.exportType = exportType; + } + + private JdbcTemplate getJdbcTemplate() { + return jdbcTemplate; + } + + private void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + +} From 746d2b16949a2ef42efbd94f202991a2b3a90149 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:29 +0100 Subject: [PATCH 1156/1620] New translations RegionCalculationUtils.java (English) --- .../earth/app/view/Messages_en.properties | 385 +++++++++++++++++- 1 file changed, 376 insertions(+), 9 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 7ea79d00ff..905f384f1e 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,9 +1,376 @@ -package org.openforis.collect.earth.app.service; - -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; - -public interface RDBPostProcessor { - - void processRDBData(InfiniteProgressMonitor progressListener); - -} +package org.openforis.collect.earth.app.service; + +import java.io.File; +import java.io.FileNotFoundException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Locale; + +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.idm.metamodel.BooleanAttributeDefinition; +import org.openforis.idm.metamodel.EntityDefinition; +import org.openforis.idm.metamodel.NodeDefinition; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Component; + +import com.opencsv.CSVReader; + +@Component +public class RegionCalculationUtils{ + + private static final String AREA_CSV_COLUMN = "area"; + private static final String WEIGHT_CSV_COLUMN = "weight"; + private static final String PLOT_SET = "plot SET "; + private static final String UPDATE = "UPDATE "; + private static final String PLOT_ADD = "plot ADD "; + private static final String FLOAT = " FLOAT"; + private static final String ALTER_TABLE = "ALTER TABLE "; + private static final String ALTER_TABLE2 = ALTER_TABLE; + private static final String SHRUB_COUNT = "shrub_count"; + private static final String TREE_COUNT = "tree_count"; + private static final String REGION_AREAS_CSV = "region_areas.csv"; //$NON-NLS-1$ + private static final String ATTRIBUTE_AREAS_CSV = "areas_per_attribute.csv"; //$NON-NLS-1$ + private static final String PLOT_WEIGHT = "plot_weight"; //$NON-NLS-1$ + private static final String TREES_PER_EXP_FACTOR = "trees_per_expansion_factor"; //$NON-NLS-1$ + private static final String SHRUBS_PER_EXP_FACTOR = "shrubs_per_expansion_factor"; //$NON-NLS-1$ + private static final String NO_DATA_LAND_USE = "noData"; //$NON-NLS-1$ + private static final String MANY_TREES = "many_trees"; + private static final String MANY_SHRUBS = "many_shrubs"; + + public static final String EXPANSION_FACTOR = "expansion_factor"; //$NON-NLS-1$ + private final Logger logger = LoggerFactory.getLogger(RegionCalculationUtils.class); + + @Autowired + EarthSurveyService earthSurveyService; + + @Autowired + LocalPropertiesService localPropertiesService; + + @Autowired + private SchemaService schemaService; + + private JdbcTemplate jdbcTemplate; + + private ExportType exportType; + + public void handleRegionCalculation(ExportType exportType, JdbcTemplate jdbcTemplate){ + + try { + setExportType(exportType); + setJdbcTemplate(jdbcTemplate); + createWeightFactors(); + + // If the region_areas.csv is not present then try to add the areas "per attribute" using the file areas_per_attribute.csv + boolean areasAdded = false; + if(!addAreasPerRegion()){ + if( addAreasPerAttribute() ){ + areasAdded = true; + } + }else{ + areasAdded = true; + } + + if( areasAdded ){ + handleNumberOfTrees(); + handleNumberOfShrubs(); + recalculatePlotWeights(); + } + + } catch (Exception e) { + logger.error( "Error when calculating the expansion factors for the plots ", e); + } + } + + private void recalculatePlotWeights() { + String schemaName = getSchemaPrefix(); + String selectMinExpansionFactorSql = String.format("SELECT MIN(%s) FROM %splot", EXPANSION_FACTOR, schemaName); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + Double minExpansionFactor = getJdbcTemplate().queryForObject(selectMinExpansionFactorSql, Double.class); + //set plot_weight = expansion_factor / minExpansionFactor + String updatePlotWeightSql = String.format(Locale.US, "UPDATE %splot SET %s=%s/%.5f", schemaName, PLOT_WEIGHT, EXPANSION_FACTOR, minExpansionFactor); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + getJdbcTemplate().update(updatePlotWeightSql); + } + + private String getSchemaPrefix() { + return schemaService.getSchemaPrefix( getExportType() ); + } + + private void createWeightFactors(){ + final String schemaName = getSchemaPrefix(); + getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + EXPANSION_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + PLOT_WEIGHT + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + + /** + * This is the "old way"of assigning an expansion factor (the area in hectares that a plot represents) to a plot based on the information form the "region_areas.csv" file. + * @return True if there was a region_areas.csv file, false if not present so that areas were not assigned. + */ + private boolean addAreasPerRegion() { + + final File regionAreas = new File( localPropertiesService.getProjectFolder() + File.separatorChar + REGION_AREAS_CSV); + String schemaName = getSchemaPrefix(); + + if (regionAreas.exists()) { + + try( CSVReader csvReader = CsvReaderUtils.getCsvReader(regionAreas.getAbsolutePath()) ) { + + String[] csvLine = null; + + while( ( csvLine = csvReader.readNext() ) != null ){ + try { + String region = csvLine[0]; + String plotFile = csvLine[1]; + int areaHectares = Integer.parseInt( csvLine[2] ); + final Float plotWeight = 1f; // The plot weight will always be calculated in a later step + + Object[] parameters = new String[]{region,plotFile}; + + Integer plotsInRegion = getJdbcTemplate().queryForObject( + "SELECT count( DISTINCT "+EarthConstants.PLOT_ID+") FROM " + schemaName + "plot WHERE ( region=? OR plot_file=? ) AND land_use_category != '"+NO_DATA_LAND_USE+"' ", + Integer.class, + parameters); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + Float expansionFactorHectaresCalc = 0f; + if( plotsInRegion.intValue() != 0 ){ + expansionFactorHectaresCalc = (float)areaHectares / (float) plotsInRegion.intValue(); + } + + final Object[] updateValues = new Object[4]; + updateValues[0] = expansionFactorHectaresCalc; + updateValues[1] = plotWeight; + updateValues[2] = region; + updateValues[3] = plotFile; + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+EXPANSION_FACTOR+"=?, "+PLOT_WEIGHT+"=? WHERE region=? OR plot_file=?", updateValues); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + } catch (NumberFormatException e) { + logger.error("Possibly the header", e); //$NON-NLS-1$ + } + + } + + // FINALLY ASSIGN A WEIGHT OF CERO AND AN EXPANSION FACTOR OF 0 FOR THE PLOTS WITH NO_DATA + + final Object[] updateNoDataValues = new Object[3]; + updateNoDataValues[0] = 0; + updateNoDataValues[1] = 0; + updateNoDataValues[2] = NO_DATA_LAND_USE; + + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+EXPANSION_FACTOR+"=?, "+PLOT_WEIGHT+"=? WHERE land_use_category=?", updateNoDataValues); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + + } catch (FileNotFoundException e) { + logger.error("File not found?", e); //$NON-NLS-1$ + } catch (Exception e) { + logger.error("Error reading the CSV file", e); //$NON-NLS-1$ + } + + return true; + }else{ + logger.warn("No CSV " + REGION_AREAS_CSV + " present, calculating areas will not be possible"); //$NON-NLS-1$ + return false; + } + + } + + + private void handleNumberOfShrubs() { + String schemaName = getSchemaPrefix(); + // This is specific to the Global Forest Survey - Drylands monitoring assessment + if( + AnalysisSaikuService.surveyContains(SHRUB_COUNT, earthSurveyService.getCollectSurvey() ) + && + AnalysisSaikuService.surveyContains(MANY_SHRUBS, earthSurveyService.getCollectSurvey() ) + ){ + // First set the number of shrubs to 30 if the user assessed that there were more than 30 shrubs on the plot + // This way we get a conservative estimation + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+SHRUB_COUNT+"=30 WHERE " + MANY_SHRUBS + "='1'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + SHRUBS_PER_EXP_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+SHRUBS_PER_EXP_FACTOR+"="+EXPANSION_FACTOR+"*2*" + SHRUB_COUNT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + } + } + + private void handleNumberOfTrees() { + String schemaName = getSchemaPrefix(); + // This is specific to the Global Forest Survey - Drylands monitoring assessment + if( + AnalysisSaikuService.surveyContains(TREE_COUNT, earthSurveyService.getCollectSurvey() ) + && + AnalysisSaikuService.surveyContains(MANY_TREES, earthSurveyService.getCollectSurvey() ) + ){ + // First set the number of shrubs to 30 if the user assessed that there were more than 30 shrubs on the plot + // This way we get a conservative estimation + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+TREE_COUNT+"=30 WHERE " + MANY_TREES + "='1'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + TREES_PER_EXP_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+TREES_PER_EXP_FACTOR+"="+EXPANSION_FACTOR+"*2*" + TREE_COUNT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + } + } + + private boolean addAreasPerAttribute() { + + final File areasPerAttribute = new File( localPropertiesService.getProjectFolder() + File.separatorChar + ATTRIBUTE_AREAS_CSV); + String schemaName = getSchemaPrefix(); + + if (areasPerAttribute.exists()) { + + try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(areasPerAttribute.getAbsolutePath(), false) ){ + // The header (first line) should contain the names of the three columns : attribute_name,area + + String[] columnNames = csvReader.readNext(); + + + ArrayList attributeNames = new ArrayList(); + + if(columnNames.length < 2 ){ + throw new RuntimeException("The " + areasPerAttribute.getAbsolutePath() + " file needs have this format : attribute_name1,attribute_name2,...attribute_nameN,"+AREA_CSV_COLUMN+"./nAt least one attribute is necessary. This would be the attribute or attributes (their name in the survey definition) that would relate the plot with its expansion factor"); + } + + // The weight column has been removed in the latest versions of the areas per attribute csv + // Lets add it again for backward compatibility + boolean weightColumnPresent = columnNames[columnNames.length -1].equalsIgnoreCase(WEIGHT_CSV_COLUMN); + if( ! weightColumnPresent ) { + // We need to create anew array with an extra item + String[] longer = new String[columnNames.length + 1]; + for (int i = 0; i < columnNames.length; i++) + longer[i] = columnNames[i]; + longer[columnNames.length] = WEIGHT_CSV_COLUMN; // add the + columnNames = longer; + } + + for( int colPosition = 0; colPosition batchArgs = new ArrayList<>(); + int line = 1; + String[] csvLine = null; + while( ( csvLine = csvReader.readNext() ) != null ){ + try{ + float areaHectares = Float.parseFloat( csvLine[ columnNames.length-2 ] ); + final Float plotWeight = weightColumnPresent ? Float.parseFloat( csvLine[columnNames.length -1] ) : 1; // if no weight column present we assume same weight for all plots + + List attributeValues = extractAttributeValues(csvLine, attributeNames); + + Integer plotCountPerAttributes = getJdbcTemplate().queryForObject(plotCountSelectQuery, Integer.class, attributeValues.toArray()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + // Calculate the expansion factor: simply the division of the area for the selected attributes by the amount of plots that match the attribute values + Float expansionFactorHectaresCalc = 0f; + if( plotCountPerAttributes.intValue() != 0 ){ + expansionFactorHectaresCalc = areaHectares / (float) plotCountPerAttributes.intValue(); + } + + // Add the expansion factor and plot_weight to the values that will be sent with the update + attributeValues.add(0, expansionFactorHectaresCalc); + attributeValues.add(1, plotWeight); + + batchArgs.add(attributeValues.toArray()); + }catch( Exception e5){ + logger.error("Problem in line number " + line + " with values " + Arrays.toString( csvLine ), e5 ); + }finally{ + line++; + } + } + getJdbcTemplate().batchUpdate(updatePlotQuery, batchArgs); + } catch (FileNotFoundException e) { + logger.error("File not found?", e); //$NON-NLS-1$ + } catch (Exception e) { + logger.error("Error reading the CSV file", e); //$NON-NLS-1$ + } + + return true; + }else{ + logger.warn("No CSV " + ATTRIBUTE_AREAS_CSV + " present, calculating areas will not be possible"); //$NON-NLS-1$ + return false; + } + + } + + private List extractAttributeValues(String[] csvLine, List attributeNames) { + List values = new ArrayList<>(attributeNames.size()); + for(int colIndex = 0; colIndex < attributeNames.size(); colIndex++) { + String stringValue = csvLine[colIndex]; + String attributeName = attributeNames.get(colIndex); + Object value = getTypedValue(attributeName, stringValue); + values.add(value); + } + return values; + } + + private Object getTypedValue(String attributeName, String stringValue) { + EntityDefinition rootEntityDef = earthSurveyService.getRootEntityDefinition(); + NodeDefinition attributeDef = rootEntityDef.getChildDefinition(attributeName); + if (attributeDef instanceof BooleanAttributeDefinition) { + return Boolean.TRUE.toString().equalsIgnoreCase(stringValue) || "1".equals(stringValue); + } else { + return stringValue; + } + } + + private boolean isAttributeInPlotEntity(String attributeName) { + EntityDefinition rootEntityDefinition = earthSurveyService.getRootEntityDefinition(); + try { + rootEntityDefinition.getChildDefinition(attributeName); + } catch (Exception e) { + // The attribute does not exist under the plot entity + return false; + } + return true; + } + + public ExportType getExportType() { + return exportType; + } + + public void setExportType(ExportType exportType) { + this.exportType = exportType; + } + + private JdbcTemplate getJdbcTemplate() { + return jdbcTemplate; + } + + private void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + +} From 5ae435019450e6615cad69a23f4f96dc6d5e2c90 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:30 +0100 Subject: [PATCH 1157/1620] New translations SaikuExecutionException.java (French) --- .../earth/app/view/Messages_fr.properties | 373 +----------------- 1 file changed, 13 insertions(+), 360 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 905f384f1e..27a0bdef28 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,376 +1,29 @@ package org.openforis.collect.earth.app.service; -import java.io.File; -import java.io.FileNotFoundException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Locale; +import org.openforis.collect.earth.ipcc.RdbExportException; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.idm.metamodel.BooleanAttributeDefinition; -import org.openforis.idm.metamodel.EntityDefinition; -import org.openforis.idm.metamodel.NodeDefinition; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.stereotype.Component; - -import com.opencsv.CSVReader; - -@Component -public class RegionCalculationUtils{ - - private static final String AREA_CSV_COLUMN = "area"; - private static final String WEIGHT_CSV_COLUMN = "weight"; - private static final String PLOT_SET = "plot SET "; - private static final String UPDATE = "UPDATE "; - private static final String PLOT_ADD = "plot ADD "; - private static final String FLOAT = " FLOAT"; - private static final String ALTER_TABLE = "ALTER TABLE "; - private static final String ALTER_TABLE2 = ALTER_TABLE; - private static final String SHRUB_COUNT = "shrub_count"; - private static final String TREE_COUNT = "tree_count"; - private static final String REGION_AREAS_CSV = "region_areas.csv"; //$NON-NLS-1$ - private static final String ATTRIBUTE_AREAS_CSV = "areas_per_attribute.csv"; //$NON-NLS-1$ - private static final String PLOT_WEIGHT = "plot_weight"; //$NON-NLS-1$ - private static final String TREES_PER_EXP_FACTOR = "trees_per_expansion_factor"; //$NON-NLS-1$ - private static final String SHRUBS_PER_EXP_FACTOR = "shrubs_per_expansion_factor"; //$NON-NLS-1$ - private static final String NO_DATA_LAND_USE = "noData"; //$NON-NLS-1$ - private static final String MANY_TREES = "many_trees"; - private static final String MANY_SHRUBS = "many_shrubs"; - - public static final String EXPANSION_FACTOR = "expansion_factor"; //$NON-NLS-1$ - private final Logger logger = LoggerFactory.getLogger(RegionCalculationUtils.class); - - @Autowired - EarthSurveyService earthSurveyService; - - @Autowired - LocalPropertiesService localPropertiesService; - - @Autowired - private SchemaService schemaService; - - private JdbcTemplate jdbcTemplate; - - private ExportType exportType; - - public void handleRegionCalculation(ExportType exportType, JdbcTemplate jdbcTemplate){ - - try { - setExportType(exportType); - setJdbcTemplate(jdbcTemplate); - createWeightFactors(); - - // If the region_areas.csv is not present then try to add the areas "per attribute" using the file areas_per_attribute.csv - boolean areasAdded = false; - if(!addAreasPerRegion()){ - if( addAreasPerAttribute() ){ - areasAdded = true; - } - }else{ - areasAdded = true; - } - - if( areasAdded ){ - handleNumberOfTrees(); - handleNumberOfShrubs(); - recalculatePlotWeights(); - } - - } catch (Exception e) { - logger.error( "Error when calculating the expansion factors for the plots ", e); - } - } - - private void recalculatePlotWeights() { - String schemaName = getSchemaPrefix(); - String selectMinExpansionFactorSql = String.format("SELECT MIN(%s) FROM %splot", EXPANSION_FACTOR, schemaName); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - Double minExpansionFactor = getJdbcTemplate().queryForObject(selectMinExpansionFactorSql, Double.class); - //set plot_weight = expansion_factor / minExpansionFactor - String updatePlotWeightSql = String.format(Locale.US, "UPDATE %splot SET %s=%s/%.5f", schemaName, PLOT_WEIGHT, EXPANSION_FACTOR, minExpansionFactor); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - getJdbcTemplate().update(updatePlotWeightSql); - } - - private String getSchemaPrefix() { - return schemaService.getSchemaPrefix( getExportType() ); - } - - private void createWeightFactors(){ - final String schemaName = getSchemaPrefix(); - getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + EXPANSION_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + PLOT_WEIGHT + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } +public class SaikuExecutionException extends RdbExportException { /** - * This is the "old way"of assigning an expansion factor (the area in hectares that a plot represents) to a plot based on the information form the "region_areas.csv" file. - * @return True if there was a region_areas.csv file, false if not present so that areas were not assigned. + * */ - private boolean addAreasPerRegion() { - - final File regionAreas = new File( localPropertiesService.getProjectFolder() + File.separatorChar + REGION_AREAS_CSV); - String schemaName = getSchemaPrefix(); - - if (regionAreas.exists()) { - - try( CSVReader csvReader = CsvReaderUtils.getCsvReader(regionAreas.getAbsolutePath()) ) { - - String[] csvLine = null; - - while( ( csvLine = csvReader.readNext() ) != null ){ - try { - String region = csvLine[0]; - String plotFile = csvLine[1]; - int areaHectares = Integer.parseInt( csvLine[2] ); - final Float plotWeight = 1f; // The plot weight will always be calculated in a later step - - Object[] parameters = new String[]{region,plotFile}; - - Integer plotsInRegion = getJdbcTemplate().queryForObject( - "SELECT count( DISTINCT "+EarthConstants.PLOT_ID+") FROM " + schemaName + "plot WHERE ( region=? OR plot_file=? ) AND land_use_category != '"+NO_DATA_LAND_USE+"' ", - Integer.class, - parameters); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - - Float expansionFactorHectaresCalc = 0f; - if( plotsInRegion.intValue() != 0 ){ - expansionFactorHectaresCalc = (float)areaHectares / (float) plotsInRegion.intValue(); - } - - final Object[] updateValues = new Object[4]; - updateValues[0] = expansionFactorHectaresCalc; - updateValues[1] = plotWeight; - updateValues[2] = region; - updateValues[3] = plotFile; - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+EXPANSION_FACTOR+"=?, "+PLOT_WEIGHT+"=? WHERE region=? OR plot_file=?", updateValues); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - - } catch (NumberFormatException e) { - logger.error("Possibly the header", e); //$NON-NLS-1$ - } - - } - - // FINALLY ASSIGN A WEIGHT OF CERO AND AN EXPANSION FACTOR OF 0 FOR THE PLOTS WITH NO_DATA - - final Object[] updateNoDataValues = new Object[3]; - updateNoDataValues[0] = 0; - updateNoDataValues[1] = 0; - updateNoDataValues[2] = NO_DATA_LAND_USE; - - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+EXPANSION_FACTOR+"=?, "+PLOT_WEIGHT+"=? WHERE land_use_category=?", updateNoDataValues); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - - - } catch (FileNotFoundException e) { - logger.error("File not found?", e); //$NON-NLS-1$ - } catch (Exception e) { - logger.error("Error reading the CSV file", e); //$NON-NLS-1$ - } - - return true; - }else{ - logger.warn("No CSV " + REGION_AREAS_CSV + " present, calculating areas will not be possible"); //$NON-NLS-1$ - return false; - } - - } - - - private void handleNumberOfShrubs() { - String schemaName = getSchemaPrefix(); - // This is specific to the Global Forest Survey - Drylands monitoring assessment - if( - AnalysisSaikuService.surveyContains(SHRUB_COUNT, earthSurveyService.getCollectSurvey() ) - && - AnalysisSaikuService.surveyContains(MANY_SHRUBS, earthSurveyService.getCollectSurvey() ) - ){ - // First set the number of shrubs to 30 if the user assessed that there were more than 30 shrubs on the plot - // This way we get a conservative estimation - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+SHRUB_COUNT+"=30 WHERE " + MANY_SHRUBS + "='1'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + SHRUBS_PER_EXP_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+SHRUBS_PER_EXP_FACTOR+"="+EXPANSION_FACTOR+"*2*" + SHRUB_COUNT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - } - } - - private void handleNumberOfTrees() { - String schemaName = getSchemaPrefix(); - // This is specific to the Global Forest Survey - Drylands monitoring assessment - if( - AnalysisSaikuService.surveyContains(TREE_COUNT, earthSurveyService.getCollectSurvey() ) - && - AnalysisSaikuService.surveyContains(MANY_TREES, earthSurveyService.getCollectSurvey() ) - ){ - // First set the number of shrubs to 30 if the user assessed that there were more than 30 shrubs on the plot - // This way we get a conservative estimation - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+TREE_COUNT+"=30 WHERE " + MANY_TREES + "='1'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + TREES_PER_EXP_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+TREES_PER_EXP_FACTOR+"="+EXPANSION_FACTOR+"*2*" + TREE_COUNT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - } - } - - private boolean addAreasPerAttribute() { - - final File areasPerAttribute = new File( localPropertiesService.getProjectFolder() + File.separatorChar + ATTRIBUTE_AREAS_CSV); - String schemaName = getSchemaPrefix(); - - if (areasPerAttribute.exists()) { - - try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(areasPerAttribute.getAbsolutePath(), false) ){ - // The header (first line) should contain the names of the three columns : attribute_name,area - - String[] columnNames = csvReader.readNext(); - - - ArrayList attributeNames = new ArrayList(); - - if(columnNames.length < 2 ){ - throw new RuntimeException("The " + areasPerAttribute.getAbsolutePath() + " file needs have this format : attribute_name1,attribute_name2,...attribute_nameN,"+AREA_CSV_COLUMN+"./nAt least one attribute is necessary. This would be the attribute or attributes (their name in the survey definition) that would relate the plot with its expansion factor"); - } - - // The weight column has been removed in the latest versions of the areas per attribute csv - // Lets add it again for backward compatibility - boolean weightColumnPresent = columnNames[columnNames.length -1].equalsIgnoreCase(WEIGHT_CSV_COLUMN); - if( ! weightColumnPresent ) { - // We need to create anew array with an extra item - String[] longer = new String[columnNames.length + 1]; - for (int i = 0; i < columnNames.length; i++) - longer[i] = columnNames[i]; - longer[columnNames.length] = WEIGHT_CSV_COLUMN; // add the - columnNames = longer; - } - - for( int colPosition = 0; colPosition batchArgs = new ArrayList<>(); - int line = 1; - String[] csvLine = null; - while( ( csvLine = csvReader.readNext() ) != null ){ - try{ - float areaHectares = Float.parseFloat( csvLine[ columnNames.length-2 ] ); - final Float plotWeight = weightColumnPresent ? Float.parseFloat( csvLine[columnNames.length -1] ) : 1; // if no weight column present we assume same weight for all plots - - List attributeValues = extractAttributeValues(csvLine, attributeNames); - - Integer plotCountPerAttributes = getJdbcTemplate().queryForObject(plotCountSelectQuery, Integer.class, attributeValues.toArray()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - - // Calculate the expansion factor: simply the division of the area for the selected attributes by the amount of plots that match the attribute values - Float expansionFactorHectaresCalc = 0f; - if( plotCountPerAttributes.intValue() != 0 ){ - expansionFactorHectaresCalc = areaHectares / (float) plotCountPerAttributes.intValue(); - } - - // Add the expansion factor and plot_weight to the values that will be sent with the update - attributeValues.add(0, expansionFactorHectaresCalc); - attributeValues.add(1, plotWeight); - - batchArgs.add(attributeValues.toArray()); - }catch( Exception e5){ - logger.error("Problem in line number " + line + " with values " + Arrays.toString( csvLine ), e5 ); - }finally{ - line++; - } - } - getJdbcTemplate().batchUpdate(updatePlotQuery, batchArgs); - } catch (FileNotFoundException e) { - logger.error("File not found?", e); //$NON-NLS-1$ - } catch (Exception e) { - logger.error("Error reading the CSV file", e); //$NON-NLS-1$ - } - - return true; - }else{ - logger.warn("No CSV " + ATTRIBUTE_AREAS_CSV + " present, calculating areas will not be possible"); //$NON-NLS-1$ - return false; - } + private static final long serialVersionUID = 1L; + public SaikuExecutionException() { + super(); } - private List extractAttributeValues(String[] csvLine, List attributeNames) { - List values = new ArrayList<>(attributeNames.size()); - for(int colIndex = 0; colIndex < attributeNames.size(); colIndex++) { - String stringValue = csvLine[colIndex]; - String attributeName = attributeNames.get(colIndex); - Object value = getTypedValue(attributeName, stringValue); - values.add(value); - } - return values; + public SaikuExecutionException(String message, Throwable cause) { + super(message, cause); } - private Object getTypedValue(String attributeName, String stringValue) { - EntityDefinition rootEntityDef = earthSurveyService.getRootEntityDefinition(); - NodeDefinition attributeDef = rootEntityDef.getChildDefinition(attributeName); - if (attributeDef instanceof BooleanAttributeDefinition) { - return Boolean.TRUE.toString().equalsIgnoreCase(stringValue) || "1".equals(stringValue); - } else { - return stringValue; - } + public SaikuExecutionException(String message) { + super(message); } - private boolean isAttributeInPlotEntity(String attributeName) { - EntityDefinition rootEntityDefinition = earthSurveyService.getRootEntityDefinition(); - try { - rootEntityDefinition.getChildDefinition(attributeName); - } catch (Exception e) { - // The attribute does not exist under the plot entity - return false; - } - return true; + public SaikuExecutionException(Throwable cause) { + super(cause); } - - public ExportType getExportType() { - return exportType; - } - - public void setExportType(ExportType exportType) { - this.exportType = exportType; - } - - private JdbcTemplate getJdbcTemplate() { - return jdbcTemplate; - } - - private void setJdbcTemplate(JdbcTemplate jdbcTemplate) { - this.jdbcTemplate = jdbcTemplate; - } - + } From 74235b0a3561d8b63c2421a78ddc5cf883d0887f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:31 +0100 Subject: [PATCH 1158/1620] New translations SaikuExecutionException.java (Spanish) --- .../earth/app/view/Messages_es.properties | 373 +----------------- 1 file changed, 13 insertions(+), 360 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 905f384f1e..27a0bdef28 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,376 +1,29 @@ package org.openforis.collect.earth.app.service; -import java.io.File; -import java.io.FileNotFoundException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Locale; +import org.openforis.collect.earth.ipcc.RdbExportException; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.idm.metamodel.BooleanAttributeDefinition; -import org.openforis.idm.metamodel.EntityDefinition; -import org.openforis.idm.metamodel.NodeDefinition; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.stereotype.Component; - -import com.opencsv.CSVReader; - -@Component -public class RegionCalculationUtils{ - - private static final String AREA_CSV_COLUMN = "area"; - private static final String WEIGHT_CSV_COLUMN = "weight"; - private static final String PLOT_SET = "plot SET "; - private static final String UPDATE = "UPDATE "; - private static final String PLOT_ADD = "plot ADD "; - private static final String FLOAT = " FLOAT"; - private static final String ALTER_TABLE = "ALTER TABLE "; - private static final String ALTER_TABLE2 = ALTER_TABLE; - private static final String SHRUB_COUNT = "shrub_count"; - private static final String TREE_COUNT = "tree_count"; - private static final String REGION_AREAS_CSV = "region_areas.csv"; //$NON-NLS-1$ - private static final String ATTRIBUTE_AREAS_CSV = "areas_per_attribute.csv"; //$NON-NLS-1$ - private static final String PLOT_WEIGHT = "plot_weight"; //$NON-NLS-1$ - private static final String TREES_PER_EXP_FACTOR = "trees_per_expansion_factor"; //$NON-NLS-1$ - private static final String SHRUBS_PER_EXP_FACTOR = "shrubs_per_expansion_factor"; //$NON-NLS-1$ - private static final String NO_DATA_LAND_USE = "noData"; //$NON-NLS-1$ - private static final String MANY_TREES = "many_trees"; - private static final String MANY_SHRUBS = "many_shrubs"; - - public static final String EXPANSION_FACTOR = "expansion_factor"; //$NON-NLS-1$ - private final Logger logger = LoggerFactory.getLogger(RegionCalculationUtils.class); - - @Autowired - EarthSurveyService earthSurveyService; - - @Autowired - LocalPropertiesService localPropertiesService; - - @Autowired - private SchemaService schemaService; - - private JdbcTemplate jdbcTemplate; - - private ExportType exportType; - - public void handleRegionCalculation(ExportType exportType, JdbcTemplate jdbcTemplate){ - - try { - setExportType(exportType); - setJdbcTemplate(jdbcTemplate); - createWeightFactors(); - - // If the region_areas.csv is not present then try to add the areas "per attribute" using the file areas_per_attribute.csv - boolean areasAdded = false; - if(!addAreasPerRegion()){ - if( addAreasPerAttribute() ){ - areasAdded = true; - } - }else{ - areasAdded = true; - } - - if( areasAdded ){ - handleNumberOfTrees(); - handleNumberOfShrubs(); - recalculatePlotWeights(); - } - - } catch (Exception e) { - logger.error( "Error when calculating the expansion factors for the plots ", e); - } - } - - private void recalculatePlotWeights() { - String schemaName = getSchemaPrefix(); - String selectMinExpansionFactorSql = String.format("SELECT MIN(%s) FROM %splot", EXPANSION_FACTOR, schemaName); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - Double minExpansionFactor = getJdbcTemplate().queryForObject(selectMinExpansionFactorSql, Double.class); - //set plot_weight = expansion_factor / minExpansionFactor - String updatePlotWeightSql = String.format(Locale.US, "UPDATE %splot SET %s=%s/%.5f", schemaName, PLOT_WEIGHT, EXPANSION_FACTOR, minExpansionFactor); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - getJdbcTemplate().update(updatePlotWeightSql); - } - - private String getSchemaPrefix() { - return schemaService.getSchemaPrefix( getExportType() ); - } - - private void createWeightFactors(){ - final String schemaName = getSchemaPrefix(); - getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + EXPANSION_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + PLOT_WEIGHT + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } +public class SaikuExecutionException extends RdbExportException { /** - * This is the "old way"of assigning an expansion factor (the area in hectares that a plot represents) to a plot based on the information form the "region_areas.csv" file. - * @return True if there was a region_areas.csv file, false if not present so that areas were not assigned. + * */ - private boolean addAreasPerRegion() { - - final File regionAreas = new File( localPropertiesService.getProjectFolder() + File.separatorChar + REGION_AREAS_CSV); - String schemaName = getSchemaPrefix(); - - if (regionAreas.exists()) { - - try( CSVReader csvReader = CsvReaderUtils.getCsvReader(regionAreas.getAbsolutePath()) ) { - - String[] csvLine = null; - - while( ( csvLine = csvReader.readNext() ) != null ){ - try { - String region = csvLine[0]; - String plotFile = csvLine[1]; - int areaHectares = Integer.parseInt( csvLine[2] ); - final Float plotWeight = 1f; // The plot weight will always be calculated in a later step - - Object[] parameters = new String[]{region,plotFile}; - - Integer plotsInRegion = getJdbcTemplate().queryForObject( - "SELECT count( DISTINCT "+EarthConstants.PLOT_ID+") FROM " + schemaName + "plot WHERE ( region=? OR plot_file=? ) AND land_use_category != '"+NO_DATA_LAND_USE+"' ", - Integer.class, - parameters); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - - Float expansionFactorHectaresCalc = 0f; - if( plotsInRegion.intValue() != 0 ){ - expansionFactorHectaresCalc = (float)areaHectares / (float) plotsInRegion.intValue(); - } - - final Object[] updateValues = new Object[4]; - updateValues[0] = expansionFactorHectaresCalc; - updateValues[1] = plotWeight; - updateValues[2] = region; - updateValues[3] = plotFile; - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+EXPANSION_FACTOR+"=?, "+PLOT_WEIGHT+"=? WHERE region=? OR plot_file=?", updateValues); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - - } catch (NumberFormatException e) { - logger.error("Possibly the header", e); //$NON-NLS-1$ - } - - } - - // FINALLY ASSIGN A WEIGHT OF CERO AND AN EXPANSION FACTOR OF 0 FOR THE PLOTS WITH NO_DATA - - final Object[] updateNoDataValues = new Object[3]; - updateNoDataValues[0] = 0; - updateNoDataValues[1] = 0; - updateNoDataValues[2] = NO_DATA_LAND_USE; - - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+EXPANSION_FACTOR+"=?, "+PLOT_WEIGHT+"=? WHERE land_use_category=?", updateNoDataValues); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - - - } catch (FileNotFoundException e) { - logger.error("File not found?", e); //$NON-NLS-1$ - } catch (Exception e) { - logger.error("Error reading the CSV file", e); //$NON-NLS-1$ - } - - return true; - }else{ - logger.warn("No CSV " + REGION_AREAS_CSV + " present, calculating areas will not be possible"); //$NON-NLS-1$ - return false; - } - - } - - - private void handleNumberOfShrubs() { - String schemaName = getSchemaPrefix(); - // This is specific to the Global Forest Survey - Drylands monitoring assessment - if( - AnalysisSaikuService.surveyContains(SHRUB_COUNT, earthSurveyService.getCollectSurvey() ) - && - AnalysisSaikuService.surveyContains(MANY_SHRUBS, earthSurveyService.getCollectSurvey() ) - ){ - // First set the number of shrubs to 30 if the user assessed that there were more than 30 shrubs on the plot - // This way we get a conservative estimation - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+SHRUB_COUNT+"=30 WHERE " + MANY_SHRUBS + "='1'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + SHRUBS_PER_EXP_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+SHRUBS_PER_EXP_FACTOR+"="+EXPANSION_FACTOR+"*2*" + SHRUB_COUNT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - } - } - - private void handleNumberOfTrees() { - String schemaName = getSchemaPrefix(); - // This is specific to the Global Forest Survey - Drylands monitoring assessment - if( - AnalysisSaikuService.surveyContains(TREE_COUNT, earthSurveyService.getCollectSurvey() ) - && - AnalysisSaikuService.surveyContains(MANY_TREES, earthSurveyService.getCollectSurvey() ) - ){ - // First set the number of shrubs to 30 if the user assessed that there were more than 30 shrubs on the plot - // This way we get a conservative estimation - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+TREE_COUNT+"=30 WHERE " + MANY_TREES + "='1'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + TREES_PER_EXP_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+TREES_PER_EXP_FACTOR+"="+EXPANSION_FACTOR+"*2*" + TREE_COUNT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - } - } - - private boolean addAreasPerAttribute() { - - final File areasPerAttribute = new File( localPropertiesService.getProjectFolder() + File.separatorChar + ATTRIBUTE_AREAS_CSV); - String schemaName = getSchemaPrefix(); - - if (areasPerAttribute.exists()) { - - try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(areasPerAttribute.getAbsolutePath(), false) ){ - // The header (first line) should contain the names of the three columns : attribute_name,area - - String[] columnNames = csvReader.readNext(); - - - ArrayList attributeNames = new ArrayList(); - - if(columnNames.length < 2 ){ - throw new RuntimeException("The " + areasPerAttribute.getAbsolutePath() + " file needs have this format : attribute_name1,attribute_name2,...attribute_nameN,"+AREA_CSV_COLUMN+"./nAt least one attribute is necessary. This would be the attribute or attributes (their name in the survey definition) that would relate the plot with its expansion factor"); - } - - // The weight column has been removed in the latest versions of the areas per attribute csv - // Lets add it again for backward compatibility - boolean weightColumnPresent = columnNames[columnNames.length -1].equalsIgnoreCase(WEIGHT_CSV_COLUMN); - if( ! weightColumnPresent ) { - // We need to create anew array with an extra item - String[] longer = new String[columnNames.length + 1]; - for (int i = 0; i < columnNames.length; i++) - longer[i] = columnNames[i]; - longer[columnNames.length] = WEIGHT_CSV_COLUMN; // add the - columnNames = longer; - } - - for( int colPosition = 0; colPosition batchArgs = new ArrayList<>(); - int line = 1; - String[] csvLine = null; - while( ( csvLine = csvReader.readNext() ) != null ){ - try{ - float areaHectares = Float.parseFloat( csvLine[ columnNames.length-2 ] ); - final Float plotWeight = weightColumnPresent ? Float.parseFloat( csvLine[columnNames.length -1] ) : 1; // if no weight column present we assume same weight for all plots - - List attributeValues = extractAttributeValues(csvLine, attributeNames); - - Integer plotCountPerAttributes = getJdbcTemplate().queryForObject(plotCountSelectQuery, Integer.class, attributeValues.toArray()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - - // Calculate the expansion factor: simply the division of the area for the selected attributes by the amount of plots that match the attribute values - Float expansionFactorHectaresCalc = 0f; - if( plotCountPerAttributes.intValue() != 0 ){ - expansionFactorHectaresCalc = areaHectares / (float) plotCountPerAttributes.intValue(); - } - - // Add the expansion factor and plot_weight to the values that will be sent with the update - attributeValues.add(0, expansionFactorHectaresCalc); - attributeValues.add(1, plotWeight); - - batchArgs.add(attributeValues.toArray()); - }catch( Exception e5){ - logger.error("Problem in line number " + line + " with values " + Arrays.toString( csvLine ), e5 ); - }finally{ - line++; - } - } - getJdbcTemplate().batchUpdate(updatePlotQuery, batchArgs); - } catch (FileNotFoundException e) { - logger.error("File not found?", e); //$NON-NLS-1$ - } catch (Exception e) { - logger.error("Error reading the CSV file", e); //$NON-NLS-1$ - } - - return true; - }else{ - logger.warn("No CSV " + ATTRIBUTE_AREAS_CSV + " present, calculating areas will not be possible"); //$NON-NLS-1$ - return false; - } + private static final long serialVersionUID = 1L; + public SaikuExecutionException() { + super(); } - private List extractAttributeValues(String[] csvLine, List attributeNames) { - List values = new ArrayList<>(attributeNames.size()); - for(int colIndex = 0; colIndex < attributeNames.size(); colIndex++) { - String stringValue = csvLine[colIndex]; - String attributeName = attributeNames.get(colIndex); - Object value = getTypedValue(attributeName, stringValue); - values.add(value); - } - return values; + public SaikuExecutionException(String message, Throwable cause) { + super(message, cause); } - private Object getTypedValue(String attributeName, String stringValue) { - EntityDefinition rootEntityDef = earthSurveyService.getRootEntityDefinition(); - NodeDefinition attributeDef = rootEntityDef.getChildDefinition(attributeName); - if (attributeDef instanceof BooleanAttributeDefinition) { - return Boolean.TRUE.toString().equalsIgnoreCase(stringValue) || "1".equals(stringValue); - } else { - return stringValue; - } + public SaikuExecutionException(String message) { + super(message); } - private boolean isAttributeInPlotEntity(String attributeName) { - EntityDefinition rootEntityDefinition = earthSurveyService.getRootEntityDefinition(); - try { - rootEntityDefinition.getChildDefinition(attributeName); - } catch (Exception e) { - // The attribute does not exist under the plot entity - return false; - } - return true; + public SaikuExecutionException(Throwable cause) { + super(cause); } - - public ExportType getExportType() { - return exportType; - } - - public void setExportType(ExportType exportType) { - this.exportType = exportType; - } - - private JdbcTemplate getJdbcTemplate() { - return jdbcTemplate; - } - - private void setJdbcTemplate(JdbcTemplate jdbcTemplate) { - this.jdbcTemplate = jdbcTemplate; - } - + } From f868b38df321cfd036a74e69fc8f6e990672c09d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:32 +0100 Subject: [PATCH 1159/1620] New translations SaikuExecutionException.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 373 +----------------- 1 file changed, 13 insertions(+), 360 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 905f384f1e..27a0bdef28 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,376 +1,29 @@ package org.openforis.collect.earth.app.service; -import java.io.File; -import java.io.FileNotFoundException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Locale; +import org.openforis.collect.earth.ipcc.RdbExportException; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.idm.metamodel.BooleanAttributeDefinition; -import org.openforis.idm.metamodel.EntityDefinition; -import org.openforis.idm.metamodel.NodeDefinition; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.stereotype.Component; - -import com.opencsv.CSVReader; - -@Component -public class RegionCalculationUtils{ - - private static final String AREA_CSV_COLUMN = "area"; - private static final String WEIGHT_CSV_COLUMN = "weight"; - private static final String PLOT_SET = "plot SET "; - private static final String UPDATE = "UPDATE "; - private static final String PLOT_ADD = "plot ADD "; - private static final String FLOAT = " FLOAT"; - private static final String ALTER_TABLE = "ALTER TABLE "; - private static final String ALTER_TABLE2 = ALTER_TABLE; - private static final String SHRUB_COUNT = "shrub_count"; - private static final String TREE_COUNT = "tree_count"; - private static final String REGION_AREAS_CSV = "region_areas.csv"; //$NON-NLS-1$ - private static final String ATTRIBUTE_AREAS_CSV = "areas_per_attribute.csv"; //$NON-NLS-1$ - private static final String PLOT_WEIGHT = "plot_weight"; //$NON-NLS-1$ - private static final String TREES_PER_EXP_FACTOR = "trees_per_expansion_factor"; //$NON-NLS-1$ - private static final String SHRUBS_PER_EXP_FACTOR = "shrubs_per_expansion_factor"; //$NON-NLS-1$ - private static final String NO_DATA_LAND_USE = "noData"; //$NON-NLS-1$ - private static final String MANY_TREES = "many_trees"; - private static final String MANY_SHRUBS = "many_shrubs"; - - public static final String EXPANSION_FACTOR = "expansion_factor"; //$NON-NLS-1$ - private final Logger logger = LoggerFactory.getLogger(RegionCalculationUtils.class); - - @Autowired - EarthSurveyService earthSurveyService; - - @Autowired - LocalPropertiesService localPropertiesService; - - @Autowired - private SchemaService schemaService; - - private JdbcTemplate jdbcTemplate; - - private ExportType exportType; - - public void handleRegionCalculation(ExportType exportType, JdbcTemplate jdbcTemplate){ - - try { - setExportType(exportType); - setJdbcTemplate(jdbcTemplate); - createWeightFactors(); - - // If the region_areas.csv is not present then try to add the areas "per attribute" using the file areas_per_attribute.csv - boolean areasAdded = false; - if(!addAreasPerRegion()){ - if( addAreasPerAttribute() ){ - areasAdded = true; - } - }else{ - areasAdded = true; - } - - if( areasAdded ){ - handleNumberOfTrees(); - handleNumberOfShrubs(); - recalculatePlotWeights(); - } - - } catch (Exception e) { - logger.error( "Error when calculating the expansion factors for the plots ", e); - } - } - - private void recalculatePlotWeights() { - String schemaName = getSchemaPrefix(); - String selectMinExpansionFactorSql = String.format("SELECT MIN(%s) FROM %splot", EXPANSION_FACTOR, schemaName); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - Double minExpansionFactor = getJdbcTemplate().queryForObject(selectMinExpansionFactorSql, Double.class); - //set plot_weight = expansion_factor / minExpansionFactor - String updatePlotWeightSql = String.format(Locale.US, "UPDATE %splot SET %s=%s/%.5f", schemaName, PLOT_WEIGHT, EXPANSION_FACTOR, minExpansionFactor); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - getJdbcTemplate().update(updatePlotWeightSql); - } - - private String getSchemaPrefix() { - return schemaService.getSchemaPrefix( getExportType() ); - } - - private void createWeightFactors(){ - final String schemaName = getSchemaPrefix(); - getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + EXPANSION_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + PLOT_WEIGHT + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } +public class SaikuExecutionException extends RdbExportException { /** - * This is the "old way"of assigning an expansion factor (the area in hectares that a plot represents) to a plot based on the information form the "region_areas.csv" file. - * @return True if there was a region_areas.csv file, false if not present so that areas were not assigned. + * */ - private boolean addAreasPerRegion() { - - final File regionAreas = new File( localPropertiesService.getProjectFolder() + File.separatorChar + REGION_AREAS_CSV); - String schemaName = getSchemaPrefix(); - - if (regionAreas.exists()) { - - try( CSVReader csvReader = CsvReaderUtils.getCsvReader(regionAreas.getAbsolutePath()) ) { - - String[] csvLine = null; - - while( ( csvLine = csvReader.readNext() ) != null ){ - try { - String region = csvLine[0]; - String plotFile = csvLine[1]; - int areaHectares = Integer.parseInt( csvLine[2] ); - final Float plotWeight = 1f; // The plot weight will always be calculated in a later step - - Object[] parameters = new String[]{region,plotFile}; - - Integer plotsInRegion = getJdbcTemplate().queryForObject( - "SELECT count( DISTINCT "+EarthConstants.PLOT_ID+") FROM " + schemaName + "plot WHERE ( region=? OR plot_file=? ) AND land_use_category != '"+NO_DATA_LAND_USE+"' ", - Integer.class, - parameters); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - - Float expansionFactorHectaresCalc = 0f; - if( plotsInRegion.intValue() != 0 ){ - expansionFactorHectaresCalc = (float)areaHectares / (float) plotsInRegion.intValue(); - } - - final Object[] updateValues = new Object[4]; - updateValues[0] = expansionFactorHectaresCalc; - updateValues[1] = plotWeight; - updateValues[2] = region; - updateValues[3] = plotFile; - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+EXPANSION_FACTOR+"=?, "+PLOT_WEIGHT+"=? WHERE region=? OR plot_file=?", updateValues); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - - } catch (NumberFormatException e) { - logger.error("Possibly the header", e); //$NON-NLS-1$ - } - - } - - // FINALLY ASSIGN A WEIGHT OF CERO AND AN EXPANSION FACTOR OF 0 FOR THE PLOTS WITH NO_DATA - - final Object[] updateNoDataValues = new Object[3]; - updateNoDataValues[0] = 0; - updateNoDataValues[1] = 0; - updateNoDataValues[2] = NO_DATA_LAND_USE; - - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+EXPANSION_FACTOR+"=?, "+PLOT_WEIGHT+"=? WHERE land_use_category=?", updateNoDataValues); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - - - } catch (FileNotFoundException e) { - logger.error("File not found?", e); //$NON-NLS-1$ - } catch (Exception e) { - logger.error("Error reading the CSV file", e); //$NON-NLS-1$ - } - - return true; - }else{ - logger.warn("No CSV " + REGION_AREAS_CSV + " present, calculating areas will not be possible"); //$NON-NLS-1$ - return false; - } - - } - - - private void handleNumberOfShrubs() { - String schemaName = getSchemaPrefix(); - // This is specific to the Global Forest Survey - Drylands monitoring assessment - if( - AnalysisSaikuService.surveyContains(SHRUB_COUNT, earthSurveyService.getCollectSurvey() ) - && - AnalysisSaikuService.surveyContains(MANY_SHRUBS, earthSurveyService.getCollectSurvey() ) - ){ - // First set the number of shrubs to 30 if the user assessed that there were more than 30 shrubs on the plot - // This way we get a conservative estimation - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+SHRUB_COUNT+"=30 WHERE " + MANY_SHRUBS + "='1'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + SHRUBS_PER_EXP_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+SHRUBS_PER_EXP_FACTOR+"="+EXPANSION_FACTOR+"*2*" + SHRUB_COUNT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - } - } - - private void handleNumberOfTrees() { - String schemaName = getSchemaPrefix(); - // This is specific to the Global Forest Survey - Drylands monitoring assessment - if( - AnalysisSaikuService.surveyContains(TREE_COUNT, earthSurveyService.getCollectSurvey() ) - && - AnalysisSaikuService.surveyContains(MANY_TREES, earthSurveyService.getCollectSurvey() ) - ){ - // First set the number of shrubs to 30 if the user assessed that there were more than 30 shrubs on the plot - // This way we get a conservative estimation - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+TREE_COUNT+"=30 WHERE " + MANY_TREES + "='1'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + TREES_PER_EXP_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+TREES_PER_EXP_FACTOR+"="+EXPANSION_FACTOR+"*2*" + TREE_COUNT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - } - } - - private boolean addAreasPerAttribute() { - - final File areasPerAttribute = new File( localPropertiesService.getProjectFolder() + File.separatorChar + ATTRIBUTE_AREAS_CSV); - String schemaName = getSchemaPrefix(); - - if (areasPerAttribute.exists()) { - - try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(areasPerAttribute.getAbsolutePath(), false) ){ - // The header (first line) should contain the names of the three columns : attribute_name,area - - String[] columnNames = csvReader.readNext(); - - - ArrayList attributeNames = new ArrayList(); - - if(columnNames.length < 2 ){ - throw new RuntimeException("The " + areasPerAttribute.getAbsolutePath() + " file needs have this format : attribute_name1,attribute_name2,...attribute_nameN,"+AREA_CSV_COLUMN+"./nAt least one attribute is necessary. This would be the attribute or attributes (their name in the survey definition) that would relate the plot with its expansion factor"); - } - - // The weight column has been removed in the latest versions of the areas per attribute csv - // Lets add it again for backward compatibility - boolean weightColumnPresent = columnNames[columnNames.length -1].equalsIgnoreCase(WEIGHT_CSV_COLUMN); - if( ! weightColumnPresent ) { - // We need to create anew array with an extra item - String[] longer = new String[columnNames.length + 1]; - for (int i = 0; i < columnNames.length; i++) - longer[i] = columnNames[i]; - longer[columnNames.length] = WEIGHT_CSV_COLUMN; // add the - columnNames = longer; - } - - for( int colPosition = 0; colPosition batchArgs = new ArrayList<>(); - int line = 1; - String[] csvLine = null; - while( ( csvLine = csvReader.readNext() ) != null ){ - try{ - float areaHectares = Float.parseFloat( csvLine[ columnNames.length-2 ] ); - final Float plotWeight = weightColumnPresent ? Float.parseFloat( csvLine[columnNames.length -1] ) : 1; // if no weight column present we assume same weight for all plots - - List attributeValues = extractAttributeValues(csvLine, attributeNames); - - Integer plotCountPerAttributes = getJdbcTemplate().queryForObject(plotCountSelectQuery, Integer.class, attributeValues.toArray()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - - // Calculate the expansion factor: simply the division of the area for the selected attributes by the amount of plots that match the attribute values - Float expansionFactorHectaresCalc = 0f; - if( plotCountPerAttributes.intValue() != 0 ){ - expansionFactorHectaresCalc = areaHectares / (float) plotCountPerAttributes.intValue(); - } - - // Add the expansion factor and plot_weight to the values that will be sent with the update - attributeValues.add(0, expansionFactorHectaresCalc); - attributeValues.add(1, plotWeight); - - batchArgs.add(attributeValues.toArray()); - }catch( Exception e5){ - logger.error("Problem in line number " + line + " with values " + Arrays.toString( csvLine ), e5 ); - }finally{ - line++; - } - } - getJdbcTemplate().batchUpdate(updatePlotQuery, batchArgs); - } catch (FileNotFoundException e) { - logger.error("File not found?", e); //$NON-NLS-1$ - } catch (Exception e) { - logger.error("Error reading the CSV file", e); //$NON-NLS-1$ - } - - return true; - }else{ - logger.warn("No CSV " + ATTRIBUTE_AREAS_CSV + " present, calculating areas will not be possible"); //$NON-NLS-1$ - return false; - } + private static final long serialVersionUID = 1L; + public SaikuExecutionException() { + super(); } - private List extractAttributeValues(String[] csvLine, List attributeNames) { - List values = new ArrayList<>(attributeNames.size()); - for(int colIndex = 0; colIndex < attributeNames.size(); colIndex++) { - String stringValue = csvLine[colIndex]; - String attributeName = attributeNames.get(colIndex); - Object value = getTypedValue(attributeName, stringValue); - values.add(value); - } - return values; + public SaikuExecutionException(String message, Throwable cause) { + super(message, cause); } - private Object getTypedValue(String attributeName, String stringValue) { - EntityDefinition rootEntityDef = earthSurveyService.getRootEntityDefinition(); - NodeDefinition attributeDef = rootEntityDef.getChildDefinition(attributeName); - if (attributeDef instanceof BooleanAttributeDefinition) { - return Boolean.TRUE.toString().equalsIgnoreCase(stringValue) || "1".equals(stringValue); - } else { - return stringValue; - } + public SaikuExecutionException(String message) { + super(message); } - private boolean isAttributeInPlotEntity(String attributeName) { - EntityDefinition rootEntityDefinition = earthSurveyService.getRootEntityDefinition(); - try { - rootEntityDefinition.getChildDefinition(attributeName); - } catch (Exception e) { - // The attribute does not exist under the plot entity - return false; - } - return true; + public SaikuExecutionException(Throwable cause) { + super(cause); } - - public ExportType getExportType() { - return exportType; - } - - public void setExportType(ExportType exportType) { - this.exportType = exportType; - } - - private JdbcTemplate getJdbcTemplate() { - return jdbcTemplate; - } - - private void setJdbcTemplate(JdbcTemplate jdbcTemplate) { - this.jdbcTemplate = jdbcTemplate; - } - + } From 94222680330327c621ba4d86b460fadbeafcaa15 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:33 +0100 Subject: [PATCH 1160/1620] New translations SaikuExecutionException.java (English) --- .../earth/app/view/Messages_en.properties | 373 +----------------- 1 file changed, 13 insertions(+), 360 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 905f384f1e..27a0bdef28 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,376 +1,29 @@ package org.openforis.collect.earth.app.service; -import java.io.File; -import java.io.FileNotFoundException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Locale; +import org.openforis.collect.earth.ipcc.RdbExportException; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.idm.metamodel.BooleanAttributeDefinition; -import org.openforis.idm.metamodel.EntityDefinition; -import org.openforis.idm.metamodel.NodeDefinition; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.stereotype.Component; - -import com.opencsv.CSVReader; - -@Component -public class RegionCalculationUtils{ - - private static final String AREA_CSV_COLUMN = "area"; - private static final String WEIGHT_CSV_COLUMN = "weight"; - private static final String PLOT_SET = "plot SET "; - private static final String UPDATE = "UPDATE "; - private static final String PLOT_ADD = "plot ADD "; - private static final String FLOAT = " FLOAT"; - private static final String ALTER_TABLE = "ALTER TABLE "; - private static final String ALTER_TABLE2 = ALTER_TABLE; - private static final String SHRUB_COUNT = "shrub_count"; - private static final String TREE_COUNT = "tree_count"; - private static final String REGION_AREAS_CSV = "region_areas.csv"; //$NON-NLS-1$ - private static final String ATTRIBUTE_AREAS_CSV = "areas_per_attribute.csv"; //$NON-NLS-1$ - private static final String PLOT_WEIGHT = "plot_weight"; //$NON-NLS-1$ - private static final String TREES_PER_EXP_FACTOR = "trees_per_expansion_factor"; //$NON-NLS-1$ - private static final String SHRUBS_PER_EXP_FACTOR = "shrubs_per_expansion_factor"; //$NON-NLS-1$ - private static final String NO_DATA_LAND_USE = "noData"; //$NON-NLS-1$ - private static final String MANY_TREES = "many_trees"; - private static final String MANY_SHRUBS = "many_shrubs"; - - public static final String EXPANSION_FACTOR = "expansion_factor"; //$NON-NLS-1$ - private final Logger logger = LoggerFactory.getLogger(RegionCalculationUtils.class); - - @Autowired - EarthSurveyService earthSurveyService; - - @Autowired - LocalPropertiesService localPropertiesService; - - @Autowired - private SchemaService schemaService; - - private JdbcTemplate jdbcTemplate; - - private ExportType exportType; - - public void handleRegionCalculation(ExportType exportType, JdbcTemplate jdbcTemplate){ - - try { - setExportType(exportType); - setJdbcTemplate(jdbcTemplate); - createWeightFactors(); - - // If the region_areas.csv is not present then try to add the areas "per attribute" using the file areas_per_attribute.csv - boolean areasAdded = false; - if(!addAreasPerRegion()){ - if( addAreasPerAttribute() ){ - areasAdded = true; - } - }else{ - areasAdded = true; - } - - if( areasAdded ){ - handleNumberOfTrees(); - handleNumberOfShrubs(); - recalculatePlotWeights(); - } - - } catch (Exception e) { - logger.error( "Error when calculating the expansion factors for the plots ", e); - } - } - - private void recalculatePlotWeights() { - String schemaName = getSchemaPrefix(); - String selectMinExpansionFactorSql = String.format("SELECT MIN(%s) FROM %splot", EXPANSION_FACTOR, schemaName); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - Double minExpansionFactor = getJdbcTemplate().queryForObject(selectMinExpansionFactorSql, Double.class); - //set plot_weight = expansion_factor / minExpansionFactor - String updatePlotWeightSql = String.format(Locale.US, "UPDATE %splot SET %s=%s/%.5f", schemaName, PLOT_WEIGHT, EXPANSION_FACTOR, minExpansionFactor); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - getJdbcTemplate().update(updatePlotWeightSql); - } - - private String getSchemaPrefix() { - return schemaService.getSchemaPrefix( getExportType() ); - } - - private void createWeightFactors(){ - final String schemaName = getSchemaPrefix(); - getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + EXPANSION_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + PLOT_WEIGHT + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } +public class SaikuExecutionException extends RdbExportException { /** - * This is the "old way"of assigning an expansion factor (the area in hectares that a plot represents) to a plot based on the information form the "region_areas.csv" file. - * @return True if there was a region_areas.csv file, false if not present so that areas were not assigned. + * */ - private boolean addAreasPerRegion() { - - final File regionAreas = new File( localPropertiesService.getProjectFolder() + File.separatorChar + REGION_AREAS_CSV); - String schemaName = getSchemaPrefix(); - - if (regionAreas.exists()) { - - try( CSVReader csvReader = CsvReaderUtils.getCsvReader(regionAreas.getAbsolutePath()) ) { - - String[] csvLine = null; - - while( ( csvLine = csvReader.readNext() ) != null ){ - try { - String region = csvLine[0]; - String plotFile = csvLine[1]; - int areaHectares = Integer.parseInt( csvLine[2] ); - final Float plotWeight = 1f; // The plot weight will always be calculated in a later step - - Object[] parameters = new String[]{region,plotFile}; - - Integer plotsInRegion = getJdbcTemplate().queryForObject( - "SELECT count( DISTINCT "+EarthConstants.PLOT_ID+") FROM " + schemaName + "plot WHERE ( region=? OR plot_file=? ) AND land_use_category != '"+NO_DATA_LAND_USE+"' ", - Integer.class, - parameters); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - - Float expansionFactorHectaresCalc = 0f; - if( plotsInRegion.intValue() != 0 ){ - expansionFactorHectaresCalc = (float)areaHectares / (float) plotsInRegion.intValue(); - } - - final Object[] updateValues = new Object[4]; - updateValues[0] = expansionFactorHectaresCalc; - updateValues[1] = plotWeight; - updateValues[2] = region; - updateValues[3] = plotFile; - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+EXPANSION_FACTOR+"=?, "+PLOT_WEIGHT+"=? WHERE region=? OR plot_file=?", updateValues); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - - } catch (NumberFormatException e) { - logger.error("Possibly the header", e); //$NON-NLS-1$ - } - - } - - // FINALLY ASSIGN A WEIGHT OF CERO AND AN EXPANSION FACTOR OF 0 FOR THE PLOTS WITH NO_DATA - - final Object[] updateNoDataValues = new Object[3]; - updateNoDataValues[0] = 0; - updateNoDataValues[1] = 0; - updateNoDataValues[2] = NO_DATA_LAND_USE; - - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+EXPANSION_FACTOR+"=?, "+PLOT_WEIGHT+"=? WHERE land_use_category=?", updateNoDataValues); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - - - } catch (FileNotFoundException e) { - logger.error("File not found?", e); //$NON-NLS-1$ - } catch (Exception e) { - logger.error("Error reading the CSV file", e); //$NON-NLS-1$ - } - - return true; - }else{ - logger.warn("No CSV " + REGION_AREAS_CSV + " present, calculating areas will not be possible"); //$NON-NLS-1$ - return false; - } - - } - - - private void handleNumberOfShrubs() { - String schemaName = getSchemaPrefix(); - // This is specific to the Global Forest Survey - Drylands monitoring assessment - if( - AnalysisSaikuService.surveyContains(SHRUB_COUNT, earthSurveyService.getCollectSurvey() ) - && - AnalysisSaikuService.surveyContains(MANY_SHRUBS, earthSurveyService.getCollectSurvey() ) - ){ - // First set the number of shrubs to 30 if the user assessed that there were more than 30 shrubs on the plot - // This way we get a conservative estimation - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+SHRUB_COUNT+"=30 WHERE " + MANY_SHRUBS + "='1'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + SHRUBS_PER_EXP_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+SHRUBS_PER_EXP_FACTOR+"="+EXPANSION_FACTOR+"*2*" + SHRUB_COUNT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - } - } - - private void handleNumberOfTrees() { - String schemaName = getSchemaPrefix(); - // This is specific to the Global Forest Survey - Drylands monitoring assessment - if( - AnalysisSaikuService.surveyContains(TREE_COUNT, earthSurveyService.getCollectSurvey() ) - && - AnalysisSaikuService.surveyContains(MANY_TREES, earthSurveyService.getCollectSurvey() ) - ){ - // First set the number of shrubs to 30 if the user assessed that there were more than 30 shrubs on the plot - // This way we get a conservative estimation - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+TREE_COUNT+"=30 WHERE " + MANY_TREES + "='1'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - getJdbcTemplate().execute(ALTER_TABLE2 + schemaName + PLOT_ADD + TREES_PER_EXP_FACTOR + FLOAT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - getJdbcTemplate().update(UPDATE + schemaName + PLOT_SET+TREES_PER_EXP_FACTOR+"="+EXPANSION_FACTOR+"*2*" + TREE_COUNT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - } - } - - private boolean addAreasPerAttribute() { - - final File areasPerAttribute = new File( localPropertiesService.getProjectFolder() + File.separatorChar + ATTRIBUTE_AREAS_CSV); - String schemaName = getSchemaPrefix(); - - if (areasPerAttribute.exists()) { - - try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(areasPerAttribute.getAbsolutePath(), false) ){ - // The header (first line) should contain the names of the three columns : attribute_name,area - - String[] columnNames = csvReader.readNext(); - - - ArrayList attributeNames = new ArrayList(); - - if(columnNames.length < 2 ){ - throw new RuntimeException("The " + areasPerAttribute.getAbsolutePath() + " file needs have this format : attribute_name1,attribute_name2,...attribute_nameN,"+AREA_CSV_COLUMN+"./nAt least one attribute is necessary. This would be the attribute or attributes (their name in the survey definition) that would relate the plot with its expansion factor"); - } - - // The weight column has been removed in the latest versions of the areas per attribute csv - // Lets add it again for backward compatibility - boolean weightColumnPresent = columnNames[columnNames.length -1].equalsIgnoreCase(WEIGHT_CSV_COLUMN); - if( ! weightColumnPresent ) { - // We need to create anew array with an extra item - String[] longer = new String[columnNames.length + 1]; - for (int i = 0; i < columnNames.length; i++) - longer[i] = columnNames[i]; - longer[columnNames.length] = WEIGHT_CSV_COLUMN; // add the - columnNames = longer; - } - - for( int colPosition = 0; colPosition batchArgs = new ArrayList<>(); - int line = 1; - String[] csvLine = null; - while( ( csvLine = csvReader.readNext() ) != null ){ - try{ - float areaHectares = Float.parseFloat( csvLine[ columnNames.length-2 ] ); - final Float plotWeight = weightColumnPresent ? Float.parseFloat( csvLine[columnNames.length -1] ) : 1; // if no weight column present we assume same weight for all plots - - List attributeValues = extractAttributeValues(csvLine, attributeNames); - - Integer plotCountPerAttributes = getJdbcTemplate().queryForObject(plotCountSelectQuery, Integer.class, attributeValues.toArray()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - - // Calculate the expansion factor: simply the division of the area for the selected attributes by the amount of plots that match the attribute values - Float expansionFactorHectaresCalc = 0f; - if( plotCountPerAttributes.intValue() != 0 ){ - expansionFactorHectaresCalc = areaHectares / (float) plotCountPerAttributes.intValue(); - } - - // Add the expansion factor and plot_weight to the values that will be sent with the update - attributeValues.add(0, expansionFactorHectaresCalc); - attributeValues.add(1, plotWeight); - - batchArgs.add(attributeValues.toArray()); - }catch( Exception e5){ - logger.error("Problem in line number " + line + " with values " + Arrays.toString( csvLine ), e5 ); - }finally{ - line++; - } - } - getJdbcTemplate().batchUpdate(updatePlotQuery, batchArgs); - } catch (FileNotFoundException e) { - logger.error("File not found?", e); //$NON-NLS-1$ - } catch (Exception e) { - logger.error("Error reading the CSV file", e); //$NON-NLS-1$ - } - - return true; - }else{ - logger.warn("No CSV " + ATTRIBUTE_AREAS_CSV + " present, calculating areas will not be possible"); //$NON-NLS-1$ - return false; - } + private static final long serialVersionUID = 1L; + public SaikuExecutionException() { + super(); } - private List extractAttributeValues(String[] csvLine, List attributeNames) { - List values = new ArrayList<>(attributeNames.size()); - for(int colIndex = 0; colIndex < attributeNames.size(); colIndex++) { - String stringValue = csvLine[colIndex]; - String attributeName = attributeNames.get(colIndex); - Object value = getTypedValue(attributeName, stringValue); - values.add(value); - } - return values; + public SaikuExecutionException(String message, Throwable cause) { + super(message, cause); } - private Object getTypedValue(String attributeName, String stringValue) { - EntityDefinition rootEntityDef = earthSurveyService.getRootEntityDefinition(); - NodeDefinition attributeDef = rootEntityDef.getChildDefinition(attributeName); - if (attributeDef instanceof BooleanAttributeDefinition) { - return Boolean.TRUE.toString().equalsIgnoreCase(stringValue) || "1".equals(stringValue); - } else { - return stringValue; - } + public SaikuExecutionException(String message) { + super(message); } - private boolean isAttributeInPlotEntity(String attributeName) { - EntityDefinition rootEntityDefinition = earthSurveyService.getRootEntityDefinition(); - try { - rootEntityDefinition.getChildDefinition(attributeName); - } catch (Exception e) { - // The attribute does not exist under the plot entity - return false; - } - return true; + public SaikuExecutionException(Throwable cause) { + super(cause); } - - public ExportType getExportType() { - return exportType; - } - - public void setExportType(ExportType exportType) { - this.exportType = exportType; - } - - private JdbcTemplate getJdbcTemplate() { - return jdbcTemplate; - } - - private void setJdbcTemplate(JdbcTemplate jdbcTemplate) { - this.jdbcTemplate = jdbcTemplate; - } - + } From e361acaaf730cdb6dafef33b3be46aa94a9dfc63 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:34 +0100 Subject: [PATCH 1161/1620] New translations CollectEarthMenu.java (Spanish) --- .../earth/app/view/Messages_es.properties | 459 +++++++++++++++++- 1 file changed, 445 insertions(+), 14 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 27a0bdef28..4c34fd0a7f 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,29 +1,460 @@ -package org.openforis.collect.earth.app.service; +package org.openforis.collect.earth.app.view; -import org.openforis.collect.earth.ipcc.RdbExportException; +import java.awt.event.ActionListener; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; -public class SaikuExecutionException extends RdbExportException { +import javax.swing.ButtonGroup; +import javax.swing.JCheckBoxMenuItem; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JRadioButtonMenuItem; +import javax.swing.SwingUtilities; - /** - * - */ - private static final long serialVersionUID = 1L; +import org.apache.commons.lang3.SystemUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.LoggerContext; +import org.apache.logging.log4j.core.config.Configuration; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.EarthConstants.UI_LANGUAGE; +import org.openforis.collect.earth.app.logging.JSwingAppender; +import org.openforis.collect.earth.app.service.AnalysisSaikuService; +import org.openforis.collect.earth.app.service.BackupSqlLiteService; +import org.openforis.collect.earth.app.service.DataImportExportService; +import org.openforis.collect.earth.app.service.EarthProjectsService; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.FolderFinder; +import org.openforis.collect.earth.app.service.IPCCGeneratorService; +import org.openforis.collect.earth.app.service.KmlImportService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.MissingPlotService; +import org.openforis.collect.earth.app.view.ExportActionListener.RecordsToExport; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; - public SaikuExecutionException() { +@Component +public class CollectEarthMenu extends JMenuBar implements InitializingBean { + + @Autowired + private transient DataImportExportService dataImportExportService; + + @Autowired + private transient KmlImportService kmlImportService; + + @Autowired + private transient MissingPlotService missingPlotService; + + @Autowired + private transient AnalysisSaikuService analysisSaikuService; + + @Autowired + private transient IPCCGeneratorService ipccGeneratorService; + + @Autowired + private transient LocalPropertiesService localPropertiesService; + + @Autowired + private transient CollectEarthWindow collectEarthWindow; + + @Autowired + private transient EarthSurveyService earthSurveyService; + + @Autowired + private transient EarthProjectsService earthProjectsService; + + @Autowired + private transient BackupSqlLiteService backupSqlLiteService; + + @Autowired + private transient RemovePlotsFromDBDlg removePlotsFromDBDlg; + + @Autowired + private transient EarthProjectsService projectsService; + + private static final long serialVersionUID = -2457052260968029351L; + private final List serverMenuItems = new ArrayList<>(); + private JFrame frame; + private final transient org.slf4j.Logger logger = LoggerFactory.getLogger(CollectEarthMenu.class); + + public CollectEarthMenu() { + // Where the GUI is created: super(); } - public SaikuExecutionException(String message, Throwable cause) { - super(message, cause); + protected void init() { + setFrame(collectEarthWindow.getFrame()); + + // Build file menu in the menu bar. + this.add( getFileMenu() ); + + // Build tools menu in the menu bar. + this.add(getToolsMenu()); + + // Build help menu in the menu bar. + this.add(getHelpMenu()); + } + + @Override + public void afterPropertiesSet() throws Exception { + init(); + } + + @Override + public JMenu getHelpMenu() { + JMenu menuHelp = new JMenu(Messages.getString("CollectEarthWindow.16")); //$NON-NLS-1$ + JMenuItem menuItem; + File surveyGuide = earthSurveyService.getSurveyGuide(); + if( surveyGuide != null ) { + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.70")); //$NON-NLS-1$ + menuItem.addActionListener( (e) -> CollectEarthUtils.openFile( surveyGuide) ); + menuHelp.add(menuItem); + menuHelp.addSeparator(); + } + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.56")); //$NON-NLS-1$ + menuItem.addActionListener(new OpenAboutDialogListener(frame, Messages.getString("CollectEarthWindow.62"))); //$NON-NLS-1$ + menuHelp.add(menuItem); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.17")); //$NON-NLS-1$ + menuItem.addActionListener( + new OpenTextFileListener(frame, getDisclaimerFilePath(), Messages.getString("CollectEarthWindow.4")));//$NON-NLS-1$ + menuHelp.add(menuItem); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.50")); //$NON-NLS-1$ + menuItem.addActionListener( (e) -> CollectEarthUtils.openFile( new File("UserManual.pdf"))); + menuHelp.add(menuItem); + + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.64")); //$NON-NLS-1$ + menuItem.addActionListener(new OpenSupportForum()); + menuHelp.add(menuItem); + + menuHelp.addSeparator(); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.52")); //$NON-NLS-1$ + menuItem.addActionListener( + new OpenTextFileListener(frame, getLogFilePath(), Messages.getString("CollectEarthWindow.53"))); //$NON-NLS-1$ + menuHelp.add(menuItem); + + JCheckBoxMenuItem checkboxErrors = new JCheckBoxMenuItem("Show exception errors", localPropertiesService.isExceptionShown() ); //$NON-NLS-1$ + checkboxErrors.addActionListener( e -> { + // This sets/unsets the property that is checked when an exception is catch by the JSwingAppender log4j2 appender + + Boolean showException = checkboxErrors.isSelected(); + localPropertiesService.setExceptionShown( showException ); + + final LoggerContext ctx = (LoggerContext) LogManager.getContext(false); + final Configuration config = ctx.getConfiguration(); + + JSwingAppender jSwingAppender = config.getAppender("jswing-log"); + + jSwingAppender.setExceptionShown( showException ); + } + + ); + menuHelp.add(checkboxErrors); + + + menuHelp.addSeparator(); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.51")); //$NON-NLS-1$ + menuItem.addActionListener(new CheckForUpdatesListener()); + menuHelp.add(menuItem); + return menuHelp; + } + + private JMenu getToolsMenu() { + JMenu toolsMenu = new JMenu(Messages.getString("CollectEarthWindow.12")); //$NON-NLS-1$ + + addImportExportMenu(toolsMenu); + + JMenuItem menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.14")); //$NON-NLS-1$ + menuItem.addActionListener(getSaikuAnalysisActionListener()); + toolsMenu.add(menuItem); + + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.71")); //$NON-NLS-1$ + menuItem.addActionListener(getSaikuToolExportActionListener()); + menuItem.setEnabled(SystemUtils.IS_OS_WINDOWS ); // This option is only available in Windows!! + toolsMenu.add(menuItem); + +/* + toolsMenu.addSeparator(); + menuItem = new JMenuItem("Generate IPCC GHGi software LULUCF package"); //$NON-NLS-1$ + menuItem.addActionListener(getIPCCExportActionListener()); + toolsMenu.add(menuItem); + + + toolsMenu.addSeparator(); +*/ + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.54")); //$NON-NLS-1$ + menuItem.addActionListener(new ApplyOptionChangesListener(this.getFrame(), localPropertiesService) { + + @Override + protected void applyProperties() { + + try { + if (kmlImportService.prompToOpenKml(getFrame())) { + restartEarth(); + } + } catch (Exception e1) { + JOptionPane.showMessageDialog(getFrame(), e1.getMessage(), + Messages.getString("CollectEarthWindow.63"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + logger.error("Error importing KML file", e1); //$NON-NLS-1$ + } + + } + + }); + serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is + // acting as a client ) + toolsMenu.add(menuItem); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.67")); //$NON-NLS-1$ + menuItem.addActionListener( e-> { + try { + CollectEarthUtils.openFolderInExplorer(FolderFinder.getCollectEarthDataFolder()); + } catch (IOException e1) { + logger.error("Could not find the data folder", e1); + } + }); + serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is + // acting as a client ) + toolsMenu.add(menuItem); + + toolsMenu.addSeparator(); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.15")); //$NON-NLS-1$ + menuItem.addActionListener(getPropertiesAction(frame)); + toolsMenu.add(menuItem); + toolsMenu.add(getUtilitiesMenu() ); + + toolsMenu.addSeparator(); + toolsMenu.add(getLanguageMenu()); + return toolsMenu; + } + + private JMenu getUtilitiesMenu() { + JMenuItem menuItem; + JMenu utilities = new JMenu(Messages.getString("CollectEarthMenu.2")); //$NON-NLS-1$ + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.18")); //$NON-NLS-1$ + menuItem.addActionListener(new MissingPlotsListener(frame, localPropertiesService, missingPlotService)); + serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is + // acting as a client ) + + utilities.add(menuItem); + + menuItem = new JMenuItem(Messages.getString("CollectEarthMenu.3")); //$NON-NLS-1$ + menuItem.addActionListener( e -> FileDividerToolDlg.open(frame, earthSurveyService.getCollectSurvey()) ); + serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is // acting as a client ) + utilities.add(menuItem); + + menuItem = new JMenuItem("Delete Plots from DB using CSV"); + menuItem.addActionListener( e -> removePlotsFromDBDlg.open(frame, earthSurveyService.getCollectSurvey()) ); + utilities.add(menuItem); + + + utilities.add(menuItem); + return utilities; + } + + private JMenu getFileMenu() { + JMenu fileMenu = new JMenu(Messages.getString("CollectEarthWindow.10")); //$NON-NLS-1$ + + JMenuItem menuItem = new JMenuItem(Messages.getString("CollectEarthMenu.0")); //$NON-NLS-1$ + menuItem.addActionListener(new ApplyOptionChangesListener(this.getFrame(), localPropertiesService) { + + @Override + protected void applyProperties() { + final File[] selectedProjectFile = JFileChooserExistsAware.getFileChooserResults( + DataFormat.PROJECT_DEFINITION_FILE, false, false, null, localPropertiesService, + getFrame() ); + + if (selectedProjectFile != null && selectedProjectFile.length == 1) { + try { + projectsService.loadCompressedProjectFile(selectedProjectFile[0]); + + restartEarth(); + } catch (Exception e1) { + JOptionPane.showMessageDialog( getFrame(), e1.getMessage(), + Messages.getString("OptionWizard.51"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + logger.error("Error importing project file " + selectedProjectFile[0].getAbsolutePath(), e1); //$NON-NLS-1$ + } + } + } + }); + fileMenu.add(menuItem); + this.add(fileMenu); + fileMenu.addSeparator(); + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.11")); //$NON-NLS-1$ + menuItem.addActionListener(collectEarthWindow.getCloseActionListener()); + fileMenu.add(menuItem); + return fileMenu; + } + + private void addImportExportMenu(JMenu menu) { + + final JMenu ieSubmenu = new JMenu(Messages.getString("CollectEarthWindow.44")); //$NON-NLS-1$ + JMenuItem menuItem; + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.13")); //$NON-NLS-1$ + menuItem.addActionListener(getExportActionListener(DataFormat.CSV, RecordsToExport.ALL)); + ieSubmenu.add(menuItem); + + final JMenu xmlExportSubmenu = new JMenu(Messages.getString("CollectEarthWindow.24")); //$NON-NLS-1$ + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.45")); //$NON-NLS-1$ + menuItem.addActionListener(getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.ALL)); + xmlExportSubmenu.add(menuItem); + + final JMenuItem exportModifiedRecords = new JMenuItem(Messages.getString("CollectEarthWindow.61")); //$NON-NLS-1$ + exportModifiedRecords.addActionListener( + getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.MODIFIED_SINCE_LAST_EXPORT)); + xmlExportSubmenu.add(exportModifiedRecords); + + final JMenuItem exportDataRangeRecords = new JMenuItem(Messages.getString("CollectEarthMenu.4")); //$NON-NLS-1$ + exportDataRangeRecords + .addActionListener(getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.PICK_FROM_DATE)); + xmlExportSubmenu.add(exportDataRangeRecords); + + ieSubmenu.add(xmlExportSubmenu); + + final JMenu backupExportSubmenu = new JMenu(Messages.getString("CollectEarthMenu.5")); //$NON-NLS-1$ + + final JMenuItem exportDataBackup = new JMenuItem(Messages.getString("CollectEarthMenu.6")); //$NON-NLS-1$ + exportDataBackup.addActionListener(getExportActionListener(DataFormat.COLLECT_BACKUP, RecordsToExport.ALL)); + backupExportSubmenu.add(exportDataBackup); + + final JMenuItem exportDataRangeBackup = new JMenuItem(Messages.getString("CollectEarthMenu.7")); //$NON-NLS-1$ + exportDataRangeBackup + .addActionListener(getExportActionListener(DataFormat.COLLECT_BACKUP, RecordsToExport.PICK_FROM_DATE)); + backupExportSubmenu.add(exportDataRangeBackup); + + ieSubmenu.add(backupExportSubmenu); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.6")); //$NON-NLS-1$ + menuItem.addActionListener(getExportActionListener(DataFormat.FUSION, RecordsToExport.ALL)); + ieSubmenu.add(menuItem); + + ieSubmenu.addSeparator(); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.46")); //$NON-NLS-1$ + menuItem.addActionListener(getImportActionListener(DataFormat.ZIP_WITH_XML)); + ieSubmenu.add(menuItem); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.55")); //$NON-NLS-1$ + menuItem.addActionListener(getImportActionListener(DataFormat.CSV)); + ieSubmenu.add(menuItem); + + menu.add(ieSubmenu); + + serverMenuItems.add(ieSubmenu); // This menu should only be shown if the DB is local ( not if Collect Earth is + // acting as a client ) + } + + private String getDisclaimerFilePath() { + final String suffixLang = localPropertiesService.getUiLanguage().getLocale().getLanguage(); + if (new File("resources/disclaimer_" + suffixLang + ".txt").exists()) { //$NON-NLS-1$ //$NON-NLS-2$ + return "resources/disclaimer_" + suffixLang + ".txt"; + } else { + return "resources/disclaimer_en.txt"; + } + } + + private ActionListener getExportActionListener(final DataFormat exportFormat, final RecordsToExport xmlExportType) { + return new ExportActionListener(exportFormat, xmlExportType, getFrame(), localPropertiesService, + dataImportExportService, earthSurveyService); + } + + private ActionListener getImportActionListener(final DataFormat importFormat) { + return new ImportActionListener(importFormat, getFrame(), localPropertiesService, dataImportExportService); + } + + private JMenu getLanguageMenu() { + + final ActionListener actionLanguage = e -> { + try { + final String langName = ((JRadioButtonMenuItem) e.getSource()).getName(); + final UI_LANGUAGE language = UI_LANGUAGE.valueOf(langName); + CollectEarthUtils.setFontDependingOnLanguaue(language); + localPropertiesService.setUiLanguage(language); + + SwingUtilities.invokeLater( () -> { + getFrame().getContentPane().removeAll(); + getFrame().dispose(); + collectEarthWindow.openWindow(); + }); + + } catch (final Exception ex) { + logger.error("Error while changing language", ex); //$NON-NLS-1$ + } + }; + + final JMenu menuLanguage = new JMenu(Messages.getString("CollectEarthWindow.2")); //$NON-NLS-1$ + + final ButtonGroup group = new ButtonGroup(); + final UI_LANGUAGE[] languages = UI_LANGUAGE.values(); + + for (final UI_LANGUAGE language : languages) { + final JRadioButtonMenuItem langItem = new JRadioButtonMenuItem(language.getLabel()); + langItem.setName(language.name()); + langItem.addActionListener(actionLanguage); + menuLanguage.add(langItem); + group.add(menuLanguage); + if (localPropertiesService.getUiLanguage().equals(language)) { + langItem.setSelected(true); + } + + } + + return menuLanguage; + } + + public ActionListener getPropertiesAction(final JFrame owner) { + return e -> { + final JDialog dialog = new PropertiesDialog(owner, localPropertiesService, earthProjectsService, + backupSqlLiteService.getAutomaticBackUpFolder().getPath(), analysisSaikuService, + earthSurveyService.getCollectSurvey()); + dialog.setVisible(true); + dialog.pack(); + }; } - public SaikuExecutionException(String message) { - super(message); + private ActionListener getSaikuAnalysisActionListener() { + return new GenerateRDBAnalysisListener(getFrame(), new GenerateDatabaseStarter(analysisSaikuService, getFrame() ) ); + } + + private ActionListener getSaikuToolExportActionListener() { + return new SaikuToolExportListener(getFrame(), new GenerateDatabaseStarter(analysisSaikuService, getFrame() ), localPropertiesService); } + - public SaikuExecutionException(Throwable cause) { - super(cause); + private ActionListener getIPCCExportActionListener() { + return new IPCCGeneratorListener(getFrame(), new GenerateDatabaseStarter(ipccGeneratorService, getFrame() ) ); } + private String getLogFilePath() { + return FolderFinder.getCollectEarthDataFolder() + "/earth_error.log"; //$NON-NLS-1$ + } + + public JFrame getFrame() { + return frame; + } + public void setFrame(JFrame frame) { + this.frame = frame; + } + + public List getServerMenuItems() { + return serverMenuItems; + } } From 406961a71b75a323a1c2da18efc7c7bbb86a1591 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:36 +0100 Subject: [PATCH 1162/1620] New translations CollectEarthMenu.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 459 +++++++++++++++++- 1 file changed, 445 insertions(+), 14 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 27a0bdef28..4c34fd0a7f 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,29 +1,460 @@ -package org.openforis.collect.earth.app.service; +package org.openforis.collect.earth.app.view; -import org.openforis.collect.earth.ipcc.RdbExportException; +import java.awt.event.ActionListener; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; -public class SaikuExecutionException extends RdbExportException { +import javax.swing.ButtonGroup; +import javax.swing.JCheckBoxMenuItem; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JRadioButtonMenuItem; +import javax.swing.SwingUtilities; - /** - * - */ - private static final long serialVersionUID = 1L; +import org.apache.commons.lang3.SystemUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.LoggerContext; +import org.apache.logging.log4j.core.config.Configuration; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.EarthConstants.UI_LANGUAGE; +import org.openforis.collect.earth.app.logging.JSwingAppender; +import org.openforis.collect.earth.app.service.AnalysisSaikuService; +import org.openforis.collect.earth.app.service.BackupSqlLiteService; +import org.openforis.collect.earth.app.service.DataImportExportService; +import org.openforis.collect.earth.app.service.EarthProjectsService; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.FolderFinder; +import org.openforis.collect.earth.app.service.IPCCGeneratorService; +import org.openforis.collect.earth.app.service.KmlImportService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.MissingPlotService; +import org.openforis.collect.earth.app.view.ExportActionListener.RecordsToExport; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; - public SaikuExecutionException() { +@Component +public class CollectEarthMenu extends JMenuBar implements InitializingBean { + + @Autowired + private transient DataImportExportService dataImportExportService; + + @Autowired + private transient KmlImportService kmlImportService; + + @Autowired + private transient MissingPlotService missingPlotService; + + @Autowired + private transient AnalysisSaikuService analysisSaikuService; + + @Autowired + private transient IPCCGeneratorService ipccGeneratorService; + + @Autowired + private transient LocalPropertiesService localPropertiesService; + + @Autowired + private transient CollectEarthWindow collectEarthWindow; + + @Autowired + private transient EarthSurveyService earthSurveyService; + + @Autowired + private transient EarthProjectsService earthProjectsService; + + @Autowired + private transient BackupSqlLiteService backupSqlLiteService; + + @Autowired + private transient RemovePlotsFromDBDlg removePlotsFromDBDlg; + + @Autowired + private transient EarthProjectsService projectsService; + + private static final long serialVersionUID = -2457052260968029351L; + private final List serverMenuItems = new ArrayList<>(); + private JFrame frame; + private final transient org.slf4j.Logger logger = LoggerFactory.getLogger(CollectEarthMenu.class); + + public CollectEarthMenu() { + // Where the GUI is created: super(); } - public SaikuExecutionException(String message, Throwable cause) { - super(message, cause); + protected void init() { + setFrame(collectEarthWindow.getFrame()); + + // Build file menu in the menu bar. + this.add( getFileMenu() ); + + // Build tools menu in the menu bar. + this.add(getToolsMenu()); + + // Build help menu in the menu bar. + this.add(getHelpMenu()); + } + + @Override + public void afterPropertiesSet() throws Exception { + init(); + } + + @Override + public JMenu getHelpMenu() { + JMenu menuHelp = new JMenu(Messages.getString("CollectEarthWindow.16")); //$NON-NLS-1$ + JMenuItem menuItem; + File surveyGuide = earthSurveyService.getSurveyGuide(); + if( surveyGuide != null ) { + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.70")); //$NON-NLS-1$ + menuItem.addActionListener( (e) -> CollectEarthUtils.openFile( surveyGuide) ); + menuHelp.add(menuItem); + menuHelp.addSeparator(); + } + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.56")); //$NON-NLS-1$ + menuItem.addActionListener(new OpenAboutDialogListener(frame, Messages.getString("CollectEarthWindow.62"))); //$NON-NLS-1$ + menuHelp.add(menuItem); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.17")); //$NON-NLS-1$ + menuItem.addActionListener( + new OpenTextFileListener(frame, getDisclaimerFilePath(), Messages.getString("CollectEarthWindow.4")));//$NON-NLS-1$ + menuHelp.add(menuItem); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.50")); //$NON-NLS-1$ + menuItem.addActionListener( (e) -> CollectEarthUtils.openFile( new File("UserManual.pdf"))); + menuHelp.add(menuItem); + + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.64")); //$NON-NLS-1$ + menuItem.addActionListener(new OpenSupportForum()); + menuHelp.add(menuItem); + + menuHelp.addSeparator(); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.52")); //$NON-NLS-1$ + menuItem.addActionListener( + new OpenTextFileListener(frame, getLogFilePath(), Messages.getString("CollectEarthWindow.53"))); //$NON-NLS-1$ + menuHelp.add(menuItem); + + JCheckBoxMenuItem checkboxErrors = new JCheckBoxMenuItem("Show exception errors", localPropertiesService.isExceptionShown() ); //$NON-NLS-1$ + checkboxErrors.addActionListener( e -> { + // This sets/unsets the property that is checked when an exception is catch by the JSwingAppender log4j2 appender + + Boolean showException = checkboxErrors.isSelected(); + localPropertiesService.setExceptionShown( showException ); + + final LoggerContext ctx = (LoggerContext) LogManager.getContext(false); + final Configuration config = ctx.getConfiguration(); + + JSwingAppender jSwingAppender = config.getAppender("jswing-log"); + + jSwingAppender.setExceptionShown( showException ); + } + + ); + menuHelp.add(checkboxErrors); + + + menuHelp.addSeparator(); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.51")); //$NON-NLS-1$ + menuItem.addActionListener(new CheckForUpdatesListener()); + menuHelp.add(menuItem); + return menuHelp; + } + + private JMenu getToolsMenu() { + JMenu toolsMenu = new JMenu(Messages.getString("CollectEarthWindow.12")); //$NON-NLS-1$ + + addImportExportMenu(toolsMenu); + + JMenuItem menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.14")); //$NON-NLS-1$ + menuItem.addActionListener(getSaikuAnalysisActionListener()); + toolsMenu.add(menuItem); + + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.71")); //$NON-NLS-1$ + menuItem.addActionListener(getSaikuToolExportActionListener()); + menuItem.setEnabled(SystemUtils.IS_OS_WINDOWS ); // This option is only available in Windows!! + toolsMenu.add(menuItem); + +/* + toolsMenu.addSeparator(); + menuItem = new JMenuItem("Generate IPCC GHGi software LULUCF package"); //$NON-NLS-1$ + menuItem.addActionListener(getIPCCExportActionListener()); + toolsMenu.add(menuItem); + + + toolsMenu.addSeparator(); +*/ + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.54")); //$NON-NLS-1$ + menuItem.addActionListener(new ApplyOptionChangesListener(this.getFrame(), localPropertiesService) { + + @Override + protected void applyProperties() { + + try { + if (kmlImportService.prompToOpenKml(getFrame())) { + restartEarth(); + } + } catch (Exception e1) { + JOptionPane.showMessageDialog(getFrame(), e1.getMessage(), + Messages.getString("CollectEarthWindow.63"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + logger.error("Error importing KML file", e1); //$NON-NLS-1$ + } + + } + + }); + serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is + // acting as a client ) + toolsMenu.add(menuItem); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.67")); //$NON-NLS-1$ + menuItem.addActionListener( e-> { + try { + CollectEarthUtils.openFolderInExplorer(FolderFinder.getCollectEarthDataFolder()); + } catch (IOException e1) { + logger.error("Could not find the data folder", e1); + } + }); + serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is + // acting as a client ) + toolsMenu.add(menuItem); + + toolsMenu.addSeparator(); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.15")); //$NON-NLS-1$ + menuItem.addActionListener(getPropertiesAction(frame)); + toolsMenu.add(menuItem); + toolsMenu.add(getUtilitiesMenu() ); + + toolsMenu.addSeparator(); + toolsMenu.add(getLanguageMenu()); + return toolsMenu; + } + + private JMenu getUtilitiesMenu() { + JMenuItem menuItem; + JMenu utilities = new JMenu(Messages.getString("CollectEarthMenu.2")); //$NON-NLS-1$ + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.18")); //$NON-NLS-1$ + menuItem.addActionListener(new MissingPlotsListener(frame, localPropertiesService, missingPlotService)); + serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is + // acting as a client ) + + utilities.add(menuItem); + + menuItem = new JMenuItem(Messages.getString("CollectEarthMenu.3")); //$NON-NLS-1$ + menuItem.addActionListener( e -> FileDividerToolDlg.open(frame, earthSurveyService.getCollectSurvey()) ); + serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is // acting as a client ) + utilities.add(menuItem); + + menuItem = new JMenuItem("Delete Plots from DB using CSV"); + menuItem.addActionListener( e -> removePlotsFromDBDlg.open(frame, earthSurveyService.getCollectSurvey()) ); + utilities.add(menuItem); + + + utilities.add(menuItem); + return utilities; + } + + private JMenu getFileMenu() { + JMenu fileMenu = new JMenu(Messages.getString("CollectEarthWindow.10")); //$NON-NLS-1$ + + JMenuItem menuItem = new JMenuItem(Messages.getString("CollectEarthMenu.0")); //$NON-NLS-1$ + menuItem.addActionListener(new ApplyOptionChangesListener(this.getFrame(), localPropertiesService) { + + @Override + protected void applyProperties() { + final File[] selectedProjectFile = JFileChooserExistsAware.getFileChooserResults( + DataFormat.PROJECT_DEFINITION_FILE, false, false, null, localPropertiesService, + getFrame() ); + + if (selectedProjectFile != null && selectedProjectFile.length == 1) { + try { + projectsService.loadCompressedProjectFile(selectedProjectFile[0]); + + restartEarth(); + } catch (Exception e1) { + JOptionPane.showMessageDialog( getFrame(), e1.getMessage(), + Messages.getString("OptionWizard.51"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + logger.error("Error importing project file " + selectedProjectFile[0].getAbsolutePath(), e1); //$NON-NLS-1$ + } + } + } + }); + fileMenu.add(menuItem); + this.add(fileMenu); + fileMenu.addSeparator(); + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.11")); //$NON-NLS-1$ + menuItem.addActionListener(collectEarthWindow.getCloseActionListener()); + fileMenu.add(menuItem); + return fileMenu; + } + + private void addImportExportMenu(JMenu menu) { + + final JMenu ieSubmenu = new JMenu(Messages.getString("CollectEarthWindow.44")); //$NON-NLS-1$ + JMenuItem menuItem; + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.13")); //$NON-NLS-1$ + menuItem.addActionListener(getExportActionListener(DataFormat.CSV, RecordsToExport.ALL)); + ieSubmenu.add(menuItem); + + final JMenu xmlExportSubmenu = new JMenu(Messages.getString("CollectEarthWindow.24")); //$NON-NLS-1$ + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.45")); //$NON-NLS-1$ + menuItem.addActionListener(getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.ALL)); + xmlExportSubmenu.add(menuItem); + + final JMenuItem exportModifiedRecords = new JMenuItem(Messages.getString("CollectEarthWindow.61")); //$NON-NLS-1$ + exportModifiedRecords.addActionListener( + getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.MODIFIED_SINCE_LAST_EXPORT)); + xmlExportSubmenu.add(exportModifiedRecords); + + final JMenuItem exportDataRangeRecords = new JMenuItem(Messages.getString("CollectEarthMenu.4")); //$NON-NLS-1$ + exportDataRangeRecords + .addActionListener(getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.PICK_FROM_DATE)); + xmlExportSubmenu.add(exportDataRangeRecords); + + ieSubmenu.add(xmlExportSubmenu); + + final JMenu backupExportSubmenu = new JMenu(Messages.getString("CollectEarthMenu.5")); //$NON-NLS-1$ + + final JMenuItem exportDataBackup = new JMenuItem(Messages.getString("CollectEarthMenu.6")); //$NON-NLS-1$ + exportDataBackup.addActionListener(getExportActionListener(DataFormat.COLLECT_BACKUP, RecordsToExport.ALL)); + backupExportSubmenu.add(exportDataBackup); + + final JMenuItem exportDataRangeBackup = new JMenuItem(Messages.getString("CollectEarthMenu.7")); //$NON-NLS-1$ + exportDataRangeBackup + .addActionListener(getExportActionListener(DataFormat.COLLECT_BACKUP, RecordsToExport.PICK_FROM_DATE)); + backupExportSubmenu.add(exportDataRangeBackup); + + ieSubmenu.add(backupExportSubmenu); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.6")); //$NON-NLS-1$ + menuItem.addActionListener(getExportActionListener(DataFormat.FUSION, RecordsToExport.ALL)); + ieSubmenu.add(menuItem); + + ieSubmenu.addSeparator(); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.46")); //$NON-NLS-1$ + menuItem.addActionListener(getImportActionListener(DataFormat.ZIP_WITH_XML)); + ieSubmenu.add(menuItem); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.55")); //$NON-NLS-1$ + menuItem.addActionListener(getImportActionListener(DataFormat.CSV)); + ieSubmenu.add(menuItem); + + menu.add(ieSubmenu); + + serverMenuItems.add(ieSubmenu); // This menu should only be shown if the DB is local ( not if Collect Earth is + // acting as a client ) + } + + private String getDisclaimerFilePath() { + final String suffixLang = localPropertiesService.getUiLanguage().getLocale().getLanguage(); + if (new File("resources/disclaimer_" + suffixLang + ".txt").exists()) { //$NON-NLS-1$ //$NON-NLS-2$ + return "resources/disclaimer_" + suffixLang + ".txt"; + } else { + return "resources/disclaimer_en.txt"; + } + } + + private ActionListener getExportActionListener(final DataFormat exportFormat, final RecordsToExport xmlExportType) { + return new ExportActionListener(exportFormat, xmlExportType, getFrame(), localPropertiesService, + dataImportExportService, earthSurveyService); + } + + private ActionListener getImportActionListener(final DataFormat importFormat) { + return new ImportActionListener(importFormat, getFrame(), localPropertiesService, dataImportExportService); + } + + private JMenu getLanguageMenu() { + + final ActionListener actionLanguage = e -> { + try { + final String langName = ((JRadioButtonMenuItem) e.getSource()).getName(); + final UI_LANGUAGE language = UI_LANGUAGE.valueOf(langName); + CollectEarthUtils.setFontDependingOnLanguaue(language); + localPropertiesService.setUiLanguage(language); + + SwingUtilities.invokeLater( () -> { + getFrame().getContentPane().removeAll(); + getFrame().dispose(); + collectEarthWindow.openWindow(); + }); + + } catch (final Exception ex) { + logger.error("Error while changing language", ex); //$NON-NLS-1$ + } + }; + + final JMenu menuLanguage = new JMenu(Messages.getString("CollectEarthWindow.2")); //$NON-NLS-1$ + + final ButtonGroup group = new ButtonGroup(); + final UI_LANGUAGE[] languages = UI_LANGUAGE.values(); + + for (final UI_LANGUAGE language : languages) { + final JRadioButtonMenuItem langItem = new JRadioButtonMenuItem(language.getLabel()); + langItem.setName(language.name()); + langItem.addActionListener(actionLanguage); + menuLanguage.add(langItem); + group.add(menuLanguage); + if (localPropertiesService.getUiLanguage().equals(language)) { + langItem.setSelected(true); + } + + } + + return menuLanguage; + } + + public ActionListener getPropertiesAction(final JFrame owner) { + return e -> { + final JDialog dialog = new PropertiesDialog(owner, localPropertiesService, earthProjectsService, + backupSqlLiteService.getAutomaticBackUpFolder().getPath(), analysisSaikuService, + earthSurveyService.getCollectSurvey()); + dialog.setVisible(true); + dialog.pack(); + }; } - public SaikuExecutionException(String message) { - super(message); + private ActionListener getSaikuAnalysisActionListener() { + return new GenerateRDBAnalysisListener(getFrame(), new GenerateDatabaseStarter(analysisSaikuService, getFrame() ) ); + } + + private ActionListener getSaikuToolExportActionListener() { + return new SaikuToolExportListener(getFrame(), new GenerateDatabaseStarter(analysisSaikuService, getFrame() ), localPropertiesService); } + - public SaikuExecutionException(Throwable cause) { - super(cause); + private ActionListener getIPCCExportActionListener() { + return new IPCCGeneratorListener(getFrame(), new GenerateDatabaseStarter(ipccGeneratorService, getFrame() ) ); } + private String getLogFilePath() { + return FolderFinder.getCollectEarthDataFolder() + "/earth_error.log"; //$NON-NLS-1$ + } + + public JFrame getFrame() { + return frame; + } + public void setFrame(JFrame frame) { + this.frame = frame; + } + + public List getServerMenuItems() { + return serverMenuItems; + } } From de9d0fcea06f4ae7e218d01ead23395135b1e77c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:37 +0100 Subject: [PATCH 1163/1620] New translations FileTypeFilter.java (English) --- .../earth/app/view/Messages_en.properties | 48 +++++++++++-------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 27a0bdef28..139e1bb847 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,29 +1,39 @@ -package org.openforis.collect.earth.app.service; +package org.openforis.collect.earth.app.view; -import org.openforis.collect.earth.ipcc.RdbExportException; +import java.io.File; -public class SaikuExecutionException extends RdbExportException { +import javax.swing.filechooser.FileFilter; - /** - * - */ - private static final long serialVersionUID = 1L; +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ +public class FileTypeFilter extends FileFilter { - public SaikuExecutionException() { - super(); - } + private String extension; + private String description; - public SaikuExecutionException(String message, Throwable cause) { - super(message, cause); + public FileTypeFilter(String extension, String description) { + this.extension = extension; + this.description = description; } - public SaikuExecutionException(String message) { - super(message); + @Override + public boolean accept(File file) { + if (file.isDirectory()) { + return true; + } + boolean accepted = false; + String[] extensions = extension.split(","); //$NON-NLS-1$ + for (String item : extensions) { + accepted = accepted || file.getName().toLowerCase().endsWith(item); + } + return accepted; + } - public SaikuExecutionException(Throwable cause) { - super(cause); + @Override + public String getDescription() { + return description + String.format(" (*%s)", extension); //$NON-NLS-1$ } - - -} +} \ No newline at end of file From 07d4383cb0425f82035e8f100223d47619841198 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:38 +0100 Subject: [PATCH 1164/1620] New translations ExportProcessMonitorDialog.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 463 ++---------------- 1 file changed, 35 insertions(+), 428 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 4c34fd0a7f..0ccb8f2366 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,460 +1,67 @@ package org.openforis.collect.earth.app.view; -import java.awt.event.ActionListener; import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import javax.swing.ButtonGroup; -import javax.swing.JCheckBoxMenuItem; -import javax.swing.JDialog; import javax.swing.JFrame; -import javax.swing.JMenu; -import javax.swing.JMenuBar; -import javax.swing.JMenuItem; -import javax.swing.JOptionPane; -import javax.swing.JRadioButtonMenuItem; -import javax.swing.SwingUtilities; +import javax.swing.ProgressMonitor; -import org.apache.commons.lang3.SystemUtils; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.core.LoggerContext; -import org.apache.logging.log4j.core.config.Configuration; import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants.UI_LANGUAGE; -import org.openforis.collect.earth.app.logging.JSwingAppender; -import org.openforis.collect.earth.app.service.AnalysisSaikuService; -import org.openforis.collect.earth.app.service.BackupSqlLiteService; -import org.openforis.collect.earth.app.service.DataImportExportService; -import org.openforis.collect.earth.app.service.EarthProjectsService; import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.FolderFinder; -import org.openforis.collect.earth.app.service.IPCCGeneratorService; -import org.openforis.collect.earth.app.service.KmlImportService; import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.MissingPlotService; import org.openforis.collect.earth.app.view.ExportActionListener.RecordsToExport; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; +import org.openforis.collect.io.data.DataExportStatus; +import org.openforis.collect.manager.process.AbstractProcess; -@Component -public class CollectEarthMenu extends JMenuBar implements InitializingBean { +public class ExportProcessMonitorDialog extends ProcessMonitorDialog { - @Autowired - private transient DataImportExportService dataImportExportService; - @Autowired - private transient KmlImportService kmlImportService; + private RecordsToExport recordsToExport; + private DataFormat exportFormat; + private EarthSurveyService earthSurveyService; + private LocalPropertiesService localPropertiesService; + private File exportToFile; - @Autowired - private transient MissingPlotService missingPlotService; - - @Autowired - private transient AnalysisSaikuService analysisSaikuService; - - @Autowired - private transient IPCCGeneratorService ipccGeneratorService; - - @Autowired - private transient LocalPropertiesService localPropertiesService; - - @Autowired - private transient CollectEarthWindow collectEarthWindow; - - @Autowired - private transient EarthSurveyService earthSurveyService; - - @Autowired - private transient EarthProjectsService earthProjectsService; - - @Autowired - private transient BackupSqlLiteService backupSqlLiteService; - - @Autowired - private transient RemovePlotsFromDBDlg removePlotsFromDBDlg; - - @Autowired - private transient EarthProjectsService projectsService; - - private static final long serialVersionUID = -2457052260968029351L; - private final List serverMenuItems = new ArrayList<>(); - private JFrame frame; - private final transient org.slf4j.Logger logger = LoggerFactory.getLogger(CollectEarthMenu.class); - - public CollectEarthMenu() { - // Where the GUI is created: + public ExportProcessMonitorDialog(AbstractProcess exportProcess, JFrame parentFrame, RecordsToExport recordsToExport, DataFormat exportFormat, EarthSurveyService earthSurveyService, File exportToFile, LocalPropertiesService localPropertiesService ) { super(); - } - - protected void init() { - setFrame(collectEarthWindow.getFrame()); - - // Build file menu in the menu bar. - this.add( getFileMenu() ); - - // Build tools menu in the menu bar. - this.add(getToolsMenu()); - - // Build help menu in the menu bar. - this.add(getHelpMenu()); - } - - @Override - public void afterPropertiesSet() throws Exception { - init(); - } - - @Override - public JMenu getHelpMenu() { - JMenu menuHelp = new JMenu(Messages.getString("CollectEarthWindow.16")); //$NON-NLS-1$ - JMenuItem menuItem; - File surveyGuide = earthSurveyService.getSurveyGuide(); - if( surveyGuide != null ) { - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.70")); //$NON-NLS-1$ - menuItem.addActionListener( (e) -> CollectEarthUtils.openFile( surveyGuide) ); - menuHelp.add(menuItem); - menuHelp.addSeparator(); - } - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.56")); //$NON-NLS-1$ - menuItem.addActionListener(new OpenAboutDialogListener(frame, Messages.getString("CollectEarthWindow.62"))); //$NON-NLS-1$ - menuHelp.add(menuItem); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.17")); //$NON-NLS-1$ - menuItem.addActionListener( - new OpenTextFileListener(frame, getDisclaimerFilePath(), Messages.getString("CollectEarthWindow.4")));//$NON-NLS-1$ - menuHelp.add(menuItem); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.50")); //$NON-NLS-1$ - menuItem.addActionListener( (e) -> CollectEarthUtils.openFile( new File("UserManual.pdf"))); - menuHelp.add(menuItem); - - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.64")); //$NON-NLS-1$ - menuItem.addActionListener(new OpenSupportForum()); - menuHelp.add(menuItem); - - menuHelp.addSeparator(); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.52")); //$NON-NLS-1$ - menuItem.addActionListener( - new OpenTextFileListener(frame, getLogFilePath(), Messages.getString("CollectEarthWindow.53"))); //$NON-NLS-1$ - menuHelp.add(menuItem); - - JCheckBoxMenuItem checkboxErrors = new JCheckBoxMenuItem("Show exception errors", localPropertiesService.isExceptionShown() ); //$NON-NLS-1$ - checkboxErrors.addActionListener( e -> { - // This sets/unsets the property that is checked when an exception is catch by the JSwingAppender log4j2 appender - - Boolean showException = checkboxErrors.isSelected(); - localPropertiesService.setExceptionShown( showException ); - - final LoggerContext ctx = (LoggerContext) LogManager.getContext(false); - final Configuration config = ctx.getConfiguration(); - - JSwingAppender jSwingAppender = config.getAppender("jswing-log"); - - jSwingAppender.setExceptionShown( showException ); - } - - ); - menuHelp.add(checkboxErrors); - - - menuHelp.addSeparator(); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.51")); //$NON-NLS-1$ - menuItem.addActionListener(new CheckForUpdatesListener()); - menuHelp.add(menuItem); - return menuHelp; - } - - private JMenu getToolsMenu() { - JMenu toolsMenu = new JMenu(Messages.getString("CollectEarthWindow.12")); //$NON-NLS-1$ - - addImportExportMenu(toolsMenu); - - JMenuItem menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.14")); //$NON-NLS-1$ - menuItem.addActionListener(getSaikuAnalysisActionListener()); - toolsMenu.add(menuItem); + this.process = exportProcess; + this.recordsToExport = recordsToExport; + this.exportFormat = exportFormat; + this.earthSurveyService = earthSurveyService; + this.exportToFile = exportToFile; + this.localPropertiesService = localPropertiesService; + progressMonitor = new ProgressMonitor(parentFrame, Messages.getString("ExportDialogProcessMonitor.0"), Messages.getString("ExportDialogProcessMonitor.1"), 0, 100); //$NON-NLS-1$ //$NON-NLS-2$ + progressMonitor.setMillisToPopup(1000); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.71")); //$NON-NLS-1$ - menuItem.addActionListener(getSaikuToolExportActionListener()); - menuItem.setEnabled(SystemUtils.IS_OS_WINDOWS ); // This option is only available in Windows!! - toolsMenu.add(menuItem); - -/* - toolsMenu.addSeparator(); - menuItem = new JMenuItem("Generate IPCC GHGi software LULUCF package"); //$NON-NLS-1$ - menuItem.addActionListener(getIPCCExportActionListener()); - toolsMenu.add(menuItem); - - - toolsMenu.addSeparator(); -*/ - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.54")); //$NON-NLS-1$ - menuItem.addActionListener(new ApplyOptionChangesListener(this.getFrame(), localPropertiesService) { - - @Override - protected void applyProperties() { - - try { - if (kmlImportService.prompToOpenKml(getFrame())) { - restartEarth(); - } - } catch (Exception e1) { - JOptionPane.showMessageDialog(getFrame(), e1.getMessage(), - Messages.getString("CollectEarthWindow.63"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - logger.error("Error importing KML file", e1); //$NON-NLS-1$ - } - - } - - }); - serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is - // acting as a client ) - toolsMenu.add(menuItem); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.67")); //$NON-NLS-1$ - menuItem.addActionListener( e-> { - try { - CollectEarthUtils.openFolderInExplorer(FolderFinder.getCollectEarthDataFolder()); - } catch (IOException e1) { - logger.error("Could not find the data folder", e1); - } - }); - serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is - // acting as a client ) - toolsMenu.add(menuItem); - - toolsMenu.addSeparator(); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.15")); //$NON-NLS-1$ - menuItem.addActionListener(getPropertiesAction(frame)); - toolsMenu.add(menuItem); - toolsMenu.add(getUtilitiesMenu() ); - - toolsMenu.addSeparator(); - toolsMenu.add(getLanguageMenu()); - return toolsMenu; } - private JMenu getUtilitiesMenu() { - JMenuItem menuItem; - JMenu utilities = new JMenu(Messages.getString("CollectEarthMenu.2")); //$NON-NLS-1$ - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.18")); //$NON-NLS-1$ - menuItem.addActionListener(new MissingPlotsListener(frame, localPropertiesService, missingPlotService)); - serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is - // acting as a client ) - - utilities.add(menuItem); - - menuItem = new JMenuItem(Messages.getString("CollectEarthMenu.3")); //$NON-NLS-1$ - menuItem.addActionListener( e -> FileDividerToolDlg.open(frame, earthSurveyService.getCollectSurvey()) ); - serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is // acting as a client ) - utilities.add(menuItem); - - menuItem = new JMenuItem("Delete Plots from DB using CSV"); - menuItem.addActionListener( e -> removePlotsFromDBDlg.open(frame, earthSurveyService.getCollectSurvey()) ); - utilities.add(menuItem); - - - utilities.add(menuItem); - return utilities; + protected String getProcessActionMessage() { + return Messages.getString("ExportDialogProcessMonitor.4"); //$NON-NLS-1$ } - private JMenu getFileMenu() { - JMenu fileMenu = new JMenu(Messages.getString("CollectEarthWindow.10")); //$NON-NLS-1$ - - JMenuItem menuItem = new JMenuItem(Messages.getString("CollectEarthMenu.0")); //$NON-NLS-1$ - menuItem.addActionListener(new ApplyOptionChangesListener(this.getFrame(), localPropertiesService) { - - @Override - protected void applyProperties() { - final File[] selectedProjectFile = JFileChooserExistsAware.getFileChooserResults( - DataFormat.PROJECT_DEFINITION_FILE, false, false, null, localPropertiesService, - getFrame() ); - - if (selectedProjectFile != null && selectedProjectFile.length == 1) { - try { - projectsService.loadCompressedProjectFile(selectedProjectFile[0]); - - restartEarth(); - } catch (Exception e1) { - JOptionPane.showMessageDialog( getFrame(), e1.getMessage(), - Messages.getString("OptionWizard.51"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - logger.error("Error importing project file " + selectedProjectFile[0].getAbsolutePath(), e1); //$NON-NLS-1$ - } + @Override + public void run() { + + try { + monitorProgress(); + process.call(); + if( process.getStatus().isComplete() && exportFormat.equals( DataFormat.ZIP_WITH_XML ) && recordsToExport.equals(RecordsToExport.MODIFIED_SINCE_LAST_EXPORT) ){ + String surveyName = ""; //$NON-NLS-1$ + if( earthSurveyService.getCollectSurvey()!= null ){ + surveyName = earthSurveyService.getCollectSurvey().getName(); } - } - }); - fileMenu.add(menuItem); - this.add(fileMenu); - fileMenu.addSeparator(); - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.11")); //$NON-NLS-1$ - menuItem.addActionListener(collectEarthWindow.getCloseActionListener()); - fileMenu.add(menuItem); - return fileMenu; - } - - private void addImportExportMenu(JMenu menu) { - - final JMenu ieSubmenu = new JMenu(Messages.getString("CollectEarthWindow.44")); //$NON-NLS-1$ - JMenuItem menuItem; - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.13")); //$NON-NLS-1$ - menuItem.addActionListener(getExportActionListener(DataFormat.CSV, RecordsToExport.ALL)); - ieSubmenu.add(menuItem); - - final JMenu xmlExportSubmenu = new JMenu(Messages.getString("CollectEarthWindow.24")); //$NON-NLS-1$ - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.45")); //$NON-NLS-1$ - menuItem.addActionListener(getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.ALL)); - xmlExportSubmenu.add(menuItem); - - final JMenuItem exportModifiedRecords = new JMenuItem(Messages.getString("CollectEarthWindow.61")); //$NON-NLS-1$ - exportModifiedRecords.addActionListener( - getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.MODIFIED_SINCE_LAST_EXPORT)); - xmlExportSubmenu.add(exportModifiedRecords); - - final JMenuItem exportDataRangeRecords = new JMenuItem(Messages.getString("CollectEarthMenu.4")); //$NON-NLS-1$ - exportDataRangeRecords - .addActionListener(getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.PICK_FROM_DATE)); - xmlExportSubmenu.add(exportDataRangeRecords); - - ieSubmenu.add(xmlExportSubmenu); - - final JMenu backupExportSubmenu = new JMenu(Messages.getString("CollectEarthMenu.5")); //$NON-NLS-1$ - - final JMenuItem exportDataBackup = new JMenuItem(Messages.getString("CollectEarthMenu.6")); //$NON-NLS-1$ - exportDataBackup.addActionListener(getExportActionListener(DataFormat.COLLECT_BACKUP, RecordsToExport.ALL)); - backupExportSubmenu.add(exportDataBackup); - - final JMenuItem exportDataRangeBackup = new JMenuItem(Messages.getString("CollectEarthMenu.7")); //$NON-NLS-1$ - exportDataRangeBackup - .addActionListener(getExportActionListener(DataFormat.COLLECT_BACKUP, RecordsToExport.PICK_FROM_DATE)); - backupExportSubmenu.add(exportDataRangeBackup); - - ieSubmenu.add(backupExportSubmenu); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.6")); //$NON-NLS-1$ - menuItem.addActionListener(getExportActionListener(DataFormat.FUSION, RecordsToExport.ALL)); - ieSubmenu.add(menuItem); - - ieSubmenu.addSeparator(); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.46")); //$NON-NLS-1$ - menuItem.addActionListener(getImportActionListener(DataFormat.ZIP_WITH_XML)); - ieSubmenu.add(menuItem); + localPropertiesService.setLastExportedDate( surveyName ); - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.55")); //$NON-NLS-1$ - menuItem.addActionListener(getImportActionListener(DataFormat.CSV)); - ieSubmenu.add(menuItem); - - menu.add(ieSubmenu); - - serverMenuItems.add(ieSubmenu); // This menu should only be shown if the DB is local ( not if Collect Earth is - // acting as a client ) - } - - private String getDisclaimerFilePath() { - final String suffixLang = localPropertiesService.getUiLanguage().getLocale().getLanguage(); - if (new File("resources/disclaimer_" + suffixLang + ".txt").exists()) { //$NON-NLS-1$ //$NON-NLS-2$ - return "resources/disclaimer_" + suffixLang + ".txt"; - } else { - return "resources/disclaimer_en.txt"; - } - } - - private ActionListener getExportActionListener(final DataFormat exportFormat, final RecordsToExport xmlExportType) { - return new ExportActionListener(exportFormat, xmlExportType, getFrame(), localPropertiesService, - dataImportExportService, earthSurveyService); - } - - private ActionListener getImportActionListener(final DataFormat importFormat) { - return new ImportActionListener(importFormat, getFrame(), localPropertiesService, dataImportExportService); - } - - private JMenu getLanguageMenu() { - - final ActionListener actionLanguage = e -> { - try { - final String langName = ((JRadioButtonMenuItem) e.getSource()).getName(); - final UI_LANGUAGE language = UI_LANGUAGE.valueOf(langName); - CollectEarthUtils.setFontDependingOnLanguaue(language); - localPropertiesService.setUiLanguage(language); - - SwingUtilities.invokeLater( () -> { - getFrame().getContentPane().removeAll(); - getFrame().dispose(); - collectEarthWindow.openWindow(); - }); - - } catch (final Exception ex) { - logger.error("Error while changing language", ex); //$NON-NLS-1$ } - }; - final JMenu menuLanguage = new JMenu(Messages.getString("CollectEarthWindow.2")); //$NON-NLS-1$ - - final ButtonGroup group = new ButtonGroup(); - final UI_LANGUAGE[] languages = UI_LANGUAGE.values(); - - for (final UI_LANGUAGE language : languages) { - final JRadioButtonMenuItem langItem = new JRadioButtonMenuItem(language.getLabel()); - langItem.setName(language.name()); - langItem.addActionListener(actionLanguage); - menuLanguage.add(langItem); - group.add(menuLanguage); - if (localPropertiesService.getUiLanguage().equals(language)) { - langItem.setSelected(true); + if( process.getStatus().isComplete() && ( exportFormat.equals( DataFormat.CSV ) || exportFormat.equals( DataFormat.FUSION ) || exportFormat.equals( DataFormat.KML_FILE ) ) ) { + CollectEarthUtils.openFile( exportToFile ); } + } catch (final Exception e) { + logger.error("Error starting the process", e); //$NON-NLS-1$ } - return menuLanguage; - } - - public ActionListener getPropertiesAction(final JFrame owner) { - return e -> { - final JDialog dialog = new PropertiesDialog(owner, localPropertiesService, earthProjectsService, - backupSqlLiteService.getAutomaticBackUpFolder().getPath(), analysisSaikuService, - earthSurveyService.getCollectSurvey()); - dialog.setVisible(true); - dialog.pack(); - }; - } - - private ActionListener getSaikuAnalysisActionListener() { - return new GenerateRDBAnalysisListener(getFrame(), new GenerateDatabaseStarter(analysisSaikuService, getFrame() ) ); - } - - private ActionListener getSaikuToolExportActionListener() { - return new SaikuToolExportListener(getFrame(), new GenerateDatabaseStarter(analysisSaikuService, getFrame() ), localPropertiesService); - } - - - private ActionListener getIPCCExportActionListener() { - return new IPCCGeneratorListener(getFrame(), new GenerateDatabaseStarter(ipccGeneratorService, getFrame() ) ); - } - - private String getLogFilePath() { - return FolderFinder.getCollectEarthDataFolder() + "/earth_error.log"; //$NON-NLS-1$ } - public JFrame getFrame() { - return frame; - } - public void setFrame(JFrame frame) { - this.frame = frame; - } - - public List getServerMenuItems() { - return serverMenuItems; - } } From 810527e84c2de832fe8f4701402a12fbc6d74aa3 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:39 +0100 Subject: [PATCH 1165/1620] New translations ExportProcessMonitorDialog.java (English) --- .../earth/app/view/Messages_en.properties | 80 +++++++++++++------ 1 file changed, 54 insertions(+), 26 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 139e1bb847..0ccb8f2366 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -2,38 +2,66 @@ package org.openforis.collect.earth.app.view; import java.io.File; -import javax.swing.filechooser.FileFilter; +import javax.swing.JFrame; +import javax.swing.ProgressMonitor; -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ -public class FileTypeFilter extends FileFilter { +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.view.ExportActionListener.RecordsToExport; +import org.openforis.collect.io.data.DataExportStatus; +import org.openforis.collect.manager.process.AbstractProcess; - private String extension; - private String description; +public class ExportProcessMonitorDialog extends ProcessMonitorDialog { - public FileTypeFilter(String extension, String description) { - this.extension = extension; - this.description = description; + + private RecordsToExport recordsToExport; + private DataFormat exportFormat; + private EarthSurveyService earthSurveyService; + private LocalPropertiesService localPropertiesService; + private File exportToFile; + + public ExportProcessMonitorDialog(AbstractProcess exportProcess, JFrame parentFrame, RecordsToExport recordsToExport, DataFormat exportFormat, EarthSurveyService earthSurveyService, File exportToFile, LocalPropertiesService localPropertiesService ) { + super(); + this.process = exportProcess; + this.recordsToExport = recordsToExport; + this.exportFormat = exportFormat; + this.earthSurveyService = earthSurveyService; + this.exportToFile = exportToFile; + this.localPropertiesService = localPropertiesService; + progressMonitor = new ProgressMonitor(parentFrame, Messages.getString("ExportDialogProcessMonitor.0"), Messages.getString("ExportDialogProcessMonitor.1"), 0, 100); //$NON-NLS-1$ //$NON-NLS-2$ + progressMonitor.setMillisToPopup(1000); + } - @Override - public boolean accept(File file) { - if (file.isDirectory()) { - return true; - } - boolean accepted = false; - String[] extensions = extension.split(","); //$NON-NLS-1$ - for (String item : extensions) { - accepted = accepted || file.getName().toLowerCase().endsWith(item); - } - return accepted; - + protected String getProcessActionMessage() { + return Messages.getString("ExportDialogProcessMonitor.4"); //$NON-NLS-1$ } @Override - public String getDescription() { - return description + String.format(" (*%s)", extension); //$NON-NLS-1$ + public void run() { + + try { + monitorProgress(); + process.call(); + if( process.getStatus().isComplete() && exportFormat.equals( DataFormat.ZIP_WITH_XML ) && recordsToExport.equals(RecordsToExport.MODIFIED_SINCE_LAST_EXPORT) ){ + String surveyName = ""; //$NON-NLS-1$ + if( earthSurveyService.getCollectSurvey()!= null ){ + surveyName = earthSurveyService.getCollectSurvey().getName(); + } + localPropertiesService.setLastExportedDate( surveyName ); + + } + + if( process.getStatus().isComplete() && ( exportFormat.equals( DataFormat.CSV ) || exportFormat.equals( DataFormat.FUSION ) || exportFormat.equals( DataFormat.KML_FILE ) ) ) { + CollectEarthUtils.openFile( exportToFile ); + } + + } catch (final Exception e) { + logger.error("Error starting the process", e); //$NON-NLS-1$ + } + } -} \ No newline at end of file + + +} From c1aa1ff5b5da836bfd6788db0b953d68d69c1038 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:41 +0100 Subject: [PATCH 1166/1620] New translations FileDividerToolDlg.java (French) --- .../earth/app/view/Messages_fr.properties | 327 +++++++++++++++++- 1 file changed, 311 insertions(+), 16 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 27a0bdef28..d275a15df8 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,29 +1,324 @@ -package org.openforis.collect.earth.app.service; +package org.openforis.collect.earth.app.view; -import org.openforis.collect.earth.ipcc.RdbExportException; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.io.File; +import java.io.IOException; +import java.util.List; -public class SaikuExecutionException extends RdbExportException { +import javax.swing.DefaultComboBoxModel; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JDialog; +import javax.swing.JFileChooser; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; - /** - * - */ - private static final long serialVersionUID = 1L; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.collect.earth.sampler.utils.ProduceCsvFiles; +import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult; +import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult.ErrorType; +import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; +import org.openforis.collect.manager.validation.SurveyValidator.ValidationParameters; +import org.openforis.collect.model.CollectSurvey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; - public SaikuExecutionException() { - super(); +public class FileDividerToolDlg extends JDialog{ + + private static final long serialVersionUID = 2241706750062961024L; + private static final int MAX_FILES = 500; + private CollectSurvey survey; + private transient Logger logger = LoggerFactory.getLogger( FileDividerToolDlg.class); + private JComboBox numberOfFiles ; + private JCheckBox randomSelector; + private JComboBox csvColumns; + private JFilePicker outputFolder; + private JButton generateGrids; + private JFilePicker filePicker; + + public static void open( Frame owner, CollectSurvey survey){ + FileDividerToolDlg dlg = new FileDividerToolDlg(owner, survey); + dlg.setVisible(true); + } + + public FileDividerToolDlg( Frame owner,CollectSurvey survey ) { + super(owner); + this.survey = survey; + this.setModal(true); + this.setSize( new Dimension(700, 350)); + this.setLocationRelativeTo( owner ); + this.setTitle("Tool for dividing large CSV into smaller ones"); + initLayout(); + } + + private void initLayout() { + final JPanel panel = new JPanel(new GridBagLayout()); + GridBagConstraints c = new GridBagConstraints(); + + int row = 0; + + c.fill = GridBagConstraints.BOTH; + c.gridx = 0; + c.gridwidth = 2; + c.gridy = row++; + + panel.add( getCsvFilePicker(), c ); + c.gridwidth = 1; + c.gridy = row++; + + c.gridx = 0; + + panel.add( new JLabel("Number of files to split the CSV into"), c ); + + c.gridx = 1; + panel.add( getNumberOfFilesSelector(), c ); + + c.gridx = 0; + c.gridy = row++; + c.gridwidth = 2; + panel.add( getRandomSelector(), c ); + + c.gridy = row++; + c.gridx = 0; + c.gridwidth = 1; + panel.add( new JLabel("Split files by strata (values of the column i.e : region )"), c ); + + c.gridx = 1; + panel.add( getColumnSelector(), c ); + + c.gridx = 0; + c.gridy = row++; + c.gridwidth = 2; + panel.add( getOutputFolder(), c ); + + c.gridx = 0; + c.gridy = row; + + panel.add( getGenerateButton(), c ); + + this.add(panel); } - public SaikuExecutionException(String message, Throwable cause) { - super(message, cause); + private JButton getGenerateButton() { + if( generateGrids == null ){ + generateGrids = new JButton("Divide file"); + generateGrids.setEnabled( false ); + generateGrids.addActionListener( e -> { + String sourceCsvFile = getCsvFilePicker().getSelectedFilePath(); + String destinationFolder = getOutputFolder().getSelectedFilePath(); + boolean randomizeLines = getRandomSelector().isSelected(); + Integer randomizeUsingColumnValues = null; + if( ( (CsvColumn) getColumnSelector().getSelectedItem() )!=null ){ + randomizeUsingColumnValues = ( (CsvColumn) getColumnSelector().getSelectedItem() ).getPos(); + } + Integer filesToDivideInto = getNumberOfFilesSelector().getSelectedIndex()+1; + ProduceCsvFiles produceCsvFiles = new ProduceCsvFiles(survey, sourceCsvFile, destinationFolder, randomizeLines, randomizeUsingColumnValues, filesToDivideInto); + File dest = produceCsvFiles.divideIntoFiles(); + + try { + CollectEarthUtils.openFolderInExplorer( dest.getAbsolutePath() ); + } catch (IOException e1) { + logger.error(" Error opening the destination folder", e); + } + }); + } + return generateGrids; } - public SaikuExecutionException(String message) { - super(message); + private JFilePicker getOutputFolder() { + if( outputFolder == null ){ + outputFolder = new JFilePicker("Select the output folder" , null, "Select...", DlgMode.MODE_SAVE); + outputFolder.getFileChooser().setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + outputFolder.setEnabled(false); + + outputFolder.addChangeListener( new DocumentListener() { + + @Override + public void removeUpdate(DocumentEvent e) { + // No need to do anything + } + + @Override + public void insertUpdate(DocumentEvent e) { + String outputFolderPath = outputFolder.getSelectedFilePath(); + File out = new File( outputFolderPath ); + getGenerateButton().setEnabled(out.exists() ); + } + + @Override + public void changedUpdate(DocumentEvent e) { + // No need to react to the update + } + }); + } + return outputFolder; + } + + + private void enableOtherControls(boolean validFile) { + getRandomSelector().setEnabled( true ); + getColumnSelector().setEnabled(validFile); + getNumberOfFilesSelector().setEnabled(true); + getOutputFolder().setEnabled(true); + setColumns( validFile ); } - public SaikuExecutionException(Throwable cause) { - super(cause); + + private void setColumns( boolean validFile){ + if( validFile ){ + CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); + + List expectedHeaders = cegtg.getExpectedHeaders(survey); + CsvColumn[] columns = new CsvColumn[ expectedHeaders.size()+1 ]; + CsvColumn column = new CsvColumn(null,"DO NOT STRATIFY"); + columns[0] = column; + + int i = 0; + for (String header : expectedHeaders) { + column = new CsvColumn(i++,"Use :" + header); + columns[i] = column; + } + + getColumnSelector().setModel( new DefaultComboBoxModel( columns )); + }else{ + getColumnSelector().setModel( new DefaultComboBoxModel()); + } + } + + + private JComboBox getColumnSelector() { + if( csvColumns == null ){ + csvColumns = new JComboBox<>(); + csvColumns.setEnabled(false); + } + return csvColumns; + } + + private JCheckBox getRandomSelector() { + if( randomSelector == null ){ + randomSelector = new JCheckBox("Randomize the order of the lines from the source CSV file" , false); + randomSelector.setEnabled( false); + } + return randomSelector; + } + + private JComboBox getNumberOfFilesSelector() { + if( numberOfFiles == null ){ + Integer[] items = new Integer[MAX_FILES]; + for (int i =1; i<= MAX_FILES; i++) { + items[i-1] = Integer.valueOf(i); + } + numberOfFiles = new JComboBox<>(items); + numberOfFiles.setEnabled( false ); + } + return numberOfFiles; + } + + private JFilePicker getCsvFilePicker() { + if( filePicker == null ){ + filePicker = new JFilePicker("Choose the CSV file with the sampling design (plots)", null, "Explore", DlgMode.MODE_OPEN); + + filePicker.getFileChooser().setAcceptAllFileFilterUsed(false); + filePicker.addFileTypeFilter("csv", " CSV file with plot (sampling design)", true); + + filePicker.addChangeListener( new DocumentListener() { + + @Override + public void removeUpdate(DocumentEvent e) { + // No need to validate + } + + @Override + public void insertUpdate(DocumentEvent e) { + validateCsv( filePicker.getTextField().getText() ); + } + + private boolean validateCsv(String filePath) { + boolean validFile = true; + try { + + filePicker.setTextBackground( Color.white); + + if( CsvReaderUtils.isCsvFile( filePath )){ + CollectEarthGridTemplateGenerator cetg = new CollectEarthGridTemplateGenerator(); + + File csvFile = new File( filePath ); + ValidationParameters validationParameters = new ValidationParameters(); + validationParameters.setValidateOnlyFirstLines(false); + CSVFileValidationResult validationResults = cetg.validate(csvFile, survey, validationParameters ); + + validFile = validationResults.isSuccessful(); + if( + !validFile + // If the message is that there are too many rows then we ignore the validation! + && ( + validationResults.getErrorType().equals( ErrorType.INVALID_NUMBER_OF_PLOTS_TOO_LARGE) + || + validationResults.getErrorType().equals( ErrorType.INVALID_NUMBER_OF_PLOTS_WARNING) + ) + ){ + validFile = true; + + } + + if( !validFile ){ + filePicker.setTextBackground( Color.yellow); + switch ( validationResults.getErrorType() ) { + case INVALID_FILE_TYPE: + filePicker.setTextBackground( Color.red); + JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), "The expected file type is CSV or CED ", "Expected File Type", JOptionPane.ERROR_MESSAGE); + break; + + case INVALID_HEADERS: + JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), String.format("The expected columns in the CSV for the survey %s are %s", survey.getName(), validationResults.getExpectedHeaders() ) , "Columns in CSV do not match survey", JOptionPane.ERROR_MESSAGE); + break; + + case INVALID_NUMBER_OF_COLUMNS: + JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), String.format("The number of columns in the CSV file do not coincide with the expercted columns expected for the survey %s /n%s", survey.getName(), validationResults.getExpectedHeaders() ), "Expected File Type", JOptionPane.ERROR_MESSAGE); + break; + + case INVALID_VALUES_IN_CSV: + // IN THIS CASE THE CELL RENDERER TAKES CARE OF HIGHLIGHTING THE CELLS!!! + JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), "The content of the CSV file is not correct!! The values on some cells are incorrect for the survey " + survey.getName() , "CSV content is not correct", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + break; + + default: + break; + } + } + + enableOtherControls( validFile ); + + }else{ + + JOptionPane.showMessageDialog(FileDividerToolDlg.this, String.format("The file in %s is NOT A CSV file ", filePath) ); + filePicker.setTextBackground( Color.red); + } + } catch (Exception e) { + JOptionPane.showMessageDialog(FileDividerToolDlg.this, String.format("The file in %s is NOT A CSV file ", filePath) ); + logger.error( "Error while validating the CSV file", e); + validFile = false; + } + return validFile; + } + + @Override + public void changedUpdate(DocumentEvent e) { + validateCsv( filePicker.getTextField().getText() ); + } + }); + } + return filePicker ; } - } From 20d649deb26b9c22eccc1e0eec4de965cda34fc9 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:42 +0100 Subject: [PATCH 1167/1620] New translations FileDividerToolDlg.java (Spanish) --- .../earth/app/view/Messages_es.properties | 646 +++++++----------- 1 file changed, 255 insertions(+), 391 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 4c34fd0a7f..d275a15df8 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,460 +1,324 @@ package org.openforis.collect.earth.app.view; -import java.awt.event.ActionListener; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; import java.io.File; import java.io.IOException; -import java.util.ArrayList; import java.util.List; -import javax.swing.ButtonGroup; -import javax.swing.JCheckBoxMenuItem; +import javax.swing.DefaultComboBoxModel; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JMenu; -import javax.swing.JMenuBar; -import javax.swing.JMenuItem; +import javax.swing.JFileChooser; +import javax.swing.JLabel; import javax.swing.JOptionPane; -import javax.swing.JRadioButtonMenuItem; -import javax.swing.SwingUtilities; +import javax.swing.JPanel; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; -import org.apache.commons.lang3.SystemUtils; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.core.LoggerContext; -import org.apache.logging.log4j.core.config.Configuration; import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants.UI_LANGUAGE; -import org.openforis.collect.earth.app.logging.JSwingAppender; -import org.openforis.collect.earth.app.service.AnalysisSaikuService; -import org.openforis.collect.earth.app.service.BackupSqlLiteService; -import org.openforis.collect.earth.app.service.DataImportExportService; -import org.openforis.collect.earth.app.service.EarthProjectsService; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.FolderFinder; -import org.openforis.collect.earth.app.service.IPCCGeneratorService; -import org.openforis.collect.earth.app.service.KmlImportService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.MissingPlotService; -import org.openforis.collect.earth.app.view.ExportActionListener.RecordsToExport; +import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.collect.earth.sampler.utils.ProduceCsvFiles; +import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult; +import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult.ErrorType; +import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; +import org.openforis.collect.manager.validation.SurveyValidator.ValidationParameters; +import org.openforis.collect.model.CollectSurvey; +import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -@Component -public class CollectEarthMenu extends JMenuBar implements InitializingBean { - - @Autowired - private transient DataImportExportService dataImportExportService; - - @Autowired - private transient KmlImportService kmlImportService; - - @Autowired - private transient MissingPlotService missingPlotService; - - @Autowired - private transient AnalysisSaikuService analysisSaikuService; - - @Autowired - private transient IPCCGeneratorService ipccGeneratorService; - - @Autowired - private transient LocalPropertiesService localPropertiesService; - - @Autowired - private transient CollectEarthWindow collectEarthWindow; - - @Autowired - private transient EarthSurveyService earthSurveyService; - - @Autowired - private transient EarthProjectsService earthProjectsService; - - @Autowired - private transient BackupSqlLiteService backupSqlLiteService; - - @Autowired - private transient RemovePlotsFromDBDlg removePlotsFromDBDlg; - - @Autowired - private transient EarthProjectsService projectsService; - - private static final long serialVersionUID = -2457052260968029351L; - private final List serverMenuItems = new ArrayList<>(); - private JFrame frame; - private final transient org.slf4j.Logger logger = LoggerFactory.getLogger(CollectEarthMenu.class); - - public CollectEarthMenu() { - // Where the GUI is created: - super(); - } - - protected void init() { - setFrame(collectEarthWindow.getFrame()); - - // Build file menu in the menu bar. - this.add( getFileMenu() ); - - // Build tools menu in the menu bar. - this.add(getToolsMenu()); - - // Build help menu in the menu bar. - this.add(getHelpMenu()); +public class FileDividerToolDlg extends JDialog{ + + private static final long serialVersionUID = 2241706750062961024L; + private static final int MAX_FILES = 500; + private CollectSurvey survey; + private transient Logger logger = LoggerFactory.getLogger( FileDividerToolDlg.class); + private JComboBox numberOfFiles ; + private JCheckBox randomSelector; + private JComboBox csvColumns; + private JFilePicker outputFolder; + private JButton generateGrids; + private JFilePicker filePicker; + + public static void open( Frame owner, CollectSurvey survey){ + FileDividerToolDlg dlg = new FileDividerToolDlg(owner, survey); + dlg.setVisible(true); } - @Override - public void afterPropertiesSet() throws Exception { - init(); + public FileDividerToolDlg( Frame owner,CollectSurvey survey ) { + super(owner); + this.survey = survey; + this.setModal(true); + this.setSize( new Dimension(700, 350)); + this.setLocationRelativeTo( owner ); + this.setTitle("Tool for dividing large CSV into smaller ones"); + initLayout(); } - @Override - public JMenu getHelpMenu() { - JMenu menuHelp = new JMenu(Messages.getString("CollectEarthWindow.16")); //$NON-NLS-1$ - JMenuItem menuItem; - File surveyGuide = earthSurveyService.getSurveyGuide(); - if( surveyGuide != null ) { - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.70")); //$NON-NLS-1$ - menuItem.addActionListener( (e) -> CollectEarthUtils.openFile( surveyGuide) ); - menuHelp.add(menuItem); - menuHelp.addSeparator(); - } - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.56")); //$NON-NLS-1$ - menuItem.addActionListener(new OpenAboutDialogListener(frame, Messages.getString("CollectEarthWindow.62"))); //$NON-NLS-1$ - menuHelp.add(menuItem); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.17")); //$NON-NLS-1$ - menuItem.addActionListener( - new OpenTextFileListener(frame, getDisclaimerFilePath(), Messages.getString("CollectEarthWindow.4")));//$NON-NLS-1$ - menuHelp.add(menuItem); + private void initLayout() { + final JPanel panel = new JPanel(new GridBagLayout()); + GridBagConstraints c = new GridBagConstraints(); - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.50")); //$NON-NLS-1$ - menuItem.addActionListener( (e) -> CollectEarthUtils.openFile( new File("UserManual.pdf"))); - menuHelp.add(menuItem); + int row = 0; + c.fill = GridBagConstraints.BOTH; + c.gridx = 0; + c.gridwidth = 2; + c.gridy = row++; - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.64")); //$NON-NLS-1$ - menuItem.addActionListener(new OpenSupportForum()); - menuHelp.add(menuItem); + panel.add( getCsvFilePicker(), c ); + c.gridwidth = 1; + c.gridy = row++; - menuHelp.addSeparator(); + c.gridx = 0; - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.52")); //$NON-NLS-1$ - menuItem.addActionListener( - new OpenTextFileListener(frame, getLogFilePath(), Messages.getString("CollectEarthWindow.53"))); //$NON-NLS-1$ - menuHelp.add(menuItem); + panel.add( new JLabel("Number of files to split the CSV into"), c ); - JCheckBoxMenuItem checkboxErrors = new JCheckBoxMenuItem("Show exception errors", localPropertiesService.isExceptionShown() ); //$NON-NLS-1$ - checkboxErrors.addActionListener( e -> { - // This sets/unsets the property that is checked when an exception is catch by the JSwingAppender log4j2 appender + c.gridx = 1; + panel.add( getNumberOfFilesSelector(), c ); - Boolean showException = checkboxErrors.isSelected(); - localPropertiesService.setExceptionShown( showException ); + c.gridx = 0; + c.gridy = row++; + c.gridwidth = 2; + panel.add( getRandomSelector(), c ); - final LoggerContext ctx = (LoggerContext) LogManager.getContext(false); - final Configuration config = ctx.getConfiguration(); + c.gridy = row++; + c.gridx = 0; + c.gridwidth = 1; + panel.add( new JLabel("Split files by strata (values of the column i.e : region )"), c ); - JSwingAppender jSwingAppender = config.getAppender("jswing-log"); + c.gridx = 1; + panel.add( getColumnSelector(), c ); - jSwingAppender.setExceptionShown( showException ); - } - - ); - menuHelp.add(checkboxErrors); + c.gridx = 0; + c.gridy = row++; + c.gridwidth = 2; + panel.add( getOutputFolder(), c ); + c.gridx = 0; + c.gridy = row; - menuHelp.addSeparator(); + panel.add( getGenerateButton(), c ); - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.51")); //$NON-NLS-1$ - menuItem.addActionListener(new CheckForUpdatesListener()); - menuHelp.add(menuItem); - return menuHelp; + this.add(panel); } - private JMenu getToolsMenu() { - JMenu toolsMenu = new JMenu(Messages.getString("CollectEarthWindow.12")); //$NON-NLS-1$ - - addImportExportMenu(toolsMenu); - - JMenuItem menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.14")); //$NON-NLS-1$ - menuItem.addActionListener(getSaikuAnalysisActionListener()); - toolsMenu.add(menuItem); - - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.71")); //$NON-NLS-1$ - menuItem.addActionListener(getSaikuToolExportActionListener()); - menuItem.setEnabled(SystemUtils.IS_OS_WINDOWS ); // This option is only available in Windows!! - toolsMenu.add(menuItem); - -/* - toolsMenu.addSeparator(); - menuItem = new JMenuItem("Generate IPCC GHGi software LULUCF package"); //$NON-NLS-1$ - menuItem.addActionListener(getIPCCExportActionListener()); - toolsMenu.add(menuItem); - - - toolsMenu.addSeparator(); -*/ - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.54")); //$NON-NLS-1$ - menuItem.addActionListener(new ApplyOptionChangesListener(this.getFrame(), localPropertiesService) { - - @Override - protected void applyProperties() { + private JButton getGenerateButton() { + if( generateGrids == null ){ + generateGrids = new JButton("Divide file"); + generateGrids.setEnabled( false ); + generateGrids.addActionListener( e -> { + String sourceCsvFile = getCsvFilePicker().getSelectedFilePath(); + String destinationFolder = getOutputFolder().getSelectedFilePath(); + boolean randomizeLines = getRandomSelector().isSelected(); + Integer randomizeUsingColumnValues = null; + if( ( (CsvColumn) getColumnSelector().getSelectedItem() )!=null ){ + randomizeUsingColumnValues = ( (CsvColumn) getColumnSelector().getSelectedItem() ).getPos(); + } + Integer filesToDivideInto = getNumberOfFilesSelector().getSelectedIndex()+1; + ProduceCsvFiles produceCsvFiles = new ProduceCsvFiles(survey, sourceCsvFile, destinationFolder, randomizeLines, randomizeUsingColumnValues, filesToDivideInto); + File dest = produceCsvFiles.divideIntoFiles(); try { - if (kmlImportService.prompToOpenKml(getFrame())) { - restartEarth(); - } - } catch (Exception e1) { - JOptionPane.showMessageDialog(getFrame(), e1.getMessage(), - Messages.getString("CollectEarthWindow.63"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - logger.error("Error importing KML file", e1); //$NON-NLS-1$ + CollectEarthUtils.openFolderInExplorer( dest.getAbsolutePath() ); + } catch (IOException e1) { + logger.error(" Error opening the destination folder", e); } - - } - - }); - serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is - // acting as a client ) - toolsMenu.add(menuItem); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.67")); //$NON-NLS-1$ - menuItem.addActionListener( e-> { - try { - CollectEarthUtils.openFolderInExplorer(FolderFinder.getCollectEarthDataFolder()); - } catch (IOException e1) { - logger.error("Could not find the data folder", e1); - } - }); - serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is - // acting as a client ) - toolsMenu.add(menuItem); - - toolsMenu.addSeparator(); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.15")); //$NON-NLS-1$ - menuItem.addActionListener(getPropertiesAction(frame)); - toolsMenu.add(menuItem); - toolsMenu.add(getUtilitiesMenu() ); - - toolsMenu.addSeparator(); - toolsMenu.add(getLanguageMenu()); - return toolsMenu; - } - - private JMenu getUtilitiesMenu() { - JMenuItem menuItem; - JMenu utilities = new JMenu(Messages.getString("CollectEarthMenu.2")); //$NON-NLS-1$ - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.18")); //$NON-NLS-1$ - menuItem.addActionListener(new MissingPlotsListener(frame, localPropertiesService, missingPlotService)); - serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is - // acting as a client ) - - utilities.add(menuItem); - - menuItem = new JMenuItem(Messages.getString("CollectEarthMenu.3")); //$NON-NLS-1$ - menuItem.addActionListener( e -> FileDividerToolDlg.open(frame, earthSurveyService.getCollectSurvey()) ); - serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is // acting as a client ) - utilities.add(menuItem); - - menuItem = new JMenuItem("Delete Plots from DB using CSV"); - menuItem.addActionListener( e -> removePlotsFromDBDlg.open(frame, earthSurveyService.getCollectSurvey()) ); - utilities.add(menuItem); - - - utilities.add(menuItem); - return utilities; + }); + } + return generateGrids; } - private JMenu getFileMenu() { - JMenu fileMenu = new JMenu(Messages.getString("CollectEarthWindow.10")); //$NON-NLS-1$ + private JFilePicker getOutputFolder() { + if( outputFolder == null ){ + outputFolder = new JFilePicker("Select the output folder" , null, "Select...", DlgMode.MODE_SAVE); + outputFolder.getFileChooser().setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + outputFolder.setEnabled(false); - JMenuItem menuItem = new JMenuItem(Messages.getString("CollectEarthMenu.0")); //$NON-NLS-1$ - menuItem.addActionListener(new ApplyOptionChangesListener(this.getFrame(), localPropertiesService) { + outputFolder.addChangeListener( new DocumentListener() { - @Override - protected void applyProperties() { - final File[] selectedProjectFile = JFileChooserExistsAware.getFileChooserResults( - DataFormat.PROJECT_DEFINITION_FILE, false, false, null, localPropertiesService, - getFrame() ); + @Override + public void removeUpdate(DocumentEvent e) { + // No need to do anything + } - if (selectedProjectFile != null && selectedProjectFile.length == 1) { - try { - projectsService.loadCompressedProjectFile(selectedProjectFile[0]); + @Override + public void insertUpdate(DocumentEvent e) { + String outputFolderPath = outputFolder.getSelectedFilePath(); + File out = new File( outputFolderPath ); + getGenerateButton().setEnabled(out.exists() ); + } - restartEarth(); - } catch (Exception e1) { - JOptionPane.showMessageDialog( getFrame(), e1.getMessage(), - Messages.getString("OptionWizard.51"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - logger.error("Error importing project file " + selectedProjectFile[0].getAbsolutePath(), e1); //$NON-NLS-1$ - } + @Override + public void changedUpdate(DocumentEvent e) { + // No need to react to the update } - } - }); - fileMenu.add(menuItem); - this.add(fileMenu); - fileMenu.addSeparator(); - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.11")); //$NON-NLS-1$ - menuItem.addActionListener(collectEarthWindow.getCloseActionListener()); - fileMenu.add(menuItem); - return fileMenu; + }); + } + return outputFolder; } - private void addImportExportMenu(JMenu menu) { - - final JMenu ieSubmenu = new JMenu(Messages.getString("CollectEarthWindow.44")); //$NON-NLS-1$ - JMenuItem menuItem; - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.13")); //$NON-NLS-1$ - menuItem.addActionListener(getExportActionListener(DataFormat.CSV, RecordsToExport.ALL)); - ieSubmenu.add(menuItem); - - final JMenu xmlExportSubmenu = new JMenu(Messages.getString("CollectEarthWindow.24")); //$NON-NLS-1$ - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.45")); //$NON-NLS-1$ - menuItem.addActionListener(getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.ALL)); - xmlExportSubmenu.add(menuItem); - - final JMenuItem exportModifiedRecords = new JMenuItem(Messages.getString("CollectEarthWindow.61")); //$NON-NLS-1$ - exportModifiedRecords.addActionListener( - getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.MODIFIED_SINCE_LAST_EXPORT)); - xmlExportSubmenu.add(exportModifiedRecords); - - final JMenuItem exportDataRangeRecords = new JMenuItem(Messages.getString("CollectEarthMenu.4")); //$NON-NLS-1$ - exportDataRangeRecords - .addActionListener(getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.PICK_FROM_DATE)); - xmlExportSubmenu.add(exportDataRangeRecords); - ieSubmenu.add(xmlExportSubmenu); - - final JMenu backupExportSubmenu = new JMenu(Messages.getString("CollectEarthMenu.5")); //$NON-NLS-1$ - - final JMenuItem exportDataBackup = new JMenuItem(Messages.getString("CollectEarthMenu.6")); //$NON-NLS-1$ - exportDataBackup.addActionListener(getExportActionListener(DataFormat.COLLECT_BACKUP, RecordsToExport.ALL)); - backupExportSubmenu.add(exportDataBackup); - - final JMenuItem exportDataRangeBackup = new JMenuItem(Messages.getString("CollectEarthMenu.7")); //$NON-NLS-1$ - exportDataRangeBackup - .addActionListener(getExportActionListener(DataFormat.COLLECT_BACKUP, RecordsToExport.PICK_FROM_DATE)); - backupExportSubmenu.add(exportDataRangeBackup); - - ieSubmenu.add(backupExportSubmenu); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.6")); //$NON-NLS-1$ - menuItem.addActionListener(getExportActionListener(DataFormat.FUSION, RecordsToExport.ALL)); - ieSubmenu.add(menuItem); + private void enableOtherControls(boolean validFile) { + getRandomSelector().setEnabled( true ); + getColumnSelector().setEnabled(validFile); + getNumberOfFilesSelector().setEnabled(true); + getOutputFolder().setEnabled(true); + setColumns( validFile ); + } - ieSubmenu.addSeparator(); - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.46")); //$NON-NLS-1$ - menuItem.addActionListener(getImportActionListener(DataFormat.ZIP_WITH_XML)); - ieSubmenu.add(menuItem); + private void setColumns( boolean validFile){ + if( validFile ){ + CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.55")); //$NON-NLS-1$ - menuItem.addActionListener(getImportActionListener(DataFormat.CSV)); - ieSubmenu.add(menuItem); + List expectedHeaders = cegtg.getExpectedHeaders(survey); + CsvColumn[] columns = new CsvColumn[ expectedHeaders.size()+1 ]; + CsvColumn column = new CsvColumn(null,"DO NOT STRATIFY"); + columns[0] = column; - menu.add(ieSubmenu); + int i = 0; + for (String header : expectedHeaders) { + column = new CsvColumn(i++,"Use :" + header); + columns[i] = column; + } - serverMenuItems.add(ieSubmenu); // This menu should only be shown if the DB is local ( not if Collect Earth is - // acting as a client ) + getColumnSelector().setModel( new DefaultComboBoxModel( columns )); + }else{ + getColumnSelector().setModel( new DefaultComboBoxModel()); + } } - private String getDisclaimerFilePath() { - final String suffixLang = localPropertiesService.getUiLanguage().getLocale().getLanguage(); - if (new File("resources/disclaimer_" + suffixLang + ".txt").exists()) { //$NON-NLS-1$ //$NON-NLS-2$ - return "resources/disclaimer_" + suffixLang + ".txt"; - } else { - return "resources/disclaimer_en.txt"; + + private JComboBox getColumnSelector() { + if( csvColumns == null ){ + csvColumns = new JComboBox<>(); + csvColumns.setEnabled(false); } + return csvColumns; } - private ActionListener getExportActionListener(final DataFormat exportFormat, final RecordsToExport xmlExportType) { - return new ExportActionListener(exportFormat, xmlExportType, getFrame(), localPropertiesService, - dataImportExportService, earthSurveyService); + private JCheckBox getRandomSelector() { + if( randomSelector == null ){ + randomSelector = new JCheckBox("Randomize the order of the lines from the source CSV file" , false); + randomSelector.setEnabled( false); + } + return randomSelector; } - private ActionListener getImportActionListener(final DataFormat importFormat) { - return new ImportActionListener(importFormat, getFrame(), localPropertiesService, dataImportExportService); + private JComboBox getNumberOfFilesSelector() { + if( numberOfFiles == null ){ + Integer[] items = new Integer[MAX_FILES]; + for (int i =1; i<= MAX_FILES; i++) { + items[i-1] = Integer.valueOf(i); + } + numberOfFiles = new JComboBox<>(items); + numberOfFiles.setEnabled( false ); + } + return numberOfFiles; } - private JMenu getLanguageMenu() { + private JFilePicker getCsvFilePicker() { + if( filePicker == null ){ + filePicker = new JFilePicker("Choose the CSV file with the sampling design (plots)", null, "Explore", DlgMode.MODE_OPEN); - final ActionListener actionLanguage = e -> { - try { - final String langName = ((JRadioButtonMenuItem) e.getSource()).getName(); - final UI_LANGUAGE language = UI_LANGUAGE.valueOf(langName); - CollectEarthUtils.setFontDependingOnLanguaue(language); - localPropertiesService.setUiLanguage(language); + filePicker.getFileChooser().setAcceptAllFileFilterUsed(false); + filePicker.addFileTypeFilter("csv", " CSV file with plot (sampling design)", true); - SwingUtilities.invokeLater( () -> { - getFrame().getContentPane().removeAll(); - getFrame().dispose(); - collectEarthWindow.openWindow(); - }); + filePicker.addChangeListener( new DocumentListener() { - } catch (final Exception ex) { - logger.error("Error while changing language", ex); //$NON-NLS-1$ - } - }; + @Override + public void removeUpdate(DocumentEvent e) { + // No need to validate + } - final JMenu menuLanguage = new JMenu(Messages.getString("CollectEarthWindow.2")); //$NON-NLS-1$ + @Override + public void insertUpdate(DocumentEvent e) { + validateCsv( filePicker.getTextField().getText() ); + } - final ButtonGroup group = new ButtonGroup(); - final UI_LANGUAGE[] languages = UI_LANGUAGE.values(); + private boolean validateCsv(String filePath) { + boolean validFile = true; + try { - for (final UI_LANGUAGE language : languages) { - final JRadioButtonMenuItem langItem = new JRadioButtonMenuItem(language.getLabel()); - langItem.setName(language.name()); - langItem.addActionListener(actionLanguage); - menuLanguage.add(langItem); - group.add(menuLanguage); - if (localPropertiesService.getUiLanguage().equals(language)) { - langItem.setSelected(true); - } + filePicker.setTextBackground( Color.white); + + if( CsvReaderUtils.isCsvFile( filePath )){ + CollectEarthGridTemplateGenerator cetg = new CollectEarthGridTemplateGenerator(); + + File csvFile = new File( filePath ); + ValidationParameters validationParameters = new ValidationParameters(); + validationParameters.setValidateOnlyFirstLines(false); + CSVFileValidationResult validationResults = cetg.validate(csvFile, survey, validationParameters ); + + validFile = validationResults.isSuccessful(); + if( + !validFile + // If the message is that there are too many rows then we ignore the validation! + && ( + validationResults.getErrorType().equals( ErrorType.INVALID_NUMBER_OF_PLOTS_TOO_LARGE) + || + validationResults.getErrorType().equals( ErrorType.INVALID_NUMBER_OF_PLOTS_WARNING) + ) + ){ + validFile = true; + + } + + if( !validFile ){ + filePicker.setTextBackground( Color.yellow); + switch ( validationResults.getErrorType() ) { + case INVALID_FILE_TYPE: + filePicker.setTextBackground( Color.red); + JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), "The expected file type is CSV or CED ", "Expected File Type", JOptionPane.ERROR_MESSAGE); + break; + + case INVALID_HEADERS: + JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), String.format("The expected columns in the CSV for the survey %s are %s", survey.getName(), validationResults.getExpectedHeaders() ) , "Columns in CSV do not match survey", JOptionPane.ERROR_MESSAGE); + break; + + case INVALID_NUMBER_OF_COLUMNS: + JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), String.format("The number of columns in the CSV file do not coincide with the expercted columns expected for the survey %s /n%s", survey.getName(), validationResults.getExpectedHeaders() ), "Expected File Type", JOptionPane.ERROR_MESSAGE); + break; + + case INVALID_VALUES_IN_CSV: + // IN THIS CASE THE CELL RENDERER TAKES CARE OF HIGHLIGHTING THE CELLS!!! + JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), "The content of the CSV file is not correct!! The values on some cells are incorrect for the survey " + survey.getName() , "CSV content is not correct", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + break; + + default: + break; + } + } + + enableOtherControls( validFile ); + + }else{ + + JOptionPane.showMessageDialog(FileDividerToolDlg.this, String.format("The file in %s is NOT A CSV file ", filePath) ); + filePicker.setTextBackground( Color.red); + } + } catch (Exception e) { + JOptionPane.showMessageDialog(FileDividerToolDlg.this, String.format("The file in %s is NOT A CSV file ", filePath) ); + logger.error( "Error while validating the CSV file", e); + validFile = false; + } + return validFile; + } + @Override + public void changedUpdate(DocumentEvent e) { + validateCsv( filePicker.getTextField().getText() ); + } + }); } - - return menuLanguage; - } - - public ActionListener getPropertiesAction(final JFrame owner) { - return e -> { - final JDialog dialog = new PropertiesDialog(owner, localPropertiesService, earthProjectsService, - backupSqlLiteService.getAutomaticBackUpFolder().getPath(), analysisSaikuService, - earthSurveyService.getCollectSurvey()); - dialog.setVisible(true); - dialog.pack(); - }; + return filePicker ; } - private ActionListener getSaikuAnalysisActionListener() { - return new GenerateRDBAnalysisListener(getFrame(), new GenerateDatabaseStarter(analysisSaikuService, getFrame() ) ); - } - - private ActionListener getSaikuToolExportActionListener() { - return new SaikuToolExportListener(getFrame(), new GenerateDatabaseStarter(analysisSaikuService, getFrame() ), localPropertiesService); - } - - - private ActionListener getIPCCExportActionListener() { - return new IPCCGeneratorListener(getFrame(), new GenerateDatabaseStarter(ipccGeneratorService, getFrame() ) ); - } - - private String getLogFilePath() { - return FolderFinder.getCollectEarthDataFolder() + "/earth_error.log"; //$NON-NLS-1$ - } - - public JFrame getFrame() { - return frame; - } - - public void setFrame(JFrame frame) { - this.frame = frame; - } - - public List getServerMenuItems() { - return serverMenuItems; - } } From a641d0bb9c962eaf0f17da861ceb352a92843a1d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:43 +0100 Subject: [PATCH 1168/1620] New translations FileDividerToolDlg.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 347 +++++++++++++++--- 1 file changed, 302 insertions(+), 45 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 0ccb8f2366..d275a15df8 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,67 +1,324 @@ package org.openforis.collect.earth.app.view; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; import java.io.File; +import java.io.IOException; +import java.util.List; -import javax.swing.JFrame; -import javax.swing.ProgressMonitor; +import javax.swing.DefaultComboBoxModel; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JDialog; +import javax.swing.JFileChooser; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.view.ExportActionListener.RecordsToExport; -import org.openforis.collect.io.data.DataExportStatus; -import org.openforis.collect.manager.process.AbstractProcess; - -public class ExportProcessMonitorDialog extends ProcessMonitorDialog { - - - private RecordsToExport recordsToExport; - private DataFormat exportFormat; - private EarthSurveyService earthSurveyService; - private LocalPropertiesService localPropertiesService; - private File exportToFile; - - public ExportProcessMonitorDialog(AbstractProcess exportProcess, JFrame parentFrame, RecordsToExport recordsToExport, DataFormat exportFormat, EarthSurveyService earthSurveyService, File exportToFile, LocalPropertiesService localPropertiesService ) { - super(); - this.process = exportProcess; - this.recordsToExport = recordsToExport; - this.exportFormat = exportFormat; - this.earthSurveyService = earthSurveyService; - this.exportToFile = exportToFile; - this.localPropertiesService = localPropertiesService; - progressMonitor = new ProgressMonitor(parentFrame, Messages.getString("ExportDialogProcessMonitor.0"), Messages.getString("ExportDialogProcessMonitor.1"), 0, 100); //$NON-NLS-1$ //$NON-NLS-2$ - progressMonitor.setMillisToPopup(1000); - +import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.collect.earth.sampler.utils.ProduceCsvFiles; +import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult; +import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult.ErrorType; +import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; +import org.openforis.collect.manager.validation.SurveyValidator.ValidationParameters; +import org.openforis.collect.model.CollectSurvey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class FileDividerToolDlg extends JDialog{ + + private static final long serialVersionUID = 2241706750062961024L; + private static final int MAX_FILES = 500; + private CollectSurvey survey; + private transient Logger logger = LoggerFactory.getLogger( FileDividerToolDlg.class); + private JComboBox numberOfFiles ; + private JCheckBox randomSelector; + private JComboBox csvColumns; + private JFilePicker outputFolder; + private JButton generateGrids; + private JFilePicker filePicker; + + public static void open( Frame owner, CollectSurvey survey){ + FileDividerToolDlg dlg = new FileDividerToolDlg(owner, survey); + dlg.setVisible(true); } - protected String getProcessActionMessage() { - return Messages.getString("ExportDialogProcessMonitor.4"); //$NON-NLS-1$ + public FileDividerToolDlg( Frame owner,CollectSurvey survey ) { + super(owner); + this.survey = survey; + this.setModal(true); + this.setSize( new Dimension(700, 350)); + this.setLocationRelativeTo( owner ); + this.setTitle("Tool for dividing large CSV into smaller ones"); + initLayout(); } - @Override - public void run() { + private void initLayout() { + final JPanel panel = new JPanel(new GridBagLayout()); + GridBagConstraints c = new GridBagConstraints(); + + int row = 0; + + c.fill = GridBagConstraints.BOTH; + c.gridx = 0; + c.gridwidth = 2; + c.gridy = row++; + + panel.add( getCsvFilePicker(), c ); + c.gridwidth = 1; + c.gridy = row++; + + c.gridx = 0; + + panel.add( new JLabel("Number of files to split the CSV into"), c ); + + c.gridx = 1; + panel.add( getNumberOfFilesSelector(), c ); - try { - monitorProgress(); - process.call(); - if( process.getStatus().isComplete() && exportFormat.equals( DataFormat.ZIP_WITH_XML ) && recordsToExport.equals(RecordsToExport.MODIFIED_SINCE_LAST_EXPORT) ){ - String surveyName = ""; //$NON-NLS-1$ - if( earthSurveyService.getCollectSurvey()!= null ){ - surveyName = earthSurveyService.getCollectSurvey().getName(); + c.gridx = 0; + c.gridy = row++; + c.gridwidth = 2; + panel.add( getRandomSelector(), c ); + + c.gridy = row++; + c.gridx = 0; + c.gridwidth = 1; + panel.add( new JLabel("Split files by strata (values of the column i.e : region )"), c ); + + c.gridx = 1; + panel.add( getColumnSelector(), c ); + + c.gridx = 0; + c.gridy = row++; + c.gridwidth = 2; + panel.add( getOutputFolder(), c ); + + c.gridx = 0; + c.gridy = row; + + panel.add( getGenerateButton(), c ); + + this.add(panel); + } + + private JButton getGenerateButton() { + if( generateGrids == null ){ + generateGrids = new JButton("Divide file"); + generateGrids.setEnabled( false ); + generateGrids.addActionListener( e -> { + String sourceCsvFile = getCsvFilePicker().getSelectedFilePath(); + String destinationFolder = getOutputFolder().getSelectedFilePath(); + boolean randomizeLines = getRandomSelector().isSelected(); + Integer randomizeUsingColumnValues = null; + if( ( (CsvColumn) getColumnSelector().getSelectedItem() )!=null ){ + randomizeUsingColumnValues = ( (CsvColumn) getColumnSelector().getSelectedItem() ).getPos(); } - localPropertiesService.setLastExportedDate( surveyName ); + Integer filesToDivideInto = getNumberOfFilesSelector().getSelectedIndex()+1; + ProduceCsvFiles produceCsvFiles = new ProduceCsvFiles(survey, sourceCsvFile, destinationFolder, randomizeLines, randomizeUsingColumnValues, filesToDivideInto); + File dest = produceCsvFiles.divideIntoFiles(); - } + try { + CollectEarthUtils.openFolderInExplorer( dest.getAbsolutePath() ); + } catch (IOException e1) { + logger.error(" Error opening the destination folder", e); + } + }); + } + return generateGrids; + } + + private JFilePicker getOutputFolder() { + if( outputFolder == null ){ + outputFolder = new JFilePicker("Select the output folder" , null, "Select...", DlgMode.MODE_SAVE); + outputFolder.getFileChooser().setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + outputFolder.setEnabled(false); + + outputFolder.addChangeListener( new DocumentListener() { + + @Override + public void removeUpdate(DocumentEvent e) { + // No need to do anything + } + + @Override + public void insertUpdate(DocumentEvent e) { + String outputFolderPath = outputFolder.getSelectedFilePath(); + File out = new File( outputFolderPath ); + getGenerateButton().setEnabled(out.exists() ); + } + + @Override + public void changedUpdate(DocumentEvent e) { + // No need to react to the update + } + }); + } + return outputFolder; + } + + + private void enableOtherControls(boolean validFile) { + getRandomSelector().setEnabled( true ); + getColumnSelector().setEnabled(validFile); + getNumberOfFilesSelector().setEnabled(true); + getOutputFolder().setEnabled(true); + setColumns( validFile ); + } + + + private void setColumns( boolean validFile){ + if( validFile ){ + CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); - if( process.getStatus().isComplete() && ( exportFormat.equals( DataFormat.CSV ) || exportFormat.equals( DataFormat.FUSION ) || exportFormat.equals( DataFormat.KML_FILE ) ) ) { - CollectEarthUtils.openFile( exportToFile ); + List expectedHeaders = cegtg.getExpectedHeaders(survey); + CsvColumn[] columns = new CsvColumn[ expectedHeaders.size()+1 ]; + CsvColumn column = new CsvColumn(null,"DO NOT STRATIFY"); + columns[0] = column; + + int i = 0; + for (String header : expectedHeaders) { + column = new CsvColumn(i++,"Use :" + header); + columns[i] = column; } - } catch (final Exception e) { - logger.error("Error starting the process", e); //$NON-NLS-1$ + getColumnSelector().setModel( new DefaultComboBoxModel( columns )); + }else{ + getColumnSelector().setModel( new DefaultComboBoxModel()); + } + } + + + private JComboBox getColumnSelector() { + if( csvColumns == null ){ + csvColumns = new JComboBox<>(); + csvColumns.setEnabled(false); } + return csvColumns; + } + + private JCheckBox getRandomSelector() { + if( randomSelector == null ){ + randomSelector = new JCheckBox("Randomize the order of the lines from the source CSV file" , false); + randomSelector.setEnabled( false); + } + return randomSelector; + } + private JComboBox getNumberOfFilesSelector() { + if( numberOfFiles == null ){ + Integer[] items = new Integer[MAX_FILES]; + for (int i =1; i<= MAX_FILES; i++) { + items[i-1] = Integer.valueOf(i); + } + numberOfFiles = new JComboBox<>(items); + numberOfFiles.setEnabled( false ); + } + return numberOfFiles; } + private JFilePicker getCsvFilePicker() { + if( filePicker == null ){ + filePicker = new JFilePicker("Choose the CSV file with the sampling design (plots)", null, "Explore", DlgMode.MODE_OPEN); + + filePicker.getFileChooser().setAcceptAllFileFilterUsed(false); + filePicker.addFileTypeFilter("csv", " CSV file with plot (sampling design)", true); + + filePicker.addChangeListener( new DocumentListener() { + + @Override + public void removeUpdate(DocumentEvent e) { + // No need to validate + } + + @Override + public void insertUpdate(DocumentEvent e) { + validateCsv( filePicker.getTextField().getText() ); + } + + private boolean validateCsv(String filePath) { + boolean validFile = true; + try { + + filePicker.setTextBackground( Color.white); + + if( CsvReaderUtils.isCsvFile( filePath )){ + CollectEarthGridTemplateGenerator cetg = new CollectEarthGridTemplateGenerator(); + + File csvFile = new File( filePath ); + ValidationParameters validationParameters = new ValidationParameters(); + validationParameters.setValidateOnlyFirstLines(false); + CSVFileValidationResult validationResults = cetg.validate(csvFile, survey, validationParameters ); + + validFile = validationResults.isSuccessful(); + if( + !validFile + // If the message is that there are too many rows then we ignore the validation! + && ( + validationResults.getErrorType().equals( ErrorType.INVALID_NUMBER_OF_PLOTS_TOO_LARGE) + || + validationResults.getErrorType().equals( ErrorType.INVALID_NUMBER_OF_PLOTS_WARNING) + ) + ){ + validFile = true; + + } + + if( !validFile ){ + filePicker.setTextBackground( Color.yellow); + switch ( validationResults.getErrorType() ) { + case INVALID_FILE_TYPE: + filePicker.setTextBackground( Color.red); + JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), "The expected file type is CSV or CED ", "Expected File Type", JOptionPane.ERROR_MESSAGE); + break; + + case INVALID_HEADERS: + JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), String.format("The expected columns in the CSV for the survey %s are %s", survey.getName(), validationResults.getExpectedHeaders() ) , "Columns in CSV do not match survey", JOptionPane.ERROR_MESSAGE); + break; + + case INVALID_NUMBER_OF_COLUMNS: + JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), String.format("The number of columns in the CSV file do not coincide with the expercted columns expected for the survey %s /n%s", survey.getName(), validationResults.getExpectedHeaders() ), "Expected File Type", JOptionPane.ERROR_MESSAGE); + break; + + case INVALID_VALUES_IN_CSV: + // IN THIS CASE THE CELL RENDERER TAKES CARE OF HIGHLIGHTING THE CELLS!!! + JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), "The content of the CSV file is not correct!! The values on some cells are incorrect for the survey " + survey.getName() , "CSV content is not correct", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + break; + + default: + break; + } + } + + enableOtherControls( validFile ); + + }else{ + + JOptionPane.showMessageDialog(FileDividerToolDlg.this, String.format("The file in %s is NOT A CSV file ", filePath) ); + filePicker.setTextBackground( Color.red); + } + } catch (Exception e) { + JOptionPane.showMessageDialog(FileDividerToolDlg.this, String.format("The file in %s is NOT A CSV file ", filePath) ); + logger.error( "Error while validating the CSV file", e); + validFile = false; + } + return validFile; + } + + @Override + public void changedUpdate(DocumentEvent e) { + validateCsv( filePicker.getTextField().getText() ); + } + }); + } + return filePicker ; + } } From f574e33ac615f441c9cc7219ef541ee0d09f0a18 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:44 +0100 Subject: [PATCH 1169/1620] New translations FileDividerToolDlg.java (English) --- .../earth/app/view/Messages_en.properties | 347 +++++++++++++++--- 1 file changed, 302 insertions(+), 45 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 0ccb8f2366..d275a15df8 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,67 +1,324 @@ package org.openforis.collect.earth.app.view; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; import java.io.File; +import java.io.IOException; +import java.util.List; -import javax.swing.JFrame; -import javax.swing.ProgressMonitor; +import javax.swing.DefaultComboBoxModel; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JDialog; +import javax.swing.JFileChooser; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.view.ExportActionListener.RecordsToExport; -import org.openforis.collect.io.data.DataExportStatus; -import org.openforis.collect.manager.process.AbstractProcess; - -public class ExportProcessMonitorDialog extends ProcessMonitorDialog { - - - private RecordsToExport recordsToExport; - private DataFormat exportFormat; - private EarthSurveyService earthSurveyService; - private LocalPropertiesService localPropertiesService; - private File exportToFile; - - public ExportProcessMonitorDialog(AbstractProcess exportProcess, JFrame parentFrame, RecordsToExport recordsToExport, DataFormat exportFormat, EarthSurveyService earthSurveyService, File exportToFile, LocalPropertiesService localPropertiesService ) { - super(); - this.process = exportProcess; - this.recordsToExport = recordsToExport; - this.exportFormat = exportFormat; - this.earthSurveyService = earthSurveyService; - this.exportToFile = exportToFile; - this.localPropertiesService = localPropertiesService; - progressMonitor = new ProgressMonitor(parentFrame, Messages.getString("ExportDialogProcessMonitor.0"), Messages.getString("ExportDialogProcessMonitor.1"), 0, 100); //$NON-NLS-1$ //$NON-NLS-2$ - progressMonitor.setMillisToPopup(1000); - +import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.collect.earth.sampler.utils.ProduceCsvFiles; +import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult; +import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult.ErrorType; +import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; +import org.openforis.collect.manager.validation.SurveyValidator.ValidationParameters; +import org.openforis.collect.model.CollectSurvey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class FileDividerToolDlg extends JDialog{ + + private static final long serialVersionUID = 2241706750062961024L; + private static final int MAX_FILES = 500; + private CollectSurvey survey; + private transient Logger logger = LoggerFactory.getLogger( FileDividerToolDlg.class); + private JComboBox numberOfFiles ; + private JCheckBox randomSelector; + private JComboBox csvColumns; + private JFilePicker outputFolder; + private JButton generateGrids; + private JFilePicker filePicker; + + public static void open( Frame owner, CollectSurvey survey){ + FileDividerToolDlg dlg = new FileDividerToolDlg(owner, survey); + dlg.setVisible(true); } - protected String getProcessActionMessage() { - return Messages.getString("ExportDialogProcessMonitor.4"); //$NON-NLS-1$ + public FileDividerToolDlg( Frame owner,CollectSurvey survey ) { + super(owner); + this.survey = survey; + this.setModal(true); + this.setSize( new Dimension(700, 350)); + this.setLocationRelativeTo( owner ); + this.setTitle("Tool for dividing large CSV into smaller ones"); + initLayout(); } - @Override - public void run() { + private void initLayout() { + final JPanel panel = new JPanel(new GridBagLayout()); + GridBagConstraints c = new GridBagConstraints(); + + int row = 0; + + c.fill = GridBagConstraints.BOTH; + c.gridx = 0; + c.gridwidth = 2; + c.gridy = row++; + + panel.add( getCsvFilePicker(), c ); + c.gridwidth = 1; + c.gridy = row++; + + c.gridx = 0; + + panel.add( new JLabel("Number of files to split the CSV into"), c ); + + c.gridx = 1; + panel.add( getNumberOfFilesSelector(), c ); - try { - monitorProgress(); - process.call(); - if( process.getStatus().isComplete() && exportFormat.equals( DataFormat.ZIP_WITH_XML ) && recordsToExport.equals(RecordsToExport.MODIFIED_SINCE_LAST_EXPORT) ){ - String surveyName = ""; //$NON-NLS-1$ - if( earthSurveyService.getCollectSurvey()!= null ){ - surveyName = earthSurveyService.getCollectSurvey().getName(); + c.gridx = 0; + c.gridy = row++; + c.gridwidth = 2; + panel.add( getRandomSelector(), c ); + + c.gridy = row++; + c.gridx = 0; + c.gridwidth = 1; + panel.add( new JLabel("Split files by strata (values of the column i.e : region )"), c ); + + c.gridx = 1; + panel.add( getColumnSelector(), c ); + + c.gridx = 0; + c.gridy = row++; + c.gridwidth = 2; + panel.add( getOutputFolder(), c ); + + c.gridx = 0; + c.gridy = row; + + panel.add( getGenerateButton(), c ); + + this.add(panel); + } + + private JButton getGenerateButton() { + if( generateGrids == null ){ + generateGrids = new JButton("Divide file"); + generateGrids.setEnabled( false ); + generateGrids.addActionListener( e -> { + String sourceCsvFile = getCsvFilePicker().getSelectedFilePath(); + String destinationFolder = getOutputFolder().getSelectedFilePath(); + boolean randomizeLines = getRandomSelector().isSelected(); + Integer randomizeUsingColumnValues = null; + if( ( (CsvColumn) getColumnSelector().getSelectedItem() )!=null ){ + randomizeUsingColumnValues = ( (CsvColumn) getColumnSelector().getSelectedItem() ).getPos(); } - localPropertiesService.setLastExportedDate( surveyName ); + Integer filesToDivideInto = getNumberOfFilesSelector().getSelectedIndex()+1; + ProduceCsvFiles produceCsvFiles = new ProduceCsvFiles(survey, sourceCsvFile, destinationFolder, randomizeLines, randomizeUsingColumnValues, filesToDivideInto); + File dest = produceCsvFiles.divideIntoFiles(); - } + try { + CollectEarthUtils.openFolderInExplorer( dest.getAbsolutePath() ); + } catch (IOException e1) { + logger.error(" Error opening the destination folder", e); + } + }); + } + return generateGrids; + } + + private JFilePicker getOutputFolder() { + if( outputFolder == null ){ + outputFolder = new JFilePicker("Select the output folder" , null, "Select...", DlgMode.MODE_SAVE); + outputFolder.getFileChooser().setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + outputFolder.setEnabled(false); + + outputFolder.addChangeListener( new DocumentListener() { + + @Override + public void removeUpdate(DocumentEvent e) { + // No need to do anything + } + + @Override + public void insertUpdate(DocumentEvent e) { + String outputFolderPath = outputFolder.getSelectedFilePath(); + File out = new File( outputFolderPath ); + getGenerateButton().setEnabled(out.exists() ); + } + + @Override + public void changedUpdate(DocumentEvent e) { + // No need to react to the update + } + }); + } + return outputFolder; + } + + + private void enableOtherControls(boolean validFile) { + getRandomSelector().setEnabled( true ); + getColumnSelector().setEnabled(validFile); + getNumberOfFilesSelector().setEnabled(true); + getOutputFolder().setEnabled(true); + setColumns( validFile ); + } + + + private void setColumns( boolean validFile){ + if( validFile ){ + CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); - if( process.getStatus().isComplete() && ( exportFormat.equals( DataFormat.CSV ) || exportFormat.equals( DataFormat.FUSION ) || exportFormat.equals( DataFormat.KML_FILE ) ) ) { - CollectEarthUtils.openFile( exportToFile ); + List expectedHeaders = cegtg.getExpectedHeaders(survey); + CsvColumn[] columns = new CsvColumn[ expectedHeaders.size()+1 ]; + CsvColumn column = new CsvColumn(null,"DO NOT STRATIFY"); + columns[0] = column; + + int i = 0; + for (String header : expectedHeaders) { + column = new CsvColumn(i++,"Use :" + header); + columns[i] = column; } - } catch (final Exception e) { - logger.error("Error starting the process", e); //$NON-NLS-1$ + getColumnSelector().setModel( new DefaultComboBoxModel( columns )); + }else{ + getColumnSelector().setModel( new DefaultComboBoxModel()); + } + } + + + private JComboBox getColumnSelector() { + if( csvColumns == null ){ + csvColumns = new JComboBox<>(); + csvColumns.setEnabled(false); } + return csvColumns; + } + + private JCheckBox getRandomSelector() { + if( randomSelector == null ){ + randomSelector = new JCheckBox("Randomize the order of the lines from the source CSV file" , false); + randomSelector.setEnabled( false); + } + return randomSelector; + } + private JComboBox getNumberOfFilesSelector() { + if( numberOfFiles == null ){ + Integer[] items = new Integer[MAX_FILES]; + for (int i =1; i<= MAX_FILES; i++) { + items[i-1] = Integer.valueOf(i); + } + numberOfFiles = new JComboBox<>(items); + numberOfFiles.setEnabled( false ); + } + return numberOfFiles; } + private JFilePicker getCsvFilePicker() { + if( filePicker == null ){ + filePicker = new JFilePicker("Choose the CSV file with the sampling design (plots)", null, "Explore", DlgMode.MODE_OPEN); + + filePicker.getFileChooser().setAcceptAllFileFilterUsed(false); + filePicker.addFileTypeFilter("csv", " CSV file with plot (sampling design)", true); + + filePicker.addChangeListener( new DocumentListener() { + + @Override + public void removeUpdate(DocumentEvent e) { + // No need to validate + } + + @Override + public void insertUpdate(DocumentEvent e) { + validateCsv( filePicker.getTextField().getText() ); + } + + private boolean validateCsv(String filePath) { + boolean validFile = true; + try { + + filePicker.setTextBackground( Color.white); + + if( CsvReaderUtils.isCsvFile( filePath )){ + CollectEarthGridTemplateGenerator cetg = new CollectEarthGridTemplateGenerator(); + + File csvFile = new File( filePath ); + ValidationParameters validationParameters = new ValidationParameters(); + validationParameters.setValidateOnlyFirstLines(false); + CSVFileValidationResult validationResults = cetg.validate(csvFile, survey, validationParameters ); + + validFile = validationResults.isSuccessful(); + if( + !validFile + // If the message is that there are too many rows then we ignore the validation! + && ( + validationResults.getErrorType().equals( ErrorType.INVALID_NUMBER_OF_PLOTS_TOO_LARGE) + || + validationResults.getErrorType().equals( ErrorType.INVALID_NUMBER_OF_PLOTS_WARNING) + ) + ){ + validFile = true; + + } + + if( !validFile ){ + filePicker.setTextBackground( Color.yellow); + switch ( validationResults.getErrorType() ) { + case INVALID_FILE_TYPE: + filePicker.setTextBackground( Color.red); + JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), "The expected file type is CSV or CED ", "Expected File Type", JOptionPane.ERROR_MESSAGE); + break; + + case INVALID_HEADERS: + JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), String.format("The expected columns in the CSV for the survey %s are %s", survey.getName(), validationResults.getExpectedHeaders() ) , "Columns in CSV do not match survey", JOptionPane.ERROR_MESSAGE); + break; + + case INVALID_NUMBER_OF_COLUMNS: + JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), String.format("The number of columns in the CSV file do not coincide with the expercted columns expected for the survey %s /n%s", survey.getName(), validationResults.getExpectedHeaders() ), "Expected File Type", JOptionPane.ERROR_MESSAGE); + break; + + case INVALID_VALUES_IN_CSV: + // IN THIS CASE THE CELL RENDERER TAKES CARE OF HIGHLIGHTING THE CELLS!!! + JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), "The content of the CSV file is not correct!! The values on some cells are incorrect for the survey " + survey.getName() , "CSV content is not correct", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + break; + + default: + break; + } + } + + enableOtherControls( validFile ); + + }else{ + + JOptionPane.showMessageDialog(FileDividerToolDlg.this, String.format("The file in %s is NOT A CSV file ", filePath) ); + filePicker.setTextBackground( Color.red); + } + } catch (Exception e) { + JOptionPane.showMessageDialog(FileDividerToolDlg.this, String.format("The file in %s is NOT A CSV file ", filePath) ); + logger.error( "Error while validating the CSV file", e); + validFile = false; + } + return validFile; + } + + @Override + public void changedUpdate(DocumentEvent e) { + validateCsv( filePicker.getTextField().getText() ); + } + }); + } + return filePicker ; + } } From 3949ccb4042a64b61f504193e80a17c44bd1000b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:45 +0100 Subject: [PATCH 1170/1620] New translations FileTypeFilter.java (French) --- .../earth/app/view/Messages_fr.properties | 335 ++---------------- 1 file changed, 25 insertions(+), 310 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index d275a15df8..139e1bb847 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,324 +1,39 @@ package org.openforis.collect.earth.app.view; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Frame; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; import java.io.File; -import java.io.IOException; -import java.util.List; -import javax.swing.DefaultComboBoxModel; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JDialog; -import javax.swing.JFileChooser; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; +import javax.swing.filechooser.FileFilter; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.collect.earth.sampler.utils.ProduceCsvFiles; -import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult; -import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult.ErrorType; -import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; -import org.openforis.collect.manager.validation.SurveyValidator.ValidationParameters; -import org.openforis.collect.model.CollectSurvey; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ +public class FileTypeFilter extends FileFilter { -public class FileDividerToolDlg extends JDialog{ + private String extension; + private String description; - private static final long serialVersionUID = 2241706750062961024L; - private static final int MAX_FILES = 500; - private CollectSurvey survey; - private transient Logger logger = LoggerFactory.getLogger( FileDividerToolDlg.class); - private JComboBox numberOfFiles ; - private JCheckBox randomSelector; - private JComboBox csvColumns; - private JFilePicker outputFolder; - private JButton generateGrids; - private JFilePicker filePicker; - - public static void open( Frame owner, CollectSurvey survey){ - FileDividerToolDlg dlg = new FileDividerToolDlg(owner, survey); - dlg.setVisible(true); - } - - public FileDividerToolDlg( Frame owner,CollectSurvey survey ) { - super(owner); - this.survey = survey; - this.setModal(true); - this.setSize( new Dimension(700, 350)); - this.setLocationRelativeTo( owner ); - this.setTitle("Tool for dividing large CSV into smaller ones"); - initLayout(); - } - - private void initLayout() { - final JPanel panel = new JPanel(new GridBagLayout()); - GridBagConstraints c = new GridBagConstraints(); - - int row = 0; - - c.fill = GridBagConstraints.BOTH; - c.gridx = 0; - c.gridwidth = 2; - c.gridy = row++; - - panel.add( getCsvFilePicker(), c ); - c.gridwidth = 1; - c.gridy = row++; - - c.gridx = 0; - - panel.add( new JLabel("Number of files to split the CSV into"), c ); - - c.gridx = 1; - panel.add( getNumberOfFilesSelector(), c ); - - c.gridx = 0; - c.gridy = row++; - c.gridwidth = 2; - panel.add( getRandomSelector(), c ); - - c.gridy = row++; - c.gridx = 0; - c.gridwidth = 1; - panel.add( new JLabel("Split files by strata (values of the column i.e : region )"), c ); - - c.gridx = 1; - panel.add( getColumnSelector(), c ); - - c.gridx = 0; - c.gridy = row++; - c.gridwidth = 2; - panel.add( getOutputFolder(), c ); - - c.gridx = 0; - c.gridy = row; - - panel.add( getGenerateButton(), c ); - - this.add(panel); - } - - private JButton getGenerateButton() { - if( generateGrids == null ){ - generateGrids = new JButton("Divide file"); - generateGrids.setEnabled( false ); - generateGrids.addActionListener( e -> { - String sourceCsvFile = getCsvFilePicker().getSelectedFilePath(); - String destinationFolder = getOutputFolder().getSelectedFilePath(); - boolean randomizeLines = getRandomSelector().isSelected(); - Integer randomizeUsingColumnValues = null; - if( ( (CsvColumn) getColumnSelector().getSelectedItem() )!=null ){ - randomizeUsingColumnValues = ( (CsvColumn) getColumnSelector().getSelectedItem() ).getPos(); - } - Integer filesToDivideInto = getNumberOfFilesSelector().getSelectedIndex()+1; - ProduceCsvFiles produceCsvFiles = new ProduceCsvFiles(survey, sourceCsvFile, destinationFolder, randomizeLines, randomizeUsingColumnValues, filesToDivideInto); - File dest = produceCsvFiles.divideIntoFiles(); - - try { - CollectEarthUtils.openFolderInExplorer( dest.getAbsolutePath() ); - } catch (IOException e1) { - logger.error(" Error opening the destination folder", e); - } - }); - } - return generateGrids; - } - - private JFilePicker getOutputFolder() { - if( outputFolder == null ){ - outputFolder = new JFilePicker("Select the output folder" , null, "Select...", DlgMode.MODE_SAVE); - outputFolder.getFileChooser().setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); - outputFolder.setEnabled(false); - - outputFolder.addChangeListener( new DocumentListener() { - - @Override - public void removeUpdate(DocumentEvent e) { - // No need to do anything - } - - @Override - public void insertUpdate(DocumentEvent e) { - String outputFolderPath = outputFolder.getSelectedFilePath(); - File out = new File( outputFolderPath ); - getGenerateButton().setEnabled(out.exists() ); - } - - @Override - public void changedUpdate(DocumentEvent e) { - // No need to react to the update - } - }); - } - return outputFolder; - } - - - private void enableOtherControls(boolean validFile) { - getRandomSelector().setEnabled( true ); - getColumnSelector().setEnabled(validFile); - getNumberOfFilesSelector().setEnabled(true); - getOutputFolder().setEnabled(true); - setColumns( validFile ); - } - - - private void setColumns( boolean validFile){ - if( validFile ){ - CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); - - List expectedHeaders = cegtg.getExpectedHeaders(survey); - CsvColumn[] columns = new CsvColumn[ expectedHeaders.size()+1 ]; - CsvColumn column = new CsvColumn(null,"DO NOT STRATIFY"); - columns[0] = column; - - int i = 0; - for (String header : expectedHeaders) { - column = new CsvColumn(i++,"Use :" + header); - columns[i] = column; - } - - getColumnSelector().setModel( new DefaultComboBoxModel( columns )); - }else{ - getColumnSelector().setModel( new DefaultComboBoxModel()); - } + public FileTypeFilter(String extension, String description) { + this.extension = extension; + this.description = description; } - - private JComboBox getColumnSelector() { - if( csvColumns == null ){ - csvColumns = new JComboBox<>(); - csvColumns.setEnabled(false); + @Override + public boolean accept(File file) { + if (file.isDirectory()) { + return true; } - return csvColumns; - } - - private JCheckBox getRandomSelector() { - if( randomSelector == null ){ - randomSelector = new JCheckBox("Randomize the order of the lines from the source CSV file" , false); - randomSelector.setEnabled( false); + boolean accepted = false; + String[] extensions = extension.split(","); //$NON-NLS-1$ + for (String item : extensions) { + accepted = accepted || file.getName().toLowerCase().endsWith(item); } - return randomSelector; + return accepted; + } - private JComboBox getNumberOfFilesSelector() { - if( numberOfFiles == null ){ - Integer[] items = new Integer[MAX_FILES]; - for (int i =1; i<= MAX_FILES; i++) { - items[i-1] = Integer.valueOf(i); - } - numberOfFiles = new JComboBox<>(items); - numberOfFiles.setEnabled( false ); - } - return numberOfFiles; + @Override + public String getDescription() { + return description + String.format(" (*%s)", extension); //$NON-NLS-1$ } - - private JFilePicker getCsvFilePicker() { - if( filePicker == null ){ - filePicker = new JFilePicker("Choose the CSV file with the sampling design (plots)", null, "Explore", DlgMode.MODE_OPEN); - - filePicker.getFileChooser().setAcceptAllFileFilterUsed(false); - filePicker.addFileTypeFilter("csv", " CSV file with plot (sampling design)", true); - - filePicker.addChangeListener( new DocumentListener() { - - @Override - public void removeUpdate(DocumentEvent e) { - // No need to validate - } - - @Override - public void insertUpdate(DocumentEvent e) { - validateCsv( filePicker.getTextField().getText() ); - } - - private boolean validateCsv(String filePath) { - boolean validFile = true; - try { - - filePicker.setTextBackground( Color.white); - - if( CsvReaderUtils.isCsvFile( filePath )){ - CollectEarthGridTemplateGenerator cetg = new CollectEarthGridTemplateGenerator(); - - File csvFile = new File( filePath ); - ValidationParameters validationParameters = new ValidationParameters(); - validationParameters.setValidateOnlyFirstLines(false); - CSVFileValidationResult validationResults = cetg.validate(csvFile, survey, validationParameters ); - - validFile = validationResults.isSuccessful(); - if( - !validFile - // If the message is that there are too many rows then we ignore the validation! - && ( - validationResults.getErrorType().equals( ErrorType.INVALID_NUMBER_OF_PLOTS_TOO_LARGE) - || - validationResults.getErrorType().equals( ErrorType.INVALID_NUMBER_OF_PLOTS_WARNING) - ) - ){ - validFile = true; - - } - - if( !validFile ){ - filePicker.setTextBackground( Color.yellow); - switch ( validationResults.getErrorType() ) { - case INVALID_FILE_TYPE: - filePicker.setTextBackground( Color.red); - JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), "The expected file type is CSV or CED ", "Expected File Type", JOptionPane.ERROR_MESSAGE); - break; - - case INVALID_HEADERS: - JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), String.format("The expected columns in the CSV for the survey %s are %s", survey.getName(), validationResults.getExpectedHeaders() ) , "Columns in CSV do not match survey", JOptionPane.ERROR_MESSAGE); - break; - - case INVALID_NUMBER_OF_COLUMNS: - JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), String.format("The number of columns in the CSV file do not coincide with the expercted columns expected for the survey %s /n%s", survey.getName(), validationResults.getExpectedHeaders() ), "Expected File Type", JOptionPane.ERROR_MESSAGE); - break; - - case INVALID_VALUES_IN_CSV: - // IN THIS CASE THE CELL RENDERER TAKES CARE OF HIGHLIGHTING THE CELLS!!! - JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), "The content of the CSV file is not correct!! The values on some cells are incorrect for the survey " + survey.getName() , "CSV content is not correct", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - break; - - default: - break; - } - } - - enableOtherControls( validFile ); - - }else{ - - JOptionPane.showMessageDialog(FileDividerToolDlg.this, String.format("The file in %s is NOT A CSV file ", filePath) ); - filePicker.setTextBackground( Color.red); - } - } catch (Exception e) { - JOptionPane.showMessageDialog(FileDividerToolDlg.this, String.format("The file in %s is NOT A CSV file ", filePath) ); - logger.error( "Error while validating the CSV file", e); - validFile = false; - } - return validFile; - } - - @Override - public void changedUpdate(DocumentEvent e) { - validateCsv( filePicker.getTextField().getText() ); - } - }); - } - return filePicker ; - } - -} +} \ No newline at end of file From d17cc1994c36318207df9c6c43566156f956cd54 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:47 +0100 Subject: [PATCH 1171/1620] New translations FileTypeFilter.java (Spanish) --- .../earth/app/view/Messages_es.properties | 335 ++---------------- 1 file changed, 25 insertions(+), 310 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index d275a15df8..139e1bb847 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,324 +1,39 @@ package org.openforis.collect.earth.app.view; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Frame; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; import java.io.File; -import java.io.IOException; -import java.util.List; -import javax.swing.DefaultComboBoxModel; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JDialog; -import javax.swing.JFileChooser; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; +import javax.swing.filechooser.FileFilter; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.collect.earth.sampler.utils.ProduceCsvFiles; -import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult; -import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult.ErrorType; -import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; -import org.openforis.collect.manager.validation.SurveyValidator.ValidationParameters; -import org.openforis.collect.model.CollectSurvey; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ +public class FileTypeFilter extends FileFilter { -public class FileDividerToolDlg extends JDialog{ + private String extension; + private String description; - private static final long serialVersionUID = 2241706750062961024L; - private static final int MAX_FILES = 500; - private CollectSurvey survey; - private transient Logger logger = LoggerFactory.getLogger( FileDividerToolDlg.class); - private JComboBox numberOfFiles ; - private JCheckBox randomSelector; - private JComboBox csvColumns; - private JFilePicker outputFolder; - private JButton generateGrids; - private JFilePicker filePicker; - - public static void open( Frame owner, CollectSurvey survey){ - FileDividerToolDlg dlg = new FileDividerToolDlg(owner, survey); - dlg.setVisible(true); - } - - public FileDividerToolDlg( Frame owner,CollectSurvey survey ) { - super(owner); - this.survey = survey; - this.setModal(true); - this.setSize( new Dimension(700, 350)); - this.setLocationRelativeTo( owner ); - this.setTitle("Tool for dividing large CSV into smaller ones"); - initLayout(); - } - - private void initLayout() { - final JPanel panel = new JPanel(new GridBagLayout()); - GridBagConstraints c = new GridBagConstraints(); - - int row = 0; - - c.fill = GridBagConstraints.BOTH; - c.gridx = 0; - c.gridwidth = 2; - c.gridy = row++; - - panel.add( getCsvFilePicker(), c ); - c.gridwidth = 1; - c.gridy = row++; - - c.gridx = 0; - - panel.add( new JLabel("Number of files to split the CSV into"), c ); - - c.gridx = 1; - panel.add( getNumberOfFilesSelector(), c ); - - c.gridx = 0; - c.gridy = row++; - c.gridwidth = 2; - panel.add( getRandomSelector(), c ); - - c.gridy = row++; - c.gridx = 0; - c.gridwidth = 1; - panel.add( new JLabel("Split files by strata (values of the column i.e : region )"), c ); - - c.gridx = 1; - panel.add( getColumnSelector(), c ); - - c.gridx = 0; - c.gridy = row++; - c.gridwidth = 2; - panel.add( getOutputFolder(), c ); - - c.gridx = 0; - c.gridy = row; - - panel.add( getGenerateButton(), c ); - - this.add(panel); - } - - private JButton getGenerateButton() { - if( generateGrids == null ){ - generateGrids = new JButton("Divide file"); - generateGrids.setEnabled( false ); - generateGrids.addActionListener( e -> { - String sourceCsvFile = getCsvFilePicker().getSelectedFilePath(); - String destinationFolder = getOutputFolder().getSelectedFilePath(); - boolean randomizeLines = getRandomSelector().isSelected(); - Integer randomizeUsingColumnValues = null; - if( ( (CsvColumn) getColumnSelector().getSelectedItem() )!=null ){ - randomizeUsingColumnValues = ( (CsvColumn) getColumnSelector().getSelectedItem() ).getPos(); - } - Integer filesToDivideInto = getNumberOfFilesSelector().getSelectedIndex()+1; - ProduceCsvFiles produceCsvFiles = new ProduceCsvFiles(survey, sourceCsvFile, destinationFolder, randomizeLines, randomizeUsingColumnValues, filesToDivideInto); - File dest = produceCsvFiles.divideIntoFiles(); - - try { - CollectEarthUtils.openFolderInExplorer( dest.getAbsolutePath() ); - } catch (IOException e1) { - logger.error(" Error opening the destination folder", e); - } - }); - } - return generateGrids; - } - - private JFilePicker getOutputFolder() { - if( outputFolder == null ){ - outputFolder = new JFilePicker("Select the output folder" , null, "Select...", DlgMode.MODE_SAVE); - outputFolder.getFileChooser().setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); - outputFolder.setEnabled(false); - - outputFolder.addChangeListener( new DocumentListener() { - - @Override - public void removeUpdate(DocumentEvent e) { - // No need to do anything - } - - @Override - public void insertUpdate(DocumentEvent e) { - String outputFolderPath = outputFolder.getSelectedFilePath(); - File out = new File( outputFolderPath ); - getGenerateButton().setEnabled(out.exists() ); - } - - @Override - public void changedUpdate(DocumentEvent e) { - // No need to react to the update - } - }); - } - return outputFolder; - } - - - private void enableOtherControls(boolean validFile) { - getRandomSelector().setEnabled( true ); - getColumnSelector().setEnabled(validFile); - getNumberOfFilesSelector().setEnabled(true); - getOutputFolder().setEnabled(true); - setColumns( validFile ); - } - - - private void setColumns( boolean validFile){ - if( validFile ){ - CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); - - List expectedHeaders = cegtg.getExpectedHeaders(survey); - CsvColumn[] columns = new CsvColumn[ expectedHeaders.size()+1 ]; - CsvColumn column = new CsvColumn(null,"DO NOT STRATIFY"); - columns[0] = column; - - int i = 0; - for (String header : expectedHeaders) { - column = new CsvColumn(i++,"Use :" + header); - columns[i] = column; - } - - getColumnSelector().setModel( new DefaultComboBoxModel( columns )); - }else{ - getColumnSelector().setModel( new DefaultComboBoxModel()); - } + public FileTypeFilter(String extension, String description) { + this.extension = extension; + this.description = description; } - - private JComboBox getColumnSelector() { - if( csvColumns == null ){ - csvColumns = new JComboBox<>(); - csvColumns.setEnabled(false); + @Override + public boolean accept(File file) { + if (file.isDirectory()) { + return true; } - return csvColumns; - } - - private JCheckBox getRandomSelector() { - if( randomSelector == null ){ - randomSelector = new JCheckBox("Randomize the order of the lines from the source CSV file" , false); - randomSelector.setEnabled( false); + boolean accepted = false; + String[] extensions = extension.split(","); //$NON-NLS-1$ + for (String item : extensions) { + accepted = accepted || file.getName().toLowerCase().endsWith(item); } - return randomSelector; + return accepted; + } - private JComboBox getNumberOfFilesSelector() { - if( numberOfFiles == null ){ - Integer[] items = new Integer[MAX_FILES]; - for (int i =1; i<= MAX_FILES; i++) { - items[i-1] = Integer.valueOf(i); - } - numberOfFiles = new JComboBox<>(items); - numberOfFiles.setEnabled( false ); - } - return numberOfFiles; + @Override + public String getDescription() { + return description + String.format(" (*%s)", extension); //$NON-NLS-1$ } - - private JFilePicker getCsvFilePicker() { - if( filePicker == null ){ - filePicker = new JFilePicker("Choose the CSV file with the sampling design (plots)", null, "Explore", DlgMode.MODE_OPEN); - - filePicker.getFileChooser().setAcceptAllFileFilterUsed(false); - filePicker.addFileTypeFilter("csv", " CSV file with plot (sampling design)", true); - - filePicker.addChangeListener( new DocumentListener() { - - @Override - public void removeUpdate(DocumentEvent e) { - // No need to validate - } - - @Override - public void insertUpdate(DocumentEvent e) { - validateCsv( filePicker.getTextField().getText() ); - } - - private boolean validateCsv(String filePath) { - boolean validFile = true; - try { - - filePicker.setTextBackground( Color.white); - - if( CsvReaderUtils.isCsvFile( filePath )){ - CollectEarthGridTemplateGenerator cetg = new CollectEarthGridTemplateGenerator(); - - File csvFile = new File( filePath ); - ValidationParameters validationParameters = new ValidationParameters(); - validationParameters.setValidateOnlyFirstLines(false); - CSVFileValidationResult validationResults = cetg.validate(csvFile, survey, validationParameters ); - - validFile = validationResults.isSuccessful(); - if( - !validFile - // If the message is that there are too many rows then we ignore the validation! - && ( - validationResults.getErrorType().equals( ErrorType.INVALID_NUMBER_OF_PLOTS_TOO_LARGE) - || - validationResults.getErrorType().equals( ErrorType.INVALID_NUMBER_OF_PLOTS_WARNING) - ) - ){ - validFile = true; - - } - - if( !validFile ){ - filePicker.setTextBackground( Color.yellow); - switch ( validationResults.getErrorType() ) { - case INVALID_FILE_TYPE: - filePicker.setTextBackground( Color.red); - JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), "The expected file type is CSV or CED ", "Expected File Type", JOptionPane.ERROR_MESSAGE); - break; - - case INVALID_HEADERS: - JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), String.format("The expected columns in the CSV for the survey %s are %s", survey.getName(), validationResults.getExpectedHeaders() ) , "Columns in CSV do not match survey", JOptionPane.ERROR_MESSAGE); - break; - - case INVALID_NUMBER_OF_COLUMNS: - JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), String.format("The number of columns in the CSV file do not coincide with the expercted columns expected for the survey %s /n%s", survey.getName(), validationResults.getExpectedHeaders() ), "Expected File Type", JOptionPane.ERROR_MESSAGE); - break; - - case INVALID_VALUES_IN_CSV: - // IN THIS CASE THE CELL RENDERER TAKES CARE OF HIGHLIGHTING THE CELLS!!! - JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), "The content of the CSV file is not correct!! The values on some cells are incorrect for the survey " + survey.getName() , "CSV content is not correct", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - break; - - default: - break; - } - } - - enableOtherControls( validFile ); - - }else{ - - JOptionPane.showMessageDialog(FileDividerToolDlg.this, String.format("The file in %s is NOT A CSV file ", filePath) ); - filePicker.setTextBackground( Color.red); - } - } catch (Exception e) { - JOptionPane.showMessageDialog(FileDividerToolDlg.this, String.format("The file in %s is NOT A CSV file ", filePath) ); - logger.error( "Error while validating the CSV file", e); - validFile = false; - } - return validFile; - } - - @Override - public void changedUpdate(DocumentEvent e) { - validateCsv( filePicker.getTextField().getText() ); - } - }); - } - return filePicker ; - } - -} +} \ No newline at end of file From 3445b2677ca073dcd89b06392d351443e5e1a239 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:48 +0100 Subject: [PATCH 1172/1620] New translations FileTypeFilter.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 335 ++---------------- 1 file changed, 25 insertions(+), 310 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index d275a15df8..139e1bb847 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,324 +1,39 @@ package org.openforis.collect.earth.app.view; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Frame; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; import java.io.File; -import java.io.IOException; -import java.util.List; -import javax.swing.DefaultComboBoxModel; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JDialog; -import javax.swing.JFileChooser; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; +import javax.swing.filechooser.FileFilter; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.collect.earth.sampler.utils.ProduceCsvFiles; -import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult; -import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult.ErrorType; -import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; -import org.openforis.collect.manager.validation.SurveyValidator.ValidationParameters; -import org.openforis.collect.model.CollectSurvey; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ +public class FileTypeFilter extends FileFilter { -public class FileDividerToolDlg extends JDialog{ + private String extension; + private String description; - private static final long serialVersionUID = 2241706750062961024L; - private static final int MAX_FILES = 500; - private CollectSurvey survey; - private transient Logger logger = LoggerFactory.getLogger( FileDividerToolDlg.class); - private JComboBox numberOfFiles ; - private JCheckBox randomSelector; - private JComboBox csvColumns; - private JFilePicker outputFolder; - private JButton generateGrids; - private JFilePicker filePicker; - - public static void open( Frame owner, CollectSurvey survey){ - FileDividerToolDlg dlg = new FileDividerToolDlg(owner, survey); - dlg.setVisible(true); - } - - public FileDividerToolDlg( Frame owner,CollectSurvey survey ) { - super(owner); - this.survey = survey; - this.setModal(true); - this.setSize( new Dimension(700, 350)); - this.setLocationRelativeTo( owner ); - this.setTitle("Tool for dividing large CSV into smaller ones"); - initLayout(); - } - - private void initLayout() { - final JPanel panel = new JPanel(new GridBagLayout()); - GridBagConstraints c = new GridBagConstraints(); - - int row = 0; - - c.fill = GridBagConstraints.BOTH; - c.gridx = 0; - c.gridwidth = 2; - c.gridy = row++; - - panel.add( getCsvFilePicker(), c ); - c.gridwidth = 1; - c.gridy = row++; - - c.gridx = 0; - - panel.add( new JLabel("Number of files to split the CSV into"), c ); - - c.gridx = 1; - panel.add( getNumberOfFilesSelector(), c ); - - c.gridx = 0; - c.gridy = row++; - c.gridwidth = 2; - panel.add( getRandomSelector(), c ); - - c.gridy = row++; - c.gridx = 0; - c.gridwidth = 1; - panel.add( new JLabel("Split files by strata (values of the column i.e : region )"), c ); - - c.gridx = 1; - panel.add( getColumnSelector(), c ); - - c.gridx = 0; - c.gridy = row++; - c.gridwidth = 2; - panel.add( getOutputFolder(), c ); - - c.gridx = 0; - c.gridy = row; - - panel.add( getGenerateButton(), c ); - - this.add(panel); - } - - private JButton getGenerateButton() { - if( generateGrids == null ){ - generateGrids = new JButton("Divide file"); - generateGrids.setEnabled( false ); - generateGrids.addActionListener( e -> { - String sourceCsvFile = getCsvFilePicker().getSelectedFilePath(); - String destinationFolder = getOutputFolder().getSelectedFilePath(); - boolean randomizeLines = getRandomSelector().isSelected(); - Integer randomizeUsingColumnValues = null; - if( ( (CsvColumn) getColumnSelector().getSelectedItem() )!=null ){ - randomizeUsingColumnValues = ( (CsvColumn) getColumnSelector().getSelectedItem() ).getPos(); - } - Integer filesToDivideInto = getNumberOfFilesSelector().getSelectedIndex()+1; - ProduceCsvFiles produceCsvFiles = new ProduceCsvFiles(survey, sourceCsvFile, destinationFolder, randomizeLines, randomizeUsingColumnValues, filesToDivideInto); - File dest = produceCsvFiles.divideIntoFiles(); - - try { - CollectEarthUtils.openFolderInExplorer( dest.getAbsolutePath() ); - } catch (IOException e1) { - logger.error(" Error opening the destination folder", e); - } - }); - } - return generateGrids; - } - - private JFilePicker getOutputFolder() { - if( outputFolder == null ){ - outputFolder = new JFilePicker("Select the output folder" , null, "Select...", DlgMode.MODE_SAVE); - outputFolder.getFileChooser().setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); - outputFolder.setEnabled(false); - - outputFolder.addChangeListener( new DocumentListener() { - - @Override - public void removeUpdate(DocumentEvent e) { - // No need to do anything - } - - @Override - public void insertUpdate(DocumentEvent e) { - String outputFolderPath = outputFolder.getSelectedFilePath(); - File out = new File( outputFolderPath ); - getGenerateButton().setEnabled(out.exists() ); - } - - @Override - public void changedUpdate(DocumentEvent e) { - // No need to react to the update - } - }); - } - return outputFolder; - } - - - private void enableOtherControls(boolean validFile) { - getRandomSelector().setEnabled( true ); - getColumnSelector().setEnabled(validFile); - getNumberOfFilesSelector().setEnabled(true); - getOutputFolder().setEnabled(true); - setColumns( validFile ); - } - - - private void setColumns( boolean validFile){ - if( validFile ){ - CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); - - List expectedHeaders = cegtg.getExpectedHeaders(survey); - CsvColumn[] columns = new CsvColumn[ expectedHeaders.size()+1 ]; - CsvColumn column = new CsvColumn(null,"DO NOT STRATIFY"); - columns[0] = column; - - int i = 0; - for (String header : expectedHeaders) { - column = new CsvColumn(i++,"Use :" + header); - columns[i] = column; - } - - getColumnSelector().setModel( new DefaultComboBoxModel( columns )); - }else{ - getColumnSelector().setModel( new DefaultComboBoxModel()); - } + public FileTypeFilter(String extension, String description) { + this.extension = extension; + this.description = description; } - - private JComboBox getColumnSelector() { - if( csvColumns == null ){ - csvColumns = new JComboBox<>(); - csvColumns.setEnabled(false); + @Override + public boolean accept(File file) { + if (file.isDirectory()) { + return true; } - return csvColumns; - } - - private JCheckBox getRandomSelector() { - if( randomSelector == null ){ - randomSelector = new JCheckBox("Randomize the order of the lines from the source CSV file" , false); - randomSelector.setEnabled( false); + boolean accepted = false; + String[] extensions = extension.split(","); //$NON-NLS-1$ + for (String item : extensions) { + accepted = accepted || file.getName().toLowerCase().endsWith(item); } - return randomSelector; + return accepted; + } - private JComboBox getNumberOfFilesSelector() { - if( numberOfFiles == null ){ - Integer[] items = new Integer[MAX_FILES]; - for (int i =1; i<= MAX_FILES; i++) { - items[i-1] = Integer.valueOf(i); - } - numberOfFiles = new JComboBox<>(items); - numberOfFiles.setEnabled( false ); - } - return numberOfFiles; + @Override + public String getDescription() { + return description + String.format(" (*%s)", extension); //$NON-NLS-1$ } - - private JFilePicker getCsvFilePicker() { - if( filePicker == null ){ - filePicker = new JFilePicker("Choose the CSV file with the sampling design (plots)", null, "Explore", DlgMode.MODE_OPEN); - - filePicker.getFileChooser().setAcceptAllFileFilterUsed(false); - filePicker.addFileTypeFilter("csv", " CSV file with plot (sampling design)", true); - - filePicker.addChangeListener( new DocumentListener() { - - @Override - public void removeUpdate(DocumentEvent e) { - // No need to validate - } - - @Override - public void insertUpdate(DocumentEvent e) { - validateCsv( filePicker.getTextField().getText() ); - } - - private boolean validateCsv(String filePath) { - boolean validFile = true; - try { - - filePicker.setTextBackground( Color.white); - - if( CsvReaderUtils.isCsvFile( filePath )){ - CollectEarthGridTemplateGenerator cetg = new CollectEarthGridTemplateGenerator(); - - File csvFile = new File( filePath ); - ValidationParameters validationParameters = new ValidationParameters(); - validationParameters.setValidateOnlyFirstLines(false); - CSVFileValidationResult validationResults = cetg.validate(csvFile, survey, validationParameters ); - - validFile = validationResults.isSuccessful(); - if( - !validFile - // If the message is that there are too many rows then we ignore the validation! - && ( - validationResults.getErrorType().equals( ErrorType.INVALID_NUMBER_OF_PLOTS_TOO_LARGE) - || - validationResults.getErrorType().equals( ErrorType.INVALID_NUMBER_OF_PLOTS_WARNING) - ) - ){ - validFile = true; - - } - - if( !validFile ){ - filePicker.setTextBackground( Color.yellow); - switch ( validationResults.getErrorType() ) { - case INVALID_FILE_TYPE: - filePicker.setTextBackground( Color.red); - JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), "The expected file type is CSV or CED ", "Expected File Type", JOptionPane.ERROR_MESSAGE); - break; - - case INVALID_HEADERS: - JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), String.format("The expected columns in the CSV for the survey %s are %s", survey.getName(), validationResults.getExpectedHeaders() ) , "Columns in CSV do not match survey", JOptionPane.ERROR_MESSAGE); - break; - - case INVALID_NUMBER_OF_COLUMNS: - JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), String.format("The number of columns in the CSV file do not coincide with the expercted columns expected for the survey %s /n%s", survey.getName(), validationResults.getExpectedHeaders() ), "Expected File Type", JOptionPane.ERROR_MESSAGE); - break; - - case INVALID_VALUES_IN_CSV: - // IN THIS CASE THE CELL RENDERER TAKES CARE OF HIGHLIGHTING THE CELLS!!! - JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), "The content of the CSV file is not correct!! The values on some cells are incorrect for the survey " + survey.getName() , "CSV content is not correct", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - break; - - default: - break; - } - } - - enableOtherControls( validFile ); - - }else{ - - JOptionPane.showMessageDialog(FileDividerToolDlg.this, String.format("The file in %s is NOT A CSV file ", filePath) ); - filePicker.setTextBackground( Color.red); - } - } catch (Exception e) { - JOptionPane.showMessageDialog(FileDividerToolDlg.this, String.format("The file in %s is NOT A CSV file ", filePath) ); - logger.error( "Error while validating the CSV file", e); - validFile = false; - } - return validFile; - } - - @Override - public void changedUpdate(DocumentEvent e) { - validateCsv( filePicker.getTextField().getText() ); - } - }); - } - return filePicker ; - } - -} +} \ No newline at end of file From f62b77388102942fcec62f020db3eb77e9579e0c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:49 +0100 Subject: [PATCH 1173/1620] New translations GenerateDatabaseStarter.java (French) --- .../earth/app/view/Messages_fr.properties | 103 +++++++++++++----- 1 file changed, 78 insertions(+), 25 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 139e1bb847..b0801c277f 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,39 +1,92 @@ package org.openforis.collect.earth.app.view; -import java.io.File; +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; -import javax.swing.filechooser.FileFilter; +import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.GenerateDatabase; +import org.openforis.collect.earth.ipcc.RdbExportException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ -public class FileTypeFilter extends FileFilter { +final class GenerateDatabaseStarter { + + private Logger logger = LoggerFactory.getLogger( GenerateDatabaseStarter.class); + private JFrame frame; + private GenerateDatabase generateDatabase; + private boolean shouldRefreshDb; + private boolean starting = false; + private InfiniteProgressMonitor progressMonitor; - private String extension; - private String description; + public boolean isShouldRefreshDb() { + return shouldRefreshDb; + } + + public void setShouldRefreshDb(boolean shouldRefreshDb) { + this.shouldRefreshDb = shouldRefreshDb; + } + + GenerateDatabaseStarter( final GenerateDatabase saikuService, final JFrame frame) { + super(); + this.generateDatabase = saikuService; + this.frame = frame; + } + + public boolean shouldShowRdbGenerationOption(ExportType exportType){ + return generateDatabase.isRdbAlreadyGenerated( exportType ); + } - public FileTypeFilter(String extension, String description) { - this.extension = extension; - this.description = description; + public boolean isStarting() { + return starting; + } + + private void generateDatabase(boolean startSaikuAfterDBExport) { + setStarting( true ); + generateDatabase.setRefreshDatabase( shouldRefreshDb ); + try { + generateDatabase.prepareDataForAnalysis(progressMonitor, startSaikuAfterDBExport); + }catch ( RdbExportException e1) { + JOptionPane.showMessageDialog( frame , "" + Messages.getString("CollectEarthWindow.29") + "
" +Messages.getString("CollectEarthWindow.40") + "
" + e1.getMessage() + "", Messages.getString("CollectEarthWindow.47"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ + logger.warn("The saiku server is not configured", e1); //$NON-NLS-1$ + } catch ( RuntimeException e) { + logger.error("Error starting Saiku", e); //$NON-NLS-1$ + } catch ( Exception e) { + logger.error("Error starting Saiku", e); //$NON-NLS-1$ + } finally{ + setStarting( false ); + if( progressMonitor != null ){ + progressMonitor.close(); + } + } } + + public void initializeAndOpen(boolean startSaikuAfterDBExport) { + progressMonitor = new InfiniteProgressMonitor( frame, Messages.getString("GenerateDatabaseStarter.1"), Messages.getString("GenerateDatabaseStarter.2")); //$NON-NLS-1$ //$NON-NLS-2$ + + if( SwingUtilities.isEventDispatchThread() ) { + Thread threadGeneratingDB = new Thread("Initialize RDB"){ //$NON-NLS-1$ + @Override + public void run() { + generateDatabase(startSaikuAfterDBExport); + } - @Override - public boolean accept(File file) { - if (file.isDirectory()) { - return true; + }; + threadGeneratingDB.start(); + progressMonitor.showLater(); + }else { + progressMonitor.showLater(); + generateDatabase(startSaikuAfterDBExport); } - boolean accepted = false; - String[] extensions = extension.split(","); //$NON-NLS-1$ - for (String item : extensions) { - accepted = accepted || file.getName().toLowerCase().endsWith(item); + + + if( progressMonitor.isUserCancelled() ){ + generateDatabase.setUserCancelledOperation(true); } - return accepted; - } - @Override - public String getDescription() { - return description + String.format(" (*%s)", extension); //$NON-NLS-1$ + public void setStarting(boolean starting) { + this.starting = starting; } + } \ No newline at end of file From 1a83c542ac857e272a2ade8d0675d6d8dce5985d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:50 +0100 Subject: [PATCH 1174/1620] New translations ExportProcessMonitorDialog.java (French) --- .../earth/app/view/Messages_fr.properties | 125 +++++++----------- 1 file changed, 50 insertions(+), 75 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index b0801c277f..0ccb8f2366 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,92 +1,67 @@ package org.openforis.collect.earth.app.view; +import java.io.File; + import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.swing.SwingUtilities; - -import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.GenerateDatabase; -import org.openforis.collect.earth.ipcc.RdbExportException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -final class GenerateDatabaseStarter { - - private Logger logger = LoggerFactory.getLogger( GenerateDatabaseStarter.class); - private JFrame frame; - private GenerateDatabase generateDatabase; - private boolean shouldRefreshDb; - private boolean starting = false; - private InfiniteProgressMonitor progressMonitor; - - public boolean isShouldRefreshDb() { - return shouldRefreshDb; - } +import javax.swing.ProgressMonitor; + +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.view.ExportActionListener.RecordsToExport; +import org.openforis.collect.io.data.DataExportStatus; +import org.openforis.collect.manager.process.AbstractProcess; + +public class ExportProcessMonitorDialog extends ProcessMonitorDialog { - public void setShouldRefreshDb(boolean shouldRefreshDb) { - this.shouldRefreshDb = shouldRefreshDb; - } - GenerateDatabaseStarter( final GenerateDatabase saikuService, final JFrame frame) { + private RecordsToExport recordsToExport; + private DataFormat exportFormat; + private EarthSurveyService earthSurveyService; + private LocalPropertiesService localPropertiesService; + private File exportToFile; + + public ExportProcessMonitorDialog(AbstractProcess exportProcess, JFrame parentFrame, RecordsToExport recordsToExport, DataFormat exportFormat, EarthSurveyService earthSurveyService, File exportToFile, LocalPropertiesService localPropertiesService ) { super(); - this.generateDatabase = saikuService; - this.frame = frame; - } - - public boolean shouldShowRdbGenerationOption(ExportType exportType){ - return generateDatabase.isRdbAlreadyGenerated( exportType ); + this.process = exportProcess; + this.recordsToExport = recordsToExport; + this.exportFormat = exportFormat; + this.earthSurveyService = earthSurveyService; + this.exportToFile = exportToFile; + this.localPropertiesService = localPropertiesService; + progressMonitor = new ProgressMonitor(parentFrame, Messages.getString("ExportDialogProcessMonitor.0"), Messages.getString("ExportDialogProcessMonitor.1"), 0, 100); //$NON-NLS-1$ //$NON-NLS-2$ + progressMonitor.setMillisToPopup(1000); + } - public boolean isStarting() { - return starting; + protected String getProcessActionMessage() { + return Messages.getString("ExportDialogProcessMonitor.4"); //$NON-NLS-1$ } - - private void generateDatabase(boolean startSaikuAfterDBExport) { - setStarting( true ); - generateDatabase.setRefreshDatabase( shouldRefreshDb ); + + @Override + public void run() { + try { - generateDatabase.prepareDataForAnalysis(progressMonitor, startSaikuAfterDBExport); - }catch ( RdbExportException e1) { - JOptionPane.showMessageDialog( frame , "" + Messages.getString("CollectEarthWindow.29") + "
" +Messages.getString("CollectEarthWindow.40") + "
" + e1.getMessage() + "", Messages.getString("CollectEarthWindow.47"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ - logger.warn("The saiku server is not configured", e1); //$NON-NLS-1$ - } catch ( RuntimeException e) { - logger.error("Error starting Saiku", e); //$NON-NLS-1$ - } catch ( Exception e) { - logger.error("Error starting Saiku", e); //$NON-NLS-1$ - } finally{ - setStarting( false ); - if( progressMonitor != null ){ - progressMonitor.close(); - } - } - } - - public void initializeAndOpen(boolean startSaikuAfterDBExport) { - progressMonitor = new InfiniteProgressMonitor( frame, Messages.getString("GenerateDatabaseStarter.1"), Messages.getString("GenerateDatabaseStarter.2")); //$NON-NLS-1$ //$NON-NLS-2$ - - if( SwingUtilities.isEventDispatchThread() ) { - Thread threadGeneratingDB = new Thread("Initialize RDB"){ //$NON-NLS-1$ - @Override - public void run() { - generateDatabase(startSaikuAfterDBExport); + monitorProgress(); + process.call(); + if( process.getStatus().isComplete() && exportFormat.equals( DataFormat.ZIP_WITH_XML ) && recordsToExport.equals(RecordsToExport.MODIFIED_SINCE_LAST_EXPORT) ){ + String surveyName = ""; //$NON-NLS-1$ + if( earthSurveyService.getCollectSurvey()!= null ){ + surveyName = earthSurveyService.getCollectSurvey().getName(); } + localPropertiesService.setLastExportedDate( surveyName ); - }; - threadGeneratingDB.start(); - progressMonitor.showLater(); - }else { - progressMonitor.showLater(); - generateDatabase(startSaikuAfterDBExport); - } + } - - if( progressMonitor.isUserCancelled() ){ - generateDatabase.setUserCancelledOperation(true); + if( process.getStatus().isComplete() && ( exportFormat.equals( DataFormat.CSV ) || exportFormat.equals( DataFormat.FUSION ) || exportFormat.equals( DataFormat.KML_FILE ) ) ) { + CollectEarthUtils.openFile( exportToFile ); + } + + } catch (final Exception e) { + logger.error("Error starting the process", e); //$NON-NLS-1$ } - } - public void setStarting(boolean starting) { - this.starting = starting; } -} \ No newline at end of file + +} From 610b7bc966bfd8f9cce163fa4a961ab1a5fed524 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:51 +0100 Subject: [PATCH 1175/1620] New translations GenerateDatabaseStarter.java (Spanish) --- .../earth/app/view/Messages_es.properties | 103 +++++++++++++----- 1 file changed, 78 insertions(+), 25 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 139e1bb847..b0801c277f 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,39 +1,92 @@ package org.openforis.collect.earth.app.view; -import java.io.File; +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; -import javax.swing.filechooser.FileFilter; +import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.GenerateDatabase; +import org.openforis.collect.earth.ipcc.RdbExportException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ -public class FileTypeFilter extends FileFilter { +final class GenerateDatabaseStarter { + + private Logger logger = LoggerFactory.getLogger( GenerateDatabaseStarter.class); + private JFrame frame; + private GenerateDatabase generateDatabase; + private boolean shouldRefreshDb; + private boolean starting = false; + private InfiniteProgressMonitor progressMonitor; - private String extension; - private String description; + public boolean isShouldRefreshDb() { + return shouldRefreshDb; + } + + public void setShouldRefreshDb(boolean shouldRefreshDb) { + this.shouldRefreshDb = shouldRefreshDb; + } + + GenerateDatabaseStarter( final GenerateDatabase saikuService, final JFrame frame) { + super(); + this.generateDatabase = saikuService; + this.frame = frame; + } + + public boolean shouldShowRdbGenerationOption(ExportType exportType){ + return generateDatabase.isRdbAlreadyGenerated( exportType ); + } - public FileTypeFilter(String extension, String description) { - this.extension = extension; - this.description = description; + public boolean isStarting() { + return starting; + } + + private void generateDatabase(boolean startSaikuAfterDBExport) { + setStarting( true ); + generateDatabase.setRefreshDatabase( shouldRefreshDb ); + try { + generateDatabase.prepareDataForAnalysis(progressMonitor, startSaikuAfterDBExport); + }catch ( RdbExportException e1) { + JOptionPane.showMessageDialog( frame , "" + Messages.getString("CollectEarthWindow.29") + "
" +Messages.getString("CollectEarthWindow.40") + "
" + e1.getMessage() + "", Messages.getString("CollectEarthWindow.47"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ + logger.warn("The saiku server is not configured", e1); //$NON-NLS-1$ + } catch ( RuntimeException e) { + logger.error("Error starting Saiku", e); //$NON-NLS-1$ + } catch ( Exception e) { + logger.error("Error starting Saiku", e); //$NON-NLS-1$ + } finally{ + setStarting( false ); + if( progressMonitor != null ){ + progressMonitor.close(); + } + } } + + public void initializeAndOpen(boolean startSaikuAfterDBExport) { + progressMonitor = new InfiniteProgressMonitor( frame, Messages.getString("GenerateDatabaseStarter.1"), Messages.getString("GenerateDatabaseStarter.2")); //$NON-NLS-1$ //$NON-NLS-2$ + + if( SwingUtilities.isEventDispatchThread() ) { + Thread threadGeneratingDB = new Thread("Initialize RDB"){ //$NON-NLS-1$ + @Override + public void run() { + generateDatabase(startSaikuAfterDBExport); + } - @Override - public boolean accept(File file) { - if (file.isDirectory()) { - return true; + }; + threadGeneratingDB.start(); + progressMonitor.showLater(); + }else { + progressMonitor.showLater(); + generateDatabase(startSaikuAfterDBExport); } - boolean accepted = false; - String[] extensions = extension.split(","); //$NON-NLS-1$ - for (String item : extensions) { - accepted = accepted || file.getName().toLowerCase().endsWith(item); + + + if( progressMonitor.isUserCancelled() ){ + generateDatabase.setUserCancelledOperation(true); } - return accepted; - } - @Override - public String getDescription() { - return description + String.format(" (*%s)", extension); //$NON-NLS-1$ + public void setStarting(boolean starting) { + this.starting = starting; } + } \ No newline at end of file From c6ae9832bbe4a1cfc867093359d6991aeedaa946 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:52 +0100 Subject: [PATCH 1176/1620] New translations GenerateDatabaseStarter.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 103 +++++++++++++----- 1 file changed, 78 insertions(+), 25 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 139e1bb847..b0801c277f 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,39 +1,92 @@ package org.openforis.collect.earth.app.view; -import java.io.File; +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; -import javax.swing.filechooser.FileFilter; +import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.GenerateDatabase; +import org.openforis.collect.earth.ipcc.RdbExportException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ -public class FileTypeFilter extends FileFilter { +final class GenerateDatabaseStarter { + + private Logger logger = LoggerFactory.getLogger( GenerateDatabaseStarter.class); + private JFrame frame; + private GenerateDatabase generateDatabase; + private boolean shouldRefreshDb; + private boolean starting = false; + private InfiniteProgressMonitor progressMonitor; - private String extension; - private String description; + public boolean isShouldRefreshDb() { + return shouldRefreshDb; + } + + public void setShouldRefreshDb(boolean shouldRefreshDb) { + this.shouldRefreshDb = shouldRefreshDb; + } + + GenerateDatabaseStarter( final GenerateDatabase saikuService, final JFrame frame) { + super(); + this.generateDatabase = saikuService; + this.frame = frame; + } + + public boolean shouldShowRdbGenerationOption(ExportType exportType){ + return generateDatabase.isRdbAlreadyGenerated( exportType ); + } - public FileTypeFilter(String extension, String description) { - this.extension = extension; - this.description = description; + public boolean isStarting() { + return starting; + } + + private void generateDatabase(boolean startSaikuAfterDBExport) { + setStarting( true ); + generateDatabase.setRefreshDatabase( shouldRefreshDb ); + try { + generateDatabase.prepareDataForAnalysis(progressMonitor, startSaikuAfterDBExport); + }catch ( RdbExportException e1) { + JOptionPane.showMessageDialog( frame , "" + Messages.getString("CollectEarthWindow.29") + "
" +Messages.getString("CollectEarthWindow.40") + "
" + e1.getMessage() + "", Messages.getString("CollectEarthWindow.47"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ + logger.warn("The saiku server is not configured", e1); //$NON-NLS-1$ + } catch ( RuntimeException e) { + logger.error("Error starting Saiku", e); //$NON-NLS-1$ + } catch ( Exception e) { + logger.error("Error starting Saiku", e); //$NON-NLS-1$ + } finally{ + setStarting( false ); + if( progressMonitor != null ){ + progressMonitor.close(); + } + } } + + public void initializeAndOpen(boolean startSaikuAfterDBExport) { + progressMonitor = new InfiniteProgressMonitor( frame, Messages.getString("GenerateDatabaseStarter.1"), Messages.getString("GenerateDatabaseStarter.2")); //$NON-NLS-1$ //$NON-NLS-2$ + + if( SwingUtilities.isEventDispatchThread() ) { + Thread threadGeneratingDB = new Thread("Initialize RDB"){ //$NON-NLS-1$ + @Override + public void run() { + generateDatabase(startSaikuAfterDBExport); + } - @Override - public boolean accept(File file) { - if (file.isDirectory()) { - return true; + }; + threadGeneratingDB.start(); + progressMonitor.showLater(); + }else { + progressMonitor.showLater(); + generateDatabase(startSaikuAfterDBExport); } - boolean accepted = false; - String[] extensions = extension.split(","); //$NON-NLS-1$ - for (String item : extensions) { - accepted = accepted || file.getName().toLowerCase().endsWith(item); + + + if( progressMonitor.isUserCancelled() ){ + generateDatabase.setUserCancelledOperation(true); } - return accepted; - } - @Override - public String getDescription() { - return description + String.format(" (*%s)", extension); //$NON-NLS-1$ + public void setStarting(boolean starting) { + this.starting = starting; } + } \ No newline at end of file From 9d2b239fe36ef3481784ae4aef47b5bc5d776dc1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:53 +0100 Subject: [PATCH 1177/1620] New translations GenerateDatabaseStarter.java (English) --- .../earth/app/view/Messages_en.properties | 364 ++++-------------- 1 file changed, 66 insertions(+), 298 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index d275a15df8..b0801c277f 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,324 +1,92 @@ package org.openforis.collect.earth.app.view; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Frame; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.io.File; -import java.io.IOException; -import java.util.List; - -import javax.swing.DefaultComboBoxModel; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JDialog; -import javax.swing.JFileChooser; -import javax.swing.JLabel; +import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; +import javax.swing.SwingUtilities; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.collect.earth.sampler.utils.ProduceCsvFiles; -import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult; -import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult.ErrorType; -import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; -import org.openforis.collect.manager.validation.SurveyValidator.ValidationParameters; -import org.openforis.collect.model.CollectSurvey; +import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.GenerateDatabase; +import org.openforis.collect.earth.ipcc.RdbExportException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class FileDividerToolDlg extends JDialog{ - - private static final long serialVersionUID = 2241706750062961024L; - private static final int MAX_FILES = 500; - private CollectSurvey survey; - private transient Logger logger = LoggerFactory.getLogger( FileDividerToolDlg.class); - private JComboBox numberOfFiles ; - private JCheckBox randomSelector; - private JComboBox csvColumns; - private JFilePicker outputFolder; - private JButton generateGrids; - private JFilePicker filePicker; - - public static void open( Frame owner, CollectSurvey survey){ - FileDividerToolDlg dlg = new FileDividerToolDlg(owner, survey); - dlg.setVisible(true); +final class GenerateDatabaseStarter { + + private Logger logger = LoggerFactory.getLogger( GenerateDatabaseStarter.class); + private JFrame frame; + private GenerateDatabase generateDatabase; + private boolean shouldRefreshDb; + private boolean starting = false; + private InfiniteProgressMonitor progressMonitor; + + public boolean isShouldRefreshDb() { + return shouldRefreshDb; } - public FileDividerToolDlg( Frame owner,CollectSurvey survey ) { - super(owner); - this.survey = survey; - this.setModal(true); - this.setSize( new Dimension(700, 350)); - this.setLocationRelativeTo( owner ); - this.setTitle("Tool for dividing large CSV into smaller ones"); - initLayout(); + public void setShouldRefreshDb(boolean shouldRefreshDb) { + this.shouldRefreshDb = shouldRefreshDb; } - private void initLayout() { - final JPanel panel = new JPanel(new GridBagLayout()); - GridBagConstraints c = new GridBagConstraints(); - - int row = 0; - - c.fill = GridBagConstraints.BOTH; - c.gridx = 0; - c.gridwidth = 2; - c.gridy = row++; - - panel.add( getCsvFilePicker(), c ); - c.gridwidth = 1; - c.gridy = row++; - - c.gridx = 0; - - panel.add( new JLabel("Number of files to split the CSV into"), c ); - - c.gridx = 1; - panel.add( getNumberOfFilesSelector(), c ); - - c.gridx = 0; - c.gridy = row++; - c.gridwidth = 2; - panel.add( getRandomSelector(), c ); - - c.gridy = row++; - c.gridx = 0; - c.gridwidth = 1; - panel.add( new JLabel("Split files by strata (values of the column i.e : region )"), c ); - - c.gridx = 1; - panel.add( getColumnSelector(), c ); - - c.gridx = 0; - c.gridy = row++; - c.gridwidth = 2; - panel.add( getOutputFolder(), c ); - - c.gridx = 0; - c.gridy = row; - - panel.add( getGenerateButton(), c ); - - this.add(panel); - } - - private JButton getGenerateButton() { - if( generateGrids == null ){ - generateGrids = new JButton("Divide file"); - generateGrids.setEnabled( false ); - generateGrids.addActionListener( e -> { - String sourceCsvFile = getCsvFilePicker().getSelectedFilePath(); - String destinationFolder = getOutputFolder().getSelectedFilePath(); - boolean randomizeLines = getRandomSelector().isSelected(); - Integer randomizeUsingColumnValues = null; - if( ( (CsvColumn) getColumnSelector().getSelectedItem() )!=null ){ - randomizeUsingColumnValues = ( (CsvColumn) getColumnSelector().getSelectedItem() ).getPos(); - } - Integer filesToDivideInto = getNumberOfFilesSelector().getSelectedIndex()+1; - ProduceCsvFiles produceCsvFiles = new ProduceCsvFiles(survey, sourceCsvFile, destinationFolder, randomizeLines, randomizeUsingColumnValues, filesToDivideInto); - File dest = produceCsvFiles.divideIntoFiles(); - - try { - CollectEarthUtils.openFolderInExplorer( dest.getAbsolutePath() ); - } catch (IOException e1) { - logger.error(" Error opening the destination folder", e); - } - }); - } - return generateGrids; + GenerateDatabaseStarter( final GenerateDatabase saikuService, final JFrame frame) { + super(); + this.generateDatabase = saikuService; + this.frame = frame; } - - private JFilePicker getOutputFolder() { - if( outputFolder == null ){ - outputFolder = new JFilePicker("Select the output folder" , null, "Select...", DlgMode.MODE_SAVE); - outputFolder.getFileChooser().setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); - outputFolder.setEnabled(false); - - outputFolder.addChangeListener( new DocumentListener() { - - @Override - public void removeUpdate(DocumentEvent e) { - // No need to do anything - } - - @Override - public void insertUpdate(DocumentEvent e) { - String outputFolderPath = outputFolder.getSelectedFilePath(); - File out = new File( outputFolderPath ); - getGenerateButton().setEnabled(out.exists() ); - } - - @Override - public void changedUpdate(DocumentEvent e) { - // No need to react to the update - } - }); - } - return outputFolder; + + public boolean shouldShowRdbGenerationOption(ExportType exportType){ + return generateDatabase.isRdbAlreadyGenerated( exportType ); } - - private void enableOtherControls(boolean validFile) { - getRandomSelector().setEnabled( true ); - getColumnSelector().setEnabled(validFile); - getNumberOfFilesSelector().setEnabled(true); - getOutputFolder().setEnabled(true); - setColumns( validFile ); + public boolean isStarting() { + return starting; } - - - private void setColumns( boolean validFile){ - if( validFile ){ - CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); - - List expectedHeaders = cegtg.getExpectedHeaders(survey); - CsvColumn[] columns = new CsvColumn[ expectedHeaders.size()+1 ]; - CsvColumn column = new CsvColumn(null,"DO NOT STRATIFY"); - columns[0] = column; - - int i = 0; - for (String header : expectedHeaders) { - column = new CsvColumn(i++,"Use :" + header); - columns[i] = column; + + private void generateDatabase(boolean startSaikuAfterDBExport) { + setStarting( true ); + generateDatabase.setRefreshDatabase( shouldRefreshDb ); + try { + generateDatabase.prepareDataForAnalysis(progressMonitor, startSaikuAfterDBExport); + }catch ( RdbExportException e1) { + JOptionPane.showMessageDialog( frame , "" + Messages.getString("CollectEarthWindow.29") + "
" +Messages.getString("CollectEarthWindow.40") + "
" + e1.getMessage() + "", Messages.getString("CollectEarthWindow.47"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ + logger.warn("The saiku server is not configured", e1); //$NON-NLS-1$ + } catch ( RuntimeException e) { + logger.error("Error starting Saiku", e); //$NON-NLS-1$ + } catch ( Exception e) { + logger.error("Error starting Saiku", e); //$NON-NLS-1$ + } finally{ + setStarting( false ); + if( progressMonitor != null ){ + progressMonitor.close(); } - - getColumnSelector().setModel( new DefaultComboBoxModel( columns )); - }else{ - getColumnSelector().setModel( new DefaultComboBoxModel()); - } - } - - - private JComboBox getColumnSelector() { - if( csvColumns == null ){ - csvColumns = new JComboBox<>(); - csvColumns.setEnabled(false); } - return csvColumns; } + + public void initializeAndOpen(boolean startSaikuAfterDBExport) { + progressMonitor = new InfiniteProgressMonitor( frame, Messages.getString("GenerateDatabaseStarter.1"), Messages.getString("GenerateDatabaseStarter.2")); //$NON-NLS-1$ //$NON-NLS-2$ + + if( SwingUtilities.isEventDispatchThread() ) { + Thread threadGeneratingDB = new Thread("Initialize RDB"){ //$NON-NLS-1$ + @Override + public void run() { + generateDatabase(startSaikuAfterDBExport); + } - private JCheckBox getRandomSelector() { - if( randomSelector == null ){ - randomSelector = new JCheckBox("Randomize the order of the lines from the source CSV file" , false); - randomSelector.setEnabled( false); + }; + threadGeneratingDB.start(); + progressMonitor.showLater(); + }else { + progressMonitor.showLater(); + generateDatabase(startSaikuAfterDBExport); } - return randomSelector; - } - private JComboBox getNumberOfFilesSelector() { - if( numberOfFiles == null ){ - Integer[] items = new Integer[MAX_FILES]; - for (int i =1; i<= MAX_FILES; i++) { - items[i-1] = Integer.valueOf(i); - } - numberOfFiles = new JComboBox<>(items); - numberOfFiles.setEnabled( false ); + + if( progressMonitor.isUserCancelled() ){ + generateDatabase.setUserCancelledOperation(true); } - return numberOfFiles; } - private JFilePicker getCsvFilePicker() { - if( filePicker == null ){ - filePicker = new JFilePicker("Choose the CSV file with the sampling design (plots)", null, "Explore", DlgMode.MODE_OPEN); - - filePicker.getFileChooser().setAcceptAllFileFilterUsed(false); - filePicker.addFileTypeFilter("csv", " CSV file with plot (sampling design)", true); - - filePicker.addChangeListener( new DocumentListener() { - - @Override - public void removeUpdate(DocumentEvent e) { - // No need to validate - } - - @Override - public void insertUpdate(DocumentEvent e) { - validateCsv( filePicker.getTextField().getText() ); - } - - private boolean validateCsv(String filePath) { - boolean validFile = true; - try { - - filePicker.setTextBackground( Color.white); - - if( CsvReaderUtils.isCsvFile( filePath )){ - CollectEarthGridTemplateGenerator cetg = new CollectEarthGridTemplateGenerator(); - - File csvFile = new File( filePath ); - ValidationParameters validationParameters = new ValidationParameters(); - validationParameters.setValidateOnlyFirstLines(false); - CSVFileValidationResult validationResults = cetg.validate(csvFile, survey, validationParameters ); - - validFile = validationResults.isSuccessful(); - if( - !validFile - // If the message is that there are too many rows then we ignore the validation! - && ( - validationResults.getErrorType().equals( ErrorType.INVALID_NUMBER_OF_PLOTS_TOO_LARGE) - || - validationResults.getErrorType().equals( ErrorType.INVALID_NUMBER_OF_PLOTS_WARNING) - ) - ){ - validFile = true; - - } - - if( !validFile ){ - filePicker.setTextBackground( Color.yellow); - switch ( validationResults.getErrorType() ) { - case INVALID_FILE_TYPE: - filePicker.setTextBackground( Color.red); - JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), "The expected file type is CSV or CED ", "Expected File Type", JOptionPane.ERROR_MESSAGE); - break; - - case INVALID_HEADERS: - JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), String.format("The expected columns in the CSV for the survey %s are %s", survey.getName(), validationResults.getExpectedHeaders() ) , "Columns in CSV do not match survey", JOptionPane.ERROR_MESSAGE); - break; - - case INVALID_NUMBER_OF_COLUMNS: - JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), String.format("The number of columns in the CSV file do not coincide with the expercted columns expected for the survey %s /n%s", survey.getName(), validationResults.getExpectedHeaders() ), "Expected File Type", JOptionPane.ERROR_MESSAGE); - break; - - case INVALID_VALUES_IN_CSV: - // IN THIS CASE THE CELL RENDERER TAKES CARE OF HIGHLIGHTING THE CELLS!!! - JOptionPane.showMessageDialog( FileDividerToolDlg.this.getParent(), "The content of the CSV file is not correct!! The values on some cells are incorrect for the survey " + survey.getName() , "CSV content is not correct", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - break; - - default: - break; - } - } - - enableOtherControls( validFile ); - - }else{ - - JOptionPane.showMessageDialog(FileDividerToolDlg.this, String.format("The file in %s is NOT A CSV file ", filePath) ); - filePicker.setTextBackground( Color.red); - } - } catch (Exception e) { - JOptionPane.showMessageDialog(FileDividerToolDlg.this, String.format("The file in %s is NOT A CSV file ", filePath) ); - logger.error( "Error while validating the CSV file", e); - validFile = false; - } - return validFile; - } - - @Override - public void changedUpdate(DocumentEvent e) { - validateCsv( filePicker.getTextField().getText() ); - } - }); - } - return filePicker ; + public void setStarting(boolean starting) { + this.starting = starting; } -} +} \ No newline at end of file From 6d40415decb6e8a608ed3d14a6f46c948f16eab8 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:55 +0100 Subject: [PATCH 1178/1620] New translations GenerateRDBAnalysisListener.java (French) --- .../earth/app/view/Messages_fr.properties | 91 +++++++++---------- 1 file changed, 43 insertions(+), 48 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 0ccb8f2366..0f68388dc7 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,67 +1,62 @@ package org.openforis.collect.earth.app.view; -import java.io.File; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import javax.swing.JFrame; -import javax.swing.ProgressMonitor; +import javax.swing.JOptionPane; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.view.ExportActionListener.RecordsToExport; -import org.openforis.collect.io.data.DataExportStatus; -import org.openforis.collect.manager.process.AbstractProcess; +import org.openforis.collect.earth.app.service.ExportType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -public class ExportProcessMonitorDialog extends ProcessMonitorDialog { +public class GenerateRDBAnalysisListener implements ActionListener { + private Logger logger = LoggerFactory.getLogger( GenerateRDBAnalysisListener.class); + private JFrame frame; + private GenerateDatabaseStarter saikuStarter; - - private RecordsToExport recordsToExport; - private DataFormat exportFormat; - private EarthSurveyService earthSurveyService; - private LocalPropertiesService localPropertiesService; - private File exportToFile; - - public ExportProcessMonitorDialog(AbstractProcess exportProcess, JFrame parentFrame, RecordsToExport recordsToExport, DataFormat exportFormat, EarthSurveyService earthSurveyService, File exportToFile, LocalPropertiesService localPropertiesService ) { - super(); - this.process = exportProcess; - this.recordsToExport = recordsToExport; - this.exportFormat = exportFormat; - this.earthSurveyService = earthSurveyService; - this.exportToFile = exportToFile; - this.localPropertiesService = localPropertiesService; - progressMonitor = new ProgressMonitor(parentFrame, Messages.getString("ExportDialogProcessMonitor.0"), Messages.getString("ExportDialogProcessMonitor.1"), 0, 100); //$NON-NLS-1$ //$NON-NLS-2$ - progressMonitor.setMillisToPopup(1000); - + public GenerateRDBAnalysisListener(JFrame frame, GenerateDatabaseStarter saikuStarter) { + this.frame = frame; + this.saikuStarter = saikuStarter; } - protected String getProcessActionMessage() { - return Messages.getString("ExportDialogProcessMonitor.4"); //$NON-NLS-1$ + @Override + public void actionPerformed(ActionEvent e) { + try { + CollectEarthWindow.startWaiting(frame); + exportDataToRDB(); + }catch (Exception e1) { + logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ + } finally{ + CollectEarthWindow.endWaiting(frame); + } } - @Override - public void run() { + private void exportDataToRDB() { + if( saikuStarter.isStarting() ){ + JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.57"), Messages.getString("CollectEarthWindow.58"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ + }else{ - try { - monitorProgress(); - process.call(); - if( process.getStatus().isComplete() && exportFormat.equals( DataFormat.ZIP_WITH_XML ) && recordsToExport.equals(RecordsToExport.MODIFIED_SINCE_LAST_EXPORT) ){ - String surveyName = ""; //$NON-NLS-1$ - if( earthSurveyService.getCollectSurvey()!= null ){ - surveyName = earthSurveyService.getCollectSurvey().getName(); - } - localPropertiesService.setLastExportedDate( surveyName ); + int shouldRefreshDb = JOptionPane.YES_OPTION; + + if( saikuStarter.shouldShowRdbGenerationOption( ExportType.IPCC ) ){ + + String refresh = Messages.getString("SaikuAnalysisListener.0"); //$NON-NLS-1$ + String close = Messages.getString("SaikuAnalysisListener.1"); //$NON-NLS-1$ + String[] options = new String[]{ refresh,close}; - } - if( process.getStatus().isComplete() && ( exportFormat.equals( DataFormat.CSV ) || exportFormat.equals( DataFormat.FUSION ) || exportFormat.equals( DataFormat.KML_FILE ) ) ) { - CollectEarthUtils.openFile( exportToFile ); + shouldRefreshDb = JOptionPane.showOptionDialog( + frame, Messages.getString("CollectEarthWindow.59"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.60"), //$NON-NLS-1$ + JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); } - } catch (final Exception e) { - logger.error("Error starting the process", e); //$NON-NLS-1$ + if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ + saikuStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); + saikuStarter.initializeAndOpen( true ); + } } - } - -} +} \ No newline at end of file From 46fc63f0cf7d13686ba84e6a83aa8194e348a9cb Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:56 +0100 Subject: [PATCH 1179/1620] New translations GenerateRDBAnalysisListener.java (Spanish) --- .../earth/app/view/Messages_es.properties | 106 +++++++----------- 1 file changed, 38 insertions(+), 68 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index b0801c277f..0f68388dc7 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,92 +1,62 @@ package org.openforis.collect.earth.app.view; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.SwingUtilities; import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.GenerateDatabase; -import org.openforis.collect.earth.ipcc.RdbExportException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -final class GenerateDatabaseStarter { - - private Logger logger = LoggerFactory.getLogger( GenerateDatabaseStarter.class); +public class GenerateRDBAnalysisListener implements ActionListener { + private Logger logger = LoggerFactory.getLogger( GenerateRDBAnalysisListener.class); private JFrame frame; - private GenerateDatabase generateDatabase; - private boolean shouldRefreshDb; - private boolean starting = false; - private InfiniteProgressMonitor progressMonitor; - - public boolean isShouldRefreshDb() { - return shouldRefreshDb; - } - - public void setShouldRefreshDb(boolean shouldRefreshDb) { - this.shouldRefreshDb = shouldRefreshDb; - } + private GenerateDatabaseStarter saikuStarter; - GenerateDatabaseStarter( final GenerateDatabase saikuService, final JFrame frame) { - super(); - this.generateDatabase = saikuService; + public GenerateRDBAnalysisListener(JFrame frame, GenerateDatabaseStarter saikuStarter) { this.frame = frame; - } - - public boolean shouldShowRdbGenerationOption(ExportType exportType){ - return generateDatabase.isRdbAlreadyGenerated( exportType ); + this.saikuStarter = saikuStarter; } - public boolean isStarting() { - return starting; - } - - private void generateDatabase(boolean startSaikuAfterDBExport) { - setStarting( true ); - generateDatabase.setRefreshDatabase( shouldRefreshDb ); + @Override + public void actionPerformed(ActionEvent e) { try { - generateDatabase.prepareDataForAnalysis(progressMonitor, startSaikuAfterDBExport); - }catch ( RdbExportException e1) { - JOptionPane.showMessageDialog( frame , "" + Messages.getString("CollectEarthWindow.29") + "
" +Messages.getString("CollectEarthWindow.40") + "
" + e1.getMessage() + "", Messages.getString("CollectEarthWindow.47"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ - logger.warn("The saiku server is not configured", e1); //$NON-NLS-1$ - } catch ( RuntimeException e) { - logger.error("Error starting Saiku", e); //$NON-NLS-1$ - } catch ( Exception e) { - logger.error("Error starting Saiku", e); //$NON-NLS-1$ + CollectEarthWindow.startWaiting(frame); + exportDataToRDB(); + }catch (Exception e1) { + logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ } finally{ - setStarting( false ); - if( progressMonitor != null ){ - progressMonitor.close(); - } + CollectEarthWindow.endWaiting(frame); } } - - public void initializeAndOpen(boolean startSaikuAfterDBExport) { - progressMonitor = new InfiniteProgressMonitor( frame, Messages.getString("GenerateDatabaseStarter.1"), Messages.getString("GenerateDatabaseStarter.2")); //$NON-NLS-1$ //$NON-NLS-2$ - - if( SwingUtilities.isEventDispatchThread() ) { - Thread threadGeneratingDB = new Thread("Initialize RDB"){ //$NON-NLS-1$ - @Override - public void run() { - generateDatabase(startSaikuAfterDBExport); - } - }; - threadGeneratingDB.start(); - progressMonitor.showLater(); - }else { - progressMonitor.showLater(); - generateDatabase(startSaikuAfterDBExport); - } + private void exportDataToRDB() { + if( saikuStarter.isStarting() ){ + JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.57"), Messages.getString("CollectEarthWindow.58"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ + }else{ + + int shouldRefreshDb = JOptionPane.YES_OPTION; + + if( saikuStarter.shouldShowRdbGenerationOption( ExportType.IPCC ) ){ + + String refresh = Messages.getString("SaikuAnalysisListener.0"); //$NON-NLS-1$ + String close = Messages.getString("SaikuAnalysisListener.1"); //$NON-NLS-1$ + String[] options = new String[]{ refresh,close}; - - if( progressMonitor.isUserCancelled() ){ - generateDatabase.setUserCancelledOperation(true); - } - } - public void setStarting(boolean starting) { - this.starting = starting; + shouldRefreshDb = JOptionPane.showOptionDialog( + frame, Messages.getString("CollectEarthWindow.59"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.60"), //$NON-NLS-1$ + JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); + } + + if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ + saikuStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); + saikuStarter.initializeAndOpen( true ); + } + } } } \ No newline at end of file From abed555102fe1d9bed582753c78a1496e07ac074 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:57 +0100 Subject: [PATCH 1180/1620] New translations GenerateRDBAnalysisListener.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 106 +++++++----------- 1 file changed, 38 insertions(+), 68 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index b0801c277f..0f68388dc7 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,92 +1,62 @@ package org.openforis.collect.earth.app.view; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.SwingUtilities; import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.GenerateDatabase; -import org.openforis.collect.earth.ipcc.RdbExportException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -final class GenerateDatabaseStarter { - - private Logger logger = LoggerFactory.getLogger( GenerateDatabaseStarter.class); +public class GenerateRDBAnalysisListener implements ActionListener { + private Logger logger = LoggerFactory.getLogger( GenerateRDBAnalysisListener.class); private JFrame frame; - private GenerateDatabase generateDatabase; - private boolean shouldRefreshDb; - private boolean starting = false; - private InfiniteProgressMonitor progressMonitor; - - public boolean isShouldRefreshDb() { - return shouldRefreshDb; - } - - public void setShouldRefreshDb(boolean shouldRefreshDb) { - this.shouldRefreshDb = shouldRefreshDb; - } + private GenerateDatabaseStarter saikuStarter; - GenerateDatabaseStarter( final GenerateDatabase saikuService, final JFrame frame) { - super(); - this.generateDatabase = saikuService; + public GenerateRDBAnalysisListener(JFrame frame, GenerateDatabaseStarter saikuStarter) { this.frame = frame; - } - - public boolean shouldShowRdbGenerationOption(ExportType exportType){ - return generateDatabase.isRdbAlreadyGenerated( exportType ); + this.saikuStarter = saikuStarter; } - public boolean isStarting() { - return starting; - } - - private void generateDatabase(boolean startSaikuAfterDBExport) { - setStarting( true ); - generateDatabase.setRefreshDatabase( shouldRefreshDb ); + @Override + public void actionPerformed(ActionEvent e) { try { - generateDatabase.prepareDataForAnalysis(progressMonitor, startSaikuAfterDBExport); - }catch ( RdbExportException e1) { - JOptionPane.showMessageDialog( frame , "" + Messages.getString("CollectEarthWindow.29") + "
" +Messages.getString("CollectEarthWindow.40") + "
" + e1.getMessage() + "", Messages.getString("CollectEarthWindow.47"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ - logger.warn("The saiku server is not configured", e1); //$NON-NLS-1$ - } catch ( RuntimeException e) { - logger.error("Error starting Saiku", e); //$NON-NLS-1$ - } catch ( Exception e) { - logger.error("Error starting Saiku", e); //$NON-NLS-1$ + CollectEarthWindow.startWaiting(frame); + exportDataToRDB(); + }catch (Exception e1) { + logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ } finally{ - setStarting( false ); - if( progressMonitor != null ){ - progressMonitor.close(); - } + CollectEarthWindow.endWaiting(frame); } } - - public void initializeAndOpen(boolean startSaikuAfterDBExport) { - progressMonitor = new InfiniteProgressMonitor( frame, Messages.getString("GenerateDatabaseStarter.1"), Messages.getString("GenerateDatabaseStarter.2")); //$NON-NLS-1$ //$NON-NLS-2$ - - if( SwingUtilities.isEventDispatchThread() ) { - Thread threadGeneratingDB = new Thread("Initialize RDB"){ //$NON-NLS-1$ - @Override - public void run() { - generateDatabase(startSaikuAfterDBExport); - } - }; - threadGeneratingDB.start(); - progressMonitor.showLater(); - }else { - progressMonitor.showLater(); - generateDatabase(startSaikuAfterDBExport); - } + private void exportDataToRDB() { + if( saikuStarter.isStarting() ){ + JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.57"), Messages.getString("CollectEarthWindow.58"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ + }else{ + + int shouldRefreshDb = JOptionPane.YES_OPTION; + + if( saikuStarter.shouldShowRdbGenerationOption( ExportType.IPCC ) ){ + + String refresh = Messages.getString("SaikuAnalysisListener.0"); //$NON-NLS-1$ + String close = Messages.getString("SaikuAnalysisListener.1"); //$NON-NLS-1$ + String[] options = new String[]{ refresh,close}; - - if( progressMonitor.isUserCancelled() ){ - generateDatabase.setUserCancelledOperation(true); - } - } - public void setStarting(boolean starting) { - this.starting = starting; + shouldRefreshDb = JOptionPane.showOptionDialog( + frame, Messages.getString("CollectEarthWindow.59"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.60"), //$NON-NLS-1$ + JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); + } + + if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ + saikuStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); + saikuStarter.initializeAndOpen( true ); + } + } } } \ No newline at end of file From d85ddb04aeac709eeebdf08b069c77d3717f2613 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:58 +0100 Subject: [PATCH 1181/1620] New translations GenerateRDBAnalysisListener.java (English) --- .../earth/app/view/Messages_en.properties | 106 +++++++----------- 1 file changed, 38 insertions(+), 68 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index b0801c277f..0f68388dc7 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,92 +1,62 @@ package org.openforis.collect.earth.app.view; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.SwingUtilities; import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.GenerateDatabase; -import org.openforis.collect.earth.ipcc.RdbExportException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -final class GenerateDatabaseStarter { - - private Logger logger = LoggerFactory.getLogger( GenerateDatabaseStarter.class); +public class GenerateRDBAnalysisListener implements ActionListener { + private Logger logger = LoggerFactory.getLogger( GenerateRDBAnalysisListener.class); private JFrame frame; - private GenerateDatabase generateDatabase; - private boolean shouldRefreshDb; - private boolean starting = false; - private InfiniteProgressMonitor progressMonitor; - - public boolean isShouldRefreshDb() { - return shouldRefreshDb; - } - - public void setShouldRefreshDb(boolean shouldRefreshDb) { - this.shouldRefreshDb = shouldRefreshDb; - } + private GenerateDatabaseStarter saikuStarter; - GenerateDatabaseStarter( final GenerateDatabase saikuService, final JFrame frame) { - super(); - this.generateDatabase = saikuService; + public GenerateRDBAnalysisListener(JFrame frame, GenerateDatabaseStarter saikuStarter) { this.frame = frame; - } - - public boolean shouldShowRdbGenerationOption(ExportType exportType){ - return generateDatabase.isRdbAlreadyGenerated( exportType ); + this.saikuStarter = saikuStarter; } - public boolean isStarting() { - return starting; - } - - private void generateDatabase(boolean startSaikuAfterDBExport) { - setStarting( true ); - generateDatabase.setRefreshDatabase( shouldRefreshDb ); + @Override + public void actionPerformed(ActionEvent e) { try { - generateDatabase.prepareDataForAnalysis(progressMonitor, startSaikuAfterDBExport); - }catch ( RdbExportException e1) { - JOptionPane.showMessageDialog( frame , "" + Messages.getString("CollectEarthWindow.29") + "
" +Messages.getString("CollectEarthWindow.40") + "
" + e1.getMessage() + "", Messages.getString("CollectEarthWindow.47"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ - logger.warn("The saiku server is not configured", e1); //$NON-NLS-1$ - } catch ( RuntimeException e) { - logger.error("Error starting Saiku", e); //$NON-NLS-1$ - } catch ( Exception e) { - logger.error("Error starting Saiku", e); //$NON-NLS-1$ + CollectEarthWindow.startWaiting(frame); + exportDataToRDB(); + }catch (Exception e1) { + logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ } finally{ - setStarting( false ); - if( progressMonitor != null ){ - progressMonitor.close(); - } + CollectEarthWindow.endWaiting(frame); } } - - public void initializeAndOpen(boolean startSaikuAfterDBExport) { - progressMonitor = new InfiniteProgressMonitor( frame, Messages.getString("GenerateDatabaseStarter.1"), Messages.getString("GenerateDatabaseStarter.2")); //$NON-NLS-1$ //$NON-NLS-2$ - - if( SwingUtilities.isEventDispatchThread() ) { - Thread threadGeneratingDB = new Thread("Initialize RDB"){ //$NON-NLS-1$ - @Override - public void run() { - generateDatabase(startSaikuAfterDBExport); - } - }; - threadGeneratingDB.start(); - progressMonitor.showLater(); - }else { - progressMonitor.showLater(); - generateDatabase(startSaikuAfterDBExport); - } + private void exportDataToRDB() { + if( saikuStarter.isStarting() ){ + JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.57"), Messages.getString("CollectEarthWindow.58"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ + }else{ + + int shouldRefreshDb = JOptionPane.YES_OPTION; + + if( saikuStarter.shouldShowRdbGenerationOption( ExportType.IPCC ) ){ + + String refresh = Messages.getString("SaikuAnalysisListener.0"); //$NON-NLS-1$ + String close = Messages.getString("SaikuAnalysisListener.1"); //$NON-NLS-1$ + String[] options = new String[]{ refresh,close}; - - if( progressMonitor.isUserCancelled() ){ - generateDatabase.setUserCancelledOperation(true); - } - } - public void setStarting(boolean starting) { - this.starting = starting; + shouldRefreshDb = JOptionPane.showOptionDialog( + frame, Messages.getString("CollectEarthWindow.59"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.60"), //$NON-NLS-1$ + JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); + } + + if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ + saikuStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); + saikuStarter.initializeAndOpen( true ); + } + } } } \ No newline at end of file From 51cc9674b236b15ca6fd4be6531b8caf0dc8d941 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:43:59 +0100 Subject: [PATCH 1182/1620] New translations IPCCGeneratorListener.java (French) --- .../earth/app/view/Messages_fr.properties | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 0f68388dc7..7c0a5857ae 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -10,21 +10,22 @@ import org.openforis.collect.earth.app.service.ExportType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class GenerateRDBAnalysisListener implements ActionListener { - private Logger logger = LoggerFactory.getLogger( GenerateRDBAnalysisListener.class); +public class IPCCGeneratorListener implements ActionListener { + private Logger logger = LoggerFactory.getLogger( IPCCGeneratorListener.class); private JFrame frame; - private GenerateDatabaseStarter saikuStarter; + private GenerateDatabaseStarter ipccExporterStarter; - public GenerateRDBAnalysisListener(JFrame frame, GenerateDatabaseStarter saikuStarter) { + public IPCCGeneratorListener(JFrame frame, GenerateDatabaseStarter ipccExporterStarter) { this.frame = frame; - this.saikuStarter = saikuStarter; + this.ipccExporterStarter = ipccExporterStarter; } + @Override public void actionPerformed(ActionEvent e) { try { CollectEarthWindow.startWaiting(frame); - exportDataToRDB(); + generateIpccData(); }catch (Exception e1) { logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ } finally{ @@ -32,29 +33,29 @@ public class GenerateRDBAnalysisListener implements ActionListener { } } - private void exportDataToRDB() { - if( saikuStarter.isStarting() ){ - JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.57"), Messages.getString("CollectEarthWindow.58"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ + private void generateIpccData() { + if( ipccExporterStarter.isStarting() ){ + JOptionPane.showMessageDialog(frame, Messages.getString("IPCCGeneratorListener.1"), Messages.getString("IPCCGeneratorListener.2"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ }else{ int shouldRefreshDb = JOptionPane.YES_OPTION; - if( saikuStarter.shouldShowRdbGenerationOption( ExportType.IPCC ) ){ + if( ipccExporterStarter.shouldShowRdbGenerationOption(ExportType.IPCC) ){ - String refresh = Messages.getString("SaikuAnalysisListener.0"); //$NON-NLS-1$ - String close = Messages.getString("SaikuAnalysisListener.1"); //$NON-NLS-1$ + String refresh = Messages.getString("IPCCGeneratorListener.3"); //$NON-NLS-1$ + String close = Messages.getString("IPCCGeneratorListener.4"); //$NON-NLS-1$ String[] options = new String[]{ refresh,close}; shouldRefreshDb = JOptionPane.showOptionDialog( - frame, Messages.getString("CollectEarthWindow.59"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.60"), //$NON-NLS-1$ + frame, Messages.getString("IPCCGeneratorListener.6"), //$NON-NLS-1$ + Messages.getString("IPCCGeneratorListener.5"), //$NON-NLS-1$ JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); } if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ - saikuStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); - saikuStarter.initializeAndOpen( true ); + ipccExporterStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); + ipccExporterStarter.initializeAndOpen( true ); } } } From 16ae24701b3ddad11bf4c9c0f4b160ac6bf1d47d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:00 +0100 Subject: [PATCH 1183/1620] New translations IPCCGeneratorListener.java (Spanish) --- .../earth/app/view/Messages_es.properties | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 0f68388dc7..7c0a5857ae 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -10,21 +10,22 @@ import org.openforis.collect.earth.app.service.ExportType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class GenerateRDBAnalysisListener implements ActionListener { - private Logger logger = LoggerFactory.getLogger( GenerateRDBAnalysisListener.class); +public class IPCCGeneratorListener implements ActionListener { + private Logger logger = LoggerFactory.getLogger( IPCCGeneratorListener.class); private JFrame frame; - private GenerateDatabaseStarter saikuStarter; + private GenerateDatabaseStarter ipccExporterStarter; - public GenerateRDBAnalysisListener(JFrame frame, GenerateDatabaseStarter saikuStarter) { + public IPCCGeneratorListener(JFrame frame, GenerateDatabaseStarter ipccExporterStarter) { this.frame = frame; - this.saikuStarter = saikuStarter; + this.ipccExporterStarter = ipccExporterStarter; } + @Override public void actionPerformed(ActionEvent e) { try { CollectEarthWindow.startWaiting(frame); - exportDataToRDB(); + generateIpccData(); }catch (Exception e1) { logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ } finally{ @@ -32,29 +33,29 @@ public class GenerateRDBAnalysisListener implements ActionListener { } } - private void exportDataToRDB() { - if( saikuStarter.isStarting() ){ - JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.57"), Messages.getString("CollectEarthWindow.58"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ + private void generateIpccData() { + if( ipccExporterStarter.isStarting() ){ + JOptionPane.showMessageDialog(frame, Messages.getString("IPCCGeneratorListener.1"), Messages.getString("IPCCGeneratorListener.2"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ }else{ int shouldRefreshDb = JOptionPane.YES_OPTION; - if( saikuStarter.shouldShowRdbGenerationOption( ExportType.IPCC ) ){ + if( ipccExporterStarter.shouldShowRdbGenerationOption(ExportType.IPCC) ){ - String refresh = Messages.getString("SaikuAnalysisListener.0"); //$NON-NLS-1$ - String close = Messages.getString("SaikuAnalysisListener.1"); //$NON-NLS-1$ + String refresh = Messages.getString("IPCCGeneratorListener.3"); //$NON-NLS-1$ + String close = Messages.getString("IPCCGeneratorListener.4"); //$NON-NLS-1$ String[] options = new String[]{ refresh,close}; shouldRefreshDb = JOptionPane.showOptionDialog( - frame, Messages.getString("CollectEarthWindow.59"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.60"), //$NON-NLS-1$ + frame, Messages.getString("IPCCGeneratorListener.6"), //$NON-NLS-1$ + Messages.getString("IPCCGeneratorListener.5"), //$NON-NLS-1$ JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); } if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ - saikuStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); - saikuStarter.initializeAndOpen( true ); + ipccExporterStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); + ipccExporterStarter.initializeAndOpen( true ); } } } From d0aecc3d20a69e35968223ab45a1281805b9c086 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:01 +0100 Subject: [PATCH 1184/1620] New translations IPCCGeneratorListener.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 0f68388dc7..7c0a5857ae 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -10,21 +10,22 @@ import org.openforis.collect.earth.app.service.ExportType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class GenerateRDBAnalysisListener implements ActionListener { - private Logger logger = LoggerFactory.getLogger( GenerateRDBAnalysisListener.class); +public class IPCCGeneratorListener implements ActionListener { + private Logger logger = LoggerFactory.getLogger( IPCCGeneratorListener.class); private JFrame frame; - private GenerateDatabaseStarter saikuStarter; + private GenerateDatabaseStarter ipccExporterStarter; - public GenerateRDBAnalysisListener(JFrame frame, GenerateDatabaseStarter saikuStarter) { + public IPCCGeneratorListener(JFrame frame, GenerateDatabaseStarter ipccExporterStarter) { this.frame = frame; - this.saikuStarter = saikuStarter; + this.ipccExporterStarter = ipccExporterStarter; } + @Override public void actionPerformed(ActionEvent e) { try { CollectEarthWindow.startWaiting(frame); - exportDataToRDB(); + generateIpccData(); }catch (Exception e1) { logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ } finally{ @@ -32,29 +33,29 @@ public class GenerateRDBAnalysisListener implements ActionListener { } } - private void exportDataToRDB() { - if( saikuStarter.isStarting() ){ - JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.57"), Messages.getString("CollectEarthWindow.58"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ + private void generateIpccData() { + if( ipccExporterStarter.isStarting() ){ + JOptionPane.showMessageDialog(frame, Messages.getString("IPCCGeneratorListener.1"), Messages.getString("IPCCGeneratorListener.2"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ }else{ int shouldRefreshDb = JOptionPane.YES_OPTION; - if( saikuStarter.shouldShowRdbGenerationOption( ExportType.IPCC ) ){ + if( ipccExporterStarter.shouldShowRdbGenerationOption(ExportType.IPCC) ){ - String refresh = Messages.getString("SaikuAnalysisListener.0"); //$NON-NLS-1$ - String close = Messages.getString("SaikuAnalysisListener.1"); //$NON-NLS-1$ + String refresh = Messages.getString("IPCCGeneratorListener.3"); //$NON-NLS-1$ + String close = Messages.getString("IPCCGeneratorListener.4"); //$NON-NLS-1$ String[] options = new String[]{ refresh,close}; shouldRefreshDb = JOptionPane.showOptionDialog( - frame, Messages.getString("CollectEarthWindow.59"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.60"), //$NON-NLS-1$ + frame, Messages.getString("IPCCGeneratorListener.6"), //$NON-NLS-1$ + Messages.getString("IPCCGeneratorListener.5"), //$NON-NLS-1$ JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); } if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ - saikuStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); - saikuStarter.initializeAndOpen( true ); + ipccExporterStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); + ipccExporterStarter.initializeAndOpen( true ); } } } From c22f92f2d641bb0d8d9e6706082230dc5d73dbe1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:03 +0100 Subject: [PATCH 1185/1620] New translations ExportProcessMonitorDialog.java (Spanish) --- .../earth/app/view/Messages_es.properties | 90 ++++++++++--------- 1 file changed, 47 insertions(+), 43 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 7c0a5857ae..0ccb8f2366 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,63 +1,67 @@ package org.openforis.collect.earth.app.view; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; +import java.io.File; import javax.swing.JFrame; -import javax.swing.JOptionPane; +import javax.swing.ProgressMonitor; -import org.openforis.collect.earth.app.service.ExportType; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.view.ExportActionListener.RecordsToExport; +import org.openforis.collect.io.data.DataExportStatus; +import org.openforis.collect.manager.process.AbstractProcess; -public class IPCCGeneratorListener implements ActionListener { - private Logger logger = LoggerFactory.getLogger( IPCCGeneratorListener.class); - private JFrame frame; - private GenerateDatabaseStarter ipccExporterStarter; +public class ExportProcessMonitorDialog extends ProcessMonitorDialog { - public IPCCGeneratorListener(JFrame frame, GenerateDatabaseStarter ipccExporterStarter) { - this.frame = frame; - this.ipccExporterStarter = ipccExporterStarter; - } + private RecordsToExport recordsToExport; + private DataFormat exportFormat; + private EarthSurveyService earthSurveyService; + private LocalPropertiesService localPropertiesService; + private File exportToFile; - @Override - public void actionPerformed(ActionEvent e) { - try { - CollectEarthWindow.startWaiting(frame); - generateIpccData(); - }catch (Exception e1) { - logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ - } finally{ - CollectEarthWindow.endWaiting(frame); - } + public ExportProcessMonitorDialog(AbstractProcess exportProcess, JFrame parentFrame, RecordsToExport recordsToExport, DataFormat exportFormat, EarthSurveyService earthSurveyService, File exportToFile, LocalPropertiesService localPropertiesService ) { + super(); + this.process = exportProcess; + this.recordsToExport = recordsToExport; + this.exportFormat = exportFormat; + this.earthSurveyService = earthSurveyService; + this.exportToFile = exportToFile; + this.localPropertiesService = localPropertiesService; + progressMonitor = new ProgressMonitor(parentFrame, Messages.getString("ExportDialogProcessMonitor.0"), Messages.getString("ExportDialogProcessMonitor.1"), 0, 100); //$NON-NLS-1$ //$NON-NLS-2$ + progressMonitor.setMillisToPopup(1000); + } - private void generateIpccData() { - if( ipccExporterStarter.isStarting() ){ - JOptionPane.showMessageDialog(frame, Messages.getString("IPCCGeneratorListener.1"), Messages.getString("IPCCGeneratorListener.2"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ - }else{ - - int shouldRefreshDb = JOptionPane.YES_OPTION; - - if( ipccExporterStarter.shouldShowRdbGenerationOption(ExportType.IPCC) ){ + protected String getProcessActionMessage() { + return Messages.getString("ExportDialogProcessMonitor.4"); //$NON-NLS-1$ + } - String refresh = Messages.getString("IPCCGeneratorListener.3"); //$NON-NLS-1$ - String close = Messages.getString("IPCCGeneratorListener.4"); //$NON-NLS-1$ - String[] options = new String[]{ refresh,close}; + @Override + public void run() { + try { + monitorProgress(); + process.call(); + if( process.getStatus().isComplete() && exportFormat.equals( DataFormat.ZIP_WITH_XML ) && recordsToExport.equals(RecordsToExport.MODIFIED_SINCE_LAST_EXPORT) ){ + String surveyName = ""; //$NON-NLS-1$ + if( earthSurveyService.getCollectSurvey()!= null ){ + surveyName = earthSurveyService.getCollectSurvey().getName(); + } + localPropertiesService.setLastExportedDate( surveyName ); - shouldRefreshDb = JOptionPane.showOptionDialog( - frame, Messages.getString("IPCCGeneratorListener.6"), //$NON-NLS-1$ - Messages.getString("IPCCGeneratorListener.5"), //$NON-NLS-1$ - JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); } - if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ - ipccExporterStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); - ipccExporterStarter.initializeAndOpen( true ); + if( process.getStatus().isComplete() && ( exportFormat.equals( DataFormat.CSV ) || exportFormat.equals( DataFormat.FUSION ) || exportFormat.equals( DataFormat.KML_FILE ) ) ) { + CollectEarthUtils.openFile( exportToFile ); } + + } catch (final Exception e) { + logger.error("Error starting the process", e); //$NON-NLS-1$ } + } -} \ No newline at end of file + +} From 009069fe6a3428c011721e3cc9e8d2b08165db3f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:04 +0100 Subject: [PATCH 1186/1620] New translations ExportActionListener.java (English) --- .../earth/app/view/Messages_en.properties | 195 +++++++++++++++--- 1 file changed, 167 insertions(+), 28 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 0f68388dc7..6f1756ce73 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -2,61 +2,200 @@ package org.openforis.collect.earth.app.view; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.io.File; +import java.text.DateFormat; +import java.text.Normalizer; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; import javax.swing.JFrame; import javax.swing.JOptionPane; +import javax.swing.JPanel; -import org.openforis.collect.earth.app.service.ExportType; +import org.apache.commons.lang3.StringUtils; +import org.jdesktop.swingx.JXDatePicker; +import org.openforis.collect.earth.app.service.DataImportExportService; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.io.data.DataExportStatus; +import org.openforis.collect.manager.process.AbstractProcess; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class GenerateRDBAnalysisListener implements ActionListener { - private Logger logger = LoggerFactory.getLogger( GenerateRDBAnalysisListener.class); +public final class ExportActionListener implements ActionListener { + private final DataFormat exportFormat; private JFrame frame; - private GenerateDatabaseStarter saikuStarter; + private LocalPropertiesService localPropertiesService; + private DataImportExportService dataExportService; + private EarthSurveyService earthSurveyService; + private Logger logger = LoggerFactory.getLogger(ExportActionListener.class); + private RecordsToExport recordsToExport; - public GenerateRDBAnalysisListener(JFrame frame, GenerateDatabaseStarter saikuStarter) { + public enum RecordsToExport { + ALL, MODIFIED_SINCE_LAST_EXPORT, PICK_FROM_DATE + } + + public ExportActionListener(DataFormat exportFormat, RecordsToExport recordsToExport, JFrame frame, + LocalPropertiesService localPropertiesService, DataImportExportService dataExportService, + EarthSurveyService earthSurveyService) { + this.exportFormat = exportFormat; this.frame = frame; - this.saikuStarter = saikuStarter; + this.localPropertiesService = localPropertiesService; + this.dataExportService = dataExportService; + this.earthSurveyService = earthSurveyService; + this.recordsToExport = recordsToExport; } @Override public void actionPerformed(ActionEvent e) { try { CollectEarthWindow.startWaiting(frame); - exportDataToRDB(); - }catch (Exception e1) { - logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ - } finally{ + + Date recordsModifiedSince = null; + if (recordsToExport.equals(RecordsToExport.MODIFIED_SINCE_LAST_EXPORT)) { + String surveyName = ""; //$NON-NLS-1$ + if (earthSurveyService.getCollectSurvey() != null) { + surveyName = earthSurveyService.getCollectSurvey().getName(); + } + recordsModifiedSince = localPropertiesService.getLastExportedDate(surveyName); + } else if (recordsToExport.equals(RecordsToExport.PICK_FROM_DATE)) { + recordsModifiedSince = getPickDateDlg(); + if (recordsModifiedSince == null) { + // No date chosen, do not proceed with the export + return; + } + } + + exportDataTo(exportFormat, recordsModifiedSince); + } finally { CollectEarthWindow.endWaiting(frame); } + } - private void exportDataToRDB() { - if( saikuStarter.isStarting() ){ - JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.57"), Messages.getString("CollectEarthWindow.58"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ - }else{ + private Date getPickDateDlg() { - int shouldRefreshDb = JOptionPane.YES_OPTION; + JPanel panel = new JPanel(); - if( saikuStarter.shouldShowRdbGenerationOption( ExportType.IPCC ) ){ + JXDatePicker picker = new JXDatePicker(); + picker.setDate(Calendar.getInstance().getTime()); + picker.setFormats(new SimpleDateFormat("dd.MM.yyyy")); //$NON-NLS-1$ - String refresh = Messages.getString("SaikuAnalysisListener.0"); //$NON-NLS-1$ - String close = Messages.getString("SaikuAnalysisListener.1"); //$NON-NLS-1$ - String[] options = new String[]{ refresh,close}; + panel.add(picker); + int result = JOptionPane.showConfirmDialog(frame, panel, Messages.getString("ExportActionListener.1"), //$NON-NLS-1$ + JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); + if (result == JOptionPane.OK_OPTION) { + return picker.getDate(); + } else { + return null; + } + } - shouldRefreshDb = JOptionPane.showOptionDialog( - frame, Messages.getString("CollectEarthWindow.59"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.60"), //$NON-NLS-1$ - JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); - } + private File exportDataTo(DataFormat exportType, Date recordsModifiedSince) { + String preselectedName = getPreselectedName(exportType, recordsModifiedSince); + + File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(exportType, true, false, preselectedName, + localPropertiesService, frame); + + File exportedFile = null; + if (exportToFile != null && exportToFile.length > 0) { + startExportingData(exportType, recordsModifiedSince, exportToFile[0]); + exportedFile = exportToFile[0]; + } + + return exportedFile; + } + + private boolean promptForLabelInclusion(DataFormat exportType) { + boolean includeLabels = false; + + if (exportType.equals(DataFormat.CSV)) { + int result = JOptionPane.showConfirmDialog(frame, "Include labels for code attributes", "Include labels", + JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); + includeLabels = (result == JOptionPane.YES_OPTION); + } + + return includeLabels; + } - if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ - saikuStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); - saikuStarter.initializeAndOpen( true ); + private void startExportingData(DataFormat exportType, Date recordsModifiedSince, File exportToFile) { + AbstractProcess exportProcess = null; + try { + exportProcess = getExportProcess(exportType, recordsModifiedSince, exportToFile); + if (exportProcess != null) { + ExportProcessMonitorDialog exportProcessWorker = new ExportProcessMonitorDialog(exportProcess, frame, + recordsToExport, exportType, earthSurveyService, exportToFile, localPropertiesService); + exportProcessWorker.start(); } + } catch (Exception e1) { + logger.error("What happened?", e1); //$NON-NLS-1$ //$NON-NLS-2$ + JOptionPane.showMessageDialog(this.frame, Messages.getString("CollectEarthWindow.0"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.1"), //$NON-NLS-1$ + JOptionPane.ERROR_MESSAGE); + logger.error( + "Error exporting data to " + exportToFile.getAbsolutePath() + " in format " + exportType.name(), //$NON-NLS-1$ //$NON-NLS-2$ + e1); } } -} \ No newline at end of file + private AbstractProcess getExportProcess(DataFormat exportType, Date recordsModifiedSince, + File exportToFile) throws Exception { + AbstractProcess exportProcess = null; + boolean addLabels = false; + switch (exportType) { + case CSV: + addLabels = promptForLabelInclusion(exportType); + exportProcess = dataExportService.exportSurveyAsCsv(exportToFile, addLabels); + break; + case ZIP_WITH_XML: + exportProcess = dataExportService.exportSurveyAsZipWithXml(exportToFile, recordsModifiedSince); + break; + case FUSION: + addLabels = promptForLabelInclusion(exportType); + exportProcess = dataExportService.exportSurveyAsFusionTable(exportToFile, addLabels); + break; + case COLLECT_BACKUP: + exportProcess = dataExportService.exportSurveyAsBackup(exportToFile); + break; + default: + break; + } + return exportProcess; + } + + private String getPreselectedName(DataFormat exportType, Date modifiedSince) { + + String operator = ""; + + try { + operator = localPropertiesService.getOperator(); + + operator = StringUtils.deleteWhitespace(operator); + // Replaces character like TĥïŠĩš â fůňķŷ Šťŕĭńġ with This is a funky String + operator = Normalizer.normalize(operator, Normalizer.Form.NFD).replaceAll("[^\\p{ASCII}]", ""); + + // Remove non-alphanumeric characters + operator = operator.replaceAll("[^a-zA-Z0-9]", ""); + + } catch (Exception e) { + logger.error("Error normalizing operator name ", e); + } + + String preselectName = operator + "_collectedData_"; //$NON-NLS-1$ + + preselectName += earthSurveyService.getCollectSurvey().getName(); + DateFormat dateFormat = new SimpleDateFormat("ddMMyy_HHmmss"); //$NON-NLS-1$ + if (modifiedSince == null) { + preselectName += "_on_" + dateFormat.format(new Date()); //$NON-NLS-1$ + } else { + + preselectName += "_" + dateFormat.format(modifiedSince) + "_to_" + dateFormat.format(new Date()); //$NON-NLS-1$ //$NON-NLS-2$ + } + + preselectName += "_" + exportType.name() + "." + exportType.getDefaultExtension(); //$NON-NLS-1$ //$NON-NLS-2$ + + return preselectName; + } +} From 5cb952b1b374b09a5a8ef88b0915f0fcb20fd460 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:05 +0100 Subject: [PATCH 1187/1620] New translations CollectEarthMenu.java (English) --- .../earth/app/view/Messages_en.properties | 545 +++++++++++++----- 1 file changed, 402 insertions(+), 143 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 6f1756ce73..4c34fd0a7f 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,201 +1,460 @@ package org.openforis.collect.earth.app.view; -import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; -import java.text.DateFormat; -import java.text.Normalizer; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import javax.swing.ButtonGroup; +import javax.swing.JCheckBoxMenuItem; +import javax.swing.JDialog; import javax.swing.JFrame; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; import javax.swing.JOptionPane; -import javax.swing.JPanel; - -import org.apache.commons.lang3.StringUtils; -import org.jdesktop.swingx.JXDatePicker; +import javax.swing.JRadioButtonMenuItem; +import javax.swing.SwingUtilities; + +import org.apache.commons.lang3.SystemUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.LoggerContext; +import org.apache.logging.log4j.core.config.Configuration; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.EarthConstants.UI_LANGUAGE; +import org.openforis.collect.earth.app.logging.JSwingAppender; +import org.openforis.collect.earth.app.service.AnalysisSaikuService; +import org.openforis.collect.earth.app.service.BackupSqlLiteService; import org.openforis.collect.earth.app.service.DataImportExportService; +import org.openforis.collect.earth.app.service.EarthProjectsService; import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.FolderFinder; +import org.openforis.collect.earth.app.service.IPCCGeneratorService; +import org.openforis.collect.earth.app.service.KmlImportService; import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.io.data.DataExportStatus; -import org.openforis.collect.manager.process.AbstractProcess; -import org.slf4j.Logger; +import org.openforis.collect.earth.app.service.MissingPlotService; +import org.openforis.collect.earth.app.view.ExportActionListener.RecordsToExport; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class CollectEarthMenu extends JMenuBar implements InitializingBean { + + @Autowired + private transient DataImportExportService dataImportExportService; + + @Autowired + private transient KmlImportService kmlImportService; + + @Autowired + private transient MissingPlotService missingPlotService; + + @Autowired + private transient AnalysisSaikuService analysisSaikuService; + + @Autowired + private transient IPCCGeneratorService ipccGeneratorService; + + @Autowired + private transient LocalPropertiesService localPropertiesService; + + @Autowired + private transient CollectEarthWindow collectEarthWindow; + + @Autowired + private transient EarthSurveyService earthSurveyService; + + @Autowired + private transient EarthProjectsService earthProjectsService; + + @Autowired + private transient BackupSqlLiteService backupSqlLiteService; + + @Autowired + private transient RemovePlotsFromDBDlg removePlotsFromDBDlg; -public final class ExportActionListener implements ActionListener { - private final DataFormat exportFormat; + @Autowired + private transient EarthProjectsService projectsService; + + private static final long serialVersionUID = -2457052260968029351L; + private final List serverMenuItems = new ArrayList<>(); private JFrame frame; - private LocalPropertiesService localPropertiesService; - private DataImportExportService dataExportService; - private EarthSurveyService earthSurveyService; - private Logger logger = LoggerFactory.getLogger(ExportActionListener.class); - private RecordsToExport recordsToExport; + private final transient org.slf4j.Logger logger = LoggerFactory.getLogger(CollectEarthMenu.class); - public enum RecordsToExport { - ALL, MODIFIED_SINCE_LAST_EXPORT, PICK_FROM_DATE + public CollectEarthMenu() { + // Where the GUI is created: + super(); } - public ExportActionListener(DataFormat exportFormat, RecordsToExport recordsToExport, JFrame frame, - LocalPropertiesService localPropertiesService, DataImportExportService dataExportService, - EarthSurveyService earthSurveyService) { - this.exportFormat = exportFormat; - this.frame = frame; - this.localPropertiesService = localPropertiesService; - this.dataExportService = dataExportService; - this.earthSurveyService = earthSurveyService; - this.recordsToExport = recordsToExport; + protected void init() { + setFrame(collectEarthWindow.getFrame()); + + // Build file menu in the menu bar. + this.add( getFileMenu() ); + + // Build tools menu in the menu bar. + this.add(getToolsMenu()); + + // Build help menu in the menu bar. + this.add(getHelpMenu()); } @Override - public void actionPerformed(ActionEvent e) { - try { - CollectEarthWindow.startWaiting(frame); - - Date recordsModifiedSince = null; - if (recordsToExport.equals(RecordsToExport.MODIFIED_SINCE_LAST_EXPORT)) { - String surveyName = ""; //$NON-NLS-1$ - if (earthSurveyService.getCollectSurvey() != null) { - surveyName = earthSurveyService.getCollectSurvey().getName(); - } - recordsModifiedSince = localPropertiesService.getLastExportedDate(surveyName); - } else if (recordsToExport.equals(RecordsToExport.PICK_FROM_DATE)) { - recordsModifiedSince = getPickDateDlg(); - if (recordsModifiedSince == null) { - // No date chosen, do not proceed with the export - return; - } - } + public void afterPropertiesSet() throws Exception { + init(); + } - exportDataTo(exportFormat, recordsModifiedSince); - } finally { - CollectEarthWindow.endWaiting(frame); + @Override + public JMenu getHelpMenu() { + JMenu menuHelp = new JMenu(Messages.getString("CollectEarthWindow.16")); //$NON-NLS-1$ + JMenuItem menuItem; + File surveyGuide = earthSurveyService.getSurveyGuide(); + if( surveyGuide != null ) { + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.70")); //$NON-NLS-1$ + menuItem.addActionListener( (e) -> CollectEarthUtils.openFile( surveyGuide) ); + menuHelp.add(menuItem); + menuHelp.addSeparator(); } - } + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.56")); //$NON-NLS-1$ + menuItem.addActionListener(new OpenAboutDialogListener(frame, Messages.getString("CollectEarthWindow.62"))); //$NON-NLS-1$ + menuHelp.add(menuItem); - private Date getPickDateDlg() { + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.17")); //$NON-NLS-1$ + menuItem.addActionListener( + new OpenTextFileListener(frame, getDisclaimerFilePath(), Messages.getString("CollectEarthWindow.4")));//$NON-NLS-1$ + menuHelp.add(menuItem); - JPanel panel = new JPanel(); + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.50")); //$NON-NLS-1$ + menuItem.addActionListener( (e) -> CollectEarthUtils.openFile( new File("UserManual.pdf"))); + menuHelp.add(menuItem); - JXDatePicker picker = new JXDatePicker(); - picker.setDate(Calendar.getInstance().getTime()); - picker.setFormats(new SimpleDateFormat("dd.MM.yyyy")); //$NON-NLS-1$ - panel.add(picker); + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.64")); //$NON-NLS-1$ + menuItem.addActionListener(new OpenSupportForum()); + menuHelp.add(menuItem); - int result = JOptionPane.showConfirmDialog(frame, panel, Messages.getString("ExportActionListener.1"), //$NON-NLS-1$ - JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); - if (result == JOptionPane.OK_OPTION) { - return picker.getDate(); - } else { - return null; + menuHelp.addSeparator(); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.52")); //$NON-NLS-1$ + menuItem.addActionListener( + new OpenTextFileListener(frame, getLogFilePath(), Messages.getString("CollectEarthWindow.53"))); //$NON-NLS-1$ + menuHelp.add(menuItem); + + JCheckBoxMenuItem checkboxErrors = new JCheckBoxMenuItem("Show exception errors", localPropertiesService.isExceptionShown() ); //$NON-NLS-1$ + checkboxErrors.addActionListener( e -> { + // This sets/unsets the property that is checked when an exception is catch by the JSwingAppender log4j2 appender + + Boolean showException = checkboxErrors.isSelected(); + localPropertiesService.setExceptionShown( showException ); + + final LoggerContext ctx = (LoggerContext) LogManager.getContext(false); + final Configuration config = ctx.getConfiguration(); + + JSwingAppender jSwingAppender = config.getAppender("jswing-log"); + + jSwingAppender.setExceptionShown( showException ); } + + ); + menuHelp.add(checkboxErrors); + + + menuHelp.addSeparator(); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.51")); //$NON-NLS-1$ + menuItem.addActionListener(new CheckForUpdatesListener()); + menuHelp.add(menuItem); + return menuHelp; } - private File exportDataTo(DataFormat exportType, Date recordsModifiedSince) { - String preselectedName = getPreselectedName(exportType, recordsModifiedSince); + private JMenu getToolsMenu() { + JMenu toolsMenu = new JMenu(Messages.getString("CollectEarthWindow.12")); //$NON-NLS-1$ + + addImportExportMenu(toolsMenu); + + JMenuItem menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.14")); //$NON-NLS-1$ + menuItem.addActionListener(getSaikuAnalysisActionListener()); + toolsMenu.add(menuItem); + + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.71")); //$NON-NLS-1$ + menuItem.addActionListener(getSaikuToolExportActionListener()); + menuItem.setEnabled(SystemUtils.IS_OS_WINDOWS ); // This option is only available in Windows!! + toolsMenu.add(menuItem); + +/* + toolsMenu.addSeparator(); + menuItem = new JMenuItem("Generate IPCC GHGi software LULUCF package"); //$NON-NLS-1$ + menuItem.addActionListener(getIPCCExportActionListener()); + toolsMenu.add(menuItem); + + + toolsMenu.addSeparator(); +*/ + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.54")); //$NON-NLS-1$ + menuItem.addActionListener(new ApplyOptionChangesListener(this.getFrame(), localPropertiesService) { + + @Override + protected void applyProperties() { + + try { + if (kmlImportService.prompToOpenKml(getFrame())) { + restartEarth(); + } + } catch (Exception e1) { + JOptionPane.showMessageDialog(getFrame(), e1.getMessage(), + Messages.getString("CollectEarthWindow.63"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + logger.error("Error importing KML file", e1); //$NON-NLS-1$ + } - File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(exportType, true, false, preselectedName, - localPropertiesService, frame); + } - File exportedFile = null; - if (exportToFile != null && exportToFile.length > 0) { - startExportingData(exportType, recordsModifiedSince, exportToFile[0]); - exportedFile = exportToFile[0]; - } + }); + serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is + // acting as a client ) + toolsMenu.add(menuItem); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.67")); //$NON-NLS-1$ + menuItem.addActionListener( e-> { + try { + CollectEarthUtils.openFolderInExplorer(FolderFinder.getCollectEarthDataFolder()); + } catch (IOException e1) { + logger.error("Could not find the data folder", e1); + } + }); + serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is + // acting as a client ) + toolsMenu.add(menuItem); - return exportedFile; + toolsMenu.addSeparator(); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.15")); //$NON-NLS-1$ + menuItem.addActionListener(getPropertiesAction(frame)); + toolsMenu.add(menuItem); + toolsMenu.add(getUtilitiesMenu() ); + + toolsMenu.addSeparator(); + toolsMenu.add(getLanguageMenu()); + return toolsMenu; } - private boolean promptForLabelInclusion(DataFormat exportType) { - boolean includeLabels = false; + private JMenu getUtilitiesMenu() { + JMenuItem menuItem; + JMenu utilities = new JMenu(Messages.getString("CollectEarthMenu.2")); //$NON-NLS-1$ - if (exportType.equals(DataFormat.CSV)) { - int result = JOptionPane.showConfirmDialog(frame, "Include labels for code attributes", "Include labels", - JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); - includeLabels = (result == JOptionPane.YES_OPTION); - } + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.18")); //$NON-NLS-1$ + menuItem.addActionListener(new MissingPlotsListener(frame, localPropertiesService, missingPlotService)); + serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is + // acting as a client ) - return includeLabels; + utilities.add(menuItem); + + menuItem = new JMenuItem(Messages.getString("CollectEarthMenu.3")); //$NON-NLS-1$ + menuItem.addActionListener( e -> FileDividerToolDlg.open(frame, earthSurveyService.getCollectSurvey()) ); + serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is // acting as a client ) + utilities.add(menuItem); + + menuItem = new JMenuItem("Delete Plots from DB using CSV"); + menuItem.addActionListener( e -> removePlotsFromDBDlg.open(frame, earthSurveyService.getCollectSurvey()) ); + utilities.add(menuItem); + + + utilities.add(menuItem); + return utilities; } - private void startExportingData(DataFormat exportType, Date recordsModifiedSince, File exportToFile) { - AbstractProcess exportProcess = null; - try { - exportProcess = getExportProcess(exportType, recordsModifiedSince, exportToFile); - if (exportProcess != null) { - ExportProcessMonitorDialog exportProcessWorker = new ExportProcessMonitorDialog(exportProcess, frame, - recordsToExport, exportType, earthSurveyService, exportToFile, localPropertiesService); - exportProcessWorker.start(); + private JMenu getFileMenu() { + JMenu fileMenu = new JMenu(Messages.getString("CollectEarthWindow.10")); //$NON-NLS-1$ + + JMenuItem menuItem = new JMenuItem(Messages.getString("CollectEarthMenu.0")); //$NON-NLS-1$ + menuItem.addActionListener(new ApplyOptionChangesListener(this.getFrame(), localPropertiesService) { + + @Override + protected void applyProperties() { + final File[] selectedProjectFile = JFileChooserExistsAware.getFileChooserResults( + DataFormat.PROJECT_DEFINITION_FILE, false, false, null, localPropertiesService, + getFrame() ); + + if (selectedProjectFile != null && selectedProjectFile.length == 1) { + try { + projectsService.loadCompressedProjectFile(selectedProjectFile[0]); + + restartEarth(); + } catch (Exception e1) { + JOptionPane.showMessageDialog( getFrame(), e1.getMessage(), + Messages.getString("OptionWizard.51"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + logger.error("Error importing project file " + selectedProjectFile[0].getAbsolutePath(), e1); //$NON-NLS-1$ + } + } } - } catch (Exception e1) { - logger.error("What happened?", e1); //$NON-NLS-1$ //$NON-NLS-2$ - JOptionPane.showMessageDialog(this.frame, Messages.getString("CollectEarthWindow.0"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.1"), //$NON-NLS-1$ - JOptionPane.ERROR_MESSAGE); - logger.error( - "Error exporting data to " + exportToFile.getAbsolutePath() + " in format " + exportType.name(), //$NON-NLS-1$ //$NON-NLS-2$ - e1); - } + }); + fileMenu.add(menuItem); + this.add(fileMenu); + fileMenu.addSeparator(); + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.11")); //$NON-NLS-1$ + menuItem.addActionListener(collectEarthWindow.getCloseActionListener()); + fileMenu.add(menuItem); + return fileMenu; + } + + private void addImportExportMenu(JMenu menu) { + + final JMenu ieSubmenu = new JMenu(Messages.getString("CollectEarthWindow.44")); //$NON-NLS-1$ + JMenuItem menuItem; + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.13")); //$NON-NLS-1$ + menuItem.addActionListener(getExportActionListener(DataFormat.CSV, RecordsToExport.ALL)); + ieSubmenu.add(menuItem); + + final JMenu xmlExportSubmenu = new JMenu(Messages.getString("CollectEarthWindow.24")); //$NON-NLS-1$ + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.45")); //$NON-NLS-1$ + menuItem.addActionListener(getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.ALL)); + xmlExportSubmenu.add(menuItem); + + final JMenuItem exportModifiedRecords = new JMenuItem(Messages.getString("CollectEarthWindow.61")); //$NON-NLS-1$ + exportModifiedRecords.addActionListener( + getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.MODIFIED_SINCE_LAST_EXPORT)); + xmlExportSubmenu.add(exportModifiedRecords); + + final JMenuItem exportDataRangeRecords = new JMenuItem(Messages.getString("CollectEarthMenu.4")); //$NON-NLS-1$ + exportDataRangeRecords + .addActionListener(getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.PICK_FROM_DATE)); + xmlExportSubmenu.add(exportDataRangeRecords); + + ieSubmenu.add(xmlExportSubmenu); + + final JMenu backupExportSubmenu = new JMenu(Messages.getString("CollectEarthMenu.5")); //$NON-NLS-1$ + + final JMenuItem exportDataBackup = new JMenuItem(Messages.getString("CollectEarthMenu.6")); //$NON-NLS-1$ + exportDataBackup.addActionListener(getExportActionListener(DataFormat.COLLECT_BACKUP, RecordsToExport.ALL)); + backupExportSubmenu.add(exportDataBackup); + + final JMenuItem exportDataRangeBackup = new JMenuItem(Messages.getString("CollectEarthMenu.7")); //$NON-NLS-1$ + exportDataRangeBackup + .addActionListener(getExportActionListener(DataFormat.COLLECT_BACKUP, RecordsToExport.PICK_FROM_DATE)); + backupExportSubmenu.add(exportDataRangeBackup); + + ieSubmenu.add(backupExportSubmenu); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.6")); //$NON-NLS-1$ + menuItem.addActionListener(getExportActionListener(DataFormat.FUSION, RecordsToExport.ALL)); + ieSubmenu.add(menuItem); + + ieSubmenu.addSeparator(); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.46")); //$NON-NLS-1$ + menuItem.addActionListener(getImportActionListener(DataFormat.ZIP_WITH_XML)); + ieSubmenu.add(menuItem); + + menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.55")); //$NON-NLS-1$ + menuItem.addActionListener(getImportActionListener(DataFormat.CSV)); + ieSubmenu.add(menuItem); + + menu.add(ieSubmenu); + + serverMenuItems.add(ieSubmenu); // This menu should only be shown if the DB is local ( not if Collect Earth is + // acting as a client ) } - private AbstractProcess getExportProcess(DataFormat exportType, Date recordsModifiedSince, - File exportToFile) throws Exception { - AbstractProcess exportProcess = null; - boolean addLabels = false; - switch (exportType) { - case CSV: - addLabels = promptForLabelInclusion(exportType); - exportProcess = dataExportService.exportSurveyAsCsv(exportToFile, addLabels); - break; - case ZIP_WITH_XML: - exportProcess = dataExportService.exportSurveyAsZipWithXml(exportToFile, recordsModifiedSince); - break; - case FUSION: - addLabels = promptForLabelInclusion(exportType); - exportProcess = dataExportService.exportSurveyAsFusionTable(exportToFile, addLabels); - break; - case COLLECT_BACKUP: - exportProcess = dataExportService.exportSurveyAsBackup(exportToFile); - break; - default: - break; + private String getDisclaimerFilePath() { + final String suffixLang = localPropertiesService.getUiLanguage().getLocale().getLanguage(); + if (new File("resources/disclaimer_" + suffixLang + ".txt").exists()) { //$NON-NLS-1$ //$NON-NLS-2$ + return "resources/disclaimer_" + suffixLang + ".txt"; + } else { + return "resources/disclaimer_en.txt"; } - return exportProcess; } - private String getPreselectedName(DataFormat exportType, Date modifiedSince) { + private ActionListener getExportActionListener(final DataFormat exportFormat, final RecordsToExport xmlExportType) { + return new ExportActionListener(exportFormat, xmlExportType, getFrame(), localPropertiesService, + dataImportExportService, earthSurveyService); + } - String operator = ""; + private ActionListener getImportActionListener(final DataFormat importFormat) { + return new ImportActionListener(importFormat, getFrame(), localPropertiesService, dataImportExportService); + } - try { - operator = localPropertiesService.getOperator(); + private JMenu getLanguageMenu() { - operator = StringUtils.deleteWhitespace(operator); - // Replaces character like TĥïŠĩš â fůňķŷ Šťŕĭńġ with This is a funky String - operator = Normalizer.normalize(operator, Normalizer.Form.NFD).replaceAll("[^\\p{ASCII}]", ""); + final ActionListener actionLanguage = e -> { + try { + final String langName = ((JRadioButtonMenuItem) e.getSource()).getName(); + final UI_LANGUAGE language = UI_LANGUAGE.valueOf(langName); + CollectEarthUtils.setFontDependingOnLanguaue(language); + localPropertiesService.setUiLanguage(language); - // Remove non-alphanumeric characters - operator = operator.replaceAll("[^a-zA-Z0-9]", ""); + SwingUtilities.invokeLater( () -> { + getFrame().getContentPane().removeAll(); + getFrame().dispose(); + collectEarthWindow.openWindow(); + }); - } catch (Exception e) { - logger.error("Error normalizing operator name ", e); - } + } catch (final Exception ex) { + logger.error("Error while changing language", ex); //$NON-NLS-1$ + } + }; - String preselectName = operator + "_collectedData_"; //$NON-NLS-1$ + final JMenu menuLanguage = new JMenu(Messages.getString("CollectEarthWindow.2")); //$NON-NLS-1$ - preselectName += earthSurveyService.getCollectSurvey().getName(); - DateFormat dateFormat = new SimpleDateFormat("ddMMyy_HHmmss"); //$NON-NLS-1$ - if (modifiedSince == null) { - preselectName += "_on_" + dateFormat.format(new Date()); //$NON-NLS-1$ - } else { + final ButtonGroup group = new ButtonGroup(); + final UI_LANGUAGE[] languages = UI_LANGUAGE.values(); + + for (final UI_LANGUAGE language : languages) { + final JRadioButtonMenuItem langItem = new JRadioButtonMenuItem(language.getLabel()); + langItem.setName(language.name()); + langItem.addActionListener(actionLanguage); + menuLanguage.add(langItem); + group.add(menuLanguage); + if (localPropertiesService.getUiLanguage().equals(language)) { + langItem.setSelected(true); + } - preselectName += "_" + dateFormat.format(modifiedSince) + "_to_" + dateFormat.format(new Date()); //$NON-NLS-1$ //$NON-NLS-2$ } - preselectName += "_" + exportType.name() + "." + exportType.getDefaultExtension(); //$NON-NLS-1$ //$NON-NLS-2$ + return menuLanguage; + } + + public ActionListener getPropertiesAction(final JFrame owner) { + return e -> { + final JDialog dialog = new PropertiesDialog(owner, localPropertiesService, earthProjectsService, + backupSqlLiteService.getAutomaticBackUpFolder().getPath(), analysisSaikuService, + earthSurveyService.getCollectSurvey()); + dialog.setVisible(true); + dialog.pack(); + }; + } + + private ActionListener getSaikuAnalysisActionListener() { + return new GenerateRDBAnalysisListener(getFrame(), new GenerateDatabaseStarter(analysisSaikuService, getFrame() ) ); + } + + private ActionListener getSaikuToolExportActionListener() { + return new SaikuToolExportListener(getFrame(), new GenerateDatabaseStarter(analysisSaikuService, getFrame() ), localPropertiesService); + } + + + private ActionListener getIPCCExportActionListener() { + return new IPCCGeneratorListener(getFrame(), new GenerateDatabaseStarter(ipccGeneratorService, getFrame() ) ); + } + + private String getLogFilePath() { + return FolderFinder.getCollectEarthDataFolder() + "/earth_error.log"; //$NON-NLS-1$ + } + + public JFrame getFrame() { + return frame; + } + + public void setFrame(JFrame frame) { + this.frame = frame; + } - return preselectName; + public List getServerMenuItems() { + return serverMenuItems; } } From 003f1076b402a8f29fcfccf2e0c80b494e7f2726 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:06 +0100 Subject: [PATCH 1188/1620] New translations ComboBoxItem.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 93 +++++++++---------- 1 file changed, 43 insertions(+), 50 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 7c0a5857ae..b3ee730e05 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,63 +1,56 @@ package org.openforis.collect.earth.app.view; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -import javax.swing.JFrame; -import javax.swing.JOptionPane; - -import org.openforis.collect.earth.app.service.ExportType; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class IPCCGeneratorListener implements ActionListener { - private Logger logger = LoggerFactory.getLogger( IPCCGeneratorListener.class); - private JFrame frame; - private GenerateDatabaseStarter ipccExporterStarter; - - public IPCCGeneratorListener(JFrame frame, GenerateDatabaseStarter ipccExporterStarter) { - this.frame = frame; - this.ipccExporterStarter = ipccExporterStarter; +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ +class ComboBoxItem { + + private Integer numberOfPoints; + private String label; + + protected ComboBoxItem(int numberOfPoints, String label) { + super(); + this.numberOfPoints = numberOfPoints; + this.label = label; } - @Override - public void actionPerformed(ActionEvent e) { - try { - CollectEarthWindow.startWaiting(frame); - generateIpccData(); - }catch (Exception e1) { - logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ - } finally{ - CollectEarthWindow.endWaiting(frame); + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + ComboBoxItem other = (ComboBoxItem) obj; + if (numberOfPoints == null) { + if (other.numberOfPoints != null) + return false; + } else { + if (!numberOfPoints.equals(other.numberOfPoints)) + return false; } - } - - private void generateIpccData() { - if( ipccExporterStarter.isStarting() ){ - JOptionPane.showMessageDialog(frame, Messages.getString("IPCCGeneratorListener.1"), Messages.getString("IPCCGeneratorListener.2"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ - }else{ - - int shouldRefreshDb = JOptionPane.YES_OPTION; - if( ipccExporterStarter.shouldShowRdbGenerationOption(ExportType.IPCC) ){ - - String refresh = Messages.getString("IPCCGeneratorListener.3"); //$NON-NLS-1$ - String close = Messages.getString("IPCCGeneratorListener.4"); //$NON-NLS-1$ - String[] options = new String[]{ refresh,close}; + return true; + } + public int getNumberOfPoints() { + return numberOfPoints; + } - shouldRefreshDb = JOptionPane.showOptionDialog( - frame, Messages.getString("IPCCGeneratorListener.6"), //$NON-NLS-1$ - Messages.getString("IPCCGeneratorListener.5"), //$NON-NLS-1$ - JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); - } + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((label == null) ? 0 : label.hashCode()); + result = prime * result + ((numberOfPoints == null) ? 0 : numberOfPoints.hashCode()); + return result; + } - if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ - ipccExporterStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); - ipccExporterStarter.initializeAndOpen( true ); - } - } + @Override + public String toString() { + return label; } } \ No newline at end of file From fec3f4af9d15b061cf91ea55822bb9b0b59fd536 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:07 +0100 Subject: [PATCH 1189/1620] New translations CollectEarthTransferHandler.java (French) --- .../earth/app/view/Messages_fr.properties | 181 ++++++++++++++---- 1 file changed, 143 insertions(+), 38 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 7c0a5857ae..65dd7f9161 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,63 +1,168 @@ package org.openforis.collect.earth.app.view; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.Transferable; +import java.io.File; +import java.util.List; -import javax.swing.JFrame; -import javax.swing.JOptionPane; +import javax.swing.JComponent; +import javax.swing.TransferHandler; -import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.KmlImportService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; -public class IPCCGeneratorListener implements ActionListener { - private Logger logger = LoggerFactory.getLogger( IPCCGeneratorListener.class); - private JFrame frame; - private GenerateDatabaseStarter ipccExporterStarter; +@Component +public class CollectEarthTransferHandler extends TransferHandler { - public IPCCGeneratorListener(JFrame frame, GenerateDatabaseStarter ipccExporterStarter) { - this.frame = frame; - this.ipccExporterStarter = ipccExporterStarter; - } + @Autowired + private transient CollectEarthWindow collectEarthWindow; + + @Autowired + private transient LocalPropertiesService localPropertiesService; + + @Autowired + private transient KmlImportService kmlImportService; + private static final long serialVersionUID = 1L; + private transient Logger logger = LoggerFactory.getLogger( CollectEarthTransferHandler.class); + /* + * Can Only import an object if it represents a SINGLE file + * (non-Javadoc) + * @see javax.swing.TransferHandler#canImport(javax.swing.TransferHandler.TransferSupport) + */ @Override - public void actionPerformed(ActionEvent e) { - try { - CollectEarthWindow.startWaiting(frame); - generateIpccData(); - }catch (Exception e1) { - logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ - } finally{ - CollectEarthWindow.endWaiting(frame); + public boolean canImport(TransferSupport support) { + + if( support.isDataFlavorSupported(DataFlavor.javaFileListFlavor) ){ + Transferable t = support.getTransferable(); + List data; + try { + data = (List)t.getTransferData(DataFlavor.javaFileListFlavor); + + if( data !=null && data.size() == 1){ + return isFileExtensionValid( data.get(0) ); + }else { + return false; + } + + }catch(java.awt.dnd.InvalidDnDOperationException unknownException) { + logger.warn("Why do I get this error?t", unknownException); + return true; + }catch (Exception e) { + logger.error("Error on the drop support assessment", e); + return false; + } + }else{ + return false; } + } - private void generateIpccData() { - if( ipccExporterStarter.isStarting() ){ - JOptionPane.showMessageDialog(frame, Messages.getString("IPCCGeneratorListener.1"), Messages.getString("IPCCGeneratorListener.2"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ - }else{ - int shouldRefreshDb = JOptionPane.YES_OPTION; + private String getFileExtension(File file) { + String fileName = file.getName(); + int lastIndexOf = fileName.lastIndexOf('.' ); + String fileExtenxion = null; + if( lastIndexOf >0 ){ + fileExtenxion = fileName.substring( lastIndexOf + 1 ); + } + return fileExtenxion; + } + + + private boolean isFileExtensionValid(File file ){ + String fileExtension = getFileExtension(file); + return fileExtension!=null && ( DataFormat.COLLECT_COORDS.checkFileExtensionMatches(fileExtension) || DataFormat.PROJECT_DEFINITION_FILE.checkFileExtensionMatches(fileExtension) || DataFormat.KML_FILE.checkFileExtensionMatches(fileExtension) ); + } - if( ipccExporterStarter.shouldShowRdbGenerationOption(ExportType.IPCC) ){ + /* + * We support both copy and move actions. + * (non-Javadoc) + * @see javax.swing.TransferHandler#getSourceActions(javax.swing.JComponent) + */ + @Override + public int getSourceActions(JComponent c) { + return COPY_OR_MOVE; + } + + + /* + * Perform the actual import. This demo only supports drag and drop. + * (non-Javadoc) + * @see javax.swing.TransferHandler#importData(javax.swing.TransferHandler.TransferSupport) + */ + @Override + public boolean importData(TransferSupport info) { + if (!info.isDrop()) { + return false; + } - String refresh = Messages.getString("IPCCGeneratorListener.3"); //$NON-NLS-1$ - String close = Messages.getString("IPCCGeneratorListener.4"); //$NON-NLS-1$ - String[] options = new String[]{ refresh,close}; + // Get the file that is being dropped. + Transferable t = info.getTransferable(); + List data; + try { + data = (List)t.getTransferData(DataFlavor.javaFileListFlavor); + if( data.size()!=1){ + throw new IllegalArgumentException("The drop action supports only single file drops!"); + } + File fileToImport = data.get(0); - shouldRefreshDb = JOptionPane.showOptionDialog( - frame, Messages.getString("IPCCGeneratorListener.6"), //$NON-NLS-1$ - Messages.getString("IPCCGeneratorListener.5"), //$NON-NLS-1$ - JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); + if( !isFileExtensionValid(fileToImport)){ + throw new IllegalArgumentException("The drop action supports only files of type!" + DataFormat.COLLECT_COORDS + " or " + DataFormat.PROJECT_DEFINITION_FILE); } - if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ - ipccExporterStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); - ipccExporterStarter.initializeAndOpen( true ); + String fileExtension = getFileExtension(fileToImport); + + // If it is a CEP file then import + if( DataFormat.PROJECT_DEFINITION_FILE.checkFileExtensionMatches(fileExtension)){ + EarthApp.openProjectFileInRunningCollectEarth( fileToImport.getAbsolutePath() ); + }else if( DataFormat.COLLECT_COORDS.checkFileExtensionMatches(fileExtension)){ + + importCSVWithPlots(fileToImport); + + }else if( DataFormat.KML_FILE.checkFileExtensionMatches( fileExtension ) ) { + + // Check if the CSV file can be loaded in the survey!!! + + if( kmlImportService.loadFromKml( null, fileToImport ) ){ + EarthApp.executeKmlLoadAsynchronously( collectEarthWindow.getFrame() ); + } + + + }else{ + throw new IllegalArgumentException("Unknown file extension!!"); } + } + catch (Exception e) { + logger.error("Error on the drop action", e); + return false; + } + + + + + return true; } -} \ No newline at end of file + + private void importCSVWithPlots(File fileToImport) { + try{ + localPropertiesService.setValue( EarthProperty.SAMPLE_FILE, fileToImport.getAbsolutePath() ); + EarthApp.executeKmlLoadAsynchronously( collectEarthWindow.getFrame() ); + }catch( Exception kmlGenerationException ){ + logger.error( "Problem loading CSV file dropped into the window" , kmlGenerationException ); + EarthApp.showMessage(" Problem loading CSV file" + kmlGenerationException.getCause() ); + } + } + + +} From 9b97013d5a6a1e9028dd6ef6271c3072ec4164df Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:09 +0100 Subject: [PATCH 1190/1620] New translations CollectEarthTransferHandler.java (Spanish) --- .../earth/app/view/Messages_es.properties | 187 ++++++++++++++---- 1 file changed, 144 insertions(+), 43 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 0ccb8f2366..65dd7f9161 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,66 +1,167 @@ package org.openforis.collect.earth.app.view; +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.Transferable; import java.io.File; +import java.util.List; -import javax.swing.JFrame; -import javax.swing.ProgressMonitor; +import javax.swing.JComponent; +import javax.swing.TransferHandler; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.KmlImportService; import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.view.ExportActionListener.RecordsToExport; -import org.openforis.collect.io.data.DataExportStatus; -import org.openforis.collect.manager.process.AbstractProcess; - -public class ExportProcessMonitorDialog extends ProcessMonitorDialog { - - - private RecordsToExport recordsToExport; - private DataFormat exportFormat; - private EarthSurveyService earthSurveyService; - private LocalPropertiesService localPropertiesService; - private File exportToFile; - - public ExportProcessMonitorDialog(AbstractProcess exportProcess, JFrame parentFrame, RecordsToExport recordsToExport, DataFormat exportFormat, EarthSurveyService earthSurveyService, File exportToFile, LocalPropertiesService localPropertiesService ) { - super(); - this.process = exportProcess; - this.recordsToExport = recordsToExport; - this.exportFormat = exportFormat; - this.earthSurveyService = earthSurveyService; - this.exportToFile = exportToFile; - this.localPropertiesService = localPropertiesService; - progressMonitor = new ProgressMonitor(parentFrame, Messages.getString("ExportDialogProcessMonitor.0"), Messages.getString("ExportDialogProcessMonitor.1"), 0, 100); //$NON-NLS-1$ //$NON-NLS-2$ - progressMonitor.setMillisToPopup(1000); - +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class CollectEarthTransferHandler extends TransferHandler { + + @Autowired + private transient CollectEarthWindow collectEarthWindow; + + @Autowired + private transient LocalPropertiesService localPropertiesService; + + @Autowired + private transient KmlImportService kmlImportService; + + private static final long serialVersionUID = 1L; + private transient Logger logger = LoggerFactory.getLogger( CollectEarthTransferHandler.class); + + /* + * Can Only import an object if it represents a SINGLE file + * (non-Javadoc) + * @see javax.swing.TransferHandler#canImport(javax.swing.TransferHandler.TransferSupport) + */ + @Override + public boolean canImport(TransferSupport support) { + + if( support.isDataFlavorSupported(DataFlavor.javaFileListFlavor) ){ + Transferable t = support.getTransferable(); + List data; + try { + data = (List)t.getTransferData(DataFlavor.javaFileListFlavor); + + if( data !=null && data.size() == 1){ + return isFileExtensionValid( data.get(0) ); + }else { + return false; + } + + }catch(java.awt.dnd.InvalidDnDOperationException unknownException) { + logger.warn("Why do I get this error?t", unknownException); + return true; + }catch (Exception e) { + logger.error("Error on the drop support assessment", e); + return false; + } + }else{ + return false; + } + + } + + + private String getFileExtension(File file) { + String fileName = file.getName(); + int lastIndexOf = fileName.lastIndexOf('.' ); + String fileExtenxion = null; + if( lastIndexOf >0 ){ + fileExtenxion = fileName.substring( lastIndexOf + 1 ); + } + return fileExtenxion; } - protected String getProcessActionMessage() { - return Messages.getString("ExportDialogProcessMonitor.4"); //$NON-NLS-1$ + + private boolean isFileExtensionValid(File file ){ + String fileExtension = getFileExtension(file); + return fileExtension!=null && ( DataFormat.COLLECT_COORDS.checkFileExtensionMatches(fileExtension) || DataFormat.PROJECT_DEFINITION_FILE.checkFileExtensionMatches(fileExtension) || DataFormat.KML_FILE.checkFileExtensionMatches(fileExtension) ); } + /* + * We support both copy and move actions. + * (non-Javadoc) + * @see javax.swing.TransferHandler#getSourceActions(javax.swing.JComponent) + */ @Override - public void run() { + public int getSourceActions(JComponent c) { + return COPY_OR_MOVE; + } + + /* + * Perform the actual import. This demo only supports drag and drop. + * (non-Javadoc) + * @see javax.swing.TransferHandler#importData(javax.swing.TransferHandler.TransferSupport) + */ + @Override + public boolean importData(TransferSupport info) { + if (!info.isDrop()) { + return false; + } + + // Get the file that is being dropped. + Transferable t = info.getTransferable(); + List data; try { - monitorProgress(); - process.call(); - if( process.getStatus().isComplete() && exportFormat.equals( DataFormat.ZIP_WITH_XML ) && recordsToExport.equals(RecordsToExport.MODIFIED_SINCE_LAST_EXPORT) ){ - String surveyName = ""; //$NON-NLS-1$ - if( earthSurveyService.getCollectSurvey()!= null ){ - surveyName = earthSurveyService.getCollectSurvey().getName(); - } - localPropertiesService.setLastExportedDate( surveyName ); + data = (List)t.getTransferData(DataFlavor.javaFileListFlavor); + if( data.size()!=1){ + throw new IllegalArgumentException("The drop action supports only single file drops!"); + } + File fileToImport = data.get(0); + + if( !isFileExtensionValid(fileToImport)){ + throw new IllegalArgumentException("The drop action supports only files of type!" + DataFormat.COLLECT_COORDS + " or " + DataFormat.PROJECT_DEFINITION_FILE); } - if( process.getStatus().isComplete() && ( exportFormat.equals( DataFormat.CSV ) || exportFormat.equals( DataFormat.FUSION ) || exportFormat.equals( DataFormat.KML_FILE ) ) ) { - CollectEarthUtils.openFile( exportToFile ); + String fileExtension = getFileExtension(fileToImport); + + // If it is a CEP file then import + if( DataFormat.PROJECT_DEFINITION_FILE.checkFileExtensionMatches(fileExtension)){ + EarthApp.openProjectFileInRunningCollectEarth( fileToImport.getAbsolutePath() ); + }else if( DataFormat.COLLECT_COORDS.checkFileExtensionMatches(fileExtension)){ + + importCSVWithPlots(fileToImport); + + }else if( DataFormat.KML_FILE.checkFileExtensionMatches( fileExtension ) ) { + + // Check if the CSV file can be loaded in the survey!!! + + if( kmlImportService.loadFromKml( null, fileToImport ) ){ + EarthApp.executeKmlLoadAsynchronously( collectEarthWindow.getFrame() ); + } + + + }else{ + throw new IllegalArgumentException("Unknown file extension!!"); } - } catch (final Exception e) { - logger.error("Error starting the process", e); //$NON-NLS-1$ } + catch (Exception e) { + logger.error("Error on the drop action", e); + return false; + } + + + + return true; + } + + + private void importCSVWithPlots(File fileToImport) { + try{ + localPropertiesService.setValue( EarthProperty.SAMPLE_FILE, fileToImport.getAbsolutePath() ); + EarthApp.executeKmlLoadAsynchronously( collectEarthWindow.getFrame() ); + }catch( Exception kmlGenerationException ){ + logger.error( "Problem loading CSV file dropped into the window" , kmlGenerationException ); + EarthApp.showMessage(" Problem loading CSV file" + kmlGenerationException.getCause() ); + } } From 79cd20c0e9c6f3329f04895a7d92db7700fc9424 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:10 +0100 Subject: [PATCH 1191/1620] New translations CollectEarthTransferHandler.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 190 ++++++++++++++---- 1 file changed, 151 insertions(+), 39 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index b3ee730e05..65dd7f9161 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,56 +1,168 @@ package org.openforis.collect.earth.app.view; -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ -class ComboBoxItem { - - private Integer numberOfPoints; - private String label; - - protected ComboBoxItem(int numberOfPoints, String label) { - super(); - this.numberOfPoints = numberOfPoints; - this.label = label; - } +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.Transferable; +import java.io.File; +import java.util.List; + +import javax.swing.JComponent; +import javax.swing.TransferHandler; + +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.KmlImportService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class CollectEarthTransferHandler extends TransferHandler { + + @Autowired + private transient CollectEarthWindow collectEarthWindow; + + @Autowired + private transient LocalPropertiesService localPropertiesService; + + @Autowired + private transient KmlImportService kmlImportService; + private static final long serialVersionUID = 1L; + private transient Logger logger = LoggerFactory.getLogger( CollectEarthTransferHandler.class); + + /* + * Can Only import an object if it represents a SINGLE file + * (non-Javadoc) + * @see javax.swing.TransferHandler#canImport(javax.swing.TransferHandler.TransferSupport) + */ @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - ComboBoxItem other = (ComboBoxItem) obj; - if (numberOfPoints == null) { - if (other.numberOfPoints != null) - return false; - } else { - if (!numberOfPoints.equals(other.numberOfPoints)) + public boolean canImport(TransferSupport support) { + + if( support.isDataFlavorSupported(DataFlavor.javaFileListFlavor) ){ + Transferable t = support.getTransferable(); + List data; + try { + data = (List)t.getTransferData(DataFlavor.javaFileListFlavor); + + if( data !=null && data.size() == 1){ + return isFileExtensionValid( data.get(0) ); + }else { + return false; + } + + }catch(java.awt.dnd.InvalidDnDOperationException unknownException) { + logger.warn("Why do I get this error?t", unknownException); + return true; + }catch (Exception e) { + logger.error("Error on the drop support assessment", e); return false; + } + }else{ + return false; } - return true; } - public int getNumberOfPoints() { - return numberOfPoints; + + private String getFileExtension(File file) { + String fileName = file.getName(); + int lastIndexOf = fileName.lastIndexOf('.' ); + String fileExtenxion = null; + if( lastIndexOf >0 ){ + fileExtenxion = fileName.substring( lastIndexOf + 1 ); + } + return fileExtenxion; + } + + + private boolean isFileExtensionValid(File file ){ + String fileExtension = getFileExtension(file); + return fileExtension!=null && ( DataFormat.COLLECT_COORDS.checkFileExtensionMatches(fileExtension) || DataFormat.PROJECT_DEFINITION_FILE.checkFileExtensionMatches(fileExtension) || DataFormat.KML_FILE.checkFileExtensionMatches(fileExtension) ); } + /* + * We support both copy and move actions. + * (non-Javadoc) + * @see javax.swing.TransferHandler#getSourceActions(javax.swing.JComponent) + */ @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((label == null) ? 0 : label.hashCode()); - result = prime * result + ((numberOfPoints == null) ? 0 : numberOfPoints.hashCode()); - return result; + public int getSourceActions(JComponent c) { + return COPY_OR_MOVE; } + + /* + * Perform the actual import. This demo only supports drag and drop. + * (non-Javadoc) + * @see javax.swing.TransferHandler#importData(javax.swing.TransferHandler.TransferSupport) + */ @Override - public String toString() { - return label; + public boolean importData(TransferSupport info) { + if (!info.isDrop()) { + return false; + } + + // Get the file that is being dropped. + Transferable t = info.getTransferable(); + List data; + try { + data = (List)t.getTransferData(DataFlavor.javaFileListFlavor); + if( data.size()!=1){ + throw new IllegalArgumentException("The drop action supports only single file drops!"); + } + + File fileToImport = data.get(0); + + if( !isFileExtensionValid(fileToImport)){ + throw new IllegalArgumentException("The drop action supports only files of type!" + DataFormat.COLLECT_COORDS + " or " + DataFormat.PROJECT_DEFINITION_FILE); + } + + String fileExtension = getFileExtension(fileToImport); + + // If it is a CEP file then import + if( DataFormat.PROJECT_DEFINITION_FILE.checkFileExtensionMatches(fileExtension)){ + EarthApp.openProjectFileInRunningCollectEarth( fileToImport.getAbsolutePath() ); + }else if( DataFormat.COLLECT_COORDS.checkFileExtensionMatches(fileExtension)){ + + importCSVWithPlots(fileToImport); + + }else if( DataFormat.KML_FILE.checkFileExtensionMatches( fileExtension ) ) { + + // Check if the CSV file can be loaded in the survey!!! + + if( kmlImportService.loadFromKml( null, fileToImport ) ){ + EarthApp.executeKmlLoadAsynchronously( collectEarthWindow.getFrame() ); + } + + + }else{ + throw new IllegalArgumentException("Unknown file extension!!"); + } + + } + catch (Exception e) { + logger.error("Error on the drop action", e); + return false; + } + + + + + return true; + } + + + private void importCSVWithPlots(File fileToImport) { + try{ + localPropertiesService.setValue( EarthProperty.SAMPLE_FILE, fileToImport.getAbsolutePath() ); + EarthApp.executeKmlLoadAsynchronously( collectEarthWindow.getFrame() ); + }catch( Exception kmlGenerationException ){ + logger.error( "Problem loading CSV file dropped into the window" , kmlGenerationException ); + EarthApp.showMessage(" Problem loading CSV file" + kmlGenerationException.getCause() ); + } } -} \ No newline at end of file + +} From 10489a3c294411d787fd9a5f04911f19838a7659 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:11 +0100 Subject: [PATCH 1192/1620] New translations CollectEarthTransferHandler.java (English) --- .../earth/app/view/Messages_en.properties | 500 ++++-------------- 1 file changed, 104 insertions(+), 396 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 4c34fd0a7f..65dd7f9161 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,460 +1,168 @@ package org.openforis.collect.earth.app.view; -import java.awt.event.ActionListener; +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.Transferable; import java.io.File; -import java.io.IOException; -import java.util.ArrayList; import java.util.List; -import javax.swing.ButtonGroup; -import javax.swing.JCheckBoxMenuItem; -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JMenu; -import javax.swing.JMenuBar; -import javax.swing.JMenuItem; -import javax.swing.JOptionPane; -import javax.swing.JRadioButtonMenuItem; -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.SystemUtils; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.core.LoggerContext; -import org.apache.logging.log4j.core.config.Configuration; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants.UI_LANGUAGE; -import org.openforis.collect.earth.app.logging.JSwingAppender; -import org.openforis.collect.earth.app.service.AnalysisSaikuService; -import org.openforis.collect.earth.app.service.BackupSqlLiteService; -import org.openforis.collect.earth.app.service.DataImportExportService; -import org.openforis.collect.earth.app.service.EarthProjectsService; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.FolderFinder; -import org.openforis.collect.earth.app.service.IPCCGeneratorService; +import javax.swing.JComponent; +import javax.swing.TransferHandler; + +import org.openforis.collect.earth.app.desktop.EarthApp; import org.openforis.collect.earth.app.service.KmlImportService; import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.MissingPlotService; -import org.openforis.collect.earth.app.view.ExportActionListener.RecordsToExport; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component -public class CollectEarthMenu extends JMenuBar implements InitializingBean { - - @Autowired - private transient DataImportExportService dataImportExportService; +public class CollectEarthTransferHandler extends TransferHandler { @Autowired - private transient KmlImportService kmlImportService; - - @Autowired - private transient MissingPlotService missingPlotService; - - @Autowired - private transient AnalysisSaikuService analysisSaikuService; - - @Autowired - private transient IPCCGeneratorService ipccGeneratorService; + private transient CollectEarthWindow collectEarthWindow; @Autowired private transient LocalPropertiesService localPropertiesService; @Autowired - private transient CollectEarthWindow collectEarthWindow; - - @Autowired - private transient EarthSurveyService earthSurveyService; + private transient KmlImportService kmlImportService; - @Autowired - private transient EarthProjectsService earthProjectsService; + private static final long serialVersionUID = 1L; + private transient Logger logger = LoggerFactory.getLogger( CollectEarthTransferHandler.class); - @Autowired - private transient BackupSqlLiteService backupSqlLiteService; + /* + * Can Only import an object if it represents a SINGLE file + * (non-Javadoc) + * @see javax.swing.TransferHandler#canImport(javax.swing.TransferHandler.TransferSupport) + */ + @Override + public boolean canImport(TransferSupport support) { - @Autowired - private transient RemovePlotsFromDBDlg removePlotsFromDBDlg; + if( support.isDataFlavorSupported(DataFlavor.javaFileListFlavor) ){ + Transferable t = support.getTransferable(); + List data; + try { + data = (List)t.getTransferData(DataFlavor.javaFileListFlavor); - @Autowired - private transient EarthProjectsService projectsService; + if( data !=null && data.size() == 1){ + return isFileExtensionValid( data.get(0) ); + }else { + return false; + } - private static final long serialVersionUID = -2457052260968029351L; - private final List serverMenuItems = new ArrayList<>(); - private JFrame frame; - private final transient org.slf4j.Logger logger = LoggerFactory.getLogger(CollectEarthMenu.class); + }catch(java.awt.dnd.InvalidDnDOperationException unknownException) { + logger.warn("Why do I get this error?t", unknownException); + return true; + }catch (Exception e) { + logger.error("Error on the drop support assessment", e); + return false; + } + }else{ + return false; + } - public CollectEarthMenu() { - // Where the GUI is created: - super(); } - protected void init() { - setFrame(collectEarthWindow.getFrame()); - // Build file menu in the menu bar. - this.add( getFileMenu() ); + private String getFileExtension(File file) { + String fileName = file.getName(); + int lastIndexOf = fileName.lastIndexOf('.' ); + String fileExtenxion = null; + if( lastIndexOf >0 ){ + fileExtenxion = fileName.substring( lastIndexOf + 1 ); + } + return fileExtenxion; + } - // Build tools menu in the menu bar. - this.add(getToolsMenu()); - // Build help menu in the menu bar. - this.add(getHelpMenu()); + private boolean isFileExtensionValid(File file ){ + String fileExtension = getFileExtension(file); + return fileExtension!=null && ( DataFormat.COLLECT_COORDS.checkFileExtensionMatches(fileExtension) || DataFormat.PROJECT_DEFINITION_FILE.checkFileExtensionMatches(fileExtension) || DataFormat.KML_FILE.checkFileExtensionMatches(fileExtension) ); } + /* + * We support both copy and move actions. + * (non-Javadoc) + * @see javax.swing.TransferHandler#getSourceActions(javax.swing.JComponent) + */ @Override - public void afterPropertiesSet() throws Exception { - init(); + public int getSourceActions(JComponent c) { + return COPY_OR_MOVE; } - @Override - public JMenu getHelpMenu() { - JMenu menuHelp = new JMenu(Messages.getString("CollectEarthWindow.16")); //$NON-NLS-1$ - JMenuItem menuItem; - File surveyGuide = earthSurveyService.getSurveyGuide(); - if( surveyGuide != null ) { - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.70")); //$NON-NLS-1$ - menuItem.addActionListener( (e) -> CollectEarthUtils.openFile( surveyGuide) ); - menuHelp.add(menuItem); - menuHelp.addSeparator(); - } - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.56")); //$NON-NLS-1$ - menuItem.addActionListener(new OpenAboutDialogListener(frame, Messages.getString("CollectEarthWindow.62"))); //$NON-NLS-1$ - menuHelp.add(menuItem); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.17")); //$NON-NLS-1$ - menuItem.addActionListener( - new OpenTextFileListener(frame, getDisclaimerFilePath(), Messages.getString("CollectEarthWindow.4")));//$NON-NLS-1$ - menuHelp.add(menuItem); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.50")); //$NON-NLS-1$ - menuItem.addActionListener( (e) -> CollectEarthUtils.openFile( new File("UserManual.pdf"))); - menuHelp.add(menuItem); - - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.64")); //$NON-NLS-1$ - menuItem.addActionListener(new OpenSupportForum()); - menuHelp.add(menuItem); - - menuHelp.addSeparator(); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.52")); //$NON-NLS-1$ - menuItem.addActionListener( - new OpenTextFileListener(frame, getLogFilePath(), Messages.getString("CollectEarthWindow.53"))); //$NON-NLS-1$ - menuHelp.add(menuItem); - - JCheckBoxMenuItem checkboxErrors = new JCheckBoxMenuItem("Show exception errors", localPropertiesService.isExceptionShown() ); //$NON-NLS-1$ - checkboxErrors.addActionListener( e -> { - // This sets/unsets the property that is checked when an exception is catch by the JSwingAppender log4j2 appender - - Boolean showException = checkboxErrors.isSelected(); - localPropertiesService.setExceptionShown( showException ); - - final LoggerContext ctx = (LoggerContext) LogManager.getContext(false); - final Configuration config = ctx.getConfiguration(); - - JSwingAppender jSwingAppender = config.getAppender("jswing-log"); - jSwingAppender.setExceptionShown( showException ); + /* + * Perform the actual import. This demo only supports drag and drop. + * (non-Javadoc) + * @see javax.swing.TransferHandler#importData(javax.swing.TransferHandler.TransferSupport) + */ + @Override + public boolean importData(TransferSupport info) { + if (!info.isDrop()) { + return false; } - ); - menuHelp.add(checkboxErrors); - - - menuHelp.addSeparator(); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.51")); //$NON-NLS-1$ - menuItem.addActionListener(new CheckForUpdatesListener()); - menuHelp.add(menuItem); - return menuHelp; - } - - private JMenu getToolsMenu() { - JMenu toolsMenu = new JMenu(Messages.getString("CollectEarthWindow.12")); //$NON-NLS-1$ - - addImportExportMenu(toolsMenu); - - JMenuItem menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.14")); //$NON-NLS-1$ - menuItem.addActionListener(getSaikuAnalysisActionListener()); - toolsMenu.add(menuItem); - - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.71")); //$NON-NLS-1$ - menuItem.addActionListener(getSaikuToolExportActionListener()); - menuItem.setEnabled(SystemUtils.IS_OS_WINDOWS ); // This option is only available in Windows!! - toolsMenu.add(menuItem); - -/* - toolsMenu.addSeparator(); - menuItem = new JMenuItem("Generate IPCC GHGi software LULUCF package"); //$NON-NLS-1$ - menuItem.addActionListener(getIPCCExportActionListener()); - toolsMenu.add(menuItem); - - - toolsMenu.addSeparator(); -*/ - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.54")); //$NON-NLS-1$ - menuItem.addActionListener(new ApplyOptionChangesListener(this.getFrame(), localPropertiesService) { - - @Override - protected void applyProperties() { - - try { - if (kmlImportService.prompToOpenKml(getFrame())) { - restartEarth(); - } - } catch (Exception e1) { - JOptionPane.showMessageDialog(getFrame(), e1.getMessage(), - Messages.getString("CollectEarthWindow.63"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - logger.error("Error importing KML file", e1); //$NON-NLS-1$ - } - + // Get the file that is being dropped. + Transferable t = info.getTransferable(); + List data; + try { + data = (List)t.getTransferData(DataFlavor.javaFileListFlavor); + if( data.size()!=1){ + throw new IllegalArgumentException("The drop action supports only single file drops!"); } - }); - serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is - // acting as a client ) - toolsMenu.add(menuItem); + File fileToImport = data.get(0); - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.67")); //$NON-NLS-1$ - menuItem.addActionListener( e-> { - try { - CollectEarthUtils.openFolderInExplorer(FolderFinder.getCollectEarthDataFolder()); - } catch (IOException e1) { - logger.error("Could not find the data folder", e1); + if( !isFileExtensionValid(fileToImport)){ + throw new IllegalArgumentException("The drop action supports only files of type!" + DataFormat.COLLECT_COORDS + " or " + DataFormat.PROJECT_DEFINITION_FILE); } - }); - serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is - // acting as a client ) - toolsMenu.add(menuItem); - - toolsMenu.addSeparator(); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.15")); //$NON-NLS-1$ - menuItem.addActionListener(getPropertiesAction(frame)); - toolsMenu.add(menuItem); - toolsMenu.add(getUtilitiesMenu() ); - - toolsMenu.addSeparator(); - toolsMenu.add(getLanguageMenu()); - return toolsMenu; - } - - private JMenu getUtilitiesMenu() { - JMenuItem menuItem; - JMenu utilities = new JMenu(Messages.getString("CollectEarthMenu.2")); //$NON-NLS-1$ - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.18")); //$NON-NLS-1$ - menuItem.addActionListener(new MissingPlotsListener(frame, localPropertiesService, missingPlotService)); - serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is - // acting as a client ) - - utilities.add(menuItem); - menuItem = new JMenuItem(Messages.getString("CollectEarthMenu.3")); //$NON-NLS-1$ - menuItem.addActionListener( e -> FileDividerToolDlg.open(frame, earthSurveyService.getCollectSurvey()) ); - serverMenuItems.add(menuItem); // This menu should only be shown if the DB is local ( not if Collect Earth is // acting as a client ) - utilities.add(menuItem); + String fileExtension = getFileExtension(fileToImport); - menuItem = new JMenuItem("Delete Plots from DB using CSV"); - menuItem.addActionListener( e -> removePlotsFromDBDlg.open(frame, earthSurveyService.getCollectSurvey()) ); - utilities.add(menuItem); - - - utilities.add(menuItem); - return utilities; - } + // If it is a CEP file then import + if( DataFormat.PROJECT_DEFINITION_FILE.checkFileExtensionMatches(fileExtension)){ + EarthApp.openProjectFileInRunningCollectEarth( fileToImport.getAbsolutePath() ); + }else if( DataFormat.COLLECT_COORDS.checkFileExtensionMatches(fileExtension)){ - private JMenu getFileMenu() { - JMenu fileMenu = new JMenu(Messages.getString("CollectEarthWindow.10")); //$NON-NLS-1$ + importCSVWithPlots(fileToImport); - JMenuItem menuItem = new JMenuItem(Messages.getString("CollectEarthMenu.0")); //$NON-NLS-1$ - menuItem.addActionListener(new ApplyOptionChangesListener(this.getFrame(), localPropertiesService) { + }else if( DataFormat.KML_FILE.checkFileExtensionMatches( fileExtension ) ) { - @Override - protected void applyProperties() { - final File[] selectedProjectFile = JFileChooserExistsAware.getFileChooserResults( - DataFormat.PROJECT_DEFINITION_FILE, false, false, null, localPropertiesService, - getFrame() ); + // Check if the CSV file can be loaded in the survey!!! - if (selectedProjectFile != null && selectedProjectFile.length == 1) { - try { - projectsService.loadCompressedProjectFile(selectedProjectFile[0]); - - restartEarth(); - } catch (Exception e1) { - JOptionPane.showMessageDialog( getFrame(), e1.getMessage(), - Messages.getString("OptionWizard.51"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - logger.error("Error importing project file " + selectedProjectFile[0].getAbsolutePath(), e1); //$NON-NLS-1$ - } + if( kmlImportService.loadFromKml( null, fileToImport ) ){ + EarthApp.executeKmlLoadAsynchronously( collectEarthWindow.getFrame() ); } - } - }); - fileMenu.add(menuItem); - this.add(fileMenu); - fileMenu.addSeparator(); - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.11")); //$NON-NLS-1$ - menuItem.addActionListener(collectEarthWindow.getCloseActionListener()); - fileMenu.add(menuItem); - return fileMenu; - } - - private void addImportExportMenu(JMenu menu) { - - final JMenu ieSubmenu = new JMenu(Messages.getString("CollectEarthWindow.44")); //$NON-NLS-1$ - JMenuItem menuItem; - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.13")); //$NON-NLS-1$ - menuItem.addActionListener(getExportActionListener(DataFormat.CSV, RecordsToExport.ALL)); - ieSubmenu.add(menuItem); - - final JMenu xmlExportSubmenu = new JMenu(Messages.getString("CollectEarthWindow.24")); //$NON-NLS-1$ - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.45")); //$NON-NLS-1$ - menuItem.addActionListener(getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.ALL)); - xmlExportSubmenu.add(menuItem); - - final JMenuItem exportModifiedRecords = new JMenuItem(Messages.getString("CollectEarthWindow.61")); //$NON-NLS-1$ - exportModifiedRecords.addActionListener( - getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.MODIFIED_SINCE_LAST_EXPORT)); - xmlExportSubmenu.add(exportModifiedRecords); - - final JMenuItem exportDataRangeRecords = new JMenuItem(Messages.getString("CollectEarthMenu.4")); //$NON-NLS-1$ - exportDataRangeRecords - .addActionListener(getExportActionListener(DataFormat.ZIP_WITH_XML, RecordsToExport.PICK_FROM_DATE)); - xmlExportSubmenu.add(exportDataRangeRecords); - - ieSubmenu.add(xmlExportSubmenu); - - final JMenu backupExportSubmenu = new JMenu(Messages.getString("CollectEarthMenu.5")); //$NON-NLS-1$ - - final JMenuItem exportDataBackup = new JMenuItem(Messages.getString("CollectEarthMenu.6")); //$NON-NLS-1$ - exportDataBackup.addActionListener(getExportActionListener(DataFormat.COLLECT_BACKUP, RecordsToExport.ALL)); - backupExportSubmenu.add(exportDataBackup); - - final JMenuItem exportDataRangeBackup = new JMenuItem(Messages.getString("CollectEarthMenu.7")); //$NON-NLS-1$ - exportDataRangeBackup - .addActionListener(getExportActionListener(DataFormat.COLLECT_BACKUP, RecordsToExport.PICK_FROM_DATE)); - backupExportSubmenu.add(exportDataRangeBackup); - - ieSubmenu.add(backupExportSubmenu); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.6")); //$NON-NLS-1$ - menuItem.addActionListener(getExportActionListener(DataFormat.FUSION, RecordsToExport.ALL)); - ieSubmenu.add(menuItem); - - ieSubmenu.addSeparator(); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.46")); //$NON-NLS-1$ - menuItem.addActionListener(getImportActionListener(DataFormat.ZIP_WITH_XML)); - ieSubmenu.add(menuItem); - - menuItem = new JMenuItem(Messages.getString("CollectEarthWindow.55")); //$NON-NLS-1$ - menuItem.addActionListener(getImportActionListener(DataFormat.CSV)); - ieSubmenu.add(menuItem); - menu.add(ieSubmenu); - serverMenuItems.add(ieSubmenu); // This menu should only be shown if the DB is local ( not if Collect Earth is - // acting as a client ) - } - - private String getDisclaimerFilePath() { - final String suffixLang = localPropertiesService.getUiLanguage().getLocale().getLanguage(); - if (new File("resources/disclaimer_" + suffixLang + ".txt").exists()) { //$NON-NLS-1$ //$NON-NLS-2$ - return "resources/disclaimer_" + suffixLang + ".txt"; - } else { - return "resources/disclaimer_en.txt"; - } - } - - private ActionListener getExportActionListener(final DataFormat exportFormat, final RecordsToExport xmlExportType) { - return new ExportActionListener(exportFormat, xmlExportType, getFrame(), localPropertiesService, - dataImportExportService, earthSurveyService); - } - - private ActionListener getImportActionListener(final DataFormat importFormat) { - return new ImportActionListener(importFormat, getFrame(), localPropertiesService, dataImportExportService); - } - - private JMenu getLanguageMenu() { - - final ActionListener actionLanguage = e -> { - try { - final String langName = ((JRadioButtonMenuItem) e.getSource()).getName(); - final UI_LANGUAGE language = UI_LANGUAGE.valueOf(langName); - CollectEarthUtils.setFontDependingOnLanguaue(language); - localPropertiesService.setUiLanguage(language); - - SwingUtilities.invokeLater( () -> { - getFrame().getContentPane().removeAll(); - getFrame().dispose(); - collectEarthWindow.openWindow(); - }); - - } catch (final Exception ex) { - logger.error("Error while changing language", ex); //$NON-NLS-1$ - } - }; - - final JMenu menuLanguage = new JMenu(Messages.getString("CollectEarthWindow.2")); //$NON-NLS-1$ - - final ButtonGroup group = new ButtonGroup(); - final UI_LANGUAGE[] languages = UI_LANGUAGE.values(); - - for (final UI_LANGUAGE language : languages) { - final JRadioButtonMenuItem langItem = new JRadioButtonMenuItem(language.getLabel()); - langItem.setName(language.name()); - langItem.addActionListener(actionLanguage); - menuLanguage.add(langItem); - group.add(menuLanguage); - if (localPropertiesService.getUiLanguage().equals(language)) { - langItem.setSelected(true); + }else{ + throw new IllegalArgumentException("Unknown file extension!!"); } } + catch (Exception e) { + logger.error("Error on the drop action", e); + return false; + } - return menuLanguage; - } - public ActionListener getPropertiesAction(final JFrame owner) { - return e -> { - final JDialog dialog = new PropertiesDialog(owner, localPropertiesService, earthProjectsService, - backupSqlLiteService.getAutomaticBackUpFolder().getPath(), analysisSaikuService, - earthSurveyService.getCollectSurvey()); - dialog.setVisible(true); - dialog.pack(); - }; - } - private ActionListener getSaikuAnalysisActionListener() { - return new GenerateRDBAnalysisListener(getFrame(), new GenerateDatabaseStarter(analysisSaikuService, getFrame() ) ); - } - - private ActionListener getSaikuToolExportActionListener() { - return new SaikuToolExportListener(getFrame(), new GenerateDatabaseStarter(analysisSaikuService, getFrame() ), localPropertiesService); - } - - private ActionListener getIPCCExportActionListener() { - return new IPCCGeneratorListener(getFrame(), new GenerateDatabaseStarter(ipccGeneratorService, getFrame() ) ); - } - - private String getLogFilePath() { - return FolderFinder.getCollectEarthDataFolder() + "/earth_error.log"; //$NON-NLS-1$ + return true; } - public JFrame getFrame() { - return frame; - } - public void setFrame(JFrame frame) { - this.frame = frame; + private void importCSVWithPlots(File fileToImport) { + try{ + localPropertiesService.setValue( EarthProperty.SAMPLE_FILE, fileToImport.getAbsolutePath() ); + EarthApp.executeKmlLoadAsynchronously( collectEarthWindow.getFrame() ); + }catch( Exception kmlGenerationException ){ + logger.error( "Problem loading CSV file dropped into the window" , kmlGenerationException ); + EarthApp.showMessage(" Problem loading CSV file" + kmlGenerationException.getCause() ); + } } - public List getServerMenuItems() { - return serverMenuItems; - } + } From 426bf7fe6658f26f0ce14e29d67ecedb7623e89b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:12 +0100 Subject: [PATCH 1193/1620] New translations CollectEarthWindow.java (French) --- .../earth/app/view/Messages_fr.properties | 366 ++++++++++++------ 1 file changed, 257 insertions(+), 109 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 65dd7f9161..ee88f71564 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,168 +1,316 @@ package org.openforis.collect.earth.app.view; -import java.awt.datatransfer.DataFlavor; -import java.awt.datatransfer.Transferable; +import java.awt.Color; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.Window; +import java.awt.event.ActionListener; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; import java.io.File; -import java.util.List; - -import javax.swing.JComponent; -import javax.swing.TransferHandler; - +import java.io.IOException; +import java.net.MalformedURLException; + +import javax.swing.BorderFactory; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JTextField; +import javax.swing.SwingConstants; +import javax.swing.SwingUtilities; +import javax.swing.Timer; +import javax.swing.WindowConstants; +import javax.swing.border.Border; + +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.EarthConstants.OperationMode; import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.KmlImportService; +import org.openforis.collect.earth.app.service.EarthSurveyService; import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ @Component -public class CollectEarthTransferHandler extends TransferHandler { +@Lazy(false) +public class CollectEarthWindow implements InitializingBean, DisposableBean{ @Autowired - private transient CollectEarthWindow collectEarthWindow; + private LocalPropertiesService localPropertiesService; @Autowired - private transient LocalPropertiesService localPropertiesService; + private EarthSurveyService earthSurveyService; @Autowired - private transient KmlImportService kmlImportService; + private CollectEarthTransferHandler collectEarthTransferHandler; - private static final long serialVersionUID = 1L; - private transient Logger logger = LoggerFactory.getLogger( CollectEarthTransferHandler.class); + @Autowired + private CollectEarthMenu collectEarthMenu; - /* - * Can Only import an object if it represents a SINGLE file - * (non-Javadoc) - * @see javax.swing.TransferHandler#canImport(javax.swing.TransferHandler.TransferSupport) - */ - @Override - public boolean canImport(TransferSupport support) { + public static void endWaiting(Window frame) { + frame.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); + } - if( support.isDataFlavorSupported(DataFlavor.javaFileListFlavor) ){ - Transferable t = support.getTransferable(); - List data; - try { - data = (List)t.getTransferData(DataFlavor.javaFileListFlavor); + public static void startWaiting(Window frame) { + frame.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); + } - if( data !=null && data.size() == 1){ - return isFileExtensionValid( data.get(0) ); - }else { - return false; - } + private JFrame frame; + private final Logger logger = LoggerFactory.getLogger(CollectEarthWindow.class); + private JTextField operatorTextField; + + public static final Color ERROR_COLOR = new Color(225, 124, 124); + + public CollectEarthWindow() throws IOException { + // Create and set up the window. + JFrame framePriv = new JFrame(Messages.getString("CollectEarthWindow.19"));//$NON-NLS-1$ + + setFrame(framePriv); + } - }catch(java.awt.dnd.InvalidDnDOperationException unknownException) { - logger.warn("Why do I get this error?t", unknownException); - return true; - }catch (Exception e) { - logger.error("Error on the drop support assessment", e); - return false; + private void init() { + Messages.setLocale(localPropertiesService.getUiLanguage().getLocale()); + javax.swing.SwingUtilities.invokeLater( () -> { + try { + CollectEarthWindow.this.openWindow(); + } catch (final Exception e) { + logger.error("Cannot start Earth App", e); //$NON-NLS-1$ + System.exit(0); } - }else{ - return false; - } + }); + } + @Override + public void afterPropertiesSet() throws Exception { + init(); + } + @Override + public void destroy() throws Exception { + SwingUtilities.invokeAndWait( () -> CollectEarthWindow.this.getFrame().dispose() ); } + private void addWindowClosingListener() { + getFrame().addWindowListener(new WindowAdapter() { + + @Override + public void windowClosing(WindowEvent e) { + try { + final String keepOpen = Messages.getString("CollectEarthWindow.37"); //$NON-NLS-1$ + final String close = Messages.getString("CollectEarthWindow.42"); //$NON-NLS-1$ + final String[] options = new String[] { close, keepOpen }; + + final int confirmation = JOptionPane.showOptionDialog(getFrame(), + Messages.getString("CollectEarthWindow.22"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.23"), //$NON-NLS-1$ + JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, keepOpen); + + if (confirmation == JOptionPane.YES_OPTION) { + final Thread stopServer = new Thread("Stopping server") { + @Override + public void run() { + try { + EarthApp.quitServer(); + } catch (final Exception e) { + logger.error("Error when trying to closing the server", e); //$NON-NLS-1$ + } + } + }; + + getFrame().setVisible(false); + getFrame().dispose(); + stopServer.start(); + Thread.sleep(5000); + + System.exit(0); + } + }catch (final InterruptedException e1) { + logger.error("Error when interupting thread", e1); //$NON-NLS-1$ + Thread.currentThread().interrupt(); + } catch (final Exception e1) { + logger.error("Error when trying to shutdown the server when window is closed", e1); //$NON-NLS-1$ + } - private String getFileExtension(File file) { - String fileName = file.getName(); - int lastIndexOf = fileName.lastIndexOf('.' ); - String fileExtenxion = null; - if( lastIndexOf >0 ){ - fileExtenxion = fileName.substring( lastIndexOf + 1 ); + } + }); + } + + private void disableMenuItems() { + if (localPropertiesService.getOperationMode().equals(OperationMode.CLIENT_MODE)) { + for (final JMenuItem menuItem : collectEarthMenu.getServerMenuItems()) { + menuItem.setEnabled(false); + } } - return fileExtenxion; } + private void displayWindow() { + getFrame().setLocationRelativeTo(null); + getFrame().pack(); + getFrame().setVisible(true); + } - private boolean isFileExtensionValid(File file ){ - String fileExtension = getFileExtension(file); - return fileExtension!=null && ( DataFormat.COLLECT_COORDS.checkFileExtensionMatches(fileExtension) || DataFormat.PROJECT_DEFINITION_FILE.checkFileExtensionMatches(fileExtension) || DataFormat.KML_FILE.checkFileExtensionMatches(fileExtension) ); + protected ActionListener getCloseActionListener() { + return e -> getFrame().dispatchEvent(new WindowEvent(getFrame(), WindowEvent.WINDOW_CLOSING)); } - /* - * We support both copy and move actions. - * (non-Javadoc) - * @see javax.swing.TransferHandler#getSourceActions(javax.swing.JComponent) - */ - @Override - public int getSourceActions(JComponent c) { - return COPY_OR_MOVE; + public JFrame getFrame() { + return frame; } + private String getOperator() { + return localPropertiesService.getOperator(); + } - /* - * Perform the actual import. This demo only supports drag and drop. - * (non-Javadoc) - * @see javax.swing.TransferHandler#importData(javax.swing.TransferHandler.TransferSupport) - */ - @Override - public boolean importData(TransferSupport info) { - if (!info.isDrop()) { - return false; - } + private void initializeMenu() { - // Get the file that is being dropped. - Transferable t = info.getTransferable(); - List data; - try { - data = (List)t.getTransferData(DataFlavor.javaFileListFlavor); - if( data.size()!=1){ - throw new IllegalArgumentException("The drop action supports only single file drops!"); - } + collectEarthMenu.removeAll(); + collectEarthMenu.init(); + getFrame().setJMenuBar( collectEarthMenu ); - File fileToImport = data.get(0); + disableMenuItems(); + } - if( !isFileExtensionValid(fileToImport)){ - throw new IllegalArgumentException("The drop action supports only files of type!" + DataFormat.COLLECT_COORDS + " or " + DataFormat.PROJECT_DEFINITION_FILE); + private void updateOperatorName() { + final String operatorName = operatorTextField.getText().trim(); + if( !operatorName.equals(localPropertiesService.getOperator() ) ) { + if (operatorName.length() > 5 && operatorName.length() < 50 ) { + localPropertiesService.saveOperator(operatorName); + operatorTextField.setBackground(Color.white); + JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.65"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.66"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ + } else{ + JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.33"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.34"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + operatorTextField.setText(getOperator()); } + } + } - String fileExtension = getFileExtension(fileToImport); - - // If it is a CEP file then import - if( DataFormat.PROJECT_DEFINITION_FILE.checkFileExtensionMatches(fileExtension)){ - EarthApp.openProjectFileInRunningCollectEarth( fileToImport.getAbsolutePath() ); - }else if( DataFormat.COLLECT_COORDS.checkFileExtensionMatches(fileExtension)){ + private void initializePanel() { + final JPanel pane = new JPanel(new GridBagLayout()); - importCSVWithPlots(fileToImport); + final Border raisedetched = BorderFactory.createRaisedBevelBorder(); + pane.setBorder(raisedetched); - }else if( DataFormat.KML_FILE.checkFileExtensionMatches( fileExtension ) ) { + // Handle Drag and Drop of files into the panel + pane.setTransferHandler(collectEarthTransferHandler); - // Check if the CSV file can be loaded in the survey!!! - - if( kmlImportService.loadFromKml( null, fileToImport ) ){ - EarthApp.executeKmlLoadAsynchronously( collectEarthWindow.getFrame() ); - } + final GridBagConstraints c = new GridBagConstraints(); + operatorTextField = new JTextField(getOperator(), 30); + if (StringUtils.isBlank(getOperator())) { + operatorTextField.setBackground(ERROR_COLOR); + } - }else{ - throw new IllegalArgumentException("Unknown file extension!!"); + final JLabel operatorTextLabel = new JLabel(Messages.getString("CollectEarthWindow.26"), SwingConstants.CENTER); //$NON-NLS-1$ + operatorTextLabel.setSize(100, 20); + + // final JButton updateOperator = new JButton(Messages.getString("CollectEarthWindow.27")); //$NON-NLS-1$ + c.insets = new Insets(3, 3, 3, 3); + c.fill = GridBagConstraints.HORIZONTAL; + c.gridx = 0; + c.gridy = 0; + pane.add(operatorTextLabel, c); + + c.weightx = 0; + c.gridx = 1; + c.gridy = 0; + pane.add(operatorTextField, c); + + c.gridx = 2; + c.gridy = 0; + // pane.add(updateOperator, c); + + c.gridx = 0; + c.gridy++; + c.gridwidth = GridBagConstraints.REMAINDER; + pane.add(new JLabel(Messages.getString("CollectEarthWindow.28") + "
" //$NON-NLS-1$ //$NON-NLS-2$ + + Messages.getString("CollectEarthWindow.30")), c); //$NON-NLS-1$ + + c.gridx = 0; + c.gridy++; + c.gridwidth = GridBagConstraints.REMAINDER; + c.fill = GridBagConstraints.NONE; + final JButton propertiesButton = new JButton(Messages.getString("CollectEarthWindow.15")); //$NON-NLS-1$ + propertiesButton.addActionListener( collectEarthMenu.getPropertiesAction( frame ) ); + pane.add(propertiesButton, c); + + getFrame().getContentPane().add(pane); + + // Three seconds after the last key is typed on hte text field the operator name changes on the properties service + Timer timerOperatorChanged = new Timer(3000, e-> updateOperatorName() ); + + operatorTextField.addKeyListener( new KeyAdapter() { + @Override + public void keyTyped(KeyEvent e) { + timerOperatorChanged.restart(); } + }); + } - } - catch (Exception e) { - logger.error("Error on the drop action", e); - return false; + private void initializeWindow() { + + // Initialize the translations + Messages.setLocale(localPropertiesService.getUiLanguage().getLocale()); + getFrame().setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); + getFrame().setResizable(false); + try { + getFrame().setIconImage( + new ImageIcon(new File("images/smallOpenForisBanner.png").toURI().toURL()).getImage()); //$NON-NLS-1$ + } catch (final MalformedURLException e2) { + logger.error(Messages.getString("CollectEarthWindow.21"), e2); //$NON-NLS-1$ } + addWindowClosingListener(); + } + protected void openWindow() { + initializeWindow(); + initializePanel(); + initializeMenu(); + displayWindow(); + if (StringUtils.isBlank(getOperator())) { + JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.35"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.36"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + } - return true; + changeFrameTitle(); } - - private void importCSVWithPlots(File fileToImport) { - try{ - localPropertiesService.setValue( EarthProperty.SAMPLE_FILE, fileToImport.getAbsolutePath() ); - EarthApp.executeKmlLoadAsynchronously( collectEarthWindow.getFrame() ); - }catch( Exception kmlGenerationException ){ - logger.error( "Problem loading CSV file dropped into the window" , kmlGenerationException ); - EarthApp.showMessage(" Problem loading CSV file" + kmlGenerationException.getCause() ); + public void changeFrameTitle() { + String name = " - No survey loaded"; + if (earthSurveyService.getCollectSurvey() != null) { + if (!StringUtils.isBlank(earthSurveyService.getCollectSurvey() + .getProjectName(localPropertiesService.getUiLanguage().getLocale().getLanguage()))) { + name = " - " + earthSurveyService.getCollectSurvey() + .getProjectName(localPropertiesService.getUiLanguage().getLocale().getLanguage()); + } else if (!StringUtils.isBlank(earthSurveyService.getCollectSurvey().getProjectName())) { + name = " - " + earthSurveyService.getCollectSurvey().getProjectName(); + } else { + name = " - " + earthSurveyService.getCollectSurvey() + .getDescription(localPropertiesService.getUiLanguage().getLocale().getLanguage()); + } } + getFrame().setTitle(Messages.getString("CollectEarthWindow.19") + name); } + void setFrame(JFrame frame) { + this.frame = frame; + } -} +} \ No newline at end of file From b4c30ecefe65a18f0c239af0631c41c4b9a52e8a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:13 +0100 Subject: [PATCH 1194/1620] New translations CollectEarthWindow.java (Spanish) --- .../earth/app/view/Messages_es.properties | 366 ++++++++++++------ 1 file changed, 257 insertions(+), 109 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 65dd7f9161..ee88f71564 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,168 +1,316 @@ package org.openforis.collect.earth.app.view; -import java.awt.datatransfer.DataFlavor; -import java.awt.datatransfer.Transferable; +import java.awt.Color; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.Window; +import java.awt.event.ActionListener; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; import java.io.File; -import java.util.List; - -import javax.swing.JComponent; -import javax.swing.TransferHandler; - +import java.io.IOException; +import java.net.MalformedURLException; + +import javax.swing.BorderFactory; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JTextField; +import javax.swing.SwingConstants; +import javax.swing.SwingUtilities; +import javax.swing.Timer; +import javax.swing.WindowConstants; +import javax.swing.border.Border; + +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.EarthConstants.OperationMode; import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.KmlImportService; +import org.openforis.collect.earth.app.service.EarthSurveyService; import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ @Component -public class CollectEarthTransferHandler extends TransferHandler { +@Lazy(false) +public class CollectEarthWindow implements InitializingBean, DisposableBean{ @Autowired - private transient CollectEarthWindow collectEarthWindow; + private LocalPropertiesService localPropertiesService; @Autowired - private transient LocalPropertiesService localPropertiesService; + private EarthSurveyService earthSurveyService; @Autowired - private transient KmlImportService kmlImportService; + private CollectEarthTransferHandler collectEarthTransferHandler; - private static final long serialVersionUID = 1L; - private transient Logger logger = LoggerFactory.getLogger( CollectEarthTransferHandler.class); + @Autowired + private CollectEarthMenu collectEarthMenu; - /* - * Can Only import an object if it represents a SINGLE file - * (non-Javadoc) - * @see javax.swing.TransferHandler#canImport(javax.swing.TransferHandler.TransferSupport) - */ - @Override - public boolean canImport(TransferSupport support) { + public static void endWaiting(Window frame) { + frame.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); + } - if( support.isDataFlavorSupported(DataFlavor.javaFileListFlavor) ){ - Transferable t = support.getTransferable(); - List data; - try { - data = (List)t.getTransferData(DataFlavor.javaFileListFlavor); + public static void startWaiting(Window frame) { + frame.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); + } - if( data !=null && data.size() == 1){ - return isFileExtensionValid( data.get(0) ); - }else { - return false; - } + private JFrame frame; + private final Logger logger = LoggerFactory.getLogger(CollectEarthWindow.class); + private JTextField operatorTextField; + + public static final Color ERROR_COLOR = new Color(225, 124, 124); + + public CollectEarthWindow() throws IOException { + // Create and set up the window. + JFrame framePriv = new JFrame(Messages.getString("CollectEarthWindow.19"));//$NON-NLS-1$ + + setFrame(framePriv); + } - }catch(java.awt.dnd.InvalidDnDOperationException unknownException) { - logger.warn("Why do I get this error?t", unknownException); - return true; - }catch (Exception e) { - logger.error("Error on the drop support assessment", e); - return false; + private void init() { + Messages.setLocale(localPropertiesService.getUiLanguage().getLocale()); + javax.swing.SwingUtilities.invokeLater( () -> { + try { + CollectEarthWindow.this.openWindow(); + } catch (final Exception e) { + logger.error("Cannot start Earth App", e); //$NON-NLS-1$ + System.exit(0); } - }else{ - return false; - } + }); + } + @Override + public void afterPropertiesSet() throws Exception { + init(); + } + @Override + public void destroy() throws Exception { + SwingUtilities.invokeAndWait( () -> CollectEarthWindow.this.getFrame().dispose() ); } + private void addWindowClosingListener() { + getFrame().addWindowListener(new WindowAdapter() { + + @Override + public void windowClosing(WindowEvent e) { + try { + final String keepOpen = Messages.getString("CollectEarthWindow.37"); //$NON-NLS-1$ + final String close = Messages.getString("CollectEarthWindow.42"); //$NON-NLS-1$ + final String[] options = new String[] { close, keepOpen }; + + final int confirmation = JOptionPane.showOptionDialog(getFrame(), + Messages.getString("CollectEarthWindow.22"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.23"), //$NON-NLS-1$ + JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, keepOpen); + + if (confirmation == JOptionPane.YES_OPTION) { + final Thread stopServer = new Thread("Stopping server") { + @Override + public void run() { + try { + EarthApp.quitServer(); + } catch (final Exception e) { + logger.error("Error when trying to closing the server", e); //$NON-NLS-1$ + } + } + }; + + getFrame().setVisible(false); + getFrame().dispose(); + stopServer.start(); + Thread.sleep(5000); + + System.exit(0); + } + }catch (final InterruptedException e1) { + logger.error("Error when interupting thread", e1); //$NON-NLS-1$ + Thread.currentThread().interrupt(); + } catch (final Exception e1) { + logger.error("Error when trying to shutdown the server when window is closed", e1); //$NON-NLS-1$ + } - private String getFileExtension(File file) { - String fileName = file.getName(); - int lastIndexOf = fileName.lastIndexOf('.' ); - String fileExtenxion = null; - if( lastIndexOf >0 ){ - fileExtenxion = fileName.substring( lastIndexOf + 1 ); + } + }); + } + + private void disableMenuItems() { + if (localPropertiesService.getOperationMode().equals(OperationMode.CLIENT_MODE)) { + for (final JMenuItem menuItem : collectEarthMenu.getServerMenuItems()) { + menuItem.setEnabled(false); + } } - return fileExtenxion; } + private void displayWindow() { + getFrame().setLocationRelativeTo(null); + getFrame().pack(); + getFrame().setVisible(true); + } - private boolean isFileExtensionValid(File file ){ - String fileExtension = getFileExtension(file); - return fileExtension!=null && ( DataFormat.COLLECT_COORDS.checkFileExtensionMatches(fileExtension) || DataFormat.PROJECT_DEFINITION_FILE.checkFileExtensionMatches(fileExtension) || DataFormat.KML_FILE.checkFileExtensionMatches(fileExtension) ); + protected ActionListener getCloseActionListener() { + return e -> getFrame().dispatchEvent(new WindowEvent(getFrame(), WindowEvent.WINDOW_CLOSING)); } - /* - * We support both copy and move actions. - * (non-Javadoc) - * @see javax.swing.TransferHandler#getSourceActions(javax.swing.JComponent) - */ - @Override - public int getSourceActions(JComponent c) { - return COPY_OR_MOVE; + public JFrame getFrame() { + return frame; } + private String getOperator() { + return localPropertiesService.getOperator(); + } - /* - * Perform the actual import. This demo only supports drag and drop. - * (non-Javadoc) - * @see javax.swing.TransferHandler#importData(javax.swing.TransferHandler.TransferSupport) - */ - @Override - public boolean importData(TransferSupport info) { - if (!info.isDrop()) { - return false; - } + private void initializeMenu() { - // Get the file that is being dropped. - Transferable t = info.getTransferable(); - List data; - try { - data = (List)t.getTransferData(DataFlavor.javaFileListFlavor); - if( data.size()!=1){ - throw new IllegalArgumentException("The drop action supports only single file drops!"); - } + collectEarthMenu.removeAll(); + collectEarthMenu.init(); + getFrame().setJMenuBar( collectEarthMenu ); - File fileToImport = data.get(0); + disableMenuItems(); + } - if( !isFileExtensionValid(fileToImport)){ - throw new IllegalArgumentException("The drop action supports only files of type!" + DataFormat.COLLECT_COORDS + " or " + DataFormat.PROJECT_DEFINITION_FILE); + private void updateOperatorName() { + final String operatorName = operatorTextField.getText().trim(); + if( !operatorName.equals(localPropertiesService.getOperator() ) ) { + if (operatorName.length() > 5 && operatorName.length() < 50 ) { + localPropertiesService.saveOperator(operatorName); + operatorTextField.setBackground(Color.white); + JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.65"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.66"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ + } else{ + JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.33"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.34"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + operatorTextField.setText(getOperator()); } + } + } - String fileExtension = getFileExtension(fileToImport); - - // If it is a CEP file then import - if( DataFormat.PROJECT_DEFINITION_FILE.checkFileExtensionMatches(fileExtension)){ - EarthApp.openProjectFileInRunningCollectEarth( fileToImport.getAbsolutePath() ); - }else if( DataFormat.COLLECT_COORDS.checkFileExtensionMatches(fileExtension)){ + private void initializePanel() { + final JPanel pane = new JPanel(new GridBagLayout()); - importCSVWithPlots(fileToImport); + final Border raisedetched = BorderFactory.createRaisedBevelBorder(); + pane.setBorder(raisedetched); - }else if( DataFormat.KML_FILE.checkFileExtensionMatches( fileExtension ) ) { + // Handle Drag and Drop of files into the panel + pane.setTransferHandler(collectEarthTransferHandler); - // Check if the CSV file can be loaded in the survey!!! - - if( kmlImportService.loadFromKml( null, fileToImport ) ){ - EarthApp.executeKmlLoadAsynchronously( collectEarthWindow.getFrame() ); - } + final GridBagConstraints c = new GridBagConstraints(); + operatorTextField = new JTextField(getOperator(), 30); + if (StringUtils.isBlank(getOperator())) { + operatorTextField.setBackground(ERROR_COLOR); + } - }else{ - throw new IllegalArgumentException("Unknown file extension!!"); + final JLabel operatorTextLabel = new JLabel(Messages.getString("CollectEarthWindow.26"), SwingConstants.CENTER); //$NON-NLS-1$ + operatorTextLabel.setSize(100, 20); + + // final JButton updateOperator = new JButton(Messages.getString("CollectEarthWindow.27")); //$NON-NLS-1$ + c.insets = new Insets(3, 3, 3, 3); + c.fill = GridBagConstraints.HORIZONTAL; + c.gridx = 0; + c.gridy = 0; + pane.add(operatorTextLabel, c); + + c.weightx = 0; + c.gridx = 1; + c.gridy = 0; + pane.add(operatorTextField, c); + + c.gridx = 2; + c.gridy = 0; + // pane.add(updateOperator, c); + + c.gridx = 0; + c.gridy++; + c.gridwidth = GridBagConstraints.REMAINDER; + pane.add(new JLabel(Messages.getString("CollectEarthWindow.28") + "
" //$NON-NLS-1$ //$NON-NLS-2$ + + Messages.getString("CollectEarthWindow.30")), c); //$NON-NLS-1$ + + c.gridx = 0; + c.gridy++; + c.gridwidth = GridBagConstraints.REMAINDER; + c.fill = GridBagConstraints.NONE; + final JButton propertiesButton = new JButton(Messages.getString("CollectEarthWindow.15")); //$NON-NLS-1$ + propertiesButton.addActionListener( collectEarthMenu.getPropertiesAction( frame ) ); + pane.add(propertiesButton, c); + + getFrame().getContentPane().add(pane); + + // Three seconds after the last key is typed on hte text field the operator name changes on the properties service + Timer timerOperatorChanged = new Timer(3000, e-> updateOperatorName() ); + + operatorTextField.addKeyListener( new KeyAdapter() { + @Override + public void keyTyped(KeyEvent e) { + timerOperatorChanged.restart(); } + }); + } - } - catch (Exception e) { - logger.error("Error on the drop action", e); - return false; + private void initializeWindow() { + + // Initialize the translations + Messages.setLocale(localPropertiesService.getUiLanguage().getLocale()); + getFrame().setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); + getFrame().setResizable(false); + try { + getFrame().setIconImage( + new ImageIcon(new File("images/smallOpenForisBanner.png").toURI().toURL()).getImage()); //$NON-NLS-1$ + } catch (final MalformedURLException e2) { + logger.error(Messages.getString("CollectEarthWindow.21"), e2); //$NON-NLS-1$ } + addWindowClosingListener(); + } + protected void openWindow() { + initializeWindow(); + initializePanel(); + initializeMenu(); + displayWindow(); + if (StringUtils.isBlank(getOperator())) { + JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.35"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.36"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + } - return true; + changeFrameTitle(); } - - private void importCSVWithPlots(File fileToImport) { - try{ - localPropertiesService.setValue( EarthProperty.SAMPLE_FILE, fileToImport.getAbsolutePath() ); - EarthApp.executeKmlLoadAsynchronously( collectEarthWindow.getFrame() ); - }catch( Exception kmlGenerationException ){ - logger.error( "Problem loading CSV file dropped into the window" , kmlGenerationException ); - EarthApp.showMessage(" Problem loading CSV file" + kmlGenerationException.getCause() ); + public void changeFrameTitle() { + String name = " - No survey loaded"; + if (earthSurveyService.getCollectSurvey() != null) { + if (!StringUtils.isBlank(earthSurveyService.getCollectSurvey() + .getProjectName(localPropertiesService.getUiLanguage().getLocale().getLanguage()))) { + name = " - " + earthSurveyService.getCollectSurvey() + .getProjectName(localPropertiesService.getUiLanguage().getLocale().getLanguage()); + } else if (!StringUtils.isBlank(earthSurveyService.getCollectSurvey().getProjectName())) { + name = " - " + earthSurveyService.getCollectSurvey().getProjectName(); + } else { + name = " - " + earthSurveyService.getCollectSurvey() + .getDescription(localPropertiesService.getUiLanguage().getLocale().getLanguage()); + } } + getFrame().setTitle(Messages.getString("CollectEarthWindow.19") + name); } + void setFrame(JFrame frame) { + this.frame = frame; + } -} +} \ No newline at end of file From 981a771bb33de7ca4c4722835defc8f810035db7 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:15 +0100 Subject: [PATCH 1195/1620] New translations CollectEarthWindow.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 366 ++++++++++++------ 1 file changed, 257 insertions(+), 109 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 65dd7f9161..ee88f71564 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,168 +1,316 @@ package org.openforis.collect.earth.app.view; -import java.awt.datatransfer.DataFlavor; -import java.awt.datatransfer.Transferable; +import java.awt.Color; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.Window; +import java.awt.event.ActionListener; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; import java.io.File; -import java.util.List; - -import javax.swing.JComponent; -import javax.swing.TransferHandler; - +import java.io.IOException; +import java.net.MalformedURLException; + +import javax.swing.BorderFactory; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JTextField; +import javax.swing.SwingConstants; +import javax.swing.SwingUtilities; +import javax.swing.Timer; +import javax.swing.WindowConstants; +import javax.swing.border.Border; + +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.EarthConstants.OperationMode; import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.KmlImportService; +import org.openforis.collect.earth.app.service.EarthSurveyService; import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ @Component -public class CollectEarthTransferHandler extends TransferHandler { +@Lazy(false) +public class CollectEarthWindow implements InitializingBean, DisposableBean{ @Autowired - private transient CollectEarthWindow collectEarthWindow; + private LocalPropertiesService localPropertiesService; @Autowired - private transient LocalPropertiesService localPropertiesService; + private EarthSurveyService earthSurveyService; @Autowired - private transient KmlImportService kmlImportService; + private CollectEarthTransferHandler collectEarthTransferHandler; - private static final long serialVersionUID = 1L; - private transient Logger logger = LoggerFactory.getLogger( CollectEarthTransferHandler.class); + @Autowired + private CollectEarthMenu collectEarthMenu; - /* - * Can Only import an object if it represents a SINGLE file - * (non-Javadoc) - * @see javax.swing.TransferHandler#canImport(javax.swing.TransferHandler.TransferSupport) - */ - @Override - public boolean canImport(TransferSupport support) { + public static void endWaiting(Window frame) { + frame.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); + } - if( support.isDataFlavorSupported(DataFlavor.javaFileListFlavor) ){ - Transferable t = support.getTransferable(); - List data; - try { - data = (List)t.getTransferData(DataFlavor.javaFileListFlavor); + public static void startWaiting(Window frame) { + frame.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); + } - if( data !=null && data.size() == 1){ - return isFileExtensionValid( data.get(0) ); - }else { - return false; - } + private JFrame frame; + private final Logger logger = LoggerFactory.getLogger(CollectEarthWindow.class); + private JTextField operatorTextField; + + public static final Color ERROR_COLOR = new Color(225, 124, 124); + + public CollectEarthWindow() throws IOException { + // Create and set up the window. + JFrame framePriv = new JFrame(Messages.getString("CollectEarthWindow.19"));//$NON-NLS-1$ + + setFrame(framePriv); + } - }catch(java.awt.dnd.InvalidDnDOperationException unknownException) { - logger.warn("Why do I get this error?t", unknownException); - return true; - }catch (Exception e) { - logger.error("Error on the drop support assessment", e); - return false; + private void init() { + Messages.setLocale(localPropertiesService.getUiLanguage().getLocale()); + javax.swing.SwingUtilities.invokeLater( () -> { + try { + CollectEarthWindow.this.openWindow(); + } catch (final Exception e) { + logger.error("Cannot start Earth App", e); //$NON-NLS-1$ + System.exit(0); } - }else{ - return false; - } + }); + } + @Override + public void afterPropertiesSet() throws Exception { + init(); + } + @Override + public void destroy() throws Exception { + SwingUtilities.invokeAndWait( () -> CollectEarthWindow.this.getFrame().dispose() ); } + private void addWindowClosingListener() { + getFrame().addWindowListener(new WindowAdapter() { + + @Override + public void windowClosing(WindowEvent e) { + try { + final String keepOpen = Messages.getString("CollectEarthWindow.37"); //$NON-NLS-1$ + final String close = Messages.getString("CollectEarthWindow.42"); //$NON-NLS-1$ + final String[] options = new String[] { close, keepOpen }; + + final int confirmation = JOptionPane.showOptionDialog(getFrame(), + Messages.getString("CollectEarthWindow.22"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.23"), //$NON-NLS-1$ + JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, keepOpen); + + if (confirmation == JOptionPane.YES_OPTION) { + final Thread stopServer = new Thread("Stopping server") { + @Override + public void run() { + try { + EarthApp.quitServer(); + } catch (final Exception e) { + logger.error("Error when trying to closing the server", e); //$NON-NLS-1$ + } + } + }; + + getFrame().setVisible(false); + getFrame().dispose(); + stopServer.start(); + Thread.sleep(5000); + + System.exit(0); + } + }catch (final InterruptedException e1) { + logger.error("Error when interupting thread", e1); //$NON-NLS-1$ + Thread.currentThread().interrupt(); + } catch (final Exception e1) { + logger.error("Error when trying to shutdown the server when window is closed", e1); //$NON-NLS-1$ + } - private String getFileExtension(File file) { - String fileName = file.getName(); - int lastIndexOf = fileName.lastIndexOf('.' ); - String fileExtenxion = null; - if( lastIndexOf >0 ){ - fileExtenxion = fileName.substring( lastIndexOf + 1 ); + } + }); + } + + private void disableMenuItems() { + if (localPropertiesService.getOperationMode().equals(OperationMode.CLIENT_MODE)) { + for (final JMenuItem menuItem : collectEarthMenu.getServerMenuItems()) { + menuItem.setEnabled(false); + } } - return fileExtenxion; } + private void displayWindow() { + getFrame().setLocationRelativeTo(null); + getFrame().pack(); + getFrame().setVisible(true); + } - private boolean isFileExtensionValid(File file ){ - String fileExtension = getFileExtension(file); - return fileExtension!=null && ( DataFormat.COLLECT_COORDS.checkFileExtensionMatches(fileExtension) || DataFormat.PROJECT_DEFINITION_FILE.checkFileExtensionMatches(fileExtension) || DataFormat.KML_FILE.checkFileExtensionMatches(fileExtension) ); + protected ActionListener getCloseActionListener() { + return e -> getFrame().dispatchEvent(new WindowEvent(getFrame(), WindowEvent.WINDOW_CLOSING)); } - /* - * We support both copy and move actions. - * (non-Javadoc) - * @see javax.swing.TransferHandler#getSourceActions(javax.swing.JComponent) - */ - @Override - public int getSourceActions(JComponent c) { - return COPY_OR_MOVE; + public JFrame getFrame() { + return frame; } + private String getOperator() { + return localPropertiesService.getOperator(); + } - /* - * Perform the actual import. This demo only supports drag and drop. - * (non-Javadoc) - * @see javax.swing.TransferHandler#importData(javax.swing.TransferHandler.TransferSupport) - */ - @Override - public boolean importData(TransferSupport info) { - if (!info.isDrop()) { - return false; - } + private void initializeMenu() { - // Get the file that is being dropped. - Transferable t = info.getTransferable(); - List data; - try { - data = (List)t.getTransferData(DataFlavor.javaFileListFlavor); - if( data.size()!=1){ - throw new IllegalArgumentException("The drop action supports only single file drops!"); - } + collectEarthMenu.removeAll(); + collectEarthMenu.init(); + getFrame().setJMenuBar( collectEarthMenu ); - File fileToImport = data.get(0); + disableMenuItems(); + } - if( !isFileExtensionValid(fileToImport)){ - throw new IllegalArgumentException("The drop action supports only files of type!" + DataFormat.COLLECT_COORDS + " or " + DataFormat.PROJECT_DEFINITION_FILE); + private void updateOperatorName() { + final String operatorName = operatorTextField.getText().trim(); + if( !operatorName.equals(localPropertiesService.getOperator() ) ) { + if (operatorName.length() > 5 && operatorName.length() < 50 ) { + localPropertiesService.saveOperator(operatorName); + operatorTextField.setBackground(Color.white); + JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.65"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.66"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ + } else{ + JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.33"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.34"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + operatorTextField.setText(getOperator()); } + } + } - String fileExtension = getFileExtension(fileToImport); - - // If it is a CEP file then import - if( DataFormat.PROJECT_DEFINITION_FILE.checkFileExtensionMatches(fileExtension)){ - EarthApp.openProjectFileInRunningCollectEarth( fileToImport.getAbsolutePath() ); - }else if( DataFormat.COLLECT_COORDS.checkFileExtensionMatches(fileExtension)){ + private void initializePanel() { + final JPanel pane = new JPanel(new GridBagLayout()); - importCSVWithPlots(fileToImport); + final Border raisedetched = BorderFactory.createRaisedBevelBorder(); + pane.setBorder(raisedetched); - }else if( DataFormat.KML_FILE.checkFileExtensionMatches( fileExtension ) ) { + // Handle Drag and Drop of files into the panel + pane.setTransferHandler(collectEarthTransferHandler); - // Check if the CSV file can be loaded in the survey!!! - - if( kmlImportService.loadFromKml( null, fileToImport ) ){ - EarthApp.executeKmlLoadAsynchronously( collectEarthWindow.getFrame() ); - } + final GridBagConstraints c = new GridBagConstraints(); + operatorTextField = new JTextField(getOperator(), 30); + if (StringUtils.isBlank(getOperator())) { + operatorTextField.setBackground(ERROR_COLOR); + } - }else{ - throw new IllegalArgumentException("Unknown file extension!!"); + final JLabel operatorTextLabel = new JLabel(Messages.getString("CollectEarthWindow.26"), SwingConstants.CENTER); //$NON-NLS-1$ + operatorTextLabel.setSize(100, 20); + + // final JButton updateOperator = new JButton(Messages.getString("CollectEarthWindow.27")); //$NON-NLS-1$ + c.insets = new Insets(3, 3, 3, 3); + c.fill = GridBagConstraints.HORIZONTAL; + c.gridx = 0; + c.gridy = 0; + pane.add(operatorTextLabel, c); + + c.weightx = 0; + c.gridx = 1; + c.gridy = 0; + pane.add(operatorTextField, c); + + c.gridx = 2; + c.gridy = 0; + // pane.add(updateOperator, c); + + c.gridx = 0; + c.gridy++; + c.gridwidth = GridBagConstraints.REMAINDER; + pane.add(new JLabel(Messages.getString("CollectEarthWindow.28") + "
" //$NON-NLS-1$ //$NON-NLS-2$ + + Messages.getString("CollectEarthWindow.30")), c); //$NON-NLS-1$ + + c.gridx = 0; + c.gridy++; + c.gridwidth = GridBagConstraints.REMAINDER; + c.fill = GridBagConstraints.NONE; + final JButton propertiesButton = new JButton(Messages.getString("CollectEarthWindow.15")); //$NON-NLS-1$ + propertiesButton.addActionListener( collectEarthMenu.getPropertiesAction( frame ) ); + pane.add(propertiesButton, c); + + getFrame().getContentPane().add(pane); + + // Three seconds after the last key is typed on hte text field the operator name changes on the properties service + Timer timerOperatorChanged = new Timer(3000, e-> updateOperatorName() ); + + operatorTextField.addKeyListener( new KeyAdapter() { + @Override + public void keyTyped(KeyEvent e) { + timerOperatorChanged.restart(); } + }); + } - } - catch (Exception e) { - logger.error("Error on the drop action", e); - return false; + private void initializeWindow() { + + // Initialize the translations + Messages.setLocale(localPropertiesService.getUiLanguage().getLocale()); + getFrame().setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); + getFrame().setResizable(false); + try { + getFrame().setIconImage( + new ImageIcon(new File("images/smallOpenForisBanner.png").toURI().toURL()).getImage()); //$NON-NLS-1$ + } catch (final MalformedURLException e2) { + logger.error(Messages.getString("CollectEarthWindow.21"), e2); //$NON-NLS-1$ } + addWindowClosingListener(); + } + protected void openWindow() { + initializeWindow(); + initializePanel(); + initializeMenu(); + displayWindow(); + if (StringUtils.isBlank(getOperator())) { + JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.35"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.36"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + } - return true; + changeFrameTitle(); } - - private void importCSVWithPlots(File fileToImport) { - try{ - localPropertiesService.setValue( EarthProperty.SAMPLE_FILE, fileToImport.getAbsolutePath() ); - EarthApp.executeKmlLoadAsynchronously( collectEarthWindow.getFrame() ); - }catch( Exception kmlGenerationException ){ - logger.error( "Problem loading CSV file dropped into the window" , kmlGenerationException ); - EarthApp.showMessage(" Problem loading CSV file" + kmlGenerationException.getCause() ); + public void changeFrameTitle() { + String name = " - No survey loaded"; + if (earthSurveyService.getCollectSurvey() != null) { + if (!StringUtils.isBlank(earthSurveyService.getCollectSurvey() + .getProjectName(localPropertiesService.getUiLanguage().getLocale().getLanguage()))) { + name = " - " + earthSurveyService.getCollectSurvey() + .getProjectName(localPropertiesService.getUiLanguage().getLocale().getLanguage()); + } else if (!StringUtils.isBlank(earthSurveyService.getCollectSurvey().getProjectName())) { + name = " - " + earthSurveyService.getCollectSurvey().getProjectName(); + } else { + name = " - " + earthSurveyService.getCollectSurvey() + .getDescription(localPropertiesService.getUiLanguage().getLocale().getLanguage()); + } } + getFrame().setTitle(Messages.getString("CollectEarthWindow.19") + name); } + void setFrame(JFrame frame) { + this.frame = frame; + } -} +} \ No newline at end of file From b71be9c4e9d21f39d1e46b037a7ae9d4b39415c2 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:16 +0100 Subject: [PATCH 1196/1620] New translations CollectEarthWindow.java (English) --- .../earth/app/view/Messages_en.properties | 366 ++++++++++++------ 1 file changed, 257 insertions(+), 109 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 65dd7f9161..ee88f71564 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,168 +1,316 @@ package org.openforis.collect.earth.app.view; -import java.awt.datatransfer.DataFlavor; -import java.awt.datatransfer.Transferable; +import java.awt.Color; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.Window; +import java.awt.event.ActionListener; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; import java.io.File; -import java.util.List; - -import javax.swing.JComponent; -import javax.swing.TransferHandler; - +import java.io.IOException; +import java.net.MalformedURLException; + +import javax.swing.BorderFactory; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JTextField; +import javax.swing.SwingConstants; +import javax.swing.SwingUtilities; +import javax.swing.Timer; +import javax.swing.WindowConstants; +import javax.swing.border.Border; + +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.EarthConstants.OperationMode; import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.KmlImportService; +import org.openforis.collect.earth.app.service.EarthSurveyService; import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ @Component -public class CollectEarthTransferHandler extends TransferHandler { +@Lazy(false) +public class CollectEarthWindow implements InitializingBean, DisposableBean{ @Autowired - private transient CollectEarthWindow collectEarthWindow; + private LocalPropertiesService localPropertiesService; @Autowired - private transient LocalPropertiesService localPropertiesService; + private EarthSurveyService earthSurveyService; @Autowired - private transient KmlImportService kmlImportService; + private CollectEarthTransferHandler collectEarthTransferHandler; - private static final long serialVersionUID = 1L; - private transient Logger logger = LoggerFactory.getLogger( CollectEarthTransferHandler.class); + @Autowired + private CollectEarthMenu collectEarthMenu; - /* - * Can Only import an object if it represents a SINGLE file - * (non-Javadoc) - * @see javax.swing.TransferHandler#canImport(javax.swing.TransferHandler.TransferSupport) - */ - @Override - public boolean canImport(TransferSupport support) { + public static void endWaiting(Window frame) { + frame.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); + } - if( support.isDataFlavorSupported(DataFlavor.javaFileListFlavor) ){ - Transferable t = support.getTransferable(); - List data; - try { - data = (List)t.getTransferData(DataFlavor.javaFileListFlavor); + public static void startWaiting(Window frame) { + frame.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); + } - if( data !=null && data.size() == 1){ - return isFileExtensionValid( data.get(0) ); - }else { - return false; - } + private JFrame frame; + private final Logger logger = LoggerFactory.getLogger(CollectEarthWindow.class); + private JTextField operatorTextField; + + public static final Color ERROR_COLOR = new Color(225, 124, 124); + + public CollectEarthWindow() throws IOException { + // Create and set up the window. + JFrame framePriv = new JFrame(Messages.getString("CollectEarthWindow.19"));//$NON-NLS-1$ + + setFrame(framePriv); + } - }catch(java.awt.dnd.InvalidDnDOperationException unknownException) { - logger.warn("Why do I get this error?t", unknownException); - return true; - }catch (Exception e) { - logger.error("Error on the drop support assessment", e); - return false; + private void init() { + Messages.setLocale(localPropertiesService.getUiLanguage().getLocale()); + javax.swing.SwingUtilities.invokeLater( () -> { + try { + CollectEarthWindow.this.openWindow(); + } catch (final Exception e) { + logger.error("Cannot start Earth App", e); //$NON-NLS-1$ + System.exit(0); } - }else{ - return false; - } + }); + } + @Override + public void afterPropertiesSet() throws Exception { + init(); + } + @Override + public void destroy() throws Exception { + SwingUtilities.invokeAndWait( () -> CollectEarthWindow.this.getFrame().dispose() ); } + private void addWindowClosingListener() { + getFrame().addWindowListener(new WindowAdapter() { + + @Override + public void windowClosing(WindowEvent e) { + try { + final String keepOpen = Messages.getString("CollectEarthWindow.37"); //$NON-NLS-1$ + final String close = Messages.getString("CollectEarthWindow.42"); //$NON-NLS-1$ + final String[] options = new String[] { close, keepOpen }; + + final int confirmation = JOptionPane.showOptionDialog(getFrame(), + Messages.getString("CollectEarthWindow.22"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.23"), //$NON-NLS-1$ + JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, keepOpen); + + if (confirmation == JOptionPane.YES_OPTION) { + final Thread stopServer = new Thread("Stopping server") { + @Override + public void run() { + try { + EarthApp.quitServer(); + } catch (final Exception e) { + logger.error("Error when trying to closing the server", e); //$NON-NLS-1$ + } + } + }; + + getFrame().setVisible(false); + getFrame().dispose(); + stopServer.start(); + Thread.sleep(5000); + + System.exit(0); + } + }catch (final InterruptedException e1) { + logger.error("Error when interupting thread", e1); //$NON-NLS-1$ + Thread.currentThread().interrupt(); + } catch (final Exception e1) { + logger.error("Error when trying to shutdown the server when window is closed", e1); //$NON-NLS-1$ + } - private String getFileExtension(File file) { - String fileName = file.getName(); - int lastIndexOf = fileName.lastIndexOf('.' ); - String fileExtenxion = null; - if( lastIndexOf >0 ){ - fileExtenxion = fileName.substring( lastIndexOf + 1 ); + } + }); + } + + private void disableMenuItems() { + if (localPropertiesService.getOperationMode().equals(OperationMode.CLIENT_MODE)) { + for (final JMenuItem menuItem : collectEarthMenu.getServerMenuItems()) { + menuItem.setEnabled(false); + } } - return fileExtenxion; } + private void displayWindow() { + getFrame().setLocationRelativeTo(null); + getFrame().pack(); + getFrame().setVisible(true); + } - private boolean isFileExtensionValid(File file ){ - String fileExtension = getFileExtension(file); - return fileExtension!=null && ( DataFormat.COLLECT_COORDS.checkFileExtensionMatches(fileExtension) || DataFormat.PROJECT_DEFINITION_FILE.checkFileExtensionMatches(fileExtension) || DataFormat.KML_FILE.checkFileExtensionMatches(fileExtension) ); + protected ActionListener getCloseActionListener() { + return e -> getFrame().dispatchEvent(new WindowEvent(getFrame(), WindowEvent.WINDOW_CLOSING)); } - /* - * We support both copy and move actions. - * (non-Javadoc) - * @see javax.swing.TransferHandler#getSourceActions(javax.swing.JComponent) - */ - @Override - public int getSourceActions(JComponent c) { - return COPY_OR_MOVE; + public JFrame getFrame() { + return frame; } + private String getOperator() { + return localPropertiesService.getOperator(); + } - /* - * Perform the actual import. This demo only supports drag and drop. - * (non-Javadoc) - * @see javax.swing.TransferHandler#importData(javax.swing.TransferHandler.TransferSupport) - */ - @Override - public boolean importData(TransferSupport info) { - if (!info.isDrop()) { - return false; - } + private void initializeMenu() { - // Get the file that is being dropped. - Transferable t = info.getTransferable(); - List data; - try { - data = (List)t.getTransferData(DataFlavor.javaFileListFlavor); - if( data.size()!=1){ - throw new IllegalArgumentException("The drop action supports only single file drops!"); - } + collectEarthMenu.removeAll(); + collectEarthMenu.init(); + getFrame().setJMenuBar( collectEarthMenu ); - File fileToImport = data.get(0); + disableMenuItems(); + } - if( !isFileExtensionValid(fileToImport)){ - throw new IllegalArgumentException("The drop action supports only files of type!" + DataFormat.COLLECT_COORDS + " or " + DataFormat.PROJECT_DEFINITION_FILE); + private void updateOperatorName() { + final String operatorName = operatorTextField.getText().trim(); + if( !operatorName.equals(localPropertiesService.getOperator() ) ) { + if (operatorName.length() > 5 && operatorName.length() < 50 ) { + localPropertiesService.saveOperator(operatorName); + operatorTextField.setBackground(Color.white); + JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.65"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.66"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ + } else{ + JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.33"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.34"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + operatorTextField.setText(getOperator()); } + } + } - String fileExtension = getFileExtension(fileToImport); - - // If it is a CEP file then import - if( DataFormat.PROJECT_DEFINITION_FILE.checkFileExtensionMatches(fileExtension)){ - EarthApp.openProjectFileInRunningCollectEarth( fileToImport.getAbsolutePath() ); - }else if( DataFormat.COLLECT_COORDS.checkFileExtensionMatches(fileExtension)){ + private void initializePanel() { + final JPanel pane = new JPanel(new GridBagLayout()); - importCSVWithPlots(fileToImport); + final Border raisedetched = BorderFactory.createRaisedBevelBorder(); + pane.setBorder(raisedetched); - }else if( DataFormat.KML_FILE.checkFileExtensionMatches( fileExtension ) ) { + // Handle Drag and Drop of files into the panel + pane.setTransferHandler(collectEarthTransferHandler); - // Check if the CSV file can be loaded in the survey!!! - - if( kmlImportService.loadFromKml( null, fileToImport ) ){ - EarthApp.executeKmlLoadAsynchronously( collectEarthWindow.getFrame() ); - } + final GridBagConstraints c = new GridBagConstraints(); + operatorTextField = new JTextField(getOperator(), 30); + if (StringUtils.isBlank(getOperator())) { + operatorTextField.setBackground(ERROR_COLOR); + } - }else{ - throw new IllegalArgumentException("Unknown file extension!!"); + final JLabel operatorTextLabel = new JLabel(Messages.getString("CollectEarthWindow.26"), SwingConstants.CENTER); //$NON-NLS-1$ + operatorTextLabel.setSize(100, 20); + + // final JButton updateOperator = new JButton(Messages.getString("CollectEarthWindow.27")); //$NON-NLS-1$ + c.insets = new Insets(3, 3, 3, 3); + c.fill = GridBagConstraints.HORIZONTAL; + c.gridx = 0; + c.gridy = 0; + pane.add(operatorTextLabel, c); + + c.weightx = 0; + c.gridx = 1; + c.gridy = 0; + pane.add(operatorTextField, c); + + c.gridx = 2; + c.gridy = 0; + // pane.add(updateOperator, c); + + c.gridx = 0; + c.gridy++; + c.gridwidth = GridBagConstraints.REMAINDER; + pane.add(new JLabel(Messages.getString("CollectEarthWindow.28") + "
" //$NON-NLS-1$ //$NON-NLS-2$ + + Messages.getString("CollectEarthWindow.30")), c); //$NON-NLS-1$ + + c.gridx = 0; + c.gridy++; + c.gridwidth = GridBagConstraints.REMAINDER; + c.fill = GridBagConstraints.NONE; + final JButton propertiesButton = new JButton(Messages.getString("CollectEarthWindow.15")); //$NON-NLS-1$ + propertiesButton.addActionListener( collectEarthMenu.getPropertiesAction( frame ) ); + pane.add(propertiesButton, c); + + getFrame().getContentPane().add(pane); + + // Three seconds after the last key is typed on hte text field the operator name changes on the properties service + Timer timerOperatorChanged = new Timer(3000, e-> updateOperatorName() ); + + operatorTextField.addKeyListener( new KeyAdapter() { + @Override + public void keyTyped(KeyEvent e) { + timerOperatorChanged.restart(); } + }); + } - } - catch (Exception e) { - logger.error("Error on the drop action", e); - return false; + private void initializeWindow() { + + // Initialize the translations + Messages.setLocale(localPropertiesService.getUiLanguage().getLocale()); + getFrame().setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); + getFrame().setResizable(false); + try { + getFrame().setIconImage( + new ImageIcon(new File("images/smallOpenForisBanner.png").toURI().toURL()).getImage()); //$NON-NLS-1$ + } catch (final MalformedURLException e2) { + logger.error(Messages.getString("CollectEarthWindow.21"), e2); //$NON-NLS-1$ } + addWindowClosingListener(); + } + protected void openWindow() { + initializeWindow(); + initializePanel(); + initializeMenu(); + displayWindow(); + if (StringUtils.isBlank(getOperator())) { + JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.35"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.36"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + } - return true; + changeFrameTitle(); } - - private void importCSVWithPlots(File fileToImport) { - try{ - localPropertiesService.setValue( EarthProperty.SAMPLE_FILE, fileToImport.getAbsolutePath() ); - EarthApp.executeKmlLoadAsynchronously( collectEarthWindow.getFrame() ); - }catch( Exception kmlGenerationException ){ - logger.error( "Problem loading CSV file dropped into the window" , kmlGenerationException ); - EarthApp.showMessage(" Problem loading CSV file" + kmlGenerationException.getCause() ); + public void changeFrameTitle() { + String name = " - No survey loaded"; + if (earthSurveyService.getCollectSurvey() != null) { + if (!StringUtils.isBlank(earthSurveyService.getCollectSurvey() + .getProjectName(localPropertiesService.getUiLanguage().getLocale().getLanguage()))) { + name = " - " + earthSurveyService.getCollectSurvey() + .getProjectName(localPropertiesService.getUiLanguage().getLocale().getLanguage()); + } else if (!StringUtils.isBlank(earthSurveyService.getCollectSurvey().getProjectName())) { + name = " - " + earthSurveyService.getCollectSurvey().getProjectName(); + } else { + name = " - " + earthSurveyService.getCollectSurvey() + .getDescription(localPropertiesService.getUiLanguage().getLocale().getLanguage()); + } } + getFrame().setTitle(Messages.getString("CollectEarthWindow.19") + name); } + void setFrame(JFrame frame) { + this.frame = frame; + } -} +} \ No newline at end of file From 3eaaf654815b2a36edcd1903852370f70292c55a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:17 +0100 Subject: [PATCH 1197/1620] New translations ComboBoxItem.java (French) --- .../earth/app/view/Messages_fr.properties | 328 ++---------------- 1 file changed, 34 insertions(+), 294 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index ee88f71564..b3ee730e05 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,316 +1,56 @@ package org.openforis.collect.earth.app.view; -import java.awt.Color; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.awt.Window; -import java.awt.event.ActionListener; -import java.awt.event.KeyAdapter; -import java.awt.event.KeyEvent; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.io.File; -import java.io.IOException; -import java.net.MalformedURLException; - -import javax.swing.BorderFactory; -import javax.swing.ImageIcon; -import javax.swing.JButton; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JMenuItem; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JTextField; -import javax.swing.SwingConstants; -import javax.swing.SwingUtilities; -import javax.swing.Timer; -import javax.swing.WindowConstants; -import javax.swing.border.Border; - -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.EarthConstants.OperationMode; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.DisposableBean; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; - /** * @author Alfonso Sanchez-Paus Diaz * */ -@Component -@Lazy(false) -public class CollectEarthWindow implements InitializingBean, DisposableBean{ - - @Autowired - private LocalPropertiesService localPropertiesService; - - @Autowired - private EarthSurveyService earthSurveyService; +class ComboBoxItem { - @Autowired - private CollectEarthTransferHandler collectEarthTransferHandler; + private Integer numberOfPoints; + private String label; - @Autowired - private CollectEarthMenu collectEarthMenu; - - public static void endWaiting(Window frame) { - frame.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); - } - - public static void startWaiting(Window frame) { - frame.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); - } - - private JFrame frame; - private final Logger logger = LoggerFactory.getLogger(CollectEarthWindow.class); - private JTextField operatorTextField; - - public static final Color ERROR_COLOR = new Color(225, 124, 124); - - public CollectEarthWindow() throws IOException { - // Create and set up the window. - JFrame framePriv = new JFrame(Messages.getString("CollectEarthWindow.19"));//$NON-NLS-1$ - - setFrame(framePriv); - } - - private void init() { - Messages.setLocale(localPropertiesService.getUiLanguage().getLocale()); - javax.swing.SwingUtilities.invokeLater( () -> { - try { - CollectEarthWindow.this.openWindow(); - } catch (final Exception e) { - logger.error("Cannot start Earth App", e); //$NON-NLS-1$ - System.exit(0); - } - }); - } - @Override - public void afterPropertiesSet() throws Exception { - init(); + protected ComboBoxItem(int numberOfPoints, String label) { + super(); + this.numberOfPoints = numberOfPoints; + this.label = label; } @Override - public void destroy() throws Exception { - SwingUtilities.invokeAndWait( () -> CollectEarthWindow.this.getFrame().dispose() ); - } - - private void addWindowClosingListener() { - getFrame().addWindowListener(new WindowAdapter() { - - @Override - public void windowClosing(WindowEvent e) { - try { - final String keepOpen = Messages.getString("CollectEarthWindow.37"); //$NON-NLS-1$ - final String close = Messages.getString("CollectEarthWindow.42"); //$NON-NLS-1$ - final String[] options = new String[] { close, keepOpen }; - - final int confirmation = JOptionPane.showOptionDialog(getFrame(), - Messages.getString("CollectEarthWindow.22"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.23"), //$NON-NLS-1$ - JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, keepOpen); - - if (confirmation == JOptionPane.YES_OPTION) { - final Thread stopServer = new Thread("Stopping server") { - @Override - public void run() { - try { - EarthApp.quitServer(); - } catch (final Exception e) { - logger.error("Error when trying to closing the server", e); //$NON-NLS-1$ - } - } - }; - - getFrame().setVisible(false); - getFrame().dispose(); - stopServer.start(); - Thread.sleep(5000); - - System.exit(0); - } - }catch (final InterruptedException e1) { - logger.error("Error when interupting thread", e1); //$NON-NLS-1$ - Thread.currentThread().interrupt(); - } catch (final Exception e1) { - logger.error("Error when trying to shutdown the server when window is closed", e1); //$NON-NLS-1$ - } - - } - }); - } - - private void disableMenuItems() { - if (localPropertiesService.getOperationMode().equals(OperationMode.CLIENT_MODE)) { - for (final JMenuItem menuItem : collectEarthMenu.getServerMenuItems()) { - menuItem.setEnabled(false); - } - } - } - - private void displayWindow() { - getFrame().setLocationRelativeTo(null); - getFrame().pack(); - getFrame().setVisible(true); - } - - protected ActionListener getCloseActionListener() { - return e -> getFrame().dispatchEvent(new WindowEvent(getFrame(), WindowEvent.WINDOW_CLOSING)); - } - - public JFrame getFrame() { - return frame; - } - - private String getOperator() { - return localPropertiesService.getOperator(); - } - - private void initializeMenu() { - - collectEarthMenu.removeAll(); - collectEarthMenu.init(); - getFrame().setJMenuBar( collectEarthMenu ); - - disableMenuItems(); - } - - private void updateOperatorName() { - final String operatorName = operatorTextField.getText().trim(); - if( !operatorName.equals(localPropertiesService.getOperator() ) ) { - if (operatorName.length() > 5 && operatorName.length() < 50 ) { - localPropertiesService.saveOperator(operatorName); - operatorTextField.setBackground(Color.white); - JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.65"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.66"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ - } else{ - JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.33"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.34"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - operatorTextField.setText(getOperator()); - } - } - } - - private void initializePanel() { - final JPanel pane = new JPanel(new GridBagLayout()); - - final Border raisedetched = BorderFactory.createRaisedBevelBorder(); - pane.setBorder(raisedetched); - - // Handle Drag and Drop of files into the panel - pane.setTransferHandler(collectEarthTransferHandler); - - final GridBagConstraints c = new GridBagConstraints(); - - operatorTextField = new JTextField(getOperator(), 30); - if (StringUtils.isBlank(getOperator())) { - operatorTextField.setBackground(ERROR_COLOR); - } - - final JLabel operatorTextLabel = new JLabel(Messages.getString("CollectEarthWindow.26"), SwingConstants.CENTER); //$NON-NLS-1$ - operatorTextLabel.setSize(100, 20); - - // final JButton updateOperator = new JButton(Messages.getString("CollectEarthWindow.27")); //$NON-NLS-1$ - c.insets = new Insets(3, 3, 3, 3); - c.fill = GridBagConstraints.HORIZONTAL; - c.gridx = 0; - c.gridy = 0; - pane.add(operatorTextLabel, c); - - c.weightx = 0; - c.gridx = 1; - c.gridy = 0; - pane.add(operatorTextField, c); - - c.gridx = 2; - c.gridy = 0; - // pane.add(updateOperator, c); - - c.gridx = 0; - c.gridy++; - c.gridwidth = GridBagConstraints.REMAINDER; - pane.add(new JLabel(Messages.getString("CollectEarthWindow.28") + "
" //$NON-NLS-1$ //$NON-NLS-2$ - + Messages.getString("CollectEarthWindow.30")), c); //$NON-NLS-1$ - - c.gridx = 0; - c.gridy++; - c.gridwidth = GridBagConstraints.REMAINDER; - c.fill = GridBagConstraints.NONE; - final JButton propertiesButton = new JButton(Messages.getString("CollectEarthWindow.15")); //$NON-NLS-1$ - propertiesButton.addActionListener( collectEarthMenu.getPropertiesAction( frame ) ); - pane.add(propertiesButton, c); - - getFrame().getContentPane().add(pane); - - // Three seconds after the last key is typed on hte text field the operator name changes on the properties service - Timer timerOperatorChanged = new Timer(3000, e-> updateOperatorName() ); - - operatorTextField.addKeyListener( new KeyAdapter() { - @Override - public void keyTyped(KeyEvent e) { - timerOperatorChanged.restart(); - } - }); - } - - private void initializeWindow() { - - // Initialize the translations - Messages.setLocale(localPropertiesService.getUiLanguage().getLocale()); - getFrame().setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - getFrame().setResizable(false); - try { - getFrame().setIconImage( - new ImageIcon(new File("images/smallOpenForisBanner.png").toURI().toURL()).getImage()); //$NON-NLS-1$ - } catch (final MalformedURLException e2) { - logger.error(Messages.getString("CollectEarthWindow.21"), e2); //$NON-NLS-1$ + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + ComboBoxItem other = (ComboBoxItem) obj; + if (numberOfPoints == null) { + if (other.numberOfPoints != null) + return false; + } else { + if (!numberOfPoints.equals(other.numberOfPoints)) + return false; } - addWindowClosingListener(); + return true; } - protected void openWindow() { - initializeWindow(); - initializePanel(); - initializeMenu(); - displayWindow(); - - if (StringUtils.isBlank(getOperator())) { - JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.35"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.36"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - } - - changeFrameTitle(); + public int getNumberOfPoints() { + return numberOfPoints; } - public void changeFrameTitle() { - String name = " - No survey loaded"; - if (earthSurveyService.getCollectSurvey() != null) { - if (!StringUtils.isBlank(earthSurveyService.getCollectSurvey() - .getProjectName(localPropertiesService.getUiLanguage().getLocale().getLanguage()))) { - name = " - " + earthSurveyService.getCollectSurvey() - .getProjectName(localPropertiesService.getUiLanguage().getLocale().getLanguage()); - } else if (!StringUtils.isBlank(earthSurveyService.getCollectSurvey().getProjectName())) { - name = " - " + earthSurveyService.getCollectSurvey().getProjectName(); - } else { - name = " - " + earthSurveyService.getCollectSurvey() - .getDescription(localPropertiesService.getUiLanguage().getLocale().getLanguage()); - } - } - getFrame().setTitle(Messages.getString("CollectEarthWindow.19") + name); + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((label == null) ? 0 : label.hashCode()); + result = prime * result + ((numberOfPoints == null) ? 0 : numberOfPoints.hashCode()); + return result; } - void setFrame(JFrame frame) { - this.frame = frame; + @Override + public String toString() { + return label; } } \ No newline at end of file From 03d68122783cc936fb61d2ffaef4e0d5784b65f0 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:18 +0100 Subject: [PATCH 1198/1620] New translations ComboBoxItem.java (Spanish) --- .../earth/app/view/Messages_es.properties | 328 ++---------------- 1 file changed, 34 insertions(+), 294 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index ee88f71564..b3ee730e05 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,316 +1,56 @@ package org.openforis.collect.earth.app.view; -import java.awt.Color; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.awt.Window; -import java.awt.event.ActionListener; -import java.awt.event.KeyAdapter; -import java.awt.event.KeyEvent; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.io.File; -import java.io.IOException; -import java.net.MalformedURLException; - -import javax.swing.BorderFactory; -import javax.swing.ImageIcon; -import javax.swing.JButton; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JMenuItem; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JTextField; -import javax.swing.SwingConstants; -import javax.swing.SwingUtilities; -import javax.swing.Timer; -import javax.swing.WindowConstants; -import javax.swing.border.Border; - -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.EarthConstants.OperationMode; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.DisposableBean; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; - /** * @author Alfonso Sanchez-Paus Diaz * */ -@Component -@Lazy(false) -public class CollectEarthWindow implements InitializingBean, DisposableBean{ - - @Autowired - private LocalPropertiesService localPropertiesService; - - @Autowired - private EarthSurveyService earthSurveyService; +class ComboBoxItem { - @Autowired - private CollectEarthTransferHandler collectEarthTransferHandler; + private Integer numberOfPoints; + private String label; - @Autowired - private CollectEarthMenu collectEarthMenu; - - public static void endWaiting(Window frame) { - frame.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); - } - - public static void startWaiting(Window frame) { - frame.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); - } - - private JFrame frame; - private final Logger logger = LoggerFactory.getLogger(CollectEarthWindow.class); - private JTextField operatorTextField; - - public static final Color ERROR_COLOR = new Color(225, 124, 124); - - public CollectEarthWindow() throws IOException { - // Create and set up the window. - JFrame framePriv = new JFrame(Messages.getString("CollectEarthWindow.19"));//$NON-NLS-1$ - - setFrame(framePriv); - } - - private void init() { - Messages.setLocale(localPropertiesService.getUiLanguage().getLocale()); - javax.swing.SwingUtilities.invokeLater( () -> { - try { - CollectEarthWindow.this.openWindow(); - } catch (final Exception e) { - logger.error("Cannot start Earth App", e); //$NON-NLS-1$ - System.exit(0); - } - }); - } - @Override - public void afterPropertiesSet() throws Exception { - init(); + protected ComboBoxItem(int numberOfPoints, String label) { + super(); + this.numberOfPoints = numberOfPoints; + this.label = label; } @Override - public void destroy() throws Exception { - SwingUtilities.invokeAndWait( () -> CollectEarthWindow.this.getFrame().dispose() ); - } - - private void addWindowClosingListener() { - getFrame().addWindowListener(new WindowAdapter() { - - @Override - public void windowClosing(WindowEvent e) { - try { - final String keepOpen = Messages.getString("CollectEarthWindow.37"); //$NON-NLS-1$ - final String close = Messages.getString("CollectEarthWindow.42"); //$NON-NLS-1$ - final String[] options = new String[] { close, keepOpen }; - - final int confirmation = JOptionPane.showOptionDialog(getFrame(), - Messages.getString("CollectEarthWindow.22"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.23"), //$NON-NLS-1$ - JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, keepOpen); - - if (confirmation == JOptionPane.YES_OPTION) { - final Thread stopServer = new Thread("Stopping server") { - @Override - public void run() { - try { - EarthApp.quitServer(); - } catch (final Exception e) { - logger.error("Error when trying to closing the server", e); //$NON-NLS-1$ - } - } - }; - - getFrame().setVisible(false); - getFrame().dispose(); - stopServer.start(); - Thread.sleep(5000); - - System.exit(0); - } - }catch (final InterruptedException e1) { - logger.error("Error when interupting thread", e1); //$NON-NLS-1$ - Thread.currentThread().interrupt(); - } catch (final Exception e1) { - logger.error("Error when trying to shutdown the server when window is closed", e1); //$NON-NLS-1$ - } - - } - }); - } - - private void disableMenuItems() { - if (localPropertiesService.getOperationMode().equals(OperationMode.CLIENT_MODE)) { - for (final JMenuItem menuItem : collectEarthMenu.getServerMenuItems()) { - menuItem.setEnabled(false); - } - } - } - - private void displayWindow() { - getFrame().setLocationRelativeTo(null); - getFrame().pack(); - getFrame().setVisible(true); - } - - protected ActionListener getCloseActionListener() { - return e -> getFrame().dispatchEvent(new WindowEvent(getFrame(), WindowEvent.WINDOW_CLOSING)); - } - - public JFrame getFrame() { - return frame; - } - - private String getOperator() { - return localPropertiesService.getOperator(); - } - - private void initializeMenu() { - - collectEarthMenu.removeAll(); - collectEarthMenu.init(); - getFrame().setJMenuBar( collectEarthMenu ); - - disableMenuItems(); - } - - private void updateOperatorName() { - final String operatorName = operatorTextField.getText().trim(); - if( !operatorName.equals(localPropertiesService.getOperator() ) ) { - if (operatorName.length() > 5 && operatorName.length() < 50 ) { - localPropertiesService.saveOperator(operatorName); - operatorTextField.setBackground(Color.white); - JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.65"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.66"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ - } else{ - JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.33"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.34"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - operatorTextField.setText(getOperator()); - } - } - } - - private void initializePanel() { - final JPanel pane = new JPanel(new GridBagLayout()); - - final Border raisedetched = BorderFactory.createRaisedBevelBorder(); - pane.setBorder(raisedetched); - - // Handle Drag and Drop of files into the panel - pane.setTransferHandler(collectEarthTransferHandler); - - final GridBagConstraints c = new GridBagConstraints(); - - operatorTextField = new JTextField(getOperator(), 30); - if (StringUtils.isBlank(getOperator())) { - operatorTextField.setBackground(ERROR_COLOR); - } - - final JLabel operatorTextLabel = new JLabel(Messages.getString("CollectEarthWindow.26"), SwingConstants.CENTER); //$NON-NLS-1$ - operatorTextLabel.setSize(100, 20); - - // final JButton updateOperator = new JButton(Messages.getString("CollectEarthWindow.27")); //$NON-NLS-1$ - c.insets = new Insets(3, 3, 3, 3); - c.fill = GridBagConstraints.HORIZONTAL; - c.gridx = 0; - c.gridy = 0; - pane.add(operatorTextLabel, c); - - c.weightx = 0; - c.gridx = 1; - c.gridy = 0; - pane.add(operatorTextField, c); - - c.gridx = 2; - c.gridy = 0; - // pane.add(updateOperator, c); - - c.gridx = 0; - c.gridy++; - c.gridwidth = GridBagConstraints.REMAINDER; - pane.add(new JLabel(Messages.getString("CollectEarthWindow.28") + "
" //$NON-NLS-1$ //$NON-NLS-2$ - + Messages.getString("CollectEarthWindow.30")), c); //$NON-NLS-1$ - - c.gridx = 0; - c.gridy++; - c.gridwidth = GridBagConstraints.REMAINDER; - c.fill = GridBagConstraints.NONE; - final JButton propertiesButton = new JButton(Messages.getString("CollectEarthWindow.15")); //$NON-NLS-1$ - propertiesButton.addActionListener( collectEarthMenu.getPropertiesAction( frame ) ); - pane.add(propertiesButton, c); - - getFrame().getContentPane().add(pane); - - // Three seconds after the last key is typed on hte text field the operator name changes on the properties service - Timer timerOperatorChanged = new Timer(3000, e-> updateOperatorName() ); - - operatorTextField.addKeyListener( new KeyAdapter() { - @Override - public void keyTyped(KeyEvent e) { - timerOperatorChanged.restart(); - } - }); - } - - private void initializeWindow() { - - // Initialize the translations - Messages.setLocale(localPropertiesService.getUiLanguage().getLocale()); - getFrame().setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - getFrame().setResizable(false); - try { - getFrame().setIconImage( - new ImageIcon(new File("images/smallOpenForisBanner.png").toURI().toURL()).getImage()); //$NON-NLS-1$ - } catch (final MalformedURLException e2) { - logger.error(Messages.getString("CollectEarthWindow.21"), e2); //$NON-NLS-1$ + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + ComboBoxItem other = (ComboBoxItem) obj; + if (numberOfPoints == null) { + if (other.numberOfPoints != null) + return false; + } else { + if (!numberOfPoints.equals(other.numberOfPoints)) + return false; } - addWindowClosingListener(); + return true; } - protected void openWindow() { - initializeWindow(); - initializePanel(); - initializeMenu(); - displayWindow(); - - if (StringUtils.isBlank(getOperator())) { - JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.35"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.36"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - } - - changeFrameTitle(); + public int getNumberOfPoints() { + return numberOfPoints; } - public void changeFrameTitle() { - String name = " - No survey loaded"; - if (earthSurveyService.getCollectSurvey() != null) { - if (!StringUtils.isBlank(earthSurveyService.getCollectSurvey() - .getProjectName(localPropertiesService.getUiLanguage().getLocale().getLanguage()))) { - name = " - " + earthSurveyService.getCollectSurvey() - .getProjectName(localPropertiesService.getUiLanguage().getLocale().getLanguage()); - } else if (!StringUtils.isBlank(earthSurveyService.getCollectSurvey().getProjectName())) { - name = " - " + earthSurveyService.getCollectSurvey().getProjectName(); - } else { - name = " - " + earthSurveyService.getCollectSurvey() - .getDescription(localPropertiesService.getUiLanguage().getLocale().getLanguage()); - } - } - getFrame().setTitle(Messages.getString("CollectEarthWindow.19") + name); + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((label == null) ? 0 : label.hashCode()); + result = prime * result + ((numberOfPoints == null) ? 0 : numberOfPoints.hashCode()); + return result; } - void setFrame(JFrame frame) { - this.frame = frame; + @Override + public String toString() { + return label; } } \ No newline at end of file From 31bcfa845bdf5fdb5a0644980c60e8046e3d0724 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:19 +0100 Subject: [PATCH 1199/1620] New translations ComboBoxItem.java (English) --- .../earth/app/view/Messages_en.properties | 328 ++---------------- 1 file changed, 34 insertions(+), 294 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index ee88f71564..b3ee730e05 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,316 +1,56 @@ package org.openforis.collect.earth.app.view; -import java.awt.Color; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.awt.Window; -import java.awt.event.ActionListener; -import java.awt.event.KeyAdapter; -import java.awt.event.KeyEvent; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.io.File; -import java.io.IOException; -import java.net.MalformedURLException; - -import javax.swing.BorderFactory; -import javax.swing.ImageIcon; -import javax.swing.JButton; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JMenuItem; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JTextField; -import javax.swing.SwingConstants; -import javax.swing.SwingUtilities; -import javax.swing.Timer; -import javax.swing.WindowConstants; -import javax.swing.border.Border; - -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.EarthConstants.OperationMode; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.DisposableBean; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; - /** * @author Alfonso Sanchez-Paus Diaz * */ -@Component -@Lazy(false) -public class CollectEarthWindow implements InitializingBean, DisposableBean{ - - @Autowired - private LocalPropertiesService localPropertiesService; - - @Autowired - private EarthSurveyService earthSurveyService; +class ComboBoxItem { - @Autowired - private CollectEarthTransferHandler collectEarthTransferHandler; + private Integer numberOfPoints; + private String label; - @Autowired - private CollectEarthMenu collectEarthMenu; - - public static void endWaiting(Window frame) { - frame.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); - } - - public static void startWaiting(Window frame) { - frame.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); - } - - private JFrame frame; - private final Logger logger = LoggerFactory.getLogger(CollectEarthWindow.class); - private JTextField operatorTextField; - - public static final Color ERROR_COLOR = new Color(225, 124, 124); - - public CollectEarthWindow() throws IOException { - // Create and set up the window. - JFrame framePriv = new JFrame(Messages.getString("CollectEarthWindow.19"));//$NON-NLS-1$ - - setFrame(framePriv); - } - - private void init() { - Messages.setLocale(localPropertiesService.getUiLanguage().getLocale()); - javax.swing.SwingUtilities.invokeLater( () -> { - try { - CollectEarthWindow.this.openWindow(); - } catch (final Exception e) { - logger.error("Cannot start Earth App", e); //$NON-NLS-1$ - System.exit(0); - } - }); - } - @Override - public void afterPropertiesSet() throws Exception { - init(); + protected ComboBoxItem(int numberOfPoints, String label) { + super(); + this.numberOfPoints = numberOfPoints; + this.label = label; } @Override - public void destroy() throws Exception { - SwingUtilities.invokeAndWait( () -> CollectEarthWindow.this.getFrame().dispose() ); - } - - private void addWindowClosingListener() { - getFrame().addWindowListener(new WindowAdapter() { - - @Override - public void windowClosing(WindowEvent e) { - try { - final String keepOpen = Messages.getString("CollectEarthWindow.37"); //$NON-NLS-1$ - final String close = Messages.getString("CollectEarthWindow.42"); //$NON-NLS-1$ - final String[] options = new String[] { close, keepOpen }; - - final int confirmation = JOptionPane.showOptionDialog(getFrame(), - Messages.getString("CollectEarthWindow.22"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.23"), //$NON-NLS-1$ - JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, keepOpen); - - if (confirmation == JOptionPane.YES_OPTION) { - final Thread stopServer = new Thread("Stopping server") { - @Override - public void run() { - try { - EarthApp.quitServer(); - } catch (final Exception e) { - logger.error("Error when trying to closing the server", e); //$NON-NLS-1$ - } - } - }; - - getFrame().setVisible(false); - getFrame().dispose(); - stopServer.start(); - Thread.sleep(5000); - - System.exit(0); - } - }catch (final InterruptedException e1) { - logger.error("Error when interupting thread", e1); //$NON-NLS-1$ - Thread.currentThread().interrupt(); - } catch (final Exception e1) { - logger.error("Error when trying to shutdown the server when window is closed", e1); //$NON-NLS-1$ - } - - } - }); - } - - private void disableMenuItems() { - if (localPropertiesService.getOperationMode().equals(OperationMode.CLIENT_MODE)) { - for (final JMenuItem menuItem : collectEarthMenu.getServerMenuItems()) { - menuItem.setEnabled(false); - } - } - } - - private void displayWindow() { - getFrame().setLocationRelativeTo(null); - getFrame().pack(); - getFrame().setVisible(true); - } - - protected ActionListener getCloseActionListener() { - return e -> getFrame().dispatchEvent(new WindowEvent(getFrame(), WindowEvent.WINDOW_CLOSING)); - } - - public JFrame getFrame() { - return frame; - } - - private String getOperator() { - return localPropertiesService.getOperator(); - } - - private void initializeMenu() { - - collectEarthMenu.removeAll(); - collectEarthMenu.init(); - getFrame().setJMenuBar( collectEarthMenu ); - - disableMenuItems(); - } - - private void updateOperatorName() { - final String operatorName = operatorTextField.getText().trim(); - if( !operatorName.equals(localPropertiesService.getOperator() ) ) { - if (operatorName.length() > 5 && operatorName.length() < 50 ) { - localPropertiesService.saveOperator(operatorName); - operatorTextField.setBackground(Color.white); - JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.65"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.66"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ - } else{ - JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.33"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.34"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - operatorTextField.setText(getOperator()); - } - } - } - - private void initializePanel() { - final JPanel pane = new JPanel(new GridBagLayout()); - - final Border raisedetched = BorderFactory.createRaisedBevelBorder(); - pane.setBorder(raisedetched); - - // Handle Drag and Drop of files into the panel - pane.setTransferHandler(collectEarthTransferHandler); - - final GridBagConstraints c = new GridBagConstraints(); - - operatorTextField = new JTextField(getOperator(), 30); - if (StringUtils.isBlank(getOperator())) { - operatorTextField.setBackground(ERROR_COLOR); - } - - final JLabel operatorTextLabel = new JLabel(Messages.getString("CollectEarthWindow.26"), SwingConstants.CENTER); //$NON-NLS-1$ - operatorTextLabel.setSize(100, 20); - - // final JButton updateOperator = new JButton(Messages.getString("CollectEarthWindow.27")); //$NON-NLS-1$ - c.insets = new Insets(3, 3, 3, 3); - c.fill = GridBagConstraints.HORIZONTAL; - c.gridx = 0; - c.gridy = 0; - pane.add(operatorTextLabel, c); - - c.weightx = 0; - c.gridx = 1; - c.gridy = 0; - pane.add(operatorTextField, c); - - c.gridx = 2; - c.gridy = 0; - // pane.add(updateOperator, c); - - c.gridx = 0; - c.gridy++; - c.gridwidth = GridBagConstraints.REMAINDER; - pane.add(new JLabel(Messages.getString("CollectEarthWindow.28") + "
" //$NON-NLS-1$ //$NON-NLS-2$ - + Messages.getString("CollectEarthWindow.30")), c); //$NON-NLS-1$ - - c.gridx = 0; - c.gridy++; - c.gridwidth = GridBagConstraints.REMAINDER; - c.fill = GridBagConstraints.NONE; - final JButton propertiesButton = new JButton(Messages.getString("CollectEarthWindow.15")); //$NON-NLS-1$ - propertiesButton.addActionListener( collectEarthMenu.getPropertiesAction( frame ) ); - pane.add(propertiesButton, c); - - getFrame().getContentPane().add(pane); - - // Three seconds after the last key is typed on hte text field the operator name changes on the properties service - Timer timerOperatorChanged = new Timer(3000, e-> updateOperatorName() ); - - operatorTextField.addKeyListener( new KeyAdapter() { - @Override - public void keyTyped(KeyEvent e) { - timerOperatorChanged.restart(); - } - }); - } - - private void initializeWindow() { - - // Initialize the translations - Messages.setLocale(localPropertiesService.getUiLanguage().getLocale()); - getFrame().setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - getFrame().setResizable(false); - try { - getFrame().setIconImage( - new ImageIcon(new File("images/smallOpenForisBanner.png").toURI().toURL()).getImage()); //$NON-NLS-1$ - } catch (final MalformedURLException e2) { - logger.error(Messages.getString("CollectEarthWindow.21"), e2); //$NON-NLS-1$ + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + ComboBoxItem other = (ComboBoxItem) obj; + if (numberOfPoints == null) { + if (other.numberOfPoints != null) + return false; + } else { + if (!numberOfPoints.equals(other.numberOfPoints)) + return false; } - addWindowClosingListener(); + return true; } - protected void openWindow() { - initializeWindow(); - initializePanel(); - initializeMenu(); - displayWindow(); - - if (StringUtils.isBlank(getOperator())) { - JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.35"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.36"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - } - - changeFrameTitle(); + public int getNumberOfPoints() { + return numberOfPoints; } - public void changeFrameTitle() { - String name = " - No survey loaded"; - if (earthSurveyService.getCollectSurvey() != null) { - if (!StringUtils.isBlank(earthSurveyService.getCollectSurvey() - .getProjectName(localPropertiesService.getUiLanguage().getLocale().getLanguage()))) { - name = " - " + earthSurveyService.getCollectSurvey() - .getProjectName(localPropertiesService.getUiLanguage().getLocale().getLanguage()); - } else if (!StringUtils.isBlank(earthSurveyService.getCollectSurvey().getProjectName())) { - name = " - " + earthSurveyService.getCollectSurvey().getProjectName(); - } else { - name = " - " + earthSurveyService.getCollectSurvey() - .getDescription(localPropertiesService.getUiLanguage().getLocale().getLanguage()); - } - } - getFrame().setTitle(Messages.getString("CollectEarthWindow.19") + name); + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((label == null) ? 0 : label.hashCode()); + result = prime * result + ((numberOfPoints == null) ? 0 : numberOfPoints.hashCode()); + return result; } - void setFrame(JFrame frame) { - this.frame = frame; + @Override + public String toString() { + return label; } } \ No newline at end of file From 627e439f1a14d5a44814b6c92bd19d5f006cfd21 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:20 +0100 Subject: [PATCH 1200/1620] New translations ExportActionListener.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 397 +++++++----------- 1 file changed, 141 insertions(+), 256 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index ee88f71564..6f1756ce73 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,316 +1,201 @@ package org.openforis.collect.earth.app.view; -import java.awt.Color; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.awt.Window; +import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.awt.event.KeyAdapter; -import java.awt.event.KeyEvent; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; import java.io.File; -import java.io.IOException; -import java.net.MalformedURLException; +import java.text.DateFormat; +import java.text.Normalizer; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; -import javax.swing.BorderFactory; -import javax.swing.ImageIcon; -import javax.swing.JButton; import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; -import javax.swing.JTextField; -import javax.swing.SwingConstants; -import javax.swing.SwingUtilities; -import javax.swing.Timer; -import javax.swing.WindowConstants; -import javax.swing.border.Border; import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.EarthConstants.OperationMode; -import org.openforis.collect.earth.app.desktop.EarthApp; +import org.jdesktop.swingx.JXDatePicker; +import org.openforis.collect.earth.app.service.DataImportExportService; import org.openforis.collect.earth.app.service.EarthSurveyService; import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.io.data.DataExportStatus; +import org.openforis.collect.manager.process.AbstractProcess; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.DisposableBean; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; - -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ -@Component -@Lazy(false) -public class CollectEarthWindow implements InitializingBean, DisposableBean{ - - @Autowired - private LocalPropertiesService localPropertiesService; - @Autowired +public final class ExportActionListener implements ActionListener { + private final DataFormat exportFormat; + private JFrame frame; + private LocalPropertiesService localPropertiesService; + private DataImportExportService dataExportService; private EarthSurveyService earthSurveyService; + private Logger logger = LoggerFactory.getLogger(ExportActionListener.class); + private RecordsToExport recordsToExport; - @Autowired - private CollectEarthTransferHandler collectEarthTransferHandler; - - @Autowired - private CollectEarthMenu collectEarthMenu; - - public static void endWaiting(Window frame) { - frame.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); + public enum RecordsToExport { + ALL, MODIFIED_SINCE_LAST_EXPORT, PICK_FROM_DATE } - public static void startWaiting(Window frame) { - frame.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); + public ExportActionListener(DataFormat exportFormat, RecordsToExport recordsToExport, JFrame frame, + LocalPropertiesService localPropertiesService, DataImportExportService dataExportService, + EarthSurveyService earthSurveyService) { + this.exportFormat = exportFormat; + this.frame = frame; + this.localPropertiesService = localPropertiesService; + this.dataExportService = dataExportService; + this.earthSurveyService = earthSurveyService; + this.recordsToExport = recordsToExport; } - private JFrame frame; - private final Logger logger = LoggerFactory.getLogger(CollectEarthWindow.class); - private JTextField operatorTextField; + @Override + public void actionPerformed(ActionEvent e) { + try { + CollectEarthWindow.startWaiting(frame); - public static final Color ERROR_COLOR = new Color(225, 124, 124); + Date recordsModifiedSince = null; + if (recordsToExport.equals(RecordsToExport.MODIFIED_SINCE_LAST_EXPORT)) { + String surveyName = ""; //$NON-NLS-1$ + if (earthSurveyService.getCollectSurvey() != null) { + surveyName = earthSurveyService.getCollectSurvey().getName(); + } + recordsModifiedSince = localPropertiesService.getLastExportedDate(surveyName); + } else if (recordsToExport.equals(RecordsToExport.PICK_FROM_DATE)) { + recordsModifiedSince = getPickDateDlg(); + if (recordsModifiedSince == null) { + // No date chosen, do not proceed with the export + return; + } + } - public CollectEarthWindow() throws IOException { - // Create and set up the window. - JFrame framePriv = new JFrame(Messages.getString("CollectEarthWindow.19"));//$NON-NLS-1$ + exportDataTo(exportFormat, recordsModifiedSince); + } finally { + CollectEarthWindow.endWaiting(frame); + } - setFrame(framePriv); } - private void init() { - Messages.setLocale(localPropertiesService.getUiLanguage().getLocale()); - javax.swing.SwingUtilities.invokeLater( () -> { - try { - CollectEarthWindow.this.openWindow(); - } catch (final Exception e) { - logger.error("Cannot start Earth App", e); //$NON-NLS-1$ - System.exit(0); - } - }); - } - @Override - public void afterPropertiesSet() throws Exception { - init(); - } + private Date getPickDateDlg() { - @Override - public void destroy() throws Exception { - SwingUtilities.invokeAndWait( () -> CollectEarthWindow.this.getFrame().dispose() ); - } + JPanel panel = new JPanel(); - private void addWindowClosingListener() { - getFrame().addWindowListener(new WindowAdapter() { - - @Override - public void windowClosing(WindowEvent e) { - try { - final String keepOpen = Messages.getString("CollectEarthWindow.37"); //$NON-NLS-1$ - final String close = Messages.getString("CollectEarthWindow.42"); //$NON-NLS-1$ - final String[] options = new String[] { close, keepOpen }; - - final int confirmation = JOptionPane.showOptionDialog(getFrame(), - Messages.getString("CollectEarthWindow.22"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.23"), //$NON-NLS-1$ - JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, keepOpen); - - if (confirmation == JOptionPane.YES_OPTION) { - final Thread stopServer = new Thread("Stopping server") { - @Override - public void run() { - try { - EarthApp.quitServer(); - } catch (final Exception e) { - logger.error("Error when trying to closing the server", e); //$NON-NLS-1$ - } - } - }; - - getFrame().setVisible(false); - getFrame().dispose(); - stopServer.start(); - Thread.sleep(5000); - - System.exit(0); - } - }catch (final InterruptedException e1) { - logger.error("Error when interupting thread", e1); //$NON-NLS-1$ - Thread.currentThread().interrupt(); - } catch (final Exception e1) { - logger.error("Error when trying to shutdown the server when window is closed", e1); //$NON-NLS-1$ - } + JXDatePicker picker = new JXDatePicker(); + picker.setDate(Calendar.getInstance().getTime()); + picker.setFormats(new SimpleDateFormat("dd.MM.yyyy")); //$NON-NLS-1$ - } - }); - } + panel.add(picker); - private void disableMenuItems() { - if (localPropertiesService.getOperationMode().equals(OperationMode.CLIENT_MODE)) { - for (final JMenuItem menuItem : collectEarthMenu.getServerMenuItems()) { - menuItem.setEnabled(false); - } + int result = JOptionPane.showConfirmDialog(frame, panel, Messages.getString("ExportActionListener.1"), //$NON-NLS-1$ + JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); + if (result == JOptionPane.OK_OPTION) { + return picker.getDate(); + } else { + return null; } } - private void displayWindow() { - getFrame().setLocationRelativeTo(null); - getFrame().pack(); - getFrame().setVisible(true); - } + private File exportDataTo(DataFormat exportType, Date recordsModifiedSince) { + String preselectedName = getPreselectedName(exportType, recordsModifiedSince); - protected ActionListener getCloseActionListener() { - return e -> getFrame().dispatchEvent(new WindowEvent(getFrame(), WindowEvent.WINDOW_CLOSING)); - } + File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(exportType, true, false, preselectedName, + localPropertiesService, frame); - public JFrame getFrame() { - return frame; - } + File exportedFile = null; + if (exportToFile != null && exportToFile.length > 0) { + startExportingData(exportType, recordsModifiedSince, exportToFile[0]); + exportedFile = exportToFile[0]; + } - private String getOperator() { - return localPropertiesService.getOperator(); + return exportedFile; } - private void initializeMenu() { + private boolean promptForLabelInclusion(DataFormat exportType) { + boolean includeLabels = false; - collectEarthMenu.removeAll(); - collectEarthMenu.init(); - getFrame().setJMenuBar( collectEarthMenu ); + if (exportType.equals(DataFormat.CSV)) { + int result = JOptionPane.showConfirmDialog(frame, "Include labels for code attributes", "Include labels", + JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); + includeLabels = (result == JOptionPane.YES_OPTION); + } - disableMenuItems(); + return includeLabels; } - private void updateOperatorName() { - final String operatorName = operatorTextField.getText().trim(); - if( !operatorName.equals(localPropertiesService.getOperator() ) ) { - if (operatorName.length() > 5 && operatorName.length() < 50 ) { - localPropertiesService.saveOperator(operatorName); - operatorTextField.setBackground(Color.white); - JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.65"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.66"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ - } else{ - JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.33"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.34"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - operatorTextField.setText(getOperator()); + private void startExportingData(DataFormat exportType, Date recordsModifiedSince, File exportToFile) { + AbstractProcess exportProcess = null; + try { + exportProcess = getExportProcess(exportType, recordsModifiedSince, exportToFile); + if (exportProcess != null) { + ExportProcessMonitorDialog exportProcessWorker = new ExportProcessMonitorDialog(exportProcess, frame, + recordsToExport, exportType, earthSurveyService, exportToFile, localPropertiesService); + exportProcessWorker.start(); } + } catch (Exception e1) { + logger.error("What happened?", e1); //$NON-NLS-1$ //$NON-NLS-2$ + JOptionPane.showMessageDialog(this.frame, Messages.getString("CollectEarthWindow.0"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.1"), //$NON-NLS-1$ + JOptionPane.ERROR_MESSAGE); + logger.error( + "Error exporting data to " + exportToFile.getAbsolutePath() + " in format " + exportType.name(), //$NON-NLS-1$ //$NON-NLS-2$ + e1); } } - private void initializePanel() { - final JPanel pane = new JPanel(new GridBagLayout()); - - final Border raisedetched = BorderFactory.createRaisedBevelBorder(); - pane.setBorder(raisedetched); - - // Handle Drag and Drop of files into the panel - pane.setTransferHandler(collectEarthTransferHandler); - - final GridBagConstraints c = new GridBagConstraints(); - - operatorTextField = new JTextField(getOperator(), 30); - if (StringUtils.isBlank(getOperator())) { - operatorTextField.setBackground(ERROR_COLOR); + private AbstractProcess getExportProcess(DataFormat exportType, Date recordsModifiedSince, + File exportToFile) throws Exception { + AbstractProcess exportProcess = null; + boolean addLabels = false; + switch (exportType) { + case CSV: + addLabels = promptForLabelInclusion(exportType); + exportProcess = dataExportService.exportSurveyAsCsv(exportToFile, addLabels); + break; + case ZIP_WITH_XML: + exportProcess = dataExportService.exportSurveyAsZipWithXml(exportToFile, recordsModifiedSince); + break; + case FUSION: + addLabels = promptForLabelInclusion(exportType); + exportProcess = dataExportService.exportSurveyAsFusionTable(exportToFile, addLabels); + break; + case COLLECT_BACKUP: + exportProcess = dataExportService.exportSurveyAsBackup(exportToFile); + break; + default: + break; } - - final JLabel operatorTextLabel = new JLabel(Messages.getString("CollectEarthWindow.26"), SwingConstants.CENTER); //$NON-NLS-1$ - operatorTextLabel.setSize(100, 20); - - // final JButton updateOperator = new JButton(Messages.getString("CollectEarthWindow.27")); //$NON-NLS-1$ - c.insets = new Insets(3, 3, 3, 3); - c.fill = GridBagConstraints.HORIZONTAL; - c.gridx = 0; - c.gridy = 0; - pane.add(operatorTextLabel, c); - - c.weightx = 0; - c.gridx = 1; - c.gridy = 0; - pane.add(operatorTextField, c); - - c.gridx = 2; - c.gridy = 0; - // pane.add(updateOperator, c); - - c.gridx = 0; - c.gridy++; - c.gridwidth = GridBagConstraints.REMAINDER; - pane.add(new JLabel(Messages.getString("CollectEarthWindow.28") + "
" //$NON-NLS-1$ //$NON-NLS-2$ - + Messages.getString("CollectEarthWindow.30")), c); //$NON-NLS-1$ - - c.gridx = 0; - c.gridy++; - c.gridwidth = GridBagConstraints.REMAINDER; - c.fill = GridBagConstraints.NONE; - final JButton propertiesButton = new JButton(Messages.getString("CollectEarthWindow.15")); //$NON-NLS-1$ - propertiesButton.addActionListener( collectEarthMenu.getPropertiesAction( frame ) ); - pane.add(propertiesButton, c); - - getFrame().getContentPane().add(pane); - - // Three seconds after the last key is typed on hte text field the operator name changes on the properties service - Timer timerOperatorChanged = new Timer(3000, e-> updateOperatorName() ); - - operatorTextField.addKeyListener( new KeyAdapter() { - @Override - public void keyTyped(KeyEvent e) { - timerOperatorChanged.restart(); - } - }); + return exportProcess; } - private void initializeWindow() { + private String getPreselectedName(DataFormat exportType, Date modifiedSince) { + + String operator = ""; - // Initialize the translations - Messages.setLocale(localPropertiesService.getUiLanguage().getLocale()); - getFrame().setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - getFrame().setResizable(false); try { - getFrame().setIconImage( - new ImageIcon(new File("images/smallOpenForisBanner.png").toURI().toURL()).getImage()); //$NON-NLS-1$ - } catch (final MalformedURLException e2) { - logger.error(Messages.getString("CollectEarthWindow.21"), e2); //$NON-NLS-1$ - } + operator = localPropertiesService.getOperator(); - addWindowClosingListener(); - } + operator = StringUtils.deleteWhitespace(operator); + // Replaces character like TĥïŠĩš â fůňķŷ Šťŕĭńġ with This is a funky String + operator = Normalizer.normalize(operator, Normalizer.Form.NFD).replaceAll("[^\\p{ASCII}]", ""); - protected void openWindow() { - initializeWindow(); - initializePanel(); - initializeMenu(); - displayWindow(); + // Remove non-alphanumeric characters + operator = operator.replaceAll("[^a-zA-Z0-9]", ""); - if (StringUtils.isBlank(getOperator())) { - JOptionPane.showMessageDialog(getFrame(), Messages.getString("CollectEarthWindow.35"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.36"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + } catch (Exception e) { + logger.error("Error normalizing operator name ", e); } - changeFrameTitle(); - } + String preselectName = operator + "_collectedData_"; //$NON-NLS-1$ - public void changeFrameTitle() { - String name = " - No survey loaded"; - if (earthSurveyService.getCollectSurvey() != null) { - if (!StringUtils.isBlank(earthSurveyService.getCollectSurvey() - .getProjectName(localPropertiesService.getUiLanguage().getLocale().getLanguage()))) { - name = " - " + earthSurveyService.getCollectSurvey() - .getProjectName(localPropertiesService.getUiLanguage().getLocale().getLanguage()); - } else if (!StringUtils.isBlank(earthSurveyService.getCollectSurvey().getProjectName())) { - name = " - " + earthSurveyService.getCollectSurvey().getProjectName(); - } else { - name = " - " + earthSurveyService.getCollectSurvey() - .getDescription(localPropertiesService.getUiLanguage().getLocale().getLanguage()); - } + preselectName += earthSurveyService.getCollectSurvey().getName(); + DateFormat dateFormat = new SimpleDateFormat("ddMMyy_HHmmss"); //$NON-NLS-1$ + if (modifiedSince == null) { + preselectName += "_on_" + dateFormat.format(new Date()); //$NON-NLS-1$ + } else { + + preselectName += "_" + dateFormat.format(modifiedSince) + "_to_" + dateFormat.format(new Date()); //$NON-NLS-1$ //$NON-NLS-2$ } - getFrame().setTitle(Messages.getString("CollectEarthWindow.19") + name); - } - void setFrame(JFrame frame) { - this.frame = frame; - } + preselectName += "_" + exportType.name() + "." + exportType.getDefaultExtension(); //$NON-NLS-1$ //$NON-NLS-2$ -} \ No newline at end of file + return preselectName; + } +} From 5bfd6d54261b1d0b34e3a0b31eaf3dc8580ab2f5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:21 +0100 Subject: [PATCH 1201/1620] New translations CsvColumn.java (French) --- .../earth/app/view/Messages_fr.properties | 63 ++++++------------- 1 file changed, 20 insertions(+), 43 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index b3ee730e05..e56dd39728 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,56 +1,33 @@ package org.openforis.collect.earth.app.view; -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ -class ComboBoxItem { - - private Integer numberOfPoints; - private String label; - - protected ComboBoxItem(int numberOfPoints, String label) { - super(); - this.numberOfPoints = numberOfPoints; - this.label = label; +public class CsvColumn { + + private Integer pos; + private String name; + + public CsvColumn(Integer pos, String name) { + this.pos = pos; + this.name = name; } @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - ComboBoxItem other = (ComboBoxItem) obj; - if (numberOfPoints == null) { - if (other.numberOfPoints != null) - return false; - } else { - if (!numberOfPoints.equals(other.numberOfPoints)) - return false; - } - - return true; + public String toString() { + return name; } - public int getNumberOfPoints() { - return numberOfPoints; + public Integer getPos() { + return pos; } - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((label == null) ? 0 : label.hashCode()); - result = prime * result + ((numberOfPoints == null) ? 0 : numberOfPoints.hashCode()); - return result; + public void setPos(Integer pos) { + this.pos = pos; } - @Override - public String toString() { - return label; + public String getName() { + return name; } -} \ No newline at end of file + public void setName(String name) { + this.name = name; + } +} From f43545962ccc82c1617cf6514861cbc88a08346f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:23 +0100 Subject: [PATCH 1202/1620] New translations CsvColumn.java (Spanish) --- .../earth/app/view/Messages_es.properties | 63 ++++++------------- 1 file changed, 20 insertions(+), 43 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index b3ee730e05..e56dd39728 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,56 +1,33 @@ package org.openforis.collect.earth.app.view; -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ -class ComboBoxItem { - - private Integer numberOfPoints; - private String label; - - protected ComboBoxItem(int numberOfPoints, String label) { - super(); - this.numberOfPoints = numberOfPoints; - this.label = label; +public class CsvColumn { + + private Integer pos; + private String name; + + public CsvColumn(Integer pos, String name) { + this.pos = pos; + this.name = name; } @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - ComboBoxItem other = (ComboBoxItem) obj; - if (numberOfPoints == null) { - if (other.numberOfPoints != null) - return false; - } else { - if (!numberOfPoints.equals(other.numberOfPoints)) - return false; - } - - return true; + public String toString() { + return name; } - public int getNumberOfPoints() { - return numberOfPoints; + public Integer getPos() { + return pos; } - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((label == null) ? 0 : label.hashCode()); - result = prime * result + ((numberOfPoints == null) ? 0 : numberOfPoints.hashCode()); - return result; + public void setPos(Integer pos) { + this.pos = pos; } - @Override - public String toString() { - return label; + public String getName() { + return name; } -} \ No newline at end of file + public void setName(String name) { + this.name = name; + } +} From a8527b62e708fbf742d7526c8f7bf3f97d71641a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:24 +0100 Subject: [PATCH 1203/1620] New translations CsvColumn.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 200 ++---------------- 1 file changed, 16 insertions(+), 184 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 6f1756ce73..e56dd39728 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,201 +1,33 @@ package org.openforis.collect.earth.app.view; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; -import java.text.DateFormat; -import java.text.Normalizer; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; +public class CsvColumn { -import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.swing.JPanel; + private Integer pos; + private String name; -import org.apache.commons.lang3.StringUtils; -import org.jdesktop.swingx.JXDatePicker; -import org.openforis.collect.earth.app.service.DataImportExportService; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.io.data.DataExportStatus; -import org.openforis.collect.manager.process.AbstractProcess; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public final class ExportActionListener implements ActionListener { - private final DataFormat exportFormat; - private JFrame frame; - private LocalPropertiesService localPropertiesService; - private DataImportExportService dataExportService; - private EarthSurveyService earthSurveyService; - private Logger logger = LoggerFactory.getLogger(ExportActionListener.class); - private RecordsToExport recordsToExport; - - public enum RecordsToExport { - ALL, MODIFIED_SINCE_LAST_EXPORT, PICK_FROM_DATE - } - - public ExportActionListener(DataFormat exportFormat, RecordsToExport recordsToExport, JFrame frame, - LocalPropertiesService localPropertiesService, DataImportExportService dataExportService, - EarthSurveyService earthSurveyService) { - this.exportFormat = exportFormat; - this.frame = frame; - this.localPropertiesService = localPropertiesService; - this.dataExportService = dataExportService; - this.earthSurveyService = earthSurveyService; - this.recordsToExport = recordsToExport; + public CsvColumn(Integer pos, String name) { + this.pos = pos; + this.name = name; } @Override - public void actionPerformed(ActionEvent e) { - try { - CollectEarthWindow.startWaiting(frame); - - Date recordsModifiedSince = null; - if (recordsToExport.equals(RecordsToExport.MODIFIED_SINCE_LAST_EXPORT)) { - String surveyName = ""; //$NON-NLS-1$ - if (earthSurveyService.getCollectSurvey() != null) { - surveyName = earthSurveyService.getCollectSurvey().getName(); - } - recordsModifiedSince = localPropertiesService.getLastExportedDate(surveyName); - } else if (recordsToExport.equals(RecordsToExport.PICK_FROM_DATE)) { - recordsModifiedSince = getPickDateDlg(); - if (recordsModifiedSince == null) { - // No date chosen, do not proceed with the export - return; - } - } - - exportDataTo(exportFormat, recordsModifiedSince); - } finally { - CollectEarthWindow.endWaiting(frame); - } - - } - - private Date getPickDateDlg() { - - JPanel panel = new JPanel(); - - JXDatePicker picker = new JXDatePicker(); - picker.setDate(Calendar.getInstance().getTime()); - picker.setFormats(new SimpleDateFormat("dd.MM.yyyy")); //$NON-NLS-1$ - - panel.add(picker); - - int result = JOptionPane.showConfirmDialog(frame, panel, Messages.getString("ExportActionListener.1"), //$NON-NLS-1$ - JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); - if (result == JOptionPane.OK_OPTION) { - return picker.getDate(); - } else { - return null; - } - } - - private File exportDataTo(DataFormat exportType, Date recordsModifiedSince) { - String preselectedName = getPreselectedName(exportType, recordsModifiedSince); - - File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(exportType, true, false, preselectedName, - localPropertiesService, frame); - - File exportedFile = null; - if (exportToFile != null && exportToFile.length > 0) { - startExportingData(exportType, recordsModifiedSince, exportToFile[0]); - exportedFile = exportToFile[0]; - } - - return exportedFile; + public String toString() { + return name; } - private boolean promptForLabelInclusion(DataFormat exportType) { - boolean includeLabels = false; - - if (exportType.equals(DataFormat.CSV)) { - int result = JOptionPane.showConfirmDialog(frame, "Include labels for code attributes", "Include labels", - JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); - includeLabels = (result == JOptionPane.YES_OPTION); - } - - return includeLabels; + public Integer getPos() { + return pos; } - private void startExportingData(DataFormat exportType, Date recordsModifiedSince, File exportToFile) { - AbstractProcess exportProcess = null; - try { - exportProcess = getExportProcess(exportType, recordsModifiedSince, exportToFile); - if (exportProcess != null) { - ExportProcessMonitorDialog exportProcessWorker = new ExportProcessMonitorDialog(exportProcess, frame, - recordsToExport, exportType, earthSurveyService, exportToFile, localPropertiesService); - exportProcessWorker.start(); - } - } catch (Exception e1) { - logger.error("What happened?", e1); //$NON-NLS-1$ //$NON-NLS-2$ - JOptionPane.showMessageDialog(this.frame, Messages.getString("CollectEarthWindow.0"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.1"), //$NON-NLS-1$ - JOptionPane.ERROR_MESSAGE); - logger.error( - "Error exporting data to " + exportToFile.getAbsolutePath() + " in format " + exportType.name(), //$NON-NLS-1$ //$NON-NLS-2$ - e1); - } + public void setPos(Integer pos) { + this.pos = pos; } - private AbstractProcess getExportProcess(DataFormat exportType, Date recordsModifiedSince, - File exportToFile) throws Exception { - AbstractProcess exportProcess = null; - boolean addLabels = false; - switch (exportType) { - case CSV: - addLabels = promptForLabelInclusion(exportType); - exportProcess = dataExportService.exportSurveyAsCsv(exportToFile, addLabels); - break; - case ZIP_WITH_XML: - exportProcess = dataExportService.exportSurveyAsZipWithXml(exportToFile, recordsModifiedSince); - break; - case FUSION: - addLabels = promptForLabelInclusion(exportType); - exportProcess = dataExportService.exportSurveyAsFusionTable(exportToFile, addLabels); - break; - case COLLECT_BACKUP: - exportProcess = dataExportService.exportSurveyAsBackup(exportToFile); - break; - default: - break; - } - return exportProcess; + public String getName() { + return name; } - private String getPreselectedName(DataFormat exportType, Date modifiedSince) { - - String operator = ""; - - try { - operator = localPropertiesService.getOperator(); - - operator = StringUtils.deleteWhitespace(operator); - // Replaces character like TĥïŠĩš â fůňķŷ Šťŕĭńġ with This is a funky String - operator = Normalizer.normalize(operator, Normalizer.Form.NFD).replaceAll("[^\\p{ASCII}]", ""); - - // Remove non-alphanumeric characters - operator = operator.replaceAll("[^a-zA-Z0-9]", ""); - - } catch (Exception e) { - logger.error("Error normalizing operator name ", e); - } - - String preselectName = operator + "_collectedData_"; //$NON-NLS-1$ - - preselectName += earthSurveyService.getCollectSurvey().getName(); - DateFormat dateFormat = new SimpleDateFormat("ddMMyy_HHmmss"); //$NON-NLS-1$ - if (modifiedSince == null) { - preselectName += "_on_" + dateFormat.format(new Date()); //$NON-NLS-1$ - } else { - - preselectName += "_" + dateFormat.format(modifiedSince) + "_to_" + dateFormat.format(new Date()); //$NON-NLS-1$ //$NON-NLS-2$ - } - - preselectName += "_" + exportType.name() + "." + exportType.getDefaultExtension(); //$NON-NLS-1$ //$NON-NLS-2$ - - return preselectName; + public void setName(String name) { + this.name = name; } } From 969ad940e2293111a639ac55f2e418f4dce40d55 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:25 +0100 Subject: [PATCH 1204/1620] New translations CsvColumn.java (English) --- .../earth/app/view/Messages_en.properties | 63 ++++++------------- 1 file changed, 20 insertions(+), 43 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index b3ee730e05..e56dd39728 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,56 +1,33 @@ package org.openforis.collect.earth.app.view; -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ -class ComboBoxItem { - - private Integer numberOfPoints; - private String label; - - protected ComboBoxItem(int numberOfPoints, String label) { - super(); - this.numberOfPoints = numberOfPoints; - this.label = label; +public class CsvColumn { + + private Integer pos; + private String name; + + public CsvColumn(Integer pos, String name) { + this.pos = pos; + this.name = name; } @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - ComboBoxItem other = (ComboBoxItem) obj; - if (numberOfPoints == null) { - if (other.numberOfPoints != null) - return false; - } else { - if (!numberOfPoints.equals(other.numberOfPoints)) - return false; - } - - return true; + public String toString() { + return name; } - public int getNumberOfPoints() { - return numberOfPoints; + public Integer getPos() { + return pos; } - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((label == null) ? 0 : label.hashCode()); - result = prime * result + ((numberOfPoints == null) ? 0 : numberOfPoints.hashCode()); - return result; + public void setPos(Integer pos) { + this.pos = pos; } - @Override - public String toString() { - return label; + public String getName() { + return name; } -} \ No newline at end of file + public void setName(String name) { + this.name = name; + } +} From e5f32a46bd27375d5fe70387e566fa7f6ab96934 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:26 +0100 Subject: [PATCH 1205/1620] New translations DataFormat.java (French) --- .../earth/app/view/Messages_fr.properties | 67 ++++++++++++------- 1 file changed, 43 insertions(+), 24 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index e56dd39728..521446a595 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,33 +1,52 @@ package org.openforis.collect.earth.app.view; -public class CsvColumn { - - private Integer pos; - private String name; - - public CsvColumn(Integer pos, String name) { - this.pos = pos; - this.name = name; +import java.util.Arrays; + +public enum DataFormat{ + PROJECT_DEFINITION_FILE( + new String[]{"cep"}, Messages.getString("JFileChooserExistsAware.0")), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + ZIP_WITH_XML(new String[]{"zip", "collect-data"},Messages.getString("CollectEarthWindow.48")), //$NON-NLS-1$ //$NON-NLS-2$ + CSV(new String[]{"csv"}, Messages.getString("CollectEarthWindow.38")), //$NON-NLS-1$ //$NON-NLS-2$ + FUSION(new String[]{"csv"}, Messages.getString("CollectEarthWindow.49")), //$NON-NLS-1$ //$NON-NLS-2$ + COLLECT_COORDS(new String[]{"ced", "csv"}, "Collect Earth plots"),//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + KML_FILE(new String[]{"kml"}, "Google Earth Kml File"), //$NON-NLS-1$ //$NON-NLS-2$ + COLLECT_BACKUP(new String[]{"collect-data"}, "Collect Backup"), + SAIKU_ZIP( new String[] {"zip"}, "ZIP Saiku Tool Export" ), + GHGI_ZIP_FILE(new String[]{"zip"}, "IPCC GHGi Tool Package"); //$NON-NLS-1$ //$NON-NLS-2$ + + private String[] fileExtension; + private String description; + + private DataFormat(String[] fileExtension, String description) { + this.fileExtension = fileExtension; + this.description = description; } - @Override - public String toString() { - return name; + public String[] getPossibleFileExtensions() { + return fileExtension; } - - public Integer getPos() { - return pos; + + public String getDefaultExtension() { + return fileExtension[0]; } - - public void setPos(Integer pos) { - this.pos = pos; + + + public String getDescription() { + return description; } - - public String getName() { - return name; + + public boolean checkFileExtensionMatches( String fileExtensionToCheck){ + for (String ext : fileExtension) { + if( ext.equalsIgnoreCase( fileExtensionToCheck)){ + return true; + } + } + return false; } - - public void setName(String name) { - this.name = name; + + @Override + public String toString() { + return Arrays.toString(fileExtension); } -} + +} \ No newline at end of file From e28a5db4961d69b26a9602acd116cf12038d2e88 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:27 +0100 Subject: [PATCH 1206/1620] New translations DataFormat.java (Spanish) --- .../earth/app/view/Messages_es.properties | 67 ++++++++++++------- 1 file changed, 43 insertions(+), 24 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index e56dd39728..521446a595 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,33 +1,52 @@ package org.openforis.collect.earth.app.view; -public class CsvColumn { - - private Integer pos; - private String name; - - public CsvColumn(Integer pos, String name) { - this.pos = pos; - this.name = name; +import java.util.Arrays; + +public enum DataFormat{ + PROJECT_DEFINITION_FILE( + new String[]{"cep"}, Messages.getString("JFileChooserExistsAware.0")), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + ZIP_WITH_XML(new String[]{"zip", "collect-data"},Messages.getString("CollectEarthWindow.48")), //$NON-NLS-1$ //$NON-NLS-2$ + CSV(new String[]{"csv"}, Messages.getString("CollectEarthWindow.38")), //$NON-NLS-1$ //$NON-NLS-2$ + FUSION(new String[]{"csv"}, Messages.getString("CollectEarthWindow.49")), //$NON-NLS-1$ //$NON-NLS-2$ + COLLECT_COORDS(new String[]{"ced", "csv"}, "Collect Earth plots"),//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + KML_FILE(new String[]{"kml"}, "Google Earth Kml File"), //$NON-NLS-1$ //$NON-NLS-2$ + COLLECT_BACKUP(new String[]{"collect-data"}, "Collect Backup"), + SAIKU_ZIP( new String[] {"zip"}, "ZIP Saiku Tool Export" ), + GHGI_ZIP_FILE(new String[]{"zip"}, "IPCC GHGi Tool Package"); //$NON-NLS-1$ //$NON-NLS-2$ + + private String[] fileExtension; + private String description; + + private DataFormat(String[] fileExtension, String description) { + this.fileExtension = fileExtension; + this.description = description; } - @Override - public String toString() { - return name; + public String[] getPossibleFileExtensions() { + return fileExtension; } - - public Integer getPos() { - return pos; + + public String getDefaultExtension() { + return fileExtension[0]; } - - public void setPos(Integer pos) { - this.pos = pos; + + + public String getDescription() { + return description; } - - public String getName() { - return name; + + public boolean checkFileExtensionMatches( String fileExtensionToCheck){ + for (String ext : fileExtension) { + if( ext.equalsIgnoreCase( fileExtensionToCheck)){ + return true; + } + } + return false; } - - public void setName(String name) { - this.name = name; + + @Override + public String toString() { + return Arrays.toString(fileExtension); } -} + +} \ No newline at end of file From ca97d5c217b6a57c9b2291fe0fa948732f8949b0 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:29 +0100 Subject: [PATCH 1207/1620] New translations DataFormat.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 67 ++++++++++++------- 1 file changed, 43 insertions(+), 24 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index e56dd39728..521446a595 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,33 +1,52 @@ package org.openforis.collect.earth.app.view; -public class CsvColumn { - - private Integer pos; - private String name; - - public CsvColumn(Integer pos, String name) { - this.pos = pos; - this.name = name; +import java.util.Arrays; + +public enum DataFormat{ + PROJECT_DEFINITION_FILE( + new String[]{"cep"}, Messages.getString("JFileChooserExistsAware.0")), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + ZIP_WITH_XML(new String[]{"zip", "collect-data"},Messages.getString("CollectEarthWindow.48")), //$NON-NLS-1$ //$NON-NLS-2$ + CSV(new String[]{"csv"}, Messages.getString("CollectEarthWindow.38")), //$NON-NLS-1$ //$NON-NLS-2$ + FUSION(new String[]{"csv"}, Messages.getString("CollectEarthWindow.49")), //$NON-NLS-1$ //$NON-NLS-2$ + COLLECT_COORDS(new String[]{"ced", "csv"}, "Collect Earth plots"),//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + KML_FILE(new String[]{"kml"}, "Google Earth Kml File"), //$NON-NLS-1$ //$NON-NLS-2$ + COLLECT_BACKUP(new String[]{"collect-data"}, "Collect Backup"), + SAIKU_ZIP( new String[] {"zip"}, "ZIP Saiku Tool Export" ), + GHGI_ZIP_FILE(new String[]{"zip"}, "IPCC GHGi Tool Package"); //$NON-NLS-1$ //$NON-NLS-2$ + + private String[] fileExtension; + private String description; + + private DataFormat(String[] fileExtension, String description) { + this.fileExtension = fileExtension; + this.description = description; } - @Override - public String toString() { - return name; + public String[] getPossibleFileExtensions() { + return fileExtension; } - - public Integer getPos() { - return pos; + + public String getDefaultExtension() { + return fileExtension[0]; } - - public void setPos(Integer pos) { - this.pos = pos; + + + public String getDescription() { + return description; } - - public String getName() { - return name; + + public boolean checkFileExtensionMatches( String fileExtensionToCheck){ + for (String ext : fileExtension) { + if( ext.equalsIgnoreCase( fileExtensionToCheck)){ + return true; + } + } + return false; } - - public void setName(String name) { - this.name = name; + + @Override + public String toString() { + return Arrays.toString(fileExtension); } -} + +} \ No newline at end of file From 5aa38c1fb7afbcea81100753a16064f8c8fa288c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:30 +0100 Subject: [PATCH 1208/1620] New translations DataFormat.java (English) --- .../earth/app/view/Messages_en.properties | 67 ++++++++++++------- 1 file changed, 43 insertions(+), 24 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index e56dd39728..521446a595 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,33 +1,52 @@ package org.openforis.collect.earth.app.view; -public class CsvColumn { - - private Integer pos; - private String name; - - public CsvColumn(Integer pos, String name) { - this.pos = pos; - this.name = name; +import java.util.Arrays; + +public enum DataFormat{ + PROJECT_DEFINITION_FILE( + new String[]{"cep"}, Messages.getString("JFileChooserExistsAware.0")), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + ZIP_WITH_XML(new String[]{"zip", "collect-data"},Messages.getString("CollectEarthWindow.48")), //$NON-NLS-1$ //$NON-NLS-2$ + CSV(new String[]{"csv"}, Messages.getString("CollectEarthWindow.38")), //$NON-NLS-1$ //$NON-NLS-2$ + FUSION(new String[]{"csv"}, Messages.getString("CollectEarthWindow.49")), //$NON-NLS-1$ //$NON-NLS-2$ + COLLECT_COORDS(new String[]{"ced", "csv"}, "Collect Earth plots"),//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + KML_FILE(new String[]{"kml"}, "Google Earth Kml File"), //$NON-NLS-1$ //$NON-NLS-2$ + COLLECT_BACKUP(new String[]{"collect-data"}, "Collect Backup"), + SAIKU_ZIP( new String[] {"zip"}, "ZIP Saiku Tool Export" ), + GHGI_ZIP_FILE(new String[]{"zip"}, "IPCC GHGi Tool Package"); //$NON-NLS-1$ //$NON-NLS-2$ + + private String[] fileExtension; + private String description; + + private DataFormat(String[] fileExtension, String description) { + this.fileExtension = fileExtension; + this.description = description; } - @Override - public String toString() { - return name; + public String[] getPossibleFileExtensions() { + return fileExtension; } - - public Integer getPos() { - return pos; + + public String getDefaultExtension() { + return fileExtension[0]; } - - public void setPos(Integer pos) { - this.pos = pos; + + + public String getDescription() { + return description; } - - public String getName() { - return name; + + public boolean checkFileExtensionMatches( String fileExtensionToCheck){ + for (String ext : fileExtension) { + if( ext.equalsIgnoreCase( fileExtensionToCheck)){ + return true; + } + } + return false; } - - public void setName(String name) { - this.name = name; + + @Override + public String toString() { + return Arrays.toString(fileExtension); } -} + +} \ No newline at end of file From 252d4553beb7715ec3b44d3277ea2f267b150d09 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:31 +0100 Subject: [PATCH 1209/1620] New translations ExportActionListener.java (French) --- .../earth/app/view/Messages_fr.properties | 239 ++++++++++++++---- 1 file changed, 194 insertions(+), 45 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 521446a595..6f1756ce73 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,52 +1,201 @@ package org.openforis.collect.earth.app.view; -import java.util.Arrays; - -public enum DataFormat{ - PROJECT_DEFINITION_FILE( - new String[]{"cep"}, Messages.getString("JFileChooserExistsAware.0")), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - ZIP_WITH_XML(new String[]{"zip", "collect-data"},Messages.getString("CollectEarthWindow.48")), //$NON-NLS-1$ //$NON-NLS-2$ - CSV(new String[]{"csv"}, Messages.getString("CollectEarthWindow.38")), //$NON-NLS-1$ //$NON-NLS-2$ - FUSION(new String[]{"csv"}, Messages.getString("CollectEarthWindow.49")), //$NON-NLS-1$ //$NON-NLS-2$ - COLLECT_COORDS(new String[]{"ced", "csv"}, "Collect Earth plots"),//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - KML_FILE(new String[]{"kml"}, "Google Earth Kml File"), //$NON-NLS-1$ //$NON-NLS-2$ - COLLECT_BACKUP(new String[]{"collect-data"}, "Collect Backup"), - SAIKU_ZIP( new String[] {"zip"}, "ZIP Saiku Tool Export" ), - GHGI_ZIP_FILE(new String[]{"zip"}, "IPCC GHGi Tool Package"); //$NON-NLS-1$ //$NON-NLS-2$ - - private String[] fileExtension; - private String description; - - private DataFormat(String[] fileExtension, String description) { - this.fileExtension = fileExtension; - this.description = description; - } - - public String[] getPossibleFileExtensions() { - return fileExtension; - } - - public String getDefaultExtension() { - return fileExtension[0]; - } - - - public String getDescription() { - return description; - } - - public boolean checkFileExtensionMatches( String fileExtensionToCheck){ - for (String ext : fileExtension) { - if( ext.equalsIgnoreCase( fileExtensionToCheck)){ - return true; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.text.DateFormat; +import java.text.Normalizer; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.swing.JPanel; + +import org.apache.commons.lang3.StringUtils; +import org.jdesktop.swingx.JXDatePicker; +import org.openforis.collect.earth.app.service.DataImportExportService; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.io.data.DataExportStatus; +import org.openforis.collect.manager.process.AbstractProcess; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public final class ExportActionListener implements ActionListener { + private final DataFormat exportFormat; + private JFrame frame; + private LocalPropertiesService localPropertiesService; + private DataImportExportService dataExportService; + private EarthSurveyService earthSurveyService; + private Logger logger = LoggerFactory.getLogger(ExportActionListener.class); + private RecordsToExport recordsToExport; + + public enum RecordsToExport { + ALL, MODIFIED_SINCE_LAST_EXPORT, PICK_FROM_DATE + } + + public ExportActionListener(DataFormat exportFormat, RecordsToExport recordsToExport, JFrame frame, + LocalPropertiesService localPropertiesService, DataImportExportService dataExportService, + EarthSurveyService earthSurveyService) { + this.exportFormat = exportFormat; + this.frame = frame; + this.localPropertiesService = localPropertiesService; + this.dataExportService = dataExportService; + this.earthSurveyService = earthSurveyService; + this.recordsToExport = recordsToExport; + } + + @Override + public void actionPerformed(ActionEvent e) { + try { + CollectEarthWindow.startWaiting(frame); + + Date recordsModifiedSince = null; + if (recordsToExport.equals(RecordsToExport.MODIFIED_SINCE_LAST_EXPORT)) { + String surveyName = ""; //$NON-NLS-1$ + if (earthSurveyService.getCollectSurvey() != null) { + surveyName = earthSurveyService.getCollectSurvey().getName(); + } + recordsModifiedSince = localPropertiesService.getLastExportedDate(surveyName); + } else if (recordsToExport.equals(RecordsToExport.PICK_FROM_DATE)) { + recordsModifiedSince = getPickDateDlg(); + if (recordsModifiedSince == null) { + // No date chosen, do not proceed with the export + return; + } } + + exportDataTo(exportFormat, recordsModifiedSince); + } finally { + CollectEarthWindow.endWaiting(frame); } - return false; + } - - @Override - public String toString() { - return Arrays.toString(fileExtension); + + private Date getPickDateDlg() { + + JPanel panel = new JPanel(); + + JXDatePicker picker = new JXDatePicker(); + picker.setDate(Calendar.getInstance().getTime()); + picker.setFormats(new SimpleDateFormat("dd.MM.yyyy")); //$NON-NLS-1$ + + panel.add(picker); + + int result = JOptionPane.showConfirmDialog(frame, panel, Messages.getString("ExportActionListener.1"), //$NON-NLS-1$ + JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); + if (result == JOptionPane.OK_OPTION) { + return picker.getDate(); + } else { + return null; + } + } + + private File exportDataTo(DataFormat exportType, Date recordsModifiedSince) { + String preselectedName = getPreselectedName(exportType, recordsModifiedSince); + + File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(exportType, true, false, preselectedName, + localPropertiesService, frame); + + File exportedFile = null; + if (exportToFile != null && exportToFile.length > 0) { + startExportingData(exportType, recordsModifiedSince, exportToFile[0]); + exportedFile = exportToFile[0]; + } + + return exportedFile; } -} \ No newline at end of file + private boolean promptForLabelInclusion(DataFormat exportType) { + boolean includeLabels = false; + + if (exportType.equals(DataFormat.CSV)) { + int result = JOptionPane.showConfirmDialog(frame, "Include labels for code attributes", "Include labels", + JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); + includeLabels = (result == JOptionPane.YES_OPTION); + } + + return includeLabels; + } + + private void startExportingData(DataFormat exportType, Date recordsModifiedSince, File exportToFile) { + AbstractProcess exportProcess = null; + try { + exportProcess = getExportProcess(exportType, recordsModifiedSince, exportToFile); + if (exportProcess != null) { + ExportProcessMonitorDialog exportProcessWorker = new ExportProcessMonitorDialog(exportProcess, frame, + recordsToExport, exportType, earthSurveyService, exportToFile, localPropertiesService); + exportProcessWorker.start(); + } + } catch (Exception e1) { + logger.error("What happened?", e1); //$NON-NLS-1$ //$NON-NLS-2$ + JOptionPane.showMessageDialog(this.frame, Messages.getString("CollectEarthWindow.0"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.1"), //$NON-NLS-1$ + JOptionPane.ERROR_MESSAGE); + logger.error( + "Error exporting data to " + exportToFile.getAbsolutePath() + " in format " + exportType.name(), //$NON-NLS-1$ //$NON-NLS-2$ + e1); + } + } + + private AbstractProcess getExportProcess(DataFormat exportType, Date recordsModifiedSince, + File exportToFile) throws Exception { + AbstractProcess exportProcess = null; + boolean addLabels = false; + switch (exportType) { + case CSV: + addLabels = promptForLabelInclusion(exportType); + exportProcess = dataExportService.exportSurveyAsCsv(exportToFile, addLabels); + break; + case ZIP_WITH_XML: + exportProcess = dataExportService.exportSurveyAsZipWithXml(exportToFile, recordsModifiedSince); + break; + case FUSION: + addLabels = promptForLabelInclusion(exportType); + exportProcess = dataExportService.exportSurveyAsFusionTable(exportToFile, addLabels); + break; + case COLLECT_BACKUP: + exportProcess = dataExportService.exportSurveyAsBackup(exportToFile); + break; + default: + break; + } + return exportProcess; + } + + private String getPreselectedName(DataFormat exportType, Date modifiedSince) { + + String operator = ""; + + try { + operator = localPropertiesService.getOperator(); + + operator = StringUtils.deleteWhitespace(operator); + // Replaces character like TĥïŠĩš â fůňķŷ Šťŕĭńġ with This is a funky String + operator = Normalizer.normalize(operator, Normalizer.Form.NFD).replaceAll("[^\\p{ASCII}]", ""); + + // Remove non-alphanumeric characters + operator = operator.replaceAll("[^a-zA-Z0-9]", ""); + + } catch (Exception e) { + logger.error("Error normalizing operator name ", e); + } + + String preselectName = operator + "_collectedData_"; //$NON-NLS-1$ + + preselectName += earthSurveyService.getCollectSurvey().getName(); + DateFormat dateFormat = new SimpleDateFormat("ddMMyy_HHmmss"); //$NON-NLS-1$ + if (modifiedSince == null) { + preselectName += "_on_" + dateFormat.format(new Date()); //$NON-NLS-1$ + } else { + + preselectName += "_" + dateFormat.format(modifiedSince) + "_to_" + dateFormat.format(new Date()); //$NON-NLS-1$ //$NON-NLS-2$ + } + + preselectName += "_" + exportType.name() + "." + exportType.getDefaultExtension(); //$NON-NLS-1$ //$NON-NLS-2$ + + return preselectName; + } +} From e80f0c17eb0861f395b8c7ba4a781770e25f71f1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:32 +0100 Subject: [PATCH 1210/1620] New translations ExportActionListener.java (Spanish) --- .../earth/app/view/Messages_es.properties | 239 ++++++++++++++---- 1 file changed, 194 insertions(+), 45 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 521446a595..6f1756ce73 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,52 +1,201 @@ package org.openforis.collect.earth.app.view; -import java.util.Arrays; - -public enum DataFormat{ - PROJECT_DEFINITION_FILE( - new String[]{"cep"}, Messages.getString("JFileChooserExistsAware.0")), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - ZIP_WITH_XML(new String[]{"zip", "collect-data"},Messages.getString("CollectEarthWindow.48")), //$NON-NLS-1$ //$NON-NLS-2$ - CSV(new String[]{"csv"}, Messages.getString("CollectEarthWindow.38")), //$NON-NLS-1$ //$NON-NLS-2$ - FUSION(new String[]{"csv"}, Messages.getString("CollectEarthWindow.49")), //$NON-NLS-1$ //$NON-NLS-2$ - COLLECT_COORDS(new String[]{"ced", "csv"}, "Collect Earth plots"),//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - KML_FILE(new String[]{"kml"}, "Google Earth Kml File"), //$NON-NLS-1$ //$NON-NLS-2$ - COLLECT_BACKUP(new String[]{"collect-data"}, "Collect Backup"), - SAIKU_ZIP( new String[] {"zip"}, "ZIP Saiku Tool Export" ), - GHGI_ZIP_FILE(new String[]{"zip"}, "IPCC GHGi Tool Package"); //$NON-NLS-1$ //$NON-NLS-2$ - - private String[] fileExtension; - private String description; - - private DataFormat(String[] fileExtension, String description) { - this.fileExtension = fileExtension; - this.description = description; - } - - public String[] getPossibleFileExtensions() { - return fileExtension; - } - - public String getDefaultExtension() { - return fileExtension[0]; - } - - - public String getDescription() { - return description; - } - - public boolean checkFileExtensionMatches( String fileExtensionToCheck){ - for (String ext : fileExtension) { - if( ext.equalsIgnoreCase( fileExtensionToCheck)){ - return true; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.text.DateFormat; +import java.text.Normalizer; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.swing.JPanel; + +import org.apache.commons.lang3.StringUtils; +import org.jdesktop.swingx.JXDatePicker; +import org.openforis.collect.earth.app.service.DataImportExportService; +import org.openforis.collect.earth.app.service.EarthSurveyService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.io.data.DataExportStatus; +import org.openforis.collect.manager.process.AbstractProcess; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public final class ExportActionListener implements ActionListener { + private final DataFormat exportFormat; + private JFrame frame; + private LocalPropertiesService localPropertiesService; + private DataImportExportService dataExportService; + private EarthSurveyService earthSurveyService; + private Logger logger = LoggerFactory.getLogger(ExportActionListener.class); + private RecordsToExport recordsToExport; + + public enum RecordsToExport { + ALL, MODIFIED_SINCE_LAST_EXPORT, PICK_FROM_DATE + } + + public ExportActionListener(DataFormat exportFormat, RecordsToExport recordsToExport, JFrame frame, + LocalPropertiesService localPropertiesService, DataImportExportService dataExportService, + EarthSurveyService earthSurveyService) { + this.exportFormat = exportFormat; + this.frame = frame; + this.localPropertiesService = localPropertiesService; + this.dataExportService = dataExportService; + this.earthSurveyService = earthSurveyService; + this.recordsToExport = recordsToExport; + } + + @Override + public void actionPerformed(ActionEvent e) { + try { + CollectEarthWindow.startWaiting(frame); + + Date recordsModifiedSince = null; + if (recordsToExport.equals(RecordsToExport.MODIFIED_SINCE_LAST_EXPORT)) { + String surveyName = ""; //$NON-NLS-1$ + if (earthSurveyService.getCollectSurvey() != null) { + surveyName = earthSurveyService.getCollectSurvey().getName(); + } + recordsModifiedSince = localPropertiesService.getLastExportedDate(surveyName); + } else if (recordsToExport.equals(RecordsToExport.PICK_FROM_DATE)) { + recordsModifiedSince = getPickDateDlg(); + if (recordsModifiedSince == null) { + // No date chosen, do not proceed with the export + return; + } } + + exportDataTo(exportFormat, recordsModifiedSince); + } finally { + CollectEarthWindow.endWaiting(frame); } - return false; + } - - @Override - public String toString() { - return Arrays.toString(fileExtension); + + private Date getPickDateDlg() { + + JPanel panel = new JPanel(); + + JXDatePicker picker = new JXDatePicker(); + picker.setDate(Calendar.getInstance().getTime()); + picker.setFormats(new SimpleDateFormat("dd.MM.yyyy")); //$NON-NLS-1$ + + panel.add(picker); + + int result = JOptionPane.showConfirmDialog(frame, panel, Messages.getString("ExportActionListener.1"), //$NON-NLS-1$ + JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); + if (result == JOptionPane.OK_OPTION) { + return picker.getDate(); + } else { + return null; + } + } + + private File exportDataTo(DataFormat exportType, Date recordsModifiedSince) { + String preselectedName = getPreselectedName(exportType, recordsModifiedSince); + + File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(exportType, true, false, preselectedName, + localPropertiesService, frame); + + File exportedFile = null; + if (exportToFile != null && exportToFile.length > 0) { + startExportingData(exportType, recordsModifiedSince, exportToFile[0]); + exportedFile = exportToFile[0]; + } + + return exportedFile; } -} \ No newline at end of file + private boolean promptForLabelInclusion(DataFormat exportType) { + boolean includeLabels = false; + + if (exportType.equals(DataFormat.CSV)) { + int result = JOptionPane.showConfirmDialog(frame, "Include labels for code attributes", "Include labels", + JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); + includeLabels = (result == JOptionPane.YES_OPTION); + } + + return includeLabels; + } + + private void startExportingData(DataFormat exportType, Date recordsModifiedSince, File exportToFile) { + AbstractProcess exportProcess = null; + try { + exportProcess = getExportProcess(exportType, recordsModifiedSince, exportToFile); + if (exportProcess != null) { + ExportProcessMonitorDialog exportProcessWorker = new ExportProcessMonitorDialog(exportProcess, frame, + recordsToExport, exportType, earthSurveyService, exportToFile, localPropertiesService); + exportProcessWorker.start(); + } + } catch (Exception e1) { + logger.error("What happened?", e1); //$NON-NLS-1$ //$NON-NLS-2$ + JOptionPane.showMessageDialog(this.frame, Messages.getString("CollectEarthWindow.0"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.1"), //$NON-NLS-1$ + JOptionPane.ERROR_MESSAGE); + logger.error( + "Error exporting data to " + exportToFile.getAbsolutePath() + " in format " + exportType.name(), //$NON-NLS-1$ //$NON-NLS-2$ + e1); + } + } + + private AbstractProcess getExportProcess(DataFormat exportType, Date recordsModifiedSince, + File exportToFile) throws Exception { + AbstractProcess exportProcess = null; + boolean addLabels = false; + switch (exportType) { + case CSV: + addLabels = promptForLabelInclusion(exportType); + exportProcess = dataExportService.exportSurveyAsCsv(exportToFile, addLabels); + break; + case ZIP_WITH_XML: + exportProcess = dataExportService.exportSurveyAsZipWithXml(exportToFile, recordsModifiedSince); + break; + case FUSION: + addLabels = promptForLabelInclusion(exportType); + exportProcess = dataExportService.exportSurveyAsFusionTable(exportToFile, addLabels); + break; + case COLLECT_BACKUP: + exportProcess = dataExportService.exportSurveyAsBackup(exportToFile); + break; + default: + break; + } + return exportProcess; + } + + private String getPreselectedName(DataFormat exportType, Date modifiedSince) { + + String operator = ""; + + try { + operator = localPropertiesService.getOperator(); + + operator = StringUtils.deleteWhitespace(operator); + // Replaces character like TĥïŠĩš â fůňķŷ Šťŕĭńġ with This is a funky String + operator = Normalizer.normalize(operator, Normalizer.Form.NFD).replaceAll("[^\\p{ASCII}]", ""); + + // Remove non-alphanumeric characters + operator = operator.replaceAll("[^a-zA-Z0-9]", ""); + + } catch (Exception e) { + logger.error("Error normalizing operator name ", e); + } + + String preselectName = operator + "_collectedData_"; //$NON-NLS-1$ + + preselectName += earthSurveyService.getCollectSurvey().getName(); + DateFormat dateFormat = new SimpleDateFormat("ddMMyy_HHmmss"); //$NON-NLS-1$ + if (modifiedSince == null) { + preselectName += "_on_" + dateFormat.format(new Date()); //$NON-NLS-1$ + } else { + + preselectName += "_" + dateFormat.format(modifiedSince) + "_to_" + dateFormat.format(new Date()); //$NON-NLS-1$ //$NON-NLS-2$ + } + + preselectName += "_" + exportType.name() + "." + exportType.getDefaultExtension(); //$NON-NLS-1$ //$NON-NLS-2$ + + return preselectName; + } +} From 7957d6f323d60807b64b2afbfeaa9133e58e97bc Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:33 +0100 Subject: [PATCH 1211/1620] New translations IPCCGeneratorListener.java (English) --- .../earth/app/view/Messages_en.properties | 95 +++++++++++-------- 1 file changed, 53 insertions(+), 42 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 521446a595..7c0a5857ae 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,52 +1,63 @@ package org.openforis.collect.earth.app.view; -import java.util.Arrays; - -public enum DataFormat{ - PROJECT_DEFINITION_FILE( - new String[]{"cep"}, Messages.getString("JFileChooserExistsAware.0")), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - ZIP_WITH_XML(new String[]{"zip", "collect-data"},Messages.getString("CollectEarthWindow.48")), //$NON-NLS-1$ //$NON-NLS-2$ - CSV(new String[]{"csv"}, Messages.getString("CollectEarthWindow.38")), //$NON-NLS-1$ //$NON-NLS-2$ - FUSION(new String[]{"csv"}, Messages.getString("CollectEarthWindow.49")), //$NON-NLS-1$ //$NON-NLS-2$ - COLLECT_COORDS(new String[]{"ced", "csv"}, "Collect Earth plots"),//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - KML_FILE(new String[]{"kml"}, "Google Earth Kml File"), //$NON-NLS-1$ //$NON-NLS-2$ - COLLECT_BACKUP(new String[]{"collect-data"}, "Collect Backup"), - SAIKU_ZIP( new String[] {"zip"}, "ZIP Saiku Tool Export" ), - GHGI_ZIP_FILE(new String[]{"zip"}, "IPCC GHGi Tool Package"); //$NON-NLS-1$ //$NON-NLS-2$ - - private String[] fileExtension; - private String description; - - private DataFormat(String[] fileExtension, String description) { - this.fileExtension = fileExtension; - this.description = description; - } +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; - public String[] getPossibleFileExtensions() { - return fileExtension; - } - - public String getDefaultExtension() { - return fileExtension[0]; +import javax.swing.JFrame; +import javax.swing.JOptionPane; + +import org.openforis.collect.earth.app.service.ExportType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class IPCCGeneratorListener implements ActionListener { + private Logger logger = LoggerFactory.getLogger( IPCCGeneratorListener.class); + private JFrame frame; + private GenerateDatabaseStarter ipccExporterStarter; + + public IPCCGeneratorListener(JFrame frame, GenerateDatabaseStarter ipccExporterStarter) { + this.frame = frame; + this.ipccExporterStarter = ipccExporterStarter; } - - - public String getDescription() { - return description; + + + @Override + public void actionPerformed(ActionEvent e) { + try { + CollectEarthWindow.startWaiting(frame); + generateIpccData(); + }catch (Exception e1) { + logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ + } finally{ + CollectEarthWindow.endWaiting(frame); + } } - - public boolean checkFileExtensionMatches( String fileExtensionToCheck){ - for (String ext : fileExtension) { - if( ext.equalsIgnoreCase( fileExtensionToCheck)){ - return true; + + private void generateIpccData() { + if( ipccExporterStarter.isStarting() ){ + JOptionPane.showMessageDialog(frame, Messages.getString("IPCCGeneratorListener.1"), Messages.getString("IPCCGeneratorListener.2"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ + }else{ + + int shouldRefreshDb = JOptionPane.YES_OPTION; + + if( ipccExporterStarter.shouldShowRdbGenerationOption(ExportType.IPCC) ){ + + String refresh = Messages.getString("IPCCGeneratorListener.3"); //$NON-NLS-1$ + String close = Messages.getString("IPCCGeneratorListener.4"); //$NON-NLS-1$ + String[] options = new String[]{ refresh,close}; + + + shouldRefreshDb = JOptionPane.showOptionDialog( + frame, Messages.getString("IPCCGeneratorListener.6"), //$NON-NLS-1$ + Messages.getString("IPCCGeneratorListener.5"), //$NON-NLS-1$ + JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); + } + + if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ + ipccExporterStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); + ipccExporterStarter.initializeAndOpen( true ); } } - return false; - } - - @Override - public String toString() { - return Arrays.toString(fileExtension); } } \ No newline at end of file From 56b84fd2768beb1c5c17f26f5f124bfd150b83ad Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:34 +0100 Subject: [PATCH 1212/1620] New translations ImportActionListener.java (French) --- .../earth/app/view/Messages_fr.properties | 315 +++++++++--------- 1 file changed, 161 insertions(+), 154 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 6f1756ce73..88aa8edf1c 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -2,200 +2,207 @@ package org.openforis.collect.earth.app.view; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.io.BufferedReader; import java.io.File; -import java.text.DateFormat; -import java.text.Normalizer; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Arrays; import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.JPanel; -import org.apache.commons.lang3.StringUtils; -import org.jdesktop.swingx.JXDatePicker; +import org.apache.commons.io.IOUtils; +import org.openforis.collect.earth.app.desktop.EarthApp; import org.openforis.collect.earth.app.service.DataImportExportService; -import org.openforis.collect.earth.app.service.EarthSurveyService; import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.io.data.DataExportStatus; -import org.openforis.collect.manager.process.AbstractProcess; +import org.openforis.collect.io.data.CSVDataImportProcess; +import org.openforis.collect.io.data.XMLDataImportProcess; +import org.openforis.collect.manager.process.ProcessStatus; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public final class ExportActionListener implements ActionListener { - private final DataFormat exportFormat; +public final class ImportActionListener implements ActionListener { + protected static final Integer YES = 0; + protected static final Integer YES_TO_ALL = 1; + protected static final Integer NO = 2; + protected static final Integer NO_TO_ALL = 3; + + private final DataFormat importFormat; private JFrame frame; private LocalPropertiesService localPropertiesService; - private DataImportExportService dataExportService; - private EarthSurveyService earthSurveyService; - private Logger logger = LoggerFactory.getLogger(ExportActionListener.class); - private RecordsToExport recordsToExport; - - public enum RecordsToExport { - ALL, MODIFIED_SINCE_LAST_EXPORT, PICK_FROM_DATE - } + private DataImportExportService dataImportService; + private Logger logger = LoggerFactory.getLogger( ImportActionListener.class ); - public ExportActionListener(DataFormat exportFormat, RecordsToExport recordsToExport, JFrame frame, - LocalPropertiesService localPropertiesService, DataImportExportService dataExportService, - EarthSurveyService earthSurveyService) { - this.exportFormat = exportFormat; + public ImportActionListener(DataFormat importFormat, JFrame frame, LocalPropertiesService localPropertiesService, DataImportExportService dataImportService) { + this.importFormat = importFormat; this.frame = frame; this.localPropertiesService = localPropertiesService; - this.dataExportService = dataExportService; - this.earthSurveyService = earthSurveyService; - this.recordsToExport = recordsToExport; + this.dataImportService = dataImportService; } @Override public void actionPerformed(ActionEvent e) { - try { + try{ CollectEarthWindow.startWaiting(frame); - - Date recordsModifiedSince = null; - if (recordsToExport.equals(RecordsToExport.MODIFIED_SINCE_LAST_EXPORT)) { - String surveyName = ""; //$NON-NLS-1$ - if (earthSurveyService.getCollectSurvey() != null) { - surveyName = earthSurveyService.getCollectSurvey().getName(); - } - recordsModifiedSince = localPropertiesService.getLastExportedDate(surveyName); - } else if (recordsToExport.equals(RecordsToExport.PICK_FROM_DATE)) { - recordsModifiedSince = getPickDateDlg(); - if (recordsModifiedSince == null) { - // No date chosen, do not proceed with the export - return; - } - } - - exportDataTo(exportFormat, recordsModifiedSince); - } finally { - CollectEarthWindow.endWaiting(frame); + importDataFrom(e, importFormat ); + }finally{ + CollectEarthWindow.endWaiting( frame); } } + + private void forceRefreshGoogleEarth() { - private Date getPickDateDlg() { + EarthApp.executeKmlLoadAsynchronously( null ); - JPanel panel = new JPanel(); - - JXDatePicker picker = new JXDatePicker(); - picker.setDate(Calendar.getInstance().getTime()); - picker.setFormats(new SimpleDateFormat("dd.MM.yyyy")); //$NON-NLS-1$ - - panel.add(picker); - - int result = JOptionPane.showConfirmDialog(frame, panel, Messages.getString("ExportActionListener.1"), //$NON-NLS-1$ - JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); - if (result == JOptionPane.OK_OPTION) { - return picker.getDate(); - } else { - return null; - } } + private Integer shouldImportNonFinishedRecords( boolean moreThanOneFiles ) { + String message = "" //$NON-NLS-1$ + + Messages.getString("ImportActionListener.0") //$NON-NLS-1$ + +"
" //$NON-NLS-1$ + + Messages.getString("ImportActionListener.2") //$NON-NLS-1$ + + ""; + + if( !moreThanOneFiles ){ + + final int selectedOption = JOptionPane.showConfirmDialog(null, + message //$NON-NLS-1$ + ,Messages.getString("ImportActionListener.3"), //$NON-NLS-1$ + JOptionPane.YES_NO_OPTION); + + if (selectedOption == JOptionPane.YES_OPTION){ + return YES; + }else if (selectedOption == JOptionPane.NO_OPTION){ + return NO; + }else{ + return JOptionPane.CLOSED_OPTION; + } + }else{ - private File exportDataTo(DataFormat exportType, Date recordsModifiedSince) { - String preselectedName = getPreselectedName(exportType, recordsModifiedSince); + String[] buttons = { Messages.getString("YES"), Messages.getString("YES_TO_ALL"), Messages.getString("NO"), Messages.getString("NO_TO_ALL") }; - File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(exportType, true, false, preselectedName, - localPropertiesService, frame); + return JOptionPane.showOptionDialog(null, message, Messages.getString("ImportActionListener.3") , + JOptionPane.WARNING_MESSAGE, 0, null, buttons, buttons[1]); - File exportedFile = null; - if (exportToFile != null && exportToFile.length > 0) { - startExportingData(exportType, recordsModifiedSince, exportToFile[0]); - exportedFile = exportToFile[0]; } - - return exportedFile; } - private boolean promptForLabelInclusion(DataFormat exportType) { - boolean includeLabels = false; - - if (exportType.equals(DataFormat.CSV)) { - int result = JOptionPane.showConfirmDialog(frame, "Include labels for code attributes", "Include labels", - JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); - includeLabels = (result == JOptionPane.YES_OPTION); - } - - return includeLabels; - } - - private void startExportingData(DataFormat exportType, Date recordsModifiedSince, File exportToFile) { - AbstractProcess exportProcess = null; - try { - exportProcess = getExportProcess(exportType, recordsModifiedSince, exportToFile); - if (exportProcess != null) { - ExportProcessMonitorDialog exportProcessWorker = new ExportProcessMonitorDialog(exportProcess, frame, - recordsToExport, exportType, earthSurveyService, exportToFile, localPropertiesService); - exportProcessWorker.start(); + private void importDataFrom(final ActionEvent e, final DataFormat importType) { + File[] filesToImport = JFileChooserExistsAware.getFileChooserResults( importType, false, true, null, localPropertiesService, frame ); + final ImportXMLDialogProcessMonitor importDialogProcessMonitor = new ImportXMLDialogProcessMonitor(); + if (filesToImport != null) { + + + switch (importType) { + case ZIP_WITH_XML: + new Thread("XML Import Thread " ){ //$NON-NLS-1$ + @Override + public void run() { + Integer importNonFinishedPlots = shouldImportNonFinishedRecords( filesToImport.length > 1); + boolean firstFile = true; + + for (final File importedFile : filesToImport) { + XMLDataImportProcess dataImportProcess = null; + try{ + if ( firstFile ){ + firstFile = false; + }else if ( !firstFile && (importNonFinishedPlots.equals( YES ) || importNonFinishedPlots.equals( NO ) ) ){ + importNonFinishedPlots = shouldImportNonFinishedRecords( filesToImport.length > 1); + } + + if( importNonFinishedPlots.equals( JOptionPane.CLOSED_OPTION ) ){ + break; + } + + boolean importNotFinished= importNonFinishedPlots.equals( YES ) || importNonFinishedPlots.equals( YES_TO_ALL ); + + dataImportProcess = dataImportService.getImportSummary(importedFile, importNotFinished); + importDialogProcessMonitor.startImport(dataImportProcess, frame, dataImportService, importedFile ); + + } catch (Exception e1) { + logger.error("Error importing data" , e1); //$NON-NLS-1$ + importDialogProcessMonitor.closeProgressmonitor(); + JOptionPane.showMessageDialog( frame, importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.3"), importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.7"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + JOptionPane.ERROR_MESSAGE); + logger.error("Error importing data from " + importedFile.getAbsolutePath() + " in format " + importType.name() , e1); //$NON-NLS-1$ //$NON-NLS-2$ + } finally { + IOUtils.closeQuietly(dataImportProcess); + } + } + forceRefreshGoogleEarth(); + } + }.start(); + break; + case CSV: + new Thread("Update using CSV Thread " ){ //$NON-NLS-1$ + @Override + public void run() { + + String[] ids = dataImportService.getEarthSurveyService().getKeyNamesForSurvey(); + String keyAttributesForSurvey = Arrays.toString( ids ); + + JOptionPane.showMessageDialog( + frame, + "The CSV files used must have columns with at least the headers for the key attributes " + keyAttributesForSurvey+ " followed by one or more attribute names ( see http://www.openforis.org/support/questions/80/changing-plot-attributes-in-the-collect-earth-database ) ", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + "CSV file format info", + JOptionPane.INFORMATION_MESSAGE); + + + for (final File importedFile : filesToImport) { + + CSVDataImportProcess importSurveyAsCsv = null; + try { + importSurveyAsCsv = dataImportService.getCsvImporterProcess(importedFile); + + if( importSurveyAsCsv != null ){ + importSurveyAsCsv.init(); + ProcessStatus status = importSurveyAsCsv.getStatus(); + status.setTotal( getTotalNumberOfLines( importedFile ) ); + if ( status != null && ! importSurveyAsCsv.getStatus().isError() ) { + ImportProcessMonitorDialog importProcessWorker = new ImportProcessMonitorDialog(importSurveyAsCsv, frame ); + importProcessWorker.start(); + } + } + } catch (Exception e1) { + JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.7") + "\n" + e1.getMessage(), importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.3"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + JOptionPane.ERROR_MESSAGE); + logger.error("Error importing data from " + importedFile.getAbsolutePath() + " in format " + importType , e1); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + } + }.start(); + break; + case FUSION: + break; + default: + break; } - } catch (Exception e1) { - logger.error("What happened?", e1); //$NON-NLS-1$ //$NON-NLS-2$ - JOptionPane.showMessageDialog(this.frame, Messages.getString("CollectEarthWindow.0"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.1"), //$NON-NLS-1$ - JOptionPane.ERROR_MESSAGE); - logger.error( - "Error exporting data to " + exportToFile.getAbsolutePath() + " in format " + exportType.name(), //$NON-NLS-1$ //$NON-NLS-2$ - e1); } } - private AbstractProcess getExportProcess(DataFormat exportType, Date recordsModifiedSince, - File exportToFile) throws Exception { - AbstractProcess exportProcess = null; - boolean addLabels = false; - switch (exportType) { - case CSV: - addLabels = promptForLabelInclusion(exportType); - exportProcess = dataExportService.exportSurveyAsCsv(exportToFile, addLabels); - break; - case ZIP_WITH_XML: - exportProcess = dataExportService.exportSurveyAsZipWithXml(exportToFile, recordsModifiedSince); - break; - case FUSION: - addLabels = promptForLabelInclusion(exportType); - exportProcess = dataExportService.exportSurveyAsFusionTable(exportToFile, addLabels); - break; - case COLLECT_BACKUP: - exportProcess = dataExportService.exportSurveyAsBackup(exportToFile); - break; - default: - break; - } - return exportProcess; - } - - private String getPreselectedName(DataFormat exportType, Date modifiedSince) { - - String operator = ""; - + private long getTotalNumberOfLines(File importedFile) { + long count = 0; + BufferedReader br = null; try { - operator = localPropertiesService.getOperator(); - - operator = StringUtils.deleteWhitespace(operator); - // Replaces character like TĥïŠĩš â fůňķŷ Šťŕĭńġ with This is a funky String - operator = Normalizer.normalize(operator, Normalizer.Form.NFD).replaceAll("[^\\p{ASCII}]", ""); + br = new BufferedReader(new InputStreamReader(new FileInputStream(importedFile))); - // Remove non-alphanumeric characters - operator = operator.replaceAll("[^a-zA-Z0-9]", ""); - - } catch (Exception e) { - logger.error("Error normalizing operator name ", e); - } - - String preselectName = operator + "_collectedData_"; //$NON-NLS-1$ + while ( br.readLine() != null) { + count++; + } + } catch (IOException e) { + logger.error("Error counting the number of lines in file " + importedFile.getAbsolutePath() , e) ; //$NON-NLS-1$ + }finally { + if( br!=null) { + try { + br.close(); + } catch (IOException e) { + logger.error("Error closing file reader " + importedFile.getAbsolutePath() , e) ; + } + } - preselectName += earthSurveyService.getCollectSurvey().getName(); - DateFormat dateFormat = new SimpleDateFormat("ddMMyy_HHmmss"); //$NON-NLS-1$ - if (modifiedSince == null) { - preselectName += "_on_" + dateFormat.format(new Date()); //$NON-NLS-1$ - } else { - preselectName += "_" + dateFormat.format(modifiedSince) + "_to_" + dateFormat.format(new Date()); //$NON-NLS-1$ //$NON-NLS-2$ } - - preselectName += "_" + exportType.name() + "." + exportType.getDefaultExtension(); //$NON-NLS-1$ //$NON-NLS-2$ - - return preselectName; + return count; } } From 7195cc66fc0e2f7440c3110ccd063bca1d27b177 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:36 +0100 Subject: [PATCH 1213/1620] New translations OpenAboutDialogListener.java (Spanish) --- .../earth/app/view/Messages_es.properties | 200 ++---------------- 1 file changed, 13 insertions(+), 187 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 6f1756ce73..2f8596c07f 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -2,200 +2,26 @@ package org.openforis.collect.earth.app.view; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.io.File; -import java.text.DateFormat; -import java.text.Normalizer; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import org.apache.commons.lang3.StringUtils; -import org.jdesktop.swingx.JXDatePicker; -import org.openforis.collect.earth.app.service.DataImportExportService; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.io.data.DataExportStatus; -import org.openforis.collect.manager.process.AbstractProcess; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +public class OpenAboutDialogListener implements ActionListener{ -public final class ExportActionListener implements ActionListener { - private final DataFormat exportFormat; - private JFrame frame; - private LocalPropertiesService localPropertiesService; - private DataImportExportService dataExportService; - private EarthSurveyService earthSurveyService; - private Logger logger = LoggerFactory.getLogger(ExportActionListener.class); - private RecordsToExport recordsToExport; - - public enum RecordsToExport { - ALL, MODIFIED_SINCE_LAST_EXPORT, PICK_FROM_DATE - } - - public ExportActionListener(DataFormat exportFormat, RecordsToExport recordsToExport, JFrame frame, - LocalPropertiesService localPropertiesService, DataImportExportService dataExportService, - EarthSurveyService earthSurveyService) { - this.exportFormat = exportFormat; - this.frame = frame; - this.localPropertiesService = localPropertiesService; - this.dataExportService = dataExportService; - this.earthSurveyService = earthSurveyService; - this.recordsToExport = recordsToExport; + JFrame parent; + String title; + + public OpenAboutDialogListener(JFrame parentFrame, String title) { + this.parent = parentFrame; + this.title = title; } - + @Override public void actionPerformed(ActionEvent e) { - try { - CollectEarthWindow.startWaiting(frame); - - Date recordsModifiedSince = null; - if (recordsToExport.equals(RecordsToExport.MODIFIED_SINCE_LAST_EXPORT)) { - String surveyName = ""; //$NON-NLS-1$ - if (earthSurveyService.getCollectSurvey() != null) { - surveyName = earthSurveyService.getCollectSurvey().getName(); - } - recordsModifiedSince = localPropertiesService.getLastExportedDate(surveyName); - } else if (recordsToExport.equals(RecordsToExport.PICK_FROM_DATE)) { - recordsModifiedSince = getPickDateDlg(); - if (recordsModifiedSince == null) { - // No date chosen, do not proceed with the export - return; - } - } - - exportDataTo(exportFormat, recordsModifiedSince); - } finally { - CollectEarthWindow.endWaiting(frame); - } - + AboutDialog aboutDialog = new AboutDialog(parent, title); + aboutDialog.setLocationRelativeTo(parent); + + aboutDialog.setModal(true); + aboutDialog.setVisible(true); } - private Date getPickDateDlg() { - - JPanel panel = new JPanel(); - - JXDatePicker picker = new JXDatePicker(); - picker.setDate(Calendar.getInstance().getTime()); - picker.setFormats(new SimpleDateFormat("dd.MM.yyyy")); //$NON-NLS-1$ - - panel.add(picker); - - int result = JOptionPane.showConfirmDialog(frame, panel, Messages.getString("ExportActionListener.1"), //$NON-NLS-1$ - JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); - if (result == JOptionPane.OK_OPTION) { - return picker.getDate(); - } else { - return null; - } - } - - private File exportDataTo(DataFormat exportType, Date recordsModifiedSince) { - String preselectedName = getPreselectedName(exportType, recordsModifiedSince); - - File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(exportType, true, false, preselectedName, - localPropertiesService, frame); - - File exportedFile = null; - if (exportToFile != null && exportToFile.length > 0) { - startExportingData(exportType, recordsModifiedSince, exportToFile[0]); - exportedFile = exportToFile[0]; - } - - return exportedFile; - } - - private boolean promptForLabelInclusion(DataFormat exportType) { - boolean includeLabels = false; - - if (exportType.equals(DataFormat.CSV)) { - int result = JOptionPane.showConfirmDialog(frame, "Include labels for code attributes", "Include labels", - JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); - includeLabels = (result == JOptionPane.YES_OPTION); - } - - return includeLabels; - } - - private void startExportingData(DataFormat exportType, Date recordsModifiedSince, File exportToFile) { - AbstractProcess exportProcess = null; - try { - exportProcess = getExportProcess(exportType, recordsModifiedSince, exportToFile); - if (exportProcess != null) { - ExportProcessMonitorDialog exportProcessWorker = new ExportProcessMonitorDialog(exportProcess, frame, - recordsToExport, exportType, earthSurveyService, exportToFile, localPropertiesService); - exportProcessWorker.start(); - } - } catch (Exception e1) { - logger.error("What happened?", e1); //$NON-NLS-1$ //$NON-NLS-2$ - JOptionPane.showMessageDialog(this.frame, Messages.getString("CollectEarthWindow.0"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.1"), //$NON-NLS-1$ - JOptionPane.ERROR_MESSAGE); - logger.error( - "Error exporting data to " + exportToFile.getAbsolutePath() + " in format " + exportType.name(), //$NON-NLS-1$ //$NON-NLS-2$ - e1); - } - } - - private AbstractProcess getExportProcess(DataFormat exportType, Date recordsModifiedSince, - File exportToFile) throws Exception { - AbstractProcess exportProcess = null; - boolean addLabels = false; - switch (exportType) { - case CSV: - addLabels = promptForLabelInclusion(exportType); - exportProcess = dataExportService.exportSurveyAsCsv(exportToFile, addLabels); - break; - case ZIP_WITH_XML: - exportProcess = dataExportService.exportSurveyAsZipWithXml(exportToFile, recordsModifiedSince); - break; - case FUSION: - addLabels = promptForLabelInclusion(exportType); - exportProcess = dataExportService.exportSurveyAsFusionTable(exportToFile, addLabels); - break; - case COLLECT_BACKUP: - exportProcess = dataExportService.exportSurveyAsBackup(exportToFile); - break; - default: - break; - } - return exportProcess; - } - - private String getPreselectedName(DataFormat exportType, Date modifiedSince) { - - String operator = ""; - - try { - operator = localPropertiesService.getOperator(); - - operator = StringUtils.deleteWhitespace(operator); - // Replaces character like TĥïŠĩš â fůňķŷ Šťŕĭńġ with This is a funky String - operator = Normalizer.normalize(operator, Normalizer.Form.NFD).replaceAll("[^\\p{ASCII}]", ""); - - // Remove non-alphanumeric characters - operator = operator.replaceAll("[^a-zA-Z0-9]", ""); - - } catch (Exception e) { - logger.error("Error normalizing operator name ", e); - } - - String preselectName = operator + "_collectedData_"; //$NON-NLS-1$ - - preselectName += earthSurveyService.getCollectSurvey().getName(); - DateFormat dateFormat = new SimpleDateFormat("ddMMyy_HHmmss"); //$NON-NLS-1$ - if (modifiedSince == null) { - preselectName += "_on_" + dateFormat.format(new Date()); //$NON-NLS-1$ - } else { - - preselectName += "_" + dateFormat.format(modifiedSince) + "_to_" + dateFormat.format(new Date()); //$NON-NLS-1$ //$NON-NLS-2$ - } - - preselectName += "_" + exportType.name() + "." + exportType.getDefaultExtension(); //$NON-NLS-1$ //$NON-NLS-2$ - - return preselectName; - } } From ad4725fa4fbb2b341eff6ebe6d2f478b4fdca2c1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:37 +0100 Subject: [PATCH 1214/1620] New translations LinkRunner.java (French) --- .../earth/app/view/Messages_fr.properties | 239 +++--------------- 1 file changed, 37 insertions(+), 202 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 88aa8edf1c..c9f18857eb 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,208 +1,43 @@ package org.openforis.collect.earth.app.view; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.Arrays; +import java.awt.Desktop; +import java.net.URI; +import java.util.concurrent.ExecutionException; -import javax.swing.JFrame; import javax.swing.JOptionPane; - -import org.apache.commons.io.IOUtils; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.DataImportExportService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.io.data.CSVDataImportProcess; -import org.openforis.collect.io.data.XMLDataImportProcess; -import org.openforis.collect.manager.process.ProcessStatus; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public final class ImportActionListener implements ActionListener { - protected static final Integer YES = 0; - protected static final Integer YES_TO_ALL = 1; - protected static final Integer NO = 2; - protected static final Integer NO_TO_ALL = 3; - - private final DataFormat importFormat; - private JFrame frame; - private LocalPropertiesService localPropertiesService; - private DataImportExportService dataImportService; - private Logger logger = LoggerFactory.getLogger( ImportActionListener.class ); - - public ImportActionListener(DataFormat importFormat, JFrame frame, LocalPropertiesService localPropertiesService, DataImportExportService dataImportService) { - this.importFormat = importFormat; - this.frame = frame; - this.localPropertiesService = localPropertiesService; - this.dataImportService = dataImportService; - } - - @Override - public void actionPerformed(ActionEvent e) { - try{ - CollectEarthWindow.startWaiting(frame); - importDataFrom(e, importFormat ); - }finally{ - CollectEarthWindow.endWaiting( frame); - } - - } - - private void forceRefreshGoogleEarth() { - - EarthApp.executeKmlLoadAsynchronously( null ); - - } - private Integer shouldImportNonFinishedRecords( boolean moreThanOneFiles ) { - String message = "" //$NON-NLS-1$ - + Messages.getString("ImportActionListener.0") //$NON-NLS-1$ - +"
" //$NON-NLS-1$ - + Messages.getString("ImportActionListener.2") //$NON-NLS-1$ - + ""; - - if( !moreThanOneFiles ){ - - final int selectedOption = JOptionPane.showConfirmDialog(null, - message //$NON-NLS-1$ - ,Messages.getString("ImportActionListener.3"), //$NON-NLS-1$ - JOptionPane.YES_NO_OPTION); - - if (selectedOption == JOptionPane.YES_OPTION){ - return YES; - }else if (selectedOption == JOptionPane.NO_OPTION){ - return NO; - }else{ - return JOptionPane.CLOSED_OPTION; - } - }else{ - - String[] buttons = { Messages.getString("YES"), Messages.getString("YES_TO_ALL"), Messages.getString("NO"), Messages.getString("NO_TO_ALL") }; - - return JOptionPane.showOptionDialog(null, message, Messages.getString("ImportActionListener.3") , - JOptionPane.WARNING_MESSAGE, 0, null, buttons, buttons[1]); - - } - } - - private void importDataFrom(final ActionEvent e, final DataFormat importType) { - File[] filesToImport = JFileChooserExistsAware.getFileChooserResults( importType, false, true, null, localPropertiesService, frame ); - final ImportXMLDialogProcessMonitor importDialogProcessMonitor = new ImportXMLDialogProcessMonitor(); - if (filesToImport != null) { - - - switch (importType) { - case ZIP_WITH_XML: - new Thread("XML Import Thread " ){ //$NON-NLS-1$ - @Override - public void run() { - Integer importNonFinishedPlots = shouldImportNonFinishedRecords( filesToImport.length > 1); - boolean firstFile = true; - - for (final File importedFile : filesToImport) { - XMLDataImportProcess dataImportProcess = null; - try{ - if ( firstFile ){ - firstFile = false; - }else if ( !firstFile && (importNonFinishedPlots.equals( YES ) || importNonFinishedPlots.equals( NO ) ) ){ - importNonFinishedPlots = shouldImportNonFinishedRecords( filesToImport.length > 1); - } - - if( importNonFinishedPlots.equals( JOptionPane.CLOSED_OPTION ) ){ - break; - } - - boolean importNotFinished= importNonFinishedPlots.equals( YES ) || importNonFinishedPlots.equals( YES_TO_ALL ); - - dataImportProcess = dataImportService.getImportSummary(importedFile, importNotFinished); - importDialogProcessMonitor.startImport(dataImportProcess, frame, dataImportService, importedFile ); - - } catch (Exception e1) { - logger.error("Error importing data" , e1); //$NON-NLS-1$ - importDialogProcessMonitor.closeProgressmonitor(); - JOptionPane.showMessageDialog( frame, importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.3"), importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.7"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - JOptionPane.ERROR_MESSAGE); - logger.error("Error importing data from " + importedFile.getAbsolutePath() + " in format " + importType.name() , e1); //$NON-NLS-1$ //$NON-NLS-2$ - } finally { - IOUtils.closeQuietly(dataImportProcess); - } - } - forceRefreshGoogleEarth(); - } - }.start(); - break; - case CSV: - new Thread("Update using CSV Thread " ){ //$NON-NLS-1$ - @Override - public void run() { - - String[] ids = dataImportService.getEarthSurveyService().getKeyNamesForSurvey(); - String keyAttributesForSurvey = Arrays.toString( ids ); - - JOptionPane.showMessageDialog( - frame, - "The CSV files used must have columns with at least the headers for the key attributes " + keyAttributesForSurvey+ " followed by one or more attribute names ( see http://www.openforis.org/support/questions/80/changing-plot-attributes-in-the-collect-earth-database ) ", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - "CSV file format info", - JOptionPane.INFORMATION_MESSAGE); - - - for (final File importedFile : filesToImport) { - - CSVDataImportProcess importSurveyAsCsv = null; - try { - importSurveyAsCsv = dataImportService.getCsvImporterProcess(importedFile); - - if( importSurveyAsCsv != null ){ - importSurveyAsCsv.init(); - ProcessStatus status = importSurveyAsCsv.getStatus(); - status.setTotal( getTotalNumberOfLines( importedFile ) ); - if ( status != null && ! importSurveyAsCsv.getStatus().isError() ) { - ImportProcessMonitorDialog importProcessWorker = new ImportProcessMonitorDialog(importSurveyAsCsv, frame ); - importProcessWorker.start(); - } - } - } catch (Exception e1) { - JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.7") + "\n" + e1.getMessage(), importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.3"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - JOptionPane.ERROR_MESSAGE); - logger.error("Error importing data from " + importedFile.getAbsolutePath() + " in format " + importType , e1); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - } - }.start(); - break; - case FUSION: - break; - default: - break; - } +import javax.swing.SwingWorker; + +class LinkRunner extends SwingWorker { + + private final URI uri; + + LinkRunner(URI u) { + if (u == null) { + throw new NullPointerException(); + } + uri = u; + } + + @Override + protected Void doInBackground() throws Exception { + Desktop desktop = java.awt.Desktop.getDesktop(); + desktop.browse(uri); + return null; + } + + @Override + protected void done() { + try { + get(); + } catch (ExecutionException ee) { + handleException(); + } catch (InterruptedException e) { + handleException(); + Thread.currentThread().interrupt(); } - } + } - private long getTotalNumberOfLines(File importedFile) { - long count = 0; - BufferedReader br = null; - try { - br = new BufferedReader(new InputStreamReader(new FileInputStream(importedFile))); - - while ( br.readLine() != null) { - count++; - } - } catch (IOException e) { - logger.error("Error counting the number of lines in file " + importedFile.getAbsolutePath() , e) ; //$NON-NLS-1$ - }finally { - if( br!=null) { - try { - br.close(); - } catch (IOException e) { - logger.error("Error closing file reader " + importedFile.getAbsolutePath() , e) ; - } - } - - - } - return count; - } -} + private static void handleException() { + JOptionPane.showMessageDialog(null, Messages.getString("AboutDialog.6"), Messages.getString("AboutDialog.19"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ + } +} \ No newline at end of file From 3951278978ac687b62f29dad85e742720d2d04f4 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:38 +0100 Subject: [PATCH 1215/1620] New translations LinkRunner.java (Spanish) --- .../earth/app/view/Messages_es.properties | 66 ++++++++++++------- 1 file changed, 41 insertions(+), 25 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 2f8596c07f..c9f18857eb 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,27 +1,43 @@ package org.openforis.collect.earth.app.view; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -import javax.swing.JFrame; - -public class OpenAboutDialogListener implements ActionListener{ - - JFrame parent; - String title; - - public OpenAboutDialogListener(JFrame parentFrame, String title) { - this.parent = parentFrame; - this.title = title; - } - - @Override - public void actionPerformed(ActionEvent e) { - AboutDialog aboutDialog = new AboutDialog(parent, title); - aboutDialog.setLocationRelativeTo(parent); - - aboutDialog.setModal(true); - aboutDialog.setVisible(true); - } - -} +import java.awt.Desktop; +import java.net.URI; +import java.util.concurrent.ExecutionException; + +import javax.swing.JOptionPane; +import javax.swing.SwingWorker; + +class LinkRunner extends SwingWorker { + + private final URI uri; + + LinkRunner(URI u) { + if (u == null) { + throw new NullPointerException(); + } + uri = u; + } + + @Override + protected Void doInBackground() throws Exception { + Desktop desktop = java.awt.Desktop.getDesktop(); + desktop.browse(uri); + return null; + } + + @Override + protected void done() { + try { + get(); + } catch (ExecutionException ee) { + handleException(); + } catch (InterruptedException e) { + handleException(); + Thread.currentThread().interrupt(); + } + } + + private static void handleException() { + JOptionPane.showMessageDialog(null, Messages.getString("AboutDialog.6"), Messages.getString("AboutDialog.19"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ + } +} \ No newline at end of file From 31b3cbd2b757f68678ed6e27a3c2621668322662 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:39 +0100 Subject: [PATCH 1216/1620] New translations LinkRunner.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 85 +++++++++---------- 1 file changed, 38 insertions(+), 47 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 521446a595..c9f18857eb 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,52 +1,43 @@ package org.openforis.collect.earth.app.view; -import java.util.Arrays; - -public enum DataFormat{ - PROJECT_DEFINITION_FILE( - new String[]{"cep"}, Messages.getString("JFileChooserExistsAware.0")), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - ZIP_WITH_XML(new String[]{"zip", "collect-data"},Messages.getString("CollectEarthWindow.48")), //$NON-NLS-1$ //$NON-NLS-2$ - CSV(new String[]{"csv"}, Messages.getString("CollectEarthWindow.38")), //$NON-NLS-1$ //$NON-NLS-2$ - FUSION(new String[]{"csv"}, Messages.getString("CollectEarthWindow.49")), //$NON-NLS-1$ //$NON-NLS-2$ - COLLECT_COORDS(new String[]{"ced", "csv"}, "Collect Earth plots"),//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - KML_FILE(new String[]{"kml"}, "Google Earth Kml File"), //$NON-NLS-1$ //$NON-NLS-2$ - COLLECT_BACKUP(new String[]{"collect-data"}, "Collect Backup"), - SAIKU_ZIP( new String[] {"zip"}, "ZIP Saiku Tool Export" ), - GHGI_ZIP_FILE(new String[]{"zip"}, "IPCC GHGi Tool Package"); //$NON-NLS-1$ //$NON-NLS-2$ - - private String[] fileExtension; - private String description; - - private DataFormat(String[] fileExtension, String description) { - this.fileExtension = fileExtension; - this.description = description; - } - - public String[] getPossibleFileExtensions() { - return fileExtension; - } - - public String getDefaultExtension() { - return fileExtension[0]; - } - - - public String getDescription() { - return description; - } - - public boolean checkFileExtensionMatches( String fileExtensionToCheck){ - for (String ext : fileExtension) { - if( ext.equalsIgnoreCase( fileExtensionToCheck)){ - return true; - } +import java.awt.Desktop; +import java.net.URI; +import java.util.concurrent.ExecutionException; + +import javax.swing.JOptionPane; +import javax.swing.SwingWorker; + +class LinkRunner extends SwingWorker { + + private final URI uri; + + LinkRunner(URI u) { + if (u == null) { + throw new NullPointerException(); + } + uri = u; + } + + @Override + protected Void doInBackground() throws Exception { + Desktop desktop = java.awt.Desktop.getDesktop(); + desktop.browse(uri); + return null; + } + + @Override + protected void done() { + try { + get(); + } catch (ExecutionException ee) { + handleException(); + } catch (InterruptedException e) { + handleException(); + Thread.currentThread().interrupt(); } - return false; - } - - @Override - public String toString() { - return Arrays.toString(fileExtension); - } + } + private static void handleException() { + JOptionPane.showMessageDialog(null, Messages.getString("AboutDialog.6"), Messages.getString("AboutDialog.19"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ + } } \ No newline at end of file From 0af94f741562623ef110b1296f8ad19d4cff4cbf Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:40 +0100 Subject: [PATCH 1217/1620] New translations LinkRunner.java (English) --- .../earth/app/view/Messages_en.properties | 92 ++++++++----------- 1 file changed, 36 insertions(+), 56 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 7c0a5857ae..c9f18857eb 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,63 +1,43 @@ package org.openforis.collect.earth.app.view; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; +import java.awt.Desktop; +import java.net.URI; +import java.util.concurrent.ExecutionException; -import javax.swing.JFrame; import javax.swing.JOptionPane; - -import org.openforis.collect.earth.app.service.ExportType; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class IPCCGeneratorListener implements ActionListener { - private Logger logger = LoggerFactory.getLogger( IPCCGeneratorListener.class); - private JFrame frame; - private GenerateDatabaseStarter ipccExporterStarter; - - public IPCCGeneratorListener(JFrame frame, GenerateDatabaseStarter ipccExporterStarter) { - this.frame = frame; - this.ipccExporterStarter = ipccExporterStarter; - } - - - @Override - public void actionPerformed(ActionEvent e) { - try { - CollectEarthWindow.startWaiting(frame); - generateIpccData(); - }catch (Exception e1) { - logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ - } finally{ - CollectEarthWindow.endWaiting(frame); - } - } - - private void generateIpccData() { - if( ipccExporterStarter.isStarting() ){ - JOptionPane.showMessageDialog(frame, Messages.getString("IPCCGeneratorListener.1"), Messages.getString("IPCCGeneratorListener.2"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ - }else{ - - int shouldRefreshDb = JOptionPane.YES_OPTION; - - if( ipccExporterStarter.shouldShowRdbGenerationOption(ExportType.IPCC) ){ - - String refresh = Messages.getString("IPCCGeneratorListener.3"); //$NON-NLS-1$ - String close = Messages.getString("IPCCGeneratorListener.4"); //$NON-NLS-1$ - String[] options = new String[]{ refresh,close}; - - - shouldRefreshDb = JOptionPane.showOptionDialog( - frame, Messages.getString("IPCCGeneratorListener.6"), //$NON-NLS-1$ - Messages.getString("IPCCGeneratorListener.5"), //$NON-NLS-1$ - JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); - } - - if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ - ipccExporterStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); - ipccExporterStarter.initializeAndOpen( true ); - } +import javax.swing.SwingWorker; + +class LinkRunner extends SwingWorker { + + private final URI uri; + + LinkRunner(URI u) { + if (u == null) { + throw new NullPointerException(); + } + uri = u; + } + + @Override + protected Void doInBackground() throws Exception { + Desktop desktop = java.awt.Desktop.getDesktop(); + desktop.browse(uri); + return null; + } + + @Override + protected void done() { + try { + get(); + } catch (ExecutionException ee) { + handleException(); + } catch (InterruptedException e) { + handleException(); + Thread.currentThread().interrupt(); } - } + } + private static void handleException() { + JOptionPane.showMessageDialog(null, Messages.getString("AboutDialog.6"), Messages.getString("AboutDialog.19"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ + } } \ No newline at end of file From 499d2fa679f2fb3c5fa65992c484e0954160f3d7 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:41 +0100 Subject: [PATCH 1218/1620] New translations MissingPlotsListener.java (French) --- .../earth/app/view/Messages_fr.properties | 257 +++++++++++++++--- 1 file changed, 220 insertions(+), 37 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index c9f18857eb..3ad3d0b623 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,43 +1,226 @@ package org.openforis.collect.earth.app.view; -import java.awt.Desktop; -import java.net.URI; -import java.util.concurrent.ExecutionException; +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.Toolkit; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.StringSelection; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.Map; +import javax.swing.AbstractAction; +import javax.swing.Action; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.SwingWorker; - -class LinkRunner extends SwingWorker { - - private final URI uri; - - LinkRunner(URI u) { - if (u == null) { - throw new NullPointerException(); - } - uri = u; - } - - @Override - protected Void doInBackground() throws Exception { - Desktop desktop = java.awt.Desktop.getDesktop(); - desktop.browse(uri); - return null; - } - - @Override - protected void done() { - try { - get(); - } catch (ExecutionException ee) { - handleException(); - } catch (InterruptedException e) { - handleException(); - Thread.currentThread().interrupt(); +import javax.swing.JPanel; +import javax.swing.JPopupMenu; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.SwingUtilities; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.ad_hoc.FixCoordinates; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.MissingPlotService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public final class MissingPlotsListener implements ActionListener { + + private LocalPropertiesService localPropertiesService; + + private JFrame frame; + + private final Logger logger = LoggerFactory.getLogger(FixCoordinates.class); + + private JTextArea disclaimerTextArea; + + private MissingPlotService missingPlotService; + + public MissingPlotsListener(JFrame frame, LocalPropertiesService localPropertiesService, + MissingPlotService missingPlotService) { + this.frame = frame; + this.localPropertiesService = localPropertiesService; + this.missingPlotService = missingPlotService; + } + + @Override + public void actionPerformed(ActionEvent e) { + + try { + CollectEarthWindow.startWaiting(frame); + findMissingPlots(); + } catch (Exception e1) { + logger.error(Messages.getString("MissingPlotsListener.0"), e1); //$NON-NLS-1$ + } finally { + + CollectEarthWindow.endWaiting(frame); + } + + } + + private void findMissingPlots() { + + showInfoAboutFunctionality(); + + String csvFile = localPropertiesService.getCsvFile(); + File currentFolder = null; + + if (!StringUtils.isBlank(csvFile)) { + File file = new File(csvFile); + if (file.exists()) + currentFolder = file.getParentFile(); + } + + final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults( + DataFormat.COLLECT_COORDS, false, true, null, localPropertiesService, frame, currentFolder); + if( selectedPlotFiles != null && selectedPlotFiles.length > 0 ) { + new Thread("Finding Missing plots") { + @Override + public void run() { + InfiniteProgressMonitor infiniteProgressMonitor = new InfiniteProgressMonitor(frame, + "Finding missing plots", "Please wait..."); + try { + infiniteProgressMonitor.showLater(); + + // Returns the list of all of the plots that are stored in the selected CSV + // files + final Map> allPlotsInFiles = missingPlotService + .getPlotDataByFile(selectedPlotFiles); + + // Returns the list of the plots that are not completely saved or not saved at + // all in the DB + Map> missingPlotData = missingPlotService + .getMissingPlotsByFile(allPlotsInFiles, infiniteProgressMonitor); + // Generates a text representation of the missing plots plus the brief on the + // total plots + String missingPlotsText = missingPlotService.getMissingPlotInformation(allPlotsInFiles, missingPlotData); + // Generates a temporary file that contains the missing plots as a CED + File tempFile = missingPlotService.getMissingPlotFile(missingPlotData); + SwingUtilities.invokeLater( infiniteProgressMonitor::close ); + + JDialog missingDlg = buildDialog(missingPlotsText, tempFile); + + Runnable setVisible =() -> missingDlg.setVisible(true); + SwingUtilities.invokeLater( setVisible ); + } catch (Exception e) { + logger.error("Error while finding missing plots", e); + } finally { + infiniteProgressMonitor.close(); + } + } + }.start(); } - } - private static void handleException() { - JOptionPane.showMessageDialog(null, Messages.getString("AboutDialog.6"), Messages.getString("AboutDialog.19"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ - } -} \ No newline at end of file + } + + private JDialog buildDialog(String missingPlotsText, File tempFile) { + final JDialog dialog = new JDialog(frame, Messages.getString("MissingPlotsListener.1")); //$NON-NLS-1$ + dialog.setLocationRelativeTo(frame); + dialog.setSize(new Dimension(300, 400)); + dialog.setModal(false); + + final BorderLayout layoutManager = new BorderLayout(); + + final JPanel panel = new JPanel(layoutManager); + + dialog.add(panel); + + disclaimerTextArea = new JTextArea(missingPlotsText); + disclaimerTextArea.setEditable(false); + disclaimerTextArea.setLineWrap(true); + disclaimerTextArea.setWrapStyleWord(true); + final JScrollPane scrollPane = new JScrollPane(disclaimerTextArea); + panel.add(scrollPane, BorderLayout.CENTER); + scrollPane.setPreferredSize(new Dimension(250, 250)); + + final JButton close = new JButton(Messages.getString("CollectEarthWindow.5")); //$NON-NLS-1$ + close.addActionListener(e -> dialog.setVisible(false)); + panel.add(close, BorderLayout.SOUTH); + + if (tempFile != null) { + final JButton export = new JButton(Messages.getString(Messages.getString("MissingPlotsListener.6"))); //$NON-NLS-1$ + ActionListener exportListener = getSaveAsListener(tempFile); + export.addActionListener(exportListener); + panel.add(export, BorderLayout.SOUTH); + } + + disclaimerTextArea.addMouseListener(new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + check(e); + } + + @Override + public void mouseReleased(MouseEvent e) { + check(e); + } + + public void check(MouseEvent e) { + if (e.isPopupTrigger()) { // if the event shows the menu + getPopupMenu().show(disclaimerTextArea, e.getPoint().x, e.getPoint().y); + } + } + }); + + return dialog; + } + + private ActionListener getSaveAsListener(File tempFile) { + + return e -> { + final File[] saveToCsvFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, + true, false, "plotsWithMissingInfo.csv", //$NON-NLS-1$ //$NON-NLS-2$ + localPropertiesService, frame); + + if (saveToCsvFile != null && saveToCsvFile.length == 1) { + try { + FileUtils.copyFile(tempFile, saveToCsvFile[0]); + } catch (IOException e1) { + logger.error("Error when copying temporary file with missing plots to final destination " //$NON-NLS-1$ + + tempFile.getAbsolutePath() + " to " + saveToCsvFile[0].getAbsolutePath(), e); //$NON-NLS-1$ + } + } + }; + + } + + public void showInfoAboutFunctionality() { + JOptionPane.showMessageDialog(frame, Messages.getString("MissingPlotsListener.3"), //$NON-NLS-1$ + Messages.getString("MissingPlotsListener.4"), //$NON-NLS-1$ + JOptionPane.INFORMATION_MESSAGE); + } + + private JPopupMenu getPopupMenu() { + Action copyAction = new AbstractAction(Messages.getString("MissingPlotsListener.2")) { //$NON-NLS-1$ + + private static final long serialVersionUID = 1L; + + @Override + public void actionPerformed(ActionEvent e) { + disclaimerTextArea.selectAll(); + String selection = disclaimerTextArea.getSelectedText(); + Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); + if (selection == null) { + return; + } + StringSelection clipString = new StringSelection(selection); + clipboard.setContents(clipString, clipString); + } + }; + + JPopupMenu popup = new JPopupMenu(); + popup.add(copyAction); + return popup; + } + +} From 69dd5b3494151d3da8a9a2e1b2c6071608138ba2 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:42 +0100 Subject: [PATCH 1219/1620] New translations MissingPlotsListener.java (Spanish) --- .../earth/app/view/Messages_es.properties | 257 +++++++++++++++--- 1 file changed, 220 insertions(+), 37 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index c9f18857eb..3ad3d0b623 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,43 +1,226 @@ package org.openforis.collect.earth.app.view; -import java.awt.Desktop; -import java.net.URI; -import java.util.concurrent.ExecutionException; +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.Toolkit; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.StringSelection; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.Map; +import javax.swing.AbstractAction; +import javax.swing.Action; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.SwingWorker; - -class LinkRunner extends SwingWorker { - - private final URI uri; - - LinkRunner(URI u) { - if (u == null) { - throw new NullPointerException(); - } - uri = u; - } - - @Override - protected Void doInBackground() throws Exception { - Desktop desktop = java.awt.Desktop.getDesktop(); - desktop.browse(uri); - return null; - } - - @Override - protected void done() { - try { - get(); - } catch (ExecutionException ee) { - handleException(); - } catch (InterruptedException e) { - handleException(); - Thread.currentThread().interrupt(); +import javax.swing.JPanel; +import javax.swing.JPopupMenu; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.SwingUtilities; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.ad_hoc.FixCoordinates; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.MissingPlotService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public final class MissingPlotsListener implements ActionListener { + + private LocalPropertiesService localPropertiesService; + + private JFrame frame; + + private final Logger logger = LoggerFactory.getLogger(FixCoordinates.class); + + private JTextArea disclaimerTextArea; + + private MissingPlotService missingPlotService; + + public MissingPlotsListener(JFrame frame, LocalPropertiesService localPropertiesService, + MissingPlotService missingPlotService) { + this.frame = frame; + this.localPropertiesService = localPropertiesService; + this.missingPlotService = missingPlotService; + } + + @Override + public void actionPerformed(ActionEvent e) { + + try { + CollectEarthWindow.startWaiting(frame); + findMissingPlots(); + } catch (Exception e1) { + logger.error(Messages.getString("MissingPlotsListener.0"), e1); //$NON-NLS-1$ + } finally { + + CollectEarthWindow.endWaiting(frame); + } + + } + + private void findMissingPlots() { + + showInfoAboutFunctionality(); + + String csvFile = localPropertiesService.getCsvFile(); + File currentFolder = null; + + if (!StringUtils.isBlank(csvFile)) { + File file = new File(csvFile); + if (file.exists()) + currentFolder = file.getParentFile(); + } + + final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults( + DataFormat.COLLECT_COORDS, false, true, null, localPropertiesService, frame, currentFolder); + if( selectedPlotFiles != null && selectedPlotFiles.length > 0 ) { + new Thread("Finding Missing plots") { + @Override + public void run() { + InfiniteProgressMonitor infiniteProgressMonitor = new InfiniteProgressMonitor(frame, + "Finding missing plots", "Please wait..."); + try { + infiniteProgressMonitor.showLater(); + + // Returns the list of all of the plots that are stored in the selected CSV + // files + final Map> allPlotsInFiles = missingPlotService + .getPlotDataByFile(selectedPlotFiles); + + // Returns the list of the plots that are not completely saved or not saved at + // all in the DB + Map> missingPlotData = missingPlotService + .getMissingPlotsByFile(allPlotsInFiles, infiniteProgressMonitor); + // Generates a text representation of the missing plots plus the brief on the + // total plots + String missingPlotsText = missingPlotService.getMissingPlotInformation(allPlotsInFiles, missingPlotData); + // Generates a temporary file that contains the missing plots as a CED + File tempFile = missingPlotService.getMissingPlotFile(missingPlotData); + SwingUtilities.invokeLater( infiniteProgressMonitor::close ); + + JDialog missingDlg = buildDialog(missingPlotsText, tempFile); + + Runnable setVisible =() -> missingDlg.setVisible(true); + SwingUtilities.invokeLater( setVisible ); + } catch (Exception e) { + logger.error("Error while finding missing plots", e); + } finally { + infiniteProgressMonitor.close(); + } + } + }.start(); } - } - private static void handleException() { - JOptionPane.showMessageDialog(null, Messages.getString("AboutDialog.6"), Messages.getString("AboutDialog.19"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ - } -} \ No newline at end of file + } + + private JDialog buildDialog(String missingPlotsText, File tempFile) { + final JDialog dialog = new JDialog(frame, Messages.getString("MissingPlotsListener.1")); //$NON-NLS-1$ + dialog.setLocationRelativeTo(frame); + dialog.setSize(new Dimension(300, 400)); + dialog.setModal(false); + + final BorderLayout layoutManager = new BorderLayout(); + + final JPanel panel = new JPanel(layoutManager); + + dialog.add(panel); + + disclaimerTextArea = new JTextArea(missingPlotsText); + disclaimerTextArea.setEditable(false); + disclaimerTextArea.setLineWrap(true); + disclaimerTextArea.setWrapStyleWord(true); + final JScrollPane scrollPane = new JScrollPane(disclaimerTextArea); + panel.add(scrollPane, BorderLayout.CENTER); + scrollPane.setPreferredSize(new Dimension(250, 250)); + + final JButton close = new JButton(Messages.getString("CollectEarthWindow.5")); //$NON-NLS-1$ + close.addActionListener(e -> dialog.setVisible(false)); + panel.add(close, BorderLayout.SOUTH); + + if (tempFile != null) { + final JButton export = new JButton(Messages.getString(Messages.getString("MissingPlotsListener.6"))); //$NON-NLS-1$ + ActionListener exportListener = getSaveAsListener(tempFile); + export.addActionListener(exportListener); + panel.add(export, BorderLayout.SOUTH); + } + + disclaimerTextArea.addMouseListener(new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + check(e); + } + + @Override + public void mouseReleased(MouseEvent e) { + check(e); + } + + public void check(MouseEvent e) { + if (e.isPopupTrigger()) { // if the event shows the menu + getPopupMenu().show(disclaimerTextArea, e.getPoint().x, e.getPoint().y); + } + } + }); + + return dialog; + } + + private ActionListener getSaveAsListener(File tempFile) { + + return e -> { + final File[] saveToCsvFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, + true, false, "plotsWithMissingInfo.csv", //$NON-NLS-1$ //$NON-NLS-2$ + localPropertiesService, frame); + + if (saveToCsvFile != null && saveToCsvFile.length == 1) { + try { + FileUtils.copyFile(tempFile, saveToCsvFile[0]); + } catch (IOException e1) { + logger.error("Error when copying temporary file with missing plots to final destination " //$NON-NLS-1$ + + tempFile.getAbsolutePath() + " to " + saveToCsvFile[0].getAbsolutePath(), e); //$NON-NLS-1$ + } + } + }; + + } + + public void showInfoAboutFunctionality() { + JOptionPane.showMessageDialog(frame, Messages.getString("MissingPlotsListener.3"), //$NON-NLS-1$ + Messages.getString("MissingPlotsListener.4"), //$NON-NLS-1$ + JOptionPane.INFORMATION_MESSAGE); + } + + private JPopupMenu getPopupMenu() { + Action copyAction = new AbstractAction(Messages.getString("MissingPlotsListener.2")) { //$NON-NLS-1$ + + private static final long serialVersionUID = 1L; + + @Override + public void actionPerformed(ActionEvent e) { + disclaimerTextArea.selectAll(); + String selection = disclaimerTextArea.getSelectedText(); + Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); + if (selection == null) { + return; + } + StringSelection clipString = new StringSelection(selection); + clipboard.setContents(clipString, clipString); + } + }; + + JPopupMenu popup = new JPopupMenu(); + popup.add(copyAction); + return popup; + } + +} From 29a825150639b6645c1bcc20da993463df14a11e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:43 +0100 Subject: [PATCH 1220/1620] New translations MissingPlotsListener.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 257 +++++++++++++++--- 1 file changed, 220 insertions(+), 37 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index c9f18857eb..3ad3d0b623 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,43 +1,226 @@ package org.openforis.collect.earth.app.view; -import java.awt.Desktop; -import java.net.URI; -import java.util.concurrent.ExecutionException; +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.Toolkit; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.StringSelection; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.Map; +import javax.swing.AbstractAction; +import javax.swing.Action; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.SwingWorker; - -class LinkRunner extends SwingWorker { - - private final URI uri; - - LinkRunner(URI u) { - if (u == null) { - throw new NullPointerException(); - } - uri = u; - } - - @Override - protected Void doInBackground() throws Exception { - Desktop desktop = java.awt.Desktop.getDesktop(); - desktop.browse(uri); - return null; - } - - @Override - protected void done() { - try { - get(); - } catch (ExecutionException ee) { - handleException(); - } catch (InterruptedException e) { - handleException(); - Thread.currentThread().interrupt(); +import javax.swing.JPanel; +import javax.swing.JPopupMenu; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.SwingUtilities; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.ad_hoc.FixCoordinates; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.MissingPlotService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public final class MissingPlotsListener implements ActionListener { + + private LocalPropertiesService localPropertiesService; + + private JFrame frame; + + private final Logger logger = LoggerFactory.getLogger(FixCoordinates.class); + + private JTextArea disclaimerTextArea; + + private MissingPlotService missingPlotService; + + public MissingPlotsListener(JFrame frame, LocalPropertiesService localPropertiesService, + MissingPlotService missingPlotService) { + this.frame = frame; + this.localPropertiesService = localPropertiesService; + this.missingPlotService = missingPlotService; + } + + @Override + public void actionPerformed(ActionEvent e) { + + try { + CollectEarthWindow.startWaiting(frame); + findMissingPlots(); + } catch (Exception e1) { + logger.error(Messages.getString("MissingPlotsListener.0"), e1); //$NON-NLS-1$ + } finally { + + CollectEarthWindow.endWaiting(frame); + } + + } + + private void findMissingPlots() { + + showInfoAboutFunctionality(); + + String csvFile = localPropertiesService.getCsvFile(); + File currentFolder = null; + + if (!StringUtils.isBlank(csvFile)) { + File file = new File(csvFile); + if (file.exists()) + currentFolder = file.getParentFile(); + } + + final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults( + DataFormat.COLLECT_COORDS, false, true, null, localPropertiesService, frame, currentFolder); + if( selectedPlotFiles != null && selectedPlotFiles.length > 0 ) { + new Thread("Finding Missing plots") { + @Override + public void run() { + InfiniteProgressMonitor infiniteProgressMonitor = new InfiniteProgressMonitor(frame, + "Finding missing plots", "Please wait..."); + try { + infiniteProgressMonitor.showLater(); + + // Returns the list of all of the plots that are stored in the selected CSV + // files + final Map> allPlotsInFiles = missingPlotService + .getPlotDataByFile(selectedPlotFiles); + + // Returns the list of the plots that are not completely saved or not saved at + // all in the DB + Map> missingPlotData = missingPlotService + .getMissingPlotsByFile(allPlotsInFiles, infiniteProgressMonitor); + // Generates a text representation of the missing plots plus the brief on the + // total plots + String missingPlotsText = missingPlotService.getMissingPlotInformation(allPlotsInFiles, missingPlotData); + // Generates a temporary file that contains the missing plots as a CED + File tempFile = missingPlotService.getMissingPlotFile(missingPlotData); + SwingUtilities.invokeLater( infiniteProgressMonitor::close ); + + JDialog missingDlg = buildDialog(missingPlotsText, tempFile); + + Runnable setVisible =() -> missingDlg.setVisible(true); + SwingUtilities.invokeLater( setVisible ); + } catch (Exception e) { + logger.error("Error while finding missing plots", e); + } finally { + infiniteProgressMonitor.close(); + } + } + }.start(); } - } - private static void handleException() { - JOptionPane.showMessageDialog(null, Messages.getString("AboutDialog.6"), Messages.getString("AboutDialog.19"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ - } -} \ No newline at end of file + } + + private JDialog buildDialog(String missingPlotsText, File tempFile) { + final JDialog dialog = new JDialog(frame, Messages.getString("MissingPlotsListener.1")); //$NON-NLS-1$ + dialog.setLocationRelativeTo(frame); + dialog.setSize(new Dimension(300, 400)); + dialog.setModal(false); + + final BorderLayout layoutManager = new BorderLayout(); + + final JPanel panel = new JPanel(layoutManager); + + dialog.add(panel); + + disclaimerTextArea = new JTextArea(missingPlotsText); + disclaimerTextArea.setEditable(false); + disclaimerTextArea.setLineWrap(true); + disclaimerTextArea.setWrapStyleWord(true); + final JScrollPane scrollPane = new JScrollPane(disclaimerTextArea); + panel.add(scrollPane, BorderLayout.CENTER); + scrollPane.setPreferredSize(new Dimension(250, 250)); + + final JButton close = new JButton(Messages.getString("CollectEarthWindow.5")); //$NON-NLS-1$ + close.addActionListener(e -> dialog.setVisible(false)); + panel.add(close, BorderLayout.SOUTH); + + if (tempFile != null) { + final JButton export = new JButton(Messages.getString(Messages.getString("MissingPlotsListener.6"))); //$NON-NLS-1$ + ActionListener exportListener = getSaveAsListener(tempFile); + export.addActionListener(exportListener); + panel.add(export, BorderLayout.SOUTH); + } + + disclaimerTextArea.addMouseListener(new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + check(e); + } + + @Override + public void mouseReleased(MouseEvent e) { + check(e); + } + + public void check(MouseEvent e) { + if (e.isPopupTrigger()) { // if the event shows the menu + getPopupMenu().show(disclaimerTextArea, e.getPoint().x, e.getPoint().y); + } + } + }); + + return dialog; + } + + private ActionListener getSaveAsListener(File tempFile) { + + return e -> { + final File[] saveToCsvFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, + true, false, "plotsWithMissingInfo.csv", //$NON-NLS-1$ //$NON-NLS-2$ + localPropertiesService, frame); + + if (saveToCsvFile != null && saveToCsvFile.length == 1) { + try { + FileUtils.copyFile(tempFile, saveToCsvFile[0]); + } catch (IOException e1) { + logger.error("Error when copying temporary file with missing plots to final destination " //$NON-NLS-1$ + + tempFile.getAbsolutePath() + " to " + saveToCsvFile[0].getAbsolutePath(), e); //$NON-NLS-1$ + } + } + }; + + } + + public void showInfoAboutFunctionality() { + JOptionPane.showMessageDialog(frame, Messages.getString("MissingPlotsListener.3"), //$NON-NLS-1$ + Messages.getString("MissingPlotsListener.4"), //$NON-NLS-1$ + JOptionPane.INFORMATION_MESSAGE); + } + + private JPopupMenu getPopupMenu() { + Action copyAction = new AbstractAction(Messages.getString("MissingPlotsListener.2")) { //$NON-NLS-1$ + + private static final long serialVersionUID = 1L; + + @Override + public void actionPerformed(ActionEvent e) { + disclaimerTextArea.selectAll(); + String selection = disclaimerTextArea.getSelectedText(); + Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); + if (selection == null) { + return; + } + StringSelection clipString = new StringSelection(selection); + clipboard.setContents(clipString, clipString); + } + }; + + JPopupMenu popup = new JPopupMenu(); + popup.add(copyAction); + return popup; + } + +} From d50bed4261d07e7ad1bdffff4d85301f0be7c95a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:44 +0100 Subject: [PATCH 1221/1620] New translations MissingPlotsListener.java (English) --- .../earth/app/view/Messages_en.properties | 257 +++++++++++++++--- 1 file changed, 220 insertions(+), 37 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index c9f18857eb..3ad3d0b623 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,43 +1,226 @@ package org.openforis.collect.earth.app.view; -import java.awt.Desktop; -import java.net.URI; -import java.util.concurrent.ExecutionException; +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.Toolkit; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.StringSelection; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.Map; +import javax.swing.AbstractAction; +import javax.swing.Action; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.SwingWorker; - -class LinkRunner extends SwingWorker { - - private final URI uri; - - LinkRunner(URI u) { - if (u == null) { - throw new NullPointerException(); - } - uri = u; - } - - @Override - protected Void doInBackground() throws Exception { - Desktop desktop = java.awt.Desktop.getDesktop(); - desktop.browse(uri); - return null; - } - - @Override - protected void done() { - try { - get(); - } catch (ExecutionException ee) { - handleException(); - } catch (InterruptedException e) { - handleException(); - Thread.currentThread().interrupt(); +import javax.swing.JPanel; +import javax.swing.JPopupMenu; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.SwingUtilities; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.ad_hoc.FixCoordinates; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.MissingPlotService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public final class MissingPlotsListener implements ActionListener { + + private LocalPropertiesService localPropertiesService; + + private JFrame frame; + + private final Logger logger = LoggerFactory.getLogger(FixCoordinates.class); + + private JTextArea disclaimerTextArea; + + private MissingPlotService missingPlotService; + + public MissingPlotsListener(JFrame frame, LocalPropertiesService localPropertiesService, + MissingPlotService missingPlotService) { + this.frame = frame; + this.localPropertiesService = localPropertiesService; + this.missingPlotService = missingPlotService; + } + + @Override + public void actionPerformed(ActionEvent e) { + + try { + CollectEarthWindow.startWaiting(frame); + findMissingPlots(); + } catch (Exception e1) { + logger.error(Messages.getString("MissingPlotsListener.0"), e1); //$NON-NLS-1$ + } finally { + + CollectEarthWindow.endWaiting(frame); + } + + } + + private void findMissingPlots() { + + showInfoAboutFunctionality(); + + String csvFile = localPropertiesService.getCsvFile(); + File currentFolder = null; + + if (!StringUtils.isBlank(csvFile)) { + File file = new File(csvFile); + if (file.exists()) + currentFolder = file.getParentFile(); + } + + final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults( + DataFormat.COLLECT_COORDS, false, true, null, localPropertiesService, frame, currentFolder); + if( selectedPlotFiles != null && selectedPlotFiles.length > 0 ) { + new Thread("Finding Missing plots") { + @Override + public void run() { + InfiniteProgressMonitor infiniteProgressMonitor = new InfiniteProgressMonitor(frame, + "Finding missing plots", "Please wait..."); + try { + infiniteProgressMonitor.showLater(); + + // Returns the list of all of the plots that are stored in the selected CSV + // files + final Map> allPlotsInFiles = missingPlotService + .getPlotDataByFile(selectedPlotFiles); + + // Returns the list of the plots that are not completely saved or not saved at + // all in the DB + Map> missingPlotData = missingPlotService + .getMissingPlotsByFile(allPlotsInFiles, infiniteProgressMonitor); + // Generates a text representation of the missing plots plus the brief on the + // total plots + String missingPlotsText = missingPlotService.getMissingPlotInformation(allPlotsInFiles, missingPlotData); + // Generates a temporary file that contains the missing plots as a CED + File tempFile = missingPlotService.getMissingPlotFile(missingPlotData); + SwingUtilities.invokeLater( infiniteProgressMonitor::close ); + + JDialog missingDlg = buildDialog(missingPlotsText, tempFile); + + Runnable setVisible =() -> missingDlg.setVisible(true); + SwingUtilities.invokeLater( setVisible ); + } catch (Exception e) { + logger.error("Error while finding missing plots", e); + } finally { + infiniteProgressMonitor.close(); + } + } + }.start(); } - } - private static void handleException() { - JOptionPane.showMessageDialog(null, Messages.getString("AboutDialog.6"), Messages.getString("AboutDialog.19"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ - } -} \ No newline at end of file + } + + private JDialog buildDialog(String missingPlotsText, File tempFile) { + final JDialog dialog = new JDialog(frame, Messages.getString("MissingPlotsListener.1")); //$NON-NLS-1$ + dialog.setLocationRelativeTo(frame); + dialog.setSize(new Dimension(300, 400)); + dialog.setModal(false); + + final BorderLayout layoutManager = new BorderLayout(); + + final JPanel panel = new JPanel(layoutManager); + + dialog.add(panel); + + disclaimerTextArea = new JTextArea(missingPlotsText); + disclaimerTextArea.setEditable(false); + disclaimerTextArea.setLineWrap(true); + disclaimerTextArea.setWrapStyleWord(true); + final JScrollPane scrollPane = new JScrollPane(disclaimerTextArea); + panel.add(scrollPane, BorderLayout.CENTER); + scrollPane.setPreferredSize(new Dimension(250, 250)); + + final JButton close = new JButton(Messages.getString("CollectEarthWindow.5")); //$NON-NLS-1$ + close.addActionListener(e -> dialog.setVisible(false)); + panel.add(close, BorderLayout.SOUTH); + + if (tempFile != null) { + final JButton export = new JButton(Messages.getString(Messages.getString("MissingPlotsListener.6"))); //$NON-NLS-1$ + ActionListener exportListener = getSaveAsListener(tempFile); + export.addActionListener(exportListener); + panel.add(export, BorderLayout.SOUTH); + } + + disclaimerTextArea.addMouseListener(new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + check(e); + } + + @Override + public void mouseReleased(MouseEvent e) { + check(e); + } + + public void check(MouseEvent e) { + if (e.isPopupTrigger()) { // if the event shows the menu + getPopupMenu().show(disclaimerTextArea, e.getPoint().x, e.getPoint().y); + } + } + }); + + return dialog; + } + + private ActionListener getSaveAsListener(File tempFile) { + + return e -> { + final File[] saveToCsvFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, + true, false, "plotsWithMissingInfo.csv", //$NON-NLS-1$ //$NON-NLS-2$ + localPropertiesService, frame); + + if (saveToCsvFile != null && saveToCsvFile.length == 1) { + try { + FileUtils.copyFile(tempFile, saveToCsvFile[0]); + } catch (IOException e1) { + logger.error("Error when copying temporary file with missing plots to final destination " //$NON-NLS-1$ + + tempFile.getAbsolutePath() + " to " + saveToCsvFile[0].getAbsolutePath(), e); //$NON-NLS-1$ + } + } + }; + + } + + public void showInfoAboutFunctionality() { + JOptionPane.showMessageDialog(frame, Messages.getString("MissingPlotsListener.3"), //$NON-NLS-1$ + Messages.getString("MissingPlotsListener.4"), //$NON-NLS-1$ + JOptionPane.INFORMATION_MESSAGE); + } + + private JPopupMenu getPopupMenu() { + Action copyAction = new AbstractAction(Messages.getString("MissingPlotsListener.2")) { //$NON-NLS-1$ + + private static final long serialVersionUID = 1L; + + @Override + public void actionPerformed(ActionEvent e) { + disclaimerTextArea.selectAll(); + String selection = disclaimerTextArea.getSelectedText(); + Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); + if (selection == null) { + return; + } + StringSelection clipString = new StringSelection(selection); + clipboard.setContents(clipString, clipString); + } + }; + + JPopupMenu popup = new JPopupMenu(); + popup.add(copyAction); + return popup; + } + +} From e41c4bf9d4f9f53213c22fd18a4d7f9ed3f0c30b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:46 +0100 Subject: [PATCH 1222/1620] New translations OpenAboutDialogListener.java (French) --- .../earth/app/view/Messages_fr.properties | 225 +----------------- 1 file changed, 13 insertions(+), 212 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 3ad3d0b623..2f8596c07f 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,226 +1,27 @@ package org.openforis.collect.earth.app.view; -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.Toolkit; -import java.awt.datatransfer.Clipboard; -import java.awt.datatransfer.StringSelection; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.io.File; -import java.io.IOException; -import java.util.List; -import java.util.Map; -import javax.swing.AbstractAction; -import javax.swing.Action; -import javax.swing.JButton; -import javax.swing.JDialog; import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JPopupMenu; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; -import javax.swing.SwingUtilities; -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.ad_hoc.FixCoordinates; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.MissingPlotService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +public class OpenAboutDialogListener implements ActionListener{ -public final class MissingPlotsListener implements ActionListener { - - private LocalPropertiesService localPropertiesService; - - private JFrame frame; - - private final Logger logger = LoggerFactory.getLogger(FixCoordinates.class); - - private JTextArea disclaimerTextArea; - - private MissingPlotService missingPlotService; - - public MissingPlotsListener(JFrame frame, LocalPropertiesService localPropertiesService, - MissingPlotService missingPlotService) { - this.frame = frame; - this.localPropertiesService = localPropertiesService; - this.missingPlotService = missingPlotService; + JFrame parent; + String title; + + public OpenAboutDialogListener(JFrame parentFrame, String title) { + this.parent = parentFrame; + this.title = title; } - + @Override public void actionPerformed(ActionEvent e) { - - try { - CollectEarthWindow.startWaiting(frame); - findMissingPlots(); - } catch (Exception e1) { - logger.error(Messages.getString("MissingPlotsListener.0"), e1); //$NON-NLS-1$ - } finally { - - CollectEarthWindow.endWaiting(frame); - } - - } - - private void findMissingPlots() { - - showInfoAboutFunctionality(); - - String csvFile = localPropertiesService.getCsvFile(); - File currentFolder = null; - - if (!StringUtils.isBlank(csvFile)) { - File file = new File(csvFile); - if (file.exists()) - currentFolder = file.getParentFile(); - } - - final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults( - DataFormat.COLLECT_COORDS, false, true, null, localPropertiesService, frame, currentFolder); - if( selectedPlotFiles != null && selectedPlotFiles.length > 0 ) { - new Thread("Finding Missing plots") { - @Override - public void run() { - InfiniteProgressMonitor infiniteProgressMonitor = new InfiniteProgressMonitor(frame, - "Finding missing plots", "Please wait..."); - try { - infiniteProgressMonitor.showLater(); - - // Returns the list of all of the plots that are stored in the selected CSV - // files - final Map> allPlotsInFiles = missingPlotService - .getPlotDataByFile(selectedPlotFiles); - - // Returns the list of the plots that are not completely saved or not saved at - // all in the DB - Map> missingPlotData = missingPlotService - .getMissingPlotsByFile(allPlotsInFiles, infiniteProgressMonitor); - // Generates a text representation of the missing plots plus the brief on the - // total plots - String missingPlotsText = missingPlotService.getMissingPlotInformation(allPlotsInFiles, missingPlotData); - // Generates a temporary file that contains the missing plots as a CED - File tempFile = missingPlotService.getMissingPlotFile(missingPlotData); - SwingUtilities.invokeLater( infiniteProgressMonitor::close ); - - JDialog missingDlg = buildDialog(missingPlotsText, tempFile); - - Runnable setVisible =() -> missingDlg.setVisible(true); - SwingUtilities.invokeLater( setVisible ); - } catch (Exception e) { - logger.error("Error while finding missing plots", e); - } finally { - infiniteProgressMonitor.close(); - } - } - }.start(); - } - - } - - private JDialog buildDialog(String missingPlotsText, File tempFile) { - final JDialog dialog = new JDialog(frame, Messages.getString("MissingPlotsListener.1")); //$NON-NLS-1$ - dialog.setLocationRelativeTo(frame); - dialog.setSize(new Dimension(300, 400)); - dialog.setModal(false); - - final BorderLayout layoutManager = new BorderLayout(); - - final JPanel panel = new JPanel(layoutManager); - - dialog.add(panel); - - disclaimerTextArea = new JTextArea(missingPlotsText); - disclaimerTextArea.setEditable(false); - disclaimerTextArea.setLineWrap(true); - disclaimerTextArea.setWrapStyleWord(true); - final JScrollPane scrollPane = new JScrollPane(disclaimerTextArea); - panel.add(scrollPane, BorderLayout.CENTER); - scrollPane.setPreferredSize(new Dimension(250, 250)); - - final JButton close = new JButton(Messages.getString("CollectEarthWindow.5")); //$NON-NLS-1$ - close.addActionListener(e -> dialog.setVisible(false)); - panel.add(close, BorderLayout.SOUTH); - - if (tempFile != null) { - final JButton export = new JButton(Messages.getString(Messages.getString("MissingPlotsListener.6"))); //$NON-NLS-1$ - ActionListener exportListener = getSaveAsListener(tempFile); - export.addActionListener(exportListener); - panel.add(export, BorderLayout.SOUTH); - } - - disclaimerTextArea.addMouseListener(new MouseAdapter() { - @Override - public void mousePressed(MouseEvent e) { - check(e); - } - - @Override - public void mouseReleased(MouseEvent e) { - check(e); - } - - public void check(MouseEvent e) { - if (e.isPopupTrigger()) { // if the event shows the menu - getPopupMenu().show(disclaimerTextArea, e.getPoint().x, e.getPoint().y); - } - } - }); - - return dialog; - } - - private ActionListener getSaveAsListener(File tempFile) { - - return e -> { - final File[] saveToCsvFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, - true, false, "plotsWithMissingInfo.csv", //$NON-NLS-1$ //$NON-NLS-2$ - localPropertiesService, frame); - - if (saveToCsvFile != null && saveToCsvFile.length == 1) { - try { - FileUtils.copyFile(tempFile, saveToCsvFile[0]); - } catch (IOException e1) { - logger.error("Error when copying temporary file with missing plots to final destination " //$NON-NLS-1$ - + tempFile.getAbsolutePath() + " to " + saveToCsvFile[0].getAbsolutePath(), e); //$NON-NLS-1$ - } - } - }; - - } - - public void showInfoAboutFunctionality() { - JOptionPane.showMessageDialog(frame, Messages.getString("MissingPlotsListener.3"), //$NON-NLS-1$ - Messages.getString("MissingPlotsListener.4"), //$NON-NLS-1$ - JOptionPane.INFORMATION_MESSAGE); - } - - private JPopupMenu getPopupMenu() { - Action copyAction = new AbstractAction(Messages.getString("MissingPlotsListener.2")) { //$NON-NLS-1$ - - private static final long serialVersionUID = 1L; - - @Override - public void actionPerformed(ActionEvent e) { - disclaimerTextArea.selectAll(); - String selection = disclaimerTextArea.getSelectedText(); - Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); - if (selection == null) { - return; - } - StringSelection clipString = new StringSelection(selection); - clipboard.setContents(clipString, clipString); - } - }; - - JPopupMenu popup = new JPopupMenu(); - popup.add(copyAction); - return popup; + AboutDialog aboutDialog = new AboutDialog(parent, title); + aboutDialog.setLocationRelativeTo(parent); + + aboutDialog.setModal(true); + aboutDialog.setVisible(true); } } From 183d650d27592e7ff0bb9bf1953ca227001a7430 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:47 +0100 Subject: [PATCH 1223/1620] New translations OpenAboutDialogListener.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 225 +----------------- 1 file changed, 13 insertions(+), 212 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 3ad3d0b623..2f8596c07f 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,226 +1,27 @@ package org.openforis.collect.earth.app.view; -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.Toolkit; -import java.awt.datatransfer.Clipboard; -import java.awt.datatransfer.StringSelection; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.io.File; -import java.io.IOException; -import java.util.List; -import java.util.Map; -import javax.swing.AbstractAction; -import javax.swing.Action; -import javax.swing.JButton; -import javax.swing.JDialog; import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JPopupMenu; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; -import javax.swing.SwingUtilities; -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.ad_hoc.FixCoordinates; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.MissingPlotService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +public class OpenAboutDialogListener implements ActionListener{ -public final class MissingPlotsListener implements ActionListener { - - private LocalPropertiesService localPropertiesService; - - private JFrame frame; - - private final Logger logger = LoggerFactory.getLogger(FixCoordinates.class); - - private JTextArea disclaimerTextArea; - - private MissingPlotService missingPlotService; - - public MissingPlotsListener(JFrame frame, LocalPropertiesService localPropertiesService, - MissingPlotService missingPlotService) { - this.frame = frame; - this.localPropertiesService = localPropertiesService; - this.missingPlotService = missingPlotService; + JFrame parent; + String title; + + public OpenAboutDialogListener(JFrame parentFrame, String title) { + this.parent = parentFrame; + this.title = title; } - + @Override public void actionPerformed(ActionEvent e) { - - try { - CollectEarthWindow.startWaiting(frame); - findMissingPlots(); - } catch (Exception e1) { - logger.error(Messages.getString("MissingPlotsListener.0"), e1); //$NON-NLS-1$ - } finally { - - CollectEarthWindow.endWaiting(frame); - } - - } - - private void findMissingPlots() { - - showInfoAboutFunctionality(); - - String csvFile = localPropertiesService.getCsvFile(); - File currentFolder = null; - - if (!StringUtils.isBlank(csvFile)) { - File file = new File(csvFile); - if (file.exists()) - currentFolder = file.getParentFile(); - } - - final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults( - DataFormat.COLLECT_COORDS, false, true, null, localPropertiesService, frame, currentFolder); - if( selectedPlotFiles != null && selectedPlotFiles.length > 0 ) { - new Thread("Finding Missing plots") { - @Override - public void run() { - InfiniteProgressMonitor infiniteProgressMonitor = new InfiniteProgressMonitor(frame, - "Finding missing plots", "Please wait..."); - try { - infiniteProgressMonitor.showLater(); - - // Returns the list of all of the plots that are stored in the selected CSV - // files - final Map> allPlotsInFiles = missingPlotService - .getPlotDataByFile(selectedPlotFiles); - - // Returns the list of the plots that are not completely saved or not saved at - // all in the DB - Map> missingPlotData = missingPlotService - .getMissingPlotsByFile(allPlotsInFiles, infiniteProgressMonitor); - // Generates a text representation of the missing plots plus the brief on the - // total plots - String missingPlotsText = missingPlotService.getMissingPlotInformation(allPlotsInFiles, missingPlotData); - // Generates a temporary file that contains the missing plots as a CED - File tempFile = missingPlotService.getMissingPlotFile(missingPlotData); - SwingUtilities.invokeLater( infiniteProgressMonitor::close ); - - JDialog missingDlg = buildDialog(missingPlotsText, tempFile); - - Runnable setVisible =() -> missingDlg.setVisible(true); - SwingUtilities.invokeLater( setVisible ); - } catch (Exception e) { - logger.error("Error while finding missing plots", e); - } finally { - infiniteProgressMonitor.close(); - } - } - }.start(); - } - - } - - private JDialog buildDialog(String missingPlotsText, File tempFile) { - final JDialog dialog = new JDialog(frame, Messages.getString("MissingPlotsListener.1")); //$NON-NLS-1$ - dialog.setLocationRelativeTo(frame); - dialog.setSize(new Dimension(300, 400)); - dialog.setModal(false); - - final BorderLayout layoutManager = new BorderLayout(); - - final JPanel panel = new JPanel(layoutManager); - - dialog.add(panel); - - disclaimerTextArea = new JTextArea(missingPlotsText); - disclaimerTextArea.setEditable(false); - disclaimerTextArea.setLineWrap(true); - disclaimerTextArea.setWrapStyleWord(true); - final JScrollPane scrollPane = new JScrollPane(disclaimerTextArea); - panel.add(scrollPane, BorderLayout.CENTER); - scrollPane.setPreferredSize(new Dimension(250, 250)); - - final JButton close = new JButton(Messages.getString("CollectEarthWindow.5")); //$NON-NLS-1$ - close.addActionListener(e -> dialog.setVisible(false)); - panel.add(close, BorderLayout.SOUTH); - - if (tempFile != null) { - final JButton export = new JButton(Messages.getString(Messages.getString("MissingPlotsListener.6"))); //$NON-NLS-1$ - ActionListener exportListener = getSaveAsListener(tempFile); - export.addActionListener(exportListener); - panel.add(export, BorderLayout.SOUTH); - } - - disclaimerTextArea.addMouseListener(new MouseAdapter() { - @Override - public void mousePressed(MouseEvent e) { - check(e); - } - - @Override - public void mouseReleased(MouseEvent e) { - check(e); - } - - public void check(MouseEvent e) { - if (e.isPopupTrigger()) { // if the event shows the menu - getPopupMenu().show(disclaimerTextArea, e.getPoint().x, e.getPoint().y); - } - } - }); - - return dialog; - } - - private ActionListener getSaveAsListener(File tempFile) { - - return e -> { - final File[] saveToCsvFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, - true, false, "plotsWithMissingInfo.csv", //$NON-NLS-1$ //$NON-NLS-2$ - localPropertiesService, frame); - - if (saveToCsvFile != null && saveToCsvFile.length == 1) { - try { - FileUtils.copyFile(tempFile, saveToCsvFile[0]); - } catch (IOException e1) { - logger.error("Error when copying temporary file with missing plots to final destination " //$NON-NLS-1$ - + tempFile.getAbsolutePath() + " to " + saveToCsvFile[0].getAbsolutePath(), e); //$NON-NLS-1$ - } - } - }; - - } - - public void showInfoAboutFunctionality() { - JOptionPane.showMessageDialog(frame, Messages.getString("MissingPlotsListener.3"), //$NON-NLS-1$ - Messages.getString("MissingPlotsListener.4"), //$NON-NLS-1$ - JOptionPane.INFORMATION_MESSAGE); - } - - private JPopupMenu getPopupMenu() { - Action copyAction = new AbstractAction(Messages.getString("MissingPlotsListener.2")) { //$NON-NLS-1$ - - private static final long serialVersionUID = 1L; - - @Override - public void actionPerformed(ActionEvent e) { - disclaimerTextArea.selectAll(); - String selection = disclaimerTextArea.getSelectedText(); - Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); - if (selection == null) { - return; - } - StringSelection clipString = new StringSelection(selection); - clipboard.setContents(clipString, clipString); - } - }; - - JPopupMenu popup = new JPopupMenu(); - popup.add(copyAction); - return popup; + AboutDialog aboutDialog = new AboutDialog(parent, title); + aboutDialog.setLocationRelativeTo(parent); + + aboutDialog.setModal(true); + aboutDialog.setVisible(true); } } From 112531174b41a2517ff68f86fcac2b492d8e3f83 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:48 +0100 Subject: [PATCH 1224/1620] New translations JPlotCsvTable.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 240 ++++++++++++++++-- 1 file changed, 223 insertions(+), 17 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 2f8596c07f..e15ddb90b9 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,27 +1,233 @@ package org.openforis.collect.earth.app.view; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; +import java.awt.Color; +import java.awt.Component; +import java.awt.event.MouseEvent; +import java.io.File; +import java.util.ArrayList; +import java.util.List; -import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.swing.JTable; +import javax.swing.table.DefaultTableModel; +import javax.swing.table.TableCellRenderer; -public class OpenAboutDialogListener implements ActionListener{ +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult; +import org.openforis.collect.io.metadata.collectearth.CSVRowValidationResult; +import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; +import org.openforis.collect.manager.validation.SurveyValidator.ValidationParameters; +import org.openforis.collect.model.CollectSurvey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; - JFrame parent; - String title; - - public OpenAboutDialogListener(JFrame parentFrame, String title) { - this.parent = parentFrame; - this.title = title; +import com.opencsv.CSVReader; + +/** + * Swing JTable used in the OptionWizard dialog. + * It contains methods to refresh the information loaded on the cells. + * @author Alfonso Sanchez-Paus Diaz + * + */ +public class JPlotCsvTable extends JTable{ + + private static final Color WARNING_BG_COLOR = new Color(254, 255, 196); + private static final Color ERROR_BG_COLOR = new Color(218, 152, 152); + private static final long serialVersionUID = 3456854921119125693L; + private static final int LIMIT_LOADED_CSV_LINES = 400; + private final transient Logger logger = LoggerFactory.getLogger(this.getClass()); + private transient CollectSurvey forSurvey; + private transient CSVFileValidationResult validationResults; + + + /** + * Build a new JTable that contains the data from the CSV that is set as the file that contains the plots used by Collect Earth + * @param pathToCsvWithPlots Path to the file containing the plot locations that should be loaded in the table + * @param forSurvey Survey that the csv file belongs to + */ + public JPlotCsvTable(String pathToCsvWithPlots, CollectSurvey forSurvey) { + super(); + this.forSurvey = forSurvey; + + try { + refreshTable(pathToCsvWithPlots); + } catch (Exception e) { + logger.error("Error loading plot file"); + this.setBackground(Color.RED); + this.setToolTipText("The file chosen does not contain plot information"); + + } + } + + /** + * The data of the CSV file is validated when the CSV/CED is loaded. This method determines if the data currently loaded is valid or not + * @return True if the data is valid. False otherwise + */ + public boolean isDataValid(){ + return validationResults==null?true:validationResults.isSuccessful(); } - + + @Override - public void actionPerformed(ActionEvent e) { - AboutDialog aboutDialog = new AboutDialog(parent, title); - aboutDialog.setLocationRelativeTo(parent); - - aboutDialog.setModal(true); - aboutDialog.setVisible(true); + public Component prepareRenderer(TableCellRenderer renderer, int row, int col) { + Component comp = super.prepareRenderer(renderer, row, col); + + if ( cellHasError(row,col)){ + comp.setBackground( ERROR_BG_COLOR ); + }else{ + comp.setBackground(Color.WHITE); + } + + return comp; + } + + @Override + public String getToolTipText(MouseEvent event) { + String tip = null; + java.awt.Point p = event.getPoint(); + int row = rowAtPoint(p); + int col = columnAtPoint(p); + + try { + tip = getCellErrorMessage(row, col); + } catch (RuntimeException e1) { + //catch null pointer exception if mouse is over an empty line + } + + return tip; + + } + + private boolean cellHasError(Integer row, Integer col) { + String errorMessage = getCellErrorMessage(row, col); + return errorMessage!=null; + } + + private String getCellErrorMessage(Integer row, Integer col) { + if( validationResults != null ){ + List rowValidations = validationResults.getRowValidations(); + for (CSVRowValidationResult csvRowValidationResult : rowValidations) { + if( csvRowValidationResult.getRowNumber().equals(row+1) && csvRowValidationResult.getColumnPosition().equals( col ) ){ + return csvRowValidationResult.getMessage(); + } + } + } + return null; + } + + /** + * Refreshes the data loaded in the table. Used when the user changes the file that contains the CSV file using the OptionWizard dialog. + * @param csvFilePath The path to the CSV file that contains the plot locations + */ + public void refreshTable(String csvFilePath) { + + if( csvFilePath.trim().length() == 0 ) + return; + + this.removeAll(); + boolean errorLoading = false; + final File csvFile = new File(csvFilePath); + + if (csvFile.exists()) { + DefaultTableModel newTableModel = getPlotTableModel( csvFilePath ); + + validateCsvFile(csvFilePath); + + if (newTableModel.getRowCount() == 0) { + errorLoading = true; + } else { + this.setModel(newTableModel); + } + } else { + errorLoading = true; + } + + if (errorLoading) { + this.setBackground(CollectEarthWindow.ERROR_COLOR); + this.setModel(new DefaultTableModel()); + } + } + + private String[] getColumnNames() { + // Check if the first line is actually a header. Possible if the first header column coincides with ID, PLOT_ID or PLOT + CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); + return cegtg.getExpectedHeaders( forSurvey ).toArray( new String[]{} ); + + } + + private DefaultTableModel getPlotTableModel(String csvFilePath) { + + String[][] allValues = new String[0][0]; + + try ( CSVReader reader = CsvReaderUtils.getCsvReader(csvFilePath) ){ + String[] line; + List allLines = new ArrayList<>(); + int i =0; + while( ( line = reader.readNext() ) != null && i< LIMIT_LOADED_CSV_LINES ) { // we do this to avoid out of memory errors + i++; + allLines.add( line ); + } + + allValues = allLines.toArray(new String[][] {}); + } catch (Exception e) { + logger.error(" Error reading the CSV file " + csvFilePath, e); + } + + return new DefaultTableModel( allValues , getColumnNames()); + } + + protected void validateCsvFile(String csvFilePath) { + + CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); + ValidationParameters validationParameters = new ValidationParameters(); + validationParameters.setValidateOnlyFirstLines( false ); + CSVFileValidationResult validation = cegtg.validate( new File(csvFilePath), forSurvey, validationParameters); + + this.setBackground( Color.white ); + + + if( !validation.isSuccessful() ){ + switch ( validation.getErrorType() ) { + case INVALID_FILE_TYPE: + case INVALID_NUMBER_OF_COLUMNS: + JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); + JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The expected file type is CSV or CED ", "Expected File Type", JOptionPane.ERROR_MESSAGE); + break; + + case INVALID_HEADERS: + JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); + JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The expected columns in the CSV are " + validation.getExpectedHeaders(), "Columns in CSV do not match survey", JOptionPane.ERROR_MESSAGE); + validation = null; // not bad enough to stop the user from loading the CSV file + break; + case INVALID_NUMBER_OF_PLOTS_TOO_LARGE: + JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); + JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "Using CSV files that are too large makes Google Earth extremely slow.\nPlease divide this CSV file into smaller file (reccomended less than 2000 plots per CSV file.\nNumber of plots in this file : " + validation.getNumberOfRows() , "File too large", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + validation = null; // not bad enough to stop the user from loading the CSV file + break; + + case INVALID_NUMBER_OF_PLOTS_WARNING: + JPlotCsvTable.this.setBackground( WARNING_BG_COLOR); + JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "Using CSV files that are too large makes Google Earth slow.\n Please divide this CSV file into smaller file (reccomended size is less than 2000 plots per CSV file.\nNumber of plots in this file : " + validation.getNumberOfRows() , "File too large", JOptionPane.WARNING_MESSAGE); //$NON-NLS-1$ + validation = null; // not bad enough to stop the user from loading the CSV file + break; + + case INVALID_VALUES_IN_CSV: + // IN THIS CASE THE CELL RENDERER TAKES CARE OF HIGHLIGHTING THE CELLS!!! + JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The content of the CSV file is not correct!! The values on the cells highlighted are incorrect " , "CSV content is not correct", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + break; + + default: + break; + } + } + + + this.setValidationResults( validation ); + } + + + private void setValidationResults(CSVFileValidationResult validationResults) { + this.validationResults = validationResults; } } From b723bee98ce1172bab402b26f821949f899f920e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:49 +0100 Subject: [PATCH 1225/1620] New translations OpenAboutDialogListener.java (English) --- .../earth/app/view/Messages_en.properties | 225 +----------------- 1 file changed, 13 insertions(+), 212 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 3ad3d0b623..2f8596c07f 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,226 +1,27 @@ package org.openforis.collect.earth.app.view; -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.Toolkit; -import java.awt.datatransfer.Clipboard; -import java.awt.datatransfer.StringSelection; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.io.File; -import java.io.IOException; -import java.util.List; -import java.util.Map; -import javax.swing.AbstractAction; -import javax.swing.Action; -import javax.swing.JButton; -import javax.swing.JDialog; import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JPopupMenu; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; -import javax.swing.SwingUtilities; -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.ad_hoc.FixCoordinates; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.MissingPlotService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +public class OpenAboutDialogListener implements ActionListener{ -public final class MissingPlotsListener implements ActionListener { - - private LocalPropertiesService localPropertiesService; - - private JFrame frame; - - private final Logger logger = LoggerFactory.getLogger(FixCoordinates.class); - - private JTextArea disclaimerTextArea; - - private MissingPlotService missingPlotService; - - public MissingPlotsListener(JFrame frame, LocalPropertiesService localPropertiesService, - MissingPlotService missingPlotService) { - this.frame = frame; - this.localPropertiesService = localPropertiesService; - this.missingPlotService = missingPlotService; + JFrame parent; + String title; + + public OpenAboutDialogListener(JFrame parentFrame, String title) { + this.parent = parentFrame; + this.title = title; } - + @Override public void actionPerformed(ActionEvent e) { - - try { - CollectEarthWindow.startWaiting(frame); - findMissingPlots(); - } catch (Exception e1) { - logger.error(Messages.getString("MissingPlotsListener.0"), e1); //$NON-NLS-1$ - } finally { - - CollectEarthWindow.endWaiting(frame); - } - - } - - private void findMissingPlots() { - - showInfoAboutFunctionality(); - - String csvFile = localPropertiesService.getCsvFile(); - File currentFolder = null; - - if (!StringUtils.isBlank(csvFile)) { - File file = new File(csvFile); - if (file.exists()) - currentFolder = file.getParentFile(); - } - - final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults( - DataFormat.COLLECT_COORDS, false, true, null, localPropertiesService, frame, currentFolder); - if( selectedPlotFiles != null && selectedPlotFiles.length > 0 ) { - new Thread("Finding Missing plots") { - @Override - public void run() { - InfiniteProgressMonitor infiniteProgressMonitor = new InfiniteProgressMonitor(frame, - "Finding missing plots", "Please wait..."); - try { - infiniteProgressMonitor.showLater(); - - // Returns the list of all of the plots that are stored in the selected CSV - // files - final Map> allPlotsInFiles = missingPlotService - .getPlotDataByFile(selectedPlotFiles); - - // Returns the list of the plots that are not completely saved or not saved at - // all in the DB - Map> missingPlotData = missingPlotService - .getMissingPlotsByFile(allPlotsInFiles, infiniteProgressMonitor); - // Generates a text representation of the missing plots plus the brief on the - // total plots - String missingPlotsText = missingPlotService.getMissingPlotInformation(allPlotsInFiles, missingPlotData); - // Generates a temporary file that contains the missing plots as a CED - File tempFile = missingPlotService.getMissingPlotFile(missingPlotData); - SwingUtilities.invokeLater( infiniteProgressMonitor::close ); - - JDialog missingDlg = buildDialog(missingPlotsText, tempFile); - - Runnable setVisible =() -> missingDlg.setVisible(true); - SwingUtilities.invokeLater( setVisible ); - } catch (Exception e) { - logger.error("Error while finding missing plots", e); - } finally { - infiniteProgressMonitor.close(); - } - } - }.start(); - } - - } - - private JDialog buildDialog(String missingPlotsText, File tempFile) { - final JDialog dialog = new JDialog(frame, Messages.getString("MissingPlotsListener.1")); //$NON-NLS-1$ - dialog.setLocationRelativeTo(frame); - dialog.setSize(new Dimension(300, 400)); - dialog.setModal(false); - - final BorderLayout layoutManager = new BorderLayout(); - - final JPanel panel = new JPanel(layoutManager); - - dialog.add(panel); - - disclaimerTextArea = new JTextArea(missingPlotsText); - disclaimerTextArea.setEditable(false); - disclaimerTextArea.setLineWrap(true); - disclaimerTextArea.setWrapStyleWord(true); - final JScrollPane scrollPane = new JScrollPane(disclaimerTextArea); - panel.add(scrollPane, BorderLayout.CENTER); - scrollPane.setPreferredSize(new Dimension(250, 250)); - - final JButton close = new JButton(Messages.getString("CollectEarthWindow.5")); //$NON-NLS-1$ - close.addActionListener(e -> dialog.setVisible(false)); - panel.add(close, BorderLayout.SOUTH); - - if (tempFile != null) { - final JButton export = new JButton(Messages.getString(Messages.getString("MissingPlotsListener.6"))); //$NON-NLS-1$ - ActionListener exportListener = getSaveAsListener(tempFile); - export.addActionListener(exportListener); - panel.add(export, BorderLayout.SOUTH); - } - - disclaimerTextArea.addMouseListener(new MouseAdapter() { - @Override - public void mousePressed(MouseEvent e) { - check(e); - } - - @Override - public void mouseReleased(MouseEvent e) { - check(e); - } - - public void check(MouseEvent e) { - if (e.isPopupTrigger()) { // if the event shows the menu - getPopupMenu().show(disclaimerTextArea, e.getPoint().x, e.getPoint().y); - } - } - }); - - return dialog; - } - - private ActionListener getSaveAsListener(File tempFile) { - - return e -> { - final File[] saveToCsvFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, - true, false, "plotsWithMissingInfo.csv", //$NON-NLS-1$ //$NON-NLS-2$ - localPropertiesService, frame); - - if (saveToCsvFile != null && saveToCsvFile.length == 1) { - try { - FileUtils.copyFile(tempFile, saveToCsvFile[0]); - } catch (IOException e1) { - logger.error("Error when copying temporary file with missing plots to final destination " //$NON-NLS-1$ - + tempFile.getAbsolutePath() + " to " + saveToCsvFile[0].getAbsolutePath(), e); //$NON-NLS-1$ - } - } - }; - - } - - public void showInfoAboutFunctionality() { - JOptionPane.showMessageDialog(frame, Messages.getString("MissingPlotsListener.3"), //$NON-NLS-1$ - Messages.getString("MissingPlotsListener.4"), //$NON-NLS-1$ - JOptionPane.INFORMATION_MESSAGE); - } - - private JPopupMenu getPopupMenu() { - Action copyAction = new AbstractAction(Messages.getString("MissingPlotsListener.2")) { //$NON-NLS-1$ - - private static final long serialVersionUID = 1L; - - @Override - public void actionPerformed(ActionEvent e) { - disclaimerTextArea.selectAll(); - String selection = disclaimerTextArea.getSelectedText(); - Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); - if (selection == null) { - return; - } - StringSelection clipString = new StringSelection(selection); - clipboard.setContents(clipString, clipString); - } - }; - - JPopupMenu popup = new JPopupMenu(); - popup.add(copyAction); - return popup; + AboutDialog aboutDialog = new AboutDialog(parent, title); + aboutDialog.setLocationRelativeTo(parent); + + aboutDialog.setModal(true); + aboutDialog.setVisible(true); } } From 159be659d0cdb6723712a5200989c57a83cf13ce Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:50 +0100 Subject: [PATCH 1226/1620] New translations OpenSupportForum.java (French) --- .../earth/app/view/Messages_fr.properties | 26 +++++++------------ 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 2f8596c07f..06f4b227eb 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -2,26 +2,20 @@ package org.openforis.collect.earth.app.view; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.net.URI; +import java.net.URISyntaxException; -import javax.swing.JFrame; +public class OpenSupportForum implements ActionListener { -public class OpenAboutDialogListener implements ActionListener{ - - JFrame parent; - String title; - - public OpenAboutDialogListener(JFrame parentFrame, String title) { - this.parent = parentFrame; - this.title = title; - } - @Override public void actionPerformed(ActionEvent e) { - AboutDialog aboutDialog = new AboutDialog(parent, title); - aboutDialog.setLocationRelativeTo(parent); - - aboutDialog.setModal(true); - aboutDialog.setVisible(true); + try { + URI uri = new java.net.URI("http://www.openforis.org/support"); //$NON-NLS-1$ + (new LinkRunner(uri)).execute(); + } catch (URISyntaxException use) { + throw new AssertionError(use + ": " + "Open FOris support"); //NOI18N //$NON-NLS-1$ + } + } } From 2d332391bdbfa2be6a702286e0d10a72a9c203e7 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:51 +0100 Subject: [PATCH 1227/1620] New translations OpenSupportForum.java (Spanish) --- .../earth/app/view/Messages_es.properties | 221 +----------------- 1 file changed, 8 insertions(+), 213 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 3ad3d0b623..06f4b227eb 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,226 +1,21 @@ package org.openforis.collect.earth.app.view; -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.Toolkit; -import java.awt.datatransfer.Clipboard; -import java.awt.datatransfer.StringSelection; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.io.File; -import java.io.IOException; -import java.util.List; -import java.util.Map; +import java.net.URI; +import java.net.URISyntaxException; -import javax.swing.AbstractAction; -import javax.swing.Action; -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JPopupMenu; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; -import javax.swing.SwingUtilities; - -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.ad_hoc.FixCoordinates; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.MissingPlotService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public final class MissingPlotsListener implements ActionListener { - - private LocalPropertiesService localPropertiesService; - - private JFrame frame; - - private final Logger logger = LoggerFactory.getLogger(FixCoordinates.class); - - private JTextArea disclaimerTextArea; - - private MissingPlotService missingPlotService; - - public MissingPlotsListener(JFrame frame, LocalPropertiesService localPropertiesService, - MissingPlotService missingPlotService) { - this.frame = frame; - this.localPropertiesService = localPropertiesService; - this.missingPlotService = missingPlotService; - } +public class OpenSupportForum implements ActionListener { @Override public void actionPerformed(ActionEvent e) { - try { - CollectEarthWindow.startWaiting(frame); - findMissingPlots(); - } catch (Exception e1) { - logger.error(Messages.getString("MissingPlotsListener.0"), e1); //$NON-NLS-1$ - } finally { - - CollectEarthWindow.endWaiting(frame); - } - - } - - private void findMissingPlots() { - - showInfoAboutFunctionality(); - - String csvFile = localPropertiesService.getCsvFile(); - File currentFolder = null; - - if (!StringUtils.isBlank(csvFile)) { - File file = new File(csvFile); - if (file.exists()) - currentFolder = file.getParentFile(); - } - - final File[] selectedPlotFiles = JFileChooserExistsAware.getFileChooserResults( - DataFormat.COLLECT_COORDS, false, true, null, localPropertiesService, frame, currentFolder); - if( selectedPlotFiles != null && selectedPlotFiles.length > 0 ) { - new Thread("Finding Missing plots") { - @Override - public void run() { - InfiniteProgressMonitor infiniteProgressMonitor = new InfiniteProgressMonitor(frame, - "Finding missing plots", "Please wait..."); - try { - infiniteProgressMonitor.showLater(); - - // Returns the list of all of the plots that are stored in the selected CSV - // files - final Map> allPlotsInFiles = missingPlotService - .getPlotDataByFile(selectedPlotFiles); - - // Returns the list of the plots that are not completely saved or not saved at - // all in the DB - Map> missingPlotData = missingPlotService - .getMissingPlotsByFile(allPlotsInFiles, infiniteProgressMonitor); - // Generates a text representation of the missing plots plus the brief on the - // total plots - String missingPlotsText = missingPlotService.getMissingPlotInformation(allPlotsInFiles, missingPlotData); - // Generates a temporary file that contains the missing plots as a CED - File tempFile = missingPlotService.getMissingPlotFile(missingPlotData); - SwingUtilities.invokeLater( infiniteProgressMonitor::close ); - - JDialog missingDlg = buildDialog(missingPlotsText, tempFile); - - Runnable setVisible =() -> missingDlg.setVisible(true); - SwingUtilities.invokeLater( setVisible ); - } catch (Exception e) { - logger.error("Error while finding missing plots", e); - } finally { - infiniteProgressMonitor.close(); - } - } - }.start(); - } - - } - - private JDialog buildDialog(String missingPlotsText, File tempFile) { - final JDialog dialog = new JDialog(frame, Messages.getString("MissingPlotsListener.1")); //$NON-NLS-1$ - dialog.setLocationRelativeTo(frame); - dialog.setSize(new Dimension(300, 400)); - dialog.setModal(false); - - final BorderLayout layoutManager = new BorderLayout(); - - final JPanel panel = new JPanel(layoutManager); - - dialog.add(panel); - - disclaimerTextArea = new JTextArea(missingPlotsText); - disclaimerTextArea.setEditable(false); - disclaimerTextArea.setLineWrap(true); - disclaimerTextArea.setWrapStyleWord(true); - final JScrollPane scrollPane = new JScrollPane(disclaimerTextArea); - panel.add(scrollPane, BorderLayout.CENTER); - scrollPane.setPreferredSize(new Dimension(250, 250)); - - final JButton close = new JButton(Messages.getString("CollectEarthWindow.5")); //$NON-NLS-1$ - close.addActionListener(e -> dialog.setVisible(false)); - panel.add(close, BorderLayout.SOUTH); - - if (tempFile != null) { - final JButton export = new JButton(Messages.getString(Messages.getString("MissingPlotsListener.6"))); //$NON-NLS-1$ - ActionListener exportListener = getSaveAsListener(tempFile); - export.addActionListener(exportListener); - panel.add(export, BorderLayout.SOUTH); - } - - disclaimerTextArea.addMouseListener(new MouseAdapter() { - @Override - public void mousePressed(MouseEvent e) { - check(e); - } - - @Override - public void mouseReleased(MouseEvent e) { - check(e); - } - - public void check(MouseEvent e) { - if (e.isPopupTrigger()) { // if the event shows the menu - getPopupMenu().show(disclaimerTextArea, e.getPoint().x, e.getPoint().y); - } - } - }); - - return dialog; - } - - private ActionListener getSaveAsListener(File tempFile) { - - return e -> { - final File[] saveToCsvFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.COLLECT_COORDS, - true, false, "plotsWithMissingInfo.csv", //$NON-NLS-1$ //$NON-NLS-2$ - localPropertiesService, frame); - - if (saveToCsvFile != null && saveToCsvFile.length == 1) { - try { - FileUtils.copyFile(tempFile, saveToCsvFile[0]); - } catch (IOException e1) { - logger.error("Error when copying temporary file with missing plots to final destination " //$NON-NLS-1$ - + tempFile.getAbsolutePath() + " to " + saveToCsvFile[0].getAbsolutePath(), e); //$NON-NLS-1$ - } - } - }; - - } - - public void showInfoAboutFunctionality() { - JOptionPane.showMessageDialog(frame, Messages.getString("MissingPlotsListener.3"), //$NON-NLS-1$ - Messages.getString("MissingPlotsListener.4"), //$NON-NLS-1$ - JOptionPane.INFORMATION_MESSAGE); - } - - private JPopupMenu getPopupMenu() { - Action copyAction = new AbstractAction(Messages.getString("MissingPlotsListener.2")) { //$NON-NLS-1$ - - private static final long serialVersionUID = 1L; - - @Override - public void actionPerformed(ActionEvent e) { - disclaimerTextArea.selectAll(); - String selection = disclaimerTextArea.getSelectedText(); - Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); - if (selection == null) { - return; - } - StringSelection clipString = new StringSelection(selection); - clipboard.setContents(clipString, clipString); - } - }; + URI uri = new java.net.URI("http://www.openforis.org/support"); //$NON-NLS-1$ + (new LinkRunner(uri)).execute(); + } catch (URISyntaxException use) { + throw new AssertionError(use + ": " + "Open FOris support"); //NOI18N //$NON-NLS-1$ + } - JPopupMenu popup = new JPopupMenu(); - popup.add(copyAction); - return popup; } } From 00df1b08199db70769c9c74719058ade4234d91b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:52 +0100 Subject: [PATCH 1228/1620] New translations OpenSupportForum.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 236 +----------------- 1 file changed, 12 insertions(+), 224 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index e15ddb90b9..06f4b227eb 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,233 +1,21 @@ package org.openforis.collect.earth.app.view; -import java.awt.Color; -import java.awt.Component; -import java.awt.event.MouseEvent; -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.JOptionPane; -import javax.swing.JTable; -import javax.swing.table.DefaultTableModel; -import javax.swing.table.TableCellRenderer; - -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult; -import org.openforis.collect.io.metadata.collectearth.CSVRowValidationResult; -import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; -import org.openforis.collect.manager.validation.SurveyValidator.ValidationParameters; -import org.openforis.collect.model.CollectSurvey; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.opencsv.CSVReader; - -/** - * Swing JTable used in the OptionWizard dialog. - * It contains methods to refresh the information loaded on the cells. - * @author Alfonso Sanchez-Paus Diaz - * - */ -public class JPlotCsvTable extends JTable{ - - private static final Color WARNING_BG_COLOR = new Color(254, 255, 196); - private static final Color ERROR_BG_COLOR = new Color(218, 152, 152); - private static final long serialVersionUID = 3456854921119125693L; - private static final int LIMIT_LOADED_CSV_LINES = 400; - private final transient Logger logger = LoggerFactory.getLogger(this.getClass()); - private transient CollectSurvey forSurvey; - private transient CSVFileValidationResult validationResults; - - - /** - * Build a new JTable that contains the data from the CSV that is set as the file that contains the plots used by Collect Earth - * @param pathToCsvWithPlots Path to the file containing the plot locations that should be loaded in the table - * @param forSurvey Survey that the csv file belongs to - */ - public JPlotCsvTable(String pathToCsvWithPlots, CollectSurvey forSurvey) { - super(); - this.forSurvey = forSurvey; - - try { - refreshTable(pathToCsvWithPlots); - } catch (Exception e) { - logger.error("Error loading plot file"); - this.setBackground(Color.RED); - this.setToolTipText("The file chosen does not contain plot information"); - - } - } - - /** - * The data of the CSV file is validated when the CSV/CED is loaded. This method determines if the data currently loaded is valid or not - * @return True if the data is valid. False otherwise - */ - public boolean isDataValid(){ - return validationResults==null?true:validationResults.isSuccessful(); - } +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.net.URI; +import java.net.URISyntaxException; +public class OpenSupportForum implements ActionListener { @Override - public Component prepareRenderer(TableCellRenderer renderer, int row, int col) { - Component comp = super.prepareRenderer(renderer, row, col); - - if ( cellHasError(row,col)){ - comp.setBackground( ERROR_BG_COLOR ); - }else{ - comp.setBackground(Color.WHITE); - } - - return comp; - } - - @Override - public String getToolTipText(MouseEvent event) { - String tip = null; - java.awt.Point p = event.getPoint(); - int row = rowAtPoint(p); - int col = columnAtPoint(p); - - try { - tip = getCellErrorMessage(row, col); - } catch (RuntimeException e1) { - //catch null pointer exception if mouse is over an empty line - } - - return tip; - - } - - private boolean cellHasError(Integer row, Integer col) { - String errorMessage = getCellErrorMessage(row, col); - return errorMessage!=null; - } - - private String getCellErrorMessage(Integer row, Integer col) { - if( validationResults != null ){ - List rowValidations = validationResults.getRowValidations(); - for (CSVRowValidationResult csvRowValidationResult : rowValidations) { - if( csvRowValidationResult.getRowNumber().equals(row+1) && csvRowValidationResult.getColumnPosition().equals( col ) ){ - return csvRowValidationResult.getMessage(); - } - } - } - return null; - } - - /** - * Refreshes the data loaded in the table. Used when the user changes the file that contains the CSV file using the OptionWizard dialog. - * @param csvFilePath The path to the CSV file that contains the plot locations - */ - public void refreshTable(String csvFilePath) { - - if( csvFilePath.trim().length() == 0 ) - return; - - this.removeAll(); - boolean errorLoading = false; - final File csvFile = new File(csvFilePath); - - if (csvFile.exists()) { - DefaultTableModel newTableModel = getPlotTableModel( csvFilePath ); - - validateCsvFile(csvFilePath); - - if (newTableModel.getRowCount() == 0) { - errorLoading = true; - } else { - this.setModel(newTableModel); - } - } else { - errorLoading = true; - } - - if (errorLoading) { - this.setBackground(CollectEarthWindow.ERROR_COLOR); - this.setModel(new DefaultTableModel()); - } - } - - private String[] getColumnNames() { - // Check if the first line is actually a header. Possible if the first header column coincides with ID, PLOT_ID or PLOT - CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); - return cegtg.getExpectedHeaders( forSurvey ).toArray( new String[]{} ); - - } - - private DefaultTableModel getPlotTableModel(String csvFilePath) { - - String[][] allValues = new String[0][0]; - - try ( CSVReader reader = CsvReaderUtils.getCsvReader(csvFilePath) ){ - String[] line; - List allLines = new ArrayList<>(); - int i =0; - while( ( line = reader.readNext() ) != null && i< LIMIT_LOADED_CSV_LINES ) { // we do this to avoid out of memory errors - i++; - allLines.add( line ); - } - - allValues = allLines.toArray(new String[][] {}); - } catch (Exception e) { - logger.error(" Error reading the CSV file " + csvFilePath, e); - } - - return new DefaultTableModel( allValues , getColumnNames()); - } - - protected void validateCsvFile(String csvFilePath) { - - CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); - ValidationParameters validationParameters = new ValidationParameters(); - validationParameters.setValidateOnlyFirstLines( false ); - CSVFileValidationResult validation = cegtg.validate( new File(csvFilePath), forSurvey, validationParameters); - - this.setBackground( Color.white ); - - - if( !validation.isSuccessful() ){ - switch ( validation.getErrorType() ) { - case INVALID_FILE_TYPE: - case INVALID_NUMBER_OF_COLUMNS: - JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); - JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The expected file type is CSV or CED ", "Expected File Type", JOptionPane.ERROR_MESSAGE); - break; - - case INVALID_HEADERS: - JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); - JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The expected columns in the CSV are " + validation.getExpectedHeaders(), "Columns in CSV do not match survey", JOptionPane.ERROR_MESSAGE); - validation = null; // not bad enough to stop the user from loading the CSV file - break; - case INVALID_NUMBER_OF_PLOTS_TOO_LARGE: - JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); - JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "Using CSV files that are too large makes Google Earth extremely slow.\nPlease divide this CSV file into smaller file (reccomended less than 2000 plots per CSV file.\nNumber of plots in this file : " + validation.getNumberOfRows() , "File too large", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - validation = null; // not bad enough to stop the user from loading the CSV file - break; - - case INVALID_NUMBER_OF_PLOTS_WARNING: - JPlotCsvTable.this.setBackground( WARNING_BG_COLOR); - JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "Using CSV files that are too large makes Google Earth slow.\n Please divide this CSV file into smaller file (reccomended size is less than 2000 plots per CSV file.\nNumber of plots in this file : " + validation.getNumberOfRows() , "File too large", JOptionPane.WARNING_MESSAGE); //$NON-NLS-1$ - validation = null; // not bad enough to stop the user from loading the CSV file - break; - - case INVALID_VALUES_IN_CSV: - // IN THIS CASE THE CELL RENDERER TAKES CARE OF HIGHLIGHTING THE CELLS!!! - JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The content of the CSV file is not correct!! The values on the cells highlighted are incorrect " , "CSV content is not correct", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - break; - - default: - break; - } - } - - - this.setValidationResults( validation ); - } - + public void actionPerformed(ActionEvent e) { + try { + URI uri = new java.net.URI("http://www.openforis.org/support"); //$NON-NLS-1$ + (new LinkRunner(uri)).execute(); + } catch (URISyntaxException use) { + throw new AssertionError(use + ": " + "Open FOris support"); //NOI18N //$NON-NLS-1$ + } - private void setValidationResults(CSVFileValidationResult validationResults) { - this.validationResults = validationResults; } } From 306c6cad084dae7e13d90bec7a95e2c3353bab6d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:53 +0100 Subject: [PATCH 1229/1620] New translations OpenSupportForum.java (English) --- .../earth/app/view/Messages_en.properties | 26 +++++++------------ 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 2f8596c07f..06f4b227eb 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -2,26 +2,20 @@ package org.openforis.collect.earth.app.view; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.net.URI; +import java.net.URISyntaxException; -import javax.swing.JFrame; +public class OpenSupportForum implements ActionListener { -public class OpenAboutDialogListener implements ActionListener{ - - JFrame parent; - String title; - - public OpenAboutDialogListener(JFrame parentFrame, String title) { - this.parent = parentFrame; - this.title = title; - } - @Override public void actionPerformed(ActionEvent e) { - AboutDialog aboutDialog = new AboutDialog(parent, title); - aboutDialog.setLocationRelativeTo(parent); - - aboutDialog.setModal(true); - aboutDialog.setVisible(true); + try { + URI uri = new java.net.URI("http://www.openforis.org/support"); //$NON-NLS-1$ + (new LinkRunner(uri)).execute(); + } catch (URISyntaxException use) { + throw new AssertionError(use + ": " + "Open FOris support"); //NOI18N //$NON-NLS-1$ + } + } } From dcefd6f6ffe6625c555447dab44d6a1550b5339f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:55 +0100 Subject: [PATCH 1230/1620] New translations OpenTextFileListener.java (French) --- .../earth/app/view/Messages_fr.properties | 67 ++++++++++++++++--- 1 file changed, 59 insertions(+), 8 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 06f4b227eb..a3e291cd48 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,21 +1,72 @@ package org.openforis.collect.earth.app.view; +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.net.URI; -import java.net.URISyntaxException; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; -public class OpenSupportForum implements ActionListener { +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; + +import org.apache.commons.io.FileUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class OpenTextFileListener implements ActionListener { + + JDialog dialog; + private final Logger logger = LoggerFactory.getLogger(OpenTextFileListener.class); + JTextArea disclaimerTextArea; + private String filePath; + + public OpenTextFileListener(Frame owner, String filePath, String title) { + + this.filePath = filePath; + dialog = new JDialog(owner, title + " " + filePath); //$NON-NLS-1$ + dialog.setLocationRelativeTo(owner); + dialog.setSize(new Dimension(300, 400)); + dialog.setModal(true); + + final BorderLayout layoutManager = new BorderLayout(); + + final JPanel panel = new JPanel(layoutManager); + + dialog.add(panel); + + disclaimerTextArea = new JTextArea(); + disclaimerTextArea.setEditable(false); + disclaimerTextArea.setLineWrap(true); + disclaimerTextArea.setWrapStyleWord(true); + final JScrollPane scrollPane = new JScrollPane(disclaimerTextArea); + panel.add(scrollPane, BorderLayout.CENTER); + scrollPane.setPreferredSize(new Dimension(250, 250)); + + final JButton close = new JButton(Messages.getString("CollectEarthWindow.5")); //$NON-NLS-1$ + close.addActionListener( e -> dialog.setVisible(false) ); + panel.add(close, BorderLayout.SOUTH); + } @Override public void actionPerformed(ActionEvent e) { + disclaimerTextArea.setText(getTextContents()); + dialog.setVisible(true); + } + + private String getTextContents() { try { - URI uri = new java.net.URI("http://www.openforis.org/support"); //$NON-NLS-1$ - (new LinkRunner(uri)).execute(); - } catch (URISyntaxException use) { - throw new AssertionError(use + ": " + "Open FOris support"); //NOI18N //$NON-NLS-1$ - } + return FileUtils.readFileToString(new File( filePath ), StandardCharsets.UTF_8); + } catch (final IOException e) { + logger.error(Messages.getString("OpenTextFileListener.0") + filePath.toString(), e); //$NON-NLS-1$ + return Messages.getString("CollectEarthWindow.8"); //$NON-NLS-1$ + } } } From 9553e52d4aca6b042a34cc9d62cf6b542928d96f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:56 +0100 Subject: [PATCH 1231/1620] New translations OpenTextFileListener.java (Spanish) --- .../earth/app/view/Messages_es.properties | 67 ++++++++++++++++--- 1 file changed, 59 insertions(+), 8 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 06f4b227eb..a3e291cd48 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,21 +1,72 @@ package org.openforis.collect.earth.app.view; +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.net.URI; -import java.net.URISyntaxException; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; -public class OpenSupportForum implements ActionListener { +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; + +import org.apache.commons.io.FileUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class OpenTextFileListener implements ActionListener { + + JDialog dialog; + private final Logger logger = LoggerFactory.getLogger(OpenTextFileListener.class); + JTextArea disclaimerTextArea; + private String filePath; + + public OpenTextFileListener(Frame owner, String filePath, String title) { + + this.filePath = filePath; + dialog = new JDialog(owner, title + " " + filePath); //$NON-NLS-1$ + dialog.setLocationRelativeTo(owner); + dialog.setSize(new Dimension(300, 400)); + dialog.setModal(true); + + final BorderLayout layoutManager = new BorderLayout(); + + final JPanel panel = new JPanel(layoutManager); + + dialog.add(panel); + + disclaimerTextArea = new JTextArea(); + disclaimerTextArea.setEditable(false); + disclaimerTextArea.setLineWrap(true); + disclaimerTextArea.setWrapStyleWord(true); + final JScrollPane scrollPane = new JScrollPane(disclaimerTextArea); + panel.add(scrollPane, BorderLayout.CENTER); + scrollPane.setPreferredSize(new Dimension(250, 250)); + + final JButton close = new JButton(Messages.getString("CollectEarthWindow.5")); //$NON-NLS-1$ + close.addActionListener( e -> dialog.setVisible(false) ); + panel.add(close, BorderLayout.SOUTH); + } @Override public void actionPerformed(ActionEvent e) { + disclaimerTextArea.setText(getTextContents()); + dialog.setVisible(true); + } + + private String getTextContents() { try { - URI uri = new java.net.URI("http://www.openforis.org/support"); //$NON-NLS-1$ - (new LinkRunner(uri)).execute(); - } catch (URISyntaxException use) { - throw new AssertionError(use + ": " + "Open FOris support"); //NOI18N //$NON-NLS-1$ - } + return FileUtils.readFileToString(new File( filePath ), StandardCharsets.UTF_8); + } catch (final IOException e) { + logger.error(Messages.getString("OpenTextFileListener.0") + filePath.toString(), e); //$NON-NLS-1$ + return Messages.getString("CollectEarthWindow.8"); //$NON-NLS-1$ + } } } From e9e604364fb1fbd2843904be94c10d0ea7eb56fe Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:57 +0100 Subject: [PATCH 1232/1620] New translations OpenTextFileListener.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 67 ++++++++++++++++--- 1 file changed, 59 insertions(+), 8 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 06f4b227eb..a3e291cd48 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,21 +1,72 @@ package org.openforis.collect.earth.app.view; +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.net.URI; -import java.net.URISyntaxException; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; -public class OpenSupportForum implements ActionListener { +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; + +import org.apache.commons.io.FileUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class OpenTextFileListener implements ActionListener { + + JDialog dialog; + private final Logger logger = LoggerFactory.getLogger(OpenTextFileListener.class); + JTextArea disclaimerTextArea; + private String filePath; + + public OpenTextFileListener(Frame owner, String filePath, String title) { + + this.filePath = filePath; + dialog = new JDialog(owner, title + " " + filePath); //$NON-NLS-1$ + dialog.setLocationRelativeTo(owner); + dialog.setSize(new Dimension(300, 400)); + dialog.setModal(true); + + final BorderLayout layoutManager = new BorderLayout(); + + final JPanel panel = new JPanel(layoutManager); + + dialog.add(panel); + + disclaimerTextArea = new JTextArea(); + disclaimerTextArea.setEditable(false); + disclaimerTextArea.setLineWrap(true); + disclaimerTextArea.setWrapStyleWord(true); + final JScrollPane scrollPane = new JScrollPane(disclaimerTextArea); + panel.add(scrollPane, BorderLayout.CENTER); + scrollPane.setPreferredSize(new Dimension(250, 250)); + + final JButton close = new JButton(Messages.getString("CollectEarthWindow.5")); //$NON-NLS-1$ + close.addActionListener( e -> dialog.setVisible(false) ); + panel.add(close, BorderLayout.SOUTH); + } @Override public void actionPerformed(ActionEvent e) { + disclaimerTextArea.setText(getTextContents()); + dialog.setVisible(true); + } + + private String getTextContents() { try { - URI uri = new java.net.URI("http://www.openforis.org/support"); //$NON-NLS-1$ - (new LinkRunner(uri)).execute(); - } catch (URISyntaxException use) { - throw new AssertionError(use + ": " + "Open FOris support"); //NOI18N //$NON-NLS-1$ - } + return FileUtils.readFileToString(new File( filePath ), StandardCharsets.UTF_8); + } catch (final IOException e) { + logger.error(Messages.getString("OpenTextFileListener.0") + filePath.toString(), e); //$NON-NLS-1$ + return Messages.getString("CollectEarthWindow.8"); //$NON-NLS-1$ + } } } From 2b5072f955e2fb0808ddfae19f7e35612694aeb9 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:58 +0100 Subject: [PATCH 1233/1620] New translations OpenTextFileListener.java (English) --- .../earth/app/view/Messages_en.properties | 67 ++++++++++++++++--- 1 file changed, 59 insertions(+), 8 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 06f4b227eb..a3e291cd48 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,21 +1,72 @@ package org.openforis.collect.earth.app.view; +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.net.URI; -import java.net.URISyntaxException; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; -public class OpenSupportForum implements ActionListener { +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; + +import org.apache.commons.io.FileUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class OpenTextFileListener implements ActionListener { + + JDialog dialog; + private final Logger logger = LoggerFactory.getLogger(OpenTextFileListener.class); + JTextArea disclaimerTextArea; + private String filePath; + + public OpenTextFileListener(Frame owner, String filePath, String title) { + + this.filePath = filePath; + dialog = new JDialog(owner, title + " " + filePath); //$NON-NLS-1$ + dialog.setLocationRelativeTo(owner); + dialog.setSize(new Dimension(300, 400)); + dialog.setModal(true); + + final BorderLayout layoutManager = new BorderLayout(); + + final JPanel panel = new JPanel(layoutManager); + + dialog.add(panel); + + disclaimerTextArea = new JTextArea(); + disclaimerTextArea.setEditable(false); + disclaimerTextArea.setLineWrap(true); + disclaimerTextArea.setWrapStyleWord(true); + final JScrollPane scrollPane = new JScrollPane(disclaimerTextArea); + panel.add(scrollPane, BorderLayout.CENTER); + scrollPane.setPreferredSize(new Dimension(250, 250)); + + final JButton close = new JButton(Messages.getString("CollectEarthWindow.5")); //$NON-NLS-1$ + close.addActionListener( e -> dialog.setVisible(false) ); + panel.add(close, BorderLayout.SOUTH); + } @Override public void actionPerformed(ActionEvent e) { + disclaimerTextArea.setText(getTextContents()); + dialog.setVisible(true); + } + + private String getTextContents() { try { - URI uri = new java.net.URI("http://www.openforis.org/support"); //$NON-NLS-1$ - (new LinkRunner(uri)).execute(); - } catch (URISyntaxException use) { - throw new AssertionError(use + ": " + "Open FOris support"); //NOI18N //$NON-NLS-1$ - } + return FileUtils.readFileToString(new File( filePath ), StandardCharsets.UTF_8); + } catch (final IOException e) { + logger.error(Messages.getString("OpenTextFileListener.0") + filePath.toString(), e); //$NON-NLS-1$ + return Messages.getString("CollectEarthWindow.8"); //$NON-NLS-1$ + } } } From e51d40426e4454c8a80cc610b1ca7d2a4f36c298 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:44:59 +0100 Subject: [PATCH 1234/1620] New translations ProcessMonitorDialog.java (French) --- .../earth/app/view/Messages_fr.properties | 145 ++++++++++-------- 1 file changed, 81 insertions(+), 64 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index a3e291cd48..aee91325a9 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,72 +1,89 @@ package org.openforis.collect.earth.app.view; -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.Frame; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; - -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; - -import org.apache.commons.io.FileUtils; +import java.awt.Toolkit; +import java.util.List; + +import javax.swing.JOptionPane; +import javax.swing.ProgressMonitor; +import javax.swing.SwingUtilities; + +import org.apache.commons.lang3.ArrayUtils; +import org.openforis.collect.io.data.CSVDataImportProcess; +import org.openforis.collect.io.metadata.parsing.ParsingError; +import org.openforis.collect.manager.process.AbstractProcess; +import org.openforis.collect.manager.process.ProcessStatus; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class OpenTextFileListener implements ActionListener { - - JDialog dialog; - private final Logger logger = LoggerFactory.getLogger(OpenTextFileListener.class); - JTextArea disclaimerTextArea; - private String filePath; - - public OpenTextFileListener(Frame owner, String filePath, String title) { - - this.filePath = filePath; - dialog = new JDialog(owner, title + " " + filePath); //$NON-NLS-1$ - dialog.setLocationRelativeTo(owner); - dialog.setSize(new Dimension(300, 400)); - dialog.setModal(true); - - final BorderLayout layoutManager = new BorderLayout(); - - final JPanel panel = new JPanel(layoutManager); - - dialog.add(panel); - - disclaimerTextArea = new JTextArea(); - disclaimerTextArea.setEditable(false); - disclaimerTextArea.setLineWrap(true); - disclaimerTextArea.setWrapStyleWord(true); - final JScrollPane scrollPane = new JScrollPane(disclaimerTextArea); - panel.add(scrollPane, BorderLayout.CENTER); - scrollPane.setPreferredSize(new Dimension(250, 250)); - - final JButton close = new JButton(Messages.getString("CollectEarthWindow.5")); //$NON-NLS-1$ - close.addActionListener( e -> dialog.setVisible(false) ); - panel.add(close, BorderLayout.SOUTH); - } - - @Override - public void actionPerformed(ActionEvent e) { - disclaimerTextArea.setText(getTextContents()); - dialog.setVisible(true); - } - - private String getTextContents() { - try { - - return FileUtils.readFileToString(new File( filePath ), StandardCharsets.UTF_8); - } catch (final IOException e) { - logger.error(Messages.getString("OpenTextFileListener.0") + filePath.toString(), e); //$NON-NLS-1$ - return Messages.getString("CollectEarthWindow.8"); //$NON-NLS-1$ - } +public abstract class ProcessMonitorDialog extends Thread { + + private static final int MAX_ERRORS_SHOWN = 10; + ProgressMonitor progressMonitor; + Logger logger = LoggerFactory.getLogger(ProcessMonitorDialog.class); + AbstractProcess process; + + + protected abstract String getProcessActionMessage(); + + public synchronized void monitorProgress() { + + new Thread("Monitoring progress of a process") { + @Override + public void run() { + boolean keepRunning = true; + while (keepRunning) { + if (process.getStatus() != null) { + SwingUtilities.invokeLater( () -> { + progressMonitor.setProgress(process.getStatus().getProgressPercent()); + progressMonitor.setNote(getProcessActionMessage() + process.getStatus().getProcessed() + "/" //$NON-NLS-1$ //$NON-NLS-2$ + + process.getStatus().getTotal()); + }); + + if (progressMonitor.isCanceled() || process.getStatus().isComplete() || process.getStatus().isError() ) { + SwingUtilities.invokeLater( () -> { + progressMonitor.close(); + if( process.getStatus().isError() ){ + StringBuilder parsisngErrorMsg = new StringBuilder("\r\n"); //$NON-NLS-1$ + if( process instanceof CSVDataImportProcess ){ + List errors = ((CSVDataImportProcess) process ).getStatus().getErrors(); + + int numberOfErrors = 0; + for (ParsingError parsingError : errors) { + parsisngErrorMsg.append(Messages.getString("ProcessMonitorDialog.1")).append( parsingError.getRow() ).append(" - ").append( parsingError.getMessage() ).append(", ").append( parsingError.getErrorType() ).append(Messages.getString("ProcessMonitorDialog.4")).append( ArrayUtils.toString(parsingError.getColumns()) ).append(Messages.getString("ProcessMonitorDialog.5")).append( ArrayUtils.toString(parsingError.getMessageArgs()) ).append("\r\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ + numberOfErrors ++; + if( numberOfErrors > MAX_ERRORS_SHOWN ){ + break; + } + } + + if( errors.size() > MAX_ERRORS_SHOWN ){ + parsisngErrorMsg.append( "More lines not shown . Total warnings : " + errors.size() ); + } + + } + + String primaryErrorMsg = process.getStatus().getErrorMessage(); + JOptionPane.showMessageDialog(null, "Attention : " + ( primaryErrorMsg!=null?primaryErrorMsg:"") + parsisngErrorMsg.toString() ); //$NON-NLS-1$ //$NON-NLS-2$ + } + }); + Toolkit.getDefaultToolkit().beep(); + if ( !process.getStatus().isComplete() && !process.getStatus().isError() ) { + process.cancel(); + logger.warn("Task canceled.\n"); //$NON-NLS-1$ + } + keepRunning = false; + } + } + + try { + Thread.sleep( 1000 ); + } catch (InterruptedException e) { + logger.error("Error whille waiting in thread", e); //$NON-NLS-1$ + Thread.currentThread().interrupt(); + } + } + } + }.start(); } } From 56a3de87b24aaca00b9430ed8e44d54021600c91 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:00 +0100 Subject: [PATCH 1235/1620] New translations JPlotCsvTable.java (English) --- .../earth/app/view/Messages_en.properties | 259 ++++++++++++++---- 1 file changed, 210 insertions(+), 49 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index a3e291cd48..e15ddb90b9 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,72 +1,233 @@ package org.openforis.collect.earth.app.view; -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.Frame; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; +import java.awt.Color; +import java.awt.Component; +import java.awt.event.MouseEvent; import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; - -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; - -import org.apache.commons.io.FileUtils; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JOptionPane; +import javax.swing.JTable; +import javax.swing.table.DefaultTableModel; +import javax.swing.table.TableCellRenderer; + +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult; +import org.openforis.collect.io.metadata.collectearth.CSVRowValidationResult; +import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; +import org.openforis.collect.manager.validation.SurveyValidator.ValidationParameters; +import org.openforis.collect.model.CollectSurvey; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class OpenTextFileListener implements ActionListener { - - JDialog dialog; - private final Logger logger = LoggerFactory.getLogger(OpenTextFileListener.class); - JTextArea disclaimerTextArea; - private String filePath; +import com.opencsv.CSVReader; + +/** + * Swing JTable used in the OptionWizard dialog. + * It contains methods to refresh the information loaded on the cells. + * @author Alfonso Sanchez-Paus Diaz + * + */ +public class JPlotCsvTable extends JTable{ + + private static final Color WARNING_BG_COLOR = new Color(254, 255, 196); + private static final Color ERROR_BG_COLOR = new Color(218, 152, 152); + private static final long serialVersionUID = 3456854921119125693L; + private static final int LIMIT_LOADED_CSV_LINES = 400; + private final transient Logger logger = LoggerFactory.getLogger(this.getClass()); + private transient CollectSurvey forSurvey; + private transient CSVFileValidationResult validationResults; + + + /** + * Build a new JTable that contains the data from the CSV that is set as the file that contains the plots used by Collect Earth + * @param pathToCsvWithPlots Path to the file containing the plot locations that should be loaded in the table + * @param forSurvey Survey that the csv file belongs to + */ + public JPlotCsvTable(String pathToCsvWithPlots, CollectSurvey forSurvey) { + super(); + this.forSurvey = forSurvey; - public OpenTextFileListener(Frame owner, String filePath, String title) { + try { + refreshTable(pathToCsvWithPlots); + } catch (Exception e) { + logger.error("Error loading plot file"); + this.setBackground(Color.RED); + this.setToolTipText("The file chosen does not contain plot information"); - this.filePath = filePath; - dialog = new JDialog(owner, title + " " + filePath); //$NON-NLS-1$ - dialog.setLocationRelativeTo(owner); - dialog.setSize(new Dimension(300, 400)); - dialog.setModal(true); + } + } - final BorderLayout layoutManager = new BorderLayout(); + /** + * The data of the CSV file is validated when the CSV/CED is loaded. This method determines if the data currently loaded is valid or not + * @return True if the data is valid. False otherwise + */ + public boolean isDataValid(){ + return validationResults==null?true:validationResults.isSuccessful(); + } - final JPanel panel = new JPanel(layoutManager); - dialog.add(panel); + @Override + public Component prepareRenderer(TableCellRenderer renderer, int row, int col) { + Component comp = super.prepareRenderer(renderer, row, col); - disclaimerTextArea = new JTextArea(); - disclaimerTextArea.setEditable(false); - disclaimerTextArea.setLineWrap(true); - disclaimerTextArea.setWrapStyleWord(true); - final JScrollPane scrollPane = new JScrollPane(disclaimerTextArea); - panel.add(scrollPane, BorderLayout.CENTER); - scrollPane.setPreferredSize(new Dimension(250, 250)); + if ( cellHasError(row,col)){ + comp.setBackground( ERROR_BG_COLOR ); + }else{ + comp.setBackground(Color.WHITE); + } - final JButton close = new JButton(Messages.getString("CollectEarthWindow.5")); //$NON-NLS-1$ - close.addActionListener( e -> dialog.setVisible(false) ); - panel.add(close, BorderLayout.SOUTH); + return comp; } @Override - public void actionPerformed(ActionEvent e) { - disclaimerTextArea.setText(getTextContents()); - dialog.setVisible(true); + public String getToolTipText(MouseEvent event) { + String tip = null; + java.awt.Point p = event.getPoint(); + int row = rowAtPoint(p); + int col = columnAtPoint(p); + + try { + tip = getCellErrorMessage(row, col); + } catch (RuntimeException e1) { + //catch null pointer exception if mouse is over an empty line + } + + return tip; + } - private String getTextContents() { - try { + private boolean cellHasError(Integer row, Integer col) { + String errorMessage = getCellErrorMessage(row, col); + return errorMessage!=null; + } + + private String getCellErrorMessage(Integer row, Integer col) { + if( validationResults != null ){ + List rowValidations = validationResults.getRowValidations(); + for (CSVRowValidationResult csvRowValidationResult : rowValidations) { + if( csvRowValidationResult.getRowNumber().equals(row+1) && csvRowValidationResult.getColumnPosition().equals( col ) ){ + return csvRowValidationResult.getMessage(); + } + } + } + return null; + } + + /** + * Refreshes the data loaded in the table. Used when the user changes the file that contains the CSV file using the OptionWizard dialog. + * @param csvFilePath The path to the CSV file that contains the plot locations + */ + public void refreshTable(String csvFilePath) { + + if( csvFilePath.trim().length() == 0 ) + return; + + this.removeAll(); + boolean errorLoading = false; + final File csvFile = new File(csvFilePath); + + if (csvFile.exists()) { + DefaultTableModel newTableModel = getPlotTableModel( csvFilePath ); - return FileUtils.readFileToString(new File( filePath ), StandardCharsets.UTF_8); - } catch (final IOException e) { - logger.error(Messages.getString("OpenTextFileListener.0") + filePath.toString(), e); //$NON-NLS-1$ - return Messages.getString("CollectEarthWindow.8"); //$NON-NLS-1$ + validateCsvFile(csvFilePath); + + if (newTableModel.getRowCount() == 0) { + errorLoading = true; + } else { + this.setModel(newTableModel); + } + } else { + errorLoading = true; + } + + if (errorLoading) { + this.setBackground(CollectEarthWindow.ERROR_COLOR); + this.setModel(new DefaultTableModel()); } } + private String[] getColumnNames() { + // Check if the first line is actually a header. Possible if the first header column coincides with ID, PLOT_ID or PLOT + CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); + return cegtg.getExpectedHeaders( forSurvey ).toArray( new String[]{} ); + + } + + private DefaultTableModel getPlotTableModel(String csvFilePath) { + + String[][] allValues = new String[0][0]; + + try ( CSVReader reader = CsvReaderUtils.getCsvReader(csvFilePath) ){ + String[] line; + List allLines = new ArrayList<>(); + int i =0; + while( ( line = reader.readNext() ) != null && i< LIMIT_LOADED_CSV_LINES ) { // we do this to avoid out of memory errors + i++; + allLines.add( line ); + } + + allValues = allLines.toArray(new String[][] {}); + } catch (Exception e) { + logger.error(" Error reading the CSV file " + csvFilePath, e); + } + + return new DefaultTableModel( allValues , getColumnNames()); + } + + protected void validateCsvFile(String csvFilePath) { + + CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); + ValidationParameters validationParameters = new ValidationParameters(); + validationParameters.setValidateOnlyFirstLines( false ); + CSVFileValidationResult validation = cegtg.validate( new File(csvFilePath), forSurvey, validationParameters); + + this.setBackground( Color.white ); + + + if( !validation.isSuccessful() ){ + switch ( validation.getErrorType() ) { + case INVALID_FILE_TYPE: + case INVALID_NUMBER_OF_COLUMNS: + JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); + JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The expected file type is CSV or CED ", "Expected File Type", JOptionPane.ERROR_MESSAGE); + break; + + case INVALID_HEADERS: + JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); + JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The expected columns in the CSV are " + validation.getExpectedHeaders(), "Columns in CSV do not match survey", JOptionPane.ERROR_MESSAGE); + validation = null; // not bad enough to stop the user from loading the CSV file + break; + case INVALID_NUMBER_OF_PLOTS_TOO_LARGE: + JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); + JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "Using CSV files that are too large makes Google Earth extremely slow.\nPlease divide this CSV file into smaller file (reccomended less than 2000 plots per CSV file.\nNumber of plots in this file : " + validation.getNumberOfRows() , "File too large", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + validation = null; // not bad enough to stop the user from loading the CSV file + break; + + case INVALID_NUMBER_OF_PLOTS_WARNING: + JPlotCsvTable.this.setBackground( WARNING_BG_COLOR); + JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "Using CSV files that are too large makes Google Earth slow.\n Please divide this CSV file into smaller file (reccomended size is less than 2000 plots per CSV file.\nNumber of plots in this file : " + validation.getNumberOfRows() , "File too large", JOptionPane.WARNING_MESSAGE); //$NON-NLS-1$ + validation = null; // not bad enough to stop the user from loading the CSV file + break; + + case INVALID_VALUES_IN_CSV: + // IN THIS CASE THE CELL RENDERER TAKES CARE OF HIGHLIGHTING THE CELLS!!! + JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The content of the CSV file is not correct!! The values on the cells highlighted are incorrect " , "CSV content is not correct", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + break; + + default: + break; + } + } + + + this.setValidationResults( validation ); + } + + + private void setValidationResults(CSVFileValidationResult validationResults) { + this.validationResults = validationResults; + } + } From 5faa30abe9efe3690179533a0c2bcd99e6778b88 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:01 +0100 Subject: [PATCH 1236/1620] New translations JPlotCsvTable.java (Spanish) --- .../earth/app/view/Messages_es.properties | 259 ++++++++++++++---- 1 file changed, 210 insertions(+), 49 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index a3e291cd48..e15ddb90b9 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,72 +1,233 @@ package org.openforis.collect.earth.app.view; -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.Frame; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; +import java.awt.Color; +import java.awt.Component; +import java.awt.event.MouseEvent; import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; - -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; - -import org.apache.commons.io.FileUtils; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JOptionPane; +import javax.swing.JTable; +import javax.swing.table.DefaultTableModel; +import javax.swing.table.TableCellRenderer; + +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult; +import org.openforis.collect.io.metadata.collectearth.CSVRowValidationResult; +import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; +import org.openforis.collect.manager.validation.SurveyValidator.ValidationParameters; +import org.openforis.collect.model.CollectSurvey; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class OpenTextFileListener implements ActionListener { - - JDialog dialog; - private final Logger logger = LoggerFactory.getLogger(OpenTextFileListener.class); - JTextArea disclaimerTextArea; - private String filePath; +import com.opencsv.CSVReader; + +/** + * Swing JTable used in the OptionWizard dialog. + * It contains methods to refresh the information loaded on the cells. + * @author Alfonso Sanchez-Paus Diaz + * + */ +public class JPlotCsvTable extends JTable{ + + private static final Color WARNING_BG_COLOR = new Color(254, 255, 196); + private static final Color ERROR_BG_COLOR = new Color(218, 152, 152); + private static final long serialVersionUID = 3456854921119125693L; + private static final int LIMIT_LOADED_CSV_LINES = 400; + private final transient Logger logger = LoggerFactory.getLogger(this.getClass()); + private transient CollectSurvey forSurvey; + private transient CSVFileValidationResult validationResults; + + + /** + * Build a new JTable that contains the data from the CSV that is set as the file that contains the plots used by Collect Earth + * @param pathToCsvWithPlots Path to the file containing the plot locations that should be loaded in the table + * @param forSurvey Survey that the csv file belongs to + */ + public JPlotCsvTable(String pathToCsvWithPlots, CollectSurvey forSurvey) { + super(); + this.forSurvey = forSurvey; - public OpenTextFileListener(Frame owner, String filePath, String title) { + try { + refreshTable(pathToCsvWithPlots); + } catch (Exception e) { + logger.error("Error loading plot file"); + this.setBackground(Color.RED); + this.setToolTipText("The file chosen does not contain plot information"); - this.filePath = filePath; - dialog = new JDialog(owner, title + " " + filePath); //$NON-NLS-1$ - dialog.setLocationRelativeTo(owner); - dialog.setSize(new Dimension(300, 400)); - dialog.setModal(true); + } + } - final BorderLayout layoutManager = new BorderLayout(); + /** + * The data of the CSV file is validated when the CSV/CED is loaded. This method determines if the data currently loaded is valid or not + * @return True if the data is valid. False otherwise + */ + public boolean isDataValid(){ + return validationResults==null?true:validationResults.isSuccessful(); + } - final JPanel panel = new JPanel(layoutManager); - dialog.add(panel); + @Override + public Component prepareRenderer(TableCellRenderer renderer, int row, int col) { + Component comp = super.prepareRenderer(renderer, row, col); - disclaimerTextArea = new JTextArea(); - disclaimerTextArea.setEditable(false); - disclaimerTextArea.setLineWrap(true); - disclaimerTextArea.setWrapStyleWord(true); - final JScrollPane scrollPane = new JScrollPane(disclaimerTextArea); - panel.add(scrollPane, BorderLayout.CENTER); - scrollPane.setPreferredSize(new Dimension(250, 250)); + if ( cellHasError(row,col)){ + comp.setBackground( ERROR_BG_COLOR ); + }else{ + comp.setBackground(Color.WHITE); + } - final JButton close = new JButton(Messages.getString("CollectEarthWindow.5")); //$NON-NLS-1$ - close.addActionListener( e -> dialog.setVisible(false) ); - panel.add(close, BorderLayout.SOUTH); + return comp; } @Override - public void actionPerformed(ActionEvent e) { - disclaimerTextArea.setText(getTextContents()); - dialog.setVisible(true); + public String getToolTipText(MouseEvent event) { + String tip = null; + java.awt.Point p = event.getPoint(); + int row = rowAtPoint(p); + int col = columnAtPoint(p); + + try { + tip = getCellErrorMessage(row, col); + } catch (RuntimeException e1) { + //catch null pointer exception if mouse is over an empty line + } + + return tip; + } - private String getTextContents() { - try { + private boolean cellHasError(Integer row, Integer col) { + String errorMessage = getCellErrorMessage(row, col); + return errorMessage!=null; + } + + private String getCellErrorMessage(Integer row, Integer col) { + if( validationResults != null ){ + List rowValidations = validationResults.getRowValidations(); + for (CSVRowValidationResult csvRowValidationResult : rowValidations) { + if( csvRowValidationResult.getRowNumber().equals(row+1) && csvRowValidationResult.getColumnPosition().equals( col ) ){ + return csvRowValidationResult.getMessage(); + } + } + } + return null; + } + + /** + * Refreshes the data loaded in the table. Used when the user changes the file that contains the CSV file using the OptionWizard dialog. + * @param csvFilePath The path to the CSV file that contains the plot locations + */ + public void refreshTable(String csvFilePath) { + + if( csvFilePath.trim().length() == 0 ) + return; + + this.removeAll(); + boolean errorLoading = false; + final File csvFile = new File(csvFilePath); + + if (csvFile.exists()) { + DefaultTableModel newTableModel = getPlotTableModel( csvFilePath ); - return FileUtils.readFileToString(new File( filePath ), StandardCharsets.UTF_8); - } catch (final IOException e) { - logger.error(Messages.getString("OpenTextFileListener.0") + filePath.toString(), e); //$NON-NLS-1$ - return Messages.getString("CollectEarthWindow.8"); //$NON-NLS-1$ + validateCsvFile(csvFilePath); + + if (newTableModel.getRowCount() == 0) { + errorLoading = true; + } else { + this.setModel(newTableModel); + } + } else { + errorLoading = true; + } + + if (errorLoading) { + this.setBackground(CollectEarthWindow.ERROR_COLOR); + this.setModel(new DefaultTableModel()); } } + private String[] getColumnNames() { + // Check if the first line is actually a header. Possible if the first header column coincides with ID, PLOT_ID or PLOT + CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); + return cegtg.getExpectedHeaders( forSurvey ).toArray( new String[]{} ); + + } + + private DefaultTableModel getPlotTableModel(String csvFilePath) { + + String[][] allValues = new String[0][0]; + + try ( CSVReader reader = CsvReaderUtils.getCsvReader(csvFilePath) ){ + String[] line; + List allLines = new ArrayList<>(); + int i =0; + while( ( line = reader.readNext() ) != null && i< LIMIT_LOADED_CSV_LINES ) { // we do this to avoid out of memory errors + i++; + allLines.add( line ); + } + + allValues = allLines.toArray(new String[][] {}); + } catch (Exception e) { + logger.error(" Error reading the CSV file " + csvFilePath, e); + } + + return new DefaultTableModel( allValues , getColumnNames()); + } + + protected void validateCsvFile(String csvFilePath) { + + CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); + ValidationParameters validationParameters = new ValidationParameters(); + validationParameters.setValidateOnlyFirstLines( false ); + CSVFileValidationResult validation = cegtg.validate( new File(csvFilePath), forSurvey, validationParameters); + + this.setBackground( Color.white ); + + + if( !validation.isSuccessful() ){ + switch ( validation.getErrorType() ) { + case INVALID_FILE_TYPE: + case INVALID_NUMBER_OF_COLUMNS: + JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); + JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The expected file type is CSV or CED ", "Expected File Type", JOptionPane.ERROR_MESSAGE); + break; + + case INVALID_HEADERS: + JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); + JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The expected columns in the CSV are " + validation.getExpectedHeaders(), "Columns in CSV do not match survey", JOptionPane.ERROR_MESSAGE); + validation = null; // not bad enough to stop the user from loading the CSV file + break; + case INVALID_NUMBER_OF_PLOTS_TOO_LARGE: + JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); + JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "Using CSV files that are too large makes Google Earth extremely slow.\nPlease divide this CSV file into smaller file (reccomended less than 2000 plots per CSV file.\nNumber of plots in this file : " + validation.getNumberOfRows() , "File too large", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + validation = null; // not bad enough to stop the user from loading the CSV file + break; + + case INVALID_NUMBER_OF_PLOTS_WARNING: + JPlotCsvTable.this.setBackground( WARNING_BG_COLOR); + JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "Using CSV files that are too large makes Google Earth slow.\n Please divide this CSV file into smaller file (reccomended size is less than 2000 plots per CSV file.\nNumber of plots in this file : " + validation.getNumberOfRows() , "File too large", JOptionPane.WARNING_MESSAGE); //$NON-NLS-1$ + validation = null; // not bad enough to stop the user from loading the CSV file + break; + + case INVALID_VALUES_IN_CSV: + // IN THIS CASE THE CELL RENDERER TAKES CARE OF HIGHLIGHTING THE CELLS!!! + JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The content of the CSV file is not correct!! The values on the cells highlighted are incorrect " , "CSV content is not correct", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + break; + + default: + break; + } + } + + + this.setValidationResults( validation ); + } + + + private void setValidationResults(CSVFileValidationResult validationResults) { + this.validationResults = validationResults; + } + } From b5d09be2850c6360e617317beefeb639c5879c7c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:04 +0100 Subject: [PATCH 1237/1620] New translations ImportActionListener.java (Spanish) --- .../earth/app/view/Messages_es.properties | 367 ++++++++---------- 1 file changed, 171 insertions(+), 196 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index e15ddb90b9..88aa8edf1c 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,233 +1,208 @@ package org.openforis.collect.earth.app.view; -import java.awt.Color; -import java.awt.Component; -import java.awt.event.MouseEvent; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.BufferedReader; import java.io.File; -import java.util.ArrayList; -import java.util.List; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Arrays; +import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.JTable; -import javax.swing.table.DefaultTableModel; -import javax.swing.table.TableCellRenderer; - -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult; -import org.openforis.collect.io.metadata.collectearth.CSVRowValidationResult; -import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; -import org.openforis.collect.manager.validation.SurveyValidator.ValidationParameters; -import org.openforis.collect.model.CollectSurvey; + +import org.apache.commons.io.IOUtils; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.DataImportExportService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.io.data.CSVDataImportProcess; +import org.openforis.collect.io.data.XMLDataImportProcess; +import org.openforis.collect.manager.process.ProcessStatus; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.opencsv.CSVReader; - -/** - * Swing JTable used in the OptionWizard dialog. - * It contains methods to refresh the information loaded on the cells. - * @author Alfonso Sanchez-Paus Diaz - * - */ -public class JPlotCsvTable extends JTable{ - - private static final Color WARNING_BG_COLOR = new Color(254, 255, 196); - private static final Color ERROR_BG_COLOR = new Color(218, 152, 152); - private static final long serialVersionUID = 3456854921119125693L; - private static final int LIMIT_LOADED_CSV_LINES = 400; - private final transient Logger logger = LoggerFactory.getLogger(this.getClass()); - private transient CollectSurvey forSurvey; - private transient CSVFileValidationResult validationResults; - - - /** - * Build a new JTable that contains the data from the CSV that is set as the file that contains the plots used by Collect Earth - * @param pathToCsvWithPlots Path to the file containing the plot locations that should be loaded in the table - * @param forSurvey Survey that the csv file belongs to - */ - public JPlotCsvTable(String pathToCsvWithPlots, CollectSurvey forSurvey) { - super(); - this.forSurvey = forSurvey; - - try { - refreshTable(pathToCsvWithPlots); - } catch (Exception e) { - logger.error("Error loading plot file"); - this.setBackground(Color.RED); - this.setToolTipText("The file chosen does not contain plot information"); - - } - } - - /** - * The data of the CSV file is validated when the CSV/CED is loaded. This method determines if the data currently loaded is valid or not - * @return True if the data is valid. False otherwise - */ - public boolean isDataValid(){ - return validationResults==null?true:validationResults.isSuccessful(); +public final class ImportActionListener implements ActionListener { + protected static final Integer YES = 0; + protected static final Integer YES_TO_ALL = 1; + protected static final Integer NO = 2; + protected static final Integer NO_TO_ALL = 3; + + private final DataFormat importFormat; + private JFrame frame; + private LocalPropertiesService localPropertiesService; + private DataImportExportService dataImportService; + private Logger logger = LoggerFactory.getLogger( ImportActionListener.class ); + + public ImportActionListener(DataFormat importFormat, JFrame frame, LocalPropertiesService localPropertiesService, DataImportExportService dataImportService) { + this.importFormat = importFormat; + this.frame = frame; + this.localPropertiesService = localPropertiesService; + this.dataImportService = dataImportService; } - @Override - public Component prepareRenderer(TableCellRenderer renderer, int row, int col) { - Component comp = super.prepareRenderer(renderer, row, col); - - if ( cellHasError(row,col)){ - comp.setBackground( ERROR_BG_COLOR ); - }else{ - comp.setBackground(Color.WHITE); + public void actionPerformed(ActionEvent e) { + try{ + CollectEarthWindow.startWaiting(frame); + importDataFrom(e, importFormat ); + }finally{ + CollectEarthWindow.endWaiting( frame); } - return comp; - } - - @Override - public String getToolTipText(MouseEvent event) { - String tip = null; - java.awt.Point p = event.getPoint(); - int row = rowAtPoint(p); - int col = columnAtPoint(p); - - try { - tip = getCellErrorMessage(row, col); - } catch (RuntimeException e1) { - //catch null pointer exception if mouse is over an empty line - } - - return tip; - } + + private void forceRefreshGoogleEarth() { - private boolean cellHasError(Integer row, Integer col) { - String errorMessage = getCellErrorMessage(row, col); - return errorMessage!=null; - } + EarthApp.executeKmlLoadAsynchronously( null ); - private String getCellErrorMessage(Integer row, Integer col) { - if( validationResults != null ){ - List rowValidations = validationResults.getRowValidations(); - for (CSVRowValidationResult csvRowValidationResult : rowValidations) { - if( csvRowValidationResult.getRowNumber().equals(row+1) && csvRowValidationResult.getColumnPosition().equals( col ) ){ - return csvRowValidationResult.getMessage(); - } - } - } - return null; } - - /** - * Refreshes the data loaded in the table. Used when the user changes the file that contains the CSV file using the OptionWizard dialog. - * @param csvFilePath The path to the CSV file that contains the plot locations - */ - public void refreshTable(String csvFilePath) { - - if( csvFilePath.trim().length() == 0 ) - return; - - this.removeAll(); - boolean errorLoading = false; - final File csvFile = new File(csvFilePath); - - if (csvFile.exists()) { - DefaultTableModel newTableModel = getPlotTableModel( csvFilePath ); - - validateCsvFile(csvFilePath); - - if (newTableModel.getRowCount() == 0) { - errorLoading = true; - } else { - this.setModel(newTableModel); + private Integer shouldImportNonFinishedRecords( boolean moreThanOneFiles ) { + String message = "" //$NON-NLS-1$ + + Messages.getString("ImportActionListener.0") //$NON-NLS-1$ + +"
" //$NON-NLS-1$ + + Messages.getString("ImportActionListener.2") //$NON-NLS-1$ + + ""; + + if( !moreThanOneFiles ){ + + final int selectedOption = JOptionPane.showConfirmDialog(null, + message //$NON-NLS-1$ + ,Messages.getString("ImportActionListener.3"), //$NON-NLS-1$ + JOptionPane.YES_NO_OPTION); + + if (selectedOption == JOptionPane.YES_OPTION){ + return YES; + }else if (selectedOption == JOptionPane.NO_OPTION){ + return NO; + }else{ + return JOptionPane.CLOSED_OPTION; } - } else { - errorLoading = true; - } - - if (errorLoading) { - this.setBackground(CollectEarthWindow.ERROR_COLOR); - this.setModel(new DefaultTableModel()); - } - } - - private String[] getColumnNames() { - // Check if the first line is actually a header. Possible if the first header column coincides with ID, PLOT_ID or PLOT - CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); - return cegtg.getExpectedHeaders( forSurvey ).toArray( new String[]{} ); - - } - - private DefaultTableModel getPlotTableModel(String csvFilePath) { + }else{ - String[][] allValues = new String[0][0]; + String[] buttons = { Messages.getString("YES"), Messages.getString("YES_TO_ALL"), Messages.getString("NO"), Messages.getString("NO_TO_ALL") }; - try ( CSVReader reader = CsvReaderUtils.getCsvReader(csvFilePath) ){ - String[] line; - List allLines = new ArrayList<>(); - int i =0; - while( ( line = reader.readNext() ) != null && i< LIMIT_LOADED_CSV_LINES ) { // we do this to avoid out of memory errors - i++; - allLines.add( line ); - } + return JOptionPane.showOptionDialog(null, message, Messages.getString("ImportActionListener.3") , + JOptionPane.WARNING_MESSAGE, 0, null, buttons, buttons[1]); - allValues = allLines.toArray(new String[][] {}); - } catch (Exception e) { - logger.error(" Error reading the CSV file " + csvFilePath, e); } - - return new DefaultTableModel( allValues , getColumnNames()); } - protected void validateCsvFile(String csvFilePath) { - - CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); - ValidationParameters validationParameters = new ValidationParameters(); - validationParameters.setValidateOnlyFirstLines( false ); - CSVFileValidationResult validation = cegtg.validate( new File(csvFilePath), forSurvey, validationParameters); - - this.setBackground( Color.white ); - - - if( !validation.isSuccessful() ){ - switch ( validation.getErrorType() ) { - case INVALID_FILE_TYPE: - case INVALID_NUMBER_OF_COLUMNS: - JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); - JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The expected file type is CSV or CED ", "Expected File Type", JOptionPane.ERROR_MESSAGE); + private void importDataFrom(final ActionEvent e, final DataFormat importType) { + File[] filesToImport = JFileChooserExistsAware.getFileChooserResults( importType, false, true, null, localPropertiesService, frame ); + final ImportXMLDialogProcessMonitor importDialogProcessMonitor = new ImportXMLDialogProcessMonitor(); + if (filesToImport != null) { + + + switch (importType) { + case ZIP_WITH_XML: + new Thread("XML Import Thread " ){ //$NON-NLS-1$ + @Override + public void run() { + Integer importNonFinishedPlots = shouldImportNonFinishedRecords( filesToImport.length > 1); + boolean firstFile = true; + + for (final File importedFile : filesToImport) { + XMLDataImportProcess dataImportProcess = null; + try{ + if ( firstFile ){ + firstFile = false; + }else if ( !firstFile && (importNonFinishedPlots.equals( YES ) || importNonFinishedPlots.equals( NO ) ) ){ + importNonFinishedPlots = shouldImportNonFinishedRecords( filesToImport.length > 1); + } + + if( importNonFinishedPlots.equals( JOptionPane.CLOSED_OPTION ) ){ + break; + } + + boolean importNotFinished= importNonFinishedPlots.equals( YES ) || importNonFinishedPlots.equals( YES_TO_ALL ); + + dataImportProcess = dataImportService.getImportSummary(importedFile, importNotFinished); + importDialogProcessMonitor.startImport(dataImportProcess, frame, dataImportService, importedFile ); + + } catch (Exception e1) { + logger.error("Error importing data" , e1); //$NON-NLS-1$ + importDialogProcessMonitor.closeProgressmonitor(); + JOptionPane.showMessageDialog( frame, importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.3"), importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.7"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + JOptionPane.ERROR_MESSAGE); + logger.error("Error importing data from " + importedFile.getAbsolutePath() + " in format " + importType.name() , e1); //$NON-NLS-1$ //$NON-NLS-2$ + } finally { + IOUtils.closeQuietly(dataImportProcess); + } + } + forceRefreshGoogleEarth(); + } + }.start(); break; - - case INVALID_HEADERS: - JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); - JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The expected columns in the CSV are " + validation.getExpectedHeaders(), "Columns in CSV do not match survey", JOptionPane.ERROR_MESSAGE); - validation = null; // not bad enough to stop the user from loading the CSV file + case CSV: + new Thread("Update using CSV Thread " ){ //$NON-NLS-1$ + @Override + public void run() { + + String[] ids = dataImportService.getEarthSurveyService().getKeyNamesForSurvey(); + String keyAttributesForSurvey = Arrays.toString( ids ); + + JOptionPane.showMessageDialog( + frame, + "The CSV files used must have columns with at least the headers for the key attributes " + keyAttributesForSurvey+ " followed by one or more attribute names ( see http://www.openforis.org/support/questions/80/changing-plot-attributes-in-the-collect-earth-database ) ", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + "CSV file format info", + JOptionPane.INFORMATION_MESSAGE); + + + for (final File importedFile : filesToImport) { + + CSVDataImportProcess importSurveyAsCsv = null; + try { + importSurveyAsCsv = dataImportService.getCsvImporterProcess(importedFile); + + if( importSurveyAsCsv != null ){ + importSurveyAsCsv.init(); + ProcessStatus status = importSurveyAsCsv.getStatus(); + status.setTotal( getTotalNumberOfLines( importedFile ) ); + if ( status != null && ! importSurveyAsCsv.getStatus().isError() ) { + ImportProcessMonitorDialog importProcessWorker = new ImportProcessMonitorDialog(importSurveyAsCsv, frame ); + importProcessWorker.start(); + } + } + } catch (Exception e1) { + JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.7") + "\n" + e1.getMessage(), importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.3"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + JOptionPane.ERROR_MESSAGE); + logger.error("Error importing data from " + importedFile.getAbsolutePath() + " in format " + importType , e1); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + } + }.start(); break; - case INVALID_NUMBER_OF_PLOTS_TOO_LARGE: - JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); - JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "Using CSV files that are too large makes Google Earth extremely slow.\nPlease divide this CSV file into smaller file (reccomended less than 2000 plots per CSV file.\nNumber of plots in this file : " + validation.getNumberOfRows() , "File too large", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - validation = null; // not bad enough to stop the user from loading the CSV file + case FUSION: break; - - case INVALID_NUMBER_OF_PLOTS_WARNING: - JPlotCsvTable.this.setBackground( WARNING_BG_COLOR); - JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "Using CSV files that are too large makes Google Earth slow.\n Please divide this CSV file into smaller file (reccomended size is less than 2000 plots per CSV file.\nNumber of plots in this file : " + validation.getNumberOfRows() , "File too large", JOptionPane.WARNING_MESSAGE); //$NON-NLS-1$ - validation = null; // not bad enough to stop the user from loading the CSV file - break; - - case INVALID_VALUES_IN_CSV: - // IN THIS CASE THE CELL RENDERER TAKES CARE OF HIGHLIGHTING THE CELLS!!! - JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The content of the CSV file is not correct!! The values on the cells highlighted are incorrect " , "CSV content is not correct", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - break; - default: break; } } + } + private long getTotalNumberOfLines(File importedFile) { + long count = 0; + BufferedReader br = null; + try { + br = new BufferedReader(new InputStreamReader(new FileInputStream(importedFile))); - this.setValidationResults( validation ); - } + while ( br.readLine() != null) { + count++; + } + } catch (IOException e) { + logger.error("Error counting the number of lines in file " + importedFile.getAbsolutePath() , e) ; //$NON-NLS-1$ + }finally { + if( br!=null) { + try { + br.close(); + } catch (IOException e) { + logger.error("Error closing file reader " + importedFile.getAbsolutePath() , e) ; + } + } - private void setValidationResults(CSVFileValidationResult validationResults) { - this.validationResults = validationResults; + } + return count; } - } From ccbeff04dd323c2d367e7c4ade66e1559b6c7b15 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:05 +0100 Subject: [PATCH 1238/1620] New translations InfiniteProgressMonitor.java (French) --- .../earth/app/view/Messages_fr.properties | 234 ++++++++++++------ 1 file changed, 159 insertions(+), 75 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index aee91325a9..ca537bed7a 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,89 +1,173 @@ package org.openforis.collect.earth.app.view; -import java.awt.Toolkit; -import java.util.List; +import java.awt.Component; +import javax.swing.JDialog; +import javax.swing.JLabel; import javax.swing.JOptionPane; -import javax.swing.ProgressMonitor; +import javax.swing.JProgressBar; import javax.swing.SwingUtilities; -import org.apache.commons.lang3.ArrayUtils; -import org.openforis.collect.io.data.CSVDataImportProcess; -import org.openforis.collect.io.metadata.parsing.ParsingError; -import org.openforis.collect.manager.process.AbstractProcess; -import org.openforis.collect.manager.process.ProcessStatus; +import org.apache.commons.lang3.StringUtils; +import org.openforis.concurrency.Progress; +import org.openforis.concurrency.ProgressListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public abstract class ProcessMonitorDialog extends Thread { - - private static final int MAX_ERRORS_SHOWN = 10; - ProgressMonitor progressMonitor; - Logger logger = LoggerFactory.getLogger(ProcessMonitorDialog.class); - AbstractProcess process; - - - protected abstract String getProcessActionMessage(); - - public synchronized void monitorProgress() { - - new Thread("Monitoring progress of a process") { - @Override - public void run() { - boolean keepRunning = true; - while (keepRunning) { - if (process.getStatus() != null) { - SwingUtilities.invokeLater( () -> { - progressMonitor.setProgress(process.getStatus().getProgressPercent()); - progressMonitor.setNote(getProcessActionMessage() + process.getStatus().getProcessed() + "/" //$NON-NLS-1$ //$NON-NLS-2$ - + process.getStatus().getTotal()); - }); - - if (progressMonitor.isCanceled() || process.getStatus().isComplete() || process.getStatus().isError() ) { - SwingUtilities.invokeLater( () -> { - progressMonitor.close(); - if( process.getStatus().isError() ){ - StringBuilder parsisngErrorMsg = new StringBuilder("\r\n"); //$NON-NLS-1$ - if( process instanceof CSVDataImportProcess ){ - List errors = ((CSVDataImportProcess) process ).getStatus().getErrors(); - - int numberOfErrors = 0; - for (ParsingError parsingError : errors) { - parsisngErrorMsg.append(Messages.getString("ProcessMonitorDialog.1")).append( parsingError.getRow() ).append(" - ").append( parsingError.getMessage() ).append(", ").append( parsingError.getErrorType() ).append(Messages.getString("ProcessMonitorDialog.4")).append( ArrayUtils.toString(parsingError.getColumns()) ).append(Messages.getString("ProcessMonitorDialog.5")).append( ArrayUtils.toString(parsingError.getMessageArgs()) ).append("\r\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ - numberOfErrors ++; - if( numberOfErrors > MAX_ERRORS_SHOWN ){ - break; - } - } - - if( errors.size() > MAX_ERRORS_SHOWN ){ - parsisngErrorMsg.append( "More lines not shown . Total warnings : " + errors.size() ); - } - - } - - String primaryErrorMsg = process.getStatus().getErrorMessage(); - JOptionPane.showMessageDialog(null, "Attention : " + ( primaryErrorMsg!=null?primaryErrorMsg:"") + parsisngErrorMsg.toString() ); //$NON-NLS-1$ //$NON-NLS-2$ - } - }); - Toolkit.getDefaultToolkit().beep(); - if ( !process.getStatus().isComplete() && !process.getStatus().isError() ) { - process.cancel(); - logger.warn("Task canceled.\n"); //$NON-NLS-1$ - } - keepRunning = false; - } - } - - try { - Thread.sleep( 1000 ); - } catch (InterruptedException e) { - logger.error("Error whille waiting in thread", e); //$NON-NLS-1$ - Thread.currentThread().interrupt(); - } +public class InfiniteProgressMonitor implements ProgressListener { + + JDialog infiniteWaitingDialog; + + private boolean userCancelled = false; + + private JDialog dialog; + + private JOptionPane pane; + + private String cancelOption; + + private JLabel label; + + JProgressBar infiniteProgress; + + private Logger logger = LoggerFactory.getLogger( InfiniteProgressMonitor.class ); + + public InfiniteProgressMonitor(Component parentFrame, String title, String message) { + + infiniteProgress = new JProgressBar(); + infiniteProgress.setIndeterminate(true); + label = new JLabel(message); + + final Object[] dialogItems = { label, infiniteProgress }; + + cancelOption = Messages.getString("InfiniteProgressMonitor.0"); //$NON-NLS-1$ + final Object[] options = { cancelOption }; + setPane(new JOptionPane(dialogItems, JOptionPane.PLAIN_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, + options)); + setDialog(getPane().createDialog(parentFrame, title)); + getDialog().setModal(true); + + } + + public void updateProgress(int current, int total) { + + updateProgress(current, total, null); + + } + + public void updateProgress(int current, int total, String msg) { + + Runnable updateTask = () -> { + infiniteProgress.setString(current + "/" + total); + if (infiniteProgress.isIndeterminate()) { + infiniteProgress.setIndeterminate(false); + infiniteProgress.setStringPainted(true); + } + + infiniteProgress.setMaximum(total); + + infiniteProgress.setValue(current); + if( StringUtils.isNotBlank( msg )) + setMessage( msg ); + }; + + SwingUtilities.invokeLater( updateTask ); + + } + + public void updateProgress(int currentPercentage) { + Runnable updateTask = () -> { + infiniteProgress.setString(currentPercentage + "%"); + if (infiniteProgress.isIndeterminate()) { + infiniteProgress.setIndeterminate(false); + infiniteProgress.setStringPainted(true); + } + + infiniteProgress.setMaximum(100); + + infiniteProgress.setValue(currentPercentage); + }; + + SwingUtilities.invokeLater( updateTask ); + + } + + public void setMessage(String msg) { + label.setText(msg); + } + + public void close() { + SwingUtilities.invokeLater(() -> { + hide(); + getDialog().dispose(); + }); + } + + private JDialog getDialog() { + return dialog; + } + + public void hide() { + getDialog().setVisible(false); + } + + public boolean isShowing() { + return getDialog().isShowing(); + } + + public boolean isUserCancelled() { + return userCancelled; + } + + private void setDialog(JDialog dialog) { + this.dialog = dialog; + } + + public void setUserCancelled(boolean userCancelled) { + this.userCancelled = userCancelled; + } + + public void show() { + + Runnable showTask = () -> { + getDialog().setVisible(true); + if (getPane().getValue() == null // User closes the dialog + || + getPane().getValue().equals(cancelOption) // User clicks on cancel option + ) { + setUserCancelled(true); } + }; + SwingUtilities.invokeLater( showTask ); + + + } + + public void showLater() { + Runnable showLater = () -> { + getDialog().setVisible(true); + if (getPane().getValue() == null // User closes the dialog + || + getPane().getValue().equals(cancelOption) // User clicks on cancel option + ) { + setUserCancelled(true); } - }.start(); + }; + SwingUtilities.invokeLater( showLater ); + + } + + private JOptionPane getPane() { + return pane; + } + + private void setPane(JOptionPane pane) { + this.pane = pane; + } + + @Override + public void progressMade(Progress progress) { + updateProgress((int) progress.getProcessedItems()); } } From 8d126ac3376cd4bb3a913ac47c847ba8682dd165 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:06 +0100 Subject: [PATCH 1239/1620] New translations ImportActionListener.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 234 ++++++++++++++---- 1 file changed, 185 insertions(+), 49 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index a3e291cd48..88aa8edf1c 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,72 +1,208 @@ package org.openforis.collect.earth.app.view; -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.io.BufferedReader; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; -import java.nio.charset.StandardCharsets; - -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; - -import org.apache.commons.io.FileUtils; +import java.io.InputStreamReader; +import java.util.Arrays; + +import javax.swing.JFrame; +import javax.swing.JOptionPane; + +import org.apache.commons.io.IOUtils; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.DataImportExportService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.io.data.CSVDataImportProcess; +import org.openforis.collect.io.data.XMLDataImportProcess; +import org.openforis.collect.manager.process.ProcessStatus; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class OpenTextFileListener implements ActionListener { - - JDialog dialog; - private final Logger logger = LoggerFactory.getLogger(OpenTextFileListener.class); - JTextArea disclaimerTextArea; - private String filePath; - - public OpenTextFileListener(Frame owner, String filePath, String title) { - - this.filePath = filePath; - dialog = new JDialog(owner, title + " " + filePath); //$NON-NLS-1$ - dialog.setLocationRelativeTo(owner); - dialog.setSize(new Dimension(300, 400)); - dialog.setModal(true); +public final class ImportActionListener implements ActionListener { + protected static final Integer YES = 0; + protected static final Integer YES_TO_ALL = 1; + protected static final Integer NO = 2; + protected static final Integer NO_TO_ALL = 3; + + private final DataFormat importFormat; + private JFrame frame; + private LocalPropertiesService localPropertiesService; + private DataImportExportService dataImportService; + private Logger logger = LoggerFactory.getLogger( ImportActionListener.class ); + + public ImportActionListener(DataFormat importFormat, JFrame frame, LocalPropertiesService localPropertiesService, DataImportExportService dataImportService) { + this.importFormat = importFormat; + this.frame = frame; + this.localPropertiesService = localPropertiesService; + this.dataImportService = dataImportService; + } - final BorderLayout layoutManager = new BorderLayout(); + @Override + public void actionPerformed(ActionEvent e) { + try{ + CollectEarthWindow.startWaiting(frame); + importDataFrom(e, importFormat ); + }finally{ + CollectEarthWindow.endWaiting( frame); + } - final JPanel panel = new JPanel(layoutManager); + } + + private void forceRefreshGoogleEarth() { - dialog.add(panel); + EarthApp.executeKmlLoadAsynchronously( null ); - disclaimerTextArea = new JTextArea(); - disclaimerTextArea.setEditable(false); - disclaimerTextArea.setLineWrap(true); - disclaimerTextArea.setWrapStyleWord(true); - final JScrollPane scrollPane = new JScrollPane(disclaimerTextArea); - panel.add(scrollPane, BorderLayout.CENTER); - scrollPane.setPreferredSize(new Dimension(250, 250)); + } + private Integer shouldImportNonFinishedRecords( boolean moreThanOneFiles ) { + String message = "" //$NON-NLS-1$ + + Messages.getString("ImportActionListener.0") //$NON-NLS-1$ + +"
" //$NON-NLS-1$ + + Messages.getString("ImportActionListener.2") //$NON-NLS-1$ + + ""; + + if( !moreThanOneFiles ){ + + final int selectedOption = JOptionPane.showConfirmDialog(null, + message //$NON-NLS-1$ + ,Messages.getString("ImportActionListener.3"), //$NON-NLS-1$ + JOptionPane.YES_NO_OPTION); + + if (selectedOption == JOptionPane.YES_OPTION){ + return YES; + }else if (selectedOption == JOptionPane.NO_OPTION){ + return NO; + }else{ + return JOptionPane.CLOSED_OPTION; + } + }else{ + + String[] buttons = { Messages.getString("YES"), Messages.getString("YES_TO_ALL"), Messages.getString("NO"), Messages.getString("NO_TO_ALL") }; + + return JOptionPane.showOptionDialog(null, message, Messages.getString("ImportActionListener.3") , + JOptionPane.WARNING_MESSAGE, 0, null, buttons, buttons[1]); - final JButton close = new JButton(Messages.getString("CollectEarthWindow.5")); //$NON-NLS-1$ - close.addActionListener( e -> dialog.setVisible(false) ); - panel.add(close, BorderLayout.SOUTH); + } } - @Override - public void actionPerformed(ActionEvent e) { - disclaimerTextArea.setText(getTextContents()); - dialog.setVisible(true); + private void importDataFrom(final ActionEvent e, final DataFormat importType) { + File[] filesToImport = JFileChooserExistsAware.getFileChooserResults( importType, false, true, null, localPropertiesService, frame ); + final ImportXMLDialogProcessMonitor importDialogProcessMonitor = new ImportXMLDialogProcessMonitor(); + if (filesToImport != null) { + + + switch (importType) { + case ZIP_WITH_XML: + new Thread("XML Import Thread " ){ //$NON-NLS-1$ + @Override + public void run() { + Integer importNonFinishedPlots = shouldImportNonFinishedRecords( filesToImport.length > 1); + boolean firstFile = true; + + for (final File importedFile : filesToImport) { + XMLDataImportProcess dataImportProcess = null; + try{ + if ( firstFile ){ + firstFile = false; + }else if ( !firstFile && (importNonFinishedPlots.equals( YES ) || importNonFinishedPlots.equals( NO ) ) ){ + importNonFinishedPlots = shouldImportNonFinishedRecords( filesToImport.length > 1); + } + + if( importNonFinishedPlots.equals( JOptionPane.CLOSED_OPTION ) ){ + break; + } + + boolean importNotFinished= importNonFinishedPlots.equals( YES ) || importNonFinishedPlots.equals( YES_TO_ALL ); + + dataImportProcess = dataImportService.getImportSummary(importedFile, importNotFinished); + importDialogProcessMonitor.startImport(dataImportProcess, frame, dataImportService, importedFile ); + + } catch (Exception e1) { + logger.error("Error importing data" , e1); //$NON-NLS-1$ + importDialogProcessMonitor.closeProgressmonitor(); + JOptionPane.showMessageDialog( frame, importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.3"), importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.7"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + JOptionPane.ERROR_MESSAGE); + logger.error("Error importing data from " + importedFile.getAbsolutePath() + " in format " + importType.name() , e1); //$NON-NLS-1$ //$NON-NLS-2$ + } finally { + IOUtils.closeQuietly(dataImportProcess); + } + } + forceRefreshGoogleEarth(); + } + }.start(); + break; + case CSV: + new Thread("Update using CSV Thread " ){ //$NON-NLS-1$ + @Override + public void run() { + + String[] ids = dataImportService.getEarthSurveyService().getKeyNamesForSurvey(); + String keyAttributesForSurvey = Arrays.toString( ids ); + + JOptionPane.showMessageDialog( + frame, + "The CSV files used must have columns with at least the headers for the key attributes " + keyAttributesForSurvey+ " followed by one or more attribute names ( see http://www.openforis.org/support/questions/80/changing-plot-attributes-in-the-collect-earth-database ) ", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + "CSV file format info", + JOptionPane.INFORMATION_MESSAGE); + + + for (final File importedFile : filesToImport) { + + CSVDataImportProcess importSurveyAsCsv = null; + try { + importSurveyAsCsv = dataImportService.getCsvImporterProcess(importedFile); + + if( importSurveyAsCsv != null ){ + importSurveyAsCsv.init(); + ProcessStatus status = importSurveyAsCsv.getStatus(); + status.setTotal( getTotalNumberOfLines( importedFile ) ); + if ( status != null && ! importSurveyAsCsv.getStatus().isError() ) { + ImportProcessMonitorDialog importProcessWorker = new ImportProcessMonitorDialog(importSurveyAsCsv, frame ); + importProcessWorker.start(); + } + } + } catch (Exception e1) { + JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.7") + "\n" + e1.getMessage(), importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.3"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + JOptionPane.ERROR_MESSAGE); + logger.error("Error importing data from " + importedFile.getAbsolutePath() + " in format " + importType , e1); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + } + }.start(); + break; + case FUSION: + break; + default: + break; + } + } } - private String getTextContents() { + private long getTotalNumberOfLines(File importedFile) { + long count = 0; + BufferedReader br = null; try { + br = new BufferedReader(new InputStreamReader(new FileInputStream(importedFile))); + + while ( br.readLine() != null) { + count++; + } + } catch (IOException e) { + logger.error("Error counting the number of lines in file " + importedFile.getAbsolutePath() , e) ; //$NON-NLS-1$ + }finally { + if( br!=null) { + try { + br.close(); + } catch (IOException e) { + logger.error("Error closing file reader " + importedFile.getAbsolutePath() , e) ; + } + } + - return FileUtils.readFileToString(new File( filePath ), StandardCharsets.UTF_8); - } catch (final IOException e) { - logger.error(Messages.getString("OpenTextFileListener.0") + filePath.toString(), e); //$NON-NLS-1$ - return Messages.getString("CollectEarthWindow.8"); //$NON-NLS-1$ } + return count; } - } From 556deb48258dccdd1391bd36cc7067973ade75a3 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:08 +0100 Subject: [PATCH 1240/1620] New translations ImportActionListener.java (English) --- .../earth/app/view/Messages_en.properties | 367 ++++++++---------- 1 file changed, 171 insertions(+), 196 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index e15ddb90b9..88aa8edf1c 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,233 +1,208 @@ package org.openforis.collect.earth.app.view; -import java.awt.Color; -import java.awt.Component; -import java.awt.event.MouseEvent; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.BufferedReader; import java.io.File; -import java.util.ArrayList; -import java.util.List; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Arrays; +import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.JTable; -import javax.swing.table.DefaultTableModel; -import javax.swing.table.TableCellRenderer; - -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult; -import org.openforis.collect.io.metadata.collectearth.CSVRowValidationResult; -import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; -import org.openforis.collect.manager.validation.SurveyValidator.ValidationParameters; -import org.openforis.collect.model.CollectSurvey; + +import org.apache.commons.io.IOUtils; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.DataImportExportService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.io.data.CSVDataImportProcess; +import org.openforis.collect.io.data.XMLDataImportProcess; +import org.openforis.collect.manager.process.ProcessStatus; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.opencsv.CSVReader; - -/** - * Swing JTable used in the OptionWizard dialog. - * It contains methods to refresh the information loaded on the cells. - * @author Alfonso Sanchez-Paus Diaz - * - */ -public class JPlotCsvTable extends JTable{ - - private static final Color WARNING_BG_COLOR = new Color(254, 255, 196); - private static final Color ERROR_BG_COLOR = new Color(218, 152, 152); - private static final long serialVersionUID = 3456854921119125693L; - private static final int LIMIT_LOADED_CSV_LINES = 400; - private final transient Logger logger = LoggerFactory.getLogger(this.getClass()); - private transient CollectSurvey forSurvey; - private transient CSVFileValidationResult validationResults; - - - /** - * Build a new JTable that contains the data from the CSV that is set as the file that contains the plots used by Collect Earth - * @param pathToCsvWithPlots Path to the file containing the plot locations that should be loaded in the table - * @param forSurvey Survey that the csv file belongs to - */ - public JPlotCsvTable(String pathToCsvWithPlots, CollectSurvey forSurvey) { - super(); - this.forSurvey = forSurvey; - - try { - refreshTable(pathToCsvWithPlots); - } catch (Exception e) { - logger.error("Error loading plot file"); - this.setBackground(Color.RED); - this.setToolTipText("The file chosen does not contain plot information"); - - } - } - - /** - * The data of the CSV file is validated when the CSV/CED is loaded. This method determines if the data currently loaded is valid or not - * @return True if the data is valid. False otherwise - */ - public boolean isDataValid(){ - return validationResults==null?true:validationResults.isSuccessful(); +public final class ImportActionListener implements ActionListener { + protected static final Integer YES = 0; + protected static final Integer YES_TO_ALL = 1; + protected static final Integer NO = 2; + protected static final Integer NO_TO_ALL = 3; + + private final DataFormat importFormat; + private JFrame frame; + private LocalPropertiesService localPropertiesService; + private DataImportExportService dataImportService; + private Logger logger = LoggerFactory.getLogger( ImportActionListener.class ); + + public ImportActionListener(DataFormat importFormat, JFrame frame, LocalPropertiesService localPropertiesService, DataImportExportService dataImportService) { + this.importFormat = importFormat; + this.frame = frame; + this.localPropertiesService = localPropertiesService; + this.dataImportService = dataImportService; } - @Override - public Component prepareRenderer(TableCellRenderer renderer, int row, int col) { - Component comp = super.prepareRenderer(renderer, row, col); - - if ( cellHasError(row,col)){ - comp.setBackground( ERROR_BG_COLOR ); - }else{ - comp.setBackground(Color.WHITE); + public void actionPerformed(ActionEvent e) { + try{ + CollectEarthWindow.startWaiting(frame); + importDataFrom(e, importFormat ); + }finally{ + CollectEarthWindow.endWaiting( frame); } - return comp; - } - - @Override - public String getToolTipText(MouseEvent event) { - String tip = null; - java.awt.Point p = event.getPoint(); - int row = rowAtPoint(p); - int col = columnAtPoint(p); - - try { - tip = getCellErrorMessage(row, col); - } catch (RuntimeException e1) { - //catch null pointer exception if mouse is over an empty line - } - - return tip; - } + + private void forceRefreshGoogleEarth() { - private boolean cellHasError(Integer row, Integer col) { - String errorMessage = getCellErrorMessage(row, col); - return errorMessage!=null; - } + EarthApp.executeKmlLoadAsynchronously( null ); - private String getCellErrorMessage(Integer row, Integer col) { - if( validationResults != null ){ - List rowValidations = validationResults.getRowValidations(); - for (CSVRowValidationResult csvRowValidationResult : rowValidations) { - if( csvRowValidationResult.getRowNumber().equals(row+1) && csvRowValidationResult.getColumnPosition().equals( col ) ){ - return csvRowValidationResult.getMessage(); - } - } - } - return null; } - - /** - * Refreshes the data loaded in the table. Used when the user changes the file that contains the CSV file using the OptionWizard dialog. - * @param csvFilePath The path to the CSV file that contains the plot locations - */ - public void refreshTable(String csvFilePath) { - - if( csvFilePath.trim().length() == 0 ) - return; - - this.removeAll(); - boolean errorLoading = false; - final File csvFile = new File(csvFilePath); - - if (csvFile.exists()) { - DefaultTableModel newTableModel = getPlotTableModel( csvFilePath ); - - validateCsvFile(csvFilePath); - - if (newTableModel.getRowCount() == 0) { - errorLoading = true; - } else { - this.setModel(newTableModel); + private Integer shouldImportNonFinishedRecords( boolean moreThanOneFiles ) { + String message = "" //$NON-NLS-1$ + + Messages.getString("ImportActionListener.0") //$NON-NLS-1$ + +"
" //$NON-NLS-1$ + + Messages.getString("ImportActionListener.2") //$NON-NLS-1$ + + ""; + + if( !moreThanOneFiles ){ + + final int selectedOption = JOptionPane.showConfirmDialog(null, + message //$NON-NLS-1$ + ,Messages.getString("ImportActionListener.3"), //$NON-NLS-1$ + JOptionPane.YES_NO_OPTION); + + if (selectedOption == JOptionPane.YES_OPTION){ + return YES; + }else if (selectedOption == JOptionPane.NO_OPTION){ + return NO; + }else{ + return JOptionPane.CLOSED_OPTION; } - } else { - errorLoading = true; - } - - if (errorLoading) { - this.setBackground(CollectEarthWindow.ERROR_COLOR); - this.setModel(new DefaultTableModel()); - } - } - - private String[] getColumnNames() { - // Check if the first line is actually a header. Possible if the first header column coincides with ID, PLOT_ID or PLOT - CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); - return cegtg.getExpectedHeaders( forSurvey ).toArray( new String[]{} ); - - } - - private DefaultTableModel getPlotTableModel(String csvFilePath) { + }else{ - String[][] allValues = new String[0][0]; + String[] buttons = { Messages.getString("YES"), Messages.getString("YES_TO_ALL"), Messages.getString("NO"), Messages.getString("NO_TO_ALL") }; - try ( CSVReader reader = CsvReaderUtils.getCsvReader(csvFilePath) ){ - String[] line; - List allLines = new ArrayList<>(); - int i =0; - while( ( line = reader.readNext() ) != null && i< LIMIT_LOADED_CSV_LINES ) { // we do this to avoid out of memory errors - i++; - allLines.add( line ); - } + return JOptionPane.showOptionDialog(null, message, Messages.getString("ImportActionListener.3") , + JOptionPane.WARNING_MESSAGE, 0, null, buttons, buttons[1]); - allValues = allLines.toArray(new String[][] {}); - } catch (Exception e) { - logger.error(" Error reading the CSV file " + csvFilePath, e); } - - return new DefaultTableModel( allValues , getColumnNames()); } - protected void validateCsvFile(String csvFilePath) { - - CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); - ValidationParameters validationParameters = new ValidationParameters(); - validationParameters.setValidateOnlyFirstLines( false ); - CSVFileValidationResult validation = cegtg.validate( new File(csvFilePath), forSurvey, validationParameters); - - this.setBackground( Color.white ); - - - if( !validation.isSuccessful() ){ - switch ( validation.getErrorType() ) { - case INVALID_FILE_TYPE: - case INVALID_NUMBER_OF_COLUMNS: - JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); - JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The expected file type is CSV or CED ", "Expected File Type", JOptionPane.ERROR_MESSAGE); + private void importDataFrom(final ActionEvent e, final DataFormat importType) { + File[] filesToImport = JFileChooserExistsAware.getFileChooserResults( importType, false, true, null, localPropertiesService, frame ); + final ImportXMLDialogProcessMonitor importDialogProcessMonitor = new ImportXMLDialogProcessMonitor(); + if (filesToImport != null) { + + + switch (importType) { + case ZIP_WITH_XML: + new Thread("XML Import Thread " ){ //$NON-NLS-1$ + @Override + public void run() { + Integer importNonFinishedPlots = shouldImportNonFinishedRecords( filesToImport.length > 1); + boolean firstFile = true; + + for (final File importedFile : filesToImport) { + XMLDataImportProcess dataImportProcess = null; + try{ + if ( firstFile ){ + firstFile = false; + }else if ( !firstFile && (importNonFinishedPlots.equals( YES ) || importNonFinishedPlots.equals( NO ) ) ){ + importNonFinishedPlots = shouldImportNonFinishedRecords( filesToImport.length > 1); + } + + if( importNonFinishedPlots.equals( JOptionPane.CLOSED_OPTION ) ){ + break; + } + + boolean importNotFinished= importNonFinishedPlots.equals( YES ) || importNonFinishedPlots.equals( YES_TO_ALL ); + + dataImportProcess = dataImportService.getImportSummary(importedFile, importNotFinished); + importDialogProcessMonitor.startImport(dataImportProcess, frame, dataImportService, importedFile ); + + } catch (Exception e1) { + logger.error("Error importing data" , e1); //$NON-NLS-1$ + importDialogProcessMonitor.closeProgressmonitor(); + JOptionPane.showMessageDialog( frame, importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.3"), importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.7"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + JOptionPane.ERROR_MESSAGE); + logger.error("Error importing data from " + importedFile.getAbsolutePath() + " in format " + importType.name() , e1); //$NON-NLS-1$ //$NON-NLS-2$ + } finally { + IOUtils.closeQuietly(dataImportProcess); + } + } + forceRefreshGoogleEarth(); + } + }.start(); break; - - case INVALID_HEADERS: - JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); - JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The expected columns in the CSV are " + validation.getExpectedHeaders(), "Columns in CSV do not match survey", JOptionPane.ERROR_MESSAGE); - validation = null; // not bad enough to stop the user from loading the CSV file + case CSV: + new Thread("Update using CSV Thread " ){ //$NON-NLS-1$ + @Override + public void run() { + + String[] ids = dataImportService.getEarthSurveyService().getKeyNamesForSurvey(); + String keyAttributesForSurvey = Arrays.toString( ids ); + + JOptionPane.showMessageDialog( + frame, + "The CSV files used must have columns with at least the headers for the key attributes " + keyAttributesForSurvey+ " followed by one or more attribute names ( see http://www.openforis.org/support/questions/80/changing-plot-attributes-in-the-collect-earth-database ) ", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + "CSV file format info", + JOptionPane.INFORMATION_MESSAGE); + + + for (final File importedFile : filesToImport) { + + CSVDataImportProcess importSurveyAsCsv = null; + try { + importSurveyAsCsv = dataImportService.getCsvImporterProcess(importedFile); + + if( importSurveyAsCsv != null ){ + importSurveyAsCsv.init(); + ProcessStatus status = importSurveyAsCsv.getStatus(); + status.setTotal( getTotalNumberOfLines( importedFile ) ); + if ( status != null && ! importSurveyAsCsv.getStatus().isError() ) { + ImportProcessMonitorDialog importProcessWorker = new ImportProcessMonitorDialog(importSurveyAsCsv, frame ); + importProcessWorker.start(); + } + } + } catch (Exception e1) { + JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.7") + "\n" + e1.getMessage(), importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.3"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + JOptionPane.ERROR_MESSAGE); + logger.error("Error importing data from " + importedFile.getAbsolutePath() + " in format " + importType , e1); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + } + }.start(); break; - case INVALID_NUMBER_OF_PLOTS_TOO_LARGE: - JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); - JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "Using CSV files that are too large makes Google Earth extremely slow.\nPlease divide this CSV file into smaller file (reccomended less than 2000 plots per CSV file.\nNumber of plots in this file : " + validation.getNumberOfRows() , "File too large", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - validation = null; // not bad enough to stop the user from loading the CSV file + case FUSION: break; - - case INVALID_NUMBER_OF_PLOTS_WARNING: - JPlotCsvTable.this.setBackground( WARNING_BG_COLOR); - JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "Using CSV files that are too large makes Google Earth slow.\n Please divide this CSV file into smaller file (reccomended size is less than 2000 plots per CSV file.\nNumber of plots in this file : " + validation.getNumberOfRows() , "File too large", JOptionPane.WARNING_MESSAGE); //$NON-NLS-1$ - validation = null; // not bad enough to stop the user from loading the CSV file - break; - - case INVALID_VALUES_IN_CSV: - // IN THIS CASE THE CELL RENDERER TAKES CARE OF HIGHLIGHTING THE CELLS!!! - JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The content of the CSV file is not correct!! The values on the cells highlighted are incorrect " , "CSV content is not correct", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - break; - default: break; } } + } + private long getTotalNumberOfLines(File importedFile) { + long count = 0; + BufferedReader br = null; + try { + br = new BufferedReader(new InputStreamReader(new FileInputStream(importedFile))); - this.setValidationResults( validation ); - } + while ( br.readLine() != null) { + count++; + } + } catch (IOException e) { + logger.error("Error counting the number of lines in file " + importedFile.getAbsolutePath() , e) ; //$NON-NLS-1$ + }finally { + if( br!=null) { + try { + br.close(); + } catch (IOException e) { + logger.error("Error closing file reader " + importedFile.getAbsolutePath() , e) ; + } + } - private void setValidationResults(CSVFileValidationResult validationResults) { - this.validationResults = validationResults; + } + return count; } - } From 5c15d0b146560d6cc4ad7c9320b17c552cdc496b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:09 +0100 Subject: [PATCH 1241/1620] New translations ImportProcessMonitorDialog.java (French) --- .../earth/app/view/Messages_fr.properties | 180 +++--------------- 1 file changed, 27 insertions(+), 153 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index ca537bed7a..68af760ca4 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,173 +1,47 @@ package org.openforis.collect.earth.app.view; -import java.awt.Component; - -import javax.swing.JDialog; -import javax.swing.JLabel; +import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.JProgressBar; +import javax.swing.ProgressMonitor; import javax.swing.SwingUtilities; -import org.apache.commons.lang3.StringUtils; -import org.openforis.concurrency.Progress; -import org.openforis.concurrency.ProgressListener; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class InfiniteProgressMonitor implements ProgressListener { - - JDialog infiniteWaitingDialog; - - private boolean userCancelled = false; +import org.openforis.collect.io.ReferenceDataImportStatus; +import org.openforis.collect.io.metadata.parsing.ParsingError; +import org.openforis.collect.manager.process.AbstractProcess; - private JDialog dialog; +public class ImportProcessMonitorDialog extends ProcessMonitorDialog> { - private JOptionPane pane; + private JFrame parentFrame; - private String cancelOption; - - private JLabel label; - - JProgressBar infiniteProgress; - - private Logger logger = LoggerFactory.getLogger( InfiniteProgressMonitor.class ); - - public InfiniteProgressMonitor(Component parentFrame, String title, String message) { - - infiniteProgress = new JProgressBar(); - infiniteProgress.setIndeterminate(true); - label = new JLabel(message); - - final Object[] dialogItems = { label, infiniteProgress }; - - cancelOption = Messages.getString("InfiniteProgressMonitor.0"); //$NON-NLS-1$ - final Object[] options = { cancelOption }; - setPane(new JOptionPane(dialogItems, JOptionPane.PLAIN_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, - options)); - setDialog(getPane().createDialog(parentFrame, title)); - getDialog().setModal(true); + public ImportProcessMonitorDialog(AbstractProcess> importProcess, JFrame parentFrame ) { + super(); + this.process = importProcess; + this.parentFrame = parentFrame; + SwingUtilities.invokeLater( () -> { + progressMonitor = new ProgressMonitor(parentFrame, Messages.getString("ExportDialogProcessMonitor.0"), Messages.getString("ExportDialogProcessMonitor.1"), 0, 100); //$NON-NLS-1$ //$NON-NLS-2$ + progressMonitor.setMillisToPopup(1000); + } ); } - public void updateProgress(int current, int total) { - - updateProgress(current, total, null); - + protected String getProcessActionMessage() { + return Messages.getString("ImportProcessMonitorDialog.0"); //$NON-NLS-1$ } - public void updateProgress(int current, int total, String msg) { - - Runnable updateTask = () -> { - infiniteProgress.setString(current + "/" + total); - if (infiniteProgress.isIndeterminate()) { - infiniteProgress.setIndeterminate(false); - infiniteProgress.setStringPainted(true); - } - - infiniteProgress.setMaximum(total); - - infiniteProgress.setValue(current); - if( StringUtils.isNotBlank( msg )) - setMessage( msg ); - }; - - SwingUtilities.invokeLater( updateTask ); - - } - - public void updateProgress(int currentPercentage) { - Runnable updateTask = () -> { - infiniteProgress.setString(currentPercentage + "%"); - if (infiniteProgress.isIndeterminate()) { - infiniteProgress.setIndeterminate(false); - infiniteProgress.setStringPainted(true); - } - - infiniteProgress.setMaximum(100); - - infiniteProgress.setValue(currentPercentage); - }; - - SwingUtilities.invokeLater( updateTask ); - - } - - public void setMessage(String msg) { - label.setText(msg); - } - - public void close() { - SwingUtilities.invokeLater(() -> { - hide(); - getDialog().dispose(); - }); - } - - private JDialog getDialog() { - return dialog; - } - - public void hide() { - getDialog().setVisible(false); - } - - public boolean isShowing() { - return getDialog().isShowing(); - } - - public boolean isUserCancelled() { - return userCancelled; - } - - private void setDialog(JDialog dialog) { - this.dialog = dialog; - } - - public void setUserCancelled(boolean userCancelled) { - this.userCancelled = userCancelled; - } - public void show() { - - Runnable showTask = () -> { - getDialog().setVisible(true); - if (getPane().getValue() == null // User closes the dialog - || - getPane().getValue().equals(cancelOption) // User clicks on cancel option - ) { - setUserCancelled(true); - } - }; - SwingUtilities.invokeLater( showTask ); - - - } + @Override + public void run() { - public void showLater() { - Runnable showLater = () -> { - getDialog().setVisible(true); - if (getPane().getValue() == null // User closes the dialog - || - getPane().getValue().equals(cancelOption) // User clicks on cancel option - ) { - setUserCancelled(true); + try { + monitorProgress(); + process.call(); + if( process.getStatus().isComplete() ) { + JOptionPane.showMessageDialog( parentFrame, "Update finished", "CSV Update", JOptionPane.INFORMATION_MESSAGE); } - }; - SwingUtilities.invokeLater( showLater ); + } catch (final Exception e) { + logger.error("Error starting the process", e); //$NON-NLS-1$ + } } - private JOptionPane getPane() { - return pane; - } - - private void setPane(JOptionPane pane) { - this.pane = pane; - } - - @Override - public void progressMade(Progress progress) { - updateProgress((int) progress.getProcessedItems()); - } - } From dc745af741f1a0bfa33c2f5237c37149a6e155a5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:10 +0100 Subject: [PATCH 1242/1620] New translations ImportProcessMonitorDialog.java (Spanish) --- .../earth/app/view/Messages_es.properties | 217 +++--------------- 1 file changed, 28 insertions(+), 189 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 88aa8edf1c..68af760ca4 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,208 +1,47 @@ package org.openforis.collect.earth.app.view; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.Arrays; - import javax.swing.JFrame; import javax.swing.JOptionPane; +import javax.swing.ProgressMonitor; +import javax.swing.SwingUtilities; -import org.apache.commons.io.IOUtils; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.DataImportExportService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.io.data.CSVDataImportProcess; -import org.openforis.collect.io.data.XMLDataImportProcess; -import org.openforis.collect.manager.process.ProcessStatus; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public final class ImportActionListener implements ActionListener { - protected static final Integer YES = 0; - protected static final Integer YES_TO_ALL = 1; - protected static final Integer NO = 2; - protected static final Integer NO_TO_ALL = 3; +import org.openforis.collect.io.ReferenceDataImportStatus; +import org.openforis.collect.io.metadata.parsing.ParsingError; +import org.openforis.collect.manager.process.AbstractProcess; - private final DataFormat importFormat; - private JFrame frame; - private LocalPropertiesService localPropertiesService; - private DataImportExportService dataImportService; - private Logger logger = LoggerFactory.getLogger( ImportActionListener.class ); +public class ImportProcessMonitorDialog extends ProcessMonitorDialog> { - public ImportActionListener(DataFormat importFormat, JFrame frame, LocalPropertiesService localPropertiesService, DataImportExportService dataImportService) { - this.importFormat = importFormat; - this.frame = frame; - this.localPropertiesService = localPropertiesService; - this.dataImportService = dataImportService; - } + private JFrame parentFrame; - @Override - public void actionPerformed(ActionEvent e) { - try{ - CollectEarthWindow.startWaiting(frame); - importDataFrom(e, importFormat ); - }finally{ - CollectEarthWindow.endWaiting( frame); - } + public ImportProcessMonitorDialog(AbstractProcess> importProcess, JFrame parentFrame ) { + super(); + this.process = importProcess; + this.parentFrame = parentFrame; + SwingUtilities.invokeLater( () -> { + progressMonitor = new ProgressMonitor(parentFrame, Messages.getString("ExportDialogProcessMonitor.0"), Messages.getString("ExportDialogProcessMonitor.1"), 0, 100); //$NON-NLS-1$ //$NON-NLS-2$ + progressMonitor.setMillisToPopup(1000); + } ); } - - private void forceRefreshGoogleEarth() { - - EarthApp.executeKmlLoadAsynchronously( null ); + protected String getProcessActionMessage() { + return Messages.getString("ImportProcessMonitorDialog.0"); //$NON-NLS-1$ } - private Integer shouldImportNonFinishedRecords( boolean moreThanOneFiles ) { - String message = "" //$NON-NLS-1$ - + Messages.getString("ImportActionListener.0") //$NON-NLS-1$ - +"
" //$NON-NLS-1$ - + Messages.getString("ImportActionListener.2") //$NON-NLS-1$ - + ""; - - if( !moreThanOneFiles ){ - - final int selectedOption = JOptionPane.showConfirmDialog(null, - message //$NON-NLS-1$ - ,Messages.getString("ImportActionListener.3"), //$NON-NLS-1$ - JOptionPane.YES_NO_OPTION); + + + @Override + public void run() { - if (selectedOption == JOptionPane.YES_OPTION){ - return YES; - }else if (selectedOption == JOptionPane.NO_OPTION){ - return NO; - }else{ - return JOptionPane.CLOSED_OPTION; + try { + monitorProgress(); + process.call(); + if( process.getStatus().isComplete() ) { + JOptionPane.showMessageDialog( parentFrame, "Update finished", "CSV Update", JOptionPane.INFORMATION_MESSAGE); } - }else{ - - String[] buttons = { Messages.getString("YES"), Messages.getString("YES_TO_ALL"), Messages.getString("NO"), Messages.getString("NO_TO_ALL") }; - - return JOptionPane.showOptionDialog(null, message, Messages.getString("ImportActionListener.3") , - JOptionPane.WARNING_MESSAGE, 0, null, buttons, buttons[1]); - + } catch (final Exception e) { + logger.error("Error starting the process", e); //$NON-NLS-1$ } - } - - private void importDataFrom(final ActionEvent e, final DataFormat importType) { - File[] filesToImport = JFileChooserExistsAware.getFileChooserResults( importType, false, true, null, localPropertiesService, frame ); - final ImportXMLDialogProcessMonitor importDialogProcessMonitor = new ImportXMLDialogProcessMonitor(); - if (filesToImport != null) { - - - switch (importType) { - case ZIP_WITH_XML: - new Thread("XML Import Thread " ){ //$NON-NLS-1$ - @Override - public void run() { - Integer importNonFinishedPlots = shouldImportNonFinishedRecords( filesToImport.length > 1); - boolean firstFile = true; - for (final File importedFile : filesToImport) { - XMLDataImportProcess dataImportProcess = null; - try{ - if ( firstFile ){ - firstFile = false; - }else if ( !firstFile && (importNonFinishedPlots.equals( YES ) || importNonFinishedPlots.equals( NO ) ) ){ - importNonFinishedPlots = shouldImportNonFinishedRecords( filesToImport.length > 1); - } - - if( importNonFinishedPlots.equals( JOptionPane.CLOSED_OPTION ) ){ - break; - } - - boolean importNotFinished= importNonFinishedPlots.equals( YES ) || importNonFinishedPlots.equals( YES_TO_ALL ); - - dataImportProcess = dataImportService.getImportSummary(importedFile, importNotFinished); - importDialogProcessMonitor.startImport(dataImportProcess, frame, dataImportService, importedFile ); - - } catch (Exception e1) { - logger.error("Error importing data" , e1); //$NON-NLS-1$ - importDialogProcessMonitor.closeProgressmonitor(); - JOptionPane.showMessageDialog( frame, importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.3"), importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.7"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - JOptionPane.ERROR_MESSAGE); - logger.error("Error importing data from " + importedFile.getAbsolutePath() + " in format " + importType.name() , e1); //$NON-NLS-1$ //$NON-NLS-2$ - } finally { - IOUtils.closeQuietly(dataImportProcess); - } - } - forceRefreshGoogleEarth(); - } - }.start(); - break; - case CSV: - new Thread("Update using CSV Thread " ){ //$NON-NLS-1$ - @Override - public void run() { - - String[] ids = dataImportService.getEarthSurveyService().getKeyNamesForSurvey(); - String keyAttributesForSurvey = Arrays.toString( ids ); - - JOptionPane.showMessageDialog( - frame, - "The CSV files used must have columns with at least the headers for the key attributes " + keyAttributesForSurvey+ " followed by one or more attribute names ( see http://www.openforis.org/support/questions/80/changing-plot-attributes-in-the-collect-earth-database ) ", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - "CSV file format info", - JOptionPane.INFORMATION_MESSAGE); - - - for (final File importedFile : filesToImport) { - - CSVDataImportProcess importSurveyAsCsv = null; - try { - importSurveyAsCsv = dataImportService.getCsvImporterProcess(importedFile); - - if( importSurveyAsCsv != null ){ - importSurveyAsCsv.init(); - ProcessStatus status = importSurveyAsCsv.getStatus(); - status.setTotal( getTotalNumberOfLines( importedFile ) ); - if ( status != null && ! importSurveyAsCsv.getStatus().isError() ) { - ImportProcessMonitorDialog importProcessWorker = new ImportProcessMonitorDialog(importSurveyAsCsv, frame ); - importProcessWorker.start(); - } - } - } catch (Exception e1) { - JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.7") + "\n" + e1.getMessage(), importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.3"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - JOptionPane.ERROR_MESSAGE); - logger.error("Error importing data from " + importedFile.getAbsolutePath() + " in format " + importType , e1); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - } - }.start(); - break; - case FUSION: - break; - default: - break; - } - } } - private long getTotalNumberOfLines(File importedFile) { - long count = 0; - BufferedReader br = null; - try { - br = new BufferedReader(new InputStreamReader(new FileInputStream(importedFile))); - - while ( br.readLine() != null) { - count++; - } - } catch (IOException e) { - logger.error("Error counting the number of lines in file " + importedFile.getAbsolutePath() , e) ; //$NON-NLS-1$ - }finally { - if( br!=null) { - try { - br.close(); - } catch (IOException e) { - logger.error("Error closing file reader " + importedFile.getAbsolutePath() , e) ; - } - } - - - } - return count; - } } From 9e739f5fa6a0238ff666705e0ea01a79f495cc68 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:11 +0100 Subject: [PATCH 1243/1620] New translations ImportProcessMonitorDialog.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 217 +++--------------- 1 file changed, 28 insertions(+), 189 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 88aa8edf1c..68af760ca4 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,208 +1,47 @@ package org.openforis.collect.earth.app.view; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.Arrays; - import javax.swing.JFrame; import javax.swing.JOptionPane; +import javax.swing.ProgressMonitor; +import javax.swing.SwingUtilities; -import org.apache.commons.io.IOUtils; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.DataImportExportService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.io.data.CSVDataImportProcess; -import org.openforis.collect.io.data.XMLDataImportProcess; -import org.openforis.collect.manager.process.ProcessStatus; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public final class ImportActionListener implements ActionListener { - protected static final Integer YES = 0; - protected static final Integer YES_TO_ALL = 1; - protected static final Integer NO = 2; - protected static final Integer NO_TO_ALL = 3; +import org.openforis.collect.io.ReferenceDataImportStatus; +import org.openforis.collect.io.metadata.parsing.ParsingError; +import org.openforis.collect.manager.process.AbstractProcess; - private final DataFormat importFormat; - private JFrame frame; - private LocalPropertiesService localPropertiesService; - private DataImportExportService dataImportService; - private Logger logger = LoggerFactory.getLogger( ImportActionListener.class ); +public class ImportProcessMonitorDialog extends ProcessMonitorDialog> { - public ImportActionListener(DataFormat importFormat, JFrame frame, LocalPropertiesService localPropertiesService, DataImportExportService dataImportService) { - this.importFormat = importFormat; - this.frame = frame; - this.localPropertiesService = localPropertiesService; - this.dataImportService = dataImportService; - } + private JFrame parentFrame; - @Override - public void actionPerformed(ActionEvent e) { - try{ - CollectEarthWindow.startWaiting(frame); - importDataFrom(e, importFormat ); - }finally{ - CollectEarthWindow.endWaiting( frame); - } + public ImportProcessMonitorDialog(AbstractProcess> importProcess, JFrame parentFrame ) { + super(); + this.process = importProcess; + this.parentFrame = parentFrame; + SwingUtilities.invokeLater( () -> { + progressMonitor = new ProgressMonitor(parentFrame, Messages.getString("ExportDialogProcessMonitor.0"), Messages.getString("ExportDialogProcessMonitor.1"), 0, 100); //$NON-NLS-1$ //$NON-NLS-2$ + progressMonitor.setMillisToPopup(1000); + } ); } - - private void forceRefreshGoogleEarth() { - - EarthApp.executeKmlLoadAsynchronously( null ); + protected String getProcessActionMessage() { + return Messages.getString("ImportProcessMonitorDialog.0"); //$NON-NLS-1$ } - private Integer shouldImportNonFinishedRecords( boolean moreThanOneFiles ) { - String message = "" //$NON-NLS-1$ - + Messages.getString("ImportActionListener.0") //$NON-NLS-1$ - +"
" //$NON-NLS-1$ - + Messages.getString("ImportActionListener.2") //$NON-NLS-1$ - + ""; - - if( !moreThanOneFiles ){ - - final int selectedOption = JOptionPane.showConfirmDialog(null, - message //$NON-NLS-1$ - ,Messages.getString("ImportActionListener.3"), //$NON-NLS-1$ - JOptionPane.YES_NO_OPTION); + + + @Override + public void run() { - if (selectedOption == JOptionPane.YES_OPTION){ - return YES; - }else if (selectedOption == JOptionPane.NO_OPTION){ - return NO; - }else{ - return JOptionPane.CLOSED_OPTION; + try { + monitorProgress(); + process.call(); + if( process.getStatus().isComplete() ) { + JOptionPane.showMessageDialog( parentFrame, "Update finished", "CSV Update", JOptionPane.INFORMATION_MESSAGE); } - }else{ - - String[] buttons = { Messages.getString("YES"), Messages.getString("YES_TO_ALL"), Messages.getString("NO"), Messages.getString("NO_TO_ALL") }; - - return JOptionPane.showOptionDialog(null, message, Messages.getString("ImportActionListener.3") , - JOptionPane.WARNING_MESSAGE, 0, null, buttons, buttons[1]); - + } catch (final Exception e) { + logger.error("Error starting the process", e); //$NON-NLS-1$ } - } - - private void importDataFrom(final ActionEvent e, final DataFormat importType) { - File[] filesToImport = JFileChooserExistsAware.getFileChooserResults( importType, false, true, null, localPropertiesService, frame ); - final ImportXMLDialogProcessMonitor importDialogProcessMonitor = new ImportXMLDialogProcessMonitor(); - if (filesToImport != null) { - - - switch (importType) { - case ZIP_WITH_XML: - new Thread("XML Import Thread " ){ //$NON-NLS-1$ - @Override - public void run() { - Integer importNonFinishedPlots = shouldImportNonFinishedRecords( filesToImport.length > 1); - boolean firstFile = true; - for (final File importedFile : filesToImport) { - XMLDataImportProcess dataImportProcess = null; - try{ - if ( firstFile ){ - firstFile = false; - }else if ( !firstFile && (importNonFinishedPlots.equals( YES ) || importNonFinishedPlots.equals( NO ) ) ){ - importNonFinishedPlots = shouldImportNonFinishedRecords( filesToImport.length > 1); - } - - if( importNonFinishedPlots.equals( JOptionPane.CLOSED_OPTION ) ){ - break; - } - - boolean importNotFinished= importNonFinishedPlots.equals( YES ) || importNonFinishedPlots.equals( YES_TO_ALL ); - - dataImportProcess = dataImportService.getImportSummary(importedFile, importNotFinished); - importDialogProcessMonitor.startImport(dataImportProcess, frame, dataImportService, importedFile ); - - } catch (Exception e1) { - logger.error("Error importing data" , e1); //$NON-NLS-1$ - importDialogProcessMonitor.closeProgressmonitor(); - JOptionPane.showMessageDialog( frame, importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.3"), importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.7"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - JOptionPane.ERROR_MESSAGE); - logger.error("Error importing data from " + importedFile.getAbsolutePath() + " in format " + importType.name() , e1); //$NON-NLS-1$ //$NON-NLS-2$ - } finally { - IOUtils.closeQuietly(dataImportProcess); - } - } - forceRefreshGoogleEarth(); - } - }.start(); - break; - case CSV: - new Thread("Update using CSV Thread " ){ //$NON-NLS-1$ - @Override - public void run() { - - String[] ids = dataImportService.getEarthSurveyService().getKeyNamesForSurvey(); - String keyAttributesForSurvey = Arrays.toString( ids ); - - JOptionPane.showMessageDialog( - frame, - "The CSV files used must have columns with at least the headers for the key attributes " + keyAttributesForSurvey+ " followed by one or more attribute names ( see http://www.openforis.org/support/questions/80/changing-plot-attributes-in-the-collect-earth-database ) ", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - "CSV file format info", - JOptionPane.INFORMATION_MESSAGE); - - - for (final File importedFile : filesToImport) { - - CSVDataImportProcess importSurveyAsCsv = null; - try { - importSurveyAsCsv = dataImportService.getCsvImporterProcess(importedFile); - - if( importSurveyAsCsv != null ){ - importSurveyAsCsv.init(); - ProcessStatus status = importSurveyAsCsv.getStatus(); - status.setTotal( getTotalNumberOfLines( importedFile ) ); - if ( status != null && ! importSurveyAsCsv.getStatus().isError() ) { - ImportProcessMonitorDialog importProcessWorker = new ImportProcessMonitorDialog(importSurveyAsCsv, frame ); - importProcessWorker.start(); - } - } - } catch (Exception e1) { - JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.7") + "\n" + e1.getMessage(), importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.3"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - JOptionPane.ERROR_MESSAGE); - logger.error("Error importing data from " + importedFile.getAbsolutePath() + " in format " + importType , e1); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - } - }.start(); - break; - case FUSION: - break; - default: - break; - } - } } - private long getTotalNumberOfLines(File importedFile) { - long count = 0; - BufferedReader br = null; - try { - br = new BufferedReader(new InputStreamReader(new FileInputStream(importedFile))); - - while ( br.readLine() != null) { - count++; - } - } catch (IOException e) { - logger.error("Error counting the number of lines in file " + importedFile.getAbsolutePath() , e) ; //$NON-NLS-1$ - }finally { - if( br!=null) { - try { - br.close(); - } catch (IOException e) { - logger.error("Error closing file reader " + importedFile.getAbsolutePath() , e) ; - } - } - - - } - return count; - } } From 28a50d9492f39271ac2fa2d8fa6b1d7e46d4e4d1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:12 +0100 Subject: [PATCH 1244/1620] New translations ImportProcessMonitorDialog.java (English) --- .../earth/app/view/Messages_en.properties | 217 +++--------------- 1 file changed, 28 insertions(+), 189 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 88aa8edf1c..68af760ca4 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,208 +1,47 @@ package org.openforis.collect.earth.app.view; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.Arrays; - import javax.swing.JFrame; import javax.swing.JOptionPane; +import javax.swing.ProgressMonitor; +import javax.swing.SwingUtilities; -import org.apache.commons.io.IOUtils; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.DataImportExportService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.io.data.CSVDataImportProcess; -import org.openforis.collect.io.data.XMLDataImportProcess; -import org.openforis.collect.manager.process.ProcessStatus; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public final class ImportActionListener implements ActionListener { - protected static final Integer YES = 0; - protected static final Integer YES_TO_ALL = 1; - protected static final Integer NO = 2; - protected static final Integer NO_TO_ALL = 3; +import org.openforis.collect.io.ReferenceDataImportStatus; +import org.openforis.collect.io.metadata.parsing.ParsingError; +import org.openforis.collect.manager.process.AbstractProcess; - private final DataFormat importFormat; - private JFrame frame; - private LocalPropertiesService localPropertiesService; - private DataImportExportService dataImportService; - private Logger logger = LoggerFactory.getLogger( ImportActionListener.class ); +public class ImportProcessMonitorDialog extends ProcessMonitorDialog> { - public ImportActionListener(DataFormat importFormat, JFrame frame, LocalPropertiesService localPropertiesService, DataImportExportService dataImportService) { - this.importFormat = importFormat; - this.frame = frame; - this.localPropertiesService = localPropertiesService; - this.dataImportService = dataImportService; - } + private JFrame parentFrame; - @Override - public void actionPerformed(ActionEvent e) { - try{ - CollectEarthWindow.startWaiting(frame); - importDataFrom(e, importFormat ); - }finally{ - CollectEarthWindow.endWaiting( frame); - } + public ImportProcessMonitorDialog(AbstractProcess> importProcess, JFrame parentFrame ) { + super(); + this.process = importProcess; + this.parentFrame = parentFrame; + SwingUtilities.invokeLater( () -> { + progressMonitor = new ProgressMonitor(parentFrame, Messages.getString("ExportDialogProcessMonitor.0"), Messages.getString("ExportDialogProcessMonitor.1"), 0, 100); //$NON-NLS-1$ //$NON-NLS-2$ + progressMonitor.setMillisToPopup(1000); + } ); } - - private void forceRefreshGoogleEarth() { - - EarthApp.executeKmlLoadAsynchronously( null ); + protected String getProcessActionMessage() { + return Messages.getString("ImportProcessMonitorDialog.0"); //$NON-NLS-1$ } - private Integer shouldImportNonFinishedRecords( boolean moreThanOneFiles ) { - String message = "" //$NON-NLS-1$ - + Messages.getString("ImportActionListener.0") //$NON-NLS-1$ - +"
" //$NON-NLS-1$ - + Messages.getString("ImportActionListener.2") //$NON-NLS-1$ - + ""; - - if( !moreThanOneFiles ){ - - final int selectedOption = JOptionPane.showConfirmDialog(null, - message //$NON-NLS-1$ - ,Messages.getString("ImportActionListener.3"), //$NON-NLS-1$ - JOptionPane.YES_NO_OPTION); + + + @Override + public void run() { - if (selectedOption == JOptionPane.YES_OPTION){ - return YES; - }else if (selectedOption == JOptionPane.NO_OPTION){ - return NO; - }else{ - return JOptionPane.CLOSED_OPTION; + try { + monitorProgress(); + process.call(); + if( process.getStatus().isComplete() ) { + JOptionPane.showMessageDialog( parentFrame, "Update finished", "CSV Update", JOptionPane.INFORMATION_MESSAGE); } - }else{ - - String[] buttons = { Messages.getString("YES"), Messages.getString("YES_TO_ALL"), Messages.getString("NO"), Messages.getString("NO_TO_ALL") }; - - return JOptionPane.showOptionDialog(null, message, Messages.getString("ImportActionListener.3") , - JOptionPane.WARNING_MESSAGE, 0, null, buttons, buttons[1]); - + } catch (final Exception e) { + logger.error("Error starting the process", e); //$NON-NLS-1$ } - } - - private void importDataFrom(final ActionEvent e, final DataFormat importType) { - File[] filesToImport = JFileChooserExistsAware.getFileChooserResults( importType, false, true, null, localPropertiesService, frame ); - final ImportXMLDialogProcessMonitor importDialogProcessMonitor = new ImportXMLDialogProcessMonitor(); - if (filesToImport != null) { - - - switch (importType) { - case ZIP_WITH_XML: - new Thread("XML Import Thread " ){ //$NON-NLS-1$ - @Override - public void run() { - Integer importNonFinishedPlots = shouldImportNonFinishedRecords( filesToImport.length > 1); - boolean firstFile = true; - for (final File importedFile : filesToImport) { - XMLDataImportProcess dataImportProcess = null; - try{ - if ( firstFile ){ - firstFile = false; - }else if ( !firstFile && (importNonFinishedPlots.equals( YES ) || importNonFinishedPlots.equals( NO ) ) ){ - importNonFinishedPlots = shouldImportNonFinishedRecords( filesToImport.length > 1); - } - - if( importNonFinishedPlots.equals( JOptionPane.CLOSED_OPTION ) ){ - break; - } - - boolean importNotFinished= importNonFinishedPlots.equals( YES ) || importNonFinishedPlots.equals( YES_TO_ALL ); - - dataImportProcess = dataImportService.getImportSummary(importedFile, importNotFinished); - importDialogProcessMonitor.startImport(dataImportProcess, frame, dataImportService, importedFile ); - - } catch (Exception e1) { - logger.error("Error importing data" , e1); //$NON-NLS-1$ - importDialogProcessMonitor.closeProgressmonitor(); - JOptionPane.showMessageDialog( frame, importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.3"), importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.7"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - JOptionPane.ERROR_MESSAGE); - logger.error("Error importing data from " + importedFile.getAbsolutePath() + " in format " + importType.name() , e1); //$NON-NLS-1$ //$NON-NLS-2$ - } finally { - IOUtils.closeQuietly(dataImportProcess); - } - } - forceRefreshGoogleEarth(); - } - }.start(); - break; - case CSV: - new Thread("Update using CSV Thread " ){ //$NON-NLS-1$ - @Override - public void run() { - - String[] ids = dataImportService.getEarthSurveyService().getKeyNamesForSurvey(); - String keyAttributesForSurvey = Arrays.toString( ids ); - - JOptionPane.showMessageDialog( - frame, - "The CSV files used must have columns with at least the headers for the key attributes " + keyAttributesForSurvey+ " followed by one or more attribute names ( see http://www.openforis.org/support/questions/80/changing-plot-attributes-in-the-collect-earth-database ) ", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - "CSV file format info", - JOptionPane.INFORMATION_MESSAGE); - - - for (final File importedFile : filesToImport) { - - CSVDataImportProcess importSurveyAsCsv = null; - try { - importSurveyAsCsv = dataImportService.getCsvImporterProcess(importedFile); - - if( importSurveyAsCsv != null ){ - importSurveyAsCsv.init(); - ProcessStatus status = importSurveyAsCsv.getStatus(); - status.setTotal( getTotalNumberOfLines( importedFile ) ); - if ( status != null && ! importSurveyAsCsv.getStatus().isError() ) { - ImportProcessMonitorDialog importProcessWorker = new ImportProcessMonitorDialog(importSurveyAsCsv, frame ); - importProcessWorker.start(); - } - } - } catch (Exception e1) { - JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.7") + "\n" + e1.getMessage(), importedFile.getName() + " - " + Messages.getString("CollectEarthWindow.3"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - JOptionPane.ERROR_MESSAGE); - logger.error("Error importing data from " + importedFile.getAbsolutePath() + " in format " + importType , e1); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - } - }.start(); - break; - case FUSION: - break; - default: - break; - } - } } - private long getTotalNumberOfLines(File importedFile) { - long count = 0; - BufferedReader br = null; - try { - br = new BufferedReader(new InputStreamReader(new FileInputStream(importedFile))); - - while ( br.readLine() != null) { - count++; - } - } catch (IOException e) { - logger.error("Error counting the number of lines in file " + importedFile.getAbsolutePath() , e) ; //$NON-NLS-1$ - }finally { - if( br!=null) { - try { - br.close(); - } catch (IOException e) { - logger.error("Error closing file reader " + importedFile.getAbsolutePath() , e) ; - } - } - - - } - return count; - } } From 2cbc8f3582816a5f44b8ce26dce95125cf2f5329 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:13 +0100 Subject: [PATCH 1245/1620] New translations ImportXMLDialogProcessMonitor.java (French) --- .../earth/app/view/Messages_fr.properties | 202 +++++++++++++++--- 1 file changed, 178 insertions(+), 24 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 68af760ca4..ab7f149d0c 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,46 +1,200 @@ package org.openforis.collect.earth.app.view; +import java.awt.Toolkit; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.security.SecureRandom; +import java.util.List; +import java.util.Observable; +import java.util.Observer; +import java.util.Random; + import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.ProgressMonitor; import javax.swing.SwingUtilities; -import org.openforis.collect.io.ReferenceDataImportStatus; -import org.openforis.collect.io.metadata.parsing.ParsingError; -import org.openforis.collect.manager.process.AbstractProcess; +import org.apache.commons.io.FileUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.DataImportExportService; +import org.openforis.collect.io.data.DataImportState; +import org.openforis.collect.io.data.DataImportSummaryItem; +import org.openforis.collect.io.data.XMLDataImportProcess; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.exception.ZipException; -public class ImportProcessMonitorDialog extends ProcessMonitorDialog> { +public class ImportXMLDialogProcessMonitor implements Observer{ - private JFrame parentFrame; + private static final Logger logger = LoggerFactory.getLogger(ImportXMLDialogProcessMonitor.class); + private InfiniteProgressMonitor progressMonitor; - public ImportProcessMonitorDialog(AbstractProcess> importProcess, JFrame parentFrame ) { - super(); - this.process = importProcess; - this.parentFrame = parentFrame; + public void closeProgressmonitor() { + SwingUtilities.invokeLater( () -> { - progressMonitor = new ProgressMonitor(parentFrame, Messages.getString("ExportDialogProcessMonitor.0"), Messages.getString("ExportDialogProcessMonitor.1"), 0, 100); //$NON-NLS-1$ //$NON-NLS-2$ - progressMonitor.setMillisToPopup(1000); + if (progressMonitor != null) { + progressMonitor.close(); + } } ); } - protected String getProcessActionMessage() { - return Messages.getString("ImportProcessMonitorDialog.0"); //$NON-NLS-1$ + private boolean shouldAddConflictingRecords(List listConflictingRecords, String importedFileName) { + + if ( !listConflictingRecords.isEmpty() ) { + + Object[] options = {Messages.getString("ImportXMLDialogProcessMonitor.1"), Messages.getString("ImportXMLDialogProcessMonitor.2")}; + + final int selectedOption = JOptionPane.showOptionDialog(null, + + "" //$NON-NLS-1$ + + "" + importedFileName + " :
" //$NON-NLS-1$ //$NON-NLS-2$ + + Messages.getString("CollectEarthWindow.9") //$NON-NLS-1$ + + "
" //$NON-NLS-1$ + + Messages.getString("CollectEarthWindow.20") + listConflictingRecords.size() //$NON-NLS-1$ + + "
" //$NON-NLS-1$ + + Messages.getString("CollectEarthWindow.25") //$NON-NLS-1$ + + "
" //$NON-NLS-1$ + + "" //$NON-NLS-1$ + + Messages.getString("CollectEarthWindow.39") //$NON-NLS-1$ + + "" //$NON-NLS-1$ + + "", //$NON-NLS-1$ + + Messages.getString("CollectEarthWindow.43"), //$NON-NLS-1$ + + JOptionPane.YES_NO_OPTION, + JOptionPane.QUESTION_MESSAGE, + null, //do not use a custom Icon + options, //the titles of buttons + options[1] //default button title + ); + + return (selectedOption == JOptionPane.YES_OPTION); + } else { + return false; + } } - - - @Override - public void run() { + public synchronized void startImport(final XMLDataImportProcess importProcess, final JFrame parentFrame, + final DataImportExportService dataImportService, final File importedFile ) throws Exception { + + try { + + SwingUtilities.invokeLater( () -> { + + progressMonitor = new InfiniteProgressMonitor(parentFrame, Messages.getString("ImportDialogProcessMonitor.8") + "(" //$NON-NLS-1$ //$NON-NLS-2$ + + importedFile.getName() + ")", Messages.getString("ImportDialogProcessMonitor.11") + Messages.getString("ImportDialogProcessMonitor.0")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + progressMonitor.showLater(); + + if (progressMonitor != null && progressMonitor.isUserCancelled()) { + + Toolkit.getDefaultToolkit().beep(); + importProcess.cancel(); + logger.warn("Import Task canceled.\n"); //$NON-NLS-1$ + + } + } + ); + + File definitiveFileToImport = importedFile; + // If the file is exported from Collect rather than a XML export from Collect Earth + if( isCollectDataExport( definitiveFileToImport ) ){ + // Transform the file to a Collect Earth type of format + definitiveFileToImport = transformCollectDataFile( definitiveFileToImport ); + if( definitiveFileToImport == null ) return; // there was a problem with the file to import, execute finally + importProcess.setFile( definitiveFileToImport ); + } + + importProcess.callAndObserve( this ); + + if (importProcess.getSummary() != null && !importProcess.getState().isCancelled()) { + + final List conflictingRecords = importProcess.getSummary().getConflictingRecords(); + + if ( + conflictingRecords != null + && + !conflictingRecords.isEmpty() + && + !shouldAddConflictingRecords(conflictingRecords, definitiveFileToImport.getName()) + ) { + conflictingRecords.clear(); + } + final int totalRecords = ( conflictingRecords==null?0:conflictingRecords.size() ) + importProcess.getSummary().getRecordsToImport().size(); + SwingUtilities.invokeLater( () -> + progressMonitor.setMessage( Messages.getString("ImportDialogProcessMonitor.11") + totalRecords ) //$NON-NLS-1$ + ); + + dataImportService.importRecordsFrom(definitiveFileToImport, importProcess, conflictingRecords ); + + } + } finally { + closeProgressmonitor(); + } + + } + + + private boolean isCollectDataExport(File importedFile) { + return importedFile.getName().endsWith(".collect-data"); + } + + private File transformCollectDataFile(File zipWithXml) throws ZipException, IOException { + + Random random; + File dst = null; try { - monitorProgress(); - process.call(); - if( process.getStatus().isComplete() ) { - JOptionPane.showMessageDialog( parentFrame, "Update finished", "CSV Update", JOptionPane.INFORMATION_MESSAGE); + random = SecureRandom.getInstanceStrong(); + + // Originally the collect-data file will look like this: + // root: idml.xml + // root : data (folder) + // root : data/1 (folder) + // the XML files will be under the data + File tempFolder = null; + try (ZipFile src = new ZipFile( zipWithXml )){ + tempFolder = Files.createTempDirectory("tempCE").toFile(); + src.extractAll( tempFolder.getAbsolutePath() ); + + + dst = new File( tempFolder.getParentFile(), "transform" + random.nextInt() + ".zip"); + dst.deleteOnExit(); + + String surveyDefinitonName = "idml.xml"; + File definition = new File(tempFolder, surveyDefinitonName); + + try( ZipFile transformedCollectData = CollectEarthUtils.addFileToZip(dst , definition , surveyDefinitonName) ){ + addStepToZip(tempFolder, transformedCollectData, "1"); + addStepToZip(tempFolder, transformedCollectData, "2"); + addStepToZip(tempFolder, transformedCollectData, "3"); + } + } finally { + FileUtils.deleteQuietly(tempFolder); } - } catch (final Exception e) { - logger.error("Error starting the process", e); //$NON-NLS-1$ + } catch (Exception e) { + logger.error( "Error importing data", e); } + return dst; + } + + + private void addStepToZip(File tempFolder, ZipFile dstZipFile, String step) + throws ZipException { + File folderToZip = new File( tempFolder, "data"+ File.separator+step); + CollectEarthUtils.addFolderToZip(dstZipFile, folderToZip); + } + + @Override + public void update(Observable o, Object arg) { + + SwingUtilities.invokeLater( () -> { + DataImportState importState = (DataImportState) o ; + progressMonitor.setMessage( Messages.getString("ImportDialogProcessMonitor.2") ); //$NON-NLS-1$ + progressMonitor.updateProgress( importState.getCount(), importState.getTotal()); + } ); } From f29d6da1db698340b14868cf1a2c774918edca52 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:15 +0100 Subject: [PATCH 1246/1620] New translations ImportXMLDialogProcessMonitor.java (Spanish) --- .../earth/app/view/Messages_es.properties | 202 +++++++++++++++--- 1 file changed, 178 insertions(+), 24 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 68af760ca4..ab7f149d0c 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,46 +1,200 @@ package org.openforis.collect.earth.app.view; +import java.awt.Toolkit; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.security.SecureRandom; +import java.util.List; +import java.util.Observable; +import java.util.Observer; +import java.util.Random; + import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.ProgressMonitor; import javax.swing.SwingUtilities; -import org.openforis.collect.io.ReferenceDataImportStatus; -import org.openforis.collect.io.metadata.parsing.ParsingError; -import org.openforis.collect.manager.process.AbstractProcess; +import org.apache.commons.io.FileUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.DataImportExportService; +import org.openforis.collect.io.data.DataImportState; +import org.openforis.collect.io.data.DataImportSummaryItem; +import org.openforis.collect.io.data.XMLDataImportProcess; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.exception.ZipException; -public class ImportProcessMonitorDialog extends ProcessMonitorDialog> { +public class ImportXMLDialogProcessMonitor implements Observer{ - private JFrame parentFrame; + private static final Logger logger = LoggerFactory.getLogger(ImportXMLDialogProcessMonitor.class); + private InfiniteProgressMonitor progressMonitor; - public ImportProcessMonitorDialog(AbstractProcess> importProcess, JFrame parentFrame ) { - super(); - this.process = importProcess; - this.parentFrame = parentFrame; + public void closeProgressmonitor() { + SwingUtilities.invokeLater( () -> { - progressMonitor = new ProgressMonitor(parentFrame, Messages.getString("ExportDialogProcessMonitor.0"), Messages.getString("ExportDialogProcessMonitor.1"), 0, 100); //$NON-NLS-1$ //$NON-NLS-2$ - progressMonitor.setMillisToPopup(1000); + if (progressMonitor != null) { + progressMonitor.close(); + } } ); } - protected String getProcessActionMessage() { - return Messages.getString("ImportProcessMonitorDialog.0"); //$NON-NLS-1$ + private boolean shouldAddConflictingRecords(List listConflictingRecords, String importedFileName) { + + if ( !listConflictingRecords.isEmpty() ) { + + Object[] options = {Messages.getString("ImportXMLDialogProcessMonitor.1"), Messages.getString("ImportXMLDialogProcessMonitor.2")}; + + final int selectedOption = JOptionPane.showOptionDialog(null, + + "" //$NON-NLS-1$ + + "" + importedFileName + " :
" //$NON-NLS-1$ //$NON-NLS-2$ + + Messages.getString("CollectEarthWindow.9") //$NON-NLS-1$ + + "
" //$NON-NLS-1$ + + Messages.getString("CollectEarthWindow.20") + listConflictingRecords.size() //$NON-NLS-1$ + + "
" //$NON-NLS-1$ + + Messages.getString("CollectEarthWindow.25") //$NON-NLS-1$ + + "
" //$NON-NLS-1$ + + "" //$NON-NLS-1$ + + Messages.getString("CollectEarthWindow.39") //$NON-NLS-1$ + + "" //$NON-NLS-1$ + + "", //$NON-NLS-1$ + + Messages.getString("CollectEarthWindow.43"), //$NON-NLS-1$ + + JOptionPane.YES_NO_OPTION, + JOptionPane.QUESTION_MESSAGE, + null, //do not use a custom Icon + options, //the titles of buttons + options[1] //default button title + ); + + return (selectedOption == JOptionPane.YES_OPTION); + } else { + return false; + } } - - - @Override - public void run() { + public synchronized void startImport(final XMLDataImportProcess importProcess, final JFrame parentFrame, + final DataImportExportService dataImportService, final File importedFile ) throws Exception { + + try { + + SwingUtilities.invokeLater( () -> { + + progressMonitor = new InfiniteProgressMonitor(parentFrame, Messages.getString("ImportDialogProcessMonitor.8") + "(" //$NON-NLS-1$ //$NON-NLS-2$ + + importedFile.getName() + ")", Messages.getString("ImportDialogProcessMonitor.11") + Messages.getString("ImportDialogProcessMonitor.0")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + progressMonitor.showLater(); + + if (progressMonitor != null && progressMonitor.isUserCancelled()) { + + Toolkit.getDefaultToolkit().beep(); + importProcess.cancel(); + logger.warn("Import Task canceled.\n"); //$NON-NLS-1$ + + } + } + ); + + File definitiveFileToImport = importedFile; + // If the file is exported from Collect rather than a XML export from Collect Earth + if( isCollectDataExport( definitiveFileToImport ) ){ + // Transform the file to a Collect Earth type of format + definitiveFileToImport = transformCollectDataFile( definitiveFileToImport ); + if( definitiveFileToImport == null ) return; // there was a problem with the file to import, execute finally + importProcess.setFile( definitiveFileToImport ); + } + + importProcess.callAndObserve( this ); + + if (importProcess.getSummary() != null && !importProcess.getState().isCancelled()) { + + final List conflictingRecords = importProcess.getSummary().getConflictingRecords(); + + if ( + conflictingRecords != null + && + !conflictingRecords.isEmpty() + && + !shouldAddConflictingRecords(conflictingRecords, definitiveFileToImport.getName()) + ) { + conflictingRecords.clear(); + } + final int totalRecords = ( conflictingRecords==null?0:conflictingRecords.size() ) + importProcess.getSummary().getRecordsToImport().size(); + SwingUtilities.invokeLater( () -> + progressMonitor.setMessage( Messages.getString("ImportDialogProcessMonitor.11") + totalRecords ) //$NON-NLS-1$ + ); + + dataImportService.importRecordsFrom(definitiveFileToImport, importProcess, conflictingRecords ); + + } + } finally { + closeProgressmonitor(); + } + + } + + + private boolean isCollectDataExport(File importedFile) { + return importedFile.getName().endsWith(".collect-data"); + } + + private File transformCollectDataFile(File zipWithXml) throws ZipException, IOException { + + Random random; + File dst = null; try { - monitorProgress(); - process.call(); - if( process.getStatus().isComplete() ) { - JOptionPane.showMessageDialog( parentFrame, "Update finished", "CSV Update", JOptionPane.INFORMATION_MESSAGE); + random = SecureRandom.getInstanceStrong(); + + // Originally the collect-data file will look like this: + // root: idml.xml + // root : data (folder) + // root : data/1 (folder) + // the XML files will be under the data + File tempFolder = null; + try (ZipFile src = new ZipFile( zipWithXml )){ + tempFolder = Files.createTempDirectory("tempCE").toFile(); + src.extractAll( tempFolder.getAbsolutePath() ); + + + dst = new File( tempFolder.getParentFile(), "transform" + random.nextInt() + ".zip"); + dst.deleteOnExit(); + + String surveyDefinitonName = "idml.xml"; + File definition = new File(tempFolder, surveyDefinitonName); + + try( ZipFile transformedCollectData = CollectEarthUtils.addFileToZip(dst , definition , surveyDefinitonName) ){ + addStepToZip(tempFolder, transformedCollectData, "1"); + addStepToZip(tempFolder, transformedCollectData, "2"); + addStepToZip(tempFolder, transformedCollectData, "3"); + } + } finally { + FileUtils.deleteQuietly(tempFolder); } - } catch (final Exception e) { - logger.error("Error starting the process", e); //$NON-NLS-1$ + } catch (Exception e) { + logger.error( "Error importing data", e); } + return dst; + } + + + private void addStepToZip(File tempFolder, ZipFile dstZipFile, String step) + throws ZipException { + File folderToZip = new File( tempFolder, "data"+ File.separator+step); + CollectEarthUtils.addFolderToZip(dstZipFile, folderToZip); + } + + @Override + public void update(Observable o, Object arg) { + + SwingUtilities.invokeLater( () -> { + DataImportState importState = (DataImportState) o ; + progressMonitor.setMessage( Messages.getString("ImportDialogProcessMonitor.2") ); //$NON-NLS-1$ + progressMonitor.updateProgress( importState.getCount(), importState.getTotal()); + } ); } From 144f20da02281304b85e8742e2ed5143733d51eb Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:16 +0100 Subject: [PATCH 1247/1620] New translations ImportXMLDialogProcessMonitor.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 202 +++++++++++++++--- 1 file changed, 178 insertions(+), 24 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 68af760ca4..ab7f149d0c 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,46 +1,200 @@ package org.openforis.collect.earth.app.view; +import java.awt.Toolkit; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.security.SecureRandom; +import java.util.List; +import java.util.Observable; +import java.util.Observer; +import java.util.Random; + import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.ProgressMonitor; import javax.swing.SwingUtilities; -import org.openforis.collect.io.ReferenceDataImportStatus; -import org.openforis.collect.io.metadata.parsing.ParsingError; -import org.openforis.collect.manager.process.AbstractProcess; +import org.apache.commons.io.FileUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.DataImportExportService; +import org.openforis.collect.io.data.DataImportState; +import org.openforis.collect.io.data.DataImportSummaryItem; +import org.openforis.collect.io.data.XMLDataImportProcess; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.exception.ZipException; -public class ImportProcessMonitorDialog extends ProcessMonitorDialog> { +public class ImportXMLDialogProcessMonitor implements Observer{ - private JFrame parentFrame; + private static final Logger logger = LoggerFactory.getLogger(ImportXMLDialogProcessMonitor.class); + private InfiniteProgressMonitor progressMonitor; - public ImportProcessMonitorDialog(AbstractProcess> importProcess, JFrame parentFrame ) { - super(); - this.process = importProcess; - this.parentFrame = parentFrame; + public void closeProgressmonitor() { + SwingUtilities.invokeLater( () -> { - progressMonitor = new ProgressMonitor(parentFrame, Messages.getString("ExportDialogProcessMonitor.0"), Messages.getString("ExportDialogProcessMonitor.1"), 0, 100); //$NON-NLS-1$ //$NON-NLS-2$ - progressMonitor.setMillisToPopup(1000); + if (progressMonitor != null) { + progressMonitor.close(); + } } ); } - protected String getProcessActionMessage() { - return Messages.getString("ImportProcessMonitorDialog.0"); //$NON-NLS-1$ + private boolean shouldAddConflictingRecords(List listConflictingRecords, String importedFileName) { + + if ( !listConflictingRecords.isEmpty() ) { + + Object[] options = {Messages.getString("ImportXMLDialogProcessMonitor.1"), Messages.getString("ImportXMLDialogProcessMonitor.2")}; + + final int selectedOption = JOptionPane.showOptionDialog(null, + + "" //$NON-NLS-1$ + + "" + importedFileName + " :
" //$NON-NLS-1$ //$NON-NLS-2$ + + Messages.getString("CollectEarthWindow.9") //$NON-NLS-1$ + + "
" //$NON-NLS-1$ + + Messages.getString("CollectEarthWindow.20") + listConflictingRecords.size() //$NON-NLS-1$ + + "
" //$NON-NLS-1$ + + Messages.getString("CollectEarthWindow.25") //$NON-NLS-1$ + + "
" //$NON-NLS-1$ + + "" //$NON-NLS-1$ + + Messages.getString("CollectEarthWindow.39") //$NON-NLS-1$ + + "" //$NON-NLS-1$ + + "", //$NON-NLS-1$ + + Messages.getString("CollectEarthWindow.43"), //$NON-NLS-1$ + + JOptionPane.YES_NO_OPTION, + JOptionPane.QUESTION_MESSAGE, + null, //do not use a custom Icon + options, //the titles of buttons + options[1] //default button title + ); + + return (selectedOption == JOptionPane.YES_OPTION); + } else { + return false; + } } - - - @Override - public void run() { + public synchronized void startImport(final XMLDataImportProcess importProcess, final JFrame parentFrame, + final DataImportExportService dataImportService, final File importedFile ) throws Exception { + + try { + + SwingUtilities.invokeLater( () -> { + + progressMonitor = new InfiniteProgressMonitor(parentFrame, Messages.getString("ImportDialogProcessMonitor.8") + "(" //$NON-NLS-1$ //$NON-NLS-2$ + + importedFile.getName() + ")", Messages.getString("ImportDialogProcessMonitor.11") + Messages.getString("ImportDialogProcessMonitor.0")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + progressMonitor.showLater(); + + if (progressMonitor != null && progressMonitor.isUserCancelled()) { + + Toolkit.getDefaultToolkit().beep(); + importProcess.cancel(); + logger.warn("Import Task canceled.\n"); //$NON-NLS-1$ + + } + } + ); + + File definitiveFileToImport = importedFile; + // If the file is exported from Collect rather than a XML export from Collect Earth + if( isCollectDataExport( definitiveFileToImport ) ){ + // Transform the file to a Collect Earth type of format + definitiveFileToImport = transformCollectDataFile( definitiveFileToImport ); + if( definitiveFileToImport == null ) return; // there was a problem with the file to import, execute finally + importProcess.setFile( definitiveFileToImport ); + } + + importProcess.callAndObserve( this ); + + if (importProcess.getSummary() != null && !importProcess.getState().isCancelled()) { + + final List conflictingRecords = importProcess.getSummary().getConflictingRecords(); + + if ( + conflictingRecords != null + && + !conflictingRecords.isEmpty() + && + !shouldAddConflictingRecords(conflictingRecords, definitiveFileToImport.getName()) + ) { + conflictingRecords.clear(); + } + final int totalRecords = ( conflictingRecords==null?0:conflictingRecords.size() ) + importProcess.getSummary().getRecordsToImport().size(); + SwingUtilities.invokeLater( () -> + progressMonitor.setMessage( Messages.getString("ImportDialogProcessMonitor.11") + totalRecords ) //$NON-NLS-1$ + ); + + dataImportService.importRecordsFrom(definitiveFileToImport, importProcess, conflictingRecords ); + + } + } finally { + closeProgressmonitor(); + } + + } + + + private boolean isCollectDataExport(File importedFile) { + return importedFile.getName().endsWith(".collect-data"); + } + + private File transformCollectDataFile(File zipWithXml) throws ZipException, IOException { + + Random random; + File dst = null; try { - monitorProgress(); - process.call(); - if( process.getStatus().isComplete() ) { - JOptionPane.showMessageDialog( parentFrame, "Update finished", "CSV Update", JOptionPane.INFORMATION_MESSAGE); + random = SecureRandom.getInstanceStrong(); + + // Originally the collect-data file will look like this: + // root: idml.xml + // root : data (folder) + // root : data/1 (folder) + // the XML files will be under the data + File tempFolder = null; + try (ZipFile src = new ZipFile( zipWithXml )){ + tempFolder = Files.createTempDirectory("tempCE").toFile(); + src.extractAll( tempFolder.getAbsolutePath() ); + + + dst = new File( tempFolder.getParentFile(), "transform" + random.nextInt() + ".zip"); + dst.deleteOnExit(); + + String surveyDefinitonName = "idml.xml"; + File definition = new File(tempFolder, surveyDefinitonName); + + try( ZipFile transformedCollectData = CollectEarthUtils.addFileToZip(dst , definition , surveyDefinitonName) ){ + addStepToZip(tempFolder, transformedCollectData, "1"); + addStepToZip(tempFolder, transformedCollectData, "2"); + addStepToZip(tempFolder, transformedCollectData, "3"); + } + } finally { + FileUtils.deleteQuietly(tempFolder); } - } catch (final Exception e) { - logger.error("Error starting the process", e); //$NON-NLS-1$ + } catch (Exception e) { + logger.error( "Error importing data", e); } + return dst; + } + + + private void addStepToZip(File tempFolder, ZipFile dstZipFile, String step) + throws ZipException { + File folderToZip = new File( tempFolder, "data"+ File.separator+step); + CollectEarthUtils.addFolderToZip(dstZipFile, folderToZip); + } + + @Override + public void update(Observable o, Object arg) { + + SwingUtilities.invokeLater( () -> { + DataImportState importState = (DataImportState) o ; + progressMonitor.setMessage( Messages.getString("ImportDialogProcessMonitor.2") ); //$NON-NLS-1$ + progressMonitor.updateProgress( importState.getCount(), importState.getTotal()); + } ); } From be61d82c49bfe405245a65c6b90f343ab21f0dba Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:17 +0100 Subject: [PATCH 1248/1620] New translations ImportXMLDialogProcessMonitor.java (English) --- .../earth/app/view/Messages_en.properties | 202 +++++++++++++++--- 1 file changed, 178 insertions(+), 24 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 68af760ca4..ab7f149d0c 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,46 +1,200 @@ package org.openforis.collect.earth.app.view; +import java.awt.Toolkit; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.security.SecureRandom; +import java.util.List; +import java.util.Observable; +import java.util.Observer; +import java.util.Random; + import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.ProgressMonitor; import javax.swing.SwingUtilities; -import org.openforis.collect.io.ReferenceDataImportStatus; -import org.openforis.collect.io.metadata.parsing.ParsingError; -import org.openforis.collect.manager.process.AbstractProcess; +import org.apache.commons.io.FileUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.DataImportExportService; +import org.openforis.collect.io.data.DataImportState; +import org.openforis.collect.io.data.DataImportSummaryItem; +import org.openforis.collect.io.data.XMLDataImportProcess; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.exception.ZipException; -public class ImportProcessMonitorDialog extends ProcessMonitorDialog> { +public class ImportXMLDialogProcessMonitor implements Observer{ - private JFrame parentFrame; + private static final Logger logger = LoggerFactory.getLogger(ImportXMLDialogProcessMonitor.class); + private InfiniteProgressMonitor progressMonitor; - public ImportProcessMonitorDialog(AbstractProcess> importProcess, JFrame parentFrame ) { - super(); - this.process = importProcess; - this.parentFrame = parentFrame; + public void closeProgressmonitor() { + SwingUtilities.invokeLater( () -> { - progressMonitor = new ProgressMonitor(parentFrame, Messages.getString("ExportDialogProcessMonitor.0"), Messages.getString("ExportDialogProcessMonitor.1"), 0, 100); //$NON-NLS-1$ //$NON-NLS-2$ - progressMonitor.setMillisToPopup(1000); + if (progressMonitor != null) { + progressMonitor.close(); + } } ); } - protected String getProcessActionMessage() { - return Messages.getString("ImportProcessMonitorDialog.0"); //$NON-NLS-1$ + private boolean shouldAddConflictingRecords(List listConflictingRecords, String importedFileName) { + + if ( !listConflictingRecords.isEmpty() ) { + + Object[] options = {Messages.getString("ImportXMLDialogProcessMonitor.1"), Messages.getString("ImportXMLDialogProcessMonitor.2")}; + + final int selectedOption = JOptionPane.showOptionDialog(null, + + "" //$NON-NLS-1$ + + "" + importedFileName + " :
" //$NON-NLS-1$ //$NON-NLS-2$ + + Messages.getString("CollectEarthWindow.9") //$NON-NLS-1$ + + "
" //$NON-NLS-1$ + + Messages.getString("CollectEarthWindow.20") + listConflictingRecords.size() //$NON-NLS-1$ + + "
" //$NON-NLS-1$ + + Messages.getString("CollectEarthWindow.25") //$NON-NLS-1$ + + "
" //$NON-NLS-1$ + + "" //$NON-NLS-1$ + + Messages.getString("CollectEarthWindow.39") //$NON-NLS-1$ + + "" //$NON-NLS-1$ + + "", //$NON-NLS-1$ + + Messages.getString("CollectEarthWindow.43"), //$NON-NLS-1$ + + JOptionPane.YES_NO_OPTION, + JOptionPane.QUESTION_MESSAGE, + null, //do not use a custom Icon + options, //the titles of buttons + options[1] //default button title + ); + + return (selectedOption == JOptionPane.YES_OPTION); + } else { + return false; + } } - - - @Override - public void run() { + public synchronized void startImport(final XMLDataImportProcess importProcess, final JFrame parentFrame, + final DataImportExportService dataImportService, final File importedFile ) throws Exception { + + try { + + SwingUtilities.invokeLater( () -> { + + progressMonitor = new InfiniteProgressMonitor(parentFrame, Messages.getString("ImportDialogProcessMonitor.8") + "(" //$NON-NLS-1$ //$NON-NLS-2$ + + importedFile.getName() + ")", Messages.getString("ImportDialogProcessMonitor.11") + Messages.getString("ImportDialogProcessMonitor.0")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + progressMonitor.showLater(); + + if (progressMonitor != null && progressMonitor.isUserCancelled()) { + + Toolkit.getDefaultToolkit().beep(); + importProcess.cancel(); + logger.warn("Import Task canceled.\n"); //$NON-NLS-1$ + + } + } + ); + + File definitiveFileToImport = importedFile; + // If the file is exported from Collect rather than a XML export from Collect Earth + if( isCollectDataExport( definitiveFileToImport ) ){ + // Transform the file to a Collect Earth type of format + definitiveFileToImport = transformCollectDataFile( definitiveFileToImport ); + if( definitiveFileToImport == null ) return; // there was a problem with the file to import, execute finally + importProcess.setFile( definitiveFileToImport ); + } + + importProcess.callAndObserve( this ); + + if (importProcess.getSummary() != null && !importProcess.getState().isCancelled()) { + + final List conflictingRecords = importProcess.getSummary().getConflictingRecords(); + + if ( + conflictingRecords != null + && + !conflictingRecords.isEmpty() + && + !shouldAddConflictingRecords(conflictingRecords, definitiveFileToImport.getName()) + ) { + conflictingRecords.clear(); + } + final int totalRecords = ( conflictingRecords==null?0:conflictingRecords.size() ) + importProcess.getSummary().getRecordsToImport().size(); + SwingUtilities.invokeLater( () -> + progressMonitor.setMessage( Messages.getString("ImportDialogProcessMonitor.11") + totalRecords ) //$NON-NLS-1$ + ); + + dataImportService.importRecordsFrom(definitiveFileToImport, importProcess, conflictingRecords ); + + } + } finally { + closeProgressmonitor(); + } + + } + + + private boolean isCollectDataExport(File importedFile) { + return importedFile.getName().endsWith(".collect-data"); + } + + private File transformCollectDataFile(File zipWithXml) throws ZipException, IOException { + + Random random; + File dst = null; try { - monitorProgress(); - process.call(); - if( process.getStatus().isComplete() ) { - JOptionPane.showMessageDialog( parentFrame, "Update finished", "CSV Update", JOptionPane.INFORMATION_MESSAGE); + random = SecureRandom.getInstanceStrong(); + + // Originally the collect-data file will look like this: + // root: idml.xml + // root : data (folder) + // root : data/1 (folder) + // the XML files will be under the data + File tempFolder = null; + try (ZipFile src = new ZipFile( zipWithXml )){ + tempFolder = Files.createTempDirectory("tempCE").toFile(); + src.extractAll( tempFolder.getAbsolutePath() ); + + + dst = new File( tempFolder.getParentFile(), "transform" + random.nextInt() + ".zip"); + dst.deleteOnExit(); + + String surveyDefinitonName = "idml.xml"; + File definition = new File(tempFolder, surveyDefinitonName); + + try( ZipFile transformedCollectData = CollectEarthUtils.addFileToZip(dst , definition , surveyDefinitonName) ){ + addStepToZip(tempFolder, transformedCollectData, "1"); + addStepToZip(tempFolder, transformedCollectData, "2"); + addStepToZip(tempFolder, transformedCollectData, "3"); + } + } finally { + FileUtils.deleteQuietly(tempFolder); } - } catch (final Exception e) { - logger.error("Error starting the process", e); //$NON-NLS-1$ + } catch (Exception e) { + logger.error( "Error importing data", e); } + return dst; + } + + + private void addStepToZip(File tempFolder, ZipFile dstZipFile, String step) + throws ZipException { + File folderToZip = new File( tempFolder, "data"+ File.separator+step); + CollectEarthUtils.addFolderToZip(dstZipFile, folderToZip); + } + + @Override + public void update(Observable o, Object arg) { + + SwingUtilities.invokeLater( () -> { + DataImportState importState = (DataImportState) o ; + progressMonitor.setMessage( Messages.getString("ImportDialogProcessMonitor.2") ); //$NON-NLS-1$ + progressMonitor.updateProgress( importState.getCount(), importState.getTotal()); + } ); } From 87863bd5a116b75b3dc1555766839b34c318544a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:19 +0100 Subject: [PATCH 1249/1620] New translations InfiniteProgressMonitor.java (Spanish) --- .../earth/app/view/Messages_es.properties | 268 ++++++++---------- 1 file changed, 120 insertions(+), 148 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index ab7f149d0c..ca537bed7a 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,201 +1,173 @@ package org.openforis.collect.earth.app.view; -import java.awt.Toolkit; -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.security.SecureRandom; -import java.util.List; -import java.util.Observable; -import java.util.Observer; -import java.util.Random; - -import javax.swing.JFrame; +import java.awt.Component; + +import javax.swing.JDialog; +import javax.swing.JLabel; import javax.swing.JOptionPane; +import javax.swing.JProgressBar; import javax.swing.SwingUtilities; -import org.apache.commons.io.FileUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.DataImportExportService; -import org.openforis.collect.io.data.DataImportState; -import org.openforis.collect.io.data.DataImportSummaryItem; -import org.openforis.collect.io.data.XMLDataImportProcess; +import org.apache.commons.lang3.StringUtils; +import org.openforis.concurrency.Progress; +import org.openforis.concurrency.ProgressListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import net.lingala.zip4j.ZipFile; -import net.lingala.zip4j.exception.ZipException; - -public class ImportXMLDialogProcessMonitor implements Observer{ +public class InfiniteProgressMonitor implements ProgressListener { - private static final Logger logger = LoggerFactory.getLogger(ImportXMLDialogProcessMonitor.class); - private InfiniteProgressMonitor progressMonitor; + JDialog infiniteWaitingDialog; + private boolean userCancelled = false; - public void closeProgressmonitor() { - - SwingUtilities.invokeLater( () -> { - if (progressMonitor != null) { - progressMonitor.close(); - } - } ); - } + private JDialog dialog; - private boolean shouldAddConflictingRecords(List listConflictingRecords, String importedFileName) { + private JOptionPane pane; - if ( !listConflictingRecords.isEmpty() ) { + private String cancelOption; - Object[] options = {Messages.getString("ImportXMLDialogProcessMonitor.1"), Messages.getString("ImportXMLDialogProcessMonitor.2")}; + private JLabel label; - final int selectedOption = JOptionPane.showOptionDialog(null, + JProgressBar infiniteProgress; + + private Logger logger = LoggerFactory.getLogger( InfiniteProgressMonitor.class ); + + public InfiniteProgressMonitor(Component parentFrame, String title, String message) { - "" //$NON-NLS-1$ - + "" + importedFileName + " :
" //$NON-NLS-1$ //$NON-NLS-2$ - + Messages.getString("CollectEarthWindow.9") //$NON-NLS-1$ - + "
" //$NON-NLS-1$ - + Messages.getString("CollectEarthWindow.20") + listConflictingRecords.size() //$NON-NLS-1$ - + "
" //$NON-NLS-1$ - + Messages.getString("CollectEarthWindow.25") //$NON-NLS-1$ - + "
" //$NON-NLS-1$ - + "" //$NON-NLS-1$ - + Messages.getString("CollectEarthWindow.39") //$NON-NLS-1$ - + "" //$NON-NLS-1$ - + "", //$NON-NLS-1$ + infiniteProgress = new JProgressBar(); + infiniteProgress.setIndeterminate(true); + label = new JLabel(message); - Messages.getString("CollectEarthWindow.43"), //$NON-NLS-1$ + final Object[] dialogItems = { label, infiniteProgress }; - JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE, - null, //do not use a custom Icon - options, //the titles of buttons - options[1] //default button title - ); + cancelOption = Messages.getString("InfiniteProgressMonitor.0"); //$NON-NLS-1$ + final Object[] options = { cancelOption }; + setPane(new JOptionPane(dialogItems, JOptionPane.PLAIN_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, + options)); + setDialog(getPane().createDialog(parentFrame, title)); + getDialog().setModal(true); - return (selectedOption == JOptionPane.YES_OPTION); - } else { - return false; - } } - public synchronized void startImport(final XMLDataImportProcess importProcess, final JFrame parentFrame, - final DataImportExportService dataImportService, final File importedFile ) throws Exception { + public void updateProgress(int current, int total) { - try { + updateProgress(current, total, null); - SwingUtilities.invokeLater( () -> { + } + + public void updateProgress(int current, int total, String msg) { + + Runnable updateTask = () -> { + infiniteProgress.setString(current + "/" + total); + if (infiniteProgress.isIndeterminate()) { + infiniteProgress.setIndeterminate(false); + infiniteProgress.setStringPainted(true); + } - progressMonitor = new InfiniteProgressMonitor(parentFrame, Messages.getString("ImportDialogProcessMonitor.8") + "(" //$NON-NLS-1$ //$NON-NLS-2$ - + importedFile.getName() + ")", Messages.getString("ImportDialogProcessMonitor.11") + Messages.getString("ImportDialogProcessMonitor.0")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - progressMonitor.showLater(); + infiniteProgress.setMaximum(total); - if (progressMonitor != null && progressMonitor.isUserCancelled()) { + infiniteProgress.setValue(current); + if( StringUtils.isNotBlank( msg )) + setMessage( msg ); + }; + + SwingUtilities.invokeLater( updateTask ); - Toolkit.getDefaultToolkit().beep(); - importProcess.cancel(); - logger.warn("Import Task canceled.\n"); //$NON-NLS-1$ + } - } - } - ); - - File definitiveFileToImport = importedFile; - // If the file is exported from Collect rather than a XML export from Collect Earth - if( isCollectDataExport( definitiveFileToImport ) ){ - // Transform the file to a Collect Earth type of format - definitiveFileToImport = transformCollectDataFile( definitiveFileToImport ); - if( definitiveFileToImport == null ) return; // there was a problem with the file to import, execute finally - importProcess.setFile( definitiveFileToImport ); + public void updateProgress(int currentPercentage) { + Runnable updateTask = () -> { + infiniteProgress.setString(currentPercentage + "%"); + if (infiniteProgress.isIndeterminate()) { + infiniteProgress.setIndeterminate(false); + infiniteProgress.setStringPainted(true); } - importProcess.callAndObserve( this ); + infiniteProgress.setMaximum(100); - if (importProcess.getSummary() != null && !importProcess.getState().isCancelled()) { + infiniteProgress.setValue(currentPercentage); + }; + + SwingUtilities.invokeLater( updateTask ); - final List conflictingRecords = importProcess.getSummary().getConflictingRecords(); - - if ( - conflictingRecords != null - && - !conflictingRecords.isEmpty() - && - !shouldAddConflictingRecords(conflictingRecords, definitiveFileToImport.getName()) - ) { - conflictingRecords.clear(); - } - final int totalRecords = ( conflictingRecords==null?0:conflictingRecords.size() ) + importProcess.getSummary().getRecordsToImport().size(); - SwingUtilities.invokeLater( () -> - progressMonitor.setMessage( Messages.getString("ImportDialogProcessMonitor.11") + totalRecords ) //$NON-NLS-1$ - ); - - dataImportService.importRecordsFrom(definitiveFileToImport, importProcess, conflictingRecords ); - - } - } finally { - closeProgressmonitor(); - } + } + public void setMessage(String msg) { + label.setText(msg); } + public void close() { + SwingUtilities.invokeLater(() -> { + hide(); + getDialog().dispose(); + }); + } - private boolean isCollectDataExport(File importedFile) { - return importedFile.getName().endsWith(".collect-data"); + private JDialog getDialog() { + return dialog; } - private File transformCollectDataFile(File zipWithXml) throws ZipException, IOException { + public void hide() { + getDialog().setVisible(false); + } - Random random; - File dst = null; - try { - random = SecureRandom.getInstanceStrong(); + public boolean isShowing() { + return getDialog().isShowing(); + } - // Originally the collect-data file will look like this: - // root: idml.xml - // root : data (folder) - // root : data/1 (folder) - // the XML files will be under the data - File tempFolder = null; - try (ZipFile src = new ZipFile( zipWithXml )){ - tempFolder = Files.createTempDirectory("tempCE").toFile(); - src.extractAll( tempFolder.getAbsolutePath() ); + public boolean isUserCancelled() { + return userCancelled; + } + private void setDialog(JDialog dialog) { + this.dialog = dialog; + } - dst = new File( tempFolder.getParentFile(), "transform" + random.nextInt() + ".zip"); - dst.deleteOnExit(); + public void setUserCancelled(boolean userCancelled) { + this.userCancelled = userCancelled; + } + + public void show() { + + Runnable showTask = () -> { + getDialog().setVisible(true); + if (getPane().getValue() == null // User closes the dialog + || + getPane().getValue().equals(cancelOption) // User clicks on cancel option + ) { + setUserCancelled(true); + } + }; + SwingUtilities.invokeLater( showTask ); + - String surveyDefinitonName = "idml.xml"; - File definition = new File(tempFolder, surveyDefinitonName); + } - try( ZipFile transformedCollectData = CollectEarthUtils.addFileToZip(dst , definition , surveyDefinitonName) ){ - addStepToZip(tempFolder, transformedCollectData, "1"); - addStepToZip(tempFolder, transformedCollectData, "2"); - addStepToZip(tempFolder, transformedCollectData, "3"); - } - } finally { - FileUtils.deleteQuietly(tempFolder); + public void showLater() { + Runnable showLater = () -> { + getDialog().setVisible(true); + if (getPane().getValue() == null // User closes the dialog + || + getPane().getValue().equals(cancelOption) // User clicks on cancel option + ) { + setUserCancelled(true); } - } catch (Exception e) { - logger.error( "Error importing data", e); - } - return dst; + }; + SwingUtilities.invokeLater( showLater ); + } + private JOptionPane getPane() { + return pane; + } - private void addStepToZip(File tempFolder, ZipFile dstZipFile, String step) - throws ZipException { - File folderToZip = new File( tempFolder, "data"+ File.separator+step); - CollectEarthUtils.addFolderToZip(dstZipFile, folderToZip); + private void setPane(JOptionPane pane) { + this.pane = pane; } @Override - public void update(Observable o, Object arg) { - - SwingUtilities.invokeLater( () -> { - DataImportState importState = (DataImportState) o ; - progressMonitor.setMessage( Messages.getString("ImportDialogProcessMonitor.2") ); //$NON-NLS-1$ - progressMonitor.updateProgress( importState.getCount(), importState.getTotal()); - } ); - + public void progressMade(Progress progress) { + updateProgress((int) progress.getProcessedItems()); } } From 58ae752e8ee8e0e9f9c227a56f6e292113117e8a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:20 +0100 Subject: [PATCH 1250/1620] New translations JPlotCsvTable.java (French) --- .../earth/app/view/Messages_fr.properties | 324 ++++++++++-------- 1 file changed, 178 insertions(+), 146 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index ab7f149d0c..e15ddb90b9 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,201 +1,233 @@ package org.openforis.collect.earth.app.view; -import java.awt.Toolkit; +import java.awt.Color; +import java.awt.Component; +import java.awt.event.MouseEvent; import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.security.SecureRandom; +import java.util.ArrayList; import java.util.List; -import java.util.Observable; -import java.util.Observer; -import java.util.Random; -import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.SwingUtilities; - -import org.apache.commons.io.FileUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.DataImportExportService; -import org.openforis.collect.io.data.DataImportState; -import org.openforis.collect.io.data.DataImportSummaryItem; -import org.openforis.collect.io.data.XMLDataImportProcess; +import javax.swing.JTable; +import javax.swing.table.DefaultTableModel; +import javax.swing.table.TableCellRenderer; + +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult; +import org.openforis.collect.io.metadata.collectearth.CSVRowValidationResult; +import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; +import org.openforis.collect.manager.validation.SurveyValidator.ValidationParameters; +import org.openforis.collect.model.CollectSurvey; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import net.lingala.zip4j.ZipFile; -import net.lingala.zip4j.exception.ZipException; +import com.opencsv.CSVReader; + +/** + * Swing JTable used in the OptionWizard dialog. + * It contains methods to refresh the information loaded on the cells. + * @author Alfonso Sanchez-Paus Diaz + * + */ +public class JPlotCsvTable extends JTable{ + + private static final Color WARNING_BG_COLOR = new Color(254, 255, 196); + private static final Color ERROR_BG_COLOR = new Color(218, 152, 152); + private static final long serialVersionUID = 3456854921119125693L; + private static final int LIMIT_LOADED_CSV_LINES = 400; + private final transient Logger logger = LoggerFactory.getLogger(this.getClass()); + private transient CollectSurvey forSurvey; + private transient CSVFileValidationResult validationResults; + + + /** + * Build a new JTable that contains the data from the CSV that is set as the file that contains the plots used by Collect Earth + * @param pathToCsvWithPlots Path to the file containing the plot locations that should be loaded in the table + * @param forSurvey Survey that the csv file belongs to + */ + public JPlotCsvTable(String pathToCsvWithPlots, CollectSurvey forSurvey) { + super(); + this.forSurvey = forSurvey; -public class ImportXMLDialogProcessMonitor implements Observer{ - - private static final Logger logger = LoggerFactory.getLogger(ImportXMLDialogProcessMonitor.class); - private InfiniteProgressMonitor progressMonitor; - - - public void closeProgressmonitor() { + try { + refreshTable(pathToCsvWithPlots); + } catch (Exception e) { + logger.error("Error loading plot file"); + this.setBackground(Color.RED); + this.setToolTipText("The file chosen does not contain plot information"); - SwingUtilities.invokeLater( () -> { - if (progressMonitor != null) { - progressMonitor.close(); - } - } ); + } } - private boolean shouldAddConflictingRecords(List listConflictingRecords, String importedFileName) { - - if ( !listConflictingRecords.isEmpty() ) { - - Object[] options = {Messages.getString("ImportXMLDialogProcessMonitor.1"), Messages.getString("ImportXMLDialogProcessMonitor.2")}; - - final int selectedOption = JOptionPane.showOptionDialog(null, - - "" //$NON-NLS-1$ - + "" + importedFileName + " :
" //$NON-NLS-1$ //$NON-NLS-2$ - + Messages.getString("CollectEarthWindow.9") //$NON-NLS-1$ - + "
" //$NON-NLS-1$ - + Messages.getString("CollectEarthWindow.20") + listConflictingRecords.size() //$NON-NLS-1$ - + "
" //$NON-NLS-1$ - + Messages.getString("CollectEarthWindow.25") //$NON-NLS-1$ - + "
" //$NON-NLS-1$ - + "" //$NON-NLS-1$ - + Messages.getString("CollectEarthWindow.39") //$NON-NLS-1$ - + "" //$NON-NLS-1$ - + "", //$NON-NLS-1$ + /** + * The data of the CSV file is validated when the CSV/CED is loaded. This method determines if the data currently loaded is valid or not + * @return True if the data is valid. False otherwise + */ + public boolean isDataValid(){ + return validationResults==null?true:validationResults.isSuccessful(); + } - Messages.getString("CollectEarthWindow.43"), //$NON-NLS-1$ - JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE, - null, //do not use a custom Icon - options, //the titles of buttons - options[1] //default button title - ); + @Override + public Component prepareRenderer(TableCellRenderer renderer, int row, int col) { + Component comp = super.prepareRenderer(renderer, row, col); - return (selectedOption == JOptionPane.YES_OPTION); - } else { - return false; + if ( cellHasError(row,col)){ + comp.setBackground( ERROR_BG_COLOR ); + }else{ + comp.setBackground(Color.WHITE); } - } - public synchronized void startImport(final XMLDataImportProcess importProcess, final JFrame parentFrame, - final DataImportExportService dataImportService, final File importedFile ) throws Exception { + return comp; + } - try { + @Override + public String getToolTipText(MouseEvent event) { + String tip = null; + java.awt.Point p = event.getPoint(); + int row = rowAtPoint(p); + int col = columnAtPoint(p); - SwingUtilities.invokeLater( () -> { + try { + tip = getCellErrorMessage(row, col); + } catch (RuntimeException e1) { + //catch null pointer exception if mouse is over an empty line + } - progressMonitor = new InfiniteProgressMonitor(parentFrame, Messages.getString("ImportDialogProcessMonitor.8") + "(" //$NON-NLS-1$ //$NON-NLS-2$ - + importedFile.getName() + ")", Messages.getString("ImportDialogProcessMonitor.11") + Messages.getString("ImportDialogProcessMonitor.0")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - progressMonitor.showLater(); + return tip; - if (progressMonitor != null && progressMonitor.isUserCancelled()) { + } - Toolkit.getDefaultToolkit().beep(); - importProcess.cancel(); - logger.warn("Import Task canceled.\n"); //$NON-NLS-1$ + private boolean cellHasError(Integer row, Integer col) { + String errorMessage = getCellErrorMessage(row, col); + return errorMessage!=null; + } + private String getCellErrorMessage(Integer row, Integer col) { + if( validationResults != null ){ + List rowValidations = validationResults.getRowValidations(); + for (CSVRowValidationResult csvRowValidationResult : rowValidations) { + if( csvRowValidationResult.getRowNumber().equals(row+1) && csvRowValidationResult.getColumnPosition().equals( col ) ){ + return csvRowValidationResult.getMessage(); } } - ); - - File definitiveFileToImport = importedFile; - // If the file is exported from Collect rather than a XML export from Collect Earth - if( isCollectDataExport( definitiveFileToImport ) ){ - // Transform the file to a Collect Earth type of format - definitiveFileToImport = transformCollectDataFile( definitiveFileToImport ); - if( definitiveFileToImport == null ) return; // there was a problem with the file to import, execute finally - importProcess.setFile( definitiveFileToImport ); - } + } + return null; + } - importProcess.callAndObserve( this ); + /** + * Refreshes the data loaded in the table. Used when the user changes the file that contains the CSV file using the OptionWizard dialog. + * @param csvFilePath The path to the CSV file that contains the plot locations + */ + public void refreshTable(String csvFilePath) { - if (importProcess.getSummary() != null && !importProcess.getState().isCancelled()) { + if( csvFilePath.trim().length() == 0 ) + return; - final List conflictingRecords = importProcess.getSummary().getConflictingRecords(); + this.removeAll(); + boolean errorLoading = false; + final File csvFile = new File(csvFilePath); - if ( - conflictingRecords != null - && - !conflictingRecords.isEmpty() - && - !shouldAddConflictingRecords(conflictingRecords, definitiveFileToImport.getName()) - ) { - conflictingRecords.clear(); - } - final int totalRecords = ( conflictingRecords==null?0:conflictingRecords.size() ) + importProcess.getSummary().getRecordsToImport().size(); - SwingUtilities.invokeLater( () -> - progressMonitor.setMessage( Messages.getString("ImportDialogProcessMonitor.11") + totalRecords ) //$NON-NLS-1$ - ); + if (csvFile.exists()) { + DefaultTableModel newTableModel = getPlotTableModel( csvFilePath ); - dataImportService.importRecordsFrom(definitiveFileToImport, importProcess, conflictingRecords ); + validateCsvFile(csvFilePath); + if (newTableModel.getRowCount() == 0) { + errorLoading = true; + } else { + this.setModel(newTableModel); } - } finally { - closeProgressmonitor(); + } else { + errorLoading = true; } + if (errorLoading) { + this.setBackground(CollectEarthWindow.ERROR_COLOR); + this.setModel(new DefaultTableModel()); + } } + private String[] getColumnNames() { + // Check if the first line is actually a header. Possible if the first header column coincides with ID, PLOT_ID or PLOT + CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); + return cegtg.getExpectedHeaders( forSurvey ).toArray( new String[]{} ); - private boolean isCollectDataExport(File importedFile) { - return importedFile.getName().endsWith(".collect-data"); } - private File transformCollectDataFile(File zipWithXml) throws ZipException, IOException { - - Random random; - File dst = null; - try { - random = SecureRandom.getInstanceStrong(); + private DefaultTableModel getPlotTableModel(String csvFilePath) { - // Originally the collect-data file will look like this: - // root: idml.xml - // root : data (folder) - // root : data/1 (folder) - // the XML files will be under the data - File tempFolder = null; - try (ZipFile src = new ZipFile( zipWithXml )){ - tempFolder = Files.createTempDirectory("tempCE").toFile(); - src.extractAll( tempFolder.getAbsolutePath() ); + String[][] allValues = new String[0][0]; + try ( CSVReader reader = CsvReaderUtils.getCsvReader(csvFilePath) ){ + String[] line; + List allLines = new ArrayList<>(); + int i =0; + while( ( line = reader.readNext() ) != null && i< LIMIT_LOADED_CSV_LINES ) { // we do this to avoid out of memory errors + i++; + allLines.add( line ); + } - dst = new File( tempFolder.getParentFile(), "transform" + random.nextInt() + ".zip"); - dst.deleteOnExit(); + allValues = allLines.toArray(new String[][] {}); + } catch (Exception e) { + logger.error(" Error reading the CSV file " + csvFilePath, e); + } - String surveyDefinitonName = "idml.xml"; - File definition = new File(tempFolder, surveyDefinitonName); + return new DefaultTableModel( allValues , getColumnNames()); + } - try( ZipFile transformedCollectData = CollectEarthUtils.addFileToZip(dst , definition , surveyDefinitonName) ){ - addStepToZip(tempFolder, transformedCollectData, "1"); - addStepToZip(tempFolder, transformedCollectData, "2"); - addStepToZip(tempFolder, transformedCollectData, "3"); - } - } finally { - FileUtils.deleteQuietly(tempFolder); + protected void validateCsvFile(String csvFilePath) { + + CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); + ValidationParameters validationParameters = new ValidationParameters(); + validationParameters.setValidateOnlyFirstLines( false ); + CSVFileValidationResult validation = cegtg.validate( new File(csvFilePath), forSurvey, validationParameters); + + this.setBackground( Color.white ); + + + if( !validation.isSuccessful() ){ + switch ( validation.getErrorType() ) { + case INVALID_FILE_TYPE: + case INVALID_NUMBER_OF_COLUMNS: + JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); + JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The expected file type is CSV or CED ", "Expected File Type", JOptionPane.ERROR_MESSAGE); + break; + + case INVALID_HEADERS: + JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); + JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The expected columns in the CSV are " + validation.getExpectedHeaders(), "Columns in CSV do not match survey", JOptionPane.ERROR_MESSAGE); + validation = null; // not bad enough to stop the user from loading the CSV file + break; + case INVALID_NUMBER_OF_PLOTS_TOO_LARGE: + JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); + JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "Using CSV files that are too large makes Google Earth extremely slow.\nPlease divide this CSV file into smaller file (reccomended less than 2000 plots per CSV file.\nNumber of plots in this file : " + validation.getNumberOfRows() , "File too large", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + validation = null; // not bad enough to stop the user from loading the CSV file + break; + + case INVALID_NUMBER_OF_PLOTS_WARNING: + JPlotCsvTable.this.setBackground( WARNING_BG_COLOR); + JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "Using CSV files that are too large makes Google Earth slow.\n Please divide this CSV file into smaller file (reccomended size is less than 2000 plots per CSV file.\nNumber of plots in this file : " + validation.getNumberOfRows() , "File too large", JOptionPane.WARNING_MESSAGE); //$NON-NLS-1$ + validation = null; // not bad enough to stop the user from loading the CSV file + break; + + case INVALID_VALUES_IN_CSV: + // IN THIS CASE THE CELL RENDERER TAKES CARE OF HIGHLIGHTING THE CELLS!!! + JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The content of the CSV file is not correct!! The values on the cells highlighted are incorrect " , "CSV content is not correct", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + break; + + default: + break; } - } catch (Exception e) { - logger.error( "Error importing data", e); } - return dst; - } - private void addStepToZip(File tempFolder, ZipFile dstZipFile, String step) - throws ZipException { - File folderToZip = new File( tempFolder, "data"+ File.separator+step); - CollectEarthUtils.addFolderToZip(dstZipFile, folderToZip); + this.setValidationResults( validation ); } - @Override - public void update(Observable o, Object arg) { - - SwingUtilities.invokeLater( () -> { - DataImportState importState = (DataImportState) o ; - progressMonitor.setMessage( Messages.getString("ImportDialogProcessMonitor.2") ); //$NON-NLS-1$ - progressMonitor.updateProgress( importState.getCount(), importState.getTotal()); - } ); + private void setValidationResults(CSVFileValidationResult validationResults) { + this.validationResults = validationResults; } } From de5857acf5c7ffd3a7174b942550d976d035f52d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:21 +0100 Subject: [PATCH 1251/1620] New translations InfiniteProgressMonitor.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 268 ++++++++---------- 1 file changed, 120 insertions(+), 148 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index ab7f149d0c..ca537bed7a 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,201 +1,173 @@ package org.openforis.collect.earth.app.view; -import java.awt.Toolkit; -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.security.SecureRandom; -import java.util.List; -import java.util.Observable; -import java.util.Observer; -import java.util.Random; - -import javax.swing.JFrame; +import java.awt.Component; + +import javax.swing.JDialog; +import javax.swing.JLabel; import javax.swing.JOptionPane; +import javax.swing.JProgressBar; import javax.swing.SwingUtilities; -import org.apache.commons.io.FileUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.DataImportExportService; -import org.openforis.collect.io.data.DataImportState; -import org.openforis.collect.io.data.DataImportSummaryItem; -import org.openforis.collect.io.data.XMLDataImportProcess; +import org.apache.commons.lang3.StringUtils; +import org.openforis.concurrency.Progress; +import org.openforis.concurrency.ProgressListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import net.lingala.zip4j.ZipFile; -import net.lingala.zip4j.exception.ZipException; - -public class ImportXMLDialogProcessMonitor implements Observer{ +public class InfiniteProgressMonitor implements ProgressListener { - private static final Logger logger = LoggerFactory.getLogger(ImportXMLDialogProcessMonitor.class); - private InfiniteProgressMonitor progressMonitor; + JDialog infiniteWaitingDialog; + private boolean userCancelled = false; - public void closeProgressmonitor() { - - SwingUtilities.invokeLater( () -> { - if (progressMonitor != null) { - progressMonitor.close(); - } - } ); - } + private JDialog dialog; - private boolean shouldAddConflictingRecords(List listConflictingRecords, String importedFileName) { + private JOptionPane pane; - if ( !listConflictingRecords.isEmpty() ) { + private String cancelOption; - Object[] options = {Messages.getString("ImportXMLDialogProcessMonitor.1"), Messages.getString("ImportXMLDialogProcessMonitor.2")}; + private JLabel label; - final int selectedOption = JOptionPane.showOptionDialog(null, + JProgressBar infiniteProgress; + + private Logger logger = LoggerFactory.getLogger( InfiniteProgressMonitor.class ); + + public InfiniteProgressMonitor(Component parentFrame, String title, String message) { - "" //$NON-NLS-1$ - + "" + importedFileName + " :
" //$NON-NLS-1$ //$NON-NLS-2$ - + Messages.getString("CollectEarthWindow.9") //$NON-NLS-1$ - + "
" //$NON-NLS-1$ - + Messages.getString("CollectEarthWindow.20") + listConflictingRecords.size() //$NON-NLS-1$ - + "
" //$NON-NLS-1$ - + Messages.getString("CollectEarthWindow.25") //$NON-NLS-1$ - + "
" //$NON-NLS-1$ - + "" //$NON-NLS-1$ - + Messages.getString("CollectEarthWindow.39") //$NON-NLS-1$ - + "" //$NON-NLS-1$ - + "", //$NON-NLS-1$ + infiniteProgress = new JProgressBar(); + infiniteProgress.setIndeterminate(true); + label = new JLabel(message); - Messages.getString("CollectEarthWindow.43"), //$NON-NLS-1$ + final Object[] dialogItems = { label, infiniteProgress }; - JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE, - null, //do not use a custom Icon - options, //the titles of buttons - options[1] //default button title - ); + cancelOption = Messages.getString("InfiniteProgressMonitor.0"); //$NON-NLS-1$ + final Object[] options = { cancelOption }; + setPane(new JOptionPane(dialogItems, JOptionPane.PLAIN_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, + options)); + setDialog(getPane().createDialog(parentFrame, title)); + getDialog().setModal(true); - return (selectedOption == JOptionPane.YES_OPTION); - } else { - return false; - } } - public synchronized void startImport(final XMLDataImportProcess importProcess, final JFrame parentFrame, - final DataImportExportService dataImportService, final File importedFile ) throws Exception { + public void updateProgress(int current, int total) { - try { + updateProgress(current, total, null); - SwingUtilities.invokeLater( () -> { + } + + public void updateProgress(int current, int total, String msg) { + + Runnable updateTask = () -> { + infiniteProgress.setString(current + "/" + total); + if (infiniteProgress.isIndeterminate()) { + infiniteProgress.setIndeterminate(false); + infiniteProgress.setStringPainted(true); + } - progressMonitor = new InfiniteProgressMonitor(parentFrame, Messages.getString("ImportDialogProcessMonitor.8") + "(" //$NON-NLS-1$ //$NON-NLS-2$ - + importedFile.getName() + ")", Messages.getString("ImportDialogProcessMonitor.11") + Messages.getString("ImportDialogProcessMonitor.0")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - progressMonitor.showLater(); + infiniteProgress.setMaximum(total); - if (progressMonitor != null && progressMonitor.isUserCancelled()) { + infiniteProgress.setValue(current); + if( StringUtils.isNotBlank( msg )) + setMessage( msg ); + }; + + SwingUtilities.invokeLater( updateTask ); - Toolkit.getDefaultToolkit().beep(); - importProcess.cancel(); - logger.warn("Import Task canceled.\n"); //$NON-NLS-1$ + } - } - } - ); - - File definitiveFileToImport = importedFile; - // If the file is exported from Collect rather than a XML export from Collect Earth - if( isCollectDataExport( definitiveFileToImport ) ){ - // Transform the file to a Collect Earth type of format - definitiveFileToImport = transformCollectDataFile( definitiveFileToImport ); - if( definitiveFileToImport == null ) return; // there was a problem with the file to import, execute finally - importProcess.setFile( definitiveFileToImport ); + public void updateProgress(int currentPercentage) { + Runnable updateTask = () -> { + infiniteProgress.setString(currentPercentage + "%"); + if (infiniteProgress.isIndeterminate()) { + infiniteProgress.setIndeterminate(false); + infiniteProgress.setStringPainted(true); } - importProcess.callAndObserve( this ); + infiniteProgress.setMaximum(100); - if (importProcess.getSummary() != null && !importProcess.getState().isCancelled()) { + infiniteProgress.setValue(currentPercentage); + }; + + SwingUtilities.invokeLater( updateTask ); - final List conflictingRecords = importProcess.getSummary().getConflictingRecords(); - - if ( - conflictingRecords != null - && - !conflictingRecords.isEmpty() - && - !shouldAddConflictingRecords(conflictingRecords, definitiveFileToImport.getName()) - ) { - conflictingRecords.clear(); - } - final int totalRecords = ( conflictingRecords==null?0:conflictingRecords.size() ) + importProcess.getSummary().getRecordsToImport().size(); - SwingUtilities.invokeLater( () -> - progressMonitor.setMessage( Messages.getString("ImportDialogProcessMonitor.11") + totalRecords ) //$NON-NLS-1$ - ); - - dataImportService.importRecordsFrom(definitiveFileToImport, importProcess, conflictingRecords ); - - } - } finally { - closeProgressmonitor(); - } + } + public void setMessage(String msg) { + label.setText(msg); } + public void close() { + SwingUtilities.invokeLater(() -> { + hide(); + getDialog().dispose(); + }); + } - private boolean isCollectDataExport(File importedFile) { - return importedFile.getName().endsWith(".collect-data"); + private JDialog getDialog() { + return dialog; } - private File transformCollectDataFile(File zipWithXml) throws ZipException, IOException { + public void hide() { + getDialog().setVisible(false); + } - Random random; - File dst = null; - try { - random = SecureRandom.getInstanceStrong(); + public boolean isShowing() { + return getDialog().isShowing(); + } - // Originally the collect-data file will look like this: - // root: idml.xml - // root : data (folder) - // root : data/1 (folder) - // the XML files will be under the data - File tempFolder = null; - try (ZipFile src = new ZipFile( zipWithXml )){ - tempFolder = Files.createTempDirectory("tempCE").toFile(); - src.extractAll( tempFolder.getAbsolutePath() ); + public boolean isUserCancelled() { + return userCancelled; + } + private void setDialog(JDialog dialog) { + this.dialog = dialog; + } - dst = new File( tempFolder.getParentFile(), "transform" + random.nextInt() + ".zip"); - dst.deleteOnExit(); + public void setUserCancelled(boolean userCancelled) { + this.userCancelled = userCancelled; + } + + public void show() { + + Runnable showTask = () -> { + getDialog().setVisible(true); + if (getPane().getValue() == null // User closes the dialog + || + getPane().getValue().equals(cancelOption) // User clicks on cancel option + ) { + setUserCancelled(true); + } + }; + SwingUtilities.invokeLater( showTask ); + - String surveyDefinitonName = "idml.xml"; - File definition = new File(tempFolder, surveyDefinitonName); + } - try( ZipFile transformedCollectData = CollectEarthUtils.addFileToZip(dst , definition , surveyDefinitonName) ){ - addStepToZip(tempFolder, transformedCollectData, "1"); - addStepToZip(tempFolder, transformedCollectData, "2"); - addStepToZip(tempFolder, transformedCollectData, "3"); - } - } finally { - FileUtils.deleteQuietly(tempFolder); + public void showLater() { + Runnable showLater = () -> { + getDialog().setVisible(true); + if (getPane().getValue() == null // User closes the dialog + || + getPane().getValue().equals(cancelOption) // User clicks on cancel option + ) { + setUserCancelled(true); } - } catch (Exception e) { - logger.error( "Error importing data", e); - } - return dst; + }; + SwingUtilities.invokeLater( showLater ); + } + private JOptionPane getPane() { + return pane; + } - private void addStepToZip(File tempFolder, ZipFile dstZipFile, String step) - throws ZipException { - File folderToZip = new File( tempFolder, "data"+ File.separator+step); - CollectEarthUtils.addFolderToZip(dstZipFile, folderToZip); + private void setPane(JOptionPane pane) { + this.pane = pane; } @Override - public void update(Observable o, Object arg) { - - SwingUtilities.invokeLater( () -> { - DataImportState importState = (DataImportState) o ; - progressMonitor.setMessage( Messages.getString("ImportDialogProcessMonitor.2") ); //$NON-NLS-1$ - progressMonitor.updateProgress( importState.getCount(), importState.getTotal()); - } ); - + public void progressMade(Progress progress) { + updateProgress((int) progress.getProcessedItems()); } } From 47b1dd8a1fe9f83a94bde1ca5df5691235ac54da Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:22 +0100 Subject: [PATCH 1252/1620] New translations InfiniteProgressMonitor.java (English) --- .../earth/app/view/Messages_en.properties | 268 ++++++++---------- 1 file changed, 120 insertions(+), 148 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index ab7f149d0c..ca537bed7a 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,201 +1,173 @@ package org.openforis.collect.earth.app.view; -import java.awt.Toolkit; -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.security.SecureRandom; -import java.util.List; -import java.util.Observable; -import java.util.Observer; -import java.util.Random; - -import javax.swing.JFrame; +import java.awt.Component; + +import javax.swing.JDialog; +import javax.swing.JLabel; import javax.swing.JOptionPane; +import javax.swing.JProgressBar; import javax.swing.SwingUtilities; -import org.apache.commons.io.FileUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.DataImportExportService; -import org.openforis.collect.io.data.DataImportState; -import org.openforis.collect.io.data.DataImportSummaryItem; -import org.openforis.collect.io.data.XMLDataImportProcess; +import org.apache.commons.lang3.StringUtils; +import org.openforis.concurrency.Progress; +import org.openforis.concurrency.ProgressListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import net.lingala.zip4j.ZipFile; -import net.lingala.zip4j.exception.ZipException; - -public class ImportXMLDialogProcessMonitor implements Observer{ +public class InfiniteProgressMonitor implements ProgressListener { - private static final Logger logger = LoggerFactory.getLogger(ImportXMLDialogProcessMonitor.class); - private InfiniteProgressMonitor progressMonitor; + JDialog infiniteWaitingDialog; + private boolean userCancelled = false; - public void closeProgressmonitor() { - - SwingUtilities.invokeLater( () -> { - if (progressMonitor != null) { - progressMonitor.close(); - } - } ); - } + private JDialog dialog; - private boolean shouldAddConflictingRecords(List listConflictingRecords, String importedFileName) { + private JOptionPane pane; - if ( !listConflictingRecords.isEmpty() ) { + private String cancelOption; - Object[] options = {Messages.getString("ImportXMLDialogProcessMonitor.1"), Messages.getString("ImportXMLDialogProcessMonitor.2")}; + private JLabel label; - final int selectedOption = JOptionPane.showOptionDialog(null, + JProgressBar infiniteProgress; + + private Logger logger = LoggerFactory.getLogger( InfiniteProgressMonitor.class ); + + public InfiniteProgressMonitor(Component parentFrame, String title, String message) { - "" //$NON-NLS-1$ - + "" + importedFileName + " :
" //$NON-NLS-1$ //$NON-NLS-2$ - + Messages.getString("CollectEarthWindow.9") //$NON-NLS-1$ - + "
" //$NON-NLS-1$ - + Messages.getString("CollectEarthWindow.20") + listConflictingRecords.size() //$NON-NLS-1$ - + "
" //$NON-NLS-1$ - + Messages.getString("CollectEarthWindow.25") //$NON-NLS-1$ - + "
" //$NON-NLS-1$ - + "" //$NON-NLS-1$ - + Messages.getString("CollectEarthWindow.39") //$NON-NLS-1$ - + "" //$NON-NLS-1$ - + "", //$NON-NLS-1$ + infiniteProgress = new JProgressBar(); + infiniteProgress.setIndeterminate(true); + label = new JLabel(message); - Messages.getString("CollectEarthWindow.43"), //$NON-NLS-1$ + final Object[] dialogItems = { label, infiniteProgress }; - JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE, - null, //do not use a custom Icon - options, //the titles of buttons - options[1] //default button title - ); + cancelOption = Messages.getString("InfiniteProgressMonitor.0"); //$NON-NLS-1$ + final Object[] options = { cancelOption }; + setPane(new JOptionPane(dialogItems, JOptionPane.PLAIN_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, + options)); + setDialog(getPane().createDialog(parentFrame, title)); + getDialog().setModal(true); - return (selectedOption == JOptionPane.YES_OPTION); - } else { - return false; - } } - public synchronized void startImport(final XMLDataImportProcess importProcess, final JFrame parentFrame, - final DataImportExportService dataImportService, final File importedFile ) throws Exception { + public void updateProgress(int current, int total) { - try { + updateProgress(current, total, null); - SwingUtilities.invokeLater( () -> { + } + + public void updateProgress(int current, int total, String msg) { + + Runnable updateTask = () -> { + infiniteProgress.setString(current + "/" + total); + if (infiniteProgress.isIndeterminate()) { + infiniteProgress.setIndeterminate(false); + infiniteProgress.setStringPainted(true); + } - progressMonitor = new InfiniteProgressMonitor(parentFrame, Messages.getString("ImportDialogProcessMonitor.8") + "(" //$NON-NLS-1$ //$NON-NLS-2$ - + importedFile.getName() + ")", Messages.getString("ImportDialogProcessMonitor.11") + Messages.getString("ImportDialogProcessMonitor.0")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - progressMonitor.showLater(); + infiniteProgress.setMaximum(total); - if (progressMonitor != null && progressMonitor.isUserCancelled()) { + infiniteProgress.setValue(current); + if( StringUtils.isNotBlank( msg )) + setMessage( msg ); + }; + + SwingUtilities.invokeLater( updateTask ); - Toolkit.getDefaultToolkit().beep(); - importProcess.cancel(); - logger.warn("Import Task canceled.\n"); //$NON-NLS-1$ + } - } - } - ); - - File definitiveFileToImport = importedFile; - // If the file is exported from Collect rather than a XML export from Collect Earth - if( isCollectDataExport( definitiveFileToImport ) ){ - // Transform the file to a Collect Earth type of format - definitiveFileToImport = transformCollectDataFile( definitiveFileToImport ); - if( definitiveFileToImport == null ) return; // there was a problem with the file to import, execute finally - importProcess.setFile( definitiveFileToImport ); + public void updateProgress(int currentPercentage) { + Runnable updateTask = () -> { + infiniteProgress.setString(currentPercentage + "%"); + if (infiniteProgress.isIndeterminate()) { + infiniteProgress.setIndeterminate(false); + infiniteProgress.setStringPainted(true); } - importProcess.callAndObserve( this ); + infiniteProgress.setMaximum(100); - if (importProcess.getSummary() != null && !importProcess.getState().isCancelled()) { + infiniteProgress.setValue(currentPercentage); + }; + + SwingUtilities.invokeLater( updateTask ); - final List conflictingRecords = importProcess.getSummary().getConflictingRecords(); - - if ( - conflictingRecords != null - && - !conflictingRecords.isEmpty() - && - !shouldAddConflictingRecords(conflictingRecords, definitiveFileToImport.getName()) - ) { - conflictingRecords.clear(); - } - final int totalRecords = ( conflictingRecords==null?0:conflictingRecords.size() ) + importProcess.getSummary().getRecordsToImport().size(); - SwingUtilities.invokeLater( () -> - progressMonitor.setMessage( Messages.getString("ImportDialogProcessMonitor.11") + totalRecords ) //$NON-NLS-1$ - ); - - dataImportService.importRecordsFrom(definitiveFileToImport, importProcess, conflictingRecords ); - - } - } finally { - closeProgressmonitor(); - } + } + public void setMessage(String msg) { + label.setText(msg); } + public void close() { + SwingUtilities.invokeLater(() -> { + hide(); + getDialog().dispose(); + }); + } - private boolean isCollectDataExport(File importedFile) { - return importedFile.getName().endsWith(".collect-data"); + private JDialog getDialog() { + return dialog; } - private File transformCollectDataFile(File zipWithXml) throws ZipException, IOException { + public void hide() { + getDialog().setVisible(false); + } - Random random; - File dst = null; - try { - random = SecureRandom.getInstanceStrong(); + public boolean isShowing() { + return getDialog().isShowing(); + } - // Originally the collect-data file will look like this: - // root: idml.xml - // root : data (folder) - // root : data/1 (folder) - // the XML files will be under the data - File tempFolder = null; - try (ZipFile src = new ZipFile( zipWithXml )){ - tempFolder = Files.createTempDirectory("tempCE").toFile(); - src.extractAll( tempFolder.getAbsolutePath() ); + public boolean isUserCancelled() { + return userCancelled; + } + private void setDialog(JDialog dialog) { + this.dialog = dialog; + } - dst = new File( tempFolder.getParentFile(), "transform" + random.nextInt() + ".zip"); - dst.deleteOnExit(); + public void setUserCancelled(boolean userCancelled) { + this.userCancelled = userCancelled; + } + + public void show() { + + Runnable showTask = () -> { + getDialog().setVisible(true); + if (getPane().getValue() == null // User closes the dialog + || + getPane().getValue().equals(cancelOption) // User clicks on cancel option + ) { + setUserCancelled(true); + } + }; + SwingUtilities.invokeLater( showTask ); + - String surveyDefinitonName = "idml.xml"; - File definition = new File(tempFolder, surveyDefinitonName); + } - try( ZipFile transformedCollectData = CollectEarthUtils.addFileToZip(dst , definition , surveyDefinitonName) ){ - addStepToZip(tempFolder, transformedCollectData, "1"); - addStepToZip(tempFolder, transformedCollectData, "2"); - addStepToZip(tempFolder, transformedCollectData, "3"); - } - } finally { - FileUtils.deleteQuietly(tempFolder); + public void showLater() { + Runnable showLater = () -> { + getDialog().setVisible(true); + if (getPane().getValue() == null // User closes the dialog + || + getPane().getValue().equals(cancelOption) // User clicks on cancel option + ) { + setUserCancelled(true); } - } catch (Exception e) { - logger.error( "Error importing data", e); - } - return dst; + }; + SwingUtilities.invokeLater( showLater ); + } + private JOptionPane getPane() { + return pane; + } - private void addStepToZip(File tempFolder, ZipFile dstZipFile, String step) - throws ZipException { - File folderToZip = new File( tempFolder, "data"+ File.separator+step); - CollectEarthUtils.addFolderToZip(dstZipFile, folderToZip); + private void setPane(JOptionPane pane) { + this.pane = pane; } @Override - public void update(Observable o, Object arg) { - - SwingUtilities.invokeLater( () -> { - DataImportState importState = (DataImportState) o ; - progressMonitor.setMessage( Messages.getString("ImportDialogProcessMonitor.2") ); //$NON-NLS-1$ - progressMonitor.updateProgress( importState.getCount(), importState.getTotal()); - } ); - + public void progressMade(Progress progress) { + updateProgress((int) progress.getProcessedItems()); } } From 1d4e2b587848df53c862e7a3c2949ddc3177f3e1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:23 +0100 Subject: [PATCH 1253/1620] New translations JFileChooserExistsAware.java (French) --- .../earth/app/view/Messages_fr.properties | 308 +++++++----------- 1 file changed, 115 insertions(+), 193 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index e15ddb90b9..21d900b58d 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,233 +1,155 @@ package org.openforis.collect.earth.app.view; -import java.awt.Color; -import java.awt.Component; -import java.awt.event.MouseEvent; import java.io.File; -import java.util.ArrayList; -import java.util.List; +import java.util.Arrays; +import javax.swing.JFileChooser; +import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.JTable; -import javax.swing.table.DefaultTableModel; -import javax.swing.table.TableCellRenderer; - -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.collect.io.metadata.collectearth.CSVFileValidationResult; -import org.openforis.collect.io.metadata.collectearth.CSVRowValidationResult; -import org.openforis.collect.io.metadata.collectearth.CollectEarthGridTemplateGenerator; -import org.openforis.collect.manager.validation.SurveyValidator.ValidationParameters; -import org.openforis.collect.model.CollectSurvey; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.opencsv.CSVReader; - -/** - * Swing JTable used in the OptionWizard dialog. - * It contains methods to refresh the information loaded on the cells. - * @author Alfonso Sanchez-Paus Diaz - * - */ -public class JPlotCsvTable extends JTable{ - - private static final Color WARNING_BG_COLOR = new Color(254, 255, 196); - private static final Color ERROR_BG_COLOR = new Color(218, 152, 152); - private static final long serialVersionUID = 3456854921119125693L; - private static final int LIMIT_LOADED_CSV_LINES = 400; - private final transient Logger logger = LoggerFactory.getLogger(this.getClass()); - private transient CollectSurvey forSurvey; - private transient CSVFileValidationResult validationResults; - - - /** - * Build a new JTable that contains the data from the CSV that is set as the file that contains the plots used by Collect Earth - * @param pathToCsvWithPlots Path to the file containing the plot locations that should be loaded in the table - * @param forSurvey Survey that the csv file belongs to - */ - public JPlotCsvTable(String pathToCsvWithPlots, CollectSurvey forSurvey) { - super(); - this.forSurvey = forSurvey; - - try { - refreshTable(pathToCsvWithPlots); - } catch (Exception e) { - logger.error("Error loading plot file"); - this.setBackground(Color.RED); - this.setToolTipText("The file chosen does not contain plot information"); - - } - } - - /** - * The data of the CSV file is validated when the CSV/CED is loaded. This method determines if the data currently loaded is valid or not - * @return True if the data is valid. False otherwise - */ - public boolean isDataValid(){ - return validationResults==null?true:validationResults.isSuccessful(); - } - - - @Override - public Component prepareRenderer(TableCellRenderer renderer, int row, int col) { - Component comp = super.prepareRenderer(renderer, row, col); +import javax.swing.filechooser.FileFilter; - if ( cellHasError(row,col)){ - comp.setBackground( ERROR_BG_COLOR ); - }else{ - comp.setBackground(Color.WHITE); - } - - return comp; - } - - @Override - public String getToolTipText(MouseEvent event) { - String tip = null; - java.awt.Point p = event.getPoint(); - int row = rowAtPoint(p); - int col = columnAtPoint(p); +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; - try { - tip = getCellErrorMessage(row, col); - } catch (RuntimeException e1) { - //catch null pointer exception if mouse is over an empty line - } +public class JFileChooserExistsAware extends JFileChooser { - return tip; + private static final long serialVersionUID = 2571562963995019882L; + private JFileChooserExistsAware(File lastFolder) { + super(lastFolder); } - private boolean cellHasError(Integer row, Integer col) { - String errorMessage = getCellErrorMessage(row, col); - return errorMessage!=null; + private JFileChooserExistsAware(){ + super(); } - private String getCellErrorMessage(Integer row, Integer col) { - if( validationResults != null ){ - List rowValidations = validationResults.getRowValidations(); - for (CSVRowValidationResult csvRowValidationResult : rowValidations) { - if( csvRowValidationResult.getRowNumber().equals(row+1) && csvRowValidationResult.getColumnPosition().equals( col ) ){ - return csvRowValidationResult.getMessage(); - } + @Override + public void approveSelection(){ + File f = getSelectedFile(); + if( f!=null && f.exists() && getDialogType() == SAVE_DIALOG){ + int result = JOptionPane.showConfirmDialog(this,"The file exists, overwrite?","Existing file",JOptionPane.YES_NO_CANCEL_OPTION); //$NON-NLS-1$ //$NON-NLS-2$ + switch(result){ + case JOptionPane.YES_OPTION: + super.approveSelection(); + return; + case JOptionPane.NO_OPTION: + return; + case JOptionPane.CLOSED_OPTION: + return; + case JOptionPane.CANCEL_OPTION: + cancelSelection(); + return; } } - return null; + super.approveSelection(); } - /** - * Refreshes the data loaded in the table. Used when the user changes the file that contains the CSV file using the OptionWizard dialog. - * @param csvFilePath The path to the CSV file that contains the plot locations - */ - public void refreshTable(String csvFilePath) { - - if( csvFilePath.trim().length() == 0 ) - return; - - this.removeAll(); - boolean errorLoading = false; - final File csvFile = new File(csvFilePath); + public static File[] getFileChooserResults(final DataFormat dataFormat, boolean isSaveDlg, boolean multipleSelect, String preselectedName, LocalPropertiesService localPropertiesService, JFrame frame) { + return getFileChooserResults(dataFormat, isSaveDlg, multipleSelect, preselectedName, localPropertiesService, frame, null); + } - if (csvFile.exists()) { - DefaultTableModel newTableModel = getPlotTableModel( csvFilePath ); + public static File[] getFileChooserResults(final DataFormat dataFormat, boolean isSaveDlg, boolean multipleSelect, String preselectedName, LocalPropertiesService localPropertiesService, JFrame frame, File preSelectedFolder) { - validateCsvFile(csvFilePath); + JFileChooser fc ; - if (newTableModel.getRowCount() == 0) { - errorLoading = true; - } else { - this.setModel(newTableModel); + if( preSelectedFolder == null ){ + String lastUsedFolder = localPropertiesService.getValue( EarthProperty.LAST_USED_FOLDER ); + if( !StringUtils.isBlank( lastUsedFolder ) ){ + preSelectedFolder = new File( lastUsedFolder ); + if( !preSelectedFolder.exists()){ + preSelectedFolder = null; + } } - } else { - errorLoading = true; - } - - if (errorLoading) { - this.setBackground(CollectEarthWindow.ERROR_COLOR); - this.setModel(new DefaultTableModel()); } - } - private String[] getColumnNames() { - // Check if the first line is actually a header. Possible if the first header column coincides with ID, PLOT_ID or PLOT - CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); - return cegtg.getExpectedHeaders( forSurvey ).toArray( new String[]{} ); + fc = new JFileChooserExistsAware( preSelectedFolder ); - } + if( preselectedName != null ){ + File selectedFile = new File( fc.getCurrentDirectory().getAbsolutePath() + File.separatorChar + preselectedName ); + fc.setSelectedFile( selectedFile ); + } - private DefaultTableModel getPlotTableModel(String csvFilePath) { + fc.setMultiSelectionEnabled( multipleSelect ); - String[][] allValues = new String[0][0]; + File[] selectedFiles = null; + FileFilter addedFilter = getFileFilter(dataFormat); + fc.addChoosableFileFilter(addedFilter); - try ( CSVReader reader = CsvReaderUtils.getCsvReader(csvFilePath) ){ - String[] line; - List allLines = new ArrayList<>(); - int i =0; - while( ( line = reader.readNext() ) != null && i< LIMIT_LOADED_CSV_LINES ) { // we do this to avoid out of memory errors - i++; - allLines.add( line ); - } + fc.setAcceptAllFileFilterUsed(true); + // Set the added file filter as the default chose filter + fc.setFileFilter(addedFilter); - allValues = allLines.toArray(new String[][] {}); - } catch (Exception e) { - logger.error(" Error reading the CSV file " + csvFilePath, e); + // Handle open button action. + int returnVal ; + if( isSaveDlg ){ + returnVal = fc.showSaveDialog( frame ); + }else{ + returnVal = fc.showOpenDialog( frame); } - return new DefaultTableModel( allValues , getColumnNames()); - } + if ( returnVal == JFileChooser.APPROVE_OPTION) { - protected void validateCsvFile(String csvFilePath) { - - CollectEarthGridTemplateGenerator cegtg = new CollectEarthGridTemplateGenerator(); - ValidationParameters validationParameters = new ValidationParameters(); - validationParameters.setValidateOnlyFirstLines( false ); - CSVFileValidationResult validation = cegtg.validate( new File(csvFilePath), forSurvey, validationParameters); - - this.setBackground( Color.white ); - - - if( !validation.isSuccessful() ){ - switch ( validation.getErrorType() ) { - case INVALID_FILE_TYPE: - case INVALID_NUMBER_OF_COLUMNS: - JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); - JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The expected file type is CSV or CED ", "Expected File Type", JOptionPane.ERROR_MESSAGE); - break; - - case INVALID_HEADERS: - JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); - JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The expected columns in the CSV are " + validation.getExpectedHeaders(), "Columns in CSV do not match survey", JOptionPane.ERROR_MESSAGE); - validation = null; // not bad enough to stop the user from loading the CSV file - break; - case INVALID_NUMBER_OF_PLOTS_TOO_LARGE: - JPlotCsvTable.this.setBackground( ERROR_BG_COLOR); - JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "Using CSV files that are too large makes Google Earth extremely slow.\nPlease divide this CSV file into smaller file (reccomended less than 2000 plots per CSV file.\nNumber of plots in this file : " + validation.getNumberOfRows() , "File too large", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - validation = null; // not bad enough to stop the user from loading the CSV file - break; - - case INVALID_NUMBER_OF_PLOTS_WARNING: - JPlotCsvTable.this.setBackground( WARNING_BG_COLOR); - JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "Using CSV files that are too large makes Google Earth slow.\n Please divide this CSV file into smaller file (reccomended size is less than 2000 plots per CSV file.\nNumber of plots in this file : " + validation.getNumberOfRows() , "File too large", JOptionPane.WARNING_MESSAGE); //$NON-NLS-1$ - validation = null; // not bad enough to stop the user from loading the CSV file - break; - - case INVALID_VALUES_IN_CSV: - // IN THIS CASE THE CELL RENDERER TAKES CARE OF HIGHLIGHTING THE CELLS!!! - JOptionPane.showMessageDialog( JPlotCsvTable.this.getParent(), "The content of the CSV file is not correct!! The values on the cells highlighted are incorrect " , "CSV content is not correct", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - break; - - default: - break; + if( multipleSelect ){ + selectedFiles = fc.getSelectedFiles(); + }else{ + selectedFiles = new File[]{fc.getSelectedFile()}; + } + + if( selectedFiles != null && selectedFiles.length > 0 ) { + if( isSaveDlg ){ + String fileName = selectedFiles[0].getAbsolutePath(); + + String fileExtension = null; + + if( fileName.lastIndexOf('.') != -1){ + fileExtension = fileName.substring( fileName.lastIndexOf('.') + 1 ).toLowerCase(); + } + + // If the chose file has no extension or the extension is not one of the default extensions for the dataformat + if ( fileExtension == null || Arrays.binarySearch( dataFormat.getPossibleFileExtensions(), fileExtension ) < 0 ) { //$NON-NLS-1$ + fileName += "." + dataFormat.getDefaultExtension(); //$NON-NLS-1$ + selectedFiles[0] = new File(fileName); + } + } + + localPropertiesService.setValue(EarthProperty.LAST_USED_FOLDER, selectedFiles[0].getParent()); } - } - this.setValidationResults( validation ); + } + return selectedFiles; } + private static FileFilter getFileFilter(final DataFormat dataFormat) { + return new FileFilter() { + + @Override + public boolean accept(File f) { + + String[] extensions = dataFormat.getPossibleFileExtensions(); + boolean acceptedFile = false; + boolean isFolder = f.isDirectory(); + if( isFolder ){ + acceptedFile = true; + }else{ + + for (String fileExtension : extensions) { + if( f.getName().toLowerCase().endsWith("." + fileExtension ) ){ //$NON-NLS-1$ + acceptedFile = true; + break; + } + } + } + + return acceptedFile; + } - private void setValidationResults(CSVFileValidationResult validationResults) { - this.validationResults = validationResults; + @Override + public String getDescription() { + return dataFormat.getDescription(); + } + }; } } From 1de76517f41327a7ad6687361b13a51dd3c16cf8 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:25 +0100 Subject: [PATCH 1254/1620] New translations JFileChooserExistsAware.java (Spanish) --- .../earth/app/view/Messages_es.properties | 248 ++++++++---------- 1 file changed, 115 insertions(+), 133 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index ca537bed7a..21d900b58d 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,173 +1,155 @@ package org.openforis.collect.earth.app.view; -import java.awt.Component; +import java.io.File; +import java.util.Arrays; -import javax.swing.JDialog; -import javax.swing.JLabel; +import javax.swing.JFileChooser; +import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.JProgressBar; -import javax.swing.SwingUtilities; +import javax.swing.filechooser.FileFilter; import org.apache.commons.lang3.StringUtils; -import org.openforis.concurrency.Progress; -import org.openforis.concurrency.ProgressListener; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -public class InfiniteProgressMonitor implements ProgressListener { +public class JFileChooserExistsAware extends JFileChooser { - JDialog infiniteWaitingDialog; + private static final long serialVersionUID = 2571562963995019882L; - private boolean userCancelled = false; - - private JDialog dialog; - - private JOptionPane pane; - - private String cancelOption; - - private JLabel label; - - JProgressBar infiniteProgress; - - private Logger logger = LoggerFactory.getLogger( InfiniteProgressMonitor.class ); - - public InfiniteProgressMonitor(Component parentFrame, String title, String message) { - - infiniteProgress = new JProgressBar(); - infiniteProgress.setIndeterminate(true); - label = new JLabel(message); - - final Object[] dialogItems = { label, infiniteProgress }; + private JFileChooserExistsAware(File lastFolder) { + super(lastFolder); + } - cancelOption = Messages.getString("InfiniteProgressMonitor.0"); //$NON-NLS-1$ - final Object[] options = { cancelOption }; - setPane(new JOptionPane(dialogItems, JOptionPane.PLAIN_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, - options)); - setDialog(getPane().createDialog(parentFrame, title)); - getDialog().setModal(true); + private JFileChooserExistsAware(){ + super(); + } + @Override + public void approveSelection(){ + File f = getSelectedFile(); + if( f!=null && f.exists() && getDialogType() == SAVE_DIALOG){ + int result = JOptionPane.showConfirmDialog(this,"The file exists, overwrite?","Existing file",JOptionPane.YES_NO_CANCEL_OPTION); //$NON-NLS-1$ //$NON-NLS-2$ + switch(result){ + case JOptionPane.YES_OPTION: + super.approveSelection(); + return; + case JOptionPane.NO_OPTION: + return; + case JOptionPane.CLOSED_OPTION: + return; + case JOptionPane.CANCEL_OPTION: + cancelSelection(); + return; + } + } + super.approveSelection(); } - public void updateProgress(int current, int total) { + public static File[] getFileChooserResults(final DataFormat dataFormat, boolean isSaveDlg, boolean multipleSelect, String preselectedName, LocalPropertiesService localPropertiesService, JFrame frame) { + return getFileChooserResults(dataFormat, isSaveDlg, multipleSelect, preselectedName, localPropertiesService, frame, null); + } - updateProgress(current, total, null); + public static File[] getFileChooserResults(final DataFormat dataFormat, boolean isSaveDlg, boolean multipleSelect, String preselectedName, LocalPropertiesService localPropertiesService, JFrame frame, File preSelectedFolder) { - } - - public void updateProgress(int current, int total, String msg) { + JFileChooser fc ; - Runnable updateTask = () -> { - infiniteProgress.setString(current + "/" + total); - if (infiniteProgress.isIndeterminate()) { - infiniteProgress.setIndeterminate(false); - infiniteProgress.setStringPainted(true); + if( preSelectedFolder == null ){ + String lastUsedFolder = localPropertiesService.getValue( EarthProperty.LAST_USED_FOLDER ); + if( !StringUtils.isBlank( lastUsedFolder ) ){ + preSelectedFolder = new File( lastUsedFolder ); + if( !preSelectedFolder.exists()){ + preSelectedFolder = null; + } } + } - infiniteProgress.setMaximum(total); - - infiniteProgress.setValue(current); - if( StringUtils.isNotBlank( msg )) - setMessage( msg ); - }; - - SwingUtilities.invokeLater( updateTask ); + fc = new JFileChooserExistsAware( preSelectedFolder ); - } + if( preselectedName != null ){ + File selectedFile = new File( fc.getCurrentDirectory().getAbsolutePath() + File.separatorChar + preselectedName ); + fc.setSelectedFile( selectedFile ); + } - public void updateProgress(int currentPercentage) { - Runnable updateTask = () -> { - infiniteProgress.setString(currentPercentage + "%"); - if (infiniteProgress.isIndeterminate()) { - infiniteProgress.setIndeterminate(false); - infiniteProgress.setStringPainted(true); - } + fc.setMultiSelectionEnabled( multipleSelect ); - infiniteProgress.setMaximum(100); + File[] selectedFiles = null; + FileFilter addedFilter = getFileFilter(dataFormat); + fc.addChoosableFileFilter(addedFilter); - infiniteProgress.setValue(currentPercentage); - }; - - SwingUtilities.invokeLater( updateTask ); + fc.setAcceptAllFileFilterUsed(true); + // Set the added file filter as the default chose filter + fc.setFileFilter(addedFilter); - } + // Handle open button action. + int returnVal ; + if( isSaveDlg ){ + returnVal = fc.showSaveDialog( frame ); + }else{ + returnVal = fc.showOpenDialog( frame); + } - public void setMessage(String msg) { - label.setText(msg); - } + if ( returnVal == JFileChooser.APPROVE_OPTION) { - public void close() { - SwingUtilities.invokeLater(() -> { - hide(); - getDialog().dispose(); - }); - } + if( multipleSelect ){ + selectedFiles = fc.getSelectedFiles(); + }else{ + selectedFiles = new File[]{fc.getSelectedFile()}; + } + + if( selectedFiles != null && selectedFiles.length > 0 ) { + if( isSaveDlg ){ + String fileName = selectedFiles[0].getAbsolutePath(); + + String fileExtension = null; + + if( fileName.lastIndexOf('.') != -1){ + fileExtension = fileName.substring( fileName.lastIndexOf('.') + 1 ).toLowerCase(); + } + + // If the chose file has no extension or the extension is not one of the default extensions for the dataformat + if ( fileExtension == null || Arrays.binarySearch( dataFormat.getPossibleFileExtensions(), fileExtension ) < 0 ) { //$NON-NLS-1$ + fileName += "." + dataFormat.getDefaultExtension(); //$NON-NLS-1$ + selectedFiles[0] = new File(fileName); + } + } + + localPropertiesService.setValue(EarthProperty.LAST_USED_FOLDER, selectedFiles[0].getParent()); + } - private JDialog getDialog() { - return dialog; - } - public void hide() { - getDialog().setVisible(false); + } + return selectedFiles; } - public boolean isShowing() { - return getDialog().isShowing(); - } + private static FileFilter getFileFilter(final DataFormat dataFormat) { + return new FileFilter() { - public boolean isUserCancelled() { - return userCancelled; - } + @Override + public boolean accept(File f) { - private void setDialog(JDialog dialog) { - this.dialog = dialog; - } + String[] extensions = dataFormat.getPossibleFileExtensions(); + boolean acceptedFile = false; + boolean isFolder = f.isDirectory(); + if( isFolder ){ + acceptedFile = true; + }else{ - public void setUserCancelled(boolean userCancelled) { - this.userCancelled = userCancelled; - } - - public void show() { - - Runnable showTask = () -> { - getDialog().setVisible(true); - if (getPane().getValue() == null // User closes the dialog - || - getPane().getValue().equals(cancelOption) // User clicks on cancel option - ) { - setUserCancelled(true); + for (String fileExtension : extensions) { + if( f.getName().toLowerCase().endsWith("." + fileExtension ) ){ //$NON-NLS-1$ + acceptedFile = true; + break; + } + } } - }; - SwingUtilities.invokeLater( showTask ); - - } + return acceptedFile; + } - public void showLater() { - Runnable showLater = () -> { - getDialog().setVisible(true); - if (getPane().getValue() == null // User closes the dialog - || - getPane().getValue().equals(cancelOption) // User clicks on cancel option - ) { - setUserCancelled(true); + @Override + public String getDescription() { + return dataFormat.getDescription(); } }; - SwingUtilities.invokeLater( showLater ); - - } - - private JOptionPane getPane() { - return pane; - } - - private void setPane(JOptionPane pane) { - this.pane = pane; - } - - @Override - public void progressMade(Progress progress) { - updateProgress((int) progress.getProcessedItems()); } } From ce0eea3b9f5fabf966f8418e367777fddd09ba37 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:26 +0100 Subject: [PATCH 1255/1620] New translations JFileChooserExistsAware.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 248 ++++++++---------- 1 file changed, 115 insertions(+), 133 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index ca537bed7a..21d900b58d 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,173 +1,155 @@ package org.openforis.collect.earth.app.view; -import java.awt.Component; +import java.io.File; +import java.util.Arrays; -import javax.swing.JDialog; -import javax.swing.JLabel; +import javax.swing.JFileChooser; +import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.JProgressBar; -import javax.swing.SwingUtilities; +import javax.swing.filechooser.FileFilter; import org.apache.commons.lang3.StringUtils; -import org.openforis.concurrency.Progress; -import org.openforis.concurrency.ProgressListener; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -public class InfiniteProgressMonitor implements ProgressListener { +public class JFileChooserExistsAware extends JFileChooser { - JDialog infiniteWaitingDialog; + private static final long serialVersionUID = 2571562963995019882L; - private boolean userCancelled = false; - - private JDialog dialog; - - private JOptionPane pane; - - private String cancelOption; - - private JLabel label; - - JProgressBar infiniteProgress; - - private Logger logger = LoggerFactory.getLogger( InfiniteProgressMonitor.class ); - - public InfiniteProgressMonitor(Component parentFrame, String title, String message) { - - infiniteProgress = new JProgressBar(); - infiniteProgress.setIndeterminate(true); - label = new JLabel(message); - - final Object[] dialogItems = { label, infiniteProgress }; + private JFileChooserExistsAware(File lastFolder) { + super(lastFolder); + } - cancelOption = Messages.getString("InfiniteProgressMonitor.0"); //$NON-NLS-1$ - final Object[] options = { cancelOption }; - setPane(new JOptionPane(dialogItems, JOptionPane.PLAIN_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, - options)); - setDialog(getPane().createDialog(parentFrame, title)); - getDialog().setModal(true); + private JFileChooserExistsAware(){ + super(); + } + @Override + public void approveSelection(){ + File f = getSelectedFile(); + if( f!=null && f.exists() && getDialogType() == SAVE_DIALOG){ + int result = JOptionPane.showConfirmDialog(this,"The file exists, overwrite?","Existing file",JOptionPane.YES_NO_CANCEL_OPTION); //$NON-NLS-1$ //$NON-NLS-2$ + switch(result){ + case JOptionPane.YES_OPTION: + super.approveSelection(); + return; + case JOptionPane.NO_OPTION: + return; + case JOptionPane.CLOSED_OPTION: + return; + case JOptionPane.CANCEL_OPTION: + cancelSelection(); + return; + } + } + super.approveSelection(); } - public void updateProgress(int current, int total) { + public static File[] getFileChooserResults(final DataFormat dataFormat, boolean isSaveDlg, boolean multipleSelect, String preselectedName, LocalPropertiesService localPropertiesService, JFrame frame) { + return getFileChooserResults(dataFormat, isSaveDlg, multipleSelect, preselectedName, localPropertiesService, frame, null); + } - updateProgress(current, total, null); + public static File[] getFileChooserResults(final DataFormat dataFormat, boolean isSaveDlg, boolean multipleSelect, String preselectedName, LocalPropertiesService localPropertiesService, JFrame frame, File preSelectedFolder) { - } - - public void updateProgress(int current, int total, String msg) { + JFileChooser fc ; - Runnable updateTask = () -> { - infiniteProgress.setString(current + "/" + total); - if (infiniteProgress.isIndeterminate()) { - infiniteProgress.setIndeterminate(false); - infiniteProgress.setStringPainted(true); + if( preSelectedFolder == null ){ + String lastUsedFolder = localPropertiesService.getValue( EarthProperty.LAST_USED_FOLDER ); + if( !StringUtils.isBlank( lastUsedFolder ) ){ + preSelectedFolder = new File( lastUsedFolder ); + if( !preSelectedFolder.exists()){ + preSelectedFolder = null; + } } + } - infiniteProgress.setMaximum(total); - - infiniteProgress.setValue(current); - if( StringUtils.isNotBlank( msg )) - setMessage( msg ); - }; - - SwingUtilities.invokeLater( updateTask ); + fc = new JFileChooserExistsAware( preSelectedFolder ); - } + if( preselectedName != null ){ + File selectedFile = new File( fc.getCurrentDirectory().getAbsolutePath() + File.separatorChar + preselectedName ); + fc.setSelectedFile( selectedFile ); + } - public void updateProgress(int currentPercentage) { - Runnable updateTask = () -> { - infiniteProgress.setString(currentPercentage + "%"); - if (infiniteProgress.isIndeterminate()) { - infiniteProgress.setIndeterminate(false); - infiniteProgress.setStringPainted(true); - } + fc.setMultiSelectionEnabled( multipleSelect ); - infiniteProgress.setMaximum(100); + File[] selectedFiles = null; + FileFilter addedFilter = getFileFilter(dataFormat); + fc.addChoosableFileFilter(addedFilter); - infiniteProgress.setValue(currentPercentage); - }; - - SwingUtilities.invokeLater( updateTask ); + fc.setAcceptAllFileFilterUsed(true); + // Set the added file filter as the default chose filter + fc.setFileFilter(addedFilter); - } + // Handle open button action. + int returnVal ; + if( isSaveDlg ){ + returnVal = fc.showSaveDialog( frame ); + }else{ + returnVal = fc.showOpenDialog( frame); + } - public void setMessage(String msg) { - label.setText(msg); - } + if ( returnVal == JFileChooser.APPROVE_OPTION) { - public void close() { - SwingUtilities.invokeLater(() -> { - hide(); - getDialog().dispose(); - }); - } + if( multipleSelect ){ + selectedFiles = fc.getSelectedFiles(); + }else{ + selectedFiles = new File[]{fc.getSelectedFile()}; + } + + if( selectedFiles != null && selectedFiles.length > 0 ) { + if( isSaveDlg ){ + String fileName = selectedFiles[0].getAbsolutePath(); + + String fileExtension = null; + + if( fileName.lastIndexOf('.') != -1){ + fileExtension = fileName.substring( fileName.lastIndexOf('.') + 1 ).toLowerCase(); + } + + // If the chose file has no extension or the extension is not one of the default extensions for the dataformat + if ( fileExtension == null || Arrays.binarySearch( dataFormat.getPossibleFileExtensions(), fileExtension ) < 0 ) { //$NON-NLS-1$ + fileName += "." + dataFormat.getDefaultExtension(); //$NON-NLS-1$ + selectedFiles[0] = new File(fileName); + } + } + + localPropertiesService.setValue(EarthProperty.LAST_USED_FOLDER, selectedFiles[0].getParent()); + } - private JDialog getDialog() { - return dialog; - } - public void hide() { - getDialog().setVisible(false); + } + return selectedFiles; } - public boolean isShowing() { - return getDialog().isShowing(); - } + private static FileFilter getFileFilter(final DataFormat dataFormat) { + return new FileFilter() { - public boolean isUserCancelled() { - return userCancelled; - } + @Override + public boolean accept(File f) { - private void setDialog(JDialog dialog) { - this.dialog = dialog; - } + String[] extensions = dataFormat.getPossibleFileExtensions(); + boolean acceptedFile = false; + boolean isFolder = f.isDirectory(); + if( isFolder ){ + acceptedFile = true; + }else{ - public void setUserCancelled(boolean userCancelled) { - this.userCancelled = userCancelled; - } - - public void show() { - - Runnable showTask = () -> { - getDialog().setVisible(true); - if (getPane().getValue() == null // User closes the dialog - || - getPane().getValue().equals(cancelOption) // User clicks on cancel option - ) { - setUserCancelled(true); + for (String fileExtension : extensions) { + if( f.getName().toLowerCase().endsWith("." + fileExtension ) ){ //$NON-NLS-1$ + acceptedFile = true; + break; + } + } } - }; - SwingUtilities.invokeLater( showTask ); - - } + return acceptedFile; + } - public void showLater() { - Runnable showLater = () -> { - getDialog().setVisible(true); - if (getPane().getValue() == null // User closes the dialog - || - getPane().getValue().equals(cancelOption) // User clicks on cancel option - ) { - setUserCancelled(true); + @Override + public String getDescription() { + return dataFormat.getDescription(); } }; - SwingUtilities.invokeLater( showLater ); - - } - - private JOptionPane getPane() { - return pane; - } - - private void setPane(JOptionPane pane) { - this.pane = pane; - } - - @Override - public void progressMade(Progress progress) { - updateProgress((int) progress.getProcessedItems()); } } From dceebd7d77373a858060f86f598172cafdc0baba Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:27 +0100 Subject: [PATCH 1256/1620] New translations JFileChooserExistsAware.java (English) --- .../earth/app/view/Messages_en.properties | 248 ++++++++---------- 1 file changed, 115 insertions(+), 133 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index ca537bed7a..21d900b58d 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,173 +1,155 @@ package org.openforis.collect.earth.app.view; -import java.awt.Component; +import java.io.File; +import java.util.Arrays; -import javax.swing.JDialog; -import javax.swing.JLabel; +import javax.swing.JFileChooser; +import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.JProgressBar; -import javax.swing.SwingUtilities; +import javax.swing.filechooser.FileFilter; import org.apache.commons.lang3.StringUtils; -import org.openforis.concurrency.Progress; -import org.openforis.concurrency.ProgressListener; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; -public class InfiniteProgressMonitor implements ProgressListener { +public class JFileChooserExistsAware extends JFileChooser { - JDialog infiniteWaitingDialog; + private static final long serialVersionUID = 2571562963995019882L; - private boolean userCancelled = false; - - private JDialog dialog; - - private JOptionPane pane; - - private String cancelOption; - - private JLabel label; - - JProgressBar infiniteProgress; - - private Logger logger = LoggerFactory.getLogger( InfiniteProgressMonitor.class ); - - public InfiniteProgressMonitor(Component parentFrame, String title, String message) { - - infiniteProgress = new JProgressBar(); - infiniteProgress.setIndeterminate(true); - label = new JLabel(message); - - final Object[] dialogItems = { label, infiniteProgress }; + private JFileChooserExistsAware(File lastFolder) { + super(lastFolder); + } - cancelOption = Messages.getString("InfiniteProgressMonitor.0"); //$NON-NLS-1$ - final Object[] options = { cancelOption }; - setPane(new JOptionPane(dialogItems, JOptionPane.PLAIN_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, - options)); - setDialog(getPane().createDialog(parentFrame, title)); - getDialog().setModal(true); + private JFileChooserExistsAware(){ + super(); + } + @Override + public void approveSelection(){ + File f = getSelectedFile(); + if( f!=null && f.exists() && getDialogType() == SAVE_DIALOG){ + int result = JOptionPane.showConfirmDialog(this,"The file exists, overwrite?","Existing file",JOptionPane.YES_NO_CANCEL_OPTION); //$NON-NLS-1$ //$NON-NLS-2$ + switch(result){ + case JOptionPane.YES_OPTION: + super.approveSelection(); + return; + case JOptionPane.NO_OPTION: + return; + case JOptionPane.CLOSED_OPTION: + return; + case JOptionPane.CANCEL_OPTION: + cancelSelection(); + return; + } + } + super.approveSelection(); } - public void updateProgress(int current, int total) { + public static File[] getFileChooserResults(final DataFormat dataFormat, boolean isSaveDlg, boolean multipleSelect, String preselectedName, LocalPropertiesService localPropertiesService, JFrame frame) { + return getFileChooserResults(dataFormat, isSaveDlg, multipleSelect, preselectedName, localPropertiesService, frame, null); + } - updateProgress(current, total, null); + public static File[] getFileChooserResults(final DataFormat dataFormat, boolean isSaveDlg, boolean multipleSelect, String preselectedName, LocalPropertiesService localPropertiesService, JFrame frame, File preSelectedFolder) { - } - - public void updateProgress(int current, int total, String msg) { + JFileChooser fc ; - Runnable updateTask = () -> { - infiniteProgress.setString(current + "/" + total); - if (infiniteProgress.isIndeterminate()) { - infiniteProgress.setIndeterminate(false); - infiniteProgress.setStringPainted(true); + if( preSelectedFolder == null ){ + String lastUsedFolder = localPropertiesService.getValue( EarthProperty.LAST_USED_FOLDER ); + if( !StringUtils.isBlank( lastUsedFolder ) ){ + preSelectedFolder = new File( lastUsedFolder ); + if( !preSelectedFolder.exists()){ + preSelectedFolder = null; + } } + } - infiniteProgress.setMaximum(total); - - infiniteProgress.setValue(current); - if( StringUtils.isNotBlank( msg )) - setMessage( msg ); - }; - - SwingUtilities.invokeLater( updateTask ); + fc = new JFileChooserExistsAware( preSelectedFolder ); - } + if( preselectedName != null ){ + File selectedFile = new File( fc.getCurrentDirectory().getAbsolutePath() + File.separatorChar + preselectedName ); + fc.setSelectedFile( selectedFile ); + } - public void updateProgress(int currentPercentage) { - Runnable updateTask = () -> { - infiniteProgress.setString(currentPercentage + "%"); - if (infiniteProgress.isIndeterminate()) { - infiniteProgress.setIndeterminate(false); - infiniteProgress.setStringPainted(true); - } + fc.setMultiSelectionEnabled( multipleSelect ); - infiniteProgress.setMaximum(100); + File[] selectedFiles = null; + FileFilter addedFilter = getFileFilter(dataFormat); + fc.addChoosableFileFilter(addedFilter); - infiniteProgress.setValue(currentPercentage); - }; - - SwingUtilities.invokeLater( updateTask ); + fc.setAcceptAllFileFilterUsed(true); + // Set the added file filter as the default chose filter + fc.setFileFilter(addedFilter); - } + // Handle open button action. + int returnVal ; + if( isSaveDlg ){ + returnVal = fc.showSaveDialog( frame ); + }else{ + returnVal = fc.showOpenDialog( frame); + } - public void setMessage(String msg) { - label.setText(msg); - } + if ( returnVal == JFileChooser.APPROVE_OPTION) { - public void close() { - SwingUtilities.invokeLater(() -> { - hide(); - getDialog().dispose(); - }); - } + if( multipleSelect ){ + selectedFiles = fc.getSelectedFiles(); + }else{ + selectedFiles = new File[]{fc.getSelectedFile()}; + } + + if( selectedFiles != null && selectedFiles.length > 0 ) { + if( isSaveDlg ){ + String fileName = selectedFiles[0].getAbsolutePath(); + + String fileExtension = null; + + if( fileName.lastIndexOf('.') != -1){ + fileExtension = fileName.substring( fileName.lastIndexOf('.') + 1 ).toLowerCase(); + } + + // If the chose file has no extension or the extension is not one of the default extensions for the dataformat + if ( fileExtension == null || Arrays.binarySearch( dataFormat.getPossibleFileExtensions(), fileExtension ) < 0 ) { //$NON-NLS-1$ + fileName += "." + dataFormat.getDefaultExtension(); //$NON-NLS-1$ + selectedFiles[0] = new File(fileName); + } + } + + localPropertiesService.setValue(EarthProperty.LAST_USED_FOLDER, selectedFiles[0].getParent()); + } - private JDialog getDialog() { - return dialog; - } - public void hide() { - getDialog().setVisible(false); + } + return selectedFiles; } - public boolean isShowing() { - return getDialog().isShowing(); - } + private static FileFilter getFileFilter(final DataFormat dataFormat) { + return new FileFilter() { - public boolean isUserCancelled() { - return userCancelled; - } + @Override + public boolean accept(File f) { - private void setDialog(JDialog dialog) { - this.dialog = dialog; - } + String[] extensions = dataFormat.getPossibleFileExtensions(); + boolean acceptedFile = false; + boolean isFolder = f.isDirectory(); + if( isFolder ){ + acceptedFile = true; + }else{ - public void setUserCancelled(boolean userCancelled) { - this.userCancelled = userCancelled; - } - - public void show() { - - Runnable showTask = () -> { - getDialog().setVisible(true); - if (getPane().getValue() == null // User closes the dialog - || - getPane().getValue().equals(cancelOption) // User clicks on cancel option - ) { - setUserCancelled(true); + for (String fileExtension : extensions) { + if( f.getName().toLowerCase().endsWith("." + fileExtension ) ){ //$NON-NLS-1$ + acceptedFile = true; + break; + } + } } - }; - SwingUtilities.invokeLater( showTask ); - - } + return acceptedFile; + } - public void showLater() { - Runnable showLater = () -> { - getDialog().setVisible(true); - if (getPane().getValue() == null // User closes the dialog - || - getPane().getValue().equals(cancelOption) // User clicks on cancel option - ) { - setUserCancelled(true); + @Override + public String getDescription() { + return dataFormat.getDescription(); } }; - SwingUtilities.invokeLater( showLater ); - - } - - private JOptionPane getPane() { - return pane; - } - - private void setPane(JOptionPane pane) { - this.pane = pane; - } - - @Override - public void progressMade(Progress progress) { - updateProgress((int) progress.getProcessedItems()); } } From 7f63af6d635bdacb642ed7764921cf9eee1fb2c3 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:28 +0100 Subject: [PATCH 1257/1620] New translations JFilePicker.java (French) --- .../earth/app/view/Messages_fr.properties | 233 +++++++++--------- 1 file changed, 115 insertions(+), 118 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 21d900b58d..31589044b8 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,155 +1,152 @@ package org.openforis.collect.earth.app.view; +import java.awt.Color; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.event.ActionEvent; import java.io.File; -import java.util.Arrays; +import javax.swing.JButton; import javax.swing.JFileChooser; -import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.swing.filechooser.FileFilter; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTextField; +import javax.swing.border.BevelBorder; +import javax.swing.event.DocumentListener; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -public class JFileChooserExistsAware extends JFileChooser { +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ +public class JFilePicker extends JPanel { - private static final long serialVersionUID = 2571562963995019882L; + public enum DlgMode{MODE_OPEN,MODE_SAVE } - private JFileChooserExistsAware(File lastFolder) { - super(lastFolder); - } + private static final long serialVersionUID = 9057893034177011651L; - private JFileChooserExistsAware(){ - super(); - } + private JLabel label; + private JTextField textField; + private JButton button; + private transient Logger logger = LoggerFactory.getLogger(this.getClass()); + private JFileChooser fileChooser; - @Override - public void approveSelection(){ - File f = getSelectedFile(); - if( f!=null && f.exists() && getDialogType() == SAVE_DIALOG){ - int result = JOptionPane.showConfirmDialog(this,"The file exists, overwrite?","Existing file",JOptionPane.YES_NO_CANCEL_OPTION); //$NON-NLS-1$ //$NON-NLS-2$ - switch(result){ - case JOptionPane.YES_OPTION: - super.approveSelection(); - return; - case JOptionPane.NO_OPTION: - return; - case JOptionPane.CLOSED_OPTION: - return; - case JOptionPane.CANCEL_OPTION: - cancelSelection(); - return; - } - } - super.approveSelection(); - } + private DlgMode mode; - public static File[] getFileChooserResults(final DataFormat dataFormat, boolean isSaveDlg, boolean multipleSelect, String preselectedName, LocalPropertiesService localPropertiesService, JFrame frame) { - return getFileChooserResults(dataFormat, isSaveDlg, multipleSelect, preselectedName, localPropertiesService, frame, null); - } + private JFileChooser getFixedFileChooser() { + return new JFileChooser() { + private static final long serialVersionUID = 1541813407103968847L; - public static File[] getFileChooserResults(final DataFormat dataFormat, boolean isSaveDlg, boolean multipleSelect, String preselectedName, LocalPropertiesService localPropertiesService, JFrame frame, File preSelectedFolder) { + @Override + public void updateUI() { + putClientProperty("FileChooser.useShellFolder", Boolean.FALSE); + super.updateUI(); + } + }; + } - JFileChooser fc ; + public JFilePicker(String textFieldLabel, String originalPathValue, String buttonLabel, DlgMode mode) { - if( preSelectedFolder == null ){ - String lastUsedFolder = localPropertiesService.getValue( EarthProperty.LAST_USED_FOLDER ); - if( !StringUtils.isBlank( lastUsedFolder ) ){ - preSelectedFolder = new File( lastUsedFolder ); - if( !preSelectedFolder.exists()){ - preSelectedFolder = null; + fileChooser = getFixedFileChooser(); + setBorder( new BevelBorder( BevelBorder.RAISED )); + this.mode = mode; + if (originalPathValue != null && originalPathValue.length() > 0) { + try { + File originalFile = new File(originalPathValue); + if( originalFile.exists() ){ + fileChooser.setCurrentDirectory(originalFile.getParentFile()); } + } catch (Exception e) { + logger.error("Unable to find parent folder for " + originalPathValue, e); //$NON-NLS-1$ } } - fc = new JFileChooserExistsAware( preSelectedFolder ); - if( preselectedName != null ){ - File selectedFile = new File( fc.getCurrentDirectory().getAbsolutePath() + File.separatorChar + preselectedName ); - fc.setSelectedFile( selectedFile ); + // creates the GUI + label = new JLabel(textFieldLabel); + setTextField(new JTextField(originalPathValue, 20)); + button = new JButton(buttonLabel); + + if (originalPathValue != null && originalPathValue.length() > 0) { + getTextField().setCaretPosition(originalPathValue.length() - 1); } - fc.setMultiSelectionEnabled( multipleSelect ); + button.addActionListener( this::buttonActionPerformed ); - File[] selectedFiles = null; - FileFilter addedFilter = getFileFilter(dataFormat); - fc.addChoosableFileFilter(addedFilter); - fc.setAcceptAllFileFilterUsed(true); - // Set the added file filter as the default chose filter - fc.setFileFilter(addedFilter); + setLayout(new GridBagLayout()); - // Handle open button action. - int returnVal ; - if( isSaveDlg ){ - returnVal = fc.showSaveDialog( frame ); - }else{ - returnVal = fc.showOpenDialog( frame); - } + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.WEST; + constraints.insets = new Insets(2, 2, 2, 2); + constraints.fill = GridBagConstraints.BOTH; - if ( returnVal == JFileChooser.APPROVE_OPTION) { + add(label, constraints); - if( multipleSelect ){ - selectedFiles = fc.getSelectedFiles(); - }else{ - selectedFiles = new File[]{fc.getSelectedFile()}; - } - - if( selectedFiles != null && selectedFiles.length > 0 ) { - if( isSaveDlg ){ - String fileName = selectedFiles[0].getAbsolutePath(); - - String fileExtension = null; - - if( fileName.lastIndexOf('.') != -1){ - fileExtension = fileName.substring( fileName.lastIndexOf('.') + 1 ).toLowerCase(); - } - - // If the chose file has no extension or the extension is not one of the default extensions for the dataformat - if ( fileExtension == null || Arrays.binarySearch( dataFormat.getPossibleFileExtensions(), fileExtension ) < 0 ) { //$NON-NLS-1$ - fileName += "." + dataFormat.getDefaultExtension(); //$NON-NLS-1$ - selectedFiles[0] = new File(fileName); - } - } - - localPropertiesService.setValue(EarthProperty.LAST_USED_FOLDER, selectedFiles[0].getParent()); - } + constraints.gridy = 1; + constraints.weightx =1; + add(getTextField(), constraints); + constraints.gridx = 1; + constraints.weightx = 0; + add(button, constraints); + + } + public void addChangeListener(DocumentListener listener) { + getTextField().getDocument().addDocumentListener(listener); + } + public void addFileTypeFilter(String extension, String description, boolean setSelected) { + FileTypeFilter filter = new FileTypeFilter(extension, description); + fileChooser.addChoosableFileFilter(filter); + if (setSelected) { + fileChooser.setFileFilter(filter); } - return selectedFiles; } - private static FileFilter getFileFilter(final DataFormat dataFormat) { - return new FileFilter() { + private void buttonActionPerformed(ActionEvent evt) { + if ( + ( mode == DlgMode.MODE_OPEN || mode == DlgMode.MODE_SAVE) && + fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION && + fileChooser.getSelectedFile() != null + ) { + getTextField().setText( fileChooser.getSelectedFile().getAbsolutePath() ); + } + } - @Override - public boolean accept(File f) { - - String[] extensions = dataFormat.getPossibleFileExtensions(); - boolean acceptedFile = false; - boolean isFolder = f.isDirectory(); - if( isFolder ){ - acceptedFile = true; - }else{ - - for (String fileExtension : extensions) { - if( f.getName().toLowerCase().endsWith("." + fileExtension ) ){ //$NON-NLS-1$ - acceptedFile = true; - break; - } - } - } + public JFileChooser getFileChooser() { + return this.fileChooser; + } - return acceptedFile; - } + public String getSelectedFilePath() { + return getTextField().getText(); + } - @Override - public String getDescription() { - return dataFormat.getDescription(); - } - }; + public void setFolderChooser() { + fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + } + + public JTextField getTextField() { + return textField; + } + + private void setTextField(JTextField textField) { + this.textField = textField; + } + + public void setTextBackground(Color bgColor) { + getTextField().setBackground(bgColor); + } + + @Override + public void setEnabled(boolean enabled) { + button.setEnabled(enabled); + textField.setEnabled(enabled); } -} +} \ No newline at end of file From 52d327c70bd20286e99981e936dc0b3475d1e493 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:30 +0100 Subject: [PATCH 1258/1620] New translations JFilePicker.java (Spanish) --- .../earth/app/view/Messages_es.properties | 233 +++++++++--------- 1 file changed, 115 insertions(+), 118 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 21d900b58d..31589044b8 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,155 +1,152 @@ package org.openforis.collect.earth.app.view; +import java.awt.Color; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.event.ActionEvent; import java.io.File; -import java.util.Arrays; +import javax.swing.JButton; import javax.swing.JFileChooser; -import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.swing.filechooser.FileFilter; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTextField; +import javax.swing.border.BevelBorder; +import javax.swing.event.DocumentListener; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -public class JFileChooserExistsAware extends JFileChooser { +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ +public class JFilePicker extends JPanel { - private static final long serialVersionUID = 2571562963995019882L; + public enum DlgMode{MODE_OPEN,MODE_SAVE } - private JFileChooserExistsAware(File lastFolder) { - super(lastFolder); - } + private static final long serialVersionUID = 9057893034177011651L; - private JFileChooserExistsAware(){ - super(); - } + private JLabel label; + private JTextField textField; + private JButton button; + private transient Logger logger = LoggerFactory.getLogger(this.getClass()); + private JFileChooser fileChooser; - @Override - public void approveSelection(){ - File f = getSelectedFile(); - if( f!=null && f.exists() && getDialogType() == SAVE_DIALOG){ - int result = JOptionPane.showConfirmDialog(this,"The file exists, overwrite?","Existing file",JOptionPane.YES_NO_CANCEL_OPTION); //$NON-NLS-1$ //$NON-NLS-2$ - switch(result){ - case JOptionPane.YES_OPTION: - super.approveSelection(); - return; - case JOptionPane.NO_OPTION: - return; - case JOptionPane.CLOSED_OPTION: - return; - case JOptionPane.CANCEL_OPTION: - cancelSelection(); - return; - } - } - super.approveSelection(); - } + private DlgMode mode; - public static File[] getFileChooserResults(final DataFormat dataFormat, boolean isSaveDlg, boolean multipleSelect, String preselectedName, LocalPropertiesService localPropertiesService, JFrame frame) { - return getFileChooserResults(dataFormat, isSaveDlg, multipleSelect, preselectedName, localPropertiesService, frame, null); - } + private JFileChooser getFixedFileChooser() { + return new JFileChooser() { + private static final long serialVersionUID = 1541813407103968847L; - public static File[] getFileChooserResults(final DataFormat dataFormat, boolean isSaveDlg, boolean multipleSelect, String preselectedName, LocalPropertiesService localPropertiesService, JFrame frame, File preSelectedFolder) { + @Override + public void updateUI() { + putClientProperty("FileChooser.useShellFolder", Boolean.FALSE); + super.updateUI(); + } + }; + } - JFileChooser fc ; + public JFilePicker(String textFieldLabel, String originalPathValue, String buttonLabel, DlgMode mode) { - if( preSelectedFolder == null ){ - String lastUsedFolder = localPropertiesService.getValue( EarthProperty.LAST_USED_FOLDER ); - if( !StringUtils.isBlank( lastUsedFolder ) ){ - preSelectedFolder = new File( lastUsedFolder ); - if( !preSelectedFolder.exists()){ - preSelectedFolder = null; + fileChooser = getFixedFileChooser(); + setBorder( new BevelBorder( BevelBorder.RAISED )); + this.mode = mode; + if (originalPathValue != null && originalPathValue.length() > 0) { + try { + File originalFile = new File(originalPathValue); + if( originalFile.exists() ){ + fileChooser.setCurrentDirectory(originalFile.getParentFile()); } + } catch (Exception e) { + logger.error("Unable to find parent folder for " + originalPathValue, e); //$NON-NLS-1$ } } - fc = new JFileChooserExistsAware( preSelectedFolder ); - if( preselectedName != null ){ - File selectedFile = new File( fc.getCurrentDirectory().getAbsolutePath() + File.separatorChar + preselectedName ); - fc.setSelectedFile( selectedFile ); + // creates the GUI + label = new JLabel(textFieldLabel); + setTextField(new JTextField(originalPathValue, 20)); + button = new JButton(buttonLabel); + + if (originalPathValue != null && originalPathValue.length() > 0) { + getTextField().setCaretPosition(originalPathValue.length() - 1); } - fc.setMultiSelectionEnabled( multipleSelect ); + button.addActionListener( this::buttonActionPerformed ); - File[] selectedFiles = null; - FileFilter addedFilter = getFileFilter(dataFormat); - fc.addChoosableFileFilter(addedFilter); - fc.setAcceptAllFileFilterUsed(true); - // Set the added file filter as the default chose filter - fc.setFileFilter(addedFilter); + setLayout(new GridBagLayout()); - // Handle open button action. - int returnVal ; - if( isSaveDlg ){ - returnVal = fc.showSaveDialog( frame ); - }else{ - returnVal = fc.showOpenDialog( frame); - } + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.WEST; + constraints.insets = new Insets(2, 2, 2, 2); + constraints.fill = GridBagConstraints.BOTH; - if ( returnVal == JFileChooser.APPROVE_OPTION) { + add(label, constraints); - if( multipleSelect ){ - selectedFiles = fc.getSelectedFiles(); - }else{ - selectedFiles = new File[]{fc.getSelectedFile()}; - } - - if( selectedFiles != null && selectedFiles.length > 0 ) { - if( isSaveDlg ){ - String fileName = selectedFiles[0].getAbsolutePath(); - - String fileExtension = null; - - if( fileName.lastIndexOf('.') != -1){ - fileExtension = fileName.substring( fileName.lastIndexOf('.') + 1 ).toLowerCase(); - } - - // If the chose file has no extension or the extension is not one of the default extensions for the dataformat - if ( fileExtension == null || Arrays.binarySearch( dataFormat.getPossibleFileExtensions(), fileExtension ) < 0 ) { //$NON-NLS-1$ - fileName += "." + dataFormat.getDefaultExtension(); //$NON-NLS-1$ - selectedFiles[0] = new File(fileName); - } - } - - localPropertiesService.setValue(EarthProperty.LAST_USED_FOLDER, selectedFiles[0].getParent()); - } + constraints.gridy = 1; + constraints.weightx =1; + add(getTextField(), constraints); + constraints.gridx = 1; + constraints.weightx = 0; + add(button, constraints); + + } + public void addChangeListener(DocumentListener listener) { + getTextField().getDocument().addDocumentListener(listener); + } + public void addFileTypeFilter(String extension, String description, boolean setSelected) { + FileTypeFilter filter = new FileTypeFilter(extension, description); + fileChooser.addChoosableFileFilter(filter); + if (setSelected) { + fileChooser.setFileFilter(filter); } - return selectedFiles; } - private static FileFilter getFileFilter(final DataFormat dataFormat) { - return new FileFilter() { + private void buttonActionPerformed(ActionEvent evt) { + if ( + ( mode == DlgMode.MODE_OPEN || mode == DlgMode.MODE_SAVE) && + fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION && + fileChooser.getSelectedFile() != null + ) { + getTextField().setText( fileChooser.getSelectedFile().getAbsolutePath() ); + } + } - @Override - public boolean accept(File f) { - - String[] extensions = dataFormat.getPossibleFileExtensions(); - boolean acceptedFile = false; - boolean isFolder = f.isDirectory(); - if( isFolder ){ - acceptedFile = true; - }else{ - - for (String fileExtension : extensions) { - if( f.getName().toLowerCase().endsWith("." + fileExtension ) ){ //$NON-NLS-1$ - acceptedFile = true; - break; - } - } - } + public JFileChooser getFileChooser() { + return this.fileChooser; + } - return acceptedFile; - } + public String getSelectedFilePath() { + return getTextField().getText(); + } - @Override - public String getDescription() { - return dataFormat.getDescription(); - } - }; + public void setFolderChooser() { + fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + } + + public JTextField getTextField() { + return textField; + } + + private void setTextField(JTextField textField) { + this.textField = textField; + } + + public void setTextBackground(Color bgColor) { + getTextField().setBackground(bgColor); + } + + @Override + public void setEnabled(boolean enabled) { + button.setEnabled(enabled); + textField.setEnabled(enabled); } -} +} \ No newline at end of file From be22aea9bf8457782b9c6d7b9686077f5407756e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:31 +0100 Subject: [PATCH 1259/1620] New translations JFilePicker.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 233 +++++++++--------- 1 file changed, 115 insertions(+), 118 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 21d900b58d..31589044b8 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,155 +1,152 @@ package org.openforis.collect.earth.app.view; +import java.awt.Color; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.event.ActionEvent; import java.io.File; -import java.util.Arrays; +import javax.swing.JButton; import javax.swing.JFileChooser; -import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.swing.filechooser.FileFilter; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTextField; +import javax.swing.border.BevelBorder; +import javax.swing.event.DocumentListener; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -public class JFileChooserExistsAware extends JFileChooser { +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ +public class JFilePicker extends JPanel { - private static final long serialVersionUID = 2571562963995019882L; + public enum DlgMode{MODE_OPEN,MODE_SAVE } - private JFileChooserExistsAware(File lastFolder) { - super(lastFolder); - } + private static final long serialVersionUID = 9057893034177011651L; - private JFileChooserExistsAware(){ - super(); - } + private JLabel label; + private JTextField textField; + private JButton button; + private transient Logger logger = LoggerFactory.getLogger(this.getClass()); + private JFileChooser fileChooser; - @Override - public void approveSelection(){ - File f = getSelectedFile(); - if( f!=null && f.exists() && getDialogType() == SAVE_DIALOG){ - int result = JOptionPane.showConfirmDialog(this,"The file exists, overwrite?","Existing file",JOptionPane.YES_NO_CANCEL_OPTION); //$NON-NLS-1$ //$NON-NLS-2$ - switch(result){ - case JOptionPane.YES_OPTION: - super.approveSelection(); - return; - case JOptionPane.NO_OPTION: - return; - case JOptionPane.CLOSED_OPTION: - return; - case JOptionPane.CANCEL_OPTION: - cancelSelection(); - return; - } - } - super.approveSelection(); - } + private DlgMode mode; - public static File[] getFileChooserResults(final DataFormat dataFormat, boolean isSaveDlg, boolean multipleSelect, String preselectedName, LocalPropertiesService localPropertiesService, JFrame frame) { - return getFileChooserResults(dataFormat, isSaveDlg, multipleSelect, preselectedName, localPropertiesService, frame, null); - } + private JFileChooser getFixedFileChooser() { + return new JFileChooser() { + private static final long serialVersionUID = 1541813407103968847L; - public static File[] getFileChooserResults(final DataFormat dataFormat, boolean isSaveDlg, boolean multipleSelect, String preselectedName, LocalPropertiesService localPropertiesService, JFrame frame, File preSelectedFolder) { + @Override + public void updateUI() { + putClientProperty("FileChooser.useShellFolder", Boolean.FALSE); + super.updateUI(); + } + }; + } - JFileChooser fc ; + public JFilePicker(String textFieldLabel, String originalPathValue, String buttonLabel, DlgMode mode) { - if( preSelectedFolder == null ){ - String lastUsedFolder = localPropertiesService.getValue( EarthProperty.LAST_USED_FOLDER ); - if( !StringUtils.isBlank( lastUsedFolder ) ){ - preSelectedFolder = new File( lastUsedFolder ); - if( !preSelectedFolder.exists()){ - preSelectedFolder = null; + fileChooser = getFixedFileChooser(); + setBorder( new BevelBorder( BevelBorder.RAISED )); + this.mode = mode; + if (originalPathValue != null && originalPathValue.length() > 0) { + try { + File originalFile = new File(originalPathValue); + if( originalFile.exists() ){ + fileChooser.setCurrentDirectory(originalFile.getParentFile()); } + } catch (Exception e) { + logger.error("Unable to find parent folder for " + originalPathValue, e); //$NON-NLS-1$ } } - fc = new JFileChooserExistsAware( preSelectedFolder ); - if( preselectedName != null ){ - File selectedFile = new File( fc.getCurrentDirectory().getAbsolutePath() + File.separatorChar + preselectedName ); - fc.setSelectedFile( selectedFile ); + // creates the GUI + label = new JLabel(textFieldLabel); + setTextField(new JTextField(originalPathValue, 20)); + button = new JButton(buttonLabel); + + if (originalPathValue != null && originalPathValue.length() > 0) { + getTextField().setCaretPosition(originalPathValue.length() - 1); } - fc.setMultiSelectionEnabled( multipleSelect ); + button.addActionListener( this::buttonActionPerformed ); - File[] selectedFiles = null; - FileFilter addedFilter = getFileFilter(dataFormat); - fc.addChoosableFileFilter(addedFilter); - fc.setAcceptAllFileFilterUsed(true); - // Set the added file filter as the default chose filter - fc.setFileFilter(addedFilter); + setLayout(new GridBagLayout()); - // Handle open button action. - int returnVal ; - if( isSaveDlg ){ - returnVal = fc.showSaveDialog( frame ); - }else{ - returnVal = fc.showOpenDialog( frame); - } + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.WEST; + constraints.insets = new Insets(2, 2, 2, 2); + constraints.fill = GridBagConstraints.BOTH; - if ( returnVal == JFileChooser.APPROVE_OPTION) { + add(label, constraints); - if( multipleSelect ){ - selectedFiles = fc.getSelectedFiles(); - }else{ - selectedFiles = new File[]{fc.getSelectedFile()}; - } - - if( selectedFiles != null && selectedFiles.length > 0 ) { - if( isSaveDlg ){ - String fileName = selectedFiles[0].getAbsolutePath(); - - String fileExtension = null; - - if( fileName.lastIndexOf('.') != -1){ - fileExtension = fileName.substring( fileName.lastIndexOf('.') + 1 ).toLowerCase(); - } - - // If the chose file has no extension or the extension is not one of the default extensions for the dataformat - if ( fileExtension == null || Arrays.binarySearch( dataFormat.getPossibleFileExtensions(), fileExtension ) < 0 ) { //$NON-NLS-1$ - fileName += "." + dataFormat.getDefaultExtension(); //$NON-NLS-1$ - selectedFiles[0] = new File(fileName); - } - } - - localPropertiesService.setValue(EarthProperty.LAST_USED_FOLDER, selectedFiles[0].getParent()); - } + constraints.gridy = 1; + constraints.weightx =1; + add(getTextField(), constraints); + constraints.gridx = 1; + constraints.weightx = 0; + add(button, constraints); + + } + public void addChangeListener(DocumentListener listener) { + getTextField().getDocument().addDocumentListener(listener); + } + public void addFileTypeFilter(String extension, String description, boolean setSelected) { + FileTypeFilter filter = new FileTypeFilter(extension, description); + fileChooser.addChoosableFileFilter(filter); + if (setSelected) { + fileChooser.setFileFilter(filter); } - return selectedFiles; } - private static FileFilter getFileFilter(final DataFormat dataFormat) { - return new FileFilter() { + private void buttonActionPerformed(ActionEvent evt) { + if ( + ( mode == DlgMode.MODE_OPEN || mode == DlgMode.MODE_SAVE) && + fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION && + fileChooser.getSelectedFile() != null + ) { + getTextField().setText( fileChooser.getSelectedFile().getAbsolutePath() ); + } + } - @Override - public boolean accept(File f) { - - String[] extensions = dataFormat.getPossibleFileExtensions(); - boolean acceptedFile = false; - boolean isFolder = f.isDirectory(); - if( isFolder ){ - acceptedFile = true; - }else{ - - for (String fileExtension : extensions) { - if( f.getName().toLowerCase().endsWith("." + fileExtension ) ){ //$NON-NLS-1$ - acceptedFile = true; - break; - } - } - } + public JFileChooser getFileChooser() { + return this.fileChooser; + } - return acceptedFile; - } + public String getSelectedFilePath() { + return getTextField().getText(); + } - @Override - public String getDescription() { - return dataFormat.getDescription(); - } - }; + public void setFolderChooser() { + fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + } + + public JTextField getTextField() { + return textField; + } + + private void setTextField(JTextField textField) { + this.textField = textField; + } + + public void setTextBackground(Color bgColor) { + getTextField().setBackground(bgColor); + } + + @Override + public void setEnabled(boolean enabled) { + button.setEnabled(enabled); + textField.setEnabled(enabled); } -} +} \ No newline at end of file From 22e2365cdd89e11b52b2c8b5b705b3b14d898106 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:32 +0100 Subject: [PATCH 1260/1620] New translations JFilePicker.java (English) --- .../earth/app/view/Messages_en.properties | 233 +++++++++--------- 1 file changed, 115 insertions(+), 118 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 21d900b58d..31589044b8 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,155 +1,152 @@ package org.openforis.collect.earth.app.view; +import java.awt.Color; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.event.ActionEvent; import java.io.File; -import java.util.Arrays; +import javax.swing.JButton; import javax.swing.JFileChooser; -import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.swing.filechooser.FileFilter; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTextField; +import javax.swing.border.BevelBorder; +import javax.swing.event.DocumentListener; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -public class JFileChooserExistsAware extends JFileChooser { +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ +public class JFilePicker extends JPanel { - private static final long serialVersionUID = 2571562963995019882L; + public enum DlgMode{MODE_OPEN,MODE_SAVE } - private JFileChooserExistsAware(File lastFolder) { - super(lastFolder); - } + private static final long serialVersionUID = 9057893034177011651L; - private JFileChooserExistsAware(){ - super(); - } + private JLabel label; + private JTextField textField; + private JButton button; + private transient Logger logger = LoggerFactory.getLogger(this.getClass()); + private JFileChooser fileChooser; - @Override - public void approveSelection(){ - File f = getSelectedFile(); - if( f!=null && f.exists() && getDialogType() == SAVE_DIALOG){ - int result = JOptionPane.showConfirmDialog(this,"The file exists, overwrite?","Existing file",JOptionPane.YES_NO_CANCEL_OPTION); //$NON-NLS-1$ //$NON-NLS-2$ - switch(result){ - case JOptionPane.YES_OPTION: - super.approveSelection(); - return; - case JOptionPane.NO_OPTION: - return; - case JOptionPane.CLOSED_OPTION: - return; - case JOptionPane.CANCEL_OPTION: - cancelSelection(); - return; - } - } - super.approveSelection(); - } + private DlgMode mode; - public static File[] getFileChooserResults(final DataFormat dataFormat, boolean isSaveDlg, boolean multipleSelect, String preselectedName, LocalPropertiesService localPropertiesService, JFrame frame) { - return getFileChooserResults(dataFormat, isSaveDlg, multipleSelect, preselectedName, localPropertiesService, frame, null); - } + private JFileChooser getFixedFileChooser() { + return new JFileChooser() { + private static final long serialVersionUID = 1541813407103968847L; - public static File[] getFileChooserResults(final DataFormat dataFormat, boolean isSaveDlg, boolean multipleSelect, String preselectedName, LocalPropertiesService localPropertiesService, JFrame frame, File preSelectedFolder) { + @Override + public void updateUI() { + putClientProperty("FileChooser.useShellFolder", Boolean.FALSE); + super.updateUI(); + } + }; + } - JFileChooser fc ; + public JFilePicker(String textFieldLabel, String originalPathValue, String buttonLabel, DlgMode mode) { - if( preSelectedFolder == null ){ - String lastUsedFolder = localPropertiesService.getValue( EarthProperty.LAST_USED_FOLDER ); - if( !StringUtils.isBlank( lastUsedFolder ) ){ - preSelectedFolder = new File( lastUsedFolder ); - if( !preSelectedFolder.exists()){ - preSelectedFolder = null; + fileChooser = getFixedFileChooser(); + setBorder( new BevelBorder( BevelBorder.RAISED )); + this.mode = mode; + if (originalPathValue != null && originalPathValue.length() > 0) { + try { + File originalFile = new File(originalPathValue); + if( originalFile.exists() ){ + fileChooser.setCurrentDirectory(originalFile.getParentFile()); } + } catch (Exception e) { + logger.error("Unable to find parent folder for " + originalPathValue, e); //$NON-NLS-1$ } } - fc = new JFileChooserExistsAware( preSelectedFolder ); - if( preselectedName != null ){ - File selectedFile = new File( fc.getCurrentDirectory().getAbsolutePath() + File.separatorChar + preselectedName ); - fc.setSelectedFile( selectedFile ); + // creates the GUI + label = new JLabel(textFieldLabel); + setTextField(new JTextField(originalPathValue, 20)); + button = new JButton(buttonLabel); + + if (originalPathValue != null && originalPathValue.length() > 0) { + getTextField().setCaretPosition(originalPathValue.length() - 1); } - fc.setMultiSelectionEnabled( multipleSelect ); + button.addActionListener( this::buttonActionPerformed ); - File[] selectedFiles = null; - FileFilter addedFilter = getFileFilter(dataFormat); - fc.addChoosableFileFilter(addedFilter); - fc.setAcceptAllFileFilterUsed(true); - // Set the added file filter as the default chose filter - fc.setFileFilter(addedFilter); + setLayout(new GridBagLayout()); - // Handle open button action. - int returnVal ; - if( isSaveDlg ){ - returnVal = fc.showSaveDialog( frame ); - }else{ - returnVal = fc.showOpenDialog( frame); - } + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.WEST; + constraints.insets = new Insets(2, 2, 2, 2); + constraints.fill = GridBagConstraints.BOTH; - if ( returnVal == JFileChooser.APPROVE_OPTION) { + add(label, constraints); - if( multipleSelect ){ - selectedFiles = fc.getSelectedFiles(); - }else{ - selectedFiles = new File[]{fc.getSelectedFile()}; - } - - if( selectedFiles != null && selectedFiles.length > 0 ) { - if( isSaveDlg ){ - String fileName = selectedFiles[0].getAbsolutePath(); - - String fileExtension = null; - - if( fileName.lastIndexOf('.') != -1){ - fileExtension = fileName.substring( fileName.lastIndexOf('.') + 1 ).toLowerCase(); - } - - // If the chose file has no extension or the extension is not one of the default extensions for the dataformat - if ( fileExtension == null || Arrays.binarySearch( dataFormat.getPossibleFileExtensions(), fileExtension ) < 0 ) { //$NON-NLS-1$ - fileName += "." + dataFormat.getDefaultExtension(); //$NON-NLS-1$ - selectedFiles[0] = new File(fileName); - } - } - - localPropertiesService.setValue(EarthProperty.LAST_USED_FOLDER, selectedFiles[0].getParent()); - } + constraints.gridy = 1; + constraints.weightx =1; + add(getTextField(), constraints); + constraints.gridx = 1; + constraints.weightx = 0; + add(button, constraints); + + } + public void addChangeListener(DocumentListener listener) { + getTextField().getDocument().addDocumentListener(listener); + } + public void addFileTypeFilter(String extension, String description, boolean setSelected) { + FileTypeFilter filter = new FileTypeFilter(extension, description); + fileChooser.addChoosableFileFilter(filter); + if (setSelected) { + fileChooser.setFileFilter(filter); } - return selectedFiles; } - private static FileFilter getFileFilter(final DataFormat dataFormat) { - return new FileFilter() { + private void buttonActionPerformed(ActionEvent evt) { + if ( + ( mode == DlgMode.MODE_OPEN || mode == DlgMode.MODE_SAVE) && + fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION && + fileChooser.getSelectedFile() != null + ) { + getTextField().setText( fileChooser.getSelectedFile().getAbsolutePath() ); + } + } - @Override - public boolean accept(File f) { - - String[] extensions = dataFormat.getPossibleFileExtensions(); - boolean acceptedFile = false; - boolean isFolder = f.isDirectory(); - if( isFolder ){ - acceptedFile = true; - }else{ - - for (String fileExtension : extensions) { - if( f.getName().toLowerCase().endsWith("." + fileExtension ) ){ //$NON-NLS-1$ - acceptedFile = true; - break; - } - } - } + public JFileChooser getFileChooser() { + return this.fileChooser; + } - return acceptedFile; - } + public String getSelectedFilePath() { + return getTextField().getText(); + } - @Override - public String getDescription() { - return dataFormat.getDescription(); - } - }; + public void setFolderChooser() { + fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + } + + public JTextField getTextField() { + return textField; + } + + private void setTextField(JTextField textField) { + this.textField = textField; + } + + public void setTextBackground(Color bgColor) { + getTextField().setBackground(bgColor); + } + + @Override + public void setEnabled(boolean enabled) { + button.setEnabled(enabled); + textField.setEnabled(enabled); } -} +} \ No newline at end of file From 000affefb97f97b041241fecb8024e0138fa748c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:33 +0100 Subject: [PATCH 1261/1620] New translations ProcessMonitorDialog.java (Spanish) --- .../earth/app/view/Messages_es.properties | 211 ++++++------------ 1 file changed, 74 insertions(+), 137 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 31589044b8..aee91325a9 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,152 +1,89 @@ package org.openforis.collect.earth.app.view; -import java.awt.Color; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.awt.event.ActionEvent; -import java.io.File; - -import javax.swing.JButton; -import javax.swing.JFileChooser; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JTextField; -import javax.swing.border.BevelBorder; -import javax.swing.event.DocumentListener; - +import java.awt.Toolkit; +import java.util.List; + +import javax.swing.JOptionPane; +import javax.swing.ProgressMonitor; +import javax.swing.SwingUtilities; + +import org.apache.commons.lang3.ArrayUtils; +import org.openforis.collect.io.data.CSVDataImportProcess; +import org.openforis.collect.io.metadata.parsing.ParsingError; +import org.openforis.collect.manager.process.AbstractProcess; +import org.openforis.collect.manager.process.ProcessStatus; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ -public class JFilePicker extends JPanel { - - public enum DlgMode{MODE_OPEN,MODE_SAVE } +public abstract class ProcessMonitorDialog extends Thread { - private static final long serialVersionUID = 9057893034177011651L; + private static final int MAX_ERRORS_SHOWN = 10; + ProgressMonitor progressMonitor; + Logger logger = LoggerFactory.getLogger(ProcessMonitorDialog.class); + AbstractProcess process; - private JLabel label; - private JTextField textField; - private JButton button; - private transient Logger logger = LoggerFactory.getLogger(this.getClass()); - private JFileChooser fileChooser; - private DlgMode mode; + protected abstract String getProcessActionMessage(); - private JFileChooser getFixedFileChooser() { - return new JFileChooser() { - private static final long serialVersionUID = 1541813407103968847L; + public synchronized void monitorProgress() { + new Thread("Monitoring progress of a process") { @Override - public void updateUI() { - putClientProperty("FileChooser.useShellFolder", Boolean.FALSE); - super.updateUI(); - } - }; - } - - public JFilePicker(String textFieldLabel, String originalPathValue, String buttonLabel, DlgMode mode) { - - fileChooser = getFixedFileChooser(); - setBorder( new BevelBorder( BevelBorder.RAISED )); - this.mode = mode; - if (originalPathValue != null && originalPathValue.length() > 0) { - try { - File originalFile = new File(originalPathValue); - if( originalFile.exists() ){ - fileChooser.setCurrentDirectory(originalFile.getParentFile()); + public void run() { + boolean keepRunning = true; + while (keepRunning) { + if (process.getStatus() != null) { + SwingUtilities.invokeLater( () -> { + progressMonitor.setProgress(process.getStatus().getProgressPercent()); + progressMonitor.setNote(getProcessActionMessage() + process.getStatus().getProcessed() + "/" //$NON-NLS-1$ //$NON-NLS-2$ + + process.getStatus().getTotal()); + }); + + if (progressMonitor.isCanceled() || process.getStatus().isComplete() || process.getStatus().isError() ) { + SwingUtilities.invokeLater( () -> { + progressMonitor.close(); + if( process.getStatus().isError() ){ + StringBuilder parsisngErrorMsg = new StringBuilder("\r\n"); //$NON-NLS-1$ + if( process instanceof CSVDataImportProcess ){ + List errors = ((CSVDataImportProcess) process ).getStatus().getErrors(); + + int numberOfErrors = 0; + for (ParsingError parsingError : errors) { + parsisngErrorMsg.append(Messages.getString("ProcessMonitorDialog.1")).append( parsingError.getRow() ).append(" - ").append( parsingError.getMessage() ).append(", ").append( parsingError.getErrorType() ).append(Messages.getString("ProcessMonitorDialog.4")).append( ArrayUtils.toString(parsingError.getColumns()) ).append(Messages.getString("ProcessMonitorDialog.5")).append( ArrayUtils.toString(parsingError.getMessageArgs()) ).append("\r\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ + numberOfErrors ++; + if( numberOfErrors > MAX_ERRORS_SHOWN ){ + break; + } + } + + if( errors.size() > MAX_ERRORS_SHOWN ){ + parsisngErrorMsg.append( "More lines not shown . Total warnings : " + errors.size() ); + } + + } + + String primaryErrorMsg = process.getStatus().getErrorMessage(); + JOptionPane.showMessageDialog(null, "Attention : " + ( primaryErrorMsg!=null?primaryErrorMsg:"") + parsisngErrorMsg.toString() ); //$NON-NLS-1$ //$NON-NLS-2$ + } + }); + Toolkit.getDefaultToolkit().beep(); + if ( !process.getStatus().isComplete() && !process.getStatus().isError() ) { + process.cancel(); + logger.warn("Task canceled.\n"); //$NON-NLS-1$ + } + keepRunning = false; + } + } + + try { + Thread.sleep( 1000 ); + } catch (InterruptedException e) { + logger.error("Error whille waiting in thread", e); //$NON-NLS-1$ + Thread.currentThread().interrupt(); + } } - } catch (Exception e) { - logger.error("Unable to find parent folder for " + originalPathValue, e); //$NON-NLS-1$ } - } - - - // creates the GUI - label = new JLabel(textFieldLabel); - setTextField(new JTextField(originalPathValue, 20)); - button = new JButton(buttonLabel); - - if (originalPathValue != null && originalPathValue.length() > 0) { - getTextField().setCaretPosition(originalPathValue.length() - 1); - } - - button.addActionListener( this::buttonActionPerformed ); - - - setLayout(new GridBagLayout()); - - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.WEST; - constraints.insets = new Insets(2, 2, 2, 2); - constraints.fill = GridBagConstraints.BOTH; - - add(label, constraints); - - constraints.gridy = 1; - constraints.weightx =1; - add(getTextField(), constraints); - constraints.gridx = 1; - constraints.weightx = 0; - add(button, constraints); - - } - - public void addChangeListener(DocumentListener listener) { - getTextField().getDocument().addDocumentListener(listener); - } - - public void addFileTypeFilter(String extension, String description, boolean setSelected) { - FileTypeFilter filter = new FileTypeFilter(extension, description); - fileChooser.addChoosableFileFilter(filter); - if (setSelected) { - fileChooser.setFileFilter(filter); - } - } - - private void buttonActionPerformed(ActionEvent evt) { - if ( - ( mode == DlgMode.MODE_OPEN || mode == DlgMode.MODE_SAVE) && - fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION && - fileChooser.getSelectedFile() != null - ) { - getTextField().setText( fileChooser.getSelectedFile().getAbsolutePath() ); - } - } - - public JFileChooser getFileChooser() { - return this.fileChooser; - } - - public String getSelectedFilePath() { - return getTextField().getText(); - } - - public void setFolderChooser() { - fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); - } - - public JTextField getTextField() { - return textField; - } - - private void setTextField(JTextField textField) { - this.textField = textField; - } - - public void setTextBackground(Color bgColor) { - getTextField().setBackground(bgColor); - } - - @Override - public void setEnabled(boolean enabled) { - button.setEnabled(enabled); - textField.setEnabled(enabled); + }.start(); } -} \ No newline at end of file +} From 7116c9e30a33d39ea3fa001866bc8184d840063d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:34 +0100 Subject: [PATCH 1262/1620] New translations ProcessMonitorDialog.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 211 ++++++------------ 1 file changed, 74 insertions(+), 137 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 31589044b8..aee91325a9 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,152 +1,89 @@ package org.openforis.collect.earth.app.view; -import java.awt.Color; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.awt.event.ActionEvent; -import java.io.File; - -import javax.swing.JButton; -import javax.swing.JFileChooser; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JTextField; -import javax.swing.border.BevelBorder; -import javax.swing.event.DocumentListener; - +import java.awt.Toolkit; +import java.util.List; + +import javax.swing.JOptionPane; +import javax.swing.ProgressMonitor; +import javax.swing.SwingUtilities; + +import org.apache.commons.lang3.ArrayUtils; +import org.openforis.collect.io.data.CSVDataImportProcess; +import org.openforis.collect.io.metadata.parsing.ParsingError; +import org.openforis.collect.manager.process.AbstractProcess; +import org.openforis.collect.manager.process.ProcessStatus; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ -public class JFilePicker extends JPanel { - - public enum DlgMode{MODE_OPEN,MODE_SAVE } +public abstract class ProcessMonitorDialog extends Thread { - private static final long serialVersionUID = 9057893034177011651L; + private static final int MAX_ERRORS_SHOWN = 10; + ProgressMonitor progressMonitor; + Logger logger = LoggerFactory.getLogger(ProcessMonitorDialog.class); + AbstractProcess process; - private JLabel label; - private JTextField textField; - private JButton button; - private transient Logger logger = LoggerFactory.getLogger(this.getClass()); - private JFileChooser fileChooser; - private DlgMode mode; + protected abstract String getProcessActionMessage(); - private JFileChooser getFixedFileChooser() { - return new JFileChooser() { - private static final long serialVersionUID = 1541813407103968847L; + public synchronized void monitorProgress() { + new Thread("Monitoring progress of a process") { @Override - public void updateUI() { - putClientProperty("FileChooser.useShellFolder", Boolean.FALSE); - super.updateUI(); - } - }; - } - - public JFilePicker(String textFieldLabel, String originalPathValue, String buttonLabel, DlgMode mode) { - - fileChooser = getFixedFileChooser(); - setBorder( new BevelBorder( BevelBorder.RAISED )); - this.mode = mode; - if (originalPathValue != null && originalPathValue.length() > 0) { - try { - File originalFile = new File(originalPathValue); - if( originalFile.exists() ){ - fileChooser.setCurrentDirectory(originalFile.getParentFile()); + public void run() { + boolean keepRunning = true; + while (keepRunning) { + if (process.getStatus() != null) { + SwingUtilities.invokeLater( () -> { + progressMonitor.setProgress(process.getStatus().getProgressPercent()); + progressMonitor.setNote(getProcessActionMessage() + process.getStatus().getProcessed() + "/" //$NON-NLS-1$ //$NON-NLS-2$ + + process.getStatus().getTotal()); + }); + + if (progressMonitor.isCanceled() || process.getStatus().isComplete() || process.getStatus().isError() ) { + SwingUtilities.invokeLater( () -> { + progressMonitor.close(); + if( process.getStatus().isError() ){ + StringBuilder parsisngErrorMsg = new StringBuilder("\r\n"); //$NON-NLS-1$ + if( process instanceof CSVDataImportProcess ){ + List errors = ((CSVDataImportProcess) process ).getStatus().getErrors(); + + int numberOfErrors = 0; + for (ParsingError parsingError : errors) { + parsisngErrorMsg.append(Messages.getString("ProcessMonitorDialog.1")).append( parsingError.getRow() ).append(" - ").append( parsingError.getMessage() ).append(", ").append( parsingError.getErrorType() ).append(Messages.getString("ProcessMonitorDialog.4")).append( ArrayUtils.toString(parsingError.getColumns()) ).append(Messages.getString("ProcessMonitorDialog.5")).append( ArrayUtils.toString(parsingError.getMessageArgs()) ).append("\r\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ + numberOfErrors ++; + if( numberOfErrors > MAX_ERRORS_SHOWN ){ + break; + } + } + + if( errors.size() > MAX_ERRORS_SHOWN ){ + parsisngErrorMsg.append( "More lines not shown . Total warnings : " + errors.size() ); + } + + } + + String primaryErrorMsg = process.getStatus().getErrorMessage(); + JOptionPane.showMessageDialog(null, "Attention : " + ( primaryErrorMsg!=null?primaryErrorMsg:"") + parsisngErrorMsg.toString() ); //$NON-NLS-1$ //$NON-NLS-2$ + } + }); + Toolkit.getDefaultToolkit().beep(); + if ( !process.getStatus().isComplete() && !process.getStatus().isError() ) { + process.cancel(); + logger.warn("Task canceled.\n"); //$NON-NLS-1$ + } + keepRunning = false; + } + } + + try { + Thread.sleep( 1000 ); + } catch (InterruptedException e) { + logger.error("Error whille waiting in thread", e); //$NON-NLS-1$ + Thread.currentThread().interrupt(); + } } - } catch (Exception e) { - logger.error("Unable to find parent folder for " + originalPathValue, e); //$NON-NLS-1$ } - } - - - // creates the GUI - label = new JLabel(textFieldLabel); - setTextField(new JTextField(originalPathValue, 20)); - button = new JButton(buttonLabel); - - if (originalPathValue != null && originalPathValue.length() > 0) { - getTextField().setCaretPosition(originalPathValue.length() - 1); - } - - button.addActionListener( this::buttonActionPerformed ); - - - setLayout(new GridBagLayout()); - - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.WEST; - constraints.insets = new Insets(2, 2, 2, 2); - constraints.fill = GridBagConstraints.BOTH; - - add(label, constraints); - - constraints.gridy = 1; - constraints.weightx =1; - add(getTextField(), constraints); - constraints.gridx = 1; - constraints.weightx = 0; - add(button, constraints); - - } - - public void addChangeListener(DocumentListener listener) { - getTextField().getDocument().addDocumentListener(listener); - } - - public void addFileTypeFilter(String extension, String description, boolean setSelected) { - FileTypeFilter filter = new FileTypeFilter(extension, description); - fileChooser.addChoosableFileFilter(filter); - if (setSelected) { - fileChooser.setFileFilter(filter); - } - } - - private void buttonActionPerformed(ActionEvent evt) { - if ( - ( mode == DlgMode.MODE_OPEN || mode == DlgMode.MODE_SAVE) && - fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION && - fileChooser.getSelectedFile() != null - ) { - getTextField().setText( fileChooser.getSelectedFile().getAbsolutePath() ); - } - } - - public JFileChooser getFileChooser() { - return this.fileChooser; - } - - public String getSelectedFilePath() { - return getTextField().getText(); - } - - public void setFolderChooser() { - fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); - } - - public JTextField getTextField() { - return textField; - } - - private void setTextField(JTextField textField) { - this.textField = textField; - } - - public void setTextBackground(Color bgColor) { - getTextField().setBackground(bgColor); - } - - @Override - public void setEnabled(boolean enabled) { - button.setEnabled(enabled); - textField.setEnabled(enabled); + }.start(); } -} \ No newline at end of file +} From 7687975d131c41474864cb9c2b6eec56f626da5a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:35 +0100 Subject: [PATCH 1263/1620] New translations CroplandSubdivision.java (English) --- .../earth/app/view/Messages_en.properties | 172 ++---------------- 1 file changed, 20 insertions(+), 152 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 31589044b8..fb27fb933b 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,152 +1,20 @@ -package org.openforis.collect.earth.app.view; - -import java.awt.Color; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.awt.event.ActionEvent; -import java.io.File; - -import javax.swing.JButton; -import javax.swing.JFileChooser; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JTextField; -import javax.swing.border.BevelBorder; -import javax.swing.event.DocumentListener; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ -public class JFilePicker extends JPanel { - - public enum DlgMode{MODE_OPEN,MODE_SAVE } - - private static final long serialVersionUID = 9057893034177011651L; - - private JLabel label; - private JTextField textField; - private JButton button; - private transient Logger logger = LoggerFactory.getLogger(this.getClass()); - private JFileChooser fileChooser; - - private DlgMode mode; - - private JFileChooser getFixedFileChooser() { - return new JFileChooser() { - private static final long serialVersionUID = 1541813407103968847L; - - @Override - public void updateUI() { - putClientProperty("FileChooser.useShellFolder", Boolean.FALSE); - super.updateUI(); - } - }; - } - - public JFilePicker(String textFieldLabel, String originalPathValue, String buttonLabel, DlgMode mode) { - - fileChooser = getFixedFileChooser(); - setBorder( new BevelBorder( BevelBorder.RAISED )); - this.mode = mode; - if (originalPathValue != null && originalPathValue.length() > 0) { - try { - File originalFile = new File(originalPathValue); - if( originalFile.exists() ){ - fileChooser.setCurrentDirectory(originalFile.getParentFile()); - } - } catch (Exception e) { - logger.error("Unable to find parent folder for " + originalPathValue, e); //$NON-NLS-1$ - } - } - - - // creates the GUI - label = new JLabel(textFieldLabel); - setTextField(new JTextField(originalPathValue, 20)); - button = new JButton(buttonLabel); - - if (originalPathValue != null && originalPathValue.length() > 0) { - getTextField().setCaretPosition(originalPathValue.length() - 1); - } - - button.addActionListener( this::buttonActionPerformed ); - - - setLayout(new GridBagLayout()); - - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.WEST; - constraints.insets = new Insets(2, 2, 2, 2); - constraints.fill = GridBagConstraints.BOTH; - - add(label, constraints); - - constraints.gridy = 1; - constraints.weightx =1; - add(getTextField(), constraints); - constraints.gridx = 1; - constraints.weightx = 0; - add(button, constraints); - - } - - public void addChangeListener(DocumentListener listener) { - getTextField().getDocument().addDocumentListener(listener); - } - - public void addFileTypeFilter(String extension, String description, boolean setSelected) { - FileTypeFilter filter = new FileTypeFilter(extension, description); - fileChooser.addChoosableFileFilter(filter); - if (setSelected) { - fileChooser.setFileFilter(filter); - } - } - - private void buttonActionPerformed(ActionEvent evt) { - if ( - ( mode == DlgMode.MODE_OPEN || mode == DlgMode.MODE_SAVE) && - fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION && - fileChooser.getSelectedFile() != null - ) { - getTextField().setText( fileChooser.getSelectedFile().getAbsolutePath() ); - } - } - - public JFileChooser getFileChooser() { - return this.fileChooser; - } - - public String getSelectedFilePath() { - return getTextField().getText(); - } - - public void setFolderChooser() { - fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); - } - - public JTextField getTextField() { - return textField; - } - - private void setTextField(JTextField textField) { - this.textField = textField; - } - - public void setTextBackground(Color bgColor) { - getTextField().setBackground(bgColor); - } - - @Override - public void setEnabled(boolean enabled) { - button.setEnabled(enabled); - textField.setEnabled(enabled); - } - -} \ No newline at end of file +package org.openforis.collect.earth.ipcc.model; + +public class CroplandSubdivision extends LandUseSubdivision{ + + protected CroplandType type; + + public CroplandSubdivision( String code, String name, CroplandType type) { + super(LandUseCategory.C, code, name); + setType(type); + } + + public CroplandType getType() { + return type; + } + + public void setType(CroplandType type) { + this.type = type; + }; + +} From b7085aab1278d94b7580f24f80eb4ff8853d8714 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:37 +0100 Subject: [PATCH 1264/1620] New translations LandUseSubdivisionUtils.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 189 +++++++++--------- 1 file changed, 100 insertions(+), 89 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index aee91325a9..572652125f 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,89 +1,100 @@ -package org.openforis.collect.earth.app.view; - -import java.awt.Toolkit; -import java.util.List; - -import javax.swing.JOptionPane; -import javax.swing.ProgressMonitor; -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.ArrayUtils; -import org.openforis.collect.io.data.CSVDataImportProcess; -import org.openforis.collect.io.metadata.parsing.ParsingError; -import org.openforis.collect.manager.process.AbstractProcess; -import org.openforis.collect.manager.process.ProcessStatus; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public abstract class ProcessMonitorDialog extends Thread { - - private static final int MAX_ERRORS_SHOWN = 10; - ProgressMonitor progressMonitor; - Logger logger = LoggerFactory.getLogger(ProcessMonitorDialog.class); - AbstractProcess process; - - - protected abstract String getProcessActionMessage(); - - public synchronized void monitorProgress() { - - new Thread("Monitoring progress of a process") { - @Override - public void run() { - boolean keepRunning = true; - while (keepRunning) { - if (process.getStatus() != null) { - SwingUtilities.invokeLater( () -> { - progressMonitor.setProgress(process.getStatus().getProgressPercent()); - progressMonitor.setNote(getProcessActionMessage() + process.getStatus().getProcessed() + "/" //$NON-NLS-1$ //$NON-NLS-2$ - + process.getStatus().getTotal()); - }); - - if (progressMonitor.isCanceled() || process.getStatus().isComplete() || process.getStatus().isError() ) { - SwingUtilities.invokeLater( () -> { - progressMonitor.close(); - if( process.getStatus().isError() ){ - StringBuilder parsisngErrorMsg = new StringBuilder("\r\n"); //$NON-NLS-1$ - if( process instanceof CSVDataImportProcess ){ - List errors = ((CSVDataImportProcess) process ).getStatus().getErrors(); - - int numberOfErrors = 0; - for (ParsingError parsingError : errors) { - parsisngErrorMsg.append(Messages.getString("ProcessMonitorDialog.1")).append( parsingError.getRow() ).append(" - ").append( parsingError.getMessage() ).append(", ").append( parsingError.getErrorType() ).append(Messages.getString("ProcessMonitorDialog.4")).append( ArrayUtils.toString(parsingError.getColumns()) ).append(Messages.getString("ProcessMonitorDialog.5")).append( ArrayUtils.toString(parsingError.getMessageArgs()) ).append("\r\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ - numberOfErrors ++; - if( numberOfErrors > MAX_ERRORS_SHOWN ){ - break; - } - } - - if( errors.size() > MAX_ERRORS_SHOWN ){ - parsisngErrorMsg.append( "More lines not shown . Total warnings : " + errors.size() ); - } - - } - - String primaryErrorMsg = process.getStatus().getErrorMessage(); - JOptionPane.showMessageDialog(null, "Attention : " + ( primaryErrorMsg!=null?primaryErrorMsg:"") + parsisngErrorMsg.toString() ); //$NON-NLS-1$ //$NON-NLS-2$ - } - }); - Toolkit.getDefaultToolkit().beep(); - if ( !process.getStatus().isComplete() && !process.getStatus().isError() ) { - process.cancel(); - logger.warn("Task canceled.\n"); //$NON-NLS-1$ - } - keepRunning = false; - } - } - - try { - Thread.sleep( 1000 ); - } catch (InterruptedException e) { - logger.error("Error whille waiting in thread", e); //$NON-NLS-1$ - Thread.currentThread().interrupt(); - } - } - } - }.start(); - } - -} +package org.openforis.collect.earth.ipcc.controller; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; +import org.openforis.collect.earth.ipcc.model.ForestSubdivision; +import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; +import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; +import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; +import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.thoughtworks.xstream.XStream; + + +public class LandUseSubdivisionUtils { + + private static Logger logger = LoggerFactory.getLogger( LandUseSubdivisionUtils.class ); + + static List landUseSubdivisions; + + public static List> getSubdivisionsByCategory(LandUseCategory category) { + List> subdivisionsInCategory = new ArrayList>(); + for (LandUseSubdivision landUseSubdivision : landUseSubdivisions) { + if( landUseSubdivision.getCategory().equals( category ) ) { + subdivisionsInCategory.add(landUseSubdivision); + } + } + + return subdivisionsInCategory; + } + + public static void setSubdivisionType(LandUseSubdivision subdivision, Object type) { + landUseSubdivisions.get( landUseSubdivisions.indexOf(subdivision)).setType( type); + } + + public static List getLandUseSubdivisions() { + return landUseSubdivisions; + } + + public static void setLandUseSubdivisions(List landUseSubdivisions) { + LandUseSubdivisionUtils.landUseSubdivisions = landUseSubdivisions; + } + + public static LandUseSubdivision getSubdivision( String luCategoryCode, String luSubdivisionCode ) { + + LandUseCategory[] luCategories = LandUseCategory.values(); + LandUseCategory landUseCategory = null; + for (LandUseCategory luCat : luCategories) { + if( luCat.getCode().equals(luCategoryCode)) { + landUseCategory = luCat; + } + } + + for (LandUseSubdivision landUseSubdiv : landUseSubdivisions) { + if( landUseSubdiv.getCategory().equals(landUseCategory) && landUseSubdiv.getCode().equals( luSubdivisionCode ) ) { + return landUseSubdiv; + } + + } + + logger.info("No LU Subdivision found for category : " + luCategoryCode + " / subdivision code : " + luSubdivisionCode ); + return null; + } + + public static File getSubdivisionsXML() throws IOException { + XStream xStream = new XStream(); + + final String subdivisionLabel = "Subdivision"; + + xStream.alias(subdivisionLabel, ForestSubdivision.class); + xStream.alias(subdivisionLabel, CroplandSubdivision.class); + xStream.alias(subdivisionLabel, SettlementSubdivision.class); + xStream.alias(subdivisionLabel, OtherlandSubdivision.class); + xStream.alias(subdivisionLabel, GrasslandSubdivision.class); + xStream.alias(subdivisionLabel, WetlandSubdivision.class); + + xStream.setMode(XStream.NO_REFERENCES); + String xmlSchema = xStream.toXML(getLandUseSubdivisions()); + + File xmlFileDestination = File.createTempFile( "subdivisionsInSurvey", ".xml" ); + xmlFileDestination.deleteOnExit(); + try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { + byte[] strToBytes = xmlSchema.getBytes(); + outputStream.write(strToBytes); + } catch (Exception e) { + logger.error("Error saving data to file", e); + } + + return xmlFileDestination; + } + +} From 15a64c8505a625e05f8a1841074c2c257c491817 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:38 +0100 Subject: [PATCH 1265/1620] New translations LandUseSubdivisionUtils.java (English) --- .../earth/app/view/Messages_en.properties | 102 ++++++++++++++++-- 1 file changed, 91 insertions(+), 11 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index fb27fb933b..572652125f 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,20 +1,100 @@ -package org.openforis.collect.earth.ipcc.model; +package org.openforis.collect.earth.ipcc.controller; -public class CroplandSubdivision extends LandUseSubdivision{ +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; +import org.openforis.collect.earth.ipcc.model.ForestSubdivision; +import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; +import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; +import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; +import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.thoughtworks.xstream.XStream; + + +public class LandUseSubdivisionUtils { + + private static Logger logger = LoggerFactory.getLogger( LandUseSubdivisionUtils.class ); - protected CroplandType type; + static List landUseSubdivisions; + + public static List> getSubdivisionsByCategory(LandUseCategory category) { + List> subdivisionsInCategory = new ArrayList>(); + for (LandUseSubdivision landUseSubdivision : landUseSubdivisions) { + if( landUseSubdivision.getCategory().equals( category ) ) { + subdivisionsInCategory.add(landUseSubdivision); + } + } + + return subdivisionsInCategory; + } - public CroplandSubdivision( String code, String name, CroplandType type) { - super(LandUseCategory.C, code, name); - setType(type); + public static void setSubdivisionType(LandUseSubdivision subdivision, Object type) { + landUseSubdivisions.get( landUseSubdivisions.indexOf(subdivision)).setType( type); } - public CroplandType getType() { - return type; + public static List getLandUseSubdivisions() { + return landUseSubdivisions; } - public void setType(CroplandType type) { - this.type = type; - }; + public static void setLandUseSubdivisions(List landUseSubdivisions) { + LandUseSubdivisionUtils.landUseSubdivisions = landUseSubdivisions; + } + + public static LandUseSubdivision getSubdivision( String luCategoryCode, String luSubdivisionCode ) { + + LandUseCategory[] luCategories = LandUseCategory.values(); + LandUseCategory landUseCategory = null; + for (LandUseCategory luCat : luCategories) { + if( luCat.getCode().equals(luCategoryCode)) { + landUseCategory = luCat; + } + } + + for (LandUseSubdivision landUseSubdiv : landUseSubdivisions) { + if( landUseSubdiv.getCategory().equals(landUseCategory) && landUseSubdiv.getCode().equals( luSubdivisionCode ) ) { + return landUseSubdiv; + } + + } + + logger.info("No LU Subdivision found for category : " + luCategoryCode + " / subdivision code : " + luSubdivisionCode ); + return null; + } + public static File getSubdivisionsXML() throws IOException { + XStream xStream = new XStream(); + + final String subdivisionLabel = "Subdivision"; + + xStream.alias(subdivisionLabel, ForestSubdivision.class); + xStream.alias(subdivisionLabel, CroplandSubdivision.class); + xStream.alias(subdivisionLabel, SettlementSubdivision.class); + xStream.alias(subdivisionLabel, OtherlandSubdivision.class); + xStream.alias(subdivisionLabel, GrasslandSubdivision.class); + xStream.alias(subdivisionLabel, WetlandSubdivision.class); + + xStream.setMode(XStream.NO_REFERENCES); + String xmlSchema = xStream.toXML(getLandUseSubdivisions()); + + File xmlFileDestination = File.createTempFile( "subdivisionsInSurvey", ".xml" ); + xmlFileDestination.deleteOnExit(); + try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { + byte[] strToBytes = xmlSchema.getBytes(); + outputStream.write(strToBytes); + } catch (Exception e) { + logger.error("Error saving data to file", e); + } + + return xmlFileDestination; + } + } From 435b4f42d2a4b9ef92792b605ba7dd3ff0718aa1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:39 +0100 Subject: [PATCH 1266/1620] New translations StratumUtils.java (French) --- .../earth/app/view/Messages_fr.properties | 219 ++++++------------ 1 file changed, 67 insertions(+), 152 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 31589044b8..1baa564fe0 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,152 +1,67 @@ -package org.openforis.collect.earth.app.view; - -import java.awt.Color; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.awt.event.ActionEvent; -import java.io.File; - -import javax.swing.JButton; -import javax.swing.JFileChooser; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JTextField; -import javax.swing.border.BevelBorder; -import javax.swing.event.DocumentListener; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ -public class JFilePicker extends JPanel { - - public enum DlgMode{MODE_OPEN,MODE_SAVE } - - private static final long serialVersionUID = 9057893034177011651L; - - private JLabel label; - private JTextField textField; - private JButton button; - private transient Logger logger = LoggerFactory.getLogger(this.getClass()); - private JFileChooser fileChooser; - - private DlgMode mode; - - private JFileChooser getFixedFileChooser() { - return new JFileChooser() { - private static final long serialVersionUID = 1541813407103968847L; - - @Override - public void updateUI() { - putClientProperty("FileChooser.useShellFolder", Boolean.FALSE); - super.updateUI(); - } - }; - } - - public JFilePicker(String textFieldLabel, String originalPathValue, String buttonLabel, DlgMode mode) { - - fileChooser = getFixedFileChooser(); - setBorder( new BevelBorder( BevelBorder.RAISED )); - this.mode = mode; - if (originalPathValue != null && originalPathValue.length() > 0) { - try { - File originalFile = new File(originalPathValue); - if( originalFile.exists() ){ - fileChooser.setCurrentDirectory(originalFile.getParentFile()); - } - } catch (Exception e) { - logger.error("Unable to find parent folder for " + originalPathValue, e); //$NON-NLS-1$ - } - } - - - // creates the GUI - label = new JLabel(textFieldLabel); - setTextField(new JTextField(originalPathValue, 20)); - button = new JButton(buttonLabel); - - if (originalPathValue != null && originalPathValue.length() > 0) { - getTextField().setCaretPosition(originalPathValue.length() - 1); - } - - button.addActionListener( this::buttonActionPerformed ); - - - setLayout(new GridBagLayout()); - - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.WEST; - constraints.insets = new Insets(2, 2, 2, 2); - constraints.fill = GridBagConstraints.BOTH; - - add(label, constraints); - - constraints.gridy = 1; - constraints.weightx =1; - add(getTextField(), constraints); - constraints.gridx = 1; - constraints.weightx = 0; - add(button, constraints); - - } - - public void addChangeListener(DocumentListener listener) { - getTextField().getDocument().addDocumentListener(listener); - } - - public void addFileTypeFilter(String extension, String description, boolean setSelected) { - FileTypeFilter filter = new FileTypeFilter(extension, description); - fileChooser.addChoosableFileFilter(filter); - if (setSelected) { - fileChooser.setFileFilter(filter); - } - } - - private void buttonActionPerformed(ActionEvent evt) { - if ( - ( mode == DlgMode.MODE_OPEN || mode == DlgMode.MODE_SAVE) && - fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION && - fileChooser.getSelectedFile() != null - ) { - getTextField().setText( fileChooser.getSelectedFile().getAbsolutePath() ); - } - } - - public JFileChooser getFileChooser() { - return this.fileChooser; - } - - public String getSelectedFilePath() { - return getTextField().getText(); - } - - public void setFolderChooser() { - fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); - } - - public JTextField getTextField() { - return textField; - } - - private void setTextField(JTextField textField) { - this.textField = textField; - } - - public void setTextBackground(Color bgColor) { - getTextField().setBackground(bgColor); - } - - @Override - public void setEnabled(boolean enabled) { - button.setEnabled(enabled); - textField.setEnabled(enabled); - } - -} \ No newline at end of file +package org.openforis.collect.earth.ipcc.controller; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.openforis.collect.earth.ipcc.model.StratumObject; +import org.openforis.idm.metamodel.CodeListItem; +import org.openforis.idm.metamodel.Survey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.thoughtworks.xstream.XStream; + +public class StratumUtils { + + public static final String CODE_LIST_CLIMATE = "climate_zones"; + public static final String CODE_LIST_SOIL = "soil_types"; + public static final String CODE_LIST_GEZ = "ecological_zones"; + + private static Logger logger = LoggerFactory.getLogger( StratumUtils.class ); + + + private static List getCodeList(Survey survey, String codeList ) { + List items = survey.getCodeList( codeList ).getItems(); + List itemsInfo = new ArrayList(); + for (CodeListItem item : items) { + itemsInfo.add( new StratumObject(item.getCode(), item.getLabel(), item.getDescription() ) ); + } + return itemsInfo; + } + + public static File getClimateZonesXML( Survey survey ) throws IOException { + return getStratumXML(survey, CODE_LIST_CLIMATE, "climate"); + } + + public static File getEcologicalZonesXML(Survey survey) throws IOException { + return getStratumXML(survey, CODE_LIST_GEZ, "gez"); + } + + public static File getSoilTypesXML(Survey survey) throws IOException { + return getStratumXML(survey, CODE_LIST_SOIL, "soil"); + } + + private static File getStratumXML( Survey survey, String codeList, String nameForXml ) throws IOException { + XStream xStream = new XStream(); + + xStream.alias(nameForXml, StratumObject.class); + + xStream.setMode(XStream.NO_REFERENCES); + String xmlSchema = xStream.toXML( getCodeList(survey, codeList)); + + File xmlFileDestination = File.createTempFile( "codeListInSurvey", ".xml" ); + xmlFileDestination.deleteOnExit(); + try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { + byte[] strToBytes = xmlSchema.getBytes(); + outputStream.write(strToBytes); + } catch (Exception e) { + logger.error("Error saving data to file", e); + } + + return xmlFileDestination; + } + +} From 1d179f1a5225e53b08f8444063c568bc9a97316e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:40 +0100 Subject: [PATCH 1267/1620] New translations StratumUtils.java (Spanish) --- .../earth/app/view/Messages_es.properties | 156 ++++++++---------- 1 file changed, 67 insertions(+), 89 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index aee91325a9..1baa564fe0 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,89 +1,67 @@ -package org.openforis.collect.earth.app.view; - -import java.awt.Toolkit; -import java.util.List; - -import javax.swing.JOptionPane; -import javax.swing.ProgressMonitor; -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.ArrayUtils; -import org.openforis.collect.io.data.CSVDataImportProcess; -import org.openforis.collect.io.metadata.parsing.ParsingError; -import org.openforis.collect.manager.process.AbstractProcess; -import org.openforis.collect.manager.process.ProcessStatus; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public abstract class ProcessMonitorDialog extends Thread { - - private static final int MAX_ERRORS_SHOWN = 10; - ProgressMonitor progressMonitor; - Logger logger = LoggerFactory.getLogger(ProcessMonitorDialog.class); - AbstractProcess process; - - - protected abstract String getProcessActionMessage(); - - public synchronized void monitorProgress() { - - new Thread("Monitoring progress of a process") { - @Override - public void run() { - boolean keepRunning = true; - while (keepRunning) { - if (process.getStatus() != null) { - SwingUtilities.invokeLater( () -> { - progressMonitor.setProgress(process.getStatus().getProgressPercent()); - progressMonitor.setNote(getProcessActionMessage() + process.getStatus().getProcessed() + "/" //$NON-NLS-1$ //$NON-NLS-2$ - + process.getStatus().getTotal()); - }); - - if (progressMonitor.isCanceled() || process.getStatus().isComplete() || process.getStatus().isError() ) { - SwingUtilities.invokeLater( () -> { - progressMonitor.close(); - if( process.getStatus().isError() ){ - StringBuilder parsisngErrorMsg = new StringBuilder("\r\n"); //$NON-NLS-1$ - if( process instanceof CSVDataImportProcess ){ - List errors = ((CSVDataImportProcess) process ).getStatus().getErrors(); - - int numberOfErrors = 0; - for (ParsingError parsingError : errors) { - parsisngErrorMsg.append(Messages.getString("ProcessMonitorDialog.1")).append( parsingError.getRow() ).append(" - ").append( parsingError.getMessage() ).append(", ").append( parsingError.getErrorType() ).append(Messages.getString("ProcessMonitorDialog.4")).append( ArrayUtils.toString(parsingError.getColumns()) ).append(Messages.getString("ProcessMonitorDialog.5")).append( ArrayUtils.toString(parsingError.getMessageArgs()) ).append("\r\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ - numberOfErrors ++; - if( numberOfErrors > MAX_ERRORS_SHOWN ){ - break; - } - } - - if( errors.size() > MAX_ERRORS_SHOWN ){ - parsisngErrorMsg.append( "More lines not shown . Total warnings : " + errors.size() ); - } - - } - - String primaryErrorMsg = process.getStatus().getErrorMessage(); - JOptionPane.showMessageDialog(null, "Attention : " + ( primaryErrorMsg!=null?primaryErrorMsg:"") + parsisngErrorMsg.toString() ); //$NON-NLS-1$ //$NON-NLS-2$ - } - }); - Toolkit.getDefaultToolkit().beep(); - if ( !process.getStatus().isComplete() && !process.getStatus().isError() ) { - process.cancel(); - logger.warn("Task canceled.\n"); //$NON-NLS-1$ - } - keepRunning = false; - } - } - - try { - Thread.sleep( 1000 ); - } catch (InterruptedException e) { - logger.error("Error whille waiting in thread", e); //$NON-NLS-1$ - Thread.currentThread().interrupt(); - } - } - } - }.start(); - } - -} +package org.openforis.collect.earth.ipcc.controller; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.openforis.collect.earth.ipcc.model.StratumObject; +import org.openforis.idm.metamodel.CodeListItem; +import org.openforis.idm.metamodel.Survey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.thoughtworks.xstream.XStream; + +public class StratumUtils { + + public static final String CODE_LIST_CLIMATE = "climate_zones"; + public static final String CODE_LIST_SOIL = "soil_types"; + public static final String CODE_LIST_GEZ = "ecological_zones"; + + private static Logger logger = LoggerFactory.getLogger( StratumUtils.class ); + + + private static List getCodeList(Survey survey, String codeList ) { + List items = survey.getCodeList( codeList ).getItems(); + List itemsInfo = new ArrayList(); + for (CodeListItem item : items) { + itemsInfo.add( new StratumObject(item.getCode(), item.getLabel(), item.getDescription() ) ); + } + return itemsInfo; + } + + public static File getClimateZonesXML( Survey survey ) throws IOException { + return getStratumXML(survey, CODE_LIST_CLIMATE, "climate"); + } + + public static File getEcologicalZonesXML(Survey survey) throws IOException { + return getStratumXML(survey, CODE_LIST_GEZ, "gez"); + } + + public static File getSoilTypesXML(Survey survey) throws IOException { + return getStratumXML(survey, CODE_LIST_SOIL, "soil"); + } + + private static File getStratumXML( Survey survey, String codeList, String nameForXml ) throws IOException { + XStream xStream = new XStream(); + + xStream.alias(nameForXml, StratumObject.class); + + xStream.setMode(XStream.NO_REFERENCES); + String xmlSchema = xStream.toXML( getCodeList(survey, codeList)); + + File xmlFileDestination = File.createTempFile( "codeListInSurvey", ".xml" ); + xmlFileDestination.deleteOnExit(); + try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { + byte[] strToBytes = xmlSchema.getBytes(); + outputStream.write(strToBytes); + } catch (Exception e) { + logger.error("Error saving data to file", e); + } + + return xmlFileDestination; + } + +} From 51637d1c3219a6315ff70ec30a890ed1d6db73b0 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:41 +0100 Subject: [PATCH 1268/1620] New translations StratumUtils.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 85 ++++++------------- 1 file changed, 26 insertions(+), 59 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 572652125f..1baa564fe0 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -6,86 +6,53 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; -import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; -import org.openforis.collect.earth.ipcc.model.ForestSubdivision; -import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; -import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; -import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; -import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; +import org.openforis.collect.earth.ipcc.model.StratumObject; +import org.openforis.idm.metamodel.CodeListItem; +import org.openforis.idm.metamodel.Survey; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.thoughtworks.xstream.XStream; +public class StratumUtils { -public class LandUseSubdivisionUtils { + public static final String CODE_LIST_CLIMATE = "climate_zones"; + public static final String CODE_LIST_SOIL = "soil_types"; + public static final String CODE_LIST_GEZ = "ecological_zones"; - private static Logger logger = LoggerFactory.getLogger( LandUseSubdivisionUtils.class ); + private static Logger logger = LoggerFactory.getLogger( StratumUtils.class ); - static List landUseSubdivisions; - - public static List> getSubdivisionsByCategory(LandUseCategory category) { - List> subdivisionsInCategory = new ArrayList>(); - for (LandUseSubdivision landUseSubdivision : landUseSubdivisions) { - if( landUseSubdivision.getCategory().equals( category ) ) { - subdivisionsInCategory.add(landUseSubdivision); - } + + private static List getCodeList(Survey survey, String codeList ) { + List items = survey.getCodeList( codeList ).getItems(); + List itemsInfo = new ArrayList(); + for (CodeListItem item : items) { + itemsInfo.add( new StratumObject(item.getCode(), item.getLabel(), item.getDescription() ) ); } - - return subdivisionsInCategory; + return itemsInfo; } - public static void setSubdivisionType(LandUseSubdivision subdivision, Object type) { - landUseSubdivisions.get( landUseSubdivisions.indexOf(subdivision)).setType( type); + public static File getClimateZonesXML( Survey survey ) throws IOException { + return getStratumXML(survey, CODE_LIST_CLIMATE, "climate"); } - - public static List getLandUseSubdivisions() { - return landUseSubdivisions; - } - - public static void setLandUseSubdivisions(List landUseSubdivisions) { - LandUseSubdivisionUtils.landUseSubdivisions = landUseSubdivisions; + + public static File getEcologicalZonesXML(Survey survey) throws IOException { + return getStratumXML(survey, CODE_LIST_GEZ, "gez"); } - public static LandUseSubdivision getSubdivision( String luCategoryCode, String luSubdivisionCode ) { - - LandUseCategory[] luCategories = LandUseCategory.values(); - LandUseCategory landUseCategory = null; - for (LandUseCategory luCat : luCategories) { - if( luCat.getCode().equals(luCategoryCode)) { - landUseCategory = luCat; - } - } - - for (LandUseSubdivision landUseSubdiv : landUseSubdivisions) { - if( landUseSubdiv.getCategory().equals(landUseCategory) && landUseSubdiv.getCode().equals( luSubdivisionCode ) ) { - return landUseSubdiv; - } - - } - - logger.info("No LU Subdivision found for category : " + luCategoryCode + " / subdivision code : " + luSubdivisionCode ); - return null; + public static File getSoilTypesXML(Survey survey) throws IOException { + return getStratumXML(survey, CODE_LIST_SOIL, "soil"); } - public static File getSubdivisionsXML() throws IOException { + private static File getStratumXML( Survey survey, String codeList, String nameForXml ) throws IOException { XStream xStream = new XStream(); - final String subdivisionLabel = "Subdivision"; - - xStream.alias(subdivisionLabel, ForestSubdivision.class); - xStream.alias(subdivisionLabel, CroplandSubdivision.class); - xStream.alias(subdivisionLabel, SettlementSubdivision.class); - xStream.alias(subdivisionLabel, OtherlandSubdivision.class); - xStream.alias(subdivisionLabel, GrasslandSubdivision.class); - xStream.alias(subdivisionLabel, WetlandSubdivision.class); + xStream.alias(nameForXml, StratumObject.class); xStream.setMode(XStream.NO_REFERENCES); - String xmlSchema = xStream.toXML(getLandUseSubdivisions()); + String xmlSchema = xStream.toXML( getCodeList(survey, codeList)); - File xmlFileDestination = File.createTempFile( "subdivisionsInSurvey", ".xml" ); + File xmlFileDestination = File.createTempFile( "codeListInSurvey", ".xml" ); xmlFileDestination.deleteOnExit(); try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { byte[] strToBytes = xmlSchema.getBytes(); From 835591bcb46789ab9fb9784be0d38f22b76ec1d1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:43 +0100 Subject: [PATCH 1269/1620] New translations StratumUtils.java (English) --- .../earth/app/view/Messages_en.properties | 85 ++++++------------- 1 file changed, 26 insertions(+), 59 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 572652125f..1baa564fe0 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -6,86 +6,53 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; -import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; -import org.openforis.collect.earth.ipcc.model.ForestSubdivision; -import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; -import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; -import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; -import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; +import org.openforis.collect.earth.ipcc.model.StratumObject; +import org.openforis.idm.metamodel.CodeListItem; +import org.openforis.idm.metamodel.Survey; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.thoughtworks.xstream.XStream; +public class StratumUtils { -public class LandUseSubdivisionUtils { + public static final String CODE_LIST_CLIMATE = "climate_zones"; + public static final String CODE_LIST_SOIL = "soil_types"; + public static final String CODE_LIST_GEZ = "ecological_zones"; - private static Logger logger = LoggerFactory.getLogger( LandUseSubdivisionUtils.class ); + private static Logger logger = LoggerFactory.getLogger( StratumUtils.class ); - static List landUseSubdivisions; - - public static List> getSubdivisionsByCategory(LandUseCategory category) { - List> subdivisionsInCategory = new ArrayList>(); - for (LandUseSubdivision landUseSubdivision : landUseSubdivisions) { - if( landUseSubdivision.getCategory().equals( category ) ) { - subdivisionsInCategory.add(landUseSubdivision); - } + + private static List getCodeList(Survey survey, String codeList ) { + List items = survey.getCodeList( codeList ).getItems(); + List itemsInfo = new ArrayList(); + for (CodeListItem item : items) { + itemsInfo.add( new StratumObject(item.getCode(), item.getLabel(), item.getDescription() ) ); } - - return subdivisionsInCategory; + return itemsInfo; } - public static void setSubdivisionType(LandUseSubdivision subdivision, Object type) { - landUseSubdivisions.get( landUseSubdivisions.indexOf(subdivision)).setType( type); + public static File getClimateZonesXML( Survey survey ) throws IOException { + return getStratumXML(survey, CODE_LIST_CLIMATE, "climate"); } - - public static List getLandUseSubdivisions() { - return landUseSubdivisions; - } - - public static void setLandUseSubdivisions(List landUseSubdivisions) { - LandUseSubdivisionUtils.landUseSubdivisions = landUseSubdivisions; + + public static File getEcologicalZonesXML(Survey survey) throws IOException { + return getStratumXML(survey, CODE_LIST_GEZ, "gez"); } - public static LandUseSubdivision getSubdivision( String luCategoryCode, String luSubdivisionCode ) { - - LandUseCategory[] luCategories = LandUseCategory.values(); - LandUseCategory landUseCategory = null; - for (LandUseCategory luCat : luCategories) { - if( luCat.getCode().equals(luCategoryCode)) { - landUseCategory = luCat; - } - } - - for (LandUseSubdivision landUseSubdiv : landUseSubdivisions) { - if( landUseSubdiv.getCategory().equals(landUseCategory) && landUseSubdiv.getCode().equals( luSubdivisionCode ) ) { - return landUseSubdiv; - } - - } - - logger.info("No LU Subdivision found for category : " + luCategoryCode + " / subdivision code : " + luSubdivisionCode ); - return null; + public static File getSoilTypesXML(Survey survey) throws IOException { + return getStratumXML(survey, CODE_LIST_SOIL, "soil"); } - public static File getSubdivisionsXML() throws IOException { + private static File getStratumXML( Survey survey, String codeList, String nameForXml ) throws IOException { XStream xStream = new XStream(); - final String subdivisionLabel = "Subdivision"; - - xStream.alias(subdivisionLabel, ForestSubdivision.class); - xStream.alias(subdivisionLabel, CroplandSubdivision.class); - xStream.alias(subdivisionLabel, SettlementSubdivision.class); - xStream.alias(subdivisionLabel, OtherlandSubdivision.class); - xStream.alias(subdivisionLabel, GrasslandSubdivision.class); - xStream.alias(subdivisionLabel, WetlandSubdivision.class); + xStream.alias(nameForXml, StratumObject.class); xStream.setMode(XStream.NO_REFERENCES); - String xmlSchema = xStream.toXML(getLandUseSubdivisions()); + String xmlSchema = xStream.toXML( getCodeList(survey, codeList)); - File xmlFileDestination = File.createTempFile( "subdivisionsInSurvey", ".xml" ); + File xmlFileDestination = File.createTempFile( "codeListInSurvey", ".xml" ); xmlFileDestination.deleteOnExit(); try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { byte[] strToBytes = xmlSchema.getBytes(); From 8ce3d874e3940206208a3175fd36766dc5008325 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:44 +0100 Subject: [PATCH 1270/1620] New translations CroplandSubdivision.java (French) --- .../earth/app/view/Messages_fr.properties | 73 ++++--------------- 1 file changed, 13 insertions(+), 60 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 1baa564fe0..fb27fb933b 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,67 +1,20 @@ -package org.openforis.collect.earth.ipcc.controller; +package org.openforis.collect.earth.ipcc.model; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import org.openforis.collect.earth.ipcc.model.StratumObject; -import org.openforis.idm.metamodel.CodeListItem; -import org.openforis.idm.metamodel.Survey; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.thoughtworks.xstream.XStream; - -public class StratumUtils { - - public static final String CODE_LIST_CLIMATE = "climate_zones"; - public static final String CODE_LIST_SOIL = "soil_types"; - public static final String CODE_LIST_GEZ = "ecological_zones"; - - private static Logger logger = LoggerFactory.getLogger( StratumUtils.class ); - - - private static List getCodeList(Survey survey, String codeList ) { - List items = survey.getCodeList( codeList ).getItems(); - List itemsInfo = new ArrayList(); - for (CodeListItem item : items) { - itemsInfo.add( new StratumObject(item.getCode(), item.getLabel(), item.getDescription() ) ); - } - return itemsInfo; - } - - public static File getClimateZonesXML( Survey survey ) throws IOException { - return getStratumXML(survey, CODE_LIST_CLIMATE, "climate"); - } +public class CroplandSubdivision extends LandUseSubdivision{ - public static File getEcologicalZonesXML(Survey survey) throws IOException { - return getStratumXML(survey, CODE_LIST_GEZ, "gez"); - } + protected CroplandType type; - public static File getSoilTypesXML(Survey survey) throws IOException { - return getStratumXML(survey, CODE_LIST_SOIL, "soil"); + public CroplandSubdivision( String code, String name, CroplandType type) { + super(LandUseCategory.C, code, name); + setType(type); } - - private static File getStratumXML( Survey survey, String codeList, String nameForXml ) throws IOException { - XStream xStream = new XStream(); - - xStream.alias(nameForXml, StratumObject.class); - - xStream.setMode(XStream.NO_REFERENCES); - String xmlSchema = xStream.toXML( getCodeList(survey, codeList)); - - File xmlFileDestination = File.createTempFile( "codeListInSurvey", ".xml" ); - xmlFileDestination.deleteOnExit(); - try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { - byte[] strToBytes = xmlSchema.getBytes(); - outputStream.write(strToBytes); - } catch (Exception e) { - logger.error("Error saving data to file", e); - } - - return xmlFileDestination; + + public CroplandType getType() { + return type; } + public void setType(CroplandType type) { + this.type = type; + }; + } From ac8d8f6d6ab9eb552ef63e12b9c96f56c444a63e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:45 +0100 Subject: [PATCH 1271/1620] New translations CroplandSubdivision.java (Spanish) --- .../earth/app/view/Messages_es.properties | 73 ++++--------------- 1 file changed, 13 insertions(+), 60 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 1baa564fe0..fb27fb933b 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,67 +1,20 @@ -package org.openforis.collect.earth.ipcc.controller; +package org.openforis.collect.earth.ipcc.model; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import org.openforis.collect.earth.ipcc.model.StratumObject; -import org.openforis.idm.metamodel.CodeListItem; -import org.openforis.idm.metamodel.Survey; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.thoughtworks.xstream.XStream; - -public class StratumUtils { - - public static final String CODE_LIST_CLIMATE = "climate_zones"; - public static final String CODE_LIST_SOIL = "soil_types"; - public static final String CODE_LIST_GEZ = "ecological_zones"; - - private static Logger logger = LoggerFactory.getLogger( StratumUtils.class ); - - - private static List getCodeList(Survey survey, String codeList ) { - List items = survey.getCodeList( codeList ).getItems(); - List itemsInfo = new ArrayList(); - for (CodeListItem item : items) { - itemsInfo.add( new StratumObject(item.getCode(), item.getLabel(), item.getDescription() ) ); - } - return itemsInfo; - } - - public static File getClimateZonesXML( Survey survey ) throws IOException { - return getStratumXML(survey, CODE_LIST_CLIMATE, "climate"); - } +public class CroplandSubdivision extends LandUseSubdivision{ - public static File getEcologicalZonesXML(Survey survey) throws IOException { - return getStratumXML(survey, CODE_LIST_GEZ, "gez"); - } + protected CroplandType type; - public static File getSoilTypesXML(Survey survey) throws IOException { - return getStratumXML(survey, CODE_LIST_SOIL, "soil"); + public CroplandSubdivision( String code, String name, CroplandType type) { + super(LandUseCategory.C, code, name); + setType(type); } - - private static File getStratumXML( Survey survey, String codeList, String nameForXml ) throws IOException { - XStream xStream = new XStream(); - - xStream.alias(nameForXml, StratumObject.class); - - xStream.setMode(XStream.NO_REFERENCES); - String xmlSchema = xStream.toXML( getCodeList(survey, codeList)); - - File xmlFileDestination = File.createTempFile( "codeListInSurvey", ".xml" ); - xmlFileDestination.deleteOnExit(); - try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { - byte[] strToBytes = xmlSchema.getBytes(); - outputStream.write(strToBytes); - } catch (Exception e) { - logger.error("Error saving data to file", e); - } - - return xmlFileDestination; + + public CroplandType getType() { + return type; } + public void setType(CroplandType type) { + this.type = type; + }; + } From ece0fa68d6bd63cd31b0ee49a84187cb82c3df40 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:46 +0100 Subject: [PATCH 1272/1620] New translations CroplandSubdivision.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 73 ++++--------------- 1 file changed, 13 insertions(+), 60 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 1baa564fe0..fb27fb933b 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,67 +1,20 @@ -package org.openforis.collect.earth.ipcc.controller; +package org.openforis.collect.earth.ipcc.model; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import org.openforis.collect.earth.ipcc.model.StratumObject; -import org.openforis.idm.metamodel.CodeListItem; -import org.openforis.idm.metamodel.Survey; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.thoughtworks.xstream.XStream; - -public class StratumUtils { - - public static final String CODE_LIST_CLIMATE = "climate_zones"; - public static final String CODE_LIST_SOIL = "soil_types"; - public static final String CODE_LIST_GEZ = "ecological_zones"; - - private static Logger logger = LoggerFactory.getLogger( StratumUtils.class ); - - - private static List getCodeList(Survey survey, String codeList ) { - List items = survey.getCodeList( codeList ).getItems(); - List itemsInfo = new ArrayList(); - for (CodeListItem item : items) { - itemsInfo.add( new StratumObject(item.getCode(), item.getLabel(), item.getDescription() ) ); - } - return itemsInfo; - } - - public static File getClimateZonesXML( Survey survey ) throws IOException { - return getStratumXML(survey, CODE_LIST_CLIMATE, "climate"); - } +public class CroplandSubdivision extends LandUseSubdivision{ - public static File getEcologicalZonesXML(Survey survey) throws IOException { - return getStratumXML(survey, CODE_LIST_GEZ, "gez"); - } + protected CroplandType type; - public static File getSoilTypesXML(Survey survey) throws IOException { - return getStratumXML(survey, CODE_LIST_SOIL, "soil"); + public CroplandSubdivision( String code, String name, CroplandType type) { + super(LandUseCategory.C, code, name); + setType(type); } - - private static File getStratumXML( Survey survey, String codeList, String nameForXml ) throws IOException { - XStream xStream = new XStream(); - - xStream.alias(nameForXml, StratumObject.class); - - xStream.setMode(XStream.NO_REFERENCES); - String xmlSchema = xStream.toXML( getCodeList(survey, codeList)); - - File xmlFileDestination = File.createTempFile( "codeListInSurvey", ".xml" ); - xmlFileDestination.deleteOnExit(); - try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { - byte[] strToBytes = xmlSchema.getBytes(); - outputStream.write(strToBytes); - } catch (Exception e) { - logger.error("Error saving data to file", e); - } - - return xmlFileDestination; + + public CroplandType getType() { + return type; } + public void setType(CroplandType type) { + this.type = type; + }; + } From 40580629e92dae03ae2fa63f2b89a99d5c0b457e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:48 +0100 Subject: [PATCH 1273/1620] New translations CroplandType.java (French) --- .../earth/app/view/Messages_fr.properties | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index fb27fb933b..e6464b6c58 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,20 +1,21 @@ package org.openforis.collect.earth.ipcc.model; -public class CroplandSubdivision extends LandUseSubdivision{ +public enum CroplandType { + + ANNUAL("Annual"),PERENNIAL("Perennial"); - protected CroplandType type; + public final String name; - public CroplandSubdivision( String code, String name, CroplandType type) { - super(LandUseCategory.C, code, name); - setType(type); - } + private CroplandType(String name) { + this.name = name; + } - public CroplandType getType() { - return type; + public String getName() { + return name; } - public void setType(CroplandType type) { - this.type = type; - }; - + @Override + public String toString() { + return getName(); + } } From 4e89ab5491a4dd0b812062ca75a23bc4a89762e8 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:49 +0100 Subject: [PATCH 1274/1620] New translations LandUseSubdivisionUtils.java (French) --- .../earth/app/view/Messages_fr.properties | 103 ++++++++++++++++-- 1 file changed, 91 insertions(+), 12 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index e6464b6c58..572652125f 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,21 +1,100 @@ -package org.openforis.collect.earth.ipcc.model; +package org.openforis.collect.earth.ipcc.controller; -public enum CroplandType { +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; - ANNUAL("Annual"),PERENNIAL("Perennial"); +import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; +import org.openforis.collect.earth.ipcc.model.ForestSubdivision; +import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; +import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; +import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; +import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.thoughtworks.xstream.XStream; + + +public class LandUseSubdivisionUtils { - public final String name; + private static Logger logger = LoggerFactory.getLogger( LandUseSubdivisionUtils.class ); + + static List landUseSubdivisions; + + public static List> getSubdivisionsByCategory(LandUseCategory category) { + List> subdivisionsInCategory = new ArrayList>(); + for (LandUseSubdivision landUseSubdivision : landUseSubdivisions) { + if( landUseSubdivision.getCategory().equals( category ) ) { + subdivisionsInCategory.add(landUseSubdivision); + } + } + + return subdivisionsInCategory; + } - private CroplandType(String name) { - this.name = name; - } + public static void setSubdivisionType(LandUseSubdivision subdivision, Object type) { + landUseSubdivisions.get( landUseSubdivisions.indexOf(subdivision)).setType( type); + } - public String getName() { - return name; + public static List getLandUseSubdivisions() { + return landUseSubdivisions; } - @Override - public String toString() { - return getName(); + public static void setLandUseSubdivisions(List landUseSubdivisions) { + LandUseSubdivisionUtils.landUseSubdivisions = landUseSubdivisions; + } + + public static LandUseSubdivision getSubdivision( String luCategoryCode, String luSubdivisionCode ) { + + LandUseCategory[] luCategories = LandUseCategory.values(); + LandUseCategory landUseCategory = null; + for (LandUseCategory luCat : luCategories) { + if( luCat.getCode().equals(luCategoryCode)) { + landUseCategory = luCat; + } + } + + for (LandUseSubdivision landUseSubdiv : landUseSubdivisions) { + if( landUseSubdiv.getCategory().equals(landUseCategory) && landUseSubdiv.getCode().equals( luSubdivisionCode ) ) { + return landUseSubdiv; + } + + } + + logger.info("No LU Subdivision found for category : " + luCategoryCode + " / subdivision code : " + luSubdivisionCode ); + return null; } + + public static File getSubdivisionsXML() throws IOException { + XStream xStream = new XStream(); + + final String subdivisionLabel = "Subdivision"; + + xStream.alias(subdivisionLabel, ForestSubdivision.class); + xStream.alias(subdivisionLabel, CroplandSubdivision.class); + xStream.alias(subdivisionLabel, SettlementSubdivision.class); + xStream.alias(subdivisionLabel, OtherlandSubdivision.class); + xStream.alias(subdivisionLabel, GrasslandSubdivision.class); + xStream.alias(subdivisionLabel, WetlandSubdivision.class); + + xStream.setMode(XStream.NO_REFERENCES); + String xmlSchema = xStream.toXML(getLandUseSubdivisions()); + + File xmlFileDestination = File.createTempFile( "subdivisionsInSurvey", ".xml" ); + xmlFileDestination.deleteOnExit(); + try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { + byte[] strToBytes = xmlSchema.getBytes(); + outputStream.write(strToBytes); + } catch (Exception e) { + logger.error("Error saving data to file", e); + } + + return xmlFileDestination; + } + } From b764b47f2d461d8d575599b2b04ecfdb2d89244f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:50 +0100 Subject: [PATCH 1275/1620] New translations CroplandType.java (Spanish) --- .../earth/app/view/Messages_es.properties | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index fb27fb933b..e6464b6c58 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,20 +1,21 @@ package org.openforis.collect.earth.ipcc.model; -public class CroplandSubdivision extends LandUseSubdivision{ +public enum CroplandType { + + ANNUAL("Annual"),PERENNIAL("Perennial"); - protected CroplandType type; + public final String name; - public CroplandSubdivision( String code, String name, CroplandType type) { - super(LandUseCategory.C, code, name); - setType(type); - } + private CroplandType(String name) { + this.name = name; + } - public CroplandType getType() { - return type; + public String getName() { + return name; } - public void setType(CroplandType type) { - this.type = type; - }; - + @Override + public String toString() { + return getName(); + } } From 7849fdf49ee114b1d7a5b6053eb72c2746821968 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:51 +0100 Subject: [PATCH 1276/1620] New translations CroplandType.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index fb27fb933b..e6464b6c58 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,20 +1,21 @@ package org.openforis.collect.earth.ipcc.model; -public class CroplandSubdivision extends LandUseSubdivision{ +public enum CroplandType { + + ANNUAL("Annual"),PERENNIAL("Perennial"); - protected CroplandType type; + public final String name; - public CroplandSubdivision( String code, String name, CroplandType type) { - super(LandUseCategory.C, code, name); - setType(type); - } + private CroplandType(String name) { + this.name = name; + } - public CroplandType getType() { - return type; + public String getName() { + return name; } - public void setType(CroplandType type) { - this.type = type; - }; - + @Override + public String toString() { + return getName(); + } } From 85b771dbf8562e97dcca2cef764a6544badfb0a4 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:52 +0100 Subject: [PATCH 1277/1620] New translations CroplandType.java (English) --- .../earth/app/view/Messages_en.properties | 74 ++++--------------- 1 file changed, 14 insertions(+), 60 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 1baa564fe0..e6464b6c58 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,67 +1,21 @@ -package org.openforis.collect.earth.ipcc.controller; +package org.openforis.collect.earth.ipcc.model; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +public enum CroplandType { -import org.openforis.collect.earth.ipcc.model.StratumObject; -import org.openforis.idm.metamodel.CodeListItem; -import org.openforis.idm.metamodel.Survey; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.thoughtworks.xstream.XStream; - -public class StratumUtils { - - public static final String CODE_LIST_CLIMATE = "climate_zones"; - public static final String CODE_LIST_SOIL = "soil_types"; - public static final String CODE_LIST_GEZ = "ecological_zones"; - - private static Logger logger = LoggerFactory.getLogger( StratumUtils.class ); - - - private static List getCodeList(Survey survey, String codeList ) { - List items = survey.getCodeList( codeList ).getItems(); - List itemsInfo = new ArrayList(); - for (CodeListItem item : items) { - itemsInfo.add( new StratumObject(item.getCode(), item.getLabel(), item.getDescription() ) ); - } - return itemsInfo; - } + ANNUAL("Annual"),PERENNIAL("Perennial"); - public static File getClimateZonesXML( Survey survey ) throws IOException { - return getStratumXML(survey, CODE_LIST_CLIMATE, "climate"); - } - - public static File getEcologicalZonesXML(Survey survey) throws IOException { - return getStratumXML(survey, CODE_LIST_GEZ, "gez"); - } + public final String name; - public static File getSoilTypesXML(Survey survey) throws IOException { - return getStratumXML(survey, CODE_LIST_SOIL, "soil"); - } - - private static File getStratumXML( Survey survey, String codeList, String nameForXml ) throws IOException { - XStream xStream = new XStream(); - - xStream.alias(nameForXml, StratumObject.class); - - xStream.setMode(XStream.NO_REFERENCES); - String xmlSchema = xStream.toXML( getCodeList(survey, codeList)); - - File xmlFileDestination = File.createTempFile( "codeListInSurvey", ".xml" ); - xmlFileDestination.deleteOnExit(); - try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { - byte[] strToBytes = xmlSchema.getBytes(); - outputStream.write(strToBytes); - } catch (Exception e) { - logger.error("Error saving data to file", e); - } - - return xmlFileDestination; + private CroplandType(String name) { + this.name = name; + } + + public String getName() { + return name; } + @Override + public String toString() { + return getName(); + } } From 4062b7ad56c195c85c9bbb57f20e8899a0c424a4 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:53 +0100 Subject: [PATCH 1278/1620] New translations ForestSubdivision.java (French) --- .../earth/app/view/Messages_fr.properties | 99 +------------------ 1 file changed, 4 insertions(+), 95 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 572652125f..45d2698475 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,100 +1,9 @@ -package org.openforis.collect.earth.ipcc.controller; +package org.openforis.collect.earth.ipcc.model; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; -import org.openforis.collect.earth.ipcc.model.ForestSubdivision; -import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; -import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; -import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; -import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.thoughtworks.xstream.XStream; - - -public class LandUseSubdivisionUtils { - - private static Logger logger = LoggerFactory.getLogger( LandUseSubdivisionUtils.class ); - - static List landUseSubdivisions; - - public static List> getSubdivisionsByCategory(LandUseCategory category) { - List> subdivisionsInCategory = new ArrayList>(); - for (LandUseSubdivision landUseSubdivision : landUseSubdivisions) { - if( landUseSubdivision.getCategory().equals( category ) ) { - subdivisionsInCategory.add(landUseSubdivision); - } - } - - return subdivisionsInCategory; - } +public class ForestSubdivision extends ManagementLandUseSubdivision{ - public static void setSubdivisionType(LandUseSubdivision subdivision, Object type) { - landUseSubdivisions.get( landUseSubdivisions.indexOf(subdivision)).setType( type); - } - - public static List getLandUseSubdivisions() { - return landUseSubdivisions; - } - - public static void setLandUseSubdivisions(List landUseSubdivisions) { - LandUseSubdivisionUtils.landUseSubdivisions = landUseSubdivisions; + public ForestSubdivision( String code, String name, ManagementType type) { + super( LandUseCategory.F, code, name, type); } - public static LandUseSubdivision getSubdivision( String luCategoryCode, String luSubdivisionCode ) { - - LandUseCategory[] luCategories = LandUseCategory.values(); - LandUseCategory landUseCategory = null; - for (LandUseCategory luCat : luCategories) { - if( luCat.getCode().equals(luCategoryCode)) { - landUseCategory = luCat; - } - } - - for (LandUseSubdivision landUseSubdiv : landUseSubdivisions) { - if( landUseSubdiv.getCategory().equals(landUseCategory) && landUseSubdiv.getCode().equals( luSubdivisionCode ) ) { - return landUseSubdiv; - } - - } - - logger.info("No LU Subdivision found for category : " + luCategoryCode + " / subdivision code : " + luSubdivisionCode ); - return null; - } - - public static File getSubdivisionsXML() throws IOException { - XStream xStream = new XStream(); - - final String subdivisionLabel = "Subdivision"; - - xStream.alias(subdivisionLabel, ForestSubdivision.class); - xStream.alias(subdivisionLabel, CroplandSubdivision.class); - xStream.alias(subdivisionLabel, SettlementSubdivision.class); - xStream.alias(subdivisionLabel, OtherlandSubdivision.class); - xStream.alias(subdivisionLabel, GrasslandSubdivision.class); - xStream.alias(subdivisionLabel, WetlandSubdivision.class); - - xStream.setMode(XStream.NO_REFERENCES); - String xmlSchema = xStream.toXML(getLandUseSubdivisions()); - - File xmlFileDestination = File.createTempFile( "subdivisionsInSurvey", ".xml" ); - xmlFileDestination.deleteOnExit(); - try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { - byte[] strToBytes = xmlSchema.getBytes(); - outputStream.write(strToBytes); - } catch (Exception e) { - logger.error("Error saving data to file", e); - } - - return xmlFileDestination; - } - } From f9d5896703c120f48448d6204276ea1957dc3fbd Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:54 +0100 Subject: [PATCH 1279/1620] New translations ForestSubdivision.java (Spanish) --- .../earth/app/view/Messages_es.properties | 20 ++++--------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index e6464b6c58..45d2698475 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,21 +1,9 @@ package org.openforis.collect.earth.ipcc.model; -public enum CroplandType { - - ANNUAL("Annual"),PERENNIAL("Perennial"); - - public final String name; +public class ForestSubdivision extends ManagementLandUseSubdivision{ - private CroplandType(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - @Override - public String toString() { - return getName(); + public ForestSubdivision( String code, String name, ManagementType type) { + super( LandUseCategory.F, code, name, type); } + } From e1b453bd877dd0ae2cb2b18255934736423320af Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:55 +0100 Subject: [PATCH 1280/1620] New translations ForestSubdivision.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 20 ++++--------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index e6464b6c58..45d2698475 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,21 +1,9 @@ package org.openforis.collect.earth.ipcc.model; -public enum CroplandType { - - ANNUAL("Annual"),PERENNIAL("Perennial"); - - public final String name; +public class ForestSubdivision extends ManagementLandUseSubdivision{ - private CroplandType(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - @Override - public String toString() { - return getName(); + public ForestSubdivision( String code, String name, ManagementType type) { + super( LandUseCategory.F, code, name, type); } + } From 3f8b29ba5931b050995030ff7ba2f43da1494606 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:56 +0100 Subject: [PATCH 1281/1620] New translations ForestSubdivision.java (English) --- .../earth/app/view/Messages_en.properties | 20 ++++--------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index e6464b6c58..45d2698475 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,21 +1,9 @@ package org.openforis.collect.earth.ipcc.model; -public enum CroplandType { - - ANNUAL("Annual"),PERENNIAL("Perennial"); - - public final String name; +public class ForestSubdivision extends ManagementLandUseSubdivision{ - private CroplandType(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - @Override - public String toString() { - return getName(); + public ForestSubdivision( String code, String name, ManagementType type) { + super( LandUseCategory.F, code, name, type); } + } From d5659daf13fc04e9028e86265da007119296d09d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:57 +0100 Subject: [PATCH 1282/1620] New translations GrasslandSubdivision.java (French) --- .../collect/earth/app/view/Messages_fr.properties | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 45d2698475..0a8edd0b43 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,9 +1,9 @@ package org.openforis.collect.earth.ipcc.model; -public class ForestSubdivision extends ManagementLandUseSubdivision{ +public class GrasslandSubdivision extends ManagementLandUseSubdivision{ - public ForestSubdivision( String code, String name, ManagementType type) { - super( LandUseCategory.F, code, name, type); + public GrasslandSubdivision( String code, String name, ManagementType type) { + super( LandUseCategory.G, code, name, type); } -} +} \ No newline at end of file From 7f1471d033cf8d6fad956b7db16c3b233151926e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:45:59 +0100 Subject: [PATCH 1283/1620] New translations GrasslandSubdivision.java (Spanish) --- .../collect/earth/app/view/Messages_es.properties | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 45d2698475..0a8edd0b43 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,9 +1,9 @@ package org.openforis.collect.earth.ipcc.model; -public class ForestSubdivision extends ManagementLandUseSubdivision{ +public class GrasslandSubdivision extends ManagementLandUseSubdivision{ - public ForestSubdivision( String code, String name, ManagementType type) { - super( LandUseCategory.F, code, name, type); + public GrasslandSubdivision( String code, String name, ManagementType type) { + super( LandUseCategory.G, code, name, type); } -} +} \ No newline at end of file From 193f5bbc53aa9a018f3b4261be7ba68bc4d85a79 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:00 +0100 Subject: [PATCH 1284/1620] New translations GrasslandSubdivision.java (Portuguese) --- .../collect/earth/app/view/Messages_pt.properties | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 45d2698475..0a8edd0b43 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,9 +1,9 @@ package org.openforis.collect.earth.ipcc.model; -public class ForestSubdivision extends ManagementLandUseSubdivision{ +public class GrasslandSubdivision extends ManagementLandUseSubdivision{ - public ForestSubdivision( String code, String name, ManagementType type) { - super( LandUseCategory.F, code, name, type); + public GrasslandSubdivision( String code, String name, ManagementType type) { + super( LandUseCategory.G, code, name, type); } -} +} \ No newline at end of file From 25621ffbbb5aed50af4c5555598e7511ecfdc71a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:01 +0100 Subject: [PATCH 1285/1620] New translations LandUseSubdivisionUtils.java (Spanish) --- .../earth/app/view/Messages_es.properties | 101 +++++++++++++++++- 1 file changed, 96 insertions(+), 5 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 0a8edd0b43..572652125f 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,9 +1,100 @@ -package org.openforis.collect.earth.ipcc.model; +package org.openforis.collect.earth.ipcc.controller; -public class GrasslandSubdivision extends ManagementLandUseSubdivision{ +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; +import org.openforis.collect.earth.ipcc.model.ForestSubdivision; +import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; +import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; +import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; +import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.thoughtworks.xstream.XStream; + + +public class LandUseSubdivisionUtils { + + private static Logger logger = LoggerFactory.getLogger( LandUseSubdivisionUtils.class ); + + static List landUseSubdivisions; + + public static List> getSubdivisionsByCategory(LandUseCategory category) { + List> subdivisionsInCategory = new ArrayList>(); + for (LandUseSubdivision landUseSubdivision : landUseSubdivisions) { + if( landUseSubdivision.getCategory().equals( category ) ) { + subdivisionsInCategory.add(landUseSubdivision); + } + } + + return subdivisionsInCategory; + } - public GrasslandSubdivision( String code, String name, ManagementType type) { - super( LandUseCategory.G, code, name, type); + public static void setSubdivisionType(LandUseSubdivision subdivision, Object type) { + landUseSubdivisions.get( landUseSubdivisions.indexOf(subdivision)).setType( type); + } + + public static List getLandUseSubdivisions() { + return landUseSubdivisions; + } + + public static void setLandUseSubdivisions(List landUseSubdivisions) { + LandUseSubdivisionUtils.landUseSubdivisions = landUseSubdivisions; } -} \ No newline at end of file + public static LandUseSubdivision getSubdivision( String luCategoryCode, String luSubdivisionCode ) { + + LandUseCategory[] luCategories = LandUseCategory.values(); + LandUseCategory landUseCategory = null; + for (LandUseCategory luCat : luCategories) { + if( luCat.getCode().equals(luCategoryCode)) { + landUseCategory = luCat; + } + } + + for (LandUseSubdivision landUseSubdiv : landUseSubdivisions) { + if( landUseSubdiv.getCategory().equals(landUseCategory) && landUseSubdiv.getCode().equals( luSubdivisionCode ) ) { + return landUseSubdiv; + } + + } + + logger.info("No LU Subdivision found for category : " + luCategoryCode + " / subdivision code : " + luSubdivisionCode ); + return null; + } + + public static File getSubdivisionsXML() throws IOException { + XStream xStream = new XStream(); + + final String subdivisionLabel = "Subdivision"; + + xStream.alias(subdivisionLabel, ForestSubdivision.class); + xStream.alias(subdivisionLabel, CroplandSubdivision.class); + xStream.alias(subdivisionLabel, SettlementSubdivision.class); + xStream.alias(subdivisionLabel, OtherlandSubdivision.class); + xStream.alias(subdivisionLabel, GrasslandSubdivision.class); + xStream.alias(subdivisionLabel, WetlandSubdivision.class); + + xStream.setMode(XStream.NO_REFERENCES); + String xmlSchema = xStream.toXML(getLandUseSubdivisions()); + + File xmlFileDestination = File.createTempFile( "subdivisionsInSurvey", ".xml" ); + xmlFileDestination.deleteOnExit(); + try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { + byte[] strToBytes = xmlSchema.getBytes(); + outputStream.write(strToBytes); + } catch (Exception e) { + logger.error("Error saving data to file", e); + } + + return xmlFileDestination; + } + +} From 5a7893df2ea9c3d6a0e80af086fdf91e1e7b8a0a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:02 +0100 Subject: [PATCH 1286/1620] New translations CollectEarthUtils.java (English) --- .../earth/app/view/Messages_en.properties | 217 +++++++++++++++++- 1 file changed, 208 insertions(+), 9 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 45d2698475..8fa17ec627 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,9 +1,208 @@ -package org.openforis.collect.earth.ipcc.model; - -public class ForestSubdivision extends ManagementLandUseSubdivision{ - - public ForestSubdivision( String code, String name, ManagementType type) { - super( LandUseCategory.F, code, name, type); - } - -} +package org.openforis.collect.earth.app; + +import java.awt.Desktop; +import java.awt.Font; +import java.awt.FontFormatException; +import java.awt.GraphicsEnvironment; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.sql.Connection; +import java.sql.DriverManager; +import java.util.Enumeration; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import javax.swing.UIManager; + +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.commons.lang3.SystemUtils; +import org.openforis.collect.earth.app.EarthConstants.UI_LANGUAGE; +import org.openforis.collect.earth.app.view.Messages; +import org.postgresql.Driver; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.exception.ZipException; +import net.lingala.zip4j.model.ZipParameters; +import net.lingala.zip4j.model.enums.CompressionLevel; +import net.lingala.zip4j.model.enums.CompressionMethod; + +public class CollectEarthUtils { + + private static final Logger logger = LoggerFactory.getLogger(CollectEarthUtils.class); + + private CollectEarthUtils() { + } + + public static String getMd5FromFolder(File folder) throws IOException { + + if (!folder.isDirectory()) { + throw new IllegalArgumentException("The file passed as an argument needs to be a folder!"); + } + StringBuilder md5Hex = new StringBuilder(); + + try( Stream paths = Files.walk(Paths.get(folder.toURI()), 3); ) { + List listFiles = paths.filter(Files::isRegularFile).map(Path::toFile) + .collect(Collectors.toList()); + for (File file : listFiles) { + md5Hex.append(DigestUtils.md5Hex(new FileInputStream(file))); + } + return DigestUtils.md5Hex(md5Hex.toString().getBytes()); + } + } + + public static String getMd5FromFile(String filePath) throws IOException { + return DigestUtils.md5Hex(new FileInputStream(new File(filePath))); + } + + public static void setFontDependingOnLanguaue(UI_LANGUAGE uiLanguage) { + if (uiLanguage == UI_LANGUAGE.LO) { + String ttfFileName = "Phetsarath_OT.ttf"; + // create the font + setUiFont(ttfFileName); + } else if (uiLanguage == UI_LANGUAGE.MN) { + String ttfFileName = "arhangai.ttf"; + // create the font + setUiFont(ttfFileName); + } else { + CollectEarthUtils.setUiFont(new javax.swing.plaf.FontUIResource("Arial Unicode MS", Font.PLAIN, 12)); + } + } + + public static void setUiFont(String ttfFileName) { + try { + // create the font to use. Specify the size! + InputStream fontStream = CollectEarthUtils.class.getResourceAsStream(ttfFileName); + Font laoFont = Font.createFont(Font.TRUETYPE_FONT, fontStream).deriveFont(12f); + GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); + // register the font + ge.registerFont(laoFont); + CollectEarthUtils.setUiFont(new javax.swing.plaf.FontUIResource(laoFont.getFontName(), Font.PLAIN, 12)); + } catch (IOException | FontFormatException e) { + logger.error("error setting the font " + ttfFileName, e); + } + + } + + private static void setUiFont(javax.swing.plaf.FontUIResource f) { + Enumeration keys = UIManager.getDefaults().keys(); + while (keys.hasMoreElements()) { + Object key = keys.nextElement(); + Object value = UIManager.get(key); + if (value instanceof javax.swing.plaf.FontUIResource) + UIManager.put(key, f); + } + } + + public static ZipFile addFileToZip(String pathToDestinationZip, File fileToAdd, String fileNameInZip) throws IOException { + File destinationZip = new File(pathToDestinationZip); + return addFileToZip(destinationZip, fileToAdd, fileNameInZip); + } + + public static ZipFile addFileToZip(File destinationZip, File fileToAdd, String fileNameInZip) throws IOException { + try( ZipFile zipFile = new ZipFile(destinationZip) ){ + ZipParameters zipParameters = new ZipParameters(); + // COMP_DEFLATE is for compression + zipParameters.setCompressionMethod(CompressionMethod.DEFLATE); + // DEFLATE_LEVEL_ULTRA = maximum compression + zipParameters.setCompressionLevel(CompressionLevel.ULTRA); + zipParameters.setFileNameInZip(fileNameInZip); + zipFile.addFile(fileToAdd, zipParameters); + return zipFile; + }catch(Exception e) { + logger.error("Error adding file to ZIP", e); + return null; + } + } + + public static String getComputerIp() { + try { + return InetAddress.getLocalHost().getHostAddress(); + } catch (final UnknownHostException e) { + logger.warn("Unknown IP address", e); //$NON-NLS-1$ + return Messages.getString("OptionWizard.11"); //$NON-NLS-1$ + } + } + + public static void addFolderToZip(ZipFile zipFile, File folderToCompress) throws ZipException { + ZipParameters zipParameters = new ZipParameters(); + // COMP_DEFLATE is for compression + zipParameters.setCompressionMethod(CompressionMethod.DEFLATE); + // DEFLATE_LEVEL_ULTRA = maximum compression + zipParameters.setCompressionLevel(CompressionLevel.ULTRA); + + if (folderToCompress.exists() && folderToCompress.isDirectory()) { + zipFile.addFolder(folderToCompress, zipParameters); + } + } + + public static void openFolderInExplorer(String folder) throws IOException { + if (Desktop.isDesktopSupported()) { + Desktop.getDesktop().open(new File(folder)); + } else { + if (SystemUtils.IS_OS_WINDOWS) { + new ProcessBuilder("explorer.exe", "/open," + folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } else if (SystemUtils.IS_OS_MAC) { + new ProcessBuilder("usr/bin/open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } else if (SystemUtils.IS_OS_UNIX) { + tryUnixFileExplorers(folder); + } + } + } + + public static void tryUnixFileExplorers(String folder) throws IOException { + try { + new ProcessBuilder("nautilus", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (IOException e1) { + try { + new ProcessBuilder("gnome-open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (IOException e2) { + try { + new ProcessBuilder("kde-open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (IOException e3) { + new ProcessBuilder("caja", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + } + } + + public static boolean openFile(File fileToOpenWithOSViewer) { + boolean success = false; + if (Desktop.isDesktopSupported()) { + try { + Desktop.getDesktop().open(fileToOpenWithOSViewer); + success = true; + } catch (IOException ex) { + logger.warn("No application registered to open file {}", fileToOpenWithOSViewer.getAbsolutePath()); //$NON-NLS-1$ + } + } + return success; + } + + public static String testPostgreSQLConnection(String host, String port, String dbName, String username, + String password) { + String message = "Connection OK!"; + try { + Driver postgresDriver = new Driver(); + DriverManager.registerDriver(postgresDriver, null); + String url = "jdbc:postgresql://" + host + ":" + port + "/" + dbName; + try( Connection conn = DriverManager.getConnection(url, username, password) ){ + logger.debug("PostgreSQL Connection is valid! {}", conn.isValid(10) );// 10 sec + } + } catch (Exception e) { + logger.error("Error connecting to DB while testing", e); + message = e.getMessage(); + } + return message; + } + +} From 3eda4036594398a1cda29c6ad42fe16574b1c352 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:03 +0100 Subject: [PATCH 1287/1620] New translations ProcessMonitorDialog.java (English) --- .../earth/app/view/Messages_en.properties | 275 +++++------------- 1 file changed, 78 insertions(+), 197 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 8fa17ec627..aee91325a9 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,208 +1,89 @@ -package org.openforis.collect.earth.app; - -import java.awt.Desktop; -import java.awt.Font; -import java.awt.FontFormatException; -import java.awt.GraphicsEnvironment; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.sql.Connection; -import java.sql.DriverManager; -import java.util.Enumeration; +package org.openforis.collect.earth.app.view; + +import java.awt.Toolkit; import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import javax.swing.UIManager; +import javax.swing.JOptionPane; +import javax.swing.ProgressMonitor; +import javax.swing.SwingUtilities; -import org.apache.commons.codec.digest.DigestUtils; -import org.apache.commons.lang3.SystemUtils; -import org.openforis.collect.earth.app.EarthConstants.UI_LANGUAGE; -import org.openforis.collect.earth.app.view.Messages; -import org.postgresql.Driver; +import org.apache.commons.lang3.ArrayUtils; +import org.openforis.collect.io.data.CSVDataImportProcess; +import org.openforis.collect.io.metadata.parsing.ParsingError; +import org.openforis.collect.manager.process.AbstractProcess; +import org.openforis.collect.manager.process.ProcessStatus; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import net.lingala.zip4j.ZipFile; -import net.lingala.zip4j.exception.ZipException; -import net.lingala.zip4j.model.ZipParameters; -import net.lingala.zip4j.model.enums.CompressionLevel; -import net.lingala.zip4j.model.enums.CompressionMethod; - -public class CollectEarthUtils { - - private static final Logger logger = LoggerFactory.getLogger(CollectEarthUtils.class); - - private CollectEarthUtils() { - } - - public static String getMd5FromFolder(File folder) throws IOException { - - if (!folder.isDirectory()) { - throw new IllegalArgumentException("The file passed as an argument needs to be a folder!"); - } - StringBuilder md5Hex = new StringBuilder(); - - try( Stream paths = Files.walk(Paths.get(folder.toURI()), 3); ) { - List listFiles = paths.filter(Files::isRegularFile).map(Path::toFile) - .collect(Collectors.toList()); - for (File file : listFiles) { - md5Hex.append(DigestUtils.md5Hex(new FileInputStream(file))); - } - return DigestUtils.md5Hex(md5Hex.toString().getBytes()); - } - } - - public static String getMd5FromFile(String filePath) throws IOException { - return DigestUtils.md5Hex(new FileInputStream(new File(filePath))); - } - - public static void setFontDependingOnLanguaue(UI_LANGUAGE uiLanguage) { - if (uiLanguage == UI_LANGUAGE.LO) { - String ttfFileName = "Phetsarath_OT.ttf"; - // create the font - setUiFont(ttfFileName); - } else if (uiLanguage == UI_LANGUAGE.MN) { - String ttfFileName = "arhangai.ttf"; - // create the font - setUiFont(ttfFileName); - } else { - CollectEarthUtils.setUiFont(new javax.swing.plaf.FontUIResource("Arial Unicode MS", Font.PLAIN, 12)); - } - } - - public static void setUiFont(String ttfFileName) { - try { - // create the font to use. Specify the size! - InputStream fontStream = CollectEarthUtils.class.getResourceAsStream(ttfFileName); - Font laoFont = Font.createFont(Font.TRUETYPE_FONT, fontStream).deriveFont(12f); - GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); - // register the font - ge.registerFont(laoFont); - CollectEarthUtils.setUiFont(new javax.swing.plaf.FontUIResource(laoFont.getFontName(), Font.PLAIN, 12)); - } catch (IOException | FontFormatException e) { - logger.error("error setting the font " + ttfFileName, e); - } - - } - - private static void setUiFont(javax.swing.plaf.FontUIResource f) { - Enumeration keys = UIManager.getDefaults().keys(); - while (keys.hasMoreElements()) { - Object key = keys.nextElement(); - Object value = UIManager.get(key); - if (value instanceof javax.swing.plaf.FontUIResource) - UIManager.put(key, f); - } - } - - public static ZipFile addFileToZip(String pathToDestinationZip, File fileToAdd, String fileNameInZip) throws IOException { - File destinationZip = new File(pathToDestinationZip); - return addFileToZip(destinationZip, fileToAdd, fileNameInZip); - } - - public static ZipFile addFileToZip(File destinationZip, File fileToAdd, String fileNameInZip) throws IOException { - try( ZipFile zipFile = new ZipFile(destinationZip) ){ - ZipParameters zipParameters = new ZipParameters(); - // COMP_DEFLATE is for compression - zipParameters.setCompressionMethod(CompressionMethod.DEFLATE); - // DEFLATE_LEVEL_ULTRA = maximum compression - zipParameters.setCompressionLevel(CompressionLevel.ULTRA); - zipParameters.setFileNameInZip(fileNameInZip); - zipFile.addFile(fileToAdd, zipParameters); - return zipFile; - }catch(Exception e) { - logger.error("Error adding file to ZIP", e); - return null; - } - } - - public static String getComputerIp() { - try { - return InetAddress.getLocalHost().getHostAddress(); - } catch (final UnknownHostException e) { - logger.warn("Unknown IP address", e); //$NON-NLS-1$ - return Messages.getString("OptionWizard.11"); //$NON-NLS-1$ - } - } - - public static void addFolderToZip(ZipFile zipFile, File folderToCompress) throws ZipException { - ZipParameters zipParameters = new ZipParameters(); - // COMP_DEFLATE is for compression - zipParameters.setCompressionMethod(CompressionMethod.DEFLATE); - // DEFLATE_LEVEL_ULTRA = maximum compression - zipParameters.setCompressionLevel(CompressionLevel.ULTRA); - - if (folderToCompress.exists() && folderToCompress.isDirectory()) { - zipFile.addFolder(folderToCompress, zipParameters); - } - } - - public static void openFolderInExplorer(String folder) throws IOException { - if (Desktop.isDesktopSupported()) { - Desktop.getDesktop().open(new File(folder)); - } else { - if (SystemUtils.IS_OS_WINDOWS) { - new ProcessBuilder("explorer.exe", "/open," + folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } else if (SystemUtils.IS_OS_MAC) { - new ProcessBuilder("usr/bin/open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } else if (SystemUtils.IS_OS_UNIX) { - tryUnixFileExplorers(folder); - } - } - } - - public static void tryUnixFileExplorers(String folder) throws IOException { - try { - new ProcessBuilder("nautilus", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (IOException e1) { - try { - new ProcessBuilder("gnome-open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (IOException e2) { - try { - new ProcessBuilder("kde-open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (IOException e3) { - new ProcessBuilder("caja", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ +public abstract class ProcessMonitorDialog extends Thread { + + private static final int MAX_ERRORS_SHOWN = 10; + ProgressMonitor progressMonitor; + Logger logger = LoggerFactory.getLogger(ProcessMonitorDialog.class); + AbstractProcess process; + + + protected abstract String getProcessActionMessage(); + + public synchronized void monitorProgress() { + + new Thread("Monitoring progress of a process") { + @Override + public void run() { + boolean keepRunning = true; + while (keepRunning) { + if (process.getStatus() != null) { + SwingUtilities.invokeLater( () -> { + progressMonitor.setProgress(process.getStatus().getProgressPercent()); + progressMonitor.setNote(getProcessActionMessage() + process.getStatus().getProcessed() + "/" //$NON-NLS-1$ //$NON-NLS-2$ + + process.getStatus().getTotal()); + }); + + if (progressMonitor.isCanceled() || process.getStatus().isComplete() || process.getStatus().isError() ) { + SwingUtilities.invokeLater( () -> { + progressMonitor.close(); + if( process.getStatus().isError() ){ + StringBuilder parsisngErrorMsg = new StringBuilder("\r\n"); //$NON-NLS-1$ + if( process instanceof CSVDataImportProcess ){ + List errors = ((CSVDataImportProcess) process ).getStatus().getErrors(); + + int numberOfErrors = 0; + for (ParsingError parsingError : errors) { + parsisngErrorMsg.append(Messages.getString("ProcessMonitorDialog.1")).append( parsingError.getRow() ).append(" - ").append( parsingError.getMessage() ).append(", ").append( parsingError.getErrorType() ).append(Messages.getString("ProcessMonitorDialog.4")).append( ArrayUtils.toString(parsingError.getColumns()) ).append(Messages.getString("ProcessMonitorDialog.5")).append( ArrayUtils.toString(parsingError.getMessageArgs()) ).append("\r\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ + numberOfErrors ++; + if( numberOfErrors > MAX_ERRORS_SHOWN ){ + break; + } + } + + if( errors.size() > MAX_ERRORS_SHOWN ){ + parsisngErrorMsg.append( "More lines not shown . Total warnings : " + errors.size() ); + } + + } + + String primaryErrorMsg = process.getStatus().getErrorMessage(); + JOptionPane.showMessageDialog(null, "Attention : " + ( primaryErrorMsg!=null?primaryErrorMsg:"") + parsisngErrorMsg.toString() ); //$NON-NLS-1$ //$NON-NLS-2$ + } + }); + Toolkit.getDefaultToolkit().beep(); + if ( !process.getStatus().isComplete() && !process.getStatus().isError() ) { + process.cancel(); + logger.warn("Task canceled.\n"); //$NON-NLS-1$ + } + keepRunning = false; + } + } + + try { + Thread.sleep( 1000 ); + } catch (InterruptedException e) { + logger.error("Error whille waiting in thread", e); //$NON-NLS-1$ + Thread.currentThread().interrupt(); + } } } - } - } - - public static boolean openFile(File fileToOpenWithOSViewer) { - boolean success = false; - if (Desktop.isDesktopSupported()) { - try { - Desktop.getDesktop().open(fileToOpenWithOSViewer); - success = true; - } catch (IOException ex) { - logger.warn("No application registered to open file {}", fileToOpenWithOSViewer.getAbsolutePath()); //$NON-NLS-1$ - } - } - return success; - } - - public static String testPostgreSQLConnection(String host, String port, String dbName, String username, - String password) { - String message = "Connection OK!"; - try { - Driver postgresDriver = new Driver(); - DriverManager.registerDriver(postgresDriver, null); - String url = "jdbc:postgresql://" + host + ":" + port + "/" + dbName; - try( Connection conn = DriverManager.getConnection(url, username, password) ){ - logger.debug("PostgreSQL Connection is valid! {}", conn.isValid(10) );// 10 sec - } - } catch (Exception e) { - logger.error("Error connecting to DB while testing", e); - message = e.getMessage(); - } - return message; + }.start(); } } From aad8e8ba6a007024a56fe8828b399f3ea69b4b33 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:05 +0100 Subject: [PATCH 1288/1620] New translations SaikuAnalysisListener.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 70 ++++++++++++++++--- 1 file changed, 62 insertions(+), 8 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 0a8edd0b43..29c9a75479 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,9 +1,63 @@ -package org.openforis.collect.earth.ipcc.model; - -public class GrasslandSubdivision extends ManagementLandUseSubdivision{ - - public GrasslandSubdivision( String code, String name, ManagementType type) { - super( LandUseCategory.G, code, name, type); - } - +package org.openforis.collect.earth.app.view; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.JFrame; +import javax.swing.JOptionPane; + +import org.openforis.collect.earth.app.service.ExportType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SaikuAnalysisListener implements ActionListener { + private Logger logger = LoggerFactory.getLogger( SaikuAnalysisListener.class); + protected JFrame frame; + protected GenerateDatabaseStarter saikuStarter; + + public SaikuAnalysisListener(JFrame frame, GenerateDatabaseStarter saikuStarter) { + this.frame = frame; + this.saikuStarter = saikuStarter; + } + + @Override + public void actionPerformed(ActionEvent e) { + try { + + CollectEarthWindow.startWaiting(frame); + exportDataToRDB( true ); + }catch (Exception e1) { + logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ + } finally{ + CollectEarthWindow.endWaiting(frame); + } + } + + protected void exportDataToRDB(boolean startSaikuAfterDBExport) { + if( saikuStarter.isStarting() ){ + JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.57"), Messages.getString("CollectEarthWindow.58"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ + }else{ + + int shouldRefreshDb = JOptionPane.YES_OPTION; + + if( saikuStarter.shouldShowRdbGenerationOption( ExportType.SAIKU ) ){ + + String refresh = Messages.getString("SaikuAnalysisListener.0"); //$NON-NLS-1$ + String close = Messages.getString("SaikuAnalysisListener.1"); //$NON-NLS-1$ + String[] options = new String[]{ refresh,close}; + + + shouldRefreshDb = JOptionPane.showOptionDialog( + frame, Messages.getString("CollectEarthWindow.59"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.60"), //$NON-NLS-1$ + JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); + } + + if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ + saikuStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); + saikuStarter.initializeAndOpen( startSaikuAfterDBExport); + } + } + } + } \ No newline at end of file From f201cd59da721b6bbb99438fb266144d0b2e1289 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:06 +0100 Subject: [PATCH 1289/1620] New translations PropertiesDialog.java (French) --- .../earth/app/view/Messages_fr.properties | 1218 ++++++++++++++++- 1 file changed, 1209 insertions(+), 9 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 0a8edd0b43..7eb0424502 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,9 +1,1209 @@ -package org.openforis.collect.earth.ipcc.model; - -public class GrasslandSubdivision extends ManagementLandUseSubdivision{ - - public GrasslandSubdivision( String code, String name, ManagementType type) { - super( LandUseCategory.G, code, name, type); - } - -} \ No newline at end of file +package org.openforis.collect.earth.app.view; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.GridLayout; +import java.awt.Insets; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.io.IOException; +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; + +import javax.swing.AbstractAction; +import javax.swing.AbstractButton; +import javax.swing.ButtonGroup; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JPasswordField; +import javax.swing.JRadioButton; +import javax.swing.JScrollPane; +import javax.swing.JTabbedPane; +import javax.swing.JTextField; +import javax.swing.ListSelectionModel; +import javax.swing.ScrollPaneConstants; +import javax.swing.border.BevelBorder; +import javax.swing.border.Border; +import javax.swing.border.TitledBorder; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; + +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; +import org.openforis.collect.earth.app.EarthConstants.OperationMode; +import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.AnalysisSaikuService; +import org.openforis.collect.earth.app.service.EarthProjectsService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; +import org.openforis.collect.model.CollectSurvey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ +public class PropertiesDialog extends JDialog { + + private static final ComboBoxItem COMBO_BOX_ITEM_CENTRAL_POINT = new ComboBoxItem(1, + Messages.getString("OptionWizard.54")); + + private static final ComboBoxItem COMBO_BOX_ITEM_SQUARE = new ComboBoxItem(0, + Messages.getString("OptionWizard.53")); + + private static final long serialVersionUID = -6760020609229102842L; + + private final HashMap, JComponent[]> propertyToComponent = new HashMap<>(); + private final transient Logger logger = LoggerFactory.getLogger(this.getClass()); + + JPanel postgresPanel; + JPanel sqlitePanel; + + private transient LocalPropertiesService localPropertiesService; + + String backupFolder; + + private transient AnalysisSaikuService saikuService; + + private transient EarthProjectsService projectsService; + + private boolean restartRequired; + + private String oldSelectedDistance; + + private CollectSurvey surveyLoaded; + + private JButton applyChanges; + + public PropertiesDialog(JFrame frame, LocalPropertiesService localPropertiesService, + EarthProjectsService projectsService, String backupFolder, AnalysisSaikuService saikuService, + CollectSurvey surveyLoaded) { + super(frame, Messages.getString("OptionWizard.0")); //$NON-NLS-1$ + this.localPropertiesService = localPropertiesService; + this.projectsService = projectsService; + this.backupFolder = backupFolder; + this.saikuService = saikuService; + this.surveyLoaded = surveyLoaded; + this.setLocationRelativeTo(null); + this.setSize(new Dimension(600, 620)); + this.setModal(true); + this.setResizable(false); + initilizeInputs(); + buildMainPane(); + centreWindow(); + + } + + private void centreWindow() { + Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize(); + int x = (int) ((dimension.getWidth() - getWidth()) / 2); + int y = (int) ((dimension.getHeight() - getHeight()) / 2); + setLocation(x, y); + } + + private void buildMainPane() { + + final JPanel panel = new JPanel(new BorderLayout()); + panel.add(getOptionTabs(), BorderLayout.CENTER); + final JPanel buttonPanel = new JPanel(); + buttonPanel.add(getApplyChangesButton()); + buttonPanel.add(getCancelButton()); + panel.add(buttonPanel, BorderLayout.PAGE_END); + this.add(panel); + + } + + private void enableContainer(Container container, boolean enable) { + final Component[] components = container.getComponents(); + for (final Component component : components) { + component.setEnabled(enable); + if (component instanceof Container) { + enableContainer((Container) component, enable); + } + } + } + + private JComponent getBrowsersOptionsPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + final JPanel browserChooserPanel = new JPanel(); + final Border browserBorder = new TitledBorder(new BevelBorder(BevelBorder.LOWERED), + Messages.getString("OptionWizard.1")); //$NON-NLS-1$ + browserChooserPanel.setBorder(browserBorder); + GridLayout experimentLayout = new GridLayout(0,1); + browserChooserPanel.setLayout( experimentLayout ); + + final ButtonGroup browserChooser = new ButtonGroup(); + final JComponent[] browsers = propertyToComponent.get(EarthProperty.BROWSER_TO_USE); + + for (final JComponent browserRadioButton : browsers) { + browserChooserPanel.add(browserRadioButton); + browserChooser.add((AbstractButton) browserRadioButton); + + ((JRadioButton) browserRadioButton).addActionListener(e -> setRestartRequired(true)); + } + constraints.gridy++; + panel.add(browserChooserPanel, constraints); + + constraints.gridy++; + constraints.gridx = 0; + panel.add(propertyToComponent.get(EarthProperty.SAIKU_SERVER_FOLDER)[0], constraints); + + return panel; + } + + private JComponent getIntegrationsPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + panel.add(propertyToComponent.get(EarthProperty.OPEN_GEE_APP)[0], constraints); + + constraints.gridy++; + panel.add(propertyToComponent.get(EarthProperty.OPEN_BING_MAPS)[0], constraints); + + constraints.gridy++; + panel.add(propertyToComponent.get(EarthProperty.OPEN_EARTH_MAP)[0], constraints); + + + constraints.gridy++; + constraints.gridwidth = 1; + panel.add(propertyToComponent.get(EarthProperty.OPEN_PLANET_MAPS)[0], constraints); + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.PLANET_MAPS_MONHLY)[0], constraints); + + constraints.gridy++; + constraints.gridx = 0; + constraints.gridwidth = 1; + final JLabel label = new JLabel(Messages.getString("OptionWizard.101")); //$NON-NLS-1$ + panel.add(label, constraints); + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.PLANET_MAPS_KEY)[0], constraints); + + constraints.gridx = 0; + constraints.gridy++; + constraints.gridwidth = 2; + panel.add(propertyToComponent.get(EarthProperty.OPEN_MAXAR_SECUREWATCH)[0], constraints); + + constraints.gridy++; + constraints.gridwidth = 1; + final JLabel labelMaxar = new JLabel(Messages.getString("OptionWizard.1021")); //$NON-NLS-1$ + panel.add(labelMaxar, constraints); + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.MAXAR_SECUREWATCH_URL)[0], constraints); + + constraints.gridx = 0; + constraints.gridy++; + constraints.gridwidth = 2; + panel.add(propertyToComponent.get(EarthProperty.OPEN_YANDEX_MAPS)[0], constraints); + + constraints.gridy++; + panel.add(propertyToComponent.get(EarthProperty.OPEN_BAIDU_MAPS)[0], constraints); + + constraints.gridy++; + final JLabel label2 = new JLabel(Messages.getString("OptionWizard.103")); //$NON-NLS-1$ + panel.add(label2, constraints); + constraints.gridy++; + panel.add(propertyToComponent.get(EarthProperty.EXTRA_MAP_URL)[0], constraints); + + constraints.gridy++; + constraints.gridx = 0; + constraints.gridwidth = 2; + panel.add(propertyToComponent.get(EarthProperty.OPEN_GEE_CODE_EDITOR)[0], constraints); + + + return panel; + } + + + private Component getApplyChangesButton() { + if (applyChanges == null) { + applyChanges = new JButton(Messages.getString("OptionWizard.15")); + applyChanges.addActionListener( + new ApplyOptionChangesListener(this, localPropertiesService, propertyToComponent) { + @Override + protected void applyProperties() { + new Thread("Applying properties dialog") { + @Override + public void run() { + savePropertyValues(); + if (isRestartRequired()) { + + restartEarth(); + } else { + EarthApp.executeKmlLoadAsynchronously(PropertiesDialog.this); + } + } + }.start(); + } + }); + } + return applyChanges; + } + + public void closeDialog() { + this.dispose(); + } + + private Component getCancelButton() { + final JButton cancelButton = new JButton(Messages.getString("OptionWizard.24")); //$NON-NLS-1$ + cancelButton.addActionListener( e -> PropertiesDialog.this.dispose() ); + return cancelButton; + } + + private JComponent getOperationModePanel() { + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + final JPanel typeOfUsePanel = new JPanel(new GridBagLayout()); + final Border border = new TitledBorder(new BevelBorder(BevelBorder.LOWERED), + Messages.getString("OptionWizard.2")); //$NON-NLS-1$ + typeOfUsePanel.setBorder(border); + + JPanel serverPanel = getServerPanel(); + typeOfUsePanel.add(serverPanel, constraints); + + return typeOfUsePanel; + } + + private void enableDBOptions(boolean isPostgreDb) { + enableContainer(postgresPanel, isPostgreDb); + enableContainer(sqlitePanel, !isPostgreDb); + } + + private ActionListener getDbTypeListener() { + return e -> { + final JRadioButton theJRB = (JRadioButton) e.getSource(); + + boolean isPostgreDb = theJRB.getName().equals(CollectDBDriver.POSTGRESQL.name()); + enableDBOptions(isPostgreDb); + }; + } + + private JTabbedPane getOptionTabs() { + final JTabbedPane tabbedPane = new JTabbedPane(); + tabbedPane.setSize(550, 300); + final JComponent panel1 = getSampleDataPanel(); + tabbedPane.addTab(Messages.getString("OptionWizard.31"), panel1); //$NON-NLS-1$ + + final JComponent panel2 = getPlotOptionsPanel(); + tabbedPane.addTab(Messages.getString("OptionWizard.32"), panel2); //$NON-NLS-1$ + + final JComponent panel3 = getSurveyDefinitonPanel(); + tabbedPane.addTab(Messages.getString("OptionWizard.33"), panel3); //$NON-NLS-1$ + + final JComponent panel41 = getIntegrationsPanel(); + tabbedPane.addTab(Messages.getString("OptionWizard.34"), panel41); //$NON-NLS-1$ + + final JComponent panel4 = getBrowsersOptionsPanel(); + tabbedPane.addTab(Messages.getString("OptionWizard.104"), panel4); //$NON-NLS-1$ + + final JComponent panel5 = getOperationModePanelScroll(); + tabbedPane.addTab(Messages.getString("OptionWizard.25"), panel5); //$NON-NLS-1$ + + final JComponent panel6 = getProjectsPanelScroll(); + tabbedPane.addTab(Messages.getString("OptionWizard.40"), panel6); //$NON-NLS-1$ + + return tabbedPane; + } + + private JComponent getProjectsPanelScroll() { + final JComponent projectsPanel = getProjectsPanel(); + return new JScrollPane(projectsPanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + } + + private JComponent getProjectsPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.fill = GridBagConstraints.BOTH; + + JButton importNewButton = new JButton(Messages.getString("OptionWizard.41")); //$NON-NLS-1$ + importNewButton.addActionListener(new ApplyOptionChangesListener(this, localPropertiesService) { + + @Override + protected void applyProperties() { + final File[] selectedProjectFile = JFileChooserExistsAware.getFileChooserResults( + DataFormat.PROJECT_DEFINITION_FILE, false, false, null, localPropertiesService, + (JFrame) PropertiesDialog.this.getParent()); + + if (selectedProjectFile != null && selectedProjectFile.length == 1) { + try { + projectsService.loadCompressedProjectFile(selectedProjectFile[0]); + restartEarth(); + } catch (Exception e1) { + JOptionPane.showMessageDialog(PropertiesDialog.this, e1.getMessage(), + Messages.getString("OptionWizard.51"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + logger.error("Error importing project file " + selectedProjectFile[0].getAbsolutePath(), e1); //$NON-NLS-1$ + } + + } + } + }); + + panel.add(importNewButton, constraints); + + final JPanel typeOfDbPanel = new JPanel(new GridBagLayout()); + final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), + Messages.getString("OptionWizard.57")); //$NON-NLS-1$ + typeOfDbPanel.setBorder(border); + + constraints.gridx = 0; + constraints.gridy = 1; + panel.add(typeOfDbPanel, constraints); + + List listOfProjectsByName = new ArrayList<>(); + listOfProjectsByName.addAll(projectsService.getProjectList().keySet()); + Collections.sort(listOfProjectsByName); + final JList listOfProjects = new JList<>(listOfProjectsByName.toArray(new String[0])); // data has type Object[] + listOfProjects.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + listOfProjects.setLayoutOrientation(JList.VERTICAL); + listOfProjects.setVisibleRowCount(-1); + + JScrollPane listScroller = new JScrollPane(listOfProjects); + listScroller.setPreferredSize(new Dimension(250, 300)); + + constraints.gridy = 0; + constraints.gridx = GridBagConstraints.RELATIVE; + typeOfDbPanel.add(listScroller, constraints); + + final JButton openProject = new JButton(Messages.getString("OptionWizard.56")); //$NON-NLS-1$ + openProject.setEnabled(false); + openProject.addActionListener(new ApplyOptionChangesListener(this, localPropertiesService) { + + @Override + protected void applyProperties() { + + File projectFolder = projectsService.getProjectList().get(listOfProjects.getSelectedValue()); + + try { + projectsService.loadProjectInFolder(projectFolder); + restartEarth(); + } catch (Exception e1) { + JOptionPane.showMessageDialog(PropertiesDialog.this, e1.getMessage(), + Messages.getString("OptionWizard.55"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + logger.error("Error importing project folder " + projectFolder.getAbsolutePath(), e1); //$NON-NLS-1$ + } + + } + + }); + + listOfProjects.addListSelectionListener(e -> openProject.setEnabled(listOfProjects.getSelectedValue() != null) ); + + typeOfDbPanel.add(openProject); + + return panel; + } + + private JScrollPane getOperationModePanelScroll() { + final JComponent operationModePanel = getOperationModePanel(); + return new JScrollPane(operationModePanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + } + + private JComponent getPlotOptionsPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.fill = GridBagConstraints.HORIZONTAL; + + JLabel label = new JLabel("Plot shape"); + panel.add(label, constraints); + + constraints.gridx = 1; + JComboBox plotShape = (JComboBox) propertyToComponent.get(EarthProperty.SAMPLE_SHAPE)[0]; + panel.add(plotShape, constraints); + + constraints.gridx = 0; + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.35")); //$NON-NLS-1$ + panel.add(label, constraints); + + constraints.gridx = 1; + JComboBox numberPoints = (JComboBox) propertyToComponent + .get(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT)[0]; + panel.add(numberPoints, constraints); + + constraints.gridx = 0; + constraints.gridy++; + JLabel distanceOrRadiuslabel = new JLabel(Messages.getString("OptionWizard.36")); //$NON-NLS-1$ + panel.add(distanceOrRadiuslabel, constraints); + + constraints.gridx = 1; + JComboBox distanceBetweenPoints = (JComboBox) propertyToComponent + .get(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS)[0]; + panel.add(new JScrollPane(distanceBetweenPoints), constraints); + + constraints.gridx = 0; + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.37")); //$NON-NLS-1$ + panel.add(label, constraints); + constraints.gridx = 1; + JComboBox distanceToFrame = (JComboBox) propertyToComponent + .get(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES)[0]; + panel.add(new JScrollPane(distanceToFrame), constraints); + + constraints.gridx = 0; + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.95")); //$NON-NLS-1$ + panel.add(label, constraints); + constraints.gridx = 1; + JComboBox dotsSide = (JComboBox) propertyToComponent.get(EarthProperty.INNER_SUBPLOT_SIDE)[0]; + panel.add(new JScrollPane(dotsSide), constraints); + + constraints.gridx = 0; + constraints.gridy++; + label = new JLabel("Central plot side"); //$NON-NLS-1$ + panel.add(label, constraints); + constraints.gridx = 1; + JComboBox largeCentralPlotSide = (JComboBox) propertyToComponent.get(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)[0]; + panel.add(new JScrollPane(largeCentralPlotSide), constraints); + + + + constraints.gridx = 0; + constraints.gridy++; + label = new JLabel("Distance between plots in cluster"); + panel.add(label, constraints); + constraints.gridx = 1; + JComboBox plotDistanceInCluster = (JComboBox) propertyToComponent + .get(EarthProperty.DISTANCE_BETWEEN_PLOTS)[0]; + panel.add(new JScrollPane(plotDistanceInCluster), constraints); + + constraints.gridx = 0; + constraints.gridy++; + JLabel area = new JLabel( + "Area (hectares) : " + calculateArea(numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide)); + panel.add(area, constraints); + + ActionListener calculateAreas = actionPerformed -> area.setText("Area (hectares) : " + calculateArea(numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide)); + + plotShape.addActionListener( e-> + handleVisibilityPlotLayout(plotShape, numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide, + plotDistanceInCluster, area, distanceOrRadiuslabel, largeCentralPlotSide) + ); + + numberPoints.addActionListener(calculateAreas); + distanceBetweenPoints.addActionListener(calculateAreas); + distanceToFrame.addActionListener(calculateAreas); + + handleVisibilityPlotLayout(plotShape, numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide, + plotDistanceInCluster, area, distanceOrRadiuslabel, largeCentralPlotSide); + + return panel; + } + + public void handleVisibilityPlotLayout(JComboBox plotShape, JComboBox numberPoints, JComboBox distanceBetweenPoints, + JComboBox distanceToFrame, JComboBox dotsSide, JComboBox distanceBetweenPlots, JLabel area, + JLabel distanceOrRadiuslabel, JComboBox largeCentralPlotSide ) { + numberPoints.setEnabled(false); + distanceBetweenPoints.setEnabled(false); + distanceToFrame.setEnabled(false); + dotsSide.setEnabled(false); + area.setVisible(false); + distanceBetweenPlots.setVisible(false); + distanceBetweenPlots.setEnabled(false); + largeCentralPlotSide.setVisible( false ); + largeCentralPlotSide.setEnabled(false); + + if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE) || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE_WITH_LARGE_CENTRAL_PLOT) ) { + numberPoints.setEnabled(true); + distanceBetweenPoints.setEnabled(true); + distanceToFrame.setEnabled(true); + dotsSide.setEnabled(true); + area.setVisible(true); + distanceOrRadiuslabel.setText(Messages.getString("OptionWizard.36")); + + if( plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE_WITH_LARGE_CENTRAL_PLOT) ) { + largeCentralPlotSide.setVisible( true ); + largeCentralPlotSide.setEnabled(true); + } + + } else if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.CIRCLE) + || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.HEXAGON)) { + distanceBetweenPoints.setEnabled(true); + dotsSide.setEnabled(true); + numberPoints.setEnabled(true); + distanceOrRadiuslabel.setText("Radius"); + } else if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.NFI_THREE_CIRCLES) || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.NFI_FOUR_CIRCLES)) { + dotsSide.setEnabled(true); + distanceBetweenPoints.setEnabled(true); + distanceBetweenPlots.setVisible(true); + distanceBetweenPlots.setEnabled(true); + distanceOrRadiuslabel.setText("Radius of the plots"); + } + } + + private String calculateArea(JComboBox numberOfPoints, JComboBox distanceBetweenPoints, JComboBox distanceToFrame, JComboBox dotsSide) { + double side = 0; + try { + int numberOfPointsI = ((ComboBoxItem) numberOfPoints.getSelectedItem()).getNumberOfPoints(); + int distanceBetweenPointsI = Integer.parseInt((String) distanceBetweenPoints.getSelectedItem()); + int distanceToFrameI = Integer.parseInt((String) distanceToFrame.getSelectedItem()); + + if (numberOfPointsI == 0 || numberOfPointsI == 1) { + + side = 2d * distanceToFrameI; + if (oldSelectedDistance == null) { + oldSelectedDistance = (String) distanceBetweenPoints.getSelectedItem(); + distanceBetweenPoints.setEnabled(false); + } + distanceBetweenPoints.setSelectedItem("0"); + + if (numberOfPointsI == 0) { + dotsSide.setEnabled(false); + } else if (numberOfPointsI == 1) { + dotsSide.setEnabled(true); + } + + } else { + if (oldSelectedDistance != null) { + distanceBetweenPoints.setSelectedItem(oldSelectedDistance); + oldSelectedDistance = null; + } + + distanceBetweenPoints.setEnabled(true); + distanceToFrame.setEnabled(true); + dotsSide.setEnabled(true); + + double pointsByLines = Math.sqrt(numberOfPointsI); + side = 2d * distanceToFrameI + (pointsByLines - 1) * distanceBetweenPointsI; + + } + + } catch (RuntimeException e) { + logger.error("Error calculating area of the plot", e); + } + + DecimalFormat df = new DecimalFormat("###.##"); + return df.format(side * side / 10000d); + } + + private JPanel getPostgreSqlPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), + Messages.getString("OptionWizard.6")); //$NON-NLS-1$ + panel.setBorder(border); + + JLabel label = new JLabel(Messages.getString("OptionWizard.7")); //$NON-NLS-1$ + constraints.gridx = 0; + panel.add(label, constraints); + + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.DB_USERNAME)[0], constraints); + + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.8")); //$NON-NLS-1$ + constraints.gridx = 0; + panel.add(label, constraints); + + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.DB_PASSWORD)[0], constraints); + + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.9")); //$NON-NLS-1$ + constraints.gridx = 0; + panel.add(label, constraints); + + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.DB_NAME)[0], constraints); + + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.26")); //$NON-NLS-1$ + constraints.gridx = 0; + panel.add(label, constraints); + + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.DB_HOST)[0], constraints); + + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.29")); //$NON-NLS-1$ + constraints.gridx = 0; + panel.add(label, constraints); + + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.DB_PORT)[0], constraints); + + constraints.gridx = 2; + panel.add(new JLabel("Default: 5432"), constraints); + + constraints.gridy++; + constraints.gridx = 1; + JButton button = new JButton("Test Connection"); //$NON-NLS-1$ + button.addActionListener( e-> { + String host = ((JTextField) (propertyToComponent.get(EarthProperty.DB_HOST)[0])).getText(); + String port = ((JTextField) (propertyToComponent.get(EarthProperty.DB_PORT)[0])).getText(); + String dbName = ((JTextField) (propertyToComponent.get(EarthProperty.DB_NAME)[0])).getText(); + String username = ((JTextField) (propertyToComponent.get(EarthProperty.DB_USERNAME)[0])).getText(); + String password = ((JTextField) (propertyToComponent.get(EarthProperty.DB_PASSWORD)[0])).getText(); + + String message = CollectEarthUtils.testPostgreSQLConnection(host, port, dbName, username, password); + JOptionPane.showMessageDialog(PropertiesDialog.this.getOwner(), message, "PostgreSQL Connection test", + JOptionPane.INFORMATION_MESSAGE); + }); + panel.add(button, constraints); + + return panel; + } + + private JPanel getSqlLitePanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), + Messages.getString("OptionWizard.30")); //$NON-NLS-1$ + panel.setBorder(border); + + panel.add(propertyToComponent.get(EarthProperty.AUTOMATIC_BACKUP)[0], constraints); + constraints.gridx++; + panel.add(getOpenBackupFolderButton()); + return panel; + } + + private JComponent getSampleDataPanel() { + final JPlotCsvTable samplePlots = new JPlotCsvTable(localPropertiesService.getValue(EarthProperty.SAMPLE_FILE), + surveyLoaded); + + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.fill = GridBagConstraints.BOTH; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + + final JFilePicker refreshTableOnFileChange = getFilePickerSamplePlots(samplePlots); + + panel.add(refreshTableOnFileChange, constraints); + + samplePlots.setFillsViewportHeight(true); + constraints.gridy = 1; + + constraints.weightx = 1.0; + constraints.weighty = 1.0; + constraints.gridwidth = GridBagConstraints.REMAINDER; + constraints.gridheight = GridBagConstraints.REMAINDER; + + samplePlots.setPreferredScrollableViewportSize(samplePlots.getPreferredSize()); + + panel.add(new JScrollPane(samplePlots, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, + ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), constraints); + + return panel; + } + + private JFilePicker getFilePickerSamplePlots(final JPlotCsvTable samplePlots) { + final JFilePicker refreshTableOnFileChange = (JFilePicker) (propertyToComponent + .get(EarthProperty.SAMPLE_FILE)[0]); + refreshTableOnFileChange.addChangeListener(new DocumentListener() { + + @Override + public void changedUpdate(DocumentEvent e) { + // Do not react + } + + @Override + public void insertUpdate(DocumentEvent e) { + refreshTable(); + } + + @Override + public void removeUpdate(DocumentEvent e) { + // Do not react + } + + private void refreshTable() { + samplePlots.refreshTable(refreshTableOnFileChange.getSelectedFilePath()); + + // Do not let the user save the changes if the sample data is wrong!!! + getApplyChangesButton().setEnabled(samplePlots.isDataValid()); + } + }); + return refreshTableOnFileChange; + } + + private JPanel getServerPanel() { + + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + final JPanel typeOfDbPanel = new JPanel(new GridBagLayout()); + final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), + Messages.getString("OptionWizard.3")); //$NON-NLS-1$ + typeOfDbPanel.setBorder(border); + + JLabel label = new JLabel(Messages.getString("OptionWizard.4") + CollectEarthUtils.getComputerIp()); //$NON-NLS-1$ + typeOfDbPanel.add(label, constraints); + constraints.gridy++; + + label = new JLabel(Messages.getString("OptionWizard.5")); //$NON-NLS-1$ + constraints.gridx = 0; + typeOfDbPanel.add(label, constraints); + + constraints.gridx = 1; + typeOfDbPanel.add(propertyToComponent.get(EarthProperty.HOST_PORT_KEY)[0], constraints); + + constraints.gridwidth = GridBagConstraints.REMAINDER; + constraints.gridy++; + constraints.gridx = 0; + + final ButtonGroup bg = new ButtonGroup(); + final JComponent[] dbTypes = propertyToComponent.get(EarthProperty.DB_DRIVER); + + postgresPanel = getPostgreSqlPanel(); + sqlitePanel = getSqlLitePanel(); + + boolean usingPostgreSQL = localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.POSTGRESQL); + enableDBOptions(usingPostgreSQL); + + for (final JComponent typeRadioButton : dbTypes) { + final JRadioButton dbTypeButton = (JRadioButton) typeRadioButton; + bg.add(dbTypeButton); + typeOfDbPanel.add(dbTypeButton, constraints); + constraints.gridy++; + + dbTypeButton.addActionListener(getDbTypeListener()); + dbTypeButton.addActionListener(e -> setRestartRequired(true)); + + if (dbTypeButton.getName().equals(EarthConstants.CollectDBDriver.POSTGRESQL.name())) { + typeOfDbPanel.add(postgresPanel, constraints); + constraints.gridy++; + + } else { + typeOfDbPanel.add(sqlitePanel, constraints); + constraints.gridy++; + } + } + return typeOfDbPanel; + } + + private Component getOpenBackupFolderButton() { + + AbstractAction backupAction = new AbstractAction(Messages.getString("OptionWizard.10")) { //$NON-NLS-1$ + + private static final long serialVersionUID = 1L; + + @Override + public void actionPerformed(ActionEvent e) { + try { + + CollectEarthUtils.openFolderInExplorer(backupFolder); + + } catch (final IOException e1) { + logger.error("Error when opening the explorer window to visualize backups", e1); //$NON-NLS-1$ + } + } + + }; + + return new JButton(backupAction); + + } + + private JComponent getSurveyDefinitonPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.fill = GridBagConstraints.HORIZONTAL; + constraints.gridwidth = 2; + panel.add(propertyToComponent.get(EarthProperty.OPEN_BALLOON_IN_BROWSER)[0], constraints); + + constraints.gridy++; + constraints.gridwidth = 1; + final JLabel label = new JLabel(Messages.getString("OptionWizard.43")); //$NON-NLS-1$ + panel.add(label, constraints); + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.SURVEY_NAME)[0], constraints); + + constraints.gridy++; + constraints.gridwidth = GridBagConstraints.REMAINDER; + constraints.gridx = 0; + panel.add(propertyToComponent.get(EarthProperty.KML_TEMPLATE_KEY)[0], constraints); + + constraints.gridy++; + constraints.gridx = 0; + panel.add(propertyToComponent.get(EarthProperty.BALLOON_TEMPLATE_KEY)[0], constraints); + + constraints.gridy++; + constraints.gridx = 0; + + panel.add(propertyToComponent.get(EarthProperty.METADATA_FILE)[0], constraints); + + return panel; + } + + private void initilizeInputs() { + + final JCheckBox backupCheckbox = new JCheckBox(Messages.getString("OptionWizard.44")); //$NON-NLS-1$ + backupCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.AUTOMATIC_BACKUP))); + propertyToComponent.put(EarthProperty.AUTOMATIC_BACKUP, new JComponent[] { backupCheckbox }); + + final JCheckBox openEarthEngineCheckbox = new JCheckBox(Messages.getString("OptionWizard.45")); //$NON-NLS-1$ + openEarthEngineCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_EXPLORER))); + propertyToComponent.put(EarthProperty.OPEN_GEE_EXPLORER, new JComponent[] { openEarthEngineCheckbox }); + + final JCheckBox openGEEAppCheckbox = new JCheckBox("Google Earth Engine APP (no sign-in)"); //$NON-NLS-1$ + openGEEAppCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_APP))); + propertyToComponent.put(EarthProperty.OPEN_GEE_APP, new JComponent[] { openGEEAppCheckbox }); + + final JCheckBox openTimelapseCheckbox = new JCheckBox(Messages.getString("OptionWizard.46")); //$NON-NLS-1$ + openTimelapseCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_TIMELAPSE))); + propertyToComponent.put(EarthProperty.OPEN_TIMELAPSE, new JComponent[] { openTimelapseCheckbox }); + + final JCheckBox openEarthMapCheckbox = new JCheckBox(Messages.getString("OptionWizard.105")); //$NON-NLS-1$ + openEarthMapCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_EARTH_MAP))); + propertyToComponent.put(EarthProperty.OPEN_EARTH_MAP, new JComponent[] { openEarthMapCheckbox }); + + final JCheckBox openBingCheckbox = new JCheckBox(Messages.getString("OptionWizard.47")); //$NON-NLS-1$ + openBingCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BING_MAPS))); + propertyToComponent.put(EarthProperty.OPEN_BING_MAPS, new JComponent[] { openBingCheckbox }); + + final JCheckBox openPlanetCheckbox = new JCheckBox(Messages.getString("OptionWizard.100")); //$NON-NLS-1$ + openPlanetCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_PLANET_MAPS))); + propertyToComponent.put(EarthProperty.OPEN_PLANET_MAPS, new JComponent[] { openPlanetCheckbox }); + + final JCheckBox openMonthlyNICFICheckbox = new JCheckBox(Messages.getString("OptionWizard.110")); //$NON-NLS-1$ + openMonthlyNICFICheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.PLANET_MAPS_MONHLY))); + propertyToComponent.put(EarthProperty.PLANET_MAPS_MONHLY, new JComponent[] { openMonthlyNICFICheckbox }); + + + final JPasswordField planetAPIKeyTextField = new JPasswordField( + localPropertiesService.getValue(EarthProperty.PLANET_MAPS_KEY)); + planetAPIKeyTextField.setMinimumSize(new Dimension( 250, 20 )); + planetAPIKeyTextField.setEnabled( localPropertiesService.isPlanetMapsSupported() ); + propertyToComponent.put(EarthProperty.PLANET_MAPS_KEY, new JComponent[] { planetAPIKeyTextField }); + + openMonthlyNICFICheckbox.setEnabled( openPlanetCheckbox.isSelected() ); + planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ); + + openPlanetCheckbox.addActionListener( e-> { + planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ); + openMonthlyNICFICheckbox.setEnabled( openPlanetCheckbox.isSelected() ); + }); + openMonthlyNICFICheckbox.addActionListener( e-> planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ) ); + + + final JCheckBox openSecureWatchCheckbox = new JCheckBox(Messages.getString("OptionWizard.102")); //$NON-NLS-1$ + openSecureWatchCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_MAXAR_SECUREWATCH))); + propertyToComponent.put(EarthProperty.OPEN_MAXAR_SECUREWATCH, new JComponent[] { openSecureWatchCheckbox }); + + final JTextField secureWatchUrlTextField = new JTextField( + localPropertiesService.getValue(EarthProperty.MAXAR_SECUREWATCH_URL)); + secureWatchUrlTextField.setMinimumSize(new Dimension( 250, 20 )); + propertyToComponent.put(EarthProperty.MAXAR_SECUREWATCH_URL, new JComponent[] { secureWatchUrlTextField }); + secureWatchUrlTextField.setEnabled( localPropertiesService.isSecureWatchSupported() ); + propertyToComponent.put(EarthProperty.MAXAR_SECUREWATCH_URL, new JComponent[] { secureWatchUrlTextField }); + openSecureWatchCheckbox.addActionListener( e -> secureWatchUrlTextField.setEnabled( openSecureWatchCheckbox.isSelected() ) ); + + final JTextField extraUrlTextField = new JTextField( + localPropertiesService.getValue(EarthProperty.EXTRA_MAP_URL)); + extraUrlTextField.setMinimumSize(new Dimension( 250, 20 )); + propertyToComponent.put(EarthProperty.EXTRA_MAP_URL, new JComponent[] { extraUrlTextField }); + + final JCheckBox openBaiduCheckbox = new JCheckBox("Open Baidu Maps"); + openBaiduCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BAIDU_MAPS))); + propertyToComponent.put(EarthProperty.OPEN_BAIDU_MAPS, new JComponent[] { openBaiduCheckbox }); + + final JCheckBox openYandexCheckbox = new JCheckBox("Open Yandex maps for the plot area"); + openYandexCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_YANDEX_MAPS))); + propertyToComponent.put(EarthProperty.OPEN_YANDEX_MAPS, new JComponent[] { openYandexCheckbox }); + + final JCheckBox openHereCheckbox = new JCheckBox(Messages.getString("OptionWizard.59")); //$NON-NLS-1$ + openHereCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_HERE_MAPS))); + propertyToComponent.put(EarthProperty.OPEN_HERE_MAPS, new JComponent[] { openHereCheckbox }); + + final JCheckBox openGeePlaygroundCheckbox = new JCheckBox(Messages.getString("OptionWizard.58")); //$NON-NLS-1$ + openGeePlaygroundCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_CODE_EDITOR))); + propertyToComponent.put(EarthProperty.OPEN_GEE_CODE_EDITOR, new JComponent[] { openGeePlaygroundCheckbox }); + + final JCheckBox openInSeparateWindowCheckbox = new JCheckBox(Messages.getString("OptionWizard.48")); //$NON-NLS-1$ + openInSeparateWindowCheckbox.setSelected( + Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BALLOON_IN_BROWSER))); + propertyToComponent.put(EarthProperty.OPEN_BALLOON_IN_BROWSER, + new JComponent[] { openInSeparateWindowCheckbox }); + + final JFilePicker csvWithPlotData = new JFilePicker(Messages.getString("OptionWizard.49"), //$NON-NLS-1$ + localPropertiesService.getValue(EarthProperty.SAMPLE_FILE), Messages.getString("OptionWizard.50"), DlgMode.MODE_OPEN); // $NON-NLS-1$ + + csvWithPlotData.addFileTypeFilter(".csv,.ced", Messages.getString("OptionWizard.52"), true); //$NON-NLS-1$ //$NON-NLS-2$ + propertyToComponent.put(EarthProperty.SAMPLE_FILE, new JComponent[] { csvWithPlotData }); + + final JComboBox plotShape = new JComboBox<>(SAMPLE_SHAPE.values()); + try { + plotShape.setSelectedItem(SAMPLE_SHAPE.valueOf(localPropertiesService.getValue(EarthProperty.SAMPLE_SHAPE))); + } catch (Exception e1) { + logger.error("The selected shape type is not supported " + localPropertiesService.getValue(EarthProperty.SAMPLE_SHAPE), e1 ); + } + propertyToComponent.put(EarthProperty.SAMPLE_SHAPE, new JComponent[] { plotShape }); + + final JComboBox comboNumberOfPoints = new JComboBox<>( + new ComboBoxItem[] { COMBO_BOX_ITEM_SQUARE, COMBO_BOX_ITEM_CENTRAL_POINT, new ComboBoxItem(4, "2x2"), //$NON-NLS-1$ //$NON-NLS-2$ + // //$NON-NLS-3$ + new ComboBoxItem(9, "3x3"), new ComboBoxItem(16, "4x4"), new ComboBoxItem(25, "5x5"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + new ComboBoxItem(36, "6x6"), //$NON-NLS-1$ + new ComboBoxItem(49, "7x7") }); //$NON-NLS-1$ + if( StringUtils.isNotBlank( localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT) ) ){ + try { + comboNumberOfPoints.setSelectedItem(new ComboBoxItem( + Integer.parseInt(localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT)), + "")); //$NON-NLS-1$ + } catch (NumberFormatException e1) { + logger.error("This should be a number {}", localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT), e1); + } + } + propertyToComponent.put(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT, + new JComponent[] { comboNumberOfPoints }); + + final String[] listOfNumbers = new String[1500]; + final String[] listOfNumbersFromTwo = new String[1500]; + + for (int index = 0; index < listOfNumbers.length; index++) { + listOfNumbers[index] = Integer.toString( index ); //$NON-NLS-1$ + listOfNumbersFromTwo[index] = Integer.toString( index + 2 ); //$NON-NLS-1$ + } + + final JComboBox listOfDistanceBetweenPoints = new JComboBox<>(listOfNumbersFromTwo); + listOfDistanceBetweenPoints + .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS)); + listOfDistanceBetweenPoints.setAutoscrolls(true); + + propertyToComponent.put(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS, + new JComponent[] { listOfDistanceBetweenPoints }); + + final JComboBox listOfDistanceBetweenPlots = new JComboBox<>(listOfNumbersFromTwo); + listOfDistanceBetweenPlots + .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS)); + listOfDistanceBetweenPlots.setAutoscrolls(true); + + propertyToComponent.put(EarthProperty.DISTANCE_BETWEEN_PLOTS, new JComponent[] { listOfDistanceBetweenPlots }); + + final JComboBox listOfDistanceToBorder = new JComboBox<>(listOfNumbers); + listOfDistanceToBorder + .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES)); + listOfDistanceToBorder.setAutoscrolls(true); + + propertyToComponent.put(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES, new JComponent[] { listOfDistanceToBorder }); + + final JComboBox listOfSizeofSamplingDot = new JComboBox<>(listOfNumbersFromTwo); + listOfSizeofSamplingDot.setSelectedItem(localPropertiesService.getValue(EarthProperty.INNER_SUBPLOT_SIDE)); + listOfSizeofSamplingDot.setAutoscrolls(true); + + propertyToComponent.put(EarthProperty.INNER_SUBPLOT_SIDE, new JComponent[] { listOfSizeofSamplingDot }); + + final JComboBox listOfSideOflargeCentralPlot = new JComboBox<>(listOfNumbersFromTwo); + listOfSideOflargeCentralPlot.setSelectedItem(localPropertiesService.getValue(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)); + listOfSideOflargeCentralPlot.setAutoscrolls(true); + + propertyToComponent.put(EarthProperty.LARGE_CENTRAL_PLOT_SIDE, new JComponent[] { listOfSideOflargeCentralPlot }); + + + final JRadioButton chromeChooser = new JRadioButton("Chrome"); //$NON-NLS-1$ + chromeChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() + .equals(EarthConstants.CHROME_BROWSER)); + chromeChooser.setName(EarthConstants.CHROME_BROWSER); + + final JRadioButton firefoxChooser = new JRadioButton("Firefox"); //$NON-NLS-1$ + firefoxChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() + .equals(EarthConstants.FIREFOX_BROWSER)); + firefoxChooser.setName(EarthConstants.FIREFOX_BROWSER); + + final JRadioButton edgeChooser = new JRadioButton("Edge"); //$NON-NLS-1$ + edgeChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() + .equals(EarthConstants.EDGE_BROWSER)); + edgeChooser.setName(EarthConstants.EDGE_BROWSER); + + propertyToComponent.put(EarthProperty.BROWSER_TO_USE, new JComponent[] { firefoxChooser, chromeChooser, edgeChooser}); + final JFilePicker saikuPath = new JFilePicker(Messages.getString("OptionWizard.65"), //$NON-NLS-1$ + localPropertiesService.getValue(EarthProperty.SAIKU_SERVER_FOLDER), + Messages.getString("OptionWizard.66"), DlgMode.MODE_OPEN); //$NON-NLS-1$ + saikuPath.setFolderChooser(); + saikuPath.addChangeListener(new DocumentListener() { + + private void showSaikuWarning() { + final File saikuFolder = new File(saikuPath.getSelectedFilePath()); + if ( !saikuService.isSaikuFolder(saikuFolder)) { + JOptionPane.showMessageDialog(PropertiesDialog.this, Messages.getString("OptionWizard.27"), //$NON-NLS-1$ + Messages.getString("OptionWizard.28"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ + saikuPath.getTextField().setBackground(CollectEarthWindow.ERROR_COLOR); + } else { + saikuPath.getTextField().setBackground(Color.white); + } + } + + @Override + public void removeUpdate(DocumentEvent e) { + // Do not react + } + + @Override + public void insertUpdate(DocumentEvent e) { + showSaikuWarning(); + } + + @Override + public void changedUpdate(DocumentEvent e) { + // Do not react + } + }); + propertyToComponent.put(EarthProperty.SAIKU_SERVER_FOLDER, new JComponent[] { saikuPath }); + + final JFilePicker kmlTemplatePath = new JFilePicker(Messages.getString("OptionWizard.79"), //$NON-NLS-1$ + localPropertiesService.getValue(EarthProperty.KML_TEMPLATE_KEY), Messages.getString("OptionWizard.80"), //$NON-NLS-1$ + DlgMode.MODE_OPEN); + kmlTemplatePath.addFileTypeFilter(".fmt", Messages.getString("OptionWizard.82"), true); //$NON-NLS-1$ //$NON-NLS-2$ + propertyToComponent.put(EarthProperty.KML_TEMPLATE_KEY, new JComponent[] { kmlTemplatePath }); + + final JFilePicker htmlBalloonPath = new JFilePicker(Messages.getString("OptionWizard.83"), //$NON-NLS-1$ + localPropertiesService.getValue(EarthProperty.BALLOON_TEMPLATE_KEY), + Messages.getString("OptionWizard.84"), DlgMode.MODE_OPEN); //$NON-NLS-1$ + htmlBalloonPath.addFileTypeFilter(".html,.htm", Messages.getString("OptionWizard.86"), true); //$NON-NLS-1$ //$NON-NLS-2$ + propertyToComponent.put(EarthProperty.BALLOON_TEMPLATE_KEY, new JComponent[] { htmlBalloonPath }); + + final JFilePicker idmPath = new JFilePicker(Messages.getString("OptionWizard.87"), //$NON-NLS-1$ + localPropertiesService.getImdFile(), Messages.getString("OptionWizard.88"), DlgMode.MODE_OPEN); //$NON-NLS-1$ + idmPath.addFileTypeFilter(".xml", Messages.getString("OptionWizard.90"), true); //$NON-NLS-1$ //$NON-NLS-2$ + propertyToComponent.put(EarthProperty.METADATA_FILE, new JComponent[] { idmPath }); + + final JTextField surveyNameTextField = new JTextField( + localPropertiesService.getValue(EarthProperty.SURVEY_NAME)); + surveyNameTextField.setEnabled(false); + propertyToComponent.put(EarthProperty.SURVEY_NAME, new JComponent[] { surveyNameTextField }); + + // Database options + + final JRadioButton instanceTypeServer = new JRadioButton(Messages.getString("OptionWizard.91")); //$NON-NLS-1$ + instanceTypeServer.setSelected(localPropertiesService.getOperationMode().equals(OperationMode.SERVER_MODE)); + instanceTypeServer.setName(EarthConstants.OperationMode.SERVER_MODE.name()); + + final JRadioButton instanceTypeClient = new JRadioButton(Messages.getString("OptionWizard.92")); //$NON-NLS-1$ + instanceTypeClient.setSelected(localPropertiesService.getOperationMode().equals(OperationMode.CLIENT_MODE)); + instanceTypeClient.setName(EarthConstants.OperationMode.CLIENT_MODE.name()); + propertyToComponent.put(EarthProperty.OPERATION_MODE, + new JComponent[] { instanceTypeServer, instanceTypeClient }); + + final JTextField collectEarthServerIp = new JTextField(localPropertiesService.getValue(EarthProperty.HOST_KEY)); + propertyToComponent.put(EarthProperty.HOST_KEY, new JComponent[] { collectEarthServerIp }); + + final JTextField collectEarthServerIpPort = new JTextField(localPropertiesService.getPort()); + final JTextField collectEarthServerLocalPort = new JTextField( + localPropertiesService.getValue(EarthProperty.HOST_PORT_KEY)); + propertyToComponent.put(EarthProperty.HOST_PORT_KEY, + new JComponent[] { collectEarthServerIpPort, collectEarthServerLocalPort }); + + final JRadioButton sqliteDbType = new JRadioButton(Messages.getString("OptionWizard.93")); //$NON-NLS-1$ + sqliteDbType.setSelected(localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.SQLITE)); + sqliteDbType.setName(CollectDBDriver.SQLITE.name()); + + final JRadioButton postgresDbType = new JRadioButton(Messages.getString("OptionWizard.94")); //$NON-NLS-1$ + boolean usingPostgreSQL = localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.POSTGRESQL); + postgresDbType.setSelected(usingPostgreSQL); + postgresDbType.setName(CollectDBDriver.POSTGRESQL.name()); + propertyToComponent.put(EarthProperty.DB_DRIVER, new JComponent[] { sqliteDbType, postgresDbType }); + + final JTextField dbUserName = new JTextField(localPropertiesService.getValue(EarthProperty.DB_USERNAME)); + propertyToComponent.put(EarthProperty.DB_USERNAME, new JComponent[] { dbUserName }); + + final JTextField dbPassword = new JTextField(localPropertiesService.getValue(EarthProperty.DB_PASSWORD)); + propertyToComponent.put(EarthProperty.DB_PASSWORD, new JComponent[] { dbPassword }); + + final JTextField dbName = new JTextField(localPropertiesService.getValue(EarthProperty.DB_NAME)); + propertyToComponent.put(EarthProperty.DB_NAME, new JComponent[] { dbName }); + + final JTextField dbHost = new JTextField(localPropertiesService.getValue(EarthProperty.DB_HOST)); + propertyToComponent.put(EarthProperty.DB_HOST, new JComponent[] { dbHost }); + + final JTextField dbPort = new JTextField(localPropertiesService.getValue(EarthProperty.DB_PORT)); + propertyToComponent.put(EarthProperty.DB_PORT, new JComponent[] { dbPort }); + + } + + public boolean isRestartRequired() { + return restartRequired; + } + + public void setRestartRequired(boolean restartRequired) { + this.restartRequired = restartRequired; + } + +} From b22f38753acdd152c30e64aa5baa6179ca900a2e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:08 +0100 Subject: [PATCH 1290/1620] New translations PropertiesDialog.java (Spanish) --- .../earth/app/view/Messages_es.properties | 1309 +++++++++++++++-- 1 file changed, 1209 insertions(+), 100 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 572652125f..7eb0424502 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,100 +1,1209 @@ -package org.openforis.collect.earth.ipcc.controller; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; -import org.openforis.collect.earth.ipcc.model.ForestSubdivision; -import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; -import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; -import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; -import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.thoughtworks.xstream.XStream; - - -public class LandUseSubdivisionUtils { - - private static Logger logger = LoggerFactory.getLogger( LandUseSubdivisionUtils.class ); - - static List landUseSubdivisions; - - public static List> getSubdivisionsByCategory(LandUseCategory category) { - List> subdivisionsInCategory = new ArrayList>(); - for (LandUseSubdivision landUseSubdivision : landUseSubdivisions) { - if( landUseSubdivision.getCategory().equals( category ) ) { - subdivisionsInCategory.add(landUseSubdivision); - } - } - - return subdivisionsInCategory; - } - - public static void setSubdivisionType(LandUseSubdivision subdivision, Object type) { - landUseSubdivisions.get( landUseSubdivisions.indexOf(subdivision)).setType( type); - } - - public static List getLandUseSubdivisions() { - return landUseSubdivisions; - } - - public static void setLandUseSubdivisions(List landUseSubdivisions) { - LandUseSubdivisionUtils.landUseSubdivisions = landUseSubdivisions; - } - - public static LandUseSubdivision getSubdivision( String luCategoryCode, String luSubdivisionCode ) { - - LandUseCategory[] luCategories = LandUseCategory.values(); - LandUseCategory landUseCategory = null; - for (LandUseCategory luCat : luCategories) { - if( luCat.getCode().equals(luCategoryCode)) { - landUseCategory = luCat; - } - } - - for (LandUseSubdivision landUseSubdiv : landUseSubdivisions) { - if( landUseSubdiv.getCategory().equals(landUseCategory) && landUseSubdiv.getCode().equals( luSubdivisionCode ) ) { - return landUseSubdiv; - } - - } - - logger.info("No LU Subdivision found for category : " + luCategoryCode + " / subdivision code : " + luSubdivisionCode ); - return null; - } - - public static File getSubdivisionsXML() throws IOException { - XStream xStream = new XStream(); - - final String subdivisionLabel = "Subdivision"; - - xStream.alias(subdivisionLabel, ForestSubdivision.class); - xStream.alias(subdivisionLabel, CroplandSubdivision.class); - xStream.alias(subdivisionLabel, SettlementSubdivision.class); - xStream.alias(subdivisionLabel, OtherlandSubdivision.class); - xStream.alias(subdivisionLabel, GrasslandSubdivision.class); - xStream.alias(subdivisionLabel, WetlandSubdivision.class); - - xStream.setMode(XStream.NO_REFERENCES); - String xmlSchema = xStream.toXML(getLandUseSubdivisions()); - - File xmlFileDestination = File.createTempFile( "subdivisionsInSurvey", ".xml" ); - xmlFileDestination.deleteOnExit(); - try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { - byte[] strToBytes = xmlSchema.getBytes(); - outputStream.write(strToBytes); - } catch (Exception e) { - logger.error("Error saving data to file", e); - } - - return xmlFileDestination; - } - -} +package org.openforis.collect.earth.app.view; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.GridLayout; +import java.awt.Insets; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.io.IOException; +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; + +import javax.swing.AbstractAction; +import javax.swing.AbstractButton; +import javax.swing.ButtonGroup; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JPasswordField; +import javax.swing.JRadioButton; +import javax.swing.JScrollPane; +import javax.swing.JTabbedPane; +import javax.swing.JTextField; +import javax.swing.ListSelectionModel; +import javax.swing.ScrollPaneConstants; +import javax.swing.border.BevelBorder; +import javax.swing.border.Border; +import javax.swing.border.TitledBorder; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; + +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; +import org.openforis.collect.earth.app.EarthConstants.OperationMode; +import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.AnalysisSaikuService; +import org.openforis.collect.earth.app.service.EarthProjectsService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; +import org.openforis.collect.model.CollectSurvey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ +public class PropertiesDialog extends JDialog { + + private static final ComboBoxItem COMBO_BOX_ITEM_CENTRAL_POINT = new ComboBoxItem(1, + Messages.getString("OptionWizard.54")); + + private static final ComboBoxItem COMBO_BOX_ITEM_SQUARE = new ComboBoxItem(0, + Messages.getString("OptionWizard.53")); + + private static final long serialVersionUID = -6760020609229102842L; + + private final HashMap, JComponent[]> propertyToComponent = new HashMap<>(); + private final transient Logger logger = LoggerFactory.getLogger(this.getClass()); + + JPanel postgresPanel; + JPanel sqlitePanel; + + private transient LocalPropertiesService localPropertiesService; + + String backupFolder; + + private transient AnalysisSaikuService saikuService; + + private transient EarthProjectsService projectsService; + + private boolean restartRequired; + + private String oldSelectedDistance; + + private CollectSurvey surveyLoaded; + + private JButton applyChanges; + + public PropertiesDialog(JFrame frame, LocalPropertiesService localPropertiesService, + EarthProjectsService projectsService, String backupFolder, AnalysisSaikuService saikuService, + CollectSurvey surveyLoaded) { + super(frame, Messages.getString("OptionWizard.0")); //$NON-NLS-1$ + this.localPropertiesService = localPropertiesService; + this.projectsService = projectsService; + this.backupFolder = backupFolder; + this.saikuService = saikuService; + this.surveyLoaded = surveyLoaded; + this.setLocationRelativeTo(null); + this.setSize(new Dimension(600, 620)); + this.setModal(true); + this.setResizable(false); + initilizeInputs(); + buildMainPane(); + centreWindow(); + + } + + private void centreWindow() { + Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize(); + int x = (int) ((dimension.getWidth() - getWidth()) / 2); + int y = (int) ((dimension.getHeight() - getHeight()) / 2); + setLocation(x, y); + } + + private void buildMainPane() { + + final JPanel panel = new JPanel(new BorderLayout()); + panel.add(getOptionTabs(), BorderLayout.CENTER); + final JPanel buttonPanel = new JPanel(); + buttonPanel.add(getApplyChangesButton()); + buttonPanel.add(getCancelButton()); + panel.add(buttonPanel, BorderLayout.PAGE_END); + this.add(panel); + + } + + private void enableContainer(Container container, boolean enable) { + final Component[] components = container.getComponents(); + for (final Component component : components) { + component.setEnabled(enable); + if (component instanceof Container) { + enableContainer((Container) component, enable); + } + } + } + + private JComponent getBrowsersOptionsPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + final JPanel browserChooserPanel = new JPanel(); + final Border browserBorder = new TitledBorder(new BevelBorder(BevelBorder.LOWERED), + Messages.getString("OptionWizard.1")); //$NON-NLS-1$ + browserChooserPanel.setBorder(browserBorder); + GridLayout experimentLayout = new GridLayout(0,1); + browserChooserPanel.setLayout( experimentLayout ); + + final ButtonGroup browserChooser = new ButtonGroup(); + final JComponent[] browsers = propertyToComponent.get(EarthProperty.BROWSER_TO_USE); + + for (final JComponent browserRadioButton : browsers) { + browserChooserPanel.add(browserRadioButton); + browserChooser.add((AbstractButton) browserRadioButton); + + ((JRadioButton) browserRadioButton).addActionListener(e -> setRestartRequired(true)); + } + constraints.gridy++; + panel.add(browserChooserPanel, constraints); + + constraints.gridy++; + constraints.gridx = 0; + panel.add(propertyToComponent.get(EarthProperty.SAIKU_SERVER_FOLDER)[0], constraints); + + return panel; + } + + private JComponent getIntegrationsPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + panel.add(propertyToComponent.get(EarthProperty.OPEN_GEE_APP)[0], constraints); + + constraints.gridy++; + panel.add(propertyToComponent.get(EarthProperty.OPEN_BING_MAPS)[0], constraints); + + constraints.gridy++; + panel.add(propertyToComponent.get(EarthProperty.OPEN_EARTH_MAP)[0], constraints); + + + constraints.gridy++; + constraints.gridwidth = 1; + panel.add(propertyToComponent.get(EarthProperty.OPEN_PLANET_MAPS)[0], constraints); + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.PLANET_MAPS_MONHLY)[0], constraints); + + constraints.gridy++; + constraints.gridx = 0; + constraints.gridwidth = 1; + final JLabel label = new JLabel(Messages.getString("OptionWizard.101")); //$NON-NLS-1$ + panel.add(label, constraints); + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.PLANET_MAPS_KEY)[0], constraints); + + constraints.gridx = 0; + constraints.gridy++; + constraints.gridwidth = 2; + panel.add(propertyToComponent.get(EarthProperty.OPEN_MAXAR_SECUREWATCH)[0], constraints); + + constraints.gridy++; + constraints.gridwidth = 1; + final JLabel labelMaxar = new JLabel(Messages.getString("OptionWizard.1021")); //$NON-NLS-1$ + panel.add(labelMaxar, constraints); + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.MAXAR_SECUREWATCH_URL)[0], constraints); + + constraints.gridx = 0; + constraints.gridy++; + constraints.gridwidth = 2; + panel.add(propertyToComponent.get(EarthProperty.OPEN_YANDEX_MAPS)[0], constraints); + + constraints.gridy++; + panel.add(propertyToComponent.get(EarthProperty.OPEN_BAIDU_MAPS)[0], constraints); + + constraints.gridy++; + final JLabel label2 = new JLabel(Messages.getString("OptionWizard.103")); //$NON-NLS-1$ + panel.add(label2, constraints); + constraints.gridy++; + panel.add(propertyToComponent.get(EarthProperty.EXTRA_MAP_URL)[0], constraints); + + constraints.gridy++; + constraints.gridx = 0; + constraints.gridwidth = 2; + panel.add(propertyToComponent.get(EarthProperty.OPEN_GEE_CODE_EDITOR)[0], constraints); + + + return panel; + } + + + private Component getApplyChangesButton() { + if (applyChanges == null) { + applyChanges = new JButton(Messages.getString("OptionWizard.15")); + applyChanges.addActionListener( + new ApplyOptionChangesListener(this, localPropertiesService, propertyToComponent) { + @Override + protected void applyProperties() { + new Thread("Applying properties dialog") { + @Override + public void run() { + savePropertyValues(); + if (isRestartRequired()) { + + restartEarth(); + } else { + EarthApp.executeKmlLoadAsynchronously(PropertiesDialog.this); + } + } + }.start(); + } + }); + } + return applyChanges; + } + + public void closeDialog() { + this.dispose(); + } + + private Component getCancelButton() { + final JButton cancelButton = new JButton(Messages.getString("OptionWizard.24")); //$NON-NLS-1$ + cancelButton.addActionListener( e -> PropertiesDialog.this.dispose() ); + return cancelButton; + } + + private JComponent getOperationModePanel() { + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + final JPanel typeOfUsePanel = new JPanel(new GridBagLayout()); + final Border border = new TitledBorder(new BevelBorder(BevelBorder.LOWERED), + Messages.getString("OptionWizard.2")); //$NON-NLS-1$ + typeOfUsePanel.setBorder(border); + + JPanel serverPanel = getServerPanel(); + typeOfUsePanel.add(serverPanel, constraints); + + return typeOfUsePanel; + } + + private void enableDBOptions(boolean isPostgreDb) { + enableContainer(postgresPanel, isPostgreDb); + enableContainer(sqlitePanel, !isPostgreDb); + } + + private ActionListener getDbTypeListener() { + return e -> { + final JRadioButton theJRB = (JRadioButton) e.getSource(); + + boolean isPostgreDb = theJRB.getName().equals(CollectDBDriver.POSTGRESQL.name()); + enableDBOptions(isPostgreDb); + }; + } + + private JTabbedPane getOptionTabs() { + final JTabbedPane tabbedPane = new JTabbedPane(); + tabbedPane.setSize(550, 300); + final JComponent panel1 = getSampleDataPanel(); + tabbedPane.addTab(Messages.getString("OptionWizard.31"), panel1); //$NON-NLS-1$ + + final JComponent panel2 = getPlotOptionsPanel(); + tabbedPane.addTab(Messages.getString("OptionWizard.32"), panel2); //$NON-NLS-1$ + + final JComponent panel3 = getSurveyDefinitonPanel(); + tabbedPane.addTab(Messages.getString("OptionWizard.33"), panel3); //$NON-NLS-1$ + + final JComponent panel41 = getIntegrationsPanel(); + tabbedPane.addTab(Messages.getString("OptionWizard.34"), panel41); //$NON-NLS-1$ + + final JComponent panel4 = getBrowsersOptionsPanel(); + tabbedPane.addTab(Messages.getString("OptionWizard.104"), panel4); //$NON-NLS-1$ + + final JComponent panel5 = getOperationModePanelScroll(); + tabbedPane.addTab(Messages.getString("OptionWizard.25"), panel5); //$NON-NLS-1$ + + final JComponent panel6 = getProjectsPanelScroll(); + tabbedPane.addTab(Messages.getString("OptionWizard.40"), panel6); //$NON-NLS-1$ + + return tabbedPane; + } + + private JComponent getProjectsPanelScroll() { + final JComponent projectsPanel = getProjectsPanel(); + return new JScrollPane(projectsPanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + } + + private JComponent getProjectsPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.fill = GridBagConstraints.BOTH; + + JButton importNewButton = new JButton(Messages.getString("OptionWizard.41")); //$NON-NLS-1$ + importNewButton.addActionListener(new ApplyOptionChangesListener(this, localPropertiesService) { + + @Override + protected void applyProperties() { + final File[] selectedProjectFile = JFileChooserExistsAware.getFileChooserResults( + DataFormat.PROJECT_DEFINITION_FILE, false, false, null, localPropertiesService, + (JFrame) PropertiesDialog.this.getParent()); + + if (selectedProjectFile != null && selectedProjectFile.length == 1) { + try { + projectsService.loadCompressedProjectFile(selectedProjectFile[0]); + restartEarth(); + } catch (Exception e1) { + JOptionPane.showMessageDialog(PropertiesDialog.this, e1.getMessage(), + Messages.getString("OptionWizard.51"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + logger.error("Error importing project file " + selectedProjectFile[0].getAbsolutePath(), e1); //$NON-NLS-1$ + } + + } + } + }); + + panel.add(importNewButton, constraints); + + final JPanel typeOfDbPanel = new JPanel(new GridBagLayout()); + final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), + Messages.getString("OptionWizard.57")); //$NON-NLS-1$ + typeOfDbPanel.setBorder(border); + + constraints.gridx = 0; + constraints.gridy = 1; + panel.add(typeOfDbPanel, constraints); + + List listOfProjectsByName = new ArrayList<>(); + listOfProjectsByName.addAll(projectsService.getProjectList().keySet()); + Collections.sort(listOfProjectsByName); + final JList listOfProjects = new JList<>(listOfProjectsByName.toArray(new String[0])); // data has type Object[] + listOfProjects.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + listOfProjects.setLayoutOrientation(JList.VERTICAL); + listOfProjects.setVisibleRowCount(-1); + + JScrollPane listScroller = new JScrollPane(listOfProjects); + listScroller.setPreferredSize(new Dimension(250, 300)); + + constraints.gridy = 0; + constraints.gridx = GridBagConstraints.RELATIVE; + typeOfDbPanel.add(listScroller, constraints); + + final JButton openProject = new JButton(Messages.getString("OptionWizard.56")); //$NON-NLS-1$ + openProject.setEnabled(false); + openProject.addActionListener(new ApplyOptionChangesListener(this, localPropertiesService) { + + @Override + protected void applyProperties() { + + File projectFolder = projectsService.getProjectList().get(listOfProjects.getSelectedValue()); + + try { + projectsService.loadProjectInFolder(projectFolder); + restartEarth(); + } catch (Exception e1) { + JOptionPane.showMessageDialog(PropertiesDialog.this, e1.getMessage(), + Messages.getString("OptionWizard.55"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + logger.error("Error importing project folder " + projectFolder.getAbsolutePath(), e1); //$NON-NLS-1$ + } + + } + + }); + + listOfProjects.addListSelectionListener(e -> openProject.setEnabled(listOfProjects.getSelectedValue() != null) ); + + typeOfDbPanel.add(openProject); + + return panel; + } + + private JScrollPane getOperationModePanelScroll() { + final JComponent operationModePanel = getOperationModePanel(); + return new JScrollPane(operationModePanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + } + + private JComponent getPlotOptionsPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.fill = GridBagConstraints.HORIZONTAL; + + JLabel label = new JLabel("Plot shape"); + panel.add(label, constraints); + + constraints.gridx = 1; + JComboBox plotShape = (JComboBox) propertyToComponent.get(EarthProperty.SAMPLE_SHAPE)[0]; + panel.add(plotShape, constraints); + + constraints.gridx = 0; + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.35")); //$NON-NLS-1$ + panel.add(label, constraints); + + constraints.gridx = 1; + JComboBox numberPoints = (JComboBox) propertyToComponent + .get(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT)[0]; + panel.add(numberPoints, constraints); + + constraints.gridx = 0; + constraints.gridy++; + JLabel distanceOrRadiuslabel = new JLabel(Messages.getString("OptionWizard.36")); //$NON-NLS-1$ + panel.add(distanceOrRadiuslabel, constraints); + + constraints.gridx = 1; + JComboBox distanceBetweenPoints = (JComboBox) propertyToComponent + .get(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS)[0]; + panel.add(new JScrollPane(distanceBetweenPoints), constraints); + + constraints.gridx = 0; + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.37")); //$NON-NLS-1$ + panel.add(label, constraints); + constraints.gridx = 1; + JComboBox distanceToFrame = (JComboBox) propertyToComponent + .get(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES)[0]; + panel.add(new JScrollPane(distanceToFrame), constraints); + + constraints.gridx = 0; + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.95")); //$NON-NLS-1$ + panel.add(label, constraints); + constraints.gridx = 1; + JComboBox dotsSide = (JComboBox) propertyToComponent.get(EarthProperty.INNER_SUBPLOT_SIDE)[0]; + panel.add(new JScrollPane(dotsSide), constraints); + + constraints.gridx = 0; + constraints.gridy++; + label = new JLabel("Central plot side"); //$NON-NLS-1$ + panel.add(label, constraints); + constraints.gridx = 1; + JComboBox largeCentralPlotSide = (JComboBox) propertyToComponent.get(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)[0]; + panel.add(new JScrollPane(largeCentralPlotSide), constraints); + + + + constraints.gridx = 0; + constraints.gridy++; + label = new JLabel("Distance between plots in cluster"); + panel.add(label, constraints); + constraints.gridx = 1; + JComboBox plotDistanceInCluster = (JComboBox) propertyToComponent + .get(EarthProperty.DISTANCE_BETWEEN_PLOTS)[0]; + panel.add(new JScrollPane(plotDistanceInCluster), constraints); + + constraints.gridx = 0; + constraints.gridy++; + JLabel area = new JLabel( + "Area (hectares) : " + calculateArea(numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide)); + panel.add(area, constraints); + + ActionListener calculateAreas = actionPerformed -> area.setText("Area (hectares) : " + calculateArea(numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide)); + + plotShape.addActionListener( e-> + handleVisibilityPlotLayout(plotShape, numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide, + plotDistanceInCluster, area, distanceOrRadiuslabel, largeCentralPlotSide) + ); + + numberPoints.addActionListener(calculateAreas); + distanceBetweenPoints.addActionListener(calculateAreas); + distanceToFrame.addActionListener(calculateAreas); + + handleVisibilityPlotLayout(plotShape, numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide, + plotDistanceInCluster, area, distanceOrRadiuslabel, largeCentralPlotSide); + + return panel; + } + + public void handleVisibilityPlotLayout(JComboBox plotShape, JComboBox numberPoints, JComboBox distanceBetweenPoints, + JComboBox distanceToFrame, JComboBox dotsSide, JComboBox distanceBetweenPlots, JLabel area, + JLabel distanceOrRadiuslabel, JComboBox largeCentralPlotSide ) { + numberPoints.setEnabled(false); + distanceBetweenPoints.setEnabled(false); + distanceToFrame.setEnabled(false); + dotsSide.setEnabled(false); + area.setVisible(false); + distanceBetweenPlots.setVisible(false); + distanceBetweenPlots.setEnabled(false); + largeCentralPlotSide.setVisible( false ); + largeCentralPlotSide.setEnabled(false); + + if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE) || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE_WITH_LARGE_CENTRAL_PLOT) ) { + numberPoints.setEnabled(true); + distanceBetweenPoints.setEnabled(true); + distanceToFrame.setEnabled(true); + dotsSide.setEnabled(true); + area.setVisible(true); + distanceOrRadiuslabel.setText(Messages.getString("OptionWizard.36")); + + if( plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE_WITH_LARGE_CENTRAL_PLOT) ) { + largeCentralPlotSide.setVisible( true ); + largeCentralPlotSide.setEnabled(true); + } + + } else if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.CIRCLE) + || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.HEXAGON)) { + distanceBetweenPoints.setEnabled(true); + dotsSide.setEnabled(true); + numberPoints.setEnabled(true); + distanceOrRadiuslabel.setText("Radius"); + } else if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.NFI_THREE_CIRCLES) || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.NFI_FOUR_CIRCLES)) { + dotsSide.setEnabled(true); + distanceBetweenPoints.setEnabled(true); + distanceBetweenPlots.setVisible(true); + distanceBetweenPlots.setEnabled(true); + distanceOrRadiuslabel.setText("Radius of the plots"); + } + } + + private String calculateArea(JComboBox numberOfPoints, JComboBox distanceBetweenPoints, JComboBox distanceToFrame, JComboBox dotsSide) { + double side = 0; + try { + int numberOfPointsI = ((ComboBoxItem) numberOfPoints.getSelectedItem()).getNumberOfPoints(); + int distanceBetweenPointsI = Integer.parseInt((String) distanceBetweenPoints.getSelectedItem()); + int distanceToFrameI = Integer.parseInt((String) distanceToFrame.getSelectedItem()); + + if (numberOfPointsI == 0 || numberOfPointsI == 1) { + + side = 2d * distanceToFrameI; + if (oldSelectedDistance == null) { + oldSelectedDistance = (String) distanceBetweenPoints.getSelectedItem(); + distanceBetweenPoints.setEnabled(false); + } + distanceBetweenPoints.setSelectedItem("0"); + + if (numberOfPointsI == 0) { + dotsSide.setEnabled(false); + } else if (numberOfPointsI == 1) { + dotsSide.setEnabled(true); + } + + } else { + if (oldSelectedDistance != null) { + distanceBetweenPoints.setSelectedItem(oldSelectedDistance); + oldSelectedDistance = null; + } + + distanceBetweenPoints.setEnabled(true); + distanceToFrame.setEnabled(true); + dotsSide.setEnabled(true); + + double pointsByLines = Math.sqrt(numberOfPointsI); + side = 2d * distanceToFrameI + (pointsByLines - 1) * distanceBetweenPointsI; + + } + + } catch (RuntimeException e) { + logger.error("Error calculating area of the plot", e); + } + + DecimalFormat df = new DecimalFormat("###.##"); + return df.format(side * side / 10000d); + } + + private JPanel getPostgreSqlPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), + Messages.getString("OptionWizard.6")); //$NON-NLS-1$ + panel.setBorder(border); + + JLabel label = new JLabel(Messages.getString("OptionWizard.7")); //$NON-NLS-1$ + constraints.gridx = 0; + panel.add(label, constraints); + + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.DB_USERNAME)[0], constraints); + + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.8")); //$NON-NLS-1$ + constraints.gridx = 0; + panel.add(label, constraints); + + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.DB_PASSWORD)[0], constraints); + + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.9")); //$NON-NLS-1$ + constraints.gridx = 0; + panel.add(label, constraints); + + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.DB_NAME)[0], constraints); + + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.26")); //$NON-NLS-1$ + constraints.gridx = 0; + panel.add(label, constraints); + + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.DB_HOST)[0], constraints); + + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.29")); //$NON-NLS-1$ + constraints.gridx = 0; + panel.add(label, constraints); + + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.DB_PORT)[0], constraints); + + constraints.gridx = 2; + panel.add(new JLabel("Default: 5432"), constraints); + + constraints.gridy++; + constraints.gridx = 1; + JButton button = new JButton("Test Connection"); //$NON-NLS-1$ + button.addActionListener( e-> { + String host = ((JTextField) (propertyToComponent.get(EarthProperty.DB_HOST)[0])).getText(); + String port = ((JTextField) (propertyToComponent.get(EarthProperty.DB_PORT)[0])).getText(); + String dbName = ((JTextField) (propertyToComponent.get(EarthProperty.DB_NAME)[0])).getText(); + String username = ((JTextField) (propertyToComponent.get(EarthProperty.DB_USERNAME)[0])).getText(); + String password = ((JTextField) (propertyToComponent.get(EarthProperty.DB_PASSWORD)[0])).getText(); + + String message = CollectEarthUtils.testPostgreSQLConnection(host, port, dbName, username, password); + JOptionPane.showMessageDialog(PropertiesDialog.this.getOwner(), message, "PostgreSQL Connection test", + JOptionPane.INFORMATION_MESSAGE); + }); + panel.add(button, constraints); + + return panel; + } + + private JPanel getSqlLitePanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), + Messages.getString("OptionWizard.30")); //$NON-NLS-1$ + panel.setBorder(border); + + panel.add(propertyToComponent.get(EarthProperty.AUTOMATIC_BACKUP)[0], constraints); + constraints.gridx++; + panel.add(getOpenBackupFolderButton()); + return panel; + } + + private JComponent getSampleDataPanel() { + final JPlotCsvTable samplePlots = new JPlotCsvTable(localPropertiesService.getValue(EarthProperty.SAMPLE_FILE), + surveyLoaded); + + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.fill = GridBagConstraints.BOTH; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + + final JFilePicker refreshTableOnFileChange = getFilePickerSamplePlots(samplePlots); + + panel.add(refreshTableOnFileChange, constraints); + + samplePlots.setFillsViewportHeight(true); + constraints.gridy = 1; + + constraints.weightx = 1.0; + constraints.weighty = 1.0; + constraints.gridwidth = GridBagConstraints.REMAINDER; + constraints.gridheight = GridBagConstraints.REMAINDER; + + samplePlots.setPreferredScrollableViewportSize(samplePlots.getPreferredSize()); + + panel.add(new JScrollPane(samplePlots, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, + ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), constraints); + + return panel; + } + + private JFilePicker getFilePickerSamplePlots(final JPlotCsvTable samplePlots) { + final JFilePicker refreshTableOnFileChange = (JFilePicker) (propertyToComponent + .get(EarthProperty.SAMPLE_FILE)[0]); + refreshTableOnFileChange.addChangeListener(new DocumentListener() { + + @Override + public void changedUpdate(DocumentEvent e) { + // Do not react + } + + @Override + public void insertUpdate(DocumentEvent e) { + refreshTable(); + } + + @Override + public void removeUpdate(DocumentEvent e) { + // Do not react + } + + private void refreshTable() { + samplePlots.refreshTable(refreshTableOnFileChange.getSelectedFilePath()); + + // Do not let the user save the changes if the sample data is wrong!!! + getApplyChangesButton().setEnabled(samplePlots.isDataValid()); + } + }); + return refreshTableOnFileChange; + } + + private JPanel getServerPanel() { + + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + final JPanel typeOfDbPanel = new JPanel(new GridBagLayout()); + final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), + Messages.getString("OptionWizard.3")); //$NON-NLS-1$ + typeOfDbPanel.setBorder(border); + + JLabel label = new JLabel(Messages.getString("OptionWizard.4") + CollectEarthUtils.getComputerIp()); //$NON-NLS-1$ + typeOfDbPanel.add(label, constraints); + constraints.gridy++; + + label = new JLabel(Messages.getString("OptionWizard.5")); //$NON-NLS-1$ + constraints.gridx = 0; + typeOfDbPanel.add(label, constraints); + + constraints.gridx = 1; + typeOfDbPanel.add(propertyToComponent.get(EarthProperty.HOST_PORT_KEY)[0], constraints); + + constraints.gridwidth = GridBagConstraints.REMAINDER; + constraints.gridy++; + constraints.gridx = 0; + + final ButtonGroup bg = new ButtonGroup(); + final JComponent[] dbTypes = propertyToComponent.get(EarthProperty.DB_DRIVER); + + postgresPanel = getPostgreSqlPanel(); + sqlitePanel = getSqlLitePanel(); + + boolean usingPostgreSQL = localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.POSTGRESQL); + enableDBOptions(usingPostgreSQL); + + for (final JComponent typeRadioButton : dbTypes) { + final JRadioButton dbTypeButton = (JRadioButton) typeRadioButton; + bg.add(dbTypeButton); + typeOfDbPanel.add(dbTypeButton, constraints); + constraints.gridy++; + + dbTypeButton.addActionListener(getDbTypeListener()); + dbTypeButton.addActionListener(e -> setRestartRequired(true)); + + if (dbTypeButton.getName().equals(EarthConstants.CollectDBDriver.POSTGRESQL.name())) { + typeOfDbPanel.add(postgresPanel, constraints); + constraints.gridy++; + + } else { + typeOfDbPanel.add(sqlitePanel, constraints); + constraints.gridy++; + } + } + return typeOfDbPanel; + } + + private Component getOpenBackupFolderButton() { + + AbstractAction backupAction = new AbstractAction(Messages.getString("OptionWizard.10")) { //$NON-NLS-1$ + + private static final long serialVersionUID = 1L; + + @Override + public void actionPerformed(ActionEvent e) { + try { + + CollectEarthUtils.openFolderInExplorer(backupFolder); + + } catch (final IOException e1) { + logger.error("Error when opening the explorer window to visualize backups", e1); //$NON-NLS-1$ + } + } + + }; + + return new JButton(backupAction); + + } + + private JComponent getSurveyDefinitonPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.fill = GridBagConstraints.HORIZONTAL; + constraints.gridwidth = 2; + panel.add(propertyToComponent.get(EarthProperty.OPEN_BALLOON_IN_BROWSER)[0], constraints); + + constraints.gridy++; + constraints.gridwidth = 1; + final JLabel label = new JLabel(Messages.getString("OptionWizard.43")); //$NON-NLS-1$ + panel.add(label, constraints); + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.SURVEY_NAME)[0], constraints); + + constraints.gridy++; + constraints.gridwidth = GridBagConstraints.REMAINDER; + constraints.gridx = 0; + panel.add(propertyToComponent.get(EarthProperty.KML_TEMPLATE_KEY)[0], constraints); + + constraints.gridy++; + constraints.gridx = 0; + panel.add(propertyToComponent.get(EarthProperty.BALLOON_TEMPLATE_KEY)[0], constraints); + + constraints.gridy++; + constraints.gridx = 0; + + panel.add(propertyToComponent.get(EarthProperty.METADATA_FILE)[0], constraints); + + return panel; + } + + private void initilizeInputs() { + + final JCheckBox backupCheckbox = new JCheckBox(Messages.getString("OptionWizard.44")); //$NON-NLS-1$ + backupCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.AUTOMATIC_BACKUP))); + propertyToComponent.put(EarthProperty.AUTOMATIC_BACKUP, new JComponent[] { backupCheckbox }); + + final JCheckBox openEarthEngineCheckbox = new JCheckBox(Messages.getString("OptionWizard.45")); //$NON-NLS-1$ + openEarthEngineCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_EXPLORER))); + propertyToComponent.put(EarthProperty.OPEN_GEE_EXPLORER, new JComponent[] { openEarthEngineCheckbox }); + + final JCheckBox openGEEAppCheckbox = new JCheckBox("Google Earth Engine APP (no sign-in)"); //$NON-NLS-1$ + openGEEAppCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_APP))); + propertyToComponent.put(EarthProperty.OPEN_GEE_APP, new JComponent[] { openGEEAppCheckbox }); + + final JCheckBox openTimelapseCheckbox = new JCheckBox(Messages.getString("OptionWizard.46")); //$NON-NLS-1$ + openTimelapseCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_TIMELAPSE))); + propertyToComponent.put(EarthProperty.OPEN_TIMELAPSE, new JComponent[] { openTimelapseCheckbox }); + + final JCheckBox openEarthMapCheckbox = new JCheckBox(Messages.getString("OptionWizard.105")); //$NON-NLS-1$ + openEarthMapCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_EARTH_MAP))); + propertyToComponent.put(EarthProperty.OPEN_EARTH_MAP, new JComponent[] { openEarthMapCheckbox }); + + final JCheckBox openBingCheckbox = new JCheckBox(Messages.getString("OptionWizard.47")); //$NON-NLS-1$ + openBingCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BING_MAPS))); + propertyToComponent.put(EarthProperty.OPEN_BING_MAPS, new JComponent[] { openBingCheckbox }); + + final JCheckBox openPlanetCheckbox = new JCheckBox(Messages.getString("OptionWizard.100")); //$NON-NLS-1$ + openPlanetCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_PLANET_MAPS))); + propertyToComponent.put(EarthProperty.OPEN_PLANET_MAPS, new JComponent[] { openPlanetCheckbox }); + + final JCheckBox openMonthlyNICFICheckbox = new JCheckBox(Messages.getString("OptionWizard.110")); //$NON-NLS-1$ + openMonthlyNICFICheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.PLANET_MAPS_MONHLY))); + propertyToComponent.put(EarthProperty.PLANET_MAPS_MONHLY, new JComponent[] { openMonthlyNICFICheckbox }); + + + final JPasswordField planetAPIKeyTextField = new JPasswordField( + localPropertiesService.getValue(EarthProperty.PLANET_MAPS_KEY)); + planetAPIKeyTextField.setMinimumSize(new Dimension( 250, 20 )); + planetAPIKeyTextField.setEnabled( localPropertiesService.isPlanetMapsSupported() ); + propertyToComponent.put(EarthProperty.PLANET_MAPS_KEY, new JComponent[] { planetAPIKeyTextField }); + + openMonthlyNICFICheckbox.setEnabled( openPlanetCheckbox.isSelected() ); + planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ); + + openPlanetCheckbox.addActionListener( e-> { + planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ); + openMonthlyNICFICheckbox.setEnabled( openPlanetCheckbox.isSelected() ); + }); + openMonthlyNICFICheckbox.addActionListener( e-> planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ) ); + + + final JCheckBox openSecureWatchCheckbox = new JCheckBox(Messages.getString("OptionWizard.102")); //$NON-NLS-1$ + openSecureWatchCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_MAXAR_SECUREWATCH))); + propertyToComponent.put(EarthProperty.OPEN_MAXAR_SECUREWATCH, new JComponent[] { openSecureWatchCheckbox }); + + final JTextField secureWatchUrlTextField = new JTextField( + localPropertiesService.getValue(EarthProperty.MAXAR_SECUREWATCH_URL)); + secureWatchUrlTextField.setMinimumSize(new Dimension( 250, 20 )); + propertyToComponent.put(EarthProperty.MAXAR_SECUREWATCH_URL, new JComponent[] { secureWatchUrlTextField }); + secureWatchUrlTextField.setEnabled( localPropertiesService.isSecureWatchSupported() ); + propertyToComponent.put(EarthProperty.MAXAR_SECUREWATCH_URL, new JComponent[] { secureWatchUrlTextField }); + openSecureWatchCheckbox.addActionListener( e -> secureWatchUrlTextField.setEnabled( openSecureWatchCheckbox.isSelected() ) ); + + final JTextField extraUrlTextField = new JTextField( + localPropertiesService.getValue(EarthProperty.EXTRA_MAP_URL)); + extraUrlTextField.setMinimumSize(new Dimension( 250, 20 )); + propertyToComponent.put(EarthProperty.EXTRA_MAP_URL, new JComponent[] { extraUrlTextField }); + + final JCheckBox openBaiduCheckbox = new JCheckBox("Open Baidu Maps"); + openBaiduCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BAIDU_MAPS))); + propertyToComponent.put(EarthProperty.OPEN_BAIDU_MAPS, new JComponent[] { openBaiduCheckbox }); + + final JCheckBox openYandexCheckbox = new JCheckBox("Open Yandex maps for the plot area"); + openYandexCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_YANDEX_MAPS))); + propertyToComponent.put(EarthProperty.OPEN_YANDEX_MAPS, new JComponent[] { openYandexCheckbox }); + + final JCheckBox openHereCheckbox = new JCheckBox(Messages.getString("OptionWizard.59")); //$NON-NLS-1$ + openHereCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_HERE_MAPS))); + propertyToComponent.put(EarthProperty.OPEN_HERE_MAPS, new JComponent[] { openHereCheckbox }); + + final JCheckBox openGeePlaygroundCheckbox = new JCheckBox(Messages.getString("OptionWizard.58")); //$NON-NLS-1$ + openGeePlaygroundCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_CODE_EDITOR))); + propertyToComponent.put(EarthProperty.OPEN_GEE_CODE_EDITOR, new JComponent[] { openGeePlaygroundCheckbox }); + + final JCheckBox openInSeparateWindowCheckbox = new JCheckBox(Messages.getString("OptionWizard.48")); //$NON-NLS-1$ + openInSeparateWindowCheckbox.setSelected( + Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BALLOON_IN_BROWSER))); + propertyToComponent.put(EarthProperty.OPEN_BALLOON_IN_BROWSER, + new JComponent[] { openInSeparateWindowCheckbox }); + + final JFilePicker csvWithPlotData = new JFilePicker(Messages.getString("OptionWizard.49"), //$NON-NLS-1$ + localPropertiesService.getValue(EarthProperty.SAMPLE_FILE), Messages.getString("OptionWizard.50"), DlgMode.MODE_OPEN); // $NON-NLS-1$ + + csvWithPlotData.addFileTypeFilter(".csv,.ced", Messages.getString("OptionWizard.52"), true); //$NON-NLS-1$ //$NON-NLS-2$ + propertyToComponent.put(EarthProperty.SAMPLE_FILE, new JComponent[] { csvWithPlotData }); + + final JComboBox plotShape = new JComboBox<>(SAMPLE_SHAPE.values()); + try { + plotShape.setSelectedItem(SAMPLE_SHAPE.valueOf(localPropertiesService.getValue(EarthProperty.SAMPLE_SHAPE))); + } catch (Exception e1) { + logger.error("The selected shape type is not supported " + localPropertiesService.getValue(EarthProperty.SAMPLE_SHAPE), e1 ); + } + propertyToComponent.put(EarthProperty.SAMPLE_SHAPE, new JComponent[] { plotShape }); + + final JComboBox comboNumberOfPoints = new JComboBox<>( + new ComboBoxItem[] { COMBO_BOX_ITEM_SQUARE, COMBO_BOX_ITEM_CENTRAL_POINT, new ComboBoxItem(4, "2x2"), //$NON-NLS-1$ //$NON-NLS-2$ + // //$NON-NLS-3$ + new ComboBoxItem(9, "3x3"), new ComboBoxItem(16, "4x4"), new ComboBoxItem(25, "5x5"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + new ComboBoxItem(36, "6x6"), //$NON-NLS-1$ + new ComboBoxItem(49, "7x7") }); //$NON-NLS-1$ + if( StringUtils.isNotBlank( localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT) ) ){ + try { + comboNumberOfPoints.setSelectedItem(new ComboBoxItem( + Integer.parseInt(localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT)), + "")); //$NON-NLS-1$ + } catch (NumberFormatException e1) { + logger.error("This should be a number {}", localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT), e1); + } + } + propertyToComponent.put(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT, + new JComponent[] { comboNumberOfPoints }); + + final String[] listOfNumbers = new String[1500]; + final String[] listOfNumbersFromTwo = new String[1500]; + + for (int index = 0; index < listOfNumbers.length; index++) { + listOfNumbers[index] = Integer.toString( index ); //$NON-NLS-1$ + listOfNumbersFromTwo[index] = Integer.toString( index + 2 ); //$NON-NLS-1$ + } + + final JComboBox listOfDistanceBetweenPoints = new JComboBox<>(listOfNumbersFromTwo); + listOfDistanceBetweenPoints + .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS)); + listOfDistanceBetweenPoints.setAutoscrolls(true); + + propertyToComponent.put(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS, + new JComponent[] { listOfDistanceBetweenPoints }); + + final JComboBox listOfDistanceBetweenPlots = new JComboBox<>(listOfNumbersFromTwo); + listOfDistanceBetweenPlots + .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS)); + listOfDistanceBetweenPlots.setAutoscrolls(true); + + propertyToComponent.put(EarthProperty.DISTANCE_BETWEEN_PLOTS, new JComponent[] { listOfDistanceBetweenPlots }); + + final JComboBox listOfDistanceToBorder = new JComboBox<>(listOfNumbers); + listOfDistanceToBorder + .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES)); + listOfDistanceToBorder.setAutoscrolls(true); + + propertyToComponent.put(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES, new JComponent[] { listOfDistanceToBorder }); + + final JComboBox listOfSizeofSamplingDot = new JComboBox<>(listOfNumbersFromTwo); + listOfSizeofSamplingDot.setSelectedItem(localPropertiesService.getValue(EarthProperty.INNER_SUBPLOT_SIDE)); + listOfSizeofSamplingDot.setAutoscrolls(true); + + propertyToComponent.put(EarthProperty.INNER_SUBPLOT_SIDE, new JComponent[] { listOfSizeofSamplingDot }); + + final JComboBox listOfSideOflargeCentralPlot = new JComboBox<>(listOfNumbersFromTwo); + listOfSideOflargeCentralPlot.setSelectedItem(localPropertiesService.getValue(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)); + listOfSideOflargeCentralPlot.setAutoscrolls(true); + + propertyToComponent.put(EarthProperty.LARGE_CENTRAL_PLOT_SIDE, new JComponent[] { listOfSideOflargeCentralPlot }); + + + final JRadioButton chromeChooser = new JRadioButton("Chrome"); //$NON-NLS-1$ + chromeChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() + .equals(EarthConstants.CHROME_BROWSER)); + chromeChooser.setName(EarthConstants.CHROME_BROWSER); + + final JRadioButton firefoxChooser = new JRadioButton("Firefox"); //$NON-NLS-1$ + firefoxChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() + .equals(EarthConstants.FIREFOX_BROWSER)); + firefoxChooser.setName(EarthConstants.FIREFOX_BROWSER); + + final JRadioButton edgeChooser = new JRadioButton("Edge"); //$NON-NLS-1$ + edgeChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() + .equals(EarthConstants.EDGE_BROWSER)); + edgeChooser.setName(EarthConstants.EDGE_BROWSER); + + propertyToComponent.put(EarthProperty.BROWSER_TO_USE, new JComponent[] { firefoxChooser, chromeChooser, edgeChooser}); + final JFilePicker saikuPath = new JFilePicker(Messages.getString("OptionWizard.65"), //$NON-NLS-1$ + localPropertiesService.getValue(EarthProperty.SAIKU_SERVER_FOLDER), + Messages.getString("OptionWizard.66"), DlgMode.MODE_OPEN); //$NON-NLS-1$ + saikuPath.setFolderChooser(); + saikuPath.addChangeListener(new DocumentListener() { + + private void showSaikuWarning() { + final File saikuFolder = new File(saikuPath.getSelectedFilePath()); + if ( !saikuService.isSaikuFolder(saikuFolder)) { + JOptionPane.showMessageDialog(PropertiesDialog.this, Messages.getString("OptionWizard.27"), //$NON-NLS-1$ + Messages.getString("OptionWizard.28"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ + saikuPath.getTextField().setBackground(CollectEarthWindow.ERROR_COLOR); + } else { + saikuPath.getTextField().setBackground(Color.white); + } + } + + @Override + public void removeUpdate(DocumentEvent e) { + // Do not react + } + + @Override + public void insertUpdate(DocumentEvent e) { + showSaikuWarning(); + } + + @Override + public void changedUpdate(DocumentEvent e) { + // Do not react + } + }); + propertyToComponent.put(EarthProperty.SAIKU_SERVER_FOLDER, new JComponent[] { saikuPath }); + + final JFilePicker kmlTemplatePath = new JFilePicker(Messages.getString("OptionWizard.79"), //$NON-NLS-1$ + localPropertiesService.getValue(EarthProperty.KML_TEMPLATE_KEY), Messages.getString("OptionWizard.80"), //$NON-NLS-1$ + DlgMode.MODE_OPEN); + kmlTemplatePath.addFileTypeFilter(".fmt", Messages.getString("OptionWizard.82"), true); //$NON-NLS-1$ //$NON-NLS-2$ + propertyToComponent.put(EarthProperty.KML_TEMPLATE_KEY, new JComponent[] { kmlTemplatePath }); + + final JFilePicker htmlBalloonPath = new JFilePicker(Messages.getString("OptionWizard.83"), //$NON-NLS-1$ + localPropertiesService.getValue(EarthProperty.BALLOON_TEMPLATE_KEY), + Messages.getString("OptionWizard.84"), DlgMode.MODE_OPEN); //$NON-NLS-1$ + htmlBalloonPath.addFileTypeFilter(".html,.htm", Messages.getString("OptionWizard.86"), true); //$NON-NLS-1$ //$NON-NLS-2$ + propertyToComponent.put(EarthProperty.BALLOON_TEMPLATE_KEY, new JComponent[] { htmlBalloonPath }); + + final JFilePicker idmPath = new JFilePicker(Messages.getString("OptionWizard.87"), //$NON-NLS-1$ + localPropertiesService.getImdFile(), Messages.getString("OptionWizard.88"), DlgMode.MODE_OPEN); //$NON-NLS-1$ + idmPath.addFileTypeFilter(".xml", Messages.getString("OptionWizard.90"), true); //$NON-NLS-1$ //$NON-NLS-2$ + propertyToComponent.put(EarthProperty.METADATA_FILE, new JComponent[] { idmPath }); + + final JTextField surveyNameTextField = new JTextField( + localPropertiesService.getValue(EarthProperty.SURVEY_NAME)); + surveyNameTextField.setEnabled(false); + propertyToComponent.put(EarthProperty.SURVEY_NAME, new JComponent[] { surveyNameTextField }); + + // Database options + + final JRadioButton instanceTypeServer = new JRadioButton(Messages.getString("OptionWizard.91")); //$NON-NLS-1$ + instanceTypeServer.setSelected(localPropertiesService.getOperationMode().equals(OperationMode.SERVER_MODE)); + instanceTypeServer.setName(EarthConstants.OperationMode.SERVER_MODE.name()); + + final JRadioButton instanceTypeClient = new JRadioButton(Messages.getString("OptionWizard.92")); //$NON-NLS-1$ + instanceTypeClient.setSelected(localPropertiesService.getOperationMode().equals(OperationMode.CLIENT_MODE)); + instanceTypeClient.setName(EarthConstants.OperationMode.CLIENT_MODE.name()); + propertyToComponent.put(EarthProperty.OPERATION_MODE, + new JComponent[] { instanceTypeServer, instanceTypeClient }); + + final JTextField collectEarthServerIp = new JTextField(localPropertiesService.getValue(EarthProperty.HOST_KEY)); + propertyToComponent.put(EarthProperty.HOST_KEY, new JComponent[] { collectEarthServerIp }); + + final JTextField collectEarthServerIpPort = new JTextField(localPropertiesService.getPort()); + final JTextField collectEarthServerLocalPort = new JTextField( + localPropertiesService.getValue(EarthProperty.HOST_PORT_KEY)); + propertyToComponent.put(EarthProperty.HOST_PORT_KEY, + new JComponent[] { collectEarthServerIpPort, collectEarthServerLocalPort }); + + final JRadioButton sqliteDbType = new JRadioButton(Messages.getString("OptionWizard.93")); //$NON-NLS-1$ + sqliteDbType.setSelected(localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.SQLITE)); + sqliteDbType.setName(CollectDBDriver.SQLITE.name()); + + final JRadioButton postgresDbType = new JRadioButton(Messages.getString("OptionWizard.94")); //$NON-NLS-1$ + boolean usingPostgreSQL = localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.POSTGRESQL); + postgresDbType.setSelected(usingPostgreSQL); + postgresDbType.setName(CollectDBDriver.POSTGRESQL.name()); + propertyToComponent.put(EarthProperty.DB_DRIVER, new JComponent[] { sqliteDbType, postgresDbType }); + + final JTextField dbUserName = new JTextField(localPropertiesService.getValue(EarthProperty.DB_USERNAME)); + propertyToComponent.put(EarthProperty.DB_USERNAME, new JComponent[] { dbUserName }); + + final JTextField dbPassword = new JTextField(localPropertiesService.getValue(EarthProperty.DB_PASSWORD)); + propertyToComponent.put(EarthProperty.DB_PASSWORD, new JComponent[] { dbPassword }); + + final JTextField dbName = new JTextField(localPropertiesService.getValue(EarthProperty.DB_NAME)); + propertyToComponent.put(EarthProperty.DB_NAME, new JComponent[] { dbName }); + + final JTextField dbHost = new JTextField(localPropertiesService.getValue(EarthProperty.DB_HOST)); + propertyToComponent.put(EarthProperty.DB_HOST, new JComponent[] { dbHost }); + + final JTextField dbPort = new JTextField(localPropertiesService.getValue(EarthProperty.DB_PORT)); + propertyToComponent.put(EarthProperty.DB_PORT, new JComponent[] { dbPort }); + + } + + public boolean isRestartRequired() { + return restartRequired; + } + + public void setRestartRequired(boolean restartRequired) { + this.restartRequired = restartRequired; + } + +} From 8aaffcf3a5ddb931bf5ab4e68152482f791c692d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:09 +0100 Subject: [PATCH 1291/1620] New translations PropertiesDialog.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 1212 ++++++++++++++++- 1 file changed, 1179 insertions(+), 33 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 29c9a75479..7eb0424502 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,63 +1,1209 @@ package org.openforis.collect.earth.app.view; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.GridLayout; +import java.awt.Insets; +import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.io.File; +import java.io.IOException; +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import javax.swing.AbstractAction; +import javax.swing.AbstractButton; +import javax.swing.ButtonGroup; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JDialog; import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JPasswordField; +import javax.swing.JRadioButton; +import javax.swing.JScrollPane; +import javax.swing.JTabbedPane; +import javax.swing.JTextField; +import javax.swing.ListSelectionModel; +import javax.swing.ScrollPaneConstants; +import javax.swing.border.BevelBorder; +import javax.swing.border.Border; +import javax.swing.border.TitledBorder; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; -import org.openforis.collect.earth.app.service.ExportType; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; +import org.openforis.collect.earth.app.EarthConstants.OperationMode; +import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.AnalysisSaikuService; +import org.openforis.collect.earth.app.service.EarthProjectsService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; +import org.openforis.collect.model.CollectSurvey; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class SaikuAnalysisListener implements ActionListener { - private Logger logger = LoggerFactory.getLogger( SaikuAnalysisListener.class); - protected JFrame frame; - protected GenerateDatabaseStarter saikuStarter; +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ +public class PropertiesDialog extends JDialog { - public SaikuAnalysisListener(JFrame frame, GenerateDatabaseStarter saikuStarter) { - this.frame = frame; - this.saikuStarter = saikuStarter; + private static final ComboBoxItem COMBO_BOX_ITEM_CENTRAL_POINT = new ComboBoxItem(1, + Messages.getString("OptionWizard.54")); + + private static final ComboBoxItem COMBO_BOX_ITEM_SQUARE = new ComboBoxItem(0, + Messages.getString("OptionWizard.53")); + + private static final long serialVersionUID = -6760020609229102842L; + + private final HashMap, JComponent[]> propertyToComponent = new HashMap<>(); + private final transient Logger logger = LoggerFactory.getLogger(this.getClass()); + + JPanel postgresPanel; + JPanel sqlitePanel; + + private transient LocalPropertiesService localPropertiesService; + + String backupFolder; + + private transient AnalysisSaikuService saikuService; + + private transient EarthProjectsService projectsService; + + private boolean restartRequired; + + private String oldSelectedDistance; + + private CollectSurvey surveyLoaded; + + private JButton applyChanges; + + public PropertiesDialog(JFrame frame, LocalPropertiesService localPropertiesService, + EarthProjectsService projectsService, String backupFolder, AnalysisSaikuService saikuService, + CollectSurvey surveyLoaded) { + super(frame, Messages.getString("OptionWizard.0")); //$NON-NLS-1$ + this.localPropertiesService = localPropertiesService; + this.projectsService = projectsService; + this.backupFolder = backupFolder; + this.saikuService = saikuService; + this.surveyLoaded = surveyLoaded; + this.setLocationRelativeTo(null); + this.setSize(new Dimension(600, 620)); + this.setModal(true); + this.setResizable(false); + initilizeInputs(); + buildMainPane(); + centreWindow(); + + } + + private void centreWindow() { + Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize(); + int x = (int) ((dimension.getWidth() - getWidth()) / 2); + int y = (int) ((dimension.getHeight() - getHeight()) / 2); + setLocation(x, y); + } + + private void buildMainPane() { + + final JPanel panel = new JPanel(new BorderLayout()); + panel.add(getOptionTabs(), BorderLayout.CENTER); + final JPanel buttonPanel = new JPanel(); + buttonPanel.add(getApplyChangesButton()); + buttonPanel.add(getCancelButton()); + panel.add(buttonPanel, BorderLayout.PAGE_END); + this.add(panel); + + } + + private void enableContainer(Container container, boolean enable) { + final Component[] components = container.getComponents(); + for (final Component component : components) { + component.setEnabled(enable); + if (component instanceof Container) { + enableContainer((Container) component, enable); + } + } + } + + private JComponent getBrowsersOptionsPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + final JPanel browserChooserPanel = new JPanel(); + final Border browserBorder = new TitledBorder(new BevelBorder(BevelBorder.LOWERED), + Messages.getString("OptionWizard.1")); //$NON-NLS-1$ + browserChooserPanel.setBorder(browserBorder); + GridLayout experimentLayout = new GridLayout(0,1); + browserChooserPanel.setLayout( experimentLayout ); + + final ButtonGroup browserChooser = new ButtonGroup(); + final JComponent[] browsers = propertyToComponent.get(EarthProperty.BROWSER_TO_USE); + + for (final JComponent browserRadioButton : browsers) { + browserChooserPanel.add(browserRadioButton); + browserChooser.add((AbstractButton) browserRadioButton); + + ((JRadioButton) browserRadioButton).addActionListener(e -> setRestartRequired(true)); + } + constraints.gridy++; + panel.add(browserChooserPanel, constraints); + + constraints.gridy++; + constraints.gridx = 0; + panel.add(propertyToComponent.get(EarthProperty.SAIKU_SERVER_FOLDER)[0], constraints); + + return panel; + } + + private JComponent getIntegrationsPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + panel.add(propertyToComponent.get(EarthProperty.OPEN_GEE_APP)[0], constraints); + + constraints.gridy++; + panel.add(propertyToComponent.get(EarthProperty.OPEN_BING_MAPS)[0], constraints); + + constraints.gridy++; + panel.add(propertyToComponent.get(EarthProperty.OPEN_EARTH_MAP)[0], constraints); + + + constraints.gridy++; + constraints.gridwidth = 1; + panel.add(propertyToComponent.get(EarthProperty.OPEN_PLANET_MAPS)[0], constraints); + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.PLANET_MAPS_MONHLY)[0], constraints); + + constraints.gridy++; + constraints.gridx = 0; + constraints.gridwidth = 1; + final JLabel label = new JLabel(Messages.getString("OptionWizard.101")); //$NON-NLS-1$ + panel.add(label, constraints); + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.PLANET_MAPS_KEY)[0], constraints); + + constraints.gridx = 0; + constraints.gridy++; + constraints.gridwidth = 2; + panel.add(propertyToComponent.get(EarthProperty.OPEN_MAXAR_SECUREWATCH)[0], constraints); + + constraints.gridy++; + constraints.gridwidth = 1; + final JLabel labelMaxar = new JLabel(Messages.getString("OptionWizard.1021")); //$NON-NLS-1$ + panel.add(labelMaxar, constraints); + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.MAXAR_SECUREWATCH_URL)[0], constraints); + + constraints.gridx = 0; + constraints.gridy++; + constraints.gridwidth = 2; + panel.add(propertyToComponent.get(EarthProperty.OPEN_YANDEX_MAPS)[0], constraints); + + constraints.gridy++; + panel.add(propertyToComponent.get(EarthProperty.OPEN_BAIDU_MAPS)[0], constraints); + + constraints.gridy++; + final JLabel label2 = new JLabel(Messages.getString("OptionWizard.103")); //$NON-NLS-1$ + panel.add(label2, constraints); + constraints.gridy++; + panel.add(propertyToComponent.get(EarthProperty.EXTRA_MAP_URL)[0], constraints); + + constraints.gridy++; + constraints.gridx = 0; + constraints.gridwidth = 2; + panel.add(propertyToComponent.get(EarthProperty.OPEN_GEE_CODE_EDITOR)[0], constraints); + + + return panel; + } + + + private Component getApplyChangesButton() { + if (applyChanges == null) { + applyChanges = new JButton(Messages.getString("OptionWizard.15")); + applyChanges.addActionListener( + new ApplyOptionChangesListener(this, localPropertiesService, propertyToComponent) { + @Override + protected void applyProperties() { + new Thread("Applying properties dialog") { + @Override + public void run() { + savePropertyValues(); + if (isRestartRequired()) { + + restartEarth(); + } else { + EarthApp.executeKmlLoadAsynchronously(PropertiesDialog.this); + } + } + }.start(); + } + }); + } + return applyChanges; } - @Override - public void actionPerformed(ActionEvent e) { + public void closeDialog() { + this.dispose(); + } + + private Component getCancelButton() { + final JButton cancelButton = new JButton(Messages.getString("OptionWizard.24")); //$NON-NLS-1$ + cancelButton.addActionListener( e -> PropertiesDialog.this.dispose() ); + return cancelButton; + } + + private JComponent getOperationModePanel() { + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + final JPanel typeOfUsePanel = new JPanel(new GridBagLayout()); + final Border border = new TitledBorder(new BevelBorder(BevelBorder.LOWERED), + Messages.getString("OptionWizard.2")); //$NON-NLS-1$ + typeOfUsePanel.setBorder(border); + + JPanel serverPanel = getServerPanel(); + typeOfUsePanel.add(serverPanel, constraints); + + return typeOfUsePanel; + } + + private void enableDBOptions(boolean isPostgreDb) { + enableContainer(postgresPanel, isPostgreDb); + enableContainer(sqlitePanel, !isPostgreDb); + } + + private ActionListener getDbTypeListener() { + return e -> { + final JRadioButton theJRB = (JRadioButton) e.getSource(); + + boolean isPostgreDb = theJRB.getName().equals(CollectDBDriver.POSTGRESQL.name()); + enableDBOptions(isPostgreDb); + }; + } + + private JTabbedPane getOptionTabs() { + final JTabbedPane tabbedPane = new JTabbedPane(); + tabbedPane.setSize(550, 300); + final JComponent panel1 = getSampleDataPanel(); + tabbedPane.addTab(Messages.getString("OptionWizard.31"), panel1); //$NON-NLS-1$ + + final JComponent panel2 = getPlotOptionsPanel(); + tabbedPane.addTab(Messages.getString("OptionWizard.32"), panel2); //$NON-NLS-1$ + + final JComponent panel3 = getSurveyDefinitonPanel(); + tabbedPane.addTab(Messages.getString("OptionWizard.33"), panel3); //$NON-NLS-1$ + + final JComponent panel41 = getIntegrationsPanel(); + tabbedPane.addTab(Messages.getString("OptionWizard.34"), panel41); //$NON-NLS-1$ + + final JComponent panel4 = getBrowsersOptionsPanel(); + tabbedPane.addTab(Messages.getString("OptionWizard.104"), panel4); //$NON-NLS-1$ + + final JComponent panel5 = getOperationModePanelScroll(); + tabbedPane.addTab(Messages.getString("OptionWizard.25"), panel5); //$NON-NLS-1$ + + final JComponent panel6 = getProjectsPanelScroll(); + tabbedPane.addTab(Messages.getString("OptionWizard.40"), panel6); //$NON-NLS-1$ + + return tabbedPane; + } + + private JComponent getProjectsPanelScroll() { + final JComponent projectsPanel = getProjectsPanel(); + return new JScrollPane(projectsPanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + } + + private JComponent getProjectsPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.fill = GridBagConstraints.BOTH; + + JButton importNewButton = new JButton(Messages.getString("OptionWizard.41")); //$NON-NLS-1$ + importNewButton.addActionListener(new ApplyOptionChangesListener(this, localPropertiesService) { + + @Override + protected void applyProperties() { + final File[] selectedProjectFile = JFileChooserExistsAware.getFileChooserResults( + DataFormat.PROJECT_DEFINITION_FILE, false, false, null, localPropertiesService, + (JFrame) PropertiesDialog.this.getParent()); + + if (selectedProjectFile != null && selectedProjectFile.length == 1) { + try { + projectsService.loadCompressedProjectFile(selectedProjectFile[0]); + restartEarth(); + } catch (Exception e1) { + JOptionPane.showMessageDialog(PropertiesDialog.this, e1.getMessage(), + Messages.getString("OptionWizard.51"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + logger.error("Error importing project file " + selectedProjectFile[0].getAbsolutePath(), e1); //$NON-NLS-1$ + } + + } + } + }); + + panel.add(importNewButton, constraints); + + final JPanel typeOfDbPanel = new JPanel(new GridBagLayout()); + final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), + Messages.getString("OptionWizard.57")); //$NON-NLS-1$ + typeOfDbPanel.setBorder(border); + + constraints.gridx = 0; + constraints.gridy = 1; + panel.add(typeOfDbPanel, constraints); + + List listOfProjectsByName = new ArrayList<>(); + listOfProjectsByName.addAll(projectsService.getProjectList().keySet()); + Collections.sort(listOfProjectsByName); + final JList listOfProjects = new JList<>(listOfProjectsByName.toArray(new String[0])); // data has type Object[] + listOfProjects.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + listOfProjects.setLayoutOrientation(JList.VERTICAL); + listOfProjects.setVisibleRowCount(-1); + + JScrollPane listScroller = new JScrollPane(listOfProjects); + listScroller.setPreferredSize(new Dimension(250, 300)); + + constraints.gridy = 0; + constraints.gridx = GridBagConstraints.RELATIVE; + typeOfDbPanel.add(listScroller, constraints); + + final JButton openProject = new JButton(Messages.getString("OptionWizard.56")); //$NON-NLS-1$ + openProject.setEnabled(false); + openProject.addActionListener(new ApplyOptionChangesListener(this, localPropertiesService) { + + @Override + protected void applyProperties() { + + File projectFolder = projectsService.getProjectList().get(listOfProjects.getSelectedValue()); + + try { + projectsService.loadProjectInFolder(projectFolder); + restartEarth(); + } catch (Exception e1) { + JOptionPane.showMessageDialog(PropertiesDialog.this, e1.getMessage(), + Messages.getString("OptionWizard.55"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + logger.error("Error importing project folder " + projectFolder.getAbsolutePath(), e1); //$NON-NLS-1$ + } + + } + + }); + + listOfProjects.addListSelectionListener(e -> openProject.setEnabled(listOfProjects.getSelectedValue() != null) ); + + typeOfDbPanel.add(openProject); + + return panel; + } + + private JScrollPane getOperationModePanelScroll() { + final JComponent operationModePanel = getOperationModePanel(); + return new JScrollPane(operationModePanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + } + + private JComponent getPlotOptionsPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.fill = GridBagConstraints.HORIZONTAL; + + JLabel label = new JLabel("Plot shape"); + panel.add(label, constraints); + + constraints.gridx = 1; + JComboBox plotShape = (JComboBox) propertyToComponent.get(EarthProperty.SAMPLE_SHAPE)[0]; + panel.add(plotShape, constraints); + + constraints.gridx = 0; + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.35")); //$NON-NLS-1$ + panel.add(label, constraints); + + constraints.gridx = 1; + JComboBox numberPoints = (JComboBox) propertyToComponent + .get(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT)[0]; + panel.add(numberPoints, constraints); + + constraints.gridx = 0; + constraints.gridy++; + JLabel distanceOrRadiuslabel = new JLabel(Messages.getString("OptionWizard.36")); //$NON-NLS-1$ + panel.add(distanceOrRadiuslabel, constraints); + + constraints.gridx = 1; + JComboBox distanceBetweenPoints = (JComboBox) propertyToComponent + .get(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS)[0]; + panel.add(new JScrollPane(distanceBetweenPoints), constraints); + + constraints.gridx = 0; + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.37")); //$NON-NLS-1$ + panel.add(label, constraints); + constraints.gridx = 1; + JComboBox distanceToFrame = (JComboBox) propertyToComponent + .get(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES)[0]; + panel.add(new JScrollPane(distanceToFrame), constraints); + + constraints.gridx = 0; + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.95")); //$NON-NLS-1$ + panel.add(label, constraints); + constraints.gridx = 1; + JComboBox dotsSide = (JComboBox) propertyToComponent.get(EarthProperty.INNER_SUBPLOT_SIDE)[0]; + panel.add(new JScrollPane(dotsSide), constraints); + + constraints.gridx = 0; + constraints.gridy++; + label = new JLabel("Central plot side"); //$NON-NLS-1$ + panel.add(label, constraints); + constraints.gridx = 1; + JComboBox largeCentralPlotSide = (JComboBox) propertyToComponent.get(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)[0]; + panel.add(new JScrollPane(largeCentralPlotSide), constraints); + + + + constraints.gridx = 0; + constraints.gridy++; + label = new JLabel("Distance between plots in cluster"); + panel.add(label, constraints); + constraints.gridx = 1; + JComboBox plotDistanceInCluster = (JComboBox) propertyToComponent + .get(EarthProperty.DISTANCE_BETWEEN_PLOTS)[0]; + panel.add(new JScrollPane(plotDistanceInCluster), constraints); + + constraints.gridx = 0; + constraints.gridy++; + JLabel area = new JLabel( + "Area (hectares) : " + calculateArea(numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide)); + panel.add(area, constraints); + + ActionListener calculateAreas = actionPerformed -> area.setText("Area (hectares) : " + calculateArea(numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide)); + + plotShape.addActionListener( e-> + handleVisibilityPlotLayout(plotShape, numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide, + plotDistanceInCluster, area, distanceOrRadiuslabel, largeCentralPlotSide) + ); + + numberPoints.addActionListener(calculateAreas); + distanceBetweenPoints.addActionListener(calculateAreas); + distanceToFrame.addActionListener(calculateAreas); + + handleVisibilityPlotLayout(plotShape, numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide, + plotDistanceInCluster, area, distanceOrRadiuslabel, largeCentralPlotSide); + + return panel; + } + + public void handleVisibilityPlotLayout(JComboBox plotShape, JComboBox numberPoints, JComboBox distanceBetweenPoints, + JComboBox distanceToFrame, JComboBox dotsSide, JComboBox distanceBetweenPlots, JLabel area, + JLabel distanceOrRadiuslabel, JComboBox largeCentralPlotSide ) { + numberPoints.setEnabled(false); + distanceBetweenPoints.setEnabled(false); + distanceToFrame.setEnabled(false); + dotsSide.setEnabled(false); + area.setVisible(false); + distanceBetweenPlots.setVisible(false); + distanceBetweenPlots.setEnabled(false); + largeCentralPlotSide.setVisible( false ); + largeCentralPlotSide.setEnabled(false); + + if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE) || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE_WITH_LARGE_CENTRAL_PLOT) ) { + numberPoints.setEnabled(true); + distanceBetweenPoints.setEnabled(true); + distanceToFrame.setEnabled(true); + dotsSide.setEnabled(true); + area.setVisible(true); + distanceOrRadiuslabel.setText(Messages.getString("OptionWizard.36")); + + if( plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE_WITH_LARGE_CENTRAL_PLOT) ) { + largeCentralPlotSide.setVisible( true ); + largeCentralPlotSide.setEnabled(true); + } + + } else if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.CIRCLE) + || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.HEXAGON)) { + distanceBetweenPoints.setEnabled(true); + dotsSide.setEnabled(true); + numberPoints.setEnabled(true); + distanceOrRadiuslabel.setText("Radius"); + } else if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.NFI_THREE_CIRCLES) || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.NFI_FOUR_CIRCLES)) { + dotsSide.setEnabled(true); + distanceBetweenPoints.setEnabled(true); + distanceBetweenPlots.setVisible(true); + distanceBetweenPlots.setEnabled(true); + distanceOrRadiuslabel.setText("Radius of the plots"); + } + } + + private String calculateArea(JComboBox numberOfPoints, JComboBox distanceBetweenPoints, JComboBox distanceToFrame, JComboBox dotsSide) { + double side = 0; try { + int numberOfPointsI = ((ComboBoxItem) numberOfPoints.getSelectedItem()).getNumberOfPoints(); + int distanceBetweenPointsI = Integer.parseInt((String) distanceBetweenPoints.getSelectedItem()); + int distanceToFrameI = Integer.parseInt((String) distanceToFrame.getSelectedItem()); + + if (numberOfPointsI == 0 || numberOfPointsI == 1) { + + side = 2d * distanceToFrameI; + if (oldSelectedDistance == null) { + oldSelectedDistance = (String) distanceBetweenPoints.getSelectedItem(); + distanceBetweenPoints.setEnabled(false); + } + distanceBetweenPoints.setSelectedItem("0"); + + if (numberOfPointsI == 0) { + dotsSide.setEnabled(false); + } else if (numberOfPointsI == 1) { + dotsSide.setEnabled(true); + } + + } else { + if (oldSelectedDistance != null) { + distanceBetweenPoints.setSelectedItem(oldSelectedDistance); + oldSelectedDistance = null; + } - CollectEarthWindow.startWaiting(frame); - exportDataToRDB( true ); - }catch (Exception e1) { - logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ - } finally{ - CollectEarthWindow.endWaiting(frame); + distanceBetweenPoints.setEnabled(true); + distanceToFrame.setEnabled(true); + dotsSide.setEnabled(true); + + double pointsByLines = Math.sqrt(numberOfPointsI); + side = 2d * distanceToFrameI + (pointsByLines - 1) * distanceBetweenPointsI; + + } + + } catch (RuntimeException e) { + logger.error("Error calculating area of the plot", e); } + + DecimalFormat df = new DecimalFormat("###.##"); + return df.format(side * side / 10000d); } - protected void exportDataToRDB(boolean startSaikuAfterDBExport) { - if( saikuStarter.isStarting() ){ - JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.57"), Messages.getString("CollectEarthWindow.58"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ - }else{ + private JPanel getPostgreSqlPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), + Messages.getString("OptionWizard.6")); //$NON-NLS-1$ + panel.setBorder(border); + + JLabel label = new JLabel(Messages.getString("OptionWizard.7")); //$NON-NLS-1$ + constraints.gridx = 0; + panel.add(label, constraints); + + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.DB_USERNAME)[0], constraints); - int shouldRefreshDb = JOptionPane.YES_OPTION; + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.8")); //$NON-NLS-1$ + constraints.gridx = 0; + panel.add(label, constraints); - if( saikuStarter.shouldShowRdbGenerationOption( ExportType.SAIKU ) ){ + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.DB_PASSWORD)[0], constraints); - String refresh = Messages.getString("SaikuAnalysisListener.0"); //$NON-NLS-1$ - String close = Messages.getString("SaikuAnalysisListener.1"); //$NON-NLS-1$ - String[] options = new String[]{ refresh,close}; + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.9")); //$NON-NLS-1$ + constraints.gridx = 0; + panel.add(label, constraints); + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.DB_NAME)[0], constraints); - shouldRefreshDb = JOptionPane.showOptionDialog( - frame, Messages.getString("CollectEarthWindow.59"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.60"), //$NON-NLS-1$ - JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.26")); //$NON-NLS-1$ + constraints.gridx = 0; + panel.add(label, constraints); + + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.DB_HOST)[0], constraints); + + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.29")); //$NON-NLS-1$ + constraints.gridx = 0; + panel.add(label, constraints); + + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.DB_PORT)[0], constraints); + + constraints.gridx = 2; + panel.add(new JLabel("Default: 5432"), constraints); + + constraints.gridy++; + constraints.gridx = 1; + JButton button = new JButton("Test Connection"); //$NON-NLS-1$ + button.addActionListener( e-> { + String host = ((JTextField) (propertyToComponent.get(EarthProperty.DB_HOST)[0])).getText(); + String port = ((JTextField) (propertyToComponent.get(EarthProperty.DB_PORT)[0])).getText(); + String dbName = ((JTextField) (propertyToComponent.get(EarthProperty.DB_NAME)[0])).getText(); + String username = ((JTextField) (propertyToComponent.get(EarthProperty.DB_USERNAME)[0])).getText(); + String password = ((JTextField) (propertyToComponent.get(EarthProperty.DB_PASSWORD)[0])).getText(); + + String message = CollectEarthUtils.testPostgreSQLConnection(host, port, dbName, username, password); + JOptionPane.showMessageDialog(PropertiesDialog.this.getOwner(), message, "PostgreSQL Connection test", + JOptionPane.INFORMATION_MESSAGE); + }); + panel.add(button, constraints); + + return panel; + } + + private JPanel getSqlLitePanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), + Messages.getString("OptionWizard.30")); //$NON-NLS-1$ + panel.setBorder(border); + + panel.add(propertyToComponent.get(EarthProperty.AUTOMATIC_BACKUP)[0], constraints); + constraints.gridx++; + panel.add(getOpenBackupFolderButton()); + return panel; + } + + private JComponent getSampleDataPanel() { + final JPlotCsvTable samplePlots = new JPlotCsvTable(localPropertiesService.getValue(EarthProperty.SAMPLE_FILE), + surveyLoaded); + + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.fill = GridBagConstraints.BOTH; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + + final JFilePicker refreshTableOnFileChange = getFilePickerSamplePlots(samplePlots); + + panel.add(refreshTableOnFileChange, constraints); + + samplePlots.setFillsViewportHeight(true); + constraints.gridy = 1; + + constraints.weightx = 1.0; + constraints.weighty = 1.0; + constraints.gridwidth = GridBagConstraints.REMAINDER; + constraints.gridheight = GridBagConstraints.REMAINDER; + + samplePlots.setPreferredScrollableViewportSize(samplePlots.getPreferredSize()); + + panel.add(new JScrollPane(samplePlots, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, + ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), constraints); + + return panel; + } + + private JFilePicker getFilePickerSamplePlots(final JPlotCsvTable samplePlots) { + final JFilePicker refreshTableOnFileChange = (JFilePicker) (propertyToComponent + .get(EarthProperty.SAMPLE_FILE)[0]); + refreshTableOnFileChange.addChangeListener(new DocumentListener() { + + @Override + public void changedUpdate(DocumentEvent e) { + // Do not react + } + + @Override + public void insertUpdate(DocumentEvent e) { + refreshTable(); + } + + @Override + public void removeUpdate(DocumentEvent e) { + // Do not react } - if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ - saikuStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); - saikuStarter.initializeAndOpen( startSaikuAfterDBExport); + private void refreshTable() { + samplePlots.refreshTable(refreshTableOnFileChange.getSelectedFilePath()); + + // Do not let the user save the changes if the sample data is wrong!!! + getApplyChangesButton().setEnabled(samplePlots.isDataValid()); + } + }); + return refreshTableOnFileChange; + } + + private JPanel getServerPanel() { + + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + final JPanel typeOfDbPanel = new JPanel(new GridBagLayout()); + final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), + Messages.getString("OptionWizard.3")); //$NON-NLS-1$ + typeOfDbPanel.setBorder(border); + + JLabel label = new JLabel(Messages.getString("OptionWizard.4") + CollectEarthUtils.getComputerIp()); //$NON-NLS-1$ + typeOfDbPanel.add(label, constraints); + constraints.gridy++; + + label = new JLabel(Messages.getString("OptionWizard.5")); //$NON-NLS-1$ + constraints.gridx = 0; + typeOfDbPanel.add(label, constraints); + + constraints.gridx = 1; + typeOfDbPanel.add(propertyToComponent.get(EarthProperty.HOST_PORT_KEY)[0], constraints); + + constraints.gridwidth = GridBagConstraints.REMAINDER; + constraints.gridy++; + constraints.gridx = 0; + + final ButtonGroup bg = new ButtonGroup(); + final JComponent[] dbTypes = propertyToComponent.get(EarthProperty.DB_DRIVER); + + postgresPanel = getPostgreSqlPanel(); + sqlitePanel = getSqlLitePanel(); + + boolean usingPostgreSQL = localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.POSTGRESQL); + enableDBOptions(usingPostgreSQL); + + for (final JComponent typeRadioButton : dbTypes) { + final JRadioButton dbTypeButton = (JRadioButton) typeRadioButton; + bg.add(dbTypeButton); + typeOfDbPanel.add(dbTypeButton, constraints); + constraints.gridy++; + + dbTypeButton.addActionListener(getDbTypeListener()); + dbTypeButton.addActionListener(e -> setRestartRequired(true)); + + if (dbTypeButton.getName().equals(EarthConstants.CollectDBDriver.POSTGRESQL.name())) { + typeOfDbPanel.add(postgresPanel, constraints); + constraints.gridy++; + + } else { + typeOfDbPanel.add(sqlitePanel, constraints); + constraints.gridy++; + } + } + return typeOfDbPanel; + } + + private Component getOpenBackupFolderButton() { + + AbstractAction backupAction = new AbstractAction(Messages.getString("OptionWizard.10")) { //$NON-NLS-1$ + + private static final long serialVersionUID = 1L; + + @Override + public void actionPerformed(ActionEvent e) { + try { + + CollectEarthUtils.openFolderInExplorer(backupFolder); + + } catch (final IOException e1) { + logger.error("Error when opening the explorer window to visualize backups", e1); //$NON-NLS-1$ + } + } + + }; + + return new JButton(backupAction); + + } + + private JComponent getSurveyDefinitonPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.fill = GridBagConstraints.HORIZONTAL; + constraints.gridwidth = 2; + panel.add(propertyToComponent.get(EarthProperty.OPEN_BALLOON_IN_BROWSER)[0], constraints); + + constraints.gridy++; + constraints.gridwidth = 1; + final JLabel label = new JLabel(Messages.getString("OptionWizard.43")); //$NON-NLS-1$ + panel.add(label, constraints); + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.SURVEY_NAME)[0], constraints); + + constraints.gridy++; + constraints.gridwidth = GridBagConstraints.REMAINDER; + constraints.gridx = 0; + panel.add(propertyToComponent.get(EarthProperty.KML_TEMPLATE_KEY)[0], constraints); + + constraints.gridy++; + constraints.gridx = 0; + panel.add(propertyToComponent.get(EarthProperty.BALLOON_TEMPLATE_KEY)[0], constraints); + + constraints.gridy++; + constraints.gridx = 0; + + panel.add(propertyToComponent.get(EarthProperty.METADATA_FILE)[0], constraints); + + return panel; + } + + private void initilizeInputs() { + + final JCheckBox backupCheckbox = new JCheckBox(Messages.getString("OptionWizard.44")); //$NON-NLS-1$ + backupCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.AUTOMATIC_BACKUP))); + propertyToComponent.put(EarthProperty.AUTOMATIC_BACKUP, new JComponent[] { backupCheckbox }); + + final JCheckBox openEarthEngineCheckbox = new JCheckBox(Messages.getString("OptionWizard.45")); //$NON-NLS-1$ + openEarthEngineCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_EXPLORER))); + propertyToComponent.put(EarthProperty.OPEN_GEE_EXPLORER, new JComponent[] { openEarthEngineCheckbox }); + + final JCheckBox openGEEAppCheckbox = new JCheckBox("Google Earth Engine APP (no sign-in)"); //$NON-NLS-1$ + openGEEAppCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_APP))); + propertyToComponent.put(EarthProperty.OPEN_GEE_APP, new JComponent[] { openGEEAppCheckbox }); + + final JCheckBox openTimelapseCheckbox = new JCheckBox(Messages.getString("OptionWizard.46")); //$NON-NLS-1$ + openTimelapseCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_TIMELAPSE))); + propertyToComponent.put(EarthProperty.OPEN_TIMELAPSE, new JComponent[] { openTimelapseCheckbox }); + + final JCheckBox openEarthMapCheckbox = new JCheckBox(Messages.getString("OptionWizard.105")); //$NON-NLS-1$ + openEarthMapCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_EARTH_MAP))); + propertyToComponent.put(EarthProperty.OPEN_EARTH_MAP, new JComponent[] { openEarthMapCheckbox }); + + final JCheckBox openBingCheckbox = new JCheckBox(Messages.getString("OptionWizard.47")); //$NON-NLS-1$ + openBingCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BING_MAPS))); + propertyToComponent.put(EarthProperty.OPEN_BING_MAPS, new JComponent[] { openBingCheckbox }); + + final JCheckBox openPlanetCheckbox = new JCheckBox(Messages.getString("OptionWizard.100")); //$NON-NLS-1$ + openPlanetCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_PLANET_MAPS))); + propertyToComponent.put(EarthProperty.OPEN_PLANET_MAPS, new JComponent[] { openPlanetCheckbox }); + + final JCheckBox openMonthlyNICFICheckbox = new JCheckBox(Messages.getString("OptionWizard.110")); //$NON-NLS-1$ + openMonthlyNICFICheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.PLANET_MAPS_MONHLY))); + propertyToComponent.put(EarthProperty.PLANET_MAPS_MONHLY, new JComponent[] { openMonthlyNICFICheckbox }); + + + final JPasswordField planetAPIKeyTextField = new JPasswordField( + localPropertiesService.getValue(EarthProperty.PLANET_MAPS_KEY)); + planetAPIKeyTextField.setMinimumSize(new Dimension( 250, 20 )); + planetAPIKeyTextField.setEnabled( localPropertiesService.isPlanetMapsSupported() ); + propertyToComponent.put(EarthProperty.PLANET_MAPS_KEY, new JComponent[] { planetAPIKeyTextField }); + + openMonthlyNICFICheckbox.setEnabled( openPlanetCheckbox.isSelected() ); + planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ); + + openPlanetCheckbox.addActionListener( e-> { + planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ); + openMonthlyNICFICheckbox.setEnabled( openPlanetCheckbox.isSelected() ); + }); + openMonthlyNICFICheckbox.addActionListener( e-> planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ) ); + + + final JCheckBox openSecureWatchCheckbox = new JCheckBox(Messages.getString("OptionWizard.102")); //$NON-NLS-1$ + openSecureWatchCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_MAXAR_SECUREWATCH))); + propertyToComponent.put(EarthProperty.OPEN_MAXAR_SECUREWATCH, new JComponent[] { openSecureWatchCheckbox }); + + final JTextField secureWatchUrlTextField = new JTextField( + localPropertiesService.getValue(EarthProperty.MAXAR_SECUREWATCH_URL)); + secureWatchUrlTextField.setMinimumSize(new Dimension( 250, 20 )); + propertyToComponent.put(EarthProperty.MAXAR_SECUREWATCH_URL, new JComponent[] { secureWatchUrlTextField }); + secureWatchUrlTextField.setEnabled( localPropertiesService.isSecureWatchSupported() ); + propertyToComponent.put(EarthProperty.MAXAR_SECUREWATCH_URL, new JComponent[] { secureWatchUrlTextField }); + openSecureWatchCheckbox.addActionListener( e -> secureWatchUrlTextField.setEnabled( openSecureWatchCheckbox.isSelected() ) ); + + final JTextField extraUrlTextField = new JTextField( + localPropertiesService.getValue(EarthProperty.EXTRA_MAP_URL)); + extraUrlTextField.setMinimumSize(new Dimension( 250, 20 )); + propertyToComponent.put(EarthProperty.EXTRA_MAP_URL, new JComponent[] { extraUrlTextField }); + + final JCheckBox openBaiduCheckbox = new JCheckBox("Open Baidu Maps"); + openBaiduCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BAIDU_MAPS))); + propertyToComponent.put(EarthProperty.OPEN_BAIDU_MAPS, new JComponent[] { openBaiduCheckbox }); + + final JCheckBox openYandexCheckbox = new JCheckBox("Open Yandex maps for the plot area"); + openYandexCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_YANDEX_MAPS))); + propertyToComponent.put(EarthProperty.OPEN_YANDEX_MAPS, new JComponent[] { openYandexCheckbox }); + + final JCheckBox openHereCheckbox = new JCheckBox(Messages.getString("OptionWizard.59")); //$NON-NLS-1$ + openHereCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_HERE_MAPS))); + propertyToComponent.put(EarthProperty.OPEN_HERE_MAPS, new JComponent[] { openHereCheckbox }); + + final JCheckBox openGeePlaygroundCheckbox = new JCheckBox(Messages.getString("OptionWizard.58")); //$NON-NLS-1$ + openGeePlaygroundCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_CODE_EDITOR))); + propertyToComponent.put(EarthProperty.OPEN_GEE_CODE_EDITOR, new JComponent[] { openGeePlaygroundCheckbox }); + + final JCheckBox openInSeparateWindowCheckbox = new JCheckBox(Messages.getString("OptionWizard.48")); //$NON-NLS-1$ + openInSeparateWindowCheckbox.setSelected( + Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BALLOON_IN_BROWSER))); + propertyToComponent.put(EarthProperty.OPEN_BALLOON_IN_BROWSER, + new JComponent[] { openInSeparateWindowCheckbox }); + + final JFilePicker csvWithPlotData = new JFilePicker(Messages.getString("OptionWizard.49"), //$NON-NLS-1$ + localPropertiesService.getValue(EarthProperty.SAMPLE_FILE), Messages.getString("OptionWizard.50"), DlgMode.MODE_OPEN); // $NON-NLS-1$ + + csvWithPlotData.addFileTypeFilter(".csv,.ced", Messages.getString("OptionWizard.52"), true); //$NON-NLS-1$ //$NON-NLS-2$ + propertyToComponent.put(EarthProperty.SAMPLE_FILE, new JComponent[] { csvWithPlotData }); + + final JComboBox plotShape = new JComboBox<>(SAMPLE_SHAPE.values()); + try { + plotShape.setSelectedItem(SAMPLE_SHAPE.valueOf(localPropertiesService.getValue(EarthProperty.SAMPLE_SHAPE))); + } catch (Exception e1) { + logger.error("The selected shape type is not supported " + localPropertiesService.getValue(EarthProperty.SAMPLE_SHAPE), e1 ); + } + propertyToComponent.put(EarthProperty.SAMPLE_SHAPE, new JComponent[] { plotShape }); + + final JComboBox comboNumberOfPoints = new JComboBox<>( + new ComboBoxItem[] { COMBO_BOX_ITEM_SQUARE, COMBO_BOX_ITEM_CENTRAL_POINT, new ComboBoxItem(4, "2x2"), //$NON-NLS-1$ //$NON-NLS-2$ + // //$NON-NLS-3$ + new ComboBoxItem(9, "3x3"), new ComboBoxItem(16, "4x4"), new ComboBoxItem(25, "5x5"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + new ComboBoxItem(36, "6x6"), //$NON-NLS-1$ + new ComboBoxItem(49, "7x7") }); //$NON-NLS-1$ + if( StringUtils.isNotBlank( localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT) ) ){ + try { + comboNumberOfPoints.setSelectedItem(new ComboBoxItem( + Integer.parseInt(localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT)), + "")); //$NON-NLS-1$ + } catch (NumberFormatException e1) { + logger.error("This should be a number {}", localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT), e1); } } + propertyToComponent.put(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT, + new JComponent[] { comboNumberOfPoints }); + + final String[] listOfNumbers = new String[1500]; + final String[] listOfNumbersFromTwo = new String[1500]; + + for (int index = 0; index < listOfNumbers.length; index++) { + listOfNumbers[index] = Integer.toString( index ); //$NON-NLS-1$ + listOfNumbersFromTwo[index] = Integer.toString( index + 2 ); //$NON-NLS-1$ + } + + final JComboBox listOfDistanceBetweenPoints = new JComboBox<>(listOfNumbersFromTwo); + listOfDistanceBetweenPoints + .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS)); + listOfDistanceBetweenPoints.setAutoscrolls(true); + + propertyToComponent.put(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS, + new JComponent[] { listOfDistanceBetweenPoints }); + + final JComboBox listOfDistanceBetweenPlots = new JComboBox<>(listOfNumbersFromTwo); + listOfDistanceBetweenPlots + .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS)); + listOfDistanceBetweenPlots.setAutoscrolls(true); + + propertyToComponent.put(EarthProperty.DISTANCE_BETWEEN_PLOTS, new JComponent[] { listOfDistanceBetweenPlots }); + + final JComboBox listOfDistanceToBorder = new JComboBox<>(listOfNumbers); + listOfDistanceToBorder + .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES)); + listOfDistanceToBorder.setAutoscrolls(true); + + propertyToComponent.put(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES, new JComponent[] { listOfDistanceToBorder }); + + final JComboBox listOfSizeofSamplingDot = new JComboBox<>(listOfNumbersFromTwo); + listOfSizeofSamplingDot.setSelectedItem(localPropertiesService.getValue(EarthProperty.INNER_SUBPLOT_SIDE)); + listOfSizeofSamplingDot.setAutoscrolls(true); + + propertyToComponent.put(EarthProperty.INNER_SUBPLOT_SIDE, new JComponent[] { listOfSizeofSamplingDot }); + + final JComboBox listOfSideOflargeCentralPlot = new JComboBox<>(listOfNumbersFromTwo); + listOfSideOflargeCentralPlot.setSelectedItem(localPropertiesService.getValue(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)); + listOfSideOflargeCentralPlot.setAutoscrolls(true); + + propertyToComponent.put(EarthProperty.LARGE_CENTRAL_PLOT_SIDE, new JComponent[] { listOfSideOflargeCentralPlot }); + + + final JRadioButton chromeChooser = new JRadioButton("Chrome"); //$NON-NLS-1$ + chromeChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() + .equals(EarthConstants.CHROME_BROWSER)); + chromeChooser.setName(EarthConstants.CHROME_BROWSER); + + final JRadioButton firefoxChooser = new JRadioButton("Firefox"); //$NON-NLS-1$ + firefoxChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() + .equals(EarthConstants.FIREFOX_BROWSER)); + firefoxChooser.setName(EarthConstants.FIREFOX_BROWSER); + + final JRadioButton edgeChooser = new JRadioButton("Edge"); //$NON-NLS-1$ + edgeChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() + .equals(EarthConstants.EDGE_BROWSER)); + edgeChooser.setName(EarthConstants.EDGE_BROWSER); + + propertyToComponent.put(EarthProperty.BROWSER_TO_USE, new JComponent[] { firefoxChooser, chromeChooser, edgeChooser}); + final JFilePicker saikuPath = new JFilePicker(Messages.getString("OptionWizard.65"), //$NON-NLS-1$ + localPropertiesService.getValue(EarthProperty.SAIKU_SERVER_FOLDER), + Messages.getString("OptionWizard.66"), DlgMode.MODE_OPEN); //$NON-NLS-1$ + saikuPath.setFolderChooser(); + saikuPath.addChangeListener(new DocumentListener() { + + private void showSaikuWarning() { + final File saikuFolder = new File(saikuPath.getSelectedFilePath()); + if ( !saikuService.isSaikuFolder(saikuFolder)) { + JOptionPane.showMessageDialog(PropertiesDialog.this, Messages.getString("OptionWizard.27"), //$NON-NLS-1$ + Messages.getString("OptionWizard.28"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ + saikuPath.getTextField().setBackground(CollectEarthWindow.ERROR_COLOR); + } else { + saikuPath.getTextField().setBackground(Color.white); + } + } + + @Override + public void removeUpdate(DocumentEvent e) { + // Do not react + } + + @Override + public void insertUpdate(DocumentEvent e) { + showSaikuWarning(); + } + + @Override + public void changedUpdate(DocumentEvent e) { + // Do not react + } + }); + propertyToComponent.put(EarthProperty.SAIKU_SERVER_FOLDER, new JComponent[] { saikuPath }); + + final JFilePicker kmlTemplatePath = new JFilePicker(Messages.getString("OptionWizard.79"), //$NON-NLS-1$ + localPropertiesService.getValue(EarthProperty.KML_TEMPLATE_KEY), Messages.getString("OptionWizard.80"), //$NON-NLS-1$ + DlgMode.MODE_OPEN); + kmlTemplatePath.addFileTypeFilter(".fmt", Messages.getString("OptionWizard.82"), true); //$NON-NLS-1$ //$NON-NLS-2$ + propertyToComponent.put(EarthProperty.KML_TEMPLATE_KEY, new JComponent[] { kmlTemplatePath }); + + final JFilePicker htmlBalloonPath = new JFilePicker(Messages.getString("OptionWizard.83"), //$NON-NLS-1$ + localPropertiesService.getValue(EarthProperty.BALLOON_TEMPLATE_KEY), + Messages.getString("OptionWizard.84"), DlgMode.MODE_OPEN); //$NON-NLS-1$ + htmlBalloonPath.addFileTypeFilter(".html,.htm", Messages.getString("OptionWizard.86"), true); //$NON-NLS-1$ //$NON-NLS-2$ + propertyToComponent.put(EarthProperty.BALLOON_TEMPLATE_KEY, new JComponent[] { htmlBalloonPath }); + + final JFilePicker idmPath = new JFilePicker(Messages.getString("OptionWizard.87"), //$NON-NLS-1$ + localPropertiesService.getImdFile(), Messages.getString("OptionWizard.88"), DlgMode.MODE_OPEN); //$NON-NLS-1$ + idmPath.addFileTypeFilter(".xml", Messages.getString("OptionWizard.90"), true); //$NON-NLS-1$ //$NON-NLS-2$ + propertyToComponent.put(EarthProperty.METADATA_FILE, new JComponent[] { idmPath }); + + final JTextField surveyNameTextField = new JTextField( + localPropertiesService.getValue(EarthProperty.SURVEY_NAME)); + surveyNameTextField.setEnabled(false); + propertyToComponent.put(EarthProperty.SURVEY_NAME, new JComponent[] { surveyNameTextField }); + + // Database options + + final JRadioButton instanceTypeServer = new JRadioButton(Messages.getString("OptionWizard.91")); //$NON-NLS-1$ + instanceTypeServer.setSelected(localPropertiesService.getOperationMode().equals(OperationMode.SERVER_MODE)); + instanceTypeServer.setName(EarthConstants.OperationMode.SERVER_MODE.name()); + + final JRadioButton instanceTypeClient = new JRadioButton(Messages.getString("OptionWizard.92")); //$NON-NLS-1$ + instanceTypeClient.setSelected(localPropertiesService.getOperationMode().equals(OperationMode.CLIENT_MODE)); + instanceTypeClient.setName(EarthConstants.OperationMode.CLIENT_MODE.name()); + propertyToComponent.put(EarthProperty.OPERATION_MODE, + new JComponent[] { instanceTypeServer, instanceTypeClient }); + + final JTextField collectEarthServerIp = new JTextField(localPropertiesService.getValue(EarthProperty.HOST_KEY)); + propertyToComponent.put(EarthProperty.HOST_KEY, new JComponent[] { collectEarthServerIp }); + + final JTextField collectEarthServerIpPort = new JTextField(localPropertiesService.getPort()); + final JTextField collectEarthServerLocalPort = new JTextField( + localPropertiesService.getValue(EarthProperty.HOST_PORT_KEY)); + propertyToComponent.put(EarthProperty.HOST_PORT_KEY, + new JComponent[] { collectEarthServerIpPort, collectEarthServerLocalPort }); + + final JRadioButton sqliteDbType = new JRadioButton(Messages.getString("OptionWizard.93")); //$NON-NLS-1$ + sqliteDbType.setSelected(localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.SQLITE)); + sqliteDbType.setName(CollectDBDriver.SQLITE.name()); + + final JRadioButton postgresDbType = new JRadioButton(Messages.getString("OptionWizard.94")); //$NON-NLS-1$ + boolean usingPostgreSQL = localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.POSTGRESQL); + postgresDbType.setSelected(usingPostgreSQL); + postgresDbType.setName(CollectDBDriver.POSTGRESQL.name()); + propertyToComponent.put(EarthProperty.DB_DRIVER, new JComponent[] { sqliteDbType, postgresDbType }); + + final JTextField dbUserName = new JTextField(localPropertiesService.getValue(EarthProperty.DB_USERNAME)); + propertyToComponent.put(EarthProperty.DB_USERNAME, new JComponent[] { dbUserName }); + + final JTextField dbPassword = new JTextField(localPropertiesService.getValue(EarthProperty.DB_PASSWORD)); + propertyToComponent.put(EarthProperty.DB_PASSWORD, new JComponent[] { dbPassword }); + + final JTextField dbName = new JTextField(localPropertiesService.getValue(EarthProperty.DB_NAME)); + propertyToComponent.put(EarthProperty.DB_NAME, new JComponent[] { dbName }); + + final JTextField dbHost = new JTextField(localPropertiesService.getValue(EarthProperty.DB_HOST)); + propertyToComponent.put(EarthProperty.DB_HOST, new JComponent[] { dbHost }); + + final JTextField dbPort = new JTextField(localPropertiesService.getValue(EarthProperty.DB_PORT)); + propertyToComponent.put(EarthProperty.DB_PORT, new JComponent[] { dbPort }); + + } + + public boolean isRestartRequired() { + return restartRequired; + } + + public void setRestartRequired(boolean restartRequired) { + this.restartRequired = restartRequired; } -} \ No newline at end of file +} From b77fef6880e71c635a9bd31e9da49a1d6fc63ef8 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:10 +0100 Subject: [PATCH 1292/1620] New translations PropertiesDialog.java (English) --- .../earth/app/view/Messages_en.properties | 1250 ++++++++++++++++- 1 file changed, 1185 insertions(+), 65 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index aee91325a9..7eb0424502 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,89 +1,1209 @@ package org.openforis.collect.earth.app.view; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.GridLayout; +import java.awt.Insets; import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.io.IOException; +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; import java.util.List; +import javax.swing.AbstractAction; +import javax.swing.AbstractButton; +import javax.swing.ButtonGroup; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; import javax.swing.JOptionPane; -import javax.swing.ProgressMonitor; -import javax.swing.SwingUtilities; - -import org.apache.commons.lang3.ArrayUtils; -import org.openforis.collect.io.data.CSVDataImportProcess; -import org.openforis.collect.io.metadata.parsing.ParsingError; -import org.openforis.collect.manager.process.AbstractProcess; -import org.openforis.collect.manager.process.ProcessStatus; +import javax.swing.JPanel; +import javax.swing.JPasswordField; +import javax.swing.JRadioButton; +import javax.swing.JScrollPane; +import javax.swing.JTabbedPane; +import javax.swing.JTextField; +import javax.swing.ListSelectionModel; +import javax.swing.ScrollPaneConstants; +import javax.swing.border.BevelBorder; +import javax.swing.border.Border; +import javax.swing.border.TitledBorder; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; + +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.EarthConstants; +import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; +import org.openforis.collect.earth.app.EarthConstants.OperationMode; +import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; +import org.openforis.collect.earth.app.desktop.EarthApp; +import org.openforis.collect.earth.app.service.AnalysisSaikuService; +import org.openforis.collect.earth.app.service.EarthProjectsService; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; +import org.openforis.collect.model.CollectSurvey; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public abstract class ProcessMonitorDialog extends Thread { +/** + * @author Alfonso Sanchez-Paus Diaz + * + */ +public class PropertiesDialog extends JDialog { - private static final int MAX_ERRORS_SHOWN = 10; - ProgressMonitor progressMonitor; - Logger logger = LoggerFactory.getLogger(ProcessMonitorDialog.class); - AbstractProcess process; + private static final ComboBoxItem COMBO_BOX_ITEM_CENTRAL_POINT = new ComboBoxItem(1, + Messages.getString("OptionWizard.54")); + private static final ComboBoxItem COMBO_BOX_ITEM_SQUARE = new ComboBoxItem(0, + Messages.getString("OptionWizard.53")); - protected abstract String getProcessActionMessage(); + private static final long serialVersionUID = -6760020609229102842L; - public synchronized void monitorProgress() { + private final HashMap, JComponent[]> propertyToComponent = new HashMap<>(); + private final transient Logger logger = LoggerFactory.getLogger(this.getClass()); - new Thread("Monitoring progress of a process") { - @Override - public void run() { - boolean keepRunning = true; - while (keepRunning) { - if (process.getStatus() != null) { - SwingUtilities.invokeLater( () -> { - progressMonitor.setProgress(process.getStatus().getProgressPercent()); - progressMonitor.setNote(getProcessActionMessage() + process.getStatus().getProcessed() + "/" //$NON-NLS-1$ //$NON-NLS-2$ - + process.getStatus().getTotal()); - }); - - if (progressMonitor.isCanceled() || process.getStatus().isComplete() || process.getStatus().isError() ) { - SwingUtilities.invokeLater( () -> { - progressMonitor.close(); - if( process.getStatus().isError() ){ - StringBuilder parsisngErrorMsg = new StringBuilder("\r\n"); //$NON-NLS-1$ - if( process instanceof CSVDataImportProcess ){ - List errors = ((CSVDataImportProcess) process ).getStatus().getErrors(); - - int numberOfErrors = 0; - for (ParsingError parsingError : errors) { - parsisngErrorMsg.append(Messages.getString("ProcessMonitorDialog.1")).append( parsingError.getRow() ).append(" - ").append( parsingError.getMessage() ).append(", ").append( parsingError.getErrorType() ).append(Messages.getString("ProcessMonitorDialog.4")).append( ArrayUtils.toString(parsingError.getColumns()) ).append(Messages.getString("ProcessMonitorDialog.5")).append( ArrayUtils.toString(parsingError.getMessageArgs()) ).append("\r\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ - numberOfErrors ++; - if( numberOfErrors > MAX_ERRORS_SHOWN ){ - break; - } - } - - if( errors.size() > MAX_ERRORS_SHOWN ){ - parsisngErrorMsg.append( "More lines not shown . Total warnings : " + errors.size() ); - } - - } - - String primaryErrorMsg = process.getStatus().getErrorMessage(); - JOptionPane.showMessageDialog(null, "Attention : " + ( primaryErrorMsg!=null?primaryErrorMsg:"") + parsisngErrorMsg.toString() ); //$NON-NLS-1$ //$NON-NLS-2$ + JPanel postgresPanel; + JPanel sqlitePanel; + + private transient LocalPropertiesService localPropertiesService; + + String backupFolder; + + private transient AnalysisSaikuService saikuService; + + private transient EarthProjectsService projectsService; + + private boolean restartRequired; + + private String oldSelectedDistance; + + private CollectSurvey surveyLoaded; + + private JButton applyChanges; + + public PropertiesDialog(JFrame frame, LocalPropertiesService localPropertiesService, + EarthProjectsService projectsService, String backupFolder, AnalysisSaikuService saikuService, + CollectSurvey surveyLoaded) { + super(frame, Messages.getString("OptionWizard.0")); //$NON-NLS-1$ + this.localPropertiesService = localPropertiesService; + this.projectsService = projectsService; + this.backupFolder = backupFolder; + this.saikuService = saikuService; + this.surveyLoaded = surveyLoaded; + this.setLocationRelativeTo(null); + this.setSize(new Dimension(600, 620)); + this.setModal(true); + this.setResizable(false); + initilizeInputs(); + buildMainPane(); + centreWindow(); + + } + + private void centreWindow() { + Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize(); + int x = (int) ((dimension.getWidth() - getWidth()) / 2); + int y = (int) ((dimension.getHeight() - getHeight()) / 2); + setLocation(x, y); + } + + private void buildMainPane() { + + final JPanel panel = new JPanel(new BorderLayout()); + panel.add(getOptionTabs(), BorderLayout.CENTER); + final JPanel buttonPanel = new JPanel(); + buttonPanel.add(getApplyChangesButton()); + buttonPanel.add(getCancelButton()); + panel.add(buttonPanel, BorderLayout.PAGE_END); + this.add(panel); + + } + + private void enableContainer(Container container, boolean enable) { + final Component[] components = container.getComponents(); + for (final Component component : components) { + component.setEnabled(enable); + if (component instanceof Container) { + enableContainer((Container) component, enable); + } + } + } + + private JComponent getBrowsersOptionsPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + final JPanel browserChooserPanel = new JPanel(); + final Border browserBorder = new TitledBorder(new BevelBorder(BevelBorder.LOWERED), + Messages.getString("OptionWizard.1")); //$NON-NLS-1$ + browserChooserPanel.setBorder(browserBorder); + GridLayout experimentLayout = new GridLayout(0,1); + browserChooserPanel.setLayout( experimentLayout ); + + final ButtonGroup browserChooser = new ButtonGroup(); + final JComponent[] browsers = propertyToComponent.get(EarthProperty.BROWSER_TO_USE); + + for (final JComponent browserRadioButton : browsers) { + browserChooserPanel.add(browserRadioButton); + browserChooser.add((AbstractButton) browserRadioButton); + + ((JRadioButton) browserRadioButton).addActionListener(e -> setRestartRequired(true)); + } + constraints.gridy++; + panel.add(browserChooserPanel, constraints); + + constraints.gridy++; + constraints.gridx = 0; + panel.add(propertyToComponent.get(EarthProperty.SAIKU_SERVER_FOLDER)[0], constraints); + + return panel; + } + + private JComponent getIntegrationsPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + panel.add(propertyToComponent.get(EarthProperty.OPEN_GEE_APP)[0], constraints); + + constraints.gridy++; + panel.add(propertyToComponent.get(EarthProperty.OPEN_BING_MAPS)[0], constraints); + + constraints.gridy++; + panel.add(propertyToComponent.get(EarthProperty.OPEN_EARTH_MAP)[0], constraints); + + + constraints.gridy++; + constraints.gridwidth = 1; + panel.add(propertyToComponent.get(EarthProperty.OPEN_PLANET_MAPS)[0], constraints); + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.PLANET_MAPS_MONHLY)[0], constraints); + + constraints.gridy++; + constraints.gridx = 0; + constraints.gridwidth = 1; + final JLabel label = new JLabel(Messages.getString("OptionWizard.101")); //$NON-NLS-1$ + panel.add(label, constraints); + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.PLANET_MAPS_KEY)[0], constraints); + + constraints.gridx = 0; + constraints.gridy++; + constraints.gridwidth = 2; + panel.add(propertyToComponent.get(EarthProperty.OPEN_MAXAR_SECUREWATCH)[0], constraints); + + constraints.gridy++; + constraints.gridwidth = 1; + final JLabel labelMaxar = new JLabel(Messages.getString("OptionWizard.1021")); //$NON-NLS-1$ + panel.add(labelMaxar, constraints); + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.MAXAR_SECUREWATCH_URL)[0], constraints); + + constraints.gridx = 0; + constraints.gridy++; + constraints.gridwidth = 2; + panel.add(propertyToComponent.get(EarthProperty.OPEN_YANDEX_MAPS)[0], constraints); + + constraints.gridy++; + panel.add(propertyToComponent.get(EarthProperty.OPEN_BAIDU_MAPS)[0], constraints); + + constraints.gridy++; + final JLabel label2 = new JLabel(Messages.getString("OptionWizard.103")); //$NON-NLS-1$ + panel.add(label2, constraints); + constraints.gridy++; + panel.add(propertyToComponent.get(EarthProperty.EXTRA_MAP_URL)[0], constraints); + + constraints.gridy++; + constraints.gridx = 0; + constraints.gridwidth = 2; + panel.add(propertyToComponent.get(EarthProperty.OPEN_GEE_CODE_EDITOR)[0], constraints); + + + return panel; + } + + + private Component getApplyChangesButton() { + if (applyChanges == null) { + applyChanges = new JButton(Messages.getString("OptionWizard.15")); + applyChanges.addActionListener( + new ApplyOptionChangesListener(this, localPropertiesService, propertyToComponent) { + @Override + protected void applyProperties() { + new Thread("Applying properties dialog") { + @Override + public void run() { + savePropertyValues(); + if (isRestartRequired()) { + + restartEarth(); + } else { + EarthApp.executeKmlLoadAsynchronously(PropertiesDialog.this); } - }); - Toolkit.getDefaultToolkit().beep(); - if ( !process.getStatus().isComplete() && !process.getStatus().isError() ) { - process.cancel(); - logger.warn("Task canceled.\n"); //$NON-NLS-1$ - } - keepRunning = false; + } + }.start(); } - } + }); + } + return applyChanges; + } + + public void closeDialog() { + this.dispose(); + } + + private Component getCancelButton() { + final JButton cancelButton = new JButton(Messages.getString("OptionWizard.24")); //$NON-NLS-1$ + cancelButton.addActionListener( e -> PropertiesDialog.this.dispose() ); + return cancelButton; + } + + private JComponent getOperationModePanel() { + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + final JPanel typeOfUsePanel = new JPanel(new GridBagLayout()); + final Border border = new TitledBorder(new BevelBorder(BevelBorder.LOWERED), + Messages.getString("OptionWizard.2")); //$NON-NLS-1$ + typeOfUsePanel.setBorder(border); + + JPanel serverPanel = getServerPanel(); + typeOfUsePanel.add(serverPanel, constraints); + + return typeOfUsePanel; + } + + private void enableDBOptions(boolean isPostgreDb) { + enableContainer(postgresPanel, isPostgreDb); + enableContainer(sqlitePanel, !isPostgreDb); + } + + private ActionListener getDbTypeListener() { + return e -> { + final JRadioButton theJRB = (JRadioButton) e.getSource(); + + boolean isPostgreDb = theJRB.getName().equals(CollectDBDriver.POSTGRESQL.name()); + enableDBOptions(isPostgreDb); + }; + } + + private JTabbedPane getOptionTabs() { + final JTabbedPane tabbedPane = new JTabbedPane(); + tabbedPane.setSize(550, 300); + final JComponent panel1 = getSampleDataPanel(); + tabbedPane.addTab(Messages.getString("OptionWizard.31"), panel1); //$NON-NLS-1$ + + final JComponent panel2 = getPlotOptionsPanel(); + tabbedPane.addTab(Messages.getString("OptionWizard.32"), panel2); //$NON-NLS-1$ + + final JComponent panel3 = getSurveyDefinitonPanel(); + tabbedPane.addTab(Messages.getString("OptionWizard.33"), panel3); //$NON-NLS-1$ + + final JComponent panel41 = getIntegrationsPanel(); + tabbedPane.addTab(Messages.getString("OptionWizard.34"), panel41); //$NON-NLS-1$ + + final JComponent panel4 = getBrowsersOptionsPanel(); + tabbedPane.addTab(Messages.getString("OptionWizard.104"), panel4); //$NON-NLS-1$ + + final JComponent panel5 = getOperationModePanelScroll(); + tabbedPane.addTab(Messages.getString("OptionWizard.25"), panel5); //$NON-NLS-1$ + + final JComponent panel6 = getProjectsPanelScroll(); + tabbedPane.addTab(Messages.getString("OptionWizard.40"), panel6); //$NON-NLS-1$ + + return tabbedPane; + } + + private JComponent getProjectsPanelScroll() { + final JComponent projectsPanel = getProjectsPanel(); + return new JScrollPane(projectsPanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + } + private JComponent getProjectsPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.fill = GridBagConstraints.BOTH; + + JButton importNewButton = new JButton(Messages.getString("OptionWizard.41")); //$NON-NLS-1$ + importNewButton.addActionListener(new ApplyOptionChangesListener(this, localPropertiesService) { + + @Override + protected void applyProperties() { + final File[] selectedProjectFile = JFileChooserExistsAware.getFileChooserResults( + DataFormat.PROJECT_DEFINITION_FILE, false, false, null, localPropertiesService, + (JFrame) PropertiesDialog.this.getParent()); + + if (selectedProjectFile != null && selectedProjectFile.length == 1) { try { - Thread.sleep( 1000 ); - } catch (InterruptedException e) { - logger.error("Error whille waiting in thread", e); //$NON-NLS-1$ - Thread.currentThread().interrupt(); + projectsService.loadCompressedProjectFile(selectedProjectFile[0]); + restartEarth(); + } catch (Exception e1) { + JOptionPane.showMessageDialog(PropertiesDialog.this, e1.getMessage(), + Messages.getString("OptionWizard.51"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + logger.error("Error importing project file " + selectedProjectFile[0].getAbsolutePath(), e1); //$NON-NLS-1$ } + + } + } + }); + + panel.add(importNewButton, constraints); + + final JPanel typeOfDbPanel = new JPanel(new GridBagLayout()); + final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), + Messages.getString("OptionWizard.57")); //$NON-NLS-1$ + typeOfDbPanel.setBorder(border); + + constraints.gridx = 0; + constraints.gridy = 1; + panel.add(typeOfDbPanel, constraints); + + List listOfProjectsByName = new ArrayList<>(); + listOfProjectsByName.addAll(projectsService.getProjectList().keySet()); + Collections.sort(listOfProjectsByName); + final JList listOfProjects = new JList<>(listOfProjectsByName.toArray(new String[0])); // data has type Object[] + listOfProjects.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + listOfProjects.setLayoutOrientation(JList.VERTICAL); + listOfProjects.setVisibleRowCount(-1); + + JScrollPane listScroller = new JScrollPane(listOfProjects); + listScroller.setPreferredSize(new Dimension(250, 300)); + + constraints.gridy = 0; + constraints.gridx = GridBagConstraints.RELATIVE; + typeOfDbPanel.add(listScroller, constraints); + + final JButton openProject = new JButton(Messages.getString("OptionWizard.56")); //$NON-NLS-1$ + openProject.setEnabled(false); + openProject.addActionListener(new ApplyOptionChangesListener(this, localPropertiesService) { + + @Override + protected void applyProperties() { + + File projectFolder = projectsService.getProjectList().get(listOfProjects.getSelectedValue()); + + try { + projectsService.loadProjectInFolder(projectFolder); + restartEarth(); + } catch (Exception e1) { + JOptionPane.showMessageDialog(PropertiesDialog.this, e1.getMessage(), + Messages.getString("OptionWizard.55"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ + logger.error("Error importing project folder " + projectFolder.getAbsolutePath(), e1); //$NON-NLS-1$ + } + + } + + }); + + listOfProjects.addListSelectionListener(e -> openProject.setEnabled(listOfProjects.getSelectedValue() != null) ); + + typeOfDbPanel.add(openProject); + + return panel; + } + + private JScrollPane getOperationModePanelScroll() { + final JComponent operationModePanel = getOperationModePanel(); + return new JScrollPane(operationModePanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + } + + private JComponent getPlotOptionsPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.fill = GridBagConstraints.HORIZONTAL; + + JLabel label = new JLabel("Plot shape"); + panel.add(label, constraints); + + constraints.gridx = 1; + JComboBox plotShape = (JComboBox) propertyToComponent.get(EarthProperty.SAMPLE_SHAPE)[0]; + panel.add(plotShape, constraints); + + constraints.gridx = 0; + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.35")); //$NON-NLS-1$ + panel.add(label, constraints); + + constraints.gridx = 1; + JComboBox numberPoints = (JComboBox) propertyToComponent + .get(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT)[0]; + panel.add(numberPoints, constraints); + + constraints.gridx = 0; + constraints.gridy++; + JLabel distanceOrRadiuslabel = new JLabel(Messages.getString("OptionWizard.36")); //$NON-NLS-1$ + panel.add(distanceOrRadiuslabel, constraints); + + constraints.gridx = 1; + JComboBox distanceBetweenPoints = (JComboBox) propertyToComponent + .get(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS)[0]; + panel.add(new JScrollPane(distanceBetweenPoints), constraints); + + constraints.gridx = 0; + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.37")); //$NON-NLS-1$ + panel.add(label, constraints); + constraints.gridx = 1; + JComboBox distanceToFrame = (JComboBox) propertyToComponent + .get(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES)[0]; + panel.add(new JScrollPane(distanceToFrame), constraints); + + constraints.gridx = 0; + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.95")); //$NON-NLS-1$ + panel.add(label, constraints); + constraints.gridx = 1; + JComboBox dotsSide = (JComboBox) propertyToComponent.get(EarthProperty.INNER_SUBPLOT_SIDE)[0]; + panel.add(new JScrollPane(dotsSide), constraints); + + constraints.gridx = 0; + constraints.gridy++; + label = new JLabel("Central plot side"); //$NON-NLS-1$ + panel.add(label, constraints); + constraints.gridx = 1; + JComboBox largeCentralPlotSide = (JComboBox) propertyToComponent.get(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)[0]; + panel.add(new JScrollPane(largeCentralPlotSide), constraints); + + + + constraints.gridx = 0; + constraints.gridy++; + label = new JLabel("Distance between plots in cluster"); + panel.add(label, constraints); + constraints.gridx = 1; + JComboBox plotDistanceInCluster = (JComboBox) propertyToComponent + .get(EarthProperty.DISTANCE_BETWEEN_PLOTS)[0]; + panel.add(new JScrollPane(plotDistanceInCluster), constraints); + + constraints.gridx = 0; + constraints.gridy++; + JLabel area = new JLabel( + "Area (hectares) : " + calculateArea(numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide)); + panel.add(area, constraints); + + ActionListener calculateAreas = actionPerformed -> area.setText("Area (hectares) : " + calculateArea(numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide)); + + plotShape.addActionListener( e-> + handleVisibilityPlotLayout(plotShape, numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide, + plotDistanceInCluster, area, distanceOrRadiuslabel, largeCentralPlotSide) + ); + + numberPoints.addActionListener(calculateAreas); + distanceBetweenPoints.addActionListener(calculateAreas); + distanceToFrame.addActionListener(calculateAreas); + + handleVisibilityPlotLayout(plotShape, numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide, + plotDistanceInCluster, area, distanceOrRadiuslabel, largeCentralPlotSide); + + return panel; + } + + public void handleVisibilityPlotLayout(JComboBox plotShape, JComboBox numberPoints, JComboBox distanceBetweenPoints, + JComboBox distanceToFrame, JComboBox dotsSide, JComboBox distanceBetweenPlots, JLabel area, + JLabel distanceOrRadiuslabel, JComboBox largeCentralPlotSide ) { + numberPoints.setEnabled(false); + distanceBetweenPoints.setEnabled(false); + distanceToFrame.setEnabled(false); + dotsSide.setEnabled(false); + area.setVisible(false); + distanceBetweenPlots.setVisible(false); + distanceBetweenPlots.setEnabled(false); + largeCentralPlotSide.setVisible( false ); + largeCentralPlotSide.setEnabled(false); + + if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE) || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE_WITH_LARGE_CENTRAL_PLOT) ) { + numberPoints.setEnabled(true); + distanceBetweenPoints.setEnabled(true); + distanceToFrame.setEnabled(true); + dotsSide.setEnabled(true); + area.setVisible(true); + distanceOrRadiuslabel.setText(Messages.getString("OptionWizard.36")); + + if( plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE_WITH_LARGE_CENTRAL_PLOT) ) { + largeCentralPlotSide.setVisible( true ); + largeCentralPlotSide.setEnabled(true); + } + + } else if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.CIRCLE) + || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.HEXAGON)) { + distanceBetweenPoints.setEnabled(true); + dotsSide.setEnabled(true); + numberPoints.setEnabled(true); + distanceOrRadiuslabel.setText("Radius"); + } else if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.NFI_THREE_CIRCLES) || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.NFI_FOUR_CIRCLES)) { + dotsSide.setEnabled(true); + distanceBetweenPoints.setEnabled(true); + distanceBetweenPlots.setVisible(true); + distanceBetweenPlots.setEnabled(true); + distanceOrRadiuslabel.setText("Radius of the plots"); + } + } + + private String calculateArea(JComboBox numberOfPoints, JComboBox distanceBetweenPoints, JComboBox distanceToFrame, JComboBox dotsSide) { + double side = 0; + try { + int numberOfPointsI = ((ComboBoxItem) numberOfPoints.getSelectedItem()).getNumberOfPoints(); + int distanceBetweenPointsI = Integer.parseInt((String) distanceBetweenPoints.getSelectedItem()); + int distanceToFrameI = Integer.parseInt((String) distanceToFrame.getSelectedItem()); + + if (numberOfPointsI == 0 || numberOfPointsI == 1) { + + side = 2d * distanceToFrameI; + if (oldSelectedDistance == null) { + oldSelectedDistance = (String) distanceBetweenPoints.getSelectedItem(); + distanceBetweenPoints.setEnabled(false); + } + distanceBetweenPoints.setSelectedItem("0"); + + if (numberOfPointsI == 0) { + dotsSide.setEnabled(false); + } else if (numberOfPointsI == 1) { + dotsSide.setEnabled(true); + } + + } else { + if (oldSelectedDistance != null) { + distanceBetweenPoints.setSelectedItem(oldSelectedDistance); + oldSelectedDistance = null; + } + + distanceBetweenPoints.setEnabled(true); + distanceToFrame.setEnabled(true); + dotsSide.setEnabled(true); + + double pointsByLines = Math.sqrt(numberOfPointsI); + side = 2d * distanceToFrameI + (pointsByLines - 1) * distanceBetweenPointsI; + + } + + } catch (RuntimeException e) { + logger.error("Error calculating area of the plot", e); + } + + DecimalFormat df = new DecimalFormat("###.##"); + return df.format(side * side / 10000d); + } + + private JPanel getPostgreSqlPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), + Messages.getString("OptionWizard.6")); //$NON-NLS-1$ + panel.setBorder(border); + + JLabel label = new JLabel(Messages.getString("OptionWizard.7")); //$NON-NLS-1$ + constraints.gridx = 0; + panel.add(label, constraints); + + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.DB_USERNAME)[0], constraints); + + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.8")); //$NON-NLS-1$ + constraints.gridx = 0; + panel.add(label, constraints); + + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.DB_PASSWORD)[0], constraints); + + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.9")); //$NON-NLS-1$ + constraints.gridx = 0; + panel.add(label, constraints); + + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.DB_NAME)[0], constraints); + + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.26")); //$NON-NLS-1$ + constraints.gridx = 0; + panel.add(label, constraints); + + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.DB_HOST)[0], constraints); + + constraints.gridy++; + label = new JLabel(Messages.getString("OptionWizard.29")); //$NON-NLS-1$ + constraints.gridx = 0; + panel.add(label, constraints); + + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.DB_PORT)[0], constraints); + + constraints.gridx = 2; + panel.add(new JLabel("Default: 5432"), constraints); + + constraints.gridy++; + constraints.gridx = 1; + JButton button = new JButton("Test Connection"); //$NON-NLS-1$ + button.addActionListener( e-> { + String host = ((JTextField) (propertyToComponent.get(EarthProperty.DB_HOST)[0])).getText(); + String port = ((JTextField) (propertyToComponent.get(EarthProperty.DB_PORT)[0])).getText(); + String dbName = ((JTextField) (propertyToComponent.get(EarthProperty.DB_NAME)[0])).getText(); + String username = ((JTextField) (propertyToComponent.get(EarthProperty.DB_USERNAME)[0])).getText(); + String password = ((JTextField) (propertyToComponent.get(EarthProperty.DB_PASSWORD)[0])).getText(); + + String message = CollectEarthUtils.testPostgreSQLConnection(host, port, dbName, username, password); + JOptionPane.showMessageDialog(PropertiesDialog.this.getOwner(), message, "PostgreSQL Connection test", + JOptionPane.INFORMATION_MESSAGE); + }); + panel.add(button, constraints); + + return panel; + } + + private JPanel getSqlLitePanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), + Messages.getString("OptionWizard.30")); //$NON-NLS-1$ + panel.setBorder(border); + + panel.add(propertyToComponent.get(EarthProperty.AUTOMATIC_BACKUP)[0], constraints); + constraints.gridx++; + panel.add(getOpenBackupFolderButton()); + return panel; + } + + private JComponent getSampleDataPanel() { + final JPlotCsvTable samplePlots = new JPlotCsvTable(localPropertiesService.getValue(EarthProperty.SAMPLE_FILE), + surveyLoaded); + + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.fill = GridBagConstraints.BOTH; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + + final JFilePicker refreshTableOnFileChange = getFilePickerSamplePlots(samplePlots); + + panel.add(refreshTableOnFileChange, constraints); + + samplePlots.setFillsViewportHeight(true); + constraints.gridy = 1; + + constraints.weightx = 1.0; + constraints.weighty = 1.0; + constraints.gridwidth = GridBagConstraints.REMAINDER; + constraints.gridheight = GridBagConstraints.REMAINDER; + + samplePlots.setPreferredScrollableViewportSize(samplePlots.getPreferredSize()); + + panel.add(new JScrollPane(samplePlots, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, + ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), constraints); + + return panel; + } + + private JFilePicker getFilePickerSamplePlots(final JPlotCsvTable samplePlots) { + final JFilePicker refreshTableOnFileChange = (JFilePicker) (propertyToComponent + .get(EarthProperty.SAMPLE_FILE)[0]); + refreshTableOnFileChange.addChangeListener(new DocumentListener() { + + @Override + public void changedUpdate(DocumentEvent e) { + // Do not react + } + + @Override + public void insertUpdate(DocumentEvent e) { + refreshTable(); + } + + @Override + public void removeUpdate(DocumentEvent e) { + // Do not react + } + + private void refreshTable() { + samplePlots.refreshTable(refreshTableOnFileChange.getSelectedFilePath()); + + // Do not let the user save the changes if the sample data is wrong!!! + getApplyChangesButton().setEnabled(samplePlots.isDataValid()); + } + }); + return refreshTableOnFileChange; + } + + private JPanel getServerPanel() { + + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + final JPanel typeOfDbPanel = new JPanel(new GridBagLayout()); + final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), + Messages.getString("OptionWizard.3")); //$NON-NLS-1$ + typeOfDbPanel.setBorder(border); + + JLabel label = new JLabel(Messages.getString("OptionWizard.4") + CollectEarthUtils.getComputerIp()); //$NON-NLS-1$ + typeOfDbPanel.add(label, constraints); + constraints.gridy++; + + label = new JLabel(Messages.getString("OptionWizard.5")); //$NON-NLS-1$ + constraints.gridx = 0; + typeOfDbPanel.add(label, constraints); + + constraints.gridx = 1; + typeOfDbPanel.add(propertyToComponent.get(EarthProperty.HOST_PORT_KEY)[0], constraints); + + constraints.gridwidth = GridBagConstraints.REMAINDER; + constraints.gridy++; + constraints.gridx = 0; + + final ButtonGroup bg = new ButtonGroup(); + final JComponent[] dbTypes = propertyToComponent.get(EarthProperty.DB_DRIVER); + + postgresPanel = getPostgreSqlPanel(); + sqlitePanel = getSqlLitePanel(); + + boolean usingPostgreSQL = localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.POSTGRESQL); + enableDBOptions(usingPostgreSQL); + + for (final JComponent typeRadioButton : dbTypes) { + final JRadioButton dbTypeButton = (JRadioButton) typeRadioButton; + bg.add(dbTypeButton); + typeOfDbPanel.add(dbTypeButton, constraints); + constraints.gridy++; + + dbTypeButton.addActionListener(getDbTypeListener()); + dbTypeButton.addActionListener(e -> setRestartRequired(true)); + + if (dbTypeButton.getName().equals(EarthConstants.CollectDBDriver.POSTGRESQL.name())) { + typeOfDbPanel.add(postgresPanel, constraints); + constraints.gridy++; + + } else { + typeOfDbPanel.add(sqlitePanel, constraints); + constraints.gridy++; + } + } + return typeOfDbPanel; + } + + private Component getOpenBackupFolderButton() { + + AbstractAction backupAction = new AbstractAction(Messages.getString("OptionWizard.10")) { //$NON-NLS-1$ + + private static final long serialVersionUID = 1L; + + @Override + public void actionPerformed(ActionEvent e) { + try { + + CollectEarthUtils.openFolderInExplorer(backupFolder); + + } catch (final IOException e1) { + logger.error("Error when opening the explorer window to visualize backups", e1); //$NON-NLS-1$ } } - }.start(); + + }; + + return new JButton(backupAction); + + } + + private JComponent getSurveyDefinitonPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.fill = GridBagConstraints.HORIZONTAL; + constraints.gridwidth = 2; + panel.add(propertyToComponent.get(EarthProperty.OPEN_BALLOON_IN_BROWSER)[0], constraints); + + constraints.gridy++; + constraints.gridwidth = 1; + final JLabel label = new JLabel(Messages.getString("OptionWizard.43")); //$NON-NLS-1$ + panel.add(label, constraints); + constraints.gridx = 1; + panel.add(propertyToComponent.get(EarthProperty.SURVEY_NAME)[0], constraints); + + constraints.gridy++; + constraints.gridwidth = GridBagConstraints.REMAINDER; + constraints.gridx = 0; + panel.add(propertyToComponent.get(EarthProperty.KML_TEMPLATE_KEY)[0], constraints); + + constraints.gridy++; + constraints.gridx = 0; + panel.add(propertyToComponent.get(EarthProperty.BALLOON_TEMPLATE_KEY)[0], constraints); + + constraints.gridy++; + constraints.gridx = 0; + + panel.add(propertyToComponent.get(EarthProperty.METADATA_FILE)[0], constraints); + + return panel; + } + + private void initilizeInputs() { + + final JCheckBox backupCheckbox = new JCheckBox(Messages.getString("OptionWizard.44")); //$NON-NLS-1$ + backupCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.AUTOMATIC_BACKUP))); + propertyToComponent.put(EarthProperty.AUTOMATIC_BACKUP, new JComponent[] { backupCheckbox }); + + final JCheckBox openEarthEngineCheckbox = new JCheckBox(Messages.getString("OptionWizard.45")); //$NON-NLS-1$ + openEarthEngineCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_EXPLORER))); + propertyToComponent.put(EarthProperty.OPEN_GEE_EXPLORER, new JComponent[] { openEarthEngineCheckbox }); + + final JCheckBox openGEEAppCheckbox = new JCheckBox("Google Earth Engine APP (no sign-in)"); //$NON-NLS-1$ + openGEEAppCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_APP))); + propertyToComponent.put(EarthProperty.OPEN_GEE_APP, new JComponent[] { openGEEAppCheckbox }); + + final JCheckBox openTimelapseCheckbox = new JCheckBox(Messages.getString("OptionWizard.46")); //$NON-NLS-1$ + openTimelapseCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_TIMELAPSE))); + propertyToComponent.put(EarthProperty.OPEN_TIMELAPSE, new JComponent[] { openTimelapseCheckbox }); + + final JCheckBox openEarthMapCheckbox = new JCheckBox(Messages.getString("OptionWizard.105")); //$NON-NLS-1$ + openEarthMapCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_EARTH_MAP))); + propertyToComponent.put(EarthProperty.OPEN_EARTH_MAP, new JComponent[] { openEarthMapCheckbox }); + + final JCheckBox openBingCheckbox = new JCheckBox(Messages.getString("OptionWizard.47")); //$NON-NLS-1$ + openBingCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BING_MAPS))); + propertyToComponent.put(EarthProperty.OPEN_BING_MAPS, new JComponent[] { openBingCheckbox }); + + final JCheckBox openPlanetCheckbox = new JCheckBox(Messages.getString("OptionWizard.100")); //$NON-NLS-1$ + openPlanetCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_PLANET_MAPS))); + propertyToComponent.put(EarthProperty.OPEN_PLANET_MAPS, new JComponent[] { openPlanetCheckbox }); + + final JCheckBox openMonthlyNICFICheckbox = new JCheckBox(Messages.getString("OptionWizard.110")); //$NON-NLS-1$ + openMonthlyNICFICheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.PLANET_MAPS_MONHLY))); + propertyToComponent.put(EarthProperty.PLANET_MAPS_MONHLY, new JComponent[] { openMonthlyNICFICheckbox }); + + + final JPasswordField planetAPIKeyTextField = new JPasswordField( + localPropertiesService.getValue(EarthProperty.PLANET_MAPS_KEY)); + planetAPIKeyTextField.setMinimumSize(new Dimension( 250, 20 )); + planetAPIKeyTextField.setEnabled( localPropertiesService.isPlanetMapsSupported() ); + propertyToComponent.put(EarthProperty.PLANET_MAPS_KEY, new JComponent[] { planetAPIKeyTextField }); + + openMonthlyNICFICheckbox.setEnabled( openPlanetCheckbox.isSelected() ); + planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ); + + openPlanetCheckbox.addActionListener( e-> { + planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ); + openMonthlyNICFICheckbox.setEnabled( openPlanetCheckbox.isSelected() ); + }); + openMonthlyNICFICheckbox.addActionListener( e-> planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ) ); + + + final JCheckBox openSecureWatchCheckbox = new JCheckBox(Messages.getString("OptionWizard.102")); //$NON-NLS-1$ + openSecureWatchCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_MAXAR_SECUREWATCH))); + propertyToComponent.put(EarthProperty.OPEN_MAXAR_SECUREWATCH, new JComponent[] { openSecureWatchCheckbox }); + + final JTextField secureWatchUrlTextField = new JTextField( + localPropertiesService.getValue(EarthProperty.MAXAR_SECUREWATCH_URL)); + secureWatchUrlTextField.setMinimumSize(new Dimension( 250, 20 )); + propertyToComponent.put(EarthProperty.MAXAR_SECUREWATCH_URL, new JComponent[] { secureWatchUrlTextField }); + secureWatchUrlTextField.setEnabled( localPropertiesService.isSecureWatchSupported() ); + propertyToComponent.put(EarthProperty.MAXAR_SECUREWATCH_URL, new JComponent[] { secureWatchUrlTextField }); + openSecureWatchCheckbox.addActionListener( e -> secureWatchUrlTextField.setEnabled( openSecureWatchCheckbox.isSelected() ) ); + + final JTextField extraUrlTextField = new JTextField( + localPropertiesService.getValue(EarthProperty.EXTRA_MAP_URL)); + extraUrlTextField.setMinimumSize(new Dimension( 250, 20 )); + propertyToComponent.put(EarthProperty.EXTRA_MAP_URL, new JComponent[] { extraUrlTextField }); + + final JCheckBox openBaiduCheckbox = new JCheckBox("Open Baidu Maps"); + openBaiduCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BAIDU_MAPS))); + propertyToComponent.put(EarthProperty.OPEN_BAIDU_MAPS, new JComponent[] { openBaiduCheckbox }); + + final JCheckBox openYandexCheckbox = new JCheckBox("Open Yandex maps for the plot area"); + openYandexCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_YANDEX_MAPS))); + propertyToComponent.put(EarthProperty.OPEN_YANDEX_MAPS, new JComponent[] { openYandexCheckbox }); + + final JCheckBox openHereCheckbox = new JCheckBox(Messages.getString("OptionWizard.59")); //$NON-NLS-1$ + openHereCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_HERE_MAPS))); + propertyToComponent.put(EarthProperty.OPEN_HERE_MAPS, new JComponent[] { openHereCheckbox }); + + final JCheckBox openGeePlaygroundCheckbox = new JCheckBox(Messages.getString("OptionWizard.58")); //$NON-NLS-1$ + openGeePlaygroundCheckbox + .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_CODE_EDITOR))); + propertyToComponent.put(EarthProperty.OPEN_GEE_CODE_EDITOR, new JComponent[] { openGeePlaygroundCheckbox }); + + final JCheckBox openInSeparateWindowCheckbox = new JCheckBox(Messages.getString("OptionWizard.48")); //$NON-NLS-1$ + openInSeparateWindowCheckbox.setSelected( + Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BALLOON_IN_BROWSER))); + propertyToComponent.put(EarthProperty.OPEN_BALLOON_IN_BROWSER, + new JComponent[] { openInSeparateWindowCheckbox }); + + final JFilePicker csvWithPlotData = new JFilePicker(Messages.getString("OptionWizard.49"), //$NON-NLS-1$ + localPropertiesService.getValue(EarthProperty.SAMPLE_FILE), Messages.getString("OptionWizard.50"), DlgMode.MODE_OPEN); // $NON-NLS-1$ + + csvWithPlotData.addFileTypeFilter(".csv,.ced", Messages.getString("OptionWizard.52"), true); //$NON-NLS-1$ //$NON-NLS-2$ + propertyToComponent.put(EarthProperty.SAMPLE_FILE, new JComponent[] { csvWithPlotData }); + + final JComboBox plotShape = new JComboBox<>(SAMPLE_SHAPE.values()); + try { + plotShape.setSelectedItem(SAMPLE_SHAPE.valueOf(localPropertiesService.getValue(EarthProperty.SAMPLE_SHAPE))); + } catch (Exception e1) { + logger.error("The selected shape type is not supported " + localPropertiesService.getValue(EarthProperty.SAMPLE_SHAPE), e1 ); + } + propertyToComponent.put(EarthProperty.SAMPLE_SHAPE, new JComponent[] { plotShape }); + + final JComboBox comboNumberOfPoints = new JComboBox<>( + new ComboBoxItem[] { COMBO_BOX_ITEM_SQUARE, COMBO_BOX_ITEM_CENTRAL_POINT, new ComboBoxItem(4, "2x2"), //$NON-NLS-1$ //$NON-NLS-2$ + // //$NON-NLS-3$ + new ComboBoxItem(9, "3x3"), new ComboBoxItem(16, "4x4"), new ComboBoxItem(25, "5x5"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + new ComboBoxItem(36, "6x6"), //$NON-NLS-1$ + new ComboBoxItem(49, "7x7") }); //$NON-NLS-1$ + if( StringUtils.isNotBlank( localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT) ) ){ + try { + comboNumberOfPoints.setSelectedItem(new ComboBoxItem( + Integer.parseInt(localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT)), + "")); //$NON-NLS-1$ + } catch (NumberFormatException e1) { + logger.error("This should be a number {}", localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT), e1); + } + } + propertyToComponent.put(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT, + new JComponent[] { comboNumberOfPoints }); + + final String[] listOfNumbers = new String[1500]; + final String[] listOfNumbersFromTwo = new String[1500]; + + for (int index = 0; index < listOfNumbers.length; index++) { + listOfNumbers[index] = Integer.toString( index ); //$NON-NLS-1$ + listOfNumbersFromTwo[index] = Integer.toString( index + 2 ); //$NON-NLS-1$ + } + + final JComboBox listOfDistanceBetweenPoints = new JComboBox<>(listOfNumbersFromTwo); + listOfDistanceBetweenPoints + .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS)); + listOfDistanceBetweenPoints.setAutoscrolls(true); + + propertyToComponent.put(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS, + new JComponent[] { listOfDistanceBetweenPoints }); + + final JComboBox listOfDistanceBetweenPlots = new JComboBox<>(listOfNumbersFromTwo); + listOfDistanceBetweenPlots + .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS)); + listOfDistanceBetweenPlots.setAutoscrolls(true); + + propertyToComponent.put(EarthProperty.DISTANCE_BETWEEN_PLOTS, new JComponent[] { listOfDistanceBetweenPlots }); + + final JComboBox listOfDistanceToBorder = new JComboBox<>(listOfNumbers); + listOfDistanceToBorder + .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES)); + listOfDistanceToBorder.setAutoscrolls(true); + + propertyToComponent.put(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES, new JComponent[] { listOfDistanceToBorder }); + + final JComboBox listOfSizeofSamplingDot = new JComboBox<>(listOfNumbersFromTwo); + listOfSizeofSamplingDot.setSelectedItem(localPropertiesService.getValue(EarthProperty.INNER_SUBPLOT_SIDE)); + listOfSizeofSamplingDot.setAutoscrolls(true); + + propertyToComponent.put(EarthProperty.INNER_SUBPLOT_SIDE, new JComponent[] { listOfSizeofSamplingDot }); + + final JComboBox listOfSideOflargeCentralPlot = new JComboBox<>(listOfNumbersFromTwo); + listOfSideOflargeCentralPlot.setSelectedItem(localPropertiesService.getValue(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)); + listOfSideOflargeCentralPlot.setAutoscrolls(true); + + propertyToComponent.put(EarthProperty.LARGE_CENTRAL_PLOT_SIDE, new JComponent[] { listOfSideOflargeCentralPlot }); + + + final JRadioButton chromeChooser = new JRadioButton("Chrome"); //$NON-NLS-1$ + chromeChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() + .equals(EarthConstants.CHROME_BROWSER)); + chromeChooser.setName(EarthConstants.CHROME_BROWSER); + + final JRadioButton firefoxChooser = new JRadioButton("Firefox"); //$NON-NLS-1$ + firefoxChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() + .equals(EarthConstants.FIREFOX_BROWSER)); + firefoxChooser.setName(EarthConstants.FIREFOX_BROWSER); + + final JRadioButton edgeChooser = new JRadioButton("Edge"); //$NON-NLS-1$ + edgeChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() + .equals(EarthConstants.EDGE_BROWSER)); + edgeChooser.setName(EarthConstants.EDGE_BROWSER); + + propertyToComponent.put(EarthProperty.BROWSER_TO_USE, new JComponent[] { firefoxChooser, chromeChooser, edgeChooser}); + final JFilePicker saikuPath = new JFilePicker(Messages.getString("OptionWizard.65"), //$NON-NLS-1$ + localPropertiesService.getValue(EarthProperty.SAIKU_SERVER_FOLDER), + Messages.getString("OptionWizard.66"), DlgMode.MODE_OPEN); //$NON-NLS-1$ + saikuPath.setFolderChooser(); + saikuPath.addChangeListener(new DocumentListener() { + + private void showSaikuWarning() { + final File saikuFolder = new File(saikuPath.getSelectedFilePath()); + if ( !saikuService.isSaikuFolder(saikuFolder)) { + JOptionPane.showMessageDialog(PropertiesDialog.this, Messages.getString("OptionWizard.27"), //$NON-NLS-1$ + Messages.getString("OptionWizard.28"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ + saikuPath.getTextField().setBackground(CollectEarthWindow.ERROR_COLOR); + } else { + saikuPath.getTextField().setBackground(Color.white); + } + } + + @Override + public void removeUpdate(DocumentEvent e) { + // Do not react + } + + @Override + public void insertUpdate(DocumentEvent e) { + showSaikuWarning(); + } + + @Override + public void changedUpdate(DocumentEvent e) { + // Do not react + } + }); + propertyToComponent.put(EarthProperty.SAIKU_SERVER_FOLDER, new JComponent[] { saikuPath }); + + final JFilePicker kmlTemplatePath = new JFilePicker(Messages.getString("OptionWizard.79"), //$NON-NLS-1$ + localPropertiesService.getValue(EarthProperty.KML_TEMPLATE_KEY), Messages.getString("OptionWizard.80"), //$NON-NLS-1$ + DlgMode.MODE_OPEN); + kmlTemplatePath.addFileTypeFilter(".fmt", Messages.getString("OptionWizard.82"), true); //$NON-NLS-1$ //$NON-NLS-2$ + propertyToComponent.put(EarthProperty.KML_TEMPLATE_KEY, new JComponent[] { kmlTemplatePath }); + + final JFilePicker htmlBalloonPath = new JFilePicker(Messages.getString("OptionWizard.83"), //$NON-NLS-1$ + localPropertiesService.getValue(EarthProperty.BALLOON_TEMPLATE_KEY), + Messages.getString("OptionWizard.84"), DlgMode.MODE_OPEN); //$NON-NLS-1$ + htmlBalloonPath.addFileTypeFilter(".html,.htm", Messages.getString("OptionWizard.86"), true); //$NON-NLS-1$ //$NON-NLS-2$ + propertyToComponent.put(EarthProperty.BALLOON_TEMPLATE_KEY, new JComponent[] { htmlBalloonPath }); + + final JFilePicker idmPath = new JFilePicker(Messages.getString("OptionWizard.87"), //$NON-NLS-1$ + localPropertiesService.getImdFile(), Messages.getString("OptionWizard.88"), DlgMode.MODE_OPEN); //$NON-NLS-1$ + idmPath.addFileTypeFilter(".xml", Messages.getString("OptionWizard.90"), true); //$NON-NLS-1$ //$NON-NLS-2$ + propertyToComponent.put(EarthProperty.METADATA_FILE, new JComponent[] { idmPath }); + + final JTextField surveyNameTextField = new JTextField( + localPropertiesService.getValue(EarthProperty.SURVEY_NAME)); + surveyNameTextField.setEnabled(false); + propertyToComponent.put(EarthProperty.SURVEY_NAME, new JComponent[] { surveyNameTextField }); + + // Database options + + final JRadioButton instanceTypeServer = new JRadioButton(Messages.getString("OptionWizard.91")); //$NON-NLS-1$ + instanceTypeServer.setSelected(localPropertiesService.getOperationMode().equals(OperationMode.SERVER_MODE)); + instanceTypeServer.setName(EarthConstants.OperationMode.SERVER_MODE.name()); + + final JRadioButton instanceTypeClient = new JRadioButton(Messages.getString("OptionWizard.92")); //$NON-NLS-1$ + instanceTypeClient.setSelected(localPropertiesService.getOperationMode().equals(OperationMode.CLIENT_MODE)); + instanceTypeClient.setName(EarthConstants.OperationMode.CLIENT_MODE.name()); + propertyToComponent.put(EarthProperty.OPERATION_MODE, + new JComponent[] { instanceTypeServer, instanceTypeClient }); + + final JTextField collectEarthServerIp = new JTextField(localPropertiesService.getValue(EarthProperty.HOST_KEY)); + propertyToComponent.put(EarthProperty.HOST_KEY, new JComponent[] { collectEarthServerIp }); + + final JTextField collectEarthServerIpPort = new JTextField(localPropertiesService.getPort()); + final JTextField collectEarthServerLocalPort = new JTextField( + localPropertiesService.getValue(EarthProperty.HOST_PORT_KEY)); + propertyToComponent.put(EarthProperty.HOST_PORT_KEY, + new JComponent[] { collectEarthServerIpPort, collectEarthServerLocalPort }); + + final JRadioButton sqliteDbType = new JRadioButton(Messages.getString("OptionWizard.93")); //$NON-NLS-1$ + sqliteDbType.setSelected(localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.SQLITE)); + sqliteDbType.setName(CollectDBDriver.SQLITE.name()); + + final JRadioButton postgresDbType = new JRadioButton(Messages.getString("OptionWizard.94")); //$NON-NLS-1$ + boolean usingPostgreSQL = localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.POSTGRESQL); + postgresDbType.setSelected(usingPostgreSQL); + postgresDbType.setName(CollectDBDriver.POSTGRESQL.name()); + propertyToComponent.put(EarthProperty.DB_DRIVER, new JComponent[] { sqliteDbType, postgresDbType }); + + final JTextField dbUserName = new JTextField(localPropertiesService.getValue(EarthProperty.DB_USERNAME)); + propertyToComponent.put(EarthProperty.DB_USERNAME, new JComponent[] { dbUserName }); + + final JTextField dbPassword = new JTextField(localPropertiesService.getValue(EarthProperty.DB_PASSWORD)); + propertyToComponent.put(EarthProperty.DB_PASSWORD, new JComponent[] { dbPassword }); + + final JTextField dbName = new JTextField(localPropertiesService.getValue(EarthProperty.DB_NAME)); + propertyToComponent.put(EarthProperty.DB_NAME, new JComponent[] { dbName }); + + final JTextField dbHost = new JTextField(localPropertiesService.getValue(EarthProperty.DB_HOST)); + propertyToComponent.put(EarthProperty.DB_HOST, new JComponent[] { dbHost }); + + final JTextField dbPort = new JTextField(localPropertiesService.getValue(EarthProperty.DB_PORT)); + propertyToComponent.put(EarthProperty.DB_PORT, new JComponent[] { dbPort }); + + } + + public boolean isRestartRequired() { + return restartRequired; + } + + public void setRestartRequired(boolean restartRequired) { + this.restartRequired = restartRequired; } } From 6153daac49fa0977c34fd7524732da6cfa2ee198 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:12 +0100 Subject: [PATCH 1293/1620] New translations RemovePlotsFromDBDlg.java (French) --- .../earth/app/view/Messages_fr.properties | 1345 +++-------------- 1 file changed, 231 insertions(+), 1114 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 7eb0424502..eb9b80be90 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,1209 +1,326 @@ package org.openforis.collect.earth.app.view; -import java.awt.BorderLayout; import java.awt.Color; -import java.awt.Component; -import java.awt.Container; import java.awt.Dimension; +import java.awt.Frame; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; -import java.awt.GridLayout; -import java.awt.Insets; -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; -import java.io.IOException; -import java.text.DecimalFormat; import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; +import java.util.Arrays; import java.util.List; -import javax.swing.AbstractAction; -import javax.swing.AbstractButton; -import javax.swing.ButtonGroup; import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JComponent; import javax.swing.JDialog; -import javax.swing.JFrame; +import javax.swing.JEditorPane; import javax.swing.JLabel; -import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; -import javax.swing.JPasswordField; -import javax.swing.JRadioButton; import javax.swing.JScrollPane; -import javax.swing.JTabbedPane; -import javax.swing.JTextField; -import javax.swing.ListSelectionModel; -import javax.swing.ScrollPaneConstants; -import javax.swing.border.BevelBorder; -import javax.swing.border.Border; -import javax.swing.border.TitledBorder; +import javax.swing.SwingUtilities; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; -import org.openforis.collect.earth.app.EarthConstants.OperationMode; -import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.AnalysisSaikuService; -import org.openforis.collect.earth.app.service.EarthProjectsService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.app.service.EarthSurveyService; import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.collect.manager.RecordManager; +import org.openforis.collect.model.CollectRecord; import org.openforis.collect.model.CollectSurvey; +import org.openforis.collect.persistence.RecordPersistenceException; +import org.openforis.idm.metamodel.AttributeDefinition; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ -public class PropertiesDialog extends JDialog { +import com.opencsv.CSVReader; - private static final ComboBoxItem COMBO_BOX_ITEM_CENTRAL_POINT = new ComboBoxItem(1, - Messages.getString("OptionWizard.54")); +@Component +@Lazy +public class RemovePlotsFromDBDlg { - private static final ComboBoxItem COMBO_BOX_ITEM_SQUARE = new ComboBoxItem(0, - Messages.getString("OptionWizard.53")); + @Autowired + private RecordManager recordManager; - private static final long serialVersionUID = -6760020609229102842L; + @Autowired + private EarthSurveyService earthSurveyService; - private final HashMap, JComponent[]> propertyToComponent = new HashMap<>(); - private final transient Logger logger = LoggerFactory.getLogger(this.getClass()); + @SuppressWarnings("unused") + private static final long serialVersionUID = 5175096170385736616L; + private CollectSurvey survey; + private Logger logger = LoggerFactory.getLogger(RemovePlotsFromDBDlg.class); - JPanel postgresPanel; - JPanel sqlitePanel; + private JButton deleteFromDB; + private JFilePicker filePicker; - private transient LocalPropertiesService localPropertiesService; + private JDialog dlg; - String backupFolder; - - private transient AnalysisSaikuService saikuService; - - private transient EarthProjectsService projectsService; - - private boolean restartRequired; - - private String oldSelectedDistance; - - private CollectSurvey surveyLoaded; - - private JButton applyChanges; - - public PropertiesDialog(JFrame frame, LocalPropertiesService localPropertiesService, - EarthProjectsService projectsService, String backupFolder, AnalysisSaikuService saikuService, - CollectSurvey surveyLoaded) { - super(frame, Messages.getString("OptionWizard.0")); //$NON-NLS-1$ - this.localPropertiesService = localPropertiesService; - this.projectsService = projectsService; - this.backupFolder = backupFolder; - this.saikuService = saikuService; - this.surveyLoaded = surveyLoaded; - this.setLocationRelativeTo(null); - this.setSize(new Dimension(600, 620)); - this.setModal(true); - this.setResizable(false); - initilizeInputs(); - buildMainPane(); - centreWindow(); - - } - - private void centreWindow() { - Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize(); - int x = (int) ((dimension.getWidth() - getWidth()) / 2); - int y = (int) ((dimension.getHeight() - getHeight()) / 2); - setLocation(x, y); - } - - private void buildMainPane() { - - final JPanel panel = new JPanel(new BorderLayout()); - panel.add(getOptionTabs(), BorderLayout.CENTER); - final JPanel buttonPanel = new JPanel(); - buttonPanel.add(getApplyChangesButton()); - buttonPanel.add(getCancelButton()); - panel.add(buttonPanel, BorderLayout.PAGE_END); - this.add(panel); - - } - - private void enableContainer(Container container, boolean enable) { - final Component[] components = container.getComponents(); - for (final Component component : components) { - component.setEnabled(enable); - if (component instanceof Container) { - enableContainer((Container) component, enable); - } - } - } - - private JComponent getBrowsersOptionsPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - final JPanel browserChooserPanel = new JPanel(); - final Border browserBorder = new TitledBorder(new BevelBorder(BevelBorder.LOWERED), - Messages.getString("OptionWizard.1")); //$NON-NLS-1$ - browserChooserPanel.setBorder(browserBorder); - GridLayout experimentLayout = new GridLayout(0,1); - browserChooserPanel.setLayout( experimentLayout ); - - final ButtonGroup browserChooser = new ButtonGroup(); - final JComponent[] browsers = propertyToComponent.get(EarthProperty.BROWSER_TO_USE); - - for (final JComponent browserRadioButton : browsers) { - browserChooserPanel.add(browserRadioButton); - browserChooser.add((AbstractButton) browserRadioButton); - - ((JRadioButton) browserRadioButton).addActionListener(e -> setRestartRequired(true)); - } - constraints.gridy++; - panel.add(browserChooserPanel, constraints); - - constraints.gridy++; - constraints.gridx = 0; - panel.add(propertyToComponent.get(EarthProperty.SAIKU_SERVER_FOLDER)[0], constraints); - - return panel; - } - - private JComponent getIntegrationsPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - panel.add(propertyToComponent.get(EarthProperty.OPEN_GEE_APP)[0], constraints); - - constraints.gridy++; - panel.add(propertyToComponent.get(EarthProperty.OPEN_BING_MAPS)[0], constraints); - - constraints.gridy++; - panel.add(propertyToComponent.get(EarthProperty.OPEN_EARTH_MAP)[0], constraints); - - - constraints.gridy++; - constraints.gridwidth = 1; - panel.add(propertyToComponent.get(EarthProperty.OPEN_PLANET_MAPS)[0], constraints); - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.PLANET_MAPS_MONHLY)[0], constraints); - - constraints.gridy++; - constraints.gridx = 0; - constraints.gridwidth = 1; - final JLabel label = new JLabel(Messages.getString("OptionWizard.101")); //$NON-NLS-1$ - panel.add(label, constraints); - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.PLANET_MAPS_KEY)[0], constraints); - - constraints.gridx = 0; - constraints.gridy++; - constraints.gridwidth = 2; - panel.add(propertyToComponent.get(EarthProperty.OPEN_MAXAR_SECUREWATCH)[0], constraints); - - constraints.gridy++; - constraints.gridwidth = 1; - final JLabel labelMaxar = new JLabel(Messages.getString("OptionWizard.1021")); //$NON-NLS-1$ - panel.add(labelMaxar, constraints); - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.MAXAR_SECUREWATCH_URL)[0], constraints); - - constraints.gridx = 0; - constraints.gridy++; - constraints.gridwidth = 2; - panel.add(propertyToComponent.get(EarthProperty.OPEN_YANDEX_MAPS)[0], constraints); - - constraints.gridy++; - panel.add(propertyToComponent.get(EarthProperty.OPEN_BAIDU_MAPS)[0], constraints); - - constraints.gridy++; - final JLabel label2 = new JLabel(Messages.getString("OptionWizard.103")); //$NON-NLS-1$ - panel.add(label2, constraints); - constraints.gridy++; - panel.add(propertyToComponent.get(EarthProperty.EXTRA_MAP_URL)[0], constraints); - - constraints.gridy++; - constraints.gridx = 0; - constraints.gridwidth = 2; - panel.add(propertyToComponent.get(EarthProperty.OPEN_GEE_CODE_EDITOR)[0], constraints); - - - return panel; + public RemovePlotsFromDBDlg() { + super(); } - - private Component getApplyChangesButton() { - if (applyChanges == null) { - applyChanges = new JButton(Messages.getString("OptionWizard.15")); - applyChanges.addActionListener( - new ApplyOptionChangesListener(this, localPropertiesService, propertyToComponent) { - @Override - protected void applyProperties() { - new Thread("Applying properties dialog") { - @Override - public void run() { - savePropertyValues(); - if (isRestartRequired()) { - - restartEarth(); - } else { - EarthApp.executeKmlLoadAsynchronously(PropertiesDialog.this); - } - } - }.start(); - } - }); + private class DeleteResults { + private boolean success; + private Integer plotsDeleted; + private Integer plotsNotFoundInDB; + private Integer plotsErrorWhenDeleting; + private List messages; + + public DeleteResults(boolean success, Integer plotsDeleted, Integer plotsNotFoundInDB, + Integer plotsErrorWhenDeleting, List messages) { + super(); + this.success = success; + this.plotsDeleted = plotsDeleted; + this.plotsNotFoundInDB = plotsNotFoundInDB; + this.plotsErrorWhenDeleting = plotsErrorWhenDeleting; + this.messages = messages; } - return applyChanges; - } - public void closeDialog() { - this.dispose(); } - private Component getCancelButton() { - final JButton cancelButton = new JButton(Messages.getString("OptionWizard.24")); //$NON-NLS-1$ - cancelButton.addActionListener( e -> PropertiesDialog.this.dispose() ); - return cancelButton; + public void open(Frame owner, CollectSurvey survey) { + this.dlg = new JDialog(owner); + this.survey = survey; + this.dlg.setModal(true); + this.dlg.setSize(new Dimension(700, 350)); + this.dlg.setLocationRelativeTo(owner); + this.dlg.setTitle("Tool for removing plots from DB using a CSV with plot IDs"); + initLayout(); + dlg.setVisible(true); } - private JComponent getOperationModePanel() { - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - final JPanel typeOfUsePanel = new JPanel(new GridBagLayout()); - final Border border = new TitledBorder(new BevelBorder(BevelBorder.LOWERED), - Messages.getString("OptionWizard.2")); //$NON-NLS-1$ - typeOfUsePanel.setBorder(border); - - JPanel serverPanel = getServerPanel(); - typeOfUsePanel.add(serverPanel, constraints); - - return typeOfUsePanel; - } - - private void enableDBOptions(boolean isPostgreDb) { - enableContainer(postgresPanel, isPostgreDb); - enableContainer(sqlitePanel, !isPostgreDb); - } - - private ActionListener getDbTypeListener() { - return e -> { - final JRadioButton theJRB = (JRadioButton) e.getSource(); - - boolean isPostgreDb = theJRB.getName().equals(CollectDBDriver.POSTGRESQL.name()); - enableDBOptions(isPostgreDb); - }; - } - - private JTabbedPane getOptionTabs() { - final JTabbedPane tabbedPane = new JTabbedPane(); - tabbedPane.setSize(550, 300); - final JComponent panel1 = getSampleDataPanel(); - tabbedPane.addTab(Messages.getString("OptionWizard.31"), panel1); //$NON-NLS-1$ - - final JComponent panel2 = getPlotOptionsPanel(); - tabbedPane.addTab(Messages.getString("OptionWizard.32"), panel2); //$NON-NLS-1$ - - final JComponent panel3 = getSurveyDefinitonPanel(); - tabbedPane.addTab(Messages.getString("OptionWizard.33"), panel3); //$NON-NLS-1$ - - final JComponent panel41 = getIntegrationsPanel(); - tabbedPane.addTab(Messages.getString("OptionWizard.34"), panel41); //$NON-NLS-1$ - - final JComponent panel4 = getBrowsersOptionsPanel(); - tabbedPane.addTab(Messages.getString("OptionWizard.104"), panel4); //$NON-NLS-1$ - - final JComponent panel5 = getOperationModePanelScroll(); - tabbedPane.addTab(Messages.getString("OptionWizard.25"), panel5); //$NON-NLS-1$ - - final JComponent panel6 = getProjectsPanelScroll(); - tabbedPane.addTab(Messages.getString("OptionWizard.40"), panel6); //$NON-NLS-1$ - - return tabbedPane; - } - - private JComponent getProjectsPanelScroll() { - final JComponent projectsPanel = getProjectsPanel(); - return new JScrollPane(projectsPanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); - } - - private JComponent getProjectsPanel() { + private void initLayout() { final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.fill = GridBagConstraints.BOTH; - - JButton importNewButton = new JButton(Messages.getString("OptionWizard.41")); //$NON-NLS-1$ - importNewButton.addActionListener(new ApplyOptionChangesListener(this, localPropertiesService) { - - @Override - protected void applyProperties() { - final File[] selectedProjectFile = JFileChooserExistsAware.getFileChooserResults( - DataFormat.PROJECT_DEFINITION_FILE, false, false, null, localPropertiesService, - (JFrame) PropertiesDialog.this.getParent()); - - if (selectedProjectFile != null && selectedProjectFile.length == 1) { - try { - projectsService.loadCompressedProjectFile(selectedProjectFile[0]); - restartEarth(); - } catch (Exception e1) { - JOptionPane.showMessageDialog(PropertiesDialog.this, e1.getMessage(), - Messages.getString("OptionWizard.51"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - logger.error("Error importing project file " + selectedProjectFile[0].getAbsolutePath(), e1); //$NON-NLS-1$ - } - - } - } - }); - - panel.add(importNewButton, constraints); - - final JPanel typeOfDbPanel = new JPanel(new GridBagLayout()); - final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), - Messages.getString("OptionWizard.57")); //$NON-NLS-1$ - typeOfDbPanel.setBorder(border); - - constraints.gridx = 0; - constraints.gridy = 1; - panel.add(typeOfDbPanel, constraints); - - List listOfProjectsByName = new ArrayList<>(); - listOfProjectsByName.addAll(projectsService.getProjectList().keySet()); - Collections.sort(listOfProjectsByName); - final JList listOfProjects = new JList<>(listOfProjectsByName.toArray(new String[0])); // data has type Object[] - listOfProjects.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - listOfProjects.setLayoutOrientation(JList.VERTICAL); - listOfProjects.setVisibleRowCount(-1); - - JScrollPane listScroller = new JScrollPane(listOfProjects); - listScroller.setPreferredSize(new Dimension(250, 300)); - - constraints.gridy = 0; - constraints.gridx = GridBagConstraints.RELATIVE; - typeOfDbPanel.add(listScroller, constraints); - - final JButton openProject = new JButton(Messages.getString("OptionWizard.56")); //$NON-NLS-1$ - openProject.setEnabled(false); - openProject.addActionListener(new ApplyOptionChangesListener(this, localPropertiesService) { - - @Override - protected void applyProperties() { - - File projectFolder = projectsService.getProjectList().get(listOfProjects.getSelectedValue()); - - try { - projectsService.loadProjectInFolder(projectFolder); - restartEarth(); - } catch (Exception e1) { - JOptionPane.showMessageDialog(PropertiesDialog.this, e1.getMessage(), - Messages.getString("OptionWizard.55"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - logger.error("Error importing project folder " + projectFolder.getAbsolutePath(), e1); //$NON-NLS-1$ - } - - } - - }); - - listOfProjects.addListSelectionListener(e -> openProject.setEnabled(listOfProjects.getSelectedValue() != null) ); - - typeOfDbPanel.add(openProject); - - return panel; - } - - private JScrollPane getOperationModePanelScroll() { - final JComponent operationModePanel = getOperationModePanel(); - return new JScrollPane(operationModePanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + GridBagConstraints c = new GridBagConstraints(); + + int row = 0; + c.fill = GridBagConstraints.BOTH; + + c.gridx = 0; + c.gridwidth = 2; + panel.add(new JLabel("" + + "This utility deletes plots that are already collected and present in the Collect Earth Database.
" + + "Make sure to backup the data in your DB before attempting to delete plots ( use the Tools->Data Import/Export->Export data to Collect Backup function)." + + "
" + + "The next field expects a CSV file for which the IDs of the plots to be deleted are present.The headers of the columns should be the names of the key attributes of the survey (usually just one, called ID, but it could be more)." + + ""), c); + c.gridy = row++; + + c.gridx = 0; + c.gridwidth = 2; + c.gridy = row++; + panel.add(getCsvFilePicker(), c); + c.gridy = row; + + panel.add(getDeleteButton(), c); + this.dlg.add(panel); } - private JComponent getPlotOptionsPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.fill = GridBagConstraints.HORIZONTAL; - - JLabel label = new JLabel("Plot shape"); - panel.add(label, constraints); - - constraints.gridx = 1; - JComboBox plotShape = (JComboBox) propertyToComponent.get(EarthProperty.SAMPLE_SHAPE)[0]; - panel.add(plotShape, constraints); - - constraints.gridx = 0; - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.35")); //$NON-NLS-1$ - panel.add(label, constraints); - - constraints.gridx = 1; - JComboBox numberPoints = (JComboBox) propertyToComponent - .get(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT)[0]; - panel.add(numberPoints, constraints); - - constraints.gridx = 0; - constraints.gridy++; - JLabel distanceOrRadiuslabel = new JLabel(Messages.getString("OptionWizard.36")); //$NON-NLS-1$ - panel.add(distanceOrRadiuslabel, constraints); - - constraints.gridx = 1; - JComboBox distanceBetweenPoints = (JComboBox) propertyToComponent - .get(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS)[0]; - panel.add(new JScrollPane(distanceBetweenPoints), constraints); - - constraints.gridx = 0; - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.37")); //$NON-NLS-1$ - panel.add(label, constraints); - constraints.gridx = 1; - JComboBox distanceToFrame = (JComboBox) propertyToComponent - .get(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES)[0]; - panel.add(new JScrollPane(distanceToFrame), constraints); - - constraints.gridx = 0; - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.95")); //$NON-NLS-1$ - panel.add(label, constraints); - constraints.gridx = 1; - JComboBox dotsSide = (JComboBox) propertyToComponent.get(EarthProperty.INNER_SUBPLOT_SIDE)[0]; - panel.add(new JScrollPane(dotsSide), constraints); - - constraints.gridx = 0; - constraints.gridy++; - label = new JLabel("Central plot side"); //$NON-NLS-1$ - panel.add(label, constraints); - constraints.gridx = 1; - JComboBox largeCentralPlotSide = (JComboBox) propertyToComponent.get(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)[0]; - panel.add(new JScrollPane(largeCentralPlotSide), constraints); - - - - constraints.gridx = 0; - constraints.gridy++; - label = new JLabel("Distance between plots in cluster"); - panel.add(label, constraints); - constraints.gridx = 1; - JComboBox plotDistanceInCluster = (JComboBox) propertyToComponent - .get(EarthProperty.DISTANCE_BETWEEN_PLOTS)[0]; - panel.add(new JScrollPane(plotDistanceInCluster), constraints); - - constraints.gridx = 0; - constraints.gridy++; - JLabel area = new JLabel( - "Area (hectares) : " + calculateArea(numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide)); - panel.add(area, constraints); - - ActionListener calculateAreas = actionPerformed -> area.setText("Area (hectares) : " + calculateArea(numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide)); - - plotShape.addActionListener( e-> - handleVisibilityPlotLayout(plotShape, numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide, - plotDistanceInCluster, area, distanceOrRadiuslabel, largeCentralPlotSide) - ); - - numberPoints.addActionListener(calculateAreas); - distanceBetweenPoints.addActionListener(calculateAreas); - distanceToFrame.addActionListener(calculateAreas); - - handleVisibilityPlotLayout(plotShape, numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide, - plotDistanceInCluster, area, distanceOrRadiuslabel, largeCentralPlotSide); - - return panel; - } - - public void handleVisibilityPlotLayout(JComboBox plotShape, JComboBox numberPoints, JComboBox distanceBetweenPoints, - JComboBox distanceToFrame, JComboBox dotsSide, JComboBox distanceBetweenPlots, JLabel area, - JLabel distanceOrRadiuslabel, JComboBox largeCentralPlotSide ) { - numberPoints.setEnabled(false); - distanceBetweenPoints.setEnabled(false); - distanceToFrame.setEnabled(false); - dotsSide.setEnabled(false); - area.setVisible(false); - distanceBetweenPlots.setVisible(false); - distanceBetweenPlots.setEnabled(false); - largeCentralPlotSide.setVisible( false ); - largeCentralPlotSide.setEnabled(false); - - if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE) || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE_WITH_LARGE_CENTRAL_PLOT) ) { - numberPoints.setEnabled(true); - distanceBetweenPoints.setEnabled(true); - distanceToFrame.setEnabled(true); - dotsSide.setEnabled(true); - area.setVisible(true); - distanceOrRadiuslabel.setText(Messages.getString("OptionWizard.36")); - - if( plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE_WITH_LARGE_CENTRAL_PLOT) ) { - largeCentralPlotSide.setVisible( true ); - largeCentralPlotSide.setEnabled(true); - } - - } else if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.CIRCLE) - || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.HEXAGON)) { - distanceBetweenPoints.setEnabled(true); - dotsSide.setEnabled(true); - numberPoints.setEnabled(true); - distanceOrRadiuslabel.setText("Radius"); - } else if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.NFI_THREE_CIRCLES) || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.NFI_FOUR_CIRCLES)) { - dotsSide.setEnabled(true); - distanceBetweenPoints.setEnabled(true); - distanceBetweenPlots.setVisible(true); - distanceBetweenPlots.setEnabled(true); - distanceOrRadiuslabel.setText("Radius of the plots"); + private JButton getDeleteButton() { + if (deleteFromDB == null) { + deleteFromDB = new JButton("Delete plots with IDs in the CSV from the database"); + deleteFromDB.setEnabled(false); + deleteFromDB.addActionListener( e -> { + if (JOptionPane.showConfirmDialog(RemovePlotsFromDBDlg.this.dlg, + "Are you sure you want to remove the plots with the IDs that are specified in the CSV file??", + "Confirm deletion of plots in DB", JOptionPane.YES_NO_OPTION, + JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) { + deletePlotsFromDB(); + } + }); } + return deleteFromDB; } - private String calculateArea(JComboBox numberOfPoints, JComboBox distanceBetweenPoints, JComboBox distanceToFrame, JComboBox dotsSide) { - double side = 0; - try { - int numberOfPointsI = ((ComboBoxItem) numberOfPoints.getSelectedItem()).getNumberOfPoints(); - int distanceBetweenPointsI = Integer.parseInt((String) distanceBetweenPoints.getSelectedItem()); - int distanceToFrameI = Integer.parseInt((String) distanceToFrame.getSelectedItem()); + private boolean validateCsv(String filePath) { + boolean validFile = true; - if (numberOfPointsI == 0 || numberOfPointsI == 1) { + try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(filePath, false) ){ - side = 2d * distanceToFrameI; - if (oldSelectedDistance == null) { - oldSelectedDistance = (String) distanceBetweenPoints.getSelectedItem(); - distanceBetweenPoints.setEnabled(false); - } - distanceBetweenPoints.setSelectedItem("0"); + filePicker.setTextBackground(Color.white); - if (numberOfPointsI == 0) { - dotsSide.setEnabled(false); - } else if (numberOfPointsI == 1) { - dotsSide.setEnabled(true); - } + if (CsvReaderUtils.isCsvFile(filePath)) { - } else { - if (oldSelectedDistance != null) { - distanceBetweenPoints.setSelectedItem(oldSelectedDistance); - oldSelectedDistance = null; + // Get the first line + String[] csvHeaders = csvReader.readNext(); + String[] expectedHeaders = getKeyAttributesName(); + if (!Arrays.equals(expectedHeaders, csvHeaders)) { + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, + String.format("The Headers of the CSV file used should be %s, instead they are %s", + Arrays.toString(expectedHeaders), + StringUtils.abbreviate(Arrays.toString(csvHeaders), 35))); + filePicker.setTextBackground(Color.red); + validFile = false; } - distanceBetweenPoints.setEnabled(true); - distanceToFrame.setEnabled(true); - dotsSide.setEnabled(true); - - double pointsByLines = Math.sqrt(numberOfPointsI); - side = 2d * distanceToFrameI + (pointsByLines - 1) * distanceBetweenPointsI; + } else { + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, + String.format("The file in %s is NOT A CSV file ", filePath)); + validFile = false; + filePicker.setTextBackground(Color.red); } - - } catch (RuntimeException e) { - logger.error("Error calculating area of the plot", e); + } catch (Exception e) { + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, + String.format("Error opening file at %s. %s ", filePath, e.getMessage())); + logger.error("Error while validating the CSV file", e); + validFile = false; } - DecimalFormat df = new DecimalFormat("###.##"); - return df.format(side * side / 10000d); - } - - private JPanel getPostgreSqlPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), - Messages.getString("OptionWizard.6")); //$NON-NLS-1$ - panel.setBorder(border); - - JLabel label = new JLabel(Messages.getString("OptionWizard.7")); //$NON-NLS-1$ - constraints.gridx = 0; - panel.add(label, constraints); - - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.DB_USERNAME)[0], constraints); - - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.8")); //$NON-NLS-1$ - constraints.gridx = 0; - panel.add(label, constraints); - - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.DB_PASSWORD)[0], constraints); - - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.9")); //$NON-NLS-1$ - constraints.gridx = 0; - panel.add(label, constraints); - - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.DB_NAME)[0], constraints); - - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.26")); //$NON-NLS-1$ - constraints.gridx = 0; - panel.add(label, constraints); - - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.DB_HOST)[0], constraints); - - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.29")); //$NON-NLS-1$ - constraints.gridx = 0; - panel.add(label, constraints); - - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.DB_PORT)[0], constraints); - - constraints.gridx = 2; - panel.add(new JLabel("Default: 5432"), constraints); - - constraints.gridy++; - constraints.gridx = 1; - JButton button = new JButton("Test Connection"); //$NON-NLS-1$ - button.addActionListener( e-> { - String host = ((JTextField) (propertyToComponent.get(EarthProperty.DB_HOST)[0])).getText(); - String port = ((JTextField) (propertyToComponent.get(EarthProperty.DB_PORT)[0])).getText(); - String dbName = ((JTextField) (propertyToComponent.get(EarthProperty.DB_NAME)[0])).getText(); - String username = ((JTextField) (propertyToComponent.get(EarthProperty.DB_USERNAME)[0])).getText(); - String password = ((JTextField) (propertyToComponent.get(EarthProperty.DB_PASSWORD)[0])).getText(); - - String message = CollectEarthUtils.testPostgreSQLConnection(host, port, dbName, username, password); - JOptionPane.showMessageDialog(PropertiesDialog.this.getOwner(), message, "PostgreSQL Connection test", - JOptionPane.INFORMATION_MESSAGE); - }); - panel.add(button, constraints); - - return panel; + getDeleteButton().setEnabled(validFile); + return validFile; } - private JPanel getSqlLitePanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), - Messages.getString("OptionWizard.30")); //$NON-NLS-1$ - panel.setBorder(border); - - panel.add(propertyToComponent.get(EarthProperty.AUTOMATIC_BACKUP)[0], constraints); - constraints.gridx++; - panel.add(getOpenBackupFolderButton()); - return panel; - } - - private JComponent getSampleDataPanel() { - final JPlotCsvTable samplePlots = new JPlotCsvTable(localPropertiesService.getValue(EarthProperty.SAMPLE_FILE), - surveyLoaded); - - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.fill = GridBagConstraints.BOTH; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; + private void deletePlotsFromDB() { + InfiniteProgressMonitor progressDeletion = new InfiniteProgressMonitor(this.dlg, "Deleting plots", + "Wait while the plots are deleted from the database"); - final JFilePicker refreshTableOnFileChange = getFilePickerSamplePlots(samplePlots); - - panel.add(refreshTableOnFileChange, constraints); - - samplePlots.setFillsViewportHeight(true); - constraints.gridy = 1; - - constraints.weightx = 1.0; - constraints.weighty = 1.0; - constraints.gridwidth = GridBagConstraints.REMAINDER; - constraints.gridheight = GridBagConstraints.REMAINDER; - - samplePlots.setPreferredScrollableViewportSize(samplePlots.getPreferredSize()); - - panel.add(new JScrollPane(samplePlots, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, - ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), constraints); - - return panel; - } - - private JFilePicker getFilePickerSamplePlots(final JPlotCsvTable samplePlots) { - final JFilePicker refreshTableOnFileChange = (JFilePicker) (propertyToComponent - .get(EarthProperty.SAMPLE_FILE)[0]); - refreshTableOnFileChange.addChangeListener(new DocumentListener() { + Thread treadDeleting = new Thread("Deleting plots from Database") { + int plotsDeleted = 0; + int plotsNotFoundInDB = 0; + int plotsCouldNotBeDeleted = 0; + boolean success = true; + ArrayList messages = new ArrayList<>(); @Override - public void changedUpdate(DocumentEvent e) { - // Do not react - } - - @Override - public void insertUpdate(DocumentEvent e) { - refreshTable(); - } - - @Override - public void removeUpdate(DocumentEvent e) { - // Do not react - } - - private void refreshTable() { - samplePlots.refreshTable(refreshTableOnFileChange.getSelectedFilePath()); - - // Do not let the user save the changes if the sample data is wrong!!! - getApplyChangesButton().setEnabled(samplePlots.isDataValid()); - } - }); - return refreshTableOnFileChange; - } - - private JPanel getServerPanel() { + public void run() { + try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(getCsvFilePicker().getSelectedFilePath(), false) ){ + List allLines = csvReader.readAll(); + int totalLines = allLines.size() - 1; + boolean skipFirst = true; + int plot = 0; + progressDeletion.showLater(); + for (String[] csvRow : allLines) { + + if (skipFirst) { + skipFirst = false; + continue; + } - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; + progressDeletion.updateProgress(++plot, totalLines); - final JPanel typeOfDbPanel = new JPanel(new GridBagLayout()); - final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), - Messages.getString("OptionWizard.3")); //$NON-NLS-1$ - typeOfDbPanel.setBorder(border); + CollectRecord record = earthSurveyService.loadRecord(csvRow); + if (record == null) { + plotsNotFoundInDB++; + messages.add(String.format(" Could not find plot with ID %s in the Database", + Arrays.toString(csvRow))); + } else { + deleteRecord(csvRow, record); + } + } - JLabel label = new JLabel(Messages.getString("OptionWizard.4") + CollectEarthUtils.getComputerIp()); //$NON-NLS-1$ - typeOfDbPanel.add(label, constraints); - constraints.gridy++; + } catch (Exception e) { + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, + "Error reading CSV file or CSV File too big!"); + logger.error("Error while validating the CSV file", e); + success = false; + } finally { - label = new JLabel(Messages.getString("OptionWizard.5")); //$NON-NLS-1$ - constraints.gridx = 0; - typeOfDbPanel.add(label, constraints); + if (progressDeletion != null) { + progressDeletion.close(); + } - constraints.gridx = 1; - typeOfDbPanel.add(propertyToComponent.get(EarthProperty.HOST_PORT_KEY)[0], constraints); + } - constraints.gridwidth = GridBagConstraints.REMAINDER; - constraints.gridy++; - constraints.gridx = 0; + DeleteResults deleteResults = new DeleteResults(success, plotsDeleted, plotsNotFoundInDB, + plotsCouldNotBeDeleted, messages); + String result = "Plots Deleted : " + deleteResults.plotsDeleted + "
" + + "Plots Not Found :
" + deleteResults.plotsNotFoundInDB + "
" + + "Plots that could not be deleted because a exception : " + deleteResults.plotsErrorWhenDeleting + "
" + + " Messages :
" + StringUtils.join(deleteResults.messages, "
"); + if( success ) { + result = "" + + "Results of the deletion process:
" + + result + ""; + }else { + result = "" + + "There was an error while deleting the plots. Review the Collect Earth Log file in the Help menu.
" + + result + ""; + } - final ButtonGroup bg = new ButtonGroup(); - final JComponent[] dbTypes = propertyToComponent.get(EarthProperty.DB_DRIVER); - postgresPanel = getPostgreSqlPanel(); - sqlitePanel = getSqlLitePanel(); + JEditorPane web = new JEditorPane(); + web.setEditable(false); + web.setContentType("text/html"); + web.setText(result); - boolean usingPostgreSQL = localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.POSTGRESQL); - enableDBOptions(usingPostgreSQL); - for (final JComponent typeRadioButton : dbTypes) { - final JRadioButton dbTypeButton = (JRadioButton) typeRadioButton; - bg.add(dbTypeButton); - typeOfDbPanel.add(dbTypeButton, constraints); - constraints.gridy++; + JScrollPane scrollPane = new JScrollPane(web); + scrollPane.setPreferredSize( new Dimension( 450, 350 )); - dbTypeButton.addActionListener(getDbTypeListener()); - dbTypeButton.addActionListener(e -> setRestartRequired(true)); + // Refresh contents of Google Earth! + EarthApp.executeKmlLoadAsynchronously( null ); - if (dbTypeButton.getName().equals(EarthConstants.CollectDBDriver.POSTGRESQL.name())) { - typeOfDbPanel.add(postgresPanel, constraints); - constraints.gridy++; + SwingUtilities.invokeLater( () -> { + if (deleteResults.success) { + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, scrollPane, "Success deleting plots", JOptionPane.INFORMATION_MESSAGE); + } else { - } else { - typeOfDbPanel.add(sqlitePanel, constraints); - constraints.gridy++; + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, scrollPane, "Error deleting plots", JOptionPane.WARNING_MESSAGE); + } + }); } - } - return typeOfDbPanel; - } - - private Component getOpenBackupFolderButton() { - AbstractAction backupAction = new AbstractAction(Messages.getString("OptionWizard.10")) { //$NON-NLS-1$ - - private static final long serialVersionUID = 1L; - - @Override - public void actionPerformed(ActionEvent e) { + private void deleteRecord(String[] csvRow, CollectRecord record) { try { - - CollectEarthUtils.openFolderInExplorer(backupFolder); - - } catch (final IOException e1) { - logger.error("Error when opening the explorer window to visualize backups", e1); //$NON-NLS-1$ + recordManager.delete(record.getId()); + messages.add(String.format("Deleted plot with ID %s ", Arrays.toString(csvRow))); + plotsDeleted++; + } catch (RecordPersistenceException e) { + plotsCouldNotBeDeleted++; + messages.add(String.format("Error when deleting plot with ID %s. Error Message: %s", + Arrays.toString(csvRow), e.getMessage())); + logger.error("Error deleting plot with ID " + Arrays.toString(csvRow)); + success = false; } } - }; - return new JButton(backupAction); + treadDeleting.start(); } - private JComponent getSurveyDefinitonPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.fill = GridBagConstraints.HORIZONTAL; - constraints.gridwidth = 2; - panel.add(propertyToComponent.get(EarthProperty.OPEN_BALLOON_IN_BROWSER)[0], constraints); - - constraints.gridy++; - constraints.gridwidth = 1; - final JLabel label = new JLabel(Messages.getString("OptionWizard.43")); //$NON-NLS-1$ - panel.add(label, constraints); - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.SURVEY_NAME)[0], constraints); - - constraints.gridy++; - constraints.gridwidth = GridBagConstraints.REMAINDER; - constraints.gridx = 0; - panel.add(propertyToComponent.get(EarthProperty.KML_TEMPLATE_KEY)[0], constraints); - - constraints.gridy++; - constraints.gridx = 0; - panel.add(propertyToComponent.get(EarthProperty.BALLOON_TEMPLATE_KEY)[0], constraints); - - constraints.gridy++; - constraints.gridx = 0; - - panel.add(propertyToComponent.get(EarthProperty.METADATA_FILE)[0], constraints); - - return panel; - } - - private void initilizeInputs() { - - final JCheckBox backupCheckbox = new JCheckBox(Messages.getString("OptionWizard.44")); //$NON-NLS-1$ - backupCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.AUTOMATIC_BACKUP))); - propertyToComponent.put(EarthProperty.AUTOMATIC_BACKUP, new JComponent[] { backupCheckbox }); - - final JCheckBox openEarthEngineCheckbox = new JCheckBox(Messages.getString("OptionWizard.45")); //$NON-NLS-1$ - openEarthEngineCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_EXPLORER))); - propertyToComponent.put(EarthProperty.OPEN_GEE_EXPLORER, new JComponent[] { openEarthEngineCheckbox }); - - final JCheckBox openGEEAppCheckbox = new JCheckBox("Google Earth Engine APP (no sign-in)"); //$NON-NLS-1$ - openGEEAppCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_APP))); - propertyToComponent.put(EarthProperty.OPEN_GEE_APP, new JComponent[] { openGEEAppCheckbox }); - - final JCheckBox openTimelapseCheckbox = new JCheckBox(Messages.getString("OptionWizard.46")); //$NON-NLS-1$ - openTimelapseCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_TIMELAPSE))); - propertyToComponent.put(EarthProperty.OPEN_TIMELAPSE, new JComponent[] { openTimelapseCheckbox }); - - final JCheckBox openEarthMapCheckbox = new JCheckBox(Messages.getString("OptionWizard.105")); //$NON-NLS-1$ - openEarthMapCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_EARTH_MAP))); - propertyToComponent.put(EarthProperty.OPEN_EARTH_MAP, new JComponent[] { openEarthMapCheckbox }); - - final JCheckBox openBingCheckbox = new JCheckBox(Messages.getString("OptionWizard.47")); //$NON-NLS-1$ - openBingCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BING_MAPS))); - propertyToComponent.put(EarthProperty.OPEN_BING_MAPS, new JComponent[] { openBingCheckbox }); - - final JCheckBox openPlanetCheckbox = new JCheckBox(Messages.getString("OptionWizard.100")); //$NON-NLS-1$ - openPlanetCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_PLANET_MAPS))); - propertyToComponent.put(EarthProperty.OPEN_PLANET_MAPS, new JComponent[] { openPlanetCheckbox }); - - final JCheckBox openMonthlyNICFICheckbox = new JCheckBox(Messages.getString("OptionWizard.110")); //$NON-NLS-1$ - openMonthlyNICFICheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.PLANET_MAPS_MONHLY))); - propertyToComponent.put(EarthProperty.PLANET_MAPS_MONHLY, new JComponent[] { openMonthlyNICFICheckbox }); - - - final JPasswordField planetAPIKeyTextField = new JPasswordField( - localPropertiesService.getValue(EarthProperty.PLANET_MAPS_KEY)); - planetAPIKeyTextField.setMinimumSize(new Dimension( 250, 20 )); - planetAPIKeyTextField.setEnabled( localPropertiesService.isPlanetMapsSupported() ); - propertyToComponent.put(EarthProperty.PLANET_MAPS_KEY, new JComponent[] { planetAPIKeyTextField }); - - openMonthlyNICFICheckbox.setEnabled( openPlanetCheckbox.isSelected() ); - planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ); - - openPlanetCheckbox.addActionListener( e-> { - planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ); - openMonthlyNICFICheckbox.setEnabled( openPlanetCheckbox.isSelected() ); - }); - openMonthlyNICFICheckbox.addActionListener( e-> planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ) ); - - - final JCheckBox openSecureWatchCheckbox = new JCheckBox(Messages.getString("OptionWizard.102")); //$NON-NLS-1$ - openSecureWatchCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_MAXAR_SECUREWATCH))); - propertyToComponent.put(EarthProperty.OPEN_MAXAR_SECUREWATCH, new JComponent[] { openSecureWatchCheckbox }); - - final JTextField secureWatchUrlTextField = new JTextField( - localPropertiesService.getValue(EarthProperty.MAXAR_SECUREWATCH_URL)); - secureWatchUrlTextField.setMinimumSize(new Dimension( 250, 20 )); - propertyToComponent.put(EarthProperty.MAXAR_SECUREWATCH_URL, new JComponent[] { secureWatchUrlTextField }); - secureWatchUrlTextField.setEnabled( localPropertiesService.isSecureWatchSupported() ); - propertyToComponent.put(EarthProperty.MAXAR_SECUREWATCH_URL, new JComponent[] { secureWatchUrlTextField }); - openSecureWatchCheckbox.addActionListener( e -> secureWatchUrlTextField.setEnabled( openSecureWatchCheckbox.isSelected() ) ); - - final JTextField extraUrlTextField = new JTextField( - localPropertiesService.getValue(EarthProperty.EXTRA_MAP_URL)); - extraUrlTextField.setMinimumSize(new Dimension( 250, 20 )); - propertyToComponent.put(EarthProperty.EXTRA_MAP_URL, new JComponent[] { extraUrlTextField }); - - final JCheckBox openBaiduCheckbox = new JCheckBox("Open Baidu Maps"); - openBaiduCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BAIDU_MAPS))); - propertyToComponent.put(EarthProperty.OPEN_BAIDU_MAPS, new JComponent[] { openBaiduCheckbox }); - - final JCheckBox openYandexCheckbox = new JCheckBox("Open Yandex maps for the plot area"); - openYandexCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_YANDEX_MAPS))); - propertyToComponent.put(EarthProperty.OPEN_YANDEX_MAPS, new JComponent[] { openYandexCheckbox }); - - final JCheckBox openHereCheckbox = new JCheckBox(Messages.getString("OptionWizard.59")); //$NON-NLS-1$ - openHereCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_HERE_MAPS))); - propertyToComponent.put(EarthProperty.OPEN_HERE_MAPS, new JComponent[] { openHereCheckbox }); - - final JCheckBox openGeePlaygroundCheckbox = new JCheckBox(Messages.getString("OptionWizard.58")); //$NON-NLS-1$ - openGeePlaygroundCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_CODE_EDITOR))); - propertyToComponent.put(EarthProperty.OPEN_GEE_CODE_EDITOR, new JComponent[] { openGeePlaygroundCheckbox }); - - final JCheckBox openInSeparateWindowCheckbox = new JCheckBox(Messages.getString("OptionWizard.48")); //$NON-NLS-1$ - openInSeparateWindowCheckbox.setSelected( - Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BALLOON_IN_BROWSER))); - propertyToComponent.put(EarthProperty.OPEN_BALLOON_IN_BROWSER, - new JComponent[] { openInSeparateWindowCheckbox }); - - final JFilePicker csvWithPlotData = new JFilePicker(Messages.getString("OptionWizard.49"), //$NON-NLS-1$ - localPropertiesService.getValue(EarthProperty.SAMPLE_FILE), Messages.getString("OptionWizard.50"), DlgMode.MODE_OPEN); // $NON-NLS-1$ - - csvWithPlotData.addFileTypeFilter(".csv,.ced", Messages.getString("OptionWizard.52"), true); //$NON-NLS-1$ //$NON-NLS-2$ - propertyToComponent.put(EarthProperty.SAMPLE_FILE, new JComponent[] { csvWithPlotData }); - - final JComboBox plotShape = new JComboBox<>(SAMPLE_SHAPE.values()); - try { - plotShape.setSelectedItem(SAMPLE_SHAPE.valueOf(localPropertiesService.getValue(EarthProperty.SAMPLE_SHAPE))); - } catch (Exception e1) { - logger.error("The selected shape type is not supported " + localPropertiesService.getValue(EarthProperty.SAMPLE_SHAPE), e1 ); + private String[] getKeyAttributesName() { + List keyAttributeDefinitions = survey.getSchema().getRootEntityDefinitions().get(0) + .getKeyAttributeDefinitions(); + String[] keyAttributeNames = new String[keyAttributeDefinitions.size()]; + int i = 0; + for (AttributeDefinition keyAttributeDefinition : keyAttributeDefinitions) { + keyAttributeNames[i++] = keyAttributeDefinition.getName(); } - propertyToComponent.put(EarthProperty.SAMPLE_SHAPE, new JComponent[] { plotShape }); - - final JComboBox comboNumberOfPoints = new JComboBox<>( - new ComboBoxItem[] { COMBO_BOX_ITEM_SQUARE, COMBO_BOX_ITEM_CENTRAL_POINT, new ComboBoxItem(4, "2x2"), //$NON-NLS-1$ //$NON-NLS-2$ - // //$NON-NLS-3$ - new ComboBoxItem(9, "3x3"), new ComboBoxItem(16, "4x4"), new ComboBoxItem(25, "5x5"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - new ComboBoxItem(36, "6x6"), //$NON-NLS-1$ - new ComboBoxItem(49, "7x7") }); //$NON-NLS-1$ - if( StringUtils.isNotBlank( localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT) ) ){ - try { - comboNumberOfPoints.setSelectedItem(new ComboBoxItem( - Integer.parseInt(localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT)), - "")); //$NON-NLS-1$ - } catch (NumberFormatException e1) { - logger.error("This should be a number {}", localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT), e1); - } - } - propertyToComponent.put(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT, - new JComponent[] { comboNumberOfPoints }); - - final String[] listOfNumbers = new String[1500]; - final String[] listOfNumbersFromTwo = new String[1500]; - - for (int index = 0; index < listOfNumbers.length; index++) { - listOfNumbers[index] = Integer.toString( index ); //$NON-NLS-1$ - listOfNumbersFromTwo[index] = Integer.toString( index + 2 ); //$NON-NLS-1$ - } - - final JComboBox listOfDistanceBetweenPoints = new JComboBox<>(listOfNumbersFromTwo); - listOfDistanceBetweenPoints - .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS)); - listOfDistanceBetweenPoints.setAutoscrolls(true); - - propertyToComponent.put(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS, - new JComponent[] { listOfDistanceBetweenPoints }); - - final JComboBox listOfDistanceBetweenPlots = new JComboBox<>(listOfNumbersFromTwo); - listOfDistanceBetweenPlots - .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS)); - listOfDistanceBetweenPlots.setAutoscrolls(true); - - propertyToComponent.put(EarthProperty.DISTANCE_BETWEEN_PLOTS, new JComponent[] { listOfDistanceBetweenPlots }); - - final JComboBox listOfDistanceToBorder = new JComboBox<>(listOfNumbers); - listOfDistanceToBorder - .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES)); - listOfDistanceToBorder.setAutoscrolls(true); - - propertyToComponent.put(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES, new JComponent[] { listOfDistanceToBorder }); - - final JComboBox listOfSizeofSamplingDot = new JComboBox<>(listOfNumbersFromTwo); - listOfSizeofSamplingDot.setSelectedItem(localPropertiesService.getValue(EarthProperty.INNER_SUBPLOT_SIDE)); - listOfSizeofSamplingDot.setAutoscrolls(true); - - propertyToComponent.put(EarthProperty.INNER_SUBPLOT_SIDE, new JComponent[] { listOfSizeofSamplingDot }); - - final JComboBox listOfSideOflargeCentralPlot = new JComboBox<>(listOfNumbersFromTwo); - listOfSideOflargeCentralPlot.setSelectedItem(localPropertiesService.getValue(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)); - listOfSideOflargeCentralPlot.setAutoscrolls(true); - - propertyToComponent.put(EarthProperty.LARGE_CENTRAL_PLOT_SIDE, new JComponent[] { listOfSideOflargeCentralPlot }); - - - final JRadioButton chromeChooser = new JRadioButton("Chrome"); //$NON-NLS-1$ - chromeChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() - .equals(EarthConstants.CHROME_BROWSER)); - chromeChooser.setName(EarthConstants.CHROME_BROWSER); + return keyAttributeNames; + } - final JRadioButton firefoxChooser = new JRadioButton("Firefox"); //$NON-NLS-1$ - firefoxChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() - .equals(EarthConstants.FIREFOX_BROWSER)); - firefoxChooser.setName(EarthConstants.FIREFOX_BROWSER); + private JFilePicker getCsvFilePicker() { + if (filePicker == null) { + filePicker = new JFilePicker("Choose the CSV file containing the IDs of the plots to remove", null, + "Explore", DlgMode.MODE_OPEN); - final JRadioButton edgeChooser = new JRadioButton("Edge"); //$NON-NLS-1$ - edgeChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() - .equals(EarthConstants.EDGE_BROWSER)); - edgeChooser.setName(EarthConstants.EDGE_BROWSER); + filePicker.getFileChooser().setAcceptAllFileFilterUsed(false); + filePicker.addFileTypeFilter("csv", " CSV file with plot IDs", true); - propertyToComponent.put(EarthProperty.BROWSER_TO_USE, new JComponent[] { firefoxChooser, chromeChooser, edgeChooser}); - final JFilePicker saikuPath = new JFilePicker(Messages.getString("OptionWizard.65"), //$NON-NLS-1$ - localPropertiesService.getValue(EarthProperty.SAIKU_SERVER_FOLDER), - Messages.getString("OptionWizard.66"), DlgMode.MODE_OPEN); //$NON-NLS-1$ - saikuPath.setFolderChooser(); - saikuPath.addChangeListener(new DocumentListener() { + filePicker.addChangeListener(new DocumentListener() { - private void showSaikuWarning() { - final File saikuFolder = new File(saikuPath.getSelectedFilePath()); - if ( !saikuService.isSaikuFolder(saikuFolder)) { - JOptionPane.showMessageDialog(PropertiesDialog.this, Messages.getString("OptionWizard.27"), //$NON-NLS-1$ - Messages.getString("OptionWizard.28"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ - saikuPath.getTextField().setBackground(CollectEarthWindow.ERROR_COLOR); - } else { - saikuPath.getTextField().setBackground(Color.white); + @Override + public void removeUpdate(DocumentEvent e) { + // Do not react } - } - - @Override - public void removeUpdate(DocumentEvent e) { - // Do not react - } - - @Override - public void insertUpdate(DocumentEvent e) { - showSaikuWarning(); - } - - @Override - public void changedUpdate(DocumentEvent e) { - // Do not react - } - }); - propertyToComponent.put(EarthProperty.SAIKU_SERVER_FOLDER, new JComponent[] { saikuPath }); - - final JFilePicker kmlTemplatePath = new JFilePicker(Messages.getString("OptionWizard.79"), //$NON-NLS-1$ - localPropertiesService.getValue(EarthProperty.KML_TEMPLATE_KEY), Messages.getString("OptionWizard.80"), //$NON-NLS-1$ - DlgMode.MODE_OPEN); - kmlTemplatePath.addFileTypeFilter(".fmt", Messages.getString("OptionWizard.82"), true); //$NON-NLS-1$ //$NON-NLS-2$ - propertyToComponent.put(EarthProperty.KML_TEMPLATE_KEY, new JComponent[] { kmlTemplatePath }); - - final JFilePicker htmlBalloonPath = new JFilePicker(Messages.getString("OptionWizard.83"), //$NON-NLS-1$ - localPropertiesService.getValue(EarthProperty.BALLOON_TEMPLATE_KEY), - Messages.getString("OptionWizard.84"), DlgMode.MODE_OPEN); //$NON-NLS-1$ - htmlBalloonPath.addFileTypeFilter(".html,.htm", Messages.getString("OptionWizard.86"), true); //$NON-NLS-1$ //$NON-NLS-2$ - propertyToComponent.put(EarthProperty.BALLOON_TEMPLATE_KEY, new JComponent[] { htmlBalloonPath }); - - final JFilePicker idmPath = new JFilePicker(Messages.getString("OptionWizard.87"), //$NON-NLS-1$ - localPropertiesService.getImdFile(), Messages.getString("OptionWizard.88"), DlgMode.MODE_OPEN); //$NON-NLS-1$ - idmPath.addFileTypeFilter(".xml", Messages.getString("OptionWizard.90"), true); //$NON-NLS-1$ //$NON-NLS-2$ - propertyToComponent.put(EarthProperty.METADATA_FILE, new JComponent[] { idmPath }); - - final JTextField surveyNameTextField = new JTextField( - localPropertiesService.getValue(EarthProperty.SURVEY_NAME)); - surveyNameTextField.setEnabled(false); - propertyToComponent.put(EarthProperty.SURVEY_NAME, new JComponent[] { surveyNameTextField }); - - // Database options - final JRadioButton instanceTypeServer = new JRadioButton(Messages.getString("OptionWizard.91")); //$NON-NLS-1$ - instanceTypeServer.setSelected(localPropertiesService.getOperationMode().equals(OperationMode.SERVER_MODE)); - instanceTypeServer.setName(EarthConstants.OperationMode.SERVER_MODE.name()); - - final JRadioButton instanceTypeClient = new JRadioButton(Messages.getString("OptionWizard.92")); //$NON-NLS-1$ - instanceTypeClient.setSelected(localPropertiesService.getOperationMode().equals(OperationMode.CLIENT_MODE)); - instanceTypeClient.setName(EarthConstants.OperationMode.CLIENT_MODE.name()); - propertyToComponent.put(EarthProperty.OPERATION_MODE, - new JComponent[] { instanceTypeServer, instanceTypeClient }); - - final JTextField collectEarthServerIp = new JTextField(localPropertiesService.getValue(EarthProperty.HOST_KEY)); - propertyToComponent.put(EarthProperty.HOST_KEY, new JComponent[] { collectEarthServerIp }); - - final JTextField collectEarthServerIpPort = new JTextField(localPropertiesService.getPort()); - final JTextField collectEarthServerLocalPort = new JTextField( - localPropertiesService.getValue(EarthProperty.HOST_PORT_KEY)); - propertyToComponent.put(EarthProperty.HOST_PORT_KEY, - new JComponent[] { collectEarthServerIpPort, collectEarthServerLocalPort }); - - final JRadioButton sqliteDbType = new JRadioButton(Messages.getString("OptionWizard.93")); //$NON-NLS-1$ - sqliteDbType.setSelected(localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.SQLITE)); - sqliteDbType.setName(CollectDBDriver.SQLITE.name()); - - final JRadioButton postgresDbType = new JRadioButton(Messages.getString("OptionWizard.94")); //$NON-NLS-1$ - boolean usingPostgreSQL = localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.POSTGRESQL); - postgresDbType.setSelected(usingPostgreSQL); - postgresDbType.setName(CollectDBDriver.POSTGRESQL.name()); - propertyToComponent.put(EarthProperty.DB_DRIVER, new JComponent[] { sqliteDbType, postgresDbType }); - - final JTextField dbUserName = new JTextField(localPropertiesService.getValue(EarthProperty.DB_USERNAME)); - propertyToComponent.put(EarthProperty.DB_USERNAME, new JComponent[] { dbUserName }); - - final JTextField dbPassword = new JTextField(localPropertiesService.getValue(EarthProperty.DB_PASSWORD)); - propertyToComponent.put(EarthProperty.DB_PASSWORD, new JComponent[] { dbPassword }); - - final JTextField dbName = new JTextField(localPropertiesService.getValue(EarthProperty.DB_NAME)); - propertyToComponent.put(EarthProperty.DB_NAME, new JComponent[] { dbName }); - - final JTextField dbHost = new JTextField(localPropertiesService.getValue(EarthProperty.DB_HOST)); - propertyToComponent.put(EarthProperty.DB_HOST, new JComponent[] { dbHost }); - - final JTextField dbPort = new JTextField(localPropertiesService.getValue(EarthProperty.DB_PORT)); - propertyToComponent.put(EarthProperty.DB_PORT, new JComponent[] { dbPort }); - - } - - public boolean isRestartRequired() { - return restartRequired; - } + @Override + public void insertUpdate(DocumentEvent e) { + validateCsv(filePicker.getTextField().getText()); + } - public void setRestartRequired(boolean restartRequired) { - this.restartRequired = restartRequired; + @Override + public void changedUpdate(DocumentEvent e) { + validateCsv(filePicker.getTextField().getText()); + } + }); + } + return filePicker; } } From 8091c547f258993f4ecebdbd17629d3d834b4414 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:13 +0100 Subject: [PATCH 1294/1620] New translations RemovePlotsFromDBDlg.java (Spanish) --- .../earth/app/view/Messages_es.properties | 1345 +++-------------- 1 file changed, 231 insertions(+), 1114 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 7eb0424502..eb9b80be90 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,1209 +1,326 @@ package org.openforis.collect.earth.app.view; -import java.awt.BorderLayout; import java.awt.Color; -import java.awt.Component; -import java.awt.Container; import java.awt.Dimension; +import java.awt.Frame; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; -import java.awt.GridLayout; -import java.awt.Insets; -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; -import java.io.IOException; -import java.text.DecimalFormat; import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; +import java.util.Arrays; import java.util.List; -import javax.swing.AbstractAction; -import javax.swing.AbstractButton; -import javax.swing.ButtonGroup; import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JComponent; import javax.swing.JDialog; -import javax.swing.JFrame; +import javax.swing.JEditorPane; import javax.swing.JLabel; -import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; -import javax.swing.JPasswordField; -import javax.swing.JRadioButton; import javax.swing.JScrollPane; -import javax.swing.JTabbedPane; -import javax.swing.JTextField; -import javax.swing.ListSelectionModel; -import javax.swing.ScrollPaneConstants; -import javax.swing.border.BevelBorder; -import javax.swing.border.Border; -import javax.swing.border.TitledBorder; +import javax.swing.SwingUtilities; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; -import org.openforis.collect.earth.app.EarthConstants.OperationMode; -import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.AnalysisSaikuService; -import org.openforis.collect.earth.app.service.EarthProjectsService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.app.service.EarthSurveyService; import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.collect.manager.RecordManager; +import org.openforis.collect.model.CollectRecord; import org.openforis.collect.model.CollectSurvey; +import org.openforis.collect.persistence.RecordPersistenceException; +import org.openforis.idm.metamodel.AttributeDefinition; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ -public class PropertiesDialog extends JDialog { +import com.opencsv.CSVReader; - private static final ComboBoxItem COMBO_BOX_ITEM_CENTRAL_POINT = new ComboBoxItem(1, - Messages.getString("OptionWizard.54")); +@Component +@Lazy +public class RemovePlotsFromDBDlg { - private static final ComboBoxItem COMBO_BOX_ITEM_SQUARE = new ComboBoxItem(0, - Messages.getString("OptionWizard.53")); + @Autowired + private RecordManager recordManager; - private static final long serialVersionUID = -6760020609229102842L; + @Autowired + private EarthSurveyService earthSurveyService; - private final HashMap, JComponent[]> propertyToComponent = new HashMap<>(); - private final transient Logger logger = LoggerFactory.getLogger(this.getClass()); + @SuppressWarnings("unused") + private static final long serialVersionUID = 5175096170385736616L; + private CollectSurvey survey; + private Logger logger = LoggerFactory.getLogger(RemovePlotsFromDBDlg.class); - JPanel postgresPanel; - JPanel sqlitePanel; + private JButton deleteFromDB; + private JFilePicker filePicker; - private transient LocalPropertiesService localPropertiesService; + private JDialog dlg; - String backupFolder; - - private transient AnalysisSaikuService saikuService; - - private transient EarthProjectsService projectsService; - - private boolean restartRequired; - - private String oldSelectedDistance; - - private CollectSurvey surveyLoaded; - - private JButton applyChanges; - - public PropertiesDialog(JFrame frame, LocalPropertiesService localPropertiesService, - EarthProjectsService projectsService, String backupFolder, AnalysisSaikuService saikuService, - CollectSurvey surveyLoaded) { - super(frame, Messages.getString("OptionWizard.0")); //$NON-NLS-1$ - this.localPropertiesService = localPropertiesService; - this.projectsService = projectsService; - this.backupFolder = backupFolder; - this.saikuService = saikuService; - this.surveyLoaded = surveyLoaded; - this.setLocationRelativeTo(null); - this.setSize(new Dimension(600, 620)); - this.setModal(true); - this.setResizable(false); - initilizeInputs(); - buildMainPane(); - centreWindow(); - - } - - private void centreWindow() { - Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize(); - int x = (int) ((dimension.getWidth() - getWidth()) / 2); - int y = (int) ((dimension.getHeight() - getHeight()) / 2); - setLocation(x, y); - } - - private void buildMainPane() { - - final JPanel panel = new JPanel(new BorderLayout()); - panel.add(getOptionTabs(), BorderLayout.CENTER); - final JPanel buttonPanel = new JPanel(); - buttonPanel.add(getApplyChangesButton()); - buttonPanel.add(getCancelButton()); - panel.add(buttonPanel, BorderLayout.PAGE_END); - this.add(panel); - - } - - private void enableContainer(Container container, boolean enable) { - final Component[] components = container.getComponents(); - for (final Component component : components) { - component.setEnabled(enable); - if (component instanceof Container) { - enableContainer((Container) component, enable); - } - } - } - - private JComponent getBrowsersOptionsPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - final JPanel browserChooserPanel = new JPanel(); - final Border browserBorder = new TitledBorder(new BevelBorder(BevelBorder.LOWERED), - Messages.getString("OptionWizard.1")); //$NON-NLS-1$ - browserChooserPanel.setBorder(browserBorder); - GridLayout experimentLayout = new GridLayout(0,1); - browserChooserPanel.setLayout( experimentLayout ); - - final ButtonGroup browserChooser = new ButtonGroup(); - final JComponent[] browsers = propertyToComponent.get(EarthProperty.BROWSER_TO_USE); - - for (final JComponent browserRadioButton : browsers) { - browserChooserPanel.add(browserRadioButton); - browserChooser.add((AbstractButton) browserRadioButton); - - ((JRadioButton) browserRadioButton).addActionListener(e -> setRestartRequired(true)); - } - constraints.gridy++; - panel.add(browserChooserPanel, constraints); - - constraints.gridy++; - constraints.gridx = 0; - panel.add(propertyToComponent.get(EarthProperty.SAIKU_SERVER_FOLDER)[0], constraints); - - return panel; - } - - private JComponent getIntegrationsPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - panel.add(propertyToComponent.get(EarthProperty.OPEN_GEE_APP)[0], constraints); - - constraints.gridy++; - panel.add(propertyToComponent.get(EarthProperty.OPEN_BING_MAPS)[0], constraints); - - constraints.gridy++; - panel.add(propertyToComponent.get(EarthProperty.OPEN_EARTH_MAP)[0], constraints); - - - constraints.gridy++; - constraints.gridwidth = 1; - panel.add(propertyToComponent.get(EarthProperty.OPEN_PLANET_MAPS)[0], constraints); - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.PLANET_MAPS_MONHLY)[0], constraints); - - constraints.gridy++; - constraints.gridx = 0; - constraints.gridwidth = 1; - final JLabel label = new JLabel(Messages.getString("OptionWizard.101")); //$NON-NLS-1$ - panel.add(label, constraints); - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.PLANET_MAPS_KEY)[0], constraints); - - constraints.gridx = 0; - constraints.gridy++; - constraints.gridwidth = 2; - panel.add(propertyToComponent.get(EarthProperty.OPEN_MAXAR_SECUREWATCH)[0], constraints); - - constraints.gridy++; - constraints.gridwidth = 1; - final JLabel labelMaxar = new JLabel(Messages.getString("OptionWizard.1021")); //$NON-NLS-1$ - panel.add(labelMaxar, constraints); - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.MAXAR_SECUREWATCH_URL)[0], constraints); - - constraints.gridx = 0; - constraints.gridy++; - constraints.gridwidth = 2; - panel.add(propertyToComponent.get(EarthProperty.OPEN_YANDEX_MAPS)[0], constraints); - - constraints.gridy++; - panel.add(propertyToComponent.get(EarthProperty.OPEN_BAIDU_MAPS)[0], constraints); - - constraints.gridy++; - final JLabel label2 = new JLabel(Messages.getString("OptionWizard.103")); //$NON-NLS-1$ - panel.add(label2, constraints); - constraints.gridy++; - panel.add(propertyToComponent.get(EarthProperty.EXTRA_MAP_URL)[0], constraints); - - constraints.gridy++; - constraints.gridx = 0; - constraints.gridwidth = 2; - panel.add(propertyToComponent.get(EarthProperty.OPEN_GEE_CODE_EDITOR)[0], constraints); - - - return panel; + public RemovePlotsFromDBDlg() { + super(); } - - private Component getApplyChangesButton() { - if (applyChanges == null) { - applyChanges = new JButton(Messages.getString("OptionWizard.15")); - applyChanges.addActionListener( - new ApplyOptionChangesListener(this, localPropertiesService, propertyToComponent) { - @Override - protected void applyProperties() { - new Thread("Applying properties dialog") { - @Override - public void run() { - savePropertyValues(); - if (isRestartRequired()) { - - restartEarth(); - } else { - EarthApp.executeKmlLoadAsynchronously(PropertiesDialog.this); - } - } - }.start(); - } - }); + private class DeleteResults { + private boolean success; + private Integer plotsDeleted; + private Integer plotsNotFoundInDB; + private Integer plotsErrorWhenDeleting; + private List messages; + + public DeleteResults(boolean success, Integer plotsDeleted, Integer plotsNotFoundInDB, + Integer plotsErrorWhenDeleting, List messages) { + super(); + this.success = success; + this.plotsDeleted = plotsDeleted; + this.plotsNotFoundInDB = plotsNotFoundInDB; + this.plotsErrorWhenDeleting = plotsErrorWhenDeleting; + this.messages = messages; } - return applyChanges; - } - public void closeDialog() { - this.dispose(); } - private Component getCancelButton() { - final JButton cancelButton = new JButton(Messages.getString("OptionWizard.24")); //$NON-NLS-1$ - cancelButton.addActionListener( e -> PropertiesDialog.this.dispose() ); - return cancelButton; + public void open(Frame owner, CollectSurvey survey) { + this.dlg = new JDialog(owner); + this.survey = survey; + this.dlg.setModal(true); + this.dlg.setSize(new Dimension(700, 350)); + this.dlg.setLocationRelativeTo(owner); + this.dlg.setTitle("Tool for removing plots from DB using a CSV with plot IDs"); + initLayout(); + dlg.setVisible(true); } - private JComponent getOperationModePanel() { - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - final JPanel typeOfUsePanel = new JPanel(new GridBagLayout()); - final Border border = new TitledBorder(new BevelBorder(BevelBorder.LOWERED), - Messages.getString("OptionWizard.2")); //$NON-NLS-1$ - typeOfUsePanel.setBorder(border); - - JPanel serverPanel = getServerPanel(); - typeOfUsePanel.add(serverPanel, constraints); - - return typeOfUsePanel; - } - - private void enableDBOptions(boolean isPostgreDb) { - enableContainer(postgresPanel, isPostgreDb); - enableContainer(sqlitePanel, !isPostgreDb); - } - - private ActionListener getDbTypeListener() { - return e -> { - final JRadioButton theJRB = (JRadioButton) e.getSource(); - - boolean isPostgreDb = theJRB.getName().equals(CollectDBDriver.POSTGRESQL.name()); - enableDBOptions(isPostgreDb); - }; - } - - private JTabbedPane getOptionTabs() { - final JTabbedPane tabbedPane = new JTabbedPane(); - tabbedPane.setSize(550, 300); - final JComponent panel1 = getSampleDataPanel(); - tabbedPane.addTab(Messages.getString("OptionWizard.31"), panel1); //$NON-NLS-1$ - - final JComponent panel2 = getPlotOptionsPanel(); - tabbedPane.addTab(Messages.getString("OptionWizard.32"), panel2); //$NON-NLS-1$ - - final JComponent panel3 = getSurveyDefinitonPanel(); - tabbedPane.addTab(Messages.getString("OptionWizard.33"), panel3); //$NON-NLS-1$ - - final JComponent panel41 = getIntegrationsPanel(); - tabbedPane.addTab(Messages.getString("OptionWizard.34"), panel41); //$NON-NLS-1$ - - final JComponent panel4 = getBrowsersOptionsPanel(); - tabbedPane.addTab(Messages.getString("OptionWizard.104"), panel4); //$NON-NLS-1$ - - final JComponent panel5 = getOperationModePanelScroll(); - tabbedPane.addTab(Messages.getString("OptionWizard.25"), panel5); //$NON-NLS-1$ - - final JComponent panel6 = getProjectsPanelScroll(); - tabbedPane.addTab(Messages.getString("OptionWizard.40"), panel6); //$NON-NLS-1$ - - return tabbedPane; - } - - private JComponent getProjectsPanelScroll() { - final JComponent projectsPanel = getProjectsPanel(); - return new JScrollPane(projectsPanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); - } - - private JComponent getProjectsPanel() { + private void initLayout() { final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.fill = GridBagConstraints.BOTH; - - JButton importNewButton = new JButton(Messages.getString("OptionWizard.41")); //$NON-NLS-1$ - importNewButton.addActionListener(new ApplyOptionChangesListener(this, localPropertiesService) { - - @Override - protected void applyProperties() { - final File[] selectedProjectFile = JFileChooserExistsAware.getFileChooserResults( - DataFormat.PROJECT_DEFINITION_FILE, false, false, null, localPropertiesService, - (JFrame) PropertiesDialog.this.getParent()); - - if (selectedProjectFile != null && selectedProjectFile.length == 1) { - try { - projectsService.loadCompressedProjectFile(selectedProjectFile[0]); - restartEarth(); - } catch (Exception e1) { - JOptionPane.showMessageDialog(PropertiesDialog.this, e1.getMessage(), - Messages.getString("OptionWizard.51"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - logger.error("Error importing project file " + selectedProjectFile[0].getAbsolutePath(), e1); //$NON-NLS-1$ - } - - } - } - }); - - panel.add(importNewButton, constraints); - - final JPanel typeOfDbPanel = new JPanel(new GridBagLayout()); - final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), - Messages.getString("OptionWizard.57")); //$NON-NLS-1$ - typeOfDbPanel.setBorder(border); - - constraints.gridx = 0; - constraints.gridy = 1; - panel.add(typeOfDbPanel, constraints); - - List listOfProjectsByName = new ArrayList<>(); - listOfProjectsByName.addAll(projectsService.getProjectList().keySet()); - Collections.sort(listOfProjectsByName); - final JList listOfProjects = new JList<>(listOfProjectsByName.toArray(new String[0])); // data has type Object[] - listOfProjects.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - listOfProjects.setLayoutOrientation(JList.VERTICAL); - listOfProjects.setVisibleRowCount(-1); - - JScrollPane listScroller = new JScrollPane(listOfProjects); - listScroller.setPreferredSize(new Dimension(250, 300)); - - constraints.gridy = 0; - constraints.gridx = GridBagConstraints.RELATIVE; - typeOfDbPanel.add(listScroller, constraints); - - final JButton openProject = new JButton(Messages.getString("OptionWizard.56")); //$NON-NLS-1$ - openProject.setEnabled(false); - openProject.addActionListener(new ApplyOptionChangesListener(this, localPropertiesService) { - - @Override - protected void applyProperties() { - - File projectFolder = projectsService.getProjectList().get(listOfProjects.getSelectedValue()); - - try { - projectsService.loadProjectInFolder(projectFolder); - restartEarth(); - } catch (Exception e1) { - JOptionPane.showMessageDialog(PropertiesDialog.this, e1.getMessage(), - Messages.getString("OptionWizard.55"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - logger.error("Error importing project folder " + projectFolder.getAbsolutePath(), e1); //$NON-NLS-1$ - } - - } - - }); - - listOfProjects.addListSelectionListener(e -> openProject.setEnabled(listOfProjects.getSelectedValue() != null) ); - - typeOfDbPanel.add(openProject); - - return panel; - } - - private JScrollPane getOperationModePanelScroll() { - final JComponent operationModePanel = getOperationModePanel(); - return new JScrollPane(operationModePanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + GridBagConstraints c = new GridBagConstraints(); + + int row = 0; + c.fill = GridBagConstraints.BOTH; + + c.gridx = 0; + c.gridwidth = 2; + panel.add(new JLabel("" + + "This utility deletes plots that are already collected and present in the Collect Earth Database.
" + + "Make sure to backup the data in your DB before attempting to delete plots ( use the Tools->Data Import/Export->Export data to Collect Backup function)." + + "
" + + "The next field expects a CSV file for which the IDs of the plots to be deleted are present.The headers of the columns should be the names of the key attributes of the survey (usually just one, called ID, but it could be more)." + + ""), c); + c.gridy = row++; + + c.gridx = 0; + c.gridwidth = 2; + c.gridy = row++; + panel.add(getCsvFilePicker(), c); + c.gridy = row; + + panel.add(getDeleteButton(), c); + this.dlg.add(panel); } - private JComponent getPlotOptionsPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.fill = GridBagConstraints.HORIZONTAL; - - JLabel label = new JLabel("Plot shape"); - panel.add(label, constraints); - - constraints.gridx = 1; - JComboBox plotShape = (JComboBox) propertyToComponent.get(EarthProperty.SAMPLE_SHAPE)[0]; - panel.add(plotShape, constraints); - - constraints.gridx = 0; - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.35")); //$NON-NLS-1$ - panel.add(label, constraints); - - constraints.gridx = 1; - JComboBox numberPoints = (JComboBox) propertyToComponent - .get(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT)[0]; - panel.add(numberPoints, constraints); - - constraints.gridx = 0; - constraints.gridy++; - JLabel distanceOrRadiuslabel = new JLabel(Messages.getString("OptionWizard.36")); //$NON-NLS-1$ - panel.add(distanceOrRadiuslabel, constraints); - - constraints.gridx = 1; - JComboBox distanceBetweenPoints = (JComboBox) propertyToComponent - .get(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS)[0]; - panel.add(new JScrollPane(distanceBetweenPoints), constraints); - - constraints.gridx = 0; - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.37")); //$NON-NLS-1$ - panel.add(label, constraints); - constraints.gridx = 1; - JComboBox distanceToFrame = (JComboBox) propertyToComponent - .get(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES)[0]; - panel.add(new JScrollPane(distanceToFrame), constraints); - - constraints.gridx = 0; - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.95")); //$NON-NLS-1$ - panel.add(label, constraints); - constraints.gridx = 1; - JComboBox dotsSide = (JComboBox) propertyToComponent.get(EarthProperty.INNER_SUBPLOT_SIDE)[0]; - panel.add(new JScrollPane(dotsSide), constraints); - - constraints.gridx = 0; - constraints.gridy++; - label = new JLabel("Central plot side"); //$NON-NLS-1$ - panel.add(label, constraints); - constraints.gridx = 1; - JComboBox largeCentralPlotSide = (JComboBox) propertyToComponent.get(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)[0]; - panel.add(new JScrollPane(largeCentralPlotSide), constraints); - - - - constraints.gridx = 0; - constraints.gridy++; - label = new JLabel("Distance between plots in cluster"); - panel.add(label, constraints); - constraints.gridx = 1; - JComboBox plotDistanceInCluster = (JComboBox) propertyToComponent - .get(EarthProperty.DISTANCE_BETWEEN_PLOTS)[0]; - panel.add(new JScrollPane(plotDistanceInCluster), constraints); - - constraints.gridx = 0; - constraints.gridy++; - JLabel area = new JLabel( - "Area (hectares) : " + calculateArea(numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide)); - panel.add(area, constraints); - - ActionListener calculateAreas = actionPerformed -> area.setText("Area (hectares) : " + calculateArea(numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide)); - - plotShape.addActionListener( e-> - handleVisibilityPlotLayout(plotShape, numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide, - plotDistanceInCluster, area, distanceOrRadiuslabel, largeCentralPlotSide) - ); - - numberPoints.addActionListener(calculateAreas); - distanceBetweenPoints.addActionListener(calculateAreas); - distanceToFrame.addActionListener(calculateAreas); - - handleVisibilityPlotLayout(plotShape, numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide, - plotDistanceInCluster, area, distanceOrRadiuslabel, largeCentralPlotSide); - - return panel; - } - - public void handleVisibilityPlotLayout(JComboBox plotShape, JComboBox numberPoints, JComboBox distanceBetweenPoints, - JComboBox distanceToFrame, JComboBox dotsSide, JComboBox distanceBetweenPlots, JLabel area, - JLabel distanceOrRadiuslabel, JComboBox largeCentralPlotSide ) { - numberPoints.setEnabled(false); - distanceBetweenPoints.setEnabled(false); - distanceToFrame.setEnabled(false); - dotsSide.setEnabled(false); - area.setVisible(false); - distanceBetweenPlots.setVisible(false); - distanceBetweenPlots.setEnabled(false); - largeCentralPlotSide.setVisible( false ); - largeCentralPlotSide.setEnabled(false); - - if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE) || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE_WITH_LARGE_CENTRAL_PLOT) ) { - numberPoints.setEnabled(true); - distanceBetweenPoints.setEnabled(true); - distanceToFrame.setEnabled(true); - dotsSide.setEnabled(true); - area.setVisible(true); - distanceOrRadiuslabel.setText(Messages.getString("OptionWizard.36")); - - if( plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE_WITH_LARGE_CENTRAL_PLOT) ) { - largeCentralPlotSide.setVisible( true ); - largeCentralPlotSide.setEnabled(true); - } - - } else if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.CIRCLE) - || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.HEXAGON)) { - distanceBetweenPoints.setEnabled(true); - dotsSide.setEnabled(true); - numberPoints.setEnabled(true); - distanceOrRadiuslabel.setText("Radius"); - } else if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.NFI_THREE_CIRCLES) || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.NFI_FOUR_CIRCLES)) { - dotsSide.setEnabled(true); - distanceBetweenPoints.setEnabled(true); - distanceBetweenPlots.setVisible(true); - distanceBetweenPlots.setEnabled(true); - distanceOrRadiuslabel.setText("Radius of the plots"); + private JButton getDeleteButton() { + if (deleteFromDB == null) { + deleteFromDB = new JButton("Delete plots with IDs in the CSV from the database"); + deleteFromDB.setEnabled(false); + deleteFromDB.addActionListener( e -> { + if (JOptionPane.showConfirmDialog(RemovePlotsFromDBDlg.this.dlg, + "Are you sure you want to remove the plots with the IDs that are specified in the CSV file??", + "Confirm deletion of plots in DB", JOptionPane.YES_NO_OPTION, + JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) { + deletePlotsFromDB(); + } + }); } + return deleteFromDB; } - private String calculateArea(JComboBox numberOfPoints, JComboBox distanceBetweenPoints, JComboBox distanceToFrame, JComboBox dotsSide) { - double side = 0; - try { - int numberOfPointsI = ((ComboBoxItem) numberOfPoints.getSelectedItem()).getNumberOfPoints(); - int distanceBetweenPointsI = Integer.parseInt((String) distanceBetweenPoints.getSelectedItem()); - int distanceToFrameI = Integer.parseInt((String) distanceToFrame.getSelectedItem()); + private boolean validateCsv(String filePath) { + boolean validFile = true; - if (numberOfPointsI == 0 || numberOfPointsI == 1) { + try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(filePath, false) ){ - side = 2d * distanceToFrameI; - if (oldSelectedDistance == null) { - oldSelectedDistance = (String) distanceBetweenPoints.getSelectedItem(); - distanceBetweenPoints.setEnabled(false); - } - distanceBetweenPoints.setSelectedItem("0"); + filePicker.setTextBackground(Color.white); - if (numberOfPointsI == 0) { - dotsSide.setEnabled(false); - } else if (numberOfPointsI == 1) { - dotsSide.setEnabled(true); - } + if (CsvReaderUtils.isCsvFile(filePath)) { - } else { - if (oldSelectedDistance != null) { - distanceBetweenPoints.setSelectedItem(oldSelectedDistance); - oldSelectedDistance = null; + // Get the first line + String[] csvHeaders = csvReader.readNext(); + String[] expectedHeaders = getKeyAttributesName(); + if (!Arrays.equals(expectedHeaders, csvHeaders)) { + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, + String.format("The Headers of the CSV file used should be %s, instead they are %s", + Arrays.toString(expectedHeaders), + StringUtils.abbreviate(Arrays.toString(csvHeaders), 35))); + filePicker.setTextBackground(Color.red); + validFile = false; } - distanceBetweenPoints.setEnabled(true); - distanceToFrame.setEnabled(true); - dotsSide.setEnabled(true); - - double pointsByLines = Math.sqrt(numberOfPointsI); - side = 2d * distanceToFrameI + (pointsByLines - 1) * distanceBetweenPointsI; + } else { + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, + String.format("The file in %s is NOT A CSV file ", filePath)); + validFile = false; + filePicker.setTextBackground(Color.red); } - - } catch (RuntimeException e) { - logger.error("Error calculating area of the plot", e); + } catch (Exception e) { + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, + String.format("Error opening file at %s. %s ", filePath, e.getMessage())); + logger.error("Error while validating the CSV file", e); + validFile = false; } - DecimalFormat df = new DecimalFormat("###.##"); - return df.format(side * side / 10000d); - } - - private JPanel getPostgreSqlPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), - Messages.getString("OptionWizard.6")); //$NON-NLS-1$ - panel.setBorder(border); - - JLabel label = new JLabel(Messages.getString("OptionWizard.7")); //$NON-NLS-1$ - constraints.gridx = 0; - panel.add(label, constraints); - - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.DB_USERNAME)[0], constraints); - - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.8")); //$NON-NLS-1$ - constraints.gridx = 0; - panel.add(label, constraints); - - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.DB_PASSWORD)[0], constraints); - - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.9")); //$NON-NLS-1$ - constraints.gridx = 0; - panel.add(label, constraints); - - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.DB_NAME)[0], constraints); - - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.26")); //$NON-NLS-1$ - constraints.gridx = 0; - panel.add(label, constraints); - - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.DB_HOST)[0], constraints); - - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.29")); //$NON-NLS-1$ - constraints.gridx = 0; - panel.add(label, constraints); - - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.DB_PORT)[0], constraints); - - constraints.gridx = 2; - panel.add(new JLabel("Default: 5432"), constraints); - - constraints.gridy++; - constraints.gridx = 1; - JButton button = new JButton("Test Connection"); //$NON-NLS-1$ - button.addActionListener( e-> { - String host = ((JTextField) (propertyToComponent.get(EarthProperty.DB_HOST)[0])).getText(); - String port = ((JTextField) (propertyToComponent.get(EarthProperty.DB_PORT)[0])).getText(); - String dbName = ((JTextField) (propertyToComponent.get(EarthProperty.DB_NAME)[0])).getText(); - String username = ((JTextField) (propertyToComponent.get(EarthProperty.DB_USERNAME)[0])).getText(); - String password = ((JTextField) (propertyToComponent.get(EarthProperty.DB_PASSWORD)[0])).getText(); - - String message = CollectEarthUtils.testPostgreSQLConnection(host, port, dbName, username, password); - JOptionPane.showMessageDialog(PropertiesDialog.this.getOwner(), message, "PostgreSQL Connection test", - JOptionPane.INFORMATION_MESSAGE); - }); - panel.add(button, constraints); - - return panel; + getDeleteButton().setEnabled(validFile); + return validFile; } - private JPanel getSqlLitePanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), - Messages.getString("OptionWizard.30")); //$NON-NLS-1$ - panel.setBorder(border); - - panel.add(propertyToComponent.get(EarthProperty.AUTOMATIC_BACKUP)[0], constraints); - constraints.gridx++; - panel.add(getOpenBackupFolderButton()); - return panel; - } - - private JComponent getSampleDataPanel() { - final JPlotCsvTable samplePlots = new JPlotCsvTable(localPropertiesService.getValue(EarthProperty.SAMPLE_FILE), - surveyLoaded); - - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.fill = GridBagConstraints.BOTH; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; + private void deletePlotsFromDB() { + InfiniteProgressMonitor progressDeletion = new InfiniteProgressMonitor(this.dlg, "Deleting plots", + "Wait while the plots are deleted from the database"); - final JFilePicker refreshTableOnFileChange = getFilePickerSamplePlots(samplePlots); - - panel.add(refreshTableOnFileChange, constraints); - - samplePlots.setFillsViewportHeight(true); - constraints.gridy = 1; - - constraints.weightx = 1.0; - constraints.weighty = 1.0; - constraints.gridwidth = GridBagConstraints.REMAINDER; - constraints.gridheight = GridBagConstraints.REMAINDER; - - samplePlots.setPreferredScrollableViewportSize(samplePlots.getPreferredSize()); - - panel.add(new JScrollPane(samplePlots, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, - ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), constraints); - - return panel; - } - - private JFilePicker getFilePickerSamplePlots(final JPlotCsvTable samplePlots) { - final JFilePicker refreshTableOnFileChange = (JFilePicker) (propertyToComponent - .get(EarthProperty.SAMPLE_FILE)[0]); - refreshTableOnFileChange.addChangeListener(new DocumentListener() { + Thread treadDeleting = new Thread("Deleting plots from Database") { + int plotsDeleted = 0; + int plotsNotFoundInDB = 0; + int plotsCouldNotBeDeleted = 0; + boolean success = true; + ArrayList messages = new ArrayList<>(); @Override - public void changedUpdate(DocumentEvent e) { - // Do not react - } - - @Override - public void insertUpdate(DocumentEvent e) { - refreshTable(); - } - - @Override - public void removeUpdate(DocumentEvent e) { - // Do not react - } - - private void refreshTable() { - samplePlots.refreshTable(refreshTableOnFileChange.getSelectedFilePath()); - - // Do not let the user save the changes if the sample data is wrong!!! - getApplyChangesButton().setEnabled(samplePlots.isDataValid()); - } - }); - return refreshTableOnFileChange; - } - - private JPanel getServerPanel() { + public void run() { + try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(getCsvFilePicker().getSelectedFilePath(), false) ){ + List allLines = csvReader.readAll(); + int totalLines = allLines.size() - 1; + boolean skipFirst = true; + int plot = 0; + progressDeletion.showLater(); + for (String[] csvRow : allLines) { + + if (skipFirst) { + skipFirst = false; + continue; + } - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; + progressDeletion.updateProgress(++plot, totalLines); - final JPanel typeOfDbPanel = new JPanel(new GridBagLayout()); - final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), - Messages.getString("OptionWizard.3")); //$NON-NLS-1$ - typeOfDbPanel.setBorder(border); + CollectRecord record = earthSurveyService.loadRecord(csvRow); + if (record == null) { + plotsNotFoundInDB++; + messages.add(String.format(" Could not find plot with ID %s in the Database", + Arrays.toString(csvRow))); + } else { + deleteRecord(csvRow, record); + } + } - JLabel label = new JLabel(Messages.getString("OptionWizard.4") + CollectEarthUtils.getComputerIp()); //$NON-NLS-1$ - typeOfDbPanel.add(label, constraints); - constraints.gridy++; + } catch (Exception e) { + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, + "Error reading CSV file or CSV File too big!"); + logger.error("Error while validating the CSV file", e); + success = false; + } finally { - label = new JLabel(Messages.getString("OptionWizard.5")); //$NON-NLS-1$ - constraints.gridx = 0; - typeOfDbPanel.add(label, constraints); + if (progressDeletion != null) { + progressDeletion.close(); + } - constraints.gridx = 1; - typeOfDbPanel.add(propertyToComponent.get(EarthProperty.HOST_PORT_KEY)[0], constraints); + } - constraints.gridwidth = GridBagConstraints.REMAINDER; - constraints.gridy++; - constraints.gridx = 0; + DeleteResults deleteResults = new DeleteResults(success, plotsDeleted, plotsNotFoundInDB, + plotsCouldNotBeDeleted, messages); + String result = "Plots Deleted : " + deleteResults.plotsDeleted + "
" + + "Plots Not Found :
" + deleteResults.plotsNotFoundInDB + "
" + + "Plots that could not be deleted because a exception : " + deleteResults.plotsErrorWhenDeleting + "
" + + " Messages :
" + StringUtils.join(deleteResults.messages, "
"); + if( success ) { + result = "" + + "Results of the deletion process:
" + + result + ""; + }else { + result = "" + + "There was an error while deleting the plots. Review the Collect Earth Log file in the Help menu.
" + + result + ""; + } - final ButtonGroup bg = new ButtonGroup(); - final JComponent[] dbTypes = propertyToComponent.get(EarthProperty.DB_DRIVER); - postgresPanel = getPostgreSqlPanel(); - sqlitePanel = getSqlLitePanel(); + JEditorPane web = new JEditorPane(); + web.setEditable(false); + web.setContentType("text/html"); + web.setText(result); - boolean usingPostgreSQL = localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.POSTGRESQL); - enableDBOptions(usingPostgreSQL); - for (final JComponent typeRadioButton : dbTypes) { - final JRadioButton dbTypeButton = (JRadioButton) typeRadioButton; - bg.add(dbTypeButton); - typeOfDbPanel.add(dbTypeButton, constraints); - constraints.gridy++; + JScrollPane scrollPane = new JScrollPane(web); + scrollPane.setPreferredSize( new Dimension( 450, 350 )); - dbTypeButton.addActionListener(getDbTypeListener()); - dbTypeButton.addActionListener(e -> setRestartRequired(true)); + // Refresh contents of Google Earth! + EarthApp.executeKmlLoadAsynchronously( null ); - if (dbTypeButton.getName().equals(EarthConstants.CollectDBDriver.POSTGRESQL.name())) { - typeOfDbPanel.add(postgresPanel, constraints); - constraints.gridy++; + SwingUtilities.invokeLater( () -> { + if (deleteResults.success) { + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, scrollPane, "Success deleting plots", JOptionPane.INFORMATION_MESSAGE); + } else { - } else { - typeOfDbPanel.add(sqlitePanel, constraints); - constraints.gridy++; + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, scrollPane, "Error deleting plots", JOptionPane.WARNING_MESSAGE); + } + }); } - } - return typeOfDbPanel; - } - - private Component getOpenBackupFolderButton() { - AbstractAction backupAction = new AbstractAction(Messages.getString("OptionWizard.10")) { //$NON-NLS-1$ - - private static final long serialVersionUID = 1L; - - @Override - public void actionPerformed(ActionEvent e) { + private void deleteRecord(String[] csvRow, CollectRecord record) { try { - - CollectEarthUtils.openFolderInExplorer(backupFolder); - - } catch (final IOException e1) { - logger.error("Error when opening the explorer window to visualize backups", e1); //$NON-NLS-1$ + recordManager.delete(record.getId()); + messages.add(String.format("Deleted plot with ID %s ", Arrays.toString(csvRow))); + plotsDeleted++; + } catch (RecordPersistenceException e) { + plotsCouldNotBeDeleted++; + messages.add(String.format("Error when deleting plot with ID %s. Error Message: %s", + Arrays.toString(csvRow), e.getMessage())); + logger.error("Error deleting plot with ID " + Arrays.toString(csvRow)); + success = false; } } - }; - return new JButton(backupAction); + treadDeleting.start(); } - private JComponent getSurveyDefinitonPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.fill = GridBagConstraints.HORIZONTAL; - constraints.gridwidth = 2; - panel.add(propertyToComponent.get(EarthProperty.OPEN_BALLOON_IN_BROWSER)[0], constraints); - - constraints.gridy++; - constraints.gridwidth = 1; - final JLabel label = new JLabel(Messages.getString("OptionWizard.43")); //$NON-NLS-1$ - panel.add(label, constraints); - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.SURVEY_NAME)[0], constraints); - - constraints.gridy++; - constraints.gridwidth = GridBagConstraints.REMAINDER; - constraints.gridx = 0; - panel.add(propertyToComponent.get(EarthProperty.KML_TEMPLATE_KEY)[0], constraints); - - constraints.gridy++; - constraints.gridx = 0; - panel.add(propertyToComponent.get(EarthProperty.BALLOON_TEMPLATE_KEY)[0], constraints); - - constraints.gridy++; - constraints.gridx = 0; - - panel.add(propertyToComponent.get(EarthProperty.METADATA_FILE)[0], constraints); - - return panel; - } - - private void initilizeInputs() { - - final JCheckBox backupCheckbox = new JCheckBox(Messages.getString("OptionWizard.44")); //$NON-NLS-1$ - backupCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.AUTOMATIC_BACKUP))); - propertyToComponent.put(EarthProperty.AUTOMATIC_BACKUP, new JComponent[] { backupCheckbox }); - - final JCheckBox openEarthEngineCheckbox = new JCheckBox(Messages.getString("OptionWizard.45")); //$NON-NLS-1$ - openEarthEngineCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_EXPLORER))); - propertyToComponent.put(EarthProperty.OPEN_GEE_EXPLORER, new JComponent[] { openEarthEngineCheckbox }); - - final JCheckBox openGEEAppCheckbox = new JCheckBox("Google Earth Engine APP (no sign-in)"); //$NON-NLS-1$ - openGEEAppCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_APP))); - propertyToComponent.put(EarthProperty.OPEN_GEE_APP, new JComponent[] { openGEEAppCheckbox }); - - final JCheckBox openTimelapseCheckbox = new JCheckBox(Messages.getString("OptionWizard.46")); //$NON-NLS-1$ - openTimelapseCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_TIMELAPSE))); - propertyToComponent.put(EarthProperty.OPEN_TIMELAPSE, new JComponent[] { openTimelapseCheckbox }); - - final JCheckBox openEarthMapCheckbox = new JCheckBox(Messages.getString("OptionWizard.105")); //$NON-NLS-1$ - openEarthMapCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_EARTH_MAP))); - propertyToComponent.put(EarthProperty.OPEN_EARTH_MAP, new JComponent[] { openEarthMapCheckbox }); - - final JCheckBox openBingCheckbox = new JCheckBox(Messages.getString("OptionWizard.47")); //$NON-NLS-1$ - openBingCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BING_MAPS))); - propertyToComponent.put(EarthProperty.OPEN_BING_MAPS, new JComponent[] { openBingCheckbox }); - - final JCheckBox openPlanetCheckbox = new JCheckBox(Messages.getString("OptionWizard.100")); //$NON-NLS-1$ - openPlanetCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_PLANET_MAPS))); - propertyToComponent.put(EarthProperty.OPEN_PLANET_MAPS, new JComponent[] { openPlanetCheckbox }); - - final JCheckBox openMonthlyNICFICheckbox = new JCheckBox(Messages.getString("OptionWizard.110")); //$NON-NLS-1$ - openMonthlyNICFICheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.PLANET_MAPS_MONHLY))); - propertyToComponent.put(EarthProperty.PLANET_MAPS_MONHLY, new JComponent[] { openMonthlyNICFICheckbox }); - - - final JPasswordField planetAPIKeyTextField = new JPasswordField( - localPropertiesService.getValue(EarthProperty.PLANET_MAPS_KEY)); - planetAPIKeyTextField.setMinimumSize(new Dimension( 250, 20 )); - planetAPIKeyTextField.setEnabled( localPropertiesService.isPlanetMapsSupported() ); - propertyToComponent.put(EarthProperty.PLANET_MAPS_KEY, new JComponent[] { planetAPIKeyTextField }); - - openMonthlyNICFICheckbox.setEnabled( openPlanetCheckbox.isSelected() ); - planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ); - - openPlanetCheckbox.addActionListener( e-> { - planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ); - openMonthlyNICFICheckbox.setEnabled( openPlanetCheckbox.isSelected() ); - }); - openMonthlyNICFICheckbox.addActionListener( e-> planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ) ); - - - final JCheckBox openSecureWatchCheckbox = new JCheckBox(Messages.getString("OptionWizard.102")); //$NON-NLS-1$ - openSecureWatchCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_MAXAR_SECUREWATCH))); - propertyToComponent.put(EarthProperty.OPEN_MAXAR_SECUREWATCH, new JComponent[] { openSecureWatchCheckbox }); - - final JTextField secureWatchUrlTextField = new JTextField( - localPropertiesService.getValue(EarthProperty.MAXAR_SECUREWATCH_URL)); - secureWatchUrlTextField.setMinimumSize(new Dimension( 250, 20 )); - propertyToComponent.put(EarthProperty.MAXAR_SECUREWATCH_URL, new JComponent[] { secureWatchUrlTextField }); - secureWatchUrlTextField.setEnabled( localPropertiesService.isSecureWatchSupported() ); - propertyToComponent.put(EarthProperty.MAXAR_SECUREWATCH_URL, new JComponent[] { secureWatchUrlTextField }); - openSecureWatchCheckbox.addActionListener( e -> secureWatchUrlTextField.setEnabled( openSecureWatchCheckbox.isSelected() ) ); - - final JTextField extraUrlTextField = new JTextField( - localPropertiesService.getValue(EarthProperty.EXTRA_MAP_URL)); - extraUrlTextField.setMinimumSize(new Dimension( 250, 20 )); - propertyToComponent.put(EarthProperty.EXTRA_MAP_URL, new JComponent[] { extraUrlTextField }); - - final JCheckBox openBaiduCheckbox = new JCheckBox("Open Baidu Maps"); - openBaiduCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BAIDU_MAPS))); - propertyToComponent.put(EarthProperty.OPEN_BAIDU_MAPS, new JComponent[] { openBaiduCheckbox }); - - final JCheckBox openYandexCheckbox = new JCheckBox("Open Yandex maps for the plot area"); - openYandexCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_YANDEX_MAPS))); - propertyToComponent.put(EarthProperty.OPEN_YANDEX_MAPS, new JComponent[] { openYandexCheckbox }); - - final JCheckBox openHereCheckbox = new JCheckBox(Messages.getString("OptionWizard.59")); //$NON-NLS-1$ - openHereCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_HERE_MAPS))); - propertyToComponent.put(EarthProperty.OPEN_HERE_MAPS, new JComponent[] { openHereCheckbox }); - - final JCheckBox openGeePlaygroundCheckbox = new JCheckBox(Messages.getString("OptionWizard.58")); //$NON-NLS-1$ - openGeePlaygroundCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_CODE_EDITOR))); - propertyToComponent.put(EarthProperty.OPEN_GEE_CODE_EDITOR, new JComponent[] { openGeePlaygroundCheckbox }); - - final JCheckBox openInSeparateWindowCheckbox = new JCheckBox(Messages.getString("OptionWizard.48")); //$NON-NLS-1$ - openInSeparateWindowCheckbox.setSelected( - Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BALLOON_IN_BROWSER))); - propertyToComponent.put(EarthProperty.OPEN_BALLOON_IN_BROWSER, - new JComponent[] { openInSeparateWindowCheckbox }); - - final JFilePicker csvWithPlotData = new JFilePicker(Messages.getString("OptionWizard.49"), //$NON-NLS-1$ - localPropertiesService.getValue(EarthProperty.SAMPLE_FILE), Messages.getString("OptionWizard.50"), DlgMode.MODE_OPEN); // $NON-NLS-1$ - - csvWithPlotData.addFileTypeFilter(".csv,.ced", Messages.getString("OptionWizard.52"), true); //$NON-NLS-1$ //$NON-NLS-2$ - propertyToComponent.put(EarthProperty.SAMPLE_FILE, new JComponent[] { csvWithPlotData }); - - final JComboBox plotShape = new JComboBox<>(SAMPLE_SHAPE.values()); - try { - plotShape.setSelectedItem(SAMPLE_SHAPE.valueOf(localPropertiesService.getValue(EarthProperty.SAMPLE_SHAPE))); - } catch (Exception e1) { - logger.error("The selected shape type is not supported " + localPropertiesService.getValue(EarthProperty.SAMPLE_SHAPE), e1 ); + private String[] getKeyAttributesName() { + List keyAttributeDefinitions = survey.getSchema().getRootEntityDefinitions().get(0) + .getKeyAttributeDefinitions(); + String[] keyAttributeNames = new String[keyAttributeDefinitions.size()]; + int i = 0; + for (AttributeDefinition keyAttributeDefinition : keyAttributeDefinitions) { + keyAttributeNames[i++] = keyAttributeDefinition.getName(); } - propertyToComponent.put(EarthProperty.SAMPLE_SHAPE, new JComponent[] { plotShape }); - - final JComboBox comboNumberOfPoints = new JComboBox<>( - new ComboBoxItem[] { COMBO_BOX_ITEM_SQUARE, COMBO_BOX_ITEM_CENTRAL_POINT, new ComboBoxItem(4, "2x2"), //$NON-NLS-1$ //$NON-NLS-2$ - // //$NON-NLS-3$ - new ComboBoxItem(9, "3x3"), new ComboBoxItem(16, "4x4"), new ComboBoxItem(25, "5x5"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - new ComboBoxItem(36, "6x6"), //$NON-NLS-1$ - new ComboBoxItem(49, "7x7") }); //$NON-NLS-1$ - if( StringUtils.isNotBlank( localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT) ) ){ - try { - comboNumberOfPoints.setSelectedItem(new ComboBoxItem( - Integer.parseInt(localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT)), - "")); //$NON-NLS-1$ - } catch (NumberFormatException e1) { - logger.error("This should be a number {}", localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT), e1); - } - } - propertyToComponent.put(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT, - new JComponent[] { comboNumberOfPoints }); - - final String[] listOfNumbers = new String[1500]; - final String[] listOfNumbersFromTwo = new String[1500]; - - for (int index = 0; index < listOfNumbers.length; index++) { - listOfNumbers[index] = Integer.toString( index ); //$NON-NLS-1$ - listOfNumbersFromTwo[index] = Integer.toString( index + 2 ); //$NON-NLS-1$ - } - - final JComboBox listOfDistanceBetweenPoints = new JComboBox<>(listOfNumbersFromTwo); - listOfDistanceBetweenPoints - .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS)); - listOfDistanceBetweenPoints.setAutoscrolls(true); - - propertyToComponent.put(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS, - new JComponent[] { listOfDistanceBetweenPoints }); - - final JComboBox listOfDistanceBetweenPlots = new JComboBox<>(listOfNumbersFromTwo); - listOfDistanceBetweenPlots - .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS)); - listOfDistanceBetweenPlots.setAutoscrolls(true); - - propertyToComponent.put(EarthProperty.DISTANCE_BETWEEN_PLOTS, new JComponent[] { listOfDistanceBetweenPlots }); - - final JComboBox listOfDistanceToBorder = new JComboBox<>(listOfNumbers); - listOfDistanceToBorder - .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES)); - listOfDistanceToBorder.setAutoscrolls(true); - - propertyToComponent.put(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES, new JComponent[] { listOfDistanceToBorder }); - - final JComboBox listOfSizeofSamplingDot = new JComboBox<>(listOfNumbersFromTwo); - listOfSizeofSamplingDot.setSelectedItem(localPropertiesService.getValue(EarthProperty.INNER_SUBPLOT_SIDE)); - listOfSizeofSamplingDot.setAutoscrolls(true); - - propertyToComponent.put(EarthProperty.INNER_SUBPLOT_SIDE, new JComponent[] { listOfSizeofSamplingDot }); - - final JComboBox listOfSideOflargeCentralPlot = new JComboBox<>(listOfNumbersFromTwo); - listOfSideOflargeCentralPlot.setSelectedItem(localPropertiesService.getValue(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)); - listOfSideOflargeCentralPlot.setAutoscrolls(true); - - propertyToComponent.put(EarthProperty.LARGE_CENTRAL_PLOT_SIDE, new JComponent[] { listOfSideOflargeCentralPlot }); - - - final JRadioButton chromeChooser = new JRadioButton("Chrome"); //$NON-NLS-1$ - chromeChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() - .equals(EarthConstants.CHROME_BROWSER)); - chromeChooser.setName(EarthConstants.CHROME_BROWSER); + return keyAttributeNames; + } - final JRadioButton firefoxChooser = new JRadioButton("Firefox"); //$NON-NLS-1$ - firefoxChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() - .equals(EarthConstants.FIREFOX_BROWSER)); - firefoxChooser.setName(EarthConstants.FIREFOX_BROWSER); + private JFilePicker getCsvFilePicker() { + if (filePicker == null) { + filePicker = new JFilePicker("Choose the CSV file containing the IDs of the plots to remove", null, + "Explore", DlgMode.MODE_OPEN); - final JRadioButton edgeChooser = new JRadioButton("Edge"); //$NON-NLS-1$ - edgeChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() - .equals(EarthConstants.EDGE_BROWSER)); - edgeChooser.setName(EarthConstants.EDGE_BROWSER); + filePicker.getFileChooser().setAcceptAllFileFilterUsed(false); + filePicker.addFileTypeFilter("csv", " CSV file with plot IDs", true); - propertyToComponent.put(EarthProperty.BROWSER_TO_USE, new JComponent[] { firefoxChooser, chromeChooser, edgeChooser}); - final JFilePicker saikuPath = new JFilePicker(Messages.getString("OptionWizard.65"), //$NON-NLS-1$ - localPropertiesService.getValue(EarthProperty.SAIKU_SERVER_FOLDER), - Messages.getString("OptionWizard.66"), DlgMode.MODE_OPEN); //$NON-NLS-1$ - saikuPath.setFolderChooser(); - saikuPath.addChangeListener(new DocumentListener() { + filePicker.addChangeListener(new DocumentListener() { - private void showSaikuWarning() { - final File saikuFolder = new File(saikuPath.getSelectedFilePath()); - if ( !saikuService.isSaikuFolder(saikuFolder)) { - JOptionPane.showMessageDialog(PropertiesDialog.this, Messages.getString("OptionWizard.27"), //$NON-NLS-1$ - Messages.getString("OptionWizard.28"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ - saikuPath.getTextField().setBackground(CollectEarthWindow.ERROR_COLOR); - } else { - saikuPath.getTextField().setBackground(Color.white); + @Override + public void removeUpdate(DocumentEvent e) { + // Do not react } - } - - @Override - public void removeUpdate(DocumentEvent e) { - // Do not react - } - - @Override - public void insertUpdate(DocumentEvent e) { - showSaikuWarning(); - } - - @Override - public void changedUpdate(DocumentEvent e) { - // Do not react - } - }); - propertyToComponent.put(EarthProperty.SAIKU_SERVER_FOLDER, new JComponent[] { saikuPath }); - - final JFilePicker kmlTemplatePath = new JFilePicker(Messages.getString("OptionWizard.79"), //$NON-NLS-1$ - localPropertiesService.getValue(EarthProperty.KML_TEMPLATE_KEY), Messages.getString("OptionWizard.80"), //$NON-NLS-1$ - DlgMode.MODE_OPEN); - kmlTemplatePath.addFileTypeFilter(".fmt", Messages.getString("OptionWizard.82"), true); //$NON-NLS-1$ //$NON-NLS-2$ - propertyToComponent.put(EarthProperty.KML_TEMPLATE_KEY, new JComponent[] { kmlTemplatePath }); - - final JFilePicker htmlBalloonPath = new JFilePicker(Messages.getString("OptionWizard.83"), //$NON-NLS-1$ - localPropertiesService.getValue(EarthProperty.BALLOON_TEMPLATE_KEY), - Messages.getString("OptionWizard.84"), DlgMode.MODE_OPEN); //$NON-NLS-1$ - htmlBalloonPath.addFileTypeFilter(".html,.htm", Messages.getString("OptionWizard.86"), true); //$NON-NLS-1$ //$NON-NLS-2$ - propertyToComponent.put(EarthProperty.BALLOON_TEMPLATE_KEY, new JComponent[] { htmlBalloonPath }); - - final JFilePicker idmPath = new JFilePicker(Messages.getString("OptionWizard.87"), //$NON-NLS-1$ - localPropertiesService.getImdFile(), Messages.getString("OptionWizard.88"), DlgMode.MODE_OPEN); //$NON-NLS-1$ - idmPath.addFileTypeFilter(".xml", Messages.getString("OptionWizard.90"), true); //$NON-NLS-1$ //$NON-NLS-2$ - propertyToComponent.put(EarthProperty.METADATA_FILE, new JComponent[] { idmPath }); - - final JTextField surveyNameTextField = new JTextField( - localPropertiesService.getValue(EarthProperty.SURVEY_NAME)); - surveyNameTextField.setEnabled(false); - propertyToComponent.put(EarthProperty.SURVEY_NAME, new JComponent[] { surveyNameTextField }); - - // Database options - final JRadioButton instanceTypeServer = new JRadioButton(Messages.getString("OptionWizard.91")); //$NON-NLS-1$ - instanceTypeServer.setSelected(localPropertiesService.getOperationMode().equals(OperationMode.SERVER_MODE)); - instanceTypeServer.setName(EarthConstants.OperationMode.SERVER_MODE.name()); - - final JRadioButton instanceTypeClient = new JRadioButton(Messages.getString("OptionWizard.92")); //$NON-NLS-1$ - instanceTypeClient.setSelected(localPropertiesService.getOperationMode().equals(OperationMode.CLIENT_MODE)); - instanceTypeClient.setName(EarthConstants.OperationMode.CLIENT_MODE.name()); - propertyToComponent.put(EarthProperty.OPERATION_MODE, - new JComponent[] { instanceTypeServer, instanceTypeClient }); - - final JTextField collectEarthServerIp = new JTextField(localPropertiesService.getValue(EarthProperty.HOST_KEY)); - propertyToComponent.put(EarthProperty.HOST_KEY, new JComponent[] { collectEarthServerIp }); - - final JTextField collectEarthServerIpPort = new JTextField(localPropertiesService.getPort()); - final JTextField collectEarthServerLocalPort = new JTextField( - localPropertiesService.getValue(EarthProperty.HOST_PORT_KEY)); - propertyToComponent.put(EarthProperty.HOST_PORT_KEY, - new JComponent[] { collectEarthServerIpPort, collectEarthServerLocalPort }); - - final JRadioButton sqliteDbType = new JRadioButton(Messages.getString("OptionWizard.93")); //$NON-NLS-1$ - sqliteDbType.setSelected(localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.SQLITE)); - sqliteDbType.setName(CollectDBDriver.SQLITE.name()); - - final JRadioButton postgresDbType = new JRadioButton(Messages.getString("OptionWizard.94")); //$NON-NLS-1$ - boolean usingPostgreSQL = localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.POSTGRESQL); - postgresDbType.setSelected(usingPostgreSQL); - postgresDbType.setName(CollectDBDriver.POSTGRESQL.name()); - propertyToComponent.put(EarthProperty.DB_DRIVER, new JComponent[] { sqliteDbType, postgresDbType }); - - final JTextField dbUserName = new JTextField(localPropertiesService.getValue(EarthProperty.DB_USERNAME)); - propertyToComponent.put(EarthProperty.DB_USERNAME, new JComponent[] { dbUserName }); - - final JTextField dbPassword = new JTextField(localPropertiesService.getValue(EarthProperty.DB_PASSWORD)); - propertyToComponent.put(EarthProperty.DB_PASSWORD, new JComponent[] { dbPassword }); - - final JTextField dbName = new JTextField(localPropertiesService.getValue(EarthProperty.DB_NAME)); - propertyToComponent.put(EarthProperty.DB_NAME, new JComponent[] { dbName }); - - final JTextField dbHost = new JTextField(localPropertiesService.getValue(EarthProperty.DB_HOST)); - propertyToComponent.put(EarthProperty.DB_HOST, new JComponent[] { dbHost }); - - final JTextField dbPort = new JTextField(localPropertiesService.getValue(EarthProperty.DB_PORT)); - propertyToComponent.put(EarthProperty.DB_PORT, new JComponent[] { dbPort }); - - } - - public boolean isRestartRequired() { - return restartRequired; - } + @Override + public void insertUpdate(DocumentEvent e) { + validateCsv(filePicker.getTextField().getText()); + } - public void setRestartRequired(boolean restartRequired) { - this.restartRequired = restartRequired; + @Override + public void changedUpdate(DocumentEvent e) { + validateCsv(filePicker.getTextField().getText()); + } + }); + } + return filePicker; } } From 67e00b6bd8470ee42826e3914de19e94b6c9a1e5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:14 +0100 Subject: [PATCH 1295/1620] New translations RemovePlotsFromDBDlg.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 1345 +++-------------- 1 file changed, 231 insertions(+), 1114 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 7eb0424502..eb9b80be90 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,1209 +1,326 @@ package org.openforis.collect.earth.app.view; -import java.awt.BorderLayout; import java.awt.Color; -import java.awt.Component; -import java.awt.Container; import java.awt.Dimension; +import java.awt.Frame; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; -import java.awt.GridLayout; -import java.awt.Insets; -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; -import java.io.IOException; -import java.text.DecimalFormat; import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; +import java.util.Arrays; import java.util.List; -import javax.swing.AbstractAction; -import javax.swing.AbstractButton; -import javax.swing.ButtonGroup; import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JComponent; import javax.swing.JDialog; -import javax.swing.JFrame; +import javax.swing.JEditorPane; import javax.swing.JLabel; -import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; -import javax.swing.JPasswordField; -import javax.swing.JRadioButton; import javax.swing.JScrollPane; -import javax.swing.JTabbedPane; -import javax.swing.JTextField; -import javax.swing.ListSelectionModel; -import javax.swing.ScrollPaneConstants; -import javax.swing.border.BevelBorder; -import javax.swing.border.Border; -import javax.swing.border.TitledBorder; +import javax.swing.SwingUtilities; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; -import org.openforis.collect.earth.app.EarthConstants.OperationMode; -import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.AnalysisSaikuService; -import org.openforis.collect.earth.app.service.EarthProjectsService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.app.service.EarthSurveyService; import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.collect.manager.RecordManager; +import org.openforis.collect.model.CollectRecord; import org.openforis.collect.model.CollectSurvey; +import org.openforis.collect.persistence.RecordPersistenceException; +import org.openforis.idm.metamodel.AttributeDefinition; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ -public class PropertiesDialog extends JDialog { +import com.opencsv.CSVReader; - private static final ComboBoxItem COMBO_BOX_ITEM_CENTRAL_POINT = new ComboBoxItem(1, - Messages.getString("OptionWizard.54")); +@Component +@Lazy +public class RemovePlotsFromDBDlg { - private static final ComboBoxItem COMBO_BOX_ITEM_SQUARE = new ComboBoxItem(0, - Messages.getString("OptionWizard.53")); + @Autowired + private RecordManager recordManager; - private static final long serialVersionUID = -6760020609229102842L; + @Autowired + private EarthSurveyService earthSurveyService; - private final HashMap, JComponent[]> propertyToComponent = new HashMap<>(); - private final transient Logger logger = LoggerFactory.getLogger(this.getClass()); + @SuppressWarnings("unused") + private static final long serialVersionUID = 5175096170385736616L; + private CollectSurvey survey; + private Logger logger = LoggerFactory.getLogger(RemovePlotsFromDBDlg.class); - JPanel postgresPanel; - JPanel sqlitePanel; + private JButton deleteFromDB; + private JFilePicker filePicker; - private transient LocalPropertiesService localPropertiesService; + private JDialog dlg; - String backupFolder; - - private transient AnalysisSaikuService saikuService; - - private transient EarthProjectsService projectsService; - - private boolean restartRequired; - - private String oldSelectedDistance; - - private CollectSurvey surveyLoaded; - - private JButton applyChanges; - - public PropertiesDialog(JFrame frame, LocalPropertiesService localPropertiesService, - EarthProjectsService projectsService, String backupFolder, AnalysisSaikuService saikuService, - CollectSurvey surveyLoaded) { - super(frame, Messages.getString("OptionWizard.0")); //$NON-NLS-1$ - this.localPropertiesService = localPropertiesService; - this.projectsService = projectsService; - this.backupFolder = backupFolder; - this.saikuService = saikuService; - this.surveyLoaded = surveyLoaded; - this.setLocationRelativeTo(null); - this.setSize(new Dimension(600, 620)); - this.setModal(true); - this.setResizable(false); - initilizeInputs(); - buildMainPane(); - centreWindow(); - - } - - private void centreWindow() { - Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize(); - int x = (int) ((dimension.getWidth() - getWidth()) / 2); - int y = (int) ((dimension.getHeight() - getHeight()) / 2); - setLocation(x, y); - } - - private void buildMainPane() { - - final JPanel panel = new JPanel(new BorderLayout()); - panel.add(getOptionTabs(), BorderLayout.CENTER); - final JPanel buttonPanel = new JPanel(); - buttonPanel.add(getApplyChangesButton()); - buttonPanel.add(getCancelButton()); - panel.add(buttonPanel, BorderLayout.PAGE_END); - this.add(panel); - - } - - private void enableContainer(Container container, boolean enable) { - final Component[] components = container.getComponents(); - for (final Component component : components) { - component.setEnabled(enable); - if (component instanceof Container) { - enableContainer((Container) component, enable); - } - } - } - - private JComponent getBrowsersOptionsPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - final JPanel browserChooserPanel = new JPanel(); - final Border browserBorder = new TitledBorder(new BevelBorder(BevelBorder.LOWERED), - Messages.getString("OptionWizard.1")); //$NON-NLS-1$ - browserChooserPanel.setBorder(browserBorder); - GridLayout experimentLayout = new GridLayout(0,1); - browserChooserPanel.setLayout( experimentLayout ); - - final ButtonGroup browserChooser = new ButtonGroup(); - final JComponent[] browsers = propertyToComponent.get(EarthProperty.BROWSER_TO_USE); - - for (final JComponent browserRadioButton : browsers) { - browserChooserPanel.add(browserRadioButton); - browserChooser.add((AbstractButton) browserRadioButton); - - ((JRadioButton) browserRadioButton).addActionListener(e -> setRestartRequired(true)); - } - constraints.gridy++; - panel.add(browserChooserPanel, constraints); - - constraints.gridy++; - constraints.gridx = 0; - panel.add(propertyToComponent.get(EarthProperty.SAIKU_SERVER_FOLDER)[0], constraints); - - return panel; - } - - private JComponent getIntegrationsPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - panel.add(propertyToComponent.get(EarthProperty.OPEN_GEE_APP)[0], constraints); - - constraints.gridy++; - panel.add(propertyToComponent.get(EarthProperty.OPEN_BING_MAPS)[0], constraints); - - constraints.gridy++; - panel.add(propertyToComponent.get(EarthProperty.OPEN_EARTH_MAP)[0], constraints); - - - constraints.gridy++; - constraints.gridwidth = 1; - panel.add(propertyToComponent.get(EarthProperty.OPEN_PLANET_MAPS)[0], constraints); - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.PLANET_MAPS_MONHLY)[0], constraints); - - constraints.gridy++; - constraints.gridx = 0; - constraints.gridwidth = 1; - final JLabel label = new JLabel(Messages.getString("OptionWizard.101")); //$NON-NLS-1$ - panel.add(label, constraints); - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.PLANET_MAPS_KEY)[0], constraints); - - constraints.gridx = 0; - constraints.gridy++; - constraints.gridwidth = 2; - panel.add(propertyToComponent.get(EarthProperty.OPEN_MAXAR_SECUREWATCH)[0], constraints); - - constraints.gridy++; - constraints.gridwidth = 1; - final JLabel labelMaxar = new JLabel(Messages.getString("OptionWizard.1021")); //$NON-NLS-1$ - panel.add(labelMaxar, constraints); - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.MAXAR_SECUREWATCH_URL)[0], constraints); - - constraints.gridx = 0; - constraints.gridy++; - constraints.gridwidth = 2; - panel.add(propertyToComponent.get(EarthProperty.OPEN_YANDEX_MAPS)[0], constraints); - - constraints.gridy++; - panel.add(propertyToComponent.get(EarthProperty.OPEN_BAIDU_MAPS)[0], constraints); - - constraints.gridy++; - final JLabel label2 = new JLabel(Messages.getString("OptionWizard.103")); //$NON-NLS-1$ - panel.add(label2, constraints); - constraints.gridy++; - panel.add(propertyToComponent.get(EarthProperty.EXTRA_MAP_URL)[0], constraints); - - constraints.gridy++; - constraints.gridx = 0; - constraints.gridwidth = 2; - panel.add(propertyToComponent.get(EarthProperty.OPEN_GEE_CODE_EDITOR)[0], constraints); - - - return panel; + public RemovePlotsFromDBDlg() { + super(); } - - private Component getApplyChangesButton() { - if (applyChanges == null) { - applyChanges = new JButton(Messages.getString("OptionWizard.15")); - applyChanges.addActionListener( - new ApplyOptionChangesListener(this, localPropertiesService, propertyToComponent) { - @Override - protected void applyProperties() { - new Thread("Applying properties dialog") { - @Override - public void run() { - savePropertyValues(); - if (isRestartRequired()) { - - restartEarth(); - } else { - EarthApp.executeKmlLoadAsynchronously(PropertiesDialog.this); - } - } - }.start(); - } - }); + private class DeleteResults { + private boolean success; + private Integer plotsDeleted; + private Integer plotsNotFoundInDB; + private Integer plotsErrorWhenDeleting; + private List messages; + + public DeleteResults(boolean success, Integer plotsDeleted, Integer plotsNotFoundInDB, + Integer plotsErrorWhenDeleting, List messages) { + super(); + this.success = success; + this.plotsDeleted = plotsDeleted; + this.plotsNotFoundInDB = plotsNotFoundInDB; + this.plotsErrorWhenDeleting = plotsErrorWhenDeleting; + this.messages = messages; } - return applyChanges; - } - public void closeDialog() { - this.dispose(); } - private Component getCancelButton() { - final JButton cancelButton = new JButton(Messages.getString("OptionWizard.24")); //$NON-NLS-1$ - cancelButton.addActionListener( e -> PropertiesDialog.this.dispose() ); - return cancelButton; + public void open(Frame owner, CollectSurvey survey) { + this.dlg = new JDialog(owner); + this.survey = survey; + this.dlg.setModal(true); + this.dlg.setSize(new Dimension(700, 350)); + this.dlg.setLocationRelativeTo(owner); + this.dlg.setTitle("Tool for removing plots from DB using a CSV with plot IDs"); + initLayout(); + dlg.setVisible(true); } - private JComponent getOperationModePanel() { - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - final JPanel typeOfUsePanel = new JPanel(new GridBagLayout()); - final Border border = new TitledBorder(new BevelBorder(BevelBorder.LOWERED), - Messages.getString("OptionWizard.2")); //$NON-NLS-1$ - typeOfUsePanel.setBorder(border); - - JPanel serverPanel = getServerPanel(); - typeOfUsePanel.add(serverPanel, constraints); - - return typeOfUsePanel; - } - - private void enableDBOptions(boolean isPostgreDb) { - enableContainer(postgresPanel, isPostgreDb); - enableContainer(sqlitePanel, !isPostgreDb); - } - - private ActionListener getDbTypeListener() { - return e -> { - final JRadioButton theJRB = (JRadioButton) e.getSource(); - - boolean isPostgreDb = theJRB.getName().equals(CollectDBDriver.POSTGRESQL.name()); - enableDBOptions(isPostgreDb); - }; - } - - private JTabbedPane getOptionTabs() { - final JTabbedPane tabbedPane = new JTabbedPane(); - tabbedPane.setSize(550, 300); - final JComponent panel1 = getSampleDataPanel(); - tabbedPane.addTab(Messages.getString("OptionWizard.31"), panel1); //$NON-NLS-1$ - - final JComponent panel2 = getPlotOptionsPanel(); - tabbedPane.addTab(Messages.getString("OptionWizard.32"), panel2); //$NON-NLS-1$ - - final JComponent panel3 = getSurveyDefinitonPanel(); - tabbedPane.addTab(Messages.getString("OptionWizard.33"), panel3); //$NON-NLS-1$ - - final JComponent panel41 = getIntegrationsPanel(); - tabbedPane.addTab(Messages.getString("OptionWizard.34"), panel41); //$NON-NLS-1$ - - final JComponent panel4 = getBrowsersOptionsPanel(); - tabbedPane.addTab(Messages.getString("OptionWizard.104"), panel4); //$NON-NLS-1$ - - final JComponent panel5 = getOperationModePanelScroll(); - tabbedPane.addTab(Messages.getString("OptionWizard.25"), panel5); //$NON-NLS-1$ - - final JComponent panel6 = getProjectsPanelScroll(); - tabbedPane.addTab(Messages.getString("OptionWizard.40"), panel6); //$NON-NLS-1$ - - return tabbedPane; - } - - private JComponent getProjectsPanelScroll() { - final JComponent projectsPanel = getProjectsPanel(); - return new JScrollPane(projectsPanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); - } - - private JComponent getProjectsPanel() { + private void initLayout() { final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.fill = GridBagConstraints.BOTH; - - JButton importNewButton = new JButton(Messages.getString("OptionWizard.41")); //$NON-NLS-1$ - importNewButton.addActionListener(new ApplyOptionChangesListener(this, localPropertiesService) { - - @Override - protected void applyProperties() { - final File[] selectedProjectFile = JFileChooserExistsAware.getFileChooserResults( - DataFormat.PROJECT_DEFINITION_FILE, false, false, null, localPropertiesService, - (JFrame) PropertiesDialog.this.getParent()); - - if (selectedProjectFile != null && selectedProjectFile.length == 1) { - try { - projectsService.loadCompressedProjectFile(selectedProjectFile[0]); - restartEarth(); - } catch (Exception e1) { - JOptionPane.showMessageDialog(PropertiesDialog.this, e1.getMessage(), - Messages.getString("OptionWizard.51"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - logger.error("Error importing project file " + selectedProjectFile[0].getAbsolutePath(), e1); //$NON-NLS-1$ - } - - } - } - }); - - panel.add(importNewButton, constraints); - - final JPanel typeOfDbPanel = new JPanel(new GridBagLayout()); - final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), - Messages.getString("OptionWizard.57")); //$NON-NLS-1$ - typeOfDbPanel.setBorder(border); - - constraints.gridx = 0; - constraints.gridy = 1; - panel.add(typeOfDbPanel, constraints); - - List listOfProjectsByName = new ArrayList<>(); - listOfProjectsByName.addAll(projectsService.getProjectList().keySet()); - Collections.sort(listOfProjectsByName); - final JList listOfProjects = new JList<>(listOfProjectsByName.toArray(new String[0])); // data has type Object[] - listOfProjects.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - listOfProjects.setLayoutOrientation(JList.VERTICAL); - listOfProjects.setVisibleRowCount(-1); - - JScrollPane listScroller = new JScrollPane(listOfProjects); - listScroller.setPreferredSize(new Dimension(250, 300)); - - constraints.gridy = 0; - constraints.gridx = GridBagConstraints.RELATIVE; - typeOfDbPanel.add(listScroller, constraints); - - final JButton openProject = new JButton(Messages.getString("OptionWizard.56")); //$NON-NLS-1$ - openProject.setEnabled(false); - openProject.addActionListener(new ApplyOptionChangesListener(this, localPropertiesService) { - - @Override - protected void applyProperties() { - - File projectFolder = projectsService.getProjectList().get(listOfProjects.getSelectedValue()); - - try { - projectsService.loadProjectInFolder(projectFolder); - restartEarth(); - } catch (Exception e1) { - JOptionPane.showMessageDialog(PropertiesDialog.this, e1.getMessage(), - Messages.getString("OptionWizard.55"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - logger.error("Error importing project folder " + projectFolder.getAbsolutePath(), e1); //$NON-NLS-1$ - } - - } - - }); - - listOfProjects.addListSelectionListener(e -> openProject.setEnabled(listOfProjects.getSelectedValue() != null) ); - - typeOfDbPanel.add(openProject); - - return panel; - } - - private JScrollPane getOperationModePanelScroll() { - final JComponent operationModePanel = getOperationModePanel(); - return new JScrollPane(operationModePanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + GridBagConstraints c = new GridBagConstraints(); + + int row = 0; + c.fill = GridBagConstraints.BOTH; + + c.gridx = 0; + c.gridwidth = 2; + panel.add(new JLabel("" + + "This utility deletes plots that are already collected and present in the Collect Earth Database.
" + + "Make sure to backup the data in your DB before attempting to delete plots ( use the Tools->Data Import/Export->Export data to Collect Backup function)." + + "
" + + "The next field expects a CSV file for which the IDs of the plots to be deleted are present.The headers of the columns should be the names of the key attributes of the survey (usually just one, called ID, but it could be more)." + + ""), c); + c.gridy = row++; + + c.gridx = 0; + c.gridwidth = 2; + c.gridy = row++; + panel.add(getCsvFilePicker(), c); + c.gridy = row; + + panel.add(getDeleteButton(), c); + this.dlg.add(panel); } - private JComponent getPlotOptionsPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.fill = GridBagConstraints.HORIZONTAL; - - JLabel label = new JLabel("Plot shape"); - panel.add(label, constraints); - - constraints.gridx = 1; - JComboBox plotShape = (JComboBox) propertyToComponent.get(EarthProperty.SAMPLE_SHAPE)[0]; - panel.add(plotShape, constraints); - - constraints.gridx = 0; - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.35")); //$NON-NLS-1$ - panel.add(label, constraints); - - constraints.gridx = 1; - JComboBox numberPoints = (JComboBox) propertyToComponent - .get(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT)[0]; - panel.add(numberPoints, constraints); - - constraints.gridx = 0; - constraints.gridy++; - JLabel distanceOrRadiuslabel = new JLabel(Messages.getString("OptionWizard.36")); //$NON-NLS-1$ - panel.add(distanceOrRadiuslabel, constraints); - - constraints.gridx = 1; - JComboBox distanceBetweenPoints = (JComboBox) propertyToComponent - .get(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS)[0]; - panel.add(new JScrollPane(distanceBetweenPoints), constraints); - - constraints.gridx = 0; - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.37")); //$NON-NLS-1$ - panel.add(label, constraints); - constraints.gridx = 1; - JComboBox distanceToFrame = (JComboBox) propertyToComponent - .get(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES)[0]; - panel.add(new JScrollPane(distanceToFrame), constraints); - - constraints.gridx = 0; - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.95")); //$NON-NLS-1$ - panel.add(label, constraints); - constraints.gridx = 1; - JComboBox dotsSide = (JComboBox) propertyToComponent.get(EarthProperty.INNER_SUBPLOT_SIDE)[0]; - panel.add(new JScrollPane(dotsSide), constraints); - - constraints.gridx = 0; - constraints.gridy++; - label = new JLabel("Central plot side"); //$NON-NLS-1$ - panel.add(label, constraints); - constraints.gridx = 1; - JComboBox largeCentralPlotSide = (JComboBox) propertyToComponent.get(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)[0]; - panel.add(new JScrollPane(largeCentralPlotSide), constraints); - - - - constraints.gridx = 0; - constraints.gridy++; - label = new JLabel("Distance between plots in cluster"); - panel.add(label, constraints); - constraints.gridx = 1; - JComboBox plotDistanceInCluster = (JComboBox) propertyToComponent - .get(EarthProperty.DISTANCE_BETWEEN_PLOTS)[0]; - panel.add(new JScrollPane(plotDistanceInCluster), constraints); - - constraints.gridx = 0; - constraints.gridy++; - JLabel area = new JLabel( - "Area (hectares) : " + calculateArea(numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide)); - panel.add(area, constraints); - - ActionListener calculateAreas = actionPerformed -> area.setText("Area (hectares) : " + calculateArea(numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide)); - - plotShape.addActionListener( e-> - handleVisibilityPlotLayout(plotShape, numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide, - plotDistanceInCluster, area, distanceOrRadiuslabel, largeCentralPlotSide) - ); - - numberPoints.addActionListener(calculateAreas); - distanceBetweenPoints.addActionListener(calculateAreas); - distanceToFrame.addActionListener(calculateAreas); - - handleVisibilityPlotLayout(plotShape, numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide, - plotDistanceInCluster, area, distanceOrRadiuslabel, largeCentralPlotSide); - - return panel; - } - - public void handleVisibilityPlotLayout(JComboBox plotShape, JComboBox numberPoints, JComboBox distanceBetweenPoints, - JComboBox distanceToFrame, JComboBox dotsSide, JComboBox distanceBetweenPlots, JLabel area, - JLabel distanceOrRadiuslabel, JComboBox largeCentralPlotSide ) { - numberPoints.setEnabled(false); - distanceBetweenPoints.setEnabled(false); - distanceToFrame.setEnabled(false); - dotsSide.setEnabled(false); - area.setVisible(false); - distanceBetweenPlots.setVisible(false); - distanceBetweenPlots.setEnabled(false); - largeCentralPlotSide.setVisible( false ); - largeCentralPlotSide.setEnabled(false); - - if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE) || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE_WITH_LARGE_CENTRAL_PLOT) ) { - numberPoints.setEnabled(true); - distanceBetweenPoints.setEnabled(true); - distanceToFrame.setEnabled(true); - dotsSide.setEnabled(true); - area.setVisible(true); - distanceOrRadiuslabel.setText(Messages.getString("OptionWizard.36")); - - if( plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE_WITH_LARGE_CENTRAL_PLOT) ) { - largeCentralPlotSide.setVisible( true ); - largeCentralPlotSide.setEnabled(true); - } - - } else if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.CIRCLE) - || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.HEXAGON)) { - distanceBetweenPoints.setEnabled(true); - dotsSide.setEnabled(true); - numberPoints.setEnabled(true); - distanceOrRadiuslabel.setText("Radius"); - } else if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.NFI_THREE_CIRCLES) || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.NFI_FOUR_CIRCLES)) { - dotsSide.setEnabled(true); - distanceBetweenPoints.setEnabled(true); - distanceBetweenPlots.setVisible(true); - distanceBetweenPlots.setEnabled(true); - distanceOrRadiuslabel.setText("Radius of the plots"); + private JButton getDeleteButton() { + if (deleteFromDB == null) { + deleteFromDB = new JButton("Delete plots with IDs in the CSV from the database"); + deleteFromDB.setEnabled(false); + deleteFromDB.addActionListener( e -> { + if (JOptionPane.showConfirmDialog(RemovePlotsFromDBDlg.this.dlg, + "Are you sure you want to remove the plots with the IDs that are specified in the CSV file??", + "Confirm deletion of plots in DB", JOptionPane.YES_NO_OPTION, + JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) { + deletePlotsFromDB(); + } + }); } + return deleteFromDB; } - private String calculateArea(JComboBox numberOfPoints, JComboBox distanceBetweenPoints, JComboBox distanceToFrame, JComboBox dotsSide) { - double side = 0; - try { - int numberOfPointsI = ((ComboBoxItem) numberOfPoints.getSelectedItem()).getNumberOfPoints(); - int distanceBetweenPointsI = Integer.parseInt((String) distanceBetweenPoints.getSelectedItem()); - int distanceToFrameI = Integer.parseInt((String) distanceToFrame.getSelectedItem()); + private boolean validateCsv(String filePath) { + boolean validFile = true; - if (numberOfPointsI == 0 || numberOfPointsI == 1) { + try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(filePath, false) ){ - side = 2d * distanceToFrameI; - if (oldSelectedDistance == null) { - oldSelectedDistance = (String) distanceBetweenPoints.getSelectedItem(); - distanceBetweenPoints.setEnabled(false); - } - distanceBetweenPoints.setSelectedItem("0"); + filePicker.setTextBackground(Color.white); - if (numberOfPointsI == 0) { - dotsSide.setEnabled(false); - } else if (numberOfPointsI == 1) { - dotsSide.setEnabled(true); - } + if (CsvReaderUtils.isCsvFile(filePath)) { - } else { - if (oldSelectedDistance != null) { - distanceBetweenPoints.setSelectedItem(oldSelectedDistance); - oldSelectedDistance = null; + // Get the first line + String[] csvHeaders = csvReader.readNext(); + String[] expectedHeaders = getKeyAttributesName(); + if (!Arrays.equals(expectedHeaders, csvHeaders)) { + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, + String.format("The Headers of the CSV file used should be %s, instead they are %s", + Arrays.toString(expectedHeaders), + StringUtils.abbreviate(Arrays.toString(csvHeaders), 35))); + filePicker.setTextBackground(Color.red); + validFile = false; } - distanceBetweenPoints.setEnabled(true); - distanceToFrame.setEnabled(true); - dotsSide.setEnabled(true); - - double pointsByLines = Math.sqrt(numberOfPointsI); - side = 2d * distanceToFrameI + (pointsByLines - 1) * distanceBetweenPointsI; + } else { + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, + String.format("The file in %s is NOT A CSV file ", filePath)); + validFile = false; + filePicker.setTextBackground(Color.red); } - - } catch (RuntimeException e) { - logger.error("Error calculating area of the plot", e); + } catch (Exception e) { + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, + String.format("Error opening file at %s. %s ", filePath, e.getMessage())); + logger.error("Error while validating the CSV file", e); + validFile = false; } - DecimalFormat df = new DecimalFormat("###.##"); - return df.format(side * side / 10000d); - } - - private JPanel getPostgreSqlPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), - Messages.getString("OptionWizard.6")); //$NON-NLS-1$ - panel.setBorder(border); - - JLabel label = new JLabel(Messages.getString("OptionWizard.7")); //$NON-NLS-1$ - constraints.gridx = 0; - panel.add(label, constraints); - - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.DB_USERNAME)[0], constraints); - - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.8")); //$NON-NLS-1$ - constraints.gridx = 0; - panel.add(label, constraints); - - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.DB_PASSWORD)[0], constraints); - - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.9")); //$NON-NLS-1$ - constraints.gridx = 0; - panel.add(label, constraints); - - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.DB_NAME)[0], constraints); - - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.26")); //$NON-NLS-1$ - constraints.gridx = 0; - panel.add(label, constraints); - - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.DB_HOST)[0], constraints); - - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.29")); //$NON-NLS-1$ - constraints.gridx = 0; - panel.add(label, constraints); - - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.DB_PORT)[0], constraints); - - constraints.gridx = 2; - panel.add(new JLabel("Default: 5432"), constraints); - - constraints.gridy++; - constraints.gridx = 1; - JButton button = new JButton("Test Connection"); //$NON-NLS-1$ - button.addActionListener( e-> { - String host = ((JTextField) (propertyToComponent.get(EarthProperty.DB_HOST)[0])).getText(); - String port = ((JTextField) (propertyToComponent.get(EarthProperty.DB_PORT)[0])).getText(); - String dbName = ((JTextField) (propertyToComponent.get(EarthProperty.DB_NAME)[0])).getText(); - String username = ((JTextField) (propertyToComponent.get(EarthProperty.DB_USERNAME)[0])).getText(); - String password = ((JTextField) (propertyToComponent.get(EarthProperty.DB_PASSWORD)[0])).getText(); - - String message = CollectEarthUtils.testPostgreSQLConnection(host, port, dbName, username, password); - JOptionPane.showMessageDialog(PropertiesDialog.this.getOwner(), message, "PostgreSQL Connection test", - JOptionPane.INFORMATION_MESSAGE); - }); - panel.add(button, constraints); - - return panel; + getDeleteButton().setEnabled(validFile); + return validFile; } - private JPanel getSqlLitePanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), - Messages.getString("OptionWizard.30")); //$NON-NLS-1$ - panel.setBorder(border); - - panel.add(propertyToComponent.get(EarthProperty.AUTOMATIC_BACKUP)[0], constraints); - constraints.gridx++; - panel.add(getOpenBackupFolderButton()); - return panel; - } - - private JComponent getSampleDataPanel() { - final JPlotCsvTable samplePlots = new JPlotCsvTable(localPropertiesService.getValue(EarthProperty.SAMPLE_FILE), - surveyLoaded); - - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.fill = GridBagConstraints.BOTH; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; + private void deletePlotsFromDB() { + InfiniteProgressMonitor progressDeletion = new InfiniteProgressMonitor(this.dlg, "Deleting plots", + "Wait while the plots are deleted from the database"); - final JFilePicker refreshTableOnFileChange = getFilePickerSamplePlots(samplePlots); - - panel.add(refreshTableOnFileChange, constraints); - - samplePlots.setFillsViewportHeight(true); - constraints.gridy = 1; - - constraints.weightx = 1.0; - constraints.weighty = 1.0; - constraints.gridwidth = GridBagConstraints.REMAINDER; - constraints.gridheight = GridBagConstraints.REMAINDER; - - samplePlots.setPreferredScrollableViewportSize(samplePlots.getPreferredSize()); - - panel.add(new JScrollPane(samplePlots, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, - ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), constraints); - - return panel; - } - - private JFilePicker getFilePickerSamplePlots(final JPlotCsvTable samplePlots) { - final JFilePicker refreshTableOnFileChange = (JFilePicker) (propertyToComponent - .get(EarthProperty.SAMPLE_FILE)[0]); - refreshTableOnFileChange.addChangeListener(new DocumentListener() { + Thread treadDeleting = new Thread("Deleting plots from Database") { + int plotsDeleted = 0; + int plotsNotFoundInDB = 0; + int plotsCouldNotBeDeleted = 0; + boolean success = true; + ArrayList messages = new ArrayList<>(); @Override - public void changedUpdate(DocumentEvent e) { - // Do not react - } - - @Override - public void insertUpdate(DocumentEvent e) { - refreshTable(); - } - - @Override - public void removeUpdate(DocumentEvent e) { - // Do not react - } - - private void refreshTable() { - samplePlots.refreshTable(refreshTableOnFileChange.getSelectedFilePath()); - - // Do not let the user save the changes if the sample data is wrong!!! - getApplyChangesButton().setEnabled(samplePlots.isDataValid()); - } - }); - return refreshTableOnFileChange; - } - - private JPanel getServerPanel() { + public void run() { + try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(getCsvFilePicker().getSelectedFilePath(), false) ){ + List allLines = csvReader.readAll(); + int totalLines = allLines.size() - 1; + boolean skipFirst = true; + int plot = 0; + progressDeletion.showLater(); + for (String[] csvRow : allLines) { + + if (skipFirst) { + skipFirst = false; + continue; + } - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; + progressDeletion.updateProgress(++plot, totalLines); - final JPanel typeOfDbPanel = new JPanel(new GridBagLayout()); - final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), - Messages.getString("OptionWizard.3")); //$NON-NLS-1$ - typeOfDbPanel.setBorder(border); + CollectRecord record = earthSurveyService.loadRecord(csvRow); + if (record == null) { + plotsNotFoundInDB++; + messages.add(String.format(" Could not find plot with ID %s in the Database", + Arrays.toString(csvRow))); + } else { + deleteRecord(csvRow, record); + } + } - JLabel label = new JLabel(Messages.getString("OptionWizard.4") + CollectEarthUtils.getComputerIp()); //$NON-NLS-1$ - typeOfDbPanel.add(label, constraints); - constraints.gridy++; + } catch (Exception e) { + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, + "Error reading CSV file or CSV File too big!"); + logger.error("Error while validating the CSV file", e); + success = false; + } finally { - label = new JLabel(Messages.getString("OptionWizard.5")); //$NON-NLS-1$ - constraints.gridx = 0; - typeOfDbPanel.add(label, constraints); + if (progressDeletion != null) { + progressDeletion.close(); + } - constraints.gridx = 1; - typeOfDbPanel.add(propertyToComponent.get(EarthProperty.HOST_PORT_KEY)[0], constraints); + } - constraints.gridwidth = GridBagConstraints.REMAINDER; - constraints.gridy++; - constraints.gridx = 0; + DeleteResults deleteResults = new DeleteResults(success, plotsDeleted, plotsNotFoundInDB, + plotsCouldNotBeDeleted, messages); + String result = "Plots Deleted : " + deleteResults.plotsDeleted + "
" + + "Plots Not Found :
" + deleteResults.plotsNotFoundInDB + "
" + + "Plots that could not be deleted because a exception : " + deleteResults.plotsErrorWhenDeleting + "
" + + " Messages :
" + StringUtils.join(deleteResults.messages, "
"); + if( success ) { + result = "" + + "Results of the deletion process:
" + + result + ""; + }else { + result = "" + + "There was an error while deleting the plots. Review the Collect Earth Log file in the Help menu.
" + + result + ""; + } - final ButtonGroup bg = new ButtonGroup(); - final JComponent[] dbTypes = propertyToComponent.get(EarthProperty.DB_DRIVER); - postgresPanel = getPostgreSqlPanel(); - sqlitePanel = getSqlLitePanel(); + JEditorPane web = new JEditorPane(); + web.setEditable(false); + web.setContentType("text/html"); + web.setText(result); - boolean usingPostgreSQL = localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.POSTGRESQL); - enableDBOptions(usingPostgreSQL); - for (final JComponent typeRadioButton : dbTypes) { - final JRadioButton dbTypeButton = (JRadioButton) typeRadioButton; - bg.add(dbTypeButton); - typeOfDbPanel.add(dbTypeButton, constraints); - constraints.gridy++; + JScrollPane scrollPane = new JScrollPane(web); + scrollPane.setPreferredSize( new Dimension( 450, 350 )); - dbTypeButton.addActionListener(getDbTypeListener()); - dbTypeButton.addActionListener(e -> setRestartRequired(true)); + // Refresh contents of Google Earth! + EarthApp.executeKmlLoadAsynchronously( null ); - if (dbTypeButton.getName().equals(EarthConstants.CollectDBDriver.POSTGRESQL.name())) { - typeOfDbPanel.add(postgresPanel, constraints); - constraints.gridy++; + SwingUtilities.invokeLater( () -> { + if (deleteResults.success) { + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, scrollPane, "Success deleting plots", JOptionPane.INFORMATION_MESSAGE); + } else { - } else { - typeOfDbPanel.add(sqlitePanel, constraints); - constraints.gridy++; + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, scrollPane, "Error deleting plots", JOptionPane.WARNING_MESSAGE); + } + }); } - } - return typeOfDbPanel; - } - - private Component getOpenBackupFolderButton() { - AbstractAction backupAction = new AbstractAction(Messages.getString("OptionWizard.10")) { //$NON-NLS-1$ - - private static final long serialVersionUID = 1L; - - @Override - public void actionPerformed(ActionEvent e) { + private void deleteRecord(String[] csvRow, CollectRecord record) { try { - - CollectEarthUtils.openFolderInExplorer(backupFolder); - - } catch (final IOException e1) { - logger.error("Error when opening the explorer window to visualize backups", e1); //$NON-NLS-1$ + recordManager.delete(record.getId()); + messages.add(String.format("Deleted plot with ID %s ", Arrays.toString(csvRow))); + plotsDeleted++; + } catch (RecordPersistenceException e) { + plotsCouldNotBeDeleted++; + messages.add(String.format("Error when deleting plot with ID %s. Error Message: %s", + Arrays.toString(csvRow), e.getMessage())); + logger.error("Error deleting plot with ID " + Arrays.toString(csvRow)); + success = false; } } - }; - return new JButton(backupAction); + treadDeleting.start(); } - private JComponent getSurveyDefinitonPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.fill = GridBagConstraints.HORIZONTAL; - constraints.gridwidth = 2; - panel.add(propertyToComponent.get(EarthProperty.OPEN_BALLOON_IN_BROWSER)[0], constraints); - - constraints.gridy++; - constraints.gridwidth = 1; - final JLabel label = new JLabel(Messages.getString("OptionWizard.43")); //$NON-NLS-1$ - panel.add(label, constraints); - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.SURVEY_NAME)[0], constraints); - - constraints.gridy++; - constraints.gridwidth = GridBagConstraints.REMAINDER; - constraints.gridx = 0; - panel.add(propertyToComponent.get(EarthProperty.KML_TEMPLATE_KEY)[0], constraints); - - constraints.gridy++; - constraints.gridx = 0; - panel.add(propertyToComponent.get(EarthProperty.BALLOON_TEMPLATE_KEY)[0], constraints); - - constraints.gridy++; - constraints.gridx = 0; - - panel.add(propertyToComponent.get(EarthProperty.METADATA_FILE)[0], constraints); - - return panel; - } - - private void initilizeInputs() { - - final JCheckBox backupCheckbox = new JCheckBox(Messages.getString("OptionWizard.44")); //$NON-NLS-1$ - backupCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.AUTOMATIC_BACKUP))); - propertyToComponent.put(EarthProperty.AUTOMATIC_BACKUP, new JComponent[] { backupCheckbox }); - - final JCheckBox openEarthEngineCheckbox = new JCheckBox(Messages.getString("OptionWizard.45")); //$NON-NLS-1$ - openEarthEngineCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_EXPLORER))); - propertyToComponent.put(EarthProperty.OPEN_GEE_EXPLORER, new JComponent[] { openEarthEngineCheckbox }); - - final JCheckBox openGEEAppCheckbox = new JCheckBox("Google Earth Engine APP (no sign-in)"); //$NON-NLS-1$ - openGEEAppCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_APP))); - propertyToComponent.put(EarthProperty.OPEN_GEE_APP, new JComponent[] { openGEEAppCheckbox }); - - final JCheckBox openTimelapseCheckbox = new JCheckBox(Messages.getString("OptionWizard.46")); //$NON-NLS-1$ - openTimelapseCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_TIMELAPSE))); - propertyToComponent.put(EarthProperty.OPEN_TIMELAPSE, new JComponent[] { openTimelapseCheckbox }); - - final JCheckBox openEarthMapCheckbox = new JCheckBox(Messages.getString("OptionWizard.105")); //$NON-NLS-1$ - openEarthMapCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_EARTH_MAP))); - propertyToComponent.put(EarthProperty.OPEN_EARTH_MAP, new JComponent[] { openEarthMapCheckbox }); - - final JCheckBox openBingCheckbox = new JCheckBox(Messages.getString("OptionWizard.47")); //$NON-NLS-1$ - openBingCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BING_MAPS))); - propertyToComponent.put(EarthProperty.OPEN_BING_MAPS, new JComponent[] { openBingCheckbox }); - - final JCheckBox openPlanetCheckbox = new JCheckBox(Messages.getString("OptionWizard.100")); //$NON-NLS-1$ - openPlanetCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_PLANET_MAPS))); - propertyToComponent.put(EarthProperty.OPEN_PLANET_MAPS, new JComponent[] { openPlanetCheckbox }); - - final JCheckBox openMonthlyNICFICheckbox = new JCheckBox(Messages.getString("OptionWizard.110")); //$NON-NLS-1$ - openMonthlyNICFICheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.PLANET_MAPS_MONHLY))); - propertyToComponent.put(EarthProperty.PLANET_MAPS_MONHLY, new JComponent[] { openMonthlyNICFICheckbox }); - - - final JPasswordField planetAPIKeyTextField = new JPasswordField( - localPropertiesService.getValue(EarthProperty.PLANET_MAPS_KEY)); - planetAPIKeyTextField.setMinimumSize(new Dimension( 250, 20 )); - planetAPIKeyTextField.setEnabled( localPropertiesService.isPlanetMapsSupported() ); - propertyToComponent.put(EarthProperty.PLANET_MAPS_KEY, new JComponent[] { planetAPIKeyTextField }); - - openMonthlyNICFICheckbox.setEnabled( openPlanetCheckbox.isSelected() ); - planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ); - - openPlanetCheckbox.addActionListener( e-> { - planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ); - openMonthlyNICFICheckbox.setEnabled( openPlanetCheckbox.isSelected() ); - }); - openMonthlyNICFICheckbox.addActionListener( e-> planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ) ); - - - final JCheckBox openSecureWatchCheckbox = new JCheckBox(Messages.getString("OptionWizard.102")); //$NON-NLS-1$ - openSecureWatchCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_MAXAR_SECUREWATCH))); - propertyToComponent.put(EarthProperty.OPEN_MAXAR_SECUREWATCH, new JComponent[] { openSecureWatchCheckbox }); - - final JTextField secureWatchUrlTextField = new JTextField( - localPropertiesService.getValue(EarthProperty.MAXAR_SECUREWATCH_URL)); - secureWatchUrlTextField.setMinimumSize(new Dimension( 250, 20 )); - propertyToComponent.put(EarthProperty.MAXAR_SECUREWATCH_URL, new JComponent[] { secureWatchUrlTextField }); - secureWatchUrlTextField.setEnabled( localPropertiesService.isSecureWatchSupported() ); - propertyToComponent.put(EarthProperty.MAXAR_SECUREWATCH_URL, new JComponent[] { secureWatchUrlTextField }); - openSecureWatchCheckbox.addActionListener( e -> secureWatchUrlTextField.setEnabled( openSecureWatchCheckbox.isSelected() ) ); - - final JTextField extraUrlTextField = new JTextField( - localPropertiesService.getValue(EarthProperty.EXTRA_MAP_URL)); - extraUrlTextField.setMinimumSize(new Dimension( 250, 20 )); - propertyToComponent.put(EarthProperty.EXTRA_MAP_URL, new JComponent[] { extraUrlTextField }); - - final JCheckBox openBaiduCheckbox = new JCheckBox("Open Baidu Maps"); - openBaiduCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BAIDU_MAPS))); - propertyToComponent.put(EarthProperty.OPEN_BAIDU_MAPS, new JComponent[] { openBaiduCheckbox }); - - final JCheckBox openYandexCheckbox = new JCheckBox("Open Yandex maps for the plot area"); - openYandexCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_YANDEX_MAPS))); - propertyToComponent.put(EarthProperty.OPEN_YANDEX_MAPS, new JComponent[] { openYandexCheckbox }); - - final JCheckBox openHereCheckbox = new JCheckBox(Messages.getString("OptionWizard.59")); //$NON-NLS-1$ - openHereCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_HERE_MAPS))); - propertyToComponent.put(EarthProperty.OPEN_HERE_MAPS, new JComponent[] { openHereCheckbox }); - - final JCheckBox openGeePlaygroundCheckbox = new JCheckBox(Messages.getString("OptionWizard.58")); //$NON-NLS-1$ - openGeePlaygroundCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_CODE_EDITOR))); - propertyToComponent.put(EarthProperty.OPEN_GEE_CODE_EDITOR, new JComponent[] { openGeePlaygroundCheckbox }); - - final JCheckBox openInSeparateWindowCheckbox = new JCheckBox(Messages.getString("OptionWizard.48")); //$NON-NLS-1$ - openInSeparateWindowCheckbox.setSelected( - Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BALLOON_IN_BROWSER))); - propertyToComponent.put(EarthProperty.OPEN_BALLOON_IN_BROWSER, - new JComponent[] { openInSeparateWindowCheckbox }); - - final JFilePicker csvWithPlotData = new JFilePicker(Messages.getString("OptionWizard.49"), //$NON-NLS-1$ - localPropertiesService.getValue(EarthProperty.SAMPLE_FILE), Messages.getString("OptionWizard.50"), DlgMode.MODE_OPEN); // $NON-NLS-1$ - - csvWithPlotData.addFileTypeFilter(".csv,.ced", Messages.getString("OptionWizard.52"), true); //$NON-NLS-1$ //$NON-NLS-2$ - propertyToComponent.put(EarthProperty.SAMPLE_FILE, new JComponent[] { csvWithPlotData }); - - final JComboBox plotShape = new JComboBox<>(SAMPLE_SHAPE.values()); - try { - plotShape.setSelectedItem(SAMPLE_SHAPE.valueOf(localPropertiesService.getValue(EarthProperty.SAMPLE_SHAPE))); - } catch (Exception e1) { - logger.error("The selected shape type is not supported " + localPropertiesService.getValue(EarthProperty.SAMPLE_SHAPE), e1 ); + private String[] getKeyAttributesName() { + List keyAttributeDefinitions = survey.getSchema().getRootEntityDefinitions().get(0) + .getKeyAttributeDefinitions(); + String[] keyAttributeNames = new String[keyAttributeDefinitions.size()]; + int i = 0; + for (AttributeDefinition keyAttributeDefinition : keyAttributeDefinitions) { + keyAttributeNames[i++] = keyAttributeDefinition.getName(); } - propertyToComponent.put(EarthProperty.SAMPLE_SHAPE, new JComponent[] { plotShape }); - - final JComboBox comboNumberOfPoints = new JComboBox<>( - new ComboBoxItem[] { COMBO_BOX_ITEM_SQUARE, COMBO_BOX_ITEM_CENTRAL_POINT, new ComboBoxItem(4, "2x2"), //$NON-NLS-1$ //$NON-NLS-2$ - // //$NON-NLS-3$ - new ComboBoxItem(9, "3x3"), new ComboBoxItem(16, "4x4"), new ComboBoxItem(25, "5x5"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - new ComboBoxItem(36, "6x6"), //$NON-NLS-1$ - new ComboBoxItem(49, "7x7") }); //$NON-NLS-1$ - if( StringUtils.isNotBlank( localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT) ) ){ - try { - comboNumberOfPoints.setSelectedItem(new ComboBoxItem( - Integer.parseInt(localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT)), - "")); //$NON-NLS-1$ - } catch (NumberFormatException e1) { - logger.error("This should be a number {}", localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT), e1); - } - } - propertyToComponent.put(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT, - new JComponent[] { comboNumberOfPoints }); - - final String[] listOfNumbers = new String[1500]; - final String[] listOfNumbersFromTwo = new String[1500]; - - for (int index = 0; index < listOfNumbers.length; index++) { - listOfNumbers[index] = Integer.toString( index ); //$NON-NLS-1$ - listOfNumbersFromTwo[index] = Integer.toString( index + 2 ); //$NON-NLS-1$ - } - - final JComboBox listOfDistanceBetweenPoints = new JComboBox<>(listOfNumbersFromTwo); - listOfDistanceBetweenPoints - .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS)); - listOfDistanceBetweenPoints.setAutoscrolls(true); - - propertyToComponent.put(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS, - new JComponent[] { listOfDistanceBetweenPoints }); - - final JComboBox listOfDistanceBetweenPlots = new JComboBox<>(listOfNumbersFromTwo); - listOfDistanceBetweenPlots - .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS)); - listOfDistanceBetweenPlots.setAutoscrolls(true); - - propertyToComponent.put(EarthProperty.DISTANCE_BETWEEN_PLOTS, new JComponent[] { listOfDistanceBetweenPlots }); - - final JComboBox listOfDistanceToBorder = new JComboBox<>(listOfNumbers); - listOfDistanceToBorder - .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES)); - listOfDistanceToBorder.setAutoscrolls(true); - - propertyToComponent.put(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES, new JComponent[] { listOfDistanceToBorder }); - - final JComboBox listOfSizeofSamplingDot = new JComboBox<>(listOfNumbersFromTwo); - listOfSizeofSamplingDot.setSelectedItem(localPropertiesService.getValue(EarthProperty.INNER_SUBPLOT_SIDE)); - listOfSizeofSamplingDot.setAutoscrolls(true); - - propertyToComponent.put(EarthProperty.INNER_SUBPLOT_SIDE, new JComponent[] { listOfSizeofSamplingDot }); - - final JComboBox listOfSideOflargeCentralPlot = new JComboBox<>(listOfNumbersFromTwo); - listOfSideOflargeCentralPlot.setSelectedItem(localPropertiesService.getValue(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)); - listOfSideOflargeCentralPlot.setAutoscrolls(true); - - propertyToComponent.put(EarthProperty.LARGE_CENTRAL_PLOT_SIDE, new JComponent[] { listOfSideOflargeCentralPlot }); - - - final JRadioButton chromeChooser = new JRadioButton("Chrome"); //$NON-NLS-1$ - chromeChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() - .equals(EarthConstants.CHROME_BROWSER)); - chromeChooser.setName(EarthConstants.CHROME_BROWSER); + return keyAttributeNames; + } - final JRadioButton firefoxChooser = new JRadioButton("Firefox"); //$NON-NLS-1$ - firefoxChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() - .equals(EarthConstants.FIREFOX_BROWSER)); - firefoxChooser.setName(EarthConstants.FIREFOX_BROWSER); + private JFilePicker getCsvFilePicker() { + if (filePicker == null) { + filePicker = new JFilePicker("Choose the CSV file containing the IDs of the plots to remove", null, + "Explore", DlgMode.MODE_OPEN); - final JRadioButton edgeChooser = new JRadioButton("Edge"); //$NON-NLS-1$ - edgeChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() - .equals(EarthConstants.EDGE_BROWSER)); - edgeChooser.setName(EarthConstants.EDGE_BROWSER); + filePicker.getFileChooser().setAcceptAllFileFilterUsed(false); + filePicker.addFileTypeFilter("csv", " CSV file with plot IDs", true); - propertyToComponent.put(EarthProperty.BROWSER_TO_USE, new JComponent[] { firefoxChooser, chromeChooser, edgeChooser}); - final JFilePicker saikuPath = new JFilePicker(Messages.getString("OptionWizard.65"), //$NON-NLS-1$ - localPropertiesService.getValue(EarthProperty.SAIKU_SERVER_FOLDER), - Messages.getString("OptionWizard.66"), DlgMode.MODE_OPEN); //$NON-NLS-1$ - saikuPath.setFolderChooser(); - saikuPath.addChangeListener(new DocumentListener() { + filePicker.addChangeListener(new DocumentListener() { - private void showSaikuWarning() { - final File saikuFolder = new File(saikuPath.getSelectedFilePath()); - if ( !saikuService.isSaikuFolder(saikuFolder)) { - JOptionPane.showMessageDialog(PropertiesDialog.this, Messages.getString("OptionWizard.27"), //$NON-NLS-1$ - Messages.getString("OptionWizard.28"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ - saikuPath.getTextField().setBackground(CollectEarthWindow.ERROR_COLOR); - } else { - saikuPath.getTextField().setBackground(Color.white); + @Override + public void removeUpdate(DocumentEvent e) { + // Do not react } - } - - @Override - public void removeUpdate(DocumentEvent e) { - // Do not react - } - - @Override - public void insertUpdate(DocumentEvent e) { - showSaikuWarning(); - } - - @Override - public void changedUpdate(DocumentEvent e) { - // Do not react - } - }); - propertyToComponent.put(EarthProperty.SAIKU_SERVER_FOLDER, new JComponent[] { saikuPath }); - - final JFilePicker kmlTemplatePath = new JFilePicker(Messages.getString("OptionWizard.79"), //$NON-NLS-1$ - localPropertiesService.getValue(EarthProperty.KML_TEMPLATE_KEY), Messages.getString("OptionWizard.80"), //$NON-NLS-1$ - DlgMode.MODE_OPEN); - kmlTemplatePath.addFileTypeFilter(".fmt", Messages.getString("OptionWizard.82"), true); //$NON-NLS-1$ //$NON-NLS-2$ - propertyToComponent.put(EarthProperty.KML_TEMPLATE_KEY, new JComponent[] { kmlTemplatePath }); - - final JFilePicker htmlBalloonPath = new JFilePicker(Messages.getString("OptionWizard.83"), //$NON-NLS-1$ - localPropertiesService.getValue(EarthProperty.BALLOON_TEMPLATE_KEY), - Messages.getString("OptionWizard.84"), DlgMode.MODE_OPEN); //$NON-NLS-1$ - htmlBalloonPath.addFileTypeFilter(".html,.htm", Messages.getString("OptionWizard.86"), true); //$NON-NLS-1$ //$NON-NLS-2$ - propertyToComponent.put(EarthProperty.BALLOON_TEMPLATE_KEY, new JComponent[] { htmlBalloonPath }); - - final JFilePicker idmPath = new JFilePicker(Messages.getString("OptionWizard.87"), //$NON-NLS-1$ - localPropertiesService.getImdFile(), Messages.getString("OptionWizard.88"), DlgMode.MODE_OPEN); //$NON-NLS-1$ - idmPath.addFileTypeFilter(".xml", Messages.getString("OptionWizard.90"), true); //$NON-NLS-1$ //$NON-NLS-2$ - propertyToComponent.put(EarthProperty.METADATA_FILE, new JComponent[] { idmPath }); - - final JTextField surveyNameTextField = new JTextField( - localPropertiesService.getValue(EarthProperty.SURVEY_NAME)); - surveyNameTextField.setEnabled(false); - propertyToComponent.put(EarthProperty.SURVEY_NAME, new JComponent[] { surveyNameTextField }); - - // Database options - final JRadioButton instanceTypeServer = new JRadioButton(Messages.getString("OptionWizard.91")); //$NON-NLS-1$ - instanceTypeServer.setSelected(localPropertiesService.getOperationMode().equals(OperationMode.SERVER_MODE)); - instanceTypeServer.setName(EarthConstants.OperationMode.SERVER_MODE.name()); - - final JRadioButton instanceTypeClient = new JRadioButton(Messages.getString("OptionWizard.92")); //$NON-NLS-1$ - instanceTypeClient.setSelected(localPropertiesService.getOperationMode().equals(OperationMode.CLIENT_MODE)); - instanceTypeClient.setName(EarthConstants.OperationMode.CLIENT_MODE.name()); - propertyToComponent.put(EarthProperty.OPERATION_MODE, - new JComponent[] { instanceTypeServer, instanceTypeClient }); - - final JTextField collectEarthServerIp = new JTextField(localPropertiesService.getValue(EarthProperty.HOST_KEY)); - propertyToComponent.put(EarthProperty.HOST_KEY, new JComponent[] { collectEarthServerIp }); - - final JTextField collectEarthServerIpPort = new JTextField(localPropertiesService.getPort()); - final JTextField collectEarthServerLocalPort = new JTextField( - localPropertiesService.getValue(EarthProperty.HOST_PORT_KEY)); - propertyToComponent.put(EarthProperty.HOST_PORT_KEY, - new JComponent[] { collectEarthServerIpPort, collectEarthServerLocalPort }); - - final JRadioButton sqliteDbType = new JRadioButton(Messages.getString("OptionWizard.93")); //$NON-NLS-1$ - sqliteDbType.setSelected(localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.SQLITE)); - sqliteDbType.setName(CollectDBDriver.SQLITE.name()); - - final JRadioButton postgresDbType = new JRadioButton(Messages.getString("OptionWizard.94")); //$NON-NLS-1$ - boolean usingPostgreSQL = localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.POSTGRESQL); - postgresDbType.setSelected(usingPostgreSQL); - postgresDbType.setName(CollectDBDriver.POSTGRESQL.name()); - propertyToComponent.put(EarthProperty.DB_DRIVER, new JComponent[] { sqliteDbType, postgresDbType }); - - final JTextField dbUserName = new JTextField(localPropertiesService.getValue(EarthProperty.DB_USERNAME)); - propertyToComponent.put(EarthProperty.DB_USERNAME, new JComponent[] { dbUserName }); - - final JTextField dbPassword = new JTextField(localPropertiesService.getValue(EarthProperty.DB_PASSWORD)); - propertyToComponent.put(EarthProperty.DB_PASSWORD, new JComponent[] { dbPassword }); - - final JTextField dbName = new JTextField(localPropertiesService.getValue(EarthProperty.DB_NAME)); - propertyToComponent.put(EarthProperty.DB_NAME, new JComponent[] { dbName }); - - final JTextField dbHost = new JTextField(localPropertiesService.getValue(EarthProperty.DB_HOST)); - propertyToComponent.put(EarthProperty.DB_HOST, new JComponent[] { dbHost }); - - final JTextField dbPort = new JTextField(localPropertiesService.getValue(EarthProperty.DB_PORT)); - propertyToComponent.put(EarthProperty.DB_PORT, new JComponent[] { dbPort }); - - } - - public boolean isRestartRequired() { - return restartRequired; - } + @Override + public void insertUpdate(DocumentEvent e) { + validateCsv(filePicker.getTextField().getText()); + } - public void setRestartRequired(boolean restartRequired) { - this.restartRequired = restartRequired; + @Override + public void changedUpdate(DocumentEvent e) { + validateCsv(filePicker.getTextField().getText()); + } + }); + } + return filePicker; } } From c4173aec1ee97ca6bf43cb7e24def61f0613709b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:15 +0100 Subject: [PATCH 1296/1620] New translations RemovePlotsFromDBDlg.java (English) --- .../earth/app/view/Messages_en.properties | 1345 +++-------------- 1 file changed, 231 insertions(+), 1114 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 7eb0424502..eb9b80be90 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,1209 +1,326 @@ package org.openforis.collect.earth.app.view; -import java.awt.BorderLayout; import java.awt.Color; -import java.awt.Component; -import java.awt.Container; import java.awt.Dimension; +import java.awt.Frame; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; -import java.awt.GridLayout; -import java.awt.Insets; -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; -import java.io.IOException; -import java.text.DecimalFormat; import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; +import java.util.Arrays; import java.util.List; -import javax.swing.AbstractAction; -import javax.swing.AbstractButton; -import javax.swing.ButtonGroup; import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JComponent; import javax.swing.JDialog; -import javax.swing.JFrame; +import javax.swing.JEditorPane; import javax.swing.JLabel; -import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; -import javax.swing.JPasswordField; -import javax.swing.JRadioButton; import javax.swing.JScrollPane; -import javax.swing.JTabbedPane; -import javax.swing.JTextField; -import javax.swing.ListSelectionModel; -import javax.swing.ScrollPaneConstants; -import javax.swing.border.BevelBorder; -import javax.swing.border.Border; -import javax.swing.border.TitledBorder; +import javax.swing.SwingUtilities; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.EarthConstants.CollectDBDriver; -import org.openforis.collect.earth.app.EarthConstants.OperationMode; -import org.openforis.collect.earth.app.EarthConstants.SAMPLE_SHAPE; import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.AnalysisSaikuService; -import org.openforis.collect.earth.app.service.EarthProjectsService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.service.LocalPropertiesService.EarthProperty; +import org.openforis.collect.earth.app.service.EarthSurveyService; import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; +import org.openforis.collect.earth.core.utils.CsvReaderUtils; +import org.openforis.collect.manager.RecordManager; +import org.openforis.collect.model.CollectRecord; import org.openforis.collect.model.CollectSurvey; +import org.openforis.collect.persistence.RecordPersistenceException; +import org.openforis.idm.metamodel.AttributeDefinition; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; -/** - * @author Alfonso Sanchez-Paus Diaz - * - */ -public class PropertiesDialog extends JDialog { +import com.opencsv.CSVReader; - private static final ComboBoxItem COMBO_BOX_ITEM_CENTRAL_POINT = new ComboBoxItem(1, - Messages.getString("OptionWizard.54")); +@Component +@Lazy +public class RemovePlotsFromDBDlg { - private static final ComboBoxItem COMBO_BOX_ITEM_SQUARE = new ComboBoxItem(0, - Messages.getString("OptionWizard.53")); + @Autowired + private RecordManager recordManager; - private static final long serialVersionUID = -6760020609229102842L; + @Autowired + private EarthSurveyService earthSurveyService; - private final HashMap, JComponent[]> propertyToComponent = new HashMap<>(); - private final transient Logger logger = LoggerFactory.getLogger(this.getClass()); + @SuppressWarnings("unused") + private static final long serialVersionUID = 5175096170385736616L; + private CollectSurvey survey; + private Logger logger = LoggerFactory.getLogger(RemovePlotsFromDBDlg.class); - JPanel postgresPanel; - JPanel sqlitePanel; + private JButton deleteFromDB; + private JFilePicker filePicker; - private transient LocalPropertiesService localPropertiesService; + private JDialog dlg; - String backupFolder; - - private transient AnalysisSaikuService saikuService; - - private transient EarthProjectsService projectsService; - - private boolean restartRequired; - - private String oldSelectedDistance; - - private CollectSurvey surveyLoaded; - - private JButton applyChanges; - - public PropertiesDialog(JFrame frame, LocalPropertiesService localPropertiesService, - EarthProjectsService projectsService, String backupFolder, AnalysisSaikuService saikuService, - CollectSurvey surveyLoaded) { - super(frame, Messages.getString("OptionWizard.0")); //$NON-NLS-1$ - this.localPropertiesService = localPropertiesService; - this.projectsService = projectsService; - this.backupFolder = backupFolder; - this.saikuService = saikuService; - this.surveyLoaded = surveyLoaded; - this.setLocationRelativeTo(null); - this.setSize(new Dimension(600, 620)); - this.setModal(true); - this.setResizable(false); - initilizeInputs(); - buildMainPane(); - centreWindow(); - - } - - private void centreWindow() { - Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize(); - int x = (int) ((dimension.getWidth() - getWidth()) / 2); - int y = (int) ((dimension.getHeight() - getHeight()) / 2); - setLocation(x, y); - } - - private void buildMainPane() { - - final JPanel panel = new JPanel(new BorderLayout()); - panel.add(getOptionTabs(), BorderLayout.CENTER); - final JPanel buttonPanel = new JPanel(); - buttonPanel.add(getApplyChangesButton()); - buttonPanel.add(getCancelButton()); - panel.add(buttonPanel, BorderLayout.PAGE_END); - this.add(panel); - - } - - private void enableContainer(Container container, boolean enable) { - final Component[] components = container.getComponents(); - for (final Component component : components) { - component.setEnabled(enable); - if (component instanceof Container) { - enableContainer((Container) component, enable); - } - } - } - - private JComponent getBrowsersOptionsPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - final JPanel browserChooserPanel = new JPanel(); - final Border browserBorder = new TitledBorder(new BevelBorder(BevelBorder.LOWERED), - Messages.getString("OptionWizard.1")); //$NON-NLS-1$ - browserChooserPanel.setBorder(browserBorder); - GridLayout experimentLayout = new GridLayout(0,1); - browserChooserPanel.setLayout( experimentLayout ); - - final ButtonGroup browserChooser = new ButtonGroup(); - final JComponent[] browsers = propertyToComponent.get(EarthProperty.BROWSER_TO_USE); - - for (final JComponent browserRadioButton : browsers) { - browserChooserPanel.add(browserRadioButton); - browserChooser.add((AbstractButton) browserRadioButton); - - ((JRadioButton) browserRadioButton).addActionListener(e -> setRestartRequired(true)); - } - constraints.gridy++; - panel.add(browserChooserPanel, constraints); - - constraints.gridy++; - constraints.gridx = 0; - panel.add(propertyToComponent.get(EarthProperty.SAIKU_SERVER_FOLDER)[0], constraints); - - return panel; - } - - private JComponent getIntegrationsPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - panel.add(propertyToComponent.get(EarthProperty.OPEN_GEE_APP)[0], constraints); - - constraints.gridy++; - panel.add(propertyToComponent.get(EarthProperty.OPEN_BING_MAPS)[0], constraints); - - constraints.gridy++; - panel.add(propertyToComponent.get(EarthProperty.OPEN_EARTH_MAP)[0], constraints); - - - constraints.gridy++; - constraints.gridwidth = 1; - panel.add(propertyToComponent.get(EarthProperty.OPEN_PLANET_MAPS)[0], constraints); - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.PLANET_MAPS_MONHLY)[0], constraints); - - constraints.gridy++; - constraints.gridx = 0; - constraints.gridwidth = 1; - final JLabel label = new JLabel(Messages.getString("OptionWizard.101")); //$NON-NLS-1$ - panel.add(label, constraints); - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.PLANET_MAPS_KEY)[0], constraints); - - constraints.gridx = 0; - constraints.gridy++; - constraints.gridwidth = 2; - panel.add(propertyToComponent.get(EarthProperty.OPEN_MAXAR_SECUREWATCH)[0], constraints); - - constraints.gridy++; - constraints.gridwidth = 1; - final JLabel labelMaxar = new JLabel(Messages.getString("OptionWizard.1021")); //$NON-NLS-1$ - panel.add(labelMaxar, constraints); - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.MAXAR_SECUREWATCH_URL)[0], constraints); - - constraints.gridx = 0; - constraints.gridy++; - constraints.gridwidth = 2; - panel.add(propertyToComponent.get(EarthProperty.OPEN_YANDEX_MAPS)[0], constraints); - - constraints.gridy++; - panel.add(propertyToComponent.get(EarthProperty.OPEN_BAIDU_MAPS)[0], constraints); - - constraints.gridy++; - final JLabel label2 = new JLabel(Messages.getString("OptionWizard.103")); //$NON-NLS-1$ - panel.add(label2, constraints); - constraints.gridy++; - panel.add(propertyToComponent.get(EarthProperty.EXTRA_MAP_URL)[0], constraints); - - constraints.gridy++; - constraints.gridx = 0; - constraints.gridwidth = 2; - panel.add(propertyToComponent.get(EarthProperty.OPEN_GEE_CODE_EDITOR)[0], constraints); - - - return panel; + public RemovePlotsFromDBDlg() { + super(); } - - private Component getApplyChangesButton() { - if (applyChanges == null) { - applyChanges = new JButton(Messages.getString("OptionWizard.15")); - applyChanges.addActionListener( - new ApplyOptionChangesListener(this, localPropertiesService, propertyToComponent) { - @Override - protected void applyProperties() { - new Thread("Applying properties dialog") { - @Override - public void run() { - savePropertyValues(); - if (isRestartRequired()) { - - restartEarth(); - } else { - EarthApp.executeKmlLoadAsynchronously(PropertiesDialog.this); - } - } - }.start(); - } - }); + private class DeleteResults { + private boolean success; + private Integer plotsDeleted; + private Integer plotsNotFoundInDB; + private Integer plotsErrorWhenDeleting; + private List messages; + + public DeleteResults(boolean success, Integer plotsDeleted, Integer plotsNotFoundInDB, + Integer plotsErrorWhenDeleting, List messages) { + super(); + this.success = success; + this.plotsDeleted = plotsDeleted; + this.plotsNotFoundInDB = plotsNotFoundInDB; + this.plotsErrorWhenDeleting = plotsErrorWhenDeleting; + this.messages = messages; } - return applyChanges; - } - public void closeDialog() { - this.dispose(); } - private Component getCancelButton() { - final JButton cancelButton = new JButton(Messages.getString("OptionWizard.24")); //$NON-NLS-1$ - cancelButton.addActionListener( e -> PropertiesDialog.this.dispose() ); - return cancelButton; + public void open(Frame owner, CollectSurvey survey) { + this.dlg = new JDialog(owner); + this.survey = survey; + this.dlg.setModal(true); + this.dlg.setSize(new Dimension(700, 350)); + this.dlg.setLocationRelativeTo(owner); + this.dlg.setTitle("Tool for removing plots from DB using a CSV with plot IDs"); + initLayout(); + dlg.setVisible(true); } - private JComponent getOperationModePanel() { - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - final JPanel typeOfUsePanel = new JPanel(new GridBagLayout()); - final Border border = new TitledBorder(new BevelBorder(BevelBorder.LOWERED), - Messages.getString("OptionWizard.2")); //$NON-NLS-1$ - typeOfUsePanel.setBorder(border); - - JPanel serverPanel = getServerPanel(); - typeOfUsePanel.add(serverPanel, constraints); - - return typeOfUsePanel; - } - - private void enableDBOptions(boolean isPostgreDb) { - enableContainer(postgresPanel, isPostgreDb); - enableContainer(sqlitePanel, !isPostgreDb); - } - - private ActionListener getDbTypeListener() { - return e -> { - final JRadioButton theJRB = (JRadioButton) e.getSource(); - - boolean isPostgreDb = theJRB.getName().equals(CollectDBDriver.POSTGRESQL.name()); - enableDBOptions(isPostgreDb); - }; - } - - private JTabbedPane getOptionTabs() { - final JTabbedPane tabbedPane = new JTabbedPane(); - tabbedPane.setSize(550, 300); - final JComponent panel1 = getSampleDataPanel(); - tabbedPane.addTab(Messages.getString("OptionWizard.31"), panel1); //$NON-NLS-1$ - - final JComponent panel2 = getPlotOptionsPanel(); - tabbedPane.addTab(Messages.getString("OptionWizard.32"), panel2); //$NON-NLS-1$ - - final JComponent panel3 = getSurveyDefinitonPanel(); - tabbedPane.addTab(Messages.getString("OptionWizard.33"), panel3); //$NON-NLS-1$ - - final JComponent panel41 = getIntegrationsPanel(); - tabbedPane.addTab(Messages.getString("OptionWizard.34"), panel41); //$NON-NLS-1$ - - final JComponent panel4 = getBrowsersOptionsPanel(); - tabbedPane.addTab(Messages.getString("OptionWizard.104"), panel4); //$NON-NLS-1$ - - final JComponent panel5 = getOperationModePanelScroll(); - tabbedPane.addTab(Messages.getString("OptionWizard.25"), panel5); //$NON-NLS-1$ - - final JComponent panel6 = getProjectsPanelScroll(); - tabbedPane.addTab(Messages.getString("OptionWizard.40"), panel6); //$NON-NLS-1$ - - return tabbedPane; - } - - private JComponent getProjectsPanelScroll() { - final JComponent projectsPanel = getProjectsPanel(); - return new JScrollPane(projectsPanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); - } - - private JComponent getProjectsPanel() { + private void initLayout() { final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.fill = GridBagConstraints.BOTH; - - JButton importNewButton = new JButton(Messages.getString("OptionWizard.41")); //$NON-NLS-1$ - importNewButton.addActionListener(new ApplyOptionChangesListener(this, localPropertiesService) { - - @Override - protected void applyProperties() { - final File[] selectedProjectFile = JFileChooserExistsAware.getFileChooserResults( - DataFormat.PROJECT_DEFINITION_FILE, false, false, null, localPropertiesService, - (JFrame) PropertiesDialog.this.getParent()); - - if (selectedProjectFile != null && selectedProjectFile.length == 1) { - try { - projectsService.loadCompressedProjectFile(selectedProjectFile[0]); - restartEarth(); - } catch (Exception e1) { - JOptionPane.showMessageDialog(PropertiesDialog.this, e1.getMessage(), - Messages.getString("OptionWizard.51"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - logger.error("Error importing project file " + selectedProjectFile[0].getAbsolutePath(), e1); //$NON-NLS-1$ - } - - } - } - }); - - panel.add(importNewButton, constraints); - - final JPanel typeOfDbPanel = new JPanel(new GridBagLayout()); - final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), - Messages.getString("OptionWizard.57")); //$NON-NLS-1$ - typeOfDbPanel.setBorder(border); - - constraints.gridx = 0; - constraints.gridy = 1; - panel.add(typeOfDbPanel, constraints); - - List listOfProjectsByName = new ArrayList<>(); - listOfProjectsByName.addAll(projectsService.getProjectList().keySet()); - Collections.sort(listOfProjectsByName); - final JList listOfProjects = new JList<>(listOfProjectsByName.toArray(new String[0])); // data has type Object[] - listOfProjects.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - listOfProjects.setLayoutOrientation(JList.VERTICAL); - listOfProjects.setVisibleRowCount(-1); - - JScrollPane listScroller = new JScrollPane(listOfProjects); - listScroller.setPreferredSize(new Dimension(250, 300)); - - constraints.gridy = 0; - constraints.gridx = GridBagConstraints.RELATIVE; - typeOfDbPanel.add(listScroller, constraints); - - final JButton openProject = new JButton(Messages.getString("OptionWizard.56")); //$NON-NLS-1$ - openProject.setEnabled(false); - openProject.addActionListener(new ApplyOptionChangesListener(this, localPropertiesService) { - - @Override - protected void applyProperties() { - - File projectFolder = projectsService.getProjectList().get(listOfProjects.getSelectedValue()); - - try { - projectsService.loadProjectInFolder(projectFolder); - restartEarth(); - } catch (Exception e1) { - JOptionPane.showMessageDialog(PropertiesDialog.this, e1.getMessage(), - Messages.getString("OptionWizard.55"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ - logger.error("Error importing project folder " + projectFolder.getAbsolutePath(), e1); //$NON-NLS-1$ - } - - } - - }); - - listOfProjects.addListSelectionListener(e -> openProject.setEnabled(listOfProjects.getSelectedValue() != null) ); - - typeOfDbPanel.add(openProject); - - return panel; - } - - private JScrollPane getOperationModePanelScroll() { - final JComponent operationModePanel = getOperationModePanel(); - return new JScrollPane(operationModePanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + GridBagConstraints c = new GridBagConstraints(); + + int row = 0; + c.fill = GridBagConstraints.BOTH; + + c.gridx = 0; + c.gridwidth = 2; + panel.add(new JLabel("" + + "This utility deletes plots that are already collected and present in the Collect Earth Database.
" + + "Make sure to backup the data in your DB before attempting to delete plots ( use the Tools->Data Import/Export->Export data to Collect Backup function)." + + "
" + + "The next field expects a CSV file for which the IDs of the plots to be deleted are present.The headers of the columns should be the names of the key attributes of the survey (usually just one, called ID, but it could be more)." + + ""), c); + c.gridy = row++; + + c.gridx = 0; + c.gridwidth = 2; + c.gridy = row++; + panel.add(getCsvFilePicker(), c); + c.gridy = row; + + panel.add(getDeleteButton(), c); + this.dlg.add(panel); } - private JComponent getPlotOptionsPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.fill = GridBagConstraints.HORIZONTAL; - - JLabel label = new JLabel("Plot shape"); - panel.add(label, constraints); - - constraints.gridx = 1; - JComboBox plotShape = (JComboBox) propertyToComponent.get(EarthProperty.SAMPLE_SHAPE)[0]; - panel.add(plotShape, constraints); - - constraints.gridx = 0; - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.35")); //$NON-NLS-1$ - panel.add(label, constraints); - - constraints.gridx = 1; - JComboBox numberPoints = (JComboBox) propertyToComponent - .get(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT)[0]; - panel.add(numberPoints, constraints); - - constraints.gridx = 0; - constraints.gridy++; - JLabel distanceOrRadiuslabel = new JLabel(Messages.getString("OptionWizard.36")); //$NON-NLS-1$ - panel.add(distanceOrRadiuslabel, constraints); - - constraints.gridx = 1; - JComboBox distanceBetweenPoints = (JComboBox) propertyToComponent - .get(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS)[0]; - panel.add(new JScrollPane(distanceBetweenPoints), constraints); - - constraints.gridx = 0; - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.37")); //$NON-NLS-1$ - panel.add(label, constraints); - constraints.gridx = 1; - JComboBox distanceToFrame = (JComboBox) propertyToComponent - .get(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES)[0]; - panel.add(new JScrollPane(distanceToFrame), constraints); - - constraints.gridx = 0; - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.95")); //$NON-NLS-1$ - panel.add(label, constraints); - constraints.gridx = 1; - JComboBox dotsSide = (JComboBox) propertyToComponent.get(EarthProperty.INNER_SUBPLOT_SIDE)[0]; - panel.add(new JScrollPane(dotsSide), constraints); - - constraints.gridx = 0; - constraints.gridy++; - label = new JLabel("Central plot side"); //$NON-NLS-1$ - panel.add(label, constraints); - constraints.gridx = 1; - JComboBox largeCentralPlotSide = (JComboBox) propertyToComponent.get(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)[0]; - panel.add(new JScrollPane(largeCentralPlotSide), constraints); - - - - constraints.gridx = 0; - constraints.gridy++; - label = new JLabel("Distance between plots in cluster"); - panel.add(label, constraints); - constraints.gridx = 1; - JComboBox plotDistanceInCluster = (JComboBox) propertyToComponent - .get(EarthProperty.DISTANCE_BETWEEN_PLOTS)[0]; - panel.add(new JScrollPane(plotDistanceInCluster), constraints); - - constraints.gridx = 0; - constraints.gridy++; - JLabel area = new JLabel( - "Area (hectares) : " + calculateArea(numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide)); - panel.add(area, constraints); - - ActionListener calculateAreas = actionPerformed -> area.setText("Area (hectares) : " + calculateArea(numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide)); - - plotShape.addActionListener( e-> - handleVisibilityPlotLayout(plotShape, numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide, - plotDistanceInCluster, area, distanceOrRadiuslabel, largeCentralPlotSide) - ); - - numberPoints.addActionListener(calculateAreas); - distanceBetweenPoints.addActionListener(calculateAreas); - distanceToFrame.addActionListener(calculateAreas); - - handleVisibilityPlotLayout(plotShape, numberPoints, distanceBetweenPoints, distanceToFrame, dotsSide, - plotDistanceInCluster, area, distanceOrRadiuslabel, largeCentralPlotSide); - - return panel; - } - - public void handleVisibilityPlotLayout(JComboBox plotShape, JComboBox numberPoints, JComboBox distanceBetweenPoints, - JComboBox distanceToFrame, JComboBox dotsSide, JComboBox distanceBetweenPlots, JLabel area, - JLabel distanceOrRadiuslabel, JComboBox largeCentralPlotSide ) { - numberPoints.setEnabled(false); - distanceBetweenPoints.setEnabled(false); - distanceToFrame.setEnabled(false); - dotsSide.setEnabled(false); - area.setVisible(false); - distanceBetweenPlots.setVisible(false); - distanceBetweenPlots.setEnabled(false); - largeCentralPlotSide.setVisible( false ); - largeCentralPlotSide.setEnabled(false); - - if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE) || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE_WITH_LARGE_CENTRAL_PLOT) ) { - numberPoints.setEnabled(true); - distanceBetweenPoints.setEnabled(true); - distanceToFrame.setEnabled(true); - dotsSide.setEnabled(true); - area.setVisible(true); - distanceOrRadiuslabel.setText(Messages.getString("OptionWizard.36")); - - if( plotShape.getSelectedItem().equals(SAMPLE_SHAPE.SQUARE_WITH_LARGE_CENTRAL_PLOT) ) { - largeCentralPlotSide.setVisible( true ); - largeCentralPlotSide.setEnabled(true); - } - - } else if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.CIRCLE) - || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.HEXAGON)) { - distanceBetweenPoints.setEnabled(true); - dotsSide.setEnabled(true); - numberPoints.setEnabled(true); - distanceOrRadiuslabel.setText("Radius"); - } else if (plotShape.getSelectedItem().equals(SAMPLE_SHAPE.NFI_THREE_CIRCLES) || plotShape.getSelectedItem().equals(SAMPLE_SHAPE.NFI_FOUR_CIRCLES)) { - dotsSide.setEnabled(true); - distanceBetweenPoints.setEnabled(true); - distanceBetweenPlots.setVisible(true); - distanceBetweenPlots.setEnabled(true); - distanceOrRadiuslabel.setText("Radius of the plots"); + private JButton getDeleteButton() { + if (deleteFromDB == null) { + deleteFromDB = new JButton("Delete plots with IDs in the CSV from the database"); + deleteFromDB.setEnabled(false); + deleteFromDB.addActionListener( e -> { + if (JOptionPane.showConfirmDialog(RemovePlotsFromDBDlg.this.dlg, + "Are you sure you want to remove the plots with the IDs that are specified in the CSV file??", + "Confirm deletion of plots in DB", JOptionPane.YES_NO_OPTION, + JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) { + deletePlotsFromDB(); + } + }); } + return deleteFromDB; } - private String calculateArea(JComboBox numberOfPoints, JComboBox distanceBetweenPoints, JComboBox distanceToFrame, JComboBox dotsSide) { - double side = 0; - try { - int numberOfPointsI = ((ComboBoxItem) numberOfPoints.getSelectedItem()).getNumberOfPoints(); - int distanceBetweenPointsI = Integer.parseInt((String) distanceBetweenPoints.getSelectedItem()); - int distanceToFrameI = Integer.parseInt((String) distanceToFrame.getSelectedItem()); + private boolean validateCsv(String filePath) { + boolean validFile = true; - if (numberOfPointsI == 0 || numberOfPointsI == 1) { + try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(filePath, false) ){ - side = 2d * distanceToFrameI; - if (oldSelectedDistance == null) { - oldSelectedDistance = (String) distanceBetweenPoints.getSelectedItem(); - distanceBetweenPoints.setEnabled(false); - } - distanceBetweenPoints.setSelectedItem("0"); + filePicker.setTextBackground(Color.white); - if (numberOfPointsI == 0) { - dotsSide.setEnabled(false); - } else if (numberOfPointsI == 1) { - dotsSide.setEnabled(true); - } + if (CsvReaderUtils.isCsvFile(filePath)) { - } else { - if (oldSelectedDistance != null) { - distanceBetweenPoints.setSelectedItem(oldSelectedDistance); - oldSelectedDistance = null; + // Get the first line + String[] csvHeaders = csvReader.readNext(); + String[] expectedHeaders = getKeyAttributesName(); + if (!Arrays.equals(expectedHeaders, csvHeaders)) { + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, + String.format("The Headers of the CSV file used should be %s, instead they are %s", + Arrays.toString(expectedHeaders), + StringUtils.abbreviate(Arrays.toString(csvHeaders), 35))); + filePicker.setTextBackground(Color.red); + validFile = false; } - distanceBetweenPoints.setEnabled(true); - distanceToFrame.setEnabled(true); - dotsSide.setEnabled(true); - - double pointsByLines = Math.sqrt(numberOfPointsI); - side = 2d * distanceToFrameI + (pointsByLines - 1) * distanceBetweenPointsI; + } else { + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, + String.format("The file in %s is NOT A CSV file ", filePath)); + validFile = false; + filePicker.setTextBackground(Color.red); } - - } catch (RuntimeException e) { - logger.error("Error calculating area of the plot", e); + } catch (Exception e) { + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, + String.format("Error opening file at %s. %s ", filePath, e.getMessage())); + logger.error("Error while validating the CSV file", e); + validFile = false; } - DecimalFormat df = new DecimalFormat("###.##"); - return df.format(side * side / 10000d); - } - - private JPanel getPostgreSqlPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), - Messages.getString("OptionWizard.6")); //$NON-NLS-1$ - panel.setBorder(border); - - JLabel label = new JLabel(Messages.getString("OptionWizard.7")); //$NON-NLS-1$ - constraints.gridx = 0; - panel.add(label, constraints); - - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.DB_USERNAME)[0], constraints); - - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.8")); //$NON-NLS-1$ - constraints.gridx = 0; - panel.add(label, constraints); - - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.DB_PASSWORD)[0], constraints); - - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.9")); //$NON-NLS-1$ - constraints.gridx = 0; - panel.add(label, constraints); - - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.DB_NAME)[0], constraints); - - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.26")); //$NON-NLS-1$ - constraints.gridx = 0; - panel.add(label, constraints); - - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.DB_HOST)[0], constraints); - - constraints.gridy++; - label = new JLabel(Messages.getString("OptionWizard.29")); //$NON-NLS-1$ - constraints.gridx = 0; - panel.add(label, constraints); - - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.DB_PORT)[0], constraints); - - constraints.gridx = 2; - panel.add(new JLabel("Default: 5432"), constraints); - - constraints.gridy++; - constraints.gridx = 1; - JButton button = new JButton("Test Connection"); //$NON-NLS-1$ - button.addActionListener( e-> { - String host = ((JTextField) (propertyToComponent.get(EarthProperty.DB_HOST)[0])).getText(); - String port = ((JTextField) (propertyToComponent.get(EarthProperty.DB_PORT)[0])).getText(); - String dbName = ((JTextField) (propertyToComponent.get(EarthProperty.DB_NAME)[0])).getText(); - String username = ((JTextField) (propertyToComponent.get(EarthProperty.DB_USERNAME)[0])).getText(); - String password = ((JTextField) (propertyToComponent.get(EarthProperty.DB_PASSWORD)[0])).getText(); - - String message = CollectEarthUtils.testPostgreSQLConnection(host, port, dbName, username, password); - JOptionPane.showMessageDialog(PropertiesDialog.this.getOwner(), message, "PostgreSQL Connection test", - JOptionPane.INFORMATION_MESSAGE); - }); - panel.add(button, constraints); - - return panel; + getDeleteButton().setEnabled(validFile); + return validFile; } - private JPanel getSqlLitePanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), - Messages.getString("OptionWizard.30")); //$NON-NLS-1$ - panel.setBorder(border); - - panel.add(propertyToComponent.get(EarthProperty.AUTOMATIC_BACKUP)[0], constraints); - constraints.gridx++; - panel.add(getOpenBackupFolderButton()); - return panel; - } - - private JComponent getSampleDataPanel() { - final JPlotCsvTable samplePlots = new JPlotCsvTable(localPropertiesService.getValue(EarthProperty.SAMPLE_FILE), - surveyLoaded); - - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.fill = GridBagConstraints.BOTH; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; + private void deletePlotsFromDB() { + InfiniteProgressMonitor progressDeletion = new InfiniteProgressMonitor(this.dlg, "Deleting plots", + "Wait while the plots are deleted from the database"); - final JFilePicker refreshTableOnFileChange = getFilePickerSamplePlots(samplePlots); - - panel.add(refreshTableOnFileChange, constraints); - - samplePlots.setFillsViewportHeight(true); - constraints.gridy = 1; - - constraints.weightx = 1.0; - constraints.weighty = 1.0; - constraints.gridwidth = GridBagConstraints.REMAINDER; - constraints.gridheight = GridBagConstraints.REMAINDER; - - samplePlots.setPreferredScrollableViewportSize(samplePlots.getPreferredSize()); - - panel.add(new JScrollPane(samplePlots, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, - ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), constraints); - - return panel; - } - - private JFilePicker getFilePickerSamplePlots(final JPlotCsvTable samplePlots) { - final JFilePicker refreshTableOnFileChange = (JFilePicker) (propertyToComponent - .get(EarthProperty.SAMPLE_FILE)[0]); - refreshTableOnFileChange.addChangeListener(new DocumentListener() { + Thread treadDeleting = new Thread("Deleting plots from Database") { + int plotsDeleted = 0; + int plotsNotFoundInDB = 0; + int plotsCouldNotBeDeleted = 0; + boolean success = true; + ArrayList messages = new ArrayList<>(); @Override - public void changedUpdate(DocumentEvent e) { - // Do not react - } - - @Override - public void insertUpdate(DocumentEvent e) { - refreshTable(); - } - - @Override - public void removeUpdate(DocumentEvent e) { - // Do not react - } - - private void refreshTable() { - samplePlots.refreshTable(refreshTableOnFileChange.getSelectedFilePath()); - - // Do not let the user save the changes if the sample data is wrong!!! - getApplyChangesButton().setEnabled(samplePlots.isDataValid()); - } - }); - return refreshTableOnFileChange; - } - - private JPanel getServerPanel() { + public void run() { + try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(getCsvFilePicker().getSelectedFilePath(), false) ){ + List allLines = csvReader.readAll(); + int totalLines = allLines.size() - 1; + boolean skipFirst = true; + int plot = 0; + progressDeletion.showLater(); + for (String[] csvRow : allLines) { + + if (skipFirst) { + skipFirst = false; + continue; + } - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; + progressDeletion.updateProgress(++plot, totalLines); - final JPanel typeOfDbPanel = new JPanel(new GridBagLayout()); - final Border border = new TitledBorder(new BevelBorder(BevelBorder.RAISED), - Messages.getString("OptionWizard.3")); //$NON-NLS-1$ - typeOfDbPanel.setBorder(border); + CollectRecord record = earthSurveyService.loadRecord(csvRow); + if (record == null) { + plotsNotFoundInDB++; + messages.add(String.format(" Could not find plot with ID %s in the Database", + Arrays.toString(csvRow))); + } else { + deleteRecord(csvRow, record); + } + } - JLabel label = new JLabel(Messages.getString("OptionWizard.4") + CollectEarthUtils.getComputerIp()); //$NON-NLS-1$ - typeOfDbPanel.add(label, constraints); - constraints.gridy++; + } catch (Exception e) { + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, + "Error reading CSV file or CSV File too big!"); + logger.error("Error while validating the CSV file", e); + success = false; + } finally { - label = new JLabel(Messages.getString("OptionWizard.5")); //$NON-NLS-1$ - constraints.gridx = 0; - typeOfDbPanel.add(label, constraints); + if (progressDeletion != null) { + progressDeletion.close(); + } - constraints.gridx = 1; - typeOfDbPanel.add(propertyToComponent.get(EarthProperty.HOST_PORT_KEY)[0], constraints); + } - constraints.gridwidth = GridBagConstraints.REMAINDER; - constraints.gridy++; - constraints.gridx = 0; + DeleteResults deleteResults = new DeleteResults(success, plotsDeleted, plotsNotFoundInDB, + plotsCouldNotBeDeleted, messages); + String result = "Plots Deleted : " + deleteResults.plotsDeleted + "
" + + "Plots Not Found :
" + deleteResults.plotsNotFoundInDB + "
" + + "Plots that could not be deleted because a exception : " + deleteResults.plotsErrorWhenDeleting + "
" + + " Messages :
" + StringUtils.join(deleteResults.messages, "
"); + if( success ) { + result = "" + + "Results of the deletion process:
" + + result + ""; + }else { + result = "" + + "There was an error while deleting the plots. Review the Collect Earth Log file in the Help menu.
" + + result + ""; + } - final ButtonGroup bg = new ButtonGroup(); - final JComponent[] dbTypes = propertyToComponent.get(EarthProperty.DB_DRIVER); - postgresPanel = getPostgreSqlPanel(); - sqlitePanel = getSqlLitePanel(); + JEditorPane web = new JEditorPane(); + web.setEditable(false); + web.setContentType("text/html"); + web.setText(result); - boolean usingPostgreSQL = localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.POSTGRESQL); - enableDBOptions(usingPostgreSQL); - for (final JComponent typeRadioButton : dbTypes) { - final JRadioButton dbTypeButton = (JRadioButton) typeRadioButton; - bg.add(dbTypeButton); - typeOfDbPanel.add(dbTypeButton, constraints); - constraints.gridy++; + JScrollPane scrollPane = new JScrollPane(web); + scrollPane.setPreferredSize( new Dimension( 450, 350 )); - dbTypeButton.addActionListener(getDbTypeListener()); - dbTypeButton.addActionListener(e -> setRestartRequired(true)); + // Refresh contents of Google Earth! + EarthApp.executeKmlLoadAsynchronously( null ); - if (dbTypeButton.getName().equals(EarthConstants.CollectDBDriver.POSTGRESQL.name())) { - typeOfDbPanel.add(postgresPanel, constraints); - constraints.gridy++; + SwingUtilities.invokeLater( () -> { + if (deleteResults.success) { + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, scrollPane, "Success deleting plots", JOptionPane.INFORMATION_MESSAGE); + } else { - } else { - typeOfDbPanel.add(sqlitePanel, constraints); - constraints.gridy++; + JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, scrollPane, "Error deleting plots", JOptionPane.WARNING_MESSAGE); + } + }); } - } - return typeOfDbPanel; - } - - private Component getOpenBackupFolderButton() { - AbstractAction backupAction = new AbstractAction(Messages.getString("OptionWizard.10")) { //$NON-NLS-1$ - - private static final long serialVersionUID = 1L; - - @Override - public void actionPerformed(ActionEvent e) { + private void deleteRecord(String[] csvRow, CollectRecord record) { try { - - CollectEarthUtils.openFolderInExplorer(backupFolder); - - } catch (final IOException e1) { - logger.error("Error when opening the explorer window to visualize backups", e1); //$NON-NLS-1$ + recordManager.delete(record.getId()); + messages.add(String.format("Deleted plot with ID %s ", Arrays.toString(csvRow))); + plotsDeleted++; + } catch (RecordPersistenceException e) { + plotsCouldNotBeDeleted++; + messages.add(String.format("Error when deleting plot with ID %s. Error Message: %s", + Arrays.toString(csvRow), e.getMessage())); + logger.error("Error deleting plot with ID " + Arrays.toString(csvRow)); + success = false; } } - }; - return new JButton(backupAction); + treadDeleting.start(); } - private JComponent getSurveyDefinitonPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.fill = GridBagConstraints.HORIZONTAL; - constraints.gridwidth = 2; - panel.add(propertyToComponent.get(EarthProperty.OPEN_BALLOON_IN_BROWSER)[0], constraints); - - constraints.gridy++; - constraints.gridwidth = 1; - final JLabel label = new JLabel(Messages.getString("OptionWizard.43")); //$NON-NLS-1$ - panel.add(label, constraints); - constraints.gridx = 1; - panel.add(propertyToComponent.get(EarthProperty.SURVEY_NAME)[0], constraints); - - constraints.gridy++; - constraints.gridwidth = GridBagConstraints.REMAINDER; - constraints.gridx = 0; - panel.add(propertyToComponent.get(EarthProperty.KML_TEMPLATE_KEY)[0], constraints); - - constraints.gridy++; - constraints.gridx = 0; - panel.add(propertyToComponent.get(EarthProperty.BALLOON_TEMPLATE_KEY)[0], constraints); - - constraints.gridy++; - constraints.gridx = 0; - - panel.add(propertyToComponent.get(EarthProperty.METADATA_FILE)[0], constraints); - - return panel; - } - - private void initilizeInputs() { - - final JCheckBox backupCheckbox = new JCheckBox(Messages.getString("OptionWizard.44")); //$NON-NLS-1$ - backupCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.AUTOMATIC_BACKUP))); - propertyToComponent.put(EarthProperty.AUTOMATIC_BACKUP, new JComponent[] { backupCheckbox }); - - final JCheckBox openEarthEngineCheckbox = new JCheckBox(Messages.getString("OptionWizard.45")); //$NON-NLS-1$ - openEarthEngineCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_EXPLORER))); - propertyToComponent.put(EarthProperty.OPEN_GEE_EXPLORER, new JComponent[] { openEarthEngineCheckbox }); - - final JCheckBox openGEEAppCheckbox = new JCheckBox("Google Earth Engine APP (no sign-in)"); //$NON-NLS-1$ - openGEEAppCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_APP))); - propertyToComponent.put(EarthProperty.OPEN_GEE_APP, new JComponent[] { openGEEAppCheckbox }); - - final JCheckBox openTimelapseCheckbox = new JCheckBox(Messages.getString("OptionWizard.46")); //$NON-NLS-1$ - openTimelapseCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_TIMELAPSE))); - propertyToComponent.put(EarthProperty.OPEN_TIMELAPSE, new JComponent[] { openTimelapseCheckbox }); - - final JCheckBox openEarthMapCheckbox = new JCheckBox(Messages.getString("OptionWizard.105")); //$NON-NLS-1$ - openEarthMapCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_EARTH_MAP))); - propertyToComponent.put(EarthProperty.OPEN_EARTH_MAP, new JComponent[] { openEarthMapCheckbox }); - - final JCheckBox openBingCheckbox = new JCheckBox(Messages.getString("OptionWizard.47")); //$NON-NLS-1$ - openBingCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BING_MAPS))); - propertyToComponent.put(EarthProperty.OPEN_BING_MAPS, new JComponent[] { openBingCheckbox }); - - final JCheckBox openPlanetCheckbox = new JCheckBox(Messages.getString("OptionWizard.100")); //$NON-NLS-1$ - openPlanetCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_PLANET_MAPS))); - propertyToComponent.put(EarthProperty.OPEN_PLANET_MAPS, new JComponent[] { openPlanetCheckbox }); - - final JCheckBox openMonthlyNICFICheckbox = new JCheckBox(Messages.getString("OptionWizard.110")); //$NON-NLS-1$ - openMonthlyNICFICheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.PLANET_MAPS_MONHLY))); - propertyToComponent.put(EarthProperty.PLANET_MAPS_MONHLY, new JComponent[] { openMonthlyNICFICheckbox }); - - - final JPasswordField planetAPIKeyTextField = new JPasswordField( - localPropertiesService.getValue(EarthProperty.PLANET_MAPS_KEY)); - planetAPIKeyTextField.setMinimumSize(new Dimension( 250, 20 )); - planetAPIKeyTextField.setEnabled( localPropertiesService.isPlanetMapsSupported() ); - propertyToComponent.put(EarthProperty.PLANET_MAPS_KEY, new JComponent[] { planetAPIKeyTextField }); - - openMonthlyNICFICheckbox.setEnabled( openPlanetCheckbox.isSelected() ); - planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ); - - openPlanetCheckbox.addActionListener( e-> { - planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ); - openMonthlyNICFICheckbox.setEnabled( openPlanetCheckbox.isSelected() ); - }); - openMonthlyNICFICheckbox.addActionListener( e-> planetAPIKeyTextField.setEnabled( openPlanetCheckbox.isSelected() && !openMonthlyNICFICheckbox.isSelected() ) ); - - - final JCheckBox openSecureWatchCheckbox = new JCheckBox(Messages.getString("OptionWizard.102")); //$NON-NLS-1$ - openSecureWatchCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_MAXAR_SECUREWATCH))); - propertyToComponent.put(EarthProperty.OPEN_MAXAR_SECUREWATCH, new JComponent[] { openSecureWatchCheckbox }); - - final JTextField secureWatchUrlTextField = new JTextField( - localPropertiesService.getValue(EarthProperty.MAXAR_SECUREWATCH_URL)); - secureWatchUrlTextField.setMinimumSize(new Dimension( 250, 20 )); - propertyToComponent.put(EarthProperty.MAXAR_SECUREWATCH_URL, new JComponent[] { secureWatchUrlTextField }); - secureWatchUrlTextField.setEnabled( localPropertiesService.isSecureWatchSupported() ); - propertyToComponent.put(EarthProperty.MAXAR_SECUREWATCH_URL, new JComponent[] { secureWatchUrlTextField }); - openSecureWatchCheckbox.addActionListener( e -> secureWatchUrlTextField.setEnabled( openSecureWatchCheckbox.isSelected() ) ); - - final JTextField extraUrlTextField = new JTextField( - localPropertiesService.getValue(EarthProperty.EXTRA_MAP_URL)); - extraUrlTextField.setMinimumSize(new Dimension( 250, 20 )); - propertyToComponent.put(EarthProperty.EXTRA_MAP_URL, new JComponent[] { extraUrlTextField }); - - final JCheckBox openBaiduCheckbox = new JCheckBox("Open Baidu Maps"); - openBaiduCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BAIDU_MAPS))); - propertyToComponent.put(EarthProperty.OPEN_BAIDU_MAPS, new JComponent[] { openBaiduCheckbox }); - - final JCheckBox openYandexCheckbox = new JCheckBox("Open Yandex maps for the plot area"); - openYandexCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_YANDEX_MAPS))); - propertyToComponent.put(EarthProperty.OPEN_YANDEX_MAPS, new JComponent[] { openYandexCheckbox }); - - final JCheckBox openHereCheckbox = new JCheckBox(Messages.getString("OptionWizard.59")); //$NON-NLS-1$ - openHereCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_HERE_MAPS))); - propertyToComponent.put(EarthProperty.OPEN_HERE_MAPS, new JComponent[] { openHereCheckbox }); - - final JCheckBox openGeePlaygroundCheckbox = new JCheckBox(Messages.getString("OptionWizard.58")); //$NON-NLS-1$ - openGeePlaygroundCheckbox - .setSelected(Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_GEE_CODE_EDITOR))); - propertyToComponent.put(EarthProperty.OPEN_GEE_CODE_EDITOR, new JComponent[] { openGeePlaygroundCheckbox }); - - final JCheckBox openInSeparateWindowCheckbox = new JCheckBox(Messages.getString("OptionWizard.48")); //$NON-NLS-1$ - openInSeparateWindowCheckbox.setSelected( - Boolean.parseBoolean(localPropertiesService.getValue(EarthProperty.OPEN_BALLOON_IN_BROWSER))); - propertyToComponent.put(EarthProperty.OPEN_BALLOON_IN_BROWSER, - new JComponent[] { openInSeparateWindowCheckbox }); - - final JFilePicker csvWithPlotData = new JFilePicker(Messages.getString("OptionWizard.49"), //$NON-NLS-1$ - localPropertiesService.getValue(EarthProperty.SAMPLE_FILE), Messages.getString("OptionWizard.50"), DlgMode.MODE_OPEN); // $NON-NLS-1$ - - csvWithPlotData.addFileTypeFilter(".csv,.ced", Messages.getString("OptionWizard.52"), true); //$NON-NLS-1$ //$NON-NLS-2$ - propertyToComponent.put(EarthProperty.SAMPLE_FILE, new JComponent[] { csvWithPlotData }); - - final JComboBox plotShape = new JComboBox<>(SAMPLE_SHAPE.values()); - try { - plotShape.setSelectedItem(SAMPLE_SHAPE.valueOf(localPropertiesService.getValue(EarthProperty.SAMPLE_SHAPE))); - } catch (Exception e1) { - logger.error("The selected shape type is not supported " + localPropertiesService.getValue(EarthProperty.SAMPLE_SHAPE), e1 ); + private String[] getKeyAttributesName() { + List keyAttributeDefinitions = survey.getSchema().getRootEntityDefinitions().get(0) + .getKeyAttributeDefinitions(); + String[] keyAttributeNames = new String[keyAttributeDefinitions.size()]; + int i = 0; + for (AttributeDefinition keyAttributeDefinition : keyAttributeDefinitions) { + keyAttributeNames[i++] = keyAttributeDefinition.getName(); } - propertyToComponent.put(EarthProperty.SAMPLE_SHAPE, new JComponent[] { plotShape }); - - final JComboBox comboNumberOfPoints = new JComboBox<>( - new ComboBoxItem[] { COMBO_BOX_ITEM_SQUARE, COMBO_BOX_ITEM_CENTRAL_POINT, new ComboBoxItem(4, "2x2"), //$NON-NLS-1$ //$NON-NLS-2$ - // //$NON-NLS-3$ - new ComboBoxItem(9, "3x3"), new ComboBoxItem(16, "4x4"), new ComboBoxItem(25, "5x5"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - new ComboBoxItem(36, "6x6"), //$NON-NLS-1$ - new ComboBoxItem(49, "7x7") }); //$NON-NLS-1$ - if( StringUtils.isNotBlank( localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT) ) ){ - try { - comboNumberOfPoints.setSelectedItem(new ComboBoxItem( - Integer.parseInt(localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT)), - "")); //$NON-NLS-1$ - } catch (NumberFormatException e1) { - logger.error("This should be a number {}", localPropertiesService.getValue(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT), e1); - } - } - propertyToComponent.put(EarthProperty.NUMBER_OF_SAMPLING_POINTS_IN_PLOT, - new JComponent[] { comboNumberOfPoints }); - - final String[] listOfNumbers = new String[1500]; - final String[] listOfNumbersFromTwo = new String[1500]; - - for (int index = 0; index < listOfNumbers.length; index++) { - listOfNumbers[index] = Integer.toString( index ); //$NON-NLS-1$ - listOfNumbersFromTwo[index] = Integer.toString( index + 2 ); //$NON-NLS-1$ - } - - final JComboBox listOfDistanceBetweenPoints = new JComboBox<>(listOfNumbersFromTwo); - listOfDistanceBetweenPoints - .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS)); - listOfDistanceBetweenPoints.setAutoscrolls(true); - - propertyToComponent.put(EarthProperty.DISTANCE_BETWEEN_SAMPLE_POINTS, - new JComponent[] { listOfDistanceBetweenPoints }); - - final JComboBox listOfDistanceBetweenPlots = new JComboBox<>(listOfNumbersFromTwo); - listOfDistanceBetweenPlots - .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_BETWEEN_PLOTS)); - listOfDistanceBetweenPlots.setAutoscrolls(true); - - propertyToComponent.put(EarthProperty.DISTANCE_BETWEEN_PLOTS, new JComponent[] { listOfDistanceBetweenPlots }); - - final JComboBox listOfDistanceToBorder = new JComboBox<>(listOfNumbers); - listOfDistanceToBorder - .setSelectedItem(localPropertiesService.getValue(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES)); - listOfDistanceToBorder.setAutoscrolls(true); - - propertyToComponent.put(EarthProperty.DISTANCE_TO_PLOT_BOUNDARIES, new JComponent[] { listOfDistanceToBorder }); - - final JComboBox listOfSizeofSamplingDot = new JComboBox<>(listOfNumbersFromTwo); - listOfSizeofSamplingDot.setSelectedItem(localPropertiesService.getValue(EarthProperty.INNER_SUBPLOT_SIDE)); - listOfSizeofSamplingDot.setAutoscrolls(true); - - propertyToComponent.put(EarthProperty.INNER_SUBPLOT_SIDE, new JComponent[] { listOfSizeofSamplingDot }); - - final JComboBox listOfSideOflargeCentralPlot = new JComboBox<>(listOfNumbersFromTwo); - listOfSideOflargeCentralPlot.setSelectedItem(localPropertiesService.getValue(EarthProperty.LARGE_CENTRAL_PLOT_SIDE)); - listOfSideOflargeCentralPlot.setAutoscrolls(true); - - propertyToComponent.put(EarthProperty.LARGE_CENTRAL_PLOT_SIDE, new JComponent[] { listOfSideOflargeCentralPlot }); - - - final JRadioButton chromeChooser = new JRadioButton("Chrome"); //$NON-NLS-1$ - chromeChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() - .equals(EarthConstants.CHROME_BROWSER)); - chromeChooser.setName(EarthConstants.CHROME_BROWSER); + return keyAttributeNames; + } - final JRadioButton firefoxChooser = new JRadioButton("Firefox"); //$NON-NLS-1$ - firefoxChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() - .equals(EarthConstants.FIREFOX_BROWSER)); - firefoxChooser.setName(EarthConstants.FIREFOX_BROWSER); + private JFilePicker getCsvFilePicker() { + if (filePicker == null) { + filePicker = new JFilePicker("Choose the CSV file containing the IDs of the plots to remove", null, + "Explore", DlgMode.MODE_OPEN); - final JRadioButton edgeChooser = new JRadioButton("Edge"); //$NON-NLS-1$ - edgeChooser.setSelected(localPropertiesService.getValue(EarthProperty.BROWSER_TO_USE).trim() - .equals(EarthConstants.EDGE_BROWSER)); - edgeChooser.setName(EarthConstants.EDGE_BROWSER); + filePicker.getFileChooser().setAcceptAllFileFilterUsed(false); + filePicker.addFileTypeFilter("csv", " CSV file with plot IDs", true); - propertyToComponent.put(EarthProperty.BROWSER_TO_USE, new JComponent[] { firefoxChooser, chromeChooser, edgeChooser}); - final JFilePicker saikuPath = new JFilePicker(Messages.getString("OptionWizard.65"), //$NON-NLS-1$ - localPropertiesService.getValue(EarthProperty.SAIKU_SERVER_FOLDER), - Messages.getString("OptionWizard.66"), DlgMode.MODE_OPEN); //$NON-NLS-1$ - saikuPath.setFolderChooser(); - saikuPath.addChangeListener(new DocumentListener() { + filePicker.addChangeListener(new DocumentListener() { - private void showSaikuWarning() { - final File saikuFolder = new File(saikuPath.getSelectedFilePath()); - if ( !saikuService.isSaikuFolder(saikuFolder)) { - JOptionPane.showMessageDialog(PropertiesDialog.this, Messages.getString("OptionWizard.27"), //$NON-NLS-1$ - Messages.getString("OptionWizard.28"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ - saikuPath.getTextField().setBackground(CollectEarthWindow.ERROR_COLOR); - } else { - saikuPath.getTextField().setBackground(Color.white); + @Override + public void removeUpdate(DocumentEvent e) { + // Do not react } - } - - @Override - public void removeUpdate(DocumentEvent e) { - // Do not react - } - - @Override - public void insertUpdate(DocumentEvent e) { - showSaikuWarning(); - } - - @Override - public void changedUpdate(DocumentEvent e) { - // Do not react - } - }); - propertyToComponent.put(EarthProperty.SAIKU_SERVER_FOLDER, new JComponent[] { saikuPath }); - - final JFilePicker kmlTemplatePath = new JFilePicker(Messages.getString("OptionWizard.79"), //$NON-NLS-1$ - localPropertiesService.getValue(EarthProperty.KML_TEMPLATE_KEY), Messages.getString("OptionWizard.80"), //$NON-NLS-1$ - DlgMode.MODE_OPEN); - kmlTemplatePath.addFileTypeFilter(".fmt", Messages.getString("OptionWizard.82"), true); //$NON-NLS-1$ //$NON-NLS-2$ - propertyToComponent.put(EarthProperty.KML_TEMPLATE_KEY, new JComponent[] { kmlTemplatePath }); - - final JFilePicker htmlBalloonPath = new JFilePicker(Messages.getString("OptionWizard.83"), //$NON-NLS-1$ - localPropertiesService.getValue(EarthProperty.BALLOON_TEMPLATE_KEY), - Messages.getString("OptionWizard.84"), DlgMode.MODE_OPEN); //$NON-NLS-1$ - htmlBalloonPath.addFileTypeFilter(".html,.htm", Messages.getString("OptionWizard.86"), true); //$NON-NLS-1$ //$NON-NLS-2$ - propertyToComponent.put(EarthProperty.BALLOON_TEMPLATE_KEY, new JComponent[] { htmlBalloonPath }); - - final JFilePicker idmPath = new JFilePicker(Messages.getString("OptionWizard.87"), //$NON-NLS-1$ - localPropertiesService.getImdFile(), Messages.getString("OptionWizard.88"), DlgMode.MODE_OPEN); //$NON-NLS-1$ - idmPath.addFileTypeFilter(".xml", Messages.getString("OptionWizard.90"), true); //$NON-NLS-1$ //$NON-NLS-2$ - propertyToComponent.put(EarthProperty.METADATA_FILE, new JComponent[] { idmPath }); - - final JTextField surveyNameTextField = new JTextField( - localPropertiesService.getValue(EarthProperty.SURVEY_NAME)); - surveyNameTextField.setEnabled(false); - propertyToComponent.put(EarthProperty.SURVEY_NAME, new JComponent[] { surveyNameTextField }); - - // Database options - final JRadioButton instanceTypeServer = new JRadioButton(Messages.getString("OptionWizard.91")); //$NON-NLS-1$ - instanceTypeServer.setSelected(localPropertiesService.getOperationMode().equals(OperationMode.SERVER_MODE)); - instanceTypeServer.setName(EarthConstants.OperationMode.SERVER_MODE.name()); - - final JRadioButton instanceTypeClient = new JRadioButton(Messages.getString("OptionWizard.92")); //$NON-NLS-1$ - instanceTypeClient.setSelected(localPropertiesService.getOperationMode().equals(OperationMode.CLIENT_MODE)); - instanceTypeClient.setName(EarthConstants.OperationMode.CLIENT_MODE.name()); - propertyToComponent.put(EarthProperty.OPERATION_MODE, - new JComponent[] { instanceTypeServer, instanceTypeClient }); - - final JTextField collectEarthServerIp = new JTextField(localPropertiesService.getValue(EarthProperty.HOST_KEY)); - propertyToComponent.put(EarthProperty.HOST_KEY, new JComponent[] { collectEarthServerIp }); - - final JTextField collectEarthServerIpPort = new JTextField(localPropertiesService.getPort()); - final JTextField collectEarthServerLocalPort = new JTextField( - localPropertiesService.getValue(EarthProperty.HOST_PORT_KEY)); - propertyToComponent.put(EarthProperty.HOST_PORT_KEY, - new JComponent[] { collectEarthServerIpPort, collectEarthServerLocalPort }); - - final JRadioButton sqliteDbType = new JRadioButton(Messages.getString("OptionWizard.93")); //$NON-NLS-1$ - sqliteDbType.setSelected(localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.SQLITE)); - sqliteDbType.setName(CollectDBDriver.SQLITE.name()); - - final JRadioButton postgresDbType = new JRadioButton(Messages.getString("OptionWizard.94")); //$NON-NLS-1$ - boolean usingPostgreSQL = localPropertiesService.getCollectDBDriver().equals(CollectDBDriver.POSTGRESQL); - postgresDbType.setSelected(usingPostgreSQL); - postgresDbType.setName(CollectDBDriver.POSTGRESQL.name()); - propertyToComponent.put(EarthProperty.DB_DRIVER, new JComponent[] { sqliteDbType, postgresDbType }); - - final JTextField dbUserName = new JTextField(localPropertiesService.getValue(EarthProperty.DB_USERNAME)); - propertyToComponent.put(EarthProperty.DB_USERNAME, new JComponent[] { dbUserName }); - - final JTextField dbPassword = new JTextField(localPropertiesService.getValue(EarthProperty.DB_PASSWORD)); - propertyToComponent.put(EarthProperty.DB_PASSWORD, new JComponent[] { dbPassword }); - - final JTextField dbName = new JTextField(localPropertiesService.getValue(EarthProperty.DB_NAME)); - propertyToComponent.put(EarthProperty.DB_NAME, new JComponent[] { dbName }); - - final JTextField dbHost = new JTextField(localPropertiesService.getValue(EarthProperty.DB_HOST)); - propertyToComponent.put(EarthProperty.DB_HOST, new JComponent[] { dbHost }); - - final JTextField dbPort = new JTextField(localPropertiesService.getValue(EarthProperty.DB_PORT)); - propertyToComponent.put(EarthProperty.DB_PORT, new JComponent[] { dbPort }); - - } - - public boolean isRestartRequired() { - return restartRequired; - } + @Override + public void insertUpdate(DocumentEvent e) { + validateCsv(filePicker.getTextField().getText()); + } - public void setRestartRequired(boolean restartRequired) { - this.restartRequired = restartRequired; + @Override + public void changedUpdate(DocumentEvent e) { + validateCsv(filePicker.getTextField().getText()); + } + }); + } + return filePicker; } } From 03b693762ada39c9a62b754bf68e0e15afe3191c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:16 +0100 Subject: [PATCH 1297/1620] New translations SaikuAnalysisListener.java (French) --- .../earth/app/view/Messages_fr.properties | 337 ++---------------- 1 file changed, 37 insertions(+), 300 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index eb9b80be90..29c9a75479 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,326 +1,63 @@ package org.openforis.collect.earth.app.view; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Frame; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JEditorPane; -import javax.swing.JLabel; +import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.SwingUtilities; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.collect.manager.RecordManager; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectSurvey; -import org.openforis.collect.persistence.RecordPersistenceException; -import org.openforis.idm.metamodel.AttributeDefinition; +import org.openforis.collect.earth.app.service.ExportType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; -import com.opencsv.CSVReader; +public class SaikuAnalysisListener implements ActionListener { + private Logger logger = LoggerFactory.getLogger( SaikuAnalysisListener.class); + protected JFrame frame; + protected GenerateDatabaseStarter saikuStarter; -@Component -@Lazy -public class RemovePlotsFromDBDlg { - - @Autowired - private RecordManager recordManager; - - @Autowired - private EarthSurveyService earthSurveyService; - - @SuppressWarnings("unused") - private static final long serialVersionUID = 5175096170385736616L; - private CollectSurvey survey; - private Logger logger = LoggerFactory.getLogger(RemovePlotsFromDBDlg.class); - - private JButton deleteFromDB; - private JFilePicker filePicker; - - private JDialog dlg; - - public RemovePlotsFromDBDlg() { - super(); - } - - private class DeleteResults { - private boolean success; - private Integer plotsDeleted; - private Integer plotsNotFoundInDB; - private Integer plotsErrorWhenDeleting; - private List messages; - - public DeleteResults(boolean success, Integer plotsDeleted, Integer plotsNotFoundInDB, - Integer plotsErrorWhenDeleting, List messages) { - super(); - this.success = success; - this.plotsDeleted = plotsDeleted; - this.plotsNotFoundInDB = plotsNotFoundInDB; - this.plotsErrorWhenDeleting = plotsErrorWhenDeleting; - this.messages = messages; - } - - } - - public void open(Frame owner, CollectSurvey survey) { - this.dlg = new JDialog(owner); - this.survey = survey; - this.dlg.setModal(true); - this.dlg.setSize(new Dimension(700, 350)); - this.dlg.setLocationRelativeTo(owner); - this.dlg.setTitle("Tool for removing plots from DB using a CSV with plot IDs"); - initLayout(); - dlg.setVisible(true); + public SaikuAnalysisListener(JFrame frame, GenerateDatabaseStarter saikuStarter) { + this.frame = frame; + this.saikuStarter = saikuStarter; } - private void initLayout() { - final JPanel panel = new JPanel(new GridBagLayout()); - GridBagConstraints c = new GridBagConstraints(); - - int row = 0; - c.fill = GridBagConstraints.BOTH; - - c.gridx = 0; - c.gridwidth = 2; - panel.add(new JLabel("" - + "This utility deletes plots that are already collected and present in the Collect Earth Database.
" - + "Make sure to backup the data in your DB before attempting to delete plots ( use the Tools->Data Import/Export->Export data to Collect Backup function)." - + "
" - + "The next field expects a CSV file for which the IDs of the plots to be deleted are present.The headers of the columns should be the names of the key attributes of the survey (usually just one, called ID, but it could be more)." - + ""), c); - c.gridy = row++; - - c.gridx = 0; - c.gridwidth = 2; - c.gridy = row++; - panel.add(getCsvFilePicker(), c); - c.gridy = row; - - panel.add(getDeleteButton(), c); - this.dlg.add(panel); - } - - private JButton getDeleteButton() { - if (deleteFromDB == null) { - deleteFromDB = new JButton("Delete plots with IDs in the CSV from the database"); - deleteFromDB.setEnabled(false); - deleteFromDB.addActionListener( e -> { - if (JOptionPane.showConfirmDialog(RemovePlotsFromDBDlg.this.dlg, - "Are you sure you want to remove the plots with the IDs that are specified in the CSV file??", - "Confirm deletion of plots in DB", JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) { - deletePlotsFromDB(); - } - }); - } - return deleteFromDB; - } - - private boolean validateCsv(String filePath) { - boolean validFile = true; - - try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(filePath, false) ){ - - filePicker.setTextBackground(Color.white); - - if (CsvReaderUtils.isCsvFile(filePath)) { - - // Get the first line - String[] csvHeaders = csvReader.readNext(); - String[] expectedHeaders = getKeyAttributesName(); - if (!Arrays.equals(expectedHeaders, csvHeaders)) { - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, - String.format("The Headers of the CSV file used should be %s, instead they are %s", - Arrays.toString(expectedHeaders), - StringUtils.abbreviate(Arrays.toString(csvHeaders), 35))); - filePicker.setTextBackground(Color.red); - validFile = false; - } + @Override + public void actionPerformed(ActionEvent e) { + try { - } else { - - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, - String.format("The file in %s is NOT A CSV file ", filePath)); - validFile = false; - filePicker.setTextBackground(Color.red); - } - } catch (Exception e) { - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, - String.format("Error opening file at %s. %s ", filePath, e.getMessage())); - logger.error("Error while validating the CSV file", e); - validFile = false; + CollectEarthWindow.startWaiting(frame); + exportDataToRDB( true ); + }catch (Exception e1) { + logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ + } finally{ + CollectEarthWindow.endWaiting(frame); } - - getDeleteButton().setEnabled(validFile); - return validFile; } - private void deletePlotsFromDB() { - InfiniteProgressMonitor progressDeletion = new InfiniteProgressMonitor(this.dlg, "Deleting plots", - "Wait while the plots are deleted from the database"); - - Thread treadDeleting = new Thread("Deleting plots from Database") { - int plotsDeleted = 0; - int plotsNotFoundInDB = 0; - int plotsCouldNotBeDeleted = 0; - boolean success = true; - ArrayList messages = new ArrayList<>(); - - @Override - public void run() { - try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(getCsvFilePicker().getSelectedFilePath(), false) ){ - List allLines = csvReader.readAll(); - int totalLines = allLines.size() - 1; - boolean skipFirst = true; - int plot = 0; - progressDeletion.showLater(); - for (String[] csvRow : allLines) { - - if (skipFirst) { - skipFirst = false; - continue; - } - - progressDeletion.updateProgress(++plot, totalLines); - - CollectRecord record = earthSurveyService.loadRecord(csvRow); - if (record == null) { - plotsNotFoundInDB++; - messages.add(String.format(" Could not find plot with ID %s in the Database", - Arrays.toString(csvRow))); - } else { - deleteRecord(csvRow, record); - } - } - - } catch (Exception e) { - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, - "Error reading CSV file or CSV File too big!"); - logger.error("Error while validating the CSV file", e); - success = false; - } finally { - - if (progressDeletion != null) { - progressDeletion.close(); - } - - } - - DeleteResults deleteResults = new DeleteResults(success, plotsDeleted, plotsNotFoundInDB, - plotsCouldNotBeDeleted, messages); - String result = "Plots Deleted : " + deleteResults.plotsDeleted + "
" + - "Plots Not Found :
" + deleteResults.plotsNotFoundInDB + "
" - + "Plots that could not be deleted because a exception : " + deleteResults.plotsErrorWhenDeleting + "
" + - " Messages :
" + StringUtils.join(deleteResults.messages, "
"); - if( success ) { - result = "" - + "Results of the deletion process:
" - + result + ""; - }else { - result = "" - + "There was an error while deleting the plots. Review the Collect Earth Log file in the Help menu.
" - + result + ""; - } - + protected void exportDataToRDB(boolean startSaikuAfterDBExport) { + if( saikuStarter.isStarting() ){ + JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.57"), Messages.getString("CollectEarthWindow.58"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ + }else{ - JEditorPane web = new JEditorPane(); - web.setEditable(false); - web.setContentType("text/html"); - web.setText(result); + int shouldRefreshDb = JOptionPane.YES_OPTION; + if( saikuStarter.shouldShowRdbGenerationOption( ExportType.SAIKU ) ){ - JScrollPane scrollPane = new JScrollPane(web); - scrollPane.setPreferredSize( new Dimension( 450, 350 )); + String refresh = Messages.getString("SaikuAnalysisListener.0"); //$NON-NLS-1$ + String close = Messages.getString("SaikuAnalysisListener.1"); //$NON-NLS-1$ + String[] options = new String[]{ refresh,close}; - // Refresh contents of Google Earth! - EarthApp.executeKmlLoadAsynchronously( null ); - SwingUtilities.invokeLater( () -> { - if (deleteResults.success) { - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, scrollPane, "Success deleting plots", JOptionPane.INFORMATION_MESSAGE); - } else { - - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, scrollPane, "Error deleting plots", JOptionPane.WARNING_MESSAGE); - } - }); + shouldRefreshDb = JOptionPane.showOptionDialog( + frame, Messages.getString("CollectEarthWindow.59"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.60"), //$NON-NLS-1$ + JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); } - private void deleteRecord(String[] csvRow, CollectRecord record) { - try { - recordManager.delete(record.getId()); - messages.add(String.format("Deleted plot with ID %s ", Arrays.toString(csvRow))); - plotsDeleted++; - } catch (RecordPersistenceException e) { - plotsCouldNotBeDeleted++; - messages.add(String.format("Error when deleting plot with ID %s. Error Message: %s", - Arrays.toString(csvRow), e.getMessage())); - logger.error("Error deleting plot with ID " + Arrays.toString(csvRow)); - success = false; - } + if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ + saikuStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); + saikuStarter.initializeAndOpen( startSaikuAfterDBExport); } - }; - - treadDeleting.start(); - - } - - private String[] getKeyAttributesName() { - List keyAttributeDefinitions = survey.getSchema().getRootEntityDefinitions().get(0) - .getKeyAttributeDefinitions(); - String[] keyAttributeNames = new String[keyAttributeDefinitions.size()]; - int i = 0; - for (AttributeDefinition keyAttributeDefinition : keyAttributeDefinitions) { - keyAttributeNames[i++] = keyAttributeDefinition.getName(); - } - return keyAttributeNames; - } - - private JFilePicker getCsvFilePicker() { - if (filePicker == null) { - filePicker = new JFilePicker("Choose the CSV file containing the IDs of the plots to remove", null, - "Explore", DlgMode.MODE_OPEN); - - filePicker.getFileChooser().setAcceptAllFileFilterUsed(false); - filePicker.addFileTypeFilter("csv", " CSV file with plot IDs", true); - - filePicker.addChangeListener(new DocumentListener() { - - @Override - public void removeUpdate(DocumentEvent e) { - // Do not react - } - - @Override - public void insertUpdate(DocumentEvent e) { - validateCsv(filePicker.getTextField().getText()); - } - - @Override - public void changedUpdate(DocumentEvent e) { - validateCsv(filePicker.getTextField().getText()); - } - }); } - return filePicker; } -} +} \ No newline at end of file From c58dac0653430e6ea6b9243b998166ea102955ee Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:18 +0100 Subject: [PATCH 1298/1620] New translations SaikuAnalysisListener.java (Spanish) --- .../earth/app/view/Messages_es.properties | 337 ++---------------- 1 file changed, 37 insertions(+), 300 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index eb9b80be90..29c9a75479 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,326 +1,63 @@ package org.openforis.collect.earth.app.view; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Frame; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JEditorPane; -import javax.swing.JLabel; +import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.SwingUtilities; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.collect.manager.RecordManager; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectSurvey; -import org.openforis.collect.persistence.RecordPersistenceException; -import org.openforis.idm.metamodel.AttributeDefinition; +import org.openforis.collect.earth.app.service.ExportType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; -import com.opencsv.CSVReader; +public class SaikuAnalysisListener implements ActionListener { + private Logger logger = LoggerFactory.getLogger( SaikuAnalysisListener.class); + protected JFrame frame; + protected GenerateDatabaseStarter saikuStarter; -@Component -@Lazy -public class RemovePlotsFromDBDlg { - - @Autowired - private RecordManager recordManager; - - @Autowired - private EarthSurveyService earthSurveyService; - - @SuppressWarnings("unused") - private static final long serialVersionUID = 5175096170385736616L; - private CollectSurvey survey; - private Logger logger = LoggerFactory.getLogger(RemovePlotsFromDBDlg.class); - - private JButton deleteFromDB; - private JFilePicker filePicker; - - private JDialog dlg; - - public RemovePlotsFromDBDlg() { - super(); - } - - private class DeleteResults { - private boolean success; - private Integer plotsDeleted; - private Integer plotsNotFoundInDB; - private Integer plotsErrorWhenDeleting; - private List messages; - - public DeleteResults(boolean success, Integer plotsDeleted, Integer plotsNotFoundInDB, - Integer plotsErrorWhenDeleting, List messages) { - super(); - this.success = success; - this.plotsDeleted = plotsDeleted; - this.plotsNotFoundInDB = plotsNotFoundInDB; - this.plotsErrorWhenDeleting = plotsErrorWhenDeleting; - this.messages = messages; - } - - } - - public void open(Frame owner, CollectSurvey survey) { - this.dlg = new JDialog(owner); - this.survey = survey; - this.dlg.setModal(true); - this.dlg.setSize(new Dimension(700, 350)); - this.dlg.setLocationRelativeTo(owner); - this.dlg.setTitle("Tool for removing plots from DB using a CSV with plot IDs"); - initLayout(); - dlg.setVisible(true); + public SaikuAnalysisListener(JFrame frame, GenerateDatabaseStarter saikuStarter) { + this.frame = frame; + this.saikuStarter = saikuStarter; } - private void initLayout() { - final JPanel panel = new JPanel(new GridBagLayout()); - GridBagConstraints c = new GridBagConstraints(); - - int row = 0; - c.fill = GridBagConstraints.BOTH; - - c.gridx = 0; - c.gridwidth = 2; - panel.add(new JLabel("" - + "This utility deletes plots that are already collected and present in the Collect Earth Database.
" - + "Make sure to backup the data in your DB before attempting to delete plots ( use the Tools->Data Import/Export->Export data to Collect Backup function)." - + "
" - + "The next field expects a CSV file for which the IDs of the plots to be deleted are present.The headers of the columns should be the names of the key attributes of the survey (usually just one, called ID, but it could be more)." - + ""), c); - c.gridy = row++; - - c.gridx = 0; - c.gridwidth = 2; - c.gridy = row++; - panel.add(getCsvFilePicker(), c); - c.gridy = row; - - panel.add(getDeleteButton(), c); - this.dlg.add(panel); - } - - private JButton getDeleteButton() { - if (deleteFromDB == null) { - deleteFromDB = new JButton("Delete plots with IDs in the CSV from the database"); - deleteFromDB.setEnabled(false); - deleteFromDB.addActionListener( e -> { - if (JOptionPane.showConfirmDialog(RemovePlotsFromDBDlg.this.dlg, - "Are you sure you want to remove the plots with the IDs that are specified in the CSV file??", - "Confirm deletion of plots in DB", JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) { - deletePlotsFromDB(); - } - }); - } - return deleteFromDB; - } - - private boolean validateCsv(String filePath) { - boolean validFile = true; - - try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(filePath, false) ){ - - filePicker.setTextBackground(Color.white); - - if (CsvReaderUtils.isCsvFile(filePath)) { - - // Get the first line - String[] csvHeaders = csvReader.readNext(); - String[] expectedHeaders = getKeyAttributesName(); - if (!Arrays.equals(expectedHeaders, csvHeaders)) { - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, - String.format("The Headers of the CSV file used should be %s, instead they are %s", - Arrays.toString(expectedHeaders), - StringUtils.abbreviate(Arrays.toString(csvHeaders), 35))); - filePicker.setTextBackground(Color.red); - validFile = false; - } + @Override + public void actionPerformed(ActionEvent e) { + try { - } else { - - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, - String.format("The file in %s is NOT A CSV file ", filePath)); - validFile = false; - filePicker.setTextBackground(Color.red); - } - } catch (Exception e) { - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, - String.format("Error opening file at %s. %s ", filePath, e.getMessage())); - logger.error("Error while validating the CSV file", e); - validFile = false; + CollectEarthWindow.startWaiting(frame); + exportDataToRDB( true ); + }catch (Exception e1) { + logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ + } finally{ + CollectEarthWindow.endWaiting(frame); } - - getDeleteButton().setEnabled(validFile); - return validFile; } - private void deletePlotsFromDB() { - InfiniteProgressMonitor progressDeletion = new InfiniteProgressMonitor(this.dlg, "Deleting plots", - "Wait while the plots are deleted from the database"); - - Thread treadDeleting = new Thread("Deleting plots from Database") { - int plotsDeleted = 0; - int plotsNotFoundInDB = 0; - int plotsCouldNotBeDeleted = 0; - boolean success = true; - ArrayList messages = new ArrayList<>(); - - @Override - public void run() { - try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(getCsvFilePicker().getSelectedFilePath(), false) ){ - List allLines = csvReader.readAll(); - int totalLines = allLines.size() - 1; - boolean skipFirst = true; - int plot = 0; - progressDeletion.showLater(); - for (String[] csvRow : allLines) { - - if (skipFirst) { - skipFirst = false; - continue; - } - - progressDeletion.updateProgress(++plot, totalLines); - - CollectRecord record = earthSurveyService.loadRecord(csvRow); - if (record == null) { - plotsNotFoundInDB++; - messages.add(String.format(" Could not find plot with ID %s in the Database", - Arrays.toString(csvRow))); - } else { - deleteRecord(csvRow, record); - } - } - - } catch (Exception e) { - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, - "Error reading CSV file or CSV File too big!"); - logger.error("Error while validating the CSV file", e); - success = false; - } finally { - - if (progressDeletion != null) { - progressDeletion.close(); - } - - } - - DeleteResults deleteResults = new DeleteResults(success, plotsDeleted, plotsNotFoundInDB, - plotsCouldNotBeDeleted, messages); - String result = "Plots Deleted : " + deleteResults.plotsDeleted + "
" + - "Plots Not Found :
" + deleteResults.plotsNotFoundInDB + "
" - + "Plots that could not be deleted because a exception : " + deleteResults.plotsErrorWhenDeleting + "
" + - " Messages :
" + StringUtils.join(deleteResults.messages, "
"); - if( success ) { - result = "" - + "Results of the deletion process:
" - + result + ""; - }else { - result = "" - + "There was an error while deleting the plots. Review the Collect Earth Log file in the Help menu.
" - + result + ""; - } - + protected void exportDataToRDB(boolean startSaikuAfterDBExport) { + if( saikuStarter.isStarting() ){ + JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.57"), Messages.getString("CollectEarthWindow.58"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ + }else{ - JEditorPane web = new JEditorPane(); - web.setEditable(false); - web.setContentType("text/html"); - web.setText(result); + int shouldRefreshDb = JOptionPane.YES_OPTION; + if( saikuStarter.shouldShowRdbGenerationOption( ExportType.SAIKU ) ){ - JScrollPane scrollPane = new JScrollPane(web); - scrollPane.setPreferredSize( new Dimension( 450, 350 )); + String refresh = Messages.getString("SaikuAnalysisListener.0"); //$NON-NLS-1$ + String close = Messages.getString("SaikuAnalysisListener.1"); //$NON-NLS-1$ + String[] options = new String[]{ refresh,close}; - // Refresh contents of Google Earth! - EarthApp.executeKmlLoadAsynchronously( null ); - SwingUtilities.invokeLater( () -> { - if (deleteResults.success) { - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, scrollPane, "Success deleting plots", JOptionPane.INFORMATION_MESSAGE); - } else { - - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, scrollPane, "Error deleting plots", JOptionPane.WARNING_MESSAGE); - } - }); + shouldRefreshDb = JOptionPane.showOptionDialog( + frame, Messages.getString("CollectEarthWindow.59"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.60"), //$NON-NLS-1$ + JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); } - private void deleteRecord(String[] csvRow, CollectRecord record) { - try { - recordManager.delete(record.getId()); - messages.add(String.format("Deleted plot with ID %s ", Arrays.toString(csvRow))); - plotsDeleted++; - } catch (RecordPersistenceException e) { - plotsCouldNotBeDeleted++; - messages.add(String.format("Error when deleting plot with ID %s. Error Message: %s", - Arrays.toString(csvRow), e.getMessage())); - logger.error("Error deleting plot with ID " + Arrays.toString(csvRow)); - success = false; - } + if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ + saikuStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); + saikuStarter.initializeAndOpen( startSaikuAfterDBExport); } - }; - - treadDeleting.start(); - - } - - private String[] getKeyAttributesName() { - List keyAttributeDefinitions = survey.getSchema().getRootEntityDefinitions().get(0) - .getKeyAttributeDefinitions(); - String[] keyAttributeNames = new String[keyAttributeDefinitions.size()]; - int i = 0; - for (AttributeDefinition keyAttributeDefinition : keyAttributeDefinitions) { - keyAttributeNames[i++] = keyAttributeDefinition.getName(); - } - return keyAttributeNames; - } - - private JFilePicker getCsvFilePicker() { - if (filePicker == null) { - filePicker = new JFilePicker("Choose the CSV file containing the IDs of the plots to remove", null, - "Explore", DlgMode.MODE_OPEN); - - filePicker.getFileChooser().setAcceptAllFileFilterUsed(false); - filePicker.addFileTypeFilter("csv", " CSV file with plot IDs", true); - - filePicker.addChangeListener(new DocumentListener() { - - @Override - public void removeUpdate(DocumentEvent e) { - // Do not react - } - - @Override - public void insertUpdate(DocumentEvent e) { - validateCsv(filePicker.getTextField().getText()); - } - - @Override - public void changedUpdate(DocumentEvent e) { - validateCsv(filePicker.getTextField().getText()); - } - }); } - return filePicker; } -} +} \ No newline at end of file From 1b742ce2f8e958753f0c91282a1af05df5d10bfa Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:19 +0100 Subject: [PATCH 1299/1620] New translations SaikuAnalysisListener.java (English) --- .../earth/app/view/Messages_en.properties | 337 ++---------------- 1 file changed, 37 insertions(+), 300 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index eb9b80be90..29c9a75479 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,326 +1,63 @@ package org.openforis.collect.earth.app.view; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Frame; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JEditorPane; -import javax.swing.JLabel; +import javax.swing.JFrame; import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.SwingUtilities; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.collect.manager.RecordManager; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectSurvey; -import org.openforis.collect.persistence.RecordPersistenceException; -import org.openforis.idm.metamodel.AttributeDefinition; +import org.openforis.collect.earth.app.service.ExportType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; -import com.opencsv.CSVReader; +public class SaikuAnalysisListener implements ActionListener { + private Logger logger = LoggerFactory.getLogger( SaikuAnalysisListener.class); + protected JFrame frame; + protected GenerateDatabaseStarter saikuStarter; -@Component -@Lazy -public class RemovePlotsFromDBDlg { - - @Autowired - private RecordManager recordManager; - - @Autowired - private EarthSurveyService earthSurveyService; - - @SuppressWarnings("unused") - private static final long serialVersionUID = 5175096170385736616L; - private CollectSurvey survey; - private Logger logger = LoggerFactory.getLogger(RemovePlotsFromDBDlg.class); - - private JButton deleteFromDB; - private JFilePicker filePicker; - - private JDialog dlg; - - public RemovePlotsFromDBDlg() { - super(); - } - - private class DeleteResults { - private boolean success; - private Integer plotsDeleted; - private Integer plotsNotFoundInDB; - private Integer plotsErrorWhenDeleting; - private List messages; - - public DeleteResults(boolean success, Integer plotsDeleted, Integer plotsNotFoundInDB, - Integer plotsErrorWhenDeleting, List messages) { - super(); - this.success = success; - this.plotsDeleted = plotsDeleted; - this.plotsNotFoundInDB = plotsNotFoundInDB; - this.plotsErrorWhenDeleting = plotsErrorWhenDeleting; - this.messages = messages; - } - - } - - public void open(Frame owner, CollectSurvey survey) { - this.dlg = new JDialog(owner); - this.survey = survey; - this.dlg.setModal(true); - this.dlg.setSize(new Dimension(700, 350)); - this.dlg.setLocationRelativeTo(owner); - this.dlg.setTitle("Tool for removing plots from DB using a CSV with plot IDs"); - initLayout(); - dlg.setVisible(true); + public SaikuAnalysisListener(JFrame frame, GenerateDatabaseStarter saikuStarter) { + this.frame = frame; + this.saikuStarter = saikuStarter; } - private void initLayout() { - final JPanel panel = new JPanel(new GridBagLayout()); - GridBagConstraints c = new GridBagConstraints(); - - int row = 0; - c.fill = GridBagConstraints.BOTH; - - c.gridx = 0; - c.gridwidth = 2; - panel.add(new JLabel("" - + "This utility deletes plots that are already collected and present in the Collect Earth Database.
" - + "Make sure to backup the data in your DB before attempting to delete plots ( use the Tools->Data Import/Export->Export data to Collect Backup function)." - + "
" - + "The next field expects a CSV file for which the IDs of the plots to be deleted are present.The headers of the columns should be the names of the key attributes of the survey (usually just one, called ID, but it could be more)." - + ""), c); - c.gridy = row++; - - c.gridx = 0; - c.gridwidth = 2; - c.gridy = row++; - panel.add(getCsvFilePicker(), c); - c.gridy = row; - - panel.add(getDeleteButton(), c); - this.dlg.add(panel); - } - - private JButton getDeleteButton() { - if (deleteFromDB == null) { - deleteFromDB = new JButton("Delete plots with IDs in the CSV from the database"); - deleteFromDB.setEnabled(false); - deleteFromDB.addActionListener( e -> { - if (JOptionPane.showConfirmDialog(RemovePlotsFromDBDlg.this.dlg, - "Are you sure you want to remove the plots with the IDs that are specified in the CSV file??", - "Confirm deletion of plots in DB", JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) { - deletePlotsFromDB(); - } - }); - } - return deleteFromDB; - } - - private boolean validateCsv(String filePath) { - boolean validFile = true; - - try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(filePath, false) ){ - - filePicker.setTextBackground(Color.white); - - if (CsvReaderUtils.isCsvFile(filePath)) { - - // Get the first line - String[] csvHeaders = csvReader.readNext(); - String[] expectedHeaders = getKeyAttributesName(); - if (!Arrays.equals(expectedHeaders, csvHeaders)) { - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, - String.format("The Headers of the CSV file used should be %s, instead they are %s", - Arrays.toString(expectedHeaders), - StringUtils.abbreviate(Arrays.toString(csvHeaders), 35))); - filePicker.setTextBackground(Color.red); - validFile = false; - } + @Override + public void actionPerformed(ActionEvent e) { + try { - } else { - - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, - String.format("The file in %s is NOT A CSV file ", filePath)); - validFile = false; - filePicker.setTextBackground(Color.red); - } - } catch (Exception e) { - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, - String.format("Error opening file at %s. %s ", filePath, e.getMessage())); - logger.error("Error while validating the CSV file", e); - validFile = false; + CollectEarthWindow.startWaiting(frame); + exportDataToRDB( true ); + }catch (Exception e1) { + logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ + } finally{ + CollectEarthWindow.endWaiting(frame); } - - getDeleteButton().setEnabled(validFile); - return validFile; } - private void deletePlotsFromDB() { - InfiniteProgressMonitor progressDeletion = new InfiniteProgressMonitor(this.dlg, "Deleting plots", - "Wait while the plots are deleted from the database"); - - Thread treadDeleting = new Thread("Deleting plots from Database") { - int plotsDeleted = 0; - int plotsNotFoundInDB = 0; - int plotsCouldNotBeDeleted = 0; - boolean success = true; - ArrayList messages = new ArrayList<>(); - - @Override - public void run() { - try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(getCsvFilePicker().getSelectedFilePath(), false) ){ - List allLines = csvReader.readAll(); - int totalLines = allLines.size() - 1; - boolean skipFirst = true; - int plot = 0; - progressDeletion.showLater(); - for (String[] csvRow : allLines) { - - if (skipFirst) { - skipFirst = false; - continue; - } - - progressDeletion.updateProgress(++plot, totalLines); - - CollectRecord record = earthSurveyService.loadRecord(csvRow); - if (record == null) { - plotsNotFoundInDB++; - messages.add(String.format(" Could not find plot with ID %s in the Database", - Arrays.toString(csvRow))); - } else { - deleteRecord(csvRow, record); - } - } - - } catch (Exception e) { - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, - "Error reading CSV file or CSV File too big!"); - logger.error("Error while validating the CSV file", e); - success = false; - } finally { - - if (progressDeletion != null) { - progressDeletion.close(); - } - - } - - DeleteResults deleteResults = new DeleteResults(success, plotsDeleted, plotsNotFoundInDB, - plotsCouldNotBeDeleted, messages); - String result = "Plots Deleted : " + deleteResults.plotsDeleted + "
" + - "Plots Not Found :
" + deleteResults.plotsNotFoundInDB + "
" - + "Plots that could not be deleted because a exception : " + deleteResults.plotsErrorWhenDeleting + "
" + - " Messages :
" + StringUtils.join(deleteResults.messages, "
"); - if( success ) { - result = "" - + "Results of the deletion process:
" - + result + ""; - }else { - result = "" - + "There was an error while deleting the plots. Review the Collect Earth Log file in the Help menu.
" - + result + ""; - } - + protected void exportDataToRDB(boolean startSaikuAfterDBExport) { + if( saikuStarter.isStarting() ){ + JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.57"), Messages.getString("CollectEarthWindow.58"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ + }else{ - JEditorPane web = new JEditorPane(); - web.setEditable(false); - web.setContentType("text/html"); - web.setText(result); + int shouldRefreshDb = JOptionPane.YES_OPTION; + if( saikuStarter.shouldShowRdbGenerationOption( ExportType.SAIKU ) ){ - JScrollPane scrollPane = new JScrollPane(web); - scrollPane.setPreferredSize( new Dimension( 450, 350 )); + String refresh = Messages.getString("SaikuAnalysisListener.0"); //$NON-NLS-1$ + String close = Messages.getString("SaikuAnalysisListener.1"); //$NON-NLS-1$ + String[] options = new String[]{ refresh,close}; - // Refresh contents of Google Earth! - EarthApp.executeKmlLoadAsynchronously( null ); - SwingUtilities.invokeLater( () -> { - if (deleteResults.success) { - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, scrollPane, "Success deleting plots", JOptionPane.INFORMATION_MESSAGE); - } else { - - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, scrollPane, "Error deleting plots", JOptionPane.WARNING_MESSAGE); - } - }); + shouldRefreshDb = JOptionPane.showOptionDialog( + frame, Messages.getString("CollectEarthWindow.59"), //$NON-NLS-1$ + Messages.getString("CollectEarthWindow.60"), //$NON-NLS-1$ + JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); } - private void deleteRecord(String[] csvRow, CollectRecord record) { - try { - recordManager.delete(record.getId()); - messages.add(String.format("Deleted plot with ID %s ", Arrays.toString(csvRow))); - plotsDeleted++; - } catch (RecordPersistenceException e) { - plotsCouldNotBeDeleted++; - messages.add(String.format("Error when deleting plot with ID %s. Error Message: %s", - Arrays.toString(csvRow), e.getMessage())); - logger.error("Error deleting plot with ID " + Arrays.toString(csvRow)); - success = false; - } + if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ + saikuStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); + saikuStarter.initializeAndOpen( startSaikuAfterDBExport); } - }; - - treadDeleting.start(); - - } - - private String[] getKeyAttributesName() { - List keyAttributeDefinitions = survey.getSchema().getRootEntityDefinitions().get(0) - .getKeyAttributeDefinitions(); - String[] keyAttributeNames = new String[keyAttributeDefinitions.size()]; - int i = 0; - for (AttributeDefinition keyAttributeDefinition : keyAttributeDefinitions) { - keyAttributeNames[i++] = keyAttributeDefinition.getName(); - } - return keyAttributeNames; - } - - private JFilePicker getCsvFilePicker() { - if (filePicker == null) { - filePicker = new JFilePicker("Choose the CSV file containing the IDs of the plots to remove", null, - "Explore", DlgMode.MODE_OPEN); - - filePicker.getFileChooser().setAcceptAllFileFilterUsed(false); - filePicker.addFileTypeFilter("csv", " CSV file with plot IDs", true); - - filePicker.addChangeListener(new DocumentListener() { - - @Override - public void removeUpdate(DocumentEvent e) { - // Do not react - } - - @Override - public void insertUpdate(DocumentEvent e) { - validateCsv(filePicker.getTextField().getText()); - } - - @Override - public void changedUpdate(DocumentEvent e) { - validateCsv(filePicker.getTextField().getText()); - } - }); } - return filePicker; } -} +} \ No newline at end of file From 67d050b7c6682b35e618b66063489c22e6c559f3 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:20 +0100 Subject: [PATCH 1300/1620] New translations CollectEarthUtils.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 444 +++++++----------- 1 file changed, 163 insertions(+), 281 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index eb9b80be90..8fa17ec627 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,326 +1,208 @@ -package org.openforis.collect.earth.app.view; - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Frame; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.util.ArrayList; -import java.util.Arrays; +package org.openforis.collect.earth.app; + +import java.awt.Desktop; +import java.awt.Font; +import java.awt.FontFormatException; +import java.awt.GraphicsEnvironment; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.sql.Connection; +import java.sql.DriverManager; +import java.util.Enumeration; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JEditorPane; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.SwingUtilities; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; +import javax.swing.UIManager; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.desktop.EarthApp; -import org.openforis.collect.earth.app.service.EarthSurveyService; -import org.openforis.collect.earth.app.view.JFilePicker.DlgMode; -import org.openforis.collect.earth.core.utils.CsvReaderUtils; -import org.openforis.collect.manager.RecordManager; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectSurvey; -import org.openforis.collect.persistence.RecordPersistenceException; -import org.openforis.idm.metamodel.AttributeDefinition; +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.commons.lang3.SystemUtils; +import org.openforis.collect.earth.app.EarthConstants.UI_LANGUAGE; +import org.openforis.collect.earth.app.view.Messages; +import org.postgresql.Driver; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; - -import com.opencsv.CSVReader; - -@Component -@Lazy -public class RemovePlotsFromDBDlg { - - @Autowired - private RecordManager recordManager; - @Autowired - private EarthSurveyService earthSurveyService; +import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.exception.ZipException; +import net.lingala.zip4j.model.ZipParameters; +import net.lingala.zip4j.model.enums.CompressionLevel; +import net.lingala.zip4j.model.enums.CompressionMethod; - @SuppressWarnings("unused") - private static final long serialVersionUID = 5175096170385736616L; - private CollectSurvey survey; - private Logger logger = LoggerFactory.getLogger(RemovePlotsFromDBDlg.class); +public class CollectEarthUtils { - private JButton deleteFromDB; - private JFilePicker filePicker; + private static final Logger logger = LoggerFactory.getLogger(CollectEarthUtils.class); - private JDialog dlg; - - public RemovePlotsFromDBDlg() { - super(); + private CollectEarthUtils() { } - private class DeleteResults { - private boolean success; - private Integer plotsDeleted; - private Integer plotsNotFoundInDB; - private Integer plotsErrorWhenDeleting; - private List messages; + public static String getMd5FromFolder(File folder) throws IOException { - public DeleteResults(boolean success, Integer plotsDeleted, Integer plotsNotFoundInDB, - Integer plotsErrorWhenDeleting, List messages) { - super(); - this.success = success; - this.plotsDeleted = plotsDeleted; - this.plotsNotFoundInDB = plotsNotFoundInDB; - this.plotsErrorWhenDeleting = plotsErrorWhenDeleting; - this.messages = messages; + if (!folder.isDirectory()) { + throw new IllegalArgumentException("The file passed as an argument needs to be a folder!"); } + StringBuilder md5Hex = new StringBuilder(); + try( Stream paths = Files.walk(Paths.get(folder.toURI()), 3); ) { + List listFiles = paths.filter(Files::isRegularFile).map(Path::toFile) + .collect(Collectors.toList()); + for (File file : listFiles) { + md5Hex.append(DigestUtils.md5Hex(new FileInputStream(file))); + } + return DigestUtils.md5Hex(md5Hex.toString().getBytes()); + } } - public void open(Frame owner, CollectSurvey survey) { - this.dlg = new JDialog(owner); - this.survey = survey; - this.dlg.setModal(true); - this.dlg.setSize(new Dimension(700, 350)); - this.dlg.setLocationRelativeTo(owner); - this.dlg.setTitle("Tool for removing plots from DB using a CSV with plot IDs"); - initLayout(); - dlg.setVisible(true); + public static String getMd5FromFile(String filePath) throws IOException { + return DigestUtils.md5Hex(new FileInputStream(new File(filePath))); } - private void initLayout() { - final JPanel panel = new JPanel(new GridBagLayout()); - GridBagConstraints c = new GridBagConstraints(); - - int row = 0; - c.fill = GridBagConstraints.BOTH; - - c.gridx = 0; - c.gridwidth = 2; - panel.add(new JLabel("" - + "This utility deletes plots that are already collected and present in the Collect Earth Database.
" - + "Make sure to backup the data in your DB before attempting to delete plots ( use the Tools->Data Import/Export->Export data to Collect Backup function)." - + "
" - + "The next field expects a CSV file for which the IDs of the plots to be deleted are present.The headers of the columns should be the names of the key attributes of the survey (usually just one, called ID, but it could be more)." - + ""), c); - c.gridy = row++; + public static void setFontDependingOnLanguaue(UI_LANGUAGE uiLanguage) { + if (uiLanguage == UI_LANGUAGE.LO) { + String ttfFileName = "Phetsarath_OT.ttf"; + // create the font + setUiFont(ttfFileName); + } else if (uiLanguage == UI_LANGUAGE.MN) { + String ttfFileName = "arhangai.ttf"; + // create the font + setUiFont(ttfFileName); + } else { + CollectEarthUtils.setUiFont(new javax.swing.plaf.FontUIResource("Arial Unicode MS", Font.PLAIN, 12)); + } + } - c.gridx = 0; - c.gridwidth = 2; - c.gridy = row++; - panel.add(getCsvFilePicker(), c); - c.gridy = row; + public static void setUiFont(String ttfFileName) { + try { + // create the font to use. Specify the size! + InputStream fontStream = CollectEarthUtils.class.getResourceAsStream(ttfFileName); + Font laoFont = Font.createFont(Font.TRUETYPE_FONT, fontStream).deriveFont(12f); + GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); + // register the font + ge.registerFont(laoFont); + CollectEarthUtils.setUiFont(new javax.swing.plaf.FontUIResource(laoFont.getFontName(), Font.PLAIN, 12)); + } catch (IOException | FontFormatException e) { + logger.error("error setting the font " + ttfFileName, e); + } - panel.add(getDeleteButton(), c); - this.dlg.add(panel); } - private JButton getDeleteButton() { - if (deleteFromDB == null) { - deleteFromDB = new JButton("Delete plots with IDs in the CSV from the database"); - deleteFromDB.setEnabled(false); - deleteFromDB.addActionListener( e -> { - if (JOptionPane.showConfirmDialog(RemovePlotsFromDBDlg.this.dlg, - "Are you sure you want to remove the plots with the IDs that are specified in the CSV file??", - "Confirm deletion of plots in DB", JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) { - deletePlotsFromDB(); - } - }); + private static void setUiFont(javax.swing.plaf.FontUIResource f) { + Enumeration keys = UIManager.getDefaults().keys(); + while (keys.hasMoreElements()) { + Object key = keys.nextElement(); + Object value = UIManager.get(key); + if (value instanceof javax.swing.plaf.FontUIResource) + UIManager.put(key, f); } - return deleteFromDB; } - private boolean validateCsv(String filePath) { - boolean validFile = true; - - try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(filePath, false) ){ - - filePicker.setTextBackground(Color.white); - - if (CsvReaderUtils.isCsvFile(filePath)) { - - // Get the first line - String[] csvHeaders = csvReader.readNext(); - String[] expectedHeaders = getKeyAttributesName(); - if (!Arrays.equals(expectedHeaders, csvHeaders)) { - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, - String.format("The Headers of the CSV file used should be %s, instead they are %s", - Arrays.toString(expectedHeaders), - StringUtils.abbreviate(Arrays.toString(csvHeaders), 35))); - filePicker.setTextBackground(Color.red); - validFile = false; - } - - } else { - - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, - String.format("The file in %s is NOT A CSV file ", filePath)); - validFile = false; - filePicker.setTextBackground(Color.red); - } - } catch (Exception e) { - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, - String.format("Error opening file at %s. %s ", filePath, e.getMessage())); - logger.error("Error while validating the CSV file", e); - validFile = false; + public static ZipFile addFileToZip(String pathToDestinationZip, File fileToAdd, String fileNameInZip) throws IOException { + File destinationZip = new File(pathToDestinationZip); + return addFileToZip(destinationZip, fileToAdd, fileNameInZip); + } + + public static ZipFile addFileToZip(File destinationZip, File fileToAdd, String fileNameInZip) throws IOException { + try( ZipFile zipFile = new ZipFile(destinationZip) ){ + ZipParameters zipParameters = new ZipParameters(); + // COMP_DEFLATE is for compression + zipParameters.setCompressionMethod(CompressionMethod.DEFLATE); + // DEFLATE_LEVEL_ULTRA = maximum compression + zipParameters.setCompressionLevel(CompressionLevel.ULTRA); + zipParameters.setFileNameInZip(fileNameInZip); + zipFile.addFile(fileToAdd, zipParameters); + return zipFile; + }catch(Exception e) { + logger.error("Error adding file to ZIP", e); + return null; } - - getDeleteButton().setEnabled(validFile); - return validFile; } - private void deletePlotsFromDB() { - InfiniteProgressMonitor progressDeletion = new InfiniteProgressMonitor(this.dlg, "Deleting plots", - "Wait while the plots are deleted from the database"); - - Thread treadDeleting = new Thread("Deleting plots from Database") { - int plotsDeleted = 0; - int plotsNotFoundInDB = 0; - int plotsCouldNotBeDeleted = 0; - boolean success = true; - ArrayList messages = new ArrayList<>(); - - @Override - public void run() { - try ( CSVReader csvReader = CsvReaderUtils.getCsvReader(getCsvFilePicker().getSelectedFilePath(), false) ){ - List allLines = csvReader.readAll(); - int totalLines = allLines.size() - 1; - boolean skipFirst = true; - int plot = 0; - progressDeletion.showLater(); - for (String[] csvRow : allLines) { - - if (skipFirst) { - skipFirst = false; - continue; - } - - progressDeletion.updateProgress(++plot, totalLines); - - CollectRecord record = earthSurveyService.loadRecord(csvRow); - if (record == null) { - plotsNotFoundInDB++; - messages.add(String.format(" Could not find plot with ID %s in the Database", - Arrays.toString(csvRow))); - } else { - deleteRecord(csvRow, record); - } - } - - } catch (Exception e) { - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, - "Error reading CSV file or CSV File too big!"); - logger.error("Error while validating the CSV file", e); - success = false; - } finally { - - if (progressDeletion != null) { - progressDeletion.close(); - } - - } - - DeleteResults deleteResults = new DeleteResults(success, plotsDeleted, plotsNotFoundInDB, - plotsCouldNotBeDeleted, messages); - String result = "Plots Deleted : " + deleteResults.plotsDeleted + "
" + - "Plots Not Found :
" + deleteResults.plotsNotFoundInDB + "
" - + "Plots that could not be deleted because a exception : " + deleteResults.plotsErrorWhenDeleting + "
" + - " Messages :
" + StringUtils.join(deleteResults.messages, "
"); - if( success ) { - result = "" - + "Results of the deletion process:
" - + result + ""; - }else { - result = "" - + "There was an error while deleting the plots. Review the Collect Earth Log file in the Help menu.
" - + result + ""; - } - - - JEditorPane web = new JEditorPane(); - web.setEditable(false); - web.setContentType("text/html"); - web.setText(result); - - - JScrollPane scrollPane = new JScrollPane(web); - scrollPane.setPreferredSize( new Dimension( 450, 350 )); + public static String getComputerIp() { + try { + return InetAddress.getLocalHost().getHostAddress(); + } catch (final UnknownHostException e) { + logger.warn("Unknown IP address", e); //$NON-NLS-1$ + return Messages.getString("OptionWizard.11"); //$NON-NLS-1$ + } + } - // Refresh contents of Google Earth! - EarthApp.executeKmlLoadAsynchronously( null ); + public static void addFolderToZip(ZipFile zipFile, File folderToCompress) throws ZipException { + ZipParameters zipParameters = new ZipParameters(); + // COMP_DEFLATE is for compression + zipParameters.setCompressionMethod(CompressionMethod.DEFLATE); + // DEFLATE_LEVEL_ULTRA = maximum compression + zipParameters.setCompressionLevel(CompressionLevel.ULTRA); - SwingUtilities.invokeLater( () -> { - if (deleteResults.success) { - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, scrollPane, "Success deleting plots", JOptionPane.INFORMATION_MESSAGE); - } else { + if (folderToCompress.exists() && folderToCompress.isDirectory()) { + zipFile.addFolder(folderToCompress, zipParameters); + } + } - JOptionPane.showMessageDialog(RemovePlotsFromDBDlg.this.dlg, scrollPane, "Error deleting plots", JOptionPane.WARNING_MESSAGE); - } - }); + public static void openFolderInExplorer(String folder) throws IOException { + if (Desktop.isDesktopSupported()) { + Desktop.getDesktop().open(new File(folder)); + } else { + if (SystemUtils.IS_OS_WINDOWS) { + new ProcessBuilder("explorer.exe", "/open," + folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } else if (SystemUtils.IS_OS_MAC) { + new ProcessBuilder("usr/bin/open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } else if (SystemUtils.IS_OS_UNIX) { + tryUnixFileExplorers(folder); } + } + } - private void deleteRecord(String[] csvRow, CollectRecord record) { + public static void tryUnixFileExplorers(String folder) throws IOException { + try { + new ProcessBuilder("nautilus", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (IOException e1) { + try { + new ProcessBuilder("gnome-open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (IOException e2) { try { - recordManager.delete(record.getId()); - messages.add(String.format("Deleted plot with ID %s ", Arrays.toString(csvRow))); - plotsDeleted++; - } catch (RecordPersistenceException e) { - plotsCouldNotBeDeleted++; - messages.add(String.format("Error when deleting plot with ID %s. Error Message: %s", - Arrays.toString(csvRow), e.getMessage())); - logger.error("Error deleting plot with ID " + Arrays.toString(csvRow)); - success = false; + new ProcessBuilder("kde-open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (IOException e3) { + new ProcessBuilder("caja", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ } } - }; - - treadDeleting.start(); - + } } - private String[] getKeyAttributesName() { - List keyAttributeDefinitions = survey.getSchema().getRootEntityDefinitions().get(0) - .getKeyAttributeDefinitions(); - String[] keyAttributeNames = new String[keyAttributeDefinitions.size()]; - int i = 0; - for (AttributeDefinition keyAttributeDefinition : keyAttributeDefinitions) { - keyAttributeNames[i++] = keyAttributeDefinition.getName(); + public static boolean openFile(File fileToOpenWithOSViewer) { + boolean success = false; + if (Desktop.isDesktopSupported()) { + try { + Desktop.getDesktop().open(fileToOpenWithOSViewer); + success = true; + } catch (IOException ex) { + logger.warn("No application registered to open file {}", fileToOpenWithOSViewer.getAbsolutePath()); //$NON-NLS-1$ + } } - return keyAttributeNames; + return success; } - private JFilePicker getCsvFilePicker() { - if (filePicker == null) { - filePicker = new JFilePicker("Choose the CSV file containing the IDs of the plots to remove", null, - "Explore", DlgMode.MODE_OPEN); - - filePicker.getFileChooser().setAcceptAllFileFilterUsed(false); - filePicker.addFileTypeFilter("csv", " CSV file with plot IDs", true); - - filePicker.addChangeListener(new DocumentListener() { - - @Override - public void removeUpdate(DocumentEvent e) { - // Do not react - } - - @Override - public void insertUpdate(DocumentEvent e) { - validateCsv(filePicker.getTextField().getText()); - } - - @Override - public void changedUpdate(DocumentEvent e) { - validateCsv(filePicker.getTextField().getText()); - } - }); + public static String testPostgreSQLConnection(String host, String port, String dbName, String username, + String password) { + String message = "Connection OK!"; + try { + Driver postgresDriver = new Driver(); + DriverManager.registerDriver(postgresDriver, null); + String url = "jdbc:postgresql://" + host + ":" + port + "/" + dbName; + try( Connection conn = DriverManager.getConnection(url, username, password) ){ + logger.debug("PostgreSQL Connection is valid! {}", conn.isValid(10) );// 10 sec + } + } catch (Exception e) { + logger.error("Error connecting to DB while testing", e); + message = e.getMessage(); } - return filePicker; + return message; } } From 8d50226dbd043bc54b06e80b58b1a3f0a5a5dd9b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:21 +0100 Subject: [PATCH 1301/1620] New translations SaikuStarter.java (French) --- .../earth/app/view/Messages_fr.properties | 98 +++++++++++-------- 1 file changed, 55 insertions(+), 43 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 29c9a75479..220f8ccd9f 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,63 +1,75 @@ package org.openforis.collect.earth.app.view; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - import javax.swing.JFrame; import javax.swing.JOptionPane; +import org.openforis.collect.earth.app.service.AnalysisSaikuService; import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.SaikuExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class SaikuAnalysisListener implements ActionListener { - private Logger logger = LoggerFactory.getLogger( SaikuAnalysisListener.class); - protected JFrame frame; - protected GenerateDatabaseStarter saikuStarter; - - public SaikuAnalysisListener(JFrame frame, GenerateDatabaseStarter saikuStarter) { - this.frame = frame; - this.saikuStarter = saikuStarter; - } +final class SaikuStarter { - @Override - public void actionPerformed(ActionEvent e) { - try { + private Logger logger = LoggerFactory.getLogger( SaikuStarter.class); + private JFrame frame; + private AnalysisSaikuService saikuService; + private boolean shouldRefreshDb; + private boolean starting = false; + private InfiniteProgressMonitor progressStartSaiku; - CollectEarthWindow.startWaiting(frame); - exportDataToRDB( true ); - }catch (Exception e1) { - logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ - } finally{ - CollectEarthWindow.endWaiting(frame); - } + public boolean isShouldRefreshDb() { + return shouldRefreshDb; } - protected void exportDataToRDB(boolean startSaikuAfterDBExport) { - if( saikuStarter.isStarting() ){ - JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.57"), Messages.getString("CollectEarthWindow.58"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ - }else{ - - int shouldRefreshDb = JOptionPane.YES_OPTION; - - if( saikuStarter.shouldShowRdbGenerationOption( ExportType.SAIKU ) ){ - - String refresh = Messages.getString("SaikuAnalysisListener.0"); //$NON-NLS-1$ - String close = Messages.getString("SaikuAnalysisListener.1"); //$NON-NLS-1$ - String[] options = new String[]{ refresh,close}; + public void setShouldRefreshDb(boolean shouldRefreshDb) { + this.shouldRefreshDb = shouldRefreshDb; + } + SaikuStarter( final AnalysisSaikuService saikuService, final JFrame frame) { + super(); + this.saikuService = saikuService; + this.frame = frame; + } + + public boolean shouldShowRdbGenerationOption(){ + return saikuService.isRdbAlreadyGenerated( ExportType.SAIKU); + } - shouldRefreshDb = JOptionPane.showOptionDialog( - frame, Messages.getString("CollectEarthWindow.59"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.60"), //$NON-NLS-1$ - JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); + public boolean isStarting() { + return starting; + } + + public void initializeAndOpen(boolean startSaikuAfterDBExport) { + progressStartSaiku = new InfiniteProgressMonitor( frame, Messages.getString("SaikuStarter.1"), Messages.getString("SaikuStarter.2")); //$NON-NLS-1$ //$NON-NLS-2$ + + Thread threadInitializingSaiku = new Thread("Start Saiku server/initialize RDB"){ //$NON-NLS-1$ + @Override + public void run() { + starting = true; + saikuService.setRefreshDatabase( shouldRefreshDb ); + try { + saikuService.prepareDataForAnalysis(progressStartSaiku, startSaikuAfterDBExport); + }catch ( SaikuExecutionException e1) { + JOptionPane.showMessageDialog( frame , "" + Messages.getString("CollectEarthWindow.29") + "
" +Messages.getString("CollectEarthWindow.40") + "
" + e1.getMessage() + "", Messages.getString("CollectEarthWindow.47"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ + logger.warn("The saiku server is not configured", e1); //$NON-NLS-1$ + } catch ( RuntimeException e) { + logger.error("Error starting Saiku", e); //$NON-NLS-1$ + } finally{ + starting = false; + if( progressStartSaiku != null ){ + progressStartSaiku.close(); + } + } } + }; + + threadInitializingSaiku.start(); - if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ - saikuStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); - saikuStarter.initializeAndOpen( startSaikuAfterDBExport); - } + progressStartSaiku.showLater(); + + if( progressStartSaiku.isUserCancelled() ){ + saikuService.setUserCancelledOperation(true); } } - } \ No newline at end of file From 9c7a4286b5301181371ef8bb8804008731fbd6f0 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:22 +0100 Subject: [PATCH 1302/1620] New translations SaikuStarter.java (Spanish) --- .../earth/app/view/Messages_es.properties | 98 +++++++++++-------- 1 file changed, 55 insertions(+), 43 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 29c9a75479..220f8ccd9f 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,63 +1,75 @@ package org.openforis.collect.earth.app.view; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - import javax.swing.JFrame; import javax.swing.JOptionPane; +import org.openforis.collect.earth.app.service.AnalysisSaikuService; import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.SaikuExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class SaikuAnalysisListener implements ActionListener { - private Logger logger = LoggerFactory.getLogger( SaikuAnalysisListener.class); - protected JFrame frame; - protected GenerateDatabaseStarter saikuStarter; - - public SaikuAnalysisListener(JFrame frame, GenerateDatabaseStarter saikuStarter) { - this.frame = frame; - this.saikuStarter = saikuStarter; - } +final class SaikuStarter { - @Override - public void actionPerformed(ActionEvent e) { - try { + private Logger logger = LoggerFactory.getLogger( SaikuStarter.class); + private JFrame frame; + private AnalysisSaikuService saikuService; + private boolean shouldRefreshDb; + private boolean starting = false; + private InfiniteProgressMonitor progressStartSaiku; - CollectEarthWindow.startWaiting(frame); - exportDataToRDB( true ); - }catch (Exception e1) { - logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ - } finally{ - CollectEarthWindow.endWaiting(frame); - } + public boolean isShouldRefreshDb() { + return shouldRefreshDb; } - protected void exportDataToRDB(boolean startSaikuAfterDBExport) { - if( saikuStarter.isStarting() ){ - JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.57"), Messages.getString("CollectEarthWindow.58"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ - }else{ - - int shouldRefreshDb = JOptionPane.YES_OPTION; - - if( saikuStarter.shouldShowRdbGenerationOption( ExportType.SAIKU ) ){ - - String refresh = Messages.getString("SaikuAnalysisListener.0"); //$NON-NLS-1$ - String close = Messages.getString("SaikuAnalysisListener.1"); //$NON-NLS-1$ - String[] options = new String[]{ refresh,close}; + public void setShouldRefreshDb(boolean shouldRefreshDb) { + this.shouldRefreshDb = shouldRefreshDb; + } + SaikuStarter( final AnalysisSaikuService saikuService, final JFrame frame) { + super(); + this.saikuService = saikuService; + this.frame = frame; + } + + public boolean shouldShowRdbGenerationOption(){ + return saikuService.isRdbAlreadyGenerated( ExportType.SAIKU); + } - shouldRefreshDb = JOptionPane.showOptionDialog( - frame, Messages.getString("CollectEarthWindow.59"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.60"), //$NON-NLS-1$ - JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); + public boolean isStarting() { + return starting; + } + + public void initializeAndOpen(boolean startSaikuAfterDBExport) { + progressStartSaiku = new InfiniteProgressMonitor( frame, Messages.getString("SaikuStarter.1"), Messages.getString("SaikuStarter.2")); //$NON-NLS-1$ //$NON-NLS-2$ + + Thread threadInitializingSaiku = new Thread("Start Saiku server/initialize RDB"){ //$NON-NLS-1$ + @Override + public void run() { + starting = true; + saikuService.setRefreshDatabase( shouldRefreshDb ); + try { + saikuService.prepareDataForAnalysis(progressStartSaiku, startSaikuAfterDBExport); + }catch ( SaikuExecutionException e1) { + JOptionPane.showMessageDialog( frame , "" + Messages.getString("CollectEarthWindow.29") + "
" +Messages.getString("CollectEarthWindow.40") + "
" + e1.getMessage() + "", Messages.getString("CollectEarthWindow.47"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ + logger.warn("The saiku server is not configured", e1); //$NON-NLS-1$ + } catch ( RuntimeException e) { + logger.error("Error starting Saiku", e); //$NON-NLS-1$ + } finally{ + starting = false; + if( progressStartSaiku != null ){ + progressStartSaiku.close(); + } + } } + }; + + threadInitializingSaiku.start(); - if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ - saikuStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); - saikuStarter.initializeAndOpen( startSaikuAfterDBExport); - } + progressStartSaiku.showLater(); + + if( progressStartSaiku.isUserCancelled() ){ + saikuService.setUserCancelledOperation(true); } } - } \ No newline at end of file From ba11ccfe5ef1970ace03a62af758c46df7218252 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:23 +0100 Subject: [PATCH 1303/1620] New translations SaikuStarter.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 241 ++++-------------- 1 file changed, 54 insertions(+), 187 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 8fa17ec627..220f8ccd9f 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,208 +1,75 @@ -package org.openforis.collect.earth.app; +package org.openforis.collect.earth.app.view; -import java.awt.Desktop; -import java.awt.Font; -import java.awt.FontFormatException; -import java.awt.GraphicsEnvironment; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.sql.Connection; -import java.sql.DriverManager; -import java.util.Enumeration; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; +import javax.swing.JFrame; +import javax.swing.JOptionPane; -import javax.swing.UIManager; - -import org.apache.commons.codec.digest.DigestUtils; -import org.apache.commons.lang3.SystemUtils; -import org.openforis.collect.earth.app.EarthConstants.UI_LANGUAGE; -import org.openforis.collect.earth.app.view.Messages; -import org.postgresql.Driver; +import org.openforis.collect.earth.app.service.AnalysisSaikuService; +import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.SaikuExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import net.lingala.zip4j.ZipFile; -import net.lingala.zip4j.exception.ZipException; -import net.lingala.zip4j.model.ZipParameters; -import net.lingala.zip4j.model.enums.CompressionLevel; -import net.lingala.zip4j.model.enums.CompressionMethod; - -public class CollectEarthUtils { - - private static final Logger logger = LoggerFactory.getLogger(CollectEarthUtils.class); - - private CollectEarthUtils() { - } - - public static String getMd5FromFolder(File folder) throws IOException { - - if (!folder.isDirectory()) { - throw new IllegalArgumentException("The file passed as an argument needs to be a folder!"); - } - StringBuilder md5Hex = new StringBuilder(); - - try( Stream paths = Files.walk(Paths.get(folder.toURI()), 3); ) { - List listFiles = paths.filter(Files::isRegularFile).map(Path::toFile) - .collect(Collectors.toList()); - for (File file : listFiles) { - md5Hex.append(DigestUtils.md5Hex(new FileInputStream(file))); - } - return DigestUtils.md5Hex(md5Hex.toString().getBytes()); - } - } - - public static String getMd5FromFile(String filePath) throws IOException { - return DigestUtils.md5Hex(new FileInputStream(new File(filePath))); - } - - public static void setFontDependingOnLanguaue(UI_LANGUAGE uiLanguage) { - if (uiLanguage == UI_LANGUAGE.LO) { - String ttfFileName = "Phetsarath_OT.ttf"; - // create the font - setUiFont(ttfFileName); - } else if (uiLanguage == UI_LANGUAGE.MN) { - String ttfFileName = "arhangai.ttf"; - // create the font - setUiFont(ttfFileName); - } else { - CollectEarthUtils.setUiFont(new javax.swing.plaf.FontUIResource("Arial Unicode MS", Font.PLAIN, 12)); - } - } +final class SaikuStarter { - public static void setUiFont(String ttfFileName) { - try { - // create the font to use. Specify the size! - InputStream fontStream = CollectEarthUtils.class.getResourceAsStream(ttfFileName); - Font laoFont = Font.createFont(Font.TRUETYPE_FONT, fontStream).deriveFont(12f); - GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); - // register the font - ge.registerFont(laoFont); - CollectEarthUtils.setUiFont(new javax.swing.plaf.FontUIResource(laoFont.getFontName(), Font.PLAIN, 12)); - } catch (IOException | FontFormatException e) { - logger.error("error setting the font " + ttfFileName, e); - } + private Logger logger = LoggerFactory.getLogger( SaikuStarter.class); + private JFrame frame; + private AnalysisSaikuService saikuService; + private boolean shouldRefreshDb; + private boolean starting = false; + private InfiniteProgressMonitor progressStartSaiku; + public boolean isShouldRefreshDb() { + return shouldRefreshDb; } - private static void setUiFont(javax.swing.plaf.FontUIResource f) { - Enumeration keys = UIManager.getDefaults().keys(); - while (keys.hasMoreElements()) { - Object key = keys.nextElement(); - Object value = UIManager.get(key); - if (value instanceof javax.swing.plaf.FontUIResource) - UIManager.put(key, f); - } + public void setShouldRefreshDb(boolean shouldRefreshDb) { + this.shouldRefreshDb = shouldRefreshDb; } - public static ZipFile addFileToZip(String pathToDestinationZip, File fileToAdd, String fileNameInZip) throws IOException { - File destinationZip = new File(pathToDestinationZip); - return addFileToZip(destinationZip, fileToAdd, fileNameInZip); + SaikuStarter( final AnalysisSaikuService saikuService, final JFrame frame) { + super(); + this.saikuService = saikuService; + this.frame = frame; } - public static ZipFile addFileToZip(File destinationZip, File fileToAdd, String fileNameInZip) throws IOException { - try( ZipFile zipFile = new ZipFile(destinationZip) ){ - ZipParameters zipParameters = new ZipParameters(); - // COMP_DEFLATE is for compression - zipParameters.setCompressionMethod(CompressionMethod.DEFLATE); - // DEFLATE_LEVEL_ULTRA = maximum compression - zipParameters.setCompressionLevel(CompressionLevel.ULTRA); - zipParameters.setFileNameInZip(fileNameInZip); - zipFile.addFile(fileToAdd, zipParameters); - return zipFile; - }catch(Exception e) { - logger.error("Error adding file to ZIP", e); - return null; - } + public boolean shouldShowRdbGenerationOption(){ + return saikuService.isRdbAlreadyGenerated( ExportType.SAIKU); } - public static String getComputerIp() { - try { - return InetAddress.getLocalHost().getHostAddress(); - } catch (final UnknownHostException e) { - logger.warn("Unknown IP address", e); //$NON-NLS-1$ - return Messages.getString("OptionWizard.11"); //$NON-NLS-1$ - } - } - - public static void addFolderToZip(ZipFile zipFile, File folderToCompress) throws ZipException { - ZipParameters zipParameters = new ZipParameters(); - // COMP_DEFLATE is for compression - zipParameters.setCompressionMethod(CompressionMethod.DEFLATE); - // DEFLATE_LEVEL_ULTRA = maximum compression - zipParameters.setCompressionLevel(CompressionLevel.ULTRA); - - if (folderToCompress.exists() && folderToCompress.isDirectory()) { - zipFile.addFolder(folderToCompress, zipParameters); - } + public boolean isStarting() { + return starting; } - - public static void openFolderInExplorer(String folder) throws IOException { - if (Desktop.isDesktopSupported()) { - Desktop.getDesktop().open(new File(folder)); - } else { - if (SystemUtils.IS_OS_WINDOWS) { - new ProcessBuilder("explorer.exe", "/open," + folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } else if (SystemUtils.IS_OS_MAC) { - new ProcessBuilder("usr/bin/open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } else if (SystemUtils.IS_OS_UNIX) { - tryUnixFileExplorers(folder); - } - } - } - - public static void tryUnixFileExplorers(String folder) throws IOException { - try { - new ProcessBuilder("nautilus", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (IOException e1) { - try { - new ProcessBuilder("gnome-open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (IOException e2) { + + public void initializeAndOpen(boolean startSaikuAfterDBExport) { + progressStartSaiku = new InfiniteProgressMonitor( frame, Messages.getString("SaikuStarter.1"), Messages.getString("SaikuStarter.2")); //$NON-NLS-1$ //$NON-NLS-2$ + + Thread threadInitializingSaiku = new Thread("Start Saiku server/initialize RDB"){ //$NON-NLS-1$ + @Override + public void run() { + starting = true; + saikuService.setRefreshDatabase( shouldRefreshDb ); try { - new ProcessBuilder("kde-open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (IOException e3) { - new ProcessBuilder("caja", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + saikuService.prepareDataForAnalysis(progressStartSaiku, startSaikuAfterDBExport); + }catch ( SaikuExecutionException e1) { + JOptionPane.showMessageDialog( frame , "" + Messages.getString("CollectEarthWindow.29") + "
" +Messages.getString("CollectEarthWindow.40") + "
" + e1.getMessage() + "", Messages.getString("CollectEarthWindow.47"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ + logger.warn("The saiku server is not configured", e1); //$NON-NLS-1$ + } catch ( RuntimeException e) { + logger.error("Error starting Saiku", e); //$NON-NLS-1$ + } finally{ + starting = false; + if( progressStartSaiku != null ){ + progressStartSaiku.close(); + } } } + }; + + threadInitializingSaiku.start(); + + progressStartSaiku.showLater(); + + if( progressStartSaiku.isUserCancelled() ){ + saikuService.setUserCancelledOperation(true); } } - - public static boolean openFile(File fileToOpenWithOSViewer) { - boolean success = false; - if (Desktop.isDesktopSupported()) { - try { - Desktop.getDesktop().open(fileToOpenWithOSViewer); - success = true; - } catch (IOException ex) { - logger.warn("No application registered to open file {}", fileToOpenWithOSViewer.getAbsolutePath()); //$NON-NLS-1$ - } - } - return success; - } - - public static String testPostgreSQLConnection(String host, String port, String dbName, String username, - String password) { - String message = "Connection OK!"; - try { - Driver postgresDriver = new Driver(); - DriverManager.registerDriver(postgresDriver, null); - String url = "jdbc:postgresql://" + host + ":" + port + "/" + dbName; - try( Connection conn = DriverManager.getConnection(url, username, password) ){ - logger.debug("PostgreSQL Connection is valid! {}", conn.isValid(10) );// 10 sec - } - } catch (Exception e) { - logger.error("Error connecting to DB while testing", e); - message = e.getMessage(); - } - return message; - } - -} +} \ No newline at end of file From fda785e0aa93a31fefb6426288c5fe5e6cef0228 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:24 +0100 Subject: [PATCH 1304/1620] New translations SaikuStarter.java (English) --- .../earth/app/view/Messages_en.properties | 98 +++++++++++-------- 1 file changed, 55 insertions(+), 43 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 29c9a75479..220f8ccd9f 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,63 +1,75 @@ package org.openforis.collect.earth.app.view; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - import javax.swing.JFrame; import javax.swing.JOptionPane; +import org.openforis.collect.earth.app.service.AnalysisSaikuService; import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.SaikuExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class SaikuAnalysisListener implements ActionListener { - private Logger logger = LoggerFactory.getLogger( SaikuAnalysisListener.class); - protected JFrame frame; - protected GenerateDatabaseStarter saikuStarter; - - public SaikuAnalysisListener(JFrame frame, GenerateDatabaseStarter saikuStarter) { - this.frame = frame; - this.saikuStarter = saikuStarter; - } +final class SaikuStarter { - @Override - public void actionPerformed(ActionEvent e) { - try { + private Logger logger = LoggerFactory.getLogger( SaikuStarter.class); + private JFrame frame; + private AnalysisSaikuService saikuService; + private boolean shouldRefreshDb; + private boolean starting = false; + private InfiniteProgressMonitor progressStartSaiku; - CollectEarthWindow.startWaiting(frame); - exportDataToRDB( true ); - }catch (Exception e1) { - logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ - } finally{ - CollectEarthWindow.endWaiting(frame); - } + public boolean isShouldRefreshDb() { + return shouldRefreshDb; } - protected void exportDataToRDB(boolean startSaikuAfterDBExport) { - if( saikuStarter.isStarting() ){ - JOptionPane.showMessageDialog(frame, Messages.getString("CollectEarthWindow.57"), Messages.getString("CollectEarthWindow.58"), JOptionPane.WARNING_MESSAGE ); //$NON-NLS-1$ //$NON-NLS-2$ - }else{ - - int shouldRefreshDb = JOptionPane.YES_OPTION; - - if( saikuStarter.shouldShowRdbGenerationOption( ExportType.SAIKU ) ){ - - String refresh = Messages.getString("SaikuAnalysisListener.0"); //$NON-NLS-1$ - String close = Messages.getString("SaikuAnalysisListener.1"); //$NON-NLS-1$ - String[] options = new String[]{ refresh,close}; + public void setShouldRefreshDb(boolean shouldRefreshDb) { + this.shouldRefreshDb = shouldRefreshDb; + } + SaikuStarter( final AnalysisSaikuService saikuService, final JFrame frame) { + super(); + this.saikuService = saikuService; + this.frame = frame; + } + + public boolean shouldShowRdbGenerationOption(){ + return saikuService.isRdbAlreadyGenerated( ExportType.SAIKU); + } - shouldRefreshDb = JOptionPane.showOptionDialog( - frame, Messages.getString("CollectEarthWindow.59"), //$NON-NLS-1$ - Messages.getString("CollectEarthWindow.60"), //$NON-NLS-1$ - JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options, close ); + public boolean isStarting() { + return starting; + } + + public void initializeAndOpen(boolean startSaikuAfterDBExport) { + progressStartSaiku = new InfiniteProgressMonitor( frame, Messages.getString("SaikuStarter.1"), Messages.getString("SaikuStarter.2")); //$NON-NLS-1$ //$NON-NLS-2$ + + Thread threadInitializingSaiku = new Thread("Start Saiku server/initialize RDB"){ //$NON-NLS-1$ + @Override + public void run() { + starting = true; + saikuService.setRefreshDatabase( shouldRefreshDb ); + try { + saikuService.prepareDataForAnalysis(progressStartSaiku, startSaikuAfterDBExport); + }catch ( SaikuExecutionException e1) { + JOptionPane.showMessageDialog( frame , "" + Messages.getString("CollectEarthWindow.29") + "
" +Messages.getString("CollectEarthWindow.40") + "
" + e1.getMessage() + "", Messages.getString("CollectEarthWindow.47"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ + logger.warn("The saiku server is not configured", e1); //$NON-NLS-1$ + } catch ( RuntimeException e) { + logger.error("Error starting Saiku", e); //$NON-NLS-1$ + } finally{ + starting = false; + if( progressStartSaiku != null ){ + progressStartSaiku.close(); + } + } } + }; + + threadInitializingSaiku.start(); - if( shouldRefreshDb != JOptionPane.CLOSED_OPTION ){ - saikuStarter.setShouldRefreshDb( shouldRefreshDb == JOptionPane.YES_OPTION ); - saikuStarter.initializeAndOpen( startSaikuAfterDBExport); - } + progressStartSaiku.showLater(); + + if( progressStartSaiku.isUserCancelled() ){ + saikuService.setUserCancelledOperation(true); } } - } \ No newline at end of file From 26c9521954ac0e50551ba02e643ef1a0469a628b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:25 +0100 Subject: [PATCH 1305/1620] New translations SaikuToolExportListener.java (French) --- .../earth/app/view/Messages_fr.properties | 163 ++++++++++++------ 1 file changed, 113 insertions(+), 50 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 220f8ccd9f..5ec1dff27b 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,75 +1,138 @@ package org.openforis.collect.earth.app.view; +import java.awt.event.ActionEvent; +import java.io.File; +import java.io.IOException; + import javax.swing.JFrame; -import javax.swing.JOptionPane; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.service.AnalysisSaikuService; -import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.SaikuExecutionException; +import org.openforis.collect.earth.app.service.LocalPropertiesService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -final class SaikuStarter { +import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.model.ZipParameters; - private Logger logger = LoggerFactory.getLogger( SaikuStarter.class); - private JFrame frame; - private AnalysisSaikuService saikuService; - private boolean shouldRefreshDb; - private boolean starting = false; - private InfiniteProgressMonitor progressStartSaiku; +public class SaikuToolExportListener extends SaikuAnalysisListener { + private Logger logger = LoggerFactory.getLogger( SaikuToolExportListener.class); + private LocalPropertiesService localPropertiesService; - public boolean isShouldRefreshDb() { - return shouldRefreshDb; - } + private final static String PREFIX_FOLDER = "saiku-server_2.6"; - public void setShouldRefreshDb(boolean shouldRefreshDb) { - this.shouldRefreshDb = shouldRefreshDb; + public SaikuToolExportListener(JFrame frame, GenerateDatabaseStarter saikuStarter, LocalPropertiesService localPropertiesService) { + super(frame, saikuStarter); + this.localPropertiesService = localPropertiesService; } - SaikuStarter( final AnalysisSaikuService saikuService, final JFrame frame) { - super(); - this.saikuService = saikuService; - this.frame = frame; - } - - public boolean shouldShowRdbGenerationOption(){ - return saikuService.isRdbAlreadyGenerated( ExportType.SAIKU); - } + @Override + public void actionPerformed(ActionEvent e) { + try { + + File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.SAIKU_ZIP, true, false, "SaikuTool", localPropertiesService, frame); + + if (exportToFile != null && exportToFile.length > 0) { + CollectEarthWindow.startWaiting(frame); + + generateNewSaikuZip( exportToFile[0] ); + } - public boolean isStarting() { - return starting; + }catch (Exception e1) { + logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ + } finally{ + CollectEarthWindow.endWaiting(frame); + } } - - public void initializeAndOpen(boolean startSaikuAfterDBExport) { - progressStartSaiku = new InfiniteProgressMonitor( frame, Messages.getString("SaikuStarter.1"), Messages.getString("SaikuStarter.2")); //$NON-NLS-1$ //$NON-NLS-2$ + + private void generateNewSaikuZip(File zipFileOutput ) { + InfiniteProgressMonitor progressMonitor = new InfiniteProgressMonitor( + frame, + Messages.getString("SaikuToolExportListener.1"), + Messages.getString("SaikuToolExportListener.2") + ); - Thread threadInitializingSaiku = new Thread("Start Saiku server/initialize RDB"){ //$NON-NLS-1$ + Thread threadGeneratingDB = new Thread("Generating ZIP Saiku Tool"){ //$NON-NLS-1$ @Override public void run() { - starting = true; - saikuService.setRefreshDatabase( shouldRefreshDb ); - try { - saikuService.prepareDataForAnalysis(progressStartSaiku, startSaikuAfterDBExport); - }catch ( SaikuExecutionException e1) { - JOptionPane.showMessageDialog( frame , "" + Messages.getString("CollectEarthWindow.29") + "
" +Messages.getString("CollectEarthWindow.40") + "
" + e1.getMessage() + "", Messages.getString("CollectEarthWindow.47"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ - logger.warn("The saiku server is not configured", e1); //$NON-NLS-1$ - } catch ( RuntimeException e) { - logger.error("Error starting Saiku", e); //$NON-NLS-1$ + exportDataToRDB(false); + try ( + ZipFile outputSaikuZip = new ZipFile(zipFileOutput); + ){ + + File saikuFolder = new File(localPropertiesService.getSaikuFolder() ); + File javaFolder = new File( saikuFolder.getAbsolutePath() + "/../java" ); // The Java and Saiku folders are on the same level + + ZipParameters zipParameters = new ZipParameters(); + zipParameters.setExcludeFileFilter( + file -> + file.getName().endsWith( "log") // exclude log files! + || + file.getParent().endsWith("temp" ) // exclude temp folder! + ); + outputSaikuZip.addFolder( saikuFolder, zipParameters ); + + // Copy the original ZIP files contained in the root ( saiku-server_2.6.zip ) to a new temporary file + + // create DB folder + // Copy the Saiku DB to DB/collectEarthDatabase.dbSaiku + zipParameters.setFileNameInZip(PREFIX_FOLDER+"/DB/" + EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME + + EarthConstants.SAIKU_RDB_SUFFIX); + outputSaikuZip.addFile( + new File(AnalysisSaikuService.COLLECT_EARTH_DATABASE_RDB_DB), zipParameters + ); + + // Copy the Mondrian Cube XML to DB/collectEarthCubes.xml + zipParameters = new ZipParameters(); + zipParameters.setFileNameInZip(PREFIX_FOLDER+"/DB/" + AnalysisSaikuService.MDX_XML ); + File mdxFile = new File(localPropertiesService.getProjectFolder() + File.separatorChar + AnalysisSaikuService.MDX_XML); + outputSaikuZip.addFile( + mdxFile, zipParameters + ); + + + // Change the configuration file to use the stand alone version! + + // Add java to the Saiku ZIP + zipParameters = new ZipParameters(); + zipParameters.setRootFolderNameInZip(PREFIX_FOLDER ); + outputSaikuZip.addFolder( javaFolder, zipParameters ); + + + // Move START_SAIKU and TERMINATE SAIKU to the root folder + File startSaiku = new File("resources/START SAIKU.bat"); + outputSaikuZip.addFile( + startSaiku + ); + + File terminateSaiku = new File("resources/TERMINATE SAIKU.bat"); + outputSaikuZip.addFile( + terminateSaiku + ); + + File readme = new File("resources/README - INSTALLATION AND RUNNING.txt"); + outputSaikuZip.addFile( + readme + ); + + + } catch (IOException e) { + logger.error("Error generating SAIKU tool at " + zipFileOutput.getAbsolutePath() ); } finally{ - starting = false; - if( progressStartSaiku != null ){ - progressStartSaiku.close(); + if( progressMonitor != null ){ + progressMonitor.close(); } + + CollectEarthUtils.openFile( zipFileOutput ); } } }; - - threadInitializingSaiku.start(); - progressStartSaiku.showLater(); - - if( progressStartSaiku.isUserCancelled() ){ - saikuService.setUserCancelledOperation(true); - } + threadGeneratingDB.start(); + + progressMonitor.showLater(); + + } -} \ No newline at end of file +} From 6bab3085279443e89fad00681628f7e6d077407d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:27 +0100 Subject: [PATCH 1306/1620] New translations SaikuToolExportListener.java (Spanish) --- .../earth/app/view/Messages_es.properties | 163 ++++++++++++------ 1 file changed, 113 insertions(+), 50 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 220f8ccd9f..5ec1dff27b 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,75 +1,138 @@ package org.openforis.collect.earth.app.view; +import java.awt.event.ActionEvent; +import java.io.File; +import java.io.IOException; + import javax.swing.JFrame; -import javax.swing.JOptionPane; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.service.AnalysisSaikuService; -import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.SaikuExecutionException; +import org.openforis.collect.earth.app.service.LocalPropertiesService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -final class SaikuStarter { +import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.model.ZipParameters; - private Logger logger = LoggerFactory.getLogger( SaikuStarter.class); - private JFrame frame; - private AnalysisSaikuService saikuService; - private boolean shouldRefreshDb; - private boolean starting = false; - private InfiniteProgressMonitor progressStartSaiku; +public class SaikuToolExportListener extends SaikuAnalysisListener { + private Logger logger = LoggerFactory.getLogger( SaikuToolExportListener.class); + private LocalPropertiesService localPropertiesService; - public boolean isShouldRefreshDb() { - return shouldRefreshDb; - } + private final static String PREFIX_FOLDER = "saiku-server_2.6"; - public void setShouldRefreshDb(boolean shouldRefreshDb) { - this.shouldRefreshDb = shouldRefreshDb; + public SaikuToolExportListener(JFrame frame, GenerateDatabaseStarter saikuStarter, LocalPropertiesService localPropertiesService) { + super(frame, saikuStarter); + this.localPropertiesService = localPropertiesService; } - SaikuStarter( final AnalysisSaikuService saikuService, final JFrame frame) { - super(); - this.saikuService = saikuService; - this.frame = frame; - } - - public boolean shouldShowRdbGenerationOption(){ - return saikuService.isRdbAlreadyGenerated( ExportType.SAIKU); - } + @Override + public void actionPerformed(ActionEvent e) { + try { + + File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.SAIKU_ZIP, true, false, "SaikuTool", localPropertiesService, frame); + + if (exportToFile != null && exportToFile.length > 0) { + CollectEarthWindow.startWaiting(frame); + + generateNewSaikuZip( exportToFile[0] ); + } - public boolean isStarting() { - return starting; + }catch (Exception e1) { + logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ + } finally{ + CollectEarthWindow.endWaiting(frame); + } } - - public void initializeAndOpen(boolean startSaikuAfterDBExport) { - progressStartSaiku = new InfiniteProgressMonitor( frame, Messages.getString("SaikuStarter.1"), Messages.getString("SaikuStarter.2")); //$NON-NLS-1$ //$NON-NLS-2$ + + private void generateNewSaikuZip(File zipFileOutput ) { + InfiniteProgressMonitor progressMonitor = new InfiniteProgressMonitor( + frame, + Messages.getString("SaikuToolExportListener.1"), + Messages.getString("SaikuToolExportListener.2") + ); - Thread threadInitializingSaiku = new Thread("Start Saiku server/initialize RDB"){ //$NON-NLS-1$ + Thread threadGeneratingDB = new Thread("Generating ZIP Saiku Tool"){ //$NON-NLS-1$ @Override public void run() { - starting = true; - saikuService.setRefreshDatabase( shouldRefreshDb ); - try { - saikuService.prepareDataForAnalysis(progressStartSaiku, startSaikuAfterDBExport); - }catch ( SaikuExecutionException e1) { - JOptionPane.showMessageDialog( frame , "" + Messages.getString("CollectEarthWindow.29") + "
" +Messages.getString("CollectEarthWindow.40") + "
" + e1.getMessage() + "", Messages.getString("CollectEarthWindow.47"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ - logger.warn("The saiku server is not configured", e1); //$NON-NLS-1$ - } catch ( RuntimeException e) { - logger.error("Error starting Saiku", e); //$NON-NLS-1$ + exportDataToRDB(false); + try ( + ZipFile outputSaikuZip = new ZipFile(zipFileOutput); + ){ + + File saikuFolder = new File(localPropertiesService.getSaikuFolder() ); + File javaFolder = new File( saikuFolder.getAbsolutePath() + "/../java" ); // The Java and Saiku folders are on the same level + + ZipParameters zipParameters = new ZipParameters(); + zipParameters.setExcludeFileFilter( + file -> + file.getName().endsWith( "log") // exclude log files! + || + file.getParent().endsWith("temp" ) // exclude temp folder! + ); + outputSaikuZip.addFolder( saikuFolder, zipParameters ); + + // Copy the original ZIP files contained in the root ( saiku-server_2.6.zip ) to a new temporary file + + // create DB folder + // Copy the Saiku DB to DB/collectEarthDatabase.dbSaiku + zipParameters.setFileNameInZip(PREFIX_FOLDER+"/DB/" + EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME + + EarthConstants.SAIKU_RDB_SUFFIX); + outputSaikuZip.addFile( + new File(AnalysisSaikuService.COLLECT_EARTH_DATABASE_RDB_DB), zipParameters + ); + + // Copy the Mondrian Cube XML to DB/collectEarthCubes.xml + zipParameters = new ZipParameters(); + zipParameters.setFileNameInZip(PREFIX_FOLDER+"/DB/" + AnalysisSaikuService.MDX_XML ); + File mdxFile = new File(localPropertiesService.getProjectFolder() + File.separatorChar + AnalysisSaikuService.MDX_XML); + outputSaikuZip.addFile( + mdxFile, zipParameters + ); + + + // Change the configuration file to use the stand alone version! + + // Add java to the Saiku ZIP + zipParameters = new ZipParameters(); + zipParameters.setRootFolderNameInZip(PREFIX_FOLDER ); + outputSaikuZip.addFolder( javaFolder, zipParameters ); + + + // Move START_SAIKU and TERMINATE SAIKU to the root folder + File startSaiku = new File("resources/START SAIKU.bat"); + outputSaikuZip.addFile( + startSaiku + ); + + File terminateSaiku = new File("resources/TERMINATE SAIKU.bat"); + outputSaikuZip.addFile( + terminateSaiku + ); + + File readme = new File("resources/README - INSTALLATION AND RUNNING.txt"); + outputSaikuZip.addFile( + readme + ); + + + } catch (IOException e) { + logger.error("Error generating SAIKU tool at " + zipFileOutput.getAbsolutePath() ); } finally{ - starting = false; - if( progressStartSaiku != null ){ - progressStartSaiku.close(); + if( progressMonitor != null ){ + progressMonitor.close(); } + + CollectEarthUtils.openFile( zipFileOutput ); } } }; - - threadInitializingSaiku.start(); - progressStartSaiku.showLater(); - - if( progressStartSaiku.isUserCancelled() ){ - saikuService.setUserCancelledOperation(true); - } + threadGeneratingDB.start(); + + progressMonitor.showLater(); + + } -} \ No newline at end of file +} From 2e6b23dde11b2f886382b3663d6055bac3086f4a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:28 +0100 Subject: [PATCH 1307/1620] New translations SaikuToolExportListener.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 163 ++++++++++++------ 1 file changed, 113 insertions(+), 50 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 220f8ccd9f..5ec1dff27b 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,75 +1,138 @@ package org.openforis.collect.earth.app.view; +import java.awt.event.ActionEvent; +import java.io.File; +import java.io.IOException; + import javax.swing.JFrame; -import javax.swing.JOptionPane; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.service.AnalysisSaikuService; -import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.SaikuExecutionException; +import org.openforis.collect.earth.app.service.LocalPropertiesService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -final class SaikuStarter { +import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.model.ZipParameters; - private Logger logger = LoggerFactory.getLogger( SaikuStarter.class); - private JFrame frame; - private AnalysisSaikuService saikuService; - private boolean shouldRefreshDb; - private boolean starting = false; - private InfiniteProgressMonitor progressStartSaiku; +public class SaikuToolExportListener extends SaikuAnalysisListener { + private Logger logger = LoggerFactory.getLogger( SaikuToolExportListener.class); + private LocalPropertiesService localPropertiesService; - public boolean isShouldRefreshDb() { - return shouldRefreshDb; - } + private final static String PREFIX_FOLDER = "saiku-server_2.6"; - public void setShouldRefreshDb(boolean shouldRefreshDb) { - this.shouldRefreshDb = shouldRefreshDb; + public SaikuToolExportListener(JFrame frame, GenerateDatabaseStarter saikuStarter, LocalPropertiesService localPropertiesService) { + super(frame, saikuStarter); + this.localPropertiesService = localPropertiesService; } - SaikuStarter( final AnalysisSaikuService saikuService, final JFrame frame) { - super(); - this.saikuService = saikuService; - this.frame = frame; - } - - public boolean shouldShowRdbGenerationOption(){ - return saikuService.isRdbAlreadyGenerated( ExportType.SAIKU); - } + @Override + public void actionPerformed(ActionEvent e) { + try { + + File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.SAIKU_ZIP, true, false, "SaikuTool", localPropertiesService, frame); + + if (exportToFile != null && exportToFile.length > 0) { + CollectEarthWindow.startWaiting(frame); + + generateNewSaikuZip( exportToFile[0] ); + } - public boolean isStarting() { - return starting; + }catch (Exception e1) { + logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ + } finally{ + CollectEarthWindow.endWaiting(frame); + } } - - public void initializeAndOpen(boolean startSaikuAfterDBExport) { - progressStartSaiku = new InfiniteProgressMonitor( frame, Messages.getString("SaikuStarter.1"), Messages.getString("SaikuStarter.2")); //$NON-NLS-1$ //$NON-NLS-2$ + + private void generateNewSaikuZip(File zipFileOutput ) { + InfiniteProgressMonitor progressMonitor = new InfiniteProgressMonitor( + frame, + Messages.getString("SaikuToolExportListener.1"), + Messages.getString("SaikuToolExportListener.2") + ); - Thread threadInitializingSaiku = new Thread("Start Saiku server/initialize RDB"){ //$NON-NLS-1$ + Thread threadGeneratingDB = new Thread("Generating ZIP Saiku Tool"){ //$NON-NLS-1$ @Override public void run() { - starting = true; - saikuService.setRefreshDatabase( shouldRefreshDb ); - try { - saikuService.prepareDataForAnalysis(progressStartSaiku, startSaikuAfterDBExport); - }catch ( SaikuExecutionException e1) { - JOptionPane.showMessageDialog( frame , "" + Messages.getString("CollectEarthWindow.29") + "
" +Messages.getString("CollectEarthWindow.40") + "
" + e1.getMessage() + "", Messages.getString("CollectEarthWindow.47"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ - logger.warn("The saiku server is not configured", e1); //$NON-NLS-1$ - } catch ( RuntimeException e) { - logger.error("Error starting Saiku", e); //$NON-NLS-1$ + exportDataToRDB(false); + try ( + ZipFile outputSaikuZip = new ZipFile(zipFileOutput); + ){ + + File saikuFolder = new File(localPropertiesService.getSaikuFolder() ); + File javaFolder = new File( saikuFolder.getAbsolutePath() + "/../java" ); // The Java and Saiku folders are on the same level + + ZipParameters zipParameters = new ZipParameters(); + zipParameters.setExcludeFileFilter( + file -> + file.getName().endsWith( "log") // exclude log files! + || + file.getParent().endsWith("temp" ) // exclude temp folder! + ); + outputSaikuZip.addFolder( saikuFolder, zipParameters ); + + // Copy the original ZIP files contained in the root ( saiku-server_2.6.zip ) to a new temporary file + + // create DB folder + // Copy the Saiku DB to DB/collectEarthDatabase.dbSaiku + zipParameters.setFileNameInZip(PREFIX_FOLDER+"/DB/" + EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME + + EarthConstants.SAIKU_RDB_SUFFIX); + outputSaikuZip.addFile( + new File(AnalysisSaikuService.COLLECT_EARTH_DATABASE_RDB_DB), zipParameters + ); + + // Copy the Mondrian Cube XML to DB/collectEarthCubes.xml + zipParameters = new ZipParameters(); + zipParameters.setFileNameInZip(PREFIX_FOLDER+"/DB/" + AnalysisSaikuService.MDX_XML ); + File mdxFile = new File(localPropertiesService.getProjectFolder() + File.separatorChar + AnalysisSaikuService.MDX_XML); + outputSaikuZip.addFile( + mdxFile, zipParameters + ); + + + // Change the configuration file to use the stand alone version! + + // Add java to the Saiku ZIP + zipParameters = new ZipParameters(); + zipParameters.setRootFolderNameInZip(PREFIX_FOLDER ); + outputSaikuZip.addFolder( javaFolder, zipParameters ); + + + // Move START_SAIKU and TERMINATE SAIKU to the root folder + File startSaiku = new File("resources/START SAIKU.bat"); + outputSaikuZip.addFile( + startSaiku + ); + + File terminateSaiku = new File("resources/TERMINATE SAIKU.bat"); + outputSaikuZip.addFile( + terminateSaiku + ); + + File readme = new File("resources/README - INSTALLATION AND RUNNING.txt"); + outputSaikuZip.addFile( + readme + ); + + + } catch (IOException e) { + logger.error("Error generating SAIKU tool at " + zipFileOutput.getAbsolutePath() ); } finally{ - starting = false; - if( progressStartSaiku != null ){ - progressStartSaiku.close(); + if( progressMonitor != null ){ + progressMonitor.close(); } + + CollectEarthUtils.openFile( zipFileOutput ); } } }; - - threadInitializingSaiku.start(); - progressStartSaiku.showLater(); - - if( progressStartSaiku.isUserCancelled() ){ - saikuService.setUserCancelledOperation(true); - } + threadGeneratingDB.start(); + + progressMonitor.showLater(); + + } -} \ No newline at end of file +} From 012843c444dee4d99cd861c7d35d89d03ca3c9a2 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:29 +0100 Subject: [PATCH 1308/1620] New translations SaikuToolExportListener.java (English) --- .../earth/app/view/Messages_en.properties | 163 ++++++++++++------ 1 file changed, 113 insertions(+), 50 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 220f8ccd9f..5ec1dff27b 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,75 +1,138 @@ package org.openforis.collect.earth.app.view; +import java.awt.event.ActionEvent; +import java.io.File; +import java.io.IOException; + import javax.swing.JFrame; -import javax.swing.JOptionPane; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.EarthConstants; import org.openforis.collect.earth.app.service.AnalysisSaikuService; -import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.SaikuExecutionException; +import org.openforis.collect.earth.app.service.LocalPropertiesService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -final class SaikuStarter { +import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.model.ZipParameters; - private Logger logger = LoggerFactory.getLogger( SaikuStarter.class); - private JFrame frame; - private AnalysisSaikuService saikuService; - private boolean shouldRefreshDb; - private boolean starting = false; - private InfiniteProgressMonitor progressStartSaiku; +public class SaikuToolExportListener extends SaikuAnalysisListener { + private Logger logger = LoggerFactory.getLogger( SaikuToolExportListener.class); + private LocalPropertiesService localPropertiesService; - public boolean isShouldRefreshDb() { - return shouldRefreshDb; - } + private final static String PREFIX_FOLDER = "saiku-server_2.6"; - public void setShouldRefreshDb(boolean shouldRefreshDb) { - this.shouldRefreshDb = shouldRefreshDb; + public SaikuToolExportListener(JFrame frame, GenerateDatabaseStarter saikuStarter, LocalPropertiesService localPropertiesService) { + super(frame, saikuStarter); + this.localPropertiesService = localPropertiesService; } - SaikuStarter( final AnalysisSaikuService saikuService, final JFrame frame) { - super(); - this.saikuService = saikuService; - this.frame = frame; - } - - public boolean shouldShowRdbGenerationOption(){ - return saikuService.isRdbAlreadyGenerated( ExportType.SAIKU); - } + @Override + public void actionPerformed(ActionEvent e) { + try { + + File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.SAIKU_ZIP, true, false, "SaikuTool", localPropertiesService, frame); + + if (exportToFile != null && exportToFile.length > 0) { + CollectEarthWindow.startWaiting(frame); + + generateNewSaikuZip( exportToFile[0] ); + } - public boolean isStarting() { - return starting; + }catch (Exception e1) { + logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ + } finally{ + CollectEarthWindow.endWaiting(frame); + } } - - public void initializeAndOpen(boolean startSaikuAfterDBExport) { - progressStartSaiku = new InfiniteProgressMonitor( frame, Messages.getString("SaikuStarter.1"), Messages.getString("SaikuStarter.2")); //$NON-NLS-1$ //$NON-NLS-2$ + + private void generateNewSaikuZip(File zipFileOutput ) { + InfiniteProgressMonitor progressMonitor = new InfiniteProgressMonitor( + frame, + Messages.getString("SaikuToolExportListener.1"), + Messages.getString("SaikuToolExportListener.2") + ); - Thread threadInitializingSaiku = new Thread("Start Saiku server/initialize RDB"){ //$NON-NLS-1$ + Thread threadGeneratingDB = new Thread("Generating ZIP Saiku Tool"){ //$NON-NLS-1$ @Override public void run() { - starting = true; - saikuService.setRefreshDatabase( shouldRefreshDb ); - try { - saikuService.prepareDataForAnalysis(progressStartSaiku, startSaikuAfterDBExport); - }catch ( SaikuExecutionException e1) { - JOptionPane.showMessageDialog( frame , "" + Messages.getString("CollectEarthWindow.29") + "
" +Messages.getString("CollectEarthWindow.40") + "
" + e1.getMessage() + "", Messages.getString("CollectEarthWindow.47"), JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ - logger.warn("The saiku server is not configured", e1); //$NON-NLS-1$ - } catch ( RuntimeException e) { - logger.error("Error starting Saiku", e); //$NON-NLS-1$ + exportDataToRDB(false); + try ( + ZipFile outputSaikuZip = new ZipFile(zipFileOutput); + ){ + + File saikuFolder = new File(localPropertiesService.getSaikuFolder() ); + File javaFolder = new File( saikuFolder.getAbsolutePath() + "/../java" ); // The Java and Saiku folders are on the same level + + ZipParameters zipParameters = new ZipParameters(); + zipParameters.setExcludeFileFilter( + file -> + file.getName().endsWith( "log") // exclude log files! + || + file.getParent().endsWith("temp" ) // exclude temp folder! + ); + outputSaikuZip.addFolder( saikuFolder, zipParameters ); + + // Copy the original ZIP files contained in the root ( saiku-server_2.6.zip ) to a new temporary file + + // create DB folder + // Copy the Saiku DB to DB/collectEarthDatabase.dbSaiku + zipParameters.setFileNameInZip(PREFIX_FOLDER+"/DB/" + EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME + + EarthConstants.SAIKU_RDB_SUFFIX); + outputSaikuZip.addFile( + new File(AnalysisSaikuService.COLLECT_EARTH_DATABASE_RDB_DB), zipParameters + ); + + // Copy the Mondrian Cube XML to DB/collectEarthCubes.xml + zipParameters = new ZipParameters(); + zipParameters.setFileNameInZip(PREFIX_FOLDER+"/DB/" + AnalysisSaikuService.MDX_XML ); + File mdxFile = new File(localPropertiesService.getProjectFolder() + File.separatorChar + AnalysisSaikuService.MDX_XML); + outputSaikuZip.addFile( + mdxFile, zipParameters + ); + + + // Change the configuration file to use the stand alone version! + + // Add java to the Saiku ZIP + zipParameters = new ZipParameters(); + zipParameters.setRootFolderNameInZip(PREFIX_FOLDER ); + outputSaikuZip.addFolder( javaFolder, zipParameters ); + + + // Move START_SAIKU and TERMINATE SAIKU to the root folder + File startSaiku = new File("resources/START SAIKU.bat"); + outputSaikuZip.addFile( + startSaiku + ); + + File terminateSaiku = new File("resources/TERMINATE SAIKU.bat"); + outputSaikuZip.addFile( + terminateSaiku + ); + + File readme = new File("resources/README - INSTALLATION AND RUNNING.txt"); + outputSaikuZip.addFile( + readme + ); + + + } catch (IOException e) { + logger.error("Error generating SAIKU tool at " + zipFileOutput.getAbsolutePath() ); } finally{ - starting = false; - if( progressStartSaiku != null ){ - progressStartSaiku.close(); + if( progressMonitor != null ){ + progressMonitor.close(); } + + CollectEarthUtils.openFile( zipFileOutput ); } } }; - - threadInitializingSaiku.start(); - progressStartSaiku.showLater(); - - if( progressStartSaiku.isUserCancelled() ){ - saikuService.setUserCancelledOperation(true); - } + threadGeneratingDB.start(); + + progressMonitor.showLater(); + + } -} \ No newline at end of file +} From 413ca6231bd6bb2cee7efe23aec982ca4463b9c6 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:30 +0100 Subject: [PATCH 1309/1620] New translations CollectEarthUtils.java (French) --- .../earth/app/view/Messages_fr.properties | 294 +++++++++++------- 1 file changed, 182 insertions(+), 112 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 5ec1dff27b..8fa17ec627 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,138 +1,208 @@ -package org.openforis.collect.earth.app.view; +package org.openforis.collect.earth.app; -import java.awt.event.ActionEvent; +import java.awt.Desktop; +import java.awt.Font; +import java.awt.FontFormatException; +import java.awt.GraphicsEnvironment; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; - -import javax.swing.JFrame; - -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.AnalysisSaikuService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; +import java.io.InputStream; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.sql.Connection; +import java.sql.DriverManager; +import java.util.Enumeration; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import javax.swing.UIManager; + +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.commons.lang3.SystemUtils; +import org.openforis.collect.earth.app.EarthConstants.UI_LANGUAGE; +import org.openforis.collect.earth.app.view.Messages; +import org.postgresql.Driver; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.exception.ZipException; import net.lingala.zip4j.model.ZipParameters; +import net.lingala.zip4j.model.enums.CompressionLevel; +import net.lingala.zip4j.model.enums.CompressionMethod; -public class SaikuToolExportListener extends SaikuAnalysisListener { - private Logger logger = LoggerFactory.getLogger( SaikuToolExportListener.class); - private LocalPropertiesService localPropertiesService; +public class CollectEarthUtils { - private final static String PREFIX_FOLDER = "saiku-server_2.6"; + private static final Logger logger = LoggerFactory.getLogger(CollectEarthUtils.class); - public SaikuToolExportListener(JFrame frame, GenerateDatabaseStarter saikuStarter, LocalPropertiesService localPropertiesService) { - super(frame, saikuStarter); - this.localPropertiesService = localPropertiesService; + private CollectEarthUtils() { } - @Override - public void actionPerformed(ActionEvent e) { - try { + public static String getMd5FromFolder(File folder) throws IOException { - File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.SAIKU_ZIP, true, false, "SaikuTool", localPropertiesService, frame); + if (!folder.isDirectory()) { + throw new IllegalArgumentException("The file passed as an argument needs to be a folder!"); + } + StringBuilder md5Hex = new StringBuilder(); - if (exportToFile != null && exportToFile.length > 0) { - CollectEarthWindow.startWaiting(frame); - - generateNewSaikuZip( exportToFile[0] ); + try( Stream paths = Files.walk(Paths.get(folder.toURI()), 3); ) { + List listFiles = paths.filter(Files::isRegularFile).map(Path::toFile) + .collect(Collectors.toList()); + for (File file : listFiles) { + md5Hex.append(DigestUtils.md5Hex(new FileInputStream(file))); } + return DigestUtils.md5Hex(md5Hex.toString().getBytes()); + } + } - }catch (Exception e1) { - logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ - } finally{ - CollectEarthWindow.endWaiting(frame); + public static String getMd5FromFile(String filePath) throws IOException { + return DigestUtils.md5Hex(new FileInputStream(new File(filePath))); + } + + public static void setFontDependingOnLanguaue(UI_LANGUAGE uiLanguage) { + if (uiLanguage == UI_LANGUAGE.LO) { + String ttfFileName = "Phetsarath_OT.ttf"; + // create the font + setUiFont(ttfFileName); + } else if (uiLanguage == UI_LANGUAGE.MN) { + String ttfFileName = "arhangai.ttf"; + // create the font + setUiFont(ttfFileName); + } else { + CollectEarthUtils.setUiFont(new javax.swing.plaf.FontUIResource("Arial Unicode MS", Font.PLAIN, 12)); } } - private void generateNewSaikuZip(File zipFileOutput ) { - InfiniteProgressMonitor progressMonitor = new InfiniteProgressMonitor( - frame, - Messages.getString("SaikuToolExportListener.1"), - Messages.getString("SaikuToolExportListener.2") - ); - - Thread threadGeneratingDB = new Thread("Generating ZIP Saiku Tool"){ //$NON-NLS-1$ - @Override - public void run() { - exportDataToRDB(false); - try ( - ZipFile outputSaikuZip = new ZipFile(zipFileOutput); - ){ - - File saikuFolder = new File(localPropertiesService.getSaikuFolder() ); - File javaFolder = new File( saikuFolder.getAbsolutePath() + "/../java" ); // The Java and Saiku folders are on the same level - - ZipParameters zipParameters = new ZipParameters(); - zipParameters.setExcludeFileFilter( - file -> - file.getName().endsWith( "log") // exclude log files! - || - file.getParent().endsWith("temp" ) // exclude temp folder! - ); - outputSaikuZip.addFolder( saikuFolder, zipParameters ); - - // Copy the original ZIP files contained in the root ( saiku-server_2.6.zip ) to a new temporary file - - // create DB folder - // Copy the Saiku DB to DB/collectEarthDatabase.dbSaiku - zipParameters.setFileNameInZip(PREFIX_FOLDER+"/DB/" + EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME - + EarthConstants.SAIKU_RDB_SUFFIX); - outputSaikuZip.addFile( - new File(AnalysisSaikuService.COLLECT_EARTH_DATABASE_RDB_DB), zipParameters - ); - - // Copy the Mondrian Cube XML to DB/collectEarthCubes.xml - zipParameters = new ZipParameters(); - zipParameters.setFileNameInZip(PREFIX_FOLDER+"/DB/" + AnalysisSaikuService.MDX_XML ); - File mdxFile = new File(localPropertiesService.getProjectFolder() + File.separatorChar + AnalysisSaikuService.MDX_XML); - outputSaikuZip.addFile( - mdxFile, zipParameters - ); - - - // Change the configuration file to use the stand alone version! - - // Add java to the Saiku ZIP - zipParameters = new ZipParameters(); - zipParameters.setRootFolderNameInZip(PREFIX_FOLDER ); - outputSaikuZip.addFolder( javaFolder, zipParameters ); - - - // Move START_SAIKU and TERMINATE SAIKU to the root folder - File startSaiku = new File("resources/START SAIKU.bat"); - outputSaikuZip.addFile( - startSaiku - ); - - File terminateSaiku = new File("resources/TERMINATE SAIKU.bat"); - outputSaikuZip.addFile( - terminateSaiku - ); - - File readme = new File("resources/README - INSTALLATION AND RUNNING.txt"); - outputSaikuZip.addFile( - readme - ); - - - } catch (IOException e) { - logger.error("Error generating SAIKU tool at " + zipFileOutput.getAbsolutePath() ); - } finally{ - if( progressMonitor != null ){ - progressMonitor.close(); - } - - CollectEarthUtils.openFile( zipFileOutput ); - } - } - }; + public static void setUiFont(String ttfFileName) { + try { + // create the font to use. Specify the size! + InputStream fontStream = CollectEarthUtils.class.getResourceAsStream(ttfFileName); + Font laoFont = Font.createFont(Font.TRUETYPE_FONT, fontStream).deriveFont(12f); + GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); + // register the font + ge.registerFont(laoFont); + CollectEarthUtils.setUiFont(new javax.swing.plaf.FontUIResource(laoFont.getFontName(), Font.PLAIN, 12)); + } catch (IOException | FontFormatException e) { + logger.error("error setting the font " + ttfFileName, e); + } + + } + + private static void setUiFont(javax.swing.plaf.FontUIResource f) { + Enumeration keys = UIManager.getDefaults().keys(); + while (keys.hasMoreElements()) { + Object key = keys.nextElement(); + Object value = UIManager.get(key); + if (value instanceof javax.swing.plaf.FontUIResource) + UIManager.put(key, f); + } + } + + public static ZipFile addFileToZip(String pathToDestinationZip, File fileToAdd, String fileNameInZip) throws IOException { + File destinationZip = new File(pathToDestinationZip); + return addFileToZip(destinationZip, fileToAdd, fileNameInZip); + } + + public static ZipFile addFileToZip(File destinationZip, File fileToAdd, String fileNameInZip) throws IOException { + try( ZipFile zipFile = new ZipFile(destinationZip) ){ + ZipParameters zipParameters = new ZipParameters(); + // COMP_DEFLATE is for compression + zipParameters.setCompressionMethod(CompressionMethod.DEFLATE); + // DEFLATE_LEVEL_ULTRA = maximum compression + zipParameters.setCompressionLevel(CompressionLevel.ULTRA); + zipParameters.setFileNameInZip(fileNameInZip); + zipFile.addFile(fileToAdd, zipParameters); + return zipFile; + }catch(Exception e) { + logger.error("Error adding file to ZIP", e); + return null; + } + } + + public static String getComputerIp() { + try { + return InetAddress.getLocalHost().getHostAddress(); + } catch (final UnknownHostException e) { + logger.warn("Unknown IP address", e); //$NON-NLS-1$ + return Messages.getString("OptionWizard.11"); //$NON-NLS-1$ + } + } - threadGeneratingDB.start(); + public static void addFolderToZip(ZipFile zipFile, File folderToCompress) throws ZipException { + ZipParameters zipParameters = new ZipParameters(); + // COMP_DEFLATE is for compression + zipParameters.setCompressionMethod(CompressionMethod.DEFLATE); + // DEFLATE_LEVEL_ULTRA = maximum compression + zipParameters.setCompressionLevel(CompressionLevel.ULTRA); + + if (folderToCompress.exists() && folderToCompress.isDirectory()) { + zipFile.addFolder(folderToCompress, zipParameters); + } + } - progressMonitor.showLater(); + public static void openFolderInExplorer(String folder) throws IOException { + if (Desktop.isDesktopSupported()) { + Desktop.getDesktop().open(new File(folder)); + } else { + if (SystemUtils.IS_OS_WINDOWS) { + new ProcessBuilder("explorer.exe", "/open," + folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } else if (SystemUtils.IS_OS_MAC) { + new ProcessBuilder("usr/bin/open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } else if (SystemUtils.IS_OS_UNIX) { + tryUnixFileExplorers(folder); + } + } + } + + public static void tryUnixFileExplorers(String folder) throws IOException { + try { + new ProcessBuilder("nautilus", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (IOException e1) { + try { + new ProcessBuilder("gnome-open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (IOException e2) { + try { + new ProcessBuilder("kde-open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (IOException e3) { + new ProcessBuilder("caja", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + } + } + public static boolean openFile(File fileToOpenWithOSViewer) { + boolean success = false; + if (Desktop.isDesktopSupported()) { + try { + Desktop.getDesktop().open(fileToOpenWithOSViewer); + success = true; + } catch (IOException ex) { + logger.warn("No application registered to open file {}", fileToOpenWithOSViewer.getAbsolutePath()); //$NON-NLS-1$ + } + } + return success; + } + public static String testPostgreSQLConnection(String host, String port, String dbName, String username, + String password) { + String message = "Connection OK!"; + try { + Driver postgresDriver = new Driver(); + DriverManager.registerDriver(postgresDriver, null); + String url = "jdbc:postgresql://" + host + ":" + port + "/" + dbName; + try( Connection conn = DriverManager.getConnection(url, username, password) ){ + logger.debug("PostgreSQL Connection is valid! {}", conn.isValid(10) );// 10 sec + } + } catch (Exception e) { + logger.error("Error connecting to DB while testing", e); + message = e.getMessage(); + } + return message; } + } From 63b29170444b130d232d148fba0c72770c7003f6 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:31 +0100 Subject: [PATCH 1310/1620] New translations CollectEarthUtils.java (Spanish) --- .../earth/app/view/Messages_es.properties | 294 +++++++++++------- 1 file changed, 182 insertions(+), 112 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 5ec1dff27b..8fa17ec627 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,138 +1,208 @@ -package org.openforis.collect.earth.app.view; +package org.openforis.collect.earth.app; -import java.awt.event.ActionEvent; +import java.awt.Desktop; +import java.awt.Font; +import java.awt.FontFormatException; +import java.awt.GraphicsEnvironment; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; - -import javax.swing.JFrame; - -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.AnalysisSaikuService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; +import java.io.InputStream; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.sql.Connection; +import java.sql.DriverManager; +import java.util.Enumeration; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import javax.swing.UIManager; + +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.commons.lang3.SystemUtils; +import org.openforis.collect.earth.app.EarthConstants.UI_LANGUAGE; +import org.openforis.collect.earth.app.view.Messages; +import org.postgresql.Driver; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.exception.ZipException; import net.lingala.zip4j.model.ZipParameters; +import net.lingala.zip4j.model.enums.CompressionLevel; +import net.lingala.zip4j.model.enums.CompressionMethod; -public class SaikuToolExportListener extends SaikuAnalysisListener { - private Logger logger = LoggerFactory.getLogger( SaikuToolExportListener.class); - private LocalPropertiesService localPropertiesService; +public class CollectEarthUtils { - private final static String PREFIX_FOLDER = "saiku-server_2.6"; + private static final Logger logger = LoggerFactory.getLogger(CollectEarthUtils.class); - public SaikuToolExportListener(JFrame frame, GenerateDatabaseStarter saikuStarter, LocalPropertiesService localPropertiesService) { - super(frame, saikuStarter); - this.localPropertiesService = localPropertiesService; + private CollectEarthUtils() { } - @Override - public void actionPerformed(ActionEvent e) { - try { + public static String getMd5FromFolder(File folder) throws IOException { - File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.SAIKU_ZIP, true, false, "SaikuTool", localPropertiesService, frame); + if (!folder.isDirectory()) { + throw new IllegalArgumentException("The file passed as an argument needs to be a folder!"); + } + StringBuilder md5Hex = new StringBuilder(); - if (exportToFile != null && exportToFile.length > 0) { - CollectEarthWindow.startWaiting(frame); - - generateNewSaikuZip( exportToFile[0] ); + try( Stream paths = Files.walk(Paths.get(folder.toURI()), 3); ) { + List listFiles = paths.filter(Files::isRegularFile).map(Path::toFile) + .collect(Collectors.toList()); + for (File file : listFiles) { + md5Hex.append(DigestUtils.md5Hex(new FileInputStream(file))); } + return DigestUtils.md5Hex(md5Hex.toString().getBytes()); + } + } - }catch (Exception e1) { - logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ - } finally{ - CollectEarthWindow.endWaiting(frame); + public static String getMd5FromFile(String filePath) throws IOException { + return DigestUtils.md5Hex(new FileInputStream(new File(filePath))); + } + + public static void setFontDependingOnLanguaue(UI_LANGUAGE uiLanguage) { + if (uiLanguage == UI_LANGUAGE.LO) { + String ttfFileName = "Phetsarath_OT.ttf"; + // create the font + setUiFont(ttfFileName); + } else if (uiLanguage == UI_LANGUAGE.MN) { + String ttfFileName = "arhangai.ttf"; + // create the font + setUiFont(ttfFileName); + } else { + CollectEarthUtils.setUiFont(new javax.swing.plaf.FontUIResource("Arial Unicode MS", Font.PLAIN, 12)); } } - private void generateNewSaikuZip(File zipFileOutput ) { - InfiniteProgressMonitor progressMonitor = new InfiniteProgressMonitor( - frame, - Messages.getString("SaikuToolExportListener.1"), - Messages.getString("SaikuToolExportListener.2") - ); - - Thread threadGeneratingDB = new Thread("Generating ZIP Saiku Tool"){ //$NON-NLS-1$ - @Override - public void run() { - exportDataToRDB(false); - try ( - ZipFile outputSaikuZip = new ZipFile(zipFileOutput); - ){ - - File saikuFolder = new File(localPropertiesService.getSaikuFolder() ); - File javaFolder = new File( saikuFolder.getAbsolutePath() + "/../java" ); // The Java and Saiku folders are on the same level - - ZipParameters zipParameters = new ZipParameters(); - zipParameters.setExcludeFileFilter( - file -> - file.getName().endsWith( "log") // exclude log files! - || - file.getParent().endsWith("temp" ) // exclude temp folder! - ); - outputSaikuZip.addFolder( saikuFolder, zipParameters ); - - // Copy the original ZIP files contained in the root ( saiku-server_2.6.zip ) to a new temporary file - - // create DB folder - // Copy the Saiku DB to DB/collectEarthDatabase.dbSaiku - zipParameters.setFileNameInZip(PREFIX_FOLDER+"/DB/" + EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME - + EarthConstants.SAIKU_RDB_SUFFIX); - outputSaikuZip.addFile( - new File(AnalysisSaikuService.COLLECT_EARTH_DATABASE_RDB_DB), zipParameters - ); - - // Copy the Mondrian Cube XML to DB/collectEarthCubes.xml - zipParameters = new ZipParameters(); - zipParameters.setFileNameInZip(PREFIX_FOLDER+"/DB/" + AnalysisSaikuService.MDX_XML ); - File mdxFile = new File(localPropertiesService.getProjectFolder() + File.separatorChar + AnalysisSaikuService.MDX_XML); - outputSaikuZip.addFile( - mdxFile, zipParameters - ); - - - // Change the configuration file to use the stand alone version! - - // Add java to the Saiku ZIP - zipParameters = new ZipParameters(); - zipParameters.setRootFolderNameInZip(PREFIX_FOLDER ); - outputSaikuZip.addFolder( javaFolder, zipParameters ); - - - // Move START_SAIKU and TERMINATE SAIKU to the root folder - File startSaiku = new File("resources/START SAIKU.bat"); - outputSaikuZip.addFile( - startSaiku - ); - - File terminateSaiku = new File("resources/TERMINATE SAIKU.bat"); - outputSaikuZip.addFile( - terminateSaiku - ); - - File readme = new File("resources/README - INSTALLATION AND RUNNING.txt"); - outputSaikuZip.addFile( - readme - ); - - - } catch (IOException e) { - logger.error("Error generating SAIKU tool at " + zipFileOutput.getAbsolutePath() ); - } finally{ - if( progressMonitor != null ){ - progressMonitor.close(); - } - - CollectEarthUtils.openFile( zipFileOutput ); - } - } - }; + public static void setUiFont(String ttfFileName) { + try { + // create the font to use. Specify the size! + InputStream fontStream = CollectEarthUtils.class.getResourceAsStream(ttfFileName); + Font laoFont = Font.createFont(Font.TRUETYPE_FONT, fontStream).deriveFont(12f); + GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); + // register the font + ge.registerFont(laoFont); + CollectEarthUtils.setUiFont(new javax.swing.plaf.FontUIResource(laoFont.getFontName(), Font.PLAIN, 12)); + } catch (IOException | FontFormatException e) { + logger.error("error setting the font " + ttfFileName, e); + } + + } + + private static void setUiFont(javax.swing.plaf.FontUIResource f) { + Enumeration keys = UIManager.getDefaults().keys(); + while (keys.hasMoreElements()) { + Object key = keys.nextElement(); + Object value = UIManager.get(key); + if (value instanceof javax.swing.plaf.FontUIResource) + UIManager.put(key, f); + } + } + + public static ZipFile addFileToZip(String pathToDestinationZip, File fileToAdd, String fileNameInZip) throws IOException { + File destinationZip = new File(pathToDestinationZip); + return addFileToZip(destinationZip, fileToAdd, fileNameInZip); + } + + public static ZipFile addFileToZip(File destinationZip, File fileToAdd, String fileNameInZip) throws IOException { + try( ZipFile zipFile = new ZipFile(destinationZip) ){ + ZipParameters zipParameters = new ZipParameters(); + // COMP_DEFLATE is for compression + zipParameters.setCompressionMethod(CompressionMethod.DEFLATE); + // DEFLATE_LEVEL_ULTRA = maximum compression + zipParameters.setCompressionLevel(CompressionLevel.ULTRA); + zipParameters.setFileNameInZip(fileNameInZip); + zipFile.addFile(fileToAdd, zipParameters); + return zipFile; + }catch(Exception e) { + logger.error("Error adding file to ZIP", e); + return null; + } + } + + public static String getComputerIp() { + try { + return InetAddress.getLocalHost().getHostAddress(); + } catch (final UnknownHostException e) { + logger.warn("Unknown IP address", e); //$NON-NLS-1$ + return Messages.getString("OptionWizard.11"); //$NON-NLS-1$ + } + } - threadGeneratingDB.start(); + public static void addFolderToZip(ZipFile zipFile, File folderToCompress) throws ZipException { + ZipParameters zipParameters = new ZipParameters(); + // COMP_DEFLATE is for compression + zipParameters.setCompressionMethod(CompressionMethod.DEFLATE); + // DEFLATE_LEVEL_ULTRA = maximum compression + zipParameters.setCompressionLevel(CompressionLevel.ULTRA); + + if (folderToCompress.exists() && folderToCompress.isDirectory()) { + zipFile.addFolder(folderToCompress, zipParameters); + } + } - progressMonitor.showLater(); + public static void openFolderInExplorer(String folder) throws IOException { + if (Desktop.isDesktopSupported()) { + Desktop.getDesktop().open(new File(folder)); + } else { + if (SystemUtils.IS_OS_WINDOWS) { + new ProcessBuilder("explorer.exe", "/open," + folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } else if (SystemUtils.IS_OS_MAC) { + new ProcessBuilder("usr/bin/open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } else if (SystemUtils.IS_OS_UNIX) { + tryUnixFileExplorers(folder); + } + } + } + + public static void tryUnixFileExplorers(String folder) throws IOException { + try { + new ProcessBuilder("nautilus", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (IOException e1) { + try { + new ProcessBuilder("gnome-open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (IOException e2) { + try { + new ProcessBuilder("kde-open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (IOException e3) { + new ProcessBuilder("caja", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + } + } + public static boolean openFile(File fileToOpenWithOSViewer) { + boolean success = false; + if (Desktop.isDesktopSupported()) { + try { + Desktop.getDesktop().open(fileToOpenWithOSViewer); + success = true; + } catch (IOException ex) { + logger.warn("No application registered to open file {}", fileToOpenWithOSViewer.getAbsolutePath()); //$NON-NLS-1$ + } + } + return success; + } + public static String testPostgreSQLConnection(String host, String port, String dbName, String username, + String password) { + String message = "Connection OK!"; + try { + Driver postgresDriver = new Driver(); + DriverManager.registerDriver(postgresDriver, null); + String url = "jdbc:postgresql://" + host + ":" + port + "/" + dbName; + try( Connection conn = DriverManager.getConnection(url, username, password) ){ + logger.debug("PostgreSQL Connection is valid! {}", conn.isValid(10) );// 10 sec + } + } catch (Exception e) { + logger.error("Error connecting to DB while testing", e); + message = e.getMessage(); + } + return message; } + } From 4e3271d5baaa651e5db318cd034cab4bd054335e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:32 +0100 Subject: [PATCH 1311/1620] New translations GrasslandSubdivision.java (English) --- .../earth/app/view/Messages_en.properties | 147 ++---------------- 1 file changed, 9 insertions(+), 138 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 5ec1dff27b..0a8edd0b43 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,138 +1,9 @@ -package org.openforis.collect.earth.app.view; - -import java.awt.event.ActionEvent; -import java.io.File; -import java.io.IOException; - -import javax.swing.JFrame; - -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.AnalysisSaikuService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import net.lingala.zip4j.ZipFile; -import net.lingala.zip4j.model.ZipParameters; - -public class SaikuToolExportListener extends SaikuAnalysisListener { - private Logger logger = LoggerFactory.getLogger( SaikuToolExportListener.class); - private LocalPropertiesService localPropertiesService; - - private final static String PREFIX_FOLDER = "saiku-server_2.6"; - - public SaikuToolExportListener(JFrame frame, GenerateDatabaseStarter saikuStarter, LocalPropertiesService localPropertiesService) { - super(frame, saikuStarter); - this.localPropertiesService = localPropertiesService; - } - - @Override - public void actionPerformed(ActionEvent e) { - try { - - File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.SAIKU_ZIP, true, false, "SaikuTool", localPropertiesService, frame); - - if (exportToFile != null && exportToFile.length > 0) { - CollectEarthWindow.startWaiting(frame); - - generateNewSaikuZip( exportToFile[0] ); - } - - }catch (Exception e1) { - logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ - } finally{ - CollectEarthWindow.endWaiting(frame); - } - } - - private void generateNewSaikuZip(File zipFileOutput ) { - InfiniteProgressMonitor progressMonitor = new InfiniteProgressMonitor( - frame, - Messages.getString("SaikuToolExportListener.1"), - Messages.getString("SaikuToolExportListener.2") - ); - - Thread threadGeneratingDB = new Thread("Generating ZIP Saiku Tool"){ //$NON-NLS-1$ - @Override - public void run() { - exportDataToRDB(false); - try ( - ZipFile outputSaikuZip = new ZipFile(zipFileOutput); - ){ - - File saikuFolder = new File(localPropertiesService.getSaikuFolder() ); - File javaFolder = new File( saikuFolder.getAbsolutePath() + "/../java" ); // The Java and Saiku folders are on the same level - - ZipParameters zipParameters = new ZipParameters(); - zipParameters.setExcludeFileFilter( - file -> - file.getName().endsWith( "log") // exclude log files! - || - file.getParent().endsWith("temp" ) // exclude temp folder! - ); - outputSaikuZip.addFolder( saikuFolder, zipParameters ); - - // Copy the original ZIP files contained in the root ( saiku-server_2.6.zip ) to a new temporary file - - // create DB folder - // Copy the Saiku DB to DB/collectEarthDatabase.dbSaiku - zipParameters.setFileNameInZip(PREFIX_FOLDER+"/DB/" + EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME - + EarthConstants.SAIKU_RDB_SUFFIX); - outputSaikuZip.addFile( - new File(AnalysisSaikuService.COLLECT_EARTH_DATABASE_RDB_DB), zipParameters - ); - - // Copy the Mondrian Cube XML to DB/collectEarthCubes.xml - zipParameters = new ZipParameters(); - zipParameters.setFileNameInZip(PREFIX_FOLDER+"/DB/" + AnalysisSaikuService.MDX_XML ); - File mdxFile = new File(localPropertiesService.getProjectFolder() + File.separatorChar + AnalysisSaikuService.MDX_XML); - outputSaikuZip.addFile( - mdxFile, zipParameters - ); - - - // Change the configuration file to use the stand alone version! - - // Add java to the Saiku ZIP - zipParameters = new ZipParameters(); - zipParameters.setRootFolderNameInZip(PREFIX_FOLDER ); - outputSaikuZip.addFolder( javaFolder, zipParameters ); - - - // Move START_SAIKU and TERMINATE SAIKU to the root folder - File startSaiku = new File("resources/START SAIKU.bat"); - outputSaikuZip.addFile( - startSaiku - ); - - File terminateSaiku = new File("resources/TERMINATE SAIKU.bat"); - outputSaikuZip.addFile( - terminateSaiku - ); - - File readme = new File("resources/README - INSTALLATION AND RUNNING.txt"); - outputSaikuZip.addFile( - readme - ); - - - } catch (IOException e) { - logger.error("Error generating SAIKU tool at " + zipFileOutput.getAbsolutePath() ); - } finally{ - if( progressMonitor != null ){ - progressMonitor.close(); - } - - CollectEarthUtils.openFile( zipFileOutput ); - } - } - }; - - threadGeneratingDB.start(); - - progressMonitor.showLater(); - - - } -} +package org.openforis.collect.earth.ipcc.model; + +public class GrasslandSubdivision extends ManagementLandUseSubdivision{ + + public GrasslandSubdivision( String code, String name, ManagementType type) { + super( LandUseCategory.G, code, name, type); + } + +} \ No newline at end of file From ad693c24a65fbcf9b5034ddcfebe0460bd980294 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:33 +0100 Subject: [PATCH 1312/1620] New translations LandUseCategory.java (French) --- .../earth/app/view/Messages_fr.properties | 239 +++--------------- 1 file changed, 31 insertions(+), 208 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 8fa17ec627..5a783a70d8 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,208 +1,31 @@ -package org.openforis.collect.earth.app; - -import java.awt.Desktop; -import java.awt.Font; -import java.awt.FontFormatException; -import java.awt.GraphicsEnvironment; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.sql.Connection; -import java.sql.DriverManager; -import java.util.Enumeration; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import javax.swing.UIManager; - -import org.apache.commons.codec.digest.DigestUtils; -import org.apache.commons.lang3.SystemUtils; -import org.openforis.collect.earth.app.EarthConstants.UI_LANGUAGE; -import org.openforis.collect.earth.app.view.Messages; -import org.postgresql.Driver; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import net.lingala.zip4j.ZipFile; -import net.lingala.zip4j.exception.ZipException; -import net.lingala.zip4j.model.ZipParameters; -import net.lingala.zip4j.model.enums.CompressionLevel; -import net.lingala.zip4j.model.enums.CompressionMethod; - -public class CollectEarthUtils { - - private static final Logger logger = LoggerFactory.getLogger(CollectEarthUtils.class); - - private CollectEarthUtils() { - } - - public static String getMd5FromFolder(File folder) throws IOException { - - if (!folder.isDirectory()) { - throw new IllegalArgumentException("The file passed as an argument needs to be a folder!"); - } - StringBuilder md5Hex = new StringBuilder(); - - try( Stream paths = Files.walk(Paths.get(folder.toURI()), 3); ) { - List listFiles = paths.filter(Files::isRegularFile).map(Path::toFile) - .collect(Collectors.toList()); - for (File file : listFiles) { - md5Hex.append(DigestUtils.md5Hex(new FileInputStream(file))); - } - return DigestUtils.md5Hex(md5Hex.toString().getBytes()); - } - } - - public static String getMd5FromFile(String filePath) throws IOException { - return DigestUtils.md5Hex(new FileInputStream(new File(filePath))); - } - - public static void setFontDependingOnLanguaue(UI_LANGUAGE uiLanguage) { - if (uiLanguage == UI_LANGUAGE.LO) { - String ttfFileName = "Phetsarath_OT.ttf"; - // create the font - setUiFont(ttfFileName); - } else if (uiLanguage == UI_LANGUAGE.MN) { - String ttfFileName = "arhangai.ttf"; - // create the font - setUiFont(ttfFileName); - } else { - CollectEarthUtils.setUiFont(new javax.swing.plaf.FontUIResource("Arial Unicode MS", Font.PLAIN, 12)); - } - } - - public static void setUiFont(String ttfFileName) { - try { - // create the font to use. Specify the size! - InputStream fontStream = CollectEarthUtils.class.getResourceAsStream(ttfFileName); - Font laoFont = Font.createFont(Font.TRUETYPE_FONT, fontStream).deriveFont(12f); - GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); - // register the font - ge.registerFont(laoFont); - CollectEarthUtils.setUiFont(new javax.swing.plaf.FontUIResource(laoFont.getFontName(), Font.PLAIN, 12)); - } catch (IOException | FontFormatException e) { - logger.error("error setting the font " + ttfFileName, e); - } - - } - - private static void setUiFont(javax.swing.plaf.FontUIResource f) { - Enumeration keys = UIManager.getDefaults().keys(); - while (keys.hasMoreElements()) { - Object key = keys.nextElement(); - Object value = UIManager.get(key); - if (value instanceof javax.swing.plaf.FontUIResource) - UIManager.put(key, f); - } - } - - public static ZipFile addFileToZip(String pathToDestinationZip, File fileToAdd, String fileNameInZip) throws IOException { - File destinationZip = new File(pathToDestinationZip); - return addFileToZip(destinationZip, fileToAdd, fileNameInZip); - } - - public static ZipFile addFileToZip(File destinationZip, File fileToAdd, String fileNameInZip) throws IOException { - try( ZipFile zipFile = new ZipFile(destinationZip) ){ - ZipParameters zipParameters = new ZipParameters(); - // COMP_DEFLATE is for compression - zipParameters.setCompressionMethod(CompressionMethod.DEFLATE); - // DEFLATE_LEVEL_ULTRA = maximum compression - zipParameters.setCompressionLevel(CompressionLevel.ULTRA); - zipParameters.setFileNameInZip(fileNameInZip); - zipFile.addFile(fileToAdd, zipParameters); - return zipFile; - }catch(Exception e) { - logger.error("Error adding file to ZIP", e); - return null; - } - } - - public static String getComputerIp() { - try { - return InetAddress.getLocalHost().getHostAddress(); - } catch (final UnknownHostException e) { - logger.warn("Unknown IP address", e); //$NON-NLS-1$ - return Messages.getString("OptionWizard.11"); //$NON-NLS-1$ - } - } - - public static void addFolderToZip(ZipFile zipFile, File folderToCompress) throws ZipException { - ZipParameters zipParameters = new ZipParameters(); - // COMP_DEFLATE is for compression - zipParameters.setCompressionMethod(CompressionMethod.DEFLATE); - // DEFLATE_LEVEL_ULTRA = maximum compression - zipParameters.setCompressionLevel(CompressionLevel.ULTRA); - - if (folderToCompress.exists() && folderToCompress.isDirectory()) { - zipFile.addFolder(folderToCompress, zipParameters); - } - } - - public static void openFolderInExplorer(String folder) throws IOException { - if (Desktop.isDesktopSupported()) { - Desktop.getDesktop().open(new File(folder)); - } else { - if (SystemUtils.IS_OS_WINDOWS) { - new ProcessBuilder("explorer.exe", "/open," + folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } else if (SystemUtils.IS_OS_MAC) { - new ProcessBuilder("usr/bin/open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } else if (SystemUtils.IS_OS_UNIX) { - tryUnixFileExplorers(folder); - } - } - } - - public static void tryUnixFileExplorers(String folder) throws IOException { - try { - new ProcessBuilder("nautilus", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (IOException e1) { - try { - new ProcessBuilder("gnome-open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (IOException e2) { - try { - new ProcessBuilder("kde-open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (IOException e3) { - new ProcessBuilder("caja", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - } - } - - public static boolean openFile(File fileToOpenWithOSViewer) { - boolean success = false; - if (Desktop.isDesktopSupported()) { - try { - Desktop.getDesktop().open(fileToOpenWithOSViewer); - success = true; - } catch (IOException ex) { - logger.warn("No application registered to open file {}", fileToOpenWithOSViewer.getAbsolutePath()); //$NON-NLS-1$ - } - } - return success; - } - - public static String testPostgreSQLConnection(String host, String port, String dbName, String username, - String password) { - String message = "Connection OK!"; - try { - Driver postgresDriver = new Driver(); - DriverManager.registerDriver(postgresDriver, null); - String url = "jdbc:postgresql://" + host + ":" + port + "/" + dbName; - try( Connection conn = DriverManager.getConnection(url, username, password) ){ - logger.debug("PostgreSQL Connection is valid! {}", conn.isValid(10) );// 10 sec - } - } catch (Exception e) { - logger.error("Error connecting to DB while testing", e); - message = e.getMessage(); - } - return message; - } - -} +package org.openforis.collect.earth.ipcc.model; + +public enum LandUseCategory { + F ("F", "Forest"), + C ("C", "Cropland"), + S ("S", "Settlement"), + W ("W", "Wetland"), + G ("G","Grassland"), + O ("O", "Otherland"); + + private final String code; + private final String name; + + private LandUseCategory(String code, String name) { + this.code = code; + this.name = name; + } + + public String getCode() { + return code; + } + + public String getName() { + return name; + } + + @Override + public String toString() { + return getCode(); + } +} From f14c2791c0ffa7aed587d50f9623855a11aff576 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:34 +0100 Subject: [PATCH 1313/1620] New translations WetlandSubdivision.java (Spanish) --- .../earth/app/view/Messages_es.properties | 217 +----------------- 1 file changed, 9 insertions(+), 208 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 8fa17ec627..6cae1b99f2 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,208 +1,9 @@ -package org.openforis.collect.earth.app; - -import java.awt.Desktop; -import java.awt.Font; -import java.awt.FontFormatException; -import java.awt.GraphicsEnvironment; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.sql.Connection; -import java.sql.DriverManager; -import java.util.Enumeration; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import javax.swing.UIManager; - -import org.apache.commons.codec.digest.DigestUtils; -import org.apache.commons.lang3.SystemUtils; -import org.openforis.collect.earth.app.EarthConstants.UI_LANGUAGE; -import org.openforis.collect.earth.app.view.Messages; -import org.postgresql.Driver; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import net.lingala.zip4j.ZipFile; -import net.lingala.zip4j.exception.ZipException; -import net.lingala.zip4j.model.ZipParameters; -import net.lingala.zip4j.model.enums.CompressionLevel; -import net.lingala.zip4j.model.enums.CompressionMethod; - -public class CollectEarthUtils { - - private static final Logger logger = LoggerFactory.getLogger(CollectEarthUtils.class); - - private CollectEarthUtils() { - } - - public static String getMd5FromFolder(File folder) throws IOException { - - if (!folder.isDirectory()) { - throw new IllegalArgumentException("The file passed as an argument needs to be a folder!"); - } - StringBuilder md5Hex = new StringBuilder(); - - try( Stream paths = Files.walk(Paths.get(folder.toURI()), 3); ) { - List listFiles = paths.filter(Files::isRegularFile).map(Path::toFile) - .collect(Collectors.toList()); - for (File file : listFiles) { - md5Hex.append(DigestUtils.md5Hex(new FileInputStream(file))); - } - return DigestUtils.md5Hex(md5Hex.toString().getBytes()); - } - } - - public static String getMd5FromFile(String filePath) throws IOException { - return DigestUtils.md5Hex(new FileInputStream(new File(filePath))); - } - - public static void setFontDependingOnLanguaue(UI_LANGUAGE uiLanguage) { - if (uiLanguage == UI_LANGUAGE.LO) { - String ttfFileName = "Phetsarath_OT.ttf"; - // create the font - setUiFont(ttfFileName); - } else if (uiLanguage == UI_LANGUAGE.MN) { - String ttfFileName = "arhangai.ttf"; - // create the font - setUiFont(ttfFileName); - } else { - CollectEarthUtils.setUiFont(new javax.swing.plaf.FontUIResource("Arial Unicode MS", Font.PLAIN, 12)); - } - } - - public static void setUiFont(String ttfFileName) { - try { - // create the font to use. Specify the size! - InputStream fontStream = CollectEarthUtils.class.getResourceAsStream(ttfFileName); - Font laoFont = Font.createFont(Font.TRUETYPE_FONT, fontStream).deriveFont(12f); - GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); - // register the font - ge.registerFont(laoFont); - CollectEarthUtils.setUiFont(new javax.swing.plaf.FontUIResource(laoFont.getFontName(), Font.PLAIN, 12)); - } catch (IOException | FontFormatException e) { - logger.error("error setting the font " + ttfFileName, e); - } - - } - - private static void setUiFont(javax.swing.plaf.FontUIResource f) { - Enumeration keys = UIManager.getDefaults().keys(); - while (keys.hasMoreElements()) { - Object key = keys.nextElement(); - Object value = UIManager.get(key); - if (value instanceof javax.swing.plaf.FontUIResource) - UIManager.put(key, f); - } - } - - public static ZipFile addFileToZip(String pathToDestinationZip, File fileToAdd, String fileNameInZip) throws IOException { - File destinationZip = new File(pathToDestinationZip); - return addFileToZip(destinationZip, fileToAdd, fileNameInZip); - } - - public static ZipFile addFileToZip(File destinationZip, File fileToAdd, String fileNameInZip) throws IOException { - try( ZipFile zipFile = new ZipFile(destinationZip) ){ - ZipParameters zipParameters = new ZipParameters(); - // COMP_DEFLATE is for compression - zipParameters.setCompressionMethod(CompressionMethod.DEFLATE); - // DEFLATE_LEVEL_ULTRA = maximum compression - zipParameters.setCompressionLevel(CompressionLevel.ULTRA); - zipParameters.setFileNameInZip(fileNameInZip); - zipFile.addFile(fileToAdd, zipParameters); - return zipFile; - }catch(Exception e) { - logger.error("Error adding file to ZIP", e); - return null; - } - } - - public static String getComputerIp() { - try { - return InetAddress.getLocalHost().getHostAddress(); - } catch (final UnknownHostException e) { - logger.warn("Unknown IP address", e); //$NON-NLS-1$ - return Messages.getString("OptionWizard.11"); //$NON-NLS-1$ - } - } - - public static void addFolderToZip(ZipFile zipFile, File folderToCompress) throws ZipException { - ZipParameters zipParameters = new ZipParameters(); - // COMP_DEFLATE is for compression - zipParameters.setCompressionMethod(CompressionMethod.DEFLATE); - // DEFLATE_LEVEL_ULTRA = maximum compression - zipParameters.setCompressionLevel(CompressionLevel.ULTRA); - - if (folderToCompress.exists() && folderToCompress.isDirectory()) { - zipFile.addFolder(folderToCompress, zipParameters); - } - } - - public static void openFolderInExplorer(String folder) throws IOException { - if (Desktop.isDesktopSupported()) { - Desktop.getDesktop().open(new File(folder)); - } else { - if (SystemUtils.IS_OS_WINDOWS) { - new ProcessBuilder("explorer.exe", "/open," + folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } else if (SystemUtils.IS_OS_MAC) { - new ProcessBuilder("usr/bin/open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } else if (SystemUtils.IS_OS_UNIX) { - tryUnixFileExplorers(folder); - } - } - } - - public static void tryUnixFileExplorers(String folder) throws IOException { - try { - new ProcessBuilder("nautilus", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (IOException e1) { - try { - new ProcessBuilder("gnome-open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (IOException e2) { - try { - new ProcessBuilder("kde-open", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (IOException e3) { - new ProcessBuilder("caja", folder).start(); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - } - } - - public static boolean openFile(File fileToOpenWithOSViewer) { - boolean success = false; - if (Desktop.isDesktopSupported()) { - try { - Desktop.getDesktop().open(fileToOpenWithOSViewer); - success = true; - } catch (IOException ex) { - logger.warn("No application registered to open file {}", fileToOpenWithOSViewer.getAbsolutePath()); //$NON-NLS-1$ - } - } - return success; - } - - public static String testPostgreSQLConnection(String host, String port, String dbName, String username, - String password) { - String message = "Connection OK!"; - try { - Driver postgresDriver = new Driver(); - DriverManager.registerDriver(postgresDriver, null); - String url = "jdbc:postgresql://" + host + ":" + port + "/" + dbName; - try( Connection conn = DriverManager.getConnection(url, username, password) ){ - logger.debug("PostgreSQL Connection is valid! {}", conn.isValid(10) );// 10 sec - } - } catch (Exception e) { - logger.error("Error connecting to DB while testing", e); - message = e.getMessage(); - } - return message; - } - -} +package org.openforis.collect.earth.ipcc.model; + +public class WetlandSubdivision extends ManagementLandUseSubdivision{ + + public WetlandSubdivision( String code, String name, ManagementType type) { + super( LandUseCategory.W, code, name, type); + } + +} From 901d2e17c83ad81e8c1edf598e1873cfb8dd127b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:35 +0100 Subject: [PATCH 1314/1620] New translations LandUseCategory.java (Spanish) --- .../earth/app/view/Messages_es.properties | 30 ++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 6cae1b99f2..5a783a70d8 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,9 +1,31 @@ package org.openforis.collect.earth.ipcc.model; -public class WetlandSubdivision extends ManagementLandUseSubdivision{ +public enum LandUseCategory { + F ("F", "Forest"), + C ("C", "Cropland"), + S ("S", "Settlement"), + W ("W", "Wetland"), + G ("G","Grassland"), + O ("O", "Otherland"); - public WetlandSubdivision( String code, String name, ManagementType type) { - super( LandUseCategory.W, code, name, type); + private final String code; + private final String name; + + private LandUseCategory(String code, String name) { + this.code = code; + this.name = name; + } + + public String getCode() { + return code; + } + + public String getName() { + return name; + } + + @Override + public String toString() { + return getCode(); } - } From 7366e04889426e4b8be9973ca7a12689058cdaf0 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:36 +0100 Subject: [PATCH 1315/1620] New translations SettlementType.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 160 +++--------------- 1 file changed, 22 insertions(+), 138 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 5ec1dff27b..5c0501083e 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,138 +1,22 @@ -package org.openforis.collect.earth.app.view; - -import java.awt.event.ActionEvent; -import java.io.File; -import java.io.IOException; - -import javax.swing.JFrame; - -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.EarthConstants; -import org.openforis.collect.earth.app.service.AnalysisSaikuService; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import net.lingala.zip4j.ZipFile; -import net.lingala.zip4j.model.ZipParameters; - -public class SaikuToolExportListener extends SaikuAnalysisListener { - private Logger logger = LoggerFactory.getLogger( SaikuToolExportListener.class); - private LocalPropertiesService localPropertiesService; - - private final static String PREFIX_FOLDER = "saiku-server_2.6"; - - public SaikuToolExportListener(JFrame frame, GenerateDatabaseStarter saikuStarter, LocalPropertiesService localPropertiesService) { - super(frame, saikuStarter); - this.localPropertiesService = localPropertiesService; - } - - @Override - public void actionPerformed(ActionEvent e) { - try { - - File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.SAIKU_ZIP, true, false, "SaikuTool", localPropertiesService, frame); - - if (exportToFile != null && exportToFile.length > 0) { - CollectEarthWindow.startWaiting(frame); - - generateNewSaikuZip( exportToFile[0] ); - } - - }catch (Exception e1) { - logger.error("Error starting Saiku server", e1); //$NON-NLS-1$ - } finally{ - CollectEarthWindow.endWaiting(frame); - } - } - - private void generateNewSaikuZip(File zipFileOutput ) { - InfiniteProgressMonitor progressMonitor = new InfiniteProgressMonitor( - frame, - Messages.getString("SaikuToolExportListener.1"), - Messages.getString("SaikuToolExportListener.2") - ); - - Thread threadGeneratingDB = new Thread("Generating ZIP Saiku Tool"){ //$NON-NLS-1$ - @Override - public void run() { - exportDataToRDB(false); - try ( - ZipFile outputSaikuZip = new ZipFile(zipFileOutput); - ){ - - File saikuFolder = new File(localPropertiesService.getSaikuFolder() ); - File javaFolder = new File( saikuFolder.getAbsolutePath() + "/../java" ); // The Java and Saiku folders are on the same level - - ZipParameters zipParameters = new ZipParameters(); - zipParameters.setExcludeFileFilter( - file -> - file.getName().endsWith( "log") // exclude log files! - || - file.getParent().endsWith("temp" ) // exclude temp folder! - ); - outputSaikuZip.addFolder( saikuFolder, zipParameters ); - - // Copy the original ZIP files contained in the root ( saiku-server_2.6.zip ) to a new temporary file - - // create DB folder - // Copy the Saiku DB to DB/collectEarthDatabase.dbSaiku - zipParameters.setFileNameInZip(PREFIX_FOLDER+"/DB/" + EarthConstants.COLLECT_EARTH_DATABASE_FILE_NAME - + EarthConstants.SAIKU_RDB_SUFFIX); - outputSaikuZip.addFile( - new File(AnalysisSaikuService.COLLECT_EARTH_DATABASE_RDB_DB), zipParameters - ); - - // Copy the Mondrian Cube XML to DB/collectEarthCubes.xml - zipParameters = new ZipParameters(); - zipParameters.setFileNameInZip(PREFIX_FOLDER+"/DB/" + AnalysisSaikuService.MDX_XML ); - File mdxFile = new File(localPropertiesService.getProjectFolder() + File.separatorChar + AnalysisSaikuService.MDX_XML); - outputSaikuZip.addFile( - mdxFile, zipParameters - ); - - - // Change the configuration file to use the stand alone version! - - // Add java to the Saiku ZIP - zipParameters = new ZipParameters(); - zipParameters.setRootFolderNameInZip(PREFIX_FOLDER ); - outputSaikuZip.addFolder( javaFolder, zipParameters ); - - - // Move START_SAIKU and TERMINATE SAIKU to the root folder - File startSaiku = new File("resources/START SAIKU.bat"); - outputSaikuZip.addFile( - startSaiku - ); - - File terminateSaiku = new File("resources/TERMINATE SAIKU.bat"); - outputSaikuZip.addFile( - terminateSaiku - ); - - File readme = new File("resources/README - INSTALLATION AND RUNNING.txt"); - outputSaikuZip.addFile( - readme - ); - - - } catch (IOException e) { - logger.error("Error generating SAIKU tool at " + zipFileOutput.getAbsolutePath() ); - } finally{ - if( progressMonitor != null ){ - progressMonitor.close(); - } - - CollectEarthUtils.openFile( zipFileOutput ); - } - } - }; - - threadGeneratingDB.start(); - - progressMonitor.showLater(); - - - } -} +package org.openforis.collect.earth.ipcc.model; + +public enum SettlementType { + + TREED("Treed"),OTHER("Other"); + + public final String name; + + private SettlementType(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + @Override + public String toString() { + return getName(); + } + +} From f150320e24772169755bc0436bc189d3554db6df Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:38 +0100 Subject: [PATCH 1316/1620] New translations SettlementType.java (English) --- .../earth/app/view/Messages_en.properties | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 0a8edd0b43..5c0501083e 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,9 +1,22 @@ package org.openforis.collect.earth.ipcc.model; -public class GrasslandSubdivision extends ManagementLandUseSubdivision{ +public enum SettlementType { + + TREED("Treed"),OTHER("Other"); + + public final String name; - public GrasslandSubdivision( String code, String name, ManagementType type) { - super( LandUseCategory.G, code, name, type); + private SettlementType(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + @Override + public String toString() { + return getName(); } -} \ No newline at end of file +} From a87c09e61adedf564c431978825c3ea3c342f6ca Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:39 +0100 Subject: [PATCH 1317/1620] New translations StratumObject.java (French) --- .../earth/app/view/Messages_fr.properties | 58 ++++++++++++------- 1 file changed, 38 insertions(+), 20 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 5a783a70d8..3af8a2cee0 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,31 +1,49 @@ package org.openforis.collect.earth.ipcc.model; -public enum LandUseCategory { - F ("F", "Forest"), - C ("C", "Cropland"), - S ("S", "Settlement"), - W ("W", "Wetland"), - G ("G","Grassland"), - O ("O", "Otherland"); +public class StratumObject { + + String value; + String label; + String description; + + public StratumObject(String value, String label) { + super(); + this.value = value; + this.label = label; + } + + public StratumObject(String value, String label, String description) { + super(); + this.value = value; + this.label = label; + this.description = description; + } - private final String code; - private final String name; - private LandUseCategory(String code, String name) { - this.code = code; - this.name = name; - } + public String getValue() { + return value; + } - public String getCode() { - return code; + public String getLabel() { + return label; } - public String getName() { - return name; + public void setValue(String value) { + this.value = value; } - @Override - public String toString() { - return getCode(); + public void setLabel(String label) { + this.label = label; } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + + } From 90bbc646aa32802ca1a12a842cc44b86282f4ce6 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:40 +0100 Subject: [PATCH 1318/1620] New translations StratumObject.java (Spanish) --- .../earth/app/view/Messages_es.properties | 58 ++++++++++++------- 1 file changed, 38 insertions(+), 20 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 5a783a70d8..3af8a2cee0 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,31 +1,49 @@ package org.openforis.collect.earth.ipcc.model; -public enum LandUseCategory { - F ("F", "Forest"), - C ("C", "Cropland"), - S ("S", "Settlement"), - W ("W", "Wetland"), - G ("G","Grassland"), - O ("O", "Otherland"); +public class StratumObject { + + String value; + String label; + String description; + + public StratumObject(String value, String label) { + super(); + this.value = value; + this.label = label; + } + + public StratumObject(String value, String label, String description) { + super(); + this.value = value; + this.label = label; + this.description = description; + } - private final String code; - private final String name; - private LandUseCategory(String code, String name) { - this.code = code; - this.name = name; - } + public String getValue() { + return value; + } - public String getCode() { - return code; + public String getLabel() { + return label; } - public String getName() { - return name; + public void setValue(String value) { + this.value = value; } - @Override - public String toString() { - return getCode(); + public void setLabel(String label) { + this.label = label; } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + + } From a364b0fd190d5347448c2c19112264a862a93259 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:41 +0100 Subject: [PATCH 1319/1620] New translations StratumObject.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 49 ++++++++++++++----- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 5c0501083e..3af8a2cee0 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,22 +1,49 @@ package org.openforis.collect.earth.ipcc.model; -public enum SettlementType { +public class StratumObject { - TREED("Treed"),OTHER("Other"); + String value; + String label; + String description; + + public StratumObject(String value, String label) { + super(); + this.value = value; + this.label = label; + } - public final String name; + public StratumObject(String value, String label, String description) { + super(); + this.value = value; + this.label = label; + this.description = description; + } - private SettlementType(String name) { - this.name = name; - } - public String getName() { - return name; + public String getValue() { + return value; + } + + public String getLabel() { + return label; + } + + public void setValue(String value) { + this.value = value; } - @Override - public String toString() { - return getName(); + public void setLabel(String label) { + this.label = label; } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + } From 6336c67b3227122a0bf99d8562a46d7e72fc147d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:42 +0100 Subject: [PATCH 1320/1620] New translations StratumObject.java (English) --- .../earth/app/view/Messages_en.properties | 49 ++++++++++++++----- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 5c0501083e..3af8a2cee0 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,22 +1,49 @@ package org.openforis.collect.earth.ipcc.model; -public enum SettlementType { +public class StratumObject { - TREED("Treed"),OTHER("Other"); + String value; + String label; + String description; + + public StratumObject(String value, String label) { + super(); + this.value = value; + this.label = label; + } - public final String name; + public StratumObject(String value, String label, String description) { + super(); + this.value = value; + this.label = label; + this.description = description; + } - private SettlementType(String name) { - this.name = name; - } - public String getName() { - return name; + public String getValue() { + return value; + } + + public String getLabel() { + return label; + } + + public void setValue(String value) { + this.value = value; } - @Override - public String toString() { - return getName(); + public void setLabel(String label) { + this.label = label; } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + } From 40e614ba6a1a62c8e5906c309b4a57715768e5f4 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:44 +0100 Subject: [PATCH 1321/1620] New translations WetlandSubdivision.java (French) --- .../earth/app/view/Messages_fr.properties | 46 ++----------------- 1 file changed, 3 insertions(+), 43 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 3af8a2cee0..6cae1b99f2 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,49 +1,9 @@ package org.openforis.collect.earth.ipcc.model; -public class StratumObject { - - String value; - String label; - String description; - - public StratumObject(String value, String label) { - super(); - this.value = value; - this.label = label; - } - - public StratumObject(String value, String label, String description) { - super(); - this.value = value; - this.label = label; - this.description = description; - } +public class WetlandSubdivision extends ManagementLandUseSubdivision{ - - public String getValue() { - return value; - } - - public String getLabel() { - return label; - } - - public void setValue(String value) { - this.value = value; - } - - public void setLabel(String label) { - this.label = label; - } - - public String getDescription() { - return description; + public WetlandSubdivision( String code, String name, ManagementType type) { + super( LandUseCategory.W, code, name, type); } - - public void setDescription(String description) { - this.description = description; - } - - } From 65cb9ace630af852ea870559f979eb599ceb4022 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:45 +0100 Subject: [PATCH 1322/1620] New translations WetlandSubdivision.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 46 ++----------------- 1 file changed, 3 insertions(+), 43 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 3af8a2cee0..6cae1b99f2 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,49 +1,9 @@ package org.openforis.collect.earth.ipcc.model; -public class StratumObject { - - String value; - String label; - String description; - - public StratumObject(String value, String label) { - super(); - this.value = value; - this.label = label; - } - - public StratumObject(String value, String label, String description) { - super(); - this.value = value; - this.label = label; - this.description = description; - } +public class WetlandSubdivision extends ManagementLandUseSubdivision{ - - public String getValue() { - return value; - } - - public String getLabel() { - return label; - } - - public void setValue(String value) { - this.value = value; - } - - public void setLabel(String label) { - this.label = label; - } - - public String getDescription() { - return description; + public WetlandSubdivision( String code, String name, ManagementType type) { + super( LandUseCategory.W, code, name, type); } - - public void setDescription(String description) { - this.description = description; - } - - } From 5e1fea2053a99ee2f76dbcba87a8f90404edd93d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:46 +0100 Subject: [PATCH 1323/1620] New translations SettlementSubdivision.java (English) --- .../earth/app/view/Messages_en.properties | 49 ++++--------------- 1 file changed, 10 insertions(+), 39 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 3af8a2cee0..3978dc2be1 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,49 +1,20 @@ package org.openforis.collect.earth.ipcc.model; -public class StratumObject { - - String value; - String label; - String description; - - public StratumObject(String value, String label) { - super(); - this.value = value; - this.label = label; - } +public class SettlementSubdivision extends LandUseSubdivision{ - public StratumObject(String value, String label, String description) { - super(); - this.value = value; - this.label = label; - this.description = description; - } + protected SettlementType type; - - public String getValue() { - return value; - } - - public String getLabel() { - return label; + public SettlementSubdivision( String code, String name, SettlementType type) { + super(LandUseCategory.S, code, name); + setType(type); } - public void setValue(String value) { - this.value = value; + public SettlementType getType() { + return type; } - public void setLabel(String label) { - this.label = label; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - + public void setType(SettlementType type) { + this.type = type; + }; } From 81f09349b1096e82e6b7b5e445c92981417459af Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:47 +0100 Subject: [PATCH 1324/1620] New translations WetlandSubdivision.java (English) --- .../earth/app/view/Messages_en.properties | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 3978dc2be1..6cae1b99f2 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,20 +1,9 @@ package org.openforis.collect.earth.ipcc.model; -public class SettlementSubdivision extends LandUseSubdivision{ +public class WetlandSubdivision extends ManagementLandUseSubdivision{ - protected SettlementType type; - - public SettlementSubdivision( String code, String name, SettlementType type) { - super(LandUseCategory.S, code, name); - setType(type); - } - - public SettlementType getType() { - return type; + public WetlandSubdivision( String code, String name, ManagementType type) { + super( LandUseCategory.W, code, name, type); } - - public void setType(SettlementType type) { - this.type = type; - }; } From b04a182d1c173524a5eda524d64603dea3c20371 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:48 +0100 Subject: [PATCH 1325/1620] New translations AssignSubdivisionTypesWizard.java (French) --- .../earth/app/view/Messages_fr.properties | 168 +++++++++++++++++- 1 file changed, 164 insertions(+), 4 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 6cae1b99f2..f4649a2339 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,9 +1,169 @@ -package org.openforis.collect.earth.ipcc.model; +package org.openforis.collect.earth.ipcc.view; -public class WetlandSubdivision extends ManagementLandUseSubdivision{ +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; + +import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; +import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; +import org.openforis.collect.earth.ipcc.model.CroplandType; +import org.openforis.collect.earth.ipcc.model.ForestSubdivision; +import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +import org.openforis.collect.earth.ipcc.model.ManagementType; +import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; +import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; +import org.openforis.collect.earth.ipcc.model.SettlementType; +import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import se.gustavkarlsson.gwiz.AbstractWizardPage; +import se.gustavkarlsson.gwiz.WizardController; + +public class AssignSubdivisionTypesWizard { + + JDialogWizard wizard ; + private Logger logger = LoggerFactory.getLogger( AssignSubdivisionTypesWizard.class); - public WetlandSubdivision( String code, String name, ManagementType type) { - super( LandUseCategory.W, code, name, type); + public void initializeTypes(List landUseSubdivisions ) { + + LandUseSubdivisionUtils.setLandUseSubdivisions(landUseSubdivisions); + + // Create a new wizard (this one is based on a JFrame) + wizard = new JDialogWizard(null, "Assign Management Type", true); + + wizard.addWindowListener( new WindowAdapter() { + public void windowClosing(WindowEvent e) { + if( !isWizardFinished() ) { + try { + SwingUtilities.invokeLater( + () -> JOptionPane.showMessageDialog(wizard, + "You need to assign management types for all subdivisions and then click on \"Finish\" to proceed" , + "Closing without finishing assginment of subdivisions", JOptionPane.WARNING_MESSAGE) + ); + } catch (Exception ex) { + logger.error("Error showing message",ex); + } + } + } + }); + + // Create the first page of the wizard + AbstractWizardPage forestPage = new ForestPage(); + + // Create the controller for wizard + WizardController wizardController = new WizardController(wizard); + + // Start the wizard and show it + wizardController.startWizard(forestPage); + wizard.setVisible(true); + } + public boolean isWizardFinished() { + return wizard.isWizardFinished(); + } + + public static void main(String[] args) { + + List luses = new ArrayList(); + + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + + luses.add( new WetlandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new WetlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new WetlandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new WetlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new WetlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new WetlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + + luses.add( new GrasslandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new GrasslandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new GrasslandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new GrasslandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new GrasslandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new GrasslandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + + luses.add( new OtherlandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new OtherlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new OtherlandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new OtherlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new OtherlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new OtherlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + + luses.add( new SettlementSubdivision("a", "aaaaa", SettlementType.TREED ) ); + luses.add( new SettlementSubdivision("b", "aaaaa", SettlementType.TREED ) ); + luses.add( new SettlementSubdivision("c", "aaaaa", SettlementType.TREED ) ); + luses.add( new SettlementSubdivision("f", "aaaaa", SettlementType.TREED ) ); + luses.add( new SettlementSubdivision("b", "aaaaa", SettlementType.OTHER ) ); + luses.add( new SettlementSubdivision("f", "aaaaa", SettlementType.OTHER ) ); + + AssignSubdivisionTypesWizard wizard = new AssignSubdivisionTypesWizard(); + + wizard.initializeTypes(luses); + } + } + + From e9c5a781323ae2e4732e4c27e13df7809f2667ef Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:51 +0100 Subject: [PATCH 1326/1620] New translations AssignSubdivisionTypesWizard.java (Spanish) --- .../earth/app/view/Messages_es.properties | 190 ++++++++++++++---- 1 file changed, 155 insertions(+), 35 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 3af8a2cee0..f4649a2339 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,49 +1,169 @@ -package org.openforis.collect.earth.ipcc.model; +package org.openforis.collect.earth.ipcc.view; -public class StratumObject { +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.util.ArrayList; +import java.util.List; - String value; - String label; - String description; +import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; - public StratumObject(String value, String label) { - super(); - this.value = value; - this.label = label; - } +import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; +import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; +import org.openforis.collect.earth.ipcc.model.CroplandType; +import org.openforis.collect.earth.ipcc.model.ForestSubdivision; +import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +import org.openforis.collect.earth.ipcc.model.ManagementType; +import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; +import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; +import org.openforis.collect.earth.ipcc.model.SettlementType; +import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import se.gustavkarlsson.gwiz.AbstractWizardPage; +import se.gustavkarlsson.gwiz.WizardController; + +public class AssignSubdivisionTypesWizard { + + JDialogWizard wizard ; + private Logger logger = LoggerFactory.getLogger( AssignSubdivisionTypesWizard.class); - public StratumObject(String value, String label, String description) { - super(); - this.value = value; - this.label = label; - this.description = description; + public void initializeTypes(List landUseSubdivisions ) { + + LandUseSubdivisionUtils.setLandUseSubdivisions(landUseSubdivisions); + + // Create a new wizard (this one is based on a JFrame) + wizard = new JDialogWizard(null, "Assign Management Type", true); + + wizard.addWindowListener( new WindowAdapter() { + public void windowClosing(WindowEvent e) { + if( !isWizardFinished() ) { + try { + SwingUtilities.invokeLater( + () -> JOptionPane.showMessageDialog(wizard, + "You need to assign management types for all subdivisions and then click on \"Finish\" to proceed" , + "Closing without finishing assginment of subdivisions", JOptionPane.WARNING_MESSAGE) + ); + } catch (Exception ex) { + logger.error("Error showing message",ex); + } + } + } + }); + + // Create the first page of the wizard + AbstractWizardPage forestPage = new ForestPage(); + + // Create the controller for wizard + WizardController wizardController = new WizardController(wizard); + + // Start the wizard and show it + wizardController.startWizard(forestPage); + wizard.setVisible(true); + } - - public String getValue() { - return value; + public boolean isWizardFinished() { + return wizard.isWizardFinished(); } - public String getLabel() { - return label; - } + public static void main(String[] args) { - public void setValue(String value) { - this.value = value; - } + List luses = new ArrayList(); - public void setLabel(String label) { - this.label = label; - } + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - public String getDescription() { - return description; - } + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - public void setDescription(String description) { - this.description = description; + luses.add( new WetlandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new WetlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new WetlandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new WetlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new WetlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new WetlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + + luses.add( new GrasslandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new GrasslandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new GrasslandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new GrasslandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new GrasslandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new GrasslandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + + luses.add( new OtherlandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new OtherlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new OtherlandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new OtherlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new OtherlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new OtherlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + + luses.add( new SettlementSubdivision("a", "aaaaa", SettlementType.TREED ) ); + luses.add( new SettlementSubdivision("b", "aaaaa", SettlementType.TREED ) ); + luses.add( new SettlementSubdivision("c", "aaaaa", SettlementType.TREED ) ); + luses.add( new SettlementSubdivision("f", "aaaaa", SettlementType.TREED ) ); + luses.add( new SettlementSubdivision("b", "aaaaa", SettlementType.OTHER ) ); + luses.add( new SettlementSubdivision("f", "aaaaa", SettlementType.OTHER ) ); + + AssignSubdivisionTypesWizard wizard = new AssignSubdivisionTypesWizard(); + + wizard.initializeTypes(luses); } - - - + } + + From 6ffdf95f025623453b1cb0880a51277672383dcf Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:52 +0100 Subject: [PATCH 1327/1620] New translations AssignSubdivisionTypesWizard.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 168 +++++++++++++++++- 1 file changed, 164 insertions(+), 4 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 6cae1b99f2..f4649a2339 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,9 +1,169 @@ -package org.openforis.collect.earth.ipcc.model; +package org.openforis.collect.earth.ipcc.view; -public class WetlandSubdivision extends ManagementLandUseSubdivision{ +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; + +import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; +import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; +import org.openforis.collect.earth.ipcc.model.CroplandType; +import org.openforis.collect.earth.ipcc.model.ForestSubdivision; +import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +import org.openforis.collect.earth.ipcc.model.ManagementType; +import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; +import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; +import org.openforis.collect.earth.ipcc.model.SettlementType; +import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import se.gustavkarlsson.gwiz.AbstractWizardPage; +import se.gustavkarlsson.gwiz.WizardController; + +public class AssignSubdivisionTypesWizard { + + JDialogWizard wizard ; + private Logger logger = LoggerFactory.getLogger( AssignSubdivisionTypesWizard.class); - public WetlandSubdivision( String code, String name, ManagementType type) { - super( LandUseCategory.W, code, name, type); + public void initializeTypes(List landUseSubdivisions ) { + + LandUseSubdivisionUtils.setLandUseSubdivisions(landUseSubdivisions); + + // Create a new wizard (this one is based on a JFrame) + wizard = new JDialogWizard(null, "Assign Management Type", true); + + wizard.addWindowListener( new WindowAdapter() { + public void windowClosing(WindowEvent e) { + if( !isWizardFinished() ) { + try { + SwingUtilities.invokeLater( + () -> JOptionPane.showMessageDialog(wizard, + "You need to assign management types for all subdivisions and then click on \"Finish\" to proceed" , + "Closing without finishing assginment of subdivisions", JOptionPane.WARNING_MESSAGE) + ); + } catch (Exception ex) { + logger.error("Error showing message",ex); + } + } + } + }); + + // Create the first page of the wizard + AbstractWizardPage forestPage = new ForestPage(); + + // Create the controller for wizard + WizardController wizardController = new WizardController(wizard); + + // Start the wizard and show it + wizardController.startWizard(forestPage); + wizard.setVisible(true); + } + public boolean isWizardFinished() { + return wizard.isWizardFinished(); + } + + public static void main(String[] args) { + + List luses = new ArrayList(); + + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + + luses.add( new WetlandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new WetlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new WetlandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new WetlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new WetlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new WetlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + + luses.add( new GrasslandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new GrasslandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new GrasslandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new GrasslandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new GrasslandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new GrasslandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + + luses.add( new OtherlandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new OtherlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new OtherlandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new OtherlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new OtherlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new OtherlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + + luses.add( new SettlementSubdivision("a", "aaaaa", SettlementType.TREED ) ); + luses.add( new SettlementSubdivision("b", "aaaaa", SettlementType.TREED ) ); + luses.add( new SettlementSubdivision("c", "aaaaa", SettlementType.TREED ) ); + luses.add( new SettlementSubdivision("f", "aaaaa", SettlementType.TREED ) ); + luses.add( new SettlementSubdivision("b", "aaaaa", SettlementType.OTHER ) ); + luses.add( new SettlementSubdivision("f", "aaaaa", SettlementType.OTHER ) ); + + AssignSubdivisionTypesWizard wizard = new AssignSubdivisionTypesWizard(); + + wizard.initializeTypes(luses); + } + } + + From 29b25c575f1e8e1fed5b83731a544be1e430cb9e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:53 +0100 Subject: [PATCH 1328/1620] New translations AssignSubdivisionTypesWizard.java (English) --- .../earth/app/view/Messages_en.properties | 168 +++++++++++++++++- 1 file changed, 164 insertions(+), 4 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 6cae1b99f2..f4649a2339 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,9 +1,169 @@ -package org.openforis.collect.earth.ipcc.model; +package org.openforis.collect.earth.ipcc.view; -public class WetlandSubdivision extends ManagementLandUseSubdivision{ +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; + +import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; +import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; +import org.openforis.collect.earth.ipcc.model.CroplandType; +import org.openforis.collect.earth.ipcc.model.ForestSubdivision; +import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +import org.openforis.collect.earth.ipcc.model.ManagementType; +import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; +import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; +import org.openforis.collect.earth.ipcc.model.SettlementType; +import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import se.gustavkarlsson.gwiz.AbstractWizardPage; +import se.gustavkarlsson.gwiz.WizardController; + +public class AssignSubdivisionTypesWizard { + + JDialogWizard wizard ; + private Logger logger = LoggerFactory.getLogger( AssignSubdivisionTypesWizard.class); - public WetlandSubdivision( String code, String name, ManagementType type) { - super( LandUseCategory.W, code, name, type); + public void initializeTypes(List landUseSubdivisions ) { + + LandUseSubdivisionUtils.setLandUseSubdivisions(landUseSubdivisions); + + // Create a new wizard (this one is based on a JFrame) + wizard = new JDialogWizard(null, "Assign Management Type", true); + + wizard.addWindowListener( new WindowAdapter() { + public void windowClosing(WindowEvent e) { + if( !isWizardFinished() ) { + try { + SwingUtilities.invokeLater( + () -> JOptionPane.showMessageDialog(wizard, + "You need to assign management types for all subdivisions and then click on \"Finish\" to proceed" , + "Closing without finishing assginment of subdivisions", JOptionPane.WARNING_MESSAGE) + ); + } catch (Exception ex) { + logger.error("Error showing message",ex); + } + } + } + }); + + // Create the first page of the wizard + AbstractWizardPage forestPage = new ForestPage(); + + // Create the controller for wizard + WizardController wizardController = new WizardController(wizard); + + // Start the wizard and show it + wizardController.startWizard(forestPage); + wizard.setVisible(true); + } + public boolean isWizardFinished() { + return wizard.isWizardFinished(); + } + + public static void main(String[] args) { + + List luses = new ArrayList(); + + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; + luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; + luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); + luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); + + luses.add( new WetlandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new WetlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new WetlandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new WetlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new WetlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new WetlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + + luses.add( new GrasslandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new GrasslandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new GrasslandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new GrasslandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new GrasslandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new GrasslandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + + luses.add( new OtherlandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new OtherlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new OtherlandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new OtherlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new OtherlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); + luses.add( new OtherlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + + luses.add( new SettlementSubdivision("a", "aaaaa", SettlementType.TREED ) ); + luses.add( new SettlementSubdivision("b", "aaaaa", SettlementType.TREED ) ); + luses.add( new SettlementSubdivision("c", "aaaaa", SettlementType.TREED ) ); + luses.add( new SettlementSubdivision("f", "aaaaa", SettlementType.TREED ) ); + luses.add( new SettlementSubdivision("b", "aaaaa", SettlementType.OTHER ) ); + luses.add( new SettlementSubdivision("f", "aaaaa", SettlementType.OTHER ) ); + + AssignSubdivisionTypesWizard wizard = new AssignSubdivisionTypesWizard(); + + wizard.initializeTypes(luses); + } + } + + From c18a332583f2c865a252cf8818a1cc5a794d8aa5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:54 +0100 Subject: [PATCH 1329/1620] New translations CroplandPage.java (French) --- .../earth/app/view/Messages_fr.properties | 172 +++--------------- 1 file changed, 21 insertions(+), 151 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index f4649a2339..74424e2c9b 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,169 +1,39 @@ package org.openforis.collect.earth.ipcc.view; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.JOptionPane; -import javax.swing.SwingUtilities; - -import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; -import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; import org.openforis.collect.earth.ipcc.model.CroplandType; -import org.openforis.collect.earth.ipcc.model.ForestSubdivision; -import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.openforis.collect.earth.ipcc.model.ManagementType; -import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; -import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; -import org.openforis.collect.earth.ipcc.model.SettlementType; -import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.openforis.collect.earth.ipcc.model.LandUseCategory; import se.gustavkarlsson.gwiz.AbstractWizardPage; -import se.gustavkarlsson.gwiz.WizardController; - -public class AssignSubdivisionTypesWizard { - - JDialogWizard wizard ; - private Logger logger = LoggerFactory.getLogger( AssignSubdivisionTypesWizard.class); - - public void initializeTypes(List landUseSubdivisions ) { - - LandUseSubdivisionUtils.setLandUseSubdivisions(landUseSubdivisions); - - // Create a new wizard (this one is based on a JFrame) - wizard = new JDialogWizard(null, "Assign Management Type", true); - - wizard.addWindowListener( new WindowAdapter() { - public void windowClosing(WindowEvent e) { - if( !isWizardFinished() ) { - try { - SwingUtilities.invokeLater( - () -> JOptionPane.showMessageDialog(wizard, - "You need to assign management types for all subdivisions and then click on \"Finish\" to proceed" , - "Closing without finishing assginment of subdivisions", JOptionPane.WARNING_MESSAGE) - ); - } catch (Exception ex) { - logger.error("Error showing message",ex); - } - } - } - }); - // Create the first page of the wizard - AbstractWizardPage forestPage = new ForestPage(); +public class CroplandPage extends SubdivisionPage { - // Create the controller for wizard - WizardController wizardController = new WizardController(wizard); - // Start the wizard and show it - wizardController.startWizard(forestPage); - wizard.setVisible(true); - - } + private static final long serialVersionUID = -8470656687978500741L; + private AbstractWizardPage nextPage = new GrasslandPage(); - public boolean isWizardFinished() { - return wizard.isWizardFinished(); + public CroplandPage() { + super( LandUseCategory.C ); } - public static void main(String[] args) { - - List luses = new ArrayList(); - - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + @Override + protected AbstractWizardPage getNextPage() { + return nextPage; + } - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new WetlandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new WetlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new WetlandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new WetlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new WetlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new WetlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - - luses.add( new GrasslandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new GrasslandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new GrasslandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new GrasslandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new GrasslandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new GrasslandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - - luses.add( new OtherlandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new OtherlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new OtherlandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new OtherlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new OtherlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new OtherlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + @Override + protected boolean isFinishAllowed() { + return false; + } - luses.add( new SettlementSubdivision("a", "aaaaa", SettlementType.TREED ) ); - luses.add( new SettlementSubdivision("b", "aaaaa", SettlementType.TREED ) ); - luses.add( new SettlementSubdivision("c", "aaaaa", SettlementType.TREED ) ); - luses.add( new SettlementSubdivision("f", "aaaaa", SettlementType.TREED ) ); - luses.add( new SettlementSubdivision("b", "aaaaa", SettlementType.OTHER ) ); - luses.add( new SettlementSubdivision("f", "aaaaa", SettlementType.OTHER ) ); - - AssignSubdivisionTypesWizard wizard = new AssignSubdivisionTypesWizard(); + @Override + protected Object[] getValues() { + return CroplandType.values(); + } - wizard.initializeTypes(luses); + @Override + protected String getLabel() { + return Messages.getString("CroplandPage.0"); //$NON-NLS-1$ } } - - From 31ae5a04fe67621bd9dcb1cbeb0fb85f7be4b0af Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:55 +0100 Subject: [PATCH 1330/1620] New translations CroplandPage.java (Spanish) --- .../earth/app/view/Messages_es.properties | 172 +++--------------- 1 file changed, 21 insertions(+), 151 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index f4649a2339..74424e2c9b 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,169 +1,39 @@ package org.openforis.collect.earth.ipcc.view; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.JOptionPane; -import javax.swing.SwingUtilities; - -import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; -import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; import org.openforis.collect.earth.ipcc.model.CroplandType; -import org.openforis.collect.earth.ipcc.model.ForestSubdivision; -import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.openforis.collect.earth.ipcc.model.ManagementType; -import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; -import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; -import org.openforis.collect.earth.ipcc.model.SettlementType; -import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.openforis.collect.earth.ipcc.model.LandUseCategory; import se.gustavkarlsson.gwiz.AbstractWizardPage; -import se.gustavkarlsson.gwiz.WizardController; - -public class AssignSubdivisionTypesWizard { - - JDialogWizard wizard ; - private Logger logger = LoggerFactory.getLogger( AssignSubdivisionTypesWizard.class); - - public void initializeTypes(List landUseSubdivisions ) { - - LandUseSubdivisionUtils.setLandUseSubdivisions(landUseSubdivisions); - - // Create a new wizard (this one is based on a JFrame) - wizard = new JDialogWizard(null, "Assign Management Type", true); - - wizard.addWindowListener( new WindowAdapter() { - public void windowClosing(WindowEvent e) { - if( !isWizardFinished() ) { - try { - SwingUtilities.invokeLater( - () -> JOptionPane.showMessageDialog(wizard, - "You need to assign management types for all subdivisions and then click on \"Finish\" to proceed" , - "Closing without finishing assginment of subdivisions", JOptionPane.WARNING_MESSAGE) - ); - } catch (Exception ex) { - logger.error("Error showing message",ex); - } - } - } - }); - // Create the first page of the wizard - AbstractWizardPage forestPage = new ForestPage(); +public class CroplandPage extends SubdivisionPage { - // Create the controller for wizard - WizardController wizardController = new WizardController(wizard); - // Start the wizard and show it - wizardController.startWizard(forestPage); - wizard.setVisible(true); - - } + private static final long serialVersionUID = -8470656687978500741L; + private AbstractWizardPage nextPage = new GrasslandPage(); - public boolean isWizardFinished() { - return wizard.isWizardFinished(); + public CroplandPage() { + super( LandUseCategory.C ); } - public static void main(String[] args) { - - List luses = new ArrayList(); - - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + @Override + protected AbstractWizardPage getNextPage() { + return nextPage; + } - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new WetlandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new WetlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new WetlandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new WetlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new WetlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new WetlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - - luses.add( new GrasslandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new GrasslandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new GrasslandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new GrasslandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new GrasslandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new GrasslandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - - luses.add( new OtherlandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new OtherlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new OtherlandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new OtherlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new OtherlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new OtherlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + @Override + protected boolean isFinishAllowed() { + return false; + } - luses.add( new SettlementSubdivision("a", "aaaaa", SettlementType.TREED ) ); - luses.add( new SettlementSubdivision("b", "aaaaa", SettlementType.TREED ) ); - luses.add( new SettlementSubdivision("c", "aaaaa", SettlementType.TREED ) ); - luses.add( new SettlementSubdivision("f", "aaaaa", SettlementType.TREED ) ); - luses.add( new SettlementSubdivision("b", "aaaaa", SettlementType.OTHER ) ); - luses.add( new SettlementSubdivision("f", "aaaaa", SettlementType.OTHER ) ); - - AssignSubdivisionTypesWizard wizard = new AssignSubdivisionTypesWizard(); + @Override + protected Object[] getValues() { + return CroplandType.values(); + } - wizard.initializeTypes(luses); + @Override + protected String getLabel() { + return Messages.getString("CroplandPage.0"); //$NON-NLS-1$ } } - - From 5ae9c2a6ea0805242110382804c61bbe3c2d15fc Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:56 +0100 Subject: [PATCH 1331/1620] New translations CroplandPage.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 172 +++--------------- 1 file changed, 21 insertions(+), 151 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index f4649a2339..74424e2c9b 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,169 +1,39 @@ package org.openforis.collect.earth.ipcc.view; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.JOptionPane; -import javax.swing.SwingUtilities; - -import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; -import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; import org.openforis.collect.earth.ipcc.model.CroplandType; -import org.openforis.collect.earth.ipcc.model.ForestSubdivision; -import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.openforis.collect.earth.ipcc.model.ManagementType; -import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; -import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; -import org.openforis.collect.earth.ipcc.model.SettlementType; -import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.openforis.collect.earth.ipcc.model.LandUseCategory; import se.gustavkarlsson.gwiz.AbstractWizardPage; -import se.gustavkarlsson.gwiz.WizardController; - -public class AssignSubdivisionTypesWizard { - - JDialogWizard wizard ; - private Logger logger = LoggerFactory.getLogger( AssignSubdivisionTypesWizard.class); - - public void initializeTypes(List landUseSubdivisions ) { - - LandUseSubdivisionUtils.setLandUseSubdivisions(landUseSubdivisions); - - // Create a new wizard (this one is based on a JFrame) - wizard = new JDialogWizard(null, "Assign Management Type", true); - - wizard.addWindowListener( new WindowAdapter() { - public void windowClosing(WindowEvent e) { - if( !isWizardFinished() ) { - try { - SwingUtilities.invokeLater( - () -> JOptionPane.showMessageDialog(wizard, - "You need to assign management types for all subdivisions and then click on \"Finish\" to proceed" , - "Closing without finishing assginment of subdivisions", JOptionPane.WARNING_MESSAGE) - ); - } catch (Exception ex) { - logger.error("Error showing message",ex); - } - } - } - }); - // Create the first page of the wizard - AbstractWizardPage forestPage = new ForestPage(); +public class CroplandPage extends SubdivisionPage { - // Create the controller for wizard - WizardController wizardController = new WizardController(wizard); - // Start the wizard and show it - wizardController.startWizard(forestPage); - wizard.setVisible(true); - - } + private static final long serialVersionUID = -8470656687978500741L; + private AbstractWizardPage nextPage = new GrasslandPage(); - public boolean isWizardFinished() { - return wizard.isWizardFinished(); + public CroplandPage() { + super( LandUseCategory.C ); } - public static void main(String[] args) { - - List luses = new ArrayList(); - - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + @Override + protected AbstractWizardPage getNextPage() { + return nextPage; + } - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new WetlandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new WetlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new WetlandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new WetlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new WetlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new WetlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - - luses.add( new GrasslandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new GrasslandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new GrasslandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new GrasslandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new GrasslandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new GrasslandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - - luses.add( new OtherlandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new OtherlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new OtherlandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new OtherlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new OtherlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new OtherlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); + @Override + protected boolean isFinishAllowed() { + return false; + } - luses.add( new SettlementSubdivision("a", "aaaaa", SettlementType.TREED ) ); - luses.add( new SettlementSubdivision("b", "aaaaa", SettlementType.TREED ) ); - luses.add( new SettlementSubdivision("c", "aaaaa", SettlementType.TREED ) ); - luses.add( new SettlementSubdivision("f", "aaaaa", SettlementType.TREED ) ); - luses.add( new SettlementSubdivision("b", "aaaaa", SettlementType.OTHER ) ); - luses.add( new SettlementSubdivision("f", "aaaaa", SettlementType.OTHER ) ); - - AssignSubdivisionTypesWizard wizard = new AssignSubdivisionTypesWizard(); + @Override + protected Object[] getValues() { + return CroplandType.values(); + } - wizard.initializeTypes(luses); + @Override + protected String getLabel() { + return Messages.getString("CroplandPage.0"); //$NON-NLS-1$ } } - - From 55698d8ef665f2278aac39c0d55e25745c2ec029 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:57 +0100 Subject: [PATCH 1332/1620] New translations SettlementType.java (French) --- .../earth/app/view/Messages_fr.properties | 43 ++++++------------- 1 file changed, 13 insertions(+), 30 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 74424e2c9b..5c0501083e 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,39 +1,22 @@ -package org.openforis.collect.earth.ipcc.view; +package org.openforis.collect.earth.ipcc.model; -import org.openforis.collect.earth.ipcc.model.CroplandType; -import org.openforis.collect.earth.ipcc.model.LandUseCategory; +public enum SettlementType { -import se.gustavkarlsson.gwiz.AbstractWizardPage; - -public class CroplandPage extends SubdivisionPage { - - - private static final long serialVersionUID = -8470656687978500741L; - private AbstractWizardPage nextPage = new GrasslandPage(); + TREED("Treed"),OTHER("Other"); - public CroplandPage() { - super( LandUseCategory.C ); - } - - @Override - protected AbstractWizardPage getNextPage() { - return nextPage; - } - + public final String name; + + private SettlementType(String name) { + this.name = name; + } - @Override - protected boolean isFinishAllowed() { - return false; + public String getName() { + return name; } @Override - protected Object[] getValues() { - return CroplandType.values(); + public String toString() { + return getName(); } - - @Override - protected String getLabel() { - return Messages.getString("CroplandPage.0"); //$NON-NLS-1$ - } - + } From 6b33f4a325f5b02b1bf835d645bec91ea03fae89 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:46:58 +0100 Subject: [PATCH 1333/1620] New translations SettlementType.java (Spanish) --- .../earth/app/view/Messages_es.properties | 43 ++++++------------- 1 file changed, 13 insertions(+), 30 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 74424e2c9b..5c0501083e 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,39 +1,22 @@ -package org.openforis.collect.earth.ipcc.view; +package org.openforis.collect.earth.ipcc.model; -import org.openforis.collect.earth.ipcc.model.CroplandType; -import org.openforis.collect.earth.ipcc.model.LandUseCategory; +public enum SettlementType { -import se.gustavkarlsson.gwiz.AbstractWizardPage; - -public class CroplandPage extends SubdivisionPage { - - - private static final long serialVersionUID = -8470656687978500741L; - private AbstractWizardPage nextPage = new GrasslandPage(); + TREED("Treed"),OTHER("Other"); - public CroplandPage() { - super( LandUseCategory.C ); - } - - @Override - protected AbstractWizardPage getNextPage() { - return nextPage; - } - + public final String name; + + private SettlementType(String name) { + this.name = name; + } - @Override - protected boolean isFinishAllowed() { - return false; + public String getName() { + return name; } @Override - protected Object[] getValues() { - return CroplandType.values(); + public String toString() { + return getName(); } - - @Override - protected String getLabel() { - return Messages.getString("CroplandPage.0"); //$NON-NLS-1$ - } - + } From 5a54021da5a6bb50c595e5046e9737cd51a3e101 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:00 +0100 Subject: [PATCH 1334/1620] New translations SettlementSubdivision.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 45 ++++++------------- 1 file changed, 13 insertions(+), 32 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 74424e2c9b..3978dc2be1 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,39 +1,20 @@ -package org.openforis.collect.earth.ipcc.view; +package org.openforis.collect.earth.ipcc.model; -import org.openforis.collect.earth.ipcc.model.CroplandType; -import org.openforis.collect.earth.ipcc.model.LandUseCategory; - -import se.gustavkarlsson.gwiz.AbstractWizardPage; - -public class CroplandPage extends SubdivisionPage { - - - private static final long serialVersionUID = -8470656687978500741L; - private AbstractWizardPage nextPage = new GrasslandPage(); +public class SettlementSubdivision extends LandUseSubdivision{ - public CroplandPage() { - super( LandUseCategory.C ); - } - - @Override - protected AbstractWizardPage getNextPage() { - return nextPage; - } - - - @Override - protected boolean isFinishAllowed() { - return false; - } - - @Override - protected Object[] getValues() { - return CroplandType.values(); + protected SettlementType type; + + public SettlementSubdivision( String code, String name, SettlementType type) { + super(LandUseCategory.S, code, name); + setType(type); } - @Override - protected String getLabel() { - return Messages.getString("CroplandPage.0"); //$NON-NLS-1$ + public SettlementType getType() { + return type; } + public void setType(SettlementType type) { + this.type = type; + }; + } From a58a64aeedb7c1ee5f8580dc0a68400755d25e19 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:01 +0100 Subject: [PATCH 1335/1620] New translations ManagementLandUseSubdivision.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 3978dc2be1..b99c8caa67 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,20 +1,24 @@ package org.openforis.collect.earth.ipcc.model; -public class SettlementSubdivision extends LandUseSubdivision{ - - protected SettlementType type; +public abstract class ManagementLandUseSubdivision extends LandUseSubdivision{ + + + + protected ManagementType type; - public SettlementSubdivision( String code, String name, SettlementType type) { - super(LandUseCategory.S, code, name); + public ManagementLandUseSubdivision( LandUseCategory category, String code, String name, ManagementType type) { + super(category, code, name); setType(type); } - public SettlementType getType() { + public ManagementType getType() { return type; } - public void setType(SettlementType type) { + public void setType(ManagementType type) { this.type = type; }; + + } From f06eded532b495da21d7e9a6e8d7cc8fe33279c5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:02 +0100 Subject: [PATCH 1336/1620] New translations LandUseCategory.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 37 +++++++++++-------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index b99c8caa67..5a783a70d8 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,24 +1,31 @@ package org.openforis.collect.earth.ipcc.model; -public abstract class ManagementLandUseSubdivision extends LandUseSubdivision{ - +public enum LandUseCategory { + F ("F", "Forest"), + C ("C", "Cropland"), + S ("S", "Settlement"), + W ("W", "Wetland"), + G ("G","Grassland"), + O ("O", "Otherland"); + + private final String code; + private final String name; + private LandUseCategory(String code, String name) { + this.code = code; + this.name = name; + } - protected ManagementType type; - - public ManagementLandUseSubdivision( LandUseCategory category, String code, String name, ManagementType type) { - super(category, code, name); - setType(type); + public String getCode() { + return code; } - public ManagementType getType() { - return type; + public String getName() { + return name; } - public void setType(ManagementType type) { - this.type = type; - }; - - - + @Override + public String toString() { + return getCode(); + } } From e6ece0a2f4ab94fe241997d6194792add8aaf556 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:03 +0100 Subject: [PATCH 1337/1620] New translations LandUseCategory.java (English) --- .../earth/app/view/Messages_en.properties | 184 +++--------------- 1 file changed, 23 insertions(+), 161 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index f4649a2339..5a783a70d8 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,169 +1,31 @@ -package org.openforis.collect.earth.ipcc.view; - -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.JOptionPane; -import javax.swing.SwingUtilities; - -import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; -import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; -import org.openforis.collect.earth.ipcc.model.CroplandType; -import org.openforis.collect.earth.ipcc.model.ForestSubdivision; -import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.openforis.collect.earth.ipcc.model.ManagementType; -import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; -import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; -import org.openforis.collect.earth.ipcc.model.SettlementType; -import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import se.gustavkarlsson.gwiz.AbstractWizardPage; -import se.gustavkarlsson.gwiz.WizardController; - -public class AssignSubdivisionTypesWizard { - - JDialogWizard wizard ; - private Logger logger = LoggerFactory.getLogger( AssignSubdivisionTypesWizard.class); +package org.openforis.collect.earth.ipcc.model; + +public enum LandUseCategory { + F ("F", "Forest"), + C ("C", "Cropland"), + S ("S", "Settlement"), + W ("W", "Wetland"), + G ("G","Grassland"), + O ("O", "Otherland"); - public void initializeTypes(List landUseSubdivisions ) { - - LandUseSubdivisionUtils.setLandUseSubdivisions(landUseSubdivisions); - - // Create a new wizard (this one is based on a JFrame) - wizard = new JDialogWizard(null, "Assign Management Type", true); - - wizard.addWindowListener( new WindowAdapter() { - public void windowClosing(WindowEvent e) { - if( !isWizardFinished() ) { - try { - SwingUtilities.invokeLater( - () -> JOptionPane.showMessageDialog(wizard, - "You need to assign management types for all subdivisions and then click on \"Finish\" to proceed" , - "Closing without finishing assginment of subdivisions", JOptionPane.WARNING_MESSAGE) - ); - } catch (Exception ex) { - logger.error("Error showing message",ex); - } - } - } - }); - - // Create the first page of the wizard - AbstractWizardPage forestPage = new ForestPage(); + private final String code; + private final String name; - // Create the controller for wizard - WizardController wizardController = new WizardController(wizard); + private LandUseCategory(String code, String name) { + this.code = code; + this.name = name; + } - // Start the wizard and show it - wizardController.startWizard(forestPage); - wizard.setVisible(true); - - } - - public boolean isWizardFinished() { - return wizard.isWizardFinished(); + public String getCode() { + return code; } - public static void main(String[] args) { - - List luses = new ArrayList(); - - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ) ; - luses.add( new ForestSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new ForestSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ) ; - luses.add( new CroplandSubdivision("a", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("c", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("b", "aaaaa", CroplandType.ANNUAL ) ); - luses.add( new CroplandSubdivision("f", "aaaaa", CroplandType.ANNUAL ) ); - - luses.add( new WetlandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new WetlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new WetlandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new WetlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new WetlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new WetlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - - luses.add( new GrasslandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new GrasslandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new GrasslandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new GrasslandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new GrasslandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new GrasslandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - - luses.add( new OtherlandSubdivision("a", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new OtherlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new OtherlandSubdivision("c", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new OtherlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new OtherlandSubdivision("b", "aaaaa", ManagementType.MANAGED ) ); - luses.add( new OtherlandSubdivision("f", "aaaaa", ManagementType.MANAGED ) ); - - luses.add( new SettlementSubdivision("a", "aaaaa", SettlementType.TREED ) ); - luses.add( new SettlementSubdivision("b", "aaaaa", SettlementType.TREED ) ); - luses.add( new SettlementSubdivision("c", "aaaaa", SettlementType.TREED ) ); - luses.add( new SettlementSubdivision("f", "aaaaa", SettlementType.TREED ) ); - luses.add( new SettlementSubdivision("b", "aaaaa", SettlementType.OTHER ) ); - luses.add( new SettlementSubdivision("f", "aaaaa", SettlementType.OTHER ) ); - - AssignSubdivisionTypesWizard wizard = new AssignSubdivisionTypesWizard(); - - wizard.initializeTypes(luses); + public String getName() { + return name; } + @Override + public String toString() { + return getCode(); + } } - - From 4b0167b198fee742d26871c3928c55c0bf6fd372 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:04 +0100 Subject: [PATCH 1338/1620] New translations LandUseSubdivision.java (French) --- .../earth/app/view/Messages_fr.properties | 66 ++++++++++++++++--- 1 file changed, 57 insertions(+), 9 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 5c0501083e..f0d4740ff8 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,22 +1,70 @@ package org.openforis.collect.earth.ipcc.model; -public enum SettlementType { +import java.util.Objects; - TREED("Treed"),OTHER("Other"); +public abstract class LandUseSubdivision implements Comparable>{ + + protected LandUseCategory category; + protected String code; + protected String name; - public final String name; + public LandUseSubdivision(LandUseCategory category, String code, String name) { + super(); + this.category = category; + this.code = code; + this.name = name; + } - private SettlementType(String name) { - this.name = name; - } - + public abstract F getType(); + public abstract void setType(F type); + + public LandUseCategory getCategory() { + return category; + } + public String getCode() { + return code; + } public String getName() { return name; } + public void setCategory(LandUseCategory category) { + this.category = category; + } + public void setCode(String code) { + this.code = code; + } + public void setName(String name) { + this.name = name; + } + + @Override + public int compareTo(LandUseSubdivision other) { + if( this.getCategory().equals( other.getCategory() ) ){ + return this.getCode().compareTo( other.getCode() ); + }else { + return this.getCategory().getCode().compareTo( other.getCategory().getCode() ); + } + } + + @Override + public int hashCode() { + return Objects.hash(category, code, name); + } @Override - public String toString() { - return getName(); + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + LandUseSubdivision other = (LandUseSubdivision) obj; + return category == other.category && Objects.equals(code, other.code) && Objects.equals(name, other.name); } + @Override + public String toString() { + return getCategory().getCode() + " / " + getType() + " / " + getCode(); + } } From 3941d2777639d1a48ef7daea72ab271f4cb0f2ca Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:06 +0100 Subject: [PATCH 1339/1620] New translations LandUseSubdivision.java (Spanish) --- .../earth/app/view/Messages_es.properties | 66 ++++++++++++++++--- 1 file changed, 57 insertions(+), 9 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 5c0501083e..f0d4740ff8 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,22 +1,70 @@ package org.openforis.collect.earth.ipcc.model; -public enum SettlementType { +import java.util.Objects; - TREED("Treed"),OTHER("Other"); +public abstract class LandUseSubdivision implements Comparable>{ + + protected LandUseCategory category; + protected String code; + protected String name; - public final String name; + public LandUseSubdivision(LandUseCategory category, String code, String name) { + super(); + this.category = category; + this.code = code; + this.name = name; + } - private SettlementType(String name) { - this.name = name; - } - + public abstract F getType(); + public abstract void setType(F type); + + public LandUseCategory getCategory() { + return category; + } + public String getCode() { + return code; + } public String getName() { return name; } + public void setCategory(LandUseCategory category) { + this.category = category; + } + public void setCode(String code) { + this.code = code; + } + public void setName(String name) { + this.name = name; + } + + @Override + public int compareTo(LandUseSubdivision other) { + if( this.getCategory().equals( other.getCategory() ) ){ + return this.getCode().compareTo( other.getCode() ); + }else { + return this.getCategory().getCode().compareTo( other.getCategory().getCode() ); + } + } + + @Override + public int hashCode() { + return Objects.hash(category, code, name); + } @Override - public String toString() { - return getName(); + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + LandUseSubdivision other = (LandUseSubdivision) obj; + return category == other.category && Objects.equals(code, other.code) && Objects.equals(name, other.name); } + @Override + public String toString() { + return getCategory().getCode() + " / " + getType() + " / " + getCode(); + } } From b7711db6244d88f9bd6a7996ea604103190d35f7 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:07 +0100 Subject: [PATCH 1340/1620] New translations LandUseSubdivision.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 71 ++++++++++++++----- 1 file changed, 55 insertions(+), 16 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 5a783a70d8..f0d4740ff8 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,31 +1,70 @@ package org.openforis.collect.earth.ipcc.model; -public enum LandUseCategory { - F ("F", "Forest"), - C ("C", "Cropland"), - S ("S", "Settlement"), - W ("W", "Wetland"), - G ("G","Grassland"), - O ("O", "Otherland"); - - private final String code; - private final String name; +import java.util.Objects; - private LandUseCategory(String code, String name) { - this.code = code; - this.name = name; - } +public abstract class LandUseSubdivision implements Comparable>{ + protected LandUseCategory category; + protected String code; + protected String name; + + public LandUseSubdivision(LandUseCategory category, String code, String name) { + super(); + this.category = category; + this.code = code; + this.name = name; + } + + public abstract F getType(); + public abstract void setType(F type); + + public LandUseCategory getCategory() { + return category; + } public String getCode() { return code; } - public String getName() { return name; } + public void setCategory(LandUseCategory category) { + this.category = category; + } + public void setCode(String code) { + this.code = code; + } + public void setName(String name) { + this.name = name; + } + + @Override + public int compareTo(LandUseSubdivision other) { + if( this.getCategory().equals( other.getCategory() ) ){ + return this.getCode().compareTo( other.getCode() ); + }else { + return this.getCategory().getCode().compareTo( other.getCategory().getCode() ); + } + } + + @Override + public int hashCode() { + return Objects.hash(category, code, name); + } + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + LandUseSubdivision other = (LandUseSubdivision) obj; + return category == other.category && Objects.equals(code, other.code) && Objects.equals(name, other.name); + } + @Override public String toString() { - return getCode(); + return getCategory().getCode() + " / " + getType() + " / " + getCode(); } } From ac3610d81740d90d4bce060d4efc75caf6b736fd Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:08 +0100 Subject: [PATCH 1341/1620] New translations LandUseSubdivision.java (English) --- .../earth/app/view/Messages_en.properties | 71 ++++++++++++++----- 1 file changed, 55 insertions(+), 16 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 5a783a70d8..f0d4740ff8 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,31 +1,70 @@ package org.openforis.collect.earth.ipcc.model; -public enum LandUseCategory { - F ("F", "Forest"), - C ("C", "Cropland"), - S ("S", "Settlement"), - W ("W", "Wetland"), - G ("G","Grassland"), - O ("O", "Otherland"); - - private final String code; - private final String name; +import java.util.Objects; - private LandUseCategory(String code, String name) { - this.code = code; - this.name = name; - } +public abstract class LandUseSubdivision implements Comparable>{ + protected LandUseCategory category; + protected String code; + protected String name; + + public LandUseSubdivision(LandUseCategory category, String code, String name) { + super(); + this.category = category; + this.code = code; + this.name = name; + } + + public abstract F getType(); + public abstract void setType(F type); + + public LandUseCategory getCategory() { + return category; + } public String getCode() { return code; } - public String getName() { return name; } + public void setCategory(LandUseCategory category) { + this.category = category; + } + public void setCode(String code) { + this.code = code; + } + public void setName(String name) { + this.name = name; + } + + @Override + public int compareTo(LandUseSubdivision other) { + if( this.getCategory().equals( other.getCategory() ) ){ + return this.getCode().compareTo( other.getCode() ); + }else { + return this.getCategory().getCode().compareTo( other.getCategory().getCode() ); + } + } + + @Override + public int hashCode() { + return Objects.hash(category, code, name); + } + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + LandUseSubdivision other = (LandUseSubdivision) obj; + return category == other.category && Objects.equals(code, other.code) && Objects.equals(name, other.name); + } + @Override public String toString() { - return getCode(); + return getCategory().getCode() + " / " + getType() + " / " + getCode(); } } From 54eaf9e988aa686afa25b731bf17f048fdaadffe Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:09 +0100 Subject: [PATCH 1342/1620] New translations SettlementSubdivision.java (Spanish) --- .../earth/app/view/Messages_es.properties | 72 +++---------------- 1 file changed, 11 insertions(+), 61 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index f0d4740ff8..3978dc2be1 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,70 +1,20 @@ package org.openforis.collect.earth.ipcc.model; -import java.util.Objects; - -public abstract class LandUseSubdivision implements Comparable>{ - - protected LandUseCategory category; - protected String code; - protected String name; - - public LandUseSubdivision(LandUseCategory category, String code, String name) { - super(); - this.category = category; - this.code = code; - this.name = name; - } +public class SettlementSubdivision extends LandUseSubdivision{ - public abstract F getType(); - public abstract void setType(F type); + protected SettlementType type; - public LandUseCategory getCategory() { - return category; - } - public String getCode() { - return code; - } - public String getName() { - return name; - } - public void setCategory(LandUseCategory category) { - this.category = category; - } - public void setCode(String code) { - this.code = code; - } - public void setName(String name) { - this.name = name; - } - - @Override - public int compareTo(LandUseSubdivision other) { - if( this.getCategory().equals( other.getCategory() ) ){ - return this.getCode().compareTo( other.getCode() ); - }else { - return this.getCategory().getCode().compareTo( other.getCategory().getCode() ); - } - } - - @Override - public int hashCode() { - return Objects.hash(category, code, name); + public SettlementSubdivision( String code, String name, SettlementType type) { + super(LandUseCategory.S, code, name); + setType(type); } - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - LandUseSubdivision other = (LandUseSubdivision) obj; - return category == other.category && Objects.equals(code, other.code) && Objects.equals(name, other.name); + public SettlementType getType() { + return type; } + + public void setType(SettlementType type) { + this.type = type; + }; - @Override - public String toString() { - return getCategory().getCode() + " / " + getType() + " / " + getCode(); - } } From 37a9d07a3b445f65dc5b931c527cb72c7d500188 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:10 +0100 Subject: [PATCH 1343/1620] New translations ManagementLandUseSubdivision.java (Spanish) --- .../earth/app/view/Messages_es.properties | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 3978dc2be1..b99c8caa67 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,20 +1,24 @@ package org.openforis.collect.earth.ipcc.model; -public class SettlementSubdivision extends LandUseSubdivision{ - - protected SettlementType type; +public abstract class ManagementLandUseSubdivision extends LandUseSubdivision{ + + + + protected ManagementType type; - public SettlementSubdivision( String code, String name, SettlementType type) { - super(LandUseCategory.S, code, name); + public ManagementLandUseSubdivision( LandUseCategory category, String code, String name, ManagementType type) { + super(category, code, name); setType(type); } - public SettlementType getType() { + public ManagementType getType() { return type; } - public void setType(SettlementType type) { + public void setType(ManagementType type) { this.type = type; }; + + } From 11b85260689175bf6e20567a989837d13aa86725 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:11 +0100 Subject: [PATCH 1344/1620] New translations ManagementLandUseSubdivision.java (French) --- .../earth/app/view/Messages_fr.properties | 72 ++++--------------- 1 file changed, 13 insertions(+), 59 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index f0d4740ff8..b99c8caa67 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,70 +1,24 @@ package org.openforis.collect.earth.ipcc.model; -import java.util.Objects; +public abstract class ManagementLandUseSubdivision extends LandUseSubdivision{ -public abstract class LandUseSubdivision implements Comparable>{ - protected LandUseCategory category; - protected String code; - protected String name; - - public LandUseSubdivision(LandUseCategory category, String code, String name) { - super(); - this.category = category; - this.code = code; - this.name = name; - } - - public abstract F getType(); - public abstract void setType(F type); + + protected ManagementType type; - public LandUseCategory getCategory() { - return category; - } - public String getCode() { - return code; - } - public String getName() { - return name; - } - public void setCategory(LandUseCategory category) { - this.category = category; - } - public void setCode(String code) { - this.code = code; + public ManagementLandUseSubdivision( LandUseCategory category, String code, String name, ManagementType type) { + super(category, code, name); + setType(type); } - public void setName(String name) { - this.name = name; + + public ManagementType getType() { + return type; } + + public void setType(ManagementType type) { + this.type = type; + }; - @Override - public int compareTo(LandUseSubdivision other) { - if( this.getCategory().equals( other.getCategory() ) ){ - return this.getCode().compareTo( other.getCode() ); - }else { - return this.getCategory().getCode().compareTo( other.getCategory().getCode() ); - } - } - @Override - public int hashCode() { - return Objects.hash(category, code, name); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - LandUseSubdivision other = (LandUseSubdivision) obj; - return category == other.category && Objects.equals(code, other.code) && Objects.equals(name, other.name); - } - @Override - public String toString() { - return getCategory().getCode() + " / " + getType() + " / " + getCode(); - } } From 72d3cd8c3df228d446ade845b2de4a76cc36a416 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:13 +0100 Subject: [PATCH 1345/1620] New translations ManagementLandUseSubdivision.java (English) --- .../earth/app/view/Messages_en.properties | 72 ++++--------------- 1 file changed, 13 insertions(+), 59 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index f0d4740ff8..b99c8caa67 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,70 +1,24 @@ package org.openforis.collect.earth.ipcc.model; -import java.util.Objects; +public abstract class ManagementLandUseSubdivision extends LandUseSubdivision{ -public abstract class LandUseSubdivision implements Comparable>{ - protected LandUseCategory category; - protected String code; - protected String name; - - public LandUseSubdivision(LandUseCategory category, String code, String name) { - super(); - this.category = category; - this.code = code; - this.name = name; - } - - public abstract F getType(); - public abstract void setType(F type); + + protected ManagementType type; - public LandUseCategory getCategory() { - return category; - } - public String getCode() { - return code; - } - public String getName() { - return name; - } - public void setCategory(LandUseCategory category) { - this.category = category; - } - public void setCode(String code) { - this.code = code; + public ManagementLandUseSubdivision( LandUseCategory category, String code, String name, ManagementType type) { + super(category, code, name); + setType(type); } - public void setName(String name) { - this.name = name; + + public ManagementType getType() { + return type; } + + public void setType(ManagementType type) { + this.type = type; + }; - @Override - public int compareTo(LandUseSubdivision other) { - if( this.getCategory().equals( other.getCategory() ) ){ - return this.getCode().compareTo( other.getCode() ); - }else { - return this.getCategory().getCode().compareTo( other.getCategory().getCode() ); - } - } - @Override - public int hashCode() { - return Objects.hash(category, code, name); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - LandUseSubdivision other = (LandUseSubdivision) obj; - return category == other.category && Objects.equals(code, other.code) && Objects.equals(name, other.name); - } - @Override - public String toString() { - return getCategory().getCode() + " / " + getType() + " / " + getCode(); - } } From a24ebfbe95ef0e79017860cf6c560783ad2041a4 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:14 +0100 Subject: [PATCH 1346/1620] New translations OtherlandSubdivision.java (Spanish) --- .../earth/app/view/Messages_es.properties | 21 +++---------------- 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index b99c8caa67..8e3ce015dd 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,24 +1,9 @@ package org.openforis.collect.earth.ipcc.model; -public abstract class ManagementLandUseSubdivision extends LandUseSubdivision{ - - - - protected ManagementType type; +public class OtherlandSubdivision extends ManagementLandUseSubdivision{ - public ManagementLandUseSubdivision( LandUseCategory category, String code, String name, ManagementType type) { - super(category, code, name); - setType(type); - } - - public ManagementType getType() { - return type; + public OtherlandSubdivision( String code, String name, ManagementType type) { + super( LandUseCategory.O, code, name, type); } - - public void setType(ManagementType type) { - this.type = type; - }; - - } From 6f66ed05449be4f42a9cd2b698d17f87843d7c3e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:15 +0100 Subject: [PATCH 1347/1620] New translations SettlementSubdivision.java (French) --- .../earth/app/view/Messages_fr.properties | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index b99c8caa67..3978dc2be1 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,24 +1,20 @@ package org.openforis.collect.earth.ipcc.model; -public abstract class ManagementLandUseSubdivision extends LandUseSubdivision{ - - - - protected ManagementType type; +public class SettlementSubdivision extends LandUseSubdivision{ - public ManagementLandUseSubdivision( LandUseCategory category, String code, String name, ManagementType type) { - super(category, code, name); + protected SettlementType type; + + public SettlementSubdivision( String code, String name, SettlementType type) { + super(LandUseCategory.S, code, name); setType(type); } - public ManagementType getType() { + public SettlementType getType() { return type; } - public void setType(ManagementType type) { + public void setType(SettlementType type) { this.type = type; }; - - } From 404d1fd35d7f50ec32a7f43cdb25443cf28f556f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:16 +0100 Subject: [PATCH 1348/1620] New translations ManagementType.java (French) --- .../earth/app/view/Messages_fr.properties | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 3978dc2be1..85ce8040d7 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,20 +1,21 @@ package org.openforis.collect.earth.ipcc.model; -public class SettlementSubdivision extends LandUseSubdivision{ +public enum ManagementType { + + MANAGED("Managed"),UNMANAGED("Unmanaged"); - protected SettlementType type; + public final String name; - public SettlementSubdivision( String code, String name, SettlementType type) { - super(LandUseCategory.S, code, name); - setType(type); - } + private ManagementType(String name) { + this.name = name; + } - public SettlementType getType() { - return type; + public String getName() { + return name; } - public void setType(SettlementType type) { - this.type = type; - }; - + @Override + public String toString() { + return getName(); + } } From ab77718df0dfa962d92a9b99c68bbf517438eb2d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:17 +0100 Subject: [PATCH 1349/1620] New translations OtherlandSubdivision.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 67 +------------------ 1 file changed, 3 insertions(+), 64 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index f0d4740ff8..8e3ce015dd 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,70 +1,9 @@ package org.openforis.collect.earth.ipcc.model; -import java.util.Objects; - -public abstract class LandUseSubdivision implements Comparable>{ - - protected LandUseCategory category; - protected String code; - protected String name; +public class OtherlandSubdivision extends ManagementLandUseSubdivision{ - public LandUseSubdivision(LandUseCategory category, String code, String name) { - super(); - this.category = category; - this.code = code; - this.name = name; + public OtherlandSubdivision( String code, String name, ManagementType type) { + super( LandUseCategory.O, code, name, type); } - public abstract F getType(); - public abstract void setType(F type); - - public LandUseCategory getCategory() { - return category; - } - public String getCode() { - return code; - } - public String getName() { - return name; - } - public void setCategory(LandUseCategory category) { - this.category = category; - } - public void setCode(String code) { - this.code = code; - } - public void setName(String name) { - this.name = name; - } - - @Override - public int compareTo(LandUseSubdivision other) { - if( this.getCategory().equals( other.getCategory() ) ){ - return this.getCode().compareTo( other.getCode() ); - }else { - return this.getCategory().getCode().compareTo( other.getCategory().getCode() ); - } - } - - @Override - public int hashCode() { - return Objects.hash(category, code, name); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - LandUseSubdivision other = (LandUseSubdivision) obj; - return category == other.category && Objects.equals(code, other.code) && Objects.equals(name, other.name); - } - - @Override - public String toString() { - return getCategory().getCode() + " / " + getType() + " / " + getCode(); - } } From 25c852a2d970a2c1b0135586ed90dfdc939186e1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:18 +0100 Subject: [PATCH 1350/1620] New translations OtherlandSubdivision.java (English) --- .../earth/app/view/Messages_en.properties | 21 +++---------------- 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index b99c8caa67..8e3ce015dd 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,24 +1,9 @@ package org.openforis.collect.earth.ipcc.model; -public abstract class ManagementLandUseSubdivision extends LandUseSubdivision{ - - - - protected ManagementType type; +public class OtherlandSubdivision extends ManagementLandUseSubdivision{ - public ManagementLandUseSubdivision( LandUseCategory category, String code, String name, ManagementType type) { - super(category, code, name); - setType(type); - } - - public ManagementType getType() { - return type; + public OtherlandSubdivision( String code, String name, ManagementType type) { + super( LandUseCategory.O, code, name, type); } - - public void setType(ManagementType type) { - this.type = type; - }; - - } From c20ae4723eb014c8af25832ee76e47b8ff53a434 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:19 +0100 Subject: [PATCH 1351/1620] New translations OtherlandSubdivision.java (French) --- .../earth/app/view/Messages_fr.properties | 20 ++++--------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 85ce8040d7..8e3ce015dd 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,21 +1,9 @@ package org.openforis.collect.earth.ipcc.model; -public enum ManagementType { - - MANAGED("Managed"),UNMANAGED("Unmanaged"); - - public final String name; +public class OtherlandSubdivision extends ManagementLandUseSubdivision{ - private ManagementType(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - @Override - public String toString() { - return getName(); + public OtherlandSubdivision( String code, String name, ManagementType type) { + super( LandUseCategory.O, code, name, type); } + } From aa1bab3377c8c162837be3a65065700d36fc35a3 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:21 +0100 Subject: [PATCH 1352/1620] New translations ManagementType.java (English) --- .../earth/app/view/Messages_en.properties | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 8e3ce015dd..85ce8040d7 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,9 +1,21 @@ package org.openforis.collect.earth.ipcc.model; -public class OtherlandSubdivision extends ManagementLandUseSubdivision{ +public enum ManagementType { + + MANAGED("Managed"),UNMANAGED("Unmanaged"); - public OtherlandSubdivision( String code, String name, ManagementType type) { - super( LandUseCategory.O, code, name, type); - } + public final String name; + private ManagementType(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + @Override + public String toString() { + return getName(); + } } From 4b112f12bdac2ab7fc49ebfc4859079dcbb77465 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:23 +0100 Subject: [PATCH 1353/1620] New translations ManagementType.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 8e3ce015dd..85ce8040d7 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,9 +1,21 @@ package org.openforis.collect.earth.ipcc.model; -public class OtherlandSubdivision extends ManagementLandUseSubdivision{ +public enum ManagementType { + + MANAGED("Managed"),UNMANAGED("Unmanaged"); - public OtherlandSubdivision( String code, String name, ManagementType type) { - super( LandUseCategory.O, code, name, type); - } + public final String name; + private ManagementType(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + @Override + public String toString() { + return getName(); + } } From 17374cd71848cdd5d296dd99a8143a4f8f35301c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:24 +0100 Subject: [PATCH 1354/1620] New translations ManagementType.java (Spanish) --- .../earth/app/view/Messages_es.properties | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 8e3ce015dd..85ce8040d7 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,9 +1,21 @@ package org.openforis.collect.earth.ipcc.model; -public class OtherlandSubdivision extends ManagementLandUseSubdivision{ +public enum ManagementType { + + MANAGED("Managed"),UNMANAGED("Unmanaged"); - public OtherlandSubdivision( String code, String name, ManagementType type) { - super( LandUseCategory.O, code, name, type); - } + public final String name; + private ManagementType(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + @Override + public String toString() { + return getName(); + } } From 61d8a4385736fa74c6c3d4a937bc3abdd8565bd8 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:26 +0100 Subject: [PATCH 1355/1620] New translations CroplandPage.java (English) --- .../earth/app/view/Messages_en.properties | 42 +++++++++++++------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 85ce8040d7..74424e2c9b 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,21 +1,39 @@ -package org.openforis.collect.earth.ipcc.model; +package org.openforis.collect.earth.ipcc.view; -public enum ManagementType { +import org.openforis.collect.earth.ipcc.model.CroplandType; +import org.openforis.collect.earth.ipcc.model.LandUseCategory; - MANAGED("Managed"),UNMANAGED("Unmanaged"); - - public final String name; +import se.gustavkarlsson.gwiz.AbstractWizardPage; + +public class CroplandPage extends SubdivisionPage { + + + private static final long serialVersionUID = -8470656687978500741L; + private AbstractWizardPage nextPage = new GrasslandPage(); - private ManagementType(String name) { - this.name = name; - } + public CroplandPage() { + super( LandUseCategory.C ); + } + + @Override + protected AbstractWizardPage getNextPage() { + return nextPage; + } + - public String getName() { - return name; + @Override + protected boolean isFinishAllowed() { + return false; } @Override - public String toString() { - return getName(); + protected Object[] getValues() { + return CroplandType.values(); } + + @Override + protected String getLabel() { + return Messages.getString("CroplandPage.0"); //$NON-NLS-1$ + } + } From 5f5fe712fc9eb96d49010f73a365b15bad7f9452 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:27 +0100 Subject: [PATCH 1356/1620] New translations EndPage.java (French) --- .../earth/app/view/Messages_fr.properties | 67 ++++++++++++++++--- 1 file changed, 58 insertions(+), 9 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 8e3ce015dd..63ae88c539 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,9 +1,58 @@ -package org.openforis.collect.earth.ipcc.model; - -public class OtherlandSubdivision extends ManagementLandUseSubdivision{ - - public OtherlandSubdivision( String code, String name, ManagementType type) { - super( LandUseCategory.O, code, name, type); - } - -} +package org.openforis.collect.earth.ipcc.view; + +import java.awt.FlowLayout; +import java.awt.Label; +import java.awt.TextField; +import java.awt.event.TextEvent; +import java.awt.event.TextListener; + +import se.gustavkarlsson.gwiz.AbstractWizardPage; + +@SuppressWarnings("serial") +public class EndPage extends AbstractWizardPage { + + private final TextField finishTextField = new TextField("no", 5); + + public EndPage() { + setLayout(new FlowLayout()); + + add(new Label("Do you want to finish? Type in your answer:")); + add(finishTextField); + + // Add a listener for updating the wizard buttons + finishTextField.addTextListener(new TextListener() { + @Override + public void textValueChanged(TextEvent e) { + updateWizardButtons(); + } + }); + } + + @Override + protected AbstractWizardPage getNextPage() { + return null; + } + + @Override + protected boolean isCancelAllowed() { + return true; + } + + @Override + protected boolean isPreviousAllowed() { + return true; + } + + @Override + protected boolean isNextAllowed() { + return false; + } + + @Override + protected + boolean isFinishAllowed() { + // Only allow finish if the user typed "yes" in the text field + return finishTextField.getText().trim().equalsIgnoreCase("yes"); + } + +} From b23e165300c701fb71e471ef6291c70f17e9e79c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:30 +0100 Subject: [PATCH 1357/1620] New translations EndPage.java (Spanish) --- .../earth/app/view/Messages_es.properties | 79 ++++++++++++++----- 1 file changed, 58 insertions(+), 21 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 85ce8040d7..63ae88c539 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,21 +1,58 @@ -package org.openforis.collect.earth.ipcc.model; - -public enum ManagementType { - - MANAGED("Managed"),UNMANAGED("Unmanaged"); - - public final String name; - - private ManagementType(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - @Override - public String toString() { - return getName(); - } -} +package org.openforis.collect.earth.ipcc.view; + +import java.awt.FlowLayout; +import java.awt.Label; +import java.awt.TextField; +import java.awt.event.TextEvent; +import java.awt.event.TextListener; + +import se.gustavkarlsson.gwiz.AbstractWizardPage; + +@SuppressWarnings("serial") +public class EndPage extends AbstractWizardPage { + + private final TextField finishTextField = new TextField("no", 5); + + public EndPage() { + setLayout(new FlowLayout()); + + add(new Label("Do you want to finish? Type in your answer:")); + add(finishTextField); + + // Add a listener for updating the wizard buttons + finishTextField.addTextListener(new TextListener() { + @Override + public void textValueChanged(TextEvent e) { + updateWizardButtons(); + } + }); + } + + @Override + protected AbstractWizardPage getNextPage() { + return null; + } + + @Override + protected boolean isCancelAllowed() { + return true; + } + + @Override + protected boolean isPreviousAllowed() { + return true; + } + + @Override + protected boolean isNextAllowed() { + return false; + } + + @Override + protected + boolean isFinishAllowed() { + // Only allow finish if the user typed "yes" in the text field + return finishTextField.getText().trim().equalsIgnoreCase("yes"); + } + +} From 28eb5112fa9225fd4c3c81a2a6c93988bd87dde9 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:31 +0100 Subject: [PATCH 1358/1620] New translations EndPage.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 79 ++++++++++++++----- 1 file changed, 58 insertions(+), 21 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 85ce8040d7..63ae88c539 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,21 +1,58 @@ -package org.openforis.collect.earth.ipcc.model; - -public enum ManagementType { - - MANAGED("Managed"),UNMANAGED("Unmanaged"); - - public final String name; - - private ManagementType(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - @Override - public String toString() { - return getName(); - } -} +package org.openforis.collect.earth.ipcc.view; + +import java.awt.FlowLayout; +import java.awt.Label; +import java.awt.TextField; +import java.awt.event.TextEvent; +import java.awt.event.TextListener; + +import se.gustavkarlsson.gwiz.AbstractWizardPage; + +@SuppressWarnings("serial") +public class EndPage extends AbstractWizardPage { + + private final TextField finishTextField = new TextField("no", 5); + + public EndPage() { + setLayout(new FlowLayout()); + + add(new Label("Do you want to finish? Type in your answer:")); + add(finishTextField); + + // Add a listener for updating the wizard buttons + finishTextField.addTextListener(new TextListener() { + @Override + public void textValueChanged(TextEvent e) { + updateWizardButtons(); + } + }); + } + + @Override + protected AbstractWizardPage getNextPage() { + return null; + } + + @Override + protected boolean isCancelAllowed() { + return true; + } + + @Override + protected boolean isPreviousAllowed() { + return true; + } + + @Override + protected boolean isNextAllowed() { + return false; + } + + @Override + protected + boolean isFinishAllowed() { + // Only allow finish if the user typed "yes" in the text field + return finishTextField.getText().trim().equalsIgnoreCase("yes"); + } + +} From 1b473e1b59ec33b25c6436074c0351befec72536 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:32 +0100 Subject: [PATCH 1359/1620] New translations EndPage.java (English) --- .../earth/app/view/Messages_en.properties | 97 +++++++++++-------- 1 file changed, 58 insertions(+), 39 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 74424e2c9b..63ae88c539 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,39 +1,58 @@ -package org.openforis.collect.earth.ipcc.view; - -import org.openforis.collect.earth.ipcc.model.CroplandType; -import org.openforis.collect.earth.ipcc.model.LandUseCategory; - -import se.gustavkarlsson.gwiz.AbstractWizardPage; - -public class CroplandPage extends SubdivisionPage { - - - private static final long serialVersionUID = -8470656687978500741L; - private AbstractWizardPage nextPage = new GrasslandPage(); - - public CroplandPage() { - super( LandUseCategory.C ); - } - - @Override - protected AbstractWizardPage getNextPage() { - return nextPage; - } - - - @Override - protected boolean isFinishAllowed() { - return false; - } - - @Override - protected Object[] getValues() { - return CroplandType.values(); - } - - @Override - protected String getLabel() { - return Messages.getString("CroplandPage.0"); //$NON-NLS-1$ - } - -} +package org.openforis.collect.earth.ipcc.view; + +import java.awt.FlowLayout; +import java.awt.Label; +import java.awt.TextField; +import java.awt.event.TextEvent; +import java.awt.event.TextListener; + +import se.gustavkarlsson.gwiz.AbstractWizardPage; + +@SuppressWarnings("serial") +public class EndPage extends AbstractWizardPage { + + private final TextField finishTextField = new TextField("no", 5); + + public EndPage() { + setLayout(new FlowLayout()); + + add(new Label("Do you want to finish? Type in your answer:")); + add(finishTextField); + + // Add a listener for updating the wizard buttons + finishTextField.addTextListener(new TextListener() { + @Override + public void textValueChanged(TextEvent e) { + updateWizardButtons(); + } + }); + } + + @Override + protected AbstractWizardPage getNextPage() { + return null; + } + + @Override + protected boolean isCancelAllowed() { + return true; + } + + @Override + protected boolean isPreviousAllowed() { + return true; + } + + @Override + protected boolean isNextAllowed() { + return false; + } + + @Override + protected + boolean isFinishAllowed() { + // Only allow finish if the user typed "yes" in the text field + return finishTextField.getText().trim().equalsIgnoreCase("yes"); + } + +} From 43c9b59a12edd06a5c54456b7122da4142f73ea7 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:33 +0100 Subject: [PATCH 1360/1620] New translations ForestPage.java (French) --- .../earth/app/view/Messages_fr.properties | 96 ++++++++----------- 1 file changed, 38 insertions(+), 58 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 63ae88c539..0110c75fd0 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,58 +1,38 @@ -package org.openforis.collect.earth.ipcc.view; - -import java.awt.FlowLayout; -import java.awt.Label; -import java.awt.TextField; -import java.awt.event.TextEvent; -import java.awt.event.TextListener; - -import se.gustavkarlsson.gwiz.AbstractWizardPage; - -@SuppressWarnings("serial") -public class EndPage extends AbstractWizardPage { - - private final TextField finishTextField = new TextField("no", 5); - - public EndPage() { - setLayout(new FlowLayout()); - - add(new Label("Do you want to finish? Type in your answer:")); - add(finishTextField); - - // Add a listener for updating the wizard buttons - finishTextField.addTextListener(new TextListener() { - @Override - public void textValueChanged(TextEvent e) { - updateWizardButtons(); - } - }); - } - - @Override - protected AbstractWizardPage getNextPage() { - return null; - } - - @Override - protected boolean isCancelAllowed() { - return true; - } - - @Override - protected boolean isPreviousAllowed() { - return true; - } - - @Override - protected boolean isNextAllowed() { - return false; - } - - @Override - protected - boolean isFinishAllowed() { - // Only allow finish if the user typed "yes" in the text field - return finishTextField.getText().trim().equalsIgnoreCase("yes"); - } - -} +package org.openforis.collect.earth.ipcc.view; + +import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import org.openforis.collect.earth.ipcc.model.ManagementType; + +import se.gustavkarlsson.gwiz.AbstractWizardPage; + +public class ForestPage extends SubdivisionPage { + + private static final long serialVersionUID = -1544068125437624279L; + private AbstractWizardPage nextPage = new CroplandPage(); + + public ForestPage() { + super( LandUseCategory.F ); + } + + @Override + protected AbstractWizardPage getNextPage() { + return nextPage; + } + + + @Override + protected boolean isFinishAllowed() { + return false; + } + + @Override + protected Object[] getValues() { + return ManagementType.values(); + } + + @Override + protected String getLabel() { + return Messages.getString("ForestPage.0"); //$NON-NLS-1$ + } + +} From 4a4520aeca56b038e496a76476c1cf77434f2696 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:34 +0100 Subject: [PATCH 1361/1620] New translations ForestPage.java (Spanish) --- .../earth/app/view/Messages_es.properties | 96 ++++++++----------- 1 file changed, 38 insertions(+), 58 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 63ae88c539..0110c75fd0 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,58 +1,38 @@ -package org.openforis.collect.earth.ipcc.view; - -import java.awt.FlowLayout; -import java.awt.Label; -import java.awt.TextField; -import java.awt.event.TextEvent; -import java.awt.event.TextListener; - -import se.gustavkarlsson.gwiz.AbstractWizardPage; - -@SuppressWarnings("serial") -public class EndPage extends AbstractWizardPage { - - private final TextField finishTextField = new TextField("no", 5); - - public EndPage() { - setLayout(new FlowLayout()); - - add(new Label("Do you want to finish? Type in your answer:")); - add(finishTextField); - - // Add a listener for updating the wizard buttons - finishTextField.addTextListener(new TextListener() { - @Override - public void textValueChanged(TextEvent e) { - updateWizardButtons(); - } - }); - } - - @Override - protected AbstractWizardPage getNextPage() { - return null; - } - - @Override - protected boolean isCancelAllowed() { - return true; - } - - @Override - protected boolean isPreviousAllowed() { - return true; - } - - @Override - protected boolean isNextAllowed() { - return false; - } - - @Override - protected - boolean isFinishAllowed() { - // Only allow finish if the user typed "yes" in the text field - return finishTextField.getText().trim().equalsIgnoreCase("yes"); - } - -} +package org.openforis.collect.earth.ipcc.view; + +import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import org.openforis.collect.earth.ipcc.model.ManagementType; + +import se.gustavkarlsson.gwiz.AbstractWizardPage; + +public class ForestPage extends SubdivisionPage { + + private static final long serialVersionUID = -1544068125437624279L; + private AbstractWizardPage nextPage = new CroplandPage(); + + public ForestPage() { + super( LandUseCategory.F ); + } + + @Override + protected AbstractWizardPage getNextPage() { + return nextPage; + } + + + @Override + protected boolean isFinishAllowed() { + return false; + } + + @Override + protected Object[] getValues() { + return ManagementType.values(); + } + + @Override + protected String getLabel() { + return Messages.getString("ForestPage.0"); //$NON-NLS-1$ + } + +} From 434c73d46c126c1b253859ea60dc42c87bdec54b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:35 +0100 Subject: [PATCH 1362/1620] New translations ForestPage.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 96 ++++++++----------- 1 file changed, 38 insertions(+), 58 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 63ae88c539..0110c75fd0 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,58 +1,38 @@ -package org.openforis.collect.earth.ipcc.view; - -import java.awt.FlowLayout; -import java.awt.Label; -import java.awt.TextField; -import java.awt.event.TextEvent; -import java.awt.event.TextListener; - -import se.gustavkarlsson.gwiz.AbstractWizardPage; - -@SuppressWarnings("serial") -public class EndPage extends AbstractWizardPage { - - private final TextField finishTextField = new TextField("no", 5); - - public EndPage() { - setLayout(new FlowLayout()); - - add(new Label("Do you want to finish? Type in your answer:")); - add(finishTextField); - - // Add a listener for updating the wizard buttons - finishTextField.addTextListener(new TextListener() { - @Override - public void textValueChanged(TextEvent e) { - updateWizardButtons(); - } - }); - } - - @Override - protected AbstractWizardPage getNextPage() { - return null; - } - - @Override - protected boolean isCancelAllowed() { - return true; - } - - @Override - protected boolean isPreviousAllowed() { - return true; - } - - @Override - protected boolean isNextAllowed() { - return false; - } - - @Override - protected - boolean isFinishAllowed() { - // Only allow finish if the user typed "yes" in the text field - return finishTextField.getText().trim().equalsIgnoreCase("yes"); - } - -} +package org.openforis.collect.earth.ipcc.view; + +import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import org.openforis.collect.earth.ipcc.model.ManagementType; + +import se.gustavkarlsson.gwiz.AbstractWizardPage; + +public class ForestPage extends SubdivisionPage { + + private static final long serialVersionUID = -1544068125437624279L; + private AbstractWizardPage nextPage = new CroplandPage(); + + public ForestPage() { + super( LandUseCategory.F ); + } + + @Override + protected AbstractWizardPage getNextPage() { + return nextPage; + } + + + @Override + protected boolean isFinishAllowed() { + return false; + } + + @Override + protected Object[] getValues() { + return ManagementType.values(); + } + + @Override + protected String getLabel() { + return Messages.getString("ForestPage.0"); //$NON-NLS-1$ + } + +} From a8aa6d4c13775370828407cd879e62176f8ce0f2 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:36 +0100 Subject: [PATCH 1363/1620] New translations IPCCDataExportCSV.java (English) --- .../earth/app/view/Messages_en.properties | 119 +++++++++--------- 1 file changed, 61 insertions(+), 58 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 63ae88c539..9365dd0666 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,58 +1,61 @@ -package org.openforis.collect.earth.ipcc.view; - -import java.awt.FlowLayout; -import java.awt.Label; -import java.awt.TextField; -import java.awt.event.TextEvent; -import java.awt.event.TextListener; - -import se.gustavkarlsson.gwiz.AbstractWizardPage; - -@SuppressWarnings("serial") -public class EndPage extends AbstractWizardPage { - - private final TextField finishTextField = new TextField("no", 5); - - public EndPage() { - setLayout(new FlowLayout()); - - add(new Label("Do you want to finish? Type in your answer:")); - add(finishTextField); - - // Add a listener for updating the wizard buttons - finishTextField.addTextListener(new TextListener() { - @Override - public void textValueChanged(TextEvent e) { - updateWizardButtons(); - } - }); - } - - @Override - protected AbstractWizardPage getNextPage() { - return null; - } - - @Override - protected boolean isCancelAllowed() { - return true; - } - - @Override - protected boolean isPreviousAllowed() { - return true; - } - - @Override - protected boolean isNextAllowed() { - return false; - } - - @Override - protected - boolean isFinishAllowed() { - // Only allow finish if the user typed "yes" in the text field - return finishTextField.getText().trim().equalsIgnoreCase("yes"); - } - -} +package org.openforis.collect.earth.ipcc; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +import org.openforis.collect.earth.app.service.RDBConnector; +import org.openforis.collect.earth.app.service.SchemaService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; + +import com.opencsv.CSVWriter; + +public abstract class IPCCDataExportCSV extends RDBConnector { + + @Autowired + protected SchemaService schemaService; + Logger logger = LoggerFactory.getLogger(IPCCDataExportCSV.class); + + public IPCCDataExportCSV() { + super(); + } + + protected RowMapper getRowMapper() { + return new RowMapper() { + @Override + public String[] mapRow(ResultSet rs, int rowNum) throws SQLException { + int columnCount = rs.getMetaData().getColumnCount(); + String[] columns = new String[ columnCount ]; + for (int i = 1; i <= columnCount; i++) { + columns[i-1] = rs.getString(i); + } + return columns; + } + }; + } + + protected File createCsv(List luData) throws IOException { + File csvDestination = File.createTempFile("TimeSeriesData", ".csv"); + csvDestination.deleteOnExit(); + try ( + FileWriter fw = new FileWriter(csvDestination); + CSVWriter csvWriter = new CSVWriter(fw) + ){ + + for (String[] row : luData) { + csvWriter.writeNext(row); + } + + } catch (Exception e) { + logger.error("Error generating CSV", e); + } + return csvDestination; + } + +} \ No newline at end of file From 47d9888d41c538e5c7824346211da8be84fce0d1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:37 +0100 Subject: [PATCH 1364/1620] New translations WetlandPage.java (Portuguese) --- .../collect/earth/app/view/Messages_pt.properties | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 0110c75fd0..b55115af7f 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -5,13 +5,13 @@ import org.openforis.collect.earth.ipcc.model.ManagementType; import se.gustavkarlsson.gwiz.AbstractWizardPage; -public class ForestPage extends SubdivisionPage { +public class WetlandPage extends SubdivisionPage { - private static final long serialVersionUID = -1544068125437624279L; - private AbstractWizardPage nextPage = new CroplandPage(); + private static final long serialVersionUID = 5385335458259411328L; + private AbstractWizardPage nextPage = new OtherlandPage(); - public ForestPage() { - super( LandUseCategory.F ); + public WetlandPage() { + super( LandUseCategory.W ); } @Override @@ -32,7 +32,7 @@ public class ForestPage extends SubdivisionPage { @Override protected String getLabel() { - return Messages.getString("ForestPage.0"); //$NON-NLS-1$ + return Messages.getString("WetlandPage.0"); //$NON-NLS-1$ } } From 471d80be9c0797f31bc3e9f966859b4fbca37586 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:39 +0100 Subject: [PATCH 1365/1620] New translations WetlandPage.java (English) --- .../earth/app/view/Messages_en.properties | 75 +++++++------------ 1 file changed, 26 insertions(+), 49 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 9365dd0666..b55115af7f 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,61 +1,38 @@ -package org.openforis.collect.earth.ipcc; +package org.openforis.collect.earth.ipcc.view; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; +import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import org.openforis.collect.earth.ipcc.model.ManagementType; -import org.openforis.collect.earth.app.service.RDBConnector; -import org.openforis.collect.earth.app.service.SchemaService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.RowMapper; +import se.gustavkarlsson.gwiz.AbstractWizardPage; -import com.opencsv.CSVWriter; +public class WetlandPage extends SubdivisionPage { -public abstract class IPCCDataExportCSV extends RDBConnector { + private static final long serialVersionUID = 5385335458259411328L; + private AbstractWizardPage nextPage = new OtherlandPage(); + + public WetlandPage() { + super( LandUseCategory.W ); + } - @Autowired - protected SchemaService schemaService; - Logger logger = LoggerFactory.getLogger(IPCCDataExportCSV.class); + @Override + protected AbstractWizardPage getNextPage() { + return nextPage; + } - public IPCCDataExportCSV() { - super(); + + @Override + protected boolean isFinishAllowed() { + return false; } - protected RowMapper getRowMapper() { - return new RowMapper() { - @Override - public String[] mapRow(ResultSet rs, int rowNum) throws SQLException { - int columnCount = rs.getMetaData().getColumnCount(); - String[] columns = new String[ columnCount ]; - for (int i = 1; i <= columnCount; i++) { - columns[i-1] = rs.getString(i); - } - return columns; - } - }; + @Override + protected Object[] getValues() { + return ManagementType.values(); } - protected File createCsv(List luData) throws IOException { - File csvDestination = File.createTempFile("TimeSeriesData", ".csv"); - csvDestination.deleteOnExit(); - try ( - FileWriter fw = new FileWriter(csvDestination); - CSVWriter csvWriter = new CSVWriter(fw) - ){ - - for (String[] row : luData) { - csvWriter.writeNext(row); - } - - } catch (Exception e) { - logger.error("Error generating CSV", e); - } - return csvDestination; + @Override + protected String getLabel() { + return Messages.getString("WetlandPage.0"); //$NON-NLS-1$ } -} \ No newline at end of file +} From f4f38d4ec3ceeafb2f5755e058829814e8f378b1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:40 +0100 Subject: [PATCH 1366/1620] New translations messages.properties (French) --- .../earth/app/view/Messages_fr.properties | 49 +++++-------------- 1 file changed, 11 insertions(+), 38 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 0110c75fd0..6e3b722ec9 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,38 +1,11 @@ -package org.openforis.collect.earth.ipcc.view; - -import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.ManagementType; - -import se.gustavkarlsson.gwiz.AbstractWizardPage; - -public class ForestPage extends SubdivisionPage { - - private static final long serialVersionUID = -1544068125437624279L; - private AbstractWizardPage nextPage = new CroplandPage(); - - public ForestPage() { - super( LandUseCategory.F ); - } - - @Override - protected AbstractWizardPage getNextPage() { - return nextPage; - } - - - @Override - protected boolean isFinishAllowed() { - return false; - } - - @Override - protected Object[] getValues() { - return ManagementType.values(); - } - - @Override - protected String getLabel() { - return Messages.getString("ForestPage.0"); //$NON-NLS-1$ - } - -} +CroplandPage.0=Cropland subdivisions / Management +ForestPage.0=Forest subdivisions / Management +GrasslandPage.0=Grassland subdivisions / Management +JDialogWizard.0=Cancel +JDialogWizard.1=Previous +JDialogWizard.2=Next +JDialogWizard.3=Finish +JDialogWizard.4=Wizard finished\! +OtherlandPage.0=Otherland subdivisions / tree presence +SettlementPage.0=Settlement subdivisions / tree presence +WetlandPage.0=Wetland subdivisions / tree presence From 0a911852e33ddee48deafc763b4be6e43beb2b6b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:41 +0100 Subject: [PATCH 1367/1620] New translations messages.properties (Spanish) --- .../earth/app/view/Messages_es.properties | 49 +++++-------------- 1 file changed, 11 insertions(+), 38 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 0110c75fd0..6e3b722ec9 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,38 +1,11 @@ -package org.openforis.collect.earth.ipcc.view; - -import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.ManagementType; - -import se.gustavkarlsson.gwiz.AbstractWizardPage; - -public class ForestPage extends SubdivisionPage { - - private static final long serialVersionUID = -1544068125437624279L; - private AbstractWizardPage nextPage = new CroplandPage(); - - public ForestPage() { - super( LandUseCategory.F ); - } - - @Override - protected AbstractWizardPage getNextPage() { - return nextPage; - } - - - @Override - protected boolean isFinishAllowed() { - return false; - } - - @Override - protected Object[] getValues() { - return ManagementType.values(); - } - - @Override - protected String getLabel() { - return Messages.getString("ForestPage.0"); //$NON-NLS-1$ - } - -} +CroplandPage.0=Cropland subdivisions / Management +ForestPage.0=Forest subdivisions / Management +GrasslandPage.0=Grassland subdivisions / Management +JDialogWizard.0=Cancel +JDialogWizard.1=Previous +JDialogWizard.2=Next +JDialogWizard.3=Finish +JDialogWizard.4=Wizard finished\! +OtherlandPage.0=Otherland subdivisions / tree presence +SettlementPage.0=Settlement subdivisions / tree presence +WetlandPage.0=Wetland subdivisions / tree presence From 295dc14ff3422877f9cf30de247f4b0d755bc3fa Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:42 +0100 Subject: [PATCH 1368/1620] New translations messages.properties (Portuguese) --- .../earth/app/view/Messages_pt.properties | 49 +++++-------------- 1 file changed, 11 insertions(+), 38 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index b55115af7f..6e3b722ec9 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,38 +1,11 @@ -package org.openforis.collect.earth.ipcc.view; - -import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.ManagementType; - -import se.gustavkarlsson.gwiz.AbstractWizardPage; - -public class WetlandPage extends SubdivisionPage { - - private static final long serialVersionUID = 5385335458259411328L; - private AbstractWizardPage nextPage = new OtherlandPage(); - - public WetlandPage() { - super( LandUseCategory.W ); - } - - @Override - protected AbstractWizardPage getNextPage() { - return nextPage; - } - - - @Override - protected boolean isFinishAllowed() { - return false; - } - - @Override - protected Object[] getValues() { - return ManagementType.values(); - } - - @Override - protected String getLabel() { - return Messages.getString("WetlandPage.0"); //$NON-NLS-1$ - } - -} +CroplandPage.0=Cropland subdivisions / Management +ForestPage.0=Forest subdivisions / Management +GrasslandPage.0=Grassland subdivisions / Management +JDialogWizard.0=Cancel +JDialogWizard.1=Previous +JDialogWizard.2=Next +JDialogWizard.3=Finish +JDialogWizard.4=Wizard finished\! +OtherlandPage.0=Otherland subdivisions / tree presence +SettlementPage.0=Settlement subdivisions / tree presence +WetlandPage.0=Wetland subdivisions / tree presence From d04c5d8ce7f0715c52361b5e6aae854ed07dbc4f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:43 +0100 Subject: [PATCH 1369/1620] New translations messages.properties (English) --- .../earth/app/view/Messages_en.properties | 49 +++++-------------- 1 file changed, 11 insertions(+), 38 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index b55115af7f..6e3b722ec9 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,38 +1,11 @@ -package org.openforis.collect.earth.ipcc.view; - -import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.ManagementType; - -import se.gustavkarlsson.gwiz.AbstractWizardPage; - -public class WetlandPage extends SubdivisionPage { - - private static final long serialVersionUID = 5385335458259411328L; - private AbstractWizardPage nextPage = new OtherlandPage(); - - public WetlandPage() { - super( LandUseCategory.W ); - } - - @Override - protected AbstractWizardPage getNextPage() { - return nextPage; - } - - - @Override - protected boolean isFinishAllowed() { - return false; - } - - @Override - protected Object[] getValues() { - return ManagementType.values(); - } - - @Override - protected String getLabel() { - return Messages.getString("WetlandPage.0"); //$NON-NLS-1$ - } - -} +CroplandPage.0=Cropland subdivisions / Management +ForestPage.0=Forest subdivisions / Management +GrasslandPage.0=Grassland subdivisions / Management +JDialogWizard.0=Cancel +JDialogWizard.1=Previous +JDialogWizard.2=Next +JDialogWizard.3=Finish +JDialogWizard.4=Wizard finished\! +OtherlandPage.0=Otherland subdivisions / tree presence +SettlementPage.0=Settlement subdivisions / tree presence +WetlandPage.0=Wetland subdivisions / tree presence From 7b3a42555d5d7f67beb9f1c524b6019fbf0965d0 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:44 +0100 Subject: [PATCH 1370/1620] New translations IPCCDataExportCSV.java (French) --- .../earth/app/view/Messages_fr.properties | 72 ++++++++++++++++--- 1 file changed, 61 insertions(+), 11 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 6e3b722ec9..9365dd0666 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,11 +1,61 @@ -CroplandPage.0=Cropland subdivisions / Management -ForestPage.0=Forest subdivisions / Management -GrasslandPage.0=Grassland subdivisions / Management -JDialogWizard.0=Cancel -JDialogWizard.1=Previous -JDialogWizard.2=Next -JDialogWizard.3=Finish -JDialogWizard.4=Wizard finished\! -OtherlandPage.0=Otherland subdivisions / tree presence -SettlementPage.0=Settlement subdivisions / tree presence -WetlandPage.0=Wetland subdivisions / tree presence +package org.openforis.collect.earth.ipcc; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +import org.openforis.collect.earth.app.service.RDBConnector; +import org.openforis.collect.earth.app.service.SchemaService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; + +import com.opencsv.CSVWriter; + +public abstract class IPCCDataExportCSV extends RDBConnector { + + @Autowired + protected SchemaService schemaService; + Logger logger = LoggerFactory.getLogger(IPCCDataExportCSV.class); + + public IPCCDataExportCSV() { + super(); + } + + protected RowMapper getRowMapper() { + return new RowMapper() { + @Override + public String[] mapRow(ResultSet rs, int rowNum) throws SQLException { + int columnCount = rs.getMetaData().getColumnCount(); + String[] columns = new String[ columnCount ]; + for (int i = 1; i <= columnCount; i++) { + columns[i-1] = rs.getString(i); + } + return columns; + } + }; + } + + protected File createCsv(List luData) throws IOException { + File csvDestination = File.createTempFile("TimeSeriesData", ".csv"); + csvDestination.deleteOnExit(); + try ( + FileWriter fw = new FileWriter(csvDestination); + CSVWriter csvWriter = new CSVWriter(fw) + ){ + + for (String[] row : luData) { + csvWriter.writeNext(row); + } + + } catch (Exception e) { + logger.error("Error generating CSV", e); + } + return csvDestination; + } + +} \ No newline at end of file From 312fd6546aeb042711e634a3ad0a73ece9d01307 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:45 +0100 Subject: [PATCH 1371/1620] New translations IPCCDataExportCSV.java (Spanish) --- .../earth/app/view/Messages_es.properties | 72 ++++++++++++++++--- 1 file changed, 61 insertions(+), 11 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 6e3b722ec9..9365dd0666 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,11 +1,61 @@ -CroplandPage.0=Cropland subdivisions / Management -ForestPage.0=Forest subdivisions / Management -GrasslandPage.0=Grassland subdivisions / Management -JDialogWizard.0=Cancel -JDialogWizard.1=Previous -JDialogWizard.2=Next -JDialogWizard.3=Finish -JDialogWizard.4=Wizard finished\! -OtherlandPage.0=Otherland subdivisions / tree presence -SettlementPage.0=Settlement subdivisions / tree presence -WetlandPage.0=Wetland subdivisions / tree presence +package org.openforis.collect.earth.ipcc; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +import org.openforis.collect.earth.app.service.RDBConnector; +import org.openforis.collect.earth.app.service.SchemaService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; + +import com.opencsv.CSVWriter; + +public abstract class IPCCDataExportCSV extends RDBConnector { + + @Autowired + protected SchemaService schemaService; + Logger logger = LoggerFactory.getLogger(IPCCDataExportCSV.class); + + public IPCCDataExportCSV() { + super(); + } + + protected RowMapper getRowMapper() { + return new RowMapper() { + @Override + public String[] mapRow(ResultSet rs, int rowNum) throws SQLException { + int columnCount = rs.getMetaData().getColumnCount(); + String[] columns = new String[ columnCount ]; + for (int i = 1; i <= columnCount; i++) { + columns[i-1] = rs.getString(i); + } + return columns; + } + }; + } + + protected File createCsv(List luData) throws IOException { + File csvDestination = File.createTempFile("TimeSeriesData", ".csv"); + csvDestination.deleteOnExit(); + try ( + FileWriter fw = new FileWriter(csvDestination); + CSVWriter csvWriter = new CSVWriter(fw) + ){ + + for (String[] row : luData) { + csvWriter.writeNext(row); + } + + } catch (Exception e) { + logger.error("Error generating CSV", e); + } + return csvDestination; + } + +} \ No newline at end of file From 8b4abc8056c70cafbcfa2feb36803c2d66002380 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:46 +0100 Subject: [PATCH 1372/1620] New translations IPCCDataExportCSV.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 72 ++++++++++++++++--- 1 file changed, 61 insertions(+), 11 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 6e3b722ec9..9365dd0666 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,11 +1,61 @@ -CroplandPage.0=Cropland subdivisions / Management -ForestPage.0=Forest subdivisions / Management -GrasslandPage.0=Grassland subdivisions / Management -JDialogWizard.0=Cancel -JDialogWizard.1=Previous -JDialogWizard.2=Next -JDialogWizard.3=Finish -JDialogWizard.4=Wizard finished\! -OtherlandPage.0=Otherland subdivisions / tree presence -SettlementPage.0=Settlement subdivisions / tree presence -WetlandPage.0=Wetland subdivisions / tree presence +package org.openforis.collect.earth.ipcc; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +import org.openforis.collect.earth.app.service.RDBConnector; +import org.openforis.collect.earth.app.service.SchemaService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; + +import com.opencsv.CSVWriter; + +public abstract class IPCCDataExportCSV extends RDBConnector { + + @Autowired + protected SchemaService schemaService; + Logger logger = LoggerFactory.getLogger(IPCCDataExportCSV.class); + + public IPCCDataExportCSV() { + super(); + } + + protected RowMapper getRowMapper() { + return new RowMapper() { + @Override + public String[] mapRow(ResultSet rs, int rowNum) throws SQLException { + int columnCount = rs.getMetaData().getColumnCount(); + String[] columns = new String[ columnCount ]; + for (int i = 1; i <= columnCount; i++) { + columns[i-1] = rs.getString(i); + } + return columns; + } + }; + } + + protected File createCsv(List luData) throws IOException { + File csvDestination = File.createTempFile("TimeSeriesData", ".csv"); + csvDestination.deleteOnExit(); + try ( + FileWriter fw = new FileWriter(csvDestination); + CSVWriter csvWriter = new CSVWriter(fw) + ){ + + for (String[] row : luData) { + csvWriter.writeNext(row); + } + + } catch (Exception e) { + logger.error("Error generating CSV", e); + } + return csvDestination; + } + +} \ No newline at end of file From b291c6968583bb4db994c733eef895e027458d6a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:48 +0100 Subject: [PATCH 1373/1620] New translations IPCCDataExportLandUnitsCSV.java (French) --- .../earth/app/view/Messages_fr.properties | 86 +++++++++++++------ 1 file changed, 58 insertions(+), 28 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 9365dd0666..1c57311278 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,61 +1,91 @@ package org.openforis.collect.earth.ipcc; import java.io.File; -import java.io.FileWriter; import java.io.IOException; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; -import org.openforis.collect.earth.app.service.RDBConnector; -import org.openforis.collect.earth.app.service.SchemaService; +import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.RegionCalculationUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Component; -import com.opencsv.CSVWriter; +@Component +public class IPCCDataExportLandUnitsCSV extends IPCCDataExportCSV { -public abstract class IPCCDataExportCSV extends RDBConnector { + private String schemaName; - @Autowired - protected SchemaService schemaService; - Logger logger = LoggerFactory.getLogger(IPCCDataExportCSV.class); + Logger logger = LoggerFactory.getLogger(IPCCDataExportLandUnitsCSV.class); + + private final static String LAND_UNIT_ID = "land_unit_id"; - public IPCCDataExportCSV() { + public IPCCDataExportLandUnitsCSV() { super(); + setExportTypeUsed(ExportType.IPCC); + } + + public File generateTimeseriesData( int startYear, int endYear ) throws IOException { + schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); + List luCombinations = generateLUCombinations(startYear, endYear); + return createCsv( luCombinations); } + @Override protected RowMapper getRowMapper() { return new RowMapper() { @Override public String[] mapRow(ResultSet rs, int rowNum) throws SQLException { int columnCount = rs.getMetaData().getColumnCount(); + columnCount++; // adding an extra column with the row number String[] columns = new String[ columnCount ]; - for (int i = 1; i <= columnCount; i++) { - columns[i-1] = rs.getString(i); + columns[0] = "LU_" + String.format("%04d", rs.getRow()) ; + for (int i = 1; i < columnCount; i++) { + columns[i] = rs.getString(i); } return columns; } }; } - - protected File createCsv(List luData) throws IOException { - File csvDestination = File.createTempFile("TimeSeriesData", ".csv"); - csvDestination.deleteOnExit(); - try ( - FileWriter fw = new FileWriter(csvDestination); - CSVWriter csvWriter = new CSVWriter(fw) - ){ - - for (String[] row : luData) { - csvWriter.writeNext(row); - } - } catch (Exception e) { - logger.error("Error generating CSV", e); + private List generateLUCombinations(int startYear, int endYear) { + String selectedYears = IPCCDataExportTimeSeries.CLIMATE_COLUMN_LABEL + + ", " + IPCCDataExportTimeSeries.SOIL_COLUMN_LABEL + + ", " + IPCCDataExportTimeSeries.GEZ_COLUMN_LABEL + ", " ; + for( int year = startYear ; year <= endYear; year++ ) { + selectedYears += IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + ","; } - return csvDestination; + + String sqlSelect = "select " + + selectedYears + + " sum( " + RegionCalculationUtils.EXPANSION_FACTOR + ")" + + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.SOIL_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.CLIMATE_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.GEZ_TABLE + + + " where " + + IPCCDataExportTimeSeries.SOIL_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.SOIL_COLUMN_ID + + " and " + + IPCCDataExportTimeSeries.CLIMATE_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_ID + + " and " + + IPCCDataExportTimeSeries.GEZ_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.GEZ_COLUMN_ID + + + " GROUP BY " + + selectedYears.substring(0, selectedYears.length()-1) + + " ORDER BY sum( "+ RegionCalculationUtils.EXPANSION_FACTOR + " ) DESC"; // Remove trailing comma from list of years + + + List luData = getJdbcTemplate().query( + sqlSelect + , + getRowMapper() + ); + + selectedYears= LAND_UNIT_ID + "," + selectedYears; // Add the Land Unit ID which is basically the row number + selectedYears+= "area"; // so the area columns appears too + luData.add( 0, selectedYears.split(",") ); // Add the header row for the CSV output in the first position of the List + return luData; } -} \ No newline at end of file +} From 045dd32b380474cea8978ec80ba7f6350b7df1cb Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:49 +0100 Subject: [PATCH 1374/1620] New translations WetlandPage.java (French) --- .../earth/app/view/Messages_fr.properties | 97 +++++-------------- 1 file changed, 22 insertions(+), 75 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 1c57311278..b55115af7f 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,91 +1,38 @@ -package org.openforis.collect.earth.ipcc; +package org.openforis.collect.earth.ipcc.view; -import java.io.File; -import java.io.IOException; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; +import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import org.openforis.collect.earth.ipcc.model.ManagementType; -import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.RegionCalculationUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.jdbc.core.RowMapper; -import org.springframework.stereotype.Component; +import se.gustavkarlsson.gwiz.AbstractWizardPage; -@Component -public class IPCCDataExportLandUnitsCSV extends IPCCDataExportCSV { +public class WetlandPage extends SubdivisionPage { - private String schemaName; - - Logger logger = LoggerFactory.getLogger(IPCCDataExportLandUnitsCSV.class); + private static final long serialVersionUID = 5385335458259411328L; + private AbstractWizardPage nextPage = new OtherlandPage(); - private final static String LAND_UNIT_ID = "land_unit_id"; - - public IPCCDataExportLandUnitsCSV() { - super(); - setExportTypeUsed(ExportType.IPCC); + public WetlandPage() { + super( LandUseCategory.W ); } - public File generateTimeseriesData( int startYear, int endYear ) throws IOException { - schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - List luCombinations = generateLUCombinations(startYear, endYear); - return createCsv( luCombinations); + @Override + protected AbstractWizardPage getNextPage() { + return nextPage; } + @Override - protected RowMapper getRowMapper() { - return new RowMapper() { - @Override - public String[] mapRow(ResultSet rs, int rowNum) throws SQLException { - int columnCount = rs.getMetaData().getColumnCount(); - columnCount++; // adding an extra column with the row number - String[] columns = new String[ columnCount ]; - columns[0] = "LU_" + String.format("%04d", rs.getRow()) ; - for (int i = 1; i < columnCount; i++) { - columns[i] = rs.getString(i); - } - return columns; - } - }; + protected boolean isFinishAllowed() { + return false; } - - private List generateLUCombinations(int startYear, int endYear) { - String selectedYears = IPCCDataExportTimeSeries.CLIMATE_COLUMN_LABEL + - ", " + IPCCDataExportTimeSeries.SOIL_COLUMN_LABEL + - ", " + IPCCDataExportTimeSeries.GEZ_COLUMN_LABEL + ", " ; - for( int year = startYear ; year <= endYear; year++ ) { - selectedYears += IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + ","; - } - String sqlSelect = "select " - + selectedYears - + " sum( " + RegionCalculationUtils.EXPANSION_FACTOR + ")" - + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.SOIL_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.CLIMATE_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.GEZ_TABLE - - + " where " - + IPCCDataExportTimeSeries.SOIL_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.SOIL_COLUMN_ID - + " and " - + IPCCDataExportTimeSeries.CLIMATE_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_ID - + " and " - + IPCCDataExportTimeSeries.GEZ_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.GEZ_COLUMN_ID - - + " GROUP BY " - + selectedYears.substring(0, selectedYears.length()-1) - + " ORDER BY sum( "+ RegionCalculationUtils.EXPANSION_FACTOR + " ) DESC"; // Remove trailing comma from list of years - - - List luData = getJdbcTemplate().query( - sqlSelect - , - getRowMapper() - ); + @Override + protected Object[] getValues() { + return ManagementType.values(); + } - selectedYears= LAND_UNIT_ID + "," + selectedYears; // Add the Land Unit ID which is basically the row number - selectedYears+= "area"; // so the area columns appears too - luData.add( 0, selectedYears.split(",") ); // Add the header row for the CSV output in the first position of the List - return luData; + @Override + protected String getLabel() { + return Messages.getString("WetlandPage.0"); //$NON-NLS-1$ } } From 914d8b06eaeb7bfb4ca8f81a219b32a89902625b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:50 +0100 Subject: [PATCH 1375/1620] New translations IPCCDataExportLandUnitsCSV.java (Spanish) --- .../earth/app/view/Messages_es.properties | 86 +++++++++++++------ 1 file changed, 58 insertions(+), 28 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 9365dd0666..1c57311278 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,61 +1,91 @@ package org.openforis.collect.earth.ipcc; import java.io.File; -import java.io.FileWriter; import java.io.IOException; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; -import org.openforis.collect.earth.app.service.RDBConnector; -import org.openforis.collect.earth.app.service.SchemaService; +import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.RegionCalculationUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Component; -import com.opencsv.CSVWriter; +@Component +public class IPCCDataExportLandUnitsCSV extends IPCCDataExportCSV { -public abstract class IPCCDataExportCSV extends RDBConnector { + private String schemaName; - @Autowired - protected SchemaService schemaService; - Logger logger = LoggerFactory.getLogger(IPCCDataExportCSV.class); + Logger logger = LoggerFactory.getLogger(IPCCDataExportLandUnitsCSV.class); + + private final static String LAND_UNIT_ID = "land_unit_id"; - public IPCCDataExportCSV() { + public IPCCDataExportLandUnitsCSV() { super(); + setExportTypeUsed(ExportType.IPCC); + } + + public File generateTimeseriesData( int startYear, int endYear ) throws IOException { + schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); + List luCombinations = generateLUCombinations(startYear, endYear); + return createCsv( luCombinations); } + @Override protected RowMapper getRowMapper() { return new RowMapper() { @Override public String[] mapRow(ResultSet rs, int rowNum) throws SQLException { int columnCount = rs.getMetaData().getColumnCount(); + columnCount++; // adding an extra column with the row number String[] columns = new String[ columnCount ]; - for (int i = 1; i <= columnCount; i++) { - columns[i-1] = rs.getString(i); + columns[0] = "LU_" + String.format("%04d", rs.getRow()) ; + for (int i = 1; i < columnCount; i++) { + columns[i] = rs.getString(i); } return columns; } }; } - - protected File createCsv(List luData) throws IOException { - File csvDestination = File.createTempFile("TimeSeriesData", ".csv"); - csvDestination.deleteOnExit(); - try ( - FileWriter fw = new FileWriter(csvDestination); - CSVWriter csvWriter = new CSVWriter(fw) - ){ - - for (String[] row : luData) { - csvWriter.writeNext(row); - } - } catch (Exception e) { - logger.error("Error generating CSV", e); + private List generateLUCombinations(int startYear, int endYear) { + String selectedYears = IPCCDataExportTimeSeries.CLIMATE_COLUMN_LABEL + + ", " + IPCCDataExportTimeSeries.SOIL_COLUMN_LABEL + + ", " + IPCCDataExportTimeSeries.GEZ_COLUMN_LABEL + ", " ; + for( int year = startYear ; year <= endYear; year++ ) { + selectedYears += IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + ","; } - return csvDestination; + + String sqlSelect = "select " + + selectedYears + + " sum( " + RegionCalculationUtils.EXPANSION_FACTOR + ")" + + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.SOIL_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.CLIMATE_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.GEZ_TABLE + + + " where " + + IPCCDataExportTimeSeries.SOIL_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.SOIL_COLUMN_ID + + " and " + + IPCCDataExportTimeSeries.CLIMATE_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_ID + + " and " + + IPCCDataExportTimeSeries.GEZ_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.GEZ_COLUMN_ID + + + " GROUP BY " + + selectedYears.substring(0, selectedYears.length()-1) + + " ORDER BY sum( "+ RegionCalculationUtils.EXPANSION_FACTOR + " ) DESC"; // Remove trailing comma from list of years + + + List luData = getJdbcTemplate().query( + sqlSelect + , + getRowMapper() + ); + + selectedYears= LAND_UNIT_ID + "," + selectedYears; // Add the Land Unit ID which is basically the row number + selectedYears+= "area"; // so the area columns appears too + luData.add( 0, selectedYears.split(",") ); // Add the header row for the CSV output in the first position of the List + return luData; } -} \ No newline at end of file +} From c3c2ea472673af505c0dea40da4771fc613cd988 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:51 +0100 Subject: [PATCH 1376/1620] New translations IPCCDataExportLandUnitsCSV.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 86 +++++++++++++------ 1 file changed, 58 insertions(+), 28 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 9365dd0666..1c57311278 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,61 +1,91 @@ package org.openforis.collect.earth.ipcc; import java.io.File; -import java.io.FileWriter; import java.io.IOException; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; -import org.openforis.collect.earth.app.service.RDBConnector; -import org.openforis.collect.earth.app.service.SchemaService; +import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.RegionCalculationUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Component; -import com.opencsv.CSVWriter; +@Component +public class IPCCDataExportLandUnitsCSV extends IPCCDataExportCSV { -public abstract class IPCCDataExportCSV extends RDBConnector { + private String schemaName; - @Autowired - protected SchemaService schemaService; - Logger logger = LoggerFactory.getLogger(IPCCDataExportCSV.class); + Logger logger = LoggerFactory.getLogger(IPCCDataExportLandUnitsCSV.class); + + private final static String LAND_UNIT_ID = "land_unit_id"; - public IPCCDataExportCSV() { + public IPCCDataExportLandUnitsCSV() { super(); + setExportTypeUsed(ExportType.IPCC); + } + + public File generateTimeseriesData( int startYear, int endYear ) throws IOException { + schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); + List luCombinations = generateLUCombinations(startYear, endYear); + return createCsv( luCombinations); } + @Override protected RowMapper getRowMapper() { return new RowMapper() { @Override public String[] mapRow(ResultSet rs, int rowNum) throws SQLException { int columnCount = rs.getMetaData().getColumnCount(); + columnCount++; // adding an extra column with the row number String[] columns = new String[ columnCount ]; - for (int i = 1; i <= columnCount; i++) { - columns[i-1] = rs.getString(i); + columns[0] = "LU_" + String.format("%04d", rs.getRow()) ; + for (int i = 1; i < columnCount; i++) { + columns[i] = rs.getString(i); } return columns; } }; } - - protected File createCsv(List luData) throws IOException { - File csvDestination = File.createTempFile("TimeSeriesData", ".csv"); - csvDestination.deleteOnExit(); - try ( - FileWriter fw = new FileWriter(csvDestination); - CSVWriter csvWriter = new CSVWriter(fw) - ){ - - for (String[] row : luData) { - csvWriter.writeNext(row); - } - } catch (Exception e) { - logger.error("Error generating CSV", e); + private List generateLUCombinations(int startYear, int endYear) { + String selectedYears = IPCCDataExportTimeSeries.CLIMATE_COLUMN_LABEL + + ", " + IPCCDataExportTimeSeries.SOIL_COLUMN_LABEL + + ", " + IPCCDataExportTimeSeries.GEZ_COLUMN_LABEL + ", " ; + for( int year = startYear ; year <= endYear; year++ ) { + selectedYears += IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + ","; } - return csvDestination; + + String sqlSelect = "select " + + selectedYears + + " sum( " + RegionCalculationUtils.EXPANSION_FACTOR + ")" + + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.SOIL_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.CLIMATE_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.GEZ_TABLE + + + " where " + + IPCCDataExportTimeSeries.SOIL_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.SOIL_COLUMN_ID + + " and " + + IPCCDataExportTimeSeries.CLIMATE_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_ID + + " and " + + IPCCDataExportTimeSeries.GEZ_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.GEZ_COLUMN_ID + + + " GROUP BY " + + selectedYears.substring(0, selectedYears.length()-1) + + " ORDER BY sum( "+ RegionCalculationUtils.EXPANSION_FACTOR + " ) DESC"; // Remove trailing comma from list of years + + + List luData = getJdbcTemplate().query( + sqlSelect + , + getRowMapper() + ); + + selectedYears= LAND_UNIT_ID + "," + selectedYears; // Add the Land Unit ID which is basically the row number + selectedYears+= "area"; // so the area columns appears too + luData.add( 0, selectedYears.split(",") ); // Add the header row for the CSV output in the first position of the List + return luData; } -} \ No newline at end of file +} From 6bb51496698442a2b60924379e63fa10e6259b24 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:52 +0100 Subject: [PATCH 1377/1620] New translations IPCCDataExportLandUnitsCSV.java (English) --- .../earth/app/view/Messages_en.properties | 102 ++++++++++++++++-- 1 file changed, 91 insertions(+), 11 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 6e3b722ec9..1c57311278 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,11 +1,91 @@ -CroplandPage.0=Cropland subdivisions / Management -ForestPage.0=Forest subdivisions / Management -GrasslandPage.0=Grassland subdivisions / Management -JDialogWizard.0=Cancel -JDialogWizard.1=Previous -JDialogWizard.2=Next -JDialogWizard.3=Finish -JDialogWizard.4=Wizard finished\! -OtherlandPage.0=Otherland subdivisions / tree presence -SettlementPage.0=Settlement subdivisions / tree presence -WetlandPage.0=Wetland subdivisions / tree presence +package org.openforis.collect.earth.ipcc; + +import java.io.File; +import java.io.IOException; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.RegionCalculationUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Component; + +@Component +public class IPCCDataExportLandUnitsCSV extends IPCCDataExportCSV { + + private String schemaName; + + Logger logger = LoggerFactory.getLogger(IPCCDataExportLandUnitsCSV.class); + + private final static String LAND_UNIT_ID = "land_unit_id"; + + public IPCCDataExportLandUnitsCSV() { + super(); + setExportTypeUsed(ExportType.IPCC); + } + + public File generateTimeseriesData( int startYear, int endYear ) throws IOException { + schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); + List luCombinations = generateLUCombinations(startYear, endYear); + return createCsv( luCombinations); + } + + @Override + protected RowMapper getRowMapper() { + return new RowMapper() { + @Override + public String[] mapRow(ResultSet rs, int rowNum) throws SQLException { + int columnCount = rs.getMetaData().getColumnCount(); + columnCount++; // adding an extra column with the row number + String[] columns = new String[ columnCount ]; + columns[0] = "LU_" + String.format("%04d", rs.getRow()) ; + for (int i = 1; i < columnCount; i++) { + columns[i] = rs.getString(i); + } + return columns; + } + }; + } + + private List generateLUCombinations(int startYear, int endYear) { + String selectedYears = IPCCDataExportTimeSeries.CLIMATE_COLUMN_LABEL + + ", " + IPCCDataExportTimeSeries.SOIL_COLUMN_LABEL + + ", " + IPCCDataExportTimeSeries.GEZ_COLUMN_LABEL + ", " ; + for( int year = startYear ; year <= endYear; year++ ) { + selectedYears += IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + ","; + } + + String sqlSelect = "select " + + selectedYears + + " sum( " + RegionCalculationUtils.EXPANSION_FACTOR + ")" + + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.SOIL_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.CLIMATE_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.GEZ_TABLE + + + " where " + + IPCCDataExportTimeSeries.SOIL_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.SOIL_COLUMN_ID + + " and " + + IPCCDataExportTimeSeries.CLIMATE_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_ID + + " and " + + IPCCDataExportTimeSeries.GEZ_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.GEZ_COLUMN_ID + + + " GROUP BY " + + selectedYears.substring(0, selectedYears.length()-1) + + " ORDER BY sum( "+ RegionCalculationUtils.EXPANSION_FACTOR + " ) DESC"; // Remove trailing comma from list of years + + + List luData = getJdbcTemplate().query( + sqlSelect + , + getRowMapper() + ); + + selectedYears= LAND_UNIT_ID + "," + selectedYears; // Add the Land Unit ID which is basically the row number + selectedYears+= "area"; // so the area columns appears too + luData.add( 0, selectedYears.split(",") ); // Add the header row for the CSV output in the first position of the List + return luData; + } + +} From 7c142cda312c2d108f4a62bbb04014f0f369c2bb Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:53 +0100 Subject: [PATCH 1378/1620] New translations IPCCDataExportMatrixExcel.java (French) --- .../earth/app/view/Messages_fr.properties | 238 ++++++++++++++++-- 1 file changed, 217 insertions(+), 21 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index b55115af7f..1230b9a5c0 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,38 +1,234 @@ -package org.openforis.collect.earth.ipcc.view; +package org.openforis.collect.earth.ipcc; -import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.ManagementType; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; -import se.gustavkarlsson.gwiz.AbstractWizardPage; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections.Predicate; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.Font; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.RDBConnector; +import org.openforis.collect.earth.app.service.RegionCalculationUtils; +import org.openforis.collect.earth.app.service.SchemaService; +import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Component; -public class WetlandPage extends SubdivisionPage { +import liquibase.pro.packaged.E; - private static final long serialVersionUID = 5385335458259411328L; - private AbstractWizardPage nextPage = new OtherlandPage(); +@Component +public class IPCCDataExportMatrixExcel extends RDBConnector { + + private String schemaName; - public WetlandPage() { - super( LandUseCategory.W ); + Logger logger = LoggerFactory.getLogger(IPCCDataExportMatrixExcel.class); + + @Autowired + private SchemaService schemaService; + + public IPCCDataExportMatrixExcel() { + setExportTypeUsed(ExportType.IPCC); + } + + public File generateTimeseriesData( int startYear, int endYear ) throws IOException { + schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); + + List matrixSheets = new ArrayList(); + + for (int year = startYear; year < endYear; year++) { + MatrixSheet yearMatrixData = generateLUMatrixForYear(year); + if (yearMatrixData != null) + matrixSheets.add(yearMatrixData); + } + + return createExcel( matrixSheets); } - @Override - protected AbstractWizardPage getNextPage() { - return nextPage; + + private MatrixSheet generateLUMatrixForYear(int year) { + + List luData = getJdbcTemplate().query( + "select " + + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " + + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1) + "," + + "sum( " + RegionCalculationUtils.EXPANSION_FACTOR + ")" + + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE + + " GROUP BY " + + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + "," + + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1), + getRowMapper() + ); + + if (luData.size() == 0) { // No LU data for the climate, soil, gez combination + return null; + } + + YearData yearData = new YearData(year, luData); + + return new MatrixSheet( yearData ); } - @Override - protected boolean isFinishAllowed() { - return false; + protected RowMapper getRowMapper() { + return new RowMapper() { + @Override + public LUDataPerYear mapRow(ResultSet rs, int rowNum) throws SQLException { + + String categoryInitial = rs.getString(1); + String categoryFinal = rs.getString(2); + String subdivInitial = rs.getString(3); + String subdivFinal = rs.getString(4); + + return new LUDataPerYear( + LandUseSubdivisionUtils.getSubdivision(categoryInitial, subdivInitial), + LandUseSubdivisionUtils.getSubdivision(categoryFinal, subdivFinal), + rs.getDouble(5) // area + ); + } + }; } - @Override - protected Object[] getValues() { - return ManagementType.values(); + protected static LUDataPerYear findLuData( LandUseSubdivision initialSubdivision, LandUseSubdivision finalSubdivision, List luData ) { + Collection result = CollectionUtils.select(luData, new Predicate() { + public boolean evaluate(Object a) { + return + ( (LUDataPerYear) a ).getLu().equals(initialSubdivision) + && + ( (LUDataPerYear) a ).getLuNextYear().equals(finalSubdivision); + } + }); + if( result.size() == 1 ) + return (LUDataPerYear) result.toArray(new LUDataPerYear[result.size()])[0]; + else + return new LUDataPerYear(initialSubdivision, finalSubdivision, 0); + } - @Override - protected String getLabel() { - return Messages.getString("WetlandPage.0"); //$NON-NLS-1$ + private File createExcel( List matrixData ) throws IOException { + File excelDestination = File.createTempFile("LuMatrixTimeseries", ".xls"); + excelDestination.deleteOnExit(); + // Create a Workbook + try (Workbook workbook = new HSSFWorkbook() ){ + /* CreationHelper helps us create instances of various things like DataFormat, + Hyperlink, RichTextString etc, in a format (HSSF, XSSF) independent way */ + //CreationHelper createHelper = workbook.getCreationHelper(); + + // Create a Font for styling header cells + Font cornerFont = workbook.createFont(); + cornerFont.setBold(true); + cornerFont.setFontHeightInPoints((short) 15); + cornerFont.setColor(IndexedColors.GREY_80_PERCENT.getIndex()); + // Create a CellStyle with the font + CellStyle cornerCellStyle = workbook.createCellStyle(); + cornerCellStyle.setFont(cornerFont); + + // Create a Font for styling header cells + Font headerFont = workbook.createFont(); + headerFont.setBold(true); + headerFont.setFontHeightInPoints((short) 14); + headerFont.setColor(IndexedColors.DARK_TEAL.getIndex()); + // Create a CellStyle with the font + CellStyle headerCellStyle = workbook.createCellStyle(); + headerCellStyle.setFont(headerFont); + + // Create a Font for styling non-diagonal cells + Font stdFont = workbook.createFont(); + stdFont.setBold(false); + stdFont.setFontHeightInPoints((short) 14); + stdFont.setColor(IndexedColors.DARK_RED.getIndex()); + // Create a CellStyle with the font + CellStyle stdCellStyle = workbook.createCellStyle(); + stdCellStyle.setFont(stdFont); + + // Create a Font for styling non-diagonal cells + Font diagonalFont = workbook.createFont(); + diagonalFont.setBold(true); + diagonalFont.setFontHeightInPoints((short) 14); + diagonalFont.setColor(IndexedColors.DARK_GREEN.getIndex()); + // Create a CellStyle with the font + CellStyle diagonalCellStyle = workbook.createCellStyle(); + diagonalCellStyle.setFont(diagonalFont); + + for (MatrixSheet matrix : matrixData) { + // Create a Sheet + Sheet sheet = workbook.createSheet("LU Matrix " + matrix.getYearData().getYear() + "-" + (matrix.getYearData().getYear()+1 ) ); + + // Create a Row + Row headerRow = sheet.createRow(0); + Cell cell = headerRow.createCell(0); + cell.setCellValue( "Transition " + matrix.getYearData().getYear() + "/" + ( matrix.getYearData().getYear() +1 ) ); + cell.setCellStyle(cornerCellStyle); + + int i = 1; + for (LandUseSubdivision subdivision : matrix.getSubdivisions()) { + cell = headerRow.createCell(i++); + cell.setCellValue(subdivision.toString()); + cell.setCellStyle(headerCellStyle); + } + + + int rowNum = 1; + int colNum = 0; + for (LandUseSubdivision subdivisionH : matrix.getSubdivisions()) { + colNum = 0; + Row row = sheet.createRow(rowNum++); + + Cell columnCell = row.createCell(colNum++); + columnCell.setCellStyle(headerCellStyle); + columnCell.setCellValue(subdivisionH.toString()); + + colNum = 1; + for (LandUseSubdivision subdivisionV : matrix.getSubdivisions()) { + + cell = row.createCell(colNum++); + cell.setCellValue( findLuData( subdivisionH, subdivisionV, matrix.getYearData().getLuData() ).getAreaHa() ); + if( subdivisionH.equals( subdivisionV ) ) { + cell.setCellStyle(diagonalCellStyle); + }else { + cell.setCellStyle(stdCellStyle); + } + } + + } + + // Resize all columns to fit the content size + for(int j = 0; j < colNum; j++) { + sheet.autoSizeColumn(j); + } + + } + + // Write the output to a file + try( FileOutputStream fileOut = new FileOutputStream(excelDestination) ){ + workbook.write(fileOut); + } catch (IOException e) { + logger.error("Error generating Excel file", e); + } + } catch (Exception e) { + logger.error("Error generating Excel data", e); + } + return excelDestination; } } From 8fbe9de77511555f1bf657e18d79f1e156132ee7 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:54 +0100 Subject: [PATCH 1379/1620] New translations IPCCDataExportMatrixExcel.java (Spanish) --- .../earth/app/view/Messages_es.properties | 249 ++++++++++++++---- 1 file changed, 196 insertions(+), 53 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 1c57311278..1230b9a5c0 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,91 +1,234 @@ package org.openforis.collect.earth.ipcc; import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; import java.util.List; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections.Predicate; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.Font; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.RDBConnector; import org.openforis.collect.earth.app.service.RegionCalculationUtils; +import org.openforis.collect.earth.app.service.SchemaService; +import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Component; +import liquibase.pro.packaged.E; + @Component -public class IPCCDataExportLandUnitsCSV extends IPCCDataExportCSV { +public class IPCCDataExportMatrixExcel extends RDBConnector { private String schemaName; - - Logger logger = LoggerFactory.getLogger(IPCCDataExportLandUnitsCSV.class); - private final static String LAND_UNIT_ID = "land_unit_id"; + Logger logger = LoggerFactory.getLogger(IPCCDataExportMatrixExcel.class); + + @Autowired + private SchemaService schemaService; - public IPCCDataExportLandUnitsCSV() { - super(); + public IPCCDataExportMatrixExcel() { setExportTypeUsed(ExportType.IPCC); } public File generateTimeseriesData( int startYear, int endYear ) throws IOException { schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - List luCombinations = generateLUCombinations(startYear, endYear); - return createCsv( luCombinations); + + List matrixSheets = new ArrayList(); + + for (int year = startYear; year < endYear; year++) { + MatrixSheet yearMatrixData = generateLUMatrixForYear(year); + if (yearMatrixData != null) + matrixSheets.add(yearMatrixData); + } + + return createExcel( matrixSheets); + } + + + private MatrixSheet generateLUMatrixForYear(int year) { + + List luData = getJdbcTemplate().query( + "select " + + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " + + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1) + "," + + "sum( " + RegionCalculationUtils.EXPANSION_FACTOR + ")" + + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE + + " GROUP BY " + + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + "," + + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1), + getRowMapper() + ); + + if (luData.size() == 0) { // No LU data for the climate, soil, gez combination + return null; + } + + YearData yearData = new YearData(year, luData); + + return new MatrixSheet( yearData ); } - @Override - protected RowMapper getRowMapper() { - return new RowMapper() { + + protected RowMapper getRowMapper() { + return new RowMapper() { @Override - public String[] mapRow(ResultSet rs, int rowNum) throws SQLException { - int columnCount = rs.getMetaData().getColumnCount(); - columnCount++; // adding an extra column with the row number - String[] columns = new String[ columnCount ]; - columns[0] = "LU_" + String.format("%04d", rs.getRow()) ; - for (int i = 1; i < columnCount; i++) { - columns[i] = rs.getString(i); - } - return columns; + public LUDataPerYear mapRow(ResultSet rs, int rowNum) throws SQLException { + + String categoryInitial = rs.getString(1); + String categoryFinal = rs.getString(2); + String subdivInitial = rs.getString(3); + String subdivFinal = rs.getString(4); + + return new LUDataPerYear( + LandUseSubdivisionUtils.getSubdivision(categoryInitial, subdivInitial), + LandUseSubdivisionUtils.getSubdivision(categoryFinal, subdivFinal), + rs.getDouble(5) // area + ); } }; } - - private List generateLUCombinations(int startYear, int endYear) { - String selectedYears = IPCCDataExportTimeSeries.CLIMATE_COLUMN_LABEL + - ", " + IPCCDataExportTimeSeries.SOIL_COLUMN_LABEL + - ", " + IPCCDataExportTimeSeries.GEZ_COLUMN_LABEL + ", " ; - for( int year = startYear ; year <= endYear; year++ ) { - selectedYears += IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + ","; - } - String sqlSelect = "select " - + selectedYears - + " sum( " + RegionCalculationUtils.EXPANSION_FACTOR + ")" - + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.SOIL_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.CLIMATE_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.GEZ_TABLE + protected static LUDataPerYear findLuData( LandUseSubdivision initialSubdivision, LandUseSubdivision finalSubdivision, List luData ) { + Collection result = CollectionUtils.select(luData, new Predicate() { + public boolean evaluate(Object a) { + return + ( (LUDataPerYear) a ).getLu().equals(initialSubdivision) + && + ( (LUDataPerYear) a ).getLuNextYear().equals(finalSubdivision); + } + }); + if( result.size() == 1 ) + return (LUDataPerYear) result.toArray(new LUDataPerYear[result.size()])[0]; + else + return new LUDataPerYear(initialSubdivision, finalSubdivision, 0); + + } + + private File createExcel( List matrixData ) throws IOException { + File excelDestination = File.createTempFile("LuMatrixTimeseries", ".xls"); + excelDestination.deleteOnExit(); + // Create a Workbook + try (Workbook workbook = new HSSFWorkbook() ){ + /* CreationHelper helps us create instances of various things like DataFormat, + Hyperlink, RichTextString etc, in a format (HSSF, XSSF) independent way */ + //CreationHelper createHelper = workbook.getCreationHelper(); + + // Create a Font for styling header cells + Font cornerFont = workbook.createFont(); + cornerFont.setBold(true); + cornerFont.setFontHeightInPoints((short) 15); + cornerFont.setColor(IndexedColors.GREY_80_PERCENT.getIndex()); + // Create a CellStyle with the font + CellStyle cornerCellStyle = workbook.createCellStyle(); + cornerCellStyle.setFont(cornerFont); + + // Create a Font for styling header cells + Font headerFont = workbook.createFont(); + headerFont.setBold(true); + headerFont.setFontHeightInPoints((short) 14); + headerFont.setColor(IndexedColors.DARK_TEAL.getIndex()); + // Create a CellStyle with the font + CellStyle headerCellStyle = workbook.createCellStyle(); + headerCellStyle.setFont(headerFont); + + // Create a Font for styling non-diagonal cells + Font stdFont = workbook.createFont(); + stdFont.setBold(false); + stdFont.setFontHeightInPoints((short) 14); + stdFont.setColor(IndexedColors.DARK_RED.getIndex()); + // Create a CellStyle with the font + CellStyle stdCellStyle = workbook.createCellStyle(); + stdCellStyle.setFont(stdFont); + + // Create a Font for styling non-diagonal cells + Font diagonalFont = workbook.createFont(); + diagonalFont.setBold(true); + diagonalFont.setFontHeightInPoints((short) 14); + diagonalFont.setColor(IndexedColors.DARK_GREEN.getIndex()); + // Create a CellStyle with the font + CellStyle diagonalCellStyle = workbook.createCellStyle(); + diagonalCellStyle.setFont(diagonalFont); + + for (MatrixSheet matrix : matrixData) { + // Create a Sheet + Sheet sheet = workbook.createSheet("LU Matrix " + matrix.getYearData().getYear() + "-" + (matrix.getYearData().getYear()+1 ) ); - + " where " - + IPCCDataExportTimeSeries.SOIL_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.SOIL_COLUMN_ID - + " and " - + IPCCDataExportTimeSeries.CLIMATE_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_ID - + " and " - + IPCCDataExportTimeSeries.GEZ_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.GEZ_COLUMN_ID + // Create a Row + Row headerRow = sheet.createRow(0); + Cell cell = headerRow.createCell(0); + cell.setCellValue( "Transition " + matrix.getYearData().getYear() + "/" + ( matrix.getYearData().getYear() +1 ) ); + cell.setCellStyle(cornerCellStyle); - + " GROUP BY " - + selectedYears.substring(0, selectedYears.length()-1) - + " ORDER BY sum( "+ RegionCalculationUtils.EXPANSION_FACTOR + " ) DESC"; // Remove trailing comma from list of years - - - List luData = getJdbcTemplate().query( - sqlSelect - , - getRowMapper() - ); + int i = 1; + for (LandUseSubdivision subdivision : matrix.getSubdivisions()) { + cell = headerRow.createCell(i++); + cell.setCellValue(subdivision.toString()); + cell.setCellStyle(headerCellStyle); + } + + + int rowNum = 1; + int colNum = 0; + for (LandUseSubdivision subdivisionH : matrix.getSubdivisions()) { + colNum = 0; + Row row = sheet.createRow(rowNum++); + + Cell columnCell = row.createCell(colNum++); + columnCell.setCellStyle(headerCellStyle); + columnCell.setCellValue(subdivisionH.toString()); - selectedYears= LAND_UNIT_ID + "," + selectedYears; // Add the Land Unit ID which is basically the row number - selectedYears+= "area"; // so the area columns appears too - luData.add( 0, selectedYears.split(",") ); // Add the header row for the CSV output in the first position of the List - return luData; + colNum = 1; + for (LandUseSubdivision subdivisionV : matrix.getSubdivisions()) { + + cell = row.createCell(colNum++); + cell.setCellValue( findLuData( subdivisionH, subdivisionV, matrix.getYearData().getLuData() ).getAreaHa() ); + if( subdivisionH.equals( subdivisionV ) ) { + cell.setCellStyle(diagonalCellStyle); + }else { + cell.setCellStyle(stdCellStyle); + } + } + + } + + // Resize all columns to fit the content size + for(int j = 0; j < colNum; j++) { + sheet.autoSizeColumn(j); + } + + } + + // Write the output to a file + try( FileOutputStream fileOut = new FileOutputStream(excelDestination) ){ + workbook.write(fileOut); + } catch (IOException e) { + logger.error("Error generating Excel file", e); + } + } catch (Exception e) { + logger.error("Error generating Excel data", e); + } + return excelDestination; } } From 4ec855369f7b1ad91a7249de795ec4df7de87b1a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:55 +0100 Subject: [PATCH 1380/1620] New translations IPCCDataExportMatrixExcel.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 249 ++++++++++++++---- 1 file changed, 196 insertions(+), 53 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 1c57311278..1230b9a5c0 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,91 +1,234 @@ package org.openforis.collect.earth.ipcc; import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; import java.util.List; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections.Predicate; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.Font; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.RDBConnector; import org.openforis.collect.earth.app.service.RegionCalculationUtils; +import org.openforis.collect.earth.app.service.SchemaService; +import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Component; +import liquibase.pro.packaged.E; + @Component -public class IPCCDataExportLandUnitsCSV extends IPCCDataExportCSV { +public class IPCCDataExportMatrixExcel extends RDBConnector { private String schemaName; - - Logger logger = LoggerFactory.getLogger(IPCCDataExportLandUnitsCSV.class); - private final static String LAND_UNIT_ID = "land_unit_id"; + Logger logger = LoggerFactory.getLogger(IPCCDataExportMatrixExcel.class); + + @Autowired + private SchemaService schemaService; - public IPCCDataExportLandUnitsCSV() { - super(); + public IPCCDataExportMatrixExcel() { setExportTypeUsed(ExportType.IPCC); } public File generateTimeseriesData( int startYear, int endYear ) throws IOException { schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - List luCombinations = generateLUCombinations(startYear, endYear); - return createCsv( luCombinations); + + List matrixSheets = new ArrayList(); + + for (int year = startYear; year < endYear; year++) { + MatrixSheet yearMatrixData = generateLUMatrixForYear(year); + if (yearMatrixData != null) + matrixSheets.add(yearMatrixData); + } + + return createExcel( matrixSheets); + } + + + private MatrixSheet generateLUMatrixForYear(int year) { + + List luData = getJdbcTemplate().query( + "select " + + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " + + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1) + "," + + "sum( " + RegionCalculationUtils.EXPANSION_FACTOR + ")" + + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE + + " GROUP BY " + + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + "," + + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1), + getRowMapper() + ); + + if (luData.size() == 0) { // No LU data for the climate, soil, gez combination + return null; + } + + YearData yearData = new YearData(year, luData); + + return new MatrixSheet( yearData ); } - @Override - protected RowMapper getRowMapper() { - return new RowMapper() { + + protected RowMapper getRowMapper() { + return new RowMapper() { @Override - public String[] mapRow(ResultSet rs, int rowNum) throws SQLException { - int columnCount = rs.getMetaData().getColumnCount(); - columnCount++; // adding an extra column with the row number - String[] columns = new String[ columnCount ]; - columns[0] = "LU_" + String.format("%04d", rs.getRow()) ; - for (int i = 1; i < columnCount; i++) { - columns[i] = rs.getString(i); - } - return columns; + public LUDataPerYear mapRow(ResultSet rs, int rowNum) throws SQLException { + + String categoryInitial = rs.getString(1); + String categoryFinal = rs.getString(2); + String subdivInitial = rs.getString(3); + String subdivFinal = rs.getString(4); + + return new LUDataPerYear( + LandUseSubdivisionUtils.getSubdivision(categoryInitial, subdivInitial), + LandUseSubdivisionUtils.getSubdivision(categoryFinal, subdivFinal), + rs.getDouble(5) // area + ); } }; } - - private List generateLUCombinations(int startYear, int endYear) { - String selectedYears = IPCCDataExportTimeSeries.CLIMATE_COLUMN_LABEL + - ", " + IPCCDataExportTimeSeries.SOIL_COLUMN_LABEL + - ", " + IPCCDataExportTimeSeries.GEZ_COLUMN_LABEL + ", " ; - for( int year = startYear ; year <= endYear; year++ ) { - selectedYears += IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + ","; - } - String sqlSelect = "select " - + selectedYears - + " sum( " + RegionCalculationUtils.EXPANSION_FACTOR + ")" - + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.SOIL_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.CLIMATE_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.GEZ_TABLE + protected static LUDataPerYear findLuData( LandUseSubdivision initialSubdivision, LandUseSubdivision finalSubdivision, List luData ) { + Collection result = CollectionUtils.select(luData, new Predicate() { + public boolean evaluate(Object a) { + return + ( (LUDataPerYear) a ).getLu().equals(initialSubdivision) + && + ( (LUDataPerYear) a ).getLuNextYear().equals(finalSubdivision); + } + }); + if( result.size() == 1 ) + return (LUDataPerYear) result.toArray(new LUDataPerYear[result.size()])[0]; + else + return new LUDataPerYear(initialSubdivision, finalSubdivision, 0); + + } + + private File createExcel( List matrixData ) throws IOException { + File excelDestination = File.createTempFile("LuMatrixTimeseries", ".xls"); + excelDestination.deleteOnExit(); + // Create a Workbook + try (Workbook workbook = new HSSFWorkbook() ){ + /* CreationHelper helps us create instances of various things like DataFormat, + Hyperlink, RichTextString etc, in a format (HSSF, XSSF) independent way */ + //CreationHelper createHelper = workbook.getCreationHelper(); + + // Create a Font for styling header cells + Font cornerFont = workbook.createFont(); + cornerFont.setBold(true); + cornerFont.setFontHeightInPoints((short) 15); + cornerFont.setColor(IndexedColors.GREY_80_PERCENT.getIndex()); + // Create a CellStyle with the font + CellStyle cornerCellStyle = workbook.createCellStyle(); + cornerCellStyle.setFont(cornerFont); + + // Create a Font for styling header cells + Font headerFont = workbook.createFont(); + headerFont.setBold(true); + headerFont.setFontHeightInPoints((short) 14); + headerFont.setColor(IndexedColors.DARK_TEAL.getIndex()); + // Create a CellStyle with the font + CellStyle headerCellStyle = workbook.createCellStyle(); + headerCellStyle.setFont(headerFont); + + // Create a Font for styling non-diagonal cells + Font stdFont = workbook.createFont(); + stdFont.setBold(false); + stdFont.setFontHeightInPoints((short) 14); + stdFont.setColor(IndexedColors.DARK_RED.getIndex()); + // Create a CellStyle with the font + CellStyle stdCellStyle = workbook.createCellStyle(); + stdCellStyle.setFont(stdFont); + + // Create a Font for styling non-diagonal cells + Font diagonalFont = workbook.createFont(); + diagonalFont.setBold(true); + diagonalFont.setFontHeightInPoints((short) 14); + diagonalFont.setColor(IndexedColors.DARK_GREEN.getIndex()); + // Create a CellStyle with the font + CellStyle diagonalCellStyle = workbook.createCellStyle(); + diagonalCellStyle.setFont(diagonalFont); + + for (MatrixSheet matrix : matrixData) { + // Create a Sheet + Sheet sheet = workbook.createSheet("LU Matrix " + matrix.getYearData().getYear() + "-" + (matrix.getYearData().getYear()+1 ) ); - + " where " - + IPCCDataExportTimeSeries.SOIL_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.SOIL_COLUMN_ID - + " and " - + IPCCDataExportTimeSeries.CLIMATE_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_ID - + " and " - + IPCCDataExportTimeSeries.GEZ_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.GEZ_COLUMN_ID + // Create a Row + Row headerRow = sheet.createRow(0); + Cell cell = headerRow.createCell(0); + cell.setCellValue( "Transition " + matrix.getYearData().getYear() + "/" + ( matrix.getYearData().getYear() +1 ) ); + cell.setCellStyle(cornerCellStyle); - + " GROUP BY " - + selectedYears.substring(0, selectedYears.length()-1) - + " ORDER BY sum( "+ RegionCalculationUtils.EXPANSION_FACTOR + " ) DESC"; // Remove trailing comma from list of years - - - List luData = getJdbcTemplate().query( - sqlSelect - , - getRowMapper() - ); + int i = 1; + for (LandUseSubdivision subdivision : matrix.getSubdivisions()) { + cell = headerRow.createCell(i++); + cell.setCellValue(subdivision.toString()); + cell.setCellStyle(headerCellStyle); + } + + + int rowNum = 1; + int colNum = 0; + for (LandUseSubdivision subdivisionH : matrix.getSubdivisions()) { + colNum = 0; + Row row = sheet.createRow(rowNum++); + + Cell columnCell = row.createCell(colNum++); + columnCell.setCellStyle(headerCellStyle); + columnCell.setCellValue(subdivisionH.toString()); - selectedYears= LAND_UNIT_ID + "," + selectedYears; // Add the Land Unit ID which is basically the row number - selectedYears+= "area"; // so the area columns appears too - luData.add( 0, selectedYears.split(",") ); // Add the header row for the CSV output in the first position of the List - return luData; + colNum = 1; + for (LandUseSubdivision subdivisionV : matrix.getSubdivisions()) { + + cell = row.createCell(colNum++); + cell.setCellValue( findLuData( subdivisionH, subdivisionV, matrix.getYearData().getLuData() ).getAreaHa() ); + if( subdivisionH.equals( subdivisionV ) ) { + cell.setCellStyle(diagonalCellStyle); + }else { + cell.setCellStyle(stdCellStyle); + } + } + + } + + // Resize all columns to fit the content size + for(int j = 0; j < colNum; j++) { + sheet.autoSizeColumn(j); + } + + } + + // Write the output to a file + try( FileOutputStream fileOut = new FileOutputStream(excelDestination) ){ + workbook.write(fileOut); + } catch (IOException e) { + logger.error("Error generating Excel file", e); + } + } catch (Exception e) { + logger.error("Error generating Excel data", e); + } + return excelDestination; } } From 7494de82802383b0536610d6d5dbe55438aa3da9 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:56 +0100 Subject: [PATCH 1381/1620] New translations IPCCDataExportMatrixExcel.java (English) --- .../earth/app/view/Messages_en.properties | 249 ++++++++++++++---- 1 file changed, 196 insertions(+), 53 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 1c57311278..1230b9a5c0 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,91 +1,234 @@ package org.openforis.collect.earth.ipcc; import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; import java.util.List; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections.Predicate; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.Font; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.RDBConnector; import org.openforis.collect.earth.app.service.RegionCalculationUtils; +import org.openforis.collect.earth.app.service.SchemaService; +import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Component; +import liquibase.pro.packaged.E; + @Component -public class IPCCDataExportLandUnitsCSV extends IPCCDataExportCSV { +public class IPCCDataExportMatrixExcel extends RDBConnector { private String schemaName; - - Logger logger = LoggerFactory.getLogger(IPCCDataExportLandUnitsCSV.class); - private final static String LAND_UNIT_ID = "land_unit_id"; + Logger logger = LoggerFactory.getLogger(IPCCDataExportMatrixExcel.class); + + @Autowired + private SchemaService schemaService; - public IPCCDataExportLandUnitsCSV() { - super(); + public IPCCDataExportMatrixExcel() { setExportTypeUsed(ExportType.IPCC); } public File generateTimeseriesData( int startYear, int endYear ) throws IOException { schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - List luCombinations = generateLUCombinations(startYear, endYear); - return createCsv( luCombinations); + + List matrixSheets = new ArrayList(); + + for (int year = startYear; year < endYear; year++) { + MatrixSheet yearMatrixData = generateLUMatrixForYear(year); + if (yearMatrixData != null) + matrixSheets.add(yearMatrixData); + } + + return createExcel( matrixSheets); + } + + + private MatrixSheet generateLUMatrixForYear(int year) { + + List luData = getJdbcTemplate().query( + "select " + + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " + + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1) + "," + + "sum( " + RegionCalculationUtils.EXPANSION_FACTOR + ")" + + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE + + " GROUP BY " + + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + "," + + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1), + getRowMapper() + ); + + if (luData.size() == 0) { // No LU data for the climate, soil, gez combination + return null; + } + + YearData yearData = new YearData(year, luData); + + return new MatrixSheet( yearData ); } - @Override - protected RowMapper getRowMapper() { - return new RowMapper() { + + protected RowMapper getRowMapper() { + return new RowMapper() { @Override - public String[] mapRow(ResultSet rs, int rowNum) throws SQLException { - int columnCount = rs.getMetaData().getColumnCount(); - columnCount++; // adding an extra column with the row number - String[] columns = new String[ columnCount ]; - columns[0] = "LU_" + String.format("%04d", rs.getRow()) ; - for (int i = 1; i < columnCount; i++) { - columns[i] = rs.getString(i); - } - return columns; + public LUDataPerYear mapRow(ResultSet rs, int rowNum) throws SQLException { + + String categoryInitial = rs.getString(1); + String categoryFinal = rs.getString(2); + String subdivInitial = rs.getString(3); + String subdivFinal = rs.getString(4); + + return new LUDataPerYear( + LandUseSubdivisionUtils.getSubdivision(categoryInitial, subdivInitial), + LandUseSubdivisionUtils.getSubdivision(categoryFinal, subdivFinal), + rs.getDouble(5) // area + ); } }; } - - private List generateLUCombinations(int startYear, int endYear) { - String selectedYears = IPCCDataExportTimeSeries.CLIMATE_COLUMN_LABEL + - ", " + IPCCDataExportTimeSeries.SOIL_COLUMN_LABEL + - ", " + IPCCDataExportTimeSeries.GEZ_COLUMN_LABEL + ", " ; - for( int year = startYear ; year <= endYear; year++ ) { - selectedYears += IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + ","; - } - String sqlSelect = "select " - + selectedYears - + " sum( " + RegionCalculationUtils.EXPANSION_FACTOR + ")" - + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.SOIL_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.CLIMATE_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.GEZ_TABLE + protected static LUDataPerYear findLuData( LandUseSubdivision initialSubdivision, LandUseSubdivision finalSubdivision, List luData ) { + Collection result = CollectionUtils.select(luData, new Predicate() { + public boolean evaluate(Object a) { + return + ( (LUDataPerYear) a ).getLu().equals(initialSubdivision) + && + ( (LUDataPerYear) a ).getLuNextYear().equals(finalSubdivision); + } + }); + if( result.size() == 1 ) + return (LUDataPerYear) result.toArray(new LUDataPerYear[result.size()])[0]; + else + return new LUDataPerYear(initialSubdivision, finalSubdivision, 0); + + } + + private File createExcel( List matrixData ) throws IOException { + File excelDestination = File.createTempFile("LuMatrixTimeseries", ".xls"); + excelDestination.deleteOnExit(); + // Create a Workbook + try (Workbook workbook = new HSSFWorkbook() ){ + /* CreationHelper helps us create instances of various things like DataFormat, + Hyperlink, RichTextString etc, in a format (HSSF, XSSF) independent way */ + //CreationHelper createHelper = workbook.getCreationHelper(); + + // Create a Font for styling header cells + Font cornerFont = workbook.createFont(); + cornerFont.setBold(true); + cornerFont.setFontHeightInPoints((short) 15); + cornerFont.setColor(IndexedColors.GREY_80_PERCENT.getIndex()); + // Create a CellStyle with the font + CellStyle cornerCellStyle = workbook.createCellStyle(); + cornerCellStyle.setFont(cornerFont); + + // Create a Font for styling header cells + Font headerFont = workbook.createFont(); + headerFont.setBold(true); + headerFont.setFontHeightInPoints((short) 14); + headerFont.setColor(IndexedColors.DARK_TEAL.getIndex()); + // Create a CellStyle with the font + CellStyle headerCellStyle = workbook.createCellStyle(); + headerCellStyle.setFont(headerFont); + + // Create a Font for styling non-diagonal cells + Font stdFont = workbook.createFont(); + stdFont.setBold(false); + stdFont.setFontHeightInPoints((short) 14); + stdFont.setColor(IndexedColors.DARK_RED.getIndex()); + // Create a CellStyle with the font + CellStyle stdCellStyle = workbook.createCellStyle(); + stdCellStyle.setFont(stdFont); + + // Create a Font for styling non-diagonal cells + Font diagonalFont = workbook.createFont(); + diagonalFont.setBold(true); + diagonalFont.setFontHeightInPoints((short) 14); + diagonalFont.setColor(IndexedColors.DARK_GREEN.getIndex()); + // Create a CellStyle with the font + CellStyle diagonalCellStyle = workbook.createCellStyle(); + diagonalCellStyle.setFont(diagonalFont); + + for (MatrixSheet matrix : matrixData) { + // Create a Sheet + Sheet sheet = workbook.createSheet("LU Matrix " + matrix.getYearData().getYear() + "-" + (matrix.getYearData().getYear()+1 ) ); - + " where " - + IPCCDataExportTimeSeries.SOIL_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.SOIL_COLUMN_ID - + " and " - + IPCCDataExportTimeSeries.CLIMATE_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_ID - + " and " - + IPCCDataExportTimeSeries.GEZ_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.GEZ_COLUMN_ID + // Create a Row + Row headerRow = sheet.createRow(0); + Cell cell = headerRow.createCell(0); + cell.setCellValue( "Transition " + matrix.getYearData().getYear() + "/" + ( matrix.getYearData().getYear() +1 ) ); + cell.setCellStyle(cornerCellStyle); - + " GROUP BY " - + selectedYears.substring(0, selectedYears.length()-1) - + " ORDER BY sum( "+ RegionCalculationUtils.EXPANSION_FACTOR + " ) DESC"; // Remove trailing comma from list of years - - - List luData = getJdbcTemplate().query( - sqlSelect - , - getRowMapper() - ); + int i = 1; + for (LandUseSubdivision subdivision : matrix.getSubdivisions()) { + cell = headerRow.createCell(i++); + cell.setCellValue(subdivision.toString()); + cell.setCellStyle(headerCellStyle); + } + + + int rowNum = 1; + int colNum = 0; + for (LandUseSubdivision subdivisionH : matrix.getSubdivisions()) { + colNum = 0; + Row row = sheet.createRow(rowNum++); + + Cell columnCell = row.createCell(colNum++); + columnCell.setCellStyle(headerCellStyle); + columnCell.setCellValue(subdivisionH.toString()); - selectedYears= LAND_UNIT_ID + "," + selectedYears; // Add the Land Unit ID which is basically the row number - selectedYears+= "area"; // so the area columns appears too - luData.add( 0, selectedYears.split(",") ); // Add the header row for the CSV output in the first position of the List - return luData; + colNum = 1; + for (LandUseSubdivision subdivisionV : matrix.getSubdivisions()) { + + cell = row.createCell(colNum++); + cell.setCellValue( findLuData( subdivisionH, subdivisionV, matrix.getYearData().getLuData() ).getAreaHa() ); + if( subdivisionH.equals( subdivisionV ) ) { + cell.setCellStyle(diagonalCellStyle); + }else { + cell.setCellStyle(stdCellStyle); + } + } + + } + + // Resize all columns to fit the content size + for(int j = 0; j < colNum; j++) { + sheet.autoSizeColumn(j); + } + + } + + // Write the output to a file + try( FileOutputStream fileOut = new FileOutputStream(excelDestination) ){ + workbook.write(fileOut); + } catch (IOException e) { + logger.error("Error generating Excel file", e); + } + } catch (Exception e) { + logger.error("Error generating Excel data", e); + } + return excelDestination; } } From 6c087321a982fde0b2eb7dc5d847b53c7c49d5c8 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:57 +0100 Subject: [PATCH 1382/1620] New translations IPCCDataExportMatrixExtendedExcel.java (French) --- .../earth/app/view/Messages_fr.properties | 271 ++++++++---------- 1 file changed, 123 insertions(+), 148 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 1230b9a5c0..c15098bfaa 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -3,14 +3,9 @@ package org.openforis.collect.earth.ipcc; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; -import java.sql.ResultSet; -import java.sql.SQLException; import java.util.ArrayList; -import java.util.Collection; import java.util.List; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.collections.Predicate; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; @@ -20,119 +15,33 @@ import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.RDBConnector; -import org.openforis.collect.earth.app.service.RegionCalculationUtils; -import org.openforis.collect.earth.app.service.SchemaService; -import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Component; -import liquibase.pro.packaged.E; - @Component -public class IPCCDataExportMatrixExcel extends RDBConnector { - - private String schemaName; - - Logger logger = LoggerFactory.getLogger(IPCCDataExportMatrixExcel.class); +public class IPCCDataExportMatrixExtendedExcel extends IPCCDataExportTimeSeries { - @Autowired - private SchemaService schemaService; + Logger logger = LoggerFactory.getLogger(IPCCDataExportMatrixExtendedExcel.class); - public IPCCDataExportMatrixExcel() { + public IPCCDataExportMatrixExtendedExcel() { + super(); setExportTypeUsed(ExportType.IPCC); } - public File generateTimeseriesData( int startYear, int endYear ) throws IOException { - schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - - List matrixSheets = new ArrayList(); - - for (int year = startYear; year < endYear; year++) { - MatrixSheet yearMatrixData = generateLUMatrixForYear(year); - if (yearMatrixData != null) - matrixSheets.add(yearMatrixData); - } - - return createExcel( matrixSheets); - } - - - private MatrixSheet generateLUMatrixForYear(int year) { - - List luData = getJdbcTemplate().query( - "select " - + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " - + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1) + "," - + "sum( " + RegionCalculationUtils.EXPANSION_FACTOR + ")" - + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE - + " GROUP BY " - + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + "," - + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1), - getRowMapper() - ); - - if (luData.size() == 0) { // No LU data for the climate, soil, gez combination - return null; - } - - YearData yearData = new YearData(year, luData); - - return new MatrixSheet( yearData ); - } - - - protected RowMapper getRowMapper() { - return new RowMapper() { - @Override - public LUDataPerYear mapRow(ResultSet rs, int rowNum) throws SQLException { - - String categoryInitial = rs.getString(1); - String categoryFinal = rs.getString(2); - String subdivInitial = rs.getString(3); - String subdivFinal = rs.getString(4); - - return new LUDataPerYear( - LandUseSubdivisionUtils.getSubdivision(categoryInitial, subdivInitial), - LandUseSubdivisionUtils.getSubdivision(categoryFinal, subdivFinal), - rs.getDouble(5) // area - ); - } - }; - } - - protected static LUDataPerYear findLuData( LandUseSubdivision initialSubdivision, LandUseSubdivision finalSubdivision, List luData ) { - Collection result = CollectionUtils.select(luData, new Predicate() { - public boolean evaluate(Object a) { - return - ( (LUDataPerYear) a ).getLu().equals(initialSubdivision) - && - ( (LUDataPerYear) a ).getLuNextYear().equals(finalSubdivision); - } - }); - if( result.size() == 1 ) - return (LUDataPerYear) result.toArray(new LUDataPerYear[result.size()])[0]; - else - return new LUDataPerYear(initialSubdivision, finalSubdivision, 0); - - } - - private File createExcel( List matrixData ) throws IOException { - File excelDestination = File.createTempFile("LuMatrixTimeseries", ".xls"); + @Override + protected File generateFile(List strataData) throws IOException { + File excelDestination = File.createTempFile("LuMatrixTimeseries_EXTENDED", ".xls"); excelDestination.deleteOnExit(); // Create a Workbook - try (Workbook workbook = new HSSFWorkbook() ){ - /* CreationHelper helps us create instances of various things like DataFormat, - Hyperlink, RichTextString etc, in a format (HSSF, XSSF) independent way */ - //CreationHelper createHelper = workbook.getCreationHelper(); + try(Workbook workbook = new HSSFWorkbook() ) {// new HSSFWorkbook() for generating `.xls` file + + /* + * CreationHelper helps us create instances of various things like DataFormat, + * Hyperlink, RichTextString etc, in a format (HSSF, XSSF) independent way + */ + // CreationHelper createHelper = workbook.getCreationHelper(); // Create a Font for styling header cells Font cornerFont = workbook.createFont(); @@ -142,7 +51,7 @@ public class IPCCDataExportMatrixExcel extends RDBConnector { // Create a CellStyle with the font CellStyle cornerCellStyle = workbook.createCellStyle(); cornerCellStyle.setFont(cornerFont); - + // Create a Font for styling header cells Font headerFont = workbook.createFont(); headerFont.setBold(true); @@ -151,7 +60,7 @@ public class IPCCDataExportMatrixExcel extends RDBConnector { // Create a CellStyle with the font CellStyle headerCellStyle = workbook.createCellStyle(); headerCellStyle.setFont(headerFont); - + // Create a Font for styling non-diagonal cells Font stdFont = workbook.createFont(); stdFont.setBold(false); @@ -160,8 +69,8 @@ public class IPCCDataExportMatrixExcel extends RDBConnector { // Create a CellStyle with the font CellStyle stdCellStyle = workbook.createCellStyle(); stdCellStyle.setFont(stdFont); - - // Create a Font for styling non-diagonal cells + + // Create a Font for styling diagonal cells Font diagonalFont = workbook.createFont(); diagonalFont.setBold(true); diagonalFont.setFontHeightInPoints((short) 14); @@ -169,58 +78,124 @@ public class IPCCDataExportMatrixExcel extends RDBConnector { // Create a CellStyle with the font CellStyle diagonalCellStyle = workbook.createCellStyle(); diagonalCellStyle.setFont(diagonalFont); + + // Create a Font for styling diagonal cells + Font strataFont = workbook.createFont(); + strataFont.setBold(true); + strataFont.setFontHeightInPoints((short) 16); + strataFont.setColor(IndexedColors.BLUE.getIndex()); + // Create a CellStyle with the font + CellStyle strataCellStyle = workbook.createCellStyle(); + strataCellStyle.setFont(strataFont); - for (MatrixSheet matrix : matrixData) { + List availableYears = new ArrayList(); + for (StratumPerYearData yearDataStratumP : strataData) { + if (!availableYears.contains(Integer.valueOf(yearDataStratumP.getYear()))) { + availableYears.add(yearDataStratumP.getYear()); + } + } + + for (Integer yearToOutput : availableYears) { + + int rowNum = 0; // Create a Sheet - Sheet sheet = workbook.createSheet("LU Matrix " + matrix.getYearData().getYear() + "-" + (matrix.getYearData().getYear()+1 ) ); - - // Create a Row - Row headerRow = sheet.createRow(0); - Cell cell = headerRow.createCell(0); - cell.setCellValue( "Transition " + matrix.getYearData().getYear() + "/" + ( matrix.getYearData().getYear() +1 ) ); - cell.setCellStyle(cornerCellStyle); - - int i = 1; - for (LandUseSubdivision subdivision : matrix.getSubdivisions()) { - cell = headerRow.createCell(i++); - cell.setCellValue(subdivision.toString()); + Sheet sheet = workbook.createSheet("LU Matrix " + yearToOutput + "-" + (yearToOutput + 1)); + + for (StratumPerYearData yearDataStratum : strataData) { + // Get the stratums for the year + if (yearDataStratum.getYear() != yearToOutput) { + continue; // The stratum contains data for a different year that we are going to output in + // the sheet + } + + + sheet.createRow(rowNum++); // create empty row + + // Create a Row + Row infoRow = sheet.createRow(rowNum++); + Cell cell = infoRow.createCell(0); cell.setCellStyle(headerCellStyle); - } + cell.setCellValue("Climate"); + cell = infoRow.createCell(1); + cell.setCellStyle(strataCellStyle); + cell.setCellValue(yearDataStratum.getClimate()); + + infoRow = sheet.createRow(rowNum++); + cell = infoRow.createCell(0); + cell.setCellStyle(headerCellStyle); + cell.setCellValue("Soil"); + cell = infoRow.createCell(1); + cell.setCellStyle(strataCellStyle); + cell.setCellValue(yearDataStratum.getSoil()); + + infoRow = sheet.createRow(rowNum++); + cell = infoRow.createCell(0); + cell.setCellStyle(headerCellStyle); + cell.setCellValue("Global Ecological Zone (GEZ)"); + cell = infoRow.createCell(1); + cell.setCellStyle(strataCellStyle); + cell.setCellValue(yearDataStratum.getGez()); + + // Add some empty rows before next section + sheet.createRow(rowNum++); + + // Create a Row + Row headerRow = sheet.createRow(rowNum++); + cell = headerRow.createCell(0); + cell.setCellValue( + "Transition " + yearDataStratum.getYear() + "/" + (yearDataStratum.getYear() + 1)); + cell.setCellStyle(cornerCellStyle); + + MatrixSheet matrix = new MatrixSheet(yearDataStratum); + int cellPosition = 1; + for (LandUseSubdivision subdivision : matrix.getSubdivisions()) { + cell = headerRow.createCell(cellPosition++); + cell.setCellValue(subdivision.toString()); + cell.setCellStyle(headerCellStyle); + } - - int rowNum = 1; - int colNum = 0; - for (LandUseSubdivision subdivisionH : matrix.getSubdivisions()) { - colNum = 0; - Row row = sheet.createRow(rowNum++); - - Cell columnCell = row.createCell(colNum++); - columnCell.setCellStyle(headerCellStyle); - columnCell.setCellValue(subdivisionH.toString()); - - colNum = 1; - for (LandUseSubdivision subdivisionV : matrix.getSubdivisions()) { - - cell = row.createCell(colNum++); - cell.setCellValue( findLuData( subdivisionH, subdivisionV, matrix.getYearData().getLuData() ).getAreaHa() ); - if( subdivisionH.equals( subdivisionV ) ) { - cell.setCellStyle(diagonalCellStyle); - }else { - cell.setCellStyle(stdCellStyle); + int colNum = 0; + for (LandUseSubdivision subdivisionH : matrix.getSubdivisions()) { + colNum = 0; + Row row = sheet.createRow(rowNum++); + + Cell columnCell = row.createCell(colNum++); + columnCell.setCellStyle(headerCellStyle); + columnCell.setCellValue(subdivisionH.toString()); + + colNum = 1; + for (LandUseSubdivision subdivisionV : matrix.getSubdivisions()) { + + cell = row.createCell(colNum++); + cell.setCellValue(IPCCDataExportMatrixExcel + .findLuData(subdivisionH, subdivisionV, matrix.getYearData().getLuData()) + .getAreaHa()); + if (subdivisionH.equals(subdivisionV)) { + cell.setCellStyle(diagonalCellStyle); + } else { + cell.setCellStyle(stdCellStyle); + } } + } + + // Add some empty rows before next section + sheet.createRow(rowNum++); + sheet.createRow(rowNum++); + sheet.createRow(rowNum++); - } - // Resize all columns to fit the content size - for(int j = 0; j < colNum; j++) { - sheet.autoSizeColumn(j); + // Resize all columns to fit the content size + for (int j = 0; j < colNum; j++) { + sheet.autoSizeColumn(j); + } + } } // Write the output to a file - try( FileOutputStream fileOut = new FileOutputStream(excelDestination) ){ + try (FileOutputStream fileOut = new FileOutputStream(excelDestination)) { workbook.write(fileOut); } catch (IOException e) { logger.error("Error generating Excel file", e); From 91b64f523f42bfd8f2a9303c3a5d667b21fc345d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:47:59 +0100 Subject: [PATCH 1383/1620] New translations IPCCDataExportMatrixExtendedExcel.java (Spanish) --- .../earth/app/view/Messages_es.properties | 271 ++++++++---------- 1 file changed, 123 insertions(+), 148 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 1230b9a5c0..c15098bfaa 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -3,14 +3,9 @@ package org.openforis.collect.earth.ipcc; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; -import java.sql.ResultSet; -import java.sql.SQLException; import java.util.ArrayList; -import java.util.Collection; import java.util.List; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.collections.Predicate; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; @@ -20,119 +15,33 @@ import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.RDBConnector; -import org.openforis.collect.earth.app.service.RegionCalculationUtils; -import org.openforis.collect.earth.app.service.SchemaService; -import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Component; -import liquibase.pro.packaged.E; - @Component -public class IPCCDataExportMatrixExcel extends RDBConnector { - - private String schemaName; - - Logger logger = LoggerFactory.getLogger(IPCCDataExportMatrixExcel.class); +public class IPCCDataExportMatrixExtendedExcel extends IPCCDataExportTimeSeries { - @Autowired - private SchemaService schemaService; + Logger logger = LoggerFactory.getLogger(IPCCDataExportMatrixExtendedExcel.class); - public IPCCDataExportMatrixExcel() { + public IPCCDataExportMatrixExtendedExcel() { + super(); setExportTypeUsed(ExportType.IPCC); } - public File generateTimeseriesData( int startYear, int endYear ) throws IOException { - schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - - List matrixSheets = new ArrayList(); - - for (int year = startYear; year < endYear; year++) { - MatrixSheet yearMatrixData = generateLUMatrixForYear(year); - if (yearMatrixData != null) - matrixSheets.add(yearMatrixData); - } - - return createExcel( matrixSheets); - } - - - private MatrixSheet generateLUMatrixForYear(int year) { - - List luData = getJdbcTemplate().query( - "select " - + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " - + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1) + "," - + "sum( " + RegionCalculationUtils.EXPANSION_FACTOR + ")" - + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE - + " GROUP BY " - + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + "," - + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1), - getRowMapper() - ); - - if (luData.size() == 0) { // No LU data for the climate, soil, gez combination - return null; - } - - YearData yearData = new YearData(year, luData); - - return new MatrixSheet( yearData ); - } - - - protected RowMapper getRowMapper() { - return new RowMapper() { - @Override - public LUDataPerYear mapRow(ResultSet rs, int rowNum) throws SQLException { - - String categoryInitial = rs.getString(1); - String categoryFinal = rs.getString(2); - String subdivInitial = rs.getString(3); - String subdivFinal = rs.getString(4); - - return new LUDataPerYear( - LandUseSubdivisionUtils.getSubdivision(categoryInitial, subdivInitial), - LandUseSubdivisionUtils.getSubdivision(categoryFinal, subdivFinal), - rs.getDouble(5) // area - ); - } - }; - } - - protected static LUDataPerYear findLuData( LandUseSubdivision initialSubdivision, LandUseSubdivision finalSubdivision, List luData ) { - Collection result = CollectionUtils.select(luData, new Predicate() { - public boolean evaluate(Object a) { - return - ( (LUDataPerYear) a ).getLu().equals(initialSubdivision) - && - ( (LUDataPerYear) a ).getLuNextYear().equals(finalSubdivision); - } - }); - if( result.size() == 1 ) - return (LUDataPerYear) result.toArray(new LUDataPerYear[result.size()])[0]; - else - return new LUDataPerYear(initialSubdivision, finalSubdivision, 0); - - } - - private File createExcel( List matrixData ) throws IOException { - File excelDestination = File.createTempFile("LuMatrixTimeseries", ".xls"); + @Override + protected File generateFile(List strataData) throws IOException { + File excelDestination = File.createTempFile("LuMatrixTimeseries_EXTENDED", ".xls"); excelDestination.deleteOnExit(); // Create a Workbook - try (Workbook workbook = new HSSFWorkbook() ){ - /* CreationHelper helps us create instances of various things like DataFormat, - Hyperlink, RichTextString etc, in a format (HSSF, XSSF) independent way */ - //CreationHelper createHelper = workbook.getCreationHelper(); + try(Workbook workbook = new HSSFWorkbook() ) {// new HSSFWorkbook() for generating `.xls` file + + /* + * CreationHelper helps us create instances of various things like DataFormat, + * Hyperlink, RichTextString etc, in a format (HSSF, XSSF) independent way + */ + // CreationHelper createHelper = workbook.getCreationHelper(); // Create a Font for styling header cells Font cornerFont = workbook.createFont(); @@ -142,7 +51,7 @@ public class IPCCDataExportMatrixExcel extends RDBConnector { // Create a CellStyle with the font CellStyle cornerCellStyle = workbook.createCellStyle(); cornerCellStyle.setFont(cornerFont); - + // Create a Font for styling header cells Font headerFont = workbook.createFont(); headerFont.setBold(true); @@ -151,7 +60,7 @@ public class IPCCDataExportMatrixExcel extends RDBConnector { // Create a CellStyle with the font CellStyle headerCellStyle = workbook.createCellStyle(); headerCellStyle.setFont(headerFont); - + // Create a Font for styling non-diagonal cells Font stdFont = workbook.createFont(); stdFont.setBold(false); @@ -160,8 +69,8 @@ public class IPCCDataExportMatrixExcel extends RDBConnector { // Create a CellStyle with the font CellStyle stdCellStyle = workbook.createCellStyle(); stdCellStyle.setFont(stdFont); - - // Create a Font for styling non-diagonal cells + + // Create a Font for styling diagonal cells Font diagonalFont = workbook.createFont(); diagonalFont.setBold(true); diagonalFont.setFontHeightInPoints((short) 14); @@ -169,58 +78,124 @@ public class IPCCDataExportMatrixExcel extends RDBConnector { // Create a CellStyle with the font CellStyle diagonalCellStyle = workbook.createCellStyle(); diagonalCellStyle.setFont(diagonalFont); + + // Create a Font for styling diagonal cells + Font strataFont = workbook.createFont(); + strataFont.setBold(true); + strataFont.setFontHeightInPoints((short) 16); + strataFont.setColor(IndexedColors.BLUE.getIndex()); + // Create a CellStyle with the font + CellStyle strataCellStyle = workbook.createCellStyle(); + strataCellStyle.setFont(strataFont); - for (MatrixSheet matrix : matrixData) { + List availableYears = new ArrayList(); + for (StratumPerYearData yearDataStratumP : strataData) { + if (!availableYears.contains(Integer.valueOf(yearDataStratumP.getYear()))) { + availableYears.add(yearDataStratumP.getYear()); + } + } + + for (Integer yearToOutput : availableYears) { + + int rowNum = 0; // Create a Sheet - Sheet sheet = workbook.createSheet("LU Matrix " + matrix.getYearData().getYear() + "-" + (matrix.getYearData().getYear()+1 ) ); - - // Create a Row - Row headerRow = sheet.createRow(0); - Cell cell = headerRow.createCell(0); - cell.setCellValue( "Transition " + matrix.getYearData().getYear() + "/" + ( matrix.getYearData().getYear() +1 ) ); - cell.setCellStyle(cornerCellStyle); - - int i = 1; - for (LandUseSubdivision subdivision : matrix.getSubdivisions()) { - cell = headerRow.createCell(i++); - cell.setCellValue(subdivision.toString()); + Sheet sheet = workbook.createSheet("LU Matrix " + yearToOutput + "-" + (yearToOutput + 1)); + + for (StratumPerYearData yearDataStratum : strataData) { + // Get the stratums for the year + if (yearDataStratum.getYear() != yearToOutput) { + continue; // The stratum contains data for a different year that we are going to output in + // the sheet + } + + + sheet.createRow(rowNum++); // create empty row + + // Create a Row + Row infoRow = sheet.createRow(rowNum++); + Cell cell = infoRow.createCell(0); cell.setCellStyle(headerCellStyle); - } + cell.setCellValue("Climate"); + cell = infoRow.createCell(1); + cell.setCellStyle(strataCellStyle); + cell.setCellValue(yearDataStratum.getClimate()); + + infoRow = sheet.createRow(rowNum++); + cell = infoRow.createCell(0); + cell.setCellStyle(headerCellStyle); + cell.setCellValue("Soil"); + cell = infoRow.createCell(1); + cell.setCellStyle(strataCellStyle); + cell.setCellValue(yearDataStratum.getSoil()); + + infoRow = sheet.createRow(rowNum++); + cell = infoRow.createCell(0); + cell.setCellStyle(headerCellStyle); + cell.setCellValue("Global Ecological Zone (GEZ)"); + cell = infoRow.createCell(1); + cell.setCellStyle(strataCellStyle); + cell.setCellValue(yearDataStratum.getGez()); + + // Add some empty rows before next section + sheet.createRow(rowNum++); + + // Create a Row + Row headerRow = sheet.createRow(rowNum++); + cell = headerRow.createCell(0); + cell.setCellValue( + "Transition " + yearDataStratum.getYear() + "/" + (yearDataStratum.getYear() + 1)); + cell.setCellStyle(cornerCellStyle); + + MatrixSheet matrix = new MatrixSheet(yearDataStratum); + int cellPosition = 1; + for (LandUseSubdivision subdivision : matrix.getSubdivisions()) { + cell = headerRow.createCell(cellPosition++); + cell.setCellValue(subdivision.toString()); + cell.setCellStyle(headerCellStyle); + } - - int rowNum = 1; - int colNum = 0; - for (LandUseSubdivision subdivisionH : matrix.getSubdivisions()) { - colNum = 0; - Row row = sheet.createRow(rowNum++); - - Cell columnCell = row.createCell(colNum++); - columnCell.setCellStyle(headerCellStyle); - columnCell.setCellValue(subdivisionH.toString()); - - colNum = 1; - for (LandUseSubdivision subdivisionV : matrix.getSubdivisions()) { - - cell = row.createCell(colNum++); - cell.setCellValue( findLuData( subdivisionH, subdivisionV, matrix.getYearData().getLuData() ).getAreaHa() ); - if( subdivisionH.equals( subdivisionV ) ) { - cell.setCellStyle(diagonalCellStyle); - }else { - cell.setCellStyle(stdCellStyle); + int colNum = 0; + for (LandUseSubdivision subdivisionH : matrix.getSubdivisions()) { + colNum = 0; + Row row = sheet.createRow(rowNum++); + + Cell columnCell = row.createCell(colNum++); + columnCell.setCellStyle(headerCellStyle); + columnCell.setCellValue(subdivisionH.toString()); + + colNum = 1; + for (LandUseSubdivision subdivisionV : matrix.getSubdivisions()) { + + cell = row.createCell(colNum++); + cell.setCellValue(IPCCDataExportMatrixExcel + .findLuData(subdivisionH, subdivisionV, matrix.getYearData().getLuData()) + .getAreaHa()); + if (subdivisionH.equals(subdivisionV)) { + cell.setCellStyle(diagonalCellStyle); + } else { + cell.setCellStyle(stdCellStyle); + } } + } + + // Add some empty rows before next section + sheet.createRow(rowNum++); + sheet.createRow(rowNum++); + sheet.createRow(rowNum++); - } - // Resize all columns to fit the content size - for(int j = 0; j < colNum; j++) { - sheet.autoSizeColumn(j); + // Resize all columns to fit the content size + for (int j = 0; j < colNum; j++) { + sheet.autoSizeColumn(j); + } + } } // Write the output to a file - try( FileOutputStream fileOut = new FileOutputStream(excelDestination) ){ + try (FileOutputStream fileOut = new FileOutputStream(excelDestination)) { workbook.write(fileOut); } catch (IOException e) { logger.error("Error generating Excel file", e); From 35c5fb13dd804d5675d09c232e6c8c8afb715888 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:00 +0100 Subject: [PATCH 1384/1620] New translations IPCCDataExportMatrixExtendedExcel.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 271 ++++++++---------- 1 file changed, 123 insertions(+), 148 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 1230b9a5c0..c15098bfaa 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -3,14 +3,9 @@ package org.openforis.collect.earth.ipcc; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; -import java.sql.ResultSet; -import java.sql.SQLException; import java.util.ArrayList; -import java.util.Collection; import java.util.List; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.collections.Predicate; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; @@ -20,119 +15,33 @@ import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.RDBConnector; -import org.openforis.collect.earth.app.service.RegionCalculationUtils; -import org.openforis.collect.earth.app.service.SchemaService; -import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Component; -import liquibase.pro.packaged.E; - @Component -public class IPCCDataExportMatrixExcel extends RDBConnector { - - private String schemaName; - - Logger logger = LoggerFactory.getLogger(IPCCDataExportMatrixExcel.class); +public class IPCCDataExportMatrixExtendedExcel extends IPCCDataExportTimeSeries { - @Autowired - private SchemaService schemaService; + Logger logger = LoggerFactory.getLogger(IPCCDataExportMatrixExtendedExcel.class); - public IPCCDataExportMatrixExcel() { + public IPCCDataExportMatrixExtendedExcel() { + super(); setExportTypeUsed(ExportType.IPCC); } - public File generateTimeseriesData( int startYear, int endYear ) throws IOException { - schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - - List matrixSheets = new ArrayList(); - - for (int year = startYear; year < endYear; year++) { - MatrixSheet yearMatrixData = generateLUMatrixForYear(year); - if (yearMatrixData != null) - matrixSheets.add(yearMatrixData); - } - - return createExcel( matrixSheets); - } - - - private MatrixSheet generateLUMatrixForYear(int year) { - - List luData = getJdbcTemplate().query( - "select " - + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " - + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1) + "," - + "sum( " + RegionCalculationUtils.EXPANSION_FACTOR + ")" - + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE - + " GROUP BY " - + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + "," - + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1), - getRowMapper() - ); - - if (luData.size() == 0) { // No LU data for the climate, soil, gez combination - return null; - } - - YearData yearData = new YearData(year, luData); - - return new MatrixSheet( yearData ); - } - - - protected RowMapper getRowMapper() { - return new RowMapper() { - @Override - public LUDataPerYear mapRow(ResultSet rs, int rowNum) throws SQLException { - - String categoryInitial = rs.getString(1); - String categoryFinal = rs.getString(2); - String subdivInitial = rs.getString(3); - String subdivFinal = rs.getString(4); - - return new LUDataPerYear( - LandUseSubdivisionUtils.getSubdivision(categoryInitial, subdivInitial), - LandUseSubdivisionUtils.getSubdivision(categoryFinal, subdivFinal), - rs.getDouble(5) // area - ); - } - }; - } - - protected static LUDataPerYear findLuData( LandUseSubdivision initialSubdivision, LandUseSubdivision finalSubdivision, List luData ) { - Collection result = CollectionUtils.select(luData, new Predicate() { - public boolean evaluate(Object a) { - return - ( (LUDataPerYear) a ).getLu().equals(initialSubdivision) - && - ( (LUDataPerYear) a ).getLuNextYear().equals(finalSubdivision); - } - }); - if( result.size() == 1 ) - return (LUDataPerYear) result.toArray(new LUDataPerYear[result.size()])[0]; - else - return new LUDataPerYear(initialSubdivision, finalSubdivision, 0); - - } - - private File createExcel( List matrixData ) throws IOException { - File excelDestination = File.createTempFile("LuMatrixTimeseries", ".xls"); + @Override + protected File generateFile(List strataData) throws IOException { + File excelDestination = File.createTempFile("LuMatrixTimeseries_EXTENDED", ".xls"); excelDestination.deleteOnExit(); // Create a Workbook - try (Workbook workbook = new HSSFWorkbook() ){ - /* CreationHelper helps us create instances of various things like DataFormat, - Hyperlink, RichTextString etc, in a format (HSSF, XSSF) independent way */ - //CreationHelper createHelper = workbook.getCreationHelper(); + try(Workbook workbook = new HSSFWorkbook() ) {// new HSSFWorkbook() for generating `.xls` file + + /* + * CreationHelper helps us create instances of various things like DataFormat, + * Hyperlink, RichTextString etc, in a format (HSSF, XSSF) independent way + */ + // CreationHelper createHelper = workbook.getCreationHelper(); // Create a Font for styling header cells Font cornerFont = workbook.createFont(); @@ -142,7 +51,7 @@ public class IPCCDataExportMatrixExcel extends RDBConnector { // Create a CellStyle with the font CellStyle cornerCellStyle = workbook.createCellStyle(); cornerCellStyle.setFont(cornerFont); - + // Create a Font for styling header cells Font headerFont = workbook.createFont(); headerFont.setBold(true); @@ -151,7 +60,7 @@ public class IPCCDataExportMatrixExcel extends RDBConnector { // Create a CellStyle with the font CellStyle headerCellStyle = workbook.createCellStyle(); headerCellStyle.setFont(headerFont); - + // Create a Font for styling non-diagonal cells Font stdFont = workbook.createFont(); stdFont.setBold(false); @@ -160,8 +69,8 @@ public class IPCCDataExportMatrixExcel extends RDBConnector { // Create a CellStyle with the font CellStyle stdCellStyle = workbook.createCellStyle(); stdCellStyle.setFont(stdFont); - - // Create a Font for styling non-diagonal cells + + // Create a Font for styling diagonal cells Font diagonalFont = workbook.createFont(); diagonalFont.setBold(true); diagonalFont.setFontHeightInPoints((short) 14); @@ -169,58 +78,124 @@ public class IPCCDataExportMatrixExcel extends RDBConnector { // Create a CellStyle with the font CellStyle diagonalCellStyle = workbook.createCellStyle(); diagonalCellStyle.setFont(diagonalFont); + + // Create a Font for styling diagonal cells + Font strataFont = workbook.createFont(); + strataFont.setBold(true); + strataFont.setFontHeightInPoints((short) 16); + strataFont.setColor(IndexedColors.BLUE.getIndex()); + // Create a CellStyle with the font + CellStyle strataCellStyle = workbook.createCellStyle(); + strataCellStyle.setFont(strataFont); - for (MatrixSheet matrix : matrixData) { + List availableYears = new ArrayList(); + for (StratumPerYearData yearDataStratumP : strataData) { + if (!availableYears.contains(Integer.valueOf(yearDataStratumP.getYear()))) { + availableYears.add(yearDataStratumP.getYear()); + } + } + + for (Integer yearToOutput : availableYears) { + + int rowNum = 0; // Create a Sheet - Sheet sheet = workbook.createSheet("LU Matrix " + matrix.getYearData().getYear() + "-" + (matrix.getYearData().getYear()+1 ) ); - - // Create a Row - Row headerRow = sheet.createRow(0); - Cell cell = headerRow.createCell(0); - cell.setCellValue( "Transition " + matrix.getYearData().getYear() + "/" + ( matrix.getYearData().getYear() +1 ) ); - cell.setCellStyle(cornerCellStyle); - - int i = 1; - for (LandUseSubdivision subdivision : matrix.getSubdivisions()) { - cell = headerRow.createCell(i++); - cell.setCellValue(subdivision.toString()); + Sheet sheet = workbook.createSheet("LU Matrix " + yearToOutput + "-" + (yearToOutput + 1)); + + for (StratumPerYearData yearDataStratum : strataData) { + // Get the stratums for the year + if (yearDataStratum.getYear() != yearToOutput) { + continue; // The stratum contains data for a different year that we are going to output in + // the sheet + } + + + sheet.createRow(rowNum++); // create empty row + + // Create a Row + Row infoRow = sheet.createRow(rowNum++); + Cell cell = infoRow.createCell(0); cell.setCellStyle(headerCellStyle); - } + cell.setCellValue("Climate"); + cell = infoRow.createCell(1); + cell.setCellStyle(strataCellStyle); + cell.setCellValue(yearDataStratum.getClimate()); + + infoRow = sheet.createRow(rowNum++); + cell = infoRow.createCell(0); + cell.setCellStyle(headerCellStyle); + cell.setCellValue("Soil"); + cell = infoRow.createCell(1); + cell.setCellStyle(strataCellStyle); + cell.setCellValue(yearDataStratum.getSoil()); + + infoRow = sheet.createRow(rowNum++); + cell = infoRow.createCell(0); + cell.setCellStyle(headerCellStyle); + cell.setCellValue("Global Ecological Zone (GEZ)"); + cell = infoRow.createCell(1); + cell.setCellStyle(strataCellStyle); + cell.setCellValue(yearDataStratum.getGez()); + + // Add some empty rows before next section + sheet.createRow(rowNum++); + + // Create a Row + Row headerRow = sheet.createRow(rowNum++); + cell = headerRow.createCell(0); + cell.setCellValue( + "Transition " + yearDataStratum.getYear() + "/" + (yearDataStratum.getYear() + 1)); + cell.setCellStyle(cornerCellStyle); + + MatrixSheet matrix = new MatrixSheet(yearDataStratum); + int cellPosition = 1; + for (LandUseSubdivision subdivision : matrix.getSubdivisions()) { + cell = headerRow.createCell(cellPosition++); + cell.setCellValue(subdivision.toString()); + cell.setCellStyle(headerCellStyle); + } - - int rowNum = 1; - int colNum = 0; - for (LandUseSubdivision subdivisionH : matrix.getSubdivisions()) { - colNum = 0; - Row row = sheet.createRow(rowNum++); - - Cell columnCell = row.createCell(colNum++); - columnCell.setCellStyle(headerCellStyle); - columnCell.setCellValue(subdivisionH.toString()); - - colNum = 1; - for (LandUseSubdivision subdivisionV : matrix.getSubdivisions()) { - - cell = row.createCell(colNum++); - cell.setCellValue( findLuData( subdivisionH, subdivisionV, matrix.getYearData().getLuData() ).getAreaHa() ); - if( subdivisionH.equals( subdivisionV ) ) { - cell.setCellStyle(diagonalCellStyle); - }else { - cell.setCellStyle(stdCellStyle); + int colNum = 0; + for (LandUseSubdivision subdivisionH : matrix.getSubdivisions()) { + colNum = 0; + Row row = sheet.createRow(rowNum++); + + Cell columnCell = row.createCell(colNum++); + columnCell.setCellStyle(headerCellStyle); + columnCell.setCellValue(subdivisionH.toString()); + + colNum = 1; + for (LandUseSubdivision subdivisionV : matrix.getSubdivisions()) { + + cell = row.createCell(colNum++); + cell.setCellValue(IPCCDataExportMatrixExcel + .findLuData(subdivisionH, subdivisionV, matrix.getYearData().getLuData()) + .getAreaHa()); + if (subdivisionH.equals(subdivisionV)) { + cell.setCellStyle(diagonalCellStyle); + } else { + cell.setCellStyle(stdCellStyle); + } } + } + + // Add some empty rows before next section + sheet.createRow(rowNum++); + sheet.createRow(rowNum++); + sheet.createRow(rowNum++); - } - // Resize all columns to fit the content size - for(int j = 0; j < colNum; j++) { - sheet.autoSizeColumn(j); + // Resize all columns to fit the content size + for (int j = 0; j < colNum; j++) { + sheet.autoSizeColumn(j); + } + } } // Write the output to a file - try( FileOutputStream fileOut = new FileOutputStream(excelDestination) ){ + try (FileOutputStream fileOut = new FileOutputStream(excelDestination)) { workbook.write(fileOut); } catch (IOException e) { logger.error("Error generating Excel file", e); From 2801a29c4dece64a8f9f991ed0508be4ff6b5755 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:01 +0100 Subject: [PATCH 1385/1620] New translations WetlandPage.java (Spanish) --- .../earth/app/view/Messages_es.properties | 219 ++---------------- 1 file changed, 24 insertions(+), 195 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index c15098bfaa..b55115af7f 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,209 +1,38 @@ -package org.openforis.collect.earth.ipcc; +package org.openforis.collect.earth.ipcc.view; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import org.openforis.collect.earth.ipcc.model.ManagementType; -import org.apache.poi.hssf.usermodel.HSSFWorkbook; -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.CellStyle; -import org.apache.poi.ss.usermodel.Font; -import org.apache.poi.ss.usermodel.IndexedColors; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.ss.usermodel.Workbook; -import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; +import se.gustavkarlsson.gwiz.AbstractWizardPage; -@Component -public class IPCCDataExportMatrixExtendedExcel extends IPCCDataExportTimeSeries { +public class WetlandPage extends SubdivisionPage { - Logger logger = LoggerFactory.getLogger(IPCCDataExportMatrixExtendedExcel.class); - - public IPCCDataExportMatrixExtendedExcel() { - super(); - setExportTypeUsed(ExportType.IPCC); + private static final long serialVersionUID = 5385335458259411328L; + private AbstractWizardPage nextPage = new OtherlandPage(); + + public WetlandPage() { + super( LandUseCategory.W ); } @Override - protected File generateFile(List strataData) throws IOException { - File excelDestination = File.createTempFile("LuMatrixTimeseries_EXTENDED", ".xls"); - excelDestination.deleteOnExit(); - // Create a Workbook - try(Workbook workbook = new HSSFWorkbook() ) {// new HSSFWorkbook() for generating `.xls` file - - /* - * CreationHelper helps us create instances of various things like DataFormat, - * Hyperlink, RichTextString etc, in a format (HSSF, XSSF) independent way - */ - // CreationHelper createHelper = workbook.getCreationHelper(); - - // Create a Font for styling header cells - Font cornerFont = workbook.createFont(); - cornerFont.setBold(true); - cornerFont.setFontHeightInPoints((short) 15); - cornerFont.setColor(IndexedColors.GREY_80_PERCENT.getIndex()); - // Create a CellStyle with the font - CellStyle cornerCellStyle = workbook.createCellStyle(); - cornerCellStyle.setFont(cornerFont); - - // Create a Font for styling header cells - Font headerFont = workbook.createFont(); - headerFont.setBold(true); - headerFont.setFontHeightInPoints((short) 14); - headerFont.setColor(IndexedColors.DARK_TEAL.getIndex()); - // Create a CellStyle with the font - CellStyle headerCellStyle = workbook.createCellStyle(); - headerCellStyle.setFont(headerFont); - - // Create a Font for styling non-diagonal cells - Font stdFont = workbook.createFont(); - stdFont.setBold(false); - stdFont.setFontHeightInPoints((short) 14); - stdFont.setColor(IndexedColors.DARK_RED.getIndex()); - // Create a CellStyle with the font - CellStyle stdCellStyle = workbook.createCellStyle(); - stdCellStyle.setFont(stdFont); - - // Create a Font for styling diagonal cells - Font diagonalFont = workbook.createFont(); - diagonalFont.setBold(true); - diagonalFont.setFontHeightInPoints((short) 14); - diagonalFont.setColor(IndexedColors.DARK_GREEN.getIndex()); - // Create a CellStyle with the font - CellStyle diagonalCellStyle = workbook.createCellStyle(); - diagonalCellStyle.setFont(diagonalFont); - - // Create a Font for styling diagonal cells - Font strataFont = workbook.createFont(); - strataFont.setBold(true); - strataFont.setFontHeightInPoints((short) 16); - strataFont.setColor(IndexedColors.BLUE.getIndex()); - // Create a CellStyle with the font - CellStyle strataCellStyle = workbook.createCellStyle(); - strataCellStyle.setFont(strataFont); - - List availableYears = new ArrayList(); - for (StratumPerYearData yearDataStratumP : strataData) { - if (!availableYears.contains(Integer.valueOf(yearDataStratumP.getYear()))) { - availableYears.add(yearDataStratumP.getYear()); - } - } - - for (Integer yearToOutput : availableYears) { - - int rowNum = 0; - // Create a Sheet - Sheet sheet = workbook.createSheet("LU Matrix " + yearToOutput + "-" + (yearToOutput + 1)); - - for (StratumPerYearData yearDataStratum : strataData) { - // Get the stratums for the year - if (yearDataStratum.getYear() != yearToOutput) { - continue; // The stratum contains data for a different year that we are going to output in - // the sheet - } - - - sheet.createRow(rowNum++); // create empty row - - // Create a Row - Row infoRow = sheet.createRow(rowNum++); - Cell cell = infoRow.createCell(0); - cell.setCellStyle(headerCellStyle); - cell.setCellValue("Climate"); - cell = infoRow.createCell(1); - cell.setCellStyle(strataCellStyle); - cell.setCellValue(yearDataStratum.getClimate()); - - infoRow = sheet.createRow(rowNum++); - cell = infoRow.createCell(0); - cell.setCellStyle(headerCellStyle); - cell.setCellValue("Soil"); - cell = infoRow.createCell(1); - cell.setCellStyle(strataCellStyle); - cell.setCellValue(yearDataStratum.getSoil()); - - infoRow = sheet.createRow(rowNum++); - cell = infoRow.createCell(0); - cell.setCellStyle(headerCellStyle); - cell.setCellValue("Global Ecological Zone (GEZ)"); - cell = infoRow.createCell(1); - cell.setCellStyle(strataCellStyle); - cell.setCellValue(yearDataStratum.getGez()); - - // Add some empty rows before next section - sheet.createRow(rowNum++); - - // Create a Row - Row headerRow = sheet.createRow(rowNum++); - cell = headerRow.createCell(0); - cell.setCellValue( - "Transition " + yearDataStratum.getYear() + "/" + (yearDataStratum.getYear() + 1)); - cell.setCellStyle(cornerCellStyle); - - MatrixSheet matrix = new MatrixSheet(yearDataStratum); - int cellPosition = 1; - for (LandUseSubdivision subdivision : matrix.getSubdivisions()) { - cell = headerRow.createCell(cellPosition++); - cell.setCellValue(subdivision.toString()); - cell.setCellStyle(headerCellStyle); - } - - int colNum = 0; - for (LandUseSubdivision subdivisionH : matrix.getSubdivisions()) { - colNum = 0; - Row row = sheet.createRow(rowNum++); - - Cell columnCell = row.createCell(colNum++); - columnCell.setCellStyle(headerCellStyle); - columnCell.setCellValue(subdivisionH.toString()); - - colNum = 1; - for (LandUseSubdivision subdivisionV : matrix.getSubdivisions()) { - - cell = row.createCell(colNum++); - cell.setCellValue(IPCCDataExportMatrixExcel - .findLuData(subdivisionH, subdivisionV, matrix.getYearData().getLuData()) - .getAreaHa()); - if (subdivisionH.equals(subdivisionV)) { - cell.setCellStyle(diagonalCellStyle); - } else { - cell.setCellStyle(stdCellStyle); - } - } - - } - - // Add some empty rows before next section - sheet.createRow(rowNum++); - sheet.createRow(rowNum++); - sheet.createRow(rowNum++); - + protected AbstractWizardPage getNextPage() { + return nextPage; + } - // Resize all columns to fit the content size - for (int j = 0; j < colNum; j++) { - sheet.autoSizeColumn(j); - } - } + @Override + protected boolean isFinishAllowed() { + return false; + } - } + @Override + protected Object[] getValues() { + return ManagementType.values(); + } - // Write the output to a file - try (FileOutputStream fileOut = new FileOutputStream(excelDestination)) { - workbook.write(fileOut); - } catch (IOException e) { - logger.error("Error generating Excel file", e); - } - } catch (Exception e) { - logger.error("Error generating Excel data", e); - } - return excelDestination; + @Override + protected String getLabel() { + return Messages.getString("WetlandPage.0"); //$NON-NLS-1$ } } From 00dde5dc672af619a11742b5ca5ca24451529a23 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:02 +0100 Subject: [PATCH 1386/1620] New translations SubdivisionPage.java (English) --- .../earth/app/view/Messages_en.properties | 291 +++++------------- 1 file changed, 81 insertions(+), 210 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 1230b9a5c0..903c70789d 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,234 +1,105 @@ -package org.openforis.collect.earth.ipcc; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Collection; +package org.openforis.collect.earth.ipcc.view; + +import java.awt.Dimension; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; import java.util.List; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.collections.Predicate; -import org.apache.poi.hssf.usermodel.HSSFWorkbook; -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.CellStyle; -import org.apache.poi.ss.usermodel.Font; -import org.apache.poi.ss.usermodel.IndexedColors; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.ss.usermodel.Workbook; -import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.RDBConnector; -import org.openforis.collect.earth.app.service.RegionCalculationUtils; -import org.openforis.collect.earth.app.service.SchemaService; +import javax.swing.JComboBox; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.border.BevelBorder; +import javax.swing.border.Border; +import javax.swing.border.TitledBorder; + import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; +import org.openforis.collect.earth.ipcc.model.LandUseCategory; import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.RowMapper; -import org.springframework.stereotype.Component; - -import liquibase.pro.packaged.E; -@Component -public class IPCCDataExportMatrixExcel extends RDBConnector { +import se.gustavkarlsson.gwiz.AbstractWizardPage; - private String schemaName; +public abstract class SubdivisionPage extends AbstractWizardPage { - Logger logger = LoggerFactory.getLogger(IPCCDataExportMatrixExcel.class); - - @Autowired - private SchemaService schemaService; - - public IPCCDataExportMatrixExcel() { - setExportTypeUsed(ExportType.IPCC); - } - - public File generateTimeseriesData( int startYear, int endYear ) throws IOException { - schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - - List matrixSheets = new ArrayList(); - - for (int year = startYear; year < endYear; year++) { - MatrixSheet yearMatrixData = generateLUMatrixForYear(year); - if (yearMatrixData != null) - matrixSheets.add(yearMatrixData); + public SubdivisionPage( LandUseCategory category) { + + List> subdivisionsInCategory = LandUseSubdivisionUtils.getSubdivisionsByCategory( category ); + + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + JPanel contentPane = new JPanel(new GridBagLayout()); + JScrollPane scrollPane = new JScrollPane(contentPane); + scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + scrollPane.setBounds(50, 30, 300, 50); + scrollPane.setPreferredSize(new Dimension(450, 350)); + + final Border border = new TitledBorder( + new BevelBorder(BevelBorder.LOWERED), + getLabel()); + setBorder(border); + + for (LandUseSubdivision subdiv : subdivisionsInCategory) { + + constraints.gridx = 0; + + JLabel labelCode = new JLabel( subdiv.getCode() ); + contentPane.add(labelCode, constraints); + + constraints.gridx = 1; + + JLabel labelName = new JLabel( subdiv.getName()); + contentPane.add(labelName, constraints); + + constraints.gridx = 2; + JComboBox mgmtType = new JComboBox(getValues()); + mgmtType.setSelectedItem( subdiv.getType() ); + contentPane.add(mgmtType, constraints); + mgmtType.addActionListener( e-> + LandUseSubdivisionUtils.setSubdivisionType( subdiv, mgmtType.getSelectedItem() ) + ); + + constraints.gridy++; } + + this.add(scrollPane); + + - return createExcel( matrixSheets); } - private MatrixSheet generateLUMatrixForYear(int year) { - - List luData = getJdbcTemplate().query( - "select " - + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " - + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1) + "," - + "sum( " + RegionCalculationUtils.EXPANSION_FACTOR + ")" - + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE - + " GROUP BY " - + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + "," - + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1), - getRowMapper() - ); - - if (luData.size() == 0) { // No LU data for the climate, soil, gez combination - return null; - } + protected abstract String getLabel(); - YearData yearData = new YearData(year, luData); - return new MatrixSheet( yearData ); - } + protected abstract Object[] getValues(); - protected RowMapper getRowMapper() { - return new RowMapper() { - @Override - public LUDataPerYear mapRow(ResultSet rs, int rowNum) throws SQLException { - - String categoryInitial = rs.getString(1); - String categoryFinal = rs.getString(2); - String subdivInitial = rs.getString(3); - String subdivFinal = rs.getString(4); - - return new LUDataPerYear( - LandUseSubdivisionUtils.getSubdivision(categoryInitial, subdivInitial), - LandUseSubdivisionUtils.getSubdivision(categoryFinal, subdivFinal), - rs.getDouble(5) // area - ); - } - }; + @Override + protected boolean isCancelAllowed() { + return false; } - protected static LUDataPerYear findLuData( LandUseSubdivision initialSubdivision, LandUseSubdivision finalSubdivision, List luData ) { - Collection result = CollectionUtils.select(luData, new Predicate() { - public boolean evaluate(Object a) { - return - ( (LUDataPerYear) a ).getLu().equals(initialSubdivision) - && - ( (LUDataPerYear) a ).getLuNextYear().equals(finalSubdivision); - } - }); - if( result.size() == 1 ) - return (LUDataPerYear) result.toArray(new LUDataPerYear[result.size()])[0]; - else - return new LUDataPerYear(initialSubdivision, finalSubdivision, 0); + @Override + protected boolean isPreviousAllowed() { + return true; + } + @Override + protected boolean isNextAllowed() { + return true; } - private File createExcel( List matrixData ) throws IOException { - File excelDestination = File.createTempFile("LuMatrixTimeseries", ".xls"); - excelDestination.deleteOnExit(); - // Create a Workbook - try (Workbook workbook = new HSSFWorkbook() ){ - /* CreationHelper helps us create instances of various things like DataFormat, - Hyperlink, RichTextString etc, in a format (HSSF, XSSF) independent way */ - //CreationHelper createHelper = workbook.getCreationHelper(); - - // Create a Font for styling header cells - Font cornerFont = workbook.createFont(); - cornerFont.setBold(true); - cornerFont.setFontHeightInPoints((short) 15); - cornerFont.setColor(IndexedColors.GREY_80_PERCENT.getIndex()); - // Create a CellStyle with the font - CellStyle cornerCellStyle = workbook.createCellStyle(); - cornerCellStyle.setFont(cornerFont); - - // Create a Font for styling header cells - Font headerFont = workbook.createFont(); - headerFont.setBold(true); - headerFont.setFontHeightInPoints((short) 14); - headerFont.setColor(IndexedColors.DARK_TEAL.getIndex()); - // Create a CellStyle with the font - CellStyle headerCellStyle = workbook.createCellStyle(); - headerCellStyle.setFont(headerFont); - - // Create a Font for styling non-diagonal cells - Font stdFont = workbook.createFont(); - stdFont.setBold(false); - stdFont.setFontHeightInPoints((short) 14); - stdFont.setColor(IndexedColors.DARK_RED.getIndex()); - // Create a CellStyle with the font - CellStyle stdCellStyle = workbook.createCellStyle(); - stdCellStyle.setFont(stdFont); - - // Create a Font for styling non-diagonal cells - Font diagonalFont = workbook.createFont(); - diagonalFont.setBold(true); - diagonalFont.setFontHeightInPoints((short) 14); - diagonalFont.setColor(IndexedColors.DARK_GREEN.getIndex()); - // Create a CellStyle with the font - CellStyle diagonalCellStyle = workbook.createCellStyle(); - diagonalCellStyle.setFont(diagonalFont); - - for (MatrixSheet matrix : matrixData) { - // Create a Sheet - Sheet sheet = workbook.createSheet("LU Matrix " + matrix.getYearData().getYear() + "-" + (matrix.getYearData().getYear()+1 ) ); - - // Create a Row - Row headerRow = sheet.createRow(0); - Cell cell = headerRow.createCell(0); - cell.setCellValue( "Transition " + matrix.getYearData().getYear() + "/" + ( matrix.getYearData().getYear() +1 ) ); - cell.setCellStyle(cornerCellStyle); - - int i = 1; - for (LandUseSubdivision subdivision : matrix.getSubdivisions()) { - cell = headerRow.createCell(i++); - cell.setCellValue(subdivision.toString()); - cell.setCellStyle(headerCellStyle); - } - - - int rowNum = 1; - int colNum = 0; - for (LandUseSubdivision subdivisionH : matrix.getSubdivisions()) { - colNum = 0; - Row row = sheet.createRow(rowNum++); - - Cell columnCell = row.createCell(colNum++); - columnCell.setCellStyle(headerCellStyle); - columnCell.setCellValue(subdivisionH.toString()); - - colNum = 1; - for (LandUseSubdivision subdivisionV : matrix.getSubdivisions()) { - - cell = row.createCell(colNum++); - cell.setCellValue( findLuData( subdivisionH, subdivisionV, matrix.getYearData().getLuData() ).getAreaHa() ); - if( subdivisionH.equals( subdivisionV ) ) { - cell.setCellStyle(diagonalCellStyle); - }else { - cell.setCellStyle(stdCellStyle); - } - } - - } - - // Resize all columns to fit the content size - for(int j = 0; j < colNum; j++) { - sheet.autoSizeColumn(j); - } - - } - - // Write the output to a file - try( FileOutputStream fileOut = new FileOutputStream(excelDestination) ){ - workbook.write(fileOut); - } catch (IOException e) { - logger.error("Error generating Excel file", e); - } - } catch (Exception e) { - logger.error("Error generating Excel data", e); - } - return excelDestination; + @Override + protected boolean isFinishAllowed() { + return false; } } From 5a0d5c4ff01f62bc62f2936ba5cc3debf5e8b09c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:03 +0100 Subject: [PATCH 1387/1620] New translations ForestPage.java (English) --- .../earth/app/view/Messages_en.properties | 99 +++---------------- 1 file changed, 16 insertions(+), 83 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 903c70789d..0110c75fd0 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,105 +1,38 @@ package org.openforis.collect.earth.ipcc.view; -import java.awt.Dimension; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.util.List; - -import javax.swing.JComboBox; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.border.BevelBorder; -import javax.swing.border.Border; -import javax.swing.border.TitledBorder; - -import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +import org.openforis.collect.earth.ipcc.model.ManagementType; import se.gustavkarlsson.gwiz.AbstractWizardPage; -public abstract class SubdivisionPage extends AbstractWizardPage { - - public SubdivisionPage( LandUseCategory category) { - - List> subdivisionsInCategory = LandUseSubdivisionUtils.getSubdivisionsByCategory( category ); - - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - JPanel contentPane = new JPanel(new GridBagLayout()); - JScrollPane scrollPane = new JScrollPane(contentPane); - scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - scrollPane.setBounds(50, 30, 300, 50); - scrollPane.setPreferredSize(new Dimension(450, 350)); - - final Border border = new TitledBorder( - new BevelBorder(BevelBorder.LOWERED), - getLabel()); - setBorder(border); - - for (LandUseSubdivision subdiv : subdivisionsInCategory) { - - constraints.gridx = 0; - - JLabel labelCode = new JLabel( subdiv.getCode() ); - contentPane.add(labelCode, constraints); - - constraints.gridx = 1; - - JLabel labelName = new JLabel( subdiv.getName()); - contentPane.add(labelName, constraints); - - constraints.gridx = 2; - JComboBox mgmtType = new JComboBox(getValues()); - mgmtType.setSelectedItem( subdiv.getType() ); - contentPane.add(mgmtType, constraints); - mgmtType.addActionListener( e-> - LandUseSubdivisionUtils.setSubdivisionType( subdiv, mgmtType.getSelectedItem() ) - ); - - constraints.gridy++; - } - - this.add(scrollPane); - - +public class ForestPage extends SubdivisionPage { + private static final long serialVersionUID = -1544068125437624279L; + private AbstractWizardPage nextPage = new CroplandPage(); + + public ForestPage() { + super( LandUseCategory.F ); } - - protected abstract String getLabel(); - - - protected abstract Object[] getValues(); - - @Override - protected boolean isCancelAllowed() { - return false; + protected AbstractWizardPage getNextPage() { + return nextPage; } + @Override - protected boolean isPreviousAllowed() { - return true; + protected boolean isFinishAllowed() { + return false; } @Override - protected boolean isNextAllowed() { - return true; + protected Object[] getValues() { + return ManagementType.values(); } @Override - protected boolean isFinishAllowed() { - return false; + protected String getLabel() { + return Messages.getString("ForestPage.0"); //$NON-NLS-1$ } } From 6c466a61c89effe36f65c83788071d477eef9a41 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:05 +0100 Subject: [PATCH 1388/1620] New translations Messages.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 212 +----------------- 1 file changed, 12 insertions(+), 200 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index c15098bfaa..74599635a0 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,209 +1,21 @@ -package org.openforis.collect.earth.ipcc; +package org.openforis.collect.earth.ipcc.view; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.MissingResourceException; +import java.util.ResourceBundle; -import org.apache.poi.hssf.usermodel.HSSFWorkbook; -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.CellStyle; -import org.apache.poi.ss.usermodel.Font; -import org.apache.poi.ss.usermodel.IndexedColors; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.ss.usermodel.Workbook; -import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; +public class Messages { + private static final String BUNDLE_NAME = "org.openforis.collect.earth.ipcc.view.Messages"; //$NON-NLS-1$ -@Component -public class IPCCDataExportMatrixExtendedExcel extends IPCCDataExportTimeSeries { + private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME); - Logger logger = LoggerFactory.getLogger(IPCCDataExportMatrixExtendedExcel.class); - - public IPCCDataExportMatrixExtendedExcel() { - super(); - setExportTypeUsed(ExportType.IPCC); + private Messages() { } - @Override - protected File generateFile(List strataData) throws IOException { - File excelDestination = File.createTempFile("LuMatrixTimeseries_EXTENDED", ".xls"); - excelDestination.deleteOnExit(); - // Create a Workbook - try(Workbook workbook = new HSSFWorkbook() ) {// new HSSFWorkbook() for generating `.xls` file - - /* - * CreationHelper helps us create instances of various things like DataFormat, - * Hyperlink, RichTextString etc, in a format (HSSF, XSSF) independent way - */ - // CreationHelper createHelper = workbook.getCreationHelper(); - - // Create a Font for styling header cells - Font cornerFont = workbook.createFont(); - cornerFont.setBold(true); - cornerFont.setFontHeightInPoints((short) 15); - cornerFont.setColor(IndexedColors.GREY_80_PERCENT.getIndex()); - // Create a CellStyle with the font - CellStyle cornerCellStyle = workbook.createCellStyle(); - cornerCellStyle.setFont(cornerFont); - - // Create a Font for styling header cells - Font headerFont = workbook.createFont(); - headerFont.setBold(true); - headerFont.setFontHeightInPoints((short) 14); - headerFont.setColor(IndexedColors.DARK_TEAL.getIndex()); - // Create a CellStyle with the font - CellStyle headerCellStyle = workbook.createCellStyle(); - headerCellStyle.setFont(headerFont); - - // Create a Font for styling non-diagonal cells - Font stdFont = workbook.createFont(); - stdFont.setBold(false); - stdFont.setFontHeightInPoints((short) 14); - stdFont.setColor(IndexedColors.DARK_RED.getIndex()); - // Create a CellStyle with the font - CellStyle stdCellStyle = workbook.createCellStyle(); - stdCellStyle.setFont(stdFont); - - // Create a Font for styling diagonal cells - Font diagonalFont = workbook.createFont(); - diagonalFont.setBold(true); - diagonalFont.setFontHeightInPoints((short) 14); - diagonalFont.setColor(IndexedColors.DARK_GREEN.getIndex()); - // Create a CellStyle with the font - CellStyle diagonalCellStyle = workbook.createCellStyle(); - diagonalCellStyle.setFont(diagonalFont); - - // Create a Font for styling diagonal cells - Font strataFont = workbook.createFont(); - strataFont.setBold(true); - strataFont.setFontHeightInPoints((short) 16); - strataFont.setColor(IndexedColors.BLUE.getIndex()); - // Create a CellStyle with the font - CellStyle strataCellStyle = workbook.createCellStyle(); - strataCellStyle.setFont(strataFont); - - List availableYears = new ArrayList(); - for (StratumPerYearData yearDataStratumP : strataData) { - if (!availableYears.contains(Integer.valueOf(yearDataStratumP.getYear()))) { - availableYears.add(yearDataStratumP.getYear()); - } - } - - for (Integer yearToOutput : availableYears) { - - int rowNum = 0; - // Create a Sheet - Sheet sheet = workbook.createSheet("LU Matrix " + yearToOutput + "-" + (yearToOutput + 1)); - - for (StratumPerYearData yearDataStratum : strataData) { - // Get the stratums for the year - if (yearDataStratum.getYear() != yearToOutput) { - continue; // The stratum contains data for a different year that we are going to output in - // the sheet - } - - - sheet.createRow(rowNum++); // create empty row - - // Create a Row - Row infoRow = sheet.createRow(rowNum++); - Cell cell = infoRow.createCell(0); - cell.setCellStyle(headerCellStyle); - cell.setCellValue("Climate"); - cell = infoRow.createCell(1); - cell.setCellStyle(strataCellStyle); - cell.setCellValue(yearDataStratum.getClimate()); - - infoRow = sheet.createRow(rowNum++); - cell = infoRow.createCell(0); - cell.setCellStyle(headerCellStyle); - cell.setCellValue("Soil"); - cell = infoRow.createCell(1); - cell.setCellStyle(strataCellStyle); - cell.setCellValue(yearDataStratum.getSoil()); - - infoRow = sheet.createRow(rowNum++); - cell = infoRow.createCell(0); - cell.setCellStyle(headerCellStyle); - cell.setCellValue("Global Ecological Zone (GEZ)"); - cell = infoRow.createCell(1); - cell.setCellStyle(strataCellStyle); - cell.setCellValue(yearDataStratum.getGez()); - - // Add some empty rows before next section - sheet.createRow(rowNum++); - - // Create a Row - Row headerRow = sheet.createRow(rowNum++); - cell = headerRow.createCell(0); - cell.setCellValue( - "Transition " + yearDataStratum.getYear() + "/" + (yearDataStratum.getYear() + 1)); - cell.setCellStyle(cornerCellStyle); - - MatrixSheet matrix = new MatrixSheet(yearDataStratum); - int cellPosition = 1; - for (LandUseSubdivision subdivision : matrix.getSubdivisions()) { - cell = headerRow.createCell(cellPosition++); - cell.setCellValue(subdivision.toString()); - cell.setCellStyle(headerCellStyle); - } - - int colNum = 0; - for (LandUseSubdivision subdivisionH : matrix.getSubdivisions()) { - colNum = 0; - Row row = sheet.createRow(rowNum++); - - Cell columnCell = row.createCell(colNum++); - columnCell.setCellStyle(headerCellStyle); - columnCell.setCellValue(subdivisionH.toString()); - - colNum = 1; - for (LandUseSubdivision subdivisionV : matrix.getSubdivisions()) { - - cell = row.createCell(colNum++); - cell.setCellValue(IPCCDataExportMatrixExcel - .findLuData(subdivisionH, subdivisionV, matrix.getYearData().getLuData()) - .getAreaHa()); - if (subdivisionH.equals(subdivisionV)) { - cell.setCellStyle(diagonalCellStyle); - } else { - cell.setCellStyle(stdCellStyle); - } - } - - } - - // Add some empty rows before next section - sheet.createRow(rowNum++); - sheet.createRow(rowNum++); - sheet.createRow(rowNum++); - - - // Resize all columns to fit the content size - for (int j = 0; j < colNum; j++) { - sheet.autoSizeColumn(j); - } - - } - - } - - // Write the output to a file - try (FileOutputStream fileOut = new FileOutputStream(excelDestination)) { - workbook.write(fileOut); - } catch (IOException e) { - logger.error("Error generating Excel file", e); - } - } catch (Exception e) { - logger.error("Error generating Excel data", e); + public static String getString(String key) { + try { + return RESOURCE_BUNDLE.getString(key); + } catch (MissingResourceException e) { + return '!' + key + '!'; } - return excelDestination; } - } From fa3cbb3730a9e10e84fc1c7f315fa5eb6ac387b3 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:06 +0100 Subject: [PATCH 1389/1620] New translations GrasslandPage.java (French) --- .../earth/app/view/Messages_fr.properties | 218 ++---------------- 1 file changed, 24 insertions(+), 194 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index c15098bfaa..3b8a2af7e3 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,209 +1,39 @@ -package org.openforis.collect.earth.ipcc; +package org.openforis.collect.earth.ipcc.view; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import org.openforis.collect.earth.ipcc.model.ManagementType; -import org.apache.poi.hssf.usermodel.HSSFWorkbook; -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.CellStyle; -import org.apache.poi.ss.usermodel.Font; -import org.apache.poi.ss.usermodel.IndexedColors; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.ss.usermodel.Workbook; -import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; +import se.gustavkarlsson.gwiz.AbstractWizardPage; -@Component -public class IPCCDataExportMatrixExtendedExcel extends IPCCDataExportTimeSeries { +public class GrasslandPage extends SubdivisionPage { - Logger logger = LoggerFactory.getLogger(IPCCDataExportMatrixExtendedExcel.class); - public IPCCDataExportMatrixExtendedExcel() { - super(); - setExportTypeUsed(ExportType.IPCC); + private static final long serialVersionUID = -2022500980698210420L; + private AbstractWizardPage nextPage = new SettlementPage(); + + public GrasslandPage() { + super( LandUseCategory.G ); } @Override - protected File generateFile(List strataData) throws IOException { - File excelDestination = File.createTempFile("LuMatrixTimeseries_EXTENDED", ".xls"); - excelDestination.deleteOnExit(); - // Create a Workbook - try(Workbook workbook = new HSSFWorkbook() ) {// new HSSFWorkbook() for generating `.xls` file - - /* - * CreationHelper helps us create instances of various things like DataFormat, - * Hyperlink, RichTextString etc, in a format (HSSF, XSSF) independent way - */ - // CreationHelper createHelper = workbook.getCreationHelper(); - - // Create a Font for styling header cells - Font cornerFont = workbook.createFont(); - cornerFont.setBold(true); - cornerFont.setFontHeightInPoints((short) 15); - cornerFont.setColor(IndexedColors.GREY_80_PERCENT.getIndex()); - // Create a CellStyle with the font - CellStyle cornerCellStyle = workbook.createCellStyle(); - cornerCellStyle.setFont(cornerFont); - - // Create a Font for styling header cells - Font headerFont = workbook.createFont(); - headerFont.setBold(true); - headerFont.setFontHeightInPoints((short) 14); - headerFont.setColor(IndexedColors.DARK_TEAL.getIndex()); - // Create a CellStyle with the font - CellStyle headerCellStyle = workbook.createCellStyle(); - headerCellStyle.setFont(headerFont); - - // Create a Font for styling non-diagonal cells - Font stdFont = workbook.createFont(); - stdFont.setBold(false); - stdFont.setFontHeightInPoints((short) 14); - stdFont.setColor(IndexedColors.DARK_RED.getIndex()); - // Create a CellStyle with the font - CellStyle stdCellStyle = workbook.createCellStyle(); - stdCellStyle.setFont(stdFont); - - // Create a Font for styling diagonal cells - Font diagonalFont = workbook.createFont(); - diagonalFont.setBold(true); - diagonalFont.setFontHeightInPoints((short) 14); - diagonalFont.setColor(IndexedColors.DARK_GREEN.getIndex()); - // Create a CellStyle with the font - CellStyle diagonalCellStyle = workbook.createCellStyle(); - diagonalCellStyle.setFont(diagonalFont); - - // Create a Font for styling diagonal cells - Font strataFont = workbook.createFont(); - strataFont.setBold(true); - strataFont.setFontHeightInPoints((short) 16); - strataFont.setColor(IndexedColors.BLUE.getIndex()); - // Create a CellStyle with the font - CellStyle strataCellStyle = workbook.createCellStyle(); - strataCellStyle.setFont(strataFont); - - List availableYears = new ArrayList(); - for (StratumPerYearData yearDataStratumP : strataData) { - if (!availableYears.contains(Integer.valueOf(yearDataStratumP.getYear()))) { - availableYears.add(yearDataStratumP.getYear()); - } - } - - for (Integer yearToOutput : availableYears) { - - int rowNum = 0; - // Create a Sheet - Sheet sheet = workbook.createSheet("LU Matrix " + yearToOutput + "-" + (yearToOutput + 1)); - - for (StratumPerYearData yearDataStratum : strataData) { - // Get the stratums for the year - if (yearDataStratum.getYear() != yearToOutput) { - continue; // The stratum contains data for a different year that we are going to output in - // the sheet - } - - - sheet.createRow(rowNum++); // create empty row - - // Create a Row - Row infoRow = sheet.createRow(rowNum++); - Cell cell = infoRow.createCell(0); - cell.setCellStyle(headerCellStyle); - cell.setCellValue("Climate"); - cell = infoRow.createCell(1); - cell.setCellStyle(strataCellStyle); - cell.setCellValue(yearDataStratum.getClimate()); - - infoRow = sheet.createRow(rowNum++); - cell = infoRow.createCell(0); - cell.setCellStyle(headerCellStyle); - cell.setCellValue("Soil"); - cell = infoRow.createCell(1); - cell.setCellStyle(strataCellStyle); - cell.setCellValue(yearDataStratum.getSoil()); - - infoRow = sheet.createRow(rowNum++); - cell = infoRow.createCell(0); - cell.setCellStyle(headerCellStyle); - cell.setCellValue("Global Ecological Zone (GEZ)"); - cell = infoRow.createCell(1); - cell.setCellStyle(strataCellStyle); - cell.setCellValue(yearDataStratum.getGez()); - - // Add some empty rows before next section - sheet.createRow(rowNum++); - - // Create a Row - Row headerRow = sheet.createRow(rowNum++); - cell = headerRow.createCell(0); - cell.setCellValue( - "Transition " + yearDataStratum.getYear() + "/" + (yearDataStratum.getYear() + 1)); - cell.setCellStyle(cornerCellStyle); - - MatrixSheet matrix = new MatrixSheet(yearDataStratum); - int cellPosition = 1; - for (LandUseSubdivision subdivision : matrix.getSubdivisions()) { - cell = headerRow.createCell(cellPosition++); - cell.setCellValue(subdivision.toString()); - cell.setCellStyle(headerCellStyle); - } - - int colNum = 0; - for (LandUseSubdivision subdivisionH : matrix.getSubdivisions()) { - colNum = 0; - Row row = sheet.createRow(rowNum++); - - Cell columnCell = row.createCell(colNum++); - columnCell.setCellStyle(headerCellStyle); - columnCell.setCellValue(subdivisionH.toString()); - - colNum = 1; - for (LandUseSubdivision subdivisionV : matrix.getSubdivisions()) { - - cell = row.createCell(colNum++); - cell.setCellValue(IPCCDataExportMatrixExcel - .findLuData(subdivisionH, subdivisionV, matrix.getYearData().getLuData()) - .getAreaHa()); - if (subdivisionH.equals(subdivisionV)) { - cell.setCellStyle(diagonalCellStyle); - } else { - cell.setCellStyle(stdCellStyle); - } - } - - } - - // Add some empty rows before next section - sheet.createRow(rowNum++); - sheet.createRow(rowNum++); - sheet.createRow(rowNum++); - + protected AbstractWizardPage getNextPage() { + return nextPage; + } - // Resize all columns to fit the content size - for (int j = 0; j < colNum; j++) { - sheet.autoSizeColumn(j); - } - } + @Override + protected boolean isFinishAllowed() { + return false; + } - } + @Override + protected Object[] getValues() { + return ManagementType.values(); + } - // Write the output to a file - try (FileOutputStream fileOut = new FileOutputStream(excelDestination)) { - workbook.write(fileOut); - } catch (IOException e) { - logger.error("Error generating Excel file", e); - } - } catch (Exception e) { - logger.error("Error generating Excel data", e); - } - return excelDestination; + @Override + protected String getLabel() { + return Messages.getString("GrasslandPage.0"); //$NON-NLS-1$ } } From 0bc370a0c2315a1cb5d5082e6337000e15244da1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:07 +0100 Subject: [PATCH 1390/1620] New translations GrasslandPage.java (Spanish) --- .../collect/earth/app/view/Messages_es.properties | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index b55115af7f..3b8a2af7e3 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -5,13 +5,14 @@ import org.openforis.collect.earth.ipcc.model.ManagementType; import se.gustavkarlsson.gwiz.AbstractWizardPage; -public class WetlandPage extends SubdivisionPage { +public class GrasslandPage extends SubdivisionPage { - private static final long serialVersionUID = 5385335458259411328L; - private AbstractWizardPage nextPage = new OtherlandPage(); + + private static final long serialVersionUID = -2022500980698210420L; + private AbstractWizardPage nextPage = new SettlementPage(); - public WetlandPage() { - super( LandUseCategory.W ); + public GrasslandPage() { + super( LandUseCategory.G ); } @Override @@ -32,7 +33,7 @@ public class WetlandPage extends SubdivisionPage { @Override protected String getLabel() { - return Messages.getString("WetlandPage.0"); //$NON-NLS-1$ + return Messages.getString("GrasslandPage.0"); //$NON-NLS-1$ } } From 3bcc3477a6741141b838d02273e759a5cfc87ecb Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:08 +0100 Subject: [PATCH 1391/1620] New translations GrasslandPage.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 42 +++++++++++++------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 74599635a0..3b8a2af7e3 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,21 +1,39 @@ package org.openforis.collect.earth.ipcc.view; -import java.util.MissingResourceException; -import java.util.ResourceBundle; +import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import org.openforis.collect.earth.ipcc.model.ManagementType; -public class Messages { - private static final String BUNDLE_NAME = "org.openforis.collect.earth.ipcc.view.Messages"; //$NON-NLS-1$ +import se.gustavkarlsson.gwiz.AbstractWizardPage; - private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME); +public class GrasslandPage extends SubdivisionPage { - private Messages() { + + private static final long serialVersionUID = -2022500980698210420L; + private AbstractWizardPage nextPage = new SettlementPage(); + + public GrasslandPage() { + super( LandUseCategory.G ); } - public static String getString(String key) { - try { - return RESOURCE_BUNDLE.getString(key); - } catch (MissingResourceException e) { - return '!' + key + '!'; - } + @Override + protected AbstractWizardPage getNextPage() { + return nextPage; } + + + @Override + protected boolean isFinishAllowed() { + return false; + } + + @Override + protected Object[] getValues() { + return ManagementType.values(); + } + + @Override + protected String getLabel() { + return Messages.getString("GrasslandPage.0"); //$NON-NLS-1$ + } + } From ad09bc20c6ad4d74c46fcfe49d00e3f6957aecff Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:09 +0100 Subject: [PATCH 1392/1620] New translations GrasslandPage.java (English) --- .../collect/earth/app/view/Messages_en.properties | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 0110c75fd0..3b8a2af7e3 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -5,13 +5,14 @@ import org.openforis.collect.earth.ipcc.model.ManagementType; import se.gustavkarlsson.gwiz.AbstractWizardPage; -public class ForestPage extends SubdivisionPage { +public class GrasslandPage extends SubdivisionPage { - private static final long serialVersionUID = -1544068125437624279L; - private AbstractWizardPage nextPage = new CroplandPage(); + + private static final long serialVersionUID = -2022500980698210420L; + private AbstractWizardPage nextPage = new SettlementPage(); - public ForestPage() { - super( LandUseCategory.F ); + public GrasslandPage() { + super( LandUseCategory.G ); } @Override @@ -32,7 +33,7 @@ public class ForestPage extends SubdivisionPage { @Override protected String getLabel() { - return Messages.getString("ForestPage.0"); //$NON-NLS-1$ + return Messages.getString("GrasslandPage.0"); //$NON-NLS-1$ } } From 2caa96f207e16fb591677a53f18ce5b499847015 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:10 +0100 Subject: [PATCH 1393/1620] New translations JDialogWizard.java (French) --- .../earth/app/view/Messages_fr.properties | 264 +++++++++++++++--- 1 file changed, 225 insertions(+), 39 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 3b8a2af7e3..71cc316cbd 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,39 +1,225 @@ -package org.openforis.collect.earth.ipcc.view; - -import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.ManagementType; - -import se.gustavkarlsson.gwiz.AbstractWizardPage; - -public class GrasslandPage extends SubdivisionPage { - - - private static final long serialVersionUID = -2022500980698210420L; - private AbstractWizardPage nextPage = new SettlementPage(); - - public GrasslandPage() { - super( LandUseCategory.G ); - } - - @Override - protected AbstractWizardPage getNextPage() { - return nextPage; - } - - - @Override - protected boolean isFinishAllowed() { - return false; - } - - @Override - protected Object[] getValues() { - return ManagementType.values(); - } - - @Override - protected String getLabel() { - return Messages.getString("GrasslandPage.0"); //$NON-NLS-1$ - } - -} +/******************************************************************************* + * Copyright (c) 2012 Gustav Karlsson . + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the GNU Public License v3.0 + * which accompanies this distribution, and is available at + * http://www.gnu.org/licenses/gpl.html + * + * Contributors: + * Gustav Karlsson - initial API and implementation + ******************************************************************************/ +package org.openforis.collect.earth.ipcc.view; + +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.GridLayout; +import java.awt.Insets; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.ContainerEvent; +import java.awt.event.ContainerListener; +import java.awt.event.KeyEvent; + +import javax.swing.AbstractButton; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JSeparator; + +import se.gustavkarlsson.gwiz.Wizard; + +/** + * A very simple Wizard implementation that suits the most basic needs. Extends {@link JFrame} and has + * navigation buttons at the bottom. + * + * @author Gustav Karlsson + */ +public class JDialogWizard extends JDialog implements Wizard { + private static final long serialVersionUID = 2818290889333414291L; + + private static final Dimension defaultminimumSize = new Dimension(500, 500); + + private final JPanel wizardPageContainer = new JPanel(new GridLayout(1, 1)); + private final JButton cancelButton = new JButton(Messages.getString("JDialogWizard.0")); //$NON-NLS-1$ + private final JButton previousButton = new JButton(Messages.getString("JDialogWizard.1")); //$NON-NLS-1$ + private final JButton nextButton = new JButton(Messages.getString("JDialogWizard.2")); //$NON-NLS-1$ + private final JButton finishButton = new JButton(Messages.getString("JDialogWizard.3")); //$NON-NLS-1$ + + private boolean wizardFinished = false; + + /** + * Creates an JDialogWizard with a title and GraphicsConfiguration. + * + * @param title + * the title of the frame + * @param gc + * the GraphicsConfiguration of the frame + * @see JFrame + */ + public JDialogWizard(Frame owner, String title, boolean modal) { + super(owner, title, modal); + setupWizard(); + } + + /** + * Creates an JDialogWizard. + * + * @see JFrame + */ + public JDialogWizard() { + super(); + setupWizard(); + } + + /** + * Sets up wizard upon construction. + */ + private void setupWizard() { + setupComponents(); + layoutComponents(); + + setMinimumSize(defaultminimumSize); + + // Center on screen + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + int xPosition = (screenSize.width / 2) - (defaultminimumSize.width / 2); + int yPosition = (screenSize.height / 2) - (defaultminimumSize.height / 2); + setLocation(xPosition, yPosition); + + setDefaultCloseOperation(DISPOSE_ON_CLOSE); + } + + /** + * Sets up the components of the wizard with listeners and mnemonics. + */ + private void setupComponents() { + cancelButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + dispose(); + } + }); + + finishButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + //JOptionPane.showMessageDialog(getContentPane(), Messages.getString("JDialogWizard.4")); //$NON-NLS-1$ + wizardFinished = true; + dispose(); + } + }); + + cancelButton.setMnemonic(KeyEvent.VK_C); + previousButton.setMnemonic(KeyEvent.VK_P); + nextButton.setMnemonic(KeyEvent.VK_N); + finishButton.setMnemonic(KeyEvent.VK_F); + + wizardPageContainer.addContainerListener(new MinimumSizeAdjuster()); + } + + /** + * Lays out the components in the wizards content pane. + */ + private void layoutComponents() { + GridBagLayout layout = new GridBagLayout(); + layout.rowWeights = new double[]{1.0, 0.0, 0.0}; + layout.columnWeights = new double[]{1.0, 0.0, 0.0, 0.0, 0.0}; + layout.rowHeights = new int[] {0, 0, 0}; + layout.columnWidths = new int[] {0, 0, 0, 0, 0}; + getContentPane().setLayout(layout); + + GridBagConstraints wizardPageContainerConstraint = new GridBagConstraints(); + wizardPageContainerConstraint.gridwidth = 5; + wizardPageContainerConstraint.fill = GridBagConstraints.BOTH; + wizardPageContainerConstraint.gridx = 0; + wizardPageContainerConstraint.gridy = 0; + wizardPageContainerConstraint.insets = new Insets(5, 5, 5, 5); + getContentPane().add(wizardPageContainer, wizardPageContainerConstraint); + + GridBagConstraints separatorConstraints = new GridBagConstraints(); + separatorConstraints.gridwidth = 5; + separatorConstraints.fill = GridBagConstraints.HORIZONTAL; + separatorConstraints.gridx = 0; + separatorConstraints.gridy = 1; + separatorConstraints.insets = new Insets(5, 5, 5, 5); + getContentPane().add(new JSeparator(), separatorConstraints); + + GridBagConstraints cancelButtonConstraints = new GridBagConstraints(); + cancelButtonConstraints.gridx = 1; + cancelButtonConstraints.gridy = 2; + cancelButtonConstraints.insets = new Insets(5, 5, 5, 0); + getContentPane().add(cancelButton, cancelButtonConstraints); + + GridBagConstraints previousButtonConstraints = new GridBagConstraints(); + previousButtonConstraints.gridx = 2; + previousButtonConstraints.gridy = 2; + previousButtonConstraints.insets = new Insets(5, 5, 5, 0); + getContentPane().add(previousButton, previousButtonConstraints); + + GridBagConstraints nextButtonConstraints = new GridBagConstraints(); + nextButtonConstraints.gridx = 3; + nextButtonConstraints.gridy = 2; + nextButtonConstraints.insets = new Insets(5, 5, 5, 0); + getContentPane().add(nextButton, nextButtonConstraints); + + GridBagConstraints finishButtonConstraints = new GridBagConstraints(); + finishButtonConstraints.gridx = 4; + finishButtonConstraints.gridy = 2; + finishButtonConstraints.insets = new Insets(5, 5, 5, 5); + getContentPane().add(finishButton, finishButtonConstraints); + } + + @Override + public JPanel getWizardPageContainer() { + return wizardPageContainer; + } + + @Override + public AbstractButton getCancelButton() { + return cancelButton; + } + + @Override + public JButton getPreviousButton() { + return previousButton; + } + + @Override + public JButton getNextButton() { + return nextButton; + } + + @Override + public JButton getFinishButton() { + return finishButton; + } + + private class MinimumSizeAdjuster implements ContainerListener { + + @Override + public void componentAdded(ContainerEvent e) { + Dimension currentSize = getSize(); + Dimension preferredSize = getPreferredSize(); + + Dimension newSize = new Dimension(currentSize); + newSize.width = Math.max(currentSize.width, preferredSize.width); + newSize.height = Math.max(currentSize.height, preferredSize.height); + + setMinimumSize(newSize); + } + + @Override + public void componentRemoved(ContainerEvent e) { + } + + } + + public boolean isWizardFinished() { + return wizardFinished; + } + +} From b5b6ba6df04b47ad8c4ae11ae319c6cd2bba0a1a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:12 +0100 Subject: [PATCH 1394/1620] New translations JDialogWizard.java (Spanish) --- .../earth/app/view/Messages_es.properties | 264 +++++++++++++++--- 1 file changed, 225 insertions(+), 39 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 3b8a2af7e3..71cc316cbd 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,39 +1,225 @@ -package org.openforis.collect.earth.ipcc.view; - -import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.ManagementType; - -import se.gustavkarlsson.gwiz.AbstractWizardPage; - -public class GrasslandPage extends SubdivisionPage { - - - private static final long serialVersionUID = -2022500980698210420L; - private AbstractWizardPage nextPage = new SettlementPage(); - - public GrasslandPage() { - super( LandUseCategory.G ); - } - - @Override - protected AbstractWizardPage getNextPage() { - return nextPage; - } - - - @Override - protected boolean isFinishAllowed() { - return false; - } - - @Override - protected Object[] getValues() { - return ManagementType.values(); - } - - @Override - protected String getLabel() { - return Messages.getString("GrasslandPage.0"); //$NON-NLS-1$ - } - -} +/******************************************************************************* + * Copyright (c) 2012 Gustav Karlsson . + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the GNU Public License v3.0 + * which accompanies this distribution, and is available at + * http://www.gnu.org/licenses/gpl.html + * + * Contributors: + * Gustav Karlsson - initial API and implementation + ******************************************************************************/ +package org.openforis.collect.earth.ipcc.view; + +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.GridLayout; +import java.awt.Insets; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.ContainerEvent; +import java.awt.event.ContainerListener; +import java.awt.event.KeyEvent; + +import javax.swing.AbstractButton; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JSeparator; + +import se.gustavkarlsson.gwiz.Wizard; + +/** + * A very simple Wizard implementation that suits the most basic needs. Extends {@link JFrame} and has + * navigation buttons at the bottom. + * + * @author Gustav Karlsson + */ +public class JDialogWizard extends JDialog implements Wizard { + private static final long serialVersionUID = 2818290889333414291L; + + private static final Dimension defaultminimumSize = new Dimension(500, 500); + + private final JPanel wizardPageContainer = new JPanel(new GridLayout(1, 1)); + private final JButton cancelButton = new JButton(Messages.getString("JDialogWizard.0")); //$NON-NLS-1$ + private final JButton previousButton = new JButton(Messages.getString("JDialogWizard.1")); //$NON-NLS-1$ + private final JButton nextButton = new JButton(Messages.getString("JDialogWizard.2")); //$NON-NLS-1$ + private final JButton finishButton = new JButton(Messages.getString("JDialogWizard.3")); //$NON-NLS-1$ + + private boolean wizardFinished = false; + + /** + * Creates an JDialogWizard with a title and GraphicsConfiguration. + * + * @param title + * the title of the frame + * @param gc + * the GraphicsConfiguration of the frame + * @see JFrame + */ + public JDialogWizard(Frame owner, String title, boolean modal) { + super(owner, title, modal); + setupWizard(); + } + + /** + * Creates an JDialogWizard. + * + * @see JFrame + */ + public JDialogWizard() { + super(); + setupWizard(); + } + + /** + * Sets up wizard upon construction. + */ + private void setupWizard() { + setupComponents(); + layoutComponents(); + + setMinimumSize(defaultminimumSize); + + // Center on screen + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + int xPosition = (screenSize.width / 2) - (defaultminimumSize.width / 2); + int yPosition = (screenSize.height / 2) - (defaultminimumSize.height / 2); + setLocation(xPosition, yPosition); + + setDefaultCloseOperation(DISPOSE_ON_CLOSE); + } + + /** + * Sets up the components of the wizard with listeners and mnemonics. + */ + private void setupComponents() { + cancelButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + dispose(); + } + }); + + finishButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + //JOptionPane.showMessageDialog(getContentPane(), Messages.getString("JDialogWizard.4")); //$NON-NLS-1$ + wizardFinished = true; + dispose(); + } + }); + + cancelButton.setMnemonic(KeyEvent.VK_C); + previousButton.setMnemonic(KeyEvent.VK_P); + nextButton.setMnemonic(KeyEvent.VK_N); + finishButton.setMnemonic(KeyEvent.VK_F); + + wizardPageContainer.addContainerListener(new MinimumSizeAdjuster()); + } + + /** + * Lays out the components in the wizards content pane. + */ + private void layoutComponents() { + GridBagLayout layout = new GridBagLayout(); + layout.rowWeights = new double[]{1.0, 0.0, 0.0}; + layout.columnWeights = new double[]{1.0, 0.0, 0.0, 0.0, 0.0}; + layout.rowHeights = new int[] {0, 0, 0}; + layout.columnWidths = new int[] {0, 0, 0, 0, 0}; + getContentPane().setLayout(layout); + + GridBagConstraints wizardPageContainerConstraint = new GridBagConstraints(); + wizardPageContainerConstraint.gridwidth = 5; + wizardPageContainerConstraint.fill = GridBagConstraints.BOTH; + wizardPageContainerConstraint.gridx = 0; + wizardPageContainerConstraint.gridy = 0; + wizardPageContainerConstraint.insets = new Insets(5, 5, 5, 5); + getContentPane().add(wizardPageContainer, wizardPageContainerConstraint); + + GridBagConstraints separatorConstraints = new GridBagConstraints(); + separatorConstraints.gridwidth = 5; + separatorConstraints.fill = GridBagConstraints.HORIZONTAL; + separatorConstraints.gridx = 0; + separatorConstraints.gridy = 1; + separatorConstraints.insets = new Insets(5, 5, 5, 5); + getContentPane().add(new JSeparator(), separatorConstraints); + + GridBagConstraints cancelButtonConstraints = new GridBagConstraints(); + cancelButtonConstraints.gridx = 1; + cancelButtonConstraints.gridy = 2; + cancelButtonConstraints.insets = new Insets(5, 5, 5, 0); + getContentPane().add(cancelButton, cancelButtonConstraints); + + GridBagConstraints previousButtonConstraints = new GridBagConstraints(); + previousButtonConstraints.gridx = 2; + previousButtonConstraints.gridy = 2; + previousButtonConstraints.insets = new Insets(5, 5, 5, 0); + getContentPane().add(previousButton, previousButtonConstraints); + + GridBagConstraints nextButtonConstraints = new GridBagConstraints(); + nextButtonConstraints.gridx = 3; + nextButtonConstraints.gridy = 2; + nextButtonConstraints.insets = new Insets(5, 5, 5, 0); + getContentPane().add(nextButton, nextButtonConstraints); + + GridBagConstraints finishButtonConstraints = new GridBagConstraints(); + finishButtonConstraints.gridx = 4; + finishButtonConstraints.gridy = 2; + finishButtonConstraints.insets = new Insets(5, 5, 5, 5); + getContentPane().add(finishButton, finishButtonConstraints); + } + + @Override + public JPanel getWizardPageContainer() { + return wizardPageContainer; + } + + @Override + public AbstractButton getCancelButton() { + return cancelButton; + } + + @Override + public JButton getPreviousButton() { + return previousButton; + } + + @Override + public JButton getNextButton() { + return nextButton; + } + + @Override + public JButton getFinishButton() { + return finishButton; + } + + private class MinimumSizeAdjuster implements ContainerListener { + + @Override + public void componentAdded(ContainerEvent e) { + Dimension currentSize = getSize(); + Dimension preferredSize = getPreferredSize(); + + Dimension newSize = new Dimension(currentSize); + newSize.width = Math.max(currentSize.width, preferredSize.width); + newSize.height = Math.max(currentSize.height, preferredSize.height); + + setMinimumSize(newSize); + } + + @Override + public void componentRemoved(ContainerEvent e) { + } + + } + + public boolean isWizardFinished() { + return wizardFinished; + } + +} From 6c516f92fc5304eb2b47d348312fa030c42d2351 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:13 +0100 Subject: [PATCH 1395/1620] New translations JDialogWizard.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 264 +++++++++++++++--- 1 file changed, 225 insertions(+), 39 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 3b8a2af7e3..71cc316cbd 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,39 +1,225 @@ -package org.openforis.collect.earth.ipcc.view; - -import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.ManagementType; - -import se.gustavkarlsson.gwiz.AbstractWizardPage; - -public class GrasslandPage extends SubdivisionPage { - - - private static final long serialVersionUID = -2022500980698210420L; - private AbstractWizardPage nextPage = new SettlementPage(); - - public GrasslandPage() { - super( LandUseCategory.G ); - } - - @Override - protected AbstractWizardPage getNextPage() { - return nextPage; - } - - - @Override - protected boolean isFinishAllowed() { - return false; - } - - @Override - protected Object[] getValues() { - return ManagementType.values(); - } - - @Override - protected String getLabel() { - return Messages.getString("GrasslandPage.0"); //$NON-NLS-1$ - } - -} +/******************************************************************************* + * Copyright (c) 2012 Gustav Karlsson . + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the GNU Public License v3.0 + * which accompanies this distribution, and is available at + * http://www.gnu.org/licenses/gpl.html + * + * Contributors: + * Gustav Karlsson - initial API and implementation + ******************************************************************************/ +package org.openforis.collect.earth.ipcc.view; + +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.GridLayout; +import java.awt.Insets; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.ContainerEvent; +import java.awt.event.ContainerListener; +import java.awt.event.KeyEvent; + +import javax.swing.AbstractButton; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JSeparator; + +import se.gustavkarlsson.gwiz.Wizard; + +/** + * A very simple Wizard implementation that suits the most basic needs. Extends {@link JFrame} and has + * navigation buttons at the bottom. + * + * @author Gustav Karlsson + */ +public class JDialogWizard extends JDialog implements Wizard { + private static final long serialVersionUID = 2818290889333414291L; + + private static final Dimension defaultminimumSize = new Dimension(500, 500); + + private final JPanel wizardPageContainer = new JPanel(new GridLayout(1, 1)); + private final JButton cancelButton = new JButton(Messages.getString("JDialogWizard.0")); //$NON-NLS-1$ + private final JButton previousButton = new JButton(Messages.getString("JDialogWizard.1")); //$NON-NLS-1$ + private final JButton nextButton = new JButton(Messages.getString("JDialogWizard.2")); //$NON-NLS-1$ + private final JButton finishButton = new JButton(Messages.getString("JDialogWizard.3")); //$NON-NLS-1$ + + private boolean wizardFinished = false; + + /** + * Creates an JDialogWizard with a title and GraphicsConfiguration. + * + * @param title + * the title of the frame + * @param gc + * the GraphicsConfiguration of the frame + * @see JFrame + */ + public JDialogWizard(Frame owner, String title, boolean modal) { + super(owner, title, modal); + setupWizard(); + } + + /** + * Creates an JDialogWizard. + * + * @see JFrame + */ + public JDialogWizard() { + super(); + setupWizard(); + } + + /** + * Sets up wizard upon construction. + */ + private void setupWizard() { + setupComponents(); + layoutComponents(); + + setMinimumSize(defaultminimumSize); + + // Center on screen + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + int xPosition = (screenSize.width / 2) - (defaultminimumSize.width / 2); + int yPosition = (screenSize.height / 2) - (defaultminimumSize.height / 2); + setLocation(xPosition, yPosition); + + setDefaultCloseOperation(DISPOSE_ON_CLOSE); + } + + /** + * Sets up the components of the wizard with listeners and mnemonics. + */ + private void setupComponents() { + cancelButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + dispose(); + } + }); + + finishButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + //JOptionPane.showMessageDialog(getContentPane(), Messages.getString("JDialogWizard.4")); //$NON-NLS-1$ + wizardFinished = true; + dispose(); + } + }); + + cancelButton.setMnemonic(KeyEvent.VK_C); + previousButton.setMnemonic(KeyEvent.VK_P); + nextButton.setMnemonic(KeyEvent.VK_N); + finishButton.setMnemonic(KeyEvent.VK_F); + + wizardPageContainer.addContainerListener(new MinimumSizeAdjuster()); + } + + /** + * Lays out the components in the wizards content pane. + */ + private void layoutComponents() { + GridBagLayout layout = new GridBagLayout(); + layout.rowWeights = new double[]{1.0, 0.0, 0.0}; + layout.columnWeights = new double[]{1.0, 0.0, 0.0, 0.0, 0.0}; + layout.rowHeights = new int[] {0, 0, 0}; + layout.columnWidths = new int[] {0, 0, 0, 0, 0}; + getContentPane().setLayout(layout); + + GridBagConstraints wizardPageContainerConstraint = new GridBagConstraints(); + wizardPageContainerConstraint.gridwidth = 5; + wizardPageContainerConstraint.fill = GridBagConstraints.BOTH; + wizardPageContainerConstraint.gridx = 0; + wizardPageContainerConstraint.gridy = 0; + wizardPageContainerConstraint.insets = new Insets(5, 5, 5, 5); + getContentPane().add(wizardPageContainer, wizardPageContainerConstraint); + + GridBagConstraints separatorConstraints = new GridBagConstraints(); + separatorConstraints.gridwidth = 5; + separatorConstraints.fill = GridBagConstraints.HORIZONTAL; + separatorConstraints.gridx = 0; + separatorConstraints.gridy = 1; + separatorConstraints.insets = new Insets(5, 5, 5, 5); + getContentPane().add(new JSeparator(), separatorConstraints); + + GridBagConstraints cancelButtonConstraints = new GridBagConstraints(); + cancelButtonConstraints.gridx = 1; + cancelButtonConstraints.gridy = 2; + cancelButtonConstraints.insets = new Insets(5, 5, 5, 0); + getContentPane().add(cancelButton, cancelButtonConstraints); + + GridBagConstraints previousButtonConstraints = new GridBagConstraints(); + previousButtonConstraints.gridx = 2; + previousButtonConstraints.gridy = 2; + previousButtonConstraints.insets = new Insets(5, 5, 5, 0); + getContentPane().add(previousButton, previousButtonConstraints); + + GridBagConstraints nextButtonConstraints = new GridBagConstraints(); + nextButtonConstraints.gridx = 3; + nextButtonConstraints.gridy = 2; + nextButtonConstraints.insets = new Insets(5, 5, 5, 0); + getContentPane().add(nextButton, nextButtonConstraints); + + GridBagConstraints finishButtonConstraints = new GridBagConstraints(); + finishButtonConstraints.gridx = 4; + finishButtonConstraints.gridy = 2; + finishButtonConstraints.insets = new Insets(5, 5, 5, 5); + getContentPane().add(finishButton, finishButtonConstraints); + } + + @Override + public JPanel getWizardPageContainer() { + return wizardPageContainer; + } + + @Override + public AbstractButton getCancelButton() { + return cancelButton; + } + + @Override + public JButton getPreviousButton() { + return previousButton; + } + + @Override + public JButton getNextButton() { + return nextButton; + } + + @Override + public JButton getFinishButton() { + return finishButton; + } + + private class MinimumSizeAdjuster implements ContainerListener { + + @Override + public void componentAdded(ContainerEvent e) { + Dimension currentSize = getSize(); + Dimension preferredSize = getPreferredSize(); + + Dimension newSize = new Dimension(currentSize); + newSize.width = Math.max(currentSize.width, preferredSize.width); + newSize.height = Math.max(currentSize.height, preferredSize.height); + + setMinimumSize(newSize); + } + + @Override + public void componentRemoved(ContainerEvent e) { + } + + } + + public boolean isWizardFinished() { + return wizardFinished; + } + +} From 45a79e07bdcf8b568973be2678802eab73d8bc41 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:14 +0100 Subject: [PATCH 1396/1620] New translations JDialogWizard.java (English) --- .../earth/app/view/Messages_en.properties | 264 +++++++++++++++--- 1 file changed, 225 insertions(+), 39 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 3b8a2af7e3..71cc316cbd 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,39 +1,225 @@ -package org.openforis.collect.earth.ipcc.view; - -import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.ManagementType; - -import se.gustavkarlsson.gwiz.AbstractWizardPage; - -public class GrasslandPage extends SubdivisionPage { - - - private static final long serialVersionUID = -2022500980698210420L; - private AbstractWizardPage nextPage = new SettlementPage(); - - public GrasslandPage() { - super( LandUseCategory.G ); - } - - @Override - protected AbstractWizardPage getNextPage() { - return nextPage; - } - - - @Override - protected boolean isFinishAllowed() { - return false; - } - - @Override - protected Object[] getValues() { - return ManagementType.values(); - } - - @Override - protected String getLabel() { - return Messages.getString("GrasslandPage.0"); //$NON-NLS-1$ - } - -} +/******************************************************************************* + * Copyright (c) 2012 Gustav Karlsson . + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the GNU Public License v3.0 + * which accompanies this distribution, and is available at + * http://www.gnu.org/licenses/gpl.html + * + * Contributors: + * Gustav Karlsson - initial API and implementation + ******************************************************************************/ +package org.openforis.collect.earth.ipcc.view; + +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.GridLayout; +import java.awt.Insets; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.ContainerEvent; +import java.awt.event.ContainerListener; +import java.awt.event.KeyEvent; + +import javax.swing.AbstractButton; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JSeparator; + +import se.gustavkarlsson.gwiz.Wizard; + +/** + * A very simple Wizard implementation that suits the most basic needs. Extends {@link JFrame} and has + * navigation buttons at the bottom. + * + * @author Gustav Karlsson + */ +public class JDialogWizard extends JDialog implements Wizard { + private static final long serialVersionUID = 2818290889333414291L; + + private static final Dimension defaultminimumSize = new Dimension(500, 500); + + private final JPanel wizardPageContainer = new JPanel(new GridLayout(1, 1)); + private final JButton cancelButton = new JButton(Messages.getString("JDialogWizard.0")); //$NON-NLS-1$ + private final JButton previousButton = new JButton(Messages.getString("JDialogWizard.1")); //$NON-NLS-1$ + private final JButton nextButton = new JButton(Messages.getString("JDialogWizard.2")); //$NON-NLS-1$ + private final JButton finishButton = new JButton(Messages.getString("JDialogWizard.3")); //$NON-NLS-1$ + + private boolean wizardFinished = false; + + /** + * Creates an JDialogWizard with a title and GraphicsConfiguration. + * + * @param title + * the title of the frame + * @param gc + * the GraphicsConfiguration of the frame + * @see JFrame + */ + public JDialogWizard(Frame owner, String title, boolean modal) { + super(owner, title, modal); + setupWizard(); + } + + /** + * Creates an JDialogWizard. + * + * @see JFrame + */ + public JDialogWizard() { + super(); + setupWizard(); + } + + /** + * Sets up wizard upon construction. + */ + private void setupWizard() { + setupComponents(); + layoutComponents(); + + setMinimumSize(defaultminimumSize); + + // Center on screen + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + int xPosition = (screenSize.width / 2) - (defaultminimumSize.width / 2); + int yPosition = (screenSize.height / 2) - (defaultminimumSize.height / 2); + setLocation(xPosition, yPosition); + + setDefaultCloseOperation(DISPOSE_ON_CLOSE); + } + + /** + * Sets up the components of the wizard with listeners and mnemonics. + */ + private void setupComponents() { + cancelButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + dispose(); + } + }); + + finishButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + //JOptionPane.showMessageDialog(getContentPane(), Messages.getString("JDialogWizard.4")); //$NON-NLS-1$ + wizardFinished = true; + dispose(); + } + }); + + cancelButton.setMnemonic(KeyEvent.VK_C); + previousButton.setMnemonic(KeyEvent.VK_P); + nextButton.setMnemonic(KeyEvent.VK_N); + finishButton.setMnemonic(KeyEvent.VK_F); + + wizardPageContainer.addContainerListener(new MinimumSizeAdjuster()); + } + + /** + * Lays out the components in the wizards content pane. + */ + private void layoutComponents() { + GridBagLayout layout = new GridBagLayout(); + layout.rowWeights = new double[]{1.0, 0.0, 0.0}; + layout.columnWeights = new double[]{1.0, 0.0, 0.0, 0.0, 0.0}; + layout.rowHeights = new int[] {0, 0, 0}; + layout.columnWidths = new int[] {0, 0, 0, 0, 0}; + getContentPane().setLayout(layout); + + GridBagConstraints wizardPageContainerConstraint = new GridBagConstraints(); + wizardPageContainerConstraint.gridwidth = 5; + wizardPageContainerConstraint.fill = GridBagConstraints.BOTH; + wizardPageContainerConstraint.gridx = 0; + wizardPageContainerConstraint.gridy = 0; + wizardPageContainerConstraint.insets = new Insets(5, 5, 5, 5); + getContentPane().add(wizardPageContainer, wizardPageContainerConstraint); + + GridBagConstraints separatorConstraints = new GridBagConstraints(); + separatorConstraints.gridwidth = 5; + separatorConstraints.fill = GridBagConstraints.HORIZONTAL; + separatorConstraints.gridx = 0; + separatorConstraints.gridy = 1; + separatorConstraints.insets = new Insets(5, 5, 5, 5); + getContentPane().add(new JSeparator(), separatorConstraints); + + GridBagConstraints cancelButtonConstraints = new GridBagConstraints(); + cancelButtonConstraints.gridx = 1; + cancelButtonConstraints.gridy = 2; + cancelButtonConstraints.insets = new Insets(5, 5, 5, 0); + getContentPane().add(cancelButton, cancelButtonConstraints); + + GridBagConstraints previousButtonConstraints = new GridBagConstraints(); + previousButtonConstraints.gridx = 2; + previousButtonConstraints.gridy = 2; + previousButtonConstraints.insets = new Insets(5, 5, 5, 0); + getContentPane().add(previousButton, previousButtonConstraints); + + GridBagConstraints nextButtonConstraints = new GridBagConstraints(); + nextButtonConstraints.gridx = 3; + nextButtonConstraints.gridy = 2; + nextButtonConstraints.insets = new Insets(5, 5, 5, 0); + getContentPane().add(nextButton, nextButtonConstraints); + + GridBagConstraints finishButtonConstraints = new GridBagConstraints(); + finishButtonConstraints.gridx = 4; + finishButtonConstraints.gridy = 2; + finishButtonConstraints.insets = new Insets(5, 5, 5, 5); + getContentPane().add(finishButton, finishButtonConstraints); + } + + @Override + public JPanel getWizardPageContainer() { + return wizardPageContainer; + } + + @Override + public AbstractButton getCancelButton() { + return cancelButton; + } + + @Override + public JButton getPreviousButton() { + return previousButton; + } + + @Override + public JButton getNextButton() { + return nextButton; + } + + @Override + public JButton getFinishButton() { + return finishButton; + } + + private class MinimumSizeAdjuster implements ContainerListener { + + @Override + public void componentAdded(ContainerEvent e) { + Dimension currentSize = getSize(); + Dimension preferredSize = getPreferredSize(); + + Dimension newSize = new Dimension(currentSize); + newSize.width = Math.max(currentSize.width, preferredSize.width); + newSize.height = Math.max(currentSize.height, preferredSize.height); + + setMinimumSize(newSize); + } + + @Override + public void componentRemoved(ContainerEvent e) { + } + + } + + public boolean isWizardFinished() { + return wizardFinished; + } + +} From 17aa4c85e68146001a340ae7db8538468efc53cb Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:15 +0100 Subject: [PATCH 1397/1620] New translations Messages.java (French) --- .../earth/app/view/Messages_fr.properties | 246 ++---------------- 1 file changed, 21 insertions(+), 225 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 71cc316cbd..74599635a0 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,225 +1,21 @@ -/******************************************************************************* - * Copyright (c) 2012 Gustav Karlsson . - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0 - * which accompanies this distribution, and is available at - * http://www.gnu.org/licenses/gpl.html - * - * Contributors: - * Gustav Karlsson - initial API and implementation - ******************************************************************************/ -package org.openforis.collect.earth.ipcc.view; - -import java.awt.Dimension; -import java.awt.Frame; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.GridLayout; -import java.awt.Insets; -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.ContainerEvent; -import java.awt.event.ContainerListener; -import java.awt.event.KeyEvent; - -import javax.swing.AbstractButton; -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JPanel; -import javax.swing.JSeparator; - -import se.gustavkarlsson.gwiz.Wizard; - -/** - * A very simple Wizard implementation that suits the most basic needs. Extends {@link JFrame} and has - * navigation buttons at the bottom. - * - * @author Gustav Karlsson - */ -public class JDialogWizard extends JDialog implements Wizard { - private static final long serialVersionUID = 2818290889333414291L; - - private static final Dimension defaultminimumSize = new Dimension(500, 500); - - private final JPanel wizardPageContainer = new JPanel(new GridLayout(1, 1)); - private final JButton cancelButton = new JButton(Messages.getString("JDialogWizard.0")); //$NON-NLS-1$ - private final JButton previousButton = new JButton(Messages.getString("JDialogWizard.1")); //$NON-NLS-1$ - private final JButton nextButton = new JButton(Messages.getString("JDialogWizard.2")); //$NON-NLS-1$ - private final JButton finishButton = new JButton(Messages.getString("JDialogWizard.3")); //$NON-NLS-1$ - - private boolean wizardFinished = false; - - /** - * Creates an JDialogWizard with a title and GraphicsConfiguration. - * - * @param title - * the title of the frame - * @param gc - * the GraphicsConfiguration of the frame - * @see JFrame - */ - public JDialogWizard(Frame owner, String title, boolean modal) { - super(owner, title, modal); - setupWizard(); - } - - /** - * Creates an JDialogWizard. - * - * @see JFrame - */ - public JDialogWizard() { - super(); - setupWizard(); - } - - /** - * Sets up wizard upon construction. - */ - private void setupWizard() { - setupComponents(); - layoutComponents(); - - setMinimumSize(defaultminimumSize); - - // Center on screen - Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); - int xPosition = (screenSize.width / 2) - (defaultminimumSize.width / 2); - int yPosition = (screenSize.height / 2) - (defaultminimumSize.height / 2); - setLocation(xPosition, yPosition); - - setDefaultCloseOperation(DISPOSE_ON_CLOSE); - } - - /** - * Sets up the components of the wizard with listeners and mnemonics. - */ - private void setupComponents() { - cancelButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - dispose(); - } - }); - - finishButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - //JOptionPane.showMessageDialog(getContentPane(), Messages.getString("JDialogWizard.4")); //$NON-NLS-1$ - wizardFinished = true; - dispose(); - } - }); - - cancelButton.setMnemonic(KeyEvent.VK_C); - previousButton.setMnemonic(KeyEvent.VK_P); - nextButton.setMnemonic(KeyEvent.VK_N); - finishButton.setMnemonic(KeyEvent.VK_F); - - wizardPageContainer.addContainerListener(new MinimumSizeAdjuster()); - } - - /** - * Lays out the components in the wizards content pane. - */ - private void layoutComponents() { - GridBagLayout layout = new GridBagLayout(); - layout.rowWeights = new double[]{1.0, 0.0, 0.0}; - layout.columnWeights = new double[]{1.0, 0.0, 0.0, 0.0, 0.0}; - layout.rowHeights = new int[] {0, 0, 0}; - layout.columnWidths = new int[] {0, 0, 0, 0, 0}; - getContentPane().setLayout(layout); - - GridBagConstraints wizardPageContainerConstraint = new GridBagConstraints(); - wizardPageContainerConstraint.gridwidth = 5; - wizardPageContainerConstraint.fill = GridBagConstraints.BOTH; - wizardPageContainerConstraint.gridx = 0; - wizardPageContainerConstraint.gridy = 0; - wizardPageContainerConstraint.insets = new Insets(5, 5, 5, 5); - getContentPane().add(wizardPageContainer, wizardPageContainerConstraint); - - GridBagConstraints separatorConstraints = new GridBagConstraints(); - separatorConstraints.gridwidth = 5; - separatorConstraints.fill = GridBagConstraints.HORIZONTAL; - separatorConstraints.gridx = 0; - separatorConstraints.gridy = 1; - separatorConstraints.insets = new Insets(5, 5, 5, 5); - getContentPane().add(new JSeparator(), separatorConstraints); - - GridBagConstraints cancelButtonConstraints = new GridBagConstraints(); - cancelButtonConstraints.gridx = 1; - cancelButtonConstraints.gridy = 2; - cancelButtonConstraints.insets = new Insets(5, 5, 5, 0); - getContentPane().add(cancelButton, cancelButtonConstraints); - - GridBagConstraints previousButtonConstraints = new GridBagConstraints(); - previousButtonConstraints.gridx = 2; - previousButtonConstraints.gridy = 2; - previousButtonConstraints.insets = new Insets(5, 5, 5, 0); - getContentPane().add(previousButton, previousButtonConstraints); - - GridBagConstraints nextButtonConstraints = new GridBagConstraints(); - nextButtonConstraints.gridx = 3; - nextButtonConstraints.gridy = 2; - nextButtonConstraints.insets = new Insets(5, 5, 5, 0); - getContentPane().add(nextButton, nextButtonConstraints); - - GridBagConstraints finishButtonConstraints = new GridBagConstraints(); - finishButtonConstraints.gridx = 4; - finishButtonConstraints.gridy = 2; - finishButtonConstraints.insets = new Insets(5, 5, 5, 5); - getContentPane().add(finishButton, finishButtonConstraints); - } - - @Override - public JPanel getWizardPageContainer() { - return wizardPageContainer; - } - - @Override - public AbstractButton getCancelButton() { - return cancelButton; - } - - @Override - public JButton getPreviousButton() { - return previousButton; - } - - @Override - public JButton getNextButton() { - return nextButton; - } - - @Override - public JButton getFinishButton() { - return finishButton; - } - - private class MinimumSizeAdjuster implements ContainerListener { - - @Override - public void componentAdded(ContainerEvent e) { - Dimension currentSize = getSize(); - Dimension preferredSize = getPreferredSize(); - - Dimension newSize = new Dimension(currentSize); - newSize.width = Math.max(currentSize.width, preferredSize.width); - newSize.height = Math.max(currentSize.height, preferredSize.height); - - setMinimumSize(newSize); - } - - @Override - public void componentRemoved(ContainerEvent e) { - } - - } - - public boolean isWizardFinished() { - return wizardFinished; - } - -} +package org.openforis.collect.earth.ipcc.view; + +import java.util.MissingResourceException; +import java.util.ResourceBundle; + +public class Messages { + private static final String BUNDLE_NAME = "org.openforis.collect.earth.ipcc.view.Messages"; //$NON-NLS-1$ + + private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME); + + private Messages() { + } + + public static String getString(String key) { + try { + return RESOURCE_BUNDLE.getString(key); + } catch (MissingResourceException e) { + return '!' + key + '!'; + } + } +} From 5a255b4cc27d51a63b29a47aed565683cfac5624 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:16 +0100 Subject: [PATCH 1398/1620] New translations Messages.java (Spanish) --- .../earth/app/view/Messages_es.properties | 246 ++---------------- 1 file changed, 21 insertions(+), 225 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 71cc316cbd..74599635a0 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,225 +1,21 @@ -/******************************************************************************* - * Copyright (c) 2012 Gustav Karlsson . - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0 - * which accompanies this distribution, and is available at - * http://www.gnu.org/licenses/gpl.html - * - * Contributors: - * Gustav Karlsson - initial API and implementation - ******************************************************************************/ -package org.openforis.collect.earth.ipcc.view; - -import java.awt.Dimension; -import java.awt.Frame; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.GridLayout; -import java.awt.Insets; -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.ContainerEvent; -import java.awt.event.ContainerListener; -import java.awt.event.KeyEvent; - -import javax.swing.AbstractButton; -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JPanel; -import javax.swing.JSeparator; - -import se.gustavkarlsson.gwiz.Wizard; - -/** - * A very simple Wizard implementation that suits the most basic needs. Extends {@link JFrame} and has - * navigation buttons at the bottom. - * - * @author Gustav Karlsson - */ -public class JDialogWizard extends JDialog implements Wizard { - private static final long serialVersionUID = 2818290889333414291L; - - private static final Dimension defaultminimumSize = new Dimension(500, 500); - - private final JPanel wizardPageContainer = new JPanel(new GridLayout(1, 1)); - private final JButton cancelButton = new JButton(Messages.getString("JDialogWizard.0")); //$NON-NLS-1$ - private final JButton previousButton = new JButton(Messages.getString("JDialogWizard.1")); //$NON-NLS-1$ - private final JButton nextButton = new JButton(Messages.getString("JDialogWizard.2")); //$NON-NLS-1$ - private final JButton finishButton = new JButton(Messages.getString("JDialogWizard.3")); //$NON-NLS-1$ - - private boolean wizardFinished = false; - - /** - * Creates an JDialogWizard with a title and GraphicsConfiguration. - * - * @param title - * the title of the frame - * @param gc - * the GraphicsConfiguration of the frame - * @see JFrame - */ - public JDialogWizard(Frame owner, String title, boolean modal) { - super(owner, title, modal); - setupWizard(); - } - - /** - * Creates an JDialogWizard. - * - * @see JFrame - */ - public JDialogWizard() { - super(); - setupWizard(); - } - - /** - * Sets up wizard upon construction. - */ - private void setupWizard() { - setupComponents(); - layoutComponents(); - - setMinimumSize(defaultminimumSize); - - // Center on screen - Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); - int xPosition = (screenSize.width / 2) - (defaultminimumSize.width / 2); - int yPosition = (screenSize.height / 2) - (defaultminimumSize.height / 2); - setLocation(xPosition, yPosition); - - setDefaultCloseOperation(DISPOSE_ON_CLOSE); - } - - /** - * Sets up the components of the wizard with listeners and mnemonics. - */ - private void setupComponents() { - cancelButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - dispose(); - } - }); - - finishButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - //JOptionPane.showMessageDialog(getContentPane(), Messages.getString("JDialogWizard.4")); //$NON-NLS-1$ - wizardFinished = true; - dispose(); - } - }); - - cancelButton.setMnemonic(KeyEvent.VK_C); - previousButton.setMnemonic(KeyEvent.VK_P); - nextButton.setMnemonic(KeyEvent.VK_N); - finishButton.setMnemonic(KeyEvent.VK_F); - - wizardPageContainer.addContainerListener(new MinimumSizeAdjuster()); - } - - /** - * Lays out the components in the wizards content pane. - */ - private void layoutComponents() { - GridBagLayout layout = new GridBagLayout(); - layout.rowWeights = new double[]{1.0, 0.0, 0.0}; - layout.columnWeights = new double[]{1.0, 0.0, 0.0, 0.0, 0.0}; - layout.rowHeights = new int[] {0, 0, 0}; - layout.columnWidths = new int[] {0, 0, 0, 0, 0}; - getContentPane().setLayout(layout); - - GridBagConstraints wizardPageContainerConstraint = new GridBagConstraints(); - wizardPageContainerConstraint.gridwidth = 5; - wizardPageContainerConstraint.fill = GridBagConstraints.BOTH; - wizardPageContainerConstraint.gridx = 0; - wizardPageContainerConstraint.gridy = 0; - wizardPageContainerConstraint.insets = new Insets(5, 5, 5, 5); - getContentPane().add(wizardPageContainer, wizardPageContainerConstraint); - - GridBagConstraints separatorConstraints = new GridBagConstraints(); - separatorConstraints.gridwidth = 5; - separatorConstraints.fill = GridBagConstraints.HORIZONTAL; - separatorConstraints.gridx = 0; - separatorConstraints.gridy = 1; - separatorConstraints.insets = new Insets(5, 5, 5, 5); - getContentPane().add(new JSeparator(), separatorConstraints); - - GridBagConstraints cancelButtonConstraints = new GridBagConstraints(); - cancelButtonConstraints.gridx = 1; - cancelButtonConstraints.gridy = 2; - cancelButtonConstraints.insets = new Insets(5, 5, 5, 0); - getContentPane().add(cancelButton, cancelButtonConstraints); - - GridBagConstraints previousButtonConstraints = new GridBagConstraints(); - previousButtonConstraints.gridx = 2; - previousButtonConstraints.gridy = 2; - previousButtonConstraints.insets = new Insets(5, 5, 5, 0); - getContentPane().add(previousButton, previousButtonConstraints); - - GridBagConstraints nextButtonConstraints = new GridBagConstraints(); - nextButtonConstraints.gridx = 3; - nextButtonConstraints.gridy = 2; - nextButtonConstraints.insets = new Insets(5, 5, 5, 0); - getContentPane().add(nextButton, nextButtonConstraints); - - GridBagConstraints finishButtonConstraints = new GridBagConstraints(); - finishButtonConstraints.gridx = 4; - finishButtonConstraints.gridy = 2; - finishButtonConstraints.insets = new Insets(5, 5, 5, 5); - getContentPane().add(finishButton, finishButtonConstraints); - } - - @Override - public JPanel getWizardPageContainer() { - return wizardPageContainer; - } - - @Override - public AbstractButton getCancelButton() { - return cancelButton; - } - - @Override - public JButton getPreviousButton() { - return previousButton; - } - - @Override - public JButton getNextButton() { - return nextButton; - } - - @Override - public JButton getFinishButton() { - return finishButton; - } - - private class MinimumSizeAdjuster implements ContainerListener { - - @Override - public void componentAdded(ContainerEvent e) { - Dimension currentSize = getSize(); - Dimension preferredSize = getPreferredSize(); - - Dimension newSize = new Dimension(currentSize); - newSize.width = Math.max(currentSize.width, preferredSize.width); - newSize.height = Math.max(currentSize.height, preferredSize.height); - - setMinimumSize(newSize); - } - - @Override - public void componentRemoved(ContainerEvent e) { - } - - } - - public boolean isWizardFinished() { - return wizardFinished; - } - -} +package org.openforis.collect.earth.ipcc.view; + +import java.util.MissingResourceException; +import java.util.ResourceBundle; + +public class Messages { + private static final String BUNDLE_NAME = "org.openforis.collect.earth.ipcc.view.Messages"; //$NON-NLS-1$ + + private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME); + + private Messages() { + } + + public static String getString(String key) { + try { + return RESOURCE_BUNDLE.getString(key); + } catch (MissingResourceException e) { + return '!' + key + '!'; + } + } +} From fdefea309d68790925762982d3b94a402a887874 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:17 +0100 Subject: [PATCH 1399/1620] New translations Messages.java (English) --- .../earth/app/view/Messages_en.properties | 246 ++---------------- 1 file changed, 21 insertions(+), 225 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 71cc316cbd..74599635a0 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,225 +1,21 @@ -/******************************************************************************* - * Copyright (c) 2012 Gustav Karlsson . - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0 - * which accompanies this distribution, and is available at - * http://www.gnu.org/licenses/gpl.html - * - * Contributors: - * Gustav Karlsson - initial API and implementation - ******************************************************************************/ -package org.openforis.collect.earth.ipcc.view; - -import java.awt.Dimension; -import java.awt.Frame; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.GridLayout; -import java.awt.Insets; -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.ContainerEvent; -import java.awt.event.ContainerListener; -import java.awt.event.KeyEvent; - -import javax.swing.AbstractButton; -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JPanel; -import javax.swing.JSeparator; - -import se.gustavkarlsson.gwiz.Wizard; - -/** - * A very simple Wizard implementation that suits the most basic needs. Extends {@link JFrame} and has - * navigation buttons at the bottom. - * - * @author Gustav Karlsson - */ -public class JDialogWizard extends JDialog implements Wizard { - private static final long serialVersionUID = 2818290889333414291L; - - private static final Dimension defaultminimumSize = new Dimension(500, 500); - - private final JPanel wizardPageContainer = new JPanel(new GridLayout(1, 1)); - private final JButton cancelButton = new JButton(Messages.getString("JDialogWizard.0")); //$NON-NLS-1$ - private final JButton previousButton = new JButton(Messages.getString("JDialogWizard.1")); //$NON-NLS-1$ - private final JButton nextButton = new JButton(Messages.getString("JDialogWizard.2")); //$NON-NLS-1$ - private final JButton finishButton = new JButton(Messages.getString("JDialogWizard.3")); //$NON-NLS-1$ - - private boolean wizardFinished = false; - - /** - * Creates an JDialogWizard with a title and GraphicsConfiguration. - * - * @param title - * the title of the frame - * @param gc - * the GraphicsConfiguration of the frame - * @see JFrame - */ - public JDialogWizard(Frame owner, String title, boolean modal) { - super(owner, title, modal); - setupWizard(); - } - - /** - * Creates an JDialogWizard. - * - * @see JFrame - */ - public JDialogWizard() { - super(); - setupWizard(); - } - - /** - * Sets up wizard upon construction. - */ - private void setupWizard() { - setupComponents(); - layoutComponents(); - - setMinimumSize(defaultminimumSize); - - // Center on screen - Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); - int xPosition = (screenSize.width / 2) - (defaultminimumSize.width / 2); - int yPosition = (screenSize.height / 2) - (defaultminimumSize.height / 2); - setLocation(xPosition, yPosition); - - setDefaultCloseOperation(DISPOSE_ON_CLOSE); - } - - /** - * Sets up the components of the wizard with listeners and mnemonics. - */ - private void setupComponents() { - cancelButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - dispose(); - } - }); - - finishButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - //JOptionPane.showMessageDialog(getContentPane(), Messages.getString("JDialogWizard.4")); //$NON-NLS-1$ - wizardFinished = true; - dispose(); - } - }); - - cancelButton.setMnemonic(KeyEvent.VK_C); - previousButton.setMnemonic(KeyEvent.VK_P); - nextButton.setMnemonic(KeyEvent.VK_N); - finishButton.setMnemonic(KeyEvent.VK_F); - - wizardPageContainer.addContainerListener(new MinimumSizeAdjuster()); - } - - /** - * Lays out the components in the wizards content pane. - */ - private void layoutComponents() { - GridBagLayout layout = new GridBagLayout(); - layout.rowWeights = new double[]{1.0, 0.0, 0.0}; - layout.columnWeights = new double[]{1.0, 0.0, 0.0, 0.0, 0.0}; - layout.rowHeights = new int[] {0, 0, 0}; - layout.columnWidths = new int[] {0, 0, 0, 0, 0}; - getContentPane().setLayout(layout); - - GridBagConstraints wizardPageContainerConstraint = new GridBagConstraints(); - wizardPageContainerConstraint.gridwidth = 5; - wizardPageContainerConstraint.fill = GridBagConstraints.BOTH; - wizardPageContainerConstraint.gridx = 0; - wizardPageContainerConstraint.gridy = 0; - wizardPageContainerConstraint.insets = new Insets(5, 5, 5, 5); - getContentPane().add(wizardPageContainer, wizardPageContainerConstraint); - - GridBagConstraints separatorConstraints = new GridBagConstraints(); - separatorConstraints.gridwidth = 5; - separatorConstraints.fill = GridBagConstraints.HORIZONTAL; - separatorConstraints.gridx = 0; - separatorConstraints.gridy = 1; - separatorConstraints.insets = new Insets(5, 5, 5, 5); - getContentPane().add(new JSeparator(), separatorConstraints); - - GridBagConstraints cancelButtonConstraints = new GridBagConstraints(); - cancelButtonConstraints.gridx = 1; - cancelButtonConstraints.gridy = 2; - cancelButtonConstraints.insets = new Insets(5, 5, 5, 0); - getContentPane().add(cancelButton, cancelButtonConstraints); - - GridBagConstraints previousButtonConstraints = new GridBagConstraints(); - previousButtonConstraints.gridx = 2; - previousButtonConstraints.gridy = 2; - previousButtonConstraints.insets = new Insets(5, 5, 5, 0); - getContentPane().add(previousButton, previousButtonConstraints); - - GridBagConstraints nextButtonConstraints = new GridBagConstraints(); - nextButtonConstraints.gridx = 3; - nextButtonConstraints.gridy = 2; - nextButtonConstraints.insets = new Insets(5, 5, 5, 0); - getContentPane().add(nextButton, nextButtonConstraints); - - GridBagConstraints finishButtonConstraints = new GridBagConstraints(); - finishButtonConstraints.gridx = 4; - finishButtonConstraints.gridy = 2; - finishButtonConstraints.insets = new Insets(5, 5, 5, 5); - getContentPane().add(finishButton, finishButtonConstraints); - } - - @Override - public JPanel getWizardPageContainer() { - return wizardPageContainer; - } - - @Override - public AbstractButton getCancelButton() { - return cancelButton; - } - - @Override - public JButton getPreviousButton() { - return previousButton; - } - - @Override - public JButton getNextButton() { - return nextButton; - } - - @Override - public JButton getFinishButton() { - return finishButton; - } - - private class MinimumSizeAdjuster implements ContainerListener { - - @Override - public void componentAdded(ContainerEvent e) { - Dimension currentSize = getSize(); - Dimension preferredSize = getPreferredSize(); - - Dimension newSize = new Dimension(currentSize); - newSize.width = Math.max(currentSize.width, preferredSize.width); - newSize.height = Math.max(currentSize.height, preferredSize.height); - - setMinimumSize(newSize); - } - - @Override - public void componentRemoved(ContainerEvent e) { - } - - } - - public boolean isWizardFinished() { - return wizardFinished; - } - -} +package org.openforis.collect.earth.ipcc.view; + +import java.util.MissingResourceException; +import java.util.ResourceBundle; + +public class Messages { + private static final String BUNDLE_NAME = "org.openforis.collect.earth.ipcc.view.Messages"; //$NON-NLS-1$ + + private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME); + + private Messages() { + } + + public static String getString(String key) { + try { + return RESOURCE_BUNDLE.getString(key); + } catch (MissingResourceException e) { + return '!' + key + '!'; + } + } +} From fdcaa2b44a10eaee6e949dddb04a6d768e740b42 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:18 +0100 Subject: [PATCH 1400/1620] New translations SubdivisionPage.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 330 ++++++------------ 1 file changed, 105 insertions(+), 225 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 71cc316cbd..903c70789d 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,225 +1,105 @@ -/******************************************************************************* - * Copyright (c) 2012 Gustav Karlsson . - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0 - * which accompanies this distribution, and is available at - * http://www.gnu.org/licenses/gpl.html - * - * Contributors: - * Gustav Karlsson - initial API and implementation - ******************************************************************************/ -package org.openforis.collect.earth.ipcc.view; - -import java.awt.Dimension; -import java.awt.Frame; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.GridLayout; -import java.awt.Insets; -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.ContainerEvent; -import java.awt.event.ContainerListener; -import java.awt.event.KeyEvent; - -import javax.swing.AbstractButton; -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JPanel; -import javax.swing.JSeparator; - -import se.gustavkarlsson.gwiz.Wizard; - -/** - * A very simple Wizard implementation that suits the most basic needs. Extends {@link JFrame} and has - * navigation buttons at the bottom. - * - * @author Gustav Karlsson - */ -public class JDialogWizard extends JDialog implements Wizard { - private static final long serialVersionUID = 2818290889333414291L; - - private static final Dimension defaultminimumSize = new Dimension(500, 500); - - private final JPanel wizardPageContainer = new JPanel(new GridLayout(1, 1)); - private final JButton cancelButton = new JButton(Messages.getString("JDialogWizard.0")); //$NON-NLS-1$ - private final JButton previousButton = new JButton(Messages.getString("JDialogWizard.1")); //$NON-NLS-1$ - private final JButton nextButton = new JButton(Messages.getString("JDialogWizard.2")); //$NON-NLS-1$ - private final JButton finishButton = new JButton(Messages.getString("JDialogWizard.3")); //$NON-NLS-1$ - - private boolean wizardFinished = false; - - /** - * Creates an JDialogWizard with a title and GraphicsConfiguration. - * - * @param title - * the title of the frame - * @param gc - * the GraphicsConfiguration of the frame - * @see JFrame - */ - public JDialogWizard(Frame owner, String title, boolean modal) { - super(owner, title, modal); - setupWizard(); - } - - /** - * Creates an JDialogWizard. - * - * @see JFrame - */ - public JDialogWizard() { - super(); - setupWizard(); - } - - /** - * Sets up wizard upon construction. - */ - private void setupWizard() { - setupComponents(); - layoutComponents(); - - setMinimumSize(defaultminimumSize); - - // Center on screen - Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); - int xPosition = (screenSize.width / 2) - (defaultminimumSize.width / 2); - int yPosition = (screenSize.height / 2) - (defaultminimumSize.height / 2); - setLocation(xPosition, yPosition); - - setDefaultCloseOperation(DISPOSE_ON_CLOSE); - } - - /** - * Sets up the components of the wizard with listeners and mnemonics. - */ - private void setupComponents() { - cancelButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - dispose(); - } - }); - - finishButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - //JOptionPane.showMessageDialog(getContentPane(), Messages.getString("JDialogWizard.4")); //$NON-NLS-1$ - wizardFinished = true; - dispose(); - } - }); - - cancelButton.setMnemonic(KeyEvent.VK_C); - previousButton.setMnemonic(KeyEvent.VK_P); - nextButton.setMnemonic(KeyEvent.VK_N); - finishButton.setMnemonic(KeyEvent.VK_F); - - wizardPageContainer.addContainerListener(new MinimumSizeAdjuster()); - } - - /** - * Lays out the components in the wizards content pane. - */ - private void layoutComponents() { - GridBagLayout layout = new GridBagLayout(); - layout.rowWeights = new double[]{1.0, 0.0, 0.0}; - layout.columnWeights = new double[]{1.0, 0.0, 0.0, 0.0, 0.0}; - layout.rowHeights = new int[] {0, 0, 0}; - layout.columnWidths = new int[] {0, 0, 0, 0, 0}; - getContentPane().setLayout(layout); - - GridBagConstraints wizardPageContainerConstraint = new GridBagConstraints(); - wizardPageContainerConstraint.gridwidth = 5; - wizardPageContainerConstraint.fill = GridBagConstraints.BOTH; - wizardPageContainerConstraint.gridx = 0; - wizardPageContainerConstraint.gridy = 0; - wizardPageContainerConstraint.insets = new Insets(5, 5, 5, 5); - getContentPane().add(wizardPageContainer, wizardPageContainerConstraint); - - GridBagConstraints separatorConstraints = new GridBagConstraints(); - separatorConstraints.gridwidth = 5; - separatorConstraints.fill = GridBagConstraints.HORIZONTAL; - separatorConstraints.gridx = 0; - separatorConstraints.gridy = 1; - separatorConstraints.insets = new Insets(5, 5, 5, 5); - getContentPane().add(new JSeparator(), separatorConstraints); - - GridBagConstraints cancelButtonConstraints = new GridBagConstraints(); - cancelButtonConstraints.gridx = 1; - cancelButtonConstraints.gridy = 2; - cancelButtonConstraints.insets = new Insets(5, 5, 5, 0); - getContentPane().add(cancelButton, cancelButtonConstraints); - - GridBagConstraints previousButtonConstraints = new GridBagConstraints(); - previousButtonConstraints.gridx = 2; - previousButtonConstraints.gridy = 2; - previousButtonConstraints.insets = new Insets(5, 5, 5, 0); - getContentPane().add(previousButton, previousButtonConstraints); - - GridBagConstraints nextButtonConstraints = new GridBagConstraints(); - nextButtonConstraints.gridx = 3; - nextButtonConstraints.gridy = 2; - nextButtonConstraints.insets = new Insets(5, 5, 5, 0); - getContentPane().add(nextButton, nextButtonConstraints); - - GridBagConstraints finishButtonConstraints = new GridBagConstraints(); - finishButtonConstraints.gridx = 4; - finishButtonConstraints.gridy = 2; - finishButtonConstraints.insets = new Insets(5, 5, 5, 5); - getContentPane().add(finishButton, finishButtonConstraints); - } - - @Override - public JPanel getWizardPageContainer() { - return wizardPageContainer; - } - - @Override - public AbstractButton getCancelButton() { - return cancelButton; - } - - @Override - public JButton getPreviousButton() { - return previousButton; - } - - @Override - public JButton getNextButton() { - return nextButton; - } - - @Override - public JButton getFinishButton() { - return finishButton; - } - - private class MinimumSizeAdjuster implements ContainerListener { - - @Override - public void componentAdded(ContainerEvent e) { - Dimension currentSize = getSize(); - Dimension preferredSize = getPreferredSize(); - - Dimension newSize = new Dimension(currentSize); - newSize.width = Math.max(currentSize.width, preferredSize.width); - newSize.height = Math.max(currentSize.height, preferredSize.height); - - setMinimumSize(newSize); - } - - @Override - public void componentRemoved(ContainerEvent e) { - } - - } - - public boolean isWizardFinished() { - return wizardFinished; - } - -} +package org.openforis.collect.earth.ipcc.view; + +import java.awt.Dimension; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.util.List; + +import javax.swing.JComboBox; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.border.BevelBorder; +import javax.swing.border.Border; +import javax.swing.border.TitledBorder; + +import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; +import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; + +import se.gustavkarlsson.gwiz.AbstractWizardPage; + +public abstract class SubdivisionPage extends AbstractWizardPage { + + public SubdivisionPage( LandUseCategory category) { + + List> subdivisionsInCategory = LandUseSubdivisionUtils.getSubdivisionsByCategory( category ); + + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + JPanel contentPane = new JPanel(new GridBagLayout()); + JScrollPane scrollPane = new JScrollPane(contentPane); + scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + scrollPane.setBounds(50, 30, 300, 50); + scrollPane.setPreferredSize(new Dimension(450, 350)); + + final Border border = new TitledBorder( + new BevelBorder(BevelBorder.LOWERED), + getLabel()); + setBorder(border); + + for (LandUseSubdivision subdiv : subdivisionsInCategory) { + + constraints.gridx = 0; + + JLabel labelCode = new JLabel( subdiv.getCode() ); + contentPane.add(labelCode, constraints); + + constraints.gridx = 1; + + JLabel labelName = new JLabel( subdiv.getName()); + contentPane.add(labelName, constraints); + + constraints.gridx = 2; + JComboBox mgmtType = new JComboBox(getValues()); + mgmtType.setSelectedItem( subdiv.getType() ); + contentPane.add(mgmtType, constraints); + mgmtType.addActionListener( e-> + LandUseSubdivisionUtils.setSubdivisionType( subdiv, mgmtType.getSelectedItem() ) + ); + + constraints.gridy++; + } + + this.add(scrollPane); + + + + } + + + protected abstract String getLabel(); + + + protected abstract Object[] getValues(); + + + @Override + protected boolean isCancelAllowed() { + return false; + } + + @Override + protected boolean isPreviousAllowed() { + return true; + } + + @Override + protected boolean isNextAllowed() { + return true; + } + + @Override + protected boolean isFinishAllowed() { + return false; + } + +} From 9da475a4709c0453f302ef8129330870dadfb813 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:19 +0100 Subject: [PATCH 1401/1620] New translations OtherlandPage.java (French) --- .../earth/app/view/Messages_fr.properties | 41 +++++++++++++------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 74599635a0..005a6f2fdd 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,21 +1,38 @@ package org.openforis.collect.earth.ipcc.view; -import java.util.MissingResourceException; -import java.util.ResourceBundle; +import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import org.openforis.collect.earth.ipcc.model.ManagementType; -public class Messages { - private static final String BUNDLE_NAME = "org.openforis.collect.earth.ipcc.view.Messages"; //$NON-NLS-1$ +import se.gustavkarlsson.gwiz.AbstractWizardPage; - private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME); +public class OtherlandPage extends SubdivisionPage { - private Messages() { + private static final long serialVersionUID = -7092466238152990994L; + //private AbstractWizardPage nextPage; + + public OtherlandPage() { + super( LandUseCategory.O ); } - public static String getString(String key) { - try { - return RESOURCE_BUNDLE.getString(key); - } catch (MissingResourceException e) { - return '!' + key + '!'; - } + @Override + protected AbstractWizardPage getNextPage() { + return null; } + + + @Override + protected boolean isFinishAllowed() { + return true; + } + + @Override + protected Object[] getValues() { + return ManagementType.values(); + } + + @Override + protected String getLabel() { + return Messages.getString("OtherlandPage.0"); //$NON-NLS-1$ + } + } From f957ebdb5579e623af17717f96073e1dfe07823b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:20 +0100 Subject: [PATCH 1402/1620] New translations OtherlandPage.java (Spanish) --- .../earth/app/view/Messages_es.properties | 41 +++++++++++++------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 74599635a0..005a6f2fdd 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,21 +1,38 @@ package org.openforis.collect.earth.ipcc.view; -import java.util.MissingResourceException; -import java.util.ResourceBundle; +import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import org.openforis.collect.earth.ipcc.model.ManagementType; -public class Messages { - private static final String BUNDLE_NAME = "org.openforis.collect.earth.ipcc.view.Messages"; //$NON-NLS-1$ +import se.gustavkarlsson.gwiz.AbstractWizardPage; - private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME); +public class OtherlandPage extends SubdivisionPage { - private Messages() { + private static final long serialVersionUID = -7092466238152990994L; + //private AbstractWizardPage nextPage; + + public OtherlandPage() { + super( LandUseCategory.O ); } - public static String getString(String key) { - try { - return RESOURCE_BUNDLE.getString(key); - } catch (MissingResourceException e) { - return '!' + key + '!'; - } + @Override + protected AbstractWizardPage getNextPage() { + return null; } + + + @Override + protected boolean isFinishAllowed() { + return true; + } + + @Override + protected Object[] getValues() { + return ManagementType.values(); + } + + @Override + protected String getLabel() { + return Messages.getString("OtherlandPage.0"); //$NON-NLS-1$ + } + } From b62e92d4459e9525dd9ec23d4004ee793b0d125d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:21 +0100 Subject: [PATCH 1403/1620] New translations OtherlandPage.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 97 +++---------------- 1 file changed, 15 insertions(+), 82 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 903c70789d..005a6f2fdd 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,105 +1,38 @@ package org.openforis.collect.earth.ipcc.view; -import java.awt.Dimension; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.util.List; - -import javax.swing.JComboBox; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.border.BevelBorder; -import javax.swing.border.Border; -import javax.swing.border.TitledBorder; - -import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +import org.openforis.collect.earth.ipcc.model.ManagementType; import se.gustavkarlsson.gwiz.AbstractWizardPage; -public abstract class SubdivisionPage extends AbstractWizardPage { - - public SubdivisionPage( LandUseCategory category) { - - List> subdivisionsInCategory = LandUseSubdivisionUtils.getSubdivisionsByCategory( category ); - - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - JPanel contentPane = new JPanel(new GridBagLayout()); - JScrollPane scrollPane = new JScrollPane(contentPane); - scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - scrollPane.setBounds(50, 30, 300, 50); - scrollPane.setPreferredSize(new Dimension(450, 350)); - - final Border border = new TitledBorder( - new BevelBorder(BevelBorder.LOWERED), - getLabel()); - setBorder(border); - - for (LandUseSubdivision subdiv : subdivisionsInCategory) { - - constraints.gridx = 0; - - JLabel labelCode = new JLabel( subdiv.getCode() ); - contentPane.add(labelCode, constraints); - - constraints.gridx = 1; - - JLabel labelName = new JLabel( subdiv.getName()); - contentPane.add(labelName, constraints); - - constraints.gridx = 2; - JComboBox mgmtType = new JComboBox(getValues()); - mgmtType.setSelectedItem( subdiv.getType() ); - contentPane.add(mgmtType, constraints); - mgmtType.addActionListener( e-> - LandUseSubdivisionUtils.setSubdivisionType( subdiv, mgmtType.getSelectedItem() ) - ); - - constraints.gridy++; - } - - this.add(scrollPane); - - +public class OtherlandPage extends SubdivisionPage { + private static final long serialVersionUID = -7092466238152990994L; + //private AbstractWizardPage nextPage; + + public OtherlandPage() { + super( LandUseCategory.O ); } - - protected abstract String getLabel(); - - - protected abstract Object[] getValues(); - - @Override - protected boolean isCancelAllowed() { - return false; + protected AbstractWizardPage getNextPage() { + return null; } + @Override - protected boolean isPreviousAllowed() { + protected boolean isFinishAllowed() { return true; } @Override - protected boolean isNextAllowed() { - return true; + protected Object[] getValues() { + return ManagementType.values(); } @Override - protected boolean isFinishAllowed() { - return false; + protected String getLabel() { + return Messages.getString("OtherlandPage.0"); //$NON-NLS-1$ } } From 1ff1062d2d1389e54c14943a43f5a35f6d668ef5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:22 +0100 Subject: [PATCH 1404/1620] New translations OtherlandPage.java (English) --- .../earth/app/view/Messages_en.properties | 41 +++++++++++++------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 74599635a0..005a6f2fdd 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,21 +1,38 @@ package org.openforis.collect.earth.ipcc.view; -import java.util.MissingResourceException; -import java.util.ResourceBundle; +import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import org.openforis.collect.earth.ipcc.model.ManagementType; -public class Messages { - private static final String BUNDLE_NAME = "org.openforis.collect.earth.ipcc.view.Messages"; //$NON-NLS-1$ +import se.gustavkarlsson.gwiz.AbstractWizardPage; - private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME); +public class OtherlandPage extends SubdivisionPage { - private Messages() { + private static final long serialVersionUID = -7092466238152990994L; + //private AbstractWizardPage nextPage; + + public OtherlandPage() { + super( LandUseCategory.O ); } - public static String getString(String key) { - try { - return RESOURCE_BUNDLE.getString(key); - } catch (MissingResourceException e) { - return '!' + key + '!'; - } + @Override + protected AbstractWizardPage getNextPage() { + return null; } + + + @Override + protected boolean isFinishAllowed() { + return true; + } + + @Override + protected Object[] getValues() { + return ManagementType.values(); + } + + @Override + protected String getLabel() { + return Messages.getString("OtherlandPage.0"); //$NON-NLS-1$ + } + } From 69db7b18cfef9c02acecadad85f0c4e417109e3d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:23 +0100 Subject: [PATCH 1405/1620] New translations SettlementPage.java (French) --- .../earth/app/view/Messages_fr.properties | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 005a6f2fdd..2fbf2f293f 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,38 +1,39 @@ package org.openforis.collect.earth.ipcc.view; import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.ManagementType; +import org.openforis.collect.earth.ipcc.model.SettlementType; import se.gustavkarlsson.gwiz.AbstractWizardPage; -public class OtherlandPage extends SubdivisionPage { +public class SettlementPage extends SubdivisionPage { - private static final long serialVersionUID = -7092466238152990994L; - //private AbstractWizardPage nextPage; + + private static final long serialVersionUID = 1548578357804057242L; + private AbstractWizardPage nextPage = new WetlandPage(); - public OtherlandPage() { - super( LandUseCategory.O ); + public SettlementPage() { + super( LandUseCategory.S ); } @Override protected AbstractWizardPage getNextPage() { - return null; + return nextPage; } @Override protected boolean isFinishAllowed() { - return true; + return false; } @Override protected Object[] getValues() { - return ManagementType.values(); + return SettlementType.values(); } @Override protected String getLabel() { - return Messages.getString("OtherlandPage.0"); //$NON-NLS-1$ + return Messages.getString("SettlementPage.0"); //$NON-NLS-1$ } } From ca0c969d084c32849cfc5a6ac3b5b7aee575104c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:24 +0100 Subject: [PATCH 1406/1620] New translations SettlementPage.java (Spanish) --- .../earth/app/view/Messages_es.properties | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 005a6f2fdd..2fbf2f293f 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,38 +1,39 @@ package org.openforis.collect.earth.ipcc.view; import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.ManagementType; +import org.openforis.collect.earth.ipcc.model.SettlementType; import se.gustavkarlsson.gwiz.AbstractWizardPage; -public class OtherlandPage extends SubdivisionPage { +public class SettlementPage extends SubdivisionPage { - private static final long serialVersionUID = -7092466238152990994L; - //private AbstractWizardPage nextPage; + + private static final long serialVersionUID = 1548578357804057242L; + private AbstractWizardPage nextPage = new WetlandPage(); - public OtherlandPage() { - super( LandUseCategory.O ); + public SettlementPage() { + super( LandUseCategory.S ); } @Override protected AbstractWizardPage getNextPage() { - return null; + return nextPage; } @Override protected boolean isFinishAllowed() { - return true; + return false; } @Override protected Object[] getValues() { - return ManagementType.values(); + return SettlementType.values(); } @Override protected String getLabel() { - return Messages.getString("OtherlandPage.0"); //$NON-NLS-1$ + return Messages.getString("SettlementPage.0"); //$NON-NLS-1$ } } From aed3b08ab3b12e558598de07cd6396a377fac879 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:25 +0100 Subject: [PATCH 1407/1620] New translations SettlementPage.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 005a6f2fdd..2fbf2f293f 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,38 +1,39 @@ package org.openforis.collect.earth.ipcc.view; import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.ManagementType; +import org.openforis.collect.earth.ipcc.model.SettlementType; import se.gustavkarlsson.gwiz.AbstractWizardPage; -public class OtherlandPage extends SubdivisionPage { +public class SettlementPage extends SubdivisionPage { - private static final long serialVersionUID = -7092466238152990994L; - //private AbstractWizardPage nextPage; + + private static final long serialVersionUID = 1548578357804057242L; + private AbstractWizardPage nextPage = new WetlandPage(); - public OtherlandPage() { - super( LandUseCategory.O ); + public SettlementPage() { + super( LandUseCategory.S ); } @Override protected AbstractWizardPage getNextPage() { - return null; + return nextPage; } @Override protected boolean isFinishAllowed() { - return true; + return false; } @Override protected Object[] getValues() { - return ManagementType.values(); + return SettlementType.values(); } @Override protected String getLabel() { - return Messages.getString("OtherlandPage.0"); //$NON-NLS-1$ + return Messages.getString("SettlementPage.0"); //$NON-NLS-1$ } } From edbaa024da7da9299c60f02d28f818a6c06b1508 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:26 +0100 Subject: [PATCH 1408/1620] New translations SettlementPage.java (English) --- .../earth/app/view/Messages_en.properties | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 005a6f2fdd..2fbf2f293f 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,38 +1,39 @@ package org.openforis.collect.earth.ipcc.view; import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.ManagementType; +import org.openforis.collect.earth.ipcc.model.SettlementType; import se.gustavkarlsson.gwiz.AbstractWizardPage; -public class OtherlandPage extends SubdivisionPage { +public class SettlementPage extends SubdivisionPage { - private static final long serialVersionUID = -7092466238152990994L; - //private AbstractWizardPage nextPage; + + private static final long serialVersionUID = 1548578357804057242L; + private AbstractWizardPage nextPage = new WetlandPage(); - public OtherlandPage() { - super( LandUseCategory.O ); + public SettlementPage() { + super( LandUseCategory.S ); } @Override protected AbstractWizardPage getNextPage() { - return null; + return nextPage; } @Override protected boolean isFinishAllowed() { - return true; + return false; } @Override protected Object[] getValues() { - return ManagementType.values(); + return SettlementType.values(); } @Override protected String getLabel() { - return Messages.getString("OtherlandPage.0"); //$NON-NLS-1$ + return Messages.getString("SettlementPage.0"); //$NON-NLS-1$ } } From 5baced7e212a78501998c8680b84ab63a1c4a875 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:27 +0100 Subject: [PATCH 1409/1620] New translations SubdivisionPage.java (French) --- .../earth/app/view/Messages_fr.properties | 98 ++++++++++++++++--- 1 file changed, 82 insertions(+), 16 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 2fbf2f293f..903c70789d 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,39 +1,105 @@ package org.openforis.collect.earth.ipcc.view; +import java.awt.Dimension; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.util.List; + +import javax.swing.JComboBox; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.border.BevelBorder; +import javax.swing.border.Border; +import javax.swing.border.TitledBorder; + +import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.SettlementType; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; import se.gustavkarlsson.gwiz.AbstractWizardPage; -public class SettlementPage extends SubdivisionPage { +public abstract class SubdivisionPage extends AbstractWizardPage { + + public SubdivisionPage( LandUseCategory category) { + + List> subdivisionsInCategory = LandUseSubdivisionUtils.getSubdivisionsByCategory( category ); + + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + JPanel contentPane = new JPanel(new GridBagLayout()); + JScrollPane scrollPane = new JScrollPane(contentPane); + scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + scrollPane.setBounds(50, 30, 300, 50); + scrollPane.setPreferredSize(new Dimension(450, 350)); + + final Border border = new TitledBorder( + new BevelBorder(BevelBorder.LOWERED), + getLabel()); + setBorder(border); + for (LandUseSubdivision subdiv : subdivisionsInCategory) { + + constraints.gridx = 0; + + JLabel labelCode = new JLabel( subdiv.getCode() ); + contentPane.add(labelCode, constraints); + + constraints.gridx = 1; + + JLabel labelName = new JLabel( subdiv.getName()); + contentPane.add(labelName, constraints); - private static final long serialVersionUID = 1548578357804057242L; - private AbstractWizardPage nextPage = new WetlandPage(); - - public SettlementPage() { - super( LandUseCategory.S ); - } + constraints.gridx = 2; + JComboBox mgmtType = new JComboBox(getValues()); + mgmtType.setSelectedItem( subdiv.getType() ); + contentPane.add(mgmtType, constraints); + mgmtType.addActionListener( e-> + LandUseSubdivisionUtils.setSubdivisionType( subdiv, mgmtType.getSelectedItem() ) + ); + + constraints.gridy++; + } + + this.add(scrollPane); + + - @Override - protected AbstractWizardPage getNextPage() { - return nextPage; } + protected abstract String getLabel(); + + + protected abstract Object[] getValues(); + + @Override - protected boolean isFinishAllowed() { + protected boolean isCancelAllowed() { return false; } @Override - protected Object[] getValues() { - return SettlementType.values(); + protected boolean isPreviousAllowed() { + return true; + } + + @Override + protected boolean isNextAllowed() { + return true; } @Override - protected String getLabel() { - return Messages.getString("SettlementPage.0"); //$NON-NLS-1$ + protected boolean isFinishAllowed() { + return false; } } From aebf236ff1d1669f9bdb8a765f7f2783ee348b96 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:28 +0100 Subject: [PATCH 1410/1620] New translations SubdivisionPage.java (Spanish) --- .../earth/app/view/Messages_es.properties | 98 ++++++++++++++++--- 1 file changed, 82 insertions(+), 16 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 2fbf2f293f..903c70789d 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,39 +1,105 @@ package org.openforis.collect.earth.ipcc.view; +import java.awt.Dimension; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.util.List; + +import javax.swing.JComboBox; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.border.BevelBorder; +import javax.swing.border.Border; +import javax.swing.border.TitledBorder; + +import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.SettlementType; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; import se.gustavkarlsson.gwiz.AbstractWizardPage; -public class SettlementPage extends SubdivisionPage { +public abstract class SubdivisionPage extends AbstractWizardPage { + + public SubdivisionPage( LandUseCategory category) { + + List> subdivisionsInCategory = LandUseSubdivisionUtils.getSubdivisionsByCategory( category ); + + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.anchor = GridBagConstraints.LINE_START; + constraints.insets = new Insets(5, 5, 5, 5); + constraints.weightx = 1.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + + JPanel contentPane = new JPanel(new GridBagLayout()); + JScrollPane scrollPane = new JScrollPane(contentPane); + scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + scrollPane.setBounds(50, 30, 300, 50); + scrollPane.setPreferredSize(new Dimension(450, 350)); + + final Border border = new TitledBorder( + new BevelBorder(BevelBorder.LOWERED), + getLabel()); + setBorder(border); + for (LandUseSubdivision subdiv : subdivisionsInCategory) { + + constraints.gridx = 0; + + JLabel labelCode = new JLabel( subdiv.getCode() ); + contentPane.add(labelCode, constraints); + + constraints.gridx = 1; + + JLabel labelName = new JLabel( subdiv.getName()); + contentPane.add(labelName, constraints); - private static final long serialVersionUID = 1548578357804057242L; - private AbstractWizardPage nextPage = new WetlandPage(); - - public SettlementPage() { - super( LandUseCategory.S ); - } + constraints.gridx = 2; + JComboBox mgmtType = new JComboBox(getValues()); + mgmtType.setSelectedItem( subdiv.getType() ); + contentPane.add(mgmtType, constraints); + mgmtType.addActionListener( e-> + LandUseSubdivisionUtils.setSubdivisionType( subdiv, mgmtType.getSelectedItem() ) + ); + + constraints.gridy++; + } + + this.add(scrollPane); + + - @Override - protected AbstractWizardPage getNextPage() { - return nextPage; } + protected abstract String getLabel(); + + + protected abstract Object[] getValues(); + + @Override - protected boolean isFinishAllowed() { + protected boolean isCancelAllowed() { return false; } @Override - protected Object[] getValues() { - return SettlementType.values(); + protected boolean isPreviousAllowed() { + return true; + } + + @Override + protected boolean isNextAllowed() { + return true; } @Override - protected String getLabel() { - return Messages.getString("SettlementPage.0"); //$NON-NLS-1$ + protected boolean isFinishAllowed() { + return false; } } From 8fb75833c8d104f63808f54ab6cc491b91f09cf1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:29 +0100 Subject: [PATCH 1411/1620] New translations IPCCDataExportMatrixExtendedExcel.java (English) --- .../earth/app/view/Messages_en.properties | 218 ++++++++++++++++-- 1 file changed, 194 insertions(+), 24 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 2fbf2f293f..c15098bfaa 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,39 +1,209 @@ -package org.openforis.collect.earth.ipcc.view; +package org.openforis.collect.earth.ipcc; -import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.SettlementType; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; -import se.gustavkarlsson.gwiz.AbstractWizardPage; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.Font; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; -public class SettlementPage extends SubdivisionPage { +@Component +public class IPCCDataExportMatrixExtendedExcel extends IPCCDataExportTimeSeries { + Logger logger = LoggerFactory.getLogger(IPCCDataExportMatrixExtendedExcel.class); - private static final long serialVersionUID = 1548578357804057242L; - private AbstractWizardPage nextPage = new WetlandPage(); - - public SettlementPage() { - super( LandUseCategory.S ); + public IPCCDataExportMatrixExtendedExcel() { + super(); + setExportTypeUsed(ExportType.IPCC); } @Override - protected AbstractWizardPage getNextPage() { - return nextPage; - } + protected File generateFile(List strataData) throws IOException { + File excelDestination = File.createTempFile("LuMatrixTimeseries_EXTENDED", ".xls"); + excelDestination.deleteOnExit(); + // Create a Workbook + try(Workbook workbook = new HSSFWorkbook() ) {// new HSSFWorkbook() for generating `.xls` file + + /* + * CreationHelper helps us create instances of various things like DataFormat, + * Hyperlink, RichTextString etc, in a format (HSSF, XSSF) independent way + */ + // CreationHelper createHelper = workbook.getCreationHelper(); + // Create a Font for styling header cells + Font cornerFont = workbook.createFont(); + cornerFont.setBold(true); + cornerFont.setFontHeightInPoints((short) 15); + cornerFont.setColor(IndexedColors.GREY_80_PERCENT.getIndex()); + // Create a CellStyle with the font + CellStyle cornerCellStyle = workbook.createCellStyle(); + cornerCellStyle.setFont(cornerFont); - @Override - protected boolean isFinishAllowed() { - return false; - } + // Create a Font for styling header cells + Font headerFont = workbook.createFont(); + headerFont.setBold(true); + headerFont.setFontHeightInPoints((short) 14); + headerFont.setColor(IndexedColors.DARK_TEAL.getIndex()); + // Create a CellStyle with the font + CellStyle headerCellStyle = workbook.createCellStyle(); + headerCellStyle.setFont(headerFont); - @Override - protected Object[] getValues() { - return SettlementType.values(); - } + // Create a Font for styling non-diagonal cells + Font stdFont = workbook.createFont(); + stdFont.setBold(false); + stdFont.setFontHeightInPoints((short) 14); + stdFont.setColor(IndexedColors.DARK_RED.getIndex()); + // Create a CellStyle with the font + CellStyle stdCellStyle = workbook.createCellStyle(); + stdCellStyle.setFont(stdFont); - @Override - protected String getLabel() { - return Messages.getString("SettlementPage.0"); //$NON-NLS-1$ + // Create a Font for styling diagonal cells + Font diagonalFont = workbook.createFont(); + diagonalFont.setBold(true); + diagonalFont.setFontHeightInPoints((short) 14); + diagonalFont.setColor(IndexedColors.DARK_GREEN.getIndex()); + // Create a CellStyle with the font + CellStyle diagonalCellStyle = workbook.createCellStyle(); + diagonalCellStyle.setFont(diagonalFont); + + // Create a Font for styling diagonal cells + Font strataFont = workbook.createFont(); + strataFont.setBold(true); + strataFont.setFontHeightInPoints((short) 16); + strataFont.setColor(IndexedColors.BLUE.getIndex()); + // Create a CellStyle with the font + CellStyle strataCellStyle = workbook.createCellStyle(); + strataCellStyle.setFont(strataFont); + + List availableYears = new ArrayList(); + for (StratumPerYearData yearDataStratumP : strataData) { + if (!availableYears.contains(Integer.valueOf(yearDataStratumP.getYear()))) { + availableYears.add(yearDataStratumP.getYear()); + } + } + + for (Integer yearToOutput : availableYears) { + + int rowNum = 0; + // Create a Sheet + Sheet sheet = workbook.createSheet("LU Matrix " + yearToOutput + "-" + (yearToOutput + 1)); + + for (StratumPerYearData yearDataStratum : strataData) { + // Get the stratums for the year + if (yearDataStratum.getYear() != yearToOutput) { + continue; // The stratum contains data for a different year that we are going to output in + // the sheet + } + + + sheet.createRow(rowNum++); // create empty row + + // Create a Row + Row infoRow = sheet.createRow(rowNum++); + Cell cell = infoRow.createCell(0); + cell.setCellStyle(headerCellStyle); + cell.setCellValue("Climate"); + cell = infoRow.createCell(1); + cell.setCellStyle(strataCellStyle); + cell.setCellValue(yearDataStratum.getClimate()); + + infoRow = sheet.createRow(rowNum++); + cell = infoRow.createCell(0); + cell.setCellStyle(headerCellStyle); + cell.setCellValue("Soil"); + cell = infoRow.createCell(1); + cell.setCellStyle(strataCellStyle); + cell.setCellValue(yearDataStratum.getSoil()); + + infoRow = sheet.createRow(rowNum++); + cell = infoRow.createCell(0); + cell.setCellStyle(headerCellStyle); + cell.setCellValue("Global Ecological Zone (GEZ)"); + cell = infoRow.createCell(1); + cell.setCellStyle(strataCellStyle); + cell.setCellValue(yearDataStratum.getGez()); + + // Add some empty rows before next section + sheet.createRow(rowNum++); + + // Create a Row + Row headerRow = sheet.createRow(rowNum++); + cell = headerRow.createCell(0); + cell.setCellValue( + "Transition " + yearDataStratum.getYear() + "/" + (yearDataStratum.getYear() + 1)); + cell.setCellStyle(cornerCellStyle); + + MatrixSheet matrix = new MatrixSheet(yearDataStratum); + int cellPosition = 1; + for (LandUseSubdivision subdivision : matrix.getSubdivisions()) { + cell = headerRow.createCell(cellPosition++); + cell.setCellValue(subdivision.toString()); + cell.setCellStyle(headerCellStyle); + } + + int colNum = 0; + for (LandUseSubdivision subdivisionH : matrix.getSubdivisions()) { + colNum = 0; + Row row = sheet.createRow(rowNum++); + + Cell columnCell = row.createCell(colNum++); + columnCell.setCellStyle(headerCellStyle); + columnCell.setCellValue(subdivisionH.toString()); + + colNum = 1; + for (LandUseSubdivision subdivisionV : matrix.getSubdivisions()) { + + cell = row.createCell(colNum++); + cell.setCellValue(IPCCDataExportMatrixExcel + .findLuData(subdivisionH, subdivisionV, matrix.getYearData().getLuData()) + .getAreaHa()); + if (subdivisionH.equals(subdivisionV)) { + cell.setCellStyle(diagonalCellStyle); + } else { + cell.setCellStyle(stdCellStyle); + } + } + + } + + // Add some empty rows before next section + sheet.createRow(rowNum++); + sheet.createRow(rowNum++); + sheet.createRow(rowNum++); + + + // Resize all columns to fit the content size + for (int j = 0; j < colNum; j++) { + sheet.autoSizeColumn(j); + } + + } + + } + + // Write the output to a file + try (FileOutputStream fileOut = new FileOutputStream(excelDestination)) { + workbook.write(fileOut); + } catch (IOException e) { + logger.error("Error generating Excel file", e); + } + } catch (Exception e) { + logger.error("Error generating Excel data", e); + } + return excelDestination; } } From 425c6e5743831c884535e2fea0bdcb5acf512eff Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:31 +0100 Subject: [PATCH 1412/1620] New translations IPCCDataExportPerPlotCSV.java (French) --- .../earth/app/view/Messages_fr.properties | 144 +++++++----------- 1 file changed, 58 insertions(+), 86 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 903c70789d..21431b088f 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,105 +1,77 @@ -package org.openforis.collect.earth.ipcc.view; +package org.openforis.collect.earth.ipcc; -import java.awt.Dimension; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; +import java.io.File; +import java.io.IOException; import java.util.List; -import javax.swing.JComboBox; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.border.BevelBorder; -import javax.swing.border.Border; -import javax.swing.border.TitledBorder; +import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.RegionCalculationUtils; +import org.openforis.collect.earth.app.service.SchemaService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; -import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; -import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +@Component +public class IPCCDataExportPerPlotCSV extends IPCCDataExportCSV { -import se.gustavkarlsson.gwiz.AbstractWizardPage; + private String schemaName; -public abstract class SubdivisionPage extends AbstractWizardPage { - - public SubdivisionPage( LandUseCategory category) { - - List> subdivisionsInCategory = LandUseSubdivisionUtils.getSubdivisionsByCategory( category ); - - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - JPanel contentPane = new JPanel(new GridBagLayout()); - JScrollPane scrollPane = new JScrollPane(contentPane); - scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - scrollPane.setBounds(50, 30, 300, 50); - scrollPane.setPreferredSize(new Dimension(450, 350)); - - final Border border = new TitledBorder( - new BevelBorder(BevelBorder.LOWERED), - getLabel()); - setBorder(border); - - for (LandUseSubdivision subdiv : subdivisionsInCategory) { - - constraints.gridx = 0; - - JLabel labelCode = new JLabel( subdiv.getCode() ); - contentPane.add(labelCode, constraints); - - constraints.gridx = 1; - - JLabel labelName = new JLabel( subdiv.getName()); - contentPane.add(labelName, constraints); - - constraints.gridx = 2; - JComboBox mgmtType = new JComboBox(getValues()); - mgmtType.setSelectedItem( subdiv.getType() ); - contentPane.add(mgmtType, constraints); - mgmtType.addActionListener( e-> - LandUseSubdivisionUtils.setSubdivisionType( subdiv, mgmtType.getSelectedItem() ) - ); - - constraints.gridy++; - } - - this.add(scrollPane); - - + Logger logger = LoggerFactory.getLogger(IPCCDataExportPerPlotCSV.class); - } + @Autowired + private SchemaService schemaService; + public IPCCDataExportPerPlotCSV() { + setExportTypeUsed(ExportType.IPCC); + } - protected abstract String getLabel(); + public File generateTimeseriesData( int startYear, int endYear ) throws IOException { + schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); + List luCombinations = generateLUCombinations(startYear, endYear); - protected abstract Object[] getValues(); + return createCsv( luCombinations); + } - @Override - protected boolean isCancelAllowed() { - return false; - } + private List generateLUCombinations(int startYear, int endYear) { + + String selectedYears = IPCCDataExportTimeSeries.PLOT_ID + + ", " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_LABEL + + ", " + IPCCDataExportTimeSeries.SOIL_COLUMN_LABEL + + ", " + IPCCDataExportTimeSeries.GEZ_COLUMN_LABEL + ", " ; + + for( int year = startYear ; year <= endYear; year++ ) { - @Override - protected boolean isPreviousAllowed() { - return true; - } + selectedYears += IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + ","; - @Override - protected boolean isNextAllowed() { - return true; - } + } - @Override - protected boolean isFinishAllowed() { - return false; + String sqlSelect = "select " + + selectedYears + + RegionCalculationUtils.EXPANSION_FACTOR + + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.SOIL_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.CLIMATE_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.GEZ_TABLE + + + " where " + + IPCCDataExportTimeSeries.SOIL_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.SOIL_COLUMN_ID + + " and " + + IPCCDataExportTimeSeries.CLIMATE_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_ID + + " and " + + IPCCDataExportTimeSeries.GEZ_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.GEZ_COLUMN_ID + + + " ORDER BY "+ IPCCDataExportTimeSeries.PLOT_ID + " DESC"; // Remove trailing comma from list of years + + List luData = getJdbcTemplate().query( + sqlSelect + , + getRowMapper() + ); + + selectedYears+= "area"; // so the area columns appears too + luData.add( 0, selectedYears.split(",") ); + return luData; } } From 8c5d61ee81979ced4c89bd3093aa5cf0b4847320 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:32 +0100 Subject: [PATCH 1413/1620] New translations MatrixSheet.java (Spanish) --- .../earth/app/view/Messages_es.properties | 111 ++++-------------- 1 file changed, 24 insertions(+), 87 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 903c70789d..d7ce509776 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,105 +1,42 @@ -package org.openforis.collect.earth.ipcc.view; +package org.openforis.collect.earth.ipcc; -import java.awt.Dimension; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; -import javax.swing.JComboBox; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.border.BevelBorder; -import javax.swing.border.Border; -import javax.swing.border.TitledBorder; - -import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; -import org.openforis.collect.earth.ipcc.model.LandUseCategory; import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import se.gustavkarlsson.gwiz.AbstractWizardPage; - -public abstract class SubdivisionPage extends AbstractWizardPage { - - public SubdivisionPage( LandUseCategory category) { - - List> subdivisionsInCategory = LandUseSubdivisionUtils.getSubdivisionsByCategory( category ); - - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.anchor = GridBagConstraints.LINE_START; - constraints.insets = new Insets(5, 5, 5, 5); - constraints.weightx = 1.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - - JPanel contentPane = new JPanel(new GridBagLayout()); - JScrollPane scrollPane = new JScrollPane(contentPane); - scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - scrollPane.setBounds(50, 30, 300, 50); - scrollPane.setPreferredSize(new Dimension(450, 350)); - - final Border border = new TitledBorder( - new BevelBorder(BevelBorder.LOWERED), - getLabel()); - setBorder(border); - - for (LandUseSubdivision subdiv : subdivisionsInCategory) { - - constraints.gridx = 0; - - JLabel labelCode = new JLabel( subdiv.getCode() ); - contentPane.add(labelCode, constraints); - - constraints.gridx = 1; - - JLabel labelName = new JLabel( subdiv.getName()); - contentPane.add(labelName, constraints); +public class MatrixSheet { - constraints.gridx = 2; - JComboBox mgmtType = new JComboBox(getValues()); - mgmtType.setSelectedItem( subdiv.getType() ); - contentPane.add(mgmtType, constraints); - mgmtType.addActionListener( e-> - LandUseSubdivisionUtils.setSubdivisionType( subdiv, mgmtType.getSelectedItem() ) - ); - - constraints.gridy++; - } - - this.add(scrollPane); - - + private YearData yearData; + public MatrixSheet(YearData yearData) { + this.yearData = yearData; } + public List> getSubdivisions() { + List> subdivisions = new ArrayList<>(); - protected abstract String getLabel(); + for (LUDataPerYear luDataYear : yearData.getLuData()) { + if( subdivisions.indexOf( luDataYear.getLu() ) == -1 ) { + subdivisions.add( luDataYear.getLu()); + } - protected abstract Object[] getValues(); - - - @Override - protected boolean isCancelAllowed() { - return false; - } - - @Override - protected boolean isPreviousAllowed() { - return true; - } + if( subdivisions.indexOf( luDataYear.getLuNextYear() ) == -1 ) { + subdivisions.add( luDataYear.getLuNextYear()); + } + } + + Collections.sort( subdivisions ); - @Override - protected boolean isNextAllowed() { - return true; + return subdivisions; + } + - @Override - protected boolean isFinishAllowed() { - return false; + public YearData getYearData() { + return yearData; } } From 49630394b80a283a2bc6876d148d1a6ebabeeefc Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:33 +0100 Subject: [PATCH 1414/1620] New translations IPCCSurveyAdapter.java (French) --- .../earth/app/view/Messages_fr.properties | 415 +++++++++++++++--- 1 file changed, 362 insertions(+), 53 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 21431b088f..32e67d9b02 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,77 +1,386 @@ package org.openforis.collect.earth.ipcc; -import java.io.File; -import java.io.IOException; -import java.util.List; +import java.util.ArrayList; -import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.RegionCalculationUtils; -import org.openforis.collect.earth.app.service.SchemaService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; +import org.openforis.idm.metamodel.AttributeDefault; +import org.openforis.idm.metamodel.CodeAttributeDefinition; +import org.openforis.idm.metamodel.EntityDefinition; +import org.openforis.idm.metamodel.NodeLabel; +import org.openforis.idm.metamodel.Survey; +import org.openforis.idm.metamodel.TextAttributeDefinition; +import org.openforis.idm.path.InvalidPathException; -@Component -public class IPCCDataExportPerPlotCSV extends IPCCDataExportCSV { +public class IPCCSurveyAdapter { - private String schemaName; + public static final String IPCC_ATTR_PARENT_SUFIX = "_parent"; + public static final String IPCC_ATTR_PREFIX = "ipcc_"; + public static final String IPCC_CATEGORY = "_category"; + public static final String IPCC_SUBCATEGORY = "_subcategory"; + public static final String IPCC_SUBDIVISION = "_subdivision"; - Logger logger = LoggerFactory.getLogger(IPCCDataExportPerPlotCSV.class); + public static final String ATTR_CURRENT_CATEGORY = IPCC_ATTR_PREFIX + "current_category"; + public static final String ATTR_CURRENT_SUBDIVISION = IPCC_ATTR_PREFIX + "current_subdivision"; + public static final String ATTR_OLDEST_CATEGORY = IPCC_ATTR_PREFIX + "oldest_category"; + public static final String ATTR_PREVIOUS_CATEGORY = IPCC_ATTR_PREFIX + "previous_category"; + public static final String ATTR_PREVIOUS_SUBDIVISION = IPCC_ATTR_PREFIX + "previous_subdivision"; + private static final String CODE_LIST_LAND_USE = "land_use"; + private static final String CODE_LIST_LAND_USE_SUBCATEGORY = "land_use_subcategory"; - @Autowired - private SchemaService schemaService; + private static final int IPCC_20_YEARS_RULE = 20; - public IPCCDataExportPerPlotCSV() { - setExportTypeUsed(ExportType.IPCC); + + private static final String PLOT_ENTITY = "plot"; + + private static final String TEMPLATE_LAND_USE_CATEGORY = "land_use_category"; + private static final String TEMPLATE_LAND_USE_CATEGORY_CHANGED = "land_use_category_has_changed"; + private static final String TEMPLATE_LAND_USE_CHANGE_ONCE = "land_use_change_once"; + private static final String TEMPLATE_LAND_USE_INITIAL_SUBDIVISION = "land_use_initial_subdivision"; + private static final String TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION = "land_use_initial_subdivision"; + private static final String TEMPLATE_LAND_USE_SECOND_SUBDIVISION = "second_lu_subdivision"; + private static final String TEMPLATE_LAND_USE_SUBCATEGORY = "land_use_subcategory"; + private static final String TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED = "land_use_subcategory_year_of_change"; + private static final String TEMPLATE_LAND_USE_SUBDIVISION = "land_use_subdivision"; + private static final String TEMPLATE_LAND_USE_SUBDIVISION_CHANGED = "land_use_subdivision_change"; + private static final String TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED = "land_use_subdivision_year_of_change"; + private static final String TEMPLATE_SECOND_LU_CHANGE = "second_lu_change"; + private static final String TEMPLATE_SECOND_LU_CONVERSION = "second_lu_conversion"; + private static final String TEMPLATE_SECOND_LU_CONVERSION_YEAR = "second_lu_conversion_year"; + + public static String getIpccCategoryAttrName(int year) { + return IPCC_ATTR_PREFIX + year + IPCC_CATEGORY; + } + + public static String getIpccSubdivisionAttrName(int year) { + return IPCC_ATTR_PREFIX + year + IPCC_SUBDIVISION; } - public File generateTimeseriesData( int startYear, int endYear ) throws IOException { - schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); + private void addAuxilliaryAttributes(Survey survey, EntityDefinition plot) { + // Adds a Current Category LU 2022 calculated attribute to be used for the + // Subdivision as parent + CodeAttributeDefinition currentLu = survey.getSchema().createCodeAttributeDefinition(); + currentLu.setName(ATTR_CURRENT_CATEGORY); + currentLu.setListName(CODE_LIST_LAND_USE); + currentLu.setCalculated(true); + currentLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - current"); + AttributeDefault attributeDefault = new AttributeDefault(); + attributeDefault.setExpression("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 2, 1)"); // get the second + // character of the + // LU conversion CF + // --> F + ArrayList calculation = new ArrayList(); + calculation.add(attributeDefault); + currentLu.setAttributeDefaults(calculation); + plot.addChildDefinition(currentLu); - List luCombinations = generateLUCombinations(startYear, endYear); + // adds the Current Subdivision 2022 attribute, which is just a copy of + // land_use_subdivision + CodeAttributeDefinition currentLuSubdivision = survey.getSchema().createCodeAttributeDefinition(); + currentLuSubdivision.setName(ATTR_CURRENT_SUBDIVISION); + currentLuSubdivision.setListName(CODE_LIST_LAND_USE); + currentLuSubdivision.setParentCodeAttributeDefinition(currentLu); + currentLuSubdivision.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Subdivision - current"); + attributeDefault = new AttributeDefault(); + attributeDefault.setExpression(TEMPLATE_LAND_USE_SUBDIVISION); // gets the current LU subdivision + calculation = new ArrayList(); + calculation.add(attributeDefault); + currentLuSubdivision.setAttributeDefaults(calculation); + plot.addChildDefinition(currentLuSubdivision); - return createCsv( luCombinations); + // Adds a Previous Category LU using the LU Conversion attribute + CodeAttributeDefinition previousLu = survey.getSchema().createCodeAttributeDefinition(); + previousLu.setName(ATTR_PREVIOUS_CATEGORY); + previousLu.setListName(CODE_LIST_LAND_USE); + previousLu.setCalculated(true); + previousLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - previous"); + attributeDefault = new AttributeDefault(); + attributeDefault.setExpression("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 1, 1)"); // get the first + // character of the + // LU conversion CF + // --> C + calculation = new ArrayList(); + calculation.add(attributeDefault); + previousLu.setAttributeDefaults(calculation); + plot.addChildDefinition(previousLu); + + // Adds a Previous Category LU using the LU Conversion attribute + CodeAttributeDefinition oldestLu = survey.getSchema().createCodeAttributeDefinition(); + oldestLu.setName(ATTR_OLDEST_CATEGORY); + oldestLu.setListName(CODE_LIST_LAND_USE); + oldestLu.setCalculated(true); + oldestLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - oldest"); + calculation = new ArrayList(); + calculation.add(new AttributeDefault("substring( " + TEMPLATE_SECOND_LU_CONVERSION + ", 1,1)", // if the oldest + // LU conversion + // was FS then + // it becomes F + TEMPLATE_SECOND_LU_CHANGE + " = true() ")); + calculation.add(new AttributeDefault("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 1,1)", // if the oldest + // LU conversion + // was FS then + // it becomes F + "idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + ") or " + TEMPLATE_SECOND_LU_CHANGE + " = true() ")); + + oldestLu.setAttributeDefaults(calculation); + plot.addChildDefinition(oldestLu); } + private Survey addIPCCAttributes(Survey survey) { + EntityDefinition plot = survey.getSchema().getRootEntityDefinition("plot"); + addAuxilliaryAttributes(survey, plot); - private List generateLUCombinations(int startYear, int endYear) { - - String selectedYears = IPCCDataExportTimeSeries.PLOT_ID + - ", " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_LABEL + - ", " + IPCCDataExportTimeSeries.SOIL_COLUMN_LABEL + - ", " + IPCCDataExportTimeSeries.GEZ_COLUMN_LABEL + ", " ; - - for( int year = startYear ; year <= endYear; year++ ) { + for (int year = IPCCGenerator.START_YEAR; year <= IPCCGenerator.END_YEAR; year++) { + addLuSubcategory(survey, plot, year); + CodeAttributeDefinition category = addLuCategory(survey, plot, year); + addLuSubdivision(survey, plot, category, year); + } + + return survey; + } + + public Survey addIPCCAttributesToSurvey(Survey survey) throws IPCCGeneratorException { + // Check if the Survey follows the latest 2022 IPCC Survey Template + // If the survey is based on the latest IPCC 2022 Template no further processing + // is needed + if (!is2022IPCCTemplate(survey)) { + // Check that survey has necessary attributes and code-lists + checkSurveyLUAttributes(survey); + checkSurveyLUCodeLists(survey); - selectedYears += IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + ","; + // All the necessary attributes are present + // Add the yearly LAND USE cat/subcategory/subdivision attributes! + return addIPCCAttributes(survey); + } else { + return survey; } + } + + private CodeAttributeDefinition addLuCategory(Survey survey, EntityDefinition plot, int year) { + // Create the parent attribute for the LU Subcategory ( the initial Land Use) + CodeAttributeDefinition category = survey.getSchema().createCodeAttributeDefinition(); + category.setName(getIpccCategoryAttrName(year)); + category.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Category "); + category.setListName(CODE_LIST_LAND_USE); + category.setCalculated(true); + + ArrayList calculation = new ArrayList(); + calculation.add(new AttributeDefault("substring(" + (IPCC_ATTR_PREFIX + year + IPCC_SUBCATEGORY) + ", 2, 1)")); + + category.setAttributeDefaults(calculation); + plot.addChildDefinition(category); + return category; + } + + private void addLuSubcategory(Survey survey, EntityDefinition plot, int year) { + + // Create the parent attribute for the LU Subcategory ( the initial Land Use) + TextAttributeDefinition subcategory = survey.getSchema().createTextAttributeDefinition(); + subcategory.setName(IPCC_ATTR_PREFIX + year + IPCC_SUBCATEGORY); + subcategory.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Conversion "); + subcategory.setCalculated(true); + + int thresHold20Years = year - IPCC_20_YEARS_RULE; + + ArrayList calculation = new ArrayList(); + + calculation.add( + new AttributeDefault( + TEMPLATE_LAND_USE_SUBCATEGORY, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "!= true()" + + " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + ) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBCATEGORY, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + + " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year + + " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " >=" + thresHold20Years) + ); + + calculation.add(new AttributeDefault( + "concat(" + ATTR_CURRENT_CATEGORY + "," + ATTR_CURRENT_CATEGORY + ")", + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " < " + thresHold20Years) + ); + + calculation.add(new AttributeDefault( + "concat(" + ATTR_PREVIOUS_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", + TEMPLATE_LAND_USE_CATEGORY_CHANGED + + " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + + "and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " > " + year) + ); + + calculation.add(new AttributeDefault( + "concat(" + ATTR_OLDEST_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", + TEMPLATE_SECOND_LU_CHANGE + "=true() " + + "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year + + " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " >= " + thresHold20Years) + ); - String sqlSelect = "select " - + selectedYears - + RegionCalculationUtils.EXPANSION_FACTOR - + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.SOIL_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.CLIMATE_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.GEZ_TABLE - - + " where " - + IPCCDataExportTimeSeries.SOIL_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.SOIL_COLUMN_ID - + " and " - + IPCCDataExportTimeSeries.CLIMATE_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_ID - + " and " - + IPCCDataExportTimeSeries.GEZ_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.GEZ_COLUMN_ID - - + " ORDER BY "+ IPCCDataExportTimeSeries.PLOT_ID + " DESC"; // Remove trailing comma from list of years - - List luData = getJdbcTemplate().query( - sqlSelect - , - getRowMapper() + calculation.add(new AttributeDefault( + "concat(" + ATTR_PREVIOUS_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", + TEMPLATE_SECOND_LU_CHANGE + "=true() " + + " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " < " + thresHold20Years) ); - selectedYears+= "area"; // so the area columns appears too - luData.add( 0, selectedYears.split(",") ); - return luData; + calculation.add(new AttributeDefault( + "concat(" + ATTR_OLDEST_CATEGORY + "," + ATTR_OLDEST_CATEGORY + ")", + TEMPLATE_SECOND_LU_CHANGE + "=true() " + + "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " >= "+ thresHold20Years) + ); + + subcategory.setAttributeDefaults(calculation); + subcategory.setAnnotation(null, ATTR_CURRENT_CATEGORY); + plot.addChildDefinition(subcategory); } + private void addLuSubdivision(Survey survey, EntityDefinition plot, CodeAttributeDefinition categoryParent, + int year) { + CodeAttributeDefinition subdivision = survey.getSchema().createCodeAttributeDefinition(); + subdivision.setName(getIpccSubdivisionAttrName(year)); + subdivision.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Subdivision "); + subdivision.setListName(CODE_LIST_LAND_USE); + subdivision.setParentCodeAttributeDefinition(categoryParent); + subdivision.setCalculated(true); + + ArrayList calculation = new ArrayList(); + + calculation + .add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBDIVISION, + TEMPLATE_LAND_USE_CHANGE_ONCE + "!= true()") + ); + + calculation + .add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBDIVISION, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + + " and ( idm:blank(" + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + " ) or " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + " != true() ) " + + " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, + TEMPLATE_SECOND_LU_CHANGE + " = true()" + + " and ( idm:blank(" + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " ) or " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " != true() ) "+ + " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year + + " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year + )); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBDIVISION, + TEMPLATE_SECOND_LU_CHANGE + " = true()" + + " and ( idm:blank(" + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " ) or " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " != true() ) "+ + " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year + )); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " = true() " + + " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + + "and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " > " + year) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, + TEMPLATE_SECOND_LU_CHANGE + "=true() " + + "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_SECOND_SUBDIVISION, + TEMPLATE_SECOND_LU_CHANGE + "=true() " + + "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " > " + year) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, + "( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + + " and " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=true() "+ + " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year + + " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year + + )); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBDIVISION, + "( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) "+ + " and " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() "+ + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=false() " + + "and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year + + )); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBDIVISION, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=false() "+ + " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year) + ); + + subdivision.setAttributeDefaults(calculation); + plot.addChildDefinition(subdivision); + + } + + private void checkSurveyLUAttributes(Survey survey) throws IPCCGeneratorException { + // Check that the LU attributes are already on the survey + // If one of them is not available an exception is thrown! + ArrayList luDefaultAttributePaths = new ArrayList(); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CATEGORY); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBCATEGORY); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_INITIAL_SUBDIVISION); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CONVERSION); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CONVERSION_YEAR); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CHANGE); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SECOND_SUBDIVISION); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CATEGORY_CHANGED); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CHANGE_ONCE); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED); + + for (String attributePath : luDefaultAttributePaths) { + try { + survey.getSchema().getDefinitionByPath(attributePath); + } catch (InvalidPathException e) { + throw new IPCCGeneratorException("Missing attribute in Survey : " + attributePath, e); + } + } + + } + + private void checkSurveyLUCodeLists(Survey survey) throws IPCCGeneratorException { + + ArrayList luCodeLists = new ArrayList(); + luCodeLists.add(CODE_LIST_LAND_USE); + luCodeLists.add(CODE_LIST_LAND_USE_SUBCATEGORY); + + for (String codeList : luCodeLists) { + try { + survey.getCodeList(codeList); + } catch (InvalidPathException e) { + throw new IPCCGeneratorException("Missing Code List in Survey : " + codeList, e); + } + } + } + + private boolean is2022IPCCTemplate(Survey survey) { + // TODO Auto-generated method stub + // Check if the survey is based on the very latest 2022 IPCC survey template + // with all the LU changes + return false; + } + } From b6d566e2e20dc0403a4535412587b2ec1a6849e5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:34 +0100 Subject: [PATCH 1415/1620] New translations IPCCSurveyAdapter.java (Spanish) --- .../earth/app/view/Messages_es.properties | 388 +++++++++++++++++- 1 file changed, 366 insertions(+), 22 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index d7ce509776..32e67d9b02 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,42 +1,386 @@ package org.openforis.collect.earth.ipcc; import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +import org.openforis.idm.metamodel.AttributeDefault; +import org.openforis.idm.metamodel.CodeAttributeDefinition; +import org.openforis.idm.metamodel.EntityDefinition; +import org.openforis.idm.metamodel.NodeLabel; +import org.openforis.idm.metamodel.Survey; +import org.openforis.idm.metamodel.TextAttributeDefinition; +import org.openforis.idm.path.InvalidPathException; -public class MatrixSheet { +public class IPCCSurveyAdapter { - private YearData yearData; + public static final String IPCC_ATTR_PARENT_SUFIX = "_parent"; + public static final String IPCC_ATTR_PREFIX = "ipcc_"; + public static final String IPCC_CATEGORY = "_category"; + public static final String IPCC_SUBCATEGORY = "_subcategory"; + public static final String IPCC_SUBDIVISION = "_subdivision"; - public MatrixSheet(YearData yearData) { - this.yearData = yearData; + public static final String ATTR_CURRENT_CATEGORY = IPCC_ATTR_PREFIX + "current_category"; + public static final String ATTR_CURRENT_SUBDIVISION = IPCC_ATTR_PREFIX + "current_subdivision"; + public static final String ATTR_OLDEST_CATEGORY = IPCC_ATTR_PREFIX + "oldest_category"; + public static final String ATTR_PREVIOUS_CATEGORY = IPCC_ATTR_PREFIX + "previous_category"; + public static final String ATTR_PREVIOUS_SUBDIVISION = IPCC_ATTR_PREFIX + "previous_subdivision"; + private static final String CODE_LIST_LAND_USE = "land_use"; + private static final String CODE_LIST_LAND_USE_SUBCATEGORY = "land_use_subcategory"; + + private static final int IPCC_20_YEARS_RULE = 20; + + + private static final String PLOT_ENTITY = "plot"; + + private static final String TEMPLATE_LAND_USE_CATEGORY = "land_use_category"; + private static final String TEMPLATE_LAND_USE_CATEGORY_CHANGED = "land_use_category_has_changed"; + private static final String TEMPLATE_LAND_USE_CHANGE_ONCE = "land_use_change_once"; + private static final String TEMPLATE_LAND_USE_INITIAL_SUBDIVISION = "land_use_initial_subdivision"; + private static final String TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION = "land_use_initial_subdivision"; + private static final String TEMPLATE_LAND_USE_SECOND_SUBDIVISION = "second_lu_subdivision"; + private static final String TEMPLATE_LAND_USE_SUBCATEGORY = "land_use_subcategory"; + private static final String TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED = "land_use_subcategory_year_of_change"; + private static final String TEMPLATE_LAND_USE_SUBDIVISION = "land_use_subdivision"; + private static final String TEMPLATE_LAND_USE_SUBDIVISION_CHANGED = "land_use_subdivision_change"; + private static final String TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED = "land_use_subdivision_year_of_change"; + private static final String TEMPLATE_SECOND_LU_CHANGE = "second_lu_change"; + private static final String TEMPLATE_SECOND_LU_CONVERSION = "second_lu_conversion"; + private static final String TEMPLATE_SECOND_LU_CONVERSION_YEAR = "second_lu_conversion_year"; + + public static String getIpccCategoryAttrName(int year) { + return IPCC_ATTR_PREFIX + year + IPCC_CATEGORY; } - public List> getSubdivisions() { - List> subdivisions = new ArrayList<>(); + public static String getIpccSubdivisionAttrName(int year) { + return IPCC_ATTR_PREFIX + year + IPCC_SUBDIVISION; + } - for (LUDataPerYear luDataYear : yearData.getLuData()) { + private void addAuxilliaryAttributes(Survey survey, EntityDefinition plot) { + // Adds a Current Category LU 2022 calculated attribute to be used for the + // Subdivision as parent + CodeAttributeDefinition currentLu = survey.getSchema().createCodeAttributeDefinition(); + currentLu.setName(ATTR_CURRENT_CATEGORY); + currentLu.setListName(CODE_LIST_LAND_USE); + currentLu.setCalculated(true); + currentLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - current"); + AttributeDefault attributeDefault = new AttributeDefault(); + attributeDefault.setExpression("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 2, 1)"); // get the second + // character of the + // LU conversion CF + // --> F + ArrayList calculation = new ArrayList(); + calculation.add(attributeDefault); + currentLu.setAttributeDefaults(calculation); + plot.addChildDefinition(currentLu); - if( subdivisions.indexOf( luDataYear.getLu() ) == -1 ) { - subdivisions.add( luDataYear.getLu()); - } + // adds the Current Subdivision 2022 attribute, which is just a copy of + // land_use_subdivision + CodeAttributeDefinition currentLuSubdivision = survey.getSchema().createCodeAttributeDefinition(); + currentLuSubdivision.setName(ATTR_CURRENT_SUBDIVISION); + currentLuSubdivision.setListName(CODE_LIST_LAND_USE); + currentLuSubdivision.setParentCodeAttributeDefinition(currentLu); + currentLuSubdivision.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Subdivision - current"); + attributeDefault = new AttributeDefault(); + attributeDefault.setExpression(TEMPLATE_LAND_USE_SUBDIVISION); // gets the current LU subdivision + calculation = new ArrayList(); + calculation.add(attributeDefault); + currentLuSubdivision.setAttributeDefaults(calculation); + plot.addChildDefinition(currentLuSubdivision); - if( subdivisions.indexOf( luDataYear.getLuNextYear() ) == -1 ) { - subdivisions.add( luDataYear.getLuNextYear()); - } + // Adds a Previous Category LU using the LU Conversion attribute + CodeAttributeDefinition previousLu = survey.getSchema().createCodeAttributeDefinition(); + previousLu.setName(ATTR_PREVIOUS_CATEGORY); + previousLu.setListName(CODE_LIST_LAND_USE); + previousLu.setCalculated(true); + previousLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - previous"); + attributeDefault = new AttributeDefault(); + attributeDefault.setExpression("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 1, 1)"); // get the first + // character of the + // LU conversion CF + // --> C + calculation = new ArrayList(); + calculation.add(attributeDefault); + previousLu.setAttributeDefaults(calculation); + plot.addChildDefinition(previousLu); + + // Adds a Previous Category LU using the LU Conversion attribute + CodeAttributeDefinition oldestLu = survey.getSchema().createCodeAttributeDefinition(); + oldestLu.setName(ATTR_OLDEST_CATEGORY); + oldestLu.setListName(CODE_LIST_LAND_USE); + oldestLu.setCalculated(true); + oldestLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - oldest"); + calculation = new ArrayList(); + calculation.add(new AttributeDefault("substring( " + TEMPLATE_SECOND_LU_CONVERSION + ", 1,1)", // if the oldest + // LU conversion + // was FS then + // it becomes F + TEMPLATE_SECOND_LU_CHANGE + " = true() ")); + calculation.add(new AttributeDefault("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 1,1)", // if the oldest + // LU conversion + // was FS then + // it becomes F + "idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + ") or " + TEMPLATE_SECOND_LU_CHANGE + " = true() ")); + + oldestLu.setAttributeDefaults(calculation); + plot.addChildDefinition(oldestLu); + } + + private Survey addIPCCAttributes(Survey survey) { + EntityDefinition plot = survey.getSchema().getRootEntityDefinition("plot"); + addAuxilliaryAttributes(survey, plot); + + for (int year = IPCCGenerator.START_YEAR; year <= IPCCGenerator.END_YEAR; year++) { + addLuSubcategory(survey, plot, year); + CodeAttributeDefinition category = addLuCategory(survey, plot, year); + addLuSubdivision(survey, plot, category, year); } - - Collections.sort( subdivisions ); - return subdivisions; + return survey; + } + + public Survey addIPCCAttributesToSurvey(Survey survey) throws IPCCGeneratorException { + // Check if the Survey follows the latest 2022 IPCC Survey Template + // If the survey is based on the latest IPCC 2022 Template no further processing + // is needed + if (!is2022IPCCTemplate(survey)) { + // Check that survey has necessary attributes and code-lists + checkSurveyLUAttributes(survey); + checkSurveyLUCodeLists(survey); + + // All the necessary attributes are present + // Add the yearly LAND USE cat/subcategory/subdivision attributes! + return addIPCCAttributes(survey); + + } else { + return survey; + } + } + + private CodeAttributeDefinition addLuCategory(Survey survey, EntityDefinition plot, int year) { + // Create the parent attribute for the LU Subcategory ( the initial Land Use) + CodeAttributeDefinition category = survey.getSchema().createCodeAttributeDefinition(); + category.setName(getIpccCategoryAttrName(year)); + category.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Category "); + category.setListName(CODE_LIST_LAND_USE); + category.setCalculated(true); + + ArrayList calculation = new ArrayList(); + calculation.add(new AttributeDefault("substring(" + (IPCC_ATTR_PREFIX + year + IPCC_SUBCATEGORY) + ", 2, 1)")); + + category.setAttributeDefaults(calculation); + plot.addChildDefinition(category); + return category; + } + + private void addLuSubcategory(Survey survey, EntityDefinition plot, int year) { + + // Create the parent attribute for the LU Subcategory ( the initial Land Use) + TextAttributeDefinition subcategory = survey.getSchema().createTextAttributeDefinition(); + subcategory.setName(IPCC_ATTR_PREFIX + year + IPCC_SUBCATEGORY); + subcategory.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Conversion "); + subcategory.setCalculated(true); + + int thresHold20Years = year - IPCC_20_YEARS_RULE; + + ArrayList calculation = new ArrayList(); + + calculation.add( + new AttributeDefault( + TEMPLATE_LAND_USE_SUBCATEGORY, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "!= true()" + + " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + ) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBCATEGORY, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + + " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year + + " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " >=" + thresHold20Years) + ); + + calculation.add(new AttributeDefault( + "concat(" + ATTR_CURRENT_CATEGORY + "," + ATTR_CURRENT_CATEGORY + ")", + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " < " + thresHold20Years) + ); + + calculation.add(new AttributeDefault( + "concat(" + ATTR_PREVIOUS_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", + TEMPLATE_LAND_USE_CATEGORY_CHANGED + + " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + + "and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " > " + year) + ); + + calculation.add(new AttributeDefault( + "concat(" + ATTR_OLDEST_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", + TEMPLATE_SECOND_LU_CHANGE + "=true() " + + "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year + + " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " >= " + thresHold20Years) + ); + + calculation.add(new AttributeDefault( + "concat(" + ATTR_PREVIOUS_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", + TEMPLATE_SECOND_LU_CHANGE + "=true() " + + " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " < " + thresHold20Years) + ); + + calculation.add(new AttributeDefault( + "concat(" + ATTR_OLDEST_CATEGORY + "," + ATTR_OLDEST_CATEGORY + ")", + TEMPLATE_SECOND_LU_CHANGE + "=true() " + + "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " >= "+ thresHold20Years) + ); + + subcategory.setAttributeDefaults(calculation); + subcategory.setAnnotation(null, ATTR_CURRENT_CATEGORY); + plot.addChildDefinition(subcategory); + } + + private void addLuSubdivision(Survey survey, EntityDefinition plot, CodeAttributeDefinition categoryParent, + int year) { + CodeAttributeDefinition subdivision = survey.getSchema().createCodeAttributeDefinition(); + subdivision.setName(getIpccSubdivisionAttrName(year)); + subdivision.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Subdivision "); + subdivision.setListName(CODE_LIST_LAND_USE); + subdivision.setParentCodeAttributeDefinition(categoryParent); + subdivision.setCalculated(true); + + ArrayList calculation = new ArrayList(); + + calculation + .add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBDIVISION, + TEMPLATE_LAND_USE_CHANGE_ONCE + "!= true()") + ); + + calculation + .add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBDIVISION, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + + " and ( idm:blank(" + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + " ) or " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + " != true() ) " + + " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, + TEMPLATE_SECOND_LU_CHANGE + " = true()" + + " and ( idm:blank(" + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " ) or " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " != true() ) "+ + " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year + + " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year + )); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBDIVISION, + TEMPLATE_SECOND_LU_CHANGE + " = true()" + + " and ( idm:blank(" + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " ) or " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " != true() ) "+ + " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year + )); + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " = true() " + + " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + + "and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " > " + year) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, + TEMPLATE_SECOND_LU_CHANGE + "=true() " + + "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_SECOND_SUBDIVISION, + TEMPLATE_SECOND_LU_CHANGE + "=true() " + + "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " > " + year) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, + "( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + + " and " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=true() "+ + " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year + + " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year + + )); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBDIVISION, + "( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) "+ + " and " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() "+ + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=false() " + + "and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year + + )); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBDIVISION, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=false() "+ + " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year) + ); + + subdivision.setAttributeDefaults(calculation); + plot.addChildDefinition(subdivision); + } - - public YearData getYearData() { - return yearData; + private void checkSurveyLUAttributes(Survey survey) throws IPCCGeneratorException { + // Check that the LU attributes are already on the survey + // If one of them is not available an exception is thrown! + ArrayList luDefaultAttributePaths = new ArrayList(); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CATEGORY); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBCATEGORY); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_INITIAL_SUBDIVISION); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CONVERSION); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CONVERSION_YEAR); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CHANGE); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SECOND_SUBDIVISION); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CATEGORY_CHANGED); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CHANGE_ONCE); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED); + + for (String attributePath : luDefaultAttributePaths) { + try { + survey.getSchema().getDefinitionByPath(attributePath); + } catch (InvalidPathException e) { + throw new IPCCGeneratorException("Missing attribute in Survey : " + attributePath, e); + } + } + + } + + private void checkSurveyLUCodeLists(Survey survey) throws IPCCGeneratorException { + + ArrayList luCodeLists = new ArrayList(); + luCodeLists.add(CODE_LIST_LAND_USE); + luCodeLists.add(CODE_LIST_LAND_USE_SUBCATEGORY); + + for (String codeList : luCodeLists) { + try { + survey.getCodeList(codeList); + } catch (InvalidPathException e) { + throw new IPCCGeneratorException("Missing Code List in Survey : " + codeList, e); + } + } } + private boolean is2022IPCCTemplate(Survey survey) { + // TODO Auto-generated method stub + // Check if the survey is based on the very latest 2022 IPCC survey template + // with all the LU changes + return false; + } + } From a766f5f4a3fb96280ee6c6f6fbb228063d17ef52 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:36 +0100 Subject: [PATCH 1416/1620] New translations IPCCSurveyAdapter.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 389 +++++++++++++++++- 1 file changed, 368 insertions(+), 21 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 2fbf2f293f..32e67d9b02 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,39 +1,386 @@ -package org.openforis.collect.earth.ipcc.view; +package org.openforis.collect.earth.ipcc; -import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.SettlementType; +import java.util.ArrayList; -import se.gustavkarlsson.gwiz.AbstractWizardPage; +import org.openforis.idm.metamodel.AttributeDefault; +import org.openforis.idm.metamodel.CodeAttributeDefinition; +import org.openforis.idm.metamodel.EntityDefinition; +import org.openforis.idm.metamodel.NodeLabel; +import org.openforis.idm.metamodel.Survey; +import org.openforis.idm.metamodel.TextAttributeDefinition; +import org.openforis.idm.path.InvalidPathException; -public class SettlementPage extends SubdivisionPage { +public class IPCCSurveyAdapter { + public static final String IPCC_ATTR_PARENT_SUFIX = "_parent"; + public static final String IPCC_ATTR_PREFIX = "ipcc_"; + public static final String IPCC_CATEGORY = "_category"; + public static final String IPCC_SUBCATEGORY = "_subcategory"; + public static final String IPCC_SUBDIVISION = "_subdivision"; - private static final long serialVersionUID = 1548578357804057242L; - private AbstractWizardPage nextPage = new WetlandPage(); + public static final String ATTR_CURRENT_CATEGORY = IPCC_ATTR_PREFIX + "current_category"; + public static final String ATTR_CURRENT_SUBDIVISION = IPCC_ATTR_PREFIX + "current_subdivision"; + public static final String ATTR_OLDEST_CATEGORY = IPCC_ATTR_PREFIX + "oldest_category"; + public static final String ATTR_PREVIOUS_CATEGORY = IPCC_ATTR_PREFIX + "previous_category"; + public static final String ATTR_PREVIOUS_SUBDIVISION = IPCC_ATTR_PREFIX + "previous_subdivision"; + private static final String CODE_LIST_LAND_USE = "land_use"; + private static final String CODE_LIST_LAND_USE_SUBCATEGORY = "land_use_subcategory"; + + private static final int IPCC_20_YEARS_RULE = 20; + + + private static final String PLOT_ENTITY = "plot"; + + private static final String TEMPLATE_LAND_USE_CATEGORY = "land_use_category"; + private static final String TEMPLATE_LAND_USE_CATEGORY_CHANGED = "land_use_category_has_changed"; + private static final String TEMPLATE_LAND_USE_CHANGE_ONCE = "land_use_change_once"; + private static final String TEMPLATE_LAND_USE_INITIAL_SUBDIVISION = "land_use_initial_subdivision"; + private static final String TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION = "land_use_initial_subdivision"; + private static final String TEMPLATE_LAND_USE_SECOND_SUBDIVISION = "second_lu_subdivision"; + private static final String TEMPLATE_LAND_USE_SUBCATEGORY = "land_use_subcategory"; + private static final String TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED = "land_use_subcategory_year_of_change"; + private static final String TEMPLATE_LAND_USE_SUBDIVISION = "land_use_subdivision"; + private static final String TEMPLATE_LAND_USE_SUBDIVISION_CHANGED = "land_use_subdivision_change"; + private static final String TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED = "land_use_subdivision_year_of_change"; + private static final String TEMPLATE_SECOND_LU_CHANGE = "second_lu_change"; + private static final String TEMPLATE_SECOND_LU_CONVERSION = "second_lu_conversion"; + private static final String TEMPLATE_SECOND_LU_CONVERSION_YEAR = "second_lu_conversion_year"; - public SettlementPage() { - super( LandUseCategory.S ); + public static String getIpccCategoryAttrName(int year) { + return IPCC_ATTR_PREFIX + year + IPCC_CATEGORY; } - @Override - protected AbstractWizardPage getNextPage() { - return nextPage; + public static String getIpccSubdivisionAttrName(int year) { + return IPCC_ATTR_PREFIX + year + IPCC_SUBDIVISION; } + private void addAuxilliaryAttributes(Survey survey, EntityDefinition plot) { + // Adds a Current Category LU 2022 calculated attribute to be used for the + // Subdivision as parent + CodeAttributeDefinition currentLu = survey.getSchema().createCodeAttributeDefinition(); + currentLu.setName(ATTR_CURRENT_CATEGORY); + currentLu.setListName(CODE_LIST_LAND_USE); + currentLu.setCalculated(true); + currentLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - current"); + AttributeDefault attributeDefault = new AttributeDefault(); + attributeDefault.setExpression("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 2, 1)"); // get the second + // character of the + // LU conversion CF + // --> F + ArrayList calculation = new ArrayList(); + calculation.add(attributeDefault); + currentLu.setAttributeDefaults(calculation); + plot.addChildDefinition(currentLu); + + // adds the Current Subdivision 2022 attribute, which is just a copy of + // land_use_subdivision + CodeAttributeDefinition currentLuSubdivision = survey.getSchema().createCodeAttributeDefinition(); + currentLuSubdivision.setName(ATTR_CURRENT_SUBDIVISION); + currentLuSubdivision.setListName(CODE_LIST_LAND_USE); + currentLuSubdivision.setParentCodeAttributeDefinition(currentLu); + currentLuSubdivision.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Subdivision - current"); + attributeDefault = new AttributeDefault(); + attributeDefault.setExpression(TEMPLATE_LAND_USE_SUBDIVISION); // gets the current LU subdivision + calculation = new ArrayList(); + calculation.add(attributeDefault); + currentLuSubdivision.setAttributeDefaults(calculation); + plot.addChildDefinition(currentLuSubdivision); + + // Adds a Previous Category LU using the LU Conversion attribute + CodeAttributeDefinition previousLu = survey.getSchema().createCodeAttributeDefinition(); + previousLu.setName(ATTR_PREVIOUS_CATEGORY); + previousLu.setListName(CODE_LIST_LAND_USE); + previousLu.setCalculated(true); + previousLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - previous"); + attributeDefault = new AttributeDefault(); + attributeDefault.setExpression("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 1, 1)"); // get the first + // character of the + // LU conversion CF + // --> C + calculation = new ArrayList(); + calculation.add(attributeDefault); + previousLu.setAttributeDefaults(calculation); + plot.addChildDefinition(previousLu); + + // Adds a Previous Category LU using the LU Conversion attribute + CodeAttributeDefinition oldestLu = survey.getSchema().createCodeAttributeDefinition(); + oldestLu.setName(ATTR_OLDEST_CATEGORY); + oldestLu.setListName(CODE_LIST_LAND_USE); + oldestLu.setCalculated(true); + oldestLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - oldest"); + calculation = new ArrayList(); + calculation.add(new AttributeDefault("substring( " + TEMPLATE_SECOND_LU_CONVERSION + ", 1,1)", // if the oldest + // LU conversion + // was FS then + // it becomes F + TEMPLATE_SECOND_LU_CHANGE + " = true() ")); + calculation.add(new AttributeDefault("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 1,1)", // if the oldest + // LU conversion + // was FS then + // it becomes F + "idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + ") or " + TEMPLATE_SECOND_LU_CHANGE + " = true() ")); + + oldestLu.setAttributeDefaults(calculation); + plot.addChildDefinition(oldestLu); + } + + private Survey addIPCCAttributes(Survey survey) { + EntityDefinition plot = survey.getSchema().getRootEntityDefinition("plot"); + addAuxilliaryAttributes(survey, plot); + + for (int year = IPCCGenerator.START_YEAR; year <= IPCCGenerator.END_YEAR; year++) { + addLuSubcategory(survey, plot, year); + CodeAttributeDefinition category = addLuCategory(survey, plot, year); + addLuSubdivision(survey, plot, category, year); + } + + return survey; + } + + public Survey addIPCCAttributesToSurvey(Survey survey) throws IPCCGeneratorException { + // Check if the Survey follows the latest 2022 IPCC Survey Template + // If the survey is based on the latest IPCC 2022 Template no further processing + // is needed + if (!is2022IPCCTemplate(survey)) { + // Check that survey has necessary attributes and code-lists + checkSurveyLUAttributes(survey); + checkSurveyLUCodeLists(survey); + + // All the necessary attributes are present + // Add the yearly LAND USE cat/subcategory/subdivision attributes! + return addIPCCAttributes(survey); + + } else { + return survey; + } + } + + private CodeAttributeDefinition addLuCategory(Survey survey, EntityDefinition plot, int year) { + // Create the parent attribute for the LU Subcategory ( the initial Land Use) + CodeAttributeDefinition category = survey.getSchema().createCodeAttributeDefinition(); + category.setName(getIpccCategoryAttrName(year)); + category.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Category "); + category.setListName(CODE_LIST_LAND_USE); + category.setCalculated(true); + + ArrayList calculation = new ArrayList(); + calculation.add(new AttributeDefault("substring(" + (IPCC_ATTR_PREFIX + year + IPCC_SUBCATEGORY) + ", 2, 1)")); + + category.setAttributeDefaults(calculation); + plot.addChildDefinition(category); + return category; + } + + private void addLuSubcategory(Survey survey, EntityDefinition plot, int year) { + + // Create the parent attribute for the LU Subcategory ( the initial Land Use) + TextAttributeDefinition subcategory = survey.getSchema().createTextAttributeDefinition(); + subcategory.setName(IPCC_ATTR_PREFIX + year + IPCC_SUBCATEGORY); + subcategory.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Conversion "); + subcategory.setCalculated(true); + + int thresHold20Years = year - IPCC_20_YEARS_RULE; + + ArrayList calculation = new ArrayList(); + + calculation.add( + new AttributeDefault( + TEMPLATE_LAND_USE_SUBCATEGORY, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "!= true()" + + " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + ) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBCATEGORY, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + + " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year + + " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " >=" + thresHold20Years) + ); + + calculation.add(new AttributeDefault( + "concat(" + ATTR_CURRENT_CATEGORY + "," + ATTR_CURRENT_CATEGORY + ")", + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " < " + thresHold20Years) + ); + + calculation.add(new AttributeDefault( + "concat(" + ATTR_PREVIOUS_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", + TEMPLATE_LAND_USE_CATEGORY_CHANGED + + " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + + "and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " > " + year) + ); + + calculation.add(new AttributeDefault( + "concat(" + ATTR_OLDEST_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", + TEMPLATE_SECOND_LU_CHANGE + "=true() " + + "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year + + " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " >= " + thresHold20Years) + ); + + calculation.add(new AttributeDefault( + "concat(" + ATTR_PREVIOUS_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", + TEMPLATE_SECOND_LU_CHANGE + "=true() " + + " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " < " + thresHold20Years) + ); + + calculation.add(new AttributeDefault( + "concat(" + ATTR_OLDEST_CATEGORY + "," + ATTR_OLDEST_CATEGORY + ")", + TEMPLATE_SECOND_LU_CHANGE + "=true() " + + "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " >= "+ thresHold20Years) + ); + + subcategory.setAttributeDefaults(calculation); + subcategory.setAnnotation(null, ATTR_CURRENT_CATEGORY); + plot.addChildDefinition(subcategory); + } + + private void addLuSubdivision(Survey survey, EntityDefinition plot, CodeAttributeDefinition categoryParent, + int year) { + CodeAttributeDefinition subdivision = survey.getSchema().createCodeAttributeDefinition(); + subdivision.setName(getIpccSubdivisionAttrName(year)); + subdivision.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Subdivision "); + subdivision.setListName(CODE_LIST_LAND_USE); + subdivision.setParentCodeAttributeDefinition(categoryParent); + subdivision.setCalculated(true); + + ArrayList calculation = new ArrayList(); + + calculation + .add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBDIVISION, + TEMPLATE_LAND_USE_CHANGE_ONCE + "!= true()") + ); + + calculation + .add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBDIVISION, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + + " and ( idm:blank(" + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + " ) or " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + " != true() ) " + + " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, + TEMPLATE_SECOND_LU_CHANGE + " = true()" + + " and ( idm:blank(" + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " ) or " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " != true() ) "+ + " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year + + " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year + )); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBDIVISION, + TEMPLATE_SECOND_LU_CHANGE + " = true()" + + " and ( idm:blank(" + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " ) or " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " != true() ) "+ + " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year + )); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " = true() " + + " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + + "and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " > " + year) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, + TEMPLATE_SECOND_LU_CHANGE + "=true() " + + "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_SECOND_SUBDIVISION, + TEMPLATE_SECOND_LU_CHANGE + "=true() " + + "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " > " + year) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, + "( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + + " and " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=true() "+ + " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year + + " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year + + )); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBDIVISION, + "( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) "+ + " and " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() "+ + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=false() " + + "and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year + + )); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBDIVISION, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=false() "+ + " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year) + ); + + subdivision.setAttributeDefaults(calculation); + plot.addChildDefinition(subdivision); - @Override - protected boolean isFinishAllowed() { - return false; } - @Override - protected Object[] getValues() { - return SettlementType.values(); + private void checkSurveyLUAttributes(Survey survey) throws IPCCGeneratorException { + // Check that the LU attributes are already on the survey + // If one of them is not available an exception is thrown! + ArrayList luDefaultAttributePaths = new ArrayList(); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CATEGORY); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBCATEGORY); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_INITIAL_SUBDIVISION); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CONVERSION); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CONVERSION_YEAR); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CHANGE); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SECOND_SUBDIVISION); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CATEGORY_CHANGED); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CHANGE_ONCE); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED); + + for (String attributePath : luDefaultAttributePaths) { + try { + survey.getSchema().getDefinitionByPath(attributePath); + } catch (InvalidPathException e) { + throw new IPCCGeneratorException("Missing attribute in Survey : " + attributePath, e); + } + } + } - @Override - protected String getLabel() { - return Messages.getString("SettlementPage.0"); //$NON-NLS-1$ + private void checkSurveyLUCodeLists(Survey survey) throws IPCCGeneratorException { + + ArrayList luCodeLists = new ArrayList(); + luCodeLists.add(CODE_LIST_LAND_USE); + luCodeLists.add(CODE_LIST_LAND_USE_SUBCATEGORY); + + for (String codeList : luCodeLists) { + try { + survey.getCodeList(codeList); + } catch (InvalidPathException e) { + throw new IPCCGeneratorException("Missing Code List in Survey : " + codeList, e); + } + } } + private boolean is2022IPCCTemplate(Survey survey) { + // TODO Auto-generated method stub + // Check if the survey is based on the very latest 2022 IPCC survey template + // with all the LU changes + return false; + } + } From a48720c5cb83988f11a0cf068c1cccc26d0ca5d3 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:37 +0100 Subject: [PATCH 1417/1620] New translations IPCCSurveyAdapter.java (English) --- .../earth/app/view/Messages_en.properties | 567 ++++++++++++------ 1 file changed, 372 insertions(+), 195 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index c15098bfaa..32e67d9b02 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,209 +1,386 @@ package org.openforis.collect.earth.ipcc; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; import java.util.ArrayList; -import java.util.List; - -import org.apache.poi.hssf.usermodel.HSSFWorkbook; -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.CellStyle; -import org.apache.poi.ss.usermodel.Font; -import org.apache.poi.ss.usermodel.IndexedColors; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.ss.usermodel.Workbook; -import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -@Component -public class IPCCDataExportMatrixExtendedExcel extends IPCCDataExportTimeSeries { - - Logger logger = LoggerFactory.getLogger(IPCCDataExportMatrixExtendedExcel.class); - - public IPCCDataExportMatrixExtendedExcel() { - super(); - setExportTypeUsed(ExportType.IPCC); + +import org.openforis.idm.metamodel.AttributeDefault; +import org.openforis.idm.metamodel.CodeAttributeDefinition; +import org.openforis.idm.metamodel.EntityDefinition; +import org.openforis.idm.metamodel.NodeLabel; +import org.openforis.idm.metamodel.Survey; +import org.openforis.idm.metamodel.TextAttributeDefinition; +import org.openforis.idm.path.InvalidPathException; + +public class IPCCSurveyAdapter { + + public static final String IPCC_ATTR_PARENT_SUFIX = "_parent"; + public static final String IPCC_ATTR_PREFIX = "ipcc_"; + public static final String IPCC_CATEGORY = "_category"; + public static final String IPCC_SUBCATEGORY = "_subcategory"; + public static final String IPCC_SUBDIVISION = "_subdivision"; + + public static final String ATTR_CURRENT_CATEGORY = IPCC_ATTR_PREFIX + "current_category"; + public static final String ATTR_CURRENT_SUBDIVISION = IPCC_ATTR_PREFIX + "current_subdivision"; + public static final String ATTR_OLDEST_CATEGORY = IPCC_ATTR_PREFIX + "oldest_category"; + public static final String ATTR_PREVIOUS_CATEGORY = IPCC_ATTR_PREFIX + "previous_category"; + public static final String ATTR_PREVIOUS_SUBDIVISION = IPCC_ATTR_PREFIX + "previous_subdivision"; + private static final String CODE_LIST_LAND_USE = "land_use"; + private static final String CODE_LIST_LAND_USE_SUBCATEGORY = "land_use_subcategory"; + + private static final int IPCC_20_YEARS_RULE = 20; + + + private static final String PLOT_ENTITY = "plot"; + + private static final String TEMPLATE_LAND_USE_CATEGORY = "land_use_category"; + private static final String TEMPLATE_LAND_USE_CATEGORY_CHANGED = "land_use_category_has_changed"; + private static final String TEMPLATE_LAND_USE_CHANGE_ONCE = "land_use_change_once"; + private static final String TEMPLATE_LAND_USE_INITIAL_SUBDIVISION = "land_use_initial_subdivision"; + private static final String TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION = "land_use_initial_subdivision"; + private static final String TEMPLATE_LAND_USE_SECOND_SUBDIVISION = "second_lu_subdivision"; + private static final String TEMPLATE_LAND_USE_SUBCATEGORY = "land_use_subcategory"; + private static final String TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED = "land_use_subcategory_year_of_change"; + private static final String TEMPLATE_LAND_USE_SUBDIVISION = "land_use_subdivision"; + private static final String TEMPLATE_LAND_USE_SUBDIVISION_CHANGED = "land_use_subdivision_change"; + private static final String TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED = "land_use_subdivision_year_of_change"; + private static final String TEMPLATE_SECOND_LU_CHANGE = "second_lu_change"; + private static final String TEMPLATE_SECOND_LU_CONVERSION = "second_lu_conversion"; + private static final String TEMPLATE_SECOND_LU_CONVERSION_YEAR = "second_lu_conversion_year"; + + public static String getIpccCategoryAttrName(int year) { + return IPCC_ATTR_PREFIX + year + IPCC_CATEGORY; } - @Override - protected File generateFile(List strataData) throws IOException { - File excelDestination = File.createTempFile("LuMatrixTimeseries_EXTENDED", ".xls"); - excelDestination.deleteOnExit(); - // Create a Workbook - try(Workbook workbook = new HSSFWorkbook() ) {// new HSSFWorkbook() for generating `.xls` file - - /* - * CreationHelper helps us create instances of various things like DataFormat, - * Hyperlink, RichTextString etc, in a format (HSSF, XSSF) independent way - */ - // CreationHelper createHelper = workbook.getCreationHelper(); - - // Create a Font for styling header cells - Font cornerFont = workbook.createFont(); - cornerFont.setBold(true); - cornerFont.setFontHeightInPoints((short) 15); - cornerFont.setColor(IndexedColors.GREY_80_PERCENT.getIndex()); - // Create a CellStyle with the font - CellStyle cornerCellStyle = workbook.createCellStyle(); - cornerCellStyle.setFont(cornerFont); - - // Create a Font for styling header cells - Font headerFont = workbook.createFont(); - headerFont.setBold(true); - headerFont.setFontHeightInPoints((short) 14); - headerFont.setColor(IndexedColors.DARK_TEAL.getIndex()); - // Create a CellStyle with the font - CellStyle headerCellStyle = workbook.createCellStyle(); - headerCellStyle.setFont(headerFont); - - // Create a Font for styling non-diagonal cells - Font stdFont = workbook.createFont(); - stdFont.setBold(false); - stdFont.setFontHeightInPoints((short) 14); - stdFont.setColor(IndexedColors.DARK_RED.getIndex()); - // Create a CellStyle with the font - CellStyle stdCellStyle = workbook.createCellStyle(); - stdCellStyle.setFont(stdFont); - - // Create a Font for styling diagonal cells - Font diagonalFont = workbook.createFont(); - diagonalFont.setBold(true); - diagonalFont.setFontHeightInPoints((short) 14); - diagonalFont.setColor(IndexedColors.DARK_GREEN.getIndex()); - // Create a CellStyle with the font - CellStyle diagonalCellStyle = workbook.createCellStyle(); - diagonalCellStyle.setFont(diagonalFont); - - // Create a Font for styling diagonal cells - Font strataFont = workbook.createFont(); - strataFont.setBold(true); - strataFont.setFontHeightInPoints((short) 16); - strataFont.setColor(IndexedColors.BLUE.getIndex()); - // Create a CellStyle with the font - CellStyle strataCellStyle = workbook.createCellStyle(); - strataCellStyle.setFont(strataFont); - - List availableYears = new ArrayList(); - for (StratumPerYearData yearDataStratumP : strataData) { - if (!availableYears.contains(Integer.valueOf(yearDataStratumP.getYear()))) { - availableYears.add(yearDataStratumP.getYear()); - } - } + public static String getIpccSubdivisionAttrName(int year) { + return IPCC_ATTR_PREFIX + year + IPCC_SUBDIVISION; + } + + private void addAuxilliaryAttributes(Survey survey, EntityDefinition plot) { + // Adds a Current Category LU 2022 calculated attribute to be used for the + // Subdivision as parent + CodeAttributeDefinition currentLu = survey.getSchema().createCodeAttributeDefinition(); + currentLu.setName(ATTR_CURRENT_CATEGORY); + currentLu.setListName(CODE_LIST_LAND_USE); + currentLu.setCalculated(true); + currentLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - current"); + AttributeDefault attributeDefault = new AttributeDefault(); + attributeDefault.setExpression("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 2, 1)"); // get the second + // character of the + // LU conversion CF + // --> F + ArrayList calculation = new ArrayList(); + calculation.add(attributeDefault); + currentLu.setAttributeDefaults(calculation); + plot.addChildDefinition(currentLu); + + // adds the Current Subdivision 2022 attribute, which is just a copy of + // land_use_subdivision + CodeAttributeDefinition currentLuSubdivision = survey.getSchema().createCodeAttributeDefinition(); + currentLuSubdivision.setName(ATTR_CURRENT_SUBDIVISION); + currentLuSubdivision.setListName(CODE_LIST_LAND_USE); + currentLuSubdivision.setParentCodeAttributeDefinition(currentLu); + currentLuSubdivision.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Subdivision - current"); + attributeDefault = new AttributeDefault(); + attributeDefault.setExpression(TEMPLATE_LAND_USE_SUBDIVISION); // gets the current LU subdivision + calculation = new ArrayList(); + calculation.add(attributeDefault); + currentLuSubdivision.setAttributeDefaults(calculation); + plot.addChildDefinition(currentLuSubdivision); + + // Adds a Previous Category LU using the LU Conversion attribute + CodeAttributeDefinition previousLu = survey.getSchema().createCodeAttributeDefinition(); + previousLu.setName(ATTR_PREVIOUS_CATEGORY); + previousLu.setListName(CODE_LIST_LAND_USE); + previousLu.setCalculated(true); + previousLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - previous"); + attributeDefault = new AttributeDefault(); + attributeDefault.setExpression("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 1, 1)"); // get the first + // character of the + // LU conversion CF + // --> C + calculation = new ArrayList(); + calculation.add(attributeDefault); + previousLu.setAttributeDefaults(calculation); + plot.addChildDefinition(previousLu); + + // Adds a Previous Category LU using the LU Conversion attribute + CodeAttributeDefinition oldestLu = survey.getSchema().createCodeAttributeDefinition(); + oldestLu.setName(ATTR_OLDEST_CATEGORY); + oldestLu.setListName(CODE_LIST_LAND_USE); + oldestLu.setCalculated(true); + oldestLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - oldest"); + calculation = new ArrayList(); + calculation.add(new AttributeDefault("substring( " + TEMPLATE_SECOND_LU_CONVERSION + ", 1,1)", // if the oldest + // LU conversion + // was FS then + // it becomes F + TEMPLATE_SECOND_LU_CHANGE + " = true() ")); + calculation.add(new AttributeDefault("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 1,1)", // if the oldest + // LU conversion + // was FS then + // it becomes F + "idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + ") or " + TEMPLATE_SECOND_LU_CHANGE + " = true() ")); + + oldestLu.setAttributeDefaults(calculation); + plot.addChildDefinition(oldestLu); + } + + private Survey addIPCCAttributes(Survey survey) { + EntityDefinition plot = survey.getSchema().getRootEntityDefinition("plot"); + addAuxilliaryAttributes(survey, plot); + + for (int year = IPCCGenerator.START_YEAR; year <= IPCCGenerator.END_YEAR; year++) { + addLuSubcategory(survey, plot, year); + CodeAttributeDefinition category = addLuCategory(survey, plot, year); + addLuSubdivision(survey, plot, category, year); + } + + return survey; + } + + public Survey addIPCCAttributesToSurvey(Survey survey) throws IPCCGeneratorException { + // Check if the Survey follows the latest 2022 IPCC Survey Template + // If the survey is based on the latest IPCC 2022 Template no further processing + // is needed + if (!is2022IPCCTemplate(survey)) { + // Check that survey has necessary attributes and code-lists + checkSurveyLUAttributes(survey); + checkSurveyLUCodeLists(survey); + + // All the necessary attributes are present + // Add the yearly LAND USE cat/subcategory/subdivision attributes! + return addIPCCAttributes(survey); + + } else { + return survey; + } + } + + private CodeAttributeDefinition addLuCategory(Survey survey, EntityDefinition plot, int year) { + // Create the parent attribute for the LU Subcategory ( the initial Land Use) + CodeAttributeDefinition category = survey.getSchema().createCodeAttributeDefinition(); + category.setName(getIpccCategoryAttrName(year)); + category.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Category "); + category.setListName(CODE_LIST_LAND_USE); + category.setCalculated(true); - for (Integer yearToOutput : availableYears) { - - int rowNum = 0; - // Create a Sheet - Sheet sheet = workbook.createSheet("LU Matrix " + yearToOutput + "-" + (yearToOutput + 1)); - - for (StratumPerYearData yearDataStratum : strataData) { - // Get the stratums for the year - if (yearDataStratum.getYear() != yearToOutput) { - continue; // The stratum contains data for a different year that we are going to output in - // the sheet - } - - - sheet.createRow(rowNum++); // create empty row - - // Create a Row - Row infoRow = sheet.createRow(rowNum++); - Cell cell = infoRow.createCell(0); - cell.setCellStyle(headerCellStyle); - cell.setCellValue("Climate"); - cell = infoRow.createCell(1); - cell.setCellStyle(strataCellStyle); - cell.setCellValue(yearDataStratum.getClimate()); - - infoRow = sheet.createRow(rowNum++); - cell = infoRow.createCell(0); - cell.setCellStyle(headerCellStyle); - cell.setCellValue("Soil"); - cell = infoRow.createCell(1); - cell.setCellStyle(strataCellStyle); - cell.setCellValue(yearDataStratum.getSoil()); - - infoRow = sheet.createRow(rowNum++); - cell = infoRow.createCell(0); - cell.setCellStyle(headerCellStyle); - cell.setCellValue("Global Ecological Zone (GEZ)"); - cell = infoRow.createCell(1); - cell.setCellStyle(strataCellStyle); - cell.setCellValue(yearDataStratum.getGez()); - - // Add some empty rows before next section - sheet.createRow(rowNum++); - - // Create a Row - Row headerRow = sheet.createRow(rowNum++); - cell = headerRow.createCell(0); - cell.setCellValue( - "Transition " + yearDataStratum.getYear() + "/" + (yearDataStratum.getYear() + 1)); - cell.setCellStyle(cornerCellStyle); - - MatrixSheet matrix = new MatrixSheet(yearDataStratum); - int cellPosition = 1; - for (LandUseSubdivision subdivision : matrix.getSubdivisions()) { - cell = headerRow.createCell(cellPosition++); - cell.setCellValue(subdivision.toString()); - cell.setCellStyle(headerCellStyle); - } - - int colNum = 0; - for (LandUseSubdivision subdivisionH : matrix.getSubdivisions()) { - colNum = 0; - Row row = sheet.createRow(rowNum++); - - Cell columnCell = row.createCell(colNum++); - columnCell.setCellStyle(headerCellStyle); - columnCell.setCellValue(subdivisionH.toString()); - - colNum = 1; - for (LandUseSubdivision subdivisionV : matrix.getSubdivisions()) { - - cell = row.createCell(colNum++); - cell.setCellValue(IPCCDataExportMatrixExcel - .findLuData(subdivisionH, subdivisionV, matrix.getYearData().getLuData()) - .getAreaHa()); - if (subdivisionH.equals(subdivisionV)) { - cell.setCellStyle(diagonalCellStyle); - } else { - cell.setCellStyle(stdCellStyle); - } - } - - } - - // Add some empty rows before next section - sheet.createRow(rowNum++); - sheet.createRow(rowNum++); - sheet.createRow(rowNum++); - - - // Resize all columns to fit the content size - for (int j = 0; j < colNum; j++) { - sheet.autoSizeColumn(j); - } - - } + ArrayList calculation = new ArrayList(); + calculation.add(new AttributeDefault("substring(" + (IPCC_ATTR_PREFIX + year + IPCC_SUBCATEGORY) + ", 2, 1)")); + category.setAttributeDefaults(calculation); + plot.addChildDefinition(category); + return category; + } + + private void addLuSubcategory(Survey survey, EntityDefinition plot, int year) { + + // Create the parent attribute for the LU Subcategory ( the initial Land Use) + TextAttributeDefinition subcategory = survey.getSchema().createTextAttributeDefinition(); + subcategory.setName(IPCC_ATTR_PREFIX + year + IPCC_SUBCATEGORY); + subcategory.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Conversion "); + subcategory.setCalculated(true); + + int thresHold20Years = year - IPCC_20_YEARS_RULE; + + ArrayList calculation = new ArrayList(); + + calculation.add( + new AttributeDefault( + TEMPLATE_LAND_USE_SUBCATEGORY, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "!= true()" + + " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + ) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBCATEGORY, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + + " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year + + " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " >=" + thresHold20Years) + ); + + calculation.add(new AttributeDefault( + "concat(" + ATTR_CURRENT_CATEGORY + "," + ATTR_CURRENT_CATEGORY + ")", + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " < " + thresHold20Years) + ); + + calculation.add(new AttributeDefault( + "concat(" + ATTR_PREVIOUS_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", + TEMPLATE_LAND_USE_CATEGORY_CHANGED + + " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + + "and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " > " + year) + ); + + calculation.add(new AttributeDefault( + "concat(" + ATTR_OLDEST_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", + TEMPLATE_SECOND_LU_CHANGE + "=true() " + + "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year + + " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " >= " + thresHold20Years) + ); + + calculation.add(new AttributeDefault( + "concat(" + ATTR_PREVIOUS_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", + TEMPLATE_SECOND_LU_CHANGE + "=true() " + + " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " < " + thresHold20Years) + ); + + calculation.add(new AttributeDefault( + "concat(" + ATTR_OLDEST_CATEGORY + "," + ATTR_OLDEST_CATEGORY + ")", + TEMPLATE_SECOND_LU_CHANGE + "=true() " + + "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " >= "+ thresHold20Years) + ); + + subcategory.setAttributeDefaults(calculation); + subcategory.setAnnotation(null, ATTR_CURRENT_CATEGORY); + plot.addChildDefinition(subcategory); + } + + private void addLuSubdivision(Survey survey, EntityDefinition plot, CodeAttributeDefinition categoryParent, + int year) { + CodeAttributeDefinition subdivision = survey.getSchema().createCodeAttributeDefinition(); + subdivision.setName(getIpccSubdivisionAttrName(year)); + subdivision.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Subdivision "); + subdivision.setListName(CODE_LIST_LAND_USE); + subdivision.setParentCodeAttributeDefinition(categoryParent); + subdivision.setCalculated(true); + + ArrayList calculation = new ArrayList(); + + calculation + .add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBDIVISION, + TEMPLATE_LAND_USE_CHANGE_ONCE + "!= true()") + ); + + calculation + .add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBDIVISION, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + + " and ( idm:blank(" + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + " ) or " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + " != true() ) " + + " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, + TEMPLATE_SECOND_LU_CHANGE + " = true()" + + " and ( idm:blank(" + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " ) or " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " != true() ) "+ + " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year + + " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year + )); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBDIVISION, + TEMPLATE_SECOND_LU_CHANGE + " = true()" + + " and ( idm:blank(" + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " ) or " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " != true() ) "+ + " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year + )); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " = true() " + + " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + + "and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " > " + year) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, + TEMPLATE_SECOND_LU_CHANGE + "=true() " + + "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_SECOND_SUBDIVISION, + TEMPLATE_SECOND_LU_CHANGE + "=true() " + + "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " > " + year) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, + "( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + + " and " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=true() "+ + " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year + + " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year + + )); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBDIVISION, + "( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) "+ + " and " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() "+ + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year) + ); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=false() " + + "and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year + + )); + + calculation.add(new AttributeDefault( + TEMPLATE_LAND_USE_SUBDIVISION, + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=false() "+ + " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + + " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year) + ); + + subdivision.setAttributeDefaults(calculation); + plot.addChildDefinition(subdivision); + + } + + private void checkSurveyLUAttributes(Survey survey) throws IPCCGeneratorException { + // Check that the LU attributes are already on the survey + // If one of them is not available an exception is thrown! + ArrayList luDefaultAttributePaths = new ArrayList(); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CATEGORY); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBCATEGORY); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_INITIAL_SUBDIVISION); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CONVERSION); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CONVERSION_YEAR); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CHANGE); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SECOND_SUBDIVISION); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CATEGORY_CHANGED); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CHANGE_ONCE); + luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED); + + for (String attributePath : luDefaultAttributePaths) { + try { + survey.getSchema().getDefinitionByPath(attributePath); + } catch (InvalidPathException e) { + throw new IPCCGeneratorException("Missing attribute in Survey : " + attributePath, e); } + } + + } - // Write the output to a file - try (FileOutputStream fileOut = new FileOutputStream(excelDestination)) { - workbook.write(fileOut); - } catch (IOException e) { - logger.error("Error generating Excel file", e); + private void checkSurveyLUCodeLists(Survey survey) throws IPCCGeneratorException { + + ArrayList luCodeLists = new ArrayList(); + luCodeLists.add(CODE_LIST_LAND_USE); + luCodeLists.add(CODE_LIST_LAND_USE_SUBCATEGORY); + + for (String codeList : luCodeLists) { + try { + survey.getCodeList(codeList); + } catch (InvalidPathException e) { + throw new IPCCGeneratorException("Missing Code List in Survey : " + codeList, e); } - } catch (Exception e) { - logger.error("Error generating Excel data", e); } - return excelDestination; } + private boolean is2022IPCCTemplate(Survey survey) { + // TODO Auto-generated method stub + // Check if the survey is based on the very latest 2022 IPCC survey template + // with all the LU changes + return false; + } + } From 7ade88ca5f4bef564f0b81f043877dc99f1c04b0 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:38 +0100 Subject: [PATCH 1418/1620] New translations LUDataPerYear.java (French) --- .../earth/app/view/Messages_fr.properties | 371 ++---------------- 1 file changed, 23 insertions(+), 348 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 32e67d9b02..b914ced46d 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,386 +1,61 @@ package org.openforis.collect.earth.ipcc; -import java.util.ArrayList; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.openforis.idm.metamodel.AttributeDefault; -import org.openforis.idm.metamodel.CodeAttributeDefinition; -import org.openforis.idm.metamodel.EntityDefinition; -import org.openforis.idm.metamodel.NodeLabel; -import org.openforis.idm.metamodel.Survey; -import org.openforis.idm.metamodel.TextAttributeDefinition; -import org.openforis.idm.path.InvalidPathException; +public class LUDataPerYear { -public class IPCCSurveyAdapter { - - public static final String IPCC_ATTR_PARENT_SUFIX = "_parent"; - public static final String IPCC_ATTR_PREFIX = "ipcc_"; - public static final String IPCC_CATEGORY = "_category"; - public static final String IPCC_SUBCATEGORY = "_subcategory"; - public static final String IPCC_SUBDIVISION = "_subdivision"; - - public static final String ATTR_CURRENT_CATEGORY = IPCC_ATTR_PREFIX + "current_category"; - public static final String ATTR_CURRENT_SUBDIVISION = IPCC_ATTR_PREFIX + "current_subdivision"; - public static final String ATTR_OLDEST_CATEGORY = IPCC_ATTR_PREFIX + "oldest_category"; - public static final String ATTR_PREVIOUS_CATEGORY = IPCC_ATTR_PREFIX + "previous_category"; - public static final String ATTR_PREVIOUS_SUBDIVISION = IPCC_ATTR_PREFIX + "previous_subdivision"; - private static final String CODE_LIST_LAND_USE = "land_use"; - private static final String CODE_LIST_LAND_USE_SUBCATEGORY = "land_use_subcategory"; - - private static final int IPCC_20_YEARS_RULE = 20; - - - private static final String PLOT_ENTITY = "plot"; - - private static final String TEMPLATE_LAND_USE_CATEGORY = "land_use_category"; - private static final String TEMPLATE_LAND_USE_CATEGORY_CHANGED = "land_use_category_has_changed"; - private static final String TEMPLATE_LAND_USE_CHANGE_ONCE = "land_use_change_once"; - private static final String TEMPLATE_LAND_USE_INITIAL_SUBDIVISION = "land_use_initial_subdivision"; - private static final String TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION = "land_use_initial_subdivision"; - private static final String TEMPLATE_LAND_USE_SECOND_SUBDIVISION = "second_lu_subdivision"; - private static final String TEMPLATE_LAND_USE_SUBCATEGORY = "land_use_subcategory"; - private static final String TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED = "land_use_subcategory_year_of_change"; - private static final String TEMPLATE_LAND_USE_SUBDIVISION = "land_use_subdivision"; - private static final String TEMPLATE_LAND_USE_SUBDIVISION_CHANGED = "land_use_subdivision_change"; - private static final String TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED = "land_use_subdivision_year_of_change"; - private static final String TEMPLATE_SECOND_LU_CHANGE = "second_lu_change"; - private static final String TEMPLATE_SECOND_LU_CONVERSION = "second_lu_conversion"; - private static final String TEMPLATE_SECOND_LU_CONVERSION_YEAR = "second_lu_conversion_year"; + private LandUseSubdivision lu; + private LandUseSubdivision luNextYear; + private double areaHa; - public static String getIpccCategoryAttrName(int year) { - return IPCC_ATTR_PREFIX + year + IPCC_CATEGORY; - } - - public static String getIpccSubdivisionAttrName(int year) { - return IPCC_ATTR_PREFIX + year + IPCC_SUBDIVISION; + public LUDataPerYear(LandUseSubdivision lu, LandUseSubdivision luNextYear, double areaHa) { + super(); + this.lu = lu; + this.luNextYear = luNextYear; + this.areaHa = areaHa; } - private void addAuxilliaryAttributes(Survey survey, EntityDefinition plot) { - // Adds a Current Category LU 2022 calculated attribute to be used for the - // Subdivision as parent - CodeAttributeDefinition currentLu = survey.getSchema().createCodeAttributeDefinition(); - currentLu.setName(ATTR_CURRENT_CATEGORY); - currentLu.setListName(CODE_LIST_LAND_USE); - currentLu.setCalculated(true); - currentLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - current"); - AttributeDefault attributeDefault = new AttributeDefault(); - attributeDefault.setExpression("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 2, 1)"); // get the second - // character of the - // LU conversion CF - // --> F - ArrayList calculation = new ArrayList(); - calculation.add(attributeDefault); - currentLu.setAttributeDefaults(calculation); - plot.addChildDefinition(currentLu); - - // adds the Current Subdivision 2022 attribute, which is just a copy of - // land_use_subdivision - CodeAttributeDefinition currentLuSubdivision = survey.getSchema().createCodeAttributeDefinition(); - currentLuSubdivision.setName(ATTR_CURRENT_SUBDIVISION); - currentLuSubdivision.setListName(CODE_LIST_LAND_USE); - currentLuSubdivision.setParentCodeAttributeDefinition(currentLu); - currentLuSubdivision.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Subdivision - current"); - attributeDefault = new AttributeDefault(); - attributeDefault.setExpression(TEMPLATE_LAND_USE_SUBDIVISION); // gets the current LU subdivision - calculation = new ArrayList(); - calculation.add(attributeDefault); - currentLuSubdivision.setAttributeDefaults(calculation); - plot.addChildDefinition(currentLuSubdivision); - // Adds a Previous Category LU using the LU Conversion attribute - CodeAttributeDefinition previousLu = survey.getSchema().createCodeAttributeDefinition(); - previousLu.setName(ATTR_PREVIOUS_CATEGORY); - previousLu.setListName(CODE_LIST_LAND_USE); - previousLu.setCalculated(true); - previousLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - previous"); - attributeDefault = new AttributeDefault(); - attributeDefault.setExpression("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 1, 1)"); // get the first - // character of the - // LU conversion CF - // --> C - calculation = new ArrayList(); - calculation.add(attributeDefault); - previousLu.setAttributeDefaults(calculation); - plot.addChildDefinition(previousLu); - - // Adds a Previous Category LU using the LU Conversion attribute - CodeAttributeDefinition oldestLu = survey.getSchema().createCodeAttributeDefinition(); - oldestLu.setName(ATTR_OLDEST_CATEGORY); - oldestLu.setListName(CODE_LIST_LAND_USE); - oldestLu.setCalculated(true); - oldestLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - oldest"); - calculation = new ArrayList(); - calculation.add(new AttributeDefault("substring( " + TEMPLATE_SECOND_LU_CONVERSION + ", 1,1)", // if the oldest - // LU conversion - // was FS then - // it becomes F - TEMPLATE_SECOND_LU_CHANGE + " = true() ")); - calculation.add(new AttributeDefault("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 1,1)", // if the oldest - // LU conversion - // was FS then - // it becomes F - "idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + ") or " + TEMPLATE_SECOND_LU_CHANGE + " = true() ")); - - oldestLu.setAttributeDefaults(calculation); - plot.addChildDefinition(oldestLu); + public double getAreaHa() { + return areaHa; } - private Survey addIPCCAttributes(Survey survey) { - EntityDefinition plot = survey.getSchema().getRootEntityDefinition("plot"); - addAuxilliaryAttributes(survey, plot); - - for (int year = IPCCGenerator.START_YEAR; year <= IPCCGenerator.END_YEAR; year++) { - addLuSubcategory(survey, plot, year); - CodeAttributeDefinition category = addLuCategory(survey, plot, year); - addLuSubdivision(survey, plot, category, year); - } - return survey; + @Override + public String toString() { + return "LUDataPerYear [lu=" + lu + ", luNextYear=" + luNextYear + ", areaHa=" + areaHa + "]"; } - public Survey addIPCCAttributesToSurvey(Survey survey) throws IPCCGeneratorException { - // Check if the Survey follows the latest 2022 IPCC Survey Template - // If the survey is based on the latest IPCC 2022 Template no further processing - // is needed - if (!is2022IPCCTemplate(survey)) { - // Check that survey has necessary attributes and code-lists - checkSurveyLUAttributes(survey); - checkSurveyLUCodeLists(survey); - // All the necessary attributes are present - // Add the yearly LAND USE cat/subcategory/subdivision attributes! - return addIPCCAttributes(survey); - - } else { - return survey; - } - } - private CodeAttributeDefinition addLuCategory(Survey survey, EntityDefinition plot, int year) { - // Create the parent attribute for the LU Subcategory ( the initial Land Use) - CodeAttributeDefinition category = survey.getSchema().createCodeAttributeDefinition(); - category.setName(getIpccCategoryAttrName(year)); - category.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Category "); - category.setListName(CODE_LIST_LAND_USE); - category.setCalculated(true); - ArrayList calculation = new ArrayList(); - calculation.add(new AttributeDefault("substring(" + (IPCC_ATTR_PREFIX + year + IPCC_SUBCATEGORY) + ", 2, 1)")); - category.setAttributeDefaults(calculation); - plot.addChildDefinition(category); - return category; + public LandUseSubdivision getLu() { + return lu; } - private void addLuSubcategory(Survey survey, EntityDefinition plot, int year) { - - // Create the parent attribute for the LU Subcategory ( the initial Land Use) - TextAttributeDefinition subcategory = survey.getSchema().createTextAttributeDefinition(); - subcategory.setName(IPCC_ATTR_PREFIX + year + IPCC_SUBCATEGORY); - subcategory.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Conversion "); - subcategory.setCalculated(true); - - int thresHold20Years = year - IPCC_20_YEARS_RULE; - - ArrayList calculation = new ArrayList(); - - calculation.add( - new AttributeDefault( - TEMPLATE_LAND_USE_SUBCATEGORY, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + "!= true()" + - " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " - ) - ); - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBCATEGORY, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + - " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year + - " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " >=" + thresHold20Years) - ); - calculation.add(new AttributeDefault( - "concat(" + ATTR_CURRENT_CATEGORY + "," + ATTR_CURRENT_CATEGORY + ")", - TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " < " + thresHold20Years) - ); - calculation.add(new AttributeDefault( - "concat(" + ATTR_PREVIOUS_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", - TEMPLATE_LAND_USE_CATEGORY_CHANGED + - " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + - "and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " > " + year) - ); - calculation.add(new AttributeDefault( - "concat(" + ATTR_OLDEST_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", - TEMPLATE_SECOND_LU_CHANGE + "=true() " + - "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year + - " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " >= " + thresHold20Years) - ); - - calculation.add(new AttributeDefault( - "concat(" + ATTR_PREVIOUS_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", - TEMPLATE_SECOND_LU_CHANGE + "=true() " + - " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " < " + thresHold20Years) - ); - - calculation.add(new AttributeDefault( - "concat(" + ATTR_OLDEST_CATEGORY + "," + ATTR_OLDEST_CATEGORY + ")", - TEMPLATE_SECOND_LU_CHANGE + "=true() " + - "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " >= "+ thresHold20Years) - ); - - subcategory.setAttributeDefaults(calculation); - subcategory.setAnnotation(null, ATTR_CURRENT_CATEGORY); - plot.addChildDefinition(subcategory); + public LandUseSubdivision getLuNextYear() { + return luNextYear; } - private void addLuSubdivision(Survey survey, EntityDefinition plot, CodeAttributeDefinition categoryParent, - int year) { - CodeAttributeDefinition subdivision = survey.getSchema().createCodeAttributeDefinition(); - subdivision.setName(getIpccSubdivisionAttrName(year)); - subdivision.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Subdivision "); - subdivision.setListName(CODE_LIST_LAND_USE); - subdivision.setParentCodeAttributeDefinition(categoryParent); - subdivision.setCalculated(true); - - ArrayList calculation = new ArrayList(); - - calculation - .add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBDIVISION, - TEMPLATE_LAND_USE_CHANGE_ONCE + "!= true()") - ); - - calculation - .add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBDIVISION, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + - " and ( idm:blank(" + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + " ) or " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + " != true() ) " + - " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year) - ); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, - TEMPLATE_SECOND_LU_CHANGE + " = true()" + - " and ( idm:blank(" + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " ) or " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " != true() ) "+ - " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year + - " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year - )); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBDIVISION, - TEMPLATE_SECOND_LU_CHANGE + " = true()" + - " and ( idm:blank(" + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " ) or " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " != true() ) "+ - " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year - )); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + " = true() " + - " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + - "and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " > " + year) - ); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, - TEMPLATE_SECOND_LU_CHANGE + "=true() " + - "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year) - ); - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_SECOND_SUBDIVISION, - TEMPLATE_SECOND_LU_CHANGE + "=true() " + - "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " > " + year) - ); - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, - "( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + - " and " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=true() "+ - " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year + - " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year - )); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBDIVISION, - "( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) "+ - " and " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() "+ - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year) - ); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=false() " + - "and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year - - )); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBDIVISION, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=false() "+ - " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year) - ); - - subdivision.setAttributeDefaults(calculation); - plot.addChildDefinition(subdivision); + public void setLu(LandUseSubdivision lu) { + this.lu = lu; } - private void checkSurveyLUAttributes(Survey survey) throws IPCCGeneratorException { - // Check that the LU attributes are already on the survey - // If one of them is not available an exception is thrown! - ArrayList luDefaultAttributePaths = new ArrayList(); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CATEGORY); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBCATEGORY); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_INITIAL_SUBDIVISION); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CONVERSION); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CONVERSION_YEAR); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CHANGE); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SECOND_SUBDIVISION); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CATEGORY_CHANGED); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CHANGE_ONCE); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED); - - for (String attributePath : luDefaultAttributePaths) { - try { - survey.getSchema().getDefinitionByPath(attributePath); - } catch (InvalidPathException e) { - throw new IPCCGeneratorException("Missing attribute in Survey : " + attributePath, e); - } - } - } - private void checkSurveyLUCodeLists(Survey survey) throws IPCCGeneratorException { - ArrayList luCodeLists = new ArrayList(); - luCodeLists.add(CODE_LIST_LAND_USE); - luCodeLists.add(CODE_LIST_LAND_USE_SUBCATEGORY); - for (String codeList : luCodeLists) { - try { - survey.getCodeList(codeList); - } catch (InvalidPathException e) { - throw new IPCCGeneratorException("Missing Code List in Survey : " + codeList, e); - } - } + public void setLuNextYear(LandUseSubdivision luNextYear) { + this.luNextYear = luNextYear; } - private boolean is2022IPCCTemplate(Survey survey) { - // TODO Auto-generated method stub - // Check if the survey is based on the very latest 2022 IPCC survey template - // with all the LU changes - return false; - } - } From d47d7b78380bb38460d22f21a289353b3bd31705 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:39 +0100 Subject: [PATCH 1419/1620] New translations LUDataPerYear.java (Spanish) --- .../earth/app/view/Messages_es.properties | 371 ++---------------- 1 file changed, 23 insertions(+), 348 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 32e67d9b02..b914ced46d 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,386 +1,61 @@ package org.openforis.collect.earth.ipcc; -import java.util.ArrayList; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.openforis.idm.metamodel.AttributeDefault; -import org.openforis.idm.metamodel.CodeAttributeDefinition; -import org.openforis.idm.metamodel.EntityDefinition; -import org.openforis.idm.metamodel.NodeLabel; -import org.openforis.idm.metamodel.Survey; -import org.openforis.idm.metamodel.TextAttributeDefinition; -import org.openforis.idm.path.InvalidPathException; +public class LUDataPerYear { -public class IPCCSurveyAdapter { - - public static final String IPCC_ATTR_PARENT_SUFIX = "_parent"; - public static final String IPCC_ATTR_PREFIX = "ipcc_"; - public static final String IPCC_CATEGORY = "_category"; - public static final String IPCC_SUBCATEGORY = "_subcategory"; - public static final String IPCC_SUBDIVISION = "_subdivision"; - - public static final String ATTR_CURRENT_CATEGORY = IPCC_ATTR_PREFIX + "current_category"; - public static final String ATTR_CURRENT_SUBDIVISION = IPCC_ATTR_PREFIX + "current_subdivision"; - public static final String ATTR_OLDEST_CATEGORY = IPCC_ATTR_PREFIX + "oldest_category"; - public static final String ATTR_PREVIOUS_CATEGORY = IPCC_ATTR_PREFIX + "previous_category"; - public static final String ATTR_PREVIOUS_SUBDIVISION = IPCC_ATTR_PREFIX + "previous_subdivision"; - private static final String CODE_LIST_LAND_USE = "land_use"; - private static final String CODE_LIST_LAND_USE_SUBCATEGORY = "land_use_subcategory"; - - private static final int IPCC_20_YEARS_RULE = 20; - - - private static final String PLOT_ENTITY = "plot"; - - private static final String TEMPLATE_LAND_USE_CATEGORY = "land_use_category"; - private static final String TEMPLATE_LAND_USE_CATEGORY_CHANGED = "land_use_category_has_changed"; - private static final String TEMPLATE_LAND_USE_CHANGE_ONCE = "land_use_change_once"; - private static final String TEMPLATE_LAND_USE_INITIAL_SUBDIVISION = "land_use_initial_subdivision"; - private static final String TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION = "land_use_initial_subdivision"; - private static final String TEMPLATE_LAND_USE_SECOND_SUBDIVISION = "second_lu_subdivision"; - private static final String TEMPLATE_LAND_USE_SUBCATEGORY = "land_use_subcategory"; - private static final String TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED = "land_use_subcategory_year_of_change"; - private static final String TEMPLATE_LAND_USE_SUBDIVISION = "land_use_subdivision"; - private static final String TEMPLATE_LAND_USE_SUBDIVISION_CHANGED = "land_use_subdivision_change"; - private static final String TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED = "land_use_subdivision_year_of_change"; - private static final String TEMPLATE_SECOND_LU_CHANGE = "second_lu_change"; - private static final String TEMPLATE_SECOND_LU_CONVERSION = "second_lu_conversion"; - private static final String TEMPLATE_SECOND_LU_CONVERSION_YEAR = "second_lu_conversion_year"; + private LandUseSubdivision lu; + private LandUseSubdivision luNextYear; + private double areaHa; - public static String getIpccCategoryAttrName(int year) { - return IPCC_ATTR_PREFIX + year + IPCC_CATEGORY; - } - - public static String getIpccSubdivisionAttrName(int year) { - return IPCC_ATTR_PREFIX + year + IPCC_SUBDIVISION; + public LUDataPerYear(LandUseSubdivision lu, LandUseSubdivision luNextYear, double areaHa) { + super(); + this.lu = lu; + this.luNextYear = luNextYear; + this.areaHa = areaHa; } - private void addAuxilliaryAttributes(Survey survey, EntityDefinition plot) { - // Adds a Current Category LU 2022 calculated attribute to be used for the - // Subdivision as parent - CodeAttributeDefinition currentLu = survey.getSchema().createCodeAttributeDefinition(); - currentLu.setName(ATTR_CURRENT_CATEGORY); - currentLu.setListName(CODE_LIST_LAND_USE); - currentLu.setCalculated(true); - currentLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - current"); - AttributeDefault attributeDefault = new AttributeDefault(); - attributeDefault.setExpression("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 2, 1)"); // get the second - // character of the - // LU conversion CF - // --> F - ArrayList calculation = new ArrayList(); - calculation.add(attributeDefault); - currentLu.setAttributeDefaults(calculation); - plot.addChildDefinition(currentLu); - - // adds the Current Subdivision 2022 attribute, which is just a copy of - // land_use_subdivision - CodeAttributeDefinition currentLuSubdivision = survey.getSchema().createCodeAttributeDefinition(); - currentLuSubdivision.setName(ATTR_CURRENT_SUBDIVISION); - currentLuSubdivision.setListName(CODE_LIST_LAND_USE); - currentLuSubdivision.setParentCodeAttributeDefinition(currentLu); - currentLuSubdivision.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Subdivision - current"); - attributeDefault = new AttributeDefault(); - attributeDefault.setExpression(TEMPLATE_LAND_USE_SUBDIVISION); // gets the current LU subdivision - calculation = new ArrayList(); - calculation.add(attributeDefault); - currentLuSubdivision.setAttributeDefaults(calculation); - plot.addChildDefinition(currentLuSubdivision); - // Adds a Previous Category LU using the LU Conversion attribute - CodeAttributeDefinition previousLu = survey.getSchema().createCodeAttributeDefinition(); - previousLu.setName(ATTR_PREVIOUS_CATEGORY); - previousLu.setListName(CODE_LIST_LAND_USE); - previousLu.setCalculated(true); - previousLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - previous"); - attributeDefault = new AttributeDefault(); - attributeDefault.setExpression("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 1, 1)"); // get the first - // character of the - // LU conversion CF - // --> C - calculation = new ArrayList(); - calculation.add(attributeDefault); - previousLu.setAttributeDefaults(calculation); - plot.addChildDefinition(previousLu); - - // Adds a Previous Category LU using the LU Conversion attribute - CodeAttributeDefinition oldestLu = survey.getSchema().createCodeAttributeDefinition(); - oldestLu.setName(ATTR_OLDEST_CATEGORY); - oldestLu.setListName(CODE_LIST_LAND_USE); - oldestLu.setCalculated(true); - oldestLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - oldest"); - calculation = new ArrayList(); - calculation.add(new AttributeDefault("substring( " + TEMPLATE_SECOND_LU_CONVERSION + ", 1,1)", // if the oldest - // LU conversion - // was FS then - // it becomes F - TEMPLATE_SECOND_LU_CHANGE + " = true() ")); - calculation.add(new AttributeDefault("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 1,1)", // if the oldest - // LU conversion - // was FS then - // it becomes F - "idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + ") or " + TEMPLATE_SECOND_LU_CHANGE + " = true() ")); - - oldestLu.setAttributeDefaults(calculation); - plot.addChildDefinition(oldestLu); + public double getAreaHa() { + return areaHa; } - private Survey addIPCCAttributes(Survey survey) { - EntityDefinition plot = survey.getSchema().getRootEntityDefinition("plot"); - addAuxilliaryAttributes(survey, plot); - - for (int year = IPCCGenerator.START_YEAR; year <= IPCCGenerator.END_YEAR; year++) { - addLuSubcategory(survey, plot, year); - CodeAttributeDefinition category = addLuCategory(survey, plot, year); - addLuSubdivision(survey, plot, category, year); - } - return survey; + @Override + public String toString() { + return "LUDataPerYear [lu=" + lu + ", luNextYear=" + luNextYear + ", areaHa=" + areaHa + "]"; } - public Survey addIPCCAttributesToSurvey(Survey survey) throws IPCCGeneratorException { - // Check if the Survey follows the latest 2022 IPCC Survey Template - // If the survey is based on the latest IPCC 2022 Template no further processing - // is needed - if (!is2022IPCCTemplate(survey)) { - // Check that survey has necessary attributes and code-lists - checkSurveyLUAttributes(survey); - checkSurveyLUCodeLists(survey); - // All the necessary attributes are present - // Add the yearly LAND USE cat/subcategory/subdivision attributes! - return addIPCCAttributes(survey); - - } else { - return survey; - } - } - private CodeAttributeDefinition addLuCategory(Survey survey, EntityDefinition plot, int year) { - // Create the parent attribute for the LU Subcategory ( the initial Land Use) - CodeAttributeDefinition category = survey.getSchema().createCodeAttributeDefinition(); - category.setName(getIpccCategoryAttrName(year)); - category.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Category "); - category.setListName(CODE_LIST_LAND_USE); - category.setCalculated(true); - ArrayList calculation = new ArrayList(); - calculation.add(new AttributeDefault("substring(" + (IPCC_ATTR_PREFIX + year + IPCC_SUBCATEGORY) + ", 2, 1)")); - category.setAttributeDefaults(calculation); - plot.addChildDefinition(category); - return category; + public LandUseSubdivision getLu() { + return lu; } - private void addLuSubcategory(Survey survey, EntityDefinition plot, int year) { - - // Create the parent attribute for the LU Subcategory ( the initial Land Use) - TextAttributeDefinition subcategory = survey.getSchema().createTextAttributeDefinition(); - subcategory.setName(IPCC_ATTR_PREFIX + year + IPCC_SUBCATEGORY); - subcategory.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Conversion "); - subcategory.setCalculated(true); - - int thresHold20Years = year - IPCC_20_YEARS_RULE; - - ArrayList calculation = new ArrayList(); - - calculation.add( - new AttributeDefault( - TEMPLATE_LAND_USE_SUBCATEGORY, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + "!= true()" + - " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " - ) - ); - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBCATEGORY, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + - " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year + - " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " >=" + thresHold20Years) - ); - calculation.add(new AttributeDefault( - "concat(" + ATTR_CURRENT_CATEGORY + "," + ATTR_CURRENT_CATEGORY + ")", - TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " < " + thresHold20Years) - ); - calculation.add(new AttributeDefault( - "concat(" + ATTR_PREVIOUS_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", - TEMPLATE_LAND_USE_CATEGORY_CHANGED + - " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + - "and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " > " + year) - ); - calculation.add(new AttributeDefault( - "concat(" + ATTR_OLDEST_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", - TEMPLATE_SECOND_LU_CHANGE + "=true() " + - "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year + - " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " >= " + thresHold20Years) - ); - - calculation.add(new AttributeDefault( - "concat(" + ATTR_PREVIOUS_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", - TEMPLATE_SECOND_LU_CHANGE + "=true() " + - " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " < " + thresHold20Years) - ); - - calculation.add(new AttributeDefault( - "concat(" + ATTR_OLDEST_CATEGORY + "," + ATTR_OLDEST_CATEGORY + ")", - TEMPLATE_SECOND_LU_CHANGE + "=true() " + - "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " >= "+ thresHold20Years) - ); - - subcategory.setAttributeDefaults(calculation); - subcategory.setAnnotation(null, ATTR_CURRENT_CATEGORY); - plot.addChildDefinition(subcategory); + public LandUseSubdivision getLuNextYear() { + return luNextYear; } - private void addLuSubdivision(Survey survey, EntityDefinition plot, CodeAttributeDefinition categoryParent, - int year) { - CodeAttributeDefinition subdivision = survey.getSchema().createCodeAttributeDefinition(); - subdivision.setName(getIpccSubdivisionAttrName(year)); - subdivision.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Subdivision "); - subdivision.setListName(CODE_LIST_LAND_USE); - subdivision.setParentCodeAttributeDefinition(categoryParent); - subdivision.setCalculated(true); - - ArrayList calculation = new ArrayList(); - - calculation - .add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBDIVISION, - TEMPLATE_LAND_USE_CHANGE_ONCE + "!= true()") - ); - - calculation - .add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBDIVISION, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + - " and ( idm:blank(" + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + " ) or " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + " != true() ) " + - " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year) - ); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, - TEMPLATE_SECOND_LU_CHANGE + " = true()" + - " and ( idm:blank(" + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " ) or " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " != true() ) "+ - " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year + - " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year - )); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBDIVISION, - TEMPLATE_SECOND_LU_CHANGE + " = true()" + - " and ( idm:blank(" + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " ) or " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " != true() ) "+ - " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year - )); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + " = true() " + - " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + - "and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " > " + year) - ); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, - TEMPLATE_SECOND_LU_CHANGE + "=true() " + - "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year) - ); - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_SECOND_SUBDIVISION, - TEMPLATE_SECOND_LU_CHANGE + "=true() " + - "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " > " + year) - ); - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, - "( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + - " and " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=true() "+ - " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year + - " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year - )); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBDIVISION, - "( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) "+ - " and " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() "+ - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year) - ); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=false() " + - "and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year - - )); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBDIVISION, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=false() "+ - " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year) - ); - - subdivision.setAttributeDefaults(calculation); - plot.addChildDefinition(subdivision); + public void setLu(LandUseSubdivision lu) { + this.lu = lu; } - private void checkSurveyLUAttributes(Survey survey) throws IPCCGeneratorException { - // Check that the LU attributes are already on the survey - // If one of them is not available an exception is thrown! - ArrayList luDefaultAttributePaths = new ArrayList(); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CATEGORY); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBCATEGORY); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_INITIAL_SUBDIVISION); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CONVERSION); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CONVERSION_YEAR); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CHANGE); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SECOND_SUBDIVISION); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CATEGORY_CHANGED); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CHANGE_ONCE); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED); - - for (String attributePath : luDefaultAttributePaths) { - try { - survey.getSchema().getDefinitionByPath(attributePath); - } catch (InvalidPathException e) { - throw new IPCCGeneratorException("Missing attribute in Survey : " + attributePath, e); - } - } - } - private void checkSurveyLUCodeLists(Survey survey) throws IPCCGeneratorException { - ArrayList luCodeLists = new ArrayList(); - luCodeLists.add(CODE_LIST_LAND_USE); - luCodeLists.add(CODE_LIST_LAND_USE_SUBCATEGORY); - for (String codeList : luCodeLists) { - try { - survey.getCodeList(codeList); - } catch (InvalidPathException e) { - throw new IPCCGeneratorException("Missing Code List in Survey : " + codeList, e); - } - } + public void setLuNextYear(LandUseSubdivision luNextYear) { + this.luNextYear = luNextYear; } - private boolean is2022IPCCTemplate(Survey survey) { - // TODO Auto-generated method stub - // Check if the survey is based on the very latest 2022 IPCC survey template - // with all the LU changes - return false; - } - } From d2b9626956bd6e5168a447cb42ac59ec291efca0 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:40 +0100 Subject: [PATCH 1420/1620] New translations LUDataPerYear.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 371 ++---------------- 1 file changed, 23 insertions(+), 348 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 32e67d9b02..b914ced46d 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,386 +1,61 @@ package org.openforis.collect.earth.ipcc; -import java.util.ArrayList; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.openforis.idm.metamodel.AttributeDefault; -import org.openforis.idm.metamodel.CodeAttributeDefinition; -import org.openforis.idm.metamodel.EntityDefinition; -import org.openforis.idm.metamodel.NodeLabel; -import org.openforis.idm.metamodel.Survey; -import org.openforis.idm.metamodel.TextAttributeDefinition; -import org.openforis.idm.path.InvalidPathException; +public class LUDataPerYear { -public class IPCCSurveyAdapter { - - public static final String IPCC_ATTR_PARENT_SUFIX = "_parent"; - public static final String IPCC_ATTR_PREFIX = "ipcc_"; - public static final String IPCC_CATEGORY = "_category"; - public static final String IPCC_SUBCATEGORY = "_subcategory"; - public static final String IPCC_SUBDIVISION = "_subdivision"; - - public static final String ATTR_CURRENT_CATEGORY = IPCC_ATTR_PREFIX + "current_category"; - public static final String ATTR_CURRENT_SUBDIVISION = IPCC_ATTR_PREFIX + "current_subdivision"; - public static final String ATTR_OLDEST_CATEGORY = IPCC_ATTR_PREFIX + "oldest_category"; - public static final String ATTR_PREVIOUS_CATEGORY = IPCC_ATTR_PREFIX + "previous_category"; - public static final String ATTR_PREVIOUS_SUBDIVISION = IPCC_ATTR_PREFIX + "previous_subdivision"; - private static final String CODE_LIST_LAND_USE = "land_use"; - private static final String CODE_LIST_LAND_USE_SUBCATEGORY = "land_use_subcategory"; - - private static final int IPCC_20_YEARS_RULE = 20; - - - private static final String PLOT_ENTITY = "plot"; - - private static final String TEMPLATE_LAND_USE_CATEGORY = "land_use_category"; - private static final String TEMPLATE_LAND_USE_CATEGORY_CHANGED = "land_use_category_has_changed"; - private static final String TEMPLATE_LAND_USE_CHANGE_ONCE = "land_use_change_once"; - private static final String TEMPLATE_LAND_USE_INITIAL_SUBDIVISION = "land_use_initial_subdivision"; - private static final String TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION = "land_use_initial_subdivision"; - private static final String TEMPLATE_LAND_USE_SECOND_SUBDIVISION = "second_lu_subdivision"; - private static final String TEMPLATE_LAND_USE_SUBCATEGORY = "land_use_subcategory"; - private static final String TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED = "land_use_subcategory_year_of_change"; - private static final String TEMPLATE_LAND_USE_SUBDIVISION = "land_use_subdivision"; - private static final String TEMPLATE_LAND_USE_SUBDIVISION_CHANGED = "land_use_subdivision_change"; - private static final String TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED = "land_use_subdivision_year_of_change"; - private static final String TEMPLATE_SECOND_LU_CHANGE = "second_lu_change"; - private static final String TEMPLATE_SECOND_LU_CONVERSION = "second_lu_conversion"; - private static final String TEMPLATE_SECOND_LU_CONVERSION_YEAR = "second_lu_conversion_year"; + private LandUseSubdivision lu; + private LandUseSubdivision luNextYear; + private double areaHa; - public static String getIpccCategoryAttrName(int year) { - return IPCC_ATTR_PREFIX + year + IPCC_CATEGORY; - } - - public static String getIpccSubdivisionAttrName(int year) { - return IPCC_ATTR_PREFIX + year + IPCC_SUBDIVISION; + public LUDataPerYear(LandUseSubdivision lu, LandUseSubdivision luNextYear, double areaHa) { + super(); + this.lu = lu; + this.luNextYear = luNextYear; + this.areaHa = areaHa; } - private void addAuxilliaryAttributes(Survey survey, EntityDefinition plot) { - // Adds a Current Category LU 2022 calculated attribute to be used for the - // Subdivision as parent - CodeAttributeDefinition currentLu = survey.getSchema().createCodeAttributeDefinition(); - currentLu.setName(ATTR_CURRENT_CATEGORY); - currentLu.setListName(CODE_LIST_LAND_USE); - currentLu.setCalculated(true); - currentLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - current"); - AttributeDefault attributeDefault = new AttributeDefault(); - attributeDefault.setExpression("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 2, 1)"); // get the second - // character of the - // LU conversion CF - // --> F - ArrayList calculation = new ArrayList(); - calculation.add(attributeDefault); - currentLu.setAttributeDefaults(calculation); - plot.addChildDefinition(currentLu); - - // adds the Current Subdivision 2022 attribute, which is just a copy of - // land_use_subdivision - CodeAttributeDefinition currentLuSubdivision = survey.getSchema().createCodeAttributeDefinition(); - currentLuSubdivision.setName(ATTR_CURRENT_SUBDIVISION); - currentLuSubdivision.setListName(CODE_LIST_LAND_USE); - currentLuSubdivision.setParentCodeAttributeDefinition(currentLu); - currentLuSubdivision.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Subdivision - current"); - attributeDefault = new AttributeDefault(); - attributeDefault.setExpression(TEMPLATE_LAND_USE_SUBDIVISION); // gets the current LU subdivision - calculation = new ArrayList(); - calculation.add(attributeDefault); - currentLuSubdivision.setAttributeDefaults(calculation); - plot.addChildDefinition(currentLuSubdivision); - // Adds a Previous Category LU using the LU Conversion attribute - CodeAttributeDefinition previousLu = survey.getSchema().createCodeAttributeDefinition(); - previousLu.setName(ATTR_PREVIOUS_CATEGORY); - previousLu.setListName(CODE_LIST_LAND_USE); - previousLu.setCalculated(true); - previousLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - previous"); - attributeDefault = new AttributeDefault(); - attributeDefault.setExpression("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 1, 1)"); // get the first - // character of the - // LU conversion CF - // --> C - calculation = new ArrayList(); - calculation.add(attributeDefault); - previousLu.setAttributeDefaults(calculation); - plot.addChildDefinition(previousLu); - - // Adds a Previous Category LU using the LU Conversion attribute - CodeAttributeDefinition oldestLu = survey.getSchema().createCodeAttributeDefinition(); - oldestLu.setName(ATTR_OLDEST_CATEGORY); - oldestLu.setListName(CODE_LIST_LAND_USE); - oldestLu.setCalculated(true); - oldestLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - oldest"); - calculation = new ArrayList(); - calculation.add(new AttributeDefault("substring( " + TEMPLATE_SECOND_LU_CONVERSION + ", 1,1)", // if the oldest - // LU conversion - // was FS then - // it becomes F - TEMPLATE_SECOND_LU_CHANGE + " = true() ")); - calculation.add(new AttributeDefault("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 1,1)", // if the oldest - // LU conversion - // was FS then - // it becomes F - "idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + ") or " + TEMPLATE_SECOND_LU_CHANGE + " = true() ")); - - oldestLu.setAttributeDefaults(calculation); - plot.addChildDefinition(oldestLu); + public double getAreaHa() { + return areaHa; } - private Survey addIPCCAttributes(Survey survey) { - EntityDefinition plot = survey.getSchema().getRootEntityDefinition("plot"); - addAuxilliaryAttributes(survey, plot); - - for (int year = IPCCGenerator.START_YEAR; year <= IPCCGenerator.END_YEAR; year++) { - addLuSubcategory(survey, plot, year); - CodeAttributeDefinition category = addLuCategory(survey, plot, year); - addLuSubdivision(survey, plot, category, year); - } - return survey; + @Override + public String toString() { + return "LUDataPerYear [lu=" + lu + ", luNextYear=" + luNextYear + ", areaHa=" + areaHa + "]"; } - public Survey addIPCCAttributesToSurvey(Survey survey) throws IPCCGeneratorException { - // Check if the Survey follows the latest 2022 IPCC Survey Template - // If the survey is based on the latest IPCC 2022 Template no further processing - // is needed - if (!is2022IPCCTemplate(survey)) { - // Check that survey has necessary attributes and code-lists - checkSurveyLUAttributes(survey); - checkSurveyLUCodeLists(survey); - // All the necessary attributes are present - // Add the yearly LAND USE cat/subcategory/subdivision attributes! - return addIPCCAttributes(survey); - - } else { - return survey; - } - } - private CodeAttributeDefinition addLuCategory(Survey survey, EntityDefinition plot, int year) { - // Create the parent attribute for the LU Subcategory ( the initial Land Use) - CodeAttributeDefinition category = survey.getSchema().createCodeAttributeDefinition(); - category.setName(getIpccCategoryAttrName(year)); - category.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Category "); - category.setListName(CODE_LIST_LAND_USE); - category.setCalculated(true); - ArrayList calculation = new ArrayList(); - calculation.add(new AttributeDefault("substring(" + (IPCC_ATTR_PREFIX + year + IPCC_SUBCATEGORY) + ", 2, 1)")); - category.setAttributeDefaults(calculation); - plot.addChildDefinition(category); - return category; + public LandUseSubdivision getLu() { + return lu; } - private void addLuSubcategory(Survey survey, EntityDefinition plot, int year) { - - // Create the parent attribute for the LU Subcategory ( the initial Land Use) - TextAttributeDefinition subcategory = survey.getSchema().createTextAttributeDefinition(); - subcategory.setName(IPCC_ATTR_PREFIX + year + IPCC_SUBCATEGORY); - subcategory.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Conversion "); - subcategory.setCalculated(true); - - int thresHold20Years = year - IPCC_20_YEARS_RULE; - - ArrayList calculation = new ArrayList(); - - calculation.add( - new AttributeDefault( - TEMPLATE_LAND_USE_SUBCATEGORY, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + "!= true()" + - " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " - ) - ); - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBCATEGORY, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + - " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year + - " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " >=" + thresHold20Years) - ); - calculation.add(new AttributeDefault( - "concat(" + ATTR_CURRENT_CATEGORY + "," + ATTR_CURRENT_CATEGORY + ")", - TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " < " + thresHold20Years) - ); - calculation.add(new AttributeDefault( - "concat(" + ATTR_PREVIOUS_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", - TEMPLATE_LAND_USE_CATEGORY_CHANGED + - " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + - "and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " > " + year) - ); - calculation.add(new AttributeDefault( - "concat(" + ATTR_OLDEST_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", - TEMPLATE_SECOND_LU_CHANGE + "=true() " + - "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year + - " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " >= " + thresHold20Years) - ); - - calculation.add(new AttributeDefault( - "concat(" + ATTR_PREVIOUS_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", - TEMPLATE_SECOND_LU_CHANGE + "=true() " + - " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " < " + thresHold20Years) - ); - - calculation.add(new AttributeDefault( - "concat(" + ATTR_OLDEST_CATEGORY + "," + ATTR_OLDEST_CATEGORY + ")", - TEMPLATE_SECOND_LU_CHANGE + "=true() " + - "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " >= "+ thresHold20Years) - ); - - subcategory.setAttributeDefaults(calculation); - subcategory.setAnnotation(null, ATTR_CURRENT_CATEGORY); - plot.addChildDefinition(subcategory); + public LandUseSubdivision getLuNextYear() { + return luNextYear; } - private void addLuSubdivision(Survey survey, EntityDefinition plot, CodeAttributeDefinition categoryParent, - int year) { - CodeAttributeDefinition subdivision = survey.getSchema().createCodeAttributeDefinition(); - subdivision.setName(getIpccSubdivisionAttrName(year)); - subdivision.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Subdivision "); - subdivision.setListName(CODE_LIST_LAND_USE); - subdivision.setParentCodeAttributeDefinition(categoryParent); - subdivision.setCalculated(true); - - ArrayList calculation = new ArrayList(); - - calculation - .add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBDIVISION, - TEMPLATE_LAND_USE_CHANGE_ONCE + "!= true()") - ); - - calculation - .add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBDIVISION, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + - " and ( idm:blank(" + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + " ) or " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + " != true() ) " + - " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year) - ); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, - TEMPLATE_SECOND_LU_CHANGE + " = true()" + - " and ( idm:blank(" + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " ) or " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " != true() ) "+ - " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year + - " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year - )); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBDIVISION, - TEMPLATE_SECOND_LU_CHANGE + " = true()" + - " and ( idm:blank(" + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " ) or " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " != true() ) "+ - " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year - )); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + " = true() " + - " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + - "and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " > " + year) - ); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, - TEMPLATE_SECOND_LU_CHANGE + "=true() " + - "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year) - ); - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_SECOND_SUBDIVISION, - TEMPLATE_SECOND_LU_CHANGE + "=true() " + - "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " > " + year) - ); - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, - "( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + - " and " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=true() "+ - " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year + - " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year - )); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBDIVISION, - "( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) "+ - " and " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() "+ - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year) - ); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=false() " + - "and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year - - )); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBDIVISION, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=false() "+ - " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year) - ); - - subdivision.setAttributeDefaults(calculation); - plot.addChildDefinition(subdivision); + public void setLu(LandUseSubdivision lu) { + this.lu = lu; } - private void checkSurveyLUAttributes(Survey survey) throws IPCCGeneratorException { - // Check that the LU attributes are already on the survey - // If one of them is not available an exception is thrown! - ArrayList luDefaultAttributePaths = new ArrayList(); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CATEGORY); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBCATEGORY); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_INITIAL_SUBDIVISION); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CONVERSION); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CONVERSION_YEAR); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CHANGE); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SECOND_SUBDIVISION); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CATEGORY_CHANGED); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CHANGE_ONCE); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED); - - for (String attributePath : luDefaultAttributePaths) { - try { - survey.getSchema().getDefinitionByPath(attributePath); - } catch (InvalidPathException e) { - throw new IPCCGeneratorException("Missing attribute in Survey : " + attributePath, e); - } - } - } - private void checkSurveyLUCodeLists(Survey survey) throws IPCCGeneratorException { - ArrayList luCodeLists = new ArrayList(); - luCodeLists.add(CODE_LIST_LAND_USE); - luCodeLists.add(CODE_LIST_LAND_USE_SUBCATEGORY); - for (String codeList : luCodeLists) { - try { - survey.getCodeList(codeList); - } catch (InvalidPathException e) { - throw new IPCCGeneratorException("Missing Code List in Survey : " + codeList, e); - } - } + public void setLuNextYear(LandUseSubdivision luNextYear) { + this.luNextYear = luNextYear; } - private boolean is2022IPCCTemplate(Survey survey) { - // TODO Auto-generated method stub - // Check if the survey is based on the very latest 2022 IPCC survey template - // with all the LU changes - return false; - } - } From f51cccf0ed06eda2590fea3b235bae7ca5e5e24c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:41 +0100 Subject: [PATCH 1421/1620] New translations LUDataPerYear.java (English) --- .../earth/app/view/Messages_en.properties | 371 ++---------------- 1 file changed, 23 insertions(+), 348 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 32e67d9b02..b914ced46d 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,386 +1,61 @@ package org.openforis.collect.earth.ipcc; -import java.util.ArrayList; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.openforis.idm.metamodel.AttributeDefault; -import org.openforis.idm.metamodel.CodeAttributeDefinition; -import org.openforis.idm.metamodel.EntityDefinition; -import org.openforis.idm.metamodel.NodeLabel; -import org.openforis.idm.metamodel.Survey; -import org.openforis.idm.metamodel.TextAttributeDefinition; -import org.openforis.idm.path.InvalidPathException; +public class LUDataPerYear { -public class IPCCSurveyAdapter { - - public static final String IPCC_ATTR_PARENT_SUFIX = "_parent"; - public static final String IPCC_ATTR_PREFIX = "ipcc_"; - public static final String IPCC_CATEGORY = "_category"; - public static final String IPCC_SUBCATEGORY = "_subcategory"; - public static final String IPCC_SUBDIVISION = "_subdivision"; - - public static final String ATTR_CURRENT_CATEGORY = IPCC_ATTR_PREFIX + "current_category"; - public static final String ATTR_CURRENT_SUBDIVISION = IPCC_ATTR_PREFIX + "current_subdivision"; - public static final String ATTR_OLDEST_CATEGORY = IPCC_ATTR_PREFIX + "oldest_category"; - public static final String ATTR_PREVIOUS_CATEGORY = IPCC_ATTR_PREFIX + "previous_category"; - public static final String ATTR_PREVIOUS_SUBDIVISION = IPCC_ATTR_PREFIX + "previous_subdivision"; - private static final String CODE_LIST_LAND_USE = "land_use"; - private static final String CODE_LIST_LAND_USE_SUBCATEGORY = "land_use_subcategory"; - - private static final int IPCC_20_YEARS_RULE = 20; - - - private static final String PLOT_ENTITY = "plot"; - - private static final String TEMPLATE_LAND_USE_CATEGORY = "land_use_category"; - private static final String TEMPLATE_LAND_USE_CATEGORY_CHANGED = "land_use_category_has_changed"; - private static final String TEMPLATE_LAND_USE_CHANGE_ONCE = "land_use_change_once"; - private static final String TEMPLATE_LAND_USE_INITIAL_SUBDIVISION = "land_use_initial_subdivision"; - private static final String TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION = "land_use_initial_subdivision"; - private static final String TEMPLATE_LAND_USE_SECOND_SUBDIVISION = "second_lu_subdivision"; - private static final String TEMPLATE_LAND_USE_SUBCATEGORY = "land_use_subcategory"; - private static final String TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED = "land_use_subcategory_year_of_change"; - private static final String TEMPLATE_LAND_USE_SUBDIVISION = "land_use_subdivision"; - private static final String TEMPLATE_LAND_USE_SUBDIVISION_CHANGED = "land_use_subdivision_change"; - private static final String TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED = "land_use_subdivision_year_of_change"; - private static final String TEMPLATE_SECOND_LU_CHANGE = "second_lu_change"; - private static final String TEMPLATE_SECOND_LU_CONVERSION = "second_lu_conversion"; - private static final String TEMPLATE_SECOND_LU_CONVERSION_YEAR = "second_lu_conversion_year"; + private LandUseSubdivision lu; + private LandUseSubdivision luNextYear; + private double areaHa; - public static String getIpccCategoryAttrName(int year) { - return IPCC_ATTR_PREFIX + year + IPCC_CATEGORY; - } - - public static String getIpccSubdivisionAttrName(int year) { - return IPCC_ATTR_PREFIX + year + IPCC_SUBDIVISION; + public LUDataPerYear(LandUseSubdivision lu, LandUseSubdivision luNextYear, double areaHa) { + super(); + this.lu = lu; + this.luNextYear = luNextYear; + this.areaHa = areaHa; } - private void addAuxilliaryAttributes(Survey survey, EntityDefinition plot) { - // Adds a Current Category LU 2022 calculated attribute to be used for the - // Subdivision as parent - CodeAttributeDefinition currentLu = survey.getSchema().createCodeAttributeDefinition(); - currentLu.setName(ATTR_CURRENT_CATEGORY); - currentLu.setListName(CODE_LIST_LAND_USE); - currentLu.setCalculated(true); - currentLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - current"); - AttributeDefault attributeDefault = new AttributeDefault(); - attributeDefault.setExpression("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 2, 1)"); // get the second - // character of the - // LU conversion CF - // --> F - ArrayList calculation = new ArrayList(); - calculation.add(attributeDefault); - currentLu.setAttributeDefaults(calculation); - plot.addChildDefinition(currentLu); - - // adds the Current Subdivision 2022 attribute, which is just a copy of - // land_use_subdivision - CodeAttributeDefinition currentLuSubdivision = survey.getSchema().createCodeAttributeDefinition(); - currentLuSubdivision.setName(ATTR_CURRENT_SUBDIVISION); - currentLuSubdivision.setListName(CODE_LIST_LAND_USE); - currentLuSubdivision.setParentCodeAttributeDefinition(currentLu); - currentLuSubdivision.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Subdivision - current"); - attributeDefault = new AttributeDefault(); - attributeDefault.setExpression(TEMPLATE_LAND_USE_SUBDIVISION); // gets the current LU subdivision - calculation = new ArrayList(); - calculation.add(attributeDefault); - currentLuSubdivision.setAttributeDefaults(calculation); - plot.addChildDefinition(currentLuSubdivision); - // Adds a Previous Category LU using the LU Conversion attribute - CodeAttributeDefinition previousLu = survey.getSchema().createCodeAttributeDefinition(); - previousLu.setName(ATTR_PREVIOUS_CATEGORY); - previousLu.setListName(CODE_LIST_LAND_USE); - previousLu.setCalculated(true); - previousLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - previous"); - attributeDefault = new AttributeDefault(); - attributeDefault.setExpression("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 1, 1)"); // get the first - // character of the - // LU conversion CF - // --> C - calculation = new ArrayList(); - calculation.add(attributeDefault); - previousLu.setAttributeDefaults(calculation); - plot.addChildDefinition(previousLu); - - // Adds a Previous Category LU using the LU Conversion attribute - CodeAttributeDefinition oldestLu = survey.getSchema().createCodeAttributeDefinition(); - oldestLu.setName(ATTR_OLDEST_CATEGORY); - oldestLu.setListName(CODE_LIST_LAND_USE); - oldestLu.setCalculated(true); - oldestLu.setLabel(NodeLabel.Type.HEADING, "en", "IPCC Land Use Category - oldest"); - calculation = new ArrayList(); - calculation.add(new AttributeDefault("substring( " + TEMPLATE_SECOND_LU_CONVERSION + ", 1,1)", // if the oldest - // LU conversion - // was FS then - // it becomes F - TEMPLATE_SECOND_LU_CHANGE + " = true() ")); - calculation.add(new AttributeDefault("substring( " + TEMPLATE_LAND_USE_SUBCATEGORY + ", 1,1)", // if the oldest - // LU conversion - // was FS then - // it becomes F - "idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + ") or " + TEMPLATE_SECOND_LU_CHANGE + " = true() ")); - - oldestLu.setAttributeDefaults(calculation); - plot.addChildDefinition(oldestLu); + public double getAreaHa() { + return areaHa; } - private Survey addIPCCAttributes(Survey survey) { - EntityDefinition plot = survey.getSchema().getRootEntityDefinition("plot"); - addAuxilliaryAttributes(survey, plot); - - for (int year = IPCCGenerator.START_YEAR; year <= IPCCGenerator.END_YEAR; year++) { - addLuSubcategory(survey, plot, year); - CodeAttributeDefinition category = addLuCategory(survey, plot, year); - addLuSubdivision(survey, plot, category, year); - } - return survey; + @Override + public String toString() { + return "LUDataPerYear [lu=" + lu + ", luNextYear=" + luNextYear + ", areaHa=" + areaHa + "]"; } - public Survey addIPCCAttributesToSurvey(Survey survey) throws IPCCGeneratorException { - // Check if the Survey follows the latest 2022 IPCC Survey Template - // If the survey is based on the latest IPCC 2022 Template no further processing - // is needed - if (!is2022IPCCTemplate(survey)) { - // Check that survey has necessary attributes and code-lists - checkSurveyLUAttributes(survey); - checkSurveyLUCodeLists(survey); - // All the necessary attributes are present - // Add the yearly LAND USE cat/subcategory/subdivision attributes! - return addIPCCAttributes(survey); - - } else { - return survey; - } - } - private CodeAttributeDefinition addLuCategory(Survey survey, EntityDefinition plot, int year) { - // Create the parent attribute for the LU Subcategory ( the initial Land Use) - CodeAttributeDefinition category = survey.getSchema().createCodeAttributeDefinition(); - category.setName(getIpccCategoryAttrName(year)); - category.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Category "); - category.setListName(CODE_LIST_LAND_USE); - category.setCalculated(true); - ArrayList calculation = new ArrayList(); - calculation.add(new AttributeDefault("substring(" + (IPCC_ATTR_PREFIX + year + IPCC_SUBCATEGORY) + ", 2, 1)")); - category.setAttributeDefaults(calculation); - plot.addChildDefinition(category); - return category; + public LandUseSubdivision getLu() { + return lu; } - private void addLuSubcategory(Survey survey, EntityDefinition plot, int year) { - - // Create the parent attribute for the LU Subcategory ( the initial Land Use) - TextAttributeDefinition subcategory = survey.getSchema().createTextAttributeDefinition(); - subcategory.setName(IPCC_ATTR_PREFIX + year + IPCC_SUBCATEGORY); - subcategory.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Conversion "); - subcategory.setCalculated(true); - - int thresHold20Years = year - IPCC_20_YEARS_RULE; - - ArrayList calculation = new ArrayList(); - - calculation.add( - new AttributeDefault( - TEMPLATE_LAND_USE_SUBCATEGORY, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + "!= true()" + - " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " - ) - ); - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBCATEGORY, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + - " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year + - " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " >=" + thresHold20Years) - ); - calculation.add(new AttributeDefault( - "concat(" + ATTR_CURRENT_CATEGORY + "," + ATTR_CURRENT_CATEGORY + ")", - TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " < " + thresHold20Years) - ); - calculation.add(new AttributeDefault( - "concat(" + ATTR_PREVIOUS_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", - TEMPLATE_LAND_USE_CATEGORY_CHANGED + - " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + - "and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " > " + year) - ); - calculation.add(new AttributeDefault( - "concat(" + ATTR_OLDEST_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", - TEMPLATE_SECOND_LU_CHANGE + "=true() " + - "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year + - " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " >= " + thresHold20Years) - ); - - calculation.add(new AttributeDefault( - "concat(" + ATTR_PREVIOUS_CATEGORY + "," + ATTR_PREVIOUS_CATEGORY + ")", - TEMPLATE_SECOND_LU_CHANGE + "=true() " + - " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " < " + thresHold20Years) - ); - - calculation.add(new AttributeDefault( - "concat(" + ATTR_OLDEST_CATEGORY + "," + ATTR_OLDEST_CATEGORY + ")", - TEMPLATE_SECOND_LU_CHANGE + "=true() " + - "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " >= "+ thresHold20Years) - ); - - subcategory.setAttributeDefaults(calculation); - subcategory.setAnnotation(null, ATTR_CURRENT_CATEGORY); - plot.addChildDefinition(subcategory); + public LandUseSubdivision getLuNextYear() { + return luNextYear; } - private void addLuSubdivision(Survey survey, EntityDefinition plot, CodeAttributeDefinition categoryParent, - int year) { - CodeAttributeDefinition subdivision = survey.getSchema().createCodeAttributeDefinition(); - subdivision.setName(getIpccSubdivisionAttrName(year)); - subdivision.setLabel(NodeLabel.Type.HEADING, "en", "IPCC " + year + " Land Use Subdivision "); - subdivision.setListName(CODE_LIST_LAND_USE); - subdivision.setParentCodeAttributeDefinition(categoryParent); - subdivision.setCalculated(true); - - ArrayList calculation = new ArrayList(); - - calculation - .add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBDIVISION, - TEMPLATE_LAND_USE_CHANGE_ONCE + "!= true()") - ); - - calculation - .add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBDIVISION, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + - " and ( idm:blank(" + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + " ) or " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + " != true() ) " + - " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year) - ); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, - TEMPLATE_SECOND_LU_CHANGE + " = true()" + - " and ( idm:blank(" + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " ) or " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " != true() ) "+ - " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year + - " and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year - )); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBDIVISION, - TEMPLATE_SECOND_LU_CHANGE + " = true()" + - " and ( idm:blank(" + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " ) or " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + " != true() ) "+ - " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year - )); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + " = true() " + - " and ( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + - "and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " > " + year) - ); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, - TEMPLATE_SECOND_LU_CHANGE + "=true() " + - "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " <= " + year) - ); - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_SECOND_SUBDIVISION, - TEMPLATE_SECOND_LU_CHANGE + "=true() " + - "and " + TEMPLATE_SECOND_LU_CONVERSION_YEAR + " > " + year) - ); - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, - "( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) " + - " and " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=true() "+ - " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year + - " and " + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED + " <= " + year - )); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBDIVISION, - "( idm:blank(" + TEMPLATE_SECOND_LU_CHANGE + " ) or " + TEMPLATE_SECOND_LU_CHANGE + " != true() ) "+ - " and " + TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() "+ - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year) - ); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_PREVIOUS_SUBDIVISION, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=false() " + - "and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " > " + year - - )); - - calculation.add(new AttributeDefault( - TEMPLATE_LAND_USE_SUBDIVISION, - TEMPLATE_LAND_USE_CATEGORY_CHANGED + "=false() "+ - " and " + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED + "=true() " + - " and " + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED + " <= " + year) - ); - - subdivision.setAttributeDefaults(calculation); - plot.addChildDefinition(subdivision); + public void setLu(LandUseSubdivision lu) { + this.lu = lu; } - private void checkSurveyLUAttributes(Survey survey) throws IPCCGeneratorException { - // Check that the LU attributes are already on the survey - // If one of them is not available an exception is thrown! - ArrayList luDefaultAttributePaths = new ArrayList(); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CATEGORY); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBCATEGORY); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_INITIAL_SUBDIVISION); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION_YEAR_CHANGED); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CONVERSION); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CONVERSION_YEAR); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_SECOND_LU_CHANGE); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SECOND_SUBDIVISION); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CATEGORY_CHANGED); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBDIVISION_CHANGED); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_CHANGE_ONCE); - luDefaultAttributePaths.add("/" + PLOT_ENTITY + "/" + TEMPLATE_LAND_USE_SUBCATEGORY_YEAR_CHANGED); - - for (String attributePath : luDefaultAttributePaths) { - try { - survey.getSchema().getDefinitionByPath(attributePath); - } catch (InvalidPathException e) { - throw new IPCCGeneratorException("Missing attribute in Survey : " + attributePath, e); - } - } - } - private void checkSurveyLUCodeLists(Survey survey) throws IPCCGeneratorException { - ArrayList luCodeLists = new ArrayList(); - luCodeLists.add(CODE_LIST_LAND_USE); - luCodeLists.add(CODE_LIST_LAND_USE_SUBCATEGORY); - for (String codeList : luCodeLists) { - try { - survey.getCodeList(codeList); - } catch (InvalidPathException e) { - throw new IPCCGeneratorException("Missing Code List in Survey : " + codeList, e); - } - } + public void setLuNextYear(LandUseSubdivision luNextYear) { + this.luNextYear = luNextYear; } - private boolean is2022IPCCTemplate(Survey survey) { - // TODO Auto-generated method stub - // Check if the survey is based on the very latest 2022 IPCC survey template - // with all the LU changes - return false; - } - } From bbd8eecfecec2bddc6815a71966ad403ba42f012 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:42 +0100 Subject: [PATCH 1422/1620] New translations MatrixSheet.java (French) --- .../earth/app/view/Messages_fr.properties | 69 +++++++------------ 1 file changed, 25 insertions(+), 44 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index b914ced46d..d7ce509776 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,61 +1,42 @@ package org.openforis.collect.earth.ipcc; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; - -public class LUDataPerYear { - - private LandUseSubdivision lu; - private LandUseSubdivision luNextYear; - private double areaHa; - - public LUDataPerYear(LandUseSubdivision lu, LandUseSubdivision luNextYear, double areaHa) { - super(); - this.lu = lu; - this.luNextYear = luNextYear; - this.areaHa = areaHa; - } - - - public double getAreaHa() { - return areaHa; - } - - - @Override - public String toString() { - return "LUDataPerYear [lu=" + lu + ", luNextYear=" + luNextYear + ", areaHa=" + areaHa + "]"; - } - - - - - - public LandUseSubdivision getLu() { - return lu; - } - +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +public class MatrixSheet { + private YearData yearData; - public LandUseSubdivision getLuNextYear() { - return luNextYear; + public MatrixSheet(YearData yearData) { + this.yearData = yearData; } + public List> getSubdivisions() { + List> subdivisions = new ArrayList<>(); + for (LUDataPerYear luDataYear : yearData.getLuData()) { + if( subdivisions.indexOf( luDataYear.getLu() ) == -1 ) { + subdivisions.add( luDataYear.getLu()); + } + if( subdivisions.indexOf( luDataYear.getLuNextYear() ) == -1 ) { + subdivisions.add( luDataYear.getLuNextYear()); + } + } + + Collections.sort( subdivisions ); - public void setLu(LandUseSubdivision lu) { - this.lu = lu; + return subdivisions; + } + - - - - - public void setLuNextYear(LandUseSubdivision luNextYear) { - this.luNextYear = luNextYear; + public YearData getYearData() { + return yearData; } } From fdba818ab4625bb947dfe642c3c4be979e84ee36 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:43 +0100 Subject: [PATCH 1423/1620] New translations MatrixSheet.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 69 +++++++------------ 1 file changed, 25 insertions(+), 44 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index b914ced46d..d7ce509776 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,61 +1,42 @@ package org.openforis.collect.earth.ipcc; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; - -public class LUDataPerYear { - - private LandUseSubdivision lu; - private LandUseSubdivision luNextYear; - private double areaHa; - - public LUDataPerYear(LandUseSubdivision lu, LandUseSubdivision luNextYear, double areaHa) { - super(); - this.lu = lu; - this.luNextYear = luNextYear; - this.areaHa = areaHa; - } - - - public double getAreaHa() { - return areaHa; - } - - - @Override - public String toString() { - return "LUDataPerYear [lu=" + lu + ", luNextYear=" + luNextYear + ", areaHa=" + areaHa + "]"; - } - - - - - - public LandUseSubdivision getLu() { - return lu; - } - +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +public class MatrixSheet { + private YearData yearData; - public LandUseSubdivision getLuNextYear() { - return luNextYear; + public MatrixSheet(YearData yearData) { + this.yearData = yearData; } + public List> getSubdivisions() { + List> subdivisions = new ArrayList<>(); + for (LUDataPerYear luDataYear : yearData.getLuData()) { + if( subdivisions.indexOf( luDataYear.getLu() ) == -1 ) { + subdivisions.add( luDataYear.getLu()); + } + if( subdivisions.indexOf( luDataYear.getLuNextYear() ) == -1 ) { + subdivisions.add( luDataYear.getLuNextYear()); + } + } + + Collections.sort( subdivisions ); - public void setLu(LandUseSubdivision lu) { - this.lu = lu; + return subdivisions; + } + - - - - - public void setLuNextYear(LandUseSubdivision luNextYear) { - this.luNextYear = luNextYear; + public YearData getYearData() { + return yearData; } } From b709cc47faaeaea9c2bccd68803a162055121f4d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:45 +0100 Subject: [PATCH 1424/1620] New translations IPCCRDBGenerator.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 70 +++++++++---------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index d7ce509776..d10cc6fb23 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,42 +1,42 @@ package org.openforis.collect.earth.ipcc; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; - -public class MatrixSheet { - - private YearData yearData; - - public MatrixSheet(YearData yearData) { - this.yearData = yearData; +import javax.swing.SwingUtilities; + +import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.RDBExporter; +import org.openforis.collect.earth.app.service.RDBPostProcessor; +import org.openforis.collect.earth.app.service.RegionCalculationUtils; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.concurrency.Progress; +import org.openforis.idm.metamodel.Survey; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class IPCCRDBGenerator { + + @Autowired + RDBExporter rdbExporter; + + @Autowired + private RegionCalculationUtils regionCalculation; + + public void generateRelationalDatabase(Survey modifiedSurvey, InfiniteProgressMonitor infiniteProgressMonitor) { + RDBPostProcessor ipccCallback = postProcessIpccData(); + rdbExporter.exportDataToRDB(modifiedSurvey, ExportType.IPCC, infiniteProgressMonitor, ipccCallback); } - public List> getSubdivisions() { - List> subdivisions = new ArrayList<>(); - - for (LUDataPerYear luDataYear : yearData.getLuData()) { - - if( subdivisions.indexOf( luDataYear.getLu() ) == -1 ) { - subdivisions.add( luDataYear.getLu()); - } - - if( subdivisions.indexOf( luDataYear.getLuNextYear() ) == -1 ) { - subdivisions.add( luDataYear.getLuNextYear()); - } - } - - Collections.sort( subdivisions ); - - return subdivisions; - + private RDBPostProcessor postProcessIpccData() { + // return the implementation of a RDBPostProcessor interface (the callback when the initial RDB export is done so that we can add expansion factors ) + return (progressMonitor) -> { + + SwingUtilities.invokeLater( () -> progressMonitor.setMessage("Calculating expansion factors") ); + progressMonitor.progressMade(new Progress(0, 100)); + regionCalculation.handleRegionCalculation( ExportType.IPCC, rdbExporter.getJdbcTemplate() ); + progressMonitor.progressMade(new Progress(100, 100)); + + }; } - - public YearData getYearData() { - return yearData; - } - + } From d55bfb01f27b0707f2c935fecf0ba88a70d453f1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:46 +0100 Subject: [PATCH 1425/1620] New translations MatrixSheet.java (English) --- .../earth/app/view/Messages_en.properties | 69 +++++++------------ 1 file changed, 25 insertions(+), 44 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index b914ced46d..d7ce509776 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,61 +1,42 @@ package org.openforis.collect.earth.ipcc; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; - -public class LUDataPerYear { - - private LandUseSubdivision lu; - private LandUseSubdivision luNextYear; - private double areaHa; - - public LUDataPerYear(LandUseSubdivision lu, LandUseSubdivision luNextYear, double areaHa) { - super(); - this.lu = lu; - this.luNextYear = luNextYear; - this.areaHa = areaHa; - } - - - public double getAreaHa() { - return areaHa; - } - - - @Override - public String toString() { - return "LUDataPerYear [lu=" + lu + ", luNextYear=" + luNextYear + ", areaHa=" + areaHa + "]"; - } - - - - - - public LandUseSubdivision getLu() { - return lu; - } - +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +public class MatrixSheet { + private YearData yearData; - public LandUseSubdivision getLuNextYear() { - return luNextYear; + public MatrixSheet(YearData yearData) { + this.yearData = yearData; } + public List> getSubdivisions() { + List> subdivisions = new ArrayList<>(); + for (LUDataPerYear luDataYear : yearData.getLuData()) { + if( subdivisions.indexOf( luDataYear.getLu() ) == -1 ) { + subdivisions.add( luDataYear.getLu()); + } + if( subdivisions.indexOf( luDataYear.getLuNextYear() ) == -1 ) { + subdivisions.add( luDataYear.getLuNextYear()); + } + } + + Collections.sort( subdivisions ); - public void setLu(LandUseSubdivision lu) { - this.lu = lu; + return subdivisions; + } + - - - - - public void setLuNextYear(LandUseSubdivision luNextYear) { - this.luNextYear = luNextYear; + public YearData getYearData() { + return yearData; } } From 77b4305b0553e933a019ac22e7cd8d4cfe8b368c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:47 +0100 Subject: [PATCH 1426/1620] New translations RdbExportException.java (French) --- .../earth/app/view/Messages_fr.properties | 55 ++++++++----------- 1 file changed, 24 insertions(+), 31 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index d7ce509776..e13bbc0b81 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,42 +1,35 @@ package org.openforis.collect.earth.ipcc; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +public class RdbExportException extends Exception { -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; - -public class MatrixSheet { - - private YearData yearData; - - public MatrixSheet(YearData yearData) { - this.yearData = yearData; + public RdbExportException() { + super(); + // TODO Auto-generated constructor stub } - public List> getSubdivisions() { - List> subdivisions = new ArrayList<>(); - - for (LUDataPerYear luDataYear : yearData.getLuData()) { - - if( subdivisions.indexOf( luDataYear.getLu() ) == -1 ) { - subdivisions.add( luDataYear.getLu()); - } + public RdbExportException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + // TODO Auto-generated constructor stub + } - if( subdivisions.indexOf( luDataYear.getLuNextYear() ) == -1 ) { - subdivisions.add( luDataYear.getLuNextYear()); - } - } - - Collections.sort( subdivisions ); + public RdbExportException(String message, Throwable cause) { + super(message, cause); + // TODO Auto-generated constructor stub + } - return subdivisions; - + public RdbExportException(String message) { + super(message); + // TODO Auto-generated constructor stub } - - public YearData getYearData() { - return yearData; + public RdbExportException(Throwable cause) { + super(cause); + // TODO Auto-generated constructor stub } -} + /** + * + */ + private static final long serialVersionUID = -5210016260577827042L; + +} \ No newline at end of file From 0a8f65f11086ef5ab0075977fd9552122fc8cabd Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:48 +0100 Subject: [PATCH 1427/1620] New translations RdbExportException.java (Spanish) --- .../earth/app/view/Messages_es.properties | 66 ++++++------------- 1 file changed, 20 insertions(+), 46 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index b914ced46d..e13bbc0b81 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,61 +1,35 @@ package org.openforis.collect.earth.ipcc; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +public class RdbExportException extends Exception { -public class LUDataPerYear { - - private LandUseSubdivision lu; - private LandUseSubdivision luNextYear; - private double areaHa; - - public LUDataPerYear(LandUseSubdivision lu, LandUseSubdivision luNextYear, double areaHa) { + public RdbExportException() { super(); - this.lu = lu; - this.luNextYear = luNextYear; - this.areaHa = areaHa; + // TODO Auto-generated constructor stub } - - public double getAreaHa() { - return areaHa; + public RdbExportException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + // TODO Auto-generated constructor stub } - - @Override - public String toString() { - return "LUDataPerYear [lu=" + lu + ", luNextYear=" + luNextYear + ", areaHa=" + areaHa + "]"; + public RdbExportException(String message, Throwable cause) { + super(message, cause); + // TODO Auto-generated constructor stub } - - - - - public LandUseSubdivision getLu() { - return lu; - } - - - - - - public LandUseSubdivision getLuNextYear() { - return luNextYear; + public RdbExportException(String message) { + super(message); + // TODO Auto-generated constructor stub } - - - - - public void setLu(LandUseSubdivision lu) { - this.lu = lu; + public RdbExportException(Throwable cause) { + super(cause); + // TODO Auto-generated constructor stub } + /** + * + */ + private static final long serialVersionUID = -5210016260577827042L; - - - - public void setLuNextYear(LandUseSubdivision luNextYear) { - this.luNextYear = luNextYear; - } - -} +} \ No newline at end of file From 0a1f67091bfd87e23ad609e157919c6f1b713d7f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:49 +0100 Subject: [PATCH 1428/1620] New translations RdbExportException.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 67 +++++++++---------- 1 file changed, 30 insertions(+), 37 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index d10cc6fb23..e13bbc0b81 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,42 +1,35 @@ package org.openforis.collect.earth.ipcc; -import javax.swing.SwingUtilities; - -import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.RDBExporter; -import org.openforis.collect.earth.app.service.RDBPostProcessor; -import org.openforis.collect.earth.app.service.RegionCalculationUtils; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.concurrency.Progress; -import org.openforis.idm.metamodel.Survey; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public class IPCCRDBGenerator { - - @Autowired - RDBExporter rdbExporter; - - @Autowired - private RegionCalculationUtils regionCalculation; - - public void generateRelationalDatabase(Survey modifiedSurvey, InfiniteProgressMonitor infiniteProgressMonitor) { - RDBPostProcessor ipccCallback = postProcessIpccData(); - rdbExporter.exportDataToRDB(modifiedSurvey, ExportType.IPCC, infiniteProgressMonitor, ipccCallback); +public class RdbExportException extends Exception { + + public RdbExportException() { + super(); + // TODO Auto-generated constructor stub + } + + public RdbExportException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + // TODO Auto-generated constructor stub + } + + public RdbExportException(String message, Throwable cause) { + super(message, cause); + // TODO Auto-generated constructor stub } - private RDBPostProcessor postProcessIpccData() { - // return the implementation of a RDBPostProcessor interface (the callback when the initial RDB export is done so that we can add expansion factors ) - return (progressMonitor) -> { - - SwingUtilities.invokeLater( () -> progressMonitor.setMessage("Calculating expansion factors") ); - progressMonitor.progressMade(new Progress(0, 100)); - regionCalculation.handleRegionCalculation( ExportType.IPCC, rdbExporter.getJdbcTemplate() ); - progressMonitor.progressMade(new Progress(100, 100)); - - }; + public RdbExportException(String message) { + super(message); + // TODO Auto-generated constructor stub } - - -} + + public RdbExportException(Throwable cause) { + super(cause); + // TODO Auto-generated constructor stub + } + + /** + * + */ + private static final long serialVersionUID = -5210016260577827042L; + +} \ No newline at end of file From f370d036b467985eafa2b1d028b6eb89ae5ed5d5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:50 +0100 Subject: [PATCH 1429/1620] New translations RdbExportException.java (English) --- .../earth/app/view/Messages_en.properties | 55 ++++++++----------- 1 file changed, 24 insertions(+), 31 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index d7ce509776..e13bbc0b81 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,42 +1,35 @@ package org.openforis.collect.earth.ipcc; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +public class RdbExportException extends Exception { -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; - -public class MatrixSheet { - - private YearData yearData; - - public MatrixSheet(YearData yearData) { - this.yearData = yearData; + public RdbExportException() { + super(); + // TODO Auto-generated constructor stub } - public List> getSubdivisions() { - List> subdivisions = new ArrayList<>(); - - for (LUDataPerYear luDataYear : yearData.getLuData()) { - - if( subdivisions.indexOf( luDataYear.getLu() ) == -1 ) { - subdivisions.add( luDataYear.getLu()); - } + public RdbExportException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + // TODO Auto-generated constructor stub + } - if( subdivisions.indexOf( luDataYear.getLuNextYear() ) == -1 ) { - subdivisions.add( luDataYear.getLuNextYear()); - } - } - - Collections.sort( subdivisions ); + public RdbExportException(String message, Throwable cause) { + super(message, cause); + // TODO Auto-generated constructor stub + } - return subdivisions; - + public RdbExportException(String message) { + super(message); + // TODO Auto-generated constructor stub } - - public YearData getYearData() { - return yearData; + public RdbExportException(Throwable cause) { + super(cause); + // TODO Auto-generated constructor stub } -} + /** + * + */ + private static final long serialVersionUID = -5210016260577827042L; + +} \ No newline at end of file From 0661721963f3d5031d2ef76cf97f544b312d56a0 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:51 +0100 Subject: [PATCH 1430/1620] New translations StratumPerYearData.java (French) --- .../earth/app/view/Messages_fr.properties | 61 ++++++++++++------- 1 file changed, 40 insertions(+), 21 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index e13bbc0b81..1a7a0b1759 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,35 +1,54 @@ package org.openforis.collect.earth.ipcc; -public class RdbExportException extends Exception { +import liquibase.repackaged.org.apache.commons.lang3.ArrayUtils; + +public class StratumPerYearData extends YearData{ + + private String climate; + private String soil; + private String gez; + public StratumPerYearData(int year, String climate, String soil, String gez) { + super(year); + this.climate = climate; + this.soil = soil; + this.gez = gez; + } + - public RdbExportException() { - super(); - // TODO Auto-generated constructor stub + @Override + public String toString() { + return "StratumPerYearData [year=" + year + ", climate=" + climate + ", soil=" + soil + ", gez=" + gez + + ", luData=" + ArrayUtils.toString( luData ) + "]"; } - public RdbExportException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { - super(message, cause, enableSuppression, writableStackTrace); - // TODO Auto-generated constructor stub + + public String getClimate() { + return climate; } - public RdbExportException(String message, Throwable cause) { - super(message, cause); - // TODO Auto-generated constructor stub + + public String getSoil() { + return soil; } - public RdbExportException(String message) { - super(message); - // TODO Auto-generated constructor stub + + public String getGez() { + return gez; } - public RdbExportException(Throwable cause) { - super(cause); - // TODO Auto-generated constructor stub + + public void setClimate(String climate) { + this.climate = climate; } - /** - * - */ - private static final long serialVersionUID = -5210016260577827042L; -} \ No newline at end of file + public void setSoil(String soil) { + this.soil = soil; + } + + + public void setGez(String gez) { + this.gez = gez; + } + +} From 29b7bcf52603369754c26a01a6bcf09272580162 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:52 +0100 Subject: [PATCH 1431/1620] New translations StratumPerYearData.java (Spanish) --- .../earth/app/view/Messages_es.properties | 61 ++++++++++++------- 1 file changed, 40 insertions(+), 21 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index e13bbc0b81..1a7a0b1759 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,35 +1,54 @@ package org.openforis.collect.earth.ipcc; -public class RdbExportException extends Exception { +import liquibase.repackaged.org.apache.commons.lang3.ArrayUtils; + +public class StratumPerYearData extends YearData{ + + private String climate; + private String soil; + private String gez; + public StratumPerYearData(int year, String climate, String soil, String gez) { + super(year); + this.climate = climate; + this.soil = soil; + this.gez = gez; + } + - public RdbExportException() { - super(); - // TODO Auto-generated constructor stub + @Override + public String toString() { + return "StratumPerYearData [year=" + year + ", climate=" + climate + ", soil=" + soil + ", gez=" + gez + + ", luData=" + ArrayUtils.toString( luData ) + "]"; } - public RdbExportException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { - super(message, cause, enableSuppression, writableStackTrace); - // TODO Auto-generated constructor stub + + public String getClimate() { + return climate; } - public RdbExportException(String message, Throwable cause) { - super(message, cause); - // TODO Auto-generated constructor stub + + public String getSoil() { + return soil; } - public RdbExportException(String message) { - super(message); - // TODO Auto-generated constructor stub + + public String getGez() { + return gez; } - public RdbExportException(Throwable cause) { - super(cause); - // TODO Auto-generated constructor stub + + public void setClimate(String climate) { + this.climate = climate; } - /** - * - */ - private static final long serialVersionUID = -5210016260577827042L; -} \ No newline at end of file + public void setSoil(String soil) { + this.soil = soil; + } + + + public void setGez(String gez) { + this.gez = gez; + } + +} From a710adc0609d437e03539fd0b5b569abbb1e86d6 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:53 +0100 Subject: [PATCH 1432/1620] New translations StratumPerYearData.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 61 ++++++++++++------- 1 file changed, 40 insertions(+), 21 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index e13bbc0b81..1a7a0b1759 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,35 +1,54 @@ package org.openforis.collect.earth.ipcc; -public class RdbExportException extends Exception { +import liquibase.repackaged.org.apache.commons.lang3.ArrayUtils; + +public class StratumPerYearData extends YearData{ + + private String climate; + private String soil; + private String gez; + public StratumPerYearData(int year, String climate, String soil, String gez) { + super(year); + this.climate = climate; + this.soil = soil; + this.gez = gez; + } + - public RdbExportException() { - super(); - // TODO Auto-generated constructor stub + @Override + public String toString() { + return "StratumPerYearData [year=" + year + ", climate=" + climate + ", soil=" + soil + ", gez=" + gez + + ", luData=" + ArrayUtils.toString( luData ) + "]"; } - public RdbExportException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { - super(message, cause, enableSuppression, writableStackTrace); - // TODO Auto-generated constructor stub + + public String getClimate() { + return climate; } - public RdbExportException(String message, Throwable cause) { - super(message, cause); - // TODO Auto-generated constructor stub + + public String getSoil() { + return soil; } - public RdbExportException(String message) { - super(message); - // TODO Auto-generated constructor stub + + public String getGez() { + return gez; } - public RdbExportException(Throwable cause) { - super(cause); - // TODO Auto-generated constructor stub + + public void setClimate(String climate) { + this.climate = climate; } - /** - * - */ - private static final long serialVersionUID = -5210016260577827042L; -} \ No newline at end of file + public void setSoil(String soil) { + this.soil = soil; + } + + + public void setGez(String gez) { + this.gez = gez; + } + +} From f788e5c8d2cea2e7d77109a278adbd354811c5dd Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:54 +0100 Subject: [PATCH 1433/1620] New translations StratumPerYearData.java (English) --- .../earth/app/view/Messages_en.properties | 61 ++++++++++++------- 1 file changed, 40 insertions(+), 21 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index e13bbc0b81..1a7a0b1759 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,35 +1,54 @@ package org.openforis.collect.earth.ipcc; -public class RdbExportException extends Exception { +import liquibase.repackaged.org.apache.commons.lang3.ArrayUtils; + +public class StratumPerYearData extends YearData{ + + private String climate; + private String soil; + private String gez; + public StratumPerYearData(int year, String climate, String soil, String gez) { + super(year); + this.climate = climate; + this.soil = soil; + this.gez = gez; + } + - public RdbExportException() { - super(); - // TODO Auto-generated constructor stub + @Override + public String toString() { + return "StratumPerYearData [year=" + year + ", climate=" + climate + ", soil=" + soil + ", gez=" + gez + + ", luData=" + ArrayUtils.toString( luData ) + "]"; } - public RdbExportException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { - super(message, cause, enableSuppression, writableStackTrace); - // TODO Auto-generated constructor stub + + public String getClimate() { + return climate; } - public RdbExportException(String message, Throwable cause) { - super(message, cause); - // TODO Auto-generated constructor stub + + public String getSoil() { + return soil; } - public RdbExportException(String message) { - super(message); - // TODO Auto-generated constructor stub + + public String getGez() { + return gez; } - public RdbExportException(Throwable cause) { - super(cause); - // TODO Auto-generated constructor stub + + public void setClimate(String climate) { + this.climate = climate; } - /** - * - */ - private static final long serialVersionUID = -5210016260577827042L; -} \ No newline at end of file + public void setSoil(String soil) { + this.soil = soil; + } + + + public void setGez(String gez) { + this.gez = gez; + } + +} From 2b7ea463cf6affd6d93f2f2eab121a0303846374 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:56 +0100 Subject: [PATCH 1434/1620] New translations YearData.java (French) --- .../earth/app/view/Messages_fr.properties | 60 ++++++------------- 1 file changed, 19 insertions(+), 41 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 1a7a0b1759..569b22cb08 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,54 +1,32 @@ package org.openforis.collect.earth.ipcc; -import liquibase.repackaged.org.apache.commons.lang3.ArrayUtils; +import java.util.List; -public class StratumPerYearData extends YearData{ - - private String climate; - private String soil; - private String gez; - public StratumPerYearData(int year, String climate, String soil, String gez) { - super(year); - this.climate = climate; - this.soil = soil; - this.gez = gez; - } +public class YearData { + protected int year; + protected List luData; - @Override - public String toString() { - return "StratumPerYearData [year=" + year + ", climate=" + climate + ", soil=" + soil + ", gez=" + gez - + ", luData=" + ArrayUtils.toString( luData ) + "]"; + public YearData(int year) { + super(); + this.year = year; } - - - public String getClimate() { - return climate; + + public YearData(int year, List luData) { + super(); + this.year = year; + this.luData = luData; } - - - public String getSoil() { - return soil; + + public List getLuData() { + return luData; } - - public String getGez() { - return gez; + public void setLuData(List luData) { + this.luData = luData; } - - public void setClimate(String climate) { - this.climate = climate; + public int getYear() { + return year; } - - - public void setSoil(String soil) { - this.soil = soil; - } - - - public void setGez(String gez) { - this.gez = gez; - } - } From 62d11da9e3c8c806975c4069de8fd8bd2c43f4d4 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:57 +0100 Subject: [PATCH 1435/1620] New translations IPCCRDBGenerator.java (English) --- .../earth/app/view/Messages_en.properties | 90 ++++++++----------- 1 file changed, 39 insertions(+), 51 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 1a7a0b1759..d10cc6fb23 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,54 +1,42 @@ package org.openforis.collect.earth.ipcc; -import liquibase.repackaged.org.apache.commons.lang3.ArrayUtils; - -public class StratumPerYearData extends YearData{ - - private String climate; - private String soil; - private String gez; - public StratumPerYearData(int year, String climate, String soil, String gez) { - super(year); - this.climate = climate; - this.soil = soil; - this.gez = gez; - } - - - @Override - public String toString() { - return "StratumPerYearData [year=" + year + ", climate=" + climate + ", soil=" + soil + ", gez=" + gez - + ", luData=" + ArrayUtils.toString( luData ) + "]"; - } - - - public String getClimate() { - return climate; - } - - - public String getSoil() { - return soil; - } - - - public String getGez() { - return gez; - } - - - public void setClimate(String climate) { - this.climate = climate; - } - - - public void setSoil(String soil) { - this.soil = soil; - } - - - public void setGez(String gez) { - this.gez = gez; - } - +import javax.swing.SwingUtilities; + +import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.RDBExporter; +import org.openforis.collect.earth.app.service.RDBPostProcessor; +import org.openforis.collect.earth.app.service.RegionCalculationUtils; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.concurrency.Progress; +import org.openforis.idm.metamodel.Survey; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class IPCCRDBGenerator { + + @Autowired + RDBExporter rdbExporter; + + @Autowired + private RegionCalculationUtils regionCalculation; + + public void generateRelationalDatabase(Survey modifiedSurvey, InfiniteProgressMonitor infiniteProgressMonitor) { + RDBPostProcessor ipccCallback = postProcessIpccData(); + rdbExporter.exportDataToRDB(modifiedSurvey, ExportType.IPCC, infiniteProgressMonitor, ipccCallback); + } + + private RDBPostProcessor postProcessIpccData() { + // return the implementation of a RDBPostProcessor interface (the callback when the initial RDB export is done so that we can add expansion factors ) + return (progressMonitor) -> { + + SwingUtilities.invokeLater( () -> progressMonitor.setMessage("Calculating expansion factors") ); + progressMonitor.progressMade(new Progress(0, 100)); + regionCalculation.handleRegionCalculation( ExportType.IPCC, rdbExporter.getJdbcTemplate() ); + progressMonitor.progressMade(new Progress(100, 100)); + + }; + } + + } From f48f92477533cb5b78cf420ce1d5cec7a75a40a0 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:58 +0100 Subject: [PATCH 1436/1620] New translations IPCCRDBGenerator.java (Spanish) --- .../earth/app/view/Messages_es.properties | 90 ++++++++----------- 1 file changed, 39 insertions(+), 51 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 1a7a0b1759..d10cc6fb23 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,54 +1,42 @@ package org.openforis.collect.earth.ipcc; -import liquibase.repackaged.org.apache.commons.lang3.ArrayUtils; - -public class StratumPerYearData extends YearData{ - - private String climate; - private String soil; - private String gez; - public StratumPerYearData(int year, String climate, String soil, String gez) { - super(year); - this.climate = climate; - this.soil = soil; - this.gez = gez; - } - - - @Override - public String toString() { - return "StratumPerYearData [year=" + year + ", climate=" + climate + ", soil=" + soil + ", gez=" + gez - + ", luData=" + ArrayUtils.toString( luData ) + "]"; - } - - - public String getClimate() { - return climate; - } - - - public String getSoil() { - return soil; - } - - - public String getGez() { - return gez; - } - - - public void setClimate(String climate) { - this.climate = climate; - } - - - public void setSoil(String soil) { - this.soil = soil; - } - - - public void setGez(String gez) { - this.gez = gez; - } - +import javax.swing.SwingUtilities; + +import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.RDBExporter; +import org.openforis.collect.earth.app.service.RDBPostProcessor; +import org.openforis.collect.earth.app.service.RegionCalculationUtils; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.concurrency.Progress; +import org.openforis.idm.metamodel.Survey; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class IPCCRDBGenerator { + + @Autowired + RDBExporter rdbExporter; + + @Autowired + private RegionCalculationUtils regionCalculation; + + public void generateRelationalDatabase(Survey modifiedSurvey, InfiniteProgressMonitor infiniteProgressMonitor) { + RDBPostProcessor ipccCallback = postProcessIpccData(); + rdbExporter.exportDataToRDB(modifiedSurvey, ExportType.IPCC, infiniteProgressMonitor, ipccCallback); + } + + private RDBPostProcessor postProcessIpccData() { + // return the implementation of a RDBPostProcessor interface (the callback when the initial RDB export is done so that we can add expansion factors ) + return (progressMonitor) -> { + + SwingUtilities.invokeLater( () -> progressMonitor.setMessage("Calculating expansion factors") ); + progressMonitor.progressMade(new Progress(0, 100)); + regionCalculation.handleRegionCalculation( ExportType.IPCC, rdbExporter.getJdbcTemplate() ); + progressMonitor.progressMade(new Progress(100, 100)); + + }; + } + + } From a72e88193ddc35b38837a27f0703ad2d7143dc9b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:48:59 +0100 Subject: [PATCH 1437/1620] New translations IPCCDataExportPerPlotCSV.java (Spanish) --- .../earth/app/view/Messages_es.properties | 91 +++++++++++++------ 1 file changed, 63 insertions(+), 28 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index d10cc6fb23..21431b088f 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,42 +1,77 @@ package org.openforis.collect.earth.ipcc; -import javax.swing.SwingUtilities; +import java.io.File; +import java.io.IOException; +import java.util.List; import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.RDBExporter; -import org.openforis.collect.earth.app.service.RDBPostProcessor; import org.openforis.collect.earth.app.service.RegionCalculationUtils; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.concurrency.Progress; -import org.openforis.idm.metamodel.Survey; +import org.openforis.collect.earth.app.service.SchemaService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component -public class IPCCRDBGenerator { - - @Autowired - RDBExporter rdbExporter; - +public class IPCCDataExportPerPlotCSV extends IPCCDataExportCSV { + + private String schemaName; + + Logger logger = LoggerFactory.getLogger(IPCCDataExportPerPlotCSV.class); + @Autowired - private RegionCalculationUtils regionCalculation; - - public void generateRelationalDatabase(Survey modifiedSurvey, InfiniteProgressMonitor infiniteProgressMonitor) { - RDBPostProcessor ipccCallback = postProcessIpccData(); - rdbExporter.exportDataToRDB(modifiedSurvey, ExportType.IPCC, infiniteProgressMonitor, ipccCallback); + private SchemaService schemaService; + + public IPCCDataExportPerPlotCSV() { + setExportTypeUsed(ExportType.IPCC); + } + + public File generateTimeseriesData( int startYear, int endYear ) throws IOException { + schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); + + List luCombinations = generateLUCombinations(startYear, endYear); + + return createCsv( luCombinations); } - private RDBPostProcessor postProcessIpccData() { - // return the implementation of a RDBPostProcessor interface (the callback when the initial RDB export is done so that we can add expansion factors ) - return (progressMonitor) -> { - - SwingUtilities.invokeLater( () -> progressMonitor.setMessage("Calculating expansion factors") ); - progressMonitor.progressMade(new Progress(0, 100)); - regionCalculation.handleRegionCalculation( ExportType.IPCC, rdbExporter.getJdbcTemplate() ); - progressMonitor.progressMade(new Progress(100, 100)); - - }; + + private List generateLUCombinations(int startYear, int endYear) { + + String selectedYears = IPCCDataExportTimeSeries.PLOT_ID + + ", " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_LABEL + + ", " + IPCCDataExportTimeSeries.SOIL_COLUMN_LABEL + + ", " + IPCCDataExportTimeSeries.GEZ_COLUMN_LABEL + ", " ; + + for( int year = startYear ; year <= endYear; year++ ) { + + selectedYears += IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + ","; + + } + + String sqlSelect = "select " + + selectedYears + + RegionCalculationUtils.EXPANSION_FACTOR + + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.SOIL_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.CLIMATE_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.GEZ_TABLE + + + " where " + + IPCCDataExportTimeSeries.SOIL_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.SOIL_COLUMN_ID + + " and " + + IPCCDataExportTimeSeries.CLIMATE_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_ID + + " and " + + IPCCDataExportTimeSeries.GEZ_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.GEZ_COLUMN_ID + + + " ORDER BY "+ IPCCDataExportTimeSeries.PLOT_ID + " DESC"; // Remove trailing comma from list of years + + List luData = getJdbcTemplate().query( + sqlSelect + , + getRowMapper() + ); + + selectedYears+= "area"; // so the area columns appears too + luData.add( 0, selectedYears.split(",") ); + return luData; } - - + } From d020688a62ba6979b40d79ed787c22e51ea83a4d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:00 +0100 Subject: [PATCH 1438/1620] New translations IPCCGenerator.java (French) --- .../earth/app/view/Messages_fr.properties | 171 ++++++++++++++++-- 1 file changed, 151 insertions(+), 20 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 569b22cb08..4dbb57be78 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,32 +1,163 @@ +/** + * Main class to generate the IPCC Inventory Software compliant file + */ package org.openforis.collect.earth.ipcc; -import java.util.List; +import java.io.File; +import java.io.IOException; +import java.util.Calendar; -public class YearData { +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.view.DataFormat; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.app.view.JFileChooserExistsAware; +import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; +import org.openforis.collect.earth.ipcc.controller.StratumUtils; +import org.openforis.collect.earth.ipcc.view.AssignSubdivisionTypesWizard; +import org.openforis.idm.metamodel.Survey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; - protected int year; - protected List luData; +/** + * @author Alfonso Sanchez-Paus + * + */ +@Component +public class IPCCGenerator { - public YearData(int year) { - super(); - this.year = year; - } + @Autowired + IPCCRDBGenerator ipccRdbGenerator; - public YearData(int year, List luData) { - super(); - this.year = year; - this.luData = luData; - } + @Autowired + IPCCDataExportTimeSeriesXML ipccDataExportToXML; - public List getLuData() { - return luData; - } + @Autowired + LocalPropertiesService localPropertiesService; + + @Autowired + IPCCDataExportMatrixExcel dataExportMatrixExcel; + + @Autowired + IPCCDataExportMatrixExtendedExcel dataExportMatrixExtendedExcel; + + @Autowired + IPCCDataExportLandUnitsCSV dataExportLandUnitsCSV; + + @Autowired + IPCCDataExportPerPlotCSV dataExportPerPlotCSV; + + @Autowired + IPCCLandUses landUses; + + IPCCSurveyAdapter ipccSurveyAdapter; + + Logger logger = LoggerFactory.getLogger( IPCCGenerator.class ); + + public static final int END_YEAR = Calendar.getInstance().get(Calendar.YEAR); // Assume the last year is current year + public static final int START_YEAR = 2000; // Assume start year at 2000 - public void setLuData(List luData) { - this.luData = luData; + public File generateRDB( Survey survey, InfiniteProgressMonitor progressListener) throws IPCCGeneratorException { + + ipccSurveyAdapter = new IPCCSurveyAdapter(); + + // Add attributes for each year containing the LU Category and Subdivision if not present + Survey modifiedSurvey = ipccSurveyAdapter.addIPCCAttributesToSurvey( survey ); + + // Generate Relational Database of the survey data + ipccRdbGenerator.generateRelationalDatabase( modifiedSurvey, progressListener); + + return null; } - public int getYear() { - return year; + public void produceOutputs( Survey survey, InfiniteProgressMonitor progressListener ) { + + progressListener.hide(); + + // Assign Management types to the Land Use Subdivisions found in the survey data + AssignSubdivisionTypesWizard wizard = new AssignSubdivisionTypesWizard(); + wizard.initializeTypes(landUses.getLandUseSubdivisions()); + + if( !wizard.isWizardFinished() ) { + logger.info( "The user closed the wizard without finishing assigning management types"); + return; + } + + File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.GHGI_ZIP_FILE, true, false, "LandUseForGHGi", localPropertiesService, null); + + if( exportToFile== null || exportToFile.length != 1 ) { + logger.info("The user should choose a ZIP file to export the results to! No file chosen, aborting the rest of the execution"); + return; + } + + try { + File destinationZip = exportToFile[0]; + + final int STEPS = 7; + int currentStep = 1; + + progressListener.show(); + + progressListener.updateProgress(currentStep++, STEPS, "Generating CSV aggregated time-series" ); + // Extract data from the Relational Database into an excel file of transition Matrixes per year + File landUnitsCSVFile =dataExportLandUnitsCSV.generateTimeseriesData(START_YEAR, END_YEAR); + if( progressListener.isUserCancelled() ) return; + + progressListener.updateProgress(currentStep++, STEPS, "Generating CSV per plot time-series" ); + // Extract data from the Relational Database into an excel file of transition Matrixes per year + File perPlotCSVFile =dataExportPerPlotCSV.generateTimeseriesData(START_YEAR, END_YEAR); + if( progressListener.isUserCancelled() ) return; + + progressListener.updateProgress(currentStep++, STEPS, "Generating survey setup files" ); + // Generate list of subdivisions in survey + File subdivisionsFile = LandUseSubdivisionUtils.getSubdivisionsXML(); + File climateZones = StratumUtils.getClimateZonesXML( survey ); + File ecologicalZones = StratumUtils.getEcologicalZonesXML( survey ); + File soilTypes = StratumUtils.getSoilTypesXML( survey ); + if( progressListener.isUserCancelled() ) return; + + progressListener.updateProgress(currentStep++, STEPS, "Generating XML timeseries file" ); + // Extract data from the Relational Database into an XML File with information per year + File timeseriesXMLFile =ipccDataExportToXML.generateTimeseriesData(IPCCGenerator.START_YEAR, IPCCGenerator.END_YEAR ); + if( progressListener.isUserCancelled() ) return; + + progressListener.updateProgress(currentStep++, STEPS, "Generating Excel LU Matrixes per year" ); + // Extract data from the Relational Database into an excel file of transition Matrixes per year + File matrixXLSFile =dataExportMatrixExcel.generateTimeseriesData(START_YEAR, END_YEAR); + if( progressListener.isUserCancelled() ) return; + + progressListener.updateProgress(currentStep++, STEPS, "Generating Excel LU Matrixes per year STRATIFIED" ); + // Extract data from the Relational Database into an excel file of transition Matrixes per year + File matrixXLSExtendedFile =dataExportMatrixExtendedExcel.generateTimeseriesData(START_YEAR, END_YEAR); + if( progressListener.isUserCancelled() ) return; + + try { + progressListener.updateProgress(currentStep++, STEPS, "Compressing files into selected destination" ); + CollectEarthUtils.addFileToZip( destinationZip , timeseriesXMLFile, "LU_Timeseries.xml"); + CollectEarthUtils.addFileToZip( destinationZip , matrixXLSFile, "LU_Matrixes.xls"); + CollectEarthUtils.addFileToZip( destinationZip , matrixXLSExtendedFile, "LU_Matrixes_stratified.xls"); + CollectEarthUtils.addFileToZip( destinationZip , subdivisionsFile, "ConfigLandUseSubdivisions.xml"); + CollectEarthUtils.addFileToZip( destinationZip , climateZones, "ConfigClimateZones.xml"); + CollectEarthUtils.addFileToZip( destinationZip , ecologicalZones, "ConfigEclogicalZones.xml"); + CollectEarthUtils.addFileToZip( destinationZip , soilTypes, "ConfigSoilTypes.xml"); + CollectEarthUtils.addFileToZip( destinationZip , landUnitsCSVFile, "LU_Timeseries_grouped.csv"); + CollectEarthUtils.addFileToZip( destinationZip , perPlotCSVFile, "LU_Timeseries_per_plot.csv"); + progressListener.hide(); + } catch (IOException e) { + logger.error("Error when creating ZIP file with timeseries content " + destinationZip, e); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (Exception e) { + logger.error("Error when zipping the timeseries content into " + destinationZip, e); //$NON-NLS-1$ //$NON-NLS-2$ + } + + // Open the ZIP file automatically to inspect the output + CollectEarthUtils.openFile( destinationZip ); + + } catch (IOException e) { + logger.error("Error generating file", e); + } + } + } From c9eb69c8d2e8e778bf92daac40bcad5e3e99e7a6 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:01 +0100 Subject: [PATCH 1439/1620] New translations IPCCDataExportPerPlotCSV.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 95 ++++++++++++------- 1 file changed, 59 insertions(+), 36 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 1a7a0b1759..21431b088f 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,54 +1,77 @@ package org.openforis.collect.earth.ipcc; -import liquibase.repackaged.org.apache.commons.lang3.ArrayUtils; - -public class StratumPerYearData extends YearData{ - - private String climate; - private String soil; - private String gez; - public StratumPerYearData(int year, String climate, String soil, String gez) { - super(year); - this.climate = climate; - this.soil = soil; - this.gez = gez; - } - - - @Override - public String toString() { - return "StratumPerYearData [year=" + year + ", climate=" + climate + ", soil=" + soil + ", gez=" + gez - + ", luData=" + ArrayUtils.toString( luData ) + "]"; - } +import java.io.File; +import java.io.IOException; +import java.util.List; +import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.RegionCalculationUtils; +import org.openforis.collect.earth.app.service.SchemaService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; - public String getClimate() { - return climate; - } +@Component +public class IPCCDataExportPerPlotCSV extends IPCCDataExportCSV { + private String schemaName; - public String getSoil() { - return soil; - } + Logger logger = LoggerFactory.getLogger(IPCCDataExportPerPlotCSV.class); + @Autowired + private SchemaService schemaService; - public String getGez() { - return gez; + public IPCCDataExportPerPlotCSV() { + setExportTypeUsed(ExportType.IPCC); } + public File generateTimeseriesData( int startYear, int endYear ) throws IOException { + schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - public void setClimate(String climate) { - this.climate = climate; - } - + List luCombinations = generateLUCombinations(startYear, endYear); - public void setSoil(String soil) { - this.soil = soil; + return createCsv( luCombinations); } - public void setGez(String gez) { - this.gez = gez; + private List generateLUCombinations(int startYear, int endYear) { + + String selectedYears = IPCCDataExportTimeSeries.PLOT_ID + + ", " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_LABEL + + ", " + IPCCDataExportTimeSeries.SOIL_COLUMN_LABEL + + ", " + IPCCDataExportTimeSeries.GEZ_COLUMN_LABEL + ", " ; + + for( int year = startYear ; year <= endYear; year++ ) { + + selectedYears += IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + ","; + + } + + String sqlSelect = "select " + + selectedYears + + RegionCalculationUtils.EXPANSION_FACTOR + + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.SOIL_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.CLIMATE_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.GEZ_TABLE + + + " where " + + IPCCDataExportTimeSeries.SOIL_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.SOIL_COLUMN_ID + + " and " + + IPCCDataExportTimeSeries.CLIMATE_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_ID + + " and " + + IPCCDataExportTimeSeries.GEZ_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.GEZ_COLUMN_ID + + + " ORDER BY "+ IPCCDataExportTimeSeries.PLOT_ID + " DESC"; // Remove trailing comma from list of years + + List luData = getJdbcTemplate().query( + sqlSelect + , + getRowMapper() + ); + + selectedYears+= "area"; // so the area columns appears too + luData.add( 0, selectedYears.split(",") ); + return luData; } } From 5e1541d8f73794fe81a6f196f7a6634581c38c41 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:03 +0100 Subject: [PATCH 1440/1620] New translations IPCCDataExportPerPlotCSV.java (English) --- .../earth/app/view/Messages_en.properties | 91 +++++++++++++------ 1 file changed, 63 insertions(+), 28 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index d10cc6fb23..21431b088f 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,42 +1,77 @@ package org.openforis.collect.earth.ipcc; -import javax.swing.SwingUtilities; +import java.io.File; +import java.io.IOException; +import java.util.List; import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.RDBExporter; -import org.openforis.collect.earth.app.service.RDBPostProcessor; import org.openforis.collect.earth.app.service.RegionCalculationUtils; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.concurrency.Progress; -import org.openforis.idm.metamodel.Survey; +import org.openforis.collect.earth.app.service.SchemaService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component -public class IPCCRDBGenerator { - - @Autowired - RDBExporter rdbExporter; - +public class IPCCDataExportPerPlotCSV extends IPCCDataExportCSV { + + private String schemaName; + + Logger logger = LoggerFactory.getLogger(IPCCDataExportPerPlotCSV.class); + @Autowired - private RegionCalculationUtils regionCalculation; - - public void generateRelationalDatabase(Survey modifiedSurvey, InfiniteProgressMonitor infiniteProgressMonitor) { - RDBPostProcessor ipccCallback = postProcessIpccData(); - rdbExporter.exportDataToRDB(modifiedSurvey, ExportType.IPCC, infiniteProgressMonitor, ipccCallback); + private SchemaService schemaService; + + public IPCCDataExportPerPlotCSV() { + setExportTypeUsed(ExportType.IPCC); + } + + public File generateTimeseriesData( int startYear, int endYear ) throws IOException { + schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); + + List luCombinations = generateLUCombinations(startYear, endYear); + + return createCsv( luCombinations); } - private RDBPostProcessor postProcessIpccData() { - // return the implementation of a RDBPostProcessor interface (the callback when the initial RDB export is done so that we can add expansion factors ) - return (progressMonitor) -> { - - SwingUtilities.invokeLater( () -> progressMonitor.setMessage("Calculating expansion factors") ); - progressMonitor.progressMade(new Progress(0, 100)); - regionCalculation.handleRegionCalculation( ExportType.IPCC, rdbExporter.getJdbcTemplate() ); - progressMonitor.progressMade(new Progress(100, 100)); - - }; + + private List generateLUCombinations(int startYear, int endYear) { + + String selectedYears = IPCCDataExportTimeSeries.PLOT_ID + + ", " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_LABEL + + ", " + IPCCDataExportTimeSeries.SOIL_COLUMN_LABEL + + ", " + IPCCDataExportTimeSeries.GEZ_COLUMN_LABEL + ", " ; + + for( int year = startYear ; year <= endYear; year++ ) { + + selectedYears += IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + ","; + + } + + String sqlSelect = "select " + + selectedYears + + RegionCalculationUtils.EXPANSION_FACTOR + + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.SOIL_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.CLIMATE_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.GEZ_TABLE + + + " where " + + IPCCDataExportTimeSeries.SOIL_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.SOIL_COLUMN_ID + + " and " + + IPCCDataExportTimeSeries.CLIMATE_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_ID + + " and " + + IPCCDataExportTimeSeries.GEZ_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.GEZ_COLUMN_ID + + + " ORDER BY "+ IPCCDataExportTimeSeries.PLOT_ID + " DESC"; // Remove trailing comma from list of years + + List luData = getJdbcTemplate().query( + sqlSelect + , + getRowMapper() + ); + + selectedYears+= "area"; // so the area columns appears too + luData.add( 0, selectedYears.split(",") ); + return luData; } - - + } From 3b465f73718a8666e47503c0dccdf8f5cbc31888 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:04 +0100 Subject: [PATCH 1441/1620] New translations IPCCDataExportTimeSeries.java (French) --- .../earth/app/view/Messages_fr.properties | 258 +++++++++--------- 1 file changed, 132 insertions(+), 126 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 4dbb57be78..c94c09f2e8 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,163 +1,169 @@ -/** - * Main class to generate the IPCC Inventory Software compliant file - */ package org.openforis.collect.earth.ipcc; import java.io.File; import java.io.IOException; -import java.util.Calendar; - -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.view.DataFormat; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.app.view.JFileChooserExistsAware; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.RDBConnector; +import org.openforis.collect.earth.app.service.RegionCalculationUtils; +import org.openforis.collect.earth.app.service.SchemaService; import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; -import org.openforis.collect.earth.ipcc.controller.StratumUtils; -import org.openforis.collect.earth.ipcc.view.AssignSubdivisionTypesWizard; -import org.openforis.idm.metamodel.Survey; +import org.openforis.collect.earth.ipcc.model.StratumObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Component; -/** - * @author Alfonso Sanchez-Paus - * - */ @Component -public class IPCCGenerator { +public abstract class IPCCDataExportTimeSeries extends RDBConnector { - @Autowired - IPCCRDBGenerator ipccRdbGenerator; + public static final String CLIMATE_COLUMN = "climate"; + public static final String GEZ_COLUMN = "gez"; + public static final String SOIL_COLUMN = "soil"; - @Autowired - IPCCDataExportTimeSeriesXML ipccDataExportToXML; + public static final String CLIMATE_COLUMN_VALUE = "climate_zones"; + public static final String CLIMATE_TABLE = CLIMATE_COLUMN_VALUE + "_code"; + public static final String CLIMATE_COLUMN_LABEL = CLIMATE_COLUMN_VALUE + "_label"; + public static final String CLIMATE_COLUMN_ID = CLIMATE_COLUMN_VALUE + "_code_id"; + public static final String CLIMATE_COLUMN_IN_PLOT = "climate_code_id"; - @Autowired - LocalPropertiesService localPropertiesService; - - @Autowired - IPCCDataExportMatrixExcel dataExportMatrixExcel; + public static final String GEZ_COLUMN_VALUE = "ecological_zones"; + public static final String GEZ_TABLE = GEZ_COLUMN_VALUE + "_code"; + public static final String GEZ_COLUMN_LABEL = GEZ_COLUMN_VALUE + "_label"; + public static final String GEZ_COLUMN_ID = GEZ_COLUMN_VALUE + "_code_id"; + public static final String GEZ_COLUMN_IN_PLOT = "gez_code_id"; - @Autowired - IPCCDataExportMatrixExtendedExcel dataExportMatrixExtendedExcel; - @Autowired - IPCCDataExportLandUnitsCSV dataExportLandUnitsCSV; - - @Autowired - IPCCDataExportPerPlotCSV dataExportPerPlotCSV; + public static final String SOIL_COLUMN_VALUE = "soil_types"; + public static final String SOIL_TABLE = SOIL_COLUMN_VALUE + "_code"; + public static final String SOIL_COLUMN_LABEL = SOIL_COLUMN_VALUE + "_label"; + public static final String SOIL_COLUMN_ID = SOIL_COLUMN_VALUE + "_code_id"; + public static final String SOIL_COLUMN_IN_PLOT = "soil_code_id"; + private String schemaName; + public static final String PLOT_TABLE = "plot"; + public static final String PLOT_ID = "id"; + + Logger logger = LoggerFactory.getLogger(IPCCDataExportTimeSeries.class); + @Autowired - IPCCLandUses landUses; - - IPCCSurveyAdapter ipccSurveyAdapter; + private SchemaService schemaService; + - Logger logger = LoggerFactory.getLogger( IPCCGenerator.class ); + public IPCCDataExportTimeSeries() { + setExportTypeUsed(ExportType.IPCC); + } - public static final int END_YEAR = Calendar.getInstance().get(Calendar.YEAR); // Assume the last year is current year - public static final int START_YEAR = 2000; // Assume start year at 2000 + public File generateTimeseriesData( int startYear, int endYear ) throws IOException { - public File generateRDB( Survey survey, InfiniteProgressMonitor progressListener) throws IPCCGeneratorException { + schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - ipccSurveyAdapter = new IPCCSurveyAdapter(); + List strataClimate = getStrataClimate(); + List strataSoil = getStrataSoil(); + List strataGEZ = getStrataGEZ(); - // Add attributes for each year containing the LU Category and Subdivision if not present - Survey modifiedSurvey = ipccSurveyAdapter.addIPCCAttributesToSurvey( survey ); + List strataData = new ArrayList(); - // Generate Relational Database of the survey data - ipccRdbGenerator.generateRelationalDatabase( modifiedSurvey, progressListener); + for (int year = startYear; year < endYear; year++) { + for (StratumObject gez : strataGEZ) { + for (StratumObject climate : strataClimate) { + for (StratumObject soil : strataSoil) { + E yearLuData = (E) generateLUTimeseriesForStrata(year, gez, climate, soil); + if (yearLuData != null) + strataData.add(yearLuData); + } + } + } + } + + return generateFile( strataData); - return null; } - public void produceOutputs( Survey survey, InfiniteProgressMonitor progressListener ) { - - progressListener.hide(); - - // Assign Management types to the Land Use Subdivisions found in the survey data - AssignSubdivisionTypesWizard wizard = new AssignSubdivisionTypesWizard(); - wizard.initializeTypes(landUses.getLandUseSubdivisions()); - - if( !wizard.isWizardFinished() ) { - logger.info( "The user closed the wizard without finishing assigning management types"); - return; - } - - File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.GHGI_ZIP_FILE, true, false, "LandUseForGHGi", localPropertiesService, null); + protected abstract File generateFile( List strataData) throws IOException; - if( exportToFile== null || exportToFile.length != 1 ) { - logger.info("The user should choose a ZIP file to export the results to! No file chosen, aborting the rest of the execution"); - return; - } - - try { - File destinationZip = exportToFile[0]; - - final int STEPS = 7; - int currentStep = 1; - - progressListener.show(); - - progressListener.updateProgress(currentStep++, STEPS, "Generating CSV aggregated time-series" ); - // Extract data from the Relational Database into an excel file of transition Matrixes per year - File landUnitsCSVFile =dataExportLandUnitsCSV.generateTimeseriesData(START_YEAR, END_YEAR); - if( progressListener.isUserCancelled() ) return; + private StratumPerYearData generateLUTimeseriesForStrata(int year, StratumObject gez, StratumObject climate,StratumObject soil) { + + List luData = getJdbcTemplate().query( - progressListener.updateProgress(currentStep++, STEPS, "Generating CSV per plot time-series" ); - // Extract data from the Relational Database into an excel file of transition Matrixes per year - File perPlotCSVFile =dataExportPerPlotCSV.generateTimeseriesData(START_YEAR, END_YEAR); - if( progressListener.isUserCancelled() ) return; - - progressListener.updateProgress(currentStep++, STEPS, "Generating survey setup files" ); - // Generate list of subdivisions in survey - File subdivisionsFile = LandUseSubdivisionUtils.getSubdivisionsXML(); - File climateZones = StratumUtils.getClimateZonesXML( survey ); - File ecologicalZones = StratumUtils.getEcologicalZonesXML( survey ); - File soilTypes = StratumUtils.getSoilTypesXML( survey ); - if( progressListener.isUserCancelled() ) return; + "select " + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + + ", " + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1) + ", sum( " + + RegionCalculationUtils.EXPANSION_FACTOR + ")" + + " from " + schemaName + PLOT_TABLE + + " where " + + CLIMATE_COLUMN + " = " + climate.getValue() + " and " + SOIL_COLUMN + " = " + soil.getValue() + " and " + GEZ_COLUMN + " = " + gez.getValue() + + " GROUP BY " + + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + "," + + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1), - progressListener.updateProgress(currentStep++, STEPS, "Generating XML timeseries file" ); - // Extract data from the Relational Database into an XML File with information per year - File timeseriesXMLFile =ipccDataExportToXML.generateTimeseriesData(IPCCGenerator.START_YEAR, IPCCGenerator.END_YEAR ); - if( progressListener.isUserCancelled() ) return; - - progressListener.updateProgress(currentStep++, STEPS, "Generating Excel LU Matrixes per year" ); - // Extract data from the Relational Database into an excel file of transition Matrixes per year - File matrixXLSFile =dataExportMatrixExcel.generateTimeseriesData(START_YEAR, END_YEAR); - if( progressListener.isUserCancelled() ) return; + getRowMapper() - progressListener.updateProgress(currentStep++, STEPS, "Generating Excel LU Matrixes per year STRATIFIED" ); - // Extract data from the Relational Database into an excel file of transition Matrixes per year - File matrixXLSExtendedFile =dataExportMatrixExtendedExcel.generateTimeseriesData(START_YEAR, END_YEAR); - if( progressListener.isUserCancelled() ) return; - - try { - progressListener.updateProgress(currentStep++, STEPS, "Compressing files into selected destination" ); - CollectEarthUtils.addFileToZip( destinationZip , timeseriesXMLFile, "LU_Timeseries.xml"); - CollectEarthUtils.addFileToZip( destinationZip , matrixXLSFile, "LU_Matrixes.xls"); - CollectEarthUtils.addFileToZip( destinationZip , matrixXLSExtendedFile, "LU_Matrixes_stratified.xls"); - CollectEarthUtils.addFileToZip( destinationZip , subdivisionsFile, "ConfigLandUseSubdivisions.xml"); - CollectEarthUtils.addFileToZip( destinationZip , climateZones, "ConfigClimateZones.xml"); - CollectEarthUtils.addFileToZip( destinationZip , ecologicalZones, "ConfigEclogicalZones.xml"); - CollectEarthUtils.addFileToZip( destinationZip , soilTypes, "ConfigSoilTypes.xml"); - CollectEarthUtils.addFileToZip( destinationZip , landUnitsCSVFile, "LU_Timeseries_grouped.csv"); - CollectEarthUtils.addFileToZip( destinationZip , perPlotCSVFile, "LU_Timeseries_per_plot.csv"); - progressListener.hide(); - } catch (IOException e) { - logger.error("Error when creating ZIP file with timeseries content " + destinationZip, e); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (Exception e) { - logger.error("Error when zipping the timeseries content into " + destinationZip, e); //$NON-NLS-1$ //$NON-NLS-2$ - } - - // Open the ZIP file automatically to inspect the output - CollectEarthUtils.openFile( destinationZip ); + ); - } catch (IOException e) { - logger.error("Error generating file", e); + if (luData.size() == 0) { // No LU data for the climate, soil, gez combination + return null; } + StratumPerYearData strataPerYearData = new StratumPerYearData(year, climate.getLabel(), soil.getLabel(), gez.getLabel()); + strataPerYearData.setLuData(luData); + return strataPerYearData; + } + + protected RowMapper getRowMapper() { + return new RowMapper() { + @Override + public LUDataPerYear mapRow(ResultSet rs, int rowNum) throws SQLException { + + String categoryInitial = rs.getString(1); + String categoryFinal = rs.getString(2); + String subdivInitial = rs.getString(3); + String subdivFinal = rs.getString(4); + + return new LUDataPerYear( + LandUseSubdivisionUtils.getSubdivision(categoryInitial, subdivInitial), + LandUseSubdivisionUtils.getSubdivision(categoryFinal, subdivFinal), + rs.getDouble(5) // area + ); + } + }; + } + + private List getStrataClimate() { + return distinctValue(CLIMATE_COLUMN_VALUE, CLIMATE_COLUMN_LABEL, CLIMATE_TABLE, CLIMATE_COLUMN_IN_PLOT); + } + + private List getStrataSoil() { + return distinctValue(SOIL_COLUMN_VALUE, SOIL_COLUMN_LABEL, SOIL_TABLE, SOIL_COLUMN_IN_PLOT); + } + + private List getStrataGEZ() { + return distinctValue(GEZ_COLUMN_VALUE, GEZ_COLUMN_LABEL, GEZ_TABLE, GEZ_COLUMN_IN_PLOT ); + } + + private List distinctValue(String valueColumn, String labelColumn, String table, String plotColumnId) { + + return getJdbcTemplate().query( + "SELECT DISTINCT(" + valueColumn +"),"+ labelColumn + + " FROM " + schemaName + table + ", " + schemaName + PLOT_TABLE + + " WHERE " + PLOT_TABLE + "." + plotColumnId + " = " + table + "." + table + "_id" + , + new RowMapper() { + @Override + public StratumObject mapRow(ResultSet rs, int rowNum) throws SQLException { + + return new StratumObject( rs.getString(valueColumn), rs.getString(labelColumn) ); + } + + }); } } From cb35dcd93657e23760ba669baa457c69cb36bfd7 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:05 +0100 Subject: [PATCH 1442/1620] New translations IPCCDataExportTimeSeries.java (Spanish) --- .../earth/app/view/Messages_es.properties | 164 ++++++++++++++---- 1 file changed, 128 insertions(+), 36 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 21431b088f..c94c09f2e8 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -2,76 +2,168 @@ package org.openforis.collect.earth.ipcc; import java.io.File; import java.io.IOException; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; import java.util.List; import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.RDBConnector; import org.openforis.collect.earth.app.service.RegionCalculationUtils; import org.openforis.collect.earth.app.service.SchemaService; +import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; +import org.openforis.collect.earth.ipcc.model.StratumObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Component; @Component -public class IPCCDataExportPerPlotCSV extends IPCCDataExportCSV { - +public abstract class IPCCDataExportTimeSeries extends RDBConnector { + + public static final String CLIMATE_COLUMN = "climate"; + public static final String GEZ_COLUMN = "gez"; + public static final String SOIL_COLUMN = "soil"; + + public static final String CLIMATE_COLUMN_VALUE = "climate_zones"; + public static final String CLIMATE_TABLE = CLIMATE_COLUMN_VALUE + "_code"; + public static final String CLIMATE_COLUMN_LABEL = CLIMATE_COLUMN_VALUE + "_label"; + public static final String CLIMATE_COLUMN_ID = CLIMATE_COLUMN_VALUE + "_code_id"; + public static final String CLIMATE_COLUMN_IN_PLOT = "climate_code_id"; + + public static final String GEZ_COLUMN_VALUE = "ecological_zones"; + public static final String GEZ_TABLE = GEZ_COLUMN_VALUE + "_code"; + public static final String GEZ_COLUMN_LABEL = GEZ_COLUMN_VALUE + "_label"; + public static final String GEZ_COLUMN_ID = GEZ_COLUMN_VALUE + "_code_id"; + public static final String GEZ_COLUMN_IN_PLOT = "gez_code_id"; + + + public static final String SOIL_COLUMN_VALUE = "soil_types"; + public static final String SOIL_TABLE = SOIL_COLUMN_VALUE + "_code"; + public static final String SOIL_COLUMN_LABEL = SOIL_COLUMN_VALUE + "_label"; + public static final String SOIL_COLUMN_ID = SOIL_COLUMN_VALUE + "_code_id"; + public static final String SOIL_COLUMN_IN_PLOT = "soil_code_id"; + private String schemaName; + public static final String PLOT_TABLE = "plot"; + public static final String PLOT_ID = "id"; - Logger logger = LoggerFactory.getLogger(IPCCDataExportPerPlotCSV.class); + Logger logger = LoggerFactory.getLogger(IPCCDataExportTimeSeries.class); @Autowired private SchemaService schemaService; - public IPCCDataExportPerPlotCSV() { + + public IPCCDataExportTimeSeries() { setExportTypeUsed(ExportType.IPCC); } public File generateTimeseriesData( int startYear, int endYear ) throws IOException { + schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - List luCombinations = generateLUCombinations(startYear, endYear); + List strataClimate = getStrataClimate(); + List strataSoil = getStrataSoil(); + List strataGEZ = getStrataGEZ(); + + List strataData = new ArrayList(); + + for (int year = startYear; year < endYear; year++) { + for (StratumObject gez : strataGEZ) { + for (StratumObject climate : strataClimate) { + for (StratumObject soil : strataSoil) { + E yearLuData = (E) generateLUTimeseriesForStrata(year, gez, climate, soil); + if (yearLuData != null) + strataData.add(yearLuData); + } + } + } + } - return createCsv( luCombinations); - } + return generateFile( strataData); + } - private List generateLUCombinations(int startYear, int endYear) { - - String selectedYears = IPCCDataExportTimeSeries.PLOT_ID + - ", " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_LABEL + - ", " + IPCCDataExportTimeSeries.SOIL_COLUMN_LABEL + - ", " + IPCCDataExportTimeSeries.GEZ_COLUMN_LABEL + ", " ; - - for( int year = startYear ; year <= endYear; year++ ) { + protected abstract File generateFile( List strataData) throws IOException; - selectedYears += IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + ","; + private StratumPerYearData generateLUTimeseriesForStrata(int year, StratumObject gez, StratumObject climate,StratumObject soil) { + List luData = getJdbcTemplate().query( + + "select " + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + + ", " + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1) + ", sum( " + + RegionCalculationUtils.EXPANSION_FACTOR + ")" + + " from " + schemaName + PLOT_TABLE + + " where " + + CLIMATE_COLUMN + " = " + climate.getValue() + " and " + SOIL_COLUMN + " = " + soil.getValue() + " and " + GEZ_COLUMN + " = " + gez.getValue() + + " GROUP BY " + + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + "," + + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1), + + getRowMapper() + + ); + + if (luData.size() == 0) { // No LU data for the climate, soil, gez combination + return null; } - String sqlSelect = "select " - + selectedYears - + RegionCalculationUtils.EXPANSION_FACTOR - + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.SOIL_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.CLIMATE_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.GEZ_TABLE + StratumPerYearData strataPerYearData = new StratumPerYearData(year, climate.getLabel(), soil.getLabel(), gez.getLabel()); + strataPerYearData.setLuData(luData); + return strataPerYearData; + } + + protected RowMapper getRowMapper() { + return new RowMapper() { + @Override + public LUDataPerYear mapRow(ResultSet rs, int rowNum) throws SQLException { - + " where " - + IPCCDataExportTimeSeries.SOIL_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.SOIL_COLUMN_ID - + " and " - + IPCCDataExportTimeSeries.CLIMATE_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_ID - + " and " - + IPCCDataExportTimeSeries.GEZ_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.GEZ_COLUMN_ID + String categoryInitial = rs.getString(1); + String categoryFinal = rs.getString(2); + String subdivInitial = rs.getString(3); + String subdivFinal = rs.getString(4); - + " ORDER BY "+ IPCCDataExportTimeSeries.PLOT_ID + " DESC"; // Remove trailing comma from list of years + return new LUDataPerYear( + LandUseSubdivisionUtils.getSubdivision(categoryInitial, subdivInitial), + LandUseSubdivisionUtils.getSubdivision(categoryFinal, subdivFinal), + rs.getDouble(5) // area + ); + } + }; + } + + private List getStrataClimate() { + return distinctValue(CLIMATE_COLUMN_VALUE, CLIMATE_COLUMN_LABEL, CLIMATE_TABLE, CLIMATE_COLUMN_IN_PLOT); + } + + private List getStrataSoil() { + return distinctValue(SOIL_COLUMN_VALUE, SOIL_COLUMN_LABEL, SOIL_TABLE, SOIL_COLUMN_IN_PLOT); + } + + private List getStrataGEZ() { + return distinctValue(GEZ_COLUMN_VALUE, GEZ_COLUMN_LABEL, GEZ_TABLE, GEZ_COLUMN_IN_PLOT ); + } + + private List distinctValue(String valueColumn, String labelColumn, String table, String plotColumnId) { + + return getJdbcTemplate().query( + "SELECT DISTINCT(" + valueColumn +"),"+ labelColumn + + " FROM " + schemaName + table + ", " + schemaName + PLOT_TABLE + + " WHERE " + PLOT_TABLE + "." + plotColumnId + " = " + table + "." + table + "_id" + , + new RowMapper() { + @Override + public StratumObject mapRow(ResultSet rs, int rowNum) throws SQLException { - List luData = getJdbcTemplate().query( - sqlSelect - , - getRowMapper() - ); + return new StratumObject( rs.getString(valueColumn), rs.getString(labelColumn) ); + } - selectedYears+= "area"; // so the area columns appears too - luData.add( 0, selectedYears.split(",") ); - return luData; + }); } } From c2d4f491792f8d075d60d6f449db14bd26335cbe Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:06 +0100 Subject: [PATCH 1443/1620] New translations IPCCDataExportTimeSeries.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 164 ++++++++++++++---- 1 file changed, 128 insertions(+), 36 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 21431b088f..c94c09f2e8 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -2,76 +2,168 @@ package org.openforis.collect.earth.ipcc; import java.io.File; import java.io.IOException; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; import java.util.List; import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.RDBConnector; import org.openforis.collect.earth.app.service.RegionCalculationUtils; import org.openforis.collect.earth.app.service.SchemaService; +import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; +import org.openforis.collect.earth.ipcc.model.StratumObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Component; @Component -public class IPCCDataExportPerPlotCSV extends IPCCDataExportCSV { - +public abstract class IPCCDataExportTimeSeries extends RDBConnector { + + public static final String CLIMATE_COLUMN = "climate"; + public static final String GEZ_COLUMN = "gez"; + public static final String SOIL_COLUMN = "soil"; + + public static final String CLIMATE_COLUMN_VALUE = "climate_zones"; + public static final String CLIMATE_TABLE = CLIMATE_COLUMN_VALUE + "_code"; + public static final String CLIMATE_COLUMN_LABEL = CLIMATE_COLUMN_VALUE + "_label"; + public static final String CLIMATE_COLUMN_ID = CLIMATE_COLUMN_VALUE + "_code_id"; + public static final String CLIMATE_COLUMN_IN_PLOT = "climate_code_id"; + + public static final String GEZ_COLUMN_VALUE = "ecological_zones"; + public static final String GEZ_TABLE = GEZ_COLUMN_VALUE + "_code"; + public static final String GEZ_COLUMN_LABEL = GEZ_COLUMN_VALUE + "_label"; + public static final String GEZ_COLUMN_ID = GEZ_COLUMN_VALUE + "_code_id"; + public static final String GEZ_COLUMN_IN_PLOT = "gez_code_id"; + + + public static final String SOIL_COLUMN_VALUE = "soil_types"; + public static final String SOIL_TABLE = SOIL_COLUMN_VALUE + "_code"; + public static final String SOIL_COLUMN_LABEL = SOIL_COLUMN_VALUE + "_label"; + public static final String SOIL_COLUMN_ID = SOIL_COLUMN_VALUE + "_code_id"; + public static final String SOIL_COLUMN_IN_PLOT = "soil_code_id"; + private String schemaName; + public static final String PLOT_TABLE = "plot"; + public static final String PLOT_ID = "id"; - Logger logger = LoggerFactory.getLogger(IPCCDataExportPerPlotCSV.class); + Logger logger = LoggerFactory.getLogger(IPCCDataExportTimeSeries.class); @Autowired private SchemaService schemaService; - public IPCCDataExportPerPlotCSV() { + + public IPCCDataExportTimeSeries() { setExportTypeUsed(ExportType.IPCC); } public File generateTimeseriesData( int startYear, int endYear ) throws IOException { + schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - List luCombinations = generateLUCombinations(startYear, endYear); + List strataClimate = getStrataClimate(); + List strataSoil = getStrataSoil(); + List strataGEZ = getStrataGEZ(); + + List strataData = new ArrayList(); + + for (int year = startYear; year < endYear; year++) { + for (StratumObject gez : strataGEZ) { + for (StratumObject climate : strataClimate) { + for (StratumObject soil : strataSoil) { + E yearLuData = (E) generateLUTimeseriesForStrata(year, gez, climate, soil); + if (yearLuData != null) + strataData.add(yearLuData); + } + } + } + } - return createCsv( luCombinations); - } + return generateFile( strataData); + } - private List generateLUCombinations(int startYear, int endYear) { - - String selectedYears = IPCCDataExportTimeSeries.PLOT_ID + - ", " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_LABEL + - ", " + IPCCDataExportTimeSeries.SOIL_COLUMN_LABEL + - ", " + IPCCDataExportTimeSeries.GEZ_COLUMN_LABEL + ", " ; - - for( int year = startYear ; year <= endYear; year++ ) { + protected abstract File generateFile( List strataData) throws IOException; - selectedYears += IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + ","; + private StratumPerYearData generateLUTimeseriesForStrata(int year, StratumObject gez, StratumObject climate,StratumObject soil) { + List luData = getJdbcTemplate().query( + + "select " + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + + ", " + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1) + ", sum( " + + RegionCalculationUtils.EXPANSION_FACTOR + ")" + + " from " + schemaName + PLOT_TABLE + + " where " + + CLIMATE_COLUMN + " = " + climate.getValue() + " and " + SOIL_COLUMN + " = " + soil.getValue() + " and " + GEZ_COLUMN + " = " + gez.getValue() + + " GROUP BY " + + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + "," + + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1), + + getRowMapper() + + ); + + if (luData.size() == 0) { // No LU data for the climate, soil, gez combination + return null; } - String sqlSelect = "select " - + selectedYears - + RegionCalculationUtils.EXPANSION_FACTOR - + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.SOIL_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.CLIMATE_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.GEZ_TABLE + StratumPerYearData strataPerYearData = new StratumPerYearData(year, climate.getLabel(), soil.getLabel(), gez.getLabel()); + strataPerYearData.setLuData(luData); + return strataPerYearData; + } + + protected RowMapper getRowMapper() { + return new RowMapper() { + @Override + public LUDataPerYear mapRow(ResultSet rs, int rowNum) throws SQLException { - + " where " - + IPCCDataExportTimeSeries.SOIL_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.SOIL_COLUMN_ID - + " and " - + IPCCDataExportTimeSeries.CLIMATE_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_ID - + " and " - + IPCCDataExportTimeSeries.GEZ_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.GEZ_COLUMN_ID + String categoryInitial = rs.getString(1); + String categoryFinal = rs.getString(2); + String subdivInitial = rs.getString(3); + String subdivFinal = rs.getString(4); - + " ORDER BY "+ IPCCDataExportTimeSeries.PLOT_ID + " DESC"; // Remove trailing comma from list of years + return new LUDataPerYear( + LandUseSubdivisionUtils.getSubdivision(categoryInitial, subdivInitial), + LandUseSubdivisionUtils.getSubdivision(categoryFinal, subdivFinal), + rs.getDouble(5) // area + ); + } + }; + } + + private List getStrataClimate() { + return distinctValue(CLIMATE_COLUMN_VALUE, CLIMATE_COLUMN_LABEL, CLIMATE_TABLE, CLIMATE_COLUMN_IN_PLOT); + } + + private List getStrataSoil() { + return distinctValue(SOIL_COLUMN_VALUE, SOIL_COLUMN_LABEL, SOIL_TABLE, SOIL_COLUMN_IN_PLOT); + } + + private List getStrataGEZ() { + return distinctValue(GEZ_COLUMN_VALUE, GEZ_COLUMN_LABEL, GEZ_TABLE, GEZ_COLUMN_IN_PLOT ); + } + + private List distinctValue(String valueColumn, String labelColumn, String table, String plotColumnId) { + + return getJdbcTemplate().query( + "SELECT DISTINCT(" + valueColumn +"),"+ labelColumn + + " FROM " + schemaName + table + ", " + schemaName + PLOT_TABLE + + " WHERE " + PLOT_TABLE + "." + plotColumnId + " = " + table + "." + table + "_id" + , + new RowMapper() { + @Override + public StratumObject mapRow(ResultSet rs, int rowNum) throws SQLException { - List luData = getJdbcTemplate().query( - sqlSelect - , - getRowMapper() - ); + return new StratumObject( rs.getString(valueColumn), rs.getString(labelColumn) ); + } - selectedYears+= "area"; // so the area columns appears too - luData.add( 0, selectedYears.split(",") ); - return luData; + }); } } From 97083d058746f73aa15599a5840c4cde9335e1c7 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:07 +0100 Subject: [PATCH 1444/1620] New translations IPCCDataExportTimeSeries.java (English) --- .../earth/app/view/Messages_en.properties | 164 ++++++++++++++---- 1 file changed, 128 insertions(+), 36 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 21431b088f..c94c09f2e8 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -2,76 +2,168 @@ package org.openforis.collect.earth.ipcc; import java.io.File; import java.io.IOException; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; import java.util.List; import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.RDBConnector; import org.openforis.collect.earth.app.service.RegionCalculationUtils; import org.openforis.collect.earth.app.service.SchemaService; +import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; +import org.openforis.collect.earth.ipcc.model.StratumObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Component; @Component -public class IPCCDataExportPerPlotCSV extends IPCCDataExportCSV { - +public abstract class IPCCDataExportTimeSeries extends RDBConnector { + + public static final String CLIMATE_COLUMN = "climate"; + public static final String GEZ_COLUMN = "gez"; + public static final String SOIL_COLUMN = "soil"; + + public static final String CLIMATE_COLUMN_VALUE = "climate_zones"; + public static final String CLIMATE_TABLE = CLIMATE_COLUMN_VALUE + "_code"; + public static final String CLIMATE_COLUMN_LABEL = CLIMATE_COLUMN_VALUE + "_label"; + public static final String CLIMATE_COLUMN_ID = CLIMATE_COLUMN_VALUE + "_code_id"; + public static final String CLIMATE_COLUMN_IN_PLOT = "climate_code_id"; + + public static final String GEZ_COLUMN_VALUE = "ecological_zones"; + public static final String GEZ_TABLE = GEZ_COLUMN_VALUE + "_code"; + public static final String GEZ_COLUMN_LABEL = GEZ_COLUMN_VALUE + "_label"; + public static final String GEZ_COLUMN_ID = GEZ_COLUMN_VALUE + "_code_id"; + public static final String GEZ_COLUMN_IN_PLOT = "gez_code_id"; + + + public static final String SOIL_COLUMN_VALUE = "soil_types"; + public static final String SOIL_TABLE = SOIL_COLUMN_VALUE + "_code"; + public static final String SOIL_COLUMN_LABEL = SOIL_COLUMN_VALUE + "_label"; + public static final String SOIL_COLUMN_ID = SOIL_COLUMN_VALUE + "_code_id"; + public static final String SOIL_COLUMN_IN_PLOT = "soil_code_id"; + private String schemaName; + public static final String PLOT_TABLE = "plot"; + public static final String PLOT_ID = "id"; - Logger logger = LoggerFactory.getLogger(IPCCDataExportPerPlotCSV.class); + Logger logger = LoggerFactory.getLogger(IPCCDataExportTimeSeries.class); @Autowired private SchemaService schemaService; - public IPCCDataExportPerPlotCSV() { + + public IPCCDataExportTimeSeries() { setExportTypeUsed(ExportType.IPCC); } public File generateTimeseriesData( int startYear, int endYear ) throws IOException { + schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - List luCombinations = generateLUCombinations(startYear, endYear); + List strataClimate = getStrataClimate(); + List strataSoil = getStrataSoil(); + List strataGEZ = getStrataGEZ(); + + List strataData = new ArrayList(); + + for (int year = startYear; year < endYear; year++) { + for (StratumObject gez : strataGEZ) { + for (StratumObject climate : strataClimate) { + for (StratumObject soil : strataSoil) { + E yearLuData = (E) generateLUTimeseriesForStrata(year, gez, climate, soil); + if (yearLuData != null) + strataData.add(yearLuData); + } + } + } + } - return createCsv( luCombinations); - } + return generateFile( strataData); + } - private List generateLUCombinations(int startYear, int endYear) { - - String selectedYears = IPCCDataExportTimeSeries.PLOT_ID + - ", " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_LABEL + - ", " + IPCCDataExportTimeSeries.SOIL_COLUMN_LABEL + - ", " + IPCCDataExportTimeSeries.GEZ_COLUMN_LABEL + ", " ; - - for( int year = startYear ; year <= endYear; year++ ) { + protected abstract File generateFile( List strataData) throws IOException; - selectedYears += IPCCSurveyAdapter.getIpccCategoryAttrName(year) + ", " - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + ","; + private StratumPerYearData generateLUTimeseriesForStrata(int year, StratumObject gez, StratumObject climate,StratumObject soil) { + List luData = getJdbcTemplate().query( + + "select " + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + + ", " + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1) + ", sum( " + + RegionCalculationUtils.EXPANSION_FACTOR + ")" + + " from " + schemaName + PLOT_TABLE + + " where " + + CLIMATE_COLUMN + " = " + climate.getValue() + " and " + SOIL_COLUMN + " = " + soil.getValue() + " and " + GEZ_COLUMN + " = " + gez.getValue() + + " GROUP BY " + + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + "," + + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," + + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1), + + getRowMapper() + + ); + + if (luData.size() == 0) { // No LU data for the climate, soil, gez combination + return null; } - String sqlSelect = "select " - + selectedYears - + RegionCalculationUtils.EXPANSION_FACTOR - + " from " + schemaName + IPCCDataExportTimeSeries.PLOT_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.SOIL_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.CLIMATE_TABLE + " ," + schemaName + IPCCDataExportTimeSeries.GEZ_TABLE + StratumPerYearData strataPerYearData = new StratumPerYearData(year, climate.getLabel(), soil.getLabel(), gez.getLabel()); + strataPerYearData.setLuData(luData); + return strataPerYearData; + } + + protected RowMapper getRowMapper() { + return new RowMapper() { + @Override + public LUDataPerYear mapRow(ResultSet rs, int rowNum) throws SQLException { - + " where " - + IPCCDataExportTimeSeries.SOIL_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.SOIL_COLUMN_ID - + " and " - + IPCCDataExportTimeSeries.CLIMATE_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.CLIMATE_COLUMN_ID - + " and " - + IPCCDataExportTimeSeries.GEZ_COLUMN_IN_PLOT + " = " + IPCCDataExportTimeSeries.GEZ_COLUMN_ID + String categoryInitial = rs.getString(1); + String categoryFinal = rs.getString(2); + String subdivInitial = rs.getString(3); + String subdivFinal = rs.getString(4); - + " ORDER BY "+ IPCCDataExportTimeSeries.PLOT_ID + " DESC"; // Remove trailing comma from list of years + return new LUDataPerYear( + LandUseSubdivisionUtils.getSubdivision(categoryInitial, subdivInitial), + LandUseSubdivisionUtils.getSubdivision(categoryFinal, subdivFinal), + rs.getDouble(5) // area + ); + } + }; + } + + private List getStrataClimate() { + return distinctValue(CLIMATE_COLUMN_VALUE, CLIMATE_COLUMN_LABEL, CLIMATE_TABLE, CLIMATE_COLUMN_IN_PLOT); + } + + private List getStrataSoil() { + return distinctValue(SOIL_COLUMN_VALUE, SOIL_COLUMN_LABEL, SOIL_TABLE, SOIL_COLUMN_IN_PLOT); + } + + private List getStrataGEZ() { + return distinctValue(GEZ_COLUMN_VALUE, GEZ_COLUMN_LABEL, GEZ_TABLE, GEZ_COLUMN_IN_PLOT ); + } + + private List distinctValue(String valueColumn, String labelColumn, String table, String plotColumnId) { + + return getJdbcTemplate().query( + "SELECT DISTINCT(" + valueColumn +"),"+ labelColumn + + " FROM " + schemaName + table + ", " + schemaName + PLOT_TABLE + + " WHERE " + PLOT_TABLE + "." + plotColumnId + " = " + table + "." + table + "_id" + , + new RowMapper() { + @Override + public StratumObject mapRow(ResultSet rs, int rowNum) throws SQLException { - List luData = getJdbcTemplate().query( - sqlSelect - , - getRowMapper() - ); + return new StratumObject( rs.getString(valueColumn), rs.getString(labelColumn) ); + } - selectedYears+= "area"; // so the area columns appears too - luData.add( 0, selectedYears.split(",") ); - return luData; + }); } } From cfe4ba44778e9cacdea52d8c50665c952413830c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:08 +0100 Subject: [PATCH 1445/1620] New translations IPCCDataExportTimeSeriesXML.java (French) --- .../earth/app/view/Messages_fr.properties | 160 +++--------------- 1 file changed, 26 insertions(+), 134 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index c94c09f2e8..60af2b664f 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,123 +1,23 @@ package org.openforis.collect.earth.ipcc; import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.ArrayList; import java.util.List; -import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.RDBConnector; -import org.openforis.collect.earth.app.service.RegionCalculationUtils; -import org.openforis.collect.earth.app.service.SchemaService; import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; -import org.openforis.collect.earth.ipcc.model.StratumObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Component; -@Component -public abstract class IPCCDataExportTimeSeries extends RDBConnector { - - public static final String CLIMATE_COLUMN = "climate"; - public static final String GEZ_COLUMN = "gez"; - public static final String SOIL_COLUMN = "soil"; - - public static final String CLIMATE_COLUMN_VALUE = "climate_zones"; - public static final String CLIMATE_TABLE = CLIMATE_COLUMN_VALUE + "_code"; - public static final String CLIMATE_COLUMN_LABEL = CLIMATE_COLUMN_VALUE + "_label"; - public static final String CLIMATE_COLUMN_ID = CLIMATE_COLUMN_VALUE + "_code_id"; - public static final String CLIMATE_COLUMN_IN_PLOT = "climate_code_id"; - - public static final String GEZ_COLUMN_VALUE = "ecological_zones"; - public static final String GEZ_TABLE = GEZ_COLUMN_VALUE + "_code"; - public static final String GEZ_COLUMN_LABEL = GEZ_COLUMN_VALUE + "_label"; - public static final String GEZ_COLUMN_ID = GEZ_COLUMN_VALUE + "_code_id"; - public static final String GEZ_COLUMN_IN_PLOT = "gez_code_id"; - - - public static final String SOIL_COLUMN_VALUE = "soil_types"; - public static final String SOIL_TABLE = SOIL_COLUMN_VALUE + "_code"; - public static final String SOIL_COLUMN_LABEL = SOIL_COLUMN_VALUE + "_label"; - public static final String SOIL_COLUMN_ID = SOIL_COLUMN_VALUE + "_code_id"; - public static final String SOIL_COLUMN_IN_PLOT = "soil_code_id"; - - private String schemaName; - public static final String PLOT_TABLE = "plot"; - public static final String PLOT_ID = "id"; - - Logger logger = LoggerFactory.getLogger(IPCCDataExportTimeSeries.class); - - @Autowired - private SchemaService schemaService; - - - public IPCCDataExportTimeSeries() { - setExportTypeUsed(ExportType.IPCC); - } - - public File generateTimeseriesData( int startYear, int endYear ) throws IOException { - - schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - - List strataClimate = getStrataClimate(); - List strataSoil = getStrataSoil(); - List strataGEZ = getStrataGEZ(); - - List strataData = new ArrayList(); - - for (int year = startYear; year < endYear; year++) { - for (StratumObject gez : strataGEZ) { - for (StratumObject climate : strataClimate) { - for (StratumObject soil : strataSoil) { - E yearLuData = (E) generateLUTimeseriesForStrata(year, gez, climate, soil); - if (yearLuData != null) - strataData.add(yearLuData); - } - } - } - } - - return generateFile( strataData); - - } - - protected abstract File generateFile( List strataData) throws IOException; - - private StratumPerYearData generateLUTimeseriesForStrata(int year, StratumObject gez, StratumObject climate,StratumObject soil) { +import com.thoughtworks.xstream.XStream; - List luData = getJdbcTemplate().query( - - "select " + IPCCSurveyAdapter.getIpccCategoryAttrName(year) - + ", " + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1) + ", sum( " - + RegionCalculationUtils.EXPANSION_FACTOR + ")" - + " from " + schemaName + PLOT_TABLE - + " where " - + CLIMATE_COLUMN + " = " + climate.getValue() + " and " + SOIL_COLUMN + " = " + soil.getValue() + " and " + GEZ_COLUMN + " = " + gez.getValue() - + " GROUP BY " - + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + "," - + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1), - - getRowMapper() - - ); - - if (luData.size() == 0) { // No LU data for the climate, soil, gez combination - return null; - } - - StratumPerYearData strataPerYearData = new StratumPerYearData(year, climate.getLabel(), soil.getLabel(), gez.getLabel()); - strataPerYearData.setLuData(luData); - return strataPerYearData; - } +@Component +public class IPCCDataExportTimeSeriesXML extends IPCCDataExportTimeSeries { + @Override protected RowMapper getRowMapper() { return new RowMapper() { @Override @@ -137,33 +37,25 @@ public abstract class IPCCDataExportTimeSeries extends RDBConnector { }; } - private List getStrataClimate() { - return distinctValue(CLIMATE_COLUMN_VALUE, CLIMATE_COLUMN_LABEL, CLIMATE_TABLE, CLIMATE_COLUMN_IN_PLOT); - } - - private List getStrataSoil() { - return distinctValue(SOIL_COLUMN_VALUE, SOIL_COLUMN_LABEL, SOIL_TABLE, SOIL_COLUMN_IN_PLOT); - } - - private List getStrataGEZ() { - return distinctValue(GEZ_COLUMN_VALUE, GEZ_COLUMN_LABEL, GEZ_TABLE, GEZ_COLUMN_IN_PLOT ); - } - - private List distinctValue(String valueColumn, String labelColumn, String table, String plotColumnId) { - - return getJdbcTemplate().query( - "SELECT DISTINCT(" + valueColumn +"),"+ labelColumn + - " FROM " + schemaName + table + ", " + schemaName + PLOT_TABLE + - " WHERE " + PLOT_TABLE + "." + plotColumnId + " = " + table + "." + table + "_id" - , - new RowMapper() { - @Override - public StratumObject mapRow(ResultSet rs, int rowNum) throws SQLException { - - return new StratumObject( rs.getString(valueColumn), rs.getString(labelColumn) ); - } - - }); + @Override + protected File generateFile( List strataData) throws IOException { + File xmlFileDestination = File.createTempFile("landUsesTimeseries", ".xml"); + xmlFileDestination.deleteOnExit(); + XStream xStream = new XStream(); + xStream.alias("LandUse", LUDataPerYear.class); + xStream.alias("Stratum", StratumPerYearData.class); + xStream.alias("Subdivision", LandUseSubdivision.class); + + xStream.setMode(XStream.NO_REFERENCES); + String xmlSchema = xStream.toXML(strataData); + + try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { + byte[] strToBytes = xmlSchema.getBytes(); + outputStream.write(strToBytes); + } catch (Exception e) { + logger.error("Error saving data to file", e); + } + + return xmlFileDestination; } - } From f26170268f6543bfdac4fa04e85cdb30288bece7 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:09 +0100 Subject: [PATCH 1446/1620] New translations IPCCDataExportTimeSeriesXML.java (Spanish) --- .../earth/app/view/Messages_es.properties | 160 +++--------------- 1 file changed, 26 insertions(+), 134 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index c94c09f2e8..60af2b664f 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,123 +1,23 @@ package org.openforis.collect.earth.ipcc; import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.ArrayList; import java.util.List; -import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.RDBConnector; -import org.openforis.collect.earth.app.service.RegionCalculationUtils; -import org.openforis.collect.earth.app.service.SchemaService; import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; -import org.openforis.collect.earth.ipcc.model.StratumObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Component; -@Component -public abstract class IPCCDataExportTimeSeries extends RDBConnector { - - public static final String CLIMATE_COLUMN = "climate"; - public static final String GEZ_COLUMN = "gez"; - public static final String SOIL_COLUMN = "soil"; - - public static final String CLIMATE_COLUMN_VALUE = "climate_zones"; - public static final String CLIMATE_TABLE = CLIMATE_COLUMN_VALUE + "_code"; - public static final String CLIMATE_COLUMN_LABEL = CLIMATE_COLUMN_VALUE + "_label"; - public static final String CLIMATE_COLUMN_ID = CLIMATE_COLUMN_VALUE + "_code_id"; - public static final String CLIMATE_COLUMN_IN_PLOT = "climate_code_id"; - - public static final String GEZ_COLUMN_VALUE = "ecological_zones"; - public static final String GEZ_TABLE = GEZ_COLUMN_VALUE + "_code"; - public static final String GEZ_COLUMN_LABEL = GEZ_COLUMN_VALUE + "_label"; - public static final String GEZ_COLUMN_ID = GEZ_COLUMN_VALUE + "_code_id"; - public static final String GEZ_COLUMN_IN_PLOT = "gez_code_id"; - - - public static final String SOIL_COLUMN_VALUE = "soil_types"; - public static final String SOIL_TABLE = SOIL_COLUMN_VALUE + "_code"; - public static final String SOIL_COLUMN_LABEL = SOIL_COLUMN_VALUE + "_label"; - public static final String SOIL_COLUMN_ID = SOIL_COLUMN_VALUE + "_code_id"; - public static final String SOIL_COLUMN_IN_PLOT = "soil_code_id"; - - private String schemaName; - public static final String PLOT_TABLE = "plot"; - public static final String PLOT_ID = "id"; - - Logger logger = LoggerFactory.getLogger(IPCCDataExportTimeSeries.class); - - @Autowired - private SchemaService schemaService; - - - public IPCCDataExportTimeSeries() { - setExportTypeUsed(ExportType.IPCC); - } - - public File generateTimeseriesData( int startYear, int endYear ) throws IOException { - - schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - - List strataClimate = getStrataClimate(); - List strataSoil = getStrataSoil(); - List strataGEZ = getStrataGEZ(); - - List strataData = new ArrayList(); - - for (int year = startYear; year < endYear; year++) { - for (StratumObject gez : strataGEZ) { - for (StratumObject climate : strataClimate) { - for (StratumObject soil : strataSoil) { - E yearLuData = (E) generateLUTimeseriesForStrata(year, gez, climate, soil); - if (yearLuData != null) - strataData.add(yearLuData); - } - } - } - } - - return generateFile( strataData); - - } - - protected abstract File generateFile( List strataData) throws IOException; - - private StratumPerYearData generateLUTimeseriesForStrata(int year, StratumObject gez, StratumObject climate,StratumObject soil) { +import com.thoughtworks.xstream.XStream; - List luData = getJdbcTemplate().query( - - "select " + IPCCSurveyAdapter.getIpccCategoryAttrName(year) - + ", " + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1) + ", sum( " - + RegionCalculationUtils.EXPANSION_FACTOR + ")" - + " from " + schemaName + PLOT_TABLE - + " where " - + CLIMATE_COLUMN + " = " + climate.getValue() + " and " + SOIL_COLUMN + " = " + soil.getValue() + " and " + GEZ_COLUMN + " = " + gez.getValue() - + " GROUP BY " - + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + "," - + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1), - - getRowMapper() - - ); - - if (luData.size() == 0) { // No LU data for the climate, soil, gez combination - return null; - } - - StratumPerYearData strataPerYearData = new StratumPerYearData(year, climate.getLabel(), soil.getLabel(), gez.getLabel()); - strataPerYearData.setLuData(luData); - return strataPerYearData; - } +@Component +public class IPCCDataExportTimeSeriesXML extends IPCCDataExportTimeSeries { + @Override protected RowMapper getRowMapper() { return new RowMapper() { @Override @@ -137,33 +37,25 @@ public abstract class IPCCDataExportTimeSeries extends RDBConnector { }; } - private List getStrataClimate() { - return distinctValue(CLIMATE_COLUMN_VALUE, CLIMATE_COLUMN_LABEL, CLIMATE_TABLE, CLIMATE_COLUMN_IN_PLOT); - } - - private List getStrataSoil() { - return distinctValue(SOIL_COLUMN_VALUE, SOIL_COLUMN_LABEL, SOIL_TABLE, SOIL_COLUMN_IN_PLOT); - } - - private List getStrataGEZ() { - return distinctValue(GEZ_COLUMN_VALUE, GEZ_COLUMN_LABEL, GEZ_TABLE, GEZ_COLUMN_IN_PLOT ); - } - - private List distinctValue(String valueColumn, String labelColumn, String table, String plotColumnId) { - - return getJdbcTemplate().query( - "SELECT DISTINCT(" + valueColumn +"),"+ labelColumn + - " FROM " + schemaName + table + ", " + schemaName + PLOT_TABLE + - " WHERE " + PLOT_TABLE + "." + plotColumnId + " = " + table + "." + table + "_id" - , - new RowMapper() { - @Override - public StratumObject mapRow(ResultSet rs, int rowNum) throws SQLException { - - return new StratumObject( rs.getString(valueColumn), rs.getString(labelColumn) ); - } - - }); + @Override + protected File generateFile( List strataData) throws IOException { + File xmlFileDestination = File.createTempFile("landUsesTimeseries", ".xml"); + xmlFileDestination.deleteOnExit(); + XStream xStream = new XStream(); + xStream.alias("LandUse", LUDataPerYear.class); + xStream.alias("Stratum", StratumPerYearData.class); + xStream.alias("Subdivision", LandUseSubdivision.class); + + xStream.setMode(XStream.NO_REFERENCES); + String xmlSchema = xStream.toXML(strataData); + + try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { + byte[] strToBytes = xmlSchema.getBytes(); + outputStream.write(strToBytes); + } catch (Exception e) { + logger.error("Error saving data to file", e); + } + + return xmlFileDestination; } - } From 9aa73628edbf0140459bc7424f85b00d4b5297d9 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:11 +0100 Subject: [PATCH 1447/1620] New translations IPCCDataExportTimeSeriesXML.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 160 +++--------------- 1 file changed, 26 insertions(+), 134 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index c94c09f2e8..60af2b664f 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,123 +1,23 @@ package org.openforis.collect.earth.ipcc; import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.ArrayList; import java.util.List; -import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.RDBConnector; -import org.openforis.collect.earth.app.service.RegionCalculationUtils; -import org.openforis.collect.earth.app.service.SchemaService; import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; -import org.openforis.collect.earth.ipcc.model.StratumObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Component; -@Component -public abstract class IPCCDataExportTimeSeries extends RDBConnector { - - public static final String CLIMATE_COLUMN = "climate"; - public static final String GEZ_COLUMN = "gez"; - public static final String SOIL_COLUMN = "soil"; - - public static final String CLIMATE_COLUMN_VALUE = "climate_zones"; - public static final String CLIMATE_TABLE = CLIMATE_COLUMN_VALUE + "_code"; - public static final String CLIMATE_COLUMN_LABEL = CLIMATE_COLUMN_VALUE + "_label"; - public static final String CLIMATE_COLUMN_ID = CLIMATE_COLUMN_VALUE + "_code_id"; - public static final String CLIMATE_COLUMN_IN_PLOT = "climate_code_id"; - - public static final String GEZ_COLUMN_VALUE = "ecological_zones"; - public static final String GEZ_TABLE = GEZ_COLUMN_VALUE + "_code"; - public static final String GEZ_COLUMN_LABEL = GEZ_COLUMN_VALUE + "_label"; - public static final String GEZ_COLUMN_ID = GEZ_COLUMN_VALUE + "_code_id"; - public static final String GEZ_COLUMN_IN_PLOT = "gez_code_id"; - - - public static final String SOIL_COLUMN_VALUE = "soil_types"; - public static final String SOIL_TABLE = SOIL_COLUMN_VALUE + "_code"; - public static final String SOIL_COLUMN_LABEL = SOIL_COLUMN_VALUE + "_label"; - public static final String SOIL_COLUMN_ID = SOIL_COLUMN_VALUE + "_code_id"; - public static final String SOIL_COLUMN_IN_PLOT = "soil_code_id"; - - private String schemaName; - public static final String PLOT_TABLE = "plot"; - public static final String PLOT_ID = "id"; - - Logger logger = LoggerFactory.getLogger(IPCCDataExportTimeSeries.class); - - @Autowired - private SchemaService schemaService; - - - public IPCCDataExportTimeSeries() { - setExportTypeUsed(ExportType.IPCC); - } - - public File generateTimeseriesData( int startYear, int endYear ) throws IOException { - - schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - - List strataClimate = getStrataClimate(); - List strataSoil = getStrataSoil(); - List strataGEZ = getStrataGEZ(); - - List strataData = new ArrayList(); - - for (int year = startYear; year < endYear; year++) { - for (StratumObject gez : strataGEZ) { - for (StratumObject climate : strataClimate) { - for (StratumObject soil : strataSoil) { - E yearLuData = (E) generateLUTimeseriesForStrata(year, gez, climate, soil); - if (yearLuData != null) - strataData.add(yearLuData); - } - } - } - } - - return generateFile( strataData); - - } - - protected abstract File generateFile( List strataData) throws IOException; - - private StratumPerYearData generateLUTimeseriesForStrata(int year, StratumObject gez, StratumObject climate,StratumObject soil) { +import com.thoughtworks.xstream.XStream; - List luData = getJdbcTemplate().query( - - "select " + IPCCSurveyAdapter.getIpccCategoryAttrName(year) - + ", " + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1) + ", sum( " - + RegionCalculationUtils.EXPANSION_FACTOR + ")" - + " from " + schemaName + PLOT_TABLE - + " where " - + CLIMATE_COLUMN + " = " + climate.getValue() + " and " + SOIL_COLUMN + " = " + soil.getValue() + " and " + GEZ_COLUMN + " = " + gez.getValue() - + " GROUP BY " - + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + "," - + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1), - - getRowMapper() - - ); - - if (luData.size() == 0) { // No LU data for the climate, soil, gez combination - return null; - } - - StratumPerYearData strataPerYearData = new StratumPerYearData(year, climate.getLabel(), soil.getLabel(), gez.getLabel()); - strataPerYearData.setLuData(luData); - return strataPerYearData; - } +@Component +public class IPCCDataExportTimeSeriesXML extends IPCCDataExportTimeSeries { + @Override protected RowMapper getRowMapper() { return new RowMapper() { @Override @@ -137,33 +37,25 @@ public abstract class IPCCDataExportTimeSeries extends RDBConnector { }; } - private List getStrataClimate() { - return distinctValue(CLIMATE_COLUMN_VALUE, CLIMATE_COLUMN_LABEL, CLIMATE_TABLE, CLIMATE_COLUMN_IN_PLOT); - } - - private List getStrataSoil() { - return distinctValue(SOIL_COLUMN_VALUE, SOIL_COLUMN_LABEL, SOIL_TABLE, SOIL_COLUMN_IN_PLOT); - } - - private List getStrataGEZ() { - return distinctValue(GEZ_COLUMN_VALUE, GEZ_COLUMN_LABEL, GEZ_TABLE, GEZ_COLUMN_IN_PLOT ); - } - - private List distinctValue(String valueColumn, String labelColumn, String table, String plotColumnId) { - - return getJdbcTemplate().query( - "SELECT DISTINCT(" + valueColumn +"),"+ labelColumn + - " FROM " + schemaName + table + ", " + schemaName + PLOT_TABLE + - " WHERE " + PLOT_TABLE + "." + plotColumnId + " = " + table + "." + table + "_id" - , - new RowMapper() { - @Override - public StratumObject mapRow(ResultSet rs, int rowNum) throws SQLException { - - return new StratumObject( rs.getString(valueColumn), rs.getString(labelColumn) ); - } - - }); + @Override + protected File generateFile( List strataData) throws IOException { + File xmlFileDestination = File.createTempFile("landUsesTimeseries", ".xml"); + xmlFileDestination.deleteOnExit(); + XStream xStream = new XStream(); + xStream.alias("LandUse", LUDataPerYear.class); + xStream.alias("Stratum", StratumPerYearData.class); + xStream.alias("Subdivision", LandUseSubdivision.class); + + xStream.setMode(XStream.NO_REFERENCES); + String xmlSchema = xStream.toXML(strataData); + + try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { + byte[] strToBytes = xmlSchema.getBytes(); + outputStream.write(strToBytes); + } catch (Exception e) { + logger.error("Error saving data to file", e); + } + + return xmlFileDestination; } - } From 34ef58896155011bb14bd4526b4b6c1c1956bf3b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:12 +0100 Subject: [PATCH 1448/1620] New translations IPCCDataExportTimeSeriesXML.java (English) --- .../earth/app/view/Messages_en.properties | 160 +++--------------- 1 file changed, 26 insertions(+), 134 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index c94c09f2e8..60af2b664f 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,123 +1,23 @@ package org.openforis.collect.earth.ipcc; import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.ArrayList; import java.util.List; -import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.RDBConnector; -import org.openforis.collect.earth.app.service.RegionCalculationUtils; -import org.openforis.collect.earth.app.service.SchemaService; import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; -import org.openforis.collect.earth.ipcc.model.StratumObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Component; -@Component -public abstract class IPCCDataExportTimeSeries extends RDBConnector { - - public static final String CLIMATE_COLUMN = "climate"; - public static final String GEZ_COLUMN = "gez"; - public static final String SOIL_COLUMN = "soil"; - - public static final String CLIMATE_COLUMN_VALUE = "climate_zones"; - public static final String CLIMATE_TABLE = CLIMATE_COLUMN_VALUE + "_code"; - public static final String CLIMATE_COLUMN_LABEL = CLIMATE_COLUMN_VALUE + "_label"; - public static final String CLIMATE_COLUMN_ID = CLIMATE_COLUMN_VALUE + "_code_id"; - public static final String CLIMATE_COLUMN_IN_PLOT = "climate_code_id"; - - public static final String GEZ_COLUMN_VALUE = "ecological_zones"; - public static final String GEZ_TABLE = GEZ_COLUMN_VALUE + "_code"; - public static final String GEZ_COLUMN_LABEL = GEZ_COLUMN_VALUE + "_label"; - public static final String GEZ_COLUMN_ID = GEZ_COLUMN_VALUE + "_code_id"; - public static final String GEZ_COLUMN_IN_PLOT = "gez_code_id"; - - - public static final String SOIL_COLUMN_VALUE = "soil_types"; - public static final String SOIL_TABLE = SOIL_COLUMN_VALUE + "_code"; - public static final String SOIL_COLUMN_LABEL = SOIL_COLUMN_VALUE + "_label"; - public static final String SOIL_COLUMN_ID = SOIL_COLUMN_VALUE + "_code_id"; - public static final String SOIL_COLUMN_IN_PLOT = "soil_code_id"; - - private String schemaName; - public static final String PLOT_TABLE = "plot"; - public static final String PLOT_ID = "id"; - - Logger logger = LoggerFactory.getLogger(IPCCDataExportTimeSeries.class); - - @Autowired - private SchemaService schemaService; - - - public IPCCDataExportTimeSeries() { - setExportTypeUsed(ExportType.IPCC); - } - - public File generateTimeseriesData( int startYear, int endYear ) throws IOException { - - schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - - List strataClimate = getStrataClimate(); - List strataSoil = getStrataSoil(); - List strataGEZ = getStrataGEZ(); - - List strataData = new ArrayList(); - - for (int year = startYear; year < endYear; year++) { - for (StratumObject gez : strataGEZ) { - for (StratumObject climate : strataClimate) { - for (StratumObject soil : strataSoil) { - E yearLuData = (E) generateLUTimeseriesForStrata(year, gez, climate, soil); - if (yearLuData != null) - strataData.add(yearLuData); - } - } - } - } - - return generateFile( strataData); - - } - - protected abstract File generateFile( List strataData) throws IOException; - - private StratumPerYearData generateLUTimeseriesForStrata(int year, StratumObject gez, StratumObject climate,StratumObject soil) { +import com.thoughtworks.xstream.XStream; - List luData = getJdbcTemplate().query( - - "select " + IPCCSurveyAdapter.getIpccCategoryAttrName(year) - + ", " + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1) + ", sum( " - + RegionCalculationUtils.EXPANSION_FACTOR + ")" - + " from " + schemaName + PLOT_TABLE - + " where " - + CLIMATE_COLUMN + " = " + climate.getValue() + " and " + SOIL_COLUMN + " = " + soil.getValue() + " and " + GEZ_COLUMN + " = " + gez.getValue() - + " GROUP BY " - + IPCCSurveyAdapter.getIpccCategoryAttrName(year) + "," - + IPCCSurveyAdapter.getIpccCategoryAttrName(year + 1) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year) + "," - + IPCCSurveyAdapter.getIpccSubdivisionAttrName(year + 1), - - getRowMapper() - - ); - - if (luData.size() == 0) { // No LU data for the climate, soil, gez combination - return null; - } - - StratumPerYearData strataPerYearData = new StratumPerYearData(year, climate.getLabel(), soil.getLabel(), gez.getLabel()); - strataPerYearData.setLuData(luData); - return strataPerYearData; - } +@Component +public class IPCCDataExportTimeSeriesXML extends IPCCDataExportTimeSeries { + @Override protected RowMapper getRowMapper() { return new RowMapper() { @Override @@ -137,33 +37,25 @@ public abstract class IPCCDataExportTimeSeries extends RDBConnector { }; } - private List getStrataClimate() { - return distinctValue(CLIMATE_COLUMN_VALUE, CLIMATE_COLUMN_LABEL, CLIMATE_TABLE, CLIMATE_COLUMN_IN_PLOT); - } - - private List getStrataSoil() { - return distinctValue(SOIL_COLUMN_VALUE, SOIL_COLUMN_LABEL, SOIL_TABLE, SOIL_COLUMN_IN_PLOT); - } - - private List getStrataGEZ() { - return distinctValue(GEZ_COLUMN_VALUE, GEZ_COLUMN_LABEL, GEZ_TABLE, GEZ_COLUMN_IN_PLOT ); - } - - private List distinctValue(String valueColumn, String labelColumn, String table, String plotColumnId) { - - return getJdbcTemplate().query( - "SELECT DISTINCT(" + valueColumn +"),"+ labelColumn + - " FROM " + schemaName + table + ", " + schemaName + PLOT_TABLE + - " WHERE " + PLOT_TABLE + "." + plotColumnId + " = " + table + "." + table + "_id" - , - new RowMapper() { - @Override - public StratumObject mapRow(ResultSet rs, int rowNum) throws SQLException { - - return new StratumObject( rs.getString(valueColumn), rs.getString(labelColumn) ); - } - - }); + @Override + protected File generateFile( List strataData) throws IOException { + File xmlFileDestination = File.createTempFile("landUsesTimeseries", ".xml"); + xmlFileDestination.deleteOnExit(); + XStream xStream = new XStream(); + xStream.alias("LandUse", LUDataPerYear.class); + xStream.alias("Stratum", StratumPerYearData.class); + xStream.alias("Subdivision", LandUseSubdivision.class); + + xStream.setMode(XStream.NO_REFERENCES); + String xmlSchema = xStream.toXML(strataData); + + try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { + byte[] strToBytes = xmlSchema.getBytes(); + outputStream.write(strToBytes); + } catch (Exception e) { + logger.error("Error saving data to file", e); + } + + return xmlFileDestination; } - } From dea14b74a9272ee6eae31e3d521b74cf5682d8fd Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:13 +0100 Subject: [PATCH 1449/1620] New translations IPCCGenerator.java (Spanish) --- .../earth/app/view/Messages_es.properties | 190 ++++++++++++++---- 1 file changed, 146 insertions(+), 44 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 60af2b664f..4dbb57be78 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,61 +1,163 @@ +/** + * Main class to generate the IPCC Inventory Software compliant file + */ package org.openforis.collect.earth.ipcc; import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; +import java.util.Calendar; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.view.DataFormat; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.app.view.JFileChooserExistsAware; import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.springframework.jdbc.core.RowMapper; +import org.openforis.collect.earth.ipcc.controller.StratumUtils; +import org.openforis.collect.earth.ipcc.view.AssignSubdivisionTypesWizard; +import org.openforis.idm.metamodel.Survey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.thoughtworks.xstream.XStream; - +/** + * @author Alfonso Sanchez-Paus + * + */ @Component -public class IPCCDataExportTimeSeriesXML extends IPCCDataExportTimeSeries { +public class IPCCGenerator { - @Override - protected RowMapper getRowMapper() { - return new RowMapper() { - @Override - public LUDataPerYear mapRow(ResultSet rs, int rowNum) throws SQLException { - - String categoryInitial = rs.getString(1); - String categoryFinal = rs.getString(2); - String subdivInitial = rs.getString(3); - String subdivFinal = rs.getString(4); - - return new LUDataPerYear( - LandUseSubdivisionUtils.getSubdivision(categoryInitial, subdivInitial), - LandUseSubdivisionUtils.getSubdivision(categoryFinal, subdivFinal), - rs.getDouble(5) // area - ); - } - }; + @Autowired + IPCCRDBGenerator ipccRdbGenerator; + + @Autowired + IPCCDataExportTimeSeriesXML ipccDataExportToXML; + + @Autowired + LocalPropertiesService localPropertiesService; + + @Autowired + IPCCDataExportMatrixExcel dataExportMatrixExcel; + + @Autowired + IPCCDataExportMatrixExtendedExcel dataExportMatrixExtendedExcel; + + @Autowired + IPCCDataExportLandUnitsCSV dataExportLandUnitsCSV; + + @Autowired + IPCCDataExportPerPlotCSV dataExportPerPlotCSV; + + @Autowired + IPCCLandUses landUses; + + IPCCSurveyAdapter ipccSurveyAdapter; + + Logger logger = LoggerFactory.getLogger( IPCCGenerator.class ); + + public static final int END_YEAR = Calendar.getInstance().get(Calendar.YEAR); // Assume the last year is current year + public static final int START_YEAR = 2000; // Assume start year at 2000 + + public File generateRDB( Survey survey, InfiniteProgressMonitor progressListener) throws IPCCGeneratorException { + + ipccSurveyAdapter = new IPCCSurveyAdapter(); + + // Add attributes for each year containing the LU Category and Subdivision if not present + Survey modifiedSurvey = ipccSurveyAdapter.addIPCCAttributesToSurvey( survey ); + + // Generate Relational Database of the survey data + ipccRdbGenerator.generateRelationalDatabase( modifiedSurvey, progressListener); + + return null; } - @Override - protected File generateFile( List strataData) throws IOException { - File xmlFileDestination = File.createTempFile("landUsesTimeseries", ".xml"); - xmlFileDestination.deleteOnExit(); - XStream xStream = new XStream(); - xStream.alias("LandUse", LUDataPerYear.class); - xStream.alias("Stratum", StratumPerYearData.class); - xStream.alias("Subdivision", LandUseSubdivision.class); + public void produceOutputs( Survey survey, InfiniteProgressMonitor progressListener ) { - xStream.setMode(XStream.NO_REFERENCES); - String xmlSchema = xStream.toXML(strataData); - - try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { - byte[] strToBytes = xmlSchema.getBytes(); - outputStream.write(strToBytes); - } catch (Exception e) { - logger.error("Error saving data to file", e); + progressListener.hide(); + + // Assign Management types to the Land Use Subdivisions found in the survey data + AssignSubdivisionTypesWizard wizard = new AssignSubdivisionTypesWizard(); + wizard.initializeTypes(landUses.getLandUseSubdivisions()); + + if( !wizard.isWizardFinished() ) { + logger.info( "The user closed the wizard without finishing assigning management types"); + return; } + + File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.GHGI_ZIP_FILE, true, false, "LandUseForGHGi", localPropertiesService, null); + + if( exportToFile== null || exportToFile.length != 1 ) { + logger.info("The user should choose a ZIP file to export the results to! No file chosen, aborting the rest of the execution"); + return; + } + + try { + File destinationZip = exportToFile[0]; + + final int STEPS = 7; + int currentStep = 1; + + progressListener.show(); + + progressListener.updateProgress(currentStep++, STEPS, "Generating CSV aggregated time-series" ); + // Extract data from the Relational Database into an excel file of transition Matrixes per year + File landUnitsCSVFile =dataExportLandUnitsCSV.generateTimeseriesData(START_YEAR, END_YEAR); + if( progressListener.isUserCancelled() ) return; - return xmlFileDestination; + progressListener.updateProgress(currentStep++, STEPS, "Generating CSV per plot time-series" ); + // Extract data from the Relational Database into an excel file of transition Matrixes per year + File perPlotCSVFile =dataExportPerPlotCSV.generateTimeseriesData(START_YEAR, END_YEAR); + if( progressListener.isUserCancelled() ) return; + + progressListener.updateProgress(currentStep++, STEPS, "Generating survey setup files" ); + // Generate list of subdivisions in survey + File subdivisionsFile = LandUseSubdivisionUtils.getSubdivisionsXML(); + File climateZones = StratumUtils.getClimateZonesXML( survey ); + File ecologicalZones = StratumUtils.getEcologicalZonesXML( survey ); + File soilTypes = StratumUtils.getSoilTypesXML( survey ); + if( progressListener.isUserCancelled() ) return; + + progressListener.updateProgress(currentStep++, STEPS, "Generating XML timeseries file" ); + // Extract data from the Relational Database into an XML File with information per year + File timeseriesXMLFile =ipccDataExportToXML.generateTimeseriesData(IPCCGenerator.START_YEAR, IPCCGenerator.END_YEAR ); + if( progressListener.isUserCancelled() ) return; + + progressListener.updateProgress(currentStep++, STEPS, "Generating Excel LU Matrixes per year" ); + // Extract data from the Relational Database into an excel file of transition Matrixes per year + File matrixXLSFile =dataExportMatrixExcel.generateTimeseriesData(START_YEAR, END_YEAR); + if( progressListener.isUserCancelled() ) return; + + progressListener.updateProgress(currentStep++, STEPS, "Generating Excel LU Matrixes per year STRATIFIED" ); + // Extract data from the Relational Database into an excel file of transition Matrixes per year + File matrixXLSExtendedFile =dataExportMatrixExtendedExcel.generateTimeseriesData(START_YEAR, END_YEAR); + if( progressListener.isUserCancelled() ) return; + + try { + progressListener.updateProgress(currentStep++, STEPS, "Compressing files into selected destination" ); + CollectEarthUtils.addFileToZip( destinationZip , timeseriesXMLFile, "LU_Timeseries.xml"); + CollectEarthUtils.addFileToZip( destinationZip , matrixXLSFile, "LU_Matrixes.xls"); + CollectEarthUtils.addFileToZip( destinationZip , matrixXLSExtendedFile, "LU_Matrixes_stratified.xls"); + CollectEarthUtils.addFileToZip( destinationZip , subdivisionsFile, "ConfigLandUseSubdivisions.xml"); + CollectEarthUtils.addFileToZip( destinationZip , climateZones, "ConfigClimateZones.xml"); + CollectEarthUtils.addFileToZip( destinationZip , ecologicalZones, "ConfigEclogicalZones.xml"); + CollectEarthUtils.addFileToZip( destinationZip , soilTypes, "ConfigSoilTypes.xml"); + CollectEarthUtils.addFileToZip( destinationZip , landUnitsCSVFile, "LU_Timeseries_grouped.csv"); + CollectEarthUtils.addFileToZip( destinationZip , perPlotCSVFile, "LU_Timeseries_per_plot.csv"); + progressListener.hide(); + } catch (IOException e) { + logger.error("Error when creating ZIP file with timeseries content " + destinationZip, e); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (Exception e) { + logger.error("Error when zipping the timeseries content into " + destinationZip, e); //$NON-NLS-1$ //$NON-NLS-2$ + } + + // Open the ZIP file automatically to inspect the output + CollectEarthUtils.openFile( destinationZip ); + + } catch (IOException e) { + logger.error("Error generating file", e); + } + } + } From eaffadaedf2734dbf09865a8d640f551b872764b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:14 +0100 Subject: [PATCH 1450/1620] New translations IPCCRDBGenerator.java (French) --- .../earth/app/view/Messages_fr.properties | 83 +++++++------------ 1 file changed, 32 insertions(+), 51 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 60af2b664f..d10cc6fb23 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,61 +1,42 @@ package org.openforis.collect.earth.ipcc; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; +import javax.swing.SwingUtilities; -import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.springframework.jdbc.core.RowMapper; +import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.RDBExporter; +import org.openforis.collect.earth.app.service.RDBPostProcessor; +import org.openforis.collect.earth.app.service.RegionCalculationUtils; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.concurrency.Progress; +import org.openforis.idm.metamodel.Survey; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.thoughtworks.xstream.XStream; - @Component -public class IPCCDataExportTimeSeriesXML extends IPCCDataExportTimeSeries { - - @Override - protected RowMapper getRowMapper() { - return new RowMapper() { - @Override - public LUDataPerYear mapRow(ResultSet rs, int rowNum) throws SQLException { - - String categoryInitial = rs.getString(1); - String categoryFinal = rs.getString(2); - String subdivInitial = rs.getString(3); - String subdivFinal = rs.getString(4); - - return new LUDataPerYear( - LandUseSubdivisionUtils.getSubdivision(categoryInitial, subdivInitial), - LandUseSubdivisionUtils.getSubdivision(categoryFinal, subdivFinal), - rs.getDouble(5) // area - ); - } - }; +public class IPCCRDBGenerator { + + @Autowired + RDBExporter rdbExporter; + + @Autowired + private RegionCalculationUtils regionCalculation; + + public void generateRelationalDatabase(Survey modifiedSurvey, InfiniteProgressMonitor infiniteProgressMonitor) { + RDBPostProcessor ipccCallback = postProcessIpccData(); + rdbExporter.exportDataToRDB(modifiedSurvey, ExportType.IPCC, infiniteProgressMonitor, ipccCallback); } - @Override - protected File generateFile( List strataData) throws IOException { - File xmlFileDestination = File.createTempFile("landUsesTimeseries", ".xml"); - xmlFileDestination.deleteOnExit(); - XStream xStream = new XStream(); - xStream.alias("LandUse", LUDataPerYear.class); - xStream.alias("Stratum", StratumPerYearData.class); - xStream.alias("Subdivision", LandUseSubdivision.class); - - xStream.setMode(XStream.NO_REFERENCES); - String xmlSchema = xStream.toXML(strataData); - - try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { - byte[] strToBytes = xmlSchema.getBytes(); - outputStream.write(strToBytes); - } catch (Exception e) { - logger.error("Error saving data to file", e); - } - - return xmlFileDestination; + private RDBPostProcessor postProcessIpccData() { + // return the implementation of a RDBPostProcessor interface (the callback when the initial RDB export is done so that we can add expansion factors ) + return (progressMonitor) -> { + + SwingUtilities.invokeLater( () -> progressMonitor.setMessage("Calculating expansion factors") ); + progressMonitor.progressMade(new Progress(0, 100)); + regionCalculation.handleRegionCalculation( ExportType.IPCC, rdbExporter.getJdbcTemplate() ); + progressMonitor.progressMade(new Progress(100, 100)); + + }; } + + } From b7fbb2f599b9b17ae512fe6ff447745e73acaa04 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:15 +0100 Subject: [PATCH 1451/1620] New translations IPCCGenerator.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 190 ++++++++++++++---- 1 file changed, 146 insertions(+), 44 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 60af2b664f..4dbb57be78 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,61 +1,163 @@ +/** + * Main class to generate the IPCC Inventory Software compliant file + */ package org.openforis.collect.earth.ipcc; import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; +import java.util.Calendar; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.view.DataFormat; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.app.view.JFileChooserExistsAware; import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.springframework.jdbc.core.RowMapper; +import org.openforis.collect.earth.ipcc.controller.StratumUtils; +import org.openforis.collect.earth.ipcc.view.AssignSubdivisionTypesWizard; +import org.openforis.idm.metamodel.Survey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.thoughtworks.xstream.XStream; - +/** + * @author Alfonso Sanchez-Paus + * + */ @Component -public class IPCCDataExportTimeSeriesXML extends IPCCDataExportTimeSeries { +public class IPCCGenerator { - @Override - protected RowMapper getRowMapper() { - return new RowMapper() { - @Override - public LUDataPerYear mapRow(ResultSet rs, int rowNum) throws SQLException { - - String categoryInitial = rs.getString(1); - String categoryFinal = rs.getString(2); - String subdivInitial = rs.getString(3); - String subdivFinal = rs.getString(4); - - return new LUDataPerYear( - LandUseSubdivisionUtils.getSubdivision(categoryInitial, subdivInitial), - LandUseSubdivisionUtils.getSubdivision(categoryFinal, subdivFinal), - rs.getDouble(5) // area - ); - } - }; + @Autowired + IPCCRDBGenerator ipccRdbGenerator; + + @Autowired + IPCCDataExportTimeSeriesXML ipccDataExportToXML; + + @Autowired + LocalPropertiesService localPropertiesService; + + @Autowired + IPCCDataExportMatrixExcel dataExportMatrixExcel; + + @Autowired + IPCCDataExportMatrixExtendedExcel dataExportMatrixExtendedExcel; + + @Autowired + IPCCDataExportLandUnitsCSV dataExportLandUnitsCSV; + + @Autowired + IPCCDataExportPerPlotCSV dataExportPerPlotCSV; + + @Autowired + IPCCLandUses landUses; + + IPCCSurveyAdapter ipccSurveyAdapter; + + Logger logger = LoggerFactory.getLogger( IPCCGenerator.class ); + + public static final int END_YEAR = Calendar.getInstance().get(Calendar.YEAR); // Assume the last year is current year + public static final int START_YEAR = 2000; // Assume start year at 2000 + + public File generateRDB( Survey survey, InfiniteProgressMonitor progressListener) throws IPCCGeneratorException { + + ipccSurveyAdapter = new IPCCSurveyAdapter(); + + // Add attributes for each year containing the LU Category and Subdivision if not present + Survey modifiedSurvey = ipccSurveyAdapter.addIPCCAttributesToSurvey( survey ); + + // Generate Relational Database of the survey data + ipccRdbGenerator.generateRelationalDatabase( modifiedSurvey, progressListener); + + return null; } - @Override - protected File generateFile( List strataData) throws IOException { - File xmlFileDestination = File.createTempFile("landUsesTimeseries", ".xml"); - xmlFileDestination.deleteOnExit(); - XStream xStream = new XStream(); - xStream.alias("LandUse", LUDataPerYear.class); - xStream.alias("Stratum", StratumPerYearData.class); - xStream.alias("Subdivision", LandUseSubdivision.class); + public void produceOutputs( Survey survey, InfiniteProgressMonitor progressListener ) { - xStream.setMode(XStream.NO_REFERENCES); - String xmlSchema = xStream.toXML(strataData); - - try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { - byte[] strToBytes = xmlSchema.getBytes(); - outputStream.write(strToBytes); - } catch (Exception e) { - logger.error("Error saving data to file", e); + progressListener.hide(); + + // Assign Management types to the Land Use Subdivisions found in the survey data + AssignSubdivisionTypesWizard wizard = new AssignSubdivisionTypesWizard(); + wizard.initializeTypes(landUses.getLandUseSubdivisions()); + + if( !wizard.isWizardFinished() ) { + logger.info( "The user closed the wizard without finishing assigning management types"); + return; } + + File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.GHGI_ZIP_FILE, true, false, "LandUseForGHGi", localPropertiesService, null); + + if( exportToFile== null || exportToFile.length != 1 ) { + logger.info("The user should choose a ZIP file to export the results to! No file chosen, aborting the rest of the execution"); + return; + } + + try { + File destinationZip = exportToFile[0]; + + final int STEPS = 7; + int currentStep = 1; + + progressListener.show(); + + progressListener.updateProgress(currentStep++, STEPS, "Generating CSV aggregated time-series" ); + // Extract data from the Relational Database into an excel file of transition Matrixes per year + File landUnitsCSVFile =dataExportLandUnitsCSV.generateTimeseriesData(START_YEAR, END_YEAR); + if( progressListener.isUserCancelled() ) return; - return xmlFileDestination; + progressListener.updateProgress(currentStep++, STEPS, "Generating CSV per plot time-series" ); + // Extract data from the Relational Database into an excel file of transition Matrixes per year + File perPlotCSVFile =dataExportPerPlotCSV.generateTimeseriesData(START_YEAR, END_YEAR); + if( progressListener.isUserCancelled() ) return; + + progressListener.updateProgress(currentStep++, STEPS, "Generating survey setup files" ); + // Generate list of subdivisions in survey + File subdivisionsFile = LandUseSubdivisionUtils.getSubdivisionsXML(); + File climateZones = StratumUtils.getClimateZonesXML( survey ); + File ecologicalZones = StratumUtils.getEcologicalZonesXML( survey ); + File soilTypes = StratumUtils.getSoilTypesXML( survey ); + if( progressListener.isUserCancelled() ) return; + + progressListener.updateProgress(currentStep++, STEPS, "Generating XML timeseries file" ); + // Extract data from the Relational Database into an XML File with information per year + File timeseriesXMLFile =ipccDataExportToXML.generateTimeseriesData(IPCCGenerator.START_YEAR, IPCCGenerator.END_YEAR ); + if( progressListener.isUserCancelled() ) return; + + progressListener.updateProgress(currentStep++, STEPS, "Generating Excel LU Matrixes per year" ); + // Extract data from the Relational Database into an excel file of transition Matrixes per year + File matrixXLSFile =dataExportMatrixExcel.generateTimeseriesData(START_YEAR, END_YEAR); + if( progressListener.isUserCancelled() ) return; + + progressListener.updateProgress(currentStep++, STEPS, "Generating Excel LU Matrixes per year STRATIFIED" ); + // Extract data from the Relational Database into an excel file of transition Matrixes per year + File matrixXLSExtendedFile =dataExportMatrixExtendedExcel.generateTimeseriesData(START_YEAR, END_YEAR); + if( progressListener.isUserCancelled() ) return; + + try { + progressListener.updateProgress(currentStep++, STEPS, "Compressing files into selected destination" ); + CollectEarthUtils.addFileToZip( destinationZip , timeseriesXMLFile, "LU_Timeseries.xml"); + CollectEarthUtils.addFileToZip( destinationZip , matrixXLSFile, "LU_Matrixes.xls"); + CollectEarthUtils.addFileToZip( destinationZip , matrixXLSExtendedFile, "LU_Matrixes_stratified.xls"); + CollectEarthUtils.addFileToZip( destinationZip , subdivisionsFile, "ConfigLandUseSubdivisions.xml"); + CollectEarthUtils.addFileToZip( destinationZip , climateZones, "ConfigClimateZones.xml"); + CollectEarthUtils.addFileToZip( destinationZip , ecologicalZones, "ConfigEclogicalZones.xml"); + CollectEarthUtils.addFileToZip( destinationZip , soilTypes, "ConfigSoilTypes.xml"); + CollectEarthUtils.addFileToZip( destinationZip , landUnitsCSVFile, "LU_Timeseries_grouped.csv"); + CollectEarthUtils.addFileToZip( destinationZip , perPlotCSVFile, "LU_Timeseries_per_plot.csv"); + progressListener.hide(); + } catch (IOException e) { + logger.error("Error when creating ZIP file with timeseries content " + destinationZip, e); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (Exception e) { + logger.error("Error when zipping the timeseries content into " + destinationZip, e); //$NON-NLS-1$ //$NON-NLS-2$ + } + + // Open the ZIP file automatically to inspect the output + CollectEarthUtils.openFile( destinationZip ); + + } catch (IOException e) { + logger.error("Error generating file", e); + } + } + } From 645be6cf9c09c86c30d9601fde4ce5d7c0d023d3 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:16 +0100 Subject: [PATCH 1452/1620] New translations IPCCGenerator.java (English) --- .../earth/app/view/Messages_en.properties | 190 ++++++++++++++---- 1 file changed, 146 insertions(+), 44 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 60af2b664f..4dbb57be78 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,61 +1,163 @@ +/** + * Main class to generate the IPCC Inventory Software compliant file + */ package org.openforis.collect.earth.ipcc; import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; +import java.util.Calendar; +import org.openforis.collect.earth.app.CollectEarthUtils; +import org.openforis.collect.earth.app.service.LocalPropertiesService; +import org.openforis.collect.earth.app.view.DataFormat; +import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; +import org.openforis.collect.earth.app.view.JFileChooserExistsAware; import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.springframework.jdbc.core.RowMapper; +import org.openforis.collect.earth.ipcc.controller.StratumUtils; +import org.openforis.collect.earth.ipcc.view.AssignSubdivisionTypesWizard; +import org.openforis.idm.metamodel.Survey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.thoughtworks.xstream.XStream; - +/** + * @author Alfonso Sanchez-Paus + * + */ @Component -public class IPCCDataExportTimeSeriesXML extends IPCCDataExportTimeSeries { +public class IPCCGenerator { - @Override - protected RowMapper getRowMapper() { - return new RowMapper() { - @Override - public LUDataPerYear mapRow(ResultSet rs, int rowNum) throws SQLException { - - String categoryInitial = rs.getString(1); - String categoryFinal = rs.getString(2); - String subdivInitial = rs.getString(3); - String subdivFinal = rs.getString(4); - - return new LUDataPerYear( - LandUseSubdivisionUtils.getSubdivision(categoryInitial, subdivInitial), - LandUseSubdivisionUtils.getSubdivision(categoryFinal, subdivFinal), - rs.getDouble(5) // area - ); - } - }; + @Autowired + IPCCRDBGenerator ipccRdbGenerator; + + @Autowired + IPCCDataExportTimeSeriesXML ipccDataExportToXML; + + @Autowired + LocalPropertiesService localPropertiesService; + + @Autowired + IPCCDataExportMatrixExcel dataExportMatrixExcel; + + @Autowired + IPCCDataExportMatrixExtendedExcel dataExportMatrixExtendedExcel; + + @Autowired + IPCCDataExportLandUnitsCSV dataExportLandUnitsCSV; + + @Autowired + IPCCDataExportPerPlotCSV dataExportPerPlotCSV; + + @Autowired + IPCCLandUses landUses; + + IPCCSurveyAdapter ipccSurveyAdapter; + + Logger logger = LoggerFactory.getLogger( IPCCGenerator.class ); + + public static final int END_YEAR = Calendar.getInstance().get(Calendar.YEAR); // Assume the last year is current year + public static final int START_YEAR = 2000; // Assume start year at 2000 + + public File generateRDB( Survey survey, InfiniteProgressMonitor progressListener) throws IPCCGeneratorException { + + ipccSurveyAdapter = new IPCCSurveyAdapter(); + + // Add attributes for each year containing the LU Category and Subdivision if not present + Survey modifiedSurvey = ipccSurveyAdapter.addIPCCAttributesToSurvey( survey ); + + // Generate Relational Database of the survey data + ipccRdbGenerator.generateRelationalDatabase( modifiedSurvey, progressListener); + + return null; } - @Override - protected File generateFile( List strataData) throws IOException { - File xmlFileDestination = File.createTempFile("landUsesTimeseries", ".xml"); - xmlFileDestination.deleteOnExit(); - XStream xStream = new XStream(); - xStream.alias("LandUse", LUDataPerYear.class); - xStream.alias("Stratum", StratumPerYearData.class); - xStream.alias("Subdivision", LandUseSubdivision.class); + public void produceOutputs( Survey survey, InfiniteProgressMonitor progressListener ) { - xStream.setMode(XStream.NO_REFERENCES); - String xmlSchema = xStream.toXML(strataData); - - try (FileOutputStream outputStream = new FileOutputStream( xmlFileDestination ) ) { - byte[] strToBytes = xmlSchema.getBytes(); - outputStream.write(strToBytes); - } catch (Exception e) { - logger.error("Error saving data to file", e); + progressListener.hide(); + + // Assign Management types to the Land Use Subdivisions found in the survey data + AssignSubdivisionTypesWizard wizard = new AssignSubdivisionTypesWizard(); + wizard.initializeTypes(landUses.getLandUseSubdivisions()); + + if( !wizard.isWizardFinished() ) { + logger.info( "The user closed the wizard without finishing assigning management types"); + return; } + + File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.GHGI_ZIP_FILE, true, false, "LandUseForGHGi", localPropertiesService, null); + + if( exportToFile== null || exportToFile.length != 1 ) { + logger.info("The user should choose a ZIP file to export the results to! No file chosen, aborting the rest of the execution"); + return; + } + + try { + File destinationZip = exportToFile[0]; + + final int STEPS = 7; + int currentStep = 1; + + progressListener.show(); + + progressListener.updateProgress(currentStep++, STEPS, "Generating CSV aggregated time-series" ); + // Extract data from the Relational Database into an excel file of transition Matrixes per year + File landUnitsCSVFile =dataExportLandUnitsCSV.generateTimeseriesData(START_YEAR, END_YEAR); + if( progressListener.isUserCancelled() ) return; - return xmlFileDestination; + progressListener.updateProgress(currentStep++, STEPS, "Generating CSV per plot time-series" ); + // Extract data from the Relational Database into an excel file of transition Matrixes per year + File perPlotCSVFile =dataExportPerPlotCSV.generateTimeseriesData(START_YEAR, END_YEAR); + if( progressListener.isUserCancelled() ) return; + + progressListener.updateProgress(currentStep++, STEPS, "Generating survey setup files" ); + // Generate list of subdivisions in survey + File subdivisionsFile = LandUseSubdivisionUtils.getSubdivisionsXML(); + File climateZones = StratumUtils.getClimateZonesXML( survey ); + File ecologicalZones = StratumUtils.getEcologicalZonesXML( survey ); + File soilTypes = StratumUtils.getSoilTypesXML( survey ); + if( progressListener.isUserCancelled() ) return; + + progressListener.updateProgress(currentStep++, STEPS, "Generating XML timeseries file" ); + // Extract data from the Relational Database into an XML File with information per year + File timeseriesXMLFile =ipccDataExportToXML.generateTimeseriesData(IPCCGenerator.START_YEAR, IPCCGenerator.END_YEAR ); + if( progressListener.isUserCancelled() ) return; + + progressListener.updateProgress(currentStep++, STEPS, "Generating Excel LU Matrixes per year" ); + // Extract data from the Relational Database into an excel file of transition Matrixes per year + File matrixXLSFile =dataExportMatrixExcel.generateTimeseriesData(START_YEAR, END_YEAR); + if( progressListener.isUserCancelled() ) return; + + progressListener.updateProgress(currentStep++, STEPS, "Generating Excel LU Matrixes per year STRATIFIED" ); + // Extract data from the Relational Database into an excel file of transition Matrixes per year + File matrixXLSExtendedFile =dataExportMatrixExtendedExcel.generateTimeseriesData(START_YEAR, END_YEAR); + if( progressListener.isUserCancelled() ) return; + + try { + progressListener.updateProgress(currentStep++, STEPS, "Compressing files into selected destination" ); + CollectEarthUtils.addFileToZip( destinationZip , timeseriesXMLFile, "LU_Timeseries.xml"); + CollectEarthUtils.addFileToZip( destinationZip , matrixXLSFile, "LU_Matrixes.xls"); + CollectEarthUtils.addFileToZip( destinationZip , matrixXLSExtendedFile, "LU_Matrixes_stratified.xls"); + CollectEarthUtils.addFileToZip( destinationZip , subdivisionsFile, "ConfigLandUseSubdivisions.xml"); + CollectEarthUtils.addFileToZip( destinationZip , climateZones, "ConfigClimateZones.xml"); + CollectEarthUtils.addFileToZip( destinationZip , ecologicalZones, "ConfigEclogicalZones.xml"); + CollectEarthUtils.addFileToZip( destinationZip , soilTypes, "ConfigSoilTypes.xml"); + CollectEarthUtils.addFileToZip( destinationZip , landUnitsCSVFile, "LU_Timeseries_grouped.csv"); + CollectEarthUtils.addFileToZip( destinationZip , perPlotCSVFile, "LU_Timeseries_per_plot.csv"); + progressListener.hide(); + } catch (IOException e) { + logger.error("Error when creating ZIP file with timeseries content " + destinationZip, e); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (Exception e) { + logger.error("Error when zipping the timeseries content into " + destinationZip, e); //$NON-NLS-1$ //$NON-NLS-2$ + } + + // Open the ZIP file automatically to inspect the output + CollectEarthUtils.openFile( destinationZip ); + + } catch (IOException e) { + logger.error("Error generating file", e); + } + } + } From 0cc1cd8900ac4404da04df463f0609b94a7467fc Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:17 +0100 Subject: [PATCH 1453/1620] New translations IPCCGeneratorException.java (French) --- .../earth/app/view/Messages_fr.properties | 62 ++++++++----------- 1 file changed, 26 insertions(+), 36 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index d10cc6fb23..fed659b97f 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,42 +1,32 @@ package org.openforis.collect.earth.ipcc; -import javax.swing.SwingUtilities; - -import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.RDBExporter; -import org.openforis.collect.earth.app.service.RDBPostProcessor; -import org.openforis.collect.earth.app.service.RegionCalculationUtils; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.concurrency.Progress; -import org.openforis.idm.metamodel.Survey; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public class IPCCRDBGenerator { - - @Autowired - RDBExporter rdbExporter; - - @Autowired - private RegionCalculationUtils regionCalculation; - - public void generateRelationalDatabase(Survey modifiedSurvey, InfiniteProgressMonitor infiniteProgressMonitor) { - RDBPostProcessor ipccCallback = postProcessIpccData(); - rdbExporter.exportDataToRDB(modifiedSurvey, ExportType.IPCC, infiniteProgressMonitor, ipccCallback); +public class IPCCGeneratorException extends RdbExportException { + + /** + * + */ + private static final long serialVersionUID = 6236105290795112340L; + + public IPCCGeneratorException() { + super(); + // TODO Auto-generated constructor stub } - private RDBPostProcessor postProcessIpccData() { - // return the implementation of a RDBPostProcessor interface (the callback when the initial RDB export is done so that we can add expansion factors ) - return (progressMonitor) -> { - - SwingUtilities.invokeLater( () -> progressMonitor.setMessage("Calculating expansion factors") ); - progressMonitor.progressMade(new Progress(0, 100)); - regionCalculation.handleRegionCalculation( ExportType.IPCC, rdbExporter.getJdbcTemplate() ); - progressMonitor.progressMade(new Progress(100, 100)); - - }; + public IPCCGeneratorException(String message, Throwable cause, boolean enableSuppression, + boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); } - - + + public IPCCGeneratorException(String message, Throwable cause) { + super(message, cause); + } + + public IPCCGeneratorException(String message) { + super(message); + } + + public IPCCGeneratorException(Throwable cause) { + super(cause); + } + } From de1b5e1084bb2f77e90446812e94a2b93c78ea63 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:19 +0100 Subject: [PATCH 1454/1620] New translations IPCCGeneratorException.java (Spanish) --- .../earth/app/view/Messages_es.properties | 171 ++---------------- 1 file changed, 20 insertions(+), 151 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 4dbb57be78..fed659b97f 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,163 +1,32 @@ -/** - * Main class to generate the IPCC Inventory Software compliant file - */ package org.openforis.collect.earth.ipcc; -import java.io.File; -import java.io.IOException; -import java.util.Calendar; +public class IPCCGeneratorException extends RdbExportException { -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.view.DataFormat; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.app.view.JFileChooserExistsAware; -import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; -import org.openforis.collect.earth.ipcc.controller.StratumUtils; -import org.openforis.collect.earth.ipcc.view.AssignSubdivisionTypesWizard; -import org.openforis.idm.metamodel.Survey; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; + /** + * + */ + private static final long serialVersionUID = 6236105290795112340L; -/** - * @author Alfonso Sanchez-Paus - * - */ -@Component -public class IPCCGenerator { - - @Autowired - IPCCRDBGenerator ipccRdbGenerator; - - @Autowired - IPCCDataExportTimeSeriesXML ipccDataExportToXML; - - @Autowired - LocalPropertiesService localPropertiesService; - - @Autowired - IPCCDataExportMatrixExcel dataExportMatrixExcel; - - @Autowired - IPCCDataExportMatrixExtendedExcel dataExportMatrixExtendedExcel; - - @Autowired - IPCCDataExportLandUnitsCSV dataExportLandUnitsCSV; - - @Autowired - IPCCDataExportPerPlotCSV dataExportPerPlotCSV; - - @Autowired - IPCCLandUses landUses; - - IPCCSurveyAdapter ipccSurveyAdapter; - - Logger logger = LoggerFactory.getLogger( IPCCGenerator.class ); - - public static final int END_YEAR = Calendar.getInstance().get(Calendar.YEAR); // Assume the last year is current year - public static final int START_YEAR = 2000; // Assume start year at 2000 - - public File generateRDB( Survey survey, InfiniteProgressMonitor progressListener) throws IPCCGeneratorException { - - ipccSurveyAdapter = new IPCCSurveyAdapter(); - - // Add attributes for each year containing the LU Category and Subdivision if not present - Survey modifiedSurvey = ipccSurveyAdapter.addIPCCAttributesToSurvey( survey ); - - // Generate Relational Database of the survey data - ipccRdbGenerator.generateRelationalDatabase( modifiedSurvey, progressListener); - - return null; + public IPCCGeneratorException() { + super(); + // TODO Auto-generated constructor stub } - public void produceOutputs( Survey survey, InfiniteProgressMonitor progressListener ) { - - progressListener.hide(); - - // Assign Management types to the Land Use Subdivisions found in the survey data - AssignSubdivisionTypesWizard wizard = new AssignSubdivisionTypesWizard(); - wizard.initializeTypes(landUses.getLandUseSubdivisions()); - - if( !wizard.isWizardFinished() ) { - logger.info( "The user closed the wizard without finishing assigning management types"); - return; - } - - File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.GHGI_ZIP_FILE, true, false, "LandUseForGHGi", localPropertiesService, null); - - if( exportToFile== null || exportToFile.length != 1 ) { - logger.info("The user should choose a ZIP file to export the results to! No file chosen, aborting the rest of the execution"); - return; - } - - try { - File destinationZip = exportToFile[0]; - - final int STEPS = 7; - int currentStep = 1; - - progressListener.show(); - - progressListener.updateProgress(currentStep++, STEPS, "Generating CSV aggregated time-series" ); - // Extract data from the Relational Database into an excel file of transition Matrixes per year - File landUnitsCSVFile =dataExportLandUnitsCSV.generateTimeseriesData(START_YEAR, END_YEAR); - if( progressListener.isUserCancelled() ) return; - - progressListener.updateProgress(currentStep++, STEPS, "Generating CSV per plot time-series" ); - // Extract data from the Relational Database into an excel file of transition Matrixes per year - File perPlotCSVFile =dataExportPerPlotCSV.generateTimeseriesData(START_YEAR, END_YEAR); - if( progressListener.isUserCancelled() ) return; - - progressListener.updateProgress(currentStep++, STEPS, "Generating survey setup files" ); - // Generate list of subdivisions in survey - File subdivisionsFile = LandUseSubdivisionUtils.getSubdivisionsXML(); - File climateZones = StratumUtils.getClimateZonesXML( survey ); - File ecologicalZones = StratumUtils.getEcologicalZonesXML( survey ); - File soilTypes = StratumUtils.getSoilTypesXML( survey ); - if( progressListener.isUserCancelled() ) return; - - progressListener.updateProgress(currentStep++, STEPS, "Generating XML timeseries file" ); - // Extract data from the Relational Database into an XML File with information per year - File timeseriesXMLFile =ipccDataExportToXML.generateTimeseriesData(IPCCGenerator.START_YEAR, IPCCGenerator.END_YEAR ); - if( progressListener.isUserCancelled() ) return; - - progressListener.updateProgress(currentStep++, STEPS, "Generating Excel LU Matrixes per year" ); - // Extract data from the Relational Database into an excel file of transition Matrixes per year - File matrixXLSFile =dataExportMatrixExcel.generateTimeseriesData(START_YEAR, END_YEAR); - if( progressListener.isUserCancelled() ) return; - - progressListener.updateProgress(currentStep++, STEPS, "Generating Excel LU Matrixes per year STRATIFIED" ); - // Extract data from the Relational Database into an excel file of transition Matrixes per year - File matrixXLSExtendedFile =dataExportMatrixExtendedExcel.generateTimeseriesData(START_YEAR, END_YEAR); - if( progressListener.isUserCancelled() ) return; + public IPCCGeneratorException(String message, Throwable cause, boolean enableSuppression, + boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } - try { - progressListener.updateProgress(currentStep++, STEPS, "Compressing files into selected destination" ); - CollectEarthUtils.addFileToZip( destinationZip , timeseriesXMLFile, "LU_Timeseries.xml"); - CollectEarthUtils.addFileToZip( destinationZip , matrixXLSFile, "LU_Matrixes.xls"); - CollectEarthUtils.addFileToZip( destinationZip , matrixXLSExtendedFile, "LU_Matrixes_stratified.xls"); - CollectEarthUtils.addFileToZip( destinationZip , subdivisionsFile, "ConfigLandUseSubdivisions.xml"); - CollectEarthUtils.addFileToZip( destinationZip , climateZones, "ConfigClimateZones.xml"); - CollectEarthUtils.addFileToZip( destinationZip , ecologicalZones, "ConfigEclogicalZones.xml"); - CollectEarthUtils.addFileToZip( destinationZip , soilTypes, "ConfigSoilTypes.xml"); - CollectEarthUtils.addFileToZip( destinationZip , landUnitsCSVFile, "LU_Timeseries_grouped.csv"); - CollectEarthUtils.addFileToZip( destinationZip , perPlotCSVFile, "LU_Timeseries_per_plot.csv"); - progressListener.hide(); - } catch (IOException e) { - logger.error("Error when creating ZIP file with timeseries content " + destinationZip, e); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (Exception e) { - logger.error("Error when zipping the timeseries content into " + destinationZip, e); //$NON-NLS-1$ //$NON-NLS-2$ - } - - // Open the ZIP file automatically to inspect the output - CollectEarthUtils.openFile( destinationZip ); + public IPCCGeneratorException(String message, Throwable cause) { + super(message, cause); + } - } catch (IOException e) { - logger.error("Error generating file", e); - } + public IPCCGeneratorException(String message) { + super(message); + } + public IPCCGeneratorException(Throwable cause) { + super(cause); } } From 99050175ed540136afd7ad3bf37f0c23ac159565 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:20 +0100 Subject: [PATCH 1455/1620] New translations IPCCGeneratorException.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 171 ++---------------- 1 file changed, 20 insertions(+), 151 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 4dbb57be78..fed659b97f 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,163 +1,32 @@ -/** - * Main class to generate the IPCC Inventory Software compliant file - */ package org.openforis.collect.earth.ipcc; -import java.io.File; -import java.io.IOException; -import java.util.Calendar; +public class IPCCGeneratorException extends RdbExportException { -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.view.DataFormat; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.app.view.JFileChooserExistsAware; -import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; -import org.openforis.collect.earth.ipcc.controller.StratumUtils; -import org.openforis.collect.earth.ipcc.view.AssignSubdivisionTypesWizard; -import org.openforis.idm.metamodel.Survey; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; + /** + * + */ + private static final long serialVersionUID = 6236105290795112340L; -/** - * @author Alfonso Sanchez-Paus - * - */ -@Component -public class IPCCGenerator { - - @Autowired - IPCCRDBGenerator ipccRdbGenerator; - - @Autowired - IPCCDataExportTimeSeriesXML ipccDataExportToXML; - - @Autowired - LocalPropertiesService localPropertiesService; - - @Autowired - IPCCDataExportMatrixExcel dataExportMatrixExcel; - - @Autowired - IPCCDataExportMatrixExtendedExcel dataExportMatrixExtendedExcel; - - @Autowired - IPCCDataExportLandUnitsCSV dataExportLandUnitsCSV; - - @Autowired - IPCCDataExportPerPlotCSV dataExportPerPlotCSV; - - @Autowired - IPCCLandUses landUses; - - IPCCSurveyAdapter ipccSurveyAdapter; - - Logger logger = LoggerFactory.getLogger( IPCCGenerator.class ); - - public static final int END_YEAR = Calendar.getInstance().get(Calendar.YEAR); // Assume the last year is current year - public static final int START_YEAR = 2000; // Assume start year at 2000 - - public File generateRDB( Survey survey, InfiniteProgressMonitor progressListener) throws IPCCGeneratorException { - - ipccSurveyAdapter = new IPCCSurveyAdapter(); - - // Add attributes for each year containing the LU Category and Subdivision if not present - Survey modifiedSurvey = ipccSurveyAdapter.addIPCCAttributesToSurvey( survey ); - - // Generate Relational Database of the survey data - ipccRdbGenerator.generateRelationalDatabase( modifiedSurvey, progressListener); - - return null; + public IPCCGeneratorException() { + super(); + // TODO Auto-generated constructor stub } - public void produceOutputs( Survey survey, InfiniteProgressMonitor progressListener ) { - - progressListener.hide(); - - // Assign Management types to the Land Use Subdivisions found in the survey data - AssignSubdivisionTypesWizard wizard = new AssignSubdivisionTypesWizard(); - wizard.initializeTypes(landUses.getLandUseSubdivisions()); - - if( !wizard.isWizardFinished() ) { - logger.info( "The user closed the wizard without finishing assigning management types"); - return; - } - - File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.GHGI_ZIP_FILE, true, false, "LandUseForGHGi", localPropertiesService, null); - - if( exportToFile== null || exportToFile.length != 1 ) { - logger.info("The user should choose a ZIP file to export the results to! No file chosen, aborting the rest of the execution"); - return; - } - - try { - File destinationZip = exportToFile[0]; - - final int STEPS = 7; - int currentStep = 1; - - progressListener.show(); - - progressListener.updateProgress(currentStep++, STEPS, "Generating CSV aggregated time-series" ); - // Extract data from the Relational Database into an excel file of transition Matrixes per year - File landUnitsCSVFile =dataExportLandUnitsCSV.generateTimeseriesData(START_YEAR, END_YEAR); - if( progressListener.isUserCancelled() ) return; - - progressListener.updateProgress(currentStep++, STEPS, "Generating CSV per plot time-series" ); - // Extract data from the Relational Database into an excel file of transition Matrixes per year - File perPlotCSVFile =dataExportPerPlotCSV.generateTimeseriesData(START_YEAR, END_YEAR); - if( progressListener.isUserCancelled() ) return; - - progressListener.updateProgress(currentStep++, STEPS, "Generating survey setup files" ); - // Generate list of subdivisions in survey - File subdivisionsFile = LandUseSubdivisionUtils.getSubdivisionsXML(); - File climateZones = StratumUtils.getClimateZonesXML( survey ); - File ecologicalZones = StratumUtils.getEcologicalZonesXML( survey ); - File soilTypes = StratumUtils.getSoilTypesXML( survey ); - if( progressListener.isUserCancelled() ) return; - - progressListener.updateProgress(currentStep++, STEPS, "Generating XML timeseries file" ); - // Extract data from the Relational Database into an XML File with information per year - File timeseriesXMLFile =ipccDataExportToXML.generateTimeseriesData(IPCCGenerator.START_YEAR, IPCCGenerator.END_YEAR ); - if( progressListener.isUserCancelled() ) return; - - progressListener.updateProgress(currentStep++, STEPS, "Generating Excel LU Matrixes per year" ); - // Extract data from the Relational Database into an excel file of transition Matrixes per year - File matrixXLSFile =dataExportMatrixExcel.generateTimeseriesData(START_YEAR, END_YEAR); - if( progressListener.isUserCancelled() ) return; - - progressListener.updateProgress(currentStep++, STEPS, "Generating Excel LU Matrixes per year STRATIFIED" ); - // Extract data from the Relational Database into an excel file of transition Matrixes per year - File matrixXLSExtendedFile =dataExportMatrixExtendedExcel.generateTimeseriesData(START_YEAR, END_YEAR); - if( progressListener.isUserCancelled() ) return; + public IPCCGeneratorException(String message, Throwable cause, boolean enableSuppression, + boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } - try { - progressListener.updateProgress(currentStep++, STEPS, "Compressing files into selected destination" ); - CollectEarthUtils.addFileToZip( destinationZip , timeseriesXMLFile, "LU_Timeseries.xml"); - CollectEarthUtils.addFileToZip( destinationZip , matrixXLSFile, "LU_Matrixes.xls"); - CollectEarthUtils.addFileToZip( destinationZip , matrixXLSExtendedFile, "LU_Matrixes_stratified.xls"); - CollectEarthUtils.addFileToZip( destinationZip , subdivisionsFile, "ConfigLandUseSubdivisions.xml"); - CollectEarthUtils.addFileToZip( destinationZip , climateZones, "ConfigClimateZones.xml"); - CollectEarthUtils.addFileToZip( destinationZip , ecologicalZones, "ConfigEclogicalZones.xml"); - CollectEarthUtils.addFileToZip( destinationZip , soilTypes, "ConfigSoilTypes.xml"); - CollectEarthUtils.addFileToZip( destinationZip , landUnitsCSVFile, "LU_Timeseries_grouped.csv"); - CollectEarthUtils.addFileToZip( destinationZip , perPlotCSVFile, "LU_Timeseries_per_plot.csv"); - progressListener.hide(); - } catch (IOException e) { - logger.error("Error when creating ZIP file with timeseries content " + destinationZip, e); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (Exception e) { - logger.error("Error when zipping the timeseries content into " + destinationZip, e); //$NON-NLS-1$ //$NON-NLS-2$ - } - - // Open the ZIP file automatically to inspect the output - CollectEarthUtils.openFile( destinationZip ); + public IPCCGeneratorException(String message, Throwable cause) { + super(message, cause); + } - } catch (IOException e) { - logger.error("Error generating file", e); - } + public IPCCGeneratorException(String message) { + super(message); + } + public IPCCGeneratorException(Throwable cause) { + super(cause); } } From 44fe357195760f174107f822aca1f5ee8204a0b1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:21 +0100 Subject: [PATCH 1456/1620] New translations IPCCGeneratorException.java (English) --- .../earth/app/view/Messages_en.properties | 171 ++---------------- 1 file changed, 20 insertions(+), 151 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 4dbb57be78..fed659b97f 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,163 +1,32 @@ -/** - * Main class to generate the IPCC Inventory Software compliant file - */ package org.openforis.collect.earth.ipcc; -import java.io.File; -import java.io.IOException; -import java.util.Calendar; +public class IPCCGeneratorException extends RdbExportException { -import org.openforis.collect.earth.app.CollectEarthUtils; -import org.openforis.collect.earth.app.service.LocalPropertiesService; -import org.openforis.collect.earth.app.view.DataFormat; -import org.openforis.collect.earth.app.view.InfiniteProgressMonitor; -import org.openforis.collect.earth.app.view.JFileChooserExistsAware; -import org.openforis.collect.earth.ipcc.controller.LandUseSubdivisionUtils; -import org.openforis.collect.earth.ipcc.controller.StratumUtils; -import org.openforis.collect.earth.ipcc.view.AssignSubdivisionTypesWizard; -import org.openforis.idm.metamodel.Survey; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; + /** + * + */ + private static final long serialVersionUID = 6236105290795112340L; -/** - * @author Alfonso Sanchez-Paus - * - */ -@Component -public class IPCCGenerator { - - @Autowired - IPCCRDBGenerator ipccRdbGenerator; - - @Autowired - IPCCDataExportTimeSeriesXML ipccDataExportToXML; - - @Autowired - LocalPropertiesService localPropertiesService; - - @Autowired - IPCCDataExportMatrixExcel dataExportMatrixExcel; - - @Autowired - IPCCDataExportMatrixExtendedExcel dataExportMatrixExtendedExcel; - - @Autowired - IPCCDataExportLandUnitsCSV dataExportLandUnitsCSV; - - @Autowired - IPCCDataExportPerPlotCSV dataExportPerPlotCSV; - - @Autowired - IPCCLandUses landUses; - - IPCCSurveyAdapter ipccSurveyAdapter; - - Logger logger = LoggerFactory.getLogger( IPCCGenerator.class ); - - public static final int END_YEAR = Calendar.getInstance().get(Calendar.YEAR); // Assume the last year is current year - public static final int START_YEAR = 2000; // Assume start year at 2000 - - public File generateRDB( Survey survey, InfiniteProgressMonitor progressListener) throws IPCCGeneratorException { - - ipccSurveyAdapter = new IPCCSurveyAdapter(); - - // Add attributes for each year containing the LU Category and Subdivision if not present - Survey modifiedSurvey = ipccSurveyAdapter.addIPCCAttributesToSurvey( survey ); - - // Generate Relational Database of the survey data - ipccRdbGenerator.generateRelationalDatabase( modifiedSurvey, progressListener); - - return null; + public IPCCGeneratorException() { + super(); + // TODO Auto-generated constructor stub } - public void produceOutputs( Survey survey, InfiniteProgressMonitor progressListener ) { - - progressListener.hide(); - - // Assign Management types to the Land Use Subdivisions found in the survey data - AssignSubdivisionTypesWizard wizard = new AssignSubdivisionTypesWizard(); - wizard.initializeTypes(landUses.getLandUseSubdivisions()); - - if( !wizard.isWizardFinished() ) { - logger.info( "The user closed the wizard without finishing assigning management types"); - return; - } - - File[] exportToFile = JFileChooserExistsAware.getFileChooserResults(DataFormat.GHGI_ZIP_FILE, true, false, "LandUseForGHGi", localPropertiesService, null); - - if( exportToFile== null || exportToFile.length != 1 ) { - logger.info("The user should choose a ZIP file to export the results to! No file chosen, aborting the rest of the execution"); - return; - } - - try { - File destinationZip = exportToFile[0]; - - final int STEPS = 7; - int currentStep = 1; - - progressListener.show(); - - progressListener.updateProgress(currentStep++, STEPS, "Generating CSV aggregated time-series" ); - // Extract data from the Relational Database into an excel file of transition Matrixes per year - File landUnitsCSVFile =dataExportLandUnitsCSV.generateTimeseriesData(START_YEAR, END_YEAR); - if( progressListener.isUserCancelled() ) return; - - progressListener.updateProgress(currentStep++, STEPS, "Generating CSV per plot time-series" ); - // Extract data from the Relational Database into an excel file of transition Matrixes per year - File perPlotCSVFile =dataExportPerPlotCSV.generateTimeseriesData(START_YEAR, END_YEAR); - if( progressListener.isUserCancelled() ) return; - - progressListener.updateProgress(currentStep++, STEPS, "Generating survey setup files" ); - // Generate list of subdivisions in survey - File subdivisionsFile = LandUseSubdivisionUtils.getSubdivisionsXML(); - File climateZones = StratumUtils.getClimateZonesXML( survey ); - File ecologicalZones = StratumUtils.getEcologicalZonesXML( survey ); - File soilTypes = StratumUtils.getSoilTypesXML( survey ); - if( progressListener.isUserCancelled() ) return; - - progressListener.updateProgress(currentStep++, STEPS, "Generating XML timeseries file" ); - // Extract data from the Relational Database into an XML File with information per year - File timeseriesXMLFile =ipccDataExportToXML.generateTimeseriesData(IPCCGenerator.START_YEAR, IPCCGenerator.END_YEAR ); - if( progressListener.isUserCancelled() ) return; - - progressListener.updateProgress(currentStep++, STEPS, "Generating Excel LU Matrixes per year" ); - // Extract data from the Relational Database into an excel file of transition Matrixes per year - File matrixXLSFile =dataExportMatrixExcel.generateTimeseriesData(START_YEAR, END_YEAR); - if( progressListener.isUserCancelled() ) return; - - progressListener.updateProgress(currentStep++, STEPS, "Generating Excel LU Matrixes per year STRATIFIED" ); - // Extract data from the Relational Database into an excel file of transition Matrixes per year - File matrixXLSExtendedFile =dataExportMatrixExtendedExcel.generateTimeseriesData(START_YEAR, END_YEAR); - if( progressListener.isUserCancelled() ) return; + public IPCCGeneratorException(String message, Throwable cause, boolean enableSuppression, + boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } - try { - progressListener.updateProgress(currentStep++, STEPS, "Compressing files into selected destination" ); - CollectEarthUtils.addFileToZip( destinationZip , timeseriesXMLFile, "LU_Timeseries.xml"); - CollectEarthUtils.addFileToZip( destinationZip , matrixXLSFile, "LU_Matrixes.xls"); - CollectEarthUtils.addFileToZip( destinationZip , matrixXLSExtendedFile, "LU_Matrixes_stratified.xls"); - CollectEarthUtils.addFileToZip( destinationZip , subdivisionsFile, "ConfigLandUseSubdivisions.xml"); - CollectEarthUtils.addFileToZip( destinationZip , climateZones, "ConfigClimateZones.xml"); - CollectEarthUtils.addFileToZip( destinationZip , ecologicalZones, "ConfigEclogicalZones.xml"); - CollectEarthUtils.addFileToZip( destinationZip , soilTypes, "ConfigSoilTypes.xml"); - CollectEarthUtils.addFileToZip( destinationZip , landUnitsCSVFile, "LU_Timeseries_grouped.csv"); - CollectEarthUtils.addFileToZip( destinationZip , perPlotCSVFile, "LU_Timeseries_per_plot.csv"); - progressListener.hide(); - } catch (IOException e) { - logger.error("Error when creating ZIP file with timeseries content " + destinationZip, e); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (Exception e) { - logger.error("Error when zipping the timeseries content into " + destinationZip, e); //$NON-NLS-1$ //$NON-NLS-2$ - } - - // Open the ZIP file automatically to inspect the output - CollectEarthUtils.openFile( destinationZip ); + public IPCCGeneratorException(String message, Throwable cause) { + super(message, cause); + } - } catch (IOException e) { - logger.error("Error generating file", e); - } + public IPCCGeneratorException(String message) { + super(message); + } + public IPCCGeneratorException(Throwable cause) { + super(cause); } } From bfd34eed9508fafa6a1d8e6bfa8ee9fccac1a4e3 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:22 +0100 Subject: [PATCH 1457/1620] New translations IPCCLandUses.java (French) --- .../earth/app/view/Messages_fr.properties | 141 +++++++++++++++--- 1 file changed, 123 insertions(+), 18 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index fed659b97f..dd01ad946d 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,32 +1,137 @@ package org.openforis.collect.earth.ipcc; -public class IPCCGeneratorException extends RdbExportException { +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; - /** - * - */ - private static final long serialVersionUID = 6236105290795112340L; +import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.RDBConnector; +import org.openforis.collect.earth.app.service.SchemaService; +import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; +import org.openforis.collect.earth.ipcc.model.CroplandType; +import org.openforis.collect.earth.ipcc.model.ForestSubdivision; +import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; +import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +import org.openforis.collect.earth.ipcc.model.ManagementType; +import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; +import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; +import org.openforis.collect.earth.ipcc.model.SettlementType; +import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Component; - public IPCCGeneratorException() { - super(); - // TODO Auto-generated constructor stub - } +@Component +public class IPCCLandUses extends RDBConnector { + + private String schemaName; + private static final String LU_TABLE = "land_use_use_code"; + private static final String LU_CODE_COLUMN = "land_use_use"; + private static final String LU_SUBDIVISION_TABLE = "land_use_subdivision_code"; + private static final String LU_CATEGORY_ID = LU_TABLE +"_id"; + + Logger logger = LoggerFactory.getLogger(IPCCLandUses.class); + + @Autowired + private SchemaService schemaService; - public IPCCGeneratorException(String message, Throwable cause, boolean enableSuppression, - boolean writableStackTrace) { - super(message, cause, enableSuppression, writableStackTrace); + + public IPCCLandUses() { + setExportTypeUsed(ExportType.IPCC); } - public IPCCGeneratorException(String message, Throwable cause) { - super(message, cause); + public List getLandUseSubdivisions() { + + schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); + + LandUseCategory[] lUseCategories = LandUseCategory.values(); + + List lUseSubdivisions = new ArrayList(); + + for (int i = 0; i < lUseCategories.length; i++) { + + lUseSubdivisions.addAll( getSubdivisions(lUseCategories[i])); + + } + + return lUseSubdivisions; + } - public IPCCGeneratorException(String message) { - super(message); + private Collection> getSubdivisions(LandUseCategory landUseCategory) { + + List> luSubdivisions = getJdbcTemplate().query( + "select " + + "land_use_subdivision,land_use_subdivision_label_fr" + + " from " + schemaName + LU_SUBDIVISION_TABLE + + " where " + LU_CATEGORY_ID + + " IN ( select " + LU_CATEGORY_ID + + " from " + schemaName + LU_TABLE + + " where " + LU_CODE_COLUMN + " = '" + landUseCategory.getCode()+ "'" + + ")" + , + getRowMapper(landUseCategory) + ); + + return luSubdivisions; } - public IPCCGeneratorException(Throwable cause) { - super(cause); + private RowMapper> getRowMapper(LandUseCategory landUseCategory) { + return new RowMapper>() { + @Override + public LandUseSubdivision mapRow(ResultSet rs, int rowNum) throws SQLException { + + String subdivisionCode = rs.getString(1); + String subdivisionName = rs.getString(2); + + switch (landUseCategory.getCode()) { + case "F": + return new ForestSubdivision( + subdivisionCode, + subdivisionName, + ManagementType.MANAGED // Assign default management + ); + case "C": + return new CroplandSubdivision( + subdivisionCode, + subdivisionName, + CroplandType.ANNUAL // Assign default management + ); + case "G": + return new GrasslandSubdivision( + subdivisionCode, + subdivisionName, + ManagementType.MANAGED // Assign default management + ); + case "S": + return new SettlementSubdivision( + subdivisionCode, + subdivisionName, + SettlementType.OTHER // Assign default management + ); + case "W": + return new WetlandSubdivision( + subdivisionCode, + subdivisionName, + ManagementType.UNMANAGED // Assign default management + ); + case "O": + return new OtherlandSubdivision( + subdivisionCode, + subdivisionName, + ManagementType.UNMANAGED // Assign default management + ); + default: + throw new IllegalArgumentException("Unknown code " + landUseCategory.getCode() ); + } + + } + }; } } From 0a43b0108a1cd7abf52471eff1a9eae9a39bbf34 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:23 +0100 Subject: [PATCH 1458/1620] New translations IPCCLandUses.java (Spanish) --- .../earth/app/view/Messages_es.properties | 141 +++++++++++++++--- 1 file changed, 123 insertions(+), 18 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index fed659b97f..dd01ad946d 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,32 +1,137 @@ package org.openforis.collect.earth.ipcc; -public class IPCCGeneratorException extends RdbExportException { +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; - /** - * - */ - private static final long serialVersionUID = 6236105290795112340L; +import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.RDBConnector; +import org.openforis.collect.earth.app.service.SchemaService; +import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; +import org.openforis.collect.earth.ipcc.model.CroplandType; +import org.openforis.collect.earth.ipcc.model.ForestSubdivision; +import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; +import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +import org.openforis.collect.earth.ipcc.model.ManagementType; +import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; +import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; +import org.openforis.collect.earth.ipcc.model.SettlementType; +import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Component; - public IPCCGeneratorException() { - super(); - // TODO Auto-generated constructor stub - } +@Component +public class IPCCLandUses extends RDBConnector { + + private String schemaName; + private static final String LU_TABLE = "land_use_use_code"; + private static final String LU_CODE_COLUMN = "land_use_use"; + private static final String LU_SUBDIVISION_TABLE = "land_use_subdivision_code"; + private static final String LU_CATEGORY_ID = LU_TABLE +"_id"; + + Logger logger = LoggerFactory.getLogger(IPCCLandUses.class); + + @Autowired + private SchemaService schemaService; - public IPCCGeneratorException(String message, Throwable cause, boolean enableSuppression, - boolean writableStackTrace) { - super(message, cause, enableSuppression, writableStackTrace); + + public IPCCLandUses() { + setExportTypeUsed(ExportType.IPCC); } - public IPCCGeneratorException(String message, Throwable cause) { - super(message, cause); + public List getLandUseSubdivisions() { + + schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); + + LandUseCategory[] lUseCategories = LandUseCategory.values(); + + List lUseSubdivisions = new ArrayList(); + + for (int i = 0; i < lUseCategories.length; i++) { + + lUseSubdivisions.addAll( getSubdivisions(lUseCategories[i])); + + } + + return lUseSubdivisions; + } - public IPCCGeneratorException(String message) { - super(message); + private Collection> getSubdivisions(LandUseCategory landUseCategory) { + + List> luSubdivisions = getJdbcTemplate().query( + "select " + + "land_use_subdivision,land_use_subdivision_label_fr" + + " from " + schemaName + LU_SUBDIVISION_TABLE + + " where " + LU_CATEGORY_ID + + " IN ( select " + LU_CATEGORY_ID + + " from " + schemaName + LU_TABLE + + " where " + LU_CODE_COLUMN + " = '" + landUseCategory.getCode()+ "'" + + ")" + , + getRowMapper(landUseCategory) + ); + + return luSubdivisions; } - public IPCCGeneratorException(Throwable cause) { - super(cause); + private RowMapper> getRowMapper(LandUseCategory landUseCategory) { + return new RowMapper>() { + @Override + public LandUseSubdivision mapRow(ResultSet rs, int rowNum) throws SQLException { + + String subdivisionCode = rs.getString(1); + String subdivisionName = rs.getString(2); + + switch (landUseCategory.getCode()) { + case "F": + return new ForestSubdivision( + subdivisionCode, + subdivisionName, + ManagementType.MANAGED // Assign default management + ); + case "C": + return new CroplandSubdivision( + subdivisionCode, + subdivisionName, + CroplandType.ANNUAL // Assign default management + ); + case "G": + return new GrasslandSubdivision( + subdivisionCode, + subdivisionName, + ManagementType.MANAGED // Assign default management + ); + case "S": + return new SettlementSubdivision( + subdivisionCode, + subdivisionName, + SettlementType.OTHER // Assign default management + ); + case "W": + return new WetlandSubdivision( + subdivisionCode, + subdivisionName, + ManagementType.UNMANAGED // Assign default management + ); + case "O": + return new OtherlandSubdivision( + subdivisionCode, + subdivisionName, + ManagementType.UNMANAGED // Assign default management + ); + default: + throw new IllegalArgumentException("Unknown code " + landUseCategory.getCode() ); + } + + } + }; } } From bd22693ce4e426af50f6dd73f493b9258ebd7bda Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:24 +0100 Subject: [PATCH 1459/1620] New translations IPCCLandUses.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 141 +++++++++++++++--- 1 file changed, 123 insertions(+), 18 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index fed659b97f..dd01ad946d 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,32 +1,137 @@ package org.openforis.collect.earth.ipcc; -public class IPCCGeneratorException extends RdbExportException { +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; - /** - * - */ - private static final long serialVersionUID = 6236105290795112340L; +import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.RDBConnector; +import org.openforis.collect.earth.app.service.SchemaService; +import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; +import org.openforis.collect.earth.ipcc.model.CroplandType; +import org.openforis.collect.earth.ipcc.model.ForestSubdivision; +import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; +import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +import org.openforis.collect.earth.ipcc.model.ManagementType; +import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; +import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; +import org.openforis.collect.earth.ipcc.model.SettlementType; +import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Component; - public IPCCGeneratorException() { - super(); - // TODO Auto-generated constructor stub - } +@Component +public class IPCCLandUses extends RDBConnector { + + private String schemaName; + private static final String LU_TABLE = "land_use_use_code"; + private static final String LU_CODE_COLUMN = "land_use_use"; + private static final String LU_SUBDIVISION_TABLE = "land_use_subdivision_code"; + private static final String LU_CATEGORY_ID = LU_TABLE +"_id"; + + Logger logger = LoggerFactory.getLogger(IPCCLandUses.class); + + @Autowired + private SchemaService schemaService; - public IPCCGeneratorException(String message, Throwable cause, boolean enableSuppression, - boolean writableStackTrace) { - super(message, cause, enableSuppression, writableStackTrace); + + public IPCCLandUses() { + setExportTypeUsed(ExportType.IPCC); } - public IPCCGeneratorException(String message, Throwable cause) { - super(message, cause); + public List getLandUseSubdivisions() { + + schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); + + LandUseCategory[] lUseCategories = LandUseCategory.values(); + + List lUseSubdivisions = new ArrayList(); + + for (int i = 0; i < lUseCategories.length; i++) { + + lUseSubdivisions.addAll( getSubdivisions(lUseCategories[i])); + + } + + return lUseSubdivisions; + } - public IPCCGeneratorException(String message) { - super(message); + private Collection> getSubdivisions(LandUseCategory landUseCategory) { + + List> luSubdivisions = getJdbcTemplate().query( + "select " + + "land_use_subdivision,land_use_subdivision_label_fr" + + " from " + schemaName + LU_SUBDIVISION_TABLE + + " where " + LU_CATEGORY_ID + + " IN ( select " + LU_CATEGORY_ID + + " from " + schemaName + LU_TABLE + + " where " + LU_CODE_COLUMN + " = '" + landUseCategory.getCode()+ "'" + + ")" + , + getRowMapper(landUseCategory) + ); + + return luSubdivisions; } - public IPCCGeneratorException(Throwable cause) { - super(cause); + private RowMapper> getRowMapper(LandUseCategory landUseCategory) { + return new RowMapper>() { + @Override + public LandUseSubdivision mapRow(ResultSet rs, int rowNum) throws SQLException { + + String subdivisionCode = rs.getString(1); + String subdivisionName = rs.getString(2); + + switch (landUseCategory.getCode()) { + case "F": + return new ForestSubdivision( + subdivisionCode, + subdivisionName, + ManagementType.MANAGED // Assign default management + ); + case "C": + return new CroplandSubdivision( + subdivisionCode, + subdivisionName, + CroplandType.ANNUAL // Assign default management + ); + case "G": + return new GrasslandSubdivision( + subdivisionCode, + subdivisionName, + ManagementType.MANAGED // Assign default management + ); + case "S": + return new SettlementSubdivision( + subdivisionCode, + subdivisionName, + SettlementType.OTHER // Assign default management + ); + case "W": + return new WetlandSubdivision( + subdivisionCode, + subdivisionName, + ManagementType.UNMANAGED // Assign default management + ); + case "O": + return new OtherlandSubdivision( + subdivisionCode, + subdivisionName, + ManagementType.UNMANAGED // Assign default management + ); + default: + throw new IllegalArgumentException("Unknown code " + landUseCategory.getCode() ); + } + + } + }; } } From 3cc0705fa2e58cab68ef9bd00c4a409e41f1f8e3 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:25 +0100 Subject: [PATCH 1460/1620] New translations IPCCLandUses.java (English) --- .../earth/app/view/Messages_en.properties | 141 +++++++++++++++--- 1 file changed, 123 insertions(+), 18 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index fed659b97f..dd01ad946d 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,32 +1,137 @@ package org.openforis.collect.earth.ipcc; -public class IPCCGeneratorException extends RdbExportException { +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; - /** - * - */ - private static final long serialVersionUID = 6236105290795112340L; +import org.openforis.collect.earth.app.service.ExportType; +import org.openforis.collect.earth.app.service.RDBConnector; +import org.openforis.collect.earth.app.service.SchemaService; +import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; +import org.openforis.collect.earth.ipcc.model.CroplandType; +import org.openforis.collect.earth.ipcc.model.ForestSubdivision; +import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; +import org.openforis.collect.earth.ipcc.model.LandUseCategory; +import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; +import org.openforis.collect.earth.ipcc.model.ManagementType; +import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; +import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; +import org.openforis.collect.earth.ipcc.model.SettlementType; +import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Component; - public IPCCGeneratorException() { - super(); - // TODO Auto-generated constructor stub - } +@Component +public class IPCCLandUses extends RDBConnector { + + private String schemaName; + private static final String LU_TABLE = "land_use_use_code"; + private static final String LU_CODE_COLUMN = "land_use_use"; + private static final String LU_SUBDIVISION_TABLE = "land_use_subdivision_code"; + private static final String LU_CATEGORY_ID = LU_TABLE +"_id"; + + Logger logger = LoggerFactory.getLogger(IPCCLandUses.class); + + @Autowired + private SchemaService schemaService; - public IPCCGeneratorException(String message, Throwable cause, boolean enableSuppression, - boolean writableStackTrace) { - super(message, cause, enableSuppression, writableStackTrace); + + public IPCCLandUses() { + setExportTypeUsed(ExportType.IPCC); } - public IPCCGeneratorException(String message, Throwable cause) { - super(message, cause); + public List getLandUseSubdivisions() { + + schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); + + LandUseCategory[] lUseCategories = LandUseCategory.values(); + + List lUseSubdivisions = new ArrayList(); + + for (int i = 0; i < lUseCategories.length; i++) { + + lUseSubdivisions.addAll( getSubdivisions(lUseCategories[i])); + + } + + return lUseSubdivisions; + } - public IPCCGeneratorException(String message) { - super(message); + private Collection> getSubdivisions(LandUseCategory landUseCategory) { + + List> luSubdivisions = getJdbcTemplate().query( + "select " + + "land_use_subdivision,land_use_subdivision_label_fr" + + " from " + schemaName + LU_SUBDIVISION_TABLE + + " where " + LU_CATEGORY_ID + + " IN ( select " + LU_CATEGORY_ID + + " from " + schemaName + LU_TABLE + + " where " + LU_CODE_COLUMN + " = '" + landUseCategory.getCode()+ "'" + + ")" + , + getRowMapper(landUseCategory) + ); + + return luSubdivisions; } - public IPCCGeneratorException(Throwable cause) { - super(cause); + private RowMapper> getRowMapper(LandUseCategory landUseCategory) { + return new RowMapper>() { + @Override + public LandUseSubdivision mapRow(ResultSet rs, int rowNum) throws SQLException { + + String subdivisionCode = rs.getString(1); + String subdivisionName = rs.getString(2); + + switch (landUseCategory.getCode()) { + case "F": + return new ForestSubdivision( + subdivisionCode, + subdivisionName, + ManagementType.MANAGED // Assign default management + ); + case "C": + return new CroplandSubdivision( + subdivisionCode, + subdivisionName, + CroplandType.ANNUAL // Assign default management + ); + case "G": + return new GrasslandSubdivision( + subdivisionCode, + subdivisionName, + ManagementType.MANAGED // Assign default management + ); + case "S": + return new SettlementSubdivision( + subdivisionCode, + subdivisionName, + SettlementType.OTHER // Assign default management + ); + case "W": + return new WetlandSubdivision( + subdivisionCode, + subdivisionName, + ManagementType.UNMANAGED // Assign default management + ); + case "O": + return new OtherlandSubdivision( + subdivisionCode, + subdivisionName, + ManagementType.UNMANAGED // Assign default management + ); + default: + throw new IllegalArgumentException("Unknown code " + landUseCategory.getCode() ); + } + + } + }; } } From 640240e714988b32eec57681590338a2c7e76f9e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:27 +0100 Subject: [PATCH 1461/1620] New translations YearData.java (Spanish) --- .../earth/app/view/Messages_es.properties | 143 +++--------------- 1 file changed, 19 insertions(+), 124 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index dd01ad946d..569b22cb08 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,137 +1,32 @@ package org.openforis.collect.earth.ipcc; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Collection; import java.util.List; -import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.RDBConnector; -import org.openforis.collect.earth.app.service.SchemaService; -import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; -import org.openforis.collect.earth.ipcc.model.CroplandType; -import org.openforis.collect.earth.ipcc.model.ForestSubdivision; -import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; -import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.openforis.collect.earth.ipcc.model.ManagementType; -import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; -import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; -import org.openforis.collect.earth.ipcc.model.SettlementType; -import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.RowMapper; -import org.springframework.stereotype.Component; +public class YearData { -@Component -public class IPCCLandUses extends RDBConnector { + protected int year; + protected List luData; - private String schemaName; - private static final String LU_TABLE = "land_use_use_code"; - private static final String LU_CODE_COLUMN = "land_use_use"; - private static final String LU_SUBDIVISION_TABLE = "land_use_subdivision_code"; - private static final String LU_CATEGORY_ID = LU_TABLE +"_id"; - - Logger logger = LoggerFactory.getLogger(IPCCLandUses.class); - - @Autowired - private SchemaService schemaService; - - - public IPCCLandUses() { - setExportTypeUsed(ExportType.IPCC); + public YearData(int year) { + super(); + this.year = year; } - - public List getLandUseSubdivisions() { - - schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - - LandUseCategory[] lUseCategories = LandUseCategory.values(); - - List lUseSubdivisions = new ArrayList(); - - for (int i = 0; i < lUseCategories.length; i++) { - - lUseSubdivisions.addAll( getSubdivisions(lUseCategories[i])); - - } - - return lUseSubdivisions; - + + public YearData(int year, List luData) { + super(); + this.year = year; + this.luData = luData; } - - private Collection> getSubdivisions(LandUseCategory landUseCategory) { - - List> luSubdivisions = getJdbcTemplate().query( - "select " - + "land_use_subdivision,land_use_subdivision_label_fr" - + " from " + schemaName + LU_SUBDIVISION_TABLE - + " where " + LU_CATEGORY_ID - + " IN ( select " + LU_CATEGORY_ID - + " from " + schemaName + LU_TABLE - + " where " + LU_CODE_COLUMN + " = '" + landUseCategory.getCode()+ "'" - + ")" - , - getRowMapper(landUseCategory) - ); - - return luSubdivisions; + + public List getLuData() { + return luData; } - private RowMapper> getRowMapper(LandUseCategory landUseCategory) { - return new RowMapper>() { - @Override - public LandUseSubdivision mapRow(ResultSet rs, int rowNum) throws SQLException { - - String subdivisionCode = rs.getString(1); - String subdivisionName = rs.getString(2); - - switch (landUseCategory.getCode()) { - case "F": - return new ForestSubdivision( - subdivisionCode, - subdivisionName, - ManagementType.MANAGED // Assign default management - ); - case "C": - return new CroplandSubdivision( - subdivisionCode, - subdivisionName, - CroplandType.ANNUAL // Assign default management - ); - case "G": - return new GrasslandSubdivision( - subdivisionCode, - subdivisionName, - ManagementType.MANAGED // Assign default management - ); - case "S": - return new SettlementSubdivision( - subdivisionCode, - subdivisionName, - SettlementType.OTHER // Assign default management - ); - case "W": - return new WetlandSubdivision( - subdivisionCode, - subdivisionName, - ManagementType.UNMANAGED // Assign default management - ); - case "O": - return new OtherlandSubdivision( - subdivisionCode, - subdivisionName, - ManagementType.UNMANAGED // Assign default management - ); - default: - throw new IllegalArgumentException("Unknown code " + landUseCategory.getCode() ); - } - - } - }; + public void setLuData(List luData) { + this.luData = luData; } + public int getYear() { + return year; + } } From fc4f827a24f50cf5ad1ed708776750c22a8e902d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:28 +0100 Subject: [PATCH 1462/1620] New translations YearData.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 143 +++--------------- 1 file changed, 19 insertions(+), 124 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index dd01ad946d..569b22cb08 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,137 +1,32 @@ package org.openforis.collect.earth.ipcc; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Collection; import java.util.List; -import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.RDBConnector; -import org.openforis.collect.earth.app.service.SchemaService; -import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; -import org.openforis.collect.earth.ipcc.model.CroplandType; -import org.openforis.collect.earth.ipcc.model.ForestSubdivision; -import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; -import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.openforis.collect.earth.ipcc.model.ManagementType; -import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; -import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; -import org.openforis.collect.earth.ipcc.model.SettlementType; -import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.RowMapper; -import org.springframework.stereotype.Component; +public class YearData { -@Component -public class IPCCLandUses extends RDBConnector { + protected int year; + protected List luData; - private String schemaName; - private static final String LU_TABLE = "land_use_use_code"; - private static final String LU_CODE_COLUMN = "land_use_use"; - private static final String LU_SUBDIVISION_TABLE = "land_use_subdivision_code"; - private static final String LU_CATEGORY_ID = LU_TABLE +"_id"; - - Logger logger = LoggerFactory.getLogger(IPCCLandUses.class); - - @Autowired - private SchemaService schemaService; - - - public IPCCLandUses() { - setExportTypeUsed(ExportType.IPCC); + public YearData(int year) { + super(); + this.year = year; } - - public List getLandUseSubdivisions() { - - schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - - LandUseCategory[] lUseCategories = LandUseCategory.values(); - - List lUseSubdivisions = new ArrayList(); - - for (int i = 0; i < lUseCategories.length; i++) { - - lUseSubdivisions.addAll( getSubdivisions(lUseCategories[i])); - - } - - return lUseSubdivisions; - + + public YearData(int year, List luData) { + super(); + this.year = year; + this.luData = luData; } - - private Collection> getSubdivisions(LandUseCategory landUseCategory) { - - List> luSubdivisions = getJdbcTemplate().query( - "select " - + "land_use_subdivision,land_use_subdivision_label_fr" - + " from " + schemaName + LU_SUBDIVISION_TABLE - + " where " + LU_CATEGORY_ID - + " IN ( select " + LU_CATEGORY_ID - + " from " + schemaName + LU_TABLE - + " where " + LU_CODE_COLUMN + " = '" + landUseCategory.getCode()+ "'" - + ")" - , - getRowMapper(landUseCategory) - ); - - return luSubdivisions; + + public List getLuData() { + return luData; } - private RowMapper> getRowMapper(LandUseCategory landUseCategory) { - return new RowMapper>() { - @Override - public LandUseSubdivision mapRow(ResultSet rs, int rowNum) throws SQLException { - - String subdivisionCode = rs.getString(1); - String subdivisionName = rs.getString(2); - - switch (landUseCategory.getCode()) { - case "F": - return new ForestSubdivision( - subdivisionCode, - subdivisionName, - ManagementType.MANAGED // Assign default management - ); - case "C": - return new CroplandSubdivision( - subdivisionCode, - subdivisionName, - CroplandType.ANNUAL // Assign default management - ); - case "G": - return new GrasslandSubdivision( - subdivisionCode, - subdivisionName, - ManagementType.MANAGED // Assign default management - ); - case "S": - return new SettlementSubdivision( - subdivisionCode, - subdivisionName, - SettlementType.OTHER // Assign default management - ); - case "W": - return new WetlandSubdivision( - subdivisionCode, - subdivisionName, - ManagementType.UNMANAGED // Assign default management - ); - case "O": - return new OtherlandSubdivision( - subdivisionCode, - subdivisionName, - ManagementType.UNMANAGED // Assign default management - ); - default: - throw new IllegalArgumentException("Unknown code " + landUseCategory.getCode() ); - } - - } - }; + public void setLuData(List luData) { + this.luData = luData; } + public int getYear() { + return year; + } } From da18674bad8686784ef076fee6962df50e1ee87a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:29 +0100 Subject: [PATCH 1463/1620] New translations GeoJson.java (English) --- .../earth/app/view/Messages_en.properties | 163 +++--------------- 1 file changed, 26 insertions(+), 137 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index dd01ad946d..16edcc9124 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,137 +1,26 @@ -package org.openforis.collect.earth.ipcc; - -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.RDBConnector; -import org.openforis.collect.earth.app.service.SchemaService; -import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; -import org.openforis.collect.earth.ipcc.model.CroplandType; -import org.openforis.collect.earth.ipcc.model.ForestSubdivision; -import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; -import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.openforis.collect.earth.ipcc.model.ManagementType; -import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; -import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; -import org.openforis.collect.earth.ipcc.model.SettlementType; -import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.RowMapper; -import org.springframework.stereotype.Component; - -@Component -public class IPCCLandUses extends RDBConnector { - - private String schemaName; - private static final String LU_TABLE = "land_use_use_code"; - private static final String LU_CODE_COLUMN = "land_use_use"; - private static final String LU_SUBDIVISION_TABLE = "land_use_subdivision_code"; - private static final String LU_CATEGORY_ID = LU_TABLE +"_id"; - - Logger logger = LoggerFactory.getLogger(IPCCLandUses.class); - - @Autowired - private SchemaService schemaService; - - - public IPCCLandUses() { - setExportTypeUsed(ExportType.IPCC); - } - - public List getLandUseSubdivisions() { - - schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - - LandUseCategory[] lUseCategories = LandUseCategory.values(); - - List lUseSubdivisions = new ArrayList(); - - for (int i = 0; i < lUseCategories.length; i++) { - - lUseSubdivisions.addAll( getSubdivisions(lUseCategories[i])); - - } - - return lUseSubdivisions; - - } - - private Collection> getSubdivisions(LandUseCategory landUseCategory) { - - List> luSubdivisions = getJdbcTemplate().query( - "select " - + "land_use_subdivision,land_use_subdivision_label_fr" - + " from " + schemaName + LU_SUBDIVISION_TABLE - + " where " + LU_CATEGORY_ID - + " IN ( select " + LU_CATEGORY_ID - + " from " + schemaName + LU_TABLE - + " where " + LU_CODE_COLUMN + " = '" + landUseCategory.getCode()+ "'" - + ")" - , - getRowMapper(landUseCategory) - ); - - return luSubdivisions; - } - - private RowMapper> getRowMapper(LandUseCategory landUseCategory) { - return new RowMapper>() { - @Override - public LandUseSubdivision mapRow(ResultSet rs, int rowNum) throws SQLException { - - String subdivisionCode = rs.getString(1); - String subdivisionName = rs.getString(2); - - switch (landUseCategory.getCode()) { - case "F": - return new ForestSubdivision( - subdivisionCode, - subdivisionName, - ManagementType.MANAGED // Assign default management - ); - case "C": - return new CroplandSubdivision( - subdivisionCode, - subdivisionName, - CroplandType.ANNUAL // Assign default management - ); - case "G": - return new GrasslandSubdivision( - subdivisionCode, - subdivisionName, - ManagementType.MANAGED // Assign default management - ); - case "S": - return new SettlementSubdivision( - subdivisionCode, - subdivisionName, - SettlementType.OTHER // Assign default management - ); - case "W": - return new WetlandSubdivision( - subdivisionCode, - subdivisionName, - ManagementType.UNMANAGED // Assign default management - ); - case "O": - return new OtherlandSubdivision( - subdivisionCode, - subdivisionName, - ManagementType.UNMANAGED // Assign default management - ); - default: - throw new IllegalArgumentException("Unknown code " + landUseCategory.getCode() ); - } - - } - }; - } - -} +package org.openforis.collect.earth.planet; + +public class GeoJson { + + String type; // for geojson + double[][][] coordinates; + + public GeoJson(String type, double[][][] coordinates) { + super(); + this.type = type; + this.coordinates = coordinates; + } + public String getType() { + return type; + } + public void setType(String type) { + this.type = type; + } + public double[][][] getCoordinates() { + return coordinates; + } + public void setCoordinates(double[][][] coordinates) { + this.coordinates = coordinates; + } + +} From 29cdf1742f19367f639c374ca058a0775451a04d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:30 +0100 Subject: [PATCH 1464/1620] New translations FilterConfig.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 78 +++++++++++-------- 1 file changed, 46 insertions(+), 32 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 569b22cb08..0f21aea725 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,32 +1,46 @@ -package org.openforis.collect.earth.ipcc; - -import java.util.List; - -public class YearData { - - protected int year; - protected List luData; - - public YearData(int year) { - super(); - this.year = year; - } - - public YearData(int year, List luData) { - super(); - this.year = year; - this.luData = luData; - } - - public List getLuData() { - return luData; - } - - public void setLuData(List luData) { - this.luData = luData; - } - - public int getYear() { - return year; - } -} +package org.openforis.collect.earth.planet; + +import java.util.Date; + +public class FilterConfig { + Date gte; // DateRangeFiter gte; + Date lt; + String type; // for geojson + double[][][] coordinates; + + public FilterConfig(Date gte, Date lt) { + super(); + this.gte = gte; + this.lt = lt; + } + + public FilterConfig(String type, double[][][] coordinates) { + super(); + this.type = type; + this.coordinates = coordinates; + } + + public Date getGte() { + return gte; + } + public void setGte(Date gte) { + this.gte = gte; + } + public Date getLt() { + return lt; + } + public void setLt(Date lt) { + this.lt = lt; + } + + public double[][][] getCoordinates() { + return coordinates; + } + + public void setCoordinates(double[][][] coordinates) { + this.coordinates = coordinates; + } + + + +} From 4d08fbcaf25c76b151dbb76baf2458a9b873920a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:32 +0100 Subject: [PATCH 1465/1620] New translations FilterConfig.java (English) --- .../earth/app/view/Messages_en.properties | 32 +++++++++++++++---- 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 16edcc9124..0f21aea725 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,26 +1,46 @@ package org.openforis.collect.earth.planet; -public class GeoJson { +import java.util.Date; +public class FilterConfig { + Date gte; // DateRangeFiter gte; + Date lt; String type; // for geojson double[][][] coordinates; - public GeoJson(String type, double[][][] coordinates) { + public FilterConfig(Date gte, Date lt) { + super(); + this.gte = gte; + this.lt = lt; + } + + public FilterConfig(String type, double[][][] coordinates) { super(); this.type = type; this.coordinates = coordinates; } - public String getType() { - return type; + + public Date getGte() { + return gte; } - public void setType(String type) { - this.type = type; + public void setGte(Date gte) { + this.gte = gte; + } + public Date getLt() { + return lt; } + public void setLt(Date lt) { + this.lt = lt; + } + public double[][][] getCoordinates() { return coordinates; } + public void setCoordinates(double[][][] coordinates) { this.coordinates = coordinates; } + + } From 06f6c3b4a6b034fd10dd422f2a3a9a9d680cf6fc Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:33 +0100 Subject: [PATCH 1466/1620] New translations FilterType.java (French) --- .../earth/app/view/Messages_fr.properties | 160 +++--------------- 1 file changed, 23 insertions(+), 137 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index dd01ad946d..bc34210ad4 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,137 +1,23 @@ -package org.openforis.collect.earth.ipcc; - -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -import org.openforis.collect.earth.app.service.ExportType; -import org.openforis.collect.earth.app.service.RDBConnector; -import org.openforis.collect.earth.app.service.SchemaService; -import org.openforis.collect.earth.ipcc.model.CroplandSubdivision; -import org.openforis.collect.earth.ipcc.model.CroplandType; -import org.openforis.collect.earth.ipcc.model.ForestSubdivision; -import org.openforis.collect.earth.ipcc.model.GrasslandSubdivision; -import org.openforis.collect.earth.ipcc.model.LandUseCategory; -import org.openforis.collect.earth.ipcc.model.LandUseSubdivision; -import org.openforis.collect.earth.ipcc.model.ManagementType; -import org.openforis.collect.earth.ipcc.model.OtherlandSubdivision; -import org.openforis.collect.earth.ipcc.model.SettlementSubdivision; -import org.openforis.collect.earth.ipcc.model.SettlementType; -import org.openforis.collect.earth.ipcc.model.WetlandSubdivision; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.RowMapper; -import org.springframework.stereotype.Component; - -@Component -public class IPCCLandUses extends RDBConnector { - - private String schemaName; - private static final String LU_TABLE = "land_use_use_code"; - private static final String LU_CODE_COLUMN = "land_use_use"; - private static final String LU_SUBDIVISION_TABLE = "land_use_subdivision_code"; - private static final String LU_CATEGORY_ID = LU_TABLE +"_id"; - - Logger logger = LoggerFactory.getLogger(IPCCLandUses.class); - - @Autowired - private SchemaService schemaService; - - - public IPCCLandUses() { - setExportTypeUsed(ExportType.IPCC); - } - - public List getLandUseSubdivisions() { - - schemaName = schemaService.getSchemaPrefix(getExportTypeUsed()); - - LandUseCategory[] lUseCategories = LandUseCategory.values(); - - List lUseSubdivisions = new ArrayList(); - - for (int i = 0; i < lUseCategories.length; i++) { - - lUseSubdivisions.addAll( getSubdivisions(lUseCategories[i])); - - } - - return lUseSubdivisions; - - } - - private Collection> getSubdivisions(LandUseCategory landUseCategory) { - - List> luSubdivisions = getJdbcTemplate().query( - "select " - + "land_use_subdivision,land_use_subdivision_label_fr" - + " from " + schemaName + LU_SUBDIVISION_TABLE - + " where " + LU_CATEGORY_ID - + " IN ( select " + LU_CATEGORY_ID - + " from " + schemaName + LU_TABLE - + " where " + LU_CODE_COLUMN + " = '" + landUseCategory.getCode()+ "'" - + ")" - , - getRowMapper(landUseCategory) - ); - - return luSubdivisions; - } - - private RowMapper> getRowMapper(LandUseCategory landUseCategory) { - return new RowMapper>() { - @Override - public LandUseSubdivision mapRow(ResultSet rs, int rowNum) throws SQLException { - - String subdivisionCode = rs.getString(1); - String subdivisionName = rs.getString(2); - - switch (landUseCategory.getCode()) { - case "F": - return new ForestSubdivision( - subdivisionCode, - subdivisionName, - ManagementType.MANAGED // Assign default management - ); - case "C": - return new CroplandSubdivision( - subdivisionCode, - subdivisionName, - CroplandType.ANNUAL // Assign default management - ); - case "G": - return new GrasslandSubdivision( - subdivisionCode, - subdivisionName, - ManagementType.MANAGED // Assign default management - ); - case "S": - return new SettlementSubdivision( - subdivisionCode, - subdivisionName, - SettlementType.OTHER // Assign default management - ); - case "W": - return new WetlandSubdivision( - subdivisionCode, - subdivisionName, - ManagementType.UNMANAGED // Assign default management - ); - case "O": - return new OtherlandSubdivision( - subdivisionCode, - subdivisionName, - ManagementType.UNMANAGED // Assign default management - ); - default: - throw new IllegalArgumentException("Unknown code " + landUseCategory.getCode() ); - } - - } - }; - } - -} +package org.openforis.collect.earth.planet; + +import com.google.gson.annotations.SerializedName; + +public enum FilterType { + @SerializedName("DateRangeFilter") DATERANGE("DateRangeFilter"), + @SerializedName("StringInFilter") STRING_IN("StringInFilter"), + @SerializedName("AndFilter") AND("AndFilter"), + @SerializedName("OrFilter") OR("OrFilter"), + @SerializedName("GeometryFilter") GEOMETRY("GeometryFilter"); + + private String type; + + private FilterType(String type) { + this.type = type; + } + + @Override + public String toString() { + return type; + } + +} From 2ba30179e1067e3b2694119a0efaddeadae36f2c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:35 +0100 Subject: [PATCH 1467/1620] New translations FilterType.java (Spanish) --- .../earth/app/view/Messages_es.properties | 55 ++++++++----------- 1 file changed, 23 insertions(+), 32 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 569b22cb08..bc34210ad4 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,32 +1,23 @@ -package org.openforis.collect.earth.ipcc; - -import java.util.List; - -public class YearData { - - protected int year; - protected List luData; - - public YearData(int year) { - super(); - this.year = year; - } - - public YearData(int year, List luData) { - super(); - this.year = year; - this.luData = luData; - } - - public List getLuData() { - return luData; - } - - public void setLuData(List luData) { - this.luData = luData; - } - - public int getYear() { - return year; - } -} +package org.openforis.collect.earth.planet; + +import com.google.gson.annotations.SerializedName; + +public enum FilterType { + @SerializedName("DateRangeFilter") DATERANGE("DateRangeFilter"), + @SerializedName("StringInFilter") STRING_IN("StringInFilter"), + @SerializedName("AndFilter") AND("AndFilter"), + @SerializedName("OrFilter") OR("OrFilter"), + @SerializedName("GeometryFilter") GEOMETRY("GeometryFilter"); + + private String type; + + private FilterType(String type) { + this.type = type; + } + + @Override + public String toString() { + return type; + } + +} From 3188dabe2f47b62d63f7adebe642973e6152ac09 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:36 +0100 Subject: [PATCH 1468/1620] New translations FilterType.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 51 +++++-------------- 1 file changed, 14 insertions(+), 37 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 0f21aea725..bc34210ad4 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,46 +1,23 @@ package org.openforis.collect.earth.planet; -import java.util.Date; +import com.google.gson.annotations.SerializedName; -public class FilterConfig { - Date gte; // DateRangeFiter gte; - Date lt; - String type; // for geojson - double[][][] coordinates; - - public FilterConfig(Date gte, Date lt) { - super(); - this.gte = gte; - this.lt = lt; - } - - public FilterConfig(String type, double[][][] coordinates) { - super(); - this.type = type; - this.coordinates = coordinates; - } +public enum FilterType { + @SerializedName("DateRangeFilter") DATERANGE("DateRangeFilter"), + @SerializedName("StringInFilter") STRING_IN("StringInFilter"), + @SerializedName("AndFilter") AND("AndFilter"), + @SerializedName("OrFilter") OR("OrFilter"), + @SerializedName("GeometryFilter") GEOMETRY("GeometryFilter"); - public Date getGte() { - return gte; - } - public void setGte(Date gte) { - this.gte = gte; - } - public Date getLt() { - return lt; - } - public void setLt(Date lt) { - this.lt = lt; - } + private String type; - public double[][][] getCoordinates() { - return coordinates; + private FilterType(String type) { + this.type = type; } - public void setCoordinates(double[][][] coordinates) { - this.coordinates = coordinates; + @Override + public String toString() { + return type; } - - - + } From 450c8ea45f52354d98d02433e45a68c1dd2e6e6a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:37 +0100 Subject: [PATCH 1469/1620] New translations FilterType.java (English) --- .../earth/app/view/Messages_en.properties | 51 +++++-------------- 1 file changed, 14 insertions(+), 37 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 0f21aea725..bc34210ad4 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,46 +1,23 @@ package org.openforis.collect.earth.planet; -import java.util.Date; +import com.google.gson.annotations.SerializedName; -public class FilterConfig { - Date gte; // DateRangeFiter gte; - Date lt; - String type; // for geojson - double[][][] coordinates; - - public FilterConfig(Date gte, Date lt) { - super(); - this.gte = gte; - this.lt = lt; - } - - public FilterConfig(String type, double[][][] coordinates) { - super(); - this.type = type; - this.coordinates = coordinates; - } +public enum FilterType { + @SerializedName("DateRangeFilter") DATERANGE("DateRangeFilter"), + @SerializedName("StringInFilter") STRING_IN("StringInFilter"), + @SerializedName("AndFilter") AND("AndFilter"), + @SerializedName("OrFilter") OR("OrFilter"), + @SerializedName("GeometryFilter") GEOMETRY("GeometryFilter"); - public Date getGte() { - return gte; - } - public void setGte(Date gte) { - this.gte = gte; - } - public Date getLt() { - return lt; - } - public void setLt(Date lt) { - this.lt = lt; - } + private String type; - public double[][][] getCoordinates() { - return coordinates; + private FilterType(String type) { + this.type = type; } - public void setCoordinates(double[][][] coordinates) { - this.coordinates = coordinates; + @Override + public String toString() { + return type; } - - - + } From 888e0160fe493ad276fa3d289a8acaab464eaa1c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:38 +0100 Subject: [PATCH 1470/1620] New translations GeoJson.java (French) --- .../earth/app/view/Messages_fr.properties | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index bc34210ad4..16edcc9124 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,23 +1,26 @@ package org.openforis.collect.earth.planet; -import com.google.gson.annotations.SerializedName; +public class GeoJson { -public enum FilterType { - @SerializedName("DateRangeFilter") DATERANGE("DateRangeFilter"), - @SerializedName("StringInFilter") STRING_IN("StringInFilter"), - @SerializedName("AndFilter") AND("AndFilter"), - @SerializedName("OrFilter") OR("OrFilter"), - @SerializedName("GeometryFilter") GEOMETRY("GeometryFilter"); - - private String type; - - private FilterType(String type) { + String type; // for geojson + double[][][] coordinates; + + public GeoJson(String type, double[][][] coordinates) { + super(); this.type = type; + this.coordinates = coordinates; } - - @Override - public String toString() { + public String getType() { return type; } - + public void setType(String type) { + this.type = type; + } + public double[][][] getCoordinates() { + return coordinates; + } + public void setCoordinates(double[][][] coordinates) { + this.coordinates = coordinates; + } + } From 588d66cc0b202c6ff7811062e6f8bd7a03db8b9c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:39 +0100 Subject: [PATCH 1471/1620] New translations GeoJson.java (Spanish) --- .../earth/app/view/Messages_es.properties | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index bc34210ad4..16edcc9124 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,23 +1,26 @@ package org.openforis.collect.earth.planet; -import com.google.gson.annotations.SerializedName; +public class GeoJson { -public enum FilterType { - @SerializedName("DateRangeFilter") DATERANGE("DateRangeFilter"), - @SerializedName("StringInFilter") STRING_IN("StringInFilter"), - @SerializedName("AndFilter") AND("AndFilter"), - @SerializedName("OrFilter") OR("OrFilter"), - @SerializedName("GeometryFilter") GEOMETRY("GeometryFilter"); - - private String type; - - private FilterType(String type) { + String type; // for geojson + double[][][] coordinates; + + public GeoJson(String type, double[][][] coordinates) { + super(); this.type = type; + this.coordinates = coordinates; } - - @Override - public String toString() { + public String getType() { return type; } - + public void setType(String type) { + this.type = type; + } + public double[][][] getCoordinates() { + return coordinates; + } + public void setCoordinates(double[][][] coordinates) { + this.coordinates = coordinates; + } + } From ba0da6bd927305cc174ba9049c008960a15deb22 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:40 +0100 Subject: [PATCH 1472/1620] New translations GeoJson.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index bc34210ad4..16edcc9124 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,23 +1,26 @@ package org.openforis.collect.earth.planet; -import com.google.gson.annotations.SerializedName; +public class GeoJson { -public enum FilterType { - @SerializedName("DateRangeFilter") DATERANGE("DateRangeFilter"), - @SerializedName("StringInFilter") STRING_IN("StringInFilter"), - @SerializedName("AndFilter") AND("AndFilter"), - @SerializedName("OrFilter") OR("OrFilter"), - @SerializedName("GeometryFilter") GEOMETRY("GeometryFilter"); - - private String type; - - private FilterType(String type) { + String type; // for geojson + double[][][] coordinates; + + public GeoJson(String type, double[][][] coordinates) { + super(); this.type = type; + this.coordinates = coordinates; } - - @Override - public String toString() { + public String getType() { return type; } - + public void setType(String type) { + this.type = type; + } + public double[][][] getCoordinates() { + return coordinates; + } + public void setCoordinates(double[][][] coordinates) { + this.coordinates = coordinates; + } + } From 051b535cb229eeb798ea215a24427514af41fb3c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:41 +0100 Subject: [PATCH 1473/1620] New translations LayerResponse.java (French) --- .../earth/app/view/Messages_fr.properties | 55 +++++++++++++------ 1 file changed, 39 insertions(+), 16 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 16edcc9124..62c4020b05 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,26 +1,49 @@ package org.openforis.collect.earth.planet; -public class GeoJson { - - String type; // for geojson - double[][][] coordinates; +public class LayerResponse { + String name; + String[] items; + Float[] bounds; + String scheme; + String[] tiles; + String version; - public GeoJson(String type, double[][][] coordinates) { - super(); - this.type = type; - this.coordinates = coordinates; + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String[] getItems() { + return items; + } + public void setItems(String[] items) { + this.items = items; + } + public Float[] getBounds() { + return bounds; } - public String getType() { - return type; + public void setBounds(Float[] bounds) { + this.bounds = bounds; } - public void setType(String type) { - this.type = type; + public String getScheme() { + return scheme; } - public double[][][] getCoordinates() { - return coordinates; + public void setScheme(String scheme) { + this.scheme = scheme; } - public void setCoordinates(double[][][] coordinates) { - this.coordinates = coordinates; + public String[] getTiles() { + return tiles; } + public void setTiles(String[] tiles) { + this.tiles = tiles; + } + public String getVersion() { + return version; + } + public void setVersion(String version) { + this.version = version; + } + } From abd5f122a675304a935a507c575be1c4d32385ad Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:42 +0100 Subject: [PATCH 1474/1620] New translations FilterConfig.java (French) --- .../earth/app/view/Messages_fr.properties | 69 +++++++++---------- 1 file changed, 33 insertions(+), 36 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 62c4020b05..0f21aea725 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,49 +1,46 @@ package org.openforis.collect.earth.planet; -public class LayerResponse { - String name; - String[] items; - Float[] bounds; - String scheme; - String[] tiles; - String version; +import java.util.Date; + +public class FilterConfig { + Date gte; // DateRangeFiter gte; + Date lt; + String type; // for geojson + double[][][] coordinates; - public String getName() { - return name; - } - public void setName(String name) { - this.name = name; - } - public String[] getItems() { - return items; - } - public void setItems(String[] items) { - this.items = items; - } - public Float[] getBounds() { - return bounds; - } - public void setBounds(Float[] bounds) { - this.bounds = bounds; + public FilterConfig(Date gte, Date lt) { + super(); + this.gte = gte; + this.lt = lt; } - public String getScheme() { - return scheme; + + public FilterConfig(String type, double[][][] coordinates) { + super(); + this.type = type; + this.coordinates = coordinates; } - public void setScheme(String scheme) { - this.scheme = scheme; + + public Date getGte() { + return gte; } - public String[] getTiles() { - return tiles; + public void setGte(Date gte) { + this.gte = gte; } - public void setTiles(String[] tiles) { - this.tiles = tiles; + public Date getLt() { + return lt; } - public String getVersion() { - return version; + public void setLt(Date lt) { + this.lt = lt; } - public void setVersion(String version) { - this.version = version; + + public double[][][] getCoordinates() { + return coordinates; } + public void setCoordinates(double[][][] coordinates) { + this.coordinates = coordinates; + } + + } From d42607a1e196a7e1c0870e2873739152477cc7fb Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:43 +0100 Subject: [PATCH 1475/1620] New translations LayerResponse.java (Spanish) --- .../earth/app/view/Messages_es.properties | 55 +++++++++++++------ 1 file changed, 39 insertions(+), 16 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 16edcc9124..62c4020b05 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,26 +1,49 @@ package org.openforis.collect.earth.planet; -public class GeoJson { - - String type; // for geojson - double[][][] coordinates; +public class LayerResponse { + String name; + String[] items; + Float[] bounds; + String scheme; + String[] tiles; + String version; - public GeoJson(String type, double[][][] coordinates) { - super(); - this.type = type; - this.coordinates = coordinates; + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String[] getItems() { + return items; + } + public void setItems(String[] items) { + this.items = items; + } + public Float[] getBounds() { + return bounds; } - public String getType() { - return type; + public void setBounds(Float[] bounds) { + this.bounds = bounds; } - public void setType(String type) { - this.type = type; + public String getScheme() { + return scheme; } - public double[][][] getCoordinates() { - return coordinates; + public void setScheme(String scheme) { + this.scheme = scheme; } - public void setCoordinates(double[][][] coordinates) { - this.coordinates = coordinates; + public String[] getTiles() { + return tiles; } + public void setTiles(String[] tiles) { + this.tiles = tiles; + } + public String getVersion() { + return version; + } + public void setVersion(String version) { + this.version = version; + } + } From 5456c6f306a55145a44b8be04eff01ad9c198720 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:44 +0100 Subject: [PATCH 1476/1620] New translations LayerResponse.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 55 +++++++++++++------ 1 file changed, 39 insertions(+), 16 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 16edcc9124..62c4020b05 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,26 +1,49 @@ package org.openforis.collect.earth.planet; -public class GeoJson { - - String type; // for geojson - double[][][] coordinates; +public class LayerResponse { + String name; + String[] items; + Float[] bounds; + String scheme; + String[] tiles; + String version; - public GeoJson(String type, double[][][] coordinates) { - super(); - this.type = type; - this.coordinates = coordinates; + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String[] getItems() { + return items; + } + public void setItems(String[] items) { + this.items = items; + } + public Float[] getBounds() { + return bounds; } - public String getType() { - return type; + public void setBounds(Float[] bounds) { + this.bounds = bounds; } - public void setType(String type) { - this.type = type; + public String getScheme() { + return scheme; } - public double[][][] getCoordinates() { - return coordinates; + public void setScheme(String scheme) { + this.scheme = scheme; } - public void setCoordinates(double[][][] coordinates) { - this.coordinates = coordinates; + public String[] getTiles() { + return tiles; } + public void setTiles(String[] tiles) { + this.tiles = tiles; + } + public String getVersion() { + return version; + } + public void setVersion(String version) { + this.version = version; + } + } From e198a1c7ce96629fe18c868f1e93cfaeb0584cba Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:45 +0100 Subject: [PATCH 1477/1620] New translations LayerResponse.java (English) --- .../earth/app/view/Messages_en.properties | 60 +++++++++++++------ 1 file changed, 43 insertions(+), 17 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index bc34210ad4..62c4020b05 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,23 +1,49 @@ package org.openforis.collect.earth.planet; -import com.google.gson.annotations.SerializedName; - -public enum FilterType { - @SerializedName("DateRangeFilter") DATERANGE("DateRangeFilter"), - @SerializedName("StringInFilter") STRING_IN("StringInFilter"), - @SerializedName("AndFilter") AND("AndFilter"), - @SerializedName("OrFilter") OR("OrFilter"), - @SerializedName("GeometryFilter") GEOMETRY("GeometryFilter"); - - private String type; - - private FilterType(String type) { - this.type = type; +public class LayerResponse { + String name; + String[] items; + Float[] bounds; + String scheme; + String[] tiles; + String version; + + public String getName() { + return name; } - - @Override - public String toString() { - return type; + public void setName(String name) { + this.name = name; + } + public String[] getItems() { + return items; + } + public void setItems(String[] items) { + this.items = items; + } + public Float[] getBounds() { + return bounds; + } + public void setBounds(Float[] bounds) { + this.bounds = bounds; + } + public String getScheme() { + return scheme; + } + public void setScheme(String scheme) { + this.scheme = scheme; + } + public String[] getTiles() { + return tiles; + } + public void setTiles(String[] tiles) { + this.tiles = tiles; + } + public String getVersion() { + return version; + } + public void setVersion(String version) { + this.version = version; } + } From 91128e1924ff0f224190d64293294a58ee245621 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:47 +0100 Subject: [PATCH 1478/1620] New translations Links.java (French) --- .../earth/app/view/Messages_fr.properties | 49 +++++++------------ 1 file changed, 17 insertions(+), 32 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 0f21aea725..50ffb5df5e 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,46 +1,31 @@ package org.openforis.collect.earth.planet; -import java.util.Date; +import com.google.gson.annotations.SerializedName; -public class FilterConfig { - Date gte; // DateRangeFiter gte; - Date lt; - String type; // for geojson - double[][][] coordinates; +public class Links { + @SerializedName("_next") String next; + @SerializedName("_self") String self; + @SerializedName("_first") String first; - public FilterConfig(Date gte, Date lt) { - super(); - this.gte = gte; - this.lt = lt; + public String getNext() { + return next; } - - public FilterConfig(String type, double[][][] coordinates) { - super(); - this.type = type; - this.coordinates = coordinates; + public void setNext(String next) { + this.next = next; } - - public Date getGte() { - return gte; + public String getSelf() { + return self; } - public void setGte(Date gte) { - this.gte = gte; + public void setSelf(String self) { + this.self = self; } - public Date getLt() { - return lt; + public String getFirst() { + return first; } - public void setLt(Date lt) { - this.lt = lt; + public void setFirst(String first) { + this.first = first; } - public double[][][] getCoordinates() { - return coordinates; - } - public void setCoordinates(double[][][] coordinates) { - this.coordinates = coordinates; - } - - } From 686cdb8c7a2c6cea900d6aafc0c1c739327d981e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:48 +0100 Subject: [PATCH 1479/1620] New translations Links.java (Spanish) --- .../earth/app/view/Messages_es.properties | 56 +++++++------------ 1 file changed, 19 insertions(+), 37 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 62c4020b05..50ffb5df5e 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,49 +1,31 @@ package org.openforis.collect.earth.planet; -public class LayerResponse { - String name; - String[] items; - Float[] bounds; - String scheme; - String[] tiles; - String version; +import com.google.gson.annotations.SerializedName; + +public class Links { + @SerializedName("_next") String next; + @SerializedName("_self") String self; + @SerializedName("_first") String first; - public String getName() { - return name; - } - public void setName(String name) { - this.name = name; - } - public String[] getItems() { - return items; - } - public void setItems(String[] items) { - this.items = items; + public String getNext() { + return next; } - public Float[] getBounds() { - return bounds; + public void setNext(String next) { + this.next = next; } - public void setBounds(Float[] bounds) { - this.bounds = bounds; + public String getSelf() { + return self; } - public String getScheme() { - return scheme; + public void setSelf(String self) { + this.self = self; } - public void setScheme(String scheme) { - this.scheme = scheme; + public String getFirst() { + return first; } - public String[] getTiles() { - return tiles; - } - public void setTiles(String[] tiles) { - this.tiles = tiles; - } - public String getVersion() { - return version; - } - public void setVersion(String version) { - this.version = version; + public void setFirst(String first) { + this.first = first; } + } From ec3c37fccc7a7248d5429a8572e3cab713da3622 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:49 +0100 Subject: [PATCH 1480/1620] New translations Links.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 56 +++++++------------ 1 file changed, 19 insertions(+), 37 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 62c4020b05..50ffb5df5e 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,49 +1,31 @@ package org.openforis.collect.earth.planet; -public class LayerResponse { - String name; - String[] items; - Float[] bounds; - String scheme; - String[] tiles; - String version; +import com.google.gson.annotations.SerializedName; + +public class Links { + @SerializedName("_next") String next; + @SerializedName("_self") String self; + @SerializedName("_first") String first; - public String getName() { - return name; - } - public void setName(String name) { - this.name = name; - } - public String[] getItems() { - return items; - } - public void setItems(String[] items) { - this.items = items; + public String getNext() { + return next; } - public Float[] getBounds() { - return bounds; + public void setNext(String next) { + this.next = next; } - public void setBounds(Float[] bounds) { - this.bounds = bounds; + public String getSelf() { + return self; } - public String getScheme() { - return scheme; + public void setSelf(String self) { + this.self = self; } - public void setScheme(String scheme) { - this.scheme = scheme; + public String getFirst() { + return first; } - public String[] getTiles() { - return tiles; - } - public void setTiles(String[] tiles) { - this.tiles = tiles; - } - public String getVersion() { - return version; - } - public void setVersion(String version) { - this.version = version; + public void setFirst(String first) { + this.first = first; } + } From a93ef8af41d4c6f0df05e38835473f6243a1a7f5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:50 +0100 Subject: [PATCH 1481/1620] New translations Links.java (English) --- .../earth/app/view/Messages_en.properties | 56 +++++++------------ 1 file changed, 19 insertions(+), 37 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 62c4020b05..50ffb5df5e 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,49 +1,31 @@ package org.openforis.collect.earth.planet; -public class LayerResponse { - String name; - String[] items; - Float[] bounds; - String scheme; - String[] tiles; - String version; +import com.google.gson.annotations.SerializedName; + +public class Links { + @SerializedName("_next") String next; + @SerializedName("_self") String self; + @SerializedName("_first") String first; - public String getName() { - return name; - } - public void setName(String name) { - this.name = name; - } - public String[] getItems() { - return items; - } - public void setItems(String[] items) { - this.items = items; + public String getNext() { + return next; } - public Float[] getBounds() { - return bounds; + public void setNext(String next) { + this.next = next; } - public void setBounds(Float[] bounds) { - this.bounds = bounds; + public String getSelf() { + return self; } - public String getScheme() { - return scheme; + public void setSelf(String self) { + this.self = self; } - public void setScheme(String scheme) { - this.scheme = scheme; + public String getFirst() { + return first; } - public String[] getTiles() { - return tiles; - } - public void setTiles(String[] tiles) { - this.tiles = tiles; - } - public String getVersion() { - return version; - } - public void setVersion(String version) { - this.version = version; + public void setFirst(String first) { + this.first = first; } + } From 348f29e39ea86949a164efe48bc3f7ecb4dca682 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:51 +0100 Subject: [PATCH 1482/1620] New translations PlanetAttributes.java (French) --- .../earth/app/view/Messages_fr.properties | 29 +++---------------- 1 file changed, 4 insertions(+), 25 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 50ffb5df5e..a3da2ae001 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,31 +1,10 @@ package org.openforis.collect.earth.planet; -import com.google.gson.annotations.SerializedName; +public final class PlanetAttributes { -public class Links { - @SerializedName("_next") String next; - @SerializedName("_self") String self; - @SerializedName("_first") String first; + private PlanetAttributes() {} - public String getNext() { - return next; - } - public void setNext(String next) { - this.next = next; - } - public String getSelf() { - return self; - } - public void setSelf(String self) { - this.self = self; - } - public String getFirst() { - return first; - } - public void setFirst(String first) { - this.first = first; - } - - + public static final String ACQUIRED = "acquired"; + public static final String GEOMETRY = "geometry"; } From 8c4b740f958c380bb36edd47b3b719857206a3ab Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:52 +0100 Subject: [PATCH 1483/1620] New translations PlanetAttributes.java (Spanish) --- .../earth/app/view/Messages_es.properties | 29 +++---------------- 1 file changed, 4 insertions(+), 25 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 50ffb5df5e..a3da2ae001 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,31 +1,10 @@ package org.openforis.collect.earth.planet; -import com.google.gson.annotations.SerializedName; +public final class PlanetAttributes { -public class Links { - @SerializedName("_next") String next; - @SerializedName("_self") String self; - @SerializedName("_first") String first; + private PlanetAttributes() {} - public String getNext() { - return next; - } - public void setNext(String next) { - this.next = next; - } - public String getSelf() { - return self; - } - public void setSelf(String self) { - this.self = self; - } - public String getFirst() { - return first; - } - public void setFirst(String first) { - this.first = first; - } - - + public static final String ACQUIRED = "acquired"; + public static final String GEOMETRY = "geometry"; } From 3fbc488c05c6c04954125ab34390962d6406be3b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:53 +0100 Subject: [PATCH 1484/1620] New translations PlanetAttributes.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 29 +++---------------- 1 file changed, 4 insertions(+), 25 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 50ffb5df5e..a3da2ae001 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,31 +1,10 @@ package org.openforis.collect.earth.planet; -import com.google.gson.annotations.SerializedName; +public final class PlanetAttributes { -public class Links { - @SerializedName("_next") String next; - @SerializedName("_self") String self; - @SerializedName("_first") String first; + private PlanetAttributes() {} - public String getNext() { - return next; - } - public void setNext(String next) { - this.next = next; - } - public String getSelf() { - return self; - } - public void setSelf(String self) { - this.self = self; - } - public String getFirst() { - return first; - } - public void setFirst(String first) { - this.first = first; - } - - + public static final String ACQUIRED = "acquired"; + public static final String GEOMETRY = "geometry"; } From 898e40786fe2b2111e1678df6896c3dc4c153b81 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:54 +0100 Subject: [PATCH 1485/1620] New translations FilterConfig.java (Spanish) --- .../earth/app/view/Messages_es.properties | 44 +++++++++++++++++-- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index a3da2ae001..0f21aea725 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,10 +1,46 @@ package org.openforis.collect.earth.planet; -public final class PlanetAttributes { +import java.util.Date; - private PlanetAttributes() {} +public class FilterConfig { + Date gte; // DateRangeFiter gte; + Date lt; + String type; // for geojson + double[][][] coordinates; + + public FilterConfig(Date gte, Date lt) { + super(); + this.gte = gte; + this.lt = lt; + } + + public FilterConfig(String type, double[][][] coordinates) { + super(); + this.type = type; + this.coordinates = coordinates; + } + + public Date getGte() { + return gte; + } + public void setGte(Date gte) { + this.gte = gte; + } + public Date getLt() { + return lt; + } + public void setLt(Date lt) { + this.lt = lt; + } + + public double[][][] getCoordinates() { + return coordinates; + } + + public void setCoordinates(double[][][] coordinates) { + this.coordinates = coordinates; + } + - public static final String ACQUIRED = "acquired"; - public static final String GEOMETRY = "geometry"; } From 56cde426eedb6d54feb6c0dd473af5490f994ed6 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:55 +0100 Subject: [PATCH 1486/1620] New translations Filter.java (English) --- .../earth/app/view/Messages_en.properties | 36 +++++++++---------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 50ffb5df5e..11f4ff87a6 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,31 +1,27 @@ package org.openforis.collect.earth.planet; -import com.google.gson.annotations.SerializedName; +public class Filter { -public class Links { - @SerializedName("_next") String next; - @SerializedName("_self") String self; - @SerializedName("_first") String first; + FilterType type; + String field_name; + e config; - public String getNext() { - return next; + public FilterType getType() { + return type; } - public void setNext(String next) { - this.next = next; + public void setType(FilterType type) { + this.type = type; } - public String getSelf() { - return self; + public String getFieldName() { + return field_name; } - public void setSelf(String self) { - this.self = self; + public void setFieldName(String field_name) { + this.field_name = field_name; } - public String getFirst() { - return first; + public e getConfig() { + return config; } - public void setFirst(String first) { - this.first = first; + public void setConfig(e config) { + this.config = config; } - - - } From 8cd29d6f8875dceb66285ff8e57812bdf6a4fb2c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:56 +0100 Subject: [PATCH 1487/1620] New translations YearData.java (English) --- .../earth/app/view/Messages_en.properties | 59 ++++++++++--------- 1 file changed, 32 insertions(+), 27 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 11f4ff87a6..569b22cb08 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,27 +1,32 @@ -package org.openforis.collect.earth.planet; - -public class Filter { - - FilterType type; - String field_name; - e config; - - public FilterType getType() { - return type; - } - public void setType(FilterType type) { - this.type = type; - } - public String getFieldName() { - return field_name; - } - public void setFieldName(String field_name) { - this.field_name = field_name; - } - public e getConfig() { - return config; - } - public void setConfig(e config) { - this.config = config; - } -} +package org.openforis.collect.earth.ipcc; + +import java.util.List; + +public class YearData { + + protected int year; + protected List luData; + + public YearData(int year) { + super(); + this.year = year; + } + + public YearData(int year, List luData) { + super(); + this.year = year; + this.luData = luData; + } + + public List getLuData() { + return luData; + } + + public void setLuData(List luData) { + this.luData = luData; + } + + public int getYear() { + return year; + } +} From aa0241f06f53a1de2e5732f2a0acd9a28c7cef29 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:57 +0100 Subject: [PATCH 1488/1620] New translations Feature.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 32 ++++++++++++++++--- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index a3da2ae001..d3d85cb7ab 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,10 +1,32 @@ package org.openforis.collect.earth.planet; -public final class PlanetAttributes { +public class Feature { - private PlanetAttributes() {} - - public static final String ACQUIRED = "acquired"; - public static final String GEOMETRY = "geometry"; + FeatureProperties properties; + String id; + + public FeatureProperties getProperties() { + return properties; + } + + public void setProperties(FeatureProperties properties) { + this.properties = properties; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + @Override + public String toString() { + return id + + " - cloud percent " + (properties.getCloudPercent()!=null?properties.getCloudPercent():"NULL") + + " - visible confidence percent " + (properties.getVisibleConfidencePercent()!=null?properties.getVisibleConfidencePercent():"NULL") + + " - cloud cover " + (properties.getCloudCover()!=null?properties.getCloudCover():"NULL") + + " - item type " + properties.getItemType() + "\n"; + } } From 2b5d66deaf49393efde1fd1a067fc9d96963301c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:49:59 +0100 Subject: [PATCH 1489/1620] New translations DatePlanet.java (French) --- .../earth/app/view/Messages_fr.properties | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index a3da2ae001..9a41e4b725 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,10 +1,20 @@ package org.openforis.collect.earth.planet; -public final class PlanetAttributes { +import java.text.SimpleDateFormat; +import java.util.Date; - private PlanetAttributes() {} +public class DatePlanet extends Date { + private static final long serialVersionUID = 1L; + private static final String DATE_FORMAT = "yyyy-MM-ddTHH:mm:ss.SSSZ"; - public static final String ACQUIRED = "acquired"; - public static final String GEOMETRY = "geometry"; + public DatePlanet(Date date) { + super(date.getTime()); + } + @Override + public String toString() { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATE_FORMAT); + return simpleDateFormat.format(this); + } + } From 9d982b5037743f83362a72d35b2a3214f35c9d4e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:00 +0100 Subject: [PATCH 1490/1620] New translations DatePlanet.java (Spanish) --- .../earth/app/view/Messages_es.properties | 46 ++++--------------- 1 file changed, 10 insertions(+), 36 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 0f21aea725..9a41e4b725 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,46 +1,20 @@ package org.openforis.collect.earth.planet; +import java.text.SimpleDateFormat; import java.util.Date; -public class FilterConfig { - Date gte; // DateRangeFiter gte; - Date lt; - String type; // for geojson - double[][][] coordinates; +public class DatePlanet extends Date { + private static final long serialVersionUID = 1L; + private static final String DATE_FORMAT = "yyyy-MM-ddTHH:mm:ss.SSSZ"; - public FilterConfig(Date gte, Date lt) { - super(); - this.gte = gte; - this.lt = lt; + public DatePlanet(Date date) { + super(date.getTime()); } - public FilterConfig(String type, double[][][] coordinates) { - super(); - this.type = type; - this.coordinates = coordinates; + @Override + public String toString() { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATE_FORMAT); + return simpleDateFormat.format(this); } - public Date getGte() { - return gte; - } - public void setGte(Date gte) { - this.gte = gte; - } - public Date getLt() { - return lt; - } - public void setLt(Date lt) { - this.lt = lt; - } - - public double[][][] getCoordinates() { - return coordinates; - } - - public void setCoordinates(double[][][] coordinates) { - this.coordinates = coordinates; - } - - - } From c8b39a1aebefaa1d554e0efb73cd64c24bef5f57 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:01 +0100 Subject: [PATCH 1491/1620] New translations DatePlanet.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 34 ++++++------------- 1 file changed, 11 insertions(+), 23 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index d3d85cb7ab..9a41e4b725 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,32 +1,20 @@ package org.openforis.collect.earth.planet; -public class Feature { +import java.text.SimpleDateFormat; +import java.util.Date; - FeatureProperties properties; - String id; - - public FeatureProperties getProperties() { - return properties; - } - - public void setProperties(FeatureProperties properties) { - this.properties = properties; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; +public class DatePlanet extends Date { + private static final long serialVersionUID = 1L; + private static final String DATE_FORMAT = "yyyy-MM-ddTHH:mm:ss.SSSZ"; + + public DatePlanet(Date date) { + super(date.getTime()); } @Override public String toString() { - return id + - " - cloud percent " + (properties.getCloudPercent()!=null?properties.getCloudPercent():"NULL") + - " - visible confidence percent " + (properties.getVisibleConfidencePercent()!=null?properties.getVisibleConfidencePercent():"NULL") + - " - cloud cover " + (properties.getCloudCover()!=null?properties.getCloudCover():"NULL") + - " - item type " + properties.getItemType() + "\n"; + SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATE_FORMAT); + return simpleDateFormat.format(this); } + } From f925894869e64a54d79f0c03c7c224005a98c5ac Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:02 +0100 Subject: [PATCH 1492/1620] New translations DatePlanet.java (English) --- .../earth/app/view/Messages_en.properties | 52 +++++++------------ 1 file changed, 20 insertions(+), 32 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 569b22cb08..9a41e4b725 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,32 +1,20 @@ -package org.openforis.collect.earth.ipcc; - -import java.util.List; - -public class YearData { - - protected int year; - protected List luData; - - public YearData(int year) { - super(); - this.year = year; - } - - public YearData(int year, List luData) { - super(); - this.year = year; - this.luData = luData; - } - - public List getLuData() { - return luData; - } - - public void setLuData(List luData) { - this.luData = luData; - } - - public int getYear() { - return year; - } -} +package org.openforis.collect.earth.planet; + +import java.text.SimpleDateFormat; +import java.util.Date; + +public class DatePlanet extends Date { + private static final long serialVersionUID = 1L; + private static final String DATE_FORMAT = "yyyy-MM-ddTHH:mm:ss.SSSZ"; + + public DatePlanet(Date date) { + super(date.getTime()); + } + + @Override + public String toString() { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATE_FORMAT); + return simpleDateFormat.format(this); + } + +} From bfb536a92d8478c550b85d4a051b1d12ed48f734 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:04 +0100 Subject: [PATCH 1493/1620] New translations DateUtils.java (French) --- .../earth/app/view/Messages_fr.properties | 40 +++++++++++-------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 9a41e4b725..300057dbb3 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,20 +1,26 @@ package org.openforis.collect.earth.planet; -import java.text.SimpleDateFormat; +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; import java.util.Date; - -public class DatePlanet extends Date { - private static final long serialVersionUID = 1L; - private static final String DATE_FORMAT = "yyyy-MM-ddTHH:mm:ss.SSSZ"; - - public DatePlanet(Date date) { - super(date.getTime()); - } - - @Override - public String toString() { - SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATE_FORMAT); - return simpleDateFormat.format(this); - } - -} + +public class DateUtils { + + public static Date asDate(LocalDate localDate) { + return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant()); + } + + public static Date asDate(LocalDateTime localDateTime) { + return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()); + } + + public static LocalDate asLocalDate(Date date) { + return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate(); + } + + public static LocalDateTime asLocalDateTime(Date date) { + return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime(); + } +} \ No newline at end of file From ffffd8ffb057372e8891e622524a3bdb50ad5b12 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:05 +0100 Subject: [PATCH 1494/1620] New translations DateUtils.java (Spanish) --- .../earth/app/view/Messages_es.properties | 40 +++++++++++-------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 9a41e4b725..300057dbb3 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,20 +1,26 @@ package org.openforis.collect.earth.planet; -import java.text.SimpleDateFormat; +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; import java.util.Date; - -public class DatePlanet extends Date { - private static final long serialVersionUID = 1L; - private static final String DATE_FORMAT = "yyyy-MM-ddTHH:mm:ss.SSSZ"; - - public DatePlanet(Date date) { - super(date.getTime()); - } - - @Override - public String toString() { - SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATE_FORMAT); - return simpleDateFormat.format(this); - } - -} + +public class DateUtils { + + public static Date asDate(LocalDate localDate) { + return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant()); + } + + public static Date asDate(LocalDateTime localDateTime) { + return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()); + } + + public static LocalDate asLocalDate(Date date) { + return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate(); + } + + public static LocalDateTime asLocalDateTime(Date date) { + return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime(); + } +} \ No newline at end of file From 030fe951e37ea3d22e0df8d8c5c05024b68c8189 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:06 +0100 Subject: [PATCH 1495/1620] New translations DateUtils.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 40 +++++++++++-------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 9a41e4b725..300057dbb3 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,20 +1,26 @@ package org.openforis.collect.earth.planet; -import java.text.SimpleDateFormat; +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; import java.util.Date; - -public class DatePlanet extends Date { - private static final long serialVersionUID = 1L; - private static final String DATE_FORMAT = "yyyy-MM-ddTHH:mm:ss.SSSZ"; - - public DatePlanet(Date date) { - super(date.getTime()); - } - - @Override - public String toString() { - SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATE_FORMAT); - return simpleDateFormat.format(this); - } - -} + +public class DateUtils { + + public static Date asDate(LocalDate localDate) { + return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant()); + } + + public static Date asDate(LocalDateTime localDateTime) { + return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()); + } + + public static LocalDate asLocalDate(Date date) { + return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate(); + } + + public static LocalDateTime asLocalDateTime(Date date) { + return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime(); + } +} \ No newline at end of file From c0c5dfe70995d052c23803833c2f08d3f2ef9ace Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:07 +0100 Subject: [PATCH 1496/1620] New translations DateUtils.java (English) --- .../earth/app/view/Messages_en.properties | 40 +++++++++++-------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 9a41e4b725..300057dbb3 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,20 +1,26 @@ package org.openforis.collect.earth.planet; -import java.text.SimpleDateFormat; +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; import java.util.Date; - -public class DatePlanet extends Date { - private static final long serialVersionUID = 1L; - private static final String DATE_FORMAT = "yyyy-MM-ddTHH:mm:ss.SSSZ"; - - public DatePlanet(Date date) { - super(date.getTime()); - } - - @Override - public String toString() { - SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATE_FORMAT); - return simpleDateFormat.format(this); - } - -} + +public class DateUtils { + + public static Date asDate(LocalDate localDate) { + return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant()); + } + + public static Date asDate(LocalDateTime localDateTime) { + return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()); + } + + public static LocalDate asLocalDate(Date date) { + return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate(); + } + + public static LocalDateTime asLocalDateTime(Date date) { + return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime(); + } +} \ No newline at end of file From d4bc41786e904c8f11d4e04988004eb4893299a6 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:08 +0100 Subject: [PATCH 1497/1620] New translations Feature.java (French) --- .../earth/app/view/Messages_fr.properties | 54 ++++++++++--------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 300057dbb3..d3d85cb7ab 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,26 +1,32 @@ package org.openforis.collect.earth.planet; -import java.time.Instant; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.util.Date; - -public class DateUtils { - - public static Date asDate(LocalDate localDate) { - return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant()); - } - - public static Date asDate(LocalDateTime localDateTime) { - return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()); - } - - public static LocalDate asLocalDate(Date date) { - return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate(); - } - - public static LocalDateTime asLocalDateTime(Date date) { - return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime(); - } -} \ No newline at end of file +public class Feature { + + FeatureProperties properties; + String id; + + public FeatureProperties getProperties() { + return properties; + } + + public void setProperties(FeatureProperties properties) { + this.properties = properties; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + @Override + public String toString() { + return id + + " - cloud percent " + (properties.getCloudPercent()!=null?properties.getCloudPercent():"NULL") + + " - visible confidence percent " + (properties.getVisibleConfidencePercent()!=null?properties.getVisibleConfidencePercent():"NULL") + + " - cloud cover " + (properties.getCloudCover()!=null?properties.getCloudCover():"NULL") + + " - item type " + properties.getItemType() + "\n"; + } +} From b53729f401ce8b227362586f8e1812cf779fcf5d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:09 +0100 Subject: [PATCH 1498/1620] New translations Feature.java (Spanish) --- .../earth/app/view/Messages_es.properties | 54 ++++++++++--------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 300057dbb3..d3d85cb7ab 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,26 +1,32 @@ package org.openforis.collect.earth.planet; -import java.time.Instant; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.util.Date; - -public class DateUtils { - - public static Date asDate(LocalDate localDate) { - return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant()); - } - - public static Date asDate(LocalDateTime localDateTime) { - return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()); - } - - public static LocalDate asLocalDate(Date date) { - return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate(); - } - - public static LocalDateTime asLocalDateTime(Date date) { - return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime(); - } -} \ No newline at end of file +public class Feature { + + FeatureProperties properties; + String id; + + public FeatureProperties getProperties() { + return properties; + } + + public void setProperties(FeatureProperties properties) { + this.properties = properties; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + @Override + public String toString() { + return id + + " - cloud percent " + (properties.getCloudPercent()!=null?properties.getCloudPercent():"NULL") + + " - visible confidence percent " + (properties.getVisibleConfidencePercent()!=null?properties.getVisibleConfidencePercent():"NULL") + + " - cloud cover " + (properties.getCloudCover()!=null?properties.getCloudCover():"NULL") + + " - item type " + properties.getItemType() + "\n"; + } +} From c5d8356c14a20ebe292a354445c3d392f1b148ec Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:10 +0100 Subject: [PATCH 1499/1620] New translations Feature.java (English) --- .../earth/app/view/Messages_en.properties | 54 ++++++++++--------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 300057dbb3..d3d85cb7ab 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,26 +1,32 @@ package org.openforis.collect.earth.planet; -import java.time.Instant; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.util.Date; - -public class DateUtils { - - public static Date asDate(LocalDate localDate) { - return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant()); - } - - public static Date asDate(LocalDateTime localDateTime) { - return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()); - } - - public static LocalDate asLocalDate(Date date) { - return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate(); - } - - public static LocalDateTime asLocalDateTime(Date date) { - return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime(); - } -} \ No newline at end of file +public class Feature { + + FeatureProperties properties; + String id; + + public FeatureProperties getProperties() { + return properties; + } + + public void setProperties(FeatureProperties properties) { + this.properties = properties; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + @Override + public String toString() { + return id + + " - cloud percent " + (properties.getCloudPercent()!=null?properties.getCloudPercent():"NULL") + + " - visible confidence percent " + (properties.getVisibleConfidencePercent()!=null?properties.getVisibleConfidencePercent():"NULL") + + " - cloud cover " + (properties.getCloudCover()!=null?properties.getCloudCover():"NULL") + + " - item type " + properties.getItemType() + "\n"; + } +} From 88781f4b29db2b377529280df901f703f8de58fb Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:12 +0100 Subject: [PATCH 1500/1620] New translations Filter.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 49 ++++++++++--------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 300057dbb3..11f4ff87a6 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,26 +1,27 @@ package org.openforis.collect.earth.planet; -import java.time.Instant; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.util.Date; - -public class DateUtils { - - public static Date asDate(LocalDate localDate) { - return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant()); - } - - public static Date asDate(LocalDateTime localDateTime) { - return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()); - } - - public static LocalDate asLocalDate(Date date) { - return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate(); - } - - public static LocalDateTime asLocalDateTime(Date date) { - return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime(); - } -} \ No newline at end of file +public class Filter { + + FilterType type; + String field_name; + e config; + + public FilterType getType() { + return type; + } + public void setType(FilterType type) { + this.type = type; + } + public String getFieldName() { + return field_name; + } + public void setFieldName(String field_name) { + this.field_name = field_name; + } + public e getConfig() { + return config; + } + public void setConfig(e config) { + this.config = config; + } +} From 38758000d4086e5b1f3868456ccb67fcb3907051 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:13 +0100 Subject: [PATCH 1501/1620] New translations FeatureProperties.java (French) --- .../earth/app/view/Messages_fr.properties | 231 ++++++++++++++++-- 1 file changed, 209 insertions(+), 22 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index d3d85cb7ab..cd7f57b2a1 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,32 +1,219 @@ package org.openforis.collect.earth.planet; -public class Feature { +import java.util.Date; - FeatureProperties properties; - String id; +public class FeatureProperties { - public FeatureProperties getProperties() { - return properties; + Date acquired; + Float anomalous_pixels; + Integer clear_confidence_percent; + Integer clear_percent; + Float cloud_cover; + Integer cloud_percent; + Integer columns; + String epsg_code; + Boolean ground_control; + Integer heavy_haze_percent; + String instrument; + String item_type; + Integer light_haze_percent; + Integer origin_x; + Integer origin_y; + Float pixel_resolution; + String provider; + Date published; + String quality_category; + Integer rows; + String satellite_id; + Integer shadow_percent; + Integer snow_ice_percent; + Integer strip_id; + Float sun_azimuth; + Float sun_elevation; + Date updated; + Float view_angle; + Integer visible_confidence_percent; + Integer visible_percent; + public Date getAcquired() { + return acquired; } - - public void setProperties(FeatureProperties properties) { - this.properties = properties; + public void setAcquired(Date acquired) { + this.acquired = acquired; } - - public String getId() { - return id; + public Float getAnomalousPixels() { + return anomalous_pixels; } - - public void setId(String id) { - this.id = id; + public void setAnomalousPixels(Float anomalous_pixels) { + this.anomalous_pixels = anomalous_pixels; } - - @Override - public String toString() { - return id + - " - cloud percent " + (properties.getCloudPercent()!=null?properties.getCloudPercent():"NULL") + - " - visible confidence percent " + (properties.getVisibleConfidencePercent()!=null?properties.getVisibleConfidencePercent():"NULL") + - " - cloud cover " + (properties.getCloudCover()!=null?properties.getCloudCover():"NULL") + - " - item type " + properties.getItemType() + "\n"; + public Integer getClearConfidence_percent() { + return clear_confidence_percent; + } + public void setClearConfidencePercent(Integer clear_confidence_percent) { + this.clear_confidence_percent = clear_confidence_percent; + } + public Integer getClearPercent() { + return clear_percent; + } + public void setClearPercent(Integer clear_percent) { + this.clear_percent = clear_percent; + } + public Float getCloudCover() { + return cloud_cover; + } + public void setCloudCover(Float cloud_cover) { + this.cloud_cover = cloud_cover; + } + public Integer getCloudPercent() { + return cloud_percent; + } + public void setCloudPercent(Integer cloud_percent) { + this.cloud_percent = cloud_percent; + } + public Integer getColumns() { + return columns; + } + public void setColumns(Integer columns) { + this.columns = columns; + } + public String getEpsgCode() { + return epsg_code; + } + public void setEpsgCode(String epsg_code) { + this.epsg_code = epsg_code; + } + public Boolean getGroundControl() { + return ground_control; + } + public void setGroundControl(Boolean ground_control) { + this.ground_control = ground_control; + } + public Integer getHeavyHazePercent() { + return heavy_haze_percent; + } + public void setHeavyHazePercent(Integer heavy_haze_percent) { + this.heavy_haze_percent = heavy_haze_percent; + } + public String getInstrument() { + return instrument; + } + public void setInstrument(String instrument) { + this.instrument = instrument; + } + public String getItemType() { + return item_type; + } + public void setItemType(String item_type) { + this.item_type = item_type; + } + public Integer getLightHaze_percent() { + return light_haze_percent; + } + public void setLightHazePercent(Integer light_haze_percent) { + this.light_haze_percent = light_haze_percent; + } + public Integer getOriginX() { + return origin_x; + } + public void setOriginX(Integer origin_x) { + this.origin_x = origin_x; + } + public Integer getOriginY() { + return origin_y; + } + public void setOriginY(Integer origin_y) { + this.origin_y = origin_y; + } + public Float getPixelResolution() { + return pixel_resolution; + } + public void setPixelResolution(Float pixel_resolution) { + this.pixel_resolution = pixel_resolution; } + public String getProvider() { + return provider; + } + public void setProvider(String provider) { + this.provider = provider; + } + public Date getPublished() { + return published; + } + public void setPublished(Date published) { + this.published = published; + } + public String getQualityCategory() { + return quality_category; + } + public void setQualityCategory(String quality_category) { + this.quality_category = quality_category; + } + public Integer getRows() { + return rows; + } + public void setRows(Integer rows) { + this.rows = rows; + } + public String getSatelliteId() { + return satellite_id; + } + public void setSatelliteId(String satellite_id) { + this.satellite_id = satellite_id; + } + public Integer getShadowPercent() { + return shadow_percent; + } + public void setShadowPercent(Integer shadow_percent) { + this.shadow_percent = shadow_percent; + } + public Integer getSnowIcePercent() { + return snow_ice_percent; + } + public void setSnowIcePercent(Integer snow_ice_percent) { + this.snow_ice_percent = snow_ice_percent; + } + public Integer getStripId() { + return strip_id; + } + public void setStripId(Integer strip_id) { + this.strip_id = strip_id; + } + public Float getSunAzimuth() { + return sun_azimuth; + } + public void setSunAzimuth(Float sun_azimuth) { + this.sun_azimuth = sun_azimuth; + } + public Float getSunElevation() { + return sun_elevation; + } + public void setSunElevation(Float sun_elevation) { + this.sun_elevation = sun_elevation; + } + public Date getUpdated() { + return updated; + } + public void setUpdated(Date updated) { + this.updated = updated; + } + public Float getViewAngle() { + return view_angle; + } + public void setViewAngle(Float view_angle) { + this.view_angle = view_angle; + } + public Integer getVisibleConfidencePercent() { + return visible_confidence_percent; + } + public void setVisibleConfidencePercent(Integer visible_confidence_percent) { + this.visible_confidence_percent = visible_confidence_percent; + } + public Integer getVisiblePercent() { + return visible_percent; + } + public void setVisiblePercent(Integer visible_percent) { + this.visible_percent = visible_percent; + } + + } From 5f7109289983828fe5cfd4e33db03542589a8d02 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:14 +0100 Subject: [PATCH 1502/1620] New translations FeatureProperties.java (Spanish) --- .../earth/app/view/Messages_es.properties | 231 ++++++++++++++++-- 1 file changed, 209 insertions(+), 22 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index d3d85cb7ab..cd7f57b2a1 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,32 +1,219 @@ package org.openforis.collect.earth.planet; -public class Feature { +import java.util.Date; - FeatureProperties properties; - String id; +public class FeatureProperties { - public FeatureProperties getProperties() { - return properties; + Date acquired; + Float anomalous_pixels; + Integer clear_confidence_percent; + Integer clear_percent; + Float cloud_cover; + Integer cloud_percent; + Integer columns; + String epsg_code; + Boolean ground_control; + Integer heavy_haze_percent; + String instrument; + String item_type; + Integer light_haze_percent; + Integer origin_x; + Integer origin_y; + Float pixel_resolution; + String provider; + Date published; + String quality_category; + Integer rows; + String satellite_id; + Integer shadow_percent; + Integer snow_ice_percent; + Integer strip_id; + Float sun_azimuth; + Float sun_elevation; + Date updated; + Float view_angle; + Integer visible_confidence_percent; + Integer visible_percent; + public Date getAcquired() { + return acquired; } - - public void setProperties(FeatureProperties properties) { - this.properties = properties; + public void setAcquired(Date acquired) { + this.acquired = acquired; } - - public String getId() { - return id; + public Float getAnomalousPixels() { + return anomalous_pixels; } - - public void setId(String id) { - this.id = id; + public void setAnomalousPixels(Float anomalous_pixels) { + this.anomalous_pixels = anomalous_pixels; } - - @Override - public String toString() { - return id + - " - cloud percent " + (properties.getCloudPercent()!=null?properties.getCloudPercent():"NULL") + - " - visible confidence percent " + (properties.getVisibleConfidencePercent()!=null?properties.getVisibleConfidencePercent():"NULL") + - " - cloud cover " + (properties.getCloudCover()!=null?properties.getCloudCover():"NULL") + - " - item type " + properties.getItemType() + "\n"; + public Integer getClearConfidence_percent() { + return clear_confidence_percent; + } + public void setClearConfidencePercent(Integer clear_confidence_percent) { + this.clear_confidence_percent = clear_confidence_percent; + } + public Integer getClearPercent() { + return clear_percent; + } + public void setClearPercent(Integer clear_percent) { + this.clear_percent = clear_percent; + } + public Float getCloudCover() { + return cloud_cover; + } + public void setCloudCover(Float cloud_cover) { + this.cloud_cover = cloud_cover; + } + public Integer getCloudPercent() { + return cloud_percent; + } + public void setCloudPercent(Integer cloud_percent) { + this.cloud_percent = cloud_percent; + } + public Integer getColumns() { + return columns; + } + public void setColumns(Integer columns) { + this.columns = columns; + } + public String getEpsgCode() { + return epsg_code; + } + public void setEpsgCode(String epsg_code) { + this.epsg_code = epsg_code; + } + public Boolean getGroundControl() { + return ground_control; + } + public void setGroundControl(Boolean ground_control) { + this.ground_control = ground_control; + } + public Integer getHeavyHazePercent() { + return heavy_haze_percent; + } + public void setHeavyHazePercent(Integer heavy_haze_percent) { + this.heavy_haze_percent = heavy_haze_percent; + } + public String getInstrument() { + return instrument; + } + public void setInstrument(String instrument) { + this.instrument = instrument; + } + public String getItemType() { + return item_type; + } + public void setItemType(String item_type) { + this.item_type = item_type; + } + public Integer getLightHaze_percent() { + return light_haze_percent; + } + public void setLightHazePercent(Integer light_haze_percent) { + this.light_haze_percent = light_haze_percent; + } + public Integer getOriginX() { + return origin_x; + } + public void setOriginX(Integer origin_x) { + this.origin_x = origin_x; + } + public Integer getOriginY() { + return origin_y; + } + public void setOriginY(Integer origin_y) { + this.origin_y = origin_y; + } + public Float getPixelResolution() { + return pixel_resolution; + } + public void setPixelResolution(Float pixel_resolution) { + this.pixel_resolution = pixel_resolution; } + public String getProvider() { + return provider; + } + public void setProvider(String provider) { + this.provider = provider; + } + public Date getPublished() { + return published; + } + public void setPublished(Date published) { + this.published = published; + } + public String getQualityCategory() { + return quality_category; + } + public void setQualityCategory(String quality_category) { + this.quality_category = quality_category; + } + public Integer getRows() { + return rows; + } + public void setRows(Integer rows) { + this.rows = rows; + } + public String getSatelliteId() { + return satellite_id; + } + public void setSatelliteId(String satellite_id) { + this.satellite_id = satellite_id; + } + public Integer getShadowPercent() { + return shadow_percent; + } + public void setShadowPercent(Integer shadow_percent) { + this.shadow_percent = shadow_percent; + } + public Integer getSnowIcePercent() { + return snow_ice_percent; + } + public void setSnowIcePercent(Integer snow_ice_percent) { + this.snow_ice_percent = snow_ice_percent; + } + public Integer getStripId() { + return strip_id; + } + public void setStripId(Integer strip_id) { + this.strip_id = strip_id; + } + public Float getSunAzimuth() { + return sun_azimuth; + } + public void setSunAzimuth(Float sun_azimuth) { + this.sun_azimuth = sun_azimuth; + } + public Float getSunElevation() { + return sun_elevation; + } + public void setSunElevation(Float sun_elevation) { + this.sun_elevation = sun_elevation; + } + public Date getUpdated() { + return updated; + } + public void setUpdated(Date updated) { + this.updated = updated; + } + public Float getViewAngle() { + return view_angle; + } + public void setViewAngle(Float view_angle) { + this.view_angle = view_angle; + } + public Integer getVisibleConfidencePercent() { + return visible_confidence_percent; + } + public void setVisibleConfidencePercent(Integer visible_confidence_percent) { + this.visible_confidence_percent = visible_confidence_percent; + } + public Integer getVisiblePercent() { + return visible_percent; + } + public void setVisiblePercent(Integer visible_percent) { + this.visible_percent = visible_percent; + } + + } From 3ae905cf512b65e4b8f20dc343a7d4cf5fef72e2 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:15 +0100 Subject: [PATCH 1503/1620] New translations FeatureProperties.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 226 ++++++++++++++++-- 1 file changed, 209 insertions(+), 17 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 11f4ff87a6..cd7f57b2a1 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,27 +1,219 @@ package org.openforis.collect.earth.planet; -public class Filter { +import java.util.Date; - FilterType type; - String field_name; - e config; - - public FilterType getType() { - return type; +public class FeatureProperties { + + Date acquired; + Float anomalous_pixels; + Integer clear_confidence_percent; + Integer clear_percent; + Float cloud_cover; + Integer cloud_percent; + Integer columns; + String epsg_code; + Boolean ground_control; + Integer heavy_haze_percent; + String instrument; + String item_type; + Integer light_haze_percent; + Integer origin_x; + Integer origin_y; + Float pixel_resolution; + String provider; + Date published; + String quality_category; + Integer rows; + String satellite_id; + Integer shadow_percent; + Integer snow_ice_percent; + Integer strip_id; + Float sun_azimuth; + Float sun_elevation; + Date updated; + Float view_angle; + Integer visible_confidence_percent; + Integer visible_percent; + public Date getAcquired() { + return acquired; + } + public void setAcquired(Date acquired) { + this.acquired = acquired; + } + public Float getAnomalousPixels() { + return anomalous_pixels; + } + public void setAnomalousPixels(Float anomalous_pixels) { + this.anomalous_pixels = anomalous_pixels; + } + public Integer getClearConfidence_percent() { + return clear_confidence_percent; + } + public void setClearConfidencePercent(Integer clear_confidence_percent) { + this.clear_confidence_percent = clear_confidence_percent; + } + public Integer getClearPercent() { + return clear_percent; + } + public void setClearPercent(Integer clear_percent) { + this.clear_percent = clear_percent; + } + public Float getCloudCover() { + return cloud_cover; + } + public void setCloudCover(Float cloud_cover) { + this.cloud_cover = cloud_cover; + } + public Integer getCloudPercent() { + return cloud_percent; + } + public void setCloudPercent(Integer cloud_percent) { + this.cloud_percent = cloud_percent; + } + public Integer getColumns() { + return columns; + } + public void setColumns(Integer columns) { + this.columns = columns; + } + public String getEpsgCode() { + return epsg_code; + } + public void setEpsgCode(String epsg_code) { + this.epsg_code = epsg_code; + } + public Boolean getGroundControl() { + return ground_control; + } + public void setGroundControl(Boolean ground_control) { + this.ground_control = ground_control; + } + public Integer getHeavyHazePercent() { + return heavy_haze_percent; + } + public void setHeavyHazePercent(Integer heavy_haze_percent) { + this.heavy_haze_percent = heavy_haze_percent; + } + public String getInstrument() { + return instrument; + } + public void setInstrument(String instrument) { + this.instrument = instrument; + } + public String getItemType() { + return item_type; + } + public void setItemType(String item_type) { + this.item_type = item_type; + } + public Integer getLightHaze_percent() { + return light_haze_percent; + } + public void setLightHazePercent(Integer light_haze_percent) { + this.light_haze_percent = light_haze_percent; + } + public Integer getOriginX() { + return origin_x; + } + public void setOriginX(Integer origin_x) { + this.origin_x = origin_x; } - public void setType(FilterType type) { - this.type = type; + public Integer getOriginY() { + return origin_y; } - public String getFieldName() { - return field_name; + public void setOriginY(Integer origin_y) { + this.origin_y = origin_y; } - public void setFieldName(String field_name) { - this.field_name = field_name; + public Float getPixelResolution() { + return pixel_resolution; } - public e getConfig() { - return config; + public void setPixelResolution(Float pixel_resolution) { + this.pixel_resolution = pixel_resolution; } - public void setConfig(e config) { - this.config = config; + public String getProvider() { + return provider; } + public void setProvider(String provider) { + this.provider = provider; + } + public Date getPublished() { + return published; + } + public void setPublished(Date published) { + this.published = published; + } + public String getQualityCategory() { + return quality_category; + } + public void setQualityCategory(String quality_category) { + this.quality_category = quality_category; + } + public Integer getRows() { + return rows; + } + public void setRows(Integer rows) { + this.rows = rows; + } + public String getSatelliteId() { + return satellite_id; + } + public void setSatelliteId(String satellite_id) { + this.satellite_id = satellite_id; + } + public Integer getShadowPercent() { + return shadow_percent; + } + public void setShadowPercent(Integer shadow_percent) { + this.shadow_percent = shadow_percent; + } + public Integer getSnowIcePercent() { + return snow_ice_percent; + } + public void setSnowIcePercent(Integer snow_ice_percent) { + this.snow_ice_percent = snow_ice_percent; + } + public Integer getStripId() { + return strip_id; + } + public void setStripId(Integer strip_id) { + this.strip_id = strip_id; + } + public Float getSunAzimuth() { + return sun_azimuth; + } + public void setSunAzimuth(Float sun_azimuth) { + this.sun_azimuth = sun_azimuth; + } + public Float getSunElevation() { + return sun_elevation; + } + public void setSunElevation(Float sun_elevation) { + this.sun_elevation = sun_elevation; + } + public Date getUpdated() { + return updated; + } + public void setUpdated(Date updated) { + this.updated = updated; + } + public Float getViewAngle() { + return view_angle; + } + public void setViewAngle(Float view_angle) { + this.view_angle = view_angle; + } + public Integer getVisibleConfidencePercent() { + return visible_confidence_percent; + } + public void setVisibleConfidencePercent(Integer visible_confidence_percent) { + this.visible_confidence_percent = visible_confidence_percent; + } + public Integer getVisiblePercent() { + return visible_percent; + } + public void setVisiblePercent(Integer visible_percent) { + this.visible_percent = visible_percent; + } + + } From 59b68ee21e6445b55d37ab0b7b33f7b3a92ad871 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:16 +0100 Subject: [PATCH 1504/1620] New translations FeatureProperties.java (English) --- .../earth/app/view/Messages_en.properties | 231 ++++++++++++++++-- 1 file changed, 209 insertions(+), 22 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index d3d85cb7ab..cd7f57b2a1 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,32 +1,219 @@ package org.openforis.collect.earth.planet; -public class Feature { +import java.util.Date; - FeatureProperties properties; - String id; +public class FeatureProperties { - public FeatureProperties getProperties() { - return properties; + Date acquired; + Float anomalous_pixels; + Integer clear_confidence_percent; + Integer clear_percent; + Float cloud_cover; + Integer cloud_percent; + Integer columns; + String epsg_code; + Boolean ground_control; + Integer heavy_haze_percent; + String instrument; + String item_type; + Integer light_haze_percent; + Integer origin_x; + Integer origin_y; + Float pixel_resolution; + String provider; + Date published; + String quality_category; + Integer rows; + String satellite_id; + Integer shadow_percent; + Integer snow_ice_percent; + Integer strip_id; + Float sun_azimuth; + Float sun_elevation; + Date updated; + Float view_angle; + Integer visible_confidence_percent; + Integer visible_percent; + public Date getAcquired() { + return acquired; } - - public void setProperties(FeatureProperties properties) { - this.properties = properties; + public void setAcquired(Date acquired) { + this.acquired = acquired; } - - public String getId() { - return id; + public Float getAnomalousPixels() { + return anomalous_pixels; } - - public void setId(String id) { - this.id = id; + public void setAnomalousPixels(Float anomalous_pixels) { + this.anomalous_pixels = anomalous_pixels; } - - @Override - public String toString() { - return id + - " - cloud percent " + (properties.getCloudPercent()!=null?properties.getCloudPercent():"NULL") + - " - visible confidence percent " + (properties.getVisibleConfidencePercent()!=null?properties.getVisibleConfidencePercent():"NULL") + - " - cloud cover " + (properties.getCloudCover()!=null?properties.getCloudCover():"NULL") + - " - item type " + properties.getItemType() + "\n"; + public Integer getClearConfidence_percent() { + return clear_confidence_percent; + } + public void setClearConfidencePercent(Integer clear_confidence_percent) { + this.clear_confidence_percent = clear_confidence_percent; + } + public Integer getClearPercent() { + return clear_percent; + } + public void setClearPercent(Integer clear_percent) { + this.clear_percent = clear_percent; + } + public Float getCloudCover() { + return cloud_cover; + } + public void setCloudCover(Float cloud_cover) { + this.cloud_cover = cloud_cover; + } + public Integer getCloudPercent() { + return cloud_percent; + } + public void setCloudPercent(Integer cloud_percent) { + this.cloud_percent = cloud_percent; + } + public Integer getColumns() { + return columns; + } + public void setColumns(Integer columns) { + this.columns = columns; + } + public String getEpsgCode() { + return epsg_code; + } + public void setEpsgCode(String epsg_code) { + this.epsg_code = epsg_code; + } + public Boolean getGroundControl() { + return ground_control; + } + public void setGroundControl(Boolean ground_control) { + this.ground_control = ground_control; + } + public Integer getHeavyHazePercent() { + return heavy_haze_percent; + } + public void setHeavyHazePercent(Integer heavy_haze_percent) { + this.heavy_haze_percent = heavy_haze_percent; + } + public String getInstrument() { + return instrument; + } + public void setInstrument(String instrument) { + this.instrument = instrument; + } + public String getItemType() { + return item_type; + } + public void setItemType(String item_type) { + this.item_type = item_type; + } + public Integer getLightHaze_percent() { + return light_haze_percent; + } + public void setLightHazePercent(Integer light_haze_percent) { + this.light_haze_percent = light_haze_percent; + } + public Integer getOriginX() { + return origin_x; + } + public void setOriginX(Integer origin_x) { + this.origin_x = origin_x; + } + public Integer getOriginY() { + return origin_y; + } + public void setOriginY(Integer origin_y) { + this.origin_y = origin_y; + } + public Float getPixelResolution() { + return pixel_resolution; + } + public void setPixelResolution(Float pixel_resolution) { + this.pixel_resolution = pixel_resolution; } + public String getProvider() { + return provider; + } + public void setProvider(String provider) { + this.provider = provider; + } + public Date getPublished() { + return published; + } + public void setPublished(Date published) { + this.published = published; + } + public String getQualityCategory() { + return quality_category; + } + public void setQualityCategory(String quality_category) { + this.quality_category = quality_category; + } + public Integer getRows() { + return rows; + } + public void setRows(Integer rows) { + this.rows = rows; + } + public String getSatelliteId() { + return satellite_id; + } + public void setSatelliteId(String satellite_id) { + this.satellite_id = satellite_id; + } + public Integer getShadowPercent() { + return shadow_percent; + } + public void setShadowPercent(Integer shadow_percent) { + this.shadow_percent = shadow_percent; + } + public Integer getSnowIcePercent() { + return snow_ice_percent; + } + public void setSnowIcePercent(Integer snow_ice_percent) { + this.snow_ice_percent = snow_ice_percent; + } + public Integer getStripId() { + return strip_id; + } + public void setStripId(Integer strip_id) { + this.strip_id = strip_id; + } + public Float getSunAzimuth() { + return sun_azimuth; + } + public void setSunAzimuth(Float sun_azimuth) { + this.sun_azimuth = sun_azimuth; + } + public Float getSunElevation() { + return sun_elevation; + } + public void setSunElevation(Float sun_elevation) { + this.sun_elevation = sun_elevation; + } + public Date getUpdated() { + return updated; + } + public void setUpdated(Date updated) { + this.updated = updated; + } + public Float getViewAngle() { + return view_angle; + } + public void setViewAngle(Float view_angle) { + this.view_angle = view_angle; + } + public Integer getVisibleConfidencePercent() { + return visible_confidence_percent; + } + public void setVisibleConfidencePercent(Integer visible_confidence_percent) { + this.visible_confidence_percent = visible_confidence_percent; + } + public Integer getVisiblePercent() { + return visible_percent; + } + public void setVisiblePercent(Integer visible_percent) { + this.visible_percent = visible_percent; + } + + } From e18e06a85849127fc60bbabc5126cbcdf6f97cce Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:18 +0100 Subject: [PATCH 1505/1620] New translations FeatureSorter.java (French) --- .../earth/app/view/Messages_fr.properties | 253 +++--------------- 1 file changed, 34 insertions(+), 219 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index cd7f57b2a1..1e116c4a2d 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,219 +1,34 @@ -package org.openforis.collect.earth.planet; - -import java.util.Date; - -public class FeatureProperties { - - Date acquired; - Float anomalous_pixels; - Integer clear_confidence_percent; - Integer clear_percent; - Float cloud_cover; - Integer cloud_percent; - Integer columns; - String epsg_code; - Boolean ground_control; - Integer heavy_haze_percent; - String instrument; - String item_type; - Integer light_haze_percent; - Integer origin_x; - Integer origin_y; - Float pixel_resolution; - String provider; - Date published; - String quality_category; - Integer rows; - String satellite_id; - Integer shadow_percent; - Integer snow_ice_percent; - Integer strip_id; - Float sun_azimuth; - Float sun_elevation; - Date updated; - Float view_angle; - Integer visible_confidence_percent; - Integer visible_percent; - public Date getAcquired() { - return acquired; - } - public void setAcquired(Date acquired) { - this.acquired = acquired; - } - public Float getAnomalousPixels() { - return anomalous_pixels; - } - public void setAnomalousPixels(Float anomalous_pixels) { - this.anomalous_pixels = anomalous_pixels; - } - public Integer getClearConfidence_percent() { - return clear_confidence_percent; - } - public void setClearConfidencePercent(Integer clear_confidence_percent) { - this.clear_confidence_percent = clear_confidence_percent; - } - public Integer getClearPercent() { - return clear_percent; - } - public void setClearPercent(Integer clear_percent) { - this.clear_percent = clear_percent; - } - public Float getCloudCover() { - return cloud_cover; - } - public void setCloudCover(Float cloud_cover) { - this.cloud_cover = cloud_cover; - } - public Integer getCloudPercent() { - return cloud_percent; - } - public void setCloudPercent(Integer cloud_percent) { - this.cloud_percent = cloud_percent; - } - public Integer getColumns() { - return columns; - } - public void setColumns(Integer columns) { - this.columns = columns; - } - public String getEpsgCode() { - return epsg_code; - } - public void setEpsgCode(String epsg_code) { - this.epsg_code = epsg_code; - } - public Boolean getGroundControl() { - return ground_control; - } - public void setGroundControl(Boolean ground_control) { - this.ground_control = ground_control; - } - public Integer getHeavyHazePercent() { - return heavy_haze_percent; - } - public void setHeavyHazePercent(Integer heavy_haze_percent) { - this.heavy_haze_percent = heavy_haze_percent; - } - public String getInstrument() { - return instrument; - } - public void setInstrument(String instrument) { - this.instrument = instrument; - } - public String getItemType() { - return item_type; - } - public void setItemType(String item_type) { - this.item_type = item_type; - } - public Integer getLightHaze_percent() { - return light_haze_percent; - } - public void setLightHazePercent(Integer light_haze_percent) { - this.light_haze_percent = light_haze_percent; - } - public Integer getOriginX() { - return origin_x; - } - public void setOriginX(Integer origin_x) { - this.origin_x = origin_x; - } - public Integer getOriginY() { - return origin_y; - } - public void setOriginY(Integer origin_y) { - this.origin_y = origin_y; - } - public Float getPixelResolution() { - return pixel_resolution; - } - public void setPixelResolution(Float pixel_resolution) { - this.pixel_resolution = pixel_resolution; - } - public String getProvider() { - return provider; - } - public void setProvider(String provider) { - this.provider = provider; - } - public Date getPublished() { - return published; - } - public void setPublished(Date published) { - this.published = published; - } - public String getQualityCategory() { - return quality_category; - } - public void setQualityCategory(String quality_category) { - this.quality_category = quality_category; - } - public Integer getRows() { - return rows; - } - public void setRows(Integer rows) { - this.rows = rows; - } - public String getSatelliteId() { - return satellite_id; - } - public void setSatelliteId(String satellite_id) { - this.satellite_id = satellite_id; - } - public Integer getShadowPercent() { - return shadow_percent; - } - public void setShadowPercent(Integer shadow_percent) { - this.shadow_percent = shadow_percent; - } - public Integer getSnowIcePercent() { - return snow_ice_percent; - } - public void setSnowIcePercent(Integer snow_ice_percent) { - this.snow_ice_percent = snow_ice_percent; - } - public Integer getStripId() { - return strip_id; - } - public void setStripId(Integer strip_id) { - this.strip_id = strip_id; - } - public Float getSunAzimuth() { - return sun_azimuth; - } - public void setSunAzimuth(Float sun_azimuth) { - this.sun_azimuth = sun_azimuth; - } - public Float getSunElevation() { - return sun_elevation; - } - public void setSunElevation(Float sun_elevation) { - this.sun_elevation = sun_elevation; - } - public Date getUpdated() { - return updated; - } - public void setUpdated(Date updated) { - this.updated = updated; - } - public Float getViewAngle() { - return view_angle; - } - public void setViewAngle(Float view_angle) { - this.view_angle = view_angle; - } - public Integer getVisibleConfidencePercent() { - return visible_confidence_percent; - } - public void setVisibleConfidencePercent(Integer visible_confidence_percent) { - this.visible_confidence_percent = visible_confidence_percent; - } - public Integer getVisiblePercent() { - return visible_percent; - } - public void setVisiblePercent(Integer visible_percent) { - this.visible_percent = visible_percent; - } - - -} +package org.openforis.collect.earth.planet; + +import java.util.Comparator;; + +public class FeatureSorter implements Comparator{ + + @Override + public int compare(Feature o1, Feature o2) { + if( o1.getProperties().getCloudPercent() !=null && o2.getProperties().getCloudPercent() != null ) { + if( o1.getProperties().getCloudPercent().equals( o2.getProperties().getCloudPercent() ) ) { + if( o2.getProperties().getVisibleConfidencePercent() !=null && o1.getProperties().getVisibleConfidencePercent() != null ) { + return o2.getProperties().getVisibleConfidencePercent() - o1.getProperties().getVisibleConfidencePercent(); + }else if( o2.getProperties().getVisibleConfidencePercent() !=null ) { + return 1; + }else{ + return -1; + } + }else { + return o1.getProperties().getCloudPercent() - o2.getProperties().getCloudPercent(); + } + }else if( o1.getProperties().getCloudPercent() != null ) { + return -1; + }else if( o2.getProperties().getCloudPercent() != null) { + return 1; + }else { + if( o1.getProperties().getCloudCover()!=null && o2.getProperties().getCloudCover()!=null ) { + return (int) ( (o1.getProperties().getCloudCover() - o2.getProperties().getCloudCover() ) * 100 ); + } else { + return 1; // No way to know so return the latest + } + } + } + +} From 6d869855e429eefd799fb87e4c9cf1f4d99537a3 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:19 +0100 Subject: [PATCH 1506/1620] New translations FeatureSorter.java (Spanish) --- .../earth/app/view/Messages_es.properties | 253 +++--------------- 1 file changed, 34 insertions(+), 219 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index cd7f57b2a1..1e116c4a2d 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,219 +1,34 @@ -package org.openforis.collect.earth.planet; - -import java.util.Date; - -public class FeatureProperties { - - Date acquired; - Float anomalous_pixels; - Integer clear_confidence_percent; - Integer clear_percent; - Float cloud_cover; - Integer cloud_percent; - Integer columns; - String epsg_code; - Boolean ground_control; - Integer heavy_haze_percent; - String instrument; - String item_type; - Integer light_haze_percent; - Integer origin_x; - Integer origin_y; - Float pixel_resolution; - String provider; - Date published; - String quality_category; - Integer rows; - String satellite_id; - Integer shadow_percent; - Integer snow_ice_percent; - Integer strip_id; - Float sun_azimuth; - Float sun_elevation; - Date updated; - Float view_angle; - Integer visible_confidence_percent; - Integer visible_percent; - public Date getAcquired() { - return acquired; - } - public void setAcquired(Date acquired) { - this.acquired = acquired; - } - public Float getAnomalousPixels() { - return anomalous_pixels; - } - public void setAnomalousPixels(Float anomalous_pixels) { - this.anomalous_pixels = anomalous_pixels; - } - public Integer getClearConfidence_percent() { - return clear_confidence_percent; - } - public void setClearConfidencePercent(Integer clear_confidence_percent) { - this.clear_confidence_percent = clear_confidence_percent; - } - public Integer getClearPercent() { - return clear_percent; - } - public void setClearPercent(Integer clear_percent) { - this.clear_percent = clear_percent; - } - public Float getCloudCover() { - return cloud_cover; - } - public void setCloudCover(Float cloud_cover) { - this.cloud_cover = cloud_cover; - } - public Integer getCloudPercent() { - return cloud_percent; - } - public void setCloudPercent(Integer cloud_percent) { - this.cloud_percent = cloud_percent; - } - public Integer getColumns() { - return columns; - } - public void setColumns(Integer columns) { - this.columns = columns; - } - public String getEpsgCode() { - return epsg_code; - } - public void setEpsgCode(String epsg_code) { - this.epsg_code = epsg_code; - } - public Boolean getGroundControl() { - return ground_control; - } - public void setGroundControl(Boolean ground_control) { - this.ground_control = ground_control; - } - public Integer getHeavyHazePercent() { - return heavy_haze_percent; - } - public void setHeavyHazePercent(Integer heavy_haze_percent) { - this.heavy_haze_percent = heavy_haze_percent; - } - public String getInstrument() { - return instrument; - } - public void setInstrument(String instrument) { - this.instrument = instrument; - } - public String getItemType() { - return item_type; - } - public void setItemType(String item_type) { - this.item_type = item_type; - } - public Integer getLightHaze_percent() { - return light_haze_percent; - } - public void setLightHazePercent(Integer light_haze_percent) { - this.light_haze_percent = light_haze_percent; - } - public Integer getOriginX() { - return origin_x; - } - public void setOriginX(Integer origin_x) { - this.origin_x = origin_x; - } - public Integer getOriginY() { - return origin_y; - } - public void setOriginY(Integer origin_y) { - this.origin_y = origin_y; - } - public Float getPixelResolution() { - return pixel_resolution; - } - public void setPixelResolution(Float pixel_resolution) { - this.pixel_resolution = pixel_resolution; - } - public String getProvider() { - return provider; - } - public void setProvider(String provider) { - this.provider = provider; - } - public Date getPublished() { - return published; - } - public void setPublished(Date published) { - this.published = published; - } - public String getQualityCategory() { - return quality_category; - } - public void setQualityCategory(String quality_category) { - this.quality_category = quality_category; - } - public Integer getRows() { - return rows; - } - public void setRows(Integer rows) { - this.rows = rows; - } - public String getSatelliteId() { - return satellite_id; - } - public void setSatelliteId(String satellite_id) { - this.satellite_id = satellite_id; - } - public Integer getShadowPercent() { - return shadow_percent; - } - public void setShadowPercent(Integer shadow_percent) { - this.shadow_percent = shadow_percent; - } - public Integer getSnowIcePercent() { - return snow_ice_percent; - } - public void setSnowIcePercent(Integer snow_ice_percent) { - this.snow_ice_percent = snow_ice_percent; - } - public Integer getStripId() { - return strip_id; - } - public void setStripId(Integer strip_id) { - this.strip_id = strip_id; - } - public Float getSunAzimuth() { - return sun_azimuth; - } - public void setSunAzimuth(Float sun_azimuth) { - this.sun_azimuth = sun_azimuth; - } - public Float getSunElevation() { - return sun_elevation; - } - public void setSunElevation(Float sun_elevation) { - this.sun_elevation = sun_elevation; - } - public Date getUpdated() { - return updated; - } - public void setUpdated(Date updated) { - this.updated = updated; - } - public Float getViewAngle() { - return view_angle; - } - public void setViewAngle(Float view_angle) { - this.view_angle = view_angle; - } - public Integer getVisibleConfidencePercent() { - return visible_confidence_percent; - } - public void setVisibleConfidencePercent(Integer visible_confidence_percent) { - this.visible_confidence_percent = visible_confidence_percent; - } - public Integer getVisiblePercent() { - return visible_percent; - } - public void setVisiblePercent(Integer visible_percent) { - this.visible_percent = visible_percent; - } - - -} +package org.openforis.collect.earth.planet; + +import java.util.Comparator;; + +public class FeatureSorter implements Comparator{ + + @Override + public int compare(Feature o1, Feature o2) { + if( o1.getProperties().getCloudPercent() !=null && o2.getProperties().getCloudPercent() != null ) { + if( o1.getProperties().getCloudPercent().equals( o2.getProperties().getCloudPercent() ) ) { + if( o2.getProperties().getVisibleConfidencePercent() !=null && o1.getProperties().getVisibleConfidencePercent() != null ) { + return o2.getProperties().getVisibleConfidencePercent() - o1.getProperties().getVisibleConfidencePercent(); + }else if( o2.getProperties().getVisibleConfidencePercent() !=null ) { + return 1; + }else{ + return -1; + } + }else { + return o1.getProperties().getCloudPercent() - o2.getProperties().getCloudPercent(); + } + }else if( o1.getProperties().getCloudPercent() != null ) { + return -1; + }else if( o2.getProperties().getCloudPercent() != null) { + return 1; + }else { + if( o1.getProperties().getCloudCover()!=null && o2.getProperties().getCloudCover()!=null ) { + return (int) ( (o1.getProperties().getCloudCover() - o2.getProperties().getCloudCover() ) * 100 ); + } else { + return 1; // No way to know so return the latest + } + } + } + +} From a7607d5b988fc7426bbcb65d5357ad153fb2e183 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:20 +0100 Subject: [PATCH 1507/1620] New translations FeatureSorter.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 253 +++--------------- 1 file changed, 34 insertions(+), 219 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index cd7f57b2a1..1e116c4a2d 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,219 +1,34 @@ -package org.openforis.collect.earth.planet; - -import java.util.Date; - -public class FeatureProperties { - - Date acquired; - Float anomalous_pixels; - Integer clear_confidence_percent; - Integer clear_percent; - Float cloud_cover; - Integer cloud_percent; - Integer columns; - String epsg_code; - Boolean ground_control; - Integer heavy_haze_percent; - String instrument; - String item_type; - Integer light_haze_percent; - Integer origin_x; - Integer origin_y; - Float pixel_resolution; - String provider; - Date published; - String quality_category; - Integer rows; - String satellite_id; - Integer shadow_percent; - Integer snow_ice_percent; - Integer strip_id; - Float sun_azimuth; - Float sun_elevation; - Date updated; - Float view_angle; - Integer visible_confidence_percent; - Integer visible_percent; - public Date getAcquired() { - return acquired; - } - public void setAcquired(Date acquired) { - this.acquired = acquired; - } - public Float getAnomalousPixels() { - return anomalous_pixels; - } - public void setAnomalousPixels(Float anomalous_pixels) { - this.anomalous_pixels = anomalous_pixels; - } - public Integer getClearConfidence_percent() { - return clear_confidence_percent; - } - public void setClearConfidencePercent(Integer clear_confidence_percent) { - this.clear_confidence_percent = clear_confidence_percent; - } - public Integer getClearPercent() { - return clear_percent; - } - public void setClearPercent(Integer clear_percent) { - this.clear_percent = clear_percent; - } - public Float getCloudCover() { - return cloud_cover; - } - public void setCloudCover(Float cloud_cover) { - this.cloud_cover = cloud_cover; - } - public Integer getCloudPercent() { - return cloud_percent; - } - public void setCloudPercent(Integer cloud_percent) { - this.cloud_percent = cloud_percent; - } - public Integer getColumns() { - return columns; - } - public void setColumns(Integer columns) { - this.columns = columns; - } - public String getEpsgCode() { - return epsg_code; - } - public void setEpsgCode(String epsg_code) { - this.epsg_code = epsg_code; - } - public Boolean getGroundControl() { - return ground_control; - } - public void setGroundControl(Boolean ground_control) { - this.ground_control = ground_control; - } - public Integer getHeavyHazePercent() { - return heavy_haze_percent; - } - public void setHeavyHazePercent(Integer heavy_haze_percent) { - this.heavy_haze_percent = heavy_haze_percent; - } - public String getInstrument() { - return instrument; - } - public void setInstrument(String instrument) { - this.instrument = instrument; - } - public String getItemType() { - return item_type; - } - public void setItemType(String item_type) { - this.item_type = item_type; - } - public Integer getLightHaze_percent() { - return light_haze_percent; - } - public void setLightHazePercent(Integer light_haze_percent) { - this.light_haze_percent = light_haze_percent; - } - public Integer getOriginX() { - return origin_x; - } - public void setOriginX(Integer origin_x) { - this.origin_x = origin_x; - } - public Integer getOriginY() { - return origin_y; - } - public void setOriginY(Integer origin_y) { - this.origin_y = origin_y; - } - public Float getPixelResolution() { - return pixel_resolution; - } - public void setPixelResolution(Float pixel_resolution) { - this.pixel_resolution = pixel_resolution; - } - public String getProvider() { - return provider; - } - public void setProvider(String provider) { - this.provider = provider; - } - public Date getPublished() { - return published; - } - public void setPublished(Date published) { - this.published = published; - } - public String getQualityCategory() { - return quality_category; - } - public void setQualityCategory(String quality_category) { - this.quality_category = quality_category; - } - public Integer getRows() { - return rows; - } - public void setRows(Integer rows) { - this.rows = rows; - } - public String getSatelliteId() { - return satellite_id; - } - public void setSatelliteId(String satellite_id) { - this.satellite_id = satellite_id; - } - public Integer getShadowPercent() { - return shadow_percent; - } - public void setShadowPercent(Integer shadow_percent) { - this.shadow_percent = shadow_percent; - } - public Integer getSnowIcePercent() { - return snow_ice_percent; - } - public void setSnowIcePercent(Integer snow_ice_percent) { - this.snow_ice_percent = snow_ice_percent; - } - public Integer getStripId() { - return strip_id; - } - public void setStripId(Integer strip_id) { - this.strip_id = strip_id; - } - public Float getSunAzimuth() { - return sun_azimuth; - } - public void setSunAzimuth(Float sun_azimuth) { - this.sun_azimuth = sun_azimuth; - } - public Float getSunElevation() { - return sun_elevation; - } - public void setSunElevation(Float sun_elevation) { - this.sun_elevation = sun_elevation; - } - public Date getUpdated() { - return updated; - } - public void setUpdated(Date updated) { - this.updated = updated; - } - public Float getViewAngle() { - return view_angle; - } - public void setViewAngle(Float view_angle) { - this.view_angle = view_angle; - } - public Integer getVisibleConfidencePercent() { - return visible_confidence_percent; - } - public void setVisibleConfidencePercent(Integer visible_confidence_percent) { - this.visible_confidence_percent = visible_confidence_percent; - } - public Integer getVisiblePercent() { - return visible_percent; - } - public void setVisiblePercent(Integer visible_percent) { - this.visible_percent = visible_percent; - } - - -} +package org.openforis.collect.earth.planet; + +import java.util.Comparator;; + +public class FeatureSorter implements Comparator{ + + @Override + public int compare(Feature o1, Feature o2) { + if( o1.getProperties().getCloudPercent() !=null && o2.getProperties().getCloudPercent() != null ) { + if( o1.getProperties().getCloudPercent().equals( o2.getProperties().getCloudPercent() ) ) { + if( o2.getProperties().getVisibleConfidencePercent() !=null && o1.getProperties().getVisibleConfidencePercent() != null ) { + return o2.getProperties().getVisibleConfidencePercent() - o1.getProperties().getVisibleConfidencePercent(); + }else if( o2.getProperties().getVisibleConfidencePercent() !=null ) { + return 1; + }else{ + return -1; + } + }else { + return o1.getProperties().getCloudPercent() - o2.getProperties().getCloudPercent(); + } + }else if( o1.getProperties().getCloudPercent() != null ) { + return -1; + }else if( o2.getProperties().getCloudPercent() != null) { + return 1; + }else { + if( o1.getProperties().getCloudCover()!=null && o2.getProperties().getCloudCover()!=null ) { + return (int) ( (o1.getProperties().getCloudCover() - o2.getProperties().getCloudCover() ) * 100 ); + } else { + return 1; // No way to know so return the latest + } + } + } + +} From 96b97b221a0974521ad839edbaa0b13035e6da28 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:21 +0100 Subject: [PATCH 1508/1620] New translations FeatureSorter.java (English) --- .../earth/app/view/Messages_en.properties | 253 +++--------------- 1 file changed, 34 insertions(+), 219 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index cd7f57b2a1..1e116c4a2d 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,219 +1,34 @@ -package org.openforis.collect.earth.planet; - -import java.util.Date; - -public class FeatureProperties { - - Date acquired; - Float anomalous_pixels; - Integer clear_confidence_percent; - Integer clear_percent; - Float cloud_cover; - Integer cloud_percent; - Integer columns; - String epsg_code; - Boolean ground_control; - Integer heavy_haze_percent; - String instrument; - String item_type; - Integer light_haze_percent; - Integer origin_x; - Integer origin_y; - Float pixel_resolution; - String provider; - Date published; - String quality_category; - Integer rows; - String satellite_id; - Integer shadow_percent; - Integer snow_ice_percent; - Integer strip_id; - Float sun_azimuth; - Float sun_elevation; - Date updated; - Float view_angle; - Integer visible_confidence_percent; - Integer visible_percent; - public Date getAcquired() { - return acquired; - } - public void setAcquired(Date acquired) { - this.acquired = acquired; - } - public Float getAnomalousPixels() { - return anomalous_pixels; - } - public void setAnomalousPixels(Float anomalous_pixels) { - this.anomalous_pixels = anomalous_pixels; - } - public Integer getClearConfidence_percent() { - return clear_confidence_percent; - } - public void setClearConfidencePercent(Integer clear_confidence_percent) { - this.clear_confidence_percent = clear_confidence_percent; - } - public Integer getClearPercent() { - return clear_percent; - } - public void setClearPercent(Integer clear_percent) { - this.clear_percent = clear_percent; - } - public Float getCloudCover() { - return cloud_cover; - } - public void setCloudCover(Float cloud_cover) { - this.cloud_cover = cloud_cover; - } - public Integer getCloudPercent() { - return cloud_percent; - } - public void setCloudPercent(Integer cloud_percent) { - this.cloud_percent = cloud_percent; - } - public Integer getColumns() { - return columns; - } - public void setColumns(Integer columns) { - this.columns = columns; - } - public String getEpsgCode() { - return epsg_code; - } - public void setEpsgCode(String epsg_code) { - this.epsg_code = epsg_code; - } - public Boolean getGroundControl() { - return ground_control; - } - public void setGroundControl(Boolean ground_control) { - this.ground_control = ground_control; - } - public Integer getHeavyHazePercent() { - return heavy_haze_percent; - } - public void setHeavyHazePercent(Integer heavy_haze_percent) { - this.heavy_haze_percent = heavy_haze_percent; - } - public String getInstrument() { - return instrument; - } - public void setInstrument(String instrument) { - this.instrument = instrument; - } - public String getItemType() { - return item_type; - } - public void setItemType(String item_type) { - this.item_type = item_type; - } - public Integer getLightHaze_percent() { - return light_haze_percent; - } - public void setLightHazePercent(Integer light_haze_percent) { - this.light_haze_percent = light_haze_percent; - } - public Integer getOriginX() { - return origin_x; - } - public void setOriginX(Integer origin_x) { - this.origin_x = origin_x; - } - public Integer getOriginY() { - return origin_y; - } - public void setOriginY(Integer origin_y) { - this.origin_y = origin_y; - } - public Float getPixelResolution() { - return pixel_resolution; - } - public void setPixelResolution(Float pixel_resolution) { - this.pixel_resolution = pixel_resolution; - } - public String getProvider() { - return provider; - } - public void setProvider(String provider) { - this.provider = provider; - } - public Date getPublished() { - return published; - } - public void setPublished(Date published) { - this.published = published; - } - public String getQualityCategory() { - return quality_category; - } - public void setQualityCategory(String quality_category) { - this.quality_category = quality_category; - } - public Integer getRows() { - return rows; - } - public void setRows(Integer rows) { - this.rows = rows; - } - public String getSatelliteId() { - return satellite_id; - } - public void setSatelliteId(String satellite_id) { - this.satellite_id = satellite_id; - } - public Integer getShadowPercent() { - return shadow_percent; - } - public void setShadowPercent(Integer shadow_percent) { - this.shadow_percent = shadow_percent; - } - public Integer getSnowIcePercent() { - return snow_ice_percent; - } - public void setSnowIcePercent(Integer snow_ice_percent) { - this.snow_ice_percent = snow_ice_percent; - } - public Integer getStripId() { - return strip_id; - } - public void setStripId(Integer strip_id) { - this.strip_id = strip_id; - } - public Float getSunAzimuth() { - return sun_azimuth; - } - public void setSunAzimuth(Float sun_azimuth) { - this.sun_azimuth = sun_azimuth; - } - public Float getSunElevation() { - return sun_elevation; - } - public void setSunElevation(Float sun_elevation) { - this.sun_elevation = sun_elevation; - } - public Date getUpdated() { - return updated; - } - public void setUpdated(Date updated) { - this.updated = updated; - } - public Float getViewAngle() { - return view_angle; - } - public void setViewAngle(Float view_angle) { - this.view_angle = view_angle; - } - public Integer getVisibleConfidencePercent() { - return visible_confidence_percent; - } - public void setVisibleConfidencePercent(Integer visible_confidence_percent) { - this.visible_confidence_percent = visible_confidence_percent; - } - public Integer getVisiblePercent() { - return visible_percent; - } - public void setVisiblePercent(Integer visible_percent) { - this.visible_percent = visible_percent; - } - - -} +package org.openforis.collect.earth.planet; + +import java.util.Comparator;; + +public class FeatureSorter implements Comparator{ + + @Override + public int compare(Feature o1, Feature o2) { + if( o1.getProperties().getCloudPercent() !=null && o2.getProperties().getCloudPercent() != null ) { + if( o1.getProperties().getCloudPercent().equals( o2.getProperties().getCloudPercent() ) ) { + if( o2.getProperties().getVisibleConfidencePercent() !=null && o1.getProperties().getVisibleConfidencePercent() != null ) { + return o2.getProperties().getVisibleConfidencePercent() - o1.getProperties().getVisibleConfidencePercent(); + }else if( o2.getProperties().getVisibleConfidencePercent() !=null ) { + return 1; + }else{ + return -1; + } + }else { + return o1.getProperties().getCloudPercent() - o2.getProperties().getCloudPercent(); + } + }else if( o1.getProperties().getCloudPercent() != null ) { + return -1; + }else if( o2.getProperties().getCloudPercent() != null) { + return 1; + }else { + if( o1.getProperties().getCloudCover()!=null && o2.getProperties().getCloudCover()!=null ) { + return (int) ( (o1.getProperties().getCloudCover() - o2.getProperties().getCloudCover() ) * 100 ); + } else { + return 1; // No way to know so return the latest + } + } + } + +} From 8d9afa14e58b90577e8b9f3dd1bda93af40b6189 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:22 +0100 Subject: [PATCH 1509/1620] New translations Filter.java (French) --- .../earth/app/view/Messages_fr.properties | 61 ++++++++----------- 1 file changed, 27 insertions(+), 34 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 1e116c4a2d..11f4ff87a6 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,34 +1,27 @@ -package org.openforis.collect.earth.planet; - -import java.util.Comparator;; - -public class FeatureSorter implements Comparator{ - - @Override - public int compare(Feature o1, Feature o2) { - if( o1.getProperties().getCloudPercent() !=null && o2.getProperties().getCloudPercent() != null ) { - if( o1.getProperties().getCloudPercent().equals( o2.getProperties().getCloudPercent() ) ) { - if( o2.getProperties().getVisibleConfidencePercent() !=null && o1.getProperties().getVisibleConfidencePercent() != null ) { - return o2.getProperties().getVisibleConfidencePercent() - o1.getProperties().getVisibleConfidencePercent(); - }else if( o2.getProperties().getVisibleConfidencePercent() !=null ) { - return 1; - }else{ - return -1; - } - }else { - return o1.getProperties().getCloudPercent() - o2.getProperties().getCloudPercent(); - } - }else if( o1.getProperties().getCloudPercent() != null ) { - return -1; - }else if( o2.getProperties().getCloudPercent() != null) { - return 1; - }else { - if( o1.getProperties().getCloudCover()!=null && o2.getProperties().getCloudCover()!=null ) { - return (int) ( (o1.getProperties().getCloudCover() - o2.getProperties().getCloudCover() ) * 100 ); - } else { - return 1; // No way to know so return the latest - } - } - } - -} +package org.openforis.collect.earth.planet; + +public class Filter { + + FilterType type; + String field_name; + e config; + + public FilterType getType() { + return type; + } + public void setType(FilterType type) { + this.type = type; + } + public String getFieldName() { + return field_name; + } + public void setFieldName(String field_name) { + this.field_name = field_name; + } + public e getConfig() { + return config; + } + public void setConfig(e config) { + this.config = config; + } +} From fdaa45720e95b226c3f71d13c7dd3cfdabec9d19 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:23 +0100 Subject: [PATCH 1510/1620] New translations Filter.java (Spanish) --- .../earth/app/view/Messages_es.properties | 61 ++++++++----------- 1 file changed, 27 insertions(+), 34 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 1e116c4a2d..11f4ff87a6 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,34 +1,27 @@ -package org.openforis.collect.earth.planet; - -import java.util.Comparator;; - -public class FeatureSorter implements Comparator{ - - @Override - public int compare(Feature o1, Feature o2) { - if( o1.getProperties().getCloudPercent() !=null && o2.getProperties().getCloudPercent() != null ) { - if( o1.getProperties().getCloudPercent().equals( o2.getProperties().getCloudPercent() ) ) { - if( o2.getProperties().getVisibleConfidencePercent() !=null && o1.getProperties().getVisibleConfidencePercent() != null ) { - return o2.getProperties().getVisibleConfidencePercent() - o1.getProperties().getVisibleConfidencePercent(); - }else if( o2.getProperties().getVisibleConfidencePercent() !=null ) { - return 1; - }else{ - return -1; - } - }else { - return o1.getProperties().getCloudPercent() - o2.getProperties().getCloudPercent(); - } - }else if( o1.getProperties().getCloudPercent() != null ) { - return -1; - }else if( o2.getProperties().getCloudPercent() != null) { - return 1; - }else { - if( o1.getProperties().getCloudCover()!=null && o2.getProperties().getCloudCover()!=null ) { - return (int) ( (o1.getProperties().getCloudCover() - o2.getProperties().getCloudCover() ) * 100 ); - } else { - return 1; // No way to know so return the latest - } - } - } - -} +package org.openforis.collect.earth.planet; + +public class Filter { + + FilterType type; + String field_name; + e config; + + public FilterType getType() { + return type; + } + public void setType(FilterType type) { + this.type = type; + } + public String getFieldName() { + return field_name; + } + public void setFieldName(String field_name) { + this.field_name = field_name; + } + public e getConfig() { + return config; + } + public void setConfig(e config) { + this.config = config; + } +} From 1ce84771ad07e60aa2a7a7b67bcf5e51dcef226c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:24 +0100 Subject: [PATCH 1511/1620] New translations PlanetAttributes.java (English) --- .../earth/app/view/Messages_en.properties | 44 +++++-------------- 1 file changed, 10 insertions(+), 34 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 1e116c4a2d..a3da2ae001 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,34 +1,10 @@ -package org.openforis.collect.earth.planet; - -import java.util.Comparator;; - -public class FeatureSorter implements Comparator{ - - @Override - public int compare(Feature o1, Feature o2) { - if( o1.getProperties().getCloudPercent() !=null && o2.getProperties().getCloudPercent() != null ) { - if( o1.getProperties().getCloudPercent().equals( o2.getProperties().getCloudPercent() ) ) { - if( o2.getProperties().getVisibleConfidencePercent() !=null && o1.getProperties().getVisibleConfidencePercent() != null ) { - return o2.getProperties().getVisibleConfidencePercent() - o1.getProperties().getVisibleConfidencePercent(); - }else if( o2.getProperties().getVisibleConfidencePercent() !=null ) { - return 1; - }else{ - return -1; - } - }else { - return o1.getProperties().getCloudPercent() - o2.getProperties().getCloudPercent(); - } - }else if( o1.getProperties().getCloudPercent() != null ) { - return -1; - }else if( o2.getProperties().getCloudPercent() != null) { - return 1; - }else { - if( o1.getProperties().getCloudCover()!=null && o2.getProperties().getCloudCover()!=null ) { - return (int) ( (o1.getProperties().getCloudCover() - o2.getProperties().getCloudCover() ) * 100 ); - } else { - return 1; // No way to know so return the latest - } - } - } - -} +package org.openforis.collect.earth.planet; + +public final class PlanetAttributes { + + private PlanetAttributes() {} + + public static final String ACQUIRED = "acquired"; + public static final String GEOMETRY = "geometry"; + +} From 36c554249022847cf50cf2b235caefa59fc3d5ca Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:25 +0100 Subject: [PATCH 1512/1620] New translations PlanetImagery.java (French) --- .../earth/app/view/Messages_fr.properties | 351 +++++++++++++++++- 1 file changed, 334 insertions(+), 17 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 11f4ff87a6..34f161190b 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,27 +1,344 @@ package org.openforis.collect.earth.planet; -public class Filter { +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.security.Security; +import java.time.LocalDateTime; +import java.util.Arrays; +import java.util.Base64; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; - FilterType type; - String field_name; - e config; - - public FilterType getType() { - return type; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; + +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.service.TrustAllCertificates; +import org.openforis.collect.earth.sampler.model.SimpleCoordinate; +import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +public class PlanetImagery { + + private static final Logger logger = LoggerFactory.getLogger(PlanetImagery.class); + private static final Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").create(); + private static final SSLSocketFactory factory = getSSLAcceptAllFactory(); + + private String apiKey; + + private int retries = 0; + + private static final int MAX_RETRIES = 6; + + public PlanetImagery(String apiKey) { + super(); + this.apiKey = apiKey; + } + + private Filter getDateFilter(Date start, Date end) { + Filter dateFilter = new Filter<>(); + dateFilter.setType(FilterType.DATERANGE); + dateFilter.setFieldName(PlanetAttributes.ACQUIRED); + dateFilter.setConfig(new FilterConfig(new DatePlanet(start), new DatePlanet(end))); + return dateFilter; + } + + private Filter withinDaysFilter(Feature feature, int days) { + Date acquriredDate = feature.getProperties().getAcquired(); + LocalDateTime localDateTime = DateUtils.asLocalDateTime(acquriredDate); + Date start = DateUtils.asDate(localDateTime.minusDays(days)); + Date end = DateUtils.asDate(localDateTime.plusDays(days - 1)); + return getDateFilter(start, end); + } + + private Filter getGeometryFilter(GeoJson geoJson) { + Filter geoFilter = new Filter<>(); + geoFilter.setType(FilterType.GEOMETRY); + geoFilter.setFieldName(PlanetAttributes.GEOMETRY); + geoFilter.setConfig(new FilterConfig(geoJson.getType(), geoJson.getCoordinates())); + return geoFilter; + } + + private Filter getAndFilter(Filter[] filters) { + Filter andFilter = new Filter<>(); + andFilter.setType(FilterType.AND); + andFilter.setConfig(filters); + return andFilter; + } + + private Filter getOrFilter(Filter[] filters) { + Filter andFilter = new Filter<>(); + andFilter.setType(FilterType.OR); + andFilter.setConfig(filters); + return andFilter; + } + + private Filter getStringInFilter(String fieldName, String[] strings) { + Filter stringInFilter = new Filter<>(); + stringInFilter.setType(FilterType.STRING_IN); + stringInFilter.setFieldName(fieldName); + stringInFilter.setConfig(strings); + return stringInFilter; + } + + private int getQuality(Feature feature) { + FeatureProperties p = feature.getProperties(); + Integer quality = p.getClearPercent(); + if (quality != null) + return quality; + else { + return (int) ((1 - p.getCloudCover()) * 50); + } + } + + private String sendRequest(URL url, Object jsonObject) throws IOException { + try { + + HttpURLConnection conn = getAuthenticatedConnection(url, jsonObject); + + buildRequet(jsonObject, conn); + + StringBuilder response = null; + try { + response = readStream(conn.getInputStream()); + } finally { + conn.disconnect(); + } + + retries = 0; // reset the counter as it was a success + return response.toString(); + } catch (IOException e) { + if( e.getMessage()!=null && e.getMessage().contains("429") ) { // This happens when there are too many consecutive requests! Make the user wait a bit and try again! + try { + if( retries < MAX_RETRIES ) { + Thread.sleep( 5000 ); + retries++; + }else { + retries = 0; + throw e; + } + } catch (InterruptedException e1) { + logger.error( "Error waiting for Thread requesting Planet imagery"); + } + return sendRequest(url, jsonObject); + }else { + throw e; // Another type of error throw! + } + } + } + + private void buildRequet(Object jsonObject, HttpURLConnection conn) + throws IOException { + byte[] postDataBytes = null; + if (jsonObject != null) { + String jsonInputString = gson.toJson(jsonObject); + postDataBytes = jsonInputString.getBytes( StandardCharsets.UTF_8.name()); + logger.info(jsonInputString); + } + if (postDataBytes != null) { + conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length)); + conn.getOutputStream().write(postDataBytes); + } else { + conn.setRequestProperty("Content-Length", "0"); + } + } + + private HttpURLConnection getAuthenticatedConnection(URL url, Object jsonObject) + throws IOException { + HttpURLConnection conn = null; + if( factory != null ) { // THIS IS A WORKAROUND TO REMOVE SSL CERTIFICATE ISSUES + conn = (HttpsURLConnection) url.openConnection(); + ((HttpsURLConnection)conn).setSSLSocketFactory(factory); + }else { + conn = (HttpURLConnection) url.openConnection(); + } + + // very important to keep the semicolon at the end + String basicAuth = "Basic " + new String(Base64.getEncoder().encode((apiKey + ":").getBytes())); + conn.setRequestProperty("Authorization", basicAuth); + + conn.setRequestMethod(jsonObject != null ? "POST" : "GET"); + conn.setRequestProperty("Content-Type", "application/json"); + conn.setRequestProperty("Accept", "application/json"); + conn.setDoOutput(true); + return conn; } - public void setType(FilterType type) { - this.type = type; + + // Workaround for computers that have trouble accepting Planet's SSL certificates + private static SSLSocketFactory getSSLAcceptAllFactory(){ + SSLSocketFactory factory = null; + try { + Security.getProviders(); + final SSLContext ssl = SSLContext.getInstance("TLSv1.2"); + ssl.init(null, new TrustManager[] { new TrustAllCertificates() }, null); + return ssl.getSocketFactory(); + } catch (Exception e) { + logger.error( "Error obtaining SSL factory when opeining Planet REST URL",e); + } + + return factory; + } + + private StringBuilder readStream(InputStream is) throws IOException { + StringBuilder response = new StringBuilder(); + try (BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) { + String responseLine = null; + while ((responseLine = br.readLine()) != null) { + response.append(responseLine.trim()); + } + } + return response; + } + + private Feature[] search(String[] itemTypes, Filter[] filters, Integer maxResults) throws IOException { + + Filter andFilter = getAndFilter(filters); + SearchRequest searchRequest = new SearchRequest(itemTypes, andFilter); + + String response = sendRequest(new URL("https://api.planet.com/data/v1/quick-search"), searchRequest); + Feature[] featuresInPage = getNextPage(response); + + if (featuresInPage != null && maxResults != null ) { + Arrays.sort(featuresInPage, new FeatureSorter()); + + if (featuresInPage.length > maxResults) { + featuresInPage = ArrayUtils.subarray(featuresInPage, 0, maxResults); + } + ArrayUtils.reverse(featuresInPage); + } + + return featuresInPage; + + } + + private Feature[] getNextPage(String resJson) throws IOException { + if (StringUtils.isNotBlank(resJson)) { + Response resp = gson.fromJson(resJson, Response.class); + Feature[] features = resp.getFeatures(); + Links links = resp.getLinks(); + if (links != null && links.getNext() != null) { + String nextUrl = links.getNext(); + String res = sendRequest(new URL(nextUrl), null); + Feature[] nextFeatures = getNextPage(res); + return ArrayUtils.addAll(features, nextFeatures); + } else { + return features; + } + } else { + return new Feature[] {}; + } + } + + private String getLayers(Feature[] features) throws IOException { + String layerUrl = ""; + if (features.length > 0) { + String[] ids = new String[features.length]; + for (int i = 0; i < ids.length; i++) { + Feature feature = features[i]; + + String idSearch = feature.getProperties().getItemType() + ':' + feature.getId(); + ids[i] = idSearch; + } + + SearchRequest layerRequest = new SearchRequest(ids); + String layers = sendRequest(new URL("https://tiles0.planet.com/data/v1/layers"), layerRequest); + LayerResponse layerResponse = gson.fromJson(layers, LayerResponse.class); + if (layerResponse != null) { + layerUrl = layerResponse.getTiles()[0]; + } + } + return layerUrl; } - public String getFieldName() { - return field_name; + + private Feature[] getFeatures (PlanetRequestParameters planetRequestParameters ) throws IOException { + Calendar thresholdQuality = Calendar.getInstance(); + thresholdQuality.set(2016, 0,1); + + GeoJson geometry = new GeoJson("Polygon", planetRequestParameters.getCoords()); + Filter geometryFilter = getGeometryFilter(geometry); + Filter[] filters = null; + /* maybe we can use test quality anyway + * it gets complicated when the filter start/end date is multiyear + */ + if( planetRequestParameters.getStart().before( thresholdQuality.getTime() ) && planetRequestParameters.getEnd().after( thresholdQuality.getTime() ) ) { + + Filter qualityFilter = getStringInFilter("quality_category", new String[] { "standard" }); + Filter before2016Filter = getDateFilter(planetRequestParameters.getStart(), thresholdQuality.getTime() ); + Filter after2016Filter = getDateFilter(thresholdQuality.getTime(), planetRequestParameters.getEnd() ); + + Filter after2016AndStandardQuality = getAndFilter( new Filter[] { after2016Filter, qualityFilter } ); + Filter before2016OrAfter2016AndStandardQuality = getOrFilter( new Filter[] { before2016Filter, after2016AndStandardQuality } ); + + // Add quality filter only for images after 2016 + + filters = new Filter[] { before2016OrAfter2016AndStandardQuality, geometryFilter }; + + }else if( planetRequestParameters.getStart().after( thresholdQuality.getTime() ) ) { + Filter dateFilter = getDateFilter(planetRequestParameters.getStart(), planetRequestParameters.getEnd()); + // Add quality filter only for images after 2016 + Filter qualityFilter = getStringInFilter("quality_category", new String[] { "standard" }); + filters = new Filter[] { dateFilter, geometryFilter, qualityFilter }; + }else { + Filter dateFilter = getDateFilter(planetRequestParameters.getStart(), planetRequestParameters.getEnd()); + filters = new Filter[] { dateFilter, geometryFilter }; + } + + return search(planetRequestParameters.getItemTypes(), filters, null); } - public void setFieldName(String field_name) { - this.field_name = field_name; + + public String getLayerUrl(PlanetRequestParameters planetRequestParameters) throws IOException { + Feature[] searchResults = getFeatures (planetRequestParameters); + return searchResults!=null ? getLayers(searchResults) : null; } - public e getConfig() { - return config; + + public Map getAvailableDates(PlanetRequestParameters planetRequestParameters) throws IOException { + + Feature[] searchResults = getFeatures (planetRequestParameters); + + Map datesAvailable = new HashMap<>(); + + Calendar cal = Calendar.getInstance(); + if( searchResults != null ) { + for (Feature feature : searchResults) { + cal.setTime( feature.getProperties().acquired ); + int year = cal.get( Calendar.YEAR ); + int month = cal.get( Calendar.MONTH ) + 1; + int day = cal.get( Calendar.DATE ); + datesAvailable.put( year+""+ ( month<10?"0"+month:month ), "true"); // THe month, in order to know for whcioh moinths there are images + datesAvailable.put( year+""+ ( month<10?"0"+month:month )+ ( day<10?"0"+day:day ), "true"); + } + } + return datesAvailable; } - public void setConfig(e config) { - this.config = config; + + public String getLatestUrl(SimplePlacemarkObject placemarkObject) throws IOException { + LocalDateTime localDateTime = DateUtils.asLocalDateTime(new Date()); + Date start = DateUtils.asDate(localDateTime.minusDays(30)); + + List shape = placemarkObject.getMultiShape().get(0); + + double[][][] polygon = new double[1][shape.size()][2]; + int i = 0; + for (SimpleCoordinate simpleCoordinate : shape) { + polygon[0][i][1] = Double.parseDouble(simpleCoordinate.getLatitude()); + polygon[0][i++][0] = Double.parseDouble(simpleCoordinate.getLongitude()); + } + String[] itemTypes = { "PSScene3Band", "PSScene4Band" }; + return getLayerUrl(new PlanetRequestParameters(start, new Date(), polygon, itemTypes)); } } From f9bb5aa0c862379531fc2c4954ddc3b4235878f4 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:26 +0100 Subject: [PATCH 1513/1620] New translations CodeAttributeProxy.java (Spanish) --- .../earth/app/view/Messages_es.properties | 57 ++++++++++++------- 1 file changed, 37 insertions(+), 20 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 11f4ff87a6..42d1e5f858 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,27 +1,44 @@ -package org.openforis.collect.earth.planet; +/** + * + */ +package org.openforis.collect.model.proxy; -public class Filter { +import org.openforis.collect.ProxyContext; +import org.openforis.idm.metamodel.CodeAttributeDefinition; +import org.openforis.idm.metamodel.CodeList; +import org.openforis.idm.metamodel.EntityDefinition; +import org.openforis.idm.model.CodeAttribute; - FilterType type; - String field_name; - e config; +/** + * @author S. Ricci + * + */ +public class CodeAttributeProxy extends AttributeProxy { + + private CodeAttribute codeAttribute; - public FilterType getType() { - return type; - } - public void setType(FilterType type) { - this.type = type; - } - public String getFieldName() { - return field_name; - } - public void setFieldName(String field_name) { - this.field_name = field_name; + public CodeAttributeProxy(EntityProxy parent, + CodeAttribute attribute, ProxyContext context) { + super(parent, attribute, context); + this.codeAttribute = attribute; } - public e getConfig() { - return config; + + public boolean isEnumerator() { + CodeAttributeDefinition definition = codeAttribute.getDefinition(); + EntityDefinition parentDefinition = (EntityDefinition) definition.getParentDefinition(); + return ( + parentDefinition.isEnumerable() && + definition.isKey() && + definition.getList() != null && + !definition.getList().isExternal() + ); + } - public void setConfig(e config) { - this.config = config; + + protected boolean isExternalCodeList() { + CodeAttributeDefinition defn = codeAttribute.getDefinition(); + CodeList list = defn.getList(); + return list.isExternal(); } + } From 2ac7a0174df7320f427cded77ad1c8f63abc1e6a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:27 +0100 Subject: [PATCH 1514/1620] New translations AttributeChangeProxy.java (French) --- .../earth/app/view/Messages_fr.properties | 352 +----------------- 1 file changed, 20 insertions(+), 332 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 34f161190b..d87e45fe27 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,344 +1,32 @@ -package org.openforis.collect.earth.planet; +package org.openforis.collect.model.proxy; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.HttpURLConnection; -import java.net.URL; -import java.nio.charset.StandardCharsets; -import java.security.Security; -import java.time.LocalDateTime; -import java.util.Arrays; -import java.util.Base64; -import java.util.Calendar; -import java.util.Date; -import java.util.HashMap; -import java.util.List; import java.util.Map; -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSocketFactory; -import javax.net.ssl.TrustManager; +import org.openforis.collect.ProxyContext; +import org.openforis.collect.model.AttributeChange; +import org.openforis.idm.model.Attribute; -import org.apache.commons.lang3.ArrayUtils; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.service.TrustAllCertificates; -import org.openforis.collect.earth.sampler.model.SimpleCoordinate; -import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; - -public class PlanetImagery { - - private static final Logger logger = LoggerFactory.getLogger(PlanetImagery.class); - private static final Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").create(); - private static final SSLSocketFactory factory = getSSLAcceptAllFactory(); - - private String apiKey; - - private int retries = 0; - - private static final int MAX_RETRIES = 6; - - public PlanetImagery(String apiKey) { - super(); - this.apiKey = apiKey; - } - - private Filter getDateFilter(Date start, Date end) { - Filter dateFilter = new Filter<>(); - dateFilter.setType(FilterType.DATERANGE); - dateFilter.setFieldName(PlanetAttributes.ACQUIRED); - dateFilter.setConfig(new FilterConfig(new DatePlanet(start), new DatePlanet(end))); - return dateFilter; - } - - private Filter withinDaysFilter(Feature feature, int days) { - Date acquriredDate = feature.getProperties().getAcquired(); - LocalDateTime localDateTime = DateUtils.asLocalDateTime(acquriredDate); - Date start = DateUtils.asDate(localDateTime.minusDays(days)); - Date end = DateUtils.asDate(localDateTime.plusDays(days - 1)); - return getDateFilter(start, end); - } - - private Filter getGeometryFilter(GeoJson geoJson) { - Filter geoFilter = new Filter<>(); - geoFilter.setType(FilterType.GEOMETRY); - geoFilter.setFieldName(PlanetAttributes.GEOMETRY); - geoFilter.setConfig(new FilterConfig(geoJson.getType(), geoJson.getCoordinates())); - return geoFilter; - } - - private Filter getAndFilter(Filter[] filters) { - Filter andFilter = new Filter<>(); - andFilter.setType(FilterType.AND); - andFilter.setConfig(filters); - return andFilter; - } - - private Filter getOrFilter(Filter[] filters) { - Filter andFilter = new Filter<>(); - andFilter.setType(FilterType.OR); - andFilter.setConfig(filters); - return andFilter; - } - - private Filter getStringInFilter(String fieldName, String[] strings) { - Filter stringInFilter = new Filter<>(); - stringInFilter.setType(FilterType.STRING_IN); - stringInFilter.setFieldName(fieldName); - stringInFilter.setConfig(strings); - return stringInFilter; - } - - private int getQuality(Feature feature) { - FeatureProperties p = feature.getProperties(); - Integer quality = p.getClearPercent(); - if (quality != null) - return quality; - else { - return (int) ((1 - p.getCloudCover()) * 50); - } - } - - private String sendRequest(URL url, Object jsonObject) throws IOException { - try { - - HttpURLConnection conn = getAuthenticatedConnection(url, jsonObject); - - buildRequet(jsonObject, conn); - - StringBuilder response = null; - try { - response = readStream(conn.getInputStream()); - } finally { - conn.disconnect(); - } - - retries = 0; // reset the counter as it was a success - return response.toString(); - } catch (IOException e) { - if( e.getMessage()!=null && e.getMessage().contains("429") ) { // This happens when there are too many consecutive requests! Make the user wait a bit and try again! - try { - if( retries < MAX_RETRIES ) { - Thread.sleep( 5000 ); - retries++; - }else { - retries = 0; - throw e; - } - } catch (InterruptedException e1) { - logger.error( "Error waiting for Thread requesting Planet imagery"); - } - return sendRequest(url, jsonObject); - }else { - throw e; // Another type of error throw! - } - } - } - - private void buildRequet(Object jsonObject, HttpURLConnection conn) - throws IOException { - byte[] postDataBytes = null; - if (jsonObject != null) { - String jsonInputString = gson.toJson(jsonObject); - postDataBytes = jsonInputString.getBytes( StandardCharsets.UTF_8.name()); - logger.info(jsonInputString); - } - if (postDataBytes != null) { - conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length)); - conn.getOutputStream().write(postDataBytes); - } else { - conn.setRequestProperty("Content-Length", "0"); - } - } - - private HttpURLConnection getAuthenticatedConnection(URL url, Object jsonObject) - throws IOException { - HttpURLConnection conn = null; - if( factory != null ) { // THIS IS A WORKAROUND TO REMOVE SSL CERTIFICATE ISSUES - conn = (HttpsURLConnection) url.openConnection(); - ((HttpsURLConnection)conn).setSSLSocketFactory(factory); - }else { - conn = (HttpURLConnection) url.openConnection(); - } - - // very important to keep the semicolon at the end - String basicAuth = "Basic " + new String(Base64.getEncoder().encode((apiKey + ":").getBytes())); - conn.setRequestProperty("Authorization", basicAuth); - - conn.setRequestMethod(jsonObject != null ? "POST" : "GET"); - conn.setRequestProperty("Content-Type", "application/json"); - conn.setRequestProperty("Accept", "application/json"); - conn.setDoOutput(true); - return conn; - } - - // Workaround for computers that have trouble accepting Planet's SSL certificates - private static SSLSocketFactory getSSLAcceptAllFactory(){ - SSLSocketFactory factory = null; - try { - Security.getProviders(); - final SSLContext ssl = SSLContext.getInstance("TLSv1.2"); - ssl.init(null, new TrustManager[] { new TrustAllCertificates() }, null); - return ssl.getSocketFactory(); - } catch (Exception e) { - logger.error( "Error obtaining SSL factory when opeining Planet REST URL",e); - } - - return factory; - } - - private StringBuilder readStream(InputStream is) throws IOException { - StringBuilder response = new StringBuilder(); - try (BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) { - String responseLine = null; - while ((responseLine = br.readLine()) != null) { - response.append(responseLine.trim()); - } - } - return response; - } - - private Feature[] search(String[] itemTypes, Filter[] filters, Integer maxResults) throws IOException { - - Filter andFilter = getAndFilter(filters); - SearchRequest searchRequest = new SearchRequest(itemTypes, andFilter); - - String response = sendRequest(new URL("https://api.planet.com/data/v1/quick-search"), searchRequest); - Feature[] featuresInPage = getNextPage(response); - - if (featuresInPage != null && maxResults != null ) { - Arrays.sort(featuresInPage, new FeatureSorter()); - - if (featuresInPage.length > maxResults) { - featuresInPage = ArrayUtils.subarray(featuresInPage, 0, maxResults); - } - ArrayUtils.reverse(featuresInPage); - } - - return featuresInPage; +/** + * + * @author S. Ricci + * + */ +public class AttributeChangeProxy extends NodeChangeProxy { + public AttributeChangeProxy(AttributeChange change, ProxyContext context) { + super(change, context); } - private Feature[] getNextPage(String resJson) throws IOException { - if (StringUtils.isNotBlank(resJson)) { - Response resp = gson.fromJson(resJson, Response.class); - Feature[] features = resp.getFeatures(); - Links links = resp.getLinks(); - if (links != null && links.getNext() != null) { - String nextUrl = links.getNext(); - String res = sendRequest(new URL(nextUrl), null); - Feature[] nextFeatures = getNextPage(res); - return ArrayUtils.addAll(features, nextFeatures); - } else { - return features; - } + public ValidationResultsProxy getValidationResults() { + if ( change.getValidationResults() == null ) { + return null; } else { - return new Feature[] {}; - } - } - - private String getLayers(Feature[] features) throws IOException { - String layerUrl = ""; - if (features.length > 0) { - String[] ids = new String[features.length]; - for (int i = 0; i < ids.length; i++) { - Feature feature = features[i]; - - String idSearch = feature.getProperties().getItemType() + ':' + feature.getId(); - ids[i] = idSearch; - } - - SearchRequest layerRequest = new SearchRequest(ids); - String layers = sendRequest(new URL("https://tiles0.planet.com/data/v1/layers"), layerRequest); - LayerResponse layerResponse = gson.fromJson(layers, LayerResponse.class); - if (layerResponse != null) { - layerUrl = layerResponse.getTiles()[0]; - } - } - return layerUrl; - } - - private Feature[] getFeatures (PlanetRequestParameters planetRequestParameters ) throws IOException { - Calendar thresholdQuality = Calendar.getInstance(); - thresholdQuality.set(2016, 0,1); - - GeoJson geometry = new GeoJson("Polygon", planetRequestParameters.getCoords()); - Filter geometryFilter = getGeometryFilter(geometry); - Filter[] filters = null; - /* maybe we can use test quality anyway - * it gets complicated when the filter start/end date is multiyear - */ - if( planetRequestParameters.getStart().before( thresholdQuality.getTime() ) && planetRequestParameters.getEnd().after( thresholdQuality.getTime() ) ) { - - Filter qualityFilter = getStringInFilter("quality_category", new String[] { "standard" }); - Filter before2016Filter = getDateFilter(planetRequestParameters.getStart(), thresholdQuality.getTime() ); - Filter after2016Filter = getDateFilter(thresholdQuality.getTime(), planetRequestParameters.getEnd() ); - - Filter after2016AndStandardQuality = getAndFilter( new Filter[] { after2016Filter, qualityFilter } ); - Filter before2016OrAfter2016AndStandardQuality = getOrFilter( new Filter[] { before2016Filter, after2016AndStandardQuality } ); - - // Add quality filter only for images after 2016 - - filters = new Filter[] { before2016OrAfter2016AndStandardQuality, geometryFilter }; - - }else if( planetRequestParameters.getStart().after( thresholdQuality.getTime() ) ) { - Filter dateFilter = getDateFilter(planetRequestParameters.getStart(), planetRequestParameters.getEnd()); - // Add quality filter only for images after 2016 - Filter qualityFilter = getStringInFilter("quality_category", new String[] { "standard" }); - filters = new Filter[] { dateFilter, geometryFilter, qualityFilter }; - }else { - Filter dateFilter = getDateFilter(planetRequestParameters.getStart(), planetRequestParameters.getEnd()); - filters = new Filter[] { dateFilter, geometryFilter }; - } - - return search(planetRequestParameters.getItemTypes(), filters, null); - } - - public String getLayerUrl(PlanetRequestParameters planetRequestParameters) throws IOException { - Feature[] searchResults = getFeatures (planetRequestParameters); - return searchResults!=null ? getLayers(searchResults) : null; - } - - public Map getAvailableDates(PlanetRequestParameters planetRequestParameters) throws IOException { - - Feature[] searchResults = getFeatures (planetRequestParameters); - - Map datesAvailable = new HashMap<>(); - - Calendar cal = Calendar.getInstance(); - if( searchResults != null ) { - for (Feature feature : searchResults) { - cal.setTime( feature.getProperties().acquired ); - int year = cal.get( Calendar.YEAR ); - int month = cal.get( Calendar.MONTH ) + 1; - int day = cal.get( Calendar.DATE ); - datesAvailable.put( year+""+ ( month<10?"0"+month:month ), "true"); // THe month, in order to know for whcioh moinths there are images - datesAvailable.put( year+""+ ( month<10?"0"+month:month )+ ( day<10?"0"+day:day ), "true"); - } + return new ValidationResultsProxy(context, (Attribute) change.getNode(), change.getValidationResults()); } - return datesAvailable; } - public String getLatestUrl(SimplePlacemarkObject placemarkObject) throws IOException { - LocalDateTime localDateTime = DateUtils.asLocalDateTime(new Date()); - Date start = DateUtils.asDate(localDateTime.minusDays(30)); - - List shape = placemarkObject.getMultiShape().get(0); - - double[][][] polygon = new double[1][shape.size()][2]; - int i = 0; - for (SimpleCoordinate simpleCoordinate : shape) { - polygon[0][i][1] = Double.parseDouble(simpleCoordinate.getLatitude()); - polygon[0][i++][0] = Double.parseDouble(simpleCoordinate.getLongitude()); - } - String[] itemTypes = { "PSScene3Band", "PSScene4Band" }; - return getLayerUrl(new PlanetRequestParameters(start, new Date(), polygon, itemTypes)); + public Map getUpdatedFieldValues() { + return change.getUpdatedFieldValues(); } -} + +} \ No newline at end of file From d43c03dfc679d35e05a8c1d91b8317234f444c60 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:29 +0100 Subject: [PATCH 1515/1620] New translations AttributeChangeProxy.java (Spanish) --- .../earth/app/view/Messages_es.properties | 46 +++++++------------ 1 file changed, 17 insertions(+), 29 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 42d1e5f858..d87e45fe27 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,44 +1,32 @@ -/** - * - */ package org.openforis.collect.model.proxy; +import java.util.Map; + import org.openforis.collect.ProxyContext; -import org.openforis.idm.metamodel.CodeAttributeDefinition; -import org.openforis.idm.metamodel.CodeList; -import org.openforis.idm.metamodel.EntityDefinition; -import org.openforis.idm.model.CodeAttribute; +import org.openforis.collect.model.AttributeChange; +import org.openforis.idm.model.Attribute; /** + * * @author S. Ricci * */ -public class CodeAttributeProxy extends AttributeProxy { +public class AttributeChangeProxy extends NodeChangeProxy { - private CodeAttribute codeAttribute; - - public CodeAttributeProxy(EntityProxy parent, - CodeAttribute attribute, ProxyContext context) { - super(parent, attribute, context); - this.codeAttribute = attribute; + public AttributeChangeProxy(AttributeChange change, ProxyContext context) { + super(change, context); } - public boolean isEnumerator() { - CodeAttributeDefinition definition = codeAttribute.getDefinition(); - EntityDefinition parentDefinition = (EntityDefinition) definition.getParentDefinition(); - return ( - parentDefinition.isEnumerable() && - definition.isKey() && - definition.getList() != null && - !definition.getList().isExternal() - ); - + public ValidationResultsProxy getValidationResults() { + if ( change.getValidationResults() == null ) { + return null; + } else { + return new ValidationResultsProxy(context, (Attribute) change.getNode(), change.getValidationResults()); + } } - protected boolean isExternalCodeList() { - CodeAttributeDefinition defn = codeAttribute.getDefinition(); - CodeList list = defn.getList(); - return list.isExternal(); + public Map getUpdatedFieldValues() { + return change.getUpdatedFieldValues(); } -} +} \ No newline at end of file From dd277da80151e33f10a1173078434d00439d3a5e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:30 +0100 Subject: [PATCH 1516/1620] New translations AttributeChangeProxy.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 66 +++++++++---------- 1 file changed, 32 insertions(+), 34 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 1e116c4a2d..d87e45fe27 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,34 +1,32 @@ -package org.openforis.collect.earth.planet; - -import java.util.Comparator;; - -public class FeatureSorter implements Comparator{ - - @Override - public int compare(Feature o1, Feature o2) { - if( o1.getProperties().getCloudPercent() !=null && o2.getProperties().getCloudPercent() != null ) { - if( o1.getProperties().getCloudPercent().equals( o2.getProperties().getCloudPercent() ) ) { - if( o2.getProperties().getVisibleConfidencePercent() !=null && o1.getProperties().getVisibleConfidencePercent() != null ) { - return o2.getProperties().getVisibleConfidencePercent() - o1.getProperties().getVisibleConfidencePercent(); - }else if( o2.getProperties().getVisibleConfidencePercent() !=null ) { - return 1; - }else{ - return -1; - } - }else { - return o1.getProperties().getCloudPercent() - o2.getProperties().getCloudPercent(); - } - }else if( o1.getProperties().getCloudPercent() != null ) { - return -1; - }else if( o2.getProperties().getCloudPercent() != null) { - return 1; - }else { - if( o1.getProperties().getCloudCover()!=null && o2.getProperties().getCloudCover()!=null ) { - return (int) ( (o1.getProperties().getCloudCover() - o2.getProperties().getCloudCover() ) * 100 ); - } else { - return 1; // No way to know so return the latest - } - } - } - -} +package org.openforis.collect.model.proxy; + +import java.util.Map; + +import org.openforis.collect.ProxyContext; +import org.openforis.collect.model.AttributeChange; +import org.openforis.idm.model.Attribute; + +/** + * + * @author S. Ricci + * + */ +public class AttributeChangeProxy extends NodeChangeProxy { + + public AttributeChangeProxy(AttributeChange change, ProxyContext context) { + super(change, context); + } + + public ValidationResultsProxy getValidationResults() { + if ( change.getValidationResults() == null ) { + return null; + } else { + return new ValidationResultsProxy(context, (Attribute) change.getNode(), change.getValidationResults()); + } + } + + public Map getUpdatedFieldValues() { + return change.getUpdatedFieldValues(); + } + +} \ No newline at end of file From 989ac8ab3d870df528b5d628d96469edc7084f1a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:31 +0100 Subject: [PATCH 1517/1620] New translations AttributeChangeProxy.java (English) --- .../earth/app/view/Messages_en.properties | 36 +++++++++++++++---- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index a3da2ae001..d87e45fe27 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,10 +1,32 @@ -package org.openforis.collect.earth.planet; +package org.openforis.collect.model.proxy; -public final class PlanetAttributes { +import java.util.Map; - private PlanetAttributes() {} - - public static final String ACQUIRED = "acquired"; - public static final String GEOMETRY = "geometry"; +import org.openforis.collect.ProxyContext; +import org.openforis.collect.model.AttributeChange; +import org.openforis.idm.model.Attribute; + +/** + * + * @author S. Ricci + * + */ +public class AttributeChangeProxy extends NodeChangeProxy { + + public AttributeChangeProxy(AttributeChange change, ProxyContext context) { + super(change, context); + } + + public ValidationResultsProxy getValidationResults() { + if ( change.getValidationResults() == null ) { + return null; + } else { + return new ValidationResultsProxy(context, (Attribute) change.getNode(), change.getValidationResults()); + } + } + + public Map getUpdatedFieldValues() { + return change.getUpdatedFieldValues(); + } -} +} \ No newline at end of file From 20ea7c52bde910a33f594bf6e4aa364006d3cdca Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:32 +0100 Subject: [PATCH 1518/1620] New translations AttributeProxy.java (French) --- .../earth/app/view/Messages_fr.properties | 64 ++++++++++++++----- 1 file changed, 47 insertions(+), 17 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index d87e45fe27..bc3c287e47 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,32 +1,62 @@ +/** + * + */ package org.openforis.collect.model.proxy; -import java.util.Map; +import java.util.ArrayList; +import java.util.List; import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.AttributeChange; +import org.openforis.collect.model.CollectRecord; +import org.openforis.idm.metamodel.validation.ValidationResults; import org.openforis.idm.model.Attribute; +import org.openforis.idm.model.Field; /** - * + * @author M. Togna * @author S. Ricci - * - */ -public class AttributeChangeProxy extends NodeChangeProxy { + * + * */ +public class AttributeProxy extends NodeProxy { + + private transient Attribute attribute; + private ValidationResultsProxy validationResults; + private boolean errorConfirmed; + + public AttributeProxy(EntityProxy parent, Attribute attribute, ProxyContext context) { + super(parent, attribute, context); + this.attribute = attribute; + ValidationResults validationRes = attribute.getValidationResults(); + if ( validationRes == null ) { + validationRes = new ValidationResults(); + } + this.validationResults = new ValidationResultsProxy(context, attribute, validationRes); + this.errorConfirmed = ((CollectRecord) attribute.getRecord()).isErrorConfirmed(attribute); + } - public AttributeChangeProxy(AttributeChange change, ProxyContext context) { - super(change, context); + public ValidationResultsProxy getValidationResults(){ + return validationResults; } - public ValidationResultsProxy getValidationResults() { - if ( change.getValidationResults() == null ) { - return null; - } else { - return new ValidationResultsProxy(context, (Attribute) change.getNode(), change.getValidationResults()); - } + public void setValidationResults(ValidationResultsProxy value) { + this.validationResults = value; } - public Map getUpdatedFieldValues() { - return change.getUpdatedFieldValues(); + public List getFields() { + List> fields = attribute.getFields(); + List result = new ArrayList(fields.size()); + for (Field field : fields) { + result.add(new FieldProxy(field)); + } + return result; } -} \ No newline at end of file + public boolean isErrorConfirmed() { + return errorConfirmed; + } + + public void setErrorConfirmed(boolean value) { + this.errorConfirmed = value; + } + +} From f0501f6812a92ee681ba7bef7d201fad339ee1a7 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:33 +0100 Subject: [PATCH 1519/1620] New translations AttributeProxy.java (Spanish) --- .../earth/app/view/Messages_es.properties | 64 ++++++++++++++----- 1 file changed, 47 insertions(+), 17 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index d87e45fe27..bc3c287e47 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,32 +1,62 @@ +/** + * + */ package org.openforis.collect.model.proxy; -import java.util.Map; +import java.util.ArrayList; +import java.util.List; import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.AttributeChange; +import org.openforis.collect.model.CollectRecord; +import org.openforis.idm.metamodel.validation.ValidationResults; import org.openforis.idm.model.Attribute; +import org.openforis.idm.model.Field; /** - * + * @author M. Togna * @author S. Ricci - * - */ -public class AttributeChangeProxy extends NodeChangeProxy { + * + * */ +public class AttributeProxy extends NodeProxy { + + private transient Attribute attribute; + private ValidationResultsProxy validationResults; + private boolean errorConfirmed; + + public AttributeProxy(EntityProxy parent, Attribute attribute, ProxyContext context) { + super(parent, attribute, context); + this.attribute = attribute; + ValidationResults validationRes = attribute.getValidationResults(); + if ( validationRes == null ) { + validationRes = new ValidationResults(); + } + this.validationResults = new ValidationResultsProxy(context, attribute, validationRes); + this.errorConfirmed = ((CollectRecord) attribute.getRecord()).isErrorConfirmed(attribute); + } - public AttributeChangeProxy(AttributeChange change, ProxyContext context) { - super(change, context); + public ValidationResultsProxy getValidationResults(){ + return validationResults; } - public ValidationResultsProxy getValidationResults() { - if ( change.getValidationResults() == null ) { - return null; - } else { - return new ValidationResultsProxy(context, (Attribute) change.getNode(), change.getValidationResults()); - } + public void setValidationResults(ValidationResultsProxy value) { + this.validationResults = value; } - public Map getUpdatedFieldValues() { - return change.getUpdatedFieldValues(); + public List getFields() { + List> fields = attribute.getFields(); + List result = new ArrayList(fields.size()); + for (Field field : fields) { + result.add(new FieldProxy(field)); + } + return result; } -} \ No newline at end of file + public boolean isErrorConfirmed() { + return errorConfirmed; + } + + public void setErrorConfirmed(boolean value) { + this.errorConfirmed = value; + } + +} From 15cb133caabdd47c1f06b1059c94317bdb50ca56 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:34 +0100 Subject: [PATCH 1520/1620] New translations AttributeProxy.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 64 ++++++++++++++----- 1 file changed, 47 insertions(+), 17 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index d87e45fe27..bc3c287e47 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,32 +1,62 @@ +/** + * + */ package org.openforis.collect.model.proxy; -import java.util.Map; +import java.util.ArrayList; +import java.util.List; import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.AttributeChange; +import org.openforis.collect.model.CollectRecord; +import org.openforis.idm.metamodel.validation.ValidationResults; import org.openforis.idm.model.Attribute; +import org.openforis.idm.model.Field; /** - * + * @author M. Togna * @author S. Ricci - * - */ -public class AttributeChangeProxy extends NodeChangeProxy { + * + * */ +public class AttributeProxy extends NodeProxy { + + private transient Attribute attribute; + private ValidationResultsProxy validationResults; + private boolean errorConfirmed; + + public AttributeProxy(EntityProxy parent, Attribute attribute, ProxyContext context) { + super(parent, attribute, context); + this.attribute = attribute; + ValidationResults validationRes = attribute.getValidationResults(); + if ( validationRes == null ) { + validationRes = new ValidationResults(); + } + this.validationResults = new ValidationResultsProxy(context, attribute, validationRes); + this.errorConfirmed = ((CollectRecord) attribute.getRecord()).isErrorConfirmed(attribute); + } - public AttributeChangeProxy(AttributeChange change, ProxyContext context) { - super(change, context); + public ValidationResultsProxy getValidationResults(){ + return validationResults; } - public ValidationResultsProxy getValidationResults() { - if ( change.getValidationResults() == null ) { - return null; - } else { - return new ValidationResultsProxy(context, (Attribute) change.getNode(), change.getValidationResults()); - } + public void setValidationResults(ValidationResultsProxy value) { + this.validationResults = value; } - public Map getUpdatedFieldValues() { - return change.getUpdatedFieldValues(); + public List getFields() { + List> fields = attribute.getFields(); + List result = new ArrayList(fields.size()); + for (Field field : fields) { + result.add(new FieldProxy(field)); + } + return result; } -} \ No newline at end of file + public boolean isErrorConfirmed() { + return errorConfirmed; + } + + public void setErrorConfirmed(boolean value) { + this.errorConfirmed = value; + } + +} From 59071d5717464bd0d2243c4b72830d8128847a6e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:35 +0100 Subject: [PATCH 1521/1620] New translations AttributeProxy.java (English) --- .../earth/app/view/Messages_en.properties | 64 ++++++++++++++----- 1 file changed, 47 insertions(+), 17 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index d87e45fe27..bc3c287e47 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,32 +1,62 @@ +/** + * + */ package org.openforis.collect.model.proxy; -import java.util.Map; +import java.util.ArrayList; +import java.util.List; import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.AttributeChange; +import org.openforis.collect.model.CollectRecord; +import org.openforis.idm.metamodel.validation.ValidationResults; import org.openforis.idm.model.Attribute; +import org.openforis.idm.model.Field; /** - * + * @author M. Togna * @author S. Ricci - * - */ -public class AttributeChangeProxy extends NodeChangeProxy { + * + * */ +public class AttributeProxy extends NodeProxy { + + private transient Attribute attribute; + private ValidationResultsProxy validationResults; + private boolean errorConfirmed; + + public AttributeProxy(EntityProxy parent, Attribute attribute, ProxyContext context) { + super(parent, attribute, context); + this.attribute = attribute; + ValidationResults validationRes = attribute.getValidationResults(); + if ( validationRes == null ) { + validationRes = new ValidationResults(); + } + this.validationResults = new ValidationResultsProxy(context, attribute, validationRes); + this.errorConfirmed = ((CollectRecord) attribute.getRecord()).isErrorConfirmed(attribute); + } - public AttributeChangeProxy(AttributeChange change, ProxyContext context) { - super(change, context); + public ValidationResultsProxy getValidationResults(){ + return validationResults; } - public ValidationResultsProxy getValidationResults() { - if ( change.getValidationResults() == null ) { - return null; - } else { - return new ValidationResultsProxy(context, (Attribute) change.getNode(), change.getValidationResults()); - } + public void setValidationResults(ValidationResultsProxy value) { + this.validationResults = value; } - public Map getUpdatedFieldValues() { - return change.getUpdatedFieldValues(); + public List getFields() { + List> fields = attribute.getFields(); + List result = new ArrayList(fields.size()); + for (Field field : fields) { + result.add(new FieldProxy(field)); + } + return result; } -} \ No newline at end of file + public boolean isErrorConfirmed() { + return errorConfirmed; + } + + public void setErrorConfirmed(boolean value) { + this.errorConfirmed = value; + } + +} From 26e7ee3e2908b77322a3ee6445aeb28a1db6bd63 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:37 +0100 Subject: [PATCH 1522/1620] New translations CodeAttributeProxy.java (French) --- .../earth/app/view/Messages_fr.properties | 68 +++++++------------ 1 file changed, 25 insertions(+), 43 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index bc3c287e47..42d1e5f858 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -3,60 +3,42 @@ */ package org.openforis.collect.model.proxy; -import java.util.ArrayList; -import java.util.List; - import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.CollectRecord; -import org.openforis.idm.metamodel.validation.ValidationResults; -import org.openforis.idm.model.Attribute; -import org.openforis.idm.model.Field; +import org.openforis.idm.metamodel.CodeAttributeDefinition; +import org.openforis.idm.metamodel.CodeList; +import org.openforis.idm.metamodel.EntityDefinition; +import org.openforis.idm.model.CodeAttribute; /** - * @author M. Togna * @author S. Ricci - * - * */ -public class AttributeProxy extends NodeProxy { + * + */ +public class CodeAttributeProxy extends AttributeProxy { - private transient Attribute attribute; - private ValidationResultsProxy validationResults; - private boolean errorConfirmed; + private CodeAttribute codeAttribute; - public AttributeProxy(EntityProxy parent, Attribute attribute, ProxyContext context) { + public CodeAttributeProxy(EntityProxy parent, + CodeAttribute attribute, ProxyContext context) { super(parent, attribute, context); - this.attribute = attribute; - ValidationResults validationRes = attribute.getValidationResults(); - if ( validationRes == null ) { - validationRes = new ValidationResults(); - } - this.validationResults = new ValidationResultsProxy(context, attribute, validationRes); - this.errorConfirmed = ((CollectRecord) attribute.getRecord()).isErrorConfirmed(attribute); - } - - public ValidationResultsProxy getValidationResults(){ - return validationResults; + this.codeAttribute = attribute; } - public void setValidationResults(ValidationResultsProxy value) { - this.validationResults = value; + public boolean isEnumerator() { + CodeAttributeDefinition definition = codeAttribute.getDefinition(); + EntityDefinition parentDefinition = (EntityDefinition) definition.getParentDefinition(); + return ( + parentDefinition.isEnumerable() && + definition.isKey() && + definition.getList() != null && + !definition.getList().isExternal() + ); + } - public List getFields() { - List> fields = attribute.getFields(); - List result = new ArrayList(fields.size()); - for (Field field : fields) { - result.add(new FieldProxy(field)); - } - return result; + protected boolean isExternalCodeList() { + CodeAttributeDefinition defn = codeAttribute.getDefinition(); + CodeList list = defn.getList(); + return list.isExternal(); } - public boolean isErrorConfirmed() { - return errorConfirmed; - } - - public void setErrorConfirmed(boolean value) { - this.errorConfirmed = value; - } - } From ff184352bdfd1ee376fcf0817484eed02e40eeba Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:38 +0100 Subject: [PATCH 1523/1620] New translations CodeAttributeProxy.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 68 +++++++------------ 1 file changed, 25 insertions(+), 43 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index bc3c287e47..42d1e5f858 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -3,60 +3,42 @@ */ package org.openforis.collect.model.proxy; -import java.util.ArrayList; -import java.util.List; - import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.CollectRecord; -import org.openforis.idm.metamodel.validation.ValidationResults; -import org.openforis.idm.model.Attribute; -import org.openforis.idm.model.Field; +import org.openforis.idm.metamodel.CodeAttributeDefinition; +import org.openforis.idm.metamodel.CodeList; +import org.openforis.idm.metamodel.EntityDefinition; +import org.openforis.idm.model.CodeAttribute; /** - * @author M. Togna * @author S. Ricci - * - * */ -public class AttributeProxy extends NodeProxy { + * + */ +public class CodeAttributeProxy extends AttributeProxy { - private transient Attribute attribute; - private ValidationResultsProxy validationResults; - private boolean errorConfirmed; + private CodeAttribute codeAttribute; - public AttributeProxy(EntityProxy parent, Attribute attribute, ProxyContext context) { + public CodeAttributeProxy(EntityProxy parent, + CodeAttribute attribute, ProxyContext context) { super(parent, attribute, context); - this.attribute = attribute; - ValidationResults validationRes = attribute.getValidationResults(); - if ( validationRes == null ) { - validationRes = new ValidationResults(); - } - this.validationResults = new ValidationResultsProxy(context, attribute, validationRes); - this.errorConfirmed = ((CollectRecord) attribute.getRecord()).isErrorConfirmed(attribute); - } - - public ValidationResultsProxy getValidationResults(){ - return validationResults; + this.codeAttribute = attribute; } - public void setValidationResults(ValidationResultsProxy value) { - this.validationResults = value; + public boolean isEnumerator() { + CodeAttributeDefinition definition = codeAttribute.getDefinition(); + EntityDefinition parentDefinition = (EntityDefinition) definition.getParentDefinition(); + return ( + parentDefinition.isEnumerable() && + definition.isKey() && + definition.getList() != null && + !definition.getList().isExternal() + ); + } - public List getFields() { - List> fields = attribute.getFields(); - List result = new ArrayList(fields.size()); - for (Field field : fields) { - result.add(new FieldProxy(field)); - } - return result; + protected boolean isExternalCodeList() { + CodeAttributeDefinition defn = codeAttribute.getDefinition(); + CodeList list = defn.getList(); + return list.isExternal(); } - public boolean isErrorConfirmed() { - return errorConfirmed; - } - - public void setErrorConfirmed(boolean value) { - this.errorConfirmed = value; - } - } From b7b68404579f1f59ab94e94fdc37696c47a6ba0d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:39 +0100 Subject: [PATCH 1524/1620] New translations AttributeAddChangeProxy.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 40 +++++-------------- 1 file changed, 9 insertions(+), 31 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 42d1e5f858..77ee59553a 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,44 +1,22 @@ -/** - * - */ package org.openforis.collect.model.proxy; import org.openforis.collect.ProxyContext; -import org.openforis.idm.metamodel.CodeAttributeDefinition; -import org.openforis.idm.metamodel.CodeList; -import org.openforis.idm.metamodel.EntityDefinition; -import org.openforis.idm.model.CodeAttribute; +import org.openforis.collect.model.AttributeChange; /** + * * @author S. Ricci * */ -public class CodeAttributeProxy extends AttributeProxy { +public class AttributeAddChangeProxy extends AttributeChangeProxy implements NodeAddChangeProxy { - private CodeAttribute codeAttribute; - - public CodeAttributeProxy(EntityProxy parent, - CodeAttribute attribute, ProxyContext context) { - super(parent, attribute, context); - this.codeAttribute = attribute; + public AttributeAddChangeProxy(AttributeChange change, ProxyContext context) { + super(change, context); } - public boolean isEnumerator() { - CodeAttributeDefinition definition = codeAttribute.getDefinition(); - EntityDefinition parentDefinition = (EntityDefinition) definition.getParentDefinition(); - return ( - parentDefinition.isEnumerable() && - definition.isKey() && - definition.getList() != null && - !definition.getList().isExternal() - ); - + @Override + public NodeProxy getCreatedNode() { + return NodeProxy.fromNode(change.getNode(), context); } - protected boolean isExternalCodeList() { - CodeAttributeDefinition defn = codeAttribute.getDefinition(); - CodeList list = defn.getList(); - return list.isExternal(); - } - -} +} \ No newline at end of file From 620933a633ef4b0d9da90eddcab4ac27d441e8f5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:40 +0100 Subject: [PATCH 1525/1620] New translations CodeAttributeProxy.java (English) --- .../earth/app/view/Messages_en.properties | 68 +++++++------------ 1 file changed, 25 insertions(+), 43 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index bc3c287e47..42d1e5f858 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -3,60 +3,42 @@ */ package org.openforis.collect.model.proxy; -import java.util.ArrayList; -import java.util.List; - import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.CollectRecord; -import org.openforis.idm.metamodel.validation.ValidationResults; -import org.openforis.idm.model.Attribute; -import org.openforis.idm.model.Field; +import org.openforis.idm.metamodel.CodeAttributeDefinition; +import org.openforis.idm.metamodel.CodeList; +import org.openforis.idm.metamodel.EntityDefinition; +import org.openforis.idm.model.CodeAttribute; /** - * @author M. Togna * @author S. Ricci - * - * */ -public class AttributeProxy extends NodeProxy { + * + */ +public class CodeAttributeProxy extends AttributeProxy { - private transient Attribute attribute; - private ValidationResultsProxy validationResults; - private boolean errorConfirmed; + private CodeAttribute codeAttribute; - public AttributeProxy(EntityProxy parent, Attribute attribute, ProxyContext context) { + public CodeAttributeProxy(EntityProxy parent, + CodeAttribute attribute, ProxyContext context) { super(parent, attribute, context); - this.attribute = attribute; - ValidationResults validationRes = attribute.getValidationResults(); - if ( validationRes == null ) { - validationRes = new ValidationResults(); - } - this.validationResults = new ValidationResultsProxy(context, attribute, validationRes); - this.errorConfirmed = ((CollectRecord) attribute.getRecord()).isErrorConfirmed(attribute); - } - - public ValidationResultsProxy getValidationResults(){ - return validationResults; + this.codeAttribute = attribute; } - public void setValidationResults(ValidationResultsProxy value) { - this.validationResults = value; + public boolean isEnumerator() { + CodeAttributeDefinition definition = codeAttribute.getDefinition(); + EntityDefinition parentDefinition = (EntityDefinition) definition.getParentDefinition(); + return ( + parentDefinition.isEnumerable() && + definition.isKey() && + definition.getList() != null && + !definition.getList().isExternal() + ); + } - public List getFields() { - List> fields = attribute.getFields(); - List result = new ArrayList(fields.size()); - for (Field field : fields) { - result.add(new FieldProxy(field)); - } - return result; + protected boolean isExternalCodeList() { + CodeAttributeDefinition defn = codeAttribute.getDefinition(); + CodeList list = defn.getList(); + return list.isExternal(); } - public boolean isErrorConfirmed() { - return errorConfirmed; - } - - public void setErrorConfirmed(boolean value) { - this.errorConfirmed = value; - } - } From 0639a5b1bd4df6c25369374a749370d6536d2b46 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:42 +0100 Subject: [PATCH 1526/1620] New translations EntityAddChangeProxy.java (French) --- .../earth/app/view/Messages_fr.properties | 40 +++++-------------- 1 file changed, 9 insertions(+), 31 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 42d1e5f858..5fafbba101 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,44 +1,22 @@ -/** - * - */ package org.openforis.collect.model.proxy; import org.openforis.collect.ProxyContext; -import org.openforis.idm.metamodel.CodeAttributeDefinition; -import org.openforis.idm.metamodel.CodeList; -import org.openforis.idm.metamodel.EntityDefinition; -import org.openforis.idm.model.CodeAttribute; +import org.openforis.collect.model.EntityChange; /** + * * @author S. Ricci * */ -public class CodeAttributeProxy extends AttributeProxy { - - private CodeAttribute codeAttribute; - - public CodeAttributeProxy(EntityProxy parent, - CodeAttribute attribute, ProxyContext context) { - super(parent, attribute, context); - this.codeAttribute = attribute; - } +public class EntityAddChangeProxy extends EntityChangeProxy implements NodeAddChangeProxy { - public boolean isEnumerator() { - CodeAttributeDefinition definition = codeAttribute.getDefinition(); - EntityDefinition parentDefinition = (EntityDefinition) definition.getParentDefinition(); - return ( - parentDefinition.isEnumerable() && - definition.isKey() && - definition.getList() != null && - !definition.getList().isExternal() - ); - + public EntityAddChangeProxy(EntityChange change, ProxyContext context) { + super(change, context); } - protected boolean isExternalCodeList() { - CodeAttributeDefinition defn = codeAttribute.getDefinition(); - CodeList list = defn.getList(); - return list.isExternal(); + @Override + public NodeProxy getCreatedNode() { + return NodeProxy.fromNode(change.getNode(), context); } -} +} \ No newline at end of file From 8814f3beb690dcf380152bc531029d0ef7fe7253 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:43 +0100 Subject: [PATCH 1527/1620] New translations EntityAddChangeProxy.java (Spanish) --- .../earth/app/view/Messages_es.properties | 62 ++++--------------- 1 file changed, 11 insertions(+), 51 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index bc3c287e47..5fafbba101 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,62 +1,22 @@ -/** - * - */ package org.openforis.collect.model.proxy; -import java.util.ArrayList; -import java.util.List; - import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.CollectRecord; -import org.openforis.idm.metamodel.validation.ValidationResults; -import org.openforis.idm.model.Attribute; -import org.openforis.idm.model.Field; +import org.openforis.collect.model.EntityChange; /** - * @author M. Togna - * @author S. Ricci * - * */ -public class AttributeProxy extends NodeProxy { - - private transient Attribute attribute; - private ValidationResultsProxy validationResults; - private boolean errorConfirmed; - - public AttributeProxy(EntityProxy parent, Attribute attribute, ProxyContext context) { - super(parent, attribute, context); - this.attribute = attribute; - ValidationResults validationRes = attribute.getValidationResults(); - if ( validationRes == null ) { - validationRes = new ValidationResults(); - } - this.validationResults = new ValidationResultsProxy(context, attribute, validationRes); - this.errorConfirmed = ((CollectRecord) attribute.getRecord()).isErrorConfirmed(attribute); - } - - public ValidationResultsProxy getValidationResults(){ - return validationResults; - } + * @author S. Ricci + * + */ +public class EntityAddChangeProxy extends EntityChangeProxy implements NodeAddChangeProxy { - public void setValidationResults(ValidationResultsProxy value) { - this.validationResults = value; + public EntityAddChangeProxy(EntityChange change, ProxyContext context) { + super(change, context); } - public List getFields() { - List> fields = attribute.getFields(); - List result = new ArrayList(fields.size()); - for (Field field : fields) { - result.add(new FieldProxy(field)); - } - return result; + @Override + public NodeProxy getCreatedNode() { + return NodeProxy.fromNode(change.getNode(), context); } - public boolean isErrorConfirmed() { - return errorConfirmed; - } - - public void setErrorConfirmed(boolean value) { - this.errorConfirmed = value; - } - -} +} \ No newline at end of file From d41871f03958533d59cbaddb6f1018971e0916e9 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:44 +0100 Subject: [PATCH 1528/1620] New translations EntityAddChangeProxy.java (Portuguese) --- .../collect/earth/app/view/Messages_pt.properties | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 77ee59553a..5fafbba101 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,16 +1,16 @@ package org.openforis.collect.model.proxy; import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.AttributeChange; +import org.openforis.collect.model.EntityChange; /** * * @author S. Ricci * */ -public class AttributeAddChangeProxy extends AttributeChangeProxy implements NodeAddChangeProxy { +public class EntityAddChangeProxy extends EntityChangeProxy implements NodeAddChangeProxy { - public AttributeAddChangeProxy(AttributeChange change, ProxyContext context) { + public EntityAddChangeProxy(EntityChange change, ProxyContext context) { super(change, context); } @@ -18,5 +18,5 @@ public class AttributeAddChangeProxy extends AttributeChangeProxy implements Nod public NodeProxy getCreatedNode() { return NodeProxy.fromNode(change.getNode(), context); } - + } \ No newline at end of file From 89a512af25883abd5eda8eb1f412f1c191077c6e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:45 +0100 Subject: [PATCH 1529/1620] New translations EntityAddChangeProxy.java (English) --- .../earth/app/view/Messages_en.properties | 40 +++++-------------- 1 file changed, 9 insertions(+), 31 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 42d1e5f858..5fafbba101 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,44 +1,22 @@ -/** - * - */ package org.openforis.collect.model.proxy; import org.openforis.collect.ProxyContext; -import org.openforis.idm.metamodel.CodeAttributeDefinition; -import org.openforis.idm.metamodel.CodeList; -import org.openforis.idm.metamodel.EntityDefinition; -import org.openforis.idm.model.CodeAttribute; +import org.openforis.collect.model.EntityChange; /** + * * @author S. Ricci * */ -public class CodeAttributeProxy extends AttributeProxy { - - private CodeAttribute codeAttribute; - - public CodeAttributeProxy(EntityProxy parent, - CodeAttribute attribute, ProxyContext context) { - super(parent, attribute, context); - this.codeAttribute = attribute; - } +public class EntityAddChangeProxy extends EntityChangeProxy implements NodeAddChangeProxy { - public boolean isEnumerator() { - CodeAttributeDefinition definition = codeAttribute.getDefinition(); - EntityDefinition parentDefinition = (EntityDefinition) definition.getParentDefinition(); - return ( - parentDefinition.isEnumerable() && - definition.isKey() && - definition.getList() != null && - !definition.getList().isExternal() - ); - + public EntityAddChangeProxy(EntityChange change, ProxyContext context) { + super(change, context); } - protected boolean isExternalCodeList() { - CodeAttributeDefinition defn = codeAttribute.getDefinition(); - CodeList list = defn.getList(); - return list.isExternal(); + @Override + public NodeProxy getCreatedNode() { + return NodeProxy.fromNode(change.getNode(), context); } -} +} \ No newline at end of file From 42b321eba2163ae4ed88771298da92359751564d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:46 +0100 Subject: [PATCH 1530/1620] New translations EntityChangeProxy.java (French) --- .../earth/app/view/Messages_fr.properties | 45 ++++++++++++++++--- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 5fafbba101..f636beae70 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,22 +1,53 @@ package org.openforis.collect.model.proxy; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + import org.openforis.collect.ProxyContext; import org.openforis.collect.model.EntityChange; +import org.openforis.idm.metamodel.validation.ValidationResultFlag; /** - * + * * @author S. Ricci * */ -public class EntityAddChangeProxy extends EntityChangeProxy implements NodeAddChangeProxy { +public class EntityChangeProxy extends NodeChangeProxy { - public EntityAddChangeProxy(EntityChange change, ProxyContext context) { + public EntityChangeProxy(EntityChange change, ProxyContext context) { super(change, context); } - @Override - public NodeProxy getCreatedNode() { - return NodeProxy.fromNode(change.getNode(), context); + public Map getRelevant() { + return convertToChildDefinitionIdMap(change.getChildrenRelevance()); + } + + public Map getMinCountByChildDefinitionId() { + return change.getMinCountByChildDefinitionId(); } - + + public Map getMaxCountByChildDefinitionId() { + return change.getMaxCountByChildDefinitionId(); + } + + public Map getMinCountValidation() { + return convertToChildDefinitionIdMap(change.getChildrenMinCountValidation()); + } + + public Map getMaxCountValidation() { + return convertToChildDefinitionIdMap(change.getChildrenMaxCountValidation()); + } + + private Map convertToChildDefinitionIdMap(Map from) { + Map map = new HashMap<>(); + Set> entries = from.entrySet(); + for (Entry entry : entries) { + Integer childDefId = entry.getKey(); + map.put(childDefId, entry.getValue()); + } + return map; + } + } \ No newline at end of file From 0c830a5db2bbc75584bbed62755cc6cab1a2b3f7 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:47 +0100 Subject: [PATCH 1531/1620] New translations EntityChangeProxy.java (Spanish) --- .../earth/app/view/Messages_es.properties | 45 ++++++++++++++++--- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 5fafbba101..f636beae70 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,22 +1,53 @@ package org.openforis.collect.model.proxy; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + import org.openforis.collect.ProxyContext; import org.openforis.collect.model.EntityChange; +import org.openforis.idm.metamodel.validation.ValidationResultFlag; /** - * + * * @author S. Ricci * */ -public class EntityAddChangeProxy extends EntityChangeProxy implements NodeAddChangeProxy { +public class EntityChangeProxy extends NodeChangeProxy { - public EntityAddChangeProxy(EntityChange change, ProxyContext context) { + public EntityChangeProxy(EntityChange change, ProxyContext context) { super(change, context); } - @Override - public NodeProxy getCreatedNode() { - return NodeProxy.fromNode(change.getNode(), context); + public Map getRelevant() { + return convertToChildDefinitionIdMap(change.getChildrenRelevance()); + } + + public Map getMinCountByChildDefinitionId() { + return change.getMinCountByChildDefinitionId(); } - + + public Map getMaxCountByChildDefinitionId() { + return change.getMaxCountByChildDefinitionId(); + } + + public Map getMinCountValidation() { + return convertToChildDefinitionIdMap(change.getChildrenMinCountValidation()); + } + + public Map getMaxCountValidation() { + return convertToChildDefinitionIdMap(change.getChildrenMaxCountValidation()); + } + + private Map convertToChildDefinitionIdMap(Map from) { + Map map = new HashMap<>(); + Set> entries = from.entrySet(); + for (Entry entry : entries) { + Integer childDefId = entry.getKey(); + map.put(childDefId, entry.getValue()); + } + return map; + } + } \ No newline at end of file From d618c6f3178b197b645d7d9ece22ad0b90f6b5f1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:48 +0100 Subject: [PATCH 1532/1620] New translations EntityChangeProxy.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 45 ++++++++++++++++--- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 5fafbba101..f636beae70 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,22 +1,53 @@ package org.openforis.collect.model.proxy; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + import org.openforis.collect.ProxyContext; import org.openforis.collect.model.EntityChange; +import org.openforis.idm.metamodel.validation.ValidationResultFlag; /** - * + * * @author S. Ricci * */ -public class EntityAddChangeProxy extends EntityChangeProxy implements NodeAddChangeProxy { +public class EntityChangeProxy extends NodeChangeProxy { - public EntityAddChangeProxy(EntityChange change, ProxyContext context) { + public EntityChangeProxy(EntityChange change, ProxyContext context) { super(change, context); } - @Override - public NodeProxy getCreatedNode() { - return NodeProxy.fromNode(change.getNode(), context); + public Map getRelevant() { + return convertToChildDefinitionIdMap(change.getChildrenRelevance()); + } + + public Map getMinCountByChildDefinitionId() { + return change.getMinCountByChildDefinitionId(); } - + + public Map getMaxCountByChildDefinitionId() { + return change.getMaxCountByChildDefinitionId(); + } + + public Map getMinCountValidation() { + return convertToChildDefinitionIdMap(change.getChildrenMinCountValidation()); + } + + public Map getMaxCountValidation() { + return convertToChildDefinitionIdMap(change.getChildrenMaxCountValidation()); + } + + private Map convertToChildDefinitionIdMap(Map from) { + Map map = new HashMap<>(); + Set> entries = from.entrySet(); + for (Entry entry : entries) { + Integer childDefId = entry.getKey(); + map.put(childDefId, entry.getValue()); + } + return map; + } + } \ No newline at end of file From 4be5b8d4ce2a91bd33b00a53c788622ea34034d4 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:49 +0100 Subject: [PATCH 1533/1620] New translations EntityChangeProxy.java (English) --- .../earth/app/view/Messages_en.properties | 45 ++++++++++++++++--- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 5fafbba101..f636beae70 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,22 +1,53 @@ package org.openforis.collect.model.proxy; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + import org.openforis.collect.ProxyContext; import org.openforis.collect.model.EntityChange; +import org.openforis.idm.metamodel.validation.ValidationResultFlag; /** - * + * * @author S. Ricci * */ -public class EntityAddChangeProxy extends EntityChangeProxy implements NodeAddChangeProxy { +public class EntityChangeProxy extends NodeChangeProxy { - public EntityAddChangeProxy(EntityChange change, ProxyContext context) { + public EntityChangeProxy(EntityChange change, ProxyContext context) { super(change, context); } - @Override - public NodeProxy getCreatedNode() { - return NodeProxy.fromNode(change.getNode(), context); + public Map getRelevant() { + return convertToChildDefinitionIdMap(change.getChildrenRelevance()); + } + + public Map getMinCountByChildDefinitionId() { + return change.getMinCountByChildDefinitionId(); } - + + public Map getMaxCountByChildDefinitionId() { + return change.getMaxCountByChildDefinitionId(); + } + + public Map getMinCountValidation() { + return convertToChildDefinitionIdMap(change.getChildrenMinCountValidation()); + } + + public Map getMaxCountValidation() { + return convertToChildDefinitionIdMap(change.getChildrenMaxCountValidation()); + } + + private Map convertToChildDefinitionIdMap(Map from) { + Map map = new HashMap<>(); + Set> entries = from.entrySet(); + for (Entry entry : entries) { + Integer childDefId = entry.getKey(); + map.put(childDefId, entry.getValue()); + } + return map; + } + } \ No newline at end of file From 20eb6b714f34464bb868d4a9b871e9fc294df528 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:50 +0100 Subject: [PATCH 1534/1620] New translations EntityProxy.java (French) --- .../earth/app/view/Messages_fr.properties | 127 ++++++++++++++---- 1 file changed, 101 insertions(+), 26 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index f636beae70..71392d44df 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,53 +1,128 @@ +/** + * + */ package org.openforis.collect.model.proxy; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.EntityChange; +import org.openforis.collect.metamodel.ui.UIOptions; +import org.openforis.collect.model.CollectSurvey; +import org.openforis.idm.metamodel.EntityDefinition; +import org.openforis.idm.metamodel.ModelVersion; +import org.openforis.idm.metamodel.NodeDefinition; import org.openforis.idm.metamodel.validation.ValidationResultFlag; +import org.openforis.idm.model.Entity; +import org.openforis.idm.model.Node; +import org.openforis.idm.model.Record; /** - * + * @author M. Togna * @author S. Ricci - * + * */ -public class EntityChangeProxy extends NodeChangeProxy { +public class EntityProxy extends NodeProxy { - public EntityChangeProxy(EntityChange change, ProxyContext context) { - super(change, context); + private Entity entity; + private List availableChildDefinitions; + + public EntityProxy(EntityProxy parent, Entity entity, ProxyContext context) { + super(parent, entity, context); + this.entity = entity; + this.availableChildDefinitions = getAvailableChildDefinitions(); } - public Map getRelevant() { - return convertToChildDefinitionIdMap(change.getChildrenRelevance()); + public Map> getChildrenByDefinitionId() { + Map> result = new HashMap>(); + for (NodeDefinition childDefinition : availableChildDefinitions) { + List> nodes = this.entity.getChildren(childDefinition); + List proxies = NodeProxy.fromList(this, nodes, context); + result.put(childDefinition.getId(), proxies); + } + return result; } - public Map getMinCountByChildDefinitionId() { - return change.getMinCountByChildDefinitionId(); + public List getChildrenRelevance() { + List result = new ArrayList(availableChildDefinitions.size()); + for (NodeDefinition childDefinition : availableChildDefinitions) { + boolean relevant = entity.isRelevant(childDefinition); + result.add(relevant); + } + return result; } - public Map getMaxCountByChildDefinitionId() { - return change.getMaxCountByChildDefinitionId(); + public List getChildrenMinCountValidation() { + List result = new ArrayList(availableChildDefinitions.size()); + for (NodeDefinition childDefinition : availableChildDefinitions) { + ValidationResultFlag valid = entity.getMinCountValidationResult(childDefinition); + result.add(valid); + } + return result; } - public Map getMinCountValidation() { - return convertToChildDefinitionIdMap(change.getChildrenMinCountValidation()); + public List getChildrenMaxCountValidation() { + List result = new ArrayList(availableChildDefinitions.size()); + for (NodeDefinition childDefinition : availableChildDefinitions) { + ValidationResultFlag valid = entity.getMaxCountValidationResult(childDefinition); + result.add(valid); + } + return result; + } + + public List getChildrenMinCount() { + List result = new ArrayList(availableChildDefinitions.size()); + for (NodeDefinition childDefinition : availableChildDefinitions) { + int count = entity.getMinCount(childDefinition); + result.add(count); + } + return result; } - public Map getMaxCountValidation() { - return convertToChildDefinitionIdMap(change.getChildrenMaxCountValidation()); + public List getChildrenMaxCount() { + List result = new ArrayList(availableChildDefinitions.size()); + for (NodeDefinition childDefinition : availableChildDefinitions) { + Integer count = entity.getMaxCount(childDefinition); + result.add(count); + } + return result; } - private Map convertToChildDefinitionIdMap(Map from) { - Map map = new HashMap<>(); - Set> entries = from.entrySet(); - for (Entry entry : entries) { - Integer childDefId = entry.getKey(); - map.put(childDefId, entry.getValue()); + public List getChildrenErrorVisible() { + List result = new ArrayList(availableChildDefinitions.size()); + for (int i = 0; i < availableChildDefinitions.size(); i++) { + result.add(Boolean.FALSE); } - return map; + return result; } -} \ No newline at end of file + private List getAvailableChildDefinitions() { + List result = new ArrayList(); + UIOptions uiOptions = ((CollectSurvey) entity.getSurvey()).getUIOptions(); + for (NodeDefinition childDefinition : getChildDefinitions()) { + if ( isApplicable(childDefinition) && ! uiOptions.isHidden(childDefinition) ) { + result.add(childDefinition); + } + } + return result; + } + + protected boolean isApplicable(NodeDefinition childDefinition) { + Record record = entity.getRecord(); + ModelVersion version = record.getVersion(); + return version == null || version.isApplicable(childDefinition); + } + + public boolean isEnumerated() { + EntityDefinition definition = entity.getDefinition(); + return definition.isEnumerable(); + } + + private List getChildDefinitions() { + EntityDefinition definition = entity.getDefinition(); + return definition.getChildDefinitions(); + } + +} From 8a767be257d468e09af787f75622473eca08fd70 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:51 +0100 Subject: [PATCH 1535/1620] New translations AttributeAddChangeProxy.java (English) --- .../earth/app/view/Messages_en.properties | 45 +++---------------- 1 file changed, 7 insertions(+), 38 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index f636beae70..77ee59553a 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,53 +1,22 @@ package org.openforis.collect.model.proxy; -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.EntityChange; -import org.openforis.idm.metamodel.validation.ValidationResultFlag; +import org.openforis.collect.model.AttributeChange; /** - * + * * @author S. Ricci * */ -public class EntityChangeProxy extends NodeChangeProxy { +public class AttributeAddChangeProxy extends AttributeChangeProxy implements NodeAddChangeProxy { - public EntityChangeProxy(EntityChange change, ProxyContext context) { + public AttributeAddChangeProxy(AttributeChange change, ProxyContext context) { super(change, context); } - public Map getRelevant() { - return convertToChildDefinitionIdMap(change.getChildrenRelevance()); - } - - public Map getMinCountByChildDefinitionId() { - return change.getMinCountByChildDefinitionId(); - } - - public Map getMaxCountByChildDefinitionId() { - return change.getMaxCountByChildDefinitionId(); - } - - public Map getMinCountValidation() { - return convertToChildDefinitionIdMap(change.getChildrenMinCountValidation()); - } - - public Map getMaxCountValidation() { - return convertToChildDefinitionIdMap(change.getChildrenMaxCountValidation()); - } - - private Map convertToChildDefinitionIdMap(Map from) { - Map map = new HashMap<>(); - Set> entries = from.entrySet(); - for (Entry entry : entries) { - Integer childDefId = entry.getKey(); - map.put(childDefId, entry.getValue()); - } - return map; + @Override + public NodeProxy getCreatedNode() { + return NodeProxy.fromNode(change.getNode(), context); } } \ No newline at end of file From e432bff5da66dc1ca6f4717205213cae9c1146dc Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:52 +0100 Subject: [PATCH 1536/1620] New translations AttributeAddChangeProxy.java (Spanish) --- .../earth/app/view/Messages_es.properties | 45 +++---------------- 1 file changed, 7 insertions(+), 38 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index f636beae70..77ee59553a 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,53 +1,22 @@ package org.openforis.collect.model.proxy; -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.EntityChange; -import org.openforis.idm.metamodel.validation.ValidationResultFlag; +import org.openforis.collect.model.AttributeChange; /** - * + * * @author S. Ricci * */ -public class EntityChangeProxy extends NodeChangeProxy { +public class AttributeAddChangeProxy extends AttributeChangeProxy implements NodeAddChangeProxy { - public EntityChangeProxy(EntityChange change, ProxyContext context) { + public AttributeAddChangeProxy(AttributeChange change, ProxyContext context) { super(change, context); } - public Map getRelevant() { - return convertToChildDefinitionIdMap(change.getChildrenRelevance()); - } - - public Map getMinCountByChildDefinitionId() { - return change.getMinCountByChildDefinitionId(); - } - - public Map getMaxCountByChildDefinitionId() { - return change.getMaxCountByChildDefinitionId(); - } - - public Map getMinCountValidation() { - return convertToChildDefinitionIdMap(change.getChildrenMinCountValidation()); - } - - public Map getMaxCountValidation() { - return convertToChildDefinitionIdMap(change.getChildrenMaxCountValidation()); - } - - private Map convertToChildDefinitionIdMap(Map from) { - Map map = new HashMap<>(); - Set> entries = from.entrySet(); - for (Entry entry : entries) { - Integer childDefId = entry.getKey(); - map.put(childDefId, entry.getValue()); - } - return map; + @Override + public NodeProxy getCreatedNode() { + return NodeProxy.fromNode(change.getNode(), context); } } \ No newline at end of file From a4f151436ad155e11fe1dd0773a9232ea068f176 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:54 +0100 Subject: [PATCH 1537/1620] New translations PlanetImagery.java (Spanish) --- .../earth/app/view/Messages_es.properties | 352 +++++++++++++++++- 1 file changed, 337 insertions(+), 15 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 77ee59553a..34f161190b 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,22 +1,344 @@ -package org.openforis.collect.model.proxy; +package org.openforis.collect.earth.planet; -import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.AttributeChange; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.security.Security; +import java.time.LocalDateTime; +import java.util.Arrays; +import java.util.Base64; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; -/** - * - * @author S. Ricci - * - */ -public class AttributeAddChangeProxy extends AttributeChangeProxy implements NodeAddChangeProxy { +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; - public AttributeAddChangeProxy(AttributeChange change, ProxyContext context) { - super(change, context); +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.service.TrustAllCertificates; +import org.openforis.collect.earth.sampler.model.SimpleCoordinate; +import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +public class PlanetImagery { + + private static final Logger logger = LoggerFactory.getLogger(PlanetImagery.class); + private static final Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").create(); + private static final SSLSocketFactory factory = getSSLAcceptAllFactory(); + + private String apiKey; + + private int retries = 0; + + private static final int MAX_RETRIES = 6; + + public PlanetImagery(String apiKey) { + super(); + this.apiKey = apiKey; + } + + private Filter getDateFilter(Date start, Date end) { + Filter dateFilter = new Filter<>(); + dateFilter.setType(FilterType.DATERANGE); + dateFilter.setFieldName(PlanetAttributes.ACQUIRED); + dateFilter.setConfig(new FilterConfig(new DatePlanet(start), new DatePlanet(end))); + return dateFilter; } - @Override - public NodeProxy getCreatedNode() { - return NodeProxy.fromNode(change.getNode(), context); + private Filter withinDaysFilter(Feature feature, int days) { + Date acquriredDate = feature.getProperties().getAcquired(); + LocalDateTime localDateTime = DateUtils.asLocalDateTime(acquriredDate); + Date start = DateUtils.asDate(localDateTime.minusDays(days)); + Date end = DateUtils.asDate(localDateTime.plusDays(days - 1)); + return getDateFilter(start, end); } -} \ No newline at end of file + private Filter getGeometryFilter(GeoJson geoJson) { + Filter geoFilter = new Filter<>(); + geoFilter.setType(FilterType.GEOMETRY); + geoFilter.setFieldName(PlanetAttributes.GEOMETRY); + geoFilter.setConfig(new FilterConfig(geoJson.getType(), geoJson.getCoordinates())); + return geoFilter; + } + + private Filter getAndFilter(Filter[] filters) { + Filter andFilter = new Filter<>(); + andFilter.setType(FilterType.AND); + andFilter.setConfig(filters); + return andFilter; + } + + private Filter getOrFilter(Filter[] filters) { + Filter andFilter = new Filter<>(); + andFilter.setType(FilterType.OR); + andFilter.setConfig(filters); + return andFilter; + } + + private Filter getStringInFilter(String fieldName, String[] strings) { + Filter stringInFilter = new Filter<>(); + stringInFilter.setType(FilterType.STRING_IN); + stringInFilter.setFieldName(fieldName); + stringInFilter.setConfig(strings); + return stringInFilter; + } + + private int getQuality(Feature feature) { + FeatureProperties p = feature.getProperties(); + Integer quality = p.getClearPercent(); + if (quality != null) + return quality; + else { + return (int) ((1 - p.getCloudCover()) * 50); + } + } + + private String sendRequest(URL url, Object jsonObject) throws IOException { + try { + + HttpURLConnection conn = getAuthenticatedConnection(url, jsonObject); + + buildRequet(jsonObject, conn); + + StringBuilder response = null; + try { + response = readStream(conn.getInputStream()); + } finally { + conn.disconnect(); + } + + retries = 0; // reset the counter as it was a success + return response.toString(); + } catch (IOException e) { + if( e.getMessage()!=null && e.getMessage().contains("429") ) { // This happens when there are too many consecutive requests! Make the user wait a bit and try again! + try { + if( retries < MAX_RETRIES ) { + Thread.sleep( 5000 ); + retries++; + }else { + retries = 0; + throw e; + } + } catch (InterruptedException e1) { + logger.error( "Error waiting for Thread requesting Planet imagery"); + } + return sendRequest(url, jsonObject); + }else { + throw e; // Another type of error throw! + } + } + } + + private void buildRequet(Object jsonObject, HttpURLConnection conn) + throws IOException { + byte[] postDataBytes = null; + if (jsonObject != null) { + String jsonInputString = gson.toJson(jsonObject); + postDataBytes = jsonInputString.getBytes( StandardCharsets.UTF_8.name()); + logger.info(jsonInputString); + } + if (postDataBytes != null) { + conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length)); + conn.getOutputStream().write(postDataBytes); + } else { + conn.setRequestProperty("Content-Length", "0"); + } + } + + private HttpURLConnection getAuthenticatedConnection(URL url, Object jsonObject) + throws IOException { + HttpURLConnection conn = null; + if( factory != null ) { // THIS IS A WORKAROUND TO REMOVE SSL CERTIFICATE ISSUES + conn = (HttpsURLConnection) url.openConnection(); + ((HttpsURLConnection)conn).setSSLSocketFactory(factory); + }else { + conn = (HttpURLConnection) url.openConnection(); + } + + // very important to keep the semicolon at the end + String basicAuth = "Basic " + new String(Base64.getEncoder().encode((apiKey + ":").getBytes())); + conn.setRequestProperty("Authorization", basicAuth); + + conn.setRequestMethod(jsonObject != null ? "POST" : "GET"); + conn.setRequestProperty("Content-Type", "application/json"); + conn.setRequestProperty("Accept", "application/json"); + conn.setDoOutput(true); + return conn; + } + + // Workaround for computers that have trouble accepting Planet's SSL certificates + private static SSLSocketFactory getSSLAcceptAllFactory(){ + SSLSocketFactory factory = null; + try { + Security.getProviders(); + final SSLContext ssl = SSLContext.getInstance("TLSv1.2"); + ssl.init(null, new TrustManager[] { new TrustAllCertificates() }, null); + return ssl.getSocketFactory(); + } catch (Exception e) { + logger.error( "Error obtaining SSL factory when opeining Planet REST URL",e); + } + + return factory; + } + + private StringBuilder readStream(InputStream is) throws IOException { + StringBuilder response = new StringBuilder(); + try (BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) { + String responseLine = null; + while ((responseLine = br.readLine()) != null) { + response.append(responseLine.trim()); + } + } + return response; + } + + private Feature[] search(String[] itemTypes, Filter[] filters, Integer maxResults) throws IOException { + + Filter andFilter = getAndFilter(filters); + SearchRequest searchRequest = new SearchRequest(itemTypes, andFilter); + + String response = sendRequest(new URL("https://api.planet.com/data/v1/quick-search"), searchRequest); + Feature[] featuresInPage = getNextPage(response); + + if (featuresInPage != null && maxResults != null ) { + Arrays.sort(featuresInPage, new FeatureSorter()); + + if (featuresInPage.length > maxResults) { + featuresInPage = ArrayUtils.subarray(featuresInPage, 0, maxResults); + } + ArrayUtils.reverse(featuresInPage); + } + + return featuresInPage; + + } + + private Feature[] getNextPage(String resJson) throws IOException { + if (StringUtils.isNotBlank(resJson)) { + Response resp = gson.fromJson(resJson, Response.class); + Feature[] features = resp.getFeatures(); + Links links = resp.getLinks(); + if (links != null && links.getNext() != null) { + String nextUrl = links.getNext(); + String res = sendRequest(new URL(nextUrl), null); + Feature[] nextFeatures = getNextPage(res); + return ArrayUtils.addAll(features, nextFeatures); + } else { + return features; + } + } else { + return new Feature[] {}; + } + } + + private String getLayers(Feature[] features) throws IOException { + String layerUrl = ""; + if (features.length > 0) { + String[] ids = new String[features.length]; + for (int i = 0; i < ids.length; i++) { + Feature feature = features[i]; + + String idSearch = feature.getProperties().getItemType() + ':' + feature.getId(); + ids[i] = idSearch; + } + + SearchRequest layerRequest = new SearchRequest(ids); + String layers = sendRequest(new URL("https://tiles0.planet.com/data/v1/layers"), layerRequest); + LayerResponse layerResponse = gson.fromJson(layers, LayerResponse.class); + if (layerResponse != null) { + layerUrl = layerResponse.getTiles()[0]; + } + } + return layerUrl; + } + + private Feature[] getFeatures (PlanetRequestParameters planetRequestParameters ) throws IOException { + Calendar thresholdQuality = Calendar.getInstance(); + thresholdQuality.set(2016, 0,1); + + GeoJson geometry = new GeoJson("Polygon", planetRequestParameters.getCoords()); + Filter geometryFilter = getGeometryFilter(geometry); + Filter[] filters = null; + /* maybe we can use test quality anyway + * it gets complicated when the filter start/end date is multiyear + */ + if( planetRequestParameters.getStart().before( thresholdQuality.getTime() ) && planetRequestParameters.getEnd().after( thresholdQuality.getTime() ) ) { + + Filter qualityFilter = getStringInFilter("quality_category", new String[] { "standard" }); + Filter before2016Filter = getDateFilter(planetRequestParameters.getStart(), thresholdQuality.getTime() ); + Filter after2016Filter = getDateFilter(thresholdQuality.getTime(), planetRequestParameters.getEnd() ); + + Filter after2016AndStandardQuality = getAndFilter( new Filter[] { after2016Filter, qualityFilter } ); + Filter before2016OrAfter2016AndStandardQuality = getOrFilter( new Filter[] { before2016Filter, after2016AndStandardQuality } ); + + // Add quality filter only for images after 2016 + + filters = new Filter[] { before2016OrAfter2016AndStandardQuality, geometryFilter }; + + }else if( planetRequestParameters.getStart().after( thresholdQuality.getTime() ) ) { + Filter dateFilter = getDateFilter(planetRequestParameters.getStart(), planetRequestParameters.getEnd()); + // Add quality filter only for images after 2016 + Filter qualityFilter = getStringInFilter("quality_category", new String[] { "standard" }); + filters = new Filter[] { dateFilter, geometryFilter, qualityFilter }; + }else { + Filter dateFilter = getDateFilter(planetRequestParameters.getStart(), planetRequestParameters.getEnd()); + filters = new Filter[] { dateFilter, geometryFilter }; + } + + return search(planetRequestParameters.getItemTypes(), filters, null); + } + + public String getLayerUrl(PlanetRequestParameters planetRequestParameters) throws IOException { + Feature[] searchResults = getFeatures (planetRequestParameters); + return searchResults!=null ? getLayers(searchResults) : null; + } + + public Map getAvailableDates(PlanetRequestParameters planetRequestParameters) throws IOException { + + Feature[] searchResults = getFeatures (planetRequestParameters); + + Map datesAvailable = new HashMap<>(); + + Calendar cal = Calendar.getInstance(); + if( searchResults != null ) { + for (Feature feature : searchResults) { + cal.setTime( feature.getProperties().acquired ); + int year = cal.get( Calendar.YEAR ); + int month = cal.get( Calendar.MONTH ) + 1; + int day = cal.get( Calendar.DATE ); + datesAvailable.put( year+""+ ( month<10?"0"+month:month ), "true"); // THe month, in order to know for whcioh moinths there are images + datesAvailable.put( year+""+ ( month<10?"0"+month:month )+ ( day<10?"0"+day:day ), "true"); + } + } + return datesAvailable; + } + + public String getLatestUrl(SimplePlacemarkObject placemarkObject) throws IOException { + LocalDateTime localDateTime = DateUtils.asLocalDateTime(new Date()); + Date start = DateUtils.asDate(localDateTime.minusDays(30)); + + List shape = placemarkObject.getMultiShape().get(0); + + double[][][] polygon = new double[1][shape.size()][2]; + int i = 0; + for (SimpleCoordinate simpleCoordinate : shape) { + polygon[0][i][1] = Double.parseDouble(simpleCoordinate.getLatitude()); + polygon[0][i++][0] = Double.parseDouble(simpleCoordinate.getLongitude()); + } + String[] itemTypes = { "PSScene3Band", "PSScene4Band" }; + return getLayerUrl(new PlanetRequestParameters(start, new Date(), polygon, itemTypes)); + } +} From dad483c1382e298e9c6fd7bcbd93a23451c0a847 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:55 +0100 Subject: [PATCH 1538/1620] New translations SearchRequest.java (French) --- .../earth/app/view/Messages_fr.properties | 132 +++--------------- 1 file changed, 20 insertions(+), 112 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 71392d44df..34ef3a1eb1 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,128 +1,36 @@ -/** - * - */ -package org.openforis.collect.model.proxy; +package org.openforis.collect.earth.planet; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +public class SearchRequest{ -import org.openforis.collect.ProxyContext; -import org.openforis.collect.metamodel.ui.UIOptions; -import org.openforis.collect.model.CollectSurvey; -import org.openforis.idm.metamodel.EntityDefinition; -import org.openforis.idm.metamodel.ModelVersion; -import org.openforis.idm.metamodel.NodeDefinition; -import org.openforis.idm.metamodel.validation.ValidationResultFlag; -import org.openforis.idm.model.Entity; -import org.openforis.idm.model.Node; -import org.openforis.idm.model.Record; + String[] item_types; + Filter filter; + String[] ids; -/** - * @author M. Togna - * @author S. Ricci - * - */ -public class EntityProxy extends NodeProxy { - - private Entity entity; - private List availableChildDefinitions; - - public EntityProxy(EntityProxy parent, Entity entity, ProxyContext context) { - super(parent, entity, context); - this.entity = entity; - this.availableChildDefinitions = getAvailableChildDefinitions(); - } - - public Map> getChildrenByDefinitionId() { - Map> result = new HashMap>(); - for (NodeDefinition childDefinition : availableChildDefinitions) { - List> nodes = this.entity.getChildren(childDefinition); - List proxies = NodeProxy.fromList(this, nodes, context); - result.put(childDefinition.getId(), proxies); - } - return result; + public SearchRequest(String[] ids) { + super(); + this.ids = ids; } - public List getChildrenRelevance() { - List result = new ArrayList(availableChildDefinitions.size()); - for (NodeDefinition childDefinition : availableChildDefinitions) { - boolean relevant = entity.isRelevant(childDefinition); - result.add(relevant); - } - return result; + public SearchRequest(String[] itemTypes, Filter filter) { + super(); + this.item_types = itemTypes; + this.filter = filter; } - public List getChildrenMinCountValidation() { - List result = new ArrayList(availableChildDefinitions.size()); - for (NodeDefinition childDefinition : availableChildDefinitions) { - ValidationResultFlag valid = entity.getMinCountValidationResult(childDefinition); - result.add(valid); - } - return result; + public String[] getItemTypes() { + return item_types; } - public List getChildrenMaxCountValidation() { - List result = new ArrayList(availableChildDefinitions.size()); - for (NodeDefinition childDefinition : availableChildDefinitions) { - ValidationResultFlag valid = entity.getMaxCountValidationResult(childDefinition); - result.add(valid); - } - return result; - } - - public List getChildrenMinCount() { - List result = new ArrayList(availableChildDefinitions.size()); - for (NodeDefinition childDefinition : availableChildDefinitions) { - int count = entity.getMinCount(childDefinition); - result.add(count); - } - return result; + public void setItemTypes(String[] itemTypes) { + this.item_types = itemTypes; } - public List getChildrenMaxCount() { - List result = new ArrayList(availableChildDefinitions.size()); - for (NodeDefinition childDefinition : availableChildDefinitions) { - Integer count = entity.getMaxCount(childDefinition); - result.add(count); - } - return result; + public Filter getFilter() { + return filter; } - public List getChildrenErrorVisible() { - List result = new ArrayList(availableChildDefinitions.size()); - for (int i = 0; i < availableChildDefinitions.size(); i++) { - result.add(Boolean.FALSE); - } - return result; + public void setFilter(Filter filter) { + this.filter = filter; } - private List getAvailableChildDefinitions() { - List result = new ArrayList(); - UIOptions uiOptions = ((CollectSurvey) entity.getSurvey()).getUIOptions(); - for (NodeDefinition childDefinition : getChildDefinitions()) { - if ( isApplicable(childDefinition) && ! uiOptions.isHidden(childDefinition) ) { - result.add(childDefinition); - } - } - return result; - } - - protected boolean isApplicable(NodeDefinition childDefinition) { - Record record = entity.getRecord(); - ModelVersion version = record.getVersion(); - return version == null || version.isApplicable(childDefinition); - } - - public boolean isEnumerated() { - EntityDefinition definition = entity.getDefinition(); - return definition.isEnumerable(); - } - - private List getChildDefinitions() { - EntityDefinition definition = entity.getDefinition(); - return definition.getChildDefinitions(); - } - } From 4696beeba5dad54d5869c26206635ee4b14cb60b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:56 +0100 Subject: [PATCH 1539/1620] New translations PlanetImagery.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 355 ++++++++++++++++-- 1 file changed, 323 insertions(+), 32 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index f636beae70..34f161190b 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,53 +1,344 @@ -package org.openforis.collect.model.proxy; +package org.openforis.collect.earth.planet; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.security.Security; +import java.time.LocalDateTime; +import java.util.Arrays; +import java.util.Base64; +import java.util.Calendar; +import java.util.Date; import java.util.HashMap; +import java.util.List; import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.EntityChange; -import org.openforis.idm.metamodel.validation.ValidationResultFlag; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; -/** - * - * @author S. Ricci - * - */ -public class EntityChangeProxy extends NodeChangeProxy { +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.service.TrustAllCertificates; +import org.openforis.collect.earth.sampler.model.SimpleCoordinate; +import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; - public EntityChangeProxy(EntityChange change, ProxyContext context) { - super(change, context); +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +public class PlanetImagery { + + private static final Logger logger = LoggerFactory.getLogger(PlanetImagery.class); + private static final Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").create(); + private static final SSLSocketFactory factory = getSSLAcceptAllFactory(); + + private String apiKey; + + private int retries = 0; + + private static final int MAX_RETRIES = 6; + + public PlanetImagery(String apiKey) { + super(); + this.apiKey = apiKey; + } + + private Filter getDateFilter(Date start, Date end) { + Filter dateFilter = new Filter<>(); + dateFilter.setType(FilterType.DATERANGE); + dateFilter.setFieldName(PlanetAttributes.ACQUIRED); + dateFilter.setConfig(new FilterConfig(new DatePlanet(start), new DatePlanet(end))); + return dateFilter; + } + + private Filter withinDaysFilter(Feature feature, int days) { + Date acquriredDate = feature.getProperties().getAcquired(); + LocalDateTime localDateTime = DateUtils.asLocalDateTime(acquriredDate); + Date start = DateUtils.asDate(localDateTime.minusDays(days)); + Date end = DateUtils.asDate(localDateTime.plusDays(days - 1)); + return getDateFilter(start, end); + } + + private Filter getGeometryFilter(GeoJson geoJson) { + Filter geoFilter = new Filter<>(); + geoFilter.setType(FilterType.GEOMETRY); + geoFilter.setFieldName(PlanetAttributes.GEOMETRY); + geoFilter.setConfig(new FilterConfig(geoJson.getType(), geoJson.getCoordinates())); + return geoFilter; + } + + private Filter getAndFilter(Filter[] filters) { + Filter andFilter = new Filter<>(); + andFilter.setType(FilterType.AND); + andFilter.setConfig(filters); + return andFilter; + } + + private Filter getOrFilter(Filter[] filters) { + Filter andFilter = new Filter<>(); + andFilter.setType(FilterType.OR); + andFilter.setConfig(filters); + return andFilter; + } + + private Filter getStringInFilter(String fieldName, String[] strings) { + Filter stringInFilter = new Filter<>(); + stringInFilter.setType(FilterType.STRING_IN); + stringInFilter.setFieldName(fieldName); + stringInFilter.setConfig(strings); + return stringInFilter; + } + + private int getQuality(Feature feature) { + FeatureProperties p = feature.getProperties(); + Integer quality = p.getClearPercent(); + if (quality != null) + return quality; + else { + return (int) ((1 - p.getCloudCover()) * 50); + } + } + + private String sendRequest(URL url, Object jsonObject) throws IOException { + try { + + HttpURLConnection conn = getAuthenticatedConnection(url, jsonObject); + + buildRequet(jsonObject, conn); + + StringBuilder response = null; + try { + response = readStream(conn.getInputStream()); + } finally { + conn.disconnect(); + } + + retries = 0; // reset the counter as it was a success + return response.toString(); + } catch (IOException e) { + if( e.getMessage()!=null && e.getMessage().contains("429") ) { // This happens when there are too many consecutive requests! Make the user wait a bit and try again! + try { + if( retries < MAX_RETRIES ) { + Thread.sleep( 5000 ); + retries++; + }else { + retries = 0; + throw e; + } + } catch (InterruptedException e1) { + logger.error( "Error waiting for Thread requesting Planet imagery"); + } + return sendRequest(url, jsonObject); + }else { + throw e; // Another type of error throw! + } + } + } + + private void buildRequet(Object jsonObject, HttpURLConnection conn) + throws IOException { + byte[] postDataBytes = null; + if (jsonObject != null) { + String jsonInputString = gson.toJson(jsonObject); + postDataBytes = jsonInputString.getBytes( StandardCharsets.UTF_8.name()); + logger.info(jsonInputString); + } + if (postDataBytes != null) { + conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length)); + conn.getOutputStream().write(postDataBytes); + } else { + conn.setRequestProperty("Content-Length", "0"); + } + } + + private HttpURLConnection getAuthenticatedConnection(URL url, Object jsonObject) + throws IOException { + HttpURLConnection conn = null; + if( factory != null ) { // THIS IS A WORKAROUND TO REMOVE SSL CERTIFICATE ISSUES + conn = (HttpsURLConnection) url.openConnection(); + ((HttpsURLConnection)conn).setSSLSocketFactory(factory); + }else { + conn = (HttpURLConnection) url.openConnection(); + } + + // very important to keep the semicolon at the end + String basicAuth = "Basic " + new String(Base64.getEncoder().encode((apiKey + ":").getBytes())); + conn.setRequestProperty("Authorization", basicAuth); + + conn.setRequestMethod(jsonObject != null ? "POST" : "GET"); + conn.setRequestProperty("Content-Type", "application/json"); + conn.setRequestProperty("Accept", "application/json"); + conn.setDoOutput(true); + return conn; } - public Map getRelevant() { - return convertToChildDefinitionIdMap(change.getChildrenRelevance()); + // Workaround for computers that have trouble accepting Planet's SSL certificates + private static SSLSocketFactory getSSLAcceptAllFactory(){ + SSLSocketFactory factory = null; + try { + Security.getProviders(); + final SSLContext ssl = SSLContext.getInstance("TLSv1.2"); + ssl.init(null, new TrustManager[] { new TrustAllCertificates() }, null); + return ssl.getSocketFactory(); + } catch (Exception e) { + logger.error( "Error obtaining SSL factory when opeining Planet REST URL",e); + } + + return factory; } - public Map getMinCountByChildDefinitionId() { - return change.getMinCountByChildDefinitionId(); + private StringBuilder readStream(InputStream is) throws IOException { + StringBuilder response = new StringBuilder(); + try (BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) { + String responseLine = null; + while ((responseLine = br.readLine()) != null) { + response.append(responseLine.trim()); + } + } + return response; } - public Map getMaxCountByChildDefinitionId() { - return change.getMaxCountByChildDefinitionId(); + private Feature[] search(String[] itemTypes, Filter[] filters, Integer maxResults) throws IOException { + + Filter andFilter = getAndFilter(filters); + SearchRequest searchRequest = new SearchRequest(itemTypes, andFilter); + + String response = sendRequest(new URL("https://api.planet.com/data/v1/quick-search"), searchRequest); + Feature[] featuresInPage = getNextPage(response); + + if (featuresInPage != null && maxResults != null ) { + Arrays.sort(featuresInPage, new FeatureSorter()); + + if (featuresInPage.length > maxResults) { + featuresInPage = ArrayUtils.subarray(featuresInPage, 0, maxResults); + } + ArrayUtils.reverse(featuresInPage); + } + + return featuresInPage; + } - public Map getMinCountValidation() { - return convertToChildDefinitionIdMap(change.getChildrenMinCountValidation()); + private Feature[] getNextPage(String resJson) throws IOException { + if (StringUtils.isNotBlank(resJson)) { + Response resp = gson.fromJson(resJson, Response.class); + Feature[] features = resp.getFeatures(); + Links links = resp.getLinks(); + if (links != null && links.getNext() != null) { + String nextUrl = links.getNext(); + String res = sendRequest(new URL(nextUrl), null); + Feature[] nextFeatures = getNextPage(res); + return ArrayUtils.addAll(features, nextFeatures); + } else { + return features; + } + } else { + return new Feature[] {}; + } } - public Map getMaxCountValidation() { - return convertToChildDefinitionIdMap(change.getChildrenMaxCountValidation()); + private String getLayers(Feature[] features) throws IOException { + String layerUrl = ""; + if (features.length > 0) { + String[] ids = new String[features.length]; + for (int i = 0; i < ids.length; i++) { + Feature feature = features[i]; + + String idSearch = feature.getProperties().getItemType() + ':' + feature.getId(); + ids[i] = idSearch; + } + + SearchRequest layerRequest = new SearchRequest(ids); + String layers = sendRequest(new URL("https://tiles0.planet.com/data/v1/layers"), layerRequest); + LayerResponse layerResponse = gson.fromJson(layers, LayerResponse.class); + if (layerResponse != null) { + layerUrl = layerResponse.getTiles()[0]; + } + } + return layerUrl; } - private Map convertToChildDefinitionIdMap(Map from) { - Map map = new HashMap<>(); - Set> entries = from.entrySet(); - for (Entry entry : entries) { - Integer childDefId = entry.getKey(); - map.put(childDefId, entry.getValue()); + private Feature[] getFeatures (PlanetRequestParameters planetRequestParameters ) throws IOException { + Calendar thresholdQuality = Calendar.getInstance(); + thresholdQuality.set(2016, 0,1); + + GeoJson geometry = new GeoJson("Polygon", planetRequestParameters.getCoords()); + Filter geometryFilter = getGeometryFilter(geometry); + Filter[] filters = null; + /* maybe we can use test quality anyway + * it gets complicated when the filter start/end date is multiyear + */ + if( planetRequestParameters.getStart().before( thresholdQuality.getTime() ) && planetRequestParameters.getEnd().after( thresholdQuality.getTime() ) ) { + + Filter qualityFilter = getStringInFilter("quality_category", new String[] { "standard" }); + Filter before2016Filter = getDateFilter(planetRequestParameters.getStart(), thresholdQuality.getTime() ); + Filter after2016Filter = getDateFilter(thresholdQuality.getTime(), planetRequestParameters.getEnd() ); + + Filter after2016AndStandardQuality = getAndFilter( new Filter[] { after2016Filter, qualityFilter } ); + Filter before2016OrAfter2016AndStandardQuality = getOrFilter( new Filter[] { before2016Filter, after2016AndStandardQuality } ); + + // Add quality filter only for images after 2016 + + filters = new Filter[] { before2016OrAfter2016AndStandardQuality, geometryFilter }; + + }else if( planetRequestParameters.getStart().after( thresholdQuality.getTime() ) ) { + Filter dateFilter = getDateFilter(planetRequestParameters.getStart(), planetRequestParameters.getEnd()); + // Add quality filter only for images after 2016 + Filter qualityFilter = getStringInFilter("quality_category", new String[] { "standard" }); + filters = new Filter[] { dateFilter, geometryFilter, qualityFilter }; + }else { + Filter dateFilter = getDateFilter(planetRequestParameters.getStart(), planetRequestParameters.getEnd()); + filters = new Filter[] { dateFilter, geometryFilter }; } - return map; + + return search(planetRequestParameters.getItemTypes(), filters, null); } -} \ No newline at end of file + public String getLayerUrl(PlanetRequestParameters planetRequestParameters) throws IOException { + Feature[] searchResults = getFeatures (planetRequestParameters); + return searchResults!=null ? getLayers(searchResults) : null; + } + + public Map getAvailableDates(PlanetRequestParameters planetRequestParameters) throws IOException { + + Feature[] searchResults = getFeatures (planetRequestParameters); + + Map datesAvailable = new HashMap<>(); + + Calendar cal = Calendar.getInstance(); + if( searchResults != null ) { + for (Feature feature : searchResults) { + cal.setTime( feature.getProperties().acquired ); + int year = cal.get( Calendar.YEAR ); + int month = cal.get( Calendar.MONTH ) + 1; + int day = cal.get( Calendar.DATE ); + datesAvailable.put( year+""+ ( month<10?"0"+month:month ), "true"); // THe month, in order to know for whcioh moinths there are images + datesAvailable.put( year+""+ ( month<10?"0"+month:month )+ ( day<10?"0"+day:day ), "true"); + } + } + return datesAvailable; + } + + public String getLatestUrl(SimplePlacemarkObject placemarkObject) throws IOException { + LocalDateTime localDateTime = DateUtils.asLocalDateTime(new Date()); + Date start = DateUtils.asDate(localDateTime.minusDays(30)); + + List shape = placemarkObject.getMultiShape().get(0); + + double[][][] polygon = new double[1][shape.size()][2]; + int i = 0; + for (SimpleCoordinate simpleCoordinate : shape) { + polygon[0][i][1] = Double.parseDouble(simpleCoordinate.getLatitude()); + polygon[0][i++][0] = Double.parseDouble(simpleCoordinate.getLongitude()); + } + String[] itemTypes = { "PSScene3Band", "PSScene4Band" }; + return getLayerUrl(new PlanetRequestParameters(start, new Date(), polygon, itemTypes)); + } +} From 0d67362ba5f330bb90408f503ed61a822bf54f30 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:57 +0100 Subject: [PATCH 1540/1620] New translations PlanetImagery.java (English) --- .../earth/app/view/Messages_en.properties | 352 +++++++++++++++++- 1 file changed, 337 insertions(+), 15 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 77ee59553a..34f161190b 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,22 +1,344 @@ -package org.openforis.collect.model.proxy; +package org.openforis.collect.earth.planet; -import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.AttributeChange; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.security.Security; +import java.time.LocalDateTime; +import java.util.Arrays; +import java.util.Base64; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; -/** - * - * @author S. Ricci - * - */ -public class AttributeAddChangeProxy extends AttributeChangeProxy implements NodeAddChangeProxy { +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; - public AttributeAddChangeProxy(AttributeChange change, ProxyContext context) { - super(change, context); +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.openforis.collect.earth.app.service.TrustAllCertificates; +import org.openforis.collect.earth.sampler.model.SimpleCoordinate; +import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +public class PlanetImagery { + + private static final Logger logger = LoggerFactory.getLogger(PlanetImagery.class); + private static final Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").create(); + private static final SSLSocketFactory factory = getSSLAcceptAllFactory(); + + private String apiKey; + + private int retries = 0; + + private static final int MAX_RETRIES = 6; + + public PlanetImagery(String apiKey) { + super(); + this.apiKey = apiKey; + } + + private Filter getDateFilter(Date start, Date end) { + Filter dateFilter = new Filter<>(); + dateFilter.setType(FilterType.DATERANGE); + dateFilter.setFieldName(PlanetAttributes.ACQUIRED); + dateFilter.setConfig(new FilterConfig(new DatePlanet(start), new DatePlanet(end))); + return dateFilter; } - @Override - public NodeProxy getCreatedNode() { - return NodeProxy.fromNode(change.getNode(), context); + private Filter withinDaysFilter(Feature feature, int days) { + Date acquriredDate = feature.getProperties().getAcquired(); + LocalDateTime localDateTime = DateUtils.asLocalDateTime(acquriredDate); + Date start = DateUtils.asDate(localDateTime.minusDays(days)); + Date end = DateUtils.asDate(localDateTime.plusDays(days - 1)); + return getDateFilter(start, end); } -} \ No newline at end of file + private Filter getGeometryFilter(GeoJson geoJson) { + Filter geoFilter = new Filter<>(); + geoFilter.setType(FilterType.GEOMETRY); + geoFilter.setFieldName(PlanetAttributes.GEOMETRY); + geoFilter.setConfig(new FilterConfig(geoJson.getType(), geoJson.getCoordinates())); + return geoFilter; + } + + private Filter getAndFilter(Filter[] filters) { + Filter andFilter = new Filter<>(); + andFilter.setType(FilterType.AND); + andFilter.setConfig(filters); + return andFilter; + } + + private Filter getOrFilter(Filter[] filters) { + Filter andFilter = new Filter<>(); + andFilter.setType(FilterType.OR); + andFilter.setConfig(filters); + return andFilter; + } + + private Filter getStringInFilter(String fieldName, String[] strings) { + Filter stringInFilter = new Filter<>(); + stringInFilter.setType(FilterType.STRING_IN); + stringInFilter.setFieldName(fieldName); + stringInFilter.setConfig(strings); + return stringInFilter; + } + + private int getQuality(Feature feature) { + FeatureProperties p = feature.getProperties(); + Integer quality = p.getClearPercent(); + if (quality != null) + return quality; + else { + return (int) ((1 - p.getCloudCover()) * 50); + } + } + + private String sendRequest(URL url, Object jsonObject) throws IOException { + try { + + HttpURLConnection conn = getAuthenticatedConnection(url, jsonObject); + + buildRequet(jsonObject, conn); + + StringBuilder response = null; + try { + response = readStream(conn.getInputStream()); + } finally { + conn.disconnect(); + } + + retries = 0; // reset the counter as it was a success + return response.toString(); + } catch (IOException e) { + if( e.getMessage()!=null && e.getMessage().contains("429") ) { // This happens when there are too many consecutive requests! Make the user wait a bit and try again! + try { + if( retries < MAX_RETRIES ) { + Thread.sleep( 5000 ); + retries++; + }else { + retries = 0; + throw e; + } + } catch (InterruptedException e1) { + logger.error( "Error waiting for Thread requesting Planet imagery"); + } + return sendRequest(url, jsonObject); + }else { + throw e; // Another type of error throw! + } + } + } + + private void buildRequet(Object jsonObject, HttpURLConnection conn) + throws IOException { + byte[] postDataBytes = null; + if (jsonObject != null) { + String jsonInputString = gson.toJson(jsonObject); + postDataBytes = jsonInputString.getBytes( StandardCharsets.UTF_8.name()); + logger.info(jsonInputString); + } + if (postDataBytes != null) { + conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length)); + conn.getOutputStream().write(postDataBytes); + } else { + conn.setRequestProperty("Content-Length", "0"); + } + } + + private HttpURLConnection getAuthenticatedConnection(URL url, Object jsonObject) + throws IOException { + HttpURLConnection conn = null; + if( factory != null ) { // THIS IS A WORKAROUND TO REMOVE SSL CERTIFICATE ISSUES + conn = (HttpsURLConnection) url.openConnection(); + ((HttpsURLConnection)conn).setSSLSocketFactory(factory); + }else { + conn = (HttpURLConnection) url.openConnection(); + } + + // very important to keep the semicolon at the end + String basicAuth = "Basic " + new String(Base64.getEncoder().encode((apiKey + ":").getBytes())); + conn.setRequestProperty("Authorization", basicAuth); + + conn.setRequestMethod(jsonObject != null ? "POST" : "GET"); + conn.setRequestProperty("Content-Type", "application/json"); + conn.setRequestProperty("Accept", "application/json"); + conn.setDoOutput(true); + return conn; + } + + // Workaround for computers that have trouble accepting Planet's SSL certificates + private static SSLSocketFactory getSSLAcceptAllFactory(){ + SSLSocketFactory factory = null; + try { + Security.getProviders(); + final SSLContext ssl = SSLContext.getInstance("TLSv1.2"); + ssl.init(null, new TrustManager[] { new TrustAllCertificates() }, null); + return ssl.getSocketFactory(); + } catch (Exception e) { + logger.error( "Error obtaining SSL factory when opeining Planet REST URL",e); + } + + return factory; + } + + private StringBuilder readStream(InputStream is) throws IOException { + StringBuilder response = new StringBuilder(); + try (BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) { + String responseLine = null; + while ((responseLine = br.readLine()) != null) { + response.append(responseLine.trim()); + } + } + return response; + } + + private Feature[] search(String[] itemTypes, Filter[] filters, Integer maxResults) throws IOException { + + Filter andFilter = getAndFilter(filters); + SearchRequest searchRequest = new SearchRequest(itemTypes, andFilter); + + String response = sendRequest(new URL("https://api.planet.com/data/v1/quick-search"), searchRequest); + Feature[] featuresInPage = getNextPage(response); + + if (featuresInPage != null && maxResults != null ) { + Arrays.sort(featuresInPage, new FeatureSorter()); + + if (featuresInPage.length > maxResults) { + featuresInPage = ArrayUtils.subarray(featuresInPage, 0, maxResults); + } + ArrayUtils.reverse(featuresInPage); + } + + return featuresInPage; + + } + + private Feature[] getNextPage(String resJson) throws IOException { + if (StringUtils.isNotBlank(resJson)) { + Response resp = gson.fromJson(resJson, Response.class); + Feature[] features = resp.getFeatures(); + Links links = resp.getLinks(); + if (links != null && links.getNext() != null) { + String nextUrl = links.getNext(); + String res = sendRequest(new URL(nextUrl), null); + Feature[] nextFeatures = getNextPage(res); + return ArrayUtils.addAll(features, nextFeatures); + } else { + return features; + } + } else { + return new Feature[] {}; + } + } + + private String getLayers(Feature[] features) throws IOException { + String layerUrl = ""; + if (features.length > 0) { + String[] ids = new String[features.length]; + for (int i = 0; i < ids.length; i++) { + Feature feature = features[i]; + + String idSearch = feature.getProperties().getItemType() + ':' + feature.getId(); + ids[i] = idSearch; + } + + SearchRequest layerRequest = new SearchRequest(ids); + String layers = sendRequest(new URL("https://tiles0.planet.com/data/v1/layers"), layerRequest); + LayerResponse layerResponse = gson.fromJson(layers, LayerResponse.class); + if (layerResponse != null) { + layerUrl = layerResponse.getTiles()[0]; + } + } + return layerUrl; + } + + private Feature[] getFeatures (PlanetRequestParameters planetRequestParameters ) throws IOException { + Calendar thresholdQuality = Calendar.getInstance(); + thresholdQuality.set(2016, 0,1); + + GeoJson geometry = new GeoJson("Polygon", planetRequestParameters.getCoords()); + Filter geometryFilter = getGeometryFilter(geometry); + Filter[] filters = null; + /* maybe we can use test quality anyway + * it gets complicated when the filter start/end date is multiyear + */ + if( planetRequestParameters.getStart().before( thresholdQuality.getTime() ) && planetRequestParameters.getEnd().after( thresholdQuality.getTime() ) ) { + + Filter qualityFilter = getStringInFilter("quality_category", new String[] { "standard" }); + Filter before2016Filter = getDateFilter(planetRequestParameters.getStart(), thresholdQuality.getTime() ); + Filter after2016Filter = getDateFilter(thresholdQuality.getTime(), planetRequestParameters.getEnd() ); + + Filter after2016AndStandardQuality = getAndFilter( new Filter[] { after2016Filter, qualityFilter } ); + Filter before2016OrAfter2016AndStandardQuality = getOrFilter( new Filter[] { before2016Filter, after2016AndStandardQuality } ); + + // Add quality filter only for images after 2016 + + filters = new Filter[] { before2016OrAfter2016AndStandardQuality, geometryFilter }; + + }else if( planetRequestParameters.getStart().after( thresholdQuality.getTime() ) ) { + Filter dateFilter = getDateFilter(planetRequestParameters.getStart(), planetRequestParameters.getEnd()); + // Add quality filter only for images after 2016 + Filter qualityFilter = getStringInFilter("quality_category", new String[] { "standard" }); + filters = new Filter[] { dateFilter, geometryFilter, qualityFilter }; + }else { + Filter dateFilter = getDateFilter(planetRequestParameters.getStart(), planetRequestParameters.getEnd()); + filters = new Filter[] { dateFilter, geometryFilter }; + } + + return search(planetRequestParameters.getItemTypes(), filters, null); + } + + public String getLayerUrl(PlanetRequestParameters planetRequestParameters) throws IOException { + Feature[] searchResults = getFeatures (planetRequestParameters); + return searchResults!=null ? getLayers(searchResults) : null; + } + + public Map getAvailableDates(PlanetRequestParameters planetRequestParameters) throws IOException { + + Feature[] searchResults = getFeatures (planetRequestParameters); + + Map datesAvailable = new HashMap<>(); + + Calendar cal = Calendar.getInstance(); + if( searchResults != null ) { + for (Feature feature : searchResults) { + cal.setTime( feature.getProperties().acquired ); + int year = cal.get( Calendar.YEAR ); + int month = cal.get( Calendar.MONTH ) + 1; + int day = cal.get( Calendar.DATE ); + datesAvailable.put( year+""+ ( month<10?"0"+month:month ), "true"); // THe month, in order to know for whcioh moinths there are images + datesAvailable.put( year+""+ ( month<10?"0"+month:month )+ ( day<10?"0"+day:day ), "true"); + } + } + return datesAvailable; + } + + public String getLatestUrl(SimplePlacemarkObject placemarkObject) throws IOException { + LocalDateTime localDateTime = DateUtils.asLocalDateTime(new Date()); + Date start = DateUtils.asDate(localDateTime.minusDays(30)); + + List shape = placemarkObject.getMultiShape().get(0); + + double[][][] polygon = new double[1][shape.size()][2]; + int i = 0; + for (SimpleCoordinate simpleCoordinate : shape) { + polygon[0][i][1] = Double.parseDouble(simpleCoordinate.getLatitude()); + polygon[0][i++][0] = Double.parseDouble(simpleCoordinate.getLongitude()); + } + String[] itemTypes = { "PSScene3Band", "PSScene4Band" }; + return getLayerUrl(new PlanetRequestParameters(start, new Date(), polygon, itemTypes)); + } +} From 668a1e41d23c69e886f74845719e5584bbf661a9 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:58 +0100 Subject: [PATCH 1541/1620] New translations PlanetRequestParameters.java (French) --- .../earth/app/view/Messages_fr.properties | 85 +++++++++++-------- 1 file changed, 49 insertions(+), 36 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 34ef3a1eb1..afe14d18fd 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,36 +1,49 @@ -package org.openforis.collect.earth.planet; - -public class SearchRequest{ - - String[] item_types; - Filter filter; - String[] ids; - - public SearchRequest(String[] ids) { - super(); - this.ids = ids; - } - - public SearchRequest(String[] itemTypes, Filter filter) { - super(); - this.item_types = itemTypes; - this.filter = filter; - } - - public String[] getItemTypes() { - return item_types; - } - - public void setItemTypes(String[] itemTypes) { - this.item_types = itemTypes; - } - - public Filter getFilter() { - return filter; - } - - public void setFilter(Filter filter) { - this.filter = filter; - } - -} +package org.openforis.collect.earth.planet; + +import java.util.Date; + +public class PlanetRequestParameters { + private Date start; + private Date end; + private double[][][] coords; + private String[] itemTypes; + + public PlanetRequestParameters(Date start, Date end, double[][][] coords, String[] itemTypes) { + this.start = start; + this.end = end; + this.coords = coords; + this.itemTypes = itemTypes; + } + + public Date getStart() { + return start; + } + + public void setStart(Date start) { + this.start = start; + } + + public Date getEnd() { + return end; + } + + public void setEnd(Date end) { + this.end = end; + } + + public double[][][] getCoords() { + return coords; + } + + public void setCoords(double[][][] coords) { + this.coords = coords; + } + + public String[] getItemTypes() { + return itemTypes; + } + + public void setItemTypes(String[] itemTypes) { + this.itemTypes = itemTypes; + } +} \ No newline at end of file From 562031e68dc966f9c60b001243915fe26db07e64 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:50:59 +0100 Subject: [PATCH 1542/1620] New translations PlanetRequestParameters.java (Spanish) --- .../earth/app/view/Messages_es.properties | 393 +++--------------- 1 file changed, 49 insertions(+), 344 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 34f161190b..afe14d18fd 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,344 +1,49 @@ -package org.openforis.collect.earth.planet; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.HttpURLConnection; -import java.net.URL; -import java.nio.charset.StandardCharsets; -import java.security.Security; -import java.time.LocalDateTime; -import java.util.Arrays; -import java.util.Base64; -import java.util.Calendar; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSocketFactory; -import javax.net.ssl.TrustManager; - -import org.apache.commons.lang3.ArrayUtils; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.service.TrustAllCertificates; -import org.openforis.collect.earth.sampler.model.SimpleCoordinate; -import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; - -public class PlanetImagery { - - private static final Logger logger = LoggerFactory.getLogger(PlanetImagery.class); - private static final Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").create(); - private static final SSLSocketFactory factory = getSSLAcceptAllFactory(); - - private String apiKey; - - private int retries = 0; - - private static final int MAX_RETRIES = 6; - - public PlanetImagery(String apiKey) { - super(); - this.apiKey = apiKey; - } - - private Filter getDateFilter(Date start, Date end) { - Filter dateFilter = new Filter<>(); - dateFilter.setType(FilterType.DATERANGE); - dateFilter.setFieldName(PlanetAttributes.ACQUIRED); - dateFilter.setConfig(new FilterConfig(new DatePlanet(start), new DatePlanet(end))); - return dateFilter; - } - - private Filter withinDaysFilter(Feature feature, int days) { - Date acquriredDate = feature.getProperties().getAcquired(); - LocalDateTime localDateTime = DateUtils.asLocalDateTime(acquriredDate); - Date start = DateUtils.asDate(localDateTime.minusDays(days)); - Date end = DateUtils.asDate(localDateTime.plusDays(days - 1)); - return getDateFilter(start, end); - } - - private Filter getGeometryFilter(GeoJson geoJson) { - Filter geoFilter = new Filter<>(); - geoFilter.setType(FilterType.GEOMETRY); - geoFilter.setFieldName(PlanetAttributes.GEOMETRY); - geoFilter.setConfig(new FilterConfig(geoJson.getType(), geoJson.getCoordinates())); - return geoFilter; - } - - private Filter getAndFilter(Filter[] filters) { - Filter andFilter = new Filter<>(); - andFilter.setType(FilterType.AND); - andFilter.setConfig(filters); - return andFilter; - } - - private Filter getOrFilter(Filter[] filters) { - Filter andFilter = new Filter<>(); - andFilter.setType(FilterType.OR); - andFilter.setConfig(filters); - return andFilter; - } - - private Filter getStringInFilter(String fieldName, String[] strings) { - Filter stringInFilter = new Filter<>(); - stringInFilter.setType(FilterType.STRING_IN); - stringInFilter.setFieldName(fieldName); - stringInFilter.setConfig(strings); - return stringInFilter; - } - - private int getQuality(Feature feature) { - FeatureProperties p = feature.getProperties(); - Integer quality = p.getClearPercent(); - if (quality != null) - return quality; - else { - return (int) ((1 - p.getCloudCover()) * 50); - } - } - - private String sendRequest(URL url, Object jsonObject) throws IOException { - try { - - HttpURLConnection conn = getAuthenticatedConnection(url, jsonObject); - - buildRequet(jsonObject, conn); - - StringBuilder response = null; - try { - response = readStream(conn.getInputStream()); - } finally { - conn.disconnect(); - } - - retries = 0; // reset the counter as it was a success - return response.toString(); - } catch (IOException e) { - if( e.getMessage()!=null && e.getMessage().contains("429") ) { // This happens when there are too many consecutive requests! Make the user wait a bit and try again! - try { - if( retries < MAX_RETRIES ) { - Thread.sleep( 5000 ); - retries++; - }else { - retries = 0; - throw e; - } - } catch (InterruptedException e1) { - logger.error( "Error waiting for Thread requesting Planet imagery"); - } - return sendRequest(url, jsonObject); - }else { - throw e; // Another type of error throw! - } - } - } - - private void buildRequet(Object jsonObject, HttpURLConnection conn) - throws IOException { - byte[] postDataBytes = null; - if (jsonObject != null) { - String jsonInputString = gson.toJson(jsonObject); - postDataBytes = jsonInputString.getBytes( StandardCharsets.UTF_8.name()); - logger.info(jsonInputString); - } - if (postDataBytes != null) { - conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length)); - conn.getOutputStream().write(postDataBytes); - } else { - conn.setRequestProperty("Content-Length", "0"); - } - } - - private HttpURLConnection getAuthenticatedConnection(URL url, Object jsonObject) - throws IOException { - HttpURLConnection conn = null; - if( factory != null ) { // THIS IS A WORKAROUND TO REMOVE SSL CERTIFICATE ISSUES - conn = (HttpsURLConnection) url.openConnection(); - ((HttpsURLConnection)conn).setSSLSocketFactory(factory); - }else { - conn = (HttpURLConnection) url.openConnection(); - } - - // very important to keep the semicolon at the end - String basicAuth = "Basic " + new String(Base64.getEncoder().encode((apiKey + ":").getBytes())); - conn.setRequestProperty("Authorization", basicAuth); - - conn.setRequestMethod(jsonObject != null ? "POST" : "GET"); - conn.setRequestProperty("Content-Type", "application/json"); - conn.setRequestProperty("Accept", "application/json"); - conn.setDoOutput(true); - return conn; - } - - // Workaround for computers that have trouble accepting Planet's SSL certificates - private static SSLSocketFactory getSSLAcceptAllFactory(){ - SSLSocketFactory factory = null; - try { - Security.getProviders(); - final SSLContext ssl = SSLContext.getInstance("TLSv1.2"); - ssl.init(null, new TrustManager[] { new TrustAllCertificates() }, null); - return ssl.getSocketFactory(); - } catch (Exception e) { - logger.error( "Error obtaining SSL factory when opeining Planet REST URL",e); - } - - return factory; - } - - private StringBuilder readStream(InputStream is) throws IOException { - StringBuilder response = new StringBuilder(); - try (BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) { - String responseLine = null; - while ((responseLine = br.readLine()) != null) { - response.append(responseLine.trim()); - } - } - return response; - } - - private Feature[] search(String[] itemTypes, Filter[] filters, Integer maxResults) throws IOException { - - Filter andFilter = getAndFilter(filters); - SearchRequest searchRequest = new SearchRequest(itemTypes, andFilter); - - String response = sendRequest(new URL("https://api.planet.com/data/v1/quick-search"), searchRequest); - Feature[] featuresInPage = getNextPage(response); - - if (featuresInPage != null && maxResults != null ) { - Arrays.sort(featuresInPage, new FeatureSorter()); - - if (featuresInPage.length > maxResults) { - featuresInPage = ArrayUtils.subarray(featuresInPage, 0, maxResults); - } - ArrayUtils.reverse(featuresInPage); - } - - return featuresInPage; - - } - - private Feature[] getNextPage(String resJson) throws IOException { - if (StringUtils.isNotBlank(resJson)) { - Response resp = gson.fromJson(resJson, Response.class); - Feature[] features = resp.getFeatures(); - Links links = resp.getLinks(); - if (links != null && links.getNext() != null) { - String nextUrl = links.getNext(); - String res = sendRequest(new URL(nextUrl), null); - Feature[] nextFeatures = getNextPage(res); - return ArrayUtils.addAll(features, nextFeatures); - } else { - return features; - } - } else { - return new Feature[] {}; - } - } - - private String getLayers(Feature[] features) throws IOException { - String layerUrl = ""; - if (features.length > 0) { - String[] ids = new String[features.length]; - for (int i = 0; i < ids.length; i++) { - Feature feature = features[i]; - - String idSearch = feature.getProperties().getItemType() + ':' + feature.getId(); - ids[i] = idSearch; - } - - SearchRequest layerRequest = new SearchRequest(ids); - String layers = sendRequest(new URL("https://tiles0.planet.com/data/v1/layers"), layerRequest); - LayerResponse layerResponse = gson.fromJson(layers, LayerResponse.class); - if (layerResponse != null) { - layerUrl = layerResponse.getTiles()[0]; - } - } - return layerUrl; - } - - private Feature[] getFeatures (PlanetRequestParameters planetRequestParameters ) throws IOException { - Calendar thresholdQuality = Calendar.getInstance(); - thresholdQuality.set(2016, 0,1); - - GeoJson geometry = new GeoJson("Polygon", planetRequestParameters.getCoords()); - Filter geometryFilter = getGeometryFilter(geometry); - Filter[] filters = null; - /* maybe we can use test quality anyway - * it gets complicated when the filter start/end date is multiyear - */ - if( planetRequestParameters.getStart().before( thresholdQuality.getTime() ) && planetRequestParameters.getEnd().after( thresholdQuality.getTime() ) ) { - - Filter qualityFilter = getStringInFilter("quality_category", new String[] { "standard" }); - Filter before2016Filter = getDateFilter(planetRequestParameters.getStart(), thresholdQuality.getTime() ); - Filter after2016Filter = getDateFilter(thresholdQuality.getTime(), planetRequestParameters.getEnd() ); - - Filter after2016AndStandardQuality = getAndFilter( new Filter[] { after2016Filter, qualityFilter } ); - Filter before2016OrAfter2016AndStandardQuality = getOrFilter( new Filter[] { before2016Filter, after2016AndStandardQuality } ); - - // Add quality filter only for images after 2016 - - filters = new Filter[] { before2016OrAfter2016AndStandardQuality, geometryFilter }; - - }else if( planetRequestParameters.getStart().after( thresholdQuality.getTime() ) ) { - Filter dateFilter = getDateFilter(planetRequestParameters.getStart(), planetRequestParameters.getEnd()); - // Add quality filter only for images after 2016 - Filter qualityFilter = getStringInFilter("quality_category", new String[] { "standard" }); - filters = new Filter[] { dateFilter, geometryFilter, qualityFilter }; - }else { - Filter dateFilter = getDateFilter(planetRequestParameters.getStart(), planetRequestParameters.getEnd()); - filters = new Filter[] { dateFilter, geometryFilter }; - } - - return search(planetRequestParameters.getItemTypes(), filters, null); - } - - public String getLayerUrl(PlanetRequestParameters planetRequestParameters) throws IOException { - Feature[] searchResults = getFeatures (planetRequestParameters); - return searchResults!=null ? getLayers(searchResults) : null; - } - - public Map getAvailableDates(PlanetRequestParameters planetRequestParameters) throws IOException { - - Feature[] searchResults = getFeatures (planetRequestParameters); - - Map datesAvailable = new HashMap<>(); - - Calendar cal = Calendar.getInstance(); - if( searchResults != null ) { - for (Feature feature : searchResults) { - cal.setTime( feature.getProperties().acquired ); - int year = cal.get( Calendar.YEAR ); - int month = cal.get( Calendar.MONTH ) + 1; - int day = cal.get( Calendar.DATE ); - datesAvailable.put( year+""+ ( month<10?"0"+month:month ), "true"); // THe month, in order to know for whcioh moinths there are images - datesAvailable.put( year+""+ ( month<10?"0"+month:month )+ ( day<10?"0"+day:day ), "true"); - } - } - return datesAvailable; - } - - public String getLatestUrl(SimplePlacemarkObject placemarkObject) throws IOException { - LocalDateTime localDateTime = DateUtils.asLocalDateTime(new Date()); - Date start = DateUtils.asDate(localDateTime.minusDays(30)); - - List shape = placemarkObject.getMultiShape().get(0); - - double[][][] polygon = new double[1][shape.size()][2]; - int i = 0; - for (SimpleCoordinate simpleCoordinate : shape) { - polygon[0][i][1] = Double.parseDouble(simpleCoordinate.getLatitude()); - polygon[0][i++][0] = Double.parseDouble(simpleCoordinate.getLongitude()); - } - String[] itemTypes = { "PSScene3Band", "PSScene4Band" }; - return getLayerUrl(new PlanetRequestParameters(start, new Date(), polygon, itemTypes)); - } -} +package org.openforis.collect.earth.planet; + +import java.util.Date; + +public class PlanetRequestParameters { + private Date start; + private Date end; + private double[][][] coords; + private String[] itemTypes; + + public PlanetRequestParameters(Date start, Date end, double[][][] coords, String[] itemTypes) { + this.start = start; + this.end = end; + this.coords = coords; + this.itemTypes = itemTypes; + } + + public Date getStart() { + return start; + } + + public void setStart(Date start) { + this.start = start; + } + + public Date getEnd() { + return end; + } + + public void setEnd(Date end) { + this.end = end; + } + + public double[][][] getCoords() { + return coords; + } + + public void setCoords(double[][][] coords) { + this.coords = coords; + } + + public String[] getItemTypes() { + return itemTypes; + } + + public void setItemTypes(String[] itemTypes) { + this.itemTypes = itemTypes; + } +} \ No newline at end of file From f4384cdbeab7aeef4d5fd1a76a3b43a503f6927f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:00 +0100 Subject: [PATCH 1543/1620] New translations PlanetRequestParameters.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 393 +++--------------- 1 file changed, 49 insertions(+), 344 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 34f161190b..afe14d18fd 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,344 +1,49 @@ -package org.openforis.collect.earth.planet; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.HttpURLConnection; -import java.net.URL; -import java.nio.charset.StandardCharsets; -import java.security.Security; -import java.time.LocalDateTime; -import java.util.Arrays; -import java.util.Base64; -import java.util.Calendar; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSocketFactory; -import javax.net.ssl.TrustManager; - -import org.apache.commons.lang3.ArrayUtils; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.service.TrustAllCertificates; -import org.openforis.collect.earth.sampler.model.SimpleCoordinate; -import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; - -public class PlanetImagery { - - private static final Logger logger = LoggerFactory.getLogger(PlanetImagery.class); - private static final Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").create(); - private static final SSLSocketFactory factory = getSSLAcceptAllFactory(); - - private String apiKey; - - private int retries = 0; - - private static final int MAX_RETRIES = 6; - - public PlanetImagery(String apiKey) { - super(); - this.apiKey = apiKey; - } - - private Filter getDateFilter(Date start, Date end) { - Filter dateFilter = new Filter<>(); - dateFilter.setType(FilterType.DATERANGE); - dateFilter.setFieldName(PlanetAttributes.ACQUIRED); - dateFilter.setConfig(new FilterConfig(new DatePlanet(start), new DatePlanet(end))); - return dateFilter; - } - - private Filter withinDaysFilter(Feature feature, int days) { - Date acquriredDate = feature.getProperties().getAcquired(); - LocalDateTime localDateTime = DateUtils.asLocalDateTime(acquriredDate); - Date start = DateUtils.asDate(localDateTime.minusDays(days)); - Date end = DateUtils.asDate(localDateTime.plusDays(days - 1)); - return getDateFilter(start, end); - } - - private Filter getGeometryFilter(GeoJson geoJson) { - Filter geoFilter = new Filter<>(); - geoFilter.setType(FilterType.GEOMETRY); - geoFilter.setFieldName(PlanetAttributes.GEOMETRY); - geoFilter.setConfig(new FilterConfig(geoJson.getType(), geoJson.getCoordinates())); - return geoFilter; - } - - private Filter getAndFilter(Filter[] filters) { - Filter andFilter = new Filter<>(); - andFilter.setType(FilterType.AND); - andFilter.setConfig(filters); - return andFilter; - } - - private Filter getOrFilter(Filter[] filters) { - Filter andFilter = new Filter<>(); - andFilter.setType(FilterType.OR); - andFilter.setConfig(filters); - return andFilter; - } - - private Filter getStringInFilter(String fieldName, String[] strings) { - Filter stringInFilter = new Filter<>(); - stringInFilter.setType(FilterType.STRING_IN); - stringInFilter.setFieldName(fieldName); - stringInFilter.setConfig(strings); - return stringInFilter; - } - - private int getQuality(Feature feature) { - FeatureProperties p = feature.getProperties(); - Integer quality = p.getClearPercent(); - if (quality != null) - return quality; - else { - return (int) ((1 - p.getCloudCover()) * 50); - } - } - - private String sendRequest(URL url, Object jsonObject) throws IOException { - try { - - HttpURLConnection conn = getAuthenticatedConnection(url, jsonObject); - - buildRequet(jsonObject, conn); - - StringBuilder response = null; - try { - response = readStream(conn.getInputStream()); - } finally { - conn.disconnect(); - } - - retries = 0; // reset the counter as it was a success - return response.toString(); - } catch (IOException e) { - if( e.getMessage()!=null && e.getMessage().contains("429") ) { // This happens when there are too many consecutive requests! Make the user wait a bit and try again! - try { - if( retries < MAX_RETRIES ) { - Thread.sleep( 5000 ); - retries++; - }else { - retries = 0; - throw e; - } - } catch (InterruptedException e1) { - logger.error( "Error waiting for Thread requesting Planet imagery"); - } - return sendRequest(url, jsonObject); - }else { - throw e; // Another type of error throw! - } - } - } - - private void buildRequet(Object jsonObject, HttpURLConnection conn) - throws IOException { - byte[] postDataBytes = null; - if (jsonObject != null) { - String jsonInputString = gson.toJson(jsonObject); - postDataBytes = jsonInputString.getBytes( StandardCharsets.UTF_8.name()); - logger.info(jsonInputString); - } - if (postDataBytes != null) { - conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length)); - conn.getOutputStream().write(postDataBytes); - } else { - conn.setRequestProperty("Content-Length", "0"); - } - } - - private HttpURLConnection getAuthenticatedConnection(URL url, Object jsonObject) - throws IOException { - HttpURLConnection conn = null; - if( factory != null ) { // THIS IS A WORKAROUND TO REMOVE SSL CERTIFICATE ISSUES - conn = (HttpsURLConnection) url.openConnection(); - ((HttpsURLConnection)conn).setSSLSocketFactory(factory); - }else { - conn = (HttpURLConnection) url.openConnection(); - } - - // very important to keep the semicolon at the end - String basicAuth = "Basic " + new String(Base64.getEncoder().encode((apiKey + ":").getBytes())); - conn.setRequestProperty("Authorization", basicAuth); - - conn.setRequestMethod(jsonObject != null ? "POST" : "GET"); - conn.setRequestProperty("Content-Type", "application/json"); - conn.setRequestProperty("Accept", "application/json"); - conn.setDoOutput(true); - return conn; - } - - // Workaround for computers that have trouble accepting Planet's SSL certificates - private static SSLSocketFactory getSSLAcceptAllFactory(){ - SSLSocketFactory factory = null; - try { - Security.getProviders(); - final SSLContext ssl = SSLContext.getInstance("TLSv1.2"); - ssl.init(null, new TrustManager[] { new TrustAllCertificates() }, null); - return ssl.getSocketFactory(); - } catch (Exception e) { - logger.error( "Error obtaining SSL factory when opeining Planet REST URL",e); - } - - return factory; - } - - private StringBuilder readStream(InputStream is) throws IOException { - StringBuilder response = new StringBuilder(); - try (BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) { - String responseLine = null; - while ((responseLine = br.readLine()) != null) { - response.append(responseLine.trim()); - } - } - return response; - } - - private Feature[] search(String[] itemTypes, Filter[] filters, Integer maxResults) throws IOException { - - Filter andFilter = getAndFilter(filters); - SearchRequest searchRequest = new SearchRequest(itemTypes, andFilter); - - String response = sendRequest(new URL("https://api.planet.com/data/v1/quick-search"), searchRequest); - Feature[] featuresInPage = getNextPage(response); - - if (featuresInPage != null && maxResults != null ) { - Arrays.sort(featuresInPage, new FeatureSorter()); - - if (featuresInPage.length > maxResults) { - featuresInPage = ArrayUtils.subarray(featuresInPage, 0, maxResults); - } - ArrayUtils.reverse(featuresInPage); - } - - return featuresInPage; - - } - - private Feature[] getNextPage(String resJson) throws IOException { - if (StringUtils.isNotBlank(resJson)) { - Response resp = gson.fromJson(resJson, Response.class); - Feature[] features = resp.getFeatures(); - Links links = resp.getLinks(); - if (links != null && links.getNext() != null) { - String nextUrl = links.getNext(); - String res = sendRequest(new URL(nextUrl), null); - Feature[] nextFeatures = getNextPage(res); - return ArrayUtils.addAll(features, nextFeatures); - } else { - return features; - } - } else { - return new Feature[] {}; - } - } - - private String getLayers(Feature[] features) throws IOException { - String layerUrl = ""; - if (features.length > 0) { - String[] ids = new String[features.length]; - for (int i = 0; i < ids.length; i++) { - Feature feature = features[i]; - - String idSearch = feature.getProperties().getItemType() + ':' + feature.getId(); - ids[i] = idSearch; - } - - SearchRequest layerRequest = new SearchRequest(ids); - String layers = sendRequest(new URL("https://tiles0.planet.com/data/v1/layers"), layerRequest); - LayerResponse layerResponse = gson.fromJson(layers, LayerResponse.class); - if (layerResponse != null) { - layerUrl = layerResponse.getTiles()[0]; - } - } - return layerUrl; - } - - private Feature[] getFeatures (PlanetRequestParameters planetRequestParameters ) throws IOException { - Calendar thresholdQuality = Calendar.getInstance(); - thresholdQuality.set(2016, 0,1); - - GeoJson geometry = new GeoJson("Polygon", planetRequestParameters.getCoords()); - Filter geometryFilter = getGeometryFilter(geometry); - Filter[] filters = null; - /* maybe we can use test quality anyway - * it gets complicated when the filter start/end date is multiyear - */ - if( planetRequestParameters.getStart().before( thresholdQuality.getTime() ) && planetRequestParameters.getEnd().after( thresholdQuality.getTime() ) ) { - - Filter qualityFilter = getStringInFilter("quality_category", new String[] { "standard" }); - Filter before2016Filter = getDateFilter(planetRequestParameters.getStart(), thresholdQuality.getTime() ); - Filter after2016Filter = getDateFilter(thresholdQuality.getTime(), planetRequestParameters.getEnd() ); - - Filter after2016AndStandardQuality = getAndFilter( new Filter[] { after2016Filter, qualityFilter } ); - Filter before2016OrAfter2016AndStandardQuality = getOrFilter( new Filter[] { before2016Filter, after2016AndStandardQuality } ); - - // Add quality filter only for images after 2016 - - filters = new Filter[] { before2016OrAfter2016AndStandardQuality, geometryFilter }; - - }else if( planetRequestParameters.getStart().after( thresholdQuality.getTime() ) ) { - Filter dateFilter = getDateFilter(planetRequestParameters.getStart(), planetRequestParameters.getEnd()); - // Add quality filter only for images after 2016 - Filter qualityFilter = getStringInFilter("quality_category", new String[] { "standard" }); - filters = new Filter[] { dateFilter, geometryFilter, qualityFilter }; - }else { - Filter dateFilter = getDateFilter(planetRequestParameters.getStart(), planetRequestParameters.getEnd()); - filters = new Filter[] { dateFilter, geometryFilter }; - } - - return search(planetRequestParameters.getItemTypes(), filters, null); - } - - public String getLayerUrl(PlanetRequestParameters planetRequestParameters) throws IOException { - Feature[] searchResults = getFeatures (planetRequestParameters); - return searchResults!=null ? getLayers(searchResults) : null; - } - - public Map getAvailableDates(PlanetRequestParameters planetRequestParameters) throws IOException { - - Feature[] searchResults = getFeatures (planetRequestParameters); - - Map datesAvailable = new HashMap<>(); - - Calendar cal = Calendar.getInstance(); - if( searchResults != null ) { - for (Feature feature : searchResults) { - cal.setTime( feature.getProperties().acquired ); - int year = cal.get( Calendar.YEAR ); - int month = cal.get( Calendar.MONTH ) + 1; - int day = cal.get( Calendar.DATE ); - datesAvailable.put( year+""+ ( month<10?"0"+month:month ), "true"); // THe month, in order to know for whcioh moinths there are images - datesAvailable.put( year+""+ ( month<10?"0"+month:month )+ ( day<10?"0"+day:day ), "true"); - } - } - return datesAvailable; - } - - public String getLatestUrl(SimplePlacemarkObject placemarkObject) throws IOException { - LocalDateTime localDateTime = DateUtils.asLocalDateTime(new Date()); - Date start = DateUtils.asDate(localDateTime.minusDays(30)); - - List shape = placemarkObject.getMultiShape().get(0); - - double[][][] polygon = new double[1][shape.size()][2]; - int i = 0; - for (SimpleCoordinate simpleCoordinate : shape) { - polygon[0][i][1] = Double.parseDouble(simpleCoordinate.getLatitude()); - polygon[0][i++][0] = Double.parseDouble(simpleCoordinate.getLongitude()); - } - String[] itemTypes = { "PSScene3Band", "PSScene4Band" }; - return getLayerUrl(new PlanetRequestParameters(start, new Date(), polygon, itemTypes)); - } -} +package org.openforis.collect.earth.planet; + +import java.util.Date; + +public class PlanetRequestParameters { + private Date start; + private Date end; + private double[][][] coords; + private String[] itemTypes; + + public PlanetRequestParameters(Date start, Date end, double[][][] coords, String[] itemTypes) { + this.start = start; + this.end = end; + this.coords = coords; + this.itemTypes = itemTypes; + } + + public Date getStart() { + return start; + } + + public void setStart(Date start) { + this.start = start; + } + + public Date getEnd() { + return end; + } + + public void setEnd(Date end) { + this.end = end; + } + + public double[][][] getCoords() { + return coords; + } + + public void setCoords(double[][][] coords) { + this.coords = coords; + } + + public String[] getItemTypes() { + return itemTypes; + } + + public void setItemTypes(String[] itemTypes) { + this.itemTypes = itemTypes; + } +} \ No newline at end of file From 2be214843ce9f84f9486f51cf88a0329f371438b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:02 +0100 Subject: [PATCH 1544/1620] New translations PlanetRequestParameters.java (English) --- .../earth/app/view/Messages_en.properties | 393 +++--------------- 1 file changed, 49 insertions(+), 344 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 34f161190b..afe14d18fd 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,344 +1,49 @@ -package org.openforis.collect.earth.planet; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.HttpURLConnection; -import java.net.URL; -import java.nio.charset.StandardCharsets; -import java.security.Security; -import java.time.LocalDateTime; -import java.util.Arrays; -import java.util.Base64; -import java.util.Calendar; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSocketFactory; -import javax.net.ssl.TrustManager; - -import org.apache.commons.lang3.ArrayUtils; -import org.apache.commons.lang3.StringUtils; -import org.openforis.collect.earth.app.service.TrustAllCertificates; -import org.openforis.collect.earth.sampler.model.SimpleCoordinate; -import org.openforis.collect.earth.sampler.model.SimplePlacemarkObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; - -public class PlanetImagery { - - private static final Logger logger = LoggerFactory.getLogger(PlanetImagery.class); - private static final Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").create(); - private static final SSLSocketFactory factory = getSSLAcceptAllFactory(); - - private String apiKey; - - private int retries = 0; - - private static final int MAX_RETRIES = 6; - - public PlanetImagery(String apiKey) { - super(); - this.apiKey = apiKey; - } - - private Filter getDateFilter(Date start, Date end) { - Filter dateFilter = new Filter<>(); - dateFilter.setType(FilterType.DATERANGE); - dateFilter.setFieldName(PlanetAttributes.ACQUIRED); - dateFilter.setConfig(new FilterConfig(new DatePlanet(start), new DatePlanet(end))); - return dateFilter; - } - - private Filter withinDaysFilter(Feature feature, int days) { - Date acquriredDate = feature.getProperties().getAcquired(); - LocalDateTime localDateTime = DateUtils.asLocalDateTime(acquriredDate); - Date start = DateUtils.asDate(localDateTime.minusDays(days)); - Date end = DateUtils.asDate(localDateTime.plusDays(days - 1)); - return getDateFilter(start, end); - } - - private Filter getGeometryFilter(GeoJson geoJson) { - Filter geoFilter = new Filter<>(); - geoFilter.setType(FilterType.GEOMETRY); - geoFilter.setFieldName(PlanetAttributes.GEOMETRY); - geoFilter.setConfig(new FilterConfig(geoJson.getType(), geoJson.getCoordinates())); - return geoFilter; - } - - private Filter getAndFilter(Filter[] filters) { - Filter andFilter = new Filter<>(); - andFilter.setType(FilterType.AND); - andFilter.setConfig(filters); - return andFilter; - } - - private Filter getOrFilter(Filter[] filters) { - Filter andFilter = new Filter<>(); - andFilter.setType(FilterType.OR); - andFilter.setConfig(filters); - return andFilter; - } - - private Filter getStringInFilter(String fieldName, String[] strings) { - Filter stringInFilter = new Filter<>(); - stringInFilter.setType(FilterType.STRING_IN); - stringInFilter.setFieldName(fieldName); - stringInFilter.setConfig(strings); - return stringInFilter; - } - - private int getQuality(Feature feature) { - FeatureProperties p = feature.getProperties(); - Integer quality = p.getClearPercent(); - if (quality != null) - return quality; - else { - return (int) ((1 - p.getCloudCover()) * 50); - } - } - - private String sendRequest(URL url, Object jsonObject) throws IOException { - try { - - HttpURLConnection conn = getAuthenticatedConnection(url, jsonObject); - - buildRequet(jsonObject, conn); - - StringBuilder response = null; - try { - response = readStream(conn.getInputStream()); - } finally { - conn.disconnect(); - } - - retries = 0; // reset the counter as it was a success - return response.toString(); - } catch (IOException e) { - if( e.getMessage()!=null && e.getMessage().contains("429") ) { // This happens when there are too many consecutive requests! Make the user wait a bit and try again! - try { - if( retries < MAX_RETRIES ) { - Thread.sleep( 5000 ); - retries++; - }else { - retries = 0; - throw e; - } - } catch (InterruptedException e1) { - logger.error( "Error waiting for Thread requesting Planet imagery"); - } - return sendRequest(url, jsonObject); - }else { - throw e; // Another type of error throw! - } - } - } - - private void buildRequet(Object jsonObject, HttpURLConnection conn) - throws IOException { - byte[] postDataBytes = null; - if (jsonObject != null) { - String jsonInputString = gson.toJson(jsonObject); - postDataBytes = jsonInputString.getBytes( StandardCharsets.UTF_8.name()); - logger.info(jsonInputString); - } - if (postDataBytes != null) { - conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length)); - conn.getOutputStream().write(postDataBytes); - } else { - conn.setRequestProperty("Content-Length", "0"); - } - } - - private HttpURLConnection getAuthenticatedConnection(URL url, Object jsonObject) - throws IOException { - HttpURLConnection conn = null; - if( factory != null ) { // THIS IS A WORKAROUND TO REMOVE SSL CERTIFICATE ISSUES - conn = (HttpsURLConnection) url.openConnection(); - ((HttpsURLConnection)conn).setSSLSocketFactory(factory); - }else { - conn = (HttpURLConnection) url.openConnection(); - } - - // very important to keep the semicolon at the end - String basicAuth = "Basic " + new String(Base64.getEncoder().encode((apiKey + ":").getBytes())); - conn.setRequestProperty("Authorization", basicAuth); - - conn.setRequestMethod(jsonObject != null ? "POST" : "GET"); - conn.setRequestProperty("Content-Type", "application/json"); - conn.setRequestProperty("Accept", "application/json"); - conn.setDoOutput(true); - return conn; - } - - // Workaround for computers that have trouble accepting Planet's SSL certificates - private static SSLSocketFactory getSSLAcceptAllFactory(){ - SSLSocketFactory factory = null; - try { - Security.getProviders(); - final SSLContext ssl = SSLContext.getInstance("TLSv1.2"); - ssl.init(null, new TrustManager[] { new TrustAllCertificates() }, null); - return ssl.getSocketFactory(); - } catch (Exception e) { - logger.error( "Error obtaining SSL factory when opeining Planet REST URL",e); - } - - return factory; - } - - private StringBuilder readStream(InputStream is) throws IOException { - StringBuilder response = new StringBuilder(); - try (BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) { - String responseLine = null; - while ((responseLine = br.readLine()) != null) { - response.append(responseLine.trim()); - } - } - return response; - } - - private Feature[] search(String[] itemTypes, Filter[] filters, Integer maxResults) throws IOException { - - Filter andFilter = getAndFilter(filters); - SearchRequest searchRequest = new SearchRequest(itemTypes, andFilter); - - String response = sendRequest(new URL("https://api.planet.com/data/v1/quick-search"), searchRequest); - Feature[] featuresInPage = getNextPage(response); - - if (featuresInPage != null && maxResults != null ) { - Arrays.sort(featuresInPage, new FeatureSorter()); - - if (featuresInPage.length > maxResults) { - featuresInPage = ArrayUtils.subarray(featuresInPage, 0, maxResults); - } - ArrayUtils.reverse(featuresInPage); - } - - return featuresInPage; - - } - - private Feature[] getNextPage(String resJson) throws IOException { - if (StringUtils.isNotBlank(resJson)) { - Response resp = gson.fromJson(resJson, Response.class); - Feature[] features = resp.getFeatures(); - Links links = resp.getLinks(); - if (links != null && links.getNext() != null) { - String nextUrl = links.getNext(); - String res = sendRequest(new URL(nextUrl), null); - Feature[] nextFeatures = getNextPage(res); - return ArrayUtils.addAll(features, nextFeatures); - } else { - return features; - } - } else { - return new Feature[] {}; - } - } - - private String getLayers(Feature[] features) throws IOException { - String layerUrl = ""; - if (features.length > 0) { - String[] ids = new String[features.length]; - for (int i = 0; i < ids.length; i++) { - Feature feature = features[i]; - - String idSearch = feature.getProperties().getItemType() + ':' + feature.getId(); - ids[i] = idSearch; - } - - SearchRequest layerRequest = new SearchRequest(ids); - String layers = sendRequest(new URL("https://tiles0.planet.com/data/v1/layers"), layerRequest); - LayerResponse layerResponse = gson.fromJson(layers, LayerResponse.class); - if (layerResponse != null) { - layerUrl = layerResponse.getTiles()[0]; - } - } - return layerUrl; - } - - private Feature[] getFeatures (PlanetRequestParameters planetRequestParameters ) throws IOException { - Calendar thresholdQuality = Calendar.getInstance(); - thresholdQuality.set(2016, 0,1); - - GeoJson geometry = new GeoJson("Polygon", planetRequestParameters.getCoords()); - Filter geometryFilter = getGeometryFilter(geometry); - Filter[] filters = null; - /* maybe we can use test quality anyway - * it gets complicated when the filter start/end date is multiyear - */ - if( planetRequestParameters.getStart().before( thresholdQuality.getTime() ) && planetRequestParameters.getEnd().after( thresholdQuality.getTime() ) ) { - - Filter qualityFilter = getStringInFilter("quality_category", new String[] { "standard" }); - Filter before2016Filter = getDateFilter(planetRequestParameters.getStart(), thresholdQuality.getTime() ); - Filter after2016Filter = getDateFilter(thresholdQuality.getTime(), planetRequestParameters.getEnd() ); - - Filter after2016AndStandardQuality = getAndFilter( new Filter[] { after2016Filter, qualityFilter } ); - Filter before2016OrAfter2016AndStandardQuality = getOrFilter( new Filter[] { before2016Filter, after2016AndStandardQuality } ); - - // Add quality filter only for images after 2016 - - filters = new Filter[] { before2016OrAfter2016AndStandardQuality, geometryFilter }; - - }else if( planetRequestParameters.getStart().after( thresholdQuality.getTime() ) ) { - Filter dateFilter = getDateFilter(planetRequestParameters.getStart(), planetRequestParameters.getEnd()); - // Add quality filter only for images after 2016 - Filter qualityFilter = getStringInFilter("quality_category", new String[] { "standard" }); - filters = new Filter[] { dateFilter, geometryFilter, qualityFilter }; - }else { - Filter dateFilter = getDateFilter(planetRequestParameters.getStart(), planetRequestParameters.getEnd()); - filters = new Filter[] { dateFilter, geometryFilter }; - } - - return search(planetRequestParameters.getItemTypes(), filters, null); - } - - public String getLayerUrl(PlanetRequestParameters planetRequestParameters) throws IOException { - Feature[] searchResults = getFeatures (planetRequestParameters); - return searchResults!=null ? getLayers(searchResults) : null; - } - - public Map getAvailableDates(PlanetRequestParameters planetRequestParameters) throws IOException { - - Feature[] searchResults = getFeatures (planetRequestParameters); - - Map datesAvailable = new HashMap<>(); - - Calendar cal = Calendar.getInstance(); - if( searchResults != null ) { - for (Feature feature : searchResults) { - cal.setTime( feature.getProperties().acquired ); - int year = cal.get( Calendar.YEAR ); - int month = cal.get( Calendar.MONTH ) + 1; - int day = cal.get( Calendar.DATE ); - datesAvailable.put( year+""+ ( month<10?"0"+month:month ), "true"); // THe month, in order to know for whcioh moinths there are images - datesAvailable.put( year+""+ ( month<10?"0"+month:month )+ ( day<10?"0"+day:day ), "true"); - } - } - return datesAvailable; - } - - public String getLatestUrl(SimplePlacemarkObject placemarkObject) throws IOException { - LocalDateTime localDateTime = DateUtils.asLocalDateTime(new Date()); - Date start = DateUtils.asDate(localDateTime.minusDays(30)); - - List shape = placemarkObject.getMultiShape().get(0); - - double[][][] polygon = new double[1][shape.size()][2]; - int i = 0; - for (SimpleCoordinate simpleCoordinate : shape) { - polygon[0][i][1] = Double.parseDouble(simpleCoordinate.getLatitude()); - polygon[0][i++][0] = Double.parseDouble(simpleCoordinate.getLongitude()); - } - String[] itemTypes = { "PSScene3Band", "PSScene4Band" }; - return getLayerUrl(new PlanetRequestParameters(start, new Date(), polygon, itemTypes)); - } -} +package org.openforis.collect.earth.planet; + +import java.util.Date; + +public class PlanetRequestParameters { + private Date start; + private Date end; + private double[][][] coords; + private String[] itemTypes; + + public PlanetRequestParameters(Date start, Date end, double[][][] coords, String[] itemTypes) { + this.start = start; + this.end = end; + this.coords = coords; + this.itemTypes = itemTypes; + } + + public Date getStart() { + return start; + } + + public void setStart(Date start) { + this.start = start; + } + + public Date getEnd() { + return end; + } + + public void setEnd(Date end) { + this.end = end; + } + + public double[][][] getCoords() { + return coords; + } + + public void setCoords(double[][][] coords) { + this.coords = coords; + } + + public String[] getItemTypes() { + return itemTypes; + } + + public void setItemTypes(String[] itemTypes) { + this.itemTypes = itemTypes; + } +} \ No newline at end of file From 03312aee384a54befdb1044fef457b5c3facfa37 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:03 +0100 Subject: [PATCH 1545/1620] New translations Response.java (French) --- .../earth/app/view/Messages_fr.properties | 64 +++++-------------- 1 file changed, 15 insertions(+), 49 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index afe14d18fd..21d609c128 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,49 +1,15 @@ -package org.openforis.collect.earth.planet; - -import java.util.Date; - -public class PlanetRequestParameters { - private Date start; - private Date end; - private double[][][] coords; - private String[] itemTypes; - - public PlanetRequestParameters(Date start, Date end, double[][][] coords, String[] itemTypes) { - this.start = start; - this.end = end; - this.coords = coords; - this.itemTypes = itemTypes; - } - - public Date getStart() { - return start; - } - - public void setStart(Date start) { - this.start = start; - } - - public Date getEnd() { - return end; - } - - public void setEnd(Date end) { - this.end = end; - } - - public double[][][] getCoords() { - return coords; - } - - public void setCoords(double[][][] coords) { - this.coords = coords; - } - - public String[] getItemTypes() { - return itemTypes; - } - - public void setItemTypes(String[] itemTypes) { - this.itemTypes = itemTypes; - } -} \ No newline at end of file +package org.openforis.collect.earth.planet; + +public class Response { + + public Feature[] features; + public Links _links; + + public Feature[] getFeatures() { + return features; + } + + public Links getLinks() { + return _links; + } +} From 0311a3c225365153ec300ff2a7c2fd914f2f0874 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:04 +0100 Subject: [PATCH 1546/1620] New translations Response.java (Spanish) --- .../earth/app/view/Messages_es.properties | 64 +++++-------------- 1 file changed, 15 insertions(+), 49 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index afe14d18fd..21d609c128 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,49 +1,15 @@ -package org.openforis.collect.earth.planet; - -import java.util.Date; - -public class PlanetRequestParameters { - private Date start; - private Date end; - private double[][][] coords; - private String[] itemTypes; - - public PlanetRequestParameters(Date start, Date end, double[][][] coords, String[] itemTypes) { - this.start = start; - this.end = end; - this.coords = coords; - this.itemTypes = itemTypes; - } - - public Date getStart() { - return start; - } - - public void setStart(Date start) { - this.start = start; - } - - public Date getEnd() { - return end; - } - - public void setEnd(Date end) { - this.end = end; - } - - public double[][][] getCoords() { - return coords; - } - - public void setCoords(double[][][] coords) { - this.coords = coords; - } - - public String[] getItemTypes() { - return itemTypes; - } - - public void setItemTypes(String[] itemTypes) { - this.itemTypes = itemTypes; - } -} \ No newline at end of file +package org.openforis.collect.earth.planet; + +public class Response { + + public Feature[] features; + public Links _links; + + public Feature[] getFeatures() { + return features; + } + + public Links getLinks() { + return _links; + } +} From 31e2964f46e090f3dd6d7dee3358f57e4b44d39f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:05 +0100 Subject: [PATCH 1547/1620] New translations Response.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 64 +++++-------------- 1 file changed, 15 insertions(+), 49 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index afe14d18fd..21d609c128 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,49 +1,15 @@ -package org.openforis.collect.earth.planet; - -import java.util.Date; - -public class PlanetRequestParameters { - private Date start; - private Date end; - private double[][][] coords; - private String[] itemTypes; - - public PlanetRequestParameters(Date start, Date end, double[][][] coords, String[] itemTypes) { - this.start = start; - this.end = end; - this.coords = coords; - this.itemTypes = itemTypes; - } - - public Date getStart() { - return start; - } - - public void setStart(Date start) { - this.start = start; - } - - public Date getEnd() { - return end; - } - - public void setEnd(Date end) { - this.end = end; - } - - public double[][][] getCoords() { - return coords; - } - - public void setCoords(double[][][] coords) { - this.coords = coords; - } - - public String[] getItemTypes() { - return itemTypes; - } - - public void setItemTypes(String[] itemTypes) { - this.itemTypes = itemTypes; - } -} \ No newline at end of file +package org.openforis.collect.earth.planet; + +public class Response { + + public Feature[] features; + public Links _links; + + public Feature[] getFeatures() { + return features; + } + + public Links getLinks() { + return _links; + } +} From 01ac41d562432b2fd26aa69e8eb4df2a70bc27e0 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:06 +0100 Subject: [PATCH 1548/1620] New translations Response.java (English) --- .../earth/app/view/Messages_en.properties | 64 +++++-------------- 1 file changed, 15 insertions(+), 49 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index afe14d18fd..21d609c128 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,49 +1,15 @@ -package org.openforis.collect.earth.planet; - -import java.util.Date; - -public class PlanetRequestParameters { - private Date start; - private Date end; - private double[][][] coords; - private String[] itemTypes; - - public PlanetRequestParameters(Date start, Date end, double[][][] coords, String[] itemTypes) { - this.start = start; - this.end = end; - this.coords = coords; - this.itemTypes = itemTypes; - } - - public Date getStart() { - return start; - } - - public void setStart(Date start) { - this.start = start; - } - - public Date getEnd() { - return end; - } - - public void setEnd(Date end) { - this.end = end; - } - - public double[][][] getCoords() { - return coords; - } - - public void setCoords(double[][][] coords) { - this.coords = coords; - } - - public String[] getItemTypes() { - return itemTypes; - } - - public void setItemTypes(String[] itemTypes) { - this.itemTypes = itemTypes; - } -} \ No newline at end of file +package org.openforis.collect.earth.planet; + +public class Response { + + public Feature[] features; + public Links _links; + + public Feature[] getFeatures() { + return features; + } + + public Links getLinks() { + return _links; + } +} From ca59b5cff30fcbda246236ddeb0481523a85c275 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:07 +0100 Subject: [PATCH 1549/1620] New translations SearchRequest.java (Spanish) --- .../earth/app/view/Messages_es.properties | 35 +++++++++++++++---- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 21d609c128..34ef3a1eb1 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,15 +1,36 @@ package org.openforis.collect.earth.planet; -public class Response { +public class SearchRequest{ - public Feature[] features; - public Links _links; + String[] item_types; + Filter filter; + String[] ids; - public Feature[] getFeatures() { - return features; + public SearchRequest(String[] ids) { + super(); + this.ids = ids; } - public Links getLinks() { - return _links; + public SearchRequest(String[] itemTypes, Filter filter) { + super(); + this.item_types = itemTypes; + this.filter = filter; } + + public String[] getItemTypes() { + return item_types; + } + + public void setItemTypes(String[] itemTypes) { + this.item_types = itemTypes; + } + + public Filter getFilter() { + return filter; + } + + public void setFilter(Filter filter) { + this.filter = filter; + } + } From 7142fd609380f61fe4262b7161808ad82acc3e45 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:08 +0100 Subject: [PATCH 1550/1620] New translations AttributeAddChangeProxy.java (French) --- .../earth/app/view/Messages_fr.properties | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 21d609c128..77ee59553a 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,15 +1,22 @@ -package org.openforis.collect.earth.planet; +package org.openforis.collect.model.proxy; -public class Response { +import org.openforis.collect.ProxyContext; +import org.openforis.collect.model.AttributeChange; - public Feature[] features; - public Links _links; +/** + * + * @author S. Ricci + * + */ +public class AttributeAddChangeProxy extends AttributeChangeProxy implements NodeAddChangeProxy { - public Feature[] getFeatures() { - return features; + public AttributeAddChangeProxy(AttributeChange change, ProxyContext context) { + super(change, context); } - public Links getLinks() { - return _links; + @Override + public NodeProxy getCreatedNode() { + return NodeProxy.fromNode(change.getNode(), context); } -} + +} \ No newline at end of file From ad33c4c494314273f6c416aa0c95a92d8ee9da7b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:10 +0100 Subject: [PATCH 1551/1620] New translations SearchRequest.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 35 +++++++++++++++---- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 21d609c128..34ef3a1eb1 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,15 +1,36 @@ package org.openforis.collect.earth.planet; -public class Response { +public class SearchRequest{ - public Feature[] features; - public Links _links; + String[] item_types; + Filter filter; + String[] ids; - public Feature[] getFeatures() { - return features; + public SearchRequest(String[] ids) { + super(); + this.ids = ids; } - public Links getLinks() { - return _links; + public SearchRequest(String[] itemTypes, Filter filter) { + super(); + this.item_types = itemTypes; + this.filter = filter; } + + public String[] getItemTypes() { + return item_types; + } + + public void setItemTypes(String[] itemTypes) { + this.item_types = itemTypes; + } + + public Filter getFilter() { + return filter; + } + + public void setFilter(Filter filter) { + this.filter = filter; + } + } From 5457161933d9dee8a97e92494eddfe993d9256e6 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:11 +0100 Subject: [PATCH 1552/1620] New translations SearchRequest.java (English) --- .../earth/app/view/Messages_en.properties | 35 +++++++++++++++---- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 21d609c128..34ef3a1eb1 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,15 +1,36 @@ package org.openforis.collect.earth.planet; -public class Response { +public class SearchRequest{ - public Feature[] features; - public Links _links; + String[] item_types; + Filter filter; + String[] ids; - public Feature[] getFeatures() { - return features; + public SearchRequest(String[] ids) { + super(); + this.ids = ids; } - public Links getLinks() { - return _links; + public SearchRequest(String[] itemTypes, Filter filter) { + super(); + this.item_types = itemTypes; + this.filter = filter; } + + public String[] getItemTypes() { + return item_types; + } + + public void setItemTypes(String[] itemTypes) { + this.item_types = itemTypes; + } + + public Filter getFilter() { + return filter; + } + + public void setFilter(Filter filter) { + this.filter = filter; + } + } From 41ed566e02ebfe1fe4335566af409ecde6b792b5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:12 +0100 Subject: [PATCH 1553/1620] New translations Test.java (French) --- .../earth/app/view/Messages_fr.properties | 63 ++++++++++++++----- 1 file changed, 47 insertions(+), 16 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 77ee59553a..13502650b2 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,22 +1,53 @@ -package org.openforis.collect.model.proxy; +package org.openforis.collect.earth.planet; -import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.AttributeChange; +import java.text.SimpleDateFormat; +import java.util.Date; -/** - * - * @author S. Ricci - * - */ -public class AttributeAddChangeProxy extends AttributeChangeProxy implements NodeAddChangeProxy { +public class Test { - public AttributeAddChangeProxy(AttributeChange change, ProxyContext context) { - super(change, context); - } - @Override - public NodeProxy getCreatedNode() { - return NodeProxy.fromNode(change.getNode(), context); - } + public static void main(String[] args) { + try { + PlanetImagery planet = new PlanetImagery( "YOUR API KEY FOR DAILY IMAGERY" ); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + Date start = formatter.parse("2013-01-01"); + Date end = formatter.parse("2013-12-01"); + String[] itemTypes = {"PSScene3Band", "PSScene4Band", "REOrthoTile"};/* + double[][][] coords = {{ + { + -1.8230438232421875, + 5.66433079911972 + }, + { + -1.8195247650146482, + 5.66433079911972 + }, + { + -1.8195247650146482, + 5.6671493748802915 + }, + { + -1.8230438232421875, + 5.6671493748802915 + }, + { + -1.8230438232421875, + 5.66433079911972 + } } + }; + */ + double[][][] coords = {{{148.440013,-5.763688}, {148.440645,-5.763688}, {148.440645,-5.76432}, {148.440013,-5.76432}, {148.440013,-5.763688}}}; + //double[][][] coords = {{{-39.611883, -72.612975}, {-39.611883, -72.611833}, {-39.612765, -72.611833}, {-39.612765, -72.612975}, {-39.611883, -72.612975}}}; + System.out.println( + planet.getAvailableDates( new PlanetRequestParameters(start, end, coords, itemTypes) ) + ); + System.out.println( + planet.getLayerUrl( new PlanetRequestParameters(start, end, coords, itemTypes) ) + ); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } } \ No newline at end of file From 8087bc3ee68b0bd67a7384320143fb278ca31e1b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:13 +0100 Subject: [PATCH 1554/1620] New translations Test.java (Spanish) --- .../earth/app/view/Messages_es.properties | 83 +++++++++++-------- 1 file changed, 50 insertions(+), 33 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 34ef3a1eb1..13502650b2 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,36 +1,53 @@ package org.openforis.collect.earth.planet; -public class SearchRequest{ - - String[] item_types; - Filter filter; - String[] ids; - - public SearchRequest(String[] ids) { - super(); - this.ids = ids; - } - - public SearchRequest(String[] itemTypes, Filter filter) { - super(); - this.item_types = itemTypes; - this.filter = filter; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class Test { + + + public static void main(String[] args) { + try { + PlanetImagery planet = new PlanetImagery( "YOUR API KEY FOR DAILY IMAGERY" ); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + Date start = formatter.parse("2013-01-01"); + Date end = formatter.parse("2013-12-01"); + String[] itemTypes = {"PSScene3Band", "PSScene4Band", "REOrthoTile"};/* + double[][][] coords = {{ + { + -1.8230438232421875, + 5.66433079911972 + }, + { + -1.8195247650146482, + 5.66433079911972 + }, + { + -1.8195247650146482, + 5.6671493748802915 + }, + { + -1.8230438232421875, + 5.6671493748802915 + }, + { + -1.8230438232421875, + 5.66433079911972 + } } + }; + */ + + double[][][] coords = {{{148.440013,-5.763688}, {148.440645,-5.763688}, {148.440645,-5.76432}, {148.440013,-5.76432}, {148.440013,-5.763688}}}; + //double[][][] coords = {{{-39.611883, -72.612975}, {-39.611883, -72.611833}, {-39.612765, -72.611833}, {-39.612765, -72.612975}, {-39.611883, -72.612975}}}; + System.out.println( + planet.getAvailableDates( new PlanetRequestParameters(start, end, coords, itemTypes) ) + ); + System.out.println( + planet.getLayerUrl( new PlanetRequestParameters(start, end, coords, itemTypes) ) + ); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } } - - public String[] getItemTypes() { - return item_types; - } - - public void setItemTypes(String[] itemTypes) { - this.item_types = itemTypes; - } - - public Filter getFilter() { - return filter; - } - - public void setFilter(Filter filter) { - this.filter = filter; - } - -} +} \ No newline at end of file From 5c2d3eb0e9c031a6a1a076b548b5f41ce569e565 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:14 +0100 Subject: [PATCH 1555/1620] New translations Test.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 83 +++++++++++-------- 1 file changed, 50 insertions(+), 33 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 34ef3a1eb1..13502650b2 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,36 +1,53 @@ package org.openforis.collect.earth.planet; -public class SearchRequest{ - - String[] item_types; - Filter filter; - String[] ids; - - public SearchRequest(String[] ids) { - super(); - this.ids = ids; - } - - public SearchRequest(String[] itemTypes, Filter filter) { - super(); - this.item_types = itemTypes; - this.filter = filter; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class Test { + + + public static void main(String[] args) { + try { + PlanetImagery planet = new PlanetImagery( "YOUR API KEY FOR DAILY IMAGERY" ); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + Date start = formatter.parse("2013-01-01"); + Date end = formatter.parse("2013-12-01"); + String[] itemTypes = {"PSScene3Band", "PSScene4Band", "REOrthoTile"};/* + double[][][] coords = {{ + { + -1.8230438232421875, + 5.66433079911972 + }, + { + -1.8195247650146482, + 5.66433079911972 + }, + { + -1.8195247650146482, + 5.6671493748802915 + }, + { + -1.8230438232421875, + 5.6671493748802915 + }, + { + -1.8230438232421875, + 5.66433079911972 + } } + }; + */ + + double[][][] coords = {{{148.440013,-5.763688}, {148.440645,-5.763688}, {148.440645,-5.76432}, {148.440013,-5.76432}, {148.440013,-5.763688}}}; + //double[][][] coords = {{{-39.611883, -72.612975}, {-39.611883, -72.611833}, {-39.612765, -72.611833}, {-39.612765, -72.612975}, {-39.611883, -72.612975}}}; + System.out.println( + planet.getAvailableDates( new PlanetRequestParameters(start, end, coords, itemTypes) ) + ); + System.out.println( + planet.getLayerUrl( new PlanetRequestParameters(start, end, coords, itemTypes) ) + ); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } } - - public String[] getItemTypes() { - return item_types; - } - - public void setItemTypes(String[] itemTypes) { - this.item_types = itemTypes; - } - - public Filter getFilter() { - return filter; - } - - public void setFilter(Filter filter) { - this.filter = filter; - } - -} +} \ No newline at end of file From 80f0ef90d7d26edf12f0879c728b36729c654bd5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:15 +0100 Subject: [PATCH 1556/1620] New translations Test.java (English) --- .../earth/app/view/Messages_en.properties | 83 +++++++++++-------- 1 file changed, 50 insertions(+), 33 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 34ef3a1eb1..13502650b2 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,36 +1,53 @@ package org.openforis.collect.earth.planet; -public class SearchRequest{ - - String[] item_types; - Filter filter; - String[] ids; - - public SearchRequest(String[] ids) { - super(); - this.ids = ids; - } - - public SearchRequest(String[] itemTypes, Filter filter) { - super(); - this.item_types = itemTypes; - this.filter = filter; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class Test { + + + public static void main(String[] args) { + try { + PlanetImagery planet = new PlanetImagery( "YOUR API KEY FOR DAILY IMAGERY" ); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + Date start = formatter.parse("2013-01-01"); + Date end = formatter.parse("2013-12-01"); + String[] itemTypes = {"PSScene3Band", "PSScene4Band", "REOrthoTile"};/* + double[][][] coords = {{ + { + -1.8230438232421875, + 5.66433079911972 + }, + { + -1.8195247650146482, + 5.66433079911972 + }, + { + -1.8195247650146482, + 5.6671493748802915 + }, + { + -1.8230438232421875, + 5.6671493748802915 + }, + { + -1.8230438232421875, + 5.66433079911972 + } } + }; + */ + + double[][][] coords = {{{148.440013,-5.763688}, {148.440645,-5.763688}, {148.440645,-5.76432}, {148.440013,-5.76432}, {148.440013,-5.763688}}}; + //double[][][] coords = {{{-39.611883, -72.612975}, {-39.611883, -72.611833}, {-39.612765, -72.611833}, {-39.612765, -72.612975}, {-39.611883, -72.612975}}}; + System.out.println( + planet.getAvailableDates( new PlanetRequestParameters(start, end, coords, itemTypes) ) + ); + System.out.println( + planet.getLayerUrl( new PlanetRequestParameters(start, end, coords, itemTypes) ) + ); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } } - - public String[] getItemTypes() { - return item_types; - } - - public void setItemTypes(String[] itemTypes) { - this.item_types = itemTypes; - } - - public Filter getFilter() { - return filter; - } - - public void setFilter(Filter filter) { - this.filter = filter; - } - -} +} \ No newline at end of file From 397e6a91b61cdfb3afc6f7e5141da377218437b9 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:16 +0100 Subject: [PATCH 1557/1620] New translations AbstractSummariesProxy.java (French) --- .../earth/app/view/Messages_fr.properties | 69 ++++++------------- 1 file changed, 22 insertions(+), 47 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 13502650b2..1bba5b2b7a 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,53 +1,28 @@ -package org.openforis.collect.earth.planet; +package org.openforis.collect.model.proxy; -import java.text.SimpleDateFormat; -import java.util.Date; +import java.util.List; -public class Test { +import org.openforis.collect.Proxy; +import org.openforis.collect.model.AbstractSummaries; +/** + * + * @author S. Ricci + * + */ +public abstract class AbstractSummariesProxy implements Proxy { + + protected AbstractSummaries summaries; - public static void main(String[] args) { - try { - PlanetImagery planet = new PlanetImagery( "YOUR API KEY FOR DAILY IMAGERY" ); - SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); - Date start = formatter.parse("2013-01-01"); - Date end = formatter.parse("2013-12-01"); - String[] itemTypes = {"PSScene3Band", "PSScene4Band", "REOrthoTile"};/* - double[][][] coords = {{ - { - -1.8230438232421875, - 5.66433079911972 - }, - { - -1.8195247650146482, - 5.66433079911972 - }, - { - -1.8195247650146482, - 5.6671493748802915 - }, - { - -1.8230438232421875, - 5.6671493748802915 - }, - { - -1.8230438232421875, - 5.66433079911972 - } } - }; - */ + public AbstractSummariesProxy(AbstractSummaries summaries) { + super(); + this.summaries = summaries; + } - double[][][] coords = {{{148.440013,-5.763688}, {148.440645,-5.763688}, {148.440645,-5.76432}, {148.440013,-5.76432}, {148.440013,-5.763688}}}; - //double[][][] coords = {{{-39.611883, -72.612975}, {-39.611883, -72.611833}, {-39.612765, -72.611833}, {-39.612765, -72.612975}, {-39.611883, -72.612975}}}; - System.out.println( - planet.getAvailableDates( new PlanetRequestParameters(start, end, coords, itemTypes) ) - ); - System.out.println( - planet.getLayerUrl( new PlanetRequestParameters(start, end, coords, itemTypes) ) - ); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + public int getTotalCount() { + return summaries.getTotalCount(); } -} \ No newline at end of file + + public abstract List getRecords(); + +} From 741f5b3160e5751fb7b58222cc41365b775992e8 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:17 +0100 Subject: [PATCH 1558/1620] New translations AbstractSummariesProxy.java (Spanish) --- .../earth/app/view/Messages_es.properties | 69 ++++++------------- 1 file changed, 22 insertions(+), 47 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 13502650b2..1bba5b2b7a 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,53 +1,28 @@ -package org.openforis.collect.earth.planet; +package org.openforis.collect.model.proxy; -import java.text.SimpleDateFormat; -import java.util.Date; +import java.util.List; -public class Test { +import org.openforis.collect.Proxy; +import org.openforis.collect.model.AbstractSummaries; +/** + * + * @author S. Ricci + * + */ +public abstract class AbstractSummariesProxy implements Proxy { + + protected AbstractSummaries summaries; - public static void main(String[] args) { - try { - PlanetImagery planet = new PlanetImagery( "YOUR API KEY FOR DAILY IMAGERY" ); - SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); - Date start = formatter.parse("2013-01-01"); - Date end = formatter.parse("2013-12-01"); - String[] itemTypes = {"PSScene3Band", "PSScene4Band", "REOrthoTile"};/* - double[][][] coords = {{ - { - -1.8230438232421875, - 5.66433079911972 - }, - { - -1.8195247650146482, - 5.66433079911972 - }, - { - -1.8195247650146482, - 5.6671493748802915 - }, - { - -1.8230438232421875, - 5.6671493748802915 - }, - { - -1.8230438232421875, - 5.66433079911972 - } } - }; - */ + public AbstractSummariesProxy(AbstractSummaries summaries) { + super(); + this.summaries = summaries; + } - double[][][] coords = {{{148.440013,-5.763688}, {148.440645,-5.763688}, {148.440645,-5.76432}, {148.440013,-5.76432}, {148.440013,-5.763688}}}; - //double[][][] coords = {{{-39.611883, -72.612975}, {-39.611883, -72.611833}, {-39.612765, -72.611833}, {-39.612765, -72.612975}, {-39.611883, -72.612975}}}; - System.out.println( - planet.getAvailableDates( new PlanetRequestParameters(start, end, coords, itemTypes) ) - ); - System.out.println( - planet.getLayerUrl( new PlanetRequestParameters(start, end, coords, itemTypes) ) - ); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + public int getTotalCount() { + return summaries.getTotalCount(); } -} \ No newline at end of file + + public abstract List getRecords(); + +} From aa2fa19170d9dc847e57c36b5afdc7e0e51a950e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:18 +0100 Subject: [PATCH 1559/1620] New translations AbstractSummariesProxy.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 69 ++++++------------- 1 file changed, 22 insertions(+), 47 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 13502650b2..1bba5b2b7a 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,53 +1,28 @@ -package org.openforis.collect.earth.planet; +package org.openforis.collect.model.proxy; -import java.text.SimpleDateFormat; -import java.util.Date; +import java.util.List; -public class Test { +import org.openforis.collect.Proxy; +import org.openforis.collect.model.AbstractSummaries; +/** + * + * @author S. Ricci + * + */ +public abstract class AbstractSummariesProxy implements Proxy { + + protected AbstractSummaries summaries; - public static void main(String[] args) { - try { - PlanetImagery planet = new PlanetImagery( "YOUR API KEY FOR DAILY IMAGERY" ); - SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); - Date start = formatter.parse("2013-01-01"); - Date end = formatter.parse("2013-12-01"); - String[] itemTypes = {"PSScene3Band", "PSScene4Band", "REOrthoTile"};/* - double[][][] coords = {{ - { - -1.8230438232421875, - 5.66433079911972 - }, - { - -1.8195247650146482, - 5.66433079911972 - }, - { - -1.8195247650146482, - 5.6671493748802915 - }, - { - -1.8230438232421875, - 5.6671493748802915 - }, - { - -1.8230438232421875, - 5.66433079911972 - } } - }; - */ + public AbstractSummariesProxy(AbstractSummaries summaries) { + super(); + this.summaries = summaries; + } - double[][][] coords = {{{148.440013,-5.763688}, {148.440645,-5.763688}, {148.440645,-5.76432}, {148.440013,-5.76432}, {148.440013,-5.763688}}}; - //double[][][] coords = {{{-39.611883, -72.612975}, {-39.611883, -72.611833}, {-39.612765, -72.611833}, {-39.612765, -72.612975}, {-39.611883, -72.612975}}}; - System.out.println( - planet.getAvailableDates( new PlanetRequestParameters(start, end, coords, itemTypes) ) - ); - System.out.println( - planet.getLayerUrl( new PlanetRequestParameters(start, end, coords, itemTypes) ) - ); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + public int getTotalCount() { + return summaries.getTotalCount(); } -} \ No newline at end of file + + public abstract List getRecords(); + +} From 6d1cad8e6b425db89d1166b6ad5468dc99fcc541 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:19 +0100 Subject: [PATCH 1560/1620] New translations AbstractSummariesProxy.java (English) --- .../earth/app/view/Messages_en.properties | 69 ++++++------------- 1 file changed, 22 insertions(+), 47 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 13502650b2..1bba5b2b7a 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,53 +1,28 @@ -package org.openforis.collect.earth.planet; +package org.openforis.collect.model.proxy; -import java.text.SimpleDateFormat; -import java.util.Date; +import java.util.List; -public class Test { +import org.openforis.collect.Proxy; +import org.openforis.collect.model.AbstractSummaries; +/** + * + * @author S. Ricci + * + */ +public abstract class AbstractSummariesProxy implements Proxy { + + protected AbstractSummaries summaries; - public static void main(String[] args) { - try { - PlanetImagery planet = new PlanetImagery( "YOUR API KEY FOR DAILY IMAGERY" ); - SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); - Date start = formatter.parse("2013-01-01"); - Date end = formatter.parse("2013-12-01"); - String[] itemTypes = {"PSScene3Band", "PSScene4Band", "REOrthoTile"};/* - double[][][] coords = {{ - { - -1.8230438232421875, - 5.66433079911972 - }, - { - -1.8195247650146482, - 5.66433079911972 - }, - { - -1.8195247650146482, - 5.6671493748802915 - }, - { - -1.8230438232421875, - 5.6671493748802915 - }, - { - -1.8230438232421875, - 5.66433079911972 - } } - }; - */ + public AbstractSummariesProxy(AbstractSummaries summaries) { + super(); + this.summaries = summaries; + } - double[][][] coords = {{{148.440013,-5.763688}, {148.440645,-5.763688}, {148.440645,-5.76432}, {148.440013,-5.76432}, {148.440013,-5.763688}}}; - //double[][][] coords = {{{-39.611883, -72.612975}, {-39.611883, -72.611833}, {-39.612765, -72.611833}, {-39.612765, -72.612975}, {-39.611883, -72.612975}}}; - System.out.println( - planet.getAvailableDates( new PlanetRequestParameters(start, end, coords, itemTypes) ) - ); - System.out.println( - planet.getLayerUrl( new PlanetRequestParameters(start, end, coords, itemTypes) ) - ); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + public int getTotalCount() { + return summaries.getTotalCount(); } -} \ No newline at end of file + + public abstract List getRecords(); + +} From 6a7881e36900717693423ed093c9d60407825375 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:21 +0100 Subject: [PATCH 1561/1620] New translations EntityProxy.java (Spanish) --- .../earth/app/view/Messages_es.properties | 124 ++++++++++++++++-- 1 file changed, 112 insertions(+), 12 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 1bba5b2b7a..71392d44df 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,28 +1,128 @@ +/** + * + */ package org.openforis.collect.model.proxy; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; -import org.openforis.collect.Proxy; -import org.openforis.collect.model.AbstractSummaries; +import org.openforis.collect.ProxyContext; +import org.openforis.collect.metamodel.ui.UIOptions; +import org.openforis.collect.model.CollectSurvey; +import org.openforis.idm.metamodel.EntityDefinition; +import org.openforis.idm.metamodel.ModelVersion; +import org.openforis.idm.metamodel.NodeDefinition; +import org.openforis.idm.metamodel.validation.ValidationResultFlag; +import org.openforis.idm.model.Entity; +import org.openforis.idm.model.Node; +import org.openforis.idm.model.Record; /** - * + * @author M. Togna * @author S. Ricci - * + * */ -public abstract class AbstractSummariesProxy implements Proxy { +public class EntityProxy extends NodeProxy { + + private Entity entity; + private List availableChildDefinitions; - protected AbstractSummaries summaries; + public EntityProxy(EntityProxy parent, Entity entity, ProxyContext context) { + super(parent, entity, context); + this.entity = entity; + this.availableChildDefinitions = getAvailableChildDefinitions(); + } + + public Map> getChildrenByDefinitionId() { + Map> result = new HashMap>(); + for (NodeDefinition childDefinition : availableChildDefinitions) { + List> nodes = this.entity.getChildren(childDefinition); + List proxies = NodeProxy.fromList(this, nodes, context); + result.put(childDefinition.getId(), proxies); + } + return result; + } + + public List getChildrenRelevance() { + List result = new ArrayList(availableChildDefinitions.size()); + for (NodeDefinition childDefinition : availableChildDefinitions) { + boolean relevant = entity.isRelevant(childDefinition); + result.add(relevant); + } + return result; + } + + public List getChildrenMinCountValidation() { + List result = new ArrayList(availableChildDefinitions.size()); + for (NodeDefinition childDefinition : availableChildDefinitions) { + ValidationResultFlag valid = entity.getMinCountValidationResult(childDefinition); + result.add(valid); + } + return result; + } - public AbstractSummariesProxy(AbstractSummaries summaries) { - super(); - this.summaries = summaries; + public List getChildrenMaxCountValidation() { + List result = new ArrayList(availableChildDefinitions.size()); + for (NodeDefinition childDefinition : availableChildDefinitions) { + ValidationResultFlag valid = entity.getMaxCountValidationResult(childDefinition); + result.add(valid); + } + return result; + } + + public List getChildrenMinCount() { + List result = new ArrayList(availableChildDefinitions.size()); + for (NodeDefinition childDefinition : availableChildDefinitions) { + int count = entity.getMinCount(childDefinition); + result.add(count); + } + return result; } - public int getTotalCount() { - return summaries.getTotalCount(); + public List getChildrenMaxCount() { + List result = new ArrayList(availableChildDefinitions.size()); + for (NodeDefinition childDefinition : availableChildDefinitions) { + Integer count = entity.getMaxCount(childDefinition); + result.add(count); + } + return result; } - public abstract List getRecords(); + public List getChildrenErrorVisible() { + List result = new ArrayList(availableChildDefinitions.size()); + for (int i = 0; i < availableChildDefinitions.size(); i++) { + result.add(Boolean.FALSE); + } + return result; + } + private List getAvailableChildDefinitions() { + List result = new ArrayList(); + UIOptions uiOptions = ((CollectSurvey) entity.getSurvey()).getUIOptions(); + for (NodeDefinition childDefinition : getChildDefinitions()) { + if ( isApplicable(childDefinition) && ! uiOptions.isHidden(childDefinition) ) { + result.add(childDefinition); + } + } + return result; + } + + protected boolean isApplicable(NodeDefinition childDefinition) { + Record record = entity.getRecord(); + ModelVersion version = record.getVersion(); + return version == null || version.isApplicable(childDefinition); + } + + public boolean isEnumerated() { + EntityDefinition definition = entity.getDefinition(); + return definition.isEnumerable(); + } + + private List getChildDefinitions() { + EntityDefinition definition = entity.getDefinition(); + return definition.getChildDefinitions(); + } + } From ab020ed0b882c4a7dcf2e2a5538dbd57533e8d5c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:22 +0100 Subject: [PATCH 1562/1620] New translations EntityProxy.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 124 ++++++++++++++++-- 1 file changed, 112 insertions(+), 12 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 1bba5b2b7a..71392d44df 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,28 +1,128 @@ +/** + * + */ package org.openforis.collect.model.proxy; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; -import org.openforis.collect.Proxy; -import org.openforis.collect.model.AbstractSummaries; +import org.openforis.collect.ProxyContext; +import org.openforis.collect.metamodel.ui.UIOptions; +import org.openforis.collect.model.CollectSurvey; +import org.openforis.idm.metamodel.EntityDefinition; +import org.openforis.idm.metamodel.ModelVersion; +import org.openforis.idm.metamodel.NodeDefinition; +import org.openforis.idm.metamodel.validation.ValidationResultFlag; +import org.openforis.idm.model.Entity; +import org.openforis.idm.model.Node; +import org.openforis.idm.model.Record; /** - * + * @author M. Togna * @author S. Ricci - * + * */ -public abstract class AbstractSummariesProxy implements Proxy { +public class EntityProxy extends NodeProxy { + + private Entity entity; + private List availableChildDefinitions; - protected AbstractSummaries summaries; + public EntityProxy(EntityProxy parent, Entity entity, ProxyContext context) { + super(parent, entity, context); + this.entity = entity; + this.availableChildDefinitions = getAvailableChildDefinitions(); + } + + public Map> getChildrenByDefinitionId() { + Map> result = new HashMap>(); + for (NodeDefinition childDefinition : availableChildDefinitions) { + List> nodes = this.entity.getChildren(childDefinition); + List proxies = NodeProxy.fromList(this, nodes, context); + result.put(childDefinition.getId(), proxies); + } + return result; + } + + public List getChildrenRelevance() { + List result = new ArrayList(availableChildDefinitions.size()); + for (NodeDefinition childDefinition : availableChildDefinitions) { + boolean relevant = entity.isRelevant(childDefinition); + result.add(relevant); + } + return result; + } + + public List getChildrenMinCountValidation() { + List result = new ArrayList(availableChildDefinitions.size()); + for (NodeDefinition childDefinition : availableChildDefinitions) { + ValidationResultFlag valid = entity.getMinCountValidationResult(childDefinition); + result.add(valid); + } + return result; + } - public AbstractSummariesProxy(AbstractSummaries summaries) { - super(); - this.summaries = summaries; + public List getChildrenMaxCountValidation() { + List result = new ArrayList(availableChildDefinitions.size()); + for (NodeDefinition childDefinition : availableChildDefinitions) { + ValidationResultFlag valid = entity.getMaxCountValidationResult(childDefinition); + result.add(valid); + } + return result; + } + + public List getChildrenMinCount() { + List result = new ArrayList(availableChildDefinitions.size()); + for (NodeDefinition childDefinition : availableChildDefinitions) { + int count = entity.getMinCount(childDefinition); + result.add(count); + } + return result; } - public int getTotalCount() { - return summaries.getTotalCount(); + public List getChildrenMaxCount() { + List result = new ArrayList(availableChildDefinitions.size()); + for (NodeDefinition childDefinition : availableChildDefinitions) { + Integer count = entity.getMaxCount(childDefinition); + result.add(count); + } + return result; } - public abstract List getRecords(); + public List getChildrenErrorVisible() { + List result = new ArrayList(availableChildDefinitions.size()); + for (int i = 0; i < availableChildDefinitions.size(); i++) { + result.add(Boolean.FALSE); + } + return result; + } + private List getAvailableChildDefinitions() { + List result = new ArrayList(); + UIOptions uiOptions = ((CollectSurvey) entity.getSurvey()).getUIOptions(); + for (NodeDefinition childDefinition : getChildDefinitions()) { + if ( isApplicable(childDefinition) && ! uiOptions.isHidden(childDefinition) ) { + result.add(childDefinition); + } + } + return result; + } + + protected boolean isApplicable(NodeDefinition childDefinition) { + Record record = entity.getRecord(); + ModelVersion version = record.getVersion(); + return version == null || version.isApplicable(childDefinition); + } + + public boolean isEnumerated() { + EntityDefinition definition = entity.getDefinition(); + return definition.isEnumerable(); + } + + private List getChildDefinitions() { + EntityDefinition definition = entity.getDefinition(); + return definition.getChildDefinitions(); + } + } From fdfbbadcc3ca0ee9e26a06b320714f74d7f3b773 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:23 +0100 Subject: [PATCH 1563/1620] New translations TaxonomyProxy.java (English) --- .../earth/app/view/Messages_en.properties | 70 ++++++++++++++++--- 1 file changed, 61 insertions(+), 9 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 1bba5b2b7a..1f0698c58a 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,28 +1,80 @@ package org.openforis.collect.model.proxy; +import java.util.ArrayList; import java.util.List; import org.openforis.collect.Proxy; -import org.openforis.collect.model.AbstractSummaries; +import org.openforis.collect.model.CollectTaxonomy; /** * * @author S. Ricci * */ -public abstract class AbstractSummariesProxy implements Proxy { - - protected AbstractSummaries summaries; +public class TaxonomyProxy implements Proxy { - public AbstractSummariesProxy(AbstractSummaries summaries) { + private Integer id; + private String name; + private String uri; + private Integer surveyId; + + public TaxonomyProxy() { + } + + public TaxonomyProxy(CollectTaxonomy taxonomy) { super(); - this.summaries = summaries; + id = taxonomy.getId(); + name = taxonomy.getName(); + uri = taxonomy.getUri(); + surveyId = taxonomy.getSurveyId(); + } + + public static List fromList(List list) { + List proxies = new ArrayList<>(); + if (list != null) { + for (CollectTaxonomy item : list) { + proxies.add(new TaxonomyProxy(item)); + } + } + return proxies; + } + + public void copyPropertiesForUpdate(CollectTaxonomy taxonomy) { + taxonomy.setName(name); + taxonomy.setUri(uri); + taxonomy.setSurveyId(surveyId); } - public int getTotalCount() { - return summaries.getTotalCount(); + public Integer getId() { + return id; } - public abstract List getRecords(); + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getUri() { + return uri; + } + + public void setUri(String uri) { + this.uri = uri; + } + + public Integer getSurveyId() { + return surveyId; + } + + public void setSurveyId(Integer surveyId) { + this.surveyId = surveyId; + } } From a39ff9a03997d2191e47cf456331e08384bc0468 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:24 +0100 Subject: [PATCH 1564/1620] New translations RecordProxy.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 218 +++++++++++------- 1 file changed, 133 insertions(+), 85 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 71392d44df..af82dc31fd 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -4,125 +4,173 @@ package org.openforis.collect.model.proxy; import java.util.ArrayList; -import java.util.HashMap; +import java.util.Date; import java.util.List; -import java.util.Map; +import org.openforis.collect.Proxy; import org.openforis.collect.ProxyContext; -import org.openforis.collect.metamodel.ui.UIOptions; -import org.openforis.collect.model.CollectSurvey; -import org.openforis.idm.metamodel.EntityDefinition; -import org.openforis.idm.metamodel.ModelVersion; -import org.openforis.idm.metamodel.NodeDefinition; -import org.openforis.idm.metamodel.validation.ValidationResultFlag; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.State; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.User; import org.openforis.idm.model.Entity; -import org.openforis.idm.model.Node; -import org.openforis.idm.model.Record; /** * @author M. Togna * @author S. Ricci * */ -public class EntityProxy extends NodeProxy { +public class RecordProxy implements Proxy { - private Entity entity; - private List availableChildDefinitions; + private CollectRecord record; + private ProxyContext context; + + private Integer errors; + private Integer skipped; + private Integer missing; + private Integer missingErrors; + private Integer missingWarnings; + private Integer warnings; + private UserProxy owner; - public EntityProxy(EntityProxy parent, Entity entity, ProxyContext context) { - super(parent, entity, context); - this.entity = entity; - this.availableChildDefinitions = getAvailableChildDefinitions(); - } - - public Map> getChildrenByDefinitionId() { - Map> result = new HashMap>(); - for (NodeDefinition childDefinition : availableChildDefinitions) { - List> nodes = this.entity.getChildren(childDefinition); - List proxies = NodeProxy.fromList(this, nodes, context); - result.put(childDefinition.getId(), proxies); - } - return result; + public RecordProxy(CollectRecord record, ProxyContext context) { + this.record = record; + this.context = context; + + errors = record.getErrors(); + skipped = record.getSkipped(); + missing = record.getMissing(); + missingErrors = record.getMissingErrors(); + missingWarnings = record.getMissingWarnings(); + warnings = record.getWarnings(); + owner = record.getOwner() == null ? null: new UserProxy(record.getOwner()); } - public List getChildrenRelevance() { - List result = new ArrayList(availableChildDefinitions.size()); - for (NodeDefinition childDefinition : availableChildDefinitions) { - boolean relevant = entity.isRelevant(childDefinition); - result.add(relevant); + public static List fromList(List records, ProxyContext context) { + List result = new ArrayList<>(); + if ( records != null ) { + for (CollectRecord collectRecord : records) { + result.add(new RecordProxy(collectRecord, context)); + } } return result; } + + public Step getStep() { + return record.getStep(); + } - public List getChildrenMinCountValidation() { - List result = new ArrayList(availableChildDefinitions.size()); - for (NodeDefinition childDefinition : availableChildDefinitions) { - ValidationResultFlag valid = entity.getMinCountValidationResult(childDefinition); - result.add(valid); - } - return result; + public State getState() { + return record.getState(); } - public List getChildrenMaxCountValidation() { - List result = new ArrayList(availableChildDefinitions.size()); - for (NodeDefinition childDefinition : availableChildDefinitions) { - ValidationResultFlag valid = entity.getMaxCountValidationResult(childDefinition); - result.add(valid); - } - return result; + public Date getCreationDate() { + return record.getCreationDate(); + } + + public UserProxy getCreatedBy() { + User createdBy = record.getCreatedBy(); + return createdBy == null ? null: new UserProxy(createdBy); + } + + public Date getModifiedDate() { + return record.getModifiedDate(); + } + + public Integer getId() { + return record.getId(); + } + + public UserProxy getModifiedBy() { + User modifiedBy = record.getModifiedBy(); + return modifiedBy == null ? null: new UserProxy(modifiedBy); } - public List getChildrenMinCount() { - List result = new ArrayList(availableChildDefinitions.size()); - for (NodeDefinition childDefinition : availableChildDefinitions) { - int count = entity.getMinCount(childDefinition); - result.add(count); - } - return result; + public EntityProxy getRootEntity() { + Entity rootEntity = record.getRootEntity(); + return rootEntity == null ? null: new EntityProxy(null, record.getRootEntity(), context); } - public List getChildrenMaxCount() { - List result = new ArrayList(availableChildDefinitions.size()); - for (NodeDefinition childDefinition : availableChildDefinitions) { - Integer count = entity.getMaxCount(childDefinition); - result.add(count); - } - return result; + public List getRootEntityKeys() { + return record.getRootEntityKeyValues(); } - public List getChildrenErrorVisible() { - List result = new ArrayList(availableChildDefinitions.size()); - for (int i = 0; i < availableChildDefinitions.size(); i++) { - result.add(Boolean.FALSE); - } - return result; + public List getEntityCounts() { + return record.getEntityCounts(); } - private List getAvailableChildDefinitions() { - List result = new ArrayList(); - UIOptions uiOptions = ((CollectSurvey) entity.getSurvey()).getUIOptions(); - for (NodeDefinition childDefinition : getChildDefinitions()) { - if ( isApplicable(childDefinition) && ! uiOptions.isHidden(childDefinition) ) { - result.add(childDefinition); + public boolean isEntryComplete() { + if(record.getStep() != null) { + switch(record.getStep()) { + case ENTRY: + return false; + case CLEANSING: + case ANALYSIS: + return true; } } - return result; + return false; } - protected boolean isApplicable(NodeDefinition childDefinition) { - Record record = entity.getRecord(); - ModelVersion version = record.getVersion(); - return version == null || version.isApplicable(childDefinition); + public boolean isCleansingComplete() { + return ( + record.getStep() != null && record.getStep().equals( Step.ANALYSIS) + ); } - - public boolean isEnumerated() { - EntityDefinition definition = entity.getDefinition(); - return definition.isEnumerable(); + + public Integer getErrors() { + return errors; } - - private List getChildDefinitions() { - EntityDefinition definition = entity.getDefinition(); - return definition.getChildDefinitions(); + + public void setErrors(Integer errors) { + this.errors = errors; + } + + public Integer getSkipped() { + return skipped; + } + + public void setSkipped(Integer skipped) { + this.skipped = skipped; + } + + public Integer getMissing() { + return missing; + } + + public void setMissing(Integer missing) { + this.missing = missing; + } + + public Integer getWarnings() { + return warnings; + } + + public void setWarnings(Integer warnings) { + this.warnings = warnings; + } + + public Integer getMissingErrors() { + return missingErrors; + } + + public void setMissingErrors(Integer missingErrors) { + this.missingErrors = missingErrors; + } + + public Integer getMissingWarnings() { + return missingWarnings; + } + + public void setMissingWarnings(Integer missingWarnings) { + this.missingWarnings = missingWarnings; + } + + public UserProxy getOwner() { + return owner; } + public void setOwner(UserProxy owner) { + this.owner = owner; + } } From 84e8dd56a246feb59f353bd88bdbaf1dfdef7f76 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:25 +0100 Subject: [PATCH 1565/1620] New translations RecordProxy.java (English) --- .../earth/app/view/Messages_en.properties | 178 ++++++++++++++---- 1 file changed, 137 insertions(+), 41 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 1f0698c58a..af82dc31fd 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,80 +1,176 @@ +/** + * + */ package org.openforis.collect.model.proxy; import java.util.ArrayList; +import java.util.Date; import java.util.List; import org.openforis.collect.Proxy; -import org.openforis.collect.model.CollectTaxonomy; +import org.openforis.collect.ProxyContext; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.State; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.User; +import org.openforis.idm.model.Entity; /** - * + * @author M. Togna * @author S. Ricci - * + * */ -public class TaxonomyProxy implements Proxy { +public class RecordProxy implements Proxy { + + private CollectRecord record; + private ProxyContext context; - private Integer id; - private String name; - private String uri; - private Integer surveyId; + private Integer errors; + private Integer skipped; + private Integer missing; + private Integer missingErrors; + private Integer missingWarnings; + private Integer warnings; + private UserProxy owner; - public TaxonomyProxy() { + public RecordProxy(CollectRecord record, ProxyContext context) { + this.record = record; + this.context = context; + + errors = record.getErrors(); + skipped = record.getSkipped(); + missing = record.getMissing(); + missingErrors = record.getMissingErrors(); + missingWarnings = record.getMissingWarnings(); + warnings = record.getWarnings(); + owner = record.getOwner() == null ? null: new UserProxy(record.getOwner()); + } + + public static List fromList(List records, ProxyContext context) { + List result = new ArrayList<>(); + if ( records != null ) { + for (CollectRecord collectRecord : records) { + result.add(new RecordProxy(collectRecord, context)); + } + } + return result; } - public TaxonomyProxy(CollectTaxonomy taxonomy) { - super(); - id = taxonomy.getId(); - name = taxonomy.getName(); - uri = taxonomy.getUri(); - surveyId = taxonomy.getSurveyId(); + public Step getStep() { + return record.getStep(); + } + + public State getState() { + return record.getState(); + } + + public Date getCreationDate() { + return record.getCreationDate(); + } + + public UserProxy getCreatedBy() { + User createdBy = record.getCreatedBy(); + return createdBy == null ? null: new UserProxy(createdBy); + } + + public Date getModifiedDate() { + return record.getModifiedDate(); + } + + public Integer getId() { + return record.getId(); + } + + public UserProxy getModifiedBy() { + User modifiedBy = record.getModifiedBy(); + return modifiedBy == null ? null: new UserProxy(modifiedBy); } - public static List fromList(List list) { - List proxies = new ArrayList<>(); - if (list != null) { - for (CollectTaxonomy item : list) { - proxies.add(new TaxonomyProxy(item)); + public EntityProxy getRootEntity() { + Entity rootEntity = record.getRootEntity(); + return rootEntity == null ? null: new EntityProxy(null, record.getRootEntity(), context); + } + + public List getRootEntityKeys() { + return record.getRootEntityKeyValues(); + } + + public List getEntityCounts() { + return record.getEntityCounts(); + } + + public boolean isEntryComplete() { + if(record.getStep() != null) { + switch(record.getStep()) { + case ENTRY: + return false; + case CLEANSING: + case ANALYSIS: + return true; } } - return proxies; + return false; } - public void copyPropertiesForUpdate(CollectTaxonomy taxonomy) { - taxonomy.setName(name); - taxonomy.setUri(uri); - taxonomy.setSurveyId(surveyId); + public boolean isCleansingComplete() { + return ( + record.getStep() != null && record.getStep().equals( Step.ANALYSIS) + ); } - public Integer getId() { - return id; + public Integer getErrors() { + return errors; + } + + public void setErrors(Integer errors) { + this.errors = errors; + } + + public Integer getSkipped() { + return skipped; + } + + public void setSkipped(Integer skipped) { + this.skipped = skipped; } - public void setId(Integer id) { - this.id = id; + public Integer getMissing() { + return missing; } - public String getName() { - return name; + public void setMissing(Integer missing) { + this.missing = missing; } - public void setName(String name) { - this.name = name; + public Integer getWarnings() { + return warnings; } - public String getUri() { - return uri; + public void setWarnings(Integer warnings) { + this.warnings = warnings; } - public void setUri(String uri) { - this.uri = uri; + public Integer getMissingErrors() { + return missingErrors; } - public Integer getSurveyId() { - return surveyId; + public void setMissingErrors(Integer missingErrors) { + this.missingErrors = missingErrors; } - public void setSurveyId(Integer surveyId) { - this.surveyId = surveyId; + public Integer getMissingWarnings() { + return missingWarnings; } + public void setMissingWarnings(Integer missingWarnings) { + this.missingWarnings = missingWarnings; + } + + public UserProxy getOwner() { + return owner; + } + + public void setOwner(UserProxy owner) { + this.owner = owner; + } } From c7cbba2016828fd37238cf5dc4c3d833929f4d47 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:26 +0100 Subject: [PATCH 1566/1620] New translations TaxonOccurrenceProxy.java (French) --- .../earth/app/view/Messages_fr.properties | 47 +++++++++++++++---- 1 file changed, 37 insertions(+), 10 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 1bba5b2b7a..a6fb237683 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,28 +1,55 @@ +/** + * + */ package org.openforis.collect.model.proxy; +import java.util.ArrayList; import java.util.List; import org.openforis.collect.Proxy; -import org.openforis.collect.model.AbstractSummaries; +import org.openforis.idm.model.TaxonOccurrence; /** - * * @author S. Ricci * */ -public abstract class AbstractSummariesProxy implements Proxy { - - protected AbstractSummaries summaries; +public class TaxonOccurrenceProxy implements Proxy { + + private TaxonOccurrence occurrence; - public AbstractSummariesProxy(AbstractSummaries summaries) { + public TaxonOccurrenceProxy(TaxonOccurrence occurence) { super(); - this.summaries = summaries; + this.occurrence = occurence; + } + + public static List fromList(List list) { + List proxies = new ArrayList<>(); + if (list != null) { + for (TaxonOccurrence item : list) { + proxies.add(new TaxonOccurrenceProxy(item)); + } + } + return proxies; } - public int getTotalCount() { - return summaries.getTotalCount(); + public String getCode() { + return occurrence.getCode(); } - public abstract List getRecords(); + public String getScientificName() { + return occurrence.getScientificName(); + } + + public String getVernacularName() { + return occurrence.getVernacularName(); + } + public String getLanguageCode() { + return occurrence.getLanguageCode(); + } + + public String getLanguageVariety() { + return occurrence.getLanguageVariety(); + } + } From f1d4bc74aaf4a4c78239810238418891877be679 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:28 +0100 Subject: [PATCH 1567/1620] New translations TaxonOccurrenceProxy.java (Spanish) --- .../earth/app/view/Messages_es.properties | 125 ++++-------------- 1 file changed, 26 insertions(+), 99 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 71392d44df..a6fb237683 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -4,125 +4,52 @@ package org.openforis.collect.model.proxy; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import org.openforis.collect.ProxyContext; -import org.openforis.collect.metamodel.ui.UIOptions; -import org.openforis.collect.model.CollectSurvey; -import org.openforis.idm.metamodel.EntityDefinition; -import org.openforis.idm.metamodel.ModelVersion; -import org.openforis.idm.metamodel.NodeDefinition; -import org.openforis.idm.metamodel.validation.ValidationResultFlag; -import org.openforis.idm.model.Entity; -import org.openforis.idm.model.Node; -import org.openforis.idm.model.Record; +import org.openforis.collect.Proxy; +import org.openforis.idm.model.TaxonOccurrence; /** - * @author M. Togna * @author S. Ricci - * + * */ -public class EntityProxy extends NodeProxy { +public class TaxonOccurrenceProxy implements Proxy { - private Entity entity; - private List availableChildDefinitions; - - public EntityProxy(EntityProxy parent, Entity entity, ProxyContext context) { - super(parent, entity, context); - this.entity = entity; - this.availableChildDefinitions = getAvailableChildDefinitions(); - } + private TaxonOccurrence occurrence; - public Map> getChildrenByDefinitionId() { - Map> result = new HashMap>(); - for (NodeDefinition childDefinition : availableChildDefinitions) { - List> nodes = this.entity.getChildren(childDefinition); - List proxies = NodeProxy.fromList(this, nodes, context); - result.put(childDefinition.getId(), proxies); - } - return result; + public TaxonOccurrenceProxy(TaxonOccurrence occurence) { + super(); + this.occurrence = occurence; } - - public List getChildrenRelevance() { - List result = new ArrayList(availableChildDefinitions.size()); - for (NodeDefinition childDefinition : availableChildDefinitions) { - boolean relevant = entity.isRelevant(childDefinition); - result.add(relevant); + + public static List fromList(List list) { + List proxies = new ArrayList<>(); + if (list != null) { + for (TaxonOccurrence item : list) { + proxies.add(new TaxonOccurrenceProxy(item)); + } } - return result; + return proxies; } - public List getChildrenMinCountValidation() { - List result = new ArrayList(availableChildDefinitions.size()); - for (NodeDefinition childDefinition : availableChildDefinitions) { - ValidationResultFlag valid = entity.getMinCountValidationResult(childDefinition); - result.add(valid); - } - return result; + public String getCode() { + return occurrence.getCode(); } - public List getChildrenMaxCountValidation() { - List result = new ArrayList(availableChildDefinitions.size()); - for (NodeDefinition childDefinition : availableChildDefinitions) { - ValidationResultFlag valid = entity.getMaxCountValidationResult(childDefinition); - result.add(valid); - } - return result; - } - - public List getChildrenMinCount() { - List result = new ArrayList(availableChildDefinitions.size()); - for (NodeDefinition childDefinition : availableChildDefinitions) { - int count = entity.getMinCount(childDefinition); - result.add(count); - } - return result; + public String getScientificName() { + return occurrence.getScientificName(); } - public List getChildrenMaxCount() { - List result = new ArrayList(availableChildDefinitions.size()); - for (NodeDefinition childDefinition : availableChildDefinitions) { - Integer count = entity.getMaxCount(childDefinition); - result.add(count); - } - return result; + public String getVernacularName() { + return occurrence.getVernacularName(); } - public List getChildrenErrorVisible() { - List result = new ArrayList(availableChildDefinitions.size()); - for (int i = 0; i < availableChildDefinitions.size(); i++) { - result.add(Boolean.FALSE); - } - return result; + public String getLanguageCode() { + return occurrence.getLanguageCode(); } - private List getAvailableChildDefinitions() { - List result = new ArrayList(); - UIOptions uiOptions = ((CollectSurvey) entity.getSurvey()).getUIOptions(); - for (NodeDefinition childDefinition : getChildDefinitions()) { - if ( isApplicable(childDefinition) && ! uiOptions.isHidden(childDefinition) ) { - result.add(childDefinition); - } - } - return result; - } - - protected boolean isApplicable(NodeDefinition childDefinition) { - Record record = entity.getRecord(); - ModelVersion version = record.getVersion(); - return version == null || version.isApplicable(childDefinition); - } - - public boolean isEnumerated() { - EntityDefinition definition = entity.getDefinition(); - return definition.isEnumerable(); - } - - private List getChildDefinitions() { - EntityDefinition definition = entity.getDefinition(); - return definition.getChildDefinitions(); + public String getLanguageVariety() { + return occurrence.getLanguageVariety(); } } From 86db7c911030819b99e1eb85110a2d6b59ae3318 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:29 +0100 Subject: [PATCH 1568/1620] New translations TaxonOccurrenceProxy.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 167 +++--------------- 1 file changed, 23 insertions(+), 144 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index af82dc31fd..a6fb237683 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -4,173 +4,52 @@ package org.openforis.collect.model.proxy; import java.util.ArrayList; -import java.util.Date; import java.util.List; import org.openforis.collect.Proxy; -import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.State; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.User; -import org.openforis.idm.model.Entity; +import org.openforis.idm.model.TaxonOccurrence; /** - * @author M. Togna * @author S. Ricci - * + * */ -public class RecordProxy implements Proxy { - - private CollectRecord record; - private ProxyContext context; +public class TaxonOccurrenceProxy implements Proxy { - private Integer errors; - private Integer skipped; - private Integer missing; - private Integer missingErrors; - private Integer missingWarnings; - private Integer warnings; - private UserProxy owner; - - public RecordProxy(CollectRecord record, ProxyContext context) { - this.record = record; - this.context = context; - - errors = record.getErrors(); - skipped = record.getSkipped(); - missing = record.getMissing(); - missingErrors = record.getMissingErrors(); - missingWarnings = record.getMissingWarnings(); - warnings = record.getWarnings(); - owner = record.getOwner() == null ? null: new UserProxy(record.getOwner()); - } + private TaxonOccurrence occurrence; - public static List fromList(List records, ProxyContext context) { - List result = new ArrayList<>(); - if ( records != null ) { - for (CollectRecord collectRecord : records) { - result.add(new RecordProxy(collectRecord, context)); - } - } - return result; + public TaxonOccurrenceProxy(TaxonOccurrence occurence) { + super(); + this.occurrence = occurence; } - public Step getStep() { - return record.getStep(); - } - - public State getState() { - return record.getState(); - } - - public Date getCreationDate() { - return record.getCreationDate(); - } - - public UserProxy getCreatedBy() { - User createdBy = record.getCreatedBy(); - return createdBy == null ? null: new UserProxy(createdBy); - } - - public Date getModifiedDate() { - return record.getModifiedDate(); - } - - public Integer getId() { - return record.getId(); - } - - public UserProxy getModifiedBy() { - User modifiedBy = record.getModifiedBy(); - return modifiedBy == null ? null: new UserProxy(modifiedBy); - } - - public EntityProxy getRootEntity() { - Entity rootEntity = record.getRootEntity(); - return rootEntity == null ? null: new EntityProxy(null, record.getRootEntity(), context); - } - - public List getRootEntityKeys() { - return record.getRootEntityKeyValues(); - } - - public List getEntityCounts() { - return record.getEntityCounts(); - } - - public boolean isEntryComplete() { - if(record.getStep() != null) { - switch(record.getStep()) { - case ENTRY: - return false; - case CLEANSING: - case ANALYSIS: - return true; + public static List fromList(List list) { + List proxies = new ArrayList<>(); + if (list != null) { + for (TaxonOccurrence item : list) { + proxies.add(new TaxonOccurrenceProxy(item)); } } - return false; - } - - public boolean isCleansingComplete() { - return ( - record.getStep() != null && record.getStep().equals( Step.ANALYSIS) - ); - } - - public Integer getErrors() { - return errors; - } - - public void setErrors(Integer errors) { - this.errors = errors; - } - - public Integer getSkipped() { - return skipped; + return proxies; } - public void setSkipped(Integer skipped) { - this.skipped = skipped; + public String getCode() { + return occurrence.getCode(); } - public Integer getMissing() { - return missing; + public String getScientificName() { + return occurrence.getScientificName(); } - public void setMissing(Integer missing) { - this.missing = missing; + public String getVernacularName() { + return occurrence.getVernacularName(); } - public Integer getWarnings() { - return warnings; + public String getLanguageCode() { + return occurrence.getLanguageCode(); } - public void setWarnings(Integer warnings) { - this.warnings = warnings; - } - - public Integer getMissingErrors() { - return missingErrors; - } - - public void setMissingErrors(Integer missingErrors) { - this.missingErrors = missingErrors; - } - - public Integer getMissingWarnings() { - return missingWarnings; - } - - public void setMissingWarnings(Integer missingWarnings) { - this.missingWarnings = missingWarnings; - } - - public UserProxy getOwner() { - return owner; + public String getLanguageVariety() { + return occurrence.getLanguageVariety(); } - public void setOwner(UserProxy owner) { - this.owner = owner; - } } From 885c4bd92e0b75e9f5f09e4ea261bad9b06c1f44 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:30 +0100 Subject: [PATCH 1569/1620] New translations TaxonOccurrenceProxy.java (English) --- .../earth/app/view/Messages_en.properties | 167 +++--------------- 1 file changed, 23 insertions(+), 144 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index af82dc31fd..a6fb237683 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -4,173 +4,52 @@ package org.openforis.collect.model.proxy; import java.util.ArrayList; -import java.util.Date; import java.util.List; import org.openforis.collect.Proxy; -import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.State; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.User; -import org.openforis.idm.model.Entity; +import org.openforis.idm.model.TaxonOccurrence; /** - * @author M. Togna * @author S. Ricci - * + * */ -public class RecordProxy implements Proxy { - - private CollectRecord record; - private ProxyContext context; +public class TaxonOccurrenceProxy implements Proxy { - private Integer errors; - private Integer skipped; - private Integer missing; - private Integer missingErrors; - private Integer missingWarnings; - private Integer warnings; - private UserProxy owner; - - public RecordProxy(CollectRecord record, ProxyContext context) { - this.record = record; - this.context = context; - - errors = record.getErrors(); - skipped = record.getSkipped(); - missing = record.getMissing(); - missingErrors = record.getMissingErrors(); - missingWarnings = record.getMissingWarnings(); - warnings = record.getWarnings(); - owner = record.getOwner() == null ? null: new UserProxy(record.getOwner()); - } + private TaxonOccurrence occurrence; - public static List fromList(List records, ProxyContext context) { - List result = new ArrayList<>(); - if ( records != null ) { - for (CollectRecord collectRecord : records) { - result.add(new RecordProxy(collectRecord, context)); - } - } - return result; + public TaxonOccurrenceProxy(TaxonOccurrence occurence) { + super(); + this.occurrence = occurence; } - public Step getStep() { - return record.getStep(); - } - - public State getState() { - return record.getState(); - } - - public Date getCreationDate() { - return record.getCreationDate(); - } - - public UserProxy getCreatedBy() { - User createdBy = record.getCreatedBy(); - return createdBy == null ? null: new UserProxy(createdBy); - } - - public Date getModifiedDate() { - return record.getModifiedDate(); - } - - public Integer getId() { - return record.getId(); - } - - public UserProxy getModifiedBy() { - User modifiedBy = record.getModifiedBy(); - return modifiedBy == null ? null: new UserProxy(modifiedBy); - } - - public EntityProxy getRootEntity() { - Entity rootEntity = record.getRootEntity(); - return rootEntity == null ? null: new EntityProxy(null, record.getRootEntity(), context); - } - - public List getRootEntityKeys() { - return record.getRootEntityKeyValues(); - } - - public List getEntityCounts() { - return record.getEntityCounts(); - } - - public boolean isEntryComplete() { - if(record.getStep() != null) { - switch(record.getStep()) { - case ENTRY: - return false; - case CLEANSING: - case ANALYSIS: - return true; + public static List fromList(List list) { + List proxies = new ArrayList<>(); + if (list != null) { + for (TaxonOccurrence item : list) { + proxies.add(new TaxonOccurrenceProxy(item)); } } - return false; - } - - public boolean isCleansingComplete() { - return ( - record.getStep() != null && record.getStep().equals( Step.ANALYSIS) - ); - } - - public Integer getErrors() { - return errors; - } - - public void setErrors(Integer errors) { - this.errors = errors; - } - - public Integer getSkipped() { - return skipped; + return proxies; } - public void setSkipped(Integer skipped) { - this.skipped = skipped; + public String getCode() { + return occurrence.getCode(); } - public Integer getMissing() { - return missing; + public String getScientificName() { + return occurrence.getScientificName(); } - public void setMissing(Integer missing) { - this.missing = missing; + public String getVernacularName() { + return occurrence.getVernacularName(); } - public Integer getWarnings() { - return warnings; + public String getLanguageCode() { + return occurrence.getLanguageCode(); } - public void setWarnings(Integer warnings) { - this.warnings = warnings; - } - - public Integer getMissingErrors() { - return missingErrors; - } - - public void setMissingErrors(Integer missingErrors) { - this.missingErrors = missingErrors; - } - - public Integer getMissingWarnings() { - return missingWarnings; - } - - public void setMissingWarnings(Integer missingWarnings) { - this.missingWarnings = missingWarnings; - } - - public UserProxy getOwner() { - return owner; + public String getLanguageVariety() { + return occurrence.getLanguageVariety(); } - public void setOwner(UserProxy owner) { - this.owner = owner; - } } From a2f78a3800a188b81c3aa995d5e0d8427e48a587 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:31 +0100 Subject: [PATCH 1570/1620] New translations TaxonomyProxy.java (French) --- .../earth/app/view/Messages_fr.properties | 73 +++++++++++++------ 1 file changed, 49 insertions(+), 24 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index a6fb237683..1f0698c58a 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,55 +1,80 @@ -/** - * - */ package org.openforis.collect.model.proxy; import java.util.ArrayList; import java.util.List; import org.openforis.collect.Proxy; -import org.openforis.idm.model.TaxonOccurrence; +import org.openforis.collect.model.CollectTaxonomy; /** + * * @author S. Ricci * */ -public class TaxonOccurrenceProxy implements Proxy { - - private TaxonOccurrence occurrence; +public class TaxonomyProxy implements Proxy { - public TaxonOccurrenceProxy(TaxonOccurrence occurence) { + private Integer id; + private String name; + private String uri; + private Integer surveyId; + + public TaxonomyProxy() { + } + + public TaxonomyProxy(CollectTaxonomy taxonomy) { super(); - this.occurrence = occurence; + id = taxonomy.getId(); + name = taxonomy.getName(); + uri = taxonomy.getUri(); + surveyId = taxonomy.getSurveyId(); } - public static List fromList(List list) { - List proxies = new ArrayList<>(); + public static List fromList(List list) { + List proxies = new ArrayList<>(); if (list != null) { - for (TaxonOccurrence item : list) { - proxies.add(new TaxonOccurrenceProxy(item)); + for (CollectTaxonomy item : list) { + proxies.add(new TaxonomyProxy(item)); } } return proxies; } + + public void copyPropertiesForUpdate(CollectTaxonomy taxonomy) { + taxonomy.setName(name); + taxonomy.setUri(uri); + taxonomy.setSurveyId(surveyId); + } - public String getCode() { - return occurrence.getCode(); + public Integer getId() { + return id; } - public String getScientificName() { - return occurrence.getScientificName(); + public void setId(Integer id) { + this.id = id; } - public String getVernacularName() { - return occurrence.getVernacularName(); + public String getName() { + return name; } - public String getLanguageCode() { - return occurrence.getLanguageCode(); + public void setName(String name) { + this.name = name; } - public String getLanguageVariety() { - return occurrence.getLanguageVariety(); + public String getUri() { + return uri; } - + + public void setUri(String uri) { + this.uri = uri; + } + + public Integer getSurveyId() { + return surveyId; + } + + public void setSurveyId(Integer surveyId) { + this.surveyId = surveyId; + } + } From 28520157041ef59ea9c6c0d941529f9b6248d3b5 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:32 +0100 Subject: [PATCH 1571/1620] New translations TaxonomyProxy.java (Spanish) --- .../earth/app/view/Messages_es.properties | 73 +++++++++++++------ 1 file changed, 49 insertions(+), 24 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index a6fb237683..1f0698c58a 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,55 +1,80 @@ -/** - * - */ package org.openforis.collect.model.proxy; import java.util.ArrayList; import java.util.List; import org.openforis.collect.Proxy; -import org.openforis.idm.model.TaxonOccurrence; +import org.openforis.collect.model.CollectTaxonomy; /** + * * @author S. Ricci * */ -public class TaxonOccurrenceProxy implements Proxy { - - private TaxonOccurrence occurrence; +public class TaxonomyProxy implements Proxy { - public TaxonOccurrenceProxy(TaxonOccurrence occurence) { + private Integer id; + private String name; + private String uri; + private Integer surveyId; + + public TaxonomyProxy() { + } + + public TaxonomyProxy(CollectTaxonomy taxonomy) { super(); - this.occurrence = occurence; + id = taxonomy.getId(); + name = taxonomy.getName(); + uri = taxonomy.getUri(); + surveyId = taxonomy.getSurveyId(); } - public static List fromList(List list) { - List proxies = new ArrayList<>(); + public static List fromList(List list) { + List proxies = new ArrayList<>(); if (list != null) { - for (TaxonOccurrence item : list) { - proxies.add(new TaxonOccurrenceProxy(item)); + for (CollectTaxonomy item : list) { + proxies.add(new TaxonomyProxy(item)); } } return proxies; } + + public void copyPropertiesForUpdate(CollectTaxonomy taxonomy) { + taxonomy.setName(name); + taxonomy.setUri(uri); + taxonomy.setSurveyId(surveyId); + } - public String getCode() { - return occurrence.getCode(); + public Integer getId() { + return id; } - public String getScientificName() { - return occurrence.getScientificName(); + public void setId(Integer id) { + this.id = id; } - public String getVernacularName() { - return occurrence.getVernacularName(); + public String getName() { + return name; } - public String getLanguageCode() { - return occurrence.getLanguageCode(); + public void setName(String name) { + this.name = name; } - public String getLanguageVariety() { - return occurrence.getLanguageVariety(); + public String getUri() { + return uri; } - + + public void setUri(String uri) { + this.uri = uri; + } + + public Integer getSurveyId() { + return surveyId; + } + + public void setSurveyId(Integer surveyId) { + this.surveyId = surveyId; + } + } From 719952b3294c214277869a9378e27a1ba57d8003 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:33 +0100 Subject: [PATCH 1572/1620] New translations TaxonomyProxy.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 73 +++++++++++++------ 1 file changed, 49 insertions(+), 24 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index a6fb237683..1f0698c58a 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,55 +1,80 @@ -/** - * - */ package org.openforis.collect.model.proxy; import java.util.ArrayList; import java.util.List; import org.openforis.collect.Proxy; -import org.openforis.idm.model.TaxonOccurrence; +import org.openforis.collect.model.CollectTaxonomy; /** + * * @author S. Ricci * */ -public class TaxonOccurrenceProxy implements Proxy { - - private TaxonOccurrence occurrence; +public class TaxonomyProxy implements Proxy { - public TaxonOccurrenceProxy(TaxonOccurrence occurence) { + private Integer id; + private String name; + private String uri; + private Integer surveyId; + + public TaxonomyProxy() { + } + + public TaxonomyProxy(CollectTaxonomy taxonomy) { super(); - this.occurrence = occurence; + id = taxonomy.getId(); + name = taxonomy.getName(); + uri = taxonomy.getUri(); + surveyId = taxonomy.getSurveyId(); } - public static List fromList(List list) { - List proxies = new ArrayList<>(); + public static List fromList(List list) { + List proxies = new ArrayList<>(); if (list != null) { - for (TaxonOccurrence item : list) { - proxies.add(new TaxonOccurrenceProxy(item)); + for (CollectTaxonomy item : list) { + proxies.add(new TaxonomyProxy(item)); } } return proxies; } + + public void copyPropertiesForUpdate(CollectTaxonomy taxonomy) { + taxonomy.setName(name); + taxonomy.setUri(uri); + taxonomy.setSurveyId(surveyId); + } - public String getCode() { - return occurrence.getCode(); + public Integer getId() { + return id; } - public String getScientificName() { - return occurrence.getScientificName(); + public void setId(Integer id) { + this.id = id; } - public String getVernacularName() { - return occurrence.getVernacularName(); + public String getName() { + return name; } - public String getLanguageCode() { - return occurrence.getLanguageCode(); + public void setName(String name) { + this.name = name; } - public String getLanguageVariety() { - return occurrence.getLanguageVariety(); + public String getUri() { + return uri; } - + + public void setUri(String uri) { + this.uri = uri; + } + + public Integer getSurveyId() { + return surveyId; + } + + public void setSurveyId(Integer surveyId) { + this.surveyId = surveyId; + } + } From c7fe5b52a34aa5c0c4c63446ae6c036730398d5a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:34 +0100 Subject: [PATCH 1573/1620] New translations UserProxy.java (French) --- .../earth/app/view/Messages_fr.properties | 91 ++++++++++++------- 1 file changed, 58 insertions(+), 33 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 1f0698c58a..e7425cc791 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,50 +1,75 @@ +/** + * + */ package org.openforis.collect.model.proxy; import java.util.ArrayList; import java.util.List; import org.openforis.collect.Proxy; -import org.openforis.collect.model.CollectTaxonomy; +import org.openforis.collect.model.User; +import org.openforis.collect.model.UserRole; /** * * @author S. Ricci * */ -public class TaxonomyProxy implements Proxy { +public class UserProxy implements Proxy { + private Boolean enabled; private Integer id; private String name; - private String uri; - private Integer surveyId; - - public TaxonomyProxy() { - } - - public TaxonomyProxy(CollectTaxonomy taxonomy) { + private String password; + private List roles; + + public UserProxy(User user) { super(); - id = taxonomy.getId(); - name = taxonomy.getName(); - uri = taxonomy.getUri(); - surveyId = taxonomy.getSurveyId(); + this.enabled = user.getEnabled(); + this.id = user.getId(); + this.name = user.getUsername(); + this.roles = user.getRoleCodes(); + //password is not initialized, so the client will not know its value } - - public static List fromList(List list) { - List proxies = new ArrayList<>(); - if (list != null) { - for (CollectTaxonomy item : list) { - proxies.add(new TaxonomyProxy(item)); + + public static List fromList(List users) { + List result = new ArrayList<>(); + if ( users != null ) { + for (User user : users) { + UserProxy proxy = new UserProxy(user); + result.add(proxy); } } - return proxies; + return result; } - public void copyPropertiesForUpdate(CollectTaxonomy taxonomy) { - taxonomy.setName(name); - taxonomy.setUri(uri); - taxonomy.setSurveyId(surveyId); + public User toUser() { + User user = new User(); + user.setEnabled(enabled); + user.setId(id); + user.setUsername(name); + user.setPassword(password); + user.setRoles(getRolesFromCodes(roles)); + return user; + } + + private List getRolesFromCodes(List codes) { + List roles = new ArrayList<>(); + for (String code : codes) { + UserRole role = UserRole.fromCode(code); + roles.add(role); + } + return roles; + } + + public Boolean getEnabled() { + return enabled; } + public void setEnabled(Boolean enabled) { + this.enabled = enabled; + } + public Integer getId() { return id; } @@ -52,7 +77,7 @@ public class TaxonomyProxy implements Proxy { public void setId(Integer id) { this.id = id; } - + public String getName() { return name; } @@ -61,20 +86,20 @@ public class TaxonomyProxy implements Proxy { this.name = name; } - public String getUri() { - return uri; + public List getRoles() { + return roles; } - public void setUri(String uri) { - this.uri = uri; + public void setRoles(List roles) { + this.roles = roles; } - public Integer getSurveyId() { - return surveyId; + public String getPassword() { + return password; } - public void setSurveyId(Integer surveyId) { - this.surveyId = surveyId; + public void setPassword(String password) { + this.password = password; } } From 97b649eefbe3e791d4cec2efb871debb67caba6e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:36 +0100 Subject: [PATCH 1574/1620] New translations RecordProxy.java (French) --- .../earth/app/view/Messages_fr.properties | 195 ++++++++++++------ 1 file changed, 133 insertions(+), 62 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index e7425cc791..af82dc31fd 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -4,102 +4,173 @@ package org.openforis.collect.model.proxy; import java.util.ArrayList; +import java.util.Date; import java.util.List; import org.openforis.collect.Proxy; +import org.openforis.collect.ProxyContext; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.State; +import org.openforis.collect.model.CollectRecord.Step; import org.openforis.collect.model.User; -import org.openforis.collect.model.UserRole; +import org.openforis.idm.model.Entity; /** - * + * @author M. Togna * @author S. Ricci - * + * */ -public class UserProxy implements Proxy { - - private Boolean enabled; - private Integer id; - private String name; - private String password; - private List roles; - - public UserProxy(User user) { - super(); - this.enabled = user.getEnabled(); - this.id = user.getId(); - this.name = user.getUsername(); - this.roles = user.getRoleCodes(); - //password is not initialized, so the client will not know its value - } - - public static List fromList(List users) { - List result = new ArrayList<>(); - if ( users != null ) { - for (User user : users) { - UserProxy proxy = new UserProxy(user); - result.add(proxy); +public class RecordProxy implements Proxy { + + private CollectRecord record; + private ProxyContext context; + + private Integer errors; + private Integer skipped; + private Integer missing; + private Integer missingErrors; + private Integer missingWarnings; + private Integer warnings; + private UserProxy owner; + + public RecordProxy(CollectRecord record, ProxyContext context) { + this.record = record; + this.context = context; + + errors = record.getErrors(); + skipped = record.getSkipped(); + missing = record.getMissing(); + missingErrors = record.getMissingErrors(); + missingWarnings = record.getMissingWarnings(); + warnings = record.getWarnings(); + owner = record.getOwner() == null ? null: new UserProxy(record.getOwner()); + } + + public static List fromList(List records, ProxyContext context) { + List result = new ArrayList<>(); + if ( records != null ) { + for (CollectRecord collectRecord : records) { + result.add(new RecordProxy(collectRecord, context)); } } return result; } - public User toUser() { - User user = new User(); - user.setEnabled(enabled); - user.setId(id); - user.setUsername(name); - user.setPassword(password); - user.setRoles(getRolesFromCodes(roles)); - return user; + public Step getStep() { + return record.getStep(); } - - private List getRolesFromCodes(List codes) { - List roles = new ArrayList<>(); - for (String code : codes) { - UserRole role = UserRole.fromCode(code); - roles.add(role); - } - return roles; + + public State getState() { + return record.getState(); } - public Boolean getEnabled() { - return enabled; + public Date getCreationDate() { + return record.getCreationDate(); } - public void setEnabled(Boolean enabled) { - this.enabled = enabled; + public UserProxy getCreatedBy() { + User createdBy = record.getCreatedBy(); + return createdBy == null ? null: new UserProxy(createdBy); } - + + public Date getModifiedDate() { + return record.getModifiedDate(); + } + public Integer getId() { - return id; + return record.getId(); } - public void setId(Integer id) { - this.id = id; + public UserProxy getModifiedBy() { + User modifiedBy = record.getModifiedBy(); + return modifiedBy == null ? null: new UserProxy(modifiedBy); } - public String getName() { - return name; + public EntityProxy getRootEntity() { + Entity rootEntity = record.getRootEntity(); + return rootEntity == null ? null: new EntityProxy(null, record.getRootEntity(), context); + } + + public List getRootEntityKeys() { + return record.getRootEntityKeyValues(); } - public void setName(String name) { - this.name = name; + public List getEntityCounts() { + return record.getEntityCounts(); } - public List getRoles() { - return roles; + public boolean isEntryComplete() { + if(record.getStep() != null) { + switch(record.getStep()) { + case ENTRY: + return false; + case CLEANSING: + case ANALYSIS: + return true; + } + } + return false; + } + + public boolean isCleansingComplete() { + return ( + record.getStep() != null && record.getStep().equals( Step.ANALYSIS) + ); } - public void setRoles(List roles) { - this.roles = roles; + public Integer getErrors() { + return errors; } - public String getPassword() { - return password; + public void setErrors(Integer errors) { + this.errors = errors; } - public void setPassword(String password) { - this.password = password; + public Integer getSkipped() { + return skipped; } + public void setSkipped(Integer skipped) { + this.skipped = skipped; + } + + public Integer getMissing() { + return missing; + } + + public void setMissing(Integer missing) { + this.missing = missing; + } + + public Integer getWarnings() { + return warnings; + } + + public void setWarnings(Integer warnings) { + this.warnings = warnings; + } + + public Integer getMissingErrors() { + return missingErrors; + } + + public void setMissingErrors(Integer missingErrors) { + this.missingErrors = missingErrors; + } + + public Integer getMissingWarnings() { + return missingWarnings; + } + + public void setMissingWarnings(Integer missingWarnings) { + this.missingWarnings = missingWarnings; + } + + public UserProxy getOwner() { + return owner; + } + + public void setOwner(UserProxy owner) { + this.owner = owner; + } } From bdaed546821fd97aea64c693c4f23a7063b0ed03 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:37 +0100 Subject: [PATCH 1575/1620] New translations UserProxy.java (Spanish) --- .../earth/app/view/Messages_es.properties | 91 ++++++++++++------- 1 file changed, 58 insertions(+), 33 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 1f0698c58a..e7425cc791 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,50 +1,75 @@ +/** + * + */ package org.openforis.collect.model.proxy; import java.util.ArrayList; import java.util.List; import org.openforis.collect.Proxy; -import org.openforis.collect.model.CollectTaxonomy; +import org.openforis.collect.model.User; +import org.openforis.collect.model.UserRole; /** * * @author S. Ricci * */ -public class TaxonomyProxy implements Proxy { +public class UserProxy implements Proxy { + private Boolean enabled; private Integer id; private String name; - private String uri; - private Integer surveyId; - - public TaxonomyProxy() { - } - - public TaxonomyProxy(CollectTaxonomy taxonomy) { + private String password; + private List roles; + + public UserProxy(User user) { super(); - id = taxonomy.getId(); - name = taxonomy.getName(); - uri = taxonomy.getUri(); - surveyId = taxonomy.getSurveyId(); + this.enabled = user.getEnabled(); + this.id = user.getId(); + this.name = user.getUsername(); + this.roles = user.getRoleCodes(); + //password is not initialized, so the client will not know its value } - - public static List fromList(List list) { - List proxies = new ArrayList<>(); - if (list != null) { - for (CollectTaxonomy item : list) { - proxies.add(new TaxonomyProxy(item)); + + public static List fromList(List users) { + List result = new ArrayList<>(); + if ( users != null ) { + for (User user : users) { + UserProxy proxy = new UserProxy(user); + result.add(proxy); } } - return proxies; + return result; } - public void copyPropertiesForUpdate(CollectTaxonomy taxonomy) { - taxonomy.setName(name); - taxonomy.setUri(uri); - taxonomy.setSurveyId(surveyId); + public User toUser() { + User user = new User(); + user.setEnabled(enabled); + user.setId(id); + user.setUsername(name); + user.setPassword(password); + user.setRoles(getRolesFromCodes(roles)); + return user; + } + + private List getRolesFromCodes(List codes) { + List roles = new ArrayList<>(); + for (String code : codes) { + UserRole role = UserRole.fromCode(code); + roles.add(role); + } + return roles; + } + + public Boolean getEnabled() { + return enabled; } + public void setEnabled(Boolean enabled) { + this.enabled = enabled; + } + public Integer getId() { return id; } @@ -52,7 +77,7 @@ public class TaxonomyProxy implements Proxy { public void setId(Integer id) { this.id = id; } - + public String getName() { return name; } @@ -61,20 +86,20 @@ public class TaxonomyProxy implements Proxy { this.name = name; } - public String getUri() { - return uri; + public List getRoles() { + return roles; } - public void setUri(String uri) { - this.uri = uri; + public void setRoles(List roles) { + this.roles = roles; } - public Integer getSurveyId() { - return surveyId; + public String getPassword() { + return password; } - public void setSurveyId(Integer surveyId) { - this.surveyId = surveyId; + public void setPassword(String password) { + this.password = password; } } From ad35c3f5c636446738064db79bdd41d2767c7391 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:38 +0100 Subject: [PATCH 1576/1620] New translations UserProxy.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 91 ++++++++++++------- 1 file changed, 58 insertions(+), 33 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 1f0698c58a..e7425cc791 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,50 +1,75 @@ +/** + * + */ package org.openforis.collect.model.proxy; import java.util.ArrayList; import java.util.List; import org.openforis.collect.Proxy; -import org.openforis.collect.model.CollectTaxonomy; +import org.openforis.collect.model.User; +import org.openforis.collect.model.UserRole; /** * * @author S. Ricci * */ -public class TaxonomyProxy implements Proxy { +public class UserProxy implements Proxy { + private Boolean enabled; private Integer id; private String name; - private String uri; - private Integer surveyId; - - public TaxonomyProxy() { - } - - public TaxonomyProxy(CollectTaxonomy taxonomy) { + private String password; + private List roles; + + public UserProxy(User user) { super(); - id = taxonomy.getId(); - name = taxonomy.getName(); - uri = taxonomy.getUri(); - surveyId = taxonomy.getSurveyId(); + this.enabled = user.getEnabled(); + this.id = user.getId(); + this.name = user.getUsername(); + this.roles = user.getRoleCodes(); + //password is not initialized, so the client will not know its value } - - public static List fromList(List list) { - List proxies = new ArrayList<>(); - if (list != null) { - for (CollectTaxonomy item : list) { - proxies.add(new TaxonomyProxy(item)); + + public static List fromList(List users) { + List result = new ArrayList<>(); + if ( users != null ) { + for (User user : users) { + UserProxy proxy = new UserProxy(user); + result.add(proxy); } } - return proxies; + return result; } - public void copyPropertiesForUpdate(CollectTaxonomy taxonomy) { - taxonomy.setName(name); - taxonomy.setUri(uri); - taxonomy.setSurveyId(surveyId); + public User toUser() { + User user = new User(); + user.setEnabled(enabled); + user.setId(id); + user.setUsername(name); + user.setPassword(password); + user.setRoles(getRolesFromCodes(roles)); + return user; + } + + private List getRolesFromCodes(List codes) { + List roles = new ArrayList<>(); + for (String code : codes) { + UserRole role = UserRole.fromCode(code); + roles.add(role); + } + return roles; + } + + public Boolean getEnabled() { + return enabled; } + public void setEnabled(Boolean enabled) { + this.enabled = enabled; + } + public Integer getId() { return id; } @@ -52,7 +77,7 @@ public class TaxonomyProxy implements Proxy { public void setId(Integer id) { this.id = id; } - + public String getName() { return name; } @@ -61,20 +86,20 @@ public class TaxonomyProxy implements Proxy { this.name = name; } - public String getUri() { - return uri; + public List getRoles() { + return roles; } - public void setUri(String uri) { - this.uri = uri; + public void setRoles(List roles) { + this.roles = roles; } - public Integer getSurveyId() { - return surveyId; + public String getPassword() { + return password; } - public void setSurveyId(Integer surveyId) { - this.surveyId = surveyId; + public void setPassword(String password) { + this.password = password; } } From 862e2ae94c2d37fbd53cb9dedd4694f617057fcc Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:39 +0100 Subject: [PATCH 1577/1620] New translations UserProxy.java (English) --- .../earth/app/view/Messages_en.properties | 96 ++++++++++++++----- 1 file changed, 73 insertions(+), 23 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index a6fb237683..e7425cc791 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -7,49 +7,99 @@ import java.util.ArrayList; import java.util.List; import org.openforis.collect.Proxy; -import org.openforis.idm.model.TaxonOccurrence; +import org.openforis.collect.model.User; +import org.openforis.collect.model.UserRole; /** + * * @author S. Ricci * */ -public class TaxonOccurrenceProxy implements Proxy { +public class UserProxy implements Proxy { - private TaxonOccurrence occurrence; + private Boolean enabled; + private Integer id; + private String name; + private String password; + private List roles; - public TaxonOccurrenceProxy(TaxonOccurrence occurence) { + public UserProxy(User user) { super(); - this.occurrence = occurence; + this.enabled = user.getEnabled(); + this.id = user.getId(); + this.name = user.getUsername(); + this.roles = user.getRoleCodes(); + //password is not initialized, so the client will not know its value } - - public static List fromList(List list) { - List proxies = new ArrayList<>(); - if (list != null) { - for (TaxonOccurrence item : list) { - proxies.add(new TaxonOccurrenceProxy(item)); + + public static List fromList(List users) { + List result = new ArrayList<>(); + if ( users != null ) { + for (User user : users) { + UserProxy proxy = new UserProxy(user); + result.add(proxy); } } - return proxies; + return result; + } + + public User toUser() { + User user = new User(); + user.setEnabled(enabled); + user.setId(id); + user.setUsername(name); + user.setPassword(password); + user.setRoles(getRolesFromCodes(roles)); + return user; + } + + private List getRolesFromCodes(List codes) { + List roles = new ArrayList<>(); + for (String code : codes) { + UserRole role = UserRole.fromCode(code); + roles.add(role); + } + return roles; + } + + public Boolean getEnabled() { + return enabled; } - public String getCode() { - return occurrence.getCode(); + public void setEnabled(Boolean enabled) { + this.enabled = enabled; + } + + public Integer getId() { + return id; } - public String getScientificName() { - return occurrence.getScientificName(); + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; } - public String getVernacularName() { - return occurrence.getVernacularName(); + public void setName(String name) { + this.name = name; } - public String getLanguageCode() { - return occurrence.getLanguageCode(); + public List getRoles() { + return roles; } - public String getLanguageVariety() { - return occurrence.getLanguageVariety(); + public void setRoles(List roles) { + this.roles = roles; } - + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + } From 970ebc3c9bd46e95e0f198235aa16ca4e03f1b09 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:40 +0100 Subject: [PATCH 1578/1620] New translations ValidationResultsProxy.java (French) --- .../earth/app/view/Messages_fr.properties | 168 +++--------------- 1 file changed, 26 insertions(+), 142 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index af82dc31fd..05119fdd7e 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -4,173 +4,57 @@ package org.openforis.collect.model.proxy; import java.util.ArrayList; -import java.util.Date; import java.util.List; import org.openforis.collect.Proxy; import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.State; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.User; -import org.openforis.idm.model.Entity; +import org.openforis.collect.model.validation.SpecifiedValidator; +import org.openforis.collect.model.validation.ValidationMessageBuilder; +import org.openforis.idm.metamodel.validation.ValidationResult; +import org.openforis.idm.metamodel.validation.ValidationResults; +import org.openforis.idm.model.Attribute; /** * @author M. Togna * @author S. Ricci * */ -public class RecordProxy implements Proxy { +public class ValidationResultsProxy implements Proxy { - private CollectRecord record; + private Attribute attribute; + private ValidationResults validationResults; private ProxyContext context; - private Integer errors; - private Integer skipped; - private Integer missing; - private Integer missingErrors; - private Integer missingWarnings; - private Integer warnings; - private UserProxy owner; - - public RecordProxy(CollectRecord record, ProxyContext context) { - this.record = record; + public ValidationResultsProxy(ProxyContext context, Attribute attribute, ValidationResults validationResults) { + this.attribute = attribute; + this.validationResults = validationResults; this.context = context; - - errors = record.getErrors(); - skipped = record.getSkipped(); - missing = record.getMissing(); - missingErrors = record.getMissingErrors(); - missingWarnings = record.getMissingWarnings(); - warnings = record.getWarnings(); - owner = record.getOwner() == null ? null: new UserProxy(record.getOwner()); - } - - public static List fromList(List records, ProxyContext context) { - List result = new ArrayList<>(); - if ( records != null ) { - for (CollectRecord collectRecord : records) { - result.add(new RecordProxy(collectRecord, context)); - } - } - return result; - } - - public Step getStep() { - return record.getStep(); - } - - public State getState() { - return record.getState(); - } - - public Date getCreationDate() { - return record.getCreationDate(); - } - - public UserProxy getCreatedBy() { - User createdBy = record.getCreatedBy(); - return createdBy == null ? null: new UserProxy(createdBy); - } - - public Date getModifiedDate() { - return record.getModifiedDate(); } - public Integer getId() { - return record.getId(); - } - - public UserProxy getModifiedBy() { - User modifiedBy = record.getModifiedBy(); - return modifiedBy == null ? null: new UserProxy(modifiedBy); - } - - public EntityProxy getRootEntity() { - Entity rootEntity = record.getRootEntity(); - return rootEntity == null ? null: new EntityProxy(null, record.getRootEntity(), context); + public List getErrors() { + return extractValidationResultMessages(validationResults.getErrors()); } - public List getRootEntityKeys() { - return record.getRootEntityKeyValues(); + public List getWarnings() { + return extractValidationResultMessages(validationResults.getWarnings()); } - public List getEntityCounts() { - return record.getEntityCounts(); - } - - public boolean isEntryComplete() { - if(record.getStep() != null) { - switch(record.getStep()) { - case ENTRY: - return false; - case CLEANSING: - case ANALYSIS: + public boolean isSpecifiedErrorPresent() { + List errors = validationResults.getErrors(); + for (ValidationResult validationResult : errors) { + if(validationResult.getValidator() instanceof SpecifiedValidator) { return true; } } return false; } - public boolean isCleansingComplete() { - return ( - record.getStep() != null && record.getStep().equals( Step.ANALYSIS) - ); - } - - public Integer getErrors() { - return errors; - } - - public void setErrors(Integer errors) { - this.errors = errors; - } - - public Integer getSkipped() { - return skipped; - } - - public void setSkipped(Integer skipped) { - this.skipped = skipped; - } - - public Integer getMissing() { - return missing; - } - - public void setMissing(Integer missing) { - this.missing = missing; - } - - public Integer getWarnings() { - return warnings; - } - - public void setWarnings(Integer warnings) { - this.warnings = warnings; - } - - public Integer getMissingErrors() { - return missingErrors; - } - - public void setMissingErrors(Integer missingErrors) { - this.missingErrors = missingErrors; - } - - public Integer getMissingWarnings() { - return missingWarnings; - } - - public void setMissingWarnings(Integer missingWarnings) { - this.missingWarnings = missingWarnings; - } - - public UserProxy getOwner() { - return owner; - } - - public void setOwner(UserProxy owner) { - this.owner = owner; + private List extractValidationResultMessages(List validationResultList) { + List result = new ArrayList<>(); + ValidationMessageBuilder validationMessageBuilder = ValidationMessageBuilder.createInstance(context.getMessageSource()); + for (ValidationResult validationResult : validationResultList) { + result.add(validationMessageBuilder.getValidationMessage(attribute, validationResult, context.getLocale())); + } + return result; } } From 7e75237fbb55ca510fba5b7e1e6701b837d86175 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:41 +0100 Subject: [PATCH 1579/1620] New translations ValidationResultsProxy.java (Spanish) --- .../earth/app/view/Messages_es.properties | 115 ++++++------------ 1 file changed, 35 insertions(+), 80 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index e7425cc791..05119fdd7e 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -7,99 +7,54 @@ import java.util.ArrayList; import java.util.List; import org.openforis.collect.Proxy; -import org.openforis.collect.model.User; -import org.openforis.collect.model.UserRole; +import org.openforis.collect.ProxyContext; +import org.openforis.collect.model.validation.SpecifiedValidator; +import org.openforis.collect.model.validation.ValidationMessageBuilder; +import org.openforis.idm.metamodel.validation.ValidationResult; +import org.openforis.idm.metamodel.validation.ValidationResults; +import org.openforis.idm.model.Attribute; /** - * + * @author M. Togna * @author S. Ricci - * + * */ -public class UserProxy implements Proxy { +public class ValidationResultsProxy implements Proxy { - private Boolean enabled; - private Integer id; - private String name; - private String password; - private List roles; + private Attribute attribute; + private ValidationResults validationResults; + private ProxyContext context; - public UserProxy(User user) { - super(); - this.enabled = user.getEnabled(); - this.id = user.getId(); - this.name = user.getUsername(); - this.roles = user.getRoleCodes(); - //password is not initialized, so the client will not know its value + public ValidationResultsProxy(ProxyContext context, Attribute attribute, ValidationResults validationResults) { + this.attribute = attribute; + this.validationResults = validationResults; + this.context = context; } - public static List fromList(List users) { - List result = new ArrayList<>(); - if ( users != null ) { - for (User user : users) { - UserProxy proxy = new UserProxy(user); - result.add(proxy); - } - } - return result; - } - - public User toUser() { - User user = new User(); - user.setEnabled(enabled); - user.setId(id); - user.setUsername(name); - user.setPassword(password); - user.setRoles(getRolesFromCodes(roles)); - return user; - } - - private List getRolesFromCodes(List codes) { - List roles = new ArrayList<>(); - for (String code : codes) { - UserRole role = UserRole.fromCode(code); - roles.add(role); - } - return roles; + public List getErrors() { + return extractValidationResultMessages(validationResults.getErrors()); } - public Boolean getEnabled() { - return enabled; + public List getWarnings() { + return extractValidationResultMessages(validationResults.getWarnings()); } - public void setEnabled(Boolean enabled) { - this.enabled = enabled; - } - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; + public boolean isSpecifiedErrorPresent() { + List errors = validationResults.getErrors(); + for (ValidationResult validationResult : errors) { + if(validationResult.getValidator() instanceof SpecifiedValidator) { + return true; + } + } + return false; } - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public List getRoles() { - return roles; - } - - public void setRoles(List roles) { - this.roles = roles; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; + private List extractValidationResultMessages(List validationResultList) { + List result = new ArrayList<>(); + ValidationMessageBuilder validationMessageBuilder = ValidationMessageBuilder.createInstance(context.getMessageSource()); + for (ValidationResult validationResult : validationResultList) { + result.add(validationMessageBuilder.getValidationMessage(attribute, validationResult, context.getLocale())); + } + return result; } - } From 740c3cae71a669ece5272b6ce62626605ac0f3ee Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:42 +0100 Subject: [PATCH 1580/1620] New translations ValidationResultsProxy.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 115 ++++++------------ 1 file changed, 35 insertions(+), 80 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index e7425cc791..05119fdd7e 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -7,99 +7,54 @@ import java.util.ArrayList; import java.util.List; import org.openforis.collect.Proxy; -import org.openforis.collect.model.User; -import org.openforis.collect.model.UserRole; +import org.openforis.collect.ProxyContext; +import org.openforis.collect.model.validation.SpecifiedValidator; +import org.openforis.collect.model.validation.ValidationMessageBuilder; +import org.openforis.idm.metamodel.validation.ValidationResult; +import org.openforis.idm.metamodel.validation.ValidationResults; +import org.openforis.idm.model.Attribute; /** - * + * @author M. Togna * @author S. Ricci - * + * */ -public class UserProxy implements Proxy { +public class ValidationResultsProxy implements Proxy { - private Boolean enabled; - private Integer id; - private String name; - private String password; - private List roles; + private Attribute attribute; + private ValidationResults validationResults; + private ProxyContext context; - public UserProxy(User user) { - super(); - this.enabled = user.getEnabled(); - this.id = user.getId(); - this.name = user.getUsername(); - this.roles = user.getRoleCodes(); - //password is not initialized, so the client will not know its value + public ValidationResultsProxy(ProxyContext context, Attribute attribute, ValidationResults validationResults) { + this.attribute = attribute; + this.validationResults = validationResults; + this.context = context; } - public static List fromList(List users) { - List result = new ArrayList<>(); - if ( users != null ) { - for (User user : users) { - UserProxy proxy = new UserProxy(user); - result.add(proxy); - } - } - return result; - } - - public User toUser() { - User user = new User(); - user.setEnabled(enabled); - user.setId(id); - user.setUsername(name); - user.setPassword(password); - user.setRoles(getRolesFromCodes(roles)); - return user; - } - - private List getRolesFromCodes(List codes) { - List roles = new ArrayList<>(); - for (String code : codes) { - UserRole role = UserRole.fromCode(code); - roles.add(role); - } - return roles; + public List getErrors() { + return extractValidationResultMessages(validationResults.getErrors()); } - public Boolean getEnabled() { - return enabled; + public List getWarnings() { + return extractValidationResultMessages(validationResults.getWarnings()); } - public void setEnabled(Boolean enabled) { - this.enabled = enabled; - } - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; + public boolean isSpecifiedErrorPresent() { + List errors = validationResults.getErrors(); + for (ValidationResult validationResult : errors) { + if(validationResult.getValidator() instanceof SpecifiedValidator) { + return true; + } + } + return false; } - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public List getRoles() { - return roles; - } - - public void setRoles(List roles) { - this.roles = roles; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; + private List extractValidationResultMessages(List validationResultList) { + List result = new ArrayList<>(); + ValidationMessageBuilder validationMessageBuilder = ValidationMessageBuilder.createInstance(context.getMessageSource()); + for (ValidationResult validationResult : validationResultList) { + result.add(validationMessageBuilder.getValidationMessage(attribute, validationResult, context.getLocale())); + } + return result; } - } From 1e3cdfa8062e2586b0cf26275816785d39fa5434 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:43 +0100 Subject: [PATCH 1581/1620] New translations ValidationResultsProxy.java (English) --- .../earth/app/view/Messages_en.properties | 115 ++++++------------ 1 file changed, 35 insertions(+), 80 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index e7425cc791..05119fdd7e 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -7,99 +7,54 @@ import java.util.ArrayList; import java.util.List; import org.openforis.collect.Proxy; -import org.openforis.collect.model.User; -import org.openforis.collect.model.UserRole; +import org.openforis.collect.ProxyContext; +import org.openforis.collect.model.validation.SpecifiedValidator; +import org.openforis.collect.model.validation.ValidationMessageBuilder; +import org.openforis.idm.metamodel.validation.ValidationResult; +import org.openforis.idm.metamodel.validation.ValidationResults; +import org.openforis.idm.model.Attribute; /** - * + * @author M. Togna * @author S. Ricci - * + * */ -public class UserProxy implements Proxy { +public class ValidationResultsProxy implements Proxy { - private Boolean enabled; - private Integer id; - private String name; - private String password; - private List roles; + private Attribute attribute; + private ValidationResults validationResults; + private ProxyContext context; - public UserProxy(User user) { - super(); - this.enabled = user.getEnabled(); - this.id = user.getId(); - this.name = user.getUsername(); - this.roles = user.getRoleCodes(); - //password is not initialized, so the client will not know its value + public ValidationResultsProxy(ProxyContext context, Attribute attribute, ValidationResults validationResults) { + this.attribute = attribute; + this.validationResults = validationResults; + this.context = context; } - public static List fromList(List users) { - List result = new ArrayList<>(); - if ( users != null ) { - for (User user : users) { - UserProxy proxy = new UserProxy(user); - result.add(proxy); - } - } - return result; - } - - public User toUser() { - User user = new User(); - user.setEnabled(enabled); - user.setId(id); - user.setUsername(name); - user.setPassword(password); - user.setRoles(getRolesFromCodes(roles)); - return user; - } - - private List getRolesFromCodes(List codes) { - List roles = new ArrayList<>(); - for (String code : codes) { - UserRole role = UserRole.fromCode(code); - roles.add(role); - } - return roles; + public List getErrors() { + return extractValidationResultMessages(validationResults.getErrors()); } - public Boolean getEnabled() { - return enabled; + public List getWarnings() { + return extractValidationResultMessages(validationResults.getWarnings()); } - public void setEnabled(Boolean enabled) { - this.enabled = enabled; - } - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; + public boolean isSpecifiedErrorPresent() { + List errors = validationResults.getErrors(); + for (ValidationResult validationResult : errors) { + if(validationResult.getValidator() instanceof SpecifiedValidator) { + return true; + } + } + return false; } - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public List getRoles() { - return roles; - } - - public void setRoles(List roles) { - this.roles = roles; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; + private List extractValidationResultMessages(List validationResultList) { + List result = new ArrayList<>(); + ValidationMessageBuilder validationMessageBuilder = ValidationMessageBuilder.createInstance(context.getMessageSource()); + for (ValidationResult validationResult : validationResultList) { + result.add(validationMessageBuilder.getValidationMessage(attribute, validationResult, context.getLocale())); + } + return result; } - } From c0521b2ed7f43b2185c83fddb12368f9c43a5d1f Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:44 +0100 Subject: [PATCH 1582/1620] New translations Proxy.java (French) --- .../earth/app/view/Messages_fr.properties | 56 +------------------ 1 file changed, 3 insertions(+), 53 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 05119fdd7e..08b48cb25c 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,60 +1,10 @@ -/** - * - */ -package org.openforis.collect.model.proxy; - -import java.util.ArrayList; -import java.util.List; - -import org.openforis.collect.Proxy; -import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.validation.SpecifiedValidator; -import org.openforis.collect.model.validation.ValidationMessageBuilder; -import org.openforis.idm.metamodel.validation.ValidationResult; -import org.openforis.idm.metamodel.validation.ValidationResults; -import org.openforis.idm.model.Attribute; +package org.openforis.collect; /** + * * @author M. Togna - * @author S. Ricci * */ -public class ValidationResultsProxy implements Proxy { - - private Attribute attribute; - private ValidationResults validationResults; - private ProxyContext context; - - public ValidationResultsProxy(ProxyContext context, Attribute attribute, ValidationResults validationResults) { - this.attribute = attribute; - this.validationResults = validationResults; - this.context = context; - } - - public List getErrors() { - return extractValidationResultMessages(validationResults.getErrors()); - } - - public List getWarnings() { - return extractValidationResultMessages(validationResults.getWarnings()); - } +public interface Proxy { - public boolean isSpecifiedErrorPresent() { - List errors = validationResults.getErrors(); - for (ValidationResult validationResult : errors) { - if(validationResult.getValidator() instanceof SpecifiedValidator) { - return true; - } - } - return false; - } - - private List extractValidationResultMessages(List validationResultList) { - List result = new ArrayList<>(); - ValidationMessageBuilder validationMessageBuilder = ValidationMessageBuilder.createInstance(context.getMessageSource()); - for (ValidationResult validationResult : validationResultList) { - result.add(validationMessageBuilder.getValidationMessage(attribute, validationResult, context.getLocale())); - } - return result; - } } From 977f9a5dbdcd777c318b65513d64286de4d40c3a Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:45 +0100 Subject: [PATCH 1583/1620] New translations Proxy.java (Spanish) --- .../earth/app/view/Messages_es.properties | 56 +------------------ 1 file changed, 3 insertions(+), 53 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 05119fdd7e..08b48cb25c 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,60 +1,10 @@ -/** - * - */ -package org.openforis.collect.model.proxy; - -import java.util.ArrayList; -import java.util.List; - -import org.openforis.collect.Proxy; -import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.validation.SpecifiedValidator; -import org.openforis.collect.model.validation.ValidationMessageBuilder; -import org.openforis.idm.metamodel.validation.ValidationResult; -import org.openforis.idm.metamodel.validation.ValidationResults; -import org.openforis.idm.model.Attribute; +package org.openforis.collect; /** + * * @author M. Togna - * @author S. Ricci * */ -public class ValidationResultsProxy implements Proxy { - - private Attribute attribute; - private ValidationResults validationResults; - private ProxyContext context; - - public ValidationResultsProxy(ProxyContext context, Attribute attribute, ValidationResults validationResults) { - this.attribute = attribute; - this.validationResults = validationResults; - this.context = context; - } - - public List getErrors() { - return extractValidationResultMessages(validationResults.getErrors()); - } - - public List getWarnings() { - return extractValidationResultMessages(validationResults.getWarnings()); - } +public interface Proxy { - public boolean isSpecifiedErrorPresent() { - List errors = validationResults.getErrors(); - for (ValidationResult validationResult : errors) { - if(validationResult.getValidator() instanceof SpecifiedValidator) { - return true; - } - } - return false; - } - - private List extractValidationResultMessages(List validationResultList) { - List result = new ArrayList<>(); - ValidationMessageBuilder validationMessageBuilder = ValidationMessageBuilder.createInstance(context.getMessageSource()); - for (ValidationResult validationResult : validationResultList) { - result.add(validationMessageBuilder.getValidationMessage(attribute, validationResult, context.getLocale())); - } - return result; - } } From c1ebaa5d9261a89c81d0b71ec0bb818a06268e35 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:46 +0100 Subject: [PATCH 1584/1620] New translations Proxy.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 56 +------------------ 1 file changed, 3 insertions(+), 53 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 05119fdd7e..08b48cb25c 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,60 +1,10 @@ -/** - * - */ -package org.openforis.collect.model.proxy; - -import java.util.ArrayList; -import java.util.List; - -import org.openforis.collect.Proxy; -import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.validation.SpecifiedValidator; -import org.openforis.collect.model.validation.ValidationMessageBuilder; -import org.openforis.idm.metamodel.validation.ValidationResult; -import org.openforis.idm.metamodel.validation.ValidationResults; -import org.openforis.idm.model.Attribute; +package org.openforis.collect; /** + * * @author M. Togna - * @author S. Ricci * */ -public class ValidationResultsProxy implements Proxy { - - private Attribute attribute; - private ValidationResults validationResults; - private ProxyContext context; - - public ValidationResultsProxy(ProxyContext context, Attribute attribute, ValidationResults validationResults) { - this.attribute = attribute; - this.validationResults = validationResults; - this.context = context; - } - - public List getErrors() { - return extractValidationResultMessages(validationResults.getErrors()); - } - - public List getWarnings() { - return extractValidationResultMessages(validationResults.getWarnings()); - } +public interface Proxy { - public boolean isSpecifiedErrorPresent() { - List errors = validationResults.getErrors(); - for (ValidationResult validationResult : errors) { - if(validationResult.getValidator() instanceof SpecifiedValidator) { - return true; - } - } - return false; - } - - private List extractValidationResultMessages(List validationResultList) { - List result = new ArrayList<>(); - ValidationMessageBuilder validationMessageBuilder = ValidationMessageBuilder.createInstance(context.getMessageSource()); - for (ValidationResult validationResult : validationResultList) { - result.add(validationMessageBuilder.getValidationMessage(attribute, validationResult, context.getLocale())); - } - return result; - } } From b94e323ef91781780d29c8978548df7e701f4e8c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:48 +0100 Subject: [PATCH 1585/1620] New translations RecordProxy.java (Spanish) --- .../earth/app/view/Messages_es.properties | 172 +++++++++++++++++- 1 file changed, 169 insertions(+), 3 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 08b48cb25c..af82dc31fd 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,10 +1,176 @@ -package org.openforis.collect; - /** * + */ +package org.openforis.collect.model.proxy; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import org.openforis.collect.Proxy; +import org.openforis.collect.ProxyContext; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.CollectRecord.State; +import org.openforis.collect.model.CollectRecord.Step; +import org.openforis.collect.model.User; +import org.openforis.idm.model.Entity; + +/** * @author M. Togna + * @author S. Ricci * */ -public interface Proxy { +public class RecordProxy implements Proxy { + + private CollectRecord record; + private ProxyContext context; + + private Integer errors; + private Integer skipped; + private Integer missing; + private Integer missingErrors; + private Integer missingWarnings; + private Integer warnings; + private UserProxy owner; + + public RecordProxy(CollectRecord record, ProxyContext context) { + this.record = record; + this.context = context; + + errors = record.getErrors(); + skipped = record.getSkipped(); + missing = record.getMissing(); + missingErrors = record.getMissingErrors(); + missingWarnings = record.getMissingWarnings(); + warnings = record.getWarnings(); + owner = record.getOwner() == null ? null: new UserProxy(record.getOwner()); + } + + public static List fromList(List records, ProxyContext context) { + List result = new ArrayList<>(); + if ( records != null ) { + for (CollectRecord collectRecord : records) { + result.add(new RecordProxy(collectRecord, context)); + } + } + return result; + } + + public Step getStep() { + return record.getStep(); + } + + public State getState() { + return record.getState(); + } + + public Date getCreationDate() { + return record.getCreationDate(); + } + + public UserProxy getCreatedBy() { + User createdBy = record.getCreatedBy(); + return createdBy == null ? null: new UserProxy(createdBy); + } + + public Date getModifiedDate() { + return record.getModifiedDate(); + } + + public Integer getId() { + return record.getId(); + } + + public UserProxy getModifiedBy() { + User modifiedBy = record.getModifiedBy(); + return modifiedBy == null ? null: new UserProxy(modifiedBy); + } + + public EntityProxy getRootEntity() { + Entity rootEntity = record.getRootEntity(); + return rootEntity == null ? null: new EntityProxy(null, record.getRootEntity(), context); + } + + public List getRootEntityKeys() { + return record.getRootEntityKeyValues(); + } + + public List getEntityCounts() { + return record.getEntityCounts(); + } + + public boolean isEntryComplete() { + if(record.getStep() != null) { + switch(record.getStep()) { + case ENTRY: + return false; + case CLEANSING: + case ANALYSIS: + return true; + } + } + return false; + } + + public boolean isCleansingComplete() { + return ( + record.getStep() != null && record.getStep().equals( Step.ANALYSIS) + ); + } + + public Integer getErrors() { + return errors; + } + + public void setErrors(Integer errors) { + this.errors = errors; + } + + public Integer getSkipped() { + return skipped; + } + + public void setSkipped(Integer skipped) { + this.skipped = skipped; + } + + public Integer getMissing() { + return missing; + } + + public void setMissing(Integer missing) { + this.missing = missing; + } + + public Integer getWarnings() { + return warnings; + } + + public void setWarnings(Integer warnings) { + this.warnings = warnings; + } + + public Integer getMissingErrors() { + return missingErrors; + } + + public void setMissingErrors(Integer missingErrors) { + this.missingErrors = missingErrors; + } + + public Integer getMissingWarnings() { + return missingWarnings; + } + + public void setMissingWarnings(Integer missingWarnings) { + this.missingWarnings = missingWarnings; + } + public UserProxy getOwner() { + return owner; + } + + public void setOwner(UserProxy owner) { + this.owner = owner; + } } From 7de867b0ed2fcef83dfa45d2a80c031088f8e5d2 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:49 +0100 Subject: [PATCH 1586/1620] New translations NodeProxy.java (English) --- .../earth/app/view/Messages_en.properties | 95 ++++++++++++------- 1 file changed, 63 insertions(+), 32 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 05119fdd7e..f52885c52c 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -5,56 +5,87 @@ package org.openforis.collect.model.proxy; import java.util.ArrayList; import java.util.List; +import java.util.Locale; import org.openforis.collect.Proxy; import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.validation.SpecifiedValidator; -import org.openforis.collect.model.validation.ValidationMessageBuilder; -import org.openforis.idm.metamodel.validation.ValidationResult; -import org.openforis.idm.metamodel.validation.ValidationResults; +import org.openforis.collect.manager.MessageSource; import org.openforis.idm.model.Attribute; +import org.openforis.idm.model.CodeAttribute; +import org.openforis.idm.model.Entity; +import org.openforis.idm.model.Node; /** - * @author M. Togna * @author S. Ricci - * + * @author M. Togna + * */ -public class ValidationResultsProxy implements Proxy { +public class NodeProxy implements Proxy { - private Attribute attribute; - private ValidationResults validationResults; - private ProxyContext context; - - public ValidationResultsProxy(ProxyContext context, Attribute attribute, ValidationResults validationResults) { - this.attribute = attribute; - this.validationResults = validationResults; + private Node node; + protected ProxyContext context; + + public static NodeProxy fromNode(Node node, ProxyContext context) { + if (node instanceof Attribute) { + return new AttributeProxy(null, (Attribute) node, context); + } else if (node instanceof Entity) { + return new EntityProxy(null, (Entity) node, context); + } + return null; + } + + public NodeProxy(EntityProxy parent, Node node, ProxyContext context) { + super(); + this.node = node; this.context = context; } - public List getErrors() { - return extractValidationResultMessages(validationResults.getErrors()); + public static List fromList(EntityProxy parent, + List> list, ProxyContext context) { + List result = new ArrayList<>(); + if(list != null) { + for (Node node : list) { + NodeProxy proxy; + if(node instanceof Attribute) { + if(node instanceof CodeAttribute) { + proxy = new CodeAttributeProxy(parent, (CodeAttribute) node, context); + } else { + proxy = new AttributeProxy(parent, (Attribute) node, context); + } + } else { + proxy = new EntityProxy(parent, (Entity) node, context); + } + result.add(proxy); + } + } + return result; } - - public List getWarnings() { - return extractValidationResultMessages(validationResults.getWarnings()); + + public Integer getId() { + return node.getInternalId(); } - public boolean isSpecifiedErrorPresent() { - List errors = validationResults.getErrors(); - for (ValidationResult validationResult : errors) { - if(validationResult.getValidator() instanceof SpecifiedValidator) { - return true; - } + public Integer getDefinitionId() { + if(node.getDefinition() == null) { + return null; + } else { + return node.getDefinition().getId(); } - return false; } - private List extractValidationResultMessages(List validationResultList) { - List result = new ArrayList<>(); - ValidationMessageBuilder validationMessageBuilder = ValidationMessageBuilder.createInstance(context.getMessageSource()); - for (ValidationResult validationResult : validationResultList) { - result.add(validationMessageBuilder.getValidationMessage(attribute, validationResult, context.getLocale())); + public Integer getParentId() { + if(node.getParent() == null) { + return null; + } else { + return node.getParent().getInternalId(); } - return result; + } + + protected MessageSource getMessageSource() { + return context.getMessageSource(); + } + + protected Locale getLocale() { + return context.getLocale(); } } From be334bdcfc2297163c82c51a17ff7bd910124c34 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:50 +0100 Subject: [PATCH 1587/1620] New translations EntityProxy.java (English) --- .../earth/app/view/Messages_en.properties | 149 +++++++++++------- 1 file changed, 93 insertions(+), 56 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index f52885c52c..71392d44df 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -4,88 +4,125 @@ package org.openforis.collect.model.proxy; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; -import java.util.Locale; +import java.util.Map; -import org.openforis.collect.Proxy; import org.openforis.collect.ProxyContext; -import org.openforis.collect.manager.MessageSource; -import org.openforis.idm.model.Attribute; -import org.openforis.idm.model.CodeAttribute; +import org.openforis.collect.metamodel.ui.UIOptions; +import org.openforis.collect.model.CollectSurvey; +import org.openforis.idm.metamodel.EntityDefinition; +import org.openforis.idm.metamodel.ModelVersion; +import org.openforis.idm.metamodel.NodeDefinition; +import org.openforis.idm.metamodel.validation.ValidationResultFlag; import org.openforis.idm.model.Entity; import org.openforis.idm.model.Node; +import org.openforis.idm.model.Record; /** - * @author S. Ricci * @author M. Togna - * + * @author S. Ricci + * */ -public class NodeProxy implements Proxy { +public class EntityProxy extends NodeProxy { - private Node node; - protected ProxyContext context; + private Entity entity; + private List availableChildDefinitions; - public static NodeProxy fromNode(Node node, ProxyContext context) { - if (node instanceof Attribute) { - return new AttributeProxy(null, (Attribute) node, context); - } else if (node instanceof Entity) { - return new EntityProxy(null, (Entity) node, context); + public EntityProxy(EntityProxy parent, Entity entity, ProxyContext context) { + super(parent, entity, context); + this.entity = entity; + this.availableChildDefinitions = getAvailableChildDefinitions(); + } + + public Map> getChildrenByDefinitionId() { + Map> result = new HashMap>(); + for (NodeDefinition childDefinition : availableChildDefinitions) { + List> nodes = this.entity.getChildren(childDefinition); + List proxies = NodeProxy.fromList(this, nodes, context); + result.put(childDefinition.getId(), proxies); } - return null; + return result; } - - public NodeProxy(EntityProxy parent, Node node, ProxyContext context) { - super(); - this.node = node; - this.context = context; + + public List getChildrenRelevance() { + List result = new ArrayList(availableChildDefinitions.size()); + for (NodeDefinition childDefinition : availableChildDefinitions) { + boolean relevant = entity.isRelevant(childDefinition); + result.add(relevant); + } + return result; } - public static List fromList(EntityProxy parent, - List> list, ProxyContext context) { - List result = new ArrayList<>(); - if(list != null) { - for (Node node : list) { - NodeProxy proxy; - if(node instanceof Attribute) { - if(node instanceof CodeAttribute) { - proxy = new CodeAttributeProxy(parent, (CodeAttribute) node, context); - } else { - proxy = new AttributeProxy(parent, (Attribute) node, context); - } - } else { - proxy = new EntityProxy(parent, (Entity) node, context); - } - result.add(proxy); - } + public List getChildrenMinCountValidation() { + List result = new ArrayList(availableChildDefinitions.size()); + for (NodeDefinition childDefinition : availableChildDefinitions) { + ValidationResultFlag valid = entity.getMinCountValidationResult(childDefinition); + result.add(valid); + } + return result; + } + + public List getChildrenMaxCountValidation() { + List result = new ArrayList(availableChildDefinitions.size()); + for (NodeDefinition childDefinition : availableChildDefinitions) { + ValidationResultFlag valid = entity.getMaxCountValidationResult(childDefinition); + result.add(valid); } return result; } - public Integer getId() { - return node.getInternalId(); + public List getChildrenMinCount() { + List result = new ArrayList(availableChildDefinitions.size()); + for (NodeDefinition childDefinition : availableChildDefinitions) { + int count = entity.getMinCount(childDefinition); + result.add(count); + } + return result; } - public Integer getDefinitionId() { - if(node.getDefinition() == null) { - return null; - } else { - return node.getDefinition().getId(); + public List getChildrenMaxCount() { + List result = new ArrayList(availableChildDefinitions.size()); + for (NodeDefinition childDefinition : availableChildDefinitions) { + Integer count = entity.getMaxCount(childDefinition); + result.add(count); } + return result; } - - public Integer getParentId() { - if(node.getParent() == null) { - return null; - } else { - return node.getParent().getInternalId(); + + public List getChildrenErrorVisible() { + List result = new ArrayList(availableChildDefinitions.size()); + for (int i = 0; i < availableChildDefinitions.size(); i++) { + result.add(Boolean.FALSE); } + return result; + } + + private List getAvailableChildDefinitions() { + List result = new ArrayList(); + UIOptions uiOptions = ((CollectSurvey) entity.getSurvey()).getUIOptions(); + for (NodeDefinition childDefinition : getChildDefinitions()) { + if ( isApplicable(childDefinition) && ! uiOptions.isHidden(childDefinition) ) { + result.add(childDefinition); + } + } + return result; } - protected MessageSource getMessageSource() { - return context.getMessageSource(); + protected boolean isApplicable(NodeDefinition childDefinition) { + Record record = entity.getRecord(); + ModelVersion version = record.getVersion(); + return version == null || version.isApplicable(childDefinition); } - - protected Locale getLocale() { - return context.getLocale(); + + public boolean isEnumerated() { + EntityDefinition definition = entity.getDefinition(); + return definition.isEnumerable(); } + + private List getChildDefinitions() { + EntityDefinition definition = entity.getDefinition(); + return definition.getChildDefinitions(); + } + } From a9bdf091c8e0917beeea91816f897a9f419a4c5b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:51 +0100 Subject: [PATCH 1588/1620] New translations NodeChangeProxy.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 70 +++++++++++++++++-- 1 file changed, 65 insertions(+), 5 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 08b48cb25c..ab9b8602b0 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,10 +1,70 @@ -package org.openforis.collect; +package org.openforis.collect.model.proxy; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Locale; + +import org.openforis.collect.Proxy; +import org.openforis.collect.ProxyContext; +import org.openforis.collect.manager.MessageSource; +import org.openforis.collect.model.AttributeAddChange; +import org.openforis.collect.model.AttributeChange; +import org.openforis.collect.model.EntityAddChange; +import org.openforis.collect.model.EntityChange; +import org.openforis.collect.model.NodeChange; +import org.openforis.collect.model.NodeDeleteChange; + /** * - * @author M. Togna - * + * @author S. Ricci + * + * @param The type of NodeChange */ -public interface Proxy { +public class NodeChangeProxy> implements Proxy { + + protected C change; + protected ProxyContext context; + + public NodeChangeProxy(C change, ProxyContext context) { + this.context = context; + } + + public static List> fromList(Collection> items, ProxyContext context) { + List> result = new ArrayList<>(); + if ( items != null ) { + for (NodeChange item : items) { + NodeChangeProxy proxy; + if ( item instanceof AttributeAddChange ) { + proxy = new AttributeAddChangeProxy((AttributeAddChange) item, context); + } else if ( item instanceof EntityAddChange ) { + proxy = new EntityAddChangeProxy((EntityAddChange) item, context); + } else if ( item instanceof AttributeChange ) { + proxy = new AttributeChangeProxy((AttributeChange) item, context); + } else if ( item instanceof EntityChange) { + proxy = new EntityChangeProxy((EntityChange) item, context); + } else if ( item instanceof NodeDeleteChange ) { + proxy = new NodeDeleteChangeProxy((NodeDeleteChange) item, context); + } else { + throw new IllegalArgumentException("NodeChange type not supported: " + item.getClass().getSimpleName()); + } + result.add(proxy); + } + } + return result; + } + + public int getNodeId() { + return change.getNode().getInternalId(); + } + + protected Locale getLocale() { + return context.getLocale(); + } + + protected MessageSource getMessageSource() { + return context.getMessageSource(); + } -} +} \ No newline at end of file From b199a6ab617435e85f52158254b78364650cb7f1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:52 +0100 Subject: [PATCH 1589/1620] New translations FieldProxy.java (French) --- .../earth/app/view/Messages_fr.properties | 68 +++++++++++++++++-- 1 file changed, 63 insertions(+), 5 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 08b48cb25c..11b4d244d0 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,10 +1,68 @@ -package org.openforis.collect; - /** * - * @author M. Togna - * */ -public interface Proxy { +package org.openforis.collect.model.proxy; + +import java.util.ArrayList; +import java.util.List; + +import org.openforis.collect.Proxy; +import org.openforis.collect.model.FieldSymbol; +import org.openforis.idm.model.Field; + +/** + * @author S. Ricci + * + */ +public class FieldProxy implements Proxy { + + private Object value; + private FieldSymbol symbol; + private String remarks; + + public FieldProxy(Field field) { + super(); + value = field.getValue(); + if(field.getSymbol() != null) { + symbol = FieldSymbol.valueOf(field.getSymbol()); + } + remarks = field.getRemarks(); + } + + + public static List fromList(List> list) { + List proxies = new ArrayList(); + if (list != null) { + for (Field item : list) { + FieldProxy proxy = new FieldProxy(item); + proxies.add(proxy); + } + } + return proxies; + } + + public Object getValue() { + return value; + } + + public void setValue(Object value) { + this.value = value; + } + + public String getRemarks() { + return remarks; + } + public FieldSymbol getSymbol() { + return symbol; + } + + public void setSymbol(FieldSymbol symbol) { + this.symbol = symbol; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + } From 569a55eddcfc1987a38383bf3bea04ade755f32d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:54 +0100 Subject: [PATCH 1590/1620] New translations FieldProxy.java (Spanish) --- .../earth/app/view/Messages_es.properties | 178 ++++-------------- 1 file changed, 35 insertions(+), 143 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index af82dc31fd..11b4d244d0 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -4,173 +4,65 @@ package org.openforis.collect.model.proxy; import java.util.ArrayList; -import java.util.Date; import java.util.List; import org.openforis.collect.Proxy; -import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.CollectRecord.State; -import org.openforis.collect.model.CollectRecord.Step; -import org.openforis.collect.model.User; -import org.openforis.idm.model.Entity; +import org.openforis.collect.model.FieldSymbol; +import org.openforis.idm.model.Field; /** - * @author M. Togna * @author S. Ricci - * + * */ -public class RecordProxy implements Proxy { - - private CollectRecord record; - private ProxyContext context; +public class FieldProxy implements Proxy { - private Integer errors; - private Integer skipped; - private Integer missing; - private Integer missingErrors; - private Integer missingWarnings; - private Integer warnings; - private UserProxy owner; - - public RecordProxy(CollectRecord record, ProxyContext context) { - this.record = record; - this.context = context; - - errors = record.getErrors(); - skipped = record.getSkipped(); - missing = record.getMissing(); - missingErrors = record.getMissingErrors(); - missingWarnings = record.getMissingWarnings(); - warnings = record.getWarnings(); - owner = record.getOwner() == null ? null: new UserProxy(record.getOwner()); - } + private Object value; + private FieldSymbol symbol; + private String remarks; - public static List fromList(List records, ProxyContext context) { - List result = new ArrayList<>(); - if ( records != null ) { - for (CollectRecord collectRecord : records) { - result.add(new RecordProxy(collectRecord, context)); - } + public FieldProxy(Field field) { + super(); + value = field.getValue(); + if(field.getSymbol() != null) { + symbol = FieldSymbol.valueOf(field.getSymbol()); } - return result; - } - - public Step getStep() { - return record.getStep(); - } - - public State getState() { - return record.getState(); - } - - public Date getCreationDate() { - return record.getCreationDate(); - } - - public UserProxy getCreatedBy() { - User createdBy = record.getCreatedBy(); - return createdBy == null ? null: new UserProxy(createdBy); - } - - public Date getModifiedDate() { - return record.getModifiedDate(); - } - - public Integer getId() { - return record.getId(); - } - - public UserProxy getModifiedBy() { - User modifiedBy = record.getModifiedBy(); - return modifiedBy == null ? null: new UserProxy(modifiedBy); - } - - public EntityProxy getRootEntity() { - Entity rootEntity = record.getRootEntity(); - return rootEntity == null ? null: new EntityProxy(null, record.getRootEntity(), context); + remarks = field.getRemarks(); } - public List getRootEntityKeys() { - return record.getRootEntityKeyValues(); - } - - public List getEntityCounts() { - return record.getEntityCounts(); - } - public boolean isEntryComplete() { - if(record.getStep() != null) { - switch(record.getStep()) { - case ENTRY: - return false; - case CLEANSING: - case ANALYSIS: - return true; + public static List fromList(List> list) { + List proxies = new ArrayList(); + if (list != null) { + for (Field item : list) { + FieldProxy proxy = new FieldProxy(item); + proxies.add(proxy); } } - return false; + return proxies; } - public boolean isCleansingComplete() { - return ( - record.getStep() != null && record.getStep().equals( Step.ANALYSIS) - ); + public Object getValue() { + return value; } - - public Integer getErrors() { - return errors; - } - - public void setErrors(Integer errors) { - this.errors = errors; - } - - public Integer getSkipped() { - return skipped; - } - - public void setSkipped(Integer skipped) { - this.skipped = skipped; - } - - public Integer getMissing() { - return missing; - } - - public void setMissing(Integer missing) { - this.missing = missing; - } - - public Integer getWarnings() { - return warnings; - } - - public void setWarnings(Integer warnings) { - this.warnings = warnings; - } - - public Integer getMissingErrors() { - return missingErrors; - } - - public void setMissingErrors(Integer missingErrors) { - this.missingErrors = missingErrors; + + public void setValue(Object value) { + this.value = value; } - public Integer getMissingWarnings() { - return missingWarnings; + public String getRemarks() { + return remarks; } - public void setMissingWarnings(Integer missingWarnings) { - this.missingWarnings = missingWarnings; + public FieldSymbol getSymbol() { + return symbol; } - - public UserProxy getOwner() { - return owner; + + public void setSymbol(FieldSymbol symbol) { + this.symbol = symbol; } - public void setOwner(UserProxy owner) { - this.owner = owner; + public void setRemarks(String remarks) { + this.remarks = remarks; } + } From 55604dc5246300a4e5c2d705c6bd28198d1db7a4 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:55 +0100 Subject: [PATCH 1591/1620] New translations FieldProxy.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 90 +++++++++---------- 1 file changed, 44 insertions(+), 46 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index ab9b8602b0..11b4d244d0 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,70 +1,68 @@ +/** + * + */ package org.openforis.collect.model.proxy; import java.util.ArrayList; -import java.util.Collection; import java.util.List; -import java.util.Locale; import org.openforis.collect.Proxy; -import org.openforis.collect.ProxyContext; -import org.openforis.collect.manager.MessageSource; -import org.openforis.collect.model.AttributeAddChange; -import org.openforis.collect.model.AttributeChange; -import org.openforis.collect.model.EntityAddChange; -import org.openforis.collect.model.EntityChange; -import org.openforis.collect.model.NodeChange; -import org.openforis.collect.model.NodeDeleteChange; - +import org.openforis.collect.model.FieldSymbol; +import org.openforis.idm.model.Field; /** - * * @author S. Ricci * - * @param The type of NodeChange */ -public class NodeChangeProxy> implements Proxy { +public class FieldProxy implements Proxy { - protected C change; - protected ProxyContext context; + private Object value; + private FieldSymbol symbol; + private String remarks; - public NodeChangeProxy(C change, ProxyContext context) { - this.context = context; + public FieldProxy(Field field) { + super(); + value = field.getValue(); + if(field.getSymbol() != null) { + symbol = FieldSymbol.valueOf(field.getSymbol()); + } + remarks = field.getRemarks(); } - public static List> fromList(Collection> items, ProxyContext context) { - List> result = new ArrayList<>(); - if ( items != null ) { - for (NodeChange item : items) { - NodeChangeProxy proxy; - if ( item instanceof AttributeAddChange ) { - proxy = new AttributeAddChangeProxy((AttributeAddChange) item, context); - } else if ( item instanceof EntityAddChange ) { - proxy = new EntityAddChangeProxy((EntityAddChange) item, context); - } else if ( item instanceof AttributeChange ) { - proxy = new AttributeChangeProxy((AttributeChange) item, context); - } else if ( item instanceof EntityChange) { - proxy = new EntityChangeProxy((EntityChange) item, context); - } else if ( item instanceof NodeDeleteChange ) { - proxy = new NodeDeleteChangeProxy((NodeDeleteChange) item, context); - } else { - throw new IllegalArgumentException("NodeChange type not supported: " + item.getClass().getSimpleName()); - } - result.add(proxy); + + public static List fromList(List> list) { + List proxies = new ArrayList(); + if (list != null) { + for (Field item : list) { + FieldProxy proxy = new FieldProxy(item); + proxies.add(proxy); } } - return result; + return proxies; } - public int getNodeId() { - return change.getNode().getInternalId(); + public Object getValue() { + return value; } - protected Locale getLocale() { - return context.getLocale(); + public void setValue(Object value) { + this.value = value; } - - protected MessageSource getMessageSource() { - return context.getMessageSource(); + + public String getRemarks() { + return remarks; } -} \ No newline at end of file + public FieldSymbol getSymbol() { + return symbol; + } + + public void setSymbol(FieldSymbol symbol) { + this.symbol = symbol; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + +} From fc942ed9c2f01e49e77eae4d313a68514e6983b3 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:56 +0100 Subject: [PATCH 1592/1620] New translations FieldProxy.java (English) --- .../earth/app/view/Messages_en.properties | 130 +++++------------- 1 file changed, 35 insertions(+), 95 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 71392d44df..11b4d244d0 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -4,125 +4,65 @@ package org.openforis.collect.model.proxy; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import org.openforis.collect.ProxyContext; -import org.openforis.collect.metamodel.ui.UIOptions; -import org.openforis.collect.model.CollectSurvey; -import org.openforis.idm.metamodel.EntityDefinition; -import org.openforis.idm.metamodel.ModelVersion; -import org.openforis.idm.metamodel.NodeDefinition; -import org.openforis.idm.metamodel.validation.ValidationResultFlag; -import org.openforis.idm.model.Entity; -import org.openforis.idm.model.Node; -import org.openforis.idm.model.Record; +import org.openforis.collect.Proxy; +import org.openforis.collect.model.FieldSymbol; +import org.openforis.idm.model.Field; /** - * @author M. Togna * @author S. Ricci - * + * */ -public class EntityProxy extends NodeProxy { +public class FieldProxy implements Proxy { - private Entity entity; - private List availableChildDefinitions; - - public EntityProxy(EntityProxy parent, Entity entity, ProxyContext context) { - super(parent, entity, context); - this.entity = entity; - this.availableChildDefinitions = getAvailableChildDefinitions(); - } + private Object value; + private FieldSymbol symbol; + private String remarks; - public Map> getChildrenByDefinitionId() { - Map> result = new HashMap>(); - for (NodeDefinition childDefinition : availableChildDefinitions) { - List> nodes = this.entity.getChildren(childDefinition); - List proxies = NodeProxy.fromList(this, nodes, context); - result.put(childDefinition.getId(), proxies); + public FieldProxy(Field field) { + super(); + value = field.getValue(); + if(field.getSymbol() != null) { + symbol = FieldSymbol.valueOf(field.getSymbol()); } - return result; + remarks = field.getRemarks(); } - public List getChildrenRelevance() { - List result = new ArrayList(availableChildDefinitions.size()); - for (NodeDefinition childDefinition : availableChildDefinitions) { - boolean relevant = entity.isRelevant(childDefinition); - result.add(relevant); - } - return result; - } - public List getChildrenMinCountValidation() { - List result = new ArrayList(availableChildDefinitions.size()); - for (NodeDefinition childDefinition : availableChildDefinitions) { - ValidationResultFlag valid = entity.getMinCountValidationResult(childDefinition); - result.add(valid); - } - return result; - } - - public List getChildrenMaxCountValidation() { - List result = new ArrayList(availableChildDefinitions.size()); - for (NodeDefinition childDefinition : availableChildDefinitions) { - ValidationResultFlag valid = entity.getMaxCountValidationResult(childDefinition); - result.add(valid); + public static List fromList(List> list) { + List proxies = new ArrayList(); + if (list != null) { + for (Field item : list) { + FieldProxy proxy = new FieldProxy(item); + proxies.add(proxy); + } } - return result; + return proxies; } - public List getChildrenMinCount() { - List result = new ArrayList(availableChildDefinitions.size()); - for (NodeDefinition childDefinition : availableChildDefinitions) { - int count = entity.getMinCount(childDefinition); - result.add(count); - } - return result; + public Object getValue() { + return value; } - - public List getChildrenMaxCount() { - List result = new ArrayList(availableChildDefinitions.size()); - for (NodeDefinition childDefinition : availableChildDefinitions) { - Integer count = entity.getMaxCount(childDefinition); - result.add(count); - } - return result; + + public void setValue(Object value) { + this.value = value; } - public List getChildrenErrorVisible() { - List result = new ArrayList(availableChildDefinitions.size()); - for (int i = 0; i < availableChildDefinitions.size(); i++) { - result.add(Boolean.FALSE); - } - return result; + public String getRemarks() { + return remarks; } - private List getAvailableChildDefinitions() { - List result = new ArrayList(); - UIOptions uiOptions = ((CollectSurvey) entity.getSurvey()).getUIOptions(); - for (NodeDefinition childDefinition : getChildDefinitions()) { - if ( isApplicable(childDefinition) && ! uiOptions.isHidden(childDefinition) ) { - result.add(childDefinition); - } - } - return result; - } - - protected boolean isApplicable(NodeDefinition childDefinition) { - Record record = entity.getRecord(); - ModelVersion version = record.getVersion(); - return version == null || version.isApplicable(childDefinition); + public FieldSymbol getSymbol() { + return symbol; } - public boolean isEnumerated() { - EntityDefinition definition = entity.getDefinition(); - return definition.isEnumerable(); + public void setSymbol(FieldSymbol symbol) { + this.symbol = symbol; } - private List getChildDefinitions() { - EntityDefinition definition = entity.getDefinition(); - return definition.getChildDefinitions(); + public void setRemarks(String remarks) { + this.remarks = remarks; } } From ffe563f8ca3836cbe4d0c6ae67c8eb18a63424aa Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:57 +0100 Subject: [PATCH 1593/1620] New translations NodeAddChangeProxy.java (French) --- .../earth/app/view/Messages_fr.properties | 62 ++----------------- 1 file changed, 4 insertions(+), 58 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 11b4d244d0..2cea96468e 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,68 +1,14 @@ -/** - * - */ package org.openforis.collect.model.proxy; -import java.util.ArrayList; -import java.util.List; -import org.openforis.collect.Proxy; -import org.openforis.collect.model.FieldSymbol; -import org.openforis.idm.model.Field; /** + * * @author S. Ricci * */ -public class FieldProxy implements Proxy { - - private Object value; - private FieldSymbol symbol; - private String remarks; - - public FieldProxy(Field field) { - super(); - value = field.getValue(); - if(field.getSymbol() != null) { - symbol = FieldSymbol.valueOf(field.getSymbol()); - } - remarks = field.getRemarks(); - } - - - public static List fromList(List> list) { - List proxies = new ArrayList(); - if (list != null) { - for (Field item : list) { - FieldProxy proxy = new FieldProxy(item); - proxies.add(proxy); - } - } - return proxies; - } - - public Object getValue() { - return value; - } - - public void setValue(Object value) { - this.value = value; - } - - public String getRemarks() { - return remarks; - } - - public FieldSymbol getSymbol() { - return symbol; - } - - public void setSymbol(FieldSymbol symbol) { - this.symbol = symbol; - } +public interface NodeAddChangeProxy { - public void setRemarks(String remarks) { - this.remarks = remarks; - } + NodeProxy getCreatedNode(); -} +} \ No newline at end of file From 345062ea6eb89baee034f22cdc5e6dec61936920 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:58 +0100 Subject: [PATCH 1594/1620] New translations NodeAddChangeProxy.java (Spanish) --- .../earth/app/view/Messages_es.properties | 62 ++----------------- 1 file changed, 4 insertions(+), 58 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 11b4d244d0..2cea96468e 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,68 +1,14 @@ -/** - * - */ package org.openforis.collect.model.proxy; -import java.util.ArrayList; -import java.util.List; -import org.openforis.collect.Proxy; -import org.openforis.collect.model.FieldSymbol; -import org.openforis.idm.model.Field; /** + * * @author S. Ricci * */ -public class FieldProxy implements Proxy { - - private Object value; - private FieldSymbol symbol; - private String remarks; - - public FieldProxy(Field field) { - super(); - value = field.getValue(); - if(field.getSymbol() != null) { - symbol = FieldSymbol.valueOf(field.getSymbol()); - } - remarks = field.getRemarks(); - } - - - public static List fromList(List> list) { - List proxies = new ArrayList(); - if (list != null) { - for (Field item : list) { - FieldProxy proxy = new FieldProxy(item); - proxies.add(proxy); - } - } - return proxies; - } - - public Object getValue() { - return value; - } - - public void setValue(Object value) { - this.value = value; - } - - public String getRemarks() { - return remarks; - } - - public FieldSymbol getSymbol() { - return symbol; - } - - public void setSymbol(FieldSymbol symbol) { - this.symbol = symbol; - } +public interface NodeAddChangeProxy { - public void setRemarks(String remarks) { - this.remarks = remarks; - } + NodeProxy getCreatedNode(); -} +} \ No newline at end of file From 0d73d672ebd84b1e932c82dba23bad2642207e7d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:51:59 +0100 Subject: [PATCH 1595/1620] New translations NodeAddChangeProxy.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 62 ++----------------- 1 file changed, 4 insertions(+), 58 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 11b4d244d0..2cea96468e 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,68 +1,14 @@ -/** - * - */ package org.openforis.collect.model.proxy; -import java.util.ArrayList; -import java.util.List; -import org.openforis.collect.Proxy; -import org.openforis.collect.model.FieldSymbol; -import org.openforis.idm.model.Field; /** + * * @author S. Ricci * */ -public class FieldProxy implements Proxy { - - private Object value; - private FieldSymbol symbol; - private String remarks; - - public FieldProxy(Field field) { - super(); - value = field.getValue(); - if(field.getSymbol() != null) { - symbol = FieldSymbol.valueOf(field.getSymbol()); - } - remarks = field.getRemarks(); - } - - - public static List fromList(List> list) { - List proxies = new ArrayList(); - if (list != null) { - for (Field item : list) { - FieldProxy proxy = new FieldProxy(item); - proxies.add(proxy); - } - } - return proxies; - } - - public Object getValue() { - return value; - } - - public void setValue(Object value) { - this.value = value; - } - - public String getRemarks() { - return remarks; - } - - public FieldSymbol getSymbol() { - return symbol; - } - - public void setSymbol(FieldSymbol symbol) { - this.symbol = symbol; - } +public interface NodeAddChangeProxy { - public void setRemarks(String remarks) { - this.remarks = remarks; - } + NodeProxy getCreatedNode(); -} +} \ No newline at end of file From 782b9344c880e1950d8acaec67c31d89c04c2f29 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:52:00 +0100 Subject: [PATCH 1596/1620] New translations NodeAddChangeProxy.java (English) --- .../earth/app/view/Messages_en.properties | 62 ++----------------- 1 file changed, 4 insertions(+), 58 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 11b4d244d0..2cea96468e 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,68 +1,14 @@ -/** - * - */ package org.openforis.collect.model.proxy; -import java.util.ArrayList; -import java.util.List; -import org.openforis.collect.Proxy; -import org.openforis.collect.model.FieldSymbol; -import org.openforis.idm.model.Field; /** + * * @author S. Ricci * */ -public class FieldProxy implements Proxy { - - private Object value; - private FieldSymbol symbol; - private String remarks; - - public FieldProxy(Field field) { - super(); - value = field.getValue(); - if(field.getSymbol() != null) { - symbol = FieldSymbol.valueOf(field.getSymbol()); - } - remarks = field.getRemarks(); - } - - - public static List fromList(List> list) { - List proxies = new ArrayList(); - if (list != null) { - for (Field item : list) { - FieldProxy proxy = new FieldProxy(item); - proxies.add(proxy); - } - } - return proxies; - } - - public Object getValue() { - return value; - } - - public void setValue(Object value) { - this.value = value; - } - - public String getRemarks() { - return remarks; - } - - public FieldSymbol getSymbol() { - return symbol; - } - - public void setSymbol(FieldSymbol symbol) { - this.symbol = symbol; - } +public interface NodeAddChangeProxy { - public void setRemarks(String remarks) { - this.remarks = remarks; - } + NodeProxy getCreatedNode(); -} +} \ No newline at end of file From 486d90500b3429aef57ea8ebf54c5f2d0c7d07c9 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:52:01 +0100 Subject: [PATCH 1597/1620] New translations NodeChangeProxy.java (French) --- .../earth/app/view/Messages_fr.properties | 60 ++++++++++++++++++- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 2cea96468e..ab9b8602b0 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,14 +1,70 @@ package org.openforis.collect.model.proxy; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Locale; + +import org.openforis.collect.Proxy; +import org.openforis.collect.ProxyContext; +import org.openforis.collect.manager.MessageSource; +import org.openforis.collect.model.AttributeAddChange; +import org.openforis.collect.model.AttributeChange; +import org.openforis.collect.model.EntityAddChange; +import org.openforis.collect.model.EntityChange; +import org.openforis.collect.model.NodeChange; +import org.openforis.collect.model.NodeDeleteChange; /** * * @author S. Ricci * + * @param The type of NodeChange */ -public interface NodeAddChangeProxy { +public class NodeChangeProxy> implements Proxy { + + protected C change; + protected ProxyContext context; + + public NodeChangeProxy(C change, ProxyContext context) { + this.context = context; + } + + public static List> fromList(Collection> items, ProxyContext context) { + List> result = new ArrayList<>(); + if ( items != null ) { + for (NodeChange item : items) { + NodeChangeProxy proxy; + if ( item instanceof AttributeAddChange ) { + proxy = new AttributeAddChangeProxy((AttributeAddChange) item, context); + } else if ( item instanceof EntityAddChange ) { + proxy = new EntityAddChangeProxy((EntityAddChange) item, context); + } else if ( item instanceof AttributeChange ) { + proxy = new AttributeChangeProxy((AttributeChange) item, context); + } else if ( item instanceof EntityChange) { + proxy = new EntityChangeProxy((EntityChange) item, context); + } else if ( item instanceof NodeDeleteChange ) { + proxy = new NodeDeleteChangeProxy((NodeDeleteChange) item, context); + } else { + throw new IllegalArgumentException("NodeChange type not supported: " + item.getClass().getSimpleName()); + } + result.add(proxy); + } + } + return result; + } + + public int getNodeId() { + return change.getNode().getInternalId(); + } - NodeProxy getCreatedNode(); + protected Locale getLocale() { + return context.getLocale(); + } + protected MessageSource getMessageSource() { + return context.getMessageSource(); + } + } \ No newline at end of file From c53e927c4ebad92db6cafbc397c830e47abd173b Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:52:03 +0100 Subject: [PATCH 1598/1620] New translations NodeChangeProxy.java (Spanish) --- .../earth/app/view/Messages_es.properties | 60 ++++++++++++++++++- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 2cea96468e..ab9b8602b0 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,14 +1,70 @@ package org.openforis.collect.model.proxy; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Locale; + +import org.openforis.collect.Proxy; +import org.openforis.collect.ProxyContext; +import org.openforis.collect.manager.MessageSource; +import org.openforis.collect.model.AttributeAddChange; +import org.openforis.collect.model.AttributeChange; +import org.openforis.collect.model.EntityAddChange; +import org.openforis.collect.model.EntityChange; +import org.openforis.collect.model.NodeChange; +import org.openforis.collect.model.NodeDeleteChange; /** * * @author S. Ricci * + * @param The type of NodeChange */ -public interface NodeAddChangeProxy { +public class NodeChangeProxy> implements Proxy { + + protected C change; + protected ProxyContext context; + + public NodeChangeProxy(C change, ProxyContext context) { + this.context = context; + } + + public static List> fromList(Collection> items, ProxyContext context) { + List> result = new ArrayList<>(); + if ( items != null ) { + for (NodeChange item : items) { + NodeChangeProxy proxy; + if ( item instanceof AttributeAddChange ) { + proxy = new AttributeAddChangeProxy((AttributeAddChange) item, context); + } else if ( item instanceof EntityAddChange ) { + proxy = new EntityAddChangeProxy((EntityAddChange) item, context); + } else if ( item instanceof AttributeChange ) { + proxy = new AttributeChangeProxy((AttributeChange) item, context); + } else if ( item instanceof EntityChange) { + proxy = new EntityChangeProxy((EntityChange) item, context); + } else if ( item instanceof NodeDeleteChange ) { + proxy = new NodeDeleteChangeProxy((NodeDeleteChange) item, context); + } else { + throw new IllegalArgumentException("NodeChange type not supported: " + item.getClass().getSimpleName()); + } + result.add(proxy); + } + } + return result; + } + + public int getNodeId() { + return change.getNode().getInternalId(); + } - NodeProxy getCreatedNode(); + protected Locale getLocale() { + return context.getLocale(); + } + protected MessageSource getMessageSource() { + return context.getMessageSource(); + } + } \ No newline at end of file From 924cfa7326c256f18f8b8d48f82b2db49efdf031 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:52:04 +0100 Subject: [PATCH 1599/1620] New translations NodeChangeProxy.java (English) --- .../earth/app/view/Messages_en.properties | 60 ++++++++++++++++++- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 2cea96468e..ab9b8602b0 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,14 +1,70 @@ package org.openforis.collect.model.proxy; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Locale; + +import org.openforis.collect.Proxy; +import org.openforis.collect.ProxyContext; +import org.openforis.collect.manager.MessageSource; +import org.openforis.collect.model.AttributeAddChange; +import org.openforis.collect.model.AttributeChange; +import org.openforis.collect.model.EntityAddChange; +import org.openforis.collect.model.EntityChange; +import org.openforis.collect.model.NodeChange; +import org.openforis.collect.model.NodeDeleteChange; /** * * @author S. Ricci * + * @param The type of NodeChange */ -public interface NodeAddChangeProxy { +public class NodeChangeProxy> implements Proxy { + + protected C change; + protected ProxyContext context; + + public NodeChangeProxy(C change, ProxyContext context) { + this.context = context; + } + + public static List> fromList(Collection> items, ProxyContext context) { + List> result = new ArrayList<>(); + if ( items != null ) { + for (NodeChange item : items) { + NodeChangeProxy proxy; + if ( item instanceof AttributeAddChange ) { + proxy = new AttributeAddChangeProxy((AttributeAddChange) item, context); + } else if ( item instanceof EntityAddChange ) { + proxy = new EntityAddChangeProxy((EntityAddChange) item, context); + } else if ( item instanceof AttributeChange ) { + proxy = new AttributeChangeProxy((AttributeChange) item, context); + } else if ( item instanceof EntityChange) { + proxy = new EntityChangeProxy((EntityChange) item, context); + } else if ( item instanceof NodeDeleteChange ) { + proxy = new NodeDeleteChangeProxy((NodeDeleteChange) item, context); + } else { + throw new IllegalArgumentException("NodeChange type not supported: " + item.getClass().getSimpleName()); + } + result.add(proxy); + } + } + return result; + } + + public int getNodeId() { + return change.getNode().getInternalId(); + } - NodeProxy getCreatedNode(); + protected Locale getLocale() { + return context.getLocale(); + } + protected MessageSource getMessageSource() { + return context.getMessageSource(); + } + } \ No newline at end of file From 5c6c59fd3adc39b03311116d081ddc9f7c0e3b9e Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:52:05 +0100 Subject: [PATCH 1600/1620] New translations NodeProxy.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 85 ++++++++++++++++++- 1 file changed, 81 insertions(+), 4 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 2cea96468e..f52885c52c 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,14 +1,91 @@ +/** + * + */ package org.openforis.collect.model.proxy; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import org.openforis.collect.Proxy; +import org.openforis.collect.ProxyContext; +import org.openforis.collect.manager.MessageSource; +import org.openforis.idm.model.Attribute; +import org.openforis.idm.model.CodeAttribute; +import org.openforis.idm.model.Entity; +import org.openforis.idm.model.Node; /** - * * @author S. Ricci + * @author M. Togna * */ -public interface NodeAddChangeProxy { +public class NodeProxy implements Proxy { + + private Node node; + protected ProxyContext context; - NodeProxy getCreatedNode(); + public static NodeProxy fromNode(Node node, ProxyContext context) { + if (node instanceof Attribute) { + return new AttributeProxy(null, (Attribute) node, context); + } else if (node instanceof Entity) { + return new EntityProxy(null, (Entity) node, context); + } + return null; + } -} \ No newline at end of file + public NodeProxy(EntityProxy parent, Node node, ProxyContext context) { + super(); + this.node = node; + this.context = context; + } + + public static List fromList(EntityProxy parent, + List> list, ProxyContext context) { + List result = new ArrayList<>(); + if(list != null) { + for (Node node : list) { + NodeProxy proxy; + if(node instanceof Attribute) { + if(node instanceof CodeAttribute) { + proxy = new CodeAttributeProxy(parent, (CodeAttribute) node, context); + } else { + proxy = new AttributeProxy(parent, (Attribute) node, context); + } + } else { + proxy = new EntityProxy(parent, (Entity) node, context); + } + result.add(proxy); + } + } + return result; + } + + public Integer getId() { + return node.getInternalId(); + } + + public Integer getDefinitionId() { + if(node.getDefinition() == null) { + return null; + } else { + return node.getDefinition().getId(); + } + } + + public Integer getParentId() { + if(node.getParent() == null) { + return null; + } else { + return node.getParent().getInternalId(); + } + } + + protected MessageSource getMessageSource() { + return context.getMessageSource(); + } + + protected Locale getLocale() { + return context.getLocale(); + } +} From b52f59a3a2d054dccc9a1fe055aed6525d4209c8 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:52:06 +0100 Subject: [PATCH 1601/1620] New translations NodeChangeSetProxy.java (French) --- .../earth/app/view/Messages_fr.properties | 95 +++++++++---------- 1 file changed, 46 insertions(+), 49 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index ab9b8602b0..0f769ec936 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,70 +1,67 @@ +/** + * + */ package org.openforis.collect.model.proxy; -import java.util.ArrayList; -import java.util.Collection; import java.util.List; -import java.util.Locale; import org.openforis.collect.Proxy; import org.openforis.collect.ProxyContext; -import org.openforis.collect.manager.MessageSource; -import org.openforis.collect.model.AttributeAddChange; -import org.openforis.collect.model.AttributeChange; -import org.openforis.collect.model.EntityAddChange; -import org.openforis.collect.model.EntityChange; -import org.openforis.collect.model.NodeChange; -import org.openforis.collect.model.NodeDeleteChange; - +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.NodeChangeSet; /** - * * @author S. Ricci * - * @param The type of NodeChange */ -public class NodeChangeProxy> implements Proxy { - - protected C change; - protected ProxyContext context; +public class NodeChangeSetProxy implements Proxy { - public NodeChangeProxy(C change, ProxyContext context) { + private NodeChangeSet changeSet; + private CollectRecord record; + private boolean recordSaved; + private ProxyContext context; + + public NodeChangeSetProxy(CollectRecord record, NodeChangeSet changeSet, ProxyContext context) { + super(); + this.record = record; + this.changeSet = changeSet; this.context = context; } - public static List> fromList(Collection> items, ProxyContext context) { - List> result = new ArrayList<>(); - if ( items != null ) { - for (NodeChange item : items) { - NodeChangeProxy proxy; - if ( item instanceof AttributeAddChange ) { - proxy = new AttributeAddChangeProxy((AttributeAddChange) item, context); - } else if ( item instanceof EntityAddChange ) { - proxy = new EntityAddChangeProxy((EntityAddChange) item, context); - } else if ( item instanceof AttributeChange ) { - proxy = new AttributeChangeProxy((AttributeChange) item, context); - } else if ( item instanceof EntityChange) { - proxy = new EntityChangeProxy((EntityChange) item, context); - } else if ( item instanceof NodeDeleteChange ) { - proxy = new NodeDeleteChangeProxy((NodeDeleteChange) item, context); - } else { - throw new IllegalArgumentException("NodeChange type not supported: " + item.getClass().getSimpleName()); - } - result.add(proxy); - } - } - return result; + public List> getChanges() { + return NodeChangeProxy.fromList(changeSet.getChanges(), context); } - - public int getNodeId() { - return change.getNode().getInternalId(); + + public boolean isRecordSaved() { + return recordSaved; } - protected Locale getLocale() { - return context.getLocale(); + public void setRecordSaved(boolean recordSaved) { + this.recordSaved = recordSaved; } - - protected MessageSource getMessageSource() { - return context.getMessageSource(); + + public Integer getErrors() { + return record.getErrors(); } -} \ No newline at end of file + public Integer getSkipped() { + return record.getSkipped(); + } + + public Integer getMissing() { + return record.getMissing(); + } + + public Integer getWarnings() { + return record.getWarnings(); + } + + public Integer getMissingErrors() { + return record.getMissingErrors(); + } + + public Integer getMissingWarnings() { + return record.getMissingWarnings(); + } + +} From 9e222fa2ce17697dbb98a81f0c67e8b019c7640c Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:52:07 +0100 Subject: [PATCH 1602/1620] New translations NodeChangeSetProxy.java (Spanish) --- .../earth/app/view/Messages_es.properties | 95 +++++++++---------- 1 file changed, 46 insertions(+), 49 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index ab9b8602b0..0f769ec936 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,70 +1,67 @@ +/** + * + */ package org.openforis.collect.model.proxy; -import java.util.ArrayList; -import java.util.Collection; import java.util.List; -import java.util.Locale; import org.openforis.collect.Proxy; import org.openforis.collect.ProxyContext; -import org.openforis.collect.manager.MessageSource; -import org.openforis.collect.model.AttributeAddChange; -import org.openforis.collect.model.AttributeChange; -import org.openforis.collect.model.EntityAddChange; -import org.openforis.collect.model.EntityChange; -import org.openforis.collect.model.NodeChange; -import org.openforis.collect.model.NodeDeleteChange; - +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.NodeChangeSet; /** - * * @author S. Ricci * - * @param The type of NodeChange */ -public class NodeChangeProxy> implements Proxy { - - protected C change; - protected ProxyContext context; +public class NodeChangeSetProxy implements Proxy { - public NodeChangeProxy(C change, ProxyContext context) { + private NodeChangeSet changeSet; + private CollectRecord record; + private boolean recordSaved; + private ProxyContext context; + + public NodeChangeSetProxy(CollectRecord record, NodeChangeSet changeSet, ProxyContext context) { + super(); + this.record = record; + this.changeSet = changeSet; this.context = context; } - public static List> fromList(Collection> items, ProxyContext context) { - List> result = new ArrayList<>(); - if ( items != null ) { - for (NodeChange item : items) { - NodeChangeProxy proxy; - if ( item instanceof AttributeAddChange ) { - proxy = new AttributeAddChangeProxy((AttributeAddChange) item, context); - } else if ( item instanceof EntityAddChange ) { - proxy = new EntityAddChangeProxy((EntityAddChange) item, context); - } else if ( item instanceof AttributeChange ) { - proxy = new AttributeChangeProxy((AttributeChange) item, context); - } else if ( item instanceof EntityChange) { - proxy = new EntityChangeProxy((EntityChange) item, context); - } else if ( item instanceof NodeDeleteChange ) { - proxy = new NodeDeleteChangeProxy((NodeDeleteChange) item, context); - } else { - throw new IllegalArgumentException("NodeChange type not supported: " + item.getClass().getSimpleName()); - } - result.add(proxy); - } - } - return result; + public List> getChanges() { + return NodeChangeProxy.fromList(changeSet.getChanges(), context); } - - public int getNodeId() { - return change.getNode().getInternalId(); + + public boolean isRecordSaved() { + return recordSaved; } - protected Locale getLocale() { - return context.getLocale(); + public void setRecordSaved(boolean recordSaved) { + this.recordSaved = recordSaved; } - - protected MessageSource getMessageSource() { - return context.getMessageSource(); + + public Integer getErrors() { + return record.getErrors(); } -} \ No newline at end of file + public Integer getSkipped() { + return record.getSkipped(); + } + + public Integer getMissing() { + return record.getMissing(); + } + + public Integer getWarnings() { + return record.getWarnings(); + } + + public Integer getMissingErrors() { + return record.getMissingErrors(); + } + + public Integer getMissingWarnings() { + return record.getMissingWarnings(); + } + +} From fecd62e95d69659ef139f55f0a72bf862f12fa33 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:52:08 +0100 Subject: [PATCH 1603/1620] New translations NodeChangeSetProxy.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 98 +++++++------------ 1 file changed, 37 insertions(+), 61 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index f52885c52c..0f769ec936 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -3,89 +3,65 @@ */ package org.openforis.collect.model.proxy; -import java.util.ArrayList; import java.util.List; -import java.util.Locale; import org.openforis.collect.Proxy; import org.openforis.collect.ProxyContext; -import org.openforis.collect.manager.MessageSource; -import org.openforis.idm.model.Attribute; -import org.openforis.idm.model.CodeAttribute; -import org.openforis.idm.model.Entity; -import org.openforis.idm.model.Node; +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.NodeChangeSet; /** * @author S. Ricci - * @author M. Togna * */ -public class NodeProxy implements Proxy { +public class NodeChangeSetProxy implements Proxy { - private Node node; - protected ProxyContext context; + private NodeChangeSet changeSet; + private CollectRecord record; + private boolean recordSaved; + private ProxyContext context; - public static NodeProxy fromNode(Node node, ProxyContext context) { - if (node instanceof Attribute) { - return new AttributeProxy(null, (Attribute) node, context); - } else if (node instanceof Entity) { - return new EntityProxy(null, (Entity) node, context); - } - return null; - } - - public NodeProxy(EntityProxy parent, Node node, ProxyContext context) { + public NodeChangeSetProxy(CollectRecord record, NodeChangeSet changeSet, ProxyContext context) { super(); - this.node = node; + this.record = record; + this.changeSet = changeSet; this.context = context; } - public static List fromList(EntityProxy parent, - List> list, ProxyContext context) { - List result = new ArrayList<>(); - if(list != null) { - for (Node node : list) { - NodeProxy proxy; - if(node instanceof Attribute) { - if(node instanceof CodeAttribute) { - proxy = new CodeAttributeProxy(parent, (CodeAttribute) node, context); - } else { - proxy = new AttributeProxy(parent, (Attribute) node, context); - } - } else { - proxy = new EntityProxy(parent, (Entity) node, context); - } - result.add(proxy); - } - } - return result; + public List> getChanges() { + return NodeChangeProxy.fromList(changeSet.getChanges(), context); + } + + public boolean isRecordSaved() { + return recordSaved; } - public Integer getId() { - return node.getInternalId(); + public void setRecordSaved(boolean recordSaved) { + this.recordSaved = recordSaved; } - public Integer getDefinitionId() { - if(node.getDefinition() == null) { - return null; - } else { - return node.getDefinition().getId(); - } + public Integer getErrors() { + return record.getErrors(); } - - public Integer getParentId() { - if(node.getParent() == null) { - return null; - } else { - return node.getParent().getInternalId(); - } + + public Integer getSkipped() { + return record.getSkipped(); } - - protected MessageSource getMessageSource() { - return context.getMessageSource(); + + public Integer getMissing() { + return record.getMissing(); + } + + public Integer getWarnings() { + return record.getWarnings(); } - protected Locale getLocale() { - return context.getLocale(); + public Integer getMissingErrors() { + return record.getMissingErrors(); } + + public Integer getMissingWarnings() { + return record.getMissingWarnings(); + } + } From 1c37248bd6f75cf22b03cb9f542ff5eb29c4f0ea Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:52:09 +0100 Subject: [PATCH 1604/1620] New translations NodeChangeSetProxy.java (English) --- .../earth/app/view/Messages_en.properties | 95 +++++++++---------- 1 file changed, 46 insertions(+), 49 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index ab9b8602b0..0f769ec936 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,70 +1,67 @@ +/** + * + */ package org.openforis.collect.model.proxy; -import java.util.ArrayList; -import java.util.Collection; import java.util.List; -import java.util.Locale; import org.openforis.collect.Proxy; import org.openforis.collect.ProxyContext; -import org.openforis.collect.manager.MessageSource; -import org.openforis.collect.model.AttributeAddChange; -import org.openforis.collect.model.AttributeChange; -import org.openforis.collect.model.EntityAddChange; -import org.openforis.collect.model.EntityChange; -import org.openforis.collect.model.NodeChange; -import org.openforis.collect.model.NodeDeleteChange; - +import org.openforis.collect.model.CollectRecord; +import org.openforis.collect.model.NodeChangeSet; /** - * * @author S. Ricci * - * @param The type of NodeChange */ -public class NodeChangeProxy> implements Proxy { - - protected C change; - protected ProxyContext context; +public class NodeChangeSetProxy implements Proxy { - public NodeChangeProxy(C change, ProxyContext context) { + private NodeChangeSet changeSet; + private CollectRecord record; + private boolean recordSaved; + private ProxyContext context; + + public NodeChangeSetProxy(CollectRecord record, NodeChangeSet changeSet, ProxyContext context) { + super(); + this.record = record; + this.changeSet = changeSet; this.context = context; } - public static List> fromList(Collection> items, ProxyContext context) { - List> result = new ArrayList<>(); - if ( items != null ) { - for (NodeChange item : items) { - NodeChangeProxy proxy; - if ( item instanceof AttributeAddChange ) { - proxy = new AttributeAddChangeProxy((AttributeAddChange) item, context); - } else if ( item instanceof EntityAddChange ) { - proxy = new EntityAddChangeProxy((EntityAddChange) item, context); - } else if ( item instanceof AttributeChange ) { - proxy = new AttributeChangeProxy((AttributeChange) item, context); - } else if ( item instanceof EntityChange) { - proxy = new EntityChangeProxy((EntityChange) item, context); - } else if ( item instanceof NodeDeleteChange ) { - proxy = new NodeDeleteChangeProxy((NodeDeleteChange) item, context); - } else { - throw new IllegalArgumentException("NodeChange type not supported: " + item.getClass().getSimpleName()); - } - result.add(proxy); - } - } - return result; + public List> getChanges() { + return NodeChangeProxy.fromList(changeSet.getChanges(), context); } - - public int getNodeId() { - return change.getNode().getInternalId(); + + public boolean isRecordSaved() { + return recordSaved; } - protected Locale getLocale() { - return context.getLocale(); + public void setRecordSaved(boolean recordSaved) { + this.recordSaved = recordSaved; } - - protected MessageSource getMessageSource() { - return context.getMessageSource(); + + public Integer getErrors() { + return record.getErrors(); } -} \ No newline at end of file + public Integer getSkipped() { + return record.getSkipped(); + } + + public Integer getMissing() { + return record.getMissing(); + } + + public Integer getWarnings() { + return record.getWarnings(); + } + + public Integer getMissingErrors() { + return record.getMissingErrors(); + } + + public Integer getMissingWarnings() { + return record.getMissingWarnings(); + } + +} From 131d7f80b1006c94d57546160929f903071c0a04 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:52:11 +0100 Subject: [PATCH 1605/1620] New translations NodeDeleteChangeProxy.java (French) --- .../earth/app/view/Messages_fr.properties | 62 +++---------------- 1 file changed, 8 insertions(+), 54 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 0f769ec936..28f2316f75 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,67 +1,21 @@ -/** - * - */ package org.openforis.collect.model.proxy; -import java.util.List; - -import org.openforis.collect.Proxy; import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.NodeChangeSet; +import org.openforis.collect.model.NodeDeleteChange; /** + * * @author S. Ricci * */ -public class NodeChangeSetProxy implements Proxy { +public class NodeDeleteChangeProxy extends NodeChangeProxy { - private NodeChangeSet changeSet; - private CollectRecord record; - private boolean recordSaved; - private ProxyContext context; - - public NodeChangeSetProxy(CollectRecord record, NodeChangeSet changeSet, ProxyContext context) { - super(); - this.record = record; - this.changeSet = changeSet; - this.context = context; - } - - public List> getChanges() { - return NodeChangeProxy.fromList(changeSet.getChanges(), context); - } - - public boolean isRecordSaved() { - return recordSaved; - } - - public void setRecordSaved(boolean recordSaved) { - this.recordSaved = recordSaved; + public NodeDeleteChangeProxy(NodeDeleteChange change, ProxyContext context) { + super(change, context); } - public Integer getErrors() { - return record.getErrors(); + public Integer getDeletedNodeId() { + return change.getNode().getInternalId(); } - public Integer getSkipped() { - return record.getSkipped(); - } - - public Integer getMissing() { - return record.getMissing(); - } - - public Integer getWarnings() { - return record.getWarnings(); - } - - public Integer getMissingErrors() { - return record.getMissingErrors(); - } - - public Integer getMissingWarnings() { - return record.getMissingWarnings(); - } - -} +} \ No newline at end of file From e08814227f01d441bd881e310aec1a8348546dfc Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:52:12 +0100 Subject: [PATCH 1606/1620] New translations NodeDeleteChangeProxy.java (Spanish) --- .../earth/app/view/Messages_es.properties | 62 +++---------------- 1 file changed, 8 insertions(+), 54 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 0f769ec936..28f2316f75 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,67 +1,21 @@ -/** - * - */ package org.openforis.collect.model.proxy; -import java.util.List; - -import org.openforis.collect.Proxy; import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.NodeChangeSet; +import org.openforis.collect.model.NodeDeleteChange; /** + * * @author S. Ricci * */ -public class NodeChangeSetProxy implements Proxy { +public class NodeDeleteChangeProxy extends NodeChangeProxy { - private NodeChangeSet changeSet; - private CollectRecord record; - private boolean recordSaved; - private ProxyContext context; - - public NodeChangeSetProxy(CollectRecord record, NodeChangeSet changeSet, ProxyContext context) { - super(); - this.record = record; - this.changeSet = changeSet; - this.context = context; - } - - public List> getChanges() { - return NodeChangeProxy.fromList(changeSet.getChanges(), context); - } - - public boolean isRecordSaved() { - return recordSaved; - } - - public void setRecordSaved(boolean recordSaved) { - this.recordSaved = recordSaved; + public NodeDeleteChangeProxy(NodeDeleteChange change, ProxyContext context) { + super(change, context); } - public Integer getErrors() { - return record.getErrors(); + public Integer getDeletedNodeId() { + return change.getNode().getInternalId(); } - public Integer getSkipped() { - return record.getSkipped(); - } - - public Integer getMissing() { - return record.getMissing(); - } - - public Integer getWarnings() { - return record.getWarnings(); - } - - public Integer getMissingErrors() { - return record.getMissingErrors(); - } - - public Integer getMissingWarnings() { - return record.getMissingWarnings(); - } - -} +} \ No newline at end of file From 3b5739dba7efd64e1875826925bd190b1a8e3019 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:52:13 +0100 Subject: [PATCH 1607/1620] New translations NodeDeleteChangeProxy.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 62 +++---------------- 1 file changed, 8 insertions(+), 54 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 0f769ec936..28f2316f75 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,67 +1,21 @@ -/** - * - */ package org.openforis.collect.model.proxy; -import java.util.List; - -import org.openforis.collect.Proxy; import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.NodeChangeSet; +import org.openforis.collect.model.NodeDeleteChange; /** + * * @author S. Ricci * */ -public class NodeChangeSetProxy implements Proxy { +public class NodeDeleteChangeProxy extends NodeChangeProxy { - private NodeChangeSet changeSet; - private CollectRecord record; - private boolean recordSaved; - private ProxyContext context; - - public NodeChangeSetProxy(CollectRecord record, NodeChangeSet changeSet, ProxyContext context) { - super(); - this.record = record; - this.changeSet = changeSet; - this.context = context; - } - - public List> getChanges() { - return NodeChangeProxy.fromList(changeSet.getChanges(), context); - } - - public boolean isRecordSaved() { - return recordSaved; - } - - public void setRecordSaved(boolean recordSaved) { - this.recordSaved = recordSaved; + public NodeDeleteChangeProxy(NodeDeleteChange change, ProxyContext context) { + super(change, context); } - public Integer getErrors() { - return record.getErrors(); + public Integer getDeletedNodeId() { + return change.getNode().getInternalId(); } - public Integer getSkipped() { - return record.getSkipped(); - } - - public Integer getMissing() { - return record.getMissing(); - } - - public Integer getWarnings() { - return record.getWarnings(); - } - - public Integer getMissingErrors() { - return record.getMissingErrors(); - } - - public Integer getMissingWarnings() { - return record.getMissingWarnings(); - } - -} +} \ No newline at end of file From 761a13b9cfbdac3024eb32e9909da543fadb1c27 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:52:14 +0100 Subject: [PATCH 1608/1620] New translations NodeDeleteChangeProxy.java (English) --- .../earth/app/view/Messages_en.properties | 62 +++---------------- 1 file changed, 8 insertions(+), 54 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 0f769ec936..28f2316f75 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,67 +1,21 @@ -/** - * - */ package org.openforis.collect.model.proxy; -import java.util.List; - -import org.openforis.collect.Proxy; import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.CollectRecord; -import org.openforis.collect.model.NodeChangeSet; +import org.openforis.collect.model.NodeDeleteChange; /** + * * @author S. Ricci * */ -public class NodeChangeSetProxy implements Proxy { +public class NodeDeleteChangeProxy extends NodeChangeProxy { - private NodeChangeSet changeSet; - private CollectRecord record; - private boolean recordSaved; - private ProxyContext context; - - public NodeChangeSetProxy(CollectRecord record, NodeChangeSet changeSet, ProxyContext context) { - super(); - this.record = record; - this.changeSet = changeSet; - this.context = context; - } - - public List> getChanges() { - return NodeChangeProxy.fromList(changeSet.getChanges(), context); - } - - public boolean isRecordSaved() { - return recordSaved; - } - - public void setRecordSaved(boolean recordSaved) { - this.recordSaved = recordSaved; + public NodeDeleteChangeProxy(NodeDeleteChange change, ProxyContext context) { + super(change, context); } - public Integer getErrors() { - return record.getErrors(); + public Integer getDeletedNodeId() { + return change.getNode().getInternalId(); } - public Integer getSkipped() { - return record.getSkipped(); - } - - public Integer getMissing() { - return record.getMissing(); - } - - public Integer getWarnings() { - return record.getWarnings(); - } - - public Integer getMissingErrors() { - return record.getMissingErrors(); - } - - public Integer getMissingWarnings() { - return record.getMissingWarnings(); - } - -} +} \ No newline at end of file From a344c860dd716c23fa40acb5bc975608d1037b4d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:52:15 +0100 Subject: [PATCH 1609/1620] New translations NodeProxy.java (French) --- .../earth/app/view/Messages_fr.properties | 86 +++++++++++++++++-- 1 file changed, 78 insertions(+), 8 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index 28f2316f75..f52885c52c 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,21 +1,91 @@ +/** + * + */ package org.openforis.collect.model.proxy; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +import org.openforis.collect.Proxy; import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.NodeDeleteChange; +import org.openforis.collect.manager.MessageSource; +import org.openforis.idm.model.Attribute; +import org.openforis.idm.model.CodeAttribute; +import org.openforis.idm.model.Entity; +import org.openforis.idm.model.Node; /** - * * @author S. Ricci + * @author M. Togna * */ -public class NodeDeleteChangeProxy extends NodeChangeProxy { +public class NodeProxy implements Proxy { + + private Node node; + protected ProxyContext context; + + public static NodeProxy fromNode(Node node, ProxyContext context) { + if (node instanceof Attribute) { + return new AttributeProxy(null, (Attribute) node, context); + } else if (node instanceof Entity) { + return new EntityProxy(null, (Entity) node, context); + } + return null; + } + + public NodeProxy(EntityProxy parent, Node node, ProxyContext context) { + super(); + this.node = node; + this.context = context; + } - public NodeDeleteChangeProxy(NodeDeleteChange change, ProxyContext context) { - super(change, context); + public static List fromList(EntityProxy parent, + List> list, ProxyContext context) { + List result = new ArrayList<>(); + if(list != null) { + for (Node node : list) { + NodeProxy proxy; + if(node instanceof Attribute) { + if(node instanceof CodeAttribute) { + proxy = new CodeAttributeProxy(parent, (CodeAttribute) node, context); + } else { + proxy = new AttributeProxy(parent, (Attribute) node, context); + } + } else { + proxy = new EntityProxy(parent, (Entity) node, context); + } + result.add(proxy); + } + } + return result; + } + + public Integer getId() { + return node.getInternalId(); } - public Integer getDeletedNodeId() { - return change.getNode().getInternalId(); + public Integer getDefinitionId() { + if(node.getDefinition() == null) { + return null; + } else { + return node.getDefinition().getId(); + } + } + + public Integer getParentId() { + if(node.getParent() == null) { + return null; + } else { + return node.getParent().getInternalId(); + } + } + + protected MessageSource getMessageSource() { + return context.getMessageSource(); } -} \ No newline at end of file + protected Locale getLocale() { + return context.getLocale(); + } +} From ddfac0c8e3d5fe02083197c35e9a614ca58103e0 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:52:16 +0100 Subject: [PATCH 1610/1620] New translations NodeProxy.java (Spanish) --- .../earth/app/view/Messages_es.properties | 86 +++++++++++++++++-- 1 file changed, 78 insertions(+), 8 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index 28f2316f75..f52885c52c 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,21 +1,91 @@ +/** + * + */ package org.openforis.collect.model.proxy; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +import org.openforis.collect.Proxy; import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.NodeDeleteChange; +import org.openforis.collect.manager.MessageSource; +import org.openforis.idm.model.Attribute; +import org.openforis.idm.model.CodeAttribute; +import org.openforis.idm.model.Entity; +import org.openforis.idm.model.Node; /** - * * @author S. Ricci + * @author M. Togna * */ -public class NodeDeleteChangeProxy extends NodeChangeProxy { +public class NodeProxy implements Proxy { + + private Node node; + protected ProxyContext context; + + public static NodeProxy fromNode(Node node, ProxyContext context) { + if (node instanceof Attribute) { + return new AttributeProxy(null, (Attribute) node, context); + } else if (node instanceof Entity) { + return new EntityProxy(null, (Entity) node, context); + } + return null; + } + + public NodeProxy(EntityProxy parent, Node node, ProxyContext context) { + super(); + this.node = node; + this.context = context; + } - public NodeDeleteChangeProxy(NodeDeleteChange change, ProxyContext context) { - super(change, context); + public static List fromList(EntityProxy parent, + List> list, ProxyContext context) { + List result = new ArrayList<>(); + if(list != null) { + for (Node node : list) { + NodeProxy proxy; + if(node instanceof Attribute) { + if(node instanceof CodeAttribute) { + proxy = new CodeAttributeProxy(parent, (CodeAttribute) node, context); + } else { + proxy = new AttributeProxy(parent, (Attribute) node, context); + } + } else { + proxy = new EntityProxy(parent, (Entity) node, context); + } + result.add(proxy); + } + } + return result; + } + + public Integer getId() { + return node.getInternalId(); } - public Integer getDeletedNodeId() { - return change.getNode().getInternalId(); + public Integer getDefinitionId() { + if(node.getDefinition() == null) { + return null; + } else { + return node.getDefinition().getId(); + } + } + + public Integer getParentId() { + if(node.getParent() == null) { + return null; + } else { + return node.getParent().getInternalId(); + } + } + + protected MessageSource getMessageSource() { + return context.getMessageSource(); } -} \ No newline at end of file + protected Locale getLocale() { + return context.getLocale(); + } +} From 0a80ad22def308853e2f15e1a823c14ab0b7e399 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:52:17 +0100 Subject: [PATCH 1611/1620] New translations Proxy.java (English) --- .../earth/app/view/Messages_en.properties | 21 +++++-------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 28f2316f75..08b48cb25c 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,21 +1,10 @@ -package org.openforis.collect.model.proxy; - -import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.NodeDeleteChange; +package org.openforis.collect; /** * - * @author S. Ricci - * + * @author M. Togna + * */ -public class NodeDeleteChangeProxy extends NodeChangeProxy { - - public NodeDeleteChangeProxy(NodeDeleteChange change, ProxyContext context) { - super(change, context); - } - - public Integer getDeletedNodeId() { - return change.getNode().getInternalId(); - } +public interface Proxy { -} \ No newline at end of file +} From af39e3a225b1c0b5f4e4cc01512ef8cf3e45bbc1 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:52:19 +0100 Subject: [PATCH 1612/1620] New translations ProxyContext.java (French) --- .../earth/app/view/Messages_fr.properties | 87 ++++--------------- 1 file changed, 16 insertions(+), 71 deletions(-) diff --git a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties index f52885c52c..c75c432a82 100644 --- a/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/fr/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,91 +1,36 @@ -/** - * - */ -package org.openforis.collect.model.proxy; +package org.openforis.collect; -import java.util.ArrayList; -import java.util.List; import java.util.Locale; -import org.openforis.collect.Proxy; -import org.openforis.collect.ProxyContext; import org.openforis.collect.manager.MessageSource; -import org.openforis.idm.model.Attribute; -import org.openforis.idm.model.CodeAttribute; -import org.openforis.idm.model.Entity; -import org.openforis.idm.model.Node; +import org.openforis.collect.manager.ResourceBundleMessageSource; /** + * * @author S. Ricci - * @author M. Togna * */ -public class NodeProxy implements Proxy { +public class ProxyContext { - private Node node; - protected ProxyContext context; + private Locale locale; + private MessageSource messageSource; - public static NodeProxy fromNode(Node node, ProxyContext context) { - if (node instanceof Attribute) { - return new AttributeProxy(null, (Attribute) node, context); - } else if (node instanceof Entity) { - return new EntityProxy(null, (Entity) node, context); - } - return null; - } - - public NodeProxy(EntityProxy parent, Node node, ProxyContext context) { - super(); - this.node = node; - this.context = context; + public ProxyContext(Locale locale) { + this(locale, new ResourceBundleMessageSource()); } - public static List fromList(EntityProxy parent, - List> list, ProxyContext context) { - List result = new ArrayList<>(); - if(list != null) { - for (Node node : list) { - NodeProxy proxy; - if(node instanceof Attribute) { - if(node instanceof CodeAttribute) { - proxy = new CodeAttributeProxy(parent, (CodeAttribute) node, context); - } else { - proxy = new AttributeProxy(parent, (Attribute) node, context); - } - } else { - proxy = new EntityProxy(parent, (Entity) node, context); - } - result.add(proxy); - } - } - return result; + public ProxyContext(Locale locale, MessageSource messageSource) { + super(); + this.locale = locale; + this.messageSource = messageSource; } - public Integer getId() { - return node.getInternalId(); - } - - public Integer getDefinitionId() { - if(node.getDefinition() == null) { - return null; - } else { - return node.getDefinition().getId(); - } + public Locale getLocale() { + return locale; } - public Integer getParentId() { - if(node.getParent() == null) { - return null; - } else { - return node.getParent().getInternalId(); - } + public MessageSource getMessageSource() { + return messageSource; } - protected MessageSource getMessageSource() { - return context.getMessageSource(); - } - - protected Locale getLocale() { - return context.getLocale(); - } } From a7ba434bb8e107d9808542abef79d587a2cad973 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:52:20 +0100 Subject: [PATCH 1613/1620] New translations ProxyContext.java (Spanish) --- .../earth/app/view/Messages_es.properties | 87 ++++--------------- 1 file changed, 16 insertions(+), 71 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index f52885c52c..c75c432a82 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,91 +1,36 @@ -/** - * - */ -package org.openforis.collect.model.proxy; +package org.openforis.collect; -import java.util.ArrayList; -import java.util.List; import java.util.Locale; -import org.openforis.collect.Proxy; -import org.openforis.collect.ProxyContext; import org.openforis.collect.manager.MessageSource; -import org.openforis.idm.model.Attribute; -import org.openforis.idm.model.CodeAttribute; -import org.openforis.idm.model.Entity; -import org.openforis.idm.model.Node; +import org.openforis.collect.manager.ResourceBundleMessageSource; /** + * * @author S. Ricci - * @author M. Togna * */ -public class NodeProxy implements Proxy { +public class ProxyContext { - private Node node; - protected ProxyContext context; + private Locale locale; + private MessageSource messageSource; - public static NodeProxy fromNode(Node node, ProxyContext context) { - if (node instanceof Attribute) { - return new AttributeProxy(null, (Attribute) node, context); - } else if (node instanceof Entity) { - return new EntityProxy(null, (Entity) node, context); - } - return null; - } - - public NodeProxy(EntityProxy parent, Node node, ProxyContext context) { - super(); - this.node = node; - this.context = context; + public ProxyContext(Locale locale) { + this(locale, new ResourceBundleMessageSource()); } - public static List fromList(EntityProxy parent, - List> list, ProxyContext context) { - List result = new ArrayList<>(); - if(list != null) { - for (Node node : list) { - NodeProxy proxy; - if(node instanceof Attribute) { - if(node instanceof CodeAttribute) { - proxy = new CodeAttributeProxy(parent, (CodeAttribute) node, context); - } else { - proxy = new AttributeProxy(parent, (Attribute) node, context); - } - } else { - proxy = new EntityProxy(parent, (Entity) node, context); - } - result.add(proxy); - } - } - return result; + public ProxyContext(Locale locale, MessageSource messageSource) { + super(); + this.locale = locale; + this.messageSource = messageSource; } - public Integer getId() { - return node.getInternalId(); - } - - public Integer getDefinitionId() { - if(node.getDefinition() == null) { - return null; - } else { - return node.getDefinition().getId(); - } + public Locale getLocale() { + return locale; } - public Integer getParentId() { - if(node.getParent() == null) { - return null; - } else { - return node.getParent().getInternalId(); - } + public MessageSource getMessageSource() { + return messageSource; } - protected MessageSource getMessageSource() { - return context.getMessageSource(); - } - - protected Locale getLocale() { - return context.getLocale(); - } } From ae21a6b2938fc9d4af112220c76c584532c68857 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:52:21 +0100 Subject: [PATCH 1614/1620] New translations ProxyContext.java (Portuguese) --- .../earth/app/view/Messages_pt.properties | 35 +++++++++++++------ 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties index 28f2316f75..c75c432a82 100644 --- a/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/pt-PT/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,21 +1,36 @@ -package org.openforis.collect.model.proxy; +package org.openforis.collect; -import org.openforis.collect.ProxyContext; -import org.openforis.collect.model.NodeDeleteChange; +import java.util.Locale; + +import org.openforis.collect.manager.MessageSource; +import org.openforis.collect.manager.ResourceBundleMessageSource; /** * * @author S. Ricci * */ -public class NodeDeleteChangeProxy extends NodeChangeProxy { +public class ProxyContext { - public NodeDeleteChangeProxy(NodeDeleteChange change, ProxyContext context) { - super(change, context); + private Locale locale; + private MessageSource messageSource; + + public ProxyContext(Locale locale) { + this(locale, new ResourceBundleMessageSource()); } - public Integer getDeletedNodeId() { - return change.getNode().getInternalId(); + public ProxyContext(Locale locale, MessageSource messageSource) { + super(); + this.locale = locale; + this.messageSource = messageSource; } - -} \ No newline at end of file + + public Locale getLocale() { + return locale; + } + + public MessageSource getMessageSource() { + return messageSource; + } + +} From 7e19ef17e65500aa316fb7549138f1d58ca34f34 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 15:52:22 +0100 Subject: [PATCH 1615/1620] New translations ProxyContext.java (English) --- .../earth/app/view/Messages_en.properties | 32 +++++++++++++++++-- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties index 08b48cb25c..c75c432a82 100644 --- a/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties +++ b/en/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_en.properties @@ -1,10 +1,36 @@ package org.openforis.collect; +import java.util.Locale; + +import org.openforis.collect.manager.MessageSource; +import org.openforis.collect.manager.ResourceBundleMessageSource; + /** * - * @author M. Togna - * + * @author S. Ricci + * */ -public interface Proxy { +public class ProxyContext { + + private Locale locale; + private MessageSource messageSource; + + public ProxyContext(Locale locale) { + this(locale, new ResourceBundleMessageSource()); + } + public ProxyContext(Locale locale, MessageSource messageSource) { + super(); + this.locale = locale; + this.messageSource = messageSource; + } + + public Locale getLocale() { + return locale; + } + + public MessageSource getMessageSource() { + return messageSource; + } + } From f7916456e3efacaad4aeda96fb75cf24f3447c79 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Tue, 29 Nov 2022 16:56:03 +0100 Subject: [PATCH 1616/1620] New translations Messages.properties (Spanish) --- .../earth/app/view/Messages_es.properties | 297 ++++++++++++++++-- 1 file changed, 263 insertions(+), 34 deletions(-) diff --git a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties index c75c432a82..364a663be8 100644 --- a/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/es-ES/collect-earth/collect-earth-app/src/main/resorces/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,36 +1,265 @@ -package org.openforis.collect; +AboutDialog.19=Se produjo un problema +AboutDialog.5=For more information visit our website OpenForis.org +AboutDialog.6=Sorry, a problem occurred while trying to open this link in your system's standard browser. +AboutDialog.8=Ok +AspectCode.0=Norte +AspectCode.1=North-East +AspectCode.2=East +AspectCode.3=South-East +AspectCode.4=South +AspectCode.5=South-West +AspectCode.6=West +AspectCode.7=North-West +CollectEarthMenu.0=Import CEP file +CollectEarthMenu.2=Utilities +CollectEarthMenu.3=Divide large CSV plot files +CollectEarthMenu.4=Export data to XML (from specific date until present) +CollectEarthMenu.5=Export to Collect Backup +CollectEarthMenu.6=Export data as Collect Backup (all data) +CollectEarthMenu.7=Export data as Collect Backup (from date) +CollectEarthMenu.8=Export data to XML (using summary attribute) +CollectEarthWindow.0=Error when attempting to export data to CSV file +CollectEarthWindow.10=File +CollectEarthWindow.11=Exit +CollectEarthWindow.12=Tools +CollectEarthWindow.13=Download data to CSV (Excel) +CollectEarthWindow.14=Start SAIKU Analysis +CollectEarthWindow.15=Properties +CollectEarthWindow.16=Help +CollectEarthWindow.17=Disclaimer +CollectEarthWindow.18=Find missing plots in database +CollectEarthWindow.19=Collect Earth +CollectEarthWindow.1=Export error +CollectEarthWindow.20=Number of duplicated records\: +CollectEarthWindow.21=Could not find icon for main frame +CollectEarthWindow.22=Are you sure that you want to close Collect Earth?
Closing the window will also close the Collect Earth server +CollectEarthWindow.23=Confirmation needed +CollectEarthWindow.24=XML Export +CollectEarthWindow.25=Do you want to add these records anyway and lose your current data? +CollectEarthWindow.26=Operator +CollectEarthWindow.27=Update +CollectEarthWindow.28=Open Foris Collect Earth server should be running while the operator interprets data. +CollectEarthWindow.29=The Saiku Server is not configured. +CollectEarthWindow.2=Language +CollectEarthWindow.30=Please maintain this window open while you are using Google Earth. +CollectEarthWindow.31=Export collected data to CSV file +CollectEarthWindow.32=Quit +CollectEarthWindow.33=The operator name has to be longer than 5 characters and shorter than 50 +CollectEarthWindow.34=Validation error +CollectEarthWindow.35=OPERATOR NAME EMPTY\!
Please fill the operator name and press the "Update" button. +CollectEarthWindow.36=Operator name cannot be empty +CollectEarthWindow.37=Keep Open +CollectEarthWindow.38=CSV files +CollectEarthWindow.39=NOTICE\: It is advisable that you back-up your current data (Export to XML) before importing the new data +CollectEarthWindow.3=\ Import error +CollectEarthWindow.40=Set-up the path to the folder where Saiku Server is installed in the Tools->Properties->Advanced tab. +CollectEarthWindow.41=Saving exported data to file\: +CollectEarthWindow.42=Quit +CollectEarthWindow.43=Conflicting records found +CollectEarthWindow.44=Data Import/Export +CollectEarthWindow.45=Export data to XML (compressed) +CollectEarthWindow.46=Import new data from ZIP (compressed XML) +CollectEarthWindow.47=Saiku Server not configured +CollectEarthWindow.48=Zip/collect-data files +CollectEarthWindow.49=Fusion CSV files +CollectEarthWindow.4=FAO Disclaimer notices +CollectEarthWindow.50=Open User Manual +CollectEarthWindow.51=Check for updates of Collect Earth +CollectEarthWindow.52=Open Application Log File +CollectEarthWindow.53=Collect Earth Log file +CollectEarthWindow.54=Load points from KML +CollectEarthWindow.55=Update current records using CSV +CollectEarthWindow.56=About... +CollectEarthWindow.57=The Saiku starter process is still running, please wait. +CollectEarthWindow.58=Cannot start Saiku analysis +CollectEarthWindow.59=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming.
If you click on "YES" a new dataset with the latest information will be generated. +CollectEarthWindow.5=Close +CollectEarthWindow.60=Saiku data generation +CollectEarthWindow.61=Export data to XML (modified records since last export) +CollectEarthWindow.62=About... +CollectEarthWindow.63=Error getting the points from KML +CollectEarthWindow.64=Technical Support +CollectEarthWindow.65=The operator name has been changed +CollectEarthWindow.66=Operator name +CollectEarthWindow.67=Open data folder +CollectEarthWindow.6=Export to Fusion Table +CollectEarthWindow.70=Open the Survey Guide +CollectEarthWindow.71=Generate Stand-Alone Saiku tool +CollectEarthWindow.7=Error when importing data +CollectEarthWindow.8=Disclaimer text could not be found +CollectEarthWindow.9=The data imported contains records that are already present on your database. +DynamicsCode.0=Initially Forest +DynamicsCode.1=Initially Grassland +DynamicsCode.2=Initially Settlement +DynamicsCode.3=Initially Otherland +DynamicsCode.4=Initially Wetland +DynamicsCode.5=Initially Cropland +EarthApp.11=Collect Earth is already running +EarthApp.21=The file containing the grid of plots as a CSV/CED is not found in the selected path \:
+EarthApp.23=No CSV/CED file has been set-up \:

+EarthApp.24=The file containing the Freemarker template with the KML definition is not found in the selected path \:
+EarthApp.26=No KML definition file has been set-up \:

+EarthApp.27=The file containing the HTML balloon form is not found in the selected path \:
+EarthApp.29=No HTML balloon file has been set-up \:

+EarthApp.30=Please correct the file location in the Tools->Properties menu. +EarthApp.3=Remind me later +EarthApp.4=Update Now +EarthApp.57=There is a new version of Collect Earth available\!
How do you want to proceed? +EarthApp.58=Update alert +EarthApp.59=Error when importing project file +EarthApp.5=Do not remind me again +EarthApp.61=The Collect Earth file could not be open.
Please make sure that Google Earth is installed. +EarthApp.6=\ - Version +EarthApp.70=WARNING +EarthApp.71=In Mac OS X the Collect Earth project files (*.cep) will not open in Collect Earth when they are double-clicked.
+EarthApp.72=Use the Collect Earth toolbar to open the .cep files \: +EarthApp.73=Collect Earth issues in Mac OS X computers +EarthSurveyService.9=Field required +ExportActionListener.1=Pick Date to Export Records From +ExportDialogProcessMonitor.0=Processing data... +ExportDialogProcessMonitor.1=Waiting to initialize process \: +ExportDialogProcessMonitor.4=Exported records \: +ImportActionListener.0=Should the data for plots that have not been completely filled be imported? +ImportActionListener.2=If you click NO only the data from plots in the "green" state, containing all data, will be imported. +ImportActionListener.3=Import non-finished records +ImportDialogProcessMonitor.0=\ CALCULATING +ImportDialogProcessMonitor.11=Initial number of records \: +ImportDialogProcessMonitor.2=Importing records... +ImportDialogProcessMonitor.5=Actual number of imported records \: +ImportDialogProcessMonitor.8=Processing data... +ImportProcessMonitorDialog.0=Imported records \: +ImportXMLDialogProcessMonitor.1 = Overwrite data +ImportXMLDialogProcessMonitor.2 = Import only non-conflicting plots +InfiniteProgressMonitor.0=Cancel operation +JFileChooserExistsAware.0=Collect Earth Project file +KmlImportService.13=Select a CSV file to save the plot locations to +MissingPlotsListener.0=Error while getting information about plots not present on the Database +MissingPlotsListener.10=Total number of plots in the sampling design \: +MissingPlotsListener.12=Number of missing plots \: +MissingPlotsListener.14=All the plots are filled\! +MissingPlotsListener.1=Missing plots +MissingPlotsListener.2=Copy contents to clipboard +MissingPlotsListener.3=Pick the files that contain plot information ( .csv or .ced files ) for which you want to know if all data has been filled. +MissingPlotsListener.4=Missing plots - information +MissingPlotsListener.5=From file \: +MissingPlotsListener.6=Export to CED file +NO=No +NO_TO_ALL=No to all +OpenTextFileListener.0=The text file was not found at \: +OptionWizard.0=Collect Earth options +OptionWizard.100=Open Planet imagery +OptionWizard.101=Planet API key +OptionWizard.1021=URL SecureWatch +OptionWizard.102=Open Maxar SecureWatch +OptionWizard.103=Set URL for Extra Map (opens when set) \: +OptionWizard.104=Browsers +OptionWizard.105=Open Earth Map +OptionWizard.110=Use NICFI provided Monthly imagery +OptionWizard.10=Open backup folder +OptionWizard.11=Unknown\: use ifconfig +OptionWizard.12=Client Instance +OptionWizard.13=Collect Earth Server IP +OptionWizard.14=Collect Earth Server port (e.g. 8023) +OptionWizard.15=Save & Apply changes +OptionWizard.16=ID +OptionWizard.17=X-coord +OptionWizard.18=Y-coord +OptionWizard.19=Elevation +OptionWizard.1=Choose Browser +OptionWizard.20=The Google Earth contents have been changed.
Please accept the content reload when you are prompted by Google Earth. +OptionWizard.21=Update successful +OptionWizard.22=Slope +OptionWizard.23=There was an error when re-opening the Google Earth data +OptionWizard.24=Cancel +OptionWizard.25=Operation Mode +OptionWizard.26=DB host +OptionWizard.27=This is not a recognized Saiku Folder ( the start-saiku.bat file is not present) +OptionWizard.28=Saiku Server not recognized +OptionWizard.29=DB port +OptionWizard.2=Workflow (server/client) +OptionWizard.30=SQLite options +OptionWizard.31=Sample data +OptionWizard.32=Plot layout +OptionWizard.33=Survey Definition +OptionWizard.34=Integrated Services +OptionWizard.35=Number of control points +OptionWizard.36=Distance between control points (in meters) +OptionWizard.37=Margin with plot border (in meters) +OptionWizard.38=The CSV/CED file cannot be read correctly.
The file is expected to have a comma separated values like this \:
+OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect +OptionWizard.3=Server Instance +OptionWizard.40=Projects +OptionWizard.41=Load a new project file +OptionWizard.42=Error when closing the CSV reader +OptionWizard.43=Name of survey +OptionWizard.44=automatically back-up database at +OptionWizard.45=Open Earth Engine Playground ( deprecated ) +OptionWizard.46=Open Earth Engine Timelapse +OptionWizard.47=Open Bing Maps +OptionWizard.48=Open form on a browser instead of Google Earth (recommended for LINUX) +OptionWizard.49=Path to ced/csv file with plot data +OptionWizard.4=Current computer IP \: +OptionWizard.50=Browse... +OptionWizard.51=Error importing project file +OptionWizard.52=CSV/CED file with only coordinates +OptionWizard.53=No points +OptionWizard.54=Central point +OptionWizard.55=Error importing project folder +OptionWizard.56=Load project +OptionWizard.57=Previously loaded projects +OptionWizard.58=Open GEE Code Editor (requires Trusted Tester access) +OptionWizard.59=Open Here Maps focused on the plot +OptionWizard.5=Collect Earth Server port\: +OptionWizard.65=Path to Saiku folder +OptionWizard.66=Browse... +OptionWizard.67=Path to Firefox executable +OptionWizard.68=Browse... +OptionWizard.6=PostgreSQL DB parameters +OptionWizard.70=Executable files +OptionWizard.72=Binary files +OptionWizard.73=Path to Chrome executable +OptionWizard.74=Browse... +OptionWizard.76=Executable files +OptionWizard.78=Binary files +OptionWizard.79=Path to KML Freemarker template +OptionWizard.7=User Name +OptionWizard.80=Browse... +OptionWizard.82=Freemarker template +OptionWizard.83=Path to HTML Balloon form design +OptionWizard.84=Browse... +OptionWizard.86=HTML webpage +OptionWizard.87=Path to XML with IDM definition +OptionWizard.88=Browse... +OptionWizard.8=Password +OptionWizard.90=XML IDM definition +OptionWizard.91=Server (manager version or stand-alone use) +OptionWizard.92=Client (operator/connected to server) +OptionWizard.93=SQLite (Embedded/single file based) +OptionWizard.94=PostgreSQL +OptionWizard.95=Side of the sampling dots (in meters) +OptionWizard.9=DB Name +ProcessMonitorDialog.1=Parsing error on row number +ProcessMonitorDialog.4=, columns +ProcessMonitorDialog.5=\ -- values +SaikuAnalysisListener.0=Yes - Refresh Saiku data (long process) +SaikuAnalysisListener.1=No - Use same version of the data as last time Saiku was used +SaikuStarter.1=Starting Saiku +SaikuStarter.2=Starting Saiku can take some minutes, please wait\! +SaikuToolExportListener.1=Saiku Tool generation +SaikuToolExportListener.2=Generating Saiku Tool with current database +SaveEarthDataServlet.0=Empty request +SaveEarthDataServlet.1=Problem occurred while saving data to the database +SaveEarthDataServlet.2=The data was saved +SlopeCode.0=Flat (0-5) +YES=Yes +YES_TO_ALL=Yes to all -import java.util.Locale; +GenerateDatabaseStarter.1=Preparing for analysis +GenerateDatabaseStarter.2=Generating Relational Database -import org.openforis.collect.manager.MessageSource; -import org.openforis.collect.manager.ResourceBundleMessageSource; - -/** - * - * @author S. Ricci - * - */ -public class ProxyContext { - - private Locale locale; - private MessageSource messageSource; - - public ProxyContext(Locale locale) { - this(locale, new ResourceBundleMessageSource()); - } - - public ProxyContext(Locale locale, MessageSource messageSource) { - super(); - this.locale = locale; - this.messageSource = messageSource; - } - - public Locale getLocale() { - return locale; - } - - public MessageSource getMessageSource() { - return messageSource; - } - -} +IPCCGeneratorListener.1=Waiting for process to complete\! +IPCCGeneratorListener.2=The IPCC GHGi compatible data is being generated +IPCCGeneratorListener.3=Refresh the data (update with latest from Collect Earth) +IPCCGeneratorListener.4=Use the latest generated database (fastest process - no update) +IPCCGeneratorListener.5=GHGi Database generation +IPCCGeneratorListener.6=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming but it is necessary if the Collect Earth data has been updated since the last time.
\ No newline at end of file From 851eadbee9199bf0fd4ace60264514eb77fe12ba Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Wed, 30 Nov 2022 10:51:47 +0100 Subject: [PATCH 1617/1620] New translations Messages.properties (French) --- .../earth/app/view/Messages_fr.properties | 283 +++++++++--------- 1 file changed, 146 insertions(+), 137 deletions(-) diff --git a/collect-earth/collect-earth-app/src/main/resources/org/openforis/collect/earth/app/view/Messages_fr.properties b/collect-earth/collect-earth-app/src/main/resources/org/openforis/collect/earth/app/view/Messages_fr.properties index 8c7333e0bf..b843ab7909 100644 --- a/collect-earth/collect-earth-app/src/main/resources/org/openforis/collect/earth/app/view/Messages_fr.properties +++ b/collect-earth/collect-earth-app/src/main/resources/org/openforis/collect/earth/app/view/Messages_fr.properties @@ -1,6 +1,6 @@ -AboutDialog.19=UN problème est apparu -AboutDialog.5=Pour plus d\u2019infos, visitez notre site web OpenForis.org -AboutDialog.6=Désolé, il y a eu un problème lors de l\u2019ouverture du lien avec votre navigateur par défaut. +AboutDialog.19=UN problème est apparu +AboutDialog.5=Pour plus d’infos, visitez notre site web OpenForis.org +AboutDialog.6=Désolé, il y a eu un problème lors de l’ouverture du lien avec votre navigateur par défaut. AboutDialog.8=Ok AspectCode.0=Nord AspectCode.1=Nord-Est @@ -13,151 +13,150 @@ AspectCode.7=Nord-Ouest CollectEarthMenu.0=Importe le fichier .CEP CollectEarthMenu.2=Utilitaires CollectEarthMenu.3=Divise un large tableau CSV en plusieurs parties -CollectEarthMenu.4=Exporte les données en XML (à partir d'une date précise jusqu'à aujourd'hui) +CollectEarthMenu.4=Exporte les données en XML (à partir d'une date précise jusqu'à aujourd'hui) CollectEarthMenu.5=Exporte sur la sauvegarde Collect Backup -CollectEarthMenu.6=Exporte les données en tant que sauvegarde Collect Backup (toutes les données) -CollectEarthMenu.7=Exporte les données en tant que sauvegarde Collect Backup (à partir de) -CollectEarthMenu.8=Exporte les données en XML (filtrer par attribut) -CollectEarthWindow.0=Erreur pendant l'exportation des données en csv +CollectEarthMenu.6=Exporte les données en tant que sauvegarde Collect Backup (toutes les données) +CollectEarthMenu.7=Exporte les données en tant que sauvegarde Collect Backup (à partir de) +CollectEarthMenu.8=Exporte les données en XML (filtrer par attribut) +CollectEarthWindow.0=Erreur pendant l'exportation des données en csv CollectEarthWindow.10=Fichier CollectEarthWindow.11=Quitter CollectEarthWindow.12=Outils -CollectEarthWindow.13=Télécharger les données en CSV (Excel) -CollectEarthWindow.14=Démarrer l'analyse avec Saïku -CollectEarthWindow.15=Propriétés +CollectEarthWindow.13=Télécharger les données en CSV (Excel) +CollectEarthWindow.14=Démarrer l'analyse avec Saïku +CollectEarthWindow.15=Propriétés CollectEarthWindow.16=Aide CollectEarthWindow.17=Avertissement -CollectEarthWindow.18=Trouver les placettes manquantes dans la base de données +CollectEarthWindow.18=Trouver les placettes manquantes dans la base de données CollectEarthWindow.19=Collect Earth CollectEarthWindow.1=Erreur d'exportation -CollectEarthWindow.20=Nombre d'enregistrements dupliqués -CollectEarthWindow.21=Icône non trouvée -CollectEarthWindow.22= Êtes-vous sûr de vouloir fermer CollectEarth
Fermer cette fenêtre fermera aussi le serveur +CollectEarthWindow.20=Nombre d'enregistrements dupliqués +CollectEarthWindow.21=Icône non trouvée +CollectEarthWindow.22= Êtes-vous sûr de vouloir fermer CollectEarth
Fermer cette fenêtre fermera aussi le serveur CollectEarthWindow.23=Confirmation requise CollectEarthWindow.24=Exporter en XML -CollectEarthWindow.25=Voulez-vous ajouter tout de même ces données et perdre vos enregistrements? +CollectEarthWindow.25=Voulez-vous ajouter tout de même ces données et perdre vos enregistrements? CollectEarthWindow.26=Utilisateur CollectEarthWindow.27=Appliquer -CollectEarthWindow.28=Le serveur devrait être démarré pour la saisie des données par les utilisateurs. -CollectEarthWindow.29=Le serveur Saiku n'est pas configuré. +CollectEarthWindow.28=Le serveur devrait être démarré pour la saisie des données par les utilisateurs. +CollectEarthWindow.29=Le serveur Saiku n'est pas configuré. CollectEarthWindow.2=Langue -CollectEarthWindow.30=Veuillez garder cette fenêtre active pendant que vous utilisez Google Earth -CollectEarthWindow.31=Exporter les données collectées en CSV +CollectEarthWindow.30=Veuillez garder cette fenêtre active pendant que vous utilisez Google Earth +CollectEarthWindow.31=Exporter les données collectées en CSV CollectEarthWindow.32=Fermer -CollectEarthWindow.33=Le nom de l'utilisateur doit comprendre entre 5 et 50 caractères +CollectEarthWindow.33=Le nom de l'utilisateur doit comprendre entre 5 et 50 caractères CollectEarthWindow.34=Erreur de validation -CollectEarthWindow.35= NOM DE L'UTILISATEUR VIDE\!
Veuillez renseigner le champs et Appuyer sur \"Mise à jour\" -CollectEarthWindow.36=Le nom de l'utilisateur ne peut pas être vide +CollectEarthWindow.35= NOM DE L'UTILISATEUR VIDE\!
Veuillez renseigner le champs et Appuyer sur "Mise à jour" +CollectEarthWindow.36=Le nom de l'utilisateur ne peut pas être vide CollectEarthWindow.37=Laisser ouvert CollectEarthWindow.38=Fichiers CSV -CollectEarthWindow.39=NOTE : Il est conseillé de sauvegarder vos données (export en XML) avant d'importer de nouvelles données +CollectEarthWindow.39=NOTE \: Il est conseillé de sauvegarder vos données (export en XML) avant d'importer de nouvelles données CollectEarthWindow.3=\ Erreur pendant l'importation -CollectEarthWindow.40=Renseigner le chemin jusqu'au serveur Saiku dans /Outils/Propriétés/Avancé. -CollectEarthWindow.41=Sauvegarde des données exportées dans le fichier: +CollectEarthWindow.40=Renseigner le chemin jusqu'au serveur Saiku dans /Outils/Propriétés/Avancé. +CollectEarthWindow.41=Sauvegarde des données exportées dans le fichier\: CollectEarthWindow.42=Quitter -CollectEarthWindow.43=Enregistrements conflictuels trouvés -CollectEarthWindow.44=Importer/Exporter les données -CollectEarthWindow.45=Exporter les données en XML (zippé) -CollectEarthWindow.46=Importer de nouvelles données depuis ZIP (XML zippé) -CollectEarthWindow.47=Le serveur Saiku n'est pas configuré +CollectEarthWindow.43=Enregistrements conflictuels trouvés +CollectEarthWindow.44=Importer/Exporter les données +CollectEarthWindow.45=Exporter les données en XML (zippé) +CollectEarthWindow.46=Importer de nouvelles données depuis ZIP (XML zippé) +CollectEarthWindow.47=Le serveur Saiku n'est pas configuré CollectEarthWindow.48=Fichier zip/collect-data CollectEarthWindow.49=Fusion des fichiers CSV -CollectEarthWindow.4=Clause de non-responsabilité de la FAO +CollectEarthWindow.4=Clause de non-responsabilité de la FAO CollectEarthWindow.50=Ouvrir le manuel utilisateur -CollectEarthWindow.51=Vérifier les mises à jour des Collect Earth +CollectEarthWindow.51=Vérifier les mises à jour des Collect Earth CollectEarthWindow.52=Fichier de logs Open Application CollectEarthWindow.53=Fichier de logs Collect Earth CollectEarthWindow.54=Charger les points de KML -CollectEarthWindow.55=Mettre à jour les enregistrements en utilisant un fichier CSV +CollectEarthWindow.55=Mettre à jour les enregistrements en utilisant un fichier CSV CollectEarthWindow.56=A propos... -CollectEarthWindow.57=Le processus de démarrage de Saïku est en cours, veuillez patienter -CollectEarthWindow.58=Impossible de démarrer l'analyse avec Saïku -CollectEarthWindow.59=Voulez-vous régénérer le jeu de données?
Cela peut prendre du temps.
Cliquer sur oui pour régénérer un nouveau jeu de données avec les dernières informations +CollectEarthWindow.57=Le processus de démarrage de Saïku est en cours, veuillez patienter +CollectEarthWindow.58=Impossible de démarrer l'analyse avec Saïku +CollectEarthWindow.59=Voulez-vous régénérer le jeu de données?
Cela peut prendre du temps.
Cliquer sur oui pour régénérer un nouveau jeu de données avec les dernières informations CollectEarthWindow.5=Fermer -CollectEarthWindow.60=Génération des données Saïku -CollectEarthWindow.61=Exporter en XML (uniquement les enregistrements modifiés/ajoutés) -CollectEarthWindow.62=A propos\u2026 -CollectEarthWindow.63=Erreur en accédant aux points de KML +CollectEarthWindow.60=Génération des données Saïku +CollectEarthWindow.61=Exporter en XML (uniquement les enregistrements modifiés/ajoutés) +CollectEarthWindow.62=A propos… +CollectEarthWindow.63=Erreur en accédant aux points de KML CollectEarthWindow.64=Assistance technique -CollectEarthWindow.65=Le nom de l'opérateur a été changé -CollectEarthWindow.66=Nom de l'opérateur -CollectEarthWindow.67=Ouvrir le dossier de données de CE +CollectEarthWindow.65=Le nom de l'opérateur a été changé +CollectEarthWindow.66=Nom de l'opérateur +CollectEarthWindow.67=Ouvrir le dossier de données de CE CollectEarthWindow.6=Exporter en Table de Fusion -CollectEarthWindow.70=Ouvrez le manuel de cette enquête -CollectEarthWindow.71=Générer un outil Saiku autonome -CollectEarthWindow.7=Erreur pendant l'importation des données +CollectEarthWindow.70=Ouvrez le manuel de cette enquête +CollectEarthWindow.71=Générer un outil Saiku autonome +CollectEarthWindow.7=Erreur pendant l'importation des données CollectEarthWindow.8=Le texte est introuvable -CollectEarthWindow.9=Les données importées contiennent des redondances avec celles présentes dans la base -DynamicsCode.0= Terre Forestière initialement -DynamicsCode.1= Prairie initialement -DynamicsCode.2= Etablissement initialement -DynamicsCode.3= Autre terre initialement -DynamicsCode.4= Terre humide initialement -DynamicsCode.5= Terre cultivée initialement -EarthApp.11=Collect Earth est déjà en cours d\u2019exécution -EarthApp.21=Le fichier CSV/CED contenant les points est introuvable :
-EarthApp.23=Aucun fichier CSV/CED spécifié :

-EarthApp.24=Le fichier contenant le modèle de définition KML est introuvable :
-EarthApp.26=Aucun modèle de définition spécifié:

-EarthApp.27=Le fichier contenant le ballon HTML est introuvable :
-EarthApp.29=Aucun ballon HTML spécifié :

-EarthApp.30=Veuillez corriger le chemin d\u2019accès dans le menu Outils -> Propriétés. +CollectEarthWindow.9=Les données importées contiennent des redondances avec celles présentes dans la base +DynamicsCode.0=Terre Forestière initialement +DynamicsCode.1=Prairie initialement +DynamicsCode.2=Etablissement initialement +DynamicsCode.3=Autre terre initialement +DynamicsCode.4=Terre humide initialement +DynamicsCode.5=Terre cultivée initialement +EarthApp.11=Collect Earth est déjà en cours d’exécution +EarthApp.21=Le fichier CSV/CED contenant les points est introuvable \:
+EarthApp.23=Aucun fichier CSV/CED spécifié \:

+EarthApp.24=Le fichier contenant le modèle de définition KML est introuvable \:
+EarthApp.26=Aucun modèle de définition spécifié\:

+EarthApp.27=Le fichier contenant le ballon HTML est introuvable \:
+EarthApp.29=Aucun ballon HTML spécifié \:

+EarthApp.30=Veuillez corriger le chemin d’accès dans le menu Outils -> Propriétés. EarthApp.3=Rappelez le moi plus tard EarthApp.4=Mettre a jour maintenant -EarthApp.57= Une nouvelle version de Collect Earth est disponible\! Utiliser le Menu -EarthApp.58=Alerte de mise à jour -EarthApp.59=Erreur pendant l\u2019importation du fichier +EarthApp.57=Une nouvelle version de Collect Earth est disponible\! Utiliser le Menu +EarthApp.58=Alerte de mise à jour +EarthApp.59=Erreur pendant l’importation du fichier EarthApp.5=Ne me le rappelez plus -EarthApp.61=Le fichier Collect Earth est introuvable br/>Veuillez-vous assurer que Google Earth est installé. +EarthApp.61=Le fichier Collect Earth est introuvable br/>Veuillez-vous assurer que Google Earth est installé. EarthApp.6=\ - Version EarthApp.70=AVERTISSMENT -EarthApp.71=Sous Mac OS X, les fichiers de projet Collect Earth (* .cep) ne s'ouvriront pas dans Collect Earth lorsqu'ils sont double-cliqués.
-EarthApp.72=Utilisez la barre d'outils Collect Earth pour ouvrir les fichiers .cep : -EarthApp.73=Collect Earth - problèmes sur les ordinateurs Mac OS X +EarthApp.71=Sous Mac OS X, les fichiers de projet Collect Earth (* .cep) ne s'ouvriront pas dans Collect Earth lorsqu'ils sont double-cliqués.
+EarthApp.72=Utilisez la barre d'outils Collect Earth pour ouvrir les fichiers .cep \: +EarthApp.73=Collect Earth - problèmes sur les ordinateurs Mac OS X EarthSurveyService.9=Champs requis -EarthSurveyService.9=Champs requis -ExportActionListener.1=Choisir la date pour les données à exporter -ExportDialogProcessMonitor.0=Chargement des données... +ExportActionListener.1=Choisir la date pour les données à exporter +ExportDialogProcessMonitor.0=Chargement des données... ExportDialogProcessMonitor.1=Attente d'initialisation de l'export -ExportDialogProcessMonitor.4=Enregistrements exportés : -ImportActionListener.0=Est-ce que les données pour les placettes qui ne sont pas complètes doivent être importées ? -ImportActionListener.2=Si vous cliquez sur NO, seulement les données provenant des placettes avec la marque « verte », qui contiennent toutes les données, seront importées +ExportDialogProcessMonitor.4=Enregistrements exportés \: +ImportActionListener.0=Est-ce que les données pour les placettes qui ne sont pas complètes doivent être importées ? +ImportActionListener.2=Si vous cliquez sur NO, seulement les données provenant des placettes avec la marque « verte », qui contiennent toutes les données, seront importées ImportActionListener.3=Importer les enregistrements incomplets ImportDialogProcessMonitor.0=Calcul en cours -ImportDialogProcessMonitor.11=Nombre initial d' enregistrements : +ImportDialogProcessMonitor.11=Nombre initial d' enregistrements \: ImportDialogProcessMonitor.2=Chargement des enregistrements... -ImportDialogProcessMonitor.5=Nombre réel d'enregistrements importés: -ImportDialogProcessMonitor.8=Chargement des données... -ImportProcessMonitorDialog.0=Enregistrements importés : -ImportXMLDialogProcessMonitor.1 = Écraser les données dans la base de données +ImportDialogProcessMonitor.5=Nombre réel d'enregistrements importés\: +ImportDialogProcessMonitor.8=Chargement des données... +ImportProcessMonitorDialog.0=Enregistrements importés \: +ImportXMLDialogProcessMonitor.1 = Écraser les données dans la base de données ImportXMLDialogProcessMonitor.2 = Importer uniquement des enregistrements non conflictuels -InfiniteProgressMonitor.0=Annuler l\u2019opération +InfiniteProgressMonitor.0=Annuler l’opération JFileChooserExistsAware.0=Fichier projet Collect Earth -KmlImportService.13=Sélectionnez un fichier CSV pour enregistrer les emplacements des parcelles -MissingPlotsListener.0=Erreur au cours de l\u2019enregistrement des placettes absentes de la base de données -MissingPlotsListener.10=Nombre total de parcelles dans le plan d'échantillonnage : -MissingPlotsListener.12=Nombre de parcelles manquantes : +KmlImportService.13=Sélectionnez un fichier CSV pour enregistrer les emplacements des parcelles +MissingPlotsListener.0=Erreur au cours de l’enregistrement des placettes absentes de la base de données +MissingPlotsListener.10=Nombre total de parcelles dans le plan d'échantillonnage \: +MissingPlotsListener.12=Nombre de parcelles manquantes \: MissingPlotsListener.14=Toutes les parcelles sont remplis\! MissingPlotsListener.1=Placettes manquantes MissingPlotsListener.2=Copier le contenu sur le clipboard -MissingPlotsListener.3=Choisir les fichiers qui contiennent les informations des placettes (.csv ou .ced) pour lesquelles vous voulez savoir si toues les placettes ont été renseignées -MissingPlotsListener.4=Placettes manquantes \u2013 Information -MissingPlotsListener.5=Depuis le fichier : +MissingPlotsListener.3=Choisir les fichiers qui contiennent les informations des placettes (.csv ou .ced) pour lesquelles vous voulez savoir si toues les placettes ont été renseignées +MissingPlotsListener.4=Placettes manquantes – Information +MissingPlotsListener.5=Depuis le fichier \: MissingPlotsListener.6=Exporter en CED NO=Non -NO_TO_ALL=Non à tous -OpenTextFileListener.0=Le fichier texte n'a pas été trouvé dans : +NO_TO_ALL=Non à tous +OpenTextFileListener.0=Le fichier texte n'a pas été trouvé dans \: OptionWizard.0=Options Collect Earth OptionWizard.100=Ouvrir Planet -OptionWizard.101=Clé API Planet +OptionWizard.101=Clé API Planet OptionWizard.1021=URL SecureWatch OptionWizard.102=Ouvrir Maxar SecureWatch -OptionWizard.103=Définir le URL pour le Carte Extra (ouvre quand il est réglé) : +OptionWizard.103=Définir le URL pour le Carte Extra (ouvre quand il est réglé) \: OptionWizard.104=Navigateurs OptionWizard.105=Ouvrir Earth Map OptionWizard.110=Utiliser les images mensuelles fournies par NICFI OptionWizard.10=Montrer les fichiers de sauvegarde -OptionWizard.11=Inconnu : utiliser ifconfig +OptionWizard.11=Inconnu \: utiliser ifconfig OptionWizard.12=Instance client OptionWizard.13=IP Serveur de Collect Earth OptionWizard.14=Port Serveur de Collect Earth (e.g. 8023) @@ -167,90 +166,100 @@ OptionWizard.17=Coord-X OptionWizard.18=Coord-Y OptionWizard.19=Altitude OptionWizard.1=Choisir un navigateur -OptionWizard.20= Le contenu de Google Earth a changé
Veuillez accepter la mise à jour quand GE le demande -OptionWizard.21=Mise à jour réussie +OptionWizard.20= Le contenu de Google Earth a changé
Veuillez accepter la mise à jour quand GE le demande +OptionWizard.21=Mise à jour réussie OptionWizard.22=Pente -OptionWizard.23=Il y a eu une erreur pendant la réouverture de Google Earth +OptionWizard.23=Il y a eu une erreur pendant la réouverture de Google Earth OptionWizard.24=Annuler -OptionWizard.25=Mode opération -OptionWizard.26=Hôte pour la BDD +OptionWizard.25=Mode opération +OptionWizard.26=Hôte pour la BDD OptionWizard.27=Le dossier n'est pas valide (il manque le fichier start-saiku.bat) OptionWizard.28=Le dossier Saiku n'est pas reconnu OptionWizard.29=Port pour la BDD OptionWizard.2=Flux (serveur/client) OptionWizard.30=Options SQLite -OptionWizard.31=Points d'échantillonnage +OptionWizard.31=Points d'échantillonnage OptionWizard.32=Configuration de la parcelle -OptionWizard.33=Définition de l'enquête -OptionWizard.34=Services intégrés -OptionWizard.35=Nombre de points de contrôle -OptionWizard.36=Distance entre les points de contrôle (en mètres) -OptionWizard.37=Distance au bord de la parcelle (en mètres) -OptionWizard.38=Le Fichier CSV/CED ne peut pas être lu
Le fichier devrait avoir des valeurs séparées par des virgules comme ceci :
-OptionWizard.39=ID,Coordonnée_Y, Coordonnée_X,altitude,pente,orientation +OptionWizard.33=Définition de l'enquête +OptionWizard.34=Services intégrés +OptionWizard.35=Nombre de points de contrôle +OptionWizard.36=Distance entre les points de contrôle (en mètres) +OptionWizard.37=Distance au bord de la parcelle (en mètres) +OptionWizard.38=Le Fichier CSV/CED ne peut pas être lu
Le fichier devrait avoir des valeurs séparées par des virgules comme ceci \:
+OptionWizard.39=ID,Coordonnée_Y, Coordonnée_X,altitude,pente,orientation OptionWizard.3=Instance serveur OptionWizard.40=Projets OptionWizard.41=Charger un nouveau fichier projet OptionWizard.42=Erreur pendant la fermeture du lecteur CSV -OptionWizard.43=Nom de l'enquête +OptionWizard.43=Nom de l'enquête OptionWizard.44=Sauvegarder automatiquement la base dans -OptionWizard.45=Ouvrir Earth Engine Playground (obsolète) +OptionWizard.45=Ouvrir Earth Engine Playground (obsolète) OptionWizard.46=Ouvrir le Timelapse de Google Earth Engine OptionWizard.47=Ouvrir Bing Maps -OptionWizard.48=Ouvrir le formulaire dans un navigateur plutôt que dans GE (recommandé pour Linux) -OptionWizard.49=Chemin jusqu'au fichier ced/csv avec les données des parcelles +OptionWizard.48=Ouvrir le formulaire dans un navigateur plutôt que dans GE (recommandé pour Linux) +OptionWizard.49=Chemin jusqu'au fichier ced/csv avec les données des parcelles OptionWizard.4=IP actuelle de l'ordinateur OptionWizard.50=Parcourir OptionWizard.51=Erreur pendant l'importation du fichier -OptionWizard.52=Fichier CSV/CED uniquement avec des coordonnées +OptionWizard.52=Fichier CSV/CED uniquement avec des coordonnées OptionWizard.53=Pas de points OptionWizard.54=Point central OptionWizard.55=Erreur pendant l'importation du dossier projet OptionWizard.56=Charger le projet -OptionWizard.57=Projets chargés précedemment -OptionWizard.58=Ouvrir GEE Code Editor (nécessite un accès restreint Trusted Tester) +OptionWizard.57=Projets chargés précedemment +OptionWizard.58=Ouvrir GEE Code Editor (nécessite un accès restreint Trusted Tester) OptionWizard.59=Ouvrir Here Maps -OptionWizard.5=Port Serveur Collect Earth : +OptionWizard.5=Port Serveur Collect Earth \: OptionWizard.65=Chemin jusqu'au serveur Saiku OptionWizard.66=Parcourir -OptionWizard.67=Chemin jusqu'à Firefox +OptionWizard.67=Chemin jusqu'à Firefox OptionWizard.68=Parcourir -OptionWizard.6=Paramètres de la BD PostGreSQL -OptionWizard.70=Fichiers exécutables +OptionWizard.6=Paramètres de la BD PostGreSQL +OptionWizard.70=Fichiers exécutables OptionWizard.72=Fichiers binaires -OptionWizard.73=Chemin jusqu'à Chrome +OptionWizard.73=Chemin jusqu'à Chrome OptionWizard.74=Parcourir -OptionWizard.76=Fichiers exécutables +OptionWizard.76=Fichiers exécutables OptionWizard.78=Fichiers binaires -OptionWizard.79=Chemin jusqu'au modèle Freemarker KML +OptionWizard.79=Chemin jusqu'au modèle Freemarker KML OptionWizard.7=Nom d'utilisateur OptionWizard.80=Parcourir -OptionWizard.82=Modèle Freemarker +OptionWizard.82=Modèle Freemarker OptionWizard.83=Chemin jusqu'au Ballon HTML OptionWizard.84=Parcourir OptionWizard.86=Page web HTML -OptionWizard.87=Chemin jusqu'au fichier XML contenant la définition IDM +OptionWizard.87=Chemin jusqu'au fichier XML contenant la définition IDM OptionWizard.88=Parcourir OptionWizard.8=Mot de passe -OptionWizard.90=Définition IDM XML +OptionWizard.90=Définition IDM XML OptionWizard.91=Serveur (version gestionnaire ou autonome) -OptionWizard.92=Client (opérateur/connecté au serveur) -OptionWizard.93=SQLite (Fichier intégré / Unique) +OptionWizard.92=Client (opérateur/connecté au serveur) +OptionWizard.93=SQLite (Fichier intégré / Unique) OptionWizard.94=PostgreSQL -OptionWizard.95=Côté des points d'échantillonnage (en mètres) +OptionWizard.95=Côté des points d'échantillonnage (en mètres) OptionWizard.9=Nom de la base -ProcessMonitorDialog.1=Erreur d\u2019interprétation sur numéro de rangée +ProcessMonitorDialog.1=Erreur d’interprétation sur numéro de rangée ProcessMonitorDialog.4=, colonnes ProcessMonitorDialog.5=\ -- valeures -SaikuAnalysisListener.0=Oui - Rafraichir les données Saiku (processus long) -SaikuAnalysisListener.1=Non - Utiliser la même version des données que la dernière fois que Saiku a été utilisé -SaikuToolExportListener.1=Génération de l'outil Saiku -SaikuToolExportListener.2=Génération de l'outil Saiku avec la base de données actuelle -SaikuStarter.1=Démarrer Saïku -SaikuStarter.2=Démarrer Saïku peut prendre plusieurs minutes, veuillez patienter\! -SaveEarthDataServlet.0=Requête vide -SaveEarthDataServlet.1=Problème lors de la sauvegarde de la base de données -SaveEarthDataServlet.2=Les données ont été sauvées +SaikuAnalysisListener.0=Oui - Rafraichir les données Saiku (processus long) +SaikuAnalysisListener.1=Non - Utiliser la même version des données que la dernière fois que Saiku a été utilisé +SaikuStarter.1=Démarrer Saïku +SaikuStarter.2=Démarrer Saïku peut prendre plusieurs minutes, veuillez patienter\! +SaikuToolExportListener.1=Génération de l'outil Saiku +SaikuToolExportListener.2=Génération de l'outil Saiku avec la base de données actuelle +SaveEarthDataServlet.0=Requête vide +SaveEarthDataServlet.1=Problème lors de la sauvegarde de la base de données +SaveEarthDataServlet.2=Les données ont été sauvées SlopeCode.0=Plan (0-5) YES=Oui -YES_TO_ALL=Oui à tous \ No newline at end of file +YES_TO_ALL=Oui à tous + +GenerateDatabaseStarter.1=Preparing for analysis +GenerateDatabaseStarter.2=Generating Relational Database + +IPCCGeneratorListener.1=Waiting for process to complete\! +IPCCGeneratorListener.2=The IPCC GHGi compatible data is being generated +IPCCGeneratorListener.3=Refresh the data (update with latest from Collect Earth) +IPCCGeneratorListener.4=Use the latest generated database (fastest process - no update) +IPCCGeneratorListener.5=GHGi Database generation +IPCCGeneratorListener.6=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming but it is necessary if the Collect Earth data has been updated since the last time.
\ No newline at end of file From 56e94cfce1815cf728d6e650811eecb14a03232d Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Wed, 30 Nov 2022 10:51:48 +0100 Subject: [PATCH 1618/1620] New translations Messages.properties (Spanish) --- .../earth/app/view/Messages_es.properties | 130 ++++++++++-------- 1 file changed, 69 insertions(+), 61 deletions(-) diff --git a/collect-earth/collect-earth-app/src/main/resources/org/openforis/collect/earth/app/view/Messages_es.properties b/collect-earth/collect-earth-app/src/main/resources/org/openforis/collect/earth/app/view/Messages_es.properties index dc10055cfb..991c6c1799 100644 --- a/collect-earth/collect-earth-app/src/main/resources/org/openforis/collect/earth/app/view/Messages_es.properties +++ b/collect-earth/collect-earth-app/src/main/resources/org/openforis/collect/earth/app/view/Messages_es.properties @@ -1,5 +1,5 @@ AboutDialog.19=Problemas al abrir -AboutDialog.5=Para mas informacion visite nuestra web OpenForis.org +AboutDialog.5=Para mas informacion visite nuestra web OpenForis.org AboutDialog.6=Lo sentimos, hemos tenido un problema al intentar abrir el link en su navegador standard. AboutDialog.8=Ok AspectCode.0=Norte @@ -16,26 +16,26 @@ CollectEarthMenu.3=Dividir archivos de parcelas CSV grandes CollectEarthMenu.4=Exportar datos a XML (desde una fecha especifica hasta este momento) CollectEarthMenu.5=Exportar a Collect Backup CollectEarthMenu.6=Exportar datos como Collect Backup (todos los datos) -CollectEarthMenu.7=Exportar datos como Collect Backup (desde fecha) CollectEarthMenu.7=Exportar datos como Collect Backup (filtrar por atributo ) +CollectEarthMenu.8=Export data to XML (using summary attribute) CollectEarthWindow.0=Error al intentar exportar los datos a un archivo CSV CollectEarthWindow.10=Archivo CollectEarthWindow.11=Cerrar CollectEarthWindow.12=Herramientas CollectEarthWindow.13=Descargar datos a CSV (Excel) -CollectEarthWindow.14=Comenzar análisis con Saiku +CollectEarthWindow.14=Comenzar análisis con Saiku CollectEarthWindow.15=Propiedades CollectEarthWindow.16=Ayuda -CollectEarthWindow.17=Declaración +CollectEarthWindow.17=Declaración CollectEarthWindow.18=Encontrar parcelas ausentes de la Base de Datos CollectEarthWindow.19=Collect Earth CollectEarthWindow.1=Error al exportar -CollectEarthWindow.20=Número de registros repetidos: +CollectEarthWindow.20=Número de registros repetidos\: CollectEarthWindow.21=No se pudo encontrar el icono de la ventana principal -CollectEarthWindow.22=¿Seguro que quieres cerrar Collect Earth?
El servidor de Collect Earth terminara al cerrar la ventana -CollectEarthWindow.23=Necesita confirmación +CollectEarthWindow.22=¿Seguro que quieres cerrar Collect Earth?
El servidor de Collect Earth terminara al cerrar la ventana +CollectEarthWindow.23=Necesita confirmación CollectEarthWindow.24=Exportar a XML -CollectEarthWindow.25=¿Quiere importar estos registros de todas formas y perder sus datos actuales? +CollectEarthWindow.25=¿Quiere importar estos registros de todas formas y perder sus datos actuales? CollectEarthWindow.26=Operador CollectEarthWindow.27=Actualizar CollectEarthWindow.28=El servidor Open Foris Collect Earth debe estar en funcionamiento mientras el operador esta realizando su trabajo. @@ -45,15 +45,15 @@ CollectEarthWindow.30=Por favor, mantenga esta ventana abierta mientras este uti CollectEarthWindow.31=Exportar los datos como archivos CSV CollectEarthWindow.32=Salir CollectEarthWindow.33=El nombre del operador ha de ser mas largo que cinco caracteres y mas corto que 50 -CollectEarthWindow.34=Error de validación -CollectEarthWindow.35=!NOMBRE DEL OPERADOR VACIO\!
Rellene el campo del nombre del operador y presione el botón de "Actualizar". -CollectEarthWindow.36=El nombre del operador no puede estar vacío +CollectEarthWindow.34=Error de validación +CollectEarthWindow.35=\!NOMBRE DEL OPERADOR VACIO\!
Rellene el campo del nombre del operador y presione el botón de "Actualizar". +CollectEarthWindow.36=El nombre del operador no puede estar vacío CollectEarthWindow.37=Conservar abierto CollectEarthWindow.38=Archivos CSV -CollectEarthWindow.39=ATENCION: Recomendamos que guarde una copia de seguridad de sus datos actuales (expórtelos a XML) antes de importar los nuevos datos. +CollectEarthWindow.39=ATENCION\: Recomendamos que guarde una copia de seguridad de sus datos actuales (expórtelos a XML) antes de importar los nuevos datos. CollectEarthWindow.3=\ Error al importar datos CollectEarthWindow.40=Configure la ruta a la carpeta donde el servidor Saiku ha sido instalado en Herramientas->Propiedades->Avanzadas. -CollectEarthWindow.41=Guardando los datos en el archivo: +CollectEarthWindow.41=Guardando los datos en el archivo\: CollectEarthWindow.42=Terminar CollectEarthWindow.43=Detectados registros repetidos CollectEarthWindow.44=Importar/Exportar datos @@ -62,7 +62,7 @@ CollectEarthWindow.46=Importar nuevos datos desde ZIP (XML comprimidos) CollectEarthWindow.47=Servidor Saiku no configurado CollectEarthWindow.48=Archivos zip/collect-data CollectEarthWindow.49=Archivos Fusion CSV -CollectEarthWindow.4=Exención de responsabilidad de FAO +CollectEarthWindow.4=Exención de responsabilidad de FAO CollectEarthWindow.50=Abrir Manual de Usuario CollectEarthWindow.51=Comprobar si hay actualizaciones de Collect Earth CollectEarthWindow.52=Abrir el archivo de registo de la aplicacion @@ -72,9 +72,9 @@ CollectEarthWindow.55=Actualizar datos ya registrados desde CSV CollectEarthWindow.56=Mas informacion... CollectEarthWindow.57=El proceso para comenzar Saiku esta ejecutandose todavia, espere unos minutos. CollectEarthWindow.58=No se pudo iniciar el analisis con Saiku -CollectEarthWindow.59=¿Quiere volver a generar los datos para el analisis de Saiku?
Este proceso puede tomar varios minutos.
Si hace click en "SI" los datos mas actuales seran generados. +CollectEarthWindow.59=¿Quiere volver a generar los datos para el analisis de Saiku?
Este proceso puede tomar varios minutos.
Si hace click en "SI" los datos mas actuales seran generados. CollectEarthWindow.5=Cerrar -CollectEarthWindow.60=Generación de datos para Saiku +CollectEarthWindow.60=Generación de datos para Saiku CollectEarthWindow.61=Exportar a XML (solo los registros anadidos/modificados) CollectEarthWindow.62=Mas informacion.. CollectEarthWindow.63=Error leyendo los puntos desde el KML @@ -86,21 +86,21 @@ CollectEarthWindow.6=Exportar datos a Fusion Table CollectEarthWindow.70=Abrir el manual de esta encuesta CollectEarthWindow.71=Generar herramienta Saiku independiente CollectEarthWindow.7=Error al importar los datos -CollectEarthWindow.8=No se pudo encontrar el testo de exención de responsabilidad -CollectEarthWindow.9=Los datos importados contienen registros que ya están presentes en su base de datos +CollectEarthWindow.8=No se pudo encontrar el testo de exención de responsabilidad +CollectEarthWindow.9=Los datos importados contienen registros que ya están presentes en su base de datos DynamicsCode.0=Inicialmente Bosque DynamicsCode.1=Inicialmente Pastizal DynamicsCode.2=Inicialmente Asentamiento DynamicsCode.3=Inicialmente Otras tierras DynamicsCode.4=Inicialmente Humedal DynamicsCode.5=Inicialmente Cultivo -EarthApp.11=Collect Earth ya está ejecutandose -EarthApp.21=El archivo CSV/CED que contiene el diseño de la malla de puntos no se encuentra en la ruta seleccionada :
-EarthApp.23=No se ha configurado ningun archivo de puntos CSV/CED :

-EarthApp.24=El archivo que contiene la plantilla de Freemarker con la definicion del KML no se encuntra en la ruta seleccionada :
-EarthApp.26=No se ha configurado ninguna archivo con la definicion del KML :

-EarthApp.27=El archivo que contiene el formulario del pop-up en HTMl no se ha encontrado en la ruta seleccionada :
-EarthApp.29=No se ha configurado ningun HTML de configuracion del pop-up :

+EarthApp.11=Collect Earth ya está ejecutandose +EarthApp.21=El archivo CSV/CED que contiene el diseño de la malla de puntos no se encuentra en la ruta seleccionada \:
+EarthApp.23=No se ha configurado ningun archivo de puntos CSV/CED \:

+EarthApp.24=El archivo que contiene la plantilla de Freemarker con la definicion del KML no se encuntra en la ruta seleccionada \:
+EarthApp.26=No se ha configurado ninguna archivo con la definicion del KML \:

+EarthApp.27=El archivo que contiene el formulario del pop-up en HTMl no se ha encontrado en la ruta seleccionada \:
+EarthApp.29=No se ha configurado ningun HTML de configuracion del pop-up \:

EarthApp.30=Corrija la localizacion del archivo a traves del menu Herramientas->Propiedades. EarthApp.3=Recordarme mas tarde EarthApp.4=Actualizar Ahora @@ -112,52 +112,51 @@ EarthApp.61=El archivo KMZ generado por Collect Earth no se pudo abrir.
-EarthApp.72=Utiliza la barra de herramientas de Collect Earth para abrir lo archivos .cep : +EarthApp.72=Utiliza la barra de herramientas de Collect Earth para abrir lo archivos .cep \: EarthApp.73=Collect Earth en ordenadores Mac OS X EarthSurveyService.9=Campo necesario -EarthSurveyService.9=Campo necesario ExportActionListener.1=Elija la fecha desde la que exportar los datos ExportDialogProcessMonitor.0=Procesando datos... -ExportDialogProcessMonitor.1=Esperando a la inicializacion del exportador : -ExportDialogProcessMonitor.4=Registros exportados : -ImportActionListener.0=¿Quiere importar los datos de las parcelas que no han sido completamente rellenadas? -ImportActionListener.2=Si hace click en NO se importarán solo los datos de las parcelas en el estado completo (verde)". +ExportDialogProcessMonitor.1=Esperando a la inicializacion del exportador \: +ExportDialogProcessMonitor.4=Registros exportados \: +ImportActionListener.0=¿Quiere importar los datos de las parcelas que no han sido completamente rellenadas? +ImportActionListener.2=Si hace click en NO se importarán solo los datos de las parcelas en el estado completo (verde)". ImportActionListener.3=Importar registros incompletos ImportDialogProcessMonitor.0=\ CALCULANDO -ImportDialogProcessMonitor.11=Cifra inicial the registros : +ImportDialogProcessMonitor.11=Cifra inicial the registros \: ImportDialogProcessMonitor.2=Importando registros... -ImportDialogProcessMonitor.5=Cifra final de registros importados : +ImportDialogProcessMonitor.5=Cifra final de registros importados \: ImportDialogProcessMonitor.8=Procesando datos... -ImportProcessMonitorDialog.0=Registros importados : +ImportProcessMonitorDialog.0=Registros importados \: ImportXMLDialogProcessMonitor.1 = Sobreescrivir las parcelas en BBDD ImportXMLDialogProcessMonitor.2 = Importar solo parcelas sin conflictos -InfiniteProgressMonitor.0=Cancelar operación +InfiniteProgressMonitor.0=Cancelar operación JFileChooserExistsAware.0=Archivo de proyecto Collect Earth KmlImportService.13=Seleccionar archivo CSV donde guardar las posiciones de las parcelas -MissingPlotsListener.0=Error cuando se estaba obteniendo información de las parcelas ausentes de la base de datos -MissingPlotsListener.10=Numero total de parcelas en el diseño de la muestra : -MissingPlotsListener.12=Numero de parcelas que faltan : +MissingPlotsListener.0=Error cuando se estaba obteniendo información de las parcelas ausentes de la base de datos +MissingPlotsListener.10=Numero total de parcelas en el diseño de la muestra \: +MissingPlotsListener.12=Numero de parcelas que faltan \: MissingPlotsListener.14=Todas las parcelas han sido rellenadas\! MissingPlotsListener.1=Parcelas que faltan MissingPlotsListener.2=Copiar contenidos MissingPlotsListener.3=Elija los archivos que contienen informacion sobre las parcelas ( archivos .csv o .ced ) para los que desea averiguar si todos los datos se han rellenado. -MissingPlotsListener.4=Parcelas ausentes \u2013 informacion -MissingPlotsListener.5=Del archivo : +MissingPlotsListener.4=Parcelas ausentes – informacion +MissingPlotsListener.5=Del archivo \: MissingPlotsListener.6=Exportar a archivo CED NO=No NO_TO_ALL=No a todo -OpenTextFileListener.0=El archivo de texto no ha sido encontrado en : +OpenTextFileListener.0=El archivo de texto no ha sido encontrado en \: OptionWizard.0=Opciones de Collect Earth OptionWizard.100=Abrir Planet OptionWizard.101=Llave de la API de Planet OptionWizard.1021=URL SecureWatch OptionWizard.102=Abrir Maxar SecureWatch (necesario tener licencia) -OptionWizard.103=Configurar la URL para el Mapa Extra (se abre cuando esta configurada) : +OptionWizard.103=Configurar la URL para el Mapa Extra (se abre cuando esta configurada) \: OptionWizard.104=Navegadores OptionWizard.105=Abrir Earth Map OptionWizard.110=Usar las imagenes mensuales de NICFI OptionWizard.10=Abrir carpeta de copias de seguridad -OptionWizard.11=Desconocido: usar ipconfig +OptionWizard.11=Desconocido\: usar ipconfig OptionWizard.12=Instancia cliente OptionWizard.13=Collect Earth Server IP OptionWizard.14=Collect Earth Server puerto (e.g. 8023) @@ -165,14 +164,14 @@ OptionWizard.15=Guardar & aplicar cambios OptionWizard.16=ID OptionWizard.17=X-coord OptionWizard.18=Y-coord -OptionWizard.19=Elevación +OptionWizard.19=Elevación OptionWizard.1=Elija navegador OptionWizard.20=Los contenidos de Google Earth han cambiado.
Acepte la recarga del contenido cuando Google Earth le pregunte. -OptionWizard.21=Actualizado con éxito +OptionWizard.21=Actualizado con éxito OptionWizard.22=Pendiente OptionWizard.23=Hubo un error al reabrir los datos en Google Earth OptionWizard.24=Cancelar -OptionWizard.25=Modo de operación +OptionWizard.25=Modo de operación OptionWizard.26=BBDD servidor OptionWizard.27=Esta no es una carpeta de un servido Saiku ( el archivo start-saiku.bat no esta presente) OptionWizard.28=Servidor Saiku no reconocible @@ -180,13 +179,13 @@ OptionWizard.29=BBDD puerto OptionWizard.2=Tipo de uso (servidor/cliente) OptionWizard.30=Opciones SQLite OptionWizard.31=Datos de muestra -OptionWizard.32=Diseño de parcela -OptionWizard.33=Definición de la encuesta +OptionWizard.32=Diseño de parcela +OptionWizard.33=Definición de la encuesta OptionWizard.34=Servicios integrados -OptionWizard.35=Número de puntos de control +OptionWizard.35=Número de puntos de control OptionWizard.36=Distancia entre los puntos de control (en metros) OptionWizard.37=Margen con el borde de la parcela (en metros) -OptionWizard.38=El archivo CSV/CED no pudo leerse correctamente.
El formato del archivo de valores separados por comas ha de ser como este :
+OptionWizard.38=El archivo CSV/CED no pudo leerse correctamente.
El formato del archivo de valores separados por comas ha de ser como este \:
OptionWizard.39=ID,Y-Coordinada,X-Coordinada,Elevacion,pendiente,orientacion OptionWizard.3=Servidor OptionWizard.40=Proyectos @@ -199,7 +198,7 @@ OptionWizard.46=Abrir Google Earth Engine Timelapse OptionWizard.47=Abrir Bing Maps OptionWizard.48=Abrir encuesta en un navegador externo en lugar de Google Earth (recomendado para LINUX) OptionWizard.49=Ruta del archivo ced/csv con las coordenadas de las parcelas -OptionWizard.4=IP de este ordenador: +OptionWizard.4=IP de este ordenador\: OptionWizard.50=Navegar... OptionWizard.51=Error al importar el archivos del proyecto OptionWizard.52=Archivo CSV/CED con coordenadas @@ -210,13 +209,12 @@ OptionWizard.56=Cargar proyecto OptionWizard.57=Proyectos ya cargados OptionWizard.58=Abrir GEE Code Editor (requiere accesso como Trusted Tester) OptionWizard.59=Abrir Here Maps -OptionWizard.59=Abrir Here Maps -OptionWizard.5=Collect Earth Server puerto: +OptionWizard.5=Collect Earth Server puerto\: OptionWizard.65=Ruta para la carpeta de Saiku OptionWizard.66=Navegar... OptionWizard.67=Ruta del ejecutable de Firefox OptionWizard.68=Navegar... -OptionWizard.6=Parámetros BD PostgreSQL +OptionWizard.6=Parámetros BD PostgreSQL OptionWizard.70=Archivos ejecutables OptionWizard.72=Archivos binarios OptionWizard.73=Ruta del ejecutable de Chrome @@ -230,13 +228,13 @@ OptionWizard.82=Plantilla Freemarker OptionWizard.83=Ruta al formulario HTML OptionWizard.84=Navegar... OptionWizard.86=Pagina web HTML -OptionWizard.87=Ruta al XML con la definición del IDM +OptionWizard.87=Ruta al XML con la definición del IDM OptionWizard.88=Navegar... OptionWizard.8=Password -OptionWizard.90=Definición XML IDM -OptionWizard.91=Servidor (versión para el gerente o para uso autónomo) +OptionWizard.90=Definición XML IDM +OptionWizard.91=Servidor (versión para el gerente o para uso autónomo) OptionWizard.92=Cliente (operador/conectado al servidor) -OptionWizard.93=SQLite (Embebida/basada en un único archivo) +OptionWizard.93=SQLite (Embebida/basada en un único archivo) OptionWizard.94=PostgreSQL OptionWizard.95=Lado del punto de sampleo (en metros) OptionWizard.9=Nombre de la Base de Datos @@ -244,14 +242,24 @@ ProcessMonitorDialog.1=Error de interpretacion en la fila ProcessMonitorDialog.4=, columnas ProcessMonitorDialog.5=\ -- valores SaikuAnalysisListener.0=Si - Actualizar datos de Saiku (proceso de larga duracion) -SaikuAnalysisListener.1=No - Usar los mismos datos de la ultima vez que se usó Saiku +SaikuAnalysisListener.1=No - Usar los mismos datos de la ultima vez que se usó Saiku SaikuStarter.1=Iniciando Saiku SaikuStarter.2=Iniciar Saiku puede tomar varios minutos, espere por favor.\! -SaikuToolExportListener.1=Generación herramienta Saiku +SaikuToolExportListener.1=Generación herramienta Saiku SaikuToolExportListener.2=Generando la herramienta Saiku que incluye la base de datos SaveEarthDataServlet.0=Sin datos SaveEarthDataServlet.1=Problemas al guardar los datos en la Base de Datos SaveEarthDataServlet.2=Los datos se han guardado SlopeCode.0=Llano (0-5) YES=Si -YES_TO_ALL=Si a todo \ No newline at end of file +YES_TO_ALL=Si a todo + +GenerateDatabaseStarter.1=Preparing for analysis +GenerateDatabaseStarter.2=Generating Relational Database + +IPCCGeneratorListener.1=Waiting for process to complete\! +IPCCGeneratorListener.2=The IPCC GHGi compatible data is being generated +IPCCGeneratorListener.3=Refresh the data (update with latest from Collect Earth) +IPCCGeneratorListener.4=Use the latest generated database (fastest process - no update) +IPCCGeneratorListener.5=GHGi Database generation +IPCCGeneratorListener.6=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming but it is necessary if the Collect Earth data has been updated since the last time.
\ No newline at end of file From 128135c74879b5f1d6f9f475eb4390d57009f310 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Wed, 30 Nov 2022 10:51:49 +0100 Subject: [PATCH 1619/1620] New translations Messages.properties (Portuguese) --- .../earth/app/view/Messages_pt.properties | 243 +++++++++--------- 1 file changed, 126 insertions(+), 117 deletions(-) diff --git a/collect-earth/collect-earth-app/src/main/resources/org/openforis/collect/earth/app/view/Messages_pt.properties b/collect-earth/collect-earth-app/src/main/resources/org/openforis/collect/earth/app/view/Messages_pt.properties index 5aae94366d..ba0947a25c 100644 --- a/collect-earth/collect-earth-app/src/main/resources/org/openforis/collect/earth/app/view/Messages_pt.properties +++ b/collect-earth/collect-earth-app/src/main/resources/org/openforis/collect/earth/app/view/Messages_pt.properties @@ -1,6 +1,6 @@ AboutDialog.19=Ocorreu um problema -AboutDialog.5=Para mais informações visite nosso site OpenForis.org -AboutDialog.6=Desculpe, um problema ocorreu ao tentar abrir esse link no seu navegador padrão. +AboutDialog.5=Para mais informações visite nosso site OpenForis.org +AboutDialog.6=Desculpe, um problema ocorreu ao tentar abrir esse link no seu navegador padrão. AboutDialog.8=Ok AspectCode.0=Norte AspectCode.1=Nordeste @@ -13,7 +13,7 @@ AspectCode.7=Noroeste CollectEarthMenu.0=Importar Arquivo CEP CollectEarthMenu.2=Utilidades CollectEarthMenu.3=Separar arquivo CSV em partes -CollectEarthMenu.4=Exportar dados para XML (da data específica até o tempo presente) +CollectEarthMenu.4=Exportar dados para XML (da data específica até o tempo presente) CollectEarthMenu.5=Exportar para Collect Backup CollectEarthMenu.6=Exportar dados como Collect Backup (todos os dados) CollectEarthMenu.7=Exportar dados como Collect Backup (a partir de uma data) @@ -23,62 +23,62 @@ CollectEarthWindow.10=Arquivo CollectEarthWindow.11=Fechar CollectEarthWindow.12=Ferramentas CollectEarthWindow.13=Baixar dados para CSV (Excel) -CollectEarthWindow.14=Iniciar Análise SAIKU +CollectEarthWindow.14=Iniciar Análise SAIKU CollectEarthWindow.15=Propiedades CollectEarthWindow.16=Ajuda -CollectEarthWindow.17=Declaração +CollectEarthWindow.17=Declaração CollectEarthWindow.18=Encontrar parcelas ausentes em banco de dados CollectEarthWindow.19=Collect Earth CollectEarthWindow.1=Erro ao exportar -CollectEarthWindow.20=Número de registros duplicados: -CollectEarthWindow.21=Não foi possível encontrar o ícone para a janela principal -CollectEarthWindow.22=Tem certeza de querer fechar Collect Earth?
Ao fechar a janela será fechada também o servidor de Collect Earth -CollectEarthWindow.23=Confirmação requerida +CollectEarthWindow.20=Número de registros duplicados\: +CollectEarthWindow.21=Não foi possível encontrar o ícone para a janela principal +CollectEarthWindow.22=Tem certeza de querer fechar Collect Earth?
Ao fechar a janela será fechada também o servidor de Collect Earth +CollectEarthWindow.23=Confirmação requerida CollectEarthWindow.24=Exportar a XML CollectEarthWindow.25=Quer importar estes registros de qualquer maneira e perder o seus dados atuais? CollectEarthWindow.26=Operador CollectEarthWindow.27=Atualizar -CollectEarthWindow.28=O servidor Open Foris Collect Earth deve estar em execução enquanto o operador interprete os dados. -CollectEarthWindow.29=O servidor Saiku não está configurado. +CollectEarthWindow.28=O servidor Open Foris Collect Earth deve estar em execução enquanto o operador interprete os dados. +CollectEarthWindow.29=O servidor Saiku não está configurado. CollectEarthWindow.2=Idioma CollectEarthWindow.30=Por favor mantenha esta janela aberta enquanto estiver usando o Google Earth. CollectEarthWindow.31=Exportar os dados coletados para um arquivo CSV CollectEarthWindow.32=Fechar CollectEarthWindow.33=O nome do operador deve ser maior de que 5 caracteres e mais curto do que 50 -CollectEarthWindow.34= Erro de Validação -CollectEarthWindow.35=NOME DO OPERADOR VAZIO\!
Preencha o nome do operador e clique no botão "Atualizar". -CollectEarthWindow.36=Nome do operador não pode estar vazio +CollectEarthWindow.34=Erro de Validação +CollectEarthWindow.35=NOME DO OPERADOR VAZIO\!
Preencha o nome do operador e clique no botão "Atualizar". +CollectEarthWindow.36=Nome do operador não pode estar vazio CollectEarthWindow.37=Permanecer Aberto CollectEarthWindow.38=Arquivos de CSV -CollectEarthWindow.39=AVISO:Se recomenda de fazer um back-up dos seus dados atuais(Exportar para XML) antes de importar os novos dados +CollectEarthWindow.39=AVISO\:Se recomenda de fazer um back-up dos seus dados atuais(Exportar para XML) antes de importar os novos dados CollectEarthWindow.3=\ Erro ao importar dados. -CollectEarthWindow.40=Configurar caminho para o arquivo onde o Servidor Saiku se encontra instalado em Ferramentas->Propiedades->Avançado. -CollectEarthWindow.41=Guardar dados exportados para o arquivo: +CollectEarthWindow.40=Configurar caminho para o arquivo onde o Servidor Saiku se encontra instalado em Ferramentas->Propiedades->Avançado. +CollectEarthWindow.41=Guardar dados exportados para o arquivo\: CollectEarthWindow.42=Sair CollectEarthWindow.43=Registros repetidos detectados CollectEarthWindow.44=Importar/Exportar CollectEarthWindow.45=Exportar dados para XML (comprimidos) CollectEarthWindow.46=Importar novos dados do ZIP (XML comprimidos) -CollectEarthWindow.47=Servidor Saiku não configurado +CollectEarthWindow.47=Servidor Saiku não configurado CollectEarthWindow.48=Arquivos ZIP CollectEarthWindow.49=Arquivos Fusion CSV -CollectEarthWindow.4=Isenção de responsabilidade da FAO -CollectEarthWindow.50=Abrir Manual de Usuário -CollectEarthWindow.51=Verificar atualizações de Collect Earth -CollectEarthWindow.52=Abrir Arquivo de Registro da aplicação +CollectEarthWindow.4=Isenção de responsabilidade da FAO +CollectEarthWindow.50=Abrir Manual de Usuário +CollectEarthWindow.51=Verificar atualizações de Collect Earth +CollectEarthWindow.52=Abrir Arquivo de Registro da aplicação CollectEarthWindow.53=Arquivo de Registro de Collect Earth CollectEarthWindow.54=Carregar pontos de KML CollectEarthWindow.55=Atualizar registros atuais usando CSV CollectEarthWindow.56=Sobre... -CollectEarthWindow.57=O processo de arranque de Saiku ainda está em execução, por favor aguarde. -CollectEarthWindow.58=Não é possível iniciar a análise com Saiku -CollectEarthWindow.59=Quer voltar a gerar o conjunto de dados para o análise de Saiku?
Este processo pode demorar vários minutos.
Se clicar em "SIM" um novo conjunto de dados com a mais recente informação será gerada. +CollectEarthWindow.57=O processo de arranque de Saiku ainda está em execução, por favor aguarde. +CollectEarthWindow.58=Não é possível iniciar a análise com Saiku +CollectEarthWindow.59=Quer voltar a gerar o conjunto de dados para o análise de Saiku?
Este processo pode demorar vários minutos.
Se clicar em "SIM" um novo conjunto de dados com a mais recente informação será gerada. CollectEarthWindow.5=Fechar -CollectEarthWindow.60=Geraço de dados para Saiku +CollectEarthWindow.60=Geraço de dados para Saiku CollectEarthWindow.61=Exportar dados para XML (apenas os registros adicionados/modificados) CollectEarthWindow.62=Sobre... CollectEarthWindow.63=Erro acessando pontos de KML -CollectEarthWindow.64=Suporte Técnico +CollectEarthWindow.64=Suporte Técnico CollectEarthWindow.65=O nome do operador foi alterado CollectEarthWindow.66=Nome do operador CollectEarthWindow.67=Abra a pasta de dados do CE @@ -86,171 +86,180 @@ CollectEarthWindow.6=Exportar dados a Fusion Table CollectEarthWindow.70=Abra o manuel desta pesquisa CollectEarthWindow.71=Gerar ferramenta Saiku Independente CollectEarthWindow.7=Erro ao importar os dados -CollectEarthWindow.8=Texto de isenção não foi possivel de ser encontrado -CollectEarthWindow.9=Os dados importados contém registros que já estão presentes no seu banco de dados. +CollectEarthWindow.8=Texto de isenção não foi possivel de ser encontrado +CollectEarthWindow.9=Os dados importados contém registros que já estão presentes no seu banco de dados. DynamicsCode.0=Inicialmente Floresta -DynamicsCode.1=Inicialmente Área de Pastagem -DynamicsCode.2=Inicialmente Área Urbana +DynamicsCode.1=Inicialmente Ãrea de Pastagem +DynamicsCode.2=Inicialmente Ãrea Urbana DynamicsCode.3=Inicialmente Outros -DynamicsCode.4=Inicialmente Área Alagada -DynamicsCode.5=Inicialmente Área Agrícola -EarthApp.11=Collect Earth já está em execução -EarthApp.21=O arquivo contendo o gride de pontos como CSV/CED não foi encontrado no caminho selecionado:
-EarthApp.23=Nenhum arquivo CSV/CED foi configurado :

-EarthApp.24=O arquivo contendo o modelo Freemarker com a definição KML não foi encontrado no caminho selecionado :
-EarthApp.26=Nenhum arquivo de definição KML foi configurado :

-EarthApp.27=O arquivo contendo o formato balão HTML não foi encontrado no caminho selecionado :
-EarthApp.29=Nenhum arquivo balão HTML foi configurado :

-EarthApp.30=Por favor corrija a localização do arquivo no menu Ferramentas->Propriedades. +DynamicsCode.4=Inicialmente Ãrea Alagada +DynamicsCode.5=Inicialmente Ãrea Agrícola +EarthApp.11=Collect Earth já está em execução +EarthApp.21=O arquivo contendo o gride de pontos como CSV/CED não foi encontrado no caminho selecionado\:
+EarthApp.23=Nenhum arquivo CSV/CED foi configurado \:

+EarthApp.24=O arquivo contendo o modelo Freemarker com a definição KML não foi encontrado no caminho selecionado \:
+EarthApp.26=Nenhum arquivo de definição KML foi configurado \:

+EarthApp.27=O arquivo contendo o formato balão HTML não foi encontrado no caminho selecionado \:
+EarthApp.29=Nenhum arquivo balão HTML foi configurado \:

+EarthApp.30=Por favor corrija a localização do arquivo no menu Ferramentas->Propriedades. EarthApp.3=Lembrar mais tarde EarthApp.4=Atualizar Agora -EarthApp.57=Existe uma nova versão do Collect Earth disponível!
Como gostaria de proceder? -EarthApp.58=Alerta de Atualização +EarthApp.57=Existe uma nova versão do Collect Earth disponível\!
Como gostaria de proceder? +EarthApp.58=Alerta de Atualização EarthApp.59=Erro ao importar aquivo do projeto -EarthApp.5=Não me lembre novamente -EarthApp.61=O arquivo do Collect Earth não pôde ser aberto.
Por favor certifique-se que Google Earth esteja instalado. -EarthApp.6= - Versão +EarthApp.5=Não me lembre novamente +EarthApp.61=O arquivo do Collect Earth não pôde ser aberto.
Por favor certifique-se que Google Earth esteja instalado. +EarthApp.6=- Versão EarthApp.70=AVISO -EarthApp.71=No Mac OS X, os arquivos do projeto Collect Earth (* .cep) não serão abertos no Collect Earth quando forem clicados duas vezes.
-EarthApp.72=Use a barra de ferramentas Collect Earth para abrir os arquivos .cep : +EarthApp.71=No Mac OS X, os arquivos do projeto Collect Earth (* .cep) não serão abertos no Collect Earth quando forem clicados duas vezes.
+EarthApp.72=Use a barra de ferramentas Collect Earth para abrir os arquivos .cep \: EarthApp.73=Collect Earth - problemas em computadores Mac OS X -EarthSurveyService.9=Campo obrigatório +EarthSurveyService.9=Campo obrigatório ExportActionListener.1=Escolha data a partir da qual queira exportar os dados ExportDialogProcessMonitor.0=Processando os dados... -ExportDialogProcessMonitor.1=Esperando de inicializar o processo : -ExportDialogProcessMonitor.4=Registros exportados : -ExportDialogProcessMonitor.4=Registros importados : -ImportActionListener.0=Deseja importar os dados das parcelas que não tenham sido completamente preenchidos? -ImportActionListener.2=Se clicar NÃ\u0192O apenas os dados das parcelas em estado completo ("verde"), serão importados. +ExportDialogProcessMonitor.1=Esperando de inicializar o processo \: +ExportDialogProcessMonitor.4=Registros importados \: +ImportActionListener.0=Deseja importar os dados das parcelas que não tenham sido completamente preenchidos? +ImportActionListener.2=Se clicar NÃO apenas os dados das parcelas em estado completo ("verde"), serão importados. ImportActionListener.3=Importar registros incompletos ImportDialogProcessMonitor.0=\ CALCULANDO -ImportDialogProcessMonitor.11=Cifra inicial de registros : +ImportDialogProcessMonitor.11=Cifra inicial de registros \: ImportDialogProcessMonitor.2=Importando registros.... -ImportDialogProcessMonitor.5=Cifra final de registros importados : +ImportDialogProcessMonitor.5=Cifra final de registros importados \: ImportDialogProcessMonitor.8=Processando dados... -ImportProcessMonitorDialog.0=Imported records : +ImportProcessMonitorDialog.0=Imported records \: ImportXMLDialogProcessMonitor.1 = Substitua dados no banco de dados -ImportXMLDialogProcessMonitor.2 = Importe apenas registros não conflitantes -InfiniteProgressMonitor.0=Cancelar operação +ImportXMLDialogProcessMonitor.2 = Importe apenas registros não conflitantes +InfiniteProgressMonitor.0=Cancelar operação JFileChooserExistsAware.0=Arquivo de projeto Collect Earth -KmlImportService.13=Selecione um arquivo CSV para salvar a localização dos pontos -MissingPlotsListener.0=Erro ao obter informação sobre parcelas ausentes na Base de Dados -MissingPlotsListener.10=Número total de ppontos no desenho de amostragem : -MissingPlotsListener.12=Número de pontos perdidos : -MissingPlotsListener.14=Todos os pontos foram preenchidos! +KmlImportService.13=Selecione um arquivo CSV para salvar a localização dos pontos +MissingPlotsListener.0=Erro ao obter informação sobre parcelas ausentes na Base de Dados +MissingPlotsListener.10=Número total de ppontos no desenho de amostragem \: +MissingPlotsListener.12=Número de pontos perdidos \: +MissingPlotsListener.14=Todos os pontos foram preenchidos\! MissingPlotsListener.1=Parcelas ausentes -MissingPlotsListener.2=Copiar conteúdos -MissingPlotsListener.3=Escolha os arquivos contendo informação sobre as parcelas ( .csv or .ced files ) para os quais deseja saber se todos os dados foram preenchidos. -MissingPlotsListener.4=Parcelas ausentes - informação -MissingPlotsListener.5=Do arquivo : +MissingPlotsListener.2=Copiar conteúdos +MissingPlotsListener.3=Escolha os arquivos contendo informação sobre as parcelas ( .csv or .ced files ) para os quais deseja saber se todos os dados foram preenchidos. +MissingPlotsListener.4=Parcelas ausentes - informação +MissingPlotsListener.5=Do arquivo \: MissingPlotsListener.6=Exportar para arquivo CED -NO=Não -NO_TO_ALL=Não para todos -OpenTextFileListener.0=O arquivo de texto não foi encontrado em : -OptionWizard.0=Opções do Collect Earth +NO=Não +NO_TO_ALL=Não para todos +OpenTextFileListener.0=O arquivo de texto não foi encontrado em \: +OptionWizard.0=Opções do Collect Earth OptionWizard.100=Abrir Planet OptionWizard.101=Llave da API do Planet OptionWizard.1021=URL SecureWatch OptionWizard.102=Abrir Maxar SecureWatch -OptionWizard.103=Configure o URL para o Mapa Extra (abre quando configurado) : +OptionWizard.103=Configure o URL para o Mapa Extra (abre quando configurado) \: OptionWizard.104=Navegadores OptionWizard.105=Abrir Earth Map OptionWizard.110=Use imagens mensais fornecidas pela NICFI OptionWizard.10=Abrir arquivo de backup -OptionWizard.11=Desconhecido: usar ifconfig -OptionWizard.12=Cliente Instância +OptionWizard.11=Desconhecido\: usar ifconfig +OptionWizard.12=Cliente Instância OptionWizard.13=Collect Earth Server IP OptionWizard.14=Collect Earth Porta de Servidor (p.ex. 8023) -OptionWizard.15=Guardar & Aplicar alteraçães +OptionWizard.15=Guardar & Aplicar alteraçães OptionWizard.16=ID OptionWizard.17=X-coord OptionWizard.18=Y-coord -OptionWizard.19=Elevação +OptionWizard.19=Elevação OptionWizard.1=Escolher Navegador -OptionWizard.20= Os conteúdos de Google Earth foram alterados.
Por favor aceite a regarga do conteúdo uma vez que Google Earth lhe pergunte. +OptionWizard.20= Os conteúdos de Google Earth foram alterados.
Por favor aceite a regarga do conteúdo uma vez que Google Earth lhe pergunte. OptionWizard.21=Atualizado com sucesso OptionWizard.22=Relevo OptionWizard.23=Houve um erro ao reabrir os dados de Google Earth OptionWizard.24=Cancelar -OptionWizard.25=Modo de Operação +OptionWizard.25=Modo de Operação OptionWizard.26=BBDD servidor -OptionWizard.27=Isto não é um Arquivo Saiku reconhecível (o arquivo start-saiku.bat não se encontra presente) -OptionWizard.28=Servidor Saiku não reconhecível +OptionWizard.27=Isto não é um Arquivo Saiku reconhecível (o arquivo start-saiku.bat não se encontra presente) +OptionWizard.28=Servidor Saiku não reconhecível OptionWizard.29=BBDD porta OptionWizard.2=Tipo de uso(servidor/cliente) -OptionWizard.30=Opçães SQLite +OptionWizard.30=Opçães SQLite OptionWizard.31=Dados de amostra -OptionWizard.32=Disposição da Parcela -OptionWizard.33=Definiço de Questionários -OptionWizard.34=Serviços Integrados -OptionWizard.35=Número de pontos de control -OptionWizard.36=Distância entre os pontos de control (em metros) -OptionWizard.37=Margem com o perímetro da parcela (em metros) -OptionWizard.38=O arquivo CSV/CED não foi possivel ser lido corretamente.
O arquivo deve conter valores separados por vírgulas do seguinte modo:
-OptionWizard.39=ID,Y-Coordenada,X-Coordenada,elevação,relevo,orientação +OptionWizard.32=Disposição da Parcela +OptionWizard.33=Definiço de Questionários +OptionWizard.34=Serviços Integrados +OptionWizard.35=Número de pontos de control +OptionWizard.36=Distância entre os pontos de control (em metros) +OptionWizard.37=Margem com o perímetro da parcela (em metros) +OptionWizard.38=O arquivo CSV/CED não foi possivel ser lido corretamente.
O arquivo deve conter valores separados por vírgulas do seguinte modo\:
+OptionWizard.39=ID,Y-Coordenada,X-Coordenada,elevação,relevo,orientação OptionWizard.3=Servidor Instance OptionWizard.40=Projetos OptionWizard.41=Carregar um novo arquivo de projeto OptionWizard.42=Erro ao fechar o leitor CSV -OptionWizard.43=Nome do questionário +OptionWizard.43=Nome do questionário OptionWizard.44=Realizar automaticamente backup do banco de dados em OptionWizard.45=Abrir Earth Engine Playground (descontinuado) OptionWizard.46=Abrir Earth Engine Timelapse OptionWizard.47=Abrir Bing Maps -OptionWizard.48=Abrir formulário em um navegador externo em vez de Google Earth (recomendado para LINUX) +OptionWizard.48=Abrir formulário em um navegador externo em vez de Google Earth (recomendado para LINUX) OptionWizard.49=Caminho do arquivo CED/CSV com as coordenadas das parcelas -OptionWizard.4=IP do computador atual: +OptionWizard.4=IP do computador atual\: OptionWizard.50=Navegar.. OptionWizard.51=Erro ao importar os arquivos do projeto -OptionWizard.52= Arquivo CSV/CED com coordinadas +OptionWizard.52=Arquivo CSV/CED com coordinadas OptionWizard.53=Sem pontos OptionWizard.54=Ponto Central -OptionWizard.55=Erro ao importar diretório do projeto +OptionWizard.55=Erro ao importar diretório do projeto OptionWizard.56=Carregar projeto OptionWizard.57=Projetos previamente carregados OptionWizard.58=Abrir GEE Code Editor (requer acesso ao Trusted Tester) OptionWizard.59=Abrir Here Maps focado no ponto -OptionWizard.5= Collect Earth Servidor porto: +OptionWizard.5=Collect Earth Servidor porto\: OptionWizard.65=Caminho para arquivo Saiku OptionWizard.66=Navegar... -OptionWizard.67=Caminho para o executável do Firefox +OptionWizard.67=Caminho para o executável do Firefox OptionWizard.68=Navegar... -OptionWizard.6=Parâmetros BD PostgreSQL -OptionWizard.70=Arquivos executáveis -OptionWizard.72=Arquivos binários -OptionWizard.73=Caminho para o executável do Chrome +OptionWizard.6=Parâmetros BD PostgreSQL +OptionWizard.70=Arquivos executáveis +OptionWizard.72=Arquivos binários +OptionWizard.73=Caminho para o executável do Chrome OptionWizard.74=Navegar... -OptionWizard.76=Arquivos executáveis +OptionWizard.76=Arquivos executáveis OptionWizard.78=Arquivos binarios -OptionWizard.79=Caminho para o padrão de KML Freemarker -OptionWizard.7=Nome de Usuário +OptionWizard.79=Caminho para o padrão de KML Freemarker +OptionWizard.7=Nome de Usuário OptionWizard.80=Navegar... -OptionWizard.82=Padrão Freemarker -OptionWizard.83=Caminho para formulário HTML Balloon +OptionWizard.82=Padrão Freemarker +OptionWizard.83=Caminho para formulário HTML Balloon OptionWizard.84=Navegar... OptionWizard.86=Pagina web HTML -OptionWizard.87=Caminho para XML com definição IDM +OptionWizard.87=Caminho para XML com definição IDM OptionWizard.88=Navegar... OptionWizard.8=Senha -OptionWizard.90=Definiço XML IDM -OptionWizard.91=Servidor (versão para gerente ou uso autônomo) +OptionWizard.90=Definiço XML IDM +OptionWizard.91=Servidor (versão para gerente ou uso autônomo) OptionWizard.92=Cliente (operador/conectado ao servidor) -OptionWizard.93=SQLite (Embutido/com base em um único arquivo) +OptionWizard.93=SQLite (Embutido/com base em um único arquivo) OptionWizard.94=PostgreSQL OptionWizard.95=Side of the sampling dots (in meters) -OptionWizard.9= Nome da Base de Dados -ProcessMonitorDialog.1=Erro de análise na linha número +OptionWizard.9=Nome da Base de Dados +ProcessMonitorDialog.1=Erro de análise na linha número ProcessMonitorDialog.4=, colunas -ProcessMonitorDialog.5= -- valores +ProcessMonitorDialog.5=-- valores SaikuAnalysisListener.0=Sim - Atualizar dados Saiku (longo processo) -SaikuAnalysisListener.1=Não - Use a mesma versão dos dados da última vez que o Saiku foi usado -SaikuToolExportListener.1=Geração da ferramenta Saiku -SaikuToolExportListener.2=Gerando a Ferramenta Saiku com o banco de dados atual +SaikuAnalysisListener.1=Não - Use a mesma versão dos dados da última vez que o Saiku foi usado SaikuStarter.1=Iniciando Saiku SaikuStarter.2=Iniciando Saiku pode demorar uns minutos, por favor aguarde\! +SaikuToolExportListener.1=Geração da ferramenta Saiku +SaikuToolExportListener.2=Gerando a Ferramenta Saiku com o banco de dados atual SaveEarthDataServlet.0=Sem dados SaveEarthDataServlet.1=Problema ocorreu ao guardar os dados na Base de Dados SaveEarthDataServlet.2=Os dados foram guardados SlopeCode.0=Plano (0-5) YES=Sim -YES_TO_ALL=Sim a todas \ No newline at end of file +YES_TO_ALL=Sim a todas + +GenerateDatabaseStarter.1=Preparing for analysis +GenerateDatabaseStarter.2=Generating Relational Database + +IPCCGeneratorListener.1=Waiting for process to complete\! +IPCCGeneratorListener.2=The IPCC GHGi compatible data is being generated +IPCCGeneratorListener.3=Refresh the data (update with latest from Collect Earth) +IPCCGeneratorListener.4=Use the latest generated database (fastest process - no update) +IPCCGeneratorListener.5=GHGi Database generation +IPCCGeneratorListener.6=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming but it is necessary if the Collect Earth data has been updated since the last time.
\ No newline at end of file From 25e1ecee1bcd9453a53ce6d823004dfe282a55e9 Mon Sep 17 00:00:00 2001 From: Alfonso Sanchez-Paus Diaz Date: Wed, 30 Nov 2022 10:51:50 +0100 Subject: [PATCH 1620/1620] New translations Messages.properties (English) --- .../earth/app/view/Messages_en.properties | 265 ++++++++++++++++++ 1 file changed, 265 insertions(+) create mode 100644 collect-earth/collect-earth-app/src/main/resources/org/openforis/collect/earth/app/view/Messages_en.properties diff --git a/collect-earth/collect-earth-app/src/main/resources/org/openforis/collect/earth/app/view/Messages_en.properties b/collect-earth/collect-earth-app/src/main/resources/org/openforis/collect/earth/app/view/Messages_en.properties new file mode 100644 index 0000000000..3ce9622fe0 --- /dev/null +++ b/collect-earth/collect-earth-app/src/main/resources/org/openforis/collect/earth/app/view/Messages_en.properties @@ -0,0 +1,265 @@ +AboutDialog.19=A problem occurred +AboutDialog.5=For more information visit our website OpenForis.org +AboutDialog.6=Sorry, a problem occurred while trying to open this link in your system's standard browser. +AboutDialog.8=Ok +AspectCode.0=North +AspectCode.1=North-East +AspectCode.2=East +AspectCode.3=South-East +AspectCode.4=South +AspectCode.5=South-West +AspectCode.6=West +AspectCode.7=North-West +CollectEarthMenu.0=Import CEP file +CollectEarthMenu.2=Utilities +CollectEarthMenu.3=Divide large CSV plot files +CollectEarthMenu.4=Export data to XML (from specific date until present) +CollectEarthMenu.5=Export to Collect Backup +CollectEarthMenu.6=Export data as Collect Backup (all data) +CollectEarthMenu.7=Export data as Collect Backup (from date) +CollectEarthMenu.8=Export data to XML (using summary attribute) +CollectEarthWindow.0=Error when attempting to export data to CSV file +CollectEarthWindow.10=File +CollectEarthWindow.11=Exit +CollectEarthWindow.12=Tools +CollectEarthWindow.13=Download data to CSV (Excel) +CollectEarthWindow.14=Start SAIKU Analysis +CollectEarthWindow.15=Properties +CollectEarthWindow.16=Help +CollectEarthWindow.17=Disclaimer +CollectEarthWindow.18=Find missing plots in database +CollectEarthWindow.19=Collect Earth +CollectEarthWindow.1=Export error +CollectEarthWindow.20=Number of duplicated records\: +CollectEarthWindow.21=Could not find icon for main frame +CollectEarthWindow.22=Are you sure that you want to close Collect Earth?
Closing the window will also close the Collect Earth server +CollectEarthWindow.23=Confirmation needed +CollectEarthWindow.24=XML Export +CollectEarthWindow.25=Do you want to add these records anyway and lose your current data? +CollectEarthWindow.26=Operator +CollectEarthWindow.27=Update +CollectEarthWindow.28=Open Foris Collect Earth server should be running while the operator interprets data. +CollectEarthWindow.29=The Saiku Server is not configured. +CollectEarthWindow.2=Language +CollectEarthWindow.30=Please maintain this window open while you are using Google Earth. +CollectEarthWindow.31=Export collected data to CSV file +CollectEarthWindow.32=Quit +CollectEarthWindow.33=The operator name has to be longer than 5 characters and shorter than 50 +CollectEarthWindow.34=Validation error +CollectEarthWindow.35=OPERATOR NAME EMPTY\!
Please fill the operator name and press the "Update" button. +CollectEarthWindow.36=Operator name cannot be empty +CollectEarthWindow.37=Keep Open +CollectEarthWindow.38=CSV files +CollectEarthWindow.39=NOTICE\: It is advisable that you back-up your current data (Export to XML) before importing the new data +CollectEarthWindow.3=\ Import error +CollectEarthWindow.40=Set-up the path to the folder where Saiku Server is installed in the Tools->Properties->Advanced tab. +CollectEarthWindow.41=Saving exported data to file\: +CollectEarthWindow.42=Quit +CollectEarthWindow.43=Conflicting records found +CollectEarthWindow.44=Data Import/Export +CollectEarthWindow.45=Export data to XML (compressed) +CollectEarthWindow.46=Import new data from ZIP (compressed XML) +CollectEarthWindow.47=Saiku Server not configured +CollectEarthWindow.48=Zip/collect-data files +CollectEarthWindow.49=Fusion CSV files +CollectEarthWindow.4=FAO Disclaimer notices +CollectEarthWindow.50=Open User Manual +CollectEarthWindow.51=Check for updates of Collect Earth +CollectEarthWindow.52=Open Application Log File +CollectEarthWindow.53=Collect Earth Log file +CollectEarthWindow.54=Load points from KML +CollectEarthWindow.55=Update current records using CSV +CollectEarthWindow.56=About... +CollectEarthWindow.57=The Saiku starter process is still running, please wait. +CollectEarthWindow.58=Cannot start Saiku analysis +CollectEarthWindow.59=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming.
If you click on "YES" a new dataset with the latest information will be generated. +CollectEarthWindow.5=Close +CollectEarthWindow.60=Saiku data generation +CollectEarthWindow.61=Export data to XML (modified records since last export) +CollectEarthWindow.62=About... +CollectEarthWindow.63=Error getting the points from KML +CollectEarthWindow.64=Technical Support +CollectEarthWindow.65=The operator name has been changed +CollectEarthWindow.66=Operator name +CollectEarthWindow.67=Open data folder +CollectEarthWindow.6=Export to Fusion Table +CollectEarthWindow.70=Open the Survey Guide +CollectEarthWindow.71=Generate Stand-Alone Saiku tool +CollectEarthWindow.7=Error when importing data +CollectEarthWindow.8=Disclaimer text could not be found +CollectEarthWindow.9=The data imported contains records that are already present on your database. +DynamicsCode.0=Initially Forest +DynamicsCode.1=Initially Grassland +DynamicsCode.2=Initially Settlement +DynamicsCode.3=Initially Otherland +DynamicsCode.4=Initially Wetland +DynamicsCode.5=Initially Cropland +EarthApp.11=Collect Earth is already running +EarthApp.21=The file containing the grid of plots as a CSV/CED is not found in the selected path \:
+EarthApp.23=No CSV/CED file has been set-up \:

+EarthApp.24=The file containing the Freemarker template with the KML definition is not found in the selected path \:
+EarthApp.26=No KML definition file has been set-up \:

+EarthApp.27=The file containing the HTML balloon form is not found in the selected path \:
+EarthApp.29=No HTML balloon file has been set-up \:

+EarthApp.30=Please correct the file location in the Tools->Properties menu. +EarthApp.3=Remind me later +EarthApp.4=Update Now +EarthApp.57=There is a new version of Collect Earth available\!
How do you want to proceed? +EarthApp.58=Update alert +EarthApp.59=Error when importing project file +EarthApp.5=Do not remind me again +EarthApp.61=The Collect Earth file could not be open.
Please make sure that Google Earth is installed. +EarthApp.6=\ - Version +EarthApp.70=WARNING +EarthApp.71=In Mac OS X the Collect Earth project files (*.cep) will not open in Collect Earth when they are double-clicked.
+EarthApp.72=Use the Collect Earth toolbar to open the .cep files \: +EarthApp.73=Collect Earth issues in Mac OS X computers +EarthSurveyService.9=Field required +ExportActionListener.1=Pick Date to Export Records From +ExportDialogProcessMonitor.0=Processing data... +ExportDialogProcessMonitor.1=Waiting to initialize process \: +ExportDialogProcessMonitor.4=Exported records \: +ImportActionListener.0=Should the data for plots that have not been completely filled be imported? +ImportActionListener.2=If you click NO only the data from plots in the "green" state, containing all data, will be imported. +ImportActionListener.3=Import non-finished records +ImportDialogProcessMonitor.0=\ CALCULATING +ImportDialogProcessMonitor.11=Initial number of records \: +ImportDialogProcessMonitor.2=Importing records... +ImportDialogProcessMonitor.5=Actual number of imported records \: +ImportDialogProcessMonitor.8=Processing data... +ImportProcessMonitorDialog.0=Imported records \: +ImportXMLDialogProcessMonitor.1 = Overwrite data +ImportXMLDialogProcessMonitor.2 = Import only non-conflicting plots +InfiniteProgressMonitor.0=Cancel operation +JFileChooserExistsAware.0=Collect Earth Project file +KmlImportService.13=Select a CSV file to save the plot locations to +MissingPlotsListener.0=Error while getting information about plots not present on the Database +MissingPlotsListener.10=Total number of plots in the sampling design \: +MissingPlotsListener.12=Number of missing plots \: +MissingPlotsListener.14=All the plots are filled\! +MissingPlotsListener.1=Missing plots +MissingPlotsListener.2=Copy contents to clipboard +MissingPlotsListener.3=Pick the files that contain plot information ( .csv or .ced files ) for which you want to know if all data has been filled. +MissingPlotsListener.4=Missing plots - information +MissingPlotsListener.5=From file \: +MissingPlotsListener.6=Export to CED file +NO=No +NO_TO_ALL=No to all +OpenTextFileListener.0=The text file was not found at \: +OptionWizard.0=Collect Earth options +OptionWizard.100=Open Planet imagery +OptionWizard.101=Planet API key +OptionWizard.1021=URL SecureWatch +OptionWizard.102=Open Maxar SecureWatch +OptionWizard.103=Set URL for Extra Map (opens when set) \: +OptionWizard.104=Browsers +OptionWizard.105=Open Earth Map +OptionWizard.110=Use NICFI provided Monthly imagery +OptionWizard.10=Open backup folder +OptionWizard.11=Unknown\: use ifconfig +OptionWizard.12=Client Instance +OptionWizard.13=Collect Earth Server IP +OptionWizard.14=Collect Earth Server port (e.g. 8023) +OptionWizard.15=Save & Apply changes +OptionWizard.16=ID +OptionWizard.17=X-coord +OptionWizard.18=Y-coord +OptionWizard.19=Elevation +OptionWizard.1=Choose Browser +OptionWizard.20=The Google Earth contents have been changed.
Please accept the content reload when you are prompted by Google Earth. +OptionWizard.21=Update successful +OptionWizard.22=Slope +OptionWizard.23=There was an error when re-opening the Google Earth data +OptionWizard.24=Cancel +OptionWizard.25=Operation Mode +OptionWizard.26=DB host +OptionWizard.27=This is not a recognized Saiku Folder ( the start-saiku.bat file is not present) +OptionWizard.28=Saiku Server not recognized +OptionWizard.29=DB port +OptionWizard.2=Workflow (server/client) +OptionWizard.30=SQLite options +OptionWizard.31=Sample data +OptionWizard.32=Plot layout +OptionWizard.33=Survey Definition +OptionWizard.34=Integrated Services +OptionWizard.35=Number of control points +OptionWizard.36=Distance between control points (in meters) +OptionWizard.37=Margin with plot border (in meters) +OptionWizard.38=The CSV/CED file cannot be read correctly.
The file is expected to have a comma separated values like this \:
+OptionWizard.39=ID,YCoordinate,XCoordinate,elevation,slope,aspect +OptionWizard.3=Server Instance +OptionWizard.40=Projects +OptionWizard.41=Load a new project file +OptionWizard.42=Error when closing the CSV reader +OptionWizard.43=Name of survey +OptionWizard.44=automatically back-up database at +OptionWizard.45=Open Earth Engine Playground ( deprecated ) +OptionWizard.46=Open Earth Engine Timelapse +OptionWizard.47=Open Bing Maps +OptionWizard.48=Open form on a browser instead of Google Earth (recommended for LINUX) +OptionWizard.49=Path to ced/csv file with plot data +OptionWizard.4=Current computer IP \: +OptionWizard.50=Browse... +OptionWizard.51=Error importing project file +OptionWizard.52=CSV/CED file with only coordinates +OptionWizard.53=No points +OptionWizard.54=Central point +OptionWizard.55=Error importing project folder +OptionWizard.56=Load project +OptionWizard.57=Previously loaded projects +OptionWizard.58=Open GEE Code Editor (requires Trusted Tester access) +OptionWizard.59=Open Here Maps focused on the plot +OptionWizard.5=Collect Earth Server port\: +OptionWizard.65=Path to Saiku folder +OptionWizard.66=Browse... +OptionWizard.67=Path to Firefox executable +OptionWizard.68=Browse... +OptionWizard.6=PostgreSQL DB parameters +OptionWizard.70=Executable files +OptionWizard.72=Binary files +OptionWizard.73=Path to Chrome executable +OptionWizard.74=Browse... +OptionWizard.76=Executable files +OptionWizard.78=Binary files +OptionWizard.79=Path to KML Freemarker template +OptionWizard.7=User Name +OptionWizard.80=Browse... +OptionWizard.82=Freemarker template +OptionWizard.83=Path to HTML Balloon form design +OptionWizard.84=Browse... +OptionWizard.86=HTML webpage +OptionWizard.87=Path to XML with IDM definition +OptionWizard.88=Browse... +OptionWizard.8=Password +OptionWizard.90=XML IDM definition +OptionWizard.91=Server (manager version or stand-alone use) +OptionWizard.92=Client (operator/connected to server) +OptionWizard.93=SQLite (Embedded/single file based) +OptionWizard.94=PostgreSQL +OptionWizard.95=Side of the sampling dots (in meters) +OptionWizard.9=DB Name +ProcessMonitorDialog.1=Parsing error on row number +ProcessMonitorDialog.4=, columns +ProcessMonitorDialog.5=\ -- values +SaikuAnalysisListener.0=Yes - Refresh Saiku data (long process) +SaikuAnalysisListener.1=No - Use same version of the data as last time Saiku was used +SaikuStarter.1=Starting Saiku +SaikuStarter.2=Starting Saiku can take some minutes, please wait\! +SaikuToolExportListener.1=Saiku Tool generation +SaikuToolExportListener.2=Generating Saiku Tool with current database +SaveEarthDataServlet.0=Empty request +SaveEarthDataServlet.1=Problem occurred while saving data to the database +SaveEarthDataServlet.2=The data was saved +SlopeCode.0=Flat (0-5) +YES=Yes +YES_TO_ALL=Yes to all + +GenerateDatabaseStarter.1=Preparing for analysis +GenerateDatabaseStarter.2=Generating Relational Database + +IPCCGeneratorListener.1=Waiting for process to complete\! +IPCCGeneratorListener.2=The IPCC GHGi compatible data is being generated +IPCCGeneratorListener.3=Refresh the data (update with latest from Collect Earth) +IPCCGeneratorListener.4=Use the latest generated database (fastest process - no update) +IPCCGeneratorListener.5=GHGi Database generation +IPCCGeneratorListener.6=Do you want to re-generate the dataset for the Saiku analysis?
This process can be time-consuming but it is necessary if the Collect Earth data has been updated since the last time.
\ No newline at end of file